diff --git a/.circleci/config.yml b/.circleci/config.yml index 8f67885fc1..7b04bce4c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,6 +46,9 @@ commands: docker_compose_file: description: Docker compose file to use type: string + docker_compose_side_file: + description: Docker compose side file to use + type: string test_folder: description: Folder to run tests in type: string @@ -79,13 +82,13 @@ commands: - run: name: Bring up services command: | - docker-compose -f <> -f docker-compose-side.yml up -d bobalink aa_deployer bundler + docker-compose -f <> -f <> up -d bobalink aa_deployer bundler working_directory: ops - run: name: Start background logging working_directory: ops background: true - command: docker-compose -f <> -f docker-compose-side.yml logs --follow + command: docker-compose -f <> -f <> logs --follow - run: name: Wait for sequencer command: bash scripts/wait-for-sequencer.sh @@ -100,7 +103,7 @@ commands: working_directory: ops - run: name: Stop docker - command: docker-compose -f <> -f docker-compose-side.yml down -v + command: docker-compose -f <> -f <> down -v working_directory: ops report-integration-tests: steps: @@ -174,19 +177,10 @@ jobs: - download-solidity-compilers - run-integration-tests: docker_compose_file: "docker-compose.yml" + docker_compose_side_file: "docker-compose-side.yml" test_folder: "eth-l2" - report-integration-tests - integration-tests-moonbeam: - executor: intergration-tests-executor - parallelism: 4 - steps: - - download-solidity-compilers - - run-integration-tests: - docker_compose_file: "docker-compose-moonbeam.yml" - test_folder: "alt-l2" - - report-integration-tests - integration-tests-avalanche: executor: intergration-tests-executor parallelism: 4 @@ -194,6 +188,7 @@ jobs: - download-solidity-compilers - run-integration-tests: docker_compose_file: "docker-compose-avalanche.yml" + docker_compose_side_file: "docker-compose-avalanche-side.yml" test_folder: "alt-l2" - report-integration-tests @@ -204,16 +199,7 @@ jobs: - download-solidity-compilers - run-integration-tests: docker_compose_file: "docker-compose-bnb.yml" - test_folder: "alt-l2" - - report-integration-tests - - integration-tests-fantom: - executor: intergration-tests-executor - parallelism: 4 - steps: - - download-solidity-compilers - - run-integration-tests: - docker_compose_file: "docker-compose-fantom.yml" + docker_compose_side_file: "docker-compose-bnb-side.yml" test_folder: "alt-l2" - report-integration-tests @@ -221,10 +207,8 @@ workflows: main: jobs: - integration-tests - - integration-tests-moonbeam - integration-tests-avalanche - integration-tests-bnb - - integration-tests-fantom - go-lint-test-build: name: proxyd-tests binary_name: proxyd diff --git a/.github/workflows/aa-bundler-sdk-pr.yml b/.github/workflows/aa-bundler-sdk-pr.yml new file mode 100644 index 0000000000..bbfa175bcd --- /dev/null +++ b/.github/workflows/aa-bundler-sdk-pr.yml @@ -0,0 +1,26 @@ +name: Will trigger release of AA-Bundler to NPM (PR comment) +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + bundler_sdk: + - 'packages/boba/bundler_sdk/**/*' + - 'packages/boba/bundler_utils/**/*' + - name: PR commenter + if: steps.filter.outputs.bundler_sdk == 'true' + uses: mshick/add-pr-comment@v2 + with: + message: | + ⚠️ **This PR triggers a minor release of the Bundler SDK** (Account Abstraction) to NPM as you made changes in the corresponding `bundler_sdk` directory. + + Please make sure this is intentional. + + The package that is going to be updated is `@bobanetwork/bundler_sdk`. diff --git a/.github/workflows/aa-bundler-sdk.yml b/.github/workflows/aa-bundler-sdk.yml index ffd879dabb..d752e9b8e5 100644 --- a/.github/workflows/aa-bundler-sdk.yml +++ b/.github/workflows/aa-bundler-sdk.yml @@ -1,7 +1,12 @@ name: Publish AA-Bundler to NPM on: - release: - types: [created] + push: + branches: + - develop + paths: + # only on change + - 'packages/boba/bundler_sdk/**/*' + - 'packages/boba/bundler_utils/**/*' jobs: build: @@ -16,6 +21,9 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install dependencies and build 🔧 run: yarn install --frozen-lockfile --legacy-peer-deps && yarn run build + - name: Increment patch version + working-directory: ./packages/boba/bundler_sdk + run: npm version minor --legacy-peer-deps - name: Publish package on NPM 📦 working-directory: ./packages/boba/bundler_sdk run: npm publish --access public diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml index 01a4b9c859..0f8887d8ea 100644 --- a/.github/workflows/ts-packages.yml +++ b/.github/workflows/ts-packages.yml @@ -51,6 +51,7 @@ jobs: env: FORCE_COLOR: 1 ENABLE_GAS_REPORT: 1 + SKIP_PREFLIGHT_CHECK: true - uses: codecov/codecov-action@v1 with: diff --git a/.gitignore b/.gitignore index 7c628e8571..9ec4257d90 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,9 @@ packages/boba/gas-price-oracle/data .env *.log +# boba_community +boba_community/boba-relayer/yarn.lock + # boba_examples boba_examples/init-fund-l2/yarn.lock boba_examples/boba-fee/yarn.lock diff --git a/boba_community/boba-node/docker-compose-bobabeam.yml b/boba_community/boba-node/docker-compose-bobabeam.yml index 856c11f455..b3c253c5ab 100644 --- a/boba_community/boba-node/docker-compose-bobabeam.yml +++ b/boba_community/boba-node/docker-compose-bobabeam.yml @@ -15,7 +15,6 @@ services: - ../../ops/envs/dtl.env environment: << : *l1_rpc_dtl - DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: 'https://replica.bobabeam.boba.network' DATA_TRANSPORT_LAYER__SYNC_FROM_L1: 'false' DATA_TRANSPORT_LAYER__SYNC_FROM_L2: 'true' diff --git a/boba_community/boba-relayer/.env.example b/boba_community/boba-relayer/.env.example new file mode 100644 index 0000000000..fab387e601 --- /dev/null +++ b/boba_community/boba-relayer/.env.example @@ -0,0 +1,4 @@ +L1_NODE_WEB3_URL=https://mainnet.infura.io/v3/KEY +L2_NODE_WEB3_URL=https://mainnet.boba.network +PRIV_KEY= +L2_TRANSACTION_HASH= diff --git a/boba_community/boba-relayer/README.md b/boba_community/boba-relayer/README.md new file mode 100644 index 0000000000..b9db3e5465 --- /dev/null +++ b/boba_community/boba-relayer/README.md @@ -0,0 +1,32 @@ +--- +description: Relay messages on L1 +--- + +## Boba Message Relayer + +This script allows anyone to check the status of a cross chain message from L2 to L1 and relay messages. + +> This script supports all BOBA L2s + + ```bash + $ git clone git@github.com:bobanetwork/boba.git + $ cd boba/boba_community/boba-relayer + $ yarn clean # only needed / will only work if you had it installed previously + $ yarn + ``` + + Then, add `.env` in `boba/boba_community/boba-relayer`. + + ```yaml +L1_NODE_WEB3_URL=https://mainnet.infura.io/v3/KEY +L2_NODE_WEB3_URL=https://mainnet.boba.network +PRIV_KEY= +L2_TRANSACTION_HASH= + ``` + + Run the command to relay messages + + ```bash + $ yarn start + ``` + diff --git a/boba_community/boba-relayer/package.json b/boba_community/boba-relayer/package.json new file mode 100644 index 0000000000..256956971b --- /dev/null +++ b/boba_community/boba-relayer/package.json @@ -0,0 +1,16 @@ +{ + "name": "@boba/boba-relayer", + "version": "1.0.0", + "scripts": { + "start": "node ./src/index.js", + "postinstall": "patch-package" + }, + "license": "MIT", + "dependencies": { + "@eth-optimism/sdk": "1.0.1", + "dotenv": "^16.0.0", + "ethers": "^5.5.4", + "node-fetch": "2.6.0", + "patch-package": "^6.5.1" + } +} diff --git a/boba_community/boba-relayer/patches/@eth-optimism+contracts+0.5.17.patch b/boba_community/boba-relayer/patches/@eth-optimism+contracts+0.5.17.patch new file mode 100644 index 0000000000..ae8d7eaa5a --- /dev/null +++ b/boba_community/boba-relayer/patches/@eth-optimism+contracts+0.5.17.patch @@ -0,0 +1,135005 @@ +diff --git a/node_modules/@eth-optimism/contracts/.DS_Store b/node_modules/@eth-optimism/contracts/.DS_Store +new file mode 100644 +index 0000000..47bdb14 +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/L1/.DS_Store b/node_modules/@eth-optimism/contracts/L1/.DS_Store +new file mode 100644 +index 0000000..8688bc5 +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/L1/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/L2/.DS_Store b/node_modules/@eth-optimism/contracts/L2/.DS_Store +new file mode 100644 +index 0000000..46dbdc3 +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/L2/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/artifacts/.DS_Store b/node_modules/@eth-optimism/contracts/artifacts/.DS_Store +new file mode 100644 +index 0000000..a0f42a0 +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/artifacts/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.dbg.json +deleted file mode 100644 +index a931dfc..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.dbg.json ++++ /dev/null +@@ -1,4 +0,0 @@ +-{ +- "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.json +deleted file mode 100644 +index c6e31f3..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.json ++++ /dev/null +@@ -1,102 +0,0 @@ +-{ +- "_format": "hh-sol-artifact-1", +- "contractName": "AddressDictator", +- "sourceName": "contracts/L1/deployment/AddressDictator.sol", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "_manager", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "string[]", +- "name": "_names", +- "type": "string[]" +- }, +- { +- "internalType": "address[]", +- "name": "_addresses", +- "type": "address[]" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getNamedAddresses", +- "outputs": [ +- { +- "components": [ +- { +- "internalType": "string", +- "name": "name", +- "type": "string" +- }, +- { +- "internalType": "address", +- "name": "addr", +- "type": "address" +- } +- ], +- "internalType": "struct AddressDictator.NamedAddress[]", +- "name": "", +- "type": "tuple[]" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "manager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "setAddresses", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "bytecode": "0x60806040523480156200001157600080fd5b5060405162000d5e38038062000d5e83398101604081905262000034916200037a565b600080546001600160a01b038087166001600160a01b03199283161790925560018054928616929091169190911790558051825114620000ee5760405162461bcd60e51b815260206004820152604560248201527f416464726573734469637461746f723a204d7573742070726f7669646520616e60448201527f20657175616c206e756d626572206f66206e616d657320616e6420616464726560648201526439b9b2b99760d91b608482015260a40160405180910390fd5b60005b8251811015620001c357600260405180604001604052808584815181106200011d576200011d62000505565b602002602001015181526020018484815181106200013f576200013f62000505565b6020908102919091018101516001600160a01b0316909152825460018101845560009384529281902082518051939460020290910192620001849284920190620001ce565b5060209190910151600190910180546001600160a01b0319166001600160a01b0390921691909117905580620001ba816200051b565b915050620000f1565b505050505062000582565b828054620001dc9062000545565b90600052602060002090601f0160209004810192826200020057600085556200024b565b82601f106200021b57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024b5782518255916020019190600101906200022e565b50620002599291506200025d565b5090565b5b808211156200025957600081556001016200025e565b6001600160a01b03811681146200028a57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002ce57620002ce6200028d565b604052919050565b60006001600160401b03821115620002f257620002f26200028d565b5060051b60200190565b600082601f8301126200030e57600080fd5b81516020620003276200032183620002d6565b620002a3565b82815260059290921b840181019181810190868411156200034757600080fd5b8286015b848110156200036f578051620003618162000274565b83529183019183016200034b565b509695505050505050565b600080600080608085870312156200039157600080fd5b84516200039e8162000274565b80945050602080860151620003b38162000274565b60408701519094506001600160401b0380821115620003d157600080fd5b818801915088601f830112620003e657600080fd5b8151620003f76200032182620002d6565b81815260059190911b8301840190848101908b8311156200041757600080fd5b8585015b83811015620004ce57805185811115620004355760008081fd5b8601603f81018e13620004485760008081fd5b87810151868111156200045f576200045f6200028d565b62000473601f8201601f19168a01620002a3565b8181528f60408385010111156200048a5760008081fd5b60005b82811015620004ab57838101604001518282018c01528a016200048d565b82811115620004bd5760008b84840101525b50855250509186019186016200041b565b5060608b01519097509450505080831115620004e957600080fd5b5050620004f987828801620002fc565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053e57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200055a57607f821691505b602082108114156200057c57634e487b7160e01b600052602260045260246000fd5b50919050565b6107cc80620005926000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212207993fbd341ec4f9e20c9ca42c43294b14f2a103fa8da10fc05d197e3abc8766164736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212207993fbd341ec4f9e20c9ca42c43294b14f2a103fa8da10fc05d197e3abc8766164736f6c63430008090033", +- "linkReferences": {}, +- "deployedLinkReferences": {} +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.dbg.json +deleted file mode 100644 +index 3db1c86..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.dbg.json ++++ /dev/null +@@ -1,4 +0,0 @@ +-{ +- "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/3521e681a945ca0750229e8634e36044.json" +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.json +deleted file mode 100644 +index de8d464..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.json ++++ /dev/null +@@ -1,176 +0,0 @@ +-{ +- "_format": "hh-sol-artifact-1", +- "contractName": "ChugSplashDictator", +- "sourceName": "contracts/L1/deployment/ChugSplashDictator.sol", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "bytes32", +- "name": "_codeHash", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotVal", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotVal", +- "type": "bytes32" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "codeHash", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes", +- "name": "_code", +- "type": "bytes" +- } +- ], +- "name": "doActions", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "isUpgrading", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "target", +- "outputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- } +- ], +- "bytecode": "0x60806040526000805460ff1916600117905534801561001d57600080fd5b5060405161088338038061088383398101604081905261003c916100a8565b60008054610100600160a81b0319166101006001600160a01b03998a1602179055600180546001600160a01b031916969097169590951790955560029290925560035560045560059190915560065561010f565b6001600160a01b03811681146100a557600080fd5b50565b600080600080600080600060e0888a0312156100c357600080fd5b87516100ce81610090565b60208901519097506100df81610090565b604089015160608a015160808b015160a08c015160c0909c01519a9d939c50919a90999198509650945092505050565b6107658061011e6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220d6996ebde67a73563bf52d2b5545adec064534b2fcd91ec70e83fc1ef951152464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220d6996ebde67a73563bf52d2b5545adec064534b2fcd91ec70e83fc1ef951152464736f6c63430008090033", +- "linkReferences": {}, +- "deployedLinkReferences": {} +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/.DS_Store b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/.DS_Store +new file mode 100644 +index 0000000..b983f82 +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.json +new file mode 100644 +index 0000000..0904a15 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.json +@@ -0,0 +1,356 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "IL1CrossDomainMessengerFast", ++ "sourceName": "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_standardBridgeDepositHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_lpDepositHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x", ++ "deployedBytecode": "0x", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.json +new file mode 100644 +index 0000000..1528959 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.json +@@ -0,0 +1,50 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "IL1DepositHash", ++ "sourceName": "contracts/L1/messaging/IL1DepositHash.sol", ++ "abi": [ ++ { ++ "inputs": [], ++ "name": "currentDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "lastHashUpdateBlock", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "priorDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x", ++ "deployedBytecode": "0x", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1ERC20Bridge.sol/IL1ERC20Bridge.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1ERC20Bridge.sol/IL1ERC20Bridge.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1ERC20Bridge.sol/IL1ERC20Bridge.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1ERC20Bridge.sol/IL1ERC20Bridge.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridge.sol/IL1StandardBridge.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridge.sol/IL1StandardBridge.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridge.sol/IL1StandardBridge.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridge.sol/IL1StandardBridge.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.json +new file mode 100644 +index 0000000..566b0ce +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.json +@@ -0,0 +1,350 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "IL1StandardBridgeAltL1", ++ "sourceName": "contracts/L1/messaging/IL1StandardBridgeAltL1.sol", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "ERC20DepositInitiated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "ERC20WithdrawalFinalized", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "NativeTokenDepositInitiated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "NativeTokenWithdrawalFinalized", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositERC20", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositERC20To", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositNativeToken", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositNativeTokenTo", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "finalizeERC20Withdrawal", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "finalizeNativeTokenWithdrawal", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2TokenBridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x", ++ "deployedBytecode": "0x", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json +index b99f2fc..9453996 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json +@@ -187,6 +187,25 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -483,6 +502,13 @@ + "stateMutability": "nonpayable", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "unpause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, + { + "inputs": [], + "name": "xDomainMessageSender", +@@ -497,8 +523,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405260cc80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c54806100446000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea2646970667358221220feab407f2c49fed8e1c5d2a57f14dd17236e44c665f11870bb505fc3d545335164736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea2646970667358221220feab407f2c49fed8e1c5d2a57f14dd17236e44c665f11870bb505fc3d545335164736f6c63430008090033", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613d8f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.json +new file mode 100644 +index 0000000..70f8c45 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.json +@@ -0,0 +1,639 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L1CrossDomainMessengerFast", ++ "sourceName": "contracts/L1/messaging/L1CrossDomainMessengerFast.sol", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_standardBridgeDepositHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_lpDepositHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "unpause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b031916905561402a806100446000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610304578063d7fd19dd14610327578063f2fde38b1461033a57600080fd5b8063b1b1b209146102ce578063c4d66de8146102f157600080fd5b80638456cb59116100b25780638456cb59146102855780638da5cb5b1461028d578063a4e7f8bd146102ab57600080fd5b8063715018a61461026a57806381ada46c1461027257600080fd5b8063461a44781161012457806369fdb52d1161010957806369fdb52d1461023c5780636e296e451461024f5780636f1c8d471461025757600080fd5b8063461a44781461021e5780635c975abb1461023157600080fd5b8063299ca47811610155578063299ca478146101be5780633dbb202b146102035780633f4ba83a1461021657600080fd5b80630ecf2eea1461017157806321d800ec14610186575b600080fd5b61018461017f366004613605565b61034d565b005b6101a9610194366004613605565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b5565b61018461021136600461377d565b6103fc565b61018461046a565b6101de61022c3660046137dd565b6104db565b60655460ff166101a9565b61018461024a366004613a11565b610588565b6101de610658565b610184610265366004613ab7565b610708565b610184610776565b610184610280366004613605565b6107e7565b61018461088e565b60335473ffffffffffffffffffffffffffffffffffffffff166101de565b6101a96102b9366004613605565b60cc6020526000908152604090205460ff1681565b6101a96102dc366004613605565b60cb6020526000908152604090205460ff1681565b6101846102ff366004613b43565b6108fd565b6101a9610312366004613605565b60c96020526000908152604090205460ff1681565b610184610335366004613b60565b610b4a565b610184610348366004613b43565b61110a565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60405162461bcd60e51b815260206004820152603660248201527f73656e644d65737361676520766961204c3143726f7373446f6d61696e4d657360448201527f73656e676572466173742069732064697361626c65640000000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d9611206565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610532908590600401613c4b565b60206040518083038186803b15801561054a57600080fd5b505afa15801561055e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105829190613c5e565b92915050565b600260975414156105db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff16156106335760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b61063d82826112af565b61064a8787878787610b4a565b505060016097555050505050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106eb5760405162461bcd60e51b815260206004820152602560248201527f43444d463a2078446f6d61696e4d65737361676553656e646572206973206e6f60448201527f742073657400000000000000000000000000000000000000000000000000000060648201526084016103b0565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60405162461bcd60e51b815260206004820152603860248201527f7265706c61794d65737361676520766961204c3143726f7373446f6d61696e4d60448201527f657373656e676572466173742069732064697361626c6564000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d960006117d5565b60335473ffffffffffffffffffffffffffffffffffffffff16331461084e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d961184c565b6000547501000000000000000000000000000000000000000000900460ff1680610942575060005474010000000000000000000000000000000000000000900460ff16155b6109b45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015610a1b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610aa75760405162461bcd60e51b815260206004820152602e60248201527f4c3143726f7373446f6d61696e4d657373656e6765724661737420616c72656160448201527f647920696e7469616c697a65642e00000000000000000000000000000000000060648201526084016103b0565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610aff6118d4565b610b07611a23565b610b0f611b4a565b610b17611ca3565b8015610b4657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b6000610b8a6040518060400160405280601481526020017f4f564d5f4c324d65737361676552656c617965720000000000000000000000008152506104db565b905073ffffffffffffffffffffffffffffffffffffffff811615610c33573373ffffffffffffffffffffffffffffffffffffffff821614610c335760405162461bcd60e51b815260206004820152603660248201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e20726560448201527f6c6179204c322d746f2d4c31206d657373616765732e0000000000000000000060648201526084016103b0565b60026097541415610c865760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff1615610cde5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6000610cec87878787611df7565b9050610cf88184611e72565b1515600114610d6f5760405162461bcd60e51b815260206004820152602d60248201527f43444d463a2050726f7669646564206d65737361676520636f756c64206e6f7460448201527f2062652076657269666965642e0000000000000000000000000000000000000060648201526084016103b0565b8051602080830191909120600081815260cb90925260409091205460ff1615610e005760405162461bcd60e51b815260206004820152603160248201527f43444d463a2050726f7669646564206d6573736167652068617320616c72656160448201527f6479206265656e2072656365697665642e00000000000000000000000000000060648201526084016103b0565b600081815260c9602052604090205460ff1615610e855760405162461bcd60e51b815260206004820152602860248201527f43444d463a2050726f7669646564206d65737361676520686173206265656e2060448201527f626c6f636b65642e00000000000000000000000000000000000000000000000060648201526084016103b0565b610ec36040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104db565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610f645760405162461bcd60e51b815260206004820152603960248201527f43444d463a2043616e6e6f742073656e64204c322d3e4c31206d65737361676560448201527f7320746f204c312073797374656d20636f6e7472616374732e0000000000000060648201526084016103b0565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff898116919091179091556040516000918a1690610fbd908990613c7b565b6000604051808303816000865af19150503d8060008114610ffa576040519150601f19603f3d011682016040523d82523d6000602084013e610fff565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561107f57600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26110b2565b600082815260cc60205260405183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b60008333436040516020016110c993929190613c97565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff1916600190811790915560975550505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b73ffffffffffffffffffffffffffffffffffffffff81166111fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b0565b611203816117d5565b50565b60655460ff166112585760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016103b0565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60006112ef6040518060400160405280601781526020017f50726f78795f5f4c315374616e646172644272696467650000000000000000008152506104db565b905060006113316040518060400160405280601681526020017f50726f78795f5f4c314c6971756964697479506f6f6c000000000000000000008152506104db565b90508173ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561137b57600080fd5b505af115801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190613ce9565b4314156114b3578173ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561140257600080fd5b505af1158015611416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143a9190613ce9565b84146114ae5760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b6115a7565b8173ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114fb57600080fd5b505af115801561150f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115339190613ce9565b84146115a75760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b8073ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156115ef57600080fd5b505af1158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190613ce9565b431415611701578073ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ae9190613ce9565b83146116fc5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b6117cf565b8073ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561174957600080fd5b505af115801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190613ce9565b83146117cf5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b50505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561189f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112853390565b6000547501000000000000000000000000000000000000000000900460ff1680611919575060005474010000000000000000000000000000000000000000900460ff16155b61198b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff161580156119f257600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611a68575060005474010000000000000000000000000000000000000000900460ff16155b611ada5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611b4157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6119f2336117d5565b6000547501000000000000000000000000000000000000000000900460ff1680611b8f575060005474010000000000000000000000000000000000000000900460ff16155b611c015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611c6857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611ce8575060005474010000000000000000000000000000000000000000900460ff16155b611d5a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611dc157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b606084848484604051602401611e109493929190613d02565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6000611e7d82611e95565b8015611e8e5750611e8e8383611f89565b9392505050565b600080611ed66040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104db565b8351602085015160408087015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815293945073ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611f399390929091600401613d4c565b60206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613df7565b60008083734200000000000000000000000000000000000007604051602001611fb3929190613e19565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f420000000000000000000000000000000000000000000000000000000000000091830191909152915060009081906120439060340160408051601f198184030181529190526060870151875161216d565b90925090506001821515146120e65760405162461bcd60e51b815260206004820152605360248201527f43444d463a204d6573736167652070617373696e67207072656465706c6f792060448201527f686173206e6f74206265656e20696e697469616c697a6564206f7220696e766160648201527f6c69642070726f6f662070726f76696465642e00000000000000000000000000608482015260a4016103b0565b60006120f182612196565b90506121628460405160200161210991815260200190565b60408051601f19818403018152908290527f01000000000000000000000000000000000000000000000000000000000000006020830152906021016040516020818303038152906040528860800151846040015161225a565b979650505050505050565b60006060600061217c8661227e565b90506121898186866122b0565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906121c38361238b565b905060405180608001604052806121f3836000815181106121e6576121e6613e63565b60200260200101516123be565b815260200161220e836001815181106121e6576121e6613e63565b81526020016122368360028151811061222957612229613e63565b60200260200101516123c5565b81526020016122518360038151811061222957612229613e63565b90529392505050565b6000806122668661227e565b9050612274818686866124c7565b9695505050505050565b6060818051906020012060405160200161229a91815260200190565b6040516020818303038152906040529050919050565b6000606060006122bf856124fd565b905060008060006122d1848a896125f8565b815192955090935091501580806122e55750815b6123315760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016103b0565b60008161234d5760405180602001604052806000815250612379565b6123798661235c600188613ec1565b8151811061236c5761236c613e63565b6020026020010151612a93565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061058290612abd565b6000610582825b600060218260000151111561241c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b600080600061242a85612cbc565b91945092509050600081600181111561244557612445613ed8565b146124925760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b60008386602001516124a49190613f07565b805190915060208410156122745760208490036101000a90049695505050505050565b60008060006124d78786866122b0565b915091508180156121625750805160208083019190912087519188019190912014612162565b6060600061250a8361238b565b90506000815167ffffffffffffffff81111561252857612528613640565b60405190808252806020026020018201604052801561256d57816020015b60408051808201909152606080825260208201528152602001906001900390816125465790505b50905060005b82518110156125f05760006125a084838151811061259357612593613e63565b602002602001015161300d565b905060405180604001604052808281526020016125bc8361238b565b8152508383815181106125d1576125d1613e63565b60200260200101819052505080806125e890613f1f565b915050612573565b509392505050565b600060608180806126088761309d565b9050600086905060008061262f604051806040016040528060608152602001606081525090565b60005b8c51811015612a4f578c818151811061264d5761264d613e63565b6020026020010151915082846126639190613f07565b9350612670600188613f07565b9650836126d4578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016103b0565b612791565b815151602011612736578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016103b0565b846127448360000151613220565b146127915760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016103b0565b61279d60106001613f07565b82602001515114156128165785518414156127b757612a4f565b60008685815181106127cb576127cb613e63565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106127f6576127f6613e63565b6020026020010151905061280981613248565b9650600194505050612a3d565b600282602001515114156129f557600061282f8361327e565b905060008160008151811061284657612846613e63565b016020015160f81c9050600061285d600283613f87565b612868906002613fa9565b90506000612879848360ff166132a2565b905060006128878b8a6132a2565b9050600061289583836132d8565b905060ff8516600214806128ac575060ff85166003145b15612902578083511480156128c15750808251145b156128d3576128d0818b613f07565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b60ff85161580612915575060ff85166001145b15612987578251811461295157507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b612978886020015160018151811061296b5761296b613e63565b6020026020010151613248565b9a509750612a3d945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016103b0565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016103b0565b80612a4781613f1f565b915050612632565b507f8000000000000000000000000000000000000000000000000000000000000000841486612a7e87866132a2565b909e909d50909b509950505050505050505050565b6020810151805160609161058291612aad90600190613ec1565b8151811061259357612593613e63565b6060600080612acb84612cbc565b91935090915060019050816001811115612ae757612ae7613ed8565b14612b345760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016103b0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612b4d5790505090506000835b8651811015612cb15760208210612bf95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016103b0565b600080612c366040518060400160405280858c60000151612c1a9190613ec1565b8152602001858c60200151612c2f9190613f07565b9052612cbc565b509150915060405180604001604052808383612c529190613f07565b8152602001848b60200151612c679190613f07565b815250858581518110612c7c57612c7c613e63565b6020908102919091010152612c92600185613f07565b9350612c9e8183613f07565b612ca89084613f07565b92505050612b7a565b508152949350505050565b600080600080846000015111612d145760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016103b0565b6020840151805160001a607f8111612d39576000600160009450945094505050613006565b60b78111612db5576000612d4e608083613ec1565b905080876000015111612da35760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016103b0565b60019550935060009250613006915050565b60bf8111612ea4576000612dca60b783613ec1565b905080876000015111612e1f5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016103b0565b600183015160208290036101000a9004612e398183613f07565b885111612e885760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016103b0565b612e93826001613f07565b965094506000935061300692505050565b60f78111612f1f576000612eb960c083613ec1565b905080876000015111612f0e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016103b0565b600195509350849250613006915050565b6000612f2c60f783613ec1565b905080876000015111612f815760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016103b0565b600183015160208290036101000a9004612f9b8183613f07565b885111612fea5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016103b0565b612ff5826001613f07565b965094506001935061300692505050565b9193909250565b6060600080600061301d85612cbc565b91945092509050600081600181111561303857613038613ed8565b146130855760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016103b0565b61309485602001518484613384565b95945050505050565b60606000825160026130af9190613fcc565b67ffffffffffffffff8111156130c7576130c7613640565b6040519080825280601f01601f1916602001820160405280156130f1576020820181803683370190505b50905060005b835181101561321957600484828151811061311457613114613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82613149836002613fcc565b8151811061315957613159613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061319c5761319c613e63565b01602001516131ae919060f81c613f87565b60f81b826131bd836002613fcc565b6131c8906001613f07565b815181106131d8576131d8613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061321181613f1f565b9150506130f7565b5092915050565b600060208251101561323457506020015190565b818060200190518101906105829190613ce9565b600060606020836000015110156132695761326283613463565b9050613275565b6132728361300d565b90505b611e8e81613220565b606061058261329d836020015160008151811061259357612593613e63565b61309d565b6060825182106132c15750604080516020810190915260008152610582565b611e8e83838486516132d39190613ec1565b61346e565b6000805b8084511180156132ec5750808351115b801561336d575082818151811061330557613305613e63565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061334457613344613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611e8e578061337c81613f1f565b9150506132dc565b606060008267ffffffffffffffff8111156133a1576133a1613640565b6040519080825280601f01601f1916602001820160405280156133cb576020820181803683370190505b5090508051600014156133df579050611e8e565b60006133eb8587613f07565b90506020820160005b6133ff602087614009565b8110156134365782518252613415602084613f07565b9250613422602083613f07565b91508061342e81613f1f565b9150506133f4565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6060610582826135ef565b60608161347c81601f613f07565b10156134ca5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b826134d58382613f07565b10156135235760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b61352d8284613f07565b8451101561357d5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016103b0565b60608215801561359c57604051915060008252602082016040526135e6565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135d55780518352602092830192016135bd565b5050858452601f01601f1916604052505b50949350505050565b6060610582826020015160008460000151613384565b60006020828403121561361757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461120357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561369257613692613640565b60405290565b6040805190810167ffffffffffffffff8111828210171561369257613692613640565b604051601f8201601f1916810167ffffffffffffffff811182821017156136e4576136e4613640565b604052919050565b600067ffffffffffffffff83111561370657613706613640565b6137196020601f19601f860116016136bb565b905082815283838301111561372d57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261375557600080fd5b611e8e838335602085016136ec565b803563ffffffff8116811461377857600080fd5b919050565b60008060006060848603121561379257600080fd5b833561379d8161361e565b9250602084013567ffffffffffffffff8111156137b957600080fd5b6137c586828701613744565b9250506137d460408501613764565b90509250925092565b6000602082840312156137ef57600080fd5b813567ffffffffffffffff81111561380657600080fd5b8201601f8101841361381757600080fd5b613826848235602084016136ec565b949350505050565b600060a0828403121561384057600080fd5b61384861366f565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561388657600080fd5b61389284828501613744565b60808301525092915050565b6000604082840312156138b057600080fd5b6138b8613698565b90508135815260208083013567ffffffffffffffff808211156138da57600080fd5b818501915085601f8301126138ee57600080fd5b81358181111561390057613900613640565b8060051b91506139118483016136bb565b818152918301840191848101908884111561392b57600080fd5b938501935b8385101561394957843582529385019390850190613930565b808688015250505050505092915050565b600060a0828403121561396c57600080fd5b61397461366f565b905081358152602082013567ffffffffffffffff8082111561399557600080fd5b6139a18583860161382e565b602084015260408401359150808211156139ba57600080fd5b6139c68583860161389e565b604084015260608401359150808211156139df57600080fd5b6139eb85838601613744565b60608401526080840135915080821115613a0457600080fd5b5061389284828501613744565b600080600080600080600060e0888a031215613a2c57600080fd5b8735613a378161361e565b96506020880135613a478161361e565b9550604088013567ffffffffffffffff80821115613a6457600080fd5b613a708b838c01613744565b965060608a0135955060808a0135915080821115613a8d57600080fd5b50613a9a8a828b0161395a565b93505060a0880135915060c0880135905092959891949750929550565b60008060008060008060c08789031215613ad057600080fd5b8635613adb8161361e565b95506020870135613aeb8161361e565b9450604087013567ffffffffffffffff811115613b0757600080fd5b613b1389828a01613744565b94505060608701359250613b2960808801613764565b9150613b3760a08801613764565b90509295509295509295565b600060208284031215613b5557600080fd5b8135611e8e8161361e565b600080600080600060a08688031215613b7857600080fd5b8535613b838161361e565b94506020860135613b938161361e565b9350604086013567ffffffffffffffff80821115613bb057600080fd5b613bbc89838a01613744565b9450606088013593506080880135915080821115613bd957600080fd5b50613be68882890161395a565b9150509295509295909350565b60005b83811015613c0e578181015183820152602001613bf6565b838111156117cf5750506000910152565b60008151808452613c37816020860160208601613bf3565b601f01601f19169290920160200192915050565b602081526000611e8e6020830184613c1f565b600060208284031215613c7057600080fd5b8151611e8e8161361e565b60008251613c8d818460208701613bf3565b9190910192915050565b60008451613ca9818460208901613bf3565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600060208284031215613cfb57600080fd5b5051919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613d3b6080830185613c1f565b905082606083015295945050505050565b8381526000602060608184015284516060840152808501516080840152604085015160a0840152606085015160c0840152608085015160a060e0850152613d97610100850182613c1f565b905083810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613de95784518252938501936001939093019290850190613dc9565b509998505050505050505050565b600060208284031215613e0957600080fd5b81518015158114611e8e57600080fd5b60008351613e2b818460208801613bf3565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613ed357613ed3613e92565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613f1a57613f1a613e92565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5157613f51613e92565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613f9a57613f9a613f58565b8060ff84160691505092915050565b600060ff821660ff841680821015613fc357613fc3613e92565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400457614004613e92565b500290565b60008261401857614018613f58565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610304578063d7fd19dd14610327578063f2fde38b1461033a57600080fd5b8063b1b1b209146102ce578063c4d66de8146102f157600080fd5b80638456cb59116100b25780638456cb59146102855780638da5cb5b1461028d578063a4e7f8bd146102ab57600080fd5b8063715018a61461026a57806381ada46c1461027257600080fd5b8063461a44781161012457806369fdb52d1161010957806369fdb52d1461023c5780636e296e451461024f5780636f1c8d471461025757600080fd5b8063461a44781461021e5780635c975abb1461023157600080fd5b8063299ca47811610155578063299ca478146101be5780633dbb202b146102035780633f4ba83a1461021657600080fd5b80630ecf2eea1461017157806321d800ec14610186575b600080fd5b61018461017f366004613605565b61034d565b005b6101a9610194366004613605565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b5565b61018461021136600461377d565b6103fc565b61018461046a565b6101de61022c3660046137dd565b6104db565b60655460ff166101a9565b61018461024a366004613a11565b610588565b6101de610658565b610184610265366004613ab7565b610708565b610184610776565b610184610280366004613605565b6107e7565b61018461088e565b60335473ffffffffffffffffffffffffffffffffffffffff166101de565b6101a96102b9366004613605565b60cc6020526000908152604090205460ff1681565b6101a96102dc366004613605565b60cb6020526000908152604090205460ff1681565b6101846102ff366004613b43565b6108fd565b6101a9610312366004613605565b60c96020526000908152604090205460ff1681565b610184610335366004613b60565b610b4a565b610184610348366004613b43565b61110a565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60405162461bcd60e51b815260206004820152603660248201527f73656e644d65737361676520766961204c3143726f7373446f6d61696e4d657360448201527f73656e676572466173742069732064697361626c65640000000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d9611206565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610532908590600401613c4b565b60206040518083038186803b15801561054a57600080fd5b505afa15801561055e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105829190613c5e565b92915050565b600260975414156105db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff16156106335760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b61063d82826112af565b61064a8787878787610b4a565b505060016097555050505050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106eb5760405162461bcd60e51b815260206004820152602560248201527f43444d463a2078446f6d61696e4d65737361676553656e646572206973206e6f60448201527f742073657400000000000000000000000000000000000000000000000000000060648201526084016103b0565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60405162461bcd60e51b815260206004820152603860248201527f7265706c61794d65737361676520766961204c3143726f7373446f6d61696e4d60448201527f657373656e676572466173742069732064697361626c6564000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d960006117d5565b60335473ffffffffffffffffffffffffffffffffffffffff16331461084e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d961184c565b6000547501000000000000000000000000000000000000000000900460ff1680610942575060005474010000000000000000000000000000000000000000900460ff16155b6109b45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015610a1b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610aa75760405162461bcd60e51b815260206004820152602e60248201527f4c3143726f7373446f6d61696e4d657373656e6765724661737420616c72656160448201527f647920696e7469616c697a65642e00000000000000000000000000000000000060648201526084016103b0565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610aff6118d4565b610b07611a23565b610b0f611b4a565b610b17611ca3565b8015610b4657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b6000610b8a6040518060400160405280601481526020017f4f564d5f4c324d65737361676552656c617965720000000000000000000000008152506104db565b905073ffffffffffffffffffffffffffffffffffffffff811615610c33573373ffffffffffffffffffffffffffffffffffffffff821614610c335760405162461bcd60e51b815260206004820152603660248201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e20726560448201527f6c6179204c322d746f2d4c31206d657373616765732e0000000000000000000060648201526084016103b0565b60026097541415610c865760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff1615610cde5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6000610cec87878787611df7565b9050610cf88184611e72565b1515600114610d6f5760405162461bcd60e51b815260206004820152602d60248201527f43444d463a2050726f7669646564206d65737361676520636f756c64206e6f7460448201527f2062652076657269666965642e0000000000000000000000000000000000000060648201526084016103b0565b8051602080830191909120600081815260cb90925260409091205460ff1615610e005760405162461bcd60e51b815260206004820152603160248201527f43444d463a2050726f7669646564206d6573736167652068617320616c72656160448201527f6479206265656e2072656365697665642e00000000000000000000000000000060648201526084016103b0565b600081815260c9602052604090205460ff1615610e855760405162461bcd60e51b815260206004820152602860248201527f43444d463a2050726f7669646564206d65737361676520686173206265656e2060448201527f626c6f636b65642e00000000000000000000000000000000000000000000000060648201526084016103b0565b610ec36040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104db565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610f645760405162461bcd60e51b815260206004820152603960248201527f43444d463a2043616e6e6f742073656e64204c322d3e4c31206d65737361676560448201527f7320746f204c312073797374656d20636f6e7472616374732e0000000000000060648201526084016103b0565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff898116919091179091556040516000918a1690610fbd908990613c7b565b6000604051808303816000865af19150503d8060008114610ffa576040519150601f19603f3d011682016040523d82523d6000602084013e610fff565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561107f57600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26110b2565b600082815260cc60205260405183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b60008333436040516020016110c993929190613c97565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff1916600190811790915560975550505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b73ffffffffffffffffffffffffffffffffffffffff81166111fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b0565b611203816117d5565b50565b60655460ff166112585760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016103b0565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60006112ef6040518060400160405280601781526020017f50726f78795f5f4c315374616e646172644272696467650000000000000000008152506104db565b905060006113316040518060400160405280601681526020017f50726f78795f5f4c314c6971756964697479506f6f6c000000000000000000008152506104db565b90508173ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561137b57600080fd5b505af115801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190613ce9565b4314156114b3578173ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561140257600080fd5b505af1158015611416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143a9190613ce9565b84146114ae5760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b6115a7565b8173ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114fb57600080fd5b505af115801561150f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115339190613ce9565b84146115a75760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b8073ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156115ef57600080fd5b505af1158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190613ce9565b431415611701578073ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ae9190613ce9565b83146116fc5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b6117cf565b8073ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561174957600080fd5b505af115801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190613ce9565b83146117cf5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b50505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561189f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112853390565b6000547501000000000000000000000000000000000000000000900460ff1680611919575060005474010000000000000000000000000000000000000000900460ff16155b61198b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff161580156119f257600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611a68575060005474010000000000000000000000000000000000000000900460ff16155b611ada5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611b4157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6119f2336117d5565b6000547501000000000000000000000000000000000000000000900460ff1680611b8f575060005474010000000000000000000000000000000000000000900460ff16155b611c015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611c6857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611ce8575060005474010000000000000000000000000000000000000000900460ff16155b611d5a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611dc157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b606084848484604051602401611e109493929190613d02565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6000611e7d82611e95565b8015611e8e5750611e8e8383611f89565b9392505050565b600080611ed66040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104db565b8351602085015160408087015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815293945073ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611f399390929091600401613d4c565b60206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613df7565b60008083734200000000000000000000000000000000000007604051602001611fb3929190613e19565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f420000000000000000000000000000000000000000000000000000000000000091830191909152915060009081906120439060340160408051601f198184030181529190526060870151875161216d565b90925090506001821515146120e65760405162461bcd60e51b815260206004820152605360248201527f43444d463a204d6573736167652070617373696e67207072656465706c6f792060448201527f686173206e6f74206265656e20696e697469616c697a6564206f7220696e766160648201527f6c69642070726f6f662070726f76696465642e00000000000000000000000000608482015260a4016103b0565b60006120f182612196565b90506121628460405160200161210991815260200190565b60408051601f19818403018152908290527f01000000000000000000000000000000000000000000000000000000000000006020830152906021016040516020818303038152906040528860800151846040015161225a565b979650505050505050565b60006060600061217c8661227e565b90506121898186866122b0565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906121c38361238b565b905060405180608001604052806121f3836000815181106121e6576121e6613e63565b60200260200101516123be565b815260200161220e836001815181106121e6576121e6613e63565b81526020016122368360028151811061222957612229613e63565b60200260200101516123c5565b81526020016122518360038151811061222957612229613e63565b90529392505050565b6000806122668661227e565b9050612274818686866124c7565b9695505050505050565b6060818051906020012060405160200161229a91815260200190565b6040516020818303038152906040529050919050565b6000606060006122bf856124fd565b905060008060006122d1848a896125f8565b815192955090935091501580806122e55750815b6123315760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016103b0565b60008161234d5760405180602001604052806000815250612379565b6123798661235c600188613ec1565b8151811061236c5761236c613e63565b6020026020010151612a93565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061058290612abd565b6000610582825b600060218260000151111561241c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b600080600061242a85612cbc565b91945092509050600081600181111561244557612445613ed8565b146124925760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b60008386602001516124a49190613f07565b805190915060208410156122745760208490036101000a90049695505050505050565b60008060006124d78786866122b0565b915091508180156121625750805160208083019190912087519188019190912014612162565b6060600061250a8361238b565b90506000815167ffffffffffffffff81111561252857612528613640565b60405190808252806020026020018201604052801561256d57816020015b60408051808201909152606080825260208201528152602001906001900390816125465790505b50905060005b82518110156125f05760006125a084838151811061259357612593613e63565b602002602001015161300d565b905060405180604001604052808281526020016125bc8361238b565b8152508383815181106125d1576125d1613e63565b60200260200101819052505080806125e890613f1f565b915050612573565b509392505050565b600060608180806126088761309d565b9050600086905060008061262f604051806040016040528060608152602001606081525090565b60005b8c51811015612a4f578c818151811061264d5761264d613e63565b6020026020010151915082846126639190613f07565b9350612670600188613f07565b9650836126d4578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016103b0565b612791565b815151602011612736578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016103b0565b846127448360000151613220565b146127915760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016103b0565b61279d60106001613f07565b82602001515114156128165785518414156127b757612a4f565b60008685815181106127cb576127cb613e63565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106127f6576127f6613e63565b6020026020010151905061280981613248565b9650600194505050612a3d565b600282602001515114156129f557600061282f8361327e565b905060008160008151811061284657612846613e63565b016020015160f81c9050600061285d600283613f87565b612868906002613fa9565b90506000612879848360ff166132a2565b905060006128878b8a6132a2565b9050600061289583836132d8565b905060ff8516600214806128ac575060ff85166003145b15612902578083511480156128c15750808251145b156128d3576128d0818b613f07565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b60ff85161580612915575060ff85166001145b15612987578251811461295157507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b612978886020015160018151811061296b5761296b613e63565b6020026020010151613248565b9a509750612a3d945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016103b0565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016103b0565b80612a4781613f1f565b915050612632565b507f8000000000000000000000000000000000000000000000000000000000000000841486612a7e87866132a2565b909e909d50909b509950505050505050505050565b6020810151805160609161058291612aad90600190613ec1565b8151811061259357612593613e63565b6060600080612acb84612cbc565b91935090915060019050816001811115612ae757612ae7613ed8565b14612b345760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016103b0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612b4d5790505090506000835b8651811015612cb15760208210612bf95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016103b0565b600080612c366040518060400160405280858c60000151612c1a9190613ec1565b8152602001858c60200151612c2f9190613f07565b9052612cbc565b509150915060405180604001604052808383612c529190613f07565b8152602001848b60200151612c679190613f07565b815250858581518110612c7c57612c7c613e63565b6020908102919091010152612c92600185613f07565b9350612c9e8183613f07565b612ca89084613f07565b92505050612b7a565b508152949350505050565b600080600080846000015111612d145760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016103b0565b6020840151805160001a607f8111612d39576000600160009450945094505050613006565b60b78111612db5576000612d4e608083613ec1565b905080876000015111612da35760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016103b0565b60019550935060009250613006915050565b60bf8111612ea4576000612dca60b783613ec1565b905080876000015111612e1f5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016103b0565b600183015160208290036101000a9004612e398183613f07565b885111612e885760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016103b0565b612e93826001613f07565b965094506000935061300692505050565b60f78111612f1f576000612eb960c083613ec1565b905080876000015111612f0e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016103b0565b600195509350849250613006915050565b6000612f2c60f783613ec1565b905080876000015111612f815760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016103b0565b600183015160208290036101000a9004612f9b8183613f07565b885111612fea5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016103b0565b612ff5826001613f07565b965094506001935061300692505050565b9193909250565b6060600080600061301d85612cbc565b91945092509050600081600181111561303857613038613ed8565b146130855760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016103b0565b61309485602001518484613384565b95945050505050565b60606000825160026130af9190613fcc565b67ffffffffffffffff8111156130c7576130c7613640565b6040519080825280601f01601f1916602001820160405280156130f1576020820181803683370190505b50905060005b835181101561321957600484828151811061311457613114613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82613149836002613fcc565b8151811061315957613159613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061319c5761319c613e63565b01602001516131ae919060f81c613f87565b60f81b826131bd836002613fcc565b6131c8906001613f07565b815181106131d8576131d8613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061321181613f1f565b9150506130f7565b5092915050565b600060208251101561323457506020015190565b818060200190518101906105829190613ce9565b600060606020836000015110156132695761326283613463565b9050613275565b6132728361300d565b90505b611e8e81613220565b606061058261329d836020015160008151811061259357612593613e63565b61309d565b6060825182106132c15750604080516020810190915260008152610582565b611e8e83838486516132d39190613ec1565b61346e565b6000805b8084511180156132ec5750808351115b801561336d575082818151811061330557613305613e63565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061334457613344613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611e8e578061337c81613f1f565b9150506132dc565b606060008267ffffffffffffffff8111156133a1576133a1613640565b6040519080825280601f01601f1916602001820160405280156133cb576020820181803683370190505b5090508051600014156133df579050611e8e565b60006133eb8587613f07565b90506020820160005b6133ff602087614009565b8110156134365782518252613415602084613f07565b9250613422602083613f07565b91508061342e81613f1f565b9150506133f4565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6060610582826135ef565b60608161347c81601f613f07565b10156134ca5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b826134d58382613f07565b10156135235760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b61352d8284613f07565b8451101561357d5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016103b0565b60608215801561359c57604051915060008252602082016040526135e6565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135d55780518352602092830192016135bd565b5050858452601f01601f1916604052505b50949350505050565b6060610582826020015160008460000151613384565b60006020828403121561361757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461120357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561369257613692613640565b60405290565b6040805190810167ffffffffffffffff8111828210171561369257613692613640565b604051601f8201601f1916810167ffffffffffffffff811182821017156136e4576136e4613640565b604052919050565b600067ffffffffffffffff83111561370657613706613640565b6137196020601f19601f860116016136bb565b905082815283838301111561372d57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261375557600080fd5b611e8e838335602085016136ec565b803563ffffffff8116811461377857600080fd5b919050565b60008060006060848603121561379257600080fd5b833561379d8161361e565b9250602084013567ffffffffffffffff8111156137b957600080fd5b6137c586828701613744565b9250506137d460408501613764565b90509250925092565b6000602082840312156137ef57600080fd5b813567ffffffffffffffff81111561380657600080fd5b8201601f8101841361381757600080fd5b613826848235602084016136ec565b949350505050565b600060a0828403121561384057600080fd5b61384861366f565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561388657600080fd5b61389284828501613744565b60808301525092915050565b6000604082840312156138b057600080fd5b6138b8613698565b90508135815260208083013567ffffffffffffffff808211156138da57600080fd5b818501915085601f8301126138ee57600080fd5b81358181111561390057613900613640565b8060051b91506139118483016136bb565b818152918301840191848101908884111561392b57600080fd5b938501935b8385101561394957843582529385019390850190613930565b808688015250505050505092915050565b600060a0828403121561396c57600080fd5b61397461366f565b905081358152602082013567ffffffffffffffff8082111561399557600080fd5b6139a18583860161382e565b602084015260408401359150808211156139ba57600080fd5b6139c68583860161389e565b604084015260608401359150808211156139df57600080fd5b6139eb85838601613744565b60608401526080840135915080821115613a0457600080fd5b5061389284828501613744565b600080600080600080600060e0888a031215613a2c57600080fd5b8735613a378161361e565b96506020880135613a478161361e565b9550604088013567ffffffffffffffff80821115613a6457600080fd5b613a708b838c01613744565b965060608a0135955060808a0135915080821115613a8d57600080fd5b50613a9a8a828b0161395a565b93505060a0880135915060c0880135905092959891949750929550565b60008060008060008060c08789031215613ad057600080fd5b8635613adb8161361e565b95506020870135613aeb8161361e565b9450604087013567ffffffffffffffff811115613b0757600080fd5b613b1389828a01613744565b94505060608701359250613b2960808801613764565b9150613b3760a08801613764565b90509295509295509295565b600060208284031215613b5557600080fd5b8135611e8e8161361e565b600080600080600060a08688031215613b7857600080fd5b8535613b838161361e565b94506020860135613b938161361e565b9350604086013567ffffffffffffffff80821115613bb057600080fd5b613bbc89838a01613744565b9450606088013593506080880135915080821115613bd957600080fd5b50613be68882890161395a565b9150509295509295909350565b60005b83811015613c0e578181015183820152602001613bf6565b838111156117cf5750506000910152565b60008151808452613c37816020860160208601613bf3565b601f01601f19169290920160200192915050565b602081526000611e8e6020830184613c1f565b600060208284031215613c7057600080fd5b8151611e8e8161361e565b60008251613c8d818460208701613bf3565b9190910192915050565b60008451613ca9818460208901613bf3565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600060208284031215613cfb57600080fd5b5051919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613d3b6080830185613c1f565b905082606083015295945050505050565b8381526000602060608184015284516060840152808501516080840152604085015160a0840152606085015160c0840152608085015160a060e0850152613d97610100850182613c1f565b905083810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613de95784518252938501936001939093019290850190613dc9565b509998505050505050505050565b600060208284031215613e0957600080fd5b81518015158114611e8e57600080fd5b60008351613e2b818460208801613bf3565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613ed357613ed3613e92565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613f1a57613f1a613e92565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5157613f51613e92565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613f9a57613f9a613f58565b8060ff84160691505092915050565b600060ff821660ff841680821015613fc357613fc3613e92565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400457614004613e92565b500290565b60008261401857614018613f58565b50049056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..c141902 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.json +@@ -0,0 +1,160 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L1MultiMessageRelayer", ++ "sourceName": "contracts/L1/messaging/L1MultiMessageRelayer.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.json +new file mode 100644 +index 0000000..156832b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.json +@@ -0,0 +1,276 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L1MultiMessageRelayerFast", ++ "sourceName": "contracts/L1/messaging/L1MultiMessageRelayerFast.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayerFast.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayerFast.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_standardBridgeDepositHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_lpDepositHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610f1c380380610f1c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610e89806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806316e9cd9b14610051578063299ca47814610066578063461a4478146100af5780639f35c352146100c2575b600080fd5b61006461005f366004610649565b6100d5565b005b6000546100869073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100866100bd3660046107cb565b610312565b6100646100d036600461081c565b6103bf565b6101136040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4015b60405180910390fd5b600061021b604051806060016040528060218152602001610e5c60219139610312565b905060005b8281101561030c57600084848381811061023c5761023c61086d565b905060200281019061024e919061089c565b61025790610a52565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c695909490939291600401610d06565b600060405180830381600087803b1580156102e057600080fd5b505af11580156102f4573d6000803e3d6000fd5b5050505050808061030490610d63565b915050610220565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610369908590600401610dc3565b60206040518083038186803b15801561038157600080fd5b505afa158015610395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b99190610dd6565b92915050565b6103fd6040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4016101ef565b6000610500604051806060016040528060218152602001610e5c60219139610312565b905060005b848110156105f55760008686838181106105215761052161086d565b9050602002810190610533919061089c565b61053c90610a52565b805160208201516040808401516060850151608086015192517f69fdb52d00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff8916956369fdb52d956105af959094909392918d908d90600401610df3565b600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b505050505080806105ed90610d63565b915050610505565b505050505050565b60008083601f84011261060f57600080fd5b50813567ffffffffffffffff81111561062757600080fd5b6020830191508360208260051b850101111561064257600080fd5b9250929050565b6000806020838503121561065c57600080fd5b823567ffffffffffffffff81111561067357600080fd5b61067f858286016105fd565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156106dd576106dd61068b565b60405290565b6040805190810167ffffffffffffffff811182821017156106dd576106dd61068b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561074d5761074d61068b565b604052919050565b600067ffffffffffffffff83111561076f5761076f61068b565b6107a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601610706565b90508281528383830111156107b457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156107dd57600080fd5b813567ffffffffffffffff8111156107f457600080fd5b8201601f8101841361080557600080fd5b61081484823560208401610755565b949350505050565b6000806000806060858703121561083257600080fd5b843567ffffffffffffffff81111561084957600080fd5b610855878288016105fd565b90989097506020870135966040013595509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126108d057600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108fc57600080fd5b50565b600082601f83011261091057600080fd5b61091f83833560208501610755565b9392505050565b600060a0828403121561093857600080fd5b6109406106ba565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561097e57600080fd5b61098a848285016108ff565b60808301525092915050565b6000604082840312156109a857600080fd5b6109b06106e3565b90508135815260208083013567ffffffffffffffff808211156109d257600080fd5b818501915085601f8301126109e657600080fd5b8135818111156109f8576109f861068b565b8060051b9150610a09848301610706565b8181529183018401918481019088841115610a2357600080fd5b938501935b83851015610a4157843582529385019390850190610a28565b808688015250505050505092915050565b600060a08236031215610a6457600080fd5b610a6c6106ba565b8235610a77816108da565b81526020830135610a87816108da565b6020820152604083013567ffffffffffffffff80821115610aa757600080fd5b610ab3368387016108ff565b6040840152606085013560608401526080850135915080821115610ad657600080fd5b818501915060a08236031215610aeb57600080fd5b610af36106ba565b82358152602083013582811115610b0957600080fd5b610b1536828601610926565b602083015250604083013582811115610b2d57600080fd5b610b3936828601610996565b604083015250606083013582811115610b5157600080fd5b610b5d368286016108ff565b606083015250608083013582811115610b7557600080fd5b610b81368286016108ff565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610bbf57602081850181015186830182015201610ba3565b81811115610bd1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b80831015610c505784518252938301936001929092019190830190610c30565b509695505050505050565b805182526000602082015160a06020850152805160a0850152602081015160c0850152604081015160e085015260608101516101008501526080810151905060a0610120850152610cb0610140850182610b99565b905060408301518482036040860152610cc98282610c04565b91505060608301518482036060860152610ce38282610b99565b91505060808301518482036080860152610cfd8282610b99565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152610d3f60a0830186610b99565b8460608401528281036080840152610d578185610c5b565b98975050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610dbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061091f6020830184610b99565b600060208284031215610de857600080fd5b815161091f816108da565b600073ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525060e06040830152610e2c60e0830188610b99565b8660608401528281036080840152610e448187610c5b565b60a0840195909552505060c001529594505050505056fe50726f78795f5f4c3143726f7373446f6d61696e4d657373656e67657246617374a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806316e9cd9b14610051578063299ca47814610066578063461a4478146100af5780639f35c352146100c2575b600080fd5b61006461005f366004610649565b6100d5565b005b6000546100869073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100866100bd3660046107cb565b610312565b6100646100d036600461081c565b6103bf565b6101136040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4015b60405180910390fd5b600061021b604051806060016040528060218152602001610e5c60219139610312565b905060005b8281101561030c57600084848381811061023c5761023c61086d565b905060200281019061024e919061089c565b61025790610a52565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c695909490939291600401610d06565b600060405180830381600087803b1580156102e057600080fd5b505af11580156102f4573d6000803e3d6000fd5b5050505050808061030490610d63565b915050610220565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610369908590600401610dc3565b60206040518083038186803b15801561038157600080fd5b505afa158015610395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b99190610dd6565b92915050565b6103fd6040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4016101ef565b6000610500604051806060016040528060218152602001610e5c60219139610312565b905060005b848110156105f55760008686838181106105215761052161086d565b9050602002810190610533919061089c565b61053c90610a52565b805160208201516040808401516060850151608086015192517f69fdb52d00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff8916956369fdb52d956105af959094909392918d908d90600401610df3565b600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b505050505080806105ed90610d63565b915050610505565b505050505050565b60008083601f84011261060f57600080fd5b50813567ffffffffffffffff81111561062757600080fd5b6020830191508360208260051b850101111561064257600080fd5b9250929050565b6000806020838503121561065c57600080fd5b823567ffffffffffffffff81111561067357600080fd5b61067f858286016105fd565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156106dd576106dd61068b565b60405290565b6040805190810167ffffffffffffffff811182821017156106dd576106dd61068b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561074d5761074d61068b565b604052919050565b600067ffffffffffffffff83111561076f5761076f61068b565b6107a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601610706565b90508281528383830111156107b457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156107dd57600080fd5b813567ffffffffffffffff8111156107f457600080fd5b8201601f8101841361080557600080fd5b61081484823560208401610755565b949350505050565b6000806000806060858703121561083257600080fd5b843567ffffffffffffffff81111561084957600080fd5b610855878288016105fd565b90989097506020870135966040013595509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126108d057600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108fc57600080fd5b50565b600082601f83011261091057600080fd5b61091f83833560208501610755565b9392505050565b600060a0828403121561093857600080fd5b6109406106ba565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561097e57600080fd5b61098a848285016108ff565b60808301525092915050565b6000604082840312156109a857600080fd5b6109b06106e3565b90508135815260208083013567ffffffffffffffff808211156109d257600080fd5b818501915085601f8301126109e657600080fd5b8135818111156109f8576109f861068b565b8060051b9150610a09848301610706565b8181529183018401918481019088841115610a2357600080fd5b938501935b83851015610a4157843582529385019390850190610a28565b808688015250505050505092915050565b600060a08236031215610a6457600080fd5b610a6c6106ba565b8235610a77816108da565b81526020830135610a87816108da565b6020820152604083013567ffffffffffffffff80821115610aa757600080fd5b610ab3368387016108ff565b6040840152606085013560608401526080850135915080821115610ad657600080fd5b818501915060a08236031215610aeb57600080fd5b610af36106ba565b82358152602083013582811115610b0957600080fd5b610b1536828601610926565b602083015250604083013582811115610b2d57600080fd5b610b3936828601610996565b604083015250606083013582811115610b5157600080fd5b610b5d368286016108ff565b606083015250608083013582811115610b7557600080fd5b610b81368286016108ff565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610bbf57602081850181015186830182015201610ba3565b81811115610bd1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b80831015610c505784518252938301936001929092019190830190610c30565b509695505050505050565b805182526000602082015160a06020850152805160a0850152602081015160c0850152604081015160e085015260608101516101008501526080810151905060a0610120850152610cb0610140850182610b99565b905060408301518482036040860152610cc98282610c04565b91505060608301518482036060860152610ce38282610b99565b91505060808301518482036080860152610cfd8282610b99565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152610d3f60a0830186610b99565b8460608401528281036080840152610d578185610c5b565b98975050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610dbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061091f6020830184610b99565b600060208284031215610de857600080fd5b815161091f816108da565b600073ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525060e06040830152610e2c60e0830188610b99565b8660608401528281036080840152610e448187610c5b565b60a0840195909552505060c001529594505050505056fe50726f78795f5f4c3143726f7373446f6d61696e4d657373656e67657246617374a164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.json +index aed0a7a..6811ccc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.json +@@ -156,6 +156,19 @@ + "name": "ETHWithdrawalFinalized", + "type": "event" + }, ++ { ++ "inputs": [], ++ "name": "currentDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -396,6 +409,19 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "lastHashUpdateBlock", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [], + "name": "messenger", +@@ -409,13 +435,26 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "priorDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "stateMutability": "payable", + "type": "receive" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916905561199e806100306000396000f3fe6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220ab0015e7cee64db6dc95e6eb0899ae4017c78ab54ebce874e3b018a7bc88850364736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220ab0015e7cee64db6dc95e6eb0899ae4017c78ab54ebce874e3b018a7bc88850364736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b0319169055611837806100306000396000f3fe6080604052600436106100e15760003560e01c80638f601f661161007f578063a5ab619011610059578063a5ab6190146102ab578063a9f9e675146102c1578063b1a1a882146102e1578063f8fe09a3146102f457600080fd5b80638f601f661461024057806391c49bf8146102785780639a2ac6d51461029857600080fd5b806358a997f6116100bb57806358a997f6146101dc57806359326e6f146101fc578063838b2520146102205780638b4c40b01461015857600080fd5b80631532ec341461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a36600461124d565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112c0565b610738565b3480156101e857600080fd5b506101586101f7366004611312565b6107fd565b34801561020857600080fd5b5061021260055481565b6040519081526020016101b3565b34801561022c57600080fd5b5061015861023b366004611395565b610864565b34801561024c57600080fd5b5061021261025b3660046112c0565b600260209081526000928352604080842090915290825290205481565b34801561028457600080fd5b5060015461019f906001600160a01b031681565b6101586102a636600461142b565b61087d565b3480156102b757600080fd5b5061021260045481565b3480156102cd57600080fd5b506101586102dc36600461148e565b6108c5565b6101586102ef366004611507565b610b3e565b34801561030057600080fd5b5061021260035481565b600063662a633a60e01b600073420000000000000000000000000000000000000687873487604051602401610344969594939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bd4565b6103fd6000734200000000000000000000000000000000000006878734610c4f565b836001600160a01b0316856001600160a01b03167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161044292919061161e565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190611637565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b0387169086906040516106279190611654565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806106e05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610131565b856001600160a01b0316876001600160a01b03167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631878787604051610727939291906116b9565b60405180910390a350505050505050565b6000546001600160a01b0316156107b75760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b1561084c5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b61085c8686333388888888610cc1565b505050505050565b6108748787338888888888610cc1565b50505050505050565b6108bf33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b6001546001600160a01b03166108e36000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109695760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109856000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f59190611637565b6001600160a01b031614610a715760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610aa290859061170b565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610ad9908686610e5e565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b2c9493929190611722565b60405180910390a45050505050505050565b333b15610b8d5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bcf33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c2190869085908790600401611755565b600060405180830381600087803b158015610c3b57600080fd5b505af1158015610874573d6000803e3d6000fd5b600554431115610c60576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cd66001600160a01b038916873087610f25565b600063662a633a60e01b89898989898888604051602401610cfd979695949392919061178d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610d94906001600160a01b03168583610bd4565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dc59086906117dd565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610df88989898989610c4f565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e4b9493929190611722565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bcf9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f76565b6040516001600160a01b03808516602483015283166044820152606481018290526108bf9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610ea3565b6000610fcb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661105b9092919063ffffffff16565b805190915015610bcf5780806020019051810190610fe991906117f5565b610bcf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b606061106a8484600085611074565b90505b9392505050565b6060824710156110ec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b61113a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b031685876040516111569190611654565b60006040518083038185875af1925050503d8060008114611193576040519150601f19603f3d011682016040523d82523d6000602084013e611198565b606091505b50915091506111a88282866111b3565b979650505050505050565b606083156111c257508161106d565b8251156111d25782518084602001fd5b8160405162461bcd60e51b81526004016101319190611817565b6001600160a01b038116811461120157600080fd5b50565b60008083601f84011261121657600080fd5b50813567ffffffffffffffff81111561122e57600080fd5b60208301915083602082850101111561124657600080fd5b9250929050565b60008060008060006080868803121561126557600080fd5b8535611270816111ec565b94506020860135611280816111ec565b935060408601359250606086013567ffffffffffffffff8111156112a357600080fd5b6112af88828901611204565b969995985093965092949392505050565b600080604083850312156112d357600080fd5b82356112de816111ec565b915060208301356112ee816111ec565b809150509250929050565b803563ffffffff8116811461130d57600080fd5b919050565b60008060008060008060a0878903121561132b57600080fd5b8635611336816111ec565b95506020870135611346816111ec565b94506040870135935061135b606088016112f9565b9250608087013567ffffffffffffffff81111561137757600080fd5b61138389828a01611204565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156113b057600080fd5b87356113bb816111ec565b965060208801356113cb816111ec565b955060408801356113db816111ec565b9450606088013593506113f0608089016112f9565b925060a088013567ffffffffffffffff81111561140c57600080fd5b6114188a828b01611204565b989b979a50959850939692959293505050565b6000806000806060858703121561144157600080fd5b843561144c816111ec565b935061145a602086016112f9565b9250604085013567ffffffffffffffff81111561147657600080fd5b61148287828801611204565b95989497509550505050565b600080600080600080600060c0888a0312156114a957600080fd5b87356114b4816111ec565b965060208801356114c4816111ec565b955060408801356114d4816111ec565b945060608801356114e4816111ec565b93506080880135925060a088013567ffffffffffffffff81111561140c57600080fd5b60008060006040848603121561151c57600080fd5b611525846112f9565b9250602084013567ffffffffffffffff81111561154157600080fd5b61154d86828701611204565b9497909650939450505050565b60005b8381101561157557818101518382015260200161155d565b838111156108bf5750506000910152565b6000815180845261159e81602086016020860161155a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261161260c0830184611586565b98975050505050505050565b82815260406020820152600061106a6040830184611586565b60006020828403121561164957600080fd5b815161106d816111ec565b6000825161166681846020870161155a565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116d3604083018486611670565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561171d5761171d6116dc565b500390565b6001600160a01b038516815283602082015260606040820152600061174b606083018486611670565b9695505050505050565b6001600160a01b03841681526060602082015260006117776060830185611586565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117d060c083018486611670565b9998505050505050505050565b600082198211156117f0576117f06116dc565b500190565b60006020828403121561180757600080fd5b8151801515811461106d57600080fd5b60208152600061106d602083018461158656fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100e15760003560e01c80638f601f661161007f578063a5ab619011610059578063a5ab6190146102ab578063a9f9e675146102c1578063b1a1a882146102e1578063f8fe09a3146102f457600080fd5b80638f601f661461024057806391c49bf8146102785780639a2ac6d51461029857600080fd5b806358a997f6116100bb57806358a997f6146101dc57806359326e6f146101fc578063838b2520146102205780638b4c40b01461015857600080fd5b80631532ec341461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a36600461124d565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112c0565b610738565b3480156101e857600080fd5b506101586101f7366004611312565b6107fd565b34801561020857600080fd5b5061021260055481565b6040519081526020016101b3565b34801561022c57600080fd5b5061015861023b366004611395565b610864565b34801561024c57600080fd5b5061021261025b3660046112c0565b600260209081526000928352604080842090915290825290205481565b34801561028457600080fd5b5060015461019f906001600160a01b031681565b6101586102a636600461142b565b61087d565b3480156102b757600080fd5b5061021260045481565b3480156102cd57600080fd5b506101586102dc36600461148e565b6108c5565b6101586102ef366004611507565b610b3e565b34801561030057600080fd5b5061021260035481565b600063662a633a60e01b600073420000000000000000000000000000000000000687873487604051602401610344969594939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bd4565b6103fd6000734200000000000000000000000000000000000006878734610c4f565b836001600160a01b0316856001600160a01b03167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161044292919061161e565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190611637565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b0387169086906040516106279190611654565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806106e05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610131565b856001600160a01b0316876001600160a01b03167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631878787604051610727939291906116b9565b60405180910390a350505050505050565b6000546001600160a01b0316156107b75760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b1561084c5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b61085c8686333388888888610cc1565b505050505050565b6108748787338888888888610cc1565b50505050505050565b6108bf33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b6001546001600160a01b03166108e36000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109695760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109856000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f59190611637565b6001600160a01b031614610a715760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610aa290859061170b565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610ad9908686610e5e565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b2c9493929190611722565b60405180910390a45050505050505050565b333b15610b8d5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bcf33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c2190869085908790600401611755565b600060405180830381600087803b158015610c3b57600080fd5b505af1158015610874573d6000803e3d6000fd5b600554431115610c60576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cd66001600160a01b038916873087610f25565b600063662a633a60e01b89898989898888604051602401610cfd979695949392919061178d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610d94906001600160a01b03168583610bd4565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dc59086906117dd565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610df88989898989610c4f565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e4b9493929190611722565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bcf9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f76565b6040516001600160a01b03808516602483015283166044820152606481018290526108bf9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610ea3565b6000610fcb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661105b9092919063ffffffff16565b805190915015610bcf5780806020019051810190610fe991906117f5565b610bcf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b606061106a8484600085611074565b90505b9392505050565b6060824710156110ec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b61113a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b031685876040516111569190611654565b60006040518083038185875af1925050503d8060008114611193576040519150601f19603f3d011682016040523d82523d6000602084013e611198565b606091505b50915091506111a88282866111b3565b979650505050505050565b606083156111c257508161106d565b8251156111d25782518084602001fd5b8160405162461bcd60e51b81526004016101319190611817565b6001600160a01b038116811461120157600080fd5b50565b60008083601f84011261121657600080fd5b50813567ffffffffffffffff81111561122e57600080fd5b60208301915083602082850101111561124657600080fd5b9250929050565b60008060008060006080868803121561126557600080fd5b8535611270816111ec565b94506020860135611280816111ec565b935060408601359250606086013567ffffffffffffffff8111156112a357600080fd5b6112af88828901611204565b969995985093965092949392505050565b600080604083850312156112d357600080fd5b82356112de816111ec565b915060208301356112ee816111ec565b809150509250929050565b803563ffffffff8116811461130d57600080fd5b919050565b60008060008060008060a0878903121561132b57600080fd5b8635611336816111ec565b95506020870135611346816111ec565b94506040870135935061135b606088016112f9565b9250608087013567ffffffffffffffff81111561137757600080fd5b61138389828a01611204565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156113b057600080fd5b87356113bb816111ec565b965060208801356113cb816111ec565b955060408801356113db816111ec565b9450606088013593506113f0608089016112f9565b925060a088013567ffffffffffffffff81111561140c57600080fd5b6114188a828b01611204565b989b979a50959850939692959293505050565b6000806000806060858703121561144157600080fd5b843561144c816111ec565b935061145a602086016112f9565b9250604085013567ffffffffffffffff81111561147657600080fd5b61148287828801611204565b95989497509550505050565b600080600080600080600060c0888a0312156114a957600080fd5b87356114b4816111ec565b965060208801356114c4816111ec565b955060408801356114d4816111ec565b945060608801356114e4816111ec565b93506080880135925060a088013567ffffffffffffffff81111561140c57600080fd5b60008060006040848603121561151c57600080fd5b611525846112f9565b9250602084013567ffffffffffffffff81111561154157600080fd5b61154d86828701611204565b9497909650939450505050565b60005b8381101561157557818101518382015260200161155d565b838111156108bf5750506000910152565b6000815180845261159e81602086016020860161155a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261161260c0830184611586565b98975050505050505050565b82815260406020820152600061106a6040830184611586565b60006020828403121561164957600080fd5b815161106d816111ec565b6000825161166681846020870161155a565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116d3604083018486611670565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561171d5761171d6116dc565b500390565b6001600160a01b038516815283602082015260606040820152600061174b606083018486611670565b9695505050505050565b6001600160a01b03841681526060602082015260006117776060830185611586565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117d060c083018486611670565b9998505050505050505050565b600082198211156117f0576117f06116dc565b500190565b60006020828403121561180757600080fd5b8151801515811461106d57600080fd5b60208152600061106d602083018461158656fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.json +new file mode 100644 +index 0000000..6cae6c2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.json +@@ -0,0 +1,460 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L1StandardBridgeAltL1", ++ "sourceName": "contracts/L1/messaging/L1StandardBridgeAltL1.sol", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "ERC20DepositInitiated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "ERC20WithdrawalFinalized", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "NativeTokenDepositInitiated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "NativeTokenWithdrawalFinalized", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "currentDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositERC20", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositERC20To", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositNativeToken", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l2Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "depositNativeTokenTo", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "deposits", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "donateNativeToken", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "finalizeERC20Withdrawal", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "finalizeNativeTokenWithdrawal", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1messenger", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2TokenBridge", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2TokenBridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "lastHashUpdateBlock", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "messenger", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "priorDepositInfoHash", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "receive" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916905561185e806100306000396000f3fe6080604052600436106100e15760003560e01c80638f601f661161007f578063a9f9e67511610059578063a9f9e675146102c1578063b1c78f17146102e1578063cd38698314610158578063f8fe09a3146102f457600080fd5b80638f601f661461025357806391c49bf81461028b578063a5ab6190146102ab57600080fd5b806350cc72d2116100bb57806350cc72d2146101dc57806358a997f6146101ef57806359326e6f1461020f578063838b25201461023357600080fd5b80630f6a78691461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a366004611274565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112e7565b61075f565b6101586101ea366004611339565b610824565b3480156101fb57600080fd5b5061015861020a36600461139c565b61086c565b34801561021b57600080fd5b5061022560055481565b6040519081526020016101b3565b34801561023f57600080fd5b5061015861024e36600461141f565b6108d3565b34801561025f57600080fd5b5061022561026e3660046112e7565b600260209081526000928352604080842090915290825290205481565b34801561029757600080fd5b5060015461019f906001600160a01b031681565b3480156102b757600080fd5b5061022560045481565b3480156102cd57600080fd5b506101586102dc3660046114b5565b6108ec565b6101586102ef36600461152e565b610b65565b34801561030057600080fd5b5061022560035481565b600063662a633a60e01b600073420000000000000000000000000000000000002387873487604051602401610344969594939291906115f7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bfb565b6103fd6000734200000000000000000000000000000000000023878734610c76565b836001600160a01b0316856001600160a01b03167ff1e6647a55a4ecbf748c8aaf6d27773d9a2d21d16ca35ee5fbb529b4a631062d3485604051610442929190611645565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610581919061165e565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b038716908690604051610627919061167b565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806107075760405162461bcd60e51b8152602060048201526044602482018190527f5472616e7366657248656c7065723a3a736166655472616e736665724e617469908201527f7665546f6b656e3a204e6174697665546f6b656e207472616e7366657220666160648201527f696c656400000000000000000000000000000000000000000000000000000000608482015260a401610131565b856001600160a01b0316876001600160a01b03167f3f1eed6f7f293b677b5cd65d3bc95380be434147c85b33a317056e088f84a59a87878760405161074e939291906116e0565b60405180910390a350505050505050565b6000546001600160a01b0316156107de5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b61086633858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b333b156108bb5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b6108cb8686333388888888610ce8565b505050505050565b6108e38787338888888888610ce8565b50505050505050565b6001546001600160a01b031661090a6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109905760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109ac6000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e457600080fd5b505afa1580156109f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1c919061165e565b6001600160a01b031614610a985760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610ac9908590611732565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610b00908686610e85565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b539493929190611749565b60405180910390a45050505050505050565b333b15610bb45760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bf633338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c489086908590879060040161177c565b600060405180830381600087803b158015610c6257600080fd5b505af11580156108e3573d6000803e3d6000fd5b600554431115610c87576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cfd6001600160a01b038916873087610f4c565b600063662a633a60e01b89898989898888604051602401610d2497969594939291906117b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610dbb906001600160a01b03168583610bfb565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dec908690611804565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610e1f8989898989610c76565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e729493929190611749565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bf69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f9d565b6040516001600160a01b03808516602483015283166044820152606481018290526108669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610eca565b6000610ff2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166110829092919063ffffffff16565b805190915015610bf65780806020019051810190611010919061181c565b610bf65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b6060611091848460008561109b565b90505b9392505050565b6060824710156111135760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b6111615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b0316858760405161117d919061167b565b60006040518083038185875af1925050503d80600081146111ba576040519150601f19603f3d011682016040523d82523d6000602084013e6111bf565b606091505b50915091506111cf8282866111da565b979650505050505050565b606083156111e9575081611094565b8251156111f95782518084602001fd5b8160405162461bcd60e51b8152600401610131919061183e565b6001600160a01b038116811461122857600080fd5b50565b60008083601f84011261123d57600080fd5b50813567ffffffffffffffff81111561125557600080fd5b60208301915083602082850101111561126d57600080fd5b9250929050565b60008060008060006080868803121561128c57600080fd5b853561129781611213565b945060208601356112a781611213565b935060408601359250606086013567ffffffffffffffff8111156112ca57600080fd5b6112d68882890161122b565b969995985093965092949392505050565b600080604083850312156112fa57600080fd5b823561130581611213565b9150602083013561131581611213565b809150509250929050565b803563ffffffff8116811461133457600080fd5b919050565b6000806000806060858703121561134f57600080fd5b843561135a81611213565b935061136860208601611320565b9250604085013567ffffffffffffffff81111561138457600080fd5b6113908782880161122b565b95989497509550505050565b60008060008060008060a087890312156113b557600080fd5b86356113c081611213565b955060208701356113d081611213565b9450604087013593506113e560608801611320565b9250608087013567ffffffffffffffff81111561140157600080fd5b61140d89828a0161122b565b979a9699509497509295939492505050565b600080600080600080600060c0888a03121561143a57600080fd5b873561144581611213565b9650602088013561145581611213565b9550604088013561146581611213565b94506060880135935061147a60808901611320565b925060a088013567ffffffffffffffff81111561149657600080fd5b6114a28a828b0161122b565b989b979a50959850939692959293505050565b600080600080600080600060c0888a0312156114d057600080fd5b87356114db81611213565b965060208801356114eb81611213565b955060408801356114fb81611213565b9450606088013561150b81611213565b93506080880135925060a088013567ffffffffffffffff81111561149657600080fd5b60008060006040848603121561154357600080fd5b61154c84611320565b9250602084013567ffffffffffffffff81111561156857600080fd5b6115748682870161122b565b9497909650939450505050565b60005b8381101561159c578181015183820152602001611584565b838111156108665750506000910152565b600081518084526115c5816020860160208601611581565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261163960c08301846115ad565b98975050505050505050565b82815260406020820152600061109160408301846115ad565b60006020828403121561167057600080fd5b815161109481611213565b6000825161168d818460208701611581565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116fa604083018486611697565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561174457611744611703565b500390565b6001600160a01b0385168152836020820152606060408201526000611772606083018486611697565b9695505050505050565b6001600160a01b038416815260606020820152600061179e60608301856115ad565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117f760c083018486611697565b9998505050505050505050565b6000821982111561181757611817611703565b500190565b60006020828403121561182e57600080fd5b8151801515811461109457600080fd5b60208152600061109460208301846115ad56fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100e15760003560e01c80638f601f661161007f578063a9f9e67511610059578063a9f9e675146102c1578063b1c78f17146102e1578063cd38698314610158578063f8fe09a3146102f457600080fd5b80638f601f661461025357806391c49bf81461028b578063a5ab6190146102ab57600080fd5b806350cc72d2116100bb57806350cc72d2146101dc57806358a997f6146101ef57806359326e6f1461020f578063838b25201461023357600080fd5b80630f6a78691461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a366004611274565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112e7565b61075f565b6101586101ea366004611339565b610824565b3480156101fb57600080fd5b5061015861020a36600461139c565b61086c565b34801561021b57600080fd5b5061022560055481565b6040519081526020016101b3565b34801561023f57600080fd5b5061015861024e36600461141f565b6108d3565b34801561025f57600080fd5b5061022561026e3660046112e7565b600260209081526000928352604080842090915290825290205481565b34801561029757600080fd5b5060015461019f906001600160a01b031681565b3480156102b757600080fd5b5061022560045481565b3480156102cd57600080fd5b506101586102dc3660046114b5565b6108ec565b6101586102ef36600461152e565b610b65565b34801561030057600080fd5b5061022560035481565b600063662a633a60e01b600073420000000000000000000000000000000000002387873487604051602401610344969594939291906115f7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bfb565b6103fd6000734200000000000000000000000000000000000023878734610c76565b836001600160a01b0316856001600160a01b03167ff1e6647a55a4ecbf748c8aaf6d27773d9a2d21d16ca35ee5fbb529b4a631062d3485604051610442929190611645565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610581919061165e565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b038716908690604051610627919061167b565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806107075760405162461bcd60e51b8152602060048201526044602482018190527f5472616e7366657248656c7065723a3a736166655472616e736665724e617469908201527f7665546f6b656e3a204e6174697665546f6b656e207472616e7366657220666160648201527f696c656400000000000000000000000000000000000000000000000000000000608482015260a401610131565b856001600160a01b0316876001600160a01b03167f3f1eed6f7f293b677b5cd65d3bc95380be434147c85b33a317056e088f84a59a87878760405161074e939291906116e0565b60405180910390a350505050505050565b6000546001600160a01b0316156107de5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b61086633858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b333b156108bb5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b6108cb8686333388888888610ce8565b505050505050565b6108e38787338888888888610ce8565b50505050505050565b6001546001600160a01b031661090a6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109905760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109ac6000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e457600080fd5b505afa1580156109f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1c919061165e565b6001600160a01b031614610a985760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610ac9908590611732565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610b00908686610e85565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b539493929190611749565b60405180910390a45050505050505050565b333b15610bb45760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bf633338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c489086908590879060040161177c565b600060405180830381600087803b158015610c6257600080fd5b505af11580156108e3573d6000803e3d6000fd5b600554431115610c87576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cfd6001600160a01b038916873087610f4c565b600063662a633a60e01b89898989898888604051602401610d2497969594939291906117b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610dbb906001600160a01b03168583610bfb565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dec908690611804565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610e1f8989898989610c76565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e729493929190611749565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bf69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f9d565b6040516001600160a01b03808516602483015283166044820152606481018290526108669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610eca565b6000610ff2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166110829092919063ffffffff16565b805190915015610bf65780806020019051810190611010919061181c565b610bf65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b6060611091848460008561109b565b90505b9392505050565b6060824710156111135760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b6111615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b0316858760405161117d919061167b565b60006040518083038185875af1925050503d80600081146111ba576040519150601f19603f3d011682016040523d82523d6000602084013e6111bf565b606091505b50915091506111cf8282866111da565b979650505050505050565b606083156111e9575081611094565b8251156111f95782518084602001fd5b8160405162461bcd60e51b8152600401610131919061183e565b6001600160a01b038116811461122857600080fd5b50565b60008083601f84011261123d57600080fd5b50813567ffffffffffffffff81111561125557600080fd5b60208301915083602082850101111561126d57600080fd5b9250929050565b60008060008060006080868803121561128c57600080fd5b853561129781611213565b945060208601356112a781611213565b935060408601359250606086013567ffffffffffffffff8111156112ca57600080fd5b6112d68882890161122b565b969995985093965092949392505050565b600080604083850312156112fa57600080fd5b823561130581611213565b9150602083013561131581611213565b809150509250929050565b803563ffffffff8116811461133457600080fd5b919050565b6000806000806060858703121561134f57600080fd5b843561135a81611213565b935061136860208601611320565b9250604085013567ffffffffffffffff81111561138457600080fd5b6113908782880161122b565b95989497509550505050565b60008060008060008060a087890312156113b557600080fd5b86356113c081611213565b955060208701356113d081611213565b9450604087013593506113e560608801611320565b9250608087013567ffffffffffffffff81111561140157600080fd5b61140d89828a0161122b565b979a9699509497509295939492505050565b600080600080600080600060c0888a03121561143a57600080fd5b873561144581611213565b9650602088013561145581611213565b9550604088013561146581611213565b94506060880135935061147a60808901611320565b925060a088013567ffffffffffffffff81111561149657600080fd5b6114a28a828b0161122b565b989b979a50959850939692959293505050565b600080600080600080600060c0888a0312156114d057600080fd5b87356114db81611213565b965060208801356114eb81611213565b955060408801356114fb81611213565b9450606088013561150b81611213565b93506080880135925060a088013567ffffffffffffffff81111561149657600080fd5b60008060006040848603121561154357600080fd5b61154c84611320565b9250602084013567ffffffffffffffff81111561156857600080fd5b6115748682870161122b565b9497909650939450505050565b60005b8381101561159c578181015183820152602001611584565b838111156108665750506000910152565b600081518084526115c5816020860160208601611581565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261163960c08301846115ad565b98975050505050505050565b82815260406020820152600061109160408301846115ad565b60006020828403121561167057600080fd5b815161109481611213565b6000825161168d818460208701611581565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116fa604083018486611697565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561174457611744611703565b500390565b6001600160a01b0385168152836020820152606060408201526000611772606083018486611697565b9695505050505050565b6001600160a01b038416815260606020820152600061179e60608301856115ad565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117f760c083018486611697565b9998505050505050505050565b6000821982111561181757611817611703565b500190565b60006020828403121561182e57600080fd5b8151801515811461109457600080fd5b60208152600061109460208301846115ad56fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.json +index 60ffa79..05f0b93 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.json +@@ -445,6 +445,19 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -483,8 +496,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b5060405162001a9838038062001a9883398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b61199e80620000fa6000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220c8d6d671bb1ae3bd0434364664f960f2eb1e1515f336e3260e4ce79fceb2110764736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220c8d6d671bb1ae3bd0434364664f960f2eb1e1515f336e3260e4ce79fceb2110764736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json +index 4d47545..d3d119f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json +@@ -185,8 +185,8 @@ + "type": "function" + } + ], +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620011b3380380620011b3833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f3d80620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea2646970667358221220e1995ee56c4c5e67de41c56ad510b16704727d3ab1fa5bb2e3c62b0bd7c0597564736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea2646970667358221220e1995ee56c4c5e67de41c56ad510b16704727d3ab1fa5bb2e3c62b0bd7c0597564736f6c63430008090033", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.json +index 987d7e3..91f165f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.json +@@ -328,6 +328,19 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IChainStorageContainer.sol/IChainStorageContainer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IChainStorageContainer.sol/IChainStorageContainer.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IChainStorageContainer.sol/IChainStorageContainer.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IChainStorageContainer.sol/IChainStorageContainer.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IStateCommitmentChain.sol/IStateCommitmentChain.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IStateCommitmentChain.sol/IStateCommitmentChain.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IStateCommitmentChain.sol/IStateCommitmentChain.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/IStateCommitmentChain.sol/IStateCommitmentChain.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.json +index b2f61e4..8f1cf33 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.json +@@ -363,8 +363,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506040516120bb3803806120bb83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b61200e806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220f97433bcdfea89f96da4dd35233c6b44aadecb94f82aab10226e964aff14127064736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220f97433bcdfea89f96da4dd35233c6b44aadecb94f82aab10226e964aff14127064736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.dbg.json +deleted file mode 100644 +index a931dfc..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.dbg.json ++++ /dev/null +@@ -1,4 +0,0 @@ +-{ +- "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.json +deleted file mode 100644 +index b2eaa94..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.json ++++ /dev/null +@@ -1,287 +0,0 @@ +-{ +- "_format": "hh-sol-artifact-1", +- "contractName": "TeleportrDeposit", +- "sourceName": "contracts/L1/teleportr/TeleportrDeposit.sol", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_minDepositAmount", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_maxDepositAmount", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_maxBalance", +- "type": "uint256" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "owner", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "balance", +- "type": "uint256" +- } +- ], +- "name": "BalanceWithdrawn", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "depositId", +- "type": "uint256" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "emitter", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "amount", +- "type": "uint256" +- } +- ], +- "name": "EtherReceived", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "previousBalance", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "newBalance", +- "type": "uint256" +- } +- ], +- "name": "MaxBalanceSet", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "previousAmount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "newAmount", +- "type": "uint256" +- } +- ], +- "name": "MaxDepositAmountSet", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "previousAmount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "newAmount", +- "type": "uint256" +- } +- ], +- "name": "MinDepositAmountSet", +- "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" +- }, +- { +- "inputs": [], +- "name": "maxBalance", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "maxDepositAmount", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "minDepositAmount", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "owner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "renounceOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_maxDepositAmount", +- "type": "uint256" +- } +- ], +- "name": "setMaxAmount", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_maxBalance", +- "type": "uint256" +- } +- ], +- "name": "setMaxBalance", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_minDepositAmount", +- "type": "uint256" +- } +- ], +- "name": "setMinAmount", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "totalDeposits", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "newOwner", +- "type": "address" +- } +- ], +- "name": "transferOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "withdrawBalance", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "stateMutability": "payable", +- "type": "receive" +- } +- ], +- "bytecode": "0x608060405234801561001057600080fd5b50604051610b4a380380610b4a83398101604081905261002f91610153565b61003833610103565b6001839055600282905560038190556000600481905560408051918252602082018590527f65779d3ca560e9bdec52d08ed75431a84df87cb7796f0e51965f6efc0f556c0f910160405180910390a16040805160008152602081018490527fb1e6cc560df1786578fd4d1fe6e046f089a0c3be401e999b51a5112437911797910160405180910390a16040805160008152602081018390527f185c6391e7218e85de8a9346fc72024a0f88e1f04c186e6351230b93976ad50b910160405180910390a1505050610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006060848603121561016857600080fd5b8351925060208401519150604084015190509250925092565b6109ba806101906000396000f3fe6080604052600436106100c05760003560e01c80637d882097116100745780638ed832711161004e5780638ed83271146103445780639d51d9b71461035a578063f2fde38b1461037a57600080fd5b80637d882097146102d9578063897b0637146102ef5780638da5cb5b1461030f57600080fd5b8063645006ca116100a5578063645006ca14610285578063715018a6146102ae57806373ad468a146102c357600080fd5b80634fe47f701461024e5780635fd8c7101461027057600080fd5b3661024957600154341015610136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f73697420616d6f756e7420697320746f6f20736d616c6c000000000060448201526064015b60405180910390fd5b6002543411156101a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706f73697420616d6f756e7420697320746f6f2062696700000000000000604482015260640161012d565b60035447111561020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f436f6e7472616374206d61782062616c616e6365206578636565646564000000604482015260640161012d565b600454604051349133917f2d27851832fcac28a0d4af1344f01fed7ffcfd15171c14c564a0c42aa57ae5c090600090a4600480546001019055005b600080fd5b34801561025a57600080fd5b5061026e61026936600461092e565b61039a565b005b34801561027c57600080fd5b5061026e61045c565b34801561029157600080fd5b5061029b60015481565b6040519081526020015b60405180910390f35b3480156102ba57600080fd5b5061026e610578565b3480156102cf57600080fd5b5061029b60035481565b3480156102e557600080fd5b5061029b60045481565b3480156102fb57600080fd5b5061026e61030a36600461092e565b610605565b34801561031b57600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a5565b34801561035057600080fd5b5061029b60025481565b34801561036657600080fd5b5061026e61037536600461092e565b6106c7565b34801561038657600080fd5b5061026e610395366004610947565b610789565b60005473ffffffffffffffffffffffffffffffffffffffff16331461041b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60025460408051918252602082018390527fb1e6cc560df1786578fd4d1fe6e046f089a0c3be401e999b51a5112437911797910160405180910390a1600255565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b6000546040805147808252915173ffffffffffffffffffffffffffffffffffffffff9093169283917fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f1919081900360200190a260405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610573573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b61060360006108b9565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60015460408051918252602082018390527f65779d3ca560e9bdec52d08ed75431a84df87cb7796f0e51965f6efc0f556c0f910160405180910390a1600155565b60005473ffffffffffffffffffffffffffffffffffffffff163314610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60035460408051918252602082018390527f185c6391e7218e85de8a9346fc72024a0f88e1f04c186e6351230b93976ad50b910160405180910390a1600355565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b73ffffffffffffffffffffffffffffffffffffffff81166108ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161012d565b6108b6816108b9565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561094057600080fd5b5035919050565b60006020828403121561095957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461097d57600080fd5b939250505056fea2646970667358221220b610d8106720e33f96db31f8c5c4f9cecb50144a2cf1e4049ac0216cd47d0eff64736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100c05760003560e01c80637d882097116100745780638ed832711161004e5780638ed83271146103445780639d51d9b71461035a578063f2fde38b1461037a57600080fd5b80637d882097146102d9578063897b0637146102ef5780638da5cb5b1461030f57600080fd5b8063645006ca116100a5578063645006ca14610285578063715018a6146102ae57806373ad468a146102c357600080fd5b80634fe47f701461024e5780635fd8c7101461027057600080fd5b3661024957600154341015610136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f73697420616d6f756e7420697320746f6f20736d616c6c000000000060448201526064015b60405180910390fd5b6002543411156101a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706f73697420616d6f756e7420697320746f6f2062696700000000000000604482015260640161012d565b60035447111561020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f436f6e7472616374206d61782062616c616e6365206578636565646564000000604482015260640161012d565b600454604051349133917f2d27851832fcac28a0d4af1344f01fed7ffcfd15171c14c564a0c42aa57ae5c090600090a4600480546001019055005b600080fd5b34801561025a57600080fd5b5061026e61026936600461092e565b61039a565b005b34801561027c57600080fd5b5061026e61045c565b34801561029157600080fd5b5061029b60015481565b6040519081526020015b60405180910390f35b3480156102ba57600080fd5b5061026e610578565b3480156102cf57600080fd5b5061029b60035481565b3480156102e557600080fd5b5061029b60045481565b3480156102fb57600080fd5b5061026e61030a36600461092e565b610605565b34801561031b57600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a5565b34801561035057600080fd5b5061029b60025481565b34801561036657600080fd5b5061026e61037536600461092e565b6106c7565b34801561038657600080fd5b5061026e610395366004610947565b610789565b60005473ffffffffffffffffffffffffffffffffffffffff16331461041b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60025460408051918252602082018390527fb1e6cc560df1786578fd4d1fe6e046f089a0c3be401e999b51a5112437911797910160405180910390a1600255565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b6000546040805147808252915173ffffffffffffffffffffffffffffffffffffffff9093169283917fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f1919081900360200190a260405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610573573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b61060360006108b9565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60015460408051918252602082018390527f65779d3ca560e9bdec52d08ed75431a84df87cb7796f0e51965f6efc0f556c0f910160405180910390a1600155565b60005473ffffffffffffffffffffffffffffffffffffffff163314610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b60035460408051918252602082018390527f185c6391e7218e85de8a9346fc72024a0f88e1f04c186e6351230b93976ad50b910160405180910390a1600355565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012d565b73ffffffffffffffffffffffffffffffffffffffff81166108ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161012d565b6108b6816108b9565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561094057600080fd5b5035919050565b60006020828403121561095957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461097d57600080fd5b939250505056fea2646970667358221220b610d8106720e33f96db31f8c5c4f9cecb50144a2cf1e4049ac0216cd47d0eff64736f6c63430008090033", +- "linkReferences": {}, +- "deployedLinkReferences": {} +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.json +new file mode 100644 +index 0000000..010d417 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/token/BOBA.sol/BOBA.json +@@ -0,0 +1,685 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "BOBA", ++ "sourceName": "contracts/L1/token/BOBA.sol", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.json +index 6089c01..81ef410 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/BondManager.sol/BondManager.json +@@ -66,8 +66,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b5060405161048838038061048883398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103f5806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea264697066735822122087d4cb97cd5a4456c2b8ab23d1374b6ac6874a5b854a207714f5b3768ca6d73a64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea264697066735822122087d4cb97cd5a4456c2b8ab23d1374b6ac6874a5b854a207714f5b3768ca6d73a64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/IBondManager.sol/IBondManager.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/IBondManager.sol/IBondManager.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/IBondManager.sol/IBondManager.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L1/verification/IBondManager.sol/IBondManager.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2CrossDomainMessenger.sol/IL2CrossDomainMessenger.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2CrossDomainMessenger.sol/IL2CrossDomainMessenger.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2CrossDomainMessenger.sol/IL2CrossDomainMessenger.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2CrossDomainMessenger.sol/IL2CrossDomainMessenger.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2ERC20Bridge.sol/IL2ERC20Bridge.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2ERC20Bridge.sol/IL2ERC20Bridge.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2ERC20Bridge.sol/IL2ERC20Bridge.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/IL2ERC20Bridge.sol/IL2ERC20Bridge.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json +index 5e6412d..27d63fe 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json +@@ -225,8 +225,8 @@ + "type": "function" + } + ], +- "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50604051610cc3380380610cc383398101604081905261004391610068565b600580546001600160a01b0319166001600160a01b0392909216919091179055610098565b60006020828403121561007a57600080fd5b81516001600160a01b038116811461009157600080fd5b9392505050565b610c1c806100a76000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea2646970667358221220b811ce81cf7c8e6c3f95fd409f5df45ff3657ba48c1021d318de2a78cd45af6264736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea2646970667358221220b811ce81cf7c8e6c3f95fd409f5df45ff3657ba48c1021d318de2a78cd45af6264736f6c63430008090033", ++ "bytecode": "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50604051610c9a380380610c9a83398101604081905261004391610068565b600580546001600160a01b0319166001600160a01b0392909216919091179055610098565b60006020828403121561007a57600080fd5b81516001600160a01b038116811461009157600080fd5b9392505050565b610bf3806100a76000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.json +index fbf4eaf..0fdfc3e 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.json +@@ -274,8 +274,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506040516111c43803806111c483398101604081905261002f9161007c565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556100af565b80516001600160a01b038116811461007757600080fd5b919050565b6000806040838503121561008f57600080fd5b61009883610060565b91506100a660208401610060565b90509250929050565b611106806100be6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673deaddeaddeaddeaddeaddeaddeaddeaddead000014156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea2646970667358221220df892c82e9ba0fc965240aa38614ff1bd6af4d227ce2c0e9933d7f50711a886264736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673deaddeaddeaddeaddeaddeaddeaddeaddead000014156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea2646970667358221220df892c82e9ba0fc965240aa38614ff1bd6af4d227ce2c0e9933d7f50711a886264736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161119b38038061119b83398101604081905261002f9161007c565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556100af565b80516001600160a01b038116811461007757600080fd5b919050565b6000806040838503121561008f57600080fd5b61009883610060565b91506100a660208401610060565b90509250929050565b6110dd806100be6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000000614156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000000614156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.json +new file mode 100644 +index 0000000..1d480fb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.json +@@ -0,0 +1,281 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L2StandardBridgeAltL1", ++ "sourceName": "contracts/L2/messaging/L2StandardBridgeAltL1.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l2CrossDomainMessenger", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l1TokenBridge", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "DepositFailed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "DepositFinalized", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "WithdrawalInitiated", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "finalizeDeposit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l1TokenBridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "messenger", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l1Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "withdraw", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l2Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_l1Gas", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "withdrawTo", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161119b38038061119b83398101604081905261002f9161007c565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556100af565b80516001600160a01b038116811461007757600080fd5b919050565b6000806040838503121561008f57600080fd5b61009883610060565b91506100a660208401610060565b90509250929050565b6110dd806100be6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000002314156108d5576040517f0f6a78690000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000002314156108d5576040517f0f6a78690000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.json +index c6bbe0f..bc24a5c 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.json +@@ -38,6 +38,11 @@ + "internalType": "string", + "name": "_symbol", + "type": "string" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "_decimals", ++ "type": "uint8" + } + ], + "name": "createStandardL2Token", +@@ -46,8 +51,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506117bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063896f93d114610030575b600080fd5b61004361003e36600461025f565b610045565b005b73ffffffffffffffffffffffffffffffffffffffff83166100c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742070726f76696465204c3120746f6b656e2061646472657373000000604482015260640160405180910390fd5b60007342000000000000000000000000000000000000108484846040516100ec90610178565b6100f99493929190610359565b604051809103906000f080158015610115573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a350505050565b6113d7806103b083390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126101c557600080fd5b813567ffffffffffffffff808211156101e0576101e0610185565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561022657610226610185565b8160405283815286602085880101111561023f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561027457600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461029857600080fd5b9250602084013567ffffffffffffffff808211156102b557600080fd5b6102c1878388016101b4565b935060408601359150808211156102d757600080fd5b506102e4868287016101b4565b9150509250925092565b6000815180845260005b81811015610314576020818501810151868301820152016102f8565b81811115610326576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261039260808301856102ee565b82810360608401526103a481856102ee565b97965050505050505056fe60806040523480156200001157600080fd5b50604051620013d7380380620013d783398101604081905262000034916200022f565b8151829082906200004d9060039060208501906200009f565b508051620000639060049060208401906200009f565b5050600580546001600160a01b039586166001600160a01b031991821617909155600680549690951695169490941790925550620002fc915050565b828054620000ad90620002bf565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b80516001600160a01b03811681146200015d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a762000162565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d262000162565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b600080600080608085870312156200024657600080fd5b620002518562000145565b9350620002616020860162000145565b60408601519093506001600160401b03808211156200027f57600080fd5b6200028d8883890162000178565b93506060870151915080821115620002a457600080fd5b50620002b38782880162000178565b91505092959194509250565b600181811c90821680620002d457607f821691505b60208210811415620002f657634e487b7160e01b600052602260045260246000fd5b50919050565b6110cb806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e4a565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610e93565b610118610150366004610f2f565b610425565b6002545b604051908152602001610124565b610118610175366004610f59565b61043b565b60405160128152602001610124565b610118610197366004610f2f565b61050c565b6101af6101aa366004610f2f565b610555565b005b6101596101bf366004610f95565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561061a565b6101af6101fd366004610f2f565b610629565b610118610210366004610f2f565b6106e2565b610118610223366004610f2f565b6107a0565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610fb0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610fe3565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610fe3565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b60006104323384846107ad565b50600192915050565b600061044884848461092d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156104f45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61050185338584036107ad565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610432918590610550908690611066565b6107ad565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105bc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b6105c68282610b93565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161060e91815260200190565b60405180910390a25050565b6060600480546103a290610fe3565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106905760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b61069a8282610c99565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161060e91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104eb565b61079633858584036107ad565b5060019392505050565b600061043233848461092d565b73ffffffffffffffffffffffffffffffffffffffff83166108355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff82166108be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff8216610a3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610adb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b1f908490611066565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b8591815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610bf65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104eb565b8060026000828254610c089190611066565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c42908490611066565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610dfa90849061107e565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610920565b600060208284031215610e5c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e8c57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ec057858101830151858201604001528201610ea4565b81811115610ed2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2a57600080fd5b919050565b60008060408385031215610f4257600080fd5b610f4b83610f06565b946020939093013593505050565b600080600060608486031215610f6e57600080fd5b610f7784610f06565b9250610f8560208501610f06565b9150604084013590509250925092565b600060208284031215610fa757600080fd5b610e8c82610f06565b60008060408385031215610fc357600080fd5b610fcc83610f06565b9150610fda60208401610f06565b90509250929050565b600181811c90821680610ff757607f821691505b60208210811415611031577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561107957611079611037565b500190565b60008282101561109057611090611037565b50039056fea264697066735822122069a2d33039157f3f2f180571262ca2a5d0a3a24d33bf9448f3b7c2ce9ff757f964736f6c63430008090033a2646970667358221220d2e13f28319115807ec7308d1cd88642a8542d0b838e00b8769f8a85d696f26764736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063896f93d114610030575b600080fd5b61004361003e36600461025f565b610045565b005b73ffffffffffffffffffffffffffffffffffffffff83166100c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742070726f76696465204c3120746f6b656e2061646472657373000000604482015260640160405180910390fd5b60007342000000000000000000000000000000000000108484846040516100ec90610178565b6100f99493929190610359565b604051809103906000f080158015610115573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a350505050565b6113d7806103b083390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126101c557600080fd5b813567ffffffffffffffff808211156101e0576101e0610185565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561022657610226610185565b8160405283815286602085880101111561023f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561027457600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461029857600080fd5b9250602084013567ffffffffffffffff808211156102b557600080fd5b6102c1878388016101b4565b935060408601359150808211156102d757600080fd5b506102e4868287016101b4565b9150509250925092565b6000815180845260005b81811015610314576020818501810151868301820152016102f8565b81811115610326576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261039260808301856102ee565b82810360608401526103a481856102ee565b97965050505050505056fe60806040523480156200001157600080fd5b50604051620013d7380380620013d783398101604081905262000034916200022f565b8151829082906200004d9060039060208501906200009f565b508051620000639060049060208401906200009f565b5050600580546001600160a01b039586166001600160a01b031991821617909155600680549690951695169490941790925550620002fc915050565b828054620000ad90620002bf565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b80516001600160a01b03811681146200015d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a762000162565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d262000162565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b600080600080608085870312156200024657600080fd5b620002518562000145565b9350620002616020860162000145565b60408601519093506001600160401b03808211156200027f57600080fd5b6200028d8883890162000178565b93506060870151915080821115620002a457600080fd5b50620002b38782880162000178565b91505092959194509250565b600181811c90821680620002d457607f821691505b60208210811415620002f657634e487b7160e01b600052602260045260246000fd5b50919050565b6110cb806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e4a565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610e93565b610118610150366004610f2f565b610425565b6002545b604051908152602001610124565b610118610175366004610f59565b61043b565b60405160128152602001610124565b610118610197366004610f2f565b61050c565b6101af6101aa366004610f2f565b610555565b005b6101596101bf366004610f95565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561061a565b6101af6101fd366004610f2f565b610629565b610118610210366004610f2f565b6106e2565b610118610223366004610f2f565b6107a0565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610fb0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610fe3565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610fe3565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b60006104323384846107ad565b50600192915050565b600061044884848461092d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156104f45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61050185338584036107ad565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610432918590610550908690611066565b6107ad565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105bc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b6105c68282610b93565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161060e91815260200190565b60405180910390a25050565b6060600480546103a290610fe3565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106905760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b61069a8282610c99565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161060e91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104eb565b61079633858584036107ad565b5060019392505050565b600061043233848461092d565b73ffffffffffffffffffffffffffffffffffffffff83166108355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff82166108be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff8216610a3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610adb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b1f908490611066565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b8591815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610bf65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104eb565b8060026000828254610c089190611066565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c42908490611066565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610dfa90849061107e565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610920565b600060208284031215610e5c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e8c57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ec057858101830151858201604001528201610ea4565b81811115610ed2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2a57600080fd5b919050565b60008060408385031215610f4257600080fd5b610f4b83610f06565b946020939093013593505050565b600080600060608486031215610f6e57600080fd5b610f7784610f06565b9250610f8560208501610f06565b9150604084013590509250925092565b600060208284031215610fa757600080fd5b610e8c82610f06565b60008060408385031215610fc357600080fd5b610fcc83610f06565b9150610fda60208401610f06565b90509250929050565b600181811c90821680610ff757607f821691505b60208210811415611031577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561107957611079611037565b500190565b60008282101561109057611090611037565b50039056fea264697066735822122069a2d33039157f3f2f180571262ca2a5d0a3a24d33bf9448f3b7c2ce9ff757f964736f6c63430008090033a2646970667358221220d2e13f28319115807ec7308d1cd88642a8542d0b838e00b8769f8a85d696f26764736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506117e0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630769a96914610030575b600080fd5b61004361003e366004610262565b610045565b005b73ffffffffffffffffffffffffffffffffffffffff84166100c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742070726f76696465204c3120746f6b656e2061646472657373000000604482015260640160405180910390fd5b6000734200000000000000000000000000000000000010858585856040516100ed9061017b565b6100fb959493929190610375565b604051809103906000f080158015610117573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a35050505050565b6113fd806103d783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126101c857600080fd5b813567ffffffffffffffff808211156101e3576101e3610188565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561022957610229610188565b8160405283815286602085880101111561024257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561027857600080fd5b843573ffffffffffffffffffffffffffffffffffffffff8116811461029c57600080fd5b9350602085013567ffffffffffffffff808211156102b957600080fd5b6102c5888389016101b7565b945060408701359150808211156102db57600080fd5b506102e8878288016101b7565b925050606085013560ff811681146102ff57600080fd5b939692955090935050565b6000815180845260005b8181101561033057602081850181015186830182015201610314565b81811115610342576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526103ae60a083018661030a565b82810360608401526103c0818661030a565b91505060ff83166080830152969550505050505056fe60a06040523480156200001157600080fd5b50604051620013fd380380620013fd833981016040819052620000349162000234565b8251839083906200004d906003906020850190620000a4565b50805162000063906004906020840190620000a4565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff16608052506200031d565b828054620000b290620002e0565b90600052602060002090601f016020900481019282620000d6576000855562000121565b82601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b5b808211156200012f576000815560010162000134565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018f57600080fd5b81516001600160401b0380821115620001ac57620001ac62000167565b604051601f8301601f19908116603f01168101908282118183101715620001d757620001d762000167565b81604052838152602092508683858801011115620001f457600080fd5b600091505b83821015620002185785820183015181830184015290820190620001f9565b838211156200022a5760008385830101525b9695505050505050565b600080600080600060a086880312156200024d57600080fd5b62000258866200014a565b945062000268602087016200014a565b60408701519094506001600160401b03808211156200028657600080fd5b6200029489838a016200017d565b94506060880151915080821115620002ab57600080fd5b50620002ba888289016200017d565b925050608086015160ff81168114620002d257600080fd5b809150509295509295909350565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516110c462000339600039600061018101526110c46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000aa164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80630769a96914610030575b600080fd5b61004361003e366004610262565b610045565b005b73ffffffffffffffffffffffffffffffffffffffff84166100c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742070726f76696465204c3120746f6b656e2061646472657373000000604482015260640160405180910390fd5b6000734200000000000000000000000000000000000010858585856040516100ed9061017b565b6100fb959493929190610375565b604051809103906000f080158015610117573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a35050505050565b6113fd806103d783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126101c857600080fd5b813567ffffffffffffffff808211156101e3576101e3610188565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561022957610229610188565b8160405283815286602085880101111561024257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561027857600080fd5b843573ffffffffffffffffffffffffffffffffffffffff8116811461029c57600080fd5b9350602085013567ffffffffffffffff808211156102b957600080fd5b6102c5888389016101b7565b945060408701359150808211156102db57600080fd5b506102e8878288016101b7565b925050606085013560ff811681146102ff57600080fd5b939692955090935050565b6000815180845260005b8181101561033057602081850181015186830182015201610314565b81811115610342576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526103ae60a083018661030a565b82810360608401526103c0818661030a565b91505060ff83166080830152969550505050505056fe60a06040523480156200001157600080fd5b50604051620013fd380380620013fd833981016040819052620000349162000234565b8251839083906200004d906003906020850190620000a4565b50805162000063906004906020840190620000a4565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff16608052506200031d565b828054620000b290620002e0565b90600052602060002090601f016020900481019282620000d6576000855562000121565b82601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b5b808211156200012f576000815560010162000134565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018f57600080fd5b81516001600160401b0380821115620001ac57620001ac62000167565b604051601f8301601f19908116603f01168101908282118183101715620001d757620001d762000167565b81604052838152602092508683858801011115620001f457600080fd5b600091505b83821015620002185785820183015181830184015290820190620001f9565b838211156200022a5760008385830101525b9695505050505050565b600080600080600060a086880312156200024d57600080fd5b62000258866200014a565b945062000268602087016200014a565b60408701519094506001600160401b03808211156200028657600080fd5b6200029489838a016200017d565b94506060880151915080821115620002ab57600080fd5b50620002ba888289016200017d565b925050608086015160ff81168114620002d257600080fd5b809150509295509295909350565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516110c462000339600039600061018101526110c46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000aa164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.json +new file mode 100644 +index 0000000..9e7a54c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.json +@@ -0,0 +1,245 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "BobaTuringCredit", ++ "sourceName": "contracts/L2/predeploys/BobaTuringCredit.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_turingPrice", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "balanceAmount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddBalanceTo", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "oldOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "TransferOwnership", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "withdrawAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "WithdrawRevenue", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_addBalanceAmount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "address", ++ "name": "_helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "addBalanceTo", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "getCreditAmount", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "ownerRevenue", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "prepaidBalance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "turingPrice", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "turingToken", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_turingPrice", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateTuringPrice", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_turingToken", ++ "type": "address" ++ } ++ ], ++ "name": "updateTuringToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_withdrawAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "withdrawRevenue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161118038038061118083398101604081905261002f91610037565b600355610050565b60006020828403121561004957600080fd5b5051919050565b6111218061005f6000396000f3fe608060405234801561001057600080fd5b50600436106100c85760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b2578063f7cd3be8146101c5578063fd892278146101d857600080fd5b80638da5cb5b14610176578063a52b962d14610196578063e24dfcde146101a957600080fd5b80630ceff204116100b25780630ceff2041461010957806335d6eac41461011e578063853383921461013157600080fd5b8062292526146100cd57806309da3981146100e9575b600080fd5b6100d660045481565b6040519081526020015b60405180910390f35b6100d66100f7366004610f60565b60016020526000908152604090205481565b61011c610117366004610f7b565b6101eb565b005b61011c61012c366004610f60565b6103d2565b6002546101519073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6000546101519073ffffffffffffffffffffffffffffffffffffffff1681565b6100d66101a4366004610f60565b610507565b6100d660035481565b61011c6101c0366004610f60565b610594565b61011c6101d3366004610f7b565b6106bc565b61011c6101e6366004610f94565b610749565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610227575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102785760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103035760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b6004548111156103555760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e74000000000000000000000000000000000000604482015260640161026f565b80600460008282546103679190610fef565b909155505060408051338152602081018390527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e301910160405180910390a16000546002546103cf9173ffffffffffffffffffffffffffffffffffffffff91821691168361099d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061040e575060005473ffffffffffffffffffffffffffffffffffffffff16155b61045a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b60025473ffffffffffffffffffffffffffffffffffffffff16156104c05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a6564000000604482015260640161026f565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006003546000141561055c5760405162461bcd60e51b815260206004820152601060248201527f556e6c696d697465642063726564697400000000000000000000000000000000604482015260640161026f565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461058e91610a76565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105d0575060005473ffffffffffffffffffffffffffffffffffffffff16155b61061c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff811661063c57600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106f8575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107445760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166107d45760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b816108215760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161026f565b803b61086f5760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f41000000000000000000000000000000000000604482015260640161026f565b610899817f2f7adf4300000000000000000000000000000000000000000000000000000000610a89565b6108e55760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e7472616374000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260408120805484929061091a908490611006565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff83168183015290517f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a9181900360600190a16002546109999073ffffffffffffffffffffffffffffffffffffffff16333085610aa5565b5050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a719084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610b09565b505050565b6000610a82828461101e565b9392505050565b6000610a9483610bfb565b8015610a825750610a828383610c5f565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610b039085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016109ef565b50505050565b6000610b6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d9b9092919063ffffffff16565b805190915015610a715780806020019051810190610b899190611059565b610a715760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161026f565b6000610c27827f01ffc9a700000000000000000000000000000000000000000000000000000000610c5f565b801561058e5750610c58827fffffffff00000000000000000000000000000000000000000000000000000000610c5f565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610d199086906110a7565b6000604051808303818686fa925050503d8060008114610d55576040519150601f19603f3d011682016040523d82523d6000602084013e610d5a565b606091505b5091509150602081511015610d75576000935050505061058e565b818015610d91575080806020019051810190610d919190611059565b9695505050505050565b6060610daa8484600085610db2565b949350505050565b606082471015610e2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161026f565b843b610e785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610ea191906110a7565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5091509150610ef3828286610efe565b979650505050505050565b60608315610f0d575081610a82565b825115610f1d5782518084602001fd5b8160405162461bcd60e51b815260040161026f91906110c3565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f5b57600080fd5b919050565b600060208284031215610f7257600080fd5b610a8282610f37565b600060208284031215610f8d57600080fd5b5035919050565b60008060408385031215610fa757600080fd5b82359150610fb760208401610f37565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561100157611001610fc0565b500390565b6000821982111561101957611019610fc0565b500190565b600082611054577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561106b57600080fd5b81518015158114610a8257600080fd5b60005b8381101561109657818101518382015260200161107e565b83811115610b035750506000910152565b600082516110b981846020870161107b565b9190910192915050565b60208152600082518060208401526110e281604085016020870161107b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c85760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b2578063f7cd3be8146101c5578063fd892278146101d857600080fd5b80638da5cb5b14610176578063a52b962d14610196578063e24dfcde146101a957600080fd5b80630ceff204116100b25780630ceff2041461010957806335d6eac41461011e578063853383921461013157600080fd5b8062292526146100cd57806309da3981146100e9575b600080fd5b6100d660045481565b6040519081526020015b60405180910390f35b6100d66100f7366004610f60565b60016020526000908152604090205481565b61011c610117366004610f7b565b6101eb565b005b61011c61012c366004610f60565b6103d2565b6002546101519073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6000546101519073ffffffffffffffffffffffffffffffffffffffff1681565b6100d66101a4366004610f60565b610507565b6100d660035481565b61011c6101c0366004610f60565b610594565b61011c6101d3366004610f7b565b6106bc565b61011c6101e6366004610f94565b610749565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610227575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102785760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103035760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b6004548111156103555760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e74000000000000000000000000000000000000604482015260640161026f565b80600460008282546103679190610fef565b909155505060408051338152602081018390527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e301910160405180910390a16000546002546103cf9173ffffffffffffffffffffffffffffffffffffffff91821691168361099d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061040e575060005473ffffffffffffffffffffffffffffffffffffffff16155b61045a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b60025473ffffffffffffffffffffffffffffffffffffffff16156104c05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a6564000000604482015260640161026f565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006003546000141561055c5760405162461bcd60e51b815260206004820152601060248201527f556e6c696d697465642063726564697400000000000000000000000000000000604482015260640161026f565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461058e91610a76565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105d0575060005473ffffffffffffffffffffffffffffffffffffffff16155b61061c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff811661063c57600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106f8575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107445760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166107d45760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b816108215760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161026f565b803b61086f5760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f41000000000000000000000000000000000000604482015260640161026f565b610899817f2f7adf4300000000000000000000000000000000000000000000000000000000610a89565b6108e55760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e7472616374000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260408120805484929061091a908490611006565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff83168183015290517f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a9181900360600190a16002546109999073ffffffffffffffffffffffffffffffffffffffff16333085610aa5565b5050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a719084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610b09565b505050565b6000610a82828461101e565b9392505050565b6000610a9483610bfb565b8015610a825750610a828383610c5f565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610b039085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016109ef565b50505050565b6000610b6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d9b9092919063ffffffff16565b805190915015610a715780806020019051810190610b899190611059565b610a715760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161026f565b6000610c27827f01ffc9a700000000000000000000000000000000000000000000000000000000610c5f565b801561058e5750610c58827fffffffff00000000000000000000000000000000000000000000000000000000610c5f565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610d199086906110a7565b6000604051808303818686fa925050503d8060008114610d55576040519150601f19603f3d011682016040523d82523d6000602084013e610d5a565b606091505b5091509150602081511015610d75576000935050505061058e565b818015610d91575080806020019051810190610d919190611059565b9695505050505050565b6060610daa8484600085610db2565b949350505050565b606082471015610e2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161026f565b843b610e785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610ea191906110a7565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5091509150610ef3828286610efe565b979650505050505050565b60608315610f0d575081610a82565b825115610f1d5782518084602001fd5b8160405162461bcd60e51b815260040161026f91906110c3565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f5b57600080fd5b919050565b600060208284031215610f7257600080fd5b610a8282610f37565b600060208284031215610f8d57600080fd5b5035919050565b60008060408385031215610fa757600080fd5b82359150610fb760208401610f37565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561100157611001610fc0565b500390565b6000821982111561101957611019610fc0565b500190565b600082611054577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561106b57600080fd5b81518015158114610a8257600080fd5b60005b8381101561109657818101518382015260200161107e565b83811115610b035750506000910152565b600082516110b981846020870161107b565b9190910192915050565b60208152600082518060208401526110e281604085016020870161107b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.json +new file mode 100644 +index 0000000..d57c00c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.json +@@ -0,0 +1,245 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "BobaTuringCreditAltL1", ++ "sourceName": "contracts/L2/predeploys/BobaTuringCreditAltL1.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_turingPrice", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "balanceAmount", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddBalanceTo", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "oldOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "TransferOwnership", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "withdrawAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "WithdrawRevenue", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_addBalanceAmount", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "address", ++ "name": "_helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "addBalanceTo", ++ "outputs": [], ++ "stateMutability": "payable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_helperContractAddress", ++ "type": "address" ++ } ++ ], ++ "name": "getCreditAmount", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "ownerRevenue", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "prepaidBalance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "turingPrice", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "turingToken", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_turingPrice", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateTuringPrice", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_turingToken", ++ "type": "address" ++ } ++ ], ++ "name": "updateTuringToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_withdrawAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "withdrawRevenue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610e39380380610e3983398101604081905261002f91610037565b600355610050565b60006020828403121561004957600080fd5b5051919050565b610dda8061005f6000396000f3fe6080604052600436106100bb5760003560e01c80638da5cb5b11610074578063f2fde38b1161004e578063f2fde38b1461020d578063f7cd3be81461022d578063fd8922781461024d57600080fd5b80638da5cb5b146101aa578063a52b962d146101d7578063e24dfcde146101f757600080fd5b80630ceff204116100a55780630ceff2041461011657806335d6eac414610138578063853383921461015857600080fd5b8062292526146100c057806309da3981146100e9575b600080fd5b3480156100cc57600080fd5b506100d660045481565b6040519081526020015b60405180910390f35b3480156100f557600080fd5b506100d6610104366004610c77565b60016020526000908152604090205481565b34801561012257600080fd5b50610136610131366004610c92565b610260565b005b34801561014457600080fd5b50610136610153366004610c77565b6104cf565b34801561016457600080fd5b506002546101859073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b3480156101b657600080fd5b506000546101859073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101e357600080fd5b506100d66101f2366004610c77565b610604565b34801561020357600080fd5b506100d660035481565b34801561021957600080fd5b50610136610228366004610c77565b610691565b34801561023957600080fd5b50610136610248366004610c92565b6107b9565b61013661025b366004610cab565b610846565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061029c575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102ed5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103785760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b6004548111156103ca5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e7400000000000000000000000000000000000060448201526064016102e4565b80600460008282546103dc9190610d06565b90915550506000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d806000811461043b576040519150601f19603f3d011682016040523d82523d6000602084013e610440565b606091505b50509050806104915760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016102e4565b60408051338152602081018490527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e30191015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061050b575060005473ffffffffffffffffffffffffffffffffffffffff16155b6105575760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b60025473ffffffffffffffffffffffffffffffffffffffff16156105bd5760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016102e4565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000600354600014156106595760405162461bcd60e51b815260206004820152601060248201527f556e6c696d69746564206372656469740000000000000000000000000000000060448201526064016102e4565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461068b91610a7f565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106cd575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107195760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811661073957600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806107f5575060005473ffffffffffffffffffffffffffffffffffffffff16155b6108415760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166108d15760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b81158015906108df57508134145b61092b5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e7400000000000000000000000000000000000060448201526064016102e4565b803b6109795760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f4100000000000000000000000000000000000060448201526064016102e4565b6109a3817f2f7adf4300000000000000000000000000000000000000000000000000000000610a92565b6109ef5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e747261637400000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081208054849290610a24908490610d1d565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff8316918101919091527f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a906060016104c3565b6000610a8b8284610d35565b9392505050565b6000610a9d83610aae565b8015610a8b5750610a8b8383610b12565b6000610ada827f01ffc9a700000000000000000000000000000000000000000000000000000000610b12565b801561068b5750610b0b827fffffffff00000000000000000000000000000000000000000000000000000000610b12565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610bcc908690610d70565b6000604051808303818686fa925050503d8060008114610c08576040519150601f19603f3d011682016040523d82523d6000602084013e610c0d565b606091505b5091509150602081511015610c28576000935050505061068b565b818015610c44575080806020019051810190610c449190610dab565b9695505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c7257600080fd5b919050565b600060208284031215610c8957600080fd5b610a8b82610c4e565b600060208284031215610ca457600080fd5b5035919050565b60008060408385031215610cbe57600080fd5b82359150610cce60208401610c4e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610d1857610d18610cd7565b500390565b60008219821115610d3057610d30610cd7565b500190565b600082610d6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000825160005b81811015610d915760208186018101518583015201610d77565b81811115610da0576000828501525b509190910192915050565b600060208284031215610dbd57600080fd5b81518015158114610a8b57600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100bb5760003560e01c80638da5cb5b11610074578063f2fde38b1161004e578063f2fde38b1461020d578063f7cd3be81461022d578063fd8922781461024d57600080fd5b80638da5cb5b146101aa578063a52b962d146101d7578063e24dfcde146101f757600080fd5b80630ceff204116100a55780630ceff2041461011657806335d6eac414610138578063853383921461015857600080fd5b8062292526146100c057806309da3981146100e9575b600080fd5b3480156100cc57600080fd5b506100d660045481565b6040519081526020015b60405180910390f35b3480156100f557600080fd5b506100d6610104366004610c77565b60016020526000908152604090205481565b34801561012257600080fd5b50610136610131366004610c92565b610260565b005b34801561014457600080fd5b50610136610153366004610c77565b6104cf565b34801561016457600080fd5b506002546101859073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b3480156101b657600080fd5b506000546101859073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101e357600080fd5b506100d66101f2366004610c77565b610604565b34801561020357600080fd5b506100d660035481565b34801561021957600080fd5b50610136610228366004610c77565b610691565b34801561023957600080fd5b50610136610248366004610c92565b6107b9565b61013661025b366004610cab565b610846565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061029c575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102ed5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103785760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b6004548111156103ca5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e7400000000000000000000000000000000000060448201526064016102e4565b80600460008282546103dc9190610d06565b90915550506000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d806000811461043b576040519150601f19603f3d011682016040523d82523d6000602084013e610440565b606091505b50509050806104915760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016102e4565b60408051338152602081018490527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e30191015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061050b575060005473ffffffffffffffffffffffffffffffffffffffff16155b6105575760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b60025473ffffffffffffffffffffffffffffffffffffffff16156105bd5760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016102e4565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000600354600014156106595760405162461bcd60e51b815260206004820152601060248201527f556e6c696d69746564206372656469740000000000000000000000000000000060448201526064016102e4565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461068b91610a7f565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106cd575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107195760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811661073957600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806107f5575060005473ffffffffffffffffffffffffffffffffffffffff16155b6108415760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166108d15760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b81158015906108df57508134145b61092b5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e7400000000000000000000000000000000000060448201526064016102e4565b803b6109795760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f4100000000000000000000000000000000000060448201526064016102e4565b6109a3817f2f7adf4300000000000000000000000000000000000000000000000000000000610a92565b6109ef5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e747261637400000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081208054849290610a24908490610d1d565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff8316918101919091527f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a906060016104c3565b6000610a8b8284610d35565b9392505050565b6000610a9d83610aae565b8015610a8b5750610a8b8383610b12565b6000610ada827f01ffc9a700000000000000000000000000000000000000000000000000000000610b12565b801561068b5750610b0b827fffffffff00000000000000000000000000000000000000000000000000000000610b12565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610bcc908690610d70565b6000604051808303818686fa925050503d8060008114610c08576040519150601f19603f3d011682016040523d82523d6000602084013e610c0d565b606091505b5091509150602081511015610c28576000935050505061068b565b818015610c44575080806020019051810190610c449190610dab565b9695505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c7257600080fd5b919050565b600060208284031215610c8957600080fd5b610a8b82610c4e565b600060208284031215610ca457600080fd5b5035919050565b60008060408385031215610cbe57600080fd5b82359150610cce60208401610c4e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610d1857610d18610cd7565b500390565b60008219821115610d3057610d30610cd7565b500190565b600082610d6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000825160005b81811015610d915760208186018101518583015201610d77565b81811115610da0576000828501525b509190910192915050565b600060208284031215610dbd57600080fd5b81518015158114610a8b57600080fdfea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.json +new file mode 100644 +index 0000000..5602be9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.json +@@ -0,0 +1,610 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "Boba_GasPriceOracle", ++ "sourceName": "contracts/L2/predeploys/Boba_GasPriceOracle.sol", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "SwapBOBAForETHMetaTransaction", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "TransferOwnership", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UpdateGasPriceOracleAddress", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMaxPriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMetaTransactionFee", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMinPriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdatePriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateReceivedETHAmount", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UseBobaAsFeeToken", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UseETHAsFeeToken", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "WithdrawBOBA", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "WithdrawETH", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_WITHDRAWAL_AMOUNT", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "bobaFeeTokenUsers", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "feeWallet", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "gasPriceOracleAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getBOBAForSwap", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_txData", ++ "type": "bytes" ++ } ++ ], ++ "name": "getL1BobaFee", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address payable", ++ "name": "_feeWallet", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l2BobaAddress", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2BobaAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "marketPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "metaTransactionFee", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "minPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "priceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "receivedETHAmount", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "tokenOwner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "swapBOBAForETHMetaTransaction", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_gasPriceOracleAddress", ++ "type": "address" ++ } ++ ], ++ "name": "updateGasPriceOracleAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_maxPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMaxPriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_metaTransactionFee", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMetaTransactionFee", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_minPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMinPriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_priceRatio", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_marketPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updatePriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_receivedETHAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateReceivedETHAmount", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "useBobaAsFeeToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "useETHAsFeeToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "withdrawBOBA", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "withdrawETH", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "receive" ++ } ++ ], ++ "bytecode": "0x60806040526113886003556101f4600455600680546001600160a01b03191673420000000000000000000000000000000000000f1790556729a2241af62c00006008556611c37937e0800060095534801561005957600080fd5b50611da5806100696000396000f3fe6080604052600436106101af5760003560e01c806389df963d116100ec578063d2e1fb221161008a578063e086e5ec11610064578063e086e5ec1461047b578063e3aea9ba14610490578063f25f4b56146104b0578063f2fde38b146104d057600080fd5b8063d2e1fb2214610432578063d3e5792b14610448578063d86732ef1461046557600080fd5b8063b54016dc116100c6578063b54016dc146103bc578063bc9bd6ee146103dc578063c8a05413146103fc578063cd0514ad1461041c57600080fd5b806389df963d146103695780638da5cb5b1461037e5780638fcfc8131461039c57600080fd5b806334fe1b16116101595780635b9da5c6116101335780635b9da5c6146102d35780636805491b146102f35780637728195c14610333578063872ea4991461035357600080fd5b806334fe1b1614610289578063438ac96c1461029e578063485cc955146102b357600080fd5b80631b6771991161018a5780631b6771991461021c57806323ec63201461023157806324b20eda1461025157600080fd5b80625c5fb2146101bb5780630aa2f420146101dd57806315a0c1ac1461020657600080fd5b366101b657005b600080fd5b3480156101c757600080fd5b506101db6101d63660046119d8565b6104f0565b005b3480156101e957600080fd5b506101f360055481565b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f3600a5481565b34801561022857600080fd5b506101db6105c7565b34801561023d57600080fd5b506101f361024c366004611a20565b6106da565b34801561025d57600080fd5b50600254610271906001600160a01b031681565b6040516001600160a01b0390911681526020016101fd565b34801561029557600080fd5b506101db61078b565b3480156102aa57600080fd5b506101f361092d565b3480156102bf57600080fd5b506101db6102ce366004611b07565b610957565b3480156102df57600080fd5b506101db6102ee3660046119d8565b610a70565b3480156102ff57600080fd5b5061032361030e366004611b40565b60076020526000908152604090205460ff1681565b60405190151581526020016101fd565b34801561033f57600080fd5b50600654610271906001600160a01b031681565b34801561035f57600080fd5b506101f360085481565b34801561037557600080fd5b506101db610b27565b34801561038a57600080fd5b506000546001600160a01b0316610271565b3480156103a857600080fd5b506101db6103b7366004611b40565b610dd0565b3480156103c857600080fd5b506101db6103d7366004611b5d565b610f12565b3480156103e857600080fd5b506101db6103f7366004611bd4565b6111d4565b34801561040857600080fd5b506101db6104173660046119d8565b6112d2565b34801561042857600080fd5b506101f360095481565b34801561043e57600080fd5b506101f360045481565b34801561045457600080fd5b506101f3680821ab0d441498000081565b34801561047157600080fd5b506101f360035481565b34801561048757600080fd5b506101db61137f565b34801561049c57600080fd5b506101db6104ab3660046119d8565b6114d2565b3480156104bc57600080fd5b50600154610271906001600160a01b031681565b3480156104dc57600080fd5b506101db6104eb366004611b40565b611571565b6000546001600160a01b0316331461054f5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105615750600081115b61056a57600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96105a26000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b333b156106165760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b66071afd498d00003331101561066e5760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74204554482062616c616e636500000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f764389830e6a6b84f4ea3f2551a4c5afbb6dff806f2d8f571f6913c6c4b62a4091015b60405180910390a1565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081526000926001600160a01b0316919082906349948e0e9061072a908790600401611c6c565b60206040518083038186803b15801561074257600080fd5b505afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190611c7f565b6107849190611cc7565b9392505050565b333b156107da5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526729a2241af62c0000916001600160a01b0316906370a082319060240160206040518083038186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190611c7f565b10156108c45760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420426f62612062616c616e6365000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fd1787ba09c5383b33cf88983fbbf2e6ae348746a3a906e1a1bb67c729661a4ac91016106d0565b600061095260085461094c600a546009546116b990919063ffffffff16565b906116c5565b905090565b6001546001600160a01b0316156109b05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a65640000006044820152606401610546565b6001600160a01b038216158015906109d057506001600160a01b03811615155b6109d957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331790556006805490911673420000000000000000000000000000000000000f1790556729a2241af62c00006008556113886003556107d060058190556101f4600455600a55565b6000546001600160a01b03163314610aca5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b66038d7ea4c6800081118015610ae65750662386f26fc1000081105b610aef57600080fd5b60098190557fdcb9e069a0d16a974c9c0f4a88e2c9b79df5c45d9721c26461043d51c44682076105a26000546001600160a01b031690565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152680821ab0d4414980000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b8c57600080fd5b505afa158015610ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc49190611c7f565b1015610c5e5760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a401610546565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b158015610cde57600080fd5b505afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611c7f565b6000604051806020016040528060008152506040518663ffffffff1660e01b8152600401610d48959493929190611d04565b600060405180830381600087803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b505050507f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b7753610dad6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016106d0565b6000546001600160a01b03163314610e2a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b803b610e785760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f410000000000000000000000000000000000006044820152606401610546565b6001600160a01b038116610e8b57600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a7610ef36000546001600160a01b031690565b604080516001600160a01b0392831681529184166020830152016105bc565b863b15610f615760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6001600160a01b0386163014610fb95760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e7472616374000000006044820152606401610546565b6000610fd860085461094c600a546009546116b990919063ffffffff16565b90508086101561102a5760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f756768000000000000000000000000006044820152606401610546565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c4820185905290911690819063d505accf9060e401600060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50506002546110ea92506001600160a01b031690508a30856116d1565b6009546040516000916001600160a01b038c16918381818185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b505090508061118c5760405162461bcd60e51b815260206004820152601260248201527f4661696c656420746f2073656e642045544800000000000000000000000000006044820152606401610546565b6040516001600160a01b038b1681527fb92b4b358dfa6e521f7f80a5d0522cf04a2082482701a0d78ff2bb615df646be9060200160405180910390a150505050505050505050565b6000546001600160a01b0316331461122e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600354821115801561124257506004548210155b61124b57600080fd5b600354811115801561125f57506004548110155b61126857600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906112a56000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b0316331461132c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600454811015801561133e5750600081115b61134757600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416105a26000546001600160a01b031690565b6000546001600160a01b031633146113d95760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b505090508061147c5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f2073656e642045544820746f206665652077616c6c65746044820152606401610546565b7f6de63bb986f2779478e384365c03cc2e62f06b453856acca87d5a519ce0266496114af6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016105bc565b6000546001600160a01b0316331461152c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6000811161153957600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6105a26000546001600160a01b031690565b6000546001600160a01b031633146115cb5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001600160a01b0381166116475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610546565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c91016112c6565b60006107848284611cc7565b60006107848284611d42565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261175990859061175f565b50505050565b60006117b4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118499092919063ffffffff16565b80519091501561184457808060200190518101906117d29190611d5a565b6118445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610546565b505050565b60606118588484600085611860565b949350505050565b6060824710156118d85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610546565b843b6119265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610546565b600080866001600160a01b031685876040516119429190611d7c565b60006040518083038185875af1925050503d806000811461197f576040519150601f19603f3d011682016040523d82523d6000602084013e611984565b606091505b509150915061199482828661199f565b979650505050505050565b606083156119ae575081610784565b8251156119be5782518084602001fd5b8160405162461bcd60e51b81526004016105469190611c6c565b6000602082840312156119ea57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a3257600080fd5b813567ffffffffffffffff80821115611a4a57600080fd5b818401915084601f830112611a5e57600080fd5b813581811115611a7057611a706119f1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611ab657611ab66119f1565b81604052828152876020848701011115611acf57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611b0457600080fd5b50565b60008060408385031215611b1a57600080fd5b8235611b2581611aef565b91506020830135611b3581611aef565b809150509250929050565b600060208284031215611b5257600080fd5b813561078481611aef565b600080600080600080600060e0888a031215611b7857600080fd5b8735611b8381611aef565b96506020880135611b9381611aef565b95506040880135945060608801359350608088013560ff81168114611bb757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611be757600080fd5b50508035926020909101359150565b60005b83811015611c11578181015183820152602001611bf9565b838111156117595750506000910152565b60008151808452611c3a816020860160208601611bf6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107846020830184611c22565b600060208284031215611c9157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cff57611cff611c98565b500290565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a0608083015261199460a0830184611c22565b60008219821115611d5557611d55611c98565b500190565b600060208284031215611d6c57600080fd5b8151801515811461078457600080fd5b60008251611d8e818460208701611bf6565b919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106101af5760003560e01c806389df963d116100ec578063d2e1fb221161008a578063e086e5ec11610064578063e086e5ec1461047b578063e3aea9ba14610490578063f25f4b56146104b0578063f2fde38b146104d057600080fd5b8063d2e1fb2214610432578063d3e5792b14610448578063d86732ef1461046557600080fd5b8063b54016dc116100c6578063b54016dc146103bc578063bc9bd6ee146103dc578063c8a05413146103fc578063cd0514ad1461041c57600080fd5b806389df963d146103695780638da5cb5b1461037e5780638fcfc8131461039c57600080fd5b806334fe1b16116101595780635b9da5c6116101335780635b9da5c6146102d35780636805491b146102f35780637728195c14610333578063872ea4991461035357600080fd5b806334fe1b1614610289578063438ac96c1461029e578063485cc955146102b357600080fd5b80631b6771991161018a5780631b6771991461021c57806323ec63201461023157806324b20eda1461025157600080fd5b80625c5fb2146101bb5780630aa2f420146101dd57806315a0c1ac1461020657600080fd5b366101b657005b600080fd5b3480156101c757600080fd5b506101db6101d63660046119d8565b6104f0565b005b3480156101e957600080fd5b506101f360055481565b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f3600a5481565b34801561022857600080fd5b506101db6105c7565b34801561023d57600080fd5b506101f361024c366004611a20565b6106da565b34801561025d57600080fd5b50600254610271906001600160a01b031681565b6040516001600160a01b0390911681526020016101fd565b34801561029557600080fd5b506101db61078b565b3480156102aa57600080fd5b506101f361092d565b3480156102bf57600080fd5b506101db6102ce366004611b07565b610957565b3480156102df57600080fd5b506101db6102ee3660046119d8565b610a70565b3480156102ff57600080fd5b5061032361030e366004611b40565b60076020526000908152604090205460ff1681565b60405190151581526020016101fd565b34801561033f57600080fd5b50600654610271906001600160a01b031681565b34801561035f57600080fd5b506101f360085481565b34801561037557600080fd5b506101db610b27565b34801561038a57600080fd5b506000546001600160a01b0316610271565b3480156103a857600080fd5b506101db6103b7366004611b40565b610dd0565b3480156103c857600080fd5b506101db6103d7366004611b5d565b610f12565b3480156103e857600080fd5b506101db6103f7366004611bd4565b6111d4565b34801561040857600080fd5b506101db6104173660046119d8565b6112d2565b34801561042857600080fd5b506101f360095481565b34801561043e57600080fd5b506101f360045481565b34801561045457600080fd5b506101f3680821ab0d441498000081565b34801561047157600080fd5b506101f360035481565b34801561048757600080fd5b506101db61137f565b34801561049c57600080fd5b506101db6104ab3660046119d8565b6114d2565b3480156104bc57600080fd5b50600154610271906001600160a01b031681565b3480156104dc57600080fd5b506101db6104eb366004611b40565b611571565b6000546001600160a01b0316331461054f5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105615750600081115b61056a57600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96105a26000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b333b156106165760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b66071afd498d00003331101561066e5760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74204554482062616c616e636500000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f764389830e6a6b84f4ea3f2551a4c5afbb6dff806f2d8f571f6913c6c4b62a4091015b60405180910390a1565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081526000926001600160a01b0316919082906349948e0e9061072a908790600401611c6c565b60206040518083038186803b15801561074257600080fd5b505afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190611c7f565b6107849190611cc7565b9392505050565b333b156107da5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526729a2241af62c0000916001600160a01b0316906370a082319060240160206040518083038186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190611c7f565b10156108c45760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420426f62612062616c616e6365000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fd1787ba09c5383b33cf88983fbbf2e6ae348746a3a906e1a1bb67c729661a4ac91016106d0565b600061095260085461094c600a546009546116b990919063ffffffff16565b906116c5565b905090565b6001546001600160a01b0316156109b05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a65640000006044820152606401610546565b6001600160a01b038216158015906109d057506001600160a01b03811615155b6109d957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331790556006805490911673420000000000000000000000000000000000000f1790556729a2241af62c00006008556113886003556107d060058190556101f4600455600a55565b6000546001600160a01b03163314610aca5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b66038d7ea4c6800081118015610ae65750662386f26fc1000081105b610aef57600080fd5b60098190557fdcb9e069a0d16a974c9c0f4a88e2c9b79df5c45d9721c26461043d51c44682076105a26000546001600160a01b031690565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152680821ab0d4414980000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b8c57600080fd5b505afa158015610ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc49190611c7f565b1015610c5e5760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a401610546565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b158015610cde57600080fd5b505afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611c7f565b6000604051806020016040528060008152506040518663ffffffff1660e01b8152600401610d48959493929190611d04565b600060405180830381600087803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b505050507f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b7753610dad6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016106d0565b6000546001600160a01b03163314610e2a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b803b610e785760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f410000000000000000000000000000000000006044820152606401610546565b6001600160a01b038116610e8b57600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a7610ef36000546001600160a01b031690565b604080516001600160a01b0392831681529184166020830152016105bc565b863b15610f615760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6001600160a01b0386163014610fb95760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e7472616374000000006044820152606401610546565b6000610fd860085461094c600a546009546116b990919063ffffffff16565b90508086101561102a5760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f756768000000000000000000000000006044820152606401610546565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c4820185905290911690819063d505accf9060e401600060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50506002546110ea92506001600160a01b031690508a30856116d1565b6009546040516000916001600160a01b038c16918381818185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b505090508061118c5760405162461bcd60e51b815260206004820152601260248201527f4661696c656420746f2073656e642045544800000000000000000000000000006044820152606401610546565b6040516001600160a01b038b1681527fb92b4b358dfa6e521f7f80a5d0522cf04a2082482701a0d78ff2bb615df646be9060200160405180910390a150505050505050505050565b6000546001600160a01b0316331461122e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600354821115801561124257506004548210155b61124b57600080fd5b600354811115801561125f57506004548110155b61126857600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906112a56000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b0316331461132c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600454811015801561133e5750600081115b61134757600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416105a26000546001600160a01b031690565b6000546001600160a01b031633146113d95760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b505090508061147c5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f2073656e642045544820746f206665652077616c6c65746044820152606401610546565b7f6de63bb986f2779478e384365c03cc2e62f06b453856acca87d5a519ce0266496114af6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016105bc565b6000546001600160a01b0316331461152c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6000811161153957600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6105a26000546001600160a01b031690565b6000546001600160a01b031633146115cb5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001600160a01b0381166116475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610546565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c91016112c6565b60006107848284611cc7565b60006107848284611d42565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261175990859061175f565b50505050565b60006117b4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118499092919063ffffffff16565b80519091501561184457808060200190518101906117d29190611d5a565b6118445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610546565b505050565b60606118588484600085611860565b949350505050565b6060824710156118d85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610546565b843b6119265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610546565b600080866001600160a01b031685876040516119429190611d7c565b60006040518083038185875af1925050503d806000811461197f576040519150601f19603f3d011682016040523d82523d6000602084013e611984565b606091505b509150915061199482828661199f565b979650505050505050565b606083156119ae575081610784565b8251156119be5782518084602001fd5b8160405162461bcd60e51b81526004016105469190611c6c565b6000602082840312156119ea57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a3257600080fd5b813567ffffffffffffffff80821115611a4a57600080fd5b818401915084601f830112611a5e57600080fd5b813581811115611a7057611a706119f1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611ab657611ab66119f1565b81604052828152876020848701011115611acf57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611b0457600080fd5b50565b60008060408385031215611b1a57600080fd5b8235611b2581611aef565b91506020830135611b3581611aef565b809150509250929050565b600060208284031215611b5257600080fd5b813561078481611aef565b600080600080600080600060e0888a031215611b7857600080fd5b8735611b8381611aef565b96506020880135611b9381611aef565b95506040880135945060608801359350608088013560ff81168114611bb757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611be757600080fd5b50508035926020909101359150565b60005b83811015611c11578181015183820152602001611bf9565b838111156117595750506000910152565b60008151808452611c3a816020860160208601611bf6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107846020830184611c22565b600060208284031215611c9157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cff57611cff611c98565b500290565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a0608083015261199460a0830184611c22565b60008219821115611d5557611d55611c98565b500190565b600060208284031215611d6c57600080fd5b8151801515811461078457600080fd5b60008251611d8e818460208701611bf6565b919091019291505056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.json +new file mode 100644 +index 0000000..1c2acc9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.json +@@ -0,0 +1,700 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "Boba_GasPriceOracleAltL1", ++ "sourceName": "contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "SwapSecondaryFeeTokenForBOBAMetaTransaction", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "TransferOwnership", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateDecimals", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UpdateGasPriceOracleAddress", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMaxPriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMetaTransactionFee", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateMinPriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdatePriceRatio", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateReceivedBOBAAmount", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "name": "UpdateSecondaryFeeTokenMinimum", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UseBOBAAsFeeToken", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "UseSecondaryFeeTokenAsFeeToken", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "WithdrawBOBA", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "WithdrawSecondaryFeeToken", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_WITHDRAWAL_AMOUNT", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "feeWallet", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "gasPriceOracleAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_txData", ++ "type": "bytes" ++ } ++ ], ++ "name": "getSecondaryFeeTokenFee", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getSecondaryFeeTokenForSwap", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address payable", ++ "name": "_feeWallet", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_secondaryFeeToken", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "marketPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "metaTransactionFee", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "minPriceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "priceRatio", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "receivedBOBAAmount", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "secondaryFeeTokenAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "secondaryFeeTokenMinimum", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "name": "secondaryFeeTokenUsers", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "tokenOwner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "swapSecondaryFeeTokenForBOBAMetaTransaction", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_decimals", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateDecimals", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_gasPriceOracleAddress", ++ "type": "address" ++ } ++ ], ++ "name": "updateGasPriceOracleAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_maxPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMaxPriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_metaTransactionFee", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMetaTransactionFee", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_minPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateMinPriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_priceRatio", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_marketPriceRatio", ++ "type": "uint256" ++ } ++ ], ++ "name": "updatePriceRatio", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_receivedBOBAAmount", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateReceivedBOBAAmount", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_secondaryFeeTokenMinimum", ++ "type": "uint256" ++ } ++ ], ++ "name": "updateSecondaryFeeTokenMinimum", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "useBobaAsFeeToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "useSecondaryFeeTokenAsFeeToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "withdrawBOBA", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "withdrawSecondaryFeeToken", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "receive" ++ } ++ ], ++ "bytecode": "0x6080604052600280546001600160a01b0319908116734200000000000000000000000000000000000023179091556113886003556101f46004556006805490911673420000000000000000000000000000000000000f17905566038d7ea4c68000600855671bc16d674ec800006009556000600b5566071afd498d0000600c5534801561008b57600080fd5b506121ab8061009b6000396000f3fe6080604052600436106101db5760003560e01c8063872ea49911610102578063ce2e836211610095578063e27cde4b11610064578063e27cde4b14610512578063e3aea9ba14610527578063f25f4b5614610547578063f2fde38b1461056757600080fd5b8063ce2e8362146104aa578063d2e1fb22146104ca578063d3e5792b146104e0578063d86732ef146104fc57600080fd5b8063b9fee16d116100d1578063b9fee16d1461043e578063bc9bd6ee14610454578063c823cb4014610474578063c8a054131461048a57600080fd5b8063872ea499146103d557806389df963d146103eb5780638da5cb5b146104005780638fcfc8131461041e57600080fd5b806315a0c1ac1161017a57806341f7a5e31161014957806341f7a5e314610360578063485cc9551461037557806366675c57146103955780637728195c146103b557600080fd5b806315a0c1ac146102ff578063313ce5671461031557806334fe1b161461032b5780633cb8dd881461034057600080fd5b806306f95c19116101b657806306f95c191461023e5780630aa2f420146102715780630f0ad02e1461028757806312ac9250146102bf57600080fd5b80625c5fb2146101e7578063026da5de1461020957806303bb2b2d1461022957600080fd5b366101e257005b600080fd5b3480156101f357600080fd5b50610207610202366004611c77565b610587565b005b34801561021557600080fd5b50610207610224366004611c77565b61065e565b34801561023557600080fd5b50610207610716565b34801561024a57600080fd5b5061025e610259366004611cbf565b6108df565b6040519081526020015b60405180910390f35b34801561027d57600080fd5b5061025e60055481565b34801561029357600080fd5b506002546102a7906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b3480156102cb57600080fd5b506102ef6102da366004611da6565b60076020526000908152604090205460ff1681565b6040519015158152602001610268565b34801561030b57600080fd5b5061025e600a5481565b34801561032157600080fd5b5061025e600b5481565b34801561033757600080fd5b506102076109b1565b34801561034c57600080fd5b5061020761035b366004611dc3565b610abf565b34801561036c57600080fd5b5061025e610d9c565b34801561038157600080fd5b50610207610390366004611e3a565b610dd7565b3480156103a157600080fd5b506102076103b0366004611c77565b610efe565b3480156103c157600080fd5b506006546102a7906001600160a01b031681565b3480156103e157600080fd5b5061025e60085481565b3480156103f757600080fd5b50610207610f9d565b34801561040c57600080fd5b506000546001600160a01b03166102a7565b34801561042a57600080fd5b50610207610439366004611da6565b611116565b34801561044a57600080fd5b5061025e60095481565b34801561046057600080fd5b5061020761046f366004611e73565b611258565b34801561048057600080fd5b5061025e600c5481565b34801561049657600080fd5b506102076104a5366004611c77565b611356565b3480156104b657600080fd5b506102076104c5366004611c77565b611403565b3480156104d657600080fd5b5061025e60045481565b3480156104ec57600080fd5b5061025e678ac7230489e8000081565b34801561050857600080fd5b5061025e60035481565b34801561051e57600080fd5b506102076114b2565b34801561053357600080fd5b50610207610542366004611c77565b61175a565b34801561055357600080fd5b506001546102a7906001600160a01b031681565b34801561057357600080fd5b50610207610582366004611da6565b6117f9565b6000546001600160a01b031633146105e65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105f85750600081115b61060157600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96106396000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b6000546001600160a01b031633146106b85760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66038d7ea4c68000811180156106d55750678ac7230489e8000081105b6106de57600080fd5b60098190557f674efbecdf5f1400e276cb9c3d4459ef8a01fdc0da877cb4de7e557fe18de5bc6106396000546001600160a01b031690565b333b156107655760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b600c546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc9190611e95565b10156108705760405162461bcd60e51b815260206004820152602860248201527f496e73756666696369656e74207365636f6e646172792066656520746f6b656e60448201527f2062616c616e636500000000000000000000000000000000000000000000000060648201526084016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f2a4701af66936e0043ee5cf6e1e981ae08e42c53540fe3adf9cb669ec459924291015b60405180910390a1565b600080600b54600a6108f19190611ffd565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081529293506001600160a01b03909116916109a99184916109a3919085906349948e0e9061094d908b9060040161207f565b60206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d9190611e95565b90611941565b90611956565b949350505050565b333b15610a005760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6729a2241af62c000033311015610a595760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420424f42412062616c616e63650000000000000060448201526064016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527ffa73f4c7e93d6b458c033969eb1e1966b869463eef1491a1783a466941616e8f91016108d5565b863b15610b0e5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0386163014610b665760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e74726163740000000060448201526064016105dd565b6000600b54600a610b779190611ffd565b90506000610ba2600854610b9c846109a3600a5460095461194190919063ffffffff16565b90611962565b905080871015610bf45760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f7567680000000000000000000000000060448201526064016105dd565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a81166024830152604482018a90526064820189905260ff8816608483015260a4820187905260c4820186905290911690819063d505accf9060e401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50610cb1925050506001600160a01b0382168b308561196e565b6009546040516000916001600160a01b038d16918381818185875af1925050503d8060008114610cfd576040519150601f19603f3d011682016040523d82523d6000602084013e610d02565b606091505b5050905080610d535760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016105dd565b6040516001600160a01b038c1681527f67c28fca43faa12141a11f681414c2818babcb0da54289f470a5052fd4761ed39060200160405180910390a15050505050505050505050565b600080600b54600a610dae9190611ffd565b9050610dd1600854610b9c836109a3600a5460095461194190919063ffffffff16565b91505090565b6001546001600160a01b031615610e305760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016105dd565b6001600160a01b03821615801590610e5057506001600160a01b03811615155b610e5957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331781556006805490921673420000000000000000000000000000000000000f17909155660aa87bee5380006008556113886003556107d060058190556101f4600455600a55600b5566071afd498d0000600c55565b6000546001600160a01b03163314610f585760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600a8110610f6557600080fd5b600b8190557f3b46fc7b81af1d304c012e880b9a6881d29c7ba5b54beb1e744e55a0d1dd94236106396000546001600160a01b031690565b6000546001600160a01b03163314610ff75760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611044576040519150601f19603f3d011682016040523d82523d6000602084013e611049565b606091505b50509050806110c05760405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420424f424120746f206665652077616c6c6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016105dd565b7f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b77536110f36000546001600160a01b031690565b600154604080516001600160a01b03938416815292909116602083015201610653565b6000546001600160a01b031633146111705760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b803b6111be5760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f4100000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0381166111d157600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a76112396000546001600160a01b031690565b604080516001600160a01b039283168152918416602083015201610653565b6000546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60035482111580156112c657506004548210155b6112cf57600080fd5b60035481111580156112e357506004548110155b6112ec57600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906113296000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b031633146113b05760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60045481101580156113c25750600081115b6113cb57600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416106396000546001600160a01b031690565b6000546001600160a01b0316331461145d5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66071afd498d000081101561147157600080fd5b600c5460408051918252602082018390527f987a8898ebf1c256f04789c2023e41553af453a60f527bb6166b79b798563433910160405180910390a1600c55565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152678ac7230489e80000916001600160a01b0316906370a082319060240160206040518083038186803b15801561151657600080fd5b505afa15801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611e95565b10156115e85760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a4016105dd565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b15801561166857600080fd5b505afa15801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190611e95565b6000604051806020016040528060008152506040518663ffffffff1660e01b81526004016116d2959493929190612092565b600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b505050507ff98e06ad52009fd71318a7e1139b93d3c2fdbb95c1d87cac61a71e47415b6cc36117376000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016108d5565b6000546001600160a01b031633146117b45760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600081116117c157600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6106396000546001600160a01b031690565b6000546001600160a01b031633146118535760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001600160a01b0381166118cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105dd565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910161134a565b600061194d82846120d0565b90505b92915050565b600061194d828461210d565b600061194d8284612148565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526119f69085906119fc565b50505050565b6000611a51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae69092919063ffffffff16565b805190915015611ae15780806020019051810190611a6f9190612160565b611ae15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105dd565b505050565b6060611af58484600085611aff565b90505b9392505050565b606082471015611b775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105dd565b843b611bc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105dd565b600080866001600160a01b03168587604051611be19190612182565b60006040518083038185875af1925050503d8060008114611c1e576040519150601f19603f3d011682016040523d82523d6000602084013e611c23565b606091505b5091509150611c33828286611c3e565b979650505050505050565b60608315611c4d575081611af8565b825115611c5d5782518084602001fd5b8160405162461bcd60e51b81526004016105dd919061207f565b600060208284031215611c8957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611cd157600080fd5b813567ffffffffffffffff80821115611ce957600080fd5b818401915084601f830112611cfd57600080fd5b813581811115611d0f57611d0f611c90565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d5557611d55611c90565b81604052828152876020848701011115611d6e57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611da357600080fd5b50565b600060208284031215611db857600080fd5b8135611af881611d8e565b600080600080600080600060e0888a031215611dde57600080fd5b8735611de981611d8e565b96506020880135611df981611d8e565b95506040880135945060608801359350608088013560ff81168114611e1d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611e4d57600080fd5b8235611e5881611d8e565b91506020830135611e6881611d8e565b809150509250929050565b60008060408385031215611e8657600080fd5b50508035926020909101359150565b600060208284031215611ea757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115611f3657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f1c57611f1c611eae565b80851615611f2957918102915b93841c9390800290611ee2565b509250929050565b600082611f4d57506001611950565b81611f5a57506000611950565b8160018114611f705760028114611f7a57611f96565b6001915050611950565b60ff841115611f8b57611f8b611eae565b50506001821b611950565b5060208310610133831016604e8410600b8410161715611fb9575081810a611950565b611fc38383611edd565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ff557611ff5611eae565b029392505050565b600061194d8383611f3e565b60005b8381101561202457818101518382015260200161200c565b838111156119f65750506000910152565b6000815180845261204d816020860160208601612009565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061194d6020830184612035565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a06080830152611c3360a0830184612035565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210857612108611eae565b500290565b600082612143577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561215b5761215b611eae565b500190565b60006020828403121561217257600080fd5b81518015158114611af857600080fd5b60008251612194818460208701612009565b919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106101db5760003560e01c8063872ea49911610102578063ce2e836211610095578063e27cde4b11610064578063e27cde4b14610512578063e3aea9ba14610527578063f25f4b5614610547578063f2fde38b1461056757600080fd5b8063ce2e8362146104aa578063d2e1fb22146104ca578063d3e5792b146104e0578063d86732ef146104fc57600080fd5b8063b9fee16d116100d1578063b9fee16d1461043e578063bc9bd6ee14610454578063c823cb4014610474578063c8a054131461048a57600080fd5b8063872ea499146103d557806389df963d146103eb5780638da5cb5b146104005780638fcfc8131461041e57600080fd5b806315a0c1ac1161017a57806341f7a5e31161014957806341f7a5e314610360578063485cc9551461037557806366675c57146103955780637728195c146103b557600080fd5b806315a0c1ac146102ff578063313ce5671461031557806334fe1b161461032b5780633cb8dd881461034057600080fd5b806306f95c19116101b657806306f95c191461023e5780630aa2f420146102715780630f0ad02e1461028757806312ac9250146102bf57600080fd5b80625c5fb2146101e7578063026da5de1461020957806303bb2b2d1461022957600080fd5b366101e257005b600080fd5b3480156101f357600080fd5b50610207610202366004611c77565b610587565b005b34801561021557600080fd5b50610207610224366004611c77565b61065e565b34801561023557600080fd5b50610207610716565b34801561024a57600080fd5b5061025e610259366004611cbf565b6108df565b6040519081526020015b60405180910390f35b34801561027d57600080fd5b5061025e60055481565b34801561029357600080fd5b506002546102a7906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b3480156102cb57600080fd5b506102ef6102da366004611da6565b60076020526000908152604090205460ff1681565b6040519015158152602001610268565b34801561030b57600080fd5b5061025e600a5481565b34801561032157600080fd5b5061025e600b5481565b34801561033757600080fd5b506102076109b1565b34801561034c57600080fd5b5061020761035b366004611dc3565b610abf565b34801561036c57600080fd5b5061025e610d9c565b34801561038157600080fd5b50610207610390366004611e3a565b610dd7565b3480156103a157600080fd5b506102076103b0366004611c77565b610efe565b3480156103c157600080fd5b506006546102a7906001600160a01b031681565b3480156103e157600080fd5b5061025e60085481565b3480156103f757600080fd5b50610207610f9d565b34801561040c57600080fd5b506000546001600160a01b03166102a7565b34801561042a57600080fd5b50610207610439366004611da6565b611116565b34801561044a57600080fd5b5061025e60095481565b34801561046057600080fd5b5061020761046f366004611e73565b611258565b34801561048057600080fd5b5061025e600c5481565b34801561049657600080fd5b506102076104a5366004611c77565b611356565b3480156104b657600080fd5b506102076104c5366004611c77565b611403565b3480156104d657600080fd5b5061025e60045481565b3480156104ec57600080fd5b5061025e678ac7230489e8000081565b34801561050857600080fd5b5061025e60035481565b34801561051e57600080fd5b506102076114b2565b34801561053357600080fd5b50610207610542366004611c77565b61175a565b34801561055357600080fd5b506001546102a7906001600160a01b031681565b34801561057357600080fd5b50610207610582366004611da6565b6117f9565b6000546001600160a01b031633146105e65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105f85750600081115b61060157600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96106396000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b6000546001600160a01b031633146106b85760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66038d7ea4c68000811180156106d55750678ac7230489e8000081105b6106de57600080fd5b60098190557f674efbecdf5f1400e276cb9c3d4459ef8a01fdc0da877cb4de7e557fe18de5bc6106396000546001600160a01b031690565b333b156107655760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b600c546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc9190611e95565b10156108705760405162461bcd60e51b815260206004820152602860248201527f496e73756666696369656e74207365636f6e646172792066656520746f6b656e60448201527f2062616c616e636500000000000000000000000000000000000000000000000060648201526084016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f2a4701af66936e0043ee5cf6e1e981ae08e42c53540fe3adf9cb669ec459924291015b60405180910390a1565b600080600b54600a6108f19190611ffd565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081529293506001600160a01b03909116916109a99184916109a3919085906349948e0e9061094d908b9060040161207f565b60206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d9190611e95565b90611941565b90611956565b949350505050565b333b15610a005760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6729a2241af62c000033311015610a595760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420424f42412062616c616e63650000000000000060448201526064016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527ffa73f4c7e93d6b458c033969eb1e1966b869463eef1491a1783a466941616e8f91016108d5565b863b15610b0e5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0386163014610b665760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e74726163740000000060448201526064016105dd565b6000600b54600a610b779190611ffd565b90506000610ba2600854610b9c846109a3600a5460095461194190919063ffffffff16565b90611962565b905080871015610bf45760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f7567680000000000000000000000000060448201526064016105dd565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a81166024830152604482018a90526064820189905260ff8816608483015260a4820187905260c4820186905290911690819063d505accf9060e401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50610cb1925050506001600160a01b0382168b308561196e565b6009546040516000916001600160a01b038d16918381818185875af1925050503d8060008114610cfd576040519150601f19603f3d011682016040523d82523d6000602084013e610d02565b606091505b5050905080610d535760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016105dd565b6040516001600160a01b038c1681527f67c28fca43faa12141a11f681414c2818babcb0da54289f470a5052fd4761ed39060200160405180910390a15050505050505050505050565b600080600b54600a610dae9190611ffd565b9050610dd1600854610b9c836109a3600a5460095461194190919063ffffffff16565b91505090565b6001546001600160a01b031615610e305760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016105dd565b6001600160a01b03821615801590610e5057506001600160a01b03811615155b610e5957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331781556006805490921673420000000000000000000000000000000000000f17909155660aa87bee5380006008556113886003556107d060058190556101f4600455600a55600b5566071afd498d0000600c55565b6000546001600160a01b03163314610f585760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600a8110610f6557600080fd5b600b8190557f3b46fc7b81af1d304c012e880b9a6881d29c7ba5b54beb1e744e55a0d1dd94236106396000546001600160a01b031690565b6000546001600160a01b03163314610ff75760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611044576040519150601f19603f3d011682016040523d82523d6000602084013e611049565b606091505b50509050806110c05760405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420424f424120746f206665652077616c6c6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016105dd565b7f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b77536110f36000546001600160a01b031690565b600154604080516001600160a01b03938416815292909116602083015201610653565b6000546001600160a01b031633146111705760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b803b6111be5760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f4100000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0381166111d157600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a76112396000546001600160a01b031690565b604080516001600160a01b039283168152918416602083015201610653565b6000546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60035482111580156112c657506004548210155b6112cf57600080fd5b60035481111580156112e357506004548110155b6112ec57600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906113296000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b031633146113b05760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60045481101580156113c25750600081115b6113cb57600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416106396000546001600160a01b031690565b6000546001600160a01b0316331461145d5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66071afd498d000081101561147157600080fd5b600c5460408051918252602082018390527f987a8898ebf1c256f04789c2023e41553af453a60f527bb6166b79b798563433910160405180910390a1600c55565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152678ac7230489e80000916001600160a01b0316906370a082319060240160206040518083038186803b15801561151657600080fd5b505afa15801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611e95565b10156115e85760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a4016105dd565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b15801561166857600080fd5b505afa15801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190611e95565b6000604051806020016040528060008152506040518663ffffffff1660e01b81526004016116d2959493929190612092565b600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b505050507ff98e06ad52009fd71318a7e1139b93d3c2fdbb95c1d87cac61a71e47415b6cc36117376000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016108d5565b6000546001600160a01b031633146117b45760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600081116117c157600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6106396000546001600160a01b031690565b6000546001600160a01b031633146118535760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001600160a01b0381166118cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105dd565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910161134a565b600061194d82846120d0565b90505b92915050565b600061194d828461210d565b600061194d8284612148565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526119f69085906119fc565b50505050565b6000611a51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae69092919063ffffffff16565b805190915015611ae15780806020019051810190611a6f9190612160565b611ae15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105dd565b505050565b6060611af58484600085611aff565b90505b9392505050565b606082471015611b775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105dd565b843b611bc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105dd565b600080866001600160a01b03168587604051611be19190612182565b60006040518083038185875af1925050503d8060008114611c1e576040519150601f19603f3d011682016040523d82523d6000602084013e611c23565b606091505b5091509150611c33828286611c3e565b979650505050505050565b60608315611c4d575081611af8565b825115611c5d5782518084602001fd5b8160405162461bcd60e51b81526004016105dd919061207f565b600060208284031215611c8957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611cd157600080fd5b813567ffffffffffffffff80821115611ce957600080fd5b818401915084601f830112611cfd57600080fd5b813581811115611d0f57611d0f611c90565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d5557611d55611c90565b81604052828152876020848701011115611d6e57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611da357600080fd5b50565b600060208284031215611db857600080fd5b8135611af881611d8e565b600080600080600080600060e0888a031215611dde57600080fd5b8735611de981611d8e565b96506020880135611df981611d8e565b95506040880135945060608801359350608088013560ff81168114611e1d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611e4d57600080fd5b8235611e5881611d8e565b91506020830135611e6881611d8e565b809150509250929050565b60008060408385031215611e8657600080fd5b50508035926020909101359150565b600060208284031215611ea757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115611f3657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f1c57611f1c611eae565b80851615611f2957918102915b93841c9390800290611ee2565b509250929050565b600082611f4d57506001611950565b81611f5a57506000611950565b8160018114611f705760028114611f7a57611f96565b6001915050611950565b60ff841115611f8b57611f8b611eae565b50506001821b611950565b5060208310610133831016604e8410600b8410161715611fb9575081810a611950565b611fc38383611edd565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ff557611ff5611eae565b029392505050565b600061194d8383611f3e565b60005b8381101561202457818101518382015260200161200c565b838111156119f65750506000910152565b6000815180845261204d816020860160208601612009565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061194d6020830184612035565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a06080830152611c3360a0830184612035565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210857612108611eae565b500290565b600082612143577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561215b5761215b611eae565b500190565b60006020828403121561217257600080fd5b81518015158114611af857600080fd5b60008251612194818460208701612009565b919091019291505056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.json +new file mode 100644 +index 0000000..29d881f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.json +@@ -0,0 +1,411 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L2_BOBA", ++ "sourceName": "contracts/L2/predeploys/L2_BOBA.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1TokenAddress", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Burn", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Mint", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l1Token", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2Bridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "mint", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes4", ++ "name": "_interfaceId", ++ "type": "bytes4" ++ } ++ ], ++ "name": "supportsInterface", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "pure", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001119380380620011198339810160408190526200003491620001a7565b734200000000000000000000000000000000000010816040518060400160405280600c81526020016b424f4241204e6574776f726b60a01b81525060405180604001604052806004815260200163424f424160e01b815250601282828160039080519060200190620000a892919062000101565b508051620000be90600490602084019062000101565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff1660805250620002169050565b8280546200010f90620001d9565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600060208284031215620001ba57600080fd5b81516001600160a01b0381168114620001d257600080fd5b9392505050565b600181811c90821680620001ee57607f821691505b602082108114156200021057634e487b7160e01b600052602260045260246000fd5b50919050565b608051610ee76200023260003960006101810152610ee76000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4c325f424f42413a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4c325f424f42413a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c325f424f42413a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4c325f424f42413a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4c325f424f42413a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c325f424f42413a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.json +new file mode 100644 +index 0000000..c43edfd +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.json +@@ -0,0 +1,506 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L2_L1NativeToken", ++ "sourceName": "contracts/L2/predeploys/L2_L1NativeToken.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l2Bridge", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "string", ++ "name": "_symbol", ++ "type": "string" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "decimals_", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Burn", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Mint", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l1Token", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2Bridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "mint", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes4", ++ "name": "_interfaceId", ++ "type": "bytes4" ++ } ++ ], ++ "name": "supportsInterface", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "pure", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162001cd638038062001cd68339810160408190526200005a9162000314565b8280604051806040016040528060018152602001603160f81b815250858581600390805190602001906200009092919062000184565b508051620000a690600490602084019062000184565b5050825160208085019190912083518483012060c082815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301889052606082018790526080820194909452308184015281518082039093018352909301909252815191909401209193509190608052610100525050600680546001600160a01b039889166001600160a01b031990911617905550506007805460ff909316600160a01b026001600160a81b031990931696909516959095171790925550620003fd915050565b8280546200019290620003c0565b90600052602060002090601f016020900481019282620001b6576000855562000201565b82601f10620001d157805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000201578251825591602001919060010190620001e4565b506200020f92915062000213565b5090565b5b808211156200020f576000815560010162000214565b80516001600160a01b03811681146200024257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026f57600080fd5b81516001600160401b03808211156200028c576200028c62000247565b604051601f8301601f19908116603f01168101908282118183101715620002b757620002b762000247565b81604052838152602092508683858801011115620002d457600080fd5b600091505b83821015620002f85785820183015181830184015290820190620002d9565b838211156200030a5760008385830101525b9695505050505050565b600080600080600060a086880312156200032d57600080fd5b62000338866200022a565b945062000348602087016200022a565b60408701519094506001600160401b03808211156200036657600080fd5b6200037489838a016200025d565b945060608801519150808211156200038b57600080fd5b506200039a888289016200025d565b925050608086015160ff81168114620003b257600080fd5b809150509295509295909350565b600181811c90821680620003d557607f821691505b60208210811415620003f757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516118896200044d60003960006108dd01526000610e4f01526000610e9e01526000610e7901526000610dfd01526000610e2601526118896000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004611595565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115de565b6101696101a136600461167a565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116a4565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461167a565b6105bb565b61022961022436600461167a565b610604565b005b6101aa6102393660046116e0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116e0565b6106c9565b6101866106f6565b61022961028a36600461167a565b610705565b61016961029d36600461167a565b6107be565b6101696102b036600461167a565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b6102296103283660046116fb565b610889565b6101aa61033b36600461176e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117a1565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117a1565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff90869061181e565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610eec565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117a1565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610efa565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f00000000000000000000000000000000000000000000000000000000000000008888886109088c610f04565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f39565b9050600061098082878787610fa2565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d8590849061181e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610e4857507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b610ef68282610fca565b5050565b610ef682826110d0565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f46610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fb387878787611289565b91509150610fc0816113a1565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff821661102d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b806002600082825461103f919061181e565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061107990849061181e565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156111f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611231908490611836565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112c05750600090506003611398565b8460ff16601b141580156112d857508460ff16601c14155b156112e95750600090506004611398565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561133d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661139157600060019250925050611398565b9150600090505b94509492505050565b60008160048111156113b5576113b561184d565b14156113be5750565b60018160048111156113d2576113d261184d565b14156114205760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b60028160048111156114345761143461184d565b14156114825760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114965761149661184d565b141561150a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561151e5761151e61184d565b14156115925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115a757600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115d757600080fd5b9392505050565b600060208083528351808285015260005b8181101561160b578581018301518582016040015282016115ef565b8181111561161d576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461167557600080fd5b919050565b6000806040838503121561168d57600080fd5b61169683611651565b946020939093013593505050565b6000806000606084860312156116b957600080fd5b6116c284611651565b92506116d060208501611651565b9150604084013590509250925092565b6000602082840312156116f257600080fd5b6115d782611651565b600080600080600080600060e0888a03121561171657600080fd5b61171f88611651565b965061172d60208901611651565b95506040880135945060608801359350608088013560ff8116811461175157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561178157600080fd5b61178a83611651565b915061179860208401611651565b90509250929050565b600181811c908216806117b557607f821691505b60208210811415610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611831576118316117ef565b500190565b600082821015611848576118486117ef565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004611595565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115de565b6101696101a136600461167a565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116a4565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461167a565b6105bb565b61022961022436600461167a565b610604565b005b6101aa6102393660046116e0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116e0565b6106c9565b6101866106f6565b61022961028a36600461167a565b610705565b61016961029d36600461167a565b6107be565b6101696102b036600461167a565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b6102296103283660046116fb565b610889565b6101aa61033b36600461176e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117a1565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117a1565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff90869061181e565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610eec565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117a1565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610efa565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f00000000000000000000000000000000000000000000000000000000000000008888886109088c610f04565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f39565b9050600061098082878787610fa2565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d8590849061181e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610e4857507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b610ef68282610fca565b5050565b610ef682826110d0565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f46610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fb387878787611289565b91509150610fc0816113a1565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff821661102d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b806002600082825461103f919061181e565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061107990849061181e565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156111f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611231908490611836565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112c05750600090506003611398565b8460ff16601b141580156112d857508460ff16601c14155b156112e95750600090506004611398565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561133d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661139157600060019250925050611398565b9150600090505b94509492505050565b60008160048111156113b5576113b561184d565b14156113be5750565b60018160048111156113d2576113d261184d565b14156114205760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b60028160048111156114345761143461184d565b14156114825760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114965761149661184d565b141561150a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561151e5761151e61184d565b14156115925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115a757600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115d757600080fd5b9392505050565b600060208083528351808285015260005b8181101561160b578581018301518582016040015282016115ef565b8181111561161d576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461167557600080fd5b919050565b6000806040838503121561168d57600080fd5b61169683611651565b946020939093013593505050565b6000806000606084860312156116b957600080fd5b6116c284611651565b92506116d060208501611651565b9150604084013590509250925092565b6000602082840312156116f257600080fd5b6115d782611651565b600080600080600080600060e0888a03121561171657600080fd5b61171f88611651565b965061172d60208901611651565b95506040880135945060608801359350608088013560ff8116811461175157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561178157600080fd5b61178a83611651565b915061179860208401611651565b90509250929050565b600181811c908216806117b557607f821691505b60208210811415610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611831576118316117ef565b500190565b600082821015611848576118486117ef565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.dbg.json +index c9e5755..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/3d7340b236bcd0d643bc977bc59128de.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json +index ae41b2a..eec30db 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json +@@ -144,8 +144,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506106a8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80639b19251a116100505780639b19251a146100e9578063b1540a011461011c578063bdc7b54f1461012f57600080fd5b806308fd63221461007757806313af40351461008c5780638da5cb5b1461009f575b600080fd5b61008a610085366004610614565b610137565b005b61008a61009a366004610650565b610271565b6000546100bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61010c6100f7366004610650565b60016020526000908152604090205460ff1681565b60405190151581526020016100e0565b61010c61012a366004610650565b61047c565b61008a6104cd565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b73ffffffffffffffffffffffffffffffffffffffff81166103e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f4f564d5f4465706c6f79657257686974656c6973743a2063616e206f6e6c792060448201527f62652064697361626c65642076696120656e61626c654172626974726172794360648201527f6f6e74726163744465706c6f796d656e74000000000000000000000000000000608482015260a4016101da565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806104c7575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f57600080fd5b919050565b6000806040838503121561062757600080fd5b610630836105eb565b91506020830135801515811461064557600080fd5b809150509250929050565b60006020828403121561066257600080fd5b61066b826105eb565b939250505056fea264697066735822122045a02b3906eca00a51b37c2965ab13be381f71f60af681951849865fb2daa75f64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c80639b19251a116100505780639b19251a146100e9578063b1540a011461011c578063bdc7b54f1461012f57600080fd5b806308fd63221461007757806313af40351461008c5780638da5cb5b1461009f575b600080fd5b61008a610085366004610614565b610137565b005b61008a61009a366004610650565b610271565b6000546100bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61010c6100f7366004610650565b60016020526000908152604090205460ff1681565b60405190151581526020016100e0565b61010c61012a366004610650565b61047c565b61008a6104cd565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b73ffffffffffffffffffffffffffffffffffffffff81166103e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f4f564d5f4465706c6f79657257686974656c6973743a2063616e206f6e6c792060448201527f62652064697361626c65642076696120656e61626c654172626974726172794360648201527f6f6e74726163744465706c6f796d656e74000000000000000000000000000000608482015260a4016101da565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806104c7575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f57600080fd5b919050565b6000806040838503121561062757600080fd5b610630836105eb565b91506020830135801515811461064557600080fd5b809150509250929050565b60006020828403121561066257600080fd5b61066b826105eb565b939250505056fea264697066735822122045a02b3906eca00a51b37c2965ab13be381f71f60af681951849865fb2daa75f64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061067f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80639b19251a116100505780639b19251a146100e9578063b1540a011461011c578063bdc7b54f1461012f57600080fd5b806308fd63221461007757806313af40351461008c5780638da5cb5b1461009f575b600080fd5b61008a610085366004610614565b610137565b005b61008a61009a366004610650565b610271565b6000546100bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61010c6100f7366004610650565b60016020526000908152604090205460ff1681565b60405190151581526020016100e0565b61010c61012a366004610650565b61047c565b61008a6104cd565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b73ffffffffffffffffffffffffffffffffffffffff81166103e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f4f564d5f4465706c6f79657257686974656c6973743a2077686974656c69737460448201527f2063616e206f6e6c792062652064697361626c65642076696120656e61626c6560648201527f417262697472617279436f6e74726163744465706c6f796d656e740000000000608482015260a4016101da565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806104c7575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f57600080fd5b919050565b6000806040838503121561062757600080fd5b610630836105eb565b91506020830135801515811461064557600080fd5b809150509250929050565b60006020828403121561066257600080fd5b61066b826105eb565b939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c80639b19251a116100505780639b19251a146100e9578063b1540a011461011c578063bdc7b54f1461012f57600080fd5b806308fd63221461007757806313af40351461008c5780638da5cb5b1461009f575b600080fd5b61008a610085366004610614565b610137565b005b61008a61009a366004610650565b610271565b6000546100bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61010c6100f7366004610650565b60016020526000908152604090205460ff1681565b60405190151581526020016100e0565b61010c61012a366004610650565b61047c565b61008a6104cd565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b73ffffffffffffffffffffffffffffffffffffffff81166103e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f4f564d5f4465706c6f79657257686974656c6973743a2077686974656c69737460448201527f2063616e206f6e6c792062652064697361626c65642076696120656e61626c6560648201527f417262697472617279436f6e74726163744465706c6f796d656e740000000000608482015260a4016101da565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806104c7575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f57600080fd5b919050565b6000806040838503121561062757600080fd5b610630836105eb565b91506020830135801515811461064557600080fd5b809150509250929050565b60006020828403121561066257600080fd5b61066b826105eb565b939250505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json +index 05c7d07..c419008 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json +@@ -398,8 +398,8 @@ + "type": "function" + } + ], +- "bytecode": "0x60806040523480156200001157600080fd5b5073420000000000000000000000000000000000001060006040518060400160405280600581526020016422ba3432b960d91b8152506040518060400160405280600381526020016208aa8960eb1b815250818181600390805190602001906200007d929190620000cf565b50805162000093906004906020840190620000cf565b5050600580546001600160a01b039586166001600160a01b031991821617909155600680549690951695169490941790925550620001b2915050565b828054620000dd9062000175565b90600052602060002090601f0160209004810192826200010157600085556200014c565b82601f106200011c57805160ff19168380011785556200014c565b828001600101855582156200014c579182015b828111156200014c5782518255916020019190600101906200012f565b506200015a9291506200015e565b5090565b5b808211156200015a57600081556001016200015f565b600181811c908216806200018a57607f821691505b60208210811415620001ac57634e487b7160e01b600052602260045260246000fd5b50919050565b610eee80620001c26000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c6d565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610cb6565b610118610150366004610d52565b610425565b6002545b604051908152602001610124565b610118610175366004610d7c565b6104db565b60405160128152602001610124565b610118610197366004610d52565b61058c565b6101af6101aa366004610d52565b61063d565b005b6101596101bf366004610db8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561071c565b6101af6101fd366004610d52565b61072b565b610118610210366004610d52565b6107fe565b610118610223366004610d52565b6108af565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610dd3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610e06565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610e06565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6106c88282610960565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161071091815260200190565b60405180910390a25050565b6060600480546103a290610e06565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6107b68282610a80565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161071091815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b73ffffffffffffffffffffffffffffffffffffffff82166109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d2565b80600260008282546109ef9190610e89565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a29908490610e89565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c15908490610ea1565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610c7f57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610caf57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ce357858101830151858201604001528201610cc7565b81811115610cf5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d4d57600080fd5b919050565b60008060408385031215610d6557600080fd5b610d6e83610d29565b946020939093013593505050565b600080600060608486031215610d9157600080fd5b610d9a84610d29565b9250610da860208501610d29565b9150604084013590509250925092565b600060208284031215610dca57600080fd5b610caf82610d29565b60008060408385031215610de657600080fd5b610def83610d29565b9150610dfd60208401610d29565b90509250929050565b600181811c90821680610e1a57607f821691505b60208210811415610e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610e9c57610e9c610e5a565b500190565b600082821015610eb357610eb3610e5a565b50039056fea2646970667358221220b71535a5111461b42945e5d842957b3a5926f7ed07d271872f6da21952b5f8b464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c6d565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610cb6565b610118610150366004610d52565b610425565b6002545b604051908152602001610124565b610118610175366004610d7c565b6104db565b60405160128152602001610124565b610118610197366004610d52565b61058c565b6101af6101aa366004610d52565b61063d565b005b6101596101bf366004610db8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561071c565b6101af6101fd366004610d52565b61072b565b610118610210366004610d52565b6107fe565b610118610223366004610d52565b6108af565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610dd3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610e06565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610e06565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6106c88282610960565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161071091815260200190565b60405180910390a25050565b6060600480546103a290610e06565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6107b68282610a80565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161071091815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b73ffffffffffffffffffffffffffffffffffffffff82166109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d2565b80600260008282546109ef9190610e89565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a29908490610e89565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c15908490610ea1565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610c7f57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610caf57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ce357858101830151858201604001528201610cc7565b81811115610cf5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d4d57600080fd5b919050565b60008060408385031215610d6557600080fd5b610d6e83610d29565b946020939093013593505050565b600080600060608486031215610d9157600080fd5b610d9a84610d29565b9250610da860208501610d29565b9150604084013590509250925092565b600060208284031215610dca57600080fd5b610caf82610d29565b60008060408385031215610de657600080fd5b610def83610d29565b9150610dfd60208401610d29565b90509250929050565b600181811c90821680610e1a57607f821691505b60208210811415610e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610e9c57610e9c610e5a565b500190565b600082821015610eb357610eb3610e5a565b50039056fea2646970667358221220b71535a5111461b42945e5d842957b3a5926f7ed07d271872f6da21952b5f8b464736f6c63430008090033", ++ "bytecode": "0x60a06040523480156200001157600080fd5b5073420000000000000000000000000000000000001060006040518060400160405280600581526020016422ba3432b960d91b8152506040518060400160405280600381526020016208aa8960eb1b8152506012828281600390805190602001906200007f929190620000d6565b50805162000095906004906020840190620000d6565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff1660805250620001b9565b828054620000e4906200017c565b90600052602060002090601f01602090048101928262000108576000855562000153565b82601f106200012357805160ff191683800117855562000153565b8280016001018555821562000153579182015b828111156200015357825182559160200191906001019062000136565b506200016192915062000165565b5090565b5b8082111562000161576000815560010162000166565b600181811c908216806200019157607f821691505b60208210811415620001b357634e487b7160e01b600052602260045260246000fd5b50919050565b608051610ee7620001d560003960006101810152610ee76000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.json +index 2baff01..be1cf38 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.json +@@ -124,6 +124,25 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "getExtraL2Gas", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -300,8 +319,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50604051610e55380380610e5583398101604081905261002f91610167565b61003833610047565b61004181610097565b50610197565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146100f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811661015b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ed565b61016481610047565b50565b60006020828403121561017957600080fd5b81516001600160a01b038116811461019057600080fd5b9392505050565b610caf806101a66000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638c8885c811610097578063de26c4a111610066578063de26c4a1146101cc578063f2fde38b146101df578063f45e65d8146101f2578063fe173b97146101fb57600080fd5b80638c8885c81461016b5780638da5cb5b1461017e578063bede39b5146101a6578063bf1fe420146101b957600080fd5b806349948e0e116100d357806349948e0e14610134578063519b4bd3146101475780637046559714610150578063715018a61461016357600080fd5b80630c18c162146100fa578063313ce567146101165780633577afc51461011f575b600080fd5b61010360035481565b6040519081526020015b60405180910390f35b61010360055481565b61013261012d3660046108d0565b610204565b005b610103610142366004610918565b6102c6565b61010360025481565b61013261015e3660046108d0565b610322565b6101326103d8565b6101326101793660046108d0565b610465565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010d565b6101326101b43660046108d0565b61051b565b6101326101c73660046108d0565b6105d1565b6101036101da366004610918565b610687565b6101326101ed3660046109e7565b61072b565b61010360045481565b61010360015481565b60005473ffffffffffffffffffffffffffffffffffffffff16331461028a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b6000806102d283610687565b90506000600254826102e49190610a53565b90506000600554600a6102f79190610bb2565b90506000600454836103099190610a53565b905060006103178383610bbe565b979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff163314610459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b610463600061085b565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c1906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff16331461059c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60028190556040518181527f351fb23757bb5ea0546c85b7996ddd7155f96b939ebaa5ff7bc49c75f27f2c44906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff163314610652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60018190556040518181527ffcdccc6074c6c42e4bd578aa9870c697dc976a270968452d2b8c8dc369fae396906020016102bb565b600080805b8351811015610704578381815181106106a7576106a7610bf9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166106e4576106dd600483610c28565b91506106f2565b6106ef601083610c28565b91505b806106fc81610c40565b91505061068c565b506000600354826107159190610c28565b905061072381610440610c28565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b73ffffffffffffffffffffffffffffffffffffffff811661084f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610281565b6108588161085b565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156108e257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561092a57600080fd5b813567ffffffffffffffff8082111561094257600080fd5b818401915084601f83011261095657600080fd5b813581811115610968576109686108e9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109ae576109ae6108e9565b816040528281528760208487010111156109c757600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156109f957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610a1d57600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a8b57610a8b610a24565b500290565b600181815b80851115610ae957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610acf57610acf610a24565b80851615610adc57918102915b93841c9390800290610a95565b509250929050565b600082610b0057506001610bac565b81610b0d57506000610bac565b8160018114610b235760028114610b2d57610b49565b6001915050610bac565b60ff841115610b3e57610b3e610a24565b50506001821b610bac565b5060208310610133831016604e8410600b8410161715610b6c575081810a610bac565b610b768383610a90565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ba857610ba8610a24565b0290505b92915050565b6000610a1d8383610af1565b600082610bf4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c3b57610c3b610a24565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c7257610c72610a24565b506001019056fea2646970667358221220b949ef5f9defd6c0aab6259672d00d239cb8854c9972ba1866af1c6ec6433d4c64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638c8885c811610097578063de26c4a111610066578063de26c4a1146101cc578063f2fde38b146101df578063f45e65d8146101f2578063fe173b97146101fb57600080fd5b80638c8885c81461016b5780638da5cb5b1461017e578063bede39b5146101a6578063bf1fe420146101b957600080fd5b806349948e0e116100d357806349948e0e14610134578063519b4bd3146101475780637046559714610150578063715018a61461016357600080fd5b80630c18c162146100fa578063313ce567146101165780633577afc51461011f575b600080fd5b61010360035481565b6040519081526020015b60405180910390f35b61010360055481565b61013261012d3660046108d0565b610204565b005b610103610142366004610918565b6102c6565b61010360025481565b61013261015e3660046108d0565b610322565b6101326103d8565b6101326101793660046108d0565b610465565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010d565b6101326101b43660046108d0565b61051b565b6101326101c73660046108d0565b6105d1565b6101036101da366004610918565b610687565b6101326101ed3660046109e7565b61072b565b61010360045481565b61010360015481565b60005473ffffffffffffffffffffffffffffffffffffffff16331461028a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b6000806102d283610687565b90506000600254826102e49190610a53565b90506000600554600a6102f79190610bb2565b90506000600454836103099190610a53565b905060006103178383610bbe565b979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff163314610459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b610463600061085b565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c1906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff16331461059c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60028190556040518181527f351fb23757bb5ea0546c85b7996ddd7155f96b939ebaa5ff7bc49c75f27f2c44906020016102bb565b60005473ffffffffffffffffffffffffffffffffffffffff163314610652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b60018190556040518181527ffcdccc6074c6c42e4bd578aa9870c697dc976a270968452d2b8c8dc369fae396906020016102bb565b600080805b8351811015610704578381815181106106a7576106a7610bf9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166106e4576106dd600483610c28565b91506106f2565b6106ef601083610c28565b91505b806106fc81610c40565b91505061068c565b506000600354826107159190610c28565b905061072381610440610c28565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610281565b73ffffffffffffffffffffffffffffffffffffffff811661084f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610281565b6108588161085b565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156108e257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561092a57600080fd5b813567ffffffffffffffff8082111561094257600080fd5b818401915084601f83011261095657600080fd5b813581811115610968576109686108e9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109ae576109ae6108e9565b816040528281528760208487010111156109c757600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156109f957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610a1d57600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a8b57610a8b610a24565b500290565b600181815b80851115610ae957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610acf57610acf610a24565b80851615610adc57918102915b93841c9390800290610a95565b509250929050565b600082610b0057506001610bac565b81610b0d57506000610bac565b8160018114610b235760028114610b2d57610b49565b6001915050610bac565b60ff841115610b3e57610b3e610a24565b50506001821b610bac565b5060208310610133831016604e8410600b8410161715610b6c575081810a610bac565b610b768383610a90565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ba857610ba8610a24565b0290505b92915050565b6000610a1d8383610af1565b600082610bf4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c3b57610c3b610a24565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c7257610c72610a24565b506001019056fea2646970667358221220b949ef5f9defd6c0aab6259672d00d239cb8854c9972ba1866af1c6ec6433d4c64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610e66380380610e6683398101604081905261002f91610167565b61003833610047565b61004181610097565b50610197565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146100f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811661015b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ed565b61016481610047565b50565b60006020828403121561017957600080fd5b81516001600160a01b038116811461019057600080fd5b9392505050565b610cc0806101a66000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063f2fde38b11610066578063f2fde38b146101ea578063f45e65d8146101fd578063fb75474714610206578063fe173b971461021957600080fd5b80638da5cb5b14610189578063bede39b5146101b1578063bf1fe420146101c4578063de26c4a1146101d757600080fd5b8063519b4bd3116100d3578063519b4bd314610152578063704655971461015b578063715018a61461016e5780638c8885c81461017657600080fd5b80630c18c16214610105578063313ce567146101215780633577afc51461012a57806349948e0e1461013f575b600080fd5b61010e60035481565b6040519081526020015b60405180910390f35b61010e60055481565b61013d61013836600461090c565b610222565b005b61010e61014d366004610954565b6102e4565b61010e60025481565b61013d61016936600461090c565b610340565b61013d6103f6565b61013d61018436600461090c565b610483565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b61013d6101bf36600461090c565b610539565b61013d6101d236600461090c565b6105ef565b61010e6101e5366004610954565b6106a5565b61013d6101f8366004610a23565b610749565b61010e60045481565b61010e610214366004610954565b610879565b61010e60015481565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b6000806102f0836106a5565b90506000600254826103029190610a8f565b90506000600554600a6103159190610bec565b90506000600454836103279190610a8f565b905060006103358383610bf8565b979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b6104816000610897565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c1906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60028190556040518181527f351fb23757bb5ea0546c85b7996ddd7155f96b939ebaa5ff7bc49c75f27f2c44906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60018190556040518181527ffcdccc6074c6c42e4bd578aa9870c697dc976a270968452d2b8c8dc369fae396906020016102d9565b600080805b8351811015610722578381815181106106c5576106c5610c33565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016610702576106fb600483610c62565b9150610710565b61070d601083610c62565b91505b8061071a81610c7a565b9150506106aa565b506000600354826107339190610c62565b905061074181610440610c62565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b73ffffffffffffffffffffffffffffffffffffffff811661086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161029f565b61087681610897565b50565b6000600154610887836102e4565b6108919190610bf8565b92915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561091e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561096657600080fd5b813567ffffffffffffffff8082111561097e57600080fd5b818401915084601f83011261099257600080fd5b8135818111156109a4576109a4610925565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109ea576109ea610925565b81604052828152876020848701011115610a0357600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610a3557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610a5957600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610ac757610ac7610a60565b500290565b600181815b80851115610b2557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610b0b57610b0b610a60565b80851615610b1857918102915b93841c9390800290610ad1565b509250929050565b600082610b3c57506001610891565b81610b4957506000610891565b8160018114610b5f5760028114610b6957610b85565b6001915050610891565b60ff841115610b7a57610b7a610a60565b50506001821b610891565b5060208310610133831016604e8410600b8410161715610ba8575081810a610891565b610bb28383610acc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610be457610be4610a60565b029392505050565b6000610a598383610b2d565b600082610c2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c7557610c75610a60565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610cac57610cac610a60565b506001019056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063f2fde38b11610066578063f2fde38b146101ea578063f45e65d8146101fd578063fb75474714610206578063fe173b971461021957600080fd5b80638da5cb5b14610189578063bede39b5146101b1578063bf1fe420146101c4578063de26c4a1146101d757600080fd5b8063519b4bd3116100d3578063519b4bd314610152578063704655971461015b578063715018a61461016e5780638c8885c81461017657600080fd5b80630c18c16214610105578063313ce567146101215780633577afc51461012a57806349948e0e1461013f575b600080fd5b61010e60035481565b6040519081526020015b60405180910390f35b61010e60055481565b61013d61013836600461090c565b610222565b005b61010e61014d366004610954565b6102e4565b61010e60025481565b61013d61016936600461090c565b610340565b61013d6103f6565b61013d61018436600461090c565b610483565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b61013d6101bf36600461090c565b610539565b61013d6101d236600461090c565b6105ef565b61010e6101e5366004610954565b6106a5565b61013d6101f8366004610a23565b610749565b61010e60045481565b61010e610214366004610954565b610879565b61010e60015481565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b6000806102f0836106a5565b90506000600254826103029190610a8f565b90506000600554600a6103159190610bec565b90506000600454836103279190610a8f565b905060006103358383610bf8565b979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b6104816000610897565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c1906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60028190556040518181527f351fb23757bb5ea0546c85b7996ddd7155f96b939ebaa5ff7bc49c75f27f2c44906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60018190556040518181527ffcdccc6074c6c42e4bd578aa9870c697dc976a270968452d2b8c8dc369fae396906020016102d9565b600080805b8351811015610722578381815181106106c5576106c5610c33565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016610702576106fb600483610c62565b9150610710565b61070d601083610c62565b91505b8061071a81610c7a565b9150506106aa565b506000600354826107339190610c62565b905061074181610440610c62565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b73ffffffffffffffffffffffffffffffffffffffff811661086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161029f565b61087681610897565b50565b6000600154610887836102e4565b6108919190610bf8565b92915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561091e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561096657600080fd5b813567ffffffffffffffff8082111561097e57600080fd5b818401915084601f83011261099257600080fd5b8135818111156109a4576109a4610925565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109ea576109ea610925565b81604052828152876020848701011115610a0357600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610a3557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610a5957600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610ac757610ac7610a60565b500290565b600181815b80851115610b2557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610b0b57610b0b610a60565b80851615610b1857918102915b93841c9390800290610ad1565b509250929050565b600082610b3c57506001610891565b81610b4957506000610891565b8160018114610b5f5760028114610b6957610b85565b6001915050610891565b60ff841115610b7a57610b7a610a60565b50506001821b610891565b5060208310610133831016604e8410600b8410161715610ba8575081810a610891565b610bb28383610acc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610be457610be4610a60565b029392505050565b6000610a598383610b2d565b600082610c2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c7557610c75610a60565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610cac57610cac610a60565b506001019056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json +index bce391a..07ca9d0 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json +@@ -61,8 +61,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506102c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212209ffc0b44ce8a27c46cae74a3b3b620a72f10aaea97ed37c15b5d36792abd2aa464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212209ffc0b44ce8a27c46cae74a3b3b620a72f10aaea97ed37c15b5d36792abd2aa464736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061029f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.json +index 0f6b6f8..da7ca2e 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.json +@@ -52,8 +52,8 @@ + "type": "receive" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506040516103de3803806103de83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b61034b806100936000396000f3fe6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a79548936102309373deaddeaddeaddeaddeaddeaddeaddeaddead00009373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea2646970667358221220387a6116dde263ea48767352a397053c8cffa776aecb43cded2f25a4a9cfbdc264736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a79548936102309373deaddeaddeaddeaddeaddeaddeaddeaddead00009373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea2646970667358221220387a6116dde263ea48767352a397053c8cffa776aecb43cded2f25a4a9cfbdc264736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506040516103b53803806103b583398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610322806100936000396000f3fe6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.dbg.json +new file mode 100644 +index 0000000..230bbcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.json +new file mode 100644 +index 0000000..2dc434a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.json +@@ -0,0 +1,59 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "OVM_SequencerFeeVaultAltL1", ++ "sourceName": "contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l1FeeWallet", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_WITHDRAWAL_AMOUNT", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l1FeeWallet", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "withdraw", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "receive" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b506040516103b53803806103b583398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610322806100936000396000f3fe6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.dbg.json +index bf44f71..b86bd7f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/f806c97f26da2f31522cf092b3e836d3.json" ++ "buildInfo": "../../../../build-info/9c93080e9ec49f71611c61fdb6bf7549.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json +index 59e404a..785d196 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json +@@ -311,8 +311,8 @@ + "type": "function" + } + ], +- "bytecode": "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a7231582091c18790e0cca5011d2518024840ee00fecc67e11f56fd746f2cf84d5b583e0064736f6c63430005110032", +- "deployedBytecode": "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a7231582091c18790e0cca5011d2518024840ee00fecc67e11f56fd746f2cf84d5b583e0064736f6c63430005110032", ++ "bytecode": "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158208c8d5eb81396ab38071a6f1e1993fa1d9a8c68b0bb30b6fabe5951e251fc82ac64736f6c63430005110032", ++ "deployedBytecode": "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158208c8d5eb81396ab38071a6f1e1993fa1d9a8c68b0bb30b6fabe5951e251fc82ac64736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L1BlockNumber.sol/iOVM_L1BlockNumber.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L1BlockNumber.sol/iOVM_L1BlockNumber.dbg.json +index 269e294..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L1BlockNumber.sol/iOVM_L1BlockNumber.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L1BlockNumber.sol/iOVM_L1BlockNumber.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/bc381836b33ed91241eaf3142be07090.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol/iOVM_L2ToL1MessagePasser.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol/iOVM_L2ToL1MessagePasser.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol/iOVM_L2ToL1MessagePasser.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol/iOVM_L2ToL1MessagePasser.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.dbg.json +deleted file mode 100644 +index a931dfc..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.dbg.json ++++ /dev/null +@@ -1,4 +0,0 @@ +-{ +- "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.json +deleted file mode 100644 +index d367824..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.json ++++ /dev/null +@@ -1,187 +0,0 @@ +-{ +- "_format": "hh-sol-artifact-1", +- "contractName": "TeleportrDisburser", +- "sourceName": "contracts/L2/teleportr/TeleportrDisburser.sol", +- "abi": [ +- { +- "inputs": [], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "owner", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "balance", +- "type": "uint256" +- } +- ], +- "name": "BalanceWithdrawn", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "depositId", +- "type": "uint256" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "amount", +- "type": "uint256" +- } +- ], +- "name": "DisbursementFailed", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "depositId", +- "type": "uint256" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "amount", +- "type": "uint256" +- } +- ], +- "name": "DisbursementSuccess", +- "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" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_nextDepositId", +- "type": "uint256" +- }, +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "amount", +- "type": "uint256" +- }, +- { +- "internalType": "address", +- "name": "addr", +- "type": "address" +- } +- ], +- "internalType": "struct TeleportrDisburser.Disbursement[]", +- "name": "_disbursements", +- "type": "tuple[]" +- } +- ], +- "name": "disburse", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "owner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "renounceOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "totalDisbursements", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "newOwner", +- "type": "address" +- } +- ], +- "name": "transferOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "withdrawBalance", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "bytecode": "0x608060405234801561001057600080fd5b5061001a33610024565b6000600155610074565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109e1806100836000396000f3fe6080604052600436106100655760003560e01c80638da5cb5b116100435780638da5cb5b146100bf578063ad48144d146100f4578063f2fde38b1461010757600080fd5b806325999e7f1461006a5780635fd8c71014610093578063715018a6146100aa575b600080fd5b34801561007657600080fd5b5061008060015481565b6040519081526020015b60405180910390f35b34801561009f57600080fd5b506100a8610127565b005b3480156100b657600080fd5b506100a8610248565b3480156100cb57600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b6100a8610102366004610840565b6102d5565b34801561011357600080fd5b506100a86101223660046108bf565b61069b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000546040805147808252915173ffffffffffffffffffffffffffffffffffffffff9093169283917fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f1919081900360200190a260405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610243573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b6102d360006107cb565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b80806103be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f2064697362757273656d656e74730000000000000000000000000000000060448201526064016101a4565b60015484811461042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e6578706563746564206e657874206465706f73697420696400000000000060448201526064016101a4565b60018054830190556000805b8381101561047757858582818110610450576104506108fc565b610463926040909102013590508361095a565b91508061046f81610972565b915050610436565b50348114610507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44697362757273656d656e7420746f74616c20213d20616d6f756e742073656e60448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016101a4565b60005b83811015610692576000868683818110610526576105266108fc565b9050604002016000013590506000878784818110610546576105466108fc565b905060400201602001602081019061055e91906108bf565b905060008173ffffffffffffffffffffffffffffffffffffffff16836108fc90604051600060405180830381858888f193505050503d80600081146105bf576040519150601f19603f3d011682016040523d82523d6000602084013e6105c4565b606091505b505090508015610624578173ffffffffffffffffffffffffffffffffffffffff16867feaa22fd2d7b875476355b32cf719794faf9d91b66e73bc6375a053cace9caaee8560405161061791815260200190565b60405180910390a3610676565b8173ffffffffffffffffffffffffffffffffffffffff16867f9b478c095979d3d3a7d602ffd9ee1f0843204d853558ae0882c8fcc0a5bc78cf8560405161066d91815260200190565b60405180910390a35b600186019550505050808061068a90610972565b91505061050a565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b73ffffffffffffffffffffffffffffffffffffffff81166107bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101a4565b6107c8816107cb565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006040848603121561085557600080fd5b83359250602084013567ffffffffffffffff8082111561087457600080fd5b818601915086601f83011261088857600080fd5b81358181111561089757600080fd5b8760208260061b85010111156108ac57600080fd5b6020830194508093505050509250925092565b6000602082840312156108d157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146108f557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561096d5761096d61092b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156109a4576109a461092b565b506001019056fea26469706673582212209c98cb9cc04bc2bf5e8c0baf23ef87d045122afe6cfbb0e3c31bd854dd7fad7d64736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100655760003560e01c80638da5cb5b116100435780638da5cb5b146100bf578063ad48144d146100f4578063f2fde38b1461010757600080fd5b806325999e7f1461006a5780635fd8c71014610093578063715018a6146100aa575b600080fd5b34801561007657600080fd5b5061008060015481565b6040519081526020015b60405180910390f35b34801561009f57600080fd5b506100a8610127565b005b3480156100b657600080fd5b506100a8610248565b3480156100cb57600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b6100a8610102366004610840565b6102d5565b34801561011357600080fd5b506100a86101223660046108bf565b61069b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000546040805147808252915173ffffffffffffffffffffffffffffffffffffffff9093169283917fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f1919081900360200190a260405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610243573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b6102d360006107cb565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b80806103be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f2064697362757273656d656e74730000000000000000000000000000000060448201526064016101a4565b60015484811461042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e6578706563746564206e657874206465706f73697420696400000000000060448201526064016101a4565b60018054830190556000805b8381101561047757858582818110610450576104506108fc565b610463926040909102013590508361095a565b91508061046f81610972565b915050610436565b50348114610507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44697362757273656d656e7420746f74616c20213d20616d6f756e742073656e60448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016101a4565b60005b83811015610692576000868683818110610526576105266108fc565b9050604002016000013590506000878784818110610546576105466108fc565b905060400201602001602081019061055e91906108bf565b905060008173ffffffffffffffffffffffffffffffffffffffff16836108fc90604051600060405180830381858888f193505050503d80600081146105bf576040519150601f19603f3d011682016040523d82523d6000602084013e6105c4565b606091505b505090508015610624578173ffffffffffffffffffffffffffffffffffffffff16867feaa22fd2d7b875476355b32cf719794faf9d91b66e73bc6375a053cace9caaee8560405161061791815260200190565b60405180910390a3610676565b8173ffffffffffffffffffffffffffffffffffffffff16867f9b478c095979d3d3a7d602ffd9ee1f0843204d853558ae0882c8fcc0a5bc78cf8560405161066d91815260200190565b60405180910390a35b600186019550505050808061068a90610972565b91505061050a565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a4565b73ffffffffffffffffffffffffffffffffffffffff81166107bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101a4565b6107c8816107cb565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006040848603121561085557600080fd5b83359250602084013567ffffffffffffffff8082111561087457600080fd5b818601915086601f83011261088857600080fd5b81358181111561089757600080fd5b8760208260061b85010111156108ac57600080fd5b6020830194508093505050509250925092565b6000602082840312156108d157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146108f557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561096d5761096d61092b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156109a4576109a461092b565b506001019056fea26469706673582212209c98cb9cc04bc2bf5e8c0baf23ef87d045122afe6cfbb0e3c31bd854dd7fad7d64736f6c63430008090033", +- "linkReferences": {}, +- "deployedLinkReferences": {} +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.dbg.json +index 81029d5..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/3521e681a945ca0750229e8634e36044.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.json +index 05a66bf..5b7a022 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.json +@@ -89,8 +89,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50604051610a5d380380610a5d83398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109c18061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea2646970667358221220aea34fd8cdcf3a9cced029d5f7b1e628f42ad1514501878e0040df2afddb6e7164736f6c63430008090033", +- "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea2646970667358221220aea34fd8cdcf3a9cced029d5f7b1e628f42ad1514501878e0040df2afddb6e7164736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol/iL1ChugSplashDeployer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol/iL1ChugSplashDeployer.dbg.json +index 3db1c86..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol/iL1ChugSplashDeployer.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol/iL1ChugSplashDeployer.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/3521e681a945ca0750229e8634e36044.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.json +index 623ae5a..29db018 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.json +@@ -28,8 +28,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b5060405161013d38038061013d83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b60ab806100926000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633cb747bf14602d575b600080fd5b600054604c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea264697066735822122007712a382b03013a51c1c5af10d9e7b9b516e09be353a5f94af5d0263a013ea064736f6c63430008090033", +- "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80633cb747bf14602d575b600080fd5b600054604c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea264697066735822122007712a382b03013a51c1c5af10d9e7b9b516e09be353a5f94af5d0263a013ea064736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161011438038061011483398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6082806100926000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633cb747bf14602d575b600080fd5b600054604c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80633cb747bf14602d575b600080fd5b600054604c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/ICrossDomainMessenger.sol/ICrossDomainMessenger.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/ICrossDomainMessenger.sol/ICrossDomainMessenger.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/ICrossDomainMessenger.sol/ICrossDomainMessenger.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/ICrossDomainMessenger.sol/ICrossDomainMessenger.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.json +index 1a01171..30de5a6 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_CrossDomainUtils", + "sourceName": "contracts/libraries/bridge/Lib_CrossDomainUtils.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122060e64a9ccca3ea023c0ba81dbda8783559d3eec6a4d1d8ef8418badc967c072664736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122060e64a9ccca3ea023c0ba81dbda8783559d3eec6a4d1d8ef8418badc967c072664736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.json +index 3e3a7ef..22a8cd9 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_OVMCodec", + "sourceName": "contracts/libraries/codec/Lib_OVMCodec.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c2a5d11f9555d16a4e338a80443d30b1ec346c6a32a3a2423851829c61a564664736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c2a5d11f9555d16a4e338a80443d30b1ec346c6a32a3a2423851829c61a564664736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.json +index 54022e2..431a4ce 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_DefaultValues", + "sourceName": "contracts/libraries/constants/Lib_DefaultValues.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220063c5ffd8afe3ee3c085661f8b942ed207ae0c52f76c705ce32343804219a1be64736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220063c5ffd8afe3ee3c085661f8b942ed207ae0c52f76c705ce32343804219a1be64736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.dbg.json +index a931dfc..230bbcc 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/984271dfbf3d389dc7176cd63f345063.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.json +index 0ee6bf5..d97c365 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_PredeployAddresses", + "sourceName": "contracts/libraries/constants/Lib_PredeployAddresses.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122056cad517f08aabd21cc0b53f664298b5b8af8f91610a5d788b7cd5a14d12078b64736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122056cad517f08aabd21cc0b53f664298b5b8af8f91610a5d788b7cd5a14d12078b64736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json +index 5b1f1a7..756bf88 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json +@@ -118,8 +118,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107028061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea2646970667358221220882d6a267e1fbcc015c1726b422a6847e08c6be7e987e8b5ec1f7e85aa5095bb64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea2646970667358221220882d6a267e1fbcc015c1726b422a6847e08c6be7e987e8b5ec1f7e85aa5095bb64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressResolver.sol/Lib_AddressResolver.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressResolver.sol/Lib_AddressResolver.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressResolver.sol/Lib_AddressResolver.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_AddressResolver.sol/Lib_AddressResolver.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.dbg.json +new file mode 100644 +index 0000000..9ca300d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.json +new file mode 100644 +index 0000000..04e26c5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.json +@@ -0,0 +1,71 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "Lib_ResolvedDelegateBobaProxy", ++ "sourceName": "contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_proxyTarget", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "name": "addressManager", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_proxyTarget", ++ "type": "address" ++ } ++ ], ++ "name": "setTargetContract", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferProxyOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161070e38038061070e83398101604081905261002f916100af565b806000604051610050906a1c1c9bde1e55185c99d95d60aa1b8152600b0190565b9081526040805191829003602001822080546001600160a01b03949094166001600160a01b031994851617905569383937bc3ca7bbb732b960b11b82526000600a8301525190819003602a0190208054339216919091179055506100df565b6000602082840312156100c157600080fd5b81516001600160a01b03811681146100d857600080fd5b9392505050565b610620806100ee6000396000f3fe6080604052600436106100345760003560e01c806312762d5e1461003e57806347fc822f146100b5578063f1739cae146100d5575b61003c6100f5565b005b34801561004a57600080fd5b5061008c6100593660046104f7565b805160208183018101805160008252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c157600080fd5b5061003c6100d03660046105c6565b6102a7565b3480156100e157600080fd5b5061003c6100f03660046105c6565b610397565b6040517f70726f78794f776e65720000000000000000000000000000000000000000000081526000908190600a019081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff1614156101dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000806000604051610211907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b9081526040519081900360200181205473ffffffffffffffffffffffffffffffffffffffff1690610246906000903690610603565b600060405180830381855af49150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5090925090506001821515141561029f57805160208201f35b805160208201fd5b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c57806000604051610335907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905550565b6103946100f5565b50565b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c5773ffffffffffffffffffffffffffffffffffffffff8116610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646460448201527f726573732e00000000000000000000000000000000000000000000000000000060648201526084016101d3565b806000604051610335907f70726f78794f776e6572000000000000000000000000000000000000000000008152600a0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561050957600080fd5b813567ffffffffffffffff8082111561052157600080fd5b818401915084601f83011261053557600080fd5b813581811115610547576105476104c8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561058d5761058d6104c8565b816040528281528760208487010111156105a657600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156105d857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105fc57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x6080604052600436106100345760003560e01c806312762d5e1461003e57806347fc822f146100b5578063f1739cae146100d5575b61003c6100f5565b005b34801561004a57600080fd5b5061008c6100593660046104f7565b805160208183018101805160008252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c157600080fd5b5061003c6100d03660046105c6565b6102a7565b3480156100e157600080fd5b5061003c6100f03660046105c6565b610397565b6040517f70726f78794f776e65720000000000000000000000000000000000000000000081526000908190600a019081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff1614156101dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000806000604051610211907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b9081526040519081900360200181205473ffffffffffffffffffffffffffffffffffffffff1690610246906000903690610603565b600060405180830381855af49150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5090925090506001821515141561029f57805160208201f35b805160208201fd5b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c57806000604051610335907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905550565b6103946100f5565b50565b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c5773ffffffffffffffffffffffffffffffffffffffff8116610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646460448201527f726573732e00000000000000000000000000000000000000000000000000000060648201526084016101d3565b806000604051610335907f70726f78794f776e6572000000000000000000000000000000000000000000008152600a0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561050957600080fd5b813567ffffffffffffffff8082111561052157600080fd5b818401915084601f83011261053557600080fd5b813581811115610547576105476104c8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561058d5761058d6104c8565b816040528281528760208487010111156105a657600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156105d857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105fc57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.json +index cf8e2ae..63b5b3e 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.json +@@ -24,8 +24,8 @@ + "type": "fallback" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506040516105b53803806105b583398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b610354806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea2646970667358221220d66a7dad92a7f7528f41181719174e1d244423b8bb730d2884645c76cfa0944064736f6c63430008090033", +- "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea2646970667358221220d66a7dad92a7f7528f41181719174e1d244423b8bb730d2884645c76cfa0944064736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.json +index bfd6b1c..4a85a0e 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_RLPReader", + "sourceName": "contracts/libraries/rlp/Lib_RLPReader.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209b0105ac3644e4fdf76d616b816e1142d8df6b59717045de630c5b5bf5c4a49e64736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209b0105ac3644e4fdf76d616b816e1142d8df6b59717045de630c5b5bf5c4a49e64736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.json +index 1940338..dbb1172 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_RLPWriter", + "sourceName": "contracts/libraries/rlp/Lib_RLPWriter.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220946ae63101b895e34c026fce9aa6f03d577c9012d8837976e8dc3a57ae0a2ef064736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220946ae63101b895e34c026fce9aa6f03d577c9012d8837976e8dc3a57ae0a2ef064736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.json +index de20bd9..611ed70 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_MerkleTrie", + "sourceName": "contracts/libraries/trie/Lib_MerkleTrie.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204bb0ac85ac302d34237a42e6b310cd68b0497f371aa5e2b9af15fa5773b43ba364736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204bb0ac85ac302d34237a42e6b310cd68b0497f371aa5e2b9af15fa5773b43ba364736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.json +index 0bb62c0..04d7cca 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_SecureMerkleTrie", + "sourceName": "contracts/libraries/trie/Lib_SecureMerkleTrie.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220a319a6994e4f24e29fdfaf76eae5ff3afbab9d31584ee16de51b1bf01e49853664736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220a319a6994e4f24e29fdfaf76eae5ff3afbab9d31584ee16de51b1bf01e49853664736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.json +index 44e9149..2aed6c8 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_Buffer", + "sourceName": "contracts/libraries/utils/Lib_Buffer.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220594b214017d57365da3ea1c77083baf56a0e2bbeb0c3e002e311ad4566a5a88e64736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220594b214017d57365da3ea1c77083baf56a0e2bbeb0c3e002e311ad4566a5a88e64736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.json +index d7fe6e3..3de506f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_Bytes32Utils", + "sourceName": "contracts/libraries/utils/Lib_Bytes32Utils.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122016d3dffa07e555b0803ae61d773778a6b28a769ef91e47cb00040ecc7414705764736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122016d3dffa07e555b0803ae61d773778a6b28a769ef91e47cb00040ecc7414705764736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.json +index a4b7d18..3b8f84c 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_BytesUtils", + "sourceName": "contracts/libraries/utils/Lib_BytesUtils.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122017e44b43285912c440c4689616a765b1f83f985ef6c2257842a876b03fa23ec964736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122017e44b43285912c440c4689616a765b1f83f985ef6c2257842a876b03fa23ec964736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.json +index 778c082..c40f91f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.json +@@ -3,8 +3,8 @@ + "contractName": "Lib_MerkleTree", + "sourceName": "contracts/libraries/utils/Lib_MerkleTree.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b7c3be019aefbed37a33a16f751525cd016777745cc3de03701a42894fef404664736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b7c3be019aefbed37a33a16f751525cd016777745cc3de03701a42894fef404664736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +index b9399a3..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.json +index 0a63a7a..81e92bb 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.json +@@ -3,8 +3,8 @@ + "contractName": "AddressAliasHelper", + "sourceName": "contracts/standards/AddressAliasHelper.sol", + "abi": [], +- "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212207829434f027696874d561ec0adb447d98559e472900c36a38c8a3d107364652364736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212207829434f027696874d561ec0adb447d98559e472900c36a38c8a3d107364652364736f6c63430008090033", ++ "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/IL2StandardERC20.sol/IL2StandardERC20.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/IL2StandardERC20.sol/IL2StandardERC20.dbg.json +index b9399a3..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/IL2StandardERC20.sol/IL2StandardERC20.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/IL2StandardERC20.sol/IL2StandardERC20.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.dbg.json +new file mode 100644 +index 0000000..77792b2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json +new file mode 100644 +index 0000000..cade240 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json +@@ -0,0 +1,812 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "L2GovernanceERC20", ++ "sourceName": "contracts/standards/L2GovernanceERC20.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_l2Bridge", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_l1Token", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "string", ++ "name": "_symbol", ++ "type": "string" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "decimals_", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Burn", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_account", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "Mint", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "OFFSET", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_from", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l1Token", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2Bridge", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_to", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "mint", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes4", ++ "name": "_interfaceId", ++ "type": "bytes4" ++ } ++ ], ++ "name": "supportsInterface", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "pure", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162002986380380620029868339810160408190526200005a9162000302565b8280604051806040016040528060018152602001603160f81b815250858581600390805190602001906200009092919062000172565b508051620000a690600490602084019062000172565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a01819052818301989098526060810195909552608080860193909352308583015280518086039092018252939092019092528051940193909320909252610100525050600980546001600160a01b039586166001600160a01b031991821617909155600a805496909516951694909417909255505060ff1661014052620003eb565b8280546200018090620003ae565b90600052602060002090601f016020900481019282620001a45760008555620001ef565b82601f10620001bf57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ef578251825591602001919060010190620001d2565b50620001fd92915062000201565b5090565b5b80821115620001fd576000815560010162000202565b80516001600160a01b03811681146200023057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200025d57600080fd5b81516001600160401b03808211156200027a576200027a62000235565b604051601f8301601f19908116603f01168101908282118183101715620002a557620002a562000235565b81604052838152602092508683858801011115620002c257600080fd5b600091505b83821015620002e65785820183015181830184015290820190620002c7565b83821115620002f85760008385830101525b9695505050505050565b600080600080600060a086880312156200031b57600080fd5b620003268662000218565b9450620003366020870162000218565b60408701519094506001600160401b03808211156200035457600080fd5b6200036289838a016200024b565b945060608801519150808211156200037957600080fd5b5062000388888289016200024b565b925050608086015160ff81168114620003a057600080fd5b809150509295509295909350565b600181811c90821680620003c357607f821691505b60208210811415620003e557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516101405161254062000446600039600061026601526000610d6b015260006112e5015260006113340152600061130f01526000611293015260006112bc01526125406000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80637ecebe001161010f578063b4b5ea57116100a2578063d505accf11610071578063d505accf14610479578063d5abeb011461048c578063dd62ed3e146104cc578063f1127ed81461050557600080fd5b8063b4b5ea5714610438578063c01e1bd61461044b578063c3cda5201461045e578063ce665dd81461047157600080fd5b80639dc29fac116100de5780639dc29fac146103ec578063a457c2d7146103ff578063a9059cbb14610412578063ae1f6aaf1461042557600080fd5b80637ecebe00146103ab5780638e539e8c146103be57806395d89b41146103d15780639ab24eb0146103d957600080fd5b806339509351116101875780635c19a95c116101565780635c19a95c146103175780636fcfff451461032a57806370a0823114610352578063782d6fe11461037b57600080fd5b806339509351146102985780633a46b1a8146102ab57806340c10f19146102be578063587cde1e146102d357600080fd5b806318160ddd116101c357806318160ddd1461023a57806323b872dd1461024c578063313ce5671461025f5780633644e5151461029057600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063095ea7b314610227575b600080fd5b6101fd6101f836600461213d565b610557565b60405190151581526020015b60405180910390f35b61021a610617565b604051610209919061217f565b6101fd61023536600461220e565b6106a9565b6002545b604051908152602001610209565b6101fd61025a366004612238565b6106bf565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610209565b61023e610783565b6101fd6102a636600461220e565b610792565b61023e6102b936600461220e565b6107ce565b6102d16102cc36600461220e565b610848565b005b6102ff6102e1366004612274565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b039091168152602001610209565b6102d1610325366004612274565b6108f3565b61033d610338366004612274565b610900565b60405163ffffffff9091168152602001610209565b61023e610360366004612274565b6001600160a01b031660009081526020819052604090205490565b61038e61038936600461220e565b610928565b6040516bffffffffffffffffffffffff9091168152602001610209565b61023e6103b9366004612274565b61093c565b61023e6103cc36600461228f565b61095a565b61021a6109b6565b61023e6103e7366004612274565b6109c5565b6102d16103fa36600461220e565b610a76565b6101fd61040d36600461220e565b610b15565b6101fd61042036600461220e565b610bc6565b600a546102ff906001600160a01b031681565b61038e610446366004612274565b610bd3565b6009546102ff906001600160a01b031681565b6102d161046c3660046122b9565b610be1565b61023e600081565b6102d1610487366004612311565b610d17565b61049f6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b61023e6104da36600461237b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6105186105133660046123ae565b610e7b565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169281019290925201610209565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061060f57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610626906123ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610652906123ee565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b6338484610f14565b50600192915050565b60006106cc84848461106c565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561076b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6107788533858403610f14565b506001949350505050565b600061078d61128f565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106b69185906107c990869061246b565b610f14565b600043821061081f5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b6001600160a01b03831660009081526007602052604090206108419083611382565b9392505050565b600a546001600160a01b031633146108a25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b6108ac8282611476565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516108e791815260200190565b60405180910390a25050565b6108fd3382611484565b50565b6001600160a01b03811660009081526007602052604081205461092290611515565b92915050565b600061084161093784846107ce565b611595565b6001600160a01b038116600090815260056020526040812054610922565b60004382106109ab5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b610922600883611382565b606060048054610626906123ee565b6001600160a01b0381166000908152600760205260408120548015610a4e576001600160a01b0383166000908152600760205260409020610a07600183612483565b81548110610a1757610a1761249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a51565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b600a546001600160a01b03163314610ad05760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b610ada8282611619565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516108e791815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610baf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610762565b610bbc3385858403610f14565b5060019392505050565b60006106b633848461106c565b6000610922610937836109c5565b83421115610c315760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610762565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610cab90610ca39060a00160405160208183030381529060405280519060200120611623565b85858561168c565b9050610cb6816116b4565b8614610d045760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610762565b610d0e8188611484565b50505050505050565b83421115610d675760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610762565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610d968c6116b4565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610df182611623565b90506000610e018287878761168c565b9050896001600160a01b0316816001600160a01b031614610e645760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610762565b610e6f8a8a8a610f14565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110610ebf57610ebf61249a565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b6001600160a01b038316610f8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b03821661100b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0382166111645760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038316600090815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061122a90849061246b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161127691815260200190565b60405180910390a36112898484846116e1565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156112de57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061138e818361246b565b835490925060005b818110156113f35760006113aa82846116ec565b9050848682815481106113bf576113bf61249a565b60009182526020909120015463ffffffff1611156113df578092506113ed565b6113ea81600161246b565b91505b50611396565b811561144c5784611405600184612483565b815481106114155761141561249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661144f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b6114808282611707565b5050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112898284836117a3565b600063ffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b5090565b60006bffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b61148082826118e0565b600061092261163061128f565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061169d878787876118f8565b915091506116aa81611a03565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b505050565b6116dc838383611bf4565b60006116fb60028484186124c9565b6108419084841661246b565b6117118282611c26565b6002546b019d971e4fe8401e7400000010156117955760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610762565b6112896008611d0d83611d19565b816001600160a01b0316836001600160a01b0316141580156117c55750600081115b156116dc576001600160a01b03831615611853576001600160a01b0383166000908152600760205260408120819061180090611f1185611d19565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611848929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156116dc576001600160a01b0382166000908152600760205260408120819061188990611d0d85611d19565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516118d1929190918252602082015260400190565b60405180910390a25050505050565b6118ea8282611f1d565b6112896008611f1183611d19565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561192f57506000905060036119fa565b8460ff16601b1415801561194757508460ff16601c14155b1561195857506000905060046119fa565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119ac573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166119f3576000600192509250506119fa565b9150600090505b94509492505050565b6000816004811115611a1757611a17612504565b1415611a205750565b6001816004811115611a3457611a34612504565b1415611a825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610762565b6002816004811115611a9657611a96612504565b1415611ae45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610762565b6003816004811115611af857611af8612504565b1415611b6c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6004816004811115611b8057611b80612504565b14156108fd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038381166000908152600660205260408082205485841683529120546116dc929182169116836117a3565b6001600160a01b038216611c7c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610762565b8060026000828254611c8e919061246b565b90915550506001600160a01b03821660009081526020819052604081208054839290611cbb90849061246b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611480600083836116e1565b6000610841828461246b565b825460009081908015611d795785611d32600183612483565b81548110611d4257611d4261249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611d7c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611daa83858763ffffffff16565b9150600081118015611df25750611dc260004361246b565b86611dce600184612483565b81548110611dde57611dde61249a565b60009182526020909120015463ffffffff16145b15611e7c57611e00826120a9565b86611e0c600184612483565b81548110611e1c57611e1c61249a565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611f08565b856040518060400160405280611e9d600043611e98919061246b565b611515565b63ffffffff168152602001611eb1856120a9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60006108418284612483565b6001600160a01b038216611f995760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038216600090815260208190526040902054818110156120285760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612057908490612483565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36116dc836000846116e1565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610762565b60006020828403121561214f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084157600080fd5b600060208083528351808285015260005b818110156121ac57858101830151858201604001528201612190565b818111156121be576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b038116811461220957600080fd5b919050565b6000806040838503121561222157600080fd5b61222a836121f2565b946020939093013593505050565b60008060006060848603121561224d57600080fd5b612256846121f2565b9250612264602085016121f2565b9150604084013590509250925092565b60006020828403121561228657600080fd5b610841826121f2565b6000602082840312156122a157600080fd5b5035919050565b803560ff8116811461220957600080fd5b60008060008060008060c087890312156122d257600080fd5b6122db876121f2565b955060208701359450604087013593506122f7606088016122a8565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232c57600080fd5b612335886121f2565b9650612343602089016121f2565b9550604088013594506060880135935061235f608089016122a8565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238e57600080fd5b612397836121f2565b91506123a5602084016121f2565b90509250929050565b600080604083850312156123c157600080fd5b6123ca836121f2565b9150602083013563ffffffff811681146123e357600080fd5b809150509250929050565b600181811c9082168061240257607f821691505b602082108114156116d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247e5761247e61243c565b500190565b6000828210156124955761249561243c565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80637ecebe001161010f578063b4b5ea57116100a2578063d505accf11610071578063d505accf14610479578063d5abeb011461048c578063dd62ed3e146104cc578063f1127ed81461050557600080fd5b8063b4b5ea5714610438578063c01e1bd61461044b578063c3cda5201461045e578063ce665dd81461047157600080fd5b80639dc29fac116100de5780639dc29fac146103ec578063a457c2d7146103ff578063a9059cbb14610412578063ae1f6aaf1461042557600080fd5b80637ecebe00146103ab5780638e539e8c146103be57806395d89b41146103d15780639ab24eb0146103d957600080fd5b806339509351116101875780635c19a95c116101565780635c19a95c146103175780636fcfff451461032a57806370a0823114610352578063782d6fe11461037b57600080fd5b806339509351146102985780633a46b1a8146102ab57806340c10f19146102be578063587cde1e146102d357600080fd5b806318160ddd116101c357806318160ddd1461023a57806323b872dd1461024c578063313ce5671461025f5780633644e5151461029057600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063095ea7b314610227575b600080fd5b6101fd6101f836600461213d565b610557565b60405190151581526020015b60405180910390f35b61021a610617565b604051610209919061217f565b6101fd61023536600461220e565b6106a9565b6002545b604051908152602001610209565b6101fd61025a366004612238565b6106bf565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610209565b61023e610783565b6101fd6102a636600461220e565b610792565b61023e6102b936600461220e565b6107ce565b6102d16102cc36600461220e565b610848565b005b6102ff6102e1366004612274565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b039091168152602001610209565b6102d1610325366004612274565b6108f3565b61033d610338366004612274565b610900565b60405163ffffffff9091168152602001610209565b61023e610360366004612274565b6001600160a01b031660009081526020819052604090205490565b61038e61038936600461220e565b610928565b6040516bffffffffffffffffffffffff9091168152602001610209565b61023e6103b9366004612274565b61093c565b61023e6103cc36600461228f565b61095a565b61021a6109b6565b61023e6103e7366004612274565b6109c5565b6102d16103fa36600461220e565b610a76565b6101fd61040d36600461220e565b610b15565b6101fd61042036600461220e565b610bc6565b600a546102ff906001600160a01b031681565b61038e610446366004612274565b610bd3565b6009546102ff906001600160a01b031681565b6102d161046c3660046122b9565b610be1565b61023e600081565b6102d1610487366004612311565b610d17565b61049f6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b61023e6104da36600461237b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6105186105133660046123ae565b610e7b565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169281019290925201610209565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061060f57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610626906123ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610652906123ee565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b6338484610f14565b50600192915050565b60006106cc84848461106c565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561076b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6107788533858403610f14565b506001949350505050565b600061078d61128f565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106b69185906107c990869061246b565b610f14565b600043821061081f5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b6001600160a01b03831660009081526007602052604090206108419083611382565b9392505050565b600a546001600160a01b031633146108a25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b6108ac8282611476565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516108e791815260200190565b60405180910390a25050565b6108fd3382611484565b50565b6001600160a01b03811660009081526007602052604081205461092290611515565b92915050565b600061084161093784846107ce565b611595565b6001600160a01b038116600090815260056020526040812054610922565b60004382106109ab5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b610922600883611382565b606060048054610626906123ee565b6001600160a01b0381166000908152600760205260408120548015610a4e576001600160a01b0383166000908152600760205260409020610a07600183612483565b81548110610a1757610a1761249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a51565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b600a546001600160a01b03163314610ad05760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b610ada8282611619565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516108e791815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610baf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610762565b610bbc3385858403610f14565b5060019392505050565b60006106b633848461106c565b6000610922610937836109c5565b83421115610c315760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610762565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610cab90610ca39060a00160405160208183030381529060405280519060200120611623565b85858561168c565b9050610cb6816116b4565b8614610d045760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610762565b610d0e8188611484565b50505050505050565b83421115610d675760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610762565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610d968c6116b4565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610df182611623565b90506000610e018287878761168c565b9050896001600160a01b0316816001600160a01b031614610e645760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610762565b610e6f8a8a8a610f14565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110610ebf57610ebf61249a565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b6001600160a01b038316610f8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b03821661100b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0382166111645760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038316600090815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061122a90849061246b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161127691815260200190565b60405180910390a36112898484846116e1565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156112de57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061138e818361246b565b835490925060005b818110156113f35760006113aa82846116ec565b9050848682815481106113bf576113bf61249a565b60009182526020909120015463ffffffff1611156113df578092506113ed565b6113ea81600161246b565b91505b50611396565b811561144c5784611405600184612483565b815481106114155761141561249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661144f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b6114808282611707565b5050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112898284836117a3565b600063ffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b5090565b60006bffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b61148082826118e0565b600061092261163061128f565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061169d878787876118f8565b915091506116aa81611a03565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b505050565b6116dc838383611bf4565b60006116fb60028484186124c9565b6108419084841661246b565b6117118282611c26565b6002546b019d971e4fe8401e7400000010156117955760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610762565b6112896008611d0d83611d19565b816001600160a01b0316836001600160a01b0316141580156117c55750600081115b156116dc576001600160a01b03831615611853576001600160a01b0383166000908152600760205260408120819061180090611f1185611d19565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611848929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156116dc576001600160a01b0382166000908152600760205260408120819061188990611d0d85611d19565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516118d1929190918252602082015260400190565b60405180910390a25050505050565b6118ea8282611f1d565b6112896008611f1183611d19565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561192f57506000905060036119fa565b8460ff16601b1415801561194757508460ff16601c14155b1561195857506000905060046119fa565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119ac573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166119f3576000600192509250506119fa565b9150600090505b94509492505050565b6000816004811115611a1757611a17612504565b1415611a205750565b6001816004811115611a3457611a34612504565b1415611a825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610762565b6002816004811115611a9657611a96612504565b1415611ae45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610762565b6003816004811115611af857611af8612504565b1415611b6c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6004816004811115611b8057611b80612504565b14156108fd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038381166000908152600660205260408082205485841683529120546116dc929182169116836117a3565b6001600160a01b038216611c7c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610762565b8060026000828254611c8e919061246b565b90915550506001600160a01b03821660009081526020819052604081208054839290611cbb90849061246b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611480600083836116e1565b6000610841828461246b565b825460009081908015611d795785611d32600183612483565b81548110611d4257611d4261249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611d7c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611daa83858763ffffffff16565b9150600081118015611df25750611dc260004361246b565b86611dce600184612483565b81548110611dde57611dde61249a565b60009182526020909120015463ffffffff16145b15611e7c57611e00826120a9565b86611e0c600184612483565b81548110611e1c57611e1c61249a565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611f08565b856040518060400160405280611e9d600043611e98919061246b565b611515565b63ffffffff168152602001611eb1856120a9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60006108418284612483565b6001600160a01b038216611f995760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038216600090815260208190526040902054818110156120285760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612057908490612483565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36116dc836000846116e1565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610762565b60006020828403121561214f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084157600080fd5b600060208083528351808285015260005b818110156121ac57858101830151858201604001528201612190565b818111156121be576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b038116811461220957600080fd5b919050565b6000806040838503121561222157600080fd5b61222a836121f2565b946020939093013593505050565b60008060006060848603121561224d57600080fd5b612256846121f2565b9250612264602085016121f2565b9150604084013590509250925092565b60006020828403121561228657600080fd5b610841826121f2565b6000602082840312156122a157600080fd5b5035919050565b803560ff8116811461220957600080fd5b60008060008060008060c087890312156122d257600080fd5b6122db876121f2565b955060208701359450604087013593506122f7606088016122a8565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232c57600080fd5b612335886121f2565b9650612343602089016121f2565b9550604088013594506060880135935061235f608089016122a8565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238e57600080fd5b612397836121f2565b91506123a5602084016121f2565b90509250929050565b600080604083850312156123c157600080fd5b6123ca836121f2565b9150602083013563ffffffff811681146123e357600080fd5b809150509250929050565b600181811c9082168061240257607f821691505b602082108114156116d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247e5761247e61243c565b500190565b6000828210156124955761249561243c565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.dbg.json +index b9399a3..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json +index faf6678..b5b9c82 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json +@@ -24,6 +24,11 @@ + "internalType": "string", + "name": "_symbol", + "type": "string" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "decimals_", ++ "type": "uint8" + } + ], + "stateMutability": "nonpayable", +@@ -419,8 +424,8 @@ + "type": "function" + } + ], +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620013d7380380620013d783398101604081905262000034916200022f565b8151829082906200004d9060039060208501906200009f565b508051620000639060049060208401906200009f565b5050600580546001600160a01b039586166001600160a01b031991821617909155600680549690951695169490941790925550620002fc915050565b828054620000ad90620002bf565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b80516001600160a01b03811681146200015d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a762000162565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d262000162565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b600080600080608085870312156200024657600080fd5b620002518562000145565b9350620002616020860162000145565b60408601519093506001600160401b03808211156200027f57600080fd5b6200028d8883890162000178565b93506060870151915080821115620002a457600080fd5b50620002b38782880162000178565b91505092959194509250565b600181811c90821680620002d457607f821691505b60208210811415620002f657634e487b7160e01b600052602260045260246000fd5b50919050565b6110cb806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e4a565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610e93565b610118610150366004610f2f565b610425565b6002545b604051908152602001610124565b610118610175366004610f59565b61043b565b60405160128152602001610124565b610118610197366004610f2f565b61050c565b6101af6101aa366004610f2f565b610555565b005b6101596101bf366004610f95565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561061a565b6101af6101fd366004610f2f565b610629565b610118610210366004610f2f565b6106e2565b610118610223366004610f2f565b6107a0565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610fb0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610fe3565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610fe3565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b60006104323384846107ad565b50600192915050565b600061044884848461092d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156104f45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61050185338584036107ad565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610432918590610550908690611066565b6107ad565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105bc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b6105c68282610b93565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161060e91815260200190565b60405180910390a25050565b6060600480546103a290610fe3565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106905760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b61069a8282610c99565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161060e91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104eb565b61079633858584036107ad565b5060019392505050565b600061043233848461092d565b73ffffffffffffffffffffffffffffffffffffffff83166108355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff82166108be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff8216610a3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610adb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b1f908490611066565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b8591815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610bf65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104eb565b8060026000828254610c089190611066565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c42908490611066565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610dfa90849061107e565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610920565b600060208284031215610e5c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e8c57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ec057858101830151858201604001528201610ea4565b81811115610ed2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2a57600080fd5b919050565b60008060408385031215610f4257600080fd5b610f4b83610f06565b946020939093013593505050565b600080600060608486031215610f6e57600080fd5b610f7784610f06565b9250610f8560208501610f06565b9150604084013590509250925092565b600060208284031215610fa757600080fd5b610e8c82610f06565b60008060408385031215610fc357600080fd5b610fcc83610f06565b9150610fda60208401610f06565b90509250929050565b600181811c90821680610ff757607f821691505b60208210811415611031577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561107957611079611037565b500190565b60008282101561109057611090611037565b50039056fea264697066735822122069a2d33039157f3f2f180571262ca2a5d0a3a24d33bf9448f3b7c2ce9ff757f964736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e4a565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610e93565b610118610150366004610f2f565b610425565b6002545b604051908152602001610124565b610118610175366004610f59565b61043b565b60405160128152602001610124565b610118610197366004610f2f565b61050c565b6101af6101aa366004610f2f565b610555565b005b6101596101bf366004610f95565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561061a565b6101af6101fd366004610f2f565b610629565b610118610210366004610f2f565b6106e2565b610118610223366004610f2f565b6107a0565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610fb0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610fe3565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610fe3565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b60006104323384846107ad565b50600192915050565b600061044884848461092d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156104f45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61050185338584036107ad565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610432918590610550908690611066565b6107ad565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105bc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b6105c68282610b93565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161060e91815260200190565b60405180910390a25050565b6060600480546103a290610fe3565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106905760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b61069a8282610c99565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161060e91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104eb565b61079633858584036107ad565b5060019392505050565b600061043233848461092d565b73ffffffffffffffffffffffffffffffffffffffff83166108355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff82166108be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff8216610a3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610adb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b1f908490611066565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b8591815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610bf65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104eb565b8060026000828254610c089190611066565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c42908490611066565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610dfa90849061107e565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610920565b600060208284031215610e5c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e8c57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ec057858101830151858201604001528201610ea4565b81811115610ed2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2a57600080fd5b919050565b60008060408385031215610f4257600080fd5b610f4b83610f06565b946020939093013593505050565b600080600060608486031215610f6e57600080fd5b610f7784610f06565b9250610f8560208501610f06565b9150604084013590509250925092565b600060208284031215610fa757600080fd5b610e8c82610f06565b60008060408385031215610fc357600080fd5b610fcc83610f06565b9150610fda60208401610f06565b90509250929050565b600181811c90821680610ff757607f821691505b60208210811415611031577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561107957611079611037565b500190565b60008282101561109057611090611037565b50039056fea264697066735822122069a2d33039157f3f2f180571262ca2a5d0a3a24d33bf9448f3b7c2ce9ff757f964736f6c63430008090033", ++ "bytecode": "0x60a06040523480156200001157600080fd5b50604051620013fd380380620013fd833981016040819052620000349162000234565b8251839083906200004d906003906020850190620000a4565b50805162000063906004906020840190620000a4565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff16608052506200031d565b828054620000b290620002e0565b90600052602060002090601f016020900481019282620000d6576000855562000121565b82601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b5b808211156200012f576000815560010162000134565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018f57600080fd5b81516001600160401b0380821115620001ac57620001ac62000167565b604051601f8301601f19908116603f01168101908282118183101715620001d757620001d762000167565b81604052838152602092508683858801011115620001f457600080fd5b600091505b83821015620002185785820183015181830184015290820190620001f9565b838211156200022a5760008385830101525b9695505050505050565b600080600080600060a086880312156200024d57600080fd5b62000258866200014a565b945062000268602087016200014a565b60408701519094506001600160401b03808211156200028657600080fd5b6200029489838a016200017d565b94506060880151915080821115620002ab57600080fd5b50620002ba888289016200017d565b925050608086015160ff81168114620002d257600080fd5b809150509295509295909350565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516110c462000339600039600061018101526110c46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.dbg.json +deleted file mode 100644 +index 8ea534b..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.dbg.json ++++ /dev/null +@@ -1,4 +0,0 @@ +-{ +- "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/5fdb7a874571e45747e10ff611ad444c.json" +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.json +deleted file mode 100644 +index 8442316..0000000 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.json ++++ /dev/null +@@ -1,15 +0,0 @@ +-{ +- "_format": "hh-sol-artifact-1", +- "contractName": "FailingReceiver", +- "sourceName": "contracts/test-helpers/FailingReceiver.sol", +- "abi": [ +- { +- "stateMutability": "payable", +- "type": "receive" +- } +- ], +- "bytecode": "0x6080604052348015600f57600080fd5b5060a98061001e6000396000f3fe608060405236606e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4661696c696e6752656365697665720000000000000000000000000000000000604482015260640160405180910390fd5b600080fdfea264697066735822122093dadd9a0eaea3eec12c80574f204b2b5c9c04b606f667740911c8a5735a459864736f6c63430008090033", +- "deployedBytecode": "0x608060405236606e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4661696c696e6752656365697665720000000000000000000000000000000000604482015260640160405180910390fd5b600080fdfea264697066735822122093dadd9a0eaea3eec12c80574f204b2b5c9c04b606f667740911c8a5735a459864736f6c63430008090033", +- "linkReferences": {}, +- "deployedLinkReferences": {} +-} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.dbg.json +new file mode 100644 +index 0000000..77792b2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.dbg.json +@@ -0,0 +1,4 @@ ++{ ++ "_format": "hh-sol-dbg-1", ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.json +new file mode 100644 +index 0000000..9e75198 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.json +@@ -0,0 +1,35 @@ ++{ ++ "_format": "hh-sol-artifact-1", ++ "contractName": "Helper_GasMeasurer", ++ "sourceName": "contracts/test-helpers/Helper_GasMeasurer.sol", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "measureCallGas", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "bytecode": "0x608060405234801561001057600080fd5b506102b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063df0495a114610030575b600080fd5b61004361003e366004610172565b610055565b60405190815260200160405180910390f35b8051600090819081906020850190825a9450600080838560008c5af190505a93508061012d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f43616c6c206661696c65642c206275742063616c6c732077652077616e74207460448201527f6f206d6561737572652067617320666f722073686f756c64207375636365656460648201527f2100000000000000000000000000000000000000000000000000000000000000608482015260a40160405180910390fd5b610137848661026d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561018557600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146101a957600080fd5b9150602083013567ffffffffffffffff808211156101c657600080fd5b818501915085601f8301126101da57600080fd5b8135818111156101ec576101ec610143565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561023257610232610143565b8160405282815288602084870101111561024b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000828210156102a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063df0495a114610030575b600080fd5b61004361003e366004610172565b610055565b60405190815260200160405180910390f35b8051600090819081906020850190825a9450600080838560008c5af190505a93508061012d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f43616c6c206661696c65642c206275742063616c6c732077652077616e74207460448201527f6f206d6561737572652067617320666f722073686f756c64207375636365656460648201527f2100000000000000000000000000000000000000000000000000000000000000608482015260a40160405180910390fd5b610137848661026d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561018557600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146101a957600080fd5b9150602083013567ffffffffffffffff808211156101c657600080fd5b818501915085601f8301126101da57600080fd5b8135818111156101ec576101ec610143565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561023257610232610143565b8160405282815288602084870101111561024b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000828210156102a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c6343000809000a", ++ "linkReferences": {}, ++ "deployedLinkReferences": {} ++} +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.dbg.json +index 4fff0f9..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/d8a4c11c3ce7e18c1df4cff77219f199.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.json +index 05b0a7e..ea2bfce 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.json +@@ -26,8 +26,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610287806100326000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063776d1a0114610084575b60015460408051602036601f81018290048202830182019093528282526100829373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b005b6100826100923660046101d9565b61011c565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516100bf9190610216565b6000604051808303816000865af19150503d80600081146100fc576040519150601f19603f3d011682016040523d82523d6000602084013e610101565b606091505b5091509150811561011457805160208201f35b805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633141561017f57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b60015460408051602036601f81018290048202830182019093528282526101d69373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b50565b6000602082840312156101eb57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020f57600080fd5b9392505050565b6000825160005b81811015610237576020818601810151858301520161021d565b81811115610246576000828501525b50919091019291505056fea264697066735822122066ac981f3a6ef2f18f93e7bf1dc67c94dbb6cab5480c3870726f5b124f751fe064736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063776d1a0114610084575b60015460408051602036601f81018290048202830182019093528282526100829373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b005b6100826100923660046101d9565b61011c565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516100bf9190610216565b6000604051808303816000865af19150503d80600081146100fc576040519150601f19603f3d011682016040523d82523d6000602084013e610101565b606091505b5091509150811561011457805160208201f35b805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633141561017f57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b60015460408051602036601f81018290048202830182019093528282526101d69373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b50565b6000602082840312156101eb57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020f57600080fd5b9392505050565b6000825160005b81811015610237576020818601810151858301520161021d565b81811115610246576000828501525b50919091019291505056fea264697066735822122066ac981f3a6ef2f18f93e7bf1dc67c94dbb6cab5480c3870726f5b124f751fe064736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b0319163317905561025e806100326000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063776d1a0114610084575b60015460408051602036601f81018290048202830182019093528282526100829373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b005b6100826100923660046101d9565b61011c565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516100bf9190610216565b6000604051808303816000865af19150503d80600081146100fc576040519150601f19603f3d011682016040523d82523d6000602084013e610101565b606091505b5091509150811561011457805160208201f35b805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633141561017f57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b60015460408051602036601f81018290048202830182019093528282526101d69373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b50565b6000602082840312156101eb57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020f57600080fd5b9392505050565b6000825160005b81811015610237576020818601810151858301520161021d565b81811115610246576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063776d1a0114610084575b60015460408051602036601f81018290048202830182019093528282526100829373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b005b6100826100923660046101d9565b61011c565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516100bf9190610216565b6000604051808303816000865af19150503d80600081146100fc576040519150601f19603f3d011682016040523d82523d6000602084013e610101565b606091505b5091509150811561011457805160208201f35b805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633141561017f57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b60015460408051602036601f81018290048202830182019093528282526101d69373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b50565b6000602082840312156101eb57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020f57600080fd5b9392505050565b6000825160005b81811015610237576020818601810151858301520161021d565b81811115610246576000828501525b50919091019291505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.dbg.json +index b9399a3..77792b2 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.json +index ef4899d..76cfd41 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.json +@@ -249,8 +249,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.json +index d46a76c..115ab2f 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.json +@@ -38,8 +38,8 @@ + "type": "function" + } + ], +- "bytecode": "0x61036861003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063053156471461003a575b600080fd5b61004d61004836600461016b565b610063565b60405161005a91906102ce565b60405180910390f35b60606100718585858561007a565b95945050505050565b60608484848460405160240161009394939291906102e8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461013757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561018157600080fd5b61018a85610113565b935061019860208601610113565b9250604085013567ffffffffffffffff808211156101b557600080fd5b818701915087601f8301126101c957600080fd5b8135818111156101db576101db61013c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102215761022161013c565b816040528281528a602084870101111561023a57600080fd5b826020860160208301376000928101602001929092525095989497509495606001359450505050565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006102e16020830184610263565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526103216080830185610263565b90508260608301529594505050505056fea2646970667358221220247aed227af37e0d8979d8447bf4634fc2b456ad46e0879d357aea2e58c03af864736f6c63430008090033", +- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063053156471461003a575b600080fd5b61004d61004836600461016b565b610063565b60405161005a91906102ce565b60405180910390f35b60606100718585858561007a565b95945050505050565b60608484848460405160240161009394939291906102e8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461013757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561018157600080fd5b61018a85610113565b935061019860208601610113565b9250604085013567ffffffffffffffff808211156101b557600080fd5b818701915087601f8301126101c957600080fd5b8135818111156101db576101db61013c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102215761022161013c565b816040528281528a602084870101111561023a57600080fd5b826020860160208301376000928101602001929092525095989497509495606001359450505050565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006102e16020830184610263565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526103216080830185610263565b90508260608301529594505050505056fea2646970667358221220247aed227af37e0d8979d8447bf4634fc2b456ad46e0879d357aea2e58c03af864736f6c63430008090033", ++ "bytecode": "0x61033f61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063053156471461003a575b600080fd5b61004d61004836600461016b565b610063565b60405161005a91906102ce565b60405180910390f35b60606100718585858561007a565b95945050505050565b60608484848460405160240161009394939291906102e8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461013757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561018157600080fd5b61018a85610113565b935061019860208601610113565b9250604085013567ffffffffffffffff808211156101b557600080fd5b818701915087601f8301126101c957600080fd5b8135818111156101db576101db61013c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102215761022161013c565b816040528281528a602084870101111561023a57600080fd5b826020860160208301376000928101602001929092525095989497509495606001359450505050565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006102e16020830184610263565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526103216080830185610263565b90508260608301529594505050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063053156471461003a575b600080fd5b61004d61004836600461016b565b610063565b60405161005a91906102ce565b60405180910390f35b60606100718585858561007a565b95945050505050565b60608484848460405160240161009394939291906102e8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461013757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561018157600080fd5b61018a85610113565b935061019860208601610113565b9250604085013567ffffffffffffffff808211156101b557600080fd5b818701915087601f8301126101c957600080fd5b8135818111156101db576101db61013c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102215761022161013c565b816040528281528a602084870101111561023a57600080fd5b826020860160208301376000928101602001929092525095989497509495606001359450505050565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006102e16020830184610263565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526103216080830185610263565b90508260608301529594505050505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.json +index 9ea5644..1584752 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.json +@@ -116,8 +116,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50610466806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633170de2a1461003b578063a3e6d2fc14610061575b600080fd5b61004e610049366004610242565b610081565b6040519081526020015b60405180910390f35b61007461006f366004610242565b610092565b6040516100589190610330565b600061008c8261009d565b92915050565b606061008c826100b6565b60006100a8826100b6565b805190602001209050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016100f19796959493929190610381565b6040516020818303038152906040529050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561015957610159610107565b60405290565b80356002811061016e57600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461016e57600080fd5b600082601f8301126101a857600080fd5b813567ffffffffffffffff808211156101c3576101c3610107565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561020957610209610107565b8160405283815286602085880101111561022257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561025457600080fd5b813567ffffffffffffffff8082111561026c57600080fd5b9083019060e0828603121561028057600080fd5b610288610136565b82358152602083013560208201526102a26040840161015f565b60408201526102b360608401610173565b60608201526102c460808401610173565b608082015260a083013560a082015260c0830135828111156102e557600080fd5b6102f187828601610197565b60c08301525095945050505050565b60005b8381101561031b578181015183820152602001610303565b8381111561032a576000848401525b50505050565b602081526000825180602084015261034f816040850160208701610300565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8781528660208201526000600287106103c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8660f81b60408301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808760601b166041840152808660601b16605584015250836069830152825161041d816089850160208701610300565b919091016089019897505050505050505056fea26469706673582212204aa64f4a9c5361a76172bb8f6b571eb4ab45a1cd31fdaaf5cadba5e0a864ea7264736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633170de2a1461003b578063a3e6d2fc14610061575b600080fd5b61004e610049366004610242565b610081565b6040519081526020015b60405180910390f35b61007461006f366004610242565b610092565b6040516100589190610330565b600061008c8261009d565b92915050565b606061008c826100b6565b60006100a8826100b6565b805190602001209050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016100f19796959493929190610381565b6040516020818303038152906040529050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561015957610159610107565b60405290565b80356002811061016e57600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461016e57600080fd5b600082601f8301126101a857600080fd5b813567ffffffffffffffff808211156101c3576101c3610107565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561020957610209610107565b8160405283815286602085880101111561022257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561025457600080fd5b813567ffffffffffffffff8082111561026c57600080fd5b9083019060e0828603121561028057600080fd5b610288610136565b82358152602083013560208201526102a26040840161015f565b60408201526102b360608401610173565b60608201526102c460808401610173565b608082015260a083013560a082015260c0830135828111156102e557600080fd5b6102f187828601610197565b60c08301525095945050505050565b60005b8381101561031b578181015183820152602001610303565b8381111561032a576000848401525b50505050565b602081526000825180602084015261034f816040850160208701610300565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8781528660208201526000600287106103c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8660f81b60408301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808760601b166041840152808660601b16605584015250836069830152825161041d816089850160208701610300565b919091016089019897505050505050505056fea26469706673582212204aa64f4a9c5361a76172bb8f6b571eb4ab45a1cd31fdaaf5cadba5e0a864ea7264736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061043d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633170de2a1461003b578063a3e6d2fc14610061575b600080fd5b61004e610049366004610242565b610081565b6040519081526020015b60405180910390f35b61007461006f366004610242565b610092565b6040516100589190610330565b600061008c8261009d565b92915050565b606061008c826100b6565b60006100a8826100b6565b805190602001209050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016100f19796959493929190610381565b6040516020818303038152906040529050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561015957610159610107565b60405290565b80356002811061016e57600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461016e57600080fd5b600082601f8301126101a857600080fd5b813567ffffffffffffffff808211156101c3576101c3610107565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561020957610209610107565b8160405283815286602085880101111561022257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561025457600080fd5b813567ffffffffffffffff8082111561026c57600080fd5b9083019060e0828603121561028057600080fd5b610288610136565b82358152602083013560208201526102a26040840161015f565b60408201526102b360608401610173565b60608201526102c460808401610173565b608082015260a083013560a082015260c0830135828111156102e557600080fd5b6102f187828601610197565b60c08301525095945050505050565b60005b8381101561031b578181015183820152602001610303565b8381111561032a576000848401525b50505050565b602081526000825180602084015261034f816040850160208701610300565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8781528660208201526000600287106103c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8660f81b60408301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808760601b166041840152808660601b16605584015250836069830152825161041d816089850160208701610300565b919091016089019897505050505050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633170de2a1461003b578063a3e6d2fc14610061575b600080fd5b61004e610049366004610242565b610081565b6040519081526020015b60405180910390f35b61007461006f366004610242565b610092565b6040516100589190610330565b600061008c8261009d565b92915050565b606061008c826100b6565b60006100a8826100b6565b805190602001209050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016100f19796959493929190610381565b6040516020818303038152906040529050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561015957610159610107565b60405290565b80356002811061016e57600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461016e57600080fd5b600082601f8301126101a857600080fd5b813567ffffffffffffffff808211156101c3576101c3610107565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561020957610209610107565b8160405283815286602085880101111561022257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561025457600080fd5b813567ffffffffffffffff8082111561026c57600080fd5b9083019060e0828603121561028057600080fd5b610288610136565b82358152602083013560208201526102a26040840161015f565b60408201526102b360608401610173565b60608201526102c460808401610173565b608082015260a083013560a082015260c0830135828111156102e557600080fd5b6102f187828601610197565b60c08301525095945050505050565b60005b8381101561031b578181015183820152602001610303565b8381111561032a576000848401525b50505050565b602081526000825180602084015261034f816040850160208701610300565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8781528660208201526000600287106103c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8660f81b60408301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808760601b166041840152808660601b16605584015250836069830152825161041d816089850160208701610300565b919091016089019897505050505050505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.json +index 7894efb..42182aa 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.json +@@ -137,8 +137,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506110cd806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635f71b98d1161005b5780635f71b98d146100e857806384147d531461010b5780638b33268b1461011e578063a39d36711461013157600080fd5b806316b3269e1461008257806331d12cd3146100a8578063359835b5146100c8575b600080fd5b610095610090366004610d9a565b610169565b6040519081526020015b60405180910390f35b6100bb6100b6366004610d9a565b61017a565b60405161009f9190610ed4565b6100db6100d6366004610d9a565b610185565b60405161009f9190610ee7565b6100fb6100f6366004610d9a565b61024c565b604051901515815260200161009f565b610095610119366004610d9a565b610257565b6100bb61012c366004610d9a565b610262565b61014461013f366004610d9a565b61026d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b600061017482610278565b92915050565b6060610174826102b3565b60606000610192836102e6565b90506000815167ffffffffffffffff8111156101b0576101b0610d6b565b6040519080825280602002602001820160405280156101e357816020015b60608152602001906001900390816101ce5790505b50905060005b81518110156102445761021483828151811061020757610207610f67565b6020026020010151610319565b82828151811061022657610226610f67565b6020026020010181905250808061023c90610fc5565b9150506101e9565b509392505050565b600061017482610324565b60006101748261035f565b60606101748261039a565b6000610174826103cd565b60006101746102ae8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610408565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610413565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906101749061041e565b606061017482610622565b600061017461035a8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610638565b60006101746103958360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61071e565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610821565b60006101746104038360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6108b1565b60006101748261071e565b606061017482610821565b606060008061042c84610920565b9193509091506001905081600181111561044857610448610ffe565b1461049a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064015b60405180910390fd5b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816104b35790505090506000835b8651811015610617576020821061055f5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610491565b60008061059c6040518060400160405280858c60000151610580919061102d565b8152602001858c602001516105959190611044565b9052610920565b5091509150604051806040016040528083836105b89190611044565b8152602001848b602001516105cd9190611044565b8152508585815181106105e2576105e2610f67565b60209081029190910101526105f8600185611044565b93506106048183611044565b61060e9084611044565b925050506104e0565b508152949350505050565b6060610174826020015160008460000151610c71565b805160009060011461068c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020626f6f6c65616e2076616c75652e0000000000006044820152606401610491565b6020820151805160001a8015806106a35750806001145b6107155760405162461bcd60e51b815260206004820152603860248201527f4c69625f524c505265616465723a20496e76616c696420524c5020626f6f6c6560448201527f616e2076616c75652c206d7573742062652030206f72203100000000000000006064820152608401610491565b15159392505050565b60006021826000015111156107755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b600080600061078385610920565b91945092509050600081600181111561079e5761079e610ffe565b146107eb5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b60008386602001516107fd9190611044565b805190915060208410156108175760208490036101000a90045b9695505050505050565b6060600080600061083185610920565b91945092509050600081600181111561084c5761084c610ffe565b146108995760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610491565b6108a885602001518484610c71565b95945050505050565b8051600090600114156108c657506000919050565b81516015146109175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020616464726573732076616c75652e0000000000006044820152606401610491565b61017482610408565b6000806000808460000151116109785760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610491565b6020840151805160001a607f811161099d576000600160009450945094505050610c6a565b60b78111610a195760006109b260808361102d565b905080876000015111610a075760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610491565b60019550935060009250610c6a915050565b60bf8111610b08576000610a2e60b78361102d565b905080876000015111610a835760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610491565b600183015160208290036101000a9004610a9d8183611044565b885111610aec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610491565b610af7826001611044565b9650945060009350610c6a92505050565b60f78111610b83576000610b1d60c08361102d565b905080876000015111610b725760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610491565b600195509350849250610c6a915050565b6000610b9060f78361102d565b905080876000015111610be55760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610491565b600183015160208290036101000a9004610bff8183611044565b885111610c4e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610491565b610c59826001611044565b9650945060019350610c6a92505050565b9193909250565b606060008267ffffffffffffffff811115610c8e57610c8e610d6b565b6040519080825280601f01601f191660200182016040528015610cb8576020820181803683370190505b509050805160001415610ccc579050610d64565b6000610cd88587611044565b90506020820160005b610cec60208761105c565b811015610d235782518252610d02602084611044565b9250610d0f602083611044565b915080610d1b81610fc5565b915050610ce1565b5080519151601f86166020036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192831692191691909117905290505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610dac57600080fd5b813567ffffffffffffffff80821115610dc457600080fd5b818401915084601f830112610dd857600080fd5b813581811115610dea57610dea610d6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610e3057610e30610d6b565b81604052828152876020848701011115610e4957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610e8f57602081850181015186830182015201610e73565b81811115610ea1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610d646020830184610e69565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610f5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610f48858351610e69565b94509285019290850190600101610f0e565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ff757610ff7610f96565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008282101561103f5761103f610f96565b500390565b6000821982111561105757611057610f96565b500190565b600082611092577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122059e898ba421fd3e38c981e9e58a793557d1678ef974e3e0ab630838541b117c964736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80635f71b98d1161005b5780635f71b98d146100e857806384147d531461010b5780638b33268b1461011e578063a39d36711461013157600080fd5b806316b3269e1461008257806331d12cd3146100a8578063359835b5146100c8575b600080fd5b610095610090366004610d9a565b610169565b6040519081526020015b60405180910390f35b6100bb6100b6366004610d9a565b61017a565b60405161009f9190610ed4565b6100db6100d6366004610d9a565b610185565b60405161009f9190610ee7565b6100fb6100f6366004610d9a565b61024c565b604051901515815260200161009f565b610095610119366004610d9a565b610257565b6100bb61012c366004610d9a565b610262565b61014461013f366004610d9a565b61026d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b600061017482610278565b92915050565b6060610174826102b3565b60606000610192836102e6565b90506000815167ffffffffffffffff8111156101b0576101b0610d6b565b6040519080825280602002602001820160405280156101e357816020015b60608152602001906001900390816101ce5790505b50905060005b81518110156102445761021483828151811061020757610207610f67565b6020026020010151610319565b82828151811061022657610226610f67565b6020026020010181905250808061023c90610fc5565b9150506101e9565b509392505050565b600061017482610324565b60006101748261035f565b60606101748261039a565b6000610174826103cd565b60006101746102ae8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610408565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610413565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906101749061041e565b606061017482610622565b600061017461035a8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610638565b60006101746103958360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61071e565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610821565b60006101746104038360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6108b1565b60006101748261071e565b606061017482610821565b606060008061042c84610920565b9193509091506001905081600181111561044857610448610ffe565b1461049a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064015b60405180910390fd5b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816104b35790505090506000835b8651811015610617576020821061055f5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610491565b60008061059c6040518060400160405280858c60000151610580919061102d565b8152602001858c602001516105959190611044565b9052610920565b5091509150604051806040016040528083836105b89190611044565b8152602001848b602001516105cd9190611044565b8152508585815181106105e2576105e2610f67565b60209081029190910101526105f8600185611044565b93506106048183611044565b61060e9084611044565b925050506104e0565b508152949350505050565b6060610174826020015160008460000151610c71565b805160009060011461068c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020626f6f6c65616e2076616c75652e0000000000006044820152606401610491565b6020820151805160001a8015806106a35750806001145b6107155760405162461bcd60e51b815260206004820152603860248201527f4c69625f524c505265616465723a20496e76616c696420524c5020626f6f6c6560448201527f616e2076616c75652c206d7573742062652030206f72203100000000000000006064820152608401610491565b15159392505050565b60006021826000015111156107755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b600080600061078385610920565b91945092509050600081600181111561079e5761079e610ffe565b146107eb5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b60008386602001516107fd9190611044565b805190915060208410156108175760208490036101000a90045b9695505050505050565b6060600080600061083185610920565b91945092509050600081600181111561084c5761084c610ffe565b146108995760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610491565b6108a885602001518484610c71565b95945050505050565b8051600090600114156108c657506000919050565b81516015146109175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020616464726573732076616c75652e0000000000006044820152606401610491565b61017482610408565b6000806000808460000151116109785760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610491565b6020840151805160001a607f811161099d576000600160009450945094505050610c6a565b60b78111610a195760006109b260808361102d565b905080876000015111610a075760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610491565b60019550935060009250610c6a915050565b60bf8111610b08576000610a2e60b78361102d565b905080876000015111610a835760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610491565b600183015160208290036101000a9004610a9d8183611044565b885111610aec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610491565b610af7826001611044565b9650945060009350610c6a92505050565b60f78111610b83576000610b1d60c08361102d565b905080876000015111610b725760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610491565b600195509350849250610c6a915050565b6000610b9060f78361102d565b905080876000015111610be55760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610491565b600183015160208290036101000a9004610bff8183611044565b885111610c4e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610491565b610c59826001611044565b9650945060019350610c6a92505050565b9193909250565b606060008267ffffffffffffffff811115610c8e57610c8e610d6b565b6040519080825280601f01601f191660200182016040528015610cb8576020820181803683370190505b509050805160001415610ccc579050610d64565b6000610cd88587611044565b90506020820160005b610cec60208761105c565b811015610d235782518252610d02602084611044565b9250610d0f602083611044565b915080610d1b81610fc5565b915050610ce1565b5080519151601f86166020036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192831692191691909117905290505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610dac57600080fd5b813567ffffffffffffffff80821115610dc457600080fd5b818401915084601f830112610dd857600080fd5b813581811115610dea57610dea610d6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610e3057610e30610d6b565b81604052828152876020848701011115610e4957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610e8f57602081850181015186830182015201610e73565b81811115610ea1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610d646020830184610e69565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610f5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610f48858351610e69565b94509285019290850190600101610f0e565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ff757610ff7610f96565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008282101561103f5761103f610f96565b500390565b6000821982111561105757611057610f96565b500190565b600082611092577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122059e898ba421fd3e38c981e9e58a793557d1678ef974e3e0ab630838541b117c964736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506110a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635f71b98d1161005b5780635f71b98d146100e857806384147d531461010b5780638b33268b1461011e578063a39d36711461013157600080fd5b806316b3269e1461008257806331d12cd3146100a8578063359835b5146100c8575b600080fd5b610095610090366004610d9a565b610169565b6040519081526020015b60405180910390f35b6100bb6100b6366004610d9a565b61017a565b60405161009f9190610ed4565b6100db6100d6366004610d9a565b610185565b60405161009f9190610ee7565b6100fb6100f6366004610d9a565b61024c565b604051901515815260200161009f565b610095610119366004610d9a565b610257565b6100bb61012c366004610d9a565b610262565b61014461013f366004610d9a565b61026d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b600061017482610278565b92915050565b6060610174826102b3565b60606000610192836102e6565b90506000815167ffffffffffffffff8111156101b0576101b0610d6b565b6040519080825280602002602001820160405280156101e357816020015b60608152602001906001900390816101ce5790505b50905060005b81518110156102445761021483828151811061020757610207610f67565b6020026020010151610319565b82828151811061022657610226610f67565b6020026020010181905250808061023c90610fc5565b9150506101e9565b509392505050565b600061017482610324565b60006101748261035f565b60606101748261039a565b6000610174826103cd565b60006101746102ae8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610408565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610413565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906101749061041e565b606061017482610622565b600061017461035a8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610638565b60006101746103958360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61071e565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610821565b60006101746104038360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6108b1565b60006101748261071e565b606061017482610821565b606060008061042c84610920565b9193509091506001905081600181111561044857610448610ffe565b1461049a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064015b60405180910390fd5b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816104b35790505090506000835b8651811015610617576020821061055f5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610491565b60008061059c6040518060400160405280858c60000151610580919061102d565b8152602001858c602001516105959190611044565b9052610920565b5091509150604051806040016040528083836105b89190611044565b8152602001848b602001516105cd9190611044565b8152508585815181106105e2576105e2610f67565b60209081029190910101526105f8600185611044565b93506106048183611044565b61060e9084611044565b925050506104e0565b508152949350505050565b6060610174826020015160008460000151610c71565b805160009060011461068c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020626f6f6c65616e2076616c75652e0000000000006044820152606401610491565b6020820151805160001a8015806106a35750806001145b6107155760405162461bcd60e51b815260206004820152603860248201527f4c69625f524c505265616465723a20496e76616c696420524c5020626f6f6c6560448201527f616e2076616c75652c206d7573742062652030206f72203100000000000000006064820152608401610491565b15159392505050565b60006021826000015111156107755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b600080600061078385610920565b91945092509050600081600181111561079e5761079e610ffe565b146107eb5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b60008386602001516107fd9190611044565b805190915060208410156108175760208490036101000a90045b9695505050505050565b6060600080600061083185610920565b91945092509050600081600181111561084c5761084c610ffe565b146108995760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610491565b6108a885602001518484610c71565b95945050505050565b8051600090600114156108c657506000919050565b81516015146109175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020616464726573732076616c75652e0000000000006044820152606401610491565b61017482610408565b6000806000808460000151116109785760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610491565b6020840151805160001a607f811161099d576000600160009450945094505050610c6a565b60b78111610a195760006109b260808361102d565b905080876000015111610a075760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610491565b60019550935060009250610c6a915050565b60bf8111610b08576000610a2e60b78361102d565b905080876000015111610a835760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610491565b600183015160208290036101000a9004610a9d8183611044565b885111610aec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610491565b610af7826001611044565b9650945060009350610c6a92505050565b60f78111610b83576000610b1d60c08361102d565b905080876000015111610b725760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610491565b600195509350849250610c6a915050565b6000610b9060f78361102d565b905080876000015111610be55760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610491565b600183015160208290036101000a9004610bff8183611044565b885111610c4e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610491565b610c59826001611044565b9650945060019350610c6a92505050565b9193909250565b606060008267ffffffffffffffff811115610c8e57610c8e610d6b565b6040519080825280601f01601f191660200182016040528015610cb8576020820181803683370190505b509050805160001415610ccc579050610d64565b6000610cd88587611044565b90506020820160005b610cec60208761105c565b811015610d235782518252610d02602084611044565b9250610d0f602083611044565b915080610d1b81610fc5565b915050610ce1565b5080519151601f86166020036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192831692191691909117905290505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610dac57600080fd5b813567ffffffffffffffff80821115610dc457600080fd5b818401915084601f830112610dd857600080fd5b813581811115610dea57610dea610d6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610e3057610e30610d6b565b81604052828152876020848701011115610e4957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610e8f57602081850181015186830182015201610e73565b81811115610ea1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610d646020830184610e69565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610f5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610f48858351610e69565b94509285019290850190600101610f0e565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ff757610ff7610f96565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008282101561103f5761103f610f96565b500390565b6000821982111561105757611057610f96565b500190565b600082611092577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80635f71b98d1161005b5780635f71b98d146100e857806384147d531461010b5780638b33268b1461011e578063a39d36711461013157600080fd5b806316b3269e1461008257806331d12cd3146100a8578063359835b5146100c8575b600080fd5b610095610090366004610d9a565b610169565b6040519081526020015b60405180910390f35b6100bb6100b6366004610d9a565b61017a565b60405161009f9190610ed4565b6100db6100d6366004610d9a565b610185565b60405161009f9190610ee7565b6100fb6100f6366004610d9a565b61024c565b604051901515815260200161009f565b610095610119366004610d9a565b610257565b6100bb61012c366004610d9a565b610262565b61014461013f366004610d9a565b61026d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b600061017482610278565b92915050565b6060610174826102b3565b60606000610192836102e6565b90506000815167ffffffffffffffff8111156101b0576101b0610d6b565b6040519080825280602002602001820160405280156101e357816020015b60608152602001906001900390816101ce5790505b50905060005b81518110156102445761021483828151811061020757610207610f67565b6020026020010151610319565b82828151811061022657610226610f67565b6020026020010181905250808061023c90610fc5565b9150506101e9565b509392505050565b600061017482610324565b60006101748261035f565b60606101748261039a565b6000610174826103cd565b60006101746102ae8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610408565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610413565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906101749061041e565b606061017482610622565b600061017461035a8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610638565b60006101746103958360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61071e565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610821565b60006101746104038360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6108b1565b60006101748261071e565b606061017482610821565b606060008061042c84610920565b9193509091506001905081600181111561044857610448610ffe565b1461049a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064015b60405180910390fd5b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816104b35790505090506000835b8651811015610617576020821061055f5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610491565b60008061059c6040518060400160405280858c60000151610580919061102d565b8152602001858c602001516105959190611044565b9052610920565b5091509150604051806040016040528083836105b89190611044565b8152602001848b602001516105cd9190611044565b8152508585815181106105e2576105e2610f67565b60209081029190910101526105f8600185611044565b93506106048183611044565b61060e9084611044565b925050506104e0565b508152949350505050565b6060610174826020015160008460000151610c71565b805160009060011461068c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020626f6f6c65616e2076616c75652e0000000000006044820152606401610491565b6020820151805160001a8015806106a35750806001145b6107155760405162461bcd60e51b815260206004820152603860248201527f4c69625f524c505265616465723a20496e76616c696420524c5020626f6f6c6560448201527f616e2076616c75652c206d7573742062652030206f72203100000000000000006064820152608401610491565b15159392505050565b60006021826000015111156107755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b600080600061078385610920565b91945092509050600081600181111561079e5761079e610ffe565b146107eb5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b60008386602001516107fd9190611044565b805190915060208410156108175760208490036101000a90045b9695505050505050565b6060600080600061083185610920565b91945092509050600081600181111561084c5761084c610ffe565b146108995760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610491565b6108a885602001518484610c71565b95945050505050565b8051600090600114156108c657506000919050565b81516015146109175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020616464726573732076616c75652e0000000000006044820152606401610491565b61017482610408565b6000806000808460000151116109785760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610491565b6020840151805160001a607f811161099d576000600160009450945094505050610c6a565b60b78111610a195760006109b260808361102d565b905080876000015111610a075760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610491565b60019550935060009250610c6a915050565b60bf8111610b08576000610a2e60b78361102d565b905080876000015111610a835760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610491565b600183015160208290036101000a9004610a9d8183611044565b885111610aec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610491565b610af7826001611044565b9650945060009350610c6a92505050565b60f78111610b83576000610b1d60c08361102d565b905080876000015111610b725760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610491565b600195509350849250610c6a915050565b6000610b9060f78361102d565b905080876000015111610be55760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610491565b600183015160208290036101000a9004610bff8183611044565b885111610c4e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610491565b610c59826001611044565b9650945060019350610c6a92505050565b9193909250565b606060008267ffffffffffffffff811115610c8e57610c8e610d6b565b6040519080825280601f01601f191660200182016040528015610cb8576020820181803683370190505b509050805160001415610ccc579050610d64565b6000610cd88587611044565b90506020820160005b610cec60208761105c565b811015610d235782518252610d02602084611044565b9250610d0f602083611044565b915080610d1b81610fc5565b915050610ce1565b5080519151601f86166020036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192831692191691909117905290505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610dac57600080fd5b813567ffffffffffffffff80821115610dc457600080fd5b818401915084601f830112610dd857600080fd5b813581811115610dea57610dea610d6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610e3057610e30610d6b565b81604052828152876020848701011115610e4957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610e8f57602081850181015186830182015201610e73565b81811115610ea1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610d646020830184610e69565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610f5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610f48858351610e69565b94509285019290850190600101610f0e565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ff757610ff7610f96565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008282101561103f5761103f610f96565b500390565b6000821982111561105757611057610f96565b500190565b600082611092577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.json +index b3297e6..9045f96 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.json +@@ -137,8 +137,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506115f6806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80637932db751161005b5780637932db75146100d157806397563ac8146100e45780639e5c65b7146100f7578063dd2062021461010a57600080fd5b80633c5cee26146100825780633cbd1712146100ab5780635e25d23f146100be575b600080fd5b61009561009036600461087b565b61011d565b6040516100a291906108cd565b60405180910390f35b6100956100b936600461091e565b61012e565b6100956100cc366004610937565b610139565b6100956100df366004610a81565b610144565b6100956100f2366004610937565b61014f565b610095610105366004610abe565b610184565b610095610118366004610b81565b61018f565b60606101288261019a565b92915050565b606061012882610254565b606061012882610267565b6060610128826102ae565b606060405161015d9061086e565b604051809103906000f080158015610179573d6000803e3d6000fd5b505061012882610267565b60606101288261031d565b606061012882610144565b60408051600180825281830190925260609160009190602082018180368337019050509050826101ea577f800000000000000000000000000000000000000000000000000000000000000061020c565b7f01000000000000000000000000000000000000000000000000000000000000005b8160008151811061021f5761021f610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535092915050565b606061012861026283610361565b6102ae565b604051606082811b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015290610128906034016040516020818303038152906040525b606080825160011480156102dc57506080836000815181106102d2576102d2610bca565b016020015160f81c105b156102e8575081610128565b6102f4835160806104cc565b83604051602001610306929190610bf9565b604051602081830303815290604052905092915050565b6060600061032a836106c3565b9050610338815160c06104cc565b8160405160200161034a929190610bf9565b604051602081830303815290604052915050919050565b606060008260405160200161037891815260200190565b604051602081830303815290604052905060005b60208110156103ea578181815181106103a7576103a7610bca565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016156103d8576103ea565b806103e281610c57565b91505061038c565b60006103f7826020610c90565b67ffffffffffffffff81111561040f5761040f61096d565b6040519080825280601f01601f191660200182016040528015610439576020820181803683370190505b50905060005b81518110156104c357838361045381610c57565b94508151811061046557610465610bca565b602001015160f81c60f81b82828151811061048257610482610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806104bb81610c57565b91505061043f565b50949350505050565b606080603884101561054b57604080516001808252818301909252906020820181803683370190505090506105018385610ca7565b60f81b8160008151811061051757610517610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506106bc565b600060015b61055a8187610cfb565b15610580578161056981610c57565b9250610579905061010082610d0f565b9050610550565b61058b826001610d4c565b67ffffffffffffffff8111156105a3576105a361096d565b6040519080825280601f01601f1916602001820160405280156105cd576020820181803683370190505b5092506105da8583610ca7565b6105e5906037610ca7565b60f81b836000815181106105fb576105fb610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116106b9576101006106438284610c90565b61064f90610100610e84565b6106599088610cfb565b6106639190610e90565b60f81b83828151811061067857610678610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806106b181610c57565b91505061062f565b50505b9392505050565b60608151600014156106e357505060408051600081526020810190915290565b6000805b835181101561072a5783818151811061070257610702610bca565b602002602001015151826107169190610d4c565b91508061072281610c57565b9150506106e7565b60008267ffffffffffffffff8111156107455761074561096d565b6040519080825280601f01601f19166020018201604052801561076f576020820181803683370190505b50600092509050602081015b85518310156104c357600086848151811061079857610798610bca565b6020026020010151905060006020820190506107b6838284516107f3565b8785815181106107c8576107c8610bca565b602002602001015151836107dc9190610d4c565b9250505082806107eb90610c57565b93505061077b565b8282825b6020811061082f578151835261080e602084610d4c565b925061081b602083610d4c565b9150610828602082610c90565b90506107f7565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b61071c80610ea583390190565b60006020828403121561088d57600080fd5b813580151581146106bc57600080fd5b60005b838110156108b85781810151838201526020016108a0565b838111156108c7576000848401525b50505050565b60208152600082518060208401526108ec81604085016020870161089d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561093057600080fd5b5035919050565b60006020828403121561094957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109e3576109e361096d565b604052919050565b600067ffffffffffffffff831115610a0557610a0561096d565b610a3660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161099c565b9050828152838383011115610a4a57600080fd5b828260208301376000602084830101529392505050565b600082601f830112610a7257600080fd5b6106bc838335602085016109eb565b600060208284031215610a9357600080fd5b813567ffffffffffffffff811115610aaa57600080fd5b610ab684828501610a61565b949350505050565b60006020808385031215610ad157600080fd5b823567ffffffffffffffff80821115610ae957600080fd5b818501915085601f830112610afd57600080fd5b813581811115610b0f57610b0f61096d565b8060051b610b1e85820161099c565b9182528381018501918581019089841115610b3857600080fd5b86860192505b83831015610b7457823585811115610b565760008081fd5b610b648b89838a0101610a61565b8352509186019190860190610b3e565b9998505050505050505050565b600060208284031215610b9357600080fd5b813567ffffffffffffffff811115610baa57600080fd5b8201601f81018413610bbb57600080fd5b610ab6848235602084016109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351610c0b81846020880161089d565b835190830190610c1f81836020880161089d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c8957610c89610c28565b5060010190565b600082821015610ca257610ca2610c28565b500390565b600060ff821660ff84168060ff03821115610cc457610cc4610c28565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610d0a57610d0a610ccc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4757610d47610c28565b500290565b60008219821115610d5f57610d5f610c28565b500190565b600181815b80851115610dbd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610da357610da3610c28565b80851615610db057918102915b93841c9390800290610d69565b509250929050565b600082610dd457506001610128565b81610de157506000610128565b8160018114610df75760028114610e0157610e1d565b6001915050610128565b60ff841115610e1257610e12610c28565b50506001821b610128565b5060208310610133831016604e8410600b8410161715610e40575081810a610128565b610e4a8383610d64565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e7c57610e7c610c28565b029392505050565b60006106bc8383610dc5565b600082610e9f57610e9f610ccc565b50069056fe608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033a264697066735822122038f74275603878d0c91c035d2901f93257dda376e2bbaab6337b4d33724838e864736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80637932db751161005b5780637932db75146100d157806397563ac8146100e45780639e5c65b7146100f7578063dd2062021461010a57600080fd5b80633c5cee26146100825780633cbd1712146100ab5780635e25d23f146100be575b600080fd5b61009561009036600461087b565b61011d565b6040516100a291906108cd565b60405180910390f35b6100956100b936600461091e565b61012e565b6100956100cc366004610937565b610139565b6100956100df366004610a81565b610144565b6100956100f2366004610937565b61014f565b610095610105366004610abe565b610184565b610095610118366004610b81565b61018f565b60606101288261019a565b92915050565b606061012882610254565b606061012882610267565b6060610128826102ae565b606060405161015d9061086e565b604051809103906000f080158015610179573d6000803e3d6000fd5b505061012882610267565b60606101288261031d565b606061012882610144565b60408051600180825281830190925260609160009190602082018180368337019050509050826101ea577f800000000000000000000000000000000000000000000000000000000000000061020c565b7f01000000000000000000000000000000000000000000000000000000000000005b8160008151811061021f5761021f610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535092915050565b606061012861026283610361565b6102ae565b604051606082811b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015290610128906034016040516020818303038152906040525b606080825160011480156102dc57506080836000815181106102d2576102d2610bca565b016020015160f81c105b156102e8575081610128565b6102f4835160806104cc565b83604051602001610306929190610bf9565b604051602081830303815290604052905092915050565b6060600061032a836106c3565b9050610338815160c06104cc565b8160405160200161034a929190610bf9565b604051602081830303815290604052915050919050565b606060008260405160200161037891815260200190565b604051602081830303815290604052905060005b60208110156103ea578181815181106103a7576103a7610bca565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016156103d8576103ea565b806103e281610c57565b91505061038c565b60006103f7826020610c90565b67ffffffffffffffff81111561040f5761040f61096d565b6040519080825280601f01601f191660200182016040528015610439576020820181803683370190505b50905060005b81518110156104c357838361045381610c57565b94508151811061046557610465610bca565b602001015160f81c60f81b82828151811061048257610482610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806104bb81610c57565b91505061043f565b50949350505050565b606080603884101561054b57604080516001808252818301909252906020820181803683370190505090506105018385610ca7565b60f81b8160008151811061051757610517610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506106bc565b600060015b61055a8187610cfb565b15610580578161056981610c57565b9250610579905061010082610d0f565b9050610550565b61058b826001610d4c565b67ffffffffffffffff8111156105a3576105a361096d565b6040519080825280601f01601f1916602001820160405280156105cd576020820181803683370190505b5092506105da8583610ca7565b6105e5906037610ca7565b60f81b836000815181106105fb576105fb610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116106b9576101006106438284610c90565b61064f90610100610e84565b6106599088610cfb565b6106639190610e90565b60f81b83828151811061067857610678610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806106b181610c57565b91505061062f565b50505b9392505050565b60608151600014156106e357505060408051600081526020810190915290565b6000805b835181101561072a5783818151811061070257610702610bca565b602002602001015151826107169190610d4c565b91508061072281610c57565b9150506106e7565b60008267ffffffffffffffff8111156107455761074561096d565b6040519080825280601f01601f19166020018201604052801561076f576020820181803683370190505b50600092509050602081015b85518310156104c357600086848151811061079857610798610bca565b6020026020010151905060006020820190506107b6838284516107f3565b8785815181106107c8576107c8610bca565b602002602001015151836107dc9190610d4c565b9250505082806107eb90610c57565b93505061077b565b8282825b6020811061082f578151835261080e602084610d4c565b925061081b602083610d4c565b9150610828602082610c90565b90506107f7565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b61071c80610ea583390190565b60006020828403121561088d57600080fd5b813580151581146106bc57600080fd5b60005b838110156108b85781810151838201526020016108a0565b838111156108c7576000848401525b50505050565b60208152600082518060208401526108ec81604085016020870161089d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561093057600080fd5b5035919050565b60006020828403121561094957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109e3576109e361096d565b604052919050565b600067ffffffffffffffff831115610a0557610a0561096d565b610a3660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161099c565b9050828152838383011115610a4a57600080fd5b828260208301376000602084830101529392505050565b600082601f830112610a7257600080fd5b6106bc838335602085016109eb565b600060208284031215610a9357600080fd5b813567ffffffffffffffff811115610aaa57600080fd5b610ab684828501610a61565b949350505050565b60006020808385031215610ad157600080fd5b823567ffffffffffffffff80821115610ae957600080fd5b818501915085601f830112610afd57600080fd5b813581811115610b0f57610b0f61096d565b8060051b610b1e85820161099c565b9182528381018501918581019089841115610b3857600080fd5b86860192505b83831015610b7457823585811115610b565760008081fd5b610b648b89838a0101610a61565b8352509186019190860190610b3e565b9998505050505050505050565b600060208284031215610b9357600080fd5b813567ffffffffffffffff811115610baa57600080fd5b8201601f81018413610bbb57600080fd5b610ab6848235602084016109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351610c0b81846020880161089d565b835190830190610c1f81836020880161089d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c8957610c89610c28565b5060010190565b600082821015610ca257610ca2610c28565b500390565b600060ff821660ff84168060ff03821115610cc457610cc4610c28565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610d0a57610d0a610ccc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4757610d47610c28565b500290565b60008219821115610d5f57610d5f610c28565b500190565b600181815b80851115610dbd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610da357610da3610c28565b80851615610db057918102915b93841c9390800290610d69565b509250929050565b600082610dd457506001610128565b81610de157506000610128565b8160018114610df75760028114610e0157610e1d565b6001915050610128565b60ff841115610e1257610e12610c28565b50506001821b610128565b5060208310610133831016604e8410600b8410161715610e40575081810a610128565b610e4a8383610d64565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e7c57610e7c610c28565b029392505050565b60006106bc8383610dc5565b600082610e9f57610e9f610ccc565b50069056fe608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033a264697066735822122038f74275603878d0c91c035d2901f93257dda376e2bbaab6337b4d33724838e864736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506115a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80637932db751161005b5780637932db75146100d157806397563ac8146100e45780639e5c65b7146100f7578063dd2062021461010a57600080fd5b80633c5cee26146100825780633cbd1712146100ab5780635e25d23f146100be575b600080fd5b61009561009036600461087b565b61011d565b6040516100a291906108cd565b60405180910390f35b6100956100b936600461091e565b61012e565b6100956100cc366004610937565b610139565b6100956100df366004610a81565b610144565b6100956100f2366004610937565b61014f565b610095610105366004610abe565b610184565b610095610118366004610b81565b61018f565b60606101288261019a565b92915050565b606061012882610254565b606061012882610267565b6060610128826102ae565b606060405161015d9061086e565b604051809103906000f080158015610179573d6000803e3d6000fd5b505061012882610267565b60606101288261031d565b606061012882610144565b60408051600180825281830190925260609160009190602082018180368337019050509050826101ea577f800000000000000000000000000000000000000000000000000000000000000061020c565b7f01000000000000000000000000000000000000000000000000000000000000005b8160008151811061021f5761021f610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535092915050565b606061012861026283610361565b6102ae565b604051606082811b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015290610128906034016040516020818303038152906040525b606080825160011480156102dc57506080836000815181106102d2576102d2610bca565b016020015160f81c105b156102e8575081610128565b6102f4835160806104cc565b83604051602001610306929190610bf9565b604051602081830303815290604052905092915050565b6060600061032a836106c3565b9050610338815160c06104cc565b8160405160200161034a929190610bf9565b604051602081830303815290604052915050919050565b606060008260405160200161037891815260200190565b604051602081830303815290604052905060005b60208110156103ea578181815181106103a7576103a7610bca565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016156103d8576103ea565b806103e281610c57565b91505061038c565b60006103f7826020610c90565b67ffffffffffffffff81111561040f5761040f61096d565b6040519080825280601f01601f191660200182016040528015610439576020820181803683370190505b50905060005b81518110156104c357838361045381610c57565b94508151811061046557610465610bca565b602001015160f81c60f81b82828151811061048257610482610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806104bb81610c57565b91505061043f565b50949350505050565b606080603884101561054b57604080516001808252818301909252906020820181803683370190505090506105018385610ca7565b60f81b8160008151811061051757610517610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506106bc565b600060015b61055a8187610cfb565b15610580578161056981610c57565b9250610579905061010082610d0f565b9050610550565b61058b826001610d4c565b67ffffffffffffffff8111156105a3576105a361096d565b6040519080825280601f01601f1916602001820160405280156105cd576020820181803683370190505b5092506105da8583610ca7565b6105e5906037610ca7565b60f81b836000815181106105fb576105fb610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116106b9576101006106438284610c90565b61064f90610100610e84565b6106599088610cfb565b6106639190610e90565b60f81b83828151811061067857610678610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806106b181610c57565b91505061062f565b50505b9392505050565b60608151600014156106e357505060408051600081526020810190915290565b6000805b835181101561072a5783818151811061070257610702610bca565b602002602001015151826107169190610d4c565b91508061072281610c57565b9150506106e7565b60008267ffffffffffffffff8111156107455761074561096d565b6040519080825280601f01601f19166020018201604052801561076f576020820181803683370190505b50600092509050602081015b85518310156104c357600086848151811061079857610798610bca565b6020026020010151905060006020820190506107b6838284516107f3565b8785815181106107c8576107c8610bca565b602002602001015151836107dc9190610d4c565b9250505082806107eb90610c57565b93505061077b565b8282825b6020811061082f578151835261080e602084610d4c565b925061081b602083610d4c565b9150610828602082610c90565b90506107f7565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b6106f380610ea583390190565b60006020828403121561088d57600080fd5b813580151581146106bc57600080fd5b60005b838110156108b85781810151838201526020016108a0565b838111156108c7576000848401525b50505050565b60208152600082518060208401526108ec81604085016020870161089d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561093057600080fd5b5035919050565b60006020828403121561094957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109e3576109e361096d565b604052919050565b600067ffffffffffffffff831115610a0557610a0561096d565b610a3660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161099c565b9050828152838383011115610a4a57600080fd5b828260208301376000602084830101529392505050565b600082601f830112610a7257600080fd5b6106bc838335602085016109eb565b600060208284031215610a9357600080fd5b813567ffffffffffffffff811115610aaa57600080fd5b610ab684828501610a61565b949350505050565b60006020808385031215610ad157600080fd5b823567ffffffffffffffff80821115610ae957600080fd5b818501915085601f830112610afd57600080fd5b813581811115610b0f57610b0f61096d565b8060051b610b1e85820161099c565b9182528381018501918581019089841115610b3857600080fd5b86860192505b83831015610b7457823585811115610b565760008081fd5b610b648b89838a0101610a61565b8352509186019190860190610b3e565b9998505050505050505050565b600060208284031215610b9357600080fd5b813567ffffffffffffffff811115610baa57600080fd5b8201601f81018413610bbb57600080fd5b610ab6848235602084016109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351610c0b81846020880161089d565b835190830190610c1f81836020880161089d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c8957610c89610c28565b5060010190565b600082821015610ca257610ca2610c28565b500390565b600060ff821660ff84168060ff03821115610cc457610cc4610c28565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610d0a57610d0a610ccc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4757610d47610c28565b500290565b60008219821115610d5f57610d5f610c28565b500190565b600181815b80851115610dbd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610da357610da3610c28565b80851615610db057918102915b93841c9390800290610d69565b509250929050565b600082610dd457506001610128565b81610de157506000610128565b8160018114610df75760028114610e0157610e1d565b6001915050610128565b60ff841115610e1257610e12610c28565b50506001821b610128565b5060208310610133831016604e8410600b8410161715610e40575081810a610128565b610e4a8383610d64565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e7c57610e7c610c28565b029392505050565b60006106bc8383610dc5565b600082610e9f57610e9f610ccc565b50069056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80637932db751161005b5780637932db75146100d157806397563ac8146100e45780639e5c65b7146100f7578063dd2062021461010a57600080fd5b80633c5cee26146100825780633cbd1712146100ab5780635e25d23f146100be575b600080fd5b61009561009036600461087b565b61011d565b6040516100a291906108cd565b60405180910390f35b6100956100b936600461091e565b61012e565b6100956100cc366004610937565b610139565b6100956100df366004610a81565b610144565b6100956100f2366004610937565b61014f565b610095610105366004610abe565b610184565b610095610118366004610b81565b61018f565b60606101288261019a565b92915050565b606061012882610254565b606061012882610267565b6060610128826102ae565b606060405161015d9061086e565b604051809103906000f080158015610179573d6000803e3d6000fd5b505061012882610267565b60606101288261031d565b606061012882610144565b60408051600180825281830190925260609160009190602082018180368337019050509050826101ea577f800000000000000000000000000000000000000000000000000000000000000061020c565b7f01000000000000000000000000000000000000000000000000000000000000005b8160008151811061021f5761021f610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535092915050565b606061012861026283610361565b6102ae565b604051606082811b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015290610128906034016040516020818303038152906040525b606080825160011480156102dc57506080836000815181106102d2576102d2610bca565b016020015160f81c105b156102e8575081610128565b6102f4835160806104cc565b83604051602001610306929190610bf9565b604051602081830303815290604052905092915050565b6060600061032a836106c3565b9050610338815160c06104cc565b8160405160200161034a929190610bf9565b604051602081830303815290604052915050919050565b606060008260405160200161037891815260200190565b604051602081830303815290604052905060005b60208110156103ea578181815181106103a7576103a7610bca565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016156103d8576103ea565b806103e281610c57565b91505061038c565b60006103f7826020610c90565b67ffffffffffffffff81111561040f5761040f61096d565b6040519080825280601f01601f191660200182016040528015610439576020820181803683370190505b50905060005b81518110156104c357838361045381610c57565b94508151811061046557610465610bca565b602001015160f81c60f81b82828151811061048257610482610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806104bb81610c57565b91505061043f565b50949350505050565b606080603884101561054b57604080516001808252818301909252906020820181803683370190505090506105018385610ca7565b60f81b8160008151811061051757610517610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506106bc565b600060015b61055a8187610cfb565b15610580578161056981610c57565b9250610579905061010082610d0f565b9050610550565b61058b826001610d4c565b67ffffffffffffffff8111156105a3576105a361096d565b6040519080825280601f01601f1916602001820160405280156105cd576020820181803683370190505b5092506105da8583610ca7565b6105e5906037610ca7565b60f81b836000815181106105fb576105fb610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116106b9576101006106438284610c90565b61064f90610100610e84565b6106599088610cfb565b6106639190610e90565b60f81b83828151811061067857610678610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806106b181610c57565b91505061062f565b50505b9392505050565b60608151600014156106e357505060408051600081526020810190915290565b6000805b835181101561072a5783818151811061070257610702610bca565b602002602001015151826107169190610d4c565b91508061072281610c57565b9150506106e7565b60008267ffffffffffffffff8111156107455761074561096d565b6040519080825280601f01601f19166020018201604052801561076f576020820181803683370190505b50600092509050602081015b85518310156104c357600086848151811061079857610798610bca565b6020026020010151905060006020820190506107b6838284516107f3565b8785815181106107c8576107c8610bca565b602002602001015151836107dc9190610d4c565b9250505082806107eb90610c57565b93505061077b565b8282825b6020811061082f578151835261080e602084610d4c565b925061081b602083610d4c565b9150610828602082610c90565b90506107f7565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b6106f380610ea583390190565b60006020828403121561088d57600080fd5b813580151581146106bc57600080fd5b60005b838110156108b85781810151838201526020016108a0565b838111156108c7576000848401525b50505050565b60208152600082518060208401526108ec81604085016020870161089d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561093057600080fd5b5035919050565b60006020828403121561094957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109e3576109e361096d565b604052919050565b600067ffffffffffffffff831115610a0557610a0561096d565b610a3660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161099c565b9050828152838383011115610a4a57600080fd5b828260208301376000602084830101529392505050565b600082601f830112610a7257600080fd5b6106bc838335602085016109eb565b600060208284031215610a9357600080fd5b813567ffffffffffffffff811115610aaa57600080fd5b610ab684828501610a61565b949350505050565b60006020808385031215610ad157600080fd5b823567ffffffffffffffff80821115610ae957600080fd5b818501915085601f830112610afd57600080fd5b813581811115610b0f57610b0f61096d565b8060051b610b1e85820161099c565b9182528381018501918581019089841115610b3857600080fd5b86860192505b83831015610b7457823585811115610b565760008081fd5b610b648b89838a0101610a61565b8352509186019190860190610b3e565b9998505050505050505050565b600060208284031215610b9357600080fd5b813567ffffffffffffffff811115610baa57600080fd5b8201601f81018413610bbb57600080fd5b610ab6848235602084016109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351610c0b81846020880161089d565b835190830190610c1f81836020880161089d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c8957610c89610c28565b5060010190565b600082821015610ca257610ca2610c28565b500390565b600060ff821660ff84168060ff03821115610cc457610cc4610c28565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610d0a57610d0a610ccc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4757610d47610c28565b500290565b60008219821115610d5f57610d5f610c28565b500190565b600181815b80851115610dbd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610da357610da3610c28565b80851615610db057918102915b93841c9390800290610d69565b509250929050565b600082610dd457506001610128565b81610de157506000610128565b8160018114610df75760028114610e0157610e1d565b6001915050610128565b60ff841115610e1257610e12610c28565b50506001821b610128565b5060208310610133831016604e8410600b8410161715610e40575081810a610128565b610e4a8383610d64565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e7c57610e7c610c28565b029392505050565b60006106bc8383610dc5565b600082610e9f57610e9f610ccc565b50069056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.json +index 92b206e..2f99f14 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.json +@@ -42,8 +42,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50610147806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063689992b31461003b5780637528c2c614610077575b600080fd5b61004e6100493660046100d4565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046100d4565b6100b6565b60007fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef82015b92915050565b600073111100000000000000000000000000000000111182016100b0565b6000602082840312156100e657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461010a57600080fd5b939250505056fea26469706673582212201457f8e5542f32e181572128a997cc6ed282c1dc72f41d4fd52b102e52787f8e64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063689992b31461003b5780637528c2c614610077575b600080fd5b61004e6100493660046100d4565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046100d4565b6100b6565b60007fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef82015b92915050565b600073111100000000000000000000000000000000111182016100b0565b6000602082840312156100e657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461010a57600080fd5b939250505056fea26469706673582212201457f8e5542f32e181572128a997cc6ed282c1dc72f41d4fd52b102e52787f8e64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061011e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063689992b31461003b5780637528c2c614610077575b600080fd5b61004e6100493660046100d4565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046100d4565b6100b6565b60007fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef82015b92915050565b600073111100000000000000000000000000000000111182016100b0565b6000602082840312156100e657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461010a57600080fd5b939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063689992b31461003b5780637528c2c614610077575b600080fd5b61004e6100493660046100d4565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046100d4565b6100b6565b60007fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef82015b92915050565b600073111100000000000000000000000000000000111182016100b0565b6000602082840312156100e657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461010a57600080fd5b939250505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.json +index 5364ae2..6af2e44 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.json +@@ -130,8 +130,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50612eac806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612985565b6100d2565b604051610072929190612a22565b60405180910390f35b61008e610089366004612a7c565b6100ed565b604051908152602001610072565b61008e6100aa366004612ae0565b610102565b6100c26100bd366004612ae0565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610209565b90505b92915050565b60006101108585858561022d565b90505b949350505050565b6000610110858585856102e5565b60006060600061013885610322565b9050600080600061014a848a8961041d565b8151929550909350915015808061015e5750815b6101af5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b6000816101cb57604051806020016040528060008152506101f7565b6101f7866101da600188612b9f565b815181106101ea576101ea612bb6565b60200260200101516108b8565b919b919a509098505050505050505050565b600061021d610217846108e2565b83610a65565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561029d576102968585610209565b9050610113565b60006102a884610322565b90506000806102b883898761041d565b509150915060006102cc84848b858c610b1f565b90506102d8818a610f8c565b9998505050505050505050565b60008060006102f5878686610129565b9150915081801561031757508051602080830191909120875191880191909120145b979650505050505050565b6060600061032f83611142565b90506000815167ffffffffffffffff81111561034d5761034d6128ab565b60405190808252806020026020018201604052801561039257816020015b604080518082019091526060808252602082015281526020019060019003908161036b5790505b50905060005b82518110156104155760006103c58483815181106103b8576103b8612bb6565b6020026020010151611175565b905060405180604001604052808281526020016103e183611142565b8152508383815181106103f6576103f6612bb6565b602002602001018190525050808061040d90612be5565b915050610398565b509392505050565b6000606081808061042d876108e2565b90506000869050600080610454604051806040016040528060608152602001606081525090565b60005b8c51811015610874578c818151811061047257610472612bb6565b6020026020010151915082846104889190612c00565b9350610495600188612c00565b9650836104f9578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016101a6565b6105b6565b81515160201161055b578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016101a6565b8461056983600001516111fc565b146105b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016101a6565b6105c260106001612c00565b826020015151141561063b5785518414156105dc57610874565b60008685815181106105f0576105f0612bb6565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061061b5761061b612bb6565b6020026020010151905061062e81611224565b9650600194505050610862565b6002826020015151141561081a57600061065483611261565b905060008160008151811061066b5761066b612bb6565b016020015160f81c90506000610682600283612c47565b61068d906002612c69565b9050600061069e848360ff16611285565b905060006106ac8b8a611285565b905060006106ba83836112b6565b905060ff8516600214806106d1575060ff85166003145b15610727578083511480156106e65750808251145b156106f8576106f5818b612c00565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b60ff8516158061073a575060ff85166001145b156107ac578251811461077657507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b61079d886020015160018151811061079057610790612bb6565b6020026020010151611224565b9a509750610862945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016101a6565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016101a6565b8061086c81612be5565b915050610457565b507f80000000000000000000000000000000000000000000000000000000000000008414866108a38786611285565b909e909d50909b509950505050505050505050565b602081015180516060916100fc916108d290600190612b9f565b815181106103b8576103b8612bb6565b60606000825160026108f49190612c8c565b67ffffffffffffffff81111561090c5761090c6128ab565b6040519080825280601f01601f191660200182016040528015610936576020820181803683370190505b50905060005b8351811015610a5e57600484828151811061095957610959612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261098e836002612c8c565b8151811061099e5761099e612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106109e1576109e1612bb6565b01602001516109f3919060f81c612c47565b60f81b82610a02836002612c8c565b610a0d906001612c00565b81518110610a1d57610a1d612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610a5681612be5565b91505061093c565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610a915790505090506000610ab5856001611362565b9050610ac8610ac38261145a565b6115ac565b82600081518110610adb57610adb612bb6565b6020026020010181905250610aef846115ac565b82600181518110610b0257610b02612bb6565b6020026020010181905250610b168261161b565b95945050505050565b606082600087610b30600189612b9f565b81518110610b4057610b40612bb6565b602002602001015190506000610b558261165f565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610b715790505090506000806002846002811115610bb157610bb1612cab565b1415610caf578b5160009015610c6a5760005b60018e51610bd29190612b9f565b811015610c68576000610bfd8f8381518110610bf057610bf0612bb6565b602002602001015161165f565b6002811115610c0e57610c0e612cab565b1415610c265781610c1e81612be5565b925050610c56565b610c488e8281518110610c3b57610c3b612bb6565b6020026020010151611749565b51610c539083612c00565b91505b80610c6081612be5565b915050610bc4565b505b610c7386611749565b51610c97610c8088611749565b610c92610c8c8f6108e2565b85611285565b6112b6565b148015610ca357508651155b15610cad57600191505b505b8015610cf657610cc7610cc186611749565b89610a65565b838381518110610cd957610cd9612bb6565b6020908102919091010152610cef600183612c00565b9150610f66565b6000846002811115610d0a57610d0a612cab565b1415610d59578551610d2057610cc7858961175c565b84838381518110610d3357610d33612bb6565b6020908102919091010152610d49600183612c00565b9150610cc7610cc1876001611285565b6000610d6486611749565b90506000610d7282896112b6565b90508015610de0576000610d88836000846117e0565b9050610d9c81610d978d61197f565b6119bf565b868681518110610dae57610dae612bb6565b6020908102919091010152610dc4600186612c00565b9450610dd08383611285565b9250610ddc8983611285565b9850505b6000610dea611a0f565b9050825160001415610e0f57610e0881610e038a6108b8565b61175c565b9050610eb3565b600083600081518110610e2457610e24612bb6565b016020015160f81c9050610e39846001611285565b93506002886002811115610e4f57610e4f612cab565b1415610e8a576000610e6985610e648c6108b8565b610a65565b9050610e828383610e7d846000015161197f565b611b01565b925050610eb1565b835115610ea0576000610e6985610d978c6108b8565b610eae8282610e7d8c6108b8565b91505b505b8851610ef557610ec3818c61175c565b905080868681518110610ed857610ed8612bb6565b6020908102919091010152610eee600186612c00565b9450610f62565b610f00896001611285565b985080868681518110610f1557610f15612bb6565b6020908102919091010152610f2b600186612c00565b9450610f37898c610a65565b868681518110610f4957610f49612bb6565b6020908102919091010152610f5f600186612c00565b94505b5050505b610f7c8c610f7560018e612b9f565b8585611b8b565b9c9b505050505050505050505050565b600080610f98836108e2565b9050610fb7604051806040016040528060608152602001606081525090565b84516000906060905b801561112d5787610fd2600183612b9f565b81518110610fe257610fe2612bb6565b60200260200101519350610ff58461165f565b9250600283600281111561100b5761100b612cab565b141561103f57600061101c85611749565b9050611037866000835189516110329190612b9f565b6117e0565b95505061110e565b600183600281111561105357611053612cab565b141561109757600061106485611749565b905061107a866000835189516110329190612b9f565b8351909650156110915761108e8584611cb9565b94505b5061110e565b60008360028111156110ab576110ab612cab565b141561110e5781511561110e57600085600187516110c99190612b9f565b815181106110d9576110d9612bb6565b602001015160f81c60f81b60f81c90506110fd866000600189516110329190612b9f565b955061110a858285611b01565b9450505b83516111199061197f565b91508061112581612cda565b915050610fc0565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611d7d565b6060600080600061118585611f7c565b9194509250905060008160018111156111a0576111a0612cab565b146111ed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016101a6565b610b16856020015184846122cd565b600060208251101561121057506020015190565b818060200190518101906100fc9190612cf1565b600060606020836000015110156112455761123e836123ac565b9050611251565b61124e83611175565b90505b61125a816111fc565b9392505050565b60606100fc61128083602001516000815181106103b8576103b8612bb6565b6108e2565b6060825182106112a457506040805160208101909152600081526100fc565b6100f983838486516110329190612b9f565b6000805b8084511180156112ca5750808351115b801561134b57508281815181106112e3576112e3612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061132257611322612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061135a81612be5565b9150506112ba565b6060600082611372576000611375565b60025b90506000600285516113879190612d0a565b90506000611396826002612c69565b60ff1667ffffffffffffffff8111156113b1576113b16128ab565b6040519080825280601f01601f1916602001820160405280156113db576020820181803683370190505b5090506113e88284612d1e565b60f81b816000815181106113fe576113fe612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508086604051602001611440929190612d43565b604051602081830303815290604052935050505092915050565b606060006002835161146c9190612d72565b67ffffffffffffffff811115611484576114846128ab565b6040519080825280601f01601f1916602001820160405280156114ae576020820181803683370190505b50905060005b8151811015610a5e57836114c9826002612c8c565b6114d4906001612c00565b815181106114e4576114e4612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600485611519846002612c8c565b8151811061152957611529612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061156b5761156b612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806115a481612be5565b9150506114b4565b606080825160011480156115da57506080836000815181106115d0576115d0612bb6565b016020015160f81c105b156115e65750816100fc565b6115f2835160806123b7565b83604051602001611604929190612d43565b604051602081830303815290604052905092915050565b6040805180820190915260608082526020820152600061163a836125ae565b9050604051806040016040528082815260200161165683611142565b90529392505050565b600061166d60106001612c00565b826020015151141561168157506000919050565b6002826020015151141561170157600061169a83611261565b90506000816000815181106116b1576116b1612bb6565b016020015160f81c905060028114806116cd575060ff81166003145b156116dc575060029392505050565b60ff811615806116ef575060ff81166001145b156116fe575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f6465207479706500000000000000000000000000000060448201526064016101a6565b60606100fc61175783611261565b6125f2565b6040805180820190915260608082526020820152600061177b836115ac565b604080518082018252600080825260209182015281518083019092528251825280830190820152909150602085015180516117b890600190612b9f565b815181106117c8576117c8612bb6565b60200260200101819052506101138460200151612638565b6060816117ee81601f612c00565b101561183c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b826118478382612c00565b10156118955760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b61189f8284612c00565b845110156118ef5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101a6565b60608215801561190e5760405191506000825260208201604052611976565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561194757805183526020928301920161192f565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606060208251101561198f575090565b81805190602001206040516020016119a991815260200190565b6040516020818303038152906040529050919050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b60608152602001906001900390816119eb5790505090506000610ab5856000611362565b60408051808201909152606080825260208201526000611a3160106001612c00565b67ffffffffffffffff811115611a4957611a496128ab565b604051908082528060200260200182016040528015611a7c57816020015b6060815260200190600190039081611a675790505b50905060005b8151811015611af1576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611ad357611ad3612bb6565b60200260200101819052508080611ae990612be5565b915050611a82565b50611afb8161161b565b91505090565b604080518082019091526060808252602082015260006020835110611b2e57611b29836115ac565b611b30565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611b7357611b73612bb6565b6020026020010181905250610b168560200151612638565b60606000611b998386612c00565b67ffffffffffffffff811115611bb157611bb16128ab565b604051908082528060200260200182016040528015611bf657816020015b6040805180820190915260608082526020820152815260200190600190039081611bcf5790505b50905060005b85811015611c4e57868181518110611c1657611c16612bb6565b6020026020010151828281518110611c3057611c30612bb6565b60200260200101819052508080611c4690612be5565b915050611bfc565b5060005b83811015611caf57848181518110611c6c57611c6c612bb6565b6020026020010151828783611c819190612c00565b81518110611c9157611c91612bb6565b60200260200101819052508080611ca790612be5565b915050611c52565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611ce55790505090506000611d11611d0a86611749565b6000611362565b9050611d1f610ac38261145a565b82600081518110611d3257611d32612bb6565b6020026020010181905250602084511015611d6b578382600181518110611d5b57611d5b612bb6565b6020026020010181905250611d74565b610aef846115ac565b610b168261161b565b6060600080611d8b84611f7c565b91935090915060019050816001811115611da757611da7612cab565b14611df45760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016101a6565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611e0d5790505090506000835b8651811015611f715760208210611eb95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016101a6565b600080611ef66040518060400160405280858c60000151611eda9190612b9f565b8152602001858c60200151611eef9190612c00565b9052611f7c565b509150915060405180604001604052808383611f129190612c00565b8152602001848b60200151611f279190612c00565b815250858581518110611f3c57611f3c612bb6565b6020908102919091010152611f52600185612c00565b9350611f5e8183612c00565b611f689084612c00565b92505050611e3a565b508152949350505050565b600080600080846000015111611fd45760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016101a6565b6020840151805160001a607f8111611ff95760006001600094509450945050506122c6565b60b7811161207557600061200e608083612b9f565b9050808760000151116120635760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016101a6565b600195509350600092506122c6915050565b60bf811161216457600061208a60b783612b9f565b9050808760000151116120df5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016101a6565b600183015160208290036101000a90046120f98183612c00565b8851116121485760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016101a6565b612153826001612c00565b96509450600093506122c692505050565b60f781116121df57600061217960c083612b9f565b9050808760000151116121ce5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016101a6565b6001955093508492506122c6915050565b60006121ec60f783612b9f565b9050808760000151116122415760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016101a6565b600183015160208290036101000a900461225b8183612c00565b8851116122aa5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016101a6565b6122b5826001612c00565b96509450600193506122c692505050565b9193909250565b606060008267ffffffffffffffff8111156122ea576122ea6128ab565b6040519080825280601f01601f191660200182016040528015612314576020820181803683370190505b50905080516000141561232857905061125a565b60006123348587612c00565b90506020820160005b612348602087612d72565b81101561237f578251825261235e602084612c00565b925061236b602083612c00565b91508061237781612be5565b91505061233d565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc82612706565b606080603884101561243657604080516001808252818301909252906020820181803683370190505090506123ec8385612d1e565b60f81b8160008151811061240257612402612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124458187612d72565b1561246b578161245481612be5565b9250612464905061010082612c8c565b905061243b565b612476826001612c00565b67ffffffffffffffff81111561248e5761248e6128ab565b6040519080825280601f01601f1916602001820160405280156124b8576020820181803683370190505b5092506124c58583612d1e565b6124d0906037612d1e565b60f81b836000815181106124e6576124e6612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116125a45761010061252e8284612b9f565b61253a90610100612e6a565b6125449088612d72565b61254e9190612d0a565b60f81b83828151811061256357612563612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061259c81612be5565b91505061251a565b5050905092915050565b606060006125bb8361271c565b90506125c9815160c06123b7565b816040516020016125db929190612d43565b604051602081830303815290604052915050919050565b606060028260008151811061260957612609612bb6565b016020015161261b919060f81c612c47565b60ff1661262d576100fc826002611285565b6100fc826001611285565b60408051808201909152606080825260208201526000825167ffffffffffffffff811115612668576126686128ab565b60405190808252806020026020018201604052801561269b57816020015b60608152602001906001900390816126865790505b50905060005b83518110156126fc576126cc8482815181106126bf576126bf612bb6565b60200260200101516123ac565b8282815181106126de576126de612bb6565b602002602001018190525080806126f490612be5565b9150506126a1565b5061125a8161161b565b60606100fc8260200151600084600001516122cd565b606081516000141561273e576040805160008082526020820190925290610a5e565b6000805b83518110156127855783818151811061275d5761275d612bb6565b602002602001015151826127719190612c00565b91508061277d81612be5565b915050612742565b60008267ffffffffffffffff8111156127a0576127a06128ab565b6040519080825280601f01601f1916602001820160405280156127ca576020820181803683370190505b50600092509050602081015b85518310156119765760008684815181106127f3576127f3612bb6565b6020026020010151905060006020820190506128118382845161284e565b87858151811061282357612823612bb6565b602002602001015151836128379190612c00565b92505050828061284690612be5565b9350506127d6565b8282825b6020811061288a5781518352612869602084612c00565b9250612876602083612c00565b9150612883602082612b9f565b9050612852565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126128eb57600080fd5b813567ffffffffffffffff80821115612906576129066128ab565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561294c5761294c6128ab565b8160405283815286602085880101111561296557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561299a57600080fd5b833567ffffffffffffffff808211156129b257600080fd5b6129be878388016128da565b945060208601359150808211156129d457600080fd5b506129e1868287016128da565b925050604084013590509250925092565b60005b83811015612a0d5781810151838201526020016129f5565b83811115612a1c576000848401525b50505050565b82151581526040602082015260008251806040840152612a498160608501602087016129f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612a8f57600080fd5b823567ffffffffffffffff80821115612aa757600080fd5b612ab3868387016128da565b93506020850135915080821115612ac957600080fd5b50612ad6858286016128da565b9150509250929050565b60008060008060808587031215612af657600080fd5b843567ffffffffffffffff80821115612b0e57600080fd5b612b1a888389016128da565b95506020870135915080821115612b3057600080fd5b612b3c888389016128da565b94506040870135915080821115612b5257600080fd5b50612b5f878288016128da565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612bb157612bb1612b70565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612bf957612bf9612b70565b5060010190565b60008219821115612c1357612c13612b70565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612c5a57612c5a612c18565b8060ff84160691505092915050565b600060ff821660ff841680821015612c8357612c83612b70565b90039392505050565b6000816000190483118215151615612ca657612ca6612b70565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612ce957612ce9612b70565b506000190190565b600060208284031215612d0357600080fd5b5051919050565b600082612d1957612d19612c18565b500690565b600060ff821660ff84168060ff03821115612d3b57612d3b612b70565b019392505050565b60008351612d558184602088016129f2565b835190830190612d698183602088016129f2565b01949350505050565b600082612d8157612d81612c18565b500490565b600181815b80851115612dc1578160001904821115612da757612da7612b70565b80851615612db457918102915b93841c9390800290612d8b565b509250929050565b600082612dd8575060016100fc565b81612de5575060006100fc565b8160018114612dfb5760028114612e0557612e21565b60019150506100fc565b60ff841115612e1657612e16612b70565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612e44575081810a6100fc565b612e4e8383612d86565b8060001904821115612e6257612e62612b70565b029392505050565b60006100f98383612dc956fea264697066735822122090f43b23c7dd430df0f01610036ee696897e2e1feadd71f1c703ee1272469a6a64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612985565b6100d2565b604051610072929190612a22565b60405180910390f35b61008e610089366004612a7c565b6100ed565b604051908152602001610072565b61008e6100aa366004612ae0565b610102565b6100c26100bd366004612ae0565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610209565b90505b92915050565b60006101108585858561022d565b90505b949350505050565b6000610110858585856102e5565b60006060600061013885610322565b9050600080600061014a848a8961041d565b8151929550909350915015808061015e5750815b6101af5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b6000816101cb57604051806020016040528060008152506101f7565b6101f7866101da600188612b9f565b815181106101ea576101ea612bb6565b60200260200101516108b8565b919b919a509098505050505050505050565b600061021d610217846108e2565b83610a65565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561029d576102968585610209565b9050610113565b60006102a884610322565b90506000806102b883898761041d565b509150915060006102cc84848b858c610b1f565b90506102d8818a610f8c565b9998505050505050505050565b60008060006102f5878686610129565b9150915081801561031757508051602080830191909120875191880191909120145b979650505050505050565b6060600061032f83611142565b90506000815167ffffffffffffffff81111561034d5761034d6128ab565b60405190808252806020026020018201604052801561039257816020015b604080518082019091526060808252602082015281526020019060019003908161036b5790505b50905060005b82518110156104155760006103c58483815181106103b8576103b8612bb6565b6020026020010151611175565b905060405180604001604052808281526020016103e183611142565b8152508383815181106103f6576103f6612bb6565b602002602001018190525050808061040d90612be5565b915050610398565b509392505050565b6000606081808061042d876108e2565b90506000869050600080610454604051806040016040528060608152602001606081525090565b60005b8c51811015610874578c818151811061047257610472612bb6565b6020026020010151915082846104889190612c00565b9350610495600188612c00565b9650836104f9578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016101a6565b6105b6565b81515160201161055b578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016101a6565b8461056983600001516111fc565b146105b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016101a6565b6105c260106001612c00565b826020015151141561063b5785518414156105dc57610874565b60008685815181106105f0576105f0612bb6565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061061b5761061b612bb6565b6020026020010151905061062e81611224565b9650600194505050610862565b6002826020015151141561081a57600061065483611261565b905060008160008151811061066b5761066b612bb6565b016020015160f81c90506000610682600283612c47565b61068d906002612c69565b9050600061069e848360ff16611285565b905060006106ac8b8a611285565b905060006106ba83836112b6565b905060ff8516600214806106d1575060ff85166003145b15610727578083511480156106e65750808251145b156106f8576106f5818b612c00565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b60ff8516158061073a575060ff85166001145b156107ac578251811461077657507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b61079d886020015160018151811061079057610790612bb6565b6020026020010151611224565b9a509750610862945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016101a6565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016101a6565b8061086c81612be5565b915050610457565b507f80000000000000000000000000000000000000000000000000000000000000008414866108a38786611285565b909e909d50909b509950505050505050505050565b602081015180516060916100fc916108d290600190612b9f565b815181106103b8576103b8612bb6565b60606000825160026108f49190612c8c565b67ffffffffffffffff81111561090c5761090c6128ab565b6040519080825280601f01601f191660200182016040528015610936576020820181803683370190505b50905060005b8351811015610a5e57600484828151811061095957610959612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261098e836002612c8c565b8151811061099e5761099e612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106109e1576109e1612bb6565b01602001516109f3919060f81c612c47565b60f81b82610a02836002612c8c565b610a0d906001612c00565b81518110610a1d57610a1d612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610a5681612be5565b91505061093c565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610a915790505090506000610ab5856001611362565b9050610ac8610ac38261145a565b6115ac565b82600081518110610adb57610adb612bb6565b6020026020010181905250610aef846115ac565b82600181518110610b0257610b02612bb6565b6020026020010181905250610b168261161b565b95945050505050565b606082600087610b30600189612b9f565b81518110610b4057610b40612bb6565b602002602001015190506000610b558261165f565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610b715790505090506000806002846002811115610bb157610bb1612cab565b1415610caf578b5160009015610c6a5760005b60018e51610bd29190612b9f565b811015610c68576000610bfd8f8381518110610bf057610bf0612bb6565b602002602001015161165f565b6002811115610c0e57610c0e612cab565b1415610c265781610c1e81612be5565b925050610c56565b610c488e8281518110610c3b57610c3b612bb6565b6020026020010151611749565b51610c539083612c00565b91505b80610c6081612be5565b915050610bc4565b505b610c7386611749565b51610c97610c8088611749565b610c92610c8c8f6108e2565b85611285565b6112b6565b148015610ca357508651155b15610cad57600191505b505b8015610cf657610cc7610cc186611749565b89610a65565b838381518110610cd957610cd9612bb6565b6020908102919091010152610cef600183612c00565b9150610f66565b6000846002811115610d0a57610d0a612cab565b1415610d59578551610d2057610cc7858961175c565b84838381518110610d3357610d33612bb6565b6020908102919091010152610d49600183612c00565b9150610cc7610cc1876001611285565b6000610d6486611749565b90506000610d7282896112b6565b90508015610de0576000610d88836000846117e0565b9050610d9c81610d978d61197f565b6119bf565b868681518110610dae57610dae612bb6565b6020908102919091010152610dc4600186612c00565b9450610dd08383611285565b9250610ddc8983611285565b9850505b6000610dea611a0f565b9050825160001415610e0f57610e0881610e038a6108b8565b61175c565b9050610eb3565b600083600081518110610e2457610e24612bb6565b016020015160f81c9050610e39846001611285565b93506002886002811115610e4f57610e4f612cab565b1415610e8a576000610e6985610e648c6108b8565b610a65565b9050610e828383610e7d846000015161197f565b611b01565b925050610eb1565b835115610ea0576000610e6985610d978c6108b8565b610eae8282610e7d8c6108b8565b91505b505b8851610ef557610ec3818c61175c565b905080868681518110610ed857610ed8612bb6565b6020908102919091010152610eee600186612c00565b9450610f62565b610f00896001611285565b985080868681518110610f1557610f15612bb6565b6020908102919091010152610f2b600186612c00565b9450610f37898c610a65565b868681518110610f4957610f49612bb6565b6020908102919091010152610f5f600186612c00565b94505b5050505b610f7c8c610f7560018e612b9f565b8585611b8b565b9c9b505050505050505050505050565b600080610f98836108e2565b9050610fb7604051806040016040528060608152602001606081525090565b84516000906060905b801561112d5787610fd2600183612b9f565b81518110610fe257610fe2612bb6565b60200260200101519350610ff58461165f565b9250600283600281111561100b5761100b612cab565b141561103f57600061101c85611749565b9050611037866000835189516110329190612b9f565b6117e0565b95505061110e565b600183600281111561105357611053612cab565b141561109757600061106485611749565b905061107a866000835189516110329190612b9f565b8351909650156110915761108e8584611cb9565b94505b5061110e565b60008360028111156110ab576110ab612cab565b141561110e5781511561110e57600085600187516110c99190612b9f565b815181106110d9576110d9612bb6565b602001015160f81c60f81b60f81c90506110fd866000600189516110329190612b9f565b955061110a858285611b01565b9450505b83516111199061197f565b91508061112581612cda565b915050610fc0565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611d7d565b6060600080600061118585611f7c565b9194509250905060008160018111156111a0576111a0612cab565b146111ed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016101a6565b610b16856020015184846122cd565b600060208251101561121057506020015190565b818060200190518101906100fc9190612cf1565b600060606020836000015110156112455761123e836123ac565b9050611251565b61124e83611175565b90505b61125a816111fc565b9392505050565b60606100fc61128083602001516000815181106103b8576103b8612bb6565b6108e2565b6060825182106112a457506040805160208101909152600081526100fc565b6100f983838486516110329190612b9f565b6000805b8084511180156112ca5750808351115b801561134b57508281815181106112e3576112e3612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061132257611322612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061135a81612be5565b9150506112ba565b6060600082611372576000611375565b60025b90506000600285516113879190612d0a565b90506000611396826002612c69565b60ff1667ffffffffffffffff8111156113b1576113b16128ab565b6040519080825280601f01601f1916602001820160405280156113db576020820181803683370190505b5090506113e88284612d1e565b60f81b816000815181106113fe576113fe612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508086604051602001611440929190612d43565b604051602081830303815290604052935050505092915050565b606060006002835161146c9190612d72565b67ffffffffffffffff811115611484576114846128ab565b6040519080825280601f01601f1916602001820160405280156114ae576020820181803683370190505b50905060005b8151811015610a5e57836114c9826002612c8c565b6114d4906001612c00565b815181106114e4576114e4612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600485611519846002612c8c565b8151811061152957611529612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061156b5761156b612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806115a481612be5565b9150506114b4565b606080825160011480156115da57506080836000815181106115d0576115d0612bb6565b016020015160f81c105b156115e65750816100fc565b6115f2835160806123b7565b83604051602001611604929190612d43565b604051602081830303815290604052905092915050565b6040805180820190915260608082526020820152600061163a836125ae565b9050604051806040016040528082815260200161165683611142565b90529392505050565b600061166d60106001612c00565b826020015151141561168157506000919050565b6002826020015151141561170157600061169a83611261565b90506000816000815181106116b1576116b1612bb6565b016020015160f81c905060028114806116cd575060ff81166003145b156116dc575060029392505050565b60ff811615806116ef575060ff81166001145b156116fe575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f6465207479706500000000000000000000000000000060448201526064016101a6565b60606100fc61175783611261565b6125f2565b6040805180820190915260608082526020820152600061177b836115ac565b604080518082018252600080825260209182015281518083019092528251825280830190820152909150602085015180516117b890600190612b9f565b815181106117c8576117c8612bb6565b60200260200101819052506101138460200151612638565b6060816117ee81601f612c00565b101561183c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b826118478382612c00565b10156118955760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b61189f8284612c00565b845110156118ef5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101a6565b60608215801561190e5760405191506000825260208201604052611976565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561194757805183526020928301920161192f565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606060208251101561198f575090565b81805190602001206040516020016119a991815260200190565b6040516020818303038152906040529050919050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b60608152602001906001900390816119eb5790505090506000610ab5856000611362565b60408051808201909152606080825260208201526000611a3160106001612c00565b67ffffffffffffffff811115611a4957611a496128ab565b604051908082528060200260200182016040528015611a7c57816020015b6060815260200190600190039081611a675790505b50905060005b8151811015611af1576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611ad357611ad3612bb6565b60200260200101819052508080611ae990612be5565b915050611a82565b50611afb8161161b565b91505090565b604080518082019091526060808252602082015260006020835110611b2e57611b29836115ac565b611b30565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611b7357611b73612bb6565b6020026020010181905250610b168560200151612638565b60606000611b998386612c00565b67ffffffffffffffff811115611bb157611bb16128ab565b604051908082528060200260200182016040528015611bf657816020015b6040805180820190915260608082526020820152815260200190600190039081611bcf5790505b50905060005b85811015611c4e57868181518110611c1657611c16612bb6565b6020026020010151828281518110611c3057611c30612bb6565b60200260200101819052508080611c4690612be5565b915050611bfc565b5060005b83811015611caf57848181518110611c6c57611c6c612bb6565b6020026020010151828783611c819190612c00565b81518110611c9157611c91612bb6565b60200260200101819052508080611ca790612be5565b915050611c52565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611ce55790505090506000611d11611d0a86611749565b6000611362565b9050611d1f610ac38261145a565b82600081518110611d3257611d32612bb6565b6020026020010181905250602084511015611d6b578382600181518110611d5b57611d5b612bb6565b6020026020010181905250611d74565b610aef846115ac565b610b168261161b565b6060600080611d8b84611f7c565b91935090915060019050816001811115611da757611da7612cab565b14611df45760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016101a6565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611e0d5790505090506000835b8651811015611f715760208210611eb95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016101a6565b600080611ef66040518060400160405280858c60000151611eda9190612b9f565b8152602001858c60200151611eef9190612c00565b9052611f7c565b509150915060405180604001604052808383611f129190612c00565b8152602001848b60200151611f279190612c00565b815250858581518110611f3c57611f3c612bb6565b6020908102919091010152611f52600185612c00565b9350611f5e8183612c00565b611f689084612c00565b92505050611e3a565b508152949350505050565b600080600080846000015111611fd45760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016101a6565b6020840151805160001a607f8111611ff95760006001600094509450945050506122c6565b60b7811161207557600061200e608083612b9f565b9050808760000151116120635760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016101a6565b600195509350600092506122c6915050565b60bf811161216457600061208a60b783612b9f565b9050808760000151116120df5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016101a6565b600183015160208290036101000a90046120f98183612c00565b8851116121485760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016101a6565b612153826001612c00565b96509450600093506122c692505050565b60f781116121df57600061217960c083612b9f565b9050808760000151116121ce5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016101a6565b6001955093508492506122c6915050565b60006121ec60f783612b9f565b9050808760000151116122415760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016101a6565b600183015160208290036101000a900461225b8183612c00565b8851116122aa5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016101a6565b6122b5826001612c00565b96509450600193506122c692505050565b9193909250565b606060008267ffffffffffffffff8111156122ea576122ea6128ab565b6040519080825280601f01601f191660200182016040528015612314576020820181803683370190505b50905080516000141561232857905061125a565b60006123348587612c00565b90506020820160005b612348602087612d72565b81101561237f578251825261235e602084612c00565b925061236b602083612c00565b91508061237781612be5565b91505061233d565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc82612706565b606080603884101561243657604080516001808252818301909252906020820181803683370190505090506123ec8385612d1e565b60f81b8160008151811061240257612402612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124458187612d72565b1561246b578161245481612be5565b9250612464905061010082612c8c565b905061243b565b612476826001612c00565b67ffffffffffffffff81111561248e5761248e6128ab565b6040519080825280601f01601f1916602001820160405280156124b8576020820181803683370190505b5092506124c58583612d1e565b6124d0906037612d1e565b60f81b836000815181106124e6576124e6612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116125a45761010061252e8284612b9f565b61253a90610100612e6a565b6125449088612d72565b61254e9190612d0a565b60f81b83828151811061256357612563612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061259c81612be5565b91505061251a565b5050905092915050565b606060006125bb8361271c565b90506125c9815160c06123b7565b816040516020016125db929190612d43565b604051602081830303815290604052915050919050565b606060028260008151811061260957612609612bb6565b016020015161261b919060f81c612c47565b60ff1661262d576100fc826002611285565b6100fc826001611285565b60408051808201909152606080825260208201526000825167ffffffffffffffff811115612668576126686128ab565b60405190808252806020026020018201604052801561269b57816020015b60608152602001906001900390816126865790505b50905060005b83518110156126fc576126cc8482815181106126bf576126bf612bb6565b60200260200101516123ac565b8282815181106126de576126de612bb6565b602002602001018190525080806126f490612be5565b9150506126a1565b5061125a8161161b565b60606100fc8260200151600084600001516122cd565b606081516000141561273e576040805160008082526020820190925290610a5e565b6000805b83518110156127855783818151811061275d5761275d612bb6565b602002602001015151826127719190612c00565b91508061277d81612be5565b915050612742565b60008267ffffffffffffffff8111156127a0576127a06128ab565b6040519080825280601f01601f1916602001820160405280156127ca576020820181803683370190505b50600092509050602081015b85518310156119765760008684815181106127f3576127f3612bb6565b6020026020010151905060006020820190506128118382845161284e565b87858151811061282357612823612bb6565b602002602001015151836128379190612c00565b92505050828061284690612be5565b9350506127d6565b8282825b6020811061288a5781518352612869602084612c00565b9250612876602083612c00565b9150612883602082612b9f565b9050612852565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126128eb57600080fd5b813567ffffffffffffffff80821115612906576129066128ab565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561294c5761294c6128ab565b8160405283815286602085880101111561296557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561299a57600080fd5b833567ffffffffffffffff808211156129b257600080fd5b6129be878388016128da565b945060208601359150808211156129d457600080fd5b506129e1868287016128da565b925050604084013590509250925092565b60005b83811015612a0d5781810151838201526020016129f5565b83811115612a1c576000848401525b50505050565b82151581526040602082015260008251806040840152612a498160608501602087016129f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612a8f57600080fd5b823567ffffffffffffffff80821115612aa757600080fd5b612ab3868387016128da565b93506020850135915080821115612ac957600080fd5b50612ad6858286016128da565b9150509250929050565b60008060008060808587031215612af657600080fd5b843567ffffffffffffffff80821115612b0e57600080fd5b612b1a888389016128da565b95506020870135915080821115612b3057600080fd5b612b3c888389016128da565b94506040870135915080821115612b5257600080fd5b50612b5f878288016128da565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612bb157612bb1612b70565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612bf957612bf9612b70565b5060010190565b60008219821115612c1357612c13612b70565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612c5a57612c5a612c18565b8060ff84160691505092915050565b600060ff821660ff841680821015612c8357612c83612b70565b90039392505050565b6000816000190483118215151615612ca657612ca6612b70565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612ce957612ce9612b70565b506000190190565b600060208284031215612d0357600080fd5b5051919050565b600082612d1957612d19612c18565b500690565b600060ff821660ff84168060ff03821115612d3b57612d3b612b70565b019392505050565b60008351612d558184602088016129f2565b835190830190612d698183602088016129f2565b01949350505050565b600082612d8157612d81612c18565b500490565b600181815b80851115612dc1578160001904821115612da757612da7612b70565b80851615612db457918102915b93841c9390800290612d8b565b509250929050565b600082612dd8575060016100fc565b81612de5575060006100fc565b8160018114612dfb5760028114612e0557612e21565b60019150506100fc565b60ff841115612e1657612e16612b70565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612e44575081810a6100fc565b612e4e8383612d86565b8060001904821115612e6257612e62612b70565b029392505050565b60006100f98383612dc956fea264697066735822122090f43b23c7dd430df0f01610036ee696897e2e1feadd71f1c703ee1272469a6a64736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50612e83806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612985565b6100d2565b604051610072929190612a22565b60405180910390f35b61008e610089366004612a7c565b6100ed565b604051908152602001610072565b61008e6100aa366004612ae0565b610102565b6100c26100bd366004612ae0565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610209565b90505b92915050565b60006101108585858561022d565b90505b949350505050565b6000610110858585856102e5565b60006060600061013885610322565b9050600080600061014a848a8961041d565b8151929550909350915015808061015e5750815b6101af5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b6000816101cb57604051806020016040528060008152506101f7565b6101f7866101da600188612b9f565b815181106101ea576101ea612bb6565b60200260200101516108b8565b919b919a509098505050505050505050565b600061021d610217846108e2565b83610a65565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561029d576102968585610209565b9050610113565b60006102a884610322565b90506000806102b883898761041d565b509150915060006102cc84848b858c610b1f565b90506102d8818a610f8c565b9998505050505050505050565b60008060006102f5878686610129565b9150915081801561031757508051602080830191909120875191880191909120145b979650505050505050565b6060600061032f83611142565b90506000815167ffffffffffffffff81111561034d5761034d6128ab565b60405190808252806020026020018201604052801561039257816020015b604080518082019091526060808252602082015281526020019060019003908161036b5790505b50905060005b82518110156104155760006103c58483815181106103b8576103b8612bb6565b6020026020010151611175565b905060405180604001604052808281526020016103e183611142565b8152508383815181106103f6576103f6612bb6565b602002602001018190525050808061040d90612be5565b915050610398565b509392505050565b6000606081808061042d876108e2565b90506000869050600080610454604051806040016040528060608152602001606081525090565b60005b8c51811015610874578c818151811061047257610472612bb6565b6020026020010151915082846104889190612c00565b9350610495600188612c00565b9650836104f9578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016101a6565b6105b6565b81515160201161055b578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016101a6565b8461056983600001516111fc565b146105b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016101a6565b6105c260106001612c00565b826020015151141561063b5785518414156105dc57610874565b60008685815181106105f0576105f0612bb6565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061061b5761061b612bb6565b6020026020010151905061062e81611224565b9650600194505050610862565b6002826020015151141561081a57600061065483611261565b905060008160008151811061066b5761066b612bb6565b016020015160f81c90506000610682600283612c47565b61068d906002612c69565b9050600061069e848360ff16611285565b905060006106ac8b8a611285565b905060006106ba83836112b6565b905060ff8516600214806106d1575060ff85166003145b15610727578083511480156106e65750808251145b156106f8576106f5818b612c00565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b60ff8516158061073a575060ff85166001145b156107ac578251811461077657507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b61079d886020015160018151811061079057610790612bb6565b6020026020010151611224565b9a509750610862945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016101a6565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016101a6565b8061086c81612be5565b915050610457565b507f80000000000000000000000000000000000000000000000000000000000000008414866108a38786611285565b909e909d50909b509950505050505050505050565b602081015180516060916100fc916108d290600190612b9f565b815181106103b8576103b8612bb6565b60606000825160026108f49190612c8c565b67ffffffffffffffff81111561090c5761090c6128ab565b6040519080825280601f01601f191660200182016040528015610936576020820181803683370190505b50905060005b8351811015610a5e57600484828151811061095957610959612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261098e836002612c8c565b8151811061099e5761099e612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106109e1576109e1612bb6565b01602001516109f3919060f81c612c47565b60f81b82610a02836002612c8c565b610a0d906001612c00565b81518110610a1d57610a1d612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610a5681612be5565b91505061093c565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610a915790505090506000610ab5856001611362565b9050610ac8610ac38261145a565b6115ac565b82600081518110610adb57610adb612bb6565b6020026020010181905250610aef846115ac565b82600181518110610b0257610b02612bb6565b6020026020010181905250610b168261161b565b95945050505050565b606082600087610b30600189612b9f565b81518110610b4057610b40612bb6565b602002602001015190506000610b558261165f565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610b715790505090506000806002846002811115610bb157610bb1612cab565b1415610caf578b5160009015610c6a5760005b60018e51610bd29190612b9f565b811015610c68576000610bfd8f8381518110610bf057610bf0612bb6565b602002602001015161165f565b6002811115610c0e57610c0e612cab565b1415610c265781610c1e81612be5565b925050610c56565b610c488e8281518110610c3b57610c3b612bb6565b6020026020010151611749565b51610c539083612c00565b91505b80610c6081612be5565b915050610bc4565b505b610c7386611749565b51610c97610c8088611749565b610c92610c8c8f6108e2565b85611285565b6112b6565b148015610ca357508651155b15610cad57600191505b505b8015610cf657610cc7610cc186611749565b89610a65565b838381518110610cd957610cd9612bb6565b6020908102919091010152610cef600183612c00565b9150610f66565b6000846002811115610d0a57610d0a612cab565b1415610d59578551610d2057610cc7858961175c565b84838381518110610d3357610d33612bb6565b6020908102919091010152610d49600183612c00565b9150610cc7610cc1876001611285565b6000610d6486611749565b90506000610d7282896112b6565b90508015610de0576000610d88836000846117e0565b9050610d9c81610d978d61197f565b6119bf565b868681518110610dae57610dae612bb6565b6020908102919091010152610dc4600186612c00565b9450610dd08383611285565b9250610ddc8983611285565b9850505b6000610dea611a0f565b9050825160001415610e0f57610e0881610e038a6108b8565b61175c565b9050610eb3565b600083600081518110610e2457610e24612bb6565b016020015160f81c9050610e39846001611285565b93506002886002811115610e4f57610e4f612cab565b1415610e8a576000610e6985610e648c6108b8565b610a65565b9050610e828383610e7d846000015161197f565b611b01565b925050610eb1565b835115610ea0576000610e6985610d978c6108b8565b610eae8282610e7d8c6108b8565b91505b505b8851610ef557610ec3818c61175c565b905080868681518110610ed857610ed8612bb6565b6020908102919091010152610eee600186612c00565b9450610f62565b610f00896001611285565b985080868681518110610f1557610f15612bb6565b6020908102919091010152610f2b600186612c00565b9450610f37898c610a65565b868681518110610f4957610f49612bb6565b6020908102919091010152610f5f600186612c00565b94505b5050505b610f7c8c610f7560018e612b9f565b8585611b8b565b9c9b505050505050505050505050565b600080610f98836108e2565b9050610fb7604051806040016040528060608152602001606081525090565b84516000906060905b801561112d5787610fd2600183612b9f565b81518110610fe257610fe2612bb6565b60200260200101519350610ff58461165f565b9250600283600281111561100b5761100b612cab565b141561103f57600061101c85611749565b9050611037866000835189516110329190612b9f565b6117e0565b95505061110e565b600183600281111561105357611053612cab565b141561109757600061106485611749565b905061107a866000835189516110329190612b9f565b8351909650156110915761108e8584611cb9565b94505b5061110e565b60008360028111156110ab576110ab612cab565b141561110e5781511561110e57600085600187516110c99190612b9f565b815181106110d9576110d9612bb6565b602001015160f81c60f81b60f81c90506110fd866000600189516110329190612b9f565b955061110a858285611b01565b9450505b83516111199061197f565b91508061112581612cda565b915050610fc0565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611d7d565b6060600080600061118585611f7c565b9194509250905060008160018111156111a0576111a0612cab565b146111ed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016101a6565b610b16856020015184846122cd565b600060208251101561121057506020015190565b818060200190518101906100fc9190612cf1565b600060606020836000015110156112455761123e836123ac565b9050611251565b61124e83611175565b90505b61125a816111fc565b9392505050565b60606100fc61128083602001516000815181106103b8576103b8612bb6565b6108e2565b6060825182106112a457506040805160208101909152600081526100fc565b6100f983838486516110329190612b9f565b6000805b8084511180156112ca5750808351115b801561134b57508281815181106112e3576112e3612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061132257611322612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061135a81612be5565b9150506112ba565b6060600082611372576000611375565b60025b90506000600285516113879190612d0a565b90506000611396826002612c69565b60ff1667ffffffffffffffff8111156113b1576113b16128ab565b6040519080825280601f01601f1916602001820160405280156113db576020820181803683370190505b5090506113e88284612d1e565b60f81b816000815181106113fe576113fe612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508086604051602001611440929190612d43565b604051602081830303815290604052935050505092915050565b606060006002835161146c9190612d72565b67ffffffffffffffff811115611484576114846128ab565b6040519080825280601f01601f1916602001820160405280156114ae576020820181803683370190505b50905060005b8151811015610a5e57836114c9826002612c8c565b6114d4906001612c00565b815181106114e4576114e4612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600485611519846002612c8c565b8151811061152957611529612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061156b5761156b612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806115a481612be5565b9150506114b4565b606080825160011480156115da57506080836000815181106115d0576115d0612bb6565b016020015160f81c105b156115e65750816100fc565b6115f2835160806123b7565b83604051602001611604929190612d43565b604051602081830303815290604052905092915050565b6040805180820190915260608082526020820152600061163a836125ae565b9050604051806040016040528082815260200161165683611142565b90529392505050565b600061166d60106001612c00565b826020015151141561168157506000919050565b6002826020015151141561170157600061169a83611261565b90506000816000815181106116b1576116b1612bb6565b016020015160f81c905060028114806116cd575060ff81166003145b156116dc575060029392505050565b60ff811615806116ef575060ff81166001145b156116fe575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f6465207479706500000000000000000000000000000060448201526064016101a6565b60606100fc61175783611261565b6125f2565b6040805180820190915260608082526020820152600061177b836115ac565b604080518082018252600080825260209182015281518083019092528251825280830190820152909150602085015180516117b890600190612b9f565b815181106117c8576117c8612bb6565b60200260200101819052506101138460200151612638565b6060816117ee81601f612c00565b101561183c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b826118478382612c00565b10156118955760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b61189f8284612c00565b845110156118ef5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101a6565b60608215801561190e5760405191506000825260208201604052611976565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561194757805183526020928301920161192f565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606060208251101561198f575090565b81805190602001206040516020016119a991815260200190565b6040516020818303038152906040529050919050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b60608152602001906001900390816119eb5790505090506000610ab5856000611362565b60408051808201909152606080825260208201526000611a3160106001612c00565b67ffffffffffffffff811115611a4957611a496128ab565b604051908082528060200260200182016040528015611a7c57816020015b6060815260200190600190039081611a675790505b50905060005b8151811015611af1576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611ad357611ad3612bb6565b60200260200101819052508080611ae990612be5565b915050611a82565b50611afb8161161b565b91505090565b604080518082019091526060808252602082015260006020835110611b2e57611b29836115ac565b611b30565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611b7357611b73612bb6565b6020026020010181905250610b168560200151612638565b60606000611b998386612c00565b67ffffffffffffffff811115611bb157611bb16128ab565b604051908082528060200260200182016040528015611bf657816020015b6040805180820190915260608082526020820152815260200190600190039081611bcf5790505b50905060005b85811015611c4e57868181518110611c1657611c16612bb6565b6020026020010151828281518110611c3057611c30612bb6565b60200260200101819052508080611c4690612be5565b915050611bfc565b5060005b83811015611caf57848181518110611c6c57611c6c612bb6565b6020026020010151828783611c819190612c00565b81518110611c9157611c91612bb6565b60200260200101819052508080611ca790612be5565b915050611c52565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611ce55790505090506000611d11611d0a86611749565b6000611362565b9050611d1f610ac38261145a565b82600081518110611d3257611d32612bb6565b6020026020010181905250602084511015611d6b578382600181518110611d5b57611d5b612bb6565b6020026020010181905250611d74565b610aef846115ac565b610b168261161b565b6060600080611d8b84611f7c565b91935090915060019050816001811115611da757611da7612cab565b14611df45760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016101a6565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611e0d5790505090506000835b8651811015611f715760208210611eb95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016101a6565b600080611ef66040518060400160405280858c60000151611eda9190612b9f565b8152602001858c60200151611eef9190612c00565b9052611f7c565b509150915060405180604001604052808383611f129190612c00565b8152602001848b60200151611f279190612c00565b815250858581518110611f3c57611f3c612bb6565b6020908102919091010152611f52600185612c00565b9350611f5e8183612c00565b611f689084612c00565b92505050611e3a565b508152949350505050565b600080600080846000015111611fd45760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016101a6565b6020840151805160001a607f8111611ff95760006001600094509450945050506122c6565b60b7811161207557600061200e608083612b9f565b9050808760000151116120635760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016101a6565b600195509350600092506122c6915050565b60bf811161216457600061208a60b783612b9f565b9050808760000151116120df5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016101a6565b600183015160208290036101000a90046120f98183612c00565b8851116121485760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016101a6565b612153826001612c00565b96509450600093506122c692505050565b60f781116121df57600061217960c083612b9f565b9050808760000151116121ce5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016101a6565b6001955093508492506122c6915050565b60006121ec60f783612b9f565b9050808760000151116122415760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016101a6565b600183015160208290036101000a900461225b8183612c00565b8851116122aa5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016101a6565b6122b5826001612c00565b96509450600193506122c692505050565b9193909250565b606060008267ffffffffffffffff8111156122ea576122ea6128ab565b6040519080825280601f01601f191660200182016040528015612314576020820181803683370190505b50905080516000141561232857905061125a565b60006123348587612c00565b90506020820160005b612348602087612d72565b81101561237f578251825261235e602084612c00565b925061236b602083612c00565b91508061237781612be5565b91505061233d565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc82612706565b606080603884101561243657604080516001808252818301909252906020820181803683370190505090506123ec8385612d1e565b60f81b8160008151811061240257612402612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124458187612d72565b1561246b578161245481612be5565b9250612464905061010082612c8c565b905061243b565b612476826001612c00565b67ffffffffffffffff81111561248e5761248e6128ab565b6040519080825280601f01601f1916602001820160405280156124b8576020820181803683370190505b5092506124c58583612d1e565b6124d0906037612d1e565b60f81b836000815181106124e6576124e6612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116125a45761010061252e8284612b9f565b61253a90610100612e6a565b6125449088612d72565b61254e9190612d0a565b60f81b83828151811061256357612563612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061259c81612be5565b91505061251a565b5050905092915050565b606060006125bb8361271c565b90506125c9815160c06123b7565b816040516020016125db929190612d43565b604051602081830303815290604052915050919050565b606060028260008151811061260957612609612bb6565b016020015161261b919060f81c612c47565b60ff1661262d576100fc826002611285565b6100fc826001611285565b60408051808201909152606080825260208201526000825167ffffffffffffffff811115612668576126686128ab565b60405190808252806020026020018201604052801561269b57816020015b60608152602001906001900390816126865790505b50905060005b83518110156126fc576126cc8482815181106126bf576126bf612bb6565b60200260200101516123ac565b8282815181106126de576126de612bb6565b602002602001018190525080806126f490612be5565b9150506126a1565b5061125a8161161b565b60606100fc8260200151600084600001516122cd565b606081516000141561273e576040805160008082526020820190925290610a5e565b6000805b83518110156127855783818151811061275d5761275d612bb6565b602002602001015151826127719190612c00565b91508061277d81612be5565b915050612742565b60008267ffffffffffffffff8111156127a0576127a06128ab565b6040519080825280601f01601f1916602001820160405280156127ca576020820181803683370190505b50600092509050602081015b85518310156119765760008684815181106127f3576127f3612bb6565b6020026020010151905060006020820190506128118382845161284e565b87858151811061282357612823612bb6565b602002602001015151836128379190612c00565b92505050828061284690612be5565b9350506127d6565b8282825b6020811061288a5781518352612869602084612c00565b9250612876602083612c00565b9150612883602082612b9f565b9050612852565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126128eb57600080fd5b813567ffffffffffffffff80821115612906576129066128ab565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561294c5761294c6128ab565b8160405283815286602085880101111561296557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561299a57600080fd5b833567ffffffffffffffff808211156129b257600080fd5b6129be878388016128da565b945060208601359150808211156129d457600080fd5b506129e1868287016128da565b925050604084013590509250925092565b60005b83811015612a0d5781810151838201526020016129f5565b83811115612a1c576000848401525b50505050565b82151581526040602082015260008251806040840152612a498160608501602087016129f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612a8f57600080fd5b823567ffffffffffffffff80821115612aa757600080fd5b612ab3868387016128da565b93506020850135915080821115612ac957600080fd5b50612ad6858286016128da565b9150509250929050565b60008060008060808587031215612af657600080fd5b843567ffffffffffffffff80821115612b0e57600080fd5b612b1a888389016128da565b95506020870135915080821115612b3057600080fd5b612b3c888389016128da565b94506040870135915080821115612b5257600080fd5b50612b5f878288016128da565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612bb157612bb1612b70565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612bf957612bf9612b70565b5060010190565b60008219821115612c1357612c13612b70565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612c5a57612c5a612c18565b8060ff84160691505092915050565b600060ff821660ff841680821015612c8357612c83612b70565b90039392505050565b6000816000190483118215151615612ca657612ca6612b70565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612ce957612ce9612b70565b506000190190565b600060208284031215612d0357600080fd5b5051919050565b600082612d1957612d19612c18565b500690565b600060ff821660ff84168060ff03821115612d3b57612d3b612b70565b019392505050565b60008351612d558184602088016129f2565b835190830190612d698183602088016129f2565b01949350505050565b600082612d8157612d81612c18565b500490565b600181815b80851115612dc1578160001904821115612da757612da7612b70565b80851615612db457918102915b93841c9390800290612d8b565b509250929050565b600082612dd8575060016100fc565b81612de5575060006100fc565b8160018114612dfb5760028114612e0557612e21565b60019150506100fc565b60ff841115612e1657612e16612b70565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612e44575081810a6100fc565b612e4e8383612d86565b8060001904821115612e6257612e62612b70565b029392505050565b60006100f98383612dc956fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612985565b6100d2565b604051610072929190612a22565b60405180910390f35b61008e610089366004612a7c565b6100ed565b604051908152602001610072565b61008e6100aa366004612ae0565b610102565b6100c26100bd366004612ae0565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610209565b90505b92915050565b60006101108585858561022d565b90505b949350505050565b6000610110858585856102e5565b60006060600061013885610322565b9050600080600061014a848a8961041d565b8151929550909350915015808061015e5750815b6101af5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b6000816101cb57604051806020016040528060008152506101f7565b6101f7866101da600188612b9f565b815181106101ea576101ea612bb6565b60200260200101516108b8565b919b919a509098505050505050505050565b600061021d610217846108e2565b83610a65565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561029d576102968585610209565b9050610113565b60006102a884610322565b90506000806102b883898761041d565b509150915060006102cc84848b858c610b1f565b90506102d8818a610f8c565b9998505050505050505050565b60008060006102f5878686610129565b9150915081801561031757508051602080830191909120875191880191909120145b979650505050505050565b6060600061032f83611142565b90506000815167ffffffffffffffff81111561034d5761034d6128ab565b60405190808252806020026020018201604052801561039257816020015b604080518082019091526060808252602082015281526020019060019003908161036b5790505b50905060005b82518110156104155760006103c58483815181106103b8576103b8612bb6565b6020026020010151611175565b905060405180604001604052808281526020016103e183611142565b8152508383815181106103f6576103f6612bb6565b602002602001018190525050808061040d90612be5565b915050610398565b509392505050565b6000606081808061042d876108e2565b90506000869050600080610454604051806040016040528060608152602001606081525090565b60005b8c51811015610874578c818151811061047257610472612bb6565b6020026020010151915082846104889190612c00565b9350610495600188612c00565b9650836104f9578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016101a6565b6105b6565b81515160201161055b578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016101a6565b8461056983600001516111fc565b146105b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016101a6565b6105c260106001612c00565b826020015151141561063b5785518414156105dc57610874565b60008685815181106105f0576105f0612bb6565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061061b5761061b612bb6565b6020026020010151905061062e81611224565b9650600194505050610862565b6002826020015151141561081a57600061065483611261565b905060008160008151811061066b5761066b612bb6565b016020015160f81c90506000610682600283612c47565b61068d906002612c69565b9050600061069e848360ff16611285565b905060006106ac8b8a611285565b905060006106ba83836112b6565b905060ff8516600214806106d1575060ff85166003145b15610727578083511480156106e65750808251145b156106f8576106f5818b612c00565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b60ff8516158061073a575060ff85166001145b156107ac578251811461077657507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b61079d886020015160018151811061079057610790612bb6565b6020026020010151611224565b9a509750610862945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016101a6565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016101a6565b8061086c81612be5565b915050610457565b507f80000000000000000000000000000000000000000000000000000000000000008414866108a38786611285565b909e909d50909b509950505050505050505050565b602081015180516060916100fc916108d290600190612b9f565b815181106103b8576103b8612bb6565b60606000825160026108f49190612c8c565b67ffffffffffffffff81111561090c5761090c6128ab565b6040519080825280601f01601f191660200182016040528015610936576020820181803683370190505b50905060005b8351811015610a5e57600484828151811061095957610959612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261098e836002612c8c565b8151811061099e5761099e612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106109e1576109e1612bb6565b01602001516109f3919060f81c612c47565b60f81b82610a02836002612c8c565b610a0d906001612c00565b81518110610a1d57610a1d612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610a5681612be5565b91505061093c565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610a915790505090506000610ab5856001611362565b9050610ac8610ac38261145a565b6115ac565b82600081518110610adb57610adb612bb6565b6020026020010181905250610aef846115ac565b82600181518110610b0257610b02612bb6565b6020026020010181905250610b168261161b565b95945050505050565b606082600087610b30600189612b9f565b81518110610b4057610b40612bb6565b602002602001015190506000610b558261165f565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610b715790505090506000806002846002811115610bb157610bb1612cab565b1415610caf578b5160009015610c6a5760005b60018e51610bd29190612b9f565b811015610c68576000610bfd8f8381518110610bf057610bf0612bb6565b602002602001015161165f565b6002811115610c0e57610c0e612cab565b1415610c265781610c1e81612be5565b925050610c56565b610c488e8281518110610c3b57610c3b612bb6565b6020026020010151611749565b51610c539083612c00565b91505b80610c6081612be5565b915050610bc4565b505b610c7386611749565b51610c97610c8088611749565b610c92610c8c8f6108e2565b85611285565b6112b6565b148015610ca357508651155b15610cad57600191505b505b8015610cf657610cc7610cc186611749565b89610a65565b838381518110610cd957610cd9612bb6565b6020908102919091010152610cef600183612c00565b9150610f66565b6000846002811115610d0a57610d0a612cab565b1415610d59578551610d2057610cc7858961175c565b84838381518110610d3357610d33612bb6565b6020908102919091010152610d49600183612c00565b9150610cc7610cc1876001611285565b6000610d6486611749565b90506000610d7282896112b6565b90508015610de0576000610d88836000846117e0565b9050610d9c81610d978d61197f565b6119bf565b868681518110610dae57610dae612bb6565b6020908102919091010152610dc4600186612c00565b9450610dd08383611285565b9250610ddc8983611285565b9850505b6000610dea611a0f565b9050825160001415610e0f57610e0881610e038a6108b8565b61175c565b9050610eb3565b600083600081518110610e2457610e24612bb6565b016020015160f81c9050610e39846001611285565b93506002886002811115610e4f57610e4f612cab565b1415610e8a576000610e6985610e648c6108b8565b610a65565b9050610e828383610e7d846000015161197f565b611b01565b925050610eb1565b835115610ea0576000610e6985610d978c6108b8565b610eae8282610e7d8c6108b8565b91505b505b8851610ef557610ec3818c61175c565b905080868681518110610ed857610ed8612bb6565b6020908102919091010152610eee600186612c00565b9450610f62565b610f00896001611285565b985080868681518110610f1557610f15612bb6565b6020908102919091010152610f2b600186612c00565b9450610f37898c610a65565b868681518110610f4957610f49612bb6565b6020908102919091010152610f5f600186612c00565b94505b5050505b610f7c8c610f7560018e612b9f565b8585611b8b565b9c9b505050505050505050505050565b600080610f98836108e2565b9050610fb7604051806040016040528060608152602001606081525090565b84516000906060905b801561112d5787610fd2600183612b9f565b81518110610fe257610fe2612bb6565b60200260200101519350610ff58461165f565b9250600283600281111561100b5761100b612cab565b141561103f57600061101c85611749565b9050611037866000835189516110329190612b9f565b6117e0565b95505061110e565b600183600281111561105357611053612cab565b141561109757600061106485611749565b905061107a866000835189516110329190612b9f565b8351909650156110915761108e8584611cb9565b94505b5061110e565b60008360028111156110ab576110ab612cab565b141561110e5781511561110e57600085600187516110c99190612b9f565b815181106110d9576110d9612bb6565b602001015160f81c60f81b60f81c90506110fd866000600189516110329190612b9f565b955061110a858285611b01565b9450505b83516111199061197f565b91508061112581612cda565b915050610fc0565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611d7d565b6060600080600061118585611f7c565b9194509250905060008160018111156111a0576111a0612cab565b146111ed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016101a6565b610b16856020015184846122cd565b600060208251101561121057506020015190565b818060200190518101906100fc9190612cf1565b600060606020836000015110156112455761123e836123ac565b9050611251565b61124e83611175565b90505b61125a816111fc565b9392505050565b60606100fc61128083602001516000815181106103b8576103b8612bb6565b6108e2565b6060825182106112a457506040805160208101909152600081526100fc565b6100f983838486516110329190612b9f565b6000805b8084511180156112ca5750808351115b801561134b57508281815181106112e3576112e3612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061132257611322612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061135a81612be5565b9150506112ba565b6060600082611372576000611375565b60025b90506000600285516113879190612d0a565b90506000611396826002612c69565b60ff1667ffffffffffffffff8111156113b1576113b16128ab565b6040519080825280601f01601f1916602001820160405280156113db576020820181803683370190505b5090506113e88284612d1e565b60f81b816000815181106113fe576113fe612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508086604051602001611440929190612d43565b604051602081830303815290604052935050505092915050565b606060006002835161146c9190612d72565b67ffffffffffffffff811115611484576114846128ab565b6040519080825280601f01601f1916602001820160405280156114ae576020820181803683370190505b50905060005b8151811015610a5e57836114c9826002612c8c565b6114d4906001612c00565b815181106114e4576114e4612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600485611519846002612c8c565b8151811061152957611529612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061156b5761156b612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806115a481612be5565b9150506114b4565b606080825160011480156115da57506080836000815181106115d0576115d0612bb6565b016020015160f81c105b156115e65750816100fc565b6115f2835160806123b7565b83604051602001611604929190612d43565b604051602081830303815290604052905092915050565b6040805180820190915260608082526020820152600061163a836125ae565b9050604051806040016040528082815260200161165683611142565b90529392505050565b600061166d60106001612c00565b826020015151141561168157506000919050565b6002826020015151141561170157600061169a83611261565b90506000816000815181106116b1576116b1612bb6565b016020015160f81c905060028114806116cd575060ff81166003145b156116dc575060029392505050565b60ff811615806116ef575060ff81166001145b156116fe575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f6465207479706500000000000000000000000000000060448201526064016101a6565b60606100fc61175783611261565b6125f2565b6040805180820190915260608082526020820152600061177b836115ac565b604080518082018252600080825260209182015281518083019092528251825280830190820152909150602085015180516117b890600190612b9f565b815181106117c8576117c8612bb6565b60200260200101819052506101138460200151612638565b6060816117ee81601f612c00565b101561183c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b826118478382612c00565b10156118955760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b61189f8284612c00565b845110156118ef5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101a6565b60608215801561190e5760405191506000825260208201604052611976565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561194757805183526020928301920161192f565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606060208251101561198f575090565b81805190602001206040516020016119a991815260200190565b6040516020818303038152906040529050919050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b60608152602001906001900390816119eb5790505090506000610ab5856000611362565b60408051808201909152606080825260208201526000611a3160106001612c00565b67ffffffffffffffff811115611a4957611a496128ab565b604051908082528060200260200182016040528015611a7c57816020015b6060815260200190600190039081611a675790505b50905060005b8151811015611af1576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611ad357611ad3612bb6565b60200260200101819052508080611ae990612be5565b915050611a82565b50611afb8161161b565b91505090565b604080518082019091526060808252602082015260006020835110611b2e57611b29836115ac565b611b30565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611b7357611b73612bb6565b6020026020010181905250610b168560200151612638565b60606000611b998386612c00565b67ffffffffffffffff811115611bb157611bb16128ab565b604051908082528060200260200182016040528015611bf657816020015b6040805180820190915260608082526020820152815260200190600190039081611bcf5790505b50905060005b85811015611c4e57868181518110611c1657611c16612bb6565b6020026020010151828281518110611c3057611c30612bb6565b60200260200101819052508080611c4690612be5565b915050611bfc565b5060005b83811015611caf57848181518110611c6c57611c6c612bb6565b6020026020010151828783611c819190612c00565b81518110611c9157611c91612bb6565b60200260200101819052508080611ca790612be5565b915050611c52565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611ce55790505090506000611d11611d0a86611749565b6000611362565b9050611d1f610ac38261145a565b82600081518110611d3257611d32612bb6565b6020026020010181905250602084511015611d6b578382600181518110611d5b57611d5b612bb6565b6020026020010181905250611d74565b610aef846115ac565b610b168261161b565b6060600080611d8b84611f7c565b91935090915060019050816001811115611da757611da7612cab565b14611df45760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016101a6565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611e0d5790505090506000835b8651811015611f715760208210611eb95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016101a6565b600080611ef66040518060400160405280858c60000151611eda9190612b9f565b8152602001858c60200151611eef9190612c00565b9052611f7c565b509150915060405180604001604052808383611f129190612c00565b8152602001848b60200151611f279190612c00565b815250858581518110611f3c57611f3c612bb6565b6020908102919091010152611f52600185612c00565b9350611f5e8183612c00565b611f689084612c00565b92505050611e3a565b508152949350505050565b600080600080846000015111611fd45760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016101a6565b6020840151805160001a607f8111611ff95760006001600094509450945050506122c6565b60b7811161207557600061200e608083612b9f565b9050808760000151116120635760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016101a6565b600195509350600092506122c6915050565b60bf811161216457600061208a60b783612b9f565b9050808760000151116120df5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016101a6565b600183015160208290036101000a90046120f98183612c00565b8851116121485760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016101a6565b612153826001612c00565b96509450600093506122c692505050565b60f781116121df57600061217960c083612b9f565b9050808760000151116121ce5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016101a6565b6001955093508492506122c6915050565b60006121ec60f783612b9f565b9050808760000151116122415760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016101a6565b600183015160208290036101000a900461225b8183612c00565b8851116122aa5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016101a6565b6122b5826001612c00565b96509450600193506122c692505050565b9193909250565b606060008267ffffffffffffffff8111156122ea576122ea6128ab565b6040519080825280601f01601f191660200182016040528015612314576020820181803683370190505b50905080516000141561232857905061125a565b60006123348587612c00565b90506020820160005b612348602087612d72565b81101561237f578251825261235e602084612c00565b925061236b602083612c00565b91508061237781612be5565b91505061233d565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc82612706565b606080603884101561243657604080516001808252818301909252906020820181803683370190505090506123ec8385612d1e565b60f81b8160008151811061240257612402612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124458187612d72565b1561246b578161245481612be5565b9250612464905061010082612c8c565b905061243b565b612476826001612c00565b67ffffffffffffffff81111561248e5761248e6128ab565b6040519080825280601f01601f1916602001820160405280156124b8576020820181803683370190505b5092506124c58583612d1e565b6124d0906037612d1e565b60f81b836000815181106124e6576124e6612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116125a45761010061252e8284612b9f565b61253a90610100612e6a565b6125449088612d72565b61254e9190612d0a565b60f81b83828151811061256357612563612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061259c81612be5565b91505061251a565b5050905092915050565b606060006125bb8361271c565b90506125c9815160c06123b7565b816040516020016125db929190612d43565b604051602081830303815290604052915050919050565b606060028260008151811061260957612609612bb6565b016020015161261b919060f81c612c47565b60ff1661262d576100fc826002611285565b6100fc826001611285565b60408051808201909152606080825260208201526000825167ffffffffffffffff811115612668576126686128ab565b60405190808252806020026020018201604052801561269b57816020015b60608152602001906001900390816126865790505b50905060005b83518110156126fc576126cc8482815181106126bf576126bf612bb6565b60200260200101516123ac565b8282815181106126de576126de612bb6565b602002602001018190525080806126f490612be5565b9150506126a1565b5061125a8161161b565b60606100fc8260200151600084600001516122cd565b606081516000141561273e576040805160008082526020820190925290610a5e565b6000805b83518110156127855783818151811061275d5761275d612bb6565b602002602001015151826127719190612c00565b91508061277d81612be5565b915050612742565b60008267ffffffffffffffff8111156127a0576127a06128ab565b6040519080825280601f01601f1916602001820160405280156127ca576020820181803683370190505b50600092509050602081015b85518310156119765760008684815181106127f3576127f3612bb6565b6020026020010151905060006020820190506128118382845161284e565b87858151811061282357612823612bb6565b602002602001015151836128379190612c00565b92505050828061284690612be5565b9350506127d6565b8282825b6020811061288a5781518352612869602084612c00565b9250612876602083612c00565b9150612883602082612b9f565b9050612852565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126128eb57600080fd5b813567ffffffffffffffff80821115612906576129066128ab565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561294c5761294c6128ab565b8160405283815286602085880101111561296557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561299a57600080fd5b833567ffffffffffffffff808211156129b257600080fd5b6129be878388016128da565b945060208601359150808211156129d457600080fd5b506129e1868287016128da565b925050604084013590509250925092565b60005b83811015612a0d5781810151838201526020016129f5565b83811115612a1c576000848401525b50505050565b82151581526040602082015260008251806040840152612a498160608501602087016129f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612a8f57600080fd5b823567ffffffffffffffff80821115612aa757600080fd5b612ab3868387016128da565b93506020850135915080821115612ac957600080fd5b50612ad6858286016128da565b9150509250929050565b60008060008060808587031215612af657600080fd5b843567ffffffffffffffff80821115612b0e57600080fd5b612b1a888389016128da565b95506020870135915080821115612b3057600080fd5b612b3c888389016128da565b94506040870135915080821115612b5257600080fd5b50612b5f878288016128da565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612bb157612bb1612b70565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612bf957612bf9612b70565b5060010190565b60008219821115612c1357612c13612b70565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612c5a57612c5a612c18565b8060ff84160691505092915050565b600060ff821660ff841680821015612c8357612c83612b70565b90039392505050565b6000816000190483118215151615612ca657612ca6612b70565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612ce957612ce9612b70565b506000190190565b600060208284031215612d0357600080fd5b5051919050565b600082612d1957612d19612c18565b500690565b600060ff821660ff84168060ff03821115612d3b57612d3b612b70565b019392505050565b60008351612d558184602088016129f2565b835190830190612d698183602088016129f2565b01949350505050565b600082612d8157612d81612c18565b500490565b600181815b80851115612dc1578160001904821115612da757612da7612b70565b80851615612db457918102915b93841c9390800290612d8b565b509250929050565b600082612dd8575060016100fc565b81612de5575060006100fc565b8160018114612dfb5760028114612e0557612e21565b60019150506100fc565b60ff841115612e1657612e16612b70565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612e44575081810a6100fc565b612e4e8383612d86565b8060001904821115612e6257612e62612b70565b029392505050565b60006100f98383612dc956fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.json +index 6ec23d5..58c5c53 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.json +@@ -130,8 +130,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50612f47806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612a20565b6100d2565b604051610072929190612abd565b60405180910390f35b61008e610089366004612b17565b6100ed565b604051908152602001610072565b61008e6100aa366004612b7b565b610102565b6100c26100bd366004612b7b565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610152565b90505b92915050565b60006101108585858561016a565b90505b949350505050565b60006101108585858561018e565b600060606000610138866101a8565b90506101458186866101da565b9250925050935093915050565b60008061015e846101a8565b905061011381846102ba565b600080610176866101a8565b9050610184818686866102de565b9695505050505050565b60008061019a866101a8565b905061018481868686610396565b606081805190602001206040516020016101c491815260200190565b6040516020818303038152906040529050919050565b6000606060006101e9856103d3565b905060008060006101fb848a896104ce565b8151929550909350915015808061020f5750815b6102605760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b60008161027c57604051806020016040528060008152506102a8565b6102a88661028b600188612c3a565b8151811061029b5761029b612c51565b6020026020010151610969565b919b919a509098505050505050505050565b60006102ce6102c884610993565b83610b16565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561034e5761034785856102ba565b9050610113565b6000610359846103d3565b90506000806103698389876104ce565b5091509150600061037d84848b858c610bd0565b9050610389818a61103d565b9998505050505050505050565b60008060006103a68786866101da565b915091508180156103c857508051602080830191909120875191880191909120145b979650505050505050565b606060006103e0836111f3565b90506000815167ffffffffffffffff8111156103fe576103fe612946565b60405190808252806020026020018201604052801561044357816020015b604080518082019091526060808252602082015281526020019060019003908161041c5790505b50905060005b82518110156104c657600061047684838151811061046957610469612c51565b6020026020010151611226565b90506040518060400160405280828152602001610492836111f3565b8152508383815181106104a7576104a7612c51565b60200260200101819052505080806104be90612c80565b915050610449565b509392505050565b600060608180806104de87610993565b90506000869050600080610505604051806040016040528060608152602001606081525090565b60005b8c51811015610925578c818151811061052357610523612c51565b6020026020010151915082846105399190612c9b565b9350610546600188612c9b565b9650836105aa578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610257565b610667565b81515160201161060c578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610257565b8461061a83600001516112ad565b146106675760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610257565b61067360106001612c9b565b82602001515114156106ec57855184141561068d57610925565b60008685815181106106a1576106a1612c51565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106106cc576106cc612c51565b602002602001015190506106df816112d5565b9650600194505050610913565b600282602001515114156108cb57600061070583611312565b905060008160008151811061071c5761071c612c51565b016020015160f81c90506000610733600283612ce2565b61073e906002612d04565b9050600061074f848360ff16611336565b9050600061075d8b8a611336565b9050600061076b8383611367565b905060ff851660021480610782575060ff85166003145b156107d8578083511480156107975750808251145b156107a9576107a6818b612c9b565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b60ff851615806107eb575060ff85166001145b1561085d578251811461082757507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b61084e886020015160018151811061084157610841612c51565b60200260200101516112d5565b9a509750610913945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610257565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610257565b8061091d81612c80565b915050610508565b507f80000000000000000000000000000000000000000000000000000000000000008414866109548786611336565b909e909d50909b509950505050505050505050565b602081015180516060916100fc9161098390600190612c3a565b8151811061046957610469612c51565b60606000825160026109a59190612d27565b67ffffffffffffffff8111156109bd576109bd612946565b6040519080825280601f01601f1916602001820160405280156109e7576020820181803683370190505b50905060005b8351811015610b0f576004848281518110610a0a57610a0a612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82610a3f836002612d27565b81518110610a4f57610a4f612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110610a9257610a92612c51565b0160200151610aa4919060f81c612ce2565b60f81b82610ab3836002612d27565b610abe906001612c9b565b81518110610ace57610ace612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610b0781612c80565b9150506109ed565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610b425790505090506000610b66856001611413565b9050610b79610b748261150b565b61165d565b82600081518110610b8c57610b8c612c51565b6020026020010181905250610ba08461165d565b82600181518110610bb357610bb3612c51565b6020026020010181905250610bc7826116cc565b95945050505050565b606082600087610be1600189612c3a565b81518110610bf157610bf1612c51565b602002602001015190506000610c0682611710565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610c225790505090506000806002846002811115610c6257610c62612d46565b1415610d60578b5160009015610d1b5760005b60018e51610c839190612c3a565b811015610d19576000610cae8f8381518110610ca157610ca1612c51565b6020026020010151611710565b6002811115610cbf57610cbf612d46565b1415610cd75781610ccf81612c80565b925050610d07565b610cf98e8281518110610cec57610cec612c51565b60200260200101516117fa565b51610d049083612c9b565b91505b80610d1181612c80565b915050610c75565b505b610d24866117fa565b51610d48610d31886117fa565b610d43610d3d8f610993565b85611336565b611367565b148015610d5457508651155b15610d5e57600191505b505b8015610da757610d78610d72866117fa565b89610b16565b838381518110610d8a57610d8a612c51565b6020908102919091010152610da0600183612c9b565b9150611017565b6000846002811115610dbb57610dbb612d46565b1415610e0a578551610dd157610d78858961180d565b84838381518110610de457610de4612c51565b6020908102919091010152610dfa600183612c9b565b9150610d78610d72876001611336565b6000610e15866117fa565b90506000610e238289611367565b90508015610e91576000610e3983600084611891565b9050610e4d81610e488d611a30565b611a5a565b868681518110610e5f57610e5f612c51565b6020908102919091010152610e75600186612c9b565b9450610e818383611336565b9250610e8d8983611336565b9850505b6000610e9b611aaa565b9050825160001415610ec057610eb981610eb48a610969565b61180d565b9050610f64565b600083600081518110610ed557610ed5612c51565b016020015160f81c9050610eea846001611336565b93506002886002811115610f0057610f00612d46565b1415610f3b576000610f1a85610f158c610969565b610b16565b9050610f338383610f2e8460000151611a30565b611b9c565b925050610f62565b835115610f51576000610f1a85610e488c610969565b610f5f8282610f2e8c610969565b91505b505b8851610fa657610f74818c61180d565b905080868681518110610f8957610f89612c51565b6020908102919091010152610f9f600186612c9b565b9450611013565b610fb1896001611336565b985080868681518110610fc657610fc6612c51565b6020908102919091010152610fdc600186612c9b565b9450610fe8898c610b16565b868681518110610ffa57610ffa612c51565b6020908102919091010152611010600186612c9b565b94505b5050505b61102d8c61102660018e612c3a565b8585611c26565b9c9b505050505050505050505050565b60008061104983610993565b9050611068604051806040016040528060608152602001606081525090565b84516000906060905b80156111de5787611083600183612c3a565b8151811061109357611093612c51565b602002602001015193506110a684611710565b925060028360028111156110bc576110bc612d46565b14156110f05760006110cd856117fa565b90506110e8866000835189516110e39190612c3a565b611891565b9550506111bf565b600183600281111561110457611104612d46565b1415611148576000611115856117fa565b905061112b866000835189516110e39190612c3a565b8351909650156111425761113f8584611d54565b94505b506111bf565b600083600281111561115c5761115c612d46565b14156111bf578151156111bf576000856001875161117a9190612c3a565b8151811061118a5761118a612c51565b602001015160f81c60f81b60f81c90506111ae866000600189516110e39190612c3a565b95506111bb858285611b9c565b9450505b83516111ca90611a30565b9150806111d681612d75565b915050611071565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611e18565b6060600080600061123685612017565b91945092509050600081600181111561125157611251612d46565b1461129e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610257565b610bc785602001518484612368565b60006020825110156112c157506020015190565b818060200190518101906100fc9190612d8c565b600060606020836000015110156112f6576112ef83612447565b9050611302565b6112ff83611226565b90505b61130b816112ad565b9392505050565b60606100fc611331836020015160008151811061046957610469612c51565b610993565b60608251821061135557506040805160208101909152600081526100fc565b6100f983838486516110e39190612c3a565b6000805b80845111801561137b5750808351115b80156113fc575082818151811061139457611394612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106113d3576113d3612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061140b81612c80565b91505061136b565b6060600082611423576000611426565b60025b90506000600285516114389190612da5565b90506000611447826002612d04565b60ff1667ffffffffffffffff81111561146257611462612946565b6040519080825280601f01601f19166020018201604052801561148c576020820181803683370190505b5090506114998284612db9565b60f81b816000815181106114af576114af612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080866040516020016114f1929190612dde565b604051602081830303815290604052935050505092915050565b606060006002835161151d9190612e0d565b67ffffffffffffffff81111561153557611535612946565b6040519080825280601f01601f19166020018201604052801561155f576020820181803683370190505b50905060005b8151811015610b0f578361157a826002612d27565b611585906001612c9b565b8151811061159557611595612c51565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166004856115ca846002612d27565b815181106115da576115da612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061161c5761161c612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061165581612c80565b915050611565565b6060808251600114801561168b575060808360008151811061168157611681612c51565b016020015160f81c105b156116975750816100fc565b6116a383516080612452565b836040516020016116b5929190612dde565b604051602081830303815290604052905092915050565b604080518082019091526060808252602082015260006116eb83612649565b90506040518060400160405280828152602001611707836111f3565b90529392505050565b600061171e60106001612c9b565b826020015151141561173257506000919050565b600282602001515114156117b257600061174b83611312565b905060008160008151811061176257611762612c51565b016020015160f81c9050600281148061177e575060ff81166003145b1561178d575060029392505050565b60ff811615806117a0575060ff81166001145b156117af575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f646520747970650000000000000000000000000000006044820152606401610257565b60606100fc61180883611312565b61268d565b6040805180820190915260608082526020820152600061182c8361165d565b6040805180820182526000808252602091820152815180830190925282518252808301908201529091506020850151805161186990600190612c3a565b8151811061187957611879612c51565b602002602001018190525061011384602001516126d3565b60608161189f81601f612c9b565b10156118ed5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b826118f88382612c9b565b10156119465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b6119508284612c9b565b845110156119a05760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610257565b6060821580156119bf5760405191506000825260208201604052611a27565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119f85780518352602092830192016119e0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060602082511015611a40575090565b81805190602001206040516020016101c491815260200190565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611a865790505090506000610b66856000611413565b60408051808201909152606080825260208201526000611acc60106001612c9b565b67ffffffffffffffff811115611ae457611ae4612946565b604051908082528060200260200182016040528015611b1757816020015b6060815260200190600190039081611b025790505b50905060005b8151811015611b8c576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611b6e57611b6e612c51565b60200260200101819052508080611b8490612c80565b915050611b1d565b50611b96816116cc565b91505090565b604080518082019091526060808252602082015260006020835110611bc957611bc48361165d565b611bcb565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611c0e57611c0e612c51565b6020026020010181905250610bc785602001516126d3565b60606000611c348386612c9b565b67ffffffffffffffff811115611c4c57611c4c612946565b604051908082528060200260200182016040528015611c9157816020015b6040805180820190915260608082526020820152815260200190600190039081611c6a5790505b50905060005b85811015611ce957868181518110611cb157611cb1612c51565b6020026020010151828281518110611ccb57611ccb612c51565b60200260200101819052508080611ce190612c80565b915050611c97565b5060005b83811015611d4a57848181518110611d0757611d07612c51565b6020026020010151828783611d1c9190612c9b565b81518110611d2c57611d2c612c51565b60200260200101819052508080611d4290612c80565b915050611ced565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611d805790505090506000611dac611da5866117fa565b6000611413565b9050611dba610b748261150b565b82600081518110611dcd57611dcd612c51565b6020026020010181905250602084511015611e06578382600181518110611df657611df6612c51565b6020026020010181905250611e0f565b610ba08461165d565b610bc7826116cc565b6060600080611e2684612017565b91935090915060019050816001811115611e4257611e42612d46565b14611e8f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610257565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611ea85790505090506000835b865181101561200c5760208210611f545760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610257565b600080611f916040518060400160405280858c60000151611f759190612c3a565b8152602001858c60200151611f8a9190612c9b565b9052612017565b509150915060405180604001604052808383611fad9190612c9b565b8152602001848b60200151611fc29190612c9b565b815250858581518110611fd757611fd7612c51565b6020908102919091010152611fed600185612c9b565b9350611ff98183612c9b565b6120039084612c9b565b92505050611ed5565b508152949350505050565b60008060008084600001511161206f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610257565b6020840151805160001a607f8111612094576000600160009450945094505050612361565b60b781116121105760006120a9608083612c3a565b9050808760000151116120fe5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610257565b60019550935060009250612361915050565b60bf81116121ff57600061212560b783612c3a565b90508087600001511161217a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610257565b600183015160208290036101000a90046121948183612c9b565b8851116121e35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610257565b6121ee826001612c9b565b965094506000935061236192505050565b60f7811161227a57600061221460c083612c3a565b9050808760000151116122695760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610257565b600195509350849250612361915050565b600061228760f783612c3a565b9050808760000151116122dc5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610257565b600183015160208290036101000a90046122f68183612c9b565b8851116123455760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610257565b612350826001612c9b565b965094506001935061236192505050565b9193909250565b606060008267ffffffffffffffff81111561238557612385612946565b6040519080825280601f01601f1916602001820160405280156123af576020820181803683370190505b5090508051600014156123c357905061130b565b60006123cf8587612c9b565b90506020820160005b6123e3602087612e0d565b81101561241a57825182526123f9602084612c9b565b9250612406602083612c9b565b91508061241281612c80565b9150506123d8565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc826127a1565b60608060388410156124d157604080516001808252818301909252906020820181803683370190505090506124878385612db9565b60f81b8160008151811061249d5761249d612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124e08187612e0d565b1561250657816124ef81612c80565b92506124ff905061010082612d27565b90506124d6565b612511826001612c9b565b67ffffffffffffffff81111561252957612529612946565b6040519080825280601f01601f191660200182016040528015612553576020820181803683370190505b5092506125608583612db9565b61256b906037612db9565b60f81b8360008151811061258157612581612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b81811161263f576101006125c98284612c3a565b6125d590610100612f05565b6125df9088612e0d565b6125e99190612da5565b60f81b8382815181106125fe576125fe612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061263781612c80565b9150506125b5565b5050905092915050565b60606000612656836127b7565b9050612664815160c0612452565b81604051602001612676929190612dde565b604051602081830303815290604052915050919050565b60606002826000815181106126a4576126a4612c51565b01602001516126b6919060f81c612ce2565b60ff166126c8576100fc826002611336565b6100fc826001611336565b60408051808201909152606080825260208201526000825167ffffffffffffffff81111561270357612703612946565b60405190808252806020026020018201604052801561273657816020015b60608152602001906001900390816127215790505b50905060005b83518110156127975761276784828151811061275a5761275a612c51565b6020026020010151612447565b82828151811061277957612779612c51565b6020026020010181905250808061278f90612c80565b91505061273c565b5061130b816116cc565b60606100fc826020015160008460000151612368565b60608151600014156127d9576040805160008082526020820190925290610b0f565b6000805b8351811015612820578381815181106127f8576127f8612c51565b6020026020010151518261280c9190612c9b565b91508061281881612c80565b9150506127dd565b60008267ffffffffffffffff81111561283b5761283b612946565b6040519080825280601f01601f191660200182016040528015612865576020820181803683370190505b50600092509050602081015b8551831015611a2757600086848151811061288e5761288e612c51565b6020026020010151905060006020820190506128ac838284516128e9565b8785815181106128be576128be612c51565b602002602001015151836128d29190612c9b565b9250505082806128e190612c80565b935050612871565b8282825b602081106129255781518352612904602084612c9b565b9250612911602083612c9b565b915061291e602082612c3a565b90506128ed565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261298657600080fd5b813567ffffffffffffffff808211156129a1576129a1612946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129e7576129e7612946565b81604052838152866020858801011115612a0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612a3557600080fd5b833567ffffffffffffffff80821115612a4d57600080fd5b612a5987838801612975565b94506020860135915080821115612a6f57600080fd5b50612a7c86828701612975565b925050604084013590509250925092565b60005b83811015612aa8578181015183820152602001612a90565b83811115612ab7576000848401525b50505050565b82151581526040602082015260008251806040840152612ae4816060850160208701612a8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612b2a57600080fd5b823567ffffffffffffffff80821115612b4257600080fd5b612b4e86838701612975565b93506020850135915080821115612b6457600080fd5b50612b7185828601612975565b9150509250929050565b60008060008060808587031215612b9157600080fd5b843567ffffffffffffffff80821115612ba957600080fd5b612bb588838901612975565b95506020870135915080821115612bcb57600080fd5b612bd788838901612975565b94506040870135915080821115612bed57600080fd5b50612bfa87828801612975565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612c4c57612c4c612c0b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612c9457612c94612c0b565b5060010190565b60008219821115612cae57612cae612c0b565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612cf557612cf5612cb3565b8060ff84160691505092915050565b600060ff821660ff841680821015612d1e57612d1e612c0b565b90039392505050565b6000816000190483118215151615612d4157612d41612c0b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612d8457612d84612c0b565b506000190190565b600060208284031215612d9e57600080fd5b5051919050565b600082612db457612db4612cb3565b500690565b600060ff821660ff84168060ff03821115612dd657612dd6612c0b565b019392505050565b60008351612df0818460208801612a8d565b835190830190612e04818360208801612a8d565b01949350505050565b600082612e1c57612e1c612cb3565b500490565b600181815b80851115612e5c578160001904821115612e4257612e42612c0b565b80851615612e4f57918102915b93841c9390800290612e26565b509250929050565b600082612e73575060016100fc565b81612e80575060006100fc565b8160018114612e965760028114612ea057612ebc565b60019150506100fc565b60ff841115612eb157612eb1612c0b565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612edf575081810a6100fc565b612ee98383612e21565b8060001904821115612efd57612efd612c0b565b029392505050565b60006100f98383612e6456fea264697066735822122075f30bf1cf0cc57f34c5b4118c01d8c03fc72c91d81b7b5a909be1e27c8d3ae464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612a20565b6100d2565b604051610072929190612abd565b60405180910390f35b61008e610089366004612b17565b6100ed565b604051908152602001610072565b61008e6100aa366004612b7b565b610102565b6100c26100bd366004612b7b565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610152565b90505b92915050565b60006101108585858561016a565b90505b949350505050565b60006101108585858561018e565b600060606000610138866101a8565b90506101458186866101da565b9250925050935093915050565b60008061015e846101a8565b905061011381846102ba565b600080610176866101a8565b9050610184818686866102de565b9695505050505050565b60008061019a866101a8565b905061018481868686610396565b606081805190602001206040516020016101c491815260200190565b6040516020818303038152906040529050919050565b6000606060006101e9856103d3565b905060008060006101fb848a896104ce565b8151929550909350915015808061020f5750815b6102605760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b60008161027c57604051806020016040528060008152506102a8565b6102a88661028b600188612c3a565b8151811061029b5761029b612c51565b6020026020010151610969565b919b919a509098505050505050505050565b60006102ce6102c884610993565b83610b16565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561034e5761034785856102ba565b9050610113565b6000610359846103d3565b90506000806103698389876104ce565b5091509150600061037d84848b858c610bd0565b9050610389818a61103d565b9998505050505050505050565b60008060006103a68786866101da565b915091508180156103c857508051602080830191909120875191880191909120145b979650505050505050565b606060006103e0836111f3565b90506000815167ffffffffffffffff8111156103fe576103fe612946565b60405190808252806020026020018201604052801561044357816020015b604080518082019091526060808252602082015281526020019060019003908161041c5790505b50905060005b82518110156104c657600061047684838151811061046957610469612c51565b6020026020010151611226565b90506040518060400160405280828152602001610492836111f3565b8152508383815181106104a7576104a7612c51565b60200260200101819052505080806104be90612c80565b915050610449565b509392505050565b600060608180806104de87610993565b90506000869050600080610505604051806040016040528060608152602001606081525090565b60005b8c51811015610925578c818151811061052357610523612c51565b6020026020010151915082846105399190612c9b565b9350610546600188612c9b565b9650836105aa578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610257565b610667565b81515160201161060c578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610257565b8461061a83600001516112ad565b146106675760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610257565b61067360106001612c9b565b82602001515114156106ec57855184141561068d57610925565b60008685815181106106a1576106a1612c51565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106106cc576106cc612c51565b602002602001015190506106df816112d5565b9650600194505050610913565b600282602001515114156108cb57600061070583611312565b905060008160008151811061071c5761071c612c51565b016020015160f81c90506000610733600283612ce2565b61073e906002612d04565b9050600061074f848360ff16611336565b9050600061075d8b8a611336565b9050600061076b8383611367565b905060ff851660021480610782575060ff85166003145b156107d8578083511480156107975750808251145b156107a9576107a6818b612c9b565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b60ff851615806107eb575060ff85166001145b1561085d578251811461082757507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b61084e886020015160018151811061084157610841612c51565b60200260200101516112d5565b9a509750610913945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610257565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610257565b8061091d81612c80565b915050610508565b507f80000000000000000000000000000000000000000000000000000000000000008414866109548786611336565b909e909d50909b509950505050505050505050565b602081015180516060916100fc9161098390600190612c3a565b8151811061046957610469612c51565b60606000825160026109a59190612d27565b67ffffffffffffffff8111156109bd576109bd612946565b6040519080825280601f01601f1916602001820160405280156109e7576020820181803683370190505b50905060005b8351811015610b0f576004848281518110610a0a57610a0a612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82610a3f836002612d27565b81518110610a4f57610a4f612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110610a9257610a92612c51565b0160200151610aa4919060f81c612ce2565b60f81b82610ab3836002612d27565b610abe906001612c9b565b81518110610ace57610ace612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610b0781612c80565b9150506109ed565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610b425790505090506000610b66856001611413565b9050610b79610b748261150b565b61165d565b82600081518110610b8c57610b8c612c51565b6020026020010181905250610ba08461165d565b82600181518110610bb357610bb3612c51565b6020026020010181905250610bc7826116cc565b95945050505050565b606082600087610be1600189612c3a565b81518110610bf157610bf1612c51565b602002602001015190506000610c0682611710565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610c225790505090506000806002846002811115610c6257610c62612d46565b1415610d60578b5160009015610d1b5760005b60018e51610c839190612c3a565b811015610d19576000610cae8f8381518110610ca157610ca1612c51565b6020026020010151611710565b6002811115610cbf57610cbf612d46565b1415610cd75781610ccf81612c80565b925050610d07565b610cf98e8281518110610cec57610cec612c51565b60200260200101516117fa565b51610d049083612c9b565b91505b80610d1181612c80565b915050610c75565b505b610d24866117fa565b51610d48610d31886117fa565b610d43610d3d8f610993565b85611336565b611367565b148015610d5457508651155b15610d5e57600191505b505b8015610da757610d78610d72866117fa565b89610b16565b838381518110610d8a57610d8a612c51565b6020908102919091010152610da0600183612c9b565b9150611017565b6000846002811115610dbb57610dbb612d46565b1415610e0a578551610dd157610d78858961180d565b84838381518110610de457610de4612c51565b6020908102919091010152610dfa600183612c9b565b9150610d78610d72876001611336565b6000610e15866117fa565b90506000610e238289611367565b90508015610e91576000610e3983600084611891565b9050610e4d81610e488d611a30565b611a5a565b868681518110610e5f57610e5f612c51565b6020908102919091010152610e75600186612c9b565b9450610e818383611336565b9250610e8d8983611336565b9850505b6000610e9b611aaa565b9050825160001415610ec057610eb981610eb48a610969565b61180d565b9050610f64565b600083600081518110610ed557610ed5612c51565b016020015160f81c9050610eea846001611336565b93506002886002811115610f0057610f00612d46565b1415610f3b576000610f1a85610f158c610969565b610b16565b9050610f338383610f2e8460000151611a30565b611b9c565b925050610f62565b835115610f51576000610f1a85610e488c610969565b610f5f8282610f2e8c610969565b91505b505b8851610fa657610f74818c61180d565b905080868681518110610f8957610f89612c51565b6020908102919091010152610f9f600186612c9b565b9450611013565b610fb1896001611336565b985080868681518110610fc657610fc6612c51565b6020908102919091010152610fdc600186612c9b565b9450610fe8898c610b16565b868681518110610ffa57610ffa612c51565b6020908102919091010152611010600186612c9b565b94505b5050505b61102d8c61102660018e612c3a565b8585611c26565b9c9b505050505050505050505050565b60008061104983610993565b9050611068604051806040016040528060608152602001606081525090565b84516000906060905b80156111de5787611083600183612c3a565b8151811061109357611093612c51565b602002602001015193506110a684611710565b925060028360028111156110bc576110bc612d46565b14156110f05760006110cd856117fa565b90506110e8866000835189516110e39190612c3a565b611891565b9550506111bf565b600183600281111561110457611104612d46565b1415611148576000611115856117fa565b905061112b866000835189516110e39190612c3a565b8351909650156111425761113f8584611d54565b94505b506111bf565b600083600281111561115c5761115c612d46565b14156111bf578151156111bf576000856001875161117a9190612c3a565b8151811061118a5761118a612c51565b602001015160f81c60f81b60f81c90506111ae866000600189516110e39190612c3a565b95506111bb858285611b9c565b9450505b83516111ca90611a30565b9150806111d681612d75565b915050611071565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611e18565b6060600080600061123685612017565b91945092509050600081600181111561125157611251612d46565b1461129e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610257565b610bc785602001518484612368565b60006020825110156112c157506020015190565b818060200190518101906100fc9190612d8c565b600060606020836000015110156112f6576112ef83612447565b9050611302565b6112ff83611226565b90505b61130b816112ad565b9392505050565b60606100fc611331836020015160008151811061046957610469612c51565b610993565b60608251821061135557506040805160208101909152600081526100fc565b6100f983838486516110e39190612c3a565b6000805b80845111801561137b5750808351115b80156113fc575082818151811061139457611394612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106113d3576113d3612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061140b81612c80565b91505061136b565b6060600082611423576000611426565b60025b90506000600285516114389190612da5565b90506000611447826002612d04565b60ff1667ffffffffffffffff81111561146257611462612946565b6040519080825280601f01601f19166020018201604052801561148c576020820181803683370190505b5090506114998284612db9565b60f81b816000815181106114af576114af612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080866040516020016114f1929190612dde565b604051602081830303815290604052935050505092915050565b606060006002835161151d9190612e0d565b67ffffffffffffffff81111561153557611535612946565b6040519080825280601f01601f19166020018201604052801561155f576020820181803683370190505b50905060005b8151811015610b0f578361157a826002612d27565b611585906001612c9b565b8151811061159557611595612c51565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166004856115ca846002612d27565b815181106115da576115da612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061161c5761161c612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061165581612c80565b915050611565565b6060808251600114801561168b575060808360008151811061168157611681612c51565b016020015160f81c105b156116975750816100fc565b6116a383516080612452565b836040516020016116b5929190612dde565b604051602081830303815290604052905092915050565b604080518082019091526060808252602082015260006116eb83612649565b90506040518060400160405280828152602001611707836111f3565b90529392505050565b600061171e60106001612c9b565b826020015151141561173257506000919050565b600282602001515114156117b257600061174b83611312565b905060008160008151811061176257611762612c51565b016020015160f81c9050600281148061177e575060ff81166003145b1561178d575060029392505050565b60ff811615806117a0575060ff81166001145b156117af575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f646520747970650000000000000000000000000000006044820152606401610257565b60606100fc61180883611312565b61268d565b6040805180820190915260608082526020820152600061182c8361165d565b6040805180820182526000808252602091820152815180830190925282518252808301908201529091506020850151805161186990600190612c3a565b8151811061187957611879612c51565b602002602001018190525061011384602001516126d3565b60608161189f81601f612c9b565b10156118ed5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b826118f88382612c9b565b10156119465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b6119508284612c9b565b845110156119a05760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610257565b6060821580156119bf5760405191506000825260208201604052611a27565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119f85780518352602092830192016119e0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060602082511015611a40575090565b81805190602001206040516020016101c491815260200190565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611a865790505090506000610b66856000611413565b60408051808201909152606080825260208201526000611acc60106001612c9b565b67ffffffffffffffff811115611ae457611ae4612946565b604051908082528060200260200182016040528015611b1757816020015b6060815260200190600190039081611b025790505b50905060005b8151811015611b8c576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611b6e57611b6e612c51565b60200260200101819052508080611b8490612c80565b915050611b1d565b50611b96816116cc565b91505090565b604080518082019091526060808252602082015260006020835110611bc957611bc48361165d565b611bcb565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611c0e57611c0e612c51565b6020026020010181905250610bc785602001516126d3565b60606000611c348386612c9b565b67ffffffffffffffff811115611c4c57611c4c612946565b604051908082528060200260200182016040528015611c9157816020015b6040805180820190915260608082526020820152815260200190600190039081611c6a5790505b50905060005b85811015611ce957868181518110611cb157611cb1612c51565b6020026020010151828281518110611ccb57611ccb612c51565b60200260200101819052508080611ce190612c80565b915050611c97565b5060005b83811015611d4a57848181518110611d0757611d07612c51565b6020026020010151828783611d1c9190612c9b565b81518110611d2c57611d2c612c51565b60200260200101819052508080611d4290612c80565b915050611ced565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611d805790505090506000611dac611da5866117fa565b6000611413565b9050611dba610b748261150b565b82600081518110611dcd57611dcd612c51565b6020026020010181905250602084511015611e06578382600181518110611df657611df6612c51565b6020026020010181905250611e0f565b610ba08461165d565b610bc7826116cc565b6060600080611e2684612017565b91935090915060019050816001811115611e4257611e42612d46565b14611e8f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610257565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611ea85790505090506000835b865181101561200c5760208210611f545760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610257565b600080611f916040518060400160405280858c60000151611f759190612c3a565b8152602001858c60200151611f8a9190612c9b565b9052612017565b509150915060405180604001604052808383611fad9190612c9b565b8152602001848b60200151611fc29190612c9b565b815250858581518110611fd757611fd7612c51565b6020908102919091010152611fed600185612c9b565b9350611ff98183612c9b565b6120039084612c9b565b92505050611ed5565b508152949350505050565b60008060008084600001511161206f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610257565b6020840151805160001a607f8111612094576000600160009450945094505050612361565b60b781116121105760006120a9608083612c3a565b9050808760000151116120fe5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610257565b60019550935060009250612361915050565b60bf81116121ff57600061212560b783612c3a565b90508087600001511161217a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610257565b600183015160208290036101000a90046121948183612c9b565b8851116121e35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610257565b6121ee826001612c9b565b965094506000935061236192505050565b60f7811161227a57600061221460c083612c3a565b9050808760000151116122695760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610257565b600195509350849250612361915050565b600061228760f783612c3a565b9050808760000151116122dc5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610257565b600183015160208290036101000a90046122f68183612c9b565b8851116123455760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610257565b612350826001612c9b565b965094506001935061236192505050565b9193909250565b606060008267ffffffffffffffff81111561238557612385612946565b6040519080825280601f01601f1916602001820160405280156123af576020820181803683370190505b5090508051600014156123c357905061130b565b60006123cf8587612c9b565b90506020820160005b6123e3602087612e0d565b81101561241a57825182526123f9602084612c9b565b9250612406602083612c9b565b91508061241281612c80565b9150506123d8565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc826127a1565b60608060388410156124d157604080516001808252818301909252906020820181803683370190505090506124878385612db9565b60f81b8160008151811061249d5761249d612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124e08187612e0d565b1561250657816124ef81612c80565b92506124ff905061010082612d27565b90506124d6565b612511826001612c9b565b67ffffffffffffffff81111561252957612529612946565b6040519080825280601f01601f191660200182016040528015612553576020820181803683370190505b5092506125608583612db9565b61256b906037612db9565b60f81b8360008151811061258157612581612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b81811161263f576101006125c98284612c3a565b6125d590610100612f05565b6125df9088612e0d565b6125e99190612da5565b60f81b8382815181106125fe576125fe612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061263781612c80565b9150506125b5565b5050905092915050565b60606000612656836127b7565b9050612664815160c0612452565b81604051602001612676929190612dde565b604051602081830303815290604052915050919050565b60606002826000815181106126a4576126a4612c51565b01602001516126b6919060f81c612ce2565b60ff166126c8576100fc826002611336565b6100fc826001611336565b60408051808201909152606080825260208201526000825167ffffffffffffffff81111561270357612703612946565b60405190808252806020026020018201604052801561273657816020015b60608152602001906001900390816127215790505b50905060005b83518110156127975761276784828151811061275a5761275a612c51565b6020026020010151612447565b82828151811061277957612779612c51565b6020026020010181905250808061278f90612c80565b91505061273c565b5061130b816116cc565b60606100fc826020015160008460000151612368565b60608151600014156127d9576040805160008082526020820190925290610b0f565b6000805b8351811015612820578381815181106127f8576127f8612c51565b6020026020010151518261280c9190612c9b565b91508061281881612c80565b9150506127dd565b60008267ffffffffffffffff81111561283b5761283b612946565b6040519080825280601f01601f191660200182016040528015612865576020820181803683370190505b50600092509050602081015b8551831015611a2757600086848151811061288e5761288e612c51565b6020026020010151905060006020820190506128ac838284516128e9565b8785815181106128be576128be612c51565b602002602001015151836128d29190612c9b565b9250505082806128e190612c80565b935050612871565b8282825b602081106129255781518352612904602084612c9b565b9250612911602083612c9b565b915061291e602082612c3a565b90506128ed565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261298657600080fd5b813567ffffffffffffffff808211156129a1576129a1612946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129e7576129e7612946565b81604052838152866020858801011115612a0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612a3557600080fd5b833567ffffffffffffffff80821115612a4d57600080fd5b612a5987838801612975565b94506020860135915080821115612a6f57600080fd5b50612a7c86828701612975565b925050604084013590509250925092565b60005b83811015612aa8578181015183820152602001612a90565b83811115612ab7576000848401525b50505050565b82151581526040602082015260008251806040840152612ae4816060850160208701612a8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612b2a57600080fd5b823567ffffffffffffffff80821115612b4257600080fd5b612b4e86838701612975565b93506020850135915080821115612b6457600080fd5b50612b7185828601612975565b9150509250929050565b60008060008060808587031215612b9157600080fd5b843567ffffffffffffffff80821115612ba957600080fd5b612bb588838901612975565b95506020870135915080821115612bcb57600080fd5b612bd788838901612975565b94506040870135915080821115612bed57600080fd5b50612bfa87828801612975565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612c4c57612c4c612c0b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612c9457612c94612c0b565b5060010190565b60008219821115612cae57612cae612c0b565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612cf557612cf5612cb3565b8060ff84160691505092915050565b600060ff821660ff841680821015612d1e57612d1e612c0b565b90039392505050565b6000816000190483118215151615612d4157612d41612c0b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612d8457612d84612c0b565b506000190190565b600060208284031215612d9e57600080fd5b5051919050565b600082612db457612db4612cb3565b500690565b600060ff821660ff84168060ff03821115612dd657612dd6612c0b565b019392505050565b60008351612df0818460208801612a8d565b835190830190612e04818360208801612a8d565b01949350505050565b600082612e1c57612e1c612cb3565b500490565b600181815b80851115612e5c578160001904821115612e4257612e42612c0b565b80851615612e4f57918102915b93841c9390800290612e26565b509250929050565b600082612e73575060016100fc565b81612e80575060006100fc565b8160018114612e965760028114612ea057612ebc565b60019150506100fc565b60ff841115612eb157612eb1612c0b565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612edf575081810a6100fc565b612ee98383612e21565b8060001904821115612efd57612efd612c0b565b029392505050565b60006100f98383612e6456fea264697066735822122075f30bf1cf0cc57f34c5b4118c01d8c03fc72c91d81b7b5a909be1e27c8d3ae464736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50612f1e806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612a20565b6100d2565b604051610072929190612abd565b60405180910390f35b61008e610089366004612b17565b6100ed565b604051908152602001610072565b61008e6100aa366004612b7b565b610102565b6100c26100bd366004612b7b565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610152565b90505b92915050565b60006101108585858561016a565b90505b949350505050565b60006101108585858561018e565b600060606000610138866101a8565b90506101458186866101da565b9250925050935093915050565b60008061015e846101a8565b905061011381846102ba565b600080610176866101a8565b9050610184818686866102de565b9695505050505050565b60008061019a866101a8565b905061018481868686610396565b606081805190602001206040516020016101c491815260200190565b6040516020818303038152906040529050919050565b6000606060006101e9856103d3565b905060008060006101fb848a896104ce565b8151929550909350915015808061020f5750815b6102605760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b60008161027c57604051806020016040528060008152506102a8565b6102a88661028b600188612c3a565b8151811061029b5761029b612c51565b6020026020010151610969565b919b919a509098505050505050505050565b60006102ce6102c884610993565b83610b16565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561034e5761034785856102ba565b9050610113565b6000610359846103d3565b90506000806103698389876104ce565b5091509150600061037d84848b858c610bd0565b9050610389818a61103d565b9998505050505050505050565b60008060006103a68786866101da565b915091508180156103c857508051602080830191909120875191880191909120145b979650505050505050565b606060006103e0836111f3565b90506000815167ffffffffffffffff8111156103fe576103fe612946565b60405190808252806020026020018201604052801561044357816020015b604080518082019091526060808252602082015281526020019060019003908161041c5790505b50905060005b82518110156104c657600061047684838151811061046957610469612c51565b6020026020010151611226565b90506040518060400160405280828152602001610492836111f3565b8152508383815181106104a7576104a7612c51565b60200260200101819052505080806104be90612c80565b915050610449565b509392505050565b600060608180806104de87610993565b90506000869050600080610505604051806040016040528060608152602001606081525090565b60005b8c51811015610925578c818151811061052357610523612c51565b6020026020010151915082846105399190612c9b565b9350610546600188612c9b565b9650836105aa578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610257565b610667565b81515160201161060c578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610257565b8461061a83600001516112ad565b146106675760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610257565b61067360106001612c9b565b82602001515114156106ec57855184141561068d57610925565b60008685815181106106a1576106a1612c51565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106106cc576106cc612c51565b602002602001015190506106df816112d5565b9650600194505050610913565b600282602001515114156108cb57600061070583611312565b905060008160008151811061071c5761071c612c51565b016020015160f81c90506000610733600283612ce2565b61073e906002612d04565b9050600061074f848360ff16611336565b9050600061075d8b8a611336565b9050600061076b8383611367565b905060ff851660021480610782575060ff85166003145b156107d8578083511480156107975750808251145b156107a9576107a6818b612c9b565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b60ff851615806107eb575060ff85166001145b1561085d578251811461082757507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b61084e886020015160018151811061084157610841612c51565b60200260200101516112d5565b9a509750610913945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610257565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610257565b8061091d81612c80565b915050610508565b507f80000000000000000000000000000000000000000000000000000000000000008414866109548786611336565b909e909d50909b509950505050505050505050565b602081015180516060916100fc9161098390600190612c3a565b8151811061046957610469612c51565b60606000825160026109a59190612d27565b67ffffffffffffffff8111156109bd576109bd612946565b6040519080825280601f01601f1916602001820160405280156109e7576020820181803683370190505b50905060005b8351811015610b0f576004848281518110610a0a57610a0a612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82610a3f836002612d27565b81518110610a4f57610a4f612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110610a9257610a92612c51565b0160200151610aa4919060f81c612ce2565b60f81b82610ab3836002612d27565b610abe906001612c9b565b81518110610ace57610ace612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610b0781612c80565b9150506109ed565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610b425790505090506000610b66856001611413565b9050610b79610b748261150b565b61165d565b82600081518110610b8c57610b8c612c51565b6020026020010181905250610ba08461165d565b82600181518110610bb357610bb3612c51565b6020026020010181905250610bc7826116cc565b95945050505050565b606082600087610be1600189612c3a565b81518110610bf157610bf1612c51565b602002602001015190506000610c0682611710565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610c225790505090506000806002846002811115610c6257610c62612d46565b1415610d60578b5160009015610d1b5760005b60018e51610c839190612c3a565b811015610d19576000610cae8f8381518110610ca157610ca1612c51565b6020026020010151611710565b6002811115610cbf57610cbf612d46565b1415610cd75781610ccf81612c80565b925050610d07565b610cf98e8281518110610cec57610cec612c51565b60200260200101516117fa565b51610d049083612c9b565b91505b80610d1181612c80565b915050610c75565b505b610d24866117fa565b51610d48610d31886117fa565b610d43610d3d8f610993565b85611336565b611367565b148015610d5457508651155b15610d5e57600191505b505b8015610da757610d78610d72866117fa565b89610b16565b838381518110610d8a57610d8a612c51565b6020908102919091010152610da0600183612c9b565b9150611017565b6000846002811115610dbb57610dbb612d46565b1415610e0a578551610dd157610d78858961180d565b84838381518110610de457610de4612c51565b6020908102919091010152610dfa600183612c9b565b9150610d78610d72876001611336565b6000610e15866117fa565b90506000610e238289611367565b90508015610e91576000610e3983600084611891565b9050610e4d81610e488d611a30565b611a5a565b868681518110610e5f57610e5f612c51565b6020908102919091010152610e75600186612c9b565b9450610e818383611336565b9250610e8d8983611336565b9850505b6000610e9b611aaa565b9050825160001415610ec057610eb981610eb48a610969565b61180d565b9050610f64565b600083600081518110610ed557610ed5612c51565b016020015160f81c9050610eea846001611336565b93506002886002811115610f0057610f00612d46565b1415610f3b576000610f1a85610f158c610969565b610b16565b9050610f338383610f2e8460000151611a30565b611b9c565b925050610f62565b835115610f51576000610f1a85610e488c610969565b610f5f8282610f2e8c610969565b91505b505b8851610fa657610f74818c61180d565b905080868681518110610f8957610f89612c51565b6020908102919091010152610f9f600186612c9b565b9450611013565b610fb1896001611336565b985080868681518110610fc657610fc6612c51565b6020908102919091010152610fdc600186612c9b565b9450610fe8898c610b16565b868681518110610ffa57610ffa612c51565b6020908102919091010152611010600186612c9b565b94505b5050505b61102d8c61102660018e612c3a565b8585611c26565b9c9b505050505050505050505050565b60008061104983610993565b9050611068604051806040016040528060608152602001606081525090565b84516000906060905b80156111de5787611083600183612c3a565b8151811061109357611093612c51565b602002602001015193506110a684611710565b925060028360028111156110bc576110bc612d46565b14156110f05760006110cd856117fa565b90506110e8866000835189516110e39190612c3a565b611891565b9550506111bf565b600183600281111561110457611104612d46565b1415611148576000611115856117fa565b905061112b866000835189516110e39190612c3a565b8351909650156111425761113f8584611d54565b94505b506111bf565b600083600281111561115c5761115c612d46565b14156111bf578151156111bf576000856001875161117a9190612c3a565b8151811061118a5761118a612c51565b602001015160f81c60f81b60f81c90506111ae866000600189516110e39190612c3a565b95506111bb858285611b9c565b9450505b83516111ca90611a30565b9150806111d681612d75565b915050611071565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611e18565b6060600080600061123685612017565b91945092509050600081600181111561125157611251612d46565b1461129e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610257565b610bc785602001518484612368565b60006020825110156112c157506020015190565b818060200190518101906100fc9190612d8c565b600060606020836000015110156112f6576112ef83612447565b9050611302565b6112ff83611226565b90505b61130b816112ad565b9392505050565b60606100fc611331836020015160008151811061046957610469612c51565b610993565b60608251821061135557506040805160208101909152600081526100fc565b6100f983838486516110e39190612c3a565b6000805b80845111801561137b5750808351115b80156113fc575082818151811061139457611394612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106113d3576113d3612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061140b81612c80565b91505061136b565b6060600082611423576000611426565b60025b90506000600285516114389190612da5565b90506000611447826002612d04565b60ff1667ffffffffffffffff81111561146257611462612946565b6040519080825280601f01601f19166020018201604052801561148c576020820181803683370190505b5090506114998284612db9565b60f81b816000815181106114af576114af612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080866040516020016114f1929190612dde565b604051602081830303815290604052935050505092915050565b606060006002835161151d9190612e0d565b67ffffffffffffffff81111561153557611535612946565b6040519080825280601f01601f19166020018201604052801561155f576020820181803683370190505b50905060005b8151811015610b0f578361157a826002612d27565b611585906001612c9b565b8151811061159557611595612c51565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166004856115ca846002612d27565b815181106115da576115da612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061161c5761161c612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061165581612c80565b915050611565565b6060808251600114801561168b575060808360008151811061168157611681612c51565b016020015160f81c105b156116975750816100fc565b6116a383516080612452565b836040516020016116b5929190612dde565b604051602081830303815290604052905092915050565b604080518082019091526060808252602082015260006116eb83612649565b90506040518060400160405280828152602001611707836111f3565b90529392505050565b600061171e60106001612c9b565b826020015151141561173257506000919050565b600282602001515114156117b257600061174b83611312565b905060008160008151811061176257611762612c51565b016020015160f81c9050600281148061177e575060ff81166003145b1561178d575060029392505050565b60ff811615806117a0575060ff81166001145b156117af575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f646520747970650000000000000000000000000000006044820152606401610257565b60606100fc61180883611312565b61268d565b6040805180820190915260608082526020820152600061182c8361165d565b6040805180820182526000808252602091820152815180830190925282518252808301908201529091506020850151805161186990600190612c3a565b8151811061187957611879612c51565b602002602001018190525061011384602001516126d3565b60608161189f81601f612c9b565b10156118ed5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b826118f88382612c9b565b10156119465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b6119508284612c9b565b845110156119a05760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610257565b6060821580156119bf5760405191506000825260208201604052611a27565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119f85780518352602092830192016119e0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060602082511015611a40575090565b81805190602001206040516020016101c491815260200190565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611a865790505090506000610b66856000611413565b60408051808201909152606080825260208201526000611acc60106001612c9b565b67ffffffffffffffff811115611ae457611ae4612946565b604051908082528060200260200182016040528015611b1757816020015b6060815260200190600190039081611b025790505b50905060005b8151811015611b8c576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611b6e57611b6e612c51565b60200260200101819052508080611b8490612c80565b915050611b1d565b50611b96816116cc565b91505090565b604080518082019091526060808252602082015260006020835110611bc957611bc48361165d565b611bcb565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611c0e57611c0e612c51565b6020026020010181905250610bc785602001516126d3565b60606000611c348386612c9b565b67ffffffffffffffff811115611c4c57611c4c612946565b604051908082528060200260200182016040528015611c9157816020015b6040805180820190915260608082526020820152815260200190600190039081611c6a5790505b50905060005b85811015611ce957868181518110611cb157611cb1612c51565b6020026020010151828281518110611ccb57611ccb612c51565b60200260200101819052508080611ce190612c80565b915050611c97565b5060005b83811015611d4a57848181518110611d0757611d07612c51565b6020026020010151828783611d1c9190612c9b565b81518110611d2c57611d2c612c51565b60200260200101819052508080611d4290612c80565b915050611ced565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611d805790505090506000611dac611da5866117fa565b6000611413565b9050611dba610b748261150b565b82600081518110611dcd57611dcd612c51565b6020026020010181905250602084511015611e06578382600181518110611df657611df6612c51565b6020026020010181905250611e0f565b610ba08461165d565b610bc7826116cc565b6060600080611e2684612017565b91935090915060019050816001811115611e4257611e42612d46565b14611e8f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610257565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611ea85790505090506000835b865181101561200c5760208210611f545760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610257565b600080611f916040518060400160405280858c60000151611f759190612c3a565b8152602001858c60200151611f8a9190612c9b565b9052612017565b509150915060405180604001604052808383611fad9190612c9b565b8152602001848b60200151611fc29190612c9b565b815250858581518110611fd757611fd7612c51565b6020908102919091010152611fed600185612c9b565b9350611ff98183612c9b565b6120039084612c9b565b92505050611ed5565b508152949350505050565b60008060008084600001511161206f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610257565b6020840151805160001a607f8111612094576000600160009450945094505050612361565b60b781116121105760006120a9608083612c3a565b9050808760000151116120fe5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610257565b60019550935060009250612361915050565b60bf81116121ff57600061212560b783612c3a565b90508087600001511161217a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610257565b600183015160208290036101000a90046121948183612c9b565b8851116121e35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610257565b6121ee826001612c9b565b965094506000935061236192505050565b60f7811161227a57600061221460c083612c3a565b9050808760000151116122695760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610257565b600195509350849250612361915050565b600061228760f783612c3a565b9050808760000151116122dc5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610257565b600183015160208290036101000a90046122f68183612c9b565b8851116123455760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610257565b612350826001612c9b565b965094506001935061236192505050565b9193909250565b606060008267ffffffffffffffff81111561238557612385612946565b6040519080825280601f01601f1916602001820160405280156123af576020820181803683370190505b5090508051600014156123c357905061130b565b60006123cf8587612c9b565b90506020820160005b6123e3602087612e0d565b81101561241a57825182526123f9602084612c9b565b9250612406602083612c9b565b91508061241281612c80565b9150506123d8565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc826127a1565b60608060388410156124d157604080516001808252818301909252906020820181803683370190505090506124878385612db9565b60f81b8160008151811061249d5761249d612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124e08187612e0d565b1561250657816124ef81612c80565b92506124ff905061010082612d27565b90506124d6565b612511826001612c9b565b67ffffffffffffffff81111561252957612529612946565b6040519080825280601f01601f191660200182016040528015612553576020820181803683370190505b5092506125608583612db9565b61256b906037612db9565b60f81b8360008151811061258157612581612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b81811161263f576101006125c98284612c3a565b6125d590610100612f05565b6125df9088612e0d565b6125e99190612da5565b60f81b8382815181106125fe576125fe612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061263781612c80565b9150506125b5565b5050905092915050565b60606000612656836127b7565b9050612664815160c0612452565b81604051602001612676929190612dde565b604051602081830303815290604052915050919050565b60606002826000815181106126a4576126a4612c51565b01602001516126b6919060f81c612ce2565b60ff166126c8576100fc826002611336565b6100fc826001611336565b60408051808201909152606080825260208201526000825167ffffffffffffffff81111561270357612703612946565b60405190808252806020026020018201604052801561273657816020015b60608152602001906001900390816127215790505b50905060005b83518110156127975761276784828151811061275a5761275a612c51565b6020026020010151612447565b82828151811061277957612779612c51565b6020026020010181905250808061278f90612c80565b91505061273c565b5061130b816116cc565b60606100fc826020015160008460000151612368565b60608151600014156127d9576040805160008082526020820190925290610b0f565b6000805b8351811015612820578381815181106127f8576127f8612c51565b6020026020010151518261280c9190612c9b565b91508061281881612c80565b9150506127dd565b60008267ffffffffffffffff81111561283b5761283b612946565b6040519080825280601f01601f191660200182016040528015612865576020820181803683370190505b50600092509050602081015b8551831015611a2757600086848151811061288e5761288e612c51565b6020026020010151905060006020820190506128ac838284516128e9565b8785815181106128be576128be612c51565b602002602001015151836128d29190612c9b565b9250505082806128e190612c80565b935050612871565b8282825b602081106129255781518352612904602084612c9b565b9250612911602083612c9b565b915061291e602082612c3a565b90506128ed565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261298657600080fd5b813567ffffffffffffffff808211156129a1576129a1612946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129e7576129e7612946565b81604052838152866020858801011115612a0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612a3557600080fd5b833567ffffffffffffffff80821115612a4d57600080fd5b612a5987838801612975565b94506020860135915080821115612a6f57600080fd5b50612a7c86828701612975565b925050604084013590509250925092565b60005b83811015612aa8578181015183820152602001612a90565b83811115612ab7576000848401525b50505050565b82151581526040602082015260008251806040840152612ae4816060850160208701612a8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612b2a57600080fd5b823567ffffffffffffffff80821115612b4257600080fd5b612b4e86838701612975565b93506020850135915080821115612b6457600080fd5b50612b7185828601612975565b9150509250929050565b60008060008060808587031215612b9157600080fd5b843567ffffffffffffffff80821115612ba957600080fd5b612bb588838901612975565b95506020870135915080821115612bcb57600080fd5b612bd788838901612975565b94506040870135915080821115612bed57600080fd5b50612bfa87828801612975565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612c4c57612c4c612c0b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612c9457612c94612c0b565b5060010190565b60008219821115612cae57612cae612c0b565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612cf557612cf5612cb3565b8060ff84160691505092915050565b600060ff821660ff841680821015612d1e57612d1e612c0b565b90039392505050565b6000816000190483118215151615612d4157612d41612c0b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612d8457612d84612c0b565b506000190190565b600060208284031215612d9e57600080fd5b5051919050565b600082612db457612db4612cb3565b500690565b600060ff821660ff84168060ff03821115612dd657612dd6612c0b565b019392505050565b60008351612df0818460208801612a8d565b835190830190612e04818360208801612a8d565b01949350505050565b600082612e1c57612e1c612cb3565b500490565b600181815b80851115612e5c578160001904821115612e4257612e42612c0b565b80851615612e4f57918102915b93841c9390800290612e26565b509250929050565b600082612e73575060016100fc565b81612e80575060006100fc565b8160018114612e965760028114612ea057612ebc565b60019150506100fc565b60ff841115612eb157612eb1612c0b565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612edf575081810a6100fc565b612ee98383612e21565b8060001904821115612efd57612efd612c0b565b029392505050565b60006100f98383612e6456fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612a20565b6100d2565b604051610072929190612abd565b60405180910390f35b61008e610089366004612b17565b6100ed565b604051908152602001610072565b61008e6100aa366004612b7b565b610102565b6100c26100bd366004612b7b565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610152565b90505b92915050565b60006101108585858561016a565b90505b949350505050565b60006101108585858561018e565b600060606000610138866101a8565b90506101458186866101da565b9250925050935093915050565b60008061015e846101a8565b905061011381846102ba565b600080610176866101a8565b9050610184818686866102de565b9695505050505050565b60008061019a866101a8565b905061018481868686610396565b606081805190602001206040516020016101c491815260200190565b6040516020818303038152906040529050919050565b6000606060006101e9856103d3565b905060008060006101fb848a896104ce565b8151929550909350915015808061020f5750815b6102605760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b60008161027c57604051806020016040528060008152506102a8565b6102a88661028b600188612c3a565b8151811061029b5761029b612c51565b6020026020010151610969565b919b919a509098505050505050505050565b60006102ce6102c884610993565b83610b16565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561034e5761034785856102ba565b9050610113565b6000610359846103d3565b90506000806103698389876104ce565b5091509150600061037d84848b858c610bd0565b9050610389818a61103d565b9998505050505050505050565b60008060006103a68786866101da565b915091508180156103c857508051602080830191909120875191880191909120145b979650505050505050565b606060006103e0836111f3565b90506000815167ffffffffffffffff8111156103fe576103fe612946565b60405190808252806020026020018201604052801561044357816020015b604080518082019091526060808252602082015281526020019060019003908161041c5790505b50905060005b82518110156104c657600061047684838151811061046957610469612c51565b6020026020010151611226565b90506040518060400160405280828152602001610492836111f3565b8152508383815181106104a7576104a7612c51565b60200260200101819052505080806104be90612c80565b915050610449565b509392505050565b600060608180806104de87610993565b90506000869050600080610505604051806040016040528060608152602001606081525090565b60005b8c51811015610925578c818151811061052357610523612c51565b6020026020010151915082846105399190612c9b565b9350610546600188612c9b565b9650836105aa578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610257565b610667565b81515160201161060c578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610257565b8461061a83600001516112ad565b146106675760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610257565b61067360106001612c9b565b82602001515114156106ec57855184141561068d57610925565b60008685815181106106a1576106a1612c51565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106106cc576106cc612c51565b602002602001015190506106df816112d5565b9650600194505050610913565b600282602001515114156108cb57600061070583611312565b905060008160008151811061071c5761071c612c51565b016020015160f81c90506000610733600283612ce2565b61073e906002612d04565b9050600061074f848360ff16611336565b9050600061075d8b8a611336565b9050600061076b8383611367565b905060ff851660021480610782575060ff85166003145b156107d8578083511480156107975750808251145b156107a9576107a6818b612c9b565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b60ff851615806107eb575060ff85166001145b1561085d578251811461082757507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b61084e886020015160018151811061084157610841612c51565b60200260200101516112d5565b9a509750610913945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610257565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610257565b8061091d81612c80565b915050610508565b507f80000000000000000000000000000000000000000000000000000000000000008414866109548786611336565b909e909d50909b509950505050505050505050565b602081015180516060916100fc9161098390600190612c3a565b8151811061046957610469612c51565b60606000825160026109a59190612d27565b67ffffffffffffffff8111156109bd576109bd612946565b6040519080825280601f01601f1916602001820160405280156109e7576020820181803683370190505b50905060005b8351811015610b0f576004848281518110610a0a57610a0a612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82610a3f836002612d27565b81518110610a4f57610a4f612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110610a9257610a92612c51565b0160200151610aa4919060f81c612ce2565b60f81b82610ab3836002612d27565b610abe906001612c9b565b81518110610ace57610ace612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610b0781612c80565b9150506109ed565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610b425790505090506000610b66856001611413565b9050610b79610b748261150b565b61165d565b82600081518110610b8c57610b8c612c51565b6020026020010181905250610ba08461165d565b82600181518110610bb357610bb3612c51565b6020026020010181905250610bc7826116cc565b95945050505050565b606082600087610be1600189612c3a565b81518110610bf157610bf1612c51565b602002602001015190506000610c0682611710565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610c225790505090506000806002846002811115610c6257610c62612d46565b1415610d60578b5160009015610d1b5760005b60018e51610c839190612c3a565b811015610d19576000610cae8f8381518110610ca157610ca1612c51565b6020026020010151611710565b6002811115610cbf57610cbf612d46565b1415610cd75781610ccf81612c80565b925050610d07565b610cf98e8281518110610cec57610cec612c51565b60200260200101516117fa565b51610d049083612c9b565b91505b80610d1181612c80565b915050610c75565b505b610d24866117fa565b51610d48610d31886117fa565b610d43610d3d8f610993565b85611336565b611367565b148015610d5457508651155b15610d5e57600191505b505b8015610da757610d78610d72866117fa565b89610b16565b838381518110610d8a57610d8a612c51565b6020908102919091010152610da0600183612c9b565b9150611017565b6000846002811115610dbb57610dbb612d46565b1415610e0a578551610dd157610d78858961180d565b84838381518110610de457610de4612c51565b6020908102919091010152610dfa600183612c9b565b9150610d78610d72876001611336565b6000610e15866117fa565b90506000610e238289611367565b90508015610e91576000610e3983600084611891565b9050610e4d81610e488d611a30565b611a5a565b868681518110610e5f57610e5f612c51565b6020908102919091010152610e75600186612c9b565b9450610e818383611336565b9250610e8d8983611336565b9850505b6000610e9b611aaa565b9050825160001415610ec057610eb981610eb48a610969565b61180d565b9050610f64565b600083600081518110610ed557610ed5612c51565b016020015160f81c9050610eea846001611336565b93506002886002811115610f0057610f00612d46565b1415610f3b576000610f1a85610f158c610969565b610b16565b9050610f338383610f2e8460000151611a30565b611b9c565b925050610f62565b835115610f51576000610f1a85610e488c610969565b610f5f8282610f2e8c610969565b91505b505b8851610fa657610f74818c61180d565b905080868681518110610f8957610f89612c51565b6020908102919091010152610f9f600186612c9b565b9450611013565b610fb1896001611336565b985080868681518110610fc657610fc6612c51565b6020908102919091010152610fdc600186612c9b565b9450610fe8898c610b16565b868681518110610ffa57610ffa612c51565b6020908102919091010152611010600186612c9b565b94505b5050505b61102d8c61102660018e612c3a565b8585611c26565b9c9b505050505050505050505050565b60008061104983610993565b9050611068604051806040016040528060608152602001606081525090565b84516000906060905b80156111de5787611083600183612c3a565b8151811061109357611093612c51565b602002602001015193506110a684611710565b925060028360028111156110bc576110bc612d46565b14156110f05760006110cd856117fa565b90506110e8866000835189516110e39190612c3a565b611891565b9550506111bf565b600183600281111561110457611104612d46565b1415611148576000611115856117fa565b905061112b866000835189516110e39190612c3a565b8351909650156111425761113f8584611d54565b94505b506111bf565b600083600281111561115c5761115c612d46565b14156111bf578151156111bf576000856001875161117a9190612c3a565b8151811061118a5761118a612c51565b602001015160f81c60f81b60f81c90506111ae866000600189516110e39190612c3a565b95506111bb858285611b9c565b9450505b83516111ca90611a30565b9150806111d681612d75565b915050611071565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611e18565b6060600080600061123685612017565b91945092509050600081600181111561125157611251612d46565b1461129e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610257565b610bc785602001518484612368565b60006020825110156112c157506020015190565b818060200190518101906100fc9190612d8c565b600060606020836000015110156112f6576112ef83612447565b9050611302565b6112ff83611226565b90505b61130b816112ad565b9392505050565b60606100fc611331836020015160008151811061046957610469612c51565b610993565b60608251821061135557506040805160208101909152600081526100fc565b6100f983838486516110e39190612c3a565b6000805b80845111801561137b5750808351115b80156113fc575082818151811061139457611394612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106113d3576113d3612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061140b81612c80565b91505061136b565b6060600082611423576000611426565b60025b90506000600285516114389190612da5565b90506000611447826002612d04565b60ff1667ffffffffffffffff81111561146257611462612946565b6040519080825280601f01601f19166020018201604052801561148c576020820181803683370190505b5090506114998284612db9565b60f81b816000815181106114af576114af612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080866040516020016114f1929190612dde565b604051602081830303815290604052935050505092915050565b606060006002835161151d9190612e0d565b67ffffffffffffffff81111561153557611535612946565b6040519080825280601f01601f19166020018201604052801561155f576020820181803683370190505b50905060005b8151811015610b0f578361157a826002612d27565b611585906001612c9b565b8151811061159557611595612c51565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166004856115ca846002612d27565b815181106115da576115da612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061161c5761161c612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061165581612c80565b915050611565565b6060808251600114801561168b575060808360008151811061168157611681612c51565b016020015160f81c105b156116975750816100fc565b6116a383516080612452565b836040516020016116b5929190612dde565b604051602081830303815290604052905092915050565b604080518082019091526060808252602082015260006116eb83612649565b90506040518060400160405280828152602001611707836111f3565b90529392505050565b600061171e60106001612c9b565b826020015151141561173257506000919050565b600282602001515114156117b257600061174b83611312565b905060008160008151811061176257611762612c51565b016020015160f81c9050600281148061177e575060ff81166003145b1561178d575060029392505050565b60ff811615806117a0575060ff81166001145b156117af575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f646520747970650000000000000000000000000000006044820152606401610257565b60606100fc61180883611312565b61268d565b6040805180820190915260608082526020820152600061182c8361165d565b6040805180820182526000808252602091820152815180830190925282518252808301908201529091506020850151805161186990600190612c3a565b8151811061187957611879612c51565b602002602001018190525061011384602001516126d3565b60608161189f81601f612c9b565b10156118ed5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b826118f88382612c9b565b10156119465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b6119508284612c9b565b845110156119a05760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610257565b6060821580156119bf5760405191506000825260208201604052611a27565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119f85780518352602092830192016119e0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060602082511015611a40575090565b81805190602001206040516020016101c491815260200190565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611a865790505090506000610b66856000611413565b60408051808201909152606080825260208201526000611acc60106001612c9b565b67ffffffffffffffff811115611ae457611ae4612946565b604051908082528060200260200182016040528015611b1757816020015b6060815260200190600190039081611b025790505b50905060005b8151811015611b8c576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611b6e57611b6e612c51565b60200260200101819052508080611b8490612c80565b915050611b1d565b50611b96816116cc565b91505090565b604080518082019091526060808252602082015260006020835110611bc957611bc48361165d565b611bcb565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611c0e57611c0e612c51565b6020026020010181905250610bc785602001516126d3565b60606000611c348386612c9b565b67ffffffffffffffff811115611c4c57611c4c612946565b604051908082528060200260200182016040528015611c9157816020015b6040805180820190915260608082526020820152815260200190600190039081611c6a5790505b50905060005b85811015611ce957868181518110611cb157611cb1612c51565b6020026020010151828281518110611ccb57611ccb612c51565b60200260200101819052508080611ce190612c80565b915050611c97565b5060005b83811015611d4a57848181518110611d0757611d07612c51565b6020026020010151828783611d1c9190612c9b565b81518110611d2c57611d2c612c51565b60200260200101819052508080611d4290612c80565b915050611ced565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611d805790505090506000611dac611da5866117fa565b6000611413565b9050611dba610b748261150b565b82600081518110611dcd57611dcd612c51565b6020026020010181905250602084511015611e06578382600181518110611df657611df6612c51565b6020026020010181905250611e0f565b610ba08461165d565b610bc7826116cc565b6060600080611e2684612017565b91935090915060019050816001811115611e4257611e42612d46565b14611e8f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610257565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611ea85790505090506000835b865181101561200c5760208210611f545760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610257565b600080611f916040518060400160405280858c60000151611f759190612c3a565b8152602001858c60200151611f8a9190612c9b565b9052612017565b509150915060405180604001604052808383611fad9190612c9b565b8152602001848b60200151611fc29190612c9b565b815250858581518110611fd757611fd7612c51565b6020908102919091010152611fed600185612c9b565b9350611ff98183612c9b565b6120039084612c9b565b92505050611ed5565b508152949350505050565b60008060008084600001511161206f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610257565b6020840151805160001a607f8111612094576000600160009450945094505050612361565b60b781116121105760006120a9608083612c3a565b9050808760000151116120fe5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610257565b60019550935060009250612361915050565b60bf81116121ff57600061212560b783612c3a565b90508087600001511161217a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610257565b600183015160208290036101000a90046121948183612c9b565b8851116121e35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610257565b6121ee826001612c9b565b965094506000935061236192505050565b60f7811161227a57600061221460c083612c3a565b9050808760000151116122695760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610257565b600195509350849250612361915050565b600061228760f783612c3a565b9050808760000151116122dc5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610257565b600183015160208290036101000a90046122f68183612c9b565b8851116123455760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610257565b612350826001612c9b565b965094506001935061236192505050565b9193909250565b606060008267ffffffffffffffff81111561238557612385612946565b6040519080825280601f01601f1916602001820160405280156123af576020820181803683370190505b5090508051600014156123c357905061130b565b60006123cf8587612c9b565b90506020820160005b6123e3602087612e0d565b81101561241a57825182526123f9602084612c9b565b9250612406602083612c9b565b91508061241281612c80565b9150506123d8565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc826127a1565b60608060388410156124d157604080516001808252818301909252906020820181803683370190505090506124878385612db9565b60f81b8160008151811061249d5761249d612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124e08187612e0d565b1561250657816124ef81612c80565b92506124ff905061010082612d27565b90506124d6565b612511826001612c9b565b67ffffffffffffffff81111561252957612529612946565b6040519080825280601f01601f191660200182016040528015612553576020820181803683370190505b5092506125608583612db9565b61256b906037612db9565b60f81b8360008151811061258157612581612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b81811161263f576101006125c98284612c3a565b6125d590610100612f05565b6125df9088612e0d565b6125e99190612da5565b60f81b8382815181106125fe576125fe612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061263781612c80565b9150506125b5565b5050905092915050565b60606000612656836127b7565b9050612664815160c0612452565b81604051602001612676929190612dde565b604051602081830303815290604052915050919050565b60606002826000815181106126a4576126a4612c51565b01602001516126b6919060f81c612ce2565b60ff166126c8576100fc826002611336565b6100fc826001611336565b60408051808201909152606080825260208201526000825167ffffffffffffffff81111561270357612703612946565b60405190808252806020026020018201604052801561273657816020015b60608152602001906001900390816127215790505b50905060005b83518110156127975761276784828151811061275a5761275a612c51565b6020026020010151612447565b82828151811061277957612779612c51565b6020026020010181905250808061278f90612c80565b91505061273c565b5061130b816116cc565b60606100fc826020015160008460000151612368565b60608151600014156127d9576040805160008082526020820190925290610b0f565b6000805b8351811015612820578381815181106127f8576127f8612c51565b6020026020010151518261280c9190612c9b565b91508061281881612c80565b9150506127dd565b60008267ffffffffffffffff81111561283b5761283b612946565b6040519080825280601f01601f191660200182016040528015612865576020820181803683370190505b50600092509050602081015b8551831015611a2757600086848151811061288e5761288e612c51565b6020026020010151905060006020820190506128ac838284516128e9565b8785815181106128be576128be612c51565b602002602001015151836128d29190612c9b565b9250505082806128e190612c80565b935050612871565b8282825b602081106129255781518352612904602084612c9b565b9250612911602083612c9b565b915061291e602082612c3a565b90506128ed565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261298657600080fd5b813567ffffffffffffffff808211156129a1576129a1612946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129e7576129e7612946565b81604052838152866020858801011115612a0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612a3557600080fd5b833567ffffffffffffffff80821115612a4d57600080fd5b612a5987838801612975565b94506020860135915080821115612a6f57600080fd5b50612a7c86828701612975565b925050604084013590509250925092565b60005b83811015612aa8578181015183820152602001612a90565b83811115612ab7576000848401525b50505050565b82151581526040602082015260008251806040840152612ae4816060850160208701612a8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612b2a57600080fd5b823567ffffffffffffffff80821115612b4257600080fd5b612b4e86838701612975565b93506020850135915080821115612b6457600080fd5b50612b7185828601612975565b9150509250929050565b60008060008060808587031215612b9157600080fd5b843567ffffffffffffffff80821115612ba957600080fd5b612bb588838901612975565b95506020870135915080821115612bcb57600080fd5b612bd788838901612975565b94506040870135915080821115612bed57600080fd5b50612bfa87828801612975565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612c4c57612c4c612c0b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612c9457612c94612c0b565b5060010190565b60008219821115612cae57612cae612c0b565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612cf557612cf5612cb3565b8060ff84160691505092915050565b600060ff821660ff841680821015612d1e57612d1e612c0b565b90039392505050565b6000816000190483118215151615612d4157612d41612c0b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612d8457612d84612c0b565b506000190190565b600060208284031215612d9e57600080fd5b5051919050565b600082612db457612db4612cb3565b500690565b600060ff821660ff84168060ff03821115612dd657612dd6612c0b565b019392505050565b60008351612df0818460208801612a8d565b835190830190612e04818360208801612a8d565b01949350505050565b600082612e1c57612e1c612cb3565b500490565b600181815b80851115612e5c578160001904821115612e4257612e42612c0b565b80851615612e4f57918102915b93841c9390800290612e26565b509250929050565b600082612e73575060016100fc565b81612e80575060006100fc565b8160018114612e965760028114612ea057612ebc565b60019150506100fc565b60ff841115612eb157612eb1612c0b565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612edf575081810a6100fc565b612ee98383612e21565b8060001904821115612efd57612efd612c0b565b029392505050565b60006100f98383612e6456fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.json +index 68ba649..4de5e88 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.json +@@ -53,31 +53,6 @@ + "stateMutability": "view", + "type": "function" + }, +- { +- "inputs": [], +- "name": "getContext", +- "outputs": [ +- { +- "components": [ +- { +- "internalType": "uint40", +- "name": "length", +- "type": "uint40" +- }, +- { +- "internalType": "bytes27", +- "name": "extraData", +- "type": "bytes27" +- } +- ], +- "internalType": "struct Lib_Buffer.BufferContext", +- "name": "", +- "type": "tuple" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, + { + "inputs": [], + "name": "getExtraData", +@@ -122,37 +97,6 @@ + "stateMutability": "nonpayable", + "type": "function" + }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "_value", +- "type": "bytes32" +- } +- ], +- "name": "push", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint40", +- "name": "_index", +- "type": "uint40" +- }, +- { +- "internalType": "bytes27", +- "name": "_extraData", +- "type": "bytes27" +- } +- ], +- "name": "setContext", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, + { + "inputs": [ + { +@@ -167,8 +111,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50610811806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80639ef62e0d11610076578063b298e36b1161005b578063b298e36b146101b5578063be1c766b146101c8578063f8ab57d8146101e657600080fd5b80639ef62e0d14610183578063a77df9921461019657600080fd5b80632015276c116100a75780632015276c1461013c57806320f89a351461014f5780639507d39a1461016257600080fd5b8063061bc18f146100c3578063127f0f07146100d8575b600080fd5b6100d66100d13660046106e3565b6101f9565b005b60408051808201825260008082526020918201819052825180840184528181528201819052548251808401845264ffffffffff821680825264ffffffffff199283169184019182528451908152905190911691810191909152015b60405180910390f35b6100d661014a366004610716565b61020e565b6100d661015d366004610739565b61021a565b61017561017036600461075b565b610228565b604051908152602001610133565b6100d66101913660046106e3565b61023a565b61019e61026c565b60405164ffffffffff199091168152602001610133565b6100d66101c336600461075b565b610278565b6101d0610283565b60405164ffffffffff9091168152602001610133565b6100d66101f4366004610774565b61028f565b6102056000838361029a565b5050565b905090565b61020560008383610386565b610225600082610415565b50565b60006102348183610471565b92915050565b6040805180820190915264ffffffffff8316815264ffffffffff1982166020820152610267600082610540565b505050565b60006102096000610560565b6102256000826105ae565b6000610209600061060b565b610225600082610656565b60006102dc84604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff161061035e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e00000000000000000000000060448201526064015b60405180910390fd5b64ffffffffff8316815264ffffffffff19821660208201526103808482610540565b50505050565b60006103c884604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816103f38261078f565b64ffffffffff1690525064ffffffffff19821660208201526103808482610540565b600061045783604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff198316602082015290506102678382610540565b6000806104b484604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610355565b50506000908152600191909101602052604090205490565b8051602082015183548183179291908314610559578285555b5050505050565b6000806105a383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b60006105f083604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610267828260200151856103869092919063ffffffff16565b60008061064e83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061069883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b90506102678282602001518561029a9092919063ffffffff16565b803564ffffffffff811681146106c857600080fd5b919050565b803564ffffffffff19811681146106c857600080fd5b600080604083850312156106f657600080fd5b6106ff836106b3565b915061070d602084016106cd565b90509250929050565b6000806040838503121561072957600080fd5b8235915061070d602084016106cd565b60006020828403121561074b57600080fd5b610754826106cd565b9392505050565b60006020828403121561076d57600080fd5b5035919050565b60006020828403121561078657600080fd5b610754826106b3565b600064ffffffffff808316818114156107d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea2646970667358221220cf9128a6d5d235a947cbe60cd78e70c2bd72666c319910781c3e4a6779f602e664736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80639ef62e0d11610076578063b298e36b1161005b578063b298e36b146101b5578063be1c766b146101c8578063f8ab57d8146101e657600080fd5b80639ef62e0d14610183578063a77df9921461019657600080fd5b80632015276c116100a75780632015276c1461013c57806320f89a351461014f5780639507d39a1461016257600080fd5b8063061bc18f146100c3578063127f0f07146100d8575b600080fd5b6100d66100d13660046106e3565b6101f9565b005b60408051808201825260008082526020918201819052825180840184528181528201819052548251808401845264ffffffffff821680825264ffffffffff199283169184019182528451908152905190911691810191909152015b60405180910390f35b6100d661014a366004610716565b61020e565b6100d661015d366004610739565b61021a565b61017561017036600461075b565b610228565b604051908152602001610133565b6100d66101913660046106e3565b61023a565b61019e61026c565b60405164ffffffffff199091168152602001610133565b6100d66101c336600461075b565b610278565b6101d0610283565b60405164ffffffffff9091168152602001610133565b6100d66101f4366004610774565b61028f565b6102056000838361029a565b5050565b905090565b61020560008383610386565b610225600082610415565b50565b60006102348183610471565b92915050565b6040805180820190915264ffffffffff8316815264ffffffffff1982166020820152610267600082610540565b505050565b60006102096000610560565b6102256000826105ae565b6000610209600061060b565b610225600082610656565b60006102dc84604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff161061035e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e00000000000000000000000060448201526064015b60405180910390fd5b64ffffffffff8316815264ffffffffff19821660208201526103808482610540565b50505050565b60006103c884604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816103f38261078f565b64ffffffffff1690525064ffffffffff19821660208201526103808482610540565b600061045783604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff198316602082015290506102678382610540565b6000806104b484604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610355565b50506000908152600191909101602052604090205490565b8051602082015183548183179291908314610559578285555b5050505050565b6000806105a383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b60006105f083604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610267828260200151856103869092919063ffffffff16565b60008061064e83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061069883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b90506102678282602001518561029a9092919063ffffffff16565b803564ffffffffff811681146106c857600080fd5b919050565b803564ffffffffff19811681146106c857600080fd5b600080604083850312156106f657600080fd5b6106ff836106b3565b915061070d602084016106cd565b90509250929050565b6000806040838503121561072957600080fd5b8235915061070d602084016106cd565b60006020828403121561074b57600080fd5b610754826106cd565b9392505050565b60006020828403121561076d57600080fd5b5035919050565b60006020828403121561078657600080fd5b610754826106b3565b600064ffffffffff808316818114156107d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea2646970667358221220cf9128a6d5d235a947cbe60cd78e70c2bd72666c319910781c3e4a6779f602e664736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b5061068d806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639507d39a1161005b5780639507d39a146100bd578063a77df992146100e3578063be1c766b14610102578063f8ab57d81461012057600080fd5b8063061bc18f146100825780632015276c1461009757806320f89a35146100aa575b600080fd5b610095610090366004610588565b610133565b005b6100956100a53660046105bb565b610143565b6100956100b83660046105de565b61014f565b6100d06100cb366004610600565b61015d565b6040519081526020015b60405180910390f35b6100eb61016f565b60405164ffffffffff1990911681526020016100da565b61010a610180565b60405164ffffffffff90911681526020016100da565b61009561012e366004610619565b61018c565b61013f60008383610197565b5050565b61013f60008383610283565b61015a600082610312565b50565b60006101698183610373565b92915050565b600061017b6000610442565b905090565b600061017b6000610490565b61015a6000826104db565b60006101d984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff161061025b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e00000000000000000000000060448201526064015b60405180910390fd5b64ffffffffff8316815264ffffffffff198216602082015261027d8482610538565b50505050565b60006102c584604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816102f082610634565b64ffffffffff1690525064ffffffffff198216602082015261027d8482610538565b600061035483604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff1983166020820152905061036e8382610538565b505050565b6000806103b684604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff16831061042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610252565b50506000908152600191909101602052604090205490565b60008061048583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b6000806104d383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061051d83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b905061036e828260200151856101979092919063ffffffff16565b8051602082015183548183179291908314610551578285555b5050505050565b803564ffffffffff8116811461056d57600080fd5b919050565b803564ffffffffff198116811461056d57600080fd5b6000806040838503121561059b57600080fd5b6105a483610558565b91506105b260208401610572565b90509250929050565b600080604083850312156105ce57600080fd5b823591506105b260208401610572565b6000602082840312156105f057600080fd5b6105f982610572565b9392505050565b60006020828403121561061257600080fd5b5035919050565b60006020828403121561062b57600080fd5b6105f982610558565b600064ffffffffff80831681811415610676577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80639507d39a1161005b5780639507d39a146100bd578063a77df992146100e3578063be1c766b14610102578063f8ab57d81461012057600080fd5b8063061bc18f146100825780632015276c1461009757806320f89a35146100aa575b600080fd5b610095610090366004610588565b610133565b005b6100956100a53660046105bb565b610143565b6100956100b83660046105de565b61014f565b6100d06100cb366004610600565b61015d565b6040519081526020015b60405180910390f35b6100eb61016f565b60405164ffffffffff1990911681526020016100da565b61010a610180565b60405164ffffffffff90911681526020016100da565b61009561012e366004610619565b61018c565b61013f60008383610197565b5050565b61013f60008383610283565b61015a600082610312565b50565b60006101698183610373565b92915050565b600061017b6000610442565b905090565b600061017b6000610490565b61015a6000826104db565b60006101d984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff161061025b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e00000000000000000000000060448201526064015b60405180910390fd5b64ffffffffff8316815264ffffffffff198216602082015261027d8482610538565b50505050565b60006102c584604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816102f082610634565b64ffffffffff1690525064ffffffffff198216602082015261027d8482610538565b600061035483604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff1983166020820152905061036e8382610538565b505050565b6000806103b684604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff16831061042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610252565b50506000908152600191909101602052604090205490565b60008061048583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b6000806104d383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061051d83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b905061036e828260200151856101979092919063ffffffff16565b8051602082015183548183179291908314610551578285555b5050505050565b803564ffffffffff8116811461056d57600080fd5b919050565b803564ffffffffff198116811461056d57600080fd5b6000806040838503121561059b57600080fd5b6105a483610558565b91506105b260208401610572565b90509250929050565b600080604083850312156105ce57600080fd5b823591506105b260208401610572565b6000602082840312156105f057600080fd5b6105f982610572565b9392505050565b60006020828403121561061257600080fd5b5035919050565b60006020828403121561062b57600080fd5b6105f982610558565b600064ffffffffff80831681811415610676577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.json +index 66ec86e..d102dc5 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.json +@@ -80,8 +80,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b506101ea806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063341f6623146100515780638f03f7fd1461008e578063934e03a4146100af578063b72e717d146100d2575b600080fd5b61006461005f36600461013c565b6100e5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a161009c366004610155565b6100ef565b604051908152602001610085565b6100c26100bd36600461013c565b6100fa565b6040519015158152602001610085565b6100a16100e036600461017e565b610104565b6000815b92915050565b60006100e982610122565b60008115156100e9565b600073ffffffffffffffffffffffffffffffffffffffff82166100e9565b600081610130576000610133565b60015b60ff1692915050565b60006020828403121561014e57600080fd5b5035919050565b60006020828403121561016757600080fd5b8135801515811461017757600080fd5b9392505050565b60006020828403121561019057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461017757600080fdfea264697066735822122023d0fcf220a19838726dcbb6e91624b5d0b776a452b4288059f0c18acb176e9564736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063341f6623146100515780638f03f7fd1461008e578063934e03a4146100af578063b72e717d146100d2575b600080fd5b61006461005f36600461013c565b6100e5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a161009c366004610155565b6100ef565b604051908152602001610085565b6100c26100bd36600461013c565b6100fa565b6040519015158152602001610085565b6100a16100e036600461017e565b610104565b6000815b92915050565b60006100e982610122565b60008115156100e9565b600073ffffffffffffffffffffffffffffffffffffffff82166100e9565b600081610130576000610133565b60015b60ff1692915050565b60006020828403121561014e57600080fd5b5035919050565b60006020828403121561016757600080fd5b8135801515811461017757600080fd5b9392505050565b60006020828403121561019057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461017757600080fdfea264697066735822122023d0fcf220a19838726dcbb6e91624b5d0b776a452b4288059f0c18acb176e9564736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506101c1806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063341f6623146100515780638f03f7fd1461008e578063934e03a4146100af578063b72e717d146100d2575b600080fd5b61006461005f36600461013c565b6100e5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a161009c366004610155565b6100ef565b604051908152602001610085565b6100c26100bd36600461013c565b6100fa565b6040519015158152602001610085565b6100a16100e036600461017e565b610104565b6000815b92915050565b60006100e982610122565b60008115156100e9565b600073ffffffffffffffffffffffffffffffffffffffff82166100e9565b600081610130576000610133565b60015b60ff1692915050565b60006020828403121561014e57600080fd5b5035919050565b60006020828403121561016757600080fd5b8135801515811461017757600080fd5b9392505050565b60006020828403121561019057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461017757600080fdfea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063341f6623146100515780638f03f7fd1461008e578063934e03a4146100af578063b72e717d146100d2575b600080fd5b61006461005f36600461013c565b6100e5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a161009c366004610155565b6100ef565b604051908152602001610085565b6100c26100bd36600461013c565b6100fa565b6040519015158152602001610085565b6100a16100e036600461017e565b610104565b6000815b92915050565b60006100e982610122565b60008115156100e9565b600073ffffffffffffffffffffffffffffffffffffffff82166100e9565b600081610130576000610133565b60015b60ff1692915050565b60006020828403121561014e57600080fd5b5035919050565b60006020828403121561016757600080fd5b8135801515811461017757600080fd5b9392505050565b60006020828403121561019057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461017757600080fdfea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.json +index 2764c48..2c50032 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.json +@@ -186,8 +186,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b5061124c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c6fa7f7a1161005b578063c6fa7f7a14610109578063cf89ee171461011c578063e00413961461012f578063efa739761461014257600080fd5b8063235266d21461008d57806347f53431146100b55780635f3376f3146100d6578063bd37c8aa146100f6575b600080fd5b6100a061009b3660046107f9565b610155565b60405190151581526020015b60405180910390f35b6100c86100c336600461085d565b610179565b6040519081526020016100ac565b6100e96100e43660046107f9565b61018a565b6040516100ac91906108c2565b6100c861010436600461085d565b6101b6565b6100e961011736600461085d565b6101c1565b6100e961012a366004610913565b6101cc565b6100e961013d366004610913565b61020b565b6100e961015036600461085d565b610218565b600061017283838051602091820120825192909101919091201490565b9392505050565b600061018482610223565b92915050565b6060828260405160200161019f929190610961565b604051602081830303815290604052905092915050565b600061018482610179565b60606101848261024b565b60606040516101da90610712565b604051809103906000f0801580156101f6573d6000803e3d6000fd5b50506102038484846103ce565b949350505050565b60606102038484846103ce565b6060610184826105c0565b600060208251101561023757506020015190565b818060200190518101906101849190610990565b606060008251600261025d91906109d8565b67ffffffffffffffff8111156102755761027561071f565b6040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b83518110156103c75760048482815181106102c2576102c2610a15565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826102f78360026109d8565b8151811061030757610307610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061034a5761034a610a15565b016020015161035c919060f81c610a73565b60f81b8261036b8360026109d8565b610376906001610a95565b8151811061038657610386610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806103bf81610aad565b9150506102a5565b5092915050565b6060816103dc81601f610a95565b1015610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b826104548382610a95565b10156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610440565b6104c68284610a95565b84511015610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610440565b60608215801561054f57604051915060008252602082016040526105b7565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610588578051835260209283019201610570565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606000600283516105d29190610ae6565b67ffffffffffffffff8111156105ea576105ea61071f565b6040519080825280601f01601f191660200182016040528015610614576020820181803683370190505b50905060005b81518110156103c7578361062f8260026109d8565b61063a906001610a95565b8151811061064a5761064a610a15565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660048561067f8460026109d8565b8151811061068f5761068f610a15565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b178282815181106106d1576106d1610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061070a81610aad565b91505061061a565b61071c80610afb83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261075f57600080fd5b813567ffffffffffffffff8082111561077a5761077a61071f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156107c0576107c061071f565b816040528381528660208588010111156107d957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561080c57600080fd5b823567ffffffffffffffff8082111561082457600080fd5b6108308683870161074e565b9350602085013591508082111561084657600080fd5b506108538582860161074e565b9150509250929050565b60006020828403121561086f57600080fd5b813567ffffffffffffffff81111561088657600080fd5b6102038482850161074e565b60005b838110156108ad578181015183820152602001610895565b838111156108bc576000848401525b50505050565b60208152600082518060208401526108e1816040850160208701610892565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006060848603121561092857600080fd5b833567ffffffffffffffff81111561093f57600080fd5b61094b8682870161074e565b9660208601359650604090950135949350505050565b60008351610973818460208801610892565b835190830190610987818360208801610892565b01949350505050565b6000602082840312156109a257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a1057610a106109a9565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680610a8657610a86610a44565b8060ff84160691505092915050565b60008219821115610aa857610aa86109a9565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610adf57610adf6109a9565b5060010190565b600082610af557610af5610a44565b50049056fe608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033a2646970667358221220029c74bfc58b89d03b703d138166605979cdd9eaa1dc9126d4fdd4d8dae0c4e564736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c6fa7f7a1161005b578063c6fa7f7a14610109578063cf89ee171461011c578063e00413961461012f578063efa739761461014257600080fd5b8063235266d21461008d57806347f53431146100b55780635f3376f3146100d6578063bd37c8aa146100f6575b600080fd5b6100a061009b3660046107f9565b610155565b60405190151581526020015b60405180910390f35b6100c86100c336600461085d565b610179565b6040519081526020016100ac565b6100e96100e43660046107f9565b61018a565b6040516100ac91906108c2565b6100c861010436600461085d565b6101b6565b6100e961011736600461085d565b6101c1565b6100e961012a366004610913565b6101cc565b6100e961013d366004610913565b61020b565b6100e961015036600461085d565b610218565b600061017283838051602091820120825192909101919091201490565b9392505050565b600061018482610223565b92915050565b6060828260405160200161019f929190610961565b604051602081830303815290604052905092915050565b600061018482610179565b60606101848261024b565b60606040516101da90610712565b604051809103906000f0801580156101f6573d6000803e3d6000fd5b50506102038484846103ce565b949350505050565b60606102038484846103ce565b6060610184826105c0565b600060208251101561023757506020015190565b818060200190518101906101849190610990565b606060008251600261025d91906109d8565b67ffffffffffffffff8111156102755761027561071f565b6040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b83518110156103c75760048482815181106102c2576102c2610a15565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826102f78360026109d8565b8151811061030757610307610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061034a5761034a610a15565b016020015161035c919060f81c610a73565b60f81b8261036b8360026109d8565b610376906001610a95565b8151811061038657610386610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806103bf81610aad565b9150506102a5565b5092915050565b6060816103dc81601f610a95565b1015610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b826104548382610a95565b10156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610440565b6104c68284610a95565b84511015610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610440565b60608215801561054f57604051915060008252602082016040526105b7565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610588578051835260209283019201610570565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606000600283516105d29190610ae6565b67ffffffffffffffff8111156105ea576105ea61071f565b6040519080825280601f01601f191660200182016040528015610614576020820181803683370190505b50905060005b81518110156103c7578361062f8260026109d8565b61063a906001610a95565b8151811061064a5761064a610a15565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660048561067f8460026109d8565b8151811061068f5761068f610a15565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b178282815181106106d1576106d1610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061070a81610aad565b91505061061a565b61071c80610afb83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261075f57600080fd5b813567ffffffffffffffff8082111561077a5761077a61071f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156107c0576107c061071f565b816040528381528660208588010111156107d957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561080c57600080fd5b823567ffffffffffffffff8082111561082457600080fd5b6108308683870161074e565b9350602085013591508082111561084657600080fd5b506108538582860161074e565b9150509250929050565b60006020828403121561086f57600080fd5b813567ffffffffffffffff81111561088657600080fd5b6102038482850161074e565b60005b838110156108ad578181015183820152602001610895565b838111156108bc576000848401525b50505050565b60208152600082518060208401526108e1816040850160208701610892565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006060848603121561092857600080fd5b833567ffffffffffffffff81111561093f57600080fd5b61094b8682870161074e565b9660208601359650604090950135949350505050565b60008351610973818460208801610892565b835190830190610987818360208801610892565b01949350505050565b6000602082840312156109a257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a1057610a106109a9565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680610a8657610a86610a44565b8060ff84160691505092915050565b60008219821115610aa857610aa86109a9565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610adf57610adf6109a9565b5060010190565b600082610af557610af5610a44565b50049056fe608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea26469706673582212202815312896f87dd17755da274a3e8739684a4ded8acfa86d8baf4fafbb3d4c0864736f6c63430008090033a2646970667358221220029c74bfc58b89d03b703d138166605979cdd9eaa1dc9126d4fdd4d8dae0c4e564736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b506111fa806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c6fa7f7a1161005b578063c6fa7f7a14610109578063cf89ee171461011c578063e00413961461012f578063efa739761461014257600080fd5b8063235266d21461008d57806347f53431146100b55780635f3376f3146100d6578063bd37c8aa146100f6575b600080fd5b6100a061009b3660046107f9565b610155565b60405190151581526020015b60405180910390f35b6100c86100c336600461085d565b610179565b6040519081526020016100ac565b6100e96100e43660046107f9565b61018a565b6040516100ac91906108c2565b6100c861010436600461085d565b6101b6565b6100e961011736600461085d565b6101c1565b6100e961012a366004610913565b6101cc565b6100e961013d366004610913565b61020b565b6100e961015036600461085d565b610218565b600061017283838051602091820120825192909101919091201490565b9392505050565b600061018482610223565b92915050565b6060828260405160200161019f929190610961565b604051602081830303815290604052905092915050565b600061018482610179565b60606101848261024b565b60606040516101da90610712565b604051809103906000f0801580156101f6573d6000803e3d6000fd5b50506102038484846103ce565b949350505050565b60606102038484846103ce565b6060610184826105c0565b600060208251101561023757506020015190565b818060200190518101906101849190610990565b606060008251600261025d91906109d8565b67ffffffffffffffff8111156102755761027561071f565b6040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b83518110156103c75760048482815181106102c2576102c2610a15565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826102f78360026109d8565b8151811061030757610307610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061034a5761034a610a15565b016020015161035c919060f81c610a73565b60f81b8261036b8360026109d8565b610376906001610a95565b8151811061038657610386610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806103bf81610aad565b9150506102a5565b5092915050565b6060816103dc81601f610a95565b1015610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b826104548382610a95565b10156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610440565b6104c68284610a95565b84511015610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610440565b60608215801561054f57604051915060008252602082016040526105b7565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610588578051835260209283019201610570565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606000600283516105d29190610ae6565b67ffffffffffffffff8111156105ea576105ea61071f565b6040519080825280601f01601f191660200182016040528015610614576020820181803683370190505b50905060005b81518110156103c7578361062f8260026109d8565b61063a906001610a95565b8151811061064a5761064a610a15565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660048561067f8460026109d8565b8151811061068f5761068f610a15565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b178282815181106106d1576106d1610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061070a81610aad565b91505061061a565b6106f380610afb83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261075f57600080fd5b813567ffffffffffffffff8082111561077a5761077a61071f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156107c0576107c061071f565b816040528381528660208588010111156107d957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561080c57600080fd5b823567ffffffffffffffff8082111561082457600080fd5b6108308683870161074e565b9350602085013591508082111561084657600080fd5b506108538582860161074e565b9150509250929050565b60006020828403121561086f57600080fd5b813567ffffffffffffffff81111561088657600080fd5b6102038482850161074e565b60005b838110156108ad578181015183820152602001610895565b838111156108bc576000848401525b50505050565b60208152600082518060208401526108e1816040850160208701610892565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006060848603121561092857600080fd5b833567ffffffffffffffff81111561093f57600080fd5b61094b8682870161074e565b9660208601359650604090950135949350505050565b60008351610973818460208801610892565b835190830190610987818360208801610892565b01949350505050565b6000602082840312156109a257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a1057610a106109a9565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680610a8657610a86610a44565b8060ff84160691505092915050565b60008219821115610aa857610aa86109a9565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610adf57610adf6109a9565b5060010190565b600082610af557610af5610a44565b50049056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c6fa7f7a1161005b578063c6fa7f7a14610109578063cf89ee171461011c578063e00413961461012f578063efa739761461014257600080fd5b8063235266d21461008d57806347f53431146100b55780635f3376f3146100d6578063bd37c8aa146100f6575b600080fd5b6100a061009b3660046107f9565b610155565b60405190151581526020015b60405180910390f35b6100c86100c336600461085d565b610179565b6040519081526020016100ac565b6100e96100e43660046107f9565b61018a565b6040516100ac91906108c2565b6100c861010436600461085d565b6101b6565b6100e961011736600461085d565b6101c1565b6100e961012a366004610913565b6101cc565b6100e961013d366004610913565b61020b565b6100e961015036600461085d565b610218565b600061017283838051602091820120825192909101919091201490565b9392505050565b600061018482610223565b92915050565b6060828260405160200161019f929190610961565b604051602081830303815290604052905092915050565b600061018482610179565b60606101848261024b565b60606040516101da90610712565b604051809103906000f0801580156101f6573d6000803e3d6000fd5b50506102038484846103ce565b949350505050565b60606102038484846103ce565b6060610184826105c0565b600060208251101561023757506020015190565b818060200190518101906101849190610990565b606060008251600261025d91906109d8565b67ffffffffffffffff8111156102755761027561071f565b6040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b83518110156103c75760048482815181106102c2576102c2610a15565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826102f78360026109d8565b8151811061030757610307610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061034a5761034a610a15565b016020015161035c919060f81c610a73565b60f81b8261036b8360026109d8565b610376906001610a95565b8151811061038657610386610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806103bf81610aad565b9150506102a5565b5092915050565b6060816103dc81601f610a95565b1015610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b826104548382610a95565b10156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610440565b6104c68284610a95565b84511015610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610440565b60608215801561054f57604051915060008252602082016040526105b7565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610588578051835260209283019201610570565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606000600283516105d29190610ae6565b67ffffffffffffffff8111156105ea576105ea61071f565b6040519080825280601f01601f191660200182016040528015610614576020820181803683370190505b50905060005b81518110156103c7578361062f8260026109d8565b61063a906001610a95565b8151811061064a5761064a610a15565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660048561067f8460026109d8565b8151811061068f5761068f610a15565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b178282815181106106d1576106d1610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061070a81610aad565b91505061061a565b6106f380610afb83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261075f57600080fd5b813567ffffffffffffffff8082111561077a5761077a61071f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156107c0576107c061071f565b816040528381528660208588010111156107d957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561080c57600080fd5b823567ffffffffffffffff8082111561082457600080fd5b6108308683870161074e565b9350602085013591508082111561084657600080fd5b506108538582860161074e565b9150509250929050565b60006020828403121561086f57600080fd5b813567ffffffffffffffff81111561088657600080fd5b6102038482850161074e565b60005b838110156108ad578181015183820152602001610895565b838111156108bc576000848401525b50505050565b60208152600082518060208401526108e1816040850160208701610892565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006060848603121561092857600080fd5b833567ffffffffffffffff81111561093f57600080fd5b61094b8682870161074e565b9660208601359650604090950135949350505050565b60008351610973818460208801610892565b835190830190610987818360208801610892565b01949350505050565b6000602082840312156109a257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a1057610a106109a9565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680610a8657610a86610a44565b8060ff84160691505092915050565b60008219821115610aa857610aa86109a9565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610adf57610adf6109a9565b5060010190565b600082610af557610af5610a44565b50049056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.dbg.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.dbg.json +index a931dfc..9ca300d 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.dbg.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.dbg.json +@@ -1,4 +1,4 @@ + { + "_format": "hh-sol-dbg-1", +- "buildInfo": "../../../../build-info/fb184a2dbb1d1a8ecc8faaa1a7e1c084.json" ++ "buildInfo": "../../../../build-info/20b97e043bc860cd790a20ba4276ea5c.json" + } +diff --git a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.json b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.json +index cdf1239..64f850b 100644 +--- a/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.json ++++ b/node_modules/@eth-optimism/contracts/artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.json +@@ -62,8 +62,8 @@ + "type": "function" + } + ], +- "bytecode": "0x608060405234801561001057600080fd5b50610c84806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634869bfb61461003b5780637b0467a014610061575b600080fd5b61004e610049366004610a55565b610084565b6040519081526020015b60405180910390f35b61007461006f366004610a92565b610095565b6040519015158152602001610058565b600061008f826100ae565b92915050565b60006100a486868686866105b1565b9695505050505050565b600080825111610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084015b60405180910390fd5b815160011415610171578160008151811061016257610162610af4565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561058757610422600285610b81565b915061042f600285610b95565b600114905060005b828110156104db578a61044b826002610ba9565b8151811061045b5761045b610af4565b602002602001015196508a8160026104739190610ba9565b61047e906001610be6565b8151811061048e5761048e610af4565b6020026020010151955086602089015285604089015287805190602001208b82815181106104be576104be610af4565b6020908102919091010152806104d381610bfe565b915050610437565b50801561055757896104ee600186610c37565b815181106104fe576104fe610af4565b6020026020010151955087836010811061051a5761051a610af4565b602002015160001b945085602088015284604088015286805190602001208a838151811061054a5761054a610af4565b6020026020010181815250505b80610563576000610566565b60015b6105739060ff1683610be6565b93508261057f81610bfe565b93505061040e565b8960008151811061059a5761059a610af4565b602002602001015198505050505050505050919050565b6000808211610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161013c565b8184106106d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161013c565b6106d98261086d565b83511461078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161013c565b8460005b84518110156108605785600116600114156107f9578481815181106107b9576107b9610af4565b6020026020010151826040516020016107dc929190918252602082015260400190565b604051602081830303815290604052805190602001209150610847565b8185828151811061080c5761080c610af4565b602002602001015160405160200161082e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c948061085881610bfe565b915050610792565b5090951495945050505050565b60008082116108fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161013c565b816001141561090f57506000919050565b81600060805b6001811061094d578061092b600180831b610c37565b901b8316156109455761093e8183610be6565b92811c9291505b60011c610915565b506001811b841461096657610963600182610be6565b90505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126109ad57600080fd5b8135602067ffffffffffffffff808311156109ca576109ca61096d565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610a0d57610a0d61096d565b604052938452858101830193838101925087851115610a2b57600080fd5b83870191505b84821015610a4a57813583529183019190830190610a31565b979650505050505050565b600060208284031215610a6757600080fd5b813567ffffffffffffffff811115610a7e57600080fd5b610a8a8482850161099c565b949350505050565b600080600080600060a08688031215610aaa57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115610ad657600080fd5b610ae28882890161099c565b95989497509295608001359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082610b9057610b90610b23565b500490565b600082610ba457610ba4610b23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610be157610be1610b52565b500290565b60008219821115610bf957610bf9610b52565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c3057610c30610b52565b5060010190565b600082821015610c4957610c49610b52565b50039056fea2646970667358221220f630e5688f30140da2c0f51764d21fe813f461b034554bf2248323a70d9d4e9064736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634869bfb61461003b5780637b0467a014610061575b600080fd5b61004e610049366004610a55565b610084565b6040519081526020015b60405180910390f35b61007461006f366004610a92565b610095565b6040519015158152602001610058565b600061008f826100ae565b92915050565b60006100a486868686866105b1565b9695505050505050565b600080825111610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084015b60405180910390fd5b815160011415610171578160008151811061016257610162610af4565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561058757610422600285610b81565b915061042f600285610b95565b600114905060005b828110156104db578a61044b826002610ba9565b8151811061045b5761045b610af4565b602002602001015196508a8160026104739190610ba9565b61047e906001610be6565b8151811061048e5761048e610af4565b6020026020010151955086602089015285604089015287805190602001208b82815181106104be576104be610af4565b6020908102919091010152806104d381610bfe565b915050610437565b50801561055757896104ee600186610c37565b815181106104fe576104fe610af4565b6020026020010151955087836010811061051a5761051a610af4565b602002015160001b945085602088015284604088015286805190602001208a838151811061054a5761054a610af4565b6020026020010181815250505b80610563576000610566565b60015b6105739060ff1683610be6565b93508261057f81610bfe565b93505061040e565b8960008151811061059a5761059a610af4565b602002602001015198505050505050505050919050565b6000808211610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161013c565b8184106106d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161013c565b6106d98261086d565b83511461078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161013c565b8460005b84518110156108605785600116600114156107f9578481815181106107b9576107b9610af4565b6020026020010151826040516020016107dc929190918252602082015260400190565b604051602081830303815290604052805190602001209150610847565b8185828151811061080c5761080c610af4565b602002602001015160405160200161082e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c948061085881610bfe565b915050610792565b5090951495945050505050565b60008082116108fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161013c565b816001141561090f57506000919050565b81600060805b6001811061094d578061092b600180831b610c37565b901b8316156109455761093e8183610be6565b92811c9291505b60011c610915565b506001811b841461096657610963600182610be6565b90505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126109ad57600080fd5b8135602067ffffffffffffffff808311156109ca576109ca61096d565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610a0d57610a0d61096d565b604052938452858101830193838101925087851115610a2b57600080fd5b83870191505b84821015610a4a57813583529183019190830190610a31565b979650505050505050565b600060208284031215610a6757600080fd5b813567ffffffffffffffff811115610a7e57600080fd5b610a8a8482850161099c565b949350505050565b600080600080600060a08688031215610aaa57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115610ad657600080fd5b610ae28882890161099c565b95989497509295608001359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082610b9057610b90610b23565b500490565b600082610ba457610ba4610b23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610be157610be1610b52565b500290565b60008219821115610bf957610bf9610b52565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c3057610c30610b52565b5060010190565b600082821015610c4957610c49610b52565b50039056fea2646970667358221220f630e5688f30140da2c0f51764d21fe813f461b034554bf2248323a70d9d4e9064736f6c63430008090033", ++ "bytecode": "0x608060405234801561001057600080fd5b50610c5b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634869bfb61461003b5780637b0467a014610061575b600080fd5b61004e610049366004610a55565b610084565b6040519081526020015b60405180910390f35b61007461006f366004610a92565b610095565b6040519015158152602001610058565b600061008f826100ae565b92915050565b60006100a486868686866105b1565b9695505050505050565b600080825111610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084015b60405180910390fd5b815160011415610171578160008151811061016257610162610af4565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561058757610422600285610b81565b915061042f600285610b95565b600114905060005b828110156104db578a61044b826002610ba9565b8151811061045b5761045b610af4565b602002602001015196508a8160026104739190610ba9565b61047e906001610be6565b8151811061048e5761048e610af4565b6020026020010151955086602089015285604089015287805190602001208b82815181106104be576104be610af4565b6020908102919091010152806104d381610bfe565b915050610437565b50801561055757896104ee600186610c37565b815181106104fe576104fe610af4565b6020026020010151955087836010811061051a5761051a610af4565b602002015160001b945085602088015284604088015286805190602001208a838151811061054a5761054a610af4565b6020026020010181815250505b80610563576000610566565b60015b6105739060ff1683610be6565b93508261057f81610bfe565b93505061040e565b8960008151811061059a5761059a610af4565b602002602001015198505050505050505050919050565b6000808211610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161013c565b8184106106d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161013c565b6106d98261086d565b83511461078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161013c565b8460005b84518110156108605785600116600114156107f9578481815181106107b9576107b9610af4565b6020026020010151826040516020016107dc929190918252602082015260400190565b604051602081830303815290604052805190602001209150610847565b8185828151811061080c5761080c610af4565b602002602001015160405160200161082e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c948061085881610bfe565b915050610792565b5090951495945050505050565b60008082116108fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161013c565b816001141561090f57506000919050565b81600060805b6001811061094d578061092b600180831b610c37565b901b8316156109455761093e8183610be6565b92811c9291505b60011c610915565b506001811b841461096657610963600182610be6565b90505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126109ad57600080fd5b8135602067ffffffffffffffff808311156109ca576109ca61096d565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610a0d57610a0d61096d565b604052938452858101830193838101925087851115610a2b57600080fd5b83870191505b84821015610a4a57813583529183019190830190610a31565b979650505050505050565b600060208284031215610a6757600080fd5b813567ffffffffffffffff811115610a7e57600080fd5b610a8a8482850161099c565b949350505050565b600080600080600060a08688031215610aaa57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115610ad657600080fd5b610ae28882890161099c565b95989497509295608001359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082610b9057610b90610b23565b500490565b600082610ba457610ba4610b23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610be157610be1610b52565b500290565b60008219821115610bf957610bf9610b52565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c3057610c30610b52565b5060010190565b600082821015610c4957610c49610b52565b50039056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634869bfb61461003b5780637b0467a014610061575b600080fd5b61004e610049366004610a55565b610084565b6040519081526020015b60405180910390f35b61007461006f366004610a92565b610095565b6040519015158152602001610058565b600061008f826100ae565b92915050565b60006100a486868686866105b1565b9695505050505050565b600080825111610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084015b60405180910390fd5b815160011415610171578160008151811061016257610162610af4565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561058757610422600285610b81565b915061042f600285610b95565b600114905060005b828110156104db578a61044b826002610ba9565b8151811061045b5761045b610af4565b602002602001015196508a8160026104739190610ba9565b61047e906001610be6565b8151811061048e5761048e610af4565b6020026020010151955086602089015285604089015287805190602001208b82815181106104be576104be610af4565b6020908102919091010152806104d381610bfe565b915050610437565b50801561055757896104ee600186610c37565b815181106104fe576104fe610af4565b6020026020010151955087836010811061051a5761051a610af4565b602002015160001b945085602088015284604088015286805190602001208a838151811061054a5761054a610af4565b6020026020010181815250505b80610563576000610566565b60015b6105739060ff1683610be6565b93508261057f81610bfe565b93505061040e565b8960008151811061059a5761059a610af4565b602002602001015198505050505050505050919050565b6000808211610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161013c565b8184106106d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161013c565b6106d98261086d565b83511461078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161013c565b8460005b84518110156108605785600116600114156107f9578481815181106107b9576107b9610af4565b6020026020010151826040516020016107dc929190918252602082015260400190565b604051602081830303815290604052805190602001209150610847565b8185828151811061080c5761080c610af4565b602002602001015160405160200161082e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c948061085881610bfe565b915050610792565b5090951495945050505050565b60008082116108fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161013c565b816001141561090f57506000919050565b81600060805b6001811061094d578061092b600180831b610c37565b901b8316156109455761093e8183610be6565b92811c9291505b60011c610915565b506001811b841461096657610963600182610be6565b90505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126109ad57600080fd5b8135602067ffffffffffffffff808311156109ca576109ca61096d565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610a0d57610a0d61096d565b604052938452858101830193838101925087851115610a2b57600080fd5b83870191505b84821015610a4a57813583529183019190830190610a31565b979650505050505050565b600060208284031215610a6757600080fd5b813567ffffffffffffffff811115610a7e57600080fd5b610a8a8482850161099c565b949350505050565b600080600080600060a08688031215610aaa57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115610ad657600080fd5b610ae28882890161099c565b95989497509295608001359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082610b9057610b90610b23565b500490565b600082610ba457610ba4610b23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610be157610be1610b52565b500290565b60008219821115610bf957610bf9610b52565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c3057610c30610b52565b5060010190565b600082821015610c4957610c49610b52565b50039056fea164736f6c6343000809000a", + "linkReferences": {}, + "deployedLinkReferences": {} + } +diff --git a/node_modules/@eth-optimism/contracts/chugsplash/.DS_Store b/node_modules/@eth-optimism/contracts/chugsplash/.DS_Store +new file mode 100644 +index 0000000..95417cf +Binary files /dev/null and b/node_modules/@eth-optimism/contracts/chugsplash/.DS_Store differ +diff --git a/node_modules/@eth-optimism/contracts/deployments/README.md b/node_modules/@eth-optimism/contracts/deployments/README.md +new file mode 100644 +index 0000000..c541256 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/README.md +@@ -0,0 +1,11 @@ ++# Optimism Deployments ++- [Boba (public mainnet)](./mainnet#readme) ++- [Boba Goerli (public testnet)](./goerli#readme) ++- [Boba Avalanche (public testnet)](./bobafuji#readme) ++- [Boba Avalanche (public mainnet)](./bobaavax#readme) ++- [Bobabase (public testnet)](./bobabase#readme) ++- [Bobaopera (public testnet)](./bobaoperatestnet#readme) ++- [Boba BNB (public testnet)](./bobabnbtestnet#readme) ++- [Boba BNB (public mainnet)](./bobabnb#readme) ++- [Bobabeam (public mainnet)](./bobabeam#readme) ++- [bobaopera (public mainnet)](./bobaopera#readme) +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobaavax/.chainId +new file mode 100644 +index 0000000..2d1acc4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/.chainId +@@ -0,0 +1 @@ ++43114 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/BondManager.json +similarity index 93% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/BondManager.json +rename to node_modules/@eth-optimism/contracts/deployments/bobaavax/BondManager.json +index b0f84cd..4b0d492 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/BondManager.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/BondManager.json +@@ -1,5 +1,5 @@ + { +- "address": "0xc5a603d273E28185c18Ba4d26A0024B2d2F42740", ++ "address": "0x26c319B7B2cF823365414d082698C8ac90cbBA63", + "abi": [ + { + "inputs": [ +@@ -64,29 +64,30 @@ + "type": "function" + } + ], +- "transactionHash": "0x7b5e97e6f485a5ffad3390f798b505ab0de8cb748577835792fea5c12d5908e7", ++ "transactionHash": "0x25384d1882a015d6f3df650e18de22125415e739aec2c6b4d8ce1ad530b7e99d", + "receipt": { + "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0xc5a603d273E28185c18Ba4d26A0024B2d2F42740", ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x26c319B7B2cF823365414d082698C8ac90cbBA63", + "transactionIndex": 3, +- "gasUsed": "295562", ++ "gasUsed": "286699", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xcd2e93d06f7edca70457102213f7e539efc8fdb7d765c38f8e72b7b33ffd8c30", +- "transactionHash": "0x7b5e97e6f485a5ffad3390f798b505ab0de8cb748577835792fea5c12d5908e7", ++ "blockHash": "0x0c284fee171dfd29fdefc24d6df709cc98291060a2fd3db4ea44195f9a48f351", ++ "transactionHash": "0x25384d1882a015d6f3df650e18de22125415e739aec2c6b4d8ce1ad530b7e99d", + "logs": [], +- "blockNumber": 27989625, +- "cumulativeGasUsed": "435248", ++ "blockNumber": 19287048, ++ "cumulativeGasUsed": "628194", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a" ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b" + ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b5060405161048838038061048883398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103f5806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea2646970667358221220cdeb219ac692b599b8857e4140f0cfd6d348cfe93163faebdf5a55b11f0009ea64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea2646970667358221220cdeb219ac692b599b8857e4140f0cfd6d348cfe93163faebdf5a55b11f0009ea64736f6c63430008090033", ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", + "devdoc": { + "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", + "kind": "dev", +@@ -131,16 +132,16 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 12115, + "contract": "contracts/L1/verification/BondManager.sol:BondManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)12107" + } + ], + "types": { +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)12107": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..78c4ae8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x6d58141350072e6a0273ed53c2abd3292d328fd2687b356dc15922d362fac681", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3", ++ "transactionIndex": 6, ++ "gasUsed": "1586311", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xbcd7370449351346ce6c42f7952ba3f85c4892bc3a2aec4d4ebf8d273caa1d5c", ++ "transactionHash": "0x6d58141350072e6a0273ed53c2abd3292d328fd2687b356dc15922d362fac681", ++ "logs": [], ++ "blockNumber": 19287017, ++ "cumulativeGasUsed": "4289455", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 7260, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7262, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7281, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7283, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11836_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11836_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11836_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11836_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11831, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11833, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..65ae1ea +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x82e4fCEBa2d0ce0B3f394b6Ab13e4b1B2D485b89", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xb89c0f82aef7983210ad0e09d2ed40ecc90da063b4cb85878c892f0239615353", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x82e4fCEBa2d0ce0B3f394b6Ab13e4b1B2D485b89", ++ "transactionIndex": 1, ++ "gasUsed": "938115", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xebf58679ba998ff981a1553ceb9ae2dfe3d6dc37b0677da423011968d585e425", ++ "transactionHash": "0xb89c0f82aef7983210ad0e09d2ed40ecc90da063b4cb85878c892f0239615353", ++ "logs": [], ++ "blockNumber": 19286998, ++ "cumulativeGasUsed": "1740126", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-queue.json +similarity index 96% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-CTC-batches.json +rename to node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-queue.json +index 3e78ecb..35622e0 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-CTC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-CTC-queue.json +@@ -1,5 +1,5 @@ + { +- "address": "0x1d6d23989ba6a6e915F0e35BBc574E914d4ed092", ++ "address": "0x32fa4eC0aeadf5DEC8461b3834e5572Ad782f075", + "abi": [ + { + "inputs": [ +@@ -183,30 +183,31 @@ + "type": "function" + } + ], +- "transactionHash": "0xa8f50dd8064b5aaf6ca6bb081451f64047bdb1bf38779e4410e9dd19d7a6d1d6", ++ "transactionHash": "0xd625285a11a5e46f5d76155baedc6b06423e41aa11562d92b68d9eb4cda7f55d", + "receipt": { + "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0x1d6d23989ba6a6e915F0e35BBc574E914d4ed092", ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x32fa4eC0aeadf5DEC8461b3834e5572Ad782f075", + "transactionIndex": 5, +- "gasUsed": "946990", ++ "gasUsed": "938115", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x62f52d86a2099b181e3d3d89bff7bfdc7a2e23b53604c63cb207aca9f3a557df", +- "transactionHash": "0xa8f50dd8064b5aaf6ca6bb081451f64047bdb1bf38779e4410e9dd19d7a6d1d6", ++ "blockHash": "0x1afc65e8564b8b7167c2feca16cc62da434c607d9f7b53307f7138e49e2fb2b5", ++ "transactionHash": "0xd625285a11a5e46f5d76155baedc6b06423e41aa11562d92b68d9eb4cda7f55d", + "logs": [], +- "blockNumber": 27989620, +- "cumulativeGasUsed": "1441158", ++ "blockNumber": 19287004, ++ "cumulativeGasUsed": "2070358", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", + "CanonicalTransactionChain" + ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0x38917b618db448e356c76c999ce9aaca094541eb1f9bc65b06b8d4d84308f056\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620011b3380380620011b3833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f3d80620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", + "kind": "dev", +@@ -310,15 +311,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 12115, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)12107" + }, + { +- "astId": 4067, ++ "astId": 8050, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +327,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 4070, ++ "astId": 8053, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10202_storage" ++ "type": "t_struct(Buffer)15664_storage" + } + ], + "types": { +@@ -340,7 +341,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)12107": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +358,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10202_storage": { ++ "t_struct(Buffer)15664_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10197, ++ "astId": 15659, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +371,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10201, ++ "astId": 15663, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-SCC-batches.json +similarity index 96% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-SCC-batches.json +rename to node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-SCC-batches.json +index eefa273..707d673 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/ChainStorageContainer-SCC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/ChainStorageContainer-SCC-batches.json +@@ -1,5 +1,5 @@ + { +- "address": "0x122208Aa20237FB4c655a9eF02685F7255DF33E8", ++ "address": "0xc4243ecE585B843c7cf92E65617A4211FA580dDb", + "abi": [ + { + "inputs": [ +@@ -183,30 +183,31 @@ + "type": "function" + } + ], +- "transactionHash": "0x4854bd8bbdf98921ee227ca45d512323da2579481a21f571d47c8da42796c590", ++ "transactionHash": "0xe98d0455dfc7002028429b0148d7b25dbf11dcbecfd865854b641e7865bc164f", + "receipt": { + "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0x122208Aa20237FB4c655a9eF02685F7255DF33E8", +- "transactionIndex": 6, +- "gasUsed": "946930", ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0xc4243ecE585B843c7cf92E65617A4211FA580dDb", ++ "transactionIndex": 4, ++ "gasUsed": "938055", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x3f16c62e4fd8f8c9222378f4da3efb3cc1746cb1126dedd2615400e5191ac97a", +- "transactionHash": "0x4854bd8bbdf98921ee227ca45d512323da2579481a21f571d47c8da42796c590", ++ "blockHash": "0x8a273886b9237a1c9a323e3475e53e53686adfc62e0e4f8abb187dbb8cbef446", ++ "transactionHash": "0xe98d0455dfc7002028429b0148d7b25dbf11dcbecfd865854b641e7865bc164f", + "logs": [], +- "blockNumber": 27989622, +- "cumulativeGasUsed": "1592757", ++ "blockNumber": 19287011, ++ "cumulativeGasUsed": "2772062", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", + "StateCommitmentChain" + ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0x38917b618db448e356c76c999ce9aaca094541eb1f9bc65b06b8d4d84308f056\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620011b3380380620011b3833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f3d80620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", + "kind": "dev", +@@ -310,15 +311,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 12115, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)12107" + }, + { +- "astId": 4067, ++ "astId": 8050, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +327,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 4070, ++ "astId": 8053, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10202_storage" ++ "type": "t_struct(Buffer)15664_storage" + } + ], + "types": { +@@ -340,7 +341,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)12107": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +358,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10202_storage": { ++ "t_struct(Buffer)15664_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10197, ++ "astId": 15659, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +371,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10201, ++ "astId": 15663, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..be3766d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4448f115a19b0f6fb5f284b85ac5b16b96b22c4f62a1d306095dedc40d156f69", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8", ++ "transactionIndex": 7, ++ "gasUsed": "697846", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xd6e58c966a7cb8966725f9c75127b5fed5a68014a352572bcf9a5ce8873516b0", ++ "transactionHash": "0x4448f115a19b0f6fb5f284b85ac5b16b96b22c4f62a1d306095dedc40d156f69", ++ "logs": [], ++ "blockNumber": 19287175, ++ "cumulativeGasUsed": "3732079", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Lib_AddressManager.json +new file mode 100644 +index 0000000..0446e99 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xe6e51ad5064f3c4fc2e85a4f446fbe204c340318262bcb867cf8058c3420e084", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ "transactionIndex": 19, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000008000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000002000004000000000020000000000000000000000000804000000000000000000000000000000000000000", ++ "blockHash": "0xdd96221f34c939ffcd0716fdcf510debe97bb32cb0812db0228381039888cdcb", ++ "transactionHash": "0xe6e51ad5064f3c4fc2e85a4f446fbe204c340318262bcb867cf8058c3420e084", ++ "logs": [ ++ { ++ "transactionIndex": 19, ++ "blockNumber": 19286932, ++ "transactionHash": "0xe6e51ad5064f3c4fc2e85a4f446fbe204c340318262bcb867cf8058c3420e084", ++ "address": "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x0000000000000000000000004ec96ad04a997d6bcc004d7a900c2329bc4194cb" ++ ], ++ "data": "0x", ++ "logIndex": 44, ++ "blockHash": "0xdd96221f34c939ffcd0716fdcf510debe97bb32cb0812db0228381039888cdcb" ++ } ++ ], ++ "blockNumber": 19286932, ++ "cumulativeGasUsed": "1996869", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12040, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..6099f8d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0x19FF7f546b66f69e859E07B61444c3d3EF35ABC5", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x1af04e2fe64fc712cb076362d1cd5b9b160cd56839e1e8bc2df2997857b4446d", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x19FF7f546b66f69e859E07B61444c3d3EF35ABC5", ++ "transactionIndex": 0, ++ "gasUsed": "3403430", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x221cfebd8ba5677762a13c593ccb0241a3701858dfde5ca4c33a9a67a31bf5cc", ++ "transactionHash": "0x1af04e2fe64fc712cb076362d1cd5b9b160cd56839e1e8bc2df2997857b4446d", ++ "logs": [], ++ "blockNumber": 19287054, ++ "cumulativeGasUsed": "3403430", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1CrossDomainMessenger.json +similarity index 69% +rename from node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json +rename to node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1CrossDomainMessenger.json +index 278abac..1d9d568 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1CrossDomainMessenger.json +@@ -1,5 +1,5 @@ + { +- "address": "0xEcC89b9EDD804850C4F343A278Be902be11AaF42", ++ "address": "0x0fc742332ae6D447d6619D93985Aa288B81CBb0C", + "abi": [ + { + "inputs": [ +@@ -22,28 +22,29 @@ + "type": "fallback" + } + ], +- "transactionHash": "0xcd9946fbfea0024eeaefeb4b48f05f8be983c394aa29aff8c9a7936843ba11c0", ++ "transactionHash": "0x4bcf69697a35926f4bf1f51099ed038da0dcf585acffe8a6bdfbb34ecaeb0129", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0xEcC89b9EDD804850C4F343A278Be902be11AaF42", ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x0fc742332ae6D447d6619D93985Aa288B81CBb0C", + "transactionIndex": 8, +- "gasUsed": "282551", ++ "gasUsed": "282587", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x83dce0af4c82b6e7c59ee951ffde8a5ed72310c5e79078c99da6fcb6d32a58d3", +- "transactionHash": "0xcd9946fbfea0024eeaefeb4b48f05f8be983c394aa29aff8c9a7936843ba11c0", ++ "blockHash": "0x7ad638ee2c11e894151d6967311cfbfa4846d7a4069cbca62582cd5203f114d2", ++ "transactionHash": "0x4bcf69697a35926f4bf1f51099ed038da0dcf585acffe8a6bdfbb34ecaeb0129", + "logs": [], +- "blockNumber": 5619340, +- "cumulativeGasUsed": "1319976", ++ "blockNumber": 19287063, ++ "cumulativeGasUsed": "930172", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", +- "L1CrossDomainMessenger" ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ "OVM_L1CrossDomainMessenger" + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeb607a7017904b852ad3620a131b6079b03dfada51fcf9cc4815f8ff80ba23f9\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", + "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", + "devdoc": { +@@ -67,7 +68,7 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6609, ++ "astId": 12152, + "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, +@@ -75,12 +76,12 @@ + "type": "t_mapping(t_address,t_string_storage)" + }, + { +- "astId": 6614, ++ "astId": 12157, + "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", +- "type": "t_mapping(t_address,t_contract(Lib_AddressManager)6564)" ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12107)" + } + ], + "types": { +@@ -89,17 +90,17 @@ + "label": "address", + "numberOfBytes": "20" + }, +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)12107": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, +- "t_mapping(t_address,t_contract(Lib_AddressManager)6564)": { ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12107)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", +- "value": "t_contract(Lib_AddressManager)6564" ++ "value": "t_contract(Lib_AddressManager)12107" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..22bf97a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0xf188F1e92B2c78956D2859b84684BFD17103e22c", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xdcc7031f98d769b4c99aec0ed361400664ce5d20b37f3f03342c093e64853fa2", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0xf188F1e92B2c78956D2859b84684BFD17103e22c", ++ "transactionIndex": 10, ++ "gasUsed": "605548", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x57af2dad6bae7f0369975b5ce726ac8f3fabeda8c3cea1d99bf1edded896bc36", ++ "transactionHash": "0xdcc7031f98d769b4c99aec0ed361400664ce5d20b37f3f03342c093e64853fa2", ++ "logs": [], ++ "blockNumber": 19287075, ++ "cumulativeGasUsed": "2012310", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/README.md b/node_modules/@eth-optimism/contracts/deployments/bobaavax/README.md +new file mode 100644 +index 0000000..f68f7b7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/README.md +@@ -0,0 +1,283 @@ ++# Boba Avalanche (public mainnet) ++## Network Info ++- **Chain ID**: 43288 ++- **Public RPC**: https://avax.boba.network ++- **Block Explorer**: https://blockexplorer.avax.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0x26c319B7B2cF823365414d082698C8ac90cbBA63 ++ ++
++CanonicalTransactionChain ++ ++ ++0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3 ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x82e4fCEBa2d0ce0B3f394b6Ab13e4b1B2D485b89 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0x32fa4eC0aeadf5DEC8461b3834e5572Ad782f075 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0xc4243ecE585B843c7cf92E65617A4211FA580dDb ++ ++
++L1MultiMessageRelayer ++ ++ ++0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8 ++ ++
++Lib_AddressManager ++ ++ ++0x00220f8ce1c4be8436574e575fE38558d85e2E6b ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x0fc742332ae6D447d6619D93985Aa288B81CBb0C ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xf188F1e92B2c78956D2859b84684BFD17103e22c ++ ++
++StateCommitmentChain ++ ++ ++0x1ef85D873Cf451C8B9a45DbE40b478E991F51210 ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/StateCommitmentChain.json +new file mode 100644 +index 0000000..d914353 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0x1ef85D873Cf451C8B9a45DbE40b478E991F51210", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x429c4652f8bdc240a533c53af673acfaa5eaae61341cabb2e11e647c82ec405c", ++ "receipt": { ++ "to": null, ++ "from": "0x4eC96Ad04A997d6Bcc004d7a900c2329Bc4194cb", ++ "contractAddress": "0x1ef85D873Cf451C8B9a45DbE40b478E991F51210", ++ "transactionIndex": 3, ++ "gasUsed": "1879310", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x8a426be60a5fd42eae304bf344c2dfb54c8c29cd9a8b8439ccf81fd6b7b80a09", ++ "transactionHash": "0x429c4652f8bdc240a533c53af673acfaa5eaae61341cabb2e11e647c82ec405c", ++ "logs": [], ++ "blockNumber": 19287041, ++ "cumulativeGasUsed": "2077836", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", ++ 604800, ++ 1800 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "13bcf8040b8f406154ecb555f206cc34", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8528, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8530, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/13bcf8040b8f406154ecb555f206cc34.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/13bcf8040b8f406154ecb555f206cc34.json +new file mode 100644 +index 0000000..b0522bf +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/13bcf8040b8f406154ecb555f206cc34.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 43288, 0x4200000000000000000000000000000000000023));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaavax/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobabase/.chainId +new file mode 100644 +index 0000000..1ca5934 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/.chainId +@@ -0,0 +1 @@ ++1287 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/BondManager.json +new file mode 100644 +index 0000000..3e42f86 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0x6c55306656E8b74F93653A753DE539c2F6ca18Db", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xc89c8f0a9b764976661f29629275c537e82038d9efdf90056360bff171911d3c", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0x6c55306656E8b74F93653A753DE539c2F6ca18Db", ++ "transactionIndex": 23, ++ "gasUsed": "286711", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xf6762bc07f575815cc6cfad93ce8b2ad37ce75485f35efab412dc581450e69f5", ++ "transactionHash": "0xc89c8f0a9b764976661f29629275c537e82038d9efdf90056360bff171911d3c", ++ "logs": [], ++ "blockNumber": 2103499, ++ "cumulativeGasUsed": "797757", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..1f0fc89 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0xa8bD51a7F46321587921A33fa3c752b426c74754", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x82bfd7474e8736817c038f03ead89a42f9d4ac7e6d262eaf4012d29ae0223813", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xa8bD51a7F46321587921A33fa3c752b426c74754", ++ "transactionIndex": 3, ++ "gasUsed": "1586323", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xb4c93514a495b5d27e3f26b1ceba20792d52537aab5c1819b223891283fd2117", ++ "transactionHash": "0x82bfd7474e8736817c038f03ead89a42f9d4ac7e6d262eaf4012d29ae0223813", ++ "logs": [], ++ "blockNumber": 2798102, ++ "cumulativeGasUsed": "1650429", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "b3bb99f4ac947d7de66e82a4b1b9ba56", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 7260, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7262, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7281, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7283, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11836_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11836_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11836_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11836_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11831, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11833, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..e3bba8c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xfD3B000a734F69EE973cb7dfebA6f51Eb1cfE3a5", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xd3c024f591a00f77ee3a492ddc6b55e009d4bdba7c44fa0fbc11330905d8fd70", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xfD3B000a734F69EE973cb7dfebA6f51Eb1cfE3a5", ++ "transactionIndex": 73, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xeda23af2ddba48f8d5292f7381206bccaabfacac2ba1506dc34ea675cd5b1743", ++ "transactionHash": "0xd3c024f591a00f77ee3a492ddc6b55e009d4bdba7c44fa0fbc11330905d8fd70", ++ "logs": [], ++ "blockNumber": 2798091, ++ "cumulativeGasUsed": "2493247", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "b3bb99f4ac947d7de66e82a4b1b9ba56", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..044e5f4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xb39Bb11616d21665111b86af1d7f4cDe3Ff11cB3", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xb6d20ee94bf72a31af71b9029038ef09839038fde61028f218bad61c677d0d4d", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xb39Bb11616d21665111b86af1d7f4cDe3Ff11cB3", ++ "transactionIndex": 4, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x4fae68165e88e555e6d08c85a33837b9c40d00be3bd9f4cc865fe06fad32cfb4", ++ "transactionHash": "0xb6d20ee94bf72a31af71b9029038ef09839038fde61028f218bad61c677d0d4d", ++ "logs": [], ++ "blockNumber": 2798096, ++ "cumulativeGasUsed": "1048758", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "b3bb99f4ac947d7de66e82a4b1b9ba56", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..6988c5b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xa4c329f70634F5713e1E6539e543278343CaB887", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x2a0c77b77372f1e1877b30d29a4bfbab36a8c032ad0a24ffb378728ae4796f8e", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xa4c329f70634F5713e1E6539e543278343CaB887", ++ "transactionIndex": 208, ++ "gasUsed": "938067", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x3d93388bb36566d59543ecbc4e6df846ab2d2fab4429f26c1a595836d95eccf2", ++ "transactionHash": "0x2a0c77b77372f1e1877b30d29a4bfbab36a8c032ad0a24ffb378728ae4796f8e", ++ "logs": [], ++ "blockNumber": 2798099, ++ "cumulativeGasUsed": "5346436", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "b3bb99f4ac947d7de66e82a4b1b9ba56", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..65b8bb7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x4c1bcfe4F0b1a57d3c578a8ED3dBEBCa29339c85", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xe283b92ee9c0de10e98ec40734e3a432e79212533445396c5a7f397e4eb54695", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0x4c1bcfe4F0b1a57d3c578a8ED3dBEBCa29339c85", ++ "transactionIndex": 10, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xdcb548c2713548ab6883300ee693d8b4fa6a5613ae0440fb5e3193466d439e44", ++ "transactionHash": "0xe283b92ee9c0de10e98ec40734e3a432e79212533445396c5a7f397e4eb54695", ++ "logs": [], ++ "blockNumber": 2103521, ++ "cumulativeGasUsed": "1114234", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/Lib_AddressManager.json +new file mode 100644 +index 0000000..ea0d663 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x7792febc9da78e2308f9368fa38306de66050649893c5a8cc4848f7e6ae95806", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "transactionIndex": 3, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000800000000000000000000000000000000000000800000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000002000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000200000000000000000000000800000000000000000", ++ "blockHash": "0x4545171af9b96ffb08a4086119daeb1c9b3f649b9c8779d7a0bf1c7c2f7832e1", ++ "transactionHash": "0x7792febc9da78e2308f9368fa38306de66050649893c5a8cc4848f7e6ae95806", ++ "logs": [ ++ { ++ "transactionIndex": 3, ++ "blockNumber": 2103466, ++ "transactionHash": "0x7792febc9da78e2308f9368fa38306de66050649893c5a8cc4848f7e6ae95806", ++ "address": "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x00000000000000000000000002d3535cca2895b39a261a0bc16afaa5b178e4e9" ++ ], ++ "data": "0x", ++ "logIndex": 1, ++ "blockHash": "0x4545171af9b96ffb08a4086119daeb1c9b3f649b9c8779d7a0bf1c7c2f7832e1" ++ } ++ ], ++ "blockNumber": 2103466, ++ "cumulativeGasUsed": "7221831", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12044, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..134ebee +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0xa3e2F30b06130Ee4d563E0F178dfa0F5924CB010", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x9a8099c5796c32233a2b803c73b480e5219158cb7af760a23dcc6b741eeac6ca", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xa3e2F30b06130Ee4d563E0F178dfa0F5924CB010", ++ "transactionIndex": 11, ++ "gasUsed": "3403430", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x564771f6300b047382bbebf99bda335b3abe04c16c84add6ceb7c1eeca591a56", ++ "transactionHash": "0x9a8099c5796c32233a2b803c73b480e5219158cb7af760a23dcc6b741eeac6ca", ++ "logs": [], ++ "blockNumber": 2103503, ++ "cumulativeGasUsed": "10305227", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5269, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..85fe9c0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0xfa8fa334ec4d35b378ae1dea1afd99020f6befeef60fbc76c13d1ed2f612312a", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877", ++ "transactionIndex": 79, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x4e061e6862c2347403c74acc14471db1efd329648bbc224c2abfe121540a91f1", ++ "transactionHash": "0xfa8fa334ec4d35b378ae1dea1afd99020f6befeef60fbc76c13d1ed2f612312a", ++ "logs": [], ++ "blockNumber": 2103507, ++ "cumulativeGasUsed": "9614916", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12156, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12161, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12111)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12111)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12111" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1StandardBridge.json +similarity index 62% +rename from node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1StandardBridge.json +rename to node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1StandardBridge.json +index 8363771..1199973 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__OVM_L1StandardBridge.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/Proxy__L1StandardBridge.json +@@ -1,5 +1,5 @@ + { +- "address": "0x73298186A143a54c20ae98EEE5a025bD5979De02", ++ "address": "0xEcca5FEd8154420403549f5d8F123fcE69fae806", + "abi": [ + { + "inputs": [ +@@ -87,27 +87,28 @@ + "type": "function" + } + ], +- "transactionHash": "0x4a81c6f70126f29ad818984d96686602636e3d7617f592aa8386dec7f2439d34", ++ "transactionHash": "0x858968162823f00d48a09cc97346123990e38cd72942ae29b2fe1385b6fd000f", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x73298186A143a54c20ae98EEE5a025bD5979De02", +- "transactionIndex": 4, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0xEcca5FEd8154420403549f5d8F123fcE69fae806", ++ "transactionIndex": 37, + "gasUsed": "605560", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x5c35c11595b92b6fe72b7e98eba9d6506067fad8d0ddaa068717db710ee9a323", +- "transactionHash": "0x4a81c6f70126f29ad818984d96686602636e3d7617f592aa8386dec7f2439d34", ++ "blockHash": "0x9edef5cc09bbf36c6bc2062cb3c0c33e9b7764796d59fad0fc4e00e7eead8dc6", ++ "transactionHash": "0x858968162823f00d48a09cc97346123990e38cd72942ae29b2fe1385b6fd000f", + "logs": [], +- "blockNumber": 5619491, +- "cumulativeGasUsed": "844522", ++ "blockNumber": 2103512, ++ "cumulativeGasUsed": "18469860", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37" ++ "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9" + ], +- "solcInputHash": "fafd665d872703a6dab6b13999780370", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 constant internal IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 constant internal OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(\\n address _owner\\n ) {\\n _setOwner(_owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(\\n iL1ChugSplashDeployer.isUpgrading.selector\\n )\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(\\n ret == 0,\\n \\\"L1ChugSplashProxy: system is currently being upgraded\\\"\\n );\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(\\n bytes memory _code\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(\\n DEPLOY_CODE_PREFIX,\\n _code\\n );\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(\\n bytes32 _key,\\n bytes32 _value\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(\\n address _owner\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getImplementation();\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(\\n address _owner\\n )\\n internal\\n {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(\\n address _account\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall()\\n onlyWhenNotPaused\\n internal\\n {\\n address implementation = _getImplementation();\\n\\n require(\\n implementation != address(0),\\n \\\"L1ChugSplashProxy: implementation is not set yet\\\"\\n );\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4664ee758bdb0f88606fdaf8d33eb7ebc9177201a517b409b25df3accc9bda06\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading()\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xddd3c21649942d8812117296081351e1ab96cfbad4d5b969314170129bb6747d\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", + "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", + "devdoc": { +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/README.md b/node_modules/@eth-optimism/contracts/deployments/bobabase/README.md +new file mode 100644 +index 0000000..bd0457e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/README.md +@@ -0,0 +1,293 @@ ++# Bobabase (public testnet) ++## Network Info ++- **Chain ID**: 1297 ++- **Public RPC**: https://bobabase.boba.network ++- **Block Explorer**: https://blockexplorer.bobabase.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0x6c55306656E8b74F93653A753DE539c2F6ca18Db ++ ++
++CanonicalTransactionChain ++ ++ ++0xa8bD51a7F46321587921A33fa3c752b426c74754 ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0xfD3B000a734F69EE973cb7dfebA6f51Eb1cfE3a5 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0xb39Bb11616d21665111b86af1d7f4cDe3Ff11cB3 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0xa4c329f70634F5713e1E6539e543278343CaB887 ++ ++
++L1MultiMessageRelayer ++ ++ ++0x4c1bcfe4F0b1a57d3c578a8ED3dBEBCa29339c85 ++ ++
++Lib_AddressManager ++ ++ ++0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877 ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xEcca5FEd8154420403549f5d8F123fcE69fae806 ++ ++
++StateCommitmentChain ++ ++ ++0x5E41Eaac5319CDf336c51969E2F164A686138B28 ++ ++
++TK_L1BOBA ++ ++ ++0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945 ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/StateCommitmentChain.json +new file mode 100644 +index 0000000..7cdfa0a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0x5E41Eaac5319CDf336c51969E2F164A686138B28", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x6fdf2d9271ec829629987e36ce470d799d22b13cf245fc4356dd1568ac8343f7", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0x5E41Eaac5319CDf336c51969E2F164A686138B28", ++ "transactionIndex": 243, ++ "gasUsed": "1839462", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0ccfd6e644b7a442510e07d030730880b064803c06c24dbda2358261eb6d5a3b", ++ "transactionHash": "0x6fdf2d9271ec829629987e36ce470d799d22b13cf245fc4356dd1568ac8343f7", ++ "logs": [], ++ "blockNumber": 2798105, ++ "cumulativeGasUsed": "7005504", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", ++ 0, ++ 0 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "b3bb99f4ac947d7de66e82a4b1b9ba56", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8528, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8530, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/TK_L1BOBA.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/TK_L1BOBA.json +new file mode 100644 +index 0000000..f4ece91 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/TK_L1BOBA.json +@@ -0,0 +1,992 @@ ++{ ++ "address": "0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xa9e07371d87cd6873cae909baa673201405e67a001c9038774df555c0fdd44e3", ++ "receipt": { ++ "to": null, ++ "from": "0x02D3535ccA2895b39A261a0BC16aFAA5b178e4E9", ++ "contractAddress": "0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945", ++ "transactionIndex": 131, ++ "gasUsed": "2278070", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000010000020000000000000000000800000000000000000000000010000000000000000000000000000000000010000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000200000000000000000000000000000000000000080", ++ "blockHash": "0x1283e3c1b1e0eff2e1c0cd280cb1fec92ee0bd5f9f3239622ea05ab0b2dddf97", ++ "transactionHash": "0xa9e07371d87cd6873cae909baa673201405e67a001c9038774df555c0fdd44e3", ++ "logs": [ ++ { ++ "transactionIndex": 131, ++ "blockNumber": 2103525, ++ "transactionHash": "0xa9e07371d87cd6873cae909baa673201405e67a001c9038774df555c0fdd44e3", ++ "address": "0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945", ++ "topics": [ ++ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x00000000000000000000000002d3535cca2895b39a261a0bc16afaa5b178e4e9" ++ ], ++ "data": "0x0000000000000000000000000000000000000000019d971e4fe8401e74000000", ++ "logIndex": 2, ++ "blockHash": "0x1283e3c1b1e0eff2e1c0cd280cb1fec92ee0bd5f9f3239622ea05ab0b2dddf97" ++ } ++ ], ++ "blockNumber": 2103525, ++ "cumulativeGasUsed": "5115388", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getCurrentVotes(address)\":{\"details\":\"Comp version of the {getVotes} accessor, with `uint96` return type.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getPriorVotes(address,uint256)\":{\"details\":\"Comp version of the {getPastVotes} accessor, with `uint96` return type.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Boba Token (BOBA)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"maxSupply()\":{\"notice\":\"Maximum possible number of tokens\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/token/BOBA.sol\":\"BOBA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n uint256 currentAllowance = allowance(account, _msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n unchecked {\\n _approve(account, _msgSender(), currentAllowance - amount);\\n }\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ERC20Votes.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\\n *\\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\\n * {ERC20Votes} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20VotesComp is ERC20Votes {\\n /**\\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n return SafeCast.toUint96(getVotes(account));\\n }\\n\\n /**\\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\\n }\\n\\n /**\\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\\n */\\n function _maxSupply() internal view virtual override returns (uint224) {\\n return type(uint96).max;\\n }\\n}\\n\",\"keccak256\":\"0xa52bdcb6cc115060b6f2900c6c25a1261488f1fcbcebc0554f8ae056422c3884\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"contracts/L1/token/BOBA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\n\\n//Extension of ERC20 to support Compound-like voting and delegation\\n//This extension keeps a history (checkpoints) of each account's vote power.\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\n//Extension of ERC20 to support Compound's voting and delegation\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\\\";\\n\\n//Extension of {ERC20} that allows token holders to destroy both their own\\n//tokens and those that they have an allowance for, in a way that can be\\n//recognized off-chain (via event analysis).\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title Boba Token (BOBA)\\n *\\n */\\n\\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\\n /// @notice Maximum possible number of tokens\\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\\n\\n /// @notice Maximum token supply. Needed to fit the COMP interface.\\n // The math: The classic Comp governance contracts are\\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\\n // Our maxSupply is 5e+26, so we are under the limit\\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\\n return maxSupply;\\n }\\n\\n constructor() ERC20(\\\"Boba Token\\\", \\\"BOBA\\\") ERC20Permit(\\\"Boba Token\\\") {\\n //mint maxSupply at genesis, allocated to deployer\\n _mint(_msgSender(), maxSupply);\\n }\\n\\n // Override required by Solidity because _mint is defined by two base classes\\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._mint(_to, _amount);\\n }\\n\\n // Override required by Solidity because _burn is defined by two base classes\\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._burn(_account, _amount);\\n }\\n\\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20, ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9a47d98fe8ff8b3198368fe140bc3e79ac654cc3bfbceda74e8b3610cc3fe677\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "DOMAIN_SEPARATOR()": { ++ "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." ++ }, ++ "allowance(address,address)": { ++ "details": "See {IERC20-allowance}." ++ }, ++ "approve(address,uint256)": { ++ "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." ++ }, ++ "balanceOf(address)": { ++ "details": "See {IERC20-balanceOf}." ++ }, ++ "burn(uint256)": { ++ "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." ++ }, ++ "burnFrom(address,uint256)": { ++ "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." ++ }, ++ "checkpoints(address,uint32)": { ++ "details": "Get the `pos`-th checkpoint for `account`." ++ }, ++ "decimals()": { ++ "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." ++ }, ++ "decreaseAllowance(address,uint256)": { ++ "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." ++ }, ++ "delegate(address)": { ++ "details": "Delegate votes from the sender to `delegatee`." ++ }, ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "Delegates votes from signer to `delegatee`" ++ }, ++ "delegates(address)": { ++ "details": "Get the address `account` is currently delegating to." ++ }, ++ "getCurrentVotes(address)": { ++ "details": "Comp version of the {getVotes} accessor, with `uint96` return type." ++ }, ++ "getPastTotalSupply(uint256)": { ++ "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPastVotes(address,uint256)": { ++ "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPriorVotes(address,uint256)": { ++ "details": "Comp version of the {getPastVotes} accessor, with `uint96` return type." ++ }, ++ "getVotes(address)": { ++ "details": "Gets the current votes balance for `account`" ++ }, ++ "increaseAllowance(address,uint256)": { ++ "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." ++ }, ++ "name()": { ++ "details": "Returns the name of the token." ++ }, ++ "nonces(address)": { ++ "details": "See {IERC20Permit-nonces}." ++ }, ++ "numCheckpoints(address)": { ++ "details": "Get number of checkpoints for `account`." ++ }, ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "See {IERC20Permit-permit}." ++ }, ++ "symbol()": { ++ "details": "Returns the symbol of the token, usually a shorter version of the name." ++ }, ++ "totalSupply()": { ++ "details": "See {IERC20-totalSupply}." ++ }, ++ "transfer(address,uint256)": { ++ "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." ++ }, ++ "transferFrom(address,address,uint256)": { ++ "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." ++ } ++ }, ++ "title": "Boba Token (BOBA)", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "maxSupply()": { ++ "notice": "Maximum possible number of tokens" ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 517, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_balances", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_uint256)" ++ }, ++ { ++ "astId": 523, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_allowances", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" ++ }, ++ { ++ "astId": 525, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupply", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 527, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_name", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 529, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_symbol", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 1937, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_nonces", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_mapping(t_address,t_struct(Counter)3381_storage)" ++ }, ++ { ++ "astId": 1210, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_delegates", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_mapping(t_address,t_address)" ++ }, ++ { ++ "astId": 1216, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_checkpoints", ++ "offset": 0, ++ "slot": "7", ++ "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)" ++ }, ++ { ++ "astId": 1220, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupplyCheckpoints", ++ "offset": 0, ++ "slot": "8", ++ "type": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_struct(Checkpoint)1201_storage)dyn_storage": { ++ "base": "t_struct(Checkpoint)1201_storage", ++ "encoding": "dynamic_array", ++ "label": "struct ERC20Votes.Checkpoint[]", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_address,t_address)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ }, ++ "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct ERC20Votes.Checkpoint[])", ++ "numberOfBytes": "32", ++ "value": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ }, ++ "t_mapping(t_address,t_mapping(t_address,t_uint256))": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => mapping(address => uint256))", ++ "numberOfBytes": "32", ++ "value": "t_mapping(t_address,t_uint256)" ++ }, ++ "t_mapping(t_address,t_struct(Counter)3381_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct Counters.Counter)", ++ "numberOfBytes": "32", ++ "value": "t_struct(Counter)3381_storage" ++ }, ++ "t_mapping(t_address,t_uint256)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => uint256)", ++ "numberOfBytes": "32", ++ "value": "t_uint256" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Checkpoint)1201_storage": { ++ "encoding": "inplace", ++ "label": "struct ERC20Votes.Checkpoint", ++ "members": [ ++ { ++ "astId": 1198, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "fromBlock", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint32" ++ }, ++ { ++ "astId": 1200, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "votes", ++ "offset": 4, ++ "slot": "0", ++ "type": "t_uint224" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Counter)3381_storage": { ++ "encoding": "inplace", ++ "label": "struct Counters.Counter", ++ "members": [ ++ { ++ "astId": 3380, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_value", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint256" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_uint224": { ++ "encoding": "inplace", ++ "label": "uint224", ++ "numberOfBytes": "28" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint32": { ++ "encoding": "inplace", ++ "label": "uint32", ++ "numberOfBytes": "4" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/e2f1121f17d06f85851dd0c837a00344.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +similarity index 56% +rename from node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/e2f1121f17d06f85851dd0c837a00344.json +rename to node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +index 93f48ea..c0a5137 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/e2f1121f17d06f85851dd0c837a00344.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +@@ -1,8 +1,32 @@ + { + "language": "Solidity", + "sources": { +- "contracts/L1/deployment/AddressDictator.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title AddressDictator\n * @dev The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate\n * many different addresses in the AddressManager without transferring ownership of the\n * AddressManager to a hot wallet or hardware wallet.\n */\ncontract AddressDictator {\n /*********\n * Types *\n *********/\n\n struct NamedAddress {\n string name;\n address addr;\n }\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public manager;\n address public finalOwner;\n NamedAddress[] namedAddresses;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _manager Address of the AddressManager contract.\n * @param _finalOwner Address to transfer AddressManager ownership to afterwards.\n * @param _names Array of names to associate an address with.\n * @param _addresses Array of addresses to associate with the name.\n */\n constructor(\n Lib_AddressManager _manager,\n address _finalOwner,\n string[] memory _names,\n address[] memory _addresses\n ) {\n manager = _manager;\n finalOwner = _finalOwner;\n require(\n _names.length == _addresses.length,\n \"AddressDictator: Must provide an equal number of names and addresses.\"\n );\n for (uint256 i = 0; i < _names.length; i++) {\n namedAddresses.push(NamedAddress({ name: _names[i], addr: _addresses[i] }));\n }\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Called to finalize the transfer, this function is callable by anyone, but will only result in\n * an upgrade if this contract is the owner Address Manager.\n */\n function setAddresses() external {\n for (uint256 i = 0; i < namedAddresses.length; i++) {\n manager.setAddress(namedAddresses[i].name, namedAddresses[i].addr);\n }\n // note that this will revert if _finalOwner == currentOwner\n manager.transferOwnership(finalOwner);\n }\n\n /**\n * Transfers ownership of this contract to the finalOwner.\n * Only callable by the Final Owner, which is intended to be our multisig.\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can recover\n * if something really surprising goes wrong.\n */\n function returnOwnership() external {\n require(msg.sender == finalOwner, \"AddressDictator: only callable by finalOwner\");\n manager.transferOwnership(finalOwner);\n }\n\n /******************\n * View Functions *\n ******************/\n\n /**\n * Returns the full namedAddresses array.\n */\n function getNamedAddresses() external view returns (NamedAddress[] memory) {\n return namedAddresses;\n }\n}\n" ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +@@ -13,12 +37,6 @@ + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, +- "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, + "contracts/L1/verification/BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" + }, +@@ -28,9 +46,6 @@ + "contracts/L1/rollup/StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, +- "contracts/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, + "contracts/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, +@@ -38,43 +53,28 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" + }, + "contracts/L1/rollup/ICanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" + }, + "contracts/L1/rollup/IChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" + }, +- "contracts/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" +- }, + "contracts/L1/rollup/ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" + }, + "contracts/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Buffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" + }, + "contracts/L1/rollup/CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" + }, + "contracts/standards/AddressAliasHelper.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" + }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/L1/messaging/L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" + }, + "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" +@@ -83,14 +83,11 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" + }, + "contracts/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" + }, + "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" + }, +- "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" + }, +@@ -100,38 +97,65 @@ + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, + "contracts/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, +- "contracts/libraries/bridge/ICrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" + }, +- "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" + }, + "contracts/L2/messaging/L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" + }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, + "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" + }, + "contracts/L2/messaging/L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" + }, + "contracts/L1/messaging/IL1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event ETHDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" + }, + "contracts/L1/messaging/IL1ERC20Bridge.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" +@@ -142,9 +166,6 @@ + "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" + }, +- "contracts/libraries/bridge/CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, + "contracts/standards/IL2StandardERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, +@@ -154,8 +175,14 @@ + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" + }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, + "contracts/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" +@@ -163,50 +190,95 @@ + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, +- "contracts/L2/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(Lib_PredeployAddresses.L2_STANDARD_BRIDGE, address(0), \"Ether\", \"ETH\")\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n // solhint-disable max-line-length\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n // solhint-enable max-line-length\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, +- "contracts/L1/messaging/L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" +- }, +- "contracts/L2/messaging/L2StandardTokenFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" + }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" + }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" + }, +- "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" + } + }, + "settings": { +@@ -214,9 +286,14 @@ + "enabled": true, + "runs": 10000 + }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, + "outputSelection": { + "*": { + "*": [ ++ "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", +@@ -224,17 +301,14 @@ + "metadata", + "devdoc", + "userdoc", +- "storageLayout", +- "evm.gasEstimates" ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" + ], + "": [ + "ast" + ] + } +- }, +- "metadata": { +- "useLiteralContent": true +- }, +- "libraries": {} ++ } + } + } +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabase/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobabeam/.chainId +new file mode 100644 +index 0000000..8672b57 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/.chainId +@@ -0,0 +1 @@ ++1284 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/BondManager.json +new file mode 100644 +index 0000000..0c07ad5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x62bb9fb11d0d5564ee54492dd1eb495ea2371179afab22fcf1d542e33b6ea5ce", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5", ++ "transactionIndex": 4, ++ "gasUsed": "286711", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x4dca1081f49c757438561ad73aa89cbfe0ccb0a7425ad83b46f85279d86426ad", ++ "transactionHash": "0x62bb9fb11d0d5564ee54492dd1eb495ea2371179afab22fcf1d542e33b6ea5ce", ++ "logs": [], ++ "blockNumber": 1687913, ++ "cumulativeGasUsed": "589710", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..2618954 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x15c58238c4dd3c96321a1fbc39cf9c90f1c0c23ae098192ad02621c002f80d44", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95", ++ "transactionIndex": 0, ++ "gasUsed": "1586323", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x95f9409af1275d11a242fc39f98589d33369b72d7e71e2d08369d69becf27531", ++ "transactionHash": "0x15c58238c4dd3c96321a1fbc39cf9c90f1c0c23ae098192ad02621c002f80d44", ++ "logs": [], ++ "blockNumber": 1687903, ++ "cumulativeGasUsed": "1586323", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 7260, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7262, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7281, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7283, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11836_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11836_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11836_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11836_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11831, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11833, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..bec45b9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x808fD25dd00D5F8915Ad69326bFD75A6E014f9b3", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xf04018654a751aee99b1bcf6c18b1344e437966717674eba89c874f35862c9a8", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x808fD25dd00D5F8915Ad69326bFD75A6E014f9b3", ++ "transactionIndex": 1, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xc31134175f11e9031179ac1298826885b0e095560872e254947833e93c56810e", ++ "transactionHash": "0xf04018654a751aee99b1bcf6c18b1344e437966717674eba89c874f35862c9a8", ++ "logs": [], ++ "blockNumber": 1687892, ++ "cumulativeGasUsed": "1022343", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..701ceae +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x1D023D0B9E8aa136241eB8e8827876f51ef49851", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x890f532252e16a7fd8c407c77f9f88427de692f8eb19335d7e1712c96c21823a", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x1D023D0B9E8aa136241eB8e8827876f51ef49851", ++ "transactionIndex": 0, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x081a5a2492feb38d911e51f0cde1de87123be359b446c0f4193c09410c1ddc60", ++ "transactionHash": "0x890f532252e16a7fd8c407c77f9f88427de692f8eb19335d7e1712c96c21823a", ++ "logs": [], ++ "blockNumber": 1687895, ++ "cumulativeGasUsed": "938127", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..b9bba63 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x5Ee60822c68CF0966D8Dc53255627216b4ADC30f", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x27d2c6295c2d01e75b5c47e59e335f6f8a2b79ae8c129a695ca6c009b512b8f5", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x5Ee60822c68CF0966D8Dc53255627216b4ADC30f", ++ "transactionIndex": 0, ++ "gasUsed": "938067", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x6dbc3792af1272268f1868c4c9addf9a0cb9f56871dfb3a072ce388344f9ece2", ++ "transactionHash": "0x27d2c6295c2d01e75b5c47e59e335f6f8a2b79ae8c129a695ca6c009b512b8f5", ++ "logs": [], ++ "blockNumber": 1687899, ++ "cumulativeGasUsed": "938067", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..8328595 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xbdba67893e65df55daf48203c3c7f924bdb9354a9df8a26aeb81a14e8f1467c7", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1", ++ "transactionIndex": 4, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x36f24736f77ff9ce3f37a39ae43d0b865ada366975e5b9e9e5b8a34840cfffa8", ++ "transactionHash": "0xbdba67893e65df55daf48203c3c7f924bdb9354a9df8a26aeb81a14e8f1467c7", ++ "logs": [], ++ "blockNumber": 1687944, ++ "cumulativeGasUsed": "2068038", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Lib_AddressManager.json +new file mode 100644 +index 0000000..75154a0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x7d5ae9c5879b99d4a5827cc5a8c021cb84fabb8b3f377dc5c8fb9d3108f1a5b5", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "transactionIndex": 2, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000200000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000001000000000000000000000000000000000000020000000000000040000800000000001000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000020000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xa789cf41bd9f705fb7caeb274a8259cca7aa35f81a1797c8667ba23e1a3f1d3b", ++ "transactionHash": "0x7d5ae9c5879b99d4a5827cc5a8c021cb84fabb8b3f377dc5c8fb9d3108f1a5b5", ++ "logs": [ ++ { ++ "transactionIndex": 2, ++ "blockNumber": 1687872, ++ "transactionHash": "0x7d5ae9c5879b99d4a5827cc5a8c021cb84fabb8b3f377dc5c8fb9d3108f1a5b5", ++ "address": "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000c31ca2482c936d92dd465391b45940e802a86edc" ++ ], ++ "data": "0x", ++ "logIndex": 9, ++ "blockHash": "0xa789cf41bd9f705fb7caeb274a8259cca7aa35f81a1797c8667ba23e1a3f1d3b" ++ } ++ ], ++ "blockNumber": 1687872, ++ "cumulativeGasUsed": "667809", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12040, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..6ed7cd4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0x9182A0AA011f97633d44383F446A5951bDD3f5bf", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4ea8059ff29bc088ffca26fec0779f7cc92fc04f1bde75fd44c4f272f7456da2", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x9182A0AA011f97633d44383F446A5951bDD3f5bf", ++ "transactionIndex": 2, ++ "gasUsed": "3403430", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x3d75f6cc886f2d92ccc9c08b7da2ecd677ccdd376d025e56076b71ee17cdf7af", ++ "transactionHash": "0x4ea8059ff29bc088ffca26fec0779f7cc92fc04f1bde75fd44c4f272f7456da2", ++ "logs": [], ++ "blockNumber": 1687922, ++ "cumulativeGasUsed": "3557689", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..058bf61 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0x4fcdf6e37e87a86a52b26265220051c6eb420a580c8744d02c5c8aebba6ff151", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF", ++ "transactionIndex": 10, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xdf01c0e093739574de6391b829720e14c111606b9eaaded6047f8c6983c873dc", ++ "transactionHash": "0x4fcdf6e37e87a86a52b26265220051c6eb420a580c8744d02c5c8aebba6ff151", ++ "logs": [], ++ "blockNumber": 1687928, ++ "cumulativeGasUsed": "1950523", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12152, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12157, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12107)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12107)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12107" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..82f59b5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xede2002c7da4737b4be2850888f8b0b571b71d46b157de80432d5459518859f6", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985", ++ "transactionIndex": 1, ++ "gasUsed": "605560", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x9d8a8df1afdff754706734b2188d6f8da1c4fed9c6a9a6f472920392c52a37bd", ++ "transactionHash": "0xede2002c7da4737b4be2850888f8b0b571b71d46b157de80432d5459518859f6", ++ "logs": [], ++ "blockNumber": 1687934, ++ "cumulativeGasUsed": "626560", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xC31ca2482c936d92dd465391B45940e802A86eDc" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/README.md b/node_modules/@eth-optimism/contracts/deployments/bobabeam/README.md +new file mode 100644 +index 0000000..82b9224 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/README.md +@@ -0,0 +1,283 @@ ++# Bobabeam (public mainnet) ++## Network Info ++- **Chain ID**: 1294 ++- **Public RPC**: https://bobabase.boba.network ++- **Block Explorer**: https://blockexplorer.bobabeam.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5 ++ ++
++CanonicalTransactionChain ++ ++ ++0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95 ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x808fD25dd00D5F8915Ad69326bFD75A6E014f9b3 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0x1D023D0B9E8aa136241eB8e8827876f51ef49851 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x5Ee60822c68CF0966D8Dc53255627216b4ADC30f ++ ++
++L1MultiMessageRelayer ++ ++ ++0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1 ++ ++
++Lib_AddressManager ++ ++ ++0x564c10A60af35a07f0EA8Be3106a4D81014b21a0 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985 ++ ++
++StateCommitmentChain ++ ++ ++0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8 ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/StateCommitmentChain.json +new file mode 100644 +index 0000000..5afecc8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x3a9bd59de85dd9e651fb1b22c7735fb90ab6d2aaea6e8146f28b5c8c9dda9d76", ++ "receipt": { ++ "to": null, ++ "from": "0xC31ca2482c936d92dd465391B45940e802A86eDc", ++ "contractAddress": "0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8", ++ "transactionIndex": 2, ++ "gasUsed": "1879322", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x16e43fe103c9c5a5fb94ca95d7d0b0b8440a633d48b562427812b962f1cc99ba", ++ "transactionHash": "0x3a9bd59de85dd9e651fb1b22c7735fb90ab6d2aaea6e8146f28b5c8c9dda9d76", ++ "logs": [], ++ "blockNumber": 1687908, ++ "cumulativeGasUsed": "1980920", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", ++ 604800, ++ 1800 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "2a1287152dfe03b4d0b5bdbc5d2bad13", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8528, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8530, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/2a1287152dfe03b4d0b5bdbc5d2bad13.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/2a1287152dfe03b4d0b5bdbc5d2bad13.json +new file mode 100644 +index 0000000..38c0aa0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/2a1287152dfe03b4d0b5bdbc5d2bad13.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 1294, 0x4200000000000000000000000000000000000023));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabeam/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobabnb/.chainId +new file mode 100644 +index 0000000..2ebc651 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/.chainId +@@ -0,0 +1 @@ ++56 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/BondManager.json +new file mode 100644 +index 0000000..fb25a80 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xde47a87dce23481199ce5c4fc9f3fe809817f7ce10995d95b76afb603cd437b8", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd", ++ "transactionIndex": 27, ++ "gasUsed": "285411", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x85c3cc023d7302cba02005706387049cb9d591baaebfa3998e08d3f77f2b977d", ++ "transactionHash": "0xde47a87dce23481199ce5c4fc9f3fe809817f7ce10995d95b76afb603cd437b8", ++ "logs": [], ++ "blockNumber": 21305686, ++ "cumulativeGasUsed": "2540593", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..57ef399 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xe975f7d77ef1a8b30d292f6d35236108a26bf00e5046b39cba01cbe321d25ac8", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4", ++ "transactionIndex": 79, ++ "gasUsed": "1576623", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xbd3782545e85a0fb320b541f85d040c96f7dd92b87fe6cab3d104824e701741a", ++ "transactionHash": "0xe975f7d77ef1a8b30d292f6d35236108a26bf00e5046b39cba01cbe321d25ac8", ++ "logs": [], ++ "blockNumber": 21305672, ++ "cumulativeGasUsed": "10446699", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 7270, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7272, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7274, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7291, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7293, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7297, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11846_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11846_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11846_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11846_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11841, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11843, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11845, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..2cdc63c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xA774C3f4572C5BA93F75D802ea7Dc6F93228e5cc", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x6c2d98c07e9281f3d621dcaa6089fe3fcde2e28a4881d05e89df5581a637f505", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xA774C3f4572C5BA93F75D802ea7Dc6F93228e5cc", ++ "transactionIndex": 89, ++ "gasUsed": "935527", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x8665289c7af1025c4b7426c2e310c569f7eafabf83b47912216fecea394b400e", ++ "transactionHash": "0x6c2d98c07e9281f3d621dcaa6089fe3fcde2e28a4881d05e89df5581a637f505", ++ "logs": [], ++ "blockNumber": 21305651, ++ "cumulativeGasUsed": "8656964", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..363f024 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xA3f58cF4D4843F600A7e95CE1B23322C6A1A9695", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xa44f6169a4fc2043940b07566e5a54bfae7fc1bdbdae6dd58d9e642689038677", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xA3f58cF4D4843F600A7e95CE1B23322C6A1A9695", ++ "transactionIndex": 28, ++ "gasUsed": "935527", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x85fea50ac05710d6aa374f8a724d57f01fd8c047a0520ec539fb215b8dbf5752", ++ "transactionHash": "0xa44f6169a4fc2043940b07566e5a54bfae7fc1bdbdae6dd58d9e642689038677", ++ "logs": [], ++ "blockNumber": 21305657, ++ "cumulativeGasUsed": "4538086", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..ef2bb00 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x181D33986CFb5229e42ac3b3a09cad39F1011D17", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xa5bd0119923986614ab161bc8c30ce363a4328028030c3916b3281cbac4c0a4c", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0x181D33986CFb5229e42ac3b3a09cad39F1011D17", ++ "transactionIndex": 30, ++ "gasUsed": "935467", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xb4e82336e0c173033aee2d8f9738fc79ce46566ff813674c3d5dada95f27c44c", ++ "transactionHash": "0xa5bd0119923986614ab161bc8c30ce363a4328028030c3916b3281cbac4c0a4c", ++ "logs": [], ++ "blockNumber": 21305664, ++ "cumulativeGasUsed": "7783078", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..e809ce7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x1E633Dcd0d3D349126983D58988051F7c62c543D", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xc75b30fbf82d9464c5a20faf01a4e974fe6ccf71351f7bbcffdd1e78ee818af1", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0x1E633Dcd0d3D349126983D58988051F7c62c543D", ++ "transactionIndex": 29, ++ "gasUsed": "696558", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x17f5645959fa9a397c5d1113c40ca292f8baef497df1d6a1acd42ba15ab43cc7", ++ "transactionHash": "0xc75b30fbf82d9464c5a20faf01a4e974fe6ccf71351f7bbcffdd1e78ee818af1", ++ "logs": [], ++ "blockNumber": 21305974, ++ "cumulativeGasUsed": "2759517", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Lib_AddressManager.json +new file mode 100644 +index 0000000..42f4a9e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x65c8f82a94001db54e3a045913e16b9eb34dab5e541b0d0e1123f6279444a568", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "transactionIndex": 39, ++ "gasUsed": "453275", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000020000000000001000000000000000000000000000000000000020000000010000000000800000000000000000000000000000000400000000010000000000000000800000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x37943d623a05b067ff8ad8cd2c61d6739dc6aa4a6c50500e3daabbf501e8a67e", ++ "transactionHash": "0x65c8f82a94001db54e3a045913e16b9eb34dab5e541b0d0e1123f6279444a568", ++ "logs": [ ++ { ++ "transactionIndex": 39, ++ "blockNumber": 21305618, ++ "transactionHash": "0x65c8f82a94001db54e3a045913e16b9eb34dab5e541b0d0e1123f6279444a568", ++ "address": "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000e1b5383666e5b6ea684b98371d6abccdb8f4e4d9" ++ ], ++ "data": "0x", ++ "logIndex": 106, ++ "blockHash": "0x37943d623a05b067ff8ad8cd2c61d6739dc6aa4a6c50500e3daabbf501e8a67e" ++ } ++ ], ++ "blockNumber": 21305618, ++ "cumulativeGasUsed": "5322041", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12050, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..3711988 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,818 @@ ++{ ++ "address": "0x4085c76ca31c8445A57ABc41393d7D57176A505b", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "unpause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x147c9185288acf9559a9604589df51507c3cd5761d4193f37217ddd1077fcff3", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0x4085c76ca31c8445A57ABc41393d7D57176A505b", ++ "transactionIndex": 33, ++ "gasUsed": "3460401", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x1da97d030adda0f29b4585a4c14c2c0fc67d2eec0a7a5bc0ca492c31bac92c45", ++ "transactionHash": "0x147c9185288acf9559a9604589df51507c3cd5761d4193f37217ddd1077fcff3", ++ "logs": [], ++ "blockNumber": 21305923, ++ "cumulativeGasUsed": "7642171", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"},\"unpause()\":{\"notice\":\"Unpause relaying.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Unpause relaying.\\n */\\n function unpause() external onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbbaf0c0c57409c8e2aa3cb4704b75ef9e4f078fb98dc31e3c4d18cfee17a3e0b\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613d8f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ }, ++ "unpause()": { ++ "notice": "Unpause relaying." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..bbf15c4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x31338a7D5d123E18a9a71447136B54B6D28241ae", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0xefe3bdd198504cc79d37c305949f2ebbb370186243c85b7dd101dcdda8a17552", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0x31338a7D5d123E18a9a71447136B54B6D28241ae", ++ "transactionIndex": 55, ++ "gasUsed": "279999", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x4d7be627681dcbbfbaf4a6970d3aafdb766a5b73590fd051473013d50a2de251", ++ "transactionHash": "0xefe3bdd198504cc79d37c305949f2ebbb370186243c85b7dd101dcdda8a17552", ++ "logs": [], ++ "blockNumber": 21305932, ++ "cumulativeGasUsed": "11410670", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12162, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12167, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12117)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12117)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12117" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..182daef +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x7d0cf5c37bf729cae8877cd0625776bbc121089947280c7af71ce59786b687b0", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC", ++ "transactionIndex": 65, ++ "gasUsed": "603460", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xc4784f591f401028d6f8bed11522bebcd0ae09e5c0eda42a5b5ecad4309e7b9a", ++ "transactionHash": "0x7d0cf5c37bf729cae8877cd0625776bbc121089947280c7af71ce59786b687b0", ++ "logs": [], ++ "blockNumber": 21305940, ++ "cumulativeGasUsed": "7987943", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/README.md b/node_modules/@eth-optimism/contracts/deployments/bobabnb/README.md +new file mode 100644 +index 0000000..d9b8b91 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/README.md +@@ -0,0 +1,283 @@ ++# Boba BNB (public mainnet) ++## Network Info ++- **Chain ID**: 56288 ++- **Public RPC**: https://bnb.boba.network ++- **Block Explorer**: https://blockexplorer.bnb.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd ++ ++
++CanonicalTransactionChain ++ ++ ++0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4 ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0xA774C3f4572C5BA93F75D802ea7Dc6F93228e5cc ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0xA3f58cF4D4843F600A7e95CE1B23322C6A1A9695 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x181D33986CFb5229e42ac3b3a09cad39F1011D17 ++ ++
++L1MultiMessageRelayer ++ ++ ++0x1E633Dcd0d3D349126983D58988051F7c62c543D ++ ++
++Lib_AddressManager ++ ++ ++0xeb989B25597259cfa51Bd396cE1d4B085EC4c753 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x31338a7D5d123E18a9a71447136B54B6D28241ae ++ ++
++Proxy__L1StandardBridge ++ ++ ++0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC ++ ++
++StateCommitmentChain ++ ++ ++0xeF85fA550e6EC5486121313C895EDe1005e2397f ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/StateCommitmentChain.json +new file mode 100644 +index 0000000..bd2a48b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0xeF85fA550e6EC5486121313C895EDe1005e2397f", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xeb99ae2c73508e2eb3fd422c9b3d25130038d159ef67fcea5c197fb87a82d14f", ++ "receipt": { ++ "to": null, ++ "from": "0xE1B5383666E5B6ea684b98371d6aBCCdb8f4E4d9", ++ "contractAddress": "0xeF85fA550e6EC5486121313C895EDe1005e2397f", ++ "transactionIndex": 29, ++ "gasUsed": "1873822", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xd33ad016657a5b42ae152ca1b6a3bac34d6c5c2a49f85113e9e9720929f3cca7", ++ "transactionHash": "0xeb99ae2c73508e2eb3fd422c9b3d25130038d159ef67fcea5c197fb87a82d14f", ++ "logs": [], ++ "blockNumber": 21305679, ++ "cumulativeGasUsed": "4462366", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", ++ 604800, ++ 1800 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "c050198a0cfe7b24f3cccc5fb4d3b9c0", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8538, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8540, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/c050198a0cfe7b24f3cccc5fb4d3b9c0.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/c050198a0cfe7b24f3cccc5fb4d3b9c0.json +new file mode 100644 +index 0000000..360d8e0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/c050198a0cfe7b24f3cccc5fb4d3b9c0.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Unpause relaying.\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 56288, 0x4200000000000000000000000000000000000023));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnb/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/.chainId +new file mode 100644 +index 0000000..c4fbb1c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/.chainId +@@ -0,0 +1 @@ ++97 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/BondManager.json +new file mode 100644 +index 0000000..8f3ed2f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0x6737867ddd04272a79E7207a008f213e336b00e1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x579d2af18131ce2e2cda1eaccd84092047fac54970f9ade96e45998dbe4ef790", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x6737867ddd04272a79E7207a008f213e336b00e1", ++ "transactionIndex": 23, ++ "gasUsed": "285411", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x671feacb70c23d55fd5657242b98ae4dbd4fe676a45e6f9cca9927f9c6b043cd", ++ "transactionHash": "0x579d2af18131ce2e2cda1eaccd84092047fac54970f9ade96e45998dbe4ef790", ++ "logs": [], ++ "blockNumber": 21979730, ++ "cumulativeGasUsed": "2982325", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..a140422 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xe99be7453c5347ff1120a9b051a4dafe27c93201f56027d21d17c51ca642c02f", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6", ++ "transactionIndex": 21, ++ "gasUsed": "1576623", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0aa9b7ad6986c6943cf7741953ba8c833cb4dad3946414860652a6b1cd930a01", ++ "transactionHash": "0xe99be7453c5347ff1120a9b051a4dafe27c93201f56027d21d17c51ca642c02f", ++ "logs": [], ++ "blockNumber": 21979718, ++ "cumulativeGasUsed": "4104855", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 7260, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7262, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7281, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7283, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11836_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11836_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11836_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11836_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11831, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11833, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..3fbb36d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x2AbE94ad3f328fdD904F44155AC00E6a591e7861", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4d35446b3290fc0e3d76d6945b821fec449d9d72020952ede835ad18bdc65673", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x2AbE94ad3f328fdD904F44155AC00E6a591e7861", ++ "transactionIndex": 19, ++ "gasUsed": "935527", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x51832df9ebac7bc38663db3b9bc186367c7657f663fc8325ad97abadf2d25147", ++ "transactionHash": "0x4d35446b3290fc0e3d76d6945b821fec449d9d72020952ede835ad18bdc65673", ++ "logs": [], ++ "blockNumber": 21979702, ++ "cumulativeGasUsed": "5204671", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..0402710 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xA5Db94EdB42020B86867234fa72281bF2ccDDf03", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x5c01296ee0a0823fcc167022a5d75b9ffcce84dba3fdfb6fb073b05246dab770", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0xA5Db94EdB42020B86867234fa72281bF2ccDDf03", ++ "transactionIndex": 18, ++ "gasUsed": "935527", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xc14465e8b525bc331d856f1a67048f5b04c17551fcdd0ff096315b2b66cc98bc", ++ "transactionHash": "0x5c01296ee0a0823fcc167022a5d75b9ffcce84dba3fdfb6fb073b05246dab770", ++ "logs": [], ++ "blockNumber": 21979708, ++ "cumulativeGasUsed": "3396840", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..cd9229b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x14718bB320d6FC2681EF86864732211a9A0928dD", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x75384da92d224ccd5c35b41bec2b6724216d5971c9a922fdf37964ab7ad0b16a", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x14718bB320d6FC2681EF86864732211a9A0928dD", ++ "transactionIndex": 22, ++ "gasUsed": "935467", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x29e35825ba50c3a47dbd5e04b2ed77cec2752aa38163c709643e25366f429de5", ++ "transactionHash": "0x75384da92d224ccd5c35b41bec2b6724216d5971c9a922fdf37964ab7ad0b16a", ++ "logs": [], ++ "blockNumber": 21979713, ++ "cumulativeGasUsed": "3011830", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8053, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15664_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15664_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15659, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..e8a549b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x5e593AeB2Dbd855D79167831f091B4d959FbB2D1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xb5d427dc4c17a96284d11dcdca569a3e295fbfa6b97da630fb00ed5a6758844c", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x5e593AeB2Dbd855D79167831f091B4d959FbB2D1", ++ "transactionIndex": 18, ++ "gasUsed": "696558", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x18259e15944823fa72ac6bc0671adcd5d077d656cc25e6fd39f077133d3c0b85", ++ "transactionHash": "0xb5d427dc4c17a96284d11dcdca569a3e295fbfa6b97da630fb00ed5a6758844c", ++ "logs": [], ++ "blockNumber": 21979766, ++ "cumulativeGasUsed": "2809688", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Lib_AddressManager.json +new file mode 100644 +index 0000000..9cb510d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xbddf36d44c4e2e5231a0a635f4a58f421561c78ca256343f3c24e5b89b352168", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "transactionIndex": 11, ++ "gasUsed": "453275", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000402000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000200000020000000000000000000000000000000000000000020000000000100000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x1881ca6515e604936136fd1ea3eeeef8f2263f7e258b07524a897ceaa7fd4567", ++ "transactionHash": "0xbddf36d44c4e2e5231a0a635f4a58f421561c78ca256343f3c24e5b89b352168", ++ "logs": [ ++ { ++ "transactionIndex": 11, ++ "blockNumber": 21979675, ++ "transactionHash": "0xbddf36d44c4e2e5231a0a635f4a58f421561c78ca256343f3c24e5b89b352168", ++ "address": "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000d3edfbd01829c5a97b94b20f82dc17088cc00031" ++ ], ++ "data": "0x", ++ "logIndex": 29, ++ "blockHash": "0x1881ca6515e604936136fd1ea3eeeef8f2263f7e258b07524a897ceaa7fd4567" ++ } ++ ], ++ "blockNumber": 21979675, ++ "cumulativeGasUsed": "2016654", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12040, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..b11629b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0x6fA80303E479Ea2d705F4f241Ef162aA2F793e71", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4def72fcb388e1e981db3c29078fad90a99aa6142ee0a7a7aedd3fa1eab45fb5", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x6fA80303E479Ea2d705F4f241Ef162aA2F793e71", ++ "transactionIndex": 13, ++ "gasUsed": "3401530", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x662c05830047472530e6b5e1d6a2e456522faf24dcc14d80f874a54a66d491f0", ++ "transactionHash": "0x4def72fcb388e1e981db3c29078fad90a99aa6142ee0a7a7aedd3fa1eab45fb5", ++ "logs": [], ++ "blockNumber": 21979736, ++ "cumulativeGasUsed": "4636716", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..f360821 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0xbe40b1ec9f3f3607fba0d165a00312ce8f761aa302bc8d162beee92703bec9b8", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145", ++ "transactionIndex": 12, ++ "gasUsed": "279999", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xcc8172dc01c0a561d32bd906f4d60f225a518aad2e20548b17f198867ca8a1f8", ++ "transactionHash": "0xbe40b1ec9f3f3607fba0d165a00312ce8f761aa302bc8d162beee92703bec9b8", ++ "logs": [], ++ "blockNumber": 21979744, ++ "cumulativeGasUsed": "1543174", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12152, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12157, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12107)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12107)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12107" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..df164c8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4b592246beeaf285100be7f772e74cae7e0fb409924147566a04ac8e73139eb7", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a", ++ "transactionIndex": 12, ++ "gasUsed": "603448", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xa3be30de202c40a8d5fa5b82333720269bc1f8d7cb2474b7c0bde2b86ccb1cf3", ++ "transactionHash": "0x4b592246beeaf285100be7f772e74cae7e0fb409924147566a04ac8e73139eb7", ++ "logs": [], ++ "blockNumber": 21979752, ++ "cumulativeGasUsed": "2324434", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/README.md b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/README.md +new file mode 100644 +index 0000000..3cc72aa +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/README.md +@@ -0,0 +1,293 @@ ++# Boba BNB (public testnet) ++## Network Info ++- **Chain ID**: 9728 ++- **Public RPC**: https://testnet.bnb.boba.network ++- **Block Explorer**: https://blockexplorer.testnet.bnb.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0x6737867ddd04272a79E7207a008f213e336b00e1 ++ ++
++CanonicalTransactionChain ++ ++ ++0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6 ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x2AbE94ad3f328fdD904F44155AC00E6a591e7861 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0xA5Db94EdB42020B86867234fa72281bF2ccDDf03 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x14718bB320d6FC2681EF86864732211a9A0928dD ++ ++
++L1MultiMessageRelayer ++ ++ ++0x5e593AeB2Dbd855D79167831f091B4d959FbB2D1 ++ ++
++Lib_AddressManager ++ ++ ++0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145 ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a ++ ++
++StateCommitmentChain ++ ++ ++0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE ++ ++
++TK_L1BOBA ++ ++ ++0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/StateCommitmentChain.json +new file mode 100644 +index 0000000..f71dc05 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x342779aaab6f4b5401b975c5f12fa32146d81471625661866c7c3419855c238c", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE", ++ "transactionIndex": 29, ++ "gasUsed": "1835362", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x588f83609944099bb80442c7eb75e0c847117442719f67f61b16313a4da72341", ++ "transactionHash": "0x342779aaab6f4b5401b975c5f12fa32146d81471625661866c7c3419855c238c", ++ "logs": [], ++ "blockNumber": 21979723, ++ "cumulativeGasUsed": "5238409", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", ++ 0, ++ 0 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 8528, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8530, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/TK_L1BOBA.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/TK_L1BOBA.json +new file mode 100644 +index 0000000..14853e5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/TK_L1BOBA.json +@@ -0,0 +1,992 @@ ++{ ++ "address": "0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x85a435d2b9f0344c9df76a4d0da0df9705b68e29a44effec46ed69293295b135", ++ "receipt": { ++ "to": null, ++ "from": "0xd3EdFbD01829c5A97B94B20F82DC17088Cc00031", ++ "contractAddress": "0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C", ++ "transactionIndex": 19, ++ "gasUsed": "2273180", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000800000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000010000000000000000000000000000000000002000200000000000000000000000000000000000000000000000020000000000100000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x49b02f2cfed8131255ba526536eb4d820d6f9e55db5fd93963482711e2b52061", ++ "transactionHash": "0x85a435d2b9f0344c9df76a4d0da0df9705b68e29a44effec46ed69293295b135", ++ "logs": [ ++ { ++ "transactionIndex": 19, ++ "blockNumber": 21979771, ++ "transactionHash": "0x85a435d2b9f0344c9df76a4d0da0df9705b68e29a44effec46ed69293295b135", ++ "address": "0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C", ++ "topics": [ ++ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000d3edfbd01829c5a97b94b20f82dc17088cc00031" ++ ], ++ "data": "0x0000000000000000000000000000000000000000019d971e4fe8401e74000000", ++ "logIndex": 54, ++ "blockHash": "0x49b02f2cfed8131255ba526536eb4d820d6f9e55db5fd93963482711e2b52061" ++ } ++ ], ++ "blockNumber": 21979771, ++ "cumulativeGasUsed": "4156413", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "4f69f2a6e8a163c8ae3512552ef63fef", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getCurrentVotes(address)\":{\"details\":\"Comp version of the {getVotes} accessor, with `uint96` return type.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getPriorVotes(address,uint256)\":{\"details\":\"Comp version of the {getPastVotes} accessor, with `uint96` return type.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Boba Token (BOBA)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"maxSupply()\":{\"notice\":\"Maximum possible number of tokens\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/token/BOBA.sol\":\"BOBA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n uint256 currentAllowance = allowance(account, _msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n unchecked {\\n _approve(account, _msgSender(), currentAllowance - amount);\\n }\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ERC20Votes.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\\n *\\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\\n * {ERC20Votes} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20VotesComp is ERC20Votes {\\n /**\\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n return SafeCast.toUint96(getVotes(account));\\n }\\n\\n /**\\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\\n }\\n\\n /**\\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\\n */\\n function _maxSupply() internal view virtual override returns (uint224) {\\n return type(uint96).max;\\n }\\n}\\n\",\"keccak256\":\"0xa52bdcb6cc115060b6f2900c6c25a1261488f1fcbcebc0554f8ae056422c3884\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 9728, 0x4200000000000000000000000000000000000023));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xc1b4b63b8fdd1577fbbdb8f8b762d8cb25071394e2dda8602b3a2d3abb97c336\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"contracts/L1/token/BOBA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\n\\n//Extension of ERC20 to support Compound-like voting and delegation\\n//This extension keeps a history (checkpoints) of each account's vote power.\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\n//Extension of ERC20 to support Compound's voting and delegation\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\\\";\\n\\n//Extension of {ERC20} that allows token holders to destroy both their own\\n//tokens and those that they have an allowance for, in a way that can be\\n//recognized off-chain (via event analysis).\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title Boba Token (BOBA)\\n *\\n */\\n\\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\\n /// @notice Maximum possible number of tokens\\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\\n\\n /// @notice Maximum token supply. Needed to fit the COMP interface.\\n // The math: The classic Comp governance contracts are\\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\\n // Our maxSupply is 5e+26, so we are under the limit\\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\\n return maxSupply;\\n }\\n\\n constructor() ERC20(\\\"Boba Token\\\", \\\"BOBA\\\") ERC20Permit(\\\"Boba Token\\\") {\\n //mint maxSupply at genesis, allocated to deployer\\n _mint(_msgSender(), maxSupply);\\n }\\n\\n // Override required by Solidity because _mint is defined by two base classes\\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._mint(_to, _amount);\\n }\\n\\n // Override required by Solidity because _burn is defined by two base classes\\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._burn(_account, _amount);\\n }\\n\\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20, ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9a47d98fe8ff8b3198368fe140bc3e79ac654cc3bfbceda74e8b3610cc3fe677\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce929190620007b0565b508051620000e4906004906020840190620007b0565b5050825160208085019190912083518483012060c082815260e08290524660a0908152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301879052606082018690526126006080830152734200000000000000000000000000000000000023828501528251808303909401845293019052805194019390932091935091906080526101005250620001ab935062000198925050620001b19050565b6b019d971e4fe8401e74000000620001b5565b620008ea565b3390565b620001cc8282620001d060201b62000e051760201c565b5050565b620001e782826200028a60201b62000ea71760201c565b6b019d971e4fe8401e74000000620001fe60025490565b11156200026b5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b62000284600862000fb96200037960201b17836200038e565b50505050565b6001600160a01b038216620002e25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000262565b8060026000828254620002f6919062000862565b90915550506001600160a01b038216600090815260208190526040812080548392906200032590849062000862565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001cc6000838362000545565b600062000387828462000862565b9392505050565b825460009081908015620003e05785620003aa6001836200087d565b81548110620003bd57620003bd62000897565b60009182526020909120015464010000000090046001600160e01b0316620003e3565b60005b6001600160e01b03169250620003fa83858760201c565b91506000811180156200043e57504386620004176001846200087d565b815481106200042a576200042a62000897565b60009182526020909120015463ffffffff16145b15620004b2576200045a826200055d60201b62000fc51760201c565b86620004686001846200087d565b815481106200047b576200047b62000897565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000537565b856040518060400160405280620004d443620005cc60201b6200105d1760201c565b63ffffffff168152602001620004f5856200055d60201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b620005408383836200063360201b620010d91760201c565b60006001600160e01b03821115620005c85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840162000262565b5090565b600063ffffffff821115620005c85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840162000262565b6200064b8383836200054060201b620008521760201c565b6001600160a01b0383811660009081526006602052604080822054858416835291205462000540929182169116838183148015906200068a5750600081115b1562000540576001600160a01b0383161562000717576001600160a01b038316600090815260076020908152604082208291620006d49190620007a2901b6200111817856200038e565b91509150846001600160a01b031660008051602062002e8683398151915283836040516200070c929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161562000540576001600160a01b0382166000908152600760209081526040822082916200075b919062000379901b62000fb917856200038e565b91509150836001600160a01b031660008051602062002e86833981519152838360405162000793929190918252602082015260400190565b60405180910390a25050505050565b60006200038782846200087d565b828054620007be90620008ad565b90600052602060002090601f016020900481019282620007e257600085556200082d565b82601f10620007fd57805160ff19168380011785556200082d565b828001600101855582156200082d579182015b828111156200082d57825182559160200191906001019062000810565b50620005c89291505b80821115620005c8576000815560010162000836565b634e487b7160e01b600052601160045260246000fd5b600082198211156200087857620008786200084c565b500190565b6000828210156200089257620008926200084c565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620008c257607f821691505b60208210811415620008e457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161254c6200093a6000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b015261254c6000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d3919061217e565b60405180910390f35b6101ef6101ea36600461221a565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f366004612244565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef61024936600461221a565b610688565b61020361025c36600461221a565b6106d1565b61027461026f366004612280565b610758565b005b6102af610284366004612299565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612299565b610765565b6102fa6102f5366004612299565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612299565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61035861035336600461221a565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b61027461038336600461221a565b6107b8565b610203610396366004612299565b610857565b6102036103a9366004612280565b610882565b6101c66108de565b6102036103c4366004612299565b6108ed565b6101ef6103d736600461221a565b6109b8565b6101ef6103ea36600461221a565b610a76565b6103586103fd366004612299565b610a83565b6102746104103660046122c5565b610a91565b61027461042336600461231d565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612387565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123ba565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123fa565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123fa565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612477565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611617565b9392505050565b61076233826116fe565b50565b6107623382611708565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b6117a6565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116fe565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611617565b60606004805461050f906123fa565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902061094960018361248f565b81548110610959576109596124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a0016040516020818303038152906040528051906020012061182a565b858585611893565b9050610b73816118bb565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb8188611708565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118bb565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb8261182a565b90506000610ccb82878787611893565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db06124a6565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118f0565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612477565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612477565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611ad2565b5050565b60006107518284612477565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611add565b6000610751828461248f565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612477565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611ad2565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f00000000000000000000000000000000000000000000000000000000000000006060830152612600608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561167b5760006116328284611c82565b905084868281548110611647576116476124a6565b60009182526020909120015463ffffffff16111561166757809250611675565b611672816001612477565b91505b5061161e565b81156116d4578461168d60018461248f565b8154811061169d5761169d6124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116d7565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c9d565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611add565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61183761150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006118a487878787611cb5565b915091506118b181611dcd565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b825460009081908015611950578561190960018361248f565b81548110611919576119196124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611953565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061198183858763ffffffff16565b91506000811180156119bf5750438661199b60018461248f565b815481106119ab576119ab6124a6565b60009182526020909120015463ffffffff16145b15611a49576119cd82610fc5565b866119d960018461248f565b815481106119e9576119e96124a6565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ac9565b856040518060400160405280611a5e4361105d565b63ffffffff168152602001611a7285610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b195750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bce5773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b6e90611118856118f0565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bc3929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c1e90610fb9856118f0565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c73929190918252602082015260400190565b60405180910390a25050505050565b6000611c9160028484186124d5565b61075190848416612477565b611ca78282611fbe565b610ea16008611118836118f0565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cec5750600090506003611dc4565b8460ff16601b14158015611d0457508460ff16601c14155b15611d155750600090506004611dc4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d69573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611dbd57600060019250925050611dc4565b9150600090505b94509492505050565b6000816004811115611de157611de1612510565b1415611dea5750565b6001816004811115611dfe57611dfe612510565b1415611e4c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e6057611e60612510565b1415611eae5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611ec257611ec2612510565b1415611f365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f4a57611f4a612510565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120475760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061211f90849061248f565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611ad2565b600060208083528351808285015260005b818110156121ab5785810183015185820160400152820161218f565b818111156121bd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461221557600080fd5b919050565b6000806040838503121561222d57600080fd5b612236836121f1565b946020939093013593505050565b60008060006060848603121561225957600080fd5b612262846121f1565b9250612270602085016121f1565b9150604084013590509250925092565b60006020828403121561229257600080fd5b5035919050565b6000602082840312156122ab57600080fd5b610751826121f1565b803560ff8116811461221557600080fd5b60008060008060008060c087890312156122de57600080fd5b6122e7876121f1565b95506020870135945060408701359350612303606088016122b4565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561233857600080fd5b612341886121f1565b965061234f602089016121f1565b9550604088013594506060880135935061236b608089016122b4565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561239a57600080fd5b6123a3836121f1565b91506123b1602084016121f1565b90509250929050565b600080604083850312156123cd57600080fd5b6123d6836121f1565b9150602083013563ffffffff811681146123ef57600080fd5b809150509250929050565b600181811c9082168061240e57607f821691505b602082108114156118ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561248a5761248a612448565b500190565b6000828210156124a1576124a1612448565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008261250b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d3919061217e565b60405180910390f35b6101ef6101ea36600461221a565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f366004612244565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef61024936600461221a565b610688565b61020361025c36600461221a565b6106d1565b61027461026f366004612280565b610758565b005b6102af610284366004612299565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612299565b610765565b6102fa6102f5366004612299565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612299565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61035861035336600461221a565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b61027461038336600461221a565b6107b8565b610203610396366004612299565b610857565b6102036103a9366004612280565b610882565b6101c66108de565b6102036103c4366004612299565b6108ed565b6101ef6103d736600461221a565b6109b8565b6101ef6103ea36600461221a565b610a76565b6103586103fd366004612299565b610a83565b6102746104103660046122c5565b610a91565b61027461042336600461231d565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612387565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123ba565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123fa565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123fa565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612477565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611617565b9392505050565b61076233826116fe565b50565b6107623382611708565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b6117a6565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116fe565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611617565b60606004805461050f906123fa565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902061094960018361248f565b81548110610959576109596124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a0016040516020818303038152906040528051906020012061182a565b858585611893565b9050610b73816118bb565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb8188611708565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118bb565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb8261182a565b90506000610ccb82878787611893565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db06124a6565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118f0565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612477565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612477565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611ad2565b5050565b60006107518284612477565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611add565b6000610751828461248f565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612477565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611ad2565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f00000000000000000000000000000000000000000000000000000000000000006060830152612600608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561167b5760006116328284611c82565b905084868281548110611647576116476124a6565b60009182526020909120015463ffffffff16111561166757809250611675565b611672816001612477565b91505b5061161e565b81156116d4578461168d60018461248f565b8154811061169d5761169d6124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116d7565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c9d565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611add565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61183761150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006118a487878787611cb5565b915091506118b181611dcd565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b825460009081908015611950578561190960018361248f565b81548110611919576119196124a6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611953565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061198183858763ffffffff16565b91506000811180156119bf5750438661199b60018461248f565b815481106119ab576119ab6124a6565b60009182526020909120015463ffffffff16145b15611a49576119cd82610fc5565b866119d960018461248f565b815481106119e9576119e96124a6565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ac9565b856040518060400160405280611a5e4361105d565b63ffffffff168152602001611a7285610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b195750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bce5773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b6e90611118856118f0565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bc3929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c1e90610fb9856118f0565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c73929190918252602082015260400190565b60405180910390a25050505050565b6000611c9160028484186124d5565b61075190848416612477565b611ca78282611fbe565b610ea16008611118836118f0565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cec5750600090506003611dc4565b8460ff16601b14158015611d0457508460ff16601c14155b15611d155750600090506004611dc4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d69573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611dbd57600060019250925050611dc4565b9150600090505b94509492505050565b6000816004811115611de157611de1612510565b1415611dea5750565b6001816004811115611dfe57611dfe612510565b1415611e4c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e6057611e60612510565b1415611eae5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611ec257611ec2612510565b1415611f365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f4a57611f4a612510565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120475760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061211f90849061248f565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611ad2565b600060208083528351808285015260005b818110156121ab5785810183015185820160400152820161218f565b818111156121bd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461221557600080fd5b919050565b6000806040838503121561222d57600080fd5b612236836121f1565b946020939093013593505050565b60008060006060848603121561225957600080fd5b612262846121f1565b9250612270602085016121f1565b9150604084013590509250925092565b60006020828403121561229257600080fd5b5035919050565b6000602082840312156122ab57600080fd5b610751826121f1565b803560ff8116811461221557600080fd5b60008060008060008060c087890312156122de57600080fd5b6122e7876121f1565b95506020870135945060408701359350612303606088016122b4565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561233857600080fd5b612341886121f1565b965061234f602089016121f1565b9550604088013594506060880135935061236b608089016122b4565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561239a57600080fd5b6123a3836121f1565b91506123b1602084016121f1565b90509250929050565b600080604083850312156123cd57600080fd5b6123d6836121f1565b9150602083013563ffffffff811681146123ef57600080fd5b809150509250929050565b600181811c9082168061240e57607f821691505b602082108114156118ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561248a5761248a612448565b500190565b6000828210156124a1576124a1612448565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008261250b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "DOMAIN_SEPARATOR()": { ++ "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." ++ }, ++ "allowance(address,address)": { ++ "details": "See {IERC20-allowance}." ++ }, ++ "approve(address,uint256)": { ++ "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." ++ }, ++ "balanceOf(address)": { ++ "details": "See {IERC20-balanceOf}." ++ }, ++ "burn(uint256)": { ++ "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." ++ }, ++ "burnFrom(address,uint256)": { ++ "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." ++ }, ++ "checkpoints(address,uint32)": { ++ "details": "Get the `pos`-th checkpoint for `account`." ++ }, ++ "decimals()": { ++ "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." ++ }, ++ "decreaseAllowance(address,uint256)": { ++ "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." ++ }, ++ "delegate(address)": { ++ "details": "Delegate votes from the sender to `delegatee`." ++ }, ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "Delegates votes from signer to `delegatee`" ++ }, ++ "delegates(address)": { ++ "details": "Get the address `account` is currently delegating to." ++ }, ++ "getCurrentVotes(address)": { ++ "details": "Comp version of the {getVotes} accessor, with `uint96` return type." ++ }, ++ "getPastTotalSupply(uint256)": { ++ "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPastVotes(address,uint256)": { ++ "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPriorVotes(address,uint256)": { ++ "details": "Comp version of the {getPastVotes} accessor, with `uint96` return type." ++ }, ++ "getVotes(address)": { ++ "details": "Gets the current votes balance for `account`" ++ }, ++ "increaseAllowance(address,uint256)": { ++ "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." ++ }, ++ "name()": { ++ "details": "Returns the name of the token." ++ }, ++ "nonces(address)": { ++ "details": "See {IERC20Permit-nonces}." ++ }, ++ "numCheckpoints(address)": { ++ "details": "Get number of checkpoints for `account`." ++ }, ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "See {IERC20Permit-permit}." ++ }, ++ "symbol()": { ++ "details": "Returns the symbol of the token, usually a shorter version of the name." ++ }, ++ "totalSupply()": { ++ "details": "See {IERC20-totalSupply}." ++ }, ++ "transfer(address,uint256)": { ++ "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." ++ }, ++ "transferFrom(address,address,uint256)": { ++ "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." ++ } ++ }, ++ "title": "Boba Token (BOBA)", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "maxSupply()": { ++ "notice": "Maximum possible number of tokens" ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 517, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_balances", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_uint256)" ++ }, ++ { ++ "astId": 523, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_allowances", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" ++ }, ++ { ++ "astId": 525, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupply", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 527, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_name", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 529, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_symbol", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 1937, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_nonces", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_mapping(t_address,t_struct(Counter)3381_storage)" ++ }, ++ { ++ "astId": 1210, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_delegates", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_mapping(t_address,t_address)" ++ }, ++ { ++ "astId": 1216, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_checkpoints", ++ "offset": 0, ++ "slot": "7", ++ "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)" ++ }, ++ { ++ "astId": 1220, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupplyCheckpoints", ++ "offset": 0, ++ "slot": "8", ++ "type": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_struct(Checkpoint)1201_storage)dyn_storage": { ++ "base": "t_struct(Checkpoint)1201_storage", ++ "encoding": "dynamic_array", ++ "label": "struct ERC20Votes.Checkpoint[]", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_address,t_address)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ }, ++ "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct ERC20Votes.Checkpoint[])", ++ "numberOfBytes": "32", ++ "value": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ }, ++ "t_mapping(t_address,t_mapping(t_address,t_uint256))": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => mapping(address => uint256))", ++ "numberOfBytes": "32", ++ "value": "t_mapping(t_address,t_uint256)" ++ }, ++ "t_mapping(t_address,t_struct(Counter)3381_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct Counters.Counter)", ++ "numberOfBytes": "32", ++ "value": "t_struct(Counter)3381_storage" ++ }, ++ "t_mapping(t_address,t_uint256)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => uint256)", ++ "numberOfBytes": "32", ++ "value": "t_uint256" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Checkpoint)1201_storage": { ++ "encoding": "inplace", ++ "label": "struct ERC20Votes.Checkpoint", ++ "members": [ ++ { ++ "astId": 1198, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "fromBlock", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint32" ++ }, ++ { ++ "astId": 1200, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "votes", ++ "offset": 4, ++ "slot": "0", ++ "type": "t_uint224" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Counter)3381_storage": { ++ "encoding": "inplace", ++ "label": "struct Counters.Counter", ++ "members": [ ++ { ++ "astId": 3380, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_value", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint256" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_uint224": { ++ "encoding": "inplace", ++ "label": "uint224", ++ "numberOfBytes": "28" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint32": { ++ "encoding": "inplace", ++ "label": "uint32", ++ "numberOfBytes": "4" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/4f69f2a6e8a163c8ae3512552ef63fef.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/4f69f2a6e8a163c8ae3512552ef63fef.json +new file mode 100644 +index 0000000..d609bf5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/4f69f2a6e8a163c8ae3512552ef63fef.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 9728, 0x4200000000000000000000000000000000000023));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobabnbtestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobafuji/.chainId +new file mode 100644 +index 0000000..a7350c7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/.chainId +@@ -0,0 +1 @@ ++43113 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/BondManager.json +new file mode 100644 +index 0000000..b975a51 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0x067cD503bd734a779830dafF0Db582B6a347c3df", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x50c3ae95d58c4fe3e2fbc3cd7cf9492f63a0593df6d15463f31b98a9a5801c0b", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x067cD503bd734a779830dafF0Db582B6a347c3df", ++ "transactionIndex": 1, ++ "gasUsed": "286711", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x82fcc155c4dcf1bea0655651df4d427aab8d94da0ca011d63ec5424573c6e04d", ++ "transactionHash": "0x50c3ae95d58c4fe3e2fbc3cd7cf9492f63a0593df6d15463f31b98a9a5801c0b", ++ "logs": [], ++ "blockNumber": 11967713, ++ "cumulativeGasUsed": "443228", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "60214b909489ebd64cda313056a99d07", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..8075392 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0xA36D21C0125b5Dc52d95ED8FF1eF7188d4666EAE", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x046ef73881a3306a12d6fca002183a38ac7d7d2cc96f7814c86d21fb3d25e3ab", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0xA36D21C0125b5Dc52d95ED8FF1eF7188d4666EAE", ++ "transactionIndex": 0, ++ "gasUsed": "1586323", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xfc9d9df7498e53d9c7fb55c346ae10703f2dac03bf180c132c150a7a7adfe254", ++ "transactionHash": "0x046ef73881a3306a12d6fca002183a38ac7d7d2cc96f7814c86d21fb3d25e3ab", ++ "logs": [], ++ "blockNumber": 12065677, ++ "cumulativeGasUsed": "1586323", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7266, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7268, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7285, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7291, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11840_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11840_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11840_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11840_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11837, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11839, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..9e1c3e6 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x9Dcc22885A73611BF36A590eEea07EBA7044FB82", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x361e5b704721357a5a49ab05b22e0b1166048c848e2b18c1df4b34f92bc1f1fc", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x9Dcc22885A73611BF36A590eEea07EBA7044FB82", ++ "transactionIndex": 3, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0770aee2c44ddca3635475b193b36abc590b4625c1a889a2007e9aceb0e6054c", ++ "transactionHash": "0x361e5b704721357a5a49ab05b22e0b1166048c848e2b18c1df4b34f92bc1f1fc", ++ "logs": [], ++ "blockNumber": 12065662, ++ "cumulativeGasUsed": "1038802", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..34dea09 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xB088cCfC4b0BA882a6fD95bAe19FdAc2A98f96fC", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xc7092e853be0a154e4a9d57ba5179f738fadf53b06723572ed4665027501c3c0", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0xB088cCfC4b0BA882a6fD95bAe19FdAc2A98f96fC", ++ "transactionIndex": 0, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x266f4662b8e4522ad2fbd6974444b57c08d21a4795ea7c395e8560e6353da081", ++ "transactionHash": "0xc7092e853be0a154e4a9d57ba5179f738fadf53b06723572ed4665027501c3c0", ++ "logs": [], ++ "blockNumber": 12065666, ++ "cumulativeGasUsed": "938127", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..37a2e70 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x5A117a9B09f695ceCAC49a724726093d677c662A", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xe4c732b5d61a198d0f7c99de52d47c3e0ad63e1e48032ffd8a511161d9461443", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x5A117a9B09f695ceCAC49a724726093d677c662A", ++ "transactionIndex": 1, ++ "gasUsed": "938067", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x8f6590408bb780dcfa91ae77121ae857b189943f839dfcb9bba91a8a0e8d34fa", ++ "transactionHash": "0xe4c732b5d61a198d0f7c99de52d47c3e0ad63e1e48032ffd8a511161d9461443", ++ "logs": [], ++ "blockNumber": 12065672, ++ "cumulativeGasUsed": "1539695", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..b2eb0c7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0x74546A4c6D5543Be7e8447159c47BAe7f5431C49", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x9bdfa341ac5c5da8be439b72616829a5b23621a2f86b18901c99bf99d149cd1c", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x74546A4c6D5543Be7e8447159c47BAe7f5431C49", ++ "transactionIndex": 3, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x83e554601576b5ab40530e4f866e19f1952084595ff0ee13d77ee5fb30e57839", ++ "transactionHash": "0x9bdfa341ac5c5da8be439b72616829a5b23621a2f86b18901c99bf99d149cd1c", ++ "logs": [], ++ "blockNumber": 11968027, ++ "cumulativeGasUsed": "959729", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "60214b909489ebd64cda313056a99d07", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Lib_AddressManager.json +new file mode 100644 +index 0000000..0828cb5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x00edbcf1e73d87394649374a3e44960d3e1d144cb9d3d6c521cd3ab31790519a", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "transactionIndex": 0, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000000000000001000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000001000000000200000000000000010000000000000000001000002000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x7d032c8204145b01ff09ba3fa9a7ecb73b486600298fd7d95ebdfbc59d7909ee", ++ "transactionHash": "0x00edbcf1e73d87394649374a3e44960d3e1d144cb9d3d6c521cd3ab31790519a", ++ "logs": [ ++ { ++ "transactionIndex": 0, ++ "blockNumber": 11967644, ++ "transactionHash": "0x00edbcf1e73d87394649374a3e44960d3e1d144cb9d3d6c521cd3ab31790519a", ++ "address": "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x00000000000000000000000038d53fb382d6c96c6ee02310e87b3959fbb72f84" ++ ], ++ "data": "0x", ++ "logIndex": 0, ++ "blockHash": "0x7d032c8204145b01ff09ba3fa9a7ecb73b486600298fd7d95ebdfbc59d7909ee" ++ } ++ ], ++ "blockNumber": 11967644, ++ "cumulativeGasUsed": "454575", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "60214b909489ebd64cda313056a99d07", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12040, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..e9dd44c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0xf115969B60b7c00391A893c2dbaF2A95B5bC5901", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x8d450c059e5f8854bdfb117a9ba7e9aa1bd72b3957740ad106d9781dd029db5a", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0xf115969B60b7c00391A893c2dbaF2A95B5bC5901", ++ "transactionIndex": 2, ++ "gasUsed": "3403430", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x535881f36c61ca94e50f85d7c362ec4a0b929a4e23dc4f1d138ee380690036f4", ++ "transactionHash": "0x8d450c059e5f8854bdfb117a9ba7e9aa1bd72b3957740ad106d9781dd029db5a", ++ "logs": [], ++ "blockNumber": 11967722, ++ "cumulativeGasUsed": "3804324", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "60214b909489ebd64cda313056a99d07", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12115, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12107" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..0bb2eb0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0x0ed5efa81c8a6819969717478ab31c456943d70259401307483efa7ab80dd70e", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b", ++ "transactionIndex": 0, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x419f5c29dad435ede75e9fe259e7e0bc90cc8ed3d0cae4fb25338039d293ba27", ++ "transactionHash": "0x0ed5efa81c8a6819969717478ab31c456943d70259401307483efa7ab80dd70e", ++ "logs": [], ++ "blockNumber": 11967733, ++ "cumulativeGasUsed": "282599", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "60214b909489ebd64cda313056a99d07", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12152, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12157, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12107)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12107": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12107)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12107" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..5910f72 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xdceb77ad88ae639ca4ef890951bd7c495818d828ebb26293f31ad4831f771f2b", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56", ++ "transactionIndex": 0, ++ "gasUsed": "605560", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x2eecf8b1a735c938961b996f081680a31136de204549f5446bdf80ee4c39d979", ++ "transactionHash": "0xdceb77ad88ae639ca4ef890951bd7c495818d828ebb26293f31ad4831f771f2b", ++ "logs": [], ++ "blockNumber": 11967973, ++ "cumulativeGasUsed": "605560", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/README.md b/node_modules/@eth-optimism/contracts/deployments/bobafuji/README.md +new file mode 100644 +index 0000000..847b1f3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/README.md +@@ -0,0 +1,293 @@ ++# Boba Avalanche (public testnet) ++## Network Info ++- **Chain ID**: 4328 ++- **Public RPC**: https://testnet.avax.boba.network ++- **Block Explorer**: https://blockexplorer.testnet.avax.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0x067cD503bd734a779830dafF0Db582B6a347c3df ++ ++
++CanonicalTransactionChain ++ ++ ++0xA36D21C0125b5Dc52d95ED8FF1eF7188d4666EAE ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x9Dcc22885A73611BF36A590eEea07EBA7044FB82 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0xB088cCfC4b0BA882a6fD95bAe19FdAc2A98f96fC ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x5A117a9B09f695ceCAC49a724726093d677c662A ++ ++
++L1MultiMessageRelayer ++ ++ ++0x74546A4c6D5543Be7e8447159c47BAe7f5431C49 ++ ++
++Lib_AddressManager ++ ++ ++0xcE78de95b85212BC348452e91e0e74c17cf37c79 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b ++ ++
++Proxy__L1StandardBridge ++ ++ ++0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56 ++ ++
++StateCommitmentChain ++ ++ ++0x57B9C47F2Ae857005238096486C5B107447dE221 ++ ++
++TK_L1BOBA ++ ++ ++0xEaE78E78cC22690719361F65a50734A15aaE698C ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/StateCommitmentChain.json +new file mode 100644 +index 0000000..13f8df4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0x57B9C47F2Ae857005238096486C5B107447dE221", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x00373651c10422e2412d1d6b4eda2fe402880027ce0cf2c8b318495ced891dbc", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0x57B9C47F2Ae857005238096486C5B107447dE221", ++ "transactionIndex": 0, ++ "gasUsed": "1839462", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x78e206a30f13ba7b0f0d662ebe8d96bbc62f176aaa690a87935935ac9f163561", ++ "transactionHash": "0x00373651c10422e2412d1d6b4eda2fe402880027ce0cf2c8b318495ced891dbc", ++ "logs": [], ++ "blockNumber": 12065684, ++ "cumulativeGasUsed": "1839462", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xcE78de95b85212BC348452e91e0e74c17cf37c79", ++ 0, ++ 0 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8532, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8534, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/TK_L1BOBA.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/TK_L1BOBA.json +new file mode 100644 +index 0000000..9eab995 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/TK_L1BOBA.json +@@ -0,0 +1,992 @@ ++{ ++ "address": "0xEaE78E78cC22690719361F65a50734A15aaE698C", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x7c0b53bfa6ed2aa6e276d21f54d94ab069d3a1d5e3e9a32edc18098c72cba497", ++ "receipt": { ++ "to": null, ++ "from": "0x38d53fB382D6C96c6ee02310e87b3959fBB72f84", ++ "contractAddress": "0xEaE78E78cC22690719361F65a50734A15aaE698C", ++ "transactionIndex": 0, ++ "gasUsed": "2278070", ++ "logsBloom": "0x00000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000008000000000000000002000000000000000000020000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000002000000000000000000000000000000000000000000000000000020000000000000000200000000000000000000000000000000000000000000000000", ++ "blockHash": "0x5d304f8fa375c7c1935acdfbc04219d96d3db2cbb5257419174eb54819bac406", ++ "transactionHash": "0x7c0b53bfa6ed2aa6e276d21f54d94ab069d3a1d5e3e9a32edc18098c72cba497", ++ "logs": [ ++ { ++ "transactionIndex": 0, ++ "blockNumber": 12065691, ++ "transactionHash": "0x7c0b53bfa6ed2aa6e276d21f54d94ab069d3a1d5e3e9a32edc18098c72cba497", ++ "address": "0xEaE78E78cC22690719361F65a50734A15aaE698C", ++ "topics": [ ++ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x00000000000000000000000038d53fb382d6c96c6ee02310e87b3959fbb72f84" ++ ], ++ "data": "0x0000000000000000000000000000000000000000019d971e4fe8401e74000000", ++ "logIndex": 0, ++ "blockHash": "0x5d304f8fa375c7c1935acdfbc04219d96d3db2cbb5257419174eb54819bac406" ++ } ++ ], ++ "blockNumber": 12065691, ++ "cumulativeGasUsed": "2278070", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 2, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getCurrentVotes(address)\":{\"details\":\"Comp version of the {getVotes} accessor, with `uint96` return type.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getPriorVotes(address,uint256)\":{\"details\":\"Comp version of the {getPastVotes} accessor, with `uint96` return type.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Boba Token (BOBA)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"maxSupply()\":{\"notice\":\"Maximum possible number of tokens\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/token/BOBA.sol\":\"BOBA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n uint256 currentAllowance = allowance(account, _msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n unchecked {\\n _approve(account, _msgSender(), currentAllowance - amount);\\n }\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ERC20Votes.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\\n *\\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\\n * {ERC20Votes} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20VotesComp is ERC20Votes {\\n /**\\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n return SafeCast.toUint96(getVotes(account));\\n }\\n\\n /**\\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\\n }\\n\\n /**\\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\\n */\\n function _maxSupply() internal view virtual override returns (uint224) {\\n return type(uint96).max;\\n }\\n}\\n\",\"keccak256\":\"0xa52bdcb6cc115060b6f2900c6c25a1261488f1fcbcebc0554f8ae056422c3884\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"contracts/L1/token/BOBA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\n\\n//Extension of ERC20 to support Compound-like voting and delegation\\n//This extension keeps a history (checkpoints) of each account's vote power.\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\n//Extension of ERC20 to support Compound's voting and delegation\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\\\";\\n\\n//Extension of {ERC20} that allows token holders to destroy both their own\\n//tokens and those that they have an allowance for, in a way that can be\\n//recognized off-chain (via event analysis).\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title Boba Token (BOBA)\\n *\\n */\\n\\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\\n /// @notice Maximum possible number of tokens\\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\\n\\n /// @notice Maximum token supply. Needed to fit the COMP interface.\\n // The math: The classic Comp governance contracts are\\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\\n // Our maxSupply is 5e+26, so we are under the limit\\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\\n return maxSupply;\\n }\\n\\n constructor() ERC20(\\\"Boba Token\\\", \\\"BOBA\\\") ERC20Permit(\\\"Boba Token\\\") {\\n //mint maxSupply at genesis, allocated to deployer\\n _mint(_msgSender(), maxSupply);\\n }\\n\\n // Override required by Solidity because _mint is defined by two base classes\\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._mint(_to, _amount);\\n }\\n\\n // Override required by Solidity because _burn is defined by two base classes\\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._burn(_account, _amount);\\n }\\n\\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20, ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9a47d98fe8ff8b3198368fe140bc3e79ac654cc3bfbceda74e8b3610cc3fe677\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "DOMAIN_SEPARATOR()": { ++ "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." ++ }, ++ "allowance(address,address)": { ++ "details": "See {IERC20-allowance}." ++ }, ++ "approve(address,uint256)": { ++ "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." ++ }, ++ "balanceOf(address)": { ++ "details": "See {IERC20-balanceOf}." ++ }, ++ "burn(uint256)": { ++ "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." ++ }, ++ "burnFrom(address,uint256)": { ++ "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." ++ }, ++ "checkpoints(address,uint32)": { ++ "details": "Get the `pos`-th checkpoint for `account`." ++ }, ++ "decimals()": { ++ "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." ++ }, ++ "decreaseAllowance(address,uint256)": { ++ "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." ++ }, ++ "delegate(address)": { ++ "details": "Delegate votes from the sender to `delegatee`." ++ }, ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "Delegates votes from signer to `delegatee`" ++ }, ++ "delegates(address)": { ++ "details": "Get the address `account` is currently delegating to." ++ }, ++ "getCurrentVotes(address)": { ++ "details": "Comp version of the {getVotes} accessor, with `uint96` return type." ++ }, ++ "getPastTotalSupply(uint256)": { ++ "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPastVotes(address,uint256)": { ++ "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPriorVotes(address,uint256)": { ++ "details": "Comp version of the {getPastVotes} accessor, with `uint96` return type." ++ }, ++ "getVotes(address)": { ++ "details": "Gets the current votes balance for `account`" ++ }, ++ "increaseAllowance(address,uint256)": { ++ "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." ++ }, ++ "name()": { ++ "details": "Returns the name of the token." ++ }, ++ "nonces(address)": { ++ "details": "See {IERC20Permit-nonces}." ++ }, ++ "numCheckpoints(address)": { ++ "details": "Get number of checkpoints for `account`." ++ }, ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "See {IERC20Permit-permit}." ++ }, ++ "symbol()": { ++ "details": "Returns the symbol of the token, usually a shorter version of the name." ++ }, ++ "totalSupply()": { ++ "details": "See {IERC20-totalSupply}." ++ }, ++ "transfer(address,uint256)": { ++ "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." ++ }, ++ "transferFrom(address,address,uint256)": { ++ "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." ++ } ++ }, ++ "title": "Boba Token (BOBA)", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "maxSupply()": { ++ "notice": "Maximum possible number of tokens" ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 517, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_balances", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_uint256)" ++ }, ++ { ++ "astId": 523, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_allowances", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" ++ }, ++ { ++ "astId": 525, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupply", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 527, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_name", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 529, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_symbol", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 1937, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_nonces", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_mapping(t_address,t_struct(Counter)3381_storage)" ++ }, ++ { ++ "astId": 1210, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_delegates", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_mapping(t_address,t_address)" ++ }, ++ { ++ "astId": 1216, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_checkpoints", ++ "offset": 0, ++ "slot": "7", ++ "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)" ++ }, ++ { ++ "astId": 1220, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupplyCheckpoints", ++ "offset": 0, ++ "slot": "8", ++ "type": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_struct(Checkpoint)1201_storage)dyn_storage": { ++ "base": "t_struct(Checkpoint)1201_storage", ++ "encoding": "dynamic_array", ++ "label": "struct ERC20Votes.Checkpoint[]", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_address,t_address)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ }, ++ "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct ERC20Votes.Checkpoint[])", ++ "numberOfBytes": "32", ++ "value": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ }, ++ "t_mapping(t_address,t_mapping(t_address,t_uint256))": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => mapping(address => uint256))", ++ "numberOfBytes": "32", ++ "value": "t_mapping(t_address,t_uint256)" ++ }, ++ "t_mapping(t_address,t_struct(Counter)3381_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct Counters.Counter)", ++ "numberOfBytes": "32", ++ "value": "t_struct(Counter)3381_storage" ++ }, ++ "t_mapping(t_address,t_uint256)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => uint256)", ++ "numberOfBytes": "32", ++ "value": "t_uint256" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Checkpoint)1201_storage": { ++ "encoding": "inplace", ++ "label": "struct ERC20Votes.Checkpoint", ++ "members": [ ++ { ++ "astId": 1198, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "fromBlock", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint32" ++ }, ++ { ++ "astId": 1200, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "votes", ++ "offset": 4, ++ "slot": "0", ++ "type": "t_uint224" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Counter)3381_storage": { ++ "encoding": "inplace", ++ "label": "struct Counters.Counter", ++ "members": [ ++ { ++ "astId": 3380, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_value", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint256" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_uint224": { ++ "encoding": "inplace", ++ "label": "uint224", ++ "numberOfBytes": "28" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint32": { ++ "encoding": "inplace", ++ "label": "uint32", ++ "numberOfBytes": "4" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/60214b909489ebd64cda313056a99d07.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/60214b909489ebd64cda313056a99d07.json +new file mode 100644 +index 0000000..20949e7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/60214b909489ebd64cda313056a99d07.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 4328, 0x4200000000000000000000000000000000000023));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +similarity index 56% +rename from node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json +rename to node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +index f39f392..c0a5137 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +@@ -1,8 +1,32 @@ + { + "language": "Solidity", + "sources": { +- "contracts/L1/deployment/AddressDictator.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title AddressDictator\n * @dev The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate\n * many different addresses in the AddressManager without transferring ownership of the\n * AddressManager to a hot wallet or hardware wallet.\n */\ncontract AddressDictator {\n /*********\n * Types *\n *********/\n\n struct NamedAddress {\n string name;\n address addr;\n }\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public manager;\n address public finalOwner;\n NamedAddress[] namedAddresses;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _manager Address of the AddressManager contract.\n * @param _finalOwner Address to transfer AddressManager ownership to afterwards.\n * @param _names Array of names to associate an address with.\n * @param _addresses Array of addresses to associate with the name.\n */\n constructor(\n Lib_AddressManager _manager,\n address _finalOwner,\n string[] memory _names,\n address[] memory _addresses\n ) {\n manager = _manager;\n finalOwner = _finalOwner;\n require(\n _names.length == _addresses.length,\n \"AddressDictator: Must provide an equal number of names and addresses.\"\n );\n for (uint256 i = 0; i < _names.length; i++) {\n namedAddresses.push(NamedAddress({ name: _names[i], addr: _addresses[i] }));\n }\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Called to finalize the transfer, this function is callable by anyone, but will only result in\n * an upgrade if this contract is the owner Address Manager.\n */\n function setAddresses() external {\n for (uint256 i = 0; i < namedAddresses.length; i++) {\n manager.setAddress(namedAddresses[i].name, namedAddresses[i].addr);\n }\n // note that this will revert if _finalOwner == currentOwner\n manager.transferOwnership(finalOwner);\n }\n\n /**\n * Transfers ownership of this contract to the finalOwner.\n * Only callable by the Final Owner, which is intended to be our multisig.\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can recover\n * if something really surprising goes wrong.\n */\n function returnOwnership() external {\n require(msg.sender == finalOwner, \"AddressDictator: only callable by finalOwner\");\n manager.transferOwnership(finalOwner);\n }\n\n /******************\n * View Functions *\n ******************/\n\n /**\n * Returns the full namedAddresses array.\n */\n function getNamedAddresses() external view returns (NamedAddress[] memory) {\n return namedAddresses;\n }\n}\n" ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +@@ -13,12 +37,6 @@ + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, +- "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, + "contracts/L1/verification/BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" + }, +@@ -28,9 +46,6 @@ + "contracts/L1/rollup/StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, +- "contracts/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, + "contracts/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, +@@ -38,43 +53,28 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" + }, + "contracts/L1/rollup/ICanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" + }, + "contracts/L1/rollup/IChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" + }, +- "contracts/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" +- }, + "contracts/L1/rollup/ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" + }, + "contracts/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Buffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" + }, + "contracts/L1/rollup/CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" + }, + "contracts/standards/AddressAliasHelper.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" + }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/L1/messaging/L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" + }, + "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" +@@ -83,14 +83,11 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" + }, + "contracts/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" + }, + "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" + }, +- "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" + }, +@@ -100,38 +97,65 @@ + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, + "contracts/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, +- "contracts/libraries/bridge/ICrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" + }, +- "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" + }, + "contracts/L2/messaging/L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" + }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, + "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" + }, + "contracts/L2/messaging/L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" + }, + "contracts/L1/messaging/IL1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event ETHDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" + }, + "contracts/L1/messaging/IL1ERC20Bridge.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" +@@ -142,9 +166,6 @@ + "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" + }, +- "contracts/libraries/bridge/CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, + "contracts/standards/IL2StandardERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, +@@ -154,8 +175,14 @@ + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" + }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, + "contracts/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" +@@ -163,50 +190,95 @@ + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, +- "contracts/L2/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(Lib_PredeployAddresses.L2_STANDARD_BRIDGE, address(0), \"Ether\", \"ETH\")\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n // solhint-disable max-line-length\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n // solhint-enable max-line-length\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, +- "contracts/L1/messaging/L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" + }, +- "contracts/L2/messaging/L2StandardTokenFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" + }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" + }, +- "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" + } + }, + "settings": { +@@ -214,9 +286,14 @@ + "enabled": true, + "runs": 10000 + }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, + "outputSelection": { + "*": { + "*": [ ++ "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", +@@ -224,16 +301,14 @@ + "metadata", + "devdoc", + "userdoc", +- "storageLayout", +- "evm.gasEstimates" ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" + ], + "": [ + "ast" + ] + } +- }, +- "metadata": { +- "useLiteralContent": true + } + } + } +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobafuji/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobaopera/.chainId +new file mode 100644 +index 0000000..8a32cf7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/.chainId +@@ -0,0 +1 @@ ++250 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/BondManager.json +new file mode 100644 +index 0000000..e2c1ecd +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x4c6c1c1a4cb9a483a83c773f9c48cfa9a8242a0dab5345b4fef550ef2215ffb8", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1", ++ "transactionIndex": 5, ++ "gasUsed": "286711", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x00026981000005ea07aede9a9de643ae65955efce50e85c6973097790f6e03d1", ++ "transactionHash": "0x4c6c1c1a4cb9a483a83c773f9c48cfa9a8242a0dab5345b4fef550ef2215ffb8", ++ "logs": [], ++ "blockNumber": 47969993, ++ "cumulativeGasUsed": "2552773", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..5dce037 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0x6001C473E020D3562Ea436B61aE4d2e91e7078cE", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x8cbcb8e23e56fe0d4472a6d970a80ffb6cbd8bf7dfff4a305c52c0298ddcec57", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x6001C473E020D3562Ea436B61aE4d2e91e7078cE", ++ "transactionIndex": 0, ++ "gasUsed": "1586323", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0002698100000455a665545c4fd7db8549e134522ed9a7e26fdcb85ceb6ad4db", ++ "transactionHash": "0x8cbcb8e23e56fe0d4472a6d970a80ffb6cbd8bf7dfff4a305c52c0298ddcec57", ++ "logs": [], ++ "blockNumber": 47969961, ++ "cumulativeGasUsed": "1586323", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 7270, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7272, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7274, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7291, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7293, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7297, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11846_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11846_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11846_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11846_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11841, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11843, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11845, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..8bf7ee5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x282267F1CD5562F91036a1f9FA52961A48385139", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x1dbee54dd17515eb205b3c0dcbf5225d359a988c5f6668a7f4414e1c7ecfe707", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x282267F1CD5562F91036a1f9FA52961A48385139", ++ "transactionIndex": 4, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x00026981000001b9992035e9d191c09b79b37a62b1ea0d2317bcf8c29c602ccd", ++ "transactionHash": "0x1dbee54dd17515eb205b3c0dcbf5225d359a988c5f6668a7f4414e1c7ecfe707", ++ "logs": [], ++ "blockNumber": 47969912, ++ "cumulativeGasUsed": "1330818", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..0ff919e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x36666Bc3d9FE6fDCfC5Aa1f6e907f36EbF8a8176", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x45bbb47c0f1e72f3681d5501fddc915873d4bba3c3482f634b266d74cd8957ae", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x36666Bc3d9FE6fDCfC5Aa1f6e907f36EbF8a8176", ++ "transactionIndex": 1, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000269810000029a412bf61be4522618f1c5f444597b77ec77efd4008887600c", ++ "transactionHash": "0x45bbb47c0f1e72f3681d5501fddc915873d4bba3c3482f634b266d74cd8957ae", ++ "logs": [], ++ "blockNumber": 47969928, ++ "cumulativeGasUsed": "1110029", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..616c77f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x2E3375B06811B3Baed04CC86C691B918155fE176", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x566ab4afad696bd95e808557c7b48a31277cdcbfadc47da84fc74eabee3a293b", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x2E3375B06811B3Baed04CC86C691B918155fE176", ++ "transactionIndex": 5, ++ "gasUsed": "938067", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000269810000036474904d7d2d52cbed4cb61ea3efc6749982f1851dc231bed6", ++ "transactionHash": "0x566ab4afad696bd95e808557c7b48a31277cdcbfadc47da84fc74eabee3a293b", ++ "logs": [], ++ "blockNumber": 47969943, ++ "cumulativeGasUsed": "1335311", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8060, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8063, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15674_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15674_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15669, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15673, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..b84767c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xc8269aa38499257d6b7f58512530d57b46f4e63c1ce77602722504457867ac9e", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f", ++ "transactionIndex": 28, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0002698200000165e323e66c436e620d074f1dde1e5fedff5bdead633cc70e74", ++ "transactionHash": "0xc8269aa38499257d6b7f58512530d57b46f4e63c1ce77602722504457867ac9e", ++ "logs": [], ++ "blockNumber": 47970107, ++ "cumulativeGasUsed": "3722548", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Lib_AddressManager.json +new file mode 100644 +index 0000000..401565f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x087f68e3522aa64c2d01ea625dc3fbd7724b02d90ebe0563c5dd2c29b643cb62", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "transactionIndex": 6, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000040800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000080000000020000800000000000000000000000000000000000002000000000000000400000000", ++ "blockHash": "0x00026980000009606b40f9fe22c08ace7f73f1b869fcf75e4bcc17aad388a391", ++ "transactionHash": "0x087f68e3522aa64c2d01ea625dc3fbd7724b02d90ebe0563c5dd2c29b643cb62", ++ "logs": [ ++ { ++ "transactionIndex": 6, ++ "blockNumber": 47969835, ++ "transactionHash": "0x087f68e3522aa64c2d01ea625dc3fbd7724b02d90ebe0563c5dd2c29b643cb62", ++ "address": "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000d2df8db1af84e9454fc1df16c7420acb15093e91" ++ ], ++ "data": "0x", ++ "logIndex": 37, ++ "blockHash": "0x00026980000009606b40f9fe22c08ace7f73f1b869fcf75e4bcc17aad388a391" ++ } ++ ], ++ "blockNumber": 47969835, ++ "cumulativeGasUsed": "1616626", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12050, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..7104eb1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,818 @@ ++{ ++ "address": "0xDEE010E1EedBE26C8AB3AEC8a16Cb974B31068FF", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "unpause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x9a363e06e2faccd74e7bb9be413ce2f6a05538d9193d48334f25b92b24b33a01", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0xDEE010E1EedBE26C8AB3AEC8a16Cb974B31068FF", ++ "transactionIndex": 0, ++ "gasUsed": "3462301", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x00026981000006d0e5696b2d938c95e117beb3e993f6c6dc26325b5cb0a2180d", ++ "transactionHash": "0x9a363e06e2faccd74e7bb9be413ce2f6a05538d9193d48334f25b92b24b33a01", ++ "logs": [], ++ "blockNumber": 47970010, ++ "cumulativeGasUsed": "3462301", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"},\"unpause()\":{\"notice\":\"Unpause relaying.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Unpause relaying.\\n */\\n function unpause() external onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbbaf0c0c57409c8e2aa3cb4704b75ef9e4f078fb98dc31e3c4d18cfee17a3e0b\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613d8f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ }, ++ "unpause()": { ++ "notice": "Unpause relaying." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5249, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..b7cae62 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0x5d79e7c83d000816d0915a89d5acaacb00a41ece7b446e5f267d9aa2c31f1700", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9", ++ "transactionIndex": 8, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0002698100000819d07982e0a68ace049349adca44e995959cf1b1c3c38b9e42", ++ "transactionHash": "0x5d79e7c83d000816d0915a89d5acaacb00a41ece7b446e5f267d9aa2c31f1700", ++ "logs": [], ++ "blockNumber": 47970034, ++ "cumulativeGasUsed": "2949635", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12162, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12167, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12117)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12117)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12117" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..9141632 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xd5d2bf46b293e4b8c864b79505886f49015e41c84cc29a1971ec0fafbf8e9f19", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8", ++ "transactionIndex": 6, ++ "gasUsed": "605560", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x0002698100000a132a24d69c8977e707be418a7c6aa10de999acebfb6ddf29c2", ++ "transactionHash": "0xd5d2bf46b293e4b8c864b79505886f49015e41c84cc29a1971ec0fafbf8e9f19", ++ "logs": [], ++ "blockNumber": 47970061, ++ "cumulativeGasUsed": "1306643", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/README.md b/node_modules/@eth-optimism/contracts/deployments/bobaopera/README.md +new file mode 100644 +index 0000000..cea5625 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/README.md +@@ -0,0 +1,283 @@ ++# bobaopera (public mainnet) ++## Network Info ++- **Chain ID**: 301 ++- **Public RPC**: https://bobaopera.boba.network ++- **Block Explorer**: https://blockexplorer.bobaopera.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1 ++ ++
++CanonicalTransactionChain ++ ++ ++0x6001C473E020D3562Ea436B61aE4d2e91e7078cE ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x282267F1CD5562F91036a1f9FA52961A48385139 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0x36666Bc3d9FE6fDCfC5Aa1f6e907f36EbF8a8176 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x2E3375B06811B3Baed04CC86C691B918155fE176 ++ ++
++L1MultiMessageRelayer ++ ++ ++0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f ++ ++
++Lib_AddressManager ++ ++ ++0x4e7325bcf09e091Bb8119258B885D4ef687B7386 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9 ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8 ++ ++
++StateCommitmentChain ++ ++ ++0xF764C4f8D2982432239A110Cf6B08e95631cE564 ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/StateCommitmentChain.json +new file mode 100644 +index 0000000..64c6829 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0xF764C4f8D2982432239A110Cf6B08e95631cE564", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x97c01dc39b4c6a9e2155a20847e94090cf39b35ef36b335ee7795e75e5b638d0", ++ "receipt": { ++ "to": null, ++ "from": "0xd2Df8Db1af84e9454Fc1dF16C7420aCb15093e91", ++ "contractAddress": "0xF764C4f8D2982432239A110Cf6B08e95631cE564", ++ "transactionIndex": 3, ++ "gasUsed": "1879322", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000269810000051b2d5a4f32bf90784cb44e1e248299a63f126552709c5c332c", ++ "transactionHash": "0x97c01dc39b4c6a9e2155a20847e94090cf39b35ef36b335ee7795e75e5b638d0", ++ "logs": [], ++ "blockNumber": 47969977, ++ "cumulativeGasUsed": "2796663", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", ++ 604800, ++ 1800 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "a86d023a30863b7ab86df5846c38f1e8", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12125, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12117" ++ }, ++ { ++ "astId": 8538, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8540, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12117": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/a86d023a30863b7ab86df5846c38f1e8.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/a86d023a30863b7ab86df5846c38f1e8.json +new file mode 100644 +index 0000000..a138a79 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/a86d023a30863b7ab86df5846c38f1e8.json +@@ -0,0 +1,314 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Unpause relaying.\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, 301, '0x4200000000000000000000000000000000000023'));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaopera/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/.chainId b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/.chainId +new file mode 100644 +index 0000000..4a5de23 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/.chainId +@@ -0,0 +1 @@ ++4002 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/BondManager.json +new file mode 100644 +index 0000000..180584f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/BondManager.json +@@ -0,0 +1,151 @@ ++{ ++ "address": "0xa97a909D967B150E27AB58ca6d0cb40B39200Be1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_who", ++ "type": "address" ++ } ++ ], ++ "name": "isCollateralized", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x2497bb82008b76575f8f92cbec20af1573283f1c61cfbfabd093cc979b474e47", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xa97a909D967B150E27AB58ca6d0cb40B39200Be1", ++ "transactionIndex": 0, ++ "gasUsed": "286711", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa000002cdfe92e8326f14a07cf94cccced7fb1b942652761924ccadf2", ++ "transactionHash": "0x2497bb82008b76575f8f92cbec20af1573283f1c61cfbfabd093cc979b474e47", ++ "logs": [], ++ "blockNumber": 9371677, ++ "cumulativeGasUsed": "286711", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "isCollateralized(address)": { ++ "params": { ++ "_who": "Address to check." ++ }, ++ "returns": { ++ "_0": "true if the address is properly collateralized, false otherwise." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "BondManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "isCollateralized(address)": { ++ "notice": "Checks whether a given address is properly collateralized and can perform actions within the system." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/verification/BondManager.sol:BondManager", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/CanonicalTransactionChain.json +new file mode 100644 +index 0000000..cf2d606 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/CanonicalTransactionChain.json +@@ -0,0 +1,770 @@ ++{ ++ "address": "0xE66Bd40BBeC97397758E22858331752f0ecBE02e", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_maxTransactionGasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "QueueBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_startingQueueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_numQueueElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "name": "SequencerBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "TransactionBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_l1TxOrigin", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ }, ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_timestamp", ++ "type": "uint256" ++ } ++ ], ++ "name": "TransactionEnqueued", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "MAX_ROLLUP_TX_SIZE", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "MIN_ROLLUP_TX_GAS", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "appendSequencerBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_gasLimit", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_data", ++ "type": "bytes" ++ } ++ ], ++ "name": "enqueue", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastBlockNumber", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNextQueueIndex", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getNumPendingQueueElements", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "getQueueElement", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "transactionHash", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "timestamp", ++ "type": "uint40" ++ }, ++ { ++ "internalType": "uint40", ++ "name": "blockNumber", ++ "type": "uint40" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.QueueElement", ++ "name": "_element", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getQueueLength", ++ "outputs": [ ++ { ++ "internalType": "uint40", ++ "name": "", ++ "type": "uint40" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxTransactionGasLimit", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x0f80eece7702537f3cd958b71401269bcf597a4b90a5fca49caea33a2f5c967e", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xE66Bd40BBeC97397758E22858331752f0ecBE02e", ++ "transactionIndex": 0, ++ "gasUsed": "1586323", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa0000027a7aae70cfa79bfc392f6971926e2a9204279f80372738681c", ++ "transactionHash": "0x0f80eece7702537f3cd958b71401269bcf597a4b90a5fca49caea33a2f5c967e", ++ "logs": [], ++ "blockNumber": 9371668, ++ "cumulativeGasUsed": "1586323", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ 11000000, ++ 32, ++ 60000 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendSequencerBatch()": { ++ "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "params": { ++ "_data": "Transaction data.", ++ "_gasLimit": "Gas limit for the enqueued L2 transaction.", ++ "_target": "Target L2 contract to send the transaction to." ++ } ++ }, ++ "getLastBlockNumber()": { ++ "returns": { ++ "_0": "Blocknumber for the last transaction." ++ } ++ }, ++ "getLastTimestamp()": { ++ "returns": { ++ "_0": "Timestamp for the last transaction." ++ } ++ }, ++ "getNextQueueIndex()": { ++ "returns": { ++ "_0": "Index for the next queue element." ++ } ++ }, ++ "getNumPendingQueueElements()": { ++ "returns": { ++ "_0": "Number of pending queue elements." ++ } ++ }, ++ "getQueueElement(uint256)": { ++ "params": { ++ "_index": "Index of the queue element to access." ++ }, ++ "returns": { ++ "_element": "Queue element at the given index." ++ } ++ }, ++ "getQueueLength()": { ++ "returns": { ++ "_0": "Length of the queue." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "CanonicalTransactionChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendSequencerBatch()": { ++ "notice": "Allows the sequencer to append a batch of transactions." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "enqueue(address,uint256,bytes)": { ++ "notice": "Adds a transaction to the queue." ++ }, ++ "getLastBlockNumber()": { ++ "notice": "Returns the blocknumber of the last transaction." ++ }, ++ "getLastTimestamp()": { ++ "notice": "Returns the timestamp of the last transaction." ++ }, ++ "getNextQueueIndex()": { ++ "notice": "Returns the index of the next element to be enqueued." ++ }, ++ "getNumPendingQueueElements()": { ++ "notice": "Get the number of queue elements which have not yet been included." ++ }, ++ "getQueueElement(uint256)": { ++ "notice": "Gets the queue element at a particular index." ++ }, ++ "getQueueLength()": { ++ "notice": "Retrieves the length of the queue, including both pending and canonical transactions." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 7264, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueGasCost", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7266, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7268, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7285, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7287, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7291, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11840_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_array(t_struct(QueueElement)11840_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11840_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_struct(QueueElement)11840_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11835, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11837, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11839, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-batches.json +new file mode 100644 +index 0000000..1268a22 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0x524747b1CdCAcA43aF8d9002fA67869A2932d600", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x55d5da275e494506928127c32b33e695f63ebb2a543065487feadf2a74f66089", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x524747b1CdCAcA43aF8d9002fA67869A2932d600", ++ "transactionIndex": 0, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa0000023492ec30df5b1be4cff44d1c5aafa4d68b73be18e28b125a35", ++ "transactionHash": "0x55d5da275e494506928127c32b33e695f63ebb2a543065487feadf2a74f66089", ++ "logs": [], ++ "blockNumber": 9371660, ++ "cumulativeGasUsed": "938127", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..cad579b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xE7Da2a8EBcbBa0Dc6082B8D0faBAcA0176920760", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xfd35d288f3be10b7128f7c4647378a0637fcd434d41d90a1e61f6b503dd48322", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xE7Da2a8EBcbBa0Dc6082B8D0faBAcA0176920760", ++ "transactionIndex": 0, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa00000244f9843b6256a976a3537e080f26d5a304f3bd1f42542ca260", ++ "transactionHash": "0xfd35d288f3be10b7128f7c4647378a0637fcd434d41d90a1e61f6b503dd48322", ++ "logs": [], ++ "blockNumber": 9371662, ++ "cumulativeGasUsed": "938127", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "CanonicalTransactionChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-SCC-batches.json +new file mode 100644 +index 0000000..60870cf +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/ChainStorageContainer-SCC-batches.json +@@ -0,0 +1,391 @@ ++{ ++ "address": "0xAb7d7eFA03204C11E0e141dDE95C022EA2A8c6b1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x3a0b1b60f564fbf7689428e79c4ba309077389417dd47180be14cc566a437747", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xAb7d7eFA03204C11E0e141dDE95C022EA2A8c6b1", ++ "transactionIndex": 0, ++ "gasUsed": "938067", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa0000026a6b3f90d5e4ae735c118b9d1d049601135609dceca47c3b5e", ++ "transactionHash": "0x3a0b1b60f564fbf7689428e79c4ba309077389417dd47180be14cc566a437747", ++ "logs": [], ++ "blockNumber": 9371666, ++ "cumulativeGasUsed": "938067", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "StateCommitmentChain" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8054, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 8057, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)15668_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)15668_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 15663, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 15667, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..9f77a0a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0xD7Cbc979C909d864c38670AcccD57209F7B556e3", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xa800e507f980c6059fb1f18bd9dba319b0d6d9d949e5fd078d7e08fc1a9b7de3", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xD7Cbc979C909d864c38670AcccD57209F7B556e3", ++ "transactionIndex": 0, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa000003d4f166689153983853c7591426326387437ff9323463a3f374", ++ "transactionHash": "0xa800e507f980c6059fb1f18bd9dba319b0d6d9d949e5fd078d7e08fc1a9b7de3", ++ "logs": [], ++ "blockNumber": 9371706, ++ "cumulativeGasUsed": "697858", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Lib_AddressManager.json +new file mode 100644 +index 0000000..7aa6c9e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Lib_AddressManager.json +@@ -0,0 +1,237 @@ ++{ ++ "address": "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "abi": [ ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_newAddress", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "_oldAddress", ++ "type": "address" ++ } ++ ], ++ "name": "AddressSet", ++ "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" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "getAddress", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ }, ++ { ++ "internalType": "address", ++ "name": "_address", ++ "type": "address" ++ } ++ ], ++ "name": "setAddress", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xa27d3fd0ef121c28da90b01ed17e412b10848d5160a9dbb0c3217be1938ec8d0", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "transactionIndex": 0, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000001000000000000000080000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa00000190e78cbb676b5a301211eb1a379bb0e8fdda7330bfafe9ace1", ++ "transactionHash": "0xa27d3fd0ef121c28da90b01ed17e412b10848d5160a9dbb0c3217be1938ec8d0", ++ "logs": [ ++ { ++ "transactionIndex": 0, ++ "blockNumber": 9371642, ++ "transactionHash": "0xa27d3fd0ef121c28da90b01ed17e412b10848d5160a9dbb0c3217be1938ec8d0", ++ "address": "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "topics": [ ++ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x0000000000000000000000004df901607d84183870172c6bb6c44bd9791e9dc1" ++ ], ++ "data": "0x", ++ "logIndex": 0, ++ "blockHash": "0x000022fa00000190e78cbb676b5a301211eb1a379bb0e8fdda7330bfafe9ace1" ++ } ++ ], ++ "blockNumber": 9371642, ++ "cumulativeGasUsed": "454575", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "getAddress(string)": { ++ "params": { ++ "_name": "Name to retrieve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "setAddress(string,address)": { ++ "params": { ++ "_address": "Address to associate with the name.", ++ "_name": "String name to associate an address with." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "Lib_AddressManager", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getAddress(string)": { ++ "notice": "Retrieves the address associated with a given name." ++ }, ++ "setAddress(string,address)": { ++ "notice": "Changes the address associated with a particular name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 405, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_address" ++ }, ++ { ++ "astId": 12044, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "label": "addresses", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_bytes32,t_address)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_bytes32,t_address)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/OVM_L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..7686904 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/OVM_L1CrossDomainMessenger.json +@@ -0,0 +1,808 @@ ++{ ++ "address": "0x1bc8Bd8FCAd96ee663b6325F71F818Cce678083D", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "FailedRelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageAllowed", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "MessageBlocked", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "previousOwner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "OwnershipTransferred", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Paused", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "bytes32", ++ "name": "msgHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "RelayedMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "gasLimit", ++ "type": "uint256" ++ } ++ ], ++ "name": "SentMessage", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "Unpaused", ++ "type": "event" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "allowMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_xDomainCalldataHash", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "blockedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "name": "initialize", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "pause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "paused", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "relayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "relayedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "renounceOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "_sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_queueIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "replayMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_target", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "_message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_gasLimit", ++ "type": "uint32" ++ } ++ ], ++ "name": "sendMessage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "successfulMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "newOwner", ++ "type": "address" ++ } ++ ], ++ "name": "transferOwnership", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "xDomainMessageSender", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x3a350dc2547a72ec8c6b388c1aa1d7a59e10a073584b0076e7d21d9126005842", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x1bc8Bd8FCAd96ee663b6325F71F818Cce678083D", ++ "transactionIndex": 0, ++ "gasUsed": "3403430", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa000002e5a45c26b1c86e985a0563cb1f59b2a828d16d8e3bb73b59c6", ++ "transactionHash": "0x3a350dc2547a72ec8c6b388c1aa1d7a59e10a073584b0076e7d21d9126005842", ++ "logs": [], ++ "blockNumber": 9371680, ++ "cumulativeGasUsed": "3403430", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x1b72a12c13d3c9f198663ae24d74acaa75ae138ca3eac43d69b032c755001655\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n\\n // BOBA is the L2 native token\\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\\n // L1 native token is a ERC20 token on L2\\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\\n 0x4200000000000000000000000000000000000023;\\n\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0x237a55927b080be40dd5c261d65bb5d0aa2a153364a588d7183c40997bbf2265\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to allow." ++ } ++ }, ++ "blockMessage(bytes32)": { ++ "params": { ++ "_xDomainCalldataHash": "Hash of the message to block." ++ } ++ }, ++ "initialize(address)": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "owner()": { ++ "details": "Returns the address of the current owner." ++ }, ++ "paused()": { ++ "details": "Returns true if the contract is paused, and false otherwise." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_messageNonce": "Nonce for the provided message.", ++ "_proof": "Inclusion proof for the given message.", ++ "_sender": "Message sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "renounceOwnership()": { ++ "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "params": { ++ "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", ++ "_queueIndex": "CTC Queue index for the message to replay.", ++ "_sender": "Original sender address.", ++ "_target": "Target contract address." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "params": { ++ "_gasLimit": "Gas limit for the provided message.", ++ "_message": "Message to send to the target.", ++ "_target": "Target contract address." ++ } ++ }, ++ "transferOwnership(address)": { ++ "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." ++ } ++ }, ++ "title": "L1CrossDomainMessenger", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "allowMessage(bytes32)": { ++ "notice": "Allow a message." ++ }, ++ "blockMessage(bytes32)": { ++ "notice": "Block a message." ++ }, ++ "constructor": { ++ "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." ++ }, ++ "pause()": { ++ "notice": "Pause relaying." ++ }, ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { ++ "notice": "Relays a cross domain message to a contract." ++ }, ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { ++ "notice": "Replays a cross domain message to the target messenger." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "sendMessage(address,bytes,uint32)": { ++ "notice": "Sends a cross domain message to the target messenger." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 142, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initialized", ++ "offset": 20, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 145, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_initializing", ++ "offset": 21, ++ "slot": "0", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 396, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_array(t_uint256)50_storage" ++ }, ++ { ++ "astId": 22, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_owner", ++ "offset": 0, ++ "slot": "51", ++ "type": "t_address" ++ }, ++ { ++ "astId": 135, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "52", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 203, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_paused", ++ "offset": 0, ++ "slot": "101", ++ "type": "t_bool" ++ }, ++ { ++ "astId": 294, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "102", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 309, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "_status", ++ "offset": 0, ++ "slot": "151", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 352, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "__gap", ++ "offset": 0, ++ "slot": "152", ++ "type": "t_array(t_uint256)49_storage" ++ }, ++ { ++ "astId": 5253, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "blockedMessages", ++ "offset": 0, ++ "slot": "201", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5257, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "relayedMessages", ++ "offset": 0, ++ "slot": "202", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5261, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "successfulMessages", ++ "offset": 0, ++ "slot": "203", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5265, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "failedMessages", ++ "offset": 0, ++ "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5269, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", ++ "type": "t_address" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_uint256)49_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[49]", ++ "numberOfBytes": "1568" ++ }, ++ "t_array(t_uint256)50_storage": { ++ "base": "t_uint256", ++ "encoding": "inplace", ++ "label": "uint256[50]", ++ "numberOfBytes": "1600" ++ }, ++ "t_bool": { ++ "encoding": "inplace", ++ "label": "bool", ++ "numberOfBytes": "1" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_bytes32,t_bool)": { ++ "encoding": "mapping", ++ "key": "t_bytes32", ++ "label": "mapping(bytes32 => bool)", ++ "numberOfBytes": "32", ++ "value": "t_bool" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..7112ed8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0xEecAD665ca933eeA4a9a2db600E538c1391930d1", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0x52050b51629d26941d2bd1d6699bab16779e200ecddd85e1595dfd913edbffc2", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0xEecAD665ca933eeA4a9a2db600E538c1391930d1", ++ "transactionIndex": 0, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa0000032df9a1d099ab508bbd3bc60afcdb076735718f5590cd05551a", ++ "transactionHash": "0x52050b51629d26941d2bd1d6699bab16779e200ecddd85e1595dfd913edbffc2", ++ "logs": [], ++ "blockNumber": 9371687, ++ "cumulativeGasUsed": "282599", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12156, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 12161, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)12111)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)12111)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)12111" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..d812b0f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xffb6cd7b9d81db0982dc25fca573545ec07d507529bf638c2f4469b0471d19d4", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f", ++ "transactionIndex": 0, ++ "gasUsed": "605560", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa00000368c08a82caf212f924e39e9750339f94c63e28b7fcbb2d058f", ++ "transactionHash": "0xffb6cd7b9d81db0982dc25fca573545ec07d507529bf638c2f4469b0471d19d4", ++ "logs": [], ++ "blockNumber": 9371693, ++ "cumulativeGasUsed": "605560", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x4Df901607d84183870172C6BB6c44BD9791e9DC1" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/README.md b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/README.md +new file mode 100644 +index 0000000..32dfdd0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/README.md +@@ -0,0 +1,293 @@ ++# Bobaopera (public testnet) ++## Network Info ++- **Chain ID**: 4051 ++- **Public RPC**: https://testnet.bobaopera.boba.network ++- **Block Explorer**: https://blockexplorer.testnet.bobaopera.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0xa97a909D967B150E27AB58ca6d0cb40B39200Be1 ++ ++
++CanonicalTransactionChain ++ ++ ++0xE66Bd40BBeC97397758E22858331752f0ecBE02e ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x524747b1CdCAcA43aF8d9002fA67869A2932d600 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0xE7Da2a8EBcbBa0Dc6082B8D0faBAcA0176920760 ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0xAb7d7eFA03204C11E0e141dDE95C022EA2A8c6b1 ++ ++
++L1MultiMessageRelayer ++ ++ ++0xD7Cbc979C909d864c38670AcccD57209F7B556e3 ++ ++
++Lib_AddressManager ++ ++ ++0x12ad9f501149D3FDd703cC10c567F416B7F0af8b ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0xEecAD665ca933eeA4a9a2db600E538c1391930d1 ++ ++
++Proxy__L1StandardBridge ++ ++ ++0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f ++ ++
++StateCommitmentChain ++ ++ ++0x352d964E9aD016f122dc78Afa5164417907E0FaF ++ ++
++TK_L1BOBA ++ ++ ++0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++L2_BOBA ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++L2_L1NativeToken ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/StateCommitmentChain.json +new file mode 100644 +index 0000000..2a573d1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/StateCommitmentChain.json +@@ -0,0 +1,530 @@ ++{ ++ "address": "0x352d964E9aD016f122dc78Afa5164417907E0FaF", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_fraudProofWindow", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_sequencerPublishWindow", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_batchSize", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "_prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes", ++ "name": "_extraData", ++ "type": "bytes" ++ } ++ ], ++ "name": "StateBatchAppended", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "uint256", ++ "name": "_batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "bytes32", ++ "name": "_batchRoot", ++ "type": "bytes32" ++ } ++ ], ++ "name": "StateBatchDeleted", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "FRAUD_PROOF_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "SEQUENCER_PUBLISH_WINDOW", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32[]", ++ "name": "_batch", ++ "type": "bytes32[]" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_shouldStartAtElement", ++ "type": "uint256" ++ } ++ ], ++ "name": "appendStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "batches", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "deleteStateBatch", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getLastSequencerTimestamp", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_lastSequencerTimestamp", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalBatches", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalBatches", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getTotalElements", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_totalElements", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ } ++ ], ++ "name": "insideFraudProofWindow", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "_inside", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_element", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "_batchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "_proof", ++ "type": "tuple" ++ } ++ ], ++ "name": "verifyStateCommitment", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x8d2a0278b45dce5c5b5fe3e2b1f2c6aa8808ccfe260516f68c44a19683859b3b", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x352d964E9aD016f122dc78Afa5164417907E0FaF", ++ "transactionIndex": 0, ++ "gasUsed": "1839462", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa000002baa53dd80cda4ed501b3916428ef089bd40b270b55a41f529f", ++ "transactionHash": "0x8d2a0278b45dce5c5b5fe3e2b1f2c6aa8808ccfe260516f68c44a19683859b3b", ++ "logs": [], ++ "blockNumber": 9371674, ++ "cumulativeGasUsed": "1839462", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", ++ 0, ++ 0 ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "params": { ++ "_batch": "Batch of state roots.", ++ "_shouldStartAtElement": "Index of the element at which this batch should start." ++ } ++ }, ++ "batches()": { ++ "returns": { ++ "_0": "Reference to the batch storage container." ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to start deleting from." ++ } ++ }, ++ "getLastSequencerTimestamp()": { ++ "returns": { ++ "_lastSequencerTimestamp": "Last sequencer batch timestamp." ++ } ++ }, ++ "getTotalBatches()": { ++ "returns": { ++ "_totalBatches": "Total submitted batches." ++ } ++ }, ++ "getTotalElements()": { ++ "returns": { ++ "_totalElements": "Total submitted elements." ++ } ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "params": { ++ "_batchHeader": "Header of the batch to check." ++ }, ++ "returns": { ++ "_inside": "Whether or not the batch is inside the fraud proof window." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "params": { ++ "_batchHeader": "Header of the batch in which the element was included.", ++ "_element": "Hash of the element to verify a proof for.", ++ "_proof": "Merkle inclusion proof for the element." ++ } ++ } ++ }, ++ "title": "StateCommitmentChain", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "appendStateBatch(bytes32[],uint256)": { ++ "notice": "Appends a batch of state roots to the chain." ++ }, ++ "batches()": { ++ "notice": "Accesses the batch storage container." ++ }, ++ "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Deletes all state roots after (and including) a given batch." ++ }, ++ "getLastSequencerTimestamp()": { ++ "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." ++ }, ++ "getTotalBatches()": { ++ "notice": "Retrieves the total number of batches submitted." ++ }, ++ "getTotalElements()": { ++ "notice": "Retrieves the total number of elements submitted." ++ }, ++ "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { ++ "notice": "Checks whether a given batch is still inside its fraud proof window." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { ++ "notice": "Verifies a batch inclusion proof." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 12119, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)12111" ++ }, ++ { ++ "astId": 8532, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "FRAUD_PROOF_WINDOW", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 8534, ++ "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", ++ "label": "SEQUENCER_PUBLISH_WINDOW", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)12111": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/TK_L1BOBA.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/TK_L1BOBA.json +new file mode 100644 +index 0000000..e284d61 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/TK_L1BOBA.json +@@ -0,0 +1,992 @@ ++{ ++ "address": "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x8dbf801bd9aad02a5a2a4ce270bbbf6dd1da41ae2d5f028bb6a82f2224de83c7", ++ "receipt": { ++ "to": null, ++ "from": "0x4Df901607d84183870172C6BB6c44BD9791e9DC1", ++ "contractAddress": "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF", ++ "transactionIndex": 0, ++ "gasUsed": "2278070", ++ "logsBloom": "0x00000000000000000000000080000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000108000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x000022fa000003f6992b762966021f0b9e2f9aced05eceaf95d6546474d4e06d", ++ "transactionHash": "0x8dbf801bd9aad02a5a2a4ce270bbbf6dd1da41ae2d5f028bb6a82f2224de83c7", ++ "logs": [ ++ { ++ "transactionIndex": 0, ++ "blockNumber": 9371710, ++ "transactionHash": "0x8dbf801bd9aad02a5a2a4ce270bbbf6dd1da41ae2d5f028bb6a82f2224de83c7", ++ "address": "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF", ++ "topics": [ ++ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x0000000000000000000000004df901607d84183870172c6bb6c44bd9791e9dc1" ++ ], ++ "data": "0x0000000000000000000000000000000000000000019d971e4fe8401e74000000", ++ "logIndex": 0, ++ "blockHash": "0x000022fa000003f6992b762966021f0b9e2f9aced05eceaf95d6546474d4e06d" ++ } ++ ], ++ "blockNumber": 9371710, ++ "cumulativeGasUsed": "2278070", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "dcdf565a4f7f4cdf231479f0f630b1b7", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getCurrentVotes(address)\":{\"details\":\"Comp version of the {getVotes} accessor, with `uint96` return type.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getPriorVotes(address,uint256)\":{\"details\":\"Comp version of the {getPastVotes} accessor, with `uint96` return type.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Boba Token (BOBA)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"maxSupply()\":{\"notice\":\"Maximum possible number of tokens\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/token/BOBA.sol\":\"BOBA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n uint256 currentAllowance = allowance(account, _msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n unchecked {\\n _approve(account, _msgSender(), currentAllowance - amount);\\n }\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ERC20Votes.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\\n *\\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\\n * {ERC20Votes} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20VotesComp is ERC20Votes {\\n /**\\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n return SafeCast.toUint96(getVotes(account));\\n }\\n\\n /**\\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\\n }\\n\\n /**\\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\\n */\\n function _maxSupply() internal view virtual override returns (uint224) {\\n return type(uint96).max;\\n }\\n}\\n\",\"keccak256\":\"0xa52bdcb6cc115060b6f2900c6c25a1261488f1fcbcebc0554f8ae056422c3884\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"contracts/L1/token/BOBA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\n\\n//Extension of ERC20 to support Compound-like voting and delegation\\n//This extension keeps a history (checkpoints) of each account's vote power.\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\n//Extension of ERC20 to support Compound's voting and delegation\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\\\";\\n\\n//Extension of {ERC20} that allows token holders to destroy both their own\\n//tokens and those that they have an allowance for, in a way that can be\\n//recognized off-chain (via event analysis).\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title Boba Token (BOBA)\\n *\\n */\\n\\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\\n /// @notice Maximum possible number of tokens\\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\\n\\n /// @notice Maximum token supply. Needed to fit the COMP interface.\\n // The math: The classic Comp governance contracts are\\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\\n // Our maxSupply is 5e+26, so we are under the limit\\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\\n return maxSupply;\\n }\\n\\n constructor() ERC20(\\\"Boba Token\\\", \\\"BOBA\\\") ERC20Permit(\\\"Boba Token\\\") {\\n //mint maxSupply at genesis, allocated to deployer\\n _mint(_msgSender(), maxSupply);\\n }\\n\\n // Override required by Solidity because _mint is defined by two base classes\\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._mint(_to, _amount);\\n }\\n\\n // Override required by Solidity because _burn is defined by two base classes\\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._burn(_account, _amount);\\n }\\n\\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20, ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9a47d98fe8ff8b3198368fe140bc3e79ac654cc3bfbceda74e8b3610cc3fe677\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "DOMAIN_SEPARATOR()": { ++ "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." ++ }, ++ "allowance(address,address)": { ++ "details": "See {IERC20-allowance}." ++ }, ++ "approve(address,uint256)": { ++ "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." ++ }, ++ "balanceOf(address)": { ++ "details": "See {IERC20-balanceOf}." ++ }, ++ "burn(uint256)": { ++ "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." ++ }, ++ "burnFrom(address,uint256)": { ++ "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." ++ }, ++ "checkpoints(address,uint32)": { ++ "details": "Get the `pos`-th checkpoint for `account`." ++ }, ++ "decimals()": { ++ "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." ++ }, ++ "decreaseAllowance(address,uint256)": { ++ "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." ++ }, ++ "delegate(address)": { ++ "details": "Delegate votes from the sender to `delegatee`." ++ }, ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "Delegates votes from signer to `delegatee`" ++ }, ++ "delegates(address)": { ++ "details": "Get the address `account` is currently delegating to." ++ }, ++ "getCurrentVotes(address)": { ++ "details": "Comp version of the {getVotes} accessor, with `uint96` return type." ++ }, ++ "getPastTotalSupply(uint256)": { ++ "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPastVotes(address,uint256)": { ++ "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPriorVotes(address,uint256)": { ++ "details": "Comp version of the {getPastVotes} accessor, with `uint96` return type." ++ }, ++ "getVotes(address)": { ++ "details": "Gets the current votes balance for `account`" ++ }, ++ "increaseAllowance(address,uint256)": { ++ "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." ++ }, ++ "name()": { ++ "details": "Returns the name of the token." ++ }, ++ "nonces(address)": { ++ "details": "See {IERC20Permit-nonces}." ++ }, ++ "numCheckpoints(address)": { ++ "details": "Get number of checkpoints for `account`." ++ }, ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "See {IERC20Permit-permit}." ++ }, ++ "symbol()": { ++ "details": "Returns the symbol of the token, usually a shorter version of the name." ++ }, ++ "totalSupply()": { ++ "details": "See {IERC20-totalSupply}." ++ }, ++ "transfer(address,uint256)": { ++ "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." ++ }, ++ "transferFrom(address,address,uint256)": { ++ "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." ++ } ++ }, ++ "title": "Boba Token (BOBA)", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "maxSupply()": { ++ "notice": "Maximum possible number of tokens" ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 517, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_balances", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_uint256)" ++ }, ++ { ++ "astId": 523, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_allowances", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" ++ }, ++ { ++ "astId": 525, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupply", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 527, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_name", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 529, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_symbol", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 1937, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_nonces", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_mapping(t_address,t_struct(Counter)3381_storage)" ++ }, ++ { ++ "astId": 1210, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_delegates", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_mapping(t_address,t_address)" ++ }, ++ { ++ "astId": 1216, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_checkpoints", ++ "offset": 0, ++ "slot": "7", ++ "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)" ++ }, ++ { ++ "astId": 1220, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupplyCheckpoints", ++ "offset": 0, ++ "slot": "8", ++ "type": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_struct(Checkpoint)1201_storage)dyn_storage": { ++ "base": "t_struct(Checkpoint)1201_storage", ++ "encoding": "dynamic_array", ++ "label": "struct ERC20Votes.Checkpoint[]", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_address,t_address)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ }, ++ "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct ERC20Votes.Checkpoint[])", ++ "numberOfBytes": "32", ++ "value": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ }, ++ "t_mapping(t_address,t_mapping(t_address,t_uint256))": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => mapping(address => uint256))", ++ "numberOfBytes": "32", ++ "value": "t_mapping(t_address,t_uint256)" ++ }, ++ "t_mapping(t_address,t_struct(Counter)3381_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct Counters.Counter)", ++ "numberOfBytes": "32", ++ "value": "t_struct(Counter)3381_storage" ++ }, ++ "t_mapping(t_address,t_uint256)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => uint256)", ++ "numberOfBytes": "32", ++ "value": "t_uint256" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Checkpoint)1201_storage": { ++ "encoding": "inplace", ++ "label": "struct ERC20Votes.Checkpoint", ++ "members": [ ++ { ++ "astId": 1198, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "fromBlock", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint32" ++ }, ++ { ++ "astId": 1200, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "votes", ++ "offset": 4, ++ "slot": "0", ++ "type": "t_uint224" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Counter)3381_storage": { ++ "encoding": "inplace", ++ "label": "struct Counters.Counter", ++ "members": [ ++ { ++ "astId": 3380, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_value", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint256" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_uint224": { ++ "encoding": "inplace", ++ "label": "uint224", ++ "numberOfBytes": "28" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint32": { ++ "encoding": "inplace", ++ "label": "uint32", ++ "numberOfBytes": "4" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +similarity index 56% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json +rename to node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +index f39f392..c0a5137 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/8a22f2b322f61ab13865f2d2a82e5f09.json ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/dcdf565a4f7f4cdf231479f0f630b1b7.json +@@ -1,8 +1,32 @@ + { + "language": "Solidity", + "sources": { +- "contracts/L1/deployment/AddressDictator.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\n\n/**\n * @title AddressDictator\n * @dev The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate\n * many different addresses in the AddressManager without transferring ownership of the\n * AddressManager to a hot wallet or hardware wallet.\n */\ncontract AddressDictator {\n /*********\n * Types *\n *********/\n\n struct NamedAddress {\n string name;\n address addr;\n }\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public manager;\n address public finalOwner;\n NamedAddress[] namedAddresses;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _manager Address of the AddressManager contract.\n * @param _finalOwner Address to transfer AddressManager ownership to afterwards.\n * @param _names Array of names to associate an address with.\n * @param _addresses Array of addresses to associate with the name.\n */\n constructor(\n Lib_AddressManager _manager,\n address _finalOwner,\n string[] memory _names,\n address[] memory _addresses\n ) {\n manager = _manager;\n finalOwner = _finalOwner;\n require(\n _names.length == _addresses.length,\n \"AddressDictator: Must provide an equal number of names and addresses.\"\n );\n for (uint256 i = 0; i < _names.length; i++) {\n namedAddresses.push(NamedAddress({ name: _names[i], addr: _addresses[i] }));\n }\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Called to finalize the transfer, this function is callable by anyone, but will only result in\n * an upgrade if this contract is the owner Address Manager.\n */\n function setAddresses() external {\n for (uint256 i = 0; i < namedAddresses.length; i++) {\n manager.setAddress(namedAddresses[i].name, namedAddresses[i].addr);\n }\n // note that this will revert if _finalOwner == currentOwner\n manager.transferOwnership(finalOwner);\n }\n\n /**\n * Transfers ownership of this contract to the finalOwner.\n * Only callable by the Final Owner, which is intended to be our multisig.\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can recover\n * if something really surprising goes wrong.\n */\n function returnOwnership() external {\n require(msg.sender == finalOwner, \"AddressDictator: only callable by finalOwner\");\n manager.transferOwnership(finalOwner);\n }\n\n /******************\n * View Functions *\n ******************/\n\n /**\n * Returns the full namedAddresses array.\n */\n function getNamedAddresses() external view returns (NamedAddress[] memory) {\n return namedAddresses;\n }\n}\n" ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" + }, + "contracts/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +@@ -13,12 +37,6 @@ + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, +- "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, + "contracts/L1/verification/BondManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" + }, +@@ -28,9 +46,6 @@ + "contracts/L1/rollup/StateCommitmentChain.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" + }, +- "contracts/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, + "contracts/libraries/utils/Lib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" + }, +@@ -38,43 +53,28 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" + }, + "contracts/L1/rollup/ICanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" + }, + "contracts/L1/rollup/IChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" + }, +- "contracts/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({ length: _in.length, ptr: ptr });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, \"Invalid RLP list value.\");\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(itemCount < MAX_LIST_LENGTH, \"Provided RLP list exceeds max list length.\");\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\n );\n\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes value.\");\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in) internal pure returns (string memory) {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, \"Invalid RLP bytes32 value.\");\n\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, \"Invalid RLP bytes32 value.\");\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, \"Invalid RLP boolean value.\");\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(out == 0 || out == 1, \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\");\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, \"Invalid RLP address value.\");\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, \"RLP item cannot be null.\");\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, \"Invalid RLP short string.\");\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, \"Invalid RLP long string length.\");\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, \"Invalid RLP long string.\");\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, \"Invalid RLP short list.\");\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, \"Invalid RLP long list length.\");\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, \"Invalid RLP long list.\");\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" +- }, + "contracts/L1/rollup/ChainStorageContainer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" + }, + "contracts/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" + }, + "contracts/test-libraries/utils/TestLib_Buffer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" + }, + "contracts/L1/rollup/CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" + }, + "contracts/standards/AddressAliasHelper.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" + }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/L1/messaging/L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" + }, + "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" +@@ -83,14 +83,11 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" + }, + "contracts/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n\n // BOBA is the L2 native token\n address payable internal constant L2_BOBA = payable(0x4200000000000000000000000000000000000006);\n // L1 native token is a ERC20 token on L2\n address internal constant L1_NATIVE_TOKEN_L2_ADDRESS =\n 0x4200000000000000000000000000000000000023;\n\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" + }, + "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" + }, +- "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" + }, +@@ -100,38 +97,65 @@ + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" ++ }, + "contracts/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, +- "contracts/libraries/bridge/ICrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" + }, +- "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" + }, + "contracts/L2/messaging/L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" + }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, + "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" + }, + "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" + }, + "contracts/L2/messaging/L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable native token and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeNativeTokenWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" + }, + "contracts/L1/messaging/IL1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event ETHDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event NativeTokenDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event NativeTokenWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the native token to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of native token to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" + }, + "contracts/L1/messaging/IL1ERC20Bridge.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" +@@ -142,9 +166,6 @@ + "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" + }, +- "contracts/libraries/bridge/CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, + "contracts/standards/IL2StandardERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" + }, +@@ -154,8 +175,14 @@ + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" + }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.L2_BOBA,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title L2_BOBA\n * @dev The L2 BOBA predeploy provides an ERC20 interface for BOBA deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract L2_BOBA is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1TokenAddress)\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1TokenAddress,\n \"BOBA Network\",\n \"BOBA\",\n 18\n )\n {}\n\n // BOBA features are disabled until further notice.\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"L2_BOBA: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"L2_BOBA: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"L2_BOBA: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ }, + "contracts/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" +@@ -163,50 +190,95 @@ + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, +- "contracts/L2/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(Lib_PredeployAddresses.L2_STANDARD_BRIDGE, address(0), \"Ether\", \"ETH\")\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" + }, +- "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n // solhint-disable max-line-length\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n // solhint-enable max-line-length\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/L2_L1NativeToken.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\ncontract L2_L1NativeToken is IL2StandardERC20, ERC20, ERC20Permit {\n address public l1Token;\n address public l2Bridge;\n uint8 private _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2_L1NativeToken } from \"./L2_L1NativeToken.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 10e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L1 native token token L2 address\n address public secondaryFeeTokenAddress = Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS;\n\n // The maximum price ratio of BOBA and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum price ratio of native token and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of native token and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public secondaryFeeTokenUsers;\n\n // swap fee for the meta transaction\n uint256 public metaTransactionFee = 1e15;\n\n // Received BOBA amount for the swap 2 BOBA\n uint256 public receivedBOBAAmount = 2e18;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n // Decimals of the price ratio\n uint256 public decimals = 0;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBOBAAsFeeToken(address);\n event SwapSecondaryFeeTokenForBOBAMetaTransaction(address);\n event UseSecondaryFeeTokenAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedBOBAAmount(address, uint256);\n event UpdateDecimals(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawSecondaryFeeToken(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive BOBA\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and secondaryFeeToken.\n */\n function initialize(address payable _feeWallet, address _secondaryFeeToken)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _secondaryFeeToken != address(0));\n feeWallet = _feeWallet;\n secondaryFeeTokenAddress = _secondaryFeeToken;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e15;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n decimals = 0;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(address(msg.sender).balance >= 3e18, \"Insufficient BOBA balance\");\n secondaryFeeTokenUsers[msg.sender] = false;\n emit UseBOBAAsFeeToken(msg.sender);\n }\n\n /**\n * Swap native token for BOBA\n */\n function swapSecondaryFeeTokenForBOBAMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 multiplier = 10**decimals;\n uint256 totalCost = receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(\n metaTransactionFee\n );\n require(value >= totalCost, \"Value is not enough\");\n L2_L1NativeToken secondaryFeeToken = L2_L1NativeToken(secondaryFeeTokenAddress);\n secondaryFeeToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(secondaryFeeToken).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedBOBAAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n emit SwapSecondaryFeeTokenForBOBAMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use L1 native token as the fee token\n */\n function useSecondaryFeeTokenAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 l1 native token\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(msg.sender) >= 2e18,\n \"Insufficient secondary fee token balance\"\n );\n secondaryFeeTokenUsers[msg.sender] = true;\n emit UseSecondaryFeeTokenAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of L1 native token and BOBA\n * @param _priceRatio the price ratio of ETL1 native token and BOBA\n * @param _marketPriceRatio tha market price ratio of L1 native token and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of L1 native token and BOBA\n * @param _maxPriceRatio the maximum price ratio of L1 native token and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of L1 native token and BOBA\n * @param _minPriceRatio the minimum price ratio of L1 native token and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received BOBA amount\n * @param _receivedBOBAAmount the received BOBA amount\n */\n function updateReceivedBOBAAmount(uint256 _receivedBOBAAmount) public onlyOwner {\n require(_receivedBOBAAmount > 1e15 && _receivedBOBAAmount < 10e18);\n receivedBOBAAmount = _receivedBOBAAmount;\n emit UpdateReceivedBOBAAmount(owner(), _receivedBOBAAmount);\n }\n\n /**\n * Update the decimal places for price ratio\n * @param _decimals the diciimal places for price ratio\n */\n function updateDecimals(uint256 _decimals) public onlyOwner {\n require(_decimals < 10);\n decimals = _decimals;\n emit UpdateDecimals(owner(), _decimals);\n }\n\n /**\n * Get the price for swapping l1 native token for BOBA\n */\n function getSecondaryFeeTokenForSwap() public view returns (uint256) {\n // marketPriceRatio = native token price / boba price\n uint256 multiplier = 10**decimals;\n return receivedBOBAAmount.mul(marketPriceRatio).div(multiplier).add(metaTransactionFee);\n }\n\n /**\n * Get L1 native token fee for fee estimation\n * @param _txData the data payload\n */\n function getSecondaryFeeTokenFee(bytes memory _txData) public view returns (uint256) {\n uint256 multiplier = 10**decimals;\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData).mul(priceRatio).div(multiplier);\n }\n\n /**\n * withdraw l1 native token from l2 to l1 fee wallet\n */\n function withdrawSecondaryFeeToken() public {\n require(\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)) >=\n MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n secondaryFeeTokenAddress,\n feeWallet,\n L2_L1NativeToken(secondaryFeeTokenAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawSecondaryFeeToken(owner(), feeWallet);\n }\n\n /**\n * withdraw BOBA tokens to l2 fee wallet\n */\n function withdrawBOBA() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send BOBA to fee wallet\");\n emit WithdrawBOBA(owner(), feeWallet);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, +- "contracts/L1/messaging/L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n payable\n onlyInitialized\n {\n require(_addBalanceAmount != 0 && msg.value == _addBalanceAmount, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n (bool sent, ) = owner.call{ value: _withdrawAmount }(\"\");\n require(sent, \"Failed to send BOBA\");\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n }\n}\n" + }, +- "contracts/L2/messaging/L2StandardTokenFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 native token and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of native token to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateNativeTokenDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositNativeTokenTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateNativeTokenDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the nativa token and informing the L2 Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateNativeTokenDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(\n address(0),\n Lib_PredeployAddresses.L1_NATIVE_TOKEN_L2_ADDRESS,\n _from,\n _to,\n msg.value\n );\n\n emit NativeTokenDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeNativeTokenWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferNativeToken: NativeToken transfer failed\");\n\n emit NativeTokenWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /**************************************\n * Temporary - Migrating Native Token *\n **************************************/\n\n /**\n * @dev Adds native token balance to the account. This is meant to allow for native token\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated\n * native token from the old contract\n */\n function donateNativeToken() external payable {}\n}\n" + }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in) public returns (bytes memory _out) {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" + }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other) public pure returns (bool) {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" + }, +- "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" + } + }, + "settings": { +@@ -214,9 +286,14 @@ + "enabled": true, + "runs": 10000 + }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, + "outputSelection": { + "*": { + "*": [ ++ "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", +@@ -224,16 +301,14 @@ + "metadata", + "devdoc", + "userdoc", +- "storageLayout", +- "evm.gasEstimates" ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" + ], + "": [ + "ast" + ] + } +- }, +- "metadata": { +- "useLiteralContent": true + } + } + } +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/bobaoperatestnet/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/.chainId b/node_modules/@eth-optimism/contracts/deployments/goerli/.chainId +new file mode 100644 +index 0000000..7813681 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/.chainId +@@ -0,0 +1 @@ ++5 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/goerli/BondManager.json +index ff4b446..19eb0d8 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/BondManager.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/BondManager.json +@@ -1,5 +1,5 @@ + { +- "address": "0xE5AE60bD6F8DEe4D0c2BC9268e23B92F1cacC58F", ++ "address": "0xF84979ADeb8D2Dd25f54cF8cBbB05C08eC188e11", + "abi": [ + { + "inputs": [ +@@ -64,27 +64,28 @@ + "type": "function" + } + ], +- "transactionHash": "0xc3f584e9da3e38d1e675b07e62d67b05412335a1bd87dd95b1333b85396a8a41", ++ "transactionHash": "0x9e570464eff9817a24fc63fb7083f003940127779dfb6acc97ae0a8a6a6f0ce4", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0xE5AE60bD6F8DEe4D0c2BC9268e23B92F1cacC58F", +- "transactionIndex": 2, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xF84979ADeb8D2Dd25f54cF8cBbB05C08eC188e11", ++ "transactionIndex": 26, + "gasUsed": "286711", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x1aa4d45b8555140ea4acb0e928fb0f46f9b1c5620afaf0140d132c477c31e04e", +- "transactionHash": "0xc3f584e9da3e38d1e675b07e62d67b05412335a1bd87dd95b1333b85396a8a41", ++ "blockHash": "0x250599304742d7be55fd8460254b8726f555c06ad5a3e5881f7655fd060ff93c", ++ "transactionHash": "0x9e570464eff9817a24fc63fb7083f003940127779dfb6acc97ae0a8a6a6f0ce4", + "logs": [], +- "blockNumber": 5619327, +- "cumulativeGasUsed": "412128", ++ "blockNumber": 7867500, ++ "cumulativeGasUsed": "4644164", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D" ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148" + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(\\n address _who\\n )\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0xad408d3e8249a8310f567824cbbd02e8a482df62e7e2125aa93f22aff4204e89\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x2d2aaa860f35146b2f4c06551d84860238b4949129c00782b0fabb4469b328ac\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", + "devdoc": { +@@ -131,16 +132,16 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/verification/BondManager.sol:BondManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + } + ], + "types": { +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/goerli/CanonicalTransactionChain.json +index fbbb007..0ef3332 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/CanonicalTransactionChain.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/CanonicalTransactionChain.json +@@ -1,5 +1,5 @@ + { +- "address": "0x2ebA8c4EfDB39A8Cd8f9eD65c50ec079f7CEBD81", ++ "address": "0x8B0eF5250b5d6EfA877eAc15BBdfbD3C8069242F", + "abi": [ + { + "inputs": [ +@@ -27,6 +27,31 @@ + "stateMutability": "nonpayable", + "type": "constructor" + }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueGasCost", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "enqueueL2GasPrepaid", ++ "type": "uint256" ++ } ++ ], ++ "name": "L2GasParamsUpdated", ++ "type": "event" ++ }, + { + "anonymous": false, + "inputs": [ +@@ -157,45 +182,6 @@ + "name": "TransactionEnqueued", + "type": "event" + }, +- { +- "inputs": [], +- "name": "ENQUEUE_GAS_COST", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "ENQUEUE_L2_GAS_PREPAID", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "L2_GAS_DISCOUNT_DIVISOR", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, + { + "inputs": [], + "name": "MAX_ROLLUP_TX_SIZE", +@@ -265,6 +251,32 @@ + "stateMutability": "nonpayable", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "enqueueGasCost", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "enqueueL2GasPrepaid", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [], + "name": "getLastBlockNumber", +@@ -392,6 +404,19 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "l2GasDiscountDivisor", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [], + "name": "libAddressManager", +@@ -449,34 +474,53 @@ + ], + "stateMutability": "view", + "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_l2GasDiscountDivisor", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "_enqueueGasCost", ++ "type": "uint256" ++ } ++ ], ++ "name": "setGasParams", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" + } + ], +- "transactionHash": "0xff0f98acf7876e1f9b00bf629517a6609b7c3f3fb87e631e7df115129cb17032", ++ "transactionHash": "0x73019d21a7cf455905ae3a34c858ec59f044c5137abcc0615971e2fd2f470fa6", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x2ebA8c4EfDB39A8Cd8f9eD65c50ec079f7CEBD81", +- "transactionIndex": 14, +- "gasUsed": "1591163", ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x8B0eF5250b5d6EfA877eAc15BBdfbD3C8069242F", ++ "transactionIndex": 36, ++ "gasUsed": "1586323", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x27595d8bcaa846c6b0ac51511a0f4f95e455f977a4d0e213dc19fc7ac78a1dce", +- "transactionHash": "0xff0f98acf7876e1f9b00bf629517a6609b7c3f3fb87e631e7df115129cb17032", ++ "blockHash": "0xfb129618e1703debf08b86d167bf51b8c6b07f726cc76801071530aa5e3bdb59", ++ "transactionHash": "0x73019d21a7cf455905ae3a34c858ec59f044c5137abcc0615971e2fd2f470fa6", + "logs": [], +- "blockNumber": 5619320, +- "cumulativeGasUsed": "2311906", ++ "blockNumber": 7867494, ++ "cumulativeGasUsed": "6551370", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", +- 15000000, ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", ++ 11000000, + 32, + 60000 + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENQUEUE_GAS_COST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ENQUEUE_L2_GAS_PREPAID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_GAS_DISCOUNT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\\n uint256 immutable public L2_GAS_DISCOUNT_DIVISOR;\\n uint256 immutable public ENQUEUE_GAS_COST;\\n uint256 immutable public ENQUEUE_L2_GAS_PREPAID;\\n\\n // Encoding-related (all in bytes)\\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n L2_GAS_DISCOUNT_DIVISOR = _l2GasDiscountDivisor;\\n ENQUEUE_GAS_COST = _enqueueGasCost;\\n ENQUEUE_L2_GAS_PREPAID = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n IChainStorageContainer\\n )\\n {\\n return IChainStorageContainer(\\n resolve(\\\"ChainStorageContainer-CTC-batches\\\")\\n );\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n public\\n view\\n returns (\\n IChainStorageContainer\\n )\\n {\\n return IChainStorageContainer(\\n resolve(\\\"ChainStorageContainer-CTC-queue\\\")\\n );\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements,,,) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\\n return nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n public\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n return _getQueueElement(\\n _index,\\n queue()\\n );\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return getQueueLength() - getNextQueueIndex();\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n public\\n view\\n returns (\\n uint40\\n )\\n {\\n return _getQueueLength(\\n queue()\\n );\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external\\n {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n \\\"Transaction gas limit too low to enqueue.\\\"\\n );\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. Therefore, we define 'ENQUEUE_L2_GAS_PREPAID' as a\\n // threshold. If the _gasLimit for the enqueued transaction is above this threshold, then we\\n // 'charge' to user by burning additional L1 gas. Since gas is cheaper on L2 than L1, we\\n // only need to burn a fraction of the provided L1 gas, which is determined by the\\n // L2_GAS_DISCOUNT_DIVISOR.\\n if(_gasLimit > ENQUEUE_L2_GAS_PREPAID) {\\n uint256 gasToConsume = (_gasLimit - ENQUEUE_L2_GAS_PREPAID) / L2_GAS_DISCOUNT_DIVISOR;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n \\\"Insufficient gas for L2 rate limiting burn.\\\"\\n );\\n\\n uint256 i;\\n while(startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n sender,\\n _target,\\n _gasLimit,\\n _data\\n )\\n );\\n\\n bytes32 timestampAndBlockNumber;\\n assembly {\\n timestampAndBlockNumber := timestamp()\\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\\n }\\n\\n IChainStorageContainer queueRef = queue();\\n\\n queueRef.push(transactionHash);\\n queueRef.push(timestampAndBlockNumber);\\n\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2 and subtract 1.\\n uint256 queueIndex = queueRef.length() / 2 - 1;\\n emit TransactionEnqueued(\\n sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch()\\n external\\n {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n \\\"Not enough BatchContexts provided.\\\"\\n );\\n\\n // Take a reference to the queue and its length so we don't have to keep resolving it.\\n // Length isn't going to change during the course of execution, so it's fine to simply\\n // resolve this once at the start. Saves gas.\\n IChainStorageContainer queueRef = queue();\\n uint40 queueLength = _getQueueLength(queueRef);\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // We will sequentially append leaves which are pointers to the queue.\\n // The initial queue index is what is currently in storage.\\n uint40 nextQueueIndex = getNextQueueIndex();\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n\\n }\\n require(\\n nextQueueIndex <= queueLength,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\\n nextQueueIndex - 1,\\n queueRef\\n );\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number-1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(\\n uint256 _index\\n )\\n internal\\n pure\\n returns (\\n BatchContext memory\\n )\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\\n }\\n // solhint-enable max-line-length\\n\\n return (\\n totalElements,\\n nextQueueIndex,\\n lastTimestamp,\\n lastBlockNumber\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIndex Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIndex,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIndex))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function _getQueueElement(\\n uint256 _index,\\n IChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the actual desired queue index\\n // we need to multiply by 2.\\n uint40 trueIndex = uint40(_index * 2);\\n bytes32 transactionHash = _queueRef.get(trueIndex);\\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\\n\\n uint40 elementTimestamp;\\n uint40 elementBlockNumber;\\n // solhint-disable max-line-length\\n assembly {\\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n // solhint-enable max-line-length\\n\\n return Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: elementTimestamp,\\n blockNumber: elementBlockNumber\\n });\\n }\\n\\n /**\\n * Retrieves the length of the queue.\\n * @return Length of the queue.\\n */\\n function _getQueueLength(\\n IChainStorageContainer _queueRef\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n // The underlying queue data structure stores 2 elements\\n // per insertion, so to get the real queue length we need\\n // to divide by 2.\\n return uint40(_queueRef.length() / 2);\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n )\\n internal\\n {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n\\n\\n /**\\n * Hashes a transaction chain element.\\n * @param _element Chain element to hash.\\n * @return Hash of the chain element.\\n */\\n function _hashTransactionChainElement(\\n Lib_OVMCodec.TransactionChainElement memory _element\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _element.isSequenced,\\n _element.queueIndex,\\n _element.timestamp,\\n _element.blockNumber,\\n _element.txData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xaa9103c34dfb1ef15cb3e6de60e51b1e4d4754dfb0c1672367abd926e9610c5f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xb3375bb538efe660c1e0a4af0570442f22d1edfc488c3db08ac24d1c3495d0ef\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x3695142de033228a3c69d440f8454bbfe09ff2a15d1a81c18f0dbc0fef7902b1\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x24ebbbb58707cdd4e4d340efc6440b7ba16851c461b10eec43238e48b4c39283\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x8b43953622efbd36ad86b852012d549412327b3c9e9dbedd8e8513cbe408c03f\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf9f813f7565c40898a4dc55aa8211d740859669bfbe60b438964a4ccc7981476\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xb33f2e5403714ecbcda611b676a746fc47f48f6a05916e8c893c2368758e7a82\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"\\n// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4bee07249549c0c3a33d749a1787fb0262fe0a5aef2627ed78d5fd004102ae87\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x60e06040523480156200001157600080fd5b5060405162001c5238038062001c52833981016040819052620000349162000078565b600080546001600160a01b0319166001600160a01b0386161790556001839055608082905260a08190526200006a8183620000c5565b60c05250620000f392505050565b600080600080608085870312156200008f57600080fd5b84516001600160a01b0381168114620000a757600080fd5b60208601516040870151606090970151919890975090945092505050565b6000816000190483118215151615620000ee57634e487b7160e01b600052601160045260246000fd5b500290565b60805160a05160c051611b1a6200013860003960008181610235015281816105ee015261063c015260006102870152600081816102e201526106180152611b1a6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80637aa63a86116100cd578063cfdf677e11610081578063e10d29ee11610066578063e10d29ee14610314578063e561dddc1461031c578063f722b41a1461032457600080fd5b8063cfdf677e14610304578063d0f893441461030c57600080fd5b80638d38c6c1116100b25780638d38c6c1146102cc578063b8f77005146102d5578063c2cf696f146102dd57600080fd5b80637aa63a86146102bb578063876ed5cb146102c357600080fd5b80635ae6256d116101245780637350d2b6116101095780637350d2b61461028257806378f4b2f2146102a95780637a167a8a146102b357600080fd5b80635ae6256d146102655780636fee07e01461026d57600080fd5b8063378997701161015557806337899770146101ff578063461a44781461021d57806346a8d4db1461023057600080fd5b8063299ca478146101715780632a7f18be146101bb575b600080fd5b6000546101919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101ce6101c93660046115db565b61032c565b604080518251815260208084015164ffffffffff9081169183019190915292820151909216908201526060016101b2565b610207610360565b60405164ffffffffff90911681526020016101b2565b61019161022b3660046116b7565b610374565b6102577f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101b2565b61020761041b565b61028061027b36600461172d565b61042f565b005b6102577f000000000000000000000000000000000000000000000000000000000000000081565b610257620186a081565b6102076109c8565b6102576109dd565b61025761c35081565b61025760015481565b6102076109f8565b6102577f000000000000000000000000000000000000000000000000000000000000000081565b610191610a0f565b610280610a32565b610191610efe565b610257610f3e565b610207610fc5565b604080516060810182526000808252602082018190529181019190915261035a82610355610efe565b610fe1565b92915050565b60008061036b61119c565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cb908590600401611805565b60206040518083038186803b1580156103e357600080fd5b505afa1580156103f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035a919061181f565b60008061042661119c565b95945050505050565b61c350815111156104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600154821115610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104be565b620186a08210156105ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104be565b7f000000000000000000000000000000000000000000000000000000000000000082111561072c5760007f00000000000000000000000000000000000000000000000000000000000000006106617f00000000000000000000000000000000000000000000000000000000000000008561186b565b61066b9190611882565b905060005a9050818111610701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104be565b60005b825a610710908461186b565b10156107285780610720816118bd565b915050610704565b5050505b60003332141561073d575033610756565b5033731111000000000000000000000000000000001111015b60008185858560405160200161076f94939291906118f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090504360281b421760006107b7610efe565b6040517fb298e36b0000000000000000000000000000000000000000000000000000000081526004810185905290915073ffffffffffffffffffffffffffffffffffffffff82169063b298e36b90602401600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b50506040517fb298e36b0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8416925063b298e36b9150602401600060405180830381600087803b1580156108a257600080fd5b505af11580156108b6573d6000803e3d6000fd5b505050506000600160028373ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561090657600080fd5b505afa15801561091a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e919061193f565b6109489190611882565b610952919061186b565b9050808873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58a8a426040516109b693929190611958565b60405180910390a45050505050505050565b6000806109d361119c565b5090949350505050565b6000806109e861119c565b50505064ffffffffff1692915050565b6000610a0a610a05610efe565b611257565b905090565b6000610a0a604051806060016040528060218152602001611aed60219139610374565b60043560d81c60093560e890811c90600c35901c610a4e6109dd565b8364ffffffffff1614610ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104be565b610b216040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610374565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104be565b6000610bed62ffffff83166010611981565b610bf890600f6119be565b905064ffffffffff8116361015610c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104be565b6000610c9b610efe565b90506000610ca882611257565b9050600080610cb56109c8565b9050610ce26040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b8762ffffff168163ffffffff161015610d43576000610d098263ffffffff166112e3565b8051909350839150610d1b90866119d6565b9450826020015184610d2d91906119fe565b9350508080610d3b90611a1e565b915050610ce5565b508364ffffffffff168264ffffffffff161115610e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104be565b6000610e198462ffffff8b16611a42565b63ffffffff169050600080836020015160001415610e4257505060408201516060830151610e71565b6000610e5f610e52600188611a67565b64ffffffffff168a610fe1565b90508060200151925080604001519150505b610e95610e7f60014361186b565b408c62ffffff168564ffffffffff16858561136a565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610ec08487611a67565b84610ec96109dd565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a1505050505050505050505050565b6000610a0a6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610374565b6000610f48610a0f565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0a919061193f565b6000610fcf6109c8565b610fd76109f8565b610a0a9190611a67565b6040805160608101825260008082526020820181905291810182905290611009846002611981565b6040517f9507d39a00000000000000000000000000000000000000000000000000000000815264ffffffffff8216600482015290915060009073ffffffffffffffffffffffffffffffffffffffff851690639507d39a9060240160206040518083038186803b15801561107b57600080fd5b505afa15801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b3919061193f565b9050600073ffffffffffffffffffffffffffffffffffffffff8516639507d39a6110de8560016119fe565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815264ffffffffff909116600482015260240160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061193f565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b60008060008060006111ac610a0f565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f157600080fd5b505afa158015611205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112299190611a85565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600060028273ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156112a157600080fd5b505afa1580156112b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d9919061193f565b61035a9190611882565b61130e6040518060800160405280600081526020016000815260200160008152602001600081525090565b600061131b601084611981565b61132690600f6119be565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000611374610a0f565b905060008061138161119c565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156113da57600080fd5b505afa1580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611412919061193f565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161148f9493929190611ac7565b60405180910390a260006114a282611595565b905060006114dd8360400151866114b991906119fe565b6114c38b876119fe565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561157057600080fd5b505af1158015611584573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016115be9493929190611ac7565b604051602081830303815290604052805190602001209050919050565b6000602082840312156115ed57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561163e5761163e6115f4565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611684576116846115f4565b8160405280935085815286868601111561169d57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156116c957600080fd5b813567ffffffffffffffff8111156116e057600080fd5b8201601f810184136116f157600080fd5b61170084823560208401611623565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461172a57600080fd5b50565b60008060006060848603121561174257600080fd5b833561174d81611708565b925060208401359150604084013567ffffffffffffffff81111561177057600080fd5b8401601f8101861361178157600080fd5b61179086823560208401611623565b9150509250925092565b6000815180845260005b818110156117c0576020818501810151868301820152016117a4565b818111156117d2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611818602083018461179a565b9392505050565b60006020828403121561183157600080fd5b815161181881611708565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561187d5761187d61183c565b500390565b6000826118b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156118ef576118ef61183c565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611935608083018461179a565b9695505050505050565b60006020828403121561195157600080fd5b5051919050565b838152606060208201526000611971606083018561179a565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156119b9576119b961183c565b500290565b600082198211156119d1576119d161183c565b500190565b600063ffffffff8083168185168083038211156119f5576119f561183c565b01949350505050565b600064ffffffffff8083168185168083038211156119f5576119f561183c565b600063ffffffff80831681811415611a3857611a3861183c565b6001019392505050565b600063ffffffff83811690831681811015611a5f57611a5f61183c565b039392505050565b600064ffffffffff83811690831681811015611a5f57611a5f61183c565b600060208284031215611a9757600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461181857600080fd5b848152836020820152826040820152608060608201526000611935608083018461179a56fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c80637aa63a86116100cd578063cfdf677e11610081578063e10d29ee11610066578063e10d29ee14610314578063e561dddc1461031c578063f722b41a1461032457600080fd5b8063cfdf677e14610304578063d0f893441461030c57600080fd5b80638d38c6c1116100b25780638d38c6c1146102cc578063b8f77005146102d5578063c2cf696f146102dd57600080fd5b80637aa63a86146102bb578063876ed5cb146102c357600080fd5b80635ae6256d116101245780637350d2b6116101095780637350d2b61461028257806378f4b2f2146102a95780637a167a8a146102b357600080fd5b80635ae6256d146102655780636fee07e01461026d57600080fd5b8063378997701161015557806337899770146101ff578063461a44781461021d57806346a8d4db1461023057600080fd5b8063299ca478146101715780632a7f18be146101bb575b600080fd5b6000546101919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101ce6101c93660046115db565b61032c565b604080518251815260208084015164ffffffffff9081169183019190915292820151909216908201526060016101b2565b610207610360565b60405164ffffffffff90911681526020016101b2565b61019161022b3660046116b7565b610374565b6102577f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101b2565b61020761041b565b61028061027b36600461172d565b61042f565b005b6102577f000000000000000000000000000000000000000000000000000000000000000081565b610257620186a081565b6102076109c8565b6102576109dd565b61025761c35081565b61025760015481565b6102076109f8565b6102577f000000000000000000000000000000000000000000000000000000000000000081565b610191610a0f565b610280610a32565b610191610efe565b610257610f3e565b610207610fc5565b604080516060810182526000808252602082018190529181019190915261035a82610355610efe565b610fe1565b92915050565b60008061036b61119c565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cb908590600401611805565b60206040518083038186803b1580156103e357600080fd5b505afa1580156103f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035a919061181f565b60008061042661119c565b95945050505050565b61c350815111156104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600154821115610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104be565b620186a08210156105ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104be565b7f000000000000000000000000000000000000000000000000000000000000000082111561072c5760007f00000000000000000000000000000000000000000000000000000000000000006106617f00000000000000000000000000000000000000000000000000000000000000008561186b565b61066b9190611882565b905060005a9050818111610701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104be565b60005b825a610710908461186b565b10156107285780610720816118bd565b915050610704565b5050505b60003332141561073d575033610756565b5033731111000000000000000000000000000000001111015b60008185858560405160200161076f94939291906118f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090504360281b421760006107b7610efe565b6040517fb298e36b0000000000000000000000000000000000000000000000000000000081526004810185905290915073ffffffffffffffffffffffffffffffffffffffff82169063b298e36b90602401600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b50506040517fb298e36b0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8416925063b298e36b9150602401600060405180830381600087803b1580156108a257600080fd5b505af11580156108b6573d6000803e3d6000fd5b505050506000600160028373ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561090657600080fd5b505afa15801561091a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e919061193f565b6109489190611882565b610952919061186b565b9050808873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58a8a426040516109b693929190611958565b60405180910390a45050505050505050565b6000806109d361119c565b5090949350505050565b6000806109e861119c565b50505064ffffffffff1692915050565b6000610a0a610a05610efe565b611257565b905090565b6000610a0a604051806060016040528060218152602001611aed60219139610374565b60043560d81c60093560e890811c90600c35901c610a4e6109dd565b8364ffffffffff1614610ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104be565b610b216040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610374565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104be565b6000610bed62ffffff83166010611981565b610bf890600f6119be565b905064ffffffffff8116361015610c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104be565b6000610c9b610efe565b90506000610ca882611257565b9050600080610cb56109c8565b9050610ce26040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b8762ffffff168163ffffffff161015610d43576000610d098263ffffffff166112e3565b8051909350839150610d1b90866119d6565b9450826020015184610d2d91906119fe565b9350508080610d3b90611a1e565b915050610ce5565b508364ffffffffff168264ffffffffff161115610e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104be565b6000610e198462ffffff8b16611a42565b63ffffffff169050600080836020015160001415610e4257505060408201516060830151610e71565b6000610e5f610e52600188611a67565b64ffffffffff168a610fe1565b90508060200151925080604001519150505b610e95610e7f60014361186b565b408c62ffffff168564ffffffffff16858561136a565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610ec08487611a67565b84610ec96109dd565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a1505050505050505050505050565b6000610a0a6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610374565b6000610f48610a0f565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0a919061193f565b6000610fcf6109c8565b610fd76109f8565b610a0a9190611a67565b6040805160608101825260008082526020820181905291810182905290611009846002611981565b6040517f9507d39a00000000000000000000000000000000000000000000000000000000815264ffffffffff8216600482015290915060009073ffffffffffffffffffffffffffffffffffffffff851690639507d39a9060240160206040518083038186803b15801561107b57600080fd5b505afa15801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b3919061193f565b9050600073ffffffffffffffffffffffffffffffffffffffff8516639507d39a6110de8560016119fe565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815264ffffffffff909116600482015260240160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061193f565b6040805160608101825293845264ffffffffff828116602086015260289290921c9091169083015250949350505050565b60008060008060006111ac610a0f565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f157600080fd5b505afa158015611205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112299190611a85565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b600060028273ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156112a157600080fd5b505afa1580156112b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d9919061193f565b61035a9190611882565b61130e6040518060800160405280600081526020016000815260200160008152602001600081525090565b600061131b601084611981565b61132690600f6119be565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000611374610a0f565b905060008061138161119c565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156113da57600080fd5b505afa1580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611412919061193f565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e826020015183604001518460600151856080015160405161148f9493929190611ac7565b60405180910390a260006114a282611595565b905060006114dd8360400151866114b991906119fe565b6114c38b876119fe565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561157057600080fd5b505af1158015611584573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016115be9493929190611ac7565b604051602081830303815290604052805190602001209050919050565b6000602082840312156115ed57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561163e5761163e6115f4565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611684576116846115f4565b8160405280935085815286868601111561169d57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156116c957600080fd5b813567ffffffffffffffff8111156116e057600080fd5b8201601f810184136116f157600080fd5b61170084823560208401611623565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461172a57600080fd5b50565b60008060006060848603121561174257600080fd5b833561174d81611708565b925060208401359150604084013567ffffffffffffffff81111561177057600080fd5b8401601f8101861361178157600080fd5b61179086823560208401611623565b9150509250925092565b6000815180845260005b818110156117c0576020818501810151868301820152016117a4565b818111156117d2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611818602083018461179a565b9392505050565b60006020828403121561183157600080fd5b815161181881611708565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561187d5761187d61183c565b500390565b6000826118b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156118ef576118ef61183c565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611935608083018461179a565b9695505050505050565b60006020828403121561195157600080fd5b5051919050565b838152606060208201526000611971606083018561179a565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156119b9576119b961183c565b500290565b600082198211156119d1576119d161183c565b500190565b600063ffffffff8083168185168083038211156119f5576119f561183c565b01949350505050565b600064ffffffffff8083168185168083038211156119f5576119f561183c565b600063ffffffff80831681811415611a3857611a3861183c565b6001019392505050565b600063ffffffff83811690831681811015611a5f57611a5f61183c565b039392505050565b600064ffffffffff83811690831681811015611a5f57611a5f61183c565b600060208284031215611a9757600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461181857600080fd5b848152836020820152826040820152608060608201526000611935608083018461179a56fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-queue\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x498d60c544e3baab6d08b8a88f4c2141f7eb01ce1e0d8631ba9d16f3bf90b8f5\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", + "devdoc": { + "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", + "kind": "dev", +@@ -597,6 +641,9 @@ + }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." ++ }, ++ "setGasParams(uint256,uint256)": { ++ "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." + } + }, + "version": 1 +@@ -604,32 +651,119 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 3162, ++ "astId": 7274, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "maxTransactionGasLimit", ++ "label": "enqueueGasCost", + "offset": 0, + "slot": "1", + "type": "t_uint256" ++ }, ++ { ++ "astId": 7276, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "l2GasDiscountDivisor", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7278, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "enqueueL2GasPrepaid", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7295, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "maxTransactionGasLimit", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 7297, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "_nextQueueIndex", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 7301, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "queueElements", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_array(t_struct(QueueElement)11576_storage)dyn_storage" + } + ], + "types": { +- "t_contract(Lib_AddressManager)6564": { ++ "t_array(t_struct(QueueElement)11576_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)11576_storage", ++ "encoding": "dynamic_array", ++ "label": "struct Lib_OVMCodec.QueueElement[]", ++ "numberOfBytes": "32" ++ }, ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, ++ "t_struct(QueueElement)11576_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_OVMCodec.QueueElement", ++ "members": [ ++ { ++ "astId": 11571, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "transactionHash", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 11573, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "timestamp", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_uint40" ++ }, ++ { ++ "astId": 11575, ++ "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", ++ "label": "blockNumber", ++ "offset": 5, ++ "slot": "1", ++ "type": "t_uint40" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" ++ }, ++ "t_uint40": { ++ "encoding": "inplace", ++ "label": "uint40", ++ "numberOfBytes": "5" + } + } + } +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-batches.json +index a62738d..c2e0607 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-batches.json +@@ -1,5 +1,5 @@ + { +- "address": "0x0821Ff73FD88bb73E90F2Ea459B57430dff731Dd", ++ "address": "0x01c9DC8B9c66D61a56Db7bF3F5303Cd9E9c85B1F", + "abi": [ + { + "inputs": [ +@@ -183,28 +183,29 @@ + "type": "function" + } + ], +- "transactionHash": "0x227b0cd47ebbb4e9635bbefffc0b0ce865b21b5d4db845a004bd824979db3df8", ++ "transactionHash": "0x3c351f8bb2df4b156cda2241f1a3613c86d440e9a5850f71d2612b584effd3c9", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x0821Ff73FD88bb73E90F2Ea459B57430dff731Dd", +- "transactionIndex": 2, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x01c9DC8B9c66D61a56Db7bF3F5303Cd9E9c85B1F", ++ "transactionIndex": 38, + "gasUsed": "938127", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xd2e2c40bc1f95b11547ae07cffdfaca7e59ed319cf384500fd08cb3e8ab4c2b2", +- "transactionHash": "0x227b0cd47ebbb4e9635bbefffc0b0ce865b21b5d4db845a004bd824979db3df8", ++ "blockHash": "0x0ee795c657136eb6815fb1125e8b81d3e0c5cceb42f064d3d89c8e6df88f3de6", ++ "transactionHash": "0x3c351f8bb2df4b156cda2241f1a3613c86d440e9a5850f71d2612b584effd3c9", + "logs": [], +- "blockNumber": 5619299, +- "cumulativeGasUsed": "1134464", ++ "blockNumber": 7867486, ++ "cumulativeGasUsed": "7579230", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", + "CanonicalTransactionChain" + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata()\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length()\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbb516c7b46d16bb61c6eb2be6fd08bc03e7d917412510a95e885ac60ecbfd595\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n Buffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n Buffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(\\n Buffer storage _self,\\n BufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n BufferContext memory\\n )\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n // solhint-disable-next-line max-line-length\\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n return BufferContext({\\n length: length,\\n extraData: extraData\\n });\\n }\\n}\\n\",\"keccak256\":\"0xcffbe907b961127ab4a12268b8376d37b3c7b7112170f794c759274472b07c58\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { +@@ -310,15 +311,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 3995, ++ "astId": 8064, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +327,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 3998, ++ "astId": 8067, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10120_storage" ++ "type": "t_struct(Buffer)15404_storage" + } + ], + "types": { +@@ -340,7 +341,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +358,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10120_storage": { ++ "t_struct(Buffer)15404_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10115, ++ "astId": 15399, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +371,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10119, ++ "astId": 15403, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-queue.json +index c11c66f..c635c84 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-queue.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-CTC-queue.json +@@ -1,5 +1,5 @@ + { +- "address": "0xf96dc01589969B85e27017F1bC449CB981eED9C8", ++ "address": "0x42356f071B65FD0FBA2b74566EB1D3634F008CDa", + "abi": [ + { + "inputs": [ +@@ -183,28 +183,29 @@ + "type": "function" + } + ], +- "transactionHash": "0x1efc9eedca643c06907a3c405d9a6d2bda7e2eb4ce502b4932fab1a91f2fa2ab", ++ "transactionHash": "0x8281e9550cbd7c2c0cd0d6e6781f6ed22ba72010fa50cd05a893609a68cad96f", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0xf96dc01589969B85e27017F1bC449CB981eED9C8", +- "transactionIndex": 2, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x42356f071B65FD0FBA2b74566EB1D3634F008CDa", ++ "transactionIndex": 29, + "gasUsed": "938127", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xb6b02be6f53e280fe2c5878afa0eff9c7a39b45a6a1bdd49006d4d59b089a3d9", +- "transactionHash": "0x1efc9eedca643c06907a3c405d9a6d2bda7e2eb4ce502b4932fab1a91f2fa2ab", ++ "blockHash": "0x659eecd190351e7d08b484c8cc55de581ee97c19556534e477c37c94ae56b5ed", ++ "transactionHash": "0x8281e9550cbd7c2c0cd0d6e6781f6ed22ba72010fa50cd05a893609a68cad96f", + "logs": [], +- "blockNumber": 5619303, +- "cumulativeGasUsed": "1005707", ++ "blockNumber": 7867489, ++ "cumulativeGasUsed": "7988809", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", + "CanonicalTransactionChain" + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata()\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length()\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbb516c7b46d16bb61c6eb2be6fd08bc03e7d917412510a95e885ac60ecbfd595\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n Buffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n Buffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(\\n Buffer storage _self,\\n BufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n BufferContext memory\\n )\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n // solhint-disable-next-line max-line-length\\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n return BufferContext({\\n length: length,\\n extraData: extraData\\n });\\n }\\n}\\n\",\"keccak256\":\"0xcffbe907b961127ab4a12268b8376d37b3c7b7112170f794c759274472b07c58\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { +@@ -310,15 +311,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 3995, ++ "astId": 8064, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +327,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 3998, ++ "astId": 8067, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10120_storage" ++ "type": "t_struct(Buffer)15404_storage" + } + ], + "types": { +@@ -340,7 +341,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +358,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10120_storage": { ++ "t_struct(Buffer)15404_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10115, ++ "astId": 15399, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +371,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10119, ++ "astId": 15403, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-SCC-batches.json +index cbd5aec..12be5e4 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-SCC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/ChainStorageContainer-SCC-batches.json +@@ -1,5 +1,5 @@ + { +- "address": "0x829863Ce01B475B7d030539d2181d49E7A4b8aD9", ++ "address": "0xc6B47b2f5DF0C84fa91Ae2bBA733Ee72a6c4830e", + "abi": [ + { + "inputs": [ +@@ -183,28 +183,29 @@ + "type": "function" + } + ], +- "transactionHash": "0xf87b4141ac35d9c3e6ad3632a3eea6fa8d59814fc9d178eeff7f57422c8f66d0", ++ "transactionHash": "0xb61e32f4c7b5c941c69b1b1477e86318ebd2f5410f99f49e26f9710f32bcd574", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x829863Ce01B475B7d030539d2181d49E7A4b8aD9", +- "transactionIndex": 7, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xc6B47b2f5DF0C84fa91Ae2bBA733Ee72a6c4830e", ++ "transactionIndex": 39, + "gasUsed": "938067", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x1a75c17e5584f9ab8b4643430feb7b04aaccd094fda2c751fab992e0d211bd25", +- "transactionHash": "0xf87b4141ac35d9c3e6ad3632a3eea6fa8d59814fc9d178eeff7f57422c8f66d0", ++ "blockHash": "0xf0281d8fa725acaf49d0e2a216bff6326831df9dc727f496903968587a30ab3f", ++ "transactionHash": "0xb61e32f4c7b5c941c69b1b1477e86318ebd2f5410f99f49e26f9710f32bcd574", + "logs": [], +- "blockNumber": 5619312, +- "cumulativeGasUsed": "2224223", ++ "blockNumber": 7867491, ++ "cumulativeGasUsed": "6652984", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", + "StateCommitmentChain" + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _owner\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata()\\n public\\n view\\n returns (\\n bytes27\\n )\\n {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length()\\n public\\n view\\n returns (\\n uint256\\n )\\n {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(\\n uint256 _index\\n )\\n public\\n view\\n returns (\\n bytes32\\n )\\n {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index)\\n );\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(\\n uint40(_index),\\n _globalMetadata\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbb516c7b46d16bb61c6eb2be6fd08bc03e7d917412510a95e885ac60ecbfd595\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping (uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(\\n _value,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(\\n Buffer storage _self,\\n uint256 _index\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(\\n _index < ctx.length,\\n \\\"Index out of bounds.\\\"\\n );\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(\\n _index,\\n ctx.extraData\\n );\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n uint40\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(\\n Buffer storage _self,\\n bytes27 _extraData\\n )\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n bytes27\\n )\\n {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(\\n Buffer storage _self,\\n BufferContext memory _ctx\\n )\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(\\n Buffer storage _self\\n )\\n internal\\n view\\n returns (\\n BufferContext memory\\n )\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n // solhint-disable-next-line max-line-length\\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n }\\n\\n return BufferContext({\\n length: length,\\n extraData: extraData\\n });\\n }\\n}\\n\",\"keccak256\":\"0xcffbe907b961127ab4a12268b8376d37b3c7b7112170f794c759274472b07c58\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0xa28dd5e7d60cf3566d9978ca4f13a938feb233ea1d37668e5b3a5b0c0edf498c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { +@@ -310,15 +311,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 3995, ++ "astId": 8064, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +327,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 3998, ++ "astId": 8067, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10120_storage" ++ "type": "t_struct(Buffer)15404_storage" + } + ], + "types": { +@@ -340,7 +341,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +358,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10120_storage": { ++ "t_struct(Buffer)15404_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10115, ++ "astId": 15399, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +371,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10119, ++ "astId": 15403, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/goerli/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..8265065 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/L1MultiMessageRelayer.json +@@ -0,0 +1,235 @@ ++{ ++ "address": "0xebE42F5cEA2184F6b416bFFAB0744b11281AE95b", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x516315b5cf3aa2288e7314efd6c9f6764f83fe4afdcc9353edf7de19868b38da", ++ "receipt": { ++ "to": null, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xebE42F5cEA2184F6b416bFFAB0744b11281AE95b", ++ "transactionIndex": 83, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x197bac7225acbf86e5ac28a75a30cc72f015098d05675e57e5d8654ecf9aa328", ++ "transactionHash": "0x516315b5cf3aa2288e7314efd6c9f6764f83fe4afdcc9353edf7de19868b38da", ++ "logs": [], ++ "blockNumber": 7867520, ++ "cumulativeGasUsed": "24816727", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve(\\\"L2BatchMessageRelayer\\\"),\\n // solhint-disable-next-line max-line-length\\n \\\"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve(\\\"Proxy__L1CrossDomainMessenger\\\")\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9ed2d2ff6e4e48e3c840c3dc00d0f69679a02645d0d6972aa00b416673d9b51f\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 11855, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)11847" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)11847": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/goerli/Lib_AddressManager.json +index aa8939a..c7cb79e 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/Lib_AddressManager.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/Lib_AddressManager.json +@@ -1,5 +1,5 @@ + { +- "address": "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", ++ "address": "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", + "abi": [ + { + "anonymous": false, +@@ -116,40 +116,41 @@ + "type": "function" + } + ], +- "transactionHash": "0x1397b829d6c6a13fe4ff0d35a2f92a9db88732b872c9d1a7acdf1ff7522e4e7f", ++ "transactionHash": "0xd1f55cd4ed8f7eb8a1d0b30962ced03de9b143e109bde3cbd2813c016d76d655", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", +- "transactionIndex": 1, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", ++ "transactionIndex": 19, + "gasUsed": "454575", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000800004000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000010000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000010000100000002000000000000000000000", +- "blockHash": "0xf018067d848da0091cdd8dade9183ebb68f891c1e2abdc84ba7cb7e3fbc199c3", +- "transactionHash": "0x1397b829d6c6a13fe4ff0d35a2f92a9db88732b872c9d1a7acdf1ff7522e4e7f", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000020001000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000800000000000000000000000004000000000000000000000000000000000000000000000000000000020000000001000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x30b81f4161b386cfcb7d6e02259fe0c3e93ecc29e5be4dad98df31bbb870e0b3", ++ "transactionHash": "0xd1f55cd4ed8f7eb8a1d0b30962ced03de9b143e109bde3cbd2813c016d76d655", + "logs": [ + { +- "transactionIndex": 1, +- "blockNumber": 5619282, +- "transactionHash": "0x1397b829d6c6a13fe4ff0d35a2f92a9db88732b872c9d1a7acdf1ff7522e4e7f", +- "address": "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", ++ "transactionIndex": 19, ++ "blockNumber": 7867474, ++ "transactionHash": "0xd1f55cd4ed8f7eb8a1d0b30962ced03de9b143e109bde3cbd2813c016d76d655", ++ "address": "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", +- "0x0000000000000000000000009c822c992b56a3bd35d16a089d99aec870ef8d37" ++ "0x000000000000000000000000122816e7a7aeb40601d0ac0dcaa8402f7aa4cdfa" + ], + "data": "0x", +- "logIndex": 1, +- "blockHash": "0xf018067d848da0091cdd8dade9183ebb68f891c1e2abdc84ba7cb7e3fbc199c3" ++ "logIndex": 27, ++ "blockHash": "0x30b81f4161b386cfcb7d6e02259fe0c3e93ecc29e5be4dad98df31bbb870e0b3" + } + ], +- "blockNumber": 5619282, +- "cumulativeGasUsed": "506065", ++ "blockNumber": 7867474, ++ "cumulativeGasUsed": "6408052", + "status": 1, + "byzantium": true + }, + "args": [], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", + "devdoc": { +@@ -197,7 +198,7 @@ + "storageLayout": { + "storage": [ + { +- "astId": 393, ++ "astId": 405, + "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "_owner", + "offset": 0, +@@ -205,7 +206,7 @@ + "type": "t_address" + }, + { +- "astId": 6497, ++ "astId": 11780, + "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "addresses", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json +index d841e8e..ff616cc 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/OVM_L1CrossDomainMessenger.json +@@ -1,5 +1,5 @@ + { +- "address": "0xd32718Fdb54e482C5Aa8eb7007cC898d798B3185", ++ "address": "0x6d849602Ed00D3680e1820929B6Bdc86169cbE21", + "abi": [ + { + "inputs": [], +@@ -185,6 +185,25 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -393,7 +412,12 @@ + }, + { + "internalType": "uint32", +- "name": "_gasLimit", ++ "name": "_oldGasLimit", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "_newGasLimit", + "type": "uint32" + } + ], +@@ -476,6 +500,13 @@ + "stateMutability": "nonpayable", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "unpause", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, + { + "inputs": [], + "name": "xDomainMessageSender", +@@ -490,34 +521,35 @@ + "type": "function" + } + ], +- "transactionHash": "0xa86b958f3774331d16abaf6f291cfc82c87178240838b577379c6c3fd1d7d096", ++ "transactionHash": "0x7328db0ad087c0b5d1187dc23aceb70e8d3a94e63a2596be0aa7cd78ff94e563", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0xd32718Fdb54e482C5Aa8eb7007cC898d798B3185", +- "transactionIndex": 6, +- "gasUsed": "3382058", ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x6d849602Ed00D3680e1820929B6Bdc86169cbE21", ++ "transactionIndex": 52, ++ "gasUsed": "3462301", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x2a0008290d127588a7495846af45e36116d3c26fe9b5cf426c65c44770e3f059", +- "transactionHash": "0xa86b958f3774331d16abaf6f291cfc82c87178240838b577379c6c3fd1d7d096", ++ "blockHash": "0xaee18e50e45ba04b48a239c2ef6c89a85e74793d33e11ff88b523231720c8d5d", ++ "transactionHash": "0x7328db0ad087c0b5d1187dc23aceb70e8d3a94e63a2596be0aa7cd78ff94e563", + "logs": [], +- "blockNumber": 5619330, +- "cumulativeGasUsed": "3778569", ++ "blockNumber": 7867502, ++ "cumulativeGasUsed": "9253338", + "status": 1, + "byzantium": true + }, + "args": [], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xff5bc736febcb7057b250c3ac6cf05867ada999bfe1cad25f4da331b38d040ab\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport { OwnableUpgradeable } from\\n \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { PausableUpgradeable } from\\n \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport { ReentrancyGuardUpgradeable } from\\n \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n event MessageAllowed(\\n bytes32 indexed _xDomainCalldataHash\\n );\\n\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping (bytes32 => bool) public blockedMessages;\\n mapping (bytes32 => bool) public relayedMessages;\\n mapping (bytes32 => bool) public successfulMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor()\\n Lib_AddressResolver(address(0))\\n {}\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(\\n address _libAddressManager\\n )\\n public\\n initializer\\n {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause()\\n external\\n onlyOwner\\n {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(\\n bytes32 _xDomainCalldataHash\\n )\\n external\\n onlyOwner\\n {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender()\\n public\\n view\\n returns (\\n address\\n )\\n {\\n require(xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER, \\\"xDomainMessageSender is not set\\\");\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n )\\n public\\n {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce =\\n ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(\\n ovmCanonicalTransactionChain,\\n xDomainCalldata,\\n _gasLimit\\n );\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n )\\n public\\n nonReentrant\\n whenNotPaused\\n {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(\\n xDomainCalldata,\\n _proof\\n ) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(\\n xDomainCalldata,\\n msg.sender,\\n block.number\\n )\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _gasLimit\\n )\\n public\\n {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element =\\n ICanonicalTransactionChain(canonicalTransactionChain).getQueueElement(_queueIndex);\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n )\\n );\\n\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n _sendXDomainMessage(\\n canonicalTransactionChain,\\n xDomainCalldata,\\n _gasLimit\\n );\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return (\\n _verifyStateRootProof(_proof)\\n && _verifyStorageProof(_xDomainCalldata, _proof)\\n );\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (\\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\\n && ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n )\\n );\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n )\\n internal\\n {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x578b79a234e0f454d695c3d7b2d22e6db3b3d27d36b7ce7e4746dcc274fb40f7\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xb3375bb538efe660c1e0a4af0570442f22d1edfc488c3db08ac24d1c3495d0ef\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x32942da3ad8a224fe6214494f4ce3cf8074f8837be114b46dd1a8a93d6e7044d\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit);\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x4f6f0137e068126da50cbdd1180cb9d3831be85692fdf1dc2809af1b9c9a4da9\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0xa5ababb8912c4b18604d4683340632deee4bff0f07386bffc98f865fba4ae73d\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x3695142de033228a3c69d440f8454bbfe09ff2a15d1a81c18f0dbc0fef7902b1\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n\\n}\\n\",\"keccak256\":\"0x16363eb253973e008924bc3d6840b81f919a43d3ff5eea5e8d5aafb28e5cc0b7\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY = 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0xf833adaed5b7dd438bd376ac5504409207d938631bc849da74aac2da5e62b1c8\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x24ebbbb58707cdd4e4d340efc6440b7ba16851c461b10eec43238e48b4c39283\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x8b43953622efbd36ad86b852012d549412327b3c9e9dbedd8e8513cbe408c03f\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n (\\n bool exists,\\n bytes memory value\\n ) = get(_key, _proof, _root);\\n\\n return (\\n exists && Lib_BytesUtils.equal(_value, value)\\n );\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) =\\n _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(\\n exists || isFinalNode,\\n \\\"Provided proof is invalid.\\\"\\n );\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (\\n exists,\\n value\\n );\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n return keccak256(_makeLeafNode(\\n Lib_BytesUtils.toNibbles(_key),\\n _value\\n ).encoded);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid root hash\\\"\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - prefix % 2;\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _newPath\\n )\\n {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) == _getNodeKey(lastNode).length\\n && keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] =\\n _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode =\\n _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch =\\n _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded));\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode =\\n _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\\n newBranch =\\n _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded));\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(\\n TrieNode[] memory _nodes,\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(\\n bytes memory _proof\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _parsed\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(\\n Lib_RLPReader.RLPItem memory _node\\n )\\n private\\n pure\\n returns (\\n bytes32 _nodeID\\n )\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _path\\n )\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _key\\n )\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n bytes memory _value\\n )\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(\\n bytes memory _encoded\\n )\\n private\\n pure\\n returns (\\n bytes memory _hash\\n )\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(\\n TrieNode memory _node\\n )\\n private\\n pure\\n returns (\\n NodeType _type\\n )\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(\\n bytes memory _a,\\n bytes memory _b\\n )\\n private\\n pure\\n returns (\\n uint256 _shared\\n )\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n bytes[] memory _raw\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(\\n Lib_RLPReader.RLPItem[] memory _items\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(\\n TrieNode memory _node,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(\\n bytes memory _key,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode()\\n private\\n pure\\n returns (\\n TrieNode memory _node\\n )\\n {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(\\n TrieNode memory _branch,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n )\\n private\\n pure\\n returns (\\n TrieNode memory _updatedNode\\n )\\n {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(\\n bytes memory _key,\\n bool _isLeaf\\n )\\n private\\n pure\\n returns (\\n bytes memory _prefixedKey\\n )\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(\\n bytes memory _path\\n )\\n private\\n pure\\n returns (\\n bytes memory _unprefixedKey\\n )\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n )\\n private\\n pure\\n returns (\\n TrieNode[] memory _joined\\n )\\n {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0x3406edf5d69154c093b7e8cb8e6d9f2c365ffbe613f62fe5038f55276edbbf2e\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _verified\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n )\\n internal\\n pure\\n returns (\\n bool _exists,\\n bytes memory _value\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(\\n bytes memory _key,\\n bytes memory _value\\n )\\n internal\\n pure\\n returns (\\n bytes32 _updatedRoot\\n )\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(\\n bytes memory _key\\n )\\n private\\n pure\\n returns (\\n bytes memory _secureKey\\n )\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0xb34fef0ab0e762edc490bc19feb82d402f1e37146e99f9ceb33571ab25151aae\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf9f813f7565c40898a4dc55aa8211d740859669bfbe60b438964a4ccc7981476\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xb33f2e5403714ecbcda611b676a746fc47f48f6a05916e8c893c2368758e7a82\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"\\n// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4bee07249549c0c3a33d749a1787fb0262fe0a5aef2627ed78d5fd004102ae87\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x608060405260cc80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c1b806100446000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e3578063706ceab6146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311c565b6102be565b005b61015861014336600461311c565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613294565b61036d565b61018d6101d33660046132f4565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613345565b6105ec565b6101336107d2565b61013361021436600461311c565b610845565b6101336108ec565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311c565b60cb6020526000908152604090205460ff1681565b6101336102703660046133c2565b61095b565b61015861028336600461311c565b60c96020526000908152604090205460ff1681565b6101336102a6366004613528565b610ba8565b6101336102b93660046133c2565b611077565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613676565b905060006104468633878564ffffffffff16611173565b905061045983828663ffffffff166111ee565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136ed565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613740565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613753565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810185905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613770565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007858860405160200161071594939291906137d5565b604051602081830303815290604052805190602001209050816000015181146107a65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b60006107b489898989611173565b90506107c784828763ffffffff166111ee565b505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610843600061128f565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610843611306565b6000547501000000000000000000000000000000000000000000900460ff16806109a0575060005474010000000000000000000000000000000000000000900460ff16155b610a125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b055760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5d6113b8565b610b65611507565b610b6d61162e565b610b75611787565b8015610ba457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c535760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6186868686611173565b9050610c6d81836118db565b1515600114610ce45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d755760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfa5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e386040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610ed95760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3290889061381a565b6000604051808303816000865af19150503d8060008114610f6f576040519150601f19603f3d011682016040523d82523d6000602084013e610f74565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff457600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611020565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103793929190613836565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b6111708161128f565b50565b60608484848460405160240161118c9493929190613888565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112589073420000000000000000000000000000000000000790859087906004016138d2565b600060405180830381600087803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113595760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138e3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fd575060005474010000000000000000000000000000000000000000900460ff16155b61146f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154c575060005474010000000000000000000000000000000000000000900460ff16155b6115be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162557600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d63361128f565b6000547501000000000000000000000000000000000000000000900460ff1680611673575060005474010000000000000000000000000000000000000000900460ff16155b6116e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174c57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cc575060005474010000000000000000000000000000000000000000900460ff16155b61183e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a557600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e6826118fe565b80156118f757506118f78383611aa0565b9392505050565b60008061193f6040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199791600401613944565b60206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190613957565b1580156118f757508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a50939192909190600401613979565b60206040518083038186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f79190613957565b60008083734200000000000000000000000000000000000007604051602001611aca9291906139f1565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5a9060340160408051601f1981840301815291905260608701518751611c84565b9092509050600182151514611bfd5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0882611cad565b9050611c7984604051602001611c2091815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d71565b979650505050505050565b600060606000611c9386611d95565b9050611ca0818686611dc7565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cda83611ea2565b90506040518060800160405280611d0a83600081518110611cfd57611cfd613a3b565b6020026020010151611ed5565b8152602001611d2583600181518110611cfd57611cfd613a3b565b8152602001611d4d83600281518110611d4057611d40613a3b565b6020026020010151611edc565b8152602001611d6883600381518110611d4057611d40613a3b565b90529392505050565b600080611d7d86611d95565b9050611d8b81868686611fde565b9695505050505050565b60608180519060200120604051602001611db191815260200190565b6040516020818303038152906040529050919050565b600060606000611dd685612014565b90506000806000611de8848a8961210f565b81519295509093509150158080611dfc5750815b611e485760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e645760405180602001604052806000815250611e90565b611e9086611e73600188613a99565b81518110611e8357611e83613a3b565b60200260200101516125aa565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d4565b600061055c825b6000602182600001511115611f335760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f41856127d3565b919450925090506000816001811115611f5c57611f5c613ab0565b14611fa95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbb9190613adf565b80519091506020841015611d8b5760208490036101000a90049695505050505050565b6000806000611fee878686611dc7565b91509150818015611c795750805160208083019190912087519188019190912014611c79565b6060600061202183611ea2565b90506000815167ffffffffffffffff81111561203f5761203f613157565b60405190808252806020026020018201604052801561208457816020015b604080518082019091526060808252602082015281526020019060019003908161205d5790505b50905060005b82518110156121075760006120b78483815181106120aa576120aa613a3b565b6020026020010151612b24565b905060405180604001604052808281526020016120d383611ea2565b8152508383815181106120e8576120e8613a3b565b60200260200101819052505080806120ff90613af7565b91505061208a565b509392505050565b6000606081808061211f87612bb4565b90506000869050600080612146604051806040016040528060608152602001606081525090565b60005b8c51811015612566578c818151811061216457612164613a3b565b60200260200101519150828461217a9190613adf565b9350612187600188613adf565b9650836121eb578151805160209091012085146121e65760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a8565b81515160201161224d578151805160209091012085146121e65760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225b8360000151612d37565b146122a85760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b460106001613adf565b826020015151141561232d5785518414156122ce57612566565b60008685815181106122e2576122e2613a3b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230d5761230d613a3b565b6020026020010151905061232081612d5f565b9650600194505050612554565b6002826020015151141561250c57600061234683612d95565b905060008160008151811061235d5761235d613a3b565b016020015160f81c90506000612374600283613b5f565b61237f906002613b81565b90506000612390848360ff16612db9565b9050600061239e8b8a612db9565b905060006123ac8383612def565b905060ff8516600214806123c3575060ff85166003145b15612419578083511480156123d85750808251145b156123ea576123e7818b613adf565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612566945050505050565b60ff8516158061242c575060ff85166001145b1561249e578251811461246857507f80000000000000000000000000000000000000000000000000000000000000009950612566945050505050565b61248f886020015160018151811061248257612482613a3b565b6020026020010151612d5f565b9a509750612554945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255e81613af7565b915050612149565b507f80000000000000000000000000000000000000000000000000000000000000008414866125958786612db9565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c490600190613a99565b815181106120aa576120aa613a3b565b60606000806125e2846127d3565b919350909150600190508160018111156125fe576125fe613ab0565b1461264b5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126645790505090506000835b86518110156127c857602082106127105760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274d6040518060400160405280858c600001516127319190613a99565b8152602001858c602001516127469190613adf565b90526127d3565b5091509150604051806040016040528083836127699190613adf565b8152602001848b6020015161277e9190613adf565b81525085858151811061279357612793613a3b565b60209081029190910101526127a9600185613adf565b93506127b58183613adf565b6127bf9084613adf565b92505050612691565b508152949350505050565b60008060008084600001511161282b5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612850576000600160009450945094505050612b1d565b60b781116128cc576000612865608083613a99565b9050808760000151116128ba5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1d915050565b60bf81116129bb5760006128e160b783613a99565b9050808760000151116129365760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129508183613adf565b88511161299f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129aa826001613adf565b9650945060009350612b1d92505050565b60f78111612a365760006129d060c083613a99565b905080876000015111612a255760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1d915050565b6000612a4360f783613a99565b905080876000015111612a985760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab28183613adf565b885111612b015760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0c826001613adf565b9650945060019350612b1d92505050565b9193909250565b60606000806000612b34856127d3565b919450925090506000816001811115612b4f57612b4f613ab0565b14612b9c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bab85602001518484612e9b565b95945050505050565b6060600082516002612bc69190613ba4565b67ffffffffffffffff811115612bde57612bde613157565b6040519080825280601f01601f191660200182016040528015612c08576020820181803683370190505b50905060005b8351811015612d30576004848281518110612c2b57612c2b613a3b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c60836002613ba4565b81518110612c7057612c70613a3b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb357612cb3613a3b565b0160200151612cc5919060f81c613b5f565b60f81b82612cd4836002613ba4565b612cdf906001613adf565b81518110612cef57612cef613a3b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2881613af7565b915050612c0e565b5092915050565b6000602082511015612d4b57506020015190565b8180602001905181019061055c9190613be1565b60006060602083600001511015612d8057612d7983612f7a565b9050612d8c565b612d8983612b24565b90505b6118f781612d37565b606061055c612db483602001516000815181106120aa576120aa613a3b565b612bb4565b606082518210612dd8575060408051602081019091526000815261055c565b6118f78383848651612dea9190613a99565b612f85565b6000805b808451118015612e035750808351115b8015612e845750828181518110612e1c57612e1c613a3b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5b57612e5b613a3b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f75780612e9381613af7565b915050612df3565b606060008267ffffffffffffffff811115612eb857612eb8613157565b6040519080825280601f01601f191660200182016040528015612ee2576020820181803683370190505b509050805160001415612ef65790506118f7565b6000612f028587613adf565b90506020820160005b612f16602087613bfa565b811015612f4d5782518252612f2c602084613adf565b9250612f39602083613adf565b915080612f4581613af7565b915050612f0b565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613106565b606081612f9381601f613adf565b1015612fe15760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fec8382613adf565b101561303a5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130448284613adf565b845110156130945760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b357604051915060008252602082016040526130fd565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ec5780518352602092830192016130d4565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9b565b60006020828403121561312e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131a9576131a9613157565b60405290565b60405160a0810167ffffffffffffffff811182821017156131a9576131a9613157565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fb576131fb613157565b604052919050565b600067ffffffffffffffff83111561321d5761321d613157565b6132306020601f19601f860116016131d2565b905082815283838301111561324457600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326c57600080fd5b6118f783833560208501613203565b803563ffffffff8116811461328f57600080fd5b919050565b6000806000606084860312156132a957600080fd5b83356132b481613135565b9250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc8682870161325b565b9250506132eb6040850161327b565b90509250925092565b60006020828403121561330657600080fd5b813567ffffffffffffffff81111561331d57600080fd5b8201601f8101841361332e57600080fd5b61333d84823560208401613203565b949350505050565b600080600080600060a0868803121561335d57600080fd5b853561336881613135565b9450602086013561337881613135565b9350604086013567ffffffffffffffff81111561339457600080fd5b6133a08882890161325b565b935050606086013591506133b66080870161327b565b90509295509295909350565b6000602082840312156133d457600080fd5b81356118f781613135565b600060a082840312156133f157600080fd5b60405160a0810167ffffffffffffffff828210818311171561341557613415613157565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561345257600080fd5b5061345f8582860161325b565b6080830152505092915050565b60006040828403121561347e57600080fd5b613486613186565b90508135815260208083013567ffffffffffffffff808211156134a857600080fd5b818501915085601f8301126134bc57600080fd5b8135818111156134ce576134ce613157565b8060051b91506134df8483016131d2565b81815291830184019184810190888411156134f957600080fd5b938501935b83851015613517578435825293850193908501906134fe565b808688015250505050505092915050565b600080600080600060a0868803121561354057600080fd5b853561354b81613135565b9450602086013561355b81613135565b9350604086013567ffffffffffffffff8082111561357857600080fd5b61358489838a0161325b565b94506060880135935060808801359150808211156135a157600080fd5b9087019060a0828a0312156135b557600080fd5b6135bd6131af565b823581526020830135828111156135d357600080fd5b6135df8b8286016133df565b6020830152506040830135828111156135f757600080fd5b6136038b82860161346c565b60408301525060608301358281111561361b57600080fd5b6136278b82860161325b565b60608301525060808301358281111561363f57600080fd5b61364b8b82860161325b565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461328f57600080fd5b60006020828403121561368857600080fd5b6118f782613661565b60005b838110156136ac578181015183820152602001613694565b838111156136bb576000848401525b50505050565b600081518084526136d9816020860160208601613691565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061371c60808301866136c1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f760208301846136c1565b60006020828403121561376557600080fd5b81516118f781613135565b60006060828403121561378257600080fd5b6040516060810181811067ffffffffffffffff821117156137a5576137a5613157565b604052825181526137b860208401613661565b60208201526137c960408401613661565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8b60808301846136c1565b6000825161382c818460208701613691565b9190910192915050565b60008451613848818460208901613691565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138c160808301856136c1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bab60608301846136c1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333d60a08501826136c1565b6020815260006118f76020830184613907565b60006020828403121561396957600080fd5b815180151581146118f757600080fd5b838152600060206060818401526139936060840186613907565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139e357845182529385019360019390930192908501906139c3565b509998505050505050505050565b60008351613a03818460208801613691565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613aab57613aab613a6a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613af257613af2613a6a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2957613b29613a6a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b7257613b72613b30565b8060ff84160691505092915050565b600060ff821660ff841680821015613b9b57613b9b613a6a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bdc57613bdc613a6a565b500290565b600060208284031215613bf357600080fd5b5051919050565b600082613c0957613c09613b30565b50049056fea164736f6c6343000809000a", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e3578063706ceab6146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311c565b6102be565b005b61015861014336600461311c565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613294565b61036d565b61018d6101d33660046132f4565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613345565b6105ec565b6101336107d2565b61013361021436600461311c565b610845565b6101336108ec565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311c565b60cb6020526000908152604090205460ff1681565b6101336102703660046133c2565b61095b565b61015861028336600461311c565b60c96020526000908152604090205460ff1681565b6101336102a6366004613528565b610ba8565b6101336102b93660046133c2565b611077565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613676565b905060006104468633878564ffffffffff16611173565b905061045983828663ffffffff166111ee565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136ed565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613740565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613753565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810185905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613770565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007858860405160200161071594939291906137d5565b604051602081830303815290604052805190602001209050816000015181146107a65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b60006107b489898989611173565b90506107c784828763ffffffff166111ee565b505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610843600061128f565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610843611306565b6000547501000000000000000000000000000000000000000000900460ff16806109a0575060005474010000000000000000000000000000000000000000900460ff16155b610a125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b055760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5d6113b8565b610b65611507565b610b6d61162e565b610b75611787565b8015610ba457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c535760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6186868686611173565b9050610c6d81836118db565b1515600114610ce45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d755760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfa5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e386040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610ed95760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3290889061381a565b6000604051808303816000865af19150503d8060008114610f6f576040519150601f19603f3d011682016040523d82523d6000602084013e610f74565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff457600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611020565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103793929190613836565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b6111708161128f565b50565b60608484848460405160240161118c9493929190613888565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112589073420000000000000000000000000000000000000790859087906004016138d2565b600060405180830381600087803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113595760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138e3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fd575060005474010000000000000000000000000000000000000000900460ff16155b61146f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154c575060005474010000000000000000000000000000000000000000900460ff16155b6115be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162557600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d63361128f565b6000547501000000000000000000000000000000000000000000900460ff1680611673575060005474010000000000000000000000000000000000000000900460ff16155b6116e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174c57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cc575060005474010000000000000000000000000000000000000000900460ff16155b61183e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a557600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e6826118fe565b80156118f757506118f78383611aa0565b9392505050565b60008061193f6040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199791600401613944565b60206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190613957565b1580156118f757508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a50939192909190600401613979565b60206040518083038186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f79190613957565b60008083734200000000000000000000000000000000000007604051602001611aca9291906139f1565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5a9060340160408051601f1981840301815291905260608701518751611c84565b9092509050600182151514611bfd5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0882611cad565b9050611c7984604051602001611c2091815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d71565b979650505050505050565b600060606000611c9386611d95565b9050611ca0818686611dc7565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cda83611ea2565b90506040518060800160405280611d0a83600081518110611cfd57611cfd613a3b565b6020026020010151611ed5565b8152602001611d2583600181518110611cfd57611cfd613a3b565b8152602001611d4d83600281518110611d4057611d40613a3b565b6020026020010151611edc565b8152602001611d6883600381518110611d4057611d40613a3b565b90529392505050565b600080611d7d86611d95565b9050611d8b81868686611fde565b9695505050505050565b60608180519060200120604051602001611db191815260200190565b6040516020818303038152906040529050919050565b600060606000611dd685612014565b90506000806000611de8848a8961210f565b81519295509093509150158080611dfc5750815b611e485760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e645760405180602001604052806000815250611e90565b611e9086611e73600188613a99565b81518110611e8357611e83613a3b565b60200260200101516125aa565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d4565b600061055c825b6000602182600001511115611f335760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f41856127d3565b919450925090506000816001811115611f5c57611f5c613ab0565b14611fa95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbb9190613adf565b80519091506020841015611d8b5760208490036101000a90049695505050505050565b6000806000611fee878686611dc7565b91509150818015611c795750805160208083019190912087519188019190912014611c79565b6060600061202183611ea2565b90506000815167ffffffffffffffff81111561203f5761203f613157565b60405190808252806020026020018201604052801561208457816020015b604080518082019091526060808252602082015281526020019060019003908161205d5790505b50905060005b82518110156121075760006120b78483815181106120aa576120aa613a3b565b6020026020010151612b24565b905060405180604001604052808281526020016120d383611ea2565b8152508383815181106120e8576120e8613a3b565b60200260200101819052505080806120ff90613af7565b91505061208a565b509392505050565b6000606081808061211f87612bb4565b90506000869050600080612146604051806040016040528060608152602001606081525090565b60005b8c51811015612566578c818151811061216457612164613a3b565b60200260200101519150828461217a9190613adf565b9350612187600188613adf565b9650836121eb578151805160209091012085146121e65760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a8565b81515160201161224d578151805160209091012085146121e65760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225b8360000151612d37565b146122a85760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b460106001613adf565b826020015151141561232d5785518414156122ce57612566565b60008685815181106122e2576122e2613a3b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230d5761230d613a3b565b6020026020010151905061232081612d5f565b9650600194505050612554565b6002826020015151141561250c57600061234683612d95565b905060008160008151811061235d5761235d613a3b565b016020015160f81c90506000612374600283613b5f565b61237f906002613b81565b90506000612390848360ff16612db9565b9050600061239e8b8a612db9565b905060006123ac8383612def565b905060ff8516600214806123c3575060ff85166003145b15612419578083511480156123d85750808251145b156123ea576123e7818b613adf565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612566945050505050565b60ff8516158061242c575060ff85166001145b1561249e578251811461246857507f80000000000000000000000000000000000000000000000000000000000000009950612566945050505050565b61248f886020015160018151811061248257612482613a3b565b6020026020010151612d5f565b9a509750612554945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255e81613af7565b915050612149565b507f80000000000000000000000000000000000000000000000000000000000000008414866125958786612db9565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c490600190613a99565b815181106120aa576120aa613a3b565b60606000806125e2846127d3565b919350909150600190508160018111156125fe576125fe613ab0565b1461264b5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126645790505090506000835b86518110156127c857602082106127105760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274d6040518060400160405280858c600001516127319190613a99565b8152602001858c602001516127469190613adf565b90526127d3565b5091509150604051806040016040528083836127699190613adf565b8152602001848b6020015161277e9190613adf565b81525085858151811061279357612793613a3b565b60209081029190910101526127a9600185613adf565b93506127b58183613adf565b6127bf9084613adf565b92505050612691565b508152949350505050565b60008060008084600001511161282b5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612850576000600160009450945094505050612b1d565b60b781116128cc576000612865608083613a99565b9050808760000151116128ba5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1d915050565b60bf81116129bb5760006128e160b783613a99565b9050808760000151116129365760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129508183613adf565b88511161299f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129aa826001613adf565b9650945060009350612b1d92505050565b60f78111612a365760006129d060c083613a99565b905080876000015111612a255760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1d915050565b6000612a4360f783613a99565b905080876000015111612a985760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab28183613adf565b885111612b015760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0c826001613adf565b9650945060019350612b1d92505050565b9193909250565b60606000806000612b34856127d3565b919450925090506000816001811115612b4f57612b4f613ab0565b14612b9c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bab85602001518484612e9b565b95945050505050565b6060600082516002612bc69190613ba4565b67ffffffffffffffff811115612bde57612bde613157565b6040519080825280601f01601f191660200182016040528015612c08576020820181803683370190505b50905060005b8351811015612d30576004848281518110612c2b57612c2b613a3b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c60836002613ba4565b81518110612c7057612c70613a3b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb357612cb3613a3b565b0160200151612cc5919060f81c613b5f565b60f81b82612cd4836002613ba4565b612cdf906001613adf565b81518110612cef57612cef613a3b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2881613af7565b915050612c0e565b5092915050565b6000602082511015612d4b57506020015190565b8180602001905181019061055c9190613be1565b60006060602083600001511015612d8057612d7983612f7a565b9050612d8c565b612d8983612b24565b90505b6118f781612d37565b606061055c612db483602001516000815181106120aa576120aa613a3b565b612bb4565b606082518210612dd8575060408051602081019091526000815261055c565b6118f78383848651612dea9190613a99565b612f85565b6000805b808451118015612e035750808351115b8015612e845750828181518110612e1c57612e1c613a3b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5b57612e5b613a3b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f75780612e9381613af7565b915050612df3565b606060008267ffffffffffffffff811115612eb857612eb8613157565b6040519080825280601f01601f191660200182016040528015612ee2576020820181803683370190505b509050805160001415612ef65790506118f7565b6000612f028587613adf565b90506020820160005b612f16602087613bfa565b811015612f4d5782518252612f2c602084613adf565b9250612f39602083613adf565b915080612f4581613af7565b915050612f0b565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613106565b606081612f9381601f613adf565b1015612fe15760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fec8382613adf565b101561303a5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130448284613adf565b845110156130945760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b357604051915060008252602082016040526130fd565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ec5780518352602092830192016130d4565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9b565b60006020828403121561312e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131a9576131a9613157565b60405290565b60405160a0810167ffffffffffffffff811182821017156131a9576131a9613157565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fb576131fb613157565b604052919050565b600067ffffffffffffffff83111561321d5761321d613157565b6132306020601f19601f860116016131d2565b905082815283838301111561324457600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326c57600080fd5b6118f783833560208501613203565b803563ffffffff8116811461328f57600080fd5b919050565b6000806000606084860312156132a957600080fd5b83356132b481613135565b9250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc8682870161325b565b9250506132eb6040850161327b565b90509250925092565b60006020828403121561330657600080fd5b813567ffffffffffffffff81111561331d57600080fd5b8201601f8101841361332e57600080fd5b61333d84823560208401613203565b949350505050565b600080600080600060a0868803121561335d57600080fd5b853561336881613135565b9450602086013561337881613135565b9350604086013567ffffffffffffffff81111561339457600080fd5b6133a08882890161325b565b935050606086013591506133b66080870161327b565b90509295509295909350565b6000602082840312156133d457600080fd5b81356118f781613135565b600060a082840312156133f157600080fd5b60405160a0810167ffffffffffffffff828210818311171561341557613415613157565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561345257600080fd5b5061345f8582860161325b565b6080830152505092915050565b60006040828403121561347e57600080fd5b613486613186565b90508135815260208083013567ffffffffffffffff808211156134a857600080fd5b818501915085601f8301126134bc57600080fd5b8135818111156134ce576134ce613157565b8060051b91506134df8483016131d2565b81815291830184019184810190888411156134f957600080fd5b938501935b83851015613517578435825293850193908501906134fe565b808688015250505050505092915050565b600080600080600060a0868803121561354057600080fd5b853561354b81613135565b9450602086013561355b81613135565b9350604086013567ffffffffffffffff8082111561357857600080fd5b61358489838a0161325b565b94506060880135935060808801359150808211156135a157600080fd5b9087019060a0828a0312156135b557600080fd5b6135bd6131af565b823581526020830135828111156135d357600080fd5b6135df8b8286016133df565b6020830152506040830135828111156135f757600080fd5b6136038b82860161346c565b60408301525060608301358281111561361b57600080fd5b6136278b82860161325b565b60608301525060808301358281111561363f57600080fd5b61364b8b82860161325b565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461328f57600080fd5b60006020828403121561368857600080fd5b6118f782613661565b60005b838110156136ac578181015183820152602001613694565b838111156136bb576000848401525b50505050565b600081518084526136d9816020860160208601613691565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061371c60808301866136c1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f760208301846136c1565b60006020828403121561376557600080fd5b81516118f781613135565b60006060828403121561378257600080fd5b6040516060810181811067ffffffffffffffff821117156137a5576137a5613157565b604052825181526137b860208401613661565b60208201526137c960408401613661565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8b60808301846136c1565b6000825161382c818460208701613691565b9190910192915050565b60008451613848818460208901613691565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138c160808301856136c1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bab60608301846136c1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333d60a08501826136c1565b6020815260006118f76020830184613907565b60006020828403121561396957600080fd5b815180151581146118f757600080fd5b838152600060206060818401526139936060840186613907565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139e357845182529385019360019390930192908501906139c3565b509998505050505050505050565b60008351613a03818460208801613691565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613aab57613aab613a6a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613af257613af2613a6a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2957613b29613a6a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b7257613b72613b30565b8060ff84160691505092915050565b600060ff821660ff841680821015613b9b57613b9b613a6a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bdc57613bdc613a6a565b500290565b600060208284031215613bf357600080fd5b5051919050565b600082613c0957613c09613b30565b50049056fea164736f6c6343000809000a", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to allow.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"},\"unpause()\":{\"notice\":\"Unpause relaying.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Unpause relaying.\\n */\\n function unpause() external onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to allow.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbbaf0c0c57409c8e2aa3cb4704b75ef9e4f078fb98dc31e3c4d18cfee17a3e0b\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0x4200000000000000000000000000000000000006);\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\\n address internal constant PROXY__BOBA_TURING_PREPAY =\\n 0x4200000000000000000000000000000000000020;\\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\\n address internal constant L2_BOBA = 0x4200000000000000000000000000000000000023;\\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\\n 0x4200000000000000000000000000000000000024;\\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\\n}\\n\",\"keccak256\":\"0xa238bd31f0c11d24a73eb6a27b57c75fafe0dac02f13fab6fdb5a629494b4da4\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613d8f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a", + "devdoc": { + "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", + "kind": "dev", + "methods": { + "allowMessage(bytes32)": { + "params": { +- "_xDomainCalldataHash": "Hash of the message to block." ++ "_xDomainCalldataHash": "Hash of the message to allow." + } + }, + "blockMessage(bytes32)": { +@@ -548,10 +580,11 @@ + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, +- "replayMessage(address,address,bytes,uint256,uint32)": { ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { + "params": { +- "_gasLimit": "Gas limit for the provided message.", + "_message": "Message to send to the target.", ++ "_newGasLimit": "New gas limit to be used for this message.", ++ "_oldGasLimit": "Original gas limit used to send the message.", + "_queueIndex": "CTC Queue index for the message to replay.", + "_sender": "Original sender address.", + "_target": "Target contract address." +@@ -597,7 +630,7 @@ + "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { + "notice": "Relays a cross domain message to a contract." + }, +- "replayMessage(address,address,bytes,uint256,uint32)": { ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": { + "notice": "Replays a cross domain message to the target messenger." + }, + "resolve(string)": { +@@ -605,6 +638,9 @@ + }, + "sendMessage(address,bytes,uint32)": { + "notice": "Sends a cross domain message to the target messenger." ++ }, ++ "unpause()": { ++ "notice": "Unpause relaying." + } + }, + "version": 1 +@@ -612,15 +648,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 130, ++ "astId": 142, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "_initialized", + "offset": 20, +@@ -628,7 +664,7 @@ + "type": "t_bool" + }, + { +- "astId": 133, ++ "astId": 145, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "_initializing", + "offset": 21, +@@ -636,7 +672,7 @@ + "type": "t_bool" + }, + { +- "astId": 384, ++ "astId": 396, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, +@@ -644,7 +680,7 @@ + "type": "t_array(t_uint256)50_storage" + }, + { +- "astId": 10, ++ "astId": 22, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "_owner", + "offset": 0, +@@ -652,7 +688,7 @@ + "type": "t_address" + }, + { +- "astId": 123, ++ "astId": 135, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, +@@ -660,7 +696,7 @@ + "type": "t_array(t_uint256)49_storage" + }, + { +- "astId": 191, ++ "astId": 203, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "_paused", + "offset": 0, +@@ -668,7 +704,7 @@ + "type": "t_bool" + }, + { +- "astId": 282, ++ "astId": 294, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, +@@ -676,7 +712,7 @@ + "type": "t_array(t_uint256)49_storage" + }, + { +- "astId": 297, ++ "astId": 309, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "_status", + "offset": 0, +@@ -684,7 +720,7 @@ + "type": "t_uint256" + }, + { +- "astId": 340, ++ "astId": 352, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "__gap", + "offset": 0, +@@ -692,7 +728,7 @@ + "type": "t_array(t_uint256)49_storage" + }, + { +- "astId": 2141, ++ "astId": 5253, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "blockedMessages", + "offset": 0, +@@ -700,7 +736,7 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2145, ++ "astId": 5257, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "relayedMessages", + "offset": 0, +@@ -708,7 +744,7 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2149, ++ "astId": 5261, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "successfulMessages", + "offset": 0, +@@ -716,11 +752,19 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2153, ++ "astId": 5265, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "xDomainMsgSender", ++ "label": "failedMessages", + "offset": 0, + "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 5269, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", + "type": "t_address" + } + ], +@@ -752,7 +796,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1CrossDomainMessenger.json +new file mode 100644 +index 0000000..007fd1c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1CrossDomainMessenger.json +@@ -0,0 +1,119 @@ ++{ ++ "address": "0xA6fA0867F39f3A3af7433C8A43f23bf26Efd1a48", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_implementationName", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ } ++ ], ++ "transactionHash": "0x6de49a771e7920dcf9496ea466480d9a233f8e53b1811e7bed13957eebf72a67", ++ "receipt": { ++ "to": null, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xA6fA0867F39f3A3af7433C8A43f23bf26Efd1a48", ++ "transactionIndex": 135, ++ "gasUsed": "282599", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x3986c7ce404a83a1e028b8c003d03e18e00590b31f90754d451f77d9ba9d2102", ++ "transactionHash": "0x6de49a771e7920dcf9496ea466480d9a233f8e53b1811e7bed13957eebf72a67", ++ "logs": [], ++ "blockNumber": 7867506, ++ "cumulativeGasUsed": "18546095", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", ++ "OVM_L1CrossDomainMessenger" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping(address => string) private implementationName;\\n mapping(address => Lib_AddressManager) private addressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(address _libAddressManager, string memory _implementationName) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(target != address(0), \\\"Target address must be initialized.\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb7a6f2578fc41872b98d7237b2814ff58cc75cec5d266da52d726a3a479d3375\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_implementationName": "implementationName of the contract to proxy to.", ++ "_libAddressManager": "Address of the Lib_AddressManager." ++ } ++ } ++ }, ++ "title": "Lib_ResolvedDelegateProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": {}, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 11892, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "implementationName", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_string_storage)" ++ }, ++ { ++ "astId": 11897, ++ "contract": "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", ++ "label": "addressManager", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)11847)" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_contract(Lib_AddressManager)11847": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_address,t_contract(Lib_AddressManager)11847)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => contract Lib_AddressManager)", ++ "numberOfBytes": "32", ++ "value": "t_contract(Lib_AddressManager)11847" ++ }, ++ "t_mapping(t_address,t_string_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => string)", ++ "numberOfBytes": "32", ++ "value": "t_string_storage" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1StandardBridge.json +new file mode 100644 +index 0000000..8328acf +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/Proxy__L1StandardBridge.json +@@ -0,0 +1,178 @@ ++{ ++ "address": "0xDBD71249Fe60c9f9bF581b3594734E295EAfA9b2", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "stateMutability": "payable", ++ "type": "fallback" ++ }, ++ { ++ "inputs": [], ++ "name": "getImplementation", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getOwner", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes", ++ "name": "_code", ++ "type": "bytes" ++ } ++ ], ++ "name": "setCode", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_owner", ++ "type": "address" ++ } ++ ], ++ "name": "setOwner", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_key", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "_value", ++ "type": "bytes32" ++ } ++ ], ++ "name": "setStorage", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x8975ec0d69d675d9dd664dff4e235bdffa1eb361aac02af9306226cee7ed756a", ++ "receipt": { ++ "to": null, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xDBD71249Fe60c9f9bF581b3594734E295EAfA9b2", ++ "transactionIndex": 45, ++ "gasUsed": "605560", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0xcfddfe854788ac48ccc8b653cb0c871d85d82984a2d5379a16dee693e12f1adb", ++ "transactionHash": "0x8975ec0d69d675d9dd664dff4e235bdffa1eb361aac02af9306226cee7ed756a", ++ "logs": [], ++ "blockNumber": 7867511, ++ "cumulativeGasUsed": "5714247", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA" ++ ], ++ "numDeployments": 1, ++ "solcInputHash": "f80c23f801040af76e8cbed48c5580f3", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_owner": "Address of the initial contract owner." ++ } ++ }, ++ "getImplementation()": { ++ "returns": { ++ "_0": "Implementation address." ++ } ++ }, ++ "getOwner()": { ++ "returns": { ++ "_0": "Owner address." ++ } ++ }, ++ "setCode(bytes)": { ++ "params": { ++ "_code": "New contract code to run inside this contract." ++ } ++ }, ++ "setOwner(address)": { ++ "params": { ++ "_owner": "New owner of the proxy contract." ++ } ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "params": { ++ "_key": "Storage key to modify.", ++ "_value": "New value for the storage key." ++ } ++ } ++ }, ++ "title": "L1ChugSplashProxy", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "getImplementation()": { ++ "notice": "Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "getOwner()": { ++ "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \"from\" address to address(0)." ++ }, ++ "setCode(bytes)": { ++ "notice": "Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner." ++ }, ++ "setOwner(address)": { ++ "notice": "Changes the owner of the proxy contract. Only callable by the owner." ++ }, ++ "setStorage(bytes32,bytes32)": { ++ "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [], ++ "types": null ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/README.md b/node_modules/@eth-optimism/contracts/deployments/goerli/README.md +new file mode 100644 +index 0000000..4c2c50e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/README.md +@@ -0,0 +1,303 @@ ++# Boba Goerli (public testnet) ++## Network Info ++- **Chain ID**: 2888 ++- **Public RPC**: https://goerli.boba.network ++- **Block Explorer**: https://testnet.bobascan.com ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0xF84979ADeb8D2Dd25f54cF8cBbB05C08eC188e11 ++ ++
++CanonicalTransactionChain ++ ++ ++0x8B0eF5250b5d6EfA877eAc15BBdfbD3C8069242F ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x01c9DC8B9c66D61a56Db7bF3F5303Cd9E9c85B1F ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0x42356f071B65FD0FBA2b74566EB1D3634F008CDa ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0xc6B47b2f5DF0C84fa91Ae2bBA733Ee72a6c4830e ++ ++
++L1MultiMessageRelayer ++ ++ ++0xebE42F5cEA2184F6b416bFFAB0744b11281AE95b ++ ++
++Lib_AddressManager ++ ++ ++0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0xA6fA0867F39f3A3af7433C8A43f23bf26Efd1a48 ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xDBD71249Fe60c9f9bF581b3594734E295EAfA9b2 ++ ++
++StateCommitmentChain ++ ++ ++0x7Bb4cfa36F9F3880e18a46B74bBb9B334F6600F3 ++ ++
++TK_L1BOBA ++ ++ ++0xeCCD355862591CBB4bB7E7dD55072070ee3d0fC1 ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++OVM_ETH ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++WETH9 ++ ++ ++0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000020 ++ ++
++BobaTuringCredit ++ ++ ++0x4200000000000000000000000000000000000021 ++ ++
++BobaTuringHelper ++ ++ ++0x4200000000000000000000000000000000000022 ++ ++
++L2GovernanceERC20 ++ ++ ++0x4200000000000000000000000000000000000023 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000024 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x4200000000000000000000000000000000000025 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/goerli/StateCommitmentChain.json +index 03ab453..9b135cd 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/StateCommitmentChain.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/StateCommitmentChain.json +@@ -1,5 +1,5 @@ + { +- "address": "0x1afcA918eff169eE20fF8AB6Be75f3E872eE1C1A", ++ "address": "0x7Bb4cfa36F9F3880e18a46B74bBb9B334F6600F3", + "abi": [ + { + "inputs": [ +@@ -361,29 +361,30 @@ + "type": "function" + } + ], +- "transactionHash": "0xf3d5f38b12751249b5df4964081c0cda62c7e9ab2194363a7358342ebf8cdd08", ++ "transactionHash": "0xb70fbe22607afe636ca3419ee8ca1ec360e9ed8b173a287ddc9dcd47374fa1be", + "receipt": { + "to": null, +- "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37", +- "contractAddress": "0x1afcA918eff169eE20fF8AB6Be75f3E872eE1C1A", +- "transactionIndex": 3, +- "gasUsed": "1879334", ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0x7Bb4cfa36F9F3880e18a46B74bBb9B334F6600F3", ++ "transactionIndex": 39, ++ "gasUsed": "1839462", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xdb1d138f759c3379c6a60ede7d2b935a70375fab198133f8432ab49a6d4af433", +- "transactionHash": "0xf3d5f38b12751249b5df4964081c0cda62c7e9ab2194363a7358342ebf8cdd08", ++ "blockHash": "0x67eea2581a0c00a207c94d73f2b64ed668acb05df8ab3aae0dc68d6ca5d65557", ++ "transactionHash": "0xb70fbe22607afe636ca3419ee8ca1ec360e9ed8b173a287ddc9dcd47374fa1be", + "logs": [], +- "blockNumber": 5619324, +- "cumulativeGasUsed": "2655440", ++ "blockNumber": 7867498, ++ "cumulativeGasUsed": "5678690", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D", +- 604800, +- 12592000 ++ "0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148", ++ 0, ++ 0 + ], +- "solcInputHash": "0688a9ac0c7cbca876232a3281bda510", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue()\\n external\\n view\\n returns (\\n IChainStorageContainer\\n );\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n Lib_OVMCodec.QueueElement memory _element\\n );\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength()\\n external\\n view\\n returns (\\n uint40\\n );\\n\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n )\\n external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xb3375bb538efe660c1e0a4af0570442f22d1edfc488c3db08ac24d1c3495d0ef\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata()\\n external\\n view\\n returns (\\n bytes27\\n );\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length()\\n external\\n view\\n returns (\\n uint256\\n );\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(\\n bytes32 _object\\n )\\n external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(\\n bytes32 _object,\\n bytes27 _globalMetadata\\n )\\n external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(\\n uint256 _index\\n )\\n external\\n view\\n returns (\\n bytes32\\n );\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index\\n )\\n external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(\\n uint256 _index,\\n bytes27 _globalMetadata\\n )\\n external;\\n}\\n\",\"keccak256\":\"0xf50d8b93a385b40ce4e3a42c97e5431ee148c1abcfd5d7dee48301c76a6aa207\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot\\n );\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements()\\n external\\n view\\n returns (\\n uint256 _totalElements\\n );\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches()\\n external\\n view\\n returns (\\n uint256 _totalBatches\\n );\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n );\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n )\\n external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n external\\n view\\n returns (\\n bool _verified\\n );\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n external\\n view\\n returns (\\n bool _inside\\n );\\n}\\n\",\"keccak256\":\"0x32942da3ad8a224fe6214494f4ce3cf8074f8837be114b46dd1a8a93d6e7044d\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n )\\n Lib_AddressResolver(_libAddressManager)\\n {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches()\\n public\\n view\\n returns (\\n IChainStorageContainer\\n )\\n {\\n return IChainStorageContainer(\\n resolve(\\\"ChainStorageContainer-SCC-batches\\\")\\n );\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements()\\n public\\n view\\n returns (\\n uint256 _totalElements\\n )\\n {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches()\\n public\\n view\\n returns (\\n uint256 _totalBatches\\n )\\n {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n public\\n view\\n returns (\\n uint256 _lastSequencerTimestamp\\n )\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n )\\n public\\n {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(\\n _batch.length > 0,\\n \\\"Cannot submit an empty state batch.\\\"\\n );\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\"))\\n .getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(\\n _batch,\\n abi.encode(block.timestamp, msg.sender)\\n );\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n public\\n {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n )\\n public\\n view\\n returns (\\n bool\\n )\\n {\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n public\\n view\\n returns (\\n bool _inside\\n )\\n {\\n (uint256 timestamp,) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(\\n timestamp != 0,\\n \\\"Batch header timestamp cannot be zero\\\"\\n );\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n }\\n // solhint-enable max-line-length\\n\\n return (\\n totalElements,\\n lastSequencerTimestamp\\n );\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n )\\n internal\\n pure\\n returns (\\n bytes27\\n )\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(\\n bytes32[] memory _batch,\\n bytes memory _extraData\\n )\\n internal\\n {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n \\\"Invalid batch index.\\\"\\n );\\n\\n require(\\n _isValidBatchHeader(_batchHeader),\\n \\\"Invalid batch header.\\\"\\n );\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(\\n uint40(_batchHeader.prevTotalElements),\\n 0\\n )\\n );\\n\\n emit StateBatchDeleted(\\n _batchHeader.batchIndex,\\n _batchHeader.batchRoot\\n );\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n view\\n returns (\\n bool\\n )\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xafe10be36237de21bf53ac7bd808f50c9f65ade0c76d588689b7c2a3a9f6e82b\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(\\n address _who\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x2d2aaa860f35146b2f4c06551d84860238b4949129c00782b0fabb4469b328ac\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(\\n Transaction memory _transaction\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(\\n bytes memory _encoded\\n )\\n internal\\n pure\\n returns (\\n EVMAccount memory\\n )\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x3695142de033228a3c69d440f8454bbfe09ff2a15d1a81c18f0dbc0fef7902b1\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x298ef132f6235a645cbfa41b66a0a5198a81bfda736ccf861a15ca6501a6ef90\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(\\n address _libAddressManager\\n ) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(\\n string memory _name\\n )\\n public\\n view\\n returns (\\n address\\n )\\n {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x63eb1ff905332fbb7df490780d10f303819f141ac0b6f7faf2fda6c83796515a\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 constant internal MAX_LIST_LENGTH = 32;\\n\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem memory\\n )\\n {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({\\n length: _in.length,\\n ptr: ptr\\n });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n (\\n uint256 listOffset,\\n ,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.LIST_ITEM,\\n \\\"Invalid RLP list value.\\\"\\n );\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n \\\"Provided RLP list exceeds max list length.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n ) = _decodeLength(RLPItem({\\n length: _in.length - offset,\\n ptr: _in.ptr + offset\\n }));\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n RLPItem[] memory\\n )\\n {\\n return readList(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes value.\\\"\\n );\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return readBytes(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n string memory\\n )\\n {\\n return readString(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _in.length <= 33,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(\\n itemType == RLPItemType.DATA_ITEM,\\n \\\"Invalid RLP bytes32 value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return readBytes32(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return readUint256(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _in.length == 1,\\n \\\"Invalid RLP boolean value.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\"\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return readBool(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(\\n _in.length == 21,\\n \\\"Invalid RLP address value.\\\"\\n );\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return readAddress(\\n toRLPItem(_in)\\n );\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(\\n RLPItem memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in);\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(\\n _in.length > 0,\\n \\\"RLP item cannot be null.\\\"\\n );\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(\\n _in.length > strLen,\\n \\\"Invalid RLP short string.\\\"\\n );\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(\\n _in.length > lenOfStrLen,\\n \\\"Invalid RLP long string length.\\\"\\n );\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfStrLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfStrLen + strLen,\\n \\\"Invalid RLP long string.\\\"\\n );\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(\\n _in.length > listLen,\\n \\\"Invalid RLP short list.\\\"\\n );\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(\\n _in.length > lenOfListLen,\\n \\\"Invalid RLP long list length.\\\"\\n );\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(\\n mload(add(ptr, 1)),\\n exp(256, sub(32, lenOfListLen))\\n )\\n }\\n\\n require(\\n _in.length > lenOfListLen + listLen,\\n \\\"Invalid RLP long list.\\\"\\n );\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(\\n dest,\\n or(\\n and(mload(src), not(mask)),\\n and(mload(dest), mask)\\n )\\n )\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(\\n RLPItem memory _in\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x24ebbbb58707cdd4e4d340efc6440b7ba16851c461b10eec43238e48b4c39283\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(\\n bytes memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(\\n bytes[] memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(\\n string memory _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(\\n uint256 _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(\\n uint256 _len,\\n uint256 _offset\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for(i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen-i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(\\n uint256 _x\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n )\\n private\\n pure\\n {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for(; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256 ** (32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(\\n bytes[] memory _list\\n )\\n private\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly { flattenedPtr := add(flattened, 0x20) }\\n\\n for(i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly { listPtr := add(item, 0x20)}\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x8b43953622efbd36ad86b852012d549412327b3c9e9dbedd8e8513cbe408c03f\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(\\n bool _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(\\n bytes32 _in\\n )\\n internal\\n pure\\n returns (\\n address\\n )\\n {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(\\n address _in\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf9f813f7565c40898a4dc55aa8211d740859669bfbe60b438964a4ccc7981476\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n uint256\\n )\\n {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(\\n bytes memory _bytes\\n )\\n internal\\n pure\\n returns (\\n bytes memory\\n )\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(\\n bytes memory _bytes,\\n bytes memory _other\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xb33f2e5403714ecbcda611b676a746fc47f48f6a05916e8c893c2368758e7a82\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(\\n bytes32[] memory _elements\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n require(\\n _elements.length > 0,\\n \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\"\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i) ];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling )\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n )\\n internal\\n pure\\n returns (\\n bool\\n )\\n {\\n require(\\n _totalLeaves > 0,\\n \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\"\\n );\\n\\n require(\\n _index < _totalLeaves,\\n \\\"Lib_MerkleTree: Index out of bounds.\\\"\\n );\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n _siblings[i],\\n computedRoot\\n )\\n );\\n } else {\\n computedRoot = keccak256(\\n abi.encodePacked(\\n computedRoot,\\n _siblings[i]\\n )\\n );\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(\\n uint256 _in\\n )\\n private\\n pure\\n returns (\\n uint256\\n )\\n {\\n require(\\n _in > 0,\\n \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\"\\n );\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (uint(1) << i) - 1 << i != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x410dd471d91f64242e1cdb2aad39de8d9e9a3af5810e4b0feb3b3ce90b15ccc5\",\"license\":\"MIT\"}},\"version\":1}", ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x3627ecf85bfcef0c6af5689c720add609be794898e190f176f419eafab46069b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", + "devdoc": { +@@ -489,15 +490,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6572, ++ "astId": 11855, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6564" ++ "type": "t_contract(Lib_AddressManager)11847" + }, + { +- "astId": 4457, ++ "astId": 8542, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "FRAUD_PROOF_WINDOW", + "offset": 0, +@@ -505,7 +506,7 @@ + "type": "t_uint256" + }, + { +- "astId": 4459, ++ "astId": 8544, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "SEQUENCER_PUBLISH_WINDOW", + "offset": 0, +@@ -514,7 +515,7 @@ + } + ], + "types": { +- "t_contract(Lib_AddressManager)6564": { ++ "t_contract(Lib_AddressManager)11847": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/TK_L1BOBA.json b/node_modules/@eth-optimism/contracts/deployments/goerli/TK_L1BOBA.json +new file mode 100644 +index 0000000..ec99840 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/TK_L1BOBA.json +@@ -0,0 +1,992 @@ ++{ ++ "address": "0xeCCD355862591CBB4bB7E7dD55072070ee3d0fC1", ++ "abi": [ ++ { ++ "inputs": [], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Approval", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegator", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "fromDelegate", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "toDelegate", ++ "type": "address" ++ } ++ ], ++ "name": "DelegateChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "delegate", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "previousBalance", ++ "type": "uint256" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "newBalance", ++ "type": "uint256" ++ } ++ ], ++ "name": "DelegateVotesChanged", ++ "type": "event" ++ }, ++ { ++ "anonymous": false, ++ "inputs": [ ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "from", ++ "type": "address" ++ }, ++ { ++ "indexed": true, ++ "internalType": "address", ++ "name": "to", ++ "type": "address" ++ }, ++ { ++ "indexed": false, ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ } ++ ], ++ "name": "Transfer", ++ "type": "event" ++ }, ++ { ++ "inputs": [], ++ "name": "DOMAIN_SEPARATOR", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ } ++ ], ++ "name": "allowance", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "approve", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "balanceOf", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burn", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "burnFrom", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint32", ++ "name": "pos", ++ "type": "uint32" ++ } ++ ], ++ "name": "checkpoints", ++ "outputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "uint32", ++ "name": "fromBlock", ++ "type": "uint32" ++ }, ++ { ++ "internalType": "uint224", ++ "name": "votes", ++ "type": "uint224" ++ } ++ ], ++ "internalType": "struct ERC20Votes.Checkpoint", ++ "name": "", ++ "type": "tuple" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "decimals", ++ "outputs": [ ++ { ++ "internalType": "uint8", ++ "name": "", ++ "type": "uint8" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "subtractedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "decreaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ } ++ ], ++ "name": "delegate", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "delegatee", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "nonce", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "expiry", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "delegateBySig", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "delegates", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getCurrentVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastTotalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPastVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "blockNumber", ++ "type": "uint256" ++ } ++ ], ++ "name": "getPriorVotes", ++ "outputs": [ ++ { ++ "internalType": "uint96", ++ "name": "", ++ "type": "uint96" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "getVotes", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "addedValue", ++ "type": "uint256" ++ } ++ ], ++ "name": "increaseAllowance", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "maxSupply", ++ "outputs": [ ++ { ++ "internalType": "uint224", ++ "name": "", ++ "type": "uint224" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "name", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ } ++ ], ++ "name": "nonces", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "account", ++ "type": "address" ++ } ++ ], ++ "name": "numCheckpoints", ++ "outputs": [ ++ { ++ "internalType": "uint32", ++ "name": "", ++ "type": "uint32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "owner", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "spender", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "value", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "deadline", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint8", ++ "name": "v", ++ "type": "uint8" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "r", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "s", ++ "type": "bytes32" ++ } ++ ], ++ "name": "permit", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "symbol", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "totalSupply", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transfer", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "recipient", ++ "type": "address" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "amount", ++ "type": "uint256" ++ } ++ ], ++ "name": "transferFrom", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0xf98d99c941bf2de143f19f29385f80db4f8b42644dc1b54a7f78347814898455", ++ "receipt": { ++ "to": null, ++ "from": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA", ++ "contractAddress": "0xeCCD355862591CBB4bB7E7dD55072070ee3d0fC1", ++ "transactionIndex": 48, ++ "gasUsed": "2278070", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000800000000000000000000000000002000000000000008000000000000000000000000000000000000020000000001000000000000000000000000000000000000000000000800000000000", ++ "blockHash": "0xa6a9b460ae14aa011d950b95e12cced1ba49574859cfb730f3d51cfe67460b7d", ++ "transactionHash": "0xf98d99c941bf2de143f19f29385f80db4f8b42644dc1b54a7f78347814898455", ++ "logs": [ ++ { ++ "transactionIndex": 48, ++ "blockNumber": 7867522, ++ "transactionHash": "0xf98d99c941bf2de143f19f29385f80db4f8b42644dc1b54a7f78347814898455", ++ "address": "0xeCCD355862591CBB4bB7E7dD55072070ee3d0fC1", ++ "topics": [ ++ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ++ "0x0000000000000000000000000000000000000000000000000000000000000000", ++ "0x000000000000000000000000122816e7a7aeb40601d0ac0dcaa8402f7aa4cdfa" ++ ], ++ "data": "0x0000000000000000000000000000000000000000019d971e4fe8401e74000000", ++ "logIndex": 165, ++ "blockHash": "0xa6a9b460ae14aa011d950b95e12cced1ba49574859cfb730f3d51cfe67460b7d" ++ } ++ ], ++ "blockNumber": 7867522, ++ "cumulativeGasUsed": "13397987", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [], ++ "numDeployments": 1, ++ "solcInputHash": "676a83a35bfb22990db72e41039dc582", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getCurrentVotes(address)\":{\"details\":\"Comp version of the {getVotes} accessor, with `uint96` return type.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getPriorVotes(address,uint256)\":{\"details\":\"Comp version of the {getPastVotes} accessor, with `uint96` return type.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Boba Token (BOBA)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"maxSupply()\":{\"notice\":\"Maximum possible number of tokens\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/token/BOBA.sol\":\"BOBA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n uint256 currentAllowance = allowance(account, _msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n unchecked {\\n _approve(account, _msgSender(), currentAllowance - amount);\\n }\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ERC20Votes.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\\n *\\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\\n * {ERC20Votes} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20VotesComp is ERC20Votes {\\n /**\\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n return SafeCast.toUint96(getVotes(account));\\n }\\n\\n /**\\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\\n }\\n\\n /**\\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\\n */\\n function _maxSupply() internal view virtual override returns (uint224) {\\n return type(uint96).max;\\n }\\n}\\n\",\"keccak256\":\"0xa52bdcb6cc115060b6f2900c6c25a1261488f1fcbcebc0554f8ae056422c3884\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"contracts/L1/token/BOBA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\n\\n//Extension of ERC20 to support Compound-like voting and delegation\\n//This extension keeps a history (checkpoints) of each account's vote power.\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\n//Extension of ERC20 to support Compound's voting and delegation\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\\\";\\n\\n//Extension of {ERC20} that allows token holders to destroy both their own\\n//tokens and those that they have an allowance for, in a way that can be\\n//recognized off-chain (via event analysis).\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title Boba Token (BOBA)\\n *\\n */\\n\\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\\n /// @notice Maximum possible number of tokens\\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\\n\\n /// @notice Maximum token supply. Needed to fit the COMP interface.\\n // The math: The classic Comp governance contracts are\\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\\n // Our maxSupply is 5e+26, so we are under the limit\\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\\n return maxSupply;\\n }\\n\\n constructor() ERC20(\\\"Boba Token\\\", \\\"BOBA\\\") ERC20Permit(\\\"Boba Token\\\") {\\n //mint maxSupply at genesis, allocated to deployer\\n _mint(_msgSender(), maxSupply);\\n }\\n\\n // Override required by Solidity because _mint is defined by two base classes\\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._mint(_to, _amount);\\n }\\n\\n // Override required by Solidity because _burn is defined by two base classes\\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\\n super._burn(_account, _amount);\\n }\\n\\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20, ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9a47d98fe8ff8b3198368fe140bc3e79ac654cc3bfbceda74e8b3610cc3fe677\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ "devdoc": { ++ "kind": "dev", ++ "methods": { ++ "DOMAIN_SEPARATOR()": { ++ "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." ++ }, ++ "allowance(address,address)": { ++ "details": "See {IERC20-allowance}." ++ }, ++ "approve(address,uint256)": { ++ "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." ++ }, ++ "balanceOf(address)": { ++ "details": "See {IERC20-balanceOf}." ++ }, ++ "burn(uint256)": { ++ "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." ++ }, ++ "burnFrom(address,uint256)": { ++ "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." ++ }, ++ "checkpoints(address,uint32)": { ++ "details": "Get the `pos`-th checkpoint for `account`." ++ }, ++ "decimals()": { ++ "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." ++ }, ++ "decreaseAllowance(address,uint256)": { ++ "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." ++ }, ++ "delegate(address)": { ++ "details": "Delegate votes from the sender to `delegatee`." ++ }, ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "Delegates votes from signer to `delegatee`" ++ }, ++ "delegates(address)": { ++ "details": "Get the address `account` is currently delegating to." ++ }, ++ "getCurrentVotes(address)": { ++ "details": "Comp version of the {getVotes} accessor, with `uint96` return type." ++ }, ++ "getPastTotalSupply(uint256)": { ++ "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPastVotes(address,uint256)": { ++ "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" ++ }, ++ "getPriorVotes(address,uint256)": { ++ "details": "Comp version of the {getPastVotes} accessor, with `uint96` return type." ++ }, ++ "getVotes(address)": { ++ "details": "Gets the current votes balance for `account`" ++ }, ++ "increaseAllowance(address,uint256)": { ++ "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." ++ }, ++ "name()": { ++ "details": "Returns the name of the token." ++ }, ++ "nonces(address)": { ++ "details": "See {IERC20Permit-nonces}." ++ }, ++ "numCheckpoints(address)": { ++ "details": "Get number of checkpoints for `account`." ++ }, ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { ++ "details": "See {IERC20Permit-permit}." ++ }, ++ "symbol()": { ++ "details": "Returns the symbol of the token, usually a shorter version of the name." ++ }, ++ "totalSupply()": { ++ "details": "See {IERC20-totalSupply}." ++ }, ++ "transfer(address,uint256)": { ++ "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." ++ }, ++ "transferFrom(address,address,uint256)": { ++ "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." ++ } ++ }, ++ "title": "Boba Token (BOBA)", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "maxSupply()": { ++ "notice": "Maximum possible number of tokens" ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 517, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_balances", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_mapping(t_address,t_uint256)" ++ }, ++ { ++ "astId": 523, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_allowances", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" ++ }, ++ { ++ "astId": 525, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupply", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_uint256" ++ }, ++ { ++ "astId": 527, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_name", ++ "offset": 0, ++ "slot": "3", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 529, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_symbol", ++ "offset": 0, ++ "slot": "4", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 1937, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_nonces", ++ "offset": 0, ++ "slot": "5", ++ "type": "t_mapping(t_address,t_struct(Counter)3381_storage)" ++ }, ++ { ++ "astId": 1210, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_delegates", ++ "offset": 0, ++ "slot": "6", ++ "type": "t_mapping(t_address,t_address)" ++ }, ++ { ++ "astId": 1216, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_checkpoints", ++ "offset": 0, ++ "slot": "7", ++ "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)" ++ }, ++ { ++ "astId": 1220, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_totalSupplyCheckpoints", ++ "offset": 0, ++ "slot": "8", ++ "type": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ } ++ ], ++ "types": { ++ "t_address": { ++ "encoding": "inplace", ++ "label": "address", ++ "numberOfBytes": "20" ++ }, ++ "t_array(t_struct(Checkpoint)1201_storage)dyn_storage": { ++ "base": "t_struct(Checkpoint)1201_storage", ++ "encoding": "dynamic_array", ++ "label": "struct ERC20Votes.Checkpoint[]", ++ "numberOfBytes": "32" ++ }, ++ "t_mapping(t_address,t_address)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => address)", ++ "numberOfBytes": "32", ++ "value": "t_address" ++ }, ++ "t_mapping(t_address,t_array(t_struct(Checkpoint)1201_storage)dyn_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct ERC20Votes.Checkpoint[])", ++ "numberOfBytes": "32", ++ "value": "t_array(t_struct(Checkpoint)1201_storage)dyn_storage" ++ }, ++ "t_mapping(t_address,t_mapping(t_address,t_uint256))": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => mapping(address => uint256))", ++ "numberOfBytes": "32", ++ "value": "t_mapping(t_address,t_uint256)" ++ }, ++ "t_mapping(t_address,t_struct(Counter)3381_storage)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => struct Counters.Counter)", ++ "numberOfBytes": "32", ++ "value": "t_struct(Counter)3381_storage" ++ }, ++ "t_mapping(t_address,t_uint256)": { ++ "encoding": "mapping", ++ "key": "t_address", ++ "label": "mapping(address => uint256)", ++ "numberOfBytes": "32", ++ "value": "t_uint256" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Checkpoint)1201_storage": { ++ "encoding": "inplace", ++ "label": "struct ERC20Votes.Checkpoint", ++ "members": [ ++ { ++ "astId": 1198, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "fromBlock", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint32" ++ }, ++ { ++ "astId": 1200, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "votes", ++ "offset": 4, ++ "slot": "0", ++ "type": "t_uint224" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Counter)3381_storage": { ++ "encoding": "inplace", ++ "label": "struct Counters.Counter", ++ "members": [ ++ { ++ "astId": 3380, ++ "contract": "contracts/L1/token/BOBA.sol:BOBA", ++ "label": "_value", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_uint256" ++ } ++ ], ++ "numberOfBytes": "32" ++ }, ++ "t_uint224": { ++ "encoding": "inplace", ++ "label": "uint224", ++ "numberOfBytes": "28" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ }, ++ "t_uint32": { ++ "encoding": "inplace", ++ "label": "uint32", ++ "numberOfBytes": "4" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/0688a9ac0c7cbca876232a3281bda510.json b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/0688a9ac0c7cbca876232a3281bda510.json +deleted file mode 100644 +index 14223b3..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/0688a9ac0c7cbca876232a3281bda510.json ++++ /dev/null +@@ -1,237 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "contracts/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, +- "contracts/libraries/bridge/ICrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit);\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "contracts/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256 ** (32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256 ** (32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" +- }, +- "contracts/L1/messaging/L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender()\n public\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n public\n {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce =\n ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(\n ovmCanonicalTransactionChain,\n xDomainCalldata,\n _gasLimit\n );\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n public\n nonReentrant\n whenNotPaused\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n )\n public\n {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element =\n ICanonicalTransactionChain(canonicalTransactionChain).getQueueElement(_queueIndex);\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n )\n );\n\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n _sendXDomainMessage(\n canonicalTransactionChain,\n xDomainCalldata,\n _gasLimit\n );\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n )\n internal\n {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" +- }, +- "contracts/standards/AddressAliasHelper.sol": { +- "content": "\n// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_AddressManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string indexed _name,\n address _newAddress,\n address _oldAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n external\n onlyOwner\n {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(\n _name,\n _address,\n oldAddress\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n external\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +- }, +- "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" +- }, +- "contracts/libraries/constants/Lib_DefaultValues.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n}\n" +- }, +- "contracts/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY = 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n}\n" +- }, +- "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" +- }, +- "contracts/L1/rollup/ICanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n IChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n IChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n}\n" +- }, +- "contracts/L1/rollup/IStateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts/access/Ownable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Context.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" +- }, +- "contracts/libraries/trie/Lib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) =\n _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) == _getNodeKey(lastNode).length\n && keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] =\n _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode =\n _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch =\n _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode =\n _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch =\n _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(\n TrieNode memory _node,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" +- }, +- "contracts/L1/rollup/IChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" +- }, +- "contracts/L1/rollup/StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n IChainStorageContainer\n )\n {\n return IChainStorageContainer(\n resolve(\"ChainStorageContainer-SCC-batches\")\n );\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements()\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches()\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp()\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\"))\n .getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n // solhint-enable max-line-length\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" +- }, +- "contracts/L1/verification/IBondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n}\n" +- }, +- "contracts/L1/rollup/ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata()\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length()\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping (uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n Buffer storage _self,\n bytes32 _value\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n Buffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n Buffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n Buffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n Buffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(\n Buffer storage _self,\n BufferContext memory _ctx\n )\n internal\n {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(\n Buffer storage _self\n )\n internal\n view\n returns (\n BufferContext memory\n )\n {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n // solhint-disable-next-line max-line-length\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n return BufferContext({\n length: length,\n extraData: extraData\n });\n }\n}\n" +- }, +- "contracts/L1/verification/BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(\n address _who\n )\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" +- }, +- "contracts/L1/rollup/CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 immutable public L2_GAS_DISCOUNT_DIVISOR;\n uint256 immutable public ENQUEUE_GAS_COST;\n uint256 immutable public ENQUEUE_L2_GAS_PREPAID;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n )\n Lib_AddressResolver(_libAddressManager)\n {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n L2_GAS_DISCOUNT_DIVISOR = _l2GasDiscountDivisor;\n ENQUEUE_GAS_COST = _enqueueGasCost;\n ENQUEUE_L2_GAS_PREPAID = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n IChainStorageContainer\n )\n {\n return IChainStorageContainer(\n resolve(\"ChainStorageContainer-CTC-batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n public\n view\n returns (\n IChainStorageContainer\n )\n {\n return IChainStorageContainer(\n resolve(\"ChainStorageContainer-CTC-queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. Therefore, we define 'ENQUEUE_L2_GAS_PREPAID' as a\n // threshold. If the _gasLimit for the enqueued transaction is above this threshold, then we\n // 'charge' to user by burning additional L1 gas. Since gas is cheaper on L2 than L1, we\n // only need to burn a fraction of the provided L1 gas, which is determined by the\n // L2_GAS_DISCOUNT_DIVISOR.\n if(_gasLimit > ENQUEUE_L2_GAS_PREPAID) {\n uint256 gasToConsume = (_gasLimit - ENQUEUE_L2_GAS_PREPAID) / L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n IChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n external\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n IChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n\n }\n require(\n nextQueueIndex <= queueLength,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number-1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n // solhint-enable max-line-length\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n IChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n // solhint-disable max-line-length\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n // solhint-enable max-line-length\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n IChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n}\n" +- }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" +- }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = \"Test\";\n string public constant symbol = \"TST\";\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" +- }, +- "contracts/L2/messaging/L2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n*/\ncontract L2CrossDomainMessenger is\n IL2CrossDomainMessenger\n{\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _l1CrossDomainMessenger\n ) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n public\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(\n Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER\n ).passMessageToL1(xDomainCalldata);\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n public\n {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n}\n" +- }, +- "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"../../libraries/bridge/ICrossDomainMessenger.sol\";\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" +- }, +- "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" +- }, +- "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"./iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n public\n {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" +- }, +- "contracts/libraries/bridge/CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport { ICrossDomainMessenger } from \"./ICrossDomainMessenger.sol\";\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n ICrossDomainMessenger\n )\n {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, +- "contracts/L2/messaging/L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"../../L1/messaging/IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"../../L1/messaging/IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"./IL2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../standards/IL2StandardERC20.sol\";\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(\n address _l2CrossDomainMessenger,\n address _l1TokenBridge\n )\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n internal\n {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n _l1Gas,\n message\n );\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n virtual\n onlyFromCrossDomainAccount(l1TokenBridge)\n {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n 0,\n message\n );\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" +- }, +- "contracts/L1/messaging/IL1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport \"./IL1ERC20Bridge.sol\";\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n event ETHDepositInitiated (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH (\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo (\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal (\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/L1/messaging/IL1ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns(address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20 (\n address _l1Token,\n address _l2Token,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To (\n address _l1Token,\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/L2/messaging/IL2ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns(address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw (\n address _l2Token,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo (\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n\n}\n" +- }, +- "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" +- }, +- "contracts/standards/IL2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" +- }, +- "@openzeppelin/contracts/utils/introspection/IERC165.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/IERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" +- }, +- "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(\n address _l1FeeWallet\n ) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw()\n public\n {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" +- }, +- "contracts/L2/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n address(0),\n \"Ether\",\n \"ETH\"\n )\n {}\n\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" +- }, +- "contracts/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector\n ^ IL2StandardERC20.mint.selector\n ^ IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/ERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" +- }, +- "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n\n /*************\n * Variables *\n *************/\n\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(\n address _owner\n )\n Ownable()\n {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(\n uint256 _gasPrice\n )\n public\n onlyOwner\n {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(\n uint256 _baseFee\n )\n public\n onlyOwner\n {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(\n uint256 _overhead\n )\n public\n onlyOwner\n {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(\n uint256 _scalar\n )\n public\n onlyOwner\n {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(\n uint256 _decimals\n )\n public\n onlyOwner\n {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data)\n public\n view\n returns (\n uint256\n )\n {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data)\n public\n view\n returns (\n uint256\n )\n {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" +- }, +- "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Address.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" +- }, +- "contracts/L1/messaging/L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping (address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n CrossDomainEnabled(address(0))\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(\n address _l1messenger,\n address _l2TokenBridge\n )\n public\n {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive()\n external\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n 1_300_000,\n bytes(\"\")\n );\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable\n {\n _initiateETHDeposit(\n msg.sender,\n _to,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n )\n internal\n {\n // Construct calldata for finalizeDeposit call\n bytes memory message =\n abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n virtual\n onlyEOA()\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n virtual\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n internal\n {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(\n _from,\n address(this),\n _amount\n );\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n (bool success, ) = _to.call{value: _amount}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" +- }, +- "contracts/L2/messaging/L2StandardTokenFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n external\n {\n require (_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" +- }, +- "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(\n address _address\n )\n public\n pure\n returns (\n address\n )\n {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(\n address _address\n )\n public\n pure\n returns (\n address\n )\n {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index\n );\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n public\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function setExtraData(\n bytes27 _extraData\n )\n public\n {\n return buf.setExtraData(\n _extraData\n );\n }\n\n function getExtraData()\n public\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 10000 +- }, +- "metadata": { +- "bytecodeHash": "none", +- "useLiteralContent": true +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "storageLayout", +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/85fb691d85cfc56b2b8339f63294b676.json b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/676a83a35bfb22990db72e41039dc582.json +similarity index 64% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/85fb691d85cfc56b2b8339f63294b676.json +rename to node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/676a83a35bfb22990db72e41039dc582.json +index 1476687..af1cea9 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/85fb691d85cfc56b2b8339f63294b676.json ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/676a83a35bfb22990db72e41039dc582.json +@@ -22,11 +22,8 @@ + "contracts/libraries/utils/Lib_Bytes32Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" + }, +- "contracts/L1/messaging/L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" +- }, +- "contracts/standards/AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve(\"Proxy__L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" + }, + "contracts/libraries/resolver/Lib_AddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" +@@ -34,6 +31,51 @@ + "contracts/libraries/resolver/Lib_AddressManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address) external onlyOwner {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" + }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\nimport { IL1DepositHash } from \"./IL1DepositHash.sol\";\n\n/**\n * @title L1CrossDomainMessengerFast\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1.\n * In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted\n * via this contract's replay function.\n * This 'fast' CDM (CDMF) only relays messages from L2 onto L1 and cannot send or replay messages. Those functions have been\n * disabled. The overall goal of the 'fast' messenger is to relay messages to L1 without being subject to the 7 day delay,\n * which is normally implemented by blocking messages that are less than 7 days old.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessengerFast is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessengerFast already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause fast exit relays\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * UnPause fast exit relays\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view override returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"CDMF: xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public override {\n revert(\"sendMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public override onlyRelayer nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"CDMF: Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"CDMF: Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"CDMF: Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] == true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) public nonReentrant whenNotPaused {\n // verify hashes\n _verifyDepositHashes(_standardBridgeDepositHash, _lpDepositHash);\n\n relayMessage(_target, _sender, _message, _messageNonce, _proof);\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public override {\n revert(\"replayMessage via L1CrossDomainMessengerFast is disabled\");\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"CDMF: Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n function _verifyDepositHashes(bytes32 _standardBridgeDepositHash, bytes32 _lpDepositHash)\n internal\n {\n // fetch address of standard bridge and LP1\n address standardBridge = resolve(\"Proxy__L1StandardBridge\");\n address L1LP = resolve(\"Proxy__L1LiquidityPool\");\n\n if (block.number == IL1DepositHash(standardBridge).lastHashUpdateBlock()) {\n require(\n _standardBridgeDepositHash == IL1DepositHash(standardBridge).priorDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n } else {\n require(\n _standardBridgeDepositHash ==\n IL1DepositHash(standardBridge).currentDepositInfoHash(),\n \"Standard Bridge hashes do not match\"\n );\n }\n\n if (block.number == IL1DepositHash(L1LP).lastHashUpdateBlock()) {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).priorDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n } else {\n require(\n _lpDepositHash == IL1DepositHash(L1LP).currentDepositInfoHash(),\n \"LP1 hashes do not match\"\n );\n }\n }\n}\n" ++ }, + "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" + }, +@@ -41,17 +83,11 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n}\n" + }, + "contracts/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH = payable(0x4200000000000000000000000000000000000006);\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\n address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;\n address internal constant PROXY__BOBA_TURING_PREPAY =\n 0x4200000000000000000000000000000000000020;\n address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;\n address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;\n address internal constant L2_BOBA = 0x4200000000000000000000000000000000000023;\n address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =\n 0x4200000000000000000000000000000000000024;\n address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;\n}\n" + }, + "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" + }, +- "contracts/L1/rollup/ICanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" +- }, +- "contracts/L1/rollup/IStateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external\n view\n returns (bool _inside);\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" + }, +@@ -61,44 +97,20 @@ + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" + }, +- "@openzeppelin/contracts/access/Ownable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Context.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ "contracts/L1/messaging/IL1DepositHash.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.8.8;\n\ninterface IL1DepositHash {\n function priorDepositInfoHash() external returns (bytes32);\n\n function currentDepositInfoHash() external returns (bytes32);\n\n function lastHashUpdateBlock() external returns (uint256);\n}\n" + }, + "contracts/libraries/trie/Lib_MerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex\"80\";\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\n proof,\n _key,\n _root\n );\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, \"Provided proof is invalid.\");\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(keccak256(currentNode.encoded) == currentNodeID, \"Invalid root hash\");\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" + }, +- "contracts/L1/rollup/IChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\n}\n" +- }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" + }, +- "contracts/L1/rollup/StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { IStateCommitmentChain } from \"./IStateCommitmentChain.sol\";\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IBondManager } from \"../verification/IBondManager.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-SCC-batches\"));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve(\"BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(_batch.length > 0, \"Cannot submit an empty state batch.\");\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve(\"CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n view\n returns (bool _inside)\n {\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\n\n require(timestamp != 0, \"Batch header timestamp cannot be zero\");\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\n internal\n pure\n returns (bytes27)\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\n require(_batchHeader.batchIndex < batches().length(), \"Invalid batch index.\");\n\n require(_isValidBatchHeader(_batchHeader), \"Invalid batch header.\");\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n view\n returns (bool)\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\n require(_elements.length > 0, \"Lib_MerkleTree: Must provide at least one leaf hash.\");\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(_totalLeaves > 0, \"Lib_MerkleTree: Total leaves must be greater than zero.\");\n\n require(_index < _totalLeaves, \"Lib_MerkleTree: Index out of bounds.\");\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\");\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" +- }, +- "contracts/L1/verification/IBondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" +- }, +- "contracts/L1/rollup/ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" +- }, +- "contracts/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, \"Index out of bounds.\");\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({ length: length, extraData: extraData });\n }\n}\n" +- }, +- "contracts/L1/verification/BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IBondManager } from \"./IBondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n}\n" +- }, +- "contracts/L1/rollup/CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { ICanonicalTransactionChain } from \"./ICanonicalTransactionChain.sol\";\nimport { IChainStorageContainer } from \"./IChainStorageContainer.sol\";\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(msg.sender == libAddressManager.owner(), \"Only callable by the Burn Admin.\");\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-batches\"));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve(\"ChainStorageContainer-CTC-queue\"));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \"Transaction gas limit too low to enqueue.\");\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(startingGas > gasToConsume, \"Insufficient gas for L2 rate limiting burn.\");\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(msg.data.length >= nextTransactionPtr, \"Not enough BatchContexts provided.\");\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n \"Attempted to append more elements than are available in the queue.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\n )\n lastTimestamp := shr(\n 80,\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\n )\n lastBlockNumber := shr(\n 120,\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { IL1CrossDomainMessenger } from \"./IL1CrossDomainMessenger.sol\";\nimport { ICanonicalTransactionChain } from \"../rollup/ICanonicalTransactionChain.sol\";\nimport { IStateCommitmentChain } from \"../rollup/IStateCommitmentChain.sol\";\n\n/* External Imports */\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n PausableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {\n ReentrancyGuardUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Unpause relaying.\n */\n function unpause() external onlyOwner {\n _unpause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to allow.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve(\"StateCommitmentChain\")\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" + }, + "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +@@ -121,6 +133,9 @@ + "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" + }, ++ "contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/**\n * @title TestLib_CrossDomainUtils\n */\nlibrary TestLib_CrossDomainUtils {\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public pure returns (bytes memory) {\n return\n Lib_CrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce);\n }\n}\n" ++ }, + "contracts/L2/messaging/L2CrossDomainMessenger.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\nimport { Lib_CrossDomainUtils } from \"../../libraries/bridge/Lib_CrossDomainUtils.sol\";\nimport { Lib_DefaultValues } from \"../../libraries/constants/Lib_DefaultValues.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { IL2CrossDomainMessenger } from \"./IL2CrossDomainMessenger.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n \"xDomainMessageSender is not set\"\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER).passMessageToL1(\n xDomainCalldata\n );\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\n\n relayedMessages[relayId] = true;\n }\n}\n" + }, +@@ -164,10 +179,10 @@ + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" + }, + "contracts/L2/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(Lib_PredeployAddresses.L2_STANDARD_BRIDGE, address(0), \"Ether\", \"ETH\")\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(Lib_PredeployAddresses.L2_STANDARD_BRIDGE, address(0), \"Ether\", \"ETH\", 18)\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: transfer is disabled pending further community discussion.\");\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n revert(\"OVM_ETH: approve is disabled pending further community discussion.\");\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\"OVM_ETH: transferFrom is disabled pending further community discussion.\");\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: increaseAllowance is disabled pending further community discussion.\");\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\"OVM_ETH: decreaseAllowance is disabled pending further community discussion.\");\n }\n}\n" + }, + "contracts/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" +@@ -175,11 +190,47 @@ + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, +- "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n // solhint-disable max-line-length\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n // solhint-enable max-line-length\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ "contracts/standards/L2GovernanceERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ERC20Permit } from \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n// prettier-ignore\nimport {ERC20Votes} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol\";\n// prettier-ignore\nimport {ERC20VotesComp} from \"@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol\";\nimport { IL2StandardERC20 } from \"./IL2StandardERC20.sol\";\n\ncontract L2GovernanceERC20 is IL2StandardERC20, ERC20, ERC20Permit, ERC20Votes, ERC20VotesComp {\n address public l1Token;\n address public l2Bridge;\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) ERC20Permit(_name) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n // Overrides required by Solidity\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n}\n" + }, +- "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private immutable _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../draft-ERC20Permit.sol\";\nimport \"../../../../utils/math/Math.sol\";\nimport \"../../../../utils/math/SafeCast.sol\";\nimport \"../../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n // for regenesis, this is cumulative, all blocks since contract\n // OFFSET = current OFFSET + blocks in old chain\n uint256 public constant OFFSET = 0;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n blockNumber += OFFSET;\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number + OFFSET) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number + OFFSET), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20VotesRegenesis.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n } else if (error == RecoverError.InvalidSignatureV) {\n revert(\"ECDSA: invalid signature 'v' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n // Check the signature length\n // - case 65: r,s,v signature (standard)\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else if (signature.length == 64) {\n bytes32 r;\n bytes32 vs;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly {\n r := mload(add(signature, 0x20))\n vs := mload(add(signature, 0x40))\n }\n return tryRecover(hash, r, vs);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s;\n uint8 v;\n assembly {\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n v := add(shr(255, vs), 27)\n }\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n if (v != 27 && v != 28) {\n return (address(0), RecoverError.InvalidSignatureV);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Counters.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a / b + (a % b == 0 ? 0 : 1);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeCast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits.\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual {\n return _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n return _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Votes.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's\n * interface, with the drawback of only supporting supply up to (2^96^ - 1).\n *\n * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token\n * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the\n * {ERC20Votes} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\n * will significantly increase the base gas cost of transfers.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20VotesComp is ERC20Votes {\n /**\n * @dev Comp version of the {getVotes} accessor, with `uint96` return type.\n */\n function getCurrentVotes(address account) external view returns (uint96) {\n return SafeCast.toUint96(getVotes(account));\n }\n\n /**\n * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type.\n */\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\n return SafeCast.toUint96(getPastVotes(account, blockNumber));\n }\n\n /**\n * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.\n */\n function _maxSupply() internal view virtual override returns (uint224) {\n return type(uint96).max;\n }\n}\n" ++ }, ++ "contracts/L1/token/BOBA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n//Implementation of the ERC20 Permit extension allowing approvals to be made via signatures,\n//as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\nimport \"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\";\n\n//Extension of ERC20 to support Compound-like voting and delegation\n//This extension keeps a history (checkpoints) of each account's vote power.\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\n//Extension of ERC20 to support Compound's voting and delegation\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol\";\n\n//Extension of {ERC20} that allows token holders to destroy both their own\n//tokens and those that they have an allowance for, in a way that can be\n//recognized off-chain (via event analysis).\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title Boba Token (BOBA)\n *\n */\n\ncontract BOBA is Context, ERC20, ERC20Burnable, ERC20Permit, ERC20Votes, ERC20VotesComp {\n /// @notice Maximum possible number of tokens\n uint224 public constant maxSupply = 500000000e18; // 500 million BOBA\n\n /// @notice Maximum token supply. Needed to fit the COMP interface.\n // The math: The classic Comp governance contracts are\n // limited to `type(uint96).max` (2^96^ - 1) = 7.9228163e+28\n // Our maxSupply is 5e+26, so we are under the limit\n function _maxSupply() internal pure override(ERC20Votes, ERC20VotesComp) returns (uint224) {\n return maxSupply;\n }\n\n constructor() ERC20(\"Boba Token\", \"BOBA\") ERC20Permit(\"Boba Token\") {\n //mint maxSupply at genesis, allocated to deployer\n _mint(_msgSender(), maxSupply);\n }\n\n // Override required by Solidity because _mint is defined by two base classes\n function _mint(address _to, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._mint(_to, _amount);\n }\n\n // Override required by Solidity because _burn is defined by two base classes\n function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) {\n super._burn(_account, _amount);\n }\n\n // Override required by Solidity because _afterTokenTransfer is defined by two base classes\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n uint256 currentAllowance = allowance(account, _msgSender());\n require(currentAllowance >= amount, \"ERC20: burn amount exceeds allowance\");\n unchecked {\n _approve(account, _msgSender(), currentAllowance - amount);\n }\n _burn(account, amount);\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" +@@ -187,23 +238,44 @@ + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, ++ "contracts/L2/predeploys/BobaTuringCredit.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/* Interface */\nimport \"@boba/turing-hybrid-compute/contracts/ITuringHelper.sol\";\n\n/**\n * @title BobaTuringCredit\n * @dev The credit system for Boba Turing\n */\ncontract BobaTuringCredit {\n using SafeMath for uint256;\n using SafeERC20 for IERC20;\n\n /**********************\n * Contract Variables *\n **********************/\n address public owner;\n\n mapping(address => uint256) public prepaidBalance;\n\n address public turingToken;\n uint256 public turingPrice;\n uint256 public ownerRevenue;\n\n /********************\n * Events *\n ********************/\n\n event TransferOwnership(address oldOwner, address newOwner);\n\n event AddBalanceTo(address sender, uint256 balanceAmount, address helperContractAddress);\n\n event WithdrawRevenue(address sender, uint256 withdrawAmount);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(turingToken) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyInitialized() {\n require(address(turingToken) != address(0), \"Contract has not yet been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner || owner == address(0), \"caller is not the owner\");\n _;\n }\n\n /********************\n * Constructor *\n ********************/\n\n constructor(uint256 _turingPrice) {\n turingPrice = _turingPrice;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Update turing token\n *\n * @param _turingToken credit token address\n */\n function updateTuringToken(address _turingToken) public onlyOwner onlyNotInitialized {\n turingToken = _turingToken;\n }\n\n /**\n * @dev transfer ownership\n *\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0));\n owner = _newOwner;\n emit TransferOwnership(msg.sender, _newOwner);\n }\n\n /**\n * @dev Update turing price\n *\n * @param _turingPrice turing price for each off-chain computation\n */\n function updateTuringPrice(uint256 _turingPrice) public onlyOwner {\n turingPrice = _turingPrice;\n }\n\n /**\n * @dev Add credit for a Turing helper contract\n *\n * @param _addBalanceAmount the prepaid amount that the user want to add\n * @param _helperContractAddress the address of the turing helper contract\n */\n function addBalanceTo(uint256 _addBalanceAmount, address _helperContractAddress)\n public\n onlyInitialized\n {\n require(_addBalanceAmount != 0, \"Invalid amount\");\n require(Address.isContract(_helperContractAddress), \"Address is EOA\");\n require(\n ERC165Checker.supportsInterface(_helperContractAddress, 0x2f7adf43),\n \"Invalid Helper Contract\"\n );\n\n prepaidBalance[_helperContractAddress] += _addBalanceAmount;\n\n emit AddBalanceTo(msg.sender, _addBalanceAmount, _helperContractAddress);\n\n // Transfer token to this contract\n IERC20(turingToken).safeTransferFrom(msg.sender, address(this), _addBalanceAmount);\n }\n\n /**\n * @dev Return the credit of a specific helper contract\n */\n function getCreditAmount(address _helperContractAddress) public view returns (uint256) {\n require(turingPrice != 0, \"Unlimited credit\");\n return prepaidBalance[_helperContractAddress].div(turingPrice);\n }\n\n /**\n * @dev Owner withdraws revenue\n *\n * @param _withdrawAmount the revenue amount that the owner wants to withdraw\n */\n function withdrawRevenue(uint256 _withdrawAmount) public onlyOwner onlyInitialized {\n require(_withdrawAmount <= ownerRevenue, \"Invalid Amount\");\n\n ownerRevenue -= _withdrawAmount;\n\n emit WithdrawRevenue(msg.sender, _withdrawAmount);\n\n IERC20(turingToken).safeTransfer(owner, _withdrawAmount);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a + b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n" ++ }, ++ "@boba/turing-hybrid-compute/contracts/ITuringHelper.sol": { ++ "content": "//SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ninterface ITuringHelper {\n\n /* Called from the external contract. It takes an api endponit URL\n and an abi-encoded request payload. The URL and the list of allowed\n methods are supplied when the contract is created. In the future\n some of this registration might be moved into l2geth, allowing for\n security measures such as TLS client certificates. A configurable timeout\n could also be added.\n\n Logs the offchain response so that a future verifier or fraud prover\n can replay the transaction and ensure that it results in the same state\n root as during the initial execution. Note - a future version might\n need to include a timestamp and/or more details about the\n offchain interaction.\n */\n function TuringTx(string memory _url, bytes memory _payload) external returns (bytes memory);\n}\n" ++ }, ++ "contracts/L2/predeploys/Boba_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\n\n/* Contract Imports */\nimport { L2StandardBridge } from \"../messaging/L2StandardBridge.sol\";\nimport { L2GovernanceERC20 } from \"../../standards/L2GovernanceERC20.sol\";\nimport { OVM_GasPriceOracle } from \"./OVM_GasPriceOracle.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/* Contract Imports */\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\n/**\n * @title Boba_GasPriceOracle\n */\ncontract Boba_GasPriceOracle {\n using SafeERC20 for IERC20;\n using SafeMath for uint256;\n\n /*************\n * Constants *\n *************/\n\n // Minimum BOBA balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 150e18;\n\n /*************\n * Variables *\n *************/\n\n // Owner address\n address private _owner;\n\n // Address that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public feeWallet;\n\n // L2 Boba token address\n address public l2BobaAddress;\n\n // The maximum value of ETH and BOBA\n uint256 public maxPriceRatio = 5000;\n\n // The minimum value of ETH and BOBA\n uint256 public minPriceRatio = 500;\n\n // The price ratio of ETH and BOBA\n // This price ratio considers the saving percentage of using BOBA as the fee token\n uint256 public priceRatio;\n\n // Gas price oracle address\n address public gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n\n // Record the wallet address that wants to use boba as fee token\n mapping(address => bool) public bobaFeeTokenUsers;\n\n // Boba fee for the meta transaction\n uint256 public metaTransactionFee = 3e18;\n\n // Received ETH amount for the swap - 0.005\n uint256 public receivedETHAmount = 5e15;\n\n // Price ratio without discount\n uint256 public marketPriceRatio;\n\n /*************\n * Events *\n *************/\n\n event TransferOwnership(address, address);\n event UseBobaAsFeeToken(address);\n event SwapBOBAForETHMetaTransaction(address);\n event UseETHAsFeeToken(address);\n event UpdatePriceRatio(address, uint256, uint256);\n event UpdateMaxPriceRatio(address, uint256);\n event UpdateMinPriceRatio(address, uint256);\n event UpdateGasPriceOracleAddress(address, address);\n event UpdateMetaTransactionFee(address, uint256);\n event UpdateReceivedETHAmount(address, uint256);\n event WithdrawBOBA(address, address);\n event WithdrawETH(address, address);\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyNotInitialized() {\n require(address(feeWallet) == address(0), \"Contract has been initialized\");\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == _owner, \"caller is not the owner\");\n _;\n }\n\n /********************\n * Fall back Functions *\n ********************/\n\n /**\n * Receive ETH\n */\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * transfer ownership\n * @param _newOwner new owner address\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n require(_newOwner != address(0), \"Ownable: new owner is the zero address\");\n address oldOwner = _owner;\n _owner = _newOwner;\n emit TransferOwnership(oldOwner, _newOwner);\n }\n\n /**\n * Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * Initialize feeWallet and l2BobaAddress.\n */\n function initialize(address payable _feeWallet, address _l2BobaAddress)\n public\n onlyNotInitialized\n {\n require(_feeWallet != address(0) && _l2BobaAddress != address(0));\n feeWallet = _feeWallet;\n l2BobaAddress = _l2BobaAddress;\n\n // Initialize the parameters\n _owner = msg.sender;\n gasPriceOracleAddress = 0x420000000000000000000000000000000000000F;\n metaTransactionFee = 3e18;\n maxPriceRatio = 5000;\n priceRatio = 2000;\n minPriceRatio = 500;\n marketPriceRatio = 2000;\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n */\n function useBobaAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 3 BOBA\n require(\n L2GovernanceERC20(l2BobaAddress).balanceOf(msg.sender) >= 3e18,\n \"Insufficient Boba balance\"\n );\n bobaFeeTokenUsers[msg.sender] = true;\n emit UseBobaAsFeeToken(msg.sender);\n }\n\n /**\n * Add the users that want to use BOBA as the fee token\n * using the Meta Transaction\n * NOTE: Only works for the mainnet and local testnet\n */\n function swapBOBAForETHMetaTransaction(\n address tokenOwner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public {\n require(!Address.isContract(tokenOwner), \"Account not EOA\");\n require(spender == address(this), \"Spender is not this contract\");\n uint256 totalCost = receivedETHAmount.mul(marketPriceRatio).add(metaTransactionFee);\n require(value >= totalCost, \"Value is not enough\");\n L2GovernanceERC20 bobaToken = L2GovernanceERC20(l2BobaAddress);\n bobaToken.permit(tokenOwner, spender, value, deadline, v, r, s);\n IERC20(l2BobaAddress).safeTransferFrom(tokenOwner, address(this), totalCost);\n (bool sent, ) = address(tokenOwner).call{ value: receivedETHAmount }(\"\");\n require(sent, \"Failed to send ETH\");\n emit SwapBOBAForETHMetaTransaction(tokenOwner);\n }\n\n /**\n * Add the users that want to use ETH as the fee token\n */\n function useETHAsFeeToken() public {\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n // Users should have more than 0.002 ETH\n require(address(msg.sender).balance >= 2e15, \"Insufficient ETH balance\");\n bobaFeeTokenUsers[msg.sender] = false;\n emit UseETHAsFeeToken(msg.sender);\n }\n\n /**\n * Update the price ratio of ETH and BOBA\n * @param _priceRatio the price ratio of ETH and BOBA\n * @param _marketPriceRatio tha market price ratio of ETH and BOBA\n */\n function updatePriceRatio(uint256 _priceRatio, uint256 _marketPriceRatio) public onlyOwner {\n require(_priceRatio <= maxPriceRatio && _priceRatio >= minPriceRatio);\n require(_marketPriceRatio <= maxPriceRatio && _marketPriceRatio >= minPriceRatio);\n priceRatio = _priceRatio;\n marketPriceRatio = _marketPriceRatio;\n emit UpdatePriceRatio(owner(), _priceRatio, _marketPriceRatio);\n }\n\n /**\n * Update the maximum price ratio of ETH and BOBA\n * @param _maxPriceRatio the maximum price ratio of ETH and BOBA\n */\n function updateMaxPriceRatio(uint256 _maxPriceRatio) public onlyOwner {\n require(_maxPriceRatio >= minPriceRatio && _maxPriceRatio > 0);\n maxPriceRatio = _maxPriceRatio;\n emit UpdateMaxPriceRatio(owner(), _maxPriceRatio);\n }\n\n /**\n * Update the minimum price ratio of ETH and BOBA\n * @param _minPriceRatio the minimum price ratio of ETH and BOBA\n */\n function updateMinPriceRatio(uint256 _minPriceRatio) public onlyOwner {\n require(_minPriceRatio <= maxPriceRatio && _minPriceRatio > 0);\n minPriceRatio = _minPriceRatio;\n emit UpdateMinPriceRatio(owner(), _minPriceRatio);\n }\n\n /**\n * Update the gas oracle address\n * @param _gasPriceOracleAddress gas oracle address\n */\n function updateGasPriceOracleAddress(address _gasPriceOracleAddress) public onlyOwner {\n require(Address.isContract(_gasPriceOracleAddress), \"Account is EOA\");\n require(_gasPriceOracleAddress != address(0));\n gasPriceOracleAddress = _gasPriceOracleAddress;\n emit UpdateGasPriceOracleAddress(owner(), _gasPriceOracleAddress);\n }\n\n /**\n * Update the fee for the meta transaction\n * @param _metaTransactionFee the fee for the meta transaction\n */\n function updateMetaTransactionFee(uint256 _metaTransactionFee) public onlyOwner {\n require(_metaTransactionFee > 0);\n metaTransactionFee = _metaTransactionFee;\n emit UpdateMetaTransactionFee(owner(), _metaTransactionFee);\n }\n\n /**\n * Update the received ETH amount\n * @param _receivedETHAmount the received ETH amount\n */\n function updateReceivedETHAmount(uint256 _receivedETHAmount) public onlyOwner {\n require(_receivedETHAmount > 1e15 && _receivedETHAmount < 10e15);\n receivedETHAmount = _receivedETHAmount;\n emit UpdateReceivedETHAmount(owner(), _receivedETHAmount);\n }\n\n /**\n * Get the price for swapping BOBA for ETH\n */\n function getBOBAForSwap() public view returns (uint256) {\n return receivedETHAmount.mul(marketPriceRatio).add(metaTransactionFee);\n }\n\n /**\n * Get L1 Boba fee for fee estimation\n * @param _txData the data payload\n */\n function getL1BobaFee(bytes memory _txData) public view returns (uint256) {\n OVM_GasPriceOracle gasPriceOracleContract = OVM_GasPriceOracle(gasPriceOracleAddress);\n return gasPriceOracleContract.getL1Fee(_txData) * priceRatio;\n }\n\n /**\n * withdraw BOBA tokens to l1 fee wallet\n */\n function withdrawBOBA() public {\n require(\n L2GovernanceERC20(l2BobaAddress).balanceOf(address(this)) >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"Boba_GasPriceOracle: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n l2BobaAddress,\n feeWallet,\n L2GovernanceERC20(l2BobaAddress).balanceOf(address(this)),\n 0,\n bytes(\"\")\n );\n emit WithdrawBOBA(owner(), feeWallet);\n }\n\n /**\n * withdraw ETH tokens to l2 fee wallet\n */\n function withdrawETH() public onlyOwner {\n (bool sent, ) = feeWallet.call{ value: address(this).balance }(\"\");\n require(sent, \"Failed to send ETH to fee wallet\");\n emit WithdrawETH(owner(), feeWallet);\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the extra L2 gas to cover the\n * L1 security fee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L2 extra gas that should be included in the L2 gas\n */\n function getExtraL2Gas(bytes memory _data) public view returns (uint256) {\n return getL1Fee(_data) / gasPrice;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, + "contracts/L1/messaging/L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport { IL1StandardBridge } from \"./IL1StandardBridge.sol\";\nimport { IL1ERC20Bridge } from \"./IL1ERC20Bridge.sol\";\nimport { IL2ERC20Bridge } from \"../../L2/messaging/IL2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { CrossDomainEnabled } from \"../../libraries/bridge/CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n bytes32 public priorDepositInfoHash;\n bytes32 public currentDepositInfoHash;\n uint256 public lastHashUpdateBlock;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 1_300_000, bytes(\"\"));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n // compute and update deposit hash\n _updateDepositHash(address(0), Lib_PredeployAddresses.OVM_ETH, _from, _to, msg.value);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n _updateDepositHash(_l1Token, _l2Token, _from, _to, _amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n function _updateDepositHash(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount\n ) internal {\n // if block number is different only then update prior\n if (block.number > lastHashUpdateBlock) {\n priorDepositInfoHash = currentDepositInfoHash;\n }\n currentDepositInfoHash = keccak256(\n abi.encode(currentDepositInfoHash, _l1Token, _l2Token, _from, _to, _amount)\n );\n\n lastHashUpdateBlock = block.number;\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), \"Target address must be initialized.\");\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" + }, + "contracts/L2/messaging/L2StandardTokenFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" + }, + "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { AddressAliasHelper } from \"../../standards/AddressAliasHelper.sol\";\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" + }, + "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" + }, +- "contracts/test-libraries/utils/TestLib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData) public {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" +- }, + "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements) public pure returns (bytes32) {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { IL1CrossDomainMessengerFast } from \"./IL1CrossDomainMessengerFast.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title L1MultiMessageRelayerFast\n * @dev The L1 Multi-Message Relayer Fast contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the Fast L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayerFast is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessengerFast.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"L2BatchFastMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"L1MultiMessageRelayerFast: Function can only be called by the L2BatchFastMessageRelayer\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger Fast for relaying\n * @param _messages An array of L2 to L1 messages\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external onlyBatchRelayer {\n IL1CrossDomainMessengerFast messenger = IL1CrossDomainMessengerFast(\n resolve(\"Proxy__L1CrossDomainMessengerFast\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof,\n _standardBridgeDepositHash,\n _lpDepositHash\n );\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1CrossDomainMessengerFast.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport \"./IL1CrossDomainMessenger.sol\";\n\n/**\n * @title IL1CrossDomainMessengerFast\n */\ninterface IL1CrossDomainMessengerFast is IL1CrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n * @param _standardBridgeDepositHash current deposit hash of standard bridges\n * @param _lpDepositHash current deposit hash of LP1\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof,\n bytes32 _standardBridgeDepositHash,\n bytes32 _lpDepositHash\n ) external;\n}\n" + } + }, + "settings": { +@@ -211,9 +283,14 @@ + "enabled": true, + "runs": 10000 + }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, + "outputSelection": { + "*": { + "*": [ ++ "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", +@@ -221,16 +298,14 @@ + "metadata", + "devdoc", + "userdoc", +- "storageLayout", +- "evm.gasEstimates" ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" + ], + "": [ + "ast" + ] + } +- }, +- "metadata": { +- "useLiteralContent": true + } + } + } +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/f80c23f801040af76e8cbed48c5580f3.json b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +new file mode 100644 +index 0000000..4ed9aad +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/f80c23f801040af76e8cbed48c5580f3.json +@@ -0,0 +1,41 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" ++ }, ++ "contracts/chugsplash/L1ChugSplashProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n // slither-disable-next-line incorrect-modifier\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n // slither-disable-next-line locked-ether\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n // slither-disable-next-line external-function\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n // slither-disable-next-line external-function\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n // slither-disable-next-line external-function\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n // slither-disable-next-line external-function\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n // slither-disable-next-line external-function\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates", ++ "devdoc", ++ "userdoc" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/fafd665d872703a6dab6b13999780370.json b/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/fafd665d872703a6dab6b13999780370.json +deleted file mode 100644 +index 6555fdd..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/goerli/solcInputs/fafd665d872703a6dab6b13999780370.json ++++ /dev/null +@@ -1,39 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading()\n external\n view\n returns (\n bool\n );\n}\n" +- }, +- "contracts/chugsplash/L1ChugSplashProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 constant internal IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 constant internal OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(\n address _owner\n ) {\n _setOwner(_owner);\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(\n iL1ChugSplashDeployer.isUpgrading.selector\n )\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(\n ret == 0,\n \"L1ChugSplashProxy: system is currently being upgraded\"\n );\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n // Proxy call by default.\n _doProxyCall();\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n function setCode(\n bytes memory _code\n )\n proxyCallIfNotOwner\n public\n {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(\n DEPLOY_CODE_PREFIX,\n _code\n );\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n function setStorage(\n bytes32 _key,\n bytes32 _value\n )\n proxyCallIfNotOwner\n public\n {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n function setOwner(\n address _owner\n )\n proxyCallIfNotOwner\n public\n {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n function getOwner()\n proxyCallIfNotOwner\n public\n returns (\n address\n )\n {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n function getImplementation()\n proxyCallIfNotOwner\n public\n returns (\n address\n )\n {\n return _getImplementation();\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(\n address _implementation\n )\n internal\n {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation()\n internal\n view\n returns (\n address\n )\n {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(\n address _owner\n )\n internal\n {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner()\n internal\n view\n returns (\n address\n )\n {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(\n address _account\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall()\n onlyWhenNotPaused\n internal\n {\n address implementation = _getImplementation();\n\n require(\n implementation != address(0),\n \"L1ChugSplashProxy: implementation is not set yet\"\n );\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 10000 +- }, +- "metadata": { +- "bytecodeHash": "none", +- "useLiteralContent": true +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "storageLayout", +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/AddressDictator.json b/node_modules/@eth-optimism/contracts/deployments/kovan/AddressDictator.json +deleted file mode 100644 +index 86fbebf..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/AddressDictator.json ++++ /dev/null +@@ -1,241 +0,0 @@ +-{ +- "address": "0x8676275c08626263c60282A26550464DFa19ABd6", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "_manager", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "string[]", +- "name": "_names", +- "type": "string[]" +- }, +- { +- "internalType": "address[]", +- "name": "_addresses", +- "type": "address[]" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getNamedAddresses", +- "outputs": [ +- { +- "components": [ +- { +- "internalType": "string", +- "name": "name", +- "type": "string" +- }, +- { +- "internalType": "address", +- "name": "addr", +- "type": "address" +- } +- ], +- "internalType": "struct AddressDictator.NamedAddress[]", +- "name": "", +- "type": "tuple[]" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "manager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "setAddresses", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "transactionHash": "0x306e10f4940220923012e46c591d93b9c4109ebd8794f271c38edc0afb218400", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0x8676275c08626263c60282A26550464DFa19ABd6", +- "transactionIndex": 4, +- "gasUsed": "942613", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x5f1f5d3d6b2b2f83e03f1aa6bbd941c2005da9f3284a75ee839bc46a9d1b9943", +- "transactionHash": "0x306e10f4940220923012e46c591d93b9c4109ebd8794f271c38edc0afb218400", +- "logs": [], +- "blockNumber": 27989629, +- "cumulativeGasUsed": "1447706", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- "0x18394B52d3Cb931dfA76F63251919D051953413d", +- [ +- "ChainStorageContainer-CTC-batches", +- "ChainStorageContainer-SCC-batches", +- "CanonicalTransactionChain", +- "StateCommitmentChain", +- "BondManager", +- "OVM_L1CrossDomainMessenger" +- ], +- [ +- "0x1d6d23989ba6a6e915F0e35BBc574E914d4ed092", +- "0x122208Aa20237FB4c655a9eF02685F7255DF33E8", +- "0xf7B88A133202d41Fe5E2Ab22e6309a1A4D50AF74", +- "0xD7754711773489F31A0602635f3F167826ce53C5", +- "0xc5a603d273E28185c18Ba4d26A0024B2d2F42740", +- "0xaF91349fdf3B206E079A8FcaB7b8dFaFB96A654D" +- ] +- ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"_manager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_finalOwner\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_names\",\"type\":\"string[]\"},{\"internalType\":\"address[]\",\"name\":\"_addresses\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"finalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNamedAddresses\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"internalType\":\"struct AddressDictator.NamedAddress[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"manager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"returnOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setAddresses\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate many different addresses in the AddressManager without transferring ownership of the AddressManager to a hot wallet or hardware wallet.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_addresses\":\"Array of addresses to associate with the name.\",\"_finalOwner\":\"Address to transfer AddressManager ownership to afterwards.\",\"_manager\":\"Address of the AddressManager contract.\",\"_names\":\"Array of names to associate an address with.\"}}},\"title\":\"AddressDictator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNamedAddresses()\":{\"notice\":\"Returns the full namedAddresses array.\"},\"returnOwnership()\":{\"notice\":\"Transfers ownership of this contract to the finalOwner. Only callable by the Final Owner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong.\"},\"setAddresses()\":{\"notice\":\"Called to finalize the transfer, this function is callable by anyone, but will only result in an upgrade if this contract is the owner Address Manager.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/deployment/AddressDictator.sol\":\"AddressDictator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/deployment/AddressDictator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title AddressDictator\\n * @dev The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate\\n * many different addresses in the AddressManager without transferring ownership of the\\n * AddressManager to a hot wallet or hardware wallet.\\n */\\ncontract AddressDictator {\\n /*********\\n * Types *\\n *********/\\n\\n struct NamedAddress {\\n string name;\\n address addr;\\n }\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public manager;\\n address public finalOwner;\\n NamedAddress[] namedAddresses;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _manager Address of the AddressManager contract.\\n * @param _finalOwner Address to transfer AddressManager ownership to afterwards.\\n * @param _names Array of names to associate an address with.\\n * @param _addresses Array of addresses to associate with the name.\\n */\\n constructor(\\n Lib_AddressManager _manager,\\n address _finalOwner,\\n string[] memory _names,\\n address[] memory _addresses\\n ) {\\n manager = _manager;\\n finalOwner = _finalOwner;\\n require(\\n _names.length == _addresses.length,\\n \\\"AddressDictator: Must provide an equal number of names and addresses.\\\"\\n );\\n for (uint256 i = 0; i < _names.length; i++) {\\n namedAddresses.push(NamedAddress({ name: _names[i], addr: _addresses[i] }));\\n }\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Called to finalize the transfer, this function is callable by anyone, but will only result in\\n * an upgrade if this contract is the owner Address Manager.\\n */\\n function setAddresses() external {\\n for (uint256 i = 0; i < namedAddresses.length; i++) {\\n manager.setAddress(namedAddresses[i].name, namedAddresses[i].addr);\\n }\\n // note that this will revert if _finalOwner == currentOwner\\n manager.transferOwnership(finalOwner);\\n }\\n\\n /**\\n * Transfers ownership of this contract to the finalOwner.\\n * Only callable by the Final Owner, which is intended to be our multisig.\\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can recover\\n * if something really surprising goes wrong.\\n */\\n function returnOwnership() external {\\n require(msg.sender == finalOwner, \\\"AddressDictator: only callable by finalOwner\\\");\\n manager.transferOwnership(finalOwner);\\n }\\n\\n /******************\\n * View Functions *\\n ******************/\\n\\n /**\\n * Returns the full namedAddresses array.\\n */\\n function getNamedAddresses() external view returns (NamedAddress[] memory) {\\n return namedAddresses;\\n }\\n}\\n\",\"keccak256\":\"0xd7257dc5d6c5855f57dc6c42f430f3c7bd4514a26756bac4183c65c77fd7cb70\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b5060405162000d5e38038062000d5e83398101604081905262000034916200037a565b600080546001600160a01b038087166001600160a01b03199283161790925560018054928616929091169190911790558051825114620000ee5760405162461bcd60e51b815260206004820152604560248201527f416464726573734469637461746f723a204d7573742070726f7669646520616e60448201527f20657175616c206e756d626572206f66206e616d657320616e6420616464726560648201526439b9b2b99760d91b608482015260a40160405180910390fd5b60005b8251811015620001c357600260405180604001604052808584815181106200011d576200011d62000505565b602002602001015181526020018484815181106200013f576200013f62000505565b6020908102919091018101516001600160a01b0316909152825460018101845560009384529281902082518051939460020290910192620001849284920190620001ce565b5060209190910151600190910180546001600160a01b0319166001600160a01b0390921691909117905580620001ba816200051b565b915050620000f1565b505050505062000582565b828054620001dc9062000545565b90600052602060002090601f0160209004810192826200020057600085556200024b565b82601f106200021b57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024b5782518255916020019190600101906200022e565b50620002599291506200025d565b5090565b5b808211156200025957600081556001016200025e565b6001600160a01b03811681146200028a57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002ce57620002ce6200028d565b604052919050565b60006001600160401b03821115620002f257620002f26200028d565b5060051b60200190565b600082601f8301126200030e57600080fd5b81516020620003276200032183620002d6565b620002a3565b82815260059290921b840181019181810190868411156200034757600080fd5b8286015b848110156200036f578051620003618162000274565b83529183019183016200034b565b509695505050505050565b600080600080608085870312156200039157600080fd5b84516200039e8162000274565b80945050602080860151620003b38162000274565b60408701519094506001600160401b0380821115620003d157600080fd5b818801915088601f830112620003e657600080fd5b8151620003f76200032182620002d6565b81815260059190911b8301840190848101908b8311156200041757600080fd5b8585015b83811015620004ce57805185811115620004355760008081fd5b8601603f81018e13620004485760008081fd5b87810151868111156200045f576200045f6200028d565b62000473601f8201601f19168a01620002a3565b8181528f60408385010111156200048a5760008081fd5b60005b82811015620004ab57838101604001518282018c01528a016200048d565b82811115620004bd5760008b84840101525b50855250509186019186016200041b565b5060608b01519097509450505080831115620004e957600080fd5b5050620004f987828801620002fc565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053e57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200055a57607f821691505b602082108114156200057c57634e487b7160e01b600052602260045260246000fd5b50919050565b6107cc80620005926000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220887af7eba4d3f3d6334054ac570c07f1274d85013ffd1137e64c17b5cc13380864736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220887af7eba4d3f3d6334054ac570c07f1274d85013ffd1137e64c17b5cc13380864736f6c63430008090033", +- "devdoc": { +- "details": "The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate many different addresses in the AddressManager without transferring ownership of the AddressManager to a hot wallet or hardware wallet.", +- "kind": "dev", +- "methods": { +- "constructor": { +- "params": { +- "_addresses": "Array of addresses to associate with the name.", +- "_finalOwner": "Address to transfer AddressManager ownership to afterwards.", +- "_manager": "Address of the AddressManager contract.", +- "_names": "Array of names to associate an address with." +- } +- } +- }, +- "title": "AddressDictator", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "getNamedAddresses()": { +- "notice": "Returns the full namedAddresses array." +- }, +- "returnOwnership()": { +- "notice": "Transfers ownership of this contract to the finalOwner. Only callable by the Final Owner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong." +- }, +- "setAddresses()": { +- "notice": "Called to finalize the transfer, this function is callable by anyone, but will only result in an upgrade if this contract is the owner Address Manager." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 1908, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "manager", +- "offset": 0, +- "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" +- }, +- { +- "astId": 1910, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "finalOwner", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 1914, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "namedAddresses", +- "offset": 0, +- "slot": "2", +- "type": "t_array(t_struct(NamedAddress)1905_storage)dyn_storage" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_array(t_struct(NamedAddress)1905_storage)dyn_storage": { +- "base": "t_struct(NamedAddress)1905_storage", +- "encoding": "dynamic_array", +- "label": "struct AddressDictator.NamedAddress[]", +- "numberOfBytes": "32" +- }, +- "t_contract(Lib_AddressManager)6645": { +- "encoding": "inplace", +- "label": "contract Lib_AddressManager", +- "numberOfBytes": "20" +- }, +- "t_string_storage": { +- "encoding": "bytes", +- "label": "string", +- "numberOfBytes": "32" +- }, +- "t_struct(NamedAddress)1905_storage": { +- "encoding": "inplace", +- "label": "struct AddressDictator.NamedAddress", +- "members": [ +- { +- "astId": 1902, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "name", +- "offset": 0, +- "slot": "0", +- "type": "t_string_storage" +- }, +- { +- "astId": 1904, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "addr", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- } +- ], +- "numberOfBytes": "64" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/kovan/CanonicalTransactionChain.json +deleted file mode 100644 +index 08a0205..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/CanonicalTransactionChain.json ++++ /dev/null +@@ -1,748 +0,0 @@ +-{ +- "address": "0xf7B88A133202d41Fe5E2Ab22e6309a1A4D50AF74", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_libAddressManager", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_maxTransactionGasLimit", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_l2GasDiscountDivisor", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_enqueueGasCost", +- "type": "uint256" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "l2GasDiscountDivisor", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "enqueueGasCost", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "enqueueL2GasPrepaid", +- "type": "uint256" +- } +- ], +- "name": "L2GasParamsUpdated", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_startingQueueIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_numQueueElements", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_totalElements", +- "type": "uint256" +- } +- ], +- "name": "QueueBatchAppended", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_startingQueueIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_numQueueElements", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_totalElements", +- "type": "uint256" +- } +- ], +- "name": "SequencerBatchAppended", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "_batchIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes32", +- "name": "_batchRoot", +- "type": "bytes32" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_batchSize", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_prevTotalElements", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_extraData", +- "type": "bytes" +- } +- ], +- "name": "TransactionBatchAppended", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l1TxOrigin", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_target", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_gasLimit", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- }, +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "_queueIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_timestamp", +- "type": "uint256" +- } +- ], +- "name": "TransactionEnqueued", +- "type": "event" +- }, +- { +- "inputs": [], +- "name": "MAX_ROLLUP_TX_SIZE", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "MIN_ROLLUP_TX_GAS", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "appendSequencerBatch", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "batches", +- "outputs": [ +- { +- "internalType": "contract IChainStorageContainer", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_gasLimit", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "enqueue", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "enqueueGasCost", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "enqueueL2GasPrepaid", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getLastBlockNumber", +- "outputs": [ +- { +- "internalType": "uint40", +- "name": "", +- "type": "uint40" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getLastTimestamp", +- "outputs": [ +- { +- "internalType": "uint40", +- "name": "", +- "type": "uint40" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getNextQueueIndex", +- "outputs": [ +- { +- "internalType": "uint40", +- "name": "", +- "type": "uint40" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getNumPendingQueueElements", +- "outputs": [ +- { +- "internalType": "uint40", +- "name": "", +- "type": "uint40" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_index", +- "type": "uint256" +- } +- ], +- "name": "getQueueElement", +- "outputs": [ +- { +- "components": [ +- { +- "internalType": "bytes32", +- "name": "transactionHash", +- "type": "bytes32" +- }, +- { +- "internalType": "uint40", +- "name": "timestamp", +- "type": "uint40" +- }, +- { +- "internalType": "uint40", +- "name": "blockNumber", +- "type": "uint40" +- } +- ], +- "internalType": "struct Lib_OVMCodec.QueueElement", +- "name": "_element", +- "type": "tuple" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getQueueLength", +- "outputs": [ +- { +- "internalType": "uint40", +- "name": "", +- "type": "uint40" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getTotalBatches", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "_totalBatches", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getTotalElements", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "_totalElements", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "l2GasDiscountDivisor", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "libAddressManager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "maxTransactionGasLimit", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "string", +- "name": "_name", +- "type": "string" +- } +- ], +- "name": "resolve", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint256", +- "name": "_l2GasDiscountDivisor", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_enqueueGasCost", +- "type": "uint256" +- } +- ], +- "name": "setGasParams", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "transactionHash": "0xe4fb26d1c51dde7e7095f6aa3af54224e2b4ba98a2dab2fc0de52e53dbd61a31", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0xf7B88A133202d41Fe5E2Ab22e6309a1A4D50AF74", +- "transactionIndex": 1, +- "gasUsed": "1577250", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x99d92f2d93743b167489a7353b222472f290c4a19cd09fc8351dacd1df4b7770", +- "transactionHash": "0xe4fb26d1c51dde7e7095f6aa3af54224e2b4ba98a2dab2fc0de52e53dbd61a31", +- "logs": [], +- "blockNumber": 27989623, +- "cumulativeGasUsed": "1816263", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- 15000000, +- 32, +- 60000 +- ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x9e7772f17c6ed75da8d10c47c1781d56ac08dcf7e93108e729157831db9b1125\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b5060405162001a9838038062001a9883398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b61199e80620000fa6000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220e14033f9f98984edb3353943a45655d112afab7b0a7aa8401f8826506d85b00164736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220e14033f9f98984edb3353943a45655d112afab7b0a7aa8401f8826506d85b00164736f6c63430008090033", +- "devdoc": { +- "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", +- "kind": "dev", +- "methods": { +- "appendSequencerBatch()": { +- "details": "This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data." +- }, +- "batches()": { +- "returns": { +- "_0": "Reference to the batch storage container." +- } +- }, +- "enqueue(address,uint256,bytes)": { +- "params": { +- "_data": "Transaction data.", +- "_gasLimit": "Gas limit for the enqueued L2 transaction.", +- "_target": "Target L2 contract to send the transaction to." +- } +- }, +- "getLastBlockNumber()": { +- "returns": { +- "_0": "Blocknumber for the last transaction." +- } +- }, +- "getLastTimestamp()": { +- "returns": { +- "_0": "Timestamp for the last transaction." +- } +- }, +- "getNextQueueIndex()": { +- "returns": { +- "_0": "Index for the next queue element." +- } +- }, +- "getNumPendingQueueElements()": { +- "returns": { +- "_0": "Number of pending queue elements." +- } +- }, +- "getQueueElement(uint256)": { +- "params": { +- "_index": "Index of the queue element to access." +- }, +- "returns": { +- "_element": "Queue element at the given index." +- } +- }, +- "getQueueLength()": { +- "returns": { +- "_0": "Length of the queue." +- } +- }, +- "getTotalBatches()": { +- "returns": { +- "_totalBatches": "Total submitted batches." +- } +- }, +- "getTotalElements()": { +- "returns": { +- "_totalElements": "Total submitted elements." +- } +- }, +- "resolve(string)": { +- "params": { +- "_name": "Name to resolve an address for." +- }, +- "returns": { +- "_0": "Address associated with the given name." +- } +- } +- }, +- "title": "CanonicalTransactionChain", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "appendSequencerBatch()": { +- "notice": "Allows the sequencer to append a batch of transactions." +- }, +- "batches()": { +- "notice": "Accesses the batch storage container." +- }, +- "enqueue(address,uint256,bytes)": { +- "notice": "Adds a transaction to the queue." +- }, +- "getLastBlockNumber()": { +- "notice": "Returns the blocknumber of the last transaction." +- }, +- "getLastTimestamp()": { +- "notice": "Returns the timestamp of the last transaction." +- }, +- "getNextQueueIndex()": { +- "notice": "Returns the index of the next element to be enqueued." +- }, +- "getNumPendingQueueElements()": { +- "notice": "Get the number of queue elements which have not yet been included." +- }, +- "getQueueElement(uint256)": { +- "notice": "Gets the queue element at a particular index." +- }, +- "getQueueLength()": { +- "notice": "Retrieves the length of the queue, including both pending and canonical transactions." +- }, +- "getTotalBatches()": { +- "notice": "Retrieves the total number of batches submitted." +- }, +- "getTotalElements()": { +- "notice": "Retrieves the total number of elements submitted." +- }, +- "resolve(string)": { +- "notice": "Resolves the address associated with a given name." +- }, +- "setGasParams(uint256,uint256)": { +- "notice": "Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 6653, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "libAddressManager", +- "offset": 0, +- "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" +- }, +- { +- "astId": 3291, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "enqueueGasCost", +- "offset": 0, +- "slot": "1", +- "type": "t_uint256" +- }, +- { +- "astId": 3293, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "l2GasDiscountDivisor", +- "offset": 0, +- "slot": "2", +- "type": "t_uint256" +- }, +- { +- "astId": 3295, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "enqueueL2GasPrepaid", +- "offset": 0, +- "slot": "3", +- "type": "t_uint256" +- }, +- { +- "astId": 3312, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "maxTransactionGasLimit", +- "offset": 0, +- "slot": "4", +- "type": "t_uint256" +- }, +- { +- "astId": 3314, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "_nextQueueIndex", +- "offset": 0, +- "slot": "5", +- "type": "t_uint40" +- }, +- { +- "astId": 3318, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "queueElements", +- "offset": 0, +- "slot": "6", +- "type": "t_array(t_struct(QueueElement)6395_storage)dyn_storage" +- } +- ], +- "types": { +- "t_array(t_struct(QueueElement)6395_storage)dyn_storage": { +- "base": "t_struct(QueueElement)6395_storage", +- "encoding": "dynamic_array", +- "label": "struct Lib_OVMCodec.QueueElement[]", +- "numberOfBytes": "32" +- }, +- "t_bytes32": { +- "encoding": "inplace", +- "label": "bytes32", +- "numberOfBytes": "32" +- }, +- "t_contract(Lib_AddressManager)6645": { +- "encoding": "inplace", +- "label": "contract Lib_AddressManager", +- "numberOfBytes": "20" +- }, +- "t_struct(QueueElement)6395_storage": { +- "encoding": "inplace", +- "label": "struct Lib_OVMCodec.QueueElement", +- "members": [ +- { +- "astId": 6390, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "transactionHash", +- "offset": 0, +- "slot": "0", +- "type": "t_bytes32" +- }, +- { +- "astId": 6392, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "timestamp", +- "offset": 0, +- "slot": "1", +- "type": "t_uint40" +- }, +- { +- "astId": 6394, +- "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", +- "label": "blockNumber", +- "offset": 5, +- "slot": "1", +- "type": "t_uint40" +- } +- ], +- "numberOfBytes": "64" +- }, +- "t_uint256": { +- "encoding": "inplace", +- "label": "uint256", +- "numberOfBytes": "32" +- }, +- "t_uint40": { +- "encoding": "inplace", +- "label": "uint40", +- "numberOfBytes": "5" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/ChugSplashDictator.json b/node_modules/@eth-optimism/contracts/deployments/kovan/ChugSplashDictator.json +deleted file mode 100644 +index 1ad7e9f..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/ChugSplashDictator.json ++++ /dev/null +@@ -1,305 +0,0 @@ +-{ +- "address": "0x23d87F2792C2ca58E5C1b7BD831B0fbDDEEe0ED9", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "bytes32", +- "name": "_codeHash", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotVal", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotVal", +- "type": "bytes32" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "codeHash", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes", +- "name": "_code", +- "type": "bytes" +- } +- ], +- "name": "doActions", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "isUpgrading", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "target", +- "outputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- } +- ], +- "transactionHash": "0x082e5ad96da85f8ead6c24d846ff1d2f3b46121ac10c38949e719f6833054f30", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0x23d87F2792C2ca58E5C1b7BD831B0fbDDEEe0ED9", +- "transactionIndex": 1, +- "gasUsed": "600240", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xe1e21e62c7f1c62c44759774a511d3f24073ec2c1adad1ab6ab3377bc8adf9c4", +- "transactionHash": "0x082e5ad96da85f8ead6c24d846ff1d2f3b46121ac10c38949e719f6833054f30", +- "logs": [], +- "blockNumber": 27989737, +- "cumulativeGasUsed": "635598", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0x22F24361D548e5FaAfb36d1437839f080363982B", +- "0x18394B52d3Cb931dfA76F63251919D051953413d", +- "0x395448fabf9c422ff29a22e5b39869e32d00ca911f7553ec25591d8d47befaa1", +- "0x0000000000000000000000000000000000000000000000000000000000000000", +- "0x0000000000000000000000004361d0F75A0186C05f971c566dC6bEa5957483fD", +- "0x0000000000000000000000000000000000000000000000000000000000000001", +- "0x0000000000000000000000004200000000000000000000000000000000000010" +- ], +- "solcInputHash": "475653b7e5822844bbc8885f604f5e79", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_finalOwner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_codeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotVal\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotVal\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"bridgeSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"codeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"doActions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"returnOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"ChugSplashDictator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"returnOwnership()\":{\"notice\":\"Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":\"ChugSplashDictator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { L1ChugSplashProxy } from \\\"../../chugsplash/L1ChugSplashProxy.sol\\\";\\nimport { iL1ChugSplashDeployer } from \\\"../../chugsplash/interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title ChugSplashDictator\\n * @dev Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're\\n * working on a generalized version of this but this is good enough for the moment.\\n */\\ncontract ChugSplashDictator is iL1ChugSplashDeployer {\\n /*************\\n * Variables *\\n *************/\\n\\n bool public isUpgrading = true;\\n L1ChugSplashProxy public target;\\n address public finalOwner;\\n bytes32 public codeHash;\\n bytes32 public messengerSlotKey;\\n bytes32 public messengerSlotVal;\\n bytes32 public bridgeSlotKey;\\n bytes32 public bridgeSlotVal;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n L1ChugSplashProxy _target,\\n address _finalOwner,\\n bytes32 _codeHash,\\n bytes32 _messengerSlotKey,\\n bytes32 _messengerSlotVal,\\n bytes32 _bridgeSlotKey,\\n bytes32 _bridgeSlotVal\\n ) {\\n target = _target;\\n finalOwner = _finalOwner;\\n codeHash = _codeHash;\\n messengerSlotKey = _messengerSlotKey;\\n messengerSlotVal = _messengerSlotVal;\\n bridgeSlotKey = _bridgeSlotKey;\\n bridgeSlotVal = _bridgeSlotVal;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function doActions(bytes memory _code) external {\\n require(keccak256(_code) == codeHash, \\\"ChugSplashDictator: Incorrect code hash.\\\");\\n\\n target.setCode(_code);\\n target.setStorage(messengerSlotKey, messengerSlotVal);\\n target.setStorage(bridgeSlotKey, bridgeSlotVal);\\n target.setOwner(finalOwner);\\n }\\n\\n /**\\n * Transfers ownership of this contract to the finalOwner.\\n * Only callable by the finalOwner, which is intended to be our multisig.\\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can\\n * recover if something really surprising goes wrong.\\n */\\n function returnOwnership() external {\\n require(msg.sender == finalOwner, \\\"ChugSplashDictator: only callable by finalOwner\\\");\\n\\n target.setOwner(finalOwner);\\n }\\n}\\n\",\"keccak256\":\"0xd6b7d80400d6cafd7d65c00715f3f03305537e96b25ff75f13f5c3163e81256c\",\"license\":\"MIT\"},\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc30cc735cf86431bd2234a3689d536aa76e5765522ff9f5b7c160deed85fa099\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040526000805460ff1916600117905534801561001d57600080fd5b5060405161088338038061088383398101604081905261003c916100a8565b60008054610100600160a81b0319166101006001600160a01b03998a1602179055600180546001600160a01b031916969097169590951790955560029290925560035560045560059190915560065561010f565b6001600160a01b03811681146100a557600080fd5b50565b600080600080600080600060e0888a0312156100c357600080fd5b87516100ce81610090565b60208901519097506100df81610090565b604089015160608a015160808b015160a08c015160c0909c01519a9d939c50919a90999198509650945092505050565b6107658061011e6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220ea63e0ffbf6691431ee73a4c29831d3972b1c90e51eb75830c3242850fd79a1c64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220ea63e0ffbf6691431ee73a4c29831d3972b1c90e51eb75830c3242850fd79a1c64736f6c63430008090033", +- "devdoc": { +- "details": "Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.", +- "kind": "dev", +- "methods": {}, +- "title": "ChugSplashDictator", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "returnOwnership()": { +- "notice": "Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 11, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "isUpgrading", +- "offset": 0, +- "slot": "0", +- "type": "t_bool" +- }, +- { +- "astId": 14, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "target", +- "offset": 1, +- "slot": "0", +- "type": "t_contract(L1ChugSplashProxy)420" +- }, +- { +- "astId": 16, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "finalOwner", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 18, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "codeHash", +- "offset": 0, +- "slot": "2", +- "type": "t_bytes32" +- }, +- { +- "astId": 20, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "messengerSlotKey", +- "offset": 0, +- "slot": "3", +- "type": "t_bytes32" +- }, +- { +- "astId": 22, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "messengerSlotVal", +- "offset": 0, +- "slot": "4", +- "type": "t_bytes32" +- }, +- { +- "astId": 24, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "bridgeSlotKey", +- "offset": 0, +- "slot": "5", +- "type": "t_bytes32" +- }, +- { +- "astId": 26, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "bridgeSlotVal", +- "offset": 0, +- "slot": "6", +- "type": "t_bytes32" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_bool": { +- "encoding": "inplace", +- "label": "bool", +- "numberOfBytes": "1" +- }, +- "t_bytes32": { +- "encoding": "inplace", +- "label": "bytes32", +- "numberOfBytes": "32" +- }, +- "t_contract(L1ChugSplashProxy)420": { +- "encoding": "inplace", +- "label": "contract L1ChugSplashProxy", +- "numberOfBytes": "20" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/L1StandardBridge_for_verification_only.json b/node_modules/@eth-optimism/contracts/deployments/kovan/L1StandardBridge_for_verification_only.json +deleted file mode 100644 +index cb2bc78..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/L1StandardBridge_for_verification_only.json ++++ /dev/null +@@ -1,577 +0,0 @@ +-{ +- "address": "0x51bB1dc7Ebb531539f6F8349D4177255A9994d1C", +- "abi": [ +- { +- "inputs": [], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ERC20DepositInitiated", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ERC20WithdrawalFinalized", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ETHDepositInitiated", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ETHWithdrawalFinalized", +- "type": "event" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositERC20", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositERC20To", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositETH", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositETHTo", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "name": "deposits", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "donateETH", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "finalizeERC20Withdrawal", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "finalizeETHWithdrawal", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1messenger", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2TokenBridge", +- "type": "address" +- } +- ], +- "name": "initialize", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "l2TokenBridge", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messenger", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "stateMutability": "payable", +- "type": "receive" +- } +- ], +- "transactionHash": "0x83c9f89b60bc7e2f7b909405a558c3a6fbae83840a7cc091462f4f378bba9bf4", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0x51bB1dc7Ebb531539f6F8349D4177255A9994d1C", +- "transactionIndex": 4, +- "gasUsed": "1467253", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x2efebeba73ff134b303a509cbf3355879dab5d3caacf95fa69645eebe12d37c6", +- "transactionHash": "0x83c9f89b60bc7e2f7b909405a558c3a6fbae83840a7cc091462f4f378bba9bf4", +- "logs": [], +- "blockNumber": 27989807, +- "cumulativeGasUsed": "1791310", +- "status": 1, +- "byzantium": true +- }, +- "args": [], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ERC20DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ERC20WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ETHDepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ETHWithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeERC20Withdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeETHWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2TokenBridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2TokenBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits and listening to it for newly finalized withdrawals. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"depositERC20(address,address,uint256,uint32,bytes)\":{\"details\":\"deposit an amount of the ERC20 to the caller's balance on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l1Token\":\"Address of the L1 ERC20 we are depositing\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_l2Token\":\"Address of the L1 respective L2 ERC20\"}},\"depositERC20To(address,address,address,uint256,uint32,bytes)\":{\"details\":\"deposit an amount of ERC20 to a recipient's balance on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l1Token\":\"Address of the L1 ERC20 we are depositing\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_l2Token\":\"Address of the L1 respective L2 ERC20\",\"_to\":\"L2 address to credit the withdrawal to.\"}},\"depositETH(uint32,bytes)\":{\"details\":\"Deposit an amount of the ETH to the caller's balance on L2.\",\"params\":{\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\"}},\"depositETHTo(address,uint32,bytes)\":{\"details\":\"Deposit an amount of ETH to a recipient's balance on L2.\",\"params\":{\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_to\":\"L2 address to credit the withdrawal to.\"}},\"donateETH()\":{\"details\":\"Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway. NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract\"},\"finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ERC20 token. This call will fail if the initialized withdrawal from L2 has not been finalized.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Data provided by the sender on L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_from\":\"L2 address initiating the transfer.\",\"_l1Token\":\"Address of L1 token to finalizeWithdrawal for.\",\"_l2Token\":\"Address of L2 token where withdrawal was initiated.\",\"_to\":\"L1 address to credit the withdrawal to.\"}},\"finalizeETHWithdrawal(address,address,uint256,bytes)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_from\":\"L2 address initiating the transfer.\",\"_to\":\"L1 address to credit the withdrawal to.\"}},\"initialize(address,address)\":{\"params\":{\"_l1messenger\":\"L1 Messenger address being used for cross-chain communications.\",\"_l2TokenBridge\":\"L2 standard bridge address.\"}}},\"stateVariables\":{\"l2TokenBridge\":{\"details\":\"get the address of the corresponding L2 bridge contract.\",\"return\":\"Address of the corresponding L2 bridge contract.\",\"returns\":{\"_0\":\"Address of the corresponding L2 bridge contract.\"}}},\"title\":\"L1StandardBridge\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1StandardBridge.sol\":\"L1StandardBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n assembly {\\n size := extcodesize(account)\\n }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1ERC20Bridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IL1ERC20Bridge\\n */\\ninterface IL1ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n\\n event ERC20DepositInitiated(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event ERC20WithdrawalFinalized(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev get the address of the corresponding L2 bridge contract.\\n * @return Address of the corresponding L2 bridge contract.\\n */\\n function l2TokenBridge() external returns (address);\\n\\n /**\\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _amount Amount of the ERC20 to deposit\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositERC20(\\n address _l1Token,\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external;\\n\\n /**\\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _to L2 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositERC20To(\\n address _l1Token,\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ERC20 token.\\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\\n *\\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\\n * @param _l2Token Address of L2 token where withdrawal was initiated.\\n * @param _from L2 address initiating the transfer.\\n * @param _to L1 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _data Data provided by the sender on L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeERC20Withdrawal(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x69f831896dcbb6bef4f2d6c8be6cd1bf352f5910074d3ce973b9f8e0a4f4c1dd\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1StandardBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\nimport \\\"./IL1ERC20Bridge.sol\\\";\\n\\n/**\\n * @title IL1StandardBridge\\n */\\ninterface IL1StandardBridge is IL1ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n event ETHDepositInitiated(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event ETHWithdrawalFinalized(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\\n\\n /**\\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\\n * @param _to L2 address to credit the withdrawal to.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositETHTo(\\n address _to,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\\n * before the withdrawal is finalized.\\n * @param _from L2 address initiating the transfer.\\n * @param _to L1 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeETHWithdrawal(\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x3d511f1bcea86aa88a9c41798926ea75b5b3f455c0377e63223a123a9e714ddc\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1StandardBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IL1StandardBridge } from \\\"./IL1StandardBridge.sol\\\";\\nimport { IL1ERC20Bridge } from \\\"./IL1ERC20Bridge.sol\\\";\\nimport { IL2ERC20Bridge } from \\\"../../L2/messaging/IL2ERC20Bridge.sol\\\";\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\n/* Library Imports */\\nimport { CrossDomainEnabled } from \\\"../../libraries/bridge/CrossDomainEnabled.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport { SafeERC20 } from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/**\\n * @title L1StandardBridge\\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\\n * and listening to it for newly finalized withdrawals.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\\n using SafeERC20 for IERC20;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public l2TokenBridge;\\n\\n // Maps L1 token to L2 token to balance of the L1 token deposited\\n mapping(address => mapping(address => uint256)) public deposits;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor() CrossDomainEnabled(address(0)) {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\\n * @param _l2TokenBridge L2 standard bridge address.\\n */\\n function initialize(address _l1messenger, address _l2TokenBridge) public {\\n require(messenger == address(0), \\\"Contract has already been initialized.\\\");\\n messenger = _l1messenger;\\n l2TokenBridge = _l2TokenBridge;\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\\n * contract via initcode, but it takes care of the user error we want to avoid.\\n */\\n modifier onlyEOA() {\\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\\n require(!Address.isContract(msg.sender), \\\"Account not EOA\\\");\\n _;\\n }\\n\\n /**\\n * @dev This function can be called with no data\\n * to deposit an amount of ETH to the caller's balance on L2.\\n * Since the receive function doesn't take data, a conservative\\n * default amount is forwarded to L2.\\n */\\n receive() external payable onlyEOA {\\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\\\"\\\"));\\n }\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function depositETHTo(\\n address _to,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external payable {\\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\\n * the deposit.\\n * @param _from Account to pull the deposit from on L1.\\n * @param _to Account to give the deposit to on L2.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function _initiateETHDeposit(\\n address _from,\\n address _to,\\n uint32 _l2Gas,\\n bytes memory _data\\n ) internal {\\n // Construct calldata for finalizeDeposit call\\n bytes memory message = abi.encodeWithSelector(\\n IL2ERC20Bridge.finalizeDeposit.selector,\\n address(0),\\n Lib_PredeployAddresses.OVM_ETH,\\n _from,\\n _to,\\n msg.value,\\n _data\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\\n\\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function depositERC20(\\n address _l1Token,\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external virtual onlyEOA {\\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function depositERC20To(\\n address _l1Token,\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external virtual {\\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\\n *\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function _initiateERC20Deposit(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) internal {\\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\\n // _from is an EOA or address(0).\\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\\n\\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\\n bytes memory message = abi.encodeWithSelector(\\n IL2ERC20Bridge.finalizeDeposit.selector,\\n _l1Token,\\n _l2Token,\\n _from,\\n _to,\\n _amount,\\n _data\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\\n\\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\\n\\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function finalizeETHWithdrawal(\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\\n require(success, \\\"TransferHelper::safeTransferETH: ETH transfer failed\\\");\\n\\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function finalizeERC20Withdrawal(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\\n\\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\\n IERC20(_l1Token).safeTransfer(_to, _amount);\\n\\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\\n }\\n\\n /*****************************\\n * Temporary - Migrating ETH *\\n *****************************/\\n\\n /**\\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\\n * to be migrated from an old gateway to a new gateway.\\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\\n * old contract\\n */\\n function donateETH() external payable {}\\n}\\n\",\"keccak256\":\"0x595295916d768e901f2b55589871ebd130b202cb2a9de6ba038382fbb058adaa\",\"license\":\"MIT\"},\"contracts/L2/messaging/IL2ERC20Bridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IL2ERC20Bridge\\n */\\ninterface IL2ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event DepositFinalized(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event DepositFailed(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev get the address of the corresponding L1 bridge contract.\\n * @return Address of the corresponding L1 bridge contract.\\n */\\n function l1TokenBridge() external returns (address);\\n\\n /**\\n * @dev initiate a withdraw of some tokens to the caller's account on L1\\n * @param _l2Token Address of L2 token where withdrawal was initiated.\\n * @param _amount Amount of the token to withdraw.\\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\\n * @param _data Optional data to forward to L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function withdraw(\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l1Gas,\\n bytes calldata _data\\n ) external;\\n\\n /**\\n * @dev initiate a withdraw of some token to a recipient's account on L1.\\n * @param _l2Token Address of L2 token where withdrawal is initiated.\\n * @param _to L1 adress to credit the withdrawal to.\\n * @param _amount Amount of the token to withdraw.\\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\\n * @param _data Optional data to forward to L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function withdrawTo(\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l1Gas,\\n bytes calldata _data\\n ) external;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\\n * L1StandardTokenBridge.\\n * @param _l1Token Address for the l1 token this is called with\\n * @param _l2Token Address for the l2 token this is called with\\n * @param _from Account to pull the deposit from on L2.\\n * @param _to Address to receive the withdrawal at\\n * @param _amount Amount of the token to withdraw\\n * @param _data Data provider by the sender on L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeDeposit(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x4674c3c8733ca0db16c2b81d58227560df36a07ded3b637a0793564d90ac0475\",\"license\":\"MIT\"},\"contracts/libraries/bridge/CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"./ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract CrossDomainEnabled {\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(address _messenger) {\\n messenger = _messenger;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used.\\n */\\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\\n return ICrossDomainMessenger(messenger);\\n }\\n\\n /**q\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _message The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n uint32 _gasLimit,\\n bytes memory _message\\n ) internal {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x196609a9af91807d89f2d781c637a049bdc64c2d29ebed4b758b0a342576c4eb\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0x2bc28307af93e9716151a41a81694b56cbe513ef5eb335fb1d81f35e5db8edfa\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916905561199e806100306000396000f3fe6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220d862fb20d11a0a1fd01b325278c9f5c2c492f9915c195c3e0f9e8c458fdb424464736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220d862fb20d11a0a1fd01b325278c9f5c2c492f9915c195c3e0f9e8c458fdb424464736f6c63430008090033", +- "devdoc": { +- "details": "The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits and listening to it for newly finalized withdrawals. Runtime target: EVM", +- "kind": "dev", +- "methods": { +- "depositERC20(address,address,uint256,uint32,bytes)": { +- "details": "deposit an amount of the ERC20 to the caller's balance on L2.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l1Token": "Address of the L1 ERC20 we are depositing", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_l2Token": "Address of the L1 respective L2 ERC20" +- } +- }, +- "depositERC20To(address,address,address,uint256,uint32,bytes)": { +- "details": "deposit an amount of ERC20 to a recipient's balance on L2.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l1Token": "Address of the L1 ERC20 we are depositing", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_l2Token": "Address of the L1 respective L2 ERC20", +- "_to": "L2 address to credit the withdrawal to." +- } +- }, +- "depositETH(uint32,bytes)": { +- "details": "Deposit an amount of the ETH to the caller's balance on L2.", +- "params": { +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l2Gas": "Gas limit required to complete the deposit on L2." +- } +- }, +- "depositETHTo(address,uint32,bytes)": { +- "details": "Deposit an amount of ETH to a recipient's balance on L2.", +- "params": { +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_to": "L2 address to credit the withdrawal to." +- } +- }, +- "donateETH()": { +- "details": "Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway. NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract" +- }, +- "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": { +- "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ERC20 token. This call will fail if the initialized withdrawal from L2 has not been finalized.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Data provided by the sender on L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_from": "L2 address initiating the transfer.", +- "_l1Token": "Address of L1 token to finalizeWithdrawal for.", +- "_l2Token": "Address of L2 token where withdrawal was initiated.", +- "_to": "L1 address to credit the withdrawal to." +- } +- }, +- "finalizeETHWithdrawal(address,address,uint256,bytes)": { +- "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_from": "L2 address initiating the transfer.", +- "_to": "L1 address to credit the withdrawal to." +- } +- }, +- "initialize(address,address)": { +- "params": { +- "_l1messenger": "L1 Messenger address being used for cross-chain communications.", +- "_l2TokenBridge": "L2 standard bridge address." +- } +- } +- }, +- "stateVariables": { +- "l2TokenBridge": { +- "details": "get the address of the corresponding L2 bridge contract.", +- "return": "Address of the corresponding L2 bridge contract.", +- "returns": { +- "_0": "Address of the corresponding L2 bridge contract." +- } +- } +- }, +- "title": "L1StandardBridge", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": {}, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 6180, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "messenger", +- "offset": 0, +- "slot": "0", +- "type": "t_address" +- }, +- { +- "astId": 2874, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "l2TokenBridge", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 2880, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "deposits", +- "offset": 0, +- "slot": "2", +- "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_mapping(t_address,t_mapping(t_address,t_uint256))": { +- "encoding": "mapping", +- "key": "t_address", +- "label": "mapping(address => mapping(address => uint256))", +- "numberOfBytes": "32", +- "value": "t_mapping(t_address,t_uint256)" +- }, +- "t_mapping(t_address,t_uint256)": { +- "encoding": "mapping", +- "key": "t_address", +- "label": "mapping(address => uint256)", +- "numberOfBytes": "32", +- "value": "t_uint256" +- }, +- "t_uint256": { +- "encoding": "inplace", +- "label": "uint256", +- "numberOfBytes": "32" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/kovan/Lib_AddressManager.json +deleted file mode 100644 +index db23166..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/Lib_AddressManager.json ++++ /dev/null +@@ -1,236 +0,0 @@ +-{ +- "address": "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- "abi": [ +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "string", +- "name": "_name", +- "type": "string" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_newAddress", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_oldAddress", +- "type": "address" +- } +- ], +- "name": "AddressSet", +- "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" +- }, +- { +- "inputs": [ +- { +- "internalType": "string", +- "name": "_name", +- "type": "string" +- } +- ], +- "name": "getAddress", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "owner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "renounceOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "string", +- "name": "_name", +- "type": "string" +- }, +- { +- "internalType": "address", +- "name": "_address", +- "type": "address" +- } +- ], +- "name": "setAddress", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "newOwner", +- "type": "address" +- } +- ], +- "name": "transferOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "transactionHash": "0xbbd41dab9d866d6f6dd54bdcb8fa1f3d9f30f90b8a4dd3d7a787f3d7e2153c2f", +- "receipt": { +- "to": null, +- "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", +- "contractAddress": "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- "transactionIndex": 0, +- "gasUsed": "425357", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000802000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000400000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xbf734613bf7986a5dc030db6a4d5456f3fffff14522984b5597e8e1e78b1ac77", +- "transactionHash": "0xbbd41dab9d866d6f6dd54bdcb8fa1f3d9f30f90b8a4dd3d7a787f3d7e2153c2f", +- "logs": [ +- { +- "transactionIndex": 0, +- "blockNumber": 25502548, +- "transactionHash": "0xbbd41dab9d866d6f6dd54bdcb8fa1f3d9f30f90b8a4dd3d7a787f3d7e2153c2f", +- "address": "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- "topics": [ +- "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", +- "0x0000000000000000000000000000000000000000000000000000000000000000", +- "0x00000000000000000000000018394b52d3cb931dfa76f63251919d051953413d" +- ], +- "data": "0x", +- "logIndex": 0, +- "blockHash": "0xbf734613bf7986a5dc030db6a4d5456f3fffff14522984b5597e8e1e78b1ac77" +- } +- ], +- "blockNumber": 25502548, +- "cumulativeGasUsed": "425357", +- "status": 1, +- "byzantium": true +- }, +- "args": [], +- "solcInputHash": "ef3f334bac4d7e77d91b457a0d89ab0a", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106478061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061042d945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661045c565b61020f610570565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610570565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061035383610574565b60008181526001602090815260409182902080546001600160a01b038781166001600160a01b0319831617909255925187519495509216928692918291908401908083835b602083106103b75780518252601f199092019160209182019101610398565b51815160001960209485036101000a01908116901991909116179052604080519490920184900384206001600160a01b03808b16865288169185019190915281519095507f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c94509283900301919050a250505050565b60006001600061043c84610574565b81526020810191909152604001600020546001600160a01b031692915050565b610464610570565b6001600160a01b03166104756102c5565b6001600160a01b0316146104d0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166105155760405162461bcd60e51b81526004018080602001828103825260268152602001806105ec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105a95780518252601f19909201916020918201910161058a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a2646970667358221220b47b03a0c984a0faed73425d34ee172acb8f5010c64751f78c7f645cf8dc2aad64736f6c63430007060033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061042d945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661045c565b61020f610570565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610570565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061035383610574565b60008181526001602090815260409182902080546001600160a01b038781166001600160a01b0319831617909255925187519495509216928692918291908401908083835b602083106103b75780518252601f199092019160209182019101610398565b51815160001960209485036101000a01908116901991909116179052604080519490920184900384206001600160a01b03808b16865288169185019190915281519095507f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c94509283900301919050a250505050565b60006001600061043c84610574565b81526020810191909152604001600020546001600160a01b031692915050565b610464610570565b6001600160a01b03166104756102c5565b6001600160a01b0316146104d0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166105155760405162461bcd60e51b81526004018080602001828103825260268152602001806105ec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105a95780518252601f19909201916020918201910161058a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a2646970667358221220b47b03a0c984a0faed73425d34ee172acb8f5010c64751f78c7f645cf8dc2aad64736f6c63430007060033", +- "devdoc": { +- "kind": "dev", +- "methods": { +- "getAddress(string)": { +- "params": { +- "_name": "Name to retrieve an address for." +- }, +- "returns": { +- "_0": "Address associated with the given name." +- } +- }, +- "owner()": { +- "details": "Returns the address of the current owner." +- }, +- "renounceOwnership()": { +- "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." +- }, +- "setAddress(string,address)": { +- "params": { +- "_address": "Address to associate with the name.", +- "_name": "String name to associate an address with." +- } +- }, +- "transferOwnership(address)": { +- "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." +- } +- }, +- "title": "Lib_AddressManager", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "getAddress(string)": { +- "notice": "Retrieves the address associated with a given name." +- }, +- "setAddress(string,address)": { +- "notice": "Changes the address associated with a particular name." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 664, +- "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", +- "label": "_owner", +- "offset": 0, +- "slot": "0", +- "type": "t_address" +- }, +- { +- "astId": 15229, +- "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", +- "label": "addresses", +- "offset": 0, +- "slot": "1", +- "type": "t_mapping(t_bytes32,t_address)" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_bytes32": { +- "encoding": "inplace", +- "label": "bytes32", +- "numberOfBytes": "32" +- }, +- "t_mapping(t_bytes32,t_address)": { +- "encoding": "mapping", +- "key": "t_bytes32", +- "label": "mapping(bytes32 => address)", +- "numberOfBytes": "32", +- "value": "t_address" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json +deleted file mode 100644 +index 4b870eb..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/OVM_L1CrossDomainMessenger.json ++++ /dev/null +@@ -1,780 +0,0 @@ +-{ +- "address": "0xaF91349fdf3B206E079A8FcaB7b8dFaFB96A654D", +- "abi": [ +- { +- "inputs": [], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "bytes32", +- "name": "msgHash", +- "type": "bytes32" +- } +- ], +- "name": "FailedRelayedMessage", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "bytes32", +- "name": "_xDomainCalldataHash", +- "type": "bytes32" +- } +- ], +- "name": "MessageAllowed", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "bytes32", +- "name": "_xDomainCalldataHash", +- "type": "bytes32" +- } +- ], +- "name": "MessageBlocked", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "previousOwner", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "newOwner", +- "type": "address" +- } +- ], +- "name": "OwnershipTransferred", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "address", +- "name": "account", +- "type": "address" +- } +- ], +- "name": "Paused", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "bytes32", +- "name": "msgHash", +- "type": "bytes32" +- } +- ], +- "name": "RelayedMessage", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "target", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "sender", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "message", +- "type": "bytes" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "messageNonce", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "gasLimit", +- "type": "uint256" +- } +- ], +- "name": "SentMessage", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": false, +- "internalType": "address", +- "name": "account", +- "type": "address" +- } +- ], +- "name": "Unpaused", +- "type": "event" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "_xDomainCalldataHash", +- "type": "bytes32" +- } +- ], +- "name": "allowMessage", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "_xDomainCalldataHash", +- "type": "bytes32" +- } +- ], +- "name": "blockMessage", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "name": "blockedMessages", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_libAddressManager", +- "type": "address" +- } +- ], +- "name": "initialize", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "libAddressManager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "owner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "pause", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "paused", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_sender", +- "type": "address" +- }, +- { +- "internalType": "bytes", +- "name": "_message", +- "type": "bytes" +- }, +- { +- "internalType": "uint256", +- "name": "_messageNonce", +- "type": "uint256" +- }, +- { +- "components": [ +- { +- "internalType": "bytes32", +- "name": "stateRoot", +- "type": "bytes32" +- }, +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "batchIndex", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32", +- "name": "batchRoot", +- "type": "bytes32" +- }, +- { +- "internalType": "uint256", +- "name": "batchSize", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "prevTotalElements", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "extraData", +- "type": "bytes" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainBatchHeader", +- "name": "stateRootBatchHeader", +- "type": "tuple" +- }, +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "index", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32[]", +- "name": "siblings", +- "type": "bytes32[]" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainInclusionProof", +- "name": "stateRootProof", +- "type": "tuple" +- }, +- { +- "internalType": "bytes", +- "name": "stateTrieWitness", +- "type": "bytes" +- }, +- { +- "internalType": "bytes", +- "name": "storageTrieWitness", +- "type": "bytes" +- } +- ], +- "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", +- "name": "_proof", +- "type": "tuple" +- } +- ], +- "name": "relayMessage", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "name": "relayedMessages", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "renounceOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_sender", +- "type": "address" +- }, +- { +- "internalType": "bytes", +- "name": "_message", +- "type": "bytes" +- }, +- { +- "internalType": "uint256", +- "name": "_queueIndex", +- "type": "uint256" +- }, +- { +- "internalType": "uint32", +- "name": "_oldGasLimit", +- "type": "uint32" +- }, +- { +- "internalType": "uint32", +- "name": "_newGasLimit", +- "type": "uint32" +- } +- ], +- "name": "replayMessage", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "string", +- "name": "_name", +- "type": "string" +- } +- ], +- "name": "resolve", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "bytes", +- "name": "_message", +- "type": "bytes" +- }, +- { +- "internalType": "uint32", +- "name": "_gasLimit", +- "type": "uint32" +- } +- ], +- "name": "sendMessage", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "name": "successfulMessages", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "newOwner", +- "type": "address" +- } +- ], +- "name": "transferOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "xDomainMessageSender", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- } +- ], +- "transactionHash": "0x499695b058246c50903fa9c86f967549cbb2d97f35ffe48fd392217b4a1bcebc", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0xaF91349fdf3B206E079A8FcaB7b8dFaFB96A654D", +- "transactionIndex": 5, +- "gasUsed": "3394374", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xba320e9c46f88b4b63fd75b712725ebfa44a0ba93f67757cadfc0be0ccffdcb9", +- "transactionHash": "0x499695b058246c50903fa9c86f967549cbb2d97f35ffe48fd392217b4a1bcebc", +- "logs": [], +- "blockNumber": 27989627, +- "cumulativeGasUsed": "3851980", +- "status": 1, +- "byzantium": true +- }, +- "args": [], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbbf12d15d392f819cffe3f71aed2d65b6aed2f943ea78fdf046534622785aaff\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0x2bc28307af93e9716151a41a81694b56cbe513ef5eb335fb1d81f35e5db8edfa\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x608060405260cc80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c54806100446000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea26469706673582212209e0153d10142c4c28c6e3b5fe87c4f9f3e12f0acdc7b9f2e0b67f55f3257cfb464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea26469706673582212209e0153d10142c4c28c6e3b5fe87c4f9f3e12f0acdc7b9f2e0b67f55f3257cfb464736f6c63430008090033", +- "devdoc": { +- "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", +- "kind": "dev", +- "methods": { +- "allowMessage(bytes32)": { +- "params": { +- "_xDomainCalldataHash": "Hash of the message to block." +- } +- }, +- "blockMessage(bytes32)": { +- "params": { +- "_xDomainCalldataHash": "Hash of the message to block." +- } +- }, +- "initialize(address)": { +- "params": { +- "_libAddressManager": "Address of the Address Manager." +- } +- }, +- "owner()": { +- "details": "Returns the address of the current owner." +- }, +- "paused()": { +- "details": "Returns true if the contract is paused, and false otherwise." +- }, +- "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { +- "params": { +- "_message": "Message to send to the target.", +- "_messageNonce": "Nonce for the provided message.", +- "_proof": "Inclusion proof for the given message.", +- "_sender": "Message sender address.", +- "_target": "Target contract address." +- } +- }, +- "renounceOwnership()": { +- "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." +- }, +- "replayMessage(address,address,bytes,uint256,uint32,uint32)": { +- "params": { +- "_message": "Message to send to the target.", +- "_newGasLimit": "New gas limit to be used for this message.", +- "_oldGasLimit": "Original gas limit used to send the message.", +- "_queueIndex": "CTC Queue index for the message to replay.", +- "_sender": "Original sender address.", +- "_target": "Target contract address." +- } +- }, +- "resolve(string)": { +- "params": { +- "_name": "Name to resolve an address for." +- }, +- "returns": { +- "_0": "Address associated with the given name." +- } +- }, +- "sendMessage(address,bytes,uint32)": { +- "params": { +- "_gasLimit": "Gas limit for the provided message.", +- "_message": "Message to send to the target.", +- "_target": "Target contract address." +- } +- }, +- "transferOwnership(address)": { +- "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." +- } +- }, +- "title": "L1CrossDomainMessenger", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "allowMessage(bytes32)": { +- "notice": "Allow a message." +- }, +- "blockMessage(bytes32)": { +- "notice": "Block a message." +- }, +- "constructor": { +- "notice": "This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize()." +- }, +- "pause()": { +- "notice": "Pause relaying." +- }, +- "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": { +- "notice": "Relays a cross domain message to a contract." +- }, +- "replayMessage(address,address,bytes,uint256,uint32,uint32)": { +- "notice": "Replays a cross domain message to the target messenger." +- }, +- "resolve(string)": { +- "notice": "Resolves the address associated with a given name." +- }, +- "sendMessage(address,bytes,uint32)": { +- "notice": "Sends a cross domain message to the target messenger." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 6653, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "libAddressManager", +- "offset": 0, +- "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" +- }, +- { +- "astId": 130, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "_initialized", +- "offset": 20, +- "slot": "0", +- "type": "t_bool" +- }, +- { +- "astId": 133, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "_initializing", +- "offset": 21, +- "slot": "0", +- "type": "t_bool" +- }, +- { +- "astId": 384, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "__gap", +- "offset": 0, +- "slot": "1", +- "type": "t_array(t_uint256)50_storage" +- }, +- { +- "astId": 10, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "_owner", +- "offset": 0, +- "slot": "51", +- "type": "t_address" +- }, +- { +- "astId": 123, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "__gap", +- "offset": 0, +- "slot": "52", +- "type": "t_array(t_uint256)49_storage" +- }, +- { +- "astId": 191, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "_paused", +- "offset": 0, +- "slot": "101", +- "type": "t_bool" +- }, +- { +- "astId": 282, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "__gap", +- "offset": 0, +- "slot": "102", +- "type": "t_array(t_uint256)49_storage" +- }, +- { +- "astId": 297, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "_status", +- "offset": 0, +- "slot": "151", +- "type": "t_uint256" +- }, +- { +- "astId": 340, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "__gap", +- "offset": 0, +- "slot": "152", +- "type": "t_array(t_uint256)49_storage" +- }, +- { +- "astId": 2289, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "blockedMessages", +- "offset": 0, +- "slot": "201", +- "type": "t_mapping(t_bytes32,t_bool)" +- }, +- { +- "astId": 2293, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "relayedMessages", +- "offset": 0, +- "slot": "202", +- "type": "t_mapping(t_bytes32,t_bool)" +- }, +- { +- "astId": 2297, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "successfulMessages", +- "offset": 0, +- "slot": "203", +- "type": "t_mapping(t_bytes32,t_bool)" +- }, +- { +- "astId": 2301, +- "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "xDomainMsgSender", +- "offset": 0, +- "slot": "204", +- "type": "t_address" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_array(t_uint256)49_storage": { +- "base": "t_uint256", +- "encoding": "inplace", +- "label": "uint256[49]", +- "numberOfBytes": "1568" +- }, +- "t_array(t_uint256)50_storage": { +- "base": "t_uint256", +- "encoding": "inplace", +- "label": "uint256[50]", +- "numberOfBytes": "1600" +- }, +- "t_bool": { +- "encoding": "inplace", +- "label": "bool", +- "numberOfBytes": "1" +- }, +- "t_bytes32": { +- "encoding": "inplace", +- "label": "bytes32", +- "numberOfBytes": "32" +- }, +- "t_contract(Lib_AddressManager)6645": { +- "encoding": "inplace", +- "label": "contract Lib_AddressManager", +- "numberOfBytes": "20" +- }, +- "t_mapping(t_bytes32,t_bool)": { +- "encoding": "mapping", +- "key": "t_bytes32", +- "label": "mapping(bytes32 => bool)", +- "numberOfBytes": "32", +- "value": "t_bool" +- }, +- "t_uint256": { +- "encoding": "inplace", +- "label": "uint256", +- "numberOfBytes": "32" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/kovan/StateCommitmentChain.json +deleted file mode 100644 +index 0c8be32..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/StateCommitmentChain.json ++++ /dev/null +@@ -1,529 +0,0 @@ +-{ +- "address": "0xD7754711773489F31A0602635f3F167826ce53C5", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_libAddressManager", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_fraudProofWindow", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "_sequencerPublishWindow", +- "type": "uint256" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "_batchIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes32", +- "name": "_batchRoot", +- "type": "bytes32" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_batchSize", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_prevTotalElements", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_extraData", +- "type": "bytes" +- } +- ], +- "name": "StateBatchAppended", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "uint256", +- "name": "_batchIndex", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes32", +- "name": "_batchRoot", +- "type": "bytes32" +- } +- ], +- "name": "StateBatchDeleted", +- "type": "event" +- }, +- { +- "inputs": [], +- "name": "FRAUD_PROOF_WINDOW", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "SEQUENCER_PUBLISH_WINDOW", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32[]", +- "name": "_batch", +- "type": "bytes32[]" +- }, +- { +- "internalType": "uint256", +- "name": "_shouldStartAtElement", +- "type": "uint256" +- } +- ], +- "name": "appendStateBatch", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "batches", +- "outputs": [ +- { +- "internalType": "contract IChainStorageContainer", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "batchIndex", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32", +- "name": "batchRoot", +- "type": "bytes32" +- }, +- { +- "internalType": "uint256", +- "name": "batchSize", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "prevTotalElements", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "extraData", +- "type": "bytes" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainBatchHeader", +- "name": "_batchHeader", +- "type": "tuple" +- } +- ], +- "name": "deleteStateBatch", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getLastSequencerTimestamp", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "_lastSequencerTimestamp", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getTotalBatches", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "_totalBatches", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getTotalElements", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "_totalElements", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "batchIndex", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32", +- "name": "batchRoot", +- "type": "bytes32" +- }, +- { +- "internalType": "uint256", +- "name": "batchSize", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "prevTotalElements", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "extraData", +- "type": "bytes" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainBatchHeader", +- "name": "_batchHeader", +- "type": "tuple" +- } +- ], +- "name": "insideFraudProofWindow", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "_inside", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "libAddressManager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "string", +- "name": "_name", +- "type": "string" +- } +- ], +- "name": "resolve", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes32", +- "name": "_element", +- "type": "bytes32" +- }, +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "batchIndex", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32", +- "name": "batchRoot", +- "type": "bytes32" +- }, +- { +- "internalType": "uint256", +- "name": "batchSize", +- "type": "uint256" +- }, +- { +- "internalType": "uint256", +- "name": "prevTotalElements", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "extraData", +- "type": "bytes" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainBatchHeader", +- "name": "_batchHeader", +- "type": "tuple" +- }, +- { +- "components": [ +- { +- "internalType": "uint256", +- "name": "index", +- "type": "uint256" +- }, +- { +- "internalType": "bytes32[]", +- "name": "siblings", +- "type": "bytes32[]" +- } +- ], +- "internalType": "struct Lib_OVMCodec.ChainInclusionProof", +- "name": "_proof", +- "type": "tuple" +- } +- ], +- "name": "verifyStateCommitment", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- } +- ], +- "transactionHash": "0x4d788b9a8d6aa62608e988619485674f0edbe5b1bc424860fd9d5de855b760b4", +- "receipt": { +- "to": null, +- "from": "0x063bE0Af9711a170BE4b07028b320C90705fec7C", +- "contractAddress": "0xD7754711773489F31A0602635f3F167826ce53C5", +- "transactionIndex": 5, +- "gasUsed": "1888173", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xf090dd21025ae960216f086264e3b8f893df77c2187ed28c40d2c0980ca33cbe", +- "transactionHash": "0x4d788b9a8d6aa62608e988619485674f0edbe5b1bc424860fd9d5de855b760b4", +- "logs": [], +- "blockNumber": 27989624, +- "cumulativeGasUsed": "2346683", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", +- 10, +- 12592000 +- ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516120bb3803806120bb83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b61200e806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220b90af2e50ed0ae8720c8f74ce116bfe826a8d329baa23dec8c3f69958740528964736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220b90af2e50ed0ae8720c8f74ce116bfe826a8d329baa23dec8c3f69958740528964736f6c63430008090033", +- "devdoc": { +- "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", +- "kind": "dev", +- "methods": { +- "appendStateBatch(bytes32[],uint256)": { +- "params": { +- "_batch": "Batch of state roots.", +- "_shouldStartAtElement": "Index of the element at which this batch should start." +- } +- }, +- "batches()": { +- "returns": { +- "_0": "Reference to the batch storage container." +- } +- }, +- "constructor": { +- "params": { +- "_libAddressManager": "Address of the Address Manager." +- } +- }, +- "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { +- "params": { +- "_batchHeader": "Header of the batch to start deleting from." +- } +- }, +- "getLastSequencerTimestamp()": { +- "returns": { +- "_lastSequencerTimestamp": "Last sequencer batch timestamp." +- } +- }, +- "getTotalBatches()": { +- "returns": { +- "_totalBatches": "Total submitted batches." +- } +- }, +- "getTotalElements()": { +- "returns": { +- "_totalElements": "Total submitted elements." +- } +- }, +- "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { +- "params": { +- "_batchHeader": "Header of the batch to check." +- }, +- "returns": { +- "_inside": "Whether or not the batch is inside the fraud proof window." +- } +- }, +- "resolve(string)": { +- "params": { +- "_name": "Name to resolve an address for." +- }, +- "returns": { +- "_0": "Address associated with the given name." +- } +- }, +- "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { +- "params": { +- "_batchHeader": "Header of the batch in which the element was included.", +- "_element": "Hash of the element to verify a proof for.", +- "_proof": "Merkle inclusion proof for the element." +- } +- } +- }, +- "title": "StateCommitmentChain", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "appendStateBatch(bytes32[],uint256)": { +- "notice": "Appends a batch of state roots to the chain." +- }, +- "batches()": { +- "notice": "Accesses the batch storage container." +- }, +- "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": { +- "notice": "Deletes all state roots after (and including) a given batch." +- }, +- "getLastSequencerTimestamp()": { +- "notice": "Retrieves the timestamp of the last batch submitted by the sequencer." +- }, +- "getTotalBatches()": { +- "notice": "Retrieves the total number of batches submitted." +- }, +- "getTotalElements()": { +- "notice": "Retrieves the total number of elements submitted." +- }, +- "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": { +- "notice": "Checks whether a given batch is still inside its fraud proof window." +- }, +- "resolve(string)": { +- "notice": "Resolves the address associated with a given name." +- }, +- "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": { +- "notice": "Verifies a batch inclusion proof." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 6653, +- "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", +- "label": "libAddressManager", +- "offset": 0, +- "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" +- }, +- { +- "astId": 4538, +- "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", +- "label": "FRAUD_PROOF_WINDOW", +- "offset": 0, +- "slot": "1", +- "type": "t_uint256" +- }, +- { +- "astId": 4540, +- "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", +- "label": "SEQUENCER_PUBLISH_WINDOW", +- "offset": 0, +- "slot": "2", +- "type": "t_uint256" +- } +- ], +- "types": { +- "t_contract(Lib_AddressManager)6645": { +- "encoding": "inplace", +- "label": "contract Lib_AddressManager", +- "numberOfBytes": "20" +- }, +- "t_uint256": { +- "encoding": "inplace", +- "label": "uint256", +- "numberOfBytes": "32" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/475653b7e5822844bbc8885f604f5e79.json b/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/475653b7e5822844bbc8885f604f5e79.json +deleted file mode 100644 +index 6fb6e27..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/solcInputs/475653b7e5822844bbc8885f604f5e79.json ++++ /dev/null +@@ -1,41 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" +- }, +- "contracts/L1/deployment/ChugSplashDictator.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { L1ChugSplashProxy } from \"../../chugsplash/L1ChugSplashProxy.sol\";\nimport { iL1ChugSplashDeployer } from \"../../chugsplash/interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title ChugSplashDictator\n * @dev Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're\n * working on a generalized version of this but this is good enough for the moment.\n */\ncontract ChugSplashDictator is iL1ChugSplashDeployer {\n /*************\n * Variables *\n *************/\n\n bool public isUpgrading = true;\n L1ChugSplashProxy public target;\n address public finalOwner;\n bytes32 public codeHash;\n bytes32 public messengerSlotKey;\n bytes32 public messengerSlotVal;\n bytes32 public bridgeSlotKey;\n bytes32 public bridgeSlotVal;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n L1ChugSplashProxy _target,\n address _finalOwner,\n bytes32 _codeHash,\n bytes32 _messengerSlotKey,\n bytes32 _messengerSlotVal,\n bytes32 _bridgeSlotKey,\n bytes32 _bridgeSlotVal\n ) {\n target = _target;\n finalOwner = _finalOwner;\n codeHash = _codeHash;\n messengerSlotKey = _messengerSlotKey;\n messengerSlotVal = _messengerSlotVal;\n bridgeSlotKey = _bridgeSlotKey;\n bridgeSlotVal = _bridgeSlotVal;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function doActions(bytes memory _code) external {\n require(keccak256(_code) == codeHash, \"ChugSplashDictator: Incorrect code hash.\");\n\n target.setCode(_code);\n target.setStorage(messengerSlotKey, messengerSlotVal);\n target.setStorage(bridgeSlotKey, bridgeSlotVal);\n target.setOwner(finalOwner);\n }\n\n /**\n * Transfers ownership of this contract to the finalOwner.\n * Only callable by the finalOwner, which is intended to be our multisig.\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can\n * recover if something really surprising goes wrong.\n */\n function returnOwnership() external {\n require(msg.sender == finalOwner, \"ChugSplashDictator: only callable by finalOwner\");\n\n target.setOwner(finalOwner);\n }\n}\n" +- }, +- "contracts/chugsplash/L1ChugSplashProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 10000 +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "storageLayout", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- }, +- "metadata": { +- "useLiteralContent": true +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/.chainId b/node_modules/@eth-optimism/contracts/deployments/mainnet/.chainId +new file mode 100644 +index 0000000..56a6051 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/.chainId +@@ -0,0 +1 @@ ++1 +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/AddressDictator.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/AddressDictator.json +deleted file mode 100644 +index dcc6e60..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/AddressDictator.json ++++ /dev/null +@@ -1,243 +0,0 @@ +-{ +- "address": "0x7a74f7934a233e10E8757264132B2E4EbccF5098", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "_manager", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "string[]", +- "name": "_names", +- "type": "string[]" +- }, +- { +- "internalType": "address[]", +- "name": "_addresses", +- "type": "address[]" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "getNamedAddresses", +- "outputs": [ +- { +- "components": [ +- { +- "internalType": "string", +- "name": "name", +- "type": "string" +- }, +- { +- "internalType": "address", +- "name": "addr", +- "type": "address" +- } +- ], +- "internalType": "struct AddressDictator.NamedAddress[]", +- "name": "", +- "type": "tuple[]" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "manager", +- "outputs": [ +- { +- "internalType": "contract Lib_AddressManager", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "setAddresses", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- } +- ], +- "transactionHash": "0xedbb6b8ddf9576d12f37434b146b889ba2874f2683f887f4db7e50b780ab11dc", +- "receipt": { +- "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0x7a74f7934a233e10E8757264132B2E4EbccF5098", +- "transactionIndex": 12, +- "gasUsed": "989432", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x59ae23de1dc7d96c0c6fcd028afc195d3f6ae7d87b86527478dbcfd805e9167e", +- "transactionHash": "0xedbb6b8ddf9576d12f37434b146b889ba2874f2683f887f4db7e50b780ab11dc", +- "logs": [], +- "blockNumber": 13596598, +- "cumulativeGasUsed": "2032231", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", +- "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A", +- [ +- "ChainStorageContainer-CTC-batches", +- "ChainStorageContainer-SCC-batches", +- "CanonicalTransactionChain", +- "StateCommitmentChain", +- "BondManager", +- "OVM_L1CrossDomainMessenger", +- "L2CrossDomainMessenger" +- ], +- [ +- "0xD16463EF9b0338CE3D73309028ef1714D220c024", +- "0xb0ddFf09c4019e31960de11bD845E836078E8EbE", +- "0x5E4e65926BA27467555EB562121fac00D24E9dD2", +- "0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19", +- "0xcd626E1328b41fCF24737F137BcD4CE0c32bc8d1", +- "0xd9166833FF12A5F900ccfBf2c8B62a90F1Ca1FD5", +- "0x4200000000000000000000000000000000000007" +- ] +- ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"_manager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_finalOwner\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_names\",\"type\":\"string[]\"},{\"internalType\":\"address[]\",\"name\":\"_addresses\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"finalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNamedAddresses\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"internalType\":\"struct AddressDictator.NamedAddress[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"manager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"returnOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setAddresses\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate many different addresses in the AddressManager without transferring ownership of the AddressManager to a hot wallet or hardware wallet.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_addresses\":\"Array of addresses to associate with the name.\",\"_finalOwner\":\"Address to transfer AddressManager ownership to afterwards.\",\"_manager\":\"Address of the AddressManager contract.\",\"_names\":\"Array of names to associate an address with.\"}}},\"title\":\"AddressDictator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNamedAddresses()\":{\"notice\":\"Returns the full namedAddresses array.\"},\"returnOwnership()\":{\"notice\":\"Transfers ownership of this contract to the finalOwner. Only callable by the Final Owner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong.\"},\"setAddresses()\":{\"notice\":\"Called to finalize the transfer, this function is callable by anyone, but will only result in an upgrade if this contract is the owner Address Manager.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/deployment/AddressDictator.sol\":\"AddressDictator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/deployment/AddressDictator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title AddressDictator\\n * @dev The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate\\n * many different addresses in the AddressManager without transferring ownership of the\\n * AddressManager to a hot wallet or hardware wallet.\\n */\\ncontract AddressDictator {\\n /*********\\n * Types *\\n *********/\\n\\n struct NamedAddress {\\n string name;\\n address addr;\\n }\\n\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public manager;\\n address public finalOwner;\\n NamedAddress[] namedAddresses;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _manager Address of the AddressManager contract.\\n * @param _finalOwner Address to transfer AddressManager ownership to afterwards.\\n * @param _names Array of names to associate an address with.\\n * @param _addresses Array of addresses to associate with the name.\\n */\\n constructor(\\n Lib_AddressManager _manager,\\n address _finalOwner,\\n string[] memory _names,\\n address[] memory _addresses\\n ) {\\n manager = _manager;\\n finalOwner = _finalOwner;\\n require(\\n _names.length == _addresses.length,\\n \\\"AddressDictator: Must provide an equal number of names and addresses.\\\"\\n );\\n for (uint256 i = 0; i < _names.length; i++) {\\n namedAddresses.push(NamedAddress({ name: _names[i], addr: _addresses[i] }));\\n }\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Called to finalize the transfer, this function is callable by anyone, but will only result in\\n * an upgrade if this contract is the owner Address Manager.\\n */\\n function setAddresses() external {\\n for (uint256 i = 0; i < namedAddresses.length; i++) {\\n manager.setAddress(namedAddresses[i].name, namedAddresses[i].addr);\\n }\\n // note that this will revert if _finalOwner == currentOwner\\n manager.transferOwnership(finalOwner);\\n }\\n\\n /**\\n * Transfers ownership of this contract to the finalOwner.\\n * Only callable by the Final Owner, which is intended to be our multisig.\\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can recover\\n * if something really surprising goes wrong.\\n */\\n function returnOwnership() external {\\n require(msg.sender == finalOwner, \\\"AddressDictator: only callable by finalOwner\\\");\\n manager.transferOwnership(finalOwner);\\n }\\n\\n /******************\\n * View Functions *\\n ******************/\\n\\n /**\\n * Returns the full namedAddresses array.\\n */\\n function getNamedAddresses() external view returns (NamedAddress[] memory) {\\n return namedAddresses;\\n }\\n}\\n\",\"keccak256\":\"0xd7257dc5d6c5855f57dc6c42f430f3c7bd4514a26756bac4183c65c77fd7cb70\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b5060405162000d5e38038062000d5e83398101604081905262000034916200037a565b600080546001600160a01b038087166001600160a01b03199283161790925560018054928616929091169190911790558051825114620000ee5760405162461bcd60e51b815260206004820152604560248201527f416464726573734469637461746f723a204d7573742070726f7669646520616e60448201527f20657175616c206e756d626572206f66206e616d657320616e6420616464726560648201526439b9b2b99760d91b608482015260a40160405180910390fd5b60005b8251811015620001c357600260405180604001604052808584815181106200011d576200011d62000505565b602002602001015181526020018484815181106200013f576200013f62000505565b6020908102919091018101516001600160a01b0316909152825460018101845560009384529281902082518051939460020290910192620001849284920190620001ce565b5060209190910151600190910180546001600160a01b0319166001600160a01b0390921691909117905580620001ba816200051b565b915050620000f1565b505050505062000582565b828054620001dc9062000545565b90600052602060002090601f0160209004810192826200020057600085556200024b565b82601f106200021b57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024b5782518255916020019190600101906200022e565b50620002599291506200025d565b5090565b5b808211156200025957600081556001016200025e565b6001600160a01b03811681146200028a57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002ce57620002ce6200028d565b604052919050565b60006001600160401b03821115620002f257620002f26200028d565b5060051b60200190565b600082601f8301126200030e57600080fd5b81516020620003276200032183620002d6565b620002a3565b82815260059290921b840181019181810190868411156200034757600080fd5b8286015b848110156200036f578051620003618162000274565b83529183019183016200034b565b509695505050505050565b600080600080608085870312156200039157600080fd5b84516200039e8162000274565b80945050602080860151620003b38162000274565b60408701519094506001600160401b0380821115620003d157600080fd5b818801915088601f830112620003e657600080fd5b8151620003f76200032182620002d6565b81815260059190911b8301840190848101908b8311156200041757600080fd5b8585015b83811015620004ce57805185811115620004355760008081fd5b8601603f81018e13620004485760008081fd5b87810151868111156200045f576200045f6200028d565b62000473601f8201601f19168a01620002a3565b8181528f60408385010111156200048a5760008081fd5b60005b82811015620004ab57838101604001518282018c01528a016200048d565b82811115620004bd5760008b84840101525b50855250509186019186016200041b565b5060608b01519097509450505080831115620004e957600080fd5b5050620004f987828801620002fc565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053e57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200055a57607f821691505b602082108114156200057c57634e487b7160e01b600052602260045260246000fd5b50919050565b6107cc80620005926000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220887af7eba4d3f3d6334054ac570c07f1274d85013ffd1137e64c17b5cc13380864736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633ccad6fc116100505780633ccad6fc146100c0578063481c6a75146100d5578063bc3a429b146100f557600080fd5b806317ad94ec1461006c578063297d1a34146100b6575b600080fd5b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be6100fd565b005b6100c8610232565b6040516100ad91906104af565b60005461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b6100be610343565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f416464726573734469637461746f723a206f6e6c792063616c6c61626c65206260448201527f792066696e616c4f776e65720000000000000000000000000000000000000000606482015260840160405180910390fd5b6000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024015b600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561033a5783829060005260206000209060020201604051806040016040529081600082018054610289906105ae565b80601f01602080910402602001604051908101604052809291908181526020018280546102b5906105ae565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050918352505060019182015473ffffffffffffffffffffffffffffffffffffffff16602091820152918352929092019101610256565b50505050905090565b60005b600254811015610454576000546002805473ffffffffffffffffffffffffffffffffffffffff90921691639b2ea4bd91908490811061038757610387610602565b9060005260206000209060020201600001600284815481106103ab576103ab610602565b60009182526020909120600160029092020101546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261040f929173ffffffffffffffffffffffffffffffffffffffff1690600401610631565b600060405180830381600087803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050808061044c90610736565b915050610346565b506000546001546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063f2fde38b906024016101fe565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561059f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8503018652825180518886528051808a880152845b81811015610532578281018c0151888201606001528b01610516565b8181111561054357856060838a0101525b50918a015173ffffffffffffffffffffffffffffffffffffffff16868b01525095880195601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690930160600192918701916001016104d7565b50919998505050505050505050565b600181811c908216806105c257607f821691505b602082108114156105fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600080845481600182811c91508083168061065157607f831692505b602080841082141561068a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b60408801849052606088018280156106a957600181146106d857610703565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00871682528282019750610703565b60008c81526020902060005b878110156106fd578154848201529086019084016106e4565b83019850505b50508596506107298189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220887af7eba4d3f3d6334054ac570c07f1274d85013ffd1137e64c17b5cc13380864736f6c63430008090033", +- "devdoc": { +- "details": "The AddressDictator (glory to Arstotzka) is a contract that allows us to safely manipulate many different addresses in the AddressManager without transferring ownership of the AddressManager to a hot wallet or hardware wallet.", +- "kind": "dev", +- "methods": { +- "constructor": { +- "params": { +- "_addresses": "Array of addresses to associate with the name.", +- "_finalOwner": "Address to transfer AddressManager ownership to afterwards.", +- "_manager": "Address of the AddressManager contract.", +- "_names": "Array of names to associate an address with." +- } +- } +- }, +- "title": "AddressDictator", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "getNamedAddresses()": { +- "notice": "Returns the full namedAddresses array." +- }, +- "returnOwnership()": { +- "notice": "Transfers ownership of this contract to the finalOwner. Only callable by the Final Owner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong." +- }, +- "setAddresses()": { +- "notice": "Called to finalize the transfer, this function is callable by anyone, but will only result in an upgrade if this contract is the owner Address Manager." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 1908, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "manager", +- "offset": 0, +- "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" +- }, +- { +- "astId": 1910, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "finalOwner", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 1914, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "namedAddresses", +- "offset": 0, +- "slot": "2", +- "type": "t_array(t_struct(NamedAddress)1905_storage)dyn_storage" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_array(t_struct(NamedAddress)1905_storage)dyn_storage": { +- "base": "t_struct(NamedAddress)1905_storage", +- "encoding": "dynamic_array", +- "label": "struct AddressDictator.NamedAddress[]", +- "numberOfBytes": "32" +- }, +- "t_contract(Lib_AddressManager)6645": { +- "encoding": "inplace", +- "label": "contract Lib_AddressManager", +- "numberOfBytes": "20" +- }, +- "t_string_storage": { +- "encoding": "bytes", +- "label": "string", +- "numberOfBytes": "32" +- }, +- "t_struct(NamedAddress)1905_storage": { +- "encoding": "inplace", +- "label": "struct AddressDictator.NamedAddress", +- "members": [ +- { +- "astId": 1902, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "name", +- "offset": 0, +- "slot": "0", +- "type": "t_string_storage" +- }, +- { +- "astId": 1904, +- "contract": "contracts/L1/deployment/AddressDictator.sol:AddressDictator", +- "label": "addr", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- } +- ], +- "numberOfBytes": "64" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/BondManager.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/BondManager.json +index abd17f1..da4ed6f 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/BondManager.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/BondManager.json +@@ -1,5 +1,5 @@ + { +- "address": "0xcd626E1328b41fCF24737F137BcD4CE0c32bc8d1", ++ "address": "0x60660e6CDEb423cf847dD11De4C473130D65b627", + "abi": [ + { + "inputs": [ +@@ -64,29 +64,29 @@ + "type": "function" + } + ], +- "transactionHash": "0x75f8426b4aa3d4c56f1eff06a05f17248d48201cb98b52400e60bc9630d1a0f5", ++ "transactionHash": "0x32e724cb1cdf6993b18af436191227a010e769bb1eb8d9c2227b2733ccb6df71", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xcd626E1328b41fCF24737F137BcD4CE0c32bc8d1", +- "transactionIndex": 8, +- "gasUsed": "295562", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x60660e6CDEb423cf847dD11De4C473130D65b627", ++ "transactionIndex": 234, ++ "gasUsed": "286711", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xce2935bccd22ce502fdaccdb5afdc68dd30c50301d11d8f63c8000a74391d743", +- "transactionHash": "0x75f8426b4aa3d4c56f1eff06a05f17248d48201cb98b52400e60bc9630d1a0f5", ++ "blockHash": "0x7f21b3a8ffd81de9cf173fca122010de2f9f7257c0e0d5e50b605e9d4e3b5620", ++ "transactionHash": "0x32e724cb1cdf6993b18af436191227a010e769bb1eb8d9c2227b2733ccb6df71", + "logs": [], +- "blockNumber": 13596479, +- "cumulativeGasUsed": "899083", ++ "blockNumber": 13502942, ++ "cumulativeGasUsed": "18201781", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F" ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089" + ], +- "solcInputHash": "e2f1121f17d06f85851dd0c837a00344", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IBondManager } from \\\"./IBondManager.sol\\\";\\n\\n/* Contract Imports */\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve(\\\"OVM_Proposer\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7cf12771514dac1a73702395b9642dacd7190bd7a5d131fb87c0c368236d1ed0\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b5060405161048838038061048883398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103f5806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea2646970667358221220cdeb219ac692b599b8857e4140f0cfd6d348cfe93163faebdf5a55b11f0009ea64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea2646970667358221220cdeb219ac692b599b8857e4140f0cfd6d348cfe93163faebdf5a55b11f0009ea64736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_who\",\"type\":\"address\"}],\"name\":\"isCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but allow the \\\"OVM_Proposer\\\" to submit state root batches. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"isCollateralized(address)\":{\"params\":{\"_who\":\"Address to check.\"},\"returns\":{\"_0\":\"true if the address is properly collateralized, false otherwise.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"BondManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isCollateralized(address)\":{\"notice\":\"Checks whether a given address is properly collateralized and can perform actions within the system.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/verification/BondManager.sol\":\"BondManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/verification/BondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport {IBondManager} from './IBondManager.sol';\\n\\n/* Contract Imports */\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/**\\n * @title BondManager\\n * @dev This contract is, for now, a stub of the \\\"real\\\" BondManager that does nothing but\\n * allow the \\\"OVM_Proposer\\\" to submit state root batches.\\n *\\n * Runtime target: EVM\\n */\\ncontract BondManager is IBondManager, Lib_AddressResolver {\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager)\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**\\n * Checks whether a given address is properly collateralized and can perform actions within\\n * the system.\\n * @param _who Address to check.\\n * @return true if the address is properly collateralized, false otherwise.\\n */\\n function isCollateralized(address _who) public view returns (bool) {\\n // Only authenticate sequencer to submit state root batches.\\n return _who == resolve('OVM_Proposer');\\n }\\n}\\n\",\"keccak256\":\"0xdab289e6d0e2ccd9f6c6aa6a169214e4efe7bedc3b482e360e9fca7a7df194b1\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x118d0be6479a4c5d472efead352a6d17ff27982bcfeeda27a31ad3169962576c\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a", + "devdoc": { + "details": "This contract is, for now, a stub of the \"real\" BondManager that does nothing but allow the \"OVM_Proposer\" to submit state root batches. Runtime target: EVM", + "kind": "dev", +@@ -131,16 +131,16 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/verification/BondManager.sol:BondManager", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + } + ], + "types": { +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/CanonicalTransactionChain.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/CanonicalTransactionChain.json +index cb73c4e..25d70d3 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/CanonicalTransactionChain.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/CanonicalTransactionChain.json +@@ -1,5 +1,5 @@ + { +- "address": "0x5E4e65926BA27467555EB562121fac00D24E9dD2", ++ "address": "0xfBd2541e316948B259264c02f370eD088E04c3Db", + "abi": [ + { + "inputs": [ +@@ -443,6 +443,19 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [], ++ "name": "queue", ++ "outputs": [ ++ { ++ "internalType": "contract IChainStorageContainer", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -481,32 +494,32 @@ + "type": "function" + } + ], +- "transactionHash": "0xf6f22923d0cb24db64e8fc0ccb9f04e399b0d08acc45bed0b2bd803d52e678e7", ++ "transactionHash": "0xdf8137b35d9aaf8e1237fa6a08248573fb613f22d7f916a10194723d30adf2fe", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0x5E4e65926BA27467555EB562121fac00D24E9dD2", +- "transactionIndex": 7, +- "gasUsed": "1577250", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0xfBd2541e316948B259264c02f370eD088E04c3Db", ++ "transactionIndex": 185, ++ "gasUsed": "1586323", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x2cbf3d1d86bd51e7c695e35b1417c893f64b2343c705ae27c6228e9e9701ec4d", +- "transactionHash": "0xf6f22923d0cb24db64e8fc0ccb9f04e399b0d08acc45bed0b2bd803d52e678e7", ++ "blockHash": "0x6a057ae419d489b90124f407ac5ca90784933463bf44d8be85c9eebe42a7ea16", ++ "transactionHash": "0xdf8137b35d9aaf8e1237fa6a08248573fb613f22d7f916a10194723d30adf2fe", + "logs": [], +- "blockNumber": 13596466, +- "cumulativeGasUsed": "1837245", ++ "blockNumber": 13502893, ++ "cumulativeGasUsed": "21397596", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", +- 15000000, ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", ++ 11000000, + 32, + 60000 + ], +- "solcInputHash": "e2f1121f17d06f85851dd0c837a00344", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(msg.sender == libAddressManager.owner(), \\\"Only callable by the Burn Admin.\\\");\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(l2GasDiscountDivisor, enqueueGasCost, enqueueL2GasPrepaid);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-CTC-batches\\\"));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n \\\"Transaction data size exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n \\\"Transaction gas limit exceeds maximum for rollup transaction.\\\"\\n );\\n\\n require(_gasLimit >= MIN_ROLLUP_TX_GAS, \\\"Transaction gas limit too low to enqueue.\\\");\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) / l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(startingGas > gasToConsume, \\\"Insufficient gas for L2 rate limiting burn.\\\");\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(abi.encode(sender, _target, _gasLimit, _data));\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(sender, _target, _gasLimit, _data, queueIndex, block.timestamp);\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n require(\\n msg.sender == resolve(\\\"OVM_Sequencer\\\"),\\n \\\"Function can only be called by the Sequencer.\\\"\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(msg.data.length >= nextTransactionPtr, \\\"Not enough BatchContexts provided.\\\");\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n \\\"Attempted to append more elements than are available in the queue.\\\"\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[nextQueueIndex - 1];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index) internal pure returns (BatchContext memory) {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000)\\n )\\n lastTimestamp := shr(\\n 80,\\n and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000)\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex\\\"\\\"\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x9e7772f17c6ed75da8d10c47c1781d56ac08dcf7e93108e729157831db9b1125\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b5060405162001a9838038062001a9883398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b61199e80620000fa6000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220e14033f9f98984edb3353943a45655d112afab7b0a7aa8401f8826506d85b00164736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a2646970667358221220e14033f9f98984edb3353943a45655d112afab7b0a7aa8401f8826506d85b00164736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"struct Lib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendSequencerBatch()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons. .param _shouldStartAtElement Specific batch we expect to start appending to. .param _totalElementsToAppend Total number of batch elements we expect to append. .param _contexts Array of batch contexts. .param _transactionDataFields Array of raw transaction data.\"},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"enqueue(address,uint256,bytes)\":{\"params\":{\"_data\":\"Transaction data.\",\"_gasLimit\":\"Gas limit for the enqueued L2 transaction.\",\"_target\":\"Target L2 contract to send the transaction to.\"}},\"getLastBlockNumber()\":{\"returns\":{\"_0\":\"Blocknumber for the last transaction.\"}},\"getLastTimestamp()\":{\"returns\":{\"_0\":\"Timestamp for the last transaction.\"}},\"getNextQueueIndex()\":{\"returns\":{\"_0\":\"Index for the next queue element.\"}},\"getNumPendingQueueElements()\":{\"returns\":{\"_0\":\"Number of pending queue elements.\"}},\"getQueueElement(uint256)\":{\"params\":{\"_index\":\"Index of the queue element to access.\"},\"returns\":{\"_element\":\"Queue element at the given index.\"}},\"getQueueLength()\":{\"returns\":{\"_0\":\"Length of the queue.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"queue()\":{\"returns\":{\"_0\":\"Reference to the queue storage container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"CanonicalTransactionChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatch()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"enqueue(address,uint256,bytes)\":{\"notice\":\"Adds a transaction to the queue.\"},\"getLastBlockNumber()\":{\"notice\":\"Returns the blocknumber of the last transaction.\"},\"getLastTimestamp()\":{\"notice\":\"Returns the timestamp of the last transaction.\"},\"getNextQueueIndex()\":{\"notice\":\"Returns the index of the next element to be enqueued.\"},\"getNumPendingQueueElements()\":{\"notice\":\"Get the number of queue elements which have not yet been included.\"},\"getQueueElement(uint256)\":{\"notice\":\"Gets the queue element at a particular index.\"},\"getQueueLength()\":{\"notice\":\"Retrieves the length of the queue, including both pending and canonical transactions.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"queue()\":{\"notice\":\"Accesses the queue storage container.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGasParams(uint256,uint256)\":{\"notice\":\"Allows the Burn Admin to update the parameters which determine the amount of gas to burn. The value of enqueueL2GasPrepaid is immediately updated as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/CanonicalTransactionChain.sol\":\"CanonicalTransactionChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/CanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/* Interface Imports */\\nimport {ICanonicalTransactionChain} from './ICanonicalTransactionChain.sol';\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title CanonicalTransactionChain\\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\\n * Sequencer will eventually append it to the rollup state.\\n *\\n * Runtime target: EVM\\n */\\ncontract CanonicalTransactionChain is\\n ICanonicalTransactionChain,\\n Lib_AddressResolver\\n{\\n /*************\\n * Constants *\\n *************/\\n\\n // L2 tx gas-related\\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\\n\\n // The approximate cost of calling the enqueue function\\n uint256 public enqueueGasCost;\\n // The ratio of the cost of L1 gas to the cost of L2 gas\\n uint256 public l2GasDiscountDivisor;\\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\\n // See comments in enqueue() for further detail.\\n uint256 public enqueueL2GasPrepaid;\\n\\n // Encoding-related (all in bytes)\\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n uint256 public maxTransactionGasLimit;\\n\\n /***************\\n * Queue State *\\n ***************/\\n\\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\\n Lib_OVMCodec.QueueElement[] queueElements;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n address _libAddressManager,\\n uint256 _maxTransactionGasLimit,\\n uint256 _l2GasDiscountDivisor,\\n uint256 _enqueueGasCost\\n ) Lib_AddressResolver(_libAddressManager) {\\n maxTransactionGasLimit = _maxTransactionGasLimit;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n enqueueGasCost = _enqueueGasCost;\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Modifier to enforce that, if configured, only the Burn Admin may\\n * successfully call a method.\\n */\\n modifier onlyBurnAdmin() {\\n require(\\n msg.sender == libAddressManager.owner(),\\n 'Only callable by the Burn Admin.'\\n );\\n _;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external\\n onlyBurnAdmin\\n {\\n enqueueGasCost = _enqueueGasCost;\\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\\n // See the comment in enqueue() for the rationale behind this formula.\\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\\n\\n emit L2GasParamsUpdated(\\n l2GasDiscountDivisor,\\n enqueueGasCost,\\n enqueueL2GasPrepaid\\n );\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve('ChainStorageContainer-CTC-batches'));\\n }\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve('ChainStorageContainer-CTC-queue'));\\n }\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, , , ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() public view returns (uint40) {\\n return _nextQueueIndex;\\n }\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() public view returns (uint40) {\\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\\n return lastTimestamp;\\n }\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() public view returns (uint40) {\\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\\n return lastBlockNumber;\\n }\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n public\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element)\\n {\\n return queueElements[_index];\\n }\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() public view returns (uint40) {\\n return uint40(queueElements.length) - _nextQueueIndex;\\n }\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() public view returns (uint40) {\\n return uint40(queueElements.length);\\n }\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target L2 contract to send the transaction to.\\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external {\\n require(\\n _data.length <= MAX_ROLLUP_TX_SIZE,\\n 'Transaction data size exceeds maximum for rollup transaction.'\\n );\\n\\n require(\\n _gasLimit <= maxTransactionGasLimit,\\n 'Transaction gas limit exceeds maximum for rollup transaction.'\\n );\\n\\n require(\\n _gasLimit >= MIN_ROLLUP_TX_GAS,\\n 'Transaction gas limit too low to enqueue.'\\n );\\n\\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\\n // additional gas on L1. This threshold is the product of two inputs:\\n // 1. enqueueGasCost: the base cost of calling this function.\\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\\n // positive integer, meaning we assume L2 gas is always less costly.\\n // The calculation below for gasToConsume can be seen as converting the difference (between\\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\\n if (_gasLimit > enqueueL2GasPrepaid) {\\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) /\\n l2GasDiscountDivisor;\\n uint256 startingGas = gasleft();\\n\\n // Although this check is not necessary (burn below will run out of gas if not true), it\\n // gives the user an explicit reason as to why the enqueue attempt failed.\\n require(\\n startingGas > gasToConsume,\\n 'Insufficient gas for L2 rate limiting burn.'\\n );\\n\\n uint256 i;\\n while (startingGas - gasleft() < gasToConsume) {\\n i++;\\n }\\n }\\n\\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\\n // We can safely ignore this for EOAs because they're guaranteed to have the same \\\"code\\\"\\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\\n // on L2 even when the Sequencer is down.\\n address sender;\\n if (msg.sender == tx.origin) {\\n sender = msg.sender;\\n } else {\\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\\n }\\n\\n bytes32 transactionHash = keccak256(\\n abi.encode(sender, _target, _gasLimit, _data)\\n );\\n\\n queueElements.push(\\n Lib_OVMCodec.QueueElement({\\n transactionHash: transactionHash,\\n timestamp: uint40(block.timestamp),\\n blockNumber: uint40(block.number)\\n })\\n );\\n uint256 queueIndex = queueElements.length - 1;\\n emit TransactionEnqueued(\\n sender,\\n _target,\\n _gasLimit,\\n _data,\\n queueIndex,\\n block.timestamp\\n );\\n }\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch() external {\\n uint40 shouldStartAtElement;\\n uint24 totalElementsToAppend;\\n uint24 numContexts;\\n assembly {\\n shouldStartAtElement := shr(216, calldataload(4))\\n totalElementsToAppend := shr(232, calldataload(9))\\n numContexts := shr(232, calldataload(12))\\n }\\n\\n require(\\n shouldStartAtElement == getTotalElements(),\\n 'Actual batch start index does not match expected start index.'\\n );\\n\\n require(\\n msg.sender == resolve('OVM_Sequencer'),\\n 'Function can only be called by the Sequencer.'\\n );\\n\\n uint40 nextTransactionPtr = uint40(\\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\\n );\\n\\n require(\\n msg.data.length >= nextTransactionPtr,\\n 'Not enough BatchContexts provided.'\\n );\\n\\n // Counter for number of sequencer transactions appended so far.\\n uint32 numSequencerTransactions = 0;\\n\\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\\n // This is safe as long as nothing reads or writes to the storage variable\\n // until it is updated by the temp variable.\\n uint40 nextQueueIndex = _nextQueueIndex;\\n\\n BatchContext memory curContext;\\n for (uint32 i = 0; i < numContexts; i++) {\\n BatchContext memory nextContext = _getBatchContext(i);\\n\\n // Now we can update our current context.\\n curContext = nextContext;\\n\\n // Process sequencer transactions first.\\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\\n\\n // Now process any subsequent queue transactions.\\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\\n }\\n\\n require(\\n nextQueueIndex <= queueElements.length,\\n 'Attempted to append more elements than are available in the queue.'\\n );\\n\\n // Generate the required metadata that we need to append this batch\\n uint40 numQueuedTransactions = totalElementsToAppend -\\n numSequencerTransactions;\\n uint40 blockTimestamp;\\n uint40 blockNumber;\\n if (curContext.numSubsequentQueueTransactions == 0) {\\n // The last element is a sequencer tx, therefore pull timestamp and block number from\\n // the last context.\\n blockTimestamp = uint40(curContext.timestamp);\\n blockNumber = uint40(curContext.blockNumber);\\n } else {\\n // The last element is a queue tx, therefore pull timestamp and block number from the\\n // queue element.\\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\\n // least one queue element. We increment nextQueueIndex after processing each queue\\n // element, so the index of the last element we processed is nextQueueIndex - 1.\\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[\\n nextQueueIndex - 1\\n ];\\n\\n blockTimestamp = lastElement.timestamp;\\n blockNumber = lastElement.blockNumber;\\n }\\n\\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\\n _appendBatch(\\n blockhash(block.number - 1),\\n totalElementsToAppend,\\n numQueuedTransactions,\\n blockTimestamp,\\n blockNumber\\n );\\n\\n emit SequencerBatchAppended(\\n nextQueueIndex - numQueuedTransactions,\\n numQueuedTransactions,\\n getTotalElements()\\n );\\n\\n // Update the _nextQueueIndex storage variable.\\n _nextQueueIndex = nextQueueIndex;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Returns the BatchContext located at a particular index.\\n * @param _index The index of the BatchContext\\n * @return The BatchContext at the specified index.\\n */\\n function _getBatchContext(uint256 _index)\\n internal\\n pure\\n returns (BatchContext memory)\\n {\\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 ctxTimestamp;\\n uint256 ctxBlockNumber;\\n\\n assembly {\\n numSequencedTransactions := shr(232, calldataload(contextPtr))\\n numSubsequentQueueTransactions := shr(\\n 232,\\n calldataload(add(contextPtr, 3))\\n )\\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\\n }\\n\\n return\\n BatchContext({\\n numSequencedTransactions: numSequencedTransactions,\\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\\n timestamp: ctxTimestamp,\\n blockNumber: ctxBlockNumber\\n });\\n }\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Index of the next queue element.\\n */\\n function _getBatchExtraData()\\n internal\\n view\\n returns (\\n uint40,\\n uint40,\\n uint40,\\n uint40\\n )\\n {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n uint40 totalElements;\\n uint40 nextQueueIndex;\\n uint40 lastTimestamp;\\n uint40 lastBlockNumber;\\n\\n // solhint-disable max-line-length\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n nextQueueIndex := shr(\\n 40,\\n and(\\n extraData,\\n 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000\\n )\\n )\\n lastTimestamp := shr(\\n 80,\\n and(\\n extraData,\\n 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000\\n )\\n )\\n lastBlockNumber := shr(\\n 120,\\n and(\\n extraData,\\n 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000\\n )\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _nextQueueIdx Index of the next queue element.\\n * @param _timestamp Timestamp for the last batch.\\n * @param _blockNumber Block number of the last batch.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _nextQueueIdx,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _nextQueueIdx))\\n extraData := or(extraData, shl(80, _timestamp))\\n extraData := or(extraData, shl(120, _blockNumber))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Inserts a batch into the chain of batches.\\n * @param _transactionRoot Root of the transaction tree for this batch.\\n * @param _batchSize Number of elements in the batch.\\n * @param _numQueuedTransactions Number of queue transactions in the batch.\\n * @param _timestamp The latest batch timestamp.\\n * @param _blockNumber The latest batch blockNumber.\\n */\\n function _appendBatch(\\n bytes32 _transactionRoot,\\n uint256 _batchSize,\\n uint256 _numQueuedTransactions,\\n uint40 _timestamp,\\n uint40 _blockNumber\\n ) internal {\\n IChainStorageContainer batchesRef = batches();\\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\\n\\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec\\n .ChainBatchHeader({\\n batchIndex: batchesRef.length(),\\n batchRoot: _transactionRoot,\\n batchSize: _batchSize,\\n prevTotalElements: totalElements,\\n extraData: hex''\\n });\\n\\n emit TransactionBatchAppended(\\n header.batchIndex,\\n header.batchRoot,\\n header.batchSize,\\n header.prevTotalElements,\\n header.extraData\\n );\\n\\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\\n bytes27 latestBatchContext = _makeBatchExtraData(\\n totalElements + uint40(header.batchSize),\\n nextQueueIndex + uint40(_numQueuedTransactions),\\n _timestamp,\\n _blockNumber\\n );\\n\\n batchesRef.push(batchHeaderHash, latestBatchContext);\\n }\\n}\\n\",\"keccak256\":\"0x456d1e1c9c7ce0cd7efa951974f786c1ce61df213a2c245d3e469065991b0aed\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x2cefcaffb2545843360e10af8ec99ef503662d8bcbd18a256969abb24cbbf471\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\\nimport {Lib_Bytes32Utils} from '../utils/Lib_Bytes32Utils.sol';\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded)\\n internal\\n pure\\n returns (EVMAccount memory)\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(\\n _encoded\\n );\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x984f547b018437d8624ae21bff0bd42c37f14576853a6c561313233ff3eacdb3\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({length: _in.length, ptr: ptr});\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in)\\n internal\\n pure\\n returns (RLPItem[] memory)\\n {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, 'Invalid RLP list value.');\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n 'Provided RLP list exceeds max list length.'\\n );\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({length: _in.length - offset, ptr: _in.ptr + offset})\\n );\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes value.');\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, 'Invalid RLP bytes32 value.');\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes32 value.');\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, 'Invalid RLP boolean value.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n 'Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1'\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, 'Invalid RLP address value.');\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, 'RLP item cannot be null.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, 'Invalid RLP short string.');\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, 'Invalid RLP long string length.');\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, 'Invalid RLP long string.');\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, 'Invalid RLP short list.');\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, 'Invalid RLP long list length.');\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, 'Invalid RLP long list.');\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x1d00ffbf595d95145544291f36a97de453b51032bb03a6247f890d2805b55955\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset)\\n private\\n pure\\n returns (bytes memory)\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb3a03376fea9bfc947af1719158aac3daa6343cb0329a1c2a33016a29c53970a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0x675b6d1b5a1b5a80f31c2a8a33adc8105e8b38c2e21626706c8f7e9be74346e2\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, 'slice_overflow');\\n require(_start + _length >= _start, 'slice_overflow');\\n require(_bytes.length >= _start + _length, 'slice_outOfBounds');\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(\\n add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))),\\n _start\\n )\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other)\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xdf5a3f5021b71789c9c056164d76634add7fa005c1d0a927d80b609f0090f2e5\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address)\\n internal\\n pure\\n returns (address l2Address)\\n {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address)\\n internal\\n pure\\n returns (address l1Address)\\n {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48d904ede1f43f23a585015f295c7a5f26c52791c0fedc8ced688ccffd44497b\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a", + "devdoc": { + "details": "The Canonical Transaction Chain (CTC) contract is an append-only log of transactions which must be applied to the rollup state. It defines the ordering of rollup transactions by writing them to the 'CTC:batches' instance of the Chain Storage Container. The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer will eventually append it to the rollup state. Runtime target: EVM", + "kind": "dev", +@@ -569,6 +582,11 @@ + "_totalElements": "Total submitted elements." + } + }, ++ "queue()": { ++ "returns": { ++ "_0": "Reference to the queue storage container." ++ } ++ }, + "resolve(string)": { + "params": { + "_name": "Name to resolve an address for." +@@ -617,6 +635,9 @@ + "getTotalElements()": { + "notice": "Retrieves the total number of elements submitted." + }, ++ "queue()": { ++ "notice": "Accesses the queue storage container." ++ }, + "resolve(string)": { + "notice": "Resolves the address associated with a given name." + }, +@@ -629,15 +650,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + }, + { +- "astId": 3291, ++ "astId": 3257, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "enqueueGasCost", + "offset": 0, +@@ -645,7 +666,7 @@ + "type": "t_uint256" + }, + { +- "astId": 3293, ++ "astId": 3259, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "l2GasDiscountDivisor", + "offset": 0, +@@ -653,7 +674,7 @@ + "type": "t_uint256" + }, + { +- "astId": 3295, ++ "astId": 3261, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "enqueueL2GasPrepaid", + "offset": 0, +@@ -661,7 +682,7 @@ + "type": "t_uint256" + }, + { +- "astId": 3312, ++ "astId": 3278, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "maxTransactionGasLimit", + "offset": 0, +@@ -669,7 +690,7 @@ + "type": "t_uint256" + }, + { +- "astId": 3314, ++ "astId": 3280, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "_nextQueueIndex", + "offset": 0, +@@ -677,17 +698,17 @@ + "type": "t_uint40" + }, + { +- "astId": 3318, ++ "astId": 3284, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "queueElements", + "offset": 0, + "slot": "6", +- "type": "t_array(t_struct(QueueElement)6395_storage)dyn_storage" ++ "type": "t_array(t_struct(QueueElement)6386_storage)dyn_storage" + } + ], + "types": { +- "t_array(t_struct(QueueElement)6395_storage)dyn_storage": { +- "base": "t_struct(QueueElement)6395_storage", ++ "t_array(t_struct(QueueElement)6386_storage)dyn_storage": { ++ "base": "t_struct(QueueElement)6386_storage", + "encoding": "dynamic_array", + "label": "struct Lib_OVMCodec.QueueElement[]", + "numberOfBytes": "32" +@@ -697,17 +718,17 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, +- "t_struct(QueueElement)6395_storage": { ++ "t_struct(QueueElement)6386_storage": { + "encoding": "inplace", + "label": "struct Lib_OVMCodec.QueueElement", + "members": [ + { +- "astId": 6390, ++ "astId": 6381, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "transactionHash", + "offset": 0, +@@ -715,7 +736,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 6392, ++ "astId": 6383, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "timestamp", + "offset": 0, +@@ -723,7 +744,7 @@ + "type": "t_uint40" + }, + { +- "astId": 6394, ++ "astId": 6385, + "contract": "contracts/L1/rollup/CanonicalTransactionChain.sol:CanonicalTransactionChain", + "label": "blockNumber", + "offset": 5, +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-batches.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-batches.json +index 240817f..030d755 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-batches.json +@@ -1,5 +1,5 @@ + { +- "address": "0xD16463EF9b0338CE3D73309028ef1714D220c024", ++ "address": "0x17148284d2da2f38c96346f1776C1BF7D7691231", + "abi": [ + { + "inputs": [ +@@ -183,30 +183,30 @@ + "type": "function" + } + ], +- "transactionHash": "0x42e7bc9094a85d8ca8d9029d807f8c8c272c389c54e628c5d0150f1b4f0ffd4e", ++ "transactionHash": "0xa0fa4d635bfad3355e2cd13fa457fec65005c297551764136ee21bd66bb8511a", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xD16463EF9b0338CE3D73309028ef1714D220c024", +- "transactionIndex": 20, +- "gasUsed": "946990", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x17148284d2da2f38c96346f1776C1BF7D7691231", ++ "transactionIndex": 190, ++ "gasUsed": "938127", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xdffd74b8ecb09c1ae45b4aeacf97b6e11f8b33fa368ff7fb35d5dbae8d18426a", +- "transactionHash": "0x42e7bc9094a85d8ca8d9029d807f8c8c272c389c54e628c5d0150f1b4f0ffd4e", ++ "blockHash": "0x56cb025c40901bbb2eb15d6bc77217c0ac353c3818c64f3f77e633fb38632c3c", ++ "transactionHash": "0xa0fa4d635bfad3355e2cd13fa457fec65005c297551764136ee21bd66bb8511a", + "logs": [], +- "blockNumber": 13596451, +- "cumulativeGasUsed": "2732660", ++ "blockNumber": 13502840, ++ "cumulativeGasUsed": "12537507", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + "CanonicalTransactionChain" + ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0x38917b618db448e356c76c999ce9aaca094541eb1f9bc65b06b8d4d84308f056\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620011b3380380620011b3833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f3d80620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_Buffer} from '../../libraries/utils/Lib_Buffer.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n 'ChainStorageContainer: Function can only be called by the owner.'\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x385d16b55113a367475ca36b4ce450b79984a5ca6f5a672789d8859ef6c41e6b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index)\\n internal\\n view\\n returns (bytes32)\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index)\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx)\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self)\\n internal\\n view\\n returns (BufferContext memory)\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({length: length, extraData: extraData});\\n }\\n}\\n\",\"keccak256\":\"0xfd40213c98e0c47e8f69bd36c155f6aad99a065052a64a0690ebe1f0ebd338b2\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", + "kind": "dev", +@@ -310,15 +310,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + }, + { +- "astId": 4067, ++ "astId": 4047, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +326,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 4070, ++ "astId": 4050, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10202_storage" ++ "type": "t_struct(Buffer)10193_storage" + } + ], + "types": { +@@ -340,7 +340,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +357,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10202_storage": { ++ "t_struct(Buffer)10193_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10197, ++ "astId": 10188, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +370,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10201, ++ "astId": 10192, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-queue.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-queue.json +new file mode 100644 +index 0000000..4e56aeb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-CTC-queue.json +@@ -0,0 +1,390 @@ ++{ ++ "address": "0x5f003030884B3a105809a0Eb0C0C28Ac40ECCD8d", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ }, ++ { ++ "internalType": "string", ++ "name": "_owner", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "deleteElementsAfterInclusive", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "uint256", ++ "name": "_index", ++ "type": "uint256" ++ } ++ ], ++ "name": "get", ++ "outputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "getGlobalMetadata", ++ "outputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "", ++ "type": "bytes27" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "length", ++ "outputs": [ ++ { ++ "internalType": "uint256", ++ "name": "", ++ "type": "uint256" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "owner", ++ "outputs": [ ++ { ++ "internalType": "string", ++ "name": "", ++ "type": "string" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "_object", ++ "type": "bytes32" ++ } ++ ], ++ "name": "push", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes27", ++ "name": "_globalMetadata", ++ "type": "bytes27" ++ } ++ ], ++ "name": "setGlobalMetadata", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x04bbfc70ea4a04166e279db941c80b120045b0bd666b93d23ec54a3f9f59692e", ++ "receipt": { ++ "to": null, ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x5f003030884B3a105809a0Eb0C0C28Ac40ECCD8d", ++ "transactionIndex": 179, ++ "gasUsed": "938127", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x1f17d17cf4b16132e8acc7c18fd15822c5479338f766e577f5069e10d3bcd72c", ++ "transactionHash": "0x04bbfc70ea4a04166e279db941c80b120045b0bd666b93d23ec54a3f9f59692e", ++ "logs": [], ++ "blockNumber": 13502855, ++ "cumulativeGasUsed": "13173964", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", ++ "CanonicalTransactionChain" ++ ], ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_Buffer} from '../../libraries/utils/Lib_Buffer.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n 'ChainStorageContainer: Function can only be called by the owner.'\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x385d16b55113a367475ca36b4ce450b79984a5ca6f5a672789d8859ef6c41e6b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index)\\n internal\\n view\\n returns (bytes32)\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index)\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx)\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self)\\n internal\\n view\\n returns (BufferContext memory)\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({length: length, extraData: extraData});\\n }\\n}\\n\",\"keccak256\":\"0xfd40213c98e0c47e8f69bd36c155f6aad99a065052a64a0690ebe1f0ebd338b2\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager.", ++ "_owner": "Name of the contract that owns this container (will be resolved later)." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256)": { ++ "params": { ++ "_index": "Object index to delete from." ++ } ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_index": "Object index to delete from." ++ } ++ }, ++ "get(uint256)": { ++ "params": { ++ "_index": "Index of the particular object to access." ++ }, ++ "returns": { ++ "_0": "32 byte object value." ++ } ++ }, ++ "getGlobalMetadata()": { ++ "returns": { ++ "_0": "Container global metadata field." ++ } ++ }, ++ "length()": { ++ "returns": { ++ "_0": "Number of objects in the container." ++ } ++ }, ++ "push(bytes32)": { ++ "params": { ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "push(bytes32,bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata for the container.", ++ "_object": "A 32 byte value to insert into the container." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "params": { ++ "_globalMetadata": "New global metadata to set." ++ } ++ } ++ }, ++ "title": "ChainStorageContainer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "deleteElementsAfterInclusive(uint256)": { ++ "notice": "Removes all objects after and including a given index." ++ }, ++ "deleteElementsAfterInclusive(uint256,bytes27)": { ++ "notice": "Removes all objects after and including a given index. Also allows setting the global metadata field." ++ }, ++ "get(uint256)": { ++ "notice": "Retrieves an object from the container." ++ }, ++ "getGlobalMetadata()": { ++ "notice": "Retrieves the container's global metadata field." ++ }, ++ "length()": { ++ "notice": "Retrieves the number of objects stored in the container." ++ }, ++ "push(bytes32)": { ++ "notice": "Pushes an object into the container." ++ }, ++ "push(bytes32,bytes27)": { ++ "notice": "Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \"length\" storage slot anyway, which also contains the global metadata (it's an optimization)." ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ }, ++ "setGlobalMetadata(bytes27)": { ++ "notice": "Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 6644, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)6636" ++ }, ++ { ++ "astId": 4047, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "owner", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_string_storage" ++ }, ++ { ++ "astId": 4050, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buffer", ++ "offset": 0, ++ "slot": "2", ++ "type": "t_struct(Buffer)10193_storage" ++ } ++ ], ++ "types": { ++ "t_bytes32": { ++ "encoding": "inplace", ++ "label": "bytes32", ++ "numberOfBytes": "32" ++ }, ++ "t_contract(Lib_AddressManager)6636": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ }, ++ "t_mapping(t_uint256,t_bytes32)": { ++ "encoding": "mapping", ++ "key": "t_uint256", ++ "label": "mapping(uint256 => bytes32)", ++ "numberOfBytes": "32", ++ "value": "t_bytes32" ++ }, ++ "t_string_storage": { ++ "encoding": "bytes", ++ "label": "string", ++ "numberOfBytes": "32" ++ }, ++ "t_struct(Buffer)10193_storage": { ++ "encoding": "inplace", ++ "label": "struct Lib_Buffer.Buffer", ++ "members": [ ++ { ++ "astId": 10188, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "context", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_bytes32" ++ }, ++ { ++ "astId": 10192, ++ "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", ++ "label": "buf", ++ "offset": 0, ++ "slot": "1", ++ "type": "t_mapping(t_uint256,t_bytes32)" ++ } ++ ], ++ "numberOfBytes": "64" ++ }, ++ "t_uint256": { ++ "encoding": "inplace", ++ "label": "uint256", ++ "numberOfBytes": "32" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-SCC-batches.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-SCC-batches.json +index 805ebf3..d48df60 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-SCC-batches.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChainStorageContainer-SCC-batches.json +@@ -1,5 +1,5 @@ + { +- "address": "0xb0ddFf09c4019e31960de11bD845E836078E8EbE", ++ "address": "0x13992B9f327faCA11568BE18a8ad3E9747e87d93", + "abi": [ + { + "inputs": [ +@@ -183,30 +183,30 @@ + "type": "function" + } + ], +- "transactionHash": "0xd7ecdfd84484e20389bdbf5cba0fa322ab2fbbad9210c336972c1d59c8bfba89", ++ "transactionHash": "0xd6d6000c57bede712975e0728b703afa7782e85c0ee4bab6fbdc245b1b97d902", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xb0ddFf09c4019e31960de11bD845E836078E8EbE", +- "transactionIndex": 36, +- "gasUsed": "946930", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x13992B9f327faCA11568BE18a8ad3E9747e87d93", ++ "transactionIndex": 412, ++ "gasUsed": "938067", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x958da862ab834f2bbc56689bdc62ba0d552c87cdfe368111687666885419e552", +- "transactionHash": "0xd7ecdfd84484e20389bdbf5cba0fa322ab2fbbad9210c336972c1d59c8bfba89", ++ "blockHash": "0x0389102c3ffff86ac9ca866b713303ba699479c19a222676727bad79597fdad3", ++ "transactionHash": "0xd6d6000c57bede712975e0728b703afa7782e85c0ee4bab6fbdc245b1b97d902", + "logs": [], +- "blockNumber": 13596457, +- "cumulativeGasUsed": "5059925", ++ "blockNumber": 13502887, ++ "cumulativeGasUsed": "29758777", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + "StateCommitmentChain" + ], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_Buffer } from \\\"../../libraries/utils/Lib_Buffer.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n \\\"ChainStorageContainer: Function can only be called by the owner.\\\"\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x4364f98f8f4f615cd4043ca64014c4b6c434a575a5709e8e5f35fd53df7370c2\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index) internal view returns (bytes32) {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, \\\"Index out of bounds.\\\");\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index) internal {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx) internal {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self) internal view returns (BufferContext memory) {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({ length: length, extraData: extraData });\\n }\\n}\\n\",\"keccak256\":\"0x38917b618db448e356c76c999ce9aaca094541eb1f9bc65b06b8d4d84308f056\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040523480156200001157600080fd5b50604051620011b3380380620011b3833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f3d80620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea264697066735822122008d3c580919ad7d42388bef81f9dfd29b521ea50250f4eb6e1cff3ebbec420cc64736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_owner\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"deleteElementsAfterInclusive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalMetadata\",\"outputs\":[{\"internalType\":\"bytes27\",\"name\":\"\",\"type\":\"bytes27\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"length\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"},{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_object\",\"type\":\"bytes32\"}],\"name\":\"push\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes27\",\"name\":\"_globalMetadata\",\"type\":\"bytes27\"}],\"name\":\"setGlobalMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\",\"_owner\":\"Name of the contract that owns this container (will be resolved later).\"}},\"deleteElementsAfterInclusive(uint256)\":{\"params\":{\"_index\":\"Object index to delete from.\"}},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_index\":\"Object index to delete from.\"}},\"get(uint256)\":{\"params\":{\"_index\":\"Index of the particular object to access.\"},\"returns\":{\"_0\":\"32 byte object value.\"}},\"getGlobalMetadata()\":{\"returns\":{\"_0\":\"Container global metadata field.\"}},\"length()\":{\"returns\":{\"_0\":\"Number of objects in the container.\"}},\"push(bytes32)\":{\"params\":{\"_object\":\"A 32 byte value to insert into the container.\"}},\"push(bytes32,bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata for the container.\",\"_object\":\"A 32 byte value to insert into the container.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setGlobalMetadata(bytes27)\":{\"params\":{\"_globalMetadata\":\"New global metadata to set.\"}}},\"title\":\"ChainStorageContainer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deleteElementsAfterInclusive(uint256)\":{\"notice\":\"Removes all objects after and including a given index.\"},\"deleteElementsAfterInclusive(uint256,bytes27)\":{\"notice\":\"Removes all objects after and including a given index. Also allows setting the global metadata field.\"},\"get(uint256)\":{\"notice\":\"Retrieves an object from the container.\"},\"getGlobalMetadata()\":{\"notice\":\"Retrieves the container's global metadata field.\"},\"length()\":{\"notice\":\"Retrieves the number of objects stored in the container.\"},\"push(bytes32)\":{\"notice\":\"Pushes an object into the container.\"},\"push(bytes32,bytes27)\":{\"notice\":\"Pushes an object into the container. Function allows setting the global metadata since we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global metadata (it's an optimization).\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setGlobalMetadata(bytes27)\":{\"notice\":\"Sets the container's global metadata field. We're using `bytes27` here because we use five bytes to maintain the length of the underlying data structure, meaning we have an extra 27 bytes to store arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/ChainStorageContainer.sol\":\"ChainStorageContainer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_Buffer} from '../../libraries/utils/Lib_Buffer.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ChainStorageContainer\\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\\n * chain state or transactions being finalized.\\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\\n * 1. Stores transaction batches for the Canonical Transaction Chain\\n * 2. Stores queued transactions for the Canonical Transaction Chain\\n * 3. Stores chain state batches for the State Commitment Chain\\n *\\n * Runtime target: EVM\\n */\\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Lib_Buffer.Buffer;\\n\\n /*************\\n * Variables *\\n *************/\\n\\n string public owner;\\n Lib_Buffer.Buffer internal buffer;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n * @param _owner Name of the contract that owns this container (will be resolved later).\\n */\\n constructor(address _libAddressManager, string memory _owner)\\n Lib_AddressResolver(_libAddressManager)\\n {\\n owner = _owner;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyOwner() {\\n require(\\n msg.sender == resolve(owner),\\n 'ChainStorageContainer: Function can only be called by the owner.'\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\\n return buffer.setExtraData(_globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function getGlobalMetadata() public view returns (bytes27) {\\n return buffer.getExtraData();\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function length() public view returns (uint256) {\\n return uint256(buffer.getLength());\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object) public onlyOwner {\\n buffer.push(_object);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\\n buffer.push(_object, _globalMetadata);\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function get(uint256 _index) public view returns (bytes32) {\\n return buffer.get(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\\n buffer.deleteElementsAfterInclusive(uint40(_index));\\n }\\n\\n /**\\n * @inheritdoc IChainStorageContainer\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n public\\n onlyOwner\\n {\\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\\n }\\n}\\n\",\"keccak256\":\"0x385d16b55113a367475ca36b4ce450b79984a5ca6f5a672789d8859ef6c41e6b\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Buffer\\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\\n * overwritable \\\"extra data\\\" field so we can store more information with a single SSTORE.\\n */\\nlibrary Lib_Buffer {\\n /*************\\n * Libraries *\\n *************/\\n\\n using Lib_Buffer for Buffer;\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct Buffer {\\n bytes32 context;\\n mapping(uint256 => bytes32) buf;\\n }\\n\\n struct BufferContext {\\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\\n // need in an array and we get an extra 27 bytes of extra data to play with.\\n uint40 length;\\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\\n // squeezing out some gas optimizations.\\n bytes27 extraData;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n * @param _extraData Global extra data.\\n */\\n function push(\\n Buffer storage _self,\\n bytes32 _value,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.buf[ctx.length] = _value;\\n\\n // Bump the global index and insert our extra data, then save the context.\\n ctx.length++;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Pushes a single element to the buffer.\\n * @param _self Buffer to access.\\n * @param _value Value to push to the buffer.\\n */\\n function push(Buffer storage _self, bytes32 _value) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n _self.push(_value, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves an element from the buffer.\\n * @param _self Buffer to access.\\n * @param _index Element index to retrieve.\\n * @return Value of the element at the given index.\\n */\\n function get(Buffer storage _self, uint256 _index)\\n internal\\n view\\n returns (bytes32)\\n {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n return _self.buf[_index];\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n * @param _extraData Optional global extra data.\\n */\\n function deleteElementsAfterInclusive(\\n Buffer storage _self,\\n uint40 _index,\\n bytes27 _extraData\\n ) internal {\\n BufferContext memory ctx = _self.getContext();\\n\\n require(_index < ctx.length, 'Index out of bounds.');\\n\\n // Set our length and extra data, save the context.\\n ctx.length = _index;\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Deletes all elements after (and including) a given index.\\n * @param _self Buffer to access.\\n * @param _index Index of the element to delete from (inclusive).\\n */\\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index)\\n internal\\n {\\n BufferContext memory ctx = _self.getContext();\\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\\n }\\n\\n /**\\n * Retrieves the current global index.\\n * @param _self Buffer to access.\\n * @return Current global index.\\n */\\n function getLength(Buffer storage _self) internal view returns (uint40) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.length;\\n }\\n\\n /**\\n * Changes current global extra data.\\n * @param _self Buffer to access.\\n * @param _extraData New global extra data.\\n */\\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\\n BufferContext memory ctx = _self.getContext();\\n ctx.extraData = _extraData;\\n _self.setContext(ctx);\\n }\\n\\n /**\\n * Retrieves the current global extra data.\\n * @param _self Buffer to access.\\n * @return Current global extra data.\\n */\\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\\n BufferContext memory ctx = _self.getContext();\\n return ctx.extraData;\\n }\\n\\n /**\\n * Sets the current buffer context.\\n * @param _self Buffer to access.\\n * @param _ctx Current buffer context.\\n */\\n function setContext(Buffer storage _self, BufferContext memory _ctx)\\n internal\\n {\\n bytes32 context;\\n uint40 length = _ctx.length;\\n bytes27 extraData = _ctx.extraData;\\n assembly {\\n context := length\\n context := or(context, extraData)\\n }\\n\\n if (_self.context != context) {\\n _self.context = context;\\n }\\n }\\n\\n /**\\n * Retrieves the current buffer context.\\n * @param _self Buffer to access.\\n * @return Current buffer context.\\n */\\n function getContext(Buffer storage _self)\\n internal\\n view\\n returns (BufferContext memory)\\n {\\n bytes32 context = _self.context;\\n uint40 length;\\n bytes27 extraData;\\n assembly {\\n // solhint-disable-next-line max-line-length\\n length := and(\\n context,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n // solhint-disable-next-line max-line-length\\n extraData := and(\\n context,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n }\\n\\n return BufferContext({length: length, extraData: extraData});\\n }\\n}\\n\",\"keccak256\":\"0xfd40213c98e0c47e8f69bd36c155f6aad99a065052a64a0690ebe1f0ebd338b2\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a", + "devdoc": { + "details": "The Chain Storage Container provides its owner contract with read, write and delete functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used in a fraud proof due to the fraud window having passed, and the associated chain state or transactions being finalized. Three distinct Chain Storage Containers will be deployed on Layer 1: 1. Stores transaction batches for the Canonical Transaction Chain 2. Stores queued transactions for the Canonical Transaction Chain 3. Stores chain state batches for the State Commitment Chain Runtime target: EVM", + "kind": "dev", +@@ -310,15 +310,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + }, + { +- "astId": 4067, ++ "astId": 4047, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "owner", + "offset": 0, +@@ -326,12 +326,12 @@ + "type": "t_string_storage" + }, + { +- "astId": 4070, ++ "astId": 4050, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buffer", + "offset": 0, + "slot": "2", +- "type": "t_struct(Buffer)10202_storage" ++ "type": "t_struct(Buffer)10193_storage" + } + ], + "types": { +@@ -340,7 +340,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +@@ -357,12 +357,12 @@ + "label": "string", + "numberOfBytes": "32" + }, +- "t_struct(Buffer)10202_storage": { ++ "t_struct(Buffer)10193_storage": { + "encoding": "inplace", + "label": "struct Lib_Buffer.Buffer", + "members": [ + { +- "astId": 10197, ++ "astId": 10188, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "context", + "offset": 0, +@@ -370,7 +370,7 @@ + "type": "t_bytes32" + }, + { +- "astId": 10201, ++ "astId": 10192, + "contract": "contracts/L1/rollup/ChainStorageContainer.sol:ChainStorageContainer", + "label": "buf", + "offset": 0, +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChugSplashDictator.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/ChugSplashDictator.json +deleted file mode 100644 +index 38ad668..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/ChugSplashDictator.json ++++ /dev/null +@@ -1,305 +0,0 @@ +-{ +- "address": "0xD86065136E3ab1e3FCBbf47B59404c08A431051A", +- "abi": [ +- { +- "inputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "_target", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_finalOwner", +- "type": "address" +- }, +- { +- "internalType": "bytes32", +- "name": "_codeHash", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_messengerSlotVal", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotKey", +- "type": "bytes32" +- }, +- { +- "internalType": "bytes32", +- "name": "_bridgeSlotVal", +- "type": "bytes32" +- } +- ], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "bridgeSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "codeHash", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "bytes", +- "name": "_code", +- "type": "bytes" +- } +- ], +- "name": "doActions", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "finalOwner", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "isUpgrading", +- "outputs": [ +- { +- "internalType": "bool", +- "name": "", +- "type": "bool" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotKey", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messengerSlotVal", +- "outputs": [ +- { +- "internalType": "bytes32", +- "name": "", +- "type": "bytes32" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "returnOwnership", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "target", +- "outputs": [ +- { +- "internalType": "contract L1ChugSplashProxy", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- } +- ], +- "transactionHash": "0x66aa5170e6ce4a62d40bf909c390b0263ae5df08d922b682374273b34fa03f0f", +- "receipt": { +- "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xD86065136E3ab1e3FCBbf47B59404c08A431051A", +- "transactionIndex": 24, +- "gasUsed": "600228", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x2fc3021674d5715905434b8544da54a0036c015f330bb803a6f6b863b7459dca", +- "transactionHash": "0x66aa5170e6ce4a62d40bf909c390b0263ae5df08d922b682374273b34fa03f0f", +- "logs": [], +- "blockNumber": 13596791, +- "cumulativeGasUsed": "3529686", +- "status": 1, +- "byzantium": true +- }, +- "args": [ +- "0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1", +- "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A", +- "0x395448fabf9c422ff29a22e5b39869e32d00ca911f7553ec25591d8d47befaa1", +- "0x0000000000000000000000000000000000000000000000000000000000000000", +- "0x00000000000000000000000025ace71c97B33Cc4729CF772ae268934F7ab5fA1", +- "0x0000000000000000000000000000000000000000000000000000000000000001", +- "0x0000000000000000000000004200000000000000000000000000000000000010" +- ], +- "solcInputHash": "475653b7e5822844bbc8885f604f5e79", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_finalOwner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_codeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotVal\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotVal\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"bridgeSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"codeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"doActions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"returnOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"ChugSplashDictator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"returnOwnership()\":{\"notice\":\"Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":\"ChugSplashDictator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { L1ChugSplashProxy } from \\\"../../chugsplash/L1ChugSplashProxy.sol\\\";\\nimport { iL1ChugSplashDeployer } from \\\"../../chugsplash/interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title ChugSplashDictator\\n * @dev Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're\\n * working on a generalized version of this but this is good enough for the moment.\\n */\\ncontract ChugSplashDictator is iL1ChugSplashDeployer {\\n /*************\\n * Variables *\\n *************/\\n\\n bool public isUpgrading = true;\\n L1ChugSplashProxy public target;\\n address public finalOwner;\\n bytes32 public codeHash;\\n bytes32 public messengerSlotKey;\\n bytes32 public messengerSlotVal;\\n bytes32 public bridgeSlotKey;\\n bytes32 public bridgeSlotVal;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n L1ChugSplashProxy _target,\\n address _finalOwner,\\n bytes32 _codeHash,\\n bytes32 _messengerSlotKey,\\n bytes32 _messengerSlotVal,\\n bytes32 _bridgeSlotKey,\\n bytes32 _bridgeSlotVal\\n ) {\\n target = _target;\\n finalOwner = _finalOwner;\\n codeHash = _codeHash;\\n messengerSlotKey = _messengerSlotKey;\\n messengerSlotVal = _messengerSlotVal;\\n bridgeSlotKey = _bridgeSlotKey;\\n bridgeSlotVal = _bridgeSlotVal;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function doActions(bytes memory _code) external {\\n require(keccak256(_code) == codeHash, \\\"ChugSplashDictator: Incorrect code hash.\\\");\\n\\n target.setCode(_code);\\n target.setStorage(messengerSlotKey, messengerSlotVal);\\n target.setStorage(bridgeSlotKey, bridgeSlotVal);\\n target.setOwner(finalOwner);\\n }\\n\\n /**\\n * Transfers ownership of this contract to the finalOwner.\\n * Only callable by the finalOwner, which is intended to be our multisig.\\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can\\n * recover if something really surprising goes wrong.\\n */\\n function returnOwnership() external {\\n require(msg.sender == finalOwner, \\\"ChugSplashDictator: only callable by finalOwner\\\");\\n\\n target.setOwner(finalOwner);\\n }\\n}\\n\",\"keccak256\":\"0xd6b7d80400d6cafd7d65c00715f3f03305537e96b25ff75f13f5c3163e81256c\",\"license\":\"MIT\"},\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc30cc735cf86431bd2234a3689d536aa76e5765522ff9f5b7c160deed85fa099\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x60806040526000805460ff1916600117905534801561001d57600080fd5b5060405161088338038061088383398101604081905261003c916100a8565b60008054610100600160a81b0319166101006001600160a01b03998a1602179055600180546001600160a01b031916969097169590951790955560029290925560035560045560059190915560065561010f565b6001600160a01b03811681146100a557600080fd5b50565b600080600080600080600060e0888a0312156100c357600080fd5b87516100ce81610090565b60208901519097506100df81610090565b604089015160608a015160808b015160a08c015160c0909c01519a9d939c50919a90999198509650945092505050565b6107658061011e6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220ea63e0ffbf6691431ee73a4c29831d3972b1c90e51eb75830c3242850fd79a1c64736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063708518de11610076578063a3b2d8a51161005b578063a3b2d8a51461015c578063b794726214610165578063d4b839921461018257600080fd5b8063708518de1461014a578063907023dd1461015357600080fd5b806318edaaf2116100a757806318edaaf214610122578063297d1a34146101395780635307023b1461014157600080fd5b80630bf56f21146100c357806317ad94ec146100d8575b600080fd5b6100d66100d13660046105ed565b6101a7565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012b60025481565b604051908152602001610119565b6100d6610489565b61012b60045481565b61012b60035481565b61012b60065481565b61012b60055481565b6000546101729060ff1681565b6040519015158152602001610119565b6000546100f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6002548151602083012014610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f60448201527f646520686173682e00000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546040517f6c5d4ad000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff1690636c5d4ad09061029d9084906004016106bc565b600060405180830381600087803b1580156102b757600080fd5b505af11580156102cb573d6000803e3d6000fd5b5050600054600354600480546040517f9b0b0fda00000000000000000000000000000000000000000000000000000000815291820192909252602481019190915261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b15801561034e57600080fd5b505af1158015610362573d6000803e3d6000fd5b50506000546005546006546040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081526004810192909252602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169250639b0b0fda9150604401600060405180830381600087803b1580156103e257600080fd5b505af11580156103f6573d6000803e3d6000fd5b50506000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526101009092041692506313af40359150602401600060405180830381600087803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201527f652062792066696e616c4f776e65720000000000000000000000000000000000606482015260840161023a565b6000546001546040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156105a457600080fd5b505af11580156105b8573d6000803e3d6000fd5b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156105ff57600080fd5b813567ffffffffffffffff8082111561061757600080fd5b818401915084601f83011261062b57600080fd5b81358181111561063d5761063d6105be565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610683576106836105be565b8160405282815287602084870101111561069c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156106e9578581018301518582016040015282016106cd565b818111156106fb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea2646970667358221220ea63e0ffbf6691431ee73a4c29831d3972b1c90e51eb75830c3242850fd79a1c64736f6c63430008090033", +- "devdoc": { +- "details": "Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.", +- "kind": "dev", +- "methods": {}, +- "title": "ChugSplashDictator", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": { +- "returnOwnership()": { +- "notice": "Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong." +- } +- }, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 11, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "isUpgrading", +- "offset": 0, +- "slot": "0", +- "type": "t_bool" +- }, +- { +- "astId": 14, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "target", +- "offset": 1, +- "slot": "0", +- "type": "t_contract(L1ChugSplashProxy)420" +- }, +- { +- "astId": 16, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "finalOwner", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 18, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "codeHash", +- "offset": 0, +- "slot": "2", +- "type": "t_bytes32" +- }, +- { +- "astId": 20, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "messengerSlotKey", +- "offset": 0, +- "slot": "3", +- "type": "t_bytes32" +- }, +- { +- "astId": 22, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "messengerSlotVal", +- "offset": 0, +- "slot": "4", +- "type": "t_bytes32" +- }, +- { +- "astId": 24, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "bridgeSlotKey", +- "offset": 0, +- "slot": "5", +- "type": "t_bytes32" +- }, +- { +- "astId": 26, +- "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", +- "label": "bridgeSlotVal", +- "offset": 0, +- "slot": "6", +- "type": "t_bytes32" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_bool": { +- "encoding": "inplace", +- "label": "bool", +- "numberOfBytes": "1" +- }, +- "t_bytes32": { +- "encoding": "inplace", +- "label": "bytes32", +- "numberOfBytes": "32" +- }, +- "t_contract(L1ChugSplashProxy)420": { +- "encoding": "inplace", +- "label": "contract L1ChugSplashProxy", +- "numberOfBytes": "20" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/L1MultiMessageRelayer.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/L1MultiMessageRelayer.json +new file mode 100644 +index 0000000..53e8fc1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/L1MultiMessageRelayer.json +@@ -0,0 +1,234 @@ ++{ ++ "address": "0x5fD2CF99586B9D92f56CbaD0A3Ea4DF256A0070B", ++ "abi": [ ++ { ++ "inputs": [ ++ { ++ "internalType": "address", ++ "name": "_libAddressManager", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "nonpayable", ++ "type": "constructor" ++ }, ++ { ++ "inputs": [ ++ { ++ "components": [ ++ { ++ "internalType": "address", ++ "name": "target", ++ "type": "address" ++ }, ++ { ++ "internalType": "address", ++ "name": "sender", ++ "type": "address" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "message", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "messageNonce", ++ "type": "uint256" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "bytes32", ++ "name": "stateRoot", ++ "type": "bytes32" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "batchIndex", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32", ++ "name": "batchRoot", ++ "type": "bytes32" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "batchSize", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "uint256", ++ "name": "prevTotalElements", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "extraData", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainBatchHeader", ++ "name": "stateRootBatchHeader", ++ "type": "tuple" ++ }, ++ { ++ "components": [ ++ { ++ "internalType": "uint256", ++ "name": "index", ++ "type": "uint256" ++ }, ++ { ++ "internalType": "bytes32[]", ++ "name": "siblings", ++ "type": "bytes32[]" ++ } ++ ], ++ "internalType": "struct Lib_OVMCodec.ChainInclusionProof", ++ "name": "stateRootProof", ++ "type": "tuple" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "stateTrieWitness", ++ "type": "bytes" ++ }, ++ { ++ "internalType": "bytes", ++ "name": "storageTrieWitness", ++ "type": "bytes" ++ } ++ ], ++ "internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ "name": "proof", ++ "type": "tuple" ++ } ++ ], ++ "internalType": "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ "name": "_messages", ++ "type": "tuple[]" ++ } ++ ], ++ "name": "batchRelayMessages", ++ "outputs": [], ++ "stateMutability": "nonpayable", ++ "type": "function" ++ }, ++ { ++ "inputs": [], ++ "name": "libAddressManager", ++ "outputs": [ ++ { ++ "internalType": "contract Lib_AddressManager", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, ++ { ++ "inputs": [ ++ { ++ "internalType": "string", ++ "name": "_name", ++ "type": "string" ++ } ++ ], ++ "name": "resolve", ++ "outputs": [ ++ { ++ "internalType": "address", ++ "name": "", ++ "type": "address" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ } ++ ], ++ "transactionHash": "0x01ed9496366a2c181efa65a44750ace599e542a4390c8eee494dd722fedea1f4", ++ "receipt": { ++ "to": null, ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x5fD2CF99586B9D92f56CbaD0A3Ea4DF256A0070B", ++ "transactionIndex": 441, ++ "gasUsed": "697858", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x340c362956156c91d46f2848a4ac78e2663169a34fd573c275802d2795059e05", ++ "transactionHash": "0x01ed9496366a2c181efa65a44750ace599e542a4390c8eee494dd722fedea1f4", ++ "logs": [], ++ "blockNumber": 13503005, ++ "cumulativeGasUsed": "26190889", ++ "status": 1, ++ "byzantium": true ++ }, ++ "args": [ ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089" ++ ], ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct L1MultiMessageRelayer.L2ToL1Message[]\",\"name\":\"_messages\",\"type\":\"tuple[]\"}],\"name\":\"batchRelayMessages\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"params\":{\"_messages\":\"An array of L2 to L1 messages\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"title\":\"L1MultiMessageRelayer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])\":{\"notice\":\"Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":\"L1MultiMessageRelayer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/* Interface Imports */\\nimport {ICrossDomainMessenger} from '../../libraries/bridge/ICrossDomainMessenger.sol';\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x3787f6d980f167477e6bdf7f0b41504b8611d9a37557a584e8e85d253f1fd294\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1MultiMessageRelayer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.7.5;\\npragma experimental ABIEncoderV2;\\n\\n/* Interface Imports */\\nimport {IL1CrossDomainMessenger} from './IL1CrossDomainMessenger.sol';\\n\\n/* Library Imports */\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\n\\n/**\\n * @title L1MultiMessageRelayer\\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\\n * Message Sender.\\n *\\n * Compiler used: solc\\n * Runtime target: EVM\\n */\\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\\n /***************\\n * Structure *\\n ***************/\\n\\n struct L2ToL1Message {\\n address target;\\n address sender;\\n bytes message;\\n uint256 messageNonce;\\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\\n }\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(address _libAddressManager)\\n Lib_AddressResolver(_libAddressManager)\\n {}\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n modifier onlyBatchRelayer() {\\n require(\\n msg.sender == resolve('L2BatchMessageRelayer'),\\n // solhint-disable-next-line max-line-length\\n 'L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer'\\n );\\n _;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\\n * @param _messages An array of L2 to L1 messages\\n */\\n function batchRelayMessages(L2ToL1Message[] calldata _messages)\\n external\\n onlyBatchRelayer\\n {\\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\\n resolve('Proxy__L1CrossDomainMessenger')\\n );\\n\\n for (uint256 i = 0; i < _messages.length; i++) {\\n L2ToL1Message memory message = _messages[i];\\n messenger.relayMessage(\\n message.target,\\n message.sender,\\n message.message,\\n message.messageNonce,\\n message.proof\\n );\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2e2d726bad682c7cbcaf1f3ba829d4fe156f24c570ebab6035edb63980e39753\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x911ffc2920ba7ee55c4af17430e36e2776c1b9cc313a285c24ec866d0c57dea8\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\\nimport {Lib_Bytes32Utils} from '../utils/Lib_Bytes32Utils.sol';\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded)\\n internal\\n pure\\n returns (EVMAccount memory)\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(\\n _encoded\\n );\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x984f547b018437d8624ae21bff0bd42c37f14576853a6c561313233ff3eacdb3\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({length: _in.length, ptr: ptr});\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in)\\n internal\\n pure\\n returns (RLPItem[] memory)\\n {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, 'Invalid RLP list value.');\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n 'Provided RLP list exceeds max list length.'\\n );\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({length: _in.length - offset, ptr: _in.ptr + offset})\\n );\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes value.');\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, 'Invalid RLP bytes32 value.');\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes32 value.');\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, 'Invalid RLP boolean value.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n 'Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1'\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, 'Invalid RLP address value.');\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, 'RLP item cannot be null.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, 'Invalid RLP short string.');\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, 'Invalid RLP long string length.');\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, 'Invalid RLP long string.');\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, 'Invalid RLP short list.');\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, 'Invalid RLP long list length.');\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, 'Invalid RLP long list.');\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x1d00ffbf595d95145544291f36a97de453b51032bb03a6247f890d2805b55955\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset)\\n private\\n pure\\n returns (bytes memory)\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb3a03376fea9bfc947af1719158aac3daa6343cb0329a1c2a33016a29c53970a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0x675b6d1b5a1b5a80f31c2a8a33adc8105e8b38c2e21626706c8f7e9be74346e2\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, 'slice_overflow');\\n require(_start + _length >= _start, 'slice_overflow');\\n require(_bytes.length >= _start + _length, 'slice_outOfBounds');\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(\\n add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))),\\n _start\\n )\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other)\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xdf5a3f5021b71789c9c056164d76634add7fa005c1d0a927d80b609f0090f2e5\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a", ++ "devdoc": { ++ "details": "The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain Message Sender. Compiler used: solc Runtime target: EVM", ++ "kind": "dev", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "params": { ++ "_messages": "An array of L2 to L1 messages" ++ } ++ }, ++ "constructor": { ++ "params": { ++ "_libAddressManager": "Address of the Address Manager." ++ } ++ }, ++ "resolve(string)": { ++ "params": { ++ "_name": "Name to resolve an address for." ++ }, ++ "returns": { ++ "_0": "Address associated with the given name." ++ } ++ } ++ }, ++ "title": "L1MultiMessageRelayer", ++ "version": 1 ++ }, ++ "userdoc": { ++ "kind": "user", ++ "methods": { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": { ++ "notice": "Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying" ++ }, ++ "resolve(string)": { ++ "notice": "Resolves the address associated with a given name." ++ } ++ }, ++ "version": 1 ++ }, ++ "storageLayout": { ++ "storage": [ ++ { ++ "astId": 6644, ++ "contract": "contracts/L1/messaging/L1MultiMessageRelayer.sol:L1MultiMessageRelayer", ++ "label": "libAddressManager", ++ "offset": 0, ++ "slot": "0", ++ "type": "t_contract(Lib_AddressManager)6636" ++ } ++ ], ++ "types": { ++ "t_contract(Lib_AddressManager)6636": { ++ "encoding": "inplace", ++ "label": "contract Lib_AddressManager", ++ "numberOfBytes": "20" ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/L1StandardBridge_for_verification_only.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/L1StandardBridge_for_verification_only.json +deleted file mode 100644 +index 0ad23f6..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/L1StandardBridge_for_verification_only.json ++++ /dev/null +@@ -1,577 +0,0 @@ +-{ +- "address": "0x29Ea454F8f2750e345E52e302A0c09f1A5215AC7", +- "abi": [ +- { +- "inputs": [], +- "stateMutability": "nonpayable", +- "type": "constructor" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ERC20DepositInitiated", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ERC20WithdrawalFinalized", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ETHDepositInitiated", +- "type": "event" +- }, +- { +- "anonymous": false, +- "inputs": [ +- { +- "indexed": true, +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "indexed": true, +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "indexed": false, +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "indexed": false, +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "ETHWithdrawalFinalized", +- "type": "event" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositERC20", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositERC20To", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositETH", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint32", +- "name": "_l2Gas", +- "type": "uint32" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "depositETHTo", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "name": "deposits", +- "outputs": [ +- { +- "internalType": "uint256", +- "name": "", +- "type": "uint256" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "donateETH", +- "outputs": [], +- "stateMutability": "payable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2Token", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "finalizeERC20Withdrawal", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_from", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_to", +- "type": "address" +- }, +- { +- "internalType": "uint256", +- "name": "_amount", +- "type": "uint256" +- }, +- { +- "internalType": "bytes", +- "name": "_data", +- "type": "bytes" +- } +- ], +- "name": "finalizeETHWithdrawal", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [ +- { +- "internalType": "address", +- "name": "_l1messenger", +- "type": "address" +- }, +- { +- "internalType": "address", +- "name": "_l2TokenBridge", +- "type": "address" +- } +- ], +- "name": "initialize", +- "outputs": [], +- "stateMutability": "nonpayable", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "l2TokenBridge", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "inputs": [], +- "name": "messenger", +- "outputs": [ +- { +- "internalType": "address", +- "name": "", +- "type": "address" +- } +- ], +- "stateMutability": "view", +- "type": "function" +- }, +- { +- "stateMutability": "payable", +- "type": "receive" +- } +- ], +- "transactionHash": "0x6964eba7d623da75d18f36f26f2f93aed69864593b300b2f8a042b78df2bbfe4", +- "receipt": { +- "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0x29Ea454F8f2750e345E52e302A0c09f1A5215AC7", +- "transactionIndex": 37, +- "gasUsed": "1467253", +- "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xae31bbd7e7a3a852ca8b7074eb8c361afff2a33582459514db9ef42ea1f4a613", +- "transactionHash": "0x6964eba7d623da75d18f36f26f2f93aed69864593b300b2f8a042b78df2bbfe4", +- "logs": [], +- "blockNumber": 13596925, +- "cumulativeGasUsed": "3636752", +- "status": 1, +- "byzantium": true +- }, +- "args": [], +- "solcInputHash": "8a22f2b322f61ab13865f2d2a82e5f09", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ERC20DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ERC20WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ETHDepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"ETHWithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_l2Gas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeERC20Withdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeETHWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2TokenBridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2TokenBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits and listening to it for newly finalized withdrawals. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"depositERC20(address,address,uint256,uint32,bytes)\":{\"details\":\"deposit an amount of the ERC20 to the caller's balance on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l1Token\":\"Address of the L1 ERC20 we are depositing\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_l2Token\":\"Address of the L1 respective L2 ERC20\"}},\"depositERC20To(address,address,address,uint256,uint32,bytes)\":{\"details\":\"deposit an amount of ERC20 to a recipient's balance on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l1Token\":\"Address of the L1 ERC20 we are depositing\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_l2Token\":\"Address of the L1 respective L2 ERC20\",\"_to\":\"L2 address to credit the withdrawal to.\"}},\"depositETH(uint32,bytes)\":{\"details\":\"Deposit an amount of the ETH to the caller's balance on L2.\",\"params\":{\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\"}},\"depositETHTo(address,uint32,bytes)\":{\"details\":\"Deposit an amount of ETH to a recipient's balance on L2.\",\"params\":{\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_l2Gas\":\"Gas limit required to complete the deposit on L2.\",\"_to\":\"L2 address to credit the withdrawal to.\"}},\"donateETH()\":{\"details\":\"Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway. NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract\"},\"finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ERC20 token. This call will fail if the initialized withdrawal from L2 has not been finalized.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Data provided by the sender on L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_from\":\"L2 address initiating the transfer.\",\"_l1Token\":\"Address of L1 token to finalizeWithdrawal for.\",\"_l2Token\":\"Address of L2 token where withdrawal was initiated.\",\"_to\":\"L1 address to credit the withdrawal to.\"}},\"finalizeETHWithdrawal(address,address,uint256,bytes)\":{\"details\":\"Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_data\":\"Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.\",\"_from\":\"L2 address initiating the transfer.\",\"_to\":\"L1 address to credit the withdrawal to.\"}},\"initialize(address,address)\":{\"params\":{\"_l1messenger\":\"L1 Messenger address being used for cross-chain communications.\",\"_l2TokenBridge\":\"L2 standard bridge address.\"}}},\"stateVariables\":{\"l2TokenBridge\":{\"details\":\"get the address of the corresponding L2 bridge contract.\",\"return\":\"Address of the corresponding L2 bridge contract.\",\"returns\":{\"_0\":\"Address of the corresponding L2 bridge contract.\"}}},\"title\":\"L1StandardBridge\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1StandardBridge.sol\":\"L1StandardBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n assembly {\\n size := extcodesize(account)\\n }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1ERC20Bridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IL1ERC20Bridge\\n */\\ninterface IL1ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n\\n event ERC20DepositInitiated(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event ERC20WithdrawalFinalized(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev get the address of the corresponding L2 bridge contract.\\n * @return Address of the corresponding L2 bridge contract.\\n */\\n function l2TokenBridge() external returns (address);\\n\\n /**\\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _amount Amount of the ERC20 to deposit\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositERC20(\\n address _l1Token,\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external;\\n\\n /**\\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _to L2 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositERC20To(\\n address _l1Token,\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ERC20 token.\\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\\n *\\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\\n * @param _l2Token Address of L2 token where withdrawal was initiated.\\n * @param _from L2 address initiating the transfer.\\n * @param _to L1 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _data Data provided by the sender on L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeERC20Withdrawal(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x69f831896dcbb6bef4f2d6c8be6cd1bf352f5910074d3ce973b9f8e0a4f4c1dd\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1StandardBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\nimport \\\"./IL1ERC20Bridge.sol\\\";\\n\\n/**\\n * @title IL1StandardBridge\\n */\\ninterface IL1StandardBridge is IL1ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n event ETHDepositInitiated(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event ETHWithdrawalFinalized(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\\n\\n /**\\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\\n * @param _to L2 address to credit the withdrawal to.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function depositETHTo(\\n address _to,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external payable;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\\n * before the withdrawal is finalized.\\n * @param _from L2 address initiating the transfer.\\n * @param _to L1 address to credit the withdrawal to.\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeETHWithdrawal(\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x3d511f1bcea86aa88a9c41798926ea75b5b3f455c0377e63223a123a9e714ddc\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1StandardBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Interface Imports */\\nimport { IL1StandardBridge } from \\\"./IL1StandardBridge.sol\\\";\\nimport { IL1ERC20Bridge } from \\\"./IL1ERC20Bridge.sol\\\";\\nimport { IL2ERC20Bridge } from \\\"../../L2/messaging/IL2ERC20Bridge.sol\\\";\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\n/* Library Imports */\\nimport { CrossDomainEnabled } from \\\"../../libraries/bridge/CrossDomainEnabled.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport { SafeERC20 } from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/**\\n * @title L1StandardBridge\\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\\n * and listening to it for newly finalized withdrawals.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\\n using SafeERC20 for IERC20;\\n\\n /********************************\\n * External Contract References *\\n ********************************/\\n\\n address public l2TokenBridge;\\n\\n // Maps L1 token to L2 token to balance of the L1 token deposited\\n mapping(address => mapping(address => uint256)) public deposits;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n // This contract lives behind a proxy, so the constructor parameters will go unused.\\n constructor() CrossDomainEnabled(address(0)) {}\\n\\n /******************\\n * Initialization *\\n ******************/\\n\\n /**\\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\\n * @param _l2TokenBridge L2 standard bridge address.\\n */\\n function initialize(address _l1messenger, address _l2TokenBridge) public {\\n require(messenger == address(0), \\\"Contract has already been initialized.\\\");\\n messenger = _l1messenger;\\n l2TokenBridge = _l2TokenBridge;\\n }\\n\\n /**************\\n * Depositing *\\n **************/\\n\\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\\n * contract via initcode, but it takes care of the user error we want to avoid.\\n */\\n modifier onlyEOA() {\\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\\n require(!Address.isContract(msg.sender), \\\"Account not EOA\\\");\\n _;\\n }\\n\\n /**\\n * @dev This function can be called with no data\\n * to deposit an amount of ETH to the caller's balance on L2.\\n * Since the receive function doesn't take data, a conservative\\n * default amount is forwarded to L2.\\n */\\n receive() external payable onlyEOA {\\n _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(\\\"\\\"));\\n }\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA {\\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function depositETHTo(\\n address _to,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external payable {\\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\\n * the deposit.\\n * @param _from Account to pull the deposit from on L1.\\n * @param _to Account to give the deposit to on L2.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function _initiateETHDeposit(\\n address _from,\\n address _to,\\n uint32 _l2Gas,\\n bytes memory _data\\n ) internal {\\n // Construct calldata for finalizeDeposit call\\n bytes memory message = abi.encodeWithSelector(\\n IL2ERC20Bridge.finalizeDeposit.selector,\\n address(0),\\n Lib_PredeployAddresses.OVM_ETH,\\n _from,\\n _to,\\n msg.value,\\n _data\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\\n\\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function depositERC20(\\n address _l1Token,\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external virtual onlyEOA {\\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function depositERC20To(\\n address _l1Token,\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) external virtual {\\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\\n }\\n\\n /**\\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\\n *\\n * @param _l1Token Address of the L1 ERC20 we are depositing\\n * @param _l2Token Address of the L1 respective L2 ERC20\\n * @param _from Account to pull the deposit from on L1\\n * @param _to Account to give the deposit to on L2\\n * @param _amount Amount of the ERC20 to deposit.\\n * @param _l2Gas Gas limit required to complete the deposit on L2.\\n * @param _data Optional data to forward to L2. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function _initiateERC20Deposit(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n uint32 _l2Gas,\\n bytes calldata _data\\n ) internal {\\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\\n // _from is an EOA or address(0).\\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\\n\\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\\n bytes memory message = abi.encodeWithSelector(\\n IL2ERC20Bridge.finalizeDeposit.selector,\\n _l1Token,\\n _l2Token,\\n _from,\\n _to,\\n _amount,\\n _data\\n );\\n\\n // Send calldata into L2\\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\\n\\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\\n\\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\\n }\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @inheritdoc IL1StandardBridge\\n */\\n function finalizeETHWithdrawal(\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\\n (bool success, ) = _to.call{ value: _amount }(new bytes(0));\\n require(success, \\\"TransferHelper::safeTransferETH: ETH transfer failed\\\");\\n\\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\\n }\\n\\n /**\\n * @inheritdoc IL1ERC20Bridge\\n */\\n function finalizeERC20Withdrawal(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\\n\\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\\n IERC20(_l1Token).safeTransfer(_to, _amount);\\n\\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\\n }\\n\\n /*****************************\\n * Temporary - Migrating ETH *\\n *****************************/\\n\\n /**\\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\\n * to be migrated from an old gateway to a new gateway.\\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\\n * old contract\\n */\\n function donateETH() external payable {}\\n}\\n\",\"keccak256\":\"0x595295916d768e901f2b55589871ebd130b202cb2a9de6ba038382fbb058adaa\",\"license\":\"MIT\"},\"contracts/L2/messaging/IL2ERC20Bridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IL2ERC20Bridge\\n */\\ninterface IL2ERC20Bridge {\\n /**********\\n * Events *\\n **********/\\n\\n event WithdrawalInitiated(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event DepositFinalized(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n event DepositFailed(\\n address indexed _l1Token,\\n address indexed _l2Token,\\n address indexed _from,\\n address _to,\\n uint256 _amount,\\n bytes _data\\n );\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @dev get the address of the corresponding L1 bridge contract.\\n * @return Address of the corresponding L1 bridge contract.\\n */\\n function l1TokenBridge() external returns (address);\\n\\n /**\\n * @dev initiate a withdraw of some tokens to the caller's account on L1\\n * @param _l2Token Address of L2 token where withdrawal was initiated.\\n * @param _amount Amount of the token to withdraw.\\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\\n * @param _data Optional data to forward to L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function withdraw(\\n address _l2Token,\\n uint256 _amount,\\n uint32 _l1Gas,\\n bytes calldata _data\\n ) external;\\n\\n /**\\n * @dev initiate a withdraw of some token to a recipient's account on L1.\\n * @param _l2Token Address of L2 token where withdrawal is initiated.\\n * @param _to L1 adress to credit the withdrawal to.\\n * @param _amount Amount of the token to withdraw.\\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\\n * @param _data Optional data to forward to L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function withdrawTo(\\n address _l2Token,\\n address _to,\\n uint256 _amount,\\n uint32 _l1Gas,\\n bytes calldata _data\\n ) external;\\n\\n /*************************\\n * Cross-chain Functions *\\n *************************/\\n\\n /**\\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\\n * L1StandardTokenBridge.\\n * @param _l1Token Address for the l1 token this is called with\\n * @param _l2Token Address for the l2 token this is called with\\n * @param _from Account to pull the deposit from on L2.\\n * @param _to Address to receive the withdrawal at\\n * @param _amount Amount of the token to withdraw\\n * @param _data Data provider by the sender on L1. This data is provided\\n * solely as a convenience for external contracts. Aside from enforcing a maximum\\n * length, these contracts provide no guarantees about its content.\\n */\\n function finalizeDeposit(\\n address _l1Token,\\n address _l2Token,\\n address _from,\\n address _to,\\n uint256 _amount,\\n bytes calldata _data\\n ) external;\\n}\\n\",\"keccak256\":\"0x4674c3c8733ca0db16c2b81d58227560df36a07ded3b637a0793564d90ac0475\",\"license\":\"MIT\"},\"contracts/libraries/bridge/CrossDomainEnabled.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"./ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title CrossDomainEnabled\\n * @dev Helper contract for contracts performing cross-domain communications\\n *\\n * Compiler used: defined by inheriting contract\\n * Runtime target: defined by inheriting contract\\n */\\ncontract CrossDomainEnabled {\\n /*************\\n * Variables *\\n *************/\\n\\n // Messenger contract used to send and recieve messages from the other domain.\\n address public messenger;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\\n */\\n constructor(address _messenger) {\\n messenger = _messenger;\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Enforces that the modified function is only callable by a specific cross-domain account.\\n * @param _sourceDomainAccount The only account on the originating domain which is\\n * authenticated to call this function.\\n */\\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\\n require(\\n msg.sender == address(getCrossDomainMessenger()),\\n \\\"OVM_XCHAIN: messenger contract unauthenticated\\\"\\n );\\n\\n require(\\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\\n \\\"OVM_XCHAIN: wrong sender of cross-domain message\\\"\\n );\\n\\n _;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\\n * needs to override.\\n * @return The address of the cross-domain messenger contract which should be used.\\n */\\n function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {\\n return ICrossDomainMessenger(messenger);\\n }\\n\\n /**q\\n * Sends a message to an account on another domain\\n * @param _crossDomainTarget The intended recipient on the destination domain\\n * @param _message The data to send to the target (usually calldata to a function with\\n * `onlyFromCrossDomainAccount()`)\\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\\n */\\n function sendCrossDomainMessage(\\n address _crossDomainTarget,\\n uint32 _gasLimit,\\n bytes memory _message\\n ) internal {\\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\\n }\\n}\\n\",\"keccak256\":\"0x196609a9af91807d89f2d781c637a049bdc64c2d29ebed4b758b0a342576c4eb\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0x2bc28307af93e9716151a41a81694b56cbe513ef5eb335fb1d81f35e5db8edfa\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916905561199e806100306000396000f3fe6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220d862fb20d11a0a1fd01b325278c9f5c2c492f9915c195c3e0f9e8c458fdb424464736f6c63430008090033", +- "deployedBytecode": "0x6080604052600436106100c05760003560e01c80638b4c40b0116100745780639a2ac6d51161004e5780639a2ac6d514610288578063a9f9e6751461029b578063b1a1a882146102bb57600080fd5b80638b4c40b0146101375780638f601f661461021557806391c49bf81461025b57600080fd5b8063485cc955116100a5578063485cc955146101b557806358a997f6146101d5578063838b2520146101f557600080fd5b80631532ec341461013e5780633cb747bf1461015e57600080fd5b3661013957333b156101195760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b610137333362030d40604051806020016040528060008152506102ce565b005b600080fd5b34801561014a57600080fd5b50610137610159366004611357565b61041a565b34801561016a57600080fd5b5060005461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c157600080fd5b506101376101d03660046113ca565b610790565b3480156101e157600080fd5b506101376101f036600461141c565b61086f565b34801561020157600080fd5b5061013761021036600461149f565b6108d6565b34801561022157600080fd5b5061024d6102303660046113ca565b600260209081526000928352604080842090915290825290205481565b6040519081526020016101ac565b34801561026757600080fd5b5060015461018b9073ffffffffffffffffffffffffffffffffffffffff1681565b610137610296366004611535565b6108ef565b3480156102a757600080fd5b506101376102b6366004611598565b610937565b6101376102c9366004611611565b610c59565b600063662a633a60e01b600073deaddeaddeaddeaddeaddeaddeaddeaddead000087873487604051602401610308969594939291906116da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103ac9073ffffffffffffffffffffffffffffffffffffffff168483610cef565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161040b929190611735565b60405180910390a35050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661045260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f25760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff1661052860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a5919061174e565b73ffffffffffffffffffffffffffffffffffffffff161461062e5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8716908690604051610665919061176b565b60006040518083038185875af1925050503d80600081146106a2576040519150601f19603f3d011682016040523d82523d6000602084013e6106a7565b606091505b505090508061071e5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610110565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63187878760405161077f939291906117d0565b60405180910390a350505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff161561081c5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610110565b6000805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b156108be5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b6108ce8686333388888888610d77565b505050505050565b6108e68787338888888888610d77565b50505050505050565b61093133858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661096f60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f5760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610110565b8073ffffffffffffffffffffffffffffffffffffffff16610a4560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061174e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610110565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054610b89908590611822565b73ffffffffffffffffffffffffffffffffffffffff808a166000818152600260209081526040808320948d1683529390529190912091909155610bcd908686610f27565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610c479493929190611839565b60405180910390a45050505050505050565b333b15610ca85760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610110565b610cea33338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ce92505050565b505050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610d4990869085908790600401611879565b600060405180830381600087803b158015610d6357600080fd5b505af11580156108e6573d6000803e3d6000fd5b610d9973ffffffffffffffffffffffffffffffffffffffff8916873087610ffb565b600063662a633a60e01b89898989898888604051602401610dc097969594939291906118be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610e649073ffffffffffffffffffffffffffffffffffffffff168583610cef565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c1683529290522054610ea290869061191b565b73ffffffffffffffffffffffffffffffffffffffff808b1660008181526002602090815260408083208e86168085529252918290209490945551918a1692917f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039690610f14908b908b908a908a90611839565b60405180910390a4505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610cea9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611059565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610f79565b60006110bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661114b9092919063ffffffff16565b805190915015610cea57808060200190518101906110d99190611933565b610cea5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610110565b606061115a8484600085611164565b90505b9392505050565b6060824710156111dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610110565b843b61122a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610110565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611253919061176b565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50915091506112a58282866112b0565b979650505050505050565b606083156112bf57508161115d565b8251156112cf5782518084602001fd5b8160405162461bcd60e51b81526004016101109190611955565b73ffffffffffffffffffffffffffffffffffffffff8116811461130b57600080fd5b50565b60008083601f84011261132057600080fd5b50813567ffffffffffffffff81111561133857600080fd5b60208301915083602082850101111561135057600080fd5b9250929050565b60008060008060006080868803121561136f57600080fd5b853561137a816112e9565b9450602086013561138a816112e9565b935060408601359250606086013567ffffffffffffffff8111156113ad57600080fd5b6113b98882890161130e565b969995985093965092949392505050565b600080604083850312156113dd57600080fd5b82356113e8816112e9565b915060208301356113f8816112e9565b809150509250929050565b803563ffffffff8116811461141757600080fd5b919050565b60008060008060008060a0878903121561143557600080fd5b8635611440816112e9565b95506020870135611450816112e9565b94506040870135935061146560608801611403565b9250608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a0161130e565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156114ba57600080fd5b87356114c5816112e9565b965060208801356114d5816112e9565b955060408801356114e5816112e9565b9450606088013593506114fa60808901611403565b925060a088013567ffffffffffffffff81111561151657600080fd5b6115228a828b0161130e565b989b979a50959850939692959293505050565b6000806000806060858703121561154b57600080fd5b8435611556816112e9565b935061156460208601611403565b9250604085013567ffffffffffffffff81111561158057600080fd5b61158c8782880161130e565b95989497509550505050565b600080600080600080600060c0888a0312156115b357600080fd5b87356115be816112e9565b965060208801356115ce816112e9565b955060408801356115de816112e9565b945060608801356115ee816112e9565b93506080880135925060a088013567ffffffffffffffff81111561151657600080fd5b60008060006040848603121561162657600080fd5b61162f84611403565b9250602084013567ffffffffffffffff81111561164b57600080fd5b6116578682870161130e565b9497909650939450505050565b60005b8381101561167f578181015183820152602001611667565b838111156109315750506000910152565b600081518084526116a8816020860160208601611664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261172960c0830184611690565b98975050505050505050565b82815260406020820152600061115a6040830184611690565b60006020828403121561176057600080fd5b815161115d816112e9565b6000825161177d818460208701611664565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006117ea604083018486611787565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611834576118346117f3565b500390565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061186f606083018486611787565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006118a86060830185611690565b905063ffffffff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261190e60c083018486611787565b9998505050505050505050565b6000821982111561192e5761192e6117f3565b500190565b60006020828403121561194557600080fd5b8151801515811461115d57600080fd5b60208152600061115d602083018461169056fea2646970667358221220d862fb20d11a0a1fd01b325278c9f5c2c492f9915c195c3e0f9e8c458fdb424464736f6c63430008090033", +- "devdoc": { +- "details": "The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits and listening to it for newly finalized withdrawals. Runtime target: EVM", +- "kind": "dev", +- "methods": { +- "depositERC20(address,address,uint256,uint32,bytes)": { +- "details": "deposit an amount of the ERC20 to the caller's balance on L2.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l1Token": "Address of the L1 ERC20 we are depositing", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_l2Token": "Address of the L1 respective L2 ERC20" +- } +- }, +- "depositERC20To(address,address,address,uint256,uint32,bytes)": { +- "details": "deposit an amount of ERC20 to a recipient's balance on L2.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l1Token": "Address of the L1 ERC20 we are depositing", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_l2Token": "Address of the L1 respective L2 ERC20", +- "_to": "L2 address to credit the withdrawal to." +- } +- }, +- "depositETH(uint32,bytes)": { +- "details": "Deposit an amount of the ETH to the caller's balance on L2.", +- "params": { +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l2Gas": "Gas limit required to complete the deposit on L2." +- } +- }, +- "depositETHTo(address,uint32,bytes)": { +- "details": "Deposit an amount of ETH to a recipient's balance on L2.", +- "params": { +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_l2Gas": "Gas limit required to complete the deposit on L2.", +- "_to": "L2 address to credit the withdrawal to." +- } +- }, +- "donateETH()": { +- "details": "Adds ETH balance to the account. This is meant to allow for ETH to be migrated from an old gateway to a new gateway. NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract" +- }, +- "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": { +- "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ERC20 token. This call will fail if the initialized withdrawal from L2 has not been finalized.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Data provided by the sender on L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_from": "L2 address initiating the transfer.", +- "_l1Token": "Address of L1 token to finalizeWithdrawal for.", +- "_l2Token": "Address of L2 token where withdrawal was initiated.", +- "_to": "L1 address to credit the withdrawal to." +- } +- }, +- "finalizeETHWithdrawal(address,address,uint256,bytes)": { +- "details": "Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.", +- "params": { +- "_amount": "Amount of the ERC20 to deposit.", +- "_data": "Optional data to forward to L2. This data is provided solely as a convenience for external contracts. Aside from enforcing a maximum length, these contracts provide no guarantees about its content.", +- "_from": "L2 address initiating the transfer.", +- "_to": "L1 address to credit the withdrawal to." +- } +- }, +- "initialize(address,address)": { +- "params": { +- "_l1messenger": "L1 Messenger address being used for cross-chain communications.", +- "_l2TokenBridge": "L2 standard bridge address." +- } +- } +- }, +- "stateVariables": { +- "l2TokenBridge": { +- "details": "get the address of the corresponding L2 bridge contract.", +- "return": "Address of the corresponding L2 bridge contract.", +- "returns": { +- "_0": "Address of the corresponding L2 bridge contract." +- } +- } +- }, +- "title": "L1StandardBridge", +- "version": 1 +- }, +- "userdoc": { +- "kind": "user", +- "methods": {}, +- "version": 1 +- }, +- "storageLayout": { +- "storage": [ +- { +- "astId": 6180, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "messenger", +- "offset": 0, +- "slot": "0", +- "type": "t_address" +- }, +- { +- "astId": 2874, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "l2TokenBridge", +- "offset": 0, +- "slot": "1", +- "type": "t_address" +- }, +- { +- "astId": 2880, +- "contract": "contracts/L1/messaging/L1StandardBridge.sol:L1StandardBridge", +- "label": "deposits", +- "offset": 0, +- "slot": "2", +- "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" +- } +- ], +- "types": { +- "t_address": { +- "encoding": "inplace", +- "label": "address", +- "numberOfBytes": "20" +- }, +- "t_mapping(t_address,t_mapping(t_address,t_uint256))": { +- "encoding": "mapping", +- "key": "t_address", +- "label": "mapping(address => mapping(address => uint256))", +- "numberOfBytes": "32", +- "value": "t_mapping(t_address,t_uint256)" +- }, +- "t_mapping(t_address,t_uint256)": { +- "encoding": "mapping", +- "key": "t_address", +- "label": "mapping(address => uint256)", +- "numberOfBytes": "32", +- "value": "t_uint256" +- }, +- "t_uint256": { +- "encoding": "inplace", +- "label": "uint256", +- "numberOfBytes": "32" +- } +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/Lib_AddressManager.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/Lib_AddressManager.json +index 0bb3400..09b0df6 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/Lib_AddressManager.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/Lib_AddressManager.json +@@ -1,5 +1,5 @@ + { +- "address": "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "address": "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + "abi": [ + { + "anonymous": false, +@@ -116,42 +116,42 @@ + "type": "function" + } + ], +- "transactionHash": "0x8803c67a0032b8dea6b0e3a9d2ff1708346a41a8d2945d4e84e5d81862f1cb54", ++ "transactionHash": "0x6bf7a753a842d89ca569e538fa9bdb8a1c5fb79cdfc180a3dd28512d71c23c01", + "receipt": { + "to": null, +- "from": "0x9996571372066A1545D3435C6935e3F9593A7eF5", +- "contractAddress": "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", +- "transactionIndex": 43, +- "gasUsed": "425357", +- "logsBloom": "0x00800000002000000000000000000000000000000000000000800000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000001000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000040000000000000000000000000000000000000000000", +- "blockHash": "0x6eeca8dcaa51370f0048dcc0569ebb0c62ba9841e5414b362aa15915c29428d1", +- "transactionHash": "0x8803c67a0032b8dea6b0e3a9d2ff1708346a41a8d2945d4e84e5d81862f1cb54", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0xdef4754Af25f56A9CE37C41CAd460Ccbe19a9ceF", ++ "transactionIndex": 107, ++ "gasUsed": "454575", ++ "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000004000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000400000000000000000000000000400000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000020000000002000000000000000000000000000000000000000000000000000000000", ++ "blockHash": "0x23c625f98ba2e21753e265c4ce511d66ba070fc2a9a1fc2fad76d6508d569fc0", ++ "transactionHash": "0x6bf7a753a842d89ca569e538fa9bdb8a1c5fb79cdfc180a3dd28512d71c23c01", + "logs": [ + { +- "transactionIndex": 43, +- "blockNumber": 12686687, +- "transactionHash": "0x8803c67a0032b8dea6b0e3a9d2ff1708346a41a8d2945d4e84e5d81862f1cb54", +- "address": "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "transactionIndex": 107, ++ "blockNumber": 13502768, ++ "transactionHash": "0x6bf7a753a842d89ca569e538fa9bdb8a1c5fb79cdfc180a3dd28512d71c23c01", ++ "address": "0xdef4754Af25f56A9CE37C41CAd460Ccbe19a9ceF", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", +- "0x0000000000000000000000009996571372066a1545d3435c6935e3f9593a7ef5" ++ "0x0000000000000000000000001f2414d0af8741bc822dbc2f88069c2b2907a840" + ], + "data": "0x", +- "logIndex": 195, +- "blockHash": "0x6eeca8dcaa51370f0048dcc0569ebb0c62ba9841e5414b362aa15915c29428d1" ++ "logIndex": 207, ++ "blockHash": "0x23c625f98ba2e21753e265c4ce511d66ba070fc2a9a1fc2fad76d6508d569fc0" + } + ], +- "blockNumber": 12686687, +- "cumulativeGasUsed": "6131161", ++ "blockNumber": 13502768, ++ "cumulativeGasUsed": "8590667", + "status": 1, + "byzantium": true + }, + "args": [], +- "solcInputHash": "ef3f334bac4d7e77d91b457a0d89ab0a", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6106478061007d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061042d945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661045c565b61020f610570565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610570565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061035383610574565b60008181526001602090815260409182902080546001600160a01b038781166001600160a01b0319831617909255925187519495509216928692918291908401908083835b602083106103b75780518252601f199092019160209182019101610398565b51815160001960209485036101000a01908116901991909116179052604080519490920184900384206001600160a01b03808b16865288169185019190915281519095507f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c94509283900301919050a250505050565b60006001600061043c84610574565b81526020810191909152604001600020546001600160a01b031692915050565b610464610570565b6001600160a01b03166104756102c5565b6001600160a01b0316146104d0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166105155760405162461bcd60e51b81526004018080602001828103825260268152602001806105ec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105a95780518252601f19909201916020918201910161058a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a2646970667358221220b47b03a0c984a0faed73425d34ee172acb8f5010c64751f78c7f645cf8dc2aad64736f6c63430007060033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b146100665780639b2ea4bd1461008a578063bf40fac11461013b578063f2fde38b146101e1575b600080fd5b610064610207565b005b61006e6102c5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360408110156100a057600080fd5b8101906020810181356401000000008111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111640100000000831117156100ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506102d49050565b61006e6004803603602081101561015157600080fd5b81019060208101813564010000000081111561016c57600080fd5b82018360208201111561017e57600080fd5b803590602001918460018302840111640100000000831117156101a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061042d945050505050565b610064600480360360208110156101f757600080fd5b50356001600160a01b031661045c565b61020f610570565b6001600160a01b03166102206102c5565b6001600160a01b03161461027b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6102dc610570565b6001600160a01b03166102ed6102c5565b6001600160a01b031614610348576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061035383610574565b60008181526001602090815260409182902080546001600160a01b038781166001600160a01b0319831617909255925187519495509216928692918291908401908083835b602083106103b75780518252601f199092019160209182019101610398565b51815160001960209485036101000a01908116901991909116179052604080519490920184900384206001600160a01b03808b16865288169185019190915281519095507f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c94509283900301919050a250505050565b60006001600061043c84610574565b81526020810191909152604001600020546001600160a01b031692915050565b610464610570565b6001600160a01b03166104756102c5565b6001600160a01b0316146104d0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166105155760405162461bcd60e51b81526004018080602001828103825260268152602001806105ec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000816040516020018082805190602001908083835b602083106105a95780518252601f19909201916020918201910161058a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a2646970667358221220b47b03a0c984a0faed73425d34ee172acb8f5010c64751f78c7f645cf8dc2aad64736f6c63430007060033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldAddress\",\"type\":\"address\"}],\"name\":\"AddressSet\",\"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\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAddress(string)\":{\"params\":{\"_name\":\"Name to retrieve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"params\":{\"_address\":\"Address to associate with the name.\",\"_name\":\"String name to associate an address with.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Lib_AddressManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(string)\":{\"notice\":\"Retrieves the address associated with a given name.\"},\"setAddress(string,address)\":{\"notice\":\"Changes the address associated with a particular name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/resolver/Lib_AddressManager.sol\":\"Lib_AddressManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a", + "devdoc": { + "kind": "dev", + "methods": { +@@ -197,16 +197,16 @@ + "storageLayout": { + "storage": [ + { +- "astId": 664, +- "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "astId": 393, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { +- "astId": 15229, +- "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", ++ "astId": 6569, ++ "contract": "contracts/libraries/resolver/Lib_AddressManager.sol:Lib_AddressManager", + "label": "addresses", + "offset": 0, + "slot": "1", +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json +index 7aa19bc..d108778 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/OVM_L1CrossDomainMessenger.json +@@ -1,5 +1,5 @@ + { +- "address": "0xd9166833FF12A5F900ccfBf2c8B62a90F1Ca1FD5", ++ "address": "0x12Acf6E3ca96A60fBa0BBFd14D2Fe0EB6ae47820", + "abi": [ + { + "inputs": [], +@@ -185,6 +185,25 @@ + "stateMutability": "view", + "type": "function" + }, ++ { ++ "inputs": [ ++ { ++ "internalType": "bytes32", ++ "name": "", ++ "type": "bytes32" ++ } ++ ], ++ "name": "failedMessages", ++ "outputs": [ ++ { ++ "internalType": "bool", ++ "name": "", ++ "type": "bool" ++ } ++ ], ++ "stateMutability": "view", ++ "type": "function" ++ }, + { + "inputs": [ + { +@@ -495,27 +514,27 @@ + "type": "function" + } + ], +- "transactionHash": "0xa45e328f35b3c7b87cabedb531f10a5d345b896382d8e40fee793dd463373aa8", ++ "transactionHash": "0x43db4e777be1d40ede4bfa46453bcd459c300d6037a129562b4b687aa1b971e2", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xd9166833FF12A5F900ccfBf2c8B62a90F1Ca1FD5", +- "transactionIndex": 22, +- "gasUsed": "3394374", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x12Acf6E3ca96A60fBa0BBFd14D2Fe0EB6ae47820", ++ "transactionIndex": 386, ++ "gasUsed": "3403430", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xa0875a7e1dc4dd67b8b4f05a54fd7bacd85a1614540d8945752b3ac058fc0d56", +- "transactionHash": "0xa45e328f35b3c7b87cabedb531f10a5d345b896382d8e40fee793dd463373aa8", ++ "blockHash": "0xdece687075067081dd303dc8f134c680c5ff4565eedb4e4c4cb1ec2172f244af", ++ "transactionHash": "0x43db4e777be1d40ede4bfa46453bcd459c300d6037a129562b4b687aa1b971e2", + "logs": [], +- "blockNumber": 13596491, +- "cumulativeGasUsed": "4992235", ++ "blockNumber": 13502968, ++ "cumulativeGasUsed": "29705070", + "status": 1, + "byzantium": true + }, + "args": [], +- "solcInputHash": "e2f1121f17d06f85851dd0c837a00344", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { ICrossDomainMessenger } from \\\"../../libraries/bridge/ICrossDomainMessenger.sol\\\";\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0xb0058ed29f6b510f09ffb52dd09812883adccb433cb2da1c8d5dd7de6d6c93ed\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { AddressAliasHelper } from \\\"../../standards/AddressAliasHelper.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressManager } from \\\"../../libraries/resolver/Lib_AddressManager.sol\\\";\\nimport { Lib_SecureMerkleTrie } from \\\"../../libraries/trie/Lib_SecureMerkleTrie.sol\\\";\\nimport { Lib_DefaultValues } from \\\"../../libraries/constants/Lib_DefaultValues.sol\\\";\\nimport { Lib_PredeployAddresses } from \\\"../../libraries/constants/Lib_PredeployAddresses.sol\\\";\\nimport { Lib_CrossDomainUtils } from \\\"../../libraries/bridge/Lib_CrossDomainUtils.sol\\\";\\n\\n/* Interface Imports */\\nimport { IL1CrossDomainMessenger } from \\\"./IL1CrossDomainMessenger.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../rollup/IStateCommitmentChain.sol\\\";\\n\\n/* External Imports */\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n PausableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {\\n ReentrancyGuardUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n \\\"L1CrossDomainMessenger already intialized.\\\"\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n \\\"xDomainMessageSender is not set\\\"\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(ovmCanonicalTransactionChain, xDomainCalldata, _gasLimit);\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n \\\"Provided message could not be verified.\\\"\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has already been received.\\\"\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n \\\"Provided message has been blocked.\\\"\\n );\\n\\n require(\\n _target != resolve(\\\"CanonicalTransactionChain\\\"),\\n \\\"Cannot send L2->L1 messages to L1 system contracts.\\\"\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(abi.encodePacked(xDomainCalldata, msg.sender, block.number));\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve(\\\"CanonicalTransactionChain\\\");\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n \\\"Provided message has not been enqueued.\\\"\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(canonicalTransactionChain, xDomainCalldata, _newGasLimit);\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) && _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve(\\\"StateCommitmentChain\\\")\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (bool exists, bytes memory encodedMessagePassingAccount) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n \\\"Message passing predeploy has not been initialized or invalid proof provided.\\\"\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0xbbf12d15d392f819cffe3f71aed2d65b6aed2f943ea78fdf046534622785aaff\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x8f29ae23021345a20ccac7b5edb3fc38268aef943b65adc8a32e74b80bf1833a\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n \\\"relayMessage(address,address,bytes,uint256)\\\",\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0x6866bf6fb1e32824f58e3cfdeab1220448c4d1130e5ba43c9a060d5c7aae9df1\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0xa4c6003e04da72f20adb9caed0f8fd3faf5402ad8aa6034e8d9b440e7c0dd227\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0x2bc28307af93e9716151a41a81694b56cbe513ef5eb335fb1d81f35e5db8edfa\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex\\\"80\\\";\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, \\\"Provided proof is invalid.\\\");\\n\\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\\\"\\\");\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(keccak256(currentNode.encoded) == currentNodeID, \\\"Invalid root hash\\\");\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n \\\"Invalid large internal hash\\\"\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n \\\"Invalid internal node hash\\\"\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert(\\\"Received a node with an unknown prefix\\\");\\n }\\n } else {\\n revert(\\\"Received an unparseable node.\\\");\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof) private pure returns (TrieNode[] memory _parsed) {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node) private pure returns (bytes32 _nodeID) {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node) private pure returns (bytes memory _path) {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node) private pure returns (bytes memory _key) {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory _value) {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded) private pure returns (bytes memory _hash) {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node) private pure returns (NodeType _type) {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert(\\\"Invalid node type\\\");\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw) private pure returns (TrieNode memory _node) {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return TrieNode({ encoded: encoded, decoded: Lib_RLPReader.readList(encoded) });\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xf74792249e96247fdcd4f91ff472e9bc29c4fba5d651696c5b769c71d0a49db2\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_MerkleTrie } from \\\"./Lib_MerkleTrie.sol\\\";\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key) private pure returns (bytes memory _secureKey) {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0x8a5898637aebe30794e954d9749f6d62963e4e387e773bde5b06d0aecdc2ac23\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf330061b0ad081dd4d35a3efaeb3acd0a926c23ebb1ce7115007dac406d61b3f\",\"license\":\"Apache-2.0\"}},\"version\":1}", +- "bytecode": "0x608060405260cc80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c54806100446000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea26469706673582212209e0153d10142c4c28c6e3b5fe87c4f9f3e12f0acdc7b9f2e0b67f55f3257cfb464736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610275578063d7fd19dd14610298578063f2fde38b146102ab57600080fd5b8063b1b1b2091461023f578063c4d66de81461026257600080fd5b8063715018a6146101fe57806381ada46c146102065780638456cb59146102195780638da5cb5b1461022157600080fd5b8063461a4478116100ee578063461a4478146101c55780635c975abb146101d85780636e296e45146101e35780636f1c8d47146101eb57600080fd5b80630ecf2eea1461012057806321d800ec14610135578063299ca4781461016d5780633dbb202b146101b2575b600080fd5b61013361012e36600461311d565b6102be565b005b61015861014336600461311d565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60005461018d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101336101c0366004613295565b61036d565b61018d6101d33660046132f5565b6104b5565b60655460ff16610158565b61018d610562565b6101336101f9366004613346565b6105ec565b6101336107d3565b61013361021436600461311d565b610846565b6101336108ed565b60335473ffffffffffffffffffffffffffffffffffffffff1661018d565b61015861024d36600461311d565b60cb6020526000908152604090205460ff1681565b6101336102703660046133d2565b61095c565b61015861028336600461311d565b60c96020526000908152604090205460ff1681565b6101336102a6366004613538565b610ba9565b6101336102b93660046133d2565b611078565b60335473ffffffffffffffffffffffffffffffffffffffff16331461032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103ad6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f757600080fd5b505afa15801561040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042f9190613686565b905060006104468633878564ffffffffff16611174565b905061045983828663ffffffff166111ef565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104a594939291906136fd565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061050c908590600401613750565b60206040518083038186803b15801561052457600080fd5b505afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c9190613763565b92915050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156105cf5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610321565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600061062c6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613780565b905060006106e089898989611174565b905060007311110000000000000000000000000000000011113001734200000000000000000000000000000000000007878460405160200161072594939291906137e5565b604051602081830303815290604052805190602001209050826000015181146107b65760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610321565b6107c784838763ffffffff166111ef565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461083a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b6108446000611290565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b610844611307565b6000547501000000000000000000000000000000000000000000900460ff16806109a1575060005474010000000000000000000000000000000000000000900460ff16155b610a135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff16158015610a7a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b065760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610321565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911661dead179055610b5e6113b9565b610b66611508565b610b6e61162f565b610b76611788565b8015610ba557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610bfc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610321565b600260975560655460ff1615610c545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6000610c6286868686611174565b9050610c6e81836118dc565b1515600114610ce55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610321565b8051602080830191909120600081815260cb90925260409091205460ff1615610d765760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610321565b600081815260c9602052604090205460ff1615610dfb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610321565b610e396040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104b5565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610eda5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610321565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f3390889061382a565b6000604051808303816000865af19150503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b505060cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610ff557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611021565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161103893929190613846565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146110df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610321565b73ffffffffffffffffffffffffffffffffffffffff81166111685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610321565b61117181611290565b50565b60608484848460405160240161118d9493929190613898565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112599073420000000000000000000000000000000000000790859087906004016138e2565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561135a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610321565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861138f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff16806113fe575060005474010000000000000000000000000000000000000000900460ff16155b6114705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156114d757600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff168061154d575060005474010000000000000000000000000000000000000000900460ff16155b6115bf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561162657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6114d733611290565b6000547501000000000000000000000000000000000000000000900460ff1680611674575060005474010000000000000000000000000000000000000000900460ff16155b6116e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff1615801561174d57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806117cd575060005474010000000000000000000000000000000000000000900460ff16155b61183f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610321565b6000547501000000000000000000000000000000000000000000900460ff161580156118a657600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561117157600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b60006118e7826118ff565b80156118f857506118f88383611aa1565b9392505050565b6000806119406040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104b5565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161199891600401613954565b60206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e89190613967565b1580156118f857508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611a51939192909190600401613989565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613967565b60008083734200000000000000000000000000000000000007604051602001611acb929190613a01565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611b5b9060340160408051601f1981840301815291905260608701518751611c85565b9092509050600182151514611bfe5760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610321565b6000611c0982611cae565b9050611c7a84604051602001611c2191815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611d72565b979650505050505050565b600060606000611c9486611d96565b9050611ca1818686611dc8565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611cdb83611ea3565b90506040518060800160405280611d0b83600081518110611cfe57611cfe613a4b565b6020026020010151611ed6565b8152602001611d2683600181518110611cfe57611cfe613a4b565b8152602001611d4e83600281518110611d4157611d41613a4b565b6020026020010151611edd565b8152602001611d6983600381518110611d4157611d41613a4b565b90529392505050565b600080611d7e86611d96565b9050611d8c81868686611fdf565b9695505050505050565b60608180519060200120604051602001611db291815260200190565b6040516020818303038152906040529050919050565b600060606000611dd785612015565b90506000806000611de9848a89612110565b81519295509093509150158080611dfd5750815b611e495760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610321565b600081611e655760405180602001604052806000815250611e91565b611e9186611e74600188613aa9565b81518110611e8457611e84613a4b565b60200260200101516125ab565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061055c906125d5565b600061055c825b6000602182600001511115611f345760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000806000611f42856127d4565b919450925090506000816001811115611f5d57611f5d613ac0565b14611faa5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610321565b6000838660200151611fbc9190613aef565b80519091506020841015611d8c5760208490036101000a90049695505050505050565b6000806000611fef878686611dc8565b91509150818015611c7a5750805160208083019190912087519188019190912014611c7a565b6060600061202283611ea3565b90506000815167ffffffffffffffff81111561204057612040613158565b60405190808252806020026020018201604052801561208557816020015b604080518082019091526060808252602082015281526020019060019003908161205e5790505b50905060005b82518110156121085760006120b88483815181106120ab576120ab613a4b565b6020026020010151612b25565b905060405180604001604052808281526020016120d483611ea3565b8152508383815181106120e9576120e9613a4b565b602002602001018190525050808061210090613b07565b91505061208b565b509392505050565b6000606081808061212087612bb5565b90506000869050600080612147604051806040016040528060608152602001606081525090565b60005b8c51811015612567578c818151811061216557612165613a4b565b60200260200101519150828461217b9190613aef565b9350612188600188613aef565b9650836121ec578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610321565b6122a9565b81515160201161224e578151805160209091012085146121e75760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610321565b8461225c8360000151612d38565b146122a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610321565b6122b560106001613aef565b826020015151141561232e5785518414156122cf57612567565b60008685815181106122e3576122e3613a4b565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061230e5761230e613a4b565b6020026020010151905061232181612d60565b9650600194505050612555565b6002826020015151141561250d57600061234783612d96565b905060008160008151811061235e5761235e613a4b565b016020015160f81c90506000612375600283613b6f565b612380906002613b91565b90506000612391848360ff16612dba565b9050600061239f8b8a612dba565b905060006123ad8383612df0565b905060ff8516600214806123c4575060ff85166003145b1561241a578083511480156123d95750808251145b156123eb576123e8818b613aef565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b60ff8516158061242d575060ff85166001145b1561249f578251811461246957507f80000000000000000000000000000000000000000000000000000000000000009950612567945050505050565b612490886020015160018151811061248357612483613a4b565b6020026020010151612d60565b9a509750612555945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610321565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610321565b8061255f81613b07565b91505061214a565b507f80000000000000000000000000000000000000000000000000000000000000008414866125968786612dba565b909e909d50909b509950505050505050505050565b6020810151805160609161055c916125c590600190613aa9565b815181106120ab576120ab613a4b565b60606000806125e3846127d4565b919350909150600190508160018111156125ff576125ff613ac0565b1461264c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610321565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126655790505090506000835b86518110156127c957602082106127115760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610321565b60008061274e6040518060400160405280858c600001516127329190613aa9565b8152602001858c602001516127479190613aef565b90526127d4565b50915091506040518060400160405280838361276a9190613aef565b8152602001848b6020015161277f9190613aef565b81525085858151811061279457612794613a4b565b60209081029190910101526127aa600185613aef565b93506127b68183613aef565b6127c09084613aef565b92505050612692565b508152949350505050565b60008060008084600001511161282c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610321565b6020840151805160001a607f8111612851576000600160009450945094505050612b1e565b60b781116128cd576000612866608083613aa9565b9050808760000151116128bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610321565b60019550935060009250612b1e915050565b60bf81116129bc5760006128e260b783613aa9565b9050808760000151116129375760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610321565b600183015160208290036101000a90046129518183613aef565b8851116129a05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610321565b6129ab826001613aef565b9650945060009350612b1e92505050565b60f78111612a375760006129d160c083613aa9565b905080876000015111612a265760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610321565b600195509350849250612b1e915050565b6000612a4460f783613aa9565b905080876000015111612a995760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610321565b600183015160208290036101000a9004612ab38183613aef565b885111612b025760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610321565b612b0d826001613aef565b9650945060019350612b1e92505050565b9193909250565b60606000806000612b35856127d4565b919450925090506000816001811115612b5057612b50613ac0565b14612b9d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610321565b612bac85602001518484612e9c565b95945050505050565b6060600082516002612bc79190613bb4565b67ffffffffffffffff811115612bdf57612bdf613158565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b50905060005b8351811015612d31576004848281518110612c2c57612c2c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612c61836002613bb4565b81518110612c7157612c71613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612cb457612cb4613a4b565b0160200151612cc6919060f81c613b6f565b60f81b82612cd5836002613bb4565b612ce0906001613aef565b81518110612cf057612cf0613a4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d2981613b07565b915050612c0f565b5092915050565b6000602082511015612d4c57506020015190565b8180602001905181019061055c9190613bf1565b60006060602083600001511015612d8157612d7a83612f7b565b9050612d8d565b612d8a83612b25565b90505b6118f881612d38565b606061055c612db583602001516000815181106120ab576120ab613a4b565b612bb5565b606082518210612dd9575060408051602081019091526000815261055c565b6118f88383848651612deb9190613aa9565b612f86565b6000805b808451118015612e045750808351115b8015612e855750828181518110612e1d57612e1d613a4b565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612e5c57612e5c613a4b565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156118f85780612e9481613b07565b915050612df4565b606060008267ffffffffffffffff811115612eb957612eb9613158565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b509050805160001415612ef75790506118f8565b6000612f038587613aef565b90506020820160005b612f17602087613c0a565b811015612f4e5782518252612f2d602084613aef565b9250612f3a602083613aef565b915080612f4681613b07565b915050612f0c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061055c82613107565b606081612f9481601f613aef565b1015612fe25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b82612fed8382613aef565b101561303b5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610321565b6130458284613aef565b845110156130955760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610321565b6060821580156130b457604051915060008252602082016040526130fe565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130ed5780518352602092830192016130d5565b5050858452601f01601f1916604052505b50949350505050565b606061055c826020015160008460000151612e9c565b60006020828403121561312f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461117157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131aa576131aa613158565b60405290565b60405160a0810167ffffffffffffffff811182821017156131aa576131aa613158565b604051601f8201601f1916810167ffffffffffffffff811182821017156131fc576131fc613158565b604052919050565b600067ffffffffffffffff83111561321e5761321e613158565b6132316020601f19601f860116016131d3565b905082815283838301111561324557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261326d57600080fd5b6118f883833560208501613204565b803563ffffffff8116811461329057600080fd5b919050565b6000806000606084860312156132aa57600080fd5b83356132b581613136565b9250602084013567ffffffffffffffff8111156132d157600080fd5b6132dd8682870161325c565b9250506132ec6040850161327c565b90509250925092565b60006020828403121561330757600080fd5b813567ffffffffffffffff81111561331e57600080fd5b8201601f8101841361332f57600080fd5b61333e84823560208401613204565b949350505050565b60008060008060008060c0878903121561335f57600080fd5b863561336a81613136565b9550602087013561337a81613136565b9450604087013567ffffffffffffffff81111561339657600080fd5b6133a289828a0161325c565b945050606087013592506133b86080880161327c565b91506133c660a0880161327c565b90509295509295509295565b6000602082840312156133e457600080fd5b81356118f881613136565b600060a0828403121561340157600080fd5b60405160a0810167ffffffffffffffff828210818311171561342557613425613158565b8160405282935084358352602085013560208401526040850135604084015260608501356060840152608085013591508082111561346257600080fd5b5061346f8582860161325c565b6080830152505092915050565b60006040828403121561348e57600080fd5b613496613187565b90508135815260208083013567ffffffffffffffff808211156134b857600080fd5b818501915085601f8301126134cc57600080fd5b8135818111156134de576134de613158565b8060051b91506134ef8483016131d3565b818152918301840191848101908884111561350957600080fd5b938501935b838510156135275784358252938501939085019061350e565b808688015250505050505092915050565b600080600080600060a0868803121561355057600080fd5b853561355b81613136565b9450602086013561356b81613136565b9350604086013567ffffffffffffffff8082111561358857600080fd5b61359489838a0161325c565b94506060880135935060808801359150808211156135b157600080fd5b9087019060a0828a0312156135c557600080fd5b6135cd6131b0565b823581526020830135828111156135e357600080fd5b6135ef8b8286016133ef565b60208301525060408301358281111561360757600080fd5b6136138b82860161347c565b60408301525060608301358281111561362b57600080fd5b6136378b82860161325c565b60608301525060808301358281111561364f57600080fd5b61365b8b82860161325c565b6080830152508093505050509295509295909350565b805164ffffffffff8116811461329057600080fd5b60006020828403121561369857600080fd5b6118f882613671565b60005b838110156136bc5781810151838201526020016136a4565b838111156136cb576000848401525b50505050565b600081518084526136e98160208601602086016136a1565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061372c60808301866136d1565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006118f860208301846136d1565b60006020828403121561377557600080fd5b81516118f881613136565b60006060828403121561379257600080fd5b6040516060810181811067ffffffffffffffff821117156137b5576137b5613158565b604052825181526137c860208401613671565b60208201526137d960408401613671565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611d8c60808301846136d1565b6000825161383c8184602087016136a1565b9190910192915050565b600084516138588184602089016136a1565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526138d160808301856136d1565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bac60608301846136d1565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261333e60a08501826136d1565b6020815260006118f86020830184613917565b60006020828403121561397957600080fd5b815180151581146118f857600080fd5b838152600060206060818401526139a36060840186613917565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156139f357845182529385019360019390930192908501906139d3565b509998505050505050505050565b60008351613a138184602088016136a1565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613abb57613abb613a7a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b0257613b02613a7a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b3957613b39613a7a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613b8257613b82613b40565b8060ff84160691505092915050565b600060ff821660ff841680821015613bab57613bab613a7a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bec57613bec613a7a565b500290565b600060208284031215613c0357600080fd5b5051919050565b600082613c1957613c19613b40565b50049056fea26469706673582212209e0153d10142c4c28c6e3b5fe87c4f9f3e12f0acdc7b9f2e0b67f55f3257cfb464736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"allowMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_xDomainCalldataHash\",\"type\":\"bytes32\"}],\"name\":\"blockMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"blockedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"stateRootBatchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"stateTrieWitness\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"storageTrieWitness\",\"type\":\"bytes\"}],\"internalType\":\"struct IL1CrossDomainMessenger.L2MessageInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"relayedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_oldGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_gasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"allowMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"blockMessage(bytes32)\":{\"params\":{\"_xDomainCalldataHash\":\"Hash of the message to block.\"}},\"initialize(address)\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_messageNonce\":\"Nonce for the provided message.\",\"_proof\":\"Inclusion proof for the given message.\",\"_sender\":\"Message sender address.\",\"_target\":\"Target contract address.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_newGasLimit\":\"New gas limit to be used for this message.\",\"_oldGasLimit\":\"Original gas limit used to send the message.\",\"_queueIndex\":\"CTC Queue index for the message to replay.\",\"_sender\":\"Original sender address.\",\"_target\":\"Target contract address.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_gasLimit\":\"Gas limit for the provided message.\",\"_message\":\"Message to send to the target.\",\"_target\":\"Target contract address.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"L1CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowMessage(bytes32)\":{\"notice\":\"Allow a message.\"},\"blockMessage(bytes32)\":{\"notice\":\"Block a message.\"},\"constructor\":{\"notice\":\"This contract is intended to be behind a delegate proxy. We pass the zero address to the address resolver just to satisfy the constructor. We still need to set this value in initialize().\"},\"pause()\":{\"notice\":\"Pause relaying.\"},\"relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))\":{\"notice\":\"Relays a cross domain message to a contract.\"},\"replayMessage(address,address,bytes,uint256,uint32,uint32)\":{\"notice\":\"Replays a cross domain message to the target messenger.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a cross domain message to the target messenger.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal initializer {\\n __Context_init_unchained();\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal initializer {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x35b09b69aca3bc2633da8f47382a81ecf367efe57167a2114f60f9ec81988afa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n require(_initializing || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8b2abd85d0ece7e866e100e9d47ca9cbec93c87cf71a8d267b2b93eb81f7d5e9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal initializer {\\n __Context_init_unchained();\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal initializer {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x742c0fbab73bf595ca40025f6e81cb48dbd5e133950717f7befd062a925c0148\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal initializer {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal initializer {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x89fa60d14355f7ae06af11e28fce2bb90c5c6186645d681a30e1b36234a4c210\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal initializer {\\n __Context_init_unchained();\\n }\\n\\n function __Context_init_unchained() internal initializer {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x062b5a0f7cc6b0528fa350033759f3a15ba42afb57423d7c593753860f2c82e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/messaging/IL1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/* Interface Imports */\\nimport {ICrossDomainMessenger} from '../../libraries/bridge/ICrossDomainMessenger.sol';\\n\\n/**\\n * @title IL1CrossDomainMessenger\\n */\\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n struct L2MessageInclusionProof {\\n bytes32 stateRoot;\\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\\n bytes stateTrieWitness;\\n bytes storageTrieWitness;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @param _proof Inclusion proof for the given message.\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) external;\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _sender Original sender address.\\n * @param _message Message to send to the target.\\n * @param _queueIndex CTC Queue index for the message to replay.\\n * @param _oldGasLimit Original gas limit used to send the message.\\n * @param _newGasLimit New gas limit to be used for this message.\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x3787f6d980f167477e6bdf7f0b41504b8611d9a37557a584e8e85d253f1fd294\",\"license\":\"MIT\"},\"contracts/L1/messaging/L1CrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\nimport {Lib_AddressManager} from '../../libraries/resolver/Lib_AddressManager.sol';\\nimport {Lib_SecureMerkleTrie} from '../../libraries/trie/Lib_SecureMerkleTrie.sol';\\nimport {Lib_DefaultValues} from '../../libraries/constants/Lib_DefaultValues.sol';\\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\\nimport {Lib_CrossDomainUtils} from '../../libraries/bridge/Lib_CrossDomainUtils.sol';\\n\\n/* Interface Imports */\\nimport {IL1CrossDomainMessenger} from './IL1CrossDomainMessenger.sol';\\nimport {ICanonicalTransactionChain} from '../rollup/ICanonicalTransactionChain.sol';\\nimport {IStateCommitmentChain} from '../rollup/IStateCommitmentChain.sol';\\n\\n/* External Imports */\\nimport {OwnableUpgradeable} from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\\nimport {PausableUpgradeable} from '@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol';\\nimport {ReentrancyGuardUpgradeable} from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol';\\n\\n/**\\n * @title L1CrossDomainMessenger\\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\\n * epoch gas limit, it can be resubmitted via this contract's replay function.\\n *\\n * Runtime target: EVM\\n */\\ncontract L1CrossDomainMessenger is\\n IL1CrossDomainMessenger,\\n Lib_AddressResolver,\\n OwnableUpgradeable,\\n PausableUpgradeable,\\n ReentrancyGuardUpgradeable\\n{\\n /**********\\n * Events *\\n **********/\\n\\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\\n\\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\\n\\n /**********************\\n * Contract Variables *\\n **********************/\\n\\n mapping(bytes32 => bool) public blockedMessages;\\n mapping(bytes32 => bool) public relayedMessages;\\n mapping(bytes32 => bool) public successfulMessages;\\n mapping(bytes32 => bool) public failedMessages;\\n\\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * This contract is intended to be behind a delegate proxy.\\n * We pass the zero address to the address resolver just to satisfy the constructor.\\n * We still need to set this value in initialize().\\n */\\n constructor() Lib_AddressResolver(address(0)) {}\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n function initialize(address _libAddressManager) public initializer {\\n require(\\n address(libAddressManager) == address(0),\\n 'L1CrossDomainMessenger already intialized.'\\n );\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Initialize upgradable OZ contracts\\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\\n __Ownable_init_unchained();\\n __Pausable_init_unchained();\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n /**\\n * Pause relaying.\\n */\\n function pause() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * Block a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = true;\\n emit MessageBlocked(_xDomainCalldataHash);\\n }\\n\\n /**\\n * Allow a message.\\n * @param _xDomainCalldataHash Hash of the message to block.\\n */\\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\\n blockedMessages[_xDomainCalldataHash] = false;\\n emit MessageAllowed(_xDomainCalldataHash);\\n }\\n\\n function xDomainMessageSender() public view returns (address) {\\n require(\\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\\n 'xDomainMessageSender is not set'\\n );\\n return xDomainMsgSender;\\n }\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes memory _message,\\n uint32 _gasLimit\\n ) public {\\n address ovmCanonicalTransactionChain = resolve('CanonicalTransactionChain');\\n // Use the CTC queue length as nonce\\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain)\\n .getQueueLength();\\n\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n msg.sender,\\n _message,\\n nonce\\n );\\n\\n _sendXDomainMessage(\\n ovmCanonicalTransactionChain,\\n xDomainCalldata,\\n _gasLimit\\n );\\n\\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\\n }\\n\\n /**\\n * Relays a cross domain message to a contract.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function relayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce,\\n L2MessageInclusionProof memory _proof\\n ) public nonReentrant whenNotPaused {\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n\\n require(\\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\\n 'Provided message could not be verified.'\\n );\\n\\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\\n\\n require(\\n successfulMessages[xDomainCalldataHash] == false,\\n 'Provided message has already been received.'\\n );\\n\\n require(\\n blockedMessages[xDomainCalldataHash] == false,\\n 'Provided message has been blocked.'\\n );\\n\\n require(\\n _target != resolve('CanonicalTransactionChain'),\\n 'Cannot send L2->L1 messages to L1 system contracts.'\\n );\\n\\n xDomainMsgSender = _sender;\\n (bool success, ) = _target.call(_message);\\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\\n\\n // Mark the message as received if the call was successful. Ensures that a message can be\\n // relayed multiple times in the case that the call reverted.\\n if (success == true) {\\n successfulMessages[xDomainCalldataHash] = true;\\n emit RelayedMessage(xDomainCalldataHash);\\n } else {\\n failedMessages[xDomainCalldataHash] = true;\\n emit FailedRelayedMessage(xDomainCalldataHash);\\n }\\n\\n // Store an identifier that can be used to prove that the given message was relayed by some\\n // user. Gives us an easy way to pay relayers for their work.\\n bytes32 relayId = keccak256(\\n abi.encodePacked(xDomainCalldata, msg.sender, block.number)\\n );\\n relayedMessages[relayId] = true;\\n }\\n\\n /**\\n * Replays a cross domain message to the target messenger.\\n * @inheritdoc IL1CrossDomainMessenger\\n */\\n function replayMessage(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _queueIndex,\\n uint32 _oldGasLimit,\\n uint32 _newGasLimit\\n ) public {\\n // Verify that the message is in the queue:\\n address canonicalTransactionChain = resolve('CanonicalTransactionChain');\\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\\n canonicalTransactionChain\\n ).getQueueElement(_queueIndex);\\n\\n // Compute the calldata that was originally used to send the message.\\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\\n _target,\\n _sender,\\n _message,\\n _queueIndex\\n );\\n\\n // Compute the transactionHash\\n bytes32 transactionHash = keccak256(\\n abi.encode(\\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _oldGasLimit,\\n xDomainCalldata\\n )\\n );\\n\\n // Now check that the provided message data matches the one in the queue element.\\n require(\\n transactionHash == element.transactionHash,\\n 'Provided message has not been enqueued.'\\n );\\n\\n // Send the same message but with the new gas limit.\\n _sendXDomainMessage(\\n canonicalTransactionChain,\\n xDomainCalldata,\\n _newGasLimit\\n );\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Verifies that the given message is valid.\\n * @param _xDomainCalldata Calldata to verify.\\n * @param _proof Inclusion proof for the message.\\n * @return Whether or not the provided message is valid.\\n */\\n function _verifyXDomainMessage(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n return (_verifyStateRootProof(_proof) &&\\n _verifyStorageProof(_xDomainCalldata, _proof));\\n }\\n\\n /**\\n * Verifies that the state root within an inclusion proof is valid.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\\n internal\\n view\\n returns (bool)\\n {\\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\\n resolve('StateCommitmentChain')\\n );\\n\\n return (ovmStateCommitmentChain.insideFraudProofWindow(\\n _proof.stateRootBatchHeader\\n ) ==\\n false &&\\n ovmStateCommitmentChain.verifyStateCommitment(\\n _proof.stateRoot,\\n _proof.stateRootBatchHeader,\\n _proof.stateRootProof\\n ));\\n }\\n\\n /**\\n * Verifies that the storage proof within an inclusion proof is valid.\\n * @param _xDomainCalldata Encoded message calldata.\\n * @param _proof Message inclusion proof.\\n * @return Whether or not the provided proof is valid.\\n */\\n function _verifyStorageProof(\\n bytes memory _xDomainCalldata,\\n L2MessageInclusionProof memory _proof\\n ) internal view returns (bool) {\\n bytes32 storageKey = keccak256(\\n abi.encodePacked(\\n keccak256(\\n abi.encodePacked(\\n _xDomainCalldata,\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\\n )\\n ),\\n uint256(0)\\n )\\n );\\n\\n (\\n bool exists,\\n bytes memory encodedMessagePassingAccount\\n ) = Lib_SecureMerkleTrie.get(\\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\\n _proof.stateTrieWitness,\\n _proof.stateRoot\\n );\\n\\n require(\\n exists == true,\\n 'Message passing predeploy has not been initialized or invalid proof provided.'\\n );\\n\\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\\n encodedMessagePassingAccount\\n );\\n\\n return\\n Lib_SecureMerkleTrie.verifyInclusionProof(\\n abi.encodePacked(storageKey),\\n abi.encodePacked(uint8(1)),\\n _proof.storageTrieWitness,\\n account.storageRoot\\n );\\n }\\n\\n /**\\n * Sends a cross domain message.\\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\\n * @param _message Message to send.\\n * @param _gasLimit OVM gas limit for the message.\\n */\\n function _sendXDomainMessage(\\n address _canonicalTransactionChain,\\n bytes memory _message,\\n uint256 _gasLimit\\n ) internal {\\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\\n _gasLimit,\\n _message\\n );\\n }\\n}\\n\",\"keccak256\":\"0x833370badf03d932a46f87e8de2b60eec9bca77f6b5aafaae6abbdd2749644ab\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x2cefcaffb2545843360e10af8ec99ef503662d8bcbd18a256969abb24cbbf471\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n ) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n ) external view returns (bool _inside);\\n}\\n\",\"keccak256\":\"0xb8da3deeaf8eceee6ff92ee7952a341b14a0d267adf8374987c48368908f0b50\",\"license\":\"MIT\"},\"contracts/libraries/bridge/ICrossDomainMessenger.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title ICrossDomainMessenger\\n */\\ninterface ICrossDomainMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n event SentMessage(\\n address indexed target,\\n address sender,\\n bytes message,\\n uint256 messageNonce,\\n uint256 gasLimit\\n );\\n event RelayedMessage(bytes32 indexed msgHash);\\n event FailedRelayedMessage(bytes32 indexed msgHash);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n function xDomainMessageSender() external view returns (address);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sends a cross domain message to the target messenger.\\n * @param _target Target contract address.\\n * @param _message Message to send to the target.\\n * @param _gasLimit Gas limit for the provided message.\\n */\\n function sendMessage(\\n address _target,\\n bytes calldata _message,\\n uint32 _gasLimit\\n ) external;\\n}\\n\",\"keccak256\":\"0x911ffc2920ba7ee55c4af17430e36e2776c1b9cc313a285c24ec866d0c57dea8\",\"license\":\"MIT\"},\"contracts/libraries/bridge/Lib_CrossDomainUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\n\\n/**\\n * @title Lib_CrossDomainUtils\\n */\\nlibrary Lib_CrossDomainUtils {\\n /**\\n * Generates the correct cross domain calldata for a message.\\n * @param _target Target contract address.\\n * @param _sender Message sender address.\\n * @param _message Message to send to the target.\\n * @param _messageNonce Nonce for the provided message.\\n * @return ABI encoded cross domain calldata.\\n */\\n function encodeXDomainCalldata(\\n address _target,\\n address _sender,\\n bytes memory _message,\\n uint256 _messageNonce\\n ) internal pure returns (bytes memory) {\\n return\\n abi.encodeWithSignature(\\n 'relayMessage(address,address,bytes,uint256)',\\n _target,\\n _sender,\\n _message,\\n _messageNonce\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb64b5bf53f86251d073c4941162a0036202849e11464c1237cc60dd4a7aeba8a\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\\nimport {Lib_Bytes32Utils} from '../utils/Lib_Bytes32Utils.sol';\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded)\\n internal\\n pure\\n returns (EVMAccount memory)\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(\\n _encoded\\n );\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x984f547b018437d8624ae21bff0bd42c37f14576853a6c561313233ff3eacdb3\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_DefaultValues.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_DefaultValues\\n */\\nlibrary Lib_DefaultValues {\\n // The default x-domain message sender being set to a non-zero value makes\\n // deployment a bit more expensive, but in exchange the refund on every call to\\n // `relayMessage` by the L1 and L2 messengers will be higher.\\n address internal constant DEFAULT_XDOMAIN_SENDER =\\n 0x000000000000000000000000000000000000dEaD;\\n}\\n\",\"keccak256\":\"0x05f951acb8cef89e255077bed737b65d21b72f3074316388747e63061e4a2a0c\",\"license\":\"MIT\"},\"contracts/libraries/constants/Lib_PredeployAddresses.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_PredeployAddresses\\n */\\nlibrary Lib_PredeployAddresses {\\n // solhint-disable max-line-length\\n address internal constant L2_TO_L1_MESSAGE_PASSER =\\n 0x4200000000000000000000000000000000000000;\\n address internal constant L1_MESSAGE_SENDER =\\n 0x4200000000000000000000000000000000000001;\\n address internal constant DEPLOYER_WHITELIST =\\n 0x4200000000000000000000000000000000000002;\\n address payable internal constant OVM_ETH =\\n payable(0x4200000000000000000000000000000000000006);\\n // solhint-disable-next-line max-line-length\\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\\n 0x4200000000000000000000000000000000000007;\\n address internal constant LIB_ADDRESS_MANAGER =\\n 0x4200000000000000000000000000000000000008;\\n address internal constant PROXY_EOA =\\n 0x4200000000000000000000000000000000000009;\\n address internal constant L2_STANDARD_BRIDGE =\\n 0x4200000000000000000000000000000000000010;\\n address internal constant SEQUENCER_FEE_WALLET =\\n 0x4200000000000000000000000000000000000011;\\n address internal constant L2_STANDARD_TOKEN_FACTORY =\\n 0x4200000000000000000000000000000000000012;\\n address internal constant L1_BLOCK_NUMBER =\\n 0x4200000000000000000000000000000000000013;\\n}\\n\",\"keccak256\":\"0x7cf57ae4bbc955ba944f833a8b0e31603b96d118a7a66c9808e4fcbaa8454c78\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({length: _in.length, ptr: ptr});\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in)\\n internal\\n pure\\n returns (RLPItem[] memory)\\n {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, 'Invalid RLP list value.');\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n 'Provided RLP list exceeds max list length.'\\n );\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({length: _in.length - offset, ptr: _in.ptr + offset})\\n );\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes value.');\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, 'Invalid RLP bytes32 value.');\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes32 value.');\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, 'Invalid RLP boolean value.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n 'Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1'\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, 'Invalid RLP address value.');\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, 'RLP item cannot be null.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, 'Invalid RLP short string.');\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, 'Invalid RLP long string length.');\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, 'Invalid RLP long string.');\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, 'Invalid RLP short list.');\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, 'Invalid RLP long list length.');\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, 'Invalid RLP long list.');\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x1d00ffbf595d95145544291f36a97de453b51032bb03a6247f890d2805b55955\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset)\\n private\\n pure\\n returns (bytes memory)\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb3a03376fea9bfc947af1719158aac3daa6343cb0329a1c2a33016a29c53970a\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_MerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\\n\\n/**\\n * @title Lib_MerkleTrie\\n */\\nlibrary Lib_MerkleTrie {\\n /*******************\\n * Data Structures *\\n *******************/\\n\\n enum NodeType {\\n BranchNode,\\n ExtensionNode,\\n LeafNode\\n }\\n\\n struct TrieNode {\\n bytes encoded;\\n Lib_RLPReader.RLPItem[] decoded;\\n }\\n\\n /**********************\\n * Contract Constants *\\n **********************/\\n\\n // TREE_RADIX determines the number of elements per branch node.\\n uint256 constant TREE_RADIX = 16;\\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\\n\\n // Prefixes are prepended to the `path` within a leaf or extension node and\\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\\n // determined by the number of nibbles within the unprefixed `path`. If the\\n // number of nibbles if even, we need to insert an extra padding nibble so\\n // the resulting prefixed `path` has an even number of nibbles.\\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\\n uint8 constant PREFIX_EXTENSION_ODD = 1;\\n uint8 constant PREFIX_LEAF_EVEN = 2;\\n uint8 constant PREFIX_LEAF_ODD = 3;\\n\\n // Just a utility constant. RLP represents `NULL` as 0x80.\\n bytes1 constant RLP_NULL = bytes1(0x80);\\n bytes constant RLP_NULL_BYTES = hex'80';\\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES =\\n keccak256(RLP_NULL_BYTES);\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n (bool exists, bytes memory value) = get(_key, _proof, _root);\\n\\n return (exists && Lib_BytesUtils.equal(_value, value));\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n // Special case when inserting the very first node.\\n if (_root == KECCAK256_RLP_NULL_BYTES) {\\n return getSingleNodeRootHash(_key, _value);\\n }\\n\\n TrieNode[] memory proof = _parseProof(_proof);\\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(\\n proof,\\n _key,\\n _root\\n );\\n TrieNode[] memory newPath = _getNewPath(\\n proof,\\n pathLength,\\n _key,\\n keyRemainder,\\n _value\\n );\\n\\n return _getUpdatedTrieRoot(newPath, _key);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n TrieNode[] memory proof = _parseProof(_proof);\\n (\\n uint256 pathLength,\\n bytes memory keyRemainder,\\n bool isFinalNode\\n ) = _walkNodePath(proof, _key, _root);\\n\\n bool exists = keyRemainder.length == 0;\\n\\n require(exists || isFinalNode, 'Provided proof is invalid.');\\n\\n bytes memory value = exists\\n ? _getNodeValue(proof[pathLength - 1])\\n : bytes('');\\n\\n return (exists, value);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n return\\n keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * @notice Walks through a proof using a provided key.\\n * @param _proof Inclusion proof to walk through.\\n * @param _key Key to use for the walk.\\n * @param _root Known root of the trie.\\n * @return _pathLength Length of the final path\\n * @return _keyRemainder Portion of the key remaining after the walk.\\n * @return _isFinalNode Whether or not we've hit a dead end.\\n */\\n function _walkNodePath(\\n TrieNode[] memory _proof,\\n bytes memory _key,\\n bytes32 _root\\n )\\n private\\n pure\\n returns (\\n uint256 _pathLength,\\n bytes memory _keyRemainder,\\n bool _isFinalNode\\n )\\n {\\n uint256 pathLength = 0;\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n bytes32 currentNodeID = _root;\\n uint256 currentKeyIndex = 0;\\n uint256 currentKeyIncrement = 0;\\n TrieNode memory currentNode;\\n\\n // Proof is top-down, so we start at the first element (root).\\n for (uint256 i = 0; i < _proof.length; i++) {\\n currentNode = _proof[i];\\n currentKeyIndex += currentKeyIncrement;\\n\\n // Keep track of the proof elements we actually need.\\n // It's expensive to resize arrays, so this simply reduces gas costs.\\n pathLength += 1;\\n\\n if (currentKeyIndex == 0) {\\n // First proof element is always the root node.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n 'Invalid root hash'\\n );\\n } else if (currentNode.encoded.length >= 32) {\\n // Nodes 32 bytes or larger are hashed inside branch nodes.\\n require(\\n keccak256(currentNode.encoded) == currentNodeID,\\n 'Invalid large internal hash'\\n );\\n } else {\\n // Nodes smaller than 31 bytes aren't hashed.\\n require(\\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\\n 'Invalid internal node hash'\\n );\\n }\\n\\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\\n if (currentKeyIndex == key.length) {\\n // We've hit the end of the key\\n // meaning the value should be within this branch node.\\n break;\\n } else {\\n // We're not at the end of the key yet.\\n // Figure out what the next node ID should be and continue.\\n uint8 branchKey = uint8(key[currentKeyIndex]);\\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[\\n branchKey\\n ];\\n currentNodeID = _getNodeID(nextNode);\\n currentKeyIncrement = 1;\\n continue;\\n }\\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(currentNode);\\n uint8 prefix = uint8(path[0]);\\n uint8 offset = 2 - (prefix % 2);\\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(\\n pathRemainder,\\n keyRemainder\\n );\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n if (\\n pathRemainder.length == sharedNibbleLength &&\\n keyRemainder.length == sharedNibbleLength\\n ) {\\n // The key within this leaf matches our key exactly.\\n // Increment the key index to reflect that we have no remainder.\\n currentKeyIndex += sharedNibbleLength;\\n }\\n\\n // We've hit a leaf node, so our next node should be NULL.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else if (\\n prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD\\n ) {\\n if (sharedNibbleLength != pathRemainder.length) {\\n // Our extension node is not identical to the remainder.\\n // We've hit the end of this path\\n // updates will need to modify this extension.\\n currentNodeID = bytes32(RLP_NULL);\\n break;\\n } else {\\n // Our extension shares some nibbles.\\n // Carry on to the next node.\\n currentNodeID = _getNodeID(currentNode.decoded[1]);\\n currentKeyIncrement = sharedNibbleLength;\\n continue;\\n }\\n } else {\\n revert('Received a node with an unknown prefix');\\n }\\n } else {\\n revert('Received an unparseable node.');\\n }\\n }\\n\\n // If our node ID is NULL, then we're at a dead end.\\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\\n return (\\n pathLength,\\n Lib_BytesUtils.slice(key, currentKeyIndex),\\n isFinalNode\\n );\\n }\\n\\n /**\\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\\n * @param _path Path to the node nearest the k/v pair.\\n * @param _pathLength Length of the path. Necessary because the provided path may include\\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\\n * arrays without costly duplication.\\n * @param _key Full original key.\\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\\n * @param _value Value to insert at the given key.\\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\\n */\\n function _getNewPath(\\n TrieNode[] memory _path,\\n uint256 _pathLength,\\n bytes memory _key,\\n bytes memory _keyRemainder,\\n bytes memory _value\\n ) private pure returns (TrieNode[] memory _newPath) {\\n bytes memory keyRemainder = _keyRemainder;\\n\\n // Most of our logic depends on the status of the last node in the path.\\n TrieNode memory lastNode = _path[_pathLength - 1];\\n NodeType lastNodeType = _getNodeType(lastNode);\\n\\n // Create an array for newly created nodes.\\n // We need up to three new nodes, depending on the contents of the last node.\\n // Since array resizing is expensive, we'll keep track of the size manually.\\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\\n TrieNode[] memory newNodes = new TrieNode[](3);\\n uint256 totalNewNodes = 0;\\n\\n // solhint-disable-next-line max-line-length\\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\\n bool matchLeaf = false;\\n if (lastNodeType == NodeType.LeafNode) {\\n uint256 l = 0;\\n if (_path.length > 0) {\\n for (uint256 i = 0; i < _path.length - 1; i++) {\\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\\n l++;\\n } else {\\n l += _getNodeKey(_path[i]).length;\\n }\\n }\\n }\\n\\n if (\\n _getSharedNibbleLength(\\n _getNodeKey(lastNode),\\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\\n ) ==\\n _getNodeKey(lastNode).length &&\\n keyRemainder.length == 0\\n ) {\\n matchLeaf = true;\\n }\\n }\\n\\n if (matchLeaf) {\\n // We've found a leaf node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\\n totalNewNodes += 1;\\n } else if (lastNodeType == NodeType.BranchNode) {\\n if (keyRemainder.length == 0) {\\n // We've found a branch node with the given key.\\n // Simply need to update the value of the node to match.\\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\\n totalNewNodes += 1;\\n } else {\\n // We've found a branch node, but it doesn't contain our key.\\n // Reinsert the old branch for now.\\n newNodes[totalNewNodes] = lastNode;\\n totalNewNodes += 1;\\n // Create a new leaf node, slicing our remainder since the first byte points\\n // to our branch node.\\n newNodes[totalNewNodes] = _makeLeafNode(\\n Lib_BytesUtils.slice(keyRemainder, 1),\\n _value\\n );\\n totalNewNodes += 1;\\n }\\n } else {\\n // Our last node is either an extension node or a leaf node with a different key.\\n bytes memory lastNodeKey = _getNodeKey(lastNode);\\n uint256 sharedNibbleLength = _getSharedNibbleLength(\\n lastNodeKey,\\n keyRemainder\\n );\\n\\n if (sharedNibbleLength != 0) {\\n // We've got some shared nibbles between the last node and our key remainder.\\n // We'll need to insert an extension node that covers these shared nibbles.\\n bytes memory nextNodeKey = Lib_BytesUtils.slice(\\n lastNodeKey,\\n 0,\\n sharedNibbleLength\\n );\\n newNodes[totalNewNodes] = _makeExtensionNode(\\n nextNodeKey,\\n _getNodeHash(_value)\\n );\\n totalNewNodes += 1;\\n\\n // Cut down the keys since we've just covered these shared nibbles.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\\n }\\n\\n // Create an empty branch to fill in.\\n TrieNode memory newBranch = _makeEmptyBranchNode();\\n\\n if (lastNodeKey.length == 0) {\\n // Key remainder was larger than the key for our last node.\\n // The value within our last node is therefore going to be shifted into\\n // a branch value slot.\\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\\n } else {\\n // Last node key was larger than the key remainder.\\n // We're going to modify some index of our branch.\\n uint8 branchKey = uint8(lastNodeKey[0]);\\n // Move on to the next nibble.\\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\\n\\n if (lastNodeType == NodeType.LeafNode) {\\n // We're dealing with a leaf node.\\n // We'll modify the key and insert the old leaf node into the branch index.\\n TrieNode memory modifiedLastNode = _makeLeafNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else if (lastNodeKey.length != 0) {\\n // We're dealing with a shrinking extension node.\\n // We need to modify the node to decrease the size of the key.\\n TrieNode memory modifiedLastNode = _makeExtensionNode(\\n lastNodeKey,\\n _getNodeValue(lastNode)\\n );\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeHash(modifiedLastNode.encoded)\\n );\\n } else {\\n // We're dealing with an unnecessary extension node.\\n // We're going to delete the node entirely.\\n // Simply insert its current value into the branch index.\\n newBranch = _editBranchIndex(\\n newBranch,\\n branchKey,\\n _getNodeValue(lastNode)\\n );\\n }\\n }\\n\\n if (keyRemainder.length == 0) {\\n // We've got nothing left in the key remainder.\\n // Simply insert the value into the branch value slot.\\n newBranch = _editBranchValue(newBranch, _value);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n } else {\\n // We've got some key remainder to work with.\\n // We'll be inserting a leaf node into the trie.\\n // First, move on to the next nibble.\\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\\n // Push the branch into the list of new nodes.\\n newNodes[totalNewNodes] = newBranch;\\n totalNewNodes += 1;\\n // Push a new leaf node for our k/v pair.\\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\\n totalNewNodes += 1;\\n }\\n }\\n\\n // Finally, join the old path with our newly created nodes.\\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\\n }\\n\\n /**\\n * @notice Computes the trie root from a given path.\\n * @param _nodes Path to some k/v pair.\\n * @param _key Key for the k/v pair.\\n * @return _updatedRoot Root hash for the updated trie.\\n */\\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\\n private\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\\n\\n // Some variables to keep track of during iteration.\\n TrieNode memory currentNode;\\n NodeType currentNodeType;\\n bytes memory previousNodeHash;\\n\\n // Run through the path backwards to rebuild our root hash.\\n for (uint256 i = _nodes.length; i > 0; i--) {\\n // Pick out the current node.\\n currentNode = _nodes[i - 1];\\n currentNodeType = _getNodeType(currentNode);\\n\\n if (currentNodeType == NodeType.LeafNode) {\\n // Leaf nodes are already correctly encoded.\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n } else if (currentNodeType == NodeType.ExtensionNode) {\\n // Shift the key over to account for the nodes key.\\n bytes memory nodeKey = _getNodeKey(currentNode);\\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\\n\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\\n }\\n } else if (currentNodeType == NodeType.BranchNode) {\\n // If this node is the last element in the path, it'll be correctly encoded\\n // and we can skip this part.\\n if (previousNodeHash.length > 0) {\\n // Re-encode the node based on the previous node.\\n uint8 branchKey = uint8(key[key.length - 1]);\\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\\n currentNode = _editBranchIndex(\\n currentNode,\\n branchKey,\\n previousNodeHash\\n );\\n }\\n }\\n\\n // Compute the node hash for the next iteration.\\n previousNodeHash = _getNodeHash(currentNode.encoded);\\n }\\n\\n // Current node should be the root at this point.\\n // Simply return the hash of its encoding.\\n return keccak256(currentNode.encoded);\\n }\\n\\n /**\\n * @notice Parses an RLP-encoded proof into something more useful.\\n * @param _proof RLP-encoded proof to parse.\\n * @return _parsed Proof parsed into easily accessible structs.\\n */\\n function _parseProof(bytes memory _proof)\\n private\\n pure\\n returns (TrieNode[] memory _parsed)\\n {\\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\\n TrieNode[] memory proof = new TrieNode[](nodes.length);\\n\\n for (uint256 i = 0; i < nodes.length; i++) {\\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\\n proof[i] = TrieNode({\\n encoded: encoded,\\n decoded: Lib_RLPReader.readList(encoded)\\n });\\n }\\n\\n return proof;\\n }\\n\\n /**\\n * @notice Picks out the ID for a node. Node ID is referred to as the\\n * \\\"hash\\\" within the specification, but nodes < 32 bytes are not actually\\n * hashed.\\n * @param _node Node to pull an ID for.\\n * @return _nodeID ID for the node, depending on the size of its contents.\\n */\\n function _getNodeID(Lib_RLPReader.RLPItem memory _node)\\n private\\n pure\\n returns (bytes32 _nodeID)\\n {\\n bytes memory nodeID;\\n\\n if (_node.length < 32) {\\n // Nodes smaller than 32 bytes are RLP encoded.\\n nodeID = Lib_RLPReader.readRawBytes(_node);\\n } else {\\n // Nodes 32 bytes or larger are hashed.\\n nodeID = Lib_RLPReader.readBytes(_node);\\n }\\n\\n return Lib_BytesUtils.toBytes32(nodeID);\\n }\\n\\n /**\\n * @notice Gets the path for a leaf or extension node.\\n * @param _node Node to get a path for.\\n * @return _path Node path, converted to an array of nibbles.\\n */\\n function _getNodePath(TrieNode memory _node)\\n private\\n pure\\n returns (bytes memory _path)\\n {\\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\\n }\\n\\n /**\\n * @notice Gets the key for a leaf or extension node. Keys are essentially\\n * just paths without any prefix.\\n * @param _node Node to get a key for.\\n * @return _key Node key, converted to an array of nibbles.\\n */\\n function _getNodeKey(TrieNode memory _node)\\n private\\n pure\\n returns (bytes memory _key)\\n {\\n return _removeHexPrefix(_getNodePath(_node));\\n }\\n\\n /**\\n * @notice Gets the path for a node.\\n * @param _node Node to get a value for.\\n * @return _value Node value, as hex bytes.\\n */\\n function _getNodeValue(TrieNode memory _node)\\n private\\n pure\\n returns (bytes memory _value)\\n {\\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\\n }\\n\\n /**\\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\\n * are not hashed, all others are keccak256 hashed.\\n * @param _encoded Encoded node to hash.\\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\\n */\\n function _getNodeHash(bytes memory _encoded)\\n private\\n pure\\n returns (bytes memory _hash)\\n {\\n if (_encoded.length < 32) {\\n return _encoded;\\n } else {\\n return abi.encodePacked(keccak256(_encoded));\\n }\\n }\\n\\n /**\\n * @notice Determines the type for a given node.\\n * @param _node Node to determine a type for.\\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\\n */\\n function _getNodeType(TrieNode memory _node)\\n private\\n pure\\n returns (NodeType _type)\\n {\\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\\n return NodeType.BranchNode;\\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\\n bytes memory path = _getNodePath(_node);\\n uint8 prefix = uint8(path[0]);\\n\\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\\n return NodeType.LeafNode;\\n } else if (\\n prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD\\n ) {\\n return NodeType.ExtensionNode;\\n }\\n }\\n\\n revert('Invalid node type');\\n }\\n\\n /**\\n * @notice Utility; determines the number of nibbles shared between two\\n * nibble arrays.\\n * @param _a First nibble array.\\n * @param _b Second nibble array.\\n * @return _shared Number of shared nibbles.\\n */\\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\\n private\\n pure\\n returns (uint256 _shared)\\n {\\n uint256 i = 0;\\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\\n i++;\\n }\\n return i;\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-encoded node into our nice struct.\\n * @param _raw RLP-encoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(bytes[] memory _raw)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\\n\\n return\\n TrieNode({encoded: encoded, decoded: Lib_RLPReader.readList(encoded)});\\n }\\n\\n /**\\n * @notice Utility; converts an RLP-decoded node into our nice struct.\\n * @param _items RLP-decoded node to convert.\\n * @return _node Node as a TrieNode struct.\\n */\\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](_items.length);\\n for (uint256 i = 0; i < _items.length; i++) {\\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new extension node.\\n * @param _key Key for the extension node, unprefixed.\\n * @param _value Value for the extension node.\\n * @return _node New extension node with the given k/v pair.\\n */\\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * Creates a new extension node with the same key but a different value.\\n * @param _node Extension node to copy and modify.\\n * @param _value New value for the extension node.\\n * @return New node with the same key and different value.\\n */\\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n if (_value.length < 32) {\\n raw[1] = _value;\\n } else {\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates a new leaf node.\\n * @dev This function is essentially identical to `_makeExtensionNode`.\\n * Although we could route both to a single method with a flag, it's\\n * more gas efficient to keep them separate and duplicate the logic.\\n * @param _key Key for the leaf node, unprefixed.\\n * @param _value Value for the leaf node.\\n * @return _node New leaf node with the given k/v pair.\\n */\\n function _makeLeafNode(bytes memory _key, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _node)\\n {\\n bytes[] memory raw = new bytes[](2);\\n bytes memory key = _addHexPrefix(_key, true);\\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\\n raw[1] = Lib_RLPWriter.writeBytes(_value);\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Creates an empty branch node.\\n * @return _node Empty branch node as a TrieNode struct.\\n */\\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\\n for (uint256 i = 0; i < raw.length; i++) {\\n raw[i] = RLP_NULL_BYTES;\\n }\\n return _makeNode(raw);\\n }\\n\\n /**\\n * @notice Modifies the value slot for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _value Value to insert into the branch.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\\n private\\n pure\\n returns (TrieNode memory _updatedNode)\\n {\\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(\\n encoded\\n );\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Modifies a slot at an index for a given branch.\\n * @param _branch Branch node to modify.\\n * @param _index Slot index to modify.\\n * @param _value Value to insert into the slot.\\n * @return _updatedNode Modified branch node.\\n */\\n function _editBranchIndex(\\n TrieNode memory _branch,\\n uint8 _index,\\n bytes memory _value\\n ) private pure returns (TrieNode memory _updatedNode) {\\n bytes memory encoded = _value.length < 32\\n ? _value\\n : Lib_RLPWriter.writeBytes(_value);\\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\\n return _makeNode(_branch.decoded);\\n }\\n\\n /**\\n * @notice Utility; adds a prefix to a key.\\n * @param _key Key to prefix.\\n * @param _isLeaf Whether or not the key belongs to a leaf.\\n * @return _prefixedKey Prefixed key.\\n */\\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\\n private\\n pure\\n returns (bytes memory _prefixedKey)\\n {\\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\\n uint8 offset = uint8(_key.length % 2);\\n bytes memory prefixed = new bytes(2 - offset);\\n prefixed[0] = bytes1(prefix + offset);\\n return abi.encodePacked(prefixed, _key);\\n }\\n\\n /**\\n * @notice Utility; removes a prefix from a path.\\n * @param _path Path to remove the prefix from.\\n * @return _unprefixedKey Unprefixed key.\\n */\\n function _removeHexPrefix(bytes memory _path)\\n private\\n pure\\n returns (bytes memory _unprefixedKey)\\n {\\n if (uint8(_path[0]) % 2 == 0) {\\n return Lib_BytesUtils.slice(_path, 2);\\n } else {\\n return Lib_BytesUtils.slice(_path, 1);\\n }\\n }\\n\\n /**\\n * @notice Utility; combines two node arrays. Array lengths are required\\n * because the actual lengths may be longer than the filled lengths.\\n * Array resizing is extremely costly and should be avoided.\\n * @param _a First array to join.\\n * @param _aLength Length of the first array.\\n * @param _b Second array to join.\\n * @param _bLength Length of the second array.\\n * @return _joined Combined node array.\\n */\\n function _joinNodeArrays(\\n TrieNode[] memory _a,\\n uint256 _aLength,\\n TrieNode[] memory _b,\\n uint256 _bLength\\n ) private pure returns (TrieNode[] memory _joined) {\\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\\n\\n // Copy elements from the first array.\\n for (uint256 i = 0; i < _aLength; i++) {\\n ret[i] = _a[i];\\n }\\n\\n // Copy elements from the second array.\\n for (uint256 i = 0; i < _bLength; i++) {\\n ret[i + _aLength] = _b[i];\\n }\\n\\n return ret;\\n }\\n}\\n\",\"keccak256\":\"0xcbaabf02ed081141475f6d2528915430b2df73f18166039f9fb888bf42a0b1a5\",\"license\":\"MIT\"},\"contracts/libraries/trie/Lib_SecureMerkleTrie.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_MerkleTrie} from './Lib_MerkleTrie.sol';\\n\\n/**\\n * @title Lib_SecureMerkleTrie\\n */\\nlibrary Lib_SecureMerkleTrie {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * @notice Verifies a proof that a given key/value pair is present in the\\n * Merkle trie.\\n * @param _key Key of the node to search for, as a hex string.\\n * @param _value Value of the node to search for, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\\n * traditional Merkle trees, this proof is executed top-down and consists\\n * of a list of RLP-encoded nodes that make a path down to the target node.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\\n */\\n function verifyInclusionProof(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _verified) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Updates a Merkle trie and returns a new root hash.\\n * @param _key Key of the node to update, as a hex string.\\n * @param _value Value of the node to update, as a hex string.\\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\\n * target node. If the key exists, we can simply update the value.\\n * Otherwise, we need to modify the trie to handle the new k/v pair.\\n * @param _root Known root of the Merkle trie. Used to verify that the\\n * included proof is correctly constructed.\\n * @return _updatedRoot Root hash of the newly constructed trie.\\n */\\n function update(\\n bytes memory _key,\\n bytes memory _value,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bytes32 _updatedRoot) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\\n }\\n\\n /**\\n * @notice Retrieves the value associated with a given key.\\n * @param _key Key to search for, as hex bytes.\\n * @param _proof Merkle trie inclusion proof for the key.\\n * @param _root Known root of the Merkle trie.\\n * @return _exists Whether or not the key exists.\\n * @return _value Value of the key if it exists.\\n */\\n function get(\\n bytes memory _key,\\n bytes memory _proof,\\n bytes32 _root\\n ) internal pure returns (bool _exists, bytes memory _value) {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.get(key, _proof, _root);\\n }\\n\\n /**\\n * Computes the root hash for a trie with a single node.\\n * @param _key Key for the single node.\\n * @param _value Value for the single node.\\n * @return _updatedRoot Hash of the trie.\\n */\\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\\n internal\\n pure\\n returns (bytes32 _updatedRoot)\\n {\\n bytes memory key = _getSecureKey(_key);\\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Computes the secure counterpart to a key.\\n * @param _key Key to get a secure key from.\\n * @return _secureKey Secure version of the key.\\n */\\n function _getSecureKey(bytes memory _key)\\n private\\n pure\\n returns (bytes memory _secureKey)\\n {\\n return abi.encodePacked(keccak256(_key));\\n }\\n}\\n\",\"keccak256\":\"0xfb8794d94dcf1cd09b4b7278884a14e8b2e5d5c4e44f5352e31e9daf3bd329f2\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0x675b6d1b5a1b5a80f31c2a8a33adc8105e8b38c2e21626706c8f7e9be74346e2\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, 'slice_overflow');\\n require(_start + _length >= _start, 'slice_overflow');\\n require(_bytes.length >= _start + _length, 'slice_outOfBounds');\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(\\n add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))),\\n _start\\n )\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other)\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xdf5a3f5021b71789c9c056164d76634add7fa005c1d0a927d80b609f0090f2e5\",\"license\":\"MIT\"},\"contracts/standards/AddressAliasHelper.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n\\n/*\\n * Copyright 2019-2021, Offchain Labs, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\\n\\npragma solidity ^0.8.7;\\n\\nlibrary AddressAliasHelper {\\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\\n\\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\\n /// the inbox to the msg.sender viewed in the L2\\n /// @param l1Address the address in the L1 that triggered the tx to L2\\n /// @return l2Address L2 address as viewed in msg.sender\\n function applyL1ToL2Alias(address l1Address)\\n internal\\n pure\\n returns (address l2Address)\\n {\\n unchecked {\\n l2Address = address(uint160(l1Address) + offset);\\n }\\n }\\n\\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\\n /// address in the L1 that submitted a tx to the inbox\\n /// @param l2Address L2 address as viewed in msg.sender\\n /// @return l1Address the address in the L1 that triggered the tx to L2\\n function undoL1ToL2Alias(address l2Address)\\n internal\\n pure\\n returns (address l1Address)\\n {\\n unchecked {\\n l1Address = address(uint160(l2Address) - offset);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x48d904ede1f43f23a585015f295c7a5f26c52791c0fedc8ced688ccffd44497b\",\"license\":\"Apache-2.0\"}},\"version\":1}", ++ "bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613c7e806100446000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806381ada46c116100b2578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102b3578063d7fd19dd146102d6578063f2fde38b146102e957600080fd5b8063b1b1b2091461027d578063c4d66de8146102a057600080fd5b806381ada46c146102215780638456cb59146102345780638da5cb5b1461023c578063a4e7f8bd1461025a57600080fd5b8063461a4478116101095780636e296e45116100ee5780636e296e45146101fe5780636f1c8d4714610206578063715018a61461021957600080fd5b8063461a4478146101e05780635c975abb146101f357600080fd5b80630ecf2eea1461013b57806321d800ec14610150578063299ca478146101885780633dbb202b146101cd575b600080fd5b61014e610149366004613170565b6102fc565b005b61017361015e366004613170565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017f565b61014e6101db3660046132e8565b6103ab565b6101a86101ee366004613348565b6104f3565b60655460ff16610173565b6101a86105a0565b61014e610214366004613399565b61062a565b61014e610811565b61014e61022f366004613170565b610884565b61014e61092b565b60335473ffffffffffffffffffffffffffffffffffffffff166101a8565b610173610268366004613170565b60cc6020526000908152604090205460ff1681565b61017361028b366004613170565b60cb6020526000908152604090205460ff1681565b61014e6102ae366004613425565b61099a565b6101736102c1366004613170565b60c96020526000908152604090205460ff1681565b61014e6102e436600461358b565b610be7565b61014e6102f7366004613425565b6110cb565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60006103eb6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d91906136d9565b905060006104848633878564ffffffffff166111c7565b905061049783828663ffffffff16611242565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516104e39493929190613750565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061054a9085906004016137a3565b60206040518083038186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906137b6565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561060d5760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f742073657400604482015260640161035f565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b600061066a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e91906137d3565b9050600061071e898989896111c7565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107639493929190613838565b604051602081830303815290604052805190602001209050826000015181146107f45760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e00000000000000000000000000000000000000000000000000606482015260840161035f565b61080584838763ffffffff16611242565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088260006112e3565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b61088261135a565b6000547501000000000000000000000000000000000000000000900460ff16806109df575060005474010000000000000000000000000000000000000000900460ff16155b610a515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff16158015610ab857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610b445760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e00000000000000000000000000000000000000000000606482015260840161035f565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b9c61140c565b610ba461155b565b610bac611682565b610bb46117db565b8015610be357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610c3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161035f565b600260975560655460ff1615610c925760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6000610ca0868686866111c7565b9050610cac818361192f565b1515600114610d235760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e00000000000000000000000000000000000000000000000000606482015260840161035f565b8051602080830191909120600081815260cb90925260409091205460ff1615610db45760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e000000000000000000000000000000000000000000606482015260840161035f565b600081815260c9602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161035f565b610e776040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104f3565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610f185760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e00000000000000000000000000606482015260840161035f565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610f7190889061387d565b6000604051808303816000865af19150503d8060008114610fae576040519150601f19603f3d011682016040523d82523d6000602084013e610fb3565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561103357600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611074565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161108b93929190613899565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035f565b73ffffffffffffffffffffffffffffffffffffffff81166111bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035f565b6111c4816112e3565b50565b6060848484846040516024016111e094939291906138eb565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e0906112ac907342000000000000000000000000000000000000079085908790600401613935565b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113ad5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161035f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113e23390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff1680611451575060005474010000000000000000000000000000000000000000900460ff16155b6114c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561152a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b80156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806115a0575060005474010000000000000000000000000000000000000000900460ff16155b6116125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff1615801561167957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61152a336112e3565b6000547501000000000000000000000000000000000000000000900460ff16806116c7575060005474010000000000000000000000000000000000000000900460ff16155b6117395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156117a057600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff1916905580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611820575060005474010000000000000000000000000000000000000000900460ff16155b6118925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161035f565b6000547501000000000000000000000000000000000000000000900460ff161580156118f957600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b600160975580156111c457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b600061193a82611952565b801561194b575061194b8383611af4565b9392505050565b6000806119936040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104f3565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd916119eb916004016139a7565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906139ba565b15801561194b57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611aa49391929091906004016139dc565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906139ba565b60008083734200000000000000000000000000000000000007604051602001611b1e929190613a54565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611bae9060340160408051601f1981840301815291905260608701518751611cd8565b9092509050600182151514611c515760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a40161035f565b6000611c5c82611d01565b9050611ccd84604051602001611c7491815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611dc5565b979650505050505050565b600060606000611ce786611de9565b9050611cf4818686611e1b565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611d2e83611ef6565b90506040518060800160405280611d5e83600081518110611d5157611d51613a9e565b6020026020010151611f29565b8152602001611d7983600181518110611d5157611d51613a9e565b8152602001611da183600281518110611d9457611d94613a9e565b6020026020010151611f30565b8152602001611dbc83600381518110611d9457611d94613a9e565b90529392505050565b600080611dd186611de9565b9050611ddf81868686612032565b9695505050505050565b60608180519060200120604051602001611e0591815260200190565b6040516020818303038152906040529050919050565b600060606000611e2a85612068565b90506000806000611e3c848a89612163565b81519295509093509150158080611e505750815b611e9c5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e000000000000604482015260640161035f565b600081611eb85760405180602001604052806000815250611ee4565b611ee486611ec7600188613afc565b81518110611ed757611ed7613a9e565b60200260200101516125fe565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061059a90612628565b600061059a825b6000602182600001511115611f875760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b6000806000611f9585612827565b919450925090506000816001811115611fb057611fb0613b13565b14611ffd5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e000000000000604482015260640161035f565b600083866020015161200f9190613b42565b80519091506020841015611ddf5760208490036101000a90049695505050505050565b6000806000612042878686611e1b565b91509150818015611ccd5750805160208083019190912087519188019190912014611ccd565b6060600061207583611ef6565b90506000815167ffffffffffffffff811115612093576120936131ab565b6040519080825280602002602001820160405280156120d857816020015b60408051808201909152606080825260208201528152602001906001900390816120b15790505b50905060005b825181101561215b57600061210b8483815181106120fe576120fe613a9e565b6020026020010151612b78565b9050604051806040016040528082815260200161212783611ef6565b81525083838151811061213c5761213c613a9e565b602002602001018190525050808061215390613b5a565b9150506120de565b509392505050565b6000606081808061217387612c08565b9050600086905060008061219a604051806040016040528060608152602001606081525090565b60005b8c518110156125ba578c81815181106121b8576121b8613a9e565b6020026020010151915082846121ce9190613b42565b93506121db600188613b42565b96508361223f5781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f742068617368000000000000000000000000000000604482015260640161035f565b6122fc565b8151516020116122a15781518051602090910120851461223a5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c20686173680000000000604482015260640161035f565b846122af8360000151612d8b565b146122fc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f64652068617368000000000000604482015260640161035f565b61230860106001613b42565b8260200151511415612381578551841415612322576125ba565b600086858151811061233657612336613a9e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061236157612361613a9e565b6020026020010151905061237481612db3565b96506001945050506125a8565b6002826020015151141561256057600061239a83612de9565b90506000816000815181106123b1576123b1613a9e565b016020015160f81c905060006123c8600283613bc2565b6123d3906002613be4565b905060006123e4848360ff16612e0d565b905060006123f28b8a612e0d565b905060006124008383612e43565b905060ff851660021480612417575060ff85166003145b1561246d5780835114801561242c5750808251145b1561243e5761243b818b613b42565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b60ff85161580612480575060ff85166001145b156124f257825181146124bc57507f800000000000000000000000000000000000000000000000000000000000000099506125ba945050505050565b6124e388602001516001815181106124d6576124d6613a9e565b6020026020010151612db3565b9a5097506125a8945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f7072656669780000000000000000000000000000000000000000000000000000606482015260840161035f565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e000000604482015260640161035f565b806125b281613b5a565b91505061219d565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e98786612e0d565b909e909d50909b509950505050505050505050565b6020810151805160609161059a9161261890600190613afc565b815181106120fe576120fe613a9e565b606060008061263684612827565b9193509091506001905081600181111561265257612652613b13565b1461269f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e000000000000000000604482015260640161035f565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126b85790505090506000835b865181101561281c57602082106127645760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e00000000000000000000000000000000000000000000606482015260840161035f565b6000806127a16040518060400160405280858c600001516127859190613afc565b8152602001858c6020015161279a9190613b42565b9052612827565b5091509150604051806040016040528083836127bd9190613b42565b8152602001848b602001516127d29190613b42565b8152508585815181106127e7576127e7613a9e565b60209081029190910101526127fd600185613b42565b93506128098183613b42565b6128139084613b42565b925050506126e5565b508152949350505050565b60008060008084600001511161287f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e0000000000000000604482015260640161035f565b6020840151805160001a607f81116128a4576000600160009450945094505050612b71565b60b781116129205760006128b9608083613afc565b90508087600001511161290e5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e00000000000000604482015260640161035f565b60019550935060009250612b71915050565b60bf8111612a0f57600061293560b783613afc565b90508087600001511161298a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e00604482015260640161035f565b600183015160208290036101000a90046129a48183613b42565b8851116129f35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e0000000000000000604482015260640161035f565b6129fe826001613b42565b9650945060009350612b7192505050565b60f78111612a8a576000612a2460c083613afc565b905080876000015111612a795760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e000000000000000000604482015260640161035f565b600195509350849250612b71915050565b6000612a9760f783613afc565b905080876000015111612aec5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e000000604482015260640161035f565b600183015160208290036101000a9004612b068183613b42565b885111612b555760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e00000000000000000000604482015260640161035f565b612b60826001613b42565b9650945060019350612b7192505050565b9193909250565b60606000806000612b8885612827565b919450925090506000816001811115612ba357612ba3613b13565b14612bf05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e0000000000000000604482015260640161035f565b612bff85602001518484612eef565b95945050505050565b6060600082516002612c1a9190613c07565b67ffffffffffffffff811115612c3257612c326131ab565b6040519080825280601f01601f191660200182016040528015612c5c576020820181803683370190505b50905060005b8351811015612d84576004848281518110612c7f57612c7f613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612cb4836002613c07565b81518110612cc457612cc4613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612d0757612d07613a9e565b0160200151612d19919060f81c613bc2565b60f81b82612d28836002613c07565b612d33906001613b42565b81518110612d4357612d43613a9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612d7c81613b5a565b915050612c62565b5092915050565b6000602082511015612d9f57506020015190565b8180602001905181019061059a9190613c44565b60006060602083600001511015612dd457612dcd83612fce565b9050612de0565b612ddd83612b78565b90505b61194b81612d8b565b606061059a612e0883602001516000815181106120fe576120fe613a9e565b612c08565b606082518210612e2c575060408051602081019091526000815261059a565b61194b8383848651612e3e9190613afc565b612fd9565b6000805b808451118015612e575750808351115b8015612ed85750828181518110612e7057612e70613a9e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612eaf57612eaf613a9e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561194b5780612ee781613b5a565b915050612e47565b606060008267ffffffffffffffff811115612f0c57612f0c6131ab565b6040519080825280601f01601f191660200182016040528015612f36576020820181803683370190505b509050805160001415612f4a57905061194b565b6000612f568587613b42565b90506020820160005b612f6a602087613c5d565b811015612fa15782518252612f80602084613b42565b9250612f8d602083613b42565b915080612f9981613b5a565b915050612f5f565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061059a8261315a565b606081612fe781601f613b42565b10156130355760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b826130408382613b42565b101561308e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161035f565b6130988284613b42565b845110156130e85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161035f565b6060821580156131075760405191506000825260208201604052613151565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613140578051835260209283019201613128565b5050858452601f01601f1916604052505b50949350505050565b606061059a826020015160008460000151612eef565b60006020828403121561318257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131fd576131fd6131ab565b60405290565b60405160a0810167ffffffffffffffff811182821017156131fd576131fd6131ab565b604051601f8201601f1916810167ffffffffffffffff8111828210171561324f5761324f6131ab565b604052919050565b600067ffffffffffffffff831115613271576132716131ab565b6132846020601f19601f86011601613226565b905082815283838301111561329857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126132c057600080fd5b61194b83833560208501613257565b803563ffffffff811681146132e357600080fd5b919050565b6000806000606084860312156132fd57600080fd5b833561330881613189565b9250602084013567ffffffffffffffff81111561332457600080fd5b613330868287016132af565b92505061333f604085016132cf565b90509250925092565b60006020828403121561335a57600080fd5b813567ffffffffffffffff81111561337157600080fd5b8201601f8101841361338257600080fd5b61339184823560208401613257565b949350505050565b60008060008060008060c087890312156133b257600080fd5b86356133bd81613189565b955060208701356133cd81613189565b9450604087013567ffffffffffffffff8111156133e957600080fd5b6133f589828a016132af565b9450506060870135925061340b608088016132cf565b915061341960a088016132cf565b90509295509295509295565b60006020828403121561343757600080fd5b813561194b81613189565b600060a0828403121561345457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613478576134786131ab565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156134b557600080fd5b506134c2858286016132af565b6080830152505092915050565b6000604082840312156134e157600080fd5b6134e96131da565b90508135815260208083013567ffffffffffffffff8082111561350b57600080fd5b818501915085601f83011261351f57600080fd5b813581811115613531576135316131ab565b8060051b9150613542848301613226565b818152918301840191848101908884111561355c57600080fd5b938501935b8385101561357a57843582529385019390850190613561565b808688015250505050505092915050565b600080600080600060a086880312156135a357600080fd5b85356135ae81613189565b945060208601356135be81613189565b9350604086013567ffffffffffffffff808211156135db57600080fd5b6135e789838a016132af565b945060608801359350608088013591508082111561360457600080fd5b9087019060a0828a03121561361857600080fd5b613620613203565b8235815260208301358281111561363657600080fd5b6136428b828601613442565b60208301525060408301358281111561365a57600080fd5b6136668b8286016134cf565b60408301525060608301358281111561367e57600080fd5b61368a8b8286016132af565b6060830152506080830135828111156136a257600080fd5b6136ae8b8286016132af565b6080830152508093505050509295509295909350565b805164ffffffffff811681146132e357600080fd5b6000602082840312156136eb57600080fd5b61194b826136c4565b60005b8381101561370f5781810151838201526020016136f7565b8381111561371e576000848401525b50505050565b6000815180845261373c8160208601602086016136f4565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061377f6080830186613724565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b60208152600061194b6020830184613724565b6000602082840312156137c857600080fd5b815161194b81613189565b6000606082840312156137e557600080fd5b6040516060810181811067ffffffffffffffff82111715613808576138086131ab565b6040528251815261381b602084016136c4565b602082015261382c604084016136c4565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ddf6080830184613724565b6000825161388f8184602087016136f4565b9190910192915050565b600084516138ab8184602089016136f4565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526139246080830185613724565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612bff6060830184613724565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a0608085015261339160a0850182613724565b60208152600061194b602083018461396a565b6000602082840312156139cc57600080fd5b8151801515811461194b57600080fd5b838152600060206060818401526139f6606084018661396a565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613a465784518252938501936001939093019290850190613a26565b509998505050505050505050565b60008351613a668184602088016136f4565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b0e57613b0e613acd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613b5557613b55613acd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8c57613b8c613acd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613bd557613bd5613b93565b8060ff84160691505092915050565b600060ff821660ff841680821015613bfe57613bfe613acd565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3f57613c3f613acd565b500290565b600060208284031215613c5657600080fd5b5051919050565b600082613c6c57613c6c613b93565b50049056fea164736f6c6343000809000a", + "devdoc": { + "details": "The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2 epoch gas limit, it can be resubmitted via this contract's replay function. Runtime target: EVM", + "kind": "dev", +@@ -618,12 +637,12 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + }, + { + "astId": 130, +@@ -698,7 +717,7 @@ + "type": "t_array(t_uint256)49_storage" + }, + { +- "astId": 2289, ++ "astId": 2143, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "blockedMessages", + "offset": 0, +@@ -706,7 +725,7 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2293, ++ "astId": 2147, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "relayedMessages", + "offset": 0, +@@ -714,7 +733,7 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2297, ++ "astId": 2151, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", + "label": "successfulMessages", + "offset": 0, +@@ -722,11 +741,19 @@ + "type": "t_mapping(t_bytes32,t_bool)" + }, + { +- "astId": 2301, ++ "astId": 2155, + "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", +- "label": "xDomainMsgSender", ++ "label": "failedMessages", + "offset": 0, + "slot": "204", ++ "type": "t_mapping(t_bytes32,t_bool)" ++ }, ++ { ++ "astId": 2159, ++ "contract": "contracts/L1/messaging/L1CrossDomainMessenger.sol:L1CrossDomainMessenger", ++ "label": "xDomainMsgSender", ++ "offset": 0, ++ "slot": "205", + "type": "t_address" + } + ], +@@ -758,7 +785,7 @@ + "label": "bytes32", + "numberOfBytes": "32" + }, +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1CrossDomainMessenger.json +similarity index 91% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json +rename to node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1CrossDomainMessenger.json +index 0107815..31c94d9 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1CrossDomainMessenger.json +@@ -1,5 +1,5 @@ + { +- "address": "0x4361d0F75A0186C05f971c566dC6bEa5957483fD", ++ "address": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e", + "abi": [ + { + "inputs": [ +@@ -22,30 +22,30 @@ + "type": "fallback" + } + ], +- "transactionHash": "0x7b862bcd408395eaf5df4ace8b3f76ce4618a0c9e82ce87034d40866843ca1bd", ++ "transactionHash": "0x7b368a80e4d02a0f2b4634337d3dc000a1ff5b7715e9dd47118b96d3331904c9", + "receipt": { + "to": null, +- "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", +- "contractAddress": "0x4361d0F75A0186C05f971c566dC6bEa5957483fD", +- "transactionIndex": 4, +- "gasUsed": "225024", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e", ++ "transactionIndex": 81, ++ "gasUsed": "216156", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xf9e914ec5932c999ce1b6d840694e4c21d12fb897d31b7f8d210c5ddf2502de2", +- "transactionHash": "0x7b862bcd408395eaf5df4ace8b3f76ce4618a0c9e82ce87034d40866843ca1bd", ++ "blockHash": "0x1e044dc5c76b1f03739817443989e9374bd038e26075aca5f5e3691e2aad2cf2", ++ "transactionHash": "0x7b368a80e4d02a0f2b4634337d3dc000a1ff5b7715e9dd47118b96d3331904c9", + "logs": [], +- "blockNumber": 25502615, +- "cumulativeGasUsed": "821238", ++ "blockNumber": 13011949, ++ "cumulativeGasUsed": "6706010", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a", ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + "OVM_L1CrossDomainMessenger" + ], +- "solcInputHash": "ef3f334bac4d7e77d91b457a0d89ab0a", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220d96dd78b72a44c11bfa8efb98d29ee53776a02c67052599da176325fcbf95b6464736f6c63430007060033", +- "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220d96dd78b72a44c11bfa8efb98d29ee53776a02c67052599da176325fcbf95b6464736f6c63430007060033", ++ "solcInputHash": "1bef9702d702d51d122c68caa8d7c949", ++ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", ++ "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "devdoc": { + "kind": "dev", + "methods": { +@@ -67,7 +67,7 @@ + "storageLayout": { + "storage": [ + { +- "astId": 15340, ++ "astId": 15382, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, +@@ -75,12 +75,12 @@ + "type": "t_mapping(t_address,t_string_storage)" + }, + { +- "astId": 15344, ++ "astId": 15386, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", +- "type": "t_mapping(t_address,t_contract(Lib_AddressManager)15296)" ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)15338)" + } + ], + "types": { +@@ -89,17 +89,17 @@ + "label": "address", + "numberOfBytes": "20" + }, +- "t_contract(Lib_AddressManager)15296": { ++ "t_contract(Lib_AddressManager)15338": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, +- "t_mapping(t_address,t_contract(Lib_AddressManager)15296)": { ++ "t_mapping(t_address,t_contract(Lib_AddressManager)15338)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", +- "value": "t_contract(Lib_AddressManager)15296" ++ "value": "t_contract(Lib_AddressManager)15338" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", +diff --git a/node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1StandardBridge.json +similarity index 95% +rename from node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1StandardBridge.json +rename to node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1StandardBridge.json +index 9528a2f..8737beb 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/kovan/Proxy__OVM_L1StandardBridge.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__L1StandardBridge.json +@@ -1,5 +1,5 @@ + { +- "address": "0x22F24361D548e5FaAfb36d1437839f080363982B", ++ "address": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00", + "abi": [ + { + "inputs": [ +@@ -87,29 +87,29 @@ + "type": "function" + } + ], +- "transactionHash": "0xbc755a0fb1b6966919cd926d8f497002a6538daaaac16ab117f41cdd5ef315d4", ++ "transactionHash": "0x27f6f0d240d12e2afefff21aa5858ae99ac70714c1166bc3cc969c979e055dc8", + "receipt": { + "to": null, +- "from": "0x18394B52d3Cb931dfA76F63251919D051953413d", +- "contractAddress": "0x22F24361D548e5FaAfb36d1437839f080363982B", +- "transactionIndex": 1, +- "gasUsed": "471232", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00", ++ "transactionIndex": 184, ++ "gasUsed": "462364", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xc9f08a4bde2710feb5ab785f464ca5cfc946580768d4a2aa0181223302b2f8bd", +- "transactionHash": "0xbc755a0fb1b6966919cd926d8f497002a6538daaaac16ab117f41cdd5ef315d4", ++ "blockHash": "0x075ed172ffb3a74210a1a1ececaac230d57d19f1ef194eeec4602b2ca5abc56b", ++ "transactionHash": "0x27f6f0d240d12e2afefff21aa5858ae99ac70714c1166bc3cc969c979e055dc8", + "logs": [], +- "blockNumber": 25502648, +- "cumulativeGasUsed": "588262", ++ "blockNumber": 13012048, ++ "cumulativeGasUsed": "12885400", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x18394B52d3Cb931dfA76F63251919D051953413d" ++ "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840" + ], +- "solcInputHash": "7531d7762a77038a37e7490a7b4b176f", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 constant internal IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 constant internal OWNER_KEY = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(\\n address _owner\\n ) {\\n _setOwner(_owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(\\n iL1ChugSplashDeployer.isUpgrading.selector\\n )\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(\\n ret == 0,\\n \\\"L1ChugSplashProxy: system is currently being upgraded\\\"\\n );\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(\\n bytes memory _code\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(\\n DEPLOY_CODE_PREFIX,\\n _code\\n );\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(\\n bytes32 _key,\\n bytes32 _value\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(\\n address _owner\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getImplementation();\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(\\n address _owner\\n )\\n internal\\n {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner()\\n internal\\n view \\n returns (\\n address\\n )\\n {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(\\n address _account\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall()\\n onlyWhenNotPaused\\n internal\\n {\\n address implementation = _getImplementation();\\n\\n require(\\n implementation != address(0),\\n \\\"L1ChugSplashProxy: implementation is not set yet\\\"\\n );\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n \\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x654af4f1d1aab76467c49fcce992eaf3522040ed806d656d98735c50ac235eeb\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading()\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xdab3ecb1ce03376523cd2f2ce5f991389c388829c56907987da01d99d3fc44c7\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516107983803806107988339818101604052602081101561003357600080fd5b505161003e81610044565b50610068565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b610721806100776000396000f3fe60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a26469706673582212202e20c1d0062b5a698d49624edce72a713b117e88f4cd70877869b53519c1d1f964736f6c63430007060033", +- "deployedBytecode": "0x60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a26469706673582212202e20c1d0062b5a698d49624edce72a713b117e88f4cd70877869b53519c1d1f964736f6c63430007060033", ++ "solcInputHash": "5da50938d6cae881cc2f74b183125883", ++ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 constant internal IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 constant internal OWNER_KEY = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(\\n address _owner\\n ) {\\n _setOwner(_owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(\\n iL1ChugSplashDeployer.isUpgrading.selector\\n )\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(\\n ret == 0,\\n \\\"L1ChugSplashProxy: system is currently being upgraded\\\"\\n );\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(\\n bytes memory _code\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(\\n DEPLOY_CODE_PREFIX,\\n _code\\n );\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(\\n bytes32 _key,\\n bytes32 _value\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(\\n address _owner\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getImplementation();\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(\\n address _owner\\n )\\n internal\\n {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner()\\n internal\\n view \\n returns (\\n address\\n )\\n {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(\\n address _account\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall()\\n onlyWhenNotPaused\\n internal\\n {\\n address implementation = _getImplementation();\\n\\n require(\\n implementation != address(0),\\n \\\"L1ChugSplashProxy: implementation is not set yet\\\"\\n );\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n \\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x654af4f1d1aab76467c49fcce992eaf3522040ed806d656d98735c50ac235eeb\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading()\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xdab3ecb1ce03376523cd2f2ce5f991389c388829c56907987da01d99d3fc44c7\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161076f38038061076f8339818101604052602081101561003357600080fd5b505161003e81610044565b50610068565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6106f8806100776000396000f3fe60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a164736f6c6343000706000a", ++ "deployedBytecode": "0x60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a164736f6c6343000706000a", + "devdoc": { + "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", + "kind": "dev", +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json +index 363133f..31c94d9 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json +@@ -1,5 +1,5 @@ + { +- "address": "0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1", ++ "address": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e", + "abi": [ + { + "inputs": [ +@@ -22,30 +22,30 @@ + "type": "fallback" + } + ], +- "transactionHash": "0x3061bc0332ef45e8809cee450c3c487eba2520084c71ff38da85459aee6b9a1d", ++ "transactionHash": "0x7b368a80e4d02a0f2b4634337d3dc000a1ff5b7715e9dd47118b96d3331904c9", + "receipt": { + "to": null, +- "from": "0x9996571372066A1545D3435C6935e3F9593A7eF5", +- "contractAddress": "0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1", +- "transactionIndex": 153, +- "gasUsed": "225024", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e", ++ "transactionIndex": 81, ++ "gasUsed": "216156", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xd4ac3db2a7b6711dabac13ef84b398e86c647e5a24f0ffdd3458b3c66ab6cef1", +- "transactionHash": "0x3061bc0332ef45e8809cee450c3c487eba2520084c71ff38da85459aee6b9a1d", ++ "blockHash": "0x1e044dc5c76b1f03739817443989e9374bd038e26075aca5f5e3691e2aad2cf2", ++ "transactionHash": "0x7b368a80e4d02a0f2b4634337d3dc000a1ff5b7715e9dd47118b96d3331904c9", + "logs": [], +- "blockNumber": 12686757, +- "cumulativeGasUsed": "11815865", ++ "blockNumber": 13011949, ++ "cumulativeGasUsed": "6706010", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + "OVM_L1CrossDomainMessenger" + ], +- "solcInputHash": "ef3f334bac4d7e77d91b457a0d89ab0a", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516104083803806104088339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b610224806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220d96dd78b72a44c11bfa8efb98d29ee53776a02c67052599da176325fcbf95b6464736f6c63430007060033", +- "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea2646970667358221220d96dd78b72a44c11bfa8efb98d29ee53776a02c67052599da176325fcbf95b6464736f6c63430007060033", ++ "solcInputHash": "1bef9702d702d51d122c68caa8d7c949", ++ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_implementationName\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_implementationName\":\"implementationName of the contract to proxy to.\",\"_libAddressManager\":\"Address of the Lib_AddressManager.\"}}},\"title\":\"Lib_ResolvedDelegateProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":\"Lib_ResolvedDelegateProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () internal {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x15e2d5bd4c28a88548074c54d220e8086f638a71ed07e6b3ba5a70066fcf458d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (bytes32 => address) private addresses;\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(\\n string memory _name,\\n address _address\\n )\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(\\n _name,\\n _address,\\n oldAddress\\n );\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(\\n string memory _name\\n )\\n external\\n view\\n returns (\\n address\\n )\\n {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(\\n string memory _name\\n )\\n internal\\n pure\\n returns (\\n bytes32\\n )\\n {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x636defb785a5c6650d101def6790d9104724cc7570e0d875138624d069eed257\",\"license\":\"MIT\"},\"contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_ResolvedDelegateProxy\\n */\\ncontract Lib_ResolvedDelegateProxy {\\n\\n /*************\\n * Variables *\\n *************/\\n\\n // Using mappings to store fields to avoid overwriting storage slots in the\\n // implementation contract. For example, instead of storing these fields at\\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\\n // NOTE: Do not use this code in your own contract system.\\n // There is a known flaw in this contract, and we will remove it from the repository\\n // in the near future. Due to the very limited way that we are using it, this flaw is\\n // not an issue in our system.\\n mapping (address => string) private implementationName;\\n mapping (address => Lib_AddressManager) private addressManager;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n * @param _implementationName implementationName of the contract to proxy to.\\n */\\n constructor(\\n address _libAddressManager,\\n string memory _implementationName\\n ) {\\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\\n implementationName[address(this)] = _implementationName;\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n address target = addressManager[address(this)].getAddress(\\n (implementationName[address(this)])\\n );\\n\\n require(\\n target != address(0),\\n \\\"Target address must be initialized.\\\"\\n );\\n\\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\\n\\n if (success == true) {\\n assembly {\\n return(add(returndata, 0x20), mload(returndata))\\n }\\n } else {\\n assembly {\\n revert(add(returndata, 0x20), mload(returndata))\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfaecb051b37f1d87d588cafb17a575723cbdf7c3c2079772110f33e747e05027\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b506040516103df3803806103df8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b5060409081523060009081526001602090815282822080546001600160a01b0319166001600160a01b038a16179055818152919020855161012c95509093509085019150610134565b5050506101d5565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261016a57600085556101b0565b82601f1061018357805160ff19168380011785556101b0565b828001600101855582156101b0579182015b828111156101b0578251825591602001919060010190610195565b506101bc9291506101c0565b5090565b5b808211156101bc57600081556001016101c1565b6101fb806101e46000396000f3fe60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", ++ "deployedBytecode": "0x60806040818152306000908152600160208181528383205483825293832063bf40fac160e01b909552608490815284546002610100938216159390930260001901169190910460a481905291936001600160a01b039093169263bf40fac192909190819060c490849080156100b55780601f1061008a576101008083540402835291602001916100b5565b820191906000526020600020905b81548152906001019060200180831161009857829003601f168201915b50509250505060206040518083038186803b1580156100d357600080fd5b505afa1580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b505190506001600160a01b0381166101465760405162461bcd60e51b81526004018080602001828103825260238152602001806101cc6023913960400191505060405180910390fd5b600080826001600160a01b03166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101a5576040519150601f19603f3d011682016040523d82523d6000602084013e6101aa565b606091505b509092509050600182151514156101c357805160208201f35b805160208201fdfe5461726765742061646472657373206d75737420626520696e697469616c697a65642ea164736f6c6343000706000a", + "devdoc": { + "kind": "dev", + "methods": { +@@ -67,7 +67,7 @@ + "storageLayout": { + "storage": [ + { +- "astId": 15340, ++ "astId": 15382, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "implementationName", + "offset": 0, +@@ -75,12 +75,12 @@ + "type": "t_mapping(t_address,t_string_storage)" + }, + { +- "astId": 15344, ++ "astId": 15386, + "contract": "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol:Lib_ResolvedDelegateProxy", + "label": "addressManager", + "offset": 0, + "slot": "1", +- "type": "t_mapping(t_address,t_contract(Lib_AddressManager)15296)" ++ "type": "t_mapping(t_address,t_contract(Lib_AddressManager)15338)" + } + ], + "types": { +@@ -89,17 +89,17 @@ + "label": "address", + "numberOfBytes": "20" + }, +- "t_contract(Lib_AddressManager)15296": { ++ "t_contract(Lib_AddressManager)15338": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" + }, +- "t_mapping(t_address,t_contract(Lib_AddressManager)15296)": { ++ "t_mapping(t_address,t_contract(Lib_AddressManager)15338)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => contract Lib_AddressManager)", + "numberOfBytes": "32", +- "value": "t_contract(Lib_AddressManager)15296" ++ "value": "t_contract(Lib_AddressManager)15338" + }, + "t_mapping(t_address,t_string_storage)": { + "encoding": "mapping", +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1StandardBridge.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1StandardBridge.json +index 4e1fbf8..8737beb 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1StandardBridge.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/Proxy__OVM_L1StandardBridge.json +@@ -1,5 +1,5 @@ + { +- "address": "0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1", ++ "address": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00", + "abi": [ + { + "inputs": [ +@@ -87,29 +87,29 @@ + "type": "function" + } + ], +- "transactionHash": "0x3fb736def76e27e507bc4e451e5498f1f1beee3e82e6aa67ecef434c638a04ac", ++ "transactionHash": "0x27f6f0d240d12e2afefff21aa5858ae99ac70714c1166bc3cc969c979e055dc8", + "receipt": { + "to": null, +- "from": "0x9996571372066A1545D3435C6935e3F9593A7eF5", +- "contractAddress": "0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1", +- "transactionIndex": 70, +- "gasUsed": "471232", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00", ++ "transactionIndex": 184, ++ "gasUsed": "462364", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0xb6578d9e60cce4713437b5cf0898dd7040c9284e178aadfb7dfbb590f4f083af", +- "transactionHash": "0x3fb736def76e27e507bc4e451e5498f1f1beee3e82e6aa67ecef434c638a04ac", ++ "blockHash": "0x075ed172ffb3a74210a1a1ececaac230d57d19f1ef194eeec4602b2ca5abc56b", ++ "transactionHash": "0x27f6f0d240d12e2afefff21aa5858ae99ac70714c1166bc3cc969c979e055dc8", + "logs": [], +- "blockNumber": 12686786, +- "cumulativeGasUsed": "6551653", ++ "blockNumber": 13012048, ++ "cumulativeGasUsed": "12885400", + "status": 1, + "byzantium": true + }, + "args": [ +- "0x9996571372066A1545D3435C6935e3F9593A7eF5" ++ "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840" + ], +- "solcInputHash": "7531d7762a77038a37e7490a7b4b176f", +- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 constant internal IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 constant internal OWNER_KEY = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(\\n address _owner\\n ) {\\n _setOwner(_owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(\\n iL1ChugSplashDeployer.isUpgrading.selector\\n )\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(\\n ret == 0,\\n \\\"L1ChugSplashProxy: system is currently being upgraded\\\"\\n );\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(\\n bytes memory _code\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(\\n DEPLOY_CODE_PREFIX,\\n _code\\n );\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(\\n bytes32 _key,\\n bytes32 _value\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(\\n address _owner\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getImplementation();\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(\\n address _owner\\n )\\n internal\\n {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner()\\n internal\\n view \\n returns (\\n address\\n )\\n {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(\\n address _account\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall()\\n onlyWhenNotPaused\\n internal\\n {\\n address implementation = _getImplementation();\\n\\n require(\\n implementation != address(0),\\n \\\"L1ChugSplashProxy: implementation is not set yet\\\"\\n );\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n \\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x654af4f1d1aab76467c49fcce992eaf3522040ed806d656d98735c50ac235eeb\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading()\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xdab3ecb1ce03376523cd2f2ce5f991389c388829c56907987da01d99d3fc44c7\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516107983803806107988339818101604052602081101561003357600080fd5b505161003e81610044565b50610068565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b610721806100776000396000f3fe60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a26469706673582212202e20c1d0062b5a698d49624edce72a713b117e88f4cd70877869b53519c1d1f964736f6c63430007060033", +- "deployedBytecode": "0x60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a26469706673582212202e20c1d0062b5a698d49624edce72a713b117e88f4cd70877869b53519c1d1f964736f6c63430007060033", ++ "solcInputHash": "5da50938d6cae881cc2f74b183125883", ++ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"title\":\"L1ChugSplashProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy. Note that this scheme is a bit different from the standard proxy scheme where one would typically deploy the code separately and then set the implementation address. We're doing it this way because it gives us a lot more freedom on the client side. Can only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to perform upgrades in a more transparent way. Only callable by the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 constant internal DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 constant internal IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 constant internal OWNER_KEY = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n \\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(\\n address _owner\\n ) {\\n _setOwner(_owner);\\n }\\n\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(\\n iL1ChugSplashDeployer.isUpgrading.selector\\n )\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(\\n ret == 0,\\n \\\"L1ChugSplashProxy: system is currently being upgraded\\\"\\n );\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n fallback()\\n external\\n payable\\n {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n function setCode(\\n bytes memory _code\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(\\n DEPLOY_CODE_PREFIX,\\n _code\\n );\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n function setStorage(\\n bytes32 _key,\\n bytes32 _value\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n function setOwner(\\n address _owner\\n )\\n proxyCallIfNotOwner\\n public\\n {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n function getOwner()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n function getImplementation()\\n proxyCallIfNotOwner\\n public\\n returns (\\n address\\n )\\n {\\n return _getImplementation();\\n }\\n\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(\\n address _implementation\\n )\\n internal\\n {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation()\\n internal\\n view\\n returns (\\n address\\n )\\n {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(\\n address _owner\\n )\\n internal\\n {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner()\\n internal\\n view \\n returns (\\n address\\n )\\n {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(\\n address _account\\n )\\n internal\\n view\\n returns (\\n bytes32\\n )\\n {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall()\\n onlyWhenNotPaused\\n internal\\n {\\n address implementation = _getImplementation();\\n\\n require(\\n implementation != address(0),\\n \\\"L1ChugSplashProxy: implementation is not set yet\\\"\\n );\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n \\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x654af4f1d1aab76467c49fcce992eaf3522040ed806d656d98735c50ac235eeb\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.8.0;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading()\\n external\\n view\\n returns (\\n bool\\n );\\n}\\n\",\"keccak256\":\"0xdab3ecb1ce03376523cd2f2ce5f991389c388829c56907987da01d99d3fc44c7\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161076f38038061076f8339818101604052602081101561003357600080fd5b505161003e81610044565b50610068565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6106f8806100776000396000f3fe60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a164736f6c6343000706000a", ++ "deployedBytecode": "0x60806040526004361061004a5760003560e01c806313af4035146100545780636c5d4ad014610087578063893d20e81461013a5780639b0b0fda1461016b578063aaf10f421461019b575b6100526101b0565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661036c565b34801561009357600080fd5b50610052600480360360208110156100aa57600080fd5b8101906020810181356401000000008111156100c557600080fd5b8201836020820111156100d757600080fd5b803590602001918460018302840111640100000000831117156100f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103af945050505050565b34801561014657600080fd5b5061014f610505565b604080516001600160a01b039092168252519081900360200190f35b34801561017757600080fd5b506100526004803603604081101561018e57600080fd5b508035906020013561054b565b3480156101a757600080fd5b5061014f610589565b60006101ba6105bd565b60408051600481526024810182526020810180516001600160e01b0316635bca393160e11b1781529151815193945060009384936001600160a01b0387169392918291908083835b602083106102215780518252601f199092019160209182019101610202565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5091509150818015610299575080516020145b156102f85760008180602001905160208110156102b557600080fd5b5051905080156102f65760405162461bcd60e51b81526004018080602001828103825260358152602001806106b76035913960400191505060405180910390fd5b505b60006103026105e2565b90506001600160a01b0381166103495760405162461bcd60e51b81526004018080602001828103825260308152602001806106546030913960400191505060405180910390fd5b3660008037600080366000845af43d6000803e80610366573d6000fd5b503d6000f35b6103746105bd565b6001600160a01b0316336001600160a01b03161480610391575033155b156103a45761039f81610607565b6103ac565b6103ac6101b0565b50565b6103b76105bd565b6001600160a01b0316336001600160a01b031614806103d4575033155b156103a45760006103e36105e2565b90506103ee8161062b565b825160208401201415610401575061039f565b60006c600d380380600d6000396000f360981b83604051602001808372ffffffffffffffffffffffffffffffffffffff19168152600d0182805190602001908083835b602083106104635780518252601f199092019160209182019101610444565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905060008151602083016000f0905083805190602001206104b88261062b565b146104f45760405162461bcd60e51b81526004018080602001828103825260338152602001806106846033913960400191505060405180910390fd5b6104fd8161062f565b5050506103ac565b600061050f6105bd565b6001600160a01b0316336001600160a01b0316148061052c575033155b15610540576105396105bd565b9050610548565b6105486101b0565b90565b6105536105bd565b6001600160a01b0316336001600160a01b03161480610570575033155b1561057d57808255610585565b6105856101b0565b5050565b60006105936105bd565b6001600160a01b0316336001600160a01b031614806105b0575033155b15610540576105396105e2565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3f90565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe4c314368756753706c61736850726f78793a20696d706c656d656e746174696f6e206973206e6f7420736574207965744c314368756753706c61736850726f78793a20636f646520776173206e6f7420636f72726563746c79206465706c6f7965642e4c314368756753706c61736850726f78793a2073797374656d2069732063757272656e746c79206265696e67207570677261646564a164736f6c6343000706000a", + "devdoc": { + "details": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty! Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!", + "kind": "dev", +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/README.md b/node_modules/@eth-optimism/contracts/deployments/mainnet/README.md +new file mode 100644 +index 0000000..3c1f495 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/README.md +@@ -0,0 +1,313 @@ ++# Boba (public mainnet) ++## Network Info ++- **Chain ID**: 288 ++- **Public RPC**: https://mainnet.boba.network ++- **Block Explorer**: https://blockexplorer.boba.network ++## Layer 1 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++BondManager ++ ++ ++0x60660e6CDEb423cf847dD11De4C473130D65b627 ++ ++
++CanonicalTransactionChain ++ ++ ++0xfBd2541e316948B259264c02f370eD088E04c3Db ++ ++
++ChainStorageContainer-CTC-batches ++ ++ ++0x17148284d2da2f38c96346f1776C1BF7D7691231 ++ ++
++ChainStorageContainer-CTC-queue ++ ++ ++0x5f003030884B3a105809a0Eb0C0C28Ac40ECCD8d ++ ++
++ChainStorageContainer-SCC-batches ++ ++ ++0x13992B9f327faCA11568BE18a8ad3E9747e87d93 ++ ++
++L1MultiMessageRelayer ++ ++ ++0x5fD2CF99586B9D92f56CbaD0A3Ea4DF256A0070B ++ ++
++Lib_AddressManager ++ ++ ++0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089 ++ ++
++Proxy__L1CrossDomainMessenger ++ ++ ++0x6D4528d192dB72E282265D6092F4B872f9Dff69e ++ ++
++Proxy__L1StandardBridge ++ ++ ++0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00 ++ ++
++Proxy__OVM_L1CrossDomainMessenger ++ ++ ++0x6D4528d192dB72E282265D6092F4B872f9Dff69e ++ ++
++Proxy__OVM_L1StandardBridge ++ ++ ++0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00 ++ ++
++StateCommitmentChain ++ ++ ++0xdE7355C971A5B733fe2133753Abd7e5441d441Ec ++ ++
++ ++## Layer 2 Contracts ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++

Contract

++
++ ++

Address

++
++OVM_L2ToL1MessagePasser ++ ++ ++0x4200000000000000000000000000000000000000 ++ ++
++OVM_DeployerWhitelist ++ ++ ++0x4200000000000000000000000000000000000002 ++ ++
++L2CrossDomainMessenger ++ ++ ++0x4200000000000000000000000000000000000007 ++ ++
++OVM_GasPriceOracle ++ ++ ++0x420000000000000000000000000000000000000F ++ ++
++L2StandardBridge ++ ++ ++0x4200000000000000000000000000000000000010 ++ ++
++OVM_SequencerFeeVault ++ ++ ++0x4200000000000000000000000000000000000011 ++ ++
++L2StandardTokenFactory ++ ++ ++0x4200000000000000000000000000000000000012 ++ ++
++OVM_L1BlockNumber ++ ++ ++0x4200000000000000000000000000000000000013 ++ ++
++OVM_ETH ++ ++ ++0x4200000000000000000000000000000000000006 ++ ++
++WETH9 ++ ++ ++0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000 ++ ++
++Proxy__BobaTuringCredit ++ ++ ++0xF8D2f1b0292C0Eeef80D8F47661A9DaCDB4b23bf ++ ++
++BobaTuringCredit ++ ++ ++0xd8E006702bdCbE2582dF13f900bCF750129bB449 ++ ++
++Proxy__Boba_GasPriceOracle ++ ++ ++0xeE06ee2F239d2ab11792D77f3C347d919ddA0d51 ++ ++
++Boba_GasPriceOracle ++ ++ ++0x5d0763cf905DA3689B072FD19baD8dF823b2c349 ++ ++
++Proxy__BobaBillingContract ++ ++ ++0x29F373e4869e69faaeCD3bF747dd1d965328b69f ++ ++
++BobaBillingContract ++ ++ ++0x4a792F51CCc616b82EF74d2478C732e161c5E6b1 ++ ++
++ +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/StateCommitmentChain.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/StateCommitmentChain.json +index 1a76af5..b89c2fd 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/StateCommitmentChain.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/StateCommitmentChain.json +@@ -1,5 +1,5 @@ + { +- "address": "0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19", ++ "address": "0xdE7355C971A5B733fe2133753Abd7e5441d441Ec", + "abi": [ + { + "inputs": [ +@@ -361,31 +361,31 @@ + "type": "function" + } + ], +- "transactionHash": "0x4dba5202f7e5774b61fa7a1180775c89fe3b7240b2f6261c5c3a8086a430aef9", ++ "transactionHash": "0xbf8ea0b1d87111aba81c05b5a226f3bd77a6f96a11f0dbbde5361d8981560052", + "receipt": { + "to": null, +- "from": "0x0bb2cA5Ea700ba04c713008E1a3D198B4e8dA7a7", +- "contractAddress": "0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19", +- "transactionIndex": 10, +- "gasUsed": "1888197", ++ "from": "0x1f2414D0af8741Bc822dBc2f88069c2b2907a840", ++ "contractAddress": "0xdE7355C971A5B733fe2133753Abd7e5441d441Ec", ++ "transactionIndex": 363, ++ "gasUsed": "1879322", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +- "blockHash": "0x2cc41cdcc861d412da1cdb207ffbf16379ffc7be8dd8db6f04fd8016b23e6482", +- "transactionHash": "0x4dba5202f7e5774b61fa7a1180775c89fe3b7240b2f6261c5c3a8086a430aef9", ++ "blockHash": "0x66f7566bc0e85cdf8fe0f0568c2f1b83ce8a1058affd55d22f1e5554a60981bd", ++ "transactionHash": "0xbf8ea0b1d87111aba81c05b5a226f3bd77a6f96a11f0dbbde5361d8981560052", + "logs": [], +- "blockNumber": 13596474, +- "cumulativeGasUsed": "2943868", ++ "blockNumber": 13502908, ++ "cumulativeGasUsed": "28374187", + "status": 1, + "byzantium": true + }, + "args": [ +- "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", ++ "0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089", + 604800, +- 12592000 ++ 1800 + ], +- "solcInputHash": "e2f1121f17d06f85851dd0c837a00344", +- "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0xa534e90efd57e3c36053cb4aabba63ef8f53e35e3a4ce3d0f127ec2d0af1f618\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n}\\n\",\"keccak256\":\"0xe55ad72572ec47dc09a02228d0c5a438571c76a41d16d92b35add057811977ce\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external\\n view\\n returns (bool _inside);\\n}\\n\",\"keccak256\":\"0x47253e63bc34a006102374c39c052470b977e1eb63dacc953e2cbff19940de69\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n \\\"Actual batch start index does not match expected start index.\\\"\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve(\\\"BondManager\\\")).isCollateralized(msg.sender),\\n \\\"Proposer does not have enough collateral posted\\\"\\n );\\n\\n require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).getTotalElements(),\\n \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\n require(\\n msg.sender == resolve(\\\"OVM_FraudVerifier\\\"),\\n \\\"State batches can only be deleted by the OVM_FraudVerifier.\\\"\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n \\\"State batches can only be deleted within the fraud proof window.\\\"\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n \\\"Invalid inclusion proof.\\\"\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n view\\n returns (bool _inside)\\n {\\n (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n internal\\n pure\\n returns (bytes27)\\n {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData) internal {\\n address sequencer = resolve(\\\"OVM_Proposer\\\");\\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) internal {\\n require(_batchHeader.batchIndex < batches().length(), \\\"Invalid batch index.\\\");\\n\\n require(_isValidBatchHeader(_batchHeader), \\\"Invalid batch header.\\\");\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n view\\n returns (bool)\\n {\\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0xb882d49591f7d5aa074115926a145e80ea04bf002f79a6b11d826aba8ff97286\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4ae2dc7bf175626d2930299e73d50a7ba936171d07810497ef71fa38a4e246a7\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({ length: _in.length, ptr: ptr });\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n );\\n\\n out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in) internal pure returns (string memory) {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_start + _length >= _start, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n if (_start >= _bytes.length) {\\n return bytes(\\\"\\\");\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}", +- "bytecode": "0x608060405234801561001057600080fd5b506040516120bb3803806120bb83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b61200e806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220b90af2e50ed0ae8720c8f74ce116bfe826a8d329baa23dec8c3f69958740528964736f6c63430008090033", +- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220b90af2e50ed0ae8720c8f74ce116bfe826a8d329baa23dec8c3f69958740528964736f6c63430008090033", ++ "solcInputHash": "f009f67f4ef4065b744742a642e24755", ++ "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/* Interface Imports */\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n /**********\\n * Events *\\n **********/\\n\\n event L2GasParamsUpdated(\\n uint256 l2GasDiscountDivisor,\\n uint256 enqueueGasCost,\\n uint256 enqueueL2GasPrepaid\\n );\\n\\n event TransactionEnqueued(\\n address indexed _l1TxOrigin,\\n address indexed _target,\\n uint256 _gasLimit,\\n bytes _data,\\n uint256 indexed _queueIndex,\\n uint256 _timestamp\\n );\\n\\n event QueueBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event SequencerBatchAppended(\\n uint256 _startingQueueIndex,\\n uint256 _numQueueElements,\\n uint256 _totalElements\\n );\\n\\n event TransactionBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct BatchContext {\\n uint256 numSequencedTransactions;\\n uint256 numSubsequentQueueTransactions;\\n uint256 timestamp;\\n uint256 blockNumber;\\n }\\n\\n /*******************************\\n * Authorized Setter Functions *\\n *******************************/\\n\\n /**\\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n * The value of enqueueL2GasPrepaid is immediately updated as well.\\n */\\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\\n external;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() external view returns (IChainStorageContainer);\\n\\n /**\\n * Accesses the queue storage container.\\n * @return Reference to the queue storage container.\\n */\\n function queue() external view returns (IChainStorageContainer);\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Returns the index of the next element to be enqueued.\\n * @return Index for the next queue element.\\n */\\n function getNextQueueIndex() external view returns (uint40);\\n\\n /**\\n * Gets the queue element at a particular index.\\n * @param _index Index of the queue element to access.\\n * @return _element Queue element at the given index.\\n */\\n function getQueueElement(uint256 _index)\\n external\\n view\\n returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n /**\\n * Returns the timestamp of the last transaction.\\n * @return Timestamp for the last transaction.\\n */\\n function getLastTimestamp() external view returns (uint40);\\n\\n /**\\n * Returns the blocknumber of the last transaction.\\n * @return Blocknumber for the last transaction.\\n */\\n function getLastBlockNumber() external view returns (uint40);\\n\\n /**\\n * Get the number of queue elements which have not yet been included.\\n * @return Number of pending queue elements.\\n */\\n function getNumPendingQueueElements() external view returns (uint40);\\n\\n /**\\n * Retrieves the length of the queue, including\\n * both pending and canonical transactions.\\n * @return Length of the queue.\\n */\\n function getQueueLength() external view returns (uint40);\\n\\n /**\\n * Adds a transaction to the queue.\\n * @param _target Target contract to send the transaction to.\\n * @param _gasLimit Gas limit for the given transaction.\\n * @param _data Transaction data.\\n */\\n function enqueue(\\n address _target,\\n uint256 _gasLimit,\\n bytes memory _data\\n ) external;\\n\\n /**\\n * Allows the sequencer to append a batch of transactions.\\n * @dev This function uses a custom encoding scheme for efficiency reasons.\\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n * .param _contexts Array of batch contexts.\\n * .param _transactionDataFields Array of raw transaction data.\\n */\\n function appendSequencerBatch(\\n // uint40 _shouldStartAtElement,\\n // uint24 _totalElementsToAppend,\\n // BatchContext[] _contexts,\\n // bytes[] _transactionDataFields\\n ) external;\\n}\\n\",\"keccak256\":\"0x2cefcaffb2545843360e10af8ec99ef503662d8bcbd18a256969abb24cbbf471\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n * 27 bytes to store arbitrary data.\\n * @param _globalMetadata New global metadata to set.\\n */\\n function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves the container's global metadata field.\\n * @return Container global metadata field.\\n */\\n function getGlobalMetadata() external view returns (bytes27);\\n\\n /**\\n * Retrieves the number of objects stored in the container.\\n * @return Number of objects in the container.\\n */\\n function length() external view returns (uint256);\\n\\n /**\\n * Pushes an object into the container.\\n * @param _object A 32 byte value to insert into the container.\\n */\\n function push(bytes32 _object) external;\\n\\n /**\\n * Pushes an object into the container. Function allows setting the global metadata since\\n * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n * metadata (it's an optimization).\\n * @param _object A 32 byte value to insert into the container.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n /**\\n * Retrieves an object from the container.\\n * @param _index Index of the particular object to access.\\n * @return 32 byte object value.\\n */\\n function get(uint256 _index) external view returns (bytes32);\\n\\n /**\\n * Removes all objects after and including a given index.\\n * @param _index Object index to delete from.\\n */\\n function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n /**\\n * Removes all objects after and including a given index. Also allows setting the global\\n * metadata field.\\n * @param _index Object index to delete from.\\n * @param _globalMetadata New global metadata for the container.\\n */\\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\\n external;\\n}\\n\",\"keccak256\":\"0x1247cfe7767d684076c017b3a20d41f6e85bb7ebb92aede4eb8d0ec226fb0a60\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n /**********\\n * Events *\\n **********/\\n\\n event StateBatchAppended(\\n uint256 indexed _batchIndex,\\n bytes32 _batchRoot,\\n uint256 _batchSize,\\n uint256 _prevTotalElements,\\n bytes _extraData\\n );\\n\\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Retrieves the total number of elements submitted.\\n * @return _totalElements Total submitted elements.\\n */\\n function getTotalElements() external view returns (uint256 _totalElements);\\n\\n /**\\n * Retrieves the total number of batches submitted.\\n * @return _totalBatches Total submitted batches.\\n */\\n function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n /**\\n * Retrieves the timestamp of the last batch submitted by the sequencer.\\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n */\\n function getLastSequencerTimestamp()\\n external\\n view\\n returns (uint256 _lastSequencerTimestamp);\\n\\n /**\\n * Appends a batch of state roots to the chain.\\n * @param _batch Batch of state roots.\\n * @param _shouldStartAtElement Index of the element at which this batch should start.\\n */\\n function appendStateBatch(\\n bytes32[] calldata _batch,\\n uint256 _shouldStartAtElement\\n ) external;\\n\\n /**\\n * Deletes all state roots after (and including) a given batch.\\n * @param _batchHeader Header of the batch to start deleting from.\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n external;\\n\\n /**\\n * Verifies a batch inclusion proof.\\n * @param _element Hash of the element to verify a proof for.\\n * @param _batchHeader Header of the batch in which the element was included.\\n * @param _proof Merkle inclusion proof for the element.\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) external view returns (bool _verified);\\n\\n /**\\n * Checks whether a given batch is still inside its fraud proof window.\\n * @param _batchHeader Header of the batch to check.\\n * @return _inside Whether or not the batch is inside the fraud proof window.\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n ) external view returns (bool _inside);\\n}\\n\",\"keccak256\":\"0xb8da3deeaf8eceee6ff92ee7952a341b14a0d267adf8374987c48368908f0b50\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\\nimport {Lib_MerkleTree} from '../../libraries/utils/Lib_MerkleTree.sol';\\n\\n/* Interface Imports */\\nimport {IStateCommitmentChain} from './IStateCommitmentChain.sol';\\nimport {ICanonicalTransactionChain} from './ICanonicalTransactionChain.sol';\\nimport {IBondManager} from '../verification/IBondManager.sol';\\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 public FRAUD_PROOF_WINDOW;\\n uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Address Manager.\\n */\\n constructor(\\n address _libAddressManager,\\n uint256 _fraudProofWindow,\\n uint256 _sequencerPublishWindow\\n ) Lib_AddressResolver(_libAddressManager) {\\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Accesses the batch storage container.\\n * @return Reference to the batch storage container.\\n */\\n function batches() public view returns (IChainStorageContainer) {\\n return IChainStorageContainer(resolve('ChainStorageContainer-SCC-batches'));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalElements() public view returns (uint256 _totalElements) {\\n (uint40 totalElements, ) = _getBatchExtraData();\\n return uint256(totalElements);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getTotalBatches() public view returns (uint256 _totalBatches) {\\n return batches().length();\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function getLastSequencerTimestamp()\\n public\\n view\\n returns (uint256 _lastSequencerTimestamp)\\n {\\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\\n return uint256(lastSequencerTimestamp);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function appendStateBatch(\\n bytes32[] memory _batch,\\n uint256 _shouldStartAtElement\\n ) public {\\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n // publication of batches by some other user.\\n require(\\n _shouldStartAtElement == getTotalElements(),\\n 'Actual batch start index does not match expected start index.'\\n );\\n\\n // Proposers must have previously staked at the BondManager\\n require(\\n IBondManager(resolve('BondManager')).isCollateralized(msg.sender),\\n 'Proposer does not have enough collateral posted'\\n );\\n\\n require(_batch.length > 0, 'Cannot submit an empty state batch.');\\n\\n require(\\n getTotalElements() + _batch.length <=\\n ICanonicalTransactionChain(resolve('CanonicalTransactionChain'))\\n .getTotalElements(),\\n 'Number of state roots cannot exceed the number of canonical transactions.'\\n );\\n\\n // Pass the block's timestamp and the publisher of the data\\n // to be used in the fraud proofs\\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n public\\n {\\n require(\\n msg.sender == resolve('OVM_FraudVerifier'),\\n 'State batches can only be deleted by the OVM_FraudVerifier.'\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\\n\\n require(\\n insideFraudProofWindow(_batchHeader),\\n 'State batches can only be deleted within the fraud proof window.'\\n );\\n\\n _deleteBatch(_batchHeader);\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function verifyStateCommitment(\\n bytes32 _element,\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n Lib_OVMCodec.ChainInclusionProof memory _proof\\n ) public view returns (bool) {\\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\\n\\n require(\\n Lib_MerkleTree.verify(\\n _batchHeader.batchRoot,\\n _element,\\n _proof.index,\\n _proof.siblings,\\n _batchHeader.batchSize\\n ),\\n 'Invalid inclusion proof.'\\n );\\n\\n return true;\\n }\\n\\n /**\\n * @inheritdoc IStateCommitmentChain\\n */\\n function insideFraudProofWindow(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n ) public view returns (bool _inside) {\\n (uint256 timestamp, ) = abi.decode(\\n _batchHeader.extraData,\\n (uint256, address)\\n );\\n\\n require(timestamp != 0, 'Batch header timestamp cannot be zero');\\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Parses the batch context from the extra data.\\n * @return Total number of elements submitted.\\n * @return Timestamp of the last batch submitted by the sequencer.\\n */\\n function _getBatchExtraData() internal view returns (uint40, uint40) {\\n bytes27 extraData = batches().getGlobalMetadata();\\n\\n // solhint-disable max-line-length\\n uint40 totalElements;\\n uint40 lastSequencerTimestamp;\\n assembly {\\n extraData := shr(40, extraData)\\n totalElements := and(\\n extraData,\\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n )\\n lastSequencerTimestamp := shr(\\n 40,\\n and(\\n extraData,\\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\\n )\\n )\\n }\\n // solhint-enable max-line-length\\n\\n return (totalElements, lastSequencerTimestamp);\\n }\\n\\n /**\\n * Encodes the batch context for the extra data.\\n * @param _totalElements Total number of elements submitted.\\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n * @return Encoded batch context.\\n */\\n function _makeBatchExtraData(\\n uint40 _totalElements,\\n uint40 _lastSequencerTimestamp\\n ) internal pure returns (bytes27) {\\n bytes27 extraData;\\n assembly {\\n extraData := _totalElements\\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n extraData := shl(40, extraData)\\n }\\n\\n return extraData;\\n }\\n\\n /**\\n * Appends a batch to the chain.\\n * @param _batch Elements within the batch.\\n * @param _extraData Any extra data to append to the batch.\\n */\\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData)\\n internal\\n {\\n address sequencer = resolve('OVM_Proposer');\\n (\\n uint40 totalElements,\\n uint40 lastSequencerTimestamp\\n ) = _getBatchExtraData();\\n\\n if (msg.sender == sequencer) {\\n lastSequencerTimestamp = uint40(block.timestamp);\\n } else {\\n // We keep track of the last batch submitted by the sequencer so there's a window in\\n // which only the sequencer can publish state roots. A window like this just reduces\\n // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n // testing mode. This window should be removed or significantly reduced in the future.\\n require(\\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n 'Cannot publish state roots within the sequencer publication window.'\\n );\\n }\\n\\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n // while calculating the root hash therefore any arguments passed to it must not\\n // be used again afterwards\\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec\\n .ChainBatchHeader({\\n batchIndex: getTotalBatches(),\\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n batchSize: _batch.length,\\n prevTotalElements: totalElements,\\n extraData: _extraData\\n });\\n\\n emit StateBatchAppended(\\n batchHeader.batchIndex,\\n batchHeader.batchRoot,\\n batchHeader.batchSize,\\n batchHeader.prevTotalElements,\\n batchHeader.extraData\\n );\\n\\n batches().push(\\n Lib_OVMCodec.hashBatchHeader(batchHeader),\\n _makeBatchExtraData(\\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n lastSequencerTimestamp\\n )\\n );\\n }\\n\\n /**\\n * Removes a batch and all subsequent batches from the chain.\\n * @param _batchHeader Header of the batch to remove.\\n */\\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n {\\n require(\\n _batchHeader.batchIndex < batches().length(),\\n 'Invalid batch index.'\\n );\\n\\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\\n\\n batches().deleteElementsAfterInclusive(\\n _batchHeader.batchIndex,\\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\\n );\\n\\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\\n }\\n\\n /**\\n * Checks that a batch header matches the stored hash for the given index.\\n * @param _batchHeader Batch header to validate.\\n * @return Whether or not the header matches the stored one.\\n */\\n function _isValidBatchHeader(\\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n ) internal view returns (bool) {\\n return\\n Lib_OVMCodec.hashBatchHeader(_batchHeader) ==\\n batches().get(_batchHeader.batchIndex);\\n }\\n}\\n\",\"keccak256\":\"0x30fb3c887edbd9c9ad1230ab8ce8b46a22d75d3c9fdcc71f86c3b9e55175ce86\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function isCollateralized(address _who) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x118d0be6479a4c5d472efead352a6d17ff27982bcfeeda27a31ad3169962576c\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\\nimport {Lib_Bytes32Utils} from '../utils/Lib_Bytes32Utils.sol';\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n /*********\\n * Enums *\\n *********/\\n\\n enum QueueOrigin {\\n SEQUENCER_QUEUE,\\n L1TOL2_QUEUE\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct EVMAccount {\\n uint256 nonce;\\n uint256 balance;\\n bytes32 storageRoot;\\n bytes32 codeHash;\\n }\\n\\n struct ChainBatchHeader {\\n uint256 batchIndex;\\n bytes32 batchRoot;\\n uint256 batchSize;\\n uint256 prevTotalElements;\\n bytes extraData;\\n }\\n\\n struct ChainInclusionProof {\\n uint256 index;\\n bytes32[] siblings;\\n }\\n\\n struct Transaction {\\n uint256 timestamp;\\n uint256 blockNumber;\\n QueueOrigin l1QueueOrigin;\\n address l1TxOrigin;\\n address entrypoint;\\n uint256 gasLimit;\\n bytes data;\\n }\\n\\n struct TransactionChainElement {\\n bool isSequenced;\\n uint256 queueIndex; // QUEUED TX ONLY\\n uint256 timestamp; // SEQUENCER TX ONLY\\n uint256 blockNumber; // SEQUENCER TX ONLY\\n bytes txData; // SEQUENCER TX ONLY\\n }\\n\\n struct QueueElement {\\n bytes32 transactionHash;\\n uint40 timestamp;\\n uint40 blockNumber;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Encodes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Encoded transaction bytes.\\n */\\n function encodeTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodePacked(\\n _transaction.timestamp,\\n _transaction.blockNumber,\\n _transaction.l1QueueOrigin,\\n _transaction.l1TxOrigin,\\n _transaction.entrypoint,\\n _transaction.gasLimit,\\n _transaction.data\\n );\\n }\\n\\n /**\\n * Hashes a standard OVM transaction.\\n * @param _transaction OVM transaction to encode.\\n * @return Hashed transaction\\n */\\n function hashTransaction(Transaction memory _transaction)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return keccak256(encodeTransaction(_transaction));\\n }\\n\\n /**\\n * @notice Decodes an RLP-encoded account state into a useful struct.\\n * @param _encoded RLP-encoded account state.\\n * @return Account state struct.\\n */\\n function decodeEVMAccount(bytes memory _encoded)\\n internal\\n pure\\n returns (EVMAccount memory)\\n {\\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(\\n _encoded\\n );\\n\\n return\\n EVMAccount({\\n nonce: Lib_RLPReader.readUint256(accountState[0]),\\n balance: Lib_RLPReader.readUint256(accountState[1]),\\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n });\\n }\\n\\n /**\\n * Calculates a hash for a given batch header.\\n * @param _batchHeader Header to hash.\\n * @return Hash of the header.\\n */\\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n internal\\n pure\\n returns (bytes32)\\n {\\n return\\n keccak256(\\n abi.encode(\\n _batchHeader.batchRoot,\\n _batchHeader.batchSize,\\n _batchHeader.prevTotalElements,\\n _batchHeader.extraData\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x984f547b018437d8624ae21bff0bd42c37f14576853a6c561313233ff3eacdb3\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(\\n string indexed _name,\\n address _newAddress,\\n address _oldAddress\\n );\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address)\\n external\\n onlyOwner\\n {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0x02fca207454bcf2d2d68cf0204058db97f032262753428dadaad9d1d54fe0793\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n /*************\\n * Variables *\\n *************/\\n\\n Lib_AddressManager public libAddressManager;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _libAddressManager Address of the Lib_AddressManager.\\n */\\n constructor(address _libAddressManager) {\\n libAddressManager = Lib_AddressManager(_libAddressManager);\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Resolves the address associated with a given name.\\n * @param _name Name to resolve an address for.\\n * @return Address associated with the given name.\\n */\\n function resolve(string memory _name) public view returns (address) {\\n return libAddressManager.getAddress(_name);\\n }\\n}\\n\",\"keccak256\":\"0x7748077478d84755a813edddd118c6bf7bf5f7a22618d1e275bbc41ba0b43137\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n /*************\\n * Constants *\\n *************/\\n\\n uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n /*********\\n * Enums *\\n *********/\\n\\n enum RLPItemType {\\n DATA_ITEM,\\n LIST_ITEM\\n }\\n\\n /***********\\n * Structs *\\n ***********/\\n\\n struct RLPItem {\\n uint256 length;\\n uint256 ptr;\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts bytes to a reference to memory position and length.\\n * @param _in Input bytes to convert.\\n * @return Output memory reference.\\n */\\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n uint256 ptr;\\n assembly {\\n ptr := add(_in, 32)\\n }\\n\\n return RLPItem({length: _in.length, ptr: ptr});\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(RLPItem memory _in)\\n internal\\n pure\\n returns (RLPItem[] memory)\\n {\\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.LIST_ITEM, 'Invalid RLP list value.');\\n\\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n // writing to the length. Since we can't know the number of RLP items without looping over\\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n // simply set a reasonable maximum list length and decrease the size before we finish.\\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n uint256 itemCount = 0;\\n uint256 offset = listOffset;\\n while (offset < _in.length) {\\n require(\\n itemCount < MAX_LIST_LENGTH,\\n 'Provided RLP list exceeds max list length.'\\n );\\n\\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n RLPItem({length: _in.length - offset, ptr: _in.ptr + offset})\\n );\\n\\n out[itemCount] = RLPItem({\\n length: itemLength + itemOffset,\\n ptr: _in.ptr + offset\\n });\\n\\n itemCount += 1;\\n offset += itemOffset + itemLength;\\n }\\n\\n // Decrease the array size to match the actual item count.\\n assembly {\\n mstore(out, itemCount)\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP list value into a list of RLP items.\\n * @param _in RLP list value.\\n * @return Decoded RLP list items.\\n */\\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n return readList(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes value.');\\n\\n return _copy(_in.ptr, itemOffset, itemLength);\\n }\\n\\n /**\\n * Reads an RLP bytes value into bytes.\\n * @param _in RLP bytes value.\\n * @return Decoded bytes.\\n */\\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n return readBytes(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(RLPItem memory _in)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(readBytes(_in));\\n }\\n\\n /**\\n * Reads an RLP string value into a string.\\n * @param _in RLP string value.\\n * @return Decoded string.\\n */\\n function readString(bytes memory _in) internal pure returns (string memory) {\\n return readString(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n require(_in.length <= 33, 'Invalid RLP bytes32 value.');\\n\\n (\\n uint256 itemOffset,\\n uint256 itemLength,\\n RLPItemType itemType\\n ) = _decodeLength(_in);\\n\\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes32 value.');\\n\\n uint256 ptr = _in.ptr + itemOffset;\\n bytes32 out;\\n assembly {\\n out := mload(ptr)\\n\\n // Shift the bytes over to match the item size.\\n if lt(itemLength, 32) {\\n out := div(out, exp(256, sub(32, itemLength)))\\n }\\n }\\n\\n return out;\\n }\\n\\n /**\\n * Reads an RLP bytes32 value into a bytes32.\\n * @param _in RLP bytes32 value.\\n * @return Decoded bytes32.\\n */\\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n return readBytes32(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n return uint256(readBytes32(_in));\\n }\\n\\n /**\\n * Reads an RLP uint256 value into a uint256.\\n * @param _in RLP uint256 value.\\n * @return Decoded uint256.\\n */\\n function readUint256(bytes memory _in) internal pure returns (uint256) {\\n return readUint256(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(RLPItem memory _in) internal pure returns (bool) {\\n require(_in.length == 1, 'Invalid RLP boolean value.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 out;\\n assembly {\\n out := byte(0, mload(ptr))\\n }\\n\\n require(\\n out == 0 || out == 1,\\n 'Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1'\\n );\\n\\n return out != 0;\\n }\\n\\n /**\\n * Reads an RLP bool value into a bool.\\n * @param _in RLP bool value.\\n * @return Decoded bool.\\n */\\n function readBool(bytes memory _in) internal pure returns (bool) {\\n return readBool(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(RLPItem memory _in) internal pure returns (address) {\\n if (_in.length == 1) {\\n return address(0);\\n }\\n\\n require(_in.length == 21, 'Invalid RLP address value.');\\n\\n return address(uint160(readUint256(_in)));\\n }\\n\\n /**\\n * Reads an RLP address value into a address.\\n * @param _in RLP address value.\\n * @return Decoded address.\\n */\\n function readAddress(bytes memory _in) internal pure returns (address) {\\n return readAddress(toRLPItem(_in));\\n }\\n\\n /**\\n * Reads the raw bytes of an RLP item.\\n * @param _in RLP item to read.\\n * @return Raw RLP bytes.\\n */\\n function readRawBytes(RLPItem memory _in)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n return _copy(_in);\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Decodes the length of an RLP item.\\n * @param _in RLP item to decode.\\n * @return Offset of the encoded data.\\n * @return Length of the encoded data.\\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n */\\n function _decodeLength(RLPItem memory _in)\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n RLPItemType\\n )\\n {\\n require(_in.length > 0, 'RLP item cannot be null.');\\n\\n uint256 ptr = _in.ptr;\\n uint256 prefix;\\n assembly {\\n prefix := byte(0, mload(ptr))\\n }\\n\\n if (prefix <= 0x7f) {\\n // Single byte.\\n\\n return (0, 1, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xb7) {\\n // Short string.\\n\\n uint256 strLen = prefix - 0x80;\\n\\n require(_in.length > strLen, 'Invalid RLP short string.');\\n\\n return (1, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xbf) {\\n // Long string.\\n uint256 lenOfStrLen = prefix - 0xb7;\\n\\n require(_in.length > lenOfStrLen, 'Invalid RLP long string length.');\\n\\n uint256 strLen;\\n assembly {\\n // Pick out the string length.\\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n }\\n\\n require(_in.length > lenOfStrLen + strLen, 'Invalid RLP long string.');\\n\\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n } else if (prefix <= 0xf7) {\\n // Short list.\\n uint256 listLen = prefix - 0xc0;\\n\\n require(_in.length > listLen, 'Invalid RLP short list.');\\n\\n return (1, listLen, RLPItemType.LIST_ITEM);\\n } else {\\n // Long list.\\n uint256 lenOfListLen = prefix - 0xf7;\\n\\n require(_in.length > lenOfListLen, 'Invalid RLP long list length.');\\n\\n uint256 listLen;\\n assembly {\\n // Pick out the list length.\\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n }\\n\\n require(_in.length > lenOfListLen + listLen, 'Invalid RLP long list.');\\n\\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n }\\n }\\n\\n /**\\n * Copies the bytes from a memory location.\\n * @param _src Pointer to the location to read from.\\n * @param _offset Offset to start reading from.\\n * @param _length Number of bytes to read.\\n * @return Copied bytes.\\n */\\n function _copy(\\n uint256 _src,\\n uint256 _offset,\\n uint256 _length\\n ) private pure returns (bytes memory) {\\n bytes memory out = new bytes(_length);\\n if (out.length == 0) {\\n return out;\\n }\\n\\n uint256 src = _src + _offset;\\n uint256 dest;\\n assembly {\\n dest := add(out, 32)\\n }\\n\\n // Copy over as many complete words as we can.\\n for (uint256 i = 0; i < _length / 32; i++) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n\\n src += 32;\\n dest += 32;\\n }\\n\\n // Pick out the remaining bytes.\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - (_length % 32)) - 1;\\n }\\n\\n assembly {\\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n }\\n return out;\\n }\\n\\n /**\\n * Copies an RLP item into bytes.\\n * @param _in RLP item to copy.\\n * @return Copied bytes.\\n */\\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n return _copy(_in.ptr, 0, _in.length);\\n }\\n}\\n\",\"keccak256\":\"0x1d00ffbf595d95145544291f36a97de453b51032bb03a6247f890d2805b55955\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * RLP encodes a byte string.\\n * @param _in The byte string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n bytes memory encoded;\\n\\n if (_in.length == 1 && uint8(_in[0]) < 128) {\\n encoded = _in;\\n } else {\\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * RLP encodes a list of RLP encoded byte byte strings.\\n * @param _in The list of RLP encoded byte strings.\\n * @return The RLP encoded list of items in bytes.\\n */\\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n bytes memory list = _flatten(_in);\\n return abi.encodePacked(_writeLength(list.length, 192), list);\\n }\\n\\n /**\\n * RLP encodes a string.\\n * @param _in The string to encode.\\n * @return The RLP encoded string in bytes.\\n */\\n function writeString(string memory _in) internal pure returns (bytes memory) {\\n return writeBytes(bytes(_in));\\n }\\n\\n /**\\n * RLP encodes an address.\\n * @param _in The address to encode.\\n * @return The RLP encoded address in bytes.\\n */\\n function writeAddress(address _in) internal pure returns (bytes memory) {\\n return writeBytes(abi.encodePacked(_in));\\n }\\n\\n /**\\n * RLP encodes a uint.\\n * @param _in The uint256 to encode.\\n * @return The RLP encoded uint256 in bytes.\\n */\\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n return writeBytes(_toBinary(_in));\\n }\\n\\n /**\\n * RLP encodes a bool.\\n * @param _in The bool to encode.\\n * @return The RLP encoded bool in bytes.\\n */\\n function writeBool(bool _in) internal pure returns (bytes memory) {\\n bytes memory encoded = new bytes(1);\\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n return encoded;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n * @param _len The length of the string or the payload.\\n * @param _offset 128 if item is string, 192 if item is list.\\n * @return RLP encoded bytes.\\n */\\n function _writeLength(uint256 _len, uint256 _offset)\\n private\\n pure\\n returns (bytes memory)\\n {\\n bytes memory encoded;\\n\\n if (_len < 56) {\\n encoded = new bytes(1);\\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n } else {\\n uint256 lenLen;\\n uint256 i = 1;\\n while (_len / i != 0) {\\n lenLen++;\\n i *= 256;\\n }\\n\\n encoded = new bytes(lenLen + 1);\\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n for (i = 1; i <= lenLen; i++) {\\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n }\\n }\\n\\n return encoded;\\n }\\n\\n /**\\n * Encode integer in big endian binary form with no leading zeroes.\\n * @notice TODO: This should be optimized with assembly to save gas costs.\\n * @param _x The integer to encode.\\n * @return RLP encoded bytes.\\n */\\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n bytes memory b = abi.encodePacked(_x);\\n\\n uint256 i = 0;\\n for (; i < 32; i++) {\\n if (b[i] != 0) {\\n break;\\n }\\n }\\n\\n bytes memory res = new bytes(32 - i);\\n for (uint256 j = 0; j < res.length; j++) {\\n res[j] = b[i++];\\n }\\n\\n return res;\\n }\\n\\n /**\\n * Copies a piece of memory to another location.\\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n * @param _dest Destination location.\\n * @param _src Source location.\\n * @param _len Length of memory to copy.\\n */\\n function _memcpy(\\n uint256 _dest,\\n uint256 _src,\\n uint256 _len\\n ) private pure {\\n uint256 dest = _dest;\\n uint256 src = _src;\\n uint256 len = _len;\\n\\n for (; len >= 32; len -= 32) {\\n assembly {\\n mstore(dest, mload(src))\\n }\\n dest += 32;\\n src += 32;\\n }\\n\\n uint256 mask;\\n unchecked {\\n mask = 256**(32 - len) - 1;\\n }\\n assembly {\\n let srcpart := and(mload(src), not(mask))\\n let destpart := and(mload(dest), mask)\\n mstore(dest, or(destpart, srcpart))\\n }\\n }\\n\\n /**\\n * Flattens a list of byte strings into one byte string.\\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n * @param _list List of byte strings to flatten.\\n * @return The flattened byte string.\\n */\\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n if (_list.length == 0) {\\n return new bytes(0);\\n }\\n\\n uint256 len;\\n uint256 i = 0;\\n for (; i < _list.length; i++) {\\n len += _list[i].length;\\n }\\n\\n bytes memory flattened = new bytes(len);\\n uint256 flattenedPtr;\\n assembly {\\n flattenedPtr := add(flattened, 0x20)\\n }\\n\\n for (i = 0; i < _list.length; i++) {\\n bytes memory item = _list[i];\\n\\n uint256 listPtr;\\n assembly {\\n listPtr := add(item, 0x20)\\n }\\n\\n _memcpy(flattenedPtr, listPtr, item.length);\\n flattenedPtr += _list[i].length;\\n }\\n\\n return flattened;\\n }\\n}\\n\",\"keccak256\":\"0xb3a03376fea9bfc947af1719158aac3daa6343cb0329a1c2a33016a29c53970a\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as a boolean.\\n */\\n function toBool(bytes32 _in) internal pure returns (bool) {\\n return _in != 0;\\n }\\n\\n /**\\n * Converts a boolean to a bytes32 value.\\n * @param _in Input boolean value.\\n * @return Boolean as a bytes32.\\n */\\n function fromBool(bool _in) internal pure returns (bytes32) {\\n return bytes32(uint256(_in ? 1 : 0));\\n }\\n\\n /**\\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n * @param _in Input bytes32 value.\\n * @return Bytes32 as an address.\\n */\\n function toAddress(bytes32 _in) internal pure returns (address) {\\n return address(uint160(uint256(_in)));\\n }\\n\\n /**\\n * Converts an address to a bytes32.\\n * @param _in Input address value.\\n * @return Address as a bytes32.\\n */\\n function fromAddress(address _in) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(_in)));\\n }\\n}\\n\",\"keccak256\":\"0x675b6d1b5a1b5a80f31c2a8a33adc8105e8b38c2e21626706c8f7e9be74346e2\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, 'slice_overflow');\\n require(_start + _length >= _start, 'slice_overflow');\\n require(_bytes.length >= _start + _length, 'slice_outOfBounds');\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(\\n add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))),\\n _start\\n )\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n if (_start >= _bytes.length) {\\n return bytes('');\\n }\\n\\n return slice(_bytes, _start, _bytes.length - _start);\\n }\\n\\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n if (_bytes.length < 32) {\\n bytes32 ret;\\n assembly {\\n ret := mload(add(_bytes, 32))\\n }\\n return ret;\\n }\\n\\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n }\\n\\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n return uint256(toBytes32(_bytes));\\n }\\n\\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n for (uint256 i = 0; i < _bytes.length; i++) {\\n nibbles[i * 2] = _bytes[i] >> 4;\\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n }\\n\\n return nibbles;\\n }\\n\\n function fromNibbles(bytes memory _bytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory ret = new bytes(_bytes.length / 2);\\n\\n for (uint256 i = 0; i < ret.length; i++) {\\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n }\\n\\n return ret;\\n }\\n\\n function equal(bytes memory _bytes, bytes memory _other)\\n internal\\n pure\\n returns (bool)\\n {\\n return keccak256(_bytes) == keccak256(_other);\\n }\\n}\\n\",\"keccak256\":\"0xdf5a3f5021b71789c9c056164d76634add7fa005c1d0a927d80b609f0090f2e5\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n * If you do not know the original length of elements for the tree you are verifying, then\\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n * @param _elements Array of hashes from which to generate a merkle root.\\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n */\\n function getMerkleRoot(bytes32[] memory _elements)\\n internal\\n pure\\n returns (bytes32)\\n {\\n require(\\n _elements.length > 0,\\n 'Lib_MerkleTree: Must provide at least one leaf hash.'\\n );\\n\\n if (_elements.length == 1) {\\n return _elements[0];\\n }\\n\\n uint256[16] memory defaults = [\\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n ];\\n\\n // Reserve memory space for our hashes.\\n bytes memory buf = new bytes(64);\\n\\n // We'll need to keep track of left and right siblings.\\n bytes32 leftSibling;\\n bytes32 rightSibling;\\n\\n // Number of non-empty nodes at the current depth.\\n uint256 rowSize = _elements.length;\\n\\n // Current depth, counting from 0 at the leaves\\n uint256 depth = 0;\\n\\n // Common sub-expressions\\n uint256 halfRowSize; // rowSize / 2\\n bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n while (rowSize > 1) {\\n halfRowSize = rowSize / 2;\\n rowSizeIsOdd = rowSize % 2 == 1;\\n\\n for (uint256 i = 0; i < halfRowSize; i++) {\\n leftSibling = _elements[(2 * i)];\\n rightSibling = _elements[(2 * i) + 1];\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[i] = keccak256(buf);\\n }\\n\\n if (rowSizeIsOdd) {\\n leftSibling = _elements[rowSize - 1];\\n rightSibling = bytes32(defaults[depth]);\\n assembly {\\n mstore(add(buf, 32), leftSibling)\\n mstore(add(buf, 64), rightSibling)\\n }\\n\\n _elements[halfRowSize] = keccak256(buf);\\n }\\n\\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n depth++;\\n }\\n\\n return _elements[0];\\n }\\n\\n /**\\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\\n * of leaves generated is a known, correct input, and does not return true for indices\\n * extending past that index (even if _siblings would be otherwise valid.)\\n * @param _root The Merkle root to verify against.\\n * @param _leaf The leaf hash to verify inclusion of.\\n * @param _index The index in the tree of this leaf.\\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n * (bottom of the tree).\\n * @param _totalLeaves The total number of leaves originally passed into.\\n * @return Whether or not the merkle branch and leaf passes verification.\\n */\\n function verify(\\n bytes32 _root,\\n bytes32 _leaf,\\n uint256 _index,\\n bytes32[] memory _siblings,\\n uint256 _totalLeaves\\n ) internal pure returns (bool) {\\n require(\\n _totalLeaves > 0,\\n 'Lib_MerkleTree: Total leaves must be greater than zero.'\\n );\\n\\n require(_index < _totalLeaves, 'Lib_MerkleTree: Index out of bounds.');\\n\\n require(\\n _siblings.length == _ceilLog2(_totalLeaves),\\n 'Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.'\\n );\\n\\n bytes32 computedRoot = _leaf;\\n\\n for (uint256 i = 0; i < _siblings.length; i++) {\\n if ((_index & 1) == 1) {\\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n } else {\\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n }\\n\\n _index >>= 1;\\n }\\n\\n return _root == computedRoot;\\n }\\n\\n /*********************\\n * Private Functions *\\n *********************/\\n\\n /**\\n * Calculates the integer ceiling of the log base 2 of an input.\\n * @param _in Unsigned input to calculate the log.\\n * @return ceil(log_base_2(_in))\\n */\\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n require(_in > 0, 'Lib_MerkleTree: Cannot compute ceil(log_2) of 0.');\\n\\n if (_in == 1) {\\n return 0;\\n }\\n\\n // Find the highest set bit (will be floor(log_2)).\\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n uint256 val = _in;\\n uint256 highest = 0;\\n for (uint256 i = 128; i >= 1; i >>= 1) {\\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n highest += i;\\n val >>= i;\\n }\\n }\\n\\n // Increment by one if this is not a perfect logarithm.\\n if ((uint256(1) << highest) != _in) {\\n highest += 1;\\n }\\n\\n return highest;\\n }\\n}\\n\",\"keccak256\":\"0xf888c07a58dcad33e88ecc18cccc6435f4727c4671f03bb01e52761de7c7223b\",\"license\":\"MIT\"}},\"version\":1}", ++ "bytecode": "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", ++ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a", + "devdoc": { + "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM", + "kind": "dev", +@@ -489,15 +489,15 @@ + "storageLayout": { + "storage": [ + { +- "astId": 6653, ++ "astId": 6644, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "libAddressManager", + "offset": 0, + "slot": "0", +- "type": "t_contract(Lib_AddressManager)6645" ++ "type": "t_contract(Lib_AddressManager)6636" + }, + { +- "astId": 4538, ++ "astId": 4525, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "FRAUD_PROOF_WINDOW", + "offset": 0, +@@ -505,7 +505,7 @@ + "type": "t_uint256" + }, + { +- "astId": 4540, ++ "astId": 4527, + "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain", + "label": "SEQUENCER_PUBLISH_WINDOW", + "offset": 0, +@@ -514,7 +514,7 @@ + } + ], + "types": { +- "t_contract(Lib_AddressManager)6645": { ++ "t_contract(Lib_AddressManager)6636": { + "encoding": "inplace", + "label": "contract Lib_AddressManager", + "numberOfBytes": "20" +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/1bef9702d702d51d122c68caa8d7c949.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/1bef9702d702d51d122c68caa8d7c949.json +new file mode 100644 +index 0000000..7a031de +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/1bef9702d702d51d122c68caa8d7c949.json +@@ -0,0 +1,342 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_CrossDomainMessenger\n */\ninterface iOVM_CrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from\n \"../../iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iOVM_CrossDomainMessenger\n )\n {\n return iOVM_CrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/introspection/ERC165Checker.sol\";\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../../libraries/standards/IL2StandardERC20.sol\";\n\n/**\n * @title OVM_L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(\n address _l2CrossDomainMessenger,\n address _l1TokenBridge\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n internal\n {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n _l1Gas,\n message\n );\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l1TokenBridge)\n {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n 0,\n message\n );\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\nimport \"./iOVM_L1ERC20Bridge.sol\";\n\n/**\n * @title iOVM_L1StandardBridge\n */\ninterface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n event ETHDepositInitiated (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH (\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo (\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal (\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ERC20Bridge\n */\ninterface iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20 (\n address _l1Token,\n address _l2Token,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To (\n address _l1Token,\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2ERC20Bridge\n */\ninterface iOVM_L2ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw (\n address _l2Token,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo (\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * OVM_l1TokenGateway.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n\n}\n" ++ }, ++ "@openzeppelin/contracts/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /*\n * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\n */\n bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) &&\n _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n // success determines whether the staticcall succeeded and result determines\n // whether the contract at account indicates support of _interfaceId\n (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\n\n return (success && result);\n }\n\n /**\n * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return success true if the STATICCALL succeeded, false otherwise\n * @return result true if the STATICCALL succeeded and the contract at account\n * indicates support of the interface with identifier interfaceId, false otherwise\n */\n function _callERC165SupportsInterface(address account, bytes4 interfaceId)\n private\n view\n returns (bool, bool)\n {\n bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\n (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\n if (result.length < 32) return (false, false);\n return (success, abi.decode(result, (bool)));\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;\n address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;\n address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n // solhint-disable-next-line max-line-length\n address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "@openzeppelin/contracts/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\nimport { OVM_L2StandardBridge } from \"../bridge/tokens/OVM_L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerFeeVault {\n\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(\n address _l1FeeWallet\n ) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw()\n public\n {\n uint256 balance = OVM_ETH(Lib_PredeployAddresses.OVM_ETH).balanceOf(address(this));\n\n require(\n balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n OVM_L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../libraries/standards/L2StandardERC20.sol\";\nimport { IWETH9 } from \"../../libraries/standards/IWETH9.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is L2StandardERC20, IWETH9 {\n\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n address(0),\n \"Ether\",\n \"ETH\"\n )\n {}\n\n\n /******************************\n * Custom WETH9 Functionality *\n ******************************/\n fallback() external payable {\n deposit();\n }\n\n /**\n * Implements the WETH9 deposit() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The relevant\n * deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their\n * code.\n */\n function deposit()\n public\n payable\n override\n {\n // Calling deposit() with nonzero value will send the ETH to this contract address.\n // Once received here, we transfer it back by sending to the msg.sender.\n _transfer(address(this), msg.sender, msg.value);\n\n emit Deposit(msg.sender, msg.value);\n }\n\n /**\n * Implements the WETH9 withdraw() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The relevant\n * deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their\n * code.\n * @param _wad Amount being withdrawn\n */\n function withdraw(\n uint256 _wad\n )\n external\n override\n {\n // Calling withdraw() with value exceeding the withdrawer's ovmBALANCE should revert,\n // as in WETH9.\n require(balanceOf(msg.sender) >= _wad);\n\n // Other than emitting an event, OVM_ETH already is native ETH, so we don't need to do\n // anything else.\n emit Withdrawal(msg.sender, _wad);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\nimport \"./IL2StandardERC20.sol\";\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public override l1Token;\n address public l2Bridge;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector\n ^ IL2StandardERC20.mint.selector\n ^ IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual override onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual override onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/standards/IWETH9.sol": { ++ "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/// @title Interface for WETH9. Also contains the non-ERC20 events\n/// normally present in the WETH9 implementation.\ninterface IWETH9 is IERC20 {\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n /// @notice Deposit ether to get wrapped ether\n function deposit() external payable;\n\n /// @notice Withdraw wrapped ether to get ether\n function withdraw(uint256) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../../utils/Context.sol\";\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20 {\n using SafeMath for uint256;\n\n mapping (address => uint256) private _balances;\n\n mapping (address => mapping (address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n uint8 private _decimals;\n\n /**\n * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n * a default value of 18.\n *\n * To select a different value for {decimals}, use {_setupDecimals}.\n *\n * All three of these values are immutable: they can only be set once during\n * construction.\n */\n constructor (string memory name_, string memory symbol_) public {\n _name = name_;\n _symbol = symbol_;\n _decimals = 18;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n * called.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return _decimals;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\n return true;\n }\n\n /**\n * @dev Moves tokens `amount` from `sender` to `recipient`.\n *\n * This is internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply = _totalSupply.add(amount);\n _balances[account] = _balances[account].add(amount);\n emit Transfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n _totalSupply = _totalSupply.sub(amount);\n emit Transfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Sets {decimals} to a value other than the default one of 18.\n *\n * WARNING: This function should only be called from the constructor. Most\n * applications that interact with token contracts will not expect\n * {decimals} to ever change, and may work incorrectly if it does.\n */\n function _setupDecimals(uint8 decimals_) internal virtual {\n _decimals = decimals_;\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be to transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/math/SafeMath.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using SafeMath for uint256;\n using Address for address;\n\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n // solhint-disable-next-line max-line-length\n require((value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) { // Return data is optional\n // solhint-disable-next-line max-line-length\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n //require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n //require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\";\n\n/**\n * @title OVM_L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {\n using SafeMath for uint;\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping (address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(\n address _l1messenger,\n address _l2TokenBridge\n )\n public\n {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive()\n external\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n 1_300_000,\n bytes(\"\")\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETH(\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n {\n _initiateETHDeposit(\n msg.sender,\n _to,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n )\n internal\n {\n // Construct calldata for finalizeDeposit call\n bytes memory message =\n abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyEOA()\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n internal\n {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(\n _from,\n address(this),\n _amount\n );\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n (bool success, ) = _to.call{value: _amount}(new bytes(0));\n require(success, \"TransferHelper::safeTransferETH: ETH transfer failed\");\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_ECDSAContractAccount.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from\n \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\n\n/* External Imports */\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { ECDSA } from \"@openzeppelin/contracts/cryptography/ECDSA.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by\n * providing EIP155 formatted transaction encodings.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*************\n * Constants *\n *************/\n\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * No-op fallback mirrors behavior of calling an EOA on L1.\n */\n fallback()\n external\n payable\n {\n return;\n }\n\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(\n bytes32 hash,\n bytes memory signature\n )\n public\n view\n returns (\n bytes4 magicValue\n )\n {\n return ECDSA.recover(hash, signature) == address(this) ?\n this.isValidSignature.selector :\n bytes4(0);\n }\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EIP155 transaction.\n * @return Whether or not the call returned (rather than reverted).\n * @return Data returned by the call.\n */\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n override\n public\n returns (\n bool,\n bytes memory\n )\n {\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n require(\n _transaction.sender() == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n require(\n _transaction.chainId == Lib_ExecutionManagerWrapper.ovmCHAINID(),\n \"Transaction signed with wrong chain ID\"\n );\n\n // Need to make sure that the transaction nonce is right.\n require(\n _transaction.nonce == Lib_ExecutionManagerWrapper.ovmGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for mainnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // require(\n // gasleft() >= SafeMath.add(transaction.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n require(\n OVM_ETH(Lib_PredeployAddresses.OVM_ETH).transfer(\n Lib_PredeployAddresses.SEQUENCER_FEE_WALLET,\n SafeMath.mul(_transaction.gasLimit, _transaction.gasPrice)\n ),\n \"Fee was not transferred to relayer.\"\n );\n\n if (_transaction.isCreate) {\n // TEMPORARY: Disable value transfer for contract creations.\n require(\n _transaction.value == 0,\n \"Value transfer in contract creation not supported.\"\n );\n\n (address created, bytes memory revertdata) = Lib_ExecutionManagerWrapper.ovmCREATE(\n _transaction.data\n );\n\n // Return true if the contract creation succeeded, false w/ revertdata otherwise.\n if (created != address(0)) {\n return (true, abi.encode(created));\n } else {\n return (false, revertdata);\n }\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_ExecutionManagerWrapper.ovmINCREMENTNONCE();\n\n // NOTE: Upgrades are temporarily disabled because users can, in theory, modify their\n // EOA so that they don't have to pay any fees to the sequencer. Function will remain\n // disabled until a robust solution is in place.\n require(\n _transaction.to != Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Calls to self are disabled until upgradability is re-enabled.\"\n );\n\n return _transaction.to.call{value: _transaction.value}(_transaction.data);\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ECDSAContractAccount.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam;\n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate;\n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes(\"\");\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes(\"\");\n raw[8] = Lib_RLPWriter.writeBytes(\"\");\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ErrorUtils } from \"../utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title Lib_ExecutionManagerWrapper\n * @dev This library acts as a utility for easily calling the OVM_ExecutionManagerWrapper, the\n * predeployed contract which exposes the `kall` builtin. Effectively, this contract allows the\n * user to trigger OVM opcodes by directly calling the OVM_ExecutionManger.\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\nlibrary Lib_ExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Performs a safe ovmCREATE call.\n * @param _bytecode Code for the new contract.\n * @return Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address, bytes));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return Result of calling ovmGETNONCE.\n */\n function ovmGETNONCE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmINCREMENTNONCE call.\n */\n function ovmINCREMENTNONCE()\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmINCREMENTNONCE()\"\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Calls the ovmL1TXORIGIN opcode.\n * @return Address that sent this message from L1.\n */\n function ovmL1TXORIGIN()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmL1TXORIGIN()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the ovmCHAINID opcode.\n * @return Chain ID of the current network.\n */\n function ovmCHAINID()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return Result of calling ovmADDRESS.\n */\n function ovmADDRESS()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the value-enabled ovmCALL opcode.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,uint256,bytes)\",\n _gasLimit,\n _address,\n _value,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Calls the ovmBALANCE opcode.\n * @param _address OVM account to query the balance of.\n * @return Balance of the account.\n */\n function ovmBALANCE(\n address _address\n )\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmBALANCE(address)\",\n _address\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Calls the ovmCALLVALUE opcode.\n * @return Value of the current call frame.\n */\n function ovmCALLVALUE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALLVALUE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return Data sent back by the OVM_ExecutionManager.\n */\n function _callWrapperContract(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory\n )\n {\n (bool success, bytes memory returndata) =\n Lib_PredeployAddresses.EXECUTION_MANAGER_WRAPPER.delegatecall(_calldata);\n\n if (success == true) {\n return returndata;\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/cryptography/ECDSA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n // Check the signature length\n if (signature.length != 65) {\n revert(\"ECDSA: invalid signature length\");\n }\n\n // Divide the signature in r, s and v variables\n bytes32 r;\n bytes32 s;\n uint8 v;\n\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n\n return recover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"ECDSA: invalid signature 's' value\");\n require(v == 27 || v == 28, \"ECDSA: invalid signature 'v' value\");\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n require(signer != address(0), \"ECDSA: invalid signature\");\n\n return signer;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * replicates the behavior of the\n * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\n * JSON-RPC method.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)\n * #panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_ProxyEOA.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_ExecutionManagerWrapper } from\n \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation\n * contract. In combination with the logic implemented in the ECDSA Contract Account, this enables\n * a form of upgradable 'account abstraction' on layer 2.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ProxyEOA {\n\n /**********\n * Events *\n **********/\n\n event Upgraded(\n address indexed implementation\n );\n\n\n /*************\n * Constants *\n *************/\n // solhint-disable-next-line max-line-length\n bytes32 constant IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; //bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1);\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n (bool success, bytes memory returndata) = getImplementation().delegatecall(msg.data);\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n\n // WARNING: We use the deployed bytecode of this contract as a template to create ProxyEOA\n // contracts. As a result, we must *not* perform any constructor logic. Use initialization\n // functions if necessary.\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the implementation address.\n * @param _implementation New implementation address.\n */\n function upgrade(\n address _implementation\n )\n external\n {\n require(\n msg.sender == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"EOAs can only upgrade their own EOA implementation.\"\n );\n\n _setImplementation(_implementation);\n emit Upgraded(_implementation);\n }\n\n /**\n * Gets the address of the current implementation.\n * @return Current implementation address.\n */\n function getImplementation()\n public\n view\n returns (\n address\n )\n {\n bytes32 addr32;\n assembly {\n addr32 := sload(IMPLEMENTATION_KEY)\n }\n\n address implementation = Lib_Bytes32Utils.toAddress(addr32);\n if (implementation == address(0)) {\n return Lib_PredeployAddresses.ECDSA_CONTRACT_ACCOUNT;\n } else {\n return implementation;\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n bytes32 addr32 = Lib_Bytes32Utils.fromAddress(_implementation);\n assembly {\n sstore(IMPLEMENTATION_KEY, addr32)\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from\n \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by\n * any account. It accepts a more efficient compressed calldata format, which it decompresses and\n * encodes to the standard EIP155 transaction format.\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerEntrypoint {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Expects an RLP-encoded EIP155 transaction as input. See the EIP for a more detailed\n * description of this transaction format:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\n fallback()\n external\n {\n // We use this twice, so it's more gas efficient to store a copy of it (barely).\n bytes memory encodedTx = msg.data;\n\n // Decode the tx with the correct chain ID.\n Lib_EIP155Tx.EIP155Tx memory transaction = Lib_EIP155Tx.decode(\n encodedTx,\n Lib_ExecutionManagerWrapper.ovmCHAINID()\n );\n\n // Value is computed on the fly. Keep it in the stack to save some gas.\n address target = transaction.sender();\n\n bool isEmptyContract;\n assembly {\n isEmptyContract := iszero(extcodesize(target))\n }\n\n // If the account is empty, deploy the default EOA to that address.\n if (isEmptyContract) {\n Lib_ExecutionManagerWrapper.ovmCREATEEOA(\n transaction.hash(),\n transaction.recoveryParam,\n transaction.r,\n transaction.s\n );\n }\n\n // Forward the transaction over to the EOA.\n (bool success, bytes memory returndata) = target.call(\n abi.encodeWithSelector(iOVM_ECDSAContractAccount.execute.selector, transaction)\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_start >= _bytes.length) {\n return bytes(\"\");\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation\n * of a fraud proof. It feeds verified input to the Execution Manager's run(), and controls a\n * State Manager (which is uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and\n * verifies that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by\n * comparing the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner\n{\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n // solhint-disable-next-line max-line-length\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n // solhint-disable-next-line max-line-length\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\"))\n .create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n external\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n external\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n external\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n // solhint-disable-next-line max-line-length\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n // 1032/1000 = 1.032 = (64/63)^2 rounded up\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000,\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager =\n iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" ++ }, ++ "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n // solhint-disable-next-line max-line-length\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n // solhint-disable-next-line max-line-length\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n // solhint-disable-next-line max-line-length\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n // solhint-disable-next-line max-line-length\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n enum MessageType {\n ovmCALL,\n ovmSTATICCALL,\n ovmDELEGATECALL,\n ovmCREATE,\n ovmCREATE2\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n uint256 ovmCALLVALUE;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmCALLVALUE() external view returns (uint _callValue);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external\n returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external\n returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n // Valueless ovmCALL for maintaining backwards compatibility with legacy OVM bytecode.\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external\n returns (bool _success, bytes memory _returndata);\n function ovmCALL(uint256 _gasLimit, address _address, uint256 _value, bytes memory _calldata)\n external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external\n returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external\n returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external\n returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /*********************\n * ETH Value Opcodes *\n *********************/\n\n function ovmBALANCE(address _contract) external returns (uint256 _balance);\n function ovmSELFBALANCE() external returns (uint256 _balance);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view\n returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash)\n external;\n function testAndSetAccountLoaded(address _address) external\n returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external\n returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view\n returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view\n returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external\n returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external\n returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external\n returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view\n returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view\n returns (bool);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve(\"OVM_BondManager\"))\n .recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string indexed _name,\n address _newAddress,\n address _oldAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n external\n onlyOwner\n {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(\n _name,\n _address,\n oldAddress\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n external\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) =\n _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes(\"\");\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) == _getNodeKey(lastNode).length\n && keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] =\n _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode =\n _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch =\n _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode =\n _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch =\n _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(\n TrieNode memory _node,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from\n \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view\n returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from\n \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from\n \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain =\n iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain =\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n // solhint-disable-next-line max-line-length\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain =\n iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n // solhint-disable-next-line max-line-length\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] =\n iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] =\n iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain =\n iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) =\n abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent)\n override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner =\n address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\"))\n .getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" ++ }, ++ "contracts/test-helpers/Mock_FraudVerifier.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from\n \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport \"@openzeppelin/contracts/math/SafeMath.sol\";\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-SCC-batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <=\n iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"))\n .getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n // solhint-enable max-line-length\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping (uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n Buffer storage _self,\n bytes32 _value\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n Buffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n Buffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n Buffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n Buffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(\n Buffer storage _self,\n BufferContext memory _ctx\n )\n internal\n {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(\n Buffer storage _self\n )\n internal\n view\n returns (\n BufferContext memory\n )\n {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n // solhint-disable-next-line max-line-length\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n return BufferContext({\n length: length,\n extraData: extraData\n });\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../optimistic-ethereum/libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index\n );\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n public\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function setExtraData(\n bytes27 _extraData\n )\n public\n {\n return buf.setExtraData(\n _extraData\n );\n }\n\n function getExtraData()\n public\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from\n \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // solhint-disable max-line-length\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n // solhint-enable max-line-length\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n // solhint-enable max-line-length\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n // solhint-disable max-line-length\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n // solhint-enable max-line-length\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n // solhint-disable-next-line max-line-length\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n // solhint-disable-next-line max-line-length\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the\n // next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n // solhint-disable-next-line max-line-length\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue\n * elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's\n * subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that\n // will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0)\n {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate\n // monotonicity.\n require(_finalContext.timestamp <= block.timestamp,\n \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number,\n \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager =\n OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to\n * queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) ==\n batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /**************************\n * Native Value Constants *\n **************************/\n\n // Public so we can access and make assertions in integration tests.\n uint256 public constant CALL_WITH_VALUE_INTRINSIC_GAS = 90000;\n\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 =\n 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n\n /*************************************\n * Container Contract Address Prefix *\n *************************************/\n\n /**\n * @dev The Execution Manager and State Manager each have this 30 byte prefix,\n * and are uncallable.\n */\n address constant CONTAINER_CONTRACT_PREFIX = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n external\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in\n // L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n 0,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n external\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides CALLVALUE.\n * @return _CALLVALUE Value sent along with the call according to the current message context.\n */\n function ovmCALLVALUE()\n override\n public\n view\n returns (\n uint256 _CALLVALUE\n )\n {\n return messageContext.ovmCALLVALUE;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n external\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n external\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n external\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n external\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n external\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n external\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n external\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE2\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n external\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n external\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n Lib_PredeployAddresses.PROXY_EOA,\n 0,\n ovmEXTCODESIZE(Lib_PredeployAddresses.PROXY_EOA)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.ovmCALLVALUE = _value;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmCALL\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static,\n // valueless context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n nextMessageContext.ovmCALLVALUE = 0;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmSTATICCALL\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmDELEGATECALL\n );\n }\n\n /**\n * @notice Legacy ovmCALL function which did not support ETH value; this maintains backwards\n * compatibility.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n returns(\n bool _success,\n bytes memory _returndata\n )\n {\n // Legacy ovmCALL assumed always-0 value.\n return ovmCALL(\n _gasLimit,\n _address,\n 0,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n external\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n external\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n _length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n external\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /***************************************\n * Public Functions: ETH Value Opcodes *\n ***************************************/\n\n /**\n * @notice Overrides BALANCE.\n * NOTE: In the future, this could be optimized to directly invoke EM._getContractStorage(...).\n * @param _contract Address of the contract to query the OVM_ETH balance of.\n * @return _BALANCE OVM_ETH balance of the requested contract.\n */\n function ovmBALANCE(\n address _contract\n )\n override\n public\n returns (\n uint256 _BALANCE\n )\n {\n // Easiest way to get the balance is query OVM_ETH as normal.\n bytes memory balanceOfCalldata = abi.encodeWithSignature(\n \"balanceOf(address)\",\n _contract\n );\n\n // Static call because this should be a read-only query.\n (bool success, bytes memory returndata) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n balanceOfCalldata\n );\n\n // All balanceOf queries should successfully return a uint, otherwise this must be an OOG.\n if (!success || returndata.length != 32) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // Return the decoded balance.\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * @notice Overrides SELFBALANCE.\n * @return _BALANCE OVM_ETH balance of the requesting contract.\n */\n function ovmSELFBALANCE()\n override\n external\n returns (\n uint256 _BALANCE\n )\n {\n return ovmBALANCE(ovmADDRESS());\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2,\n * and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.DEPLOYER_WHITELIST,\n abi.encodeWithSelector(\n OVM_DeployerWhitelist.isDeployerAllowed.selector,\n _deployerAddress\n )\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode,\n MessageType _messageType\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n _messageType\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata,\n MessageType _messageType\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2\n // geth. So, we block calls to these addresses since they are not safe to run as an OVM\n // contract itself.\n if (\n (uint256(_contract) &\n uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(CONTAINER_CONTRACT_PREFIX)\n ) {\n // solhint-disable-next-line max-line-length\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 -->\n // no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n _messageType\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code\n * (both calls and creates). Ensures that OVM-related measures are enforced, including L2 gas\n * refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message. NOTE: this argument is\n * overwritten in some cases to avoid stack-too-deep.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _messageType What type of ovmOPCODE this message corresponds to.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n // NOTE: this argument is overwritten in some cases to avoid stack-too-deep.\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n MessageType _messageType\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n uint256 messageValue = _nextMessageContext.ovmCALLVALUE;\n // If there is value in this message, we need to transfer the ETH over before switching\n // contexts.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n ) {\n // Handle out-of-intrinsic gas consistent with EVM behavior -- the subcall \"appears to\n // revert\" if we don't have enough gas to transfer the ETH.\n // Similar to dynamic gas cost of value exceeding gas here:\n // solhint-disable-next-line max-line-length\n // https://github.com/ethereum/go-ethereum/blob/c503f98f6d5e80e079c1d8a3601d188af2a899da/core/vm/interpreter.go#L268-L273\n if (gasleft() < CALL_WITH_VALUE_INTRINSIC_GAS) {\n return (false, hex\"\");\n }\n\n // If there *is* enough gas to transfer ETH, then we need to make sure this amount of\n // gas is reserved (i.e. not given to the _contract.call below) to guarantee that\n // _handleExternalMessage can't run out of gas. In particular, in the event that\n // the call fails, we will need to transfer the ETH back to the sender.\n // Taking the lesser of _gasLimit and gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS\n // guarantees that the second _attemptForcedEthTransfer below, if needed, always has\n // enough gas to succeed.\n _gasLimit = Math.min(\n _gasLimit,\n gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS // Cannot overflow due to the above check.\n );\n\n // Now transfer the value of the call.\n // The target is interpreted to be the next message's ovmADDRESS account.\n bool transferredOvmEth = _attemptForcedEthTransfer(\n _nextMessageContext.ovmADDRESS,\n messageValue\n );\n\n // If the ETH transfer fails (should only be possible in the case of insufficient\n // balance), then treat this as a revert. This mirrors EVM behavior, see\n // solhint-disable-next-line max-line-length\n // https://github.com/ethereum/go-ethereum/blob/2dee31930c9977af2a9fcb518fb9838aa609a7cf/core/vm/evm.go#L298\n if (!transferredOvmEth) {\n return (false, hex\"\");\n }\n }\n\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreateType(_messageType)) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call{gas: _gasLimit}(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // If the message threw an exception, its value should be returned back to the sender.\n // So, we force it back, BEFORE returning the messageContext to the previous addresses.\n // This operation is part of the reason we \"reserved the intrinsic gas\" above.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n && !success\n ) {\n bool transferredOvmEth = _attemptForcedEthTransfer(\n prevMessageContext.ovmADDRESS,\n messageValue\n );\n\n // Since we transferred it in above and the call reverted, the transfer back should\n // always pass. This code path should NEVER be triggered since we sent `messageValue`\n // worth of OVM_ETH into the target and reserved sufficient gas to execute the transfer,\n // but in case there is some edge case which has been missed, we revert the entire frame\n // (and its parent) to make sure the ETH gets sent back.\n if (!transferredOvmEth) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n }\n\n // Switch back to the original message context now that we're out of the call and all\n // OVM_ETH is in the right place.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts.\n // Our only change here is to record the gas refund reported by the call (enforced by\n // safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. Additionally, we surface custom error messages\n // to developers in the case of unsafe creations for improved devex.\n // All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the\n * CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n // solhint-disable-next-line max-line-length\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a\n // revert flag to be used above in _handleExternalMessage, so we pass the revert data\n // back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n // solhint-disable-next-line max-line-length\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: Value Manipulation *\n ******************************************/\n\n /**\n * Invokes an ovmCALL to OVM_ETH.transfer on behalf of the current ovmADDRESS, allowing us to\n * force movement of OVM_ETH in correspondence with ETH's native value functionality.\n * WARNING: this will send on behalf of whatever the messageContext.ovmADDRESS is in storage\n * at the time of the call.\n * NOTE: In the future, this could be optimized to directly invoke EM._setContractStorage(...).\n * @param _to Amount of OVM_ETH to be sent.\n * @param _value Amount of OVM_ETH to send.\n * @return _success Whether or not the transfer worked.\n */\n function _attemptForcedEthTransfer(\n address _to,\n uint256 _value\n )\n internal\n returns(\n bool _success\n )\n {\n bytes memory transferCalldata = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n _to,\n _value\n );\n\n // OVM_ETH inherits from the UniswapV2ERC20 standard. In this implementation, its return\n // type is a boolean. However, the implementation always returns true if it does not revert\n // Thus, success of the call frame is sufficient to infer success of the transfer itself.\n (bool success, ) = ovmCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n 0,\n transferCalldata\n );\n\n return success;\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address))\n * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address))\n * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it\n // shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes(\"\");\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes(\"\")\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes(\"\")\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(\"\"));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are\n // created. Since this value is already being written to storage, we save much gas compared\n // to using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // These conditionals allow us to avoid unneccessary SSTOREs. However, they do mean that\n // the current storage value for the messageContext MUST equal the _prevMessageContext\n // argument, or an SSTORE might be erroneously skipped.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n\n if (_prevMessageContext.ovmCALLVALUE != _nextMessageContext.ovmCALLVALUE) {\n messageContext.ovmCALLVALUE = _nextMessageContext.ovmCALLVALUE;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************************\n * Internal Functions: Message Typechecks *\n ******************************************/\n\n /**\n * Returns whether or not the given message type is a CREATE-type.\n * @param _messageType the message type in question.\n */\n function _isCreateType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n return (\n _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n /**\n * Returns whether or not the given message type (potentially) requires the transfer of ETH\n * value along with the message.\n * @param _messageType the message type in question.\n */\n function _isValueType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n // ovmSTATICCALL and ovmDELEGATECALL types do not accept or transfer value.\n return (\n _messageType == MessageType.ovmCALL\n || _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom\n * entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n * @param _value the amount of ETH value to send.\n * @param _ovmStateManager the address of the OVM_StateManager precompile in the L2 state.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n uint256 _value,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n // Initialize the EM's internal state, ignoring nuisance gas.\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n // Set the ovmADDRESS to the _from so that the subsequent call frame \"comes from\" them.\n messageContext.ovmADDRESS = _from;\n\n // Execute the desired message.\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return abi.encode(false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return abi.encode(true, Lib_EthUtils.getCode(created));\n }\n } else {\n (bool success, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _value,\n _transaction.data\n );\n return abi.encode(success, returndata);\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/math/Math.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n external\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n external\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n external\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n external\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n // solhint-disable-next-line max-line-length\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n // solhint-disable-next-line max-line-length\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n /* solhint-disable max-line-length */\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n /* solhint-enable max-line-length */\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we\n // +1 to skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not\n // included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f);\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE\n // PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST\n // RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1\n // 0x00 RETURN JUMPDEST\n // solhint-disable-next-line max-line-length\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be\n * written to by the Execution Manager and State Transitioner. It runs on L1 during the setup and\n * execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT =\n 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH =\n 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE =\n 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner\n * (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from\n \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from\n \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from\n \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is\n iOVM_L1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n address ovmCanonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce =\n iOVM_CanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n _sendXDomainMessage(\n ovmCanonicalTransactionChain,\n l2CrossDomainMessenger,\n xDomainCalldata,\n _gasLimit\n );\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer\n whenNotPaused\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"OVM_CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n )\n override\n public\n {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element =\n iOVM_CanonicalTransactionChain(canonicalTransactionChain).getQueueElement(_queueIndex);\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n address(this),\n l2CrossDomainMessenger,\n _gasLimit,\n _message\n )\n );\n\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n _sendXDomainMessage(\n canonicalTransactionChain,\n l2CrossDomainMessenger,\n xDomainCalldata,\n _gasLimit\n );\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the OVM_CanonicalTransactionChain instance.\n * @param _l2CrossDomainMessenger Address of the OVM_L2CrossDomainMessenger instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n address _l2CrossDomainMessenger,\n bytes memory _message,\n uint256 _gasLimit\n )\n internal\n {\n iOVM_CanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n _l2CrossDomainMessenger,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /// @dev Returns true if and only if the function is running in the constructor\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from\n \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from\n \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n // solhint-disable-next-line max-line-length\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n )\n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from\n \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\n\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from\n \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is\n iOVM_L2CrossDomainMessenger,\n Lib_AddressResolver,\n ReentrancyGuard\n{\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n ReentrancyGuard()\n {}\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" ++ }, ++ "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the\n // OVM_L2CrossDomainMessenger will be relayed by the OVM_L1CrossDomainMessenger.\n // This is enforced by a check in OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_GasPriceOracle is Ownable {\n\n /*************\n * Variables *\n *************/\n\n // Current l2 gas price\n uint256 public gasPrice;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(\n address _owner,\n uint256 _initialGasPrice\n )\n Ownable()\n {\n setGasPrice(_initialGasPrice);\n transferOwnership(_owner);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(\n uint256 _gasPrice\n )\n public\n onlyOwner\n {\n gasPrice = _gasPrice;\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../../libraries/standards/L2StandardERC20.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title OVM_L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2StandardTokenFactory {\n\n event StandardL2TokenCreated(address indexed _l1Token, address indexed _l2Token);\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n external\n {\n require (_l1Token != address(0), \"Must provide L1 token address\");\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_EthUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" ++ }, ++ "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 200 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/4532a57dbcb505a79ddf510df0371b5f.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/4532a57dbcb505a79ddf510df0371b5f.json +deleted file mode 100644 +index f32dd95..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/4532a57dbcb505a79ddf510df0371b5f.json ++++ /dev/null +@@ -1,338 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_CrossDomainMessenger\n */\ninterface iOVM_CrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"../../iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iOVM_CrossDomainMessenger\n )\n {\n return iOVM_CrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/introspection/ERC165Checker.sol\";\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../../libraries/standards/IL2StandardERC20.sol\";\n\n/**\n * @title OVM_L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to enable\n * ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 bridge to release L1 funds.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(\n address _l2CrossDomainMessenger,\n address _l1TokenBridge\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n internal\n {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n _l1Gas,\n message\n );\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l1TokenBridge)\n {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n 0,\n message\n );\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\nimport './iOVM_L1ERC20Bridge.sol';\n\n/**\n * @title iOVM_L1StandardBridge\n */\ninterface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n event ETHDepositInitiated (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH (\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo (\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal (\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ERC20Bridge\n */\ninterface iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20 (\n address _l1Token,\n address _l2Token,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To (\n address _l1Token,\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2ERC20Bridge\n */\ninterface iOVM_L2ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw (\n address _l2Token,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo (\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token.\n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n\n}\n" +- }, +- "@openzeppelin/contracts/introspection/ERC165Checker.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /*\n * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\n */\n bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) &&\n _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n // success determines whether the staticcall succeeded and result determines\n // whether the contract at account indicates support of _interfaceId\n (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\n\n return (success && result);\n }\n\n /**\n * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return success true if the STATICCALL succeeded, false otherwise\n * @return result true if the STATICCALL succeeded and the contract at account\n * indicates support of the interface with identifier interfaceId, false otherwise\n */\n function _callERC165SupportsInterface(address account, bytes4 interfaceId)\n private\n view\n returns (bool, bool)\n {\n bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\n (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\n if (result.length < 32) return (false, false);\n return (success, abi.decode(result, (bool)));\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;\n address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;\n address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;\n address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/IL2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/IERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" +- }, +- "@openzeppelin/contracts/introspection/IERC165.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\nimport { OVM_L2StandardBridge } from \"../bridge/tokens/OVM_L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerFeeVault {\n\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(\n address _l1FeeWallet\n ) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw()\n public\n {\n uint256 balance = OVM_ETH(Lib_PredeployAddresses.OVM_ETH).balanceOf(address(this));\n\n require(\n balance >= MIN_WITHDRAWAL_AMOUNT,\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n OVM_L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../libraries/standards/L2StandardERC20.sol\";\nimport { IWETH9 } from \"../../libraries/standards/IWETH9.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is L2StandardERC20, IWETH9 {\n\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n address(0),\n \"Ether\",\n \"ETH\"\n )\n {}\n\n\n /******************************\n * Custom WETH9 Functionality *\n ******************************/\n fallback() external payable {\n deposit();\n }\n\n /**\n * Implements the WETH9 deposit() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The\n * relevant deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their code.\n */\n function deposit()\n public\n payable\n override\n {\n // Calling deposit() with nonzero value will send the ETH to this contract address. Once recieved here,\n // We transfer it back by sending to the msg.sender.\n _transfer(address(this), msg.sender, msg.value);\n\n emit Deposit(msg.sender, msg.value);\n }\n\n /**\n * Implements the WETH9 withdraw() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The\n * relevant deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their code.\n * @param _wad Amount being withdrawn\n */\n function withdraw(\n uint256 _wad\n )\n external\n override\n {\n // Calling withdraw() with value exceeding the withdrawer's ovmBALANCE should revert, as in WETH9.\n require(balanceOf(msg.sender) >= _wad);\n\n // Other than emitting an event, OVM_ETH already is native ETH, so we don't need to do anything else.\n emit Withdrawal(msg.sender, _wad);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\nimport './IL2StandardERC20.sol';\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public override l1Token;\n address public l2Bridge;\n\n /**\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector\n ^ IL2StandardERC20.mint.selector\n ^ IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public override onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public override onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/IWETH9.sol": { +- "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\n/// @title Interface for WETH9. Also contains the non-ERC20 events normally present in the WETH9 implementation.\ninterface IWETH9 is IERC20 {\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n /// @notice Deposit ether to get wrapped ether\n function deposit() external payable;\n\n /// @notice Withdraw wrapped ether to get ether\n function withdraw(uint256) external;\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/ERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../../utils/Context.sol\";\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20 {\n using SafeMath for uint256;\n\n mapping (address => uint256) private _balances;\n\n mapping (address => mapping (address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n uint8 private _decimals;\n\n /**\n * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n * a default value of 18.\n *\n * To select a different value for {decimals}, use {_setupDecimals}.\n *\n * All three of these values are immutable: they can only be set once during\n * construction.\n */\n constructor (string memory name_, string memory symbol_) public {\n _name = name_;\n _symbol = symbol_;\n _decimals = 18;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n * called.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return _decimals;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\n return true;\n }\n\n /**\n * @dev Moves tokens `amount` from `sender` to `recipient`.\n *\n * This is internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply = _totalSupply.add(amount);\n _balances[account] = _balances[account].add(amount);\n emit Transfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n _totalSupply = _totalSupply.sub(amount);\n emit Transfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Sets {decimals} to a value other than the default one of 18.\n *\n * WARNING: This function should only be called from the constructor. Most\n * applications that interact with token contracts will not expect\n * {decimals} to ever change, and may work incorrectly if it does.\n */\n function _setupDecimals(uint8 decimals_) internal virtual {\n _decimals = decimals_;\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be to transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Context.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" +- }, +- "@openzeppelin/contracts/math/SafeMath.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/SafeERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using SafeMath for uint256;\n using Address for address;\n\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n // solhint-disable-next-line max-line-length\n require((value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) { // Return data is optional\n // solhint-disable-next-line max-line-length\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Address.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\";\n\n/**\n * @title OVM_L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2.\n * It synchronizes a corresponding L2 Bridge, informing it of deposits, and listening to it for newly finalized withdrawals.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {\n using SafeMath for uint;\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping (address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(\n address _l1messenger,\n address _l2TokenBridge\n )\n public\n {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /// @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious contract via initcode, but it takes care of the user error we want to avoid.\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive()\n external\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n 1_300_000,\n bytes(\"\")\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETH(\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n {\n _initiateETHDeposit(\n msg.sender,\n _to,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n )\n internal\n {\n // Construct calldata for finalizeDeposit call\n bytes memory message =\n abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyEOA()\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n internal\n {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future withdrawals.\n // safeTransferFrom also checks if the contract has code, so this will fail if _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(\n _from,\n address(this),\n _amount\n );\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n (bool success, ) = _to.call{value: _amount}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer.\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract\n */\n function donateETH() external payable {}\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ECDSAContractAccount.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\n\n/* External Imports */\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { ECDSA } from \"@openzeppelin/contracts/cryptography/ECDSA.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by\n * providing EIP155 formatted transaction encodings.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*************\n * Constants *\n *************/\n\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * No-op fallback mirrors behavior of calling an EOA on L1.\n */\n fallback()\n external\n payable\n {\n return;\n }\n\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(\n bytes32 hash,\n bytes memory signature\n )\n public\n view\n returns (\n bytes4 magicValue\n )\n {\n return ECDSA.recover(hash, signature) == address(this) ?\n this.isValidSignature.selector :\n bytes4(0);\n }\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EIP155 transaction.\n * @return Whether or not the call returned (rather than reverted).\n * @return Data returned by the call.\n */\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n override\n public\n returns (\n bool,\n bytes memory\n )\n {\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n require(\n _transaction.sender() == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n require(\n _transaction.chainId == Lib_ExecutionManagerWrapper.ovmCHAINID(),\n \"Transaction signed with wrong chain ID\"\n );\n\n // Need to make sure that the transaction nonce is right.\n require(\n _transaction.nonce == Lib_ExecutionManagerWrapper.ovmGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for mainnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // require(\n // gasleft() >= SafeMath.add(transaction.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n require(\n OVM_ETH(Lib_PredeployAddresses.OVM_ETH).transfer(\n Lib_PredeployAddresses.SEQUENCER_FEE_WALLET,\n SafeMath.mul(_transaction.gasLimit, _transaction.gasPrice)\n ),\n \"Fee was not transferred to relayer.\"\n );\n\n if (_transaction.isCreate) {\n // TEMPORARY: Disable value transfer for contract creations.\n require(\n _transaction.value == 0,\n \"Value transfer in contract creation not supported.\"\n );\n\n (address created, bytes memory revertdata) = Lib_ExecutionManagerWrapper.ovmCREATE(\n _transaction.data\n );\n\n // Return true if the contract creation succeeded, false w/ revertdata otherwise.\n if (created != address(0)) {\n return (true, abi.encode(created));\n } else {\n return (false, revertdata);\n }\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_ExecutionManagerWrapper.ovmINCREMENTNONCE();\n\n // NOTE: Upgrades are temporarily disabled because users can, in theory, modify their EOA\n // so that they don't have to pay any fees to the sequencer. Function will remain disabled\n // until a robust solution is in place.\n require(\n _transaction.to != Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Calls to self are disabled until upgradability is re-enabled.\"\n );\n\n return _transaction.to.call{value: _transaction.value}(_transaction.data);\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ECDSAContractAccount.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam;\n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate;\n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes('');\n raw[8] = Lib_RLPWriter.writeBytes('');\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ErrorUtils } from \"../utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title Lib_ExecutionManagerWrapper\n * @dev This library acts as a utility for easily calling the OVM_ExecutionManagerWrapper, the\n * predeployed contract which exposes the `kall` builtin. Effectively, this contract allows the\n * user to trigger OVM opcodes by directly calling the OVM_ExecutionManger.\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\nlibrary Lib_ExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Performs a safe ovmCREATE call.\n * @param _bytecode Code for the new contract.\n * @return Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address, bytes));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return Result of calling ovmGETNONCE.\n */\n function ovmGETNONCE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmINCREMENTNONCE call.\n */\n function ovmINCREMENTNONCE()\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmINCREMENTNONCE()\"\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Calls the ovmL1TXORIGIN opcode.\n * @return Address that sent this message from L1.\n */\n function ovmL1TXORIGIN()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmL1TXORIGIN()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the ovmCHAINID opcode.\n * @return Chain ID of the current network.\n */\n function ovmCHAINID()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return Result of calling ovmADDRESS.\n */\n function ovmADDRESS()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the value-enabled ovmCALL opcode.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,uint256,bytes)\",\n _gasLimit,\n _address,\n _value,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Calls the ovmBALANCE opcode.\n * @param _address OVM account to query the balance of.\n * @return Balance of the account.\n */\n function ovmBALANCE(\n address _address\n )\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmBALANCE(address)\",\n _address\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Calls the ovmCALLVALUE opcode.\n * @return Value of the current call frame.\n */\n function ovmCALLVALUE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALLVALUE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return Data sent back by the OVM_ExecutionManager.\n */\n function _callWrapperContract(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory\n )\n {\n (bool success, bytes memory returndata) = Lib_PredeployAddresses.EXECUTION_MANAGER_WRAPPER.delegatecall(_calldata);\n\n if (success == true) {\n return returndata;\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/cryptography/ECDSA.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n // Check the signature length\n if (signature.length != 65) {\n revert(\"ECDSA: invalid signature length\");\n }\n\n // Divide the signature in r, s and v variables\n bytes32 r;\n bytes32 s;\n uint8 v;\n\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n\n return recover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"ECDSA: invalid signature 's' value\");\n require(v == 27 || v == 28, \"ECDSA: invalid signature 'v' value\");\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n require(signer != address(0), \"ECDSA: invalid signature\");\n\n return signer;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * replicates the behavior of the\n * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\n * JSON-RPC method.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ProxyEOA.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable\n * 'account abstraction' on layer 2.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ProxyEOA {\n\n /**********\n * Events *\n **********/\n\n event Upgraded(\n address indexed implementation\n );\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; //bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1);\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n (bool success, bytes memory returndata) = getImplementation().delegatecall(msg.data);\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n\n // WARNING: We use the deployed bytecode of this contract as a template to create ProxyEOA\n // contracts. As a result, we must *not* perform any constructor logic. Use initialization\n // functions if necessary.\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the implementation address.\n * @param _implementation New implementation address.\n */\n function upgrade(\n address _implementation\n )\n external\n {\n require(\n msg.sender == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"EOAs can only upgrade their own EOA implementation.\"\n );\n\n _setImplementation(_implementation);\n emit Upgraded(_implementation);\n }\n\n /**\n * Gets the address of the current implementation.\n * @return Current implementation address.\n */\n function getImplementation()\n public\n view\n returns (\n address\n )\n {\n bytes32 addr32;\n assembly {\n addr32 := sload(IMPLEMENTATION_KEY)\n }\n\n address implementation = Lib_Bytes32Utils.toAddress(addr32);\n if (implementation == address(0)) {\n return Lib_PredeployAddresses.ECDSA_CONTRACT_ACCOUNT;\n } else {\n return implementation;\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n bytes32 addr32 = Lib_Bytes32Utils.fromAddress(_implementation);\n assembly {\n sstore(IMPLEMENTATION_KEY, addr32)\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by\n * any account. It accepts a more efficient compressed calldata format, which it decompresses and\n * encodes to the standard EIP155 transaction format.\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerEntrypoint {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Expects an RLP-encoded EIP155 transaction as input. See the EIP for a more detailed\n * description of this transaction format:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\n fallback()\n external\n {\n // We use this twice, so it's more gas efficient to store a copy of it (barely).\n bytes memory encodedTx = msg.data;\n\n // Decode the tx with the correct chain ID.\n Lib_EIP155Tx.EIP155Tx memory transaction = Lib_EIP155Tx.decode(\n encodedTx,\n Lib_ExecutionManagerWrapper.ovmCHAINID()\n );\n\n // Value is computed on the fly. Keep it in the stack to save some gas.\n address target = transaction.sender();\n\n bool isEmptyContract;\n assembly {\n isEmptyContract := iszero(extcodesize(target))\n }\n\n // If the account is empty, deploy the default EOA to that address.\n if (isEmptyContract) {\n Lib_ExecutionManagerWrapper.ovmCREATEEOA(\n transaction.hash(),\n transaction.recoveryParam,\n transaction.r,\n transaction.s\n );\n }\n\n // Forward the transaction over to the EOA.\n (bool success, bytes memory returndata) = target.call(\n abi.encodeWithSelector(iOVM_ECDSAContractAccount.execute.selector, transaction)\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" +- }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_start >= _bytes.length) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n external\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n external\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n external\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n enum MessageType {\n ovmCALL,\n ovmSTATICCALL,\n ovmDELEGATECALL,\n ovmCREATE,\n ovmCREATE2\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n uint256 ovmCALLVALUE;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmCALLVALUE() external view returns (uint _callValue);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n // Valueless ovmCALL for maintaining backwards compatibility with legacy OVM bytecode.\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmCALL(uint256 _gasLimit, address _address, uint256 _value, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /*********************\n * ETH Value Opcodes *\n *********************/\n\n function ovmBALANCE(address _contract) external returns (uint256 _balance);\n function ovmSELFBALANCE() external returns (uint256 _balance);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string indexed _name,\n address _newAddress,\n address _oldAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n external\n onlyOwner\n {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(\n _name,\n _address,\n oldAddress\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n external\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +- }, +- "@openzeppelin/contracts/access/Ownable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) == _getNodeKey(lastNode).length\n && keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(\n TrieNode memory _node,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" +- }, +- "contracts/test-helpers/Mock_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-SCC-batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping (uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n Buffer storage _self,\n bytes32 _value\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n Buffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n Buffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n Buffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n Buffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(\n Buffer storage _self,\n BufferContext memory _ctx\n )\n internal\n {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(\n Buffer storage _self\n )\n internal\n view\n returns (\n BufferContext memory\n )\n {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n return BufferContext({\n length: length,\n extraData: extraData\n });\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../optimistic-ethereum/libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index\n );\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n public\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function setExtraData(\n bytes27 _extraData\n )\n public\n {\n return buf.setExtraData(\n _extraData\n );\n }\n\n function getExtraData()\n public\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /**************************\n * Native Value Constants *\n **************************/\n\n // Public so we can access and make assertions in integration tests.\n uint256 public constant CALL_WITH_VALUE_INTRINSIC_GAS = 90000;\n\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n\n /*************************************\n * Container Contract Address Prefix *\n *************************************/\n\n /**\n * @dev The Execution Manager and State Manager each have this 30 byte prefix, and are uncallable.\n */\n address constant CONTAINER_CONTRACT_PREFIX = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n external\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n 0,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n external\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides CALLVALUE.\n * @return _CALLVALUE Value sent along with the call according to the current message context.\n */\n function ovmCALLVALUE()\n override\n public\n view\n returns (\n uint256 _CALLVALUE\n )\n {\n return messageContext.ovmCALLVALUE;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n external\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n external\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n external\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n external\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n external\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n external\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n external\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE2\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n external\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n external\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n Lib_PredeployAddresses.PROXY_EOA,\n 0,\n ovmEXTCODESIZE(Lib_PredeployAddresses.PROXY_EOA)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.ovmCALLVALUE = _value;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmCALL\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static, valueless context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n nextMessageContext.ovmCALLVALUE = 0;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmSTATICCALL\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmDELEGATECALL\n );\n }\n\n /**\n * @notice Legacy ovmCALL function which did not support ETH value; this maintains backwards compatibility.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n returns(\n bool _success,\n bytes memory _returndata\n )\n {\n // Legacy ovmCALL assumed always-0 value.\n return ovmCALL(\n _gasLimit,\n _address,\n 0,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n external\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n external\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n _length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n external\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /***************************************\n * Public Functions: ETH Value Opcodes *\n ***************************************/\n\n /**\n * @notice Overrides BALANCE.\n * NOTE: In the future, this could be optimized to directly invoke EM._getContractStorage(...).\n * @param _contract Address of the contract to query the OVM_ETH balance of.\n * @return _BALANCE OVM_ETH balance of the requested contract.\n */\n function ovmBALANCE(\n address _contract\n )\n override\n public\n returns (\n uint256 _BALANCE\n )\n {\n // Easiest way to get the balance is query OVM_ETH as normal.\n bytes memory balanceOfCalldata = abi.encodeWithSignature(\n \"balanceOf(address)\",\n _contract\n );\n\n // Static call because this should be a read-only query.\n (bool success, bytes memory returndata) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n balanceOfCalldata\n );\n\n // All balanceOf queries should successfully return a uint, otherwise this must be an OOG.\n if (!success || returndata.length != 32) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // Return the decoded balance.\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * @notice Overrides SELFBALANCE.\n * @return _BALANCE OVM_ETH balance of the requesting contract.\n */\n function ovmSELFBALANCE()\n override\n external\n returns (\n uint256 _BALANCE\n )\n {\n return ovmBALANCE(ovmADDRESS());\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.DEPLOYER_WHITELIST,\n abi.encodeWithSelector(\n OVM_DeployerWhitelist.isDeployerAllowed.selector,\n _deployerAddress\n )\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode,\n MessageType _messageType\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n _messageType\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata,\n MessageType _messageType\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(CONTAINER_CONTRACT_PREFIX)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n _messageType\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message. NOTE: this argument is overwritten in some cases to avoid stack-too-deep.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _messageType What type of ovmOPCODE this message corresponds to.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n // NOTE: this argument is overwritten in some cases to avoid stack-too-deep.\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n MessageType _messageType\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n uint256 messageValue = _nextMessageContext.ovmCALLVALUE;\n // If there is value in this message, we need to transfer the ETH over before switching contexts.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n ) {\n // Handle out-of-intrinsic gas consistent with EVM behavior -- the subcall \"appears to revert\" if we don't have enough gas to transfer the ETH.\n // Similar to dynamic gas cost of value exceeding gas here:\n // https://github.com/ethereum/go-ethereum/blob/c503f98f6d5e80e079c1d8a3601d188af2a899da/core/vm/interpreter.go#L268-L273\n if (gasleft() < CALL_WITH_VALUE_INTRINSIC_GAS) {\n return (false, hex\"\");\n }\n\n // If there *is* enough gas to transfer ETH, then we need to make sure this amount of gas is reserved (i.e. not\n // given to the _contract.call below) to guarantee that _handleExternalMessage can't run out of gas.\n // In particular, in the event that the call fails, we will need to transfer the ETH back to the sender.\n // Taking the lesser of _gasLimit and gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS guarantees that the second\n // _attemptForcedEthTransfer below, if needed, always has enough gas to succeed.\n _gasLimit = Math.min(\n _gasLimit,\n gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS // Cannot overflow due to the above check.\n );\n\n // Now transfer the value of the call.\n // The target is interpreted to be the next message's ovmADDRESS account.\n bool transferredOvmEth = _attemptForcedEthTransfer(\n _nextMessageContext.ovmADDRESS,\n messageValue\n );\n\n // If the ETH transfer fails (should only be possible in the case of insufficient balance), then treat this as a revert.\n // This mirrors EVM behavior, see https://github.com/ethereum/go-ethereum/blob/2dee31930c9977af2a9fcb518fb9838aa609a7cf/core/vm/evm.go#L298\n if (!transferredOvmEth) {\n return (false, hex\"\");\n }\n }\n\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreateType(_messageType)) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call{gas: _gasLimit}(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // If the message threw an exception, its value should be returned back to the sender.\n // So, we force it back, BEFORE returning the messageContext to the previous addresses.\n // This operation is part of the reason we \"reserved the intrinsic gas\" above.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n && !success\n ) {\n bool transferredOvmEth = _attemptForcedEthTransfer(\n prevMessageContext.ovmADDRESS,\n messageValue\n );\n\n // Since we transferred it in above and the call reverted, the transfer back should always pass.\n // This code path should NEVER be triggered since we sent `messageValue` worth of OVM_ETH into the target\n // and reserved sufficient gas to execute the transfer, but in case there is some edge case which has\n // been missed, we revert the entire frame (and its parent) to make sure the ETH gets sent back.\n if (!transferredOvmEth) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n }\n\n // Switch back to the original message context now that we're out of the call and all OVM_ETH is in the right place.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. Additionally, we surface custom error messages\n // to developers in the case of unsafe creations for improved devex.\n // All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: Value Manipulation *\n ******************************************/\n\n /**\n * Invokes an ovmCALL to OVM_ETH.transfer on behalf of the current ovmADDRESS, allowing us to force movement of OVM_ETH in correspondence with ETH's native value functionality.\n * WARNING: this will send on behalf of whatever the messageContext.ovmADDRESS is in storage at the time of the call.\n * NOTE: In the future, this could be optimized to directly invoke EM._setContractStorage(...).\n * @param _to Amount of OVM_ETH to be sent.\n * @param _value Amount of OVM_ETH to send.\n * @return _success Whether or not the transfer worked.\n */\n function _attemptForcedEthTransfer(\n address _to,\n uint256 _value\n )\n internal\n returns(\n bool _success\n )\n {\n bytes memory transferCalldata = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n _to,\n _value\n );\n\n // OVM_ETH inherits from the UniswapV2ERC20 standard. In this implementation, its return type\n // is a boolean. However, the implementation always returns true if it does not revert.\n // Thus, success of the call frame is sufficient to infer success of the transfer itself.\n (bool success, ) = ovmCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n 0,\n transferCalldata\n );\n\n return success;\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // These conditionals allow us to avoid unneccessary SSTOREs. However, they do mean that the current storage\n // value for the messageContext MUST equal the _prevMessageContext argument, or an SSTORE might be erroneously skipped.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n\n if (_prevMessageContext.ovmCALLVALUE != _nextMessageContext.ovmCALLVALUE) {\n messageContext.ovmCALLVALUE = _nextMessageContext.ovmCALLVALUE;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************************\n * Internal Functions: Message Typechecks *\n ******************************************/\n\n /**\n * Returns whether or not the given message type is a CREATE-type.\n * @param _messageType the message type in question.\n */\n function _isCreateType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n return (\n _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n /**\n * Returns whether or not the given message type (potentially) requires the transfer of ETH value along with the message.\n * @param _messageType the message type in question.\n */\n function _isValueType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n // ovmSTATICCALL and ovmDELEGATECALL types do not accept or transfer value.\n return (\n _messageType == MessageType.ovmCALL\n || _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n * @param _value the amount of ETH value to send.\n * @param _ovmStateManager the address of the OVM_StateManager precompile in the L2 state.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n uint256 _value,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n // Initialize the EM's internal state, ignoring nuisance gas.\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n // Set the ovmADDRESS to the _from so that the subsequent call frame \"comes from\" them.\n messageContext.ovmADDRESS = _from;\n\n // Execute the desired message.\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return abi.encode(false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return abi.encode(true, Lib_EthUtils.getCode(created));\n }\n } else {\n (bool success, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _value,\n _transaction.data\n );\n return abi.encode(success, returndata);\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/math/Math.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n external\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n external\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n external\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n external\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" +- }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is\n iOVM_L1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n address ovmCanonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = iOVM_CanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n _sendXDomainMessage(ovmCanonicalTransactionChain, l2CrossDomainMessenger, xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer\n whenNotPaused\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n require(\n _target != resolve(\"OVM_CanonicalTransactionChain\"),\n \"Cannot send L2->L1 messages to L1 system contracts.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n )\n override\n public\n {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = iOVM_CanonicalTransactionChain(canonicalTransactionChain).getQueueElement(_queueIndex);\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n address(this),\n l2CrossDomainMessenger,\n _gasLimit,\n _message\n )\n );\n\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n _sendXDomainMessage(canonicalTransactionChain, l2CrossDomainMessenger, xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the OVM_CanonicalTransactionChain instance.\n * @param _l2CrossDomainMessenger Address of the OVM_L2CrossDomainMessenger instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n address _l2CrossDomainMessenger,\n bytes memory _message,\n uint256 _gasLimit\n )\n internal\n {\n iOVM_CanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n _l2CrossDomainMessenger,\n _gasLimit,\n _message\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/bridge/Lib_CrossDomainUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /// @dev Returns true if and only if the function is running in the constructor\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n ) \n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is\n iOVM_L2CrossDomainMessenger,\n Lib_AddressResolver,\n ReentrancyGuard\n{\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) ReentrancyGuard() {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" +- }, +- "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger\n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in\n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_GasPriceOracle is Ownable {\n\n /*************\n * Variables *\n *************/\n\n // Current l2 gas price\n uint256 public gasPrice;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(\n address _owner,\n uint256 _initialGasPrice\n )\n Ownable()\n {\n setGasPrice(_initialGasPrice);\n transferOwnership(_owner);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(\n uint256 _gasPrice\n )\n public\n onlyOwner\n {\n gasPrice = _gasPrice;\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_EthUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 200 +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "storageLayout", +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- }, +- "metadata": { +- "useLiteralContent": true +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/475653b7e5822844bbc8885f604f5e79.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/475653b7e5822844bbc8885f604f5e79.json +deleted file mode 100644 +index 6fb6e27..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/475653b7e5822844bbc8885f604f5e79.json ++++ /dev/null +@@ -1,41 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iL1ChugSplashDeployer\n */\ninterface iL1ChugSplashDeployer {\n function isUpgrading() external view returns (bool);\n}\n" +- }, +- "contracts/L1/deployment/ChugSplashDictator.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { L1ChugSplashProxy } from \"../../chugsplash/L1ChugSplashProxy.sol\";\nimport { iL1ChugSplashDeployer } from \"../../chugsplash/interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title ChugSplashDictator\n * @dev Like the AddressDictator, but specifically for the Proxy__OVM_L1StandardBridge. We're\n * working on a generalized version of this but this is good enough for the moment.\n */\ncontract ChugSplashDictator is iL1ChugSplashDeployer {\n /*************\n * Variables *\n *************/\n\n bool public isUpgrading = true;\n L1ChugSplashProxy public target;\n address public finalOwner;\n bytes32 public codeHash;\n bytes32 public messengerSlotKey;\n bytes32 public messengerSlotVal;\n bytes32 public bridgeSlotKey;\n bytes32 public bridgeSlotVal;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n L1ChugSplashProxy _target,\n address _finalOwner,\n bytes32 _codeHash,\n bytes32 _messengerSlotKey,\n bytes32 _messengerSlotVal,\n bytes32 _bridgeSlotKey,\n bytes32 _bridgeSlotVal\n ) {\n target = _target;\n finalOwner = _finalOwner;\n codeHash = _codeHash;\n messengerSlotKey = _messengerSlotKey;\n messengerSlotVal = _messengerSlotVal;\n bridgeSlotKey = _bridgeSlotKey;\n bridgeSlotVal = _bridgeSlotVal;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function doActions(bytes memory _code) external {\n require(keccak256(_code) == codeHash, \"ChugSplashDictator: Incorrect code hash.\");\n\n target.setCode(_code);\n target.setStorage(messengerSlotKey, messengerSlotVal);\n target.setStorage(bridgeSlotKey, bridgeSlotVal);\n target.setOwner(finalOwner);\n }\n\n /**\n * Transfers ownership of this contract to the finalOwner.\n * Only callable by the finalOwner, which is intended to be our multisig.\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can\n * recover if something really surprising goes wrong.\n */\n function returnOwnership() external {\n require(msg.sender == finalOwner, \"ChugSplashDictator: only callable by finalOwner\");\n\n target.setOwner(finalOwner);\n }\n}\n" +- }, +- "contracts/chugsplash/L1ChugSplashProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport { iL1ChugSplashDeployer } from \"./interfaces/iL1ChugSplashDeployer.sol\";\n\n/**\n * @title L1ChugSplashProxy\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\n *\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\n * you're doing. Anything public can potentially have a function signature that conflicts with a\n * signature attached to the implementation contract. Public functions SHOULD always have the\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\n */\ncontract L1ChugSplashProxy {\n /*************\n * Constants *\n *************/\n\n // \"Magic\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\n // appended bytecode will be deployed as given.\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\n\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n bytes32 internal constant IMPLEMENTATION_KEY =\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\n bytes32 internal constant OWNER_KEY =\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the initial contract owner.\n */\n constructor(address _owner) {\n _setOwner(_owner);\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks a function from being called when the parent signals that the system should be paused\n * via an isUpgrading function.\n */\n modifier onlyWhenNotPaused() {\n address owner = _getOwner();\n\n // We do a low-level call because there's no guarantee that the owner actually *is* an\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\n // it turns out that it isn't the right type of contract.\n (bool success, bytes memory returndata) = owner.staticcall(\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\n );\n\n // If the call was unsuccessful then we assume that there's no \"isUpgrading\" method and we\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\n // long. If this isn't the case then we can safely ignore the result.\n if (success && returndata.length == 32) {\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\n // case that the isUpgrading function returned something other than 0 or 1. But we only\n // really care about the case where this value is 0 (= false).\n uint256 ret = abi.decode(returndata, (uint256));\n require(ret == 0, \"L1ChugSplashProxy: system is currently being upgraded\");\n }\n\n _;\n }\n\n /**\n * Makes a proxy call instead of triggering the given function when the caller is either the\n * owner or the zero address. Caller can only ever be the zero address if this function is\n * being called off-chain via eth_call, which is totally fine and can be convenient for\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\n * and the proxy function ends up being called instead of the implementation one.\n *\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\n * we have much bigger problems. Primary reason to include this additional allowed sender is\n * because the owner address can be changed dynamically and we do not want clients to have to\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\n * proxied contract.\n */\n modifier proxyCallIfNotOwner() {\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\n _;\n } else {\n // This WILL halt the call frame on completion.\n _doProxyCall();\n }\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n // Proxy call by default.\n _doProxyCall();\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\n * different from the standard proxy scheme where one would typically deploy the code\n * separately and then set the implementation address. We're doing it this way because it gives\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\n * @param _code New contract code to run inside this contract.\n */\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\n // Get the code hash of the current implementation.\n address implementation = _getImplementation();\n\n // If the code hash matches the new implementation then we return early.\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\n return;\n }\n\n // Create the deploycode by appending the magic prefix.\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\n\n // Deploy the code and set the new implementation address.\n address newImplementation;\n assembly {\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\n }\n\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\n // actually fail this check. Should only happen if the contract creation from above runs\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\n // should be doing this check anyway though.\n require(\n _getAccountCodeHash(newImplementation) == keccak256(_code),\n \"L1ChugSplashProxy: code was not correctly deployed.\"\n );\n\n _setImplementation(newImplementation);\n }\n\n /**\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\n * upgrades in a more transparent way. Only callable by the owner.\n * @param _key Storage key to modify.\n * @param _value New value for the storage key.\n */\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\n assembly {\n sstore(_key, _value)\n }\n }\n\n /**\n * Changes the owner of the proxy contract. Only callable by the owner.\n * @param _owner New owner of the proxy contract.\n */\n function setOwner(address _owner) public proxyCallIfNotOwner {\n _setOwner(_owner);\n }\n\n /**\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Owner address.\n */\n function getOwner() public proxyCallIfNotOwner returns (address) {\n return _getOwner();\n }\n\n /**\n * Queries the implementation address. Can only be called by the owner OR by making an\n * eth_call and setting the \"from\" address to address(0).\n * @return Implementation address.\n */\n function getImplementation() public proxyCallIfNotOwner returns (address) {\n return _getImplementation();\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Sets the implementation address.\n * @param _implementation New implementation address.\n */\n function _setImplementation(address _implementation) internal {\n assembly {\n sstore(IMPLEMENTATION_KEY, _implementation)\n }\n }\n\n /**\n * Queries the implementation address.\n * @return Implementation address.\n */\n function _getImplementation() internal view returns (address) {\n address implementation;\n assembly {\n implementation := sload(IMPLEMENTATION_KEY)\n }\n return implementation;\n }\n\n /**\n * Changes the owner of the proxy contract.\n * @param _owner New owner of the proxy contract.\n */\n function _setOwner(address _owner) internal {\n assembly {\n sstore(OWNER_KEY, _owner)\n }\n }\n\n /**\n * Queries the owner of the proxy contract.\n * @return Owner address.\n */\n function _getOwner() internal view returns (address) {\n address owner;\n assembly {\n owner := sload(OWNER_KEY)\n }\n return owner;\n }\n\n /**\n * Gets the code hash for a given account.\n * @param _account Address of the account to get a code hash for.\n * @return Code hash for the account.\n */\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_account)\n }\n return codeHash;\n }\n\n /**\n * Performs the proxy call via a delegatecall.\n */\n function _doProxyCall() internal onlyWhenNotPaused {\n address implementation = _getImplementation();\n\n require(implementation != address(0), \"L1ChugSplashProxy: implementation is not set yet\");\n\n assembly {\n // Copy calldata into memory at 0x0....calldatasize.\n calldatacopy(0x0, 0x0, calldatasize())\n\n // Perform the delegatecall, make sure to pass all available gas.\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\n\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\n // overwrite the calldata that we just copied into memory but that doesn't really\n // matter because we'll be returning in a second anyway.\n returndatacopy(0x0, 0x0, returndatasize())\n\n // Success == 0 means a revert. We'll revert too and pass the data up.\n if iszero(success) {\n revert(0x0, returndatasize())\n }\n\n // Otherwise we'll just return and pass the data up.\n return(0x0, returndatasize())\n }\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 10000 +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "storageLayout", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- }, +- "metadata": { +- "useLiteralContent": true +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/7531d7762a77038a37e7490a7b4b176f.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/5da50938d6cae881cc2f74b183125883.json +similarity index 99% +rename from node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/7531d7762a77038a37e7490a7b4b176f.json +rename to node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/5da50938d6cae881cc2f74b183125883.json +index e026414..37ffd37 100644 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/7531d7762a77038a37e7490a7b4b176f.json ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/5da50938d6cae881cc2f74b183125883.json +@@ -13,6 +13,10 @@ + "enabled": true, + "runs": 200 + }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, + "outputSelection": { + "*": { + "*": [ +@@ -30,9 +34,6 @@ + "ast" + ] + } +- }, +- "metadata": { +- "useLiteralContent": true + } + } + } +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/ef3f334bac4d7e77d91b457a0d89ab0a.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/ef3f334bac4d7e77d91b457a0d89ab0a.json +deleted file mode 100644 +index dfd9195..0000000 +--- a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/ef3f334bac4d7e77d91b457a0d89ab0a.json ++++ /dev/null +@@ -1,338 +0,0 @@ +-{ +- "language": "Solidity", +- "sources": { +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_CrossDomainMessenger\n */\ninterface iOVM_CrossDomainMessenger {\n\n /**********\n * Events *\n **********/\n\n event SentMessage(bytes message);\n event RelayedMessage(bytes32 msgHash);\n event FailedRelayedMessage(bytes32 msgHash);\n\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/bridge/OVM_CrossDomainEnabled.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"../../iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title OVM_CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract OVM_CrossDomainEnabled {\n\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(\n address _messenger\n ) {\n messenger = _messenger;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(\n address _sourceDomainAccount\n ) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n \"OVM_XCHAIN: messenger contract unauthenticated\"\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n \"OVM_XCHAIN: wrong sender of cross-domain message\"\n );\n\n _;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (\n iOVM_CrossDomainMessenger\n )\n {\n return iOVM_CrossDomainMessenger(messenger);\n }\n\n /**\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n )\n internal\n {\n getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\n\n/* Library Imports */\nimport { ERC165Checker } from \"@openzeppelin/contracts/introspection/ERC165Checker.sol\";\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { IL2StandardERC20 } from \"../../../libraries/standards/IL2StandardERC20.sol\";\n\n/**\n * @title OVM_L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to enable\n * ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 bridge to release L1 funds.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(\n address _l2CrossDomainMessenger,\n address _l1TokenBridge\n )\n OVM_CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n internal\n {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n _l1Gas,\n message\n );\n\n emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc iOVM_L2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyFromCrossDomainAccount(l1TokenBridge)\n {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(\n l1TokenBridge,\n 0,\n message\n );\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\nimport './iOVM_L1ERC20Bridge.sol';\n\n/**\n * @title iOVM_L1StandardBridge\n */\ninterface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n event ETHDepositInitiated (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized (\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n \n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH (\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo (\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token.\n * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal (\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L1ERC20Bridge\n */\ninterface iOVM_L1ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20 (\n address _l1Token,\n address _l2Token,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To (\n address _l1Token,\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external;\n\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title iOVM_L2ERC20Bridge\n */\ninterface iOVM_L2ERC20Bridge {\n\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed (\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw (\n address _l2Token,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo (\n address _l2Token,\n address _to,\n uint _amount,\n uint32 _l1Gas,\n bytes calldata _data\n )\n external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token.\n * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit (\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint _amount,\n bytes calldata _data\n )\n external;\n\n}\n" +- }, +- "@openzeppelin/contracts/introspection/ERC165Checker.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /*\n * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\n */\n bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) &&\n _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n // success determines whether the staticcall succeeded and result determines\n // whether the contract at account indicates support of _interfaceId\n (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\n\n return (success && result);\n }\n\n /**\n * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return success true if the STATICCALL succeeded, false otherwise\n * @return result true if the STATICCALL succeeded and the contract at account\n * indicates support of the interface with identifier interfaceId, false otherwise\n */\n function _callERC165SupportsInterface(address account, bytes4 interfaceId)\n private\n view\n returns (bool, bool)\n {\n bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\n (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\n if (result.length < 32) return (false, false);\n return (success, abi.decode(result, (bool)));\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/constants/Lib_PredeployAddresses.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;\n address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;\n address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;\n address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;\n address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;\n address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;\n address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;\n address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;\n address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/IL2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/introspection/IERC165.sol\";\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/IERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" +- }, +- "@openzeppelin/contracts/introspection/IERC165.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerFeeVault.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\nimport { OVM_L2StandardBridge } from \"../bridge/tokens/OVM_L2StandardBridge.sol\";\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerFeeVault {\n\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(\n address _l1FeeWallet\n ) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw()\n public\n {\n uint256 balance = OVM_ETH(Lib_PredeployAddresses.OVM_ETH).balanceOf(address(this));\n\n require(\n balance >= MIN_WITHDRAWAL_AMOUNT,\n \"OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount\"\n );\n\n OVM_L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n balance,\n 0,\n bytes(\"\")\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { L2StandardERC20 } from \"../../libraries/standards/L2StandardERC20.sol\";\nimport { IWETH9 } from \"../../libraries/standards/IWETH9.sol\";\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ETH is L2StandardERC20, IWETH9 {\n\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n address(0),\n \"Ether\",\n \"ETH\"\n )\n {}\n\n\n /******************************\n * Custom WETH9 Functionality *\n ******************************/\n fallback() external payable {\n deposit();\n }\n\n /**\n * Implements the WETH9 deposit() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The\n * relevant deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their code.\n */\n function deposit()\n public\n payable\n override\n {\n // Calling deposit() with nonzero value will send the ETH to this contract address. Once recieved here,\n // We transfer it back by sending to the msg.sender.\n _transfer(address(this), msg.sender, msg.value);\n\n emit Deposit(msg.sender, msg.value);\n }\n\n /**\n * Implements the WETH9 withdraw() function as a no-op.\n * WARNING: this function does NOT have to do with cross-chain asset bridging. The\n * relevant deposit and withdraw functions for that use case can be found at L2StandardBridge.sol.\n * This function allows developers to treat OVM_ETH as WETH without any modifications to their code.\n * @param _wad Amount being withdrawn\n */\n function withdraw(\n uint256 _wad\n )\n external\n override\n {\n // Calling withdraw() with value exceeding the withdrawer's ovmBALANCE should revert, as in WETH9.\n require(balanceOf(msg.sender) >= _wad);\n\n // Other than emitting an event, OVM_ETH already is native ETH, so we don't need to do anything else.\n emit Withdrawal(msg.sender, _wad);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/L2StandardERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.5.16 <0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\nimport './IL2StandardERC20.sol';\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public override l1Token;\n address public l2Bridge;\n\n /**\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol\n )\n ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n }\n\n modifier onlyL2Bridge {\n require(msg.sender == l2Bridge, \"Only L2 Bridge can mint and burn\");\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(keccak256(\"supportsInterface(bytes4)\")); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector\n ^ IL2StandardERC20.mint.selector\n ^ IL2StandardERC20.burn.selector;\n return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public override onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public override onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/standards/IWETH9.sol": { +- "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\n/// @title Interface for WETH9. Also contains the non-ERC20 events normally present in the WETH9 implementation.\ninterface IWETH9 is IERC20 {\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n /// @notice Deposit ether to get wrapped ether\n function deposit() external payable;\n\n /// @notice Withdraw wrapped ether to get ether\n function withdraw(uint256) external;\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/ERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../../utils/Context.sol\";\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20 {\n using SafeMath for uint256;\n\n mapping (address => uint256) private _balances;\n\n mapping (address => mapping (address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n uint8 private _decimals;\n\n /**\n * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n * a default value of 18.\n *\n * To select a different value for {decimals}, use {_setupDecimals}.\n *\n * All three of these values are immutable: they can only be set once during\n * construction.\n */\n constructor (string memory name_, string memory symbol_) public {\n _name = name_;\n _symbol = symbol_;\n _decimals = 18;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n * called.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return _decimals;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\n return true;\n }\n\n /**\n * @dev Moves tokens `amount` from `sender` to `recipient`.\n *\n * This is internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply = _totalSupply.add(amount);\n _balances[account] = _balances[account].add(amount);\n emit Transfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n _totalSupply = _totalSupply.sub(amount);\n emit Transfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Sets {decimals} to a value other than the default one of 18.\n *\n * WARNING: This function should only be called from the constructor. Most\n * applications that interact with token contracts will not expect\n * {decimals} to ever change, and may work incorrectly if it does.\n */\n function _setupDecimals(uint8 decimals_) internal virtual {\n _decimals = decimals_;\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be to transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Context.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n" +- }, +- "@openzeppelin/contracts/math/SafeMath.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b > 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b <= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b > 0, errorMessage);\n return a % b;\n }\n}\n" +- }, +- "@openzeppelin/contracts/token/ERC20/SafeERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using SafeMath for uint256;\n using Address for address;\n\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n // solhint-disable-next-line max-line-length\n require((value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) { // Return data is optional\n // solhint-disable-next-line max-line-length\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/utils/Address.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1StandardBridge.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1StandardBridge } from \"../../../iOVM/bridge/tokens/iOVM_L1StandardBridge.sol\";\nimport { iOVM_L1ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L1ERC20Bridge.sol\";\nimport { iOVM_L2ERC20Bridge } from \"../../../iOVM/bridge/tokens/iOVM_L2ERC20Bridge.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/* Library Imports */\nimport { OVM_CrossDomainEnabled } from \"../../../libraries/bridge/OVM_CrossDomainEnabled.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\";\n\n/**\n * @title OVM_L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2.\n * It synchronizes a corresponding L2 Bridge, informing it of deposits, and listening to it for newly finalized withdrawals.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {\n using SafeMath for uint;\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping (address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor()\n OVM_CrossDomainEnabled(address(0))\n {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(\n address _l1messenger,\n address _l2TokenBridge\n )\n public\n {\n require(messenger == address(0), \"Contract has already been initialized.\");\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /// @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious contract via initcode, but it takes care of the user error we want to avoid.\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), \"Account not EOA\");\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive()\n external\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n 1_300_000,\n bytes(\"\")\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETH(\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n onlyEOA()\n {\n _initiateETHDeposit(\n msg.sender,\n msg.sender,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n payable\n {\n _initiateETHDeposit(\n msg.sender,\n _to,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n )\n internal\n {\n // Construct calldata for finalizeDeposit call\n bytes memory message =\n abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n onlyEOA()\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n external\n override\n virtual\n {\n _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n )\n internal\n {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future withdrawals.\n // safeTransferFrom also checks if the contract has code, so this will fail if _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(\n _from,\n address(this),\n _amount\n );\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n iOVM_L2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(\n l2TokenBridge,\n _l2Gas,\n message\n );\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc iOVM_L1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n (bool success, ) = _to.call{value: _amount}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc iOVM_L1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n )\n external\n override\n onlyFromCrossDomainAccount(l2TokenBridge)\n {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer.\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract\n */\n function donateETH() external payable {}\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ECDSAContractAccount.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Contract Imports */\nimport { OVM_ETH } from \"../predeploys/OVM_ETH.sol\";\n\n/* External Imports */\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { ECDSA } from \"@openzeppelin/contracts/cryptography/ECDSA.sol\";\n\n/**\n * @title OVM_ECDSAContractAccount\n * @dev The ECDSA Contract Account can be used as the implementation for a ProxyEOA deployed by the\n * ovmCREATEEOA operation. It enables backwards compatibility with Ethereum's Layer 1, by\n * providing EIP155 formatted transaction encodings.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ECDSAContractAccount is iOVM_ECDSAContractAccount {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*************\n * Constants *\n *************/\n\n // TODO: should be the amount sufficient to cover the gas costs of all of the transactions up\n // to and including the CALL/CREATE which forms the entrypoint of the transaction.\n uint256 constant EXECUTION_VALIDATION_GAS_OVERHEAD = 25000;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * No-op fallback mirrors behavior of calling an EOA on L1.\n */\n fallback()\n external\n payable\n {\n return;\n }\n\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(\n bytes32 hash,\n bytes memory signature\n )\n public\n view\n returns (\n bytes4 magicValue\n )\n {\n return ECDSA.recover(hash, signature) == address(this) ?\n this.isValidSignature.selector :\n bytes4(0);\n }\n\n /**\n * Executes a signed transaction.\n * @param _transaction Signed EIP155 transaction.\n * @return Whether or not the call returned (rather than reverted).\n * @return Data returned by the call.\n */\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n override\n public\n returns (\n bool,\n bytes memory\n )\n {\n // Address of this contract within the ovm (ovmADDRESS) should be the same as the\n // recovered address of the user who signed this message. This is how we manage to shim\n // account abstraction even though the user isn't a contract.\n require(\n _transaction.sender() == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Signature provided for EOA transaction execution is invalid.\"\n );\n\n require(\n _transaction.chainId == Lib_ExecutionManagerWrapper.ovmCHAINID(),\n \"Transaction signed with wrong chain ID\"\n );\n\n // Need to make sure that the transaction nonce is right.\n require(\n _transaction.nonce == Lib_ExecutionManagerWrapper.ovmGETNONCE(),\n \"Transaction nonce does not match the expected nonce.\"\n );\n\n // TEMPORARY: Disable gas checks for mainnet.\n // // Need to make sure that the gas is sufficient to execute the transaction.\n // require(\n // gasleft() >= SafeMath.add(transaction.gasLimit, EXECUTION_VALIDATION_GAS_OVERHEAD),\n // \"Gas is not sufficient to execute the transaction.\"\n // );\n\n // Transfer fee to relayer.\n require(\n OVM_ETH(Lib_PredeployAddresses.OVM_ETH).transfer(\n Lib_PredeployAddresses.SEQUENCER_FEE_WALLET,\n SafeMath.mul(_transaction.gasLimit, _transaction.gasPrice)\n ),\n \"Fee was not transferred to relayer.\"\n );\n\n if (_transaction.isCreate) {\n // TEMPORARY: Disable value transfer for contract creations.\n require(\n _transaction.value == 0,\n \"Value transfer in contract creation not supported.\"\n );\n\n (address created, bytes memory revertdata) = Lib_ExecutionManagerWrapper.ovmCREATE(\n _transaction.data\n );\n\n // Return true if the contract creation succeeded, false w/ revertdata otherwise.\n if (created != address(0)) {\n return (true, abi.encode(created));\n } else {\n return (false, revertdata);\n }\n } else {\n // We only want to bump the nonce for `ovmCALL` because `ovmCREATE` automatically bumps\n // the nonce of the calling account. Normally an EOA would bump the nonce for both\n // cases, but since this is a contract we'd end up bumping the nonce twice.\n Lib_ExecutionManagerWrapper.ovmINCREMENTNONCE();\n\n // NOTE: Upgrades are temporarily disabled because users can, in theory, modify their EOA\n // so that they don't have to pay any fees to the sequencer. Function will remain disabled\n // until a robust solution is in place.\n require(\n _transaction.to != Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"Calls to self are disabled until upgradability is re-enabled.\"\n );\n\n return _transaction.to.call{value: _transaction.value}(_transaction.data);\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ECDSAContractAccount.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title iOVM_ECDSAContractAccount\n */\ninterface iOVM_ECDSAContractAccount {\n\n /********************\n * Public Functions *\n ********************/\n\n function execute(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n external\n returns (\n bool,\n bytes memory\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_EIP155Tx\n * @dev A simple library for dealing with the transaction type defined by EIP155:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\nlibrary Lib_EIP155Tx {\n\n /***********\n * Structs *\n ***********/\n\n // Struct representing an EIP155 transaction. See EIP link above for more information.\n struct EIP155Tx {\n // These fields correspond to the actual RLP-encoded fields specified by EIP155.\n uint256 nonce;\n uint256 gasPrice;\n uint256 gasLimit;\n address to;\n uint256 value;\n bytes data;\n uint8 v;\n bytes32 r;\n bytes32 s;\n\n // Chain ID to associate this transaction with. Used all over the place, seemed easier to\n // set this once when we create the transaction rather than providing it as an input to\n // each function. I don't see a strong need to have a transaction with a mutable chain ID.\n uint256 chainId;\n\n // The ECDSA \"recovery parameter,\" should always be 0 or 1. EIP155 specifies that:\n // `v = {0,1} + CHAIN_ID * 2 + 35`\n // Where `{0,1}` is a stand in for our `recovery_parameter`. Now computing our formula for\n // the recovery parameter:\n // 1. `v = {0,1} + CHAIN_ID * 2 + 35`\n // 2. `v = recovery_parameter + CHAIN_ID * 2 + 35`\n // 3. `v - CHAIN_ID * 2 - 35 = recovery_parameter`\n // So we're left with the final formula:\n // `recovery_parameter = v - CHAIN_ID * 2 - 35`\n // NOTE: This variable is a uint8 because `v` is inherently limited to a uint8. If we\n // didn't use a uint8, then recovery_parameter would always be a negative number for chain\n // IDs greater than 110 (`255 - 110 * 2 - 35 = 0`). So we need to wrap around to support\n // anything larger.\n uint8 recoveryParam;\n\n // Whether or not the transaction is a creation. Necessary because we can't make an address\n // \"nil\". Using the zero address creates a potential conflict if the user did actually\n // intend to send a transaction to the zero address.\n bool isCreate;\n }\n\n // Lets us use nicer syntax.\n using Lib_EIP155Tx for EIP155Tx;\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Decodes an EIP155 transaction and attaches a given Chain ID.\n * Transaction *must* be RLP-encoded.\n * @param _encoded RLP-encoded EIP155 transaction.\n * @param _chainId Chain ID to assocaite with this transaction.\n * @return Parsed transaction.\n */\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n internal\n pure\n returns (\n EIP155Tx memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_encoded);\n\n // Note formula above about how recoveryParam is computed.\n uint8 v = uint8(Lib_RLPReader.readUint256(decoded[6]));\n uint8 recoveryParam = uint8(v - 2 * _chainId - 35);\n\n // Recovery param being anything other than 0 or 1 indicates that we have the wrong chain\n // ID.\n require(\n recoveryParam < 2,\n \"Lib_EIP155Tx: Transaction signed with wrong chain ID\"\n );\n\n // Creations can be detected by looking at the byte length here.\n bool isCreate = Lib_RLPReader.readBytes(decoded[3]).length == 0;\n\n return EIP155Tx({\n nonce: Lib_RLPReader.readUint256(decoded[0]),\n gasPrice: Lib_RLPReader.readUint256(decoded[1]),\n gasLimit: Lib_RLPReader.readUint256(decoded[2]),\n to: Lib_RLPReader.readAddress(decoded[3]),\n value: Lib_RLPReader.readUint256(decoded[4]),\n data: Lib_RLPReader.readBytes(decoded[5]),\n v: v,\n r: Lib_RLPReader.readBytes32(decoded[7]),\n s: Lib_RLPReader.readBytes32(decoded[8]),\n chainId: _chainId,\n recoveryParam: recoveryParam,\n isCreate: isCreate\n });\n }\n\n /**\n * Encodes an EIP155 transaction into RLP.\n * @param _transaction EIP155 transaction to encode.\n * @param _includeSignature Whether or not to encode the signature.\n * @return RLP-encoded transaction.\n */\n function encode(\n EIP155Tx memory _transaction,\n bool _includeSignature\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](9);\n\n raw[0] = Lib_RLPWriter.writeUint(_transaction.nonce);\n raw[1] = Lib_RLPWriter.writeUint(_transaction.gasPrice);\n raw[2] = Lib_RLPWriter.writeUint(_transaction.gasLimit);\n\n // We write the encoding of empty bytes when the transaction is a creation, *not* the zero\n // address as one might assume.\n if (_transaction.isCreate) {\n raw[3] = Lib_RLPWriter.writeBytes('');\n } else {\n raw[3] = Lib_RLPWriter.writeAddress(_transaction.to);\n }\n\n raw[4] = Lib_RLPWriter.writeUint(_transaction.value);\n raw[5] = Lib_RLPWriter.writeBytes(_transaction.data);\n\n if (_includeSignature) {\n raw[6] = Lib_RLPWriter.writeUint(_transaction.v);\n raw[7] = Lib_RLPWriter.writeBytes32(_transaction.r);\n raw[8] = Lib_RLPWriter.writeBytes32(_transaction.s);\n } else {\n // Chain ID *is* included in the unsigned transaction.\n raw[6] = Lib_RLPWriter.writeUint(_transaction.chainId);\n raw[7] = Lib_RLPWriter.writeBytes('');\n raw[8] = Lib_RLPWriter.writeBytes('');\n }\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * Computes the hash of an EIP155 transaction. Assumes that you don't want to include the\n * signature in this hash because that's a very uncommon usecase. If you really want to include\n * the signature, just encode with the signature and take the hash yourself.\n */\n function hash(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n _transaction.encode(false)\n );\n }\n\n /**\n * Computes the sender of an EIP155 transaction.\n * @param _transaction EIP155 transaction to get a sender for.\n * @return Address corresponding to the private key that signed this transaction.\n */\n function sender(\n EIP155Tx memory _transaction\n )\n internal\n pure\n returns (\n address\n )\n {\n return ecrecover(\n _transaction.hash(),\n _transaction.recoveryParam + 27,\n _transaction.r,\n _transaction.s\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/wrappers/Lib_ExecutionManagerWrapper.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_ErrorUtils } from \"../utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../constants/Lib_PredeployAddresses.sol\";\n\n/**\n * @title Lib_ExecutionManagerWrapper\n * @dev This library acts as a utility for easily calling the OVM_ExecutionManagerWrapper, the\n * predeployed contract which exposes the `kall` builtin. Effectively, this contract allows the\n * user to trigger OVM opcodes by directly calling the OVM_ExecutionManger.\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\nlibrary Lib_ExecutionManagerWrapper {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Performs a safe ovmCREATE call.\n * @param _bytecode Code for the new contract.\n * @return Address of the created contract.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATE(bytes)\",\n _bytecode\n )\n );\n\n return abi.decode(returndata, (address, bytes));\n }\n\n /**\n * Performs a safe ovmGETNONCE call.\n * @return Result of calling ovmGETNONCE.\n */\n function ovmGETNONCE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmGETNONCE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmINCREMENTNONCE call.\n */\n function ovmINCREMENTNONCE()\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmINCREMENTNONCE()\"\n )\n );\n }\n\n /**\n * Performs a safe ovmCREATEEOA call.\n * @param _messageHash Message hash which was signed by EOA\n * @param _v v value of signature (0 or 1)\n * @param _r r value of signature\n * @param _s s value of signature\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n internal\n {\n _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCREATEEOA(bytes32,uint8,bytes32,bytes32)\",\n _messageHash,\n _v,\n _r,\n _s\n )\n );\n }\n\n /**\n * Calls the ovmL1TXORIGIN opcode.\n * @return Address that sent this message from L1.\n */\n function ovmL1TXORIGIN()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmL1TXORIGIN()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the ovmCHAINID opcode.\n * @return Chain ID of the current network.\n */\n function ovmCHAINID()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCHAINID()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Performs a safe ovmADDRESS call.\n * @return Result of calling ovmADDRESS.\n */\n function ovmADDRESS()\n internal\n returns (\n address\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmADDRESS()\"\n )\n );\n\n return abi.decode(returndata, (address));\n }\n\n /**\n * Calls the value-enabled ovmCALL opcode.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALL(uint256,address,uint256,bytes)\",\n _gasLimit,\n _address,\n _value,\n _calldata\n )\n );\n\n return abi.decode(returndata, (bool, bytes));\n }\n\n /**\n * Calls the ovmBALANCE opcode.\n * @param _address OVM account to query the balance of.\n * @return Balance of the account.\n */\n function ovmBALANCE(\n address _address\n )\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmBALANCE(address)\",\n _address\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * Calls the ovmCALLVALUE opcode.\n * @return Value of the current call frame.\n */\n function ovmCALLVALUE()\n internal\n returns (\n uint256\n )\n {\n bytes memory returndata = _callWrapperContract(\n abi.encodeWithSignature(\n \"ovmCALLVALUE()\"\n )\n );\n\n return abi.decode(returndata, (uint256));\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Performs an ovm interaction and the necessary safety checks.\n * @param _calldata Data to send to the OVM_ExecutionManager (encoded with sighash).\n * @return Data sent back by the OVM_ExecutionManager.\n */\n function _callWrapperContract(\n bytes memory _calldata\n )\n private\n returns (\n bytes memory\n )\n {\n (bool success, bytes memory returndata) = Lib_PredeployAddresses.EXECUTION_MANAGER_WRAPPER.delegatecall(_calldata);\n\n if (success == true) {\n return returndata;\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/cryptography/ECDSA.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n // Check the signature length\n if (signature.length != 65) {\n revert(\"ECDSA: invalid signature length\");\n }\n\n // Divide the signature in r, s and v variables\n bytes32 r;\n bytes32 s;\n uint8 v;\n\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n\n return recover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"ECDSA: invalid signature 's' value\");\n require(v == 27 || v == 28, \"ECDSA: invalid signature 'v' value\");\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n require(signer != address(0), \"ECDSA: invalid signature\");\n\n return signer;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * replicates the behavior of the\n * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\n * JSON-RPC method.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n\n /*************\n * Constants *\n *************/\n\n uint256 constant internal MAX_LIST_LENGTH = 32;\n\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem memory\n )\n {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({\n length: _in.length,\n ptr: ptr\n });\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n (\n uint256 listOffset,\n ,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.LIST_ITEM,\n \"Invalid RLP list value.\"\n );\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n \"Provided RLP list exceeds max list length.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n ) = _decodeLength(RLPItem({\n length: _in.length - offset,\n ptr: _in.ptr + offset\n }));\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(\n bytes memory _in\n )\n internal\n pure\n returns (\n RLPItem[] memory\n )\n {\n return readList(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes value.\"\n );\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return readBytes(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(\n bytes memory _in\n )\n internal\n pure\n returns (\n string memory\n )\n {\n return readString(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _in.length <= 33,\n \"Invalid RLP bytes32 value.\"\n );\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(\n itemType == RLPItemType.DATA_ITEM,\n \"Invalid RLP bytes32 value.\"\n );\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return readBytes32(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(\n bytes memory _in\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return readUint256(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _in.length == 1,\n \"Invalid RLP boolean value.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n \"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\"\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(\n bytes memory _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return readBool(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(\n _in.length == 21,\n \"Invalid RLP address value.\"\n );\n\n return address(readUint256(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(\n bytes memory _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return readAddress(\n toRLPItem(_in)\n );\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(\n RLPItem memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(\n RLPItem memory _in\n )\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(\n _in.length > 0,\n \"RLP item cannot be null.\"\n );\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(\n _in.length > strLen,\n \"Invalid RLP short string.\"\n );\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(\n _in.length > lenOfStrLen,\n \"Invalid RLP long string length.\"\n );\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfStrLen))\n )\n }\n\n require(\n _in.length > lenOfStrLen + strLen,\n \"Invalid RLP long string.\"\n );\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(\n _in.length > listLen,\n \"Invalid RLP short list.\"\n );\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(\n _in.length > lenOfListLen,\n \"Invalid RLP long list length.\"\n );\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(\n mload(add(ptr, 1)),\n exp(256, sub(32, lenOfListLen))\n )\n }\n\n require(\n _in.length > lenOfListLen + listLen,\n \"Invalid RLP long list.\"\n );\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask = 256 ** (32 - (_length % 32)) - 1;\n assembly {\n mstore(\n dest,\n or(\n and(mload(src), not(mask)),\n and(mload(dest), mask)\n )\n )\n }\n\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(\n RLPItem memory _in\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(\n bytes memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(\n bytes[] memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(\n string memory _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a bytes32 value.\n * @param _in The bytes32 to encode.\n * @return _out The RLP encoded bytes32 in bytes.\n */\n function writeBytes32(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory _out\n )\n {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(\n uint256 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(\n uint256 _len,\n uint256 _offset\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = byte(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = byte(uint8(lenLen) + uint8(_offset) + 55);\n for(i = 1; i <= lenLen; i++) {\n encoded[i] = byte(uint8((_len / (256**(lenLen-i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(\n uint256 _x\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n )\n private\n pure\n {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for(; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(\n bytes[] memory _list\n )\n private\n pure\n returns (\n bytes memory\n )\n {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly { flattenedPtr := add(flattened, 0x20) }\n\n for(i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly { listPtr := add(item, 0x20)}\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_ErrorUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/**\n * @title Lib_ErrorUtils\n */\nlibrary Lib_ErrorUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes an error string into raw solidity-style revert data.\n * (i.e. ascii bytes, prefixed with bytes4(keccak(\"Error(string))\"))\n * Ref: https://docs.soliditylang.org/en/v0.8.2/control-structures.html?highlight=Error(string)#panic-via-assert-and-error-via-require\n * @param _reason Reason for the reversion.\n * @return Standard solidity revert data for the given reason.\n */\n function encodeRevertString(\n string memory _reason\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"Error(string)\",\n _reason\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_ProxyEOA.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\n\n/**\n * @title OVM_ProxyEOA\n * @dev The Proxy EOA contract uses a delegate call to execute the logic in an implementation contract.\n * In combination with the logic implemented in the ECDSA Contract Account, this enables a form of upgradable\n * 'account abstraction' on layer 2.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_ProxyEOA {\n\n /**********\n * Events *\n **********/\n\n event Upgraded(\n address indexed implementation\n );\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant IMPLEMENTATION_KEY = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; //bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1);\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n (bool success, bytes memory returndata) = getImplementation().delegatecall(msg.data);\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n\n // WARNING: We use the deployed bytecode of this contract as a template to create ProxyEOA\n // contracts. As a result, we must *not* perform any constructor logic. Use initialization\n // functions if necessary.\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the implementation address.\n * @param _implementation New implementation address.\n */\n function upgrade(\n address _implementation\n )\n external\n {\n require(\n msg.sender == Lib_ExecutionManagerWrapper.ovmADDRESS(),\n \"EOAs can only upgrade their own EOA implementation.\"\n );\n\n _setImplementation(_implementation);\n emit Upgraded(_implementation);\n }\n\n /**\n * Gets the address of the current implementation.\n * @return Current implementation address.\n */\n function getImplementation()\n public\n view\n returns (\n address\n )\n {\n bytes32 addr32;\n assembly {\n addr32 := sload(IMPLEMENTATION_KEY)\n }\n\n address implementation = Lib_Bytes32Utils.toAddress(addr32);\n if (implementation == address(0)) {\n return Lib_PredeployAddresses.ECDSA_CONTRACT_ACCOUNT;\n } else {\n return implementation;\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n function _setImplementation(\n address _implementation\n )\n internal\n {\n bytes32 addr32 = Lib_Bytes32Utils.fromAddress(_implementation);\n assembly {\n sstore(IMPLEMENTATION_KEY, addr32)\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(\n bytes32 _in\n )\n internal\n pure\n returns (\n bool\n )\n {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(\n bool _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(\n bytes32 _in\n )\n internal\n pure\n returns (\n address\n )\n {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(\n address _in\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return bytes32(uint256(_in));\n }\n\n /**\n * Removes the leading zeros from a bytes32 value and returns a new (smaller) bytes value.\n * @param _in Input bytes32 value.\n * @return Bytes32 without any leading zeros.\n */\n function removeLeadingZeros(\n bytes32 _in\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory out;\n\n assembly {\n // Figure out how many leading zero bytes to remove.\n let shift := 0\n for { let i := 0 } and(lt(i, 32), eq(byte(i, _in), 0)) { i := add(i, 1) } {\n shift := add(shift, 1)\n }\n\n // Reserve some space for our output and fix the free memory pointer.\n out := mload(0x40)\n mstore(0x40, add(out, 0x40))\n\n // Shift the value and store it into the output bytes.\n mstore(add(out, 0x20), shl(mul(shift, 8), _in))\n\n // Store the new size (with leading zero bytes removed) in the output byte size.\n mstore(out, sub(32, shift))\n }\n\n return out;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../libraries/codec/Lib_EIP155Tx.sol\";\nimport { Lib_ExecutionManagerWrapper } from \"../../libraries/wrappers/Lib_ExecutionManagerWrapper.sol\";\nimport { iOVM_ECDSAContractAccount } from \"../../iOVM/predeploys/iOVM_ECDSAContractAccount.sol\";\n\n/**\n * @title OVM_SequencerEntrypoint\n * @dev The Sequencer Entrypoint is a predeploy which, despite its name, can in fact be called by\n * any account. It accepts a more efficient compressed calldata format, which it decompresses and\n * encodes to the standard EIP155 transaction format.\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_SequencerEntrypoint {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_EIP155Tx for Lib_EIP155Tx.EIP155Tx;\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n /**\n * Expects an RLP-encoded EIP155 transaction as input. See the EIP for a more detailed\n * description of this transaction format:\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md\n */\n fallback()\n external\n {\n // We use this twice, so it's more gas efficient to store a copy of it (barely).\n bytes memory encodedTx = msg.data;\n\n // Decode the tx with the correct chain ID.\n Lib_EIP155Tx.EIP155Tx memory transaction = Lib_EIP155Tx.decode(\n encodedTx,\n Lib_ExecutionManagerWrapper.ovmCHAINID()\n );\n\n // Value is computed on the fly. Keep it in the stack to save some gas.\n address target = transaction.sender();\n\n bool isEmptyContract;\n assembly {\n isEmptyContract := iszero(extcodesize(target))\n }\n\n // If the account is empty, deploy the default EOA to that address.\n if (isEmptyContract) {\n Lib_ExecutionManagerWrapper.ovmCREATEEOA(\n transaction.hash(),\n transaction.recoveryParam,\n transaction.r,\n transaction.s\n );\n }\n\n // Forward the transaction over to the EOA.\n (bool success, bytes memory returndata) = target.call(\n abi.encodeWithSelector(iOVM_ECDSAContractAccount.execute.selector, transaction)\n );\n\n if (success) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/test-libraries/codec/TestLib_EIP155Tx.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EIP155Tx } from \"../../optimistic-ethereum/libraries/codec/Lib_EIP155Tx.sol\";\n\n/**\n * @title TestLib_EIP155Tx\n */\ncontract TestLib_EIP155Tx {\n function decode(\n bytes memory _encoded,\n uint256 _chainId\n )\n public\n pure\n returns (\n Lib_EIP155Tx.EIP155Tx memory\n )\n {\n return Lib_EIP155Tx.decode(\n _encoded,\n _chainId\n );\n }\n\n function encode(\n Lib_EIP155Tx.EIP155Tx memory _transaction,\n bool _includeSignature\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_EIP155Tx.encode(\n _transaction,\n _includeSignature\n );\n }\n\n function hash(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_EIP155Tx.hash(\n _transaction\n );\n }\n\n function sender(\n Lib_EIP155Tx.EIP155Tx memory _transaction\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_EIP155Tx.sender(\n _transaction\n );\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPWriter.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n\n function writeBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(\n bytes[] memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(\n string memory _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(\n address _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(\n uint256 _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(\n bool _in\n )\n public\n pure\n returns (\n bytes memory _out\n )\n {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(\n address _in\n )\n public\n returns (\n bytes memory _out\n )\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" +- }, +- "contracts/test-helpers/TestERC20.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _approve(address owner, address spender, uint256 value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint256 value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n}\n\nlibrary SafeMath {\n function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol\";\nimport { TestERC20 } from \"../../test-helpers/TestERC20.sol\";\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n _preBytes,\n _postBytes\n );\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes32)\n {\n return Lib_BytesUtils.toBytes32(\n _bytes\n );\n }\n\n function toUint256(\n bytes memory _bytes\n )\n public\n pure\n returns (uint256)\n {\n return Lib_BytesUtils.toUint256(\n _bytes\n );\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.toNibbles(\n _bytes\n );\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n public\n pure\n returns (bytes memory)\n {\n return Lib_BytesUtils.fromNibbles(\n _bytes\n );\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(\n _bytes,\n _other\n );\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n public\n returns (bytes memory)\n {\n new TestERC20();\n return Lib_BytesUtils.slice(\n _bytes,\n _start,\n _length\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_BytesUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_start + _length >= _start, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n if (_start >= _bytes.length) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32PadLeft(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n bytes32 ret;\n uint256 len = _bytes.length <= 32 ? _bytes.length : 32;\n assembly {\n ret := shr(mul(sub(32, len), 8), mload(add(_bytes, 32)))\n }\n return ret;\n }\n\n function toBytes32(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes,(bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n uint256\n )\n {\n return uint256(toBytes32(_bytes));\n }\n\n function toUint24(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint24\n )\n {\n require(_start + 3 >= _start, \"toUint24_overflow\");\n require(_bytes.length >= _start + 3 , \"toUint24_outOfBounds\");\n uint24 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x3), _start))\n }\n\n return tempUint;\n }\n\n function toUint8(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n uint8\n )\n {\n require(_start + 1 >= _start, \"toUint8_overflow\");\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toAddress(\n bytes memory _bytes,\n uint256 _start\n )\n internal\n pure\n returns (\n address\n )\n {\n require(_start + 20 >= _start, \"toAddress_overflow\");\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(\n bytes memory _bytes\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(\n bytes memory _bytes,\n bytes memory _other\n )\n internal\n pure\n returns (\n bool\n )\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitioner.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_BytesUtils } from \"../../libraries/utils/Lib_BytesUtils.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_RLPWriter } from \"../../libraries/rlp/Lib_RLPWriter.sol\";\nimport { Lib_RLPReader } from \"../../libraries/rlp/Lib_RLPReader.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n/**\n * @title OVM_StateTransitioner\n * @dev The State Transitioner coordinates the execution of a state transition during the evaluation of a\n * fraud proof. It feeds verified input to the Execution Manager's run(), and controls a State Manager (which is\n * uniquely created for each fraud proof).\n * Once a fraud proof has been initialized, this contract is provided with the pre-state root and verifies\n * that the OVM storage slots committed to the State Mangager are contained in that state\n * This contract controls the State Manager and Execution Manager, and uses them to calculate the\n * post-state root by applying the transaction. The Fraud Verifier can then check for fraud by comparing\n * the calculated post-state root with the proposed post-state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitioner is Lib_AddressResolver, Abs_FraudContributor, iOVM_StateTransitioner {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum TransitionPhase {\n PRE_EXECUTION,\n POST_EXECUTION,\n COMPLETE\n }\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n iOVM_StateManager public ovmStateManager;\n\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n bytes32 internal preStateRoot;\n bytes32 internal postStateRoot;\n TransitionPhase public phase;\n uint256 internal stateTransitionIndex;\n bytes32 internal transactionHash;\n\n\n /*************\n * Constants *\n *************/\n\n bytes32 internal constant EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 internal constant EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n */\n constructor(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n Lib_AddressResolver(_libAddressManager)\n {\n stateTransitionIndex = _stateTransitionIndex;\n preStateRoot = _preStateRoot;\n postStateRoot = _preStateRoot;\n transactionHash = _transactionHash;\n\n ovmStateManager = iOVM_StateManagerFactory(resolve(\"OVM_StateManagerFactory\")).create(address(this));\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Checks that a function is only run during a specific phase.\n * @param _phase Phase the function must run within.\n */\n modifier onlyDuringPhase(\n TransitionPhase _phase\n ) {\n require(\n phase == _phase,\n \"Function must be called during the correct phase.\"\n );\n _;\n }\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n /**\n * Retrieves the state root before execution.\n * @return _preStateRoot State root before execution.\n */\n function getPreStateRoot()\n override\n external\n view\n returns (\n bytes32 _preStateRoot\n )\n {\n return preStateRoot;\n }\n\n /**\n * Retrieves the state root after execution.\n * @return _postStateRoot State root after execution.\n */\n function getPostStateRoot()\n override\n external\n view\n returns (\n bytes32 _postStateRoot\n )\n {\n return postStateRoot;\n }\n\n /**\n * Checks whether the transitioner is complete.\n * @return _complete Whether or not the transition process is finished.\n */\n function isComplete()\n override\n external\n view\n returns (\n bool _complete\n )\n {\n return phase == TransitionPhase.COMPLETE;\n }\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n /**\n * Allows a user to prove the initial state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _ethContractAddress Address of the corresponding contract on L1.\n * @param _stateTrieWitness Proof of the account state.\n */\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n (\n ovmStateManager.hasAccount(_ovmContractAddress) == false\n && ovmStateManager.hasEmptyAccount(_ovmContractAddress) == false\n ),\n \"Account state has already been proven.\"\n );\n\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_ovmContractAddress),\n _stateTrieWitness,\n preStateRoot\n );\n\n if (exists == true) {\n // Account exists, this was an inclusion proof.\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedAccount\n );\n\n address ethContractAddress = _ethContractAddress;\n if (account.codeHash == EMPTY_ACCOUNT_CODE_HASH) {\n // Use a known empty contract to prevent an attack in which a user provides a\n // contract address here and then later deploys code to it.\n ethContractAddress = 0x0000000000000000000000000000000000000000;\n } else {\n // Otherwise, make sure that the code at the provided eth address matches the hash\n // of the code stored on L2.\n require(\n Lib_EthUtils.getCodeHash(ethContractAddress) == account.codeHash,\n \"OVM_StateTransitioner: Provided L1 contract code hash does not match L2 contract code hash.\"\n );\n }\n\n ovmStateManager.putAccount(\n _ovmContractAddress,\n Lib_OVMCodec.Account({\n nonce: account.nonce,\n balance: account.balance,\n storageRoot: account.storageRoot,\n codeHash: account.codeHash,\n ethAddress: ethContractAddress,\n isFresh: false\n })\n );\n } else {\n // Account does not exist, this was an exclusion proof.\n ovmStateManager.putEmptyAccount(_ovmContractAddress);\n }\n }\n\n /**\n * Allows a user to prove the initial state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n // Exit quickly to avoid unnecessary work.\n require(\n ovmStateManager.hasContractStorage(_ovmContractAddress, _key) == false,\n \"Storage slot has already been proven.\"\n );\n\n require(\n ovmStateManager.hasAccount(_ovmContractAddress) == true,\n \"Contract must be verified before proving a storage slot.\"\n );\n\n bytes32 storageRoot = ovmStateManager.getAccountStorageRoot(_ovmContractAddress);\n bytes32 value;\n\n if (storageRoot == EMPTY_ACCOUNT_STORAGE_ROOT) {\n // Storage trie was empty, so the user is always allowed to insert zero-byte values.\n value = bytes32(0);\n } else {\n // Function will fail if the proof is not a valid inclusion or exclusion proof.\n (\n bool exists,\n bytes memory encodedValue\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(_key),\n _storageTrieWitness,\n storageRoot\n );\n\n if (exists == true) {\n // Inclusion proof.\n // Stored values are RLP encoded, with leading zeros removed.\n value = Lib_BytesUtils.toBytes32PadLeft(\n Lib_RLPReader.readBytes(encodedValue)\n );\n } else {\n // Exclusion proof, can only be zero bytes.\n value = bytes32(0);\n }\n }\n\n ovmStateManager.putContractStorage(\n _ovmContractAddress,\n _key,\n value\n );\n }\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n /**\n * Executes the state transition.\n * @param _transaction OVM transaction to execute.\n */\n function applyTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n override\n external\n onlyDuringPhase(TransitionPhase.PRE_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n Lib_OVMCodec.hashTransaction(_transaction) == transactionHash,\n \"Invalid transaction provided.\"\n );\n\n // We require gas to complete the logic here in run() before/after execution,\n // But must ensure the full _tx.gasLimit can be given to the ovmCALL (determinism)\n // This includes 1/64 of the gas getting lost because of EIP-150 (lost twice--first\n // going into EM, then going into the code contract).\n require(\n gasleft() >= 100000 + _transaction.gasLimit * 1032 / 1000, // 1032/1000 = 1.032 = (64/63)^2 rounded up\n \"Not enough gas to execute transaction deterministically.\"\n );\n\n iOVM_ExecutionManager ovmExecutionManager = iOVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n\n // We call `setExecutionManager` right before `run` (and not earlier) just in case the\n // OVM_ExecutionManager address was updated between the time when this contract was created\n // and when `applyTransaction` was called.\n ovmStateManager.setExecutionManager(address(ovmExecutionManager));\n\n // `run` always succeeds *unless* the user hasn't provided enough gas to `applyTransaction`\n // or an INVALID_STATE_ACCESS flag was triggered. Either way, we won't get beyond this line\n // if that's the case.\n ovmExecutionManager.run(_transaction, address(ovmStateManager));\n\n // Prevent the Execution Manager from calling this SM again.\n ovmStateManager.setExecutionManager(address(0));\n phase = TransitionPhase.POST_EXECUTION;\n }\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n /**\n * Allows a user to commit the final state of a contract.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _stateTrieWitness Proof of the account state.\n */\n function commitContractState(\n address _ovmContractAddress,\n bytes memory _stateTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before committing account states.\"\n );\n\n require (\n ovmStateManager.commitAccount(_ovmContractAddress) == true,\n \"Account state wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n\n postStateRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_ovmContractAddress),\n Lib_OVMCodec.encodeEVMAccount(\n Lib_OVMCodec.toEVMAccount(account)\n ),\n _stateTrieWitness,\n postStateRoot\n );\n\n // Emit an event to help clients figure out the proof ordering.\n emit AccountCommitted(\n _ovmContractAddress\n );\n }\n\n /**\n * Allows a user to commit the final state of a contract storage slot.\n * @param _ovmContractAddress Address of the contract on the OVM.\n * @param _key Claimed account slot key.\n * @param _storageTrieWitness Proof of the storage slot.\n */\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes memory _storageTrieWitness\n )\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n contributesToFraudProof(preStateRoot, transactionHash)\n {\n require(\n ovmStateManager.commitContractStorage(_ovmContractAddress, _key) == true,\n \"Storage slot value wasn't changed or has already been committed.\"\n );\n\n Lib_OVMCodec.Account memory account = ovmStateManager.getAccount(_ovmContractAddress);\n bytes32 value = ovmStateManager.getContractStorage(_ovmContractAddress, _key);\n\n account.storageRoot = Lib_SecureMerkleTrie.update(\n abi.encodePacked(_key),\n Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(value)\n ),\n _storageTrieWitness,\n account.storageRoot\n );\n\n ovmStateManager.putAccount(_ovmContractAddress, account);\n\n // Emit an event to help clients figure out the proof ordering.\n emit ContractStorageCommitted(\n _ovmContractAddress,\n _key\n );\n }\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n /**\n * Finalizes the transition process.\n */\n function completeTransition()\n override\n external\n onlyDuringPhase(TransitionPhase.POST_EXECUTION)\n {\n require(\n ovmStateManager.getTotalUncommittedAccounts() == 0,\n \"All accounts must be committed before completing a transition.\"\n );\n\n require(\n ovmStateManager.getTotalUncommittedContractStorage() == 0,\n \"All storage must be committed before completing a transition.\"\n );\n\n phase = TransitionPhase.COMPLETE;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_Bytes32Utils } from \"../utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n\n /***********\n * Structs *\n ***********/\n\n struct Account {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n address ethAddress;\n bool isFresh;\n }\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(\n Transaction memory _transaction\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * Converts an OVM account to an EVM account.\n * @param _in OVM account to convert.\n * @return Converted EVM account.\n */\n function toEVMAccount(\n Account memory _in\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n return EVMAccount({\n nonce: _in.nonce,\n balance: _in.balance,\n storageRoot: _in.storageRoot,\n codeHash: _in.codeHash\n });\n }\n\n /**\n * @notice RLP-encodes an account state struct.\n * @param _account Account state struct.\n * @return RLP-encoded account state.\n */\n function encodeEVMAccount(\n EVMAccount memory _account\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n bytes[] memory raw = new bytes[](4);\n\n // Unfortunately we can't create this array outright because\n // Lib_RLPWriter.writeList will reject fixed-size arrays. Assigning\n // index-by-index circumvents this issue.\n raw[0] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.nonce)\n )\n );\n raw[1] = Lib_RLPWriter.writeBytes(\n Lib_Bytes32Utils.removeLeadingZeros(\n bytes32(_account.balance)\n )\n );\n raw[2] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.storageRoot));\n raw[3] = Lib_RLPWriter.writeBytes(abi.encodePacked(_account.codeHash));\n\n return Lib_RLPWriter.writeList(raw);\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(\n bytes memory _encoded\n )\n internal\n pure\n returns (\n EVMAccount memory\n )\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\n\n return EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressResolver.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(\n address _libAddressManager\n ) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(\n string memory _name\n )\n public\n view\n returns (\n address\n )\n {\n return libAddressManager.getAddress(_name);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_EthUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\nimport { Lib_Bytes32Utils } from \"./Lib_Bytes32Utils.sol\";\n\n/**\n * @title Lib_EthUtils\n */\nlibrary Lib_EthUtils {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the code for a given address.\n * @param _address Address to get code for.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Code read from the contract.\n */\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n bytes memory code;\n assembly {\n code := mload(0x40)\n mstore(0x40, add(code, add(_length, 0x20)))\n mstore(code, _length)\n extcodecopy(_address, add(code, 0x20), _offset, _length)\n }\n\n return code;\n }\n\n /**\n * Gets the full code for a given address.\n * @param _address Address to get code for.\n * @return Full code of the contract.\n */\n function getCode(\n address _address\n )\n internal\n view\n returns (\n bytes memory\n )\n {\n return getCode(\n _address,\n 0,\n getCodeSize(_address)\n );\n }\n\n /**\n * Gets the size of a contract's code in bytes.\n * @param _address Address to get code size for.\n * @return Size of the contract's code in bytes.\n */\n function getCodeSize(\n address _address\n )\n internal\n view\n returns (\n uint256\n )\n {\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(_address)\n }\n\n return codeSize;\n }\n\n /**\n * Gets the hash of a contract's code.\n * @param _address Address to get a code hash for.\n * @return Hash of the contract's code.\n */\n function getCodeHash(\n address _address\n )\n internal\n view\n returns (\n bytes32\n )\n {\n bytes32 codeHash;\n assembly {\n codeHash := extcodehash(_address)\n }\n\n return codeHash;\n }\n\n /**\n * Creates a contract with some given initialization code.\n * @param _code Contract initialization code.\n * @return Address of the created contract.\n */\n function createContract(\n bytes memory _code\n )\n internal\n returns (\n address\n )\n {\n address created;\n assembly {\n created := create(\n 0,\n add(_code, 0x20),\n mload(_code)\n )\n }\n\n return created;\n }\n\n /**\n * Computes the address that would be generated by CREATE.\n * @param _creator Address creating the contract.\n * @param _nonce Creator's nonce.\n * @return Address to be generated by CREATE.\n */\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes[] memory encoded = new bytes[](2);\n encoded[0] = Lib_RLPWriter.writeAddress(_creator);\n encoded[1] = Lib_RLPWriter.writeUint(_nonce);\n\n bytes memory encodedList = Lib_RLPWriter.writeList(encoded);\n return Lib_Bytes32Utils.toAddress(keccak256(encodedList));\n }\n\n /**\n * Computes the address that would be generated by CREATE2.\n * @param _creator Address creating the contract.\n * @param _bytecode Bytecode of the contract to be created.\n * @param _salt 32 byte salt value mixed into the hash.\n * @return Address to be generated by CREATE2.\n */\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n internal\n pure\n returns (\n address\n )\n {\n bytes32 hashedData = keccak256(abi.encodePacked(\n byte(0xff),\n _creator,\n _salt,\n keccak256(_bytecode)\n ));\n\n return Lib_Bytes32Utils.toAddress(hashedData);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"./Lib_MerkleTrie.sol\";\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(\n bytes memory _key\n )\n private\n pure\n returns (\n bytes memory _secureKey\n )\n {\n return abi.encodePacked(keccak256(_key));\n }\n}" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitioner.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateTransitioner\n */\ninterface iOVM_StateTransitioner {\n\n /**********\n * Events *\n **********/\n\n event AccountCommitted(\n address _address\n );\n\n event ContractStorageCommitted(\n address _address,\n bytes32 _key\n );\n\n\n /**********************************\n * Public Functions: State Access *\n **********************************/\n\n function getPreStateRoot() external view returns (bytes32 _preStateRoot);\n function getPostStateRoot() external view returns (bytes32 _postStateRoot);\n function isComplete() external view returns (bool _complete);\n\n\n /***********************************\n * Public Functions: Pre-Execution *\n ***********************************/\n\n function proveContractState(\n address _ovmContractAddress,\n address _ethContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function proveStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /*******************************\n * Public Functions: Execution *\n *******************************/\n\n function applyTransaction(\n Lib_OVMCodec.Transaction calldata _transaction\n ) external;\n\n\n /************************************\n * Public Functions: Post-Execution *\n ************************************/\n\n function commitContractState(\n address _ovmContractAddress,\n bytes calldata _stateTrieWitness\n ) external;\n\n function commitStorageSlot(\n address _ovmContractAddress,\n bytes32 _key,\n bytes calldata _storageTrieWitness\n ) external;\n\n\n /**********************************\n * Public Functions: Finalization *\n **********************************/\n\n function completeTransition() external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\ninterface ERC20 {\n function transfer(address, uint256) external returns (bool);\n function transferFrom(address, address, uint256) external returns (bool);\n}\n\n/// All the errors which may be encountered on the bond manager\nlibrary Errors {\n string constant ERC20_ERR = \"BondManager: Could not post bond\";\n string constant ALREADY_FINALIZED = \"BondManager: Fraud proof for this pre-state root has already been finalized\";\n string constant SLASHED = \"BondManager: Cannot finalize withdrawal, you probably got slashed\";\n string constant WRONG_STATE = \"BondManager: Wrong bond state for proposer\";\n string constant CANNOT_CLAIM = \"BondManager: Cannot claim yet. Dispute must be finalized first\";\n\n string constant WITHDRAWAL_PENDING = \"BondManager: Withdrawal already pending\";\n string constant TOO_EARLY = \"BondManager: Too early to finalize your withdrawal\";\n\n string constant ONLY_TRANSITIONER = \"BondManager: Only the transitioner for this pre-state root may call this function\";\n string constant ONLY_FRAUD_VERIFIER = \"BondManager: Only the fraud verifier may call this function\";\n string constant ONLY_STATE_COMMITMENT_CHAIN = \"BondManager: Only the state commitment chain may call this function\";\n string constant WAIT_FOR_DISPUTES = \"BondManager: Wait for other potential disputes\";\n}\n\n/**\n * @title iOVM_BondManager\n */\ninterface iOVM_BondManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n /// The lifecycle of a proposer's bond\n enum State {\n // Before depositing or after getting slashed, a user is uncollateralized\n NOT_COLLATERALIZED,\n // After depositing, a user is collateralized\n COLLATERALIZED,\n // After a user has initiated a withdrawal\n WITHDRAWING\n }\n\n /// A bond posted by a proposer\n struct Bond {\n // The user's state\n State state;\n // The timestamp at which a proposer issued their withdrawal request\n uint32 withdrawalTimestamp;\n // The time when the first disputed was initiated for this bond\n uint256 firstDisputeAt;\n // The earliest observed state root for this bond which has had fraud\n bytes32 earliestDisputedStateRoot;\n // The state root's timestamp\n uint256 earliestTimestamp;\n }\n\n // Per pre-state root, store the number of state provisions that were made\n // and how many of these calls were made by each user. Payouts will then be\n // claimed by users proportionally for that dispute.\n struct Rewards {\n // Flag to check if rewards for a fraud proof are claimable\n bool canClaim;\n // Total number of `recordGasSpent` calls made\n uint256 total;\n // The gas spent by each user to provide witness data. The sum of all\n // values inside this map MUST be equal to the value of `total`\n mapping(address => uint256) gasSpent;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n ) external;\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n ) external;\n\n function deposit() external;\n\n function startWithdrawal() external;\n\n function finalizeWithdrawal() external;\n\n function claim(\n address _who\n ) external;\n\n function isCollateralized(\n address _who\n ) external view returns (bool);\n\n function getGasSpent(\n bytes32 _preStateRoot,\n address _who\n ) external view returns (uint256);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\ninterface iOVM_ExecutionManager {\n /**********\n * Enums *\n *********/\n\n enum RevertFlag {\n OUT_OF_GAS,\n INTENTIONAL_REVERT,\n EXCEEDS_NUISANCE_GAS,\n INVALID_STATE_ACCESS,\n UNSAFE_BYTECODE,\n CREATE_COLLISION,\n STATIC_VIOLATION,\n CREATOR_NOT_ALLOWED\n }\n\n enum GasMetadataKey {\n CURRENT_EPOCH_START_TIMESTAMP,\n CUMULATIVE_SEQUENCER_QUEUE_GAS,\n CUMULATIVE_L1TOL2_QUEUE_GAS,\n PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n PREV_EPOCH_L1TOL2_QUEUE_GAS\n }\n\n enum MessageType {\n ovmCALL,\n ovmSTATICCALL,\n ovmDELEGATECALL,\n ovmCREATE,\n ovmCREATE2\n }\n\n /***********\n * Structs *\n ***********/\n\n struct GasMeterConfig {\n uint256 minTransactionGasLimit;\n uint256 maxTransactionGasLimit;\n uint256 maxGasPerQueuePerEpoch;\n uint256 secondsPerEpoch;\n }\n\n struct GlobalContext {\n uint256 ovmCHAINID;\n }\n\n struct TransactionContext {\n Lib_OVMCodec.QueueOrigin ovmL1QUEUEORIGIN;\n uint256 ovmTIMESTAMP;\n uint256 ovmNUMBER;\n uint256 ovmGASLIMIT;\n uint256 ovmTXGASLIMIT;\n address ovmL1TXORIGIN;\n }\n\n struct TransactionRecord {\n uint256 ovmGasRefund;\n }\n\n struct MessageContext {\n address ovmCALLER;\n address ovmADDRESS;\n uint256 ovmCALLVALUE;\n bool isStatic;\n }\n\n struct MessageRecord {\n uint256 nuisanceGasLeft;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n function run(\n Lib_OVMCodec.Transaction calldata _transaction,\n address _txStateManager\n ) external returns (bytes memory);\n\n\n /*******************\n * Context Opcodes *\n *******************/\n\n function ovmCALLER() external view returns (address _caller);\n function ovmADDRESS() external view returns (address _address);\n function ovmCALLVALUE() external view returns (uint _callValue);\n function ovmTIMESTAMP() external view returns (uint256 _timestamp);\n function ovmNUMBER() external view returns (uint256 _number);\n function ovmGASLIMIT() external view returns (uint256 _gasLimit);\n function ovmCHAINID() external view returns (uint256 _chainId);\n\n\n /**********************\n * L2 Context Opcodes *\n **********************/\n\n function ovmL1QUEUEORIGIN() external view returns (Lib_OVMCodec.QueueOrigin _queueOrigin);\n function ovmL1TXORIGIN() external view returns (address _l1TxOrigin);\n\n\n /*******************\n * Halting Opcodes *\n *******************/\n\n function ovmREVERT(bytes memory _data) external;\n\n\n /*****************************\n * Contract Creation Opcodes *\n *****************************/\n\n function ovmCREATE(bytes memory _bytecode) external returns (address _contract, bytes memory _revertdata);\n function ovmCREATE2(bytes memory _bytecode, bytes32 _salt) external returns (address _contract, bytes memory _revertdata);\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n function ovmGETNONCE() external returns (uint256 _nonce);\n function ovmINCREMENTNONCE() external;\n function ovmCREATEEOA(bytes32 _messageHash, uint8 _v, bytes32 _r, bytes32 _s) external;\n\n\n /****************************\n * Contract Calling Opcodes *\n ****************************/\n\n // Valueless ovmCALL for maintaining backwards compatibility with legacy OVM bytecode.\n function ovmCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmCALL(uint256 _gasLimit, address _address, uint256 _value, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmSTATICCALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n function ovmDELEGATECALL(uint256 _gasLimit, address _address, bytes memory _calldata) external returns (bool _success, bytes memory _returndata);\n\n\n /****************************\n * Contract Storage Opcodes *\n ****************************/\n\n function ovmSLOAD(bytes32 _key) external returns (bytes32 _value);\n function ovmSSTORE(bytes32 _key, bytes32 _value) external;\n\n\n /*************************\n * Contract Code Opcodes *\n *************************/\n\n function ovmEXTCODECOPY(address _contract, uint256 _offset, uint256 _length) external returns (bytes memory _code);\n function ovmEXTCODESIZE(address _contract) external returns (uint256 _size);\n function ovmEXTCODEHASH(address _contract) external returns (bytes32 _hash);\n\n\n /*********************\n * ETH Value Opcodes *\n *********************/\n\n function ovmBALANCE(address _contract) external returns (uint256 _balance);\n function ovmSELFBALANCE() external returns (uint256 _balance);\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit() external view returns (uint _maxTransactionGasLimit);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateManager\n */\ninterface iOVM_StateManager {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum ItemState {\n ITEM_UNTOUCHED,\n ITEM_LOADED,\n ITEM_CHANGED,\n ITEM_COMMITTED\n }\n\n /***************************\n * Public Functions: Misc *\n ***************************/\n\n function isAuthenticated(address _address) external view returns (bool);\n\n /***************************\n * Public Functions: Setup *\n ***************************/\n\n function owner() external view returns (address _owner);\n function ovmExecutionManager() external view returns (address _ovmExecutionManager);\n function setExecutionManager(address _ovmExecutionManager) external;\n\n\n /************************************\n * Public Functions: Account Access *\n ************************************/\n\n function putAccount(address _address, Lib_OVMCodec.Account memory _account) external;\n function putEmptyAccount(address _address) external;\n function getAccount(address _address) external view returns (Lib_OVMCodec.Account memory _account);\n function hasAccount(address _address) external view returns (bool _exists);\n function hasEmptyAccount(address _address) external view returns (bool _exists);\n function setAccountNonce(address _address, uint256 _nonce) external;\n function getAccountNonce(address _address) external view returns (uint256 _nonce);\n function getAccountEthAddress(address _address) external view returns (address _ethAddress);\n function getAccountStorageRoot(address _address) external view returns (bytes32 _storageRoot);\n function initPendingAccount(address _address) external;\n function commitPendingAccount(address _address, address _ethAddress, bytes32 _codeHash) external;\n function testAndSetAccountLoaded(address _address) external returns (bool _wasAccountAlreadyLoaded);\n function testAndSetAccountChanged(address _address) external returns (bool _wasAccountAlreadyChanged);\n function commitAccount(address _address) external returns (bool _wasAccountCommitted);\n function incrementTotalUncommittedAccounts() external;\n function getTotalUncommittedAccounts() external view returns (uint256 _total);\n function wasAccountChanged(address _address) external view returns (bool);\n function wasAccountCommitted(address _address) external view returns (bool);\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n function putContractStorage(address _contract, bytes32 _key, bytes32 _value) external;\n function getContractStorage(address _contract, bytes32 _key) external view returns (bytes32 _value);\n function hasContractStorage(address _contract, bytes32 _key) external view returns (bool _exists);\n function testAndSetContractStorageLoaded(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyLoaded);\n function testAndSetContractStorageChanged(address _contract, bytes32 _key) external returns (bool _wasContractStorageAlreadyChanged);\n function commitContractStorage(address _contract, bytes32 _key) external returns (bool _wasContractStorageCommitted);\n function incrementTotalUncommittedContractStorage() external;\n function getTotalUncommittedContractStorage() external view returns (uint256 _total);\n function wasContractStorageChanged(address _contract, bytes32 _key) external view returns (bool);\n function wasContractStorageCommitted(address _contract, bytes32 _key) external view returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_StateManagerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateManager } from \"./iOVM_StateManager.sol\";\n\n/**\n * @title iOVM_StateManagerFactory\n */\ninterface iOVM_StateManagerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _owner\n )\n external\n returns (\n iOVM_StateManager _ovmStateManager\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/Abs_FraudContributor.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/// Minimal contract to be inherited by contracts consumed by users that provide\n/// data for fraud proofs\nabstract contract Abs_FraudContributor is Lib_AddressResolver {\n /// Decorate your functions with this modifier to store how much total gas was\n /// consumed by the sender, to reward users fairly\n modifier contributesToFraudProof(bytes32 preStateRoot, bytes32 txHash) {\n uint256 startGas = gasleft();\n _;\n uint256 gasSpent = startGas - gasleft();\n iOVM_BondManager(resolve('OVM_BondManager')).recordGasSpent(preStateRoot, txHash, msg.sender, gasSpent);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string indexed _name,\n address _newAddress,\n address _oldAddress\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => address) private addresses;\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(\n string memory _name,\n address _address\n )\n external\n onlyOwner\n {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(\n _name,\n _address,\n oldAddress\n );\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(\n string memory _name\n )\n external\n view\n returns (\n address\n )\n {\n return addresses[_getNameHash(_name)];\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(\n string memory _name\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" +- }, +- "@openzeppelin/contracts/access/Ownable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_BytesUtils } from \"../utils/Lib_BytesUtils.sol\";\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\nimport { Lib_RLPWriter } from \"../rlp/Lib_RLPWriter.sol\";\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 constant internal KECCAK256_RLP_NULL_BYTES = keccak256(RLP_NULL_BYTES);\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _verified\n )\n {\n (\n bool exists,\n bytes memory value\n ) = get(_key, _proof, _root);\n\n return (\n exists && Lib_BytesUtils.equal(_value, value)\n );\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(proof, _key, _root);\n TrieNode[] memory newPath = _getNewPath(proof, pathLength, _key, keyRemainder, _value);\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n internal\n pure\n returns (\n bool _exists,\n bytes memory _value\n )\n {\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(\n exists || isFinalNode,\n \"Provided proof is invalid.\"\n );\n\n bytes memory value = exists ? _getNodeValue(proof[pathLength - 1]) : bytes('');\n\n return (\n exists,\n value\n );\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n internal\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n return keccak256(_makeLeafNode(\n Lib_BytesUtils.toNibbles(_key),\n _value\n ).encoded);\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid root hash\"\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n \"Invalid large internal hash\"\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n \"Invalid internal node hash\"\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key, meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - prefix % 2;\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path, updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert(\"Received a node with an unknown prefix\");\n }\n } else {\n revert(\"Received an unparseable node.\");\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (pathLength, Lib_BytesUtils.slice(key, currentKeyIndex), isFinalNode);\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode[] memory _newPath\n )\n {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) == _getNodeKey(lastNode).length\n && keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(Lib_BytesUtils.slice(keyRemainder, 1), _value);\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(lastNodeKey, keyRemainder);\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(lastNodeKey, 0, sharedNibbleLength);\n newNodes[totalNewNodes] = _makeExtensionNode(nextNodeKey, _getNodeHash(_value));\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(lastNodeKey, _getNodeValue(lastNode));\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeHash(modifiedLastNode.encoded));\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(newBranch, branchKey, _getNodeValue(lastNode));\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(\n TrieNode[] memory _nodes,\n bytes memory _key\n )\n private\n pure\n returns (\n bytes32 _updatedRoot\n )\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(currentNode, branchKey, previousNodeHash);\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(\n bytes memory _proof\n )\n private\n pure\n returns (\n TrieNode[] memory _parsed\n )\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(\n Lib_RLPReader.RLPItem memory _node\n )\n private\n pure\n returns (\n bytes32 _nodeID\n )\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _path\n )\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _key\n )\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(\n TrieNode memory _node\n )\n private\n pure\n returns (\n bytes memory _value\n )\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(\n bytes memory _encoded\n )\n private\n pure\n returns (\n bytes memory _hash\n )\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(\n TrieNode memory _node\n )\n private\n pure\n returns (\n NodeType _type\n )\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert(\"Invalid node type\");\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(\n bytes memory _a,\n bytes memory _b\n )\n private\n pure\n returns (\n uint256 _shared\n )\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n bytes[] memory _raw\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(\n Lib_RLPReader.RLPItem[] memory _items\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(\n TrieNode memory _node,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(\n bytes memory _key,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode()\n private\n pure\n returns (\n TrieNode memory _node\n )\n {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(\n TrieNode memory _branch,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n )\n private\n pure\n returns (\n TrieNode memory _updatedNode\n )\n {\n bytes memory encoded = _value.length < 32 ? _value : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(\n bytes memory _key,\n bool _isLeaf\n )\n private\n pure\n returns (\n bytes memory _prefixedKey\n )\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(\n bytes memory _path\n )\n private\n pure\n returns (\n bytes memory _unprefixedKey\n )\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n )\n private\n pure\n returns (\n TrieNode[] memory _joined\n )\n {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_StateTransitionerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/* Contract Imports */\nimport { OVM_StateTransitioner } from \"./OVM_StateTransitioner.sol\";\n\n/**\n * @title OVM_StateTransitionerFactory\n * @dev The State Transitioner Factory is used by the Fraud Verifier to create a new State\n * Transitioner during the initialization of a fraud proof.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateTransitionerFactory is iOVM_StateTransitionerFactory, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateTransitioner\n * @param _libAddressManager Address of the Address Manager.\n * @param _stateTransitionIndex Index of the state transition being verified.\n * @param _preStateRoot State root before the transition was executed.\n * @param _transactionHash Hash of the executed transaction.\n * @return New OVM_StateTransitioner instance.\n */\n function create(\n address _libAddressManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n override\n public\n returns (\n iOVM_StateTransitioner\n )\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"Create can only be done by the OVM_FraudVerifier.\"\n );\n\n return new OVM_StateTransitioner(\n _libAddressManager,\n _stateTransitionIndex,\n _preStateRoot,\n _transactionHash\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_StateTransitionerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Contract Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_StateTransitionerFactory\n */\ninterface iOVM_StateTransitionerFactory {\n\n /***************************************\n * Public Functions: Contract Creation *\n ***************************************/\n\n function create(\n address _proxyManager,\n uint256 _stateTransitionIndex,\n bytes32 _preStateRoot,\n bytes32 _transactionHash\n )\n external\n returns (\n iOVM_StateTransitioner _ovmStateTransitioner\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/verification/iOVM_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateTransitioner } from \"./iOVM_StateTransitioner.sol\";\n\n/**\n * @title iOVM_FraudVerifier\n */\ninterface iOVM_FraudVerifier {\n\n /**********\n * Events *\n **********/\n\n event FraudProofInitialized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n event FraudProofFinalized(\n bytes32 _preStateRoot,\n uint256 _preStateRootIndex,\n bytes32 _transactionHash,\n address _who\n );\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n function getStateTransitioner(bytes32 _preStateRoot, bytes32 _txHash) external view returns (iOVM_StateTransitioner _transitioner);\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n Lib_OVMCodec.Transaction calldata _transaction,\n Lib_OVMCodec.TransactionChainElement calldata _txChainElement,\n Lib_OVMCodec.ChainBatchHeader calldata _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _transactionProof\n ) external;\n\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader calldata _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof calldata _postStateRootProof\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateTransitioner } from \"../../iOVM/verification/iOVM_StateTransitioner.sol\";\nimport { iOVM_StateTransitionerFactory } from \"../../iOVM/verification/iOVM_StateTransitionerFactory.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\n\n/* Contract Imports */\nimport { Abs_FraudContributor } from \"./Abs_FraudContributor.sol\";\n\n\n\n/**\n * @title OVM_FraudVerifier\n * @dev The Fraud Verifier contract coordinates the entire fraud proof verification process.\n * If the fraud proof was successful it prunes any state batches from State Commitment Chain\n * which were published after the fraudulent state root.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_FraudVerifier is Lib_AddressResolver, Abs_FraudContributor, iOVM_FraudVerifier {\n\n /*******************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n mapping (bytes32 => iOVM_StateTransitioner) internal transitioners;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /***************************************\n * Public Functions: Transition Status *\n ***************************************/\n\n /**\n * Retrieves the state transitioner for a given root.\n * @param _preStateRoot State root to query a transitioner for.\n * @return _transitioner Corresponding state transitioner contract.\n */\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n override\n public\n view\n returns (\n iOVM_StateTransitioner _transitioner\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n\n /****************************************\n * Public Functions: Fraud Verification *\n ****************************************/\n\n /**\n * Begins the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _transaction OVM transaction claimed to be fraudulent.\n * @param _txChainElement OVM transaction chain element.\n * @param _transactionBatchHeader Batch header for the provided transaction.\n * @param _transactionProof Inclusion proof for the provided transaction.\n */\n function initializeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _transactionBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _transactionProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, Lib_OVMCodec.hashTransaction(_transaction))\n {\n bytes32 _txHash = Lib_OVMCodec.hashTransaction(_transaction);\n\n if (_hasStateTransitioner(_preStateRoot, _txHash)) {\n return;\n }\n\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_CanonicalTransactionChain ovmCanonicalTransactionChain = iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\"));\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmCanonicalTransactionChain.verifyTransaction(\n _transaction,\n _txChainElement,\n _transactionBatchHeader,\n _transactionProof\n ),\n \"Invalid transaction inclusion proof.\"\n );\n\n require (\n _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,\n \"Pre-state root global index must equal to the transaction root global index.\"\n );\n\n _deployTransitioner(_preStateRoot, _txHash, _preStateRootProof.index);\n\n emit FraudProofInitialized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n /**\n * Finalizes the fraud verification process.\n * @param _preStateRoot State root before the fraudulent transaction.\n * @param _preStateRootBatchHeader Batch header for the provided pre-state root.\n * @param _preStateRootProof Inclusion proof for the provided pre-state root.\n * @param _txHash The transaction for the state root\n * @param _postStateRoot State root after the fraudulent transaction.\n * @param _postStateRootBatchHeader Batch header for the provided post-state root.\n * @param _postStateRootProof Inclusion proof for the provided post-state root.\n */\n function finalizeFraudVerification(\n bytes32 _preStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _preStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _preStateRootProof,\n bytes32 _txHash,\n bytes32 _postStateRoot,\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _postStateRootProof\n )\n override\n public\n contributesToFraudProof(_preStateRoot, _txHash)\n {\n iOVM_StateTransitioner transitioner = getStateTransitioner(_preStateRoot, _txHash);\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n\n require(\n transitioner.isComplete() == true,\n \"State transition process must be completed prior to finalization.\"\n );\n\n require (\n _postStateRootBatchHeader.prevTotalElements + _postStateRootProof.index == _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1,\n \"Post-state root global index must equal to the pre state root global index plus one.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _preStateRoot,\n _preStateRootBatchHeader,\n _preStateRootProof\n ),\n \"Invalid pre-state root inclusion proof.\"\n );\n\n require(\n ovmStateCommitmentChain.verifyStateCommitment(\n _postStateRoot,\n _postStateRootBatchHeader,\n _postStateRootProof\n ),\n \"Invalid post-state root inclusion proof.\"\n );\n\n // If the post state root did not match, then there was fraud and we should delete the batch\n require(\n _postStateRoot != transitioner.getPostStateRoot(),\n \"State transition has not been proven fraudulent.\"\n );\n\n _cancelStateTransition(_postStateRootBatchHeader, _preStateRoot);\n\n // TEMPORARY: Remove the transitioner; for minnet.\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitioner(0x0000000000000000000000000000000000000000);\n\n emit FraudProofFinalized(\n _preStateRoot,\n _preStateRootProof.index,\n _txHash,\n msg.sender\n );\n }\n\n\n /************************************\n * Internal Functions: Verification *\n ************************************/\n\n /**\n * Checks whether a transitioner already exists for a given pre-state root.\n * @param _preStateRoot Pre-state root to check.\n * @return _exists Whether or not we already have a transitioner for the root.\n */\n function _hasStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n internal\n view\n returns (\n bool _exists\n )\n {\n return address(getStateTransitioner(_preStateRoot, _txHash)) != address(0);\n }\n\n /**\n * Deploys a new state transitioner.\n * @param _preStateRoot Pre-state root to initialize the transitioner with.\n * @param _txHash Hash of the transaction this transitioner will execute.\n * @param _stateTransitionIndex Index of the transaction in the chain.\n */\n function _deployTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n uint256 _stateTransitionIndex\n )\n internal\n {\n transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))] = iOVM_StateTransitionerFactory(\n resolve(\"OVM_StateTransitionerFactory\")\n ).create(\n address(libAddressManager),\n _stateTransitionIndex,\n _preStateRoot,\n _txHash\n );\n }\n\n /**\n * Removes a state transition from the state commitment chain.\n * @param _postStateRootBatchHeader Header for the post-state root.\n * @param _preStateRoot Pre-state root hash.\n */\n function _cancelStateTransition(\n Lib_OVMCodec.ChainBatchHeader memory _postStateRootBatchHeader,\n bytes32 _preStateRoot\n )\n internal\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(resolve(\"OVM_StateCommitmentChain\"));\n iOVM_BondManager ovmBondManager = iOVM_BondManager(resolve(\"OVM_BondManager\"));\n\n // Delete the state batch.\n ovmStateCommitmentChain.deleteStateBatch(\n _postStateRootBatchHeader\n );\n\n // Get the timestamp and publisher for that block.\n (uint256 timestamp, address publisher) = abi.decode(_postStateRootBatchHeader.extraData, (uint256, address));\n\n // Slash the bonds at the bond manager.\n ovmBondManager.finalize(\n _preStateRoot,\n publisher,\n timestamp\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title iOVM_StateCommitmentChain\n */\ninterface iOVM_StateCommitmentChain {\n\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (\n uint256 _lastSequencerTimestamp\n );\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n )\n external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n external\n view\n returns (\n bool _verified\n );\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n external\n view\n returns (\n bool _inside\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"./iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title iOVM_CanonicalTransactionChain\n */\ninterface iOVM_CanonicalTransactionChain {\n\n /**********\n * Events *\n **********/\n\n event TransactionEnqueued(\n address _l1TxOrigin,\n address _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n external\n view\n returns (\n iOVM_ChainStorageContainer\n );\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n external\n view\n returns (\n uint256 _totalElements\n );\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n external\n view\n returns (\n uint256 _totalBatches\n );\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n external\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n );\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n external\n view\n returns (\n uint40\n );\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n external\n view\n returns (\n uint40\n );\n\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n external;\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * @param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 _numQueuedTransactions\n )\n external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n )\n external;\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n external\n view\n returns (\n bool\n );\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/chain/iOVM_ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_ChainStorageContainer\n */\ninterface iOVM_ChainStorageContainer {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata()\n external\n view\n returns (\n bytes27\n );\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length()\n external\n view\n returns (\n uint256\n );\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(\n bytes32 _object\n )\n external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(\n uint256 _index\n )\n external\n view\n returns (\n bytes32\n );\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/verification/OVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_BondManager, Errors, ERC20 } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\n\n/**\n * @title OVM_BondManager\n * @dev The Bond Manager contract handles deposits in the form of an ERC20 token from bonded\n * Proposers. It also handles the accounting of gas costs spent by a Verifier during the course of a\n * fraud proof. In the event of a successful fraud proof, the fraudulent Proposer's bond is slashed,\n * and the Verifier's gas costs are refunded.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n\n /****************************\n * Constants and Parameters *\n ****************************/\n\n /// The period to find the earliest fraud proof for a publisher\n uint256 public constant multiFraudProofPeriod = 7 days;\n\n /// The dispute period\n uint256 public constant disputePeriodSeconds = 7 days;\n\n /// The minimum collateral a sequencer must post\n uint256 public constant requiredCollateral = 1 ether;\n\n\n /*******************************************\n * Contract Variables: Contract References *\n *******************************************/\n\n /// The bond token\n ERC20 immutable public token;\n\n\n /********************************************\n * Contract Variables: Internal Accounting *\n *******************************************/\n\n /// The bonds posted by each proposer\n mapping(address => Bond) public bonds;\n\n /// For each pre-state root, there's an array of witnessProviders that must be rewarded\n /// for posting witnesses\n mapping(bytes32 => Rewards) public witnessProviders;\n\n\n /***************\n * Constructor *\n ***************/\n\n /// Initializes with a ERC20 token to be used for the fidelity bonds\n /// and with the Address Manager\n constructor(\n ERC20 _token,\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {\n token = _token;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /// Adds `who` to the list of witnessProviders for the provided `preStateRoot`.\n function recordGasSpent(bytes32 _preStateRoot, bytes32 _txHash, address who, uint256 gasSpent) override public {\n // The sender must be the transitioner that corresponds to the claimed pre-state root\n address transitioner = address(iOVM_FraudVerifier(resolve(\"OVM_FraudVerifier\")).getStateTransitioner(_preStateRoot, _txHash));\n require(transitioner == msg.sender, Errors.ONLY_TRANSITIONER);\n\n witnessProviders[_preStateRoot].total += gasSpent;\n witnessProviders[_preStateRoot].gasSpent[who] += gasSpent;\n }\n\n /// Slashes + distributes rewards or frees up the sequencer's bond, only called by\n /// `FraudVerifier.finalizeFraudVerification`\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) override public {\n require(msg.sender == resolve(\"OVM_FraudVerifier\"), Errors.ONLY_FRAUD_VERIFIER);\n require(witnessProviders[_preStateRoot].canClaim == false, Errors.ALREADY_FINALIZED);\n\n // allow users to claim from that state root's\n // pool of collateral (effectively slashing the sequencer)\n witnessProviders[_preStateRoot].canClaim = true;\n\n Bond storage bond = bonds[publisher];\n if (bond.firstDisputeAt == 0) {\n bond.firstDisputeAt = block.timestamp;\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n } else if (\n // only update the disputed state root for the publisher if it's within\n // the dispute period _and_ if it's before the previous one\n block.timestamp < bond.firstDisputeAt + multiFraudProofPeriod &&\n timestamp < bond.earliestTimestamp\n ) {\n bond.earliestDisputedStateRoot = _preStateRoot;\n bond.earliestTimestamp = timestamp;\n }\n\n // if the fraud proof's dispute period does not intersect with the\n // withdrawal's timestamp, then the user should not be slashed\n // e.g if a user at day 10 submits a withdrawal, and a fraud proof\n // from day 1 gets published, the user won't be slashed since day 8 (1d + 7d)\n // is before the user started their withdrawal. on the contrary, if the user\n // had started their withdrawal at, say, day 6, they would be slashed\n if (\n bond.withdrawalTimestamp != 0 &&\n uint256(bond.withdrawalTimestamp) > timestamp + disputePeriodSeconds &&\n bond.state == State.WITHDRAWING\n ) {\n return;\n }\n\n // slash!\n bond.state = State.NOT_COLLATERALIZED;\n }\n\n /// Sequencers call this function to post collateral which will be used for\n /// the `appendBatch` call\n function deposit() override public {\n require(\n token.transferFrom(msg.sender, address(this), requiredCollateral),\n Errors.ERC20_ERR\n );\n\n // This cannot overflow\n bonds[msg.sender].state = State.COLLATERALIZED;\n }\n\n /// Starts the withdrawal for a publisher\n function startWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n require(bond.withdrawalTimestamp == 0, Errors.WITHDRAWAL_PENDING);\n require(bond.state == State.COLLATERALIZED, Errors.WRONG_STATE);\n\n bond.state = State.WITHDRAWING;\n bond.withdrawalTimestamp = uint32(block.timestamp);\n }\n\n /// Finalizes a pending withdrawal from a publisher\n function finalizeWithdrawal() override public {\n Bond storage bond = bonds[msg.sender];\n\n require(\n block.timestamp >= uint256(bond.withdrawalTimestamp) + disputePeriodSeconds,\n Errors.TOO_EARLY\n );\n require(bond.state == State.WITHDRAWING, Errors.SLASHED);\n\n // refunds!\n bond.state = State.NOT_COLLATERALIZED;\n bond.withdrawalTimestamp = 0;\n\n require(\n token.transfer(msg.sender, requiredCollateral),\n Errors.ERC20_ERR\n );\n }\n\n /// Claims the user's reward for the witnesses they provided for the earliest\n /// disputed state root of the designated publisher\n function claim(address who) override public {\n Bond storage bond = bonds[who];\n require(\n block.timestamp >= bond.firstDisputeAt + multiFraudProofPeriod,\n Errors.WAIT_FOR_DISPUTES\n );\n\n // reward the earliest state root for this publisher\n bytes32 _preStateRoot = bond.earliestDisputedStateRoot;\n Rewards storage rewards = witnessProviders[_preStateRoot];\n\n // only allow claiming if fraud was proven in `finalize`\n require(rewards.canClaim, Errors.CANNOT_CLAIM);\n\n // proportional allocation - only reward 50% (rest gets locked in the\n // contract forever\n uint256 amount = (requiredCollateral * rewards.gasSpent[msg.sender]) / (2 * rewards.total);\n\n // reset the user's spent gas so they cannot double claim\n rewards.gasSpent[msg.sender] = 0;\n\n // transfer\n require(token.transfer(msg.sender, amount), Errors.ERC20_ERR);\n }\n\n /// Checks if the user is collateralized\n function isCollateralized(address who) override public view returns (bool) {\n return bonds[who].state == State.COLLATERALIZED;\n }\n\n /// Gets how many witnesses the user has provided for the state root\n function getGasSpent(bytes32 preStateRoot, address who) override public view returns (uint256) {\n return witnessProviders[preStateRoot].gasSpent[who];\n }\n}\n" +- }, +- "contracts/test-helpers/Mock_FraudVerifier.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\nimport { OVM_BondManager } from \"./../optimistic-ethereum/OVM/verification/OVM_BondManager.sol\";\n\ncontract Mock_FraudVerifier {\n OVM_BondManager bondManager;\n\n mapping (bytes32 => address) transitioners;\n\n function setBondManager(OVM_BondManager _bondManager) public {\n bondManager = _bondManager;\n }\n\n function setStateTransitioner(bytes32 preStateRoot, bytes32 txHash, address addr) public {\n transitioners[keccak256(abi.encodePacked(preStateRoot, txHash))] = addr;\n }\n\n function getStateTransitioner(\n bytes32 _preStateRoot,\n bytes32 _txHash\n )\n public\n view\n returns (\n address\n )\n {\n return transitioners[keccak256(abi.encodePacked(_preStateRoot, _txHash))];\n }\n\n function finalize(bytes32 _preStateRoot, address publisher, uint256 timestamp) public {\n bondManager.finalize(_preStateRoot, publisher, timestamp);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_FraudVerifier } from \"../../iOVM/verification/iOVM_FraudVerifier.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* External Imports */\nimport '@openzeppelin/contracts/math/SafeMath.sol';\n\n/**\n * @title OVM_StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateCommitmentChain is iOVM_StateCommitmentChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n )\n Lib_AddressResolver(_libAddressManager)\n {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-SCC-batches\")\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function getLastSequencerTimestamp()\n override\n public\n view\n returns (\n uint256 _lastSequencerTimestamp\n )\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n )\n override\n public\n {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n iOVM_BondManager(resolve(\"OVM_BondManager\")).isCollateralized(msg.sender),\n \"Proposer does not have enough collateral posted\"\n );\n\n require(\n _batch.length > 0,\n \"Cannot submit an empty state batch.\"\n );\n\n require(\n getTotalElements() + _batch.length <= iOVM_CanonicalTransactionChain(resolve(\"OVM_CanonicalTransactionChain\")).getTotalElements(),\n \"Number of state roots cannot exceed the number of canonical transactions.\"\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(\n _batch,\n abi.encode(block.timestamp, msg.sender)\n );\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function deleteStateBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n {\n require(\n msg.sender == resolve(\"OVM_FraudVerifier\"),\n \"State batches can only be deleted by the OVM_FraudVerifier.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n insideFraudProofWindow(_batchHeader),\n \"State batches can only be deleted within the fraud proof window.\"\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n\n /**\n * @inheritdoc iOVM_StateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n override\n public\n view\n returns (\n bool _inside\n )\n {\n (uint256 timestamp,) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(\n timestamp != 0,\n \"Batch header timestamp cannot be zero\"\n );\n return SafeMath.add(timestamp, FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return (\n totalElements,\n lastSequencerTimestamp\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(\n bytes32[] memory _batch,\n bytes memory _extraData\n )\n internal\n {\n address sequencer = resolve(\"OVM_Proposer\");\n (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n \"Cannot publish state roots within the sequencer publication window.\"\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n \"Invalid batch index.\"\n );\n\n require(\n _isValidBatchHeader(_batchHeader),\n \"Invalid batch header.\"\n );\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(\n uint40(_batchHeader.prevTotalElements),\n 0\n )\n );\n\n emit StateBatchDeleted(\n _batchHeader.batchIndex,\n _batchHeader.batchRoot\n );\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n )\n internal\n view\n returns (\n bool\n )\n {\n return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(_batchHeader.batchIndex);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying,\n * then this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n require(\n _elements.length > 0,\n \"Lib_MerkleTree: Must provide at least one leaf hash.\"\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i) ];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling )\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0 (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n internal\n pure\n returns (\n bool\n )\n {\n require(\n _totalLeaves > 0,\n \"Lib_MerkleTree: Total leaves must be greater than zero.\"\n );\n\n require(\n _index < _totalLeaves,\n \"Lib_MerkleTree: Index out of bounds.\"\n );\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n \"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\"\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(\n abi.encodePacked(\n _siblings[i],\n computedRoot\n )\n );\n } else {\n computedRoot = keccak256(\n abi.encodePacked(\n computedRoot,\n _siblings[i]\n )\n );\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(\n uint256 _in\n )\n private\n pure\n returns (\n uint256\n )\n {\n require(\n _in > 0,\n \"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\"\n );\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (uint(1) << i) - 1 << i != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_ChainStorageContainer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../libraries/utils/Lib_Buffer.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/* Interface Imports */\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/**\n * @title OVM_ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete functionality.\n * This provides gas efficiency gains by enabling it to overwrite storage slots which can no longer be used\n * in a fraud proof due to the fraud window having passed, and the associated chain state or\n * transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ChainStorageContainer is iOVM_ChainStorageContainer, Lib_AddressResolver {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(\n address _libAddressManager,\n string memory _owner\n )\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n \"OVM_ChainStorageContainer: Function can only be called by the owner.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function setGlobalMetadata(\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function getGlobalMetadata()\n override\n public\n view\n returns (\n bytes27\n )\n {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function length()\n override\n public\n view\n returns (\n uint256\n )\n {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function push(\n bytes32 _object,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function get(\n uint256 _index\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index)\n );\n }\n\n /**\n * @inheritdoc iOVM_ChainStorageContainer\n */\n function deleteElementsAfterInclusive(\n uint256 _index,\n bytes27 _globalMetadata\n )\n override\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(\n uint40(_index),\n _globalMetadata\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/utils/Lib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping (uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(\n Buffer storage _self,\n bytes32 _value\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(\n _value,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(\n Buffer storage _self,\n uint256 _index\n )\n internal\n view\n returns (\n bytes32\n )\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n\n require(\n _index < ctx.length,\n \"Index out of bounds.\"\n );\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(\n _index,\n ctx.extraData\n );\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(\n Buffer storage _self\n )\n internal\n view\n returns (\n uint40\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(\n Buffer storage _self,\n bytes27 _extraData\n )\n internal\n {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(\n Buffer storage _self\n )\n internal\n view\n returns (\n bytes27\n )\n {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(\n Buffer storage _self,\n BufferContext memory _ctx\n )\n internal\n {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(\n Buffer storage _self\n )\n internal\n view\n returns (\n BufferContext memory\n )\n {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n length := and(context, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n extraData := and(context, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\n }\n\n return BufferContext({\n length: length,\n extraData: extraData\n });\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Buffer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_Buffer } from \"../../optimistic-ethereum/libraries/utils/Lib_Buffer.sol\";\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(\n bytes32 _value,\n bytes27 _extraData\n )\n public\n {\n buf.push(\n _value,\n _extraData\n );\n }\n\n function get(\n uint256 _index\n )\n public\n view\n returns (\n bytes32\n )\n {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index\n );\n }\n\n function deleteElementsAfterInclusive(\n uint40 _index,\n bytes27 _extraData\n )\n public\n {\n return buf.deleteElementsAfterInclusive(\n _index,\n _extraData\n );\n }\n\n function getLength()\n public\n view\n returns (\n uint40\n )\n {\n return buf.getLength();\n }\n\n function setExtraData(\n bytes27 _extraData\n )\n public\n {\n return buf.setExtraData(\n _extraData\n );\n }\n\n function getExtraData()\n public\n view\n returns (\n bytes27\n )\n {\n return buf.getExtraData();\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_MerkleTree } from \"../../libraries/utils/Lib_MerkleTree.sol\";\n\n/* Interface Imports */\nimport { iOVM_CanonicalTransactionChain } from \"../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_ChainStorageContainer } from \"../../iOVM/chain/iOVM_ChainStorageContainer.sol\";\n\n/* Contract Imports */\nimport { OVM_ExecutionManager } from \"../execution/OVM_ExecutionManager.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the Sequencer\n * will eventually append it to the rollup state.\n * If the Sequencer does not include an enqueued transaction within the 'force inclusion period',\n * then any account may force it to be included by calling appendQueueBatch().\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_AddressResolver {\n\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 constant public MIN_ROLLUP_TX_GAS = 100000;\n uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;\n uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32;\n\n // Encoding-related (all in bytes)\n uint256 constant internal BATCH_CONTEXT_SIZE = 16;\n uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 constant internal BATCH_CONTEXT_START_POS = 15;\n uint256 constant internal TX_DATA_HEADER_SIZE = 3;\n uint256 constant internal BYTES_TILL_TX_DATA = 65;\n\n\n /*************\n * Variables *\n *************/\n\n uint256 public forceInclusionPeriodSeconds;\n uint256 public forceInclusionPeriodBlocks;\n uint256 public maxTransactionGasLimit;\n\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _forceInclusionPeriodSeconds,\n uint256 _forceInclusionPeriodBlocks,\n uint256 _maxTransactionGasLimit\n )\n Lib_AddressResolver(_libAddressManager)\n {\n forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;\n forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;\n maxTransactionGasLimit = _maxTransactionGasLimit;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-batches\")\n );\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue()\n override\n public\n view\n returns (\n iOVM_ChainStorageContainer\n )\n {\n return iOVM_ChainStorageContainer(\n resolve(\"OVM_ChainStorageContainer-CTC-queue\")\n );\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements()\n override\n public\n view\n returns (\n uint256 _totalElements\n )\n {\n (uint40 totalElements,,,) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches()\n override\n public\n view\n returns (\n uint256 _totalBatches\n )\n {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,uint40 nextQueueIndex,,) = _getBatchExtraData();\n return nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,uint40 lastTimestamp,) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber()\n override\n public\n view\n returns (\n uint40\n )\n {\n (,,,uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(\n uint256 _index\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n return _getQueueElement(\n _index,\n queue()\n );\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements()\n override\n public\n view\n returns (\n uint40\n )\n {\n return getQueueLength() - getNextQueueIndex();\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength()\n override\n public\n view\n returns (\n uint40\n )\n {\n return _getQueueLength(\n queue()\n );\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n )\n override\n public\n {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n \"Transaction gas limit exceeds maximum for rollup transaction.\"\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n \"Transaction gas limit too low to enqueue.\"\n );\n\n // We need to consume some amount of L1 gas in order to rate limit transactions going into\n // L2. However, L2 is cheaper than L1 so we only need to burn some small proportion of the\n // provided L1 gas.\n uint256 gasToConsume = _gasLimit/L2_GAS_DISCOUNT_DIVISOR;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n \"Insufficient gas for L2 rate limiting burn.\"\n );\n\n // Here we do some \"dumb\" work in order to burn gas, although we should probably replace\n // this with something like minting gas token later on.\n uint256 i;\n while(startingGas - gasleft() < gasToConsume) {\n i++;\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n msg.sender,\n _target,\n _gasLimit,\n _data\n )\n );\n\n bytes32 timestampAndBlockNumber;\n assembly {\n timestampAndBlockNumber := timestamp()\n timestampAndBlockNumber := or(timestampAndBlockNumber, shl(40, number()))\n }\n\n iOVM_ChainStorageContainer queueRef = queue();\n\n queueRef.push(transactionHash);\n queueRef.push(timestampAndBlockNumber);\n\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2 and subtract 1.\n uint256 queueIndex = queueRef.length() / 2 - 1;\n emit TransactionEnqueued(\n msg.sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Appends a given number of queued transactions as a single batch.\n * param _numQueuedTransactions Number of transactions to append.\n */\n function appendQueueBatch(\n uint256 // _numQueuedTransactions\n )\n override\n public\n pure\n {\n // TEMPORARY: Disable `appendQueueBatch` for minnet\n revert(\"appendQueueBatch is currently disabled.\");\n\n // _numQueuedTransactions = Math.min(_numQueuedTransactions, getNumPendingQueueElements());\n // require(\n // _numQueuedTransactions > 0,\n // \"Must append more than zero transactions.\"\n // );\n\n // bytes32[] memory leaves = new bytes32[](_numQueuedTransactions);\n // uint40 nextQueueIndex = getNextQueueIndex();\n\n // for (uint256 i = 0; i < _numQueuedTransactions; i++) {\n // if (msg.sender != resolve(\"OVM_Sequencer\")) {\n // Lib_OVMCodec.QueueElement memory el = getQueueElement(nextQueueIndex);\n // require(\n // el.timestamp + forceInclusionPeriodSeconds < block.timestamp,\n // \"Queue transactions cannot be submitted during the sequencer inclusion period.\"\n // );\n // }\n // leaves[i] = _getQueueLeafHash(nextQueueIndex);\n // nextQueueIndex++;\n // }\n\n // Lib_OVMCodec.QueueElement memory lastElement = getQueueElement(nextQueueIndex - 1);\n\n // _appendBatch(\n // Lib_MerkleTree.getMerkleRoot(leaves),\n // _numQueuedTransactions,\n // _numQueuedTransactions,\n // lastElement.timestamp,\n // lastElement.blockNumber\n // );\n\n // emit QueueBatchAppended(\n // nextQueueIndex - _numQueuedTransactions,\n // _numQueuedTransactions,\n // getTotalElements()\n // );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch()\n override\n public\n {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n \"Actual batch start index does not match expected start index.\"\n );\n\n require(\n msg.sender == resolve(\"OVM_Sequencer\"),\n \"Function can only be called by the Sequencer.\"\n );\n\n require(\n numContexts > 0,\n \"Must provide at least one batch context.\"\n );\n\n require(\n totalElementsToAppend > 0,\n \"Must append at least one element.\"\n );\n\n uint40 nextTransactionPtr = uint40(BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts);\n\n require(\n msg.data.length >= nextTransactionPtr,\n \"Not enough BatchContexts provided.\"\n );\n\n // Take a reference to the queue and its length so we don't have to keep resolving it.\n // Length isn't going to change during the course of execution, so it's fine to simply\n // resolve this once at the start. Saves gas.\n iOVM_ChainStorageContainer queueRef = queue();\n uint40 queueLength = _getQueueLength(queueRef);\n\n // Reserve some memory to save gas on hashing later on. This is a relatively safe estimate\n // for the average transaction size that will prevent having to resize this chunk of memory\n // later on. Saves gas.\n bytes memory hashMemory = new bytes((msg.data.length / totalElementsToAppend) * 2);\n\n // Initialize the array of canonical chain leaves that we will append.\n bytes32[] memory leaves = new bytes32[](totalElementsToAppend);\n\n // Each leaf index corresponds to a tx, either sequenced or enqueued.\n uint32 leafIndex = 0;\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // We will sequentially append leaves which are pointers to the queue.\n // The initial queue index is what is currently in storage.\n uint40 nextQueueIndex = getNextQueueIndex();\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n if (i == 0) {\n // Execute a special check for the first batch.\n _validateFirstBatchContext(nextContext);\n }\n\n // Execute this check on every single batch, including the first one.\n _validateNextBatchContext(\n curContext,\n nextContext,\n nextQueueIndex,\n queueRef\n );\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n for (uint32 j = 0; j < curContext.numSequencedTransactions; j++) {\n uint256 txDataLength;\n assembly {\n txDataLength := shr(232, calldataload(nextTransactionPtr))\n }\n require(\n txDataLength <= MAX_ROLLUP_TX_SIZE,\n \"Transaction data size exceeds maximum for rollup transaction.\"\n );\n\n leaves[leafIndex] = _getSequencerLeafHash(\n curContext,\n nextTransactionPtr,\n txDataLength,\n hashMemory\n );\n\n nextTransactionPtr += uint40(TX_DATA_HEADER_SIZE + txDataLength);\n numSequencerTransactions++;\n leafIndex++;\n }\n\n // Now process any subsequent queue transactions.\n for (uint32 j = 0; j < curContext.numSubsequentQueueTransactions; j++) {\n require(\n nextQueueIndex < queueLength,\n \"Not enough queued transactions to append.\"\n );\n\n leaves[leafIndex] = _getQueueLeafHash(nextQueueIndex);\n nextQueueIndex++;\n leafIndex++;\n }\n }\n\n _validateFinalBatchContext(\n curContext,\n nextQueueIndex,\n queueLength,\n queueRef\n );\n\n require(\n msg.data.length == nextTransactionPtr,\n \"Not all sequencer transactions were processed.\"\n );\n\n require(\n leafIndex == totalElementsToAppend,\n \"Actual transaction index does not match expected total elements to append.\"\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend - numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at least one queue element.\n // We increment nextQueueIndex after processing each queue element,\n // so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = _getQueueElement(\n nextQueueIndex - 1,\n queueRef\n );\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // For efficiency reasons getMerkleRoot modifies the `leaves` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n _appendBatch(\n Lib_MerkleTree.getMerkleRoot(leaves),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n }\n\n /**\n * Verifies whether a transaction is included in the chain.\n * @param _transaction Transaction to verify.\n * @param _txChainElement Transaction chain element corresponding to the transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof Inclusion proof for the provided transaction chain element.\n * @return True if the transaction exists in the CTC, false if not.\n */\n function verifyTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n override\n public\n view\n returns (\n bool\n )\n {\n if (_txChainElement.isSequenced == true) {\n return _verifySequencerTransaction(\n _transaction,\n _txChainElement,\n _batchHeader,\n _inclusionProof\n );\n } else {\n return _verifyQueueTransaction(\n _transaction,\n _txChainElement.queueIndex,\n _batchHeader,\n _inclusionProof\n );\n }\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(\n uint256 _index\n )\n internal\n pure\n returns (\n BatchContext memory\n )\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(232, calldataload(add(contextPtr, 3)))\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n nextQueueIndex := shr(40, and(extraData, 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000))\n lastTimestamp := shr(80, and(extraData, 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000))\n lastBlockNumber := shr(120, and(extraData, 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000))\n }\n\n return (\n totalElements,\n nextQueueIndex,\n lastTimestamp,\n lastBlockNumber\n );\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIndex Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIndex,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n pure\n returns (\n bytes27\n )\n {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIndex))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Retrieves the hash of a queue element.\n * @param _index Index of the queue element to retrieve a hash for.\n * @return Hash of the queue element.\n */\n function _getQueueLeafHash(\n uint256 _index\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement({\n isSequenced: false,\n queueIndex: _index,\n timestamp: 0,\n blockNumber: 0,\n txData: hex\"\"\n })\n );\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function _getQueueElement(\n uint256 _index,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n Lib_OVMCodec.QueueElement memory _element\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the actual desired queue index\n // we need to multiply by 2.\n uint40 trueIndex = uint40(_index * 2);\n bytes32 transactionHash = _queueRef.get(trueIndex);\n bytes32 timestampAndBlockNumber = _queueRef.get(trueIndex + 1);\n\n uint40 elementTimestamp;\n uint40 elementBlockNumber;\n assembly {\n elementTimestamp := and(timestampAndBlockNumber, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\n elementBlockNumber := shr(40, and(timestampAndBlockNumber, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\n }\n\n return Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: elementTimestamp,\n blockNumber: elementBlockNumber\n });\n }\n\n /**\n * Retrieves the length of the queue.\n * @return Length of the queue.\n */\n function _getQueueLength(\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n returns (\n uint40\n )\n {\n // The underlying queue data structure stores 2 elements\n // per insertion, so to get the real queue length we need\n // to divide by 2.\n return uint40(_queueRef.length() / 2);\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _context Batch context for the given element.\n * @param _nextTransactionPtr Pointer to the next transaction in the calldata.\n * @param _txDataLength Length of the transaction item.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n BatchContext memory _context,\n uint256 _nextTransactionPtr,\n uint256 _txDataLength,\n bytes memory _hashMemory\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n // Only allocate more memory if we didn't reserve enough to begin with.\n if (BYTES_TILL_TX_DATA + _txDataLength > _hashMemory.length) {\n _hashMemory = new bytes(BYTES_TILL_TX_DATA + _txDataLength);\n }\n\n uint256 ctxTimestamp = _context.timestamp;\n uint256 ctxBlockNumber = _context.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(_hashMemory, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength)\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, _txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Retrieves the hash of a sequencer element.\n * @param _txChainElement The chain element which is hashed to calculate the leaf.\n * @return Hash of the sequencer element.\n */\n function _getSequencerLeafHash(\n Lib_OVMCodec.TransactionChainElement memory _txChainElement\n )\n internal\n view\n returns(\n bytes32\n )\n {\n bytes memory txData = _txChainElement.txData;\n uint256 txDataLength = _txChainElement.txData.length;\n\n bytes memory chainElement = new bytes(BYTES_TILL_TX_DATA + txDataLength);\n uint256 ctxTimestamp = _txChainElement.timestamp;\n uint256 ctxBlockNumber = _txChainElement.blockNumber;\n\n bytes32 leafHash;\n assembly {\n let chainElementStart := add(chainElement, 0x20)\n\n // Set the first byte equal to `1` to indicate this is a sequencer chain element.\n // This distinguishes sequencer ChainElements from queue ChainElements because\n // all queue ChainElements are ABI encoded and the first byte of ABI encoded\n // elements is always zero\n mstore8(chainElementStart, 1)\n\n mstore(add(chainElementStart, 1), ctxTimestamp)\n mstore(add(chainElementStart, 33), ctxBlockNumber)\n\n pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength))\n\n leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength))\n }\n\n return leafHash;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n )\n internal\n {\n iOVM_ChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex,,) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec.ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex\"\"\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n\n /**\n * Checks that the first batch context in a sequencer submission is valid\n * @param _firstContext The batch context to validate.\n */\n function _validateFirstBatchContext(\n BatchContext memory _firstContext\n )\n internal\n view\n {\n // If there are existing elements, this batch must have the same context\n // or a later timestamp and block number.\n if (getTotalElements() > 0) {\n (,, uint40 lastTimestamp, uint40 lastBlockNumber) = _getBatchExtraData();\n\n require(\n _firstContext.blockNumber >= lastBlockNumber,\n \"Context block number is lower than last submitted.\"\n );\n\n require(\n _firstContext.timestamp >= lastTimestamp,\n \"Context timestamp is lower than last submitted.\"\n );\n }\n\n // Sequencer cannot submit contexts which are more than the force inclusion period old.\n require(\n _firstContext.timestamp + forceInclusionPeriodSeconds >= block.timestamp,\n \"Context timestamp too far in the past.\"\n );\n\n require(\n _firstContext.blockNumber + forceInclusionPeriodBlocks >= block.number,\n \"Context block number too far in the past.\"\n );\n }\n\n /**\n * Checks that a given batch context has a time context which is below a given que element\n * @param _context The batch context to validate has values lower.\n * @param _queueIndex Index of the queue element we are validating came later than the context.\n * @param _queueRef The storage container for the queue.\n */\n function _validateContextBeforeEnqueue(\n BatchContext memory _context,\n uint40 _queueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n Lib_OVMCodec.QueueElement memory nextQueueElement = _getQueueElement(\n _queueIndex,\n _queueRef\n );\n\n // If the force inclusion period has passed for an enqueued transaction, it MUST be the next chain element.\n require(\n block.timestamp < nextQueueElement.timestamp + forceInclusionPeriodSeconds,\n \"Previously enqueued batches have expired and must be appended before a new sequencer batch.\"\n );\n\n // Just like sequencer transaction times must be increasing relative to each other,\n // We also require that they be increasing relative to any interspersed queue elements.\n require(\n _context.timestamp <= nextQueueElement.timestamp,\n \"Sequencer transaction timestamp exceeds that of next queue element.\"\n );\n\n require(\n _context.blockNumber <= nextQueueElement.blockNumber,\n \"Sequencer transaction blockNumber exceeds that of next queue element.\"\n );\n }\n\n /**\n * Checks that a given batch context is valid based on its previous context, and the next queue elemtent.\n * @param _prevContext The previously validated batch context.\n * @param _nextContext The batch context to validate with this call.\n * @param _nextQueueIndex Index of the next queue element to process for the _nextContext's subsequentQueueElements.\n * @param _queueRef The storage container for the queue.\n */\n function _validateNextBatchContext(\n BatchContext memory _prevContext,\n BatchContext memory _nextContext,\n uint40 _nextQueueIndex,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // All sequencer transactions' times must be greater than or equal to the previous ones.\n require(\n _nextContext.timestamp >= _prevContext.timestamp,\n \"Context timestamp values must monotonically increase.\"\n );\n\n require(\n _nextContext.blockNumber >= _prevContext.blockNumber,\n \"Context blockNumber values must monotonically increase.\"\n );\n\n // If there is going to be a queue element pulled in from this context:\n if (_nextContext.numSubsequentQueueTransactions > 0) {\n _validateContextBeforeEnqueue(\n _nextContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n }\n\n /**\n * Checks that the final batch context in a sequencer submission is valid.\n * @param _finalContext The batch context to validate.\n * @param _queueLength The length of the queue at the start of the batchAppend call.\n * @param _nextQueueIndex The next element in the queue that will be pulled into the CTC.\n * @param _queueRef The storage container for the queue.\n */\n function _validateFinalBatchContext(\n BatchContext memory _finalContext,\n uint40 _nextQueueIndex,\n uint40 _queueLength,\n iOVM_ChainStorageContainer _queueRef\n )\n internal\n view\n {\n // If the queue is not now empty, check the mononoticity of whatever the next batch that will come in is.\n if (_queueLength - _nextQueueIndex > 0 && _finalContext.numSubsequentQueueTransactions == 0) {\n _validateContextBeforeEnqueue(\n _finalContext,\n _nextQueueIndex,\n _queueRef\n );\n }\n // Batches cannot be added from the future, or subsequent enqueue() contexts would violate monotonicity.\n require(_finalContext.timestamp <= block.timestamp, \"Context timestamp is from the future.\");\n require(_finalContext.blockNumber <= block.number, \"Context block number is from the future.\");\n }\n\n /**\n * Hashes a transaction chain element.\n * @param _element Chain element to hash.\n * @return Hash of the chain element.\n */\n function _hashTransactionChainElement(\n Lib_OVMCodec.TransactionChainElement memory _element\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(\n abi.encode(\n _element.isSequenced,\n _element.queueIndex,\n _element.timestamp,\n _element.blockNumber,\n _element.txData\n )\n );\n }\n\n /**\n * Verifies a sequencer transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _txChainElement The chain element that the transaction is claimed to be a part of.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index.\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifySequencerTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n Lib_OVMCodec.TransactionChainElement memory _txChainElement,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n OVM_ExecutionManager ovmExecutionManager = OVM_ExecutionManager(resolve(\"OVM_ExecutionManager\"));\n uint256 gasLimit = ovmExecutionManager.getMaxTransactionGasLimit();\n bytes32 leafHash = _getSequencerLeafHash(_txChainElement);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Sequencer transaction inclusion proof.\"\n );\n\n require(\n _transaction.blockNumber == _txChainElement.blockNumber\n && _transaction.timestamp == _txChainElement.timestamp\n && _transaction.entrypoint == resolve(\"OVM_DecompressionPrecompileAddress\")\n && _transaction.gasLimit == gasLimit\n && _transaction.l1TxOrigin == address(0)\n && _transaction.l1QueueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE\n && keccak256(_transaction.data) == keccak256(_txChainElement.txData),\n \"Invalid Sequencer transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a queue transaction, returning true if it was indeed included in the CTC\n * @param _transaction The transaction we are verifying inclusion of.\n * @param _queueIndex The queueIndex of the queued transaction.\n * @param _batchHeader Header of the batch the transaction was included in.\n * @param _inclusionProof An inclusion proof into the CTC at a particular index (should point to queue tx).\n * @return True if the transaction was included in the specified location, else false.\n */\n function _verifyQueueTransaction(\n Lib_OVMCodec.Transaction memory _transaction,\n uint256 _queueIndex,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _inclusionProof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 leafHash = _getQueueLeafHash(_queueIndex);\n\n require(\n _verifyElement(\n leafHash,\n _batchHeader,\n _inclusionProof\n ),\n \"Invalid Queue transaction inclusion proof.\"\n );\n\n bytes32 transactionHash = keccak256(\n abi.encode(\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n )\n );\n\n Lib_OVMCodec.QueueElement memory el = getQueueElement(_queueIndex);\n require(\n el.transactionHash == transactionHash\n && el.timestamp == _transaction.timestamp\n && el.blockNumber == _transaction.blockNumber,\n \"Invalid Queue transaction.\"\n );\n\n return true;\n }\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function _verifyElement(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n require(\n Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().get(uint32(_batchHeader.batchIndex)),\n \"Invalid batch header.\"\n );\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n \"Invalid inclusion proof.\"\n );\n\n return true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_Bytes32Utils } from \"../../libraries/utils/Lib_Bytes32Utils.sol\";\nimport { Lib_EthUtils } from \"../../libraries/utils/Lib_EthUtils.sol\";\nimport { Lib_ErrorUtils } from \"../../libraries/utils/Lib_ErrorUtils.sol\";\nimport { Lib_PredeployAddresses } from \"../../libraries/constants/Lib_PredeployAddresses.sol\";\n\n/* Interface Imports */\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/* Contract Imports */\nimport { OVM_DeployerWhitelist } from \"../predeploys/OVM_DeployerWhitelist.sol\";\n\n/* External Imports */\nimport { Math } from \"@openzeppelin/contracts/math/Math.sol\";\n\n/**\n * @title OVM_ExecutionManager\n * @dev The Execution Manager (EM) is the core of our OVM implementation, and provides a sandboxed\n * environment allowing us to execute OVM transactions deterministically on either Layer 1 or\n * Layer 2.\n * The EM's run() function is the first function called during the execution of any\n * transaction on L2.\n * For each context-dependent EVM operation the EM has a function which implements a corresponding\n * OVM operation, which will read state from the State Manager contract.\n * The EM relies on the Safety Checker to verify that code deployed to Layer 2 does not contain any\n * context-dependent operations.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {\n\n /********************************\n * External Contract References *\n ********************************/\n\n iOVM_SafetyChecker internal ovmSafetyChecker;\n iOVM_StateManager internal ovmStateManager;\n\n\n /*******************************\n * Execution Context Variables *\n *******************************/\n\n GasMeterConfig internal gasMeterConfig;\n GlobalContext internal globalContext;\n TransactionContext internal transactionContext;\n MessageContext internal messageContext;\n TransactionRecord internal transactionRecord;\n MessageRecord internal messageRecord;\n\n\n /**************************\n * Gas Metering Constants *\n **************************/\n\n address constant GAS_METADATA_ADDRESS = 0x06a506A506a506A506a506a506A506A506A506A5;\n uint256 constant NUISANCE_GAS_SLOAD = 20000;\n uint256 constant NUISANCE_GAS_SSTORE = 20000;\n uint256 constant MIN_NUISANCE_GAS_PER_CONTRACT = 30000;\n uint256 constant NUISANCE_GAS_PER_CONTRACT_BYTE = 100;\n uint256 constant MIN_GAS_FOR_INVALID_STATE_ACCESS = 30000;\n\n\n /**************************\n * Native Value Constants *\n **************************/\n\n // Public so we can access and make assertions in integration tests.\n uint256 public constant CALL_WITH_VALUE_INTRINSIC_GAS = 90000;\n\n\n /**************************\n * Default Context Values *\n **************************/\n\n uint256 constant DEFAULT_UINT256 = 0xdefa017defa017defa017defa017defa017defa017defa017defa017defa017d;\n address constant DEFAULT_ADDRESS = 0xdEfa017defA017DeFA017DEfa017DeFA017DeFa0;\n\n\n /*************************************\n * Container Contract Address Prefix *\n *************************************/\n\n /**\n * @dev The Execution Manager and State Manager each have this 30 byte prefix, and are uncallable.\n */\n address constant CONTAINER_CONTRACT_PREFIX = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n GasMeterConfig memory _gasMeterConfig,\n GlobalContext memory _globalContext\n )\n Lib_AddressResolver(_libAddressManager)\n {\n ovmSafetyChecker = iOVM_SafetyChecker(resolve(\"OVM_SafetyChecker\"));\n gasMeterConfig = _gasMeterConfig;\n globalContext = _globalContext;\n _resetContext();\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Applies dynamically-sized refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of the ovmOPCODE is fixed.\n * @param _cost Desired gas cost for the function after the refund.\n */\n modifier netGasCost(\n uint256 _cost\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund everything *except* the specified cost.\n if (_cost < gasUsed) {\n transactionRecord.ovmGasRefund += gasUsed - _cost;\n }\n }\n\n /**\n * Applies a fixed-size gas refund to a transaction to account for the difference in execution\n * between L1 and L2, so that the overall cost of an ovmOPCODE can be lowered.\n * @param _discount Amount of gas cost to refund for the ovmOPCODE.\n */\n modifier fixedGasDiscount(\n uint256 _discount\n ) {\n uint256 gasProvided = gasleft();\n _;\n uint256 gasUsed = gasProvided - gasleft();\n\n // We want to refund the specified _discount, unless this risks underflow.\n if (_discount < gasUsed) {\n transactionRecord.ovmGasRefund += _discount;\n } else {\n // refund all we can without risking underflow.\n transactionRecord.ovmGasRefund += gasUsed;\n }\n }\n\n /**\n * Makes sure we're not inside a static context.\n */\n modifier notStatic() {\n if (messageContext.isStatic == true) {\n _revertWithFlag(RevertFlag.STATIC_VIOLATION);\n }\n _;\n }\n\n\n /************************************\n * Transaction Execution Entrypoint *\n ************************************/\n\n /**\n * Starts the execution of a transaction via the OVM_ExecutionManager.\n * @param _transaction Transaction data to be executed.\n * @param _ovmStateManager iOVM_StateManager implementation providing account state.\n */\n function run(\n Lib_OVMCodec.Transaction memory _transaction,\n address _ovmStateManager\n )\n override\n external\n returns (\n bytes memory\n )\n {\n // Make sure that run() is not re-enterable. This condition should always be satisfied\n // Once run has been called once, due to the behavior of _isValidInput().\n if (transactionContext.ovmNUMBER != DEFAULT_UINT256) {\n return bytes(\"\");\n }\n\n // Store our OVM_StateManager instance (significantly easier than attempting to pass the\n // address around in calldata).\n ovmStateManager = iOVM_StateManager(_ovmStateManager);\n\n // Make sure this function can't be called by anyone except the owner of the\n // OVM_StateManager (expected to be an OVM_StateTransitioner). We can revert here because\n // this would make the `run` itself invalid.\n require(\n // This method may return false during fraud proofs, but always returns true in L2 nodes' State Manager precompile.\n ovmStateManager.isAuthenticated(msg.sender),\n \"Only authenticated addresses in ovmStateManager can call this function\"\n );\n\n // Initialize the execution context, must be initialized before we perform any gas metering\n // or we'll throw a nuisance gas error.\n _initContext(_transaction);\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check whether we need to start a new epoch, do so if necessary.\n // _checkNeedsNewEpoch(_transaction.timestamp);\n\n // Make sure the transaction's gas limit is valid. We don't revert here because we reserve\n // reverts for INVALID_STATE_ACCESS.\n if (_isValidInput(_transaction) == false) {\n _resetContext();\n return bytes(\"\");\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Check gas right before the call to get total gas consumed by OVM transaction.\n // uint256 gasProvided = gasleft();\n\n // Run the transaction, make sure to meter the gas usage.\n (, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit - gasMeterConfig.minTransactionGasLimit,\n _transaction.entrypoint,\n 0,\n _transaction.data\n );\n\n // TEMPORARY: Gas metering is disabled for minnet.\n // // Update the cumulative gas based on the amount of gas used.\n // uint256 gasUsed = gasProvided - gasleft();\n // _updateCumulativeGas(gasUsed, _transaction.l1QueueOrigin);\n\n // Wipe the execution context.\n _resetContext();\n\n return returndata;\n }\n\n\n /******************************\n * Opcodes: Execution Context *\n ******************************/\n\n /**\n * @notice Overrides CALLER.\n * @return _CALLER Address of the CALLER within the current message context.\n */\n function ovmCALLER()\n override\n external\n view\n returns (\n address _CALLER\n )\n {\n return messageContext.ovmCALLER;\n }\n\n /**\n * @notice Overrides ADDRESS.\n * @return _ADDRESS Active ADDRESS within the current message context.\n */\n function ovmADDRESS()\n override\n public\n view\n returns (\n address _ADDRESS\n )\n {\n return messageContext.ovmADDRESS;\n }\n\n /**\n * @notice Overrides CALLVALUE.\n * @return _CALLVALUE Value sent along with the call according to the current message context.\n */\n function ovmCALLVALUE()\n override\n public\n view\n returns (\n uint256 _CALLVALUE\n )\n {\n return messageContext.ovmCALLVALUE;\n }\n\n /**\n * @notice Overrides TIMESTAMP.\n * @return _TIMESTAMP Value of the TIMESTAMP within the transaction context.\n */\n function ovmTIMESTAMP()\n override\n external\n view\n returns (\n uint256 _TIMESTAMP\n )\n {\n return transactionContext.ovmTIMESTAMP;\n }\n\n /**\n * @notice Overrides NUMBER.\n * @return _NUMBER Value of the NUMBER within the transaction context.\n */\n function ovmNUMBER()\n override\n external\n view\n returns (\n uint256 _NUMBER\n )\n {\n return transactionContext.ovmNUMBER;\n }\n\n /**\n * @notice Overrides GASLIMIT.\n * @return _GASLIMIT Value of the block's GASLIMIT within the transaction context.\n */\n function ovmGASLIMIT()\n override\n external\n view\n returns (\n uint256 _GASLIMIT\n )\n {\n return transactionContext.ovmGASLIMIT;\n }\n\n /**\n * @notice Overrides CHAINID.\n * @return _CHAINID Value of the chain's CHAINID within the global context.\n */\n function ovmCHAINID()\n override\n external\n view\n returns (\n uint256 _CHAINID\n )\n {\n return globalContext.ovmCHAINID;\n }\n\n /*********************************\n * Opcodes: L2 Execution Context *\n *********************************/\n\n /**\n * @notice Specifies from which source (Sequencer or Queue) this transaction originated from.\n * @return _queueOrigin Enum indicating the ovmL1QUEUEORIGIN within the current message context.\n */\n function ovmL1QUEUEORIGIN()\n override\n external\n view\n returns (\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n {\n return transactionContext.ovmL1QUEUEORIGIN;\n }\n\n /**\n * @notice Specifies which L1 account, if any, sent this transaction by calling enqueue().\n * @return _l1TxOrigin Address of the account which sent the tx into L2 from L1.\n */\n function ovmL1TXORIGIN()\n override\n external\n view\n returns (\n address _l1TxOrigin\n )\n {\n return transactionContext.ovmL1TXORIGIN;\n }\n\n /********************\n * Opcodes: Halting *\n ********************/\n\n /**\n * @notice Overrides REVERT.\n * @param _data Bytes data to pass along with the REVERT.\n */\n function ovmREVERT(\n bytes memory _data\n )\n override\n public\n {\n _revertWithFlag(RevertFlag.INTENTIONAL_REVERT, _data);\n }\n\n\n /******************************\n * Opcodes: Contract Creation *\n ******************************/\n\n /**\n * @notice Overrides CREATE.\n * @param _bytecode Code to be used to CREATE a new contract.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE(\n bytes memory _bytecode\n )\n override\n public\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE(\n creator,\n _getAccountNonce(creator)\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE\n );\n }\n\n /**\n * @notice Overrides CREATE2.\n * @param _bytecode Code to be used to CREATE2 a new contract.\n * @param _salt Value used to determine the contract's address.\n * @return Address of the created contract.\n * @return Revert data, if and only if the creation threw an exception.\n */\n function ovmCREATE2(\n bytes memory _bytecode,\n bytes32 _salt\n )\n override\n external\n notStatic\n fixedGasDiscount(40000)\n returns (\n address,\n bytes memory\n )\n {\n // Creator is always the current ADDRESS.\n address creator = ovmADDRESS();\n\n // Check that the deployer is whitelisted, or\n // that arbitrary contract deployment has been enabled.\n _checkDeployerAllowed(creator);\n\n // Generate the correct CREATE2 address.\n address contractAddress = Lib_EthUtils.getAddressForCREATE2(\n creator,\n _bytecode,\n _salt\n );\n\n return _createContract(\n contractAddress,\n _bytecode,\n MessageType.ovmCREATE2\n );\n }\n\n\n /*******************************\n * Account Abstraction Opcodes *\n ******************************/\n\n /**\n * Retrieves the nonce of the current ovmADDRESS.\n * @return _nonce Nonce of the current contract.\n */\n function ovmGETNONCE()\n override\n external\n returns (\n uint256 _nonce\n )\n {\n return _getAccountNonce(ovmADDRESS());\n }\n\n /**\n * Bumps the nonce of the current ovmADDRESS by one.\n */\n function ovmINCREMENTNONCE()\n override\n external\n notStatic\n {\n address account = ovmADDRESS();\n uint256 nonce = _getAccountNonce(account);\n\n // Prevent overflow.\n if (nonce + 1 > nonce) {\n _setAccountNonce(account, nonce + 1);\n }\n }\n\n /**\n * Creates a new EOA contract account, for account abstraction.\n * @dev Essentially functions like ovmCREATE or ovmCREATE2, but we can bypass a lot of checks\n * because the contract we're creating is trusted (no need to do safety checking or to\n * handle unexpected reverts). Doesn't need to return an address because the address is\n * assumed to be the user's actual address.\n * @param _messageHash Hash of a message signed by some user, for verification.\n * @param _v Signature `v` parameter.\n * @param _r Signature `r` parameter.\n * @param _s Signature `s` parameter.\n */\n function ovmCREATEEOA(\n bytes32 _messageHash,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n )\n override\n public\n notStatic\n {\n // Recover the EOA address from the message hash and signature parameters. Since we do the\n // hashing in advance, we don't have handle different message hashing schemes. Even if this\n // function were to return the wrong address (rather than explicitly returning the zero\n // address), the rest of the transaction would simply fail (since there's no EOA account to\n // actually execute the transaction).\n address eoa = ecrecover(\n _messageHash,\n _v + 27,\n _r,\n _s\n );\n\n // Invalid signature is a case we proactively handle with a revert. We could alternatively\n // have this function return a `success` boolean, but this is just easier.\n if (eoa == address(0)) {\n ovmREVERT(bytes(\"Signature provided for EOA contract creation is invalid.\"));\n }\n\n // If the user already has an EOA account, then there's no need to perform this operation.\n if (_hasEmptyAccount(eoa) == false) {\n return;\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(eoa);\n\n // Temporarily set the current address so it's easier to access on L2.\n address prevADDRESS = messageContext.ovmADDRESS;\n messageContext.ovmADDRESS = eoa;\n\n // Creates a duplicate of the OVM_ProxyEOA located at 0x42....09. Uses the following\n // \"magic\" prefix to deploy an exact copy of the code:\n // PUSH1 0x0D # size of this prefix in bytes\n // CODESIZE\n // SUB # subtract prefix size from codesize\n // DUP1\n // PUSH1 0x0D\n // PUSH1 0x00\n // CODECOPY # copy everything after prefix into memory at pos 0\n // PUSH1 0x00\n // RETURN # return the copied code\n address proxyEOA = Lib_EthUtils.createContract(abi.encodePacked(\n hex\"600D380380600D6000396000f3\",\n ovmEXTCODECOPY(\n Lib_PredeployAddresses.PROXY_EOA,\n 0,\n ovmEXTCODESIZE(Lib_PredeployAddresses.PROXY_EOA)\n )\n ));\n\n // Reset the address now that we're done deploying.\n messageContext.ovmADDRESS = prevADDRESS;\n\n // Commit the account with its final values.\n _commitPendingAccount(\n eoa,\n address(proxyEOA),\n keccak256(Lib_EthUtils.getCode(address(proxyEOA)))\n );\n\n _setAccountNonce(eoa, 0);\n }\n\n\n /*********************************\n * Opcodes: Contract Interaction *\n *********************************/\n\n /**\n * @notice Overrides CALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _value ETH value to pass with the call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n uint256 _value,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(100000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // CALL updates the CALLER and ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.ovmCALLVALUE = _value;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmCALL\n );\n }\n\n /**\n * @notice Overrides STATICCALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmSTATICCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(80000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // STATICCALL updates the CALLER, updates the ADDRESS, and runs in a static, valueless context.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = nextMessageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _address;\n nextMessageContext.isStatic = true;\n nextMessageContext.ovmCALLVALUE = 0;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmSTATICCALL\n );\n }\n\n /**\n * @notice Overrides DELEGATECALL.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmDELEGATECALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n fixedGasDiscount(40000)\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // DELEGATECALL does not change anything about the message context.\n MessageContext memory nextMessageContext = messageContext;\n\n return _callContract(\n nextMessageContext,\n _gasLimit,\n _address,\n _calldata,\n MessageType.ovmDELEGATECALL\n );\n }\n\n /**\n * @notice Legacy ovmCALL function which did not support ETH value; this maintains backwards compatibility.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _address Address of the contract to call.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function ovmCALL(\n uint256 _gasLimit,\n address _address,\n bytes memory _calldata\n )\n override\n public\n returns(\n bool _success,\n bytes memory _returndata\n )\n {\n // Legacy ovmCALL assumed always-0 value.\n return ovmCALL(\n _gasLimit,\n _address,\n 0,\n _calldata\n );\n }\n\n\n /************************************\n * Opcodes: Contract Storage Access *\n ************************************/\n\n /**\n * @notice Overrides SLOAD.\n * @param _key 32 byte key of the storage slot to load.\n * @return _value 32 byte value of the requested storage slot.\n */\n function ovmSLOAD(\n bytes32 _key\n )\n override\n external\n netGasCost(40000)\n returns (\n bytes32 _value\n )\n {\n // We always SLOAD from the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n return _getContractStorage(\n contractAddress,\n _key\n );\n }\n\n /**\n * @notice Overrides SSTORE.\n * @param _key 32 byte key of the storage slot to set.\n * @param _value 32 byte value for the storage slot.\n */\n function ovmSSTORE(\n bytes32 _key,\n bytes32 _value\n )\n override\n external\n notStatic\n netGasCost(60000)\n {\n // We always SSTORE to the storage of ADDRESS.\n address contractAddress = ovmADDRESS();\n\n _putContractStorage(\n contractAddress,\n _key,\n _value\n );\n }\n\n\n /*********************************\n * Opcodes: Contract Code Access *\n *********************************/\n\n /**\n * @notice Overrides EXTCODECOPY.\n * @param _contract Address of the contract to copy code from.\n * @param _offset Offset in bytes from the start of contract code to copy beyond.\n * @param _length Total number of bytes to copy from the contract's code.\n * @return _code Bytes of code copied from the requested contract.\n */\n function ovmEXTCODECOPY(\n address _contract,\n uint256 _offset,\n uint256 _length\n )\n override\n public\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _getAccountEthAddress(_contract),\n _offset,\n _length\n );\n }\n\n /**\n * @notice Overrides EXTCODESIZE.\n * @param _contract Address of the contract to query the size of.\n * @return _EXTCODESIZE Size of the requested contract in bytes.\n */\n function ovmEXTCODESIZE(\n address _contract\n )\n override\n public\n returns (\n uint256 _EXTCODESIZE\n )\n {\n return Lib_EthUtils.getCodeSize(\n _getAccountEthAddress(_contract)\n );\n }\n\n /**\n * @notice Overrides EXTCODEHASH.\n * @param _contract Address of the contract to query the hash of.\n * @return _EXTCODEHASH Hash of the requested contract.\n */\n function ovmEXTCODEHASH(\n address _contract\n )\n override\n external\n returns (\n bytes32 _EXTCODEHASH\n )\n {\n return Lib_EthUtils.getCodeHash(\n _getAccountEthAddress(_contract)\n );\n }\n\n\n /***************************************\n * Public Functions: ETH Value Opcodes *\n ***************************************/\n\n /**\n * @notice Overrides BALANCE.\n * NOTE: In the future, this could be optimized to directly invoke EM._getContractStorage(...).\n * @param _contract Address of the contract to query the OVM_ETH balance of.\n * @return _BALANCE OVM_ETH balance of the requested contract.\n */\n function ovmBALANCE(\n address _contract\n )\n override\n public\n returns (\n uint256 _BALANCE\n )\n {\n // Easiest way to get the balance is query OVM_ETH as normal.\n bytes memory balanceOfCalldata = abi.encodeWithSignature(\n \"balanceOf(address)\",\n _contract\n );\n\n // Static call because this should be a read-only query.\n (bool success, bytes memory returndata) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n balanceOfCalldata\n );\n\n // All balanceOf queries should successfully return a uint, otherwise this must be an OOG.\n if (!success || returndata.length != 32) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // Return the decoded balance.\n return abi.decode(returndata, (uint256));\n }\n\n /**\n * @notice Overrides SELFBALANCE.\n * @return _BALANCE OVM_ETH balance of the requesting contract.\n */\n function ovmSELFBALANCE()\n override\n external\n returns (\n uint256 _BALANCE\n )\n {\n return ovmBALANCE(ovmADDRESS());\n }\n\n\n /***************************************\n * Public Functions: Execution Context *\n ***************************************/\n\n function getMaxTransactionGasLimit()\n external\n view\n override\n returns (\n uint256 _maxTransactionGasLimit\n )\n {\n return gasMeterConfig.maxTransactionGasLimit;\n }\n\n /********************************************\n * Public Functions: Deployment Whitelisting *\n ********************************************/\n\n /**\n * Checks whether the given address is on the whitelist to ovmCREATE/ovmCREATE2, and reverts if not.\n * @param _deployerAddress Address attempting to deploy a contract.\n */\n function _checkDeployerAllowed(\n address _deployerAddress\n )\n internal\n {\n // From an OVM semantics perspective, this will appear identical to\n // the deployer ovmCALLing the whitelist. This is fine--in a sense, we are forcing them to.\n (bool success, bytes memory data) = ovmSTATICCALL(\n gasleft(),\n Lib_PredeployAddresses.DEPLOYER_WHITELIST,\n abi.encodeWithSelector(\n OVM_DeployerWhitelist.isDeployerAllowed.selector,\n _deployerAddress\n )\n );\n bool isAllowed = abi.decode(data, (bool));\n\n if (!isAllowed || !success) {\n _revertWithFlag(RevertFlag.CREATOR_NOT_ALLOWED);\n }\n }\n\n /********************************************\n * Internal Functions: Contract Interaction *\n ********************************************/\n\n /**\n * Creates a new contract and associates it with some contract address.\n * @param _contractAddress Address to associate the created contract with.\n * @param _bytecode Bytecode to be used to create the contract.\n * @return Final OVM contract address.\n * @return Revertdata, if and only if the creation threw an exception.\n */\n function _createContract(\n address _contractAddress,\n bytes memory _bytecode,\n MessageType _messageType\n )\n internal\n returns (\n address,\n bytes memory\n )\n {\n // We always update the nonce of the creating account, even if the creation fails.\n _setAccountNonce(ovmADDRESS(), _getAccountNonce(ovmADDRESS()) + 1);\n\n // We're stepping into a CREATE or CREATE2, so we need to update ADDRESS to point\n // to the contract's associated address and CALLER to point to the previous ADDRESS.\n MessageContext memory nextMessageContext = messageContext;\n nextMessageContext.ovmCALLER = messageContext.ovmADDRESS;\n nextMessageContext.ovmADDRESS = _contractAddress;\n\n // Run the common logic which occurs between call-type and create-type messages,\n // passing in the creation bytecode and `true` to trigger create-specific logic.\n (bool success, bytes memory data) = _handleExternalMessage(\n nextMessageContext,\n gasleft(),\n _contractAddress,\n _bytecode,\n _messageType\n );\n\n // Yellow paper requires that address returned is zero if the contract deployment fails.\n return (\n success ? _contractAddress : address(0),\n data\n );\n }\n\n /**\n * Calls the deployed contract associated with a given address.\n * @param _nextMessageContext Message context to be used for the call.\n * @param _gasLimit Amount of gas to be passed into this call.\n * @param _contract OVM address to be called.\n * @param _calldata Data to send along with the call.\n * @return _success Whether or not the call returned (rather than reverted).\n * @return _returndata Data returned by the call.\n */\n function _callContract(\n MessageContext memory _nextMessageContext,\n uint256 _gasLimit,\n address _contract,\n bytes memory _calldata,\n MessageType _messageType\n )\n internal\n returns (\n bool _success,\n bytes memory _returndata\n )\n {\n // We reserve addresses of the form 0xdeaddeaddead...NNNN for the container contracts in L2 geth.\n // So, we block calls to these addresses since they are not safe to run as an OVM contract itself.\n if (\n (uint256(_contract) & uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000))\n == uint256(CONTAINER_CONTRACT_PREFIX)\n ) {\n // EVM does not return data in the success case, see: https://github.com/ethereum/go-ethereum/blob/aae7660410f0ef90279e14afaaf2f429fdc2a186/core/vm/instructions.go#L600-L604\n return (true, hex'');\n }\n\n // Both 0x0000... and the EVM precompiles have the same address on L1 and L2 --> no trie lookup needed.\n address codeContractAddress =\n uint(_contract) < 100\n ? _contract\n : _getAccountEthAddress(_contract);\n\n return _handleExternalMessage(\n _nextMessageContext,\n _gasLimit,\n codeContractAddress,\n _calldata,\n _messageType\n );\n }\n\n /**\n * Handles all interactions which involve the execution manager calling out to untrusted code (both calls and creates).\n * Ensures that OVM-related measures are enforced, including L2 gas refunds, nuisance gas, and flagged reversions.\n *\n * @param _nextMessageContext Message context to be used for the external message.\n * @param _gasLimit Amount of gas to be passed into this message. NOTE: this argument is overwritten in some cases to avoid stack-too-deep.\n * @param _contract OVM address being called or deployed to\n * @param _data Data for the message (either calldata or creation code)\n * @param _messageType What type of ovmOPCODE this message corresponds to.\n * @return Whether or not the message (either a call or deployment) succeeded.\n * @return Data returned by the message.\n */\n function _handleExternalMessage(\n MessageContext memory _nextMessageContext,\n // NOTE: this argument is overwritten in some cases to avoid stack-too-deep.\n uint256 _gasLimit,\n address _contract,\n bytes memory _data,\n MessageType _messageType\n )\n internal\n returns (\n bool,\n bytes memory\n )\n {\n uint256 messageValue = _nextMessageContext.ovmCALLVALUE;\n // If there is value in this message, we need to transfer the ETH over before switching contexts.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n ) {\n // Handle out-of-intrinsic gas consistent with EVM behavior -- the subcall \"appears to revert\" if we don't have enough gas to transfer the ETH.\n // Similar to dynamic gas cost of value exceeding gas here:\n // https://github.com/ethereum/go-ethereum/blob/c503f98f6d5e80e079c1d8a3601d188af2a899da/core/vm/interpreter.go#L268-L273\n if (gasleft() < CALL_WITH_VALUE_INTRINSIC_GAS) {\n return (false, hex\"\");\n }\n\n // If there *is* enough gas to transfer ETH, then we need to make sure this amount of gas is reserved (i.e. not\n // given to the _contract.call below) to guarantee that _handleExternalMessage can't run out of gas.\n // In particular, in the event that the call fails, we will need to transfer the ETH back to the sender.\n // Taking the lesser of _gasLimit and gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS guarantees that the second\n // _attemptForcedEthTransfer below, if needed, always has enough gas to succeed.\n _gasLimit = Math.min(\n _gasLimit,\n gasleft() - CALL_WITH_VALUE_INTRINSIC_GAS // Cannot overflow due to the above check.\n );\n\n // Now transfer the value of the call.\n // The target is interpreted to be the next message's ovmADDRESS account.\n bool transferredOvmEth = _attemptForcedEthTransfer(\n _nextMessageContext.ovmADDRESS,\n messageValue\n );\n\n // If the ETH transfer fails (should only be possible in the case of insufficient balance), then treat this as a revert.\n // This mirrors EVM behavior, see https://github.com/ethereum/go-ethereum/blob/2dee31930c9977af2a9fcb518fb9838aa609a7cf/core/vm/evm.go#L298\n if (!transferredOvmEth) {\n return (false, hex\"\");\n }\n }\n\n // We need to switch over to our next message context for the duration of this call.\n MessageContext memory prevMessageContext = messageContext;\n _switchMessageContext(prevMessageContext, _nextMessageContext);\n\n // Nuisance gas is a system used to bound the ability for an attacker to make fraud proofs\n // expensive by touching a lot of different accounts or storage slots. Since most contracts\n // only use a few storage slots during any given transaction, this shouldn't be a limiting\n // factor.\n uint256 prevNuisanceGasLeft = messageRecord.nuisanceGasLeft;\n uint256 nuisanceGasLimit = _getNuisanceGasLimit(_gasLimit);\n messageRecord.nuisanceGasLeft = nuisanceGasLimit;\n\n // Make the call and make sure to pass in the gas limit. Another instance of hidden\n // complexity. `_contract` is guaranteed to be a safe contract, meaning its return/revert\n // behavior can be controlled. In particular, we enforce that flags are passed through\n // revert data as to retrieve execution metadata that would normally be reverted out of\n // existence.\n\n bool success;\n bytes memory returndata;\n if (_isCreateType(_messageType)) {\n // safeCREATE() is a function which replicates a CREATE message, but uses return values\n // Which match that of CALL (i.e. bool, bytes). This allows many security checks to be\n // to be shared between untrusted call and create call frames.\n (success, returndata) = address(this).call{gas: _gasLimit}(\n abi.encodeWithSelector(\n this.safeCREATE.selector,\n _data,\n _contract\n )\n );\n } else {\n (success, returndata) = _contract.call{gas: _gasLimit}(_data);\n }\n\n // If the message threw an exception, its value should be returned back to the sender.\n // So, we force it back, BEFORE returning the messageContext to the previous addresses.\n // This operation is part of the reason we \"reserved the intrinsic gas\" above.\n if (\n messageValue > 0\n && _isValueType(_messageType)\n && !success\n ) {\n bool transferredOvmEth = _attemptForcedEthTransfer(\n prevMessageContext.ovmADDRESS,\n messageValue\n );\n\n // Since we transferred it in above and the call reverted, the transfer back should always pass.\n // This code path should NEVER be triggered since we sent `messageValue` worth of OVM_ETH into the target\n // and reserved sufficient gas to execute the transfer, but in case there is some edge case which has\n // been missed, we revert the entire frame (and its parent) to make sure the ETH gets sent back.\n if (!transferredOvmEth) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n }\n\n // Switch back to the original message context now that we're out of the call and all OVM_ETH is in the right place.\n _switchMessageContext(_nextMessageContext, prevMessageContext);\n\n // Assuming there were no reverts, the message record should be accurate here. We'll update\n // this value in the case of a revert.\n uint256 nuisanceGasLeft = messageRecord.nuisanceGasLeft;\n\n // Reverts at this point are completely OK, but we need to make a few updates based on the\n // information passed through the revert.\n if (success == false) {\n (\n RevertFlag flag,\n uint256 nuisanceGasLeftPostRevert,\n uint256 ovmGasRefund,\n bytes memory returndataFromFlag\n ) = _decodeRevertData(returndata);\n\n // INVALID_STATE_ACCESS is the only flag that triggers an immediate abort of the\n // parent EVM message. This behavior is necessary because INVALID_STATE_ACCESS must\n // halt any further transaction execution that could impact the execution result.\n if (flag == RevertFlag.INVALID_STATE_ACCESS) {\n _revertWithFlag(flag);\n }\n\n // INTENTIONAL_REVERT, UNSAFE_BYTECODE, STATIC_VIOLATION, and CREATOR_NOT_ALLOWED aren't\n // dependent on the input state, so we can just handle them like standard reverts. Our only change here\n // is to record the gas refund reported by the call (enforced by safety checking).\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n || flag == RevertFlag.STATIC_VIOLATION\n || flag == RevertFlag.CREATOR_NOT_ALLOWED\n ) {\n transactionRecord.ovmGasRefund = ovmGasRefund;\n }\n\n // INTENTIONAL_REVERT needs to pass up the user-provided return data encoded into the\n // flag, *not* the full encoded flag. Additionally, we surface custom error messages\n // to developers in the case of unsafe creations for improved devex.\n // All other revert types return no data.\n if (\n flag == RevertFlag.INTENTIONAL_REVERT\n || flag == RevertFlag.UNSAFE_BYTECODE\n ) {\n returndata = returndataFromFlag;\n } else {\n returndata = hex'';\n }\n\n // Reverts mean we need to use up whatever \"nuisance gas\" was used by the call.\n // EXCEEDS_NUISANCE_GAS explicitly reduces the remaining nuisance gas for this message\n // to zero. OUT_OF_GAS is a \"pseudo\" flag given that messages return no data when they\n // run out of gas, so we have to treat this like EXCEEDS_NUISANCE_GAS. All other flags\n // will simply pass up the remaining nuisance gas.\n nuisanceGasLeft = nuisanceGasLeftPostRevert;\n }\n\n // We need to reset the nuisance gas back to its original value minus the amount used here.\n messageRecord.nuisanceGasLeft = prevNuisanceGasLeft - (nuisanceGasLimit - nuisanceGasLeft);\n\n return (\n success,\n returndata\n );\n }\n\n /**\n * Handles the creation-specific safety measures required for OVM contract deployment.\n * This function sanitizes the return types for creation messages to match calls (bool, bytes),\n * by being an external function which the EM can call, that mimics the success/fail case of the CREATE.\n * This allows for consistent handling of both types of messages in _handleExternalMessage().\n * Having this step occur as a separate call frame also allows us to easily revert the\n * contract deployment in the event that the code is unsafe.\n *\n * @param _creationCode Code to pass into CREATE for deployment.\n * @param _address OVM address being deployed to.\n */\n function safeCREATE(\n bytes memory _creationCode,\n address _address\n )\n external\n {\n // The only way this should callable is from within _createContract(),\n // and it should DEFINITELY not be callable by a non-EM code contract.\n if (msg.sender != address(this)) {\n return;\n }\n // Check that there is not already code at this address.\n if (_hasEmptyAccount(_address) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.CREATE_COLLISION\n );\n }\n\n // Check the creation bytecode against the OVM_SafetyChecker.\n if (ovmSafetyChecker.isBytecodeSafe(_creationCode) == false) {\n // Note: in the EVM, this case burns all allotted gas. For improved\n // developer experience, we do return the remaining gas.\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?\")\n );\n }\n\n // We always need to initialize the contract with the default account values.\n _initPendingAccount(_address);\n\n // Actually execute the EVM create message.\n // NOTE: The inline assembly below means we can NOT make any evm calls between here and then.\n address ethAddress = Lib_EthUtils.createContract(_creationCode);\n\n if (ethAddress == address(0)) {\n // If the creation fails, the EVM lets us grab its revert data. This may contain a revert flag\n // to be used above in _handleExternalMessage, so we pass the revert data back up unmodified.\n assembly {\n returndatacopy(0,0,returndatasize())\n revert(0, returndatasize())\n }\n }\n\n // Again simply checking that the deployed code is safe too. Contracts can generate\n // arbitrary deployment code, so there's no easy way to analyze this beforehand.\n bytes memory deployedCode = Lib_EthUtils.getCode(ethAddress);\n if (ovmSafetyChecker.isBytecodeSafe(deployedCode) == false) {\n _revertWithFlag(\n RevertFlag.UNSAFE_BYTECODE,\n Lib_ErrorUtils.encodeRevertString(\"Constructor attempted to deploy unsafe bytecode.\")\n );\n }\n\n // Contract creation didn't need to be reverted and the bytecode is safe. We finish up by\n // associating the desired address with the newly created contract's code hash and address.\n _commitPendingAccount(\n _address,\n ethAddress,\n Lib_EthUtils.getCodeHash(ethAddress)\n );\n }\n\n /******************************************\n * Internal Functions: Value Manipulation *\n ******************************************/\n\n /**\n * Invokes an ovmCALL to OVM_ETH.transfer on behalf of the current ovmADDRESS, allowing us to force movement of OVM_ETH in correspondence with ETH's native value functionality.\n * WARNING: this will send on behalf of whatever the messageContext.ovmADDRESS is in storage at the time of the call.\n * NOTE: In the future, this could be optimized to directly invoke EM._setContractStorage(...).\n * @param _to Amount of OVM_ETH to be sent.\n * @param _value Amount of OVM_ETH to send.\n * @return _success Whether or not the transfer worked.\n */\n function _attemptForcedEthTransfer(\n address _to,\n uint256 _value\n )\n internal\n returns(\n bool _success\n )\n {\n bytes memory transferCalldata = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n _to,\n _value\n );\n\n // OVM_ETH inherits from the UniswapV2ERC20 standard. In this implementation, its return type\n // is a boolean. However, the implementation always returns true if it does not revert.\n // Thus, success of the call frame is sufficient to infer success of the transfer itself.\n (bool success, ) = ovmCALL(\n gasleft(),\n Lib_PredeployAddresses.OVM_ETH,\n 0,\n transferCalldata\n );\n\n return success;\n }\n\n /******************************************\n * Internal Functions: State Manipulation *\n ******************************************/\n\n /**\n * Checks whether an account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account exists.\n */\n function _hasAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasAccount(_address);\n }\n\n /**\n * Checks whether a known empty account exists within the OVM_StateManager.\n * @param _address Address of the account to check.\n * @return _exists Whether or not the account empty exists.\n */\n function _hasEmptyAccount(\n address _address\n )\n internal\n returns (\n bool _exists\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.hasEmptyAccount(_address);\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function _setAccountNonce(\n address _address,\n uint256 _nonce\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.setAccountNonce(_address, _nonce);\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return _nonce Nonce of the account.\n */\n function _getAccountNonce(\n address _address\n )\n internal\n returns (\n uint256 _nonce\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountNonce(_address);\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return _ethAddress Corresponding Ethereum address.\n */\n function _getAccountEthAddress(\n address _address\n )\n internal\n returns (\n address _ethAddress\n )\n {\n _checkAccountLoad(_address);\n return ovmStateManager.getAccountEthAddress(_address);\n }\n\n /**\n * Creates the default account object for the given address.\n * @param _address Address of the account create.\n */\n function _initPendingAccount(\n address _address\n )\n internal\n {\n // Although it seems like `_checkAccountChange` would be more appropriate here, we don't\n // actually consider an account \"changed\" until it's inserted into the state (in this case\n // by `_commitPendingAccount`).\n _checkAccountLoad(_address);\n ovmStateManager.initPendingAccount(_address);\n }\n\n /**\n * Stores additional relevant data for a new account, thereby \"committing\" it to the state.\n * This function is only called during `ovmCREATE` and `ovmCREATE2` after a successful contract\n * creation.\n * @param _address Address of the account to commit.\n * @param _ethAddress Address of the associated deployed contract.\n * @param _codeHash Hash of the code stored at the address.\n */\n function _commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n internal\n {\n _checkAccountChange(_address);\n ovmStateManager.commitPendingAccount(\n _address,\n _ethAddress,\n _codeHash\n );\n }\n\n /**\n * Retrieves the value of a storage slot.\n * @param _contract Address of the contract to query.\n * @param _key 32 byte key of the storage slot.\n * @return _value 32 byte storage slot value.\n */\n function _getContractStorage(\n address _contract,\n bytes32 _key\n )\n internal\n returns (\n bytes32 _value\n )\n {\n _checkContractStorageLoad(_contract, _key);\n return ovmStateManager.getContractStorage(_contract, _key);\n }\n\n /**\n * Sets the value of a storage slot.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte key of the storage slot.\n * @param _value 32 byte storage slot value.\n */\n function _putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n internal\n {\n // We don't set storage if the value didn't change. Although this acts as a convenient\n // optimization, it's also necessary to avoid the case in which a contract with no storage\n // attempts to store the value \"0\" at any key. Putting this value (and therefore requiring\n // that the value be committed into the storage trie after execution) would incorrectly\n // modify the storage root.\n if (_getContractStorage(_contract, _key) == _value) {\n return;\n }\n\n _checkContractStorageChange(_contract, _key);\n ovmStateManager.putContractStorage(_contract, _key, _value);\n }\n\n /**\n * Validation whenever a contract needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the account hasn't been loaded before.\n * @param _address Address of the account to load.\n */\n function _checkAccountLoad(\n address _address\n )\n internal\n {\n // See `_checkContractStorageLoad` for more information.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // See `_checkContractStorageLoad` for more information.\n if (ovmStateManager.hasAccount(_address) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the account has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is loaded.\n (\n bool _wasAccountAlreadyLoaded\n ) = ovmStateManager.testAndSetAccountLoaded(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyLoaded == false) {\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a contract needs to be changed. Checks that the account exists, charges\n * nuisance gas if the account hasn't been changed before.\n * @param _address Address of the account to change.\n */\n function _checkAccountChange(\n address _address\n )\n internal\n {\n // Start by checking for a load as we only want to charge nuisance gas proportional to\n // contract size once.\n _checkAccountLoad(_address);\n\n // Check whether the account has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that an account is changed.\n (\n bool _wasAccountAlreadyChanged\n ) = ovmStateManager.testAndSetAccountChanged(_address);\n\n // If we hadn't already loaded the account, then we'll need to charge \"nuisance gas\" based\n // on the size of the contract code.\n if (_wasAccountAlreadyChanged == false) {\n ovmStateManager.incrementTotalUncommittedAccounts();\n _useNuisanceGas(\n (Lib_EthUtils.getCodeSize(_getAccountEthAddress(_address)) * NUISANCE_GAS_PER_CONTRACT_BYTE) + MIN_NUISANCE_GAS_PER_CONTRACT\n );\n }\n }\n\n /**\n * Validation whenever a slot needs to be loaded. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been loaded before.\n * @param _contract Address of the account to load from.\n * @param _key 32 byte key to load.\n */\n function _checkContractStorageLoad(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Another case of hidden complexity. If we didn't enforce this requirement, then a\n // contract could pass in just enough gas to cause the INVALID_STATE_ACCESS check to fail\n // on L1 but not on L2. A contract could use this behavior to prevent the\n // OVM_ExecutionManager from detecting an invalid state access. Reverting with OUT_OF_GAS\n // allows us to also charge for the full message nuisance gas, because you deserve that for\n // trying to break the contract in this way.\n if (gasleft() < MIN_GAS_FOR_INVALID_STATE_ACCESS) {\n _revertWithFlag(RevertFlag.OUT_OF_GAS);\n }\n\n // We need to make sure that the transaction isn't trying to access storage that hasn't\n // been provided to the OVM_StateManager. We'll immediately abort if this is the case.\n // We know that we have enough gas to do this check because of the above test.\n if (ovmStateManager.hasContractStorage(_contract, _key) == false) {\n _revertWithFlag(RevertFlag.INVALID_STATE_ACCESS);\n }\n\n // Check whether the slot has been loaded before and mark it as loaded if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is loaded.\n (\n bool _wasContractStorageAlreadyLoaded\n ) = ovmStateManager.testAndSetContractStorageLoaded(_contract, _key);\n\n // If we hadn't already loaded the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyLoaded == false) {\n _useNuisanceGas(NUISANCE_GAS_SLOAD);\n }\n }\n\n /**\n * Validation whenever a slot needs to be changed. Checks that the account exists, charges\n * nuisance gas if the slot hasn't been changed before.\n * @param _contract Address of the account to change.\n * @param _key 32 byte key to change.\n */\n function _checkContractStorageChange(\n address _contract,\n bytes32 _key\n )\n internal\n {\n // Start by checking for load to make sure we have the storage slot and that we charge the\n // \"nuisance gas\" necessary to prove the storage slot state.\n _checkContractStorageLoad(_contract, _key);\n\n // Check whether the slot has been changed before and mark it as changed if not. We need\n // this because \"nuisance gas\" only applies to the first time that a slot is changed.\n (\n bool _wasContractStorageAlreadyChanged\n ) = ovmStateManager.testAndSetContractStorageChanged(_contract, _key);\n\n // If we hadn't already changed the account, then we'll need to charge some fixed amount of\n // \"nuisance gas\".\n if (_wasContractStorageAlreadyChanged == false) {\n // Changing a storage slot means that we're also going to have to change the\n // corresponding account, so do an account change check.\n _checkAccountChange(_contract);\n\n ovmStateManager.incrementTotalUncommittedContractStorage();\n _useNuisanceGas(NUISANCE_GAS_SSTORE);\n }\n }\n\n\n /************************************\n * Internal Functions: Revert Logic *\n ************************************/\n\n /**\n * Simple encoding for revert data.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided revert data.\n * @return _revertdata Encoded revert data.\n */\n function _encodeRevertData(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n returns (\n bytes memory _revertdata\n )\n {\n // Out of gas and create exceptions will fundamentally return no data, so simulating it shouldn't either.\n if (\n _flag == RevertFlag.OUT_OF_GAS\n ) {\n return bytes('');\n }\n\n // INVALID_STATE_ACCESS doesn't need to return any data other than the flag.\n if (_flag == RevertFlag.INVALID_STATE_ACCESS) {\n return abi.encode(\n _flag,\n 0,\n 0,\n bytes('')\n );\n }\n\n // Just ABI encode the rest of the parameters.\n return abi.encode(\n _flag,\n messageRecord.nuisanceGasLeft,\n transactionRecord.ovmGasRefund,\n _data\n );\n }\n\n /**\n * Simple decoding for revert data.\n * @param _revertdata Revert data to decode.\n * @return _flag Flag used to revert.\n * @return _nuisanceGasLeft Amount of nuisance gas unused by the message.\n * @return _ovmGasRefund Amount of gas refunded during the message.\n * @return _data Additional user-provided revert data.\n */\n function _decodeRevertData(\n bytes memory _revertdata\n )\n internal\n pure\n returns (\n RevertFlag _flag,\n uint256 _nuisanceGasLeft,\n uint256 _ovmGasRefund,\n bytes memory _data\n )\n {\n // A length of zero means the call ran out of gas, just return empty data.\n if (_revertdata.length == 0) {\n return (\n RevertFlag.OUT_OF_GAS,\n 0,\n 0,\n bytes('')\n );\n }\n\n // ABI decode the incoming data.\n return abi.decode(_revertdata, (RevertFlag, uint256, uint256, bytes));\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n * @param _data Additional user-provided data.\n */\n function _revertWithFlag(\n RevertFlag _flag,\n bytes memory _data\n )\n internal\n view\n {\n bytes memory revertdata = _encodeRevertData(\n _flag,\n _data\n );\n\n assembly {\n revert(add(revertdata, 0x20), mload(revertdata))\n }\n }\n\n /**\n * Causes a message to revert or abort.\n * @param _flag Flag to revert with.\n */\n function _revertWithFlag(\n RevertFlag _flag\n )\n internal\n {\n _revertWithFlag(_flag, bytes(''));\n }\n\n\n /******************************************\n * Internal Functions: Nuisance Gas Logic *\n ******************************************/\n\n /**\n * Computes the nuisance gas limit from the gas limit.\n * @dev This function is currently using a naive implementation whereby the nuisance gas limit\n * is set to exactly equal the lesser of the gas limit or remaining gas. It's likely that\n * this implementation is perfectly fine, but we may change this formula later.\n * @param _gasLimit Gas limit to compute from.\n * @return _nuisanceGasLimit Computed nuisance gas limit.\n */\n function _getNuisanceGasLimit(\n uint256 _gasLimit\n )\n internal\n view\n returns (\n uint256 _nuisanceGasLimit\n )\n {\n return _gasLimit < gasleft() ? _gasLimit : gasleft();\n }\n\n /**\n * Uses a certain amount of nuisance gas.\n * @param _amount Amount of nuisance gas to use.\n */\n function _useNuisanceGas(\n uint256 _amount\n )\n internal\n {\n // Essentially the same as a standard OUT_OF_GAS, except we also retain a record of the gas\n // refund to be given at the end of the transaction.\n if (messageRecord.nuisanceGasLeft < _amount) {\n _revertWithFlag(RevertFlag.EXCEEDS_NUISANCE_GAS);\n }\n\n messageRecord.nuisanceGasLeft -= _amount;\n }\n\n\n /************************************\n * Internal Functions: Gas Metering *\n ************************************/\n\n /**\n * Checks whether a transaction needs to start a new epoch and does so if necessary.\n * @param _timestamp Transaction timestamp.\n */\n function _checkNeedsNewEpoch(\n uint256 _timestamp\n )\n internal\n {\n if (\n _timestamp >= (\n _getGasMetadata(GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP)\n + gasMeterConfig.secondsPerEpoch\n )\n ) {\n _putGasMetadata(\n GasMetadataKey.CURRENT_EPOCH_START_TIMESTAMP,\n _timestamp\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS\n )\n );\n\n _putGasMetadata(\n GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS,\n _getGasMetadata(\n GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS\n )\n );\n }\n }\n\n /**\n * Validates the input values of a transaction.\n * @return _valid Whether or not the transaction data is valid.\n */\n function _isValidInput(\n Lib_OVMCodec.Transaction memory _transaction\n )\n view\n internal\n returns (\n bool\n )\n {\n // Prevent reentrancy to run():\n // This check prevents calling run with the default ovmNumber.\n // Combined with the first check in run():\n // if (transactionContext.ovmNUMBER != DEFAULT_UINT256) { return; }\n // It should be impossible to re-enter since run() returns before any other call frames are created.\n // Since this value is already being written to storage, we save much gas compared to\n // using the standard nonReentrant pattern.\n if (_transaction.blockNumber == DEFAULT_UINT256) {\n return false;\n }\n\n if (_isValidGasLimit(_transaction.gasLimit, _transaction.l1QueueOrigin) == false) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates the gas limit for a given transaction.\n * @param _gasLimit Gas limit provided by the transaction.\n * param _queueOrigin Queue from which the transaction originated.\n * @return _valid Whether or not the gas limit is valid.\n */\n function _isValidGasLimit(\n uint256 _gasLimit,\n Lib_OVMCodec.QueueOrigin // _queueOrigin\n )\n view\n internal\n returns (\n bool _valid\n )\n {\n // Always have to be below the maximum gas limit.\n if (_gasLimit > gasMeterConfig.maxTransactionGasLimit) {\n return false;\n }\n\n // Always have to be above the minimum gas limit.\n if (_gasLimit < gasMeterConfig.minTransactionGasLimit) {\n return false;\n }\n\n // TEMPORARY: Gas metering is disabled for minnet.\n return true;\n // GasMetadataKey cumulativeGasKey;\n // GasMetadataKey prevEpochGasKey;\n // if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_SEQUENCER_QUEUE_GAS;\n // } else {\n // cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n // prevEpochGasKey = GasMetadataKey.PREV_EPOCH_L1TOL2_QUEUE_GAS;\n // }\n\n // return (\n // (\n // _getGasMetadata(cumulativeGasKey)\n // - _getGasMetadata(prevEpochGasKey)\n // + _gasLimit\n // ) < gasMeterConfig.maxGasPerQueuePerEpoch\n // );\n }\n\n /**\n * Updates the cumulative gas after a transaction.\n * @param _gasUsed Gas used by the transaction.\n * @param _queueOrigin Queue from which the transaction originated.\n */\n function _updateCumulativeGas(\n uint256 _gasUsed,\n Lib_OVMCodec.QueueOrigin _queueOrigin\n )\n internal\n {\n GasMetadataKey cumulativeGasKey;\n if (_queueOrigin == Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE) {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_SEQUENCER_QUEUE_GAS;\n } else {\n cumulativeGasKey = GasMetadataKey.CUMULATIVE_L1TOL2_QUEUE_GAS;\n }\n\n _putGasMetadata(\n cumulativeGasKey,\n (\n _getGasMetadata(cumulativeGasKey)\n + gasMeterConfig.minTransactionGasLimit\n + _gasUsed\n - transactionRecord.ovmGasRefund\n )\n );\n }\n\n /**\n * Retrieves the value of a gas metadata key.\n * @param _key Gas metadata key to retrieve.\n * @return _value Value stored at the given key.\n */\n function _getGasMetadata(\n GasMetadataKey _key\n )\n internal\n returns (\n uint256 _value\n )\n {\n return uint256(_getContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key))\n ));\n }\n\n /**\n * Sets the value of a gas metadata key.\n * @param _key Gas metadata key to set.\n * @param _value Value to store at the given key.\n */\n function _putGasMetadata(\n GasMetadataKey _key,\n uint256 _value\n )\n internal\n {\n _putContractStorage(\n GAS_METADATA_ADDRESS,\n bytes32(uint256(_key)),\n bytes32(uint256(_value))\n );\n }\n\n\n /*****************************************\n * Internal Functions: Execution Context *\n *****************************************/\n\n /**\n * Swaps over to a new message context.\n * @param _prevMessageContext Context we're switching from.\n * @param _nextMessageContext Context we're switching to.\n */\n function _switchMessageContext(\n MessageContext memory _prevMessageContext,\n MessageContext memory _nextMessageContext\n )\n internal\n {\n // These conditionals allow us to avoid unneccessary SSTOREs. However, they do mean that the current storage\n // value for the messageContext MUST equal the _prevMessageContext argument, or an SSTORE might be erroneously skipped.\n if (_prevMessageContext.ovmCALLER != _nextMessageContext.ovmCALLER) {\n messageContext.ovmCALLER = _nextMessageContext.ovmCALLER;\n }\n\n if (_prevMessageContext.ovmADDRESS != _nextMessageContext.ovmADDRESS) {\n messageContext.ovmADDRESS = _nextMessageContext.ovmADDRESS;\n }\n\n if (_prevMessageContext.isStatic != _nextMessageContext.isStatic) {\n messageContext.isStatic = _nextMessageContext.isStatic;\n }\n\n if (_prevMessageContext.ovmCALLVALUE != _nextMessageContext.ovmCALLVALUE) {\n messageContext.ovmCALLVALUE = _nextMessageContext.ovmCALLVALUE;\n }\n }\n\n /**\n * Initializes the execution context.\n * @param _transaction OVM transaction being executed.\n */\n function _initContext(\n Lib_OVMCodec.Transaction memory _transaction\n )\n internal\n {\n transactionContext.ovmTIMESTAMP = _transaction.timestamp;\n transactionContext.ovmNUMBER = _transaction.blockNumber;\n transactionContext.ovmTXGASLIMIT = _transaction.gasLimit;\n transactionContext.ovmL1QUEUEORIGIN = _transaction.l1QueueOrigin;\n transactionContext.ovmL1TXORIGIN = _transaction.l1TxOrigin;\n transactionContext.ovmGASLIMIT = gasMeterConfig.maxGasPerQueuePerEpoch;\n\n messageRecord.nuisanceGasLeft = _getNuisanceGasLimit(_transaction.gasLimit);\n }\n\n /**\n * Resets the transaction and message context.\n */\n function _resetContext()\n internal\n {\n transactionContext.ovmL1TXORIGIN = DEFAULT_ADDRESS;\n transactionContext.ovmTIMESTAMP = DEFAULT_UINT256;\n transactionContext.ovmNUMBER = DEFAULT_UINT256;\n transactionContext.ovmGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmTXGASLIMIT = DEFAULT_UINT256;\n transactionContext.ovmL1QUEUEORIGIN = Lib_OVMCodec.QueueOrigin.SEQUENCER_QUEUE;\n\n transactionRecord.ovmGasRefund = DEFAULT_UINT256;\n\n messageContext.ovmCALLER = DEFAULT_ADDRESS;\n messageContext.ovmADDRESS = DEFAULT_ADDRESS;\n messageContext.isStatic = false;\n\n messageRecord.nuisanceGasLeft = DEFAULT_UINT256;\n\n // Reset the ovmStateManager.\n ovmStateManager = iOVM_StateManager(address(0));\n }\n\n\n /******************************************\n * Internal Functions: Message Typechecks *\n ******************************************/\n\n /**\n * Returns whether or not the given message type is a CREATE-type.\n * @param _messageType the message type in question.\n */\n function _isCreateType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n return (\n _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n /**\n * Returns whether or not the given message type (potentially) requires the transfer of ETH value along with the message.\n * @param _messageType the message type in question.\n */\n function _isValueType(\n MessageType _messageType\n )\n internal\n pure\n returns(\n bool\n )\n {\n // ovmSTATICCALL and ovmDELEGATECALL types do not accept or transfer value.\n return (\n _messageType == MessageType.ovmCALL\n || _messageType == MessageType.ovmCREATE\n || _messageType == MessageType.ovmCREATE2\n );\n }\n\n\n /*****************************\n * L2-only Helper Functions *\n *****************************/\n\n /**\n * Unreachable helper function for simulating eth_calls with an OVM message context.\n * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.\n * @param _transaction the message transaction to simulate.\n * @param _from the OVM account the simulated call should be from.\n * @param _value the amount of ETH value to send.\n * @param _ovmStateManager the address of the OVM_StateManager precompile in the L2 state.\n */\n function simulateMessage(\n Lib_OVMCodec.Transaction memory _transaction,\n address _from,\n uint256 _value,\n iOVM_StateManager _ovmStateManager\n )\n external\n returns (\n bytes memory\n )\n {\n // Prevent this call from having any effect unless in a custom-set VM frame\n require(msg.sender == address(0));\n\n // Initialize the EM's internal state, ignoring nuisance gas.\n ovmStateManager = _ovmStateManager;\n _initContext(_transaction);\n messageRecord.nuisanceGasLeft = uint(-1);\n\n // Set the ovmADDRESS to the _from so that the subsequent call frame \"comes from\" them.\n messageContext.ovmADDRESS = _from;\n\n // Execute the desired message.\n bool isCreate = _transaction.entrypoint == address(0);\n if (isCreate) {\n (address created, bytes memory revertData) = ovmCREATE(_transaction.data);\n if (created == address(0)) {\n return abi.encode(false, revertData);\n } else {\n // The eth_call RPC endpoint for to = undefined will return the deployed bytecode\n // in the success case, differing from standard create messages.\n return abi.encode(true, Lib_EthUtils.getCode(created));\n }\n } else {\n (bool success, bytes memory returndata) = ovmCALL(\n _transaction.gasLimit,\n _transaction.entrypoint,\n _value,\n _transaction.data\n );\n return abi.encode(success, returndata);\n }\n }\n}\n" +- }, +- "@openzeppelin/contracts/math/Math.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow, so we distribute\n return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/execution/iOVM_SafetyChecker.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_SafetyChecker\n */\ninterface iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n function isBytecodeSafe(bytes calldata _bytecode) external pure returns (bool);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_DeployerWhitelist } from \"../../iOVM/predeploys/iOVM_DeployerWhitelist.sol\";\n\n/**\n * @title OVM_DeployerWhitelist\n * @dev The Deployer Whitelist is a temporary predeploy used to provide additional safety during the\n * initial phases of our mainnet roll out. It is owned by the Optimism team, and defines accounts\n * which are allowed to deploy contracts on Layer2. The Execution Manager will only allow an\n * ovmCREATE or ovmCREATE2 operation to proceed if the deployer's address whitelisted.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_DeployerWhitelist is iOVM_DeployerWhitelist {\n\n /**********************\n * Contract Constants *\n **********************/\n\n bool public initialized;\n bool public allowArbitraryDeployment;\n address override public owner;\n mapping (address => bool) public whitelist;\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Blocks functions to anyone except the contract owner.\n */\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Function can only be called by the owner of this contract.\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Initializes the whitelist.\n * @param _owner Address of the owner for this contract.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function initialize(\n address _owner,\n bool _allowArbitraryDeployment\n )\n override\n external\n {\n if (initialized == true) {\n return;\n }\n\n initialized = true;\n allowArbitraryDeployment = _allowArbitraryDeployment;\n owner = _owner;\n }\n\n /**\n * Adds or removes an address from the deployment whitelist.\n * @param _deployer Address to update permissions for.\n * @param _isWhitelisted Whether or not the address is whitelisted.\n */\n function setWhitelistedDeployer(\n address _deployer,\n bool _isWhitelisted\n )\n override\n external\n onlyOwner\n {\n whitelist[_deployer] = _isWhitelisted;\n }\n\n /**\n * Updates the owner of this contract.\n * @param _owner Address of the new owner.\n */\n function setOwner(\n address _owner\n )\n override\n public\n onlyOwner\n {\n owner = _owner;\n }\n\n /**\n * Updates the arbitrary deployment flag.\n * @param _allowArbitraryDeployment Whether or not to allow arbitrary contract deployment.\n */\n function setAllowArbitraryDeployment(\n bool _allowArbitraryDeployment\n )\n override\n public\n onlyOwner\n {\n allowArbitraryDeployment = _allowArbitraryDeployment;\n }\n\n /**\n * Permanently enables arbitrary contract deployment and deletes the owner.\n */\n function enableArbitraryContractDeployment()\n override\n external\n onlyOwner\n {\n setAllowArbitraryDeployment(true);\n setOwner(address(0));\n }\n\n /**\n * Checks whether an address is allowed to deploy contracts.\n * @param _deployer Address to check.\n * @return _allowed Whether or not the address can deploy contracts.\n */\n function isDeployerAllowed(\n address _deployer\n )\n override\n external\n returns (\n bool\n )\n {\n return (\n initialized == false\n || allowArbitraryDeployment == true\n || whitelist[_deployer]\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_DeployerWhitelist.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_DeployerWhitelist\n */\ninterface iOVM_DeployerWhitelist {\n\n /********************\n * Public Functions *\n ********************/\n\n function initialize(address _owner, bool _allowArbitraryDeployment) external;\n function owner() external returns (address _owner);\n function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external;\n function setOwner(address _newOwner) external;\n function setAllowArbitraryDeployment(bool _allowArbitraryDeployment) external;\n function enableArbitraryContractDeployment() external;\n function isDeployerAllowed(address _deployer) external returns (bool _allowed);\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_SafetyChecker } from \"../../iOVM/execution/iOVM_SafetyChecker.sol\";\n\n/**\n * @title OVM_SafetyChecker\n * @dev The Safety Checker verifies that contracts deployed on L2 do not contain any\n * \"unsafe\" operations. An operation is considered unsafe if it would access state variables which\n * are specific to the environment (ie. L1 or L2) in which it is executed, as this could be used\n * to \"escape the sandbox\" of the OVM, resulting in non-deterministic fraud proofs.\n * That is, an attacker would be able to \"prove fraud\" on an honestly applied transaction.\n * Note that a \"safe\" contract requires opcodes to appear in a particular pattern;\n * omission of \"unsafe\" opcodes is necessary, but not sufficient.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_SafetyChecker is iOVM_SafetyChecker {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Returns whether or not all of the provided bytecode is safe.\n * @param _bytecode The bytecode to safety check.\n * @return `true` if the bytecode is safe, `false` otherwise.\n */\n function isBytecodeSafe(\n bytes memory _bytecode\n )\n override\n external\n pure\n returns (\n bool\n )\n {\n // autogenerated by gen_safety_checker_constants.py\n // number of bytes to skip for each opcode\n uint256[8] memory opcodeSkippableBytes = [\n uint256(0x0001010101010101010101010000000001010101010101010101010101010000),\n uint256(0x0100000000000000000000000000000000000000010101010101000000010100),\n uint256(0x0000000000000000000000000000000001010101000000010101010100000000),\n uint256(0x0203040500000000000000000000000000000000000000000000000000000000),\n uint256(0x0101010101010101010101010101010101010101010101010101010101010101),\n uint256(0x0101010101000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000),\n uint256(0x0000000000000000000000000000000000000000000000000000000000000000)\n ];\n // Mask to gate opcode specific cases\n uint256 opcodeGateMask = ~uint256(0xffffffffffffffffffffffe000000000fffffffff070ffff9c0ffffec000f001);\n // Halting opcodes\n uint256 opcodeHaltingMask = ~uint256(0x4008000000000000000000000000000000000000004000000000000000000001);\n // PUSH opcodes\n uint256 opcodePushMask = ~uint256(0xffffffff000000000000000000000000);\n\n uint256 codeLength;\n uint256 _pc;\n assembly {\n _pc := add(_bytecode, 0x20)\n }\n codeLength = _pc + _bytecode.length;\n do {\n // current opcode: 0x00...0xff\n uint256 opNum;\n\n // inline assembly removes the extra add + bounds check\n assembly {\n let word := mload(_pc) //load the next 32 bytes at pc into word\n\n // Look up number of bytes to skip from opcodeSkippableBytes and then update indexInWord\n // E.g. the 02030405 in opcodeSkippableBytes is the number of bytes to skip for PUSH1->4\n // We repeat this 6 times, thus we can only skip bytes for up to PUSH4 ((1+4) * 6 = 30 < 32).\n // If we see an opcode that is listed as 0 skippable bytes e.g. PUSH5,\n // then we will get stuck on that indexInWord and then opNum will be set to the PUSH5 opcode.\n let indexInWord := byte(0, mload(add(opcodeSkippableBytes, byte(0, word))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n indexInWord := add(indexInWord, byte(0, mload(add(opcodeSkippableBytes, byte(indexInWord, word)))))\n _pc := add(_pc, indexInWord)\n\n opNum := byte(indexInWord, word)\n }\n\n // + push opcodes\n // + stop opcodes [STOP(0x00),JUMP(0x56),RETURN(0xf3),INVALID(0xfe)]\n // + caller opcode CALLER(0x33)\n // + blacklisted opcodes\n uint256 opBit = 1 << opNum;\n if (opBit & opcodeGateMask == 0) {\n if (opBit & opcodePushMask == 0) {\n // all pushes are valid opcodes\n // subsequent bytes are not opcodes. Skip them.\n _pc += (opNum - 0x5e); // PUSH1 is 0x60, so opNum-0x5f = PUSHed bytes and we +1 to\n // skip the _pc++; line below in order to save gas ((-0x5f + 1) = -0x5e)\n continue;\n } else if (opBit & opcodeHaltingMask == 0) {\n // STOP or JUMP or RETURN or INVALID (Note: REVERT is blacklisted, so not included here)\n // We are now inside unreachable code until we hit a JUMPDEST!\n do {\n _pc++;\n assembly {\n opNum := byte(0, mload(_pc))\n }\n // encountered a JUMPDEST\n if (opNum == 0x5b) break;\n // skip PUSHed bytes\n if ((1 << opNum) & opcodePushMask == 0) _pc += (opNum - 0x5f); // opNum-0x5f = PUSHed bytes (PUSH1 is 0x60)\n } while (_pc < codeLength);\n // opNum is 0x5b, so we don't continue here since the pc++ is fine\n } else if (opNum == 0x33) { // Caller opcode\n uint256 firstOps; // next 32 bytes of bytecode\n uint256 secondOps; // following 32 bytes of bytecode\n\n assembly {\n firstOps := mload(_pc)\n // 37 bytes total, 5 left over --> 32 - 5 bytes = 27 bytes = 216 bits\n secondOps := shr(216, mload(add(_pc, 0x20)))\n }\n\n // Call identity precompile\n // CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL\n // 32 - 8 bytes = 24 bytes = 192\n if ((firstOps >> 192) == 0x3350600060045af1) {\n _pc += 8;\n // Call EM and abort execution if instructed\n // CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST\n } else if (firstOps == 0x336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760 && secondOps == 0x016000f35b) {\n _pc += 37;\n } else {\n return false;\n }\n continue;\n } else {\n // encountered a non-whitelisted opcode!\n return false;\n }\n }\n _pc++;\n } while (_pc < codeLength);\n return true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_StateManagerFactory.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\nimport { iOVM_StateManagerFactory } from \"../../iOVM/execution/iOVM_StateManagerFactory.sol\";\n\n/* Contract Imports */\nimport { OVM_StateManager } from \"./OVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManagerFactory\n * @dev The State Manager Factory is called by a State Transitioner's init code, to create a new\n * State Manager for use in the Fraud Verification process.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManagerFactory is iOVM_StateManagerFactory {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Creates a new OVM_StateManager\n * @param _owner Owner of the created contract.\n * @return New OVM_StateManager instance.\n */\n function create(\n address _owner\n )\n override\n public\n returns (\n iOVM_StateManager\n )\n {\n return new OVM_StateManager(_owner);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/execution/OVM_StateManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_StateManager } from \"../../iOVM/execution/iOVM_StateManager.sol\";\n\n/**\n * @title OVM_StateManager\n * @dev The State Manager contract holds all storage values for contracts in the OVM. It can only be written to by the\n * the Execution Manager and State Transitioner. It runs on L1 during the setup and execution of a fraud proof.\n * The same logic runs on L2, but has been implemented as a precompile in the L2 go-ethereum client\n * (see https://github.com/ethereum-optimism/go-ethereum/blob/master/core/vm/ovm_state_manager.go).\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_StateManager is iOVM_StateManager {\n\n /*************\n * Constants *\n *************/\n\n bytes32 constant internal EMPTY_ACCOUNT_STORAGE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421;\n bytes32 constant internal EMPTY_ACCOUNT_CODE_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n bytes32 constant internal STORAGE_XOR_VALUE = 0xFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEFFEEDFACECAFEBEEF;\n\n\n /*************\n * Variables *\n *************/\n\n address override public owner;\n address override public ovmExecutionManager;\n mapping (address => Lib_OVMCodec.Account) internal accounts;\n mapping (address => mapping (bytes32 => bytes32)) internal contractStorage;\n mapping (address => mapping (bytes32 => bool)) internal verifiedContractStorage;\n mapping (bytes32 => ItemState) internal itemStates;\n uint256 internal totalUncommittedAccounts;\n uint256 internal totalUncommittedContractStorage;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address of the owner of this contract.\n */\n constructor(\n address _owner\n )\n {\n owner = _owner;\n }\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Simple authentication, this contract should only be accessible to the owner (which is expected to be the State Transitioner during `PRE_EXECUTION`\n * or the OVM_ExecutionManager during transaction execution.\n */\n modifier authenticated() {\n // owner is the State Transitioner\n require(\n msg.sender == owner || msg.sender == ovmExecutionManager,\n \"Function can only be called by authenticated addresses\"\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks whether a given address is allowed to modify this contract.\n * @param _address Address to check.\n * @return Whether or not the address can modify this contract.\n */\n function isAuthenticated(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (_address == owner || _address == ovmExecutionManager);\n }\n\n /**\n * Sets the address of the OVM_ExecutionManager.\n * @param _ovmExecutionManager Address of the OVM_ExecutionManager.\n */\n function setExecutionManager(\n address _ovmExecutionManager\n )\n override\n public\n authenticated\n {\n ovmExecutionManager = _ovmExecutionManager;\n }\n\n /**\n * Inserts an account into the state.\n * @param _address Address of the account to insert.\n * @param _account Account to insert for the given address.\n */\n function putAccount(\n address _address,\n Lib_OVMCodec.Account memory _account\n )\n override\n public\n authenticated\n {\n accounts[_address] = _account;\n }\n\n /**\n * Marks an account as empty.\n * @param _address Address of the account to mark.\n */\n function putEmptyAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n }\n\n /**\n * Retrieves an account from the state.\n * @param _address Address of the account to retrieve.\n * @return Account for the given address.\n */\n function getAccount(\n address _address\n )\n override\n public\n view\n returns (\n Lib_OVMCodec.Account memory\n )\n {\n return accounts[_address];\n }\n\n /**\n * Checks whether the state has a given account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the account.\n */\n function hasAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return accounts[_address].codeHash != bytes32(0);\n }\n\n /**\n * Checks whether the state has a given known empty account.\n * @param _address Address of the account to check.\n * @return Whether or not the state has the empty account.\n */\n function hasEmptyAccount(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return (\n accounts[_address].codeHash == EMPTY_ACCOUNT_CODE_HASH\n && accounts[_address].nonce == 0\n );\n }\n\n /**\n * Sets the nonce of an account.\n * @param _address Address of the account to modify.\n * @param _nonce New account nonce.\n */\n function setAccountNonce(\n address _address,\n uint256 _nonce\n )\n override\n public\n authenticated\n {\n accounts[_address].nonce = _nonce;\n }\n\n /**\n * Gets the nonce of an account.\n * @param _address Address of the account to access.\n * @return Nonce of the account.\n */\n function getAccountNonce(\n address _address\n )\n override\n public\n view\n returns (\n uint256\n )\n {\n return accounts[_address].nonce;\n }\n\n /**\n * Retrieves the Ethereum address of an account.\n * @param _address Address of the account to access.\n * @return Corresponding Ethereum address.\n */\n function getAccountEthAddress(\n address _address\n )\n override\n public\n view\n returns (\n address\n )\n {\n return accounts[_address].ethAddress;\n }\n\n /**\n * Retrieves the storage root of an account.\n * @param _address Address of the account to access.\n * @return Corresponding storage root.\n */\n function getAccountStorageRoot(\n address _address\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n return accounts[_address].storageRoot;\n }\n\n /**\n * Initializes a pending account (during CREATE or CREATE2) with the default values.\n * @param _address Address of the account to initialize.\n */\n function initPendingAccount(\n address _address\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.nonce = 1;\n account.storageRoot = EMPTY_ACCOUNT_STORAGE_ROOT;\n account.codeHash = EMPTY_ACCOUNT_CODE_HASH;\n account.isFresh = true;\n }\n\n /**\n * Finalizes the creation of a pending account (during CREATE or CREATE2).\n * @param _address Address of the account to finalize.\n * @param _ethAddress Address of the account's associated contract on Ethereum.\n * @param _codeHash Hash of the account's code.\n */\n function commitPendingAccount(\n address _address,\n address _ethAddress,\n bytes32 _codeHash\n )\n override\n public\n authenticated\n {\n Lib_OVMCodec.Account storage account = accounts[_address];\n account.ethAddress = _ethAddress;\n account.codeHash = _codeHash;\n }\n\n /**\n * Checks whether an account has already been retrieved, and marks it as retrieved if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already loaded.\n */\n function testAndSetAccountLoaded(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether an account has already been modified, and marks it as modified if not.\n * @param _address Address of the account to check.\n * @return Whether or not the account was already modified.\n */\n function testAndSetAccountChanged(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_address),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark an account as committed.\n * @param _address Address of the account to commit.\n * @return Whether or not the account was committed.\n */\n function commitAccount(\n address _address\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedAccounts -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted accounts.\n */\n function incrementTotalUncommittedAccounts()\n override\n public\n authenticated\n {\n totalUncommittedAccounts += 1;\n }\n\n /**\n * Gets the total number of uncommitted accounts.\n * @return Total uncommitted accounts.\n */\n function getTotalUncommittedAccounts()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedAccounts;\n }\n\n /**\n * Checks whether a given account was changed during execution.\n * @param _address Address to check.\n * @return Whether or not the account was changed.\n */\n function wasAccountChanged(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given account was committed after execution.\n * @param _address Address to check.\n * @return Whether or not the account was committed.\n */\n function wasAccountCommitted(\n address _address\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_address);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /************************************\n * Public Functions: Storage Access *\n ************************************/\n\n /**\n * Changes a contract storage slot value.\n * @param _contract Address of the contract to modify.\n * @param _key 32 byte storage slot key.\n * @param _value 32 byte storage slot value.\n */\n function putContractStorage(\n address _contract,\n bytes32 _key,\n bytes32 _value\n )\n override\n public\n authenticated\n {\n // A hilarious optimization. `SSTORE`ing a value of `bytes32(0)` is common enough that it's\n // worth populating this with a non-zero value in advance (during the fraud proof\n // initialization phase) to cut the execution-time cost down to 5000 gas.\n contractStorage[_contract][_key] = _value ^ STORAGE_XOR_VALUE;\n\n // Only used when initially populating the contract storage. OVM_ExecutionManager will\n // perform a `hasContractStorage` INVALID_STATE_ACCESS check before putting any contract\n // storage because writing to zero when the actual value is nonzero causes a gas\n // discrepancy. Could be moved into a new `putVerifiedContractStorage` function, or\n // something along those lines.\n if (verifiedContractStorage[_contract][_key] == false) {\n verifiedContractStorage[_contract][_key] = true;\n }\n }\n\n /**\n * Retrieves a contract storage slot value.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return 32 byte storage slot value.\n */\n function getContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bytes32\n )\n {\n // Storage XOR system doesn't work for newly created contracts that haven't set this\n // storage slot value yet.\n if (\n verifiedContractStorage[_contract][_key] == false\n && accounts[_contract].isFresh\n ) {\n return bytes32(0);\n }\n\n // See `putContractStorage` for more information about the XOR here.\n return contractStorage[_contract][_key] ^ STORAGE_XOR_VALUE;\n }\n\n /**\n * Checks whether a contract storage slot exists in the state.\n * @param _contract Address of the contract to access.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the key was set in the state.\n */\n function hasContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n return verifiedContractStorage[_contract][_key] || accounts[_contract].isFresh;\n }\n\n /**\n * Checks whether a storage slot has already been retrieved, and marks it as retrieved if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already loaded.\n */\n function testAndSetContractStorageLoaded(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_LOADED\n );\n }\n\n /**\n * Checks whether a storage slot has already been modified, and marks it as modified if not.\n * @param _contract Address of the contract to check.\n * @param _key 32 byte storage slot key.\n * @return Whether or not the slot was already modified.\n */\n function testAndSetContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n return _testAndSetItemState(\n _getItemHash(_contract, _key),\n ItemState.ITEM_CHANGED\n );\n }\n\n /**\n * Attempts to mark a storage slot as committed.\n * @param _contract Address of the account to commit.\n * @param _key 32 byte slot key to commit.\n * @return Whether or not the slot was committed.\n */\n function commitContractStorage(\n address _contract,\n bytes32 _key\n )\n override\n public\n authenticated\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n if (itemStates[item] != ItemState.ITEM_CHANGED) {\n return false;\n }\n\n itemStates[item] = ItemState.ITEM_COMMITTED;\n totalUncommittedContractStorage -= 1;\n\n return true;\n }\n\n /**\n * Increments the total number of uncommitted storage slots.\n */\n function incrementTotalUncommittedContractStorage()\n override\n public\n authenticated\n {\n totalUncommittedContractStorage += 1;\n }\n\n /**\n * Gets the total number of uncommitted storage slots.\n * @return Total uncommitted storage slots.\n */\n function getTotalUncommittedContractStorage()\n override\n public\n view\n returns (\n uint256\n )\n {\n return totalUncommittedContractStorage;\n }\n\n /**\n * Checks whether a given storage slot was changed during execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was changed.\n */\n function wasContractStorageChanged(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_CHANGED;\n }\n\n /**\n * Checks whether a given storage slot was committed after execution.\n * @param _contract Address to check.\n * @param _key Key of the storage slot to check.\n * @return Whether or not the storage slot was committed.\n */\n function wasContractStorageCommitted(\n address _contract,\n bytes32 _key\n )\n override\n public\n view\n returns (\n bool\n )\n {\n bytes32 item = _getItemHash(_contract, _key);\n return itemStates[item] >= ItemState.ITEM_COMMITTED;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Generates a unique hash for an address.\n * @param _address Address to generate a hash for.\n * @return Unique hash for the given address.\n */\n function _getItemHash(\n address _address\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(_address));\n }\n\n /**\n * Generates a unique hash for an address/key pair.\n * @param _contract Address to generate a hash for.\n * @param _key Key to generate a hash for.\n * @return Unique hash for the given pair.\n */\n function _getItemHash(\n address _contract,\n bytes32 _key\n )\n internal\n pure\n returns (\n bytes32\n )\n {\n return keccak256(abi.encodePacked(\n _contract,\n _key\n ));\n }\n\n /**\n * Checks whether an item is in a particular state (ITEM_LOADED or ITEM_CHANGED) and sets the\n * item to the provided state if not.\n * @param _item 32 byte item ID to check.\n * @param _minItemState Minimum state that must be satisfied by the item.\n * @return Whether or not the item was already in the state.\n */\n function _testAndSetItemState(\n bytes32 _item,\n ItemState _minItemState\n )\n internal\n returns (\n bool\n )\n {\n bool wasItemState = itemStates[_item] >= _minItemState;\n\n if (wasItemState == false) {\n itemStates[_item] = _minItemState;\n }\n\n return wasItemState;\n }\n}\n" +- }, +- "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../optimistic-ethereum/libraries/codec/Lib_OVMCodec.sol\";\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes memory _encoded\n )\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(\n Lib_OVMCodec.Transaction memory _transaction\n )\n public\n pure\n returns (\n bytes32 _hash\n )\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\nimport { Lib_AddressManager } from \"../../../libraries/resolver/Lib_AddressManager.sol\";\nimport { Lib_SecureMerkleTrie } from \"../../../libraries/trie/Lib_SecureMerkleTrie.sol\";\nimport { Lib_PredeployAddresses } from \"../../../libraries/constants/Lib_PredeployAddresses.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_CanonicalTransactionChain } from \"../../../iOVM/chain/iOVM_CanonicalTransactionChain.sol\";\nimport { iOVM_StateCommitmentChain } from \"../../../iOVM/chain/iOVM_StateCommitmentChain.sol\";\n\n/* External Imports */\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\n\n/**\n * @title OVM_L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1CrossDomainMessenger is\n iOVM_L1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n\n /**********\n * Events *\n **********/\n\n event MessageBlocked(\n bytes32 indexed _xDomainCalldataHash\n );\n\n event MessageAllowed(\n bytes32 indexed _xDomainCalldataHash\n );\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public blockedMessages;\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor()\n Lib_AddressResolver(address(0))\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the OVM_L2MessageRelayer contract may\n * successfully call a method.\n */\n modifier onlyRelayer() {\n address relayer = resolve(\"OVM_L2MessageRelayer\");\n if (relayer != address(0)) {\n require(\n msg.sender == relayer,\n \"Only OVM_L2MessageRelayer can relay L2-to-L1 messages.\"\n );\n }\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(\n address _libAddressManager\n )\n public\n initializer\n {\n require(\n address(libAddressManager) == address(0),\n \"L1CrossDomainMessenger already intialized.\"\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause()\n external\n onlyOwner\n {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(\n bytes32 _xDomainCalldataHash\n )\n external\n onlyOwner\n {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n address ovmCanonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n // Use the CTC queue length as nonce\n uint40 nonce = iOVM_CanonicalTransactionChain(ovmCanonicalTransactionChain).getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n _sendXDomainMessage(ovmCanonicalTransactionChain, l2CrossDomainMessenger, xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n )\n override\n public\n nonReentrant\n onlyRelayer\n whenNotPaused\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(\n xDomainCalldata,\n _proof\n ) == true,\n \"Provided message could not be verified.\"\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n \"Provided message has been blocked.\"\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc iOVM_L1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n )\n override\n public\n {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve(\"OVM_CanonicalTransactionChain\");\n Lib_OVMCodec.QueueElement memory element = iOVM_CanonicalTransactionChain(canonicalTransactionChain).getQueueElement(_queueIndex);\n\n address l2CrossDomainMessenger = resolve(\"OVM_L2CrossDomainMessenger\");\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n address(this),\n l2CrossDomainMessenger,\n _gasLimit,\n _message\n )\n );\n\n require(\n transactionHash == element.transactionHash,\n \"Provided message has not been enqueued.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n _sendXDomainMessage(canonicalTransactionChain, l2CrossDomainMessenger, xDomainCalldata, _gasLimit);\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n return (\n _verifyStateRootProof(_proof)\n && _verifyStorageProof(_xDomainCalldata, _proof)\n );\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n iOVM_StateCommitmentChain ovmStateCommitmentChain = iOVM_StateCommitmentChain(\n resolve(\"OVM_StateCommitmentChain\")\n );\n\n return (\n ovmStateCommitmentChain.insideFraudProofWindow(_proof.stateRootBatchHeader) == false\n && ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n )\n );\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n )\n internal\n view\n returns (\n bool\n )\n {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n resolve(\"OVM_L2CrossDomainMessenger\")\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n \"Message passing predeploy has not been initialized or invalid proof provided.\"\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the OVM_CanonicalTransactionChain instance.\n * @param _l2CrossDomainMessenger Address of the OVM_L2CrossDomainMessenger instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n address _l2CrossDomainMessenger,\n bytes memory _message,\n uint256 _gasLimit\n )\n internal\n {\n iOVM_CanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n _l2CrossDomainMessenger,\n _gasLimit,\n _message\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/bridge/Lib_CrossDomainUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../rlp/Lib_RLPReader.sol\";\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n internal\n pure\n returns (\n bytes memory\n )\n {\n return abi.encodeWithSignature(\n \"relayMessage(address,address,bytes,uint256)\",\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_OVMCodec } from \"../../../libraries/codec/Lib_OVMCodec.sol\";\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L1CrossDomainMessenger\n */\ninterface iOVM_L1CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _gasLimit Gas limit for the provided message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _gasLimit\n ) external;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n address msgSender = _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address payable) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /// @dev Returns true if and only if the function is running in the constructor\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" +- }, +- "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L1MultiMessageRelayer.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\nimport { iOVM_L1MultiMessageRelayer } from \"../../../iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol\";\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title OVM_L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L1MultiMessageRelayer is iOVM_L1MultiMessageRelayer, Lib_AddressResolver {\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve(\"OVM_L2BatchMessageRelayer\"),\n \"OVM_L1MultiMessageRelayer: Function can only be called by the OVM_L2BatchMessageRelayer\"\n );\n _;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(\n L2ToL1Message[] calldata _messages\n ) \n override\n external\n onlyBatchRelayer\n {\n iOVM_L1CrossDomainMessenger messenger = iOVM_L1CrossDomainMessenger(\n resolve(\"Proxy__OVM_L1CrossDomainMessenger\")\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L1MultiMessageRelayer.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_L1CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L1CrossDomainMessenger.sol\";\ninterface iOVM_L1MultiMessageRelayer {\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n iOVM_L1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n function batchRelayMessages(L2ToL1Message[] calldata _messages) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_AddressResolver } from \"../../../libraries/resolver/Lib_AddressResolver.sol\";\nimport { Lib_CrossDomainUtils } from \"../../../libraries/bridge/Lib_CrossDomainUtils.sol\";\n\n/* Interface Imports */\nimport { iOVM_L2CrossDomainMessenger } from \"../../../iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol\";\nimport { iOVM_L1MessageSender } from \"../../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_L2ToL1MessagePasser } from \"../../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/* External Imports */\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title OVM_L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_L2CrossDomainMessenger is\n iOVM_L2CrossDomainMessenger,\n Lib_AddressResolver,\n ReentrancyGuard\n{\n\n /*************\n * Constants *\n *************/\n\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER = 0x000000000000000000000000000000000000dEaD;\n\n /*************\n * Variables *\n *************/\n\n mapping (bytes32 => bool) public relayedMessages;\n mapping (bytes32 => bool) public successfulMessages;\n mapping (bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager) Lib_AddressResolver(_libAddressManager) ReentrancyGuard() {}\n\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender()\n public\n override\n view\n returns (\n address\n )\n {\n require(xDomainMsgSender != DEFAULT_XDOMAIN_SENDER, \"xDomainMessageSender is not set\");\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n )\n override\n public\n {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n messageNonce += 1;\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n _sendXDomainMessage(xDomainCalldata, _gasLimit);\n emit SentMessage(xDomainCalldata);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc iOVM_L2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n )\n override\n nonReentrant\n public\n {\n require(\n _verifyXDomainMessage() == true,\n \"Provided message could not be verified.\"\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n \"Provided message has already been received.\"\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if(_target == resolve(\"OVM_L2ToL1MessagePasser\")){\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(\n xDomainCalldata,\n msg.sender,\n block.number\n )\n );\n\n relayedMessages[relayId] = true;\n }\n\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that a received cross domain message is valid.\n * @return _valid Whether or not the message is valid.\n */\n function _verifyXDomainMessage()\n view\n internal\n returns (\n bool _valid\n )\n {\n return (\n iOVM_L1MessageSender(\n resolve(\"OVM_L1MessageSender\")\n ).getL1MessageSender() == resolve(\"OVM_L1CrossDomainMessenger\")\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _message Message to send.\n * param _gasLimit Gas limit for the provided message.\n */\n function _sendXDomainMessage(\n bytes memory _message,\n uint256 // _gasLimit\n )\n internal\n {\n iOVM_L2ToL1MessagePasser(resolve(\"OVM_L2ToL1MessagePasser\")).passMessageToL1(_message);\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_L2CrossDomainMessenger.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport { iOVM_CrossDomainMessenger } from \"./iOVM_CrossDomainMessenger.sol\";\n\n/**\n * @title iOVM_L2CrossDomainMessenger\n */\ninterface iOVM_L2CrossDomainMessenger is iOVM_CrossDomainMessenger {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L1MessageSender.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L1MessageSender\n */\ninterface iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n function getL1MessageSender() external view returns (address _l1MessageSender);\n}\n" +- }, +- "contracts/optimistic-ethereum/iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(\n uint256 _nonce,\n address _sender,\n bytes _data\n );\n\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" +- }, +- "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { +- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor () internal {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L2ToL1MessagePasser } from \"../../iOVM/predeploys/iOVM_L2ToL1MessagePasser.sol\";\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping (bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(\n bytes memory _message\n )\n override\n public\n {\n // Note: although this function is public, only messages sent from the OVM_L2CrossDomainMessenger\n // will be relayed by the OVM_L1CrossDomainMessenger. This is enforced by a check in\n // OVM_L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(\n abi.encodePacked(\n _message,\n msg.sender\n )\n )] = true;\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_L1MessageSender } from \"../../iOVM/predeploys/iOVM_L1MessageSender.sol\";\nimport { iOVM_ExecutionManager } from \"../../iOVM/execution/iOVM_ExecutionManager.sol\";\n\n/**\n * @title OVM_L1MessageSender\n * @dev The L1MessageSender is a predeploy contract running on L2. During the execution of cross\n * domain transaction from L1 to L2, it returns the address of the L1 account (either an EOA or\n * contract) which sent the message to L2 via the Canonical Transaction Chain's `enqueue()`\n * function.\n *\n * This contract exclusively serves as a getter for the ovmL1TXORIGIN operation. This is necessary\n * because there is no corresponding operation in the EVM which the the optimistic solidity compiler\n * can be replaced with a call to the ExecutionManager's ovmL1TXORIGIN() function.\n *\n *\n * Compiler used: solc\n * Runtime target: OVM\n */\ncontract OVM_L1MessageSender is iOVM_L1MessageSender {\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @return _l1MessageSender L1 message sender address (msg.sender).\n */\n function getL1MessageSender()\n override\n public\n view\n returns (\n address _l1MessageSender\n )\n {\n // Note that on L2 msg.sender (ie. evmCALLER) will always be the Execution Manager\n return iOVM_ExecutionManager(msg.sender).ovmL1TXORIGIN();\n }\n}\n" +- }, +- "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_RLPReader } from \"../../optimistic-ethereum/libraries/rlp/Lib_RLPReader.sol\";\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n\n function readList(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes[] memory\n )\n {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(\n bytes memory _in\n )\n public\n pure\n returns (\n string memory\n )\n {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes memory\n )\n {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(\n bytes memory _in\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(\n bytes memory _in\n )\n public\n pure\n returns (\n uint256\n )\n {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(\n bytes memory _in\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(\n bytes memory _in\n )\n public\n pure\n returns (\n address\n )\n {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_MerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_MerkleTrie.sol\";\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_MerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_SecureMerkleTrie } from \"../../optimistic-ethereum/libraries/trie/Lib_SecureMerkleTrie.sol\";\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_SecureMerkleTrie.verifyInclusionProof(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.update(\n _key,\n _value,\n _proof,\n _root\n );\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n )\n public\n pure\n returns (\n bool,\n bytes memory\n )\n {\n return Lib_SecureMerkleTrie.get(\n _key,\n _proof,\n _root\n );\n }\n\n function getSingleNodeRootHash(\n bytes memory _key,\n bytes memory _value\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(\n _key,\n _value\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_AddressManager } from \"./Lib_AddressManager.sol\";\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping (address => string) private implementationName;\n mapping (address => Lib_AddressManager) private addressManager;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(\n address _libAddressManager,\n string memory _implementationName\n ) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback()\n external\n payable\n {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(\n target != address(0),\n \"Target address must be initialized.\"\n );\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/OVM/predeploys/OVM_GasPriceOracle.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* External Imports */\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * Compiler used: optimistic-solc\n * Runtime target: OVM\n */\ncontract OVM_GasPriceOracle is Ownable {\n\n /*************\n * Variables *\n *************/\n\n // Current l2 gas price\n uint256 public gasPrice;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(\n address _owner,\n uint256 _initialGasPrice\n )\n Ownable()\n {\n setGasPrice(_initialGasPrice);\n transferOwnership(_owner);\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(\n uint256 _gasPrice\n )\n public\n onlyOwner\n {\n gasPrice = _gasPrice;\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Library Imports */\nimport { Lib_Bytes32Utils } from \"../../optimistic-ethereum/libraries/utils/Lib_Bytes32Utils.sol\";\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n\n function toBool(\n bytes32 _in\n )\n public\n pure\n returns (\n bool _out\n )\n {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(\n bool _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(\n bytes32 _in\n )\n public\n pure\n returns (\n address _out\n )\n {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(\n address _in\n )\n public\n pure\n returns (\n bytes32 _out\n )\n {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_EthUtils.sol": { +- "content": "// SPDX-License-Identifier: MIT\n// @unsupported: ovm\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_EthUtils } from \"../../optimistic-ethereum/libraries/utils/Lib_EthUtils.sol\";\n\n/**\n * @title TestLib_EthUtils\n */\ncontract TestLib_EthUtils {\n\n function getCode(\n address _address,\n uint256 _offset,\n uint256 _length\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address,\n _offset,\n _length\n );\n }\n\n function getCode(\n address _address\n )\n public\n view\n returns (\n bytes memory _code\n )\n {\n return Lib_EthUtils.getCode(\n _address\n );\n }\n\n function getCodeSize(\n address _address\n )\n public\n view\n returns (\n uint256 _codeSize\n )\n {\n return Lib_EthUtils.getCodeSize(\n _address\n );\n }\n\n function getCodeHash(\n address _address\n )\n public\n view\n returns (\n bytes32 _codeHash\n )\n {\n return Lib_EthUtils.getCodeHash(\n _address\n );\n }\n\n function createContract(\n bytes memory _code\n )\n public\n returns (\n address _created\n )\n {\n return Lib_EthUtils.createContract(\n _code\n );\n }\n\n function getAddressForCREATE(\n address _creator,\n uint256 _nonce\n )\n public\n pure\n returns (\n address _address\n )\n {\n return Lib_EthUtils.getAddressForCREATE(\n _creator,\n _nonce\n );\n }\n\n function getAddressForCREATE2(\n address _creator,\n bytes memory _bytecode,\n bytes32 _salt\n )\n public\n pure\n returns (address _address)\n {\n return Lib_EthUtils.getAddressForCREATE2(\n _creator,\n _bytecode,\n _salt\n );\n }\n}\n" +- }, +- "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\npragma experimental ABIEncoderV2;\n\n/* Library Imports */\nimport { Lib_MerkleTree } from \"../../optimistic-ethereum/libraries/utils/Lib_MerkleTree.sol\";\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n\n function getMerkleRoot(\n bytes32[] memory _elements\n )\n public\n pure\n returns (\n bytes32\n )\n {\n return Lib_MerkleTree.getMerkleRoot(\n _elements\n );\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n )\n public\n pure\n returns (\n bool\n )\n {\n return Lib_MerkleTree.verify(\n _root,\n _leaf,\n _index,\n _siblings,\n _totalLeaves\n );\n }\n}\n" +- }, +- "contracts/optimistic-ethereum/mockOVM/verification/mockOVM_BondManager.sol": { +- "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.8.0;\n\n/* Interface Imports */\nimport { iOVM_BondManager } from \"../../iOVM/verification/iOVM_BondManager.sol\";\n\n/* Contract Imports */\nimport { Lib_AddressResolver } from \"../../libraries/resolver/Lib_AddressResolver.sol\";\n\n/**\n * @title mockOVM_BondManager\n */\ncontract mockOVM_BondManager is iOVM_BondManager, Lib_AddressResolver {\n constructor(\n address _libAddressManager\n )\n Lib_AddressResolver(_libAddressManager)\n {}\n\n function recordGasSpent(\n bytes32 _preStateRoot,\n bytes32 _txHash,\n address _who,\n uint256 _gasSpent\n )\n override\n public\n {}\n\n function finalize(\n bytes32 _preStateRoot,\n address _publisher,\n uint256 _timestamp\n )\n override\n public\n {}\n\n function deposit()\n override\n public\n {}\n\n function startWithdrawal()\n override\n public\n {}\n\n function finalizeWithdrawal()\n override\n public\n {}\n\n function claim(\n address _who\n )\n override\n public\n {}\n\n function isCollateralized(\n address _who\n )\n override\n public\n view\n returns (\n bool\n )\n {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve(\"OVM_Proposer\");\n }\n\n function getGasSpent(\n bytes32, // _preStateRoot,\n address // _who\n )\n override\n public\n pure\n returns (\n uint256\n )\n {\n return 0;\n }\n}\n" +- } +- }, +- "settings": { +- "optimizer": { +- "enabled": true, +- "runs": 200 +- }, +- "outputSelection": { +- "*": { +- "*": [ +- "storageLayout", +- "abi", +- "evm.bytecode", +- "evm.deployedBytecode", +- "evm.methodIdentifiers", +- "metadata", +- "devdoc", +- "userdoc", +- "evm.gasEstimates" +- ], +- "": [ +- "ast" +- ] +- } +- }, +- "metadata": { +- "useLiteralContent": true +- } +- } +-} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/f009f67f4ef4065b744742a642e24755.json b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/f009f67f4ef4065b744742a642e24755.json +new file mode 100644 +index 0000000..65aad26 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/deployments/mainnet/solcInputs/f009f67f4ef4065b744742a642e24755.json +@@ -0,0 +1,240 @@ ++{ ++ "language": "Solidity", ++ "sources": { ++ "contracts/L1/messaging/IL1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\n\n/* Interface Imports */\nimport {ICrossDomainMessenger} from '../../libraries/bridge/ICrossDomainMessenger.sol';\n\n/**\n * @title IL1CrossDomainMessenger\n */\ninterface IL1CrossDomainMessenger is ICrossDomainMessenger {\n /*******************\n * Data Structures *\n *******************/\n\n struct L2MessageInclusionProof {\n bytes32 stateRoot;\n Lib_OVMCodec.ChainBatchHeader stateRootBatchHeader;\n Lib_OVMCodec.ChainInclusionProof stateRootProof;\n bytes stateTrieWitness;\n bytes storageTrieWitness;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @param _proof Inclusion proof for the given message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) external;\n\n /**\n * Replays a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _sender Original sender address.\n * @param _message Message to send to the target.\n * @param _queueIndex CTC Queue index for the message to replay.\n * @param _oldGasLimit Original gas limit used to send the message.\n * @param _newGasLimit New gas limit to be used for this message.\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/codec/Lib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\nimport {Lib_Bytes32Utils} from '../utils/Lib_Bytes32Utils.sol';\n\n/**\n * @title Lib_OVMCodec\n */\nlibrary Lib_OVMCodec {\n /*********\n * Enums *\n *********/\n\n enum QueueOrigin {\n SEQUENCER_QUEUE,\n L1TOL2_QUEUE\n }\n\n /***********\n * Structs *\n ***********/\n\n struct EVMAccount {\n uint256 nonce;\n uint256 balance;\n bytes32 storageRoot;\n bytes32 codeHash;\n }\n\n struct ChainBatchHeader {\n uint256 batchIndex;\n bytes32 batchRoot;\n uint256 batchSize;\n uint256 prevTotalElements;\n bytes extraData;\n }\n\n struct ChainInclusionProof {\n uint256 index;\n bytes32[] siblings;\n }\n\n struct Transaction {\n uint256 timestamp;\n uint256 blockNumber;\n QueueOrigin l1QueueOrigin;\n address l1TxOrigin;\n address entrypoint;\n uint256 gasLimit;\n bytes data;\n }\n\n struct TransactionChainElement {\n bool isSequenced;\n uint256 queueIndex; // QUEUED TX ONLY\n uint256 timestamp; // SEQUENCER TX ONLY\n uint256 blockNumber; // SEQUENCER TX ONLY\n bytes txData; // SEQUENCER TX ONLY\n }\n\n struct QueueElement {\n bytes32 transactionHash;\n uint40 timestamp;\n uint40 blockNumber;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Encodes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Encoded transaction bytes.\n */\n function encodeTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes memory)\n {\n return\n abi.encodePacked(\n _transaction.timestamp,\n _transaction.blockNumber,\n _transaction.l1QueueOrigin,\n _transaction.l1TxOrigin,\n _transaction.entrypoint,\n _transaction.gasLimit,\n _transaction.data\n );\n }\n\n /**\n * Hashes a standard OVM transaction.\n * @param _transaction OVM transaction to encode.\n * @return Hashed transaction\n */\n function hashTransaction(Transaction memory _transaction)\n internal\n pure\n returns (bytes32)\n {\n return keccak256(encodeTransaction(_transaction));\n }\n\n /**\n * @notice Decodes an RLP-encoded account state into a useful struct.\n * @param _encoded RLP-encoded account state.\n * @return Account state struct.\n */\n function decodeEVMAccount(bytes memory _encoded)\n internal\n pure\n returns (EVMAccount memory)\n {\n Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(\n _encoded\n );\n\n return\n EVMAccount({\n nonce: Lib_RLPReader.readUint256(accountState[0]),\n balance: Lib_RLPReader.readUint256(accountState[1]),\n storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\n codeHash: Lib_RLPReader.readBytes32(accountState[3])\n });\n }\n\n /**\n * Calculates a hash for a given batch header.\n * @param _batchHeader Header to hash.\n * @return Hash of the header.\n */\n function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n pure\n returns (bytes32)\n {\n return\n keccak256(\n abi.encode(\n _batchHeader.batchRoot,\n _batchHeader.batchSize,\n _batchHeader.prevTotalElements,\n _batchHeader.extraData\n )\n );\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/ICrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title ICrossDomainMessenger\n */\ninterface ICrossDomainMessenger {\n /**********\n * Events *\n **********/\n\n event SentMessage(\n address indexed target,\n address sender,\n bytes message,\n uint256 messageNonce,\n uint256 gasLimit\n );\n event RelayedMessage(bytes32 indexed msgHash);\n event FailedRelayedMessage(bytes32 indexed msgHash);\n\n /*************\n * Variables *\n *************/\n\n function xDomainMessageSender() external view returns (address);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes calldata _message,\n uint32 _gasLimit\n ) external;\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPReader\n * @dev Adapted from \"RLPReader\" by Hamdi Allam (hamdi.allam97@gmail.com).\n */\nlibrary Lib_RLPReader {\n /*************\n * Constants *\n *************/\n\n uint256 internal constant MAX_LIST_LENGTH = 32;\n\n /*********\n * Enums *\n *********/\n\n enum RLPItemType {\n DATA_ITEM,\n LIST_ITEM\n }\n\n /***********\n * Structs *\n ***********/\n\n struct RLPItem {\n uint256 length;\n uint256 ptr;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts bytes to a reference to memory position and length.\n * @param _in Input bytes to convert.\n * @return Output memory reference.\n */\n function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\n uint256 ptr;\n assembly {\n ptr := add(_in, 32)\n }\n\n return RLPItem({length: _in.length, ptr: ptr});\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(RLPItem memory _in)\n internal\n pure\n returns (RLPItem[] memory)\n {\n (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\n\n require(itemType == RLPItemType.LIST_ITEM, 'Invalid RLP list value.');\n\n // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\n // writing to the length. Since we can't know the number of RLP items without looping over\n // the entire input, we'd have to loop twice to accurately size this array. It's easier to\n // simply set a reasonable maximum list length and decrease the size before we finish.\n RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\n\n uint256 itemCount = 0;\n uint256 offset = listOffset;\n while (offset < _in.length) {\n require(\n itemCount < MAX_LIST_LENGTH,\n 'Provided RLP list exceeds max list length.'\n );\n\n (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\n RLPItem({length: _in.length - offset, ptr: _in.ptr + offset})\n );\n\n out[itemCount] = RLPItem({\n length: itemLength + itemOffset,\n ptr: _in.ptr + offset\n });\n\n itemCount += 1;\n offset += itemOffset + itemLength;\n }\n\n // Decrease the array size to match the actual item count.\n assembly {\n mstore(out, itemCount)\n }\n\n return out;\n }\n\n /**\n * Reads an RLP list value into a list of RLP items.\n * @param _in RLP list value.\n * @return Decoded RLP list items.\n */\n function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\n return readList(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes value.');\n\n return _copy(_in.ptr, itemOffset, itemLength);\n }\n\n /**\n * Reads an RLP bytes value into bytes.\n * @param _in RLP bytes value.\n * @return Decoded bytes.\n */\n function readBytes(bytes memory _in) internal pure returns (bytes memory) {\n return readBytes(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(RLPItem memory _in)\n internal\n pure\n returns (string memory)\n {\n return string(readBytes(_in));\n }\n\n /**\n * Reads an RLP string value into a string.\n * @param _in RLP string value.\n * @return Decoded string.\n */\n function readString(bytes memory _in) internal pure returns (string memory) {\n return readString(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\n require(_in.length <= 33, 'Invalid RLP bytes32 value.');\n\n (\n uint256 itemOffset,\n uint256 itemLength,\n RLPItemType itemType\n ) = _decodeLength(_in);\n\n require(itemType == RLPItemType.DATA_ITEM, 'Invalid RLP bytes32 value.');\n\n uint256 ptr = _in.ptr + itemOffset;\n bytes32 out;\n assembly {\n out := mload(ptr)\n\n // Shift the bytes over to match the item size.\n if lt(itemLength, 32) {\n out := div(out, exp(256, sub(32, itemLength)))\n }\n }\n\n return out;\n }\n\n /**\n * Reads an RLP bytes32 value into a bytes32.\n * @param _in RLP bytes32 value.\n * @return Decoded bytes32.\n */\n function readBytes32(bytes memory _in) internal pure returns (bytes32) {\n return readBytes32(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(RLPItem memory _in) internal pure returns (uint256) {\n return uint256(readBytes32(_in));\n }\n\n /**\n * Reads an RLP uint256 value into a uint256.\n * @param _in RLP uint256 value.\n * @return Decoded uint256.\n */\n function readUint256(bytes memory _in) internal pure returns (uint256) {\n return readUint256(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(RLPItem memory _in) internal pure returns (bool) {\n require(_in.length == 1, 'Invalid RLP boolean value.');\n\n uint256 ptr = _in.ptr;\n uint256 out;\n assembly {\n out := byte(0, mload(ptr))\n }\n\n require(\n out == 0 || out == 1,\n 'Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1'\n );\n\n return out != 0;\n }\n\n /**\n * Reads an RLP bool value into a bool.\n * @param _in RLP bool value.\n * @return Decoded bool.\n */\n function readBool(bytes memory _in) internal pure returns (bool) {\n return readBool(toRLPItem(_in));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(RLPItem memory _in) internal pure returns (address) {\n if (_in.length == 1) {\n return address(0);\n }\n\n require(_in.length == 21, 'Invalid RLP address value.');\n\n return address(uint160(readUint256(_in)));\n }\n\n /**\n * Reads an RLP address value into a address.\n * @param _in RLP address value.\n * @return Decoded address.\n */\n function readAddress(bytes memory _in) internal pure returns (address) {\n return readAddress(toRLPItem(_in));\n }\n\n /**\n * Reads the raw bytes of an RLP item.\n * @param _in RLP item to read.\n * @return Raw RLP bytes.\n */\n function readRawBytes(RLPItem memory _in)\n internal\n pure\n returns (bytes memory)\n {\n return _copy(_in);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Decodes the length of an RLP item.\n * @param _in RLP item to decode.\n * @return Offset of the encoded data.\n * @return Length of the encoded data.\n * @return RLP item type (LIST_ITEM or DATA_ITEM).\n */\n function _decodeLength(RLPItem memory _in)\n private\n pure\n returns (\n uint256,\n uint256,\n RLPItemType\n )\n {\n require(_in.length > 0, 'RLP item cannot be null.');\n\n uint256 ptr = _in.ptr;\n uint256 prefix;\n assembly {\n prefix := byte(0, mload(ptr))\n }\n\n if (prefix <= 0x7f) {\n // Single byte.\n\n return (0, 1, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xb7) {\n // Short string.\n\n uint256 strLen = prefix - 0x80;\n\n require(_in.length > strLen, 'Invalid RLP short string.');\n\n return (1, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xbf) {\n // Long string.\n uint256 lenOfStrLen = prefix - 0xb7;\n\n require(_in.length > lenOfStrLen, 'Invalid RLP long string length.');\n\n uint256 strLen;\n assembly {\n // Pick out the string length.\n strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\n }\n\n require(_in.length > lenOfStrLen + strLen, 'Invalid RLP long string.');\n\n return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\n } else if (prefix <= 0xf7) {\n // Short list.\n uint256 listLen = prefix - 0xc0;\n\n require(_in.length > listLen, 'Invalid RLP short list.');\n\n return (1, listLen, RLPItemType.LIST_ITEM);\n } else {\n // Long list.\n uint256 lenOfListLen = prefix - 0xf7;\n\n require(_in.length > lenOfListLen, 'Invalid RLP long list length.');\n\n uint256 listLen;\n assembly {\n // Pick out the list length.\n listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\n }\n\n require(_in.length > lenOfListLen + listLen, 'Invalid RLP long list.');\n\n return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\n }\n }\n\n /**\n * Copies the bytes from a memory location.\n * @param _src Pointer to the location to read from.\n * @param _offset Offset to start reading from.\n * @param _length Number of bytes to read.\n * @return Copied bytes.\n */\n function _copy(\n uint256 _src,\n uint256 _offset,\n uint256 _length\n ) private pure returns (bytes memory) {\n bytes memory out = new bytes(_length);\n if (out.length == 0) {\n return out;\n }\n\n uint256 src = _src + _offset;\n uint256 dest;\n assembly {\n dest := add(out, 32)\n }\n\n // Copy over as many complete words as we can.\n for (uint256 i = 0; i < _length / 32; i++) {\n assembly {\n mstore(dest, mload(src))\n }\n\n src += 32;\n dest += 32;\n }\n\n // Pick out the remaining bytes.\n uint256 mask;\n unchecked {\n mask = 256**(32 - (_length % 32)) - 1;\n }\n\n assembly {\n mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\n }\n return out;\n }\n\n /**\n * Copies an RLP item into bytes.\n * @param _in RLP item to copy.\n * @return Copied bytes.\n */\n function _copy(RLPItem memory _in) private pure returns (bytes memory) {\n return _copy(_in.ptr, 0, _in.length);\n }\n}\n" ++ }, ++ "contracts/libraries/rlp/Lib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_RLPWriter\n * @author Bakaoh (with modifications)\n */\nlibrary Lib_RLPWriter {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * RLP encodes a byte string.\n * @param _in The byte string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\n bytes memory encoded;\n\n if (_in.length == 1 && uint8(_in[0]) < 128) {\n encoded = _in;\n } else {\n encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\n }\n\n return encoded;\n }\n\n /**\n * RLP encodes a list of RLP encoded byte byte strings.\n * @param _in The list of RLP encoded byte strings.\n * @return The RLP encoded list of items in bytes.\n */\n function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\n bytes memory list = _flatten(_in);\n return abi.encodePacked(_writeLength(list.length, 192), list);\n }\n\n /**\n * RLP encodes a string.\n * @param _in The string to encode.\n * @return The RLP encoded string in bytes.\n */\n function writeString(string memory _in) internal pure returns (bytes memory) {\n return writeBytes(bytes(_in));\n }\n\n /**\n * RLP encodes an address.\n * @param _in The address to encode.\n * @return The RLP encoded address in bytes.\n */\n function writeAddress(address _in) internal pure returns (bytes memory) {\n return writeBytes(abi.encodePacked(_in));\n }\n\n /**\n * RLP encodes a uint.\n * @param _in The uint256 to encode.\n * @return The RLP encoded uint256 in bytes.\n */\n function writeUint(uint256 _in) internal pure returns (bytes memory) {\n return writeBytes(_toBinary(_in));\n }\n\n /**\n * RLP encodes a bool.\n * @param _in The bool to encode.\n * @return The RLP encoded bool in bytes.\n */\n function writeBool(bool _in) internal pure returns (bytes memory) {\n bytes memory encoded = new bytes(1);\n encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\n return encoded;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\n * @param _len The length of the string or the payload.\n * @param _offset 128 if item is string, 192 if item is list.\n * @return RLP encoded bytes.\n */\n function _writeLength(uint256 _len, uint256 _offset)\n private\n pure\n returns (bytes memory)\n {\n bytes memory encoded;\n\n if (_len < 56) {\n encoded = new bytes(1);\n encoded[0] = bytes1(uint8(_len) + uint8(_offset));\n } else {\n uint256 lenLen;\n uint256 i = 1;\n while (_len / i != 0) {\n lenLen++;\n i *= 256;\n }\n\n encoded = new bytes(lenLen + 1);\n encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\n for (i = 1; i <= lenLen; i++) {\n encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\n }\n }\n\n return encoded;\n }\n\n /**\n * Encode integer in big endian binary form with no leading zeroes.\n * @notice TODO: This should be optimized with assembly to save gas costs.\n * @param _x The integer to encode.\n * @return RLP encoded bytes.\n */\n function _toBinary(uint256 _x) private pure returns (bytes memory) {\n bytes memory b = abi.encodePacked(_x);\n\n uint256 i = 0;\n for (; i < 32; i++) {\n if (b[i] != 0) {\n break;\n }\n }\n\n bytes memory res = new bytes(32 - i);\n for (uint256 j = 0; j < res.length; j++) {\n res[j] = b[i++];\n }\n\n return res;\n }\n\n /**\n * Copies a piece of memory to another location.\n * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\n * @param _dest Destination location.\n * @param _src Source location.\n * @param _len Length of memory to copy.\n */\n function _memcpy(\n uint256 _dest,\n uint256 _src,\n uint256 _len\n ) private pure {\n uint256 dest = _dest;\n uint256 src = _src;\n uint256 len = _len;\n\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n uint256 mask;\n unchecked {\n mask = 256**(32 - len) - 1;\n }\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n }\n\n /**\n * Flattens a list of byte strings into one byte string.\n * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\n * @param _list List of byte strings to flatten.\n * @return The flattened byte string.\n */\n function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\n if (_list.length == 0) {\n return new bytes(0);\n }\n\n uint256 len;\n uint256 i = 0;\n for (; i < _list.length; i++) {\n len += _list[i].length;\n }\n\n bytes memory flattened = new bytes(len);\n uint256 flattenedPtr;\n assembly {\n flattenedPtr := add(flattened, 0x20)\n }\n\n for (i = 0; i < _list.length; i++) {\n bytes memory item = _list[i];\n\n uint256 listPtr;\n assembly {\n listPtr := add(item, 0x20)\n }\n\n _memcpy(flattenedPtr, listPtr, item.length);\n flattenedPtr += _list[i].length;\n }\n\n return flattened;\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_BytesUtils\n */\nlibrary Lib_BytesUtils {\n /**********************\n * Internal Functions *\n **********************/\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) internal pure returns (bytes memory) {\n require(_length + 31 >= _length, 'slice_overflow');\n require(_start + _length >= _start, 'slice_overflow');\n require(_bytes.length >= _start + _length, 'slice_outOfBounds');\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(\n add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))),\n _start\n )\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function slice(bytes memory _bytes, uint256 _start)\n internal\n pure\n returns (bytes memory)\n {\n if (_start >= _bytes.length) {\n return bytes('');\n }\n\n return slice(_bytes, _start, _bytes.length - _start);\n }\n\n function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\n if (_bytes.length < 32) {\n bytes32 ret;\n assembly {\n ret := mload(add(_bytes, 32))\n }\n return ret;\n }\n\n return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\n }\n\n function toUint256(bytes memory _bytes) internal pure returns (uint256) {\n return uint256(toBytes32(_bytes));\n }\n\n function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\n bytes memory nibbles = new bytes(_bytes.length * 2);\n\n for (uint256 i = 0; i < _bytes.length; i++) {\n nibbles[i * 2] = _bytes[i] >> 4;\n nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\n }\n\n return nibbles;\n }\n\n function fromNibbles(bytes memory _bytes)\n internal\n pure\n returns (bytes memory)\n {\n bytes memory ret = new bytes(_bytes.length / 2);\n\n for (uint256 i = 0; i < ret.length; i++) {\n ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\n }\n\n return ret;\n }\n\n function equal(bytes memory _bytes, bytes memory _other)\n internal\n pure\n returns (bool)\n {\n return keccak256(_bytes) == keccak256(_other);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Byte32Utils\n */\nlibrary Lib_Bytes32Utils {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \"true.\"\n * @param _in Input bytes32 value.\n * @return Bytes32 as a boolean.\n */\n function toBool(bytes32 _in) internal pure returns (bool) {\n return _in != 0;\n }\n\n /**\n * Converts a boolean to a bytes32 value.\n * @param _in Input boolean value.\n * @return Boolean as a bytes32.\n */\n function fromBool(bool _in) internal pure returns (bytes32) {\n return bytes32(uint256(_in ? 1 : 0));\n }\n\n /**\n * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\n * @param _in Input bytes32 value.\n * @return Bytes32 as an address.\n */\n function toAddress(bytes32 _in) internal pure returns (address) {\n return address(uint160(uint256(_in)));\n }\n\n /**\n * Converts an address to a bytes32.\n * @param _in Input address value.\n * @return Address as a bytes32.\n */\n function fromAddress(address _in) internal pure returns (bytes32) {\n return bytes32(uint256(uint160(_in)));\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1MultiMessageRelayer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.7.5;\npragma experimental ABIEncoderV2;\n\n/* Interface Imports */\nimport {IL1CrossDomainMessenger} from './IL1CrossDomainMessenger.sol';\n\n/* Library Imports */\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\n\n/**\n * @title L1MultiMessageRelayer\n * @dev The L1 Multi-Message Relayer contract is a gas efficiency optimization which enables the\n * relayer to submit multiple messages in a single transaction to be relayed by the L1 Cross Domain\n * Message Sender.\n *\n * Compiler used: solc\n * Runtime target: EVM\n */\ncontract L1MultiMessageRelayer is Lib_AddressResolver {\n /***************\n * Structure *\n ***************/\n\n struct L2ToL1Message {\n address target;\n address sender;\n bytes message;\n uint256 messageNonce;\n IL1CrossDomainMessenger.L2MessageInclusionProof proof;\n }\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n {}\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyBatchRelayer() {\n require(\n msg.sender == resolve('L2BatchMessageRelayer'),\n // solhint-disable-next-line max-line-length\n 'L1MultiMessageRelayer: Function can only be called by the L2BatchMessageRelayer'\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @notice Forwards multiple cross domain messages to the L1 Cross Domain Messenger for relaying\n * @param _messages An array of L2 to L1 messages\n */\n function batchRelayMessages(L2ToL1Message[] calldata _messages)\n external\n onlyBatchRelayer\n {\n IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(\n resolve('Proxy__L1CrossDomainMessenger')\n );\n\n for (uint256 i = 0; i < _messages.length; i++) {\n L2ToL1Message memory message = _messages[i];\n messenger.relayMessage(\n message.target,\n message.sender,\n message.message,\n message.messageNonce,\n message.proof\n );\n }\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressResolver.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\n\n/**\n * @title Lib_AddressResolver\n */\nabstract contract Lib_AddressResolver {\n /*************\n * Variables *\n *************/\n\n Lib_AddressManager public libAddressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n */\n constructor(address _libAddressManager) {\n libAddressManager = Lib_AddressManager(_libAddressManager);\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Resolves the address associated with a given name.\n * @param _name Name to resolve an address for.\n * @return Address associated with the given name.\n */\n function resolve(string memory _name) public view returns (address) {\n return libAddressManager.getAddress(_name);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_AddressManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\n\n/**\n * @title Lib_AddressManager\n */\ncontract Lib_AddressManager is Ownable {\n /**********\n * Events *\n **********/\n\n event AddressSet(\n string indexed _name,\n address _newAddress,\n address _oldAddress\n );\n\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => address) private addresses;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Changes the address associated with a particular name.\n * @param _name String name to associate an address with.\n * @param _address Address to associate with the name.\n */\n function setAddress(string memory _name, address _address)\n external\n onlyOwner\n {\n bytes32 nameHash = _getNameHash(_name);\n address oldAddress = addresses[nameHash];\n addresses[nameHash] = _address;\n\n emit AddressSet(_name, _address, oldAddress);\n }\n\n /**\n * Retrieves the address associated with a given name.\n * @param _name Name to retrieve an address for.\n * @return Address associated with the given name.\n */\n function getAddress(string memory _name) external view returns (address) {\n return addresses[_getNameHash(_name)];\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Computes the hash of a name.\n * @param _name Name to compute a hash for.\n * @return Hash of the given name.\n */\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(_name));\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/access/Ownable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Context.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" ++ }, ++ "contracts/L1/verification/BondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport {IBondManager} from './IBondManager.sol';\n\n/* Contract Imports */\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\n\n/**\n * @title BondManager\n * @dev This contract is, for now, a stub of the \"real\" BondManager that does nothing but\n * allow the \"OVM_Proposer\" to submit state root batches.\n *\n * Runtime target: EVM\n */\ncontract BondManager is IBondManager, Lib_AddressResolver {\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(address _libAddressManager)\n Lib_AddressResolver(_libAddressManager)\n {}\n\n /**\n * Checks whether a given address is properly collateralized and can perform actions within\n * the system.\n * @param _who Address to check.\n * @return true if the address is properly collateralized, false otherwise.\n */\n function isCollateralized(address _who) public view returns (bool) {\n // Only authenticate sequencer to submit state root batches.\n return _who == resolve('OVM_Proposer');\n }\n}\n" ++ }, ++ "contracts/L1/verification/IBondManager.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IBondManager\n */\ninterface IBondManager {\n /********************\n * Public Functions *\n ********************/\n\n function isCollateralized(address _who) external view returns (bool);\n}\n" ++ }, ++ "contracts/L1/rollup/StateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\nimport {Lib_MerkleTree} from '../../libraries/utils/Lib_MerkleTree.sol';\n\n/* Interface Imports */\nimport {IStateCommitmentChain} from './IStateCommitmentChain.sol';\nimport {ICanonicalTransactionChain} from './ICanonicalTransactionChain.sol';\nimport {IBondManager} from '../verification/IBondManager.sol';\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\n\n/**\n * @title StateCommitmentChain\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\n * state root calculated off-chain by applying the canonical transactions one by one.\n *\n * Runtime target: EVM\n */\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\n /*************\n * Constants *\n *************/\n\n uint256 public FRAUD_PROOF_WINDOW;\n uint256 public SEQUENCER_PUBLISH_WINDOW;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n constructor(\n address _libAddressManager,\n uint256 _fraudProofWindow,\n uint256 _sequencerPublishWindow\n ) Lib_AddressResolver(_libAddressManager) {\n FRAUD_PROOF_WINDOW = _fraudProofWindow;\n SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve('ChainStorageContainer-SCC-batches'));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function getLastSequencerTimestamp()\n public\n view\n returns (uint256 _lastSequencerTimestamp)\n {\n (, uint40 lastSequencerTimestamp) = _getBatchExtraData();\n return uint256(lastSequencerTimestamp);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function appendStateBatch(\n bytes32[] memory _batch,\n uint256 _shouldStartAtElement\n ) public {\n // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\n // publication of batches by some other user.\n require(\n _shouldStartAtElement == getTotalElements(),\n 'Actual batch start index does not match expected start index.'\n );\n\n // Proposers must have previously staked at the BondManager\n require(\n IBondManager(resolve('BondManager')).isCollateralized(msg.sender),\n 'Proposer does not have enough collateral posted'\n );\n\n require(_batch.length > 0, 'Cannot submit an empty state batch.');\n\n require(\n getTotalElements() + _batch.length <=\n ICanonicalTransactionChain(resolve('CanonicalTransactionChain'))\n .getTotalElements(),\n 'Number of state roots cannot exceed the number of canonical transactions.'\n );\n\n // Pass the block's timestamp and the publisher of the data\n // to be used in the fraud proofs\n _appendBatch(_batch, abi.encode(block.timestamp, msg.sender));\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n public\n {\n require(\n msg.sender == resolve('OVM_FraudVerifier'),\n 'State batches can only be deleted by the OVM_FraudVerifier.'\n );\n\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\n\n require(\n insideFraudProofWindow(_batchHeader),\n 'State batches can only be deleted within the fraud proof window.'\n );\n\n _deleteBatch(_batchHeader);\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) public view returns (bool) {\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\n\n require(\n Lib_MerkleTree.verify(\n _batchHeader.batchRoot,\n _element,\n _proof.index,\n _proof.siblings,\n _batchHeader.batchSize\n ),\n 'Invalid inclusion proof.'\n );\n\n return true;\n }\n\n /**\n * @inheritdoc IStateCommitmentChain\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n ) public view returns (bool _inside) {\n (uint256 timestamp, ) = abi.decode(\n _batchHeader.extraData,\n (uint256, address)\n );\n\n require(timestamp != 0, 'Batch header timestamp cannot be zero');\n return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Timestamp of the last batch submitted by the sequencer.\n */\n function _getBatchExtraData() internal view returns (uint40, uint40) {\n bytes27 extraData = batches().getGlobalMetadata();\n\n // solhint-disable max-line-length\n uint40 totalElements;\n uint40 lastSequencerTimestamp;\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n lastSequencerTimestamp := shr(\n 40,\n and(\n extraData,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, lastSequencerTimestamp);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _lastSequencerTimestamp\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _lastSequencerTimestamp))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Appends a batch to the chain.\n * @param _batch Elements within the batch.\n * @param _extraData Any extra data to append to the batch.\n */\n function _appendBatch(bytes32[] memory _batch, bytes memory _extraData)\n internal\n {\n address sequencer = resolve('OVM_Proposer');\n (\n uint40 totalElements,\n uint40 lastSequencerTimestamp\n ) = _getBatchExtraData();\n\n if (msg.sender == sequencer) {\n lastSequencerTimestamp = uint40(block.timestamp);\n } else {\n // We keep track of the last batch submitted by the sequencer so there's a window in\n // which only the sequencer can publish state roots. A window like this just reduces\n // the chance of \"system breaking\" state roots being published while we're still in\n // testing mode. This window should be removed or significantly reduced in the future.\n require(\n lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\n 'Cannot publish state roots within the sequencer publication window.'\n );\n }\n\n // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\n // while calculating the root hash therefore any arguments passed to it must not\n // be used again afterwards\n Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec\n .ChainBatchHeader({\n batchIndex: getTotalBatches(),\n batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\n batchSize: _batch.length,\n prevTotalElements: totalElements,\n extraData: _extraData\n });\n\n emit StateBatchAppended(\n batchHeader.batchIndex,\n batchHeader.batchRoot,\n batchHeader.batchSize,\n batchHeader.prevTotalElements,\n batchHeader.extraData\n );\n\n batches().push(\n Lib_OVMCodec.hashBatchHeader(batchHeader),\n _makeBatchExtraData(\n uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\n lastSequencerTimestamp\n )\n );\n }\n\n /**\n * Removes a batch and all subsequent batches from the chain.\n * @param _batchHeader Header of the batch to remove.\n */\n function _deleteBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n internal\n {\n require(\n _batchHeader.batchIndex < batches().length(),\n 'Invalid batch index.'\n );\n\n require(_isValidBatchHeader(_batchHeader), 'Invalid batch header.');\n\n batches().deleteElementsAfterInclusive(\n _batchHeader.batchIndex,\n _makeBatchExtraData(uint40(_batchHeader.prevTotalElements), 0)\n );\n\n emit StateBatchDeleted(_batchHeader.batchIndex, _batchHeader.batchRoot);\n }\n\n /**\n * Checks that a batch header matches the stored hash for the given index.\n * @param _batchHeader Batch header to validate.\n * @return Whether or not the header matches the stored one.\n */\n function _isValidBatchHeader(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n ) internal view returns (bool) {\n return\n Lib_OVMCodec.hashBatchHeader(_batchHeader) ==\n batches().get(_batchHeader.batchIndex);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_MerkleTree\n * @author River Keefer\n */\nlibrary Lib_MerkleTree {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Calculates a merkle root for a list of 32-byte leaf hashes. WARNING: If the number\n * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\n * If you do not know the original length of elements for the tree you are verifying, then\n * this may allow empty leaves past _elements.length to pass a verification check down the line.\n * Note that the _elements argument is modified, therefore it must not be used again afterwards\n * @param _elements Array of hashes from which to generate a merkle root.\n * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\n */\n function getMerkleRoot(bytes32[] memory _elements)\n internal\n pure\n returns (bytes32)\n {\n require(\n _elements.length > 0,\n 'Lib_MerkleTree: Must provide at least one leaf hash.'\n );\n\n if (_elements.length == 1) {\n return _elements[0];\n }\n\n uint256[16] memory defaults = [\n 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\n 0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\n 0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\n 0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\n 0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\n 0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\n 0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\n 0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\n 0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\n 0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\n 0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\n 0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\n 0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\n 0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\n 0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\n 0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\n ];\n\n // Reserve memory space for our hashes.\n bytes memory buf = new bytes(64);\n\n // We'll need to keep track of left and right siblings.\n bytes32 leftSibling;\n bytes32 rightSibling;\n\n // Number of non-empty nodes at the current depth.\n uint256 rowSize = _elements.length;\n\n // Current depth, counting from 0 at the leaves\n uint256 depth = 0;\n\n // Common sub-expressions\n uint256 halfRowSize; // rowSize / 2\n bool rowSizeIsOdd; // rowSize % 2 == 1\n\n while (rowSize > 1) {\n halfRowSize = rowSize / 2;\n rowSizeIsOdd = rowSize % 2 == 1;\n\n for (uint256 i = 0; i < halfRowSize; i++) {\n leftSibling = _elements[(2 * i)];\n rightSibling = _elements[(2 * i) + 1];\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[i] = keccak256(buf);\n }\n\n if (rowSizeIsOdd) {\n leftSibling = _elements[rowSize - 1];\n rightSibling = bytes32(defaults[depth]);\n assembly {\n mstore(add(buf, 32), leftSibling)\n mstore(add(buf, 64), rightSibling)\n }\n\n _elements[halfRowSize] = keccak256(buf);\n }\n\n rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\n depth++;\n }\n\n return _elements[0];\n }\n\n /**\n * Verifies a merkle branch for the given leaf hash. Assumes the original length\n * of leaves generated is a known, correct input, and does not return true for indices\n * extending past that index (even if _siblings would be otherwise valid.)\n * @param _root The Merkle root to verify against.\n * @param _leaf The leaf hash to verify inclusion of.\n * @param _index The index in the tree of this leaf.\n * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\n * (bottom of the tree).\n * @param _totalLeaves The total number of leaves originally passed into.\n * @return Whether or not the merkle branch and leaf passes verification.\n */\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) internal pure returns (bool) {\n require(\n _totalLeaves > 0,\n 'Lib_MerkleTree: Total leaves must be greater than zero.'\n );\n\n require(_index < _totalLeaves, 'Lib_MerkleTree: Index out of bounds.');\n\n require(\n _siblings.length == _ceilLog2(_totalLeaves),\n 'Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.'\n );\n\n bytes32 computedRoot = _leaf;\n\n for (uint256 i = 0; i < _siblings.length; i++) {\n if ((_index & 1) == 1) {\n computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\n } else {\n computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\n }\n\n _index >>= 1;\n }\n\n return _root == computedRoot;\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Calculates the integer ceiling of the log base 2 of an input.\n * @param _in Unsigned input to calculate the log.\n * @return ceil(log_base_2(_in))\n */\n function _ceilLog2(uint256 _in) private pure returns (uint256) {\n require(_in > 0, 'Lib_MerkleTree: Cannot compute ceil(log_2) of 0.');\n\n if (_in == 1) {\n return 0;\n }\n\n // Find the highest set bit (will be floor(log_2)).\n // Borrowed with <3 from https://github.com/ethereum/solidity-examples\n uint256 val = _in;\n uint256 highest = 0;\n for (uint256 i = 128; i >= 1; i >>= 1) {\n if (val & (((uint256(1) << i) - 1) << i) != 0) {\n highest += i;\n val >>= i;\n }\n }\n\n // Increment by one if this is not a perfect logarithm.\n if ((uint256(1) << highest) != _in) {\n highest += 1;\n }\n\n return highest;\n }\n}\n" ++ }, ++ "contracts/L1/rollup/IStateCommitmentChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\n\n/**\n * @title IStateCommitmentChain\n */\ninterface IStateCommitmentChain {\n /**********\n * Events *\n **********/\n\n event StateBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Retrieves the timestamp of the last batch submitted by the sequencer.\n * @return _lastSequencerTimestamp Last sequencer batch timestamp.\n */\n function getLastSequencerTimestamp()\n external\n view\n returns (uint256 _lastSequencerTimestamp);\n\n /**\n * Appends a batch of state roots to the chain.\n * @param _batch Batch of state roots.\n * @param _shouldStartAtElement Index of the element at which this batch should start.\n */\n function appendStateBatch(\n bytes32[] calldata _batch,\n uint256 _shouldStartAtElement\n ) external;\n\n /**\n * Deletes all state roots after (and including) a given batch.\n * @param _batchHeader Header of the batch to start deleting from.\n */\n function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\n external;\n\n /**\n * Verifies a batch inclusion proof.\n * @param _element Hash of the element to verify a proof for.\n * @param _batchHeader Header of the batch in which the element was included.\n * @param _proof Merkle inclusion proof for the element.\n */\n function verifyStateCommitment(\n bytes32 _element,\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\n Lib_OVMCodec.ChainInclusionProof memory _proof\n ) external view returns (bool _verified);\n\n /**\n * Checks whether a given batch is still inside its fraud proof window.\n * @param _batchHeader Header of the batch to check.\n * @return _inside Whether or not the batch is inside the fraud proof window.\n */\n function insideFraudProofWindow(\n Lib_OVMCodec.ChainBatchHeader memory _batchHeader\n ) external view returns (bool _inside);\n}\n" ++ }, ++ "contracts/L1/rollup/ICanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Library Imports */\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\n\n/* Interface Imports */\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\n\n/**\n * @title ICanonicalTransactionChain\n */\ninterface ICanonicalTransactionChain {\n /**********\n * Events *\n **********/\n\n event L2GasParamsUpdated(\n uint256 l2GasDiscountDivisor,\n uint256 enqueueGasCost,\n uint256 enqueueL2GasPrepaid\n );\n\n event TransactionEnqueued(\n address indexed _l1TxOrigin,\n address indexed _target,\n uint256 _gasLimit,\n bytes _data,\n uint256 indexed _queueIndex,\n uint256 _timestamp\n );\n\n event QueueBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event SequencerBatchAppended(\n uint256 _startingQueueIndex,\n uint256 _numQueueElements,\n uint256 _totalElements\n );\n\n event TransactionBatchAppended(\n uint256 indexed _batchIndex,\n bytes32 _batchRoot,\n uint256 _batchSize,\n uint256 _prevTotalElements,\n bytes _extraData\n );\n\n /***********\n * Structs *\n ***********/\n\n struct BatchContext {\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 timestamp;\n uint256 blockNumber;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() external view returns (IChainStorageContainer);\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() external view returns (IChainStorageContainer);\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() external view returns (uint256 _totalElements);\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() external view returns (uint256 _totalBatches);\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() external view returns (uint40);\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n external\n view\n returns (Lib_OVMCodec.QueueElement memory _element);\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() external view returns (uint40);\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() external view returns (uint40);\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() external view returns (uint40);\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() external view returns (uint40);\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target contract to send the transaction to.\n * @param _gasLimit Gas limit for the given transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external;\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch(\n // uint40 _shouldStartAtElement,\n // uint24 _totalElementsToAppend,\n // BatchContext[] _contexts,\n // bytes[] _transactionDataFields\n ) external;\n}\n" ++ }, ++ "contracts/L1/rollup/IChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IChainStorageContainer\n */\ninterface IChainStorageContainer {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Sets the container's global metadata field. We're using `bytes27` here because we use five\n * bytes to maintain the length of the underlying data structure, meaning we have an extra\n * 27 bytes to store arbitrary data.\n * @param _globalMetadata New global metadata to set.\n */\n function setGlobalMetadata(bytes27 _globalMetadata) external;\n\n /**\n * Retrieves the container's global metadata field.\n * @return Container global metadata field.\n */\n function getGlobalMetadata() external view returns (bytes27);\n\n /**\n * Retrieves the number of objects stored in the container.\n * @return Number of objects in the container.\n */\n function length() external view returns (uint256);\n\n /**\n * Pushes an object into the container.\n * @param _object A 32 byte value to insert into the container.\n */\n function push(bytes32 _object) external;\n\n /**\n * Pushes an object into the container. Function allows setting the global metadata since\n * we'll need to touch the \"length\" storage slot anyway, which also contains the global\n * metadata (it's an optimization).\n * @param _object A 32 byte value to insert into the container.\n * @param _globalMetadata New global metadata for the container.\n */\n function push(bytes32 _object, bytes27 _globalMetadata) external;\n\n /**\n * Retrieves an object from the container.\n * @param _index Index of the particular object to access.\n * @return 32 byte object value.\n */\n function get(uint256 _index) external view returns (bytes32);\n\n /**\n * Removes all objects after and including a given index.\n * @param _index Object index to delete from.\n */\n function deleteElementsAfterInclusive(uint256 _index) external;\n\n /**\n * Removes all objects after and including a given index. Also allows setting the global\n * metadata field.\n * @param _index Object index to delete from.\n * @param _globalMetadata New global metadata for the container.\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n external;\n}\n" ++ }, ++ "contracts/L1/rollup/ChainStorageContainer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_Buffer} from '../../libraries/utils/Lib_Buffer.sol';\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\n\n/* Interface Imports */\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\n\n/**\n * @title ChainStorageContainer\n * @dev The Chain Storage Container provides its owner contract with read, write and delete\n * functionality. This provides gas efficiency gains by enabling it to overwrite storage slots which\n * can no longer be used in a fraud proof due to the fraud window having passed, and the associated\n * chain state or transactions being finalized.\n * Three distinct Chain Storage Containers will be deployed on Layer 1:\n * 1. Stores transaction batches for the Canonical Transaction Chain\n * 2. Stores queued transactions for the Canonical Transaction Chain\n * 3. Stores chain state batches for the State Commitment Chain\n *\n * Runtime target: EVM\n */\ncontract ChainStorageContainer is IChainStorageContainer, Lib_AddressResolver {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n /*************\n * Variables *\n *************/\n\n string public owner;\n Lib_Buffer.Buffer internal buffer;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n * @param _owner Name of the contract that owns this container (will be resolved later).\n */\n constructor(address _libAddressManager, string memory _owner)\n Lib_AddressResolver(_libAddressManager)\n {\n owner = _owner;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n modifier onlyOwner() {\n require(\n msg.sender == resolve(owner),\n 'ChainStorageContainer: Function can only be called by the owner.'\n );\n _;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function setGlobalMetadata(bytes27 _globalMetadata) public onlyOwner {\n return buffer.setExtraData(_globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function getGlobalMetadata() public view returns (bytes27) {\n return buffer.getExtraData();\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function length() public view returns (uint256) {\n return uint256(buffer.getLength());\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object) public onlyOwner {\n buffer.push(_object);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function push(bytes32 _object, bytes27 _globalMetadata) public onlyOwner {\n buffer.push(_object, _globalMetadata);\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function get(uint256 _index) public view returns (bytes32) {\n return buffer.get(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index) public onlyOwner {\n buffer.deleteElementsAfterInclusive(uint40(_index));\n }\n\n /**\n * @inheritdoc IChainStorageContainer\n */\n function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata)\n public\n onlyOwner\n {\n buffer.deleteElementsAfterInclusive(uint40(_index), _globalMetadata);\n }\n}\n" ++ }, ++ "contracts/libraries/utils/Lib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_Buffer\n * @dev This library implements a bytes32 storage array with some additional gas-optimized\n * functionality. In particular, it encodes its length as a uint40, and tightly packs this with an\n * overwritable \"extra data\" field so we can store more information with a single SSTORE.\n */\nlibrary Lib_Buffer {\n /*************\n * Libraries *\n *************/\n\n using Lib_Buffer for Buffer;\n\n /***********\n * Structs *\n ***********/\n\n struct Buffer {\n bytes32 context;\n mapping(uint256 => bytes32) buf;\n }\n\n struct BufferContext {\n // Stores the length of the array. Uint40 is way more elements than we'll ever reasonably\n // need in an array and we get an extra 27 bytes of extra data to play with.\n uint40 length;\n // Arbitrary extra data that can be modified whenever the length is updated. Useful for\n // squeezing out some gas optimizations.\n bytes27 extraData;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n * @param _extraData Global extra data.\n */\n function push(\n Buffer storage _self,\n bytes32 _value,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.buf[ctx.length] = _value;\n\n // Bump the global index and insert our extra data, then save the context.\n ctx.length++;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Pushes a single element to the buffer.\n * @param _self Buffer to access.\n * @param _value Value to push to the buffer.\n */\n function push(Buffer storage _self, bytes32 _value) internal {\n BufferContext memory ctx = _self.getContext();\n\n _self.push(_value, ctx.extraData);\n }\n\n /**\n * Retrieves an element from the buffer.\n * @param _self Buffer to access.\n * @param _index Element index to retrieve.\n * @return Value of the element at the given index.\n */\n function get(Buffer storage _self, uint256 _index)\n internal\n view\n returns (bytes32)\n {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, 'Index out of bounds.');\n\n return _self.buf[_index];\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n * @param _extraData Optional global extra data.\n */\n function deleteElementsAfterInclusive(\n Buffer storage _self,\n uint40 _index,\n bytes27 _extraData\n ) internal {\n BufferContext memory ctx = _self.getContext();\n\n require(_index < ctx.length, 'Index out of bounds.');\n\n // Set our length and extra data, save the context.\n ctx.length = _index;\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Deletes all elements after (and including) a given index.\n * @param _self Buffer to access.\n * @param _index Index of the element to delete from (inclusive).\n */\n function deleteElementsAfterInclusive(Buffer storage _self, uint40 _index)\n internal\n {\n BufferContext memory ctx = _self.getContext();\n _self.deleteElementsAfterInclusive(_index, ctx.extraData);\n }\n\n /**\n * Retrieves the current global index.\n * @param _self Buffer to access.\n * @return Current global index.\n */\n function getLength(Buffer storage _self) internal view returns (uint40) {\n BufferContext memory ctx = _self.getContext();\n return ctx.length;\n }\n\n /**\n * Changes current global extra data.\n * @param _self Buffer to access.\n * @param _extraData New global extra data.\n */\n function setExtraData(Buffer storage _self, bytes27 _extraData) internal {\n BufferContext memory ctx = _self.getContext();\n ctx.extraData = _extraData;\n _self.setContext(ctx);\n }\n\n /**\n * Retrieves the current global extra data.\n * @param _self Buffer to access.\n * @return Current global extra data.\n */\n function getExtraData(Buffer storage _self) internal view returns (bytes27) {\n BufferContext memory ctx = _self.getContext();\n return ctx.extraData;\n }\n\n /**\n * Sets the current buffer context.\n * @param _self Buffer to access.\n * @param _ctx Current buffer context.\n */\n function setContext(Buffer storage _self, BufferContext memory _ctx)\n internal\n {\n bytes32 context;\n uint40 length = _ctx.length;\n bytes27 extraData = _ctx.extraData;\n assembly {\n context := length\n context := or(context, extraData)\n }\n\n if (_self.context != context) {\n _self.context = context;\n }\n }\n\n /**\n * Retrieves the current buffer context.\n * @param _self Buffer to access.\n * @return Current buffer context.\n */\n function getContext(Buffer storage _self)\n internal\n view\n returns (BufferContext memory)\n {\n bytes32 context = _self.context;\n uint40 length;\n bytes27 extraData;\n assembly {\n // solhint-disable-next-line max-line-length\n length := and(\n context,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n // solhint-disable-next-line max-line-length\n extraData := and(\n context,\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000\n )\n }\n\n return BufferContext({length: length, extraData: extraData});\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Buffer.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_Buffer} from '../../libraries/utils/Lib_Buffer.sol';\n\n/**\n * @title TestLib_Buffer\n */\ncontract TestLib_Buffer {\n using Lib_Buffer for Lib_Buffer.Buffer;\n\n Lib_Buffer.Buffer internal buf;\n\n function push(bytes32 _value, bytes27 _extraData) public {\n buf.push(_value, _extraData);\n }\n\n function get(uint256 _index) public view returns (bytes32) {\n return buf.get(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index) public {\n return buf.deleteElementsAfterInclusive(_index);\n }\n\n function deleteElementsAfterInclusive(uint40 _index, bytes27 _extraData)\n public\n {\n return buf.deleteElementsAfterInclusive(_index, _extraData);\n }\n\n function getLength() public view returns (uint40) {\n return buf.getLength();\n }\n\n function setExtraData(bytes27 _extraData) public {\n return buf.setExtraData(_extraData);\n }\n\n function getExtraData() public view returns (bytes27) {\n return buf.getExtraData();\n }\n}\n" ++ }, ++ "contracts/L1/rollup/CanonicalTransactionChain.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\n\n/* Interface Imports */\nimport {ICanonicalTransactionChain} from './ICanonicalTransactionChain.sol';\nimport {IChainStorageContainer} from './IChainStorageContainer.sol';\n\n/**\n * @title CanonicalTransactionChain\n * @dev The Canonical Transaction Chain (CTC) contract is an append-only log of transactions\n * which must be applied to the rollup state. It defines the ordering of rollup transactions by\n * writing them to the 'CTC:batches' instance of the Chain Storage Container.\n * The CTC also allows any account to 'enqueue' an L2 transaction, which will require that the\n * Sequencer will eventually append it to the rollup state.\n *\n * Runtime target: EVM\n */\ncontract CanonicalTransactionChain is\n ICanonicalTransactionChain,\n Lib_AddressResolver\n{\n /*************\n * Constants *\n *************/\n\n // L2 tx gas-related\n uint256 public constant MIN_ROLLUP_TX_GAS = 100000;\n uint256 public constant MAX_ROLLUP_TX_SIZE = 50000;\n\n // The approximate cost of calling the enqueue function\n uint256 public enqueueGasCost;\n // The ratio of the cost of L1 gas to the cost of L2 gas\n uint256 public l2GasDiscountDivisor;\n // The amount of L2 gas which can be forwarded to L2 without spam prevention via 'gas burn'.\n // Calculated as the product of l2GasDiscountDivisor * enqueueGasCost.\n // See comments in enqueue() for further detail.\n uint256 public enqueueL2GasPrepaid;\n\n // Encoding-related (all in bytes)\n uint256 internal constant BATCH_CONTEXT_SIZE = 16;\n uint256 internal constant BATCH_CONTEXT_LENGTH_POS = 12;\n uint256 internal constant BATCH_CONTEXT_START_POS = 15;\n uint256 internal constant TX_DATA_HEADER_SIZE = 3;\n uint256 internal constant BYTES_TILL_TX_DATA = 65;\n\n /*************\n * Variables *\n *************/\n\n uint256 public maxTransactionGasLimit;\n\n /***************\n * Queue State *\n ***************/\n\n uint40 private _nextQueueIndex; // index of the first queue element not yet included\n Lib_OVMCodec.QueueElement[] queueElements;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(\n address _libAddressManager,\n uint256 _maxTransactionGasLimit,\n uint256 _l2GasDiscountDivisor,\n uint256 _enqueueGasCost\n ) Lib_AddressResolver(_libAddressManager) {\n maxTransactionGasLimit = _maxTransactionGasLimit;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n enqueueGasCost = _enqueueGasCost;\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Modifier to enforce that, if configured, only the Burn Admin may\n * successfully call a method.\n */\n modifier onlyBurnAdmin() {\n require(\n msg.sender == libAddressManager.owner(),\n 'Only callable by the Burn Admin.'\n );\n _;\n }\n\n /*******************************\n * Authorized Setter Functions *\n *******************************/\n\n /**\n * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\n * The value of enqueueL2GasPrepaid is immediately updated as well.\n */\n function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost)\n external\n onlyBurnAdmin\n {\n enqueueGasCost = _enqueueGasCost;\n l2GasDiscountDivisor = _l2GasDiscountDivisor;\n // See the comment in enqueue() for the rationale behind this formula.\n enqueueL2GasPrepaid = _l2GasDiscountDivisor * _enqueueGasCost;\n\n emit L2GasParamsUpdated(\n l2GasDiscountDivisor,\n enqueueGasCost,\n enqueueL2GasPrepaid\n );\n }\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Accesses the batch storage container.\n * @return Reference to the batch storage container.\n */\n function batches() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve('ChainStorageContainer-CTC-batches'));\n }\n\n /**\n * Accesses the queue storage container.\n * @return Reference to the queue storage container.\n */\n function queue() public view returns (IChainStorageContainer) {\n return IChainStorageContainer(resolve('ChainStorageContainer-CTC-queue'));\n }\n\n /**\n * Retrieves the total number of elements submitted.\n * @return _totalElements Total submitted elements.\n */\n function getTotalElements() public view returns (uint256 _totalElements) {\n (uint40 totalElements, , , ) = _getBatchExtraData();\n return uint256(totalElements);\n }\n\n /**\n * Retrieves the total number of batches submitted.\n * @return _totalBatches Total submitted batches.\n */\n function getTotalBatches() public view returns (uint256 _totalBatches) {\n return batches().length();\n }\n\n /**\n * Returns the index of the next element to be enqueued.\n * @return Index for the next queue element.\n */\n function getNextQueueIndex() public view returns (uint40) {\n return _nextQueueIndex;\n }\n\n /**\n * Returns the timestamp of the last transaction.\n * @return Timestamp for the last transaction.\n */\n function getLastTimestamp() public view returns (uint40) {\n (, , uint40 lastTimestamp, ) = _getBatchExtraData();\n return lastTimestamp;\n }\n\n /**\n * Returns the blocknumber of the last transaction.\n * @return Blocknumber for the last transaction.\n */\n function getLastBlockNumber() public view returns (uint40) {\n (, , , uint40 lastBlockNumber) = _getBatchExtraData();\n return lastBlockNumber;\n }\n\n /**\n * Gets the queue element at a particular index.\n * @param _index Index of the queue element to access.\n * @return _element Queue element at the given index.\n */\n function getQueueElement(uint256 _index)\n public\n view\n returns (Lib_OVMCodec.QueueElement memory _element)\n {\n return queueElements[_index];\n }\n\n /**\n * Get the number of queue elements which have not yet been included.\n * @return Number of pending queue elements.\n */\n function getNumPendingQueueElements() public view returns (uint40) {\n return uint40(queueElements.length) - _nextQueueIndex;\n }\n\n /**\n * Retrieves the length of the queue, including\n * both pending and canonical transactions.\n * @return Length of the queue.\n */\n function getQueueLength() public view returns (uint40) {\n return uint40(queueElements.length);\n }\n\n /**\n * Adds a transaction to the queue.\n * @param _target Target L2 contract to send the transaction to.\n * @param _gasLimit Gas limit for the enqueued L2 transaction.\n * @param _data Transaction data.\n */\n function enqueue(\n address _target,\n uint256 _gasLimit,\n bytes memory _data\n ) external {\n require(\n _data.length <= MAX_ROLLUP_TX_SIZE,\n 'Transaction data size exceeds maximum for rollup transaction.'\n );\n\n require(\n _gasLimit <= maxTransactionGasLimit,\n 'Transaction gas limit exceeds maximum for rollup transaction.'\n );\n\n require(\n _gasLimit >= MIN_ROLLUP_TX_GAS,\n 'Transaction gas limit too low to enqueue.'\n );\n\n // Transactions submitted to the queue lack a method for paying gas fees to the Sequencer.\n // So we need to prevent spam attacks by ensuring that the cost of enqueueing a transaction\n // from L1 to L2 is not underpriced. For transaction with a high L2 gas limit, we do this by\n // burning some extra gas on L1. Of course there is also some intrinsic cost to enqueueing a\n // transaction, so we want to make sure not to over-charge (by burning too much L1 gas).\n // Therefore, we define 'enqueueL2GasPrepaid' as the L2 gas limit above which we must burn\n // additional gas on L1. This threshold is the product of two inputs:\n // 1. enqueueGasCost: the base cost of calling this function.\n // 2. l2GasDiscountDivisor: the ratio between the cost of gas on L1 and L2. This is a\n // positive integer, meaning we assume L2 gas is always less costly.\n // The calculation below for gasToConsume can be seen as converting the difference (between\n // the specified L2 gas limit and the prepaid L2 gas limit) to an L1 gas amount.\n if (_gasLimit > enqueueL2GasPrepaid) {\n uint256 gasToConsume = (_gasLimit - enqueueL2GasPrepaid) /\n l2GasDiscountDivisor;\n uint256 startingGas = gasleft();\n\n // Although this check is not necessary (burn below will run out of gas if not true), it\n // gives the user an explicit reason as to why the enqueue attempt failed.\n require(\n startingGas > gasToConsume,\n 'Insufficient gas for L2 rate limiting burn.'\n );\n\n uint256 i;\n while (startingGas - gasleft() < gasToConsume) {\n i++;\n }\n }\n\n // Apply an aliasing unless msg.sender == tx.origin. This prevents an attack in which a\n // contract on L1 has the same address as a contract on L2 but doesn't have the same code.\n // We can safely ignore this for EOAs because they're guaranteed to have the same \"code\"\n // (i.e. no code at all). This also makes it possible for users to interact with contracts\n // on L2 even when the Sequencer is down.\n address sender;\n if (msg.sender == tx.origin) {\n sender = msg.sender;\n } else {\n sender = AddressAliasHelper.applyL1ToL2Alias(msg.sender);\n }\n\n bytes32 transactionHash = keccak256(\n abi.encode(sender, _target, _gasLimit, _data)\n );\n\n queueElements.push(\n Lib_OVMCodec.QueueElement({\n transactionHash: transactionHash,\n timestamp: uint40(block.timestamp),\n blockNumber: uint40(block.number)\n })\n );\n uint256 queueIndex = queueElements.length - 1;\n emit TransactionEnqueued(\n sender,\n _target,\n _gasLimit,\n _data,\n queueIndex,\n block.timestamp\n );\n }\n\n /**\n * Allows the sequencer to append a batch of transactions.\n * @dev This function uses a custom encoding scheme for efficiency reasons.\n * .param _shouldStartAtElement Specific batch we expect to start appending to.\n * .param _totalElementsToAppend Total number of batch elements we expect to append.\n * .param _contexts Array of batch contexts.\n * .param _transactionDataFields Array of raw transaction data.\n */\n function appendSequencerBatch() external {\n uint40 shouldStartAtElement;\n uint24 totalElementsToAppend;\n uint24 numContexts;\n assembly {\n shouldStartAtElement := shr(216, calldataload(4))\n totalElementsToAppend := shr(232, calldataload(9))\n numContexts := shr(232, calldataload(12))\n }\n\n require(\n shouldStartAtElement == getTotalElements(),\n 'Actual batch start index does not match expected start index.'\n );\n\n require(\n msg.sender == resolve('OVM_Sequencer'),\n 'Function can only be called by the Sequencer.'\n );\n\n uint40 nextTransactionPtr = uint40(\n BATCH_CONTEXT_START_POS + BATCH_CONTEXT_SIZE * numContexts\n );\n\n require(\n msg.data.length >= nextTransactionPtr,\n 'Not enough BatchContexts provided.'\n );\n\n // Counter for number of sequencer transactions appended so far.\n uint32 numSequencerTransactions = 0;\n\n // Cache the _nextQueueIndex storage variable to a temporary stack variable.\n // This is safe as long as nothing reads or writes to the storage variable\n // until it is updated by the temp variable.\n uint40 nextQueueIndex = _nextQueueIndex;\n\n BatchContext memory curContext;\n for (uint32 i = 0; i < numContexts; i++) {\n BatchContext memory nextContext = _getBatchContext(i);\n\n // Now we can update our current context.\n curContext = nextContext;\n\n // Process sequencer transactions first.\n numSequencerTransactions += uint32(curContext.numSequencedTransactions);\n\n // Now process any subsequent queue transactions.\n nextQueueIndex += uint40(curContext.numSubsequentQueueTransactions);\n }\n\n require(\n nextQueueIndex <= queueElements.length,\n 'Attempted to append more elements than are available in the queue.'\n );\n\n // Generate the required metadata that we need to append this batch\n uint40 numQueuedTransactions = totalElementsToAppend -\n numSequencerTransactions;\n uint40 blockTimestamp;\n uint40 blockNumber;\n if (curContext.numSubsequentQueueTransactions == 0) {\n // The last element is a sequencer tx, therefore pull timestamp and block number from\n // the last context.\n blockTimestamp = uint40(curContext.timestamp);\n blockNumber = uint40(curContext.blockNumber);\n } else {\n // The last element is a queue tx, therefore pull timestamp and block number from the\n // queue element.\n // curContext.numSubsequentQueueTransactions > 0 which means that we've processed at\n // least one queue element. We increment nextQueueIndex after processing each queue\n // element, so the index of the last element we processed is nextQueueIndex - 1.\n Lib_OVMCodec.QueueElement memory lastElement = queueElements[\n nextQueueIndex - 1\n ];\n\n blockTimestamp = lastElement.timestamp;\n blockNumber = lastElement.blockNumber;\n }\n\n // Cache the previous blockhash to ensure all transaction data can be retrieved efficiently.\n _appendBatch(\n blockhash(block.number - 1),\n totalElementsToAppend,\n numQueuedTransactions,\n blockTimestamp,\n blockNumber\n );\n\n emit SequencerBatchAppended(\n nextQueueIndex - numQueuedTransactions,\n numQueuedTransactions,\n getTotalElements()\n );\n\n // Update the _nextQueueIndex storage variable.\n _nextQueueIndex = nextQueueIndex;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Returns the BatchContext located at a particular index.\n * @param _index The index of the BatchContext\n * @return The BatchContext at the specified index.\n */\n function _getBatchContext(uint256 _index)\n internal\n pure\n returns (BatchContext memory)\n {\n uint256 contextPtr = 15 + _index * BATCH_CONTEXT_SIZE;\n uint256 numSequencedTransactions;\n uint256 numSubsequentQueueTransactions;\n uint256 ctxTimestamp;\n uint256 ctxBlockNumber;\n\n assembly {\n numSequencedTransactions := shr(232, calldataload(contextPtr))\n numSubsequentQueueTransactions := shr(\n 232,\n calldataload(add(contextPtr, 3))\n )\n ctxTimestamp := shr(216, calldataload(add(contextPtr, 6)))\n ctxBlockNumber := shr(216, calldataload(add(contextPtr, 11)))\n }\n\n return\n BatchContext({\n numSequencedTransactions: numSequencedTransactions,\n numSubsequentQueueTransactions: numSubsequentQueueTransactions,\n timestamp: ctxTimestamp,\n blockNumber: ctxBlockNumber\n });\n }\n\n /**\n * Parses the batch context from the extra data.\n * @return Total number of elements submitted.\n * @return Index of the next queue element.\n */\n function _getBatchExtraData()\n internal\n view\n returns (\n uint40,\n uint40,\n uint40,\n uint40\n )\n {\n bytes27 extraData = batches().getGlobalMetadata();\n\n uint40 totalElements;\n uint40 nextQueueIndex;\n uint40 lastTimestamp;\n uint40 lastBlockNumber;\n\n // solhint-disable max-line-length\n assembly {\n extraData := shr(40, extraData)\n totalElements := and(\n extraData,\n 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\n )\n nextQueueIndex := shr(\n 40,\n and(\n extraData,\n 0x00000000000000000000000000000000000000000000FFFFFFFFFF0000000000\n )\n )\n lastTimestamp := shr(\n 80,\n and(\n extraData,\n 0x0000000000000000000000000000000000FFFFFFFFFF00000000000000000000\n )\n )\n lastBlockNumber := shr(\n 120,\n and(\n extraData,\n 0x000000000000000000000000FFFFFFFFFF000000000000000000000000000000\n )\n )\n }\n // solhint-enable max-line-length\n\n return (totalElements, nextQueueIndex, lastTimestamp, lastBlockNumber);\n }\n\n /**\n * Encodes the batch context for the extra data.\n * @param _totalElements Total number of elements submitted.\n * @param _nextQueueIdx Index of the next queue element.\n * @param _timestamp Timestamp for the last batch.\n * @param _blockNumber Block number of the last batch.\n * @return Encoded batch context.\n */\n function _makeBatchExtraData(\n uint40 _totalElements,\n uint40 _nextQueueIdx,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal pure returns (bytes27) {\n bytes27 extraData;\n assembly {\n extraData := _totalElements\n extraData := or(extraData, shl(40, _nextQueueIdx))\n extraData := or(extraData, shl(80, _timestamp))\n extraData := or(extraData, shl(120, _blockNumber))\n extraData := shl(40, extraData)\n }\n\n return extraData;\n }\n\n /**\n * Inserts a batch into the chain of batches.\n * @param _transactionRoot Root of the transaction tree for this batch.\n * @param _batchSize Number of elements in the batch.\n * @param _numQueuedTransactions Number of queue transactions in the batch.\n * @param _timestamp The latest batch timestamp.\n * @param _blockNumber The latest batch blockNumber.\n */\n function _appendBatch(\n bytes32 _transactionRoot,\n uint256 _batchSize,\n uint256 _numQueuedTransactions,\n uint40 _timestamp,\n uint40 _blockNumber\n ) internal {\n IChainStorageContainer batchesRef = batches();\n (uint40 totalElements, uint40 nextQueueIndex, , ) = _getBatchExtraData();\n\n Lib_OVMCodec.ChainBatchHeader memory header = Lib_OVMCodec\n .ChainBatchHeader({\n batchIndex: batchesRef.length(),\n batchRoot: _transactionRoot,\n batchSize: _batchSize,\n prevTotalElements: totalElements,\n extraData: hex''\n });\n\n emit TransactionBatchAppended(\n header.batchIndex,\n header.batchRoot,\n header.batchSize,\n header.prevTotalElements,\n header.extraData\n );\n\n bytes32 batchHeaderHash = Lib_OVMCodec.hashBatchHeader(header);\n bytes27 latestBatchContext = _makeBatchExtraData(\n totalElements + uint40(header.batchSize),\n nextQueueIndex + uint40(_numQueuedTransactions),\n _timestamp,\n _blockNumber\n );\n\n batchesRef.push(batchHeaderHash, latestBatchContext);\n }\n}\n" ++ }, ++ "contracts/standards/AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2019-2021, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npragma solidity ^0.8.7;\n\nlibrary AddressAliasHelper {\n uint160 constant offset = uint160(0x1111000000000000000000000000000000001111);\n\n /// @notice Utility function that converts the address in the L1 that submitted a tx to\n /// the inbox to the msg.sender viewed in the L2\n /// @param l1Address the address in the L1 that triggered the tx to L2\n /// @return l2Address L2 address as viewed in msg.sender\n function applyL1ToL2Alias(address l1Address)\n internal\n pure\n returns (address l2Address)\n {\n unchecked {\n l2Address = address(uint160(l1Address) + offset);\n }\n }\n\n /// @notice Utility function that converts the msg.sender viewed in the L2 to the\n /// address in the L1 that submitted a tx to the inbox\n /// @param l2Address L2 address as viewed in msg.sender\n /// @return l1Address the address in the L1 that triggered the tx to L2\n function undoL1ToL2Alias(address l2Address)\n internal\n pure\n returns (address l1Address)\n {\n unchecked {\n l1Address = address(uint160(l2Address) - offset);\n }\n }\n}\n" ++ }, ++ "contracts/test-libraries/codec/TestLib_OVMCodec.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\n\n/**\n * @title TestLib_OVMCodec\n */\ncontract TestLib_OVMCodec {\n function encodeTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes memory _encoded)\n {\n return Lib_OVMCodec.encodeTransaction(_transaction);\n }\n\n function hashTransaction(Lib_OVMCodec.Transaction memory _transaction)\n public\n pure\n returns (bytes32 _hash)\n {\n return Lib_OVMCodec.hashTransaction(_transaction);\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\nimport {Lib_AddressResolver} from '../../libraries/resolver/Lib_AddressResolver.sol';\nimport {Lib_OVMCodec} from '../../libraries/codec/Lib_OVMCodec.sol';\nimport {Lib_AddressManager} from '../../libraries/resolver/Lib_AddressManager.sol';\nimport {Lib_SecureMerkleTrie} from '../../libraries/trie/Lib_SecureMerkleTrie.sol';\nimport {Lib_DefaultValues} from '../../libraries/constants/Lib_DefaultValues.sol';\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\nimport {Lib_CrossDomainUtils} from '../../libraries/bridge/Lib_CrossDomainUtils.sol';\n\n/* Interface Imports */\nimport {IL1CrossDomainMessenger} from './IL1CrossDomainMessenger.sol';\nimport {ICanonicalTransactionChain} from '../rollup/ICanonicalTransactionChain.sol';\nimport {IStateCommitmentChain} from '../rollup/IStateCommitmentChain.sol';\n\n/* External Imports */\nimport {OwnableUpgradeable} from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport {PausableUpgradeable} from '@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol';\nimport {ReentrancyGuardUpgradeable} from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol';\n\n/**\n * @title L1CrossDomainMessenger\n * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages\n * from L2 onto L1. In the event that a message sent from L1 to L2 is rejected for exceeding the L2\n * epoch gas limit, it can be resubmitted via this contract's replay function.\n *\n * Runtime target: EVM\n */\ncontract L1CrossDomainMessenger is\n IL1CrossDomainMessenger,\n Lib_AddressResolver,\n OwnableUpgradeable,\n PausableUpgradeable,\n ReentrancyGuardUpgradeable\n{\n /**********\n * Events *\n **********/\n\n event MessageBlocked(bytes32 indexed _xDomainCalldataHash);\n\n event MessageAllowed(bytes32 indexed _xDomainCalldataHash);\n\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public blockedMessages;\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public failedMessages;\n\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * This contract is intended to be behind a delegate proxy.\n * We pass the zero address to the address resolver just to satisfy the constructor.\n * We still need to set this value in initialize().\n */\n constructor() Lib_AddressResolver(address(0)) {}\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @param _libAddressManager Address of the Address Manager.\n */\n function initialize(address _libAddressManager) public initializer {\n require(\n address(libAddressManager) == address(0),\n 'L1CrossDomainMessenger already intialized.'\n );\n libAddressManager = Lib_AddressManager(_libAddressManager);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Initialize upgradable OZ contracts\n __Context_init_unchained(); // Context is a dependency for both Ownable and Pausable\n __Ownable_init_unchained();\n __Pausable_init_unchained();\n __ReentrancyGuard_init_unchained();\n }\n\n /**\n * Pause relaying.\n */\n function pause() external onlyOwner {\n _pause();\n }\n\n /**\n * Block a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function blockMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = true;\n emit MessageBlocked(_xDomainCalldataHash);\n }\n\n /**\n * Allow a message.\n * @param _xDomainCalldataHash Hash of the message to block.\n */\n function allowMessage(bytes32 _xDomainCalldataHash) external onlyOwner {\n blockedMessages[_xDomainCalldataHash] = false;\n emit MessageAllowed(_xDomainCalldataHash);\n }\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n 'xDomainMessageSender is not set'\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n address ovmCanonicalTransactionChain = resolve('CanonicalTransactionChain');\n // Use the CTC queue length as nonce\n uint40 nonce = ICanonicalTransactionChain(ovmCanonicalTransactionChain)\n .getQueueLength();\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n nonce\n );\n\n _sendXDomainMessage(\n ovmCanonicalTransactionChain,\n xDomainCalldata,\n _gasLimit\n );\n\n emit SentMessage(_target, msg.sender, _message, nonce, _gasLimit);\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce,\n L2MessageInclusionProof memory _proof\n ) public nonReentrant whenNotPaused {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n require(\n _verifyXDomainMessage(xDomainCalldata, _proof) == true,\n 'Provided message could not be verified.'\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n 'Provided message has already been received.'\n );\n\n require(\n blockedMessages[xDomainCalldataHash] == false,\n 'Provided message has been blocked.'\n );\n\n require(\n _target != resolve('CanonicalTransactionChain'),\n 'Cannot send L2->L1 messages to L1 system contracts.'\n );\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n failedMessages[xDomainCalldataHash] = true;\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(xDomainCalldata, msg.sender, block.number)\n );\n relayedMessages[relayId] = true;\n }\n\n /**\n * Replays a cross domain message to the target messenger.\n * @inheritdoc IL1CrossDomainMessenger\n */\n function replayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _queueIndex,\n uint32 _oldGasLimit,\n uint32 _newGasLimit\n ) public {\n // Verify that the message is in the queue:\n address canonicalTransactionChain = resolve('CanonicalTransactionChain');\n Lib_OVMCodec.QueueElement memory element = ICanonicalTransactionChain(\n canonicalTransactionChain\n ).getQueueElement(_queueIndex);\n\n // Compute the calldata that was originally used to send the message.\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _queueIndex\n );\n\n // Compute the transactionHash\n bytes32 transactionHash = keccak256(\n abi.encode(\n AddressAliasHelper.applyL1ToL2Alias(address(this)),\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _oldGasLimit,\n xDomainCalldata\n )\n );\n\n // Now check that the provided message data matches the one in the queue element.\n require(\n transactionHash == element.transactionHash,\n 'Provided message has not been enqueued.'\n );\n\n // Send the same message but with the new gas limit.\n _sendXDomainMessage(\n canonicalTransactionChain,\n xDomainCalldata,\n _newGasLimit\n );\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Verifies that the given message is valid.\n * @param _xDomainCalldata Calldata to verify.\n * @param _proof Inclusion proof for the message.\n * @return Whether or not the provided message is valid.\n */\n function _verifyXDomainMessage(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n return (_verifyStateRootProof(_proof) &&\n _verifyStorageProof(_xDomainCalldata, _proof));\n }\n\n /**\n * Verifies that the state root within an inclusion proof is valid.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStateRootProof(L2MessageInclusionProof memory _proof)\n internal\n view\n returns (bool)\n {\n IStateCommitmentChain ovmStateCommitmentChain = IStateCommitmentChain(\n resolve('StateCommitmentChain')\n );\n\n return (ovmStateCommitmentChain.insideFraudProofWindow(\n _proof.stateRootBatchHeader\n ) ==\n false &&\n ovmStateCommitmentChain.verifyStateCommitment(\n _proof.stateRoot,\n _proof.stateRootBatchHeader,\n _proof.stateRootProof\n ));\n }\n\n /**\n * Verifies that the storage proof within an inclusion proof is valid.\n * @param _xDomainCalldata Encoded message calldata.\n * @param _proof Message inclusion proof.\n * @return Whether or not the provided proof is valid.\n */\n function _verifyStorageProof(\n bytes memory _xDomainCalldata,\n L2MessageInclusionProof memory _proof\n ) internal view returns (bool) {\n bytes32 storageKey = keccak256(\n abi.encodePacked(\n keccak256(\n abi.encodePacked(\n _xDomainCalldata,\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER\n )\n ),\n uint256(0)\n )\n );\n\n (\n bool exists,\n bytes memory encodedMessagePassingAccount\n ) = Lib_SecureMerkleTrie.get(\n abi.encodePacked(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER),\n _proof.stateTrieWitness,\n _proof.stateRoot\n );\n\n require(\n exists == true,\n 'Message passing predeploy has not been initialized or invalid proof provided.'\n );\n\n Lib_OVMCodec.EVMAccount memory account = Lib_OVMCodec.decodeEVMAccount(\n encodedMessagePassingAccount\n );\n\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(\n abi.encodePacked(storageKey),\n abi.encodePacked(uint8(1)),\n _proof.storageTrieWitness,\n account.storageRoot\n );\n }\n\n /**\n * Sends a cross domain message.\n * @param _canonicalTransactionChain Address of the CanonicalTransactionChain instance.\n * @param _message Message to send.\n * @param _gasLimit OVM gas limit for the message.\n */\n function _sendXDomainMessage(\n address _canonicalTransactionChain,\n bytes memory _message,\n uint256 _gasLimit\n ) internal {\n ICanonicalTransactionChain(_canonicalTransactionChain).enqueue(\n Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,\n _gasLimit,\n _message\n );\n }\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_MerkleTrie} from './Lib_MerkleTrie.sol';\n\n/**\n * @title Lib_SecureMerkleTrie\n */\nlibrary Lib_SecureMerkleTrie {\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.verifyInclusionProof(key, _value, _proof, _root);\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.update(key, _value, _proof, _root);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.get(key, _proof, _root);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = _getSecureKey(_key);\n return Lib_MerkleTrie.getSingleNodeRootHash(key, _value);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * Computes the secure counterpart to a key.\n * @param _key Key to get a secure key from.\n * @return _secureKey Secure version of the key.\n */\n function _getSecureKey(bytes memory _key)\n private\n pure\n returns (bytes memory _secureKey)\n {\n return abi.encodePacked(keccak256(_key));\n }\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_DefaultValues.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_DefaultValues\n */\nlibrary Lib_DefaultValues {\n // The default x-domain message sender being set to a non-zero value makes\n // deployment a bit more expensive, but in exchange the refund on every call to\n // `relayMessage` by the L1 and L2 messengers will be higher.\n address internal constant DEFAULT_XDOMAIN_SENDER =\n 0x000000000000000000000000000000000000dEaD;\n}\n" ++ }, ++ "contracts/libraries/constants/Lib_PredeployAddresses.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title Lib_PredeployAddresses\n */\nlibrary Lib_PredeployAddresses {\n // solhint-disable max-line-length\n address internal constant L2_TO_L1_MESSAGE_PASSER =\n 0x4200000000000000000000000000000000000000;\n address internal constant L1_MESSAGE_SENDER =\n 0x4200000000000000000000000000000000000001;\n address internal constant DEPLOYER_WHITELIST =\n 0x4200000000000000000000000000000000000002;\n address payable internal constant OVM_ETH =\n payable(0x4200000000000000000000000000000000000006);\n // solhint-disable-next-line max-line-length\n address internal constant L2_CROSS_DOMAIN_MESSENGER =\n 0x4200000000000000000000000000000000000007;\n address internal constant LIB_ADDRESS_MANAGER =\n 0x4200000000000000000000000000000000000008;\n address internal constant PROXY_EOA =\n 0x4200000000000000000000000000000000000009;\n address internal constant L2_STANDARD_BRIDGE =\n 0x4200000000000000000000000000000000000010;\n address internal constant SEQUENCER_FEE_WALLET =\n 0x4200000000000000000000000000000000000011;\n address internal constant L2_STANDARD_TOKEN_FACTORY =\n 0x4200000000000000000000000000000000000012;\n address internal constant L1_BLOCK_NUMBER =\n 0x4200000000000000000000000000000000000013;\n}\n" ++ }, ++ "contracts/libraries/bridge/Lib_CrossDomainUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\n\n/**\n * @title Lib_CrossDomainUtils\n */\nlibrary Lib_CrossDomainUtils {\n /**\n * Generates the correct cross domain calldata for a message.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n * @return ABI encoded cross domain calldata.\n */\n function encodeXDomainCalldata(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) internal pure returns (bytes memory) {\n return\n abi.encodeWithSignature(\n 'relayMessage(address,address,bytes,uint256)',\n _target,\n _sender,\n _message,\n _messageNonce\n );\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal initializer {\n __Context_init_unchained();\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal initializer {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal initializer {\n __Context_init_unchained();\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal initializer {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal initializer {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal initializer {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n uint256[49] private __gap;\n}\n" ++ }, ++ "contracts/libraries/trie/Lib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_BytesUtils} from '../utils/Lib_BytesUtils.sol';\nimport {Lib_RLPReader} from '../rlp/Lib_RLPReader.sol';\nimport {Lib_RLPWriter} from '../rlp/Lib_RLPWriter.sol';\n\n/**\n * @title Lib_MerkleTrie\n */\nlibrary Lib_MerkleTrie {\n /*******************\n * Data Structures *\n *******************/\n\n enum NodeType {\n BranchNode,\n ExtensionNode,\n LeafNode\n }\n\n struct TrieNode {\n bytes encoded;\n Lib_RLPReader.RLPItem[] decoded;\n }\n\n /**********************\n * Contract Constants *\n **********************/\n\n // TREE_RADIX determines the number of elements per branch node.\n uint256 constant TREE_RADIX = 16;\n // Branch nodes have TREE_RADIX elements plus an additional `value` slot.\n uint256 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1;\n // Leaf nodes and extension nodes always have two elements, a `path` and a `value`.\n uint256 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2;\n\n // Prefixes are prepended to the `path` within a leaf or extension node and\n // allow us to differentiate between the two node types. `ODD` or `EVEN` is\n // determined by the number of nibbles within the unprefixed `path`. If the\n // number of nibbles if even, we need to insert an extra padding nibble so\n // the resulting prefixed `path` has an even number of nibbles.\n uint8 constant PREFIX_EXTENSION_EVEN = 0;\n uint8 constant PREFIX_EXTENSION_ODD = 1;\n uint8 constant PREFIX_LEAF_EVEN = 2;\n uint8 constant PREFIX_LEAF_ODD = 3;\n\n // Just a utility constant. RLP represents `NULL` as 0x80.\n bytes1 constant RLP_NULL = bytes1(0x80);\n bytes constant RLP_NULL_BYTES = hex'80';\n bytes32 internal constant KECCAK256_RLP_NULL_BYTES =\n keccak256(RLP_NULL_BYTES);\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * @notice Verifies a proof that a given key/value pair is present in the\n * Merkle trie.\n * @param _key Key of the node to search for, as a hex string.\n * @param _value Value of the node to search for, as a hex string.\n * @param _proof Merkle trie inclusion proof for the desired node. Unlike\n * traditional Merkle trees, this proof is executed top-down and consists\n * of a list of RLP-encoded nodes that make a path down to the target node.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _verified `true` if the k/v pair exists in the trie, `false` otherwise.\n */\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _verified) {\n (bool exists, bytes memory value) = get(_key, _proof, _root);\n\n return (exists && Lib_BytesUtils.equal(_value, value));\n }\n\n /**\n * @notice Updates a Merkle trie and returns a new root hash.\n * @param _key Key of the node to update, as a hex string.\n * @param _value Value of the node to update, as a hex string.\n * @param _proof Merkle trie inclusion proof for the node *nearest* the\n * target node. If the key exists, we can simply update the value.\n * Otherwise, we need to modify the trie to handle the new k/v pair.\n * @param _root Known root of the Merkle trie. Used to verify that the\n * included proof is correctly constructed.\n * @return _updatedRoot Root hash of the newly constructed trie.\n */\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bytes32 _updatedRoot) {\n // Special case when inserting the very first node.\n if (_root == KECCAK256_RLP_NULL_BYTES) {\n return getSingleNodeRootHash(_key, _value);\n }\n\n TrieNode[] memory proof = _parseProof(_proof);\n (uint256 pathLength, bytes memory keyRemainder, ) = _walkNodePath(\n proof,\n _key,\n _root\n );\n TrieNode[] memory newPath = _getNewPath(\n proof,\n pathLength,\n _key,\n keyRemainder,\n _value\n );\n\n return _getUpdatedTrieRoot(newPath, _key);\n }\n\n /**\n * @notice Retrieves the value associated with a given key.\n * @param _key Key to search for, as hex bytes.\n * @param _proof Merkle trie inclusion proof for the key.\n * @param _root Known root of the Merkle trie.\n * @return _exists Whether or not the key exists.\n * @return _value Value of the key if it exists.\n */\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) internal pure returns (bool _exists, bytes memory _value) {\n TrieNode[] memory proof = _parseProof(_proof);\n (\n uint256 pathLength,\n bytes memory keyRemainder,\n bool isFinalNode\n ) = _walkNodePath(proof, _key, _root);\n\n bool exists = keyRemainder.length == 0;\n\n require(exists || isFinalNode, 'Provided proof is invalid.');\n\n bytes memory value = exists\n ? _getNodeValue(proof[pathLength - 1])\n : bytes('');\n\n return (exists, value);\n }\n\n /**\n * Computes the root hash for a trie with a single node.\n * @param _key Key for the single node.\n * @param _value Value for the single node.\n * @return _updatedRoot Hash of the trie.\n */\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n internal\n pure\n returns (bytes32 _updatedRoot)\n {\n return\n keccak256(_makeLeafNode(Lib_BytesUtils.toNibbles(_key), _value).encoded);\n }\n\n /*********************\n * Private Functions *\n *********************/\n\n /**\n * @notice Walks through a proof using a provided key.\n * @param _proof Inclusion proof to walk through.\n * @param _key Key to use for the walk.\n * @param _root Known root of the trie.\n * @return _pathLength Length of the final path\n * @return _keyRemainder Portion of the key remaining after the walk.\n * @return _isFinalNode Whether or not we've hit a dead end.\n */\n function _walkNodePath(\n TrieNode[] memory _proof,\n bytes memory _key,\n bytes32 _root\n )\n private\n pure\n returns (\n uint256 _pathLength,\n bytes memory _keyRemainder,\n bool _isFinalNode\n )\n {\n uint256 pathLength = 0;\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n bytes32 currentNodeID = _root;\n uint256 currentKeyIndex = 0;\n uint256 currentKeyIncrement = 0;\n TrieNode memory currentNode;\n\n // Proof is top-down, so we start at the first element (root).\n for (uint256 i = 0; i < _proof.length; i++) {\n currentNode = _proof[i];\n currentKeyIndex += currentKeyIncrement;\n\n // Keep track of the proof elements we actually need.\n // It's expensive to resize arrays, so this simply reduces gas costs.\n pathLength += 1;\n\n if (currentKeyIndex == 0) {\n // First proof element is always the root node.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n 'Invalid root hash'\n );\n } else if (currentNode.encoded.length >= 32) {\n // Nodes 32 bytes or larger are hashed inside branch nodes.\n require(\n keccak256(currentNode.encoded) == currentNodeID,\n 'Invalid large internal hash'\n );\n } else {\n // Nodes smaller than 31 bytes aren't hashed.\n require(\n Lib_BytesUtils.toBytes32(currentNode.encoded) == currentNodeID,\n 'Invalid internal node hash'\n );\n }\n\n if (currentNode.decoded.length == BRANCH_NODE_LENGTH) {\n if (currentKeyIndex == key.length) {\n // We've hit the end of the key\n // meaning the value should be within this branch node.\n break;\n } else {\n // We're not at the end of the key yet.\n // Figure out what the next node ID should be and continue.\n uint8 branchKey = uint8(key[currentKeyIndex]);\n Lib_RLPReader.RLPItem memory nextNode = currentNode.decoded[\n branchKey\n ];\n currentNodeID = _getNodeID(nextNode);\n currentKeyIncrement = 1;\n continue;\n }\n } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(currentNode);\n uint8 prefix = uint8(path[0]);\n uint8 offset = 2 - (prefix % 2);\n bytes memory pathRemainder = Lib_BytesUtils.slice(path, offset);\n bytes memory keyRemainder = Lib_BytesUtils.slice(key, currentKeyIndex);\n uint256 sharedNibbleLength = _getSharedNibbleLength(\n pathRemainder,\n keyRemainder\n );\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n if (\n pathRemainder.length == sharedNibbleLength &&\n keyRemainder.length == sharedNibbleLength\n ) {\n // The key within this leaf matches our key exactly.\n // Increment the key index to reflect that we have no remainder.\n currentKeyIndex += sharedNibbleLength;\n }\n\n // We've hit a leaf node, so our next node should be NULL.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else if (\n prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD\n ) {\n if (sharedNibbleLength != pathRemainder.length) {\n // Our extension node is not identical to the remainder.\n // We've hit the end of this path\n // updates will need to modify this extension.\n currentNodeID = bytes32(RLP_NULL);\n break;\n } else {\n // Our extension shares some nibbles.\n // Carry on to the next node.\n currentNodeID = _getNodeID(currentNode.decoded[1]);\n currentKeyIncrement = sharedNibbleLength;\n continue;\n }\n } else {\n revert('Received a node with an unknown prefix');\n }\n } else {\n revert('Received an unparseable node.');\n }\n }\n\n // If our node ID is NULL, then we're at a dead end.\n bool isFinalNode = currentNodeID == bytes32(RLP_NULL);\n return (\n pathLength,\n Lib_BytesUtils.slice(key, currentKeyIndex),\n isFinalNode\n );\n }\n\n /**\n * @notice Creates new nodes to support a k/v pair insertion into a given Merkle trie path.\n * @param _path Path to the node nearest the k/v pair.\n * @param _pathLength Length of the path. Necessary because the provided path may include\n * additional nodes (e.g., it comes directly from a proof) and we can't resize in-memory\n * arrays without costly duplication.\n * @param _key Full original key.\n * @param _keyRemainder Portion of the initial key that must be inserted into the trie.\n * @param _value Value to insert at the given key.\n * @return _newPath A new path with the inserted k/v pair and extra supporting nodes.\n */\n function _getNewPath(\n TrieNode[] memory _path,\n uint256 _pathLength,\n bytes memory _key,\n bytes memory _keyRemainder,\n bytes memory _value\n ) private pure returns (TrieNode[] memory _newPath) {\n bytes memory keyRemainder = _keyRemainder;\n\n // Most of our logic depends on the status of the last node in the path.\n TrieNode memory lastNode = _path[_pathLength - 1];\n NodeType lastNodeType = _getNodeType(lastNode);\n\n // Create an array for newly created nodes.\n // We need up to three new nodes, depending on the contents of the last node.\n // Since array resizing is expensive, we'll keep track of the size manually.\n // We're using an explicit `totalNewNodes += 1` after insertions for clarity.\n TrieNode[] memory newNodes = new TrieNode[](3);\n uint256 totalNewNodes = 0;\n\n // solhint-disable-next-line max-line-length\n // Reference: https://github.com/ethereumjs/merkle-patricia-tree/blob/c0a10395aab37d42c175a47114ebfcbd7efcf059/src/baseTrie.ts#L294-L313\n bool matchLeaf = false;\n if (lastNodeType == NodeType.LeafNode) {\n uint256 l = 0;\n if (_path.length > 0) {\n for (uint256 i = 0; i < _path.length - 1; i++) {\n if (_getNodeType(_path[i]) == NodeType.BranchNode) {\n l++;\n } else {\n l += _getNodeKey(_path[i]).length;\n }\n }\n }\n\n if (\n _getSharedNibbleLength(\n _getNodeKey(lastNode),\n Lib_BytesUtils.slice(Lib_BytesUtils.toNibbles(_key), l)\n ) ==\n _getNodeKey(lastNode).length &&\n keyRemainder.length == 0\n ) {\n matchLeaf = true;\n }\n }\n\n if (matchLeaf) {\n // We've found a leaf node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _makeLeafNode(_getNodeKey(lastNode), _value);\n totalNewNodes += 1;\n } else if (lastNodeType == NodeType.BranchNode) {\n if (keyRemainder.length == 0) {\n // We've found a branch node with the given key.\n // Simply need to update the value of the node to match.\n newNodes[totalNewNodes] = _editBranchValue(lastNode, _value);\n totalNewNodes += 1;\n } else {\n // We've found a branch node, but it doesn't contain our key.\n // Reinsert the old branch for now.\n newNodes[totalNewNodes] = lastNode;\n totalNewNodes += 1;\n // Create a new leaf node, slicing our remainder since the first byte points\n // to our branch node.\n newNodes[totalNewNodes] = _makeLeafNode(\n Lib_BytesUtils.slice(keyRemainder, 1),\n _value\n );\n totalNewNodes += 1;\n }\n } else {\n // Our last node is either an extension node or a leaf node with a different key.\n bytes memory lastNodeKey = _getNodeKey(lastNode);\n uint256 sharedNibbleLength = _getSharedNibbleLength(\n lastNodeKey,\n keyRemainder\n );\n\n if (sharedNibbleLength != 0) {\n // We've got some shared nibbles between the last node and our key remainder.\n // We'll need to insert an extension node that covers these shared nibbles.\n bytes memory nextNodeKey = Lib_BytesUtils.slice(\n lastNodeKey,\n 0,\n sharedNibbleLength\n );\n newNodes[totalNewNodes] = _makeExtensionNode(\n nextNodeKey,\n _getNodeHash(_value)\n );\n totalNewNodes += 1;\n\n // Cut down the keys since we've just covered these shared nibbles.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, sharedNibbleLength);\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, sharedNibbleLength);\n }\n\n // Create an empty branch to fill in.\n TrieNode memory newBranch = _makeEmptyBranchNode();\n\n if (lastNodeKey.length == 0) {\n // Key remainder was larger than the key for our last node.\n // The value within our last node is therefore going to be shifted into\n // a branch value slot.\n newBranch = _editBranchValue(newBranch, _getNodeValue(lastNode));\n } else {\n // Last node key was larger than the key remainder.\n // We're going to modify some index of our branch.\n uint8 branchKey = uint8(lastNodeKey[0]);\n // Move on to the next nibble.\n lastNodeKey = Lib_BytesUtils.slice(lastNodeKey, 1);\n\n if (lastNodeType == NodeType.LeafNode) {\n // We're dealing with a leaf node.\n // We'll modify the key and insert the old leaf node into the branch index.\n TrieNode memory modifiedLastNode = _makeLeafNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else if (lastNodeKey.length != 0) {\n // We're dealing with a shrinking extension node.\n // We need to modify the node to decrease the size of the key.\n TrieNode memory modifiedLastNode = _makeExtensionNode(\n lastNodeKey,\n _getNodeValue(lastNode)\n );\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeHash(modifiedLastNode.encoded)\n );\n } else {\n // We're dealing with an unnecessary extension node.\n // We're going to delete the node entirely.\n // Simply insert its current value into the branch index.\n newBranch = _editBranchIndex(\n newBranch,\n branchKey,\n _getNodeValue(lastNode)\n );\n }\n }\n\n if (keyRemainder.length == 0) {\n // We've got nothing left in the key remainder.\n // Simply insert the value into the branch value slot.\n newBranch = _editBranchValue(newBranch, _value);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n } else {\n // We've got some key remainder to work with.\n // We'll be inserting a leaf node into the trie.\n // First, move on to the next nibble.\n keyRemainder = Lib_BytesUtils.slice(keyRemainder, 1);\n // Push the branch into the list of new nodes.\n newNodes[totalNewNodes] = newBranch;\n totalNewNodes += 1;\n // Push a new leaf node for our k/v pair.\n newNodes[totalNewNodes] = _makeLeafNode(keyRemainder, _value);\n totalNewNodes += 1;\n }\n }\n\n // Finally, join the old path with our newly created nodes.\n // Since we're overwriting the last node in the path, we use `_pathLength - 1`.\n return _joinNodeArrays(_path, _pathLength - 1, newNodes, totalNewNodes);\n }\n\n /**\n * @notice Computes the trie root from a given path.\n * @param _nodes Path to some k/v pair.\n * @param _key Key for the k/v pair.\n * @return _updatedRoot Root hash for the updated trie.\n */\n function _getUpdatedTrieRoot(TrieNode[] memory _nodes, bytes memory _key)\n private\n pure\n returns (bytes32 _updatedRoot)\n {\n bytes memory key = Lib_BytesUtils.toNibbles(_key);\n\n // Some variables to keep track of during iteration.\n TrieNode memory currentNode;\n NodeType currentNodeType;\n bytes memory previousNodeHash;\n\n // Run through the path backwards to rebuild our root hash.\n for (uint256 i = _nodes.length; i > 0; i--) {\n // Pick out the current node.\n currentNode = _nodes[i - 1];\n currentNodeType = _getNodeType(currentNode);\n\n if (currentNodeType == NodeType.LeafNode) {\n // Leaf nodes are already correctly encoded.\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n } else if (currentNodeType == NodeType.ExtensionNode) {\n // Shift the key over to account for the nodes key.\n bytes memory nodeKey = _getNodeKey(currentNode);\n key = Lib_BytesUtils.slice(key, 0, key.length - nodeKey.length);\n\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n currentNode = _editExtensionNodeValue(currentNode, previousNodeHash);\n }\n } else if (currentNodeType == NodeType.BranchNode) {\n // If this node is the last element in the path, it'll be correctly encoded\n // and we can skip this part.\n if (previousNodeHash.length > 0) {\n // Re-encode the node based on the previous node.\n uint8 branchKey = uint8(key[key.length - 1]);\n key = Lib_BytesUtils.slice(key, 0, key.length - 1);\n currentNode = _editBranchIndex(\n currentNode,\n branchKey,\n previousNodeHash\n );\n }\n }\n\n // Compute the node hash for the next iteration.\n previousNodeHash = _getNodeHash(currentNode.encoded);\n }\n\n // Current node should be the root at this point.\n // Simply return the hash of its encoding.\n return keccak256(currentNode.encoded);\n }\n\n /**\n * @notice Parses an RLP-encoded proof into something more useful.\n * @param _proof RLP-encoded proof to parse.\n * @return _parsed Proof parsed into easily accessible structs.\n */\n function _parseProof(bytes memory _proof)\n private\n pure\n returns (TrieNode[] memory _parsed)\n {\n Lib_RLPReader.RLPItem[] memory nodes = Lib_RLPReader.readList(_proof);\n TrieNode[] memory proof = new TrieNode[](nodes.length);\n\n for (uint256 i = 0; i < nodes.length; i++) {\n bytes memory encoded = Lib_RLPReader.readBytes(nodes[i]);\n proof[i] = TrieNode({\n encoded: encoded,\n decoded: Lib_RLPReader.readList(encoded)\n });\n }\n\n return proof;\n }\n\n /**\n * @notice Picks out the ID for a node. Node ID is referred to as the\n * \"hash\" within the specification, but nodes < 32 bytes are not actually\n * hashed.\n * @param _node Node to pull an ID for.\n * @return _nodeID ID for the node, depending on the size of its contents.\n */\n function _getNodeID(Lib_RLPReader.RLPItem memory _node)\n private\n pure\n returns (bytes32 _nodeID)\n {\n bytes memory nodeID;\n\n if (_node.length < 32) {\n // Nodes smaller than 32 bytes are RLP encoded.\n nodeID = Lib_RLPReader.readRawBytes(_node);\n } else {\n // Nodes 32 bytes or larger are hashed.\n nodeID = Lib_RLPReader.readBytes(_node);\n }\n\n return Lib_BytesUtils.toBytes32(nodeID);\n }\n\n /**\n * @notice Gets the path for a leaf or extension node.\n * @param _node Node to get a path for.\n * @return _path Node path, converted to an array of nibbles.\n */\n function _getNodePath(TrieNode memory _node)\n private\n pure\n returns (bytes memory _path)\n {\n return Lib_BytesUtils.toNibbles(Lib_RLPReader.readBytes(_node.decoded[0]));\n }\n\n /**\n * @notice Gets the key for a leaf or extension node. Keys are essentially\n * just paths without any prefix.\n * @param _node Node to get a key for.\n * @return _key Node key, converted to an array of nibbles.\n */\n function _getNodeKey(TrieNode memory _node)\n private\n pure\n returns (bytes memory _key)\n {\n return _removeHexPrefix(_getNodePath(_node));\n }\n\n /**\n * @notice Gets the path for a node.\n * @param _node Node to get a value for.\n * @return _value Node value, as hex bytes.\n */\n function _getNodeValue(TrieNode memory _node)\n private\n pure\n returns (bytes memory _value)\n {\n return Lib_RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]);\n }\n\n /**\n * @notice Computes the node hash for an encoded node. Nodes < 32 bytes\n * are not hashed, all others are keccak256 hashed.\n * @param _encoded Encoded node to hash.\n * @return _hash Hash of the encoded node. Simply the input if < 32 bytes.\n */\n function _getNodeHash(bytes memory _encoded)\n private\n pure\n returns (bytes memory _hash)\n {\n if (_encoded.length < 32) {\n return _encoded;\n } else {\n return abi.encodePacked(keccak256(_encoded));\n }\n }\n\n /**\n * @notice Determines the type for a given node.\n * @param _node Node to determine a type for.\n * @return _type Type of the node; BranchNode/ExtensionNode/LeafNode.\n */\n function _getNodeType(TrieNode memory _node)\n private\n pure\n returns (NodeType _type)\n {\n if (_node.decoded.length == BRANCH_NODE_LENGTH) {\n return NodeType.BranchNode;\n } else if (_node.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) {\n bytes memory path = _getNodePath(_node);\n uint8 prefix = uint8(path[0]);\n\n if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) {\n return NodeType.LeafNode;\n } else if (\n prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD\n ) {\n return NodeType.ExtensionNode;\n }\n }\n\n revert('Invalid node type');\n }\n\n /**\n * @notice Utility; determines the number of nibbles shared between two\n * nibble arrays.\n * @param _a First nibble array.\n * @param _b Second nibble array.\n * @return _shared Number of shared nibbles.\n */\n function _getSharedNibbleLength(bytes memory _a, bytes memory _b)\n private\n pure\n returns (uint256 _shared)\n {\n uint256 i = 0;\n while (_a.length > i && _b.length > i && _a[i] == _b[i]) {\n i++;\n }\n return i;\n }\n\n /**\n * @notice Utility; converts an RLP-encoded node into our nice struct.\n * @param _raw RLP-encoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(bytes[] memory _raw)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes memory encoded = Lib_RLPWriter.writeList(_raw);\n\n return\n TrieNode({encoded: encoded, decoded: Lib_RLPReader.readList(encoded)});\n }\n\n /**\n * @notice Utility; converts an RLP-decoded node into our nice struct.\n * @param _items RLP-decoded node to convert.\n * @return _node Node as a TrieNode struct.\n */\n function _makeNode(Lib_RLPReader.RLPItem[] memory _items)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](_items.length);\n for (uint256 i = 0; i < _items.length; i++) {\n raw[i] = Lib_RLPReader.readRawBytes(_items[i]);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new extension node.\n * @param _key Key for the extension node, unprefixed.\n * @param _value Value for the extension node.\n * @return _node New extension node with the given k/v pair.\n */\n function _makeExtensionNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * Creates a new extension node with the same key but a different value.\n * @param _node Extension node to copy and modify.\n * @param _value New value for the extension node.\n * @return New node with the same key and different value.\n */\n function _editExtensionNodeValue(TrieNode memory _node, bytes memory _value)\n private\n pure\n returns (TrieNode memory)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_getNodeKey(_node), false);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n if (_value.length < 32) {\n raw[1] = _value;\n } else {\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates a new leaf node.\n * @dev This function is essentially identical to `_makeExtensionNode`.\n * Although we could route both to a single method with a flag, it's\n * more gas efficient to keep them separate and duplicate the logic.\n * @param _key Key for the leaf node, unprefixed.\n * @param _value Value for the leaf node.\n * @return _node New leaf node with the given k/v pair.\n */\n function _makeLeafNode(bytes memory _key, bytes memory _value)\n private\n pure\n returns (TrieNode memory _node)\n {\n bytes[] memory raw = new bytes[](2);\n bytes memory key = _addHexPrefix(_key, true);\n raw[0] = Lib_RLPWriter.writeBytes(Lib_BytesUtils.fromNibbles(key));\n raw[1] = Lib_RLPWriter.writeBytes(_value);\n return _makeNode(raw);\n }\n\n /**\n * @notice Creates an empty branch node.\n * @return _node Empty branch node as a TrieNode struct.\n */\n function _makeEmptyBranchNode() private pure returns (TrieNode memory _node) {\n bytes[] memory raw = new bytes[](BRANCH_NODE_LENGTH);\n for (uint256 i = 0; i < raw.length; i++) {\n raw[i] = RLP_NULL_BYTES;\n }\n return _makeNode(raw);\n }\n\n /**\n * @notice Modifies the value slot for a given branch.\n * @param _branch Branch node to modify.\n * @param _value Value to insert into the branch.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchValue(TrieNode memory _branch, bytes memory _value)\n private\n pure\n returns (TrieNode memory _updatedNode)\n {\n bytes memory encoded = Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_branch.decoded.length - 1] = Lib_RLPReader.toRLPItem(\n encoded\n );\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Modifies a slot at an index for a given branch.\n * @param _branch Branch node to modify.\n * @param _index Slot index to modify.\n * @param _value Value to insert into the slot.\n * @return _updatedNode Modified branch node.\n */\n function _editBranchIndex(\n TrieNode memory _branch,\n uint8 _index,\n bytes memory _value\n ) private pure returns (TrieNode memory _updatedNode) {\n bytes memory encoded = _value.length < 32\n ? _value\n : Lib_RLPWriter.writeBytes(_value);\n _branch.decoded[_index] = Lib_RLPReader.toRLPItem(encoded);\n return _makeNode(_branch.decoded);\n }\n\n /**\n * @notice Utility; adds a prefix to a key.\n * @param _key Key to prefix.\n * @param _isLeaf Whether or not the key belongs to a leaf.\n * @return _prefixedKey Prefixed key.\n */\n function _addHexPrefix(bytes memory _key, bool _isLeaf)\n private\n pure\n returns (bytes memory _prefixedKey)\n {\n uint8 prefix = _isLeaf ? uint8(0x02) : uint8(0x00);\n uint8 offset = uint8(_key.length % 2);\n bytes memory prefixed = new bytes(2 - offset);\n prefixed[0] = bytes1(prefix + offset);\n return abi.encodePacked(prefixed, _key);\n }\n\n /**\n * @notice Utility; removes a prefix from a path.\n * @param _path Path to remove the prefix from.\n * @return _unprefixedKey Unprefixed key.\n */\n function _removeHexPrefix(bytes memory _path)\n private\n pure\n returns (bytes memory _unprefixedKey)\n {\n if (uint8(_path[0]) % 2 == 0) {\n return Lib_BytesUtils.slice(_path, 2);\n } else {\n return Lib_BytesUtils.slice(_path, 1);\n }\n }\n\n /**\n * @notice Utility; combines two node arrays. Array lengths are required\n * because the actual lengths may be longer than the filled lengths.\n * Array resizing is extremely costly and should be avoided.\n * @param _a First array to join.\n * @param _aLength Length of the first array.\n * @param _b Second array to join.\n * @param _bLength Length of the second array.\n * @return _joined Combined node array.\n */\n function _joinNodeArrays(\n TrieNode[] memory _a,\n uint256 _aLength,\n TrieNode[] memory _b,\n uint256 _bLength\n ) private pure returns (TrieNode[] memory _joined) {\n TrieNode[] memory ret = new TrieNode[](_aLength + _bLength);\n\n // Copy elements from the first array.\n for (uint256 i = 0; i < _aLength; i++) {\n ret[i] = _a[i];\n }\n\n // Copy elements from the second array.\n for (uint256 i = 0; i < _bLength; i++) {\n ret[i + _aLength] = _b[i];\n }\n\n return ret;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal initializer {\n __Context_init_unchained();\n }\n\n function __Context_init_unchained() internal initializer {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n uint256[50] private __gap;\n}\n" ++ }, ++ "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n require(_initializing || !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\nimport {Lib_CrossDomainUtils} from '../../libraries/bridge/Lib_CrossDomainUtils.sol';\nimport {Lib_DefaultValues} from '../../libraries/constants/Lib_DefaultValues.sol';\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\n\n/* Interface Imports */\nimport {IL2CrossDomainMessenger} from './IL2CrossDomainMessenger.sol';\nimport {iOVM_L2ToL1MessagePasser} from '../predeploys/iOVM_L2ToL1MessagePasser.sol';\n\n/**\n * @title L2CrossDomainMessenger\n * @dev The L2 Cross Domain Messenger contract sends messages from L2 to L1, and is the entry point\n * for L2 messages sent via the L1 Cross Domain Messenger.\n *\n */\ncontract L2CrossDomainMessenger is IL2CrossDomainMessenger {\n /*************\n * Variables *\n *************/\n\n mapping(bytes32 => bool) public relayedMessages;\n mapping(bytes32 => bool) public successfulMessages;\n mapping(bytes32 => bool) public sentMessages;\n uint256 public messageNonce;\n address internal xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n address public l1CrossDomainMessenger;\n\n /***************\n * Constructor *\n ***************/\n\n constructor(address _l1CrossDomainMessenger) {\n l1CrossDomainMessenger = _l1CrossDomainMessenger;\n }\n\n /********************\n * Public Functions *\n ********************/\n\n function xDomainMessageSender() public view returns (address) {\n require(\n xDomainMsgSender != Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER,\n 'xDomainMessageSender is not set'\n );\n return xDomainMsgSender;\n }\n\n /**\n * Sends a cross domain message to the target messenger.\n * @param _target Target contract address.\n * @param _message Message to send to the target.\n * @param _gasLimit Gas limit for the provided message.\n */\n function sendMessage(\n address _target,\n bytes memory _message,\n uint32 _gasLimit\n ) public {\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n msg.sender,\n _message,\n messageNonce\n );\n\n sentMessages[keccak256(xDomainCalldata)] = true;\n\n // Actually send the message.\n iOVM_L2ToL1MessagePasser(Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER)\n .passMessageToL1(xDomainCalldata);\n\n // Emit an event before we bump the nonce or the nonce will be off by one.\n emit SentMessage(_target, msg.sender, _message, messageNonce, _gasLimit);\n messageNonce += 1;\n }\n\n /**\n * Relays a cross domain message to a contract.\n * @inheritdoc IL2CrossDomainMessenger\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) public {\n require(\n AddressAliasHelper.undoL1ToL2Alias(msg.sender) == l1CrossDomainMessenger,\n 'Provided message could not be verified.'\n );\n\n bytes memory xDomainCalldata = Lib_CrossDomainUtils.encodeXDomainCalldata(\n _target,\n _sender,\n _message,\n _messageNonce\n );\n\n bytes32 xDomainCalldataHash = keccak256(xDomainCalldata);\n\n require(\n successfulMessages[xDomainCalldataHash] == false,\n 'Provided message has already been received.'\n );\n\n // Prevent calls to OVM_L2ToL1MessagePasser, which would enable\n // an attacker to maliciously craft the _message to spoof\n // a call from any L2 account.\n if (_target == Lib_PredeployAddresses.L2_TO_L1_MESSAGE_PASSER) {\n // Write to the successfulMessages mapping and return immediately.\n successfulMessages[xDomainCalldataHash] = true;\n return;\n }\n\n xDomainMsgSender = _sender;\n (bool success, ) = _target.call(_message);\n xDomainMsgSender = Lib_DefaultValues.DEFAULT_XDOMAIN_SENDER;\n\n // Mark the message as received if the call was successful. Ensures that a message can be\n // relayed multiple times in the case that the call reverted.\n if (success == true) {\n successfulMessages[xDomainCalldataHash] = true;\n emit RelayedMessage(xDomainCalldataHash);\n } else {\n emit FailedRelayedMessage(xDomainCalldataHash);\n }\n\n // Store an identifier that can be used to prove that the given message was relayed by some\n // user. Gives us an easy way to pay relayers for their work.\n bytes32 relayId = keccak256(\n abi.encodePacked(xDomainCalldata, msg.sender, block.number)\n );\n\n relayedMessages[relayId] = true;\n }\n}\n" ++ }, ++ "contracts/L2/messaging/IL2CrossDomainMessenger.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport {ICrossDomainMessenger} from '../../libraries/bridge/ICrossDomainMessenger.sol';\n\n/**\n * @title IL2CrossDomainMessenger\n */\ninterface IL2CrossDomainMessenger is ICrossDomainMessenger {\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Relays a cross domain message to a contract.\n * @param _target Target contract address.\n * @param _sender Message sender address.\n * @param _message Message to send to the target.\n * @param _messageNonce Nonce for the provided message.\n */\n function relayMessage(\n address _target,\n address _sender,\n bytes memory _message,\n uint256 _messageNonce\n ) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title iOVM_L2ToL1MessagePasser\n */\ninterface iOVM_L2ToL1MessagePasser {\n /**********\n * Events *\n **********/\n\n event L2ToL1Message(uint256 _nonce, address _sender, bytes _data);\n\n /********************\n * Public Functions *\n ********************/\n\n function passMessageToL1(bytes calldata _message) external;\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport {iOVM_L2ToL1MessagePasser} from './iOVM_L2ToL1MessagePasser.sol';\n\n/**\n * @title OVM_L2ToL1MessagePasser\n * @dev The L2 to L1 Message Passer is a utility contract which facilitate an L1 proof of the\n * of a message on L2. The L1 Cross Domain Messenger performs this proof in its\n * _verifyStorageProof function, which verifies the existence of the transaction hash in this\n * contract's `sentMessages` mapping.\n */\ncontract OVM_L2ToL1MessagePasser is iOVM_L2ToL1MessagePasser {\n /**********************\n * Contract Variables *\n **********************/\n\n mapping(bytes32 => bool) public sentMessages;\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Passes a message to L1.\n * @param _message Message to pass to L1.\n */\n function passMessageToL1(bytes memory _message) public {\n // Note: although this function is public, only messages sent from the\n // L2CrossDomainMessenger will be relayed by the L1CrossDomainMessenger.\n // This is enforced by a check in L1CrossDomainMessenger._verifyStorageProof().\n sentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = true;\n }\n}\n" ++ }, ++ "contracts/libraries/bridge/CrossDomainEnabled.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/* Interface Imports */\nimport {ICrossDomainMessenger} from './ICrossDomainMessenger.sol';\n\n/**\n * @title CrossDomainEnabled\n * @dev Helper contract for contracts performing cross-domain communications\n *\n * Compiler used: defined by inheriting contract\n * Runtime target: defined by inheriting contract\n */\ncontract CrossDomainEnabled {\n /*************\n * Variables *\n *************/\n\n // Messenger contract used to send and recieve messages from the other domain.\n address public messenger;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _messenger Address of the CrossDomainMessenger on the current layer.\n */\n constructor(address _messenger) {\n messenger = _messenger;\n }\n\n /**********************\n * Function Modifiers *\n **********************/\n\n /**\n * Enforces that the modified function is only callable by a specific cross-domain account.\n * @param _sourceDomainAccount The only account on the originating domain which is\n * authenticated to call this function.\n */\n modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {\n require(\n msg.sender == address(getCrossDomainMessenger()),\n 'OVM_XCHAIN: messenger contract unauthenticated'\n );\n\n require(\n getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,\n 'OVM_XCHAIN: wrong sender of cross-domain message'\n );\n\n _;\n }\n\n /**********************\n * Internal Functions *\n **********************/\n\n /**\n * Gets the messenger, usually from storage. This function is exposed in case a child contract\n * needs to override.\n * @return The address of the cross-domain messenger contract which should be used.\n */\n function getCrossDomainMessenger()\n internal\n virtual\n returns (ICrossDomainMessenger)\n {\n return ICrossDomainMessenger(messenger);\n }\n\n /**q\n * Sends a message to an account on another domain\n * @param _crossDomainTarget The intended recipient on the destination domain\n * @param _message The data to send to the target (usually calldata to a function with\n * `onlyFromCrossDomainAccount()`)\n * @param _gasLimit The gasLimit for the receipt of the message on the target domain.\n */\n function sendCrossDomainMessage(\n address _crossDomainTarget,\n uint32 _gasLimit,\n bytes memory _message\n ) internal {\n getCrossDomainMessenger().sendMessage(\n _crossDomainTarget,\n _message,\n _gasLimit\n );\n }\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport {IL1StandardBridge} from '../../L1/messaging/IL1StandardBridge.sol';\nimport {IL1ERC20Bridge} from '../../L1/messaging/IL1ERC20Bridge.sol';\nimport {IL2ERC20Bridge} from './IL2ERC20Bridge.sol';\n\n/* Library Imports */\nimport {ERC165Checker} from '@openzeppelin/contracts/utils/introspection/ERC165Checker.sol';\nimport {CrossDomainEnabled} from '../../libraries/bridge/CrossDomainEnabled.sol';\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\n\n/* Contract Imports */\nimport {IL2StandardERC20} from '../../standards/IL2StandardERC20.sol';\n\n/**\n * @title L2StandardBridge\n * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to\n * enable ETH and ERC20 transitions between L1 and L2.\n * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard\n * bridge.\n * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1\n * bridge to release L1 funds.\n */\ncontract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {\n /********************************\n * External Contract References *\n ********************************/\n\n address public l1TokenBridge;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.\n * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.\n */\n constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)\n CrossDomainEnabled(_l2CrossDomainMessenger)\n {\n l1TokenBridge = _l1TokenBridge;\n }\n\n /***************\n * Withdrawing *\n ***************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l1Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external virtual {\n _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway\n * of the deposit.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from Account to pull the deposit from on L2.\n * @param _to Account to give the withdrawal to on L1.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateWithdrawal(\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) internal {\n // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2\n // usage\n IL2StandardERC20(_l2Token).burn(msg.sender, _amount);\n\n // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)\n address l1Token = IL2StandardERC20(_l2Token).l1Token();\n bytes memory message;\n\n if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {\n message = abi.encodeWithSelector(\n IL1StandardBridge.finalizeETHWithdrawal.selector,\n _from,\n _to,\n _amount,\n _data\n );\n } else {\n message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);\n\n emit WithdrawalInitiated(\n l1Token,\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _data\n );\n }\n\n /************************************\n * Cross-chain Function: Depositing *\n ************************************/\n\n /**\n * @inheritdoc IL2ERC20Bridge\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {\n // Check the target token is compliant and\n // verify the deposited token on L1 matches the L2 deposited token representation here\n if (\n ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&\n _l1Token == IL2StandardERC20(_l2Token).l1Token()\n ) {\n // When a deposit is finalized, we credit the account on L2 with the same amount of\n // tokens.\n IL2StandardERC20(_l2Token).mint(_to, _amount);\n emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);\n } else {\n // Either the L2 token which is being deposited-into disagrees about the correct address\n // of its L1 token, or does not support the correct interface.\n // This should only happen if there is a malicious L2 token, or if a user somehow\n // specified the wrong L2 token address to deposit into.\n // In either case, we stop the process here and construct a withdrawal\n // message so that users can get their funds out in some cases.\n // There is no way to prevent malicious token contracts altogether, but this does limit\n // user error and mitigate some forms of malicious contract behavior.\n bytes memory message = abi.encodeWithSelector(\n IL1ERC20Bridge.finalizeERC20Withdrawal.selector,\n _l1Token,\n _l2Token,\n _to, // switched the _to and _from here to bounce back the deposit to the sender\n _from,\n _amount,\n _data\n );\n\n // Send message up to L1 bridge\n sendCrossDomainMessage(l1TokenBridge, 0, message);\n emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/IL1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\nimport './IL1ERC20Bridge.sol';\n\n/**\n * @title IL1StandardBridge\n */\ninterface IL1StandardBridge is IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n event ETHDepositInitiated(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n event ETHWithdrawalFinalized(\n address indexed _from,\n address indexed _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev Deposit an amount of the ETH to the caller's balance on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;\n\n /**\n * @dev Deposit an amount of ETH to a recipient's balance on L2.\n * @param _to L2 address to credit the withdrawal to.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called\n * before the withdrawal is finalized.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L1/messaging/IL1ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.5.0 <0.9.0;\n\n/**\n * @title IL1ERC20Bridge\n */\ninterface IL1ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event ERC20DepositInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event ERC20WithdrawalFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L2 bridge contract.\n * @return Address of the corresponding L2 bridge contract.\n */\n function l2TokenBridge() external returns (address);\n\n /**\n * @dev deposit an amount of the ERC20 to the caller's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _amount Amount of the ERC20 to deposit\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev deposit an amount of ERC20 to a recipient's balance on L2.\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _to L2 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the\n * L1 ERC20 token.\n * This call will fail if the initialized withdrawal from L2 has not been finalized.\n *\n * @param _l1Token Address of L1 token to finalizeWithdrawal for.\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _from L2 address initiating the transfer.\n * @param _to L1 address to credit the withdrawal to.\n * @param _amount Amount of the ERC20 to deposit.\n * @param _data Data provided by the sender on L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "contracts/L2/messaging/IL2ERC20Bridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/**\n * @title IL2ERC20Bridge\n */\ninterface IL2ERC20Bridge {\n /**********\n * Events *\n **********/\n\n event WithdrawalInitiated(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFinalized(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n event DepositFailed(\n address indexed _l1Token,\n address indexed _l2Token,\n address indexed _from,\n address _to,\n uint256 _amount,\n bytes _data\n );\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * @dev get the address of the corresponding L1 bridge contract.\n * @return Address of the corresponding L1 bridge contract.\n */\n function l1TokenBridge() external returns (address);\n\n /**\n * @dev initiate a withdraw of some tokens to the caller's account on L1\n * @param _l2Token Address of L2 token where withdrawal was initiated.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdraw(\n address _l2Token,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /**\n * @dev initiate a withdraw of some token to a recipient's account on L1.\n * @param _l2Token Address of L2 token where withdrawal is initiated.\n * @param _to L1 adress to credit the withdrawal to.\n * @param _amount Amount of the token to withdraw.\n * param _l1Gas Unused, but included for potential forward compatibility considerations.\n * @param _data Optional data to forward to L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function withdrawTo(\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l1Gas,\n bytes calldata _data\n ) external;\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this\n * L2 token. This call will fail if it did not originate from a corresponding deposit in\n * L1StandardTokenBridge.\n * @param _l1Token Address for the l1 token this is called with\n * @param _l2Token Address for the l2 token this is called with\n * @param _from Account to pull the deposit from on L2.\n * @param _to Address to receive the withdrawal at\n * @param _amount Amount of the token to withdraw\n * @param _data Data provider by the sender on L1. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function finalizeDeposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external;\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface,\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n _supportsERC165Interface(account, type(IERC165).interfaceId) &&\n !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n *\n * _Available since v3.4._\n */\n function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)\n internal\n view\n returns (bool[] memory)\n {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in _interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!_supportsERC165Interface(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n * Interface identification is specified in ERC-165.\n */\n function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);\n (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);\n if (result.length < 32) return false;\n return success && abi.decode(result, (bool));\n }\n}\n" ++ }, ++ "contracts/standards/IL2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\ninterface IL2StandardERC20 is IERC20, IERC165 {\n function l1Token() external returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n\n event Mint(address indexed _account, uint256 _amount);\n event Burn(address indexed _account, uint256 _amount);\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/introspection/IERC165.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/IERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_SequencerFeeVault.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\n\n/* Contract Imports */\nimport {L2StandardBridge} from '../messaging/L2StandardBridge.sol';\n\n/**\n * @title OVM_SequencerFeeVault\n * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future\n * but \"good enough for now\".\n */\ncontract OVM_SequencerFeeVault {\n /*************\n * Constants *\n *************/\n\n // Minimum ETH balance that can be withdrawn in a single withdrawal.\n uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;\n\n /*************\n * Variables *\n *************/\n\n // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.\n address public l1FeeWallet;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.\n * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during\n * the genesis block. This is ONLY for testing purposes.\n */\n constructor(address _l1FeeWallet) {\n l1FeeWallet = _l1FeeWallet;\n }\n\n /************\n * Fallback *\n ************/\n\n receive() external payable {}\n\n /********************\n * Public Functions *\n ********************/\n\n function withdraw() public {\n require(\n address(this).balance >= MIN_WITHDRAWAL_AMOUNT,\n // solhint-disable-next-line max-line-length\n 'OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount'\n );\n\n L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(\n Lib_PredeployAddresses.OVM_ETH,\n l1FeeWallet,\n address(this).balance,\n 0,\n bytes('')\n );\n }\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_ETH.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\n\n/* Contract Imports */\nimport {L2StandardERC20} from '../../standards/L2StandardERC20.sol';\n\n/**\n * @title OVM_ETH\n * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that\n * unlike on Layer 1, Layer 2 accounts do not have a balance field.\n */\ncontract OVM_ETH is L2StandardERC20 {\n /***************\n * Constructor *\n ***************/\n\n constructor()\n L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n address(0),\n 'Ether',\n 'ETH',\n 18\n )\n {}\n\n // ETH ERC20 features are disabled until further notice.\n // Discussion here: https://github.com/ethereum-optimism/optimism/discussions/1444\n\n function transfer(address recipient, uint256 amount)\n public\n virtual\n override\n returns (bool)\n {\n revert(\n 'OVM_ETH: transfer is disabled pending further community discussion.'\n );\n }\n\n function approve(address spender, uint256 amount)\n public\n virtual\n override\n returns (bool)\n {\n revert(\n 'OVM_ETH: approve is disabled pending further community discussion.'\n );\n }\n\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n revert(\n 'OVM_ETH: transferFrom is disabled pending further community discussion.'\n );\n }\n\n function increaseAllowance(address spender, uint256 addedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\n 'OVM_ETH: increaseAllowance is disabled pending further community discussion.'\n );\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue)\n public\n virtual\n override\n returns (bool)\n {\n revert(\n 'OVM_ETH: decreaseAllowance is disabled pending further community discussion.'\n );\n }\n}\n" ++ }, ++ "contracts/standards/L2StandardERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\nimport {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol';\nimport './IL2StandardERC20.sol';\n\ncontract L2StandardERC20 is IL2StandardERC20, ERC20 {\n address public l1Token;\n address public l2Bridge;\n uint8 private immutable _decimals;\n\n /**\n * @param _l2Bridge Address of the L2 standard bridge.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param decimals_ ERC20 decimals.\n */\n constructor(\n address _l2Bridge,\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 decimals_\n ) ERC20(_name, _symbol) {\n l1Token = _l1Token;\n l2Bridge = _l2Bridge;\n _decimals = decimals_;\n }\n\n modifier onlyL2Bridge() {\n require(msg.sender == l2Bridge, 'Only L2 Bridge can mint and burn');\n _;\n }\n\n function supportsInterface(bytes4 _interfaceId) public pure returns (bool) {\n bytes4 firstSupportedInterface = bytes4(\n keccak256('supportsInterface(bytes4)')\n ); // ERC165\n bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^\n IL2StandardERC20.mint.selector ^\n IL2StandardERC20.burn.selector;\n return\n _interfaceId == firstSupportedInterface ||\n _interfaceId == secondSupportedInterface;\n }\n\n function mint(address _to, uint256 _amount) public virtual onlyL2Bridge {\n _mint(_to, _amount);\n\n emit Mint(_to, _amount);\n }\n\n function burn(address _from, uint256 _amount) public virtual onlyL2Bridge {\n _burn(_from, _amount);\n\n emit Burn(_from, _amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" ++ }, ++ "contracts/L2/predeploys/OVM_GasPriceOracle.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* External Imports */\nimport {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';\n\n/**\n * @title OVM_GasPriceOracle\n * @dev This contract exposes the current l2 gas price, a measure of how congested the network\n * currently is. This measure is used by the Sequencer to determine what fee to charge for\n * transactions. When the system is more congested, the l2 gas price will increase and fees\n * will also increase as a result.\n *\n * All public variables are set while generating the initial L2 state. The\n * constructor doesn't run in practice as the L2 state generation script uses\n * the deployed bytecode instead of running the initcode.\n */\ncontract OVM_GasPriceOracle is Ownable {\n /*************\n * Variables *\n *************/\n\n // Current L2 gas price\n uint256 public gasPrice;\n // Current L1 base fee\n uint256 public l1BaseFee;\n // Amortized cost of batch submission per transaction\n uint256 public overhead;\n // Value to scale the fee up by\n uint256 public scalar;\n // Number of decimals of the scalar\n uint256 public decimals;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _owner Address that will initially own this contract.\n */\n constructor(address _owner) Ownable() {\n transferOwnership(_owner);\n }\n\n /**********\n * Events *\n **********/\n\n event GasPriceUpdated(uint256);\n event L1BaseFeeUpdated(uint256);\n event OverheadUpdated(uint256);\n event ScalarUpdated(uint256);\n event DecimalsUpdated(uint256);\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Allows the owner to modify the l2 gas price.\n * @param _gasPrice New l2 gas price.\n */\n function setGasPrice(uint256 _gasPrice) public onlyOwner {\n gasPrice = _gasPrice;\n emit GasPriceUpdated(_gasPrice);\n }\n\n /**\n * Allows the owner to modify the l1 base fee.\n * @param _baseFee New l1 base fee\n */\n function setL1BaseFee(uint256 _baseFee) public onlyOwner {\n l1BaseFee = _baseFee;\n emit L1BaseFeeUpdated(_baseFee);\n }\n\n /**\n * Allows the owner to modify the overhead.\n * @param _overhead New overhead\n */\n function setOverhead(uint256 _overhead) public onlyOwner {\n overhead = _overhead;\n emit OverheadUpdated(_overhead);\n }\n\n /**\n * Allows the owner to modify the scalar.\n * @param _scalar New scalar\n */\n function setScalar(uint256 _scalar) public onlyOwner {\n scalar = _scalar;\n emit ScalarUpdated(_scalar);\n }\n\n /**\n * Allows the owner to modify the decimals.\n * @param _decimals New decimals\n */\n function setDecimals(uint256 _decimals) public onlyOwner {\n decimals = _decimals;\n emit DecimalsUpdated(_decimals);\n }\n\n /**\n * Computes the L1 portion of the fee\n * based on the size of the RLP encoded tx\n * and the current l1BaseFee\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return L1 fee that should be paid for the tx\n */\n function getL1Fee(bytes memory _data) public view returns (uint256) {\n uint256 l1GasUsed = getL1GasUsed(_data);\n uint256 l1Fee = l1GasUsed * l1BaseFee;\n uint256 divisor = 10**decimals;\n uint256 unscaled = l1Fee * scalar;\n uint256 scaled = unscaled / divisor;\n return scaled;\n }\n\n /**\n * Computes the amount of L1 gas used for a transaction\n * The overhead represents the per batch gas overhead of\n * posting both transaction and state roots to L1 given larger\n * batch sizes.\n * 4 gas for 0 byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33\n * 16 gas for non zero byte\n * https://github.com/ethereum/go-ethereum/blob/\n * 9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87\n * This will need to be updated if calldata gas prices change\n * Account for the transaction being unsigned\n * Padding is added to account for lack of signature on transaction\n * 1 byte for RLP V prefix\n * 1 byte for V\n * 1 byte for RLP R prefix\n * 32 bytes for R\n * 1 byte for RLP S prefix\n * 32 bytes for S\n * Total: 68 bytes of padding\n * @param _data Unsigned RLP encoded tx, 6 elements\n * @return Amount of L1 gas used for a transaction\n */\n function getL1GasUsed(bytes memory _data) public view returns (uint256) {\n uint256 total = 0;\n for (uint256 i = 0; i < _data.length; i++) {\n if (_data[i] == 0) {\n total += 4;\n } else {\n total += 16;\n }\n }\n uint256 unsigned = total + overhead;\n return unsigned + (68 * 16);\n }\n}\n" ++ }, ++ "contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_AddressManager} from './Lib_AddressManager.sol';\n\n/**\n * @title Lib_ResolvedDelegateProxy\n */\ncontract Lib_ResolvedDelegateProxy {\n /*************\n * Variables *\n *************/\n\n // Using mappings to store fields to avoid overwriting storage slots in the\n // implementation contract. For example, instead of storing these fields at\n // storage slot `0` & `1`, they are stored at `keccak256(key + slot)`.\n // See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html\n // NOTE: Do not use this code in your own contract system.\n // There is a known flaw in this contract, and we will remove it from the repository\n // in the near future. Due to the very limited way that we are using it, this flaw is\n // not an issue in our system.\n mapping(address => string) private implementationName;\n mapping(address => Lib_AddressManager) private addressManager;\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _libAddressManager Address of the Lib_AddressManager.\n * @param _implementationName implementationName of the contract to proxy to.\n */\n constructor(address _libAddressManager, string memory _implementationName) {\n addressManager[address(this)] = Lib_AddressManager(_libAddressManager);\n implementationName[address(this)] = _implementationName;\n }\n\n /*********************\n * Fallback Function *\n *********************/\n\n fallback() external payable {\n address target = addressManager[address(this)].getAddress(\n (implementationName[address(this)])\n );\n\n require(target != address(0), 'Target address must be initialized.');\n\n (bool success, bytes memory returndata) = target.delegatecall(msg.data);\n\n if (success == true) {\n assembly {\n return(add(returndata, 0x20), mload(returndata))\n }\n } else {\n assembly {\n revert(add(returndata, 0x20), mload(returndata))\n }\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" ++ }, ++ "@openzeppelin/contracts/utils/Address.sol": { ++ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" ++ }, ++ "contracts/L1/messaging/L1StandardBridge.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Interface Imports */\nimport {IL1StandardBridge} from './IL1StandardBridge.sol';\nimport {IL1ERC20Bridge} from './IL1ERC20Bridge.sol';\nimport {IL2ERC20Bridge} from '../../L2/messaging/IL2ERC20Bridge.sol';\nimport {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\n/* Library Imports */\nimport {CrossDomainEnabled} from '../../libraries/bridge/CrossDomainEnabled.sol';\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\nimport {Address} from '@openzeppelin/contracts/utils/Address.sol';\nimport {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\n/**\n * @title L1StandardBridge\n * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard\n * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits\n * and listening to it for newly finalized withdrawals.\n *\n * Runtime target: EVM\n */\ncontract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {\n using SafeERC20 for IERC20;\n\n /********************************\n * External Contract References *\n ********************************/\n\n address public l2TokenBridge;\n\n // Maps L1 token to L2 token to balance of the L1 token deposited\n mapping(address => mapping(address => uint256)) public deposits;\n\n /***************\n * Constructor *\n ***************/\n\n // This contract lives behind a proxy, so the constructor parameters will go unused.\n constructor() CrossDomainEnabled(address(0)) {}\n\n /******************\n * Initialization *\n ******************/\n\n /**\n * @param _l1messenger L1 Messenger address being used for cross-chain communications.\n * @param _l2TokenBridge L2 standard bridge address.\n */\n function initialize(address _l1messenger, address _l2TokenBridge) public {\n require(messenger == address(0), 'Contract has already been initialized.');\n messenger = _l1messenger;\n l2TokenBridge = _l2TokenBridge;\n }\n\n /**************\n * Depositing *\n **************/\n\n /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious\n * contract via initcode, but it takes care of the user error we want to avoid.\n */\n modifier onlyEOA() {\n // Used to stop deposits from contracts (avoid accidentally lost tokens)\n require(!Address.isContract(msg.sender), 'Account not EOA');\n _;\n }\n\n /**\n * @dev This function can be called with no data\n * to deposit an amount of ETH to the caller's balance on L2.\n * Since the receive function doesn't take data, a conservative\n * default amount is forwarded to L2.\n */\n receive() external payable onlyEOA {\n _initiateETHDeposit(msg.sender, msg.sender, 1_300_000, bytes(''));\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETH(uint32 _l2Gas, bytes calldata _data)\n external\n payable\n onlyEOA\n {\n _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data);\n }\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function depositETHTo(\n address _to,\n uint32 _l2Gas,\n bytes calldata _data\n ) external payable {\n _initiateETHDeposit(msg.sender, _to, _l2Gas, _data);\n }\n\n /**\n * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of\n * the deposit.\n * @param _from Account to pull the deposit from on L1.\n * @param _to Account to give the deposit to on L2.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateETHDeposit(\n address _from,\n address _to,\n uint32 _l2Gas,\n bytes memory _data\n ) internal {\n // Construct calldata for finalizeDeposit call\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n address(0),\n Lib_PredeployAddresses.OVM_ETH,\n _from,\n _to,\n msg.value,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n emit ETHDepositInitiated(_from, _to, msg.value, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20(\n address _l1Token,\n address _l2Token,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual onlyEOA {\n _initiateERC20Deposit(\n _l1Token,\n _l2Token,\n msg.sender,\n msg.sender,\n _amount,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function depositERC20To(\n address _l1Token,\n address _l2Token,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) external virtual {\n _initiateERC20Deposit(\n _l1Token,\n _l2Token,\n msg.sender,\n _to,\n _amount,\n _l2Gas,\n _data\n );\n }\n\n /**\n * @dev Performs the logic for deposits by informing the L2 Deposited Token\n * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)\n *\n * @param _l1Token Address of the L1 ERC20 we are depositing\n * @param _l2Token Address of the L1 respective L2 ERC20\n * @param _from Account to pull the deposit from on L1\n * @param _to Account to give the deposit to on L2\n * @param _amount Amount of the ERC20 to deposit.\n * @param _l2Gas Gas limit required to complete the deposit on L2.\n * @param _data Optional data to forward to L2. This data is provided\n * solely as a convenience for external contracts. Aside from enforcing a maximum\n * length, these contracts provide no guarantees about its content.\n */\n function _initiateERC20Deposit(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n uint32 _l2Gas,\n bytes calldata _data\n ) internal {\n // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future\n // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if\n // _from is an EOA or address(0).\n IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);\n\n // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)\n bytes memory message = abi.encodeWithSelector(\n IL2ERC20Bridge.finalizeDeposit.selector,\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n\n // Send calldata into L2\n sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);\n\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;\n\n emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);\n }\n\n /*************************\n * Cross-chain Functions *\n *************************/\n\n /**\n * @inheritdoc IL1StandardBridge\n */\n function finalizeETHWithdrawal(\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n (bool success, ) = _to.call{value: _amount}(new bytes(0));\n require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n\n emit ETHWithdrawalFinalized(_from, _to, _amount, _data);\n }\n\n /**\n * @inheritdoc IL1ERC20Bridge\n */\n function finalizeERC20Withdrawal(\n address _l1Token,\n address _l2Token,\n address _from,\n address _to,\n uint256 _amount,\n bytes calldata _data\n ) external onlyFromCrossDomainAccount(l2TokenBridge) {\n deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;\n\n // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer\n IERC20(_l1Token).safeTransfer(_to, _amount);\n\n emit ERC20WithdrawalFinalized(\n _l1Token,\n _l2Token,\n _from,\n _to,\n _amount,\n _data\n );\n }\n\n /*****************************\n * Temporary - Migrating ETH *\n *****************************/\n\n /**\n * @dev Adds ETH balance to the account. This is meant to allow for ETH\n * to be migrated from an old gateway to a new gateway.\n * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the\n * old contract\n */\n function donateETH() external payable {}\n}\n" ++ }, ++ "contracts/L2/messaging/L2StandardTokenFactory.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Contract Imports */\nimport {L2StandardERC20} from '../../standards/L2StandardERC20.sol';\nimport {Lib_PredeployAddresses} from '../../libraries/constants/Lib_PredeployAddresses.sol';\n\n/**\n * @title L2StandardTokenFactory\n * @dev Factory contract for creating standard L2 token representations of L1 ERC20s\n * compatible with and working on the standard bridge.\n */\ncontract L2StandardTokenFactory {\n event StandardL2TokenCreated(\n address indexed _l1Token,\n address indexed _l2Token\n );\n\n /**\n * @dev Creates an instance of the standard ERC20 token on L2.\n * @param _l1Token Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n * @param _decimals ERC20 decimals.\n */\n function createStandardL2Token(\n address _l1Token,\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) external {\n require(_l1Token != address(0), 'Must provide L1 token address');\n\n L2StandardERC20 l2Token = new L2StandardERC20(\n Lib_PredeployAddresses.L2_STANDARD_BRIDGE,\n _l1Token,\n _name,\n _symbol,\n _decimals\n );\n\n emit StandardL2TokenCreated(_l1Token, address(l2Token));\n }\n}\n" ++ }, ++ "contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {AddressAliasHelper} from '../../standards/AddressAliasHelper.sol';\n\n/**\n * @title TestLib_AddressAliasHelper\n */\ncontract TestLib_AddressAliasHelper {\n function applyL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.applyL1ToL2Alias(_address);\n }\n\n function undoL1ToL2Alias(address _address) public pure returns (address) {\n return AddressAliasHelper.undoL1ToL2Alias(_address);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPReader.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_RLPReader} from '../../libraries/rlp/Lib_RLPReader.sol';\n\n/**\n * @title TestLib_RLPReader\n */\ncontract TestLib_RLPReader {\n function readList(bytes memory _in) public pure returns (bytes[] memory) {\n Lib_RLPReader.RLPItem[] memory decoded = Lib_RLPReader.readList(_in);\n bytes[] memory out = new bytes[](decoded.length);\n for (uint256 i = 0; i < out.length; i++) {\n out[i] = Lib_RLPReader.readRawBytes(decoded[i]);\n }\n return out;\n }\n\n function readString(bytes memory _in) public pure returns (string memory) {\n return Lib_RLPReader.readString(_in);\n }\n\n function readBytes(bytes memory _in) public pure returns (bytes memory) {\n return Lib_RLPReader.readBytes(_in);\n }\n\n function readBytes32(bytes memory _in) public pure returns (bytes32) {\n return Lib_RLPReader.readBytes32(_in);\n }\n\n function readUint256(bytes memory _in) public pure returns (uint256) {\n return Lib_RLPReader.readUint256(_in);\n }\n\n function readBool(bytes memory _in) public pure returns (bool) {\n return Lib_RLPReader.readBool(_in);\n }\n\n function readAddress(bytes memory _in) public pure returns (address) {\n return Lib_RLPReader.readAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_MerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_MerkleTrie} from '../../libraries/trie/Lib_MerkleTrie.sol';\n\n/**\n * @title TestLib_MerkleTrie\n */\ncontract TestLib_MerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return Lib_MerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_MerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_MerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/rlp/TestLib_RLPWriter.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_RLPWriter} from '../../libraries/rlp/Lib_RLPWriter.sol';\nimport {TestERC20} from '../../test-helpers/TestERC20.sol';\n\n/**\n * @title TestLib_RLPWriter\n */\ncontract TestLib_RLPWriter {\n function writeBytes(bytes memory _in)\n public\n pure\n returns (bytes memory _out)\n {\n return Lib_RLPWriter.writeBytes(_in);\n }\n\n function writeList(bytes[] memory _in)\n public\n pure\n returns (bytes memory _out)\n {\n return Lib_RLPWriter.writeList(_in);\n }\n\n function writeString(string memory _in)\n public\n pure\n returns (bytes memory _out)\n {\n return Lib_RLPWriter.writeString(_in);\n }\n\n function writeAddress(address _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeAddress(_in);\n }\n\n function writeUint(uint256 _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeUint(_in);\n }\n\n function writeBool(bool _in) public pure returns (bytes memory _out) {\n return Lib_RLPWriter.writeBool(_in);\n }\n\n function writeAddressWithTaintedMemory(address _in)\n public\n returns (bytes memory _out)\n {\n new TestERC20();\n return Lib_RLPWriter.writeAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-helpers/TestERC20.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n// a test ERC20 token with an open mint function\ncontract TestERC20 {\n string public constant name = 'Test';\n string public constant symbol = 'TST';\n uint8 public constant decimals = 18;\n uint256 public totalSupply;\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n constructor() {}\n\n function mint(address to, uint256 value) public {\n totalSupply = totalSupply + value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(address(0), to, value);\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 value\n ) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(\n address from,\n address to,\n uint256 value\n ) private {\n balanceOf[from] = balanceOf[from] - value;\n balanceOf[to] = balanceOf[to] + value;\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint256 value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint256 value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool) {\n if (allowance[from][msg.sender] != type(uint256).max) {\n allowance[from][msg.sender] = allowance[from][msg.sender] - value;\n }\n _transfer(from, to, value);\n return true;\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_BytesUtils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_BytesUtils} from '../../libraries/utils/Lib_BytesUtils.sol';\nimport {TestERC20} from '../../test-helpers/TestERC20.sol';\n\n/**\n * @title TestLib_BytesUtils\n */\ncontract TestLib_BytesUtils {\n function concat(bytes memory _preBytes, bytes memory _postBytes)\n public\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(_preBytes, _postBytes);\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public pure returns (bytes memory) {\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n\n function toBytes32(bytes memory _bytes) public pure returns (bytes32) {\n return Lib_BytesUtils.toBytes32(_bytes);\n }\n\n function toUint256(bytes memory _bytes) public pure returns (uint256) {\n return Lib_BytesUtils.toUint256(_bytes);\n }\n\n function toNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.toNibbles(_bytes);\n }\n\n function fromNibbles(bytes memory _bytes) public pure returns (bytes memory) {\n return Lib_BytesUtils.fromNibbles(_bytes);\n }\n\n function equal(bytes memory _bytes, bytes memory _other)\n public\n pure\n returns (bool)\n {\n return Lib_BytesUtils.equal(_bytes, _other);\n }\n\n function sliceWithTaintedMemory(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n ) public returns (bytes memory) {\n new TestERC20();\n return Lib_BytesUtils.slice(_bytes, _start, _length);\n }\n}\n" ++ }, ++ "contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_SecureMerkleTrie} from '../../libraries/trie/Lib_SecureMerkleTrie.sol';\n\n/**\n * @title TestLib_SecureMerkleTrie\n */\ncontract TestLib_SecureMerkleTrie {\n function verifyInclusionProof(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool) {\n return\n Lib_SecureMerkleTrie.verifyInclusionProof(_key, _value, _proof, _root);\n }\n\n function update(\n bytes memory _key,\n bytes memory _value,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bytes32) {\n return Lib_SecureMerkleTrie.update(_key, _value, _proof, _root);\n }\n\n function get(\n bytes memory _key,\n bytes memory _proof,\n bytes32 _root\n ) public pure returns (bool, bytes memory) {\n return Lib_SecureMerkleTrie.get(_key, _proof, _root);\n }\n\n function getSingleNodeRootHash(bytes memory _key, bytes memory _value)\n public\n pure\n returns (bytes32)\n {\n return Lib_SecureMerkleTrie.getSingleNodeRootHash(_key, _value);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_Bytes32Utils.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_Bytes32Utils} from '../../libraries/utils/Lib_Bytes32Utils.sol';\n\n/**\n * @title TestLib_Byte32Utils\n */\ncontract TestLib_Bytes32Utils {\n function toBool(bytes32 _in) public pure returns (bool _out) {\n return Lib_Bytes32Utils.toBool(_in);\n }\n\n function fromBool(bool _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromBool(_in);\n }\n\n function toAddress(bytes32 _in) public pure returns (address _out) {\n return Lib_Bytes32Utils.toAddress(_in);\n }\n\n function fromAddress(address _in) public pure returns (bytes32 _out) {\n return Lib_Bytes32Utils.fromAddress(_in);\n }\n}\n" ++ }, ++ "contracts/test-libraries/utils/TestLib_MerkleTree.sol": { ++ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\n/* Library Imports */\nimport {Lib_MerkleTree} from '../../libraries/utils/Lib_MerkleTree.sol';\n\n/**\n * @title TestLib_MerkleTree\n */\ncontract TestLib_MerkleTree {\n function getMerkleRoot(bytes32[] memory _elements)\n public\n pure\n returns (bytes32)\n {\n return Lib_MerkleTree.getMerkleRoot(_elements);\n }\n\n function verify(\n bytes32 _root,\n bytes32 _leaf,\n uint256 _index,\n bytes32[] memory _siblings,\n uint256 _totalLeaves\n ) public pure returns (bool) {\n return Lib_MerkleTree.verify(_root, _leaf, _index, _siblings, _totalLeaves);\n }\n}\n" ++ } ++ }, ++ "settings": { ++ "optimizer": { ++ "enabled": true, ++ "runs": 10000 ++ }, ++ "metadata": { ++ "bytecodeHash": "none", ++ "useLiteralContent": true ++ }, ++ "outputSelection": { ++ "*": { ++ "*": [ ++ "storageLayout", ++ "abi", ++ "evm.bytecode", ++ "evm.deployedBytecode", ++ "evm.methodIdentifiers", ++ "metadata", ++ "devdoc", ++ "userdoc", ++ "evm.gasEstimates" ++ ], ++ "": [ ++ "ast" ++ ] ++ } ++ } ++ } ++} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.d.ts b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.d.ts +new file mode 100644 +index 0000000..870d292 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.d.ts +@@ -0,0 +1,3 @@ ++export declare const L2GovernanceERC20Helper: { ++ L2GovernanceERC20Bytecode: string; ++}; +diff --git a/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js +new file mode 100644 +index 0000000..b62745a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js +@@ -0,0 +1,7 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.L2GovernanceERC20Helper = void 0; ++exports.L2GovernanceERC20Helper = { ++ L2GovernanceERC20Bytecode: "0x608060405234801561001057600080fd5b506004361061025c5760003560e01c80637ecebe0011610145578063b4b5ea57116100bd578063ce665dd81161008c578063d5abeb0111610071578063d5abeb01146105c6578063dd62ed3e14610606578063f1127ed81461063f57600080fd5b8063ce665dd8146105ab578063d505accf146105b357600080fd5b8063b4b5ea571461054b578063c01e1bd61461055e578063c3cda52014610571578063caac6c821461058457600080fd5b80639dc29fac11610114578063a9059cbb116100f9578063a9059cbb146104fe578063a9e91e5414610511578063ae1f6aaf1461053857600080fd5b80639dc29fac146104d8578063a457c2d7146104eb57600080fd5b80637ecebe00146104975780638e539e8c146104aa57806395d89b41146104bd5780639ab24eb0146104c557600080fd5b80633a46b1a8116101d85780635d2dab0b116101a757806370a082311161018c57806370a0823114610417578063712ac56d14610440578063782d6fe11461046757600080fd5b80635d2dab0b146103c85780636fcfff45146103ef57600080fd5b80633a46b1a81461034957806340c10f191461035c578063587cde1e146103715780635c19a95c146103b557600080fd5b806323b872dd1161022f578063313ce56711610214578063313ce567146102fd5780633644e5151461032e578063395093511461033657600080fd5b806323b872dd146102c35780632b437d48146102d657600080fd5b806301ffc9a71461026157806306fdde0314610289578063095ea7b31461029e57806318160ddd146102b1575b600080fd5b61027461026f36600461228b565b610691565b60405190151581526020015b60405180910390f35b610291610751565b60405161028091906122cd565b6102746102ac36600461235c565b6107e3565b6002545b604051908152602001610280565b6102746102d1366004612386565b6107f9565b6102b57f0000000000000000000000000000000000000000000000000000000000007a6a81565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000012168152602001610280565b6102b56108bd565b61027461034436600461235c565b6108cc565b6102b561035736600461235c565b610908565b61036f61036a36600461235c565b610982565b005b61039d61037f3660046123c2565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b039091168152602001610280565b61036f6103c33660046123c2565b610a2d565b6102b57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6104026103fd3660046123c2565b610a3a565b60405163ffffffff9091168152602001610280565b6102b56104253660046123c2565b6001600160a01b031660009081526020819052604090205490565b6102b57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b61047a61047536600461235c565b610a62565b6040516bffffffffffffffffffffffff9091168152602001610280565b6102b56104a53660046123c2565b610a76565b6102b56104b83660046123dd565b610a94565b610291610af0565b6102b56104d33660046123c2565b610aff565b61036f6104e636600461235c565b610bb0565b6102746104f936600461235c565b610c4f565b61027461050c36600461235c565b610d00565b6102b57f27d034498a99c991303396eb29246eae27701b2013c53b70ab25a53b3104a48d81565b600a5461039d906001600160a01b031681565b61047a6105593660046123c2565b610d0d565b60095461039d906001600160a01b031681565b61036f61057f366004612407565b610d1b565b6102b57f23ef304bd30f48f152c27dd887ad56e5efbd0d565372442edf0886603c00527381565b6102b5600081565b61036f6105c136600461245f565b610e51565b6105d96b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610280565b6102b56106143660046124c9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61065261064d3660046124fc565b610fb5565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169281019290925201610280565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061074957507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546107609061253c565b80601f016020809104026020016040519081016040528092919081815260200182805461078c9061253c565b80156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f033848461104e565b50600192915050565b60006108068484846111a6565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156108a55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6108b2853385840361104e565b506001949350505050565b60006108c76113c9565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107f09185906109039086906125b9565b61104e565b60004382106109595760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161089c565b6001600160a01b038316600090815260076020526040902061097b90836114d0565b9392505050565b600a546001600160a01b031633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161089c565b6109e682826115c4565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610a2191815260200190565b60405180910390a25050565b610a3733826115d2565b50565b6001600160a01b038116600090815260076020526040812054610a5c90611663565b92915050565b600061097b610a718484610908565b6116e3565b6001600160a01b038116600090815260056020526040812054610a5c565b6000438210610ae55760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161089c565b610a5c6008836114d0565b6060600480546107609061253c565b6001600160a01b0381166000908152600760205260408120548015610b88576001600160a01b0383166000908152600760205260409020610b416001836125d1565b81548110610b5157610b516125e8565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b8b565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b600a546001600160a01b03163314610c0a5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161089c565b610c148282611767565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a2191815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ce95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161089c565b610cf6338585840361104e565b5060019392505050565b60006107f03384846111a6565b6000610a5c610a7183610aff565b83421115610d6b5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161089c565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610de590610ddd9060a00160405160208183030381529060405280519060200120611771565b8585856117da565b9050610df081611802565b8614610e3e5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161089c565b610e4881886115d2565b50505050505050565b83421115610ea15760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161089c565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610ed08c611802565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f2b82611771565b90506000610f3b828787876117da565b9050896001600160a01b0316816001600160a01b031614610f9e5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161089c565b610fa98a8a8a61104e565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110610ff957610ff96125e8565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b6001600160a01b0383166110c95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0382166111455760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166112225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b03821661129e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0383166000908152602081905260409020548181101561132d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113649084906125b9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113b091815260200190565b60405180910390a36113c384848461182f565b50505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a46141561141857507f27d034498a99c991303396eb29246eae27701b2013c53b70ab25a53b3104a48d90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f23ef304bd30f48f152c27dd887ad56e5efbd0d565372442edf0886603c005273828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015246608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b60006114dc81836125b9565b835490925060005b818110156115415760006114f8828461183a565b90508486828154811061150d5761150d6125e8565b60009182526020909120015463ffffffff16111561152d5780925061153b565b6115388160016125b9565b91505b506114e4565b811561159a57846115536001846125d1565b81548110611563576115636125e8565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661159d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b6115ce8282611855565b5050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46113c38284836118f1565b600063ffffffff8211156116df5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f3220626974730000000000000000000000000000000000000000000000000000606482015260840161089c565b5090565b60006bffffffffffffffffffffffff8211156116df5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f3620626974730000000000000000000000000000000000000000000000000000606482015260840161089c565b6115ce8282611a2e565b6000610a5c61177e6113c9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006117eb87878787611a46565b915091506117f881611b51565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b505050565b61182a838383611d42565b60006118496002848418612617565b61097b908484166125b9565b61185f8282611d74565b6002546b019d971e4fe8401e7400000010156118e35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f74657300000000000000000000000000000000606482015260840161089c565b6113c36008611e5b83611e67565b816001600160a01b0316836001600160a01b0316141580156119135750600081115b1561182a576001600160a01b038316156119a1576001600160a01b0383166000908152600760205260408120819061194e9061205f85611e67565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611996929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561182a576001600160a01b038216600090815260076020526040812081906119d790611e5b85611e67565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611a1f929190918252602082015260400190565b60405180910390a25050505050565b611a38828261206b565b6113c3600861205f83611e67565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611a7d5750600090506003611b48565b8460ff16601b14158015611a9557508460ff16601c14155b15611aa65750600090506004611b48565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611afa573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116611b4157600060019250925050611b48565b9150600090505b94509492505050565b6000816004811115611b6557611b65612652565b1415611b6e5750565b6001816004811115611b8257611b82612652565b1415611bd05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161089c565b6002816004811115611be457611be4612652565b1415611c325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161089c565b6003816004811115611c4657611c46612652565b1415611cba5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6004816004811115611cce57611cce612652565b1415610a375760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0383811660009081526006602052604080822054858416835291205461182a929182169116836118f1565b6001600160a01b038216611dca5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161089c565b8060026000828254611ddc91906125b9565b90915550506001600160a01b03821660009081526020819052604081208054839290611e099084906125b9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36115ce6000838361182f565b600061097b82846125b9565b825460009081908015611ec75785611e806001836125d1565b81548110611e9057611e906125e8565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611eca565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611ef883858763ffffffff16565b9150600081118015611f405750611f106000436125b9565b86611f1c6001846125d1565b81548110611f2c57611f2c6125e8565b60009182526020909120015463ffffffff16145b15611fca57611f4e826121f7565b86611f5a6001846125d1565b81548110611f6a57611f6a6125e8565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612056565b856040518060400160405280611feb600043611fe691906125b9565b611663565b63ffffffff168152602001611fff856121f7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b600061097b82846125d1565b6001600160a01b0382166120e75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b038216600090815260208190526040902054818110156121765760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906121a59084906125d1565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361182a8360008461182f565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156116df5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f3234206269747300000000000000000000000000000000000000000000000000606482015260840161089c565b60006020828403121561229d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461097b57600080fd5b600060208083528351808285015260005b818110156122fa578581018301518582016040015282016122de565b8181111561230c576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b038116811461235757600080fd5b919050565b6000806040838503121561236f57600080fd5b61237883612340565b946020939093013593505050565b60008060006060848603121561239b57600080fd5b6123a484612340565b92506123b260208501612340565b9150604084013590509250925092565b6000602082840312156123d457600080fd5b61097b82612340565b6000602082840312156123ef57600080fd5b5035919050565b803560ff8116811461235757600080fd5b60008060008060008060c0878903121561242057600080fd5b61242987612340565b95506020870135945060408701359350612445606088016123f6565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561247a57600080fd5b61248388612340565b965061249160208901612340565b955060408801359450606088013593506124ad608089016123f6565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156124dc57600080fd5b6124e583612340565b91506124f360208401612340565b90509250929050565b6000806040838503121561250f57600080fd5b61251883612340565b9150602083013563ffffffff8116811461253157600080fd5b809150509250929050565b600181811c9082168061255057607f821691505b60208210811415611824577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156125cc576125cc61258a565b500190565b6000828210156125e3576125e361258a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008261264d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a" ++}; ++//# sourceMappingURL=L2GovernanceERC20Helper.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js.map b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js.map +new file mode 100644 +index 0000000..0852a9d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2GovernanceERC20Helper.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"L2GovernanceERC20Helper.js","sourceRoot":"","sources":["../src/L2GovernanceERC20Helper.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG;IACrC,yBAAyB,EAAE,gymBAAgymB;CAC5zmB,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.d.ts b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.d.ts +new file mode 100644 +index 0000000..baf3c2e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.d.ts +@@ -0,0 +1,3 @@ ++export declare const L2_BOBA: { ++ L2_BOBABytecode: string; ++}; +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js +new file mode 100644 +index 0000000..48b3e74 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js +@@ -0,0 +1,7 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.L2_BOBA = void 0; ++exports.L2_BOBA = { ++ L2_BOBABytecode: "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c6d565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610cb6565b610118610150366004610d52565b610425565b6002545b604051908152602001610124565b610118610175366004610d7c565b6104db565b60405160128152602001610124565b610118610197366004610d52565b61058c565b6101af6101aa366004610d52565b61063d565b005b6101596101bf366004610db8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561071c565b6101af6101fd366004610d52565b61072b565b610118610210366004610d52565b6107fe565b610118610223366004610d52565b6108af565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610dd3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610e06565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610e06565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4c325f424f42413a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4c325f424f42413a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6106c88282610960565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161071091815260200190565b60405180910390a25050565b6060600480546103a290610e06565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6107b68282610a80565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161071091815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c325f424f42413a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b73ffffffffffffffffffffffffffffffffffffffff82166109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d2565b80600260008282546109ef9190610e89565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a29908490610e89565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c15908490610ea1565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610c7f57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610caf57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ce357858101830151858201604001528201610cc7565b81811115610cf5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d4d57600080fd5b919050565b60008060408385031215610d6557600080fd5b610d6e83610d29565b946020939093013593505050565b600080600060608486031215610d9157600080fd5b610d9a84610d29565b9250610da860208501610d29565b9150604084013590509250925092565b600060208284031215610dca57600080fd5b610caf82610d29565b60008060408385031215610de657600080fd5b610def83610d29565b9150610dfd60208401610d29565b90509250929050565b600181811c90821680610e1a57607f821691505b60208210811415610e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610e9c57610e9c610e5a565b500190565b600082821015610eb357610eb3610e5a565b50039056fea164736f6c6343000809000a" ++}; ++//# sourceMappingURL=L2_BOBAHelper.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js.map b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js.map +new file mode 100644 +index 0000000..d8f9886 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_BOBAHelper.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"L2_BOBAHelper.js","sourceRoot":"","sources":["../src/L2_BOBAHelper.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG;IACrB,eAAe,EACjB,84OAA84O;CAC74O,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.d.ts b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.d.ts +new file mode 100644 +index 0000000..5dee988 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.d.ts +@@ -0,0 +1,14 @@ ++export declare const L2_L1NativeTokenHepler: { ++ FantomLocalBytecode: string; ++ FantomTestnetBytecode: string; ++ FantomMainnetBytecode: string; ++ MoonbeamLocalBytecode: string; ++ MoonbeamTestnetBytecode: string; ++ MoonbeamMainnetBytecode: string; ++ AvalancheLocalByteCode: string; ++ AvalancheTestnetByteCode: string; ++ AvalancheMainnetByteCode: string; ++ BnbLocalBytecode: string; ++ BnbTestnetBytecode: string; ++ BnbMainnetBytecode: string; ++}; +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js +new file mode 100644 +index 0000000..c8259db +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js +@@ -0,0 +1,18 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.L2_L1NativeTokenHepler = void 0; ++exports.L2_L1NativeTokenHepler = { ++ FantomLocalBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115a9565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f2565b6101696101a136600461168e565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116b8565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461168e565b6105bb565b61022961022436600461168e565b610604565b005b6101aa6102393660046116f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f4565b6106c9565b6101866106f6565b61022961028a36600461168e565b610705565b61016961029d36600461168e565b6107be565b6101696102b036600461168e565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b61022961032836600461170f565b610889565b6101aa61033b366004611782565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b5565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b5565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611832565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f00565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b5565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f0e565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f18565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4d565b9050600061098082878787610fb6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611832565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507f49f9dd8016df52393be2caeacbcaee912a3173c6cf3503d132bef9c9e7f433fc90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fcbf2a723bab3288b57db0bfae9d136af04a5c70c9acd46aad23acb67ef5fe179828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015246608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0a8282610fde565b5050565b610f0a82826110e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5a610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc78787878761129d565b91509150610fd4816113b5565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110539190611832565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108d908490611832565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112095760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124590849061184a565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d457506000905060036113ac565b8460ff16601b141580156112ec57508460ff16601c14155b156112fd57506000905060046113ac565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611351573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a5576000600192509250506113ac565b9150600090505b94509492505050565b60008160048111156113c9576113c9611861565b14156113d25750565b60018160048111156113e6576113e6611861565b14156114345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144857611448611861565b14156114965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114aa576114aa611861565b141561151e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153257611532611861565b14156115a65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bb57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115eb57600080fd5b9392505050565b600060208083528351808285015260005b8181101561161f57858101830151858201604001528201611603565b81811115611631576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168957600080fd5b919050565b600080604083850312156116a157600080fd5b6116aa83611665565b946020939093013593505050565b6000806000606084860312156116cd57600080fd5b6116d684611665565b92506116e460208501611665565b9150604084013590509250925092565b60006020828403121561170657600080fd5b6115eb82611665565b600080600080600080600060e0888a03121561172a57600080fd5b61173388611665565b965061174160208901611665565b95506040880135945060608801359350608088013560ff8116811461176557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179557600080fd5b61179e83611665565b91506117ac60208401611665565b90509250929050565b600181811c908216806117c957607f821691505b60208210811415610f47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184557611845611803565b500190565b60008282101561185c5761185c611803565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ FantomTestnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115a9565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f2565b6101696101a136600461168e565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116b8565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461168e565b6105bb565b61022961022436600461168e565b610604565b005b6101aa6102393660046116f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f4565b6106c9565b6101866106f6565b61022961028a36600461168e565b610705565b61016961029d36600461168e565b6107be565b6101696102b036600461168e565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b61022961032836600461170f565b610889565b6101aa61033b366004611782565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b5565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b5565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611832565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f00565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b5565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f0e565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f18565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4d565b9050600061098082878787610fb6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611832565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000fd3461415610e4857507f49f9dd8016df52393be2caeacbcaee912a3173c6cf3503d132bef9c9e7f433fc90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fcbf2a723bab3288b57db0bfae9d136af04a5c70c9acd46aad23acb67ef5fe179828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015246608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0a8282610fde565b5050565b610f0a82826110e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5a610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc78787878761129d565b91509150610fd4816113b5565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110539190611832565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108d908490611832565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112095760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124590849061184a565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d457506000905060036113ac565b8460ff16601b141580156112ec57508460ff16601c14155b156112fd57506000905060046113ac565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611351573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a5576000600192509250506113ac565b9150600090505b94509492505050565b60008160048111156113c9576113c9611861565b14156113d25750565b60018160048111156113e6576113e6611861565b14156114345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144857611448611861565b14156114965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114aa576114aa611861565b141561151e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153257611532611861565b14156115a65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bb57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115eb57600080fd5b9392505050565b600060208083528351808285015260005b8181101561161f57858101830151858201604001528201611603565b81811115611631576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168957600080fd5b919050565b600080604083850312156116a157600080fd5b6116aa83611665565b946020939093013593505050565b6000806000606084860312156116cd57600080fd5b6116d684611665565b92506116e460208501611665565b9150604084013590509250925092565b60006020828403121561170657600080fd5b6115eb82611665565b600080600080600080600060e0888a03121561172a57600080fd5b61173388611665565b965061174160208901611665565b95506040880135945060608801359350608088013560ff8116811461176557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179557600080fd5b61179e83611665565b91506117ac60208401611665565b90509250929050565b600181811c908216806117c957607f821691505b60208210811415610f47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184557611845611803565b500190565b60008282101561185c5761185c611803565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ FantomMainnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507f33169c2cf4dda5b51c41d850a0ce78f38bd4eecc557c1f805f0c27b8cfc95f4d90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fcbf2a723bab3288b57db0bfae9d136af04a5c70c9acd46aad23acb67ef5fe179828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015261012d608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ MoonbeamLocalBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115a9565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f2565b6101696101a136600461168e565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116b8565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461168e565b6105bb565b61022961022436600461168e565b610604565b005b6101aa6102393660046116f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f4565b6106c9565b6101866106f6565b61022961028a36600461168e565b610705565b61016961029d36600461168e565b6107be565b6101696102b036600461168e565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b61022961032836600461170f565b610889565b6101aa61033b366004611782565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b5565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b5565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611832565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f00565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b5565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f0e565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f18565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4d565b9050600061098082878787610fb6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611832565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fe105636509118d0a5fd54a30f216beea9e18df270a7ae0815ab63cee2c95bd8890565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f99a49606e97aa9d58789783bd4cdfcc3ab4072167b449d1e303cb1135216531b828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015246608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0a8282610fde565b5050565b610f0a82826110e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5a610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc78787878761129d565b91509150610fd4816113b5565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110539190611832565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108d908490611832565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112095760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124590849061184a565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d457506000905060036113ac565b8460ff16601b141580156112ec57508460ff16601c14155b156112fd57506000905060046113ac565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611351573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a5576000600192509250506113ac565b9150600090505b94509492505050565b60008160048111156113c9576113c9611861565b14156113d25750565b60018160048111156113e6576113e6611861565b14156114345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144857611448611861565b14156114965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114aa576114aa611861565b141561151e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153257611532611861565b14156115a65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bb57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115eb57600080fd5b9392505050565b600060208083528351808285015260005b8181101561161f57858101830151858201604001528201611603565b81811115611631576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168957600080fd5b919050565b600080604083850312156116a157600080fd5b6116aa83611665565b946020939093013593505050565b6000806000606084860312156116cd57600080fd5b6116d684611665565b92506116e460208501611665565b9150604084013590509250925092565b60006020828403121561170657600080fd5b6115eb82611665565b600080600080600080600060e0888a03121561172a57600080fd5b61173388611665565b965061174160208901611665565b95506040880135945060608801359350608088013560ff8116811461176557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179557600080fd5b61179e83611665565b91506117ac60208401611665565b90509250929050565b600181811c908216806117c957607f821691505b60208210811415610f47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184557611845611803565b500190565b60008282101561185c5761185c611803565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ MoonbeamTestnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fe9057b598888fbf604864e31f95fc921b6bd0d126c67e456a543e5b01597a5c890565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f99a49606e97aa9d58789783bd4cdfcc3ab4072167b449d1e303cb1135216531b828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060830152610511608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ MoonbeamMainnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507f999d00b7b45546159ba303bd0e4cde20fb48e990df4357a54bf0709eccf81e5090565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f99a49606e97aa9d58789783bd4cdfcc3ab4072167b449d1e303cb1135216531b828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015261050e608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ AvalancheLocalByteCode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507f50ea5b69e4e1ec6b4e16e431b748dfaaf68c8346938c4c28883a1077fb984c4e90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6585177c3aba6cb7ffc0a37e831a958c4ee9278e4c62c7bdad7175ca09883c40828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060830152617a6a608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ AvalancheTestnetByteCode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fefc1fbd4da040202a9357d520bb582a97aac270fc066e186e9fb9706cb52756690565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6585177c3aba6cb7ffc0a37e831a958c4ee9278e4c62c7bdad7175ca09883c40828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301526110e8608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ AvalancheMainnetByteCode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507f252d3f0c8ca03992c356eff1ada000c7bb9d816d370e09cb88229d8ac0f20fd590565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6585177c3aba6cb7ffc0a37e831a958c4ee9278e4c62c7bdad7175ca09883c40828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015261a918608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ BnbLocalBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fa51baaf6b61306cddcce9c9cf68abc8d7d1eaa44077f3fa4a2eebcf62d77170d90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060830152617a6a608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ BnbTestnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fbf4bf03291e149b7bbf7fd7163a94159e8b1929977934fa5648cf08d77e6182790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060830152612600608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a", ++ BnbMainnetBytecode: "0x608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b6101696101643660046115ab565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115f4565b6101696101a1366004611690565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116ba565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b610169610211366004611690565b6105bb565b610229610224366004611690565b610604565b005b6101aa6102393660046116f6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116f6565b6106c9565b6101866106f6565b61022961028a366004611690565b610705565b61016961029d366004611690565b6107be565b6101696102b0366004611690565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b610229610328366004611711565b610889565b6101aa61033b366004611784565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117b7565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117b7565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff908690611834565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610f02565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117b7565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610f10565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109088c610f1a565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f4f565b9050600061098082878787610fb8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d85908490611834565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000007a6a461415610e4857507fd48b8cbcffb756803cd2cc1d2161db82b2043d2462c04b98f87ac21a54b6272290565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015261dbe0608083015273420000000000000000000000000000000000002360a0808401919091528351808403909101815260c0909201909252805191012090565b610f0c8282610fe0565b5050565b610f0c82826110e6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f5c610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fc98787878761129f565b91509150610fd6816113b7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b80600260008282546110559190611834565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061108f908490611834565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661116f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561120b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061124790849061184c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112d657506000905060036113ae565b8460ff16601b141580156112ee57508460ff16601c14155b156112ff57506000905060046113ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611353573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166113a7576000600192509250506113ae565b9150600090505b94509492505050565b60008160048111156113cb576113cb611863565b14156113d45750565b60018160048111156113e8576113e8611863565b14156114365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b600281600481111561144a5761144a611863565b14156114985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114ac576114ac611863565b14156115205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561153457611534611863565b14156115a85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115bd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115ed57600080fd5b9392505050565b600060208083528351808285015260005b8181101561162157858101830151858201604001528201611605565b81811115611633576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168b57600080fd5b919050565b600080604083850312156116a357600080fd5b6116ac83611667565b946020939093013593505050565b6000806000606084860312156116cf57600080fd5b6116d884611667565b92506116e660208501611667565b9150604084013590509250925092565b60006020828403121561170857600080fd5b6115ed82611667565b600080600080600080600060e0888a03121561172c57600080fd5b61173588611667565b965061174360208901611667565b95506040880135945060608801359350608088013560ff8116811461176757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179757600080fd5b6117a083611667565b91506117ae60208401611667565b90509250929050565b600181811c908216806117cb57607f821691505b60208210811415610f49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561184757611847611805565b500190565b60008282101561185e5761185e611805565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a" ++}; ++//# sourceMappingURL=L2_L1NativeTokenHepler.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js.map b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js.map +new file mode 100644 +index 0000000..a11aaae +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/L2_L1NativeTokenHepler.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"L2_L1NativeTokenHepler.js","sourceRoot":"","sources":["../src/L2_L1NativeTokenHepler.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG;IAEpC,mBAAmB,EAAE,8zYAA8zY;IAEn1Y,qBAAqB,EAAE,8zYAA8zY;IAEr1Y,qBAAqB,EAAE,k0YAAk0Y;IAEz1Y,qBAAqB,EAAE,8zYAA8zY;IAEr1Y,uBAAuB,EAAE,k0YAAk0Y;IAE31Y,uBAAuB,EAAE,k0YAAk0Y;IAE31Y,sBAAsB,EAAE,k0YAAk0Y;IAE11Y,wBAAwB,EAAE,k0YAAk0Y;IAE51Y,wBAAwB,EAAE,k0YAAk0Y;IAE51Y,gBAAgB,EAAE,k0YAAk0Y;IAEp1Y,kBAAkB,EAAE,k0YAAk0Y;IAEt1Y,kBAAkB,EAAE,k0YAAk0Y;CACv1Y,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/address-names.js.map b/node_modules/@eth-optimism/contracts/dist/address-names.js.map +new file mode 100644 +index 0000000..f609170 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/address-names.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"address-names.js","sourceRoot":"","sources":["../src/address-names.ts"],"names":[],"mappings":";;;AAGa,QAAA,KAAK,GAAG;IACnB,OAAO,EAAE;QACP,SAAS,EAAE;YACT,iCAAiC,EAAE,mCAAmC;YACtE,iCAAiC,EAAE,mCAAmC;YACtE,yBAAyB,EAAE,2BAA2B;YACtD,oBAAoB,EAAE,sBAAsB;YAC5C,WAAW,EAAE,aAAa;YAC1B,0BAA0B,EAAE,4BAA4B;YACxD,iCAAiC,EAAE,mCAAmC;YACtE,2BAA2B,EAAE,6BAA6B;SAC3D;QACD,QAAQ,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE;KAC3E;IACD,SAAS,EAAE;QACT,eAAe,EAAE,iBAAiB;QAClC,kBAAkB,EAAE,oBAAoB;QACxC,kBAAkB,EAAE,oBAAoB;KACzC;CACF,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/connect-contracts.d.ts b/node_modules/@eth-optimism/contracts/dist/connect-contracts.d.ts +new file mode 100644 +index 0000000..133880d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/connect-contracts.d.ts +@@ -0,0 +1,19 @@ ++import { Signer, Contract } from 'ethers'; ++import { Provider } from '@ethersproject/abstract-provider'; ++export type Network = 'goerli' | 'kovan' | 'mainnet'; ++interface L1Contracts { ++ addressManager: Contract; ++ canonicalTransactionChain: Contract; ++ stateCommitmentChain: Contract; ++ xDomainMessengerProxy: Contract; ++ bondManager: Contract; ++} ++interface L2Contracts { ++ eth: Contract; ++ xDomainMessenger: Contract; ++ messagePasser: Contract; ++ deployerWhiteList: Contract; ++} ++export declare const connectL1Contracts: (signerOrProvider: Signer | Provider, network: Network) => Promise; ++export declare const connectL2Contracts: (signerOrProvider: any) => Promise; ++export {}; +diff --git a/node_modules/@eth-optimism/contracts/dist/connect-contracts.js b/node_modules/@eth-optimism/contracts/dist/connect-contracts.js +new file mode 100644 +index 0000000..a383451 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/connect-contracts.js +@@ -0,0 +1,51 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.connectL2Contracts = exports.connectL1Contracts = void 0; ++const ethers_1 = require("ethers"); ++const abstract_provider_1 = require("@ethersproject/abstract-provider"); ++const contract_artifacts_1 = require("./contract-artifacts"); ++const contract_deployed_artifacts_1 = require("./contract-deployed-artifacts"); ++const predeploys_1 = require("./predeploys"); ++const checkSignerType = (signerOrProvider) => { ++ if (!signerOrProvider) { ++ throw Error('signerOrProvider argument is undefined'); ++ } ++ if (!abstract_provider_1.Provider.isProvider(signerOrProvider) && ++ !ethers_1.Signer.isSigner(signerOrProvider)) { ++ throw Error('signerOrProvider argument is the wrong type'); ++ } ++}; ++const connectL1Contracts = async (signerOrProvider, network) => { ++ checkSignerType(signerOrProvider); ++ if (!['mainnet', 'kovan', 'goerli'].includes(network)) { ++ throw Error('Must specify network: mainnet, kovan, or goerli.'); ++ } ++ const getEthersContract = (name) => { ++ const artifact = (0, contract_deployed_artifacts_1.getDeployedContractArtifact)(name, network); ++ return new ethers_1.Contract(artifact.address, artifact.abi, signerOrProvider); ++ }; ++ return { ++ addressManager: getEthersContract('Lib_AddressManager'), ++ canonicalTransactionChain: getEthersContract('CanonicalTransactionChain'), ++ stateCommitmentChain: getEthersContract('StateCommitmentChain'), ++ xDomainMessengerProxy: getEthersContract('Proxy__L1CrossDomainMessenger'), ++ bondManager: getEthersContract('mockBondManager'), ++ }; ++}; ++exports.connectL1Contracts = connectL1Contracts; ++const connectL2Contracts = async (signerOrProvider) => { ++ checkSignerType(signerOrProvider); ++ const getEthersContract = (name, iface) => { ++ const artifact = (0, contract_artifacts_1.getContractArtifact)(iface || name); ++ const address = predeploys_1.predeploys[name]; ++ return new ethers_1.Contract(address, artifact.abi, signerOrProvider); ++ }; ++ return { ++ eth: getEthersContract('OVM_ETH'), ++ xDomainMessenger: getEthersContract('L2CrossDomainMessenger'), ++ messagePasser: getEthersContract('OVM_L2ToL1MessagePasser'), ++ deployerWhiteList: getEthersContract('OVM_DeployerWhitelist'), ++ }; ++}; ++exports.connectL2Contracts = connectL2Contracts; ++//# sourceMappingURL=connect-contracts.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/connect-contracts.js.map b/node_modules/@eth-optimism/contracts/dist/connect-contracts.js.map +new file mode 100644 +index 0000000..2cf4a3f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/connect-contracts.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"connect-contracts.js","sourceRoot":"","sources":["../src/connect-contracts.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AACzC,wEAA2D;AAC3D,6DAA0D;AAC1D,+EAA2E;AAC3E,6CAAyC;AAuBzC,MAAM,eAAe,GAAG,CAAC,gBAAmC,EAAE,EAAE;IAC9D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAA;KACtD;IACD,IACE,CAAC,4BAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACtC,CAAC,eAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAClC;QACA,MAAM,KAAK,CAAC,6CAA6C,CAAC,CAAA;KAC3D;AACH,CAAC,CAAA;AASM,MAAM,kBAAkB,GAAG,KAAK,EACrC,gBAAmC,EACnC,OAAgB,EACM,EAAE;IACxB,eAAe,CAAC,gBAAgB,CAAC,CAAA;IAEjC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACrD,MAAM,KAAK,CAAC,kDAAkD,CAAC,CAAA;KAChE;IAED,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,IAAA,yDAA2B,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3D,OAAO,IAAI,iBAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IACvE,CAAC,CAAA;IAED,OAAO;QACL,cAAc,EAAE,iBAAiB,CAAC,oBAAoB,CAAC;QACvD,yBAAyB,EAAE,iBAAiB,CAAC,2BAA2B,CAAC;QACzE,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;QAC/D,qBAAqB,EAAE,iBAAiB,CAAC,+BAA+B,CAAC;QACzE,WAAW,EAAE,iBAAiB,CAAC,iBAAiB,CAAC;KAClD,CAAA;AACH,CAAC,CAAA;AAtBY,QAAA,kBAAkB,sBAsB9B;AAQM,MAAM,kBAAkB,GAAG,KAAK,EACrC,gBAAqB,EACC,EAAE;IACxB,eAAe,CAAC,gBAAgB,CAAC,CAAA;IAEjC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;QACzD,MAAM,QAAQ,GAAG,IAAA,wCAAmB,EAAC,KAAK,IAAI,IAAI,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,uBAAU,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,iBAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IAC9D,CAAC,CAAA;IAED,OAAO;QACL,GAAG,EAAE,iBAAiB,CAAC,SAAS,CAAC;QACjC,gBAAgB,EAAE,iBAAiB,CAAC,wBAAwB,CAAC;QAC7D,aAAa,EAAE,iBAAiB,CAAC,yBAAyB,CAAC;QAC3D,iBAAiB,EAAE,iBAAiB,CAAC,uBAAuB,CAAC;KAC9D,CAAA;AACH,CAAC,CAAA;AAjBY,QAAA,kBAAkB,sBAiB9B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js b/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js +index 37c784f..aefc2c5 100644 +--- a/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js ++++ b/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js +@@ -11,19 +11,19 @@ try { + L1ChugSplashProxy = require('../artifacts/contracts/chugsplash/L1ChugSplashProxy.sol/L1ChugSplashProxy.json'); + } + catch (_b) { } +-let AddressDictator; ++let IL1CrossDomainMessenger; + try { +- AddressDictator = require('../artifacts/contracts/L1/deployment/AddressDictator.sol/AddressDictator.json'); ++ IL1CrossDomainMessenger = require('../artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.json'); + } + catch (_c) { } +-let ChugSplashDictator; ++let IL1CrossDomainMessengerFast; + try { +- ChugSplashDictator = require('../artifacts/contracts/L1/deployment/ChugSplashDictator.sol/ChugSplashDictator.json'); ++ IL1CrossDomainMessengerFast = require('../artifacts/contracts/L1/messaging/IL1CrossDomainMessengerFast.sol/IL1CrossDomainMessengerFast.json'); + } + catch (_d) { } +-let IL1CrossDomainMessenger; ++let IL1DepositHash; + try { +- IL1CrossDomainMessenger = require('../artifacts/contracts/L1/messaging/IL1CrossDomainMessenger.sol/IL1CrossDomainMessenger.json'); ++ IL1DepositHash = require('../artifacts/contracts/L1/messaging/IL1DepositHash.sol/IL1DepositHash.json'); + } + catch (_e) { } + let IL1ERC20Bridge; +@@ -36,335 +36,417 @@ try { + IL1StandardBridge = require('../artifacts/contracts/L1/messaging/IL1StandardBridge.sol/IL1StandardBridge.json'); + } + catch (_g) { } ++let IL1StandardBridgeAltL1; ++try { ++ IL1StandardBridgeAltL1 = require('../artifacts/contracts/L1/messaging/IL1StandardBridgeAltL1.sol/IL1StandardBridgeAltL1.json'); ++} ++catch (_h) { } + let L1CrossDomainMessenger; + try { + L1CrossDomainMessenger = require('../artifacts/contracts/L1/messaging/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json'); + } +-catch (_h) { } ++catch (_j) { } ++let L1CrossDomainMessengerFast; ++try { ++ L1CrossDomainMessengerFast = require('../artifacts/contracts/L1/messaging/L1CrossDomainMessengerFast.sol/L1CrossDomainMessengerFast.json'); ++} ++catch (_k) { } ++let L1MultiMessageRelayer; ++try { ++ L1MultiMessageRelayer = require('../artifacts/contracts/L1/messaging/L1MultiMessageRelayer.sol/L1MultiMessageRelayer.json'); ++} ++catch (_l) { } ++let L1MultiMessageRelayerFast; ++try { ++ L1MultiMessageRelayerFast = require('../artifacts/contracts/L1/messaging/L1MultiMessageRelayerFast.sol/L1MultiMessageRelayerFast.json'); ++} ++catch (_m) { } + let L1StandardBridge; + try { + L1StandardBridge = require('../artifacts/contracts/L1/messaging/L1StandardBridge.sol/L1StandardBridge.json'); + } +-catch (_j) { } ++catch (_o) { } ++let L1StandardBridgeAltL1; ++try { ++ L1StandardBridgeAltL1 = require('../artifacts/contracts/L1/messaging/L1StandardBridgeAltL1.sol/L1StandardBridgeAltL1.json'); ++} ++catch (_p) { } + let CanonicalTransactionChain; + try { + CanonicalTransactionChain = require('../artifacts/contracts/L1/rollup/CanonicalTransactionChain.sol/CanonicalTransactionChain.json'); + } +-catch (_k) { } ++catch (_q) { } + let ChainStorageContainer; + try { + ChainStorageContainer = require('../artifacts/contracts/L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json'); + } +-catch (_l) { } ++catch (_r) { } + let ICanonicalTransactionChain; + try { + ICanonicalTransactionChain = require('../artifacts/contracts/L1/rollup/ICanonicalTransactionChain.sol/ICanonicalTransactionChain.json'); + } +-catch (_m) { } ++catch (_s) { } + let IChainStorageContainer; + try { + IChainStorageContainer = require('../artifacts/contracts/L1/rollup/IChainStorageContainer.sol/IChainStorageContainer.json'); + } +-catch (_o) { } ++catch (_t) { } + let IStateCommitmentChain; + try { + IStateCommitmentChain = require('../artifacts/contracts/L1/rollup/IStateCommitmentChain.sol/IStateCommitmentChain.json'); + } +-catch (_p) { } ++catch (_u) { } + let StateCommitmentChain; + try { + StateCommitmentChain = require('../artifacts/contracts/L1/rollup/StateCommitmentChain.sol/StateCommitmentChain.json'); + } +-catch (_q) { } +-let TeleportrDeposit; ++catch (_v) { } ++let BOBA; + try { +- TeleportrDeposit = require('../artifacts/contracts/L1/teleportr/TeleportrDeposit.sol/TeleportrDeposit.json'); ++ BOBA = require('../artifacts/contracts/L1/token/BOBA.sol/BOBA.json'); + } +-catch (_r) { } ++catch (_w) { } + let BondManager; + try { + BondManager = require('../artifacts/contracts/L1/verification/BondManager.sol/BondManager.json'); + } +-catch (_s) { } ++catch (_x) { } + let IBondManager; + try { + IBondManager = require('../artifacts/contracts/L1/verification/IBondManager.sol/IBondManager.json'); + } +-catch (_t) { } ++catch (_y) { } + let IL2CrossDomainMessenger; + try { + IL2CrossDomainMessenger = require('../artifacts/contracts/L2/messaging/IL2CrossDomainMessenger.sol/IL2CrossDomainMessenger.json'); + } +-catch (_u) { } ++catch (_z) { } + let IL2ERC20Bridge; + try { + IL2ERC20Bridge = require('../artifacts/contracts/L2/messaging/IL2ERC20Bridge.sol/IL2ERC20Bridge.json'); + } +-catch (_v) { } ++catch (_0) { } + let L2CrossDomainMessenger; + try { + L2CrossDomainMessenger = require('../artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json'); + } +-catch (_w) { } ++catch (_1) { } + let L2StandardBridge; + try { + L2StandardBridge = require('../artifacts/contracts/L2/messaging/L2StandardBridge.sol/L2StandardBridge.json'); + } +-catch (_x) { } ++catch (_2) { } ++let L2StandardBridgeAltL1; ++try { ++ L2StandardBridgeAltL1 = require('../artifacts/contracts/L2/messaging/L2StandardBridgeAltL1.sol/L2StandardBridgeAltL1.json'); ++} ++catch (_3) { } + let L2StandardTokenFactory; + try { + L2StandardTokenFactory = require('../artifacts/contracts/L2/messaging/L2StandardTokenFactory.sol/L2StandardTokenFactory.json'); + } +-catch (_y) { } ++catch (_4) { } ++let Boba_GasPriceOracle; ++try { ++ Boba_GasPriceOracle = require('../artifacts/contracts/L2/predeploys/Boba_GasPriceOracle.sol/Boba_GasPriceOracle.json'); ++} ++catch (_5) { } ++let Boba_GasPriceOracleAltL1; ++try { ++ Boba_GasPriceOracleAltL1 = require('../artifacts/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.sol/Boba_GasPriceOracleAltL1.json'); ++} ++catch (_6) { } ++let BobaTuringCredit; ++try { ++ BobaTuringCredit = require('../artifacts/contracts/L2/predeploys/BobaTuringCredit.sol/BobaTuringCredit.json'); ++} ++catch (_7) { } ++let BobaTuringCreditAltL1; ++try { ++ BobaTuringCreditAltL1 = require('../artifacts/contracts/L2/predeploys/BobaTuringCreditAltL1.sol/BobaTuringCreditAltL1.json'); ++} ++catch (_8) { } + let iOVM_L1BlockNumber; + try { + iOVM_L1BlockNumber = require('../artifacts/contracts/L2/predeploys/iOVM_L1BlockNumber.sol/iOVM_L1BlockNumber.json'); + } +-catch (_z) { } ++catch (_9) { } + let iOVM_L2ToL1MessagePasser; + try { + iOVM_L2ToL1MessagePasser = require('../artifacts/contracts/L2/predeploys/iOVM_L2ToL1MessagePasser.sol/iOVM_L2ToL1MessagePasser.json'); + } +-catch (_0) { } ++catch (_10) { } ++let L2_BOBA; ++try { ++ L2_BOBA = require('../artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.json'); ++} ++catch (_11) { } ++let L2_L1NativeToken; ++try { ++ L2_L1NativeToken = require('../artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.json'); ++} ++catch (_12) { } + let OVM_DeployerWhitelist; + try { + OVM_DeployerWhitelist = require('../artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json'); + } +-catch (_1) { } ++catch (_13) { } + let OVM_ETH; + try { + OVM_ETH = require('../artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json'); + } +-catch (_2) { } ++catch (_14) { } + let OVM_GasPriceOracle; + try { + OVM_GasPriceOracle = require('../artifacts/contracts/L2/predeploys/OVM_GasPriceOracle.sol/OVM_GasPriceOracle.json'); + } +-catch (_3) { } ++catch (_15) { } + let OVM_L2ToL1MessagePasser; + try { + OVM_L2ToL1MessagePasser = require('../artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json'); + } +-catch (_4) { } ++catch (_16) { } + let OVM_SequencerFeeVault; + try { + OVM_SequencerFeeVault = require('../artifacts/contracts/L2/predeploys/OVM_SequencerFeeVault.sol/OVM_SequencerFeeVault.json'); + } +-catch (_5) { } +-let WETH9; ++catch (_17) { } ++let OVM_SequencerFeeVaultAltL1; + try { +- WETH9 = require('../artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json'); ++ OVM_SequencerFeeVaultAltL1 = require('../artifacts/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.sol/OVM_SequencerFeeVaultAltL1.json'); + } +-catch (_6) { } +-let TeleportrDisburser; ++catch (_18) { } ++let WETH9; + try { +- TeleportrDisburser = require('../artifacts/contracts/L2/teleportr/TeleportrDisburser.sol/TeleportrDisburser.json'); ++ WETH9 = require('../artifacts/contracts/L2/predeploys/WETH9.sol/WETH9.json'); + } +-catch (_7) { } ++catch (_19) { } + let CrossDomainEnabled; + try { + CrossDomainEnabled = require('../artifacts/contracts/libraries/bridge/CrossDomainEnabled.sol/CrossDomainEnabled.json'); + } +-catch (_8) { } ++catch (_20) { } + let ICrossDomainMessenger; + try { + ICrossDomainMessenger = require('../artifacts/contracts/libraries/bridge/ICrossDomainMessenger.sol/ICrossDomainMessenger.json'); + } +-catch (_9) { } ++catch (_21) { } + let Lib_CrossDomainUtils; + try { + Lib_CrossDomainUtils = require('../artifacts/contracts/libraries/bridge/Lib_CrossDomainUtils.sol/Lib_CrossDomainUtils.json'); + } +-catch (_10) { } ++catch (_22) { } + let Lib_OVMCodec; + try { + Lib_OVMCodec = require('../artifacts/contracts/libraries/codec/Lib_OVMCodec.sol/Lib_OVMCodec.json'); + } +-catch (_11) { } ++catch (_23) { } + let Lib_DefaultValues; + try { + Lib_DefaultValues = require('../artifacts/contracts/libraries/constants/Lib_DefaultValues.sol/Lib_DefaultValues.json'); + } +-catch (_12) { } ++catch (_24) { } + let Lib_PredeployAddresses; + try { + Lib_PredeployAddresses = require('../artifacts/contracts/libraries/constants/Lib_PredeployAddresses.sol/Lib_PredeployAddresses.json'); + } +-catch (_13) { } ++catch (_25) { } + let Lib_AddressManager; + try { + Lib_AddressManager = require('../artifacts/contracts/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json'); + } +-catch (_14) { } ++catch (_26) { } + let Lib_AddressResolver; + try { + Lib_AddressResolver = require('../artifacts/contracts/libraries/resolver/Lib_AddressResolver.sol/Lib_AddressResolver.json'); + } +-catch (_15) { } ++catch (_27) { } ++let Lib_ResolvedDelegateBobaProxy; ++try { ++ Lib_ResolvedDelegateBobaProxy = require('../artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.sol/Lib_ResolvedDelegateBobaProxy.json'); ++} ++catch (_28) { } + let Lib_ResolvedDelegateProxy; + try { + Lib_ResolvedDelegateProxy = require('../artifacts/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.sol/Lib_ResolvedDelegateProxy.json'); + } +-catch (_16) { } ++catch (_29) { } + let Lib_RLPReader; + try { + Lib_RLPReader = require('../artifacts/contracts/libraries/rlp/Lib_RLPReader.sol/Lib_RLPReader.json'); + } +-catch (_17) { } ++catch (_30) { } + let Lib_RLPWriter; + try { + Lib_RLPWriter = require('../artifacts/contracts/libraries/rlp/Lib_RLPWriter.sol/Lib_RLPWriter.json'); + } +-catch (_18) { } ++catch (_31) { } + let Lib_MerkleTrie; + try { + Lib_MerkleTrie = require('../artifacts/contracts/libraries/trie/Lib_MerkleTrie.sol/Lib_MerkleTrie.json'); + } +-catch (_19) { } ++catch (_32) { } + let Lib_SecureMerkleTrie; + try { + Lib_SecureMerkleTrie = require('../artifacts/contracts/libraries/trie/Lib_SecureMerkleTrie.sol/Lib_SecureMerkleTrie.json'); + } +-catch (_20) { } ++catch (_33) { } + let Lib_Buffer; + try { + Lib_Buffer = require('../artifacts/contracts/libraries/utils/Lib_Buffer.sol/Lib_Buffer.json'); + } +-catch (_21) { } ++catch (_34) { } + let Lib_Bytes32Utils; + try { + Lib_Bytes32Utils = require('../artifacts/contracts/libraries/utils/Lib_Bytes32Utils.sol/Lib_Bytes32Utils.json'); + } +-catch (_22) { } ++catch (_35) { } + let Lib_BytesUtils; + try { + Lib_BytesUtils = require('../artifacts/contracts/libraries/utils/Lib_BytesUtils.sol/Lib_BytesUtils.json'); + } +-catch (_23) { } ++catch (_36) { } + let Lib_MerkleTree; + try { + Lib_MerkleTree = require('../artifacts/contracts/libraries/utils/Lib_MerkleTree.sol/Lib_MerkleTree.json'); + } +-catch (_24) { } ++catch (_37) { } + let AddressAliasHelper; + try { + AddressAliasHelper = require('../artifacts/contracts/standards/AddressAliasHelper.sol/AddressAliasHelper.json'); + } +-catch (_25) { } ++catch (_38) { } + let IL2StandardERC20; + try { + IL2StandardERC20 = require('../artifacts/contracts/standards/IL2StandardERC20.sol/IL2StandardERC20.json'); + } +-catch (_26) { } ++catch (_39) { } ++let L2GovernanceERC20; ++try { ++ L2GovernanceERC20 = require('../artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json'); ++} ++catch (_40) { } + let L2StandardERC20; + try { + L2StandardERC20 = require('../artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json'); + } +-catch (_27) { } +-let FailingReceiver; ++catch (_41) { } ++let Helper_GasMeasurer; + try { +- FailingReceiver = require('../artifacts/contracts/test-helpers/FailingReceiver.sol/FailingReceiver.json'); ++ Helper_GasMeasurer = require('../artifacts/contracts/test-helpers/Helper_GasMeasurer.sol/Helper_GasMeasurer.json'); + } +-catch (_28) { } ++catch (_42) { } + let Helper_SimpleProxy; + try { + Helper_SimpleProxy = require('../artifacts/contracts/test-helpers/Helper_SimpleProxy.sol/Helper_SimpleProxy.json'); + } +-catch (_29) { } ++catch (_43) { } + let TestERC20; + try { + TestERC20 = require('../artifacts/contracts/test-helpers/TestERC20.sol/TestERC20.json'); + } +-catch (_30) { } ++catch (_44) { } + let TestLib_CrossDomainUtils; + try { + TestLib_CrossDomainUtils = require('../artifacts/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.sol/TestLib_CrossDomainUtils.json'); + } +-catch (_31) { } ++catch (_45) { } + let TestLib_OVMCodec; + try { + TestLib_OVMCodec = require('../artifacts/contracts/test-libraries/codec/TestLib_OVMCodec.sol/TestLib_OVMCodec.json'); + } +-catch (_32) { } ++catch (_46) { } + let TestLib_RLPReader; + try { + TestLib_RLPReader = require('../artifacts/contracts/test-libraries/rlp/TestLib_RLPReader.sol/TestLib_RLPReader.json'); + } +-catch (_33) { } ++catch (_47) { } + let TestLib_RLPWriter; + try { + TestLib_RLPWriter = require('../artifacts/contracts/test-libraries/rlp/TestLib_RLPWriter.sol/TestLib_RLPWriter.json'); + } +-catch (_34) { } ++catch (_48) { } + let TestLib_AddressAliasHelper; + try { + TestLib_AddressAliasHelper = require('../artifacts/contracts/test-libraries/standards/TestLib_AddressAliasHelper.sol/TestLib_AddressAliasHelper.json'); + } +-catch (_35) { } ++catch (_49) { } + let TestLib_MerkleTrie; + try { + TestLib_MerkleTrie = require('../artifacts/contracts/test-libraries/trie/TestLib_MerkleTrie.sol/TestLib_MerkleTrie.json'); + } +-catch (_36) { } ++catch (_50) { } + let TestLib_SecureMerkleTrie; + try { + TestLib_SecureMerkleTrie = require('../artifacts/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.sol/TestLib_SecureMerkleTrie.json'); + } +-catch (_37) { } ++catch (_51) { } + let TestLib_Buffer; + try { + TestLib_Buffer = require('../artifacts/contracts/test-libraries/utils/TestLib_Buffer.sol/TestLib_Buffer.json'); + } +-catch (_38) { } ++catch (_52) { } + let TestLib_Bytes32Utils; + try { + TestLib_Bytes32Utils = require('../artifacts/contracts/test-libraries/utils/TestLib_Bytes32Utils.sol/TestLib_Bytes32Utils.json'); + } +-catch (_39) { } ++catch (_53) { } + let TestLib_BytesUtils; + try { + TestLib_BytesUtils = require('../artifacts/contracts/test-libraries/utils/TestLib_BytesUtils.sol/TestLib_BytesUtils.json'); + } +-catch (_40) { } ++catch (_54) { } + let TestLib_MerkleTree; + try { + TestLib_MerkleTree = require('../artifacts/contracts/test-libraries/utils/TestLib_MerkleTree.sol/TestLib_MerkleTree.json'); + } +-catch (_41) { } ++catch (_55) { } + const getContractArtifact = (name) => { + return { + iL1ChugSplashDeployer, + L1ChugSplashProxy, +- AddressDictator, +- ChugSplashDictator, + IL1CrossDomainMessenger, ++ IL1CrossDomainMessengerFast, ++ IL1DepositHash, + IL1ERC20Bridge, + IL1StandardBridge, ++ IL1StandardBridgeAltL1, + L1CrossDomainMessenger, ++ L1CrossDomainMessengerFast, ++ L1MultiMessageRelayer, ++ L1MultiMessageRelayerFast, + L1StandardBridge, ++ L1StandardBridgeAltL1, + CanonicalTransactionChain, + ChainStorageContainer, + ICanonicalTransactionChain, + IChainStorageContainer, + IStateCommitmentChain, + StateCommitmentChain, +- TeleportrDeposit, ++ BOBA, + BondManager, + IBondManager, + IL2CrossDomainMessenger, + IL2ERC20Bridge, + L2CrossDomainMessenger, + L2StandardBridge, ++ L2StandardBridgeAltL1, + L2StandardTokenFactory, ++ Boba_GasPriceOracle, ++ Boba_GasPriceOracleAltL1, ++ BobaTuringCredit, ++ BobaTuringCreditAltL1, + iOVM_L1BlockNumber, + iOVM_L2ToL1MessagePasser, ++ L2_BOBA, ++ L2_L1NativeToken, + OVM_DeployerWhitelist, + OVM_ETH, + OVM_GasPriceOracle, + OVM_L2ToL1MessagePasser, + OVM_SequencerFeeVault, ++ OVM_SequencerFeeVaultAltL1, + WETH9, +- TeleportrDisburser, + CrossDomainEnabled, + ICrossDomainMessenger, + Lib_CrossDomainUtils, +@@ -373,6 +455,7 @@ const getContractArtifact = (name) => { + Lib_PredeployAddresses, + Lib_AddressManager, + Lib_AddressResolver, ++ Lib_ResolvedDelegateBobaProxy, + Lib_ResolvedDelegateProxy, + Lib_RLPReader, + Lib_RLPWriter, +@@ -384,8 +467,9 @@ const getContractArtifact = (name) => { + Lib_MerkleTree, + AddressAliasHelper, + IL2StandardERC20, ++ L2GovernanceERC20, + L2StandardERC20, +- FailingReceiver, ++ Helper_GasMeasurer, + Helper_SimpleProxy, + TestERC20, + TestLib_CrossDomainUtils, +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js.map b/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js.map +new file mode 100644 +index 0000000..afd6778 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-artifacts.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"contract-artifacts.js","sourceRoot":"","sources":["../src/contract-artifacts.ts"],"names":[],"mappings":";;;AAQQ,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,mGAAmG,CAAC,CAAA;CACrI;AAAC,WAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,gFAAgF,CAAC,CAAA;CAC9G;AAAC,WAAM,GAAE;AAGV,IAAI,uBAAuB,CAAA;AAC3B,IAAI;IACF,uBAAuB,GAAG,OAAO,CAAC,8FAA8F,CAAC,CAAA;CAClI;AAAC,WAAM,GAAE;AAGV,IAAI,2BAA2B,CAAA;AAC/B,IAAI;IACF,2BAA2B,GAAG,OAAO,CAAC,sGAAsG,CAAC,CAAA;CAC9I;AAAC,WAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,4EAA4E,CAAC,CAAA;CACvG;AAAC,WAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,4EAA4E,CAAC,CAAA;CACvG;AAAC,WAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,kFAAkF,CAAC,CAAA;CAChH;AAAC,WAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC/H;AAAC,WAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC/H;AAAC,WAAM,GAAE;AAGV,IAAI,0BAA0B,CAAA;AAC9B,IAAI;IACF,0BAA0B,GAAG,OAAO,CAAC,oGAAoG,CAAC,CAAA;CAC3I;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,0FAA0F,CAAC,CAAA;CAC5H;AAAC,WAAM,GAAE;AAGV,IAAI,yBAAyB,CAAA;AAC7B,IAAI;IACF,yBAAyB,GAAG,OAAO,CAAC,kGAAkG,CAAC,CAAA;CACxI;AAAC,WAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,gFAAgF,CAAC,CAAA;CAC7G;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,0FAA0F,CAAC,CAAA;CAC5H;AAAC,WAAM,GAAE;AAGV,IAAI,yBAAyB,CAAA;AAC7B,IAAI;IACF,yBAAyB,GAAG,OAAO,CAAC,+FAA+F,CAAC,CAAA;CACrI;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,uFAAuF,CAAC,CAAA;CACzH;AAAC,WAAM,GAAE;AAGV,IAAI,0BAA0B,CAAA;AAC9B,IAAI;IACF,0BAA0B,GAAG,OAAO,CAAC,iGAAiG,CAAC,CAAA;CACxI;AAAC,WAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,yFAAyF,CAAC,CAAA;CAC5H;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,uFAAuF,CAAC,CAAA;CACzH;AAAC,WAAM,GAAE;AAGV,IAAI,oBAAoB,CAAA;AACxB,IAAI;IACF,oBAAoB,GAAG,OAAO,CAAC,qFAAqF,CAAC,CAAA;CACtH;AAAC,WAAM,GAAE;AAGV,IAAI,IAAI,CAAA;AACR,IAAI;IACF,IAAI,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;CACrE;AAAC,WAAM,GAAE;AAGV,IAAI,WAAW,CAAA;AACf,IAAI;IACF,WAAW,GAAG,OAAO,CAAC,yEAAyE,CAAC,CAAA;CACjG;AAAC,WAAM,GAAE;AAGV,IAAI,YAAY,CAAA;AAChB,IAAI;IACF,YAAY,GAAG,OAAO,CAAC,2EAA2E,CAAC,CAAA;CACpG;AAAC,WAAM,GAAE;AAGV,IAAI,uBAAuB,CAAA;AAC3B,IAAI;IACF,uBAAuB,GAAG,OAAO,CAAC,8FAA8F,CAAC,CAAA;CAClI;AAAC,WAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,4EAA4E,CAAC,CAAA;CACvG;AAAC,WAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC/H;AAAC,WAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,gFAAgF,CAAC,CAAA;CAC7G;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,0FAA0F,CAAC,CAAA;CAC5H;AAAC,WAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC/H;AAAC,WAAM,GAAE;AAGV,IAAI,mBAAmB,CAAA;AACvB,IAAI;IACF,mBAAmB,GAAG,OAAO,CAAC,uFAAuF,CAAC,CAAA;CACvH;AAAC,WAAM,GAAE;AAGV,IAAI,wBAAwB,CAAA;AAC5B,IAAI;IACF,wBAAwB,GAAG,OAAO,CAAC,iGAAiG,CAAC,CAAA;CACtI;AAAC,WAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,iFAAiF,CAAC,CAAA;CAC9G;AAAC,WAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,2FAA2F,CAAC,CAAA;CAC7H;AAAC,WAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,qFAAqF,CAAC,CAAA;CACpH;AAAC,WAAM,GAAE;AAGV,IAAI,wBAAwB,CAAA;AAC5B,IAAI;IACF,wBAAwB,GAAG,OAAO,CAAC,iGAAiG,CAAC,CAAA;CACtI;AAAC,YAAM,GAAE;AAGV,IAAI,OAAO,CAAA;AACX,IAAI;IACF,OAAO,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;CACnF;AAAC,YAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,iFAAiF,CAAC,CAAA;CAC9G;AAAC,YAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,2FAA2F,CAAC,CAAA;CAC7H;AAAC,YAAM,GAAE;AAGV,IAAI,OAAO,CAAA;AACX,IAAI;IACF,OAAO,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;CACnF;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,qFAAqF,CAAC,CAAA;CACpH;AAAC,YAAM,GAAE;AAGV,IAAI,uBAAuB,CAAA;AAC3B,IAAI;IACF,uBAAuB,GAAG,OAAO,CAAC,+FAA+F,CAAC,CAAA;CACnI;AAAC,YAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,2FAA2F,CAAC,CAAA;CAC7H;AAAC,YAAM,GAAE;AAGV,IAAI,0BAA0B,CAAA;AAC9B,IAAI;IACF,0BAA0B,GAAG,OAAO,CAAC,qGAAqG,CAAC,CAAA;CAC5I;AAAC,YAAM,GAAE;AAGV,IAAI,KAAK,CAAA;AACT,IAAI;IACF,KAAK,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAA;CAC7E;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,wFAAwF,CAAC,CAAA;CACvH;AAAC,YAAM,GAAE;AAGV,IAAI,qBAAqB,CAAA;AACzB,IAAI;IACF,qBAAqB,GAAG,OAAO,CAAC,8FAA8F,CAAC,CAAA;CAChI;AAAC,YAAM,GAAE;AAGV,IAAI,oBAAoB,CAAA;AACxB,IAAI;IACF,oBAAoB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC7H;AAAC,YAAM,GAAE;AAGV,IAAI,YAAY,CAAA;AAChB,IAAI;IACF,YAAY,GAAG,OAAO,CAAC,2EAA2E,CAAC,CAAA;CACpG;AAAC,YAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,yFAAyF,CAAC,CAAA;CACvH;AAAC,YAAM,GAAE;AAGV,IAAI,sBAAsB,CAAA;AAC1B,IAAI;IACF,sBAAsB,GAAG,OAAO,CAAC,mGAAmG,CAAC,CAAA;CACtI;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,0FAA0F,CAAC,CAAA;CACzH;AAAC,YAAM,GAAE;AAGV,IAAI,mBAAmB,CAAA;AACvB,IAAI;IACF,mBAAmB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC5H;AAAC,YAAM,GAAE;AAGV,IAAI,6BAA6B,CAAA;AACjC,IAAI;IACF,6BAA6B,GAAG,OAAO,CAAC,gHAAgH,CAAC,CAAA;CAC1J;AAAC,YAAM,GAAE;AAGV,IAAI,yBAAyB,CAAA;AAC7B,IAAI;IACF,yBAAyB,GAAG,OAAO,CAAC,wGAAwG,CAAC,CAAA;CAC9I;AAAC,YAAM,GAAE;AAGV,IAAI,aAAa,CAAA;AACjB,IAAI;IACF,aAAa,GAAG,OAAO,CAAC,2EAA2E,CAAC,CAAA;CACrG;AAAC,YAAM,GAAE;AAGV,IAAI,aAAa,CAAA;AACjB,IAAI;IACF,aAAa,GAAG,OAAO,CAAC,2EAA2E,CAAC,CAAA;CACrG;AAAC,YAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,8EAA8E,CAAC,CAAA;CACzG;AAAC,YAAM,GAAE;AAGV,IAAI,oBAAoB,CAAA;AACxB,IAAI;IACF,oBAAoB,GAAG,OAAO,CAAC,0FAA0F,CAAC,CAAA;CAC3H;AAAC,YAAM,GAAE;AAGV,IAAI,UAAU,CAAA;AACd,IAAI;IACF,UAAU,GAAG,OAAO,CAAC,uEAAuE,CAAC,CAAA;CAC9F;AAAC,YAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,mFAAmF,CAAC,CAAA;CAChH;AAAC,YAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,+EAA+E,CAAC,CAAA;CAC1G;AAAC,YAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,+EAA+E,CAAC,CAAA;CAC1G;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,iFAAiF,CAAC,CAAA;CAChH;AAAC,YAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,6EAA6E,CAAC,CAAA;CAC1G;AAAC,YAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,+EAA+E,CAAC,CAAA;CAC7G;AAAC,YAAM,GAAE;AAGV,IAAI,eAAe,CAAA;AACnB,IAAI;IACF,eAAe,GAAG,OAAO,CAAC,2EAA2E,CAAC,CAAA;CACvG;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,oFAAoF,CAAC,CAAA;CACnH;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,oFAAoF,CAAC,CAAA;CACnH;AAAC,YAAM,GAAE;AAGV,IAAI,SAAS,CAAA;AACb,IAAI;IACF,SAAS,GAAG,OAAO,CAAC,kEAAkE,CAAC,CAAA;CACxF;AAAC,YAAM,GAAE;AAGV,IAAI,wBAAwB,CAAA;AAC5B,IAAI;IACF,wBAAwB,GAAG,OAAO,CAAC,yGAAyG,CAAC,CAAA;CAC9I;AAAC,YAAM,GAAE;AAGV,IAAI,gBAAgB,CAAA;AACpB,IAAI;IACF,gBAAgB,GAAG,OAAO,CAAC,wFAAwF,CAAC,CAAA;CACrH;AAAC,YAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,wFAAwF,CAAC,CAAA;CACtH;AAAC,YAAM,GAAE;AAGV,IAAI,iBAAiB,CAAA;AACrB,IAAI;IACF,iBAAiB,GAAG,OAAO,CAAC,wFAAwF,CAAC,CAAA;CACtH;AAAC,YAAM,GAAE;AAGV,IAAI,0BAA0B,CAAA;AAC9B,IAAI;IACF,0BAA0B,GAAG,OAAO,CAAC,gHAAgH,CAAC,CAAA;CACvJ;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,2FAA2F,CAAC,CAAA;CAC1H;AAAC,YAAM,GAAE;AAGV,IAAI,wBAAwB,CAAA;AAC5B,IAAI;IACF,wBAAwB,GAAG,OAAO,CAAC,uGAAuG,CAAC,CAAA;CAC5I;AAAC,YAAM,GAAE;AAGV,IAAI,cAAc,CAAA;AAClB,IAAI;IACF,cAAc,GAAG,OAAO,CAAC,oFAAoF,CAAC,CAAA;CAC/G;AAAC,YAAM,GAAE;AAGV,IAAI,oBAAoB,CAAA;AACxB,IAAI;IACF,oBAAoB,GAAG,OAAO,CAAC,gGAAgG,CAAC,CAAA;CACjI;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC3H;AAAC,YAAM,GAAE;AAGV,IAAI,kBAAkB,CAAA;AACtB,IAAI;IACF,kBAAkB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;CAC3H;AAAC,YAAM,GAAE;AAGP,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAO,EAAE;IACvD,OAAO;QACL,qBAAqB;QAC7B,iBAAiB;QACjB,uBAAuB;QACvB,2BAA2B;QAC3B,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,sBAAsB;QACtB,sBAAsB;QACtB,0BAA0B;QAC1B,qBAAqB;QACrB,yBAAyB;QACzB,gBAAgB;QAChB,qBAAqB;QACrB,yBAAyB;QACzB,qBAAqB;QACrB,0BAA0B;QAC1B,sBAAsB;QACtB,qBAAqB;QACrB,oBAAoB;QACpB,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,uBAAuB;QACvB,cAAc;QACd,sBAAsB;QACtB,gBAAgB;QAChB,qBAAqB;QACrB,sBAAsB;QACtB,mBAAmB;QACnB,wBAAwB;QACxB,gBAAgB;QAChB,qBAAqB;QACrB,kBAAkB;QAClB,wBAAwB;QACxB,OAAO;QACP,gBAAgB;QAChB,qBAAqB;QACrB,OAAO;QACP,kBAAkB;QAClB,uBAAuB;QACvB,qBAAqB;QACrB,0BAA0B;QAC1B,KAAK;QACL,kBAAkB;QAClB,qBAAqB;QACrB,oBAAoB;QACpB,YAAY;QACZ,iBAAiB;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,mBAAmB;QACnB,6BAA6B;QAC7B,yBAAyB;QACzB,aAAa;QACb,aAAa;QACb,cAAc;QACd,oBAAoB;QACpB,UAAU;QACV,gBAAgB;QAChB,cAAc;QACd,cAAc;QACd,kBAAkB;QAClB,gBAAgB;QAChB,iBAAiB;QACjB,eAAe;QACf,kBAAkB;QAClB,kBAAkB;QAClB,SAAS;QACT,wBAAwB;QACxB,gBAAgB;QAChB,iBAAiB;QACjB,iBAAiB;QACjB,0BAA0B;QAC1B,kBAAkB;QAClB,wBAAwB;QACxB,cAAc;QACd,oBAAoB;QACpB,kBAAkB;QAClB,kBAAkB;KACX,CAAC,IAAI,CAAC,CAAA;AACT,CAAC,CAAA;AAnFY,QAAA,mBAAmB,uBAmF/B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-data.d.ts b/node_modules/@eth-optimism/contracts/dist/contract-data.d.ts +new file mode 100644 +index 0000000..0dce6fe +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-data.d.ts +@@ -0,0 +1,35 @@ ++import { Network } from './connect-contracts'; ++export declare const getL1ContractData: (network: Network) => { ++ Lib_AddressManager: any; ++ CanonicalTransactionChain: any; ++ L1CrossDomainMessenger: any; ++ StateCommitmentChain: any; ++ Proxy__L1CrossDomainMessenger: any; ++ BondManager: any; ++}; ++export declare const getL2ContractData: () => { ++ OVM_ETH: { ++ abi: any; ++ address: string; ++ }; ++ L2CrossDomainMessenger: { ++ abi: any; ++ address: string; ++ }; ++ OVM_L2ToL1MessagePasser: { ++ abi: any; ++ address: string; ++ }; ++ OVM_DeployerWhitelist: { ++ abi: any; ++ address: string; ++ }; ++ L2_BOBA: { ++ abi: any; ++ address: string; ++ }; ++ L2_L1NativeToken: { ++ abi: any; ++ address: string; ++ }; ++}; +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-data.js b/node_modules/@eth-optimism/contracts/dist/contract-data.js +new file mode 100644 +index 0000000..6101f4b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-data.js +@@ -0,0 +1,93 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.getL2ContractData = exports.getL1ContractData = void 0; ++const predeploys_1 = require("./predeploys"); ++const Mainnet__Lib_AddressManager = require('../deployments/mainnet/Lib_AddressManager.json'); ++const Mainnet__CanonicalTransactionChain = require('../deployments/mainnet/CanonicalTransactionChain.json'); ++const Mainnet__L1CrossDomainMessenger = require('../deployments/mainnet/L1CrossDomainMessenger.json'); ++const Mainnet__StateCommitmentChain = require('../deployments/mainnet/StateCommitmentChain.json'); ++const Mainnet__Proxy__L1CrossDomainMessenger = require('../deployments/mainnet/Proxy__L1CrossDomainMessenger.json'); ++const Mainnet__BondManager = require('../deployments/mainnet/mockBondManager.json'); ++const Kovan__Lib_AddressManager = require('../deployments/kovan/Lib_AddressManager.json'); ++const Kovan__CanonicalTransactionChain = require('../deployments/kovan/CanonicalTransactionChain.json'); ++const Kovan__L1CrossDomainMessenger = require('../deployments/kovan/L1CrossDomainMessenger.json'); ++const Kovan__StateCommitmentChain = require('../deployments/kovan/StateCommitmentChain.json'); ++const Kovan__Proxy__L1CrossDomainMessenger = require('../deployments/kovan/Proxy__L1CrossDomainMessenger.json'); ++const Kovan__BondManager = require('../deployments/kovan/mockBondManager.json'); ++const Goerli__Lib_AddressManager = require('../deployments/goerli/Lib_AddressManager.json'); ++const Goerli__CanonicalTransactionChain = require('../deployments/goerli/CanonicalTransactionChain.json'); ++const Goerli__L1CrossDomainMessenger = require('../deployments/goerli/L1CrossDomainMessenger.json'); ++const Goerli__StateCommitmentChain = require('../deployments/goerli/StateCommitmentChain.json'); ++const Goerli__Proxy__L1CrossDomainMessenger = require('../deployments/goerli/Proxy__L1CrossDomainMessenger.json'); ++const Goerli__BondManager = require('../deployments/goerli/mockBondManager.json'); ++const getL1ContractData = (network) => { ++ return { ++ Lib_AddressManager: { ++ mainnet: Mainnet__Lib_AddressManager, ++ kovan: Kovan__Lib_AddressManager, ++ goerli: Goerli__Lib_AddressManager, ++ }[network], ++ CanonicalTransactionChain: { ++ mainnet: Mainnet__CanonicalTransactionChain, ++ kovan: Kovan__CanonicalTransactionChain, ++ goerli: Goerli__CanonicalTransactionChain, ++ }[network], ++ L1CrossDomainMessenger: { ++ mainnet: Mainnet__L1CrossDomainMessenger, ++ kovan: Kovan__L1CrossDomainMessenger, ++ goerli: Goerli__L1CrossDomainMessenger, ++ }[network], ++ StateCommitmentChain: { ++ mainnet: Mainnet__StateCommitmentChain, ++ kovan: Kovan__StateCommitmentChain, ++ goerli: Goerli__StateCommitmentChain, ++ }[network], ++ Proxy__L1CrossDomainMessenger: { ++ mainnet: Mainnet__Proxy__L1CrossDomainMessenger, ++ kovan: Kovan__Proxy__L1CrossDomainMessenger, ++ goerli: Goerli__Proxy__L1CrossDomainMessenger, ++ }[network], ++ BondManager: { ++ mainnet: Mainnet__BondManager, ++ kovan: Kovan__BondManager, ++ goerli: Goerli__BondManager, ++ }[network], ++ }; ++}; ++exports.getL1ContractData = getL1ContractData; ++const OVM_ETH = require('../artifacts/contracts/L2/predeploys/OVM_ETH.sol/OVM_ETH.json'); ++const L2CrossDomainMessenger = require('../artifacts/contracts/L2/messaging/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json'); ++const OVM_L2ToL1MessagePasser = require('../artifacts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json'); ++const OVM_DeployerWhitelist = require('../artifacts/contracts/L2/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json'); ++const L2_BOBA = require('../artifacts/contracts/L2/predeploys/L2_BOBA.sol/L2_BOBA.json'); ++const L2_L1NativeToken = require('../artifacts/contracts/L2/predeploys/L2_L1NativeToken.sol/L2_L1NativeToken.json'); ++const getL2ContractData = () => { ++ return { ++ OVM_ETH: { ++ abi: OVM_ETH.abi, ++ address: predeploys_1.predeploys.OVM_ETH, ++ }, ++ L2CrossDomainMessenger: { ++ abi: L2CrossDomainMessenger.abi, ++ address: predeploys_1.predeploys.L2CrossDomainMessenger, ++ }, ++ OVM_L2ToL1MessagePasser: { ++ abi: OVM_L2ToL1MessagePasser.abi, ++ address: predeploys_1.predeploys.OVM_L2ToL1MessagePasser, ++ }, ++ OVM_DeployerWhitelist: { ++ abi: OVM_DeployerWhitelist.abi, ++ address: predeploys_1.predeploys.OVM_DeployerWhitelist, ++ }, ++ L2_BOBA: { ++ abi: L2_BOBA.abi, ++ address: predeploys_1.predeploys.L2_BOBA_ALT_L1, ++ }, ++ L2_L1NativeToken: { ++ abi: L2_L1NativeToken.abi, ++ address: predeploys_1.predeploys.L2_L1NativeToken_ALT_L1, ++ } ++ }; ++}; ++exports.getL2ContractData = getL2ContractData; ++//# sourceMappingURL=contract-data.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-data.js.map b/node_modules/@eth-optimism/contracts/dist/contract-data.js.map +new file mode 100644 +index 0000000..e869fb2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-data.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"contract-data.js","sourceRoot":"","sources":["../src/contract-data.ts"],"names":[],"mappings":";;;AACA,6CAAwD;AASxD,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,sCAAsC,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAA;AACnH,MAAM,oBAAoB,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAA;AAEnF,MAAM,yBAAyB,GAAG,OAAO,CAAC,8CAA8C,CAAC,CAAA;AACzF,MAAM,gCAAgC,GAAG,OAAO,CAAC,qDAAqD,CAAC,CAAA;AACvG,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,kBAAkB,GAAG,OAAO,CAAC,2CAA2C,CAAC,CAAA;AAE/E,MAAM,0BAA0B,GAAG,OAAO,CAAC,+CAA+C,CAAC,CAAA;AAC3F,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,qCAAqC,GAAG,OAAO,CAAC,0DAA0D,CAAC,CAAA;AACjH,MAAM,mBAAmB,GAAG,OAAO,CAAC,4CAA4C,CAAC,CAAA;AAE1E,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACpD,OAAO;QACL,kBAAkB,EAAE;YAClB,OAAO,EAAE,2BAA2B;YACpC,KAAK,EAAE,yBAAyB;YAChC,MAAM,EAAE,0BAA0B;SACnC,CAAC,OAAO,CAAC;QACV,yBAAyB,EAAE;YACzB,OAAO,EAAE,kCAAkC;YAC3C,KAAK,EAAE,gCAAgC;YACvC,MAAM,EAAE,iCAAiC;SAC1C,CAAC,OAAO,CAAC;QACV,sBAAsB,EAAE;YACtB,OAAO,EAAE,+BAA+B;YACxC,KAAK,EAAE,6BAA6B;YACpC,MAAM,EAAE,8BAA8B;SACvC,CAAC,OAAO,CAAC;QACV,oBAAoB,EAAE;YACpB,OAAO,EAAE,6BAA6B;YACtC,KAAK,EAAE,2BAA2B;YAClC,MAAM,EAAE,4BAA4B;SACrC,CAAC,OAAO,CAAC;QACV,6BAA6B,EAAE;YAC7B,OAAO,EAAE,sCAAsC;YAC/C,KAAK,EAAE,oCAAoC;YAC3C,MAAM,EAAE,qCAAqC;SAC9C,CAAC,OAAO,CAAC;QACV,WAAW,EAAE;YACX,OAAO,EAAE,oBAAoB;YAC7B,KAAK,EAAE,kBAAkB;YACzB,MAAM,EAAE,mBAAmB;SAC5B,CAAC,OAAO,CAAC;KACX,CAAA;AACH,CAAC,CAAA;AAjCY,QAAA,iBAAiB,qBAiC7B;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AACxF,MAAM,sBAAsB,GAAG,OAAO,CAAC,4FAA4F,CAAC,CAAA;AACpI,MAAM,uBAAuB,GAAG,OAAO,CAAC,+FAA+F,CAAC,CAAA;AACxI,MAAM,qBAAqB,GAAG,OAAO,CAAC,2FAA2F,CAAC,CAAA;AAClI,MAAM,OAAO,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AACxF,MAAM,gBAAgB,GAAG,OAAO,CAAC,iFAAiF,CAAC,CAAA;AAE5G,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,OAAO;QACL,OAAO,EAAE;YACP,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,uBAAW,CAAC,OAAO;SAC7B;QACD,sBAAsB,EAAE;YACtB,GAAG,EAAE,sBAAsB,CAAC,GAAG;YAC/B,OAAO,EAAE,uBAAW,CAAC,sBAAsB;SAC5C;QACD,uBAAuB,EAAE;YACvB,GAAG,EAAE,uBAAuB,CAAC,GAAG;YAChC,OAAO,EAAE,uBAAW,CAAC,uBAAuB;SAC7C;QACD,qBAAqB,EAAE;YACrB,GAAG,EAAE,qBAAqB,CAAC,GAAG;YAC9B,OAAO,EAAE,uBAAW,CAAC,qBAAqB;SAC3C;QACD,OAAO,EAAE;YACP,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,uBAAW,CAAC,cAAc;SACpC;QACD,gBAAgB,EAAE;YAChB,GAAG,EAAE,gBAAgB,CAAC,GAAG;YACzB,OAAO,EAAE,uBAAW,CAAC,uBAAuB;SAC7C;KACF,CAAA;AACH,CAAC,CAAA;AA3BY,QAAA,iBAAiB,qBA2B7B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-defs.d.ts b/node_modules/@eth-optimism/contracts/dist/contract-defs.d.ts +index 0c95da7..a2a2317 100644 +--- a/node_modules/@eth-optimism/contracts/dist/contract-defs.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/contract-defs.d.ts +@@ -2,3 +2,10 @@ import { ethers } from 'ethers'; + export declare const getContractDefinition: (name: string) => any; + export declare const getContractInterface: (name: string) => ethers.utils.Interface; + export declare const getContractFactory: (name: string, signer?: ethers.Signer) => ethers.ContractFactory; ++export declare const loadContract: (name: string, address: string, provider: ethers.providers.JsonRpcProvider) => ethers.Contract; ++export declare const loadContractFromManager: (args: { ++ name: string; ++ proxy?: string; ++ Lib_AddressManager: ethers.Contract; ++ provider: ethers.providers.JsonRpcProvider; ++}) => Promise; +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-defs.js b/node_modules/@eth-optimism/contracts/dist/contract-defs.js +index 46790d7..1cda5ac 100644 +--- a/node_modules/@eth-optimism/contracts/dist/contract-defs.js ++++ b/node_modules/@eth-optimism/contracts/dist/contract-defs.js +@@ -1,6 +1,6 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +-exports.getContractFactory = exports.getContractInterface = exports.getContractDefinition = void 0; ++exports.loadContractFromManager = exports.loadContract = exports.getContractFactory = exports.getContractInterface = exports.getContractDefinition = void 0; + const ethers_1 = require("ethers"); + const getContractDefinition = (name) => { + const { getContractArtifact } = require('./contract-artifacts'); +@@ -12,14 +12,27 @@ const getContractDefinition = (name) => { + }; + exports.getContractDefinition = getContractDefinition; + const getContractInterface = (name) => { +- const definition = exports.getContractDefinition(name); ++ const definition = (0, exports.getContractDefinition)(name); + return new ethers_1.ethers.utils.Interface(definition.abi); + }; + exports.getContractInterface = getContractInterface; + const getContractFactory = (name, signer) => { +- const definition = exports.getContractDefinition(name); +- const contractInterface = exports.getContractInterface(name); ++ const definition = (0, exports.getContractDefinition)(name); ++ const contractInterface = (0, exports.getContractInterface)(name); + return new ethers_1.ethers.ContractFactory(contractInterface, definition.bytecode, signer); + }; + exports.getContractFactory = getContractFactory; ++const loadContract = (name, address, provider) => { ++ return new ethers_1.ethers.Contract(address, (0, exports.getContractInterface)(name), provider); ++}; ++exports.loadContract = loadContract; ++const loadContractFromManager = async (args) => { ++ const { name, proxy, Lib_AddressManager, provider } = args; ++ const address = await Lib_AddressManager.getAddress(proxy ? proxy : name); ++ if (address === ethers_1.ethers.constants.AddressZero) { ++ throw new Error(`Lib_AddressManager does not have a record for a contract named: ${name}`); ++ } ++ return (0, exports.loadContract)(name, address, provider); ++}; ++exports.loadContractFromManager = loadContractFromManager; + //# sourceMappingURL=contract-defs.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-defs.js.map b/node_modules/@eth-optimism/contracts/dist/contract-defs.js.map +new file mode 100644 +index 0000000..cc08691 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-defs.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"contract-defs.js","sourceRoot":"","sources":["../src/contract-defs.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAExB,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAO,EAAE;IAKzD,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAA;KACjE;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAXY,QAAA,qBAAqB,yBAWjC;AAEM,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAA0B,EAAE;IAC3E,MAAM,UAAU,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,CAAA;IAC9C,OAAO,IAAI,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACnD,CAAC,CAAA;AAHY,QAAA,oBAAoB,wBAGhC;AAEM,MAAM,kBAAkB,GAAG,CAChC,IAAY,EACZ,MAAsB,EACE,EAAE;IAC1B,MAAM,UAAU,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,iBAAiB,GAAG,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAA;IACpD,OAAO,IAAI,eAAM,CAAC,eAAe,CAC/B,iBAAiB,EACjB,UAAU,CAAC,QAAQ,EACnB,MAAM,CACP,CAAA;AACH,CAAC,CAAA;AAXY,QAAA,kBAAkB,sBAW9B;AAEM,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,OAAe,EACf,QAA0C,EACzB,EAAE;IACnB,OAAO,IAAI,eAAM,CAAC,QAAQ,CACxB,OAAO,EACP,IAAA,4BAAoB,EAAC,IAAI,CAAQ,EACjC,QAAQ,CACT,CAAA;AACH,CAAC,CAAA;AAVY,QAAA,YAAY,gBAUxB;AAEM,MAAM,uBAAuB,GAAG,KAAK,EAAE,IAK7C,EAA4B,EAAE;IAC7B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAC1D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACzE,IAAI,OAAO,KAAK,eAAM,CAAC,SAAS,CAAC,WAAW,EAAE;QAC5C,MAAM,IAAI,KAAK,CACb,mEAAmE,IAAI,EAAE,CAC1E,CAAA;KACF;IACD,OAAO,IAAA,oBAAY,EAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC9C,CAAC,CAAA;AAdY,QAAA,uBAAuB,2BAcnC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js b/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js +index b86697c..7e727f7 100644 +--- a/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js ++++ b/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js +@@ -1,73 +1,239 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getDeployedContractArtifact = void 0; ++const bobaavax__BondManager = require('../deployments/bobaavax/BondManager.json'); ++const bobaavax__CanonicalTransactionChain = require('../deployments/bobaavax/CanonicalTransactionChain.json'); ++const bobaavax__ChainStorageContainer_CTC_batches = require('../deployments/bobaavax/ChainStorageContainer-CTC-batches.json'); ++const bobaavax__ChainStorageContainer_CTC_queue = require('../deployments/bobaavax/ChainStorageContainer-CTC-queue.json'); ++const bobaavax__ChainStorageContainer_SCC_batches = require('../deployments/bobaavax/ChainStorageContainer-SCC-batches.json'); ++const bobaavax__L1MultiMessageRelayer = require('../deployments/bobaavax/L1MultiMessageRelayer.json'); ++const bobaavax__Lib_AddressManager = require('../deployments/bobaavax/Lib_AddressManager.json'); ++const bobaavax__OVM_L1CrossDomainMessenger = require('../deployments/bobaavax/OVM_L1CrossDomainMessenger.json'); ++const bobaavax__Proxy__L1CrossDomainMessenger = require('../deployments/bobaavax/Proxy__L1CrossDomainMessenger.json'); ++const bobaavax__Proxy__L1StandardBridge = require('../deployments/bobaavax/Proxy__L1StandardBridge.json'); ++const bobaavax__StateCommitmentChain = require('../deployments/bobaavax/StateCommitmentChain.json'); ++const bobabase__BondManager = require('../deployments/bobabase/BondManager.json'); ++const bobabase__CanonicalTransactionChain = require('../deployments/bobabase/CanonicalTransactionChain.json'); ++const bobabase__ChainStorageContainer_CTC_batches = require('../deployments/bobabase/ChainStorageContainer-CTC-batches.json'); ++const bobabase__ChainStorageContainer_CTC_queue = require('../deployments/bobabase/ChainStorageContainer-CTC-queue.json'); ++const bobabase__ChainStorageContainer_SCC_batches = require('../deployments/bobabase/ChainStorageContainer-SCC-batches.json'); ++const bobabase__L1MultiMessageRelayer = require('../deployments/bobabase/L1MultiMessageRelayer.json'); ++const bobabase__Lib_AddressManager = require('../deployments/bobabase/Lib_AddressManager.json'); ++const bobabase__OVM_L1CrossDomainMessenger = require('../deployments/bobabase/OVM_L1CrossDomainMessenger.json'); ++const bobabase__Proxy__L1CrossDomainMessenger = require('../deployments/bobabase/Proxy__L1CrossDomainMessenger.json'); ++const bobabase__Proxy__L1StandardBridge = require('../deployments/bobabase/Proxy__L1StandardBridge.json'); ++const bobabase__StateCommitmentChain = require('../deployments/bobabase/StateCommitmentChain.json'); ++const bobabase__TK_L1BOBA = require('../deployments/bobabase/TK_L1BOBA.json'); ++const bobabeam__BondManager = require('../deployments/bobabeam/BondManager.json'); ++const bobabeam__CanonicalTransactionChain = require('../deployments/bobabeam/CanonicalTransactionChain.json'); ++const bobabeam__ChainStorageContainer_CTC_batches = require('../deployments/bobabeam/ChainStorageContainer-CTC-batches.json'); ++const bobabeam__ChainStorageContainer_CTC_queue = require('../deployments/bobabeam/ChainStorageContainer-CTC-queue.json'); ++const bobabeam__ChainStorageContainer_SCC_batches = require('../deployments/bobabeam/ChainStorageContainer-SCC-batches.json'); ++const bobabeam__L1MultiMessageRelayer = require('../deployments/bobabeam/L1MultiMessageRelayer.json'); ++const bobabeam__Lib_AddressManager = require('../deployments/bobabeam/Lib_AddressManager.json'); ++const bobabeam__OVM_L1CrossDomainMessenger = require('../deployments/bobabeam/OVM_L1CrossDomainMessenger.json'); ++const bobabeam__Proxy__L1CrossDomainMessenger = require('../deployments/bobabeam/Proxy__L1CrossDomainMessenger.json'); ++const bobabeam__Proxy__L1StandardBridge = require('../deployments/bobabeam/Proxy__L1StandardBridge.json'); ++const bobabeam__StateCommitmentChain = require('../deployments/bobabeam/StateCommitmentChain.json'); ++const bobabnb__BondManager = require('../deployments/bobabnb/BondManager.json'); ++const bobabnb__CanonicalTransactionChain = require('../deployments/bobabnb/CanonicalTransactionChain.json'); ++const bobabnb__ChainStorageContainer_CTC_batches = require('../deployments/bobabnb/ChainStorageContainer-CTC-batches.json'); ++const bobabnb__ChainStorageContainer_CTC_queue = require('../deployments/bobabnb/ChainStorageContainer-CTC-queue.json'); ++const bobabnb__ChainStorageContainer_SCC_batches = require('../deployments/bobabnb/ChainStorageContainer-SCC-batches.json'); ++const bobabnb__L1MultiMessageRelayer = require('../deployments/bobabnb/L1MultiMessageRelayer.json'); ++const bobabnb__Lib_AddressManager = require('../deployments/bobabnb/Lib_AddressManager.json'); ++const bobabnb__OVM_L1CrossDomainMessenger = require('../deployments/bobabnb/OVM_L1CrossDomainMessenger.json'); ++const bobabnb__Proxy__L1CrossDomainMessenger = require('../deployments/bobabnb/Proxy__L1CrossDomainMessenger.json'); ++const bobabnb__Proxy__L1StandardBridge = require('../deployments/bobabnb/Proxy__L1StandardBridge.json'); ++const bobabnb__StateCommitmentChain = require('../deployments/bobabnb/StateCommitmentChain.json'); ++const bobabnbtestnet__BondManager = require('../deployments/bobabnbtestnet/BondManager.json'); ++const bobabnbtestnet__CanonicalTransactionChain = require('../deployments/bobabnbtestnet/CanonicalTransactionChain.json'); ++const bobabnbtestnet__ChainStorageContainer_CTC_batches = require('../deployments/bobabnbtestnet/ChainStorageContainer-CTC-batches.json'); ++const bobabnbtestnet__ChainStorageContainer_CTC_queue = require('../deployments/bobabnbtestnet/ChainStorageContainer-CTC-queue.json'); ++const bobabnbtestnet__ChainStorageContainer_SCC_batches = require('../deployments/bobabnbtestnet/ChainStorageContainer-SCC-batches.json'); ++const bobabnbtestnet__L1MultiMessageRelayer = require('../deployments/bobabnbtestnet/L1MultiMessageRelayer.json'); ++const bobabnbtestnet__Lib_AddressManager = require('../deployments/bobabnbtestnet/Lib_AddressManager.json'); ++const bobabnbtestnet__OVM_L1CrossDomainMessenger = require('../deployments/bobabnbtestnet/OVM_L1CrossDomainMessenger.json'); ++const bobabnbtestnet__Proxy__L1CrossDomainMessenger = require('../deployments/bobabnbtestnet/Proxy__L1CrossDomainMessenger.json'); ++const bobabnbtestnet__Proxy__L1StandardBridge = require('../deployments/bobabnbtestnet/Proxy__L1StandardBridge.json'); ++const bobabnbtestnet__StateCommitmentChain = require('../deployments/bobabnbtestnet/StateCommitmentChain.json'); ++const bobabnbtestnet__TK_L1BOBA = require('../deployments/bobabnbtestnet/TK_L1BOBA.json'); ++const bobafuji__BondManager = require('../deployments/bobafuji/BondManager.json'); ++const bobafuji__CanonicalTransactionChain = require('../deployments/bobafuji/CanonicalTransactionChain.json'); ++const bobafuji__ChainStorageContainer_CTC_batches = require('../deployments/bobafuji/ChainStorageContainer-CTC-batches.json'); ++const bobafuji__ChainStorageContainer_CTC_queue = require('../deployments/bobafuji/ChainStorageContainer-CTC-queue.json'); ++const bobafuji__ChainStorageContainer_SCC_batches = require('../deployments/bobafuji/ChainStorageContainer-SCC-batches.json'); ++const bobafuji__L1MultiMessageRelayer = require('../deployments/bobafuji/L1MultiMessageRelayer.json'); ++const bobafuji__Lib_AddressManager = require('../deployments/bobafuji/Lib_AddressManager.json'); ++const bobafuji__OVM_L1CrossDomainMessenger = require('../deployments/bobafuji/OVM_L1CrossDomainMessenger.json'); ++const bobafuji__Proxy__L1CrossDomainMessenger = require('../deployments/bobafuji/Proxy__L1CrossDomainMessenger.json'); ++const bobafuji__Proxy__L1StandardBridge = require('../deployments/bobafuji/Proxy__L1StandardBridge.json'); ++const bobafuji__StateCommitmentChain = require('../deployments/bobafuji/StateCommitmentChain.json'); ++const bobafuji__TK_L1BOBA = require('../deployments/bobafuji/TK_L1BOBA.json'); ++const bobaopera__BondManager = require('../deployments/bobaopera/BondManager.json'); ++const bobaopera__CanonicalTransactionChain = require('../deployments/bobaopera/CanonicalTransactionChain.json'); ++const bobaopera__ChainStorageContainer_CTC_batches = require('../deployments/bobaopera/ChainStorageContainer-CTC-batches.json'); ++const bobaopera__ChainStorageContainer_CTC_queue = require('../deployments/bobaopera/ChainStorageContainer-CTC-queue.json'); ++const bobaopera__ChainStorageContainer_SCC_batches = require('../deployments/bobaopera/ChainStorageContainer-SCC-batches.json'); ++const bobaopera__L1MultiMessageRelayer = require('../deployments/bobaopera/L1MultiMessageRelayer.json'); ++const bobaopera__Lib_AddressManager = require('../deployments/bobaopera/Lib_AddressManager.json'); ++const bobaopera__OVM_L1CrossDomainMessenger = require('../deployments/bobaopera/OVM_L1CrossDomainMessenger.json'); ++const bobaopera__Proxy__L1CrossDomainMessenger = require('../deployments/bobaopera/Proxy__L1CrossDomainMessenger.json'); ++const bobaopera__Proxy__L1StandardBridge = require('../deployments/bobaopera/Proxy__L1StandardBridge.json'); ++const bobaopera__StateCommitmentChain = require('../deployments/bobaopera/StateCommitmentChain.json'); ++const bobaoperatestnet__BondManager = require('../deployments/bobaoperatestnet/BondManager.json'); ++const bobaoperatestnet__CanonicalTransactionChain = require('../deployments/bobaoperatestnet/CanonicalTransactionChain.json'); ++const bobaoperatestnet__ChainStorageContainer_CTC_batches = require('../deployments/bobaoperatestnet/ChainStorageContainer-CTC-batches.json'); ++const bobaoperatestnet__ChainStorageContainer_CTC_queue = require('../deployments/bobaoperatestnet/ChainStorageContainer-CTC-queue.json'); ++const bobaoperatestnet__ChainStorageContainer_SCC_batches = require('../deployments/bobaoperatestnet/ChainStorageContainer-SCC-batches.json'); ++const bobaoperatestnet__L1MultiMessageRelayer = require('../deployments/bobaoperatestnet/L1MultiMessageRelayer.json'); ++const bobaoperatestnet__Lib_AddressManager = require('../deployments/bobaoperatestnet/Lib_AddressManager.json'); ++const bobaoperatestnet__OVM_L1CrossDomainMessenger = require('../deployments/bobaoperatestnet/OVM_L1CrossDomainMessenger.json'); ++const bobaoperatestnet__Proxy__L1CrossDomainMessenger = require('../deployments/bobaoperatestnet/Proxy__L1CrossDomainMessenger.json'); ++const bobaoperatestnet__Proxy__L1StandardBridge = require('../deployments/bobaoperatestnet/Proxy__L1StandardBridge.json'); ++const bobaoperatestnet__StateCommitmentChain = require('../deployments/bobaoperatestnet/StateCommitmentChain.json'); ++const bobaoperatestnet__TK_L1BOBA = require('../deployments/bobaoperatestnet/TK_L1BOBA.json'); + const goerli__BondManager = require('../deployments/goerli/BondManager.json'); + const goerli__CanonicalTransactionChain = require('../deployments/goerli/CanonicalTransactionChain.json'); + const goerli__ChainStorageContainer_CTC_batches = require('../deployments/goerli/ChainStorageContainer-CTC-batches.json'); + const goerli__ChainStorageContainer_CTC_queue = require('../deployments/goerli/ChainStorageContainer-CTC-queue.json'); + const goerli__ChainStorageContainer_SCC_batches = require('../deployments/goerli/ChainStorageContainer-SCC-batches.json'); ++const goerli__L1MultiMessageRelayer = require('../deployments/goerli/L1MultiMessageRelayer.json'); + const goerli__Lib_AddressManager = require('../deployments/goerli/Lib_AddressManager.json'); + const goerli__OVM_L1CrossDomainMessenger = require('../deployments/goerli/OVM_L1CrossDomainMessenger.json'); +-const goerli__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json'); +-const goerli__Proxy__OVM_L1StandardBridge = require('../deployments/goerli/Proxy__OVM_L1StandardBridge.json'); ++const goerli__Proxy__L1CrossDomainMessenger = require('../deployments/goerli/Proxy__L1CrossDomainMessenger.json'); ++const goerli__Proxy__L1StandardBridge = require('../deployments/goerli/Proxy__L1StandardBridge.json'); + const goerli__StateCommitmentChain = require('../deployments/goerli/StateCommitmentChain.json'); +-const kovan__AddressDictator = require('../deployments/kovan/AddressDictator.json'); +-const kovan__BondManager = require('../deployments/kovan/BondManager.json'); +-const kovan__CanonicalTransactionChain = require('../deployments/kovan/CanonicalTransactionChain.json'); +-const kovan__ChainStorageContainer_CTC_batches = require('../deployments/kovan/ChainStorageContainer-CTC-batches.json'); +-const kovan__ChainStorageContainer_SCC_batches = require('../deployments/kovan/ChainStorageContainer-SCC-batches.json'); +-const kovan__ChugSplashDictator = require('../deployments/kovan/ChugSplashDictator.json'); +-const kovan__L1StandardBridge_for_verification_only = require('../deployments/kovan/L1StandardBridge_for_verification_only.json'); +-const kovan__Lib_AddressManager = require('../deployments/kovan/Lib_AddressManager.json'); +-const kovan__OVM_L1CrossDomainMessenger = require('../deployments/kovan/OVM_L1CrossDomainMessenger.json'); +-const kovan__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json'); +-const kovan__Proxy__OVM_L1StandardBridge = require('../deployments/kovan/Proxy__OVM_L1StandardBridge.json'); +-const kovan__StateCommitmentChain = require('../deployments/kovan/StateCommitmentChain.json'); +-const mainnet__AddressDictator = require('../deployments/mainnet/AddressDictator.json'); ++const goerli__TK_L1BOBA = require('../deployments/goerli/TK_L1BOBA.json'); + const mainnet__BondManager = require('../deployments/mainnet/BondManager.json'); + const mainnet__CanonicalTransactionChain = require('../deployments/mainnet/CanonicalTransactionChain.json'); + const mainnet__ChainStorageContainer_CTC_batches = require('../deployments/mainnet/ChainStorageContainer-CTC-batches.json'); ++const mainnet__ChainStorageContainer_CTC_queue = require('../deployments/mainnet/ChainStorageContainer-CTC-queue.json'); + const mainnet__ChainStorageContainer_SCC_batches = require('../deployments/mainnet/ChainStorageContainer-SCC-batches.json'); +-const mainnet__ChugSplashDictator = require('../deployments/mainnet/ChugSplashDictator.json'); +-const mainnet__L1StandardBridge_for_verification_only = require('../deployments/mainnet/L1StandardBridge_for_verification_only.json'); ++const mainnet__L1MultiMessageRelayer = require('../deployments/mainnet/L1MultiMessageRelayer.json'); + const mainnet__Lib_AddressManager = require('../deployments/mainnet/Lib_AddressManager.json'); + const mainnet__OVM_L1CrossDomainMessenger = require('../deployments/mainnet/OVM_L1CrossDomainMessenger.json'); ++const mainnet__Proxy__L1CrossDomainMessenger = require('../deployments/mainnet/Proxy__L1CrossDomainMessenger.json'); ++const mainnet__Proxy__L1StandardBridge = require('../deployments/mainnet/Proxy__L1StandardBridge.json'); + const mainnet__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json'); + const mainnet__Proxy__OVM_L1StandardBridge = require('../deployments/mainnet/Proxy__OVM_L1StandardBridge.json'); + const mainnet__StateCommitmentChain = require('../deployments/mainnet/StateCommitmentChain.json'); + const getDeployedContractArtifact = (name, network) => { + return { ++ bobaavax__BondManager, ++ bobaavax__CanonicalTransactionChain, ++ bobaavax__ChainStorageContainer_CTC_batches, ++ bobaavax__ChainStorageContainer_CTC_queue, ++ bobaavax__ChainStorageContainer_SCC_batches, ++ bobaavax__L1MultiMessageRelayer, ++ bobaavax__Lib_AddressManager, ++ bobaavax__OVM_L1CrossDomainMessenger, ++ bobaavax__Proxy__L1CrossDomainMessenger, ++ bobaavax__Proxy__L1StandardBridge, ++ bobaavax__StateCommitmentChain, ++ bobabase__BondManager, ++ bobabase__CanonicalTransactionChain, ++ bobabase__ChainStorageContainer_CTC_batches, ++ bobabase__ChainStorageContainer_CTC_queue, ++ bobabase__ChainStorageContainer_SCC_batches, ++ bobabase__L1MultiMessageRelayer, ++ bobabase__Lib_AddressManager, ++ bobabase__OVM_L1CrossDomainMessenger, ++ bobabase__Proxy__L1CrossDomainMessenger, ++ bobabase__Proxy__L1StandardBridge, ++ bobabase__StateCommitmentChain, ++ bobabase__TK_L1BOBA, ++ bobabeam__BondManager, ++ bobabeam__CanonicalTransactionChain, ++ bobabeam__ChainStorageContainer_CTC_batches, ++ bobabeam__ChainStorageContainer_CTC_queue, ++ bobabeam__ChainStorageContainer_SCC_batches, ++ bobabeam__L1MultiMessageRelayer, ++ bobabeam__Lib_AddressManager, ++ bobabeam__OVM_L1CrossDomainMessenger, ++ bobabeam__Proxy__L1CrossDomainMessenger, ++ bobabeam__Proxy__L1StandardBridge, ++ bobabeam__StateCommitmentChain, ++ bobabnb__BondManager, ++ bobabnb__CanonicalTransactionChain, ++ bobabnb__ChainStorageContainer_CTC_batches, ++ bobabnb__ChainStorageContainer_CTC_queue, ++ bobabnb__ChainStorageContainer_SCC_batches, ++ bobabnb__L1MultiMessageRelayer, ++ bobabnb__Lib_AddressManager, ++ bobabnb__OVM_L1CrossDomainMessenger, ++ bobabnb__Proxy__L1CrossDomainMessenger, ++ bobabnb__Proxy__L1StandardBridge, ++ bobabnb__StateCommitmentChain, ++ bobabnbtestnet__BondManager, ++ bobabnbtestnet__CanonicalTransactionChain, ++ bobabnbtestnet__ChainStorageContainer_CTC_batches, ++ bobabnbtestnet__ChainStorageContainer_CTC_queue, ++ bobabnbtestnet__ChainStorageContainer_SCC_batches, ++ bobabnbtestnet__L1MultiMessageRelayer, ++ bobabnbtestnet__Lib_AddressManager, ++ bobabnbtestnet__OVM_L1CrossDomainMessenger, ++ bobabnbtestnet__Proxy__L1CrossDomainMessenger, ++ bobabnbtestnet__Proxy__L1StandardBridge, ++ bobabnbtestnet__StateCommitmentChain, ++ bobabnbtestnet__TK_L1BOBA, ++ bobafuji__BondManager, ++ bobafuji__CanonicalTransactionChain, ++ bobafuji__ChainStorageContainer_CTC_batches, ++ bobafuji__ChainStorageContainer_CTC_queue, ++ bobafuji__ChainStorageContainer_SCC_batches, ++ bobafuji__L1MultiMessageRelayer, ++ bobafuji__Lib_AddressManager, ++ bobafuji__OVM_L1CrossDomainMessenger, ++ bobafuji__Proxy__L1CrossDomainMessenger, ++ bobafuji__Proxy__L1StandardBridge, ++ bobafuji__StateCommitmentChain, ++ bobafuji__TK_L1BOBA, ++ bobaopera__BondManager, ++ bobaopera__CanonicalTransactionChain, ++ bobaopera__ChainStorageContainer_CTC_batches, ++ bobaopera__ChainStorageContainer_CTC_queue, ++ bobaopera__ChainStorageContainer_SCC_batches, ++ bobaopera__L1MultiMessageRelayer, ++ bobaopera__Lib_AddressManager, ++ bobaopera__OVM_L1CrossDomainMessenger, ++ bobaopera__Proxy__L1CrossDomainMessenger, ++ bobaopera__Proxy__L1StandardBridge, ++ bobaopera__StateCommitmentChain, ++ bobaoperatestnet__BondManager, ++ bobaoperatestnet__CanonicalTransactionChain, ++ bobaoperatestnet__ChainStorageContainer_CTC_batches, ++ bobaoperatestnet__ChainStorageContainer_CTC_queue, ++ bobaoperatestnet__ChainStorageContainer_SCC_batches, ++ bobaoperatestnet__L1MultiMessageRelayer, ++ bobaoperatestnet__Lib_AddressManager, ++ bobaoperatestnet__OVM_L1CrossDomainMessenger, ++ bobaoperatestnet__Proxy__L1CrossDomainMessenger, ++ bobaoperatestnet__Proxy__L1StandardBridge, ++ bobaoperatestnet__StateCommitmentChain, ++ bobaoperatestnet__TK_L1BOBA, + goerli__BondManager, + goerli__CanonicalTransactionChain, + goerli__ChainStorageContainer_CTC_batches, + goerli__ChainStorageContainer_CTC_queue, + goerli__ChainStorageContainer_SCC_batches, ++ goerli__L1MultiMessageRelayer, + goerli__Lib_AddressManager, + goerli__OVM_L1CrossDomainMessenger, +- goerli__Proxy__OVM_L1CrossDomainMessenger, +- goerli__Proxy__OVM_L1StandardBridge, ++ goerli__Proxy__L1CrossDomainMessenger, ++ goerli__Proxy__L1StandardBridge, + goerli__StateCommitmentChain, +- kovan__AddressDictator, +- kovan__BondManager, +- kovan__CanonicalTransactionChain, +- kovan__ChainStorageContainer_CTC_batches, +- kovan__ChainStorageContainer_SCC_batches, +- kovan__ChugSplashDictator, +- kovan__L1StandardBridge_for_verification_only, +- kovan__Lib_AddressManager, +- kovan__OVM_L1CrossDomainMessenger, +- kovan__Proxy__OVM_L1CrossDomainMessenger, +- kovan__Proxy__OVM_L1StandardBridge, +- kovan__StateCommitmentChain, +- mainnet__AddressDictator, ++ goerli__TK_L1BOBA, + mainnet__BondManager, + mainnet__CanonicalTransactionChain, + mainnet__ChainStorageContainer_CTC_batches, ++ mainnet__ChainStorageContainer_CTC_queue, + mainnet__ChainStorageContainer_SCC_batches, +- mainnet__ChugSplashDictator, +- mainnet__L1StandardBridge_for_verification_only, ++ mainnet__L1MultiMessageRelayer, + mainnet__Lib_AddressManager, + mainnet__OVM_L1CrossDomainMessenger, ++ mainnet__Proxy__L1CrossDomainMessenger, ++ mainnet__Proxy__L1StandardBridge, + mainnet__Proxy__OVM_L1CrossDomainMessenger, + mainnet__Proxy__OVM_L1StandardBridge, + mainnet__StateCommitmentChain +diff --git a/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js.map b/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js.map +new file mode 100644 +index 0000000..a6f231e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/contract-deployed-artifacts.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"contract-deployed-artifacts.js","sourceRoot":"","sources":["../src/contract-deployed-artifacts.ts"],"names":[],"mappings":";;;AAME,MAAM,qBAAqB,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAA;AACnF,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,qBAAqB,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAA;AACjF,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,mBAAmB,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAA;AAC7E,MAAM,qBAAqB,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAA;AACjF,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,oBAAoB,GAAG,OAAO,CAAC,yCAAyC,CAAC,CAAA;AAC/E,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,wCAAwC,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;AACvH,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,sCAAsC,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAA;AACnH,MAAM,gCAAgC,GAAG,OAAO,CAAC,qDAAqD,CAAC,CAAA;AACvG,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,iDAAiD,GAAG,OAAO,CAAC,sEAAsE,CAAC,CAAA;AACzI,MAAM,+CAA+C,GAAG,OAAO,CAAC,oEAAoE,CAAC,CAAA;AACrI,MAAM,iDAAiD,GAAG,OAAO,CAAC,sEAAsE,CAAC,CAAA;AACzI,MAAM,qCAAqC,GAAG,OAAO,CAAC,0DAA0D,CAAC,CAAA;AACjH,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,6CAA6C,GAAG,OAAO,CAAC,kEAAkE,CAAC,CAAA;AACjI,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,yBAAyB,GAAG,OAAO,CAAC,8CAA8C,CAAC,CAAA;AACzF,MAAM,qBAAqB,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAA;AACjF,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,mBAAmB,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAA;AAC7E,MAAM,sBAAsB,GAAG,OAAO,CAAC,2CAA2C,CAAC,CAAA;AACnF,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,4CAA4C,GAAG,OAAO,CAAC,iEAAiE,CAAC,CAAA;AAC/H,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,4CAA4C,GAAG,OAAO,CAAC,iEAAiE,CAAC,CAAA;AAC/H,MAAM,gCAAgC,GAAG,OAAO,CAAC,qDAAqD,CAAC,CAAA;AACvG,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,qCAAqC,GAAG,OAAO,CAAC,0DAA0D,CAAC,CAAA;AACjH,MAAM,wCAAwC,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;AACvH,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,2CAA2C,GAAG,OAAO,CAAC,gEAAgE,CAAC,CAAA;AAC7H,MAAM,mDAAmD,GAAG,OAAO,CAAC,wEAAwE,CAAC,CAAA;AAC7I,MAAM,iDAAiD,GAAG,OAAO,CAAC,sEAAsE,CAAC,CAAA;AACzI,MAAM,mDAAmD,GAAG,OAAO,CAAC,wEAAwE,CAAC,CAAA;AAC7I,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,4CAA4C,GAAG,OAAO,CAAC,iEAAiE,CAAC,CAAA;AAC/H,MAAM,+CAA+C,GAAG,OAAO,CAAC,oEAAoE,CAAC,CAAA;AACrI,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,sCAAsC,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAA;AACnH,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,mBAAmB,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAA;AAC7E,MAAM,iCAAiC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACzG,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,uCAAuC,GAAG,OAAO,CAAC,4DAA4D,CAAC,CAAA;AACrH,MAAM,yCAAyC,GAAG,OAAO,CAAC,8DAA8D,CAAC,CAAA;AACzH,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AACjG,MAAM,0BAA0B,GAAG,OAAO,CAAC,+CAA+C,CAAC,CAAA;AAC3F,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,qCAAqC,GAAG,OAAO,CAAC,0DAA0D,CAAC,CAAA;AACjH,MAAM,+BAA+B,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAA;AACrG,MAAM,4BAA4B,GAAG,OAAO,CAAC,iDAAiD,CAAC,CAAA;AAC/F,MAAM,iBAAiB,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAA;AACzE,MAAM,oBAAoB,GAAG,OAAO,CAAC,yCAAyC,CAAC,CAAA;AAC/E,MAAM,kCAAkC,GAAG,OAAO,CAAC,uDAAuD,CAAC,CAAA;AAC3G,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,wCAAwC,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;AACvH,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,8BAA8B,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AACnG,MAAM,2BAA2B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAA;AAC7F,MAAM,mCAAmC,GAAG,OAAO,CAAC,wDAAwD,CAAC,CAAA;AAC7G,MAAM,sCAAsC,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAA;AACnH,MAAM,gCAAgC,GAAG,OAAO,CAAC,qDAAqD,CAAC,CAAA;AACvG,MAAM,0CAA0C,GAAG,OAAO,CAAC,+DAA+D,CAAC,CAAA;AAC3H,MAAM,oCAAoC,GAAG,OAAO,CAAC,yDAAyD,CAAC,CAAA;AAC/G,MAAM,6BAA6B,GAAG,OAAO,CAAC,kDAAkD,CAAC,CAAA;AAExF,MAAM,2BAA2B,GAAG,CAAC,IAAY,EAAE,OAAe,EAAO,EAAE;IAChF,OAAO;QACL,qBAAqB;QAC3B,mCAAmC;QACnC,2CAA2C;QAC3C,yCAAyC;QACzC,2CAA2C;QAC3C,+BAA+B;QAC/B,4BAA4B;QAC5B,oCAAoC;QACpC,uCAAuC;QACvC,iCAAiC;QACjC,8BAA8B;QAC9B,qBAAqB;QACrB,mCAAmC;QACnC,2CAA2C;QAC3C,yCAAyC;QACzC,2CAA2C;QAC3C,+BAA+B;QAC/B,4BAA4B;QAC5B,oCAAoC;QACpC,uCAAuC;QACvC,iCAAiC;QACjC,8BAA8B;QAC9B,mBAAmB;QACnB,qBAAqB;QACrB,mCAAmC;QACnC,2CAA2C;QAC3C,yCAAyC;QACzC,2CAA2C;QAC3C,+BAA+B;QAC/B,4BAA4B;QAC5B,oCAAoC;QACpC,uCAAuC;QACvC,iCAAiC;QACjC,8BAA8B;QAC9B,oBAAoB;QACpB,kCAAkC;QAClC,0CAA0C;QAC1C,wCAAwC;QACxC,0CAA0C;QAC1C,8BAA8B;QAC9B,2BAA2B;QAC3B,mCAAmC;QACnC,sCAAsC;QACtC,gCAAgC;QAChC,6BAA6B;QAC7B,2BAA2B;QAC3B,yCAAyC;QACzC,iDAAiD;QACjD,+CAA+C;QAC/C,iDAAiD;QACjD,qCAAqC;QACrC,kCAAkC;QAClC,0CAA0C;QAC1C,6CAA6C;QAC7C,uCAAuC;QACvC,oCAAoC;QACpC,yBAAyB;QACzB,qBAAqB;QACrB,mCAAmC;QACnC,2CAA2C;QAC3C,yCAAyC;QACzC,2CAA2C;QAC3C,+BAA+B;QAC/B,4BAA4B;QAC5B,oCAAoC;QACpC,uCAAuC;QACvC,iCAAiC;QACjC,8BAA8B;QAC9B,mBAAmB;QACnB,sBAAsB;QACtB,oCAAoC;QACpC,4CAA4C;QAC5C,0CAA0C;QAC1C,4CAA4C;QAC5C,gCAAgC;QAChC,6BAA6B;QAC7B,qCAAqC;QACrC,wCAAwC;QACxC,kCAAkC;QAClC,+BAA+B;QAC/B,6BAA6B;QAC7B,2CAA2C;QAC3C,mDAAmD;QACnD,iDAAiD;QACjD,mDAAmD;QACnD,uCAAuC;QACvC,oCAAoC;QACpC,4CAA4C;QAC5C,+CAA+C;QAC/C,yCAAyC;QACzC,sCAAsC;QACtC,2BAA2B;QAC3B,mBAAmB;QACnB,iCAAiC;QACjC,yCAAyC;QACzC,uCAAuC;QACvC,yCAAyC;QACzC,6BAA6B;QAC7B,0BAA0B;QAC1B,kCAAkC;QAClC,qCAAqC;QACrC,+BAA+B;QAC/B,4BAA4B;QAC5B,iBAAiB;QACjB,oBAAoB;QACpB,kCAAkC;QAClC,0CAA0C;QAC1C,wCAAwC;QACxC,0CAA0C;QAC1C,8BAA8B;QAC9B,2BAA2B;QAC3B,mCAAmC;QACnC,sCAAsC;QACtC,gCAAgC;QAChC,0CAA0C;QAC1C,oCAAoC;QACpC,6BAA6B;KACxB,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAA;AAxHY,QAAA,2BAA2B,+BAwHvC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/deploy-utils.d.ts b/node_modules/@eth-optimism/contracts/dist/deploy-utils.d.ts +deleted file mode 100644 +index 3026982..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/deploy-utils.d.ts ++++ /dev/null +@@ -1,30 +0,0 @@ +-import { ethers, Contract } from 'ethers'; +-import { Provider } from '@ethersproject/abstract-provider'; +-import { Signer } from '@ethersproject/abstract-signer'; +-export declare const deployAndVerifyAndThen: ({ hre, name, args, contract, iface, postDeployAction, }: { +- hre: any; +- name: string; +- args: any[]; +- contract?: string; +- iface?: string; +- postDeployAction?: (contract: Contract) => Promise; +-}) => Promise; +-export declare const getAdvancedContract: (opts: { +- hre: any; +- contract: Contract; +-}) => Contract; +-export declare const fundAccount: (hre: any, address: string, amount: ethers.BigNumber) => Promise; +-export declare const sendImpersonatedTx: (opts: { +- hre: any; +- contract: ethers.Contract; +- fn: string; +- from: string; +- gas: string; +- args: any[]; +-}) => Promise; +-export declare const getContractFromArtifact: (hre: any, name: string, options?: { +- iface?: string; +- signerOrProvider?: Signer | Provider | string; +-}) => Promise; +-export declare const isHardhatNode: (hre: any) => Promise; +-export declare const BIG_BALANCE: ethers.BigNumber; +diff --git a/node_modules/@eth-optimism/contracts/dist/deploy-utils.js b/node_modules/@eth-optimism/contracts/dist/deploy-utils.js +deleted file mode 100644 +index 2d9e183..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/deploy-utils.js ++++ /dev/null +@@ -1,164 +0,0 @@ +-"use strict"; +-Object.defineProperty(exports, "__esModule", { value: true }); +-exports.BIG_BALANCE = exports.isHardhatNode = exports.getContractFromArtifact = exports.sendImpersonatedTx = exports.fundAccount = exports.getAdvancedContract = exports.deployAndVerifyAndThen = void 0; +-const ethers_1 = require("ethers"); +-const core_utils_1 = require("@eth-optimism/core-utils"); +-const deployAndVerifyAndThen = async ({ hre, name, args, contract, iface, postDeployAction, }) => { +- const { deploy } = hre.deployments; +- const { deployer } = await hre.getNamedAccounts(); +- const result = await deploy(name, { +- contract, +- from: deployer, +- args, +- log: true, +- waitConfirmations: hre.deployConfig.numDeployConfirmations, +- }); +- await hre.ethers.provider.waitForTransaction(result.transactionHash); +- if (result.newlyDeployed) { +- if (!(await exports.isHardhatNode(hre))) { +- try { +- console.log('Verifying on Etherscan...'); +- await hre.run('verify:verify', { +- address: result.address, +- constructorArguments: args, +- }); +- console.log('Successfully verified on Etherscan'); +- } +- catch (error) { +- console.log('Error when verifying bytecode on Etherscan:'); +- console.log(error); +- } +- try { +- console.log('Verifying on Sourcify...'); +- await hre.run('sourcify'); +- console.log('Successfully verified on Sourcify'); +- } +- catch (error) { +- console.log('Error when verifying bytecode on Sourcify:'); +- console.log(error); +- } +- } +- if (postDeployAction) { +- const signer = hre.ethers.provider.getSigner(deployer); +- let abi = result.abi; +- if (iface !== undefined) { +- const factory = await hre.ethers.getContractFactory(iface); +- abi = factory.interface; +- } +- await postDeployAction(exports.getAdvancedContract({ +- hre, +- contract: new ethers_1.Contract(result.address, abi, signer), +- })); +- } +- } +-}; +-exports.deployAndVerifyAndThen = deployAndVerifyAndThen; +-const getAdvancedContract = (opts) => { +- const def = Object.defineProperty; +- Object.defineProperty = (obj, propName, prop) => { +- prop.writable = true; +- return def(obj, propName, prop); +- }; +- const contract = new ethers_1.Contract(opts.contract.address, opts.contract.interface, opts.contract.signer || opts.contract.provider); +- Object.defineProperty = def; +- for (const fnName of Object.keys(contract.functions)) { +- const fn = contract[fnName].bind(contract); +- contract[fnName] = async (...args) => { +- let gasPrice = opts.hre.deployConfig.gasPrice || undefined; +- if (contract.interface.getFunction(fnName).constant) { +- gasPrice = 0; +- } +- const tx = await fn(...args, { +- gasPrice, +- }); +- if (typeof tx !== 'object' || typeof tx.wait !== 'function') { +- return tx; +- } +- const maxTimeout = 120; +- let timeout = 0; +- while (true) { +- await core_utils_1.sleep(1000); +- const receipt = await contract.provider.getTransactionReceipt(tx.hash); +- if (receipt === null) { +- timeout++; +- if (timeout > maxTimeout && opts.hre.network.name === 'kovan') { +- console.log(`WARNING: Exceeded max timeout on transaction. Attempting to submit transaction again...`); +- return contract[fnName](...args); +- } +- } +- else if (receipt.confirmations >= opts.hre.deployConfig.numDeployConfirmations) { +- return tx; +- } +- } +- }; +- } +- return contract; +-}; +-exports.getAdvancedContract = getAdvancedContract; +-const fundAccount = async (hre, address, amount) => { +- if (hre.deployConfig.forked !== 'true') { +- throw new Error('this method can only be used against a forked network'); +- } +- console.log(`Funding account ${address}...`); +- await hre.ethers.provider.send('hardhat_setBalance', [ +- address, +- amount.toHexString(), +- ]); +- console.log(`Waiting for balance to reflect...`); +- await core_utils_1.awaitCondition(async () => { +- const balance = await hre.ethers.provider.getBalance(address); +- return balance.gte(amount); +- }, 5000, 100); +- console.log(`Account successfully funded.`); +-}; +-exports.fundAccount = fundAccount; +-const sendImpersonatedTx = async (opts) => { +- if (opts.hre.deployConfig.forked !== 'true') { +- throw new Error('this method can only be used against a forked network'); +- } +- console.log(`Impersonating account ${opts.from}...`); +- await opts.hre.ethers.provider.send('hardhat_impersonateAccount', [opts.from]); +- console.log(`Funding account ${opts.from}...`); +- await exports.fundAccount(opts.hre, opts.from, exports.BIG_BALANCE); +- console.log(`Sending impersonated transaction...`); +- const tx = await opts.contract.populateTransaction[opts.fn](...opts.args); +- const provider = new opts.hre.ethers.providers.JsonRpcProvider(opts.hre.network.config.url); +- await provider.send('eth_sendTransaction', [ +- Object.assign(Object.assign({}, tx), { from: opts.from, gas: opts.gas }), +- ]); +- console.log(`Stopping impersonation of account ${opts.from}...`); +- await opts.hre.ethers.provider.send('hardhat_stopImpersonatingAccount', [ +- opts.from, +- ]); +-}; +-exports.sendImpersonatedTx = sendImpersonatedTx; +-const getContractFromArtifact = async (hre, name, options = {}) => { +- const artifact = await hre.deployments.get(name); +- await hre.ethers.provider.waitForTransaction(artifact.receipt.transactionHash); +- let iface = new hre.ethers.utils.Interface(artifact.abi); +- if (options.iface) { +- const factory = await hre.ethers.getContractFactory(options.iface); +- iface = factory.interface; +- } +- let signerOrProvider = hre.ethers.provider; +- if (options.signerOrProvider) { +- if (typeof options.signerOrProvider === 'string') { +- signerOrProvider = hre.ethers.provider.getSigner(options.signerOrProvider); +- } +- else { +- signerOrProvider = options.signerOrProvider; +- } +- } +- return exports.getAdvancedContract({ +- hre, +- contract: new hre.ethers.Contract(artifact.address, iface, signerOrProvider), +- }); +-}; +-exports.getContractFromArtifact = getContractFromArtifact; +-const isHardhatNode = async (hre) => { +- const { chainId } = await hre.ethers.provider.getNetwork(); +- return chainId === 31337; +-}; +-exports.isHardhatNode = isHardhatNode; +-exports.BIG_BALANCE = ethers_1.ethers.BigNumber.from(`0xFFFFFFFFFFFFFFFFFFFF`); +-//# sourceMappingURL=deploy-utils.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.d.ts b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.d.ts +new file mode 100644 +index 0000000..8a89c68 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.d.ts +@@ -0,0 +1,24 @@ ++import { Contract } from 'ethers'; ++import { Provider } from '@ethersproject/abstract-provider'; ++import { Signer } from '@ethersproject/abstract-signer'; ++export declare const waitUntilTrue: (check: () => Promise, opts?: { ++ retries?: number; ++ delay?: number; ++}) => Promise; ++export declare const registerAddress: ({ hre, name, address, }: { ++ hre: any; ++ name: any; ++ address: any; ++}) => Promise; ++export declare const deployAndRegister: ({ hre, name, args, contract, iface, postDeployAction, }: { ++ hre: any; ++ name: string; ++ args: any[]; ++ contract?: string; ++ iface?: string; ++ postDeployAction?: (contract: Contract) => Promise; ++}) => Promise; ++export declare const getDeployedContract: (hre: any, name: string, options?: { ++ iface?: string; ++ signerOrProvider?: Signer | Provider | string; ++}) => Promise; +diff --git a/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js +new file mode 100644 +index 0000000..e266425 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js +@@ -0,0 +1,104 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.getDeployedContract = exports.deployAndRegister = exports.registerAddress = exports.waitUntilTrue = void 0; ++const ethers_1 = require("ethers"); ++const core_utils_1 = require("@eth-optimism/core-utils"); ++const waitUntilTrue = async (check, opts = {}) => { ++ opts.retries = opts.retries || 100; ++ opts.delay = opts.delay || 5000; ++ let retries = 0; ++ while (!(await check())) { ++ if (retries > opts.retries) { ++ throw new Error(`check failed after ${opts.retries} attempts`); ++ } ++ retries++; ++ await (0, core_utils_1.sleep)(opts.delay); ++ } ++}; ++exports.waitUntilTrue = waitUntilTrue; ++const registerAddress = async ({ hre, name, address, }) => { ++ const { deployer } = await hre.getNamedAccounts(); ++ const Lib_AddressManager = await (0, exports.getDeployedContract)(hre, 'Lib_AddressManager', { ++ signerOrProvider: deployer, ++ }); ++ const currentAddress = await Lib_AddressManager.getAddress(name); ++ if (address === currentAddress) { ++ console.log(`✓ Not registering address for ${name} because it's already been correctly registered`); ++ return; ++ } ++ console.log(`Registering address for ${name} to ${address}...`); ++ await Lib_AddressManager.setAddress(name, address); ++ console.log(`Waiting for registration to reflect on-chain...`); ++ await (0, exports.waitUntilTrue)(async () => { ++ return (0, core_utils_1.hexStringEquals)(await Lib_AddressManager.getAddress(name), address); ++ }); ++ console.log(`✓ Registered address for ${name}`); ++}; ++exports.registerAddress = registerAddress; ++const deployAndRegister = async ({ hre, name, args, contract, iface, postDeployAction, }) => { ++ const { deploy } = hre.deployments; ++ const { deployer } = await hre.getNamedAccounts(); ++ const result = await deploy(name, { ++ contract, ++ from: deployer, ++ args, ++ log: true, ++ }); ++ await hre.ethers.provider.waitForTransaction(result.transactionHash); ++ if (result.newlyDeployed) { ++ if (postDeployAction) { ++ const signer = hre.ethers.provider.getSigner(deployer); ++ let abi = result.abi; ++ if (iface !== undefined) { ++ const factory = await hre.ethers.getContractFactory(iface); ++ abi = factory.interface; ++ } ++ const instance = new ethers_1.Contract(result.address, abi, signer); ++ await postDeployAction(instance); ++ } ++ await (0, exports.registerAddress)({ ++ hre, ++ name, ++ address: result.address, ++ }); ++ } ++}; ++exports.deployAndRegister = deployAndRegister; ++const getDeployedContract = async (hre, name, options = {}) => { ++ const deployed = await hre.deployments.get(name); ++ await hre.ethers.provider.waitForTransaction(deployed.receipt.transactionHash); ++ let iface = new hre.ethers.utils.Interface(deployed.abi); ++ if (options.iface) { ++ const factory = await hre.ethers.getContractFactory(options.iface); ++ iface = factory.interface; ++ } ++ let signerOrProvider = hre.ethers.provider; ++ if (options.signerOrProvider) { ++ if (typeof options.signerOrProvider === 'string') { ++ signerOrProvider = hre.ethers.provider.getSigner(options.signerOrProvider); ++ } ++ else { ++ signerOrProvider = options.signerOrProvider; ++ } ++ } ++ const def = Object.defineProperty; ++ Object.defineProperty = (obj, propName, prop) => { ++ prop.writable = true; ++ return def(obj, propName, prop); ++ }; ++ const contract = new ethers_1.Contract(deployed.address, iface, signerOrProvider); ++ Object.defineProperty = def; ++ for (const fnName of Object.keys(contract.functions)) { ++ const fn = contract[fnName].bind(contract); ++ contract[fnName] = async (...args) => { ++ const result = await fn(...args); ++ if (typeof result === 'object' && typeof result.wait === 'function') { ++ await result.wait(); ++ } ++ return result; ++ }; ++ } ++ return contract; ++}; ++exports.getDeployedContract = getDeployedContract; ++//# sourceMappingURL=hardhat-deploy-ethers.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js.map b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js.map +new file mode 100644 +index 0000000..1688acb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/hardhat-deploy-ethers.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"hardhat-deploy-ethers.js","sourceRoot":"","sources":["../src/hardhat-deploy-ethers.ts"],"names":[],"mappings":";;;AACA,mCAAiC;AAGjC,yDAAiE;AAE1D,MAAM,aAAa,GAAG,KAAK,EAChC,KAA6B,EAC7B,OAGI,EAAE,EACN,EAAE;IACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAA;IAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAA;IAE/B,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE;QACvB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,OAAO,WAAW,CAAC,CAAA;SAC/D;QACD,OAAO,EAAE,CAAA;QACT,MAAM,IAAA,kBAAK,EAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KACxB;AACH,CAAC,CAAA;AAlBY,QAAA,aAAa,iBAkBzB;AAEM,MAAM,eAAe,GAAG,KAAK,EAAE,EACpC,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAiB,EAAE;IAElB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACjD,MAAM,kBAAkB,GAAG,MAAM,IAAA,2BAAmB,EAClD,GAAG,EACH,oBAAoB,EACpB;QACE,gBAAgB,EAAE,QAAQ;KAC3B,CACF,CAAA;IAED,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAChE,IAAI,OAAO,KAAK,cAAc,EAAE;QAC9B,OAAO,CAAC,GAAG,CACT,iCAAiC,IAAI,iDAAiD,CACvF,CAAA;QACD,OAAM;KACP;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,OAAO,KAAK,CAAC,CAAA;IAC/D,MAAM,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAElD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAC9D,MAAM,IAAA,qBAAa,EAAC,KAAK,IAAI,EAAE;QAC7B,OAAO,IAAA,4BAAe,EAAC,MAAM,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC,CAAA;AAhCY,QAAA,eAAe,mBAgC3B;AAEM,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACtC,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,gBAAgB,GAQjB,EAAE,EAAE;IACH,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;IAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAEjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;QAChC,QAAQ;QACR,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,GAAG,EAAE,IAAI;KACV,CAAC,CAAA;IAEF,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAEpE,IAAI,MAAM,CAAC,aAAa,EAAE;QACxB,IAAI,gBAAgB,EAAE;YACpB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACtD,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;YACpB,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;gBAC1D,GAAG,GAAG,OAAO,CAAC,SAAS,CAAA;aACxB;YACD,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;YAC1D,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAA;SACjC;QAED,MAAM,IAAA,uBAAe,EAAC;YACpB,GAAG;YACH,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAA;KACH;AACH,CAAC,CAAA;AA7CY,QAAA,iBAAiB,qBA6C7B;AAEM,MAAM,mBAAmB,GAAG,KAAK,EACtC,GAAQ,EACR,IAAY,EACZ,UAGI,EAAE,EACa,EAAE;IACrB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAEhD,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAG9E,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxD,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAClE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAA;KAC1B;IAED,IAAI,gBAAgB,GAAsB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAA;IAC7D,IAAI,OAAO,CAAC,gBAAgB,EAAE;QAC5B,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,QAAQ,EAAE;YAChD,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;SAC3E;aAAM;YACL,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;SAC5C;KACF;IAGD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAA;IACjC,MAAM,CAAC,cAAc,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,OAAO,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAA;IAGxE,MAAM,CAAC,cAAc,GAAG,GAAG,CAAA;IAG3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACpD,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzC;QAAC,QAAgB,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,IAAS,EAAE,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;gBACnE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;aACpB;YACD,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;KACF;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AArDY,QAAA,mBAAmB,uBAqD/B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/index.d.ts b/node_modules/@eth-optimism/contracts/dist/index.d.ts +index 10ef2f7..fdebb86 100644 +--- a/node_modules/@eth-optimism/contracts/dist/index.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/index.d.ts +@@ -1,2 +1,3 @@ + export * from './contract-defs'; + export * from './predeploys'; ++export * from './connect-contracts'; +diff --git a/node_modules/@eth-optimism/contracts/dist/index.js b/node_modules/@eth-optimism/contracts/dist/index.js +index 487c804..a4731c7 100644 +--- a/node_modules/@eth-optimism/contracts/dist/index.js ++++ b/node_modules/@eth-optimism/contracts/dist/index.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +@@ -12,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + __exportStar(require("./contract-defs"), exports); + __exportStar(require("./predeploys"), exports); ++__exportStar(require("./connect-contracts"), exports); + //# sourceMappingURL=index.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/index.js.map b/node_modules/@eth-optimism/contracts/dist/index.js.map +new file mode 100644 +index 0000000..5ac1ba3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/index.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B;AAC/B,+CAA4B;AAC5B,sDAAmC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/local-network-config.d.ts b/node_modules/@eth-optimism/contracts/dist/local-network-config.d.ts +new file mode 100644 +index 0000000..1bc84aa +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/local-network-config.d.ts +@@ -0,0 +1,104 @@ ++export declare const hardHatLocalTestnet: { ++ chainID: number; ++ accounts: import("hardhat/types").HardhatNetworkAccountConfig[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++}; ++export declare const MoonbeamLocalTestnet: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: {}; ++ isLocalAltL1: boolean; ++}; ++export declare const FantomLocalTestnet: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++}; ++export declare const AvalancheLocalTestnet: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++}; ++export declare const BnbLocalTestnet: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++}; ++export declare const supportedLocalTestnet: { ++ 31337: { ++ chainID: number; ++ accounts: import("hardhat/types").HardhatNetworkAccountConfig[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++ }; ++ 1281: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: {}; ++ isLocalAltL1: boolean; ++ }; ++ 4003: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++ }; ++ 43112: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++ }; ++ 99: { ++ chainID: number; ++ accounts: { ++ privateKey: string; ++ }[]; ++ depositL2Gas: number; ++ gasLimitOption: { ++ gasLimit: number; ++ }; ++ isLocalAltL1: boolean; ++ }; ++}; +diff --git a/node_modules/@eth-optimism/contracts/dist/local-network-config.js b/node_modules/@eth-optimism/contracts/dist/local-network-config.js +new file mode 100644 +index 0000000..11dce9d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/local-network-config.js +@@ -0,0 +1,151 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.supportedLocalTestnet = exports.BnbLocalTestnet = exports.AvalancheLocalTestnet = exports.FantomLocalTestnet = exports.MoonbeamLocalTestnet = exports.hardHatLocalTestnet = void 0; ++const default_config_1 = require("hardhat/internal/core/config/default-config"); ++const util_1 = require("hardhat/internal/core/providers/util"); ++exports.hardHatLocalTestnet = { ++ chainID: 31337, ++ accounts: (0, util_1.normalizeHardhatNetworkAccountsConfig)(default_config_1.defaultHardhatNetworkHdAccountsConfigParams).slice(0, 20), ++ depositL2Gas: 8000000, ++ gasLimitOption: { gasLimit: 2000000 }, ++ isLocalAltL1: false, ++}; ++exports.MoonbeamLocalTestnet = { ++ chainID: 1281, ++ accounts: [ ++ { ++ privateKey: '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133', ++ }, ++ { ++ privateKey: '0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b', ++ }, ++ { ++ privateKey: '0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b', ++ }, ++ { ++ privateKey: '0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68', ++ }, ++ { ++ privateKey: '0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4', ++ }, ++ { ++ privateKey: '0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df', ++ }, ++ { ++ privateKey: '0x96b8a38e12e1a31dee1eab2fffdf9d9990045f5b37e44d8cc27766ef294acf18', ++ }, ++ { ++ privateKey: '0x0d6dcaaef49272a5411896be8ad16c01c35d6f8c18873387b71fbc734759b0ab', ++ }, ++ { ++ privateKey: '0x4c42532034540267bf568198ccec4cb822a025da542861fcb146a5fab6433ff8', ++ }, ++ { ++ privateKey: '0x94c49300a58d576011096bcb006aa06f5a91b34b4383891e8029c21dc39fbb8b', ++ }, ++ { ++ privateKey: '0x99b3c12287537e38c90a9219d4cb074a89a16e9cdb20bf85728ebd97c343e342', ++ }, ++ ], ++ depositL2Gas: 8000000, ++ gasLimitOption: {}, ++ isLocalAltL1: true, ++}; ++exports.FantomLocalTestnet = { ++ chainID: 4003, ++ accounts: [ ++ { ++ privateKey: '0x8ffbfce79f185f4b4fb06cb3b51fcdf0fb7403b6e0d4011893ebabfc68d5187c', ++ }, ++ { ++ privateKey: '0xa95aa44137b087b519cb7d2be9340f4c36709cb0d3de94ba6ba2095563a44696', ++ }, ++ { ++ privateKey: '0xdc5b19a14a3bbb3e9d70da1955114415d9f230ae661c3f8a2b22ad3a67cd2902', ++ }, ++ { ++ privateKey: '0xf71e04bb88b3f497fc2cf9b4e35c7e307c2ec6483b8084f750820d09fbe19b54', ++ }, ++ { ++ privateKey: '0xca2363fa363c2bc26bf070cf96084da59243d518d9c6ac0dc54586fb6c66c6f1', ++ }, ++ { ++ privateKey: '0xa6c4234c9bcae01a8d9d2301ab14ce2fcdd38fe57bc28fa03cd0678630cb8f5a', ++ }, ++ ], ++ depositL2Gas: 1000000, ++ gasLimitOption: { gasLimit: 400000 }, ++ isLocalAltL1: true, ++}; ++exports.AvalancheLocalTestnet = { ++ chainID: 43112, ++ accounts: [ ++ { ++ privateKey: '0x56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027', ++ }, ++ { ++ privateKey: '0x119c49b6a55123600ce73fbfad852f45c015d328b593fb20aca9a68f1588bd7e', ++ }, ++ { ++ privateKey: '0xb135c8deb7e4f283ad3b8a5e8b557d88f32ccdca730a7d1ee6a02263d565c39c', ++ }, ++ { ++ privateKey: '0xee7fa2988cf373f3f6b96e622e740734f5b6a969435f037c7f4f58feea419437', ++ }, ++ { ++ privateKey: '0xc24d497a9fb2501e120c756b12794fd34da92d15b8bbbed71564d8e497103e4c', ++ }, ++ { ++ privateKey: '0x4155448d8ac3d7054291ff85e091dbc43f6c12ca6cf5e3bcfbde1ede7acd564a', ++ }, ++ { ++ privateKey: '0x67f8f3c9fa467b28ead9e08c4e78d089166ebe871f482330860d1c71f613de9e', ++ }, ++ { ++ privateKey: '0x89844cbaab9ba74876f1033227926246cf9a312014c3293e466f2e3e91ebe0de', ++ }, ++ ], ++ depositL2Gas: 1000000, ++ gasLimitOption: { gasLimit: 400000 }, ++ isLocalAltL1: true, ++}; ++exports.BnbLocalTestnet = { ++ chainID: 99, ++ accounts: [ ++ { ++ privateKey: '0x953dbe85f02d84377f90a6eb6d8a6dd128aa50f69c4671d32414b139040be24b', ++ }, ++ { ++ privateKey: '0x4d5211ccb78c977d7ae7094b27b561458274a1c2df8be5f3c66479fe33ea8838', ++ }, ++ { ++ privateKey: '0x3c6efff45290e2204cc19b091cdefffcead5757b074b1723e9cf8973e6337ba4', ++ }, ++ { ++ privateKey: '0x81f43b0303746bfacbaae64947850e86deca412d3b39b1f8d3c89bf483d615f3', ++ }, ++ { ++ privateKey: '0xeca0930606860b8ae4a7f2b9a56ee62c4e11f613a894810b7642cabef689cf09', ++ }, ++ { ++ privateKey: '0x68ef711b398fa47f22fbc44a972efbd2c2e25338e7c6afb92dc84b569bf784a5', ++ }, ++ { ++ privateKey: '0xa568b36fca21714f879e3cf157f021a4c5dccd6229ef6e6eee7fb7888193c026', ++ }, ++ { ++ privateKey: '0xc484de1ef84e998869d59752d1f09bffa161673d54250ea152ec82d684e2f154', ++ }, ++ ], ++ depositL2Gas: 8000000, ++ gasLimitOption: { gasLimit: 1000000 }, ++ isLocalAltL1: true, ++}; ++exports.supportedLocalTestnet = { ++ 31337: exports.hardHatLocalTestnet, ++ 1281: exports.MoonbeamLocalTestnet, ++ 4003: exports.FantomLocalTestnet, ++ 43112: exports.AvalancheLocalTestnet, ++ 99: exports.BnbLocalTestnet, ++}; ++//# sourceMappingURL=local-network-config.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/local-network-config.js.map b/node_modules/@eth-optimism/contracts/dist/local-network-config.js.map +new file mode 100644 +index 0000000..6fd3188 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/local-network-config.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"local-network-config.js","sourceRoot":"","sources":["../src/local-network-config.ts"],"names":[],"mappings":";;;AAAA,gFAEoD;AACpD,+DAA4F;AAE/E,QAAA,mBAAmB,GAAG;IACjC,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,IAAA,4CAAqC,EAC7C,4DAA2C,CAC5C,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;IACd,YAAY,EAAE,OAAS;IACvB,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAS,EAAE;IACvC,YAAY,EAAE,KAAK;CACpB,CAAA;AAEY,QAAA,oBAAoB,GAAG;IAClC,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;KACF;IACD,YAAY,EAAE,OAAS;IACvB,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,IAAI;CACnB,CAAA;AAEY,QAAA,kBAAkB,GAAG;IAChC,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;KACF;IACD,YAAY,EAAE,OAAS;IACvB,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAO,EAAE;IACrC,YAAY,EAAE,IAAI;CACnB,CAAA;AAEY,QAAA,qBAAqB,GAAG;IACnC,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE;QACR;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;KACF;IACD,YAAY,EAAE,OAAS;IACvB,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAO,EAAE;IACrC,YAAY,EAAE,IAAI;CACnB,CAAA;AAEY,QAAA,eAAe,GAAG;IAC7B,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE;QACR;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;QACD;YACE,UAAU,EACR,oEAAoE;SACvE;KACF;IACD,YAAY,EAAE,OAAS;IACvB,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAS,EAAE;IACvC,YAAY,EAAE,IAAI;CACnB,CAAA;AAEY,QAAA,qBAAqB,GAAG;IACnC,KAAK,EAAE,2BAAmB;IAC1B,IAAI,EAAE,4BAAoB;IAC1B,IAAI,EAAE,0BAAkB;IACxB,KAAK,EAAE,6BAAqB;IAC5B,EAAE,EAAE,uBAAe;CACpB,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/make-genesis.d.ts b/node_modules/@eth-optimism/contracts/dist/make-genesis.d.ts +index e20137e..b49d159 100644 +--- a/node_modules/@eth-optimism/contracts/dist/make-genesis.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/make-genesis.d.ts +@@ -1,4 +1,6 @@ + export interface RollupDeployConfig { ++ l1ChainId: number; ++ deployer: string; + whitelistOwner: string; + gasPriceOracleOwner: string; + gasPriceOracleOverhead: number; +@@ -12,6 +14,12 @@ export interface RollupDeployConfig { + l1StandardBridgeAddress: string; + l1FeeWalletAddress: string; + l1CrossDomainMessengerAddress: string; ++ bobaTuringPrice: string; ++ TuringHelperJson: any; ++ l1BobaTokenAddress: any; + berlinBlock: number; ++ l1NativeTokenName: string; ++ l1NativeTokenSymbol: string; ++ l1NativeTokenDecimals: number; + } + export declare const makeL2GenesisFile: (cfg: RollupDeployConfig) => Promise; +diff --git a/node_modules/@eth-optimism/contracts/dist/make-genesis.js b/node_modules/@eth-optimism/contracts/dist/make-genesis.js +index 3cd2e37..d76c1d6 100644 +--- a/node_modules/@eth-optimism/contracts/dist/make-genesis.js ++++ b/node_modules/@eth-optimism/contracts/dist/make-genesis.js +@@ -1,14 +1,30 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.makeL2GenesisFile = void 0; +-const child_process_1 = require("child_process"); + const util_1 = require("util"); +-const ethers_1 = require("ethers"); ++const child_process_1 = require("child_process"); + const utils_1 = require("@defi-wonderland/smock/dist/src/utils"); + const core_utils_1 = require("@eth-optimism/core-utils"); ++const ethers_1 = require("ethers"); ++const L2GovernanceERC20Helper_1 = require("./L2GovernanceERC20Helper"); ++const L2_L1NativeTokenHepler_1 = require("./L2_L1NativeTokenHepler"); ++const L2_BOBAHelper_1 = require("./L2_BOBAHelper"); ++const local_network_config_1 = require("../src/local-network-config"); + const predeploys_1 = require("./predeploys"); + const contract_artifacts_1 = require("./contract-artifacts"); ++const addSlotsForBobaProxyContract = (dump, predeployAddress, variable) => { ++ for (const keyName of Object.keys(variable)) { ++ const key = ethers_1.utils.hexlify(ethers_1.utils.toUtf8Bytes(keyName)); ++ const index = ethers_1.BigNumber.from('0').toHexString(); ++ const newKeyPreimage = ethers_1.utils.concat([key, ethers_1.utils.hexZeroPad(index, 32)]); ++ const compositeKey = ethers_1.utils.keccak256(ethers_1.utils.hexlify(newKeyPreimage)); ++ dump[predeployAddress].storage[compositeKey] = variable[keyName]; ++ } ++ return dump; ++}; + const makeL2GenesisFile = async (cfg) => { ++ var _a; ++ const isLocalAltL1 = (_a = local_network_config_1.supportedLocalTestnet[cfg.l1ChainId]) === null || _a === void 0 ? void 0 : _a.isLocalAltL1; + for (const [key, val] of Object.entries(cfg)) { + if (val === undefined) { + throw new Error(`must provide an input for config value: ${key}`); +@@ -35,7 +51,6 @@ const makeL2GenesisFile = async (cfg) => { + }, + OVM_ETH: { + l2Bridge: predeploys_1.predeploys.L2StandardBridge, +- l1Token: ethers_1.ethers.constants.AddressZero, + _name: 'Ether', + _symbol: 'ETH', + }, +@@ -49,10 +64,98 @@ const makeL2GenesisFile = async (cfg) => { + symbol: 'WETH', + decimals: 18, + }, ++ Lib_ResolvedDelegateBobaProxy: { ++ proxyOwner: cfg.deployer, ++ proxyTarget: predeploys_1.predeploys.BobaTuringCredit ++ }, ++ BobaTuringCredit: { ++ owner: cfg.deployer, ++ turingPrice: cfg.bobaTuringPrice ++ }, ++ BobaTuringHelper: { ++ Self: predeploys_1.predeploys.BobaTuringHelper ++ }, ++ L2GovernanceERC20: { ++ _name: 'Boba Network', ++ _symbol: 'BOBA', ++ l1Token: cfg.l1BobaTokenAddress, ++ l2Bridge: predeploys_1.predeploys.L2StandardBridge, ++ }, ++ Proxy__Boba_GasPriceOracle: { ++ proxyOwner: cfg.deployer, ++ proxyTarget: predeploys_1.predeploys.Boba_GasPriceOracle ++ }, ++ Boba_GasPriceOracle: { ++ _owner: cfg.gasPriceOracleOwner, ++ feeWallet: cfg.l1FeeWalletAddress, ++ l2BobaAddress: predeploys_1.predeploys.L2GovernanceERC20, ++ minPriceRatio: 500, ++ maxPriceRatio: 5000, ++ priceRatio: 2000, ++ gasPriceOracleAddress: predeploys_1.predeploys.OVM_GasPriceOracle, ++ metaTransactionFee: ethers_1.utils.parseEther('3'), ++ receivedETHAmount: ethers_1.utils.parseEther('0.005'), ++ marketPriceRatio: 2000, ++ }, ++ L2_BOBA: { ++ _name: 'Boba Network', ++ _symbol: 'BOBA', ++ l1Token: cfg.l1BobaTokenAddress, ++ l2Bridge: predeploys_1.predeploys.L2StandardBridge, ++ }, ++ L2_L1NativeToken: { ++ l2Bridge: predeploys_1.predeploys.L2StandardBridge, ++ l1Token: ethers_1.constants.AddressZero, ++ _name: cfg.l1NativeTokenName, ++ _symbol: cfg.l1NativeTokenSymbol, ++ _decimals: cfg.l1NativeTokenDecimals, ++ }, ++ Boba_GasPriceOracleAltL1: { ++ _owner: cfg.gasPriceOracleOwner, ++ feeWallet: cfg.l1FeeWalletAddress, ++ secondaryFeeTokenAddress: predeploys_1.predeploys.L2_L1NativeToken_ALT_L1, ++ minPriceRatio: 500, ++ maxPriceRatio: 5000, ++ priceRatio: 2000, ++ gasPriceOracleAddress: predeploys_1.predeploys.OVM_GasPriceOracle, ++ metaTransactionFee: ethers_1.utils.parseEther('3'), ++ receivedBOBAAmount: ethers_1.utils.parseEther('0.005'), ++ marketPriceRatio: 2000, ++ decimals: 0, ++ } ++ }; ++ const HIDDEN_CONTRACTS_FOR_ALT_L1 = [ ++ 'OVM_ETH', ++ 'WETH9', ++ 'L2GovernanceERC20' ++ ]; ++ const HIDDEN_CONTRACTS_FOR_ETHEREUM = [ ++ 'L2_BOBA', ++ 'L2_L1NativeToken', ++ 'Boba_GasPriceOracleAltL1' ++ ]; ++ const RENAME_SPECIAL_CONTRACTS = { ++ 'L2_L1NativeToken_ALT_L1': 'L2_L1NativeToken', ++ 'L2_BOBA_ALT_L1': 'L2_BOBA' + }; ++ const SPECIAL_CONTRACTS_FOR_ALT_L1 = [ ++ 'Boba_GasPriceOracle', ++ 'BobaTuringCredit', ++ 'L2StandardBridge', ++ 'OVM_SequencerFeeVault' ++ ]; + const dump = {}; +- for (const predeployName of Object.keys(predeploys_1.predeploys)) { ++ for (let predeployName of Object.keys(predeploys_1.predeploys)) { + const predeployAddress = predeploys_1.predeploys[predeployName]; ++ if (RENAME_SPECIAL_CONTRACTS[predeployName]) { ++ predeployName = RENAME_SPECIAL_CONTRACTS[predeployName]; ++ } ++ if (isLocalAltL1 && HIDDEN_CONTRACTS_FOR_ALT_L1.includes(predeployName)) { ++ continue; ++ } ++ if (!isLocalAltL1 && HIDDEN_CONTRACTS_FOR_ETHEREUM.includes(predeployName)) { ++ continue; ++ } + dump[predeployAddress] = { + balance: '00', + storage: {}, +@@ -60,24 +163,103 @@ const makeL2GenesisFile = async (cfg) => { + if (predeployName === 'OVM_L1BlockNumber') { + dump[predeployAddress].code = '0x4B60005260206000F3'; + } ++ else if (predeployName === 'BobaTuringHelper') { ++ dump[predeployAddress].code = cfg.TuringHelperJson.deployedBytecode; ++ } ++ else if (predeployName === 'L2GovernanceERC20') { ++ dump[predeployAddress].code = L2GovernanceERC20Helper_1.L2GovernanceERC20Helper.L2GovernanceERC20Bytecode; ++ } ++ else if (predeployName === 'Proxy__Boba_GasPriceOracle') { ++ const artifact = (0, contract_artifacts_1.getContractArtifact)('Lib_ResolvedDelegateBobaProxy'); ++ dump[predeployAddress].code = artifact.deployedBytecode; ++ } ++ else if (predeployName === 'L2_L1NativeToken') { ++ if (cfg.l1NativeTokenSymbol === 'FTM' && cfg.l2ChainId === 31338) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.FantomLocalBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'FTM' && cfg.l2ChainId === 4051) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.FantomTestnetBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'FTM' && cfg.l2ChainId === 301) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.FantomMainnetBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'GLMR' && cfg.l2ChainId === 31338) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.MoonbeamLocalBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'GLMR' && cfg.l2ChainId === 1297) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.MoonbeamTestnetBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'GLMR' && cfg.l2ChainId === 1294) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.MoonbeamMainnetBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'AVAX' && cfg.l2ChainId === 31338) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.AvalancheLocalByteCode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'AVAX' && cfg.l2ChainId === 4328) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.AvalancheTestnetByteCode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'AVAX' && cfg.l2ChainId === 43288) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.AvalancheMainnetByteCode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'BNB' && cfg.l2ChainId === 31338) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.BnbLocalBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'BNB' && cfg.l2ChainId === 9728) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.BnbTestnetBytecode; ++ } ++ if (cfg.l1NativeTokenSymbol === 'BNB' && cfg.l2ChainId === 56288) { ++ dump[predeployAddress].code = L2_L1NativeTokenHepler_1.L2_L1NativeTokenHepler.BnbMainnetBytecode; ++ } ++ } ++ else if (predeployName === 'L2_BOBA') { ++ dump[predeployAddress].code = L2_BOBAHelper_1.L2_BOBA.L2_BOBABytecode; ++ } ++ else if (isLocalAltL1 && SPECIAL_CONTRACTS_FOR_ALT_L1.includes(predeployName)) { ++ const artifact = (0, contract_artifacts_1.getContractArtifact)(`${predeployName}AltL1`); ++ dump[predeployAddress].code = artifact.deployedBytecode; ++ } + else { +- const artifact = contract_artifacts_1.getContractArtifact(predeployName); ++ const artifact = (0, contract_artifacts_1.getContractArtifact)(predeployName); + dump[predeployAddress].code = artifact.deployedBytecode; + } + if (predeployName in variables) { +- const storageLayout = await utils_1.getStorageLayout(predeployName); +- const slots = utils_1.computeStorageSlots(storageLayout, variables[predeployName]); +- for (const slot of slots) { +- dump[predeployAddress].storage[slot.key] = slot.val; ++ if (predeployName === 'BobaTuringHelper') { ++ const indexOwner = ethers_1.BigNumber.from('0').toHexString(); ++ dump[predeployAddress].storage[ethers_1.utils.hexZeroPad(indexOwner, 32)] = cfg.deployer; ++ const indexAddress = ethers_1.BigNumber.from('1').toHexString(); ++ dump[predeployAddress].storage[ethers_1.utils.hexZeroPad(indexAddress, 32)] = predeploys_1.predeploys.BobaTuringHelper; ++ continue; ++ } ++ if (predeployName === 'Proxy__Boba_GasPriceOracle') { ++ addSlotsForBobaProxyContract(dump, predeployAddress, variables[predeployName]); ++ const storageLayout = await (0, utils_1.getStorageLayout)('Boba_GasPriceOracle'); ++ const slots = (0, utils_1.computeStorageSlots)(storageLayout, variables['Boba_GasPriceOracle']); ++ for (const slot of slots) { ++ dump[predeploys_1.predeploys.Proxy__Boba_GasPriceOracle].storage[slot.key] = slot.val; ++ } ++ continue; ++ } ++ const storageLayout = await (0, utils_1.getStorageLayout)(predeployName); ++ if (predeployName === 'Lib_ResolvedDelegateBobaProxy') { ++ addSlotsForBobaProxyContract(dump, predeployAddress, variables[predeployName]); ++ } ++ else { ++ const slots = (0, utils_1.computeStorageSlots)(storageLayout, variables[predeployName]); ++ for (const slot of slots) { ++ dump[predeployAddress].storage[slot.key] = slot.val; ++ if (predeployName === "BobaTuringCredit") { ++ dump[predeploys_1.predeploys.Lib_ResolvedDelegateBobaProxy].storage[slot.key] = slot.val; ++ } ++ } + } + } + } + let commit; + try { +- const { stdout } = await util_1.promisify(child_process_1.exec)('git rev-parse HEAD'); ++ const { stdout } = await (0, util_1.promisify)(child_process_1.exec)('git rev-parse HEAD'); + commit = stdout.replace('\n', ''); + } +- catch (_a) { ++ catch (_b) { + console.log('unable to get commit hash, using empty hash instead'); + commit = '0000000000000000000000000000000000000000'; + } +@@ -104,7 +286,7 @@ const makeL2GenesisFile = async (cfg) => { + gasLimit: cfg.l2BlockGasLimit.toString(10), + extradata: '0x' + + '00'.repeat(32) + +- core_utils_1.remove0x(cfg.blockSignerAddress) + ++ (0, core_utils_1.remove0x)(cfg.blockSignerAddress) + + '00'.repeat(65), + alloc: dump, + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/make-genesis.js.map b/node_modules/@eth-optimism/contracts/dist/make-genesis.js.map +new file mode 100644 +index 0000000..7264edf +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/make-genesis.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"make-genesis.js","sourceRoot":"","sources":["../src/make-genesis.ts"],"names":[],"mappings":";;;AACA,+BAAgC;AAChC,iDAAoC;AACpC,iEAG8C;AAC9C,yDAAmD;AACnD,mCAAoD;AACpD,uEAAmE;AACnE,qEAAiE;AACjE,mDAAyC;AACzC,sEAAmE;AAGnE,6CAAyC;AACzC,6DAA0D;AAiD1D,MAAM,4BAA4B,GAAG,CACnC,IAAS,EAAE,gBAAwB,EAAE,QAAa,EAClD,EAAE;IACF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC3C,MAAM,GAAG,GAAG,cAAK,CAAC,OAAO,CAAC,cAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,kBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,cAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,cAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,cAAK,CAAC,SAAS,CAAC,cAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;KACjE;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAQM,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAuB,EACT,EAAE;;IAChB,MAAM,YAAY,GAAG,MAAA,4CAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,0CAAE,YAAY,CAAA;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,EAAE,CAAC,CAAA;SAClE;KACF;IAED,MAAM,SAAS,GAAG;QAChB,qBAAqB,EAAE;YACrB,KAAK,EAAE,GAAG,CAAC,cAAc;SAC1B;QACD,kBAAkB,EAAE;YAClB,MAAM,EAAE,GAAG,CAAC,mBAAmB;YAC/B,QAAQ,EAAE,GAAG,CAAC,sBAAsB;YACpC,SAAS,EAAE,GAAG,CAAC,uBAAuB;YACtC,QAAQ,EAAE,GAAG,CAAC,sBAAsB;YACpC,MAAM,EAAE,GAAG,CAAC,oBAAoB;YAChC,QAAQ,EAAE,GAAG,CAAC,sBAAsB;SACrC;QACD,gBAAgB,EAAE;YAChB,aAAa,EAAE,GAAG,CAAC,uBAAuB;YAC1C,SAAS,EAAE,uBAAU,CAAC,sBAAsB;SAC7C;QACD,qBAAqB,EAAE;YACrB,WAAW,EAAE,GAAG,CAAC,kBAAkB;SACpC;QACD,OAAO,EAAE;YACP,QAAQ,EAAE,uBAAU,CAAC,gBAAgB;YACrC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,KAAK;SACf;QACD,sBAAsB,EAAE;YAGtB,gBAAgB,EAAE,4CAA4C;YAC9D,sBAAsB,EAAE,GAAG,CAAC,6BAA6B;YAEzD,YAAY,EAAE,MAAM;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,EAAE;SACb;QACD,6BAA6B,EAAE;YAC7B,UAAU,EAAE,GAAG,CAAC,QAAQ;YACxB,WAAW,EAAE,uBAAU,CAAC,gBAAgB;SACzC;QACD,gBAAgB,EAAE;YAChB,KAAK,EAAE,GAAG,CAAC,QAAQ;YACnB,WAAW,EAAE,GAAG,CAAC,eAAe;SACjC;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,uBAAU,CAAC,gBAAgB;SAClC;QAED,iBAAiB,EAAE;YACjB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,GAAG,CAAC,kBAAkB;YAC/B,QAAQ,EAAC,uBAAU,CAAC,gBAAgB;SACrC;QACD,0BAA0B,EAAE;YAC1B,UAAU,EAAE,GAAG,CAAC,QAAQ;YACxB,WAAW,EAAE,uBAAU,CAAC,mBAAmB;SAC5C;QACD,mBAAmB,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,mBAAmB;YAC/B,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,aAAa,EAAE,uBAAU,CAAC,iBAAiB;YAC3C,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,qBAAqB,EAAE,uBAAU,CAAC,kBAAkB;YACpD,kBAAkB,EAAE,cAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YACzC,iBAAiB,EAAE,cAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YAC5C,gBAAgB,EAAE,IAAI;SACvB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,GAAG,CAAC,kBAAkB;YAC/B,QAAQ,EAAC,uBAAU,CAAC,gBAAgB;SACrC;QACD,gBAAgB,EAAE;YAChB,QAAQ,EAAE,uBAAU,CAAC,gBAAgB;YACrC,OAAO,EAAE,kBAAS,CAAC,WAAW;YAC9B,KAAK,EAAE,GAAG,CAAC,iBAAiB;YAC5B,OAAO,EAAE,GAAG,CAAC,mBAAmB;YAChC,SAAS,EAAE,GAAG,CAAC,qBAAqB;SACrC;QACD,wBAAwB,EAAE;YACxB,MAAM,EAAE,GAAG,CAAC,mBAAmB;YAC/B,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,wBAAwB,EAAE,uBAAU,CAAC,uBAAuB;YAC5D,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,qBAAqB,EAAE,uBAAU,CAAC,kBAAkB;YACpD,kBAAkB,EAAE,cAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YACzC,kBAAkB,EAAE,cAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7C,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,CAAC;SACZ;KACF,CAAA;IAED,MAAM,2BAA2B,GAAG;QAClC,SAAS;QACT,OAAO;QACP,mBAAmB;KACpB,CAAA;IAED,MAAM,6BAA6B,GAAG;QACpC,SAAS;QACT,kBAAkB;QAClB,0BAA0B;KAC3B,CAAA;IAED,MAAM,wBAAwB,GAAG;QAC/B,yBAAyB,EAAE,kBAAkB;QAC7C,gBAAgB,EAAE,SAAS;KAC5B,CAAA;IAED,MAAM,4BAA4B,GAAG;QACnC,qBAAqB;QACrB,kBAAkB;QAClB,kBAAkB;QAClB,uBAAuB;KACxB,CAAA;IAED,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,uBAAU,CAAC,EAAE;QACjD,MAAM,gBAAgB,GAAG,uBAAU,CAAC,aAAa,CAAC,CAAA;QAElD,IAAI,wBAAwB,CAAC,aAAa,CAAC,EAAE;YAC3C,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAA;SACxD;QACD,IAAI,YAAY,IAAI,2BAA2B,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACvE,SAAQ;SACT;QACD,IAAI,CAAC,YAAY,IAAI,6BAA6B,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAC1E,SAAQ;SACT;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG;YACvB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE;SACZ,CAAA;QAED,IAAI,aAAa,KAAK,mBAAmB,EAAE;YAKzC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,sBAAsB,CAAA;SACrD;aAAM,IAAI,aAAa,KAAK,kBAAkB,EAAE;YAE/C,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,CAAA;SACpE;aAAM,IAAI,aAAa,KAAK,mBAAmB,EAAE;YAEhD,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,iDAAuB,CAAC,yBAAyB,CAAA;SAChF;aAAM,IAAI,aAAa,KAAK,4BAA4B,EAAE;YAEzD,MAAM,QAAQ,GAAG,IAAA,wCAAmB,EAAC,+BAA+B,CAAC,CAAA;YACrE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAA;SACxD;aAAM,IAAI,aAAa,KAAK,kBAAkB,EAAE;YAI/C,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,mBAAmB,CAAA;aACzE;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE;gBAC/D,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,qBAAqB,CAAA;aAC3E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,GAAG,EAAE;gBAC9D,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,qBAAqB,CAAA;aAC3E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBACjE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,qBAAqB,CAAA;aAC3E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,uBAAuB,CAAA;aAC7E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,uBAAuB,CAAA;aAC7E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBACjE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,sBAAsB,CAAA;aAC5E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,wBAAwB,CAAA;aAC9E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBACjE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,wBAAwB,CAAA;aAC9E;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,gBAAgB,CAAA;aACtE;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE;gBAC/D,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,kBAAkB,CAAA;aACxE;YAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;gBAChE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,+CAAsB,CAAC,kBAAkB,CAAA;aACxE;SACF;aAAM,IAAI,aAAa,KAAK,SAAS,EAAE;YACtC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,uBAAO,CAAC,eAAe,CAAA;SACtD;aAAM,IAAI,YAAY,IAAI,4BAA4B,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAE/E,MAAM,QAAQ,GAAG,IAAA,wCAAmB,EAAC,GAAG,aAAa,OAAO,CAAC,CAAA;YAC7D,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAA;SACxD;aAAM;YAEL,MAAM,QAAQ,GAAG,IAAA,wCAAmB,EAAC,aAAa,CAAC,CAAA;YACnD,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAA;SACxD;QAGD,IAAI,aAAa,IAAI,SAAS,EAAE;YAC9B,IAAI,aAAa,KAAK,kBAAkB,EAAE;gBAExC,MAAM,UAAU,GAAG,kBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACrD,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAK,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAA;gBAC/E,MAAM,YAAY,GAAG,kBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACvD,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAK,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,GAAG,uBAAU,CAAC,gBAAgB,CAAA;gBAChG,SAAQ;aACT;YACD,IAAI,aAAa,KAAK,4BAA4B,EAAE;gBAElD,4BAA4B,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;gBAC9E,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAgB,EAAC,qBAAqB,CAAC,CAAA;gBACnE,MAAM,KAAK,GAAG,IAAA,2BAAmB,EAAC,aAAa,EAAE,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAA;gBAClF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,CAAC,uBAAU,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;iBACzE;gBACD,SAAQ;aACT;YACD,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAgB,EAAC,aAAa,CAAC,CAAA;YAE3D,IAAI,aAAa,KAAK,+BAA+B,EAAE;gBACrD,4BAA4B,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;aAC/E;iBAAM;gBACL,MAAM,KAAK,GAAG,IAAA,2BAAmB,EAAC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;gBAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;oBAEnD,IAAI,aAAa,KAAK,kBAAkB,EAAE;wBACxC,IAAI,CAAC,uBAAU,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;qBAC5E;iBACF;aACF;SACF;KACF;IAGD,IAAI,MAAc,CAAA;IAClB,IAAI;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC,oBAAoB,CAAC,CAAA;QAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;KAClC;IAAC,WAAM;QACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;QAClE,MAAM,GAAG,0CAA0C,CAAA;KACpD;IAED,OAAO;QACL,MAAM;QACN,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,SAAS;YACtB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;YAChB,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,KAAK;aACb;SACF;QACD,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,SAAS,EACP,IAAI;YACJ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACf,IAAA,qBAAQ,EAAC,GAAG,CAAC,kBAAkB,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC,CAAA;AAnTY,QAAA,iBAAiB,qBAmT7B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/predeploys.d.ts b/node_modules/@eth-optimism/contracts/dist/predeploys.d.ts +index 47df387..91c8638 100644 +--- a/node_modules/@eth-optimism/contracts/dist/predeploys.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/predeploys.d.ts +@@ -9,8 +9,12 @@ export declare const predeploys: { + OVM_L1BlockNumber: string; + OVM_ETH: string; + WETH9: string; +-}; +-export declare const futurePredeploys: { +- System0: string; +- System1: string; ++ Lib_ResolvedDelegateBobaProxy: string; ++ BobaTuringCredit: string; ++ BobaTuringHelper: string; ++ L2GovernanceERC20: string; ++ Proxy__Boba_GasPriceOracle: string; ++ Boba_GasPriceOracle: string; ++ L2_BOBA_ALT_L1: string; ++ L2_L1NativeToken_ALT_L1: string; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/predeploys.js b/node_modules/@eth-optimism/contracts/dist/predeploys.js +index 49bc624..87d7c35 100644 +--- a/node_modules/@eth-optimism/contracts/dist/predeploys.js ++++ b/node_modules/@eth-optimism/contracts/dist/predeploys.js +@@ -1,6 +1,6 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +-exports.futurePredeploys = exports.predeploys = void 0; ++exports.predeploys = void 0; + exports.predeploys = { + OVM_L2ToL1MessagePasser: '0x4200000000000000000000000000000000000000', + OVM_DeployerWhitelist: '0x4200000000000000000000000000000000000002', +@@ -10,11 +10,15 @@ exports.predeploys = { + OVM_SequencerFeeVault: '0x4200000000000000000000000000000000000011', + L2StandardTokenFactory: '0x4200000000000000000000000000000000000012', + OVM_L1BlockNumber: '0x4200000000000000000000000000000000000013', +- OVM_ETH: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', +- WETH9: '0x4200000000000000000000000000000000000006', +-}; +-exports.futurePredeploys = { +- System0: '0x4200000000000000000000000000000000000042', +- System1: '0x4200000000000000000000000000000000000014', ++ OVM_ETH: '0x4200000000000000000000000000000000000006', ++ WETH9: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', ++ Lib_ResolvedDelegateBobaProxy: "0x4200000000000000000000000000000000000020", ++ BobaTuringCredit: "0x4200000000000000000000000000000000000021", ++ BobaTuringHelper: "0x4200000000000000000000000000000000000022", ++ L2GovernanceERC20: "0x4200000000000000000000000000000000000023", ++ Proxy__Boba_GasPriceOracle: "0x4200000000000000000000000000000000000024", ++ Boba_GasPriceOracle: "0x4200000000000000000000000000000000000025", ++ L2_BOBA_ALT_L1: "0x4200000000000000000000000000000000000006", ++ L2_L1NativeToken_ALT_L1: '0x4200000000000000000000000000000000000023', + }; + //# sourceMappingURL=predeploys.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/predeploys.js.map b/node_modules/@eth-optimism/contracts/dist/predeploys.js.map +new file mode 100644 +index 0000000..1ba55d1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/predeploys.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"predeploys.js","sourceRoot":"","sources":["../src/predeploys.ts"],"names":[],"mappings":";;;AASa,QAAA,UAAU,GAAG;IACxB,uBAAuB,EAAE,4CAA4C;IACrE,qBAAqB,EAAE,4CAA4C;IACnE,sBAAsB,EAAE,4CAA4C;IACpE,kBAAkB,EAAE,4CAA4C;IAChE,gBAAgB,EAAE,4CAA4C;IAC9D,qBAAqB,EAAE,4CAA4C;IACnE,sBAAsB,EAAE,4CAA4C;IACpE,iBAAiB,EAAE,4CAA4C;IAI/D,OAAO,EAAE,4CAA4C;IAGrD,KAAK,EAAE,4CAA4C;IAGnD,6BAA6B,EAAE,4CAA4C;IAC3E,gBAAgB,EAAE,4CAA4C;IAC9D,gBAAgB,EAAE,4CAA4C;IAG9D,iBAAiB,EAAE,4CAA4C;IAG/D,0BAA0B,EAAE,4CAA4C;IACxE,mBAAmB,EAAE,4CAA4C;IAIjE,cAAc,EAAE,4CAA4C;IAE5D,uBAAuB,EAAE,4CAA4C;CACtE,CAAA"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@boba/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@boba/index.ts +new file mode 100644 +index 0000000..267647d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@boba/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as turingHybridCompute from "./turing-hybrid-compute"; ++export type { turingHybridCompute }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/ITuringHelper.ts b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/ITuringHelper.ts +new file mode 100644 +index 0000000..1dad7b1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/ITuringHelper.ts +@@ -0,0 +1,107 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface ITuringHelperInterface extends utils.Interface { ++ functions: { ++ "TuringTx(string,bytes)": FunctionFragment; ++ }; ++ ++ getFunction(nameOrSignatureOrTopic: "TuringTx"): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "TuringTx", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult(functionFragment: "TuringTx", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface ITuringHelper extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ITuringHelperInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ TuringTx( ++ _url: PromiseOrValue, ++ _payload: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ TuringTx( ++ _url: PromiseOrValue, ++ _payload: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ TuringTx( ++ _url: PromiseOrValue, ++ _payload: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ TuringTx( ++ _url: PromiseOrValue, ++ _payload: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ TuringTx( ++ _url: PromiseOrValue, ++ _payload: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/index.ts +new file mode 100644 +index 0000000..e1c9b76 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/contracts/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { ITuringHelper } from "./ITuringHelper"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/index.ts +new file mode 100644 +index 0000000..a11e4ca +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@boba/turing-hybrid-compute/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as contracts from "./contracts"; ++export type { contracts }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OwnableUpgradeable.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts +similarity index 69% +rename from node_modules/@eth-optimism/contracts/dist/types/OwnableUpgradeable.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts +index 1c0e54e..a1736a5 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OwnableUpgradeable.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts +@@ -1,36 +1,42 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OwnableUpgradeableInterface extends ethers.utils.Interface { ++export interface OwnableUpgradeableInterface extends utils.Interface { + functions: { + "owner()": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "owner" | "renounceOwnership" | "transferOwnership" ++ ): FunctionFragment; ++ + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", +@@ -38,7 +44,7 @@ export interface OwnableUpgradeableInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +@@ -58,9 +64,13 @@ export interface OwnableUpgradeableInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + } + ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} + export type OwnershipTransferredEvent = TypedEvent< + [string, string], +- { previousOwner: string; newOwner: string } ++ OwnershipTransferredEventObject + >; + + export type OwnershipTransferredEventFilter = +@@ -96,24 +106,24 @@ export interface OwnableUpgradeable extends BaseContract { + owner(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -122,19 +132,19 @@ export interface OwnableUpgradeable extends BaseContract { + renounceOwnership(overrides?: CallOverrides): Promise; + + transferOwnership( +- newOwner: string, ++ newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + }; + +@@ -142,12 +152,12 @@ export interface OwnableUpgradeable extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -155,12 +165,12 @@ export interface OwnableUpgradeable extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/index.ts +new file mode 100644 +index 0000000..5b7d844 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/access/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { OwnableUpgradeable } from "./OwnableUpgradeable"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/index.ts +new file mode 100644 +index 0000000..9f5af50 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as access from "./access"; ++export type { access }; ++import type * as security from "./security"; ++export type { security }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/PausableUpgradeable.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.ts +similarity index 78% +rename from node_modules/@eth-optimism/contracts/dist/types/PausableUpgradeable.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.ts +index 418208e..0831a1a 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/PausableUpgradeable.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.ts +@@ -1,33 +1,36 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface PausableUpgradeableInterface extends ethers.utils.Interface { ++export interface PausableUpgradeableInterface extends utils.Interface { + functions: { + "paused()": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "paused"): FunctionFragment; ++ + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; +@@ -41,11 +44,17 @@ export interface PausableUpgradeableInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; + } + +-export type PausedEvent = TypedEvent<[string], { account: string }>; ++export interface PausedEventObject { ++ account: string; ++} ++export type PausedEvent = TypedEvent<[string], PausedEventObject>; + + export type PausedEventFilter = TypedEventFilter; + +-export type UnpausedEvent = TypedEvent<[string], { account: string }>; ++export interface UnpausedEventObject { ++ account: string; ++} ++export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + + export type UnpausedEventFilter = TypedEventFilter; + +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/index.ts +new file mode 100644 +index 0000000..393fd78 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts-upgradeable/security/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { PausableUpgradeable } from "./PausableUpgradeable"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/Ownable.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/Ownable.ts +similarity index 69% +rename from node_modules/@eth-optimism/contracts/dist/types/Ownable.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/Ownable.ts +index 392e052..aaf0fb4 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/Ownable.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/Ownable.ts +@@ -1,36 +1,42 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OwnableInterface extends ethers.utils.Interface { ++export interface OwnableInterface extends utils.Interface { + functions: { + "owner()": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "owner" | "renounceOwnership" | "transferOwnership" ++ ): FunctionFragment; ++ + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", +@@ -38,7 +44,7 @@ export interface OwnableInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +@@ -58,9 +64,13 @@ export interface OwnableInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + } + ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} + export type OwnershipTransferredEvent = TypedEvent< + [string, string], +- { previousOwner: string; newOwner: string } ++ OwnershipTransferredEventObject + >; + + export type OwnershipTransferredEventFilter = +@@ -96,24 +106,24 @@ export interface Ownable extends BaseContract { + owner(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -122,19 +132,19 @@ export interface Ownable extends BaseContract { + renounceOwnership(overrides?: CallOverrides): Promise; + + transferOwnership( +- newOwner: string, ++ newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + }; + +@@ -142,12 +152,12 @@ export interface Ownable extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -155,12 +165,12 @@ export interface Ownable extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/index.ts +new file mode 100644 +index 0000000..999bcc7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/access/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { Ownable } from "./Ownable"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/index.ts +new file mode 100644 +index 0000000..c8c5c07 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as access from "./access"; ++export type { access }; ++import type * as token from "./token"; ++export type { token }; ++import type * as utils from "./utils"; ++export type { utils }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/ERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/ERC20.ts +new file mode 100644 +index 0000000..17dff99 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/ERC20.ts +@@ -0,0 +1,464 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../common"; ++ ++export interface ERC20Interface extends utils.Interface { ++ functions: { ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "name" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/IERC20.ts +similarity index 52% +rename from node_modules/@eth-optimism/contracts/dist/types/IERC20.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/IERC20.ts +index df80ae0..2a8369b 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IERC20.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/IERC20.ts +@@ -1,30 +1,33 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../../common"; + +-export interface IERC20Interface extends ethers.utils.Interface { ++export interface IERC20Interface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; +@@ -34,26 +37,43 @@ export interface IERC20Interface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +@@ -78,16 +98,26 @@ export interface IERC20Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; +@@ -120,181 +150,193 @@ export interface IERC20 extends BaseContract { + + functions: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- account: string, ++ account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +new file mode 100644 +index 0000000..ce20f46 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +@@ -0,0 +1,533 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../common"; ++ ++export interface ERC20BurnableInterface extends utils.Interface { ++ functions: { ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "burn(uint256)": FunctionFragment; ++ "burnFrom(address,uint256)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "burnFrom" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "name" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burn", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burnFrom", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burnFrom", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20Burnable extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20BurnableInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.ts +new file mode 100644 +index 0000000..91da975 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.ts +@@ -0,0 +1,962 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface ERC20VotesInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20Votes extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20VotesInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.ts +new file mode 100644 +index 0000000..3ee651e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.ts +@@ -0,0 +1,1037 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface ERC20VotesCompInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getCurrentVotes(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getPriorVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getCurrentVotes" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getPriorVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCurrentVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPriorVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getCurrentVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPriorVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20VotesComp extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20VotesCompInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +similarity index 58% +rename from node_modules/@eth-optimism/contracts/dist/types/TestERC20.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +index 628c28d..09e8eff 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestERC20.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +@@ -1,36 +1,38 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../../../common"; + +-export interface TestERC20Interface extends ethers.utils.Interface { ++export interface IERC20MetadataInterface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "decimals()": FunctionFragment; +- "mint(address,uint256)": FunctionFragment; + "name()": FunctionFragment; + "symbol()": FunctionFragment; + "totalSupply()": FunctionFragment; +@@ -38,20 +40,32 @@ export interface TestERC20Interface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "decimals" ++ | "name" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; +- encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( +- functionFragment: "mint", +- values: [string, BigNumberish] ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( +@@ -60,18 +74,21 @@ export interface TestERC20Interface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( +@@ -93,26 +110,36 @@ export interface TestERC20Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; + +-export interface TestERC20 extends BaseContract { ++export interface IERC20Metadata extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestERC20Interface; ++ interface: IERC20MetadataInterface; + + queryFilter( + event: TypedEventFilter, +@@ -135,27 +162,24 @@ export interface TestERC20 extends BaseContract { + + functions: { + allowance( +- arg0: string, +- arg1: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + +- mint( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- + name(overrides?: CallOverrides): Promise<[string]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; +@@ -163,41 +187,38 @@ export interface TestERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- from: string, +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- arg0: string, +- arg1: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- mint( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; +@@ -205,41 +226,38 @@ export interface TestERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- from: string, +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- arg0: string, +- arg1: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- value: BigNumberish, ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- mint( +- to: string, +- value: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; +@@ -247,66 +265,63 @@ export interface TestERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- to: string, +- value: BigNumberish, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- from: string, +- to: string, +- value: BigNumberish, ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- arg0: string, +- arg1: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- mint( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; +@@ -314,45 +329,39 @@ export interface TestERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- from: string, +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- arg0: string, +- arg1: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- arg0: string, ++ account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- mint( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; +@@ -360,16 +369,16 @@ export interface TestERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- from: string, +- to: string, +- value: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit.ts +new file mode 100644 +index 0000000..7564c2a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit.ts +@@ -0,0 +1,586 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../../common"; ++ ++export interface ERC20PermitInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "name" ++ | "nonces" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20Permit extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20PermitInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts +new file mode 100644 +index 0000000..1e61747 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { ERC20Permit } from "./ERC20Permit"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.ts +new file mode 100644 +index 0000000..836ee60 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.ts +@@ -0,0 +1,193 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../../common"; ++ ++export interface IERC20PermitInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: "DOMAIN_SEPARATOR" | "nonces" | "permit" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface IERC20Permit extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IERC20PermitInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts +new file mode 100644 +index 0000000..6673dc7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IERC20Permit } from "./IERC20Permit"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +new file mode 100644 +index 0000000..9dd5867 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +@@ -0,0 +1,13 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as draftErc20PermitSol from "./draft-ERC20Permit.sol"; ++export type { draftErc20PermitSol }; ++import type * as draftIerc20PermitSol from "./draft-IERC20Permit.sol"; ++export type { draftIerc20PermitSol }; ++import type * as regenesis from "./regenesis"; ++export type { regenesis }; ++export type { ERC20Burnable } from "./ERC20Burnable"; ++export type { ERC20Votes } from "./ERC20Votes"; ++export type { ERC20VotesComp } from "./ERC20VotesComp"; ++export type { IERC20Metadata } from "./IERC20Metadata"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp.ts +new file mode 100644 +index 0000000..54f43b5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp.ts +@@ -0,0 +1,1051 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface ERC20VotesCompInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "OFFSET()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getCurrentVotes(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getPriorVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "OFFSET" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getCurrentVotes" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getPriorVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "OFFSET", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCurrentVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPriorVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "OFFSET", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getCurrentVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPriorVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20VotesComp extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20VotesCompInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ OFFSET(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts +new file mode 100644 +index 0000000..ca1e402 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { ERC20VotesComp } from "./ERC20VotesComp"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes.ts +new file mode 100644 +index 0000000..e3883eb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes.ts +@@ -0,0 +1,976 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../../../../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface ERC20VotesInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "OFFSET()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "OFFSET" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "OFFSET", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "OFFSET", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface ERC20Votes extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: ERC20VotesInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ OFFSET(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts +new file mode 100644 +index 0000000..0bcf091 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { ERC20Votes } from "./ERC20Votes"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts +new file mode 100644 +index 0000000..2d59ce8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as erc20VotesCompRegenesisSol from "./ERC20VotesCompRegenesis.sol"; ++export type { erc20VotesCompRegenesisSol }; ++import type * as erc20VotesRegenesisSol from "./ERC20VotesRegenesis.sol"; ++export type { erc20VotesRegenesisSol }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/index.ts +new file mode 100644 +index 0000000..cc19697 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/ERC20/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as extensions from "./extensions"; ++export type { extensions }; ++export type { ERC20 } from "./ERC20"; ++export type { IERC20 } from "./IERC20"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/index.ts +new file mode 100644 +index 0000000..5c4062a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/token/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as erc20 from "./ERC20"; ++export type { erc20 }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/index.ts +new file mode 100644 +index 0000000..3aa96c1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as introspection from "./introspection"; ++export type { introspection }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IERC165.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/IERC165.ts +similarity index 75% +rename from node_modules/@eth-optimism/contracts/dist/types/IERC165.ts +rename to node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/IERC165.ts +index 7938179..010603d 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IERC165.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/IERC165.ts +@@ -1,36 +1,35 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../../common"; + +-export interface IERC165Interface extends ethers.utils.Interface { ++export interface IERC165Interface extends utils.Interface { + functions: { + "supportsInterface(bytes4)": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "supportsInterface"): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "supportsInterface", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -69,19 +68,19 @@ export interface IERC165 extends BaseContract { + + functions: { + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -90,14 +89,14 @@ export interface IERC165 extends BaseContract { + + estimateGas: { + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/index.ts +new file mode 100644 +index 0000000..3fcca5c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/contracts/utils/introspection/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IERC165 } from "./IERC165"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/index.ts b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/index.ts +new file mode 100644 +index 0000000..f34b877 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/@openzeppelin/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as contracts from "./contracts"; ++export type { contracts }; ++import type * as contractsUpgradeable from "./contracts-upgradeable"; ++export type { contractsUpgradeable }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/AddressDictator.ts b/node_modules/@eth-optimism/contracts/dist/types/AddressDictator.ts +deleted file mode 100644 +index a496859..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/AddressDictator.ts ++++ /dev/null +@@ -1,186 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export type NamedAddressStruct = { name: string; addr: string }; +- +-export type NamedAddressStructOutput = [string, string] & { +- name: string; +- addr: string; +-}; +- +-export interface AddressDictatorInterface extends ethers.utils.Interface { +- functions: { +- "finalOwner()": FunctionFragment; +- "getNamedAddresses()": FunctionFragment; +- "manager()": FunctionFragment; +- "returnOwnership()": FunctionFragment; +- "setAddresses()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "finalOwner", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "getNamedAddresses", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "manager", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "returnOwnership", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "setAddresses", +- values?: undefined +- ): string; +- +- decodeFunctionResult(functionFragment: "finalOwner", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "getNamedAddresses", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "manager", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "returnOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "setAddresses", +- data: BytesLike +- ): Result; +- +- events: {}; +-} +- +-export interface AddressDictator extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: AddressDictatorInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- finalOwner(overrides?: CallOverrides): Promise<[string]>; +- +- getNamedAddresses( +- overrides?: CallOverrides +- ): Promise<[NamedAddressStructOutput[]]>; +- +- manager(overrides?: CallOverrides): Promise<[string]>; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setAddresses( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- finalOwner(overrides?: CallOverrides): Promise; +- +- getNamedAddresses( +- overrides?: CallOverrides +- ): Promise; +- +- manager(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setAddresses( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- finalOwner(overrides?: CallOverrides): Promise; +- +- getNamedAddresses( +- overrides?: CallOverrides +- ): Promise; +- +- manager(overrides?: CallOverrides): Promise; +- +- returnOwnership(overrides?: CallOverrides): Promise; +- +- setAddresses(overrides?: CallOverrides): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- finalOwner(overrides?: CallOverrides): Promise; +- +- getNamedAddresses(overrides?: CallOverrides): Promise; +- +- manager(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setAddresses( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- finalOwner(overrides?: CallOverrides): Promise; +- +- getNamedAddresses(overrides?: CallOverrides): Promise; +- +- manager(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setAddresses( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/ChugSplashDictator.ts b/node_modules/@eth-optimism/contracts/dist/types/ChugSplashDictator.ts +deleted file mode 100644 +index 543541f..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/ChugSplashDictator.ts ++++ /dev/null +@@ -1,263 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface ChugSplashDictatorInterface extends ethers.utils.Interface { +- functions: { +- "bridgeSlotKey()": FunctionFragment; +- "bridgeSlotVal()": FunctionFragment; +- "codeHash()": FunctionFragment; +- "doActions(bytes)": FunctionFragment; +- "finalOwner()": FunctionFragment; +- "isUpgrading()": FunctionFragment; +- "messengerSlotKey()": FunctionFragment; +- "messengerSlotVal()": FunctionFragment; +- "returnOwnership()": FunctionFragment; +- "target()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "bridgeSlotKey", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "bridgeSlotVal", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "codeHash", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "doActions", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "finalOwner", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "isUpgrading", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "messengerSlotKey", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "messengerSlotVal", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "returnOwnership", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "target", values?: undefined): string; +- +- decodeFunctionResult( +- functionFragment: "bridgeSlotKey", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "bridgeSlotVal", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "codeHash", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "doActions", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "finalOwner", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "isUpgrading", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "messengerSlotKey", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "messengerSlotVal", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "returnOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "target", data: BytesLike): Result; +- +- events: {}; +-} +- +-export interface ChugSplashDictator extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: ChugSplashDictatorInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- bridgeSlotKey(overrides?: CallOverrides): Promise<[string]>; +- +- bridgeSlotVal(overrides?: CallOverrides): Promise<[string]>; +- +- codeHash(overrides?: CallOverrides): Promise<[string]>; +- +- doActions( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalOwner(overrides?: CallOverrides): Promise<[string]>; +- +- isUpgrading(overrides?: CallOverrides): Promise<[boolean]>; +- +- messengerSlotKey(overrides?: CallOverrides): Promise<[string]>; +- +- messengerSlotVal(overrides?: CallOverrides): Promise<[string]>; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- target(overrides?: CallOverrides): Promise<[string]>; +- }; +- +- bridgeSlotKey(overrides?: CallOverrides): Promise; +- +- bridgeSlotVal(overrides?: CallOverrides): Promise; +- +- codeHash(overrides?: CallOverrides): Promise; +- +- doActions( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalOwner(overrides?: CallOverrides): Promise; +- +- isUpgrading(overrides?: CallOverrides): Promise; +- +- messengerSlotKey(overrides?: CallOverrides): Promise; +- +- messengerSlotVal(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- target(overrides?: CallOverrides): Promise; +- +- callStatic: { +- bridgeSlotKey(overrides?: CallOverrides): Promise; +- +- bridgeSlotVal(overrides?: CallOverrides): Promise; +- +- codeHash(overrides?: CallOverrides): Promise; +- +- doActions(_code: BytesLike, overrides?: CallOverrides): Promise; +- +- finalOwner(overrides?: CallOverrides): Promise; +- +- isUpgrading(overrides?: CallOverrides): Promise; +- +- messengerSlotKey(overrides?: CallOverrides): Promise; +- +- messengerSlotVal(overrides?: CallOverrides): Promise; +- +- returnOwnership(overrides?: CallOverrides): Promise; +- +- target(overrides?: CallOverrides): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- bridgeSlotKey(overrides?: CallOverrides): Promise; +- +- bridgeSlotVal(overrides?: CallOverrides): Promise; +- +- codeHash(overrides?: CallOverrides): Promise; +- +- doActions( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalOwner(overrides?: CallOverrides): Promise; +- +- isUpgrading(overrides?: CallOverrides): Promise; +- +- messengerSlotKey(overrides?: CallOverrides): Promise; +- +- messengerSlotVal(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- target(overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- bridgeSlotKey(overrides?: CallOverrides): Promise; +- +- bridgeSlotVal(overrides?: CallOverrides): Promise; +- +- codeHash(overrides?: CallOverrides): Promise; +- +- doActions( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalOwner(overrides?: CallOverrides): Promise; +- +- isUpgrading(overrides?: CallOverrides): Promise; +- +- messengerSlotKey(overrides?: CallOverrides): Promise; +- +- messengerSlotVal(overrides?: CallOverrides): Promise; +- +- returnOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- target(overrides?: CallOverrides): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IChainStorageContainer.ts b/node_modules/@eth-optimism/contracts/dist/types/IChainStorageContainer.ts +deleted file mode 100644 +index 2fcf9f6..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IChainStorageContainer.ts ++++ /dev/null +@@ -1,279 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface IChainStorageContainerInterface +- extends ethers.utils.Interface { +- functions: { +- "deleteElementsAfterInclusive(uint256,bytes27)": FunctionFragment; +- "get(uint256)": FunctionFragment; +- "getGlobalMetadata()": FunctionFragment; +- "length()": FunctionFragment; +- "push(bytes32,bytes27)": FunctionFragment; +- "setGlobalMetadata(bytes27)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "deleteElementsAfterInclusive", +- values: [BigNumberish, BytesLike] +- ): string; +- encodeFunctionData(functionFragment: "get", values: [BigNumberish]): string; +- encodeFunctionData( +- functionFragment: "getGlobalMetadata", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "length", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "push", +- values: [BytesLike, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "setGlobalMetadata", +- values: [BytesLike] +- ): string; +- +- decodeFunctionResult( +- functionFragment: "deleteElementsAfterInclusive", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "getGlobalMetadata", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "length", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "push", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "setGlobalMetadata", +- data: BytesLike +- ): Result; +- +- events: {}; +-} +- +-export interface IChainStorageContainer extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IChainStorageContainerInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise<[string]>; +- +- getGlobalMetadata(overrides?: CallOverrides): Promise<[string]>; +- +- length(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getGlobalMetadata(overrides?: CallOverrides): Promise; +- +- length(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getGlobalMetadata(overrides?: CallOverrides): Promise; +- +- length(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- "push(bytes32)"( +- _object: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getGlobalMetadata(overrides?: CallOverrides): Promise; +- +- length(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get( +- _index: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- getGlobalMetadata(overrides?: CallOverrides): Promise; +- +- length(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IERC20Metadata.ts b/node_modules/@eth-optimism/contracts/dist/types/IERC20Metadata.ts +deleted file mode 100644 +index 73d204e..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IERC20Metadata.ts ++++ /dev/null +@@ -1,339 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface IERC20MetadataInterface extends ethers.utils.Interface { +- functions: { +- "allowance(address,address)": FunctionFragment; +- "approve(address,uint256)": FunctionFragment; +- "balanceOf(address)": FunctionFragment; +- "decimals()": FunctionFragment; +- "name()": FunctionFragment; +- "symbol()": FunctionFragment; +- "totalSupply()": FunctionFragment; +- "transfer(address,uint256)": FunctionFragment; +- "transferFrom(address,address,uint256)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "allowance", +- values: [string, string] +- ): string; +- encodeFunctionData( +- functionFragment: "approve", +- values: [string, BigNumberish] +- ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; +- encodeFunctionData(functionFragment: "decimals", values?: undefined): string; +- encodeFunctionData(functionFragment: "name", values?: undefined): string; +- encodeFunctionData(functionFragment: "symbol", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "totalSupply", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "transfer", +- values: [string, BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "transferFrom", +- values: [string, string, BigNumberish] +- ): string; +- +- decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "totalSupply", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "transferFrom", +- data: BytesLike +- ): Result; +- +- events: { +- "Approval(address,address,uint256)": EventFragment; +- "Transfer(address,address,uint256)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +-} +- +-export type ApprovalEvent = TypedEvent< +- [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } +->; +- +-export type ApprovalEventFilter = TypedEventFilter; +- +-export type TransferEvent = TypedEvent< +- [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } +->; +- +-export type TransferEventFilter = TypedEventFilter; +- +-export interface IERC20Metadata extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IERC20MetadataInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- allowance( +- owner: string, +- spender: string, +- overrides?: CallOverrides +- ): Promise<[BigNumber]>; +- +- approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; +- +- decimals(overrides?: CallOverrides): Promise<[number]>; +- +- name(overrides?: CallOverrides): Promise<[string]>; +- +- symbol(overrides?: CallOverrides): Promise<[string]>; +- +- totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- allowance( +- owner: string, +- spender: string, +- overrides?: CallOverrides +- ): Promise; +- +- approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- balanceOf(account: string, overrides?: CallOverrides): Promise; +- +- decimals(overrides?: CallOverrides): Promise; +- +- name(overrides?: CallOverrides): Promise; +- +- symbol(overrides?: CallOverrides): Promise; +- +- totalSupply(overrides?: CallOverrides): Promise; +- +- transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- allowance( +- owner: string, +- spender: string, +- overrides?: CallOverrides +- ): Promise; +- +- approve( +- spender: string, +- amount: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- balanceOf(account: string, overrides?: CallOverrides): Promise; +- +- decimals(overrides?: CallOverrides): Promise; +- +- name(overrides?: CallOverrides): Promise; +- +- symbol(overrides?: CallOverrides): Promise; +- +- totalSupply(overrides?: CallOverrides): Promise; +- +- transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- }; +- +- filters: { +- "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, +- value?: null +- ): ApprovalEventFilter; +- Approval( +- owner?: string | null, +- spender?: string | null, +- value?: null +- ): ApprovalEventFilter; +- +- "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, +- value?: null +- ): TransferEventFilter; +- Transfer( +- from?: string | null, +- to?: string | null, +- value?: null +- ): TransferEventFilter; +- }; +- +- estimateGas: { +- allowance( +- owner: string, +- spender: string, +- overrides?: CallOverrides +- ): Promise; +- +- approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- balanceOf(account: string, overrides?: CallOverrides): Promise; +- +- decimals(overrides?: CallOverrides): Promise; +- +- name(overrides?: CallOverrides): Promise; +- +- symbol(overrides?: CallOverrides): Promise; +- +- totalSupply(overrides?: CallOverrides): Promise; +- +- transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- allowance( +- owner: string, +- spender: string, +- overrides?: CallOverrides +- ): Promise; +- +- approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- balanceOf( +- account: string, +- overrides?: CallOverrides +- ): Promise; +- +- decimals(overrides?: CallOverrides): Promise; +- +- name(overrides?: CallOverrides): Promise; +- +- symbol(overrides?: CallOverrides): Promise; +- +- totalSupply(overrides?: CallOverrides): Promise; +- +- transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL1CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/IL1CrossDomainMessenger.ts +deleted file mode 100644 +index 1fea61c..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL1CrossDomainMessenger.ts ++++ /dev/null +@@ -1,377 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export type ChainBatchHeaderStruct = { +- batchIndex: BigNumberish; +- batchRoot: BytesLike; +- batchSize: BigNumberish; +- prevTotalElements: BigNumberish; +- extraData: BytesLike; +-}; +- +-export type ChainBatchHeaderStructOutput = [ +- BigNumber, +- string, +- BigNumber, +- BigNumber, +- string +-] & { +- batchIndex: BigNumber; +- batchRoot: string; +- batchSize: BigNumber; +- prevTotalElements: BigNumber; +- extraData: string; +-}; +- +-export type ChainInclusionProofStruct = { +- index: BigNumberish; +- siblings: BytesLike[]; +-}; +- +-export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { +- index: BigNumber; +- siblings: string[]; +-}; +- +-export type L2MessageInclusionProofStruct = { +- stateRoot: BytesLike; +- stateRootBatchHeader: ChainBatchHeaderStruct; +- stateRootProof: ChainInclusionProofStruct; +- stateTrieWitness: BytesLike; +- storageTrieWitness: BytesLike; +-}; +- +-export type L2MessageInclusionProofStructOutput = [ +- string, +- ChainBatchHeaderStructOutput, +- ChainInclusionProofStructOutput, +- string, +- string +-] & { +- stateRoot: string; +- stateRootBatchHeader: ChainBatchHeaderStructOutput; +- stateRootProof: ChainInclusionProofStructOutput; +- stateTrieWitness: string; +- storageTrieWitness: string; +-}; +- +-export interface IL1CrossDomainMessengerInterface +- extends ethers.utils.Interface { +- functions: { +- "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; +- "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; +- "sendMessage(address,bytes,uint32)": FunctionFragment; +- "xDomainMessageSender()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "relayMessage", +- values: [ +- string, +- string, +- BytesLike, +- BigNumberish, +- L2MessageInclusionProofStruct +- ] +- ): string; +- encodeFunctionData( +- functionFragment: "replayMessage", +- values: [ +- string, +- string, +- BytesLike, +- BigNumberish, +- BigNumberish, +- BigNumberish +- ] +- ): string; +- encodeFunctionData( +- functionFragment: "sendMessage", +- values: [string, BytesLike, BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "xDomainMessageSender", +- values?: undefined +- ): string; +- +- decodeFunctionResult( +- functionFragment: "relayMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "replayMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "sendMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "xDomainMessageSender", +- data: BytesLike +- ): Result; +- +- events: { +- "FailedRelayedMessage(bytes32)": EventFragment; +- "RelayedMessage(bytes32)": EventFragment; +- "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; +-} +- +-export type FailedRelayedMessageEvent = TypedEvent< +- [string], +- { msgHash: string } +->; +- +-export type FailedRelayedMessageEventFilter = +- TypedEventFilter; +- +-export type RelayedMessageEvent = TypedEvent<[string], { msgHash: string }>; +- +-export type RelayedMessageEventFilter = TypedEventFilter; +- +-export type SentMessageEvent = TypedEvent< +- [string, string, string, BigNumber, BigNumber], +- { +- target: string; +- sender: string; +- message: string; +- messageNonce: BigNumber; +- gasLimit: BigNumber; +- } +->; +- +-export type SentMessageEventFilter = TypedEventFilter; +- +-export interface IL1CrossDomainMessenger extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IL1CrossDomainMessengerInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; +- }; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- +- callStatic: { +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: CallOverrides +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "FailedRelayedMessage(bytes32)"( +- msgHash?: BytesLike | null +- ): FailedRelayedMessageEventFilter; +- FailedRelayedMessage( +- msgHash?: BytesLike | null +- ): FailedRelayedMessageEventFilter; +- +- "RelayedMessage(bytes32)"( +- msgHash?: BytesLike | null +- ): RelayedMessageEventFilter; +- RelayedMessage(msgHash?: BytesLike | null): RelayedMessageEventFilter; +- +- "SentMessage(address,address,bytes,uint256,uint256)"( +- target?: string | null, +- sender?: null, +- message?: null, +- messageNonce?: null, +- gasLimit?: null +- ): SentMessageEventFilter; +- SentMessage( +- target?: string | null, +- sender?: null, +- message?: null, +- messageNonce?: null, +- gasLimit?: null +- ): SentMessageEventFilter; +- }; +- +- estimateGas: { +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender( +- overrides?: CallOverrides +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL1ERC20Bridge.ts b/node_modules/@eth-optimism/contracts/dist/types/IL1ERC20Bridge.ts +deleted file mode 100644 +index 69ee090..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL1ERC20Bridge.ts ++++ /dev/null +@@ -1,340 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface IL1ERC20BridgeInterface extends ethers.utils.Interface { +- functions: { +- "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; +- "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; +- "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; +- "l2TokenBridge()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "depositERC20", +- values: [string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositERC20To", +- values: [string, string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "finalizeERC20Withdrawal", +- values: [string, string, string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "l2TokenBridge", +- values?: undefined +- ): string; +- +- decodeFunctionResult( +- functionFragment: "depositERC20", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "depositERC20To", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "finalizeERC20Withdrawal", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "l2TokenBridge", +- data: BytesLike +- ): Result; +- +- events: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; +-} +- +-export type ERC20DepositInitiatedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20DepositInitiatedEventFilter = +- TypedEventFilter; +- +-export type ERC20WithdrawalFinalizedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20WithdrawalFinalizedEventFilter = +- TypedEventFilter; +- +-export interface IL1ERC20Bridge extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IL1ERC20BridgeInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- ERC20DepositInitiated( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- ERC20WithdrawalFinalized( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- }; +- +- estimateGas: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL1StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/IL1StandardBridge.ts +deleted file mode 100644 +index 85575b7..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL1StandardBridge.ts ++++ /dev/null +@@ -1,516 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- PayableOverrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface IL1StandardBridgeInterface extends ethers.utils.Interface { +- functions: { +- "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; +- "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; +- "depositETH(uint32,bytes)": FunctionFragment; +- "depositETHTo(address,uint32,bytes)": FunctionFragment; +- "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; +- "finalizeETHWithdrawal(address,address,uint256,bytes)": FunctionFragment; +- "l2TokenBridge()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "depositERC20", +- values: [string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositERC20To", +- values: [string, string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositETH", +- values: [BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositETHTo", +- values: [string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "finalizeERC20Withdrawal", +- values: [string, string, string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "finalizeETHWithdrawal", +- values: [string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "l2TokenBridge", +- values?: undefined +- ): string; +- +- decodeFunctionResult( +- functionFragment: "depositERC20", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "depositERC20To", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "depositETHTo", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "finalizeERC20Withdrawal", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "finalizeETHWithdrawal", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "l2TokenBridge", +- data: BytesLike +- ): Result; +- +- events: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; +- "ETHDepositInitiated(address,address,uint256,bytes)": EventFragment; +- "ETHWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ETHDepositInitiated"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ETHWithdrawalFinalized"): EventFragment; +-} +- +-export type ERC20DepositInitiatedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20DepositInitiatedEventFilter = +- TypedEventFilter; +- +-export type ERC20WithdrawalFinalizedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20WithdrawalFinalizedEventFilter = +- TypedEventFilter; +- +-export type ETHDepositInitiatedEvent = TypedEvent< +- [string, string, BigNumber, string], +- { _from: string; _to: string; _amount: BigNumber; _data: string } +->; +- +-export type ETHDepositInitiatedEventFilter = +- TypedEventFilter; +- +-export type ETHWithdrawalFinalizedEvent = TypedEvent< +- [string, string, BigNumber, string], +- { _from: string; _to: string; _amount: BigNumber; _data: string } +->; +- +-export type ETHWithdrawalFinalizedEventFilter = +- TypedEventFilter; +- +-export interface IL1StandardBridge extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IL1StandardBridgeInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- ERC20DepositInitiated( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- ERC20WithdrawalFinalized( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- +- "ETHDepositInitiated(address,address,uint256,bytes)"( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHDepositInitiatedEventFilter; +- ETHDepositInitiated( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHDepositInitiatedEventFilter; +- +- "ETHWithdrawalFinalized(address,address,uint256,bytes)"( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHWithdrawalFinalizedEventFilter; +- ETHWithdrawalFinalized( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHWithdrawalFinalizedEventFilter; +- }; +- +- estimateGas: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL2ERC20Bridge.ts b/node_modules/@eth-optimism/contracts/dist/types/IL2ERC20Bridge.ts +deleted file mode 100644 +index f2383bf..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL2ERC20Bridge.ts ++++ /dev/null +@@ -1,357 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface IL2ERC20BridgeInterface extends ethers.utils.Interface { +- functions: { +- "finalizeDeposit(address,address,address,address,uint256,bytes)": FunctionFragment; +- "l1TokenBridge()": FunctionFragment; +- "withdraw(address,uint256,uint32,bytes)": FunctionFragment; +- "withdrawTo(address,address,uint256,uint32,bytes)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "finalizeDeposit", +- values: [string, string, string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "l1TokenBridge", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "withdraw", +- values: [string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "withdrawTo", +- values: [string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- +- decodeFunctionResult( +- functionFragment: "finalizeDeposit", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "l1TokenBridge", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "withdrawTo", data: BytesLike): Result; +- +- events: { +- "DepositFailed(address,address,address,address,uint256,bytes)": EventFragment; +- "DepositFinalized(address,address,address,address,uint256,bytes)": EventFragment; +- "WithdrawalInitiated(address,address,address,address,uint256,bytes)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "DepositFailed"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "DepositFinalized"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; +-} +- +-export type DepositFailedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type DepositFailedEventFilter = TypedEventFilter; +- +-export type DepositFinalizedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type DepositFinalizedEventFilter = +- TypedEventFilter; +- +-export type WithdrawalInitiatedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type WithdrawalInitiatedEventFilter = +- TypedEventFilter; +- +-export interface IL2ERC20Bridge extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: IL2ERC20BridgeInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +- +- filters: { +- "DepositFailed(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFailedEventFilter; +- DepositFailed( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFailedEventFilter; +- +- "DepositFinalized(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFinalizedEventFilter; +- DepositFinalized( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFinalizedEventFilter; +- +- "WithdrawalInitiated(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): WithdrawalInitiatedEventFilter; +- WithdrawalInitiated( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): WithdrawalInitiatedEventFilter; +- }; +- +- estimateGas: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L1CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/L1CrossDomainMessenger.ts +deleted file mode 100644 +index 89ea641..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/L1CrossDomainMessenger.ts ++++ /dev/null +@@ -1,781 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export type ChainBatchHeaderStruct = { +- batchIndex: BigNumberish; +- batchRoot: BytesLike; +- batchSize: BigNumberish; +- prevTotalElements: BigNumberish; +- extraData: BytesLike; +-}; +- +-export type ChainBatchHeaderStructOutput = [ +- BigNumber, +- string, +- BigNumber, +- BigNumber, +- string +-] & { +- batchIndex: BigNumber; +- batchRoot: string; +- batchSize: BigNumber; +- prevTotalElements: BigNumber; +- extraData: string; +-}; +- +-export type ChainInclusionProofStruct = { +- index: BigNumberish; +- siblings: BytesLike[]; +-}; +- +-export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { +- index: BigNumber; +- siblings: string[]; +-}; +- +-export type L2MessageInclusionProofStruct = { +- stateRoot: BytesLike; +- stateRootBatchHeader: ChainBatchHeaderStruct; +- stateRootProof: ChainInclusionProofStruct; +- stateTrieWitness: BytesLike; +- storageTrieWitness: BytesLike; +-}; +- +-export type L2MessageInclusionProofStructOutput = [ +- string, +- ChainBatchHeaderStructOutput, +- ChainInclusionProofStructOutput, +- string, +- string +-] & { +- stateRoot: string; +- stateRootBatchHeader: ChainBatchHeaderStructOutput; +- stateRootProof: ChainInclusionProofStructOutput; +- stateTrieWitness: string; +- storageTrieWitness: string; +-}; +- +-export interface L1CrossDomainMessengerInterface +- extends ethers.utils.Interface { +- functions: { +- "allowMessage(bytes32)": FunctionFragment; +- "blockMessage(bytes32)": FunctionFragment; +- "blockedMessages(bytes32)": FunctionFragment; +- "initialize(address)": FunctionFragment; +- "libAddressManager()": FunctionFragment; +- "owner()": FunctionFragment; +- "pause()": FunctionFragment; +- "paused()": FunctionFragment; +- "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; +- "relayedMessages(bytes32)": FunctionFragment; +- "renounceOwnership()": FunctionFragment; +- "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; +- "resolve(string)": FunctionFragment; +- "sendMessage(address,bytes,uint32)": FunctionFragment; +- "successfulMessages(bytes32)": FunctionFragment; +- "transferOwnership(address)": FunctionFragment; +- "xDomainMessageSender()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "allowMessage", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "blockMessage", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "blockedMessages", +- values: [BytesLike] +- ): string; +- encodeFunctionData(functionFragment: "initialize", values: [string]): string; +- encodeFunctionData( +- functionFragment: "libAddressManager", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "owner", values?: undefined): string; +- encodeFunctionData(functionFragment: "pause", values?: undefined): string; +- encodeFunctionData(functionFragment: "paused", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "relayMessage", +- values: [ +- string, +- string, +- BytesLike, +- BigNumberish, +- L2MessageInclusionProofStruct +- ] +- ): string; +- encodeFunctionData( +- functionFragment: "relayedMessages", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "renounceOwnership", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "replayMessage", +- values: [ +- string, +- string, +- BytesLike, +- BigNumberish, +- BigNumberish, +- BigNumberish +- ] +- ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; +- encodeFunctionData( +- functionFragment: "sendMessage", +- values: [string, BytesLike, BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "successfulMessages", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "transferOwnership", +- values: [string] +- ): string; +- encodeFunctionData( +- functionFragment: "xDomainMessageSender", +- values?: undefined +- ): string; +- +- decodeFunctionResult( +- functionFragment: "allowMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "blockMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "blockedMessages", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "libAddressManager", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "relayMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "relayedMessages", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "renounceOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "replayMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "sendMessage", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "successfulMessages", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "transferOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "xDomainMessageSender", +- data: BytesLike +- ): Result; +- +- events: { +- "FailedRelayedMessage(bytes32)": EventFragment; +- "MessageAllowed(bytes32)": EventFragment; +- "MessageBlocked(bytes32)": EventFragment; +- "OwnershipTransferred(address,address)": EventFragment; +- "Paused(address)": EventFragment; +- "RelayedMessage(bytes32)": EventFragment; +- "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; +- "Unpaused(address)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "MessageAllowed"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "MessageBlocked"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +-} +- +-export type FailedRelayedMessageEvent = TypedEvent< +- [string], +- { msgHash: string } +->; +- +-export type FailedRelayedMessageEventFilter = +- TypedEventFilter; +- +-export type MessageAllowedEvent = TypedEvent< +- [string], +- { _xDomainCalldataHash: string } +->; +- +-export type MessageAllowedEventFilter = TypedEventFilter; +- +-export type MessageBlockedEvent = TypedEvent< +- [string], +- { _xDomainCalldataHash: string } +->; +- +-export type MessageBlockedEventFilter = TypedEventFilter; +- +-export type OwnershipTransferredEvent = TypedEvent< +- [string, string], +- { previousOwner: string; newOwner: string } +->; +- +-export type OwnershipTransferredEventFilter = +- TypedEventFilter; +- +-export type PausedEvent = TypedEvent<[string], { account: string }>; +- +-export type PausedEventFilter = TypedEventFilter; +- +-export type RelayedMessageEvent = TypedEvent<[string], { msgHash: string }>; +- +-export type RelayedMessageEventFilter = TypedEventFilter; +- +-export type SentMessageEvent = TypedEvent< +- [string, string, string, BigNumber, BigNumber], +- { +- target: string; +- sender: string; +- message: string; +- messageNonce: BigNumber; +- gasLimit: BigNumber; +- } +->; +- +-export type SentMessageEventFilter = TypedEventFilter; +- +-export type UnpausedEvent = TypedEvent<[string], { account: string }>; +- +-export type UnpausedEventFilter = TypedEventFilter; +- +-export interface L1CrossDomainMessenger extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: L1CrossDomainMessengerInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- allowMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise<[boolean]>; +- +- initialize( +- _libAddressManager: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- libAddressManager(overrides?: CallOverrides): Promise<[string]>; +- +- owner(overrides?: CallOverrides): Promise<[string]>; +- +- pause( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- paused(overrides?: CallOverrides): Promise<[boolean]>; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- relayedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise<[boolean]>; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- successfulMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise<[boolean]>; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; +- }; +- +- allowMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockedMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; +- +- initialize( +- _libAddressManager: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- libAddressManager(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- pause( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- paused(overrides?: CallOverrides): Promise; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- relayedMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- resolve(_name: string, overrides?: CallOverrides): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- successfulMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- +- callStatic: { +- allowMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- blockMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- blockedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- initialize( +- _libAddressManager: string, +- overrides?: CallOverrides +- ): Promise; +- +- libAddressManager(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- pause(overrides?: CallOverrides): Promise; +- +- paused(overrides?: CallOverrides): Promise; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: CallOverrides +- ): Promise; +- +- relayedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- renounceOwnership(overrides?: CallOverrides): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- resolve(_name: string, overrides?: CallOverrides): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- successfulMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: CallOverrides +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "FailedRelayedMessage(bytes32)"( +- msgHash?: BytesLike | null +- ): FailedRelayedMessageEventFilter; +- FailedRelayedMessage( +- msgHash?: BytesLike | null +- ): FailedRelayedMessageEventFilter; +- +- "MessageAllowed(bytes32)"( +- _xDomainCalldataHash?: BytesLike | null +- ): MessageAllowedEventFilter; +- MessageAllowed( +- _xDomainCalldataHash?: BytesLike | null +- ): MessageAllowedEventFilter; +- +- "MessageBlocked(bytes32)"( +- _xDomainCalldataHash?: BytesLike | null +- ): MessageBlockedEventFilter; +- MessageBlocked( +- _xDomainCalldataHash?: BytesLike | null +- ): MessageBlockedEventFilter; +- +- "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- +- "Paused(address)"(account?: null): PausedEventFilter; +- Paused(account?: null): PausedEventFilter; +- +- "RelayedMessage(bytes32)"( +- msgHash?: BytesLike | null +- ): RelayedMessageEventFilter; +- RelayedMessage(msgHash?: BytesLike | null): RelayedMessageEventFilter; +- +- "SentMessage(address,address,bytes,uint256,uint256)"( +- target?: string | null, +- sender?: null, +- message?: null, +- messageNonce?: null, +- gasLimit?: null +- ): SentMessageEventFilter; +- SentMessage( +- target?: string | null, +- sender?: null, +- message?: null, +- messageNonce?: null, +- gasLimit?: null +- ): SentMessageEventFilter; +- +- "Unpaused(address)"(account?: null): UnpausedEventFilter; +- Unpaused(account?: null): UnpausedEventFilter; +- }; +- +- estimateGas: { +- allowMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- initialize( +- _libAddressManager: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- libAddressManager(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- pause( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- paused(overrides?: CallOverrides): Promise; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- relayedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- resolve(_name: string, overrides?: CallOverrides): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- successfulMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender(overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- allowMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockMessage( +- _xDomainCalldataHash: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- blockedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- initialize( +- _libAddressManager: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- libAddressManager(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- pause( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- paused(overrides?: CallOverrides): Promise; +- +- relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- _proof: L2MessageInclusionProofStruct, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- relayedMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- replayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _queueIndex: BigNumberish, +- _oldGasLimit: BigNumberish, +- _newGasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- resolve( +- _name: string, +- overrides?: CallOverrides +- ): Promise; +- +- sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- successfulMessages( +- arg0: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- xDomainMessageSender( +- overrides?: CallOverrides +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L1StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/L1StandardBridge.ts +deleted file mode 100644 +index c98e7cb..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/L1StandardBridge.ts ++++ /dev/null +@@ -1,614 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- PayableOverrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface L1StandardBridgeInterface extends ethers.utils.Interface { +- functions: { +- "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; +- "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; +- "depositETH(uint32,bytes)": FunctionFragment; +- "depositETHTo(address,uint32,bytes)": FunctionFragment; +- "deposits(address,address)": FunctionFragment; +- "donateETH()": FunctionFragment; +- "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; +- "finalizeETHWithdrawal(address,address,uint256,bytes)": FunctionFragment; +- "initialize(address,address)": FunctionFragment; +- "l2TokenBridge()": FunctionFragment; +- "messenger()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "depositERC20", +- values: [string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositERC20To", +- values: [string, string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositETH", +- values: [BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "depositETHTo", +- values: [string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "deposits", +- values: [string, string] +- ): string; +- encodeFunctionData(functionFragment: "donateETH", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "finalizeERC20Withdrawal", +- values: [string, string, string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "finalizeETHWithdrawal", +- values: [string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "initialize", +- values: [string, string] +- ): string; +- encodeFunctionData( +- functionFragment: "l2TokenBridge", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "messenger", values?: undefined): string; +- +- decodeFunctionResult( +- functionFragment: "depositERC20", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "depositERC20To", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "depositETHTo", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "deposits", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "donateETH", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "finalizeERC20Withdrawal", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "finalizeETHWithdrawal", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "l2TokenBridge", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; +- +- events: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; +- "ETHDepositInitiated(address,address,uint256,bytes)": EventFragment; +- "ETHWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ETHDepositInitiated"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "ETHWithdrawalFinalized"): EventFragment; +-} +- +-export type ERC20DepositInitiatedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20DepositInitiatedEventFilter = +- TypedEventFilter; +- +-export type ERC20WithdrawalFinalizedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type ERC20WithdrawalFinalizedEventFilter = +- TypedEventFilter; +- +-export type ETHDepositInitiatedEvent = TypedEvent< +- [string, string, BigNumber, string], +- { _from: string; _to: string; _amount: BigNumber; _data: string } +->; +- +-export type ETHDepositInitiatedEventFilter = +- TypedEventFilter; +- +-export type ETHWithdrawalFinalizedEvent = TypedEvent< +- [string, string, BigNumber, string], +- { _from: string; _to: string; _amount: BigNumber; _data: string } +->; +- +-export type ETHWithdrawalFinalizedEventFilter = +- TypedEventFilter; +- +-export interface L1StandardBridge extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: L1StandardBridgeInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- deposits( +- arg0: string, +- arg1: string, +- overrides?: CallOverrides +- ): Promise<[BigNumber]>; +- +- donateETH( +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- initialize( +- _l1messenger: string, +- _l2TokenBridge: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise<[string]>; +- +- messenger(overrides?: CallOverrides): Promise<[string]>; +- }; +- +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- deposits( +- arg0: string, +- arg1: string, +- overrides?: CallOverrides +- ): Promise; +- +- donateETH( +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- initialize( +- _l1messenger: string, +- _l2TokenBridge: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- +- callStatic: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- deposits( +- arg0: string, +- arg1: string, +- overrides?: CallOverrides +- ): Promise; +- +- donateETH(overrides?: CallOverrides): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- initialize( +- _l1messenger: string, +- _l2TokenBridge: string, +- overrides?: CallOverrides +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- ERC20DepositInitiated( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20DepositInitiatedEventFilter; +- +- "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- ERC20WithdrawalFinalized( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): ERC20WithdrawalFinalizedEventFilter; +- +- "ETHDepositInitiated(address,address,uint256,bytes)"( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHDepositInitiatedEventFilter; +- ETHDepositInitiated( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHDepositInitiatedEventFilter; +- +- "ETHWithdrawalFinalized(address,address,uint256,bytes)"( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHWithdrawalFinalizedEventFilter; +- ETHWithdrawalFinalized( +- _from?: string | null, +- _to?: string | null, +- _amount?: null, +- _data?: null +- ): ETHWithdrawalFinalizedEventFilter; +- }; +- +- estimateGas: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- deposits( +- arg0: string, +- arg1: string, +- overrides?: CallOverrides +- ): Promise; +- +- donateETH( +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- initialize( +- _l1messenger: string, +- _l2TokenBridge: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- depositERC20( +- _l1Token: string, +- _l2Token: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositERC20To( +- _l1Token: string, +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- depositETH( +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- depositETHTo( +- _to: string, +- _l2Gas: BigNumberish, +- _data: BytesLike, +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- deposits( +- arg0: string, +- arg1: string, +- overrides?: CallOverrides +- ): Promise; +- +- donateETH( +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- finalizeERC20Withdrawal( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- finalizeETHWithdrawal( +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- initialize( +- _l1messenger: string, +- _l2TokenBridge: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l2TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L2StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/L2StandardBridge.ts +deleted file mode 100644 +index ccdaea5..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/L2StandardBridge.ts ++++ /dev/null +@@ -1,362 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface L2StandardBridgeInterface extends ethers.utils.Interface { +- functions: { +- "finalizeDeposit(address,address,address,address,uint256,bytes)": FunctionFragment; +- "l1TokenBridge()": FunctionFragment; +- "messenger()": FunctionFragment; +- "withdraw(address,uint256,uint32,bytes)": FunctionFragment; +- "withdrawTo(address,address,uint256,uint32,bytes)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "finalizeDeposit", +- values: [string, string, string, string, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "l1TokenBridge", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "messenger", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "withdraw", +- values: [string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "withdrawTo", +- values: [string, string, BigNumberish, BigNumberish, BytesLike] +- ): string; +- +- decodeFunctionResult( +- functionFragment: "finalizeDeposit", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "l1TokenBridge", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "withdrawTo", data: BytesLike): Result; +- +- events: { +- "DepositFailed(address,address,address,address,uint256,bytes)": EventFragment; +- "DepositFinalized(address,address,address,address,uint256,bytes)": EventFragment; +- "WithdrawalInitiated(address,address,address,address,uint256,bytes)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "DepositFailed"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "DepositFinalized"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; +-} +- +-export type DepositFailedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type DepositFailedEventFilter = TypedEventFilter; +- +-export type DepositFinalizedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type DepositFinalizedEventFilter = +- TypedEventFilter; +- +-export type WithdrawalInitiatedEvent = TypedEvent< +- [string, string, string, string, BigNumber, string], +- { +- _l1Token: string; +- _l2Token: string; +- _from: string; +- _to: string; +- _amount: BigNumber; +- _data: string; +- } +->; +- +-export type WithdrawalInitiatedEventFilter = +- TypedEventFilter; +- +-export interface L2StandardBridge extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: L2StandardBridgeInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise<[string]>; +- +- messenger(overrides?: CallOverrides): Promise<[string]>; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +- +- filters: { +- "DepositFailed(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFailedEventFilter; +- DepositFailed( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFailedEventFilter; +- +- "DepositFinalized(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFinalizedEventFilter; +- DepositFinalized( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): DepositFinalizedEventFilter; +- +- "WithdrawalInitiated(address,address,address,address,uint256,bytes)"( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): WithdrawalInitiatedEventFilter; +- WithdrawalInitiated( +- _l1Token?: string | null, +- _l2Token?: string | null, +- _from?: string | null, +- _to?: null, +- _amount?: null, +- _data?: null +- ): WithdrawalInitiatedEventFilter; +- }; +- +- estimateGas: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- finalizeDeposit( +- _l1Token: string, +- _l2Token: string, +- _from: string, +- _to: string, +- _amount: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- l1TokenBridge(overrides?: CallOverrides): Promise; +- +- messenger(overrides?: CallOverrides): Promise; +- +- withdraw( +- _l2Token: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawTo( +- _l2Token: string, +- _to: string, +- _amount: BigNumberish, +- _l1Gas: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/LibResolvedDelegateProxy.ts b/node_modules/@eth-optimism/contracts/dist/types/LibResolvedDelegateProxy.ts +deleted file mode 100644 +index 47a390d..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/LibResolvedDelegateProxy.ts ++++ /dev/null +@@ -1,67 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface LibResolvedDelegateProxyInterface +- extends ethers.utils.Interface { +- functions: {}; +- +- events: {}; +-} +- +-export interface LibResolvedDelegateProxy extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: LibResolvedDelegateProxyInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: {}; +- +- callStatic: {}; +- +- filters: {}; +- +- estimateGas: {}; +- +- populateTransaction: {}; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TeleportrDeposit.ts b/node_modules/@eth-optimism/contracts/dist/types/TeleportrDeposit.ts +deleted file mode 100644 +index 27e85e8..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/TeleportrDeposit.ts ++++ /dev/null +@@ -1,463 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface TeleportrDepositInterface extends ethers.utils.Interface { +- functions: { +- "maxBalance()": FunctionFragment; +- "maxDepositAmount()": FunctionFragment; +- "minDepositAmount()": FunctionFragment; +- "owner()": FunctionFragment; +- "renounceOwnership()": FunctionFragment; +- "setMaxAmount(uint256)": FunctionFragment; +- "setMaxBalance(uint256)": FunctionFragment; +- "setMinAmount(uint256)": FunctionFragment; +- "totalDeposits()": FunctionFragment; +- "transferOwnership(address)": FunctionFragment; +- "withdrawBalance()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "maxBalance", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "maxDepositAmount", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "minDepositAmount", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "owner", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "renounceOwnership", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "setMaxAmount", +- values: [BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "setMaxBalance", +- values: [BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "setMinAmount", +- values: [BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "totalDeposits", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "transferOwnership", +- values: [string] +- ): string; +- encodeFunctionData( +- functionFragment: "withdrawBalance", +- values?: undefined +- ): string; +- +- decodeFunctionResult(functionFragment: "maxBalance", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "maxDepositAmount", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "minDepositAmount", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "renounceOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "setMaxAmount", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "setMaxBalance", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "setMinAmount", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "totalDeposits", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "transferOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "withdrawBalance", +- data: BytesLike +- ): Result; +- +- events: { +- "BalanceWithdrawn(address,uint256)": EventFragment; +- "EtherReceived(uint256,address,uint256)": EventFragment; +- "MaxBalanceSet(uint256,uint256)": EventFragment; +- "MaxDepositAmountSet(uint256,uint256)": EventFragment; +- "MinDepositAmountSet(uint256,uint256)": EventFragment; +- "OwnershipTransferred(address,address)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "BalanceWithdrawn"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "EtherReceived"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "MaxBalanceSet"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "MaxDepositAmountSet"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "MinDepositAmountSet"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +-} +- +-export type BalanceWithdrawnEvent = TypedEvent< +- [string, BigNumber], +- { owner: string; balance: BigNumber } +->; +- +-export type BalanceWithdrawnEventFilter = +- TypedEventFilter; +- +-export type EtherReceivedEvent = TypedEvent< +- [BigNumber, string, BigNumber], +- { depositId: BigNumber; emitter: string; amount: BigNumber } +->; +- +-export type EtherReceivedEventFilter = TypedEventFilter; +- +-export type MaxBalanceSetEvent = TypedEvent< +- [BigNumber, BigNumber], +- { previousBalance: BigNumber; newBalance: BigNumber } +->; +- +-export type MaxBalanceSetEventFilter = TypedEventFilter; +- +-export type MaxDepositAmountSetEvent = TypedEvent< +- [BigNumber, BigNumber], +- { previousAmount: BigNumber; newAmount: BigNumber } +->; +- +-export type MaxDepositAmountSetEventFilter = +- TypedEventFilter; +- +-export type MinDepositAmountSetEvent = TypedEvent< +- [BigNumber, BigNumber], +- { previousAmount: BigNumber; newAmount: BigNumber } +->; +- +-export type MinDepositAmountSetEventFilter = +- TypedEventFilter; +- +-export type OwnershipTransferredEvent = TypedEvent< +- [string, string], +- { previousOwner: string; newOwner: string } +->; +- +-export type OwnershipTransferredEventFilter = +- TypedEventFilter; +- +-export interface TeleportrDeposit extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: TeleportrDepositInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- maxBalance(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- maxDepositAmount(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- minDepositAmount(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- owner(overrides?: CallOverrides): Promise<[string]>; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxAmount( +- _maxDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxBalance( +- _maxBalance: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMinAmount( +- _minDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDeposits(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- maxBalance(overrides?: CallOverrides): Promise; +- +- maxDepositAmount(overrides?: CallOverrides): Promise; +- +- minDepositAmount(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxAmount( +- _maxDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxBalance( +- _maxBalance: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMinAmount( +- _minDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDeposits(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- maxBalance(overrides?: CallOverrides): Promise; +- +- maxDepositAmount(overrides?: CallOverrides): Promise; +- +- minDepositAmount(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership(overrides?: CallOverrides): Promise; +- +- setMaxAmount( +- _maxDepositAmount: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- setMaxBalance( +- _maxBalance: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- setMinAmount( +- _minDepositAmount: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- totalDeposits(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: CallOverrides +- ): Promise; +- +- withdrawBalance(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "BalanceWithdrawn(address,uint256)"( +- owner?: string | null, +- balance?: null +- ): BalanceWithdrawnEventFilter; +- BalanceWithdrawn( +- owner?: string | null, +- balance?: null +- ): BalanceWithdrawnEventFilter; +- +- "EtherReceived(uint256,address,uint256)"( +- depositId?: BigNumberish | null, +- emitter?: string | null, +- amount?: BigNumberish | null +- ): EtherReceivedEventFilter; +- EtherReceived( +- depositId?: BigNumberish | null, +- emitter?: string | null, +- amount?: BigNumberish | null +- ): EtherReceivedEventFilter; +- +- "MaxBalanceSet(uint256,uint256)"( +- previousBalance?: null, +- newBalance?: null +- ): MaxBalanceSetEventFilter; +- MaxBalanceSet( +- previousBalance?: null, +- newBalance?: null +- ): MaxBalanceSetEventFilter; +- +- "MaxDepositAmountSet(uint256,uint256)"( +- previousAmount?: null, +- newAmount?: null +- ): MaxDepositAmountSetEventFilter; +- MaxDepositAmountSet( +- previousAmount?: null, +- newAmount?: null +- ): MaxDepositAmountSetEventFilter; +- +- "MinDepositAmountSet(uint256,uint256)"( +- previousAmount?: null, +- newAmount?: null +- ): MinDepositAmountSetEventFilter; +- MinDepositAmountSet( +- previousAmount?: null, +- newAmount?: null +- ): MinDepositAmountSetEventFilter; +- +- "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- }; +- +- estimateGas: { +- maxBalance(overrides?: CallOverrides): Promise; +- +- maxDepositAmount(overrides?: CallOverrides): Promise; +- +- minDepositAmount(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxAmount( +- _maxDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxBalance( +- _maxBalance: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMinAmount( +- _minDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDeposits(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- maxBalance(overrides?: CallOverrides): Promise; +- +- maxDepositAmount(overrides?: CallOverrides): Promise; +- +- minDepositAmount(overrides?: CallOverrides): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxAmount( +- _maxDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMaxBalance( +- _maxBalance: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setMinAmount( +- _minDepositAmount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDeposits(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TeleportrDisburser.ts b/node_modules/@eth-optimism/contracts/dist/types/TeleportrDisburser.ts +deleted file mode 100644 +index 5ad82fc..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/TeleportrDisburser.ts ++++ /dev/null +@@ -1,319 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- PayableOverrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export type DisbursementStruct = { amount: BigNumberish; addr: string }; +- +-export type DisbursementStructOutput = [BigNumber, string] & { +- amount: BigNumber; +- addr: string; +-}; +- +-export interface TeleportrDisburserInterface extends ethers.utils.Interface { +- functions: { +- "disburse(uint256,(uint256,address)[])": FunctionFragment; +- "owner()": FunctionFragment; +- "renounceOwnership()": FunctionFragment; +- "totalDisbursements()": FunctionFragment; +- "transferOwnership(address)": FunctionFragment; +- "withdrawBalance()": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "disburse", +- values: [BigNumberish, DisbursementStruct[]] +- ): string; +- encodeFunctionData(functionFragment: "owner", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "renounceOwnership", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "totalDisbursements", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "transferOwnership", +- values: [string] +- ): string; +- encodeFunctionData( +- functionFragment: "withdrawBalance", +- values?: undefined +- ): string; +- +- decodeFunctionResult(functionFragment: "disburse", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "renounceOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "totalDisbursements", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "transferOwnership", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "withdrawBalance", +- data: BytesLike +- ): Result; +- +- events: { +- "BalanceWithdrawn(address,uint256)": EventFragment; +- "DisbursementFailed(uint256,address,uint256)": EventFragment; +- "DisbursementSuccess(uint256,address,uint256)": EventFragment; +- "OwnershipTransferred(address,address)": EventFragment; +- }; +- +- getEvent(nameOrSignatureOrTopic: "BalanceWithdrawn"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "DisbursementFailed"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "DisbursementSuccess"): EventFragment; +- getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +-} +- +-export type BalanceWithdrawnEvent = TypedEvent< +- [string, BigNumber], +- { owner: string; balance: BigNumber } +->; +- +-export type BalanceWithdrawnEventFilter = +- TypedEventFilter; +- +-export type DisbursementFailedEvent = TypedEvent< +- [BigNumber, string, BigNumber], +- { depositId: BigNumber; to: string; amount: BigNumber } +->; +- +-export type DisbursementFailedEventFilter = +- TypedEventFilter; +- +-export type DisbursementSuccessEvent = TypedEvent< +- [BigNumber, string, BigNumber], +- { depositId: BigNumber; to: string; amount: BigNumber } +->; +- +-export type DisbursementSuccessEventFilter = +- TypedEventFilter; +- +-export type OwnershipTransferredEvent = TypedEvent< +- [string, string], +- { previousOwner: string; newOwner: string } +->; +- +-export type OwnershipTransferredEventFilter = +- TypedEventFilter; +- +-export interface TeleportrDisburser extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: TeleportrDisburserInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- disburse( +- _nextDepositId: BigNumberish, +- _disbursements: DisbursementStruct[], +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- owner(overrides?: CallOverrides): Promise<[string]>; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDisbursements(overrides?: CallOverrides): Promise<[BigNumber]>; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- disburse( +- _nextDepositId: BigNumberish, +- _disbursements: DisbursementStruct[], +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDisbursements(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- disburse( +- _nextDepositId: BigNumberish, +- _disbursements: DisbursementStruct[], +- overrides?: CallOverrides +- ): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership(overrides?: CallOverrides): Promise; +- +- totalDisbursements(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: CallOverrides +- ): Promise; +- +- withdrawBalance(overrides?: CallOverrides): Promise; +- }; +- +- filters: { +- "BalanceWithdrawn(address,uint256)"( +- owner?: string | null, +- balance?: null +- ): BalanceWithdrawnEventFilter; +- BalanceWithdrawn( +- owner?: string | null, +- balance?: null +- ): BalanceWithdrawnEventFilter; +- +- "DisbursementFailed(uint256,address,uint256)"( +- depositId?: BigNumberish | null, +- to?: string | null, +- amount?: null +- ): DisbursementFailedEventFilter; +- DisbursementFailed( +- depositId?: BigNumberish | null, +- to?: string | null, +- amount?: null +- ): DisbursementFailedEventFilter; +- +- "DisbursementSuccess(uint256,address,uint256)"( +- depositId?: BigNumberish | null, +- to?: string | null, +- amount?: null +- ): DisbursementSuccessEventFilter; +- DisbursementSuccess( +- depositId?: BigNumberish | null, +- to?: string | null, +- amount?: null +- ): DisbursementSuccessEventFilter; +- +- "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null +- ): OwnershipTransferredEventFilter; +- }; +- +- estimateGas: { +- disburse( +- _nextDepositId: BigNumberish, +- _disbursements: DisbursementStruct[], +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDisbursements(overrides?: CallOverrides): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- disburse( +- _nextDepositId: BigNumberish, +- _disbursements: DisbursementStruct[], +- overrides?: PayableOverrides & { from?: string | Promise } +- ): Promise; +- +- owner(overrides?: CallOverrides): Promise; +- +- renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- totalDisbursements( +- overrides?: CallOverrides +- ): Promise; +- +- transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- withdrawBalance( +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibBuffer.ts b/node_modules/@eth-optimism/contracts/dist/types/TestLibBuffer.ts +deleted file mode 100644 +index cfb4838..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibBuffer.ts ++++ /dev/null +@@ -1,340 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export type BufferContextStruct = { +- length: BigNumberish; +- extraData: BytesLike; +-}; +- +-export type BufferContextStructOutput = [number, string] & { +- length: number; +- extraData: string; +-}; +- +-export interface TestLibBufferInterface extends ethers.utils.Interface { +- functions: { +- "deleteElementsAfterInclusive(uint40,bytes27)": FunctionFragment; +- "get(uint256)": FunctionFragment; +- "getContext()": FunctionFragment; +- "getExtraData()": FunctionFragment; +- "getLength()": FunctionFragment; +- "push(bytes32,bytes27)": FunctionFragment; +- "setContext(uint40,bytes27)": FunctionFragment; +- "setExtraData(bytes27)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "deleteElementsAfterInclusive", +- values: [BigNumberish, BytesLike] +- ): string; +- encodeFunctionData(functionFragment: "get", values: [BigNumberish]): string; +- encodeFunctionData( +- functionFragment: "getContext", +- values?: undefined +- ): string; +- encodeFunctionData( +- functionFragment: "getExtraData", +- values?: undefined +- ): string; +- encodeFunctionData(functionFragment: "getLength", values?: undefined): string; +- encodeFunctionData( +- functionFragment: "push", +- values: [BytesLike, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "setContext", +- values: [BigNumberish, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "setExtraData", +- values: [BytesLike] +- ): string; +- +- decodeFunctionResult( +- functionFragment: "deleteElementsAfterInclusive", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "getContext", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "getExtraData", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "getLength", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "push", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "setContext", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "setExtraData", +- data: BytesLike +- ): Result; +- +- events: {}; +-} +- +-export interface TestLibBuffer extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: TestLibBufferInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- "deleteElementsAfterInclusive(uint40,bytes27)"( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint40)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise<[string]>; +- +- getContext(overrides?: CallOverrides): Promise<[BufferContextStructOutput]>; +- +- getExtraData(overrides?: CallOverrides): Promise<[string]>; +- +- getLength(overrides?: CallOverrides): Promise<[number]>; +- +- "push(bytes32,bytes27)"( +- _value: BytesLike, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setContext( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setExtraData( +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- "deleteElementsAfterInclusive(uint40,bytes27)"( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint40)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getContext(overrides?: CallOverrides): Promise; +- +- getExtraData(overrides?: CallOverrides): Promise; +- +- getLength(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _value: BytesLike, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setContext( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setExtraData( +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- callStatic: { +- "deleteElementsAfterInclusive(uint40,bytes27)"( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- "deleteElementsAfterInclusive(uint40)"( +- _index: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getContext(overrides?: CallOverrides): Promise; +- +- getExtraData(overrides?: CallOverrides): Promise; +- +- getLength(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _value: BytesLike, +- _extraData: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- "push(bytes32)"( +- _value: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- setContext( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- setExtraData( +- _extraData: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- "deleteElementsAfterInclusive(uint40,bytes27)"( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint40)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; +- +- getContext(overrides?: CallOverrides): Promise; +- +- getExtraData(overrides?: CallOverrides): Promise; +- +- getLength(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _value: BytesLike, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setContext( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setExtraData( +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +- +- populateTransaction: { +- "deleteElementsAfterInclusive(uint40,bytes27)"( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "deleteElementsAfterInclusive(uint40)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- get( +- _index: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- getContext(overrides?: CallOverrides): Promise; +- +- getExtraData(overrides?: CallOverrides): Promise; +- +- getLength(overrides?: CallOverrides): Promise; +- +- "push(bytes32,bytes27)"( +- _value: BytesLike, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- "push(bytes32)"( +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setContext( +- _index: BigNumberish, +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- setExtraData( +- _extraData: BytesLike, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibBytesUtils.ts b/node_modules/@eth-optimism/contracts/dist/types/TestLibBytesUtils.ts +deleted file mode 100644 +index 74bd2c6..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibBytesUtils.ts ++++ /dev/null +@@ -1,316 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- Overrides, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface TestLibBytesUtilsInterface extends ethers.utils.Interface { +- functions: { +- "concat(bytes,bytes)": FunctionFragment; +- "equal(bytes,bytes)": FunctionFragment; +- "fromNibbles(bytes)": FunctionFragment; +- "slice(bytes,uint256,uint256)": FunctionFragment; +- "sliceWithTaintedMemory(bytes,uint256,uint256)": FunctionFragment; +- "toBytes32(bytes)": FunctionFragment; +- "toNibbles(bytes)": FunctionFragment; +- "toUint256(bytes)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "concat", +- values: [BytesLike, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "equal", +- values: [BytesLike, BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "fromNibbles", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "slice", +- values: [BytesLike, BigNumberish, BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "sliceWithTaintedMemory", +- values: [BytesLike, BigNumberish, BigNumberish] +- ): string; +- encodeFunctionData( +- functionFragment: "toBytes32", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "toNibbles", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "toUint256", +- values: [BytesLike] +- ): string; +- +- decodeFunctionResult(functionFragment: "concat", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "equal", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "fromNibbles", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "slice", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "sliceWithTaintedMemory", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "toBytes32", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "toNibbles", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "toUint256", data: BytesLike): Result; +- +- events: {}; +-} +- +-export interface TestLibBytesUtils extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: TestLibBytesUtilsInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- concat( +- _preBytes: BytesLike, +- _postBytes: BytesLike, +- overrides?: CallOverrides +- ): Promise<[string]>; +- +- equal( +- _bytes: BytesLike, +- _other: BytesLike, +- overrides?: CallOverrides +- ): Promise<[boolean]>; +- +- fromNibbles( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise<[string]>; +- +- slice( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise<[string]>; +- +- sliceWithTaintedMemory( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- toBytes32(_bytes: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- toNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- toUint256( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise<[BigNumber]>; +- }; +- +- concat( +- _preBytes: BytesLike, +- _postBytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- equal( +- _bytes: BytesLike, +- _other: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- fromNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- slice( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- sliceWithTaintedMemory( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- toBytes32(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toUint256(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- callStatic: { +- concat( +- _preBytes: BytesLike, +- _postBytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- equal( +- _bytes: BytesLike, +- _other: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- fromNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- slice( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- sliceWithTaintedMemory( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- toBytes32(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toUint256(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- concat( +- _preBytes: BytesLike, +- _postBytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- equal( +- _bytes: BytesLike, +- _other: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- fromNibbles( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- slice( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- sliceWithTaintedMemory( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- toBytes32(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toNibbles(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- +- toUint256(_bytes: BytesLike, overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- concat( +- _preBytes: BytesLike, +- _postBytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- equal( +- _bytes: BytesLike, +- _other: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- fromNibbles( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- slice( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: CallOverrides +- ): Promise; +- +- sliceWithTaintedMemory( +- _bytes: BytesLike, +- _start: BigNumberish, +- _length: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- toBytes32( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- toNibbles( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- toUint256( +- _bytes: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibRLPReader.ts b/node_modules/@eth-optimism/contracts/dist/types/TestLibRLPReader.ts +deleted file mode 100644 +index ebb6643..0000000 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibRLPReader.ts ++++ /dev/null +@@ -1,209 +0,0 @@ +-/* Autogenerated file. Do not edit manually. */ +-/* tslint:disable */ +-/* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +- CallOverrides, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +-import type { +- TypedEventFilter, +- TypedEvent, +- TypedListener, +- OnEvent, +-} from "./common"; +- +-export interface TestLibRLPReaderInterface extends ethers.utils.Interface { +- functions: { +- "readAddress(bytes)": FunctionFragment; +- "readBool(bytes)": FunctionFragment; +- "readBytes(bytes)": FunctionFragment; +- "readBytes32(bytes)": FunctionFragment; +- "readList(bytes)": FunctionFragment; +- "readString(bytes)": FunctionFragment; +- "readUint256(bytes)": FunctionFragment; +- }; +- +- encodeFunctionData( +- functionFragment: "readAddress", +- values: [BytesLike] +- ): string; +- encodeFunctionData(functionFragment: "readBool", values: [BytesLike]): string; +- encodeFunctionData( +- functionFragment: "readBytes", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "readBytes32", +- values: [BytesLike] +- ): string; +- encodeFunctionData(functionFragment: "readList", values: [BytesLike]): string; +- encodeFunctionData( +- functionFragment: "readString", +- values: [BytesLike] +- ): string; +- encodeFunctionData( +- functionFragment: "readUint256", +- values: [BytesLike] +- ): string; +- +- decodeFunctionResult( +- functionFragment: "readAddress", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "readBool", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "readBytes", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "readBytes32", +- data: BytesLike +- ): Result; +- decodeFunctionResult(functionFragment: "readList", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "readString", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "readUint256", +- data: BytesLike +- ): Result; +- +- events: {}; +-} +- +-export interface TestLibRLPReader extends BaseContract { +- connect(signerOrProvider: Signer | Provider | string): this; +- attach(addressOrName: string): this; +- deployed(): Promise; +- +- interface: TestLibRLPReaderInterface; +- +- queryFilter( +- event: TypedEventFilter, +- fromBlockOrBlockhash?: string | number | undefined, +- toBlock?: string | number | undefined +- ): Promise>; +- +- listeners( +- eventFilter?: TypedEventFilter +- ): Array>; +- listeners(eventName?: string): Array; +- removeAllListeners( +- eventFilter: TypedEventFilter +- ): this; +- removeAllListeners(eventName?: string): this; +- off: OnEvent; +- on: OnEvent; +- once: OnEvent; +- removeListener: OnEvent; +- +- functions: { +- readAddress(_in: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- readBool(_in: BytesLike, overrides?: CallOverrides): Promise<[boolean]>; +- +- readBytes(_in: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- readBytes32(_in: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- readList(_in: BytesLike, overrides?: CallOverrides): Promise<[string[]]>; +- +- readString(_in: BytesLike, overrides?: CallOverrides): Promise<[string]>; +- +- readUint256( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise<[BigNumber]>; +- }; +- +- readAddress(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBool(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes32(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readList(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readString(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readUint256(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- callStatic: { +- readAddress(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBool(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes32(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readList(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readString(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readUint256(_in: BytesLike, overrides?: CallOverrides): Promise; +- }; +- +- filters: {}; +- +- estimateGas: { +- readAddress(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBool(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readBytes32(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readList(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readString(_in: BytesLike, overrides?: CallOverrides): Promise; +- +- readUint256(_in: BytesLike, overrides?: CallOverrides): Promise; +- }; +- +- populateTransaction: { +- readAddress( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readBool( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readBytes( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readBytes32( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readList( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readString( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- +- readUint256( +- _in: BytesLike, +- overrides?: CallOverrides +- ): Promise; +- }; +-} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/common.ts b/node_modules/@eth-optimism/contracts/dist/types/common.ts +index 2fc40c7..4c90b08 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/common.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/common.ts +@@ -42,3 +42,5 @@ export type GetContractTypeFromFactory = F extends MinEthersFactory< + export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; ++ ++export type PromiseOrValue = T | Promise; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/index.ts +new file mode 100644 +index 0000000..1ceabd8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/index.ts +@@ -0,0 +1,11 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as messaging from "./messaging"; ++export type { messaging }; ++import type * as rollup from "./rollup"; ++export type { rollup }; ++import type * as token from "./token"; ++export type { token }; ++import type * as verification from "./verification"; ++export type { verification }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessenger.ts +new file mode 100644 +index 0000000..529fb7c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessenger.ts +@@ -0,0 +1,407 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export interface IL1CrossDomainMessengerInterface extends utils.Interface { ++ functions: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; ++ "sendMessage(address,bytes,uint32)": FunctionFragment; ++ "xDomainMessageSender()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "relayMessage" ++ | "replayMessage" ++ | "sendMessage" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "relayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "replayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "sendMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "xDomainMessageSender", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "relayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "replayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "sendMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "xDomainMessageSender", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "FailedRelayedMessage(bytes32)": EventFragment; ++ "RelayedMessage(bytes32)": EventFragment; ++ "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; ++} ++ ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} ++export type FailedRelayedMessageEvent = TypedEvent< ++ [string], ++ FailedRelayedMessageEventObject ++>; ++ ++export type FailedRelayedMessageEventFilter = ++ TypedEventFilter; ++ ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; ++ ++export type RelayedMessageEventFilter = TypedEventFilter; ++ ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} ++export type SentMessageEvent = TypedEvent< ++ [string, string, string, BigNumber, BigNumber], ++ SentMessageEventObject ++>; ++ ++export type SentMessageEventFilter = TypedEventFilter; ++ ++export interface IL1CrossDomainMessenger extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1CrossDomainMessengerInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "FailedRelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ FailedRelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ ++ "RelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ ++ "SentMessage(address,address,bytes,uint256,uint256)"( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ SentMessage( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ }; ++ ++ estimateGas: { ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessengerFast.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessengerFast.ts +new file mode 100644 +index 0000000..2573c11 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1CrossDomainMessengerFast.ts +@@ -0,0 +1,480 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export interface IL1CrossDomainMessengerFastInterface extends utils.Interface { ++ functions: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)": FunctionFragment; ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; ++ "sendMessage(address,bytes,uint32)": FunctionFragment; ++ "xDomainMessageSender()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)" ++ | "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))" ++ | "replayMessage" ++ | "sendMessage" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "replayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "sendMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "xDomainMessageSender", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "replayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "sendMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "xDomainMessageSender", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "FailedRelayedMessage(bytes32)": EventFragment; ++ "RelayedMessage(bytes32)": EventFragment; ++ "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; ++} ++ ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} ++export type FailedRelayedMessageEvent = TypedEvent< ++ [string], ++ FailedRelayedMessageEventObject ++>; ++ ++export type FailedRelayedMessageEventFilter = ++ TypedEventFilter; ++ ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; ++ ++export type RelayedMessageEventFilter = TypedEventFilter; ++ ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} ++export type SentMessageEvent = TypedEvent< ++ [string, string, string, BigNumber, BigNumber], ++ SentMessageEventObject ++>; ++ ++export type SentMessageEventFilter = TypedEventFilter; ++ ++export interface IL1CrossDomainMessengerFast extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1CrossDomainMessengerFastInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "FailedRelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ FailedRelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ ++ "RelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ ++ "SentMessage(address,address,bytes,uint256,uint256)"( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ SentMessage( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ }; ++ ++ estimateGas: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1DepositHash.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1DepositHash.ts +new file mode 100644 +index 0000000..2988d94 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1DepositHash.ts +@@ -0,0 +1,157 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IL1DepositHashInterface extends utils.Interface { ++ functions: { ++ "currentDepositInfoHash()": FunctionFragment; ++ "lastHashUpdateBlock()": FunctionFragment; ++ "priorDepositInfoHash()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "currentDepositInfoHash" ++ | "lastHashUpdateBlock" ++ | "priorDepositInfoHash" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "currentDepositInfoHash", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "lastHashUpdateBlock", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "priorDepositInfoHash", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "currentDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "lastHashUpdateBlock", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "priorDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface IL1DepositHash extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1DepositHashInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ currentDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ currentDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ currentDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ currentDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1ERC20Bridge.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1ERC20Bridge.ts +new file mode 100644 +index 0000000..dea932a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1ERC20Bridge.ts +@@ -0,0 +1,373 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IL1ERC20BridgeInterface extends utils.Interface { ++ functions: { ++ "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; ++ "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "l2TokenBridge()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "depositERC20" ++ | "depositERC20To" ++ | "finalizeERC20Withdrawal" ++ | "l2TokenBridge" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "depositERC20", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20To", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeERC20Withdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2TokenBridge", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "depositERC20", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20To", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeERC20Withdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l2TokenBridge", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; ++} ++ ++export interface ERC20DepositInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20DepositInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20DepositInitiatedEventObject ++>; ++ ++export type ERC20DepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ERC20WithdrawalFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20WithdrawalFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20WithdrawalFinalizedEventObject ++>; ++ ++export type ERC20WithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface IL1ERC20Bridge extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1ERC20BridgeInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ERC20DepositInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ERC20WithdrawalFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ }; ++ ++ estimateGas: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridge.ts +new file mode 100644 +index 0000000..e723a8c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridge.ts +@@ -0,0 +1,573 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PayableOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IL1StandardBridgeInterface extends utils.Interface { ++ functions: { ++ "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositETH(uint32,bytes)": FunctionFragment; ++ "depositETHTo(address,uint32,bytes)": FunctionFragment; ++ "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "finalizeETHWithdrawal(address,address,uint256,bytes)": FunctionFragment; ++ "l2TokenBridge()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "depositERC20" ++ | "depositERC20To" ++ | "depositETH" ++ | "depositETHTo" ++ | "finalizeERC20Withdrawal" ++ | "finalizeETHWithdrawal" ++ | "l2TokenBridge" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "depositERC20", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20To", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositETH", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositETHTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeERC20Withdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeETHWithdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2TokenBridge", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "depositERC20", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20To", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "depositETHTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeERC20Withdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeETHWithdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l2TokenBridge", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "ETHDepositInitiated(address,address,uint256,bytes)": EventFragment; ++ "ETHWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ETHDepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ETHWithdrawalFinalized"): EventFragment; ++} ++ ++export interface ERC20DepositInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20DepositInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20DepositInitiatedEventObject ++>; ++ ++export type ERC20DepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ERC20WithdrawalFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20WithdrawalFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20WithdrawalFinalizedEventObject ++>; ++ ++export type ERC20WithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface ETHDepositInitiatedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ETHDepositInitiatedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ ETHDepositInitiatedEventObject ++>; ++ ++export type ETHDepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ETHWithdrawalFinalizedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ETHWithdrawalFinalizedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ ETHWithdrawalFinalizedEventObject ++>; ++ ++export type ETHWithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface IL1StandardBridge extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1StandardBridgeInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ERC20DepositInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ERC20WithdrawalFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ++ "ETHDepositInitiated(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHDepositInitiatedEventFilter; ++ ETHDepositInitiated( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHDepositInitiatedEventFilter; ++ ++ "ETHWithdrawalFinalized(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHWithdrawalFinalizedEventFilter; ++ ETHWithdrawalFinalized( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHWithdrawalFinalizedEventFilter; ++ }; ++ ++ estimateGas: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridgeAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridgeAltL1.ts +new file mode 100644 +index 0000000..7d719a8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/IL1StandardBridgeAltL1.ts +@@ -0,0 +1,580 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PayableOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IL1StandardBridgeAltL1Interface extends utils.Interface { ++ functions: { ++ "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositNativeToken(uint32,bytes)": FunctionFragment; ++ "depositNativeTokenTo(address,uint32,bytes)": FunctionFragment; ++ "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "finalizeNativeTokenWithdrawal(address,address,uint256,bytes)": FunctionFragment; ++ "l2TokenBridge()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "depositERC20" ++ | "depositERC20To" ++ | "depositNativeToken" ++ | "depositNativeTokenTo" ++ | "finalizeERC20Withdrawal" ++ | "finalizeNativeTokenWithdrawal" ++ | "l2TokenBridge" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "depositERC20", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20To", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositNativeToken", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositNativeTokenTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeERC20Withdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeNativeTokenWithdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2TokenBridge", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "depositERC20", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20To", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositNativeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositNativeTokenTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeERC20Withdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeNativeTokenWithdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l2TokenBridge", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "NativeTokenDepositInitiated(address,address,uint256,bytes)": EventFragment; ++ "NativeTokenWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "NativeTokenDepositInitiated" ++ ): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "NativeTokenWithdrawalFinalized" ++ ): EventFragment; ++} ++ ++export interface ERC20DepositInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20DepositInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20DepositInitiatedEventObject ++>; ++ ++export type ERC20DepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ERC20WithdrawalFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20WithdrawalFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20WithdrawalFinalizedEventObject ++>; ++ ++export type ERC20WithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface NativeTokenDepositInitiatedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type NativeTokenDepositInitiatedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ NativeTokenDepositInitiatedEventObject ++>; ++ ++export type NativeTokenDepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface NativeTokenWithdrawalFinalizedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type NativeTokenWithdrawalFinalizedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ NativeTokenWithdrawalFinalizedEventObject ++>; ++ ++export type NativeTokenWithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface IL1StandardBridgeAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL1StandardBridgeAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ERC20DepositInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ERC20WithdrawalFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ++ "NativeTokenDepositInitiated(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenDepositInitiatedEventFilter; ++ NativeTokenDepositInitiated( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenDepositInitiatedEventFilter; ++ ++ "NativeTokenWithdrawalFinalized(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenWithdrawalFinalizedEventFilter; ++ NativeTokenWithdrawalFinalized( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenWithdrawalFinalizedEventFilter; ++ }; ++ ++ estimateGas: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessenger.ts +new file mode 100644 +index 0000000..9d581da +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessenger.ts +@@ -0,0 +1,921 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export interface L1CrossDomainMessengerInterface extends utils.Interface { ++ functions: { ++ "allowMessage(bytes32)": FunctionFragment; ++ "blockMessage(bytes32)": FunctionFragment; ++ "blockedMessages(bytes32)": FunctionFragment; ++ "failedMessages(bytes32)": FunctionFragment; ++ "initialize(address)": FunctionFragment; ++ "libAddressManager()": FunctionFragment; ++ "owner()": FunctionFragment; ++ "pause()": FunctionFragment; ++ "paused()": FunctionFragment; ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; ++ "relayedMessages(bytes32)": FunctionFragment; ++ "renounceOwnership()": FunctionFragment; ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; ++ "resolve(string)": FunctionFragment; ++ "sendMessage(address,bytes,uint32)": FunctionFragment; ++ "successfulMessages(bytes32)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "unpause()": FunctionFragment; ++ "xDomainMessageSender()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowMessage" ++ | "blockMessage" ++ | "blockedMessages" ++ | "failedMessages" ++ | "initialize" ++ | "libAddressManager" ++ | "owner" ++ | "pause" ++ | "paused" ++ | "relayMessage" ++ | "relayedMessages" ++ | "renounceOwnership" ++ | "replayMessage" ++ | "resolve" ++ | "sendMessage" ++ | "successfulMessages" ++ | "transferOwnership" ++ | "unpause" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "allowMessage", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "blockMessage", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "blockedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "failedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "libAddressManager", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData(functionFragment: "pause", values?: undefined): string; ++ encodeFunctionData(functionFragment: "paused", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "relayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "relayedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "renounceOwnership", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "replayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "sendMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "successfulMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "unpause", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "xDomainMessageSender", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "allowMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "blockMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "blockedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "failedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "libAddressManager", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "relayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "relayedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "renounceOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "replayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "sendMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "successfulMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "xDomainMessageSender", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "FailedRelayedMessage(bytes32)": EventFragment; ++ "MessageAllowed(bytes32)": EventFragment; ++ "MessageBlocked(bytes32)": EventFragment; ++ "OwnershipTransferred(address,address)": EventFragment; ++ "Paused(address)": EventFragment; ++ "RelayedMessage(bytes32)": EventFragment; ++ "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; ++ "Unpaused(address)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "MessageAllowed"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "MessageBlocked"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; ++} ++ ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} ++export type FailedRelayedMessageEvent = TypedEvent< ++ [string], ++ FailedRelayedMessageEventObject ++>; ++ ++export type FailedRelayedMessageEventFilter = ++ TypedEventFilter; ++ ++export interface MessageAllowedEventObject { ++ _xDomainCalldataHash: string; ++} ++export type MessageAllowedEvent = TypedEvent< ++ [string], ++ MessageAllowedEventObject ++>; ++ ++export type MessageAllowedEventFilter = TypedEventFilter; ++ ++export interface MessageBlockedEventObject { ++ _xDomainCalldataHash: string; ++} ++export type MessageBlockedEvent = TypedEvent< ++ [string], ++ MessageBlockedEventObject ++>; ++ ++export type MessageBlockedEventFilter = TypedEventFilter; ++ ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} ++export type OwnershipTransferredEvent = TypedEvent< ++ [string, string], ++ OwnershipTransferredEventObject ++>; ++ ++export type OwnershipTransferredEventFilter = ++ TypedEventFilter; ++ ++export interface PausedEventObject { ++ account: string; ++} ++export type PausedEvent = TypedEvent<[string], PausedEventObject>; ++ ++export type PausedEventFilter = TypedEventFilter; ++ ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; ++ ++export type RelayedMessageEventFilter = TypedEventFilter; ++ ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} ++export type SentMessageEvent = TypedEvent< ++ [string, string, string, BigNumber, BigNumber], ++ SentMessageEventObject ++>; ++ ++export type SentMessageEventFilter = TypedEventFilter; ++ ++export interface UnpausedEventObject { ++ account: string; ++} ++export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; ++ ++export type UnpausedEventFilter = TypedEventFilter; ++ ++export interface L1CrossDomainMessenger extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1CrossDomainMessengerInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise<[string]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise<[boolean]>; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause(overrides?: CallOverrides): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership(overrides?: CallOverrides): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ unpause(overrides?: CallOverrides): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "FailedRelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ FailedRelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ ++ "MessageAllowed(bytes32)"( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageAllowedEventFilter; ++ MessageAllowed( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageAllowedEventFilter; ++ ++ "MessageBlocked(bytes32)"( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageBlockedEventFilter; ++ MessageBlocked( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageBlockedEventFilter; ++ ++ "OwnershipTransferred(address,address)"( ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null ++ ): OwnershipTransferredEventFilter; ++ OwnershipTransferred( ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null ++ ): OwnershipTransferredEventFilter; ++ ++ "Paused(address)"(account?: null): PausedEventFilter; ++ Paused(account?: null): PausedEventFilter; ++ ++ "RelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ ++ "SentMessage(address,address,bytes,uint256,uint256)"( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ SentMessage( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ ++ "Unpaused(address)"(account?: null): UnpausedEventFilter; ++ Unpaused(account?: null): UnpausedEventFilter; ++ }; ++ ++ estimateGas: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ relayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessengerFast.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessengerFast.ts +new file mode 100644 +index 0000000..151576c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1CrossDomainMessengerFast.ts +@@ -0,0 +1,994 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export interface L1CrossDomainMessengerFastInterface extends utils.Interface { ++ functions: { ++ "allowMessage(bytes32)": FunctionFragment; ++ "blockMessage(bytes32)": FunctionFragment; ++ "blockedMessages(bytes32)": FunctionFragment; ++ "failedMessages(bytes32)": FunctionFragment; ++ "initialize(address)": FunctionFragment; ++ "libAddressManager()": FunctionFragment; ++ "owner()": FunctionFragment; ++ "pause()": FunctionFragment; ++ "paused()": FunctionFragment; ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)": FunctionFragment; ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))": FunctionFragment; ++ "relayedMessages(bytes32)": FunctionFragment; ++ "renounceOwnership()": FunctionFragment; ++ "replayMessage(address,address,bytes,uint256,uint32,uint32)": FunctionFragment; ++ "resolve(string)": FunctionFragment; ++ "sendMessage(address,bytes,uint32)": FunctionFragment; ++ "successfulMessages(bytes32)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "unpause()": FunctionFragment; ++ "xDomainMessageSender()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowMessage" ++ | "blockMessage" ++ | "blockedMessages" ++ | "failedMessages" ++ | "initialize" ++ | "libAddressManager" ++ | "owner" ++ | "pause" ++ | "paused" ++ | "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)" ++ | "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))" ++ | "relayedMessages" ++ | "renounceOwnership" ++ | "replayMessage" ++ | "resolve" ++ | "sendMessage" ++ | "successfulMessages" ++ | "transferOwnership" ++ | "unpause" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "allowMessage", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "blockMessage", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "blockedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "failedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "libAddressManager", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData(functionFragment: "pause", values?: undefined): string; ++ encodeFunctionData(functionFragment: "paused", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStruct ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "relayedMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "renounceOwnership", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "replayMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "sendMessage", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "successfulMessages", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "unpause", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "xDomainMessageSender", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "allowMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "blockMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "blockedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "failedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "libAddressManager", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "relayedMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "renounceOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "replayMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "sendMessage", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "successfulMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "xDomainMessageSender", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "FailedRelayedMessage(bytes32)": EventFragment; ++ "MessageAllowed(bytes32)": EventFragment; ++ "MessageBlocked(bytes32)": EventFragment; ++ "OwnershipTransferred(address,address)": EventFragment; ++ "Paused(address)": EventFragment; ++ "RelayedMessage(bytes32)": EventFragment; ++ "SentMessage(address,address,bytes,uint256,uint256)": EventFragment; ++ "Unpaused(address)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "FailedRelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "MessageAllowed"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "MessageBlocked"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "RelayedMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; ++} ++ ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} ++export type FailedRelayedMessageEvent = TypedEvent< ++ [string], ++ FailedRelayedMessageEventObject ++>; ++ ++export type FailedRelayedMessageEventFilter = ++ TypedEventFilter; ++ ++export interface MessageAllowedEventObject { ++ _xDomainCalldataHash: string; ++} ++export type MessageAllowedEvent = TypedEvent< ++ [string], ++ MessageAllowedEventObject ++>; ++ ++export type MessageAllowedEventFilter = TypedEventFilter; ++ ++export interface MessageBlockedEventObject { ++ _xDomainCalldataHash: string; ++} ++export type MessageBlockedEvent = TypedEvent< ++ [string], ++ MessageBlockedEventObject ++>; ++ ++export type MessageBlockedEventFilter = TypedEventFilter; ++ ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} ++export type OwnershipTransferredEvent = TypedEvent< ++ [string, string], ++ OwnershipTransferredEventObject ++>; ++ ++export type OwnershipTransferredEventFilter = ++ TypedEventFilter; ++ ++export interface PausedEventObject { ++ account: string; ++} ++export type PausedEvent = TypedEvent<[string], PausedEventObject>; ++ ++export type PausedEventFilter = TypedEventFilter; ++ ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; ++ ++export type RelayedMessageEventFilter = TypedEventFilter; ++ ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} ++export type SentMessageEvent = TypedEvent< ++ [string, string, string, BigNumber, BigNumber], ++ SentMessageEventObject ++>; ++ ++export type SentMessageEventFilter = TypedEventFilter; ++ ++export interface UnpausedEventObject { ++ account: string; ++} ++export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; ++ ++export type UnpausedEventFilter = TypedEventFilter; ++ ++export interface L1CrossDomainMessengerFast extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1CrossDomainMessengerFastInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise<[string]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise<[boolean]>; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause(overrides?: CallOverrides): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership(overrides?: CallOverrides): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ unpause(overrides?: CallOverrides): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "FailedRelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ FailedRelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): FailedRelayedMessageEventFilter; ++ ++ "MessageAllowed(bytes32)"( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageAllowedEventFilter; ++ MessageAllowed( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageAllowedEventFilter; ++ ++ "MessageBlocked(bytes32)"( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageBlockedEventFilter; ++ MessageBlocked( ++ _xDomainCalldataHash?: PromiseOrValue | null ++ ): MessageBlockedEventFilter; ++ ++ "OwnershipTransferred(address,address)"( ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null ++ ): OwnershipTransferredEventFilter; ++ OwnershipTransferred( ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null ++ ): OwnershipTransferredEventFilter; ++ ++ "Paused(address)"(account?: null): PausedEventFilter; ++ Paused(account?: null): PausedEventFilter; ++ ++ "RelayedMessage(bytes32)"( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ ++ "SentMessage(address,address,bytes,uint256,uint256)"( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ SentMessage( ++ target?: PromiseOrValue | null, ++ sender?: null, ++ message?: null, ++ messageNonce?: null, ++ gasLimit?: null ++ ): SentMessageEventFilter; ++ ++ "Unpaused(address)"(account?: null): UnpausedEventFilter; ++ Unpaused(account?: null): UnpausedEventFilter; ++ }; ++ ++ estimateGas: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ allowMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockMessage( ++ _xDomainCalldataHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ blockedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ failedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ pause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ paused(overrides?: CallOverrides): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes),bytes32,bytes32)"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))"( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ _proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ renounceOwnership( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ replayMessage( ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _queueIndex: PromiseOrValue, ++ _oldGasLimit: PromiseOrValue, ++ _newGasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sendMessage( ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ successfulMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ unpause( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ xDomainMessageSender( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayer.ts +new file mode 100644 +index 0000000..c5376d4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayer.ts +@@ -0,0 +1,243 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export declare namespace L1MultiMessageRelayer { ++ export type L2ToL1MessageStruct = { ++ target: PromiseOrValue; ++ sender: PromiseOrValue; ++ message: PromiseOrValue; ++ messageNonce: PromiseOrValue; ++ proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct; ++ }; ++ ++ export type L2ToL1MessageStructOutput = [ ++ string, ++ string, ++ string, ++ BigNumber, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStructOutput ++ ] & { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ proof: IL1CrossDomainMessenger.L2MessageInclusionProofStructOutput; ++ }; ++} ++ ++export interface L1MultiMessageRelayerInterface extends utils.Interface { ++ functions: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": FunctionFragment; ++ "libAddressManager()": FunctionFragment; ++ "resolve(string)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "batchRelayMessages" ++ | "libAddressManager" ++ | "resolve" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "batchRelayMessages", ++ values: [L1MultiMessageRelayer.L2ToL1MessageStruct[]] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "libAddressManager", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "batchRelayMessages", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "libAddressManager", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface L1MultiMessageRelayer extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1MultiMessageRelayerInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ batchRelayMessages( ++ _messages: L1MultiMessageRelayer.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise<[string]>; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ }; ++ ++ batchRelayMessages( ++ _messages: L1MultiMessageRelayer.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ callStatic: { ++ batchRelayMessages( ++ _messages: L1MultiMessageRelayer.L2ToL1MessageStruct[], ++ overrides?: CallOverrides ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ batchRelayMessages( ++ _messages: L1MultiMessageRelayer.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ batchRelayMessages( ++ _messages: L1MultiMessageRelayer.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayerFast.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayerFast.ts +new file mode 100644 +index 0000000..a413fb5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1MultiMessageRelayerFast.ts +@@ -0,0 +1,292 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; ++ ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; ++ ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export declare namespace IL1CrossDomainMessenger { ++ export type L2MessageInclusionProofStruct = { ++ stateRoot: PromiseOrValue; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStruct; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStruct; ++ stateTrieWitness: PromiseOrValue; ++ storageTrieWitness: PromiseOrValue; ++ }; ++ ++ export type L2MessageInclusionProofStructOutput = [ ++ string, ++ Lib_OVMCodec.ChainBatchHeaderStructOutput, ++ Lib_OVMCodec.ChainInclusionProofStructOutput, ++ string, ++ string ++ ] & { ++ stateRoot: string; ++ stateRootBatchHeader: Lib_OVMCodec.ChainBatchHeaderStructOutput; ++ stateRootProof: Lib_OVMCodec.ChainInclusionProofStructOutput; ++ stateTrieWitness: string; ++ storageTrieWitness: string; ++ }; ++} ++ ++export declare namespace L1MultiMessageRelayerFast { ++ export type L2ToL1MessageStruct = { ++ target: PromiseOrValue; ++ sender: PromiseOrValue; ++ message: PromiseOrValue; ++ messageNonce: PromiseOrValue; ++ proof: IL1CrossDomainMessenger.L2MessageInclusionProofStruct; ++ }; ++ ++ export type L2ToL1MessageStructOutput = [ ++ string, ++ string, ++ string, ++ BigNumber, ++ IL1CrossDomainMessenger.L2MessageInclusionProofStructOutput ++ ] & { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ proof: IL1CrossDomainMessenger.L2MessageInclusionProofStructOutput; ++ }; ++} ++ ++export interface L1MultiMessageRelayerFastInterface extends utils.Interface { ++ functions: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])": FunctionFragment; ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)": FunctionFragment; ++ "libAddressManager()": FunctionFragment; ++ "resolve(string)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])" ++ | "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)" ++ | "libAddressManager" ++ | "resolve" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])", ++ values: [L1MultiMessageRelayerFast.L2ToL1MessageStruct[]] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)", ++ values: [ ++ L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "libAddressManager", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "libAddressManager", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface L1MultiMessageRelayerFast extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1MultiMessageRelayerFastInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise<[string]>; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ }; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ callStatic: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[],bytes32,bytes32)"( ++ _messages: L1MultiMessageRelayerFast.L2ToL1MessageStruct[], ++ _standardBridgeDepositHash: PromiseOrValue, ++ _lpDepositHash: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ libAddressManager(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridge.ts +new file mode 100644 +index 0000000..d68222f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridge.ts +@@ -0,0 +1,741 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PayableOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface L1StandardBridgeInterface extends utils.Interface { ++ functions: { ++ "currentDepositInfoHash()": FunctionFragment; ++ "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositETH(uint32,bytes)": FunctionFragment; ++ "depositETHTo(address,uint32,bytes)": FunctionFragment; ++ "deposits(address,address)": FunctionFragment; ++ "donateETH()": FunctionFragment; ++ "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "finalizeETHWithdrawal(address,address,uint256,bytes)": FunctionFragment; ++ "initialize(address,address)": FunctionFragment; ++ "l2TokenBridge()": FunctionFragment; ++ "lastHashUpdateBlock()": FunctionFragment; ++ "messenger()": FunctionFragment; ++ "priorDepositInfoHash()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "currentDepositInfoHash" ++ | "depositERC20" ++ | "depositERC20To" ++ | "depositETH" ++ | "depositETHTo" ++ | "deposits" ++ | "donateETH" ++ | "finalizeERC20Withdrawal" ++ | "finalizeETHWithdrawal" ++ | "initialize" ++ | "l2TokenBridge" ++ | "lastHashUpdateBlock" ++ | "messenger" ++ | "priorDepositInfoHash" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "currentDepositInfoHash", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20To", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositETH", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositETHTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "deposits", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "donateETH", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "finalizeERC20Withdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeETHWithdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2TokenBridge", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "lastHashUpdateBlock", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "messenger", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "priorDepositInfoHash", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "currentDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20To", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "depositETHTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "deposits", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "donateETH", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeERC20Withdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeETHWithdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "l2TokenBridge", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "lastHashUpdateBlock", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "priorDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "ETHDepositInitiated(address,address,uint256,bytes)": EventFragment; ++ "ETHWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ETHDepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ETHWithdrawalFinalized"): EventFragment; ++} ++ ++export interface ERC20DepositInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20DepositInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20DepositInitiatedEventObject ++>; ++ ++export type ERC20DepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ERC20WithdrawalFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20WithdrawalFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20WithdrawalFinalizedEventObject ++>; ++ ++export type ERC20WithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface ETHDepositInitiatedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ETHDepositInitiatedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ ETHDepositInitiatedEventObject ++>; ++ ++export type ETHDepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ETHWithdrawalFinalizedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ETHWithdrawalFinalizedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ ETHWithdrawalFinalizedEventObject ++>; ++ ++export type ETHWithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface L1StandardBridge extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1StandardBridgeInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise<[string]>; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ donateETH( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ messenger(overrides?: CallOverrides): Promise<[string]>; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateETH( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateETH(overrides?: CallOverrides): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ERC20DepositInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ERC20WithdrawalFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ++ "ETHDepositInitiated(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHDepositInitiatedEventFilter; ++ ETHDepositInitiated( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHDepositInitiatedEventFilter; ++ ++ "ETHWithdrawalFinalized(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHWithdrawalFinalizedEventFilter; ++ ETHWithdrawalFinalized( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): ETHWithdrawalFinalizedEventFilter; ++ }; ++ ++ estimateGas: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateETH( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ currentDepositInfoHash( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETH( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositETHTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateETH( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeETHWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridgeAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridgeAltL1.ts +new file mode 100644 +index 0000000..aa5861c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/L1StandardBridgeAltL1.ts +@@ -0,0 +1,754 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PayableOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface L1StandardBridgeAltL1Interface extends utils.Interface { ++ functions: { ++ "currentDepositInfoHash()": FunctionFragment; ++ "depositERC20(address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositERC20To(address,address,address,uint256,uint32,bytes)": FunctionFragment; ++ "depositNativeToken(uint32,bytes)": FunctionFragment; ++ "depositNativeTokenTo(address,uint32,bytes)": FunctionFragment; ++ "deposits(address,address)": FunctionFragment; ++ "donateNativeToken()": FunctionFragment; ++ "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "finalizeNativeTokenWithdrawal(address,address,uint256,bytes)": FunctionFragment; ++ "initialize(address,address)": FunctionFragment; ++ "l2TokenBridge()": FunctionFragment; ++ "lastHashUpdateBlock()": FunctionFragment; ++ "messenger()": FunctionFragment; ++ "priorDepositInfoHash()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "currentDepositInfoHash" ++ | "depositERC20" ++ | "depositERC20To" ++ | "depositNativeToken" ++ | "depositNativeTokenTo" ++ | "deposits" ++ | "donateNativeToken" ++ | "finalizeERC20Withdrawal" ++ | "finalizeNativeTokenWithdrawal" ++ | "initialize" ++ | "l2TokenBridge" ++ | "lastHashUpdateBlock" ++ | "messenger" ++ | "priorDepositInfoHash" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "currentDepositInfoHash", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositERC20To", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositNativeToken", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "depositNativeTokenTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "deposits", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "donateNativeToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeERC20Withdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "finalizeNativeTokenWithdrawal", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2TokenBridge", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "lastHashUpdateBlock", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "messenger", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "priorDepositInfoHash", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "currentDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositERC20To", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositNativeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "depositNativeTokenTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "deposits", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "donateNativeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeERC20Withdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "finalizeNativeTokenWithdrawal", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "l2TokenBridge", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "lastHashUpdateBlock", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "priorDepositInfoHash", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "NativeTokenDepositInitiated(address,address,uint256,bytes)": EventFragment; ++ "NativeTokenWithdrawalFinalized(address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "ERC20DepositInitiated"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "ERC20WithdrawalFinalized"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "NativeTokenDepositInitiated" ++ ): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "NativeTokenWithdrawalFinalized" ++ ): EventFragment; ++} ++ ++export interface ERC20DepositInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20DepositInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20DepositInitiatedEventObject ++>; ++ ++export type ERC20DepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface ERC20WithdrawalFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type ERC20WithdrawalFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ ERC20WithdrawalFinalizedEventObject ++>; ++ ++export type ERC20WithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface NativeTokenDepositInitiatedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type NativeTokenDepositInitiatedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ NativeTokenDepositInitiatedEventObject ++>; ++ ++export type NativeTokenDepositInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface NativeTokenWithdrawalFinalizedEventObject { ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type NativeTokenWithdrawalFinalizedEvent = TypedEvent< ++ [string, string, BigNumber, string], ++ NativeTokenWithdrawalFinalizedEventObject ++>; ++ ++export type NativeTokenWithdrawalFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface L1StandardBridgeAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L1StandardBridgeAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise<[string]>; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ donateNativeToken( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ messenger(overrides?: CallOverrides): Promise<[string]>; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise<[string]>; ++ }; ++ ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateNativeToken( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ callStatic: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateNativeToken(overrides?: CallOverrides): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "ERC20DepositInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ERC20DepositInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20DepositInitiatedEventFilter; ++ ++ "ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ERC20WithdrawalFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): ERC20WithdrawalFinalizedEventFilter; ++ ++ "NativeTokenDepositInitiated(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenDepositInitiatedEventFilter; ++ NativeTokenDepositInitiated( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenDepositInitiatedEventFilter; ++ ++ "NativeTokenWithdrawalFinalized(address,address,uint256,bytes)"( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenWithdrawalFinalizedEventFilter; ++ NativeTokenWithdrawalFinalized( ++ _from?: PromiseOrValue | null, ++ _to?: PromiseOrValue | null, ++ _amount?: null, ++ _data?: null ++ ): NativeTokenWithdrawalFinalizedEventFilter; ++ }; ++ ++ estimateGas: { ++ currentDepositInfoHash(overrides?: CallOverrides): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateNativeToken( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash(overrides?: CallOverrides): Promise; ++ }; ++ ++ populateTransaction: { ++ currentDepositInfoHash( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ depositERC20( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositERC20To( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeToken( ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ depositNativeTokenTo( ++ _to: PromiseOrValue, ++ _l2Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ deposits( ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ donateNativeToken( ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeERC20Withdrawal( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ finalizeNativeTokenWithdrawal( ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ initialize( ++ _l1messenger: PromiseOrValue, ++ _l2TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2TokenBridge(overrides?: CallOverrides): Promise; ++ ++ lastHashUpdateBlock( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ priorDepositInfoHash( ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/index.ts +new file mode 100644 +index 0000000..537d3f9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/messaging/index.ts +@@ -0,0 +1,15 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IL1CrossDomainMessenger } from "./IL1CrossDomainMessenger"; ++export type { IL1CrossDomainMessengerFast } from "./IL1CrossDomainMessengerFast"; ++export type { IL1DepositHash } from "./IL1DepositHash"; ++export type { IL1ERC20Bridge } from "./IL1ERC20Bridge"; ++export type { IL1StandardBridge } from "./IL1StandardBridge"; ++export type { IL1StandardBridgeAltL1 } from "./IL1StandardBridgeAltL1"; ++export type { L1CrossDomainMessenger } from "./L1CrossDomainMessenger"; ++export type { L1CrossDomainMessengerFast } from "./L1CrossDomainMessengerFast"; ++export type { L1MultiMessageRelayer } from "./L1MultiMessageRelayer"; ++export type { L1MultiMessageRelayerFast } from "./L1MultiMessageRelayerFast"; ++export type { L1StandardBridge } from "./L1StandardBridge"; ++export type { L1StandardBridgeAltL1 } from "./L1StandardBridgeAltL1"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/CanonicalTransactionChain.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/CanonicalTransactionChain.ts +similarity index 72% +rename from node_modules/@eth-optimism/contracts/dist/types/CanonicalTransactionChain.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/CanonicalTransactionChain.ts +index 01788d2..64d632b 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/CanonicalTransactionChain.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/CanonicalTransactionChain.ts +@@ -1,43 +1,47 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; +- +-export type QueueElementStruct = { +- transactionHash: BytesLike; +- timestamp: BigNumberish; +- blockNumber: BigNumberish; +-}; +- +-export type QueueElementStructOutput = [string, number, number] & { +- transactionHash: string; +- timestamp: number; +- blockNumber: number; +-}; +- +-export interface CanonicalTransactionChainInterface +- extends ethers.utils.Interface { ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type QueueElementStruct = { ++ transactionHash: PromiseOrValue; ++ timestamp: PromiseOrValue; ++ blockNumber: PromiseOrValue; ++ }; ++ ++ export type QueueElementStructOutput = [string, number, number] & { ++ transactionHash: string; ++ timestamp: number; ++ blockNumber: number; ++ }; ++} ++ ++export interface CanonicalTransactionChainInterface extends utils.Interface { + functions: { + "MAX_ROLLUP_TX_SIZE()": FunctionFragment; + "MIN_ROLLUP_TX_GAS()": FunctionFragment; +@@ -57,10 +61,36 @@ export interface CanonicalTransactionChainInterface + "l2GasDiscountDivisor()": FunctionFragment; + "libAddressManager()": FunctionFragment; + "maxTransactionGasLimit()": FunctionFragment; ++ "queue()": FunctionFragment; + "resolve(string)": FunctionFragment; + "setGasParams(uint256,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "MAX_ROLLUP_TX_SIZE" ++ | "MIN_ROLLUP_TX_GAS" ++ | "appendSequencerBatch" ++ | "batches" ++ | "enqueue" ++ | "enqueueGasCost" ++ | "enqueueL2GasPrepaid" ++ | "getLastBlockNumber" ++ | "getLastTimestamp" ++ | "getNextQueueIndex" ++ | "getNumPendingQueueElements" ++ | "getQueueElement" ++ | "getQueueLength" ++ | "getTotalBatches" ++ | "getTotalElements" ++ | "l2GasDiscountDivisor" ++ | "libAddressManager" ++ | "maxTransactionGasLimit" ++ | "queue" ++ | "resolve" ++ | "setGasParams" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "MAX_ROLLUP_TX_SIZE", + values?: undefined +@@ -76,7 +106,11 @@ export interface CanonicalTransactionChainInterface + encodeFunctionData(functionFragment: "batches", values?: undefined): string; + encodeFunctionData( + functionFragment: "enqueue", +- values: [string, BigNumberish, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "enqueueGasCost", +@@ -104,7 +138,7 @@ export interface CanonicalTransactionChainInterface + ): string; + encodeFunctionData( + functionFragment: "getQueueElement", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getQueueLength", +@@ -130,10 +164,14 @@ export interface CanonicalTransactionChainInterface + functionFragment: "maxTransactionGasLimit", + values?: undefined + ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; ++ encodeFunctionData(functionFragment: "queue", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "setGasParams", +- values: [BigNumberish, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -202,6 +240,7 @@ export interface CanonicalTransactionChainInterface + functionFragment: "maxTransactionGasLimit", + data: BytesLike + ): Result; ++ decodeFunctionResult(functionFragment: "queue", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setGasParams", +@@ -223,66 +262,71 @@ export interface CanonicalTransactionChainInterface + getEvent(nameOrSignatureOrTopic: "TransactionEnqueued"): EventFragment; + } + ++export interface L2GasParamsUpdatedEventObject { ++ l2GasDiscountDivisor: BigNumber; ++ enqueueGasCost: BigNumber; ++ enqueueL2GasPrepaid: BigNumber; ++} + export type L2GasParamsUpdatedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- l2GasDiscountDivisor: BigNumber; +- enqueueGasCost: BigNumber; +- enqueueL2GasPrepaid: BigNumber; +- } ++ L2GasParamsUpdatedEventObject + >; + + export type L2GasParamsUpdatedEventFilter = + TypedEventFilter; + ++export interface QueueBatchAppendedEventObject { ++ _startingQueueIndex: BigNumber; ++ _numQueueElements: BigNumber; ++ _totalElements: BigNumber; ++} + export type QueueBatchAppendedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- _startingQueueIndex: BigNumber; +- _numQueueElements: BigNumber; +- _totalElements: BigNumber; +- } ++ QueueBatchAppendedEventObject + >; + + export type QueueBatchAppendedEventFilter = + TypedEventFilter; + ++export interface SequencerBatchAppendedEventObject { ++ _startingQueueIndex: BigNumber; ++ _numQueueElements: BigNumber; ++ _totalElements: BigNumber; ++} + export type SequencerBatchAppendedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- _startingQueueIndex: BigNumber; +- _numQueueElements: BigNumber; +- _totalElements: BigNumber; +- } ++ SequencerBatchAppendedEventObject + >; + + export type SequencerBatchAppendedEventFilter = + TypedEventFilter; + ++export interface TransactionBatchAppendedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++ _batchSize: BigNumber; ++ _prevTotalElements: BigNumber; ++ _extraData: string; ++} + export type TransactionBatchAppendedEvent = TypedEvent< + [BigNumber, string, BigNumber, BigNumber, string], +- { +- _batchIndex: BigNumber; +- _batchRoot: string; +- _batchSize: BigNumber; +- _prevTotalElements: BigNumber; +- _extraData: string; +- } ++ TransactionBatchAppendedEventObject + >; + + export type TransactionBatchAppendedEventFilter = + TypedEventFilter; + ++export interface TransactionEnqueuedEventObject { ++ _l1TxOrigin: string; ++ _target: string; ++ _gasLimit: BigNumber; ++ _data: string; ++ _queueIndex: BigNumber; ++ _timestamp: BigNumber; ++} + export type TransactionEnqueuedEvent = TypedEvent< + [string, string, BigNumber, string, BigNumber, BigNumber], +- { +- _l1TxOrigin: string; +- _target: string; +- _gasLimit: BigNumber; +- _data: string; +- _queueIndex: BigNumber; +- _timestamp: BigNumber; +- } ++ TransactionEnqueuedEventObject + >; + + export type TransactionEnqueuedEventFilter = +@@ -320,16 +364,16 @@ export interface CanonicalTransactionChain extends BaseContract { + MIN_ROLLUP_TX_GAS(overrides?: CallOverrides): Promise<[BigNumber]>; + + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise<[string]>; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + enqueueGasCost(overrides?: CallOverrides): Promise<[BigNumber]>; +@@ -345,10 +389,12 @@ export interface CanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise<[number]>; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise< +- [QueueElementStructOutput] & { _element: QueueElementStructOutput } ++ [Lib_OVMCodec.QueueElementStructOutput] & { ++ _element: Lib_OVMCodec.QueueElementStructOutput; ++ } + >; + + getQueueLength(overrides?: CallOverrides): Promise<[number]>; +@@ -367,12 +413,17 @@ export interface CanonicalTransactionChain extends BaseContract { + + maxTransactionGasLimit(overrides?: CallOverrides): Promise<[BigNumber]>; + +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ queue(overrides?: CallOverrides): Promise<[string]>; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -381,16 +432,16 @@ export interface CanonicalTransactionChain extends BaseContract { + MIN_ROLLUP_TX_GAS(overrides?: CallOverrides): Promise; + + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + enqueueGasCost(overrides?: CallOverrides): Promise; +@@ -406,9 +457,9 @@ export interface CanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides +- ): Promise; ++ ): Promise; + + getQueueLength(overrides?: CallOverrides): Promise; + +@@ -422,12 +473,17 @@ export interface CanonicalTransactionChain extends BaseContract { + + maxTransactionGasLimit(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ queue(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -440,9 +496,9 @@ export interface CanonicalTransactionChain extends BaseContract { + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -459,9 +515,9 @@ export interface CanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides +- ): Promise; ++ ): Promise; + + getQueueLength(overrides?: CallOverrides): Promise; + +@@ -475,11 +531,16 @@ export interface CanonicalTransactionChain extends BaseContract { + + maxTransactionGasLimit(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ queue(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -519,14 +580,14 @@ export interface CanonicalTransactionChain extends BaseContract { + ): SequencerBatchAppendedEventFilter; + + "TransactionBatchAppended(uint256,bytes32,uint256,uint256,bytes)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, + _extraData?: null + ): TransactionBatchAppendedEventFilter; + TransactionBatchAppended( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, +@@ -534,19 +595,19 @@ export interface CanonicalTransactionChain extends BaseContract { + ): TransactionBatchAppendedEventFilter; + + "TransactionEnqueued(address,address,uint256,bytes,uint256,uint256)"( +- _l1TxOrigin?: string | null, +- _target?: string | null, ++ _l1TxOrigin?: PromiseOrValue | null, ++ _target?: PromiseOrValue | null, + _gasLimit?: null, + _data?: null, +- _queueIndex?: BigNumberish | null, ++ _queueIndex?: PromiseOrValue | null, + _timestamp?: null + ): TransactionEnqueuedEventFilter; + TransactionEnqueued( +- _l1TxOrigin?: string | null, +- _target?: string | null, ++ _l1TxOrigin?: PromiseOrValue | null, ++ _target?: PromiseOrValue | null, + _gasLimit?: null, + _data?: null, +- _queueIndex?: BigNumberish | null, ++ _queueIndex?: PromiseOrValue | null, + _timestamp?: null + ): TransactionEnqueuedEventFilter; + }; +@@ -557,16 +618,16 @@ export interface CanonicalTransactionChain extends BaseContract { + MIN_ROLLUP_TX_GAS(overrides?: CallOverrides): Promise; + + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + enqueueGasCost(overrides?: CallOverrides): Promise; +@@ -582,7 +643,7 @@ export interface CanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -598,12 +659,17 @@ export interface CanonicalTransactionChain extends BaseContract { + + maxTransactionGasLimit(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ queue(overrides?: CallOverrides): Promise; ++ ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -615,16 +681,16 @@ export interface CanonicalTransactionChain extends BaseContract { + MIN_ROLLUP_TX_GAS(overrides?: CallOverrides): Promise; + + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + enqueueGasCost(overrides?: CallOverrides): Promise; +@@ -646,7 +712,7 @@ export interface CanonicalTransactionChain extends BaseContract { + ): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -666,15 +732,17 @@ export interface CanonicalTransactionChain extends BaseContract { + overrides?: CallOverrides + ): Promise; + ++ queue(overrides?: CallOverrides): Promise; ++ + resolve( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/ChainStorageContainer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ChainStorageContainer.ts +similarity index 52% +rename from node_modules/@eth-optimism/contracts/dist/types/ChainStorageContainer.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ChainStorageContainer.ts +index ba7ddc6..43d5e22 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/ChainStorageContainer.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ChainStorageContainer.ts +@@ -1,47 +1,70 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface ChainStorageContainerInterface extends ethers.utils.Interface { ++export interface ChainStorageContainerInterface extends utils.Interface { + functions: { + "deleteElementsAfterInclusive(uint256,bytes27)": FunctionFragment; ++ "deleteElementsAfterInclusive(uint256)": FunctionFragment; + "get(uint256)": FunctionFragment; + "getGlobalMetadata()": FunctionFragment; + "length()": FunctionFragment; + "libAddressManager()": FunctionFragment; + "owner()": FunctionFragment; + "push(bytes32,bytes27)": FunctionFragment; ++ "push(bytes32)": FunctionFragment; + "resolve(string)": FunctionFragment; + "setGlobalMetadata(bytes27)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "deleteElementsAfterInclusive(uint256,bytes27)" ++ | "deleteElementsAfterInclusive(uint256)" ++ | "get" ++ | "getGlobalMetadata" ++ | "length" ++ | "libAddressManager" ++ | "owner" ++ | "push(bytes32,bytes27)" ++ | "push(bytes32)" ++ | "resolve" ++ | "setGlobalMetadata" ++ ): FunctionFragment; ++ + encodeFunctionData( +- functionFragment: "deleteElementsAfterInclusive", +- values: [BigNumberish, BytesLike] ++ functionFragment: "deleteElementsAfterInclusive(uint256,bytes27)", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "deleteElementsAfterInclusive(uint256)", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "get", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "get", values: [BigNumberish]): string; + encodeFunctionData( + functionFragment: "getGlobalMetadata", + values?: undefined +@@ -53,17 +76,28 @@ export interface ChainStorageContainerInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( +- functionFragment: "push", +- values: [BytesLike, BytesLike] ++ functionFragment: "push(bytes32,bytes27)", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "push(bytes32)", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; + encodeFunctionData( + functionFragment: "setGlobalMetadata", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +- functionFragment: "deleteElementsAfterInclusive", ++ functionFragment: "deleteElementsAfterInclusive(uint256,bytes27)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "deleteElementsAfterInclusive(uint256)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; +@@ -77,7 +111,14 @@ export interface ChainStorageContainerInterface extends ethers.utils.Interface { + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; +- decodeFunctionResult(functionFragment: "push", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "push(bytes32,bytes27)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "push(bytes32)", ++ data: BytesLike ++ ): Result; + decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setGlobalMetadata", +@@ -115,17 +156,20 @@ export interface ChainStorageContainer extends BaseContract { + + functions: { + "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- get(_index: BigNumberish, overrides?: CallOverrides): Promise<[string]>; ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + + getGlobalMetadata(overrides?: CallOverrides): Promise<[string]>; + +@@ -136,36 +180,42 @@ export interface ChainStorageContainer extends BaseContract { + owner(overrides?: CallOverrides): Promise<[string]>; + + "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + + setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + getGlobalMetadata(overrides?: CallOverrides): Promise; + +@@ -176,36 +226,42 @@ export interface ChainStorageContainer extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + getGlobalMetadata(overrides?: CallOverrides): Promise; + +@@ -216,20 +272,23 @@ export interface ChainStorageContainer extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "push(bytes32)"( +- _object: BytesLike, ++ _object: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGlobalMetadata( +- _globalMetadata: BytesLike, ++ _globalMetadata: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -238,17 +297,20 @@ export interface ChainStorageContainer extends BaseContract { + + estimateGas: { + "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- get(_index: BigNumberish, overrides?: CallOverrides): Promise; ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + getGlobalMetadata(overrides?: CallOverrides): Promise; + +@@ -259,38 +321,41 @@ export interface ChainStorageContainer extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + "deleteElementsAfterInclusive(uint256,bytes27)"( +- _index: BigNumberish, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "deleteElementsAfterInclusive(uint256)"( +- _index: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + get( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -303,24 +368,24 @@ export interface ChainStorageContainer extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + "push(bytes32,bytes27)"( +- _object: BytesLike, +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "push(bytes32)"( +- _object: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + resolve( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setGlobalMetadata( +- _globalMetadata: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/ICanonicalTransactionChain.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ICanonicalTransactionChain.ts +similarity index 67% +rename from node_modules/@eth-optimism/contracts/dist/types/ICanonicalTransactionChain.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ICanonicalTransactionChain.ts +index 82edb48..33ce58a 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/ICanonicalTransactionChain.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/ICanonicalTransactionChain.ts +@@ -1,43 +1,47 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; +- +-export type QueueElementStruct = { +- transactionHash: BytesLike; +- timestamp: BigNumberish; +- blockNumber: BigNumberish; +-}; +- +-export type QueueElementStructOutput = [string, number, number] & { +- transactionHash: string; +- timestamp: number; +- blockNumber: number; +-}; +- +-export interface ICanonicalTransactionChainInterface +- extends ethers.utils.Interface { ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type QueueElementStruct = { ++ transactionHash: PromiseOrValue; ++ timestamp: PromiseOrValue; ++ blockNumber: PromiseOrValue; ++ }; ++ ++ export type QueueElementStructOutput = [string, number, number] & { ++ transactionHash: string; ++ timestamp: number; ++ blockNumber: number; ++ }; ++} ++ ++export interface ICanonicalTransactionChainInterface extends utils.Interface { + functions: { + "appendSequencerBatch()": FunctionFragment; + "batches()": FunctionFragment; +@@ -50,9 +54,27 @@ export interface ICanonicalTransactionChainInterface + "getQueueLength()": FunctionFragment; + "getTotalBatches()": FunctionFragment; + "getTotalElements()": FunctionFragment; ++ "queue()": FunctionFragment; + "setGasParams(uint256,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "appendSequencerBatch" ++ | "batches" ++ | "enqueue" ++ | "getLastBlockNumber" ++ | "getLastTimestamp" ++ | "getNextQueueIndex" ++ | "getNumPendingQueueElements" ++ | "getQueueElement" ++ | "getQueueLength" ++ | "getTotalBatches" ++ | "getTotalElements" ++ | "queue" ++ | "setGasParams" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "appendSequencerBatch", + values?: undefined +@@ -60,7 +82,11 @@ export interface ICanonicalTransactionChainInterface + encodeFunctionData(functionFragment: "batches", values?: undefined): string; + encodeFunctionData( + functionFragment: "enqueue", +- values: [string, BigNumberish, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "getLastBlockNumber", +@@ -80,7 +106,7 @@ export interface ICanonicalTransactionChainInterface + ): string; + encodeFunctionData( + functionFragment: "getQueueElement", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getQueueLength", +@@ -94,9 +120,10 @@ export interface ICanonicalTransactionChainInterface + functionFragment: "getTotalElements", + values?: undefined + ): string; ++ encodeFunctionData(functionFragment: "queue", values?: undefined): string; + encodeFunctionData( + functionFragment: "setGasParams", +- values: [BigNumberish, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -137,6 +164,7 @@ export interface ICanonicalTransactionChainInterface + functionFragment: "getTotalElements", + data: BytesLike + ): Result; ++ decodeFunctionResult(functionFragment: "queue", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setGasParams", + data: BytesLike +@@ -157,66 +185,71 @@ export interface ICanonicalTransactionChainInterface + getEvent(nameOrSignatureOrTopic: "TransactionEnqueued"): EventFragment; + } + ++export interface L2GasParamsUpdatedEventObject { ++ l2GasDiscountDivisor: BigNumber; ++ enqueueGasCost: BigNumber; ++ enqueueL2GasPrepaid: BigNumber; ++} + export type L2GasParamsUpdatedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- l2GasDiscountDivisor: BigNumber; +- enqueueGasCost: BigNumber; +- enqueueL2GasPrepaid: BigNumber; +- } ++ L2GasParamsUpdatedEventObject + >; + + export type L2GasParamsUpdatedEventFilter = + TypedEventFilter; + ++export interface QueueBatchAppendedEventObject { ++ _startingQueueIndex: BigNumber; ++ _numQueueElements: BigNumber; ++ _totalElements: BigNumber; ++} + export type QueueBatchAppendedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- _startingQueueIndex: BigNumber; +- _numQueueElements: BigNumber; +- _totalElements: BigNumber; +- } ++ QueueBatchAppendedEventObject + >; + + export type QueueBatchAppendedEventFilter = + TypedEventFilter; + ++export interface SequencerBatchAppendedEventObject { ++ _startingQueueIndex: BigNumber; ++ _numQueueElements: BigNumber; ++ _totalElements: BigNumber; ++} + export type SequencerBatchAppendedEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber], +- { +- _startingQueueIndex: BigNumber; +- _numQueueElements: BigNumber; +- _totalElements: BigNumber; +- } ++ SequencerBatchAppendedEventObject + >; + + export type SequencerBatchAppendedEventFilter = + TypedEventFilter; + ++export interface TransactionBatchAppendedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++ _batchSize: BigNumber; ++ _prevTotalElements: BigNumber; ++ _extraData: string; ++} + export type TransactionBatchAppendedEvent = TypedEvent< + [BigNumber, string, BigNumber, BigNumber, string], +- { +- _batchIndex: BigNumber; +- _batchRoot: string; +- _batchSize: BigNumber; +- _prevTotalElements: BigNumber; +- _extraData: string; +- } ++ TransactionBatchAppendedEventObject + >; + + export type TransactionBatchAppendedEventFilter = + TypedEventFilter; + ++export interface TransactionEnqueuedEventObject { ++ _l1TxOrigin: string; ++ _target: string; ++ _gasLimit: BigNumber; ++ _data: string; ++ _queueIndex: BigNumber; ++ _timestamp: BigNumber; ++} + export type TransactionEnqueuedEvent = TypedEvent< + [string, string, BigNumber, string, BigNumber, BigNumber], +- { +- _l1TxOrigin: string; +- _target: string; +- _gasLimit: BigNumber; +- _data: string; +- _queueIndex: BigNumber; +- _timestamp: BigNumber; +- } ++ TransactionEnqueuedEventObject + >; + + export type TransactionEnqueuedEventFilter = +@@ -250,16 +283,16 @@ export interface ICanonicalTransactionChain extends BaseContract { + + functions: { + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise<[string]>; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastBlockNumber(overrides?: CallOverrides): Promise<[number]>; +@@ -271,10 +304,12 @@ export interface ICanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise<[number]>; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise< +- [QueueElementStructOutput] & { _element: QueueElementStructOutput } ++ [Lib_OVMCodec.QueueElementStructOutput] & { ++ _element: Lib_OVMCodec.QueueElementStructOutput; ++ } + >; + + getQueueLength(overrides?: CallOverrides): Promise<[number]>; +@@ -287,24 +322,26 @@ export interface ICanonicalTransactionChain extends BaseContract { + overrides?: CallOverrides + ): Promise<[BigNumber] & { _totalElements: BigNumber }>; + ++ queue(overrides?: CallOverrides): Promise<[string]>; ++ + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastBlockNumber(overrides?: CallOverrides): Promise; +@@ -316,9 +353,9 @@ export interface ICanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides +- ): Promise; ++ ): Promise; + + getQueueLength(overrides?: CallOverrides): Promise; + +@@ -326,10 +363,12 @@ export interface ICanonicalTransactionChain extends BaseContract { + + getTotalElements(overrides?: CallOverrides): Promise; + ++ queue(overrides?: CallOverrides): Promise; ++ + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -338,9 +377,9 @@ export interface ICanonicalTransactionChain extends BaseContract { + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -353,9 +392,9 @@ export interface ICanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides +- ): Promise; ++ ): Promise; + + getQueueLength(overrides?: CallOverrides): Promise; + +@@ -363,9 +402,11 @@ export interface ICanonicalTransactionChain extends BaseContract { + + getTotalElements(overrides?: CallOverrides): Promise; + ++ queue(overrides?: CallOverrides): Promise; ++ + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -405,14 +446,14 @@ export interface ICanonicalTransactionChain extends BaseContract { + ): SequencerBatchAppendedEventFilter; + + "TransactionBatchAppended(uint256,bytes32,uint256,uint256,bytes)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, + _extraData?: null + ): TransactionBatchAppendedEventFilter; + TransactionBatchAppended( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, +@@ -420,35 +461,35 @@ export interface ICanonicalTransactionChain extends BaseContract { + ): TransactionBatchAppendedEventFilter; + + "TransactionEnqueued(address,address,uint256,bytes,uint256,uint256)"( +- _l1TxOrigin?: string | null, +- _target?: string | null, ++ _l1TxOrigin?: PromiseOrValue | null, ++ _target?: PromiseOrValue | null, + _gasLimit?: null, + _data?: null, +- _queueIndex?: BigNumberish | null, ++ _queueIndex?: PromiseOrValue | null, + _timestamp?: null + ): TransactionEnqueuedEventFilter; + TransactionEnqueued( +- _l1TxOrigin?: string | null, +- _target?: string | null, ++ _l1TxOrigin?: PromiseOrValue | null, ++ _target?: PromiseOrValue | null, + _gasLimit?: null, + _data?: null, +- _queueIndex?: BigNumberish | null, ++ _queueIndex?: PromiseOrValue | null, + _timestamp?: null + ): TransactionEnqueuedEventFilter; + }; + + estimateGas: { + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastBlockNumber(overrides?: CallOverrides): Promise; +@@ -460,7 +501,7 @@ export interface ICanonicalTransactionChain extends BaseContract { + getNumPendingQueueElements(overrides?: CallOverrides): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -470,25 +511,27 @@ export interface ICanonicalTransactionChain extends BaseContract { + + getTotalElements(overrides?: CallOverrides): Promise; + ++ queue(overrides?: CallOverrides): Promise; ++ + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + appendSequencerBatch( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + enqueue( +- _target: string, +- _gasLimit: BigNumberish, +- _data: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastBlockNumber( +@@ -504,7 +547,7 @@ export interface ICanonicalTransactionChain extends BaseContract { + ): Promise; + + getQueueElement( +- _index: BigNumberish, ++ _index: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -514,10 +557,12 @@ export interface ICanonicalTransactionChain extends BaseContract { + + getTotalElements(overrides?: CallOverrides): Promise; + ++ queue(overrides?: CallOverrides): Promise; ++ + setGasParams( +- _l2GasDiscountDivisor: BigNumberish, +- _enqueueGasCost: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IChainStorageContainer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IChainStorageContainer.ts +new file mode 100644 +index 0000000..e53292a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IChainStorageContainer.ts +@@ -0,0 +1,325 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IChainStorageContainerInterface extends utils.Interface { ++ functions: { ++ "deleteElementsAfterInclusive(uint256,bytes27)": FunctionFragment; ++ "deleteElementsAfterInclusive(uint256)": FunctionFragment; ++ "get(uint256)": FunctionFragment; ++ "getGlobalMetadata()": FunctionFragment; ++ "length()": FunctionFragment; ++ "push(bytes32,bytes27)": FunctionFragment; ++ "push(bytes32)": FunctionFragment; ++ "setGlobalMetadata(bytes27)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "deleteElementsAfterInclusive(uint256,bytes27)" ++ | "deleteElementsAfterInclusive(uint256)" ++ | "get" ++ | "getGlobalMetadata" ++ | "length" ++ | "push(bytes32,bytes27)" ++ | "push(bytes32)" ++ | "setGlobalMetadata" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "deleteElementsAfterInclusive(uint256,bytes27)", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "deleteElementsAfterInclusive(uint256)", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "get", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getGlobalMetadata", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "length", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "push(bytes32,bytes27)", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "push(bytes32)", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "setGlobalMetadata", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "deleteElementsAfterInclusive(uint256,bytes27)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "deleteElementsAfterInclusive(uint256)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getGlobalMetadata", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "length", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "push(bytes32,bytes27)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "push(bytes32)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "setGlobalMetadata", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface IChainStorageContainer extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IChainStorageContainerInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ "deleteElementsAfterInclusive(uint256,bytes27)"( ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint256)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getGlobalMetadata(overrides?: CallOverrides): Promise<[string]>; ++ ++ length(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ "push(bytes32,bytes27)"( ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "push(bytes32)"( ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setGlobalMetadata( ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ "deleteElementsAfterInclusive(uint256,bytes27)"( ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint256)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getGlobalMetadata(overrides?: CallOverrides): Promise; ++ ++ length(overrides?: CallOverrides): Promise; ++ ++ "push(bytes32,bytes27)"( ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "push(bytes32)"( ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setGlobalMetadata( ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ "deleteElementsAfterInclusive(uint256,bytes27)"( ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint256)"( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getGlobalMetadata(overrides?: CallOverrides): Promise; ++ ++ length(overrides?: CallOverrides): Promise; ++ ++ "push(bytes32,bytes27)"( ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "push(bytes32)"( ++ _object: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setGlobalMetadata( ++ _globalMetadata: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ "deleteElementsAfterInclusive(uint256,bytes27)"( ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint256)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getGlobalMetadata(overrides?: CallOverrides): Promise; ++ ++ length(overrides?: CallOverrides): Promise; ++ ++ "push(bytes32,bytes27)"( ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "push(bytes32)"( ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setGlobalMetadata( ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ "deleteElementsAfterInclusive(uint256,bytes27)"( ++ _index: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint256)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getGlobalMetadata(overrides?: CallOverrides): Promise; ++ ++ length(overrides?: CallOverrides): Promise; ++ ++ "push(bytes32,bytes27)"( ++ _object: PromiseOrValue, ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "push(bytes32)"( ++ _object: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setGlobalMetadata( ++ _globalMetadata: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IStateCommitmentChain.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IStateCommitmentChain.ts +similarity index 60% +rename from node_modules/@eth-optimism/contracts/dist/types/IStateCommitmentChain.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IStateCommitmentChain.ts +index 39430f5..2899921 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IStateCommitmentChain.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/IStateCommitmentChain.ts +@@ -1,62 +1,67 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; + +-export type ChainBatchHeaderStruct = { +- batchIndex: BigNumberish; +- batchRoot: BytesLike; +- batchSize: BigNumberish; +- prevTotalElements: BigNumberish; +- extraData: BytesLike; +-}; ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; + +-export type ChainBatchHeaderStructOutput = [ +- BigNumber, +- string, +- BigNumber, +- BigNumber, +- string +-] & { +- batchIndex: BigNumber; +- batchRoot: string; +- batchSize: BigNumber; +- prevTotalElements: BigNumber; +- extraData: string; +-}; +- +-export type ChainInclusionProofStruct = { +- index: BigNumberish; +- siblings: BytesLike[]; +-}; +- +-export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { +- index: BigNumber; +- siblings: string[]; +-}; +- +-export interface IStateCommitmentChainInterface extends ethers.utils.Interface { ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export interface IStateCommitmentChainInterface extends utils.Interface { + functions: { + "appendStateBatch(bytes32[],uint256)": FunctionFragment; + "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": FunctionFragment; +@@ -67,13 +72,24 @@ export interface IStateCommitmentChainInterface extends ethers.utils.Interface { + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "appendStateBatch" ++ | "deleteStateBatch" ++ | "getLastSequencerTimestamp" ++ | "getTotalBatches" ++ | "getTotalElements" ++ | "insideFraudProofWindow" ++ | "verifyStateCommitment" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "appendStateBatch", +- values: [BytesLike[], BigNumberish] ++ values: [PromiseOrValue[], PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "deleteStateBatch", +- values: [ChainBatchHeaderStruct] ++ values: [Lib_OVMCodec.ChainBatchHeaderStruct] + ): string; + encodeFunctionData( + functionFragment: "getLastSequencerTimestamp", +@@ -89,11 +105,15 @@ export interface IStateCommitmentChainInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "insideFraudProofWindow", +- values: [ChainBatchHeaderStruct] ++ values: [Lib_OVMCodec.ChainBatchHeaderStruct] + ): string; + encodeFunctionData( + functionFragment: "verifyStateCommitment", +- values: [BytesLike, ChainBatchHeaderStruct, ChainInclusionProofStruct] ++ values: [ ++ PromiseOrValue, ++ Lib_OVMCodec.ChainBatchHeaderStruct, ++ Lib_OVMCodec.ChainInclusionProofStruct ++ ] + ): string; + + decodeFunctionResult( +@@ -134,23 +154,28 @@ export interface IStateCommitmentChainInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "StateBatchDeleted"): EventFragment; + } + ++export interface StateBatchAppendedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++ _batchSize: BigNumber; ++ _prevTotalElements: BigNumber; ++ _extraData: string; ++} + export type StateBatchAppendedEvent = TypedEvent< + [BigNumber, string, BigNumber, BigNumber, string], +- { +- _batchIndex: BigNumber; +- _batchRoot: string; +- _batchSize: BigNumber; +- _prevTotalElements: BigNumber; +- _extraData: string; +- } ++ StateBatchAppendedEventObject + >; + + export type StateBatchAppendedEventFilter = + TypedEventFilter; + ++export interface StateBatchDeletedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++} + export type StateBatchDeletedEvent = TypedEvent< + [BigNumber, string], +- { _batchIndex: BigNumber; _batchRoot: string } ++ StateBatchDeletedEventObject + >; + + export type StateBatchDeletedEventFilter = +@@ -184,14 +209,14 @@ export interface IStateCommitmentChain extends BaseContract { + + functions: { + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp( +@@ -207,27 +232,27 @@ export interface IStateCommitmentChain extends BaseContract { + ): Promise<[BigNumber] & { _totalElements: BigNumber }>; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise<[boolean] & { _inside: boolean }>; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise<[boolean] & { _verified: boolean }>; + }; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp(overrides?: CallOverrides): Promise; +@@ -237,26 +262,26 @@ export interface IStateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + + callStatic: { + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + +@@ -267,28 +292,28 @@ export interface IStateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "StateBatchAppended(uint256,bytes32,uint256,uint256,bytes)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, + _extraData?: null + ): StateBatchAppendedEventFilter; + StateBatchAppended( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, +@@ -296,25 +321,25 @@ export interface IStateCommitmentChain extends BaseContract { + ): StateBatchAppendedEventFilter; + + "StateBatchDeleted(uint256,bytes32)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null + ): StateBatchDeletedEventFilter; + StateBatchDeleted( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null + ): StateBatchDeletedEventFilter; + }; + + estimateGas: { + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp(overrides?: CallOverrides): Promise; +@@ -324,28 +349,28 @@ export interface IStateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp( +@@ -357,14 +382,14 @@ export interface IStateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/StateCommitmentChain.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/StateCommitmentChain.ts +similarity index 64% +rename from node_modules/@eth-optimism/contracts/dist/types/StateCommitmentChain.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/StateCommitmentChain.ts +index df8391b..69385d6 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/StateCommitmentChain.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/StateCommitmentChain.ts +@@ -1,62 +1,67 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type ChainBatchHeaderStruct = { ++ batchIndex: PromiseOrValue; ++ batchRoot: PromiseOrValue; ++ batchSize: PromiseOrValue; ++ prevTotalElements: PromiseOrValue; ++ extraData: PromiseOrValue; ++ }; + +-export type ChainBatchHeaderStruct = { +- batchIndex: BigNumberish; +- batchRoot: BytesLike; +- batchSize: BigNumberish; +- prevTotalElements: BigNumberish; +- extraData: BytesLike; +-}; ++ export type ChainBatchHeaderStructOutput = [ ++ BigNumber, ++ string, ++ BigNumber, ++ BigNumber, ++ string ++ ] & { ++ batchIndex: BigNumber; ++ batchRoot: string; ++ batchSize: BigNumber; ++ prevTotalElements: BigNumber; ++ extraData: string; ++ }; + +-export type ChainBatchHeaderStructOutput = [ +- BigNumber, +- string, +- BigNumber, +- BigNumber, +- string +-] & { +- batchIndex: BigNumber; +- batchRoot: string; +- batchSize: BigNumber; +- prevTotalElements: BigNumber; +- extraData: string; +-}; +- +-export type ChainInclusionProofStruct = { +- index: BigNumberish; +- siblings: BytesLike[]; +-}; +- +-export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { +- index: BigNumber; +- siblings: string[]; +-}; +- +-export interface StateCommitmentChainInterface extends ethers.utils.Interface { ++ export type ChainInclusionProofStruct = { ++ index: PromiseOrValue; ++ siblings: PromiseOrValue[]; ++ }; ++ ++ export type ChainInclusionProofStructOutput = [BigNumber, string[]] & { ++ index: BigNumber; ++ siblings: string[]; ++ }; ++} ++ ++export interface StateCommitmentChainInterface extends utils.Interface { + functions: { + "FRAUD_PROOF_WINDOW()": FunctionFragment; + "SEQUENCER_PUBLISH_WINDOW()": FunctionFragment; +@@ -72,6 +77,22 @@ export interface StateCommitmentChainInterface extends ethers.utils.Interface { + "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "FRAUD_PROOF_WINDOW" ++ | "SEQUENCER_PUBLISH_WINDOW" ++ | "appendStateBatch" ++ | "batches" ++ | "deleteStateBatch" ++ | "getLastSequencerTimestamp" ++ | "getTotalBatches" ++ | "getTotalElements" ++ | "insideFraudProofWindow" ++ | "libAddressManager" ++ | "resolve" ++ | "verifyStateCommitment" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "FRAUD_PROOF_WINDOW", + values?: undefined +@@ -82,12 +103,12 @@ export interface StateCommitmentChainInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "appendStateBatch", +- values: [BytesLike[], BigNumberish] ++ values: [PromiseOrValue[], PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "batches", values?: undefined): string; + encodeFunctionData( + functionFragment: "deleteStateBatch", +- values: [ChainBatchHeaderStruct] ++ values: [Lib_OVMCodec.ChainBatchHeaderStruct] + ): string; + encodeFunctionData( + functionFragment: "getLastSequencerTimestamp", +@@ -103,16 +124,23 @@ export interface StateCommitmentChainInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "insideFraudProofWindow", +- values: [ChainBatchHeaderStruct] ++ values: [Lib_OVMCodec.ChainBatchHeaderStruct] + ): string; + encodeFunctionData( + functionFragment: "libAddressManager", + values?: undefined + ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "verifyStateCommitment", +- values: [BytesLike, ChainBatchHeaderStruct, ChainInclusionProofStruct] ++ values: [ ++ PromiseOrValue, ++ Lib_OVMCodec.ChainBatchHeaderStruct, ++ Lib_OVMCodec.ChainInclusionProofStruct ++ ] + ): string; + + decodeFunctionResult( +@@ -167,23 +195,28 @@ export interface StateCommitmentChainInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "StateBatchDeleted"): EventFragment; + } + ++export interface StateBatchAppendedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++ _batchSize: BigNumber; ++ _prevTotalElements: BigNumber; ++ _extraData: string; ++} + export type StateBatchAppendedEvent = TypedEvent< + [BigNumber, string, BigNumber, BigNumber, string], +- { +- _batchIndex: BigNumber; +- _batchRoot: string; +- _batchSize: BigNumber; +- _prevTotalElements: BigNumber; +- _extraData: string; +- } ++ StateBatchAppendedEventObject + >; + + export type StateBatchAppendedEventFilter = + TypedEventFilter; + ++export interface StateBatchDeletedEventObject { ++ _batchIndex: BigNumber; ++ _batchRoot: string; ++} + export type StateBatchDeletedEvent = TypedEvent< + [BigNumber, string], +- { _batchIndex: BigNumber; _batchRoot: string } ++ StateBatchDeletedEventObject + >; + + export type StateBatchDeletedEventFilter = +@@ -221,16 +254,16 @@ export interface StateCommitmentChain extends BaseContract { + SEQUENCER_PUBLISH_WINDOW(overrides?: CallOverrides): Promise<[BigNumber]>; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise<[string]>; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp( +@@ -246,18 +279,21 @@ export interface StateCommitmentChain extends BaseContract { + ): Promise<[BigNumber] & { _totalElements: BigNumber }>; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise<[boolean] & { _inside: boolean }>; + + libAddressManager(overrides?: CallOverrides): Promise<[string]>; + +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; +@@ -267,16 +303,16 @@ export interface StateCommitmentChain extends BaseContract { + SEQUENCER_PUBLISH_WINDOW(overrides?: CallOverrides): Promise; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp(overrides?: CallOverrides): Promise; +@@ -286,18 +322,21 @@ export interface StateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + +@@ -307,15 +346,15 @@ export interface StateCommitmentChain extends BaseContract { + SEQUENCER_PUBLISH_WINDOW(overrides?: CallOverrides): Promise; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + +@@ -326,32 +365,35 @@ export interface StateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "StateBatchAppended(uint256,bytes32,uint256,uint256,bytes)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, + _extraData?: null + ): StateBatchAppendedEventFilter; + StateBatchAppended( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null, + _batchSize?: null, + _prevTotalElements?: null, +@@ -359,11 +401,11 @@ export interface StateCommitmentChain extends BaseContract { + ): StateBatchAppendedEventFilter; + + "StateBatchDeleted(uint256,bytes32)"( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null + ): StateBatchDeletedEventFilter; + StateBatchDeleted( +- _batchIndex?: BigNumberish | null, ++ _batchIndex?: PromiseOrValue | null, + _batchRoot?: null + ): StateBatchDeletedEventFilter; + }; +@@ -374,16 +416,16 @@ export interface StateCommitmentChain extends BaseContract { + SEQUENCER_PUBLISH_WINDOW(overrides?: CallOverrides): Promise; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp(overrides?: CallOverrides): Promise; +@@ -393,18 +435,21 @@ export interface StateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; +@@ -419,16 +464,16 @@ export interface StateCommitmentChain extends BaseContract { + ): Promise; + + appendStateBatch( +- _batch: BytesLike[], +- _shouldStartAtElement: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _batch: PromiseOrValue[], ++ _shouldStartAtElement: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + batches(overrides?: CallOverrides): Promise; + + deleteStateBatch( +- _batchHeader: ChainBatchHeaderStruct, +- overrides?: Overrides & { from?: string | Promise } ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getLastSequencerTimestamp( +@@ -440,21 +485,21 @@ export interface StateCommitmentChain extends BaseContract { + getTotalElements(overrides?: CallOverrides): Promise; + + insideFraudProofWindow( +- _batchHeader: ChainBatchHeaderStruct, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + + resolve( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyStateCommitment( +- _element: BytesLike, +- _batchHeader: ChainBatchHeaderStruct, +- _proof: ChainInclusionProofStruct, ++ _element: PromiseOrValue, ++ _batchHeader: Lib_OVMCodec.ChainBatchHeaderStruct, ++ _proof: Lib_OVMCodec.ChainInclusionProofStruct, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/index.ts +new file mode 100644 +index 0000000..4702c94 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/rollup/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { CanonicalTransactionChain } from "./CanonicalTransactionChain"; ++export type { ChainStorageContainer } from "./ChainStorageContainer"; ++export type { ICanonicalTransactionChain } from "./ICanonicalTransactionChain"; ++export type { IChainStorageContainer } from "./IChainStorageContainer"; ++export type { IStateCommitmentChain } from "./IStateCommitmentChain"; ++export type { StateCommitmentChain } from "./StateCommitmentChain"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/BOBA.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/BOBA.ts +new file mode 100644 +index 0000000..b0b3c9b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/BOBA.ts +@@ -0,0 +1,1120 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface BOBAInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "burn(uint256)": FunctionFragment; ++ "burnFrom(address,uint256)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getCurrentVotes(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getPriorVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "maxSupply()": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "burnFrom" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getCurrentVotes" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getPriorVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "maxSupply" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burn", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burnFrom", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCurrentVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPriorVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "maxSupply", values?: undefined): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burnFrom", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getCurrentVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPriorVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "maxSupply", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface BOBA extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: BOBAInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ burnFrom( ++ account: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/index.ts +new file mode 100644 +index 0000000..cff97a5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/token/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { BOBA } from "./BOBA"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/BondManager.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/BondManager.ts +similarity index 65% +rename from node_modules/@eth-optimism/contracts/dist/types/BondManager.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/BondManager.ts +index 7dfe642..1b64736 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/BondManager.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/BondManager.ts +@@ -1,44 +1,48 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface BondManagerInterface extends ethers.utils.Interface { ++export interface BondManagerInterface extends utils.Interface { + functions: { + "isCollateralized(address)": FunctionFragment; + "libAddressManager()": FunctionFragment; + "resolve(string)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "isCollateralized" | "libAddressManager" | "resolve" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "isCollateralized", +- values: [string] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "libAddressManager", + values?: undefined + ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; + + decodeFunctionResult( + functionFragment: "isCollateralized", +@@ -81,52 +85,70 @@ export interface BondManager extends BaseContract { + + functions: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + libAddressManager(overrides?: CallOverrides): Promise<[string]>; + +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + }; + +- isCollateralized(_who: string, overrides?: CallOverrides): Promise; ++ isCollateralized( ++ _who: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { +- isCollateralized(_who: string, overrides?: CallOverrides): Promise; ++ isCollateralized( ++ _who: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; + + estimateGas: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + populateTransaction: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + libAddressManager(overrides?: CallOverrides): Promise; + + resolve( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IBondManager.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/IBondManager.ts +similarity index 70% +rename from node_modules/@eth-optimism/contracts/dist/types/IBondManager.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/IBondManager.ts +index 3a625f8..07f89ae 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IBondManager.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/IBondManager.ts +@@ -1,36 +1,35 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface IBondManagerInterface extends ethers.utils.Interface { ++export interface IBondManagerInterface extends utils.Interface { + functions: { + "isCollateralized(address)": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "isCollateralized"): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "isCollateralized", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -69,29 +68,35 @@ export interface IBondManager extends BaseContract { + + functions: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + +- isCollateralized(_who: string, overrides?: CallOverrides): Promise; ++ isCollateralized( ++ _who: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { +- isCollateralized(_who: string, overrides?: CallOverrides): Promise; ++ isCollateralized( ++ _who: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; + + estimateGas: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + isCollateralized( +- _who: string, ++ _who: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/index.ts +new file mode 100644 +index 0000000..74a8b59 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L1/verification/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { BondManager } from "./BondManager"; ++export type { IBondManager } from "./IBondManager"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/index.ts +new file mode 100644 +index 0000000..1913fcd +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as messaging from "./messaging"; ++export type { messaging }; ++import type * as predeploys from "./predeploys"; ++export type { predeploys }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL2CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2CrossDomainMessenger.ts +similarity index 55% +rename from node_modules/@eth-optimism/contracts/dist/types/IL2CrossDomainMessenger.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2CrossDomainMessenger.ts +index d1bb345..81317d4 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL2CrossDomainMessenger.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2CrossDomainMessenger.ts +@@ -1,44 +1,62 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface IL2CrossDomainMessengerInterface +- extends ethers.utils.Interface { ++export interface IL2CrossDomainMessengerInterface extends utils.Interface { + functions: { + "relayMessage(address,address,bytes,uint256)": FunctionFragment; + "sendMessage(address,bytes,uint32)": FunctionFragment; + "xDomainMessageSender()": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "relayMessage" ++ | "sendMessage" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "relayMessage", +- values: [string, string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "sendMessage", +- values: [string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "xDomainMessageSender", +@@ -69,27 +87,37 @@ export interface IL2CrossDomainMessengerInterface + getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; + } + ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} + export type FailedRelayedMessageEvent = TypedEvent< + [string], +- { msgHash: string } ++ FailedRelayedMessageEventObject + >; + + export type FailedRelayedMessageEventFilter = + TypedEventFilter; + +-export type RelayedMessageEvent = TypedEvent<[string], { msgHash: string }>; ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; + + export type RelayedMessageEventFilter = TypedEventFilter; + ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} + export type SentMessageEvent = TypedEvent< + [string, string, string, BigNumber, BigNumber], +- { +- target: string; +- sender: string; +- message: string; +- messageNonce: BigNumber; +- gasLimit: BigNumber; +- } ++ SentMessageEventObject + >; + + export type SentMessageEventFilter = TypedEventFilter; +@@ -122,53 +150,53 @@ export interface IL2CrossDomainMessenger extends BaseContract { + + functions: { + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; + }; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise; + + callStatic: { + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -177,26 +205,28 @@ export interface IL2CrossDomainMessenger extends BaseContract { + + filters: { + "FailedRelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + FailedRelayedMessage( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + + "RelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null + ): RelayedMessageEventFilter; +- RelayedMessage(msgHash?: BytesLike | null): RelayedMessageEventFilter; + + "SentMessage(address,address,bytes,uint256,uint256)"( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, + gasLimit?: null + ): SentMessageEventFilter; + SentMessage( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, +@@ -206,18 +236,18 @@ export interface IL2CrossDomainMessenger extends BaseContract { + + estimateGas: { + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise; +@@ -225,18 +255,18 @@ export interface IL2CrossDomainMessenger extends BaseContract { + + populateTransaction: { + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender( +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2ERC20Bridge.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2ERC20Bridge.ts +new file mode 100644 +index 0000000..b751540 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/IL2ERC20Bridge.ts +@@ -0,0 +1,389 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface IL2ERC20BridgeInterface extends utils.Interface { ++ functions: { ++ "finalizeDeposit(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "l1TokenBridge()": FunctionFragment; ++ "withdraw(address,uint256,uint32,bytes)": FunctionFragment; ++ "withdrawTo(address,address,uint256,uint32,bytes)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "finalizeDeposit" ++ | "l1TokenBridge" ++ | "withdraw" ++ | "withdrawTo" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "finalizeDeposit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l1TokenBridge", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdraw", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "finalizeDeposit", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l1TokenBridge", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "withdrawTo", data: BytesLike): Result; ++ ++ events: { ++ "DepositFailed(address,address,address,address,uint256,bytes)": EventFragment; ++ "DepositFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "DepositFailed"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DepositFinalized"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; ++} ++ ++export interface DepositFailedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFailedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFailedEventObject ++>; ++ ++export type DepositFailedEventFilter = TypedEventFilter; ++ ++export interface DepositFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFinalizedEventObject ++>; ++ ++export type DepositFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawalInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type WithdrawalInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ WithdrawalInitiatedEventObject ++>; ++ ++export type WithdrawalInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface IL2ERC20Bridge extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: IL2ERC20BridgeInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "DepositFailed(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ DepositFailed( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ ++ "DepositFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ DepositFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ WithdrawalInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ }; ++ ++ estimateGas: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L2CrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2CrossDomainMessenger.ts +similarity index 61% +rename from node_modules/@eth-optimism/contracts/dist/types/L2CrossDomainMessenger.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2CrossDomainMessenger.ts +index d63b80c..0affaf6 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/L2CrossDomainMessenger.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2CrossDomainMessenger.ts +@@ -1,31 +1,33 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface L2CrossDomainMessengerInterface +- extends ethers.utils.Interface { ++export interface L2CrossDomainMessengerInterface extends utils.Interface { + functions: { + "l1CrossDomainMessenger()": FunctionFragment; + "messageNonce()": FunctionFragment; +@@ -37,6 +39,18 @@ export interface L2CrossDomainMessengerInterface + "xDomainMessageSender()": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "l1CrossDomainMessenger" ++ | "messageNonce" ++ | "relayMessage" ++ | "relayedMessages" ++ | "sendMessage" ++ | "sentMessages" ++ | "successfulMessages" ++ | "xDomainMessageSender" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "l1CrossDomainMessenger", + values?: undefined +@@ -47,23 +61,32 @@ export interface L2CrossDomainMessengerInterface + ): string; + encodeFunctionData( + functionFragment: "relayMessage", +- values: [string, string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "relayedMessages", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "sendMessage", +- values: [string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "sentMessages", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "successfulMessages", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "xDomainMessageSender", +@@ -114,27 +137,37 @@ export interface L2CrossDomainMessengerInterface + getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; + } + ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} + export type FailedRelayedMessageEvent = TypedEvent< + [string], +- { msgHash: string } ++ FailedRelayedMessageEventObject + >; + + export type FailedRelayedMessageEventFilter = + TypedEventFilter; + +-export type RelayedMessageEvent = TypedEvent<[string], { msgHash: string }>; ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; + + export type RelayedMessageEventFilter = TypedEventFilter; + ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} + export type SentMessageEvent = TypedEvent< + [string, string, string, BigNumber, BigNumber], +- { +- target: string; +- sender: string; +- message: string; +- messageNonce: BigNumber; +- gasLimit: BigNumber; +- } ++ SentMessageEventObject + >; + + export type SentMessageEventFilter = TypedEventFilter; +@@ -171,32 +204,32 @@ export interface L2CrossDomainMessenger extends BaseContract { + messageNonce(overrides?: CallOverrides): Promise<[BigNumber]>; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + relayedMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + successfulMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + +@@ -208,26 +241,32 @@ export interface L2CrossDomainMessenger extends BaseContract { + messageNonce(overrides?: CallOverrides): Promise; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- relayedMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; ++ relayedMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- sentMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; ++ sentMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + successfulMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -239,29 +278,32 @@ export interface L2CrossDomainMessenger extends BaseContract { + messageNonce(overrides?: CallOverrides): Promise; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + relayedMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- sentMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; ++ sentMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + successfulMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -270,26 +312,28 @@ export interface L2CrossDomainMessenger extends BaseContract { + + filters: { + "FailedRelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + FailedRelayedMessage( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + + "RelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null + ): RelayedMessageEventFilter; +- RelayedMessage(msgHash?: BytesLike | null): RelayedMessageEventFilter; + + "SentMessage(address,address,bytes,uint256,uint256)"( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, + gasLimit?: null + ): SentMessageEventFilter; + SentMessage( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, +@@ -303,32 +347,32 @@ export interface L2CrossDomainMessenger extends BaseContract { + messageNonce(overrides?: CallOverrides): Promise; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + relayedMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + successfulMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -343,32 +387,32 @@ export interface L2CrossDomainMessenger extends BaseContract { + messageNonce(overrides?: CallOverrides): Promise; + + relayMessage( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + relayedMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + successfulMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridge.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridge.ts +new file mode 100644 +index 0000000..c502340 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridge.ts +@@ -0,0 +1,395 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface L2StandardBridgeInterface extends utils.Interface { ++ functions: { ++ "finalizeDeposit(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "l1TokenBridge()": FunctionFragment; ++ "messenger()": FunctionFragment; ++ "withdraw(address,uint256,uint32,bytes)": FunctionFragment; ++ "withdrawTo(address,address,uint256,uint32,bytes)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "finalizeDeposit" ++ | "l1TokenBridge" ++ | "messenger" ++ | "withdraw" ++ | "withdrawTo" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "finalizeDeposit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l1TokenBridge", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "messenger", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "withdraw", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "finalizeDeposit", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l1TokenBridge", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "withdrawTo", data: BytesLike): Result; ++ ++ events: { ++ "DepositFailed(address,address,address,address,uint256,bytes)": EventFragment; ++ "DepositFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "DepositFailed"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DepositFinalized"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; ++} ++ ++export interface DepositFailedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFailedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFailedEventObject ++>; ++ ++export type DepositFailedEventFilter = TypedEventFilter; ++ ++export interface DepositFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFinalizedEventObject ++>; ++ ++export type DepositFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawalInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type WithdrawalInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ WithdrawalInitiatedEventObject ++>; ++ ++export type WithdrawalInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface L2StandardBridge extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L2StandardBridgeInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ messenger(overrides?: CallOverrides): Promise<[string]>; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "DepositFailed(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ DepositFailed( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ ++ "DepositFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ DepositFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ WithdrawalInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ }; ++ ++ estimateGas: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridgeAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridgeAltL1.ts +new file mode 100644 +index 0000000..89167e2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardBridgeAltL1.ts +@@ -0,0 +1,395 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface L2StandardBridgeAltL1Interface extends utils.Interface { ++ functions: { ++ "finalizeDeposit(address,address,address,address,uint256,bytes)": FunctionFragment; ++ "l1TokenBridge()": FunctionFragment; ++ "messenger()": FunctionFragment; ++ "withdraw(address,uint256,uint32,bytes)": FunctionFragment; ++ "withdrawTo(address,address,uint256,uint32,bytes)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "finalizeDeposit" ++ | "l1TokenBridge" ++ | "messenger" ++ | "withdraw" ++ | "withdrawTo" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "finalizeDeposit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l1TokenBridge", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "messenger", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "withdraw", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawTo", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "finalizeDeposit", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l1TokenBridge", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "withdrawTo", data: BytesLike): Result; ++ ++ events: { ++ "DepositFailed(address,address,address,address,uint256,bytes)": EventFragment; ++ "DepositFinalized(address,address,address,address,uint256,bytes)": EventFragment; ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "DepositFailed"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DepositFinalized"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; ++} ++ ++export interface DepositFailedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFailedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFailedEventObject ++>; ++ ++export type DepositFailedEventFilter = TypedEventFilter; ++ ++export interface DepositFinalizedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type DepositFinalizedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ DepositFinalizedEventObject ++>; ++ ++export type DepositFinalizedEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawalInitiatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++ _from: string; ++ _to: string; ++ _amount: BigNumber; ++ _data: string; ++} ++export type WithdrawalInitiatedEvent = TypedEvent< ++ [string, string, string, string, BigNumber, string], ++ WithdrawalInitiatedEventObject ++>; ++ ++export type WithdrawalInitiatedEventFilter = ++ TypedEventFilter; ++ ++export interface L2StandardBridgeAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L2StandardBridgeAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ messenger(overrides?: CallOverrides): Promise<[string]>; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "DepositFailed(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ DepositFailed( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFailedEventFilter; ++ ++ "DepositFinalized(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ DepositFinalized( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): DepositFinalizedEventFilter; ++ ++ "WithdrawalInitiated(address,address,address,address,uint256,bytes)"( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ WithdrawalInitiated( ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null, ++ _from?: PromiseOrValue | null, ++ _to?: null, ++ _amount?: null, ++ _data?: null ++ ): WithdrawalInitiatedEventFilter; ++ }; ++ ++ estimateGas: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ finalizeDeposit( ++ _l1Token: PromiseOrValue, ++ _l2Token: PromiseOrValue, ++ _from: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1TokenBridge(overrides?: CallOverrides): Promise; ++ ++ messenger(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ _l2Token: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawTo( ++ _l2Token: PromiseOrValue, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ _l1Gas: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L2StandardTokenFactory.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardTokenFactory.ts +similarity index 53% +rename from node_modules/@eth-optimism/contracts/dist/types/L2StandardTokenFactory.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardTokenFactory.ts +index 4fb97be..1ecbe21 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/L2StandardTokenFactory.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/L2StandardTokenFactory.ts +@@ -1,38 +1,49 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface L2StandardTokenFactoryInterface +- extends ethers.utils.Interface { ++export interface L2StandardTokenFactoryInterface extends utils.Interface { + functions: { +- "createStandardL2Token(address,string,string)": FunctionFragment; ++ "createStandardL2Token(address,string,string,uint8)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "createStandardL2Token" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "createStandardL2Token", +- values: [string, string, string] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult( +@@ -47,9 +58,13 @@ export interface L2StandardTokenFactoryInterface + getEvent(nameOrSignatureOrTopic: "StandardL2TokenCreated"): EventFragment; + } + ++export interface StandardL2TokenCreatedEventObject { ++ _l1Token: string; ++ _l2Token: string; ++} + export type StandardL2TokenCreatedEvent = TypedEvent< + [string, string], +- { _l1Token: string; _l2Token: string } ++ StandardL2TokenCreatedEventObject + >; + + export type StandardL2TokenCreatedEventFilter = +@@ -83,55 +98,60 @@ export interface L2StandardTokenFactory extends BaseContract { + + functions: { + createStandardL2Token( +- _l1Token: string, +- _name: string, +- _symbol: string, +- overrides?: Overrides & { from?: string | Promise } ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + createStandardL2Token( +- _l1Token: string, +- _name: string, +- _symbol: string, +- overrides?: Overrides & { from?: string | Promise } ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + createStandardL2Token( +- _l1Token: string, +- _name: string, +- _symbol: string, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ _decimals: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "StandardL2TokenCreated(address,address)"( +- _l1Token?: string | null, +- _l2Token?: string | null ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null + ): StandardL2TokenCreatedEventFilter; + StandardL2TokenCreated( +- _l1Token?: string | null, +- _l2Token?: string | null ++ _l1Token?: PromiseOrValue | null, ++ _l2Token?: PromiseOrValue | null + ): StandardL2TokenCreatedEventFilter; + }; + + estimateGas: { + createStandardL2Token( +- _l1Token: string, +- _name: string, +- _symbol: string, +- overrides?: Overrides & { from?: string | Promise } ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + createStandardL2Token( +- _l1Token: string, +- _name: string, +- _symbol: string, +- overrides?: Overrides & { from?: string | Promise } ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/index.ts +new file mode 100644 +index 0000000..ada98de +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/messaging/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IL2CrossDomainMessenger } from "./IL2CrossDomainMessenger"; ++export type { IL2ERC20Bridge } from "./IL2ERC20Bridge"; ++export type { L2CrossDomainMessenger } from "./L2CrossDomainMessenger"; ++export type { L2StandardBridge } from "./L2StandardBridge"; ++export type { L2StandardBridgeAltL1 } from "./L2StandardBridgeAltL1"; ++export type { L2StandardTokenFactory } from "./L2StandardTokenFactory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCredit.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCredit.ts +new file mode 100644 +index 0000000..55f4297 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCredit.ts +@@ -0,0 +1,474 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface BobaTuringCreditInterface extends utils.Interface { ++ functions: { ++ "addBalanceTo(uint256,address)": FunctionFragment; ++ "getCreditAmount(address)": FunctionFragment; ++ "owner()": FunctionFragment; ++ "ownerRevenue()": FunctionFragment; ++ "prepaidBalance(address)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "turingPrice()": FunctionFragment; ++ "turingToken()": FunctionFragment; ++ "updateTuringPrice(uint256)": FunctionFragment; ++ "updateTuringToken(address)": FunctionFragment; ++ "withdrawRevenue(uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "addBalanceTo" ++ | "getCreditAmount" ++ | "owner" ++ | "ownerRevenue" ++ | "prepaidBalance" ++ | "transferOwnership" ++ | "turingPrice" ++ | "turingToken" ++ | "updateTuringPrice" ++ | "updateTuringToken" ++ | "withdrawRevenue" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "addBalanceTo", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCreditAmount", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "ownerRevenue", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "prepaidBalance", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "turingPrice", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "turingToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateTuringPrice", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateTuringToken", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawRevenue", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "addBalanceTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getCreditAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "ownerRevenue", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "prepaidBalance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "turingPrice", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "turingToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateTuringPrice", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateTuringToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawRevenue", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "AddBalanceTo(address,uint256,address)": EventFragment; ++ "TransferOwnership(address,address)": EventFragment; ++ "WithdrawRevenue(address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "AddBalanceTo"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "TransferOwnership"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawRevenue"): EventFragment; ++} ++ ++export interface AddBalanceToEventObject { ++ sender: string; ++ balanceAmount: BigNumber; ++ helperContractAddress: string; ++} ++export type AddBalanceToEvent = TypedEvent< ++ [string, BigNumber, string], ++ AddBalanceToEventObject ++>; ++ ++export type AddBalanceToEventFilter = TypedEventFilter; ++ ++export interface TransferOwnershipEventObject { ++ oldOwner: string; ++ newOwner: string; ++} ++export type TransferOwnershipEvent = TypedEvent< ++ [string, string], ++ TransferOwnershipEventObject ++>; ++ ++export type TransferOwnershipEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawRevenueEventObject { ++ sender: string; ++ withdrawAmount: BigNumber; ++} ++export type WithdrawRevenueEvent = TypedEvent< ++ [string, BigNumber], ++ WithdrawRevenueEventObject ++>; ++ ++export type WithdrawRevenueEventFilter = TypedEventFilter; ++ ++export interface BobaTuringCredit extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: BobaTuringCreditInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ turingToken(overrides?: CallOverrides): Promise<[string]>; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "AddBalanceTo(address,uint256,address)"( ++ sender?: null, ++ balanceAmount?: null, ++ helperContractAddress?: null ++ ): AddBalanceToEventFilter; ++ AddBalanceTo( ++ sender?: null, ++ balanceAmount?: null, ++ helperContractAddress?: null ++ ): AddBalanceToEventFilter; ++ ++ "TransferOwnership(address,address)"( ++ oldOwner?: null, ++ newOwner?: null ++ ): TransferOwnershipEventFilter; ++ TransferOwnership( ++ oldOwner?: null, ++ newOwner?: null ++ ): TransferOwnershipEventFilter; ++ ++ "WithdrawRevenue(address,uint256)"( ++ sender?: null, ++ withdrawAmount?: null ++ ): WithdrawRevenueEventFilter; ++ WithdrawRevenue( ++ sender?: null, ++ withdrawAmount?: null ++ ): WithdrawRevenueEventFilter; ++ }; ++ ++ estimateGas: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCreditAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCreditAltL1.ts +new file mode 100644 +index 0000000..021c087 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/BobaTuringCreditAltL1.ts +@@ -0,0 +1,475 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PayableOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface BobaTuringCreditAltL1Interface extends utils.Interface { ++ functions: { ++ "addBalanceTo(uint256,address)": FunctionFragment; ++ "getCreditAmount(address)": FunctionFragment; ++ "owner()": FunctionFragment; ++ "ownerRevenue()": FunctionFragment; ++ "prepaidBalance(address)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "turingPrice()": FunctionFragment; ++ "turingToken()": FunctionFragment; ++ "updateTuringPrice(uint256)": FunctionFragment; ++ "updateTuringToken(address)": FunctionFragment; ++ "withdrawRevenue(uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "addBalanceTo" ++ | "getCreditAmount" ++ | "owner" ++ | "ownerRevenue" ++ | "prepaidBalance" ++ | "transferOwnership" ++ | "turingPrice" ++ | "turingToken" ++ | "updateTuringPrice" ++ | "updateTuringToken" ++ | "withdrawRevenue" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "addBalanceTo", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCreditAmount", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "ownerRevenue", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "prepaidBalance", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "turingPrice", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "turingToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateTuringPrice", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateTuringToken", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawRevenue", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "addBalanceTo", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getCreditAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "ownerRevenue", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "prepaidBalance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "turingPrice", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "turingToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateTuringPrice", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateTuringToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawRevenue", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "AddBalanceTo(address,uint256,address)": EventFragment; ++ "TransferOwnership(address,address)": EventFragment; ++ "WithdrawRevenue(address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "AddBalanceTo"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "TransferOwnership"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawRevenue"): EventFragment; ++} ++ ++export interface AddBalanceToEventObject { ++ sender: string; ++ balanceAmount: BigNumber; ++ helperContractAddress: string; ++} ++export type AddBalanceToEvent = TypedEvent< ++ [string, BigNumber, string], ++ AddBalanceToEventObject ++>; ++ ++export type AddBalanceToEventFilter = TypedEventFilter; ++ ++export interface TransferOwnershipEventObject { ++ oldOwner: string; ++ newOwner: string; ++} ++export type TransferOwnershipEvent = TypedEvent< ++ [string, string], ++ TransferOwnershipEventObject ++>; ++ ++export type TransferOwnershipEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawRevenueEventObject { ++ sender: string; ++ withdrawAmount: BigNumber; ++} ++export type WithdrawRevenueEvent = TypedEvent< ++ [string, BigNumber], ++ WithdrawRevenueEventObject ++>; ++ ++export type WithdrawRevenueEventFilter = TypedEventFilter; ++ ++export interface BobaTuringCreditAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: BobaTuringCreditAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ turingToken(overrides?: CallOverrides): Promise<[string]>; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "AddBalanceTo(address,uint256,address)"( ++ sender?: null, ++ balanceAmount?: null, ++ helperContractAddress?: null ++ ): AddBalanceToEventFilter; ++ AddBalanceTo( ++ sender?: null, ++ balanceAmount?: null, ++ helperContractAddress?: null ++ ): AddBalanceToEventFilter; ++ ++ "TransferOwnership(address,address)"( ++ oldOwner?: null, ++ newOwner?: null ++ ): TransferOwnershipEventFilter; ++ TransferOwnership( ++ oldOwner?: null, ++ newOwner?: null ++ ): TransferOwnershipEventFilter; ++ ++ "WithdrawRevenue(address,uint256)"( ++ sender?: null, ++ withdrawAmount?: null ++ ): WithdrawRevenueEventFilter; ++ WithdrawRevenue( ++ sender?: null, ++ withdrawAmount?: null ++ ): WithdrawRevenueEventFilter; ++ }; ++ ++ estimateGas: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ addBalanceTo( ++ _addBalanceAmount: PromiseOrValue, ++ _helperContractAddress: PromiseOrValue, ++ overrides?: PayableOverrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ getCreditAmount( ++ _helperContractAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ ownerRevenue(overrides?: CallOverrides): Promise; ++ ++ prepaidBalance( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ turingPrice(overrides?: CallOverrides): Promise; ++ ++ turingToken(overrides?: CallOverrides): Promise; ++ ++ updateTuringPrice( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateTuringToken( ++ _turingToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawRevenue( ++ _withdrawAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracle.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracle.ts +new file mode 100644 +index 0000000..28ea950 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracle.ts +@@ -0,0 +1,1108 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface Boba_GasPriceOracleInterface extends utils.Interface { ++ functions: { ++ "MIN_WITHDRAWAL_AMOUNT()": FunctionFragment; ++ "bobaFeeTokenUsers(address)": FunctionFragment; ++ "feeWallet()": FunctionFragment; ++ "gasPriceOracleAddress()": FunctionFragment; ++ "getBOBAForSwap()": FunctionFragment; ++ "getL1BobaFee(bytes)": FunctionFragment; ++ "initialize(address,address)": FunctionFragment; ++ "l2BobaAddress()": FunctionFragment; ++ "marketPriceRatio()": FunctionFragment; ++ "maxPriceRatio()": FunctionFragment; ++ "metaTransactionFee()": FunctionFragment; ++ "minPriceRatio()": FunctionFragment; ++ "owner()": FunctionFragment; ++ "priceRatio()": FunctionFragment; ++ "receivedETHAmount()": FunctionFragment; ++ "swapBOBAForETHMetaTransaction(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "updateGasPriceOracleAddress(address)": FunctionFragment; ++ "updateMaxPriceRatio(uint256)": FunctionFragment; ++ "updateMetaTransactionFee(uint256)": FunctionFragment; ++ "updateMinPriceRatio(uint256)": FunctionFragment; ++ "updatePriceRatio(uint256,uint256)": FunctionFragment; ++ "updateReceivedETHAmount(uint256)": FunctionFragment; ++ "useBobaAsFeeToken()": FunctionFragment; ++ "useETHAsFeeToken()": FunctionFragment; ++ "withdrawBOBA()": FunctionFragment; ++ "withdrawETH()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "MIN_WITHDRAWAL_AMOUNT" ++ | "bobaFeeTokenUsers" ++ | "feeWallet" ++ | "gasPriceOracleAddress" ++ | "getBOBAForSwap" ++ | "getL1BobaFee" ++ | "initialize" ++ | "l2BobaAddress" ++ | "marketPriceRatio" ++ | "maxPriceRatio" ++ | "metaTransactionFee" ++ | "minPriceRatio" ++ | "owner" ++ | "priceRatio" ++ | "receivedETHAmount" ++ | "swapBOBAForETHMetaTransaction" ++ | "transferOwnership" ++ | "updateGasPriceOracleAddress" ++ | "updateMaxPriceRatio" ++ | "updateMetaTransactionFee" ++ | "updateMinPriceRatio" ++ | "updatePriceRatio" ++ | "updateReceivedETHAmount" ++ | "useBobaAsFeeToken" ++ | "useETHAsFeeToken" ++ | "withdrawBOBA" ++ | "withdrawETH" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "bobaFeeTokenUsers", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "feeWallet", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "gasPriceOracleAddress", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getBOBAForSwap", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getL1BobaFee", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l2BobaAddress", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "marketPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "maxPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "metaTransactionFee", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "minPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "priceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "receivedETHAmount", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "swapBOBAForETHMetaTransaction", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateGasPriceOracleAddress", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMaxPriceRatio", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMetaTransactionFee", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMinPriceRatio", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updatePriceRatio", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateReceivedETHAmount", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "useBobaAsFeeToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "useETHAsFeeToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawBOBA", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawETH", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "bobaFeeTokenUsers", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "feeWallet", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "gasPriceOracleAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getBOBAForSwap", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getL1BobaFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "l2BobaAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "marketPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "maxPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "metaTransactionFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "minPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "priceRatio", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "receivedETHAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "swapBOBAForETHMetaTransaction", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateGasPriceOracleAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMaxPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMetaTransactionFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMinPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updatePriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateReceivedETHAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "useBobaAsFeeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "useETHAsFeeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawBOBA", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawETH", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "SwapBOBAForETHMetaTransaction(address)": EventFragment; ++ "TransferOwnership(address,address)": EventFragment; ++ "UpdateGasPriceOracleAddress(address,address)": EventFragment; ++ "UpdateMaxPriceRatio(address,uint256)": EventFragment; ++ "UpdateMetaTransactionFee(address,uint256)": EventFragment; ++ "UpdateMinPriceRatio(address,uint256)": EventFragment; ++ "UpdatePriceRatio(address,uint256,uint256)": EventFragment; ++ "UpdateReceivedETHAmount(address,uint256)": EventFragment; ++ "UseBobaAsFeeToken(address)": EventFragment; ++ "UseETHAsFeeToken(address)": EventFragment; ++ "WithdrawBOBA(address,address)": EventFragment; ++ "WithdrawETH(address,address)": EventFragment; ++ }; ++ ++ getEvent( ++ nameOrSignatureOrTopic: "SwapBOBAForETHMetaTransaction" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "TransferOwnership"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "UpdateGasPriceOracleAddress" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMaxPriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMetaTransactionFee"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMinPriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdatePriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateReceivedETHAmount"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UseBobaAsFeeToken"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UseETHAsFeeToken"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawBOBA"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawETH"): EventFragment; ++} ++ ++export interface SwapBOBAForETHMetaTransactionEventObject { ++ arg0: string; ++} ++export type SwapBOBAForETHMetaTransactionEvent = TypedEvent< ++ [string], ++ SwapBOBAForETHMetaTransactionEventObject ++>; ++ ++export type SwapBOBAForETHMetaTransactionEventFilter = ++ TypedEventFilter; ++ ++export interface TransferOwnershipEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type TransferOwnershipEvent = TypedEvent< ++ [string, string], ++ TransferOwnershipEventObject ++>; ++ ++export type TransferOwnershipEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateGasPriceOracleAddressEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type UpdateGasPriceOracleAddressEvent = TypedEvent< ++ [string, string], ++ UpdateGasPriceOracleAddressEventObject ++>; ++ ++export type UpdateGasPriceOracleAddressEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMaxPriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMaxPriceRatioEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMaxPriceRatioEventObject ++>; ++ ++export type UpdateMaxPriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMetaTransactionFeeEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMetaTransactionFeeEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMetaTransactionFeeEventObject ++>; ++ ++export type UpdateMetaTransactionFeeEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMinPriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMinPriceRatioEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMinPriceRatioEventObject ++>; ++ ++export type UpdateMinPriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdatePriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++ arg2: BigNumber; ++} ++export type UpdatePriceRatioEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ UpdatePriceRatioEventObject ++>; ++ ++export type UpdatePriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateReceivedETHAmountEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateReceivedETHAmountEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateReceivedETHAmountEventObject ++>; ++ ++export type UpdateReceivedETHAmountEventFilter = ++ TypedEventFilter; ++ ++export interface UseBobaAsFeeTokenEventObject { ++ arg0: string; ++} ++export type UseBobaAsFeeTokenEvent = TypedEvent< ++ [string], ++ UseBobaAsFeeTokenEventObject ++>; ++ ++export type UseBobaAsFeeTokenEventFilter = ++ TypedEventFilter; ++ ++export interface UseETHAsFeeTokenEventObject { ++ arg0: string; ++} ++export type UseETHAsFeeTokenEvent = TypedEvent< ++ [string], ++ UseETHAsFeeTokenEventObject ++>; ++ ++export type UseETHAsFeeTokenEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawBOBAEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type WithdrawBOBAEvent = TypedEvent< ++ [string, string], ++ WithdrawBOBAEventObject ++>; ++ ++export type WithdrawBOBAEventFilter = TypedEventFilter; ++ ++export interface WithdrawETHEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type WithdrawETHEvent = TypedEvent< ++ [string, string], ++ WithdrawETHEventObject ++>; ++ ++export type WithdrawETHEventFilter = TypedEventFilter; ++ ++export interface Boba_GasPriceOracle extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: Boba_GasPriceOracleInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ bobaFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ feeWallet(overrides?: CallOverrides): Promise<[string]>; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise<[string]>; ++ ++ getBOBAForSwap(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ getL1BobaFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _l2BobaAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2BobaAddress(overrides?: CallOverrides): Promise<[string]>; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ priceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ receivedETHAmount(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ swapBOBAForETHMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedETHAmount( ++ _receivedETHAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useETHAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawETH( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ bobaFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getBOBAForSwap(overrides?: CallOverrides): Promise; ++ ++ getL1BobaFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _l2BobaAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2BobaAddress(overrides?: CallOverrides): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedETHAmount(overrides?: CallOverrides): Promise; ++ ++ swapBOBAForETHMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedETHAmount( ++ _receivedETHAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useETHAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawETH( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ bobaFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getBOBAForSwap(overrides?: CallOverrides): Promise; ++ ++ getL1BobaFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _l2BobaAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l2BobaAddress(overrides?: CallOverrides): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedETHAmount(overrides?: CallOverrides): Promise; ++ ++ swapBOBAForETHMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateReceivedETHAmount( ++ _receivedETHAmount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ useBobaAsFeeToken(overrides?: CallOverrides): Promise; ++ ++ useETHAsFeeToken(overrides?: CallOverrides): Promise; ++ ++ withdrawBOBA(overrides?: CallOverrides): Promise; ++ ++ withdrawETH(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "SwapBOBAForETHMetaTransaction(address)"( ++ arg0?: null ++ ): SwapBOBAForETHMetaTransactionEventFilter; ++ SwapBOBAForETHMetaTransaction( ++ arg0?: null ++ ): SwapBOBAForETHMetaTransactionEventFilter; ++ ++ "TransferOwnership(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): TransferOwnershipEventFilter; ++ TransferOwnership(arg0?: null, arg1?: null): TransferOwnershipEventFilter; ++ ++ "UpdateGasPriceOracleAddress(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateGasPriceOracleAddressEventFilter; ++ UpdateGasPriceOracleAddress( ++ arg0?: null, ++ arg1?: null ++ ): UpdateGasPriceOracleAddressEventFilter; ++ ++ "UpdateMaxPriceRatio(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMaxPriceRatioEventFilter; ++ UpdateMaxPriceRatio( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMaxPriceRatioEventFilter; ++ ++ "UpdateMetaTransactionFee(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMetaTransactionFeeEventFilter; ++ UpdateMetaTransactionFee( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMetaTransactionFeeEventFilter; ++ ++ "UpdateMinPriceRatio(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMinPriceRatioEventFilter; ++ UpdateMinPriceRatio( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMinPriceRatioEventFilter; ++ ++ "UpdatePriceRatio(address,uint256,uint256)"( ++ arg0?: null, ++ arg1?: null, ++ arg2?: null ++ ): UpdatePriceRatioEventFilter; ++ UpdatePriceRatio( ++ arg0?: null, ++ arg1?: null, ++ arg2?: null ++ ): UpdatePriceRatioEventFilter; ++ ++ "UpdateReceivedETHAmount(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateReceivedETHAmountEventFilter; ++ UpdateReceivedETHAmount( ++ arg0?: null, ++ arg1?: null ++ ): UpdateReceivedETHAmountEventFilter; ++ ++ "UseBobaAsFeeToken(address)"(arg0?: null): UseBobaAsFeeTokenEventFilter; ++ UseBobaAsFeeToken(arg0?: null): UseBobaAsFeeTokenEventFilter; ++ ++ "UseETHAsFeeToken(address)"(arg0?: null): UseETHAsFeeTokenEventFilter; ++ UseETHAsFeeToken(arg0?: null): UseETHAsFeeTokenEventFilter; ++ ++ "WithdrawBOBA(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): WithdrawBOBAEventFilter; ++ WithdrawBOBA(arg0?: null, arg1?: null): WithdrawBOBAEventFilter; ++ ++ "WithdrawETH(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): WithdrawETHEventFilter; ++ WithdrawETH(arg0?: null, arg1?: null): WithdrawETHEventFilter; ++ }; ++ ++ estimateGas: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ bobaFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getBOBAForSwap(overrides?: CallOverrides): Promise; ++ ++ getL1BobaFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _l2BobaAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2BobaAddress(overrides?: CallOverrides): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedETHAmount(overrides?: CallOverrides): Promise; ++ ++ swapBOBAForETHMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedETHAmount( ++ _receivedETHAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useETHAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawETH( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ MIN_WITHDRAWAL_AMOUNT( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ bobaFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getBOBAForSwap(overrides?: CallOverrides): Promise; ++ ++ getL1BobaFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _l2BobaAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l2BobaAddress(overrides?: CallOverrides): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedETHAmount(overrides?: CallOverrides): Promise; ++ ++ swapBOBAForETHMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedETHAmount( ++ _receivedETHAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useETHAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawETH( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.ts +new file mode 100644 +index 0000000..795243f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/Boba_GasPriceOracleAltL1.ts +@@ -0,0 +1,1276 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface Boba_GasPriceOracleAltL1Interface extends utils.Interface { ++ functions: { ++ "MIN_WITHDRAWAL_AMOUNT()": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "feeWallet()": FunctionFragment; ++ "gasPriceOracleAddress()": FunctionFragment; ++ "getSecondaryFeeTokenFee(bytes)": FunctionFragment; ++ "getSecondaryFeeTokenForSwap()": FunctionFragment; ++ "initialize(address,address)": FunctionFragment; ++ "marketPriceRatio()": FunctionFragment; ++ "maxPriceRatio()": FunctionFragment; ++ "metaTransactionFee()": FunctionFragment; ++ "minPriceRatio()": FunctionFragment; ++ "owner()": FunctionFragment; ++ "priceRatio()": FunctionFragment; ++ "receivedBOBAAmount()": FunctionFragment; ++ "secondaryFeeTokenAddress()": FunctionFragment; ++ "secondaryFeeTokenMinimum()": FunctionFragment; ++ "secondaryFeeTokenUsers(address)": FunctionFragment; ++ "swapSecondaryFeeTokenForBOBAMetaTransaction(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "transferOwnership(address)": FunctionFragment; ++ "updateDecimals(uint256)": FunctionFragment; ++ "updateGasPriceOracleAddress(address)": FunctionFragment; ++ "updateMaxPriceRatio(uint256)": FunctionFragment; ++ "updateMetaTransactionFee(uint256)": FunctionFragment; ++ "updateMinPriceRatio(uint256)": FunctionFragment; ++ "updatePriceRatio(uint256,uint256)": FunctionFragment; ++ "updateReceivedBOBAAmount(uint256)": FunctionFragment; ++ "updateSecondaryFeeTokenMinimum(uint256)": FunctionFragment; ++ "useBobaAsFeeToken()": FunctionFragment; ++ "useSecondaryFeeTokenAsFeeToken()": FunctionFragment; ++ "withdrawBOBA()": FunctionFragment; ++ "withdrawSecondaryFeeToken()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "MIN_WITHDRAWAL_AMOUNT" ++ | "decimals" ++ | "feeWallet" ++ | "gasPriceOracleAddress" ++ | "getSecondaryFeeTokenFee" ++ | "getSecondaryFeeTokenForSwap" ++ | "initialize" ++ | "marketPriceRatio" ++ | "maxPriceRatio" ++ | "metaTransactionFee" ++ | "minPriceRatio" ++ | "owner" ++ | "priceRatio" ++ | "receivedBOBAAmount" ++ | "secondaryFeeTokenAddress" ++ | "secondaryFeeTokenMinimum" ++ | "secondaryFeeTokenUsers" ++ | "swapSecondaryFeeTokenForBOBAMetaTransaction" ++ | "transferOwnership" ++ | "updateDecimals" ++ | "updateGasPriceOracleAddress" ++ | "updateMaxPriceRatio" ++ | "updateMetaTransactionFee" ++ | "updateMinPriceRatio" ++ | "updatePriceRatio" ++ | "updateReceivedBOBAAmount" ++ | "updateSecondaryFeeTokenMinimum" ++ | "useBobaAsFeeToken" ++ | "useSecondaryFeeTokenAsFeeToken" ++ | "withdrawBOBA" ++ | "withdrawSecondaryFeeToken" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData(functionFragment: "feeWallet", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "gasPriceOracleAddress", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getSecondaryFeeTokenFee", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getSecondaryFeeTokenForSwap", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "initialize", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "marketPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "maxPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "metaTransactionFee", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "minPriceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "owner", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "priceRatio", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "receivedBOBAAmount", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "secondaryFeeTokenAddress", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "secondaryFeeTokenMinimum", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "secondaryFeeTokenUsers", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "swapSecondaryFeeTokenForBOBAMetaTransaction", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateDecimals", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateGasPriceOracleAddress", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMaxPriceRatio", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMetaTransactionFee", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateMinPriceRatio", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updatePriceRatio", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateReceivedBOBAAmount", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "updateSecondaryFeeTokenMinimum", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "useBobaAsFeeToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "useSecondaryFeeTokenAsFeeToken", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawBOBA", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "withdrawSecondaryFeeToken", ++ values?: undefined ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "feeWallet", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "gasPriceOracleAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getSecondaryFeeTokenFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getSecondaryFeeTokenForSwap", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "marketPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "maxPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "metaTransactionFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "minPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "priceRatio", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "receivedBOBAAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "secondaryFeeTokenAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "secondaryFeeTokenMinimum", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "secondaryFeeTokenUsers", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "swapSecondaryFeeTokenForBOBAMetaTransaction", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferOwnership", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateDecimals", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateGasPriceOracleAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMaxPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMetaTransactionFee", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateMinPriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updatePriceRatio", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateReceivedBOBAAmount", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "updateSecondaryFeeTokenMinimum", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "useBobaAsFeeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "useSecondaryFeeTokenAsFeeToken", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawBOBA", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "withdrawSecondaryFeeToken", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "SwapSecondaryFeeTokenForBOBAMetaTransaction(address)": EventFragment; ++ "TransferOwnership(address,address)": EventFragment; ++ "UpdateDecimals(address,uint256)": EventFragment; ++ "UpdateGasPriceOracleAddress(address,address)": EventFragment; ++ "UpdateMaxPriceRatio(address,uint256)": EventFragment; ++ "UpdateMetaTransactionFee(address,uint256)": EventFragment; ++ "UpdateMinPriceRatio(address,uint256)": EventFragment; ++ "UpdatePriceRatio(address,uint256,uint256)": EventFragment; ++ "UpdateReceivedBOBAAmount(address,uint256)": EventFragment; ++ "UpdateSecondaryFeeTokenMinimum(uint256,uint256)": EventFragment; ++ "UseBOBAAsFeeToken(address)": EventFragment; ++ "UseSecondaryFeeTokenAsFeeToken(address)": EventFragment; ++ "WithdrawBOBA(address,address)": EventFragment; ++ "WithdrawSecondaryFeeToken(address,address)": EventFragment; ++ }; ++ ++ getEvent( ++ nameOrSignatureOrTopic: "SwapSecondaryFeeTokenForBOBAMetaTransaction" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "TransferOwnership"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateDecimals"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "UpdateGasPriceOracleAddress" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMaxPriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMetaTransactionFee"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateMinPriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdatePriceRatio"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UpdateReceivedBOBAAmount"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "UpdateSecondaryFeeTokenMinimum" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "UseBOBAAsFeeToken"): EventFragment; ++ getEvent( ++ nameOrSignatureOrTopic: "UseSecondaryFeeTokenAsFeeToken" ++ ): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawBOBA"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "WithdrawSecondaryFeeToken"): EventFragment; ++} ++ ++export interface SwapSecondaryFeeTokenForBOBAMetaTransactionEventObject { ++ arg0: string; ++} ++export type SwapSecondaryFeeTokenForBOBAMetaTransactionEvent = TypedEvent< ++ [string], ++ SwapSecondaryFeeTokenForBOBAMetaTransactionEventObject ++>; ++ ++export type SwapSecondaryFeeTokenForBOBAMetaTransactionEventFilter = ++ TypedEventFilter; ++ ++export interface TransferOwnershipEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type TransferOwnershipEvent = TypedEvent< ++ [string, string], ++ TransferOwnershipEventObject ++>; ++ ++export type TransferOwnershipEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateDecimalsEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateDecimalsEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateDecimalsEventObject ++>; ++ ++export type UpdateDecimalsEventFilter = TypedEventFilter; ++ ++export interface UpdateGasPriceOracleAddressEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type UpdateGasPriceOracleAddressEvent = TypedEvent< ++ [string, string], ++ UpdateGasPriceOracleAddressEventObject ++>; ++ ++export type UpdateGasPriceOracleAddressEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMaxPriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMaxPriceRatioEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMaxPriceRatioEventObject ++>; ++ ++export type UpdateMaxPriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMetaTransactionFeeEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMetaTransactionFeeEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMetaTransactionFeeEventObject ++>; ++ ++export type UpdateMetaTransactionFeeEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateMinPriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateMinPriceRatioEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateMinPriceRatioEventObject ++>; ++ ++export type UpdateMinPriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdatePriceRatioEventObject { ++ arg0: string; ++ arg1: BigNumber; ++ arg2: BigNumber; ++} ++export type UpdatePriceRatioEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ UpdatePriceRatioEventObject ++>; ++ ++export type UpdatePriceRatioEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateReceivedBOBAAmountEventObject { ++ arg0: string; ++ arg1: BigNumber; ++} ++export type UpdateReceivedBOBAAmountEvent = TypedEvent< ++ [string, BigNumber], ++ UpdateReceivedBOBAAmountEventObject ++>; ++ ++export type UpdateReceivedBOBAAmountEventFilter = ++ TypedEventFilter; ++ ++export interface UpdateSecondaryFeeTokenMinimumEventObject { ++ arg0: BigNumber; ++ arg1: BigNumber; ++} ++export type UpdateSecondaryFeeTokenMinimumEvent = TypedEvent< ++ [BigNumber, BigNumber], ++ UpdateSecondaryFeeTokenMinimumEventObject ++>; ++ ++export type UpdateSecondaryFeeTokenMinimumEventFilter = ++ TypedEventFilter; ++ ++export interface UseBOBAAsFeeTokenEventObject { ++ arg0: string; ++} ++export type UseBOBAAsFeeTokenEvent = TypedEvent< ++ [string], ++ UseBOBAAsFeeTokenEventObject ++>; ++ ++export type UseBOBAAsFeeTokenEventFilter = ++ TypedEventFilter; ++ ++export interface UseSecondaryFeeTokenAsFeeTokenEventObject { ++ arg0: string; ++} ++export type UseSecondaryFeeTokenAsFeeTokenEvent = TypedEvent< ++ [string], ++ UseSecondaryFeeTokenAsFeeTokenEventObject ++>; ++ ++export type UseSecondaryFeeTokenAsFeeTokenEventFilter = ++ TypedEventFilter; ++ ++export interface WithdrawBOBAEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type WithdrawBOBAEvent = TypedEvent< ++ [string, string], ++ WithdrawBOBAEventObject ++>; ++ ++export type WithdrawBOBAEventFilter = TypedEventFilter; ++ ++export interface WithdrawSecondaryFeeTokenEventObject { ++ arg0: string; ++ arg1: string; ++} ++export type WithdrawSecondaryFeeTokenEvent = TypedEvent< ++ [string, string], ++ WithdrawSecondaryFeeTokenEventObject ++>; ++ ++export type WithdrawSecondaryFeeTokenEventFilter = ++ TypedEventFilter; ++ ++export interface Boba_GasPriceOracleAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: Boba_GasPriceOracleAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ feeWallet(overrides?: CallOverrides): Promise<[string]>; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise<[string]>; ++ ++ getSecondaryFeeTokenFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getSecondaryFeeTokenForSwap( ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _secondaryFeeToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ owner(overrides?: CallOverrides): Promise<[string]>; ++ ++ priceRatio(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ receivedBOBAAmount(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ secondaryFeeTokenAddress(overrides?: CallOverrides): Promise<[string]>; ++ ++ secondaryFeeTokenMinimum(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ secondaryFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ swapSecondaryFeeTokenForBOBAMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateDecimals( ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedBOBAAmount( ++ _receivedBOBAAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateSecondaryFeeTokenMinimum( ++ _secondaryFeeTokenMinimum: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useSecondaryFeeTokenAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawSecondaryFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getSecondaryFeeTokenFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getSecondaryFeeTokenForSwap(overrides?: CallOverrides): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _secondaryFeeToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedBOBAAmount(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenAddress(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenMinimum(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ swapSecondaryFeeTokenForBOBAMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateDecimals( ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedBOBAAmount( ++ _receivedBOBAAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateSecondaryFeeTokenMinimum( ++ _secondaryFeeTokenMinimum: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useSecondaryFeeTokenAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawSecondaryFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getSecondaryFeeTokenFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getSecondaryFeeTokenForSwap(overrides?: CallOverrides): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _secondaryFeeToken: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedBOBAAmount(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenAddress(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenMinimum(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ swapSecondaryFeeTokenForBOBAMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateDecimals( ++ _decimals: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateReceivedBOBAAmount( ++ _receivedBOBAAmount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ updateSecondaryFeeTokenMinimum( ++ _secondaryFeeTokenMinimum: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ useBobaAsFeeToken(overrides?: CallOverrides): Promise; ++ ++ useSecondaryFeeTokenAsFeeToken(overrides?: CallOverrides): Promise; ++ ++ withdrawBOBA(overrides?: CallOverrides): Promise; ++ ++ withdrawSecondaryFeeToken(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: { ++ "SwapSecondaryFeeTokenForBOBAMetaTransaction(address)"( ++ arg0?: null ++ ): SwapSecondaryFeeTokenForBOBAMetaTransactionEventFilter; ++ SwapSecondaryFeeTokenForBOBAMetaTransaction( ++ arg0?: null ++ ): SwapSecondaryFeeTokenForBOBAMetaTransactionEventFilter; ++ ++ "TransferOwnership(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): TransferOwnershipEventFilter; ++ TransferOwnership(arg0?: null, arg1?: null): TransferOwnershipEventFilter; ++ ++ "UpdateDecimals(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateDecimalsEventFilter; ++ UpdateDecimals(arg0?: null, arg1?: null): UpdateDecimalsEventFilter; ++ ++ "UpdateGasPriceOracleAddress(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateGasPriceOracleAddressEventFilter; ++ UpdateGasPriceOracleAddress( ++ arg0?: null, ++ arg1?: null ++ ): UpdateGasPriceOracleAddressEventFilter; ++ ++ "UpdateMaxPriceRatio(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMaxPriceRatioEventFilter; ++ UpdateMaxPriceRatio( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMaxPriceRatioEventFilter; ++ ++ "UpdateMetaTransactionFee(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMetaTransactionFeeEventFilter; ++ UpdateMetaTransactionFee( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMetaTransactionFeeEventFilter; ++ ++ "UpdateMinPriceRatio(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMinPriceRatioEventFilter; ++ UpdateMinPriceRatio( ++ arg0?: null, ++ arg1?: null ++ ): UpdateMinPriceRatioEventFilter; ++ ++ "UpdatePriceRatio(address,uint256,uint256)"( ++ arg0?: null, ++ arg1?: null, ++ arg2?: null ++ ): UpdatePriceRatioEventFilter; ++ UpdatePriceRatio( ++ arg0?: null, ++ arg1?: null, ++ arg2?: null ++ ): UpdatePriceRatioEventFilter; ++ ++ "UpdateReceivedBOBAAmount(address,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateReceivedBOBAAmountEventFilter; ++ UpdateReceivedBOBAAmount( ++ arg0?: null, ++ arg1?: null ++ ): UpdateReceivedBOBAAmountEventFilter; ++ ++ "UpdateSecondaryFeeTokenMinimum(uint256,uint256)"( ++ arg0?: null, ++ arg1?: null ++ ): UpdateSecondaryFeeTokenMinimumEventFilter; ++ UpdateSecondaryFeeTokenMinimum( ++ arg0?: null, ++ arg1?: null ++ ): UpdateSecondaryFeeTokenMinimumEventFilter; ++ ++ "UseBOBAAsFeeToken(address)"(arg0?: null): UseBOBAAsFeeTokenEventFilter; ++ UseBOBAAsFeeToken(arg0?: null): UseBOBAAsFeeTokenEventFilter; ++ ++ "UseSecondaryFeeTokenAsFeeToken(address)"( ++ arg0?: null ++ ): UseSecondaryFeeTokenAsFeeTokenEventFilter; ++ UseSecondaryFeeTokenAsFeeToken( ++ arg0?: null ++ ): UseSecondaryFeeTokenAsFeeTokenEventFilter; ++ ++ "WithdrawBOBA(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): WithdrawBOBAEventFilter; ++ WithdrawBOBA(arg0?: null, arg1?: null): WithdrawBOBAEventFilter; ++ ++ "WithdrawSecondaryFeeToken(address,address)"( ++ arg0?: null, ++ arg1?: null ++ ): WithdrawSecondaryFeeTokenEventFilter; ++ WithdrawSecondaryFeeToken( ++ arg0?: null, ++ arg1?: null ++ ): WithdrawSecondaryFeeTokenEventFilter; ++ }; ++ ++ estimateGas: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress(overrides?: CallOverrides): Promise; ++ ++ getSecondaryFeeTokenFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getSecondaryFeeTokenForSwap(overrides?: CallOverrides): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _secondaryFeeToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee(overrides?: CallOverrides): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedBOBAAmount(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenAddress(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenMinimum(overrides?: CallOverrides): Promise; ++ ++ secondaryFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ swapSecondaryFeeTokenForBOBAMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateDecimals( ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedBOBAAmount( ++ _receivedBOBAAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateSecondaryFeeTokenMinimum( ++ _secondaryFeeTokenMinimum: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useSecondaryFeeTokenAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawSecondaryFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ MIN_WITHDRAWAL_AMOUNT( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ feeWallet(overrides?: CallOverrides): Promise; ++ ++ gasPriceOracleAddress( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getSecondaryFeeTokenFee( ++ _txData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getSecondaryFeeTokenForSwap( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ initialize( ++ _feeWallet: PromiseOrValue, ++ _secondaryFeeToken: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ marketPriceRatio(overrides?: CallOverrides): Promise; ++ ++ maxPriceRatio(overrides?: CallOverrides): Promise; ++ ++ metaTransactionFee( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ minPriceRatio(overrides?: CallOverrides): Promise; ++ ++ owner(overrides?: CallOverrides): Promise; ++ ++ priceRatio(overrides?: CallOverrides): Promise; ++ ++ receivedBOBAAmount( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ secondaryFeeTokenAddress( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ secondaryFeeTokenMinimum( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ secondaryFeeTokenUsers( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ swapSecondaryFeeTokenForBOBAMetaTransaction( ++ tokenOwner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateDecimals( ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateGasPriceOracleAddress( ++ _gasPriceOracleAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMaxPriceRatio( ++ _maxPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMetaTransactionFee( ++ _metaTransactionFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateMinPriceRatio( ++ _minPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updatePriceRatio( ++ _priceRatio: PromiseOrValue, ++ _marketPriceRatio: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateReceivedBOBAAmount( ++ _receivedBOBAAmount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ updateSecondaryFeeTokenMinimum( ++ _secondaryFeeTokenMinimum: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useBobaAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ useSecondaryFeeTokenAsFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawBOBA( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ withdrawSecondaryFeeToken( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IOVML1BlockNumber.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L1BlockNumber.ts +similarity index 79% +rename from node_modules/@eth-optimism/contracts/dist/types/IOVML1BlockNumber.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L1BlockNumber.ts +index 8aac31c..10bced3 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IOVML1BlockNumber.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L1BlockNumber.ts +@@ -1,33 +1,32 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface IOVML1BlockNumberInterface extends ethers.utils.Interface { ++export interface IOVM_L1BlockNumberInterface extends utils.Interface { + functions: { + "getL1BlockNumber()": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "getL1BlockNumber"): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "getL1BlockNumber", + values?: undefined +@@ -41,12 +40,12 @@ export interface IOVML1BlockNumberInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface IOVML1BlockNumber extends BaseContract { ++export interface IOVM_L1BlockNumber extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: IOVML1BlockNumberInterface; ++ interface: IOVM_L1BlockNumberInterface; + + queryFilter( + event: TypedEventFilter, +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IOVML2ToL1MessagePasser.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser.ts +similarity index 66% +rename from node_modules/@eth-optimism/contracts/dist/types/IOVML2ToL1MessagePasser.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser.ts +index 01dd487..4d667fb 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IOVML2ToL1MessagePasser.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser.ts +@@ -1,38 +1,41 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface IOVML2ToL1MessagePasserInterface +- extends ethers.utils.Interface { ++export interface IOVM_L2ToL1MessagePasserInterface extends utils.Interface { + functions: { + "passMessageToL1(bytes)": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "passMessageToL1"): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "passMessageToL1", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -47,19 +50,24 @@ export interface IOVML2ToL1MessagePasserInterface + getEvent(nameOrSignatureOrTopic: "L2ToL1Message"): EventFragment; + } + ++export interface L2ToL1MessageEventObject { ++ _nonce: BigNumber; ++ _sender: string; ++ _data: string; ++} + export type L2ToL1MessageEvent = TypedEvent< + [BigNumber, string, string], +- { _nonce: BigNumber; _sender: string; _data: string } ++ L2ToL1MessageEventObject + >; + + export type L2ToL1MessageEventFilter = TypedEventFilter; + +-export interface IOVML2ToL1MessagePasser extends BaseContract { ++export interface IOVM_L2ToL1MessagePasser extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: IOVML2ToL1MessagePasserInterface; ++ interface: IOVM_L2ToL1MessagePasserInterface; + + queryFilter( + event: TypedEventFilter, +@@ -82,19 +90,19 @@ export interface IOVML2ToL1MessagePasser extends BaseContract { + + functions: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + passMessageToL1( +- _message: BytesLike, ++ _message: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -114,15 +122,15 @@ export interface IOVML2ToL1MessagePasser extends BaseContract { + + estimateGas: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OVMETH.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_BOBA.ts +similarity index 54% +rename from node_modules/@eth-optimism/contracts/dist/types/OVMETH.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_BOBA.ts +index bb12965..e774674 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OVMETH.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_BOBA.ts +@@ -1,30 +1,33 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OVMETHInterface extends ethers.utils.Interface { ++export interface L2_BOBAInterface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; +@@ -44,38 +47,61 @@ export interface OVMETHInterface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "l1Token" ++ | "l2Bridge" ++ | "mint" ++ | "name" ++ | "supportsInterface" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData( + functionFragment: "burn", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( + functionFragment: "decreaseAllowance", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "increaseAllowance", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; + encodeFunctionData(functionFragment: "l2Bridge", values?: undefined): string; + encodeFunctionData( + functionFragment: "mint", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "supportsInterface", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( +@@ -84,11 +110,15 @@ export interface OVMETHInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +@@ -136,40 +166,52 @@ export interface OVMETHInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + +-export type BurnEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; + + export type BurnEventFilter = TypedEventFilter; + +-export type MintEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; + + export type MintEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; + +-export interface OVMETH extends BaseContract { ++export interface L2_BOBA extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: OVMETHInterface; ++ interface: L2_BOBAInterface; + + queryFilter( + event: TypedEventFilter, +@@ -192,37 +234,40 @@ export interface OVMETH extends BaseContract { + + functions: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise<[string]>; +@@ -230,15 +275,15 @@ export interface OVMETH extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise<[string]>; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + +@@ -247,51 +292,54 @@ export interface OVMETH extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -299,15 +347,15 @@ export interface OVMETH extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -316,50 +364,53 @@ export interface OVMETH extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -368,15 +419,15 @@ export interface OVMETH extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -385,88 +436,97 @@ export interface OVMETH extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Burn(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, + _amount?: null + ): BurnEventFilter; +- Burn(_account?: string | null, _amount?: null): BurnEventFilter; + + "Mint(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, + _amount?: null + ): MintEventFilter; +- Mint(_account?: string | null, _amount?: null): MintEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -474,15 +534,15 @@ export interface OVMETH extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -491,55 +551,55 @@ export interface OVMETH extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- account: string, ++ account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -547,15 +607,15 @@ export interface OVMETH extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -564,16 +624,16 @@ export interface OVMETH extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_L1NativeToken.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_L1NativeToken.ts +new file mode 100644 +index 0000000..75d01fc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/L2_L1NativeToken.ts +@@ -0,0 +1,761 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface L2_L1NativeTokenInterface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "burn(address,uint256)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "l1Token()": FunctionFragment; ++ "l2Bridge()": FunctionFragment; ++ "mint(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "supportsInterface(bytes4)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "l1Token" ++ | "l2Bridge" ++ | "mint" ++ | "name" ++ | "nonces" ++ | "permit" ++ | "supportsInterface" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burn", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; ++ encodeFunctionData(functionFragment: "l2Bridge", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "mint", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "supportsInterface", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "l1Token", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "l2Bridge", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "supportsInterface", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Burn(address,uint256)": EventFragment; ++ "Mint(address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Burn"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Mint"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; ++ ++export type BurnEventFilter = TypedEventFilter; ++ ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; ++ ++export type MintEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface L2_L1NativeToken extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L2_L1NativeTokenInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise<[string]>; ++ ++ l2Bridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Burn(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ ++ "Mint(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OVMDeployerWhitelist.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_DeployerWhitelist.ts +similarity index 61% +rename from node_modules/@eth-optimism/contracts/dist/types/OVMDeployerWhitelist.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_DeployerWhitelist.ts +index 50a704e..9b9ef6f 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OVMDeployerWhitelist.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_DeployerWhitelist.ts +@@ -1,30 +1,32 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OVMDeployerWhitelistInterface extends ethers.utils.Interface { ++export interface OVM_DeployerWhitelistInterface extends utils.Interface { + functions: { + "enableArbitraryContractDeployment()": FunctionFragment; + "isDeployerAllowed(address)": FunctionFragment; +@@ -34,21 +36,37 @@ export interface OVMDeployerWhitelistInterface extends ethers.utils.Interface { + "whitelist(address)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "enableArbitraryContractDeployment" ++ | "isDeployerAllowed" ++ | "owner" ++ | "setOwner" ++ | "setWhitelistedDeployer" ++ | "whitelist" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "enableArbitraryContractDeployment", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isDeployerAllowed", +- values: [string] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; +- encodeFunctionData(functionFragment: "setOwner", values: [string]): string; ++ encodeFunctionData( ++ functionFragment: "setOwner", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "setWhitelistedDeployer", +- values: [string, boolean] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "whitelist", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "whitelist", values: [string]): string; + + decodeFunctionResult( + functionFragment: "enableArbitraryContractDeployment", +@@ -77,32 +95,46 @@ export interface OVMDeployerWhitelistInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "WhitelistStatusChanged"): EventFragment; + } + ++export interface OwnerChangedEventObject { ++ oldOwner: string; ++ newOwner: string; ++} + export type OwnerChangedEvent = TypedEvent< + [string, string], +- { oldOwner: string; newOwner: string } ++ OwnerChangedEventObject + >; + + export type OwnerChangedEventFilter = TypedEventFilter; + +-export type WhitelistDisabledEvent = TypedEvent<[string], { oldOwner: string }>; ++export interface WhitelistDisabledEventObject { ++ oldOwner: string; ++} ++export type WhitelistDisabledEvent = TypedEvent< ++ [string], ++ WhitelistDisabledEventObject ++>; + + export type WhitelistDisabledEventFilter = + TypedEventFilter; + ++export interface WhitelistStatusChangedEventObject { ++ deployer: string; ++ whitelisted: boolean; ++} + export type WhitelistStatusChangedEvent = TypedEvent< + [string, boolean], +- { deployer: string; whitelisted: boolean } ++ WhitelistStatusChangedEventObject + >; + + export type WhitelistStatusChangedEventFilter = + TypedEventFilter; + +-export interface OVMDeployerWhitelist extends BaseContract { ++export interface OVM_DeployerWhitelist extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: OVMDeployerWhitelistInterface; ++ interface: OVM_DeployerWhitelistInterface; + + queryFilter( + event: TypedEventFilter, +@@ -125,73 +157,85 @@ export interface OVMDeployerWhitelist extends BaseContract { + + functions: { + enableArbitraryContractDeployment( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isDeployerAllowed( +- _deployer: string, ++ _deployer: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setWhitelistedDeployer( +- _deployer: string, +- _isWhitelisted: boolean, +- overrides?: Overrides & { from?: string | Promise } ++ _deployer: PromiseOrValue, ++ _isWhitelisted: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- whitelist(arg0: string, overrides?: CallOverrides): Promise<[boolean]>; ++ whitelist( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; + }; + + enableArbitraryContractDeployment( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isDeployerAllowed( +- _deployer: string, ++ _deployer: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setWhitelistedDeployer( +- _deployer: string, +- _isWhitelisted: boolean, +- overrides?: Overrides & { from?: string | Promise } ++ _deployer: PromiseOrValue, ++ _isWhitelisted: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- whitelist(arg0: string, overrides?: CallOverrides): Promise; ++ whitelist( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { + enableArbitraryContractDeployment(overrides?: CallOverrides): Promise; + + isDeployerAllowed( +- _deployer: string, ++ _deployer: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + +- setOwner(_owner: string, overrides?: CallOverrides): Promise; ++ setOwner( ++ _owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setWhitelistedDeployer( +- _deployer: string, +- _isWhitelisted: boolean, ++ _deployer: PromiseOrValue, ++ _isWhitelisted: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- whitelist(arg0: string, overrides?: CallOverrides): Promise; ++ whitelist( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: { +@@ -216,55 +260,58 @@ export interface OVMDeployerWhitelist extends BaseContract { + + estimateGas: { + enableArbitraryContractDeployment( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isDeployerAllowed( +- _deployer: string, ++ _deployer: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setWhitelistedDeployer( +- _deployer: string, +- _isWhitelisted: boolean, +- overrides?: Overrides & { from?: string | Promise } ++ _deployer: PromiseOrValue, ++ _isWhitelisted: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- whitelist(arg0: string, overrides?: CallOverrides): Promise; ++ whitelist( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + populateTransaction: { + enableArbitraryContractDeployment( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isDeployerAllowed( +- _deployer: string, ++ _deployer: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setWhitelistedDeployer( +- _deployer: string, +- _isWhitelisted: boolean, +- overrides?: Overrides & { from?: string | Promise } ++ _deployer: PromiseOrValue, ++ _isWhitelisted: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + whitelist( +- arg0: string, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_ETH.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_ETH.ts +new file mode 100644 +index 0000000..d3d1b18 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_ETH.ts +@@ -0,0 +1,639 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface OVM_ETHInterface extends utils.Interface { ++ functions: { ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "burn(address,uint256)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "l1Token()": FunctionFragment; ++ "l2Bridge()": FunctionFragment; ++ "mint(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "supportsInterface(bytes4)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "l1Token" ++ | "l2Bridge" ++ | "mint" ++ | "name" ++ | "supportsInterface" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burn", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; ++ encodeFunctionData(functionFragment: "l2Bridge", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "mint", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "supportsInterface", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "l1Token", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "l2Bridge", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "supportsInterface", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Burn(address,uint256)": EventFragment; ++ "Mint(address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Burn"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Mint"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; ++ ++export type BurnEventFilter = TypedEventFilter; ++ ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; ++ ++export type MintEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface OVM_ETH extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: OVM_ETHInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise<[string]>; ++ ++ l2Bridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Burn(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ ++ "Mint(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OVMGasPriceOracle.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_GasPriceOracle.ts +similarity index 56% +rename from node_modules/@eth-optimism/contracts/dist/types/OVMGasPriceOracle.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_GasPriceOracle.ts +index a1bc787..7858c15 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OVMGasPriceOracle.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_GasPriceOracle.ts +@@ -1,33 +1,37 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OVMGasPriceOracleInterface extends ethers.utils.Interface { ++export interface OVM_GasPriceOracleInterface extends utils.Interface { + functions: { + "decimals()": FunctionFragment; + "gasPrice()": FunctionFragment; ++ "getExtraL2Gas(bytes)": FunctionFragment; + "getL1Fee(bytes)": FunctionFragment; + "getL1GasUsed(bytes)": FunctionFragment; + "l1BaseFee()": FunctionFragment; +@@ -43,12 +47,39 @@ export interface OVMGasPriceOracleInterface extends ethers.utils.Interface { + "transferOwnership(address)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "decimals" ++ | "gasPrice" ++ | "getExtraL2Gas" ++ | "getL1Fee" ++ | "getL1GasUsed" ++ | "l1BaseFee" ++ | "overhead" ++ | "owner" ++ | "renounceOwnership" ++ | "scalar" ++ | "setDecimals" ++ | "setGasPrice" ++ | "setL1BaseFee" ++ | "setOverhead" ++ | "setScalar" ++ | "transferOwnership" ++ ): FunctionFragment; ++ + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "gasPrice", values?: undefined): string; +- encodeFunctionData(functionFragment: "getL1Fee", values: [BytesLike]): string; ++ encodeFunctionData( ++ functionFragment: "getExtraL2Gas", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getL1Fee", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "getL1GasUsed", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "l1BaseFee", values?: undefined): string; + encodeFunctionData(functionFragment: "overhead", values?: undefined): string; +@@ -60,31 +91,35 @@ export interface OVMGasPriceOracleInterface extends ethers.utils.Interface { + encodeFunctionData(functionFragment: "scalar", values?: undefined): string; + encodeFunctionData( + functionFragment: "setDecimals", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setGasPrice", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setL1BaseFee", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setOverhead", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setScalar", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "gasPrice", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getExtraL2Gas", ++ data: BytesLike ++ ): Result; + decodeFunctionResult(functionFragment: "getL1Fee", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getL1GasUsed", +@@ -137,44 +172,75 @@ export interface OVMGasPriceOracleInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "ScalarUpdated"): EventFragment; + } + +-export type DecimalsUpdatedEvent = TypedEvent<[BigNumber], { arg0: BigNumber }>; ++export interface DecimalsUpdatedEventObject { ++ arg0: BigNumber; ++} ++export type DecimalsUpdatedEvent = TypedEvent< ++ [BigNumber], ++ DecimalsUpdatedEventObject ++>; + + export type DecimalsUpdatedEventFilter = TypedEventFilter; + +-export type GasPriceUpdatedEvent = TypedEvent<[BigNumber], { arg0: BigNumber }>; ++export interface GasPriceUpdatedEventObject { ++ arg0: BigNumber; ++} ++export type GasPriceUpdatedEvent = TypedEvent< ++ [BigNumber], ++ GasPriceUpdatedEventObject ++>; + + export type GasPriceUpdatedEventFilter = TypedEventFilter; + ++export interface L1BaseFeeUpdatedEventObject { ++ arg0: BigNumber; ++} + export type L1BaseFeeUpdatedEvent = TypedEvent< + [BigNumber], +- { arg0: BigNumber } ++ L1BaseFeeUpdatedEventObject + >; + + export type L1BaseFeeUpdatedEventFilter = + TypedEventFilter; + +-export type OverheadUpdatedEvent = TypedEvent<[BigNumber], { arg0: BigNumber }>; ++export interface OverheadUpdatedEventObject { ++ arg0: BigNumber; ++} ++export type OverheadUpdatedEvent = TypedEvent< ++ [BigNumber], ++ OverheadUpdatedEventObject ++>; + + export type OverheadUpdatedEventFilter = TypedEventFilter; + ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} + export type OwnershipTransferredEvent = TypedEvent< + [string, string], +- { previousOwner: string; newOwner: string } ++ OwnershipTransferredEventObject + >; + + export type OwnershipTransferredEventFilter = + TypedEventFilter; + +-export type ScalarUpdatedEvent = TypedEvent<[BigNumber], { arg0: BigNumber }>; ++export interface ScalarUpdatedEventObject { ++ arg0: BigNumber; ++} ++export type ScalarUpdatedEvent = TypedEvent< ++ [BigNumber], ++ ScalarUpdatedEventObject ++>; + + export type ScalarUpdatedEventFilter = TypedEventFilter; + +-export interface OVMGasPriceOracle extends BaseContract { ++export interface OVM_GasPriceOracle extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: OVMGasPriceOracleInterface; ++ interface: OVM_GasPriceOracleInterface; + + queryFilter( + event: TypedEventFilter, +@@ -200,10 +266,18 @@ export interface OVMGasPriceOracle extends BaseContract { + + gasPrice(overrides?: CallOverrides): Promise<[BigNumber]>; + +- getL1Fee(_data: BytesLike, overrides?: CallOverrides): Promise<[BigNumber]>; ++ getExtraL2Gas( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getL1Fee( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + getL1GasUsed( +- _data: BytesLike, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + +@@ -214,39 +288,39 @@ export interface OVMGasPriceOracle extends BaseContract { + owner(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + scalar(overrides?: CallOverrides): Promise<[BigNumber]>; + + setDecimals( +- _decimals: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setGasPrice( +- _gasPrice: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _gasPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setL1BaseFee( +- _baseFee: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _baseFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOverhead( +- _overhead: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _overhead: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setScalar( +- _scalar: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _scalar: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -254,9 +328,20 @@ export interface OVMGasPriceOracle extends BaseContract { + + gasPrice(overrides?: CallOverrides): Promise; + +- getL1Fee(_data: BytesLike, overrides?: CallOverrides): Promise; ++ getExtraL2Gas( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- getL1GasUsed(_data: BytesLike, overrides?: CallOverrides): Promise; ++ getL1Fee( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getL1GasUsed( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + l1BaseFee(overrides?: CallOverrides): Promise; + +@@ -265,39 +350,39 @@ export interface OVMGasPriceOracle extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + scalar(overrides?: CallOverrides): Promise; + + setDecimals( +- _decimals: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setGasPrice( +- _gasPrice: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _gasPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setL1BaseFee( +- _baseFee: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _baseFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOverhead( +- _overhead: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _overhead: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setScalar( +- _scalar: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _scalar: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -305,10 +390,18 @@ export interface OVMGasPriceOracle extends BaseContract { + + gasPrice(overrides?: CallOverrides): Promise; + +- getL1Fee(_data: BytesLike, overrides?: CallOverrides): Promise; ++ getExtraL2Gas( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getL1Fee( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + getL1GasUsed( +- _data: BytesLike, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -323,57 +416,60 @@ export interface OVMGasPriceOracle extends BaseContract { + scalar(overrides?: CallOverrides): Promise; + + setDecimals( +- _decimals: BigNumberish, ++ _decimals: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setGasPrice( +- _gasPrice: BigNumberish, ++ _gasPrice: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setL1BaseFee( +- _baseFee: BigNumberish, ++ _baseFee: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setOverhead( +- _overhead: BigNumberish, ++ _overhead: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- setScalar(_scalar: BigNumberish, overrides?: CallOverrides): Promise; ++ setScalar( ++ _scalar: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + transferOwnership( +- newOwner: string, ++ newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { +- "DecimalsUpdated(uint256)"(undefined?: null): DecimalsUpdatedEventFilter; +- DecimalsUpdated(undefined?: null): DecimalsUpdatedEventFilter; ++ "DecimalsUpdated(uint256)"(arg0?: null): DecimalsUpdatedEventFilter; ++ DecimalsUpdated(arg0?: null): DecimalsUpdatedEventFilter; + +- "GasPriceUpdated(uint256)"(undefined?: null): GasPriceUpdatedEventFilter; +- GasPriceUpdated(undefined?: null): GasPriceUpdatedEventFilter; ++ "GasPriceUpdated(uint256)"(arg0?: null): GasPriceUpdatedEventFilter; ++ GasPriceUpdated(arg0?: null): GasPriceUpdatedEventFilter; + +- "L1BaseFeeUpdated(uint256)"(undefined?: null): L1BaseFeeUpdatedEventFilter; +- L1BaseFeeUpdated(undefined?: null): L1BaseFeeUpdatedEventFilter; ++ "L1BaseFeeUpdated(uint256)"(arg0?: null): L1BaseFeeUpdatedEventFilter; ++ L1BaseFeeUpdated(arg0?: null): L1BaseFeeUpdatedEventFilter; + +- "OverheadUpdated(uint256)"(undefined?: null): OverheadUpdatedEventFilter; +- OverheadUpdated(undefined?: null): OverheadUpdatedEventFilter; ++ "OverheadUpdated(uint256)"(arg0?: null): OverheadUpdatedEventFilter; ++ OverheadUpdated(arg0?: null): OverheadUpdatedEventFilter; + + "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + +- "ScalarUpdated(uint256)"(undefined?: null): ScalarUpdatedEventFilter; +- ScalarUpdated(undefined?: null): ScalarUpdatedEventFilter; ++ "ScalarUpdated(uint256)"(arg0?: null): ScalarUpdatedEventFilter; ++ ScalarUpdated(arg0?: null): ScalarUpdatedEventFilter; + }; + + estimateGas: { +@@ -381,10 +477,18 @@ export interface OVMGasPriceOracle extends BaseContract { + + gasPrice(overrides?: CallOverrides): Promise; + +- getL1Fee(_data: BytesLike, overrides?: CallOverrides): Promise; ++ getExtraL2Gas( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getL1Fee( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + getL1GasUsed( +- _data: BytesLike, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -395,39 +499,39 @@ export interface OVMGasPriceOracle extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + scalar(overrides?: CallOverrides): Promise; + + setDecimals( +- _decimals: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setGasPrice( +- _gasPrice: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _gasPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setL1BaseFee( +- _baseFee: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _baseFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOverhead( +- _overhead: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _overhead: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setScalar( +- _scalar: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _scalar: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -436,13 +540,18 @@ export interface OVMGasPriceOracle extends BaseContract { + + gasPrice(overrides?: CallOverrides): Promise; + ++ getExtraL2Gas( ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ + getL1Fee( +- _data: BytesLike, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getL1GasUsed( +- _data: BytesLike, ++ _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -453,39 +562,39 @@ export interface OVMGasPriceOracle extends BaseContract { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + scalar(overrides?: CallOverrides): Promise; + + setDecimals( +- _decimals: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _decimals: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setGasPrice( +- _gasPrice: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _gasPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setL1BaseFee( +- _baseFee: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _baseFee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOverhead( +- _overhead: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _overhead: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setScalar( +- _scalar: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _scalar: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OVML2ToL1MessagePasser.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.ts +similarity index 64% +rename from node_modules/@eth-optimism/contracts/dist/types/OVML2ToL1MessagePasser.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.ts +index 5dcec1a..6274ce4 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OVML2ToL1MessagePasser.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.ts +@@ -1,43 +1,48 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OVML2ToL1MessagePasserInterface +- extends ethers.utils.Interface { ++export interface OVM_L2ToL1MessagePasserInterface extends utils.Interface { + functions: { + "passMessageToL1(bytes)": FunctionFragment; + "sentMessages(bytes32)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "passMessageToL1" | "sentMessages" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "passMessageToL1", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "sentMessages", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -56,19 +61,24 @@ export interface OVML2ToL1MessagePasserInterface + getEvent(nameOrSignatureOrTopic: "L2ToL1Message"): EventFragment; + } + ++export interface L2ToL1MessageEventObject { ++ _nonce: BigNumber; ++ _sender: string; ++ _data: string; ++} + export type L2ToL1MessageEvent = TypedEvent< + [BigNumber, string, string], +- { _nonce: BigNumber; _sender: string; _data: string } ++ L2ToL1MessageEventObject + >; + + export type L2ToL1MessageEventFilter = TypedEventFilter; + +-export interface OVML2ToL1MessagePasser extends BaseContract { ++export interface OVM_L2ToL1MessagePasser extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: OVML2ToL1MessagePasserInterface; ++ interface: OVM_L2ToL1MessagePasserInterface; + + queryFilter( + event: TypedEventFilter, +@@ -91,30 +101,36 @@ export interface OVML2ToL1MessagePasser extends BaseContract { + + functions: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- sentMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; ++ sentMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { + passMessageToL1( +- _message: BytesLike, ++ _message: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- sentMessages(arg0: BytesLike, overrides?: CallOverrides): Promise; ++ sentMessages( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: { +@@ -132,24 +148,24 @@ export interface OVML2ToL1MessagePasser extends BaseContract { + + estimateGas: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + passMessageToL1( +- _message: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _message: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + sentMessages( +- arg0: BytesLike, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/OVMSequencerFeeVault.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVault.ts +similarity index 78% +rename from node_modules/@eth-optimism/contracts/dist/types/OVMSequencerFeeVault.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVault.ts +index fe44239..c088be1 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/OVMSequencerFeeVault.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVault.ts +@@ -1,36 +1,38 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface OVMSequencerFeeVaultInterface extends ethers.utils.Interface { ++export interface OVM_SequencerFeeVaultInterface extends utils.Interface { + functions: { + "MIN_WITHDRAWAL_AMOUNT()": FunctionFragment; + "l1FeeWallet()": FunctionFragment; + "withdraw()": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "MIN_WITHDRAWAL_AMOUNT" | "l1FeeWallet" | "withdraw" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "MIN_WITHDRAWAL_AMOUNT", + values?: undefined +@@ -54,12 +56,12 @@ export interface OVMSequencerFeeVaultInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface OVMSequencerFeeVault extends BaseContract { ++export interface OVM_SequencerFeeVault extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: OVMSequencerFeeVaultInterface; ++ interface: OVM_SequencerFeeVaultInterface; + + queryFilter( + event: TypedEventFilter, +@@ -86,7 +88,7 @@ export interface OVMSequencerFeeVault extends BaseContract { + l1FeeWallet(overrides?: CallOverrides): Promise<[string]>; + + withdraw( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -95,7 +97,7 @@ export interface OVMSequencerFeeVault extends BaseContract { + l1FeeWallet(overrides?: CallOverrides): Promise; + + withdraw( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -114,7 +116,7 @@ export interface OVMSequencerFeeVault extends BaseContract { + l1FeeWallet(overrides?: CallOverrides): Promise; + + withdraw( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +@@ -126,7 +128,7 @@ export interface OVMSequencerFeeVault extends BaseContract { + l1FeeWallet(overrides?: CallOverrides): Promise; + + withdraw( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.ts +new file mode 100644 +index 0000000..b808924 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1.ts +@@ -0,0 +1,134 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface OVM_SequencerFeeVaultAltL1Interface extends utils.Interface { ++ functions: { ++ "MIN_WITHDRAWAL_AMOUNT()": FunctionFragment; ++ "l1FeeWallet()": FunctionFragment; ++ "withdraw()": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: "MIN_WITHDRAWAL_AMOUNT" | "l1FeeWallet" | "withdraw" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "l1FeeWallet", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "withdraw", values?: undefined): string; ++ ++ decodeFunctionResult( ++ functionFragment: "MIN_WITHDRAWAL_AMOUNT", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "l1FeeWallet", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface OVM_SequencerFeeVaultAltL1 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: OVM_SequencerFeeVaultAltL1Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ l1FeeWallet(overrides?: CallOverrides): Promise<[string]>; ++ ++ withdraw( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ l1FeeWallet(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ l1FeeWallet(overrides?: CallOverrides): Promise; ++ ++ withdraw(overrides?: CallOverrides): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ MIN_WITHDRAWAL_AMOUNT(overrides?: CallOverrides): Promise; ++ ++ l1FeeWallet(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ MIN_WITHDRAWAL_AMOUNT( ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1FeeWallet(overrides?: CallOverrides): Promise; ++ ++ withdraw( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/WETH9.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/WETH9.ts +similarity index 57% +rename from node_modules/@eth-optimism/contracts/dist/types/WETH9.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/WETH9.ts +index d37321c..5bbb26e 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/WETH9.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/WETH9.ts +@@ -1,31 +1,34 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface WETH9Interface extends ethers.utils.Interface { ++export interface WETH9Interface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; +@@ -40,15 +43,33 @@ export interface WETH9Interface extends ethers.utils.Interface { + "withdraw(uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "decimals" ++ | "deposit" ++ | "name" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ | "withdraw" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "deposit", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; +@@ -59,15 +80,19 @@ export interface WETH9Interface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "withdraw", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +@@ -101,30 +126,45 @@ export interface WETH9Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Withdrawal"): EventFragment; + } + ++export interface ApprovalEventObject { ++ src: string; ++ guy: string; ++ wad: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { src: string; guy: string; wad: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + +-export type DepositEvent = TypedEvent< +- [string, BigNumber], +- { dst: string; wad: BigNumber } +->; ++export interface DepositEventObject { ++ dst: string; ++ wad: BigNumber; ++} ++export type DepositEvent = TypedEvent<[string, BigNumber], DepositEventObject>; + + export type DepositEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ src: string; ++ dst: string; ++ wad: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { src: string; dst: string; wad: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; + ++export interface WithdrawalEventObject { ++ src: string; ++ wad: BigNumber; ++} + export type WithdrawalEvent = TypedEvent< + [string, BigNumber], +- { src: string; wad: BigNumber } ++ WithdrawalEventObject + >; + + export type WithdrawalEventFilter = TypedEventFilter; +@@ -157,23 +197,26 @@ export interface WETH9 extends BaseContract { + + functions: { + allowance( +- arg0: string, +- arg1: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- guy: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ guy: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + deposit( +- overrides?: PayableOverrides & { from?: string | Promise } ++ overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; +@@ -183,42 +226,45 @@ export interface WETH9 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- src: string, +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ src: PromiseOrValue, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- arg0: string, +- arg1: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- guy: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ guy: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( +- overrides?: PayableOverrides & { from?: string | Promise } ++ overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -228,37 +274,40 @@ export interface WETH9 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- src: string, +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ src: PromiseOrValue, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- arg0: string, +- arg1: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- guy: string, +- wad: BigNumberish, ++ guy: PromiseOrValue, ++ wad: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +@@ -271,76 +320,88 @@ export interface WETH9 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- dst: string, +- wad: BigNumberish, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- src: string, +- dst: string, +- wad: BigNumberish, ++ src: PromiseOrValue, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- withdraw(wad: BigNumberish, overrides?: CallOverrides): Promise; ++ withdraw( ++ wad: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- src?: string | null, +- guy?: string | null, ++ src?: PromiseOrValue | null, ++ guy?: PromiseOrValue | null, + wad?: null + ): ApprovalEventFilter; + Approval( +- src?: string | null, +- guy?: string | null, ++ src?: PromiseOrValue | null, ++ guy?: PromiseOrValue | null, + wad?: null + ): ApprovalEventFilter; + + "Deposit(address,uint256)"( +- dst?: string | null, ++ dst?: PromiseOrValue | null, ++ wad?: null ++ ): DepositEventFilter; ++ Deposit( ++ dst?: PromiseOrValue | null, + wad?: null + ): DepositEventFilter; +- Deposit(dst?: string | null, wad?: null): DepositEventFilter; + + "Transfer(address,address,uint256)"( +- src?: string | null, +- dst?: string | null, ++ src?: PromiseOrValue | null, ++ dst?: PromiseOrValue | null, + wad?: null + ): TransferEventFilter; + Transfer( +- src?: string | null, +- dst?: string | null, ++ src?: PromiseOrValue | null, ++ dst?: PromiseOrValue | null, + wad?: null + ): TransferEventFilter; + + "Withdrawal(address,uint256)"( +- src?: string | null, ++ src?: PromiseOrValue | null, ++ wad?: null ++ ): WithdrawalEventFilter; ++ Withdrawal( ++ src?: PromiseOrValue | null, + wad?: null + ): WithdrawalEventFilter; +- Withdrawal(src?: string | null, wad?: null): WithdrawalEventFilter; + }; + + estimateGas: { + allowance( +- arg0: string, +- arg1: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- guy: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ guy: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(arg0: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( +- overrides?: PayableOverrides & { from?: string | Promise } ++ overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -350,46 +411,46 @@ export interface WETH9 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- src: string, +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ src: PromiseOrValue, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- arg0: string, +- arg1: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- guy: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ guy: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- arg0: string, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( +- overrides?: PayableOverrides & { from?: string | Promise } ++ overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -399,21 +460,21 @@ export interface WETH9 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- src: string, +- dst: string, +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ src: PromiseOrValue, ++ dst: PromiseOrValue, ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( +- wad: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ wad: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/index.ts +new file mode 100644 +index 0000000..642358d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/L2/predeploys/index.ts +@@ -0,0 +1,18 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { BobaTuringCredit } from "./BobaTuringCredit"; ++export type { BobaTuringCreditAltL1 } from "./BobaTuringCreditAltL1"; ++export type { Boba_GasPriceOracle } from "./Boba_GasPriceOracle"; ++export type { Boba_GasPriceOracleAltL1 } from "./Boba_GasPriceOracleAltL1"; ++export type { L2_BOBA } from "./L2_BOBA"; ++export type { L2_L1NativeToken } from "./L2_L1NativeToken"; ++export type { OVM_DeployerWhitelist } from "./OVM_DeployerWhitelist"; ++export type { OVM_ETH } from "./OVM_ETH"; ++export type { OVM_GasPriceOracle } from "./OVM_GasPriceOracle"; ++export type { OVM_L2ToL1MessagePasser } from "./OVM_L2ToL1MessagePasser"; ++export type { OVM_SequencerFeeVault } from "./OVM_SequencerFeeVault"; ++export type { OVM_SequencerFeeVaultAltL1 } from "./OVM_SequencerFeeVaultAltL1"; ++export type { WETH9 } from "./WETH9"; ++export type { IOVM_L1BlockNumber } from "./IOVM_L1BlockNumber"; ++export type { IOVM_L2ToL1MessagePasser } from "./IOVM_L2ToL1MessagePasser"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L1ChugSplashProxy.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/L1ChugSplashProxy.ts +similarity index 53% +rename from node_modules/@eth-optimism/contracts/dist/types/L1ChugSplashProxy.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/L1ChugSplashProxy.ts +index 54d71f1..0f239d6 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/L1ChugSplashProxy.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/L1ChugSplashProxy.ts +@@ -1,30 +1,28 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../common"; + +-export interface L1ChugSplashProxyInterface extends ethers.utils.Interface { ++export interface L1ChugSplashProxyInterface extends utils.Interface { + functions: { + "getImplementation()": FunctionFragment; + "getOwner()": FunctionFragment; +@@ -33,16 +31,31 @@ export interface L1ChugSplashProxyInterface extends ethers.utils.Interface { + "setStorage(bytes32,bytes32)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "getImplementation" ++ | "getOwner" ++ | "setCode" ++ | "setOwner" ++ | "setStorage" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "getImplementation", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "getOwner", values?: undefined): string; +- encodeFunctionData(functionFragment: "setCode", values: [BytesLike]): string; +- encodeFunctionData(functionFragment: "setOwner", values: [string]): string; ++ encodeFunctionData( ++ functionFragment: "setCode", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "setOwner", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "setStorage", +- values: [BytesLike, BytesLike] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -85,52 +98,52 @@ export interface L1ChugSplashProxy extends BaseContract { + + functions: { + getImplementation( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getOwner( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setCode( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _code: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStorage( +- _key: BytesLike, +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getImplementation( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getOwner( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setCode( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _code: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStorage( +- _key: BytesLike, +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +@@ -138,13 +151,19 @@ export interface L1ChugSplashProxy extends BaseContract { + + getOwner(overrides?: CallOverrides): Promise; + +- setCode(_code: BytesLike, overrides?: CallOverrides): Promise; ++ setCode( ++ _code: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- setOwner(_owner: string, overrides?: CallOverrides): Promise; ++ setOwner( ++ _owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + setStorage( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -153,53 +172,53 @@ export interface L1ChugSplashProxy extends BaseContract { + + estimateGas: { + getImplementation( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getOwner( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setCode( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _code: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStorage( +- _key: BytesLike, +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getImplementation( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getOwner( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setCode( +- _code: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _code: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setOwner( +- _owner: string, +- overrides?: Overrides & { from?: string | Promise } ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStorage( +- _key: BytesLike, +- _value: BytesLike, +- overrides?: Overrides & { from?: string | Promise } ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/index.ts +new file mode 100644 +index 0000000..2fcad35 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as interfaces from "./interfaces"; ++export type { interfaces }; ++export type { L1ChugSplashProxy } from "./L1ChugSplashProxy"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL1ChugSplashDeployer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/IL1ChugSplashDeployer.ts +similarity index 83% +rename from node_modules/@eth-optimism/contracts/dist/types/IL1ChugSplashDeployer.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/IL1ChugSplashDeployer.ts +index da0d8f4..b19b02c 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL1ChugSplashDeployer.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/IL1ChugSplashDeployer.ts +@@ -1,33 +1,32 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface IL1ChugSplashDeployerInterface extends ethers.utils.Interface { ++export interface IL1ChugSplashDeployerInterface extends utils.Interface { + functions: { + "isUpgrading()": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "isUpgrading"): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "isUpgrading", + values?: undefined +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/index.ts +new file mode 100644 +index 0000000..78f6789 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/chugsplash/interfaces/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IL1ChugSplashDeployer } from "./IL1ChugSplashDeployer"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/index.ts +new file mode 100644 +index 0000000..246d3c8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/index.ts +@@ -0,0 +1,17 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as l1 from "./L1"; ++export type { l1 }; ++import type * as l2 from "./L2"; ++export type { l2 }; ++import type * as chugsplash from "./chugsplash"; ++export type { chugsplash }; ++import type * as libraries from "./libraries"; ++export type { libraries }; ++import type * as standards from "./standards"; ++export type { standards }; ++import type * as testHelpers from "./test-helpers"; ++export type { testHelpers }; ++import type * as testLibraries from "./test-libraries"; ++export type { testLibraries }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/CrossDomainEnabled.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/CrossDomainEnabled.ts +similarity index 83% +rename from node_modules/@eth-optimism/contracts/dist/types/CrossDomainEnabled.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/CrossDomainEnabled.ts +index 2068429..557a313 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/CrossDomainEnabled.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/CrossDomainEnabled.ts +@@ -1,33 +1,32 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface CrossDomainEnabledInterface extends ethers.utils.Interface { ++export interface CrossDomainEnabledInterface extends utils.Interface { + functions: { + "messenger()": FunctionFragment; + }; + ++ getFunction(nameOrSignatureOrTopic: "messenger"): FunctionFragment; ++ + encodeFunctionData(functionFragment: "messenger", values?: undefined): string; + + decodeFunctionResult(functionFragment: "messenger", data: BytesLike): Result; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/ICrossDomainMessenger.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/ICrossDomainMessenger.ts +similarity index 63% +rename from node_modules/@eth-optimism/contracts/dist/types/ICrossDomainMessenger.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/ICrossDomainMessenger.ts +index 8f34efe..165dc76 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/ICrossDomainMessenger.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/ICrossDomainMessenger.ts +@@ -1,38 +1,49 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface ICrossDomainMessengerInterface extends ethers.utils.Interface { ++export interface ICrossDomainMessengerInterface extends utils.Interface { + functions: { + "sendMessage(address,bytes,uint32)": FunctionFragment; + "xDomainMessageSender()": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "sendMessage" | "xDomainMessageSender" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "sendMessage", +- values: [string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "xDomainMessageSender", +@@ -59,27 +70,37 @@ export interface ICrossDomainMessengerInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "SentMessage"): EventFragment; + } + ++export interface FailedRelayedMessageEventObject { ++ msgHash: string; ++} + export type FailedRelayedMessageEvent = TypedEvent< + [string], +- { msgHash: string } ++ FailedRelayedMessageEventObject + >; + + export type FailedRelayedMessageEventFilter = + TypedEventFilter; + +-export type RelayedMessageEvent = TypedEvent<[string], { msgHash: string }>; ++export interface RelayedMessageEventObject { ++ msgHash: string; ++} ++export type RelayedMessageEvent = TypedEvent< ++ [string], ++ RelayedMessageEventObject ++>; + + export type RelayedMessageEventFilter = TypedEventFilter; + ++export interface SentMessageEventObject { ++ target: string; ++ sender: string; ++ message: string; ++ messageNonce: BigNumber; ++ gasLimit: BigNumber; ++} + export type SentMessageEvent = TypedEvent< + [string, string, string, BigNumber, BigNumber], +- { +- target: string; +- sender: string; +- message: string; +- messageNonce: BigNumber; +- gasLimit: BigNumber; +- } ++ SentMessageEventObject + >; + + export type SentMessageEventFilter = TypedEventFilter; +@@ -112,29 +133,29 @@ export interface ICrossDomainMessenger extends BaseContract { + + functions: { + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise<[string]>; + }; + + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise; + + callStatic: { + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -143,26 +164,28 @@ export interface ICrossDomainMessenger extends BaseContract { + + filters: { + "FailedRelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + FailedRelayedMessage( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null + ): FailedRelayedMessageEventFilter; + + "RelayedMessage(bytes32)"( +- msgHash?: BytesLike | null ++ msgHash?: PromiseOrValue | null ++ ): RelayedMessageEventFilter; ++ RelayedMessage( ++ msgHash?: PromiseOrValue | null + ): RelayedMessageEventFilter; +- RelayedMessage(msgHash?: BytesLike | null): RelayedMessageEventFilter; + + "SentMessage(address,address,bytes,uint256,uint256)"( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, + gasLimit?: null + ): SentMessageEventFilter; + SentMessage( +- target?: string | null, ++ target?: PromiseOrValue | null, + sender?: null, + message?: null, + messageNonce?: null, +@@ -172,10 +195,10 @@ export interface ICrossDomainMessenger extends BaseContract { + + estimateGas: { + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender(overrides?: CallOverrides): Promise; +@@ -183,10 +206,10 @@ export interface ICrossDomainMessenger extends BaseContract { + + populateTransaction: { + sendMessage( +- _target: string, +- _message: BytesLike, +- _gasLimit: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ _message: PromiseOrValue, ++ _gasLimit: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + xDomainMessageSender( +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/index.ts +new file mode 100644 +index 0000000..8137eed +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/bridge/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { CrossDomainEnabled } from "./CrossDomainEnabled"; ++export type { ICrossDomainMessenger } from "./ICrossDomainMessenger"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/index.ts +new file mode 100644 +index 0000000..9f96d23 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as bridge from "./bridge"; ++export type { bridge }; ++import type * as resolver from "./resolver"; ++export type { resolver }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/LibAddressManager.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressManager.ts +similarity index 58% +rename from node_modules/@eth-optimism/contracts/dist/types/LibAddressManager.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressManager.ts +index 3fb60a7..526a3fd 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/LibAddressManager.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressManager.ts +@@ -1,30 +1,32 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface LibAddressManagerInterface extends ethers.utils.Interface { ++export interface Lib_AddressManagerInterface extends utils.Interface { + functions: { + "getAddress(string)": FunctionFragment; + "owner()": FunctionFragment; +@@ -33,7 +35,19 @@ export interface LibAddressManagerInterface extends ethers.utils.Interface { + "transferOwnership(address)": FunctionFragment; + }; + +- encodeFunctionData(functionFragment: "getAddress", values: [string]): string; ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "getAddress" ++ | "owner" ++ | "renounceOwnership" ++ | "setAddress" ++ | "transferOwnership" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "getAddress", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", +@@ -41,11 +55,11 @@ export interface LibAddressManagerInterface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "setAddress", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "getAddress", data: BytesLike): Result; +@@ -69,27 +83,36 @@ export interface LibAddressManagerInterface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + } + ++export interface AddressSetEventObject { ++ _name: string; ++ _newAddress: string; ++ _oldAddress: string; ++} + export type AddressSetEvent = TypedEvent< + [string, string, string], +- { _name: string; _newAddress: string; _oldAddress: string } ++ AddressSetEventObject + >; + + export type AddressSetEventFilter = TypedEventFilter; + ++export interface OwnershipTransferredEventObject { ++ previousOwner: string; ++ newOwner: string; ++} + export type OwnershipTransferredEvent = TypedEvent< + [string, string], +- { previousOwner: string; newOwner: string } ++ OwnershipTransferredEventObject + >; + + export type OwnershipTransferredEventFilter = + TypedEventFilter; + +-export interface LibAddressManager extends BaseContract { ++export interface Lib_AddressManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: LibAddressManagerInterface; ++ interface: Lib_AddressManagerInterface; + + queryFilter( + event: TypedEventFilter, +@@ -111,128 +134,140 @@ export interface LibAddressManager extends BaseContract { + removeListener: OnEvent; + + functions: { +- getAddress(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ getAddress( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setAddress( +- _name: string, +- _address: string, +- overrides?: Overrides & { from?: string | Promise } ++ _name: PromiseOrValue, ++ _address: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + +- getAddress(_name: string, overrides?: CallOverrides): Promise; ++ getAddress( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setAddress( +- _name: string, +- _address: string, +- overrides?: Overrides & { from?: string | Promise } ++ _name: PromiseOrValue, ++ _address: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +- getAddress(_name: string, overrides?: CallOverrides): Promise; ++ getAddress( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setAddress( +- _name: string, +- _address: string, ++ _name: PromiseOrValue, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferOwnership( +- newOwner: string, ++ newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "AddressSet(string,address,address)"( +- _name?: string | null, ++ _name?: PromiseOrValue | null, + _newAddress?: null, + _oldAddress?: null + ): AddressSetEventFilter; + AddressSet( +- _name?: string | null, ++ _name?: PromiseOrValue | null, + _newAddress?: null, + _oldAddress?: null + ): AddressSetEventFilter; + + "OwnershipTransferred(address,address)"( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( +- previousOwner?: string | null, +- newOwner?: string | null ++ previousOwner?: PromiseOrValue | null, ++ newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + }; + + estimateGas: { +- getAddress(_name: string, overrides?: CallOverrides): Promise; ++ getAddress( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setAddress( +- _name: string, +- _address: string, +- overrides?: Overrides & { from?: string | Promise } ++ _name: PromiseOrValue, ++ _address: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getAddress( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setAddress( +- _name: string, +- _address: string, +- overrides?: Overrides & { from?: string | Promise } ++ _name: PromiseOrValue, ++ _address: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( +- newOwner: string, +- overrides?: Overrides & { from?: string | Promise } ++ newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/LibAddressResolver.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressResolver.ts +similarity index 65% +rename from node_modules/@eth-optimism/contracts/dist/types/LibAddressResolver.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressResolver.ts +index 6c45016..9c39172 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/LibAddressResolver.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_AddressResolver.ts +@@ -1,39 +1,43 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface LibAddressResolverInterface extends ethers.utils.Interface { ++export interface Lib_AddressResolverInterface extends utils.Interface { + functions: { + "libAddressManager()": FunctionFragment; + "resolve(string)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "libAddressManager" | "resolve" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "libAddressManager", + values?: undefined + ): string; +- encodeFunctionData(functionFragment: "resolve", values: [string]): string; ++ encodeFunctionData( ++ functionFragment: "resolve", ++ values: [PromiseOrValue] ++ ): string; + + decodeFunctionResult( + functionFragment: "libAddressManager", +@@ -44,12 +48,12 @@ export interface LibAddressResolverInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface LibAddressResolver extends BaseContract { ++export interface Lib_AddressResolver extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: LibAddressResolverInterface; ++ interface: Lib_AddressResolverInterface; + + queryFilter( + event: TypedEventFilter, +@@ -73,17 +77,26 @@ export interface LibAddressResolver extends BaseContract { + functions: { + libAddressManager(overrides?: CallOverrides): Promise<[string]>; + +- resolve(_name: string, overrides?: CallOverrides): Promise<[string]>; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; + }; + + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; +@@ -91,14 +104,17 @@ export interface LibAddressResolver extends BaseContract { + estimateGas: { + libAddressManager(overrides?: CallOverrides): Promise; + +- resolve(_name: string, overrides?: CallOverrides): Promise; ++ resolve( ++ _name: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + populateTransaction: { + libAddressManager(overrides?: CallOverrides): Promise; + + resolve( +- _name: string, ++ _name: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.ts +new file mode 100644 +index 0000000..83890cb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy.ts +@@ -0,0 +1,179 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface Lib_ResolvedDelegateBobaProxyInterface ++ extends utils.Interface { ++ functions: { ++ "addressManager(string)": FunctionFragment; ++ "setTargetContract(address)": FunctionFragment; ++ "transferProxyOwnership(address)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "addressManager" ++ | "setTargetContract" ++ | "transferProxyOwnership" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "addressManager", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "setTargetContract", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferProxyOwnership", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "addressManager", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "setTargetContract", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "transferProxyOwnership", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface Lib_ResolvedDelegateBobaProxy extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: Lib_ResolvedDelegateBobaProxyInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ addressManager( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ setTargetContract( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferProxyOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ addressManager( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setTargetContract( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferProxyOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ addressManager( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setTargetContract( ++ _proxyTarget: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferProxyOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ addressManager( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setTargetContract( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferProxyOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ addressManager( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setTargetContract( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferProxyOwnership( ++ _newOwner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/FailingReceiver.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.ts +similarity index 66% +rename from node_modules/@eth-optimism/contracts/dist/types/FailingReceiver.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.ts +index 2d674b3..0aed595 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/FailingReceiver.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/Lib_ResolvedDelegateProxy.ts +@@ -1,39 +1,29 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ ++import type { BaseContract, Signer, utils } from "ethers"; + +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, +-} from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface FailingReceiverInterface extends ethers.utils.Interface { ++export interface Lib_ResolvedDelegateProxyInterface extends utils.Interface { + functions: {}; + + events: {}; + } + +-export interface FailingReceiver extends BaseContract { ++export interface Lib_ResolvedDelegateProxy extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: FailingReceiverInterface; ++ interface: Lib_ResolvedDelegateProxyInterface; + + queryFilter( + event: TypedEventFilter, +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/index.ts +new file mode 100644 +index 0000000..4978c6d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/libraries/resolver/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { Lib_AddressManager } from "./Lib_AddressManager"; ++export type { Lib_AddressResolver } from "./Lib_AddressResolver"; ++export type { Lib_ResolvedDelegateBobaProxy } from "./Lib_ResolvedDelegateBobaProxy"; ++export type { Lib_ResolvedDelegateProxy } from "./Lib_ResolvedDelegateProxy"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/IL2StandardERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/IL2StandardERC20.ts +similarity index 50% +rename from node_modules/@eth-optimism/contracts/dist/types/IL2StandardERC20.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/standards/IL2StandardERC20.ts +index cc06675..591a0b7 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/IL2StandardERC20.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/IL2StandardERC20.ts +@@ -1,30 +1,33 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../common"; + +-export interface IL2StandardERC20Interface extends ethers.utils.Interface { ++export interface IL2StandardERC20Interface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; +@@ -38,27 +41,44 @@ export interface IL2StandardERC20Interface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "l1Token" ++ | "mint" ++ | "supportsInterface" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData( + functionFragment: "burn", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; + encodeFunctionData( + functionFragment: "mint", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", +@@ -66,11 +86,15 @@ export interface IL2StandardERC20Interface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +@@ -106,30 +130,42 @@ export interface IL2StandardERC20Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + +-export type BurnEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; + + export type BurnEventFilter = TypedEventFilter; + +-export type MintEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; + + export type MintEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; +@@ -162,296 +198,314 @@ export interface IL2StandardERC20 extends BaseContract { + + functions: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Burn(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, + _amount?: null + ): BurnEventFilter; +- Burn(_account?: string | null, _amount?: null): BurnEventFilter; + + "Mint(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, + _amount?: null + ): MintEventFilter; +- Mint(_account?: string | null, _amount?: null): MintEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- account: string, ++ account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token( +- overrides?: Overrides & { from?: string | Promise } ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( +- interfaceId: BytesLike, ++ interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2GovernanceERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2GovernanceERC20.ts +new file mode 100644 +index 0000000..e140a71 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2GovernanceERC20.ts +@@ -0,0 +1,1240 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../common"; ++ ++export declare namespace ERC20Votes { ++ export type CheckpointStruct = { ++ fromBlock: PromiseOrValue; ++ votes: PromiseOrValue; ++ }; ++ ++ export type CheckpointStructOutput = [number, BigNumber] & { ++ fromBlock: number; ++ votes: BigNumber; ++ }; ++} ++ ++export interface L2GovernanceERC20Interface extends utils.Interface { ++ functions: { ++ "DOMAIN_SEPARATOR()": FunctionFragment; ++ "OFFSET()": FunctionFragment; ++ "allowance(address,address)": FunctionFragment; ++ "approve(address,uint256)": FunctionFragment; ++ "balanceOf(address)": FunctionFragment; ++ "burn(address,uint256)": FunctionFragment; ++ "checkpoints(address,uint32)": FunctionFragment; ++ "decimals()": FunctionFragment; ++ "decreaseAllowance(address,uint256)": FunctionFragment; ++ "delegate(address)": FunctionFragment; ++ "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "delegates(address)": FunctionFragment; ++ "getCurrentVotes(address)": FunctionFragment; ++ "getPastTotalSupply(uint256)": FunctionFragment; ++ "getPastVotes(address,uint256)": FunctionFragment; ++ "getPriorVotes(address,uint256)": FunctionFragment; ++ "getVotes(address)": FunctionFragment; ++ "increaseAllowance(address,uint256)": FunctionFragment; ++ "l1Token()": FunctionFragment; ++ "l2Bridge()": FunctionFragment; ++ "maxSupply()": FunctionFragment; ++ "mint(address,uint256)": FunctionFragment; ++ "name()": FunctionFragment; ++ "nonces(address)": FunctionFragment; ++ "numCheckpoints(address)": FunctionFragment; ++ "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": FunctionFragment; ++ "supportsInterface(bytes4)": FunctionFragment; ++ "symbol()": FunctionFragment; ++ "totalSupply()": FunctionFragment; ++ "transfer(address,uint256)": FunctionFragment; ++ "transferFrom(address,address,uint256)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "DOMAIN_SEPARATOR" ++ | "OFFSET" ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "checkpoints" ++ | "decimals" ++ | "decreaseAllowance" ++ | "delegate" ++ | "delegateBySig" ++ | "delegates" ++ | "getCurrentVotes" ++ | "getPastTotalSupply" ++ | "getPastVotes" ++ | "getPriorVotes" ++ | "getVotes" ++ | "increaseAllowance" ++ | "l1Token" ++ | "l2Bridge" ++ | "maxSupply" ++ | "mint" ++ | "name" ++ | "nonces" ++ | "numCheckpoints" ++ | "permit" ++ | "supportsInterface" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "DOMAIN_SEPARATOR", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "OFFSET", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "allowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "approve", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "burn", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "checkpoints", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "decreaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegate", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegateBySig", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "delegates", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getCurrentVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastTotalSupply", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPastVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getPriorVotes", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getVotes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "increaseAllowance", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; ++ encodeFunctionData(functionFragment: "l2Bridge", values?: undefined): string; ++ encodeFunctionData(functionFragment: "maxSupply", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "mint", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "name", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "nonces", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "numCheckpoints", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "permit", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "supportsInterface", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData(functionFragment: "symbol", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "totalSupply", ++ values?: undefined ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transfer", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "transferFrom", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "DOMAIN_SEPARATOR", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "OFFSET", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "checkpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "decreaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "delegateBySig", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "delegates", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getCurrentVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastTotalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPastVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "getPriorVotes", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getVotes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "increaseAllowance", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "l1Token", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "l2Bridge", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "maxSupply", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "numCheckpoints", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "supportsInterface", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "totalSupply", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "transferFrom", ++ data: BytesLike ++ ): Result; ++ ++ events: { ++ "Approval(address,address,uint256)": EventFragment; ++ "Burn(address,uint256)": EventFragment; ++ "DelegateChanged(address,address,address)": EventFragment; ++ "DelegateVotesChanged(address,uint256,uint256)": EventFragment; ++ "Mint(address,uint256)": EventFragment; ++ "Transfer(address,address,uint256)": EventFragment; ++ }; ++ ++ getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Burn"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "DelegateVotesChanged"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Mint"): EventFragment; ++ getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; ++} ++ ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} ++export type ApprovalEvent = TypedEvent< ++ [string, string, BigNumber], ++ ApprovalEventObject ++>; ++ ++export type ApprovalEventFilter = TypedEventFilter; ++ ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; ++ ++export type BurnEventFilter = TypedEventFilter; ++ ++export interface DelegateChangedEventObject { ++ delegator: string; ++ fromDelegate: string; ++ toDelegate: string; ++} ++export type DelegateChangedEvent = TypedEvent< ++ [string, string, string], ++ DelegateChangedEventObject ++>; ++ ++export type DelegateChangedEventFilter = TypedEventFilter; ++ ++export interface DelegateVotesChangedEventObject { ++ delegate: string; ++ previousBalance: BigNumber; ++ newBalance: BigNumber; ++} ++export type DelegateVotesChangedEvent = TypedEvent< ++ [string, BigNumber, BigNumber], ++ DelegateVotesChangedEventObject ++>; ++ ++export type DelegateVotesChangedEventFilter = ++ TypedEventFilter; ++ ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; ++ ++export type MintEventFilter = TypedEventFilter; ++ ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} ++export type TransferEvent = TypedEvent< ++ [string, string, BigNumber], ++ TransferEventObject ++>; ++ ++export type TransferEventFilter = TypedEventFilter; ++ ++export interface L2GovernanceERC20 extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: L2GovernanceERC20Interface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; ++ ++ OFFSET(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[ERC20Votes.CheckpointStructOutput]>; ++ ++ decimals(overrides?: CallOverrides): Promise<[number]>; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise<[string]>; ++ ++ l2Bridge(overrides?: CallOverrides): Promise<[string]>; ++ ++ maxSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise<[string]>; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[number]>; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ symbol(overrides?: CallOverrides): Promise<[string]>; ++ ++ totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: { ++ "Approval(address,address,uint256)"( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ Approval( ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, ++ value?: null ++ ): ApprovalEventFilter; ++ ++ "Burn(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ ++ "DelegateChanged(address,address,address)"( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ DelegateChanged( ++ delegator?: PromiseOrValue | null, ++ fromDelegate?: PromiseOrValue | null, ++ toDelegate?: PromiseOrValue | null ++ ): DelegateChangedEventFilter; ++ ++ "DelegateVotesChanged(address,uint256,uint256)"( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ DelegateVotesChanged( ++ delegate?: PromiseOrValue | null, ++ previousBalance?: null, ++ newBalance?: null ++ ): DelegateVotesChangedEventFilter; ++ ++ "Mint(address,uint256)"( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ ++ "Transfer(address,address,uint256)"( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ Transfer( ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, ++ value?: null ++ ): TransferEventFilter; ++ }; ++ ++ estimateGas: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; ++ ++ OFFSET(overrides?: CallOverrides): Promise; ++ ++ allowance( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ approve( ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ burn( ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ checkpoints( ++ account: PromiseOrValue, ++ pos: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ decimals(overrides?: CallOverrides): Promise; ++ ++ decreaseAllowance( ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegate( ++ delegatee: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegateBySig( ++ delegatee: PromiseOrValue, ++ nonce: PromiseOrValue, ++ expiry: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ delegates( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getCurrentVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastTotalSupply( ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPastVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getPriorVotes( ++ account: PromiseOrValue, ++ blockNumber: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getVotes( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ increaseAllowance( ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ l1Token(overrides?: CallOverrides): Promise; ++ ++ l2Bridge(overrides?: CallOverrides): Promise; ++ ++ maxSupply(overrides?: CallOverrides): Promise; ++ ++ mint( ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ name(overrides?: CallOverrides): Promise; ++ ++ nonces( ++ owner: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ numCheckpoints( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ permit( ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ deadline: PromiseOrValue, ++ v: PromiseOrValue, ++ r: PromiseOrValue, ++ s: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ supportsInterface( ++ _interfaceId: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ symbol(overrides?: CallOverrides): Promise; ++ ++ totalSupply(overrides?: CallOverrides): Promise; ++ ++ transfer( ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ transferFrom( ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/L2StandardERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2StandardERC20.ts +similarity index 55% +rename from node_modules/@eth-optimism/contracts/dist/types/L2StandardERC20.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2StandardERC20.ts +index 17e464c..376b2aa 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/L2StandardERC20.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/L2StandardERC20.ts +@@ -1,30 +1,33 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../common"; + +-export interface L2StandardERC20Interface extends ethers.utils.Interface { ++export interface L2StandardERC20Interface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; +@@ -44,38 +47,61 @@ export interface L2StandardERC20Interface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "burn" ++ | "decimals" ++ | "decreaseAllowance" ++ | "increaseAllowance" ++ | "l1Token" ++ | "l2Bridge" ++ | "mint" ++ | "name" ++ | "supportsInterface" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData( + functionFragment: "burn", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( + functionFragment: "decreaseAllowance", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "increaseAllowance", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "l1Token", values?: undefined): string; + encodeFunctionData(functionFragment: "l2Bridge", values?: undefined): string; + encodeFunctionData( + functionFragment: "mint", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "supportsInterface", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( +@@ -84,11 +110,15 @@ export interface L2StandardERC20Interface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; +@@ -136,30 +166,42 @@ export interface L2StandardERC20Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + +-export type BurnEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface BurnEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type BurnEvent = TypedEvent<[string, BigNumber], BurnEventObject>; + + export type BurnEventFilter = TypedEventFilter; + +-export type MintEvent = TypedEvent< +- [string, BigNumber], +- { _account: string; _amount: BigNumber } +->; ++export interface MintEventObject { ++ _account: string; ++ _amount: BigNumber; ++} ++export type MintEvent = TypedEvent<[string, BigNumber], MintEventObject>; + + export type MintEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; +@@ -192,37 +234,40 @@ export interface L2StandardERC20 extends BaseContract { + + functions: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise<[string]>; +@@ -230,15 +275,15 @@ export interface L2StandardERC20 extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise<[string]>; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + +@@ -247,51 +292,54 @@ export interface L2StandardERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -299,15 +347,15 @@ export interface L2StandardERC20 extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -316,50 +364,53 @@ export interface L2StandardERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -368,15 +419,15 @@ export interface L2StandardERC20 extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -385,88 +436,97 @@ export interface L2StandardERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Burn(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): BurnEventFilter; ++ Burn( ++ _account?: PromiseOrValue | null, + _amount?: null + ): BurnEventFilter; +- Burn(_account?: string | null, _amount?: null): BurnEventFilter; + + "Mint(address,uint256)"( +- _account?: string | null, ++ _account?: PromiseOrValue | null, ++ _amount?: null ++ ): MintEventFilter; ++ Mint( ++ _account?: PromiseOrValue | null, + _amount?: null + ): MintEventFilter; +- Mint(_account?: string | null, _amount?: null): MintEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ account: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -474,15 +534,15 @@ export interface L2StandardERC20 extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -491,55 +551,55 @@ export interface L2StandardERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- owner: string, +- spender: string, ++ owner: PromiseOrValue, ++ spender: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- account: string, ++ account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( +- _from: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _from: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ subtractedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ addedValue: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + l1Token(overrides?: CallOverrides): Promise; +@@ -547,15 +607,15 @@ export interface L2StandardERC20 extends BaseContract { + l2Bridge(overrides?: CallOverrides): Promise; + + mint( +- _to: string, +- _amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ _to: PromiseOrValue, ++ _amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + supportsInterface( +- _interfaceId: BytesLike, ++ _interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +@@ -564,16 +624,16 @@ export interface L2StandardERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ sender: PromiseOrValue, ++ recipient: PromiseOrValue, ++ amount: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/index.ts +new file mode 100644 +index 0000000..06c415b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/standards/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { IL2StandardERC20 } from "./IL2StandardERC20"; ++export type { L2GovernanceERC20 } from "./L2GovernanceERC20"; ++export type { L2StandardERC20 } from "./L2StandardERC20"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_GasMeasurer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_GasMeasurer.ts +new file mode 100644 +index 0000000..873b7b1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_GasMeasurer.ts +@@ -0,0 +1,110 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../common"; ++ ++export interface Helper_GasMeasurerInterface extends utils.Interface { ++ functions: { ++ "measureCallGas(address,bytes)": FunctionFragment; ++ }; ++ ++ getFunction(nameOrSignatureOrTopic: "measureCallGas"): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "measureCallGas", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "measureCallGas", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface Helper_GasMeasurer extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: Helper_GasMeasurerInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ measureCallGas( ++ _target: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ measureCallGas( ++ _target: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ measureCallGas( ++ _target: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ measureCallGas( ++ _target: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ measureCallGas( ++ _target: PromiseOrValue, ++ _data: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/HelperSimpleProxy.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_SimpleProxy.ts +similarity index 58% +rename from node_modules/@eth-optimism/contracts/dist/types/HelperSimpleProxy.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_SimpleProxy.ts +index 40d080a..c638c9d 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/HelperSimpleProxy.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/Helper_SimpleProxy.ts +@@ -1,47 +1,50 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../common"; + +-export interface HelperSimpleProxyInterface extends ethers.utils.Interface { ++export interface Helper_SimpleProxyInterface extends utils.Interface { + functions: { + "setTarget(address)": FunctionFragment; + }; + +- encodeFunctionData(functionFragment: "setTarget", values: [string]): string; ++ getFunction(nameOrSignatureOrTopic: "setTarget"): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "setTarget", ++ values: [PromiseOrValue] ++ ): string; + + decodeFunctionResult(functionFragment: "setTarget", data: BytesLike): Result; + + events: {}; + } + +-export interface HelperSimpleProxy extends BaseContract { ++export interface Helper_SimpleProxy extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: HelperSimpleProxyInterface; ++ interface: Helper_SimpleProxyInterface; + + queryFilter( + event: TypedEventFilter, +@@ -64,33 +67,36 @@ export interface HelperSimpleProxy extends BaseContract { + + functions: { + setTarget( +- _target: string, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + setTarget( +- _target: string, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { +- setTarget(_target: string, overrides?: CallOverrides): Promise; ++ setTarget( ++ _target: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; + + estimateGas: { + setTarget( +- _target: string, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + setTarget( +- _target: string, +- overrides?: Overrides & { from?: string | Promise } ++ _target: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/ERC20.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/TestERC20.ts +similarity index 55% +rename from node_modules/@eth-optimism/contracts/dist/types/ERC20.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/TestERC20.ts +index 9573cee..f07f33f 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/ERC20.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/TestERC20.ts +@@ -1,37 +1,39 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { ++ FunctionFragment, ++ Result, ++ EventFragment, ++} from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../common"; + +-export interface ERC20Interface extends ethers.utils.Interface { ++export interface TestERC20Interface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "decimals()": FunctionFragment; +- "decreaseAllowance(address,uint256)": FunctionFragment; +- "increaseAllowance(address,uint256)": FunctionFragment; ++ "mint(address,uint256)": FunctionFragment; + "name()": FunctionFragment; + "symbol()": FunctionFragment; + "totalSupply()": FunctionFragment; +@@ -39,23 +41,36 @@ export interface ERC20Interface extends ethers.utils.Interface { + "transferFrom(address,address,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "allowance" ++ | "approve" ++ | "balanceOf" ++ | "decimals" ++ | "mint" ++ | "name" ++ | "symbol" ++ | "totalSupply" ++ | "transfer" ++ | "transferFrom" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "allowance", +- values: [string, string] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; +- encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( +- functionFragment: "decreaseAllowance", +- values: [string, BigNumberish] ++ functionFragment: "balanceOf", ++ values: [PromiseOrValue] + ): string; ++ encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( +- functionFragment: "increaseAllowance", +- values: [string, BigNumberish] ++ functionFragment: "mint", ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; +@@ -65,25 +80,22 @@ export interface ERC20Interface extends ethers.utils.Interface { + ): string; + encodeFunctionData( + functionFragment: "transfer", +- values: [string, BigNumberish] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", +- values: [string, string, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; +- decodeFunctionResult( +- functionFragment: "decreaseAllowance", +- data: BytesLike +- ): Result; +- decodeFunctionResult( +- functionFragment: "increaseAllowance", +- data: BytesLike +- ): Result; ++ decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( +@@ -105,26 +117,36 @@ export interface ERC20Interface extends ethers.utils.Interface { + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + } + ++export interface ApprovalEventObject { ++ owner: string; ++ spender: string; ++ value: BigNumber; ++} + export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], +- { owner: string; spender: string; value: BigNumber } ++ ApprovalEventObject + >; + + export type ApprovalEventFilter = TypedEventFilter; + ++export interface TransferEventObject { ++ from: string; ++ to: string; ++ value: BigNumber; ++} + export type TransferEvent = TypedEvent< + [string, string, BigNumber], +- { from: string; to: string; value: BigNumber } ++ TransferEventObject + >; + + export type TransferEventFilter = TypedEventFilter; + +-export interface ERC20 extends BaseContract { ++export interface TestERC20 extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: ERC20Interface; ++ interface: TestERC20Interface; + + queryFilter( + event: TypedEventFilter, +@@ -147,31 +169,28 @@ export interface ERC20 extends BaseContract { + + functions: { + allowance( +- owner: string, +- spender: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + +- decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ mint( ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; +@@ -181,45 +200,42 @@ export interface ERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ from: PromiseOrValue, ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allowance( +- owner: string, +- spender: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ mint( ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -229,46 +245,43 @@ export interface ERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ from: PromiseOrValue, ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allowance( +- owner: string, +- spender: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, ++ spender: PromiseOrValue, ++ value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, ++ mint( ++ to: PromiseOrValue, ++ value: PromiseOrValue, + overrides?: CallOverrides +- ): Promise; +- +- increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: CallOverrides +- ): Promise; ++ ): Promise; + + name(overrides?: CallOverrides): Promise; + +@@ -277,70 +290,67 @@ export interface ERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, ++ to: PromiseOrValue, ++ value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, ++ from: PromiseOrValue, ++ to: PromiseOrValue, ++ value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + Approval( +- owner?: string | null, +- spender?: string | null, ++ owner?: PromiseOrValue | null, ++ spender?: PromiseOrValue | null, + value?: null + ): ApprovalEventFilter; + + "Transfer(address,address,uint256)"( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + Transfer( +- from?: string | null, +- to?: string | null, ++ from?: PromiseOrValue | null, ++ to?: PromiseOrValue | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( +- owner: string, +- spender: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- balanceOf(account: string, overrides?: CallOverrides): Promise; ++ balanceOf( ++ arg0: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ mint( ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -350,49 +360,43 @@ export interface ERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ from: PromiseOrValue, ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allowance( +- owner: string, +- spender: string, ++ arg0: PromiseOrValue, ++ arg1: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( +- spender: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ spender: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( +- account: string, ++ arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + +- decreaseAllowance( +- spender: string, +- subtractedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } +- ): Promise; +- +- increaseAllowance( +- spender: string, +- addedValue: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ mint( ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; +@@ -402,16 +406,16 @@ export interface ERC20 extends BaseContract { + totalSupply(overrides?: CallOverrides): Promise; + + transfer( +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferFrom( +- sender: string, +- recipient: string, +- amount: BigNumberish, +- overrides?: Overrides & { from?: string | Promise } ++ from: PromiseOrValue, ++ to: PromiseOrValue, ++ value: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + } +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/index.ts +new file mode 100644 +index 0000000..ab1e1fb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-helpers/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { Helper_GasMeasurer } from "./Helper_GasMeasurer"; ++export type { Helper_SimpleProxy } from "./Helper_SimpleProxy"; ++export type { TestERC20 } from "./TestERC20"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibCrossDomainUtils.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.ts +similarity index 55% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibCrossDomainUtils.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.ts +index c532366..ec10153 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibCrossDomainUtils.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/TestLib_CrossDomainUtils.ts +@@ -1,37 +1,43 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibCrossDomainUtilsInterface +- extends ethers.utils.Interface { ++export interface TestLib_CrossDomainUtilsInterface extends utils.Interface { + functions: { + "encodeXDomainCalldata(address,address,bytes,uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "encodeXDomainCalldata" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "encodeXDomainCalldata", +- values: [string, string, BytesLike, BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult( +@@ -42,12 +48,12 @@ export interface TestLibCrossDomainUtilsInterface + events: {}; + } + +-export interface TestLibCrossDomainUtils extends BaseContract { ++export interface TestLib_CrossDomainUtils extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibCrossDomainUtilsInterface; ++ interface: TestLib_CrossDomainUtilsInterface; + + queryFilter( + event: TypedEventFilter, +@@ -70,28 +76,28 @@ export interface TestLibCrossDomainUtils extends BaseContract { + + functions: { + encodeXDomainCalldata( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + }; + + encodeXDomainCalldata( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + encodeXDomainCalldata( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -100,20 +106,20 @@ export interface TestLibCrossDomainUtils extends BaseContract { + + estimateGas: { + encodeXDomainCalldata( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + encodeXDomainCalldata( +- _target: string, +- _sender: string, +- _message: BytesLike, +- _messageNonce: BigNumberish, ++ _target: PromiseOrValue, ++ _sender: PromiseOrValue, ++ _message: PromiseOrValue, ++ _messageNonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/index.ts +new file mode 100644 +index 0000000..e05b984 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/bridge/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_CrossDomainUtils } from "./TestLib_CrossDomainUtils"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibOVMCodec.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/TestLib_OVMCodec.ts +similarity index 59% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibOVMCodec.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/TestLib_OVMCodec.ts +index 55f7672..53b0665 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibOVMCodec.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/TestLib_OVMCodec.ts +@@ -1,69 +1,73 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; +- +-export type TransactionStruct = { +- timestamp: BigNumberish; +- blockNumber: BigNumberish; +- l1QueueOrigin: BigNumberish; +- l1TxOrigin: string; +- entrypoint: string; +- gasLimit: BigNumberish; +- data: BytesLike; +-}; +- +-export type TransactionStructOutput = [ +- BigNumber, +- BigNumber, +- number, +- string, +- string, +- BigNumber, +- string +-] & { +- timestamp: BigNumber; +- blockNumber: BigNumber; +- l1QueueOrigin: number; +- l1TxOrigin: string; +- entrypoint: string; +- gasLimit: BigNumber; +- data: string; +-}; +- +-export interface TestLibOVMCodecInterface extends ethers.utils.Interface { ++ PromiseOrValue, ++} from "../../../common"; ++ ++export declare namespace Lib_OVMCodec { ++ export type TransactionStruct = { ++ timestamp: PromiseOrValue; ++ blockNumber: PromiseOrValue; ++ l1QueueOrigin: PromiseOrValue; ++ l1TxOrigin: PromiseOrValue; ++ entrypoint: PromiseOrValue; ++ gasLimit: PromiseOrValue; ++ data: PromiseOrValue; ++ }; ++ ++ export type TransactionStructOutput = [ ++ BigNumber, ++ BigNumber, ++ number, ++ string, ++ string, ++ BigNumber, ++ string ++ ] & { ++ timestamp: BigNumber; ++ blockNumber: BigNumber; ++ l1QueueOrigin: number; ++ l1TxOrigin: string; ++ entrypoint: string; ++ gasLimit: BigNumber; ++ data: string; ++ }; ++} ++ ++export interface TestLib_OVMCodecInterface extends utils.Interface { + functions: { + "encodeTransaction((uint256,uint256,uint8,address,address,uint256,bytes))": FunctionFragment; + "hashTransaction((uint256,uint256,uint8,address,address,uint256,bytes))": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "encodeTransaction" | "hashTransaction" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "encodeTransaction", +- values: [TransactionStruct] ++ values: [Lib_OVMCodec.TransactionStruct] + ): string; + encodeFunctionData( + functionFragment: "hashTransaction", +- values: [TransactionStruct] ++ values: [Lib_OVMCodec.TransactionStruct] + ): string; + + decodeFunctionResult( +@@ -78,12 +82,12 @@ export interface TestLibOVMCodecInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface TestLibOVMCodec extends BaseContract { ++export interface TestLib_OVMCodec extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibOVMCodecInterface; ++ interface: TestLib_OVMCodecInterface; + + queryFilter( + event: TypedEventFilter, +@@ -106,34 +110,34 @@ export interface TestLibOVMCodec extends BaseContract { + + functions: { + encodeTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise<[string] & { _encoded: string }>; + + hashTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise<[string] & { _hash: string }>; + }; + + encodeTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + + hashTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + + callStatic: { + encodeTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + + hashTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + }; +@@ -142,24 +146,24 @@ export interface TestLibOVMCodec extends BaseContract { + + estimateGas: { + encodeTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + + hashTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + encodeTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + + hashTransaction( +- _transaction: TransactionStruct, ++ _transaction: Lib_OVMCodec.TransactionStruct, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/index.ts +new file mode 100644 +index 0000000..06d9b09 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/codec/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_OVMCodec } from "./TestLib_OVMCodec"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/index.ts +new file mode 100644 +index 0000000..f46bb46 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/index.ts +@@ -0,0 +1,15 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type * as bridge from "./bridge"; ++export type { bridge }; ++import type * as codec from "./codec"; ++export type { codec }; ++import type * as rlp from "./rlp"; ++export type { rlp }; ++import type * as standards from "./standards"; ++export type { standards }; ++import type * as trie from "./trie"; ++export type { trie }; ++import type * as utils from "./utils"; ++export type { utils }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPReader.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPReader.ts +new file mode 100644 +index 0000000..7af0b3c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPReader.ts +@@ -0,0 +1,304 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BytesLike, ++ CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface TestLib_RLPReaderInterface extends utils.Interface { ++ functions: { ++ "readAddress(bytes)": FunctionFragment; ++ "readBool(bytes)": FunctionFragment; ++ "readBytes(bytes)": FunctionFragment; ++ "readBytes32(bytes)": FunctionFragment; ++ "readList(bytes)": FunctionFragment; ++ "readString(bytes)": FunctionFragment; ++ "readUint256(bytes)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "readAddress" ++ | "readBool" ++ | "readBytes" ++ | "readBytes32" ++ | "readList" ++ | "readString" ++ | "readUint256" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "readAddress", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readBool", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readBytes", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readBytes32", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readList", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readString", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "readUint256", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "readAddress", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "readBool", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "readBytes", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "readBytes32", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "readList", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "readString", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "readUint256", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface TestLib_RLPReader extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: TestLib_RLPReaderInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ readAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ readBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ readBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ readBytes32( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ readList( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string[]]>; ++ ++ readString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ readUint256( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ }; ++ ++ readAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes32( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readList( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readUint256( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ callStatic: { ++ readAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes32( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readList( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readUint256( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ readAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes32( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readList( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readUint256( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ readAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readBytes32( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readList( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ readUint256( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibRLPWriter.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPWriter.ts +similarity index 51% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibRLPWriter.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPWriter.ts +index 35df2e4..ceddcd7 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibRLPWriter.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/TestLib_RLPWriter.ts +@@ -1,30 +1,29 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, ++ BytesLike, ++ CallOverrides, + ContractTransaction, + Overrides, +- CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibRLPWriterInterface extends ethers.utils.Interface { ++export interface TestLib_RLPWriterInterface extends utils.Interface { + functions: { + "writeAddress(address)": FunctionFragment; + "writeAddressWithTaintedMemory(address)": FunctionFragment; +@@ -35,27 +34,44 @@ export interface TestLibRLPWriterInterface extends ethers.utils.Interface { + "writeUint(uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "writeAddress" ++ | "writeAddressWithTaintedMemory" ++ | "writeBool" ++ | "writeBytes" ++ | "writeList" ++ | "writeString" ++ | "writeUint" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "writeAddress", +- values: [string] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "writeAddressWithTaintedMemory", +- values: [string] ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "writeBool", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "writeBool", values: [boolean]): string; + encodeFunctionData( + functionFragment: "writeBytes", +- values: [BytesLike] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "writeList", +- values: [BytesLike[]] ++ values: [PromiseOrValue[]] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "writeString", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "writeString", values: [string]): string; + encodeFunctionData( + functionFragment: "writeUint", +- values: [BigNumberish] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -78,12 +94,12 @@ export interface TestLibRLPWriterInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface TestLibRLPWriter extends BaseContract { ++export interface TestLib_RLPWriter extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibRLPWriterInterface; ++ interface: TestLib_RLPWriterInterface; + + queryFilter( + event: TypedEventFilter, +@@ -106,131 +122,185 @@ export interface TestLibRLPWriter extends BaseContract { + + functions: { + writeAddress( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + writeAddressWithTaintedMemory( +- _in: string, +- overrides?: Overrides & { from?: string | Promise } ++ _in: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + writeBool( +- _in: boolean, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + writeBytes( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + writeList( +- _in: BytesLike[], ++ _in: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + writeString( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + writeUint( +- _in: BigNumberish, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + }; + +- writeAddress(_in: string, overrides?: CallOverrides): Promise; ++ writeAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + writeAddressWithTaintedMemory( +- _in: string, +- overrides?: Overrides & { from?: string | Promise } ++ _in: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- writeBool(_in: boolean, overrides?: CallOverrides): Promise; ++ writeBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeBytes(_in: BytesLike, overrides?: CallOverrides): Promise; ++ writeBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeList(_in: BytesLike[], overrides?: CallOverrides): Promise; ++ writeList( ++ _in: PromiseOrValue[], ++ overrides?: CallOverrides ++ ): Promise; + +- writeString(_in: string, overrides?: CallOverrides): Promise; ++ writeString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeUint(_in: BigNumberish, overrides?: CallOverrides): Promise; ++ writeUint( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { +- writeAddress(_in: string, overrides?: CallOverrides): Promise; ++ writeAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + writeAddressWithTaintedMemory( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- writeBool(_in: boolean, overrides?: CallOverrides): Promise; ++ writeBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeBytes(_in: BytesLike, overrides?: CallOverrides): Promise; ++ writeBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeList(_in: BytesLike[], overrides?: CallOverrides): Promise; ++ writeList( ++ _in: PromiseOrValue[], ++ overrides?: CallOverrides ++ ): Promise; + +- writeString(_in: string, overrides?: CallOverrides): Promise; ++ writeString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeUint(_in: BigNumberish, overrides?: CallOverrides): Promise; ++ writeUint( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; + + estimateGas: { +- writeAddress(_in: string, overrides?: CallOverrides): Promise; ++ writeAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + writeAddressWithTaintedMemory( +- _in: string, +- overrides?: Overrides & { from?: string | Promise } ++ _in: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + +- writeBool(_in: boolean, overrides?: CallOverrides): Promise; ++ writeBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeBytes(_in: BytesLike, overrides?: CallOverrides): Promise; ++ writeBytes( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeList(_in: BytesLike[], overrides?: CallOverrides): Promise; ++ writeList( ++ _in: PromiseOrValue[], ++ overrides?: CallOverrides ++ ): Promise; + +- writeString(_in: string, overrides?: CallOverrides): Promise; ++ writeString( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- writeUint(_in: BigNumberish, overrides?: CallOverrides): Promise; ++ writeUint( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + populateTransaction: { + writeAddress( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + writeAddressWithTaintedMemory( +- _in: string, +- overrides?: Overrides & { from?: string | Promise } ++ _in: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + writeBool( +- _in: boolean, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + writeBytes( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + writeList( +- _in: BytesLike[], ++ _in: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + writeString( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + writeUint( +- _in: BigNumberish, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/index.ts +new file mode 100644 +index 0000000..6c610e6 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/rlp/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_RLPReader } from "./TestLib_RLPReader"; ++export type { TestLib_RLPWriter } from "./TestLib_RLPWriter"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibAddressAliasHelper.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/TestLib_AddressAliasHelper.ts +similarity index 69% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibAddressAliasHelper.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/TestLib_AddressAliasHelper.ts +index 2901b56..bea742c 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibAddressAliasHelper.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/TestLib_AddressAliasHelper.ts +@@ -1,42 +1,42 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibAddressAliasHelperInterface +- extends ethers.utils.Interface { ++export interface TestLib_AddressAliasHelperInterface extends utils.Interface { + functions: { + "applyL1ToL2Alias(address)": FunctionFragment; + "undoL1ToL2Alias(address)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "applyL1ToL2Alias" | "undoL1ToL2Alias" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "applyL1ToL2Alias", +- values: [string] ++ values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "undoL1ToL2Alias", +- values: [string] ++ values: [PromiseOrValue] + ): string; + + decodeFunctionResult( +@@ -51,12 +51,12 @@ export interface TestLibAddressAliasHelperInterface + events: {}; + } + +-export interface TestLibAddressAliasHelper extends BaseContract { ++export interface TestLib_AddressAliasHelper extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibAddressAliasHelperInterface; ++ interface: TestLib_AddressAliasHelperInterface; + + queryFilter( + event: TypedEventFilter, +@@ -79,31 +79,34 @@ export interface TestLibAddressAliasHelper extends BaseContract { + + functions: { + applyL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + undoL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + }; + + applyL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + +- undoL1ToL2Alias(_address: string, overrides?: CallOverrides): Promise; ++ undoL1ToL2Alias( ++ _address: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { + applyL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + undoL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -112,24 +115,24 @@ export interface TestLibAddressAliasHelper extends BaseContract { + + estimateGas: { + applyL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + undoL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + applyL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + undoL1ToL2Alias( +- _address: string, ++ _address: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/index.ts +new file mode 100644 +index 0000000..501adcb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/standards/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_AddressAliasHelper } from "./TestLib_AddressAliasHelper"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibSecureMerkleTrie.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_MerkleTrie.ts +similarity index 50% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibSecureMerkleTrie.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_MerkleTrie.ts +index 61cfcb5..5b305e2 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibSecureMerkleTrie.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_MerkleTrie.ts +@@ -1,30 +1,26 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibSecureMerkleTrieInterface +- extends ethers.utils.Interface { ++export interface TestLib_MerkleTrieInterface extends utils.Interface { + functions: { + "get(bytes,bytes,bytes32)": FunctionFragment; + "getSingleNodeRootHash(bytes,bytes)": FunctionFragment; +@@ -32,21 +28,43 @@ export interface TestLibSecureMerkleTrieInterface + "verifyInclusionProof(bytes,bytes,bytes,bytes32)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "get" ++ | "getSingleNodeRootHash" ++ | "update" ++ | "verifyInclusionProof" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "get", +- values: [BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "getSingleNodeRootHash", +- values: [BytesLike, BytesLike] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "update", +- values: [BytesLike, BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "verifyInclusionProof", +- values: [BytesLike, BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; +@@ -63,12 +81,12 @@ export interface TestLibSecureMerkleTrieInterface + events: {}; + } + +-export interface TestLibSecureMerkleTrie extends BaseContract { ++export interface TestLib_MerkleTrie extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibSecureMerkleTrieInterface; ++ interface: TestLib_MerkleTrieInterface; + + queryFilter( + event: TypedEventFilter, +@@ -91,91 +109,91 @@ export interface TestLibSecureMerkleTrie extends BaseContract { + + functions: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -184,62 +202,62 @@ export interface TestLibSecureMerkleTrie extends BaseContract { + + estimateGas: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTrie.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.ts +similarity index 50% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTrie.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.ts +index 87df274..5c161b1 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTrie.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/TestLib_SecureMerkleTrie.ts +@@ -1,29 +1,26 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibMerkleTrieInterface extends ethers.utils.Interface { ++export interface TestLib_SecureMerkleTrieInterface extends utils.Interface { + functions: { + "get(bytes,bytes,bytes32)": FunctionFragment; + "getSingleNodeRootHash(bytes,bytes)": FunctionFragment; +@@ -31,21 +28,43 @@ export interface TestLibMerkleTrieInterface extends ethers.utils.Interface { + "verifyInclusionProof(bytes,bytes,bytes,bytes32)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "get" ++ | "getSingleNodeRootHash" ++ | "update" ++ | "verifyInclusionProof" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "get", +- values: [BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "getSingleNodeRootHash", +- values: [BytesLike, BytesLike] ++ values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "update", +- values: [BytesLike, BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + encodeFunctionData( + functionFragment: "verifyInclusionProof", +- values: [BytesLike, BytesLike, BytesLike, BytesLike] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; +@@ -62,12 +81,12 @@ export interface TestLibMerkleTrieInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface TestLibMerkleTrie extends BaseContract { ++export interface TestLib_SecureMerkleTrie extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibMerkleTrieInterface; ++ interface: TestLib_SecureMerkleTrieInterface; + + queryFilter( + event: TypedEventFilter, +@@ -90,91 +109,91 @@ export interface TestLibMerkleTrie extends BaseContract { + + functions: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean, string]>; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -183,62 +202,62 @@ export interface TestLibMerkleTrie extends BaseContract { + + estimateGas: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + get( +- _key: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSingleNodeRootHash( +- _key: BytesLike, +- _value: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + update( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + verifyInclusionProof( +- _key: BytesLike, +- _value: BytesLike, +- _proof: BytesLike, +- _root: BytesLike, ++ _key: PromiseOrValue, ++ _value: PromiseOrValue, ++ _proof: PromiseOrValue, ++ _root: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/index.ts +new file mode 100644 +index 0000000..80f77e5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/trie/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_MerkleTrie } from "./TestLib_MerkleTrie"; ++export type { TestLib_SecureMerkleTrie } from "./TestLib_SecureMerkleTrie"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Buffer.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Buffer.ts +new file mode 100644 +index 0000000..a43e35f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Buffer.ts +@@ -0,0 +1,287 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface TestLib_BufferInterface extends utils.Interface { ++ functions: { ++ "deleteElementsAfterInclusive(uint40,bytes27)": FunctionFragment; ++ "deleteElementsAfterInclusive(uint40)": FunctionFragment; ++ "get(uint256)": FunctionFragment; ++ "getExtraData()": FunctionFragment; ++ "getLength()": FunctionFragment; ++ "push(bytes32,bytes27)": FunctionFragment; ++ "setExtraData(bytes27)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "deleteElementsAfterInclusive(uint40,bytes27)" ++ | "deleteElementsAfterInclusive(uint40)" ++ | "get" ++ | "getExtraData" ++ | "getLength" ++ | "push" ++ | "setExtraData" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "deleteElementsAfterInclusive(uint40,bytes27)", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "deleteElementsAfterInclusive(uint40)", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "get", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "getExtraData", ++ values?: undefined ++ ): string; ++ encodeFunctionData(functionFragment: "getLength", values?: undefined): string; ++ encodeFunctionData( ++ functionFragment: "push", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "setExtraData", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult( ++ functionFragment: "deleteElementsAfterInclusive(uint40,bytes27)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult( ++ functionFragment: "deleteElementsAfterInclusive(uint40)", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "get", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "getExtraData", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "getLength", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "push", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "setExtraData", ++ data: BytesLike ++ ): Result; ++ ++ events: {}; ++} ++ ++export interface TestLib_Buffer extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: TestLib_BufferInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ "deleteElementsAfterInclusive(uint40,bytes27)"( ++ _index: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint40)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ getExtraData(overrides?: CallOverrides): Promise<[string]>; ++ ++ getLength(overrides?: CallOverrides): Promise<[number]>; ++ ++ push( ++ _value: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setExtraData( ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ "deleteElementsAfterInclusive(uint40,bytes27)"( ++ _index: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint40)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getExtraData(overrides?: CallOverrides): Promise; ++ ++ getLength(overrides?: CallOverrides): Promise; ++ ++ push( ++ _value: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setExtraData( ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ callStatic: { ++ "deleteElementsAfterInclusive(uint40,bytes27)"( ++ _index: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint40)"( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getExtraData(overrides?: CallOverrides): Promise; ++ ++ getLength(overrides?: CallOverrides): Promise; ++ ++ push( ++ _value: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ setExtraData( ++ _extraData: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ "deleteElementsAfterInclusive(uint40,bytes27)"( ++ _index: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint40)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getExtraData(overrides?: CallOverrides): Promise; ++ ++ getLength(overrides?: CallOverrides): Promise; ++ ++ push( ++ _value: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setExtraData( ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ "deleteElementsAfterInclusive(uint40,bytes27)"( ++ _index: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ "deleteElementsAfterInclusive(uint40)"( ++ _index: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ get( ++ _index: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ getExtraData(overrides?: CallOverrides): Promise; ++ ++ getLength(overrides?: CallOverrides): Promise; ++ ++ push( ++ _value: PromiseOrValue, ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ setExtraData( ++ _extraData: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibBytes32Utils.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Bytes32Utils.ts +similarity index 50% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibBytes32Utils.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Bytes32Utils.ts +index 87cc064..68fb301 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibBytes32Utils.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_Bytes32Utils.ts +@@ -1,29 +1,26 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, +- BigNumber, +- BigNumberish, +- PopulatedTransaction, ++import type { + BaseContract, +- ContractTransaction, ++ BigNumber, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibBytes32UtilsInterface extends ethers.utils.Interface { ++export interface TestLib_Bytes32UtilsInterface extends utils.Interface { + functions: { + "fromAddress(address)": FunctionFragment; + "fromBool(bool)": FunctionFragment; +@@ -31,13 +28,26 @@ export interface TestLibBytes32UtilsInterface extends ethers.utils.Interface { + "toBool(bytes32)": FunctionFragment; + }; + +- encodeFunctionData(functionFragment: "fromAddress", values: [string]): string; +- encodeFunctionData(functionFragment: "fromBool", values: [boolean]): string; ++ getFunction( ++ nameOrSignatureOrTopic: "fromAddress" | "fromBool" | "toAddress" | "toBool" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "fromAddress", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "fromBool", ++ values: [PromiseOrValue] ++ ): string; + encodeFunctionData( + functionFragment: "toAddress", +- values: [BytesLike] ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "toBool", ++ values: [PromiseOrValue] + ): string; +- encodeFunctionData(functionFragment: "toBool", values: [BytesLike]): string; + + decodeFunctionResult( + functionFragment: "fromAddress", +@@ -50,12 +60,12 @@ export interface TestLibBytes32UtilsInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface TestLibBytes32Utils extends BaseContract { ++export interface TestLib_Bytes32Utils extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibBytes32UtilsInterface; ++ interface: TestLib_Bytes32UtilsInterface; + + queryFilter( + event: TypedEventFilter, +@@ -78,74 +88,110 @@ export interface TestLibBytes32Utils extends BaseContract { + + functions: { + fromAddress( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + fromBool( +- _in: boolean, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + toAddress( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { _out: string }>; + + toBool( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean] & { _out: boolean }>; + }; + +- fromAddress(_in: string, overrides?: CallOverrides): Promise; ++ fromAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- fromBool(_in: boolean, overrides?: CallOverrides): Promise; ++ fromBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toAddress(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toBool(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + + callStatic: { +- fromAddress(_in: string, overrides?: CallOverrides): Promise; ++ fromAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- fromBool(_in: boolean, overrides?: CallOverrides): Promise; ++ fromBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toAddress(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toBool(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + filters: {}; + + estimateGas: { +- fromAddress(_in: string, overrides?: CallOverrides): Promise; ++ fromAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- fromBool(_in: boolean, overrides?: CallOverrides): Promise; ++ fromBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toAddress(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toAddress( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + +- toBool(_in: BytesLike, overrides?: CallOverrides): Promise; ++ toBool( ++ _in: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; + }; + + populateTransaction: { + fromAddress( +- _in: string, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + fromBool( +- _in: boolean, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + toAddress( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + toBool( +- _in: BytesLike, ++ _in: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_BytesUtils.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_BytesUtils.ts +new file mode 100644 +index 0000000..4a138bf +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_BytesUtils.ts +@@ -0,0 +1,374 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import type { ++ BaseContract, ++ BigNumber, ++ BigNumberish, ++ BytesLike, ++ CallOverrides, ++ ContractTransaction, ++ Overrides, ++ PopulatedTransaction, ++ Signer, ++ utils, ++} from "ethers"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; ++import type { ++ TypedEventFilter, ++ TypedEvent, ++ TypedListener, ++ OnEvent, ++ PromiseOrValue, ++} from "../../../common"; ++ ++export interface TestLib_BytesUtilsInterface extends utils.Interface { ++ functions: { ++ "concat(bytes,bytes)": FunctionFragment; ++ "equal(bytes,bytes)": FunctionFragment; ++ "fromNibbles(bytes)": FunctionFragment; ++ "slice(bytes,uint256,uint256)": FunctionFragment; ++ "sliceWithTaintedMemory(bytes,uint256,uint256)": FunctionFragment; ++ "toBytes32(bytes)": FunctionFragment; ++ "toNibbles(bytes)": FunctionFragment; ++ "toUint256(bytes)": FunctionFragment; ++ }; ++ ++ getFunction( ++ nameOrSignatureOrTopic: ++ | "concat" ++ | "equal" ++ | "fromNibbles" ++ | "slice" ++ | "sliceWithTaintedMemory" ++ | "toBytes32" ++ | "toNibbles" ++ | "toUint256" ++ ): FunctionFragment; ++ ++ encodeFunctionData( ++ functionFragment: "concat", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "equal", ++ values: [PromiseOrValue, PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "fromNibbles", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "slice", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "sliceWithTaintedMemory", ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue ++ ] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "toBytes32", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "toNibbles", ++ values: [PromiseOrValue] ++ ): string; ++ encodeFunctionData( ++ functionFragment: "toUint256", ++ values: [PromiseOrValue] ++ ): string; ++ ++ decodeFunctionResult(functionFragment: "concat", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "equal", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "fromNibbles", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "slice", data: BytesLike): Result; ++ decodeFunctionResult( ++ functionFragment: "sliceWithTaintedMemory", ++ data: BytesLike ++ ): Result; ++ decodeFunctionResult(functionFragment: "toBytes32", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "toNibbles", data: BytesLike): Result; ++ decodeFunctionResult(functionFragment: "toUint256", data: BytesLike): Result; ++ ++ events: {}; ++} ++ ++export interface TestLib_BytesUtils extends BaseContract { ++ connect(signerOrProvider: Signer | Provider | string): this; ++ attach(addressOrName: string): this; ++ deployed(): Promise; ++ ++ interface: TestLib_BytesUtilsInterface; ++ ++ queryFilter( ++ event: TypedEventFilter, ++ fromBlockOrBlockhash?: string | number | undefined, ++ toBlock?: string | number | undefined ++ ): Promise>; ++ ++ listeners( ++ eventFilter?: TypedEventFilter ++ ): Array>; ++ listeners(eventName?: string): Array; ++ removeAllListeners( ++ eventFilter: TypedEventFilter ++ ): this; ++ removeAllListeners(eventName?: string): this; ++ off: OnEvent; ++ on: OnEvent; ++ once: OnEvent; ++ removeListener: OnEvent; ++ ++ functions: { ++ concat( ++ _preBytes: PromiseOrValue, ++ _postBytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ equal( ++ _bytes: PromiseOrValue, ++ _other: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[boolean]>; ++ ++ fromNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ slice( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ sliceWithTaintedMemory( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ toBytes32( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ toNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[string]>; ++ ++ toUint256( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise<[BigNumber]>; ++ }; ++ ++ concat( ++ _preBytes: PromiseOrValue, ++ _postBytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ equal( ++ _bytes: PromiseOrValue, ++ _other: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ fromNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ slice( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sliceWithTaintedMemory( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ toBytes32( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toUint256( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ callStatic: { ++ concat( ++ _preBytes: PromiseOrValue, ++ _postBytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ equal( ++ _bytes: PromiseOrValue, ++ _other: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ fromNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ slice( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sliceWithTaintedMemory( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toBytes32( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toUint256( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ filters: {}; ++ ++ estimateGas: { ++ concat( ++ _preBytes: PromiseOrValue, ++ _postBytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ equal( ++ _bytes: PromiseOrValue, ++ _other: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ fromNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ slice( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sliceWithTaintedMemory( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ toBytes32( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toUint256( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++ ++ populateTransaction: { ++ concat( ++ _preBytes: PromiseOrValue, ++ _postBytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ equal( ++ _bytes: PromiseOrValue, ++ _other: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ fromNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ slice( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ sliceWithTaintedMemory( ++ _bytes: PromiseOrValue, ++ _start: PromiseOrValue, ++ _length: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise; ++ ++ toBytes32( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toNibbles( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ ++ toUint256( ++ _bytes: PromiseOrValue, ++ overrides?: CallOverrides ++ ): Promise; ++ }; ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTree.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_MerkleTree.ts +similarity index 53% +rename from node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTree.ts +rename to node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_MerkleTree.ts +index 9f1a039..72246c6 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/TestLibMerkleTree.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/TestLib_MerkleTree.ts +@@ -1,41 +1,49 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +- +-import { +- ethers, +- EventFilter, +- Signer, ++import type { ++ BaseContract, + BigNumber, + BigNumberish, +- PopulatedTransaction, +- BaseContract, +- ContractTransaction, ++ BytesLike, + CallOverrides, ++ PopulatedTransaction, ++ Signer, ++ utils, + } from "ethers"; +-import { BytesLike } from "@ethersproject/bytes"; +-import { Listener, Provider } from "@ethersproject/providers"; +-import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; ++import type { FunctionFragment, Result } from "@ethersproject/abi"; ++import type { Listener, Provider } from "@ethersproject/providers"; + import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +-} from "./common"; ++ PromiseOrValue, ++} from "../../../common"; + +-export interface TestLibMerkleTreeInterface extends ethers.utils.Interface { ++export interface TestLib_MerkleTreeInterface extends utils.Interface { + functions: { + "getMerkleRoot(bytes32[])": FunctionFragment; + "verify(bytes32,bytes32,uint256,bytes32[],uint256)": FunctionFragment; + }; + ++ getFunction( ++ nameOrSignatureOrTopic: "getMerkleRoot" | "verify" ++ ): FunctionFragment; ++ + encodeFunctionData( + functionFragment: "getMerkleRoot", +- values: [BytesLike[]] ++ values: [PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "verify", +- values: [BytesLike, BytesLike, BigNumberish, BytesLike[], BigNumberish] ++ values: [ ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue, ++ PromiseOrValue[], ++ PromiseOrValue ++ ] + ): string; + + decodeFunctionResult( +@@ -47,12 +55,12 @@ export interface TestLibMerkleTreeInterface extends ethers.utils.Interface { + events: {}; + } + +-export interface TestLibMerkleTree extends BaseContract { ++export interface TestLib_MerkleTree extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + +- interface: TestLibMerkleTreeInterface; ++ interface: TestLib_MerkleTreeInterface; + + queryFilter( + event: TypedEventFilter, +@@ -75,46 +83,46 @@ export interface TestLibMerkleTree extends BaseContract { + + functions: { + getMerkleRoot( +- _elements: BytesLike[], ++ _elements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string]>; + + verify( +- _root: BytesLike, +- _leaf: BytesLike, +- _index: BigNumberish, +- _siblings: BytesLike[], +- _totalLeaves: BigNumberish, ++ _root: PromiseOrValue, ++ _leaf: PromiseOrValue, ++ _index: PromiseOrValue, ++ _siblings: PromiseOrValue[], ++ _totalLeaves: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + getMerkleRoot( +- _elements: BytesLike[], ++ _elements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + verify( +- _root: BytesLike, +- _leaf: BytesLike, +- _index: BigNumberish, +- _siblings: BytesLike[], +- _totalLeaves: BigNumberish, ++ _root: PromiseOrValue, ++ _leaf: PromiseOrValue, ++ _index: PromiseOrValue, ++ _siblings: PromiseOrValue[], ++ _totalLeaves: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + getMerkleRoot( +- _elements: BytesLike[], ++ _elements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + verify( +- _root: BytesLike, +- _leaf: BytesLike, +- _index: BigNumberish, +- _siblings: BytesLike[], +- _totalLeaves: BigNumberish, ++ _root: PromiseOrValue, ++ _leaf: PromiseOrValue, ++ _index: PromiseOrValue, ++ _siblings: PromiseOrValue[], ++ _totalLeaves: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +@@ -123,32 +131,32 @@ export interface TestLibMerkleTree extends BaseContract { + + estimateGas: { + getMerkleRoot( +- _elements: BytesLike[], ++ _elements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + verify( +- _root: BytesLike, +- _leaf: BytesLike, +- _index: BigNumberish, +- _siblings: BytesLike[], +- _totalLeaves: BigNumberish, ++ _root: PromiseOrValue, ++ _leaf: PromiseOrValue, ++ _index: PromiseOrValue, ++ _siblings: PromiseOrValue[], ++ _totalLeaves: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + getMerkleRoot( +- _elements: BytesLike[], ++ _elements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + verify( +- _root: BytesLike, +- _leaf: BytesLike, +- _index: BigNumberish, +- _siblings: BytesLike[], +- _totalLeaves: BigNumberish, ++ _root: PromiseOrValue, ++ _leaf: PromiseOrValue, ++ _index: PromiseOrValue, ++ _siblings: PromiseOrValue[], ++ _totalLeaves: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/index.ts b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/index.ts +new file mode 100644 +index 0000000..567a1b2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/contracts/test-libraries/utils/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export type { TestLib_Buffer } from "./TestLib_Buffer"; ++export type { TestLib_Bytes32Utils } from "./TestLib_Bytes32Utils"; ++export type { TestLib_BytesUtils } from "./TestLib_BytesUtils"; ++export type { TestLib_MerkleTree } from "./TestLib_MerkleTree"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/index.ts +new file mode 100644 +index 0000000..4a3c9bd +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as turingHybridCompute from "./turing-hybrid-compute"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/ITuringHelper__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/ITuringHelper__factory.ts +new file mode 100644 +index 0000000..3afa262 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/ITuringHelper__factory.ts +@@ -0,0 +1,50 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ITuringHelper, ++ ITuringHelperInterface, ++} from "../../../../@boba/turing-hybrid-compute/contracts/ITuringHelper"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_url", ++ type: "string", ++ }, ++ { ++ internalType: "bytes", ++ name: "_payload", ++ type: "bytes", ++ }, ++ ], ++ name: "TuringTx", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ITuringHelper__factory { ++ static readonly abi = _abi; ++ static createInterface(): ITuringHelperInterface { ++ return new utils.Interface(_abi) as ITuringHelperInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ITuringHelper { ++ return new Contract(address, _abi, signerOrProvider) as ITuringHelper; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/index.ts +new file mode 100644 +index 0000000..877630a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/contracts/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { ITuringHelper__factory } from "./ITuringHelper__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/index.ts +new file mode 100644 +index 0000000..6397da0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@boba/turing-hybrid-compute/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as contracts from "./contracts"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts +new file mode 100644 +index 0000000..fd59efa +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts +@@ -0,0 +1,78 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ OwnableUpgradeable, ++ OwnableUpgradeableInterface, ++} from "../../../../@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "previousOwner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnershipTransferred", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class OwnableUpgradeable__factory { ++ static readonly abi = _abi; ++ static createInterface(): OwnableUpgradeableInterface { ++ return new utils.Interface(_abi) as OwnableUpgradeableInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OwnableUpgradeable { ++ return new Contract(address, _abi, signerOrProvider) as OwnableUpgradeable; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/index.ts +new file mode 100644 +index 0000000..bf4b29c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/access/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { OwnableUpgradeable__factory } from "./OwnableUpgradeable__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/index.ts +new file mode 100644 +index 0000000..7979a24 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as access from "./access"; ++export * as security from "./security"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable__factory.ts +new file mode 100644 +index 0000000..f344566 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable__factory.ts +@@ -0,0 +1,65 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ PausableUpgradeable, ++ PausableUpgradeableInterface, ++} from "../../../../@openzeppelin/contracts-upgradeable/security/PausableUpgradeable"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Paused", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Unpaused", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "paused", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class PausableUpgradeable__factory { ++ static readonly abi = _abi; ++ static createInterface(): PausableUpgradeableInterface { ++ return new utils.Interface(_abi) as PausableUpgradeableInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): PausableUpgradeable { ++ return new Contract(address, _abi, signerOrProvider) as PausableUpgradeable; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/index.ts +new file mode 100644 +index 0000000..93fc29f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts-upgradeable/security/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { PausableUpgradeable__factory } from "./PausableUpgradeable__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/Ownable__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +new file mode 100644 +index 0000000..fa14718 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +@@ -0,0 +1,78 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ Ownable, ++ OwnableInterface, ++} from "../../../../@openzeppelin/contracts/access/Ownable"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "previousOwner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnershipTransferred", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class Ownable__factory { ++ static readonly abi = _abi; ++ static createInterface(): OwnableInterface { ++ return new utils.Interface(_abi) as OwnableInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Ownable { ++ return new Contract(address, _abi, signerOrProvider) as Ownable; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/index.ts +new file mode 100644 +index 0000000..e332ae3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/access/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { Ownable__factory } from "./Ownable__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/index.ts +new file mode 100644 +index 0000000..ed5ad1b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as access from "./access"; ++export * as token from "./token"; ++export * as utils from "./utils"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +new file mode 100644 +index 0000000..31d41b4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +@@ -0,0 +1,350 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../../common"; ++import type { ++ ERC20, ++ ERC20Interface, ++} from "../../../../../@openzeppelin/contracts/token/ERC20/ERC20"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "name_", ++ type: "string", ++ }, ++ { ++ internalType: "string", ++ name: "symbol_", ++ type: "string", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60806040523480156200001157600080fd5b5060405162000dc038038062000dc08339810160408190526200003491620001db565b81516200004990600390602085019062000068565b5080516200005f90600490602084019062000068565b50505062000282565b828054620000769062000245565b90600052602060002090601f0160209004810192826200009a5760008555620000e5565b82601f10620000b557805160ff1916838001178555620000e5565b82800160010185558215620000e5579182015b82811115620000e5578251825591602001919060010190620000c8565b50620000f3929150620000f7565b5090565b5b80821115620000f35760008155600101620000f8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013657600080fd5b81516001600160401b03808211156200015357620001536200010e565b604051601f8301601f19908116603f011681019082821181831017156200017e576200017e6200010e565b816040528381526020925086838588010111156200019b57600080fd5b600091505b83821015620001bf5785820183015181830184015290820190620001a0565b83821115620001d15760008385830101525b9695505050505050565b60008060408385031215620001ef57600080fd5b82516001600160401b03808211156200020757600080fd5b620002158683870162000124565b935060208501519150808211156200022c57600080fd5b506200023b8582860162000124565b9150509250929050565b600181811c908216806200025a57607f821691505b602082108114156200027c57634e487b7160e01b600052602260045260246000fd5b50919050565b610b2e80620002926000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e39190610937565b60405180910390f35b6100ff6100fa3660046109d3565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f3660046109fd565b6102a8565b604051601281526020016100e3565b6100ff6101513660046109d3565b610393565b610113610164366004610a39565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d66103dc565b6100ff6101a23660046109d3565b6103eb565b6100ff6101b53660046109d3565b6104c3565b6101136101c8366004610a5b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610a8e565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610a8e565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b600061029f3384846104d0565b50600192915050565b60006102b5848484610683565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548281101561037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61038885338584036104d0565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161029f9185906103d7908690610ae2565b6104d0565b60606004805461020f90610a8e565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156104ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610372565b6104b933858584036104d0565b5060019392505050565b600061029f338484610683565b73ffffffffffffffffffffffffffffffffffffffff8316610572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610372565b73ffffffffffffffffffffffffffffffffffffffff8216610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610372565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610372565b73ffffffffffffffffffffffffffffffffffffffff82166107c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610372565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610372565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906108c3908490610ae2565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161092991815260200190565b60405180910390a350505050565b600060208083528351808285015260005b8181101561096457858101830151858201604001528201610948565b81811115610976576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146109ce57600080fd5b919050565b600080604083850312156109e657600080fd5b6109ef836109aa565b946020939093013593505050565b600080600060608486031215610a1257600080fd5b610a1b846109aa565b9250610a29602085016109aa565b9150604084013590509250925092565b600060208284031215610a4b57600080fd5b610a54826109aa565b9392505050565b60008060408385031215610a6e57600080fd5b610a77836109aa565b9150610a85602084016109aa565b90509250929050565b600181811c90821680610aa257607f821691505b60208210811415610adc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c6343000809000a"; ++ ++type ERC20ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: ERC20ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class ERC20__factory extends ContractFactory { ++ constructor(...args: ERC20ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ name_: PromiseOrValue, ++ symbol_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(name_, symbol_, overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ name_: PromiseOrValue, ++ symbol_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(name_, symbol_, overrides || {}); ++ } ++ override attach(address: string): ERC20 { ++ return super.attach(address) as ERC20; ++ } ++ override connect(signer: Signer): ERC20__factory { ++ return super.connect(signer) as ERC20__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): ERC20Interface { ++ return new utils.Interface(_abi) as ERC20Interface; ++ } ++ static connect(address: string, signerOrProvider: Signer | Provider): ERC20 { ++ return new Contract(address, _abi, signerOrProvider) as ERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +new file mode 100644 +index 0000000..888cd59 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +@@ -0,0 +1,206 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IERC20, ++ IERC20Interface, ++} from "../../../../../@openzeppelin/contracts/token/ERC20/IERC20"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IERC20__factory { ++ static readonly abi = _abi; ++ static createInterface(): IERC20Interface { ++ return new utils.Interface(_abi) as IERC20Interface; ++ } ++ static connect(address: string, signerOrProvider: Signer | Provider): IERC20 { ++ return new Contract(address, _abi, signerOrProvider) as IERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +new file mode 100644 +index 0000000..d37a925 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +@@ -0,0 +1,327 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20Burnable, ++ ERC20BurnableInterface, ++} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burnFrom", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20Burnable__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20BurnableInterface { ++ return new utils.Interface(_abi) as ERC20BurnableInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20Burnable { ++ return new Contract(address, _abi, signerOrProvider) as ERC20Burnable; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp__factory.ts +new file mode 100644 +index 0000000..41cb4d5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp__factory.ts +@@ -0,0 +1,651 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20VotesComp, ++ ERC20VotesCompInterface, ++} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getCurrentVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPriorVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20VotesComp__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20VotesCompInterface { ++ return new utils.Interface(_abi) as ERC20VotesCompInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20VotesComp { ++ return new Contract(address, _abi, signerOrProvider) as ERC20VotesComp; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes__factory.ts +new file mode 100644 +index 0000000..033332e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes__factory.ts +@@ -0,0 +1,608 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20Votes, ++ ERC20VotesInterface, ++} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20Votes__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20VotesInterface { ++ return new utils.Interface(_abi) as ERC20VotesInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20Votes { ++ return new Contract(address, _abi, signerOrProvider) as ERC20Votes; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +new file mode 100644 +index 0000000..d748599 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +@@ -0,0 +1,248 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IERC20Metadata, ++ IERC20MetadataInterface, ++} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IERC20Metadata__factory { ++ static readonly abi = _abi; ++ static createInterface(): IERC20MetadataInterface { ++ return new utils.Interface(_abi) as IERC20MetadataInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IERC20Metadata { ++ return new Contract(address, _abi, signerOrProvider) as IERC20Metadata; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit__factory.ts +new file mode 100644 +index 0000000..1dac6ce +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit__factory.ts +@@ -0,0 +1,371 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20Permit, ++ ERC20PermitInterface, ++} from "../../../../../../../@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20Permit__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20PermitInterface { ++ return new utils.Interface(_abi) as ERC20PermitInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20Permit { ++ return new Contract(address, _abi, signerOrProvider) as ERC20Permit; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts +new file mode 100644 +index 0000000..0c3398a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { ERC20Permit__factory } from "./ERC20Permit__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit__factory.ts +new file mode 100644 +index 0000000..a4471b8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit__factory.ts +@@ -0,0 +1,101 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IERC20Permit, ++ IERC20PermitInterface, ++} from "../../../../../../../@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IERC20Permit__factory { ++ static readonly abi = _abi; ++ static createInterface(): IERC20PermitInterface { ++ return new utils.Interface(_abi) as IERC20PermitInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IERC20Permit { ++ return new Contract(address, _abi, signerOrProvider) as IERC20Permit; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts +new file mode 100644 +index 0000000..5f347d4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IERC20Permit__factory } from "./IERC20Permit__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +new file mode 100644 +index 0000000..47eaff8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +@@ -0,0 +1,10 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as draftErc20PermitSol from "./draft-ERC20Permit.sol"; ++export * as draftIerc20PermitSol from "./draft-IERC20Permit.sol"; ++export * as regenesis from "./regenesis"; ++export { ERC20Burnable__factory } from "./ERC20Burnable__factory"; ++export { ERC20Votes__factory } from "./ERC20Votes__factory"; ++export { ERC20VotesComp__factory } from "./ERC20VotesComp__factory"; ++export { IERC20Metadata__factory } from "./IERC20Metadata__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp__factory.ts +new file mode 100644 +index 0000000..6098e83 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp__factory.ts +@@ -0,0 +1,664 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20VotesComp, ++ ERC20VotesCompInterface, ++} from "../../../../../../../../@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/ERC20VotesComp"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "OFFSET", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getCurrentVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPriorVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20VotesComp__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20VotesCompInterface { ++ return new utils.Interface(_abi) as ERC20VotesCompInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20VotesComp { ++ return new Contract(address, _abi, signerOrProvider) as ERC20VotesComp; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts +new file mode 100644 +index 0000000..b6d58a3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesCompRegenesis.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { ERC20VotesComp__factory } from "./ERC20VotesComp__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes__factory.ts +new file mode 100644 +index 0000000..cb71ff9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes__factory.ts +@@ -0,0 +1,621 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ERC20Votes, ++ ERC20VotesInterface, ++} from "../../../../../../../../@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/ERC20Votes"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "OFFSET", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ERC20Votes__factory { ++ static readonly abi = _abi; ++ static createInterface(): ERC20VotesInterface { ++ return new utils.Interface(_abi) as ERC20VotesInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ERC20Votes { ++ return new Contract(address, _abi, signerOrProvider) as ERC20Votes; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts +new file mode 100644 +index 0000000..8f8f909 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/ERC20VotesRegenesis.sol/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { ERC20Votes__factory } from "./ERC20Votes__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts +new file mode 100644 +index 0000000..c7554b3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/extensions/regenesis/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as erc20VotesCompRegenesisSol from "./ERC20VotesCompRegenesis.sol"; ++export * as erc20VotesRegenesisSol from "./ERC20VotesRegenesis.sol"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/index.ts +new file mode 100644 +index 0000000..3523dc7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/ERC20/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as extensions from "./extensions"; ++export { ERC20__factory } from "./ERC20__factory"; ++export { IERC20__factory } from "./IERC20__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/index.ts +new file mode 100644 +index 0000000..da1e061 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/token/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as erc20 from "./ERC20"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/index.ts +new file mode 100644 +index 0000000..03cab17 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as introspection from "./introspection"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts +new file mode 100644 +index 0000000..71bfb8a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts +@@ -0,0 +1,45 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IERC165, ++ IERC165Interface, ++} from "../../../../../@openzeppelin/contracts/utils/introspection/IERC165"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IERC165__factory { ++ static readonly abi = _abi; ++ static createInterface(): IERC165Interface { ++ return new utils.Interface(_abi) as IERC165Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IERC165 { ++ return new Contract(address, _abi, signerOrProvider) as IERC165; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/index.ts +new file mode 100644 +index 0000000..85d3733 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/contracts/utils/introspection/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IERC165__factory } from "./IERC165__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/index.ts +new file mode 100644 +index 0000000..6923c15 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/@openzeppelin/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as contracts from "./contracts"; ++export * as contractsUpgradeable from "./contracts-upgradeable"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/index.ts +new file mode 100644 +index 0000000..98f1c9e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as messaging from "./messaging"; ++export * as rollup from "./rollup"; ++export * as token from "./token"; ++export * as verification from "./verification"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessengerFast__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessengerFast__factory.ts +new file mode 100644 +index 0000000..5f3133a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessengerFast__factory.ts +@@ -0,0 +1,375 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1CrossDomainMessengerFast, ++ IL1CrossDomainMessengerFastInterface, ++} from "../../../../contracts/L1/messaging/IL1CrossDomainMessengerFast"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_standardBridgeDepositHash", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_lpDepositHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_oldGasLimit", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint32", ++ name: "_newGasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "replayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1CrossDomainMessengerFast__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1CrossDomainMessengerFastInterface { ++ return new utils.Interface(_abi) as IL1CrossDomainMessengerFastInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1CrossDomainMessengerFast { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IL1CrossDomainMessengerFast; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessenger__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessenger__factory.ts +new file mode 100644 +index 0000000..b104655 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1CrossDomainMessenger__factory.ts +@@ -0,0 +1,266 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1CrossDomainMessenger, ++ IL1CrossDomainMessengerInterface, ++} from "../../../../contracts/L1/messaging/IL1CrossDomainMessenger"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_oldGasLimit", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint32", ++ name: "_newGasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "replayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1CrossDomainMessenger__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1CrossDomainMessengerInterface { ++ return new utils.Interface(_abi) as IL1CrossDomainMessengerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1CrossDomainMessenger { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IL1CrossDomainMessenger; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1DepositHash__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1DepositHash__factory.ts +new file mode 100644 +index 0000000..ebb5ea0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1DepositHash__factory.ts +@@ -0,0 +1,65 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1DepositHash, ++ IL1DepositHashInterface, ++} from "../../../../contracts/L1/messaging/IL1DepositHash"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ name: "currentDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "lastHashUpdateBlock", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "priorDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1DepositHash__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1DepositHashInterface { ++ return new utils.Interface(_abi) as IL1DepositHashInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1DepositHash { ++ return new Contract(address, _abi, signerOrProvider) as IL1DepositHash; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1ERC20Bridge__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1ERC20Bridge__factory.ts +new file mode 100644 +index 0000000..9720c36 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1ERC20Bridge__factory.ts +@@ -0,0 +1,234 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1ERC20Bridge, ++ IL1ERC20BridgeInterface, ++} from "../../../../contracts/L1/messaging/IL1ERC20Bridge"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20DepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20WithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20To", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeERC20Withdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1ERC20Bridge__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1ERC20BridgeInterface { ++ return new utils.Interface(_abi) as IL1ERC20BridgeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1ERC20Bridge { ++ return new Contract(address, _abi, signerOrProvider) as IL1ERC20Bridge; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridgeAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridgeAltL1__factory.ts +new file mode 100644 +index 0000000..6cc8652 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridgeAltL1__factory.ts +@@ -0,0 +1,369 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1StandardBridgeAltL1, ++ IL1StandardBridgeAltL1Interface, ++} from "../../../../contracts/L1/messaging/IL1StandardBridgeAltL1"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20DepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20WithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "NativeTokenDepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "NativeTokenWithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20To", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositNativeToken", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositNativeTokenTo", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeERC20Withdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeNativeTokenWithdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1StandardBridgeAltL1__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1StandardBridgeAltL1Interface { ++ return new utils.Interface(_abi) as IL1StandardBridgeAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1StandardBridgeAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IL1StandardBridgeAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridge__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridge__factory.ts +new file mode 100644 +index 0000000..315458c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/IL1StandardBridge__factory.ts +@@ -0,0 +1,365 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1StandardBridge, ++ IL1StandardBridgeInterface, ++} from "../../../../contracts/L1/messaging/IL1StandardBridge"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20DepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20WithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ETHDepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ETHWithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20To", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositETH", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositETHTo", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeERC20Withdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeETHWithdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1StandardBridge__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1StandardBridgeInterface { ++ return new utils.Interface(_abi) as IL1StandardBridgeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1StandardBridge { ++ return new Contract(address, _abi, signerOrProvider) as IL1StandardBridge; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessengerFast__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessengerFast__factory.ts +new file mode 100644 +index 0000000..c9b3d86 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessengerFast__factory.ts +@@ -0,0 +1,695 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1CrossDomainMessengerFast, ++ L1CrossDomainMessengerFastInterface, ++} from "../../../../contracts/L1/messaging/L1CrossDomainMessengerFast"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "MessageAllowed", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "MessageBlocked", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "previousOwner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnershipTransferred", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Paused", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Unpaused", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "allowMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "blockMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "blockedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "failedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "pause", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "paused", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_standardBridgeDepositHash", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_lpDepositHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "relayedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_oldGasLimit", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint32", ++ name: "_newGasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "replayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "successfulMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "unpause", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b031916905561402a806100446000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab014610304578063d7fd19dd14610327578063f2fde38b1461033a57600080fd5b8063b1b1b209146102ce578063c4d66de8146102f157600080fd5b80638456cb59116100b25780638456cb59146102855780638da5cb5b1461028d578063a4e7f8bd146102ab57600080fd5b8063715018a61461026a57806381ada46c1461027257600080fd5b8063461a44781161012457806369fdb52d1161010957806369fdb52d1461023c5780636e296e451461024f5780636f1c8d471461025757600080fd5b8063461a44781461021e5780635c975abb1461023157600080fd5b8063299ca47811610155578063299ca478146101be5780633dbb202b146102035780633f4ba83a1461021657600080fd5b80630ecf2eea1461017157806321d800ec14610186575b600080fd5b61018461017f366004613605565b61034d565b005b6101a9610194366004613605565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b5565b61018461021136600461377d565b6103fc565b61018461046a565b6101de61022c3660046137dd565b6104db565b60655460ff166101a9565b61018461024a366004613a11565b610588565b6101de610658565b610184610265366004613ab7565b610708565b610184610776565b610184610280366004613605565b6107e7565b61018461088e565b60335473ffffffffffffffffffffffffffffffffffffffff166101de565b6101a96102b9366004613605565b60cc6020526000908152604090205460ff1681565b6101a96102dc366004613605565b60cb6020526000908152604090205460ff1681565b6101846102ff366004613b43565b6108fd565b6101a9610312366004613605565b60c96020526000908152604090205460ff1681565b610184610335366004613b60565b610b4a565b610184610348366004613b43565b61110a565b60335473ffffffffffffffffffffffffffffffffffffffff1633146103b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60405162461bcd60e51b815260206004820152603660248201527f73656e644d65737361676520766961204c3143726f7373446f6d61696e4d657360448201527f73656e676572466173742069732064697361626c65640000000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d9611206565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610532908590600401613c4b565b60206040518083038186803b15801561054a57600080fd5b505afa15801561055e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105829190613c5e565b92915050565b600260975414156105db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff16156106335760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b61063d82826112af565b61064a8787878787610b4a565b505060016097555050505050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106eb5760405162461bcd60e51b815260206004820152602560248201527f43444d463a2078446f6d61696e4d65737361676553656e646572206973206e6f60448201527f742073657400000000000000000000000000000000000000000000000000000060648201526084016103b0565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60405162461bcd60e51b815260206004820152603860248201527f7265706c61794d65737361676520766961204c3143726f7373446f6d61696e4d60448201527f657373656e676572466173742069732064697361626c6564000000000000000060648201526084016103b0565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d960006117d5565b60335473ffffffffffffffffffffffffffffffffffffffff16331461084e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b6104d961184c565b6000547501000000000000000000000000000000000000000000900460ff1680610942575060005474010000000000000000000000000000000000000000900460ff16155b6109b45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015610a1b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610aa75760405162461bcd60e51b815260206004820152602e60248201527f4c3143726f7373446f6d61696e4d657373656e6765724661737420616c72656160448201527f647920696e7469616c697a65642e00000000000000000000000000000000000060648201526084016103b0565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610aff6118d4565b610b07611a23565b610b0f611b4a565b610b17611ca3565b8015610b4657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b6000610b8a6040518060400160405280601481526020017f4f564d5f4c324d65737361676552656c617965720000000000000000000000008152506104db565b905073ffffffffffffffffffffffffffffffffffffffff811615610c33573373ffffffffffffffffffffffffffffffffffffffff821614610c335760405162461bcd60e51b815260206004820152603660248201527f4f6e6c79204f564d5f4c324d65737361676552656c617965722063616e20726560448201527f6c6179204c322d746f2d4c31206d657373616765732e0000000000000000000060648201526084016103b0565b60026097541415610c865760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b0565b600260975560655460ff1615610cde5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6000610cec87878787611df7565b9050610cf88184611e72565b1515600114610d6f5760405162461bcd60e51b815260206004820152602d60248201527f43444d463a2050726f7669646564206d65737361676520636f756c64206e6f7460448201527f2062652076657269666965642e0000000000000000000000000000000000000060648201526084016103b0565b8051602080830191909120600081815260cb90925260409091205460ff1615610e005760405162461bcd60e51b815260206004820152603160248201527f43444d463a2050726f7669646564206d6573736167652068617320616c72656160448201527f6479206265656e2072656365697665642e00000000000000000000000000000060648201526084016103b0565b600081815260c9602052604090205460ff1615610e855760405162461bcd60e51b815260206004820152602860248201527f43444d463a2050726f7669646564206d65737361676520686173206265656e2060448201527f626c6f636b65642e00000000000000000000000000000000000000000000000060648201526084016103b0565b610ec36040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506104db565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610f645760405162461bcd60e51b815260206004820152603960248201527f43444d463a2043616e6e6f742073656e64204c322d3e4c31206d65737361676560448201527f7320746f204c312073797374656d20636f6e7472616374732e0000000000000060648201526084016103b0565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff898116919091179091556040516000918a1690610fbd908990613c7b565b6000604051808303816000865af19150503d8060008114610ffa576040519150601f19603f3d011682016040523d82523d6000602084013e610fff565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015156001141561107f57600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26110b2565b600082815260cc60205260405183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b60008333436040516020016110c993929190613c97565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff1916600190811790915560975550505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b73ffffffffffffffffffffffffffffffffffffffff81166111fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103b0565b611203816117d5565b50565b60655460ff166112585760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016103b0565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60006112ef6040518060400160405280601781526020017f50726f78795f5f4c315374616e646172644272696467650000000000000000008152506104db565b905060006113316040518060400160405280601681526020017f50726f78795f5f4c314c6971756964697479506f6f6c000000000000000000008152506104db565b90508173ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561137b57600080fd5b505af115801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190613ce9565b4314156114b3578173ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561140257600080fd5b505af1158015611416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143a9190613ce9565b84146114ae5760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b6115a7565b8173ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114fb57600080fd5b505af115801561150f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115339190613ce9565b84146115a75760405162461bcd60e51b815260206004820152602360248201527f5374616e64617264204272696467652068617368657320646f206e6f74206d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016103b0565b8073ffffffffffffffffffffffffffffffffffffffff166359326e6f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156115ef57600080fd5b505af1158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190613ce9565b431415611701578073ffffffffffffffffffffffffffffffffffffffff1663f8fe09a36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ae9190613ce9565b83146116fc5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b6117cf565b8073ffffffffffffffffffffffffffffffffffffffff1663a5ab61906040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561174957600080fd5b505af115801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190613ce9565b83146117cf5760405162461bcd60e51b815260206004820152601760248201527f4c50312068617368657320646f206e6f74206d6174636800000000000000000060448201526064016103b0565b50505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff161561189f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016103b0565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112853390565b6000547501000000000000000000000000000000000000000000900460ff1680611919575060005474010000000000000000000000000000000000000000900460ff16155b61198b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff161580156119f257600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611a68575060005474010000000000000000000000000000000000000000900460ff16155b611ada5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611b4157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6119f2336117d5565b6000547501000000000000000000000000000000000000000000900460ff1680611b8f575060005474010000000000000000000000000000000000000000900460ff16155b611c015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611c6857600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611ce8575060005474010000000000000000000000000000000000000000900460ff16155b611d5a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103b0565b6000547501000000000000000000000000000000000000000000900460ff16158015611dc157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561120357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b606084848484604051602401611e109493929190613d02565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6000611e7d82611e95565b8015611e8e5750611e8e8383611f89565b9392505050565b600080611ed66040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e0000000000000000000000008152506104db565b8351602085015160408087015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815293945073ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611f399390929091600401613d4c565b60206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613df7565b60008083734200000000000000000000000000000000000007604051602001611fb3929190613e19565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f420000000000000000000000000000000000000000000000000000000000000091830191909152915060009081906120439060340160408051601f198184030181529190526060870151875161216d565b90925090506001821515146120e65760405162461bcd60e51b815260206004820152605360248201527f43444d463a204d6573736167652070617373696e67207072656465706c6f792060448201527f686173206e6f74206265656e20696e697469616c697a6564206f7220696e766160648201527f6c69642070726f6f662070726f76696465642e00000000000000000000000000608482015260a4016103b0565b60006120f182612196565b90506121628460405160200161210991815260200190565b60408051601f19818403018152908290527f01000000000000000000000000000000000000000000000000000000000000006020830152906021016040516020818303038152906040528860800151846040015161225a565b979650505050505050565b60006060600061217c8661227e565b90506121898186866122b0565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906121c38361238b565b905060405180608001604052806121f3836000815181106121e6576121e6613e63565b60200260200101516123be565b815260200161220e836001815181106121e6576121e6613e63565b81526020016122368360028151811061222957612229613e63565b60200260200101516123c5565b81526020016122518360038151811061222957612229613e63565b90529392505050565b6000806122668661227e565b9050612274818686866124c7565b9695505050505050565b6060818051906020012060405160200161229a91815260200190565b6040516020818303038152906040529050919050565b6000606060006122bf856124fd565b905060008060006122d1848a896125f8565b815192955090935091501580806122e55750815b6123315760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016103b0565b60008161234d5760405180602001604052806000815250612379565b6123798661235c600188613ec1565b8151811061236c5761236c613e63565b6020026020010151612a93565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061058290612abd565b6000610582825b600060218260000151111561241c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b600080600061242a85612cbc565b91945092509050600081600181111561244557612445613ed8565b146124925760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016103b0565b60008386602001516124a49190613f07565b805190915060208410156122745760208490036101000a90049695505050505050565b60008060006124d78786866122b0565b915091508180156121625750805160208083019190912087519188019190912014612162565b6060600061250a8361238b565b90506000815167ffffffffffffffff81111561252857612528613640565b60405190808252806020026020018201604052801561256d57816020015b60408051808201909152606080825260208201528152602001906001900390816125465790505b50905060005b82518110156125f05760006125a084838151811061259357612593613e63565b602002602001015161300d565b905060405180604001604052808281526020016125bc8361238b565b8152508383815181106125d1576125d1613e63565b60200260200101819052505080806125e890613f1f565b915050612573565b509392505050565b600060608180806126088761309d565b9050600086905060008061262f604051806040016040528060608152602001606081525090565b60005b8c51811015612a4f578c818151811061264d5761264d613e63565b6020026020010151915082846126639190613f07565b9350612670600188613f07565b9650836126d4578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016103b0565b612791565b815151602011612736578151805160209091012085146126cf5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016103b0565b846127448360000151613220565b146127915760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016103b0565b61279d60106001613f07565b82602001515114156128165785518414156127b757612a4f565b60008685815181106127cb576127cb613e63565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106127f6576127f6613e63565b6020026020010151905061280981613248565b9650600194505050612a3d565b600282602001515114156129f557600061282f8361327e565b905060008160008151811061284657612846613e63565b016020015160f81c9050600061285d600283613f87565b612868906002613fa9565b90506000612879848360ff166132a2565b905060006128878b8a6132a2565b9050600061289583836132d8565b905060ff8516600214806128ac575060ff85166003145b15612902578083511480156128c15750808251145b156128d3576128d0818b613f07565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b60ff85161580612915575060ff85166001145b15612987578251811461295157507f80000000000000000000000000000000000000000000000000000000000000009950612a4f945050505050565b612978886020015160018151811061296b5761296b613e63565b6020026020010151613248565b9a509750612a3d945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016103b0565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016103b0565b80612a4781613f1f565b915050612632565b507f8000000000000000000000000000000000000000000000000000000000000000841486612a7e87866132a2565b909e909d50909b509950505050505050505050565b6020810151805160609161058291612aad90600190613ec1565b8151811061259357612593613e63565b6060600080612acb84612cbc565b91935090915060019050816001811115612ae757612ae7613ed8565b14612b345760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016103b0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612b4d5790505090506000835b8651811015612cb15760208210612bf95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016103b0565b600080612c366040518060400160405280858c60000151612c1a9190613ec1565b8152602001858c60200151612c2f9190613f07565b9052612cbc565b509150915060405180604001604052808383612c529190613f07565b8152602001848b60200151612c679190613f07565b815250858581518110612c7c57612c7c613e63565b6020908102919091010152612c92600185613f07565b9350612c9e8183613f07565b612ca89084613f07565b92505050612b7a565b508152949350505050565b600080600080846000015111612d145760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016103b0565b6020840151805160001a607f8111612d39576000600160009450945094505050613006565b60b78111612db5576000612d4e608083613ec1565b905080876000015111612da35760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016103b0565b60019550935060009250613006915050565b60bf8111612ea4576000612dca60b783613ec1565b905080876000015111612e1f5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016103b0565b600183015160208290036101000a9004612e398183613f07565b885111612e885760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016103b0565b612e93826001613f07565b965094506000935061300692505050565b60f78111612f1f576000612eb960c083613ec1565b905080876000015111612f0e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016103b0565b600195509350849250613006915050565b6000612f2c60f783613ec1565b905080876000015111612f815760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016103b0565b600183015160208290036101000a9004612f9b8183613f07565b885111612fea5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016103b0565b612ff5826001613f07565b965094506001935061300692505050565b9193909250565b6060600080600061301d85612cbc565b91945092509050600081600181111561303857613038613ed8565b146130855760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016103b0565b61309485602001518484613384565b95945050505050565b60606000825160026130af9190613fcc565b67ffffffffffffffff8111156130c7576130c7613640565b6040519080825280601f01601f1916602001820160405280156130f1576020820181803683370190505b50905060005b835181101561321957600484828151811061311457613114613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82613149836002613fcc565b8151811061315957613159613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061319c5761319c613e63565b01602001516131ae919060f81c613f87565b60f81b826131bd836002613fcc565b6131c8906001613f07565b815181106131d8576131d8613e63565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061321181613f1f565b9150506130f7565b5092915050565b600060208251101561323457506020015190565b818060200190518101906105829190613ce9565b600060606020836000015110156132695761326283613463565b9050613275565b6132728361300d565b90505b611e8e81613220565b606061058261329d836020015160008151811061259357612593613e63565b61309d565b6060825182106132c15750604080516020810190915260008152610582565b611e8e83838486516132d39190613ec1565b61346e565b6000805b8084511180156132ec5750808351115b801561336d575082818151811061330557613305613e63565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061334457613344613e63565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611e8e578061337c81613f1f565b9150506132dc565b606060008267ffffffffffffffff8111156133a1576133a1613640565b6040519080825280601f01601f1916602001820160405280156133cb576020820181803683370190505b5090508051600014156133df579050611e8e565b60006133eb8587613f07565b90506020820160005b6133ff602087614009565b8110156134365782518252613415602084613f07565b9250613422602083613f07565b91508061342e81613f1f565b9150506133f4565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6060610582826135ef565b60608161347c81601f613f07565b10156134ca5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b826134d58382613f07565b10156135235760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b0565b61352d8284613f07565b8451101561357d5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016103b0565b60608215801561359c57604051915060008252602082016040526135e6565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135d55780518352602092830192016135bd565b5050858452601f01601f1916604052505b50949350505050565b6060610582826020015160008460000151613384565b60006020828403121561361757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461120357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561369257613692613640565b60405290565b6040805190810167ffffffffffffffff8111828210171561369257613692613640565b604051601f8201601f1916810167ffffffffffffffff811182821017156136e4576136e4613640565b604052919050565b600067ffffffffffffffff83111561370657613706613640565b6137196020601f19601f860116016136bb565b905082815283838301111561372d57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261375557600080fd5b611e8e838335602085016136ec565b803563ffffffff8116811461377857600080fd5b919050565b60008060006060848603121561379257600080fd5b833561379d8161361e565b9250602084013567ffffffffffffffff8111156137b957600080fd5b6137c586828701613744565b9250506137d460408501613764565b90509250925092565b6000602082840312156137ef57600080fd5b813567ffffffffffffffff81111561380657600080fd5b8201601f8101841361381757600080fd5b613826848235602084016136ec565b949350505050565b600060a0828403121561384057600080fd5b61384861366f565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561388657600080fd5b61389284828501613744565b60808301525092915050565b6000604082840312156138b057600080fd5b6138b8613698565b90508135815260208083013567ffffffffffffffff808211156138da57600080fd5b818501915085601f8301126138ee57600080fd5b81358181111561390057613900613640565b8060051b91506139118483016136bb565b818152918301840191848101908884111561392b57600080fd5b938501935b8385101561394957843582529385019390850190613930565b808688015250505050505092915050565b600060a0828403121561396c57600080fd5b61397461366f565b905081358152602082013567ffffffffffffffff8082111561399557600080fd5b6139a18583860161382e565b602084015260408401359150808211156139ba57600080fd5b6139c68583860161389e565b604084015260608401359150808211156139df57600080fd5b6139eb85838601613744565b60608401526080840135915080821115613a0457600080fd5b5061389284828501613744565b600080600080600080600060e0888a031215613a2c57600080fd5b8735613a378161361e565b96506020880135613a478161361e565b9550604088013567ffffffffffffffff80821115613a6457600080fd5b613a708b838c01613744565b965060608a0135955060808a0135915080821115613a8d57600080fd5b50613a9a8a828b0161395a565b93505060a0880135915060c0880135905092959891949750929550565b60008060008060008060c08789031215613ad057600080fd5b8635613adb8161361e565b95506020870135613aeb8161361e565b9450604087013567ffffffffffffffff811115613b0757600080fd5b613b1389828a01613744565b94505060608701359250613b2960808801613764565b9150613b3760a08801613764565b90509295509295509295565b600060208284031215613b5557600080fd5b8135611e8e8161361e565b600080600080600060a08688031215613b7857600080fd5b8535613b838161361e565b94506020860135613b938161361e565b9350604086013567ffffffffffffffff80821115613bb057600080fd5b613bbc89838a01613744565b9450606088013593506080880135915080821115613bd957600080fd5b50613be68882890161395a565b9150509295509295909350565b60005b83811015613c0e578181015183820152602001613bf6565b838111156117cf5750506000910152565b60008151808452613c37816020860160208601613bf3565b601f01601f19169290920160200192915050565b602081526000611e8e6020830184613c1f565b600060208284031215613c7057600080fd5b8151611e8e8161361e565b60008251613c8d818460208701613bf3565b9190910192915050565b60008451613ca9818460208901613bf3565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600060208284031215613cfb57600080fd5b5051919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613d3b6080830185613c1f565b905082606083015295945050505050565b8381526000602060608184015284516060840152808501516080840152604085015160a0840152606085015160c0840152608085015160a060e0850152613d97610100850182613c1f565b905083810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613de95784518252938501936001939093019290850190613dc9565b509998505050505050505050565b600060208284031215613e0957600080fd5b81518015158114611e8e57600080fd5b60008351613e2b818460208801613bf3565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613ed357613ed3613e92565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613f1a57613f1a613e92565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5157613f51613e92565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613f9a57613f9a613f58565b8060ff84160691505092915050565b600060ff821660ff841680821015613fc357613fc3613e92565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400457614004613e92565b500290565b60008261401857614018613f58565b50049056fea164736f6c6343000809000a"; ++ ++type L1CrossDomainMessengerFastConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1CrossDomainMessengerFastConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1CrossDomainMessengerFast__factory extends ContractFactory { ++ constructor(...args: L1CrossDomainMessengerFastConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): L1CrossDomainMessengerFast { ++ return super.attach(address) as L1CrossDomainMessengerFast; ++ } ++ override connect(signer: Signer): L1CrossDomainMessengerFast__factory { ++ return super.connect(signer) as L1CrossDomainMessengerFast__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1CrossDomainMessengerFastInterface { ++ return new utils.Interface(_abi) as L1CrossDomainMessengerFastInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1CrossDomainMessengerFast { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L1CrossDomainMessengerFast; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessenger__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessenger__factory.ts +new file mode 100644 +index 0000000..bd1a84b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1CrossDomainMessenger__factory.ts +@@ -0,0 +1,586 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1CrossDomainMessenger, ++ L1CrossDomainMessengerInterface, ++} from "../../../../contracts/L1/messaging/L1CrossDomainMessenger"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "MessageAllowed", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "MessageBlocked", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "previousOwner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnershipTransferred", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Paused", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "Unpaused", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "allowMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_xDomainCalldataHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "blockMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "blockedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "failedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "pause", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "paused", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "relayedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_oldGasLimit", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint32", ++ name: "_newGasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "replayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "successfulMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "unpause", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613d8f806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102d6578063d7fd19dd146102f9578063f2fde38b1461030c57600080fd5b8063b1b1b209146102a0578063c4d66de8146102c357600080fd5b80638456cb59116100b25780638456cb59146102575780638da5cb5b1461025f578063a4e7f8bd1461027d57600080fd5b8063715018a61461023c57806381ada46c1461024457600080fd5b80633f4ba83a116101245780635c975abb116101095780635c975abb146102165780636e296e45146102215780636f1c8d471461022957600080fd5b80633f4ba83a146101fb578063461a44781461020357600080fd5b80630ecf2eea1461015657806321d800ec1461016b578063299ca478146101a35780633dbb202b146101e8575b600080fd5b610169610164366004613281565b61031f565b005b61018e610179366004613281565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019a565b6101696101f63660046133f9565b6103ce565b610169610516565b6101c3610211366004613459565b610587565b60655460ff1661018e565b6101c3610634565b6101696102373660046134aa565b6106be565b6101696108a5565b610169610252366004613281565b610916565b6101696109bd565b60335473ffffffffffffffffffffffffffffffffffffffff166101c3565b61018e61028b366004613281565b60cc6020526000908152604090205460ff1681565b61018e6102ae366004613281565b60cb6020526000908152604090205460ff1681565b6101696102d1366004613536565b610a2c565b61018e6102e4366004613281565b60c96020526000908152604090205460ff1681565b61016961030736600461369c565b610c79565b61016961031a366004613536565b61115d565b60335473ffffffffffffffffffffffffffffffffffffffff16331461038b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b600061040e6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049091906137ea565b905060006104a78633878564ffffffffff16611259565b90506104ba83828663ffffffff166112d4565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a338785886040516105069493929190613861565b60405180910390a2505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611375565b565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906105de9085906004016138b4565b60206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e91906138c7565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106a15760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f7420736574006044820152606401610382565b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106fe6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a291906138e4565b905060006107b289898989611259565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107f79493929190613949565b604051602081830303815290604052805190602001209050826000015181146108885760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610382565b61089984838763ffffffff166112d4565b50505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461090c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585600061141e565b60335473ffffffffffffffffffffffffffffffffffffffff16331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b610585611495565b6000547501000000000000000000000000000000000000000000900460ff1680610a71575060005474010000000000000000000000000000000000000000900460ff16155b610ae35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015610b4a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610bd65760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610382565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610c2e61151d565b610c3661166c565b610c3e611793565b610c466118ec565b8015610c7557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555b5050565b60026097541415610ccc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610382565b600260975560655460ff1615610d245760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6000610d3286868686611259565b9050610d3e8183611a40565b1515600114610db55760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610382565b8051602080830191909120600081815260cb90925260409091205460ff1615610e465760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610382565b600081815260c9602052604090205460ff1615610ecb5760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610382565b610f096040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610587565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610faa5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610382565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169190911790915560405160009189169061100390889061398e565b6000604051808303816000865af19150503d8060008114611040576040519150601f19603f3d011682016040523d82523d6000602084013e611045565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156110c557600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611106565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b600083334360405160200161111d939291906139aa565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610382565b73ffffffffffffffffffffffffffffffffffffffff811661124d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610382565b6112568161141e565b50565b60608484848460405160240161127294939291906139fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061133e907342000000000000000000000000000000000000079085908790600401613a46565b600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b50505050505050565b60655460ff166113c75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610382565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156114e85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610382565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f43390565b6000547501000000000000000000000000000000000000000000900460ff1680611562575060005474010000000000000000000000000000000000000000900460ff16155b6115d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561163b57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff16806116b1575060005474010000000000000000000000000000000000000000900460ff16155b6117235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff1615801561178a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b61163b3361141e565b6000547501000000000000000000000000000000000000000000900460ff16806117d8575060005474010000000000000000000000000000000000000000900460ff16155b61184a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff161580156118b157600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6065805460ff19169055801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000547501000000000000000000000000000000000000000000900460ff1680611931575060005474010000000000000000000000000000000000000000900460ff16155b6119a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610382565b6000547501000000000000000000000000000000000000000000900460ff16158015611a0a57600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790555b6001609755801561125657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550565b6000611a4b82611a63565b8015611a5c5750611a5c8383611c05565b9392505050565b600080611aa46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610587565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd91611afc91600401613ab8565b60206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190613acb565b158015611a5c57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611bb5939192909190600401613aed565b60206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613acb565b60008083734200000000000000000000000000000000000007604051602001611c2f929190613b65565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f42000000000000000000000000000000000000000000000000000000000000009183019190915291506000908190611cbf9060340160408051601f1981840301815291905260608701518751611de9565b9092509050600182151514611d625760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610382565b6000611d6d82611e12565b9050611dde84604051602001611d8591815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611ed6565b979650505050505050565b600060606000611df886611efa565b9050611e05818686611f2c565b9250925050935093915050565b604080516080810182526000808252602082018190529181018290526060810182905290611e3f83612007565b90506040518060800160405280611e6f83600081518110611e6257611e62613baf565b602002602001015161203a565b8152602001611e8a83600181518110611e6257611e62613baf565b8152602001611eb283600281518110611ea557611ea5613baf565b6020026020010151612041565b8152602001611ecd83600381518110611ea557611ea5613baf565b90529392505050565b600080611ee286611efa565b9050611ef081868686612143565b9695505050505050565b60608180519060200120604051602001611f1691815260200190565b6040516020818303038152906040529050919050565b600060606000611f3b85612179565b90506000806000611f4d848a89612274565b81519295509093509150158080611f615750815b611fad5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610382565b600081611fc95760405180602001604052806000815250611ff5565b611ff586611fd8600188613c0d565b81518110611fe857611fe8613baf565b602002602001015161270f565b919b919a509098505050505050505050565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061062e90612739565b600061062e825b60006021826000015111156120985760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008060006120a685612938565b9194509250905060008160018111156120c1576120c1613c24565b1461210e5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610382565b60008386602001516121209190613c53565b80519091506020841015611ef05760208490036101000a90049695505050505050565b6000806000612153878686611f2c565b91509150818015611dde5750805160208083019190912087519188019190912014611dde565b6060600061218683612007565b90506000815167ffffffffffffffff8111156121a4576121a46132bc565b6040519080825280602002602001820160405280156121e957816020015b60408051808201909152606080825260208201528152602001906001900390816121c25790505b50905060005b825181101561226c57600061221c84838151811061220f5761220f613baf565b6020026020010151612c89565b9050604051806040016040528082815260200161223883612007565b81525083838151811061224d5761224d613baf565b602002602001018190525050808061226490613c6b565b9150506121ef565b509392505050565b6000606081808061228487612d19565b905060008690506000806122ab604051806040016040528060608152602001606081525090565b60005b8c518110156126cb578c81815181106122c9576122c9613baf565b6020026020010151915082846122df9190613c53565b93506122ec600188613c53565b9650836123505781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610382565b61240d565b8151516020116123b25781518051602090910120851461234b5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610382565b846123c08360000151612e9c565b1461240d5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610382565b61241960106001613c53565b8260200151511415612492578551841415612433576126cb565b600086858151811061244757612447613baf565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061247257612472613baf565b6020026020010151905061248581612ec4565b96506001945050506126b9565b600282602001515114156126715760006124ab83612efa565b90506000816000815181106124c2576124c2613baf565b016020015160f81c905060006124d9600283613cd3565b6124e4906002613cf5565b905060006124f5848360ff16612f1e565b905060006125038b8a612f1e565b905060006125118383612f54565b905060ff851660021480612528575060ff85166003145b1561257e5780835114801561253d5750808251145b1561254f5761254c818b613c53565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b60ff85161580612591575060ff85166001145b1561260357825181146125cd57507f800000000000000000000000000000000000000000000000000000000000000099506126cb945050505050565b6125f488602001516001815181106125e7576125e7613baf565b6020026020010151612ec4565b9a5097506126b9945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610382565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610382565b806126c381613c6b565b9150506122ae565b507f80000000000000000000000000000000000000000000000000000000000000008414866126fa8786612f1e565b909e909d50909b509950505050505050505050565b6020810151805160609161062e9161272990600190613c0d565b8151811061220f5761220f613baf565b606060008061274784612938565b9193509091506001905081600181111561276357612763613c24565b146127b05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610382565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816127c95790505090506000835b865181101561292d57602082106128755760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610382565b6000806128b26040518060400160405280858c600001516128969190613c0d565b8152602001858c602001516128ab9190613c53565b9052612938565b5091509150604051806040016040528083836128ce9190613c53565b8152602001848b602001516128e39190613c53565b8152508585815181106128f8576128f8613baf565b602090810291909101015261290e600185613c53565b935061291a8183613c53565b6129249084613c53565b925050506127f6565b508152949350505050565b6000806000808460000151116129905760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610382565b6020840151805160001a607f81116129b5576000600160009450945094505050612c82565b60b78111612a315760006129ca608083613c0d565b905080876000015111612a1f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610382565b60019550935060009250612c82915050565b60bf8111612b20576000612a4660b783613c0d565b905080876000015111612a9b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610382565b600183015160208290036101000a9004612ab58183613c53565b885111612b045760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610382565b612b0f826001613c53565b9650945060009350612c8292505050565b60f78111612b9b576000612b3560c083613c0d565b905080876000015111612b8a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610382565b600195509350849250612c82915050565b6000612ba860f783613c0d565b905080876000015111612bfd5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610382565b600183015160208290036101000a9004612c178183613c53565b885111612c665760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610382565b612c71826001613c53565b9650945060019350612c8292505050565b9193909250565b60606000806000612c9985612938565b919450925090506000816001811115612cb457612cb4613c24565b14612d015760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610382565b612d1085602001518484613000565b95945050505050565b6060600082516002612d2b9190613d18565b67ffffffffffffffff811115612d4357612d436132bc565b6040519080825280601f01601f191660200182016040528015612d6d576020820181803683370190505b50905060005b8351811015612e95576004848281518110612d9057612d90613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612dc5836002613d18565b81518110612dd557612dd5613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612e1857612e18613baf565b0160200151612e2a919060f81c613cd3565b60f81b82612e39836002613d18565b612e44906001613c53565b81518110612e5457612e54613baf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612e8d81613c6b565b915050612d73565b5092915050565b6000602082511015612eb057506020015190565b8180602001905181019061062e9190613d55565b60006060602083600001511015612ee557612ede836130df565b9050612ef1565b612eee83612c89565b90505b611a5c81612e9c565b606061062e612f19836020015160008151811061220f5761220f613baf565b612d19565b606082518210612f3d575060408051602081019091526000815261062e565b611a5c8383848651612f4f9190613c0d565b6130ea565b6000805b808451118015612f685750808351115b8015612fe95750828181518110612f8157612f81613baf565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612fc057612fc0613baf565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15611a5c5780612ff881613c6b565b915050612f58565b606060008267ffffffffffffffff81111561301d5761301d6132bc565b6040519080825280601f01601f191660200182016040528015613047576020820181803683370190505b50905080516000141561305b579050611a5c565b60006130678587613c53565b90506020820160005b61307b602087613d6e565b8110156130b25782518252613091602084613c53565b925061309e602083613c53565b9150806130aa81613c6b565b915050613070565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061062e8261326b565b6060816130f881601f613c53565b10156131465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b826131518382613c53565b101561319f5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610382565b6131a98284613c53565b845110156131f95760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610382565b6060821580156132185760405191506000825260208201604052613262565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613251578051835260209283019201613239565b5050858452601f01601f1916604052505b50949350505050565b606061062e826020015160008460000151613000565b60006020828403121561329357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461125657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561330e5761330e6132bc565b60405290565b60405160a0810167ffffffffffffffff8111828210171561330e5761330e6132bc565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606132bc565b604052919050565b600067ffffffffffffffff831115613382576133826132bc565b6133956020601f19601f86011601613337565b90508281528383830111156133a957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133d157600080fd5b611a5c83833560208501613368565b803563ffffffff811681146133f457600080fd5b919050565b60008060006060848603121561340e57600080fd5b83356134198161329a565b9250602084013567ffffffffffffffff81111561343557600080fd5b613441868287016133c0565b925050613450604085016133e0565b90509250925092565b60006020828403121561346b57600080fd5b813567ffffffffffffffff81111561348257600080fd5b8201601f8101841361349357600080fd5b6134a284823560208401613368565b949350505050565b60008060008060008060c087890312156134c357600080fd5b86356134ce8161329a565b955060208701356134de8161329a565b9450604087013567ffffffffffffffff8111156134fa57600080fd5b61350689828a016133c0565b9450506060870135925061351c608088016133e0565b915061352a60a088016133e0565b90509295509295509295565b60006020828403121561354857600080fd5b8135611a5c8161329a565b600060a0828403121561356557600080fd5b60405160a0810167ffffffffffffffff8282108183111715613589576135896132bc565b816040528293508435835260208501356020840152604085013560408401526060850135606084015260808501359150808211156135c657600080fd5b506135d3858286016133c0565b6080830152505092915050565b6000604082840312156135f257600080fd5b6135fa6132eb565b90508135815260208083013567ffffffffffffffff8082111561361c57600080fd5b818501915085601f83011261363057600080fd5b813581811115613642576136426132bc565b8060051b9150613653848301613337565b818152918301840191848101908884111561366d57600080fd5b938501935b8385101561368b57843582529385019390850190613672565b808688015250505050505092915050565b600080600080600060a086880312156136b457600080fd5b85356136bf8161329a565b945060208601356136cf8161329a565b9350604086013567ffffffffffffffff808211156136ec57600080fd5b6136f889838a016133c0565b945060608801359350608088013591508082111561371557600080fd5b9087019060a0828a03121561372957600080fd5b613731613314565b8235815260208301358281111561374757600080fd5b6137538b828601613553565b60208301525060408301358281111561376b57600080fd5b6137778b8286016135e0565b60408301525060608301358281111561378f57600080fd5b61379b8b8286016133c0565b6060830152506080830135828111156137b357600080fd5b6137bf8b8286016133c0565b6080830152508093505050509295509295909350565b805164ffffffffff811681146133f457600080fd5b6000602082840312156137fc57600080fd5b611a5c826137d5565b60005b83811015613820578181015183820152602001613808565b8381111561382f576000848401525b50505050565b6000815180845261384d816020860160208601613805565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006138906080830186613835565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b602081526000611a5c6020830184613835565b6000602082840312156138d957600080fd5b8151611a5c8161329a565b6000606082840312156138f657600080fd5b6040516060810181811067ffffffffffffffff82111715613919576139196132bc565b6040528251815261392c602084016137d5565b602082015261393d604084016137d5565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611ef06080830184613835565b600082516139a0818460208701613805565b9190910192915050565b600084516139bc818460208901613805565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152613a356080830185613835565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612d106060830184613835565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526134a260a0850182613835565b602081526000611a5c6020830184613a7b565b600060208284031215613add57600080fd5b81518015158114611a5c57600080fd5b83815260006020606081840152613b076060840186613a7b565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b80841015613b575784518252938501936001939093019290850190613b37565b509998505050505050505050565b60008351613b77818460208801613805565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1f57613c1f613bde565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613c6657613c66613bde565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9d57613c9d613bde565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680613ce657613ce6613ca4565b8060ff84160691505092915050565b600060ff821660ff841680821015613d0f57613d0f613bde565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5057613d50613bde565b500290565b600060208284031215613d6757600080fd5b5051919050565b600082613d7d57613d7d613ca4565b50049056fea164736f6c6343000809000a"; ++ ++type L1CrossDomainMessengerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1CrossDomainMessengerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1CrossDomainMessenger__factory extends ContractFactory { ++ constructor(...args: L1CrossDomainMessengerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): L1CrossDomainMessenger { ++ return super.attach(address) as L1CrossDomainMessenger; ++ } ++ override connect(signer: Signer): L1CrossDomainMessenger__factory { ++ return super.connect(signer) as L1CrossDomainMessenger__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1CrossDomainMessengerInterface { ++ return new utils.Interface(_abi) as L1CrossDomainMessengerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1CrossDomainMessenger { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L1CrossDomainMessenger; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayerFast__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayerFast__factory.ts +new file mode 100644 +index 0000000..f70c43a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayerFast__factory.ts +@@ -0,0 +1,339 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1MultiMessageRelayerFast, ++ L1MultiMessageRelayerFastInterface, ++} from "../../../../contracts/L1/messaging/L1MultiMessageRelayerFast"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: ++ "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "proof", ++ type: "tuple", ++ }, ++ ], ++ internalType: "struct L1MultiMessageRelayerFast.L2ToL1Message[]", ++ name: "_messages", ++ type: "tuple[]", ++ }, ++ ], ++ name: "batchRelayMessages", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: ++ "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "proof", ++ type: "tuple", ++ }, ++ ], ++ internalType: "struct L1MultiMessageRelayerFast.L2ToL1Message[]", ++ name: "_messages", ++ type: "tuple[]", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_standardBridgeDepositHash", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_lpDepositHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "batchRelayMessages", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50604051610f1c380380610f1c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610e89806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806316e9cd9b14610051578063299ca47814610066578063461a4478146100af5780639f35c352146100c2575b600080fd5b61006461005f366004610649565b6100d5565b005b6000546100869073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100866100bd3660046107cb565b610312565b6100646100d036600461081c565b6103bf565b6101136040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4015b60405180910390fd5b600061021b604051806060016040528060218152602001610e5c60219139610312565b905060005b8281101561030c57600084848381811061023c5761023c61086d565b905060200281019061024e919061089c565b61025790610a52565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c695909490939291600401610d06565b600060405180830381600087803b1580156102e057600080fd5b505af11580156102f4573d6000803e3d6000fd5b5050505050808061030490610d63565b915050610220565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610369908590600401610dc3565b60206040518083038186803b15801561038157600080fd5b505afa158015610395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b99190610dd6565b92915050565b6103fd6040518060400160405280601981526020017f4c324261746368466173744d65737361676552656c6179657200000000000000815250610312565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4c314d756c74694d65737361676552656c61796572466173743a2046756e637460448201527f696f6e2063616e206f6e6c792062652063616c6c656420627920746865204c3260648201527f4261746368466173744d65737361676552656c61796572000000000000000000608482015260a4016101ef565b6000610500604051806060016040528060218152602001610e5c60219139610312565b905060005b848110156105f55760008686838181106105215761052161086d565b9050602002810190610533919061089c565b61053c90610a52565b805160208201516040808401516060850151608086015192517f69fdb52d00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff8916956369fdb52d956105af959094909392918d908d90600401610df3565b600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b505050505080806105ed90610d63565b915050610505565b505050505050565b60008083601f84011261060f57600080fd5b50813567ffffffffffffffff81111561062757600080fd5b6020830191508360208260051b850101111561064257600080fd5b9250929050565b6000806020838503121561065c57600080fd5b823567ffffffffffffffff81111561067357600080fd5b61067f858286016105fd565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156106dd576106dd61068b565b60405290565b6040805190810167ffffffffffffffff811182821017156106dd576106dd61068b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561074d5761074d61068b565b604052919050565b600067ffffffffffffffff83111561076f5761076f61068b565b6107a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601610706565b90508281528383830111156107b457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156107dd57600080fd5b813567ffffffffffffffff8111156107f457600080fd5b8201601f8101841361080557600080fd5b61081484823560208401610755565b949350505050565b6000806000806060858703121561083257600080fd5b843567ffffffffffffffff81111561084957600080fd5b610855878288016105fd565b90989097506020870135966040013595509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126108d057600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108fc57600080fd5b50565b600082601f83011261091057600080fd5b61091f83833560208501610755565b9392505050565b600060a0828403121561093857600080fd5b6109406106ba565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561097e57600080fd5b61098a848285016108ff565b60808301525092915050565b6000604082840312156109a857600080fd5b6109b06106e3565b90508135815260208083013567ffffffffffffffff808211156109d257600080fd5b818501915085601f8301126109e657600080fd5b8135818111156109f8576109f861068b565b8060051b9150610a09848301610706565b8181529183018401918481019088841115610a2357600080fd5b938501935b83851015610a4157843582529385019390850190610a28565b808688015250505050505092915050565b600060a08236031215610a6457600080fd5b610a6c6106ba565b8235610a77816108da565b81526020830135610a87816108da565b6020820152604083013567ffffffffffffffff80821115610aa757600080fd5b610ab3368387016108ff565b6040840152606085013560608401526080850135915080821115610ad657600080fd5b818501915060a08236031215610aeb57600080fd5b610af36106ba565b82358152602083013582811115610b0957600080fd5b610b1536828601610926565b602083015250604083013582811115610b2d57600080fd5b610b3936828601610996565b604083015250606083013582811115610b5157600080fd5b610b5d368286016108ff565b606083015250608083013582811115610b7557600080fd5b610b81368286016108ff565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610bbf57602081850181015186830182015201610ba3565b81811115610bd1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b80831015610c505784518252938301936001929092019190830190610c30565b509695505050505050565b805182526000602082015160a06020850152805160a0850152602081015160c0850152604081015160e085015260608101516101008501526080810151905060a0610120850152610cb0610140850182610b99565b905060408301518482036040860152610cc98282610c04565b91505060608301518482036060860152610ce38282610b99565b91505060808301518482036080860152610cfd8282610b99565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152610d3f60a0830186610b99565b8460608401528281036080840152610d578185610c5b565b98975050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610dbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061091f6020830184610b99565b600060208284031215610de857600080fd5b815161091f816108da565b600073ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525060e06040830152610e2c60e0830188610b99565b8660608401528281036080840152610e448187610c5b565b60a0840195909552505060c001529594505050505056fe50726f78795f5f4c3143726f7373446f6d61696e4d657373656e67657246617374a164736f6c6343000809000a"; ++ ++type L1MultiMessageRelayerFastConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1MultiMessageRelayerFastConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1MultiMessageRelayerFast__factory extends ContractFactory { ++ constructor(...args: L1MultiMessageRelayerFastConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_libAddressManager, overrides || {}); ++ } ++ override attach(address: string): L1MultiMessageRelayerFast { ++ return super.attach(address) as L1MultiMessageRelayerFast; ++ } ++ override connect(signer: Signer): L1MultiMessageRelayerFast__factory { ++ return super.connect(signer) as L1MultiMessageRelayerFast__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1MultiMessageRelayerFastInterface { ++ return new utils.Interface(_abi) as L1MultiMessageRelayerFastInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1MultiMessageRelayerFast { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L1MultiMessageRelayerFast; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayer__factory.ts +new file mode 100644 +index 0000000..01c18ef +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1MultiMessageRelayer__factory.ts +@@ -0,0 +1,222 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1MultiMessageRelayer, ++ L1MultiMessageRelayerInterface, ++} from "../../../../contracts/L1/messaging/L1MultiMessageRelayer"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "stateRoot", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "stateRootBatchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "stateRootProof", ++ type: "tuple", ++ }, ++ { ++ internalType: "bytes", ++ name: "stateTrieWitness", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "storageTrieWitness", ++ type: "bytes", ++ }, ++ ], ++ internalType: ++ "struct IL1CrossDomainMessenger.L2MessageInclusionProof", ++ name: "proof", ++ type: "tuple", ++ }, ++ ], ++ internalType: "struct L1MultiMessageRelayer.L2ToL1Message[]", ++ name: "_messages", ++ type: "tuple[]", ++ }, ++ ], ++ name: "batchRelayMessages", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50604051610bd6380380610bd683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610b43806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316e9cd9b14610046578063299ca4781461005b578063461a4478146100a4575b600080fd5b6100596100543660046103bd565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b6100b2366004610572565b610310565b6100f56040518060400160405280601581526020017f4c3242617463684d65737361676552656c617965720000000000000000000000815250610310565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c314d756c74694d65737361676552656c617965723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865204c324261746360648201527f684d65737361676552656c617965720000000000000000000000000000000000608482015260a40160405180910390fd5b60006102196040518060400160405280601d81526020017f50726f78795f5f4c3143726f7373446f6d61696e4d657373656e676572000000815250610310565b905060005b8281101561030a57600084848381811061023a5761023a6105c3565b905060200281019061024c91906105f2565b610255906107a8565b805160208201516040808401516060850151608086015192517fd7fd19dd00000000000000000000000000000000000000000000000000000000815295965073ffffffffffffffffffffffffffffffffffffffff89169563d7fd19dd956102c4959094909392916004016109b1565b600060405180830381600087803b1580156102de57600080fd5b505af11580156102f2573d6000803e3d6000fd5b5050505050808061030290610aa6565b91505061021e565b50505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610367908590600401610b06565b60206040518083038186803b15801561037f57600080fd5b505afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b79190610b19565b92915050565b600080602083850312156103d057600080fd5b823567ffffffffffffffff808211156103e857600080fd5b818501915085601f8301126103fc57600080fd5b81358181111561040b57600080fd5b8660208260051b850101111561042057600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561048457610484610432565b60405290565b6040805190810167ffffffffffffffff8111828210171561048457610484610432565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156104f4576104f4610432565b604052919050565b600067ffffffffffffffff83111561051657610516610432565b61054760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016104ad565b905082815283838301111561055b57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561058457600080fd5b813567ffffffffffffffff81111561059b57600080fd5b8201601f810184136105ac57600080fd5b6105bb848235602084016104fc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261062657600080fd5b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461065257600080fd5b50565b600082601f83011261066657600080fd5b610675838335602085016104fc565b9392505050565b600060a0828403121561068e57600080fd5b610696610461565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156106d457600080fd5b6106e084828501610655565b60808301525092915050565b6000604082840312156106fe57600080fd5b61070661048a565b90508135815260208083013567ffffffffffffffff8082111561072857600080fd5b818501915085601f83011261073c57600080fd5b81358181111561074e5761074e610432565b8060051b915061075f8483016104ad565b818152918301840191848101908884111561077957600080fd5b938501935b838510156107975784358252938501939085019061077e565b808688015250505050505092915050565b600060a082360312156107ba57600080fd5b6107c2610461565b82356107cd81610630565b815260208301356107dd81610630565b6020820152604083013567ffffffffffffffff808211156107fd57600080fd5b61080936838701610655565b604084015260608501356060840152608085013591508082111561082c57600080fd5b818501915060a0823603121561084157600080fd5b610849610461565b8235815260208301358281111561085f57600080fd5b61086b3682860161067c565b60208301525060408301358281111561088357600080fd5b61088f368286016106ec565b6040830152506060830135828111156108a757600080fd5b6108b336828601610655565b6060830152506080830135828111156108cb57600080fd5b6108d736828601610655565b60808301525080608085015250505080915050919050565b6000815180845260005b81811015610915576020818501810151868301820152016108f9565b81811115610927576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600060408301825184526020808401516040828701528281518085526060880191508383019450600092505b808310156109a65784518252938301936001929092019190830190610986565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526109ea60a08301866108ef565b846060840152828103608084015283518152602084015160a06020830152805160a0830152602081015160c0830152604081015160e083015260608101516101008301526080810151905060a0610120830152610a4b6101408301826108ef565b905060408501518282036040840152610a64828261095a565b91505060608501518282036060840152610a7e82826108ef565b91505060808501518282036080840152610a9882826108ef565b9a9950505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610aff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152600061067560208301846108ef565b600060208284031215610b2b57600080fd5b81516106758161063056fea164736f6c6343000809000a"; ++ ++type L1MultiMessageRelayerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1MultiMessageRelayerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1MultiMessageRelayer__factory extends ContractFactory { ++ constructor(...args: L1MultiMessageRelayerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_libAddressManager, overrides || {}); ++ } ++ override attach(address: string): L1MultiMessageRelayer { ++ return super.attach(address) as L1MultiMessageRelayer; ++ } ++ override connect(signer: Signer): L1MultiMessageRelayer__factory { ++ return super.connect(signer) as L1MultiMessageRelayer__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1MultiMessageRelayerInterface { ++ return new utils.Interface(_abi) as L1MultiMessageRelayerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1MultiMessageRelayer { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L1MultiMessageRelayer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridgeAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridgeAltL1__factory.ts +new file mode 100644 +index 0000000..2cc591b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridgeAltL1__factory.ts +@@ -0,0 +1,516 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1StandardBridgeAltL1, ++ L1StandardBridgeAltL1Interface, ++} from "../../../../contracts/L1/messaging/L1StandardBridgeAltL1"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20DepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20WithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "NativeTokenDepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "NativeTokenWithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "currentDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20To", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositNativeToken", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositNativeTokenTo", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "deposits", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "donateNativeToken", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeERC20Withdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeNativeTokenWithdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1messenger", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2TokenBridge", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "lastHashUpdateBlock", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "messenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "priorDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50600080546001600160a01b031916905561185e806100306000396000f3fe6080604052600436106100e15760003560e01c80638f601f661161007f578063a9f9e67511610059578063a9f9e675146102c1578063b1c78f17146102e1578063cd38698314610158578063f8fe09a3146102f457600080fd5b80638f601f661461025357806391c49bf81461028b578063a5ab6190146102ab57600080fd5b806350cc72d2116100bb57806350cc72d2146101dc57806358a997f6146101ef57806359326e6f1461020f578063838b25201461023357600080fd5b80630f6a78691461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a366004611274565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112e7565b61075f565b6101586101ea366004611339565b610824565b3480156101fb57600080fd5b5061015861020a36600461139c565b61086c565b34801561021b57600080fd5b5061022560055481565b6040519081526020016101b3565b34801561023f57600080fd5b5061015861024e36600461141f565b6108d3565b34801561025f57600080fd5b5061022561026e3660046112e7565b600260209081526000928352604080842090915290825290205481565b34801561029757600080fd5b5060015461019f906001600160a01b031681565b3480156102b757600080fd5b5061022560045481565b3480156102cd57600080fd5b506101586102dc3660046114b5565b6108ec565b6101586102ef36600461152e565b610b65565b34801561030057600080fd5b5061022560035481565b600063662a633a60e01b600073420000000000000000000000000000000000002387873487604051602401610344969594939291906115f7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bfb565b6103fd6000734200000000000000000000000000000000000023878734610c76565b836001600160a01b0316856001600160a01b03167ff1e6647a55a4ecbf748c8aaf6d27773d9a2d21d16ca35ee5fbb529b4a631062d3485604051610442929190611645565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610581919061165e565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b038716908690604051610627919061167b565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806107075760405162461bcd60e51b8152602060048201526044602482018190527f5472616e7366657248656c7065723a3a736166655472616e736665724e617469908201527f7665546f6b656e3a204e6174697665546f6b656e207472616e7366657220666160648201527f696c656400000000000000000000000000000000000000000000000000000000608482015260a401610131565b856001600160a01b0316876001600160a01b03167f3f1eed6f7f293b677b5cd65d3bc95380be434147c85b33a317056e088f84a59a87878760405161074e939291906116e0565b60405180910390a350505050505050565b6000546001600160a01b0316156107de5760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b61086633858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b333b156108bb5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b6108cb8686333388888888610ce8565b505050505050565b6108e38787338888888888610ce8565b50505050505050565b6001546001600160a01b031661090a6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109905760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109ac6000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e457600080fd5b505afa1580156109f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1c919061165e565b6001600160a01b031614610a985760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610ac9908590611732565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610b00908686610e85565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b539493929190611749565b60405180910390a45050505050505050565b333b15610bb45760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bf633338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c489086908590879060040161177c565b600060405180830381600087803b158015610c6257600080fd5b505af11580156108e3573d6000803e3d6000fd5b600554431115610c87576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cfd6001600160a01b038916873087610f4c565b600063662a633a60e01b89898989898888604051602401610d2497969594939291906117b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610dbb906001600160a01b03168583610bfb565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dec908690611804565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610e1f8989898989610c76565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e729493929190611749565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bf69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f9d565b6040516001600160a01b03808516602483015283166044820152606481018290526108669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610eca565b6000610ff2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166110829092919063ffffffff16565b805190915015610bf65780806020019051810190611010919061181c565b610bf65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b6060611091848460008561109b565b90505b9392505050565b6060824710156111135760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b6111615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b0316858760405161117d919061167b565b60006040518083038185875af1925050503d80600081146111ba576040519150601f19603f3d011682016040523d82523d6000602084013e6111bf565b606091505b50915091506111cf8282866111da565b979650505050505050565b606083156111e9575081611094565b8251156111f95782518084602001fd5b8160405162461bcd60e51b8152600401610131919061183e565b6001600160a01b038116811461122857600080fd5b50565b60008083601f84011261123d57600080fd5b50813567ffffffffffffffff81111561125557600080fd5b60208301915083602082850101111561126d57600080fd5b9250929050565b60008060008060006080868803121561128c57600080fd5b853561129781611213565b945060208601356112a781611213565b935060408601359250606086013567ffffffffffffffff8111156112ca57600080fd5b6112d68882890161122b565b969995985093965092949392505050565b600080604083850312156112fa57600080fd5b823561130581611213565b9150602083013561131581611213565b809150509250929050565b803563ffffffff8116811461133457600080fd5b919050565b6000806000806060858703121561134f57600080fd5b843561135a81611213565b935061136860208601611320565b9250604085013567ffffffffffffffff81111561138457600080fd5b6113908782880161122b565b95989497509550505050565b60008060008060008060a087890312156113b557600080fd5b86356113c081611213565b955060208701356113d081611213565b9450604087013593506113e560608801611320565b9250608087013567ffffffffffffffff81111561140157600080fd5b61140d89828a0161122b565b979a9699509497509295939492505050565b600080600080600080600060c0888a03121561143a57600080fd5b873561144581611213565b9650602088013561145581611213565b9550604088013561146581611213565b94506060880135935061147a60808901611320565b925060a088013567ffffffffffffffff81111561149657600080fd5b6114a28a828b0161122b565b989b979a50959850939692959293505050565b600080600080600080600060c0888a0312156114d057600080fd5b87356114db81611213565b965060208801356114eb81611213565b955060408801356114fb81611213565b9450606088013561150b81611213565b93506080880135925060a088013567ffffffffffffffff81111561149657600080fd5b60008060006040848603121561154357600080fd5b61154c84611320565b9250602084013567ffffffffffffffff81111561156857600080fd5b6115748682870161122b565b9497909650939450505050565b60005b8381101561159c578181015183820152602001611584565b838111156108665750506000910152565b600081518084526115c5816020860160208601611581565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261163960c08301846115ad565b98975050505050505050565b82815260406020820152600061109160408301846115ad565b60006020828403121561167057600080fd5b815161109481611213565b6000825161168d818460208701611581565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116fa604083018486611697565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561174457611744611703565b500390565b6001600160a01b0385168152836020820152606060408201526000611772606083018486611697565b9695505050505050565b6001600160a01b038416815260606020820152600061179e60608301856115ad565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117f760c083018486611697565b9998505050505050505050565b6000821982111561181757611817611703565b500190565b60006020828403121561182e57600080fd5b8151801515811461109457600080fd5b60208152600061109460208301846115ad56fea164736f6c6343000809000a"; ++ ++type L1StandardBridgeAltL1ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1StandardBridgeAltL1ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1StandardBridgeAltL1__factory extends ContractFactory { ++ constructor(...args: L1StandardBridgeAltL1ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): L1StandardBridgeAltL1 { ++ return super.attach(address) as L1StandardBridgeAltL1; ++ } ++ override connect(signer: Signer): L1StandardBridgeAltL1__factory { ++ return super.connect(signer) as L1StandardBridgeAltL1__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1StandardBridgeAltL1Interface { ++ return new utils.Interface(_abi) as L1StandardBridgeAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1StandardBridgeAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L1StandardBridgeAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridge__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridge__factory.ts +new file mode 100644 +index 0000000..299a64e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/L1StandardBridge__factory.ts +@@ -0,0 +1,512 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L1StandardBridge, ++ L1StandardBridgeInterface, ++} from "../../../../contracts/L1/messaging/L1StandardBridge"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20DepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ERC20WithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ETHDepositInitiated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "ETHWithdrawalFinalized", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "currentDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositERC20To", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositETH", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l2Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "depositETHTo", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "deposits", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "donateETH", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeERC20Withdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeETHWithdrawal", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1messenger", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2TokenBridge", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "lastHashUpdateBlock", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "messenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "priorDepositInfoHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50600080546001600160a01b0319169055611837806100306000396000f3fe6080604052600436106100e15760003560e01c80638f601f661161007f578063a5ab619011610059578063a5ab6190146102ab578063a9f9e675146102c1578063b1a1a882146102e1578063f8fe09a3146102f457600080fd5b80638f601f661461024057806391c49bf8146102785780639a2ac6d51461029857600080fd5b806358a997f6116100bb57806358a997f6146101dc57806359326e6f146101fc578063838b2520146102205780638b4c40b01461015857600080fd5b80631532ec341461015f5780633cb747bf1461017f578063485cc955146101bc57600080fd5b3661015a57333b1561013a5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064015b60405180910390fd5b61015833336213d6206040518060200160405280600081525061030a565b005b600080fd5b34801561016b57600080fd5b5061015861017a36600461124d565b610451565b34801561018b57600080fd5b5060005461019f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101c857600080fd5b506101586101d73660046112c0565b610738565b3480156101e857600080fd5b506101586101f7366004611312565b6107fd565b34801561020857600080fd5b5061021260055481565b6040519081526020016101b3565b34801561022c57600080fd5b5061015861023b366004611395565b610864565b34801561024c57600080fd5b5061021261025b3660046112c0565b600260209081526000928352604080842090915290825290205481565b34801561028457600080fd5b5060015461019f906001600160a01b031681565b6101586102a636600461142b565b61087d565b3480156102b757600080fd5b5061021260045481565b3480156102cd57600080fd5b506101586102dc36600461148e565b6108c5565b6101586102ef366004611507565b610b3e565b34801561030057600080fd5b5061021260035481565b600063662a633a60e01b600073420000000000000000000000000000000000000687873487604051602401610344969594939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506103db906001600160a01b03168483610bd4565b6103fd6000734200000000000000000000000000000000000006878734610c4f565b836001600160a01b0316856001600160a01b03167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23348560405161044292919061161e565b60405180910390a35050505050565b6001546001600160a01b031661046f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146104f55760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166105116000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190611637565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b604080516000808252602082019092526001600160a01b0387169086906040516106279190611654565b60006040518083038185875af1925050503d8060008114610664576040519150601f19603f3d011682016040523d82523d6000602084013e610669565b606091505b50509050806106e05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610131565b856001600160a01b0316876001600160a01b03167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631878787604051610727939291906116b9565b60405180910390a350505050505050565b6000546001600160a01b0316156107b75760405162461bcd60e51b815260206004820152602660248201527f436f6e74726163742068617320616c7265616479206265656e20696e6974696160448201527f6c697a65642e00000000000000000000000000000000000000000000000000006064820152608401610131565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b333b1561084c5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b61085c8686333388888888610cc1565b505050505050565b6108748787338888888888610cc1565b50505050505050565b6108bf33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b50505050565b6001546001600160a01b03166108e36000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146109695760405162461bcd60e51b815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e746963617465640000000000000000000000000000000000006064820152608401610131565b806001600160a01b03166109856000546001600160a01b031690565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f59190611637565b6001600160a01b031614610a715760405162461bcd60e51b815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610131565b6001600160a01b038089166000908152600260209081526040808320938b1683529290522054610aa290859061170b565b6001600160a01b03808a166000818152600260209081526040808320948d1683529390529190912091909155610ad9908686610e5e565b856001600160a01b0316876001600160a01b0316896001600160a01b03167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b388888888604051610b2c9493929190611722565b60405180910390a45050505050505050565b333b15610b8d5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610131565b610bcf33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061030a92505050565b505050565b6000546040517f3dbb202b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633dbb202b90610c2190869085908790600401611755565b600060405180830381600087803b158015610c3b57600080fd5b505af1158015610874573d6000803e3d6000fd5b600554431115610c60576004546003555b60048054604080516020808201939093526001600160a01b0398891681830152968816606088015294871660808701529290951660a085015260c0808501919091528251808503909101815260e09093019091528151910120905543600555565b610cd66001600160a01b038916873087610f25565b600063662a633a60e01b89898989898888604051602401610cfd979695949392919061178d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600154909150610d94906001600160a01b03168583610bd4565b6001600160a01b03808a166000908152600260209081526040808320938c1683529290522054610dc59086906117dd565b6001600160a01b03808b166000908152600260209081526040808320938d1683529290522055610df88989898989610c4f565b866001600160a01b0316886001600160a01b03168a6001600160a01b03167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039689898888604051610e4b9493929190611722565b60405180910390a4505050505050505050565b6040516001600160a01b038316602482015260448101829052610bcf9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f76565b6040516001600160a01b03808516602483015283166044820152606481018290526108bf9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610ea3565b6000610fcb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661105b9092919063ffffffff16565b805190915015610bcf5780806020019051810190610fe991906117f5565b610bcf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610131565b606061106a8484600085611074565b90505b9392505050565b6060824710156110ec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610131565b843b61113a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610131565b600080866001600160a01b031685876040516111569190611654565b60006040518083038185875af1925050503d8060008114611193576040519150601f19603f3d011682016040523d82523d6000602084013e611198565b606091505b50915091506111a88282866111b3565b979650505050505050565b606083156111c257508161106d565b8251156111d25782518084602001fd5b8160405162461bcd60e51b81526004016101319190611817565b6001600160a01b038116811461120157600080fd5b50565b60008083601f84011261121657600080fd5b50813567ffffffffffffffff81111561122e57600080fd5b60208301915083602082850101111561124657600080fd5b9250929050565b60008060008060006080868803121561126557600080fd5b8535611270816111ec565b94506020860135611280816111ec565b935060408601359250606086013567ffffffffffffffff8111156112a357600080fd5b6112af88828901611204565b969995985093965092949392505050565b600080604083850312156112d357600080fd5b82356112de816111ec565b915060208301356112ee816111ec565b809150509250929050565b803563ffffffff8116811461130d57600080fd5b919050565b60008060008060008060a0878903121561132b57600080fd5b8635611336816111ec565b95506020870135611346816111ec565b94506040870135935061135b606088016112f9565b9250608087013567ffffffffffffffff81111561137757600080fd5b61138389828a01611204565b979a9699509497509295939492505050565b600080600080600080600060c0888a0312156113b057600080fd5b87356113bb816111ec565b965060208801356113cb816111ec565b955060408801356113db816111ec565b9450606088013593506113f0608089016112f9565b925060a088013567ffffffffffffffff81111561140c57600080fd5b6114188a828b01611204565b989b979a50959850939692959293505050565b6000806000806060858703121561144157600080fd5b843561144c816111ec565b935061145a602086016112f9565b9250604085013567ffffffffffffffff81111561147657600080fd5b61148287828801611204565b95989497509550505050565b600080600080600080600060c0888a0312156114a957600080fd5b87356114b4816111ec565b965060208801356114c4816111ec565b955060408801356114d4816111ec565b945060608801356114e4816111ec565b93506080880135925060a088013567ffffffffffffffff81111561140c57600080fd5b60008060006040848603121561151c57600080fd5b611525846112f9565b9250602084013567ffffffffffffffff81111561154157600080fd5b61154d86828701611204565b9497909650939450505050565b60005b8381101561157557818101518382015260200161155d565b838111156108bf5750506000910152565b6000815180845261159e81602086016020860161155a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261161260c0830184611586565b98975050505050505050565b82815260406020820152600061106a6040830184611586565b60006020828403121561164957600080fd5b815161106d816111ec565b6000825161166681846020870161155a565b9190910192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006116d3604083018486611670565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561171d5761171d6116dc565b500390565b6001600160a01b038516815283602082015260606040820152600061174b606083018486611670565b9695505050505050565b6001600160a01b03841681526060602082015260006117776060830185611586565b905063ffffffff83166040830152949350505050565b60006001600160a01b03808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117d060c083018486611670565b9998505050505050505050565b600082198211156117f0576117f06116dc565b500190565b60006020828403121561180757600080fd5b8151801515811461106d57600080fd5b60208152600061106d602083018461158656fea164736f6c6343000809000a"; ++ ++type L1StandardBridgeConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1StandardBridgeConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1StandardBridge__factory extends ContractFactory { ++ constructor(...args: L1StandardBridgeConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): L1StandardBridge { ++ return super.attach(address) as L1StandardBridge; ++ } ++ override connect(signer: Signer): L1StandardBridge__factory { ++ return super.connect(signer) as L1StandardBridge__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1StandardBridgeInterface { ++ return new utils.Interface(_abi) as L1StandardBridgeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1StandardBridge { ++ return new Contract(address, _abi, signerOrProvider) as L1StandardBridge; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/index.ts +new file mode 100644 +index 0000000..0f627b3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/messaging/index.ts +@@ -0,0 +1,15 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IL1CrossDomainMessenger__factory } from "./IL1CrossDomainMessenger__factory"; ++export { IL1CrossDomainMessengerFast__factory } from "./IL1CrossDomainMessengerFast__factory"; ++export { IL1DepositHash__factory } from "./IL1DepositHash__factory"; ++export { IL1ERC20Bridge__factory } from "./IL1ERC20Bridge__factory"; ++export { IL1StandardBridge__factory } from "./IL1StandardBridge__factory"; ++export { IL1StandardBridgeAltL1__factory } from "./IL1StandardBridgeAltL1__factory"; ++export { L1CrossDomainMessenger__factory } from "./L1CrossDomainMessenger__factory"; ++export { L1CrossDomainMessengerFast__factory } from "./L1CrossDomainMessengerFast__factory"; ++export { L1MultiMessageRelayer__factory } from "./L1MultiMessageRelayer__factory"; ++export { L1MultiMessageRelayerFast__factory } from "./L1MultiMessageRelayerFast__factory"; ++export { L1StandardBridge__factory } from "./L1StandardBridge__factory"; ++export { L1StandardBridgeAltL1__factory } from "./L1StandardBridgeAltL1__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/CanonicalTransactionChain__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/CanonicalTransactionChain__factory.ts +new file mode 100644 +index 0000000..ad55a47 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/CanonicalTransactionChain__factory.ts +@@ -0,0 +1,586 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ CanonicalTransactionChain, ++ CanonicalTransactionChainInterface, ++} from "../../../../contracts/L1/rollup/CanonicalTransactionChain"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_maxTransactionGasLimit", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_l2GasDiscountDivisor", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_enqueueGasCost", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "l2GasDiscountDivisor", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "enqueueGasCost", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "enqueueL2GasPrepaid", ++ type: "uint256", ++ }, ++ ], ++ name: "L2GasParamsUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_startingQueueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_numQueueElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ name: "QueueBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_startingQueueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_numQueueElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ name: "SequencerBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_batchSize", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_extraData", ++ type: "bytes", ++ }, ++ ], ++ name: "TransactionBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1TxOrigin", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_gasLimit", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_timestamp", ++ type: "uint256", ++ }, ++ ], ++ name: "TransactionEnqueued", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "MAX_ROLLUP_TX_SIZE", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "MIN_ROLLUP_TX_GAS", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "appendSequencerBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "batches", ++ outputs: [ ++ { ++ internalType: "contract IChainStorageContainer", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_gasLimit", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "enqueue", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "enqueueGasCost", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "enqueueL2GasPrepaid", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastBlockNumber", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastTimestamp", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getNextQueueIndex", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getNumPendingQueueElements", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "getQueueElement", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "transactionHash", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint40", ++ name: "timestamp", ++ type: "uint40", ++ }, ++ { ++ internalType: "uint40", ++ name: "blockNumber", ++ type: "uint40", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.QueueElement", ++ name: "_element", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getQueueLength", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalBatches", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalBatches", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalElements", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2GasDiscountDivisor", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "maxTransactionGasLimit", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "queue", ++ outputs: [ ++ { ++ internalType: "contract IChainStorageContainer", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_l2GasDiscountDivisor", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_enqueueGasCost", ++ type: "uint256", ++ }, ++ ], ++ name: "setGasParams", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405162001ac238038062001ac283398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b6119c880620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063d0f893441161008c578063e654b1fb11610066578063e654b1fb146102d3578063edcc4a45146102dc578063f722b41a146102ef57600080fd5b8063d0f89344146102bb578063e10d29ee146102c3578063e561dddc146102cb57600080fd5b8063b8f77005116100bd578063b8f77005146102a2578063ccf987c8146102aa578063cfdf677e146102b357600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb366004611438565b6102f7565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610375565b60405164ffffffffff909116815260200161018f565b6101b861024d366004611514565b610389565b610229610436565b61026d61026836600461158a565b61044a565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108ac565b61018561c35081565b61018560045481565b600654610229565b61018560025481565b6101b86108c7565b61026d6108ef565b6101b8610e0b565b610185610e4b565b61018560015481565b61026d6102ea3660046115f7565b610ed2565b610229611069565b60408051606081018252600080825260208201819052918101919091526006828154811061032757610327611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b600080610380611085565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103e09085906004016116b3565b60206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043091906116cd565b92915050565b600080610441611085565b95945050505050565b61c350815111156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104d9565b620186a0821015610607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104d9565b6003548211156106ef576000600254600354846106249190611719565b61062e9190611730565b905060005a90508181116106c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104d9565b60005b825a6106d39084611719565b10156106eb57806106e38161176b565b9150506106c7565b5050505b600033321415610700575033610719565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073294939291906117a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061083891611719565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb588884260405161089c939291906117ed565b60405180910390a4505050505050565b6000806108b7611085565b50505064ffffffffff1692915050565b60006108ea60405180606001604052806021815260200161199b60219139610389565b905090565b60043560d81c60093560e890811c90600c35901c61090b6108ac565b8364ffffffffff16146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104d9565b6109de6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104d9565b6000610aaa62ffffff83166010611816565b610ab590600f611853565b905064ffffffffff8116361015610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104d9565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bdf576000610ba58263ffffffff16611140565b8051909350839150610bb7908661186b565b9450826020015184610bc99190611893565b9350508080610bd7906118b3565b915050610b81565b5060065464ffffffffff83161115610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104d9565b6000610cb08462ffffff89166118d7565b63ffffffff169050600080836020015160001415610cd957505060408201516060830151610d4a565b60006006610ce86001886118fc565b64ffffffffff1681548110610cff57610cff611619565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d6e610d58600143611719565b408a62ffffff168564ffffffffff1685856111c7565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d9984876118fc565b84610da26108ac565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006108ea6040518060400160405280601f81526020017f436861696e53746f72616765436f6e7461696e65722d4354432d717565756500815250610389565b6000610e556108c7565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea919061191a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906116cd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104d9565b600181905560028290556110188183611816565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108ea9164ffffffffff909116906118fc565b60008060008060006110956108c7565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190611933565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b61116b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000611178601084611816565b61118390600f611853565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b60006111d16108c7565b90506000806111de611085565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061191a565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112ec9493929190611975565b60405180910390a260006112ff826113f2565b9050600061133a8360400151866113169190611893565b6113208b87611893565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050505050505050505050505050565b6000816020015182604001518360600151846080015160405160200161141b9493929190611975565b604051602081830303815290604052805190602001209050919050565b60006020828403121561144a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561149b5761149b611451565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156114e1576114e1611451565b816040528093508581528686860111156114fa57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561152657600080fd5b813567ffffffffffffffff81111561153d57600080fd5b8201601f8101841361154e57600080fd5b61155d84823560208401611480565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461158757600080fd5b50565b60008060006060848603121561159f57600080fd5b83356115aa81611565565b925060208401359150604084013567ffffffffffffffff8111156115cd57600080fd5b8401601f810186136115de57600080fd5b6115ed86823560208401611480565b9150509250925092565b6000806040838503121561160a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561166e57602081850181015186830182015201611652565b81811115611680576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116c66020830184611648565b9392505050565b6000602082840312156116df57600080fd5b81516116c681611565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561172b5761172b6116ea565b500390565b600082611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561179d5761179d6116ea565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526117e36080830184611648565b9695505050505050565b8381526060602082015260006118066060830185611648565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561184e5761184e6116ea565b500290565b60008219821115611866576118666116ea565b500190565b600063ffffffff80831681851680830382111561188a5761188a6116ea565b01949350505050565b600064ffffffffff80831681851680830382111561188a5761188a6116ea565b600063ffffffff808316818114156118cd576118cd6116ea565b6001019392505050565b600063ffffffff838116908316818110156118f4576118f46116ea565b039392505050565b600064ffffffffff838116908316818110156118f4576118f46116ea565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146116c657600080fd5b8481528360208201528260408201526080606082015260006117e3608083018461164856fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a164736f6c6343000809000a"; ++ ++type CanonicalTransactionChainConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: CanonicalTransactionChainConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class CanonicalTransactionChain__factory extends ContractFactory { ++ constructor(...args: CanonicalTransactionChainConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ _maxTransactionGasLimit: PromiseOrValue, ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ _maxTransactionGasLimit, ++ _l2GasDiscountDivisor, ++ _enqueueGasCost, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ _maxTransactionGasLimit: PromiseOrValue, ++ _l2GasDiscountDivisor: PromiseOrValue, ++ _enqueueGasCost: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _libAddressManager, ++ _maxTransactionGasLimit, ++ _l2GasDiscountDivisor, ++ _enqueueGasCost, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): CanonicalTransactionChain { ++ return super.attach(address) as CanonicalTransactionChain; ++ } ++ override connect(signer: Signer): CanonicalTransactionChain__factory { ++ return super.connect(signer) as CanonicalTransactionChain__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): CanonicalTransactionChainInterface { ++ return new utils.Interface(_abi) as CanonicalTransactionChainInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): CanonicalTransactionChain { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as CanonicalTransactionChain; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ChainStorageContainer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ChainStorageContainer__factory.ts +new file mode 100644 +index 0000000..8cd47fe +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ChainStorageContainer__factory.ts +@@ -0,0 +1,260 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ ChainStorageContainer, ++ ChainStorageContainerInterface, ++} from "../../../../contracts/L1/rollup/ChainStorageContainer"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_owner", ++ type: "string", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "get", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getGlobalMetadata", ++ outputs: [ ++ { ++ internalType: "bytes27", ++ name: "", ++ type: "bytes27", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "length", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_object", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "push", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_object", ++ type: "bytes32", ++ }, ++ ], ++ name: "push", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "setGlobalMetadata", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60806040523480156200001157600080fd5b506040516200118a3803806200118a833981016040819052620000349162000129565b600080546001600160a01b0319166001600160a01b0384161790558051620000649060019060208401906200006d565b50505062000266565b8280546200007b9062000229565b90600052602060002090601f0160209004810192826200009f5760008555620000ea565b82601f10620000ba57805160ff1916838001178555620000ea565b82800160010185558215620000ea579182015b82811115620000ea578251825591602001919060010190620000cd565b50620000f8929150620000fc565b5090565b5b80821115620000f85760008155600101620000fd565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200013d57600080fd5b82516001600160a01b03811681146200015557600080fd5b602084810151919350906001600160401b03808211156200017557600080fd5b818601915086601f8301126200018a57600080fd5b8151818111156200019f576200019f62000113565b604051601f8201601f19908116603f01168101908382118183101715620001ca57620001ca62000113565b816040528281528986848701011115620001e357600080fd5b600093505b82841015620002075784840186015181850187015292850192620001e8565b82841115620002195760008684830101525b8096505050505050509250929050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b610f1480620002766000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063461a4478116100815780639507d39a1161005b5780639507d39a146101a4578063b298e36b146101b7578063ccf8f969146101ca57600080fd5b8063461a4478146101695780634651d91e1461017c5780638da5cb5b1461018f57600080fd5b80632015276c116100b25780632015276c146100fe57806329061de214610111578063299ca4781461012457600080fd5b8063167fd681146100ce5780631f7b6d32146100e3575b600080fd5b6100e16100dc366004610c59565b6101e9565b005b6100eb61034d565b6040519081526020015b60405180910390f35b6100e161010c366004610c59565b610365565b6100e161011f366004610c85565b61043d565b6000546101449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f5565b610144610177366004610cd6565b610517565b6100e161018a366004610da5565b6105c4565b61019761069b565b6040516100f59190610dbe565b6100eb6101b2366004610da5565b610729565b6100e16101c5366004610da5565b61073d565b6101d2610814565b60405164ffffffffff1990911681526020016100f5565b61027c600180546101f990610e31565b80601f016020809104026020016040519081016040528092919081815260200182805461022590610e31565b80156102725780601f1061024757610100808354040283529160200191610272565b820191906000526020600020905b81548152906001019060200180831161025557829003601f168201915b5050505050610517565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461033d57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b61034960028383610825565b5050565b6000610359600261090c565b64ffffffffff16905090565b610375600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b61034960028383610957565b61044d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461050957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b6105146002826109e6565b50565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061056e908590600401610dbe565b60206040518083038186803b15801561058657600080fd5b505afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610e85565b92915050565b6105d4600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610a47565b600180546106a890610e31565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490610e31565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b505050505081565b60006105be600264ffffffffff8416610aa4565b61074d600180546101f990610e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e6064820152608401610334565b610514600282610b73565b60006108206002610bd0565b905090565b600061086784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff16106108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b64ffffffffff8316815264ffffffffff19821660208201526109068482610c1e565b50505050565b60008061094f83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061099984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816109c482610ebb565b64ffffffffff1690525064ffffffffff19821660208201526109068482610c1e565b6000610a2883604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff19831660208201529050610a428382610c1e565b505050565b6000610a8983604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856108259092919063ffffffff16565b600080610ae784604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff168310610b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610334565b50506000908152600191909101602052604090205490565b6000610bb583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050610a42828260200151856109579092919063ffffffff16565b600080610c1383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b8051602082015183548183179291908314610c37578285555b5050505050565b803564ffffffffff1981168114610c5457600080fd5b919050565b60008060408385031215610c6c57600080fd5b82359150610c7c60208401610c3e565b90509250929050565b600060208284031215610c9757600080fd5b610ca082610c3e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610ce857600080fd5b813567ffffffffffffffff80821115610d0057600080fd5b818401915084601f830112610d1457600080fd5b813581811115610d2657610d26610ca7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d6c57610d6c610ca7565b81604052828152876020848701011115610d8557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610db757600080fd5b5035919050565b600060208083528351808285015260005b81811015610deb57858101830151858201604001528201610dcf565b81811115610dfd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600181811c90821680610e4557607f821691505b60208210811415610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215610e9757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ca057600080fd5b600064ffffffffff80831681811415610efd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a"; ++ ++type ChainStorageContainerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: ChainStorageContainerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class ChainStorageContainer__factory extends ContractFactory { ++ constructor(...args: ChainStorageContainerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ _owner, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _libAddressManager, ++ _owner, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): ChainStorageContainer { ++ return super.attach(address) as ChainStorageContainer; ++ } ++ override connect(signer: Signer): ChainStorageContainer__factory { ++ return super.connect(signer) as ChainStorageContainer__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): ChainStorageContainerInterface { ++ return new utils.Interface(_abi) as ChainStorageContainerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ChainStorageContainer { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as ChainStorageContainer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ICanonicalTransactionChain__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ICanonicalTransactionChain__factory.ts +new file mode 100644 +index 0000000..4f8d7b0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/ICanonicalTransactionChain__factory.ts +@@ -0,0 +1,386 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ICanonicalTransactionChain, ++ ICanonicalTransactionChainInterface, ++} from "../../../../contracts/L1/rollup/ICanonicalTransactionChain"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "l2GasDiscountDivisor", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "enqueueGasCost", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "enqueueL2GasPrepaid", ++ type: "uint256", ++ }, ++ ], ++ name: "L2GasParamsUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_startingQueueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_numQueueElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ name: "QueueBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_startingQueueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_numQueueElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ name: "SequencerBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_batchSize", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_extraData", ++ type: "bytes", ++ }, ++ ], ++ name: "TransactionBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1TxOrigin", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_gasLimit", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_queueIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_timestamp", ++ type: "uint256", ++ }, ++ ], ++ name: "TransactionEnqueued", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "appendSequencerBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "batches", ++ outputs: [ ++ { ++ internalType: "contract IChainStorageContainer", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_gasLimit", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "enqueue", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastBlockNumber", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastTimestamp", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getNextQueueIndex", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getNumPendingQueueElements", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "getQueueElement", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "bytes32", ++ name: "transactionHash", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint40", ++ name: "timestamp", ++ type: "uint40", ++ }, ++ { ++ internalType: "uint40", ++ name: "blockNumber", ++ type: "uint40", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.QueueElement", ++ name: "_element", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getQueueLength", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalBatches", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalBatches", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalElements", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "queue", ++ outputs: [ ++ { ++ internalType: "contract IChainStorageContainer", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_l2GasDiscountDivisor", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_enqueueGasCost", ++ type: "uint256", ++ }, ++ ], ++ name: "setGasParams", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class ICanonicalTransactionChain__factory { ++ static readonly abi = _abi; ++ static createInterface(): ICanonicalTransactionChainInterface { ++ return new utils.Interface(_abi) as ICanonicalTransactionChainInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ICanonicalTransactionChain { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as ICanonicalTransactionChain; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IChainStorageContainer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IChainStorageContainer__factory.ts +new file mode 100644 +index 0000000..e324f21 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IChainStorageContainer__factory.ts +@@ -0,0 +1,150 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IChainStorageContainer, ++ IChainStorageContainerInterface, ++} from "../../../../contracts/L1/rollup/IChainStorageContainer"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "get", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getGlobalMetadata", ++ outputs: [ ++ { ++ internalType: "bytes27", ++ name: "", ++ type: "bytes27", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "length", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_object", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "push", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_object", ++ type: "bytes32", ++ }, ++ ], ++ name: "push", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes27", ++ name: "_globalMetadata", ++ type: "bytes27", ++ }, ++ ], ++ name: "setGlobalMetadata", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IChainStorageContainer__factory { ++ static readonly abi = _abi; ++ static createInterface(): IChainStorageContainerInterface { ++ return new utils.Interface(_abi) as IChainStorageContainerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IChainStorageContainer { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IChainStorageContainer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IStateCommitmentChain__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IStateCommitmentChain__factory.ts +new file mode 100644 +index 0000000..3f4cfc5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/IStateCommitmentChain__factory.ts +@@ -0,0 +1,297 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IStateCommitmentChain, ++ IStateCommitmentChainInterface, ++} from "../../../../contracts/L1/rollup/IStateCommitmentChain"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_batchSize", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_extraData", ++ type: "bytes", ++ }, ++ ], ++ name: "StateBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ ], ++ name: "StateBatchDeleted", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32[]", ++ name: "_batch", ++ type: "bytes32[]", ++ }, ++ { ++ internalType: "uint256", ++ name: "_shouldStartAtElement", ++ type: "uint256", ++ }, ++ ], ++ name: "appendStateBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ ], ++ name: "deleteStateBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastSequencerTimestamp", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_lastSequencerTimestamp", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalBatches", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalBatches", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalElements", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ ], ++ name: "insideFraudProofWindow", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "_inside", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_element", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "verifyStateCommitment", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "_verified", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IStateCommitmentChain__factory { ++ static readonly abi = _abi; ++ static createInterface(): IStateCommitmentChainInterface { ++ return new utils.Interface(_abi) as IStateCommitmentChainInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IStateCommitmentChain { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IStateCommitmentChain; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/StateCommitmentChain__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/StateCommitmentChain__factory.ts +new file mode 100644 +index 0000000..a5cd85f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/StateCommitmentChain__factory.ts +@@ -0,0 +1,449 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ StateCommitmentChain, ++ StateCommitmentChainInterface, ++} from "../../../../contracts/L1/rollup/StateCommitmentChain"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_fraudProofWindow", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_sequencerPublishWindow", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_batchSize", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_extraData", ++ type: "bytes", ++ }, ++ ], ++ name: "StateBatchAppended", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "uint256", ++ name: "_batchIndex", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes32", ++ name: "_batchRoot", ++ type: "bytes32", ++ }, ++ ], ++ name: "StateBatchDeleted", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "FRAUD_PROOF_WINDOW", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "SEQUENCER_PUBLISH_WINDOW", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32[]", ++ name: "_batch", ++ type: "bytes32[]", ++ }, ++ { ++ internalType: "uint256", ++ name: "_shouldStartAtElement", ++ type: "uint256", ++ }, ++ ], ++ name: "appendStateBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "batches", ++ outputs: [ ++ { ++ internalType: "contract IChainStorageContainer", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ ], ++ name: "deleteStateBatch", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLastSequencerTimestamp", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_lastSequencerTimestamp", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalBatches", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalBatches", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getTotalElements", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "_totalElements", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ ], ++ name: "insideFraudProofWindow", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "_inside", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_element", ++ type: "bytes32", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "batchIndex", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32", ++ name: "batchRoot", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "batchSize", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "prevTotalElements", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "extraData", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainBatchHeader", ++ name: "_batchHeader", ++ type: "tuple", ++ }, ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "siblings", ++ type: "bytes32[]", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.ChainInclusionProof", ++ name: "_proof", ++ type: "tuple", ++ }, ++ ], ++ name: "verifyStateCommitment", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161209238038061209283398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b611fe5806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a164736f6c6343000809000a"; ++ ++type StateCommitmentChainConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: StateCommitmentChainConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class StateCommitmentChain__factory extends ContractFactory { ++ constructor(...args: StateCommitmentChainConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ _fraudProofWindow: PromiseOrValue, ++ _sequencerPublishWindow: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ _fraudProofWindow, ++ _sequencerPublishWindow, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ _fraudProofWindow: PromiseOrValue, ++ _sequencerPublishWindow: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _libAddressManager, ++ _fraudProofWindow, ++ _sequencerPublishWindow, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): StateCommitmentChain { ++ return super.attach(address) as StateCommitmentChain; ++ } ++ override connect(signer: Signer): StateCommitmentChain__factory { ++ return super.connect(signer) as StateCommitmentChain__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): StateCommitmentChainInterface { ++ return new utils.Interface(_abi) as StateCommitmentChainInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): StateCommitmentChain { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as StateCommitmentChain; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/index.ts +new file mode 100644 +index 0000000..516d717 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/rollup/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { CanonicalTransactionChain__factory } from "./CanonicalTransactionChain__factory"; ++export { ChainStorageContainer__factory } from "./ChainStorageContainer__factory"; ++export { ICanonicalTransactionChain__factory } from "./ICanonicalTransactionChain__factory"; ++export { IChainStorageContainer__factory } from "./IChainStorageContainer__factory"; ++export { IStateCommitmentChain__factory } from "./IStateCommitmentChain__factory"; ++export { StateCommitmentChain__factory } from "./StateCommitmentChain__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/BOBA__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/BOBA__factory.ts +new file mode 100644 +index 0000000..260170e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/BOBA__factory.ts +@@ -0,0 +1,731 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { BOBA, BOBAInterface } from "../../../../contracts/L1/token/BOBA"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burnFrom", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getCurrentVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPriorVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "maxSupply", ++ outputs: [ ++ { ++ internalType: "uint224", ++ name: "", ++ type: "uint224", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692137b130902a37b5b2b760b11b81525060405180604001604052806004815260200163424f424160e01b8152508160039080519060200190620000ce9291906200078b565b508051620000e49060049060208401906200078b565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200018a9050336b019d971e4fe8401e7400000062000190565b620008c5565b620001a78282620001ab60201b62000e051760201c565b5050565b620001c282826200026560201b62000ea71760201c565b6b019d971e4fe8401e74000000620001d960025490565b1115620002465760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b6200025f600862000fb96200035460201b178362000369565b50505050565b6001600160a01b038216620002bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200023d565b8060026000828254620002d191906200083d565b90915550506001600160a01b03821660009081526020819052604081208054839290620003009084906200083d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a76000838362000520565b60006200036282846200083d565b9392505050565b825460009081908015620003bb57856200038560018362000858565b8154811062000398576200039862000872565b60009182526020909120015464010000000090046001600160e01b0316620003be565b60005b6001600160e01b03169250620003d583858760201c565b91506000811180156200041957504386620003f260018462000858565b8154811062000405576200040562000872565b60009182526020909120015463ffffffff16145b156200048d5762000435826200053860201b62000fc51760201c565b866200044360018462000858565b8154811062000456576200045662000872565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000512565b856040518060400160405280620004af43620005a760201b6200105d1760201c565b63ffffffff168152602001620004d0856200053860201b62000fc51760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b6200051b8383836200060e60201b620010d91760201c565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200023d565b5090565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200023d565b620006268383836200051b60201b620008521760201c565b6001600160a01b038381166000908152600660205260408082205485841683529120546200051b92918216911683818314801590620006655750600081115b156200051b576001600160a01b03831615620006f2576001600160a01b038316600090815260076020908152604082208291620006af91906200077d901b62001118178562000369565b91509150846001600160a01b031660008051602062002e4b8339815191528383604051620006e7929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156200051b576001600160a01b03821660009081526007602090815260408220829162000736919062000354901b62000fb9178562000369565b91509150836001600160a01b031660008051602062002e4b83398151915283836040516200076e929190918252602082015260400190565b60405180910390a25050505050565b600062000362828462000858565b828054620007999062000888565b90600052602060002090601f016020900481019282620007bd576000855562000808565b82601f10620007d857805160ff191683800117855562000808565b8280016001018555821562000808579182015b8281111562000808578251825591602001919060010190620007eb565b50620005a39291505b80821115620005a3576000815560010162000811565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000853576200085362000827565b500190565b6000828210156200086d576200086d62000827565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200089d57607f821691505b60208210811415620008bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612536620009156000396000610c2801526000611564015260006115b30152600061158e015260006115120152600061153b01526125366000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063782d6fe1116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610415578063d5abeb0114610428578063dd62ed3e14610468578063f1127ed8146104ae57600080fd5b8063a9059cbb146103dc578063b4b5ea57146103ef578063c3cda5201461040257600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806395d89b41146103ae5780639ab24eb0146103b6578063a457c2d7146103c957600080fd5b8063782d6fe11461034557806379cc6790146103755780637ecebe001461038857600080fd5b80633950935111610166578063587cde1e11610140578063587cde1e146102765780635c19a95c146102d45780636fcfff45146102e757806370a082311461030f57600080fd5b8063395093511461023b5780633a46b1a81461024e57806342966c681461026157600080fd5b806323b872dd1161019757806323b872dd14610211578063313ce567146102245780633644e5151461023357600080fd5b806306fdde03146101be578063095ea7b3146101dc57806318160ddd146101ff575b600080fd5b6101c6610500565b6040516101d39190612168565b60405180910390f35b6101ef6101ea366004612204565b610592565b60405190151581526020016101d3565b6002545b6040519081526020016101d3565b6101ef61021f36600461222e565b6105a8565b604051601281526020016101d3565b610203610679565b6101ef610249366004612204565b610688565b61020361025c366004612204565b6106d1565b61027461026f36600461226a565b610758565b005b6102af610284366004612283565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600660205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b6102746102e2366004612283565b610765565b6102fa6102f5366004612283565b61076f565b60405163ffffffff90911681526020016101d3565b61020361031d366004612283565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610358610353366004612204565b6107a4565b6040516bffffffffffffffffffffffff90911681526020016101d3565b610274610383366004612204565b6107b8565b610203610396366004612283565b610857565b6102036103a936600461226a565b610882565b6101c66108de565b6102036103c4366004612283565b6108ed565b6101ef6103d7366004612204565b6109b8565b6101ef6103ea366004612204565b610a76565b6103586103fd366004612283565b610a83565b6102746104103660046122af565b610a91565b610274610423366004612307565b610bd4565b61043b6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b610203610476366004612371565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6104c16104bc3660046123a4565b610d5f565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101d3565b60606003805461050f906123e4565b80601f016020809104026020016040519081016040528092919081815260200182805461053b906123e4565b80156105885780601f1061055d57610100808354040283529160200191610588565b820191906000526020600020905b81548152906001019060200180831161056b57829003601f168201915b5050505050905090565b600061059f338484611124565b50600192915050565b60006105b58484846112a3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156106615760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61066e8533858403611124565b506001949350505050565b600061068361150e565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161059f9185906106cc908690612461565b611124565b60004382106107225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090206107519083611601565b9392505050565b61076233826116e8565b50565b61076233826116f2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461079e9061105d565b92915050565b60006107516107b384846106d1565b611790565b60006107c48333610476565b90508181101561083b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610658565b6108488333848403611124565b61085283836116e8565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461079e565b60004382106108d35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610658565b61079e600883611601565b60606004805461050f906123e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205480156109905773ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020610949600183612479565b8154811061095957610959612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610993565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610a5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610658565b610a6c3385858403611124565b5060019392505050565b600061059f3384846112a3565b600061079e6107b3836108ed565b83421115610ae15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610658565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610b6890610b609060a00160405160208183030381529060405280519060200120611814565b85858561187d565b9050610b73816118a5565b8614610bc15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610658565b610bcb81886116f2565b50505050505050565b83421115610c245760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610658565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c538c6118a5565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610cbb82611814565b90506000610ccb8287878761187d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d485760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610658565b610d538a8a8a611124565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020805463ffffffff8416908110610db057610db0612490565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610e0f8282610ea7565b6002546b019d971e4fe8401e740000001015610e935760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610658565b610ea16008610fb9836118da565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610658565b8060026000828254610f1c9190612461565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f56908490612461565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610fb560008383611abc565b5050565b60006107518284612461565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610658565b5090565b600063ffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526006602052604080822054858416835291205461085292918216911683611ac7565b60006107518284612479565b73ffffffffffffffffffffffffffffffffffffffff83166111ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166112355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661132c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166113b55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156114515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290611495908490612461565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fb91815260200190565b60405180910390a3610ea1848484611abc565b60007f000000000000000000000000000000000000000000000000000000000000000046141561155d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561166557600061161c8284611c6c565b90508486828154811061163157611631612490565b60009182526020909120015463ffffffff1611156116515780925061165f565b61165c816001612461565b91505b50611608565b81156116be5784611677600184612479565b8154811061168757611687612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b610fb58282611c87565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ea1828483611ac7565b60006bffffffffffffffffffffffff8211156110595760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610658565b600061079e61182161150e565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061188e87878787611c9f565b9150915061189b81611db7565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561193a57856118f3600183612479565b8154811061190357611903612490565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661193d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061196b83858763ffffffff16565b91506000811180156119a957504386611985600184612479565b8154811061199557611995612490565b60009182526020909120015463ffffffff16145b15611a33576119b782610fc5565b866119c3600184612479565b815481106119d3576119d3612490565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611ab3565b856040518060400160405280611a484361105d565b63ffffffff168152602001611a5c85610fc5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6108528383836110d9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b035750600081115b156108525773ffffffffffffffffffffffffffffffffffffffff831615611bb85773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081208190611b5890611118856118da565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611bad929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156108525773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081208190611c0890610fb9856118da565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c5d929190918252602082015260400190565b60405180910390a25050505050565b6000611c7b60028484186124bf565b61075190848416612461565b611c918282611fa8565b610ea16008611118836118da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611cd65750600090506003611dae565b8460ff16601b14158015611cee57508460ff16601c14155b15611cff5750600090506004611dae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d53573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611da757600060019250925050611dae565b9150600090505b94509492505050565b6000816004811115611dcb57611dcb6124fa565b1415611dd45750565b6001816004811115611de857611de86124fa565b1415611e365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610658565b6002816004811115611e4a57611e4a6124fa565b1415611e985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610658565b6003816004811115611eac57611eac6124fa565b1415611f205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b6004816004811115611f3457611f346124fa565b14156107625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff82166120315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156120cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610658565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290612109908490612479565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361085283600084611abc565b600060208083528351808285015260005b8181101561219557858101830151858201604001528201612179565b818111156121a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146121ff57600080fd5b919050565b6000806040838503121561221757600080fd5b612220836121db565b946020939093013593505050565b60008060006060848603121561224357600080fd5b61224c846121db565b925061225a602085016121db565b9150604084013590509250925092565b60006020828403121561227c57600080fd5b5035919050565b60006020828403121561229557600080fd5b610751826121db565b803560ff811681146121ff57600080fd5b60008060008060008060c087890312156122c857600080fd5b6122d1876121db565b955060208701359450604087013593506122ed6060880161229e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232257600080fd5b61232b886121db565b9650612339602089016121db565b955060408801359450606088013593506123556080890161229e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238457600080fd5b61238d836121db565b915061239b602084016121db565b90509250929050565b600080604083850312156123b757600080fd5b6123c0836121db565b9150602083013563ffffffff811681146123d957600080fd5b809150509250929050565b600181811c908216806123f857607f821691505b602082108114156118d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247457612474612432565b500190565b60008282101561248b5761248b612432565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000adec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724"; ++ ++type BOBAConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: BOBAConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class BOBA__factory extends ContractFactory { ++ constructor(...args: BOBAConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): BOBA { ++ return super.attach(address) as BOBA; ++ } ++ override connect(signer: Signer): BOBA__factory { ++ return super.connect(signer) as BOBA__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): BOBAInterface { ++ return new utils.Interface(_abi) as BOBAInterface; ++ } ++ static connect(address: string, signerOrProvider: Signer | Provider): BOBA { ++ return new Contract(address, _abi, signerOrProvider) as BOBA; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/index.ts +new file mode 100644 +index 0000000..5beaffb +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/token/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { BOBA__factory } from "./BOBA__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/BondManager__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/BondManager__factory.ts +new file mode 100644 +index 0000000..7111420 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/BondManager__factory.ts +@@ -0,0 +1,130 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ BondManager, ++ BondManagerInterface, ++} from "../../../../contracts/L1/verification/BondManager"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_who", ++ type: "address", ++ }, ++ ], ++ name: "isCollateralized", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161045f38038061045f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6103cc806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806302ad4d2a14610046578063299ca4781461006e578063461a4478146100b3575b600080fd5b61005961005436600461020d565b6100c6565b60405190151581526020015b60405180910390f35b60005461008e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b61008e6100c1366004610260565b61013b565b60006101066040518060400160405280600c81526020017f4f564d5f50726f706f736572000000000000000000000000000000000000000081525061013b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061019290859060040161032f565b60206040518083038186803b1580156101aa57600080fd5b505afa1580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e291906103a2565b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461020a57600080fd5b50565b60006020828403121561021f57600080fd5b813561022a816101e8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561027257600080fd5b813567ffffffffffffffff8082111561028a57600080fd5b818401915084601f83011261029e57600080fd5b8135818111156102b0576102b0610231565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102f6576102f6610231565b8160405282815287602084870101111561030f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561035c57858101830151858201604001528201610340565b8181111561036e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156103b457600080fd5b815161022a816101e856fea164736f6c6343000809000a"; ++ ++type BondManagerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: BondManagerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class BondManager__factory extends ContractFactory { ++ constructor(...args: BondManagerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_libAddressManager, overrides || {}); ++ } ++ override attach(address: string): BondManager { ++ return super.attach(address) as BondManager; ++ } ++ override connect(signer: Signer): BondManager__factory { ++ return super.connect(signer) as BondManager__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): BondManagerInterface { ++ return new utils.Interface(_abi) as BondManagerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): BondManager { ++ return new Contract(address, _abi, signerOrProvider) as BondManager; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/IBondManager__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/IBondManager__factory.ts +new file mode 100644 +index 0000000..8b3bc52 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/IBondManager__factory.ts +@@ -0,0 +1,45 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IBondManager, ++ IBondManagerInterface, ++} from "../../../../contracts/L1/verification/IBondManager"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_who", ++ type: "address", ++ }, ++ ], ++ name: "isCollateralized", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IBondManager__factory { ++ static readonly abi = _abi; ++ static createInterface(): IBondManagerInterface { ++ return new utils.Interface(_abi) as IBondManagerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IBondManager { ++ return new Contract(address, _abi, signerOrProvider) as IBondManager; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/index.ts +new file mode 100644 +index 0000000..278ee8b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L1/verification/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { BondManager__factory } from "./BondManager__factory"; ++export { IBondManager__factory } from "./IBondManager__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/index.ts +new file mode 100644 +index 0000000..aaac211 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as messaging from "./messaging"; ++export * as predeploys from "./predeploys"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2CrossDomainMessenger__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2CrossDomainMessenger__factory.ts +new file mode 100644 +index 0000000..0acdc7f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2CrossDomainMessenger__factory.ts +@@ -0,0 +1,157 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL2CrossDomainMessenger, ++ IL2CrossDomainMessengerInterface, ++} from "../../../../contracts/L2/messaging/IL2CrossDomainMessenger"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IL2CrossDomainMessenger__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL2CrossDomainMessengerInterface { ++ return new utils.Interface(_abi) as IL2CrossDomainMessengerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL2CrossDomainMessenger { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IL2CrossDomainMessenger; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2ERC20Bridge__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2ERC20Bridge__factory.ts +new file mode 100644 +index 0000000..657b322 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/IL2ERC20Bridge__factory.ts +@@ -0,0 +1,267 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL2ERC20Bridge, ++ IL2ERC20BridgeInterface, ++} from "../../../../contracts/L2/messaging/IL2ERC20Bridge"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFailed", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "WithdrawalInitiated", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeDeposit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdraw", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdrawTo", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL2ERC20Bridge__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL2ERC20BridgeInterface { ++ return new utils.Interface(_abi) as IL2ERC20BridgeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL2ERC20Bridge { ++ return new Contract(address, _abi, signerOrProvider) as IL2ERC20Bridge; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2CrossDomainMessenger__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2CrossDomainMessenger__factory.ts +new file mode 100644 +index 0000000..dd3d948 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2CrossDomainMessenger__factory.ts +@@ -0,0 +1,293 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2CrossDomainMessenger, ++ L2CrossDomainMessengerInterface, ++} from "../../../../contracts/L2/messaging/L2CrossDomainMessenger"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1CrossDomainMessenger", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "l1CrossDomainMessenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "messageNonce", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ ], ++ name: "relayMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "relayedMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "sentMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "successfulMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x6080604052600480546001600160a01b03191661dead17905534801561002457600080fd5b50604051610c9a380380610c9a83398101604081905261004391610068565b600580546001600160a01b0319166001600160a01b0392909216919091179055610098565b60006020828403121561007a57600080fd5b81516001600160a01b038116811461009157600080fd5b9392505050565b610bf3806100a76000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea164736f6c6343000809000a"; ++ ++type L2CrossDomainMessengerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2CrossDomainMessengerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2CrossDomainMessenger__factory extends ContractFactory { ++ constructor(...args: L2CrossDomainMessengerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l1CrossDomainMessenger: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l1CrossDomainMessenger, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l1CrossDomainMessenger: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_l1CrossDomainMessenger, overrides || {}); ++ } ++ override attach(address: string): L2CrossDomainMessenger { ++ return super.attach(address) as L2CrossDomainMessenger; ++ } ++ override connect(signer: Signer): L2CrossDomainMessenger__factory { ++ return super.connect(signer) as L2CrossDomainMessenger__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2CrossDomainMessengerInterface { ++ return new utils.Interface(_abi) as L2CrossDomainMessengerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2CrossDomainMessenger { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L2CrossDomainMessenger; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridgeAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridgeAltL1__factory.ts +new file mode 100644 +index 0000000..22f750b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridgeAltL1__factory.ts +@@ -0,0 +1,349 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2StandardBridgeAltL1, ++ L2StandardBridgeAltL1Interface, ++} from "../../../../contracts/L2/messaging/L2StandardBridgeAltL1"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2CrossDomainMessenger", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l1TokenBridge", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFailed", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "WithdrawalInitiated", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeDeposit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "messenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdraw", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdrawTo", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161119b38038061119b83398101604081905261002f9161007c565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556100af565b80516001600160a01b038116811461007757600080fd5b919050565b6000806040838503121561008f57600080fd5b61009883610060565b91506100a660208401610060565b90509250929050565b6110dd806100be6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000002314156108d5576040517f0f6a78690000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a"; ++ ++type L2StandardBridgeAltL1ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2StandardBridgeAltL1ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2StandardBridgeAltL1__factory extends ContractFactory { ++ constructor(...args: L2StandardBridgeAltL1ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l2CrossDomainMessenger: PromiseOrValue, ++ _l1TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l2CrossDomainMessenger, ++ _l1TokenBridge, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l2CrossDomainMessenger: PromiseOrValue, ++ _l1TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _l2CrossDomainMessenger, ++ _l1TokenBridge, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): L2StandardBridgeAltL1 { ++ return super.attach(address) as L2StandardBridgeAltL1; ++ } ++ override connect(signer: Signer): L2StandardBridgeAltL1__factory { ++ return super.connect(signer) as L2StandardBridgeAltL1__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2StandardBridgeAltL1Interface { ++ return new utils.Interface(_abi) as L2StandardBridgeAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2StandardBridgeAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L2StandardBridgeAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridge__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridge__factory.ts +new file mode 100644 +index 0000000..c8cdec0 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardBridge__factory.ts +@@ -0,0 +1,345 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2StandardBridge, ++ L2StandardBridgeInterface, ++} from "../../../../contracts/L2/messaging/L2StandardBridge"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2CrossDomainMessenger", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l1TokenBridge", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFailed", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "DepositFinalized", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "WithdrawalInitiated", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "finalizeDeposit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1TokenBridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "messenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdraw", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint32", ++ name: "_l1Gas", ++ type: "uint32", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "withdrawTo", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161119b38038061119b83398101604081905261002f9161007c565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556100af565b80516001600160a01b038116811461007757600080fd5b919050565b6000806040838503121561008f57600080fd5b61009883610060565b91506100a660208401610060565b90509250929050565b6110dd806100be6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673420000000000000000000000000000000000000614156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea164736f6c6343000809000a"; ++ ++type L2StandardBridgeConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2StandardBridgeConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2StandardBridge__factory extends ContractFactory { ++ constructor(...args: L2StandardBridgeConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l2CrossDomainMessenger: PromiseOrValue, ++ _l1TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l2CrossDomainMessenger, ++ _l1TokenBridge, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l2CrossDomainMessenger: PromiseOrValue, ++ _l1TokenBridge: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _l2CrossDomainMessenger, ++ _l1TokenBridge, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): L2StandardBridge { ++ return super.attach(address) as L2StandardBridge; ++ } ++ override connect(signer: Signer): L2StandardBridge__factory { ++ return super.connect(signer) as L2StandardBridge__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2StandardBridgeInterface { ++ return new utils.Interface(_abi) as L2StandardBridgeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2StandardBridge { ++ return new Contract(address, _abi, signerOrProvider) as L2StandardBridge; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardTokenFactory__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardTokenFactory__factory.ts +new file mode 100644 +index 0000000..d2b9997 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/L2StandardTokenFactory__factory.ts +@@ -0,0 +1,114 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2StandardTokenFactory, ++ L2StandardTokenFactoryInterface, ++} from "../../../../contracts/L2/messaging/L2StandardTokenFactory"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_l2Token", ++ type: "address", ++ }, ++ ], ++ name: "StandardL2TokenCreated", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ internalType: "string", ++ name: "_symbol", ++ type: "string", ++ }, ++ { ++ internalType: "uint8", ++ name: "_decimals", ++ type: "uint8", ++ }, ++ ], ++ name: "createStandardL2Token", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506117e0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630769a96914610030575b600080fd5b61004361003e366004610262565b610045565b005b73ffffffffffffffffffffffffffffffffffffffff84166100c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742070726f76696465204c3120746f6b656e2061646472657373000000604482015260640160405180910390fd5b6000734200000000000000000000000000000000000010858585856040516100ed9061017b565b6100fb959493929190610375565b604051809103906000f080158015610117573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a35050505050565b6113fd806103d783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126101c857600080fd5b813567ffffffffffffffff808211156101e3576101e3610188565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561022957610229610188565b8160405283815286602085880101111561024257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561027857600080fd5b843573ffffffffffffffffffffffffffffffffffffffff8116811461029c57600080fd5b9350602085013567ffffffffffffffff808211156102b957600080fd5b6102c5888389016101b7565b945060408701359150808211156102db57600080fd5b506102e8878288016101b7565b925050606085013560ff811681146102ff57600080fd5b939692955090935050565b6000815180845260005b8181101561033057602081850181015186830182015201610314565b81811115610342576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526103ae60a083018661030a565b82810360608401526103c0818661030a565b91505060ff83166080830152969550505050505056fe60a06040523480156200001157600080fd5b50604051620013fd380380620013fd833981016040819052620000349162000234565b8251839083906200004d906003906020850190620000a4565b50805162000063906004906020840190620000a4565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff16608052506200031d565b828054620000b290620002e0565b90600052602060002090601f016020900481019282620000d6576000855562000121565b82601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b5b808211156200012f576000815560010162000134565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018f57600080fd5b81516001600160401b0380821115620001ac57620001ac62000167565b604051601f8301601f19908116603f01168101908282118183101715620001d757620001d762000167565b81604052838152602092508683858801011115620001f457600080fd5b600091505b83821015620002185785820183015181830184015290820190620001f9565b838211156200022a5760008385830101525b9695505050505050565b600080600080600060a086880312156200024d57600080fd5b62000258866200014a565b945062000268602087016200014a565b60408701519094506001600160401b03808211156200028657600080fd5b6200029489838a016200017d565b94506060880151915080821115620002ab57600080fd5b50620002ba888289016200017d565b925050608086015160ff81168114620002d257600080fd5b809150509295509295909350565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516110c462000339600039600061018101526110c46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000aa164736f6c6343000809000a"; ++ ++type L2StandardTokenFactoryConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2StandardTokenFactoryConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2StandardTokenFactory__factory extends ContractFactory { ++ constructor(...args: L2StandardTokenFactoryConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): L2StandardTokenFactory { ++ return super.attach(address) as L2StandardTokenFactory; ++ } ++ override connect(signer: Signer): L2StandardTokenFactory__factory { ++ return super.connect(signer) as L2StandardTokenFactory__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2StandardTokenFactoryInterface { ++ return new utils.Interface(_abi) as L2StandardTokenFactoryInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2StandardTokenFactory { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as L2StandardTokenFactory; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/index.ts +new file mode 100644 +index 0000000..ddd18b4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/messaging/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IL2CrossDomainMessenger__factory } from "./IL2CrossDomainMessenger__factory"; ++export { IL2ERC20Bridge__factory } from "./IL2ERC20Bridge__factory"; ++export { L2CrossDomainMessenger__factory } from "./L2CrossDomainMessenger__factory"; ++export { L2StandardBridge__factory } from "./L2StandardBridge__factory"; ++export { L2StandardBridgeAltL1__factory } from "./L2StandardBridgeAltL1__factory"; ++export { L2StandardTokenFactory__factory } from "./L2StandardTokenFactory__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCreditAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCreditAltL1__factory.ts +new file mode 100644 +index 0000000..8991dcc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCreditAltL1__factory.ts +@@ -0,0 +1,313 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ BobaTuringCreditAltL1, ++ BobaTuringCreditAltL1Interface, ++} from "../../../../contracts/L2/predeploys/BobaTuringCreditAltL1"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_turingPrice", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "balanceAmount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "AddBalanceTo", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "oldOwner", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "TransferOwnership", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "withdrawAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "WithdrawRevenue", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_addBalanceAmount", ++ type: "uint256", ++ }, ++ { ++ internalType: "address", ++ name: "_helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "addBalanceTo", ++ outputs: [], ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "getCreditAmount", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "ownerRevenue", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "prepaidBalance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "turingPrice", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "turingToken", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_turingPrice", ++ type: "uint256", ++ }, ++ ], ++ name: "updateTuringPrice", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_turingToken", ++ type: "address", ++ }, ++ ], ++ name: "updateTuringToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_withdrawAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "withdrawRevenue", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50604051610e39380380610e3983398101604081905261002f91610037565b600355610050565b60006020828403121561004957600080fd5b5051919050565b610dda8061005f6000396000f3fe6080604052600436106100bb5760003560e01c80638da5cb5b11610074578063f2fde38b1161004e578063f2fde38b1461020d578063f7cd3be81461022d578063fd8922781461024d57600080fd5b80638da5cb5b146101aa578063a52b962d146101d7578063e24dfcde146101f757600080fd5b80630ceff204116100a55780630ceff2041461011657806335d6eac414610138578063853383921461015857600080fd5b8062292526146100c057806309da3981146100e9575b600080fd5b3480156100cc57600080fd5b506100d660045481565b6040519081526020015b60405180910390f35b3480156100f557600080fd5b506100d6610104366004610c77565b60016020526000908152604090205481565b34801561012257600080fd5b50610136610131366004610c92565b610260565b005b34801561014457600080fd5b50610136610153366004610c77565b6104cf565b34801561016457600080fd5b506002546101859073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b3480156101b657600080fd5b506000546101859073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101e357600080fd5b506100d66101f2366004610c77565b610604565b34801561020357600080fd5b506100d660035481565b34801561021957600080fd5b50610136610228366004610c77565b610691565b34801561023957600080fd5b50610136610248366004610c92565b6107b9565b61013661025b366004610cab565b610846565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061029c575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102ed5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103785760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b6004548111156103ca5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e7400000000000000000000000000000000000060448201526064016102e4565b80600460008282546103dc9190610d06565b90915550506000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d806000811461043b576040519150601f19603f3d011682016040523d82523d6000602084013e610440565b606091505b50509050806104915760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016102e4565b60408051338152602081018490527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e30191015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061050b575060005473ffffffffffffffffffffffffffffffffffffffff16155b6105575760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b60025473ffffffffffffffffffffffffffffffffffffffff16156105bd5760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016102e4565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000600354600014156106595760405162461bcd60e51b815260206004820152601060248201527f556e6c696d69746564206372656469740000000000000000000000000000000060448201526064016102e4565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461068b91610a7f565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106cd575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107195760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811661073957600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806107f5575060005473ffffffffffffffffffffffffffffffffffffffff16155b6108415760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016102e4565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166108d15760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084016102e4565b81158015906108df57508134145b61092b5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e7400000000000000000000000000000000000060448201526064016102e4565b803b6109795760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f4100000000000000000000000000000000000060448201526064016102e4565b6109a3817f2f7adf4300000000000000000000000000000000000000000000000000000000610a92565b6109ef5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e747261637400000000000000000060448201526064016102e4565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081208054849290610a24908490610d1d565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff8316918101919091527f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a906060016104c3565b6000610a8b8284610d35565b9392505050565b6000610a9d83610aae565b8015610a8b5750610a8b8383610b12565b6000610ada827f01ffc9a700000000000000000000000000000000000000000000000000000000610b12565b801561068b5750610b0b827fffffffff00000000000000000000000000000000000000000000000000000000610b12565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610bcc908690610d70565b6000604051808303818686fa925050503d8060008114610c08576040519150601f19603f3d011682016040523d82523d6000602084013e610c0d565b606091505b5091509150602081511015610c28576000935050505061068b565b818015610c44575080806020019051810190610c449190610dab565b9695505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c7257600080fd5b919050565b600060208284031215610c8957600080fd5b610a8b82610c4e565b600060208284031215610ca457600080fd5b5035919050565b60008060408385031215610cbe57600080fd5b82359150610cce60208401610c4e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610d1857610d18610cd7565b500390565b60008219821115610d3057610d30610cd7565b500190565b600082610d6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000825160005b81811015610d915760208186018101518583015201610d77565b81811115610da0576000828501525b509190910192915050565b600060208284031215610dbd57600080fd5b81518015158114610a8b57600080fdfea164736f6c6343000809000a"; ++ ++type BobaTuringCreditAltL1ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: BobaTuringCreditAltL1ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class BobaTuringCreditAltL1__factory extends ContractFactory { ++ constructor(...args: BobaTuringCreditAltL1ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _turingPrice, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_turingPrice, overrides || {}); ++ } ++ override attach(address: string): BobaTuringCreditAltL1 { ++ return super.attach(address) as BobaTuringCreditAltL1; ++ } ++ override connect(signer: Signer): BobaTuringCreditAltL1__factory { ++ return super.connect(signer) as BobaTuringCreditAltL1__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): BobaTuringCreditAltL1Interface { ++ return new utils.Interface(_abi) as BobaTuringCreditAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): BobaTuringCreditAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as BobaTuringCreditAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCredit__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCredit__factory.ts +new file mode 100644 +index 0000000..d70a147 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/BobaTuringCredit__factory.ts +@@ -0,0 +1,309 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ BobaTuringCredit, ++ BobaTuringCreditInterface, ++} from "../../../../contracts/L2/predeploys/BobaTuringCredit"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_turingPrice", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "balanceAmount", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "AddBalanceTo", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "oldOwner", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "TransferOwnership", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "withdrawAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "WithdrawRevenue", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_addBalanceAmount", ++ type: "uint256", ++ }, ++ { ++ internalType: "address", ++ name: "_helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "addBalanceTo", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_helperContractAddress", ++ type: "address", ++ }, ++ ], ++ name: "getCreditAmount", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "ownerRevenue", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "prepaidBalance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "turingPrice", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "turingToken", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_turingPrice", ++ type: "uint256", ++ }, ++ ], ++ name: "updateTuringPrice", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_turingToken", ++ type: "address", ++ }, ++ ], ++ name: "updateTuringToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_withdrawAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "withdrawRevenue", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161118038038061118083398101604081905261002f91610037565b600355610050565b60006020828403121561004957600080fd5b5051919050565b6111218061005f6000396000f3fe608060405234801561001057600080fd5b50600436106100c85760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b2578063f7cd3be8146101c5578063fd892278146101d857600080fd5b80638da5cb5b14610176578063a52b962d14610196578063e24dfcde146101a957600080fd5b80630ceff204116100b25780630ceff2041461010957806335d6eac41461011e578063853383921461013157600080fd5b8062292526146100cd57806309da3981146100e9575b600080fd5b6100d660045481565b6040519081526020015b60405180910390f35b6100d66100f7366004610f60565b60016020526000908152604090205481565b61011c610117366004610f7b565b6101eb565b005b61011c61012c366004610f60565b6103d2565b6002546101519073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6000546101519073ffffffffffffffffffffffffffffffffffffffff1681565b6100d66101a4366004610f60565b610507565b6100d660035481565b61011c6101c0366004610f60565b610594565b61011c6101d3366004610f7b565b6106bc565b61011c6101e6366004610f94565b610749565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610227575060005473ffffffffffffffffffffffffffffffffffffffff16155b6102785760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166103035760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b6004548111156103555760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e74000000000000000000000000000000000000604482015260640161026f565b80600460008282546103679190610fef565b909155505060408051338152602081018390527f447d53be88e315476bdbe2e63cef309461f6305d09aada67641c29e6b897e301910160405180910390a16000546002546103cf9173ffffffffffffffffffffffffffffffffffffffff91821691168361099d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061040e575060005473ffffffffffffffffffffffffffffffffffffffff16155b61045a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b60025473ffffffffffffffffffffffffffffffffffffffff16156104c05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a6564000000604482015260640161026f565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006003546000141561055c5760405162461bcd60e51b815260206004820152601060248201527f556e6c696d697465642063726564697400000000000000000000000000000000604482015260640161026f565b60035473ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461058e91610a76565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105d0575060005473ffffffffffffffffffffffffffffffffffffffff16155b61061c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff811661063c57600080fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040805133815260208101929092527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106f8575060005473ffffffffffffffffffffffffffffffffffffffff16155b6107445760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161026f565b600355565b60025473ffffffffffffffffffffffffffffffffffffffff166107d45760405162461bcd60e51b815260206004820152602560248201527f436f6e747261637420686173206e6f7420796574206265656e20696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840161026f565b816108215760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161026f565b803b61086f5760405162461bcd60e51b815260206004820152600e60248201527f4164647265737320697320454f41000000000000000000000000000000000000604482015260640161026f565b610899817f2f7adf4300000000000000000000000000000000000000000000000000000000610a89565b6108e55760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642048656c70657220436f6e7472616374000000000000000000604482015260640161026f565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260408120805484929061091a908490611006565b9091555050604080513381526020810184905273ffffffffffffffffffffffffffffffffffffffff83168183015290517f63611f4b2e0fff4acd8e17bd95ebb62a3bc834c76cf85e7a972a502990b6257a9181900360600190a16002546109999073ffffffffffffffffffffffffffffffffffffffff16333085610aa5565b5050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a719084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610b09565b505050565b6000610a82828461101e565b9392505050565b6000610a9483610bfb565b8015610a825750610a828383610c5f565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610b039085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016109ef565b50505050565b6000610b6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d9b9092919063ffffffff16565b805190915015610a715780806020019051810190610b899190611059565b610a715760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161026f565b6000610c27827f01ffc9a700000000000000000000000000000000000000000000000000000000610c5f565b801561058e5750610c58827fffffffff00000000000000000000000000000000000000000000000000000000610c5f565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610d199086906110a7565b6000604051808303818686fa925050503d8060008114610d55576040519150601f19603f3d011682016040523d82523d6000602084013e610d5a565b606091505b5091509150602081511015610d75576000935050505061058e565b818015610d91575080806020019051810190610d919190611059565b9695505050505050565b6060610daa8484600085610db2565b949350505050565b606082471015610e2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161026f565b843b610e785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610ea191906110a7565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5091509150610ef3828286610efe565b979650505050505050565b60608315610f0d575081610a82565b825115610f1d5782518084602001fd5b8160405162461bcd60e51b815260040161026f91906110c3565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f5b57600080fd5b919050565b600060208284031215610f7257600080fd5b610a8282610f37565b600060208284031215610f8d57600080fd5b5035919050565b60008060408385031215610fa757600080fd5b82359150610fb760208401610f37565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561100157611001610fc0565b500390565b6000821982111561101957611019610fc0565b500190565b600082611054577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561106b57600080fd5b81518015158114610a8257600080fd5b60005b8381101561109657818101518382015260200161107e565b83811115610b035750506000910152565b600082516110b981846020870161107b565b9190910192915050565b60208152600082518060208401526110e281604085016020870161107b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000809000a"; ++ ++type BobaTuringCreditConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: BobaTuringCreditConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class BobaTuringCredit__factory extends ContractFactory { ++ constructor(...args: BobaTuringCreditConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _turingPrice, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _turingPrice: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_turingPrice, overrides || {}); ++ } ++ override attach(address: string): BobaTuringCredit { ++ return super.attach(address) as BobaTuringCredit; ++ } ++ override connect(signer: Signer): BobaTuringCredit__factory { ++ return super.connect(signer) as BobaTuringCredit__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): BobaTuringCreditInterface { ++ return new utils.Interface(_abi) as BobaTuringCreditInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): BobaTuringCredit { ++ return new Contract(address, _abi, signerOrProvider) as BobaTuringCredit; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracleAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracleAltL1__factory.ts +new file mode 100644 +index 0000000..f093999 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracleAltL1__factory.ts +@@ -0,0 +1,756 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ Boba_GasPriceOracleAltL1, ++ Boba_GasPriceOracleAltL1Interface, ++} from "../../../../contracts/L2/predeploys/Boba_GasPriceOracleAltL1"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "SwapSecondaryFeeTokenForBOBAMetaTransaction", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "TransferOwnership", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateDecimals", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UpdateGasPriceOracleAddress", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMaxPriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMetaTransactionFee", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMinPriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdatePriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateReceivedBOBAAmount", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateSecondaryFeeTokenMinimum", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UseBOBAAsFeeToken", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UseSecondaryFeeTokenAsFeeToken", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "WithdrawBOBA", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "WithdrawSecondaryFeeToken", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "MIN_WITHDRAWAL_AMOUNT", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "feeWallet", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "gasPriceOracleAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_txData", ++ type: "bytes", ++ }, ++ ], ++ name: "getSecondaryFeeTokenFee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getSecondaryFeeTokenForSwap", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address payable", ++ name: "_feeWallet", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_secondaryFeeToken", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "marketPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "maxPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "metaTransactionFee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "minPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "priceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "receivedBOBAAmount", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "secondaryFeeTokenAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "secondaryFeeTokenMinimum", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "secondaryFeeTokenUsers", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "tokenOwner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "swapSecondaryFeeTokenForBOBAMetaTransaction", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_decimals", ++ type: "uint256", ++ }, ++ ], ++ name: "updateDecimals", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_gasPriceOracleAddress", ++ type: "address", ++ }, ++ ], ++ name: "updateGasPriceOracleAddress", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_maxPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMaxPriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_metaTransactionFee", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMetaTransactionFee", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_minPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMinPriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_priceRatio", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_marketPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updatePriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_receivedBOBAAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "updateReceivedBOBAAmount", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_secondaryFeeTokenMinimum", ++ type: "uint256", ++ }, ++ ], ++ name: "updateSecondaryFeeTokenMinimum", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "useBobaAsFeeToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "useSecondaryFeeTokenAsFeeToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdrawBOBA", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdrawSecondaryFeeToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x6080604052600280546001600160a01b0319908116734200000000000000000000000000000000000023179091556113886003556101f46004556006805490911673420000000000000000000000000000000000000f17905566038d7ea4c68000600855671bc16d674ec800006009556000600b5566071afd498d0000600c5534801561008b57600080fd5b506121ab8061009b6000396000f3fe6080604052600436106101db5760003560e01c8063872ea49911610102578063ce2e836211610095578063e27cde4b11610064578063e27cde4b14610512578063e3aea9ba14610527578063f25f4b5614610547578063f2fde38b1461056757600080fd5b8063ce2e8362146104aa578063d2e1fb22146104ca578063d3e5792b146104e0578063d86732ef146104fc57600080fd5b8063b9fee16d116100d1578063b9fee16d1461043e578063bc9bd6ee14610454578063c823cb4014610474578063c8a054131461048a57600080fd5b8063872ea499146103d557806389df963d146103eb5780638da5cb5b146104005780638fcfc8131461041e57600080fd5b806315a0c1ac1161017a57806341f7a5e31161014957806341f7a5e314610360578063485cc9551461037557806366675c57146103955780637728195c146103b557600080fd5b806315a0c1ac146102ff578063313ce5671461031557806334fe1b161461032b5780633cb8dd881461034057600080fd5b806306f95c19116101b657806306f95c191461023e5780630aa2f420146102715780630f0ad02e1461028757806312ac9250146102bf57600080fd5b80625c5fb2146101e7578063026da5de1461020957806303bb2b2d1461022957600080fd5b366101e257005b600080fd5b3480156101f357600080fd5b50610207610202366004611c77565b610587565b005b34801561021557600080fd5b50610207610224366004611c77565b61065e565b34801561023557600080fd5b50610207610716565b34801561024a57600080fd5b5061025e610259366004611cbf565b6108df565b6040519081526020015b60405180910390f35b34801561027d57600080fd5b5061025e60055481565b34801561029357600080fd5b506002546102a7906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b3480156102cb57600080fd5b506102ef6102da366004611da6565b60076020526000908152604090205460ff1681565b6040519015158152602001610268565b34801561030b57600080fd5b5061025e600a5481565b34801561032157600080fd5b5061025e600b5481565b34801561033757600080fd5b506102076109b1565b34801561034c57600080fd5b5061020761035b366004611dc3565b610abf565b34801561036c57600080fd5b5061025e610d9c565b34801561038157600080fd5b50610207610390366004611e3a565b610dd7565b3480156103a157600080fd5b506102076103b0366004611c77565b610efe565b3480156103c157600080fd5b506006546102a7906001600160a01b031681565b3480156103e157600080fd5b5061025e60085481565b3480156103f757600080fd5b50610207610f9d565b34801561040c57600080fd5b506000546001600160a01b03166102a7565b34801561042a57600080fd5b50610207610439366004611da6565b611116565b34801561044a57600080fd5b5061025e60095481565b34801561046057600080fd5b5061020761046f366004611e73565b611258565b34801561048057600080fd5b5061025e600c5481565b34801561049657600080fd5b506102076104a5366004611c77565b611356565b3480156104b657600080fd5b506102076104c5366004611c77565b611403565b3480156104d657600080fd5b5061025e60045481565b3480156104ec57600080fd5b5061025e678ac7230489e8000081565b34801561050857600080fd5b5061025e60035481565b34801561051e57600080fd5b506102076114b2565b34801561053357600080fd5b50610207610542366004611c77565b61175a565b34801561055357600080fd5b506001546102a7906001600160a01b031681565b34801561057357600080fd5b50610207610582366004611da6565b6117f9565b6000546001600160a01b031633146105e65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105f85750600081115b61060157600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96106396000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b6000546001600160a01b031633146106b85760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66038d7ea4c68000811180156106d55750678ac7230489e8000081105b6106de57600080fd5b60098190557f674efbecdf5f1400e276cb9c3d4459ef8a01fdc0da877cb4de7e557fe18de5bc6106396000546001600160a01b031690565b333b156107655760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b600c546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc9190611e95565b10156108705760405162461bcd60e51b815260206004820152602860248201527f496e73756666696369656e74207365636f6e646172792066656520746f6b656e60448201527f2062616c616e636500000000000000000000000000000000000000000000000060648201526084016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f2a4701af66936e0043ee5cf6e1e981ae08e42c53540fe3adf9cb669ec459924291015b60405180910390a1565b600080600b54600a6108f19190611ffd565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081529293506001600160a01b03909116916109a99184916109a3919085906349948e0e9061094d908b9060040161207f565b60206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d9190611e95565b90611941565b90611956565b949350505050565b333b15610a005760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6729a2241af62c000033311015610a595760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420424f42412062616c616e63650000000000000060448201526064016105dd565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527ffa73f4c7e93d6b458c033969eb1e1966b869463eef1491a1783a466941616e8f91016108d5565b863b15610b0e5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f41000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0386163014610b665760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e74726163740000000060448201526064016105dd565b6000600b54600a610b779190611ffd565b90506000610ba2600854610b9c846109a3600a5460095461194190919063ffffffff16565b90611962565b905080871015610bf45760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f7567680000000000000000000000000060448201526064016105dd565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a81166024830152604482018a90526064820189905260ff8816608483015260a4820187905260c4820186905290911690819063d505accf9060e401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50610cb1925050506001600160a01b0382168b308561196e565b6009546040516000916001600160a01b038d16918381818185875af1925050503d8060008114610cfd576040519150601f19603f3d011682016040523d82523d6000602084013e610d02565b606091505b5050905080610d535760405162461bcd60e51b815260206004820152601360248201527f4661696c656420746f2073656e6420424f42410000000000000000000000000060448201526064016105dd565b6040516001600160a01b038c1681527f67c28fca43faa12141a11f681414c2818babcb0da54289f470a5052fd4761ed39060200160405180910390a15050505050505050505050565b600080600b54600a610dae9190611ffd565b9050610dd1600854610b9c836109a3600a5460095461194190919063ffffffff16565b91505090565b6001546001600160a01b031615610e305760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a656400000060448201526064016105dd565b6001600160a01b03821615801590610e5057506001600160a01b03811615155b610e5957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331781556006805490921673420000000000000000000000000000000000000f17909155660aa87bee5380006008556113886003556107d060058190556101f4600455600a55600b5566071afd498d0000600c55565b6000546001600160a01b03163314610f585760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600a8110610f6557600080fd5b600b8190557f3b46fc7b81af1d304c012e880b9a6881d29c7ba5b54beb1e744e55a0d1dd94236106396000546001600160a01b031690565b6000546001600160a01b03163314610ff75760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611044576040519150601f19603f3d011682016040523d82523d6000602084013e611049565b606091505b50509050806110c05760405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420424f424120746f206665652077616c6c6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016105dd565b7f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b77536110f36000546001600160a01b031690565b600154604080516001600160a01b03938416815292909116602083015201610653565b6000546001600160a01b031633146111705760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b803b6111be5760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f4100000000000000000000000000000000000060448201526064016105dd565b6001600160a01b0381166111d157600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a76112396000546001600160a01b031690565b604080516001600160a01b039283168152918416602083015201610653565b6000546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60035482111580156112c657506004548210155b6112cf57600080fd5b60035481111580156112e357506004548110155b6112ec57600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906113296000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b031633146113b05760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b60045481101580156113c25750600081115b6113cb57600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416106396000546001600160a01b031690565b6000546001600160a01b0316331461145d5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b66071afd498d000081101561147157600080fd5b600c5460408051918252602082018390527f987a8898ebf1c256f04789c2023e41553af453a60f527bb6166b79b798563433910160405180910390a1600c55565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152678ac7230489e80000916001600160a01b0316906370a082319060240160206040518083038186803b15801561151657600080fd5b505afa15801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611e95565b10156115e85760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a4016105dd565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b15801561166857600080fd5b505afa15801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190611e95565b6000604051806020016040528060008152506040518663ffffffff1660e01b81526004016116d2959493929190612092565b600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b505050507ff98e06ad52009fd71318a7e1139b93d3c2fdbb95c1d87cac61a71e47415b6cc36117376000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016108d5565b6000546001600160a01b031633146117b45760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b600081116117c157600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6106396000546001600160a01b031690565b6000546001600160a01b031633146118535760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105dd565b6001600160a01b0381166118cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105dd565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910161134a565b600061194d82846120d0565b90505b92915050565b600061194d828461210d565b600061194d8284612148565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526119f69085906119fc565b50505050565b6000611a51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae69092919063ffffffff16565b805190915015611ae15780806020019051810190611a6f9190612160565b611ae15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016105dd565b505050565b6060611af58484600085611aff565b90505b9392505050565b606082471015611b775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016105dd565b843b611bc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105dd565b600080866001600160a01b03168587604051611be19190612182565b60006040518083038185875af1925050503d8060008114611c1e576040519150601f19603f3d011682016040523d82523d6000602084013e611c23565b606091505b5091509150611c33828286611c3e565b979650505050505050565b60608315611c4d575081611af8565b825115611c5d5782518084602001fd5b8160405162461bcd60e51b81526004016105dd919061207f565b600060208284031215611c8957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611cd157600080fd5b813567ffffffffffffffff80821115611ce957600080fd5b818401915084601f830112611cfd57600080fd5b813581811115611d0f57611d0f611c90565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d5557611d55611c90565b81604052828152876020848701011115611d6e57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611da357600080fd5b50565b600060208284031215611db857600080fd5b8135611af881611d8e565b600080600080600080600060e0888a031215611dde57600080fd5b8735611de981611d8e565b96506020880135611df981611d8e565b95506040880135945060608801359350608088013560ff81168114611e1d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611e4d57600080fd5b8235611e5881611d8e565b91506020830135611e6881611d8e565b809150509250929050565b60008060408385031215611e8657600080fd5b50508035926020909101359150565b600060208284031215611ea757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115611f3657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f1c57611f1c611eae565b80851615611f2957918102915b93841c9390800290611ee2565b509250929050565b600082611f4d57506001611950565b81611f5a57506000611950565b8160018114611f705760028114611f7a57611f96565b6001915050611950565b60ff841115611f8b57611f8b611eae565b50506001821b611950565b5060208310610133831016604e8410600b8410161715611fb9575081810a611950565b611fc38383611edd565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ff557611ff5611eae565b029392505050565b600061194d8383611f3e565b60005b8381101561202457818101518382015260200161200c565b838111156119f65750506000910152565b6000815180845261204d816020860160208601612009565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061194d6020830184612035565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a06080830152611c3360a0830184612035565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210857612108611eae565b500290565b600082612143577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561215b5761215b611eae565b500190565b60006020828403121561217257600080fd5b81518015158114611af857600080fd5b60008251612194818460208701612009565b919091019291505056fea164736f6c6343000809000a"; ++ ++type Boba_GasPriceOracleAltL1ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Boba_GasPriceOracleAltL1ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Boba_GasPriceOracleAltL1__factory extends ContractFactory { ++ constructor(...args: Boba_GasPriceOracleAltL1ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): Boba_GasPriceOracleAltL1 { ++ return super.attach(address) as Boba_GasPriceOracleAltL1; ++ } ++ override connect(signer: Signer): Boba_GasPriceOracleAltL1__factory { ++ return super.connect(signer) as Boba_GasPriceOracleAltL1__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Boba_GasPriceOracleAltL1Interface { ++ return new utils.Interface(_abi) as Boba_GasPriceOracleAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Boba_GasPriceOracleAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as Boba_GasPriceOracleAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracle__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracle__factory.ts +new file mode 100644 +index 0000000..24e53af +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/Boba_GasPriceOracle__factory.ts +@@ -0,0 +1,662 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ Boba_GasPriceOracle, ++ Boba_GasPriceOracleInterface, ++} from "../../../../contracts/L2/predeploys/Boba_GasPriceOracle"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "SwapBOBAForETHMetaTransaction", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "TransferOwnership", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UpdateGasPriceOracleAddress", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMaxPriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMetaTransactionFee", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateMinPriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdatePriceRatio", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "UpdateReceivedETHAmount", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UseBobaAsFeeToken", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "UseETHAsFeeToken", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "WithdrawBOBA", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "WithdrawETH", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "MIN_WITHDRAWAL_AMOUNT", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "bobaFeeTokenUsers", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "feeWallet", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "gasPriceOracleAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getBOBAForSwap", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_txData", ++ type: "bytes", ++ }, ++ ], ++ name: "getL1BobaFee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address payable", ++ name: "_feeWallet", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l2BobaAddress", ++ type: "address", ++ }, ++ ], ++ name: "initialize", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2BobaAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "marketPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "maxPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "metaTransactionFee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "minPriceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "priceRatio", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "receivedETHAmount", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "tokenOwner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "swapBOBAForETHMetaTransaction", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_gasPriceOracleAddress", ++ type: "address", ++ }, ++ ], ++ name: "updateGasPriceOracleAddress", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_maxPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMaxPriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_metaTransactionFee", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMetaTransactionFee", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_minPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updateMinPriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_priceRatio", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_marketPriceRatio", ++ type: "uint256", ++ }, ++ ], ++ name: "updatePriceRatio", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_receivedETHAmount", ++ type: "uint256", ++ }, ++ ], ++ name: "updateReceivedETHAmount", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "useBobaAsFeeToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "useETHAsFeeToken", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdrawBOBA", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdrawETH", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60806040526113886003556101f4600455600680546001600160a01b03191673420000000000000000000000000000000000000f1790556729a2241af62c00006008556611c37937e0800060095534801561005957600080fd5b50611da5806100696000396000f3fe6080604052600436106101af5760003560e01c806389df963d116100ec578063d2e1fb221161008a578063e086e5ec11610064578063e086e5ec1461047b578063e3aea9ba14610490578063f25f4b56146104b0578063f2fde38b146104d057600080fd5b8063d2e1fb2214610432578063d3e5792b14610448578063d86732ef1461046557600080fd5b8063b54016dc116100c6578063b54016dc146103bc578063bc9bd6ee146103dc578063c8a05413146103fc578063cd0514ad1461041c57600080fd5b806389df963d146103695780638da5cb5b1461037e5780638fcfc8131461039c57600080fd5b806334fe1b16116101595780635b9da5c6116101335780635b9da5c6146102d35780636805491b146102f35780637728195c14610333578063872ea4991461035357600080fd5b806334fe1b1614610289578063438ac96c1461029e578063485cc955146102b357600080fd5b80631b6771991161018a5780631b6771991461021c57806323ec63201461023157806324b20eda1461025157600080fd5b80625c5fb2146101bb5780630aa2f420146101dd57806315a0c1ac1461020657600080fd5b366101b657005b600080fd5b3480156101c757600080fd5b506101db6101d63660046119d8565b6104f0565b005b3480156101e957600080fd5b506101f360055481565b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f3600a5481565b34801561022857600080fd5b506101db6105c7565b34801561023d57600080fd5b506101f361024c366004611a20565b6106da565b34801561025d57600080fd5b50600254610271906001600160a01b031681565b6040516001600160a01b0390911681526020016101fd565b34801561029557600080fd5b506101db61078b565b3480156102aa57600080fd5b506101f361092d565b3480156102bf57600080fd5b506101db6102ce366004611b07565b610957565b3480156102df57600080fd5b506101db6102ee3660046119d8565b610a70565b3480156102ff57600080fd5b5061032361030e366004611b40565b60076020526000908152604090205460ff1681565b60405190151581526020016101fd565b34801561033f57600080fd5b50600654610271906001600160a01b031681565b34801561035f57600080fd5b506101f360085481565b34801561037557600080fd5b506101db610b27565b34801561038a57600080fd5b506000546001600160a01b0316610271565b3480156103a857600080fd5b506101db6103b7366004611b40565b610dd0565b3480156103c857600080fd5b506101db6103d7366004611b5d565b610f12565b3480156103e857600080fd5b506101db6103f7366004611bd4565b6111d4565b34801561040857600080fd5b506101db6104173660046119d8565b6112d2565b34801561042857600080fd5b506101f360095481565b34801561043e57600080fd5b506101f360045481565b34801561045457600080fd5b506101f3680821ab0d441498000081565b34801561047157600080fd5b506101f360035481565b34801561048757600080fd5b506101db61137f565b34801561049c57600080fd5b506101db6104ab3660046119d8565b6114d2565b3480156104bc57600080fd5b50600154610271906001600160a01b031681565b3480156104dc57600080fd5b506101db6104eb366004611b40565b611571565b6000546001600160a01b0316331461054f5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b60035481111580156105615750600081115b61056a57600080fd5b60048190557f680f379280fc8680df45c979a924c0084a250758604482cb01dadedbaa1c09c96105a26000546001600160a01b031690565b604080516001600160a01b03909216825260208201849052015b60405180910390a150565b333b156106165760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b66071afd498d00003331101561066e5760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74204554482062616c616e636500000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f764389830e6a6b84f4ea3f2551a4c5afbb6dff806f2d8f571f6913c6c4b62a4091015b60405180910390a1565b6006546005546040517f49948e0e0000000000000000000000000000000000000000000000000000000081526000926001600160a01b0316919082906349948e0e9061072a908790600401611c6c565b60206040518083038186803b15801561074257600080fd5b505afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190611c7f565b6107849190611cc7565b9392505050565b333b156107da5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526729a2241af62c0000916001600160a01b0316906370a082319060240160206040518083038186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190611c7f565b10156108c45760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420426f62612062616c616e6365000000000000006044820152606401610546565b3360008181526007602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fd1787ba09c5383b33cf88983fbbf2e6ae348746a3a906e1a1bb67c729661a4ac91016106d0565b600061095260085461094c600a546009546116b990919063ffffffff16565b906116c5565b905090565b6001546001600160a01b0316156109b05760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a65640000006044820152606401610546565b6001600160a01b038216158015906109d057506001600160a01b03811615155b6109d957600080fd5b600180546001600160a01b039384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600280549290931691811691909117909155600080548216331790556006805490911673420000000000000000000000000000000000000f1790556729a2241af62c00006008556113886003556107d060058190556101f4600455600a55565b6000546001600160a01b03163314610aca5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b66038d7ea4c6800081118015610ae65750662386f26fc1000081105b610aef57600080fd5b60098190557fdcb9e069a0d16a974c9c0f4a88e2c9b79df5c45d9721c26461043d51c44682076105a26000546001600160a01b031690565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152680821ab0d4414980000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b8c57600080fd5b505afa158015610ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc49190611c7f565b1015610c5e5760405162461bcd60e51b815260206004820152605560248201527f426f62615f47617350726963654f7261636c653a207769746864726177616c2060448201527f616d6f756e74206d7573742062652067726561746572207468616e206d696e6960648201527f6d756d207769746864726177616c20616d6f756e740000000000000000000000608482015260a401610546565b6002546001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527342000000000000000000000000000000000000109263a3a79548926001600160a01b039182169291169082906370a082319060240160206040518083038186803b158015610cde57600080fd5b505afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611c7f565b6000604051806020016040528060008152506040518663ffffffff1660e01b8152600401610d48959493929190611d04565b600060405180830381600087803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b505050507f2c69c3957d9ca9782726f647b7a3592dd381f4370288551f5ed43fd3cc5b7753610dad6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016106d0565b6000546001600160a01b03163314610e2a5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b803b610e785760405162461bcd60e51b815260206004820152600e60248201527f4163636f756e7420697320454f410000000000000000000000000000000000006044820152606401610546565b6001600160a01b038116610e8b57600080fd5b600680546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790557f226bf99888a1e70d41ce744b11ce2acd4d1d1b8cf4ad17a0e72e67acff4bf5a7610ef36000546001600160a01b031690565b604080516001600160a01b0392831681529184166020830152016105bc565b863b15610f615760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f4100000000000000000000000000000000006044820152606401610546565b6001600160a01b0386163014610fb95760405162461bcd60e51b815260206004820152601c60248201527f5370656e646572206973206e6f74207468697320636f6e7472616374000000006044820152606401610546565b6000610fd860085461094c600a546009546116b990919063ffffffff16565b90508086101561102a5760405162461bcd60e51b815260206004820152601360248201527f56616c7565206973206e6f7420656e6f756768000000000000000000000000006044820152606401610546565b6002546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c4820185905290911690819063d505accf9060e401600060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50506002546110ea92506001600160a01b031690508a30856116d1565b6009546040516000916001600160a01b038c16918381818185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b505090508061118c5760405162461bcd60e51b815260206004820152601260248201527f4661696c656420746f2073656e642045544800000000000000000000000000006044820152606401610546565b6040516001600160a01b038b1681527fb92b4b358dfa6e521f7f80a5d0522cf04a2082482701a0d78ff2bb615df646be9060200160405180910390a150505050505050505050565b6000546001600160a01b0316331461122e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600354821115801561124257506004548210155b61124b57600080fd5b600354811115801561125f57506004548110155b61126857600080fd5b6005829055600a8190557f23632bbb735dece542dac9735a2ba4253234eb119ce45cdf9968cbbe12aa67906112a56000546001600160a01b031690565b604080516001600160a01b0390921682526020820185905281018390526060015b60405180910390a15050565b6000546001600160a01b0316331461132c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b600454811015801561133e5750600081115b61134757600080fd5b60038190557f7a28f69b71e51c4a30f620a2cfe4ce5aad2cd3fe5cc9647e400e252b65033d416105a26000546001600160a01b031690565b6000546001600160a01b031633146113d95760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b505090508061147c5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f2073656e642045544820746f206665652077616c6c65746044820152606401610546565b7f6de63bb986f2779478e384365c03cc2e62f06b453856acca87d5a519ce0266496114af6000546001600160a01b031690565b600154604080516001600160a01b039384168152929091166020830152016105bc565b6000546001600160a01b0316331461152c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6000811161153957600080fd5b60088190557f1071f61d642716391065a6f38aac12cdc6a436ca6a6622a18ae0530495738afc6105a26000546001600160a01b031690565b6000546001600160a01b031633146115cb5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610546565b6001600160a01b0381166116475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610546565b600080546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c91016112c6565b60006107848284611cc7565b60006107848284611d42565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261175990859061175f565b50505050565b60006117b4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118499092919063ffffffff16565b80519091501561184457808060200190518101906117d29190611d5a565b6118445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610546565b505050565b60606118588484600085611860565b949350505050565b6060824710156118d85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610546565b843b6119265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610546565b600080866001600160a01b031685876040516119429190611d7c565b60006040518083038185875af1925050503d806000811461197f576040519150601f19603f3d011682016040523d82523d6000602084013e611984565b606091505b509150915061199482828661199f565b979650505050505050565b606083156119ae575081610784565b8251156119be5782518084602001fd5b8160405162461bcd60e51b81526004016105469190611c6c565b6000602082840312156119ea57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a3257600080fd5b813567ffffffffffffffff80821115611a4a57600080fd5b818401915084601f830112611a5e57600080fd5b813581811115611a7057611a706119f1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611ab657611ab66119f1565b81604052828152876020848701011115611acf57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6001600160a01b0381168114611b0457600080fd5b50565b60008060408385031215611b1a57600080fd5b8235611b2581611aef565b91506020830135611b3581611aef565b809150509250929050565b600060208284031215611b5257600080fd5b813561078481611aef565b600080600080600080600060e0888a031215611b7857600080fd5b8735611b8381611aef565b96506020880135611b9381611aef565b95506040880135945060608801359350608088013560ff81168114611bb757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611be757600080fd5b50508035926020909101359150565b60005b83811015611c11578181015183820152602001611bf9565b838111156117595750506000910152565b60008151808452611c3a816020860160208601611bf6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107846020830184611c22565b600060208284031215611c9157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cff57611cff611c98565b500290565b60006001600160a01b03808816835280871660208401525084604083015263ffffffff8416606083015260a0608083015261199460a0830184611c22565b60008219821115611d5557611d55611c98565b500190565b600060208284031215611d6c57600080fd5b8151801515811461078457600080fd5b60008251611d8e818460208701611bf6565b919091019291505056fea164736f6c6343000809000a"; ++ ++type Boba_GasPriceOracleConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Boba_GasPriceOracleConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Boba_GasPriceOracle__factory extends ContractFactory { ++ constructor(...args: Boba_GasPriceOracleConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): Boba_GasPriceOracle { ++ return super.attach(address) as Boba_GasPriceOracle; ++ } ++ override connect(signer: Signer): Boba_GasPriceOracle__factory { ++ return super.connect(signer) as Boba_GasPriceOracle__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Boba_GasPriceOracleInterface { ++ return new utils.Interface(_abi) as Boba_GasPriceOracleInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Boba_GasPriceOracle { ++ return new Contract(address, _abi, signerOrProvider) as Boba_GasPriceOracle; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L1BlockNumber__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L1BlockNumber__factory.ts +new file mode 100644 +index 0000000..567f0f7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L1BlockNumber__factory.ts +@@ -0,0 +1,39 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IOVM_L1BlockNumber, ++ IOVM_L1BlockNumberInterface, ++} from "../../../../contracts/L2/predeploys/IOVM_L1BlockNumber"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ name: "getL1BlockNumber", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IOVM_L1BlockNumber__factory { ++ static readonly abi = _abi; ++ static createInterface(): IOVM_L1BlockNumberInterface { ++ return new utils.Interface(_abi) as IOVM_L1BlockNumberInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IOVM_L1BlockNumber { ++ return new Contract(address, _abi, signerOrProvider) as IOVM_L1BlockNumber; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser__factory.ts +new file mode 100644 +index 0000000..45c4765 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser__factory.ts +@@ -0,0 +1,68 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IOVM_L2ToL1MessagePasser, ++ IOVM_L2ToL1MessagePasserInterface, ++} from "../../../../contracts/L2/predeploys/IOVM_L2ToL1MessagePasser"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_nonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "L2ToL1Message", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ ], ++ name: "passMessageToL1", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IOVM_L2ToL1MessagePasser__factory { ++ static readonly abi = _abi; ++ static createInterface(): IOVM_L2ToL1MessagePasserInterface { ++ return new utils.Interface(_abi) as IOVM_L2ToL1MessagePasserInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IOVM_L2ToL1MessagePasser { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IOVM_L2ToL1MessagePasser; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_BOBA__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_BOBA__factory.ts +new file mode 100644 +index 0000000..33a4fd4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_BOBA__factory.ts +@@ -0,0 +1,465 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2_BOBA, ++ L2_BOBAInterface, ++} from "../../../../contracts/L2/predeploys/L2_BOBA"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1TokenAddress", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2Bridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "_interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60a06040523480156200001157600080fd5b5060405162001119380380620011198339810160408190526200003491620001a7565b734200000000000000000000000000000000000010816040518060400160405280600c81526020016b424f4241204e6574776f726b60a01b81525060405180604001604052806004815260200163424f424160e01b815250601282828160039080519060200190620000a892919062000101565b508051620000be90600490602084019062000101565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff1660805250620002169050565b8280546200010f90620001d9565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600060208284031215620001ba57600080fd5b81516001600160a01b0381168114620001d257600080fd5b9392505050565b600181811c90821680620001ee57607f821691505b602082108114156200021057634e487b7160e01b600052602260045260246000fd5b50919050565b608051610ee76200023260003960006101810152610ee76000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4c325f424f42413a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4c325f424f42413a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4c325f424f42413a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c325f424f42413a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a"; ++ ++type L2_BOBAConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2_BOBAConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2_BOBA__factory extends ContractFactory { ++ constructor(...args: L2_BOBAConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l1TokenAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(_l1TokenAddress, overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ _l1TokenAddress: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_l1TokenAddress, overrides || {}); ++ } ++ override attach(address: string): L2_BOBA { ++ return super.attach(address) as L2_BOBA; ++ } ++ override connect(signer: Signer): L2_BOBA__factory { ++ return super.connect(signer) as L2_BOBA__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2_BOBAInterface { ++ return new utils.Interface(_abi) as L2_BOBAInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2_BOBA { ++ return new Contract(address, _abi, signerOrProvider) as L2_BOBA; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_L1NativeToken__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_L1NativeToken__factory.ts +new file mode 100644 +index 0000000..9ea7d85 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/L2_L1NativeToken__factory.ts +@@ -0,0 +1,589 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ L2_L1NativeToken, ++ L2_L1NativeTokenInterface, ++} from "../../../../contracts/L2/predeploys/L2_L1NativeToken"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Bridge", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ internalType: "string", ++ name: "_symbol", ++ type: "string", ++ }, ++ { ++ internalType: "uint8", ++ name: "decimals_", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2Bridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "_interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162001cd638038062001cd68339810160408190526200005a9162000314565b8280604051806040016040528060018152602001603160f81b815250858581600390805190602001906200009092919062000184565b508051620000a690600490602084019062000184565b5050825160208085019190912083518483012060c082815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301889052606082018790526080820194909452308184015281518082039093018352909301909252815191909401209193509190608052610100525050600680546001600160a01b039889166001600160a01b031990911617905550506007805460ff909316600160a01b026001600160a81b031990931696909516959095171790925550620003fd915050565b8280546200019290620003c0565b90600052602060002090601f016020900481019282620001b6576000855562000201565b82601f10620001d157805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000201578251825591602001919060010190620001e4565b506200020f92915062000213565b5090565b5b808211156200020f576000815560010162000214565b80516001600160a01b03811681146200024257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026f57600080fd5b81516001600160401b03808211156200028c576200028c62000247565b604051601f8301601f19908116603f01168101908282118183101715620002b757620002b762000247565b81604052838152602092508683858801011115620002d457600080fd5b600091505b83821015620002f85785820183015181830184015290820190620002d9565b838211156200030a5760008385830101525b9695505050505050565b600080600080600060a086880312156200032d57600080fd5b62000338866200022a565b945062000348602087016200022a565b60408701519094506001600160401b03808211156200036657600080fd5b6200037489838a016200025d565b945060608801519150808211156200038b57600080fd5b506200039a888289016200025d565b925050608086015160ff81168114620003b257600080fd5b809150509295509295909350565b600181811c90821680620003d557607f821691505b60208210811415620003f757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516118896200044d60003960006108dd01526000610e4f01526000610e9e01526000610e7901526000610dfd01526000610e2601526118896000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806370a08231116100cd578063a9059cbb11610081578063c01e1bd611610066578063c01e1bd6146102fa578063d505accf1461031a578063dd62ed3e1461032d57600080fd5b8063a9059cbb146102a2578063ae1f6aaf146102b557600080fd5b806395d89b41116100b257806395d89b41146102745780639dc29fac1461027c578063a457c2d71461028f57600080fd5b806370a082311461022b5780637ecebe001461026157600080fd5b806323b872dd116101245780633644e515116101095780633644e515146101fb578063395093511461020357806340c10f191461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004611595565b610373565b60405190151581526020015b60405180910390f35b610186610433565b60405161017591906115de565b6101696101a136600461167a565b6104c5565b6002545b604051908152602001610175565b6101696101c63660046116a4565b6104db565b60075474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610175565b6101aa6105ac565b61016961021136600461167a565b6105bb565b61022961022436600461167a565b610604565b005b6101aa6102393660046116e0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101aa61026f3660046116e0565b6106c9565b6101866106f6565b61022961028a36600461167a565b610705565b61016961029d36600461167a565b6107be565b6101696102b036600461167a565b61087c565b6007546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6006546102d59073ffffffffffffffffffffffffffffffffffffffff1681565b6102296103283660046116fb565b610889565b6101aa61033b36600461176e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061042b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610442906117a1565b80601f016020809104026020016040519081016040528092919081815260200182805461046e906117a1565b80156104bb5780601f10610490576101008083540402835291602001916104bb565b820191906000526020600020905b81548152906001019060200180831161049e57829003601f168201915b5050505050905090565b60006104d2338484610a14565b50600192915050565b60006104e8848484610b93565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105a18533858403610a14565b506001949350505050565b60006105b6610df9565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916104d29185906105ff90869061181e565b610a14565b60075473ffffffffffffffffffffffffffffffffffffffff16331461066b5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6106758282610eec565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106bd91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120545b92915050565b606060048054610442906117a1565b60075473ffffffffffffffffffffffffffffffffffffffff16331461076c5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161058b565b6107768282610efa565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106bd91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156108655760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058b565b6108723385858403610a14565b5060019392505050565b60006104d2338484610b93565b834211156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161058b565b60007f00000000000000000000000000000000000000000000000000000000000000008888886109088c610f04565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061097082610f39565b9050600061098082878787610fa2565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fd5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161058b565b610a088a8a8a610a14565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a9c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216610ca55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610d415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d8590849061181e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610deb91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610e4857507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b610ef68282610fca565b5050565b610ef682826110d0565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006106f0610f46610df9565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000610fb387878787611289565b91509150610fc0816113a1565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff821661102d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058b565b806002600082825461103f919061181e565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061107990849061181e565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156111f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611231908490611836565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156112c05750600090506003611398565b8460ff16601b141580156112d857508460ff16601c14155b156112e95750600090506004611398565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561133d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661139157600060019250925050611398565b9150600090505b94509492505050565b60008160048111156113b5576113b561184d565b14156113be5750565b60018160048111156113d2576113d261184d565b14156114205760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058b565b60028160048111156114345761143461184d565b14156114825760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058b565b60038160048111156114965761149661184d565b141561150a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b600481600481111561151e5761151e61184d565b14156115925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161058b565b50565b6000602082840312156115a757600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146115d757600080fd5b9392505050565b600060208083528351808285015260005b8181101561160b578581018301518582016040015282016115ef565b8181111561161d576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461167557600080fd5b919050565b6000806040838503121561168d57600080fd5b61169683611651565b946020939093013593505050565b6000806000606084860312156116b957600080fd5b6116c284611651565b92506116d060208501611651565b9150604084013590509250925092565b6000602082840312156116f257600080fd5b6115d782611651565b600080600080600080600060e0888a03121561171657600080fd5b61171f88611651565b965061172d60208901611651565b95506040880135945060608801359350608088013560ff8116811461175157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561178157600080fd5b61178a83611651565b915061179860208401611651565b90509250929050565b600181811c908216806117b557607f821691505b60208210811415610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611831576118316117ef565b500190565b600082821015611848576118486117ef565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a"; ++ ++type L2_L1NativeTokenConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2_L1NativeTokenConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2_L1NativeToken__factory extends ContractFactory { ++ constructor(...args: L2_L1NativeTokenConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): L2_L1NativeToken { ++ return super.attach(address) as L2_L1NativeToken; ++ } ++ override connect(signer: Signer): L2_L1NativeToken__factory { ++ return super.connect(signer) as L2_L1NativeToken__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2_L1NativeTokenInterface { ++ return new utils.Interface(_abi) as L2_L1NativeTokenInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2_L1NativeToken { ++ return new Contract(address, _abi, signerOrProvider) as L2_L1NativeToken; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_DeployerWhitelist__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_DeployerWhitelist__factory.ts +new file mode 100644 +index 0000000..e8810bc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_DeployerWhitelist__factory.ts +@@ -0,0 +1,207 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_DeployerWhitelist, ++ OVM_DeployerWhitelistInterface, ++} from "../../../../contracts/L2/predeploys/OVM_DeployerWhitelist"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "oldOwner", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnerChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "oldOwner", ++ type: "address", ++ }, ++ ], ++ name: "WhitelistDisabled", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "address", ++ name: "deployer", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bool", ++ name: "whitelisted", ++ type: "bool", ++ }, ++ ], ++ name: "WhitelistStatusChanged", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "enableArbitraryContractDeployment", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_deployer", ++ type: "address", ++ }, ++ ], ++ name: "isDeployerAllowed", ++ 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: "address", ++ name: "_owner", ++ type: "address", ++ }, ++ ], ++ name: "setOwner", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_deployer", ++ type: "address", ++ }, ++ { ++ internalType: "bool", ++ name: "_isWhitelisted", ++ type: "bool", ++ }, ++ ], ++ name: "setWhitelistedDeployer", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "whitelist", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061067f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80639b19251a116100505780639b19251a146100e9578063b1540a011461011c578063bdc7b54f1461012f57600080fd5b806308fd63221461007757806313af40351461008c5780638da5cb5b1461009f575b600080fd5b61008a610085366004610614565b610137565b005b61008a61009a366004610650565b610271565b6000546100bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61010c6100f7366004610650565b60016020526000908152604090205460ff1681565b60405190151581526020016100e0565b61010c61012a366004610650565b61047c565b61008a6104cd565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b73ffffffffffffffffffffffffffffffffffffffff81166103e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f4f564d5f4465706c6f79657257686974656c6973743a2077686974656c69737460448201527f2063616e206f6e6c792062652064697361626c65642076696120656e61626c6560648201527f417262697472617279436f6e74726163744465706c6f796d656e740000000000608482015260a4016101da565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806104c7575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f6865206f776e6572206f66207468697320636f6e74726163742e00000000000060648201526084016101da565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f57600080fd5b919050565b6000806040838503121561062757600080fd5b610630836105eb565b91506020830135801515811461064557600080fd5b809150509250929050565b60006020828403121561066257600080fd5b61066b826105eb565b939250505056fea164736f6c6343000809000a"; ++ ++type OVM_DeployerWhitelistConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_DeployerWhitelistConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_DeployerWhitelist__factory extends ContractFactory { ++ constructor(...args: OVM_DeployerWhitelistConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): OVM_DeployerWhitelist { ++ return super.attach(address) as OVM_DeployerWhitelist; ++ } ++ override connect(signer: Signer): OVM_DeployerWhitelist__factory { ++ return super.connect(signer) as OVM_DeployerWhitelist__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_DeployerWhitelistInterface { ++ return new utils.Interface(_abi) as OVM_DeployerWhitelistInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_DeployerWhitelist { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as OVM_DeployerWhitelist; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_ETH__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_ETH__factory.ts +new file mode 100644 +index 0000000..35b4459 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_ETH__factory.ts +@@ -0,0 +1,457 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_ETH, ++ OVM_ETHInterface, ++} from "../../../../contracts/L2/predeploys/OVM_ETH"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2Bridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "_interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60a06040523480156200001157600080fd5b5073420000000000000000000000000000000000001060006040518060400160405280600581526020016422ba3432b960d91b8152506040518060400160405280600381526020016208aa8960eb1b8152506012828281600390805190602001906200007f929190620000d6565b50805162000095906004906020840190620000d6565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff1660805250620001b9565b828054620000e4906200017c565b90600052602060002090601f01602090048101928262000108576000855562000153565b82601f106200012357805160ff191683800117855562000153565b8280016001018555821562000153579182015b828111156200015357825182559160200191906001019062000136565b506200016192915062000165565b5090565b5b8082111562000161576000815560010162000166565b600181811c908216806200019157607f821691505b60208210811415620001b357634e487b7160e01b600052602260045260246000fd5b50919050565b608051610ee7620001d560003960006101810152610ee76000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c8f565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610cd8565b610118610150366004610d74565b610447565b6002545b604051908152602001610124565b610118610175366004610d9e565b6104fd565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610d74565b6105ae565b6101d16101cc366004610d74565b61065f565b005b6101596101e1366004610dda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561073e565b6101d161021f366004610d74565b61074d565b610118610232366004610d74565b610820565b610118610245366004610d74565b6108d1565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490610e28565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090610e28565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6106ea8282610982565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161073291815260200190565b60405180910390a25050565b6060600480546103c490610e28565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104f4565b6107d88282610aa2565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161073291815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104f4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104f4565b73ffffffffffffffffffffffffffffffffffffffff82166109ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104f4565b8060026000828254610a119190610eab565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a4b908490610eab565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104f4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c37908490610ec3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610ca157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cd157600080fd5b9392505050565b600060208083528351808285015260005b81811015610d0557858101830151858201604001528201610ce9565b81811115610d17576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d6f57600080fd5b919050565b60008060408385031215610d8757600080fd5b610d9083610d4b565b946020939093013593505050565b600080600060608486031215610db357600080fd5b610dbc84610d4b565b9250610dca60208501610d4b565b9150604084013590509250925092565b600060208284031215610dec57600080fd5b610cd182610d4b565b60008060408385031215610e0857600080fd5b610e1183610d4b565b9150610e1f60208401610d4b565b90509250929050565b600181811c90821680610e3c57607f821691505b60208210811415610e76577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610ebe57610ebe610e7c565b500190565b600082821015610ed557610ed5610e7c565b50039056fea164736f6c6343000809000a"; ++ ++type OVM_ETHConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_ETHConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_ETH__factory extends ContractFactory { ++ constructor(...args: OVM_ETHConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): OVM_ETH { ++ return super.attach(address) as OVM_ETH; ++ } ++ override connect(signer: Signer): OVM_ETH__factory { ++ return super.connect(signer) as OVM_ETH__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_ETHInterface { ++ return new utils.Interface(_abi) as OVM_ETHInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_ETH { ++ return new Contract(address, _abi, signerOrProvider) as OVM_ETH; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_GasPriceOracle__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_GasPriceOracle__factory.ts +new file mode 100644 +index 0000000..a6b6e3e +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_GasPriceOracle__factory.ts +@@ -0,0 +1,380 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_GasPriceOracle, ++ OVM_GasPriceOracleInterface, ++} from "../../../../contracts/L2/predeploys/OVM_GasPriceOracle"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_owner", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "DecimalsUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "GasPriceUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "L1BaseFeeUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "OverheadUpdated", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "previousOwner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "OwnershipTransferred", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ name: "ScalarUpdated", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "gasPrice", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "getExtraL2Gas", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "getL1Fee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "getL1GasUsed", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1BaseFee", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "overhead", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "scalar", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_decimals", ++ type: "uint256", ++ }, ++ ], ++ name: "setDecimals", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_gasPrice", ++ type: "uint256", ++ }, ++ ], ++ name: "setGasPrice", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_baseFee", ++ type: "uint256", ++ }, ++ ], ++ name: "setL1BaseFee", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_overhead", ++ type: "uint256", ++ }, ++ ], ++ name: "setOverhead", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_scalar", ++ type: "uint256", ++ }, ++ ], ++ name: "setScalar", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50604051610e66380380610e6683398101604081905261002f91610167565b61003833610047565b61004181610097565b50610197565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146100f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811661015b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ed565b61016481610047565b50565b60006020828403121561017957600080fd5b81516001600160a01b038116811461019057600080fd5b9392505050565b610cc0806101a66000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063f2fde38b11610066578063f2fde38b146101ea578063f45e65d8146101fd578063fb75474714610206578063fe173b971461021957600080fd5b80638da5cb5b14610189578063bede39b5146101b1578063bf1fe420146101c4578063de26c4a1146101d757600080fd5b8063519b4bd3116100d3578063519b4bd314610152578063704655971461015b578063715018a61461016e5780638c8885c81461017657600080fd5b80630c18c16214610105578063313ce567146101215780633577afc51461012a57806349948e0e1461013f575b600080fd5b61010e60035481565b6040519081526020015b60405180910390f35b61010e60055481565b61013d61013836600461090c565b610222565b005b61010e61014d366004610954565b6102e4565b61010e60025481565b61013d61016936600461090c565b610340565b61013d6103f6565b61013d61018436600461090c565b610483565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b61013d6101bf36600461090c565b610539565b61013d6101d236600461090c565b6105ef565b61010e6101e5366004610954565b6106a5565b61013d6101f8366004610a23565b610749565b61010e60045481565b61010e610214366004610954565b610879565b61010e60015481565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b6000806102f0836106a5565b90506000600254826103029190610a8f565b90506000600554600a6103159190610bec565b90506000600454836103279190610a8f565b905060006103358383610bf8565b979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b6104816000610897565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c1906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60028190556040518181527f351fb23757bb5ea0546c85b7996ddd7155f96b939ebaa5ff7bc49c75f27f2c44906020016102d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b60018190556040518181527ffcdccc6074c6c42e4bd578aa9870c697dc976a270968452d2b8c8dc369fae396906020016102d9565b600080805b8351811015610722578381815181106106c5576106c5610c33565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016610702576106fb600483610c62565b9150610710565b61070d601083610c62565b91505b8061071a81610c7a565b9150506106aa565b506000600354826107339190610c62565b905061074181610440610c62565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029f565b73ffffffffffffffffffffffffffffffffffffffff811661086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161029f565b61087681610897565b50565b6000600154610887836102e4565b6108919190610bf8565b92915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561091e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561096657600080fd5b813567ffffffffffffffff8082111561097e57600080fd5b818401915084601f83011261099257600080fd5b8135818111156109a4576109a4610925565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109ea576109ea610925565b81604052828152876020848701011115610a0357600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610a3557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610a5957600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610ac757610ac7610a60565b500290565b600181815b80851115610b2557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610b0b57610b0b610a60565b80851615610b1857918102915b93841c9390800290610ad1565b509250929050565b600082610b3c57506001610891565b81610b4957506000610891565b8160018114610b5f5760028114610b6957610b85565b6001915050610891565b60ff841115610b7a57610b7a610a60565b50506001821b610891565b5060208310610133831016604e8410600b8410161715610ba8575081810a610891565b610bb28383610acc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610be457610be4610a60565b029392505050565b6000610a598383610b2d565b600082610c2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c7557610c75610a60565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610cac57610cac610a60565b506001019056fea164736f6c6343000809000a"; ++ ++type OVM_GasPriceOracleConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_GasPriceOracleConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_GasPriceOracle__factory extends ContractFactory { ++ constructor(...args: OVM_GasPriceOracleConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(_owner, overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_owner, overrides || {}); ++ } ++ override attach(address: string): OVM_GasPriceOracle { ++ return super.attach(address) as OVM_GasPriceOracle; ++ } ++ override connect(signer: Signer): OVM_GasPriceOracle__factory { ++ return super.connect(signer) as OVM_GasPriceOracle__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_GasPriceOracleInterface { ++ return new utils.Interface(_abi) as OVM_GasPriceOracleInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_GasPriceOracle { ++ return new Contract(address, _abi, signerOrProvider) as OVM_GasPriceOracle; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_L2ToL1MessagePasser__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_L2ToL1MessagePasser__factory.ts +new file mode 100644 +index 0000000..4e76ce3 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_L2ToL1MessagePasser__factory.ts +@@ -0,0 +1,124 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_L2ToL1MessagePasser, ++ OVM_L2ToL1MessagePasserInterface, ++} from "../../../../contracts/L2/predeploys/OVM_L2ToL1MessagePasser"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_nonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "L2ToL1Message", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ ], ++ name: "passMessageToL1", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ name: "sentMessages", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061029f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea164736f6c6343000809000a"; ++ ++type OVM_L2ToL1MessagePasserConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_L2ToL1MessagePasserConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_L2ToL1MessagePasser__factory extends ContractFactory { ++ constructor(...args: OVM_L2ToL1MessagePasserConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): OVM_L2ToL1MessagePasser { ++ return super.attach(address) as OVM_L2ToL1MessagePasser; ++ } ++ override connect(signer: Signer): OVM_L2ToL1MessagePasser__factory { ++ return super.connect(signer) as OVM_L2ToL1MessagePasser__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_L2ToL1MessagePasserInterface { ++ return new utils.Interface(_abi) as OVM_L2ToL1MessagePasserInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_L2ToL1MessagePasser { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as OVM_L2ToL1MessagePasser; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1__factory.ts +new file mode 100644 +index 0000000..98ba1a2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1__factory.ts +@@ -0,0 +1,120 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_SequencerFeeVaultAltL1, ++ OVM_SequencerFeeVaultAltL1Interface, ++} from "../../../../contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1FeeWallet", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [], ++ name: "MIN_WITHDRAWAL_AMOUNT", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1FeeWallet", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdraw", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506040516103b53803806103b583398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610322806100936000396000f3fe6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a"; ++ ++type OVM_SequencerFeeVaultAltL1ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_SequencerFeeVaultAltL1ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_SequencerFeeVaultAltL1__factory extends ContractFactory { ++ constructor(...args: OVM_SequencerFeeVaultAltL1ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l1FeeWallet: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l1FeeWallet, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l1FeeWallet: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_l1FeeWallet, overrides || {}); ++ } ++ override attach(address: string): OVM_SequencerFeeVaultAltL1 { ++ return super.attach(address) as OVM_SequencerFeeVaultAltL1; ++ } ++ override connect(signer: Signer): OVM_SequencerFeeVaultAltL1__factory { ++ return super.connect(signer) as OVM_SequencerFeeVaultAltL1__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_SequencerFeeVaultAltL1Interface { ++ return new utils.Interface(_abi) as OVM_SequencerFeeVaultAltL1Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_SequencerFeeVaultAltL1 { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as OVM_SequencerFeeVaultAltL1; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVault__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVault__factory.ts +new file mode 100644 +index 0000000..b93db2c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/OVM_SequencerFeeVault__factory.ts +@@ -0,0 +1,120 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ OVM_SequencerFeeVault, ++ OVM_SequencerFeeVaultInterface, ++} from "../../../../contracts/L2/predeploys/OVM_SequencerFeeVault"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l1FeeWallet", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [], ++ name: "MIN_WITHDRAWAL_AMOUNT", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1FeeWallet", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "withdraw", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ stateMutability: "payable", ++ type: "receive", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506040516103b53803806103b583398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610322806100936000396000f3fe6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a7954893610230937342000000000000000000000000000000000000069373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea164736f6c6343000809000a"; ++ ++type OVM_SequencerFeeVaultConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: OVM_SequencerFeeVaultConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class OVM_SequencerFeeVault__factory extends ContractFactory { ++ constructor(...args: OVM_SequencerFeeVaultConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l1FeeWallet: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l1FeeWallet, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l1FeeWallet: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_l1FeeWallet, overrides || {}); ++ } ++ override attach(address: string): OVM_SequencerFeeVault { ++ return super.attach(address) as OVM_SequencerFeeVault; ++ } ++ override connect(signer: Signer): OVM_SequencerFeeVault__factory { ++ return super.connect(signer) as OVM_SequencerFeeVault__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): OVM_SequencerFeeVaultInterface { ++ return new utils.Interface(_abi) as OVM_SequencerFeeVaultInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): OVM_SequencerFeeVault { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as OVM_SequencerFeeVault; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/WETH9__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/WETH9__factory.ts +new file mode 100644 +index 0000000..f873551 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/WETH9__factory.ts +@@ -0,0 +1,367 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ WETH9, ++ WETH9Interface, ++} from "../../../../contracts/L2/predeploys/WETH9"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "src", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "guy", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "dst", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "Deposit", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "src", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "dst", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "src", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "Withdrawal", ++ type: "event", ++ }, ++ { ++ payable: true, ++ stateMutability: "payable", ++ type: "fallback", ++ }, ++ { ++ constant: true, ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: false, ++ inputs: [ ++ { ++ internalType: "address", ++ name: "guy", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ payable: false, ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ constant: true, ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: true, ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: false, ++ inputs: [], ++ name: "deposit", ++ outputs: [], ++ payable: true, ++ stateMutability: "payable", ++ type: "function", ++ }, ++ { ++ constant: true, ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: true, ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: true, ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ payable: false, ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ constant: false, ++ inputs: [ ++ { ++ internalType: "address", ++ name: "dst", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ payable: false, ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ constant: false, ++ inputs: [ ++ { ++ internalType: "address", ++ name: "src", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "dst", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ payable: false, ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ constant: false, ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "wad", ++ type: "uint256", ++ }, ++ ], ++ name: "withdraw", ++ outputs: [], ++ payable: false, ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158208c8d5eb81396ab38071a6f1e1993fa1d9a8c68b0bb30b6fabe5951e251fc82ac64736f6c63430005110032"; ++ ++type WETH9ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: WETH9ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class WETH9__factory extends ContractFactory { ++ constructor(...args: WETH9ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): WETH9 { ++ return super.attach(address) as WETH9; ++ } ++ override connect(signer: Signer): WETH9__factory { ++ return super.connect(signer) as WETH9__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): WETH9Interface { ++ return new utils.Interface(_abi) as WETH9Interface; ++ } ++ static connect(address: string, signerOrProvider: Signer | Provider): WETH9 { ++ return new Contract(address, _abi, signerOrProvider) as WETH9; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/index.ts +new file mode 100644 +index 0000000..d8dfdb7 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/L2/predeploys/index.ts +@@ -0,0 +1,18 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { BobaTuringCredit__factory } from "./BobaTuringCredit__factory"; ++export { BobaTuringCreditAltL1__factory } from "./BobaTuringCreditAltL1__factory"; ++export { Boba_GasPriceOracle__factory } from "./Boba_GasPriceOracle__factory"; ++export { Boba_GasPriceOracleAltL1__factory } from "./Boba_GasPriceOracleAltL1__factory"; ++export { L2_BOBA__factory } from "./L2_BOBA__factory"; ++export { L2_L1NativeToken__factory } from "./L2_L1NativeToken__factory"; ++export { OVM_DeployerWhitelist__factory } from "./OVM_DeployerWhitelist__factory"; ++export { OVM_ETH__factory } from "./OVM_ETH__factory"; ++export { OVM_GasPriceOracle__factory } from "./OVM_GasPriceOracle__factory"; ++export { OVM_L2ToL1MessagePasser__factory } from "./OVM_L2ToL1MessagePasser__factory"; ++export { OVM_SequencerFeeVault__factory } from "./OVM_SequencerFeeVault__factory"; ++export { OVM_SequencerFeeVaultAltL1__factory } from "./OVM_SequencerFeeVaultAltL1__factory"; ++export { WETH9__factory } from "./WETH9__factory"; ++export { IOVM_L1BlockNumber__factory } from "./IOVM_L1BlockNumber__factory"; ++export { IOVM_L2ToL1MessagePasser__factory } from "./IOVM_L2ToL1MessagePasser__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/L1ChugSplashProxy__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/L1ChugSplashProxy__factory.ts +new file mode 100644 +index 0000000..af6406c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/L1ChugSplashProxy__factory.ts +@@ -0,0 +1,150 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ L1ChugSplashProxy, ++ L1ChugSplashProxyInterface, ++} from "../../../contracts/chugsplash/L1ChugSplashProxy"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_owner", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ stateMutability: "payable", ++ type: "fallback", ++ }, ++ { ++ inputs: [], ++ name: "getImplementation", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getOwner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_code", ++ type: "bytes", ++ }, ++ ], ++ name: "setCode", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_owner", ++ type: "address", ++ }, ++ ], ++ name: "setOwner", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_key", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_value", ++ type: "bytes32", ++ }, ++ ], ++ name: "setStorage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50604051610a34380380610a3483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109988061009c6000396000f3fe60806040526004361061005a5760003560e01c8063893d20e811610043578063893d20e8146100a45780639b0b0fda146100e2578063aaf10f42146101025761005a565b806313af4035146100645780636c5d4ad014610084575b610062610117565b005b34801561007057600080fd5b5061006261007f366004610792565b6103ba565b34801561009057600080fd5b5061006261009f3660046107fe565b61044b565b3480156100b057600080fd5b506100b9610601565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee57600080fd5b506100626100fd3660046108cd565b610698565b34801561010e57600080fd5b506100b9610706565b60006101417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101c3919061092a565b600060405180830381855afa9150503d80600081146101fe576040519150601f19603f3d011682016040523d82523d6000602084013e610203565b606091505b5091509150818015610216575080516020145b156102c8576000818060200190518101906102319190610936565b905080156102c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006102f27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102bd565b3660008037600080366000845af43d6000803e806103b4573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610413575033155b1561044357610440817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610440610117565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104a4575033155b156104435760006104d37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f8251602084012014156104e8575050565b60405160009061051e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161094f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f7965642e0000000000000000000000000060648201526084016102bd565b6105fb817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061062b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610662575033155b1561068d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610695610117565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106f1575033155b156106fa579055565b610702610117565b5050565b60006107307fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610767575033155b1561068d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107a457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107c857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561081057600080fd5b813567ffffffffffffffff8082111561082857600080fd5b818401915084601f83011261083c57600080fd5b81358181111561084e5761084e6107cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610894576108946107cf565b816040528281528760208487010111156108ad57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108e057600080fd5b50508035926020909101359150565b6000815160005b8181101561091057602081850181015186830152016108f6565b8181111561091f576000828601525b509290920192915050565b60006107c882846108ef565b60006020828403121561094857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610983600d8301846108ef565b94935050505056fea164736f6c6343000809000a"; ++ ++type L1ChugSplashProxyConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L1ChugSplashProxyConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L1ChugSplashProxy__factory extends ContractFactory { ++ constructor(...args: L1ChugSplashProxyConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(_owner, overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ _owner: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_owner, overrides || {}); ++ } ++ override attach(address: string): L1ChugSplashProxy { ++ return super.attach(address) as L1ChugSplashProxy; ++ } ++ override connect(signer: Signer): L1ChugSplashProxy__factory { ++ return super.connect(signer) as L1ChugSplashProxy__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L1ChugSplashProxyInterface { ++ return new utils.Interface(_abi) as L1ChugSplashProxyInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L1ChugSplashProxy { ++ return new Contract(address, _abi, signerOrProvider) as L1ChugSplashProxy; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/index.ts +new file mode 100644 +index 0000000..1ba2826 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as interfaces from "./interfaces"; ++export { L1ChugSplashProxy__factory } from "./L1ChugSplashProxy__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/IL1ChugSplashDeployer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/IL1ChugSplashDeployer__factory.ts +new file mode 100644 +index 0000000..2805d48 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/IL1ChugSplashDeployer__factory.ts +@@ -0,0 +1,43 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL1ChugSplashDeployer, ++ IL1ChugSplashDeployerInterface, ++} from "../../../../contracts/chugsplash/interfaces/IL1ChugSplashDeployer"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ name: "isUpgrading", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class IL1ChugSplashDeployer__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL1ChugSplashDeployerInterface { ++ return new utils.Interface(_abi) as IL1ChugSplashDeployerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL1ChugSplashDeployer { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as IL1ChugSplashDeployer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/index.ts +new file mode 100644 +index 0000000..791103b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/chugsplash/interfaces/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IL1ChugSplashDeployer__factory } from "./IL1ChugSplashDeployer__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/index.ts +new file mode 100644 +index 0000000..a936f55 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/index.ts +@@ -0,0 +1,10 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as l1 from "./L1"; ++export * as l2 from "./L2"; ++export * as chugsplash from "./chugsplash"; ++export * as libraries from "./libraries"; ++export * as standards from "./standards"; ++export * as testHelpers from "./test-helpers"; ++export * as testLibraries from "./test-libraries"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/CrossDomainEnabled__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/CrossDomainEnabled__factory.ts +new file mode 100644 +index 0000000..d8efe91 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/CrossDomainEnabled__factory.ts +@@ -0,0 +1,92 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ CrossDomainEnabled, ++ CrossDomainEnabledInterface, ++} from "../../../../contracts/libraries/bridge/CrossDomainEnabled"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_messenger", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ inputs: [], ++ name: "messenger", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161011438038061011483398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6082806100926000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633cb747bf14602d575b600080fd5b600054604c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea164736f6c6343000809000a"; ++ ++type CrossDomainEnabledConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: CrossDomainEnabledConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class CrossDomainEnabled__factory extends ContractFactory { ++ constructor(...args: CrossDomainEnabledConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _messenger: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _messenger, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _messenger: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_messenger, overrides || {}); ++ } ++ override attach(address: string): CrossDomainEnabled { ++ return super.attach(address) as CrossDomainEnabled; ++ } ++ override connect(signer: Signer): CrossDomainEnabled__factory { ++ return super.connect(signer) as CrossDomainEnabled__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): CrossDomainEnabledInterface { ++ return new utils.Interface(_abi) as CrossDomainEnabledInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): CrossDomainEnabled { ++ return new Contract(address, _abi, signerOrProvider) as CrossDomainEnabled; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/ICrossDomainMessenger__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/ICrossDomainMessenger__factory.ts +new file mode 100644 +index 0000000..36f519f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/ICrossDomainMessenger__factory.ts +@@ -0,0 +1,129 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ ICrossDomainMessenger, ++ ICrossDomainMessengerInterface, ++} from "../../../../contracts/libraries/bridge/ICrossDomainMessenger"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "FailedRelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "bytes32", ++ name: "msgHash", ++ type: "bytes32", ++ }, ++ ], ++ name: "RelayedMessage", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "target", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "bytes", ++ name: "message", ++ type: "bytes", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "messageNonce", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ ], ++ name: "SentMessage", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint32", ++ name: "_gasLimit", ++ type: "uint32", ++ }, ++ ], ++ name: "sendMessage", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "xDomainMessageSender", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class ICrossDomainMessenger__factory { ++ static readonly abi = _abi; ++ static createInterface(): ICrossDomainMessengerInterface { ++ return new utils.Interface(_abi) as ICrossDomainMessengerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): ICrossDomainMessenger { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as ICrossDomainMessenger; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/index.ts +new file mode 100644 +index 0000000..067b2fa +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/bridge/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { CrossDomainEnabled__factory } from "./CrossDomainEnabled__factory"; ++export { ICrossDomainMessenger__factory } from "./ICrossDomainMessenger__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/index.ts +new file mode 100644 +index 0000000..fe872ec +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as bridge from "./bridge"; ++export * as resolver from "./resolver"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressManager__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressManager__factory.ts +new file mode 100644 +index 0000000..afdc6e8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressManager__factory.ts +@@ -0,0 +1,177 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ Lib_AddressManager, ++ Lib_AddressManagerInterface, ++} from "../../../../contracts/libraries/resolver/Lib_AddressManager"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_newAddress", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "address", ++ name: "_oldAddress", ++ type: "address", ++ }, ++ ], ++ name: "AddressSet", ++ 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", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "getAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "owner", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "renounceOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ internalType: "address", ++ name: "_address", ++ type: "address", ++ }, ++ ], ++ name: "setAddress", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106d98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046105e4565b610184565b6100906100da366004610632565b6102d0565b6100746100ed36600461066f565b61030c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610182600061043c565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b6000610210836104b1565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff000000000000000000000000000000000000000083161790925591519293501690610273908590610691565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006102df846104b1565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016f565b73ffffffffffffffffffffffffffffffffffffffff8116610430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016f565b6104398161043c565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016104c49190610691565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261052157600080fd5b813567ffffffffffffffff8082111561053c5761053c6104e1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610582576105826104e1565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105df57600080fd5b919050565b600080604083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b61061a85828601610510565b925050610629602084016105bb565b90509250929050565b60006020828403121561064457600080fd5b813567ffffffffffffffff81111561065b57600080fd5b61066784828501610510565b949350505050565b60006020828403121561068157600080fd5b61068a826105bb565b9392505050565b6000825160005b818110156106b25760208186018101518583015201610698565b818111156106c1576000828501525b50919091019291505056fea164736f6c6343000809000a"; ++ ++type Lib_AddressManagerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Lib_AddressManagerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Lib_AddressManager__factory extends ContractFactory { ++ constructor(...args: Lib_AddressManagerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): Lib_AddressManager { ++ return super.attach(address) as Lib_AddressManager; ++ } ++ override connect(signer: Signer): Lib_AddressManager__factory { ++ return super.connect(signer) as Lib_AddressManager__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Lib_AddressManagerInterface { ++ return new utils.Interface(_abi) as Lib_AddressManagerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Lib_AddressManager { ++ return new Contract(address, _abi, signerOrProvider) as Lib_AddressManager; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressResolver__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressResolver__factory.ts +new file mode 100644 +index 0000000..b5b7d4b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_AddressResolver__factory.ts +@@ -0,0 +1,58 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ Lib_AddressResolver, ++ Lib_AddressResolverInterface, ++} from "../../../../contracts/libraries/resolver/Lib_AddressResolver"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ name: "libAddressManager", ++ outputs: [ ++ { ++ internalType: "contract Lib_AddressManager", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ ], ++ name: "resolve", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++] as const; ++ ++export class Lib_AddressResolver__factory { ++ static readonly abi = _abi; ++ static createInterface(): Lib_AddressResolverInterface { ++ return new utils.Interface(_abi) as Lib_AddressResolverInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Lib_AddressResolver { ++ return new Contract(address, _abi, signerOrProvider) as Lib_AddressResolver; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy__factory.ts +new file mode 100644 +index 0000000..6d8062a +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy__factory.ts +@@ -0,0 +1,132 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ Lib_ResolvedDelegateBobaProxy, ++ Lib_ResolvedDelegateBobaProxyInterface, ++} from "../../../../contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_proxyTarget", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ stateMutability: "payable", ++ type: "fallback", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ name: "addressManager", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_proxyTarget", ++ type: "address", ++ }, ++ ], ++ name: "setTargetContract", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_newOwner", ++ type: "address", ++ }, ++ ], ++ name: "transferProxyOwnership", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161070e38038061070e83398101604081905261002f916100af565b806000604051610050906a1c1c9bde1e55185c99d95d60aa1b8152600b0190565b9081526040805191829003602001822080546001600160a01b03949094166001600160a01b031994851617905569383937bc3ca7bbb732b960b11b82526000600a8301525190819003602a0190208054339216919091179055506100df565b6000602082840312156100c157600080fd5b81516001600160a01b03811681146100d857600080fd5b9392505050565b610620806100ee6000396000f3fe6080604052600436106100345760003560e01c806312762d5e1461003e57806347fc822f146100b5578063f1739cae146100d5575b61003c6100f5565b005b34801561004a57600080fd5b5061008c6100593660046104f7565b805160208183018101805160008252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c157600080fd5b5061003c6100d03660046105c6565b6102a7565b3480156100e157600080fd5b5061003c6100f03660046105c6565b610397565b6040517f70726f78794f776e65720000000000000000000000000000000000000000000081526000908190600a019081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff1614156101dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000806000604051610211907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b9081526040519081900360200181205473ffffffffffffffffffffffffffffffffffffffff1690610246906000903690610603565b600060405180830381855af49150503d8060008114610281576040519150601f19603f3d011682016040523d82523d6000602084013e610286565b606091505b5090925090506001821515141561029f57805160208201f35b805160208201fd5b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c57806000604051610335907f70726f78795461726765740000000000000000000000000000000000000000008152600b0190565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905550565b6103946100f5565b50565b6040517f70726f78794f776e6572000000000000000000000000000000000000000000008152600090600a01908152604051908190036020019020543373ffffffffffffffffffffffffffffffffffffffff909116141561038c5773ffffffffffffffffffffffffffffffffffffffff8116610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646460448201527f726573732e00000000000000000000000000000000000000000000000000000060648201526084016101d3565b806000604051610335907f70726f78794f776e6572000000000000000000000000000000000000000000008152600a0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561050957600080fd5b813567ffffffffffffffff8082111561052157600080fd5b818401915084601f83011261053557600080fd5b813581811115610547576105476104c8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561058d5761058d6104c8565b816040528281528760208487010111156105a657600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156105d857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105fc57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a"; ++ ++type Lib_ResolvedDelegateBobaProxyConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Lib_ResolvedDelegateBobaProxyConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Lib_ResolvedDelegateBobaProxy__factory extends ContractFactory { ++ constructor(...args: Lib_ResolvedDelegateBobaProxyConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _proxyTarget, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _proxyTarget: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(_proxyTarget, overrides || {}); ++ } ++ override attach(address: string): Lib_ResolvedDelegateBobaProxy { ++ return super.attach(address) as Lib_ResolvedDelegateBobaProxy; ++ } ++ override connect(signer: Signer): Lib_ResolvedDelegateBobaProxy__factory { ++ return super.connect(signer) as Lib_ResolvedDelegateBobaProxy__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Lib_ResolvedDelegateBobaProxyInterface { ++ return new utils.Interface(_abi) as Lib_ResolvedDelegateBobaProxyInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Lib_ResolvedDelegateBobaProxy { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as Lib_ResolvedDelegateBobaProxy; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateProxy__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateProxy__factory.ts +new file mode 100644 +index 0000000..e603374 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/Lib_ResolvedDelegateProxy__factory.ts +@@ -0,0 +1,99 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ Lib_ResolvedDelegateProxy, ++ Lib_ResolvedDelegateProxyInterface, ++} from "../../../../contracts/libraries/resolver/Lib_ResolvedDelegateProxy"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_libAddressManager", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_implementationName", ++ type: "string", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ stateMutability: "payable", ++ type: "fallback", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5060405161058c38038061058c83398101604081905261002f91610125565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b038716179055828252909120825161006e92840190610076565b505050610252565b82805461008290610217565b90600052602060002090601f0160209004810192826100a457600085556100ea565b82601f106100bd57805160ff19168380011785556100ea565b828001600101855582156100ea579182015b828111156100ea5782518255916020019190600101906100cf565b506100f69291506100fa565b5090565b5b808211156100f657600081556001016100fb565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561013857600080fd5b82516001600160a01b038116811461014f57600080fd5b602084810151919350906001600160401b038082111561016e57600080fd5b818601915086601f83011261018257600080fd5b8151818111156101945761019461010f565b604051601f8201601f19908116603f011681019083821181831017156101bc576101bc61010f565b8160405282815289868487010111156101d457600080fd5b600093505b828410156101f657848401860151818501870152928501926101d9565b828411156102075760008684830101525b8096505050505050509250929050565b600181811c9082168061022b57607f821691505b6020821081141561024c57634e487b7160e01b600052602260045260246000fd5b50919050565b61032b806102616000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101f2565b60206040518083038186803b15801561008557600080fd5b505afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906102d1565b905073ffffffffffffffffffffffffffffffffffffffff8116610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5461726765742061646472657373206d75737420626520696e697469616c697a60448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161019192919061030e565b600060405180830381855af49150503d80600081146101cc576040519150601f19603f3d011682016040523d82523d6000602084013e6101d1565b606091505b509092509050600182151514156101ea57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061021457607f831692505b85831081141561024b577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156102685760018114610297576102c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825287820196506102c2565b60008b81526020902060005b868110156102bc578154848201529085019089016102a3565b83019750505b50949998505050505050505050565b6000602082840312156102e357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461030757600080fd5b9392505050565b818382376000910190815291905056fea164736f6c6343000809000a"; ++ ++type Lib_ResolvedDelegateProxyConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Lib_ResolvedDelegateProxyConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Lib_ResolvedDelegateProxy__factory extends ContractFactory { ++ constructor(...args: Lib_ResolvedDelegateProxyConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _libAddressManager: PromiseOrValue, ++ _implementationName: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _libAddressManager, ++ _implementationName, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _libAddressManager: PromiseOrValue, ++ _implementationName: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _libAddressManager, ++ _implementationName, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): Lib_ResolvedDelegateProxy { ++ return super.attach(address) as Lib_ResolvedDelegateProxy; ++ } ++ override connect(signer: Signer): Lib_ResolvedDelegateProxy__factory { ++ return super.connect(signer) as Lib_ResolvedDelegateProxy__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Lib_ResolvedDelegateProxyInterface { ++ return new utils.Interface(_abi) as Lib_ResolvedDelegateProxyInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Lib_ResolvedDelegateProxy { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as Lib_ResolvedDelegateProxy; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/index.ts +new file mode 100644 +index 0000000..194869b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/libraries/resolver/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { Lib_AddressManager__factory } from "./Lib_AddressManager__factory"; ++export { Lib_AddressResolver__factory } from "./Lib_AddressResolver__factory"; ++export { Lib_ResolvedDelegateBobaProxy__factory } from "./Lib_ResolvedDelegateBobaProxy__factory"; ++export { Lib_ResolvedDelegateProxy__factory } from "./Lib_ResolvedDelegateProxy__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/IL2StandardERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/IL2StandardERC20__factory.ts +new file mode 100644 +index 0000000..a4da4af +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/IL2StandardERC20__factory.ts +@@ -0,0 +1,315 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++ ++import { Contract, Signer, utils } from "ethers"; ++import type { Provider } from "@ethersproject/providers"; ++import type { ++ IL2StandardERC20, ++ IL2StandardERC20Interface, ++} from "../../../contracts/standards/IL2StandardERC20"; ++ ++const _abi = [ ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++export class IL2StandardERC20__factory { ++ static readonly abi = _abi; ++ static createInterface(): IL2StandardERC20Interface { ++ return new utils.Interface(_abi) as IL2StandardERC20Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): IL2StandardERC20 { ++ return new Contract(address, _abi, signerOrProvider) as IL2StandardERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2GovernanceERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2GovernanceERC20__factory.ts +new file mode 100644 +index 0000000..65fcdfc +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2GovernanceERC20__factory.ts +@@ -0,0 +1,895 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ L2GovernanceERC20, ++ L2GovernanceERC20Interface, ++} from "../../../contracts/standards/L2GovernanceERC20"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Bridge", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ internalType: "string", ++ name: "_symbol", ++ type: "string", ++ }, ++ { ++ internalType: "uint8", ++ name: "decimals_", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegator", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "fromDelegate", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "toDelegate", ++ type: "address", ++ }, ++ ], ++ name: "DelegateChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "delegate", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "previousBalance", ++ type: "uint256", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "newBalance", ++ type: "uint256", ++ }, ++ ], ++ name: "DelegateVotesChanged", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [], ++ name: "DOMAIN_SEPARATOR", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "OFFSET", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint32", ++ name: "pos", ++ type: "uint32", ++ }, ++ ], ++ name: "checkpoints", ++ outputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint32", ++ name: "fromBlock", ++ type: "uint32", ++ }, ++ { ++ internalType: "uint224", ++ name: "votes", ++ type: "uint224", ++ }, ++ ], ++ internalType: "struct ERC20Votes.Checkpoint", ++ name: "", ++ type: "tuple", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ ], ++ name: "delegate", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "delegatee", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "nonce", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "expiry", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "delegateBySig", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "delegates", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getCurrentVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastTotalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPastVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ ], ++ name: "getPriorVotes", ++ outputs: [ ++ { ++ internalType: "uint96", ++ name: "", ++ type: "uint96", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "getVotes", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2Bridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "maxSupply", ++ outputs: [ ++ { ++ internalType: "uint224", ++ name: "", ++ type: "uint224", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ ], ++ name: "nonces", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "numCheckpoints", ++ outputs: [ ++ { ++ internalType: "uint32", ++ name: "", ++ type: "uint32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "deadline", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint8", ++ name: "v", ++ type: "uint8", ++ }, ++ { ++ internalType: "bytes32", ++ name: "r", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "s", ++ type: "bytes32", ++ }, ++ ], ++ name: "permit", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "_interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162002986380380620029868339810160408190526200005a9162000302565b8280604051806040016040528060018152602001603160f81b815250858581600390805190602001906200009092919062000172565b508051620000a690600490602084019062000172565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a01819052818301989098526060810195909552608080860193909352308583015280518086039092018252939092019092528051940193909320909252610100525050600980546001600160a01b039586166001600160a01b031991821617909155600a805496909516951694909417909255505060ff1661014052620003eb565b8280546200018090620003ae565b90600052602060002090601f016020900481019282620001a45760008555620001ef565b82601f10620001bf57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ef578251825591602001919060010190620001d2565b50620001fd92915062000201565b5090565b5b80821115620001fd576000815560010162000202565b80516001600160a01b03811681146200023057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200025d57600080fd5b81516001600160401b03808211156200027a576200027a62000235565b604051601f8301601f19908116603f01168101908282118183101715620002a557620002a562000235565b81604052838152602092508683858801011115620002c257600080fd5b600091505b83821015620002e65785820183015181830184015290820190620002c7565b83821115620002f85760008385830101525b9695505050505050565b600080600080600060a086880312156200031b57600080fd5b620003268662000218565b9450620003366020870162000218565b60408701519094506001600160401b03808211156200035457600080fd5b6200036289838a016200024b565b945060608801519150808211156200037957600080fd5b5062000388888289016200024b565b925050608086015160ff81168114620003a057600080fd5b809150509295509295909350565b600181811c90821680620003c357607f821691505b60208210811415620003e557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516101405161254062000446600039600061026601526000610d6b015260006112e5015260006113340152600061130f01526000611293015260006112bc01526125406000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80637ecebe001161010f578063b4b5ea57116100a2578063d505accf11610071578063d505accf14610479578063d5abeb011461048c578063dd62ed3e146104cc578063f1127ed81461050557600080fd5b8063b4b5ea5714610438578063c01e1bd61461044b578063c3cda5201461045e578063ce665dd81461047157600080fd5b80639dc29fac116100de5780639dc29fac146103ec578063a457c2d7146103ff578063a9059cbb14610412578063ae1f6aaf1461042557600080fd5b80637ecebe00146103ab5780638e539e8c146103be57806395d89b41146103d15780639ab24eb0146103d957600080fd5b806339509351116101875780635c19a95c116101565780635c19a95c146103175780636fcfff451461032a57806370a0823114610352578063782d6fe11461037b57600080fd5b806339509351146102985780633a46b1a8146102ab57806340c10f19146102be578063587cde1e146102d357600080fd5b806318160ddd116101c357806318160ddd1461023a57806323b872dd1461024c578063313ce5671461025f5780633644e5151461029057600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063095ea7b314610227575b600080fd5b6101fd6101f836600461213d565b610557565b60405190151581526020015b60405180910390f35b61021a610617565b604051610209919061217f565b6101fd61023536600461220e565b6106a9565b6002545b604051908152602001610209565b6101fd61025a366004612238565b6106bf565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610209565b61023e610783565b6101fd6102a636600461220e565b610792565b61023e6102b936600461220e565b6107ce565b6102d16102cc36600461220e565b610848565b005b6102ff6102e1366004612274565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b039091168152602001610209565b6102d1610325366004612274565b6108f3565b61033d610338366004612274565b610900565b60405163ffffffff9091168152602001610209565b61023e610360366004612274565b6001600160a01b031660009081526020819052604090205490565b61038e61038936600461220e565b610928565b6040516bffffffffffffffffffffffff9091168152602001610209565b61023e6103b9366004612274565b61093c565b61023e6103cc36600461228f565b61095a565b61021a6109b6565b61023e6103e7366004612274565b6109c5565b6102d16103fa36600461220e565b610a76565b6101fd61040d36600461220e565b610b15565b6101fd61042036600461220e565b610bc6565b600a546102ff906001600160a01b031681565b61038e610446366004612274565b610bd3565b6009546102ff906001600160a01b031681565b6102d161046c3660046122b9565b610be1565b61023e600081565b6102d1610487366004612311565b610d17565b61049f6b019d971e4fe8401e7400000081565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b61023e6104da36600461237b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6105186105133660046123ae565b610e7b565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169281019290925201610209565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061060f57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b606060038054610626906123ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610652906123ee565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b6338484610f14565b50600192915050565b60006106cc84848461106c565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561076b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6107788533858403610f14565b506001949350505050565b600061078d61128f565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106b69185906107c990869061246b565b610f14565b600043821061081f5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b6001600160a01b03831660009081526007602052604090206108419083611382565b9392505050565b600a546001600160a01b031633146108a25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b6108ac8282611476565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516108e791815260200190565b60405180910390a25050565b6108fd3382611484565b50565b6001600160a01b03811660009081526007602052604081205461092290611515565b92915050565b600061084161093784846107ce565b611595565b6001600160a01b038116600090815260056020526040812054610922565b60004382106109ab5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610762565b610922600883611382565b606060048054610626906123ee565b6001600160a01b0381166000908152600760205260408120548015610a4e576001600160a01b0383166000908152600760205260409020610a07600183612483565b81548110610a1757610a1761249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a51565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b600a546001600160a01b03163314610ad05760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e6044820152606401610762565b610ada8282611619565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516108e791815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610baf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610762565b610bbc3385858403610f14565b5060019392505050565b60006106b633848461106c565b6000610922610937836109c5565b83421115610c315760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610762565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610cab90610ca39060a00160405160208183030381529060405280519060200120611623565b85858561168c565b9050610cb6816116b4565b8614610d045760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610762565b610d0e8188611484565b50505050505050565b83421115610d675760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610762565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610d968c6116b4565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610df182611623565b90506000610e018287878761168c565b9050896001600160a01b0316816001600160a01b031614610e645760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610762565b610e6f8a8a8a610f14565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110610ebf57610ebf61249a565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b6001600160a01b038316610f8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b03821661100b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0382166111645760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038316600090815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061122a90849061246b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161127691815260200190565b60405180910390a36112898484846116e1565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156112de57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061138e818361246b565b835490925060005b818110156113f35760006113aa82846116ec565b9050848682815481106113bf576113bf61249a565b60009182526020909120015463ffffffff1611156113df578092506113ed565b6113ea81600161246b565b91505b50611396565b811561144c5784611405600184612483565b815481106114155761141561249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661144f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b6114808282611707565b5050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112898284836117a3565b600063ffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b5090565b60006bffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610762565b61148082826118e0565b600061092261163061128f565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061169d878787876118f8565b915091506116aa81611a03565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b505050565b6116dc838383611bf4565b60006116fb60028484186124c9565b6108419084841661246b565b6117118282611c26565b6002546b019d971e4fe8401e7400000010156117955760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610762565b6112896008611d0d83611d19565b816001600160a01b0316836001600160a01b0316141580156117c55750600081115b156116dc576001600160a01b03831615611853576001600160a01b0383166000908152600760205260408120819061180090611f1185611d19565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611848929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156116dc576001600160a01b0382166000908152600760205260408120819061188990611d0d85611d19565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516118d1929190918252602082015260400190565b60405180910390a25050505050565b6118ea8282611f1d565b6112896008611f1183611d19565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561192f57506000905060036119fa565b8460ff16601b1415801561194757508460ff16601c14155b1561195857506000905060046119fa565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119ac573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166119f3576000600192509250506119fa565b9150600090505b94509492505050565b6000816004811115611a1757611a17612504565b1415611a205750565b6001816004811115611a3457611a34612504565b1415611a825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610762565b6002816004811115611a9657611a96612504565b1415611ae45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610762565b6003816004811115611af857611af8612504565b1415611b6c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6004816004811115611b8057611b80612504565b14156108fd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038381166000908152600660205260408082205485841683529120546116dc929182169116836117a3565b6001600160a01b038216611c7c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610762565b8060026000828254611c8e919061246b565b90915550506001600160a01b03821660009081526020819052604081208054839290611cbb90849061246b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611480600083836116e1565b6000610841828461246b565b825460009081908015611d795785611d32600183612483565b81548110611d4257611d4261249a565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611d7c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611daa83858763ffffffff16565b9150600081118015611df25750611dc260004361246b565b86611dce600184612483565b81548110611dde57611dde61249a565b60009182526020909120015463ffffffff16145b15611e7c57611e00826120a9565b86611e0c600184612483565b81548110611e1c57611e1c61249a565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611f08565b856040518060400160405280611e9d600043611e98919061246b565b611515565b63ffffffff168152602001611eb1856120a9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60006108418284612483565b6001600160a01b038216611f995760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b038216600090815260208190526040902054818110156120285760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610762565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612057908490612483565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36116dc836000846116e1565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156115915760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610762565b60006020828403121561214f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084157600080fd5b600060208083528351808285015260005b818110156121ac57858101830151858201604001528201612190565b818111156121be576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b038116811461220957600080fd5b919050565b6000806040838503121561222157600080fd5b61222a836121f2565b946020939093013593505050565b60008060006060848603121561224d57600080fd5b612256846121f2565b9250612264602085016121f2565b9150604084013590509250925092565b60006020828403121561228657600080fd5b610841826121f2565b6000602082840312156122a157600080fd5b5035919050565b803560ff8116811461220957600080fd5b60008060008060008060c087890312156122d257600080fd5b6122db876121f2565b955060208701359450604087013593506122f7606088016122a8565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561232c57600080fd5b612335886121f2565b9650612343602089016121f2565b9550604088013594506060880135935061235f608089016122a8565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561238e57600080fd5b612397836121f2565b91506123a5602084016121f2565b90509250929050565b600080604083850312156123c157600080fd5b6123ca836121f2565b9150602083013563ffffffff811681146123e357600080fd5b809150509250929050565b600181811c9082168061240257607f821691505b602082108114156116d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561247e5761247e61243c565b500190565b6000828210156124955761249561243c565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826124ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000809000a"; ++ ++type L2GovernanceERC20ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2GovernanceERC20ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2GovernanceERC20__factory extends ContractFactory { ++ constructor(...args: L2GovernanceERC20ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): L2GovernanceERC20 { ++ return super.attach(address) as L2GovernanceERC20; ++ } ++ override connect(signer: Signer): L2GovernanceERC20__factory { ++ return super.connect(signer) as L2GovernanceERC20__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2GovernanceERC20Interface { ++ return new utils.Interface(_abi) as L2GovernanceERC20Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2GovernanceERC20 { ++ return new Contract(address, _abi, signerOrProvider) as L2GovernanceERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2StandardERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2StandardERC20__factory.ts +new file mode 100644 +index 0000000..915cd3d +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/L2StandardERC20__factory.ts +@@ -0,0 +1,514 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { ++ Signer, ++ utils, ++ Contract, ++ ContractFactory, ++ BigNumberish, ++ Overrides, ++} from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ L2StandardERC20, ++ L2StandardERC20Interface, ++} from "../../../contracts/standards/L2StandardERC20"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_l2Bridge", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_l1Token", ++ type: "address", ++ }, ++ { ++ internalType: "string", ++ name: "_name", ++ type: "string", ++ }, ++ { ++ internalType: "string", ++ name: "_symbol", ++ type: "string", ++ }, ++ { ++ internalType: "uint8", ++ name: "decimals_", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Burn", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "_account", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "Mint", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "account", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_from", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "burn", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "subtractedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "decreaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "addedValue", ++ type: "uint256", ++ }, ++ ], ++ name: "increaseAllowance", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l1Token", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "l2Bridge", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "_amount", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes4", ++ name: "_interfaceId", ++ type: "bytes4", ++ }, ++ ], ++ name: "supportsInterface", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "sender", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "recipient", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "amount", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x60a06040523480156200001157600080fd5b50604051620013fd380380620013fd833981016040819052620000349162000234565b8251839083906200004d906003906020850190620000a4565b50805162000063906004906020840190620000a4565b5050600580546001600160a01b039687166001600160a01b0319918216179091556006805497909616961695909517909355505060ff16608052506200031d565b828054620000b290620002e0565b90600052602060002090601f016020900481019282620000d6576000855562000121565b82601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b5b808211156200012f576000815560010162000134565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018f57600080fd5b81516001600160401b0380821115620001ac57620001ac62000167565b604051601f8301601f19908116603f01168101908282118183101715620001d757620001d762000167565b81604052838152602092508683858801011115620001f457600080fd5b600091505b83821015620002185785820183015181830184015290820190620001f9565b838211156200022a5760008385830101525b9695505050505050565b600080600080600060a086880312156200024d57600080fd5b62000258866200014a565b945062000268602087016200014a565b60408701519094506001600160401b03808211156200028657600080fd5b6200029489838a016200017d565b94506060880151915080821115620002ab57600080fd5b50620002ba888289016200017d565b925050608086015160ff81168114620002d257600080fd5b809150509295509295909350565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516110c462000339600039600061018101526110c46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610237578063ae1f6aaf1461024a578063c01e1bd61461028f578063dd62ed3e146102af57600080fd5b806370a08231146101d357806395d89b41146102095780639dc29fac14610211578063a457c2d71461022457600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a57806339509351146101ab57806340c10f19146101be57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e6c565b6102f5565b60405190151581526020015b60405180910390f35b6101356103b5565b6040516101249190610eb5565b610118610150366004610f51565b610447565b6002545b604051908152602001610124565b610118610175366004610f7b565b61045d565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610124565b6101186101b9366004610f51565b61052e565b6101d16101cc366004610f51565b610577565b005b6101596101e1366004610fb7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561063c565b6101d161021f366004610f51565b61064b565b610118610232366004610f51565b610704565b610118610245366004610f51565b6107c2565b60065461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b60055461026a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101596102bd366004610fd2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a70000000000000000000000000000000000000000000000000000000014806103ad57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103c490611005565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611005565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60006104543384846107cf565b50600192915050565b600061046a84848461094f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156105165760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052385338584036107cf565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610454918590610572908690611088565b6107cf565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105de5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6105e88282610bb5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161063091815260200190565b60405180910390a25050565b6060600480546103c490611005565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106b25760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e604482015260640161050d565b6106bc8282610cbb565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161063091815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161050d565b6107b833858584036107cf565b5060019392505050565b600061045433848461094f565b73ffffffffffffffffffffffffffffffffffffffff83166108575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff82166108e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff8216610a615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b41908490611088565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ba791815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161050d565b8060026000828254610c2a9190611088565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c64908490611088565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610de05760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161050d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610e1c9084906110a0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610942565b600060208284031215610e7e57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ee257858101830151858201604001528201610ec6565b81811115610ef4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b919050565b60008060408385031215610f6457600080fd5b610f6d83610f28565b946020939093013593505050565b600080600060608486031215610f9057600080fd5b610f9984610f28565b9250610fa760208501610f28565b9150604084013590509250925092565b600060208284031215610fc957600080fd5b610eae82610f28565b60008060408385031215610fe557600080fd5b610fee83610f28565b9150610ffc60208401610f28565b90509250929050565b600181811c9082168061101957607f821691505b60208210811415611053577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561109b5761109b611059565b500190565b6000828210156110b2576110b2611059565b50039056fea164736f6c6343000809000a"; ++ ++type L2StandardERC20ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: L2StandardERC20ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class L2StandardERC20__factory extends ContractFactory { ++ constructor(...args: L2StandardERC20ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ) as Promise; ++ } ++ override getDeployTransaction( ++ _l2Bridge: PromiseOrValue, ++ _l1Token: PromiseOrValue, ++ _name: PromiseOrValue, ++ _symbol: PromiseOrValue, ++ decimals_: PromiseOrValue, ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction( ++ _l2Bridge, ++ _l1Token, ++ _name, ++ _symbol, ++ decimals_, ++ overrides || {} ++ ); ++ } ++ override attach(address: string): L2StandardERC20 { ++ return super.attach(address) as L2StandardERC20; ++ } ++ override connect(signer: Signer): L2StandardERC20__factory { ++ return super.connect(signer) as L2StandardERC20__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): L2StandardERC20Interface { ++ return new utils.Interface(_abi) as L2StandardERC20Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): L2StandardERC20 { ++ return new Contract(address, _abi, signerOrProvider) as L2StandardERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/index.ts +new file mode 100644 +index 0000000..987f50f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/standards/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { IL2StandardERC20__factory } from "./IL2StandardERC20__factory"; ++export { L2GovernanceERC20__factory } from "./L2GovernanceERC20__factory"; ++export { L2StandardERC20__factory } from "./L2StandardERC20__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_GasMeasurer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_GasMeasurer__factory.ts +new file mode 100644 +index 0000000..46ca4d6 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_GasMeasurer__factory.ts +@@ -0,0 +1,87 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ Helper_GasMeasurer, ++ Helper_GasMeasurerInterface, ++} from "../../../contracts/test-helpers/Helper_GasMeasurer"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_data", ++ type: "bytes", ++ }, ++ ], ++ name: "measureCallGas", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506102b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063df0495a114610030575b600080fd5b61004361003e366004610172565b610055565b60405190815260200160405180910390f35b8051600090819081906020850190825a9450600080838560008c5af190505a93508061012d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f43616c6c206661696c65642c206275742063616c6c732077652077616e74207460448201527f6f206d6561737572652067617320666f722073686f756c64207375636365656460648201527f2100000000000000000000000000000000000000000000000000000000000000608482015260a40160405180910390fd5b610137848661026d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561018557600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146101a957600080fd5b9150602083013567ffffffffffffffff808211156101c657600080fd5b818501915085601f8301126101da57600080fd5b8135818111156101ec576101ec610143565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561023257610232610143565b8160405282815288602084870101111561024b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000828210156102a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c6343000809000a"; ++ ++type Helper_GasMeasurerConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Helper_GasMeasurerConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Helper_GasMeasurer__factory extends ContractFactory { ++ constructor(...args: Helper_GasMeasurerConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): Helper_GasMeasurer { ++ return super.attach(address) as Helper_GasMeasurer; ++ } ++ override connect(signer: Signer): Helper_GasMeasurer__factory { ++ return super.connect(signer) as Helper_GasMeasurer__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Helper_GasMeasurerInterface { ++ return new utils.Interface(_abi) as Helper_GasMeasurerInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Helper_GasMeasurer { ++ return new Contract(address, _abi, signerOrProvider) as Helper_GasMeasurer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_SimpleProxy__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_SimpleProxy__factory.ts +new file mode 100644 +index 0000000..74ba5c4 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/Helper_SimpleProxy__factory.ts +@@ -0,0 +1,85 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ Helper_SimpleProxy, ++ Helper_SimpleProxyInterface, ++} from "../../../contracts/test-helpers/Helper_SimpleProxy"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ stateMutability: "nonpayable", ++ type: "fallback", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ ], ++ name: "setTarget", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50600080546001600160a01b0319163317905561025e806100326000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063776d1a0114610084575b60015460408051602036601f81018290048202830182019093528282526100829373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b005b6100826100923660046101d9565b61011c565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516100bf9190610216565b6000604051808303816000865af19150503d80600081146100fc576040519150601f19603f3d011682016040523d82523d6000602084013e610101565b606091505b5091509150811561011457805160208201f35b805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633141561017f57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b60015460408051602036601f81018290048202830182019093528282526101d69373ffffffffffffffffffffffffffffffffffffffff16926000918190840183828082843760009201919091525061009792505050565b50565b6000602082840312156101eb57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020f57600080fd5b9392505050565b6000825160005b81811015610237576020818601810151858301520161021d565b81811115610246576000828501525b50919091019291505056fea164736f6c6343000809000a"; ++ ++type Helper_SimpleProxyConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: Helper_SimpleProxyConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class Helper_SimpleProxy__factory extends ContractFactory { ++ constructor(...args: Helper_SimpleProxyConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): Helper_SimpleProxy { ++ return super.attach(address) as Helper_SimpleProxy; ++ } ++ override connect(signer: Signer): Helper_SimpleProxy__factory { ++ return super.connect(signer) as Helper_SimpleProxy__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): Helper_SimpleProxyInterface { ++ return new utils.Interface(_abi) as Helper_SimpleProxyInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): Helper_SimpleProxy { ++ return new Contract(address, _abi, signerOrProvider) as Helper_SimpleProxy; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/TestERC20__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/TestERC20__factory.ts +new file mode 100644 +index 0000000..b9d0a42 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/TestERC20__factory.ts +@@ -0,0 +1,308 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../common"; ++import type { ++ TestERC20, ++ TestERC20Interface, ++} from "../../../contracts/test-helpers/TestERC20"; ++ ++const _abi = [ ++ { ++ inputs: [], ++ stateMutability: "nonpayable", ++ type: "constructor", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "owner", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Approval", ++ type: "event", ++ }, ++ { ++ anonymous: false, ++ inputs: [ ++ { ++ indexed: true, ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ indexed: true, ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ indexed: false, ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "Transfer", ++ type: "event", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "allowance", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "spender", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "approve", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ name: "balanceOf", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "decimals", ++ outputs: [ ++ { ++ internalType: "uint8", ++ name: "", ++ type: "uint8", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "mint", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "name", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "symbol", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "totalSupply", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "transfer", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "from", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "to", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "value", ++ type: "uint256", ++ }, ++ ], ++ name: "transferFrom", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000a"; ++ ++type TestERC20ConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestERC20ConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestERC20__factory extends ContractFactory { ++ constructor(...args: TestERC20ConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestERC20 { ++ return super.attach(address) as TestERC20; ++ } ++ override connect(signer: Signer): TestERC20__factory { ++ return super.connect(signer) as TestERC20__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestERC20Interface { ++ return new utils.Interface(_abi) as TestERC20Interface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestERC20 { ++ return new Contract(address, _abi, signerOrProvider) as TestERC20; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/index.ts +new file mode 100644 +index 0000000..3be56f2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-helpers/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { Helper_GasMeasurer__factory } from "./Helper_GasMeasurer__factory"; ++export { Helper_SimpleProxy__factory } from "./Helper_SimpleProxy__factory"; ++export { TestERC20__factory } from "./TestERC20__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/TestLib_CrossDomainUtils__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/TestLib_CrossDomainUtils__factory.ts +new file mode 100644 +index 0000000..dbc3057 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/TestLib_CrossDomainUtils__factory.ts +@@ -0,0 +1,101 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_CrossDomainUtils, ++ TestLib_CrossDomainUtilsInterface, ++} from "../../../../contracts/test-libraries/bridge/TestLib_CrossDomainUtils"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_target", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "_sender", ++ type: "address", ++ }, ++ { ++ internalType: "bytes", ++ name: "_message", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_messageNonce", ++ type: "uint256", ++ }, ++ ], ++ name: "encodeXDomainCalldata", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x61033f61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063053156471461003a575b600080fd5b61004d61004836600461016b565b610063565b60405161005a91906102ce565b60405180910390f35b60606100718585858561007a565b95945050505050565b60608484848460405160240161009394939291906102e8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461013757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561018157600080fd5b61018a85610113565b935061019860208601610113565b9250604085013567ffffffffffffffff808211156101b557600080fd5b818701915087601f8301126101c957600080fd5b8135818111156101db576101db61013c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102215761022161013c565b816040528281528a602084870101111561023a57600080fd5b826020860160208301376000928101602001929092525095989497509495606001359450505050565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006102e16020830184610263565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526103216080830185610263565b90508260608301529594505050505056fea164736f6c6343000809000a"; ++ ++type TestLib_CrossDomainUtilsConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_CrossDomainUtilsConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_CrossDomainUtils__factory extends ContractFactory { ++ constructor(...args: TestLib_CrossDomainUtilsConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_CrossDomainUtils { ++ return super.attach(address) as TestLib_CrossDomainUtils; ++ } ++ override connect(signer: Signer): TestLib_CrossDomainUtils__factory { ++ return super.connect(signer) as TestLib_CrossDomainUtils__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_CrossDomainUtilsInterface { ++ return new utils.Interface(_abi) as TestLib_CrossDomainUtilsInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_CrossDomainUtils { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as TestLib_CrossDomainUtils; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/index.ts +new file mode 100644 +index 0000000..4d25220 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/bridge/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_CrossDomainUtils__factory } from "./TestLib_CrossDomainUtils__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/TestLib_OVMCodec__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/TestLib_OVMCodec__factory.ts +new file mode 100644 +index 0000000..64e115c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/TestLib_OVMCodec__factory.ts +@@ -0,0 +1,175 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_OVMCodec, ++ TestLib_OVMCodecInterface, ++} from "../../../../contracts/test-libraries/codec/TestLib_OVMCodec"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "timestamp", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ { ++ internalType: "enum Lib_OVMCodec.QueueOrigin", ++ name: "l1QueueOrigin", ++ type: "uint8", ++ }, ++ { ++ internalType: "address", ++ name: "l1TxOrigin", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "entrypoint", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "data", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.Transaction", ++ name: "_transaction", ++ type: "tuple", ++ }, ++ ], ++ name: "encodeTransaction", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_encoded", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ components: [ ++ { ++ internalType: "uint256", ++ name: "timestamp", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "blockNumber", ++ type: "uint256", ++ }, ++ { ++ internalType: "enum Lib_OVMCodec.QueueOrigin", ++ name: "l1QueueOrigin", ++ type: "uint8", ++ }, ++ { ++ internalType: "address", ++ name: "l1TxOrigin", ++ type: "address", ++ }, ++ { ++ internalType: "address", ++ name: "entrypoint", ++ type: "address", ++ }, ++ { ++ internalType: "uint256", ++ name: "gasLimit", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes", ++ name: "data", ++ type: "bytes", ++ }, ++ ], ++ internalType: "struct Lib_OVMCodec.Transaction", ++ name: "_transaction", ++ type: "tuple", ++ }, ++ ], ++ name: "hashTransaction", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "_hash", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061043d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633170de2a1461003b578063a3e6d2fc14610061575b600080fd5b61004e610049366004610242565b610081565b6040519081526020015b60405180910390f35b61007461006f366004610242565b610092565b6040516100589190610330565b600061008c8261009d565b92915050565b606061008c826100b6565b60006100a8826100b6565b805190602001209050919050565b6060816000015182602001518360400151846060015185608001518660a001518760c001516040516020016100f19796959493929190610381565b6040516020818303038152906040529050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561015957610159610107565b60405290565b80356002811061016e57600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461016e57600080fd5b600082601f8301126101a857600080fd5b813567ffffffffffffffff808211156101c3576101c3610107565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561020957610209610107565b8160405283815286602085880101111561022257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561025457600080fd5b813567ffffffffffffffff8082111561026c57600080fd5b9083019060e0828603121561028057600080fd5b610288610136565b82358152602083013560208201526102a26040840161015f565b60408201526102b360608401610173565b60608201526102c460808401610173565b608082015260a083013560a082015260c0830135828111156102e557600080fd5b6102f187828601610197565b60c08301525095945050505050565b60005b8381101561031b578181015183820152602001610303565b8381111561032a576000848401525b50505050565b602081526000825180602084015261034f816040850160208701610300565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8781528660208201526000600287106103c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8660f81b60408301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808760601b166041840152808660601b16605584015250836069830152825161041d816089850160208701610300565b919091016089019897505050505050505056fea164736f6c6343000809000a"; ++ ++type TestLib_OVMCodecConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_OVMCodecConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_OVMCodec__factory extends ContractFactory { ++ constructor(...args: TestLib_OVMCodecConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_OVMCodec { ++ return super.attach(address) as TestLib_OVMCodec; ++ } ++ override connect(signer: Signer): TestLib_OVMCodec__factory { ++ return super.connect(signer) as TestLib_OVMCodec__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_OVMCodecInterface { ++ return new utils.Interface(_abi) as TestLib_OVMCodecInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_OVMCodec { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_OVMCodec; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/index.ts +new file mode 100644 +index 0000000..22b5cd5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/codec/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_OVMCodec__factory } from "./TestLib_OVMCodec__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/index.ts +new file mode 100644 +index 0000000..4e1a65f +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/index.ts +@@ -0,0 +1,9 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as bridge from "./bridge"; ++export * as codec from "./codec"; ++export * as rlp from "./rlp"; ++export * as standards from "./standards"; ++export * as trie from "./trie"; ++export * as utils from "./utils"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPReader__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPReader__factory.ts +new file mode 100644 +index 0000000..4d9ead1 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPReader__factory.ts +@@ -0,0 +1,196 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_RLPReader, ++ TestLib_RLPReaderInterface, ++} from "../../../../contracts/test-libraries/rlp/TestLib_RLPReader"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readBool", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readBytes", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readBytes32", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readList", ++ outputs: [ ++ { ++ internalType: "bytes[]", ++ name: "", ++ type: "bytes[]", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readString", ++ outputs: [ ++ { ++ internalType: "string", ++ name: "", ++ type: "string", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "readUint256", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506110a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635f71b98d1161005b5780635f71b98d146100e857806384147d531461010b5780638b33268b1461011e578063a39d36711461013157600080fd5b806316b3269e1461008257806331d12cd3146100a8578063359835b5146100c8575b600080fd5b610095610090366004610d9a565b610169565b6040519081526020015b60405180910390f35b6100bb6100b6366004610d9a565b61017a565b60405161009f9190610ed4565b6100db6100d6366004610d9a565b610185565b60405161009f9190610ee7565b6100fb6100f6366004610d9a565b61024c565b604051901515815260200161009f565b610095610119366004610d9a565b610257565b6100bb61012c366004610d9a565b610262565b61014461013f366004610d9a565b61026d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b600061017482610278565b92915050565b6060610174826102b3565b60606000610192836102e6565b90506000815167ffffffffffffffff8111156101b0576101b0610d6b565b6040519080825280602002602001820160405280156101e357816020015b60608152602001906001900390816101ce5790505b50905060005b81518110156102445761021483828151811061020757610207610f67565b6020026020010151610319565b82828151811061022657610226610f67565b6020026020010181905250808061023c90610fc5565b9150506101e9565b509392505050565b600061017482610324565b60006101748261035f565b60606101748261039a565b6000610174826103cd565b60006101746102ae8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610408565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610413565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906101749061041e565b606061017482610622565b600061017461035a8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b610638565b60006101746103958360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61071e565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061017490610821565b60006101746104038360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6108b1565b60006101748261071e565b606061017482610821565b606060008061042c84610920565b9193509091506001905081600181111561044857610448610ffe565b1461049a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064015b60405180910390fd5b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816104b35790505090506000835b8651811015610617576020821061055f5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610491565b60008061059c6040518060400160405280858c60000151610580919061102d565b8152602001858c602001516105959190611044565b9052610920565b5091509150604051806040016040528083836105b89190611044565b8152602001848b602001516105cd9190611044565b8152508585815181106105e2576105e2610f67565b60209081029190910101526105f8600185611044565b93506106048183611044565b61060e9084611044565b925050506104e0565b508152949350505050565b6060610174826020015160008460000151610c71565b805160009060011461068c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020626f6f6c65616e2076616c75652e0000000000006044820152606401610491565b6020820151805160001a8015806106a35750806001145b6107155760405162461bcd60e51b815260206004820152603860248201527f4c69625f524c505265616465723a20496e76616c696420524c5020626f6f6c6560448201527f616e2076616c75652c206d7573742062652030206f72203100000000000000006064820152608401610491565b15159392505050565b60006021826000015111156107755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b600080600061078385610920565b91945092509050600081600181111561079e5761079e610ffe565b146107eb5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610491565b60008386602001516107fd9190611044565b805190915060208410156108175760208490036101000a90045b9695505050505050565b6060600080600061083185610920565b91945092509050600081600181111561084c5761084c610ffe565b146108995760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610491565b6108a885602001518484610c71565b95945050505050565b8051600090600114156108c657506000919050565b81516015146109175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020616464726573732076616c75652e0000000000006044820152606401610491565b61017482610408565b6000806000808460000151116109785760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610491565b6020840151805160001a607f811161099d576000600160009450945094505050610c6a565b60b78111610a195760006109b260808361102d565b905080876000015111610a075760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610491565b60019550935060009250610c6a915050565b60bf8111610b08576000610a2e60b78361102d565b905080876000015111610a835760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610491565b600183015160208290036101000a9004610a9d8183611044565b885111610aec5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610491565b610af7826001611044565b9650945060009350610c6a92505050565b60f78111610b83576000610b1d60c08361102d565b905080876000015111610b725760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610491565b600195509350849250610c6a915050565b6000610b9060f78361102d565b905080876000015111610be55760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610491565b600183015160208290036101000a9004610bff8183611044565b885111610c4e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610491565b610c59826001611044565b9650945060019350610c6a92505050565b9193909250565b606060008267ffffffffffffffff811115610c8e57610c8e610d6b565b6040519080825280601f01601f191660200182016040528015610cb8576020820181803683370190505b509050805160001415610ccc579050610d64565b6000610cd88587611044565b90506020820160005b610cec60208761105c565b811015610d235782518252610d02602084611044565b9250610d0f602083611044565b915080610d1b81610fc5565b915050610ce1565b5080519151601f86166020036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192831692191691909117905290505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610dac57600080fd5b813567ffffffffffffffff80821115610dc457600080fd5b818401915084601f830112610dd857600080fd5b813581811115610dea57610dea610d6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610e3057610e30610d6b565b81604052828152876020848701011115610e4957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610e8f57602081850181015186830182015201610e73565b81811115610ea1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610d646020830184610e69565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610f5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610f48858351610e69565b94509285019290850190600101610f0e565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ff757610ff7610f96565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008282101561103f5761103f610f96565b500390565b6000821982111561105757611057610f96565b500190565b600082611092577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000809000a"; ++ ++type TestLib_RLPReaderConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_RLPReaderConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_RLPReader__factory extends ContractFactory { ++ constructor(...args: TestLib_RLPReaderConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_RLPReader { ++ return super.attach(address) as TestLib_RLPReader; ++ } ++ override connect(signer: Signer): TestLib_RLPReader__factory { ++ return super.connect(signer) as TestLib_RLPReader__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_RLPReaderInterface { ++ return new utils.Interface(_abi) as TestLib_RLPReaderInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_RLPReader { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_RLPReader; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPWriter__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPWriter__factory.ts +new file mode 100644 +index 0000000..510fca9 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/TestLib_RLPWriter__factory.ts +@@ -0,0 +1,196 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_RLPWriter, ++ TestLib_RLPWriterInterface, ++} from "../../../../contracts/test-libraries/rlp/TestLib_RLPWriter"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_in", ++ type: "address", ++ }, ++ ], ++ name: "writeAddress", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_in", ++ type: "address", ++ }, ++ ], ++ name: "writeAddressWithTaintedMemory", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bool", ++ name: "_in", ++ type: "bool", ++ }, ++ ], ++ name: "writeBool", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_in", ++ type: "bytes", ++ }, ++ ], ++ name: "writeBytes", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes[]", ++ name: "_in", ++ type: "bytes[]", ++ }, ++ ], ++ name: "writeList", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "string", ++ name: "_in", ++ type: "string", ++ }, ++ ], ++ name: "writeString", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_in", ++ type: "uint256", ++ }, ++ ], ++ name: "writeUint", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "_out", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506115a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80637932db751161005b5780637932db75146100d157806397563ac8146100e45780639e5c65b7146100f7578063dd2062021461010a57600080fd5b80633c5cee26146100825780633cbd1712146100ab5780635e25d23f146100be575b600080fd5b61009561009036600461087b565b61011d565b6040516100a291906108cd565b60405180910390f35b6100956100b936600461091e565b61012e565b6100956100cc366004610937565b610139565b6100956100df366004610a81565b610144565b6100956100f2366004610937565b61014f565b610095610105366004610abe565b610184565b610095610118366004610b81565b61018f565b60606101288261019a565b92915050565b606061012882610254565b606061012882610267565b6060610128826102ae565b606060405161015d9061086e565b604051809103906000f080158015610179573d6000803e3d6000fd5b505061012882610267565b60606101288261031d565b606061012882610144565b60408051600180825281830190925260609160009190602082018180368337019050509050826101ea577f800000000000000000000000000000000000000000000000000000000000000061020c565b7f01000000000000000000000000000000000000000000000000000000000000005b8160008151811061021f5761021f610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535092915050565b606061012861026283610361565b6102ae565b604051606082811b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015290610128906034016040516020818303038152906040525b606080825160011480156102dc57506080836000815181106102d2576102d2610bca565b016020015160f81c105b156102e8575081610128565b6102f4835160806104cc565b83604051602001610306929190610bf9565b604051602081830303815290604052905092915050565b6060600061032a836106c3565b9050610338815160c06104cc565b8160405160200161034a929190610bf9565b604051602081830303815290604052915050919050565b606060008260405160200161037891815260200190565b604051602081830303815290604052905060005b60208110156103ea578181815181106103a7576103a7610bca565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016156103d8576103ea565b806103e281610c57565b91505061038c565b60006103f7826020610c90565b67ffffffffffffffff81111561040f5761040f61096d565b6040519080825280601f01601f191660200182016040528015610439576020820181803683370190505b50905060005b81518110156104c357838361045381610c57565b94508151811061046557610465610bca565b602001015160f81c60f81b82828151811061048257610482610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806104bb81610c57565b91505061043f565b50949350505050565b606080603884101561054b57604080516001808252818301909252906020820181803683370190505090506105018385610ca7565b60f81b8160008151811061051757610517610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506106bc565b600060015b61055a8187610cfb565b15610580578161056981610c57565b9250610579905061010082610d0f565b9050610550565b61058b826001610d4c565b67ffffffffffffffff8111156105a3576105a361096d565b6040519080825280601f01601f1916602001820160405280156105cd576020820181803683370190505b5092506105da8583610ca7565b6105e5906037610ca7565b60f81b836000815181106105fb576105fb610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116106b9576101006106438284610c90565b61064f90610100610e84565b6106599088610cfb565b6106639190610e90565b60f81b83828151811061067857610678610bca565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806106b181610c57565b91505061062f565b50505b9392505050565b60608151600014156106e357505060408051600081526020810190915290565b6000805b835181101561072a5783818151811061070257610702610bca565b602002602001015151826107169190610d4c565b91508061072281610c57565b9150506106e7565b60008267ffffffffffffffff8111156107455761074561096d565b6040519080825280601f01601f19166020018201604052801561076f576020820181803683370190505b50600092509050602081015b85518310156104c357600086848151811061079857610798610bca565b6020026020010151905060006020820190506107b6838284516107f3565b8785815181106107c8576107c8610bca565b602002602001015151836107dc9190610d4c565b9250505082806107eb90610c57565b93505061077b565b8282825b6020811061082f578151835261080e602084610d4c565b925061081b602083610d4c565b9150610828602082610c90565b90506107f7565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b6106f380610ea583390190565b60006020828403121561088d57600080fd5b813580151581146106bc57600080fd5b60005b838110156108b85781810151838201526020016108a0565b838111156108c7576000848401525b50505050565b60208152600082518060208401526108ec81604085016020870161089d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561093057600080fd5b5035919050565b60006020828403121561094957600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109e3576109e361096d565b604052919050565b600067ffffffffffffffff831115610a0557610a0561096d565b610a3660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161099c565b9050828152838383011115610a4a57600080fd5b828260208301376000602084830101529392505050565b600082601f830112610a7257600080fd5b6106bc838335602085016109eb565b600060208284031215610a9357600080fd5b813567ffffffffffffffff811115610aaa57600080fd5b610ab684828501610a61565b949350505050565b60006020808385031215610ad157600080fd5b823567ffffffffffffffff80821115610ae957600080fd5b818501915085601f830112610afd57600080fd5b813581811115610b0f57610b0f61096d565b8060051b610b1e85820161099c565b9182528381018501918581019089841115610b3857600080fd5b86860192505b83831015610b7457823585811115610b565760008081fd5b610b648b89838a0101610a61565b8352509186019190860190610b3e565b9998505050505050505050565b600060208284031215610b9357600080fd5b813567ffffffffffffffff811115610baa57600080fd5b8201601f81018413610bbb57600080fd5b610ab6848235602084016109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351610c0b81846020880161089d565b835190830190610c1f81836020880161089d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c8957610c89610c28565b5060010190565b600082821015610ca257610ca2610c28565b500390565b600060ff821660ff84168060ff03821115610cc457610cc4610c28565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610d0a57610d0a610ccc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4757610d47610c28565b500290565b60008219821115610d5f57610d5f610c28565b500190565b600181815b80851115610dbd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610da357610da3610c28565b80851615610db057918102915b93841c9390800290610d69565b509250929050565b600082610dd457506001610128565b81610de157506000610128565b8160018114610df75760028114610e0157610e1d565b6001915050610128565b60ff841115610e1257610e12610c28565b50506001821b610128565b5060208310610133831016604e8410600b8410161715610e40575081810a610128565b610e4a8383610d64565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e7c57610e7c610c28565b029392505050565b60006106bc8383610dc5565b600082610e9f57610e9f610ccc565b50069056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a"; ++ ++type TestLib_RLPWriterConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_RLPWriterConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_RLPWriter__factory extends ContractFactory { ++ constructor(...args: TestLib_RLPWriterConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_RLPWriter { ++ return super.attach(address) as TestLib_RLPWriter; ++ } ++ override connect(signer: Signer): TestLib_RLPWriter__factory { ++ return super.connect(signer) as TestLib_RLPWriter__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_RLPWriterInterface { ++ return new utils.Interface(_abi) as TestLib_RLPWriterInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_RLPWriter { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_RLPWriter; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/index.ts +new file mode 100644 +index 0000000..71e98fe +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/rlp/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_RLPReader__factory } from "./TestLib_RLPReader__factory"; ++export { TestLib_RLPWriter__factory } from "./TestLib_RLPWriter__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/TestLib_AddressAliasHelper__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/TestLib_AddressAliasHelper__factory.ts +new file mode 100644 +index 0000000..bbaf12b +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/TestLib_AddressAliasHelper__factory.ts +@@ -0,0 +1,105 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_AddressAliasHelper, ++ TestLib_AddressAliasHelperInterface, ++} from "../../../../contracts/test-libraries/standards/TestLib_AddressAliasHelper"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_address", ++ type: "address", ++ }, ++ ], ++ name: "applyL1ToL2Alias", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_address", ++ type: "address", ++ }, ++ ], ++ name: "undoL1ToL2Alias", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "", ++ type: "address", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061011e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063689992b31461003b5780637528c2c614610077575b600080fd5b61004e6100493660046100d4565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046100d4565b6100b6565b60007fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef82015b92915050565b600073111100000000000000000000000000000000111182016100b0565b6000602082840312156100e657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461010a57600080fd5b939250505056fea164736f6c6343000809000a"; ++ ++type TestLib_AddressAliasHelperConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_AddressAliasHelperConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_AddressAliasHelper__factory extends ContractFactory { ++ constructor(...args: TestLib_AddressAliasHelperConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_AddressAliasHelper { ++ return super.attach(address) as TestLib_AddressAliasHelper; ++ } ++ override connect(signer: Signer): TestLib_AddressAliasHelper__factory { ++ return super.connect(signer) as TestLib_AddressAliasHelper__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_AddressAliasHelperInterface { ++ return new utils.Interface(_abi) as TestLib_AddressAliasHelperInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_AddressAliasHelper { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as TestLib_AddressAliasHelper; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/index.ts +new file mode 100644 +index 0000000..da68fe8 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/standards/index.ts +@@ -0,0 +1,4 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_AddressAliasHelper__factory } from "./TestLib_AddressAliasHelper__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_MerkleTrie__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_MerkleTrie__factory.ts +new file mode 100644 +index 0000000..85ab5db +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_MerkleTrie__factory.ts +@@ -0,0 +1,189 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_MerkleTrie, ++ TestLib_MerkleTrieInterface, ++} from "../../../../contracts/test-libraries/trie/TestLib_MerkleTrie"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "get", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ ], ++ name: "getSingleNodeRootHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "update", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "verifyInclusionProof", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50612e83806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612985565b6100d2565b604051610072929190612a22565b60405180910390f35b61008e610089366004612a7c565b6100ed565b604051908152602001610072565b61008e6100aa366004612ae0565b610102565b6100c26100bd366004612ae0565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610209565b90505b92915050565b60006101108585858561022d565b90505b949350505050565b6000610110858585856102e5565b60006060600061013885610322565b9050600080600061014a848a8961041d565b8151929550909350915015808061015e5750815b6101af5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b6000816101cb57604051806020016040528060008152506101f7565b6101f7866101da600188612b9f565b815181106101ea576101ea612bb6565b60200260200101516108b8565b919b919a509098505050505050505050565b600061021d610217846108e2565b83610a65565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561029d576102968585610209565b9050610113565b60006102a884610322565b90506000806102b883898761041d565b509150915060006102cc84848b858c610b1f565b90506102d8818a610f8c565b9998505050505050505050565b60008060006102f5878686610129565b9150915081801561031757508051602080830191909120875191880191909120145b979650505050505050565b6060600061032f83611142565b90506000815167ffffffffffffffff81111561034d5761034d6128ab565b60405190808252806020026020018201604052801561039257816020015b604080518082019091526060808252602082015281526020019060019003908161036b5790505b50905060005b82518110156104155760006103c58483815181106103b8576103b8612bb6565b6020026020010151611175565b905060405180604001604052808281526020016103e183611142565b8152508383815181106103f6576103f6612bb6565b602002602001018190525050808061040d90612be5565b915050610398565b509392505050565b6000606081808061042d876108e2565b90506000869050600080610454604051806040016040528060608152602001606081525090565b60005b8c51811015610874578c818151811061047257610472612bb6565b6020026020010151915082846104889190612c00565b9350610495600188612c00565b9650836104f9578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016101a6565b6105b6565b81515160201161055b578151805160209091012085146104f45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016101a6565b8461056983600001516111fc565b146105b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016101a6565b6105c260106001612c00565b826020015151141561063b5785518414156105dc57610874565b60008685815181106105f0576105f0612bb6565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061061b5761061b612bb6565b6020026020010151905061062e81611224565b9650600194505050610862565b6002826020015151141561081a57600061065483611261565b905060008160008151811061066b5761066b612bb6565b016020015160f81c90506000610682600283612c47565b61068d906002612c69565b9050600061069e848360ff16611285565b905060006106ac8b8a611285565b905060006106ba83836112b6565b905060ff8516600214806106d1575060ff85166003145b15610727578083511480156106e65750808251145b156106f8576106f5818b612c00565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b60ff8516158061073a575060ff85166001145b156107ac578251811461077657507f80000000000000000000000000000000000000000000000000000000000000009950610874945050505050565b61079d886020015160018151811061079057610790612bb6565b6020026020010151611224565b9a509750610862945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016101a6565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016101a6565b8061086c81612be5565b915050610457565b507f80000000000000000000000000000000000000000000000000000000000000008414866108a38786611285565b909e909d50909b509950505050505050505050565b602081015180516060916100fc916108d290600190612b9f565b815181106103b8576103b8612bb6565b60606000825160026108f49190612c8c565b67ffffffffffffffff81111561090c5761090c6128ab565b6040519080825280601f01601f191660200182016040528015610936576020820181803683370190505b50905060005b8351811015610a5e57600484828151811061095957610959612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261098e836002612c8c565b8151811061099e5761099e612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106109e1576109e1612bb6565b01602001516109f3919060f81c612c47565b60f81b82610a02836002612c8c565b610a0d906001612c00565b81518110610a1d57610a1d612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610a5681612be5565b91505061093c565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610a915790505090506000610ab5856001611362565b9050610ac8610ac38261145a565b6115ac565b82600081518110610adb57610adb612bb6565b6020026020010181905250610aef846115ac565b82600181518110610b0257610b02612bb6565b6020026020010181905250610b168261161b565b95945050505050565b606082600087610b30600189612b9f565b81518110610b4057610b40612bb6565b602002602001015190506000610b558261165f565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610b715790505090506000806002846002811115610bb157610bb1612cab565b1415610caf578b5160009015610c6a5760005b60018e51610bd29190612b9f565b811015610c68576000610bfd8f8381518110610bf057610bf0612bb6565b602002602001015161165f565b6002811115610c0e57610c0e612cab565b1415610c265781610c1e81612be5565b925050610c56565b610c488e8281518110610c3b57610c3b612bb6565b6020026020010151611749565b51610c539083612c00565b91505b80610c6081612be5565b915050610bc4565b505b610c7386611749565b51610c97610c8088611749565b610c92610c8c8f6108e2565b85611285565b6112b6565b148015610ca357508651155b15610cad57600191505b505b8015610cf657610cc7610cc186611749565b89610a65565b838381518110610cd957610cd9612bb6565b6020908102919091010152610cef600183612c00565b9150610f66565b6000846002811115610d0a57610d0a612cab565b1415610d59578551610d2057610cc7858961175c565b84838381518110610d3357610d33612bb6565b6020908102919091010152610d49600183612c00565b9150610cc7610cc1876001611285565b6000610d6486611749565b90506000610d7282896112b6565b90508015610de0576000610d88836000846117e0565b9050610d9c81610d978d61197f565b6119bf565b868681518110610dae57610dae612bb6565b6020908102919091010152610dc4600186612c00565b9450610dd08383611285565b9250610ddc8983611285565b9850505b6000610dea611a0f565b9050825160001415610e0f57610e0881610e038a6108b8565b61175c565b9050610eb3565b600083600081518110610e2457610e24612bb6565b016020015160f81c9050610e39846001611285565b93506002886002811115610e4f57610e4f612cab565b1415610e8a576000610e6985610e648c6108b8565b610a65565b9050610e828383610e7d846000015161197f565b611b01565b925050610eb1565b835115610ea0576000610e6985610d978c6108b8565b610eae8282610e7d8c6108b8565b91505b505b8851610ef557610ec3818c61175c565b905080868681518110610ed857610ed8612bb6565b6020908102919091010152610eee600186612c00565b9450610f62565b610f00896001611285565b985080868681518110610f1557610f15612bb6565b6020908102919091010152610f2b600186612c00565b9450610f37898c610a65565b868681518110610f4957610f49612bb6565b6020908102919091010152610f5f600186612c00565b94505b5050505b610f7c8c610f7560018e612b9f565b8585611b8b565b9c9b505050505050505050505050565b600080610f98836108e2565b9050610fb7604051806040016040528060608152602001606081525090565b84516000906060905b801561112d5787610fd2600183612b9f565b81518110610fe257610fe2612bb6565b60200260200101519350610ff58461165f565b9250600283600281111561100b5761100b612cab565b141561103f57600061101c85611749565b9050611037866000835189516110329190612b9f565b6117e0565b95505061110e565b600183600281111561105357611053612cab565b141561109757600061106485611749565b905061107a866000835189516110329190612b9f565b8351909650156110915761108e8584611cb9565b94505b5061110e565b60008360028111156110ab576110ab612cab565b141561110e5781511561110e57600085600187516110c99190612b9f565b815181106110d9576110d9612bb6565b602001015160f81c60f81b60f81c90506110fd866000600189516110329190612b9f565b955061110a858285611b01565b9450505b83516111199061197f565b91508061112581612cda565b915050610fc0565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611d7d565b6060600080600061118585611f7c565b9194509250905060008160018111156111a0576111a0612cab565b146111ed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016101a6565b610b16856020015184846122cd565b600060208251101561121057506020015190565b818060200190518101906100fc9190612cf1565b600060606020836000015110156112455761123e836123ac565b9050611251565b61124e83611175565b90505b61125a816111fc565b9392505050565b60606100fc61128083602001516000815181106103b8576103b8612bb6565b6108e2565b6060825182106112a457506040805160208101909152600081526100fc565b6100f983838486516110329190612b9f565b6000805b8084511180156112ca5750808351115b801561134b57508281815181106112e3576112e3612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061132257611322612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061135a81612be5565b9150506112ba565b6060600082611372576000611375565b60025b90506000600285516113879190612d0a565b90506000611396826002612c69565b60ff1667ffffffffffffffff8111156113b1576113b16128ab565b6040519080825280601f01601f1916602001820160405280156113db576020820181803683370190505b5090506113e88284612d1e565b60f81b816000815181106113fe576113fe612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508086604051602001611440929190612d43565b604051602081830303815290604052935050505092915050565b606060006002835161146c9190612d72565b67ffffffffffffffff811115611484576114846128ab565b6040519080825280601f01601f1916602001820160405280156114ae576020820181803683370190505b50905060005b8151811015610a5e57836114c9826002612c8c565b6114d4906001612c00565b815181106114e4576114e4612bb6565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600485611519846002612c8c565b8151811061152957611529612bb6565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061156b5761156b612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806115a481612be5565b9150506114b4565b606080825160011480156115da57506080836000815181106115d0576115d0612bb6565b016020015160f81c105b156115e65750816100fc565b6115f2835160806123b7565b83604051602001611604929190612d43565b604051602081830303815290604052905092915050565b6040805180820190915260608082526020820152600061163a836125ae565b9050604051806040016040528082815260200161165683611142565b90529392505050565b600061166d60106001612c00565b826020015151141561168157506000919050565b6002826020015151141561170157600061169a83611261565b90506000816000815181106116b1576116b1612bb6565b016020015160f81c905060028114806116cd575060ff81166003145b156116dc575060029392505050565b60ff811615806116ef575060ff81166001145b156116fe575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f6465207479706500000000000000000000000000000060448201526064016101a6565b60606100fc61175783611261565b6125f2565b6040805180820190915260608082526020820152600061177b836115ac565b604080518082018252600080825260209182015281518083019092528251825280830190820152909150602085015180516117b890600190612b9f565b815181106117c8576117c8612bb6565b60200260200101819052506101138460200151612638565b6060816117ee81601f612c00565b101561183c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b826118478382612c00565b10156118955760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101a6565b61189f8284612c00565b845110156118ef5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101a6565b60608215801561190e5760405191506000825260208201604052611976565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561194757805183526020928301920161192f565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606060208251101561198f575090565b81805190602001206040516020016119a991815260200190565b6040516020818303038152906040529050919050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b60608152602001906001900390816119eb5790505090506000610ab5856000611362565b60408051808201909152606080825260208201526000611a3160106001612c00565b67ffffffffffffffff811115611a4957611a496128ab565b604051908082528060200260200182016040528015611a7c57816020015b6060815260200190600190039081611a675790505b50905060005b8151811015611af1576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611ad357611ad3612bb6565b60200260200101819052508080611ae990612be5565b915050611a82565b50611afb8161161b565b91505090565b604080518082019091526060808252602082015260006020835110611b2e57611b29836115ac565b611b30565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611b7357611b73612bb6565b6020026020010181905250610b168560200151612638565b60606000611b998386612c00565b67ffffffffffffffff811115611bb157611bb16128ab565b604051908082528060200260200182016040528015611bf657816020015b6040805180820190915260608082526020820152815260200190600190039081611bcf5790505b50905060005b85811015611c4e57868181518110611c1657611c16612bb6565b6020026020010151828281518110611c3057611c30612bb6565b60200260200101819052508080611c4690612be5565b915050611bfc565b5060005b83811015611caf57848181518110611c6c57611c6c612bb6565b6020026020010151828783611c819190612c00565b81518110611c9157611c91612bb6565b60200260200101819052508080611ca790612be5565b915050611c52565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611ce55790505090506000611d11611d0a86611749565b6000611362565b9050611d1f610ac38261145a565b82600081518110611d3257611d32612bb6565b6020026020010181905250602084511015611d6b578382600181518110611d5b57611d5b612bb6565b6020026020010181905250611d74565b610aef846115ac565b610b168261161b565b6060600080611d8b84611f7c565b91935090915060019050816001811115611da757611da7612cab565b14611df45760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016101a6565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611e0d5790505090506000835b8651811015611f715760208210611eb95760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016101a6565b600080611ef66040518060400160405280858c60000151611eda9190612b9f565b8152602001858c60200151611eef9190612c00565b9052611f7c565b509150915060405180604001604052808383611f129190612c00565b8152602001848b60200151611f279190612c00565b815250858581518110611f3c57611f3c612bb6565b6020908102919091010152611f52600185612c00565b9350611f5e8183612c00565b611f689084612c00565b92505050611e3a565b508152949350505050565b600080600080846000015111611fd45760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016101a6565b6020840151805160001a607f8111611ff95760006001600094509450945050506122c6565b60b7811161207557600061200e608083612b9f565b9050808760000151116120635760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016101a6565b600195509350600092506122c6915050565b60bf811161216457600061208a60b783612b9f565b9050808760000151116120df5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016101a6565b600183015160208290036101000a90046120f98183612c00565b8851116121485760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016101a6565b612153826001612c00565b96509450600093506122c692505050565b60f781116121df57600061217960c083612b9f565b9050808760000151116121ce5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016101a6565b6001955093508492506122c6915050565b60006121ec60f783612b9f565b9050808760000151116122415760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016101a6565b600183015160208290036101000a900461225b8183612c00565b8851116122aa5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016101a6565b6122b5826001612c00565b96509450600193506122c692505050565b9193909250565b606060008267ffffffffffffffff8111156122ea576122ea6128ab565b6040519080825280601f01601f191660200182016040528015612314576020820181803683370190505b50905080516000141561232857905061125a565b60006123348587612c00565b90506020820160005b612348602087612d72565b81101561237f578251825261235e602084612c00565b925061236b602083612c00565b91508061237781612be5565b91505061233d565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc82612706565b606080603884101561243657604080516001808252818301909252906020820181803683370190505090506123ec8385612d1e565b60f81b8160008151811061240257612402612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124458187612d72565b1561246b578161245481612be5565b9250612464905061010082612c8c565b905061243b565b612476826001612c00565b67ffffffffffffffff81111561248e5761248e6128ab565b6040519080825280601f01601f1916602001820160405280156124b8576020820181803683370190505b5092506124c58583612d1e565b6124d0906037612d1e565b60f81b836000815181106124e6576124e6612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116125a45761010061252e8284612b9f565b61253a90610100612e6a565b6125449088612d72565b61254e9190612d0a565b60f81b83828151811061256357612563612bb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061259c81612be5565b91505061251a565b5050905092915050565b606060006125bb8361271c565b90506125c9815160c06123b7565b816040516020016125db929190612d43565b604051602081830303815290604052915050919050565b606060028260008151811061260957612609612bb6565b016020015161261b919060f81c612c47565b60ff1661262d576100fc826002611285565b6100fc826001611285565b60408051808201909152606080825260208201526000825167ffffffffffffffff811115612668576126686128ab565b60405190808252806020026020018201604052801561269b57816020015b60608152602001906001900390816126865790505b50905060005b83518110156126fc576126cc8482815181106126bf576126bf612bb6565b60200260200101516123ac565b8282815181106126de576126de612bb6565b602002602001018190525080806126f490612be5565b9150506126a1565b5061125a8161161b565b60606100fc8260200151600084600001516122cd565b606081516000141561273e576040805160008082526020820190925290610a5e565b6000805b83518110156127855783818151811061275d5761275d612bb6565b602002602001015151826127719190612c00565b91508061277d81612be5565b915050612742565b60008267ffffffffffffffff8111156127a0576127a06128ab565b6040519080825280601f01601f1916602001820160405280156127ca576020820181803683370190505b50600092509050602081015b85518310156119765760008684815181106127f3576127f3612bb6565b6020026020010151905060006020820190506128118382845161284e565b87858151811061282357612823612bb6565b602002602001015151836128379190612c00565b92505050828061284690612be5565b9350506127d6565b8282825b6020811061288a5781518352612869602084612c00565b9250612876602083612c00565b9150612883602082612b9f565b9050612852565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126128eb57600080fd5b813567ffffffffffffffff80821115612906576129066128ab565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561294c5761294c6128ab565b8160405283815286602085880101111561296557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561299a57600080fd5b833567ffffffffffffffff808211156129b257600080fd5b6129be878388016128da565b945060208601359150808211156129d457600080fd5b506129e1868287016128da565b925050604084013590509250925092565b60005b83811015612a0d5781810151838201526020016129f5565b83811115612a1c576000848401525b50505050565b82151581526040602082015260008251806040840152612a498160608501602087016129f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612a8f57600080fd5b823567ffffffffffffffff80821115612aa757600080fd5b612ab3868387016128da565b93506020850135915080821115612ac957600080fd5b50612ad6858286016128da565b9150509250929050565b60008060008060808587031215612af657600080fd5b843567ffffffffffffffff80821115612b0e57600080fd5b612b1a888389016128da565b95506020870135915080821115612b3057600080fd5b612b3c888389016128da565b94506040870135915080821115612b5257600080fd5b50612b5f878288016128da565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612bb157612bb1612b70565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612bf957612bf9612b70565b5060010190565b60008219821115612c1357612c13612b70565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612c5a57612c5a612c18565b8060ff84160691505092915050565b600060ff821660ff841680821015612c8357612c83612b70565b90039392505050565b6000816000190483118215151615612ca657612ca6612b70565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612ce957612ce9612b70565b506000190190565b600060208284031215612d0357600080fd5b5051919050565b600082612d1957612d19612c18565b500690565b600060ff821660ff84168060ff03821115612d3b57612d3b612b70565b019392505050565b60008351612d558184602088016129f2565b835190830190612d698183602088016129f2565b01949350505050565b600082612d8157612d81612c18565b500490565b600181815b80851115612dc1578160001904821115612da757612da7612b70565b80851615612db457918102915b93841c9390800290612d8b565b509250929050565b600082612dd8575060016100fc565b81612de5575060006100fc565b8160018114612dfb5760028114612e0557612e21565b60019150506100fc565b60ff841115612e1657612e16612b70565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612e44575081810a6100fc565b612e4e8383612d86565b8060001904821115612e6257612e62612b70565b029392505050565b60006100f98383612dc956fea164736f6c6343000809000a"; ++ ++type TestLib_MerkleTrieConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_MerkleTrieConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_MerkleTrie__factory extends ContractFactory { ++ constructor(...args: TestLib_MerkleTrieConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_MerkleTrie { ++ return super.attach(address) as TestLib_MerkleTrie; ++ } ++ override connect(signer: Signer): TestLib_MerkleTrie__factory { ++ return super.connect(signer) as TestLib_MerkleTrie__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_MerkleTrieInterface { ++ return new utils.Interface(_abi) as TestLib_MerkleTrieInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_MerkleTrie { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_MerkleTrie; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_SecureMerkleTrie__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_SecureMerkleTrie__factory.ts +new file mode 100644 +index 0000000..c092984 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/TestLib_SecureMerkleTrie__factory.ts +@@ -0,0 +1,193 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_SecureMerkleTrie, ++ TestLib_SecureMerkleTrieInterface, ++} from "../../../../contracts/test-libraries/trie/TestLib_SecureMerkleTrie"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "get", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ ], ++ name: "getSingleNodeRootHash", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "update", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_key", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_value", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_proof", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ ], ++ name: "verifyInclusionProof", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50612f1e806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063120c4a221461005157806349fba1931461007b578063cd4a76951461009c578063e8e72100146100af575b600080fd5b61006461005f366004612a20565b6100d2565b604051610072929190612abd565b60405180910390f35b61008e610089366004612b17565b6100ed565b604051908152602001610072565b61008e6100aa366004612b7b565b610102565b6100c26100bd366004612b7b565b61011b565b6040519015158152602001610072565b600060606100e1858585610129565b91509150935093915050565b60006100f98383610152565b90505b92915050565b60006101108585858561016a565b90505b949350505050565b60006101108585858561018e565b600060606000610138866101a8565b90506101458186866101da565b9250925050935093915050565b60008061015e846101a8565b905061011381846102ba565b600080610176866101a8565b9050610184818686866102de565b9695505050505050565b60008061019a866101a8565b905061018481868686610396565b606081805190602001206040516020016101c491815260200190565b6040516020818303038152906040529050919050565b6000606060006101e9856103d3565b905060008060006101fb848a896104ce565b8151929550909350915015808061020f5750815b6102605760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064015b60405180910390fd5b60008161027c57604051806020016040528060008152506102a8565b6102a88661028b600188612c3a565b8151811061029b5761029b612c51565b6020026020010151610969565b919b919a509098505050505050505050565b60006102ce6102c884610993565b83610b16565b5180516020909101209392505050565b60408051808201909152600181527f800000000000000000000000000000000000000000000000000000000000000060209091015260007f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42182141561034e5761034785856102ba565b9050610113565b6000610359846103d3565b90506000806103698389876104ce565b5091509150600061037d84848b858c610bd0565b9050610389818a61103d565b9998505050505050505050565b60008060006103a68786866101da565b915091508180156103c857508051602080830191909120875191880191909120145b979650505050505050565b606060006103e0836111f3565b90506000815167ffffffffffffffff8111156103fe576103fe612946565b60405190808252806020026020018201604052801561044357816020015b604080518082019091526060808252602082015281526020019060019003908161041c5790505b50905060005b82518110156104c657600061047684838151811061046957610469612c51565b6020026020010151611226565b90506040518060400160405280828152602001610492836111f3565b8152508383815181106104a7576104a7612c51565b60200260200101819052505080806104be90612c80565b915050610449565b509392505050565b600060608180806104de87610993565b90506000869050600080610505604051806040016040528060608152602001606081525090565b60005b8c51811015610925578c818151811061052357610523612c51565b6020026020010151915082846105399190612c9b565b9350610546600188612c9b565b9650836105aa578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610257565b610667565b81515160201161060c578151805160209091012085146105a55760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610257565b8461061a83600001516112ad565b146106675760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610257565b61067360106001612c9b565b82602001515114156106ec57855184141561068d57610925565b60008685815181106106a1576106a1612c51565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106106cc576106cc612c51565b602002602001015190506106df816112d5565b9650600194505050610913565b600282602001515114156108cb57600061070583611312565b905060008160008151811061071c5761071c612c51565b016020015160f81c90506000610733600283612ce2565b61073e906002612d04565b9050600061074f848360ff16611336565b9050600061075d8b8a611336565b9050600061076b8383611367565b905060ff851660021480610782575060ff85166003145b156107d8578083511480156107975750808251145b156107a9576107a6818b612c9b565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b60ff851615806107eb575060ff85166001145b1561085d578251811461082757507f80000000000000000000000000000000000000000000000000000000000000009950610925945050505050565b61084e886020015160018151811061084157610841612c51565b60200260200101516112d5565b9a509750610913945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610257565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610257565b8061091d81612c80565b915050610508565b507f80000000000000000000000000000000000000000000000000000000000000008414866109548786611336565b909e909d50909b509950505050505050505050565b602081015180516060916100fc9161098390600190612c3a565b8151811061046957610469612c51565b60606000825160026109a59190612d27565b67ffffffffffffffff8111156109bd576109bd612946565b6040519080825280601f01601f1916602001820160405280156109e7576020820181803683370190505b50905060005b8351811015610b0f576004848281518110610a0a57610a0a612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82610a3f836002612d27565b81518110610a4f57610a4f612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110610a9257610a92612c51565b0160200151610aa4919060f81c612ce2565b60f81b82610ab3836002612d27565b610abe906001612c9b565b81518110610ace57610ace612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080610b0781612c80565b9150506109ed565b5092915050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081610b425790505090506000610b66856001611413565b9050610b79610b748261150b565b61165d565b82600081518110610b8c57610b8c612c51565b6020026020010181905250610ba08461165d565b82600181518110610bb357610bb3612c51565b6020026020010181905250610bc7826116cc565b95945050505050565b606082600087610be1600189612c3a565b81518110610bf157610bf1612c51565b602002602001015190506000610c0682611710565b6040805160038082526080820190925291925060009190816020015b6040805180820190915260608082526020820152815260200190600190039081610c225790505090506000806002846002811115610c6257610c62612d46565b1415610d60578b5160009015610d1b5760005b60018e51610c839190612c3a565b811015610d19576000610cae8f8381518110610ca157610ca1612c51565b6020026020010151611710565b6002811115610cbf57610cbf612d46565b1415610cd75781610ccf81612c80565b925050610d07565b610cf98e8281518110610cec57610cec612c51565b60200260200101516117fa565b51610d049083612c9b565b91505b80610d1181612c80565b915050610c75565b505b610d24866117fa565b51610d48610d31886117fa565b610d43610d3d8f610993565b85611336565b611367565b148015610d5457508651155b15610d5e57600191505b505b8015610da757610d78610d72866117fa565b89610b16565b838381518110610d8a57610d8a612c51565b6020908102919091010152610da0600183612c9b565b9150611017565b6000846002811115610dbb57610dbb612d46565b1415610e0a578551610dd157610d78858961180d565b84838381518110610de457610de4612c51565b6020908102919091010152610dfa600183612c9b565b9150610d78610d72876001611336565b6000610e15866117fa565b90506000610e238289611367565b90508015610e91576000610e3983600084611891565b9050610e4d81610e488d611a30565b611a5a565b868681518110610e5f57610e5f612c51565b6020908102919091010152610e75600186612c9b565b9450610e818383611336565b9250610e8d8983611336565b9850505b6000610e9b611aaa565b9050825160001415610ec057610eb981610eb48a610969565b61180d565b9050610f64565b600083600081518110610ed557610ed5612c51565b016020015160f81c9050610eea846001611336565b93506002886002811115610f0057610f00612d46565b1415610f3b576000610f1a85610f158c610969565b610b16565b9050610f338383610f2e8460000151611a30565b611b9c565b925050610f62565b835115610f51576000610f1a85610e488c610969565b610f5f8282610f2e8c610969565b91505b505b8851610fa657610f74818c61180d565b905080868681518110610f8957610f89612c51565b6020908102919091010152610f9f600186612c9b565b9450611013565b610fb1896001611336565b985080868681518110610fc657610fc6612c51565b6020908102919091010152610fdc600186612c9b565b9450610fe8898c610b16565b868681518110610ffa57610ffa612c51565b6020908102919091010152611010600186612c9b565b94505b5050505b61102d8c61102660018e612c3a565b8585611c26565b9c9b505050505050505050505050565b60008061104983610993565b9050611068604051806040016040528060608152602001606081525090565b84516000906060905b80156111de5787611083600183612c3a565b8151811061109357611093612c51565b602002602001015193506110a684611710565b925060028360028111156110bc576110bc612d46565b14156110f05760006110cd856117fa565b90506110e8866000835189516110e39190612c3a565b611891565b9550506111bf565b600183600281111561110457611104612d46565b1415611148576000611115856117fa565b905061112b866000835189516110e39190612c3a565b8351909650156111425761113f8584611d54565b94505b506111bf565b600083600281111561115c5761115c612d46565b14156111bf578151156111bf576000856001875161117a9190612c3a565b8151811061118a5761118a612c51565b602001015160f81c60f81b60f81c90506111ae866000600189516110e39190612c3a565b95506111bb858285611b9c565b9450505b83516111ca90611a30565b9150806111d681612d75565b915050611071565b50509051805160209091012095945050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906100fc90611e18565b6060600080600061123685612017565b91945092509050600081600181111561125157611251612d46565b1461129e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610257565b610bc785602001518484612368565b60006020825110156112c157506020015190565b818060200190518101906100fc9190612d8c565b600060606020836000015110156112f6576112ef83612447565b9050611302565b6112ff83611226565b90505b61130b816112ad565b9392505050565b60606100fc611331836020015160008151811061046957610469612c51565b610993565b60608251821061135557506040805160208101909152600081526100fc565b6100f983838486516110e39190612c3a565b6000805b80845111801561137b5750808351115b80156113fc575082818151811061139457611394612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106113d3576113d3612c51565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156100f9578061140b81612c80565b91505061136b565b6060600082611423576000611426565b60025b90506000600285516114389190612da5565b90506000611447826002612d04565b60ff1667ffffffffffffffff81111561146257611462612946565b6040519080825280601f01601f19166020018201604052801561148c576020820181803683370190505b5090506114998284612db9565b60f81b816000815181106114af576114af612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080866040516020016114f1929190612dde565b604051602081830303815290604052935050505092915050565b606060006002835161151d9190612e0d565b67ffffffffffffffff81111561153557611535612946565b6040519080825280601f01601f19166020018201604052801561155f576020820181803683370190505b50905060005b8151811015610b0f578361157a826002612d27565b611585906001612c9b565b8151811061159557611595612c51565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166004856115ca846002612d27565b815181106115da576115da612c51565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1782828151811061161c5761161c612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061165581612c80565b915050611565565b6060808251600114801561168b575060808360008151811061168157611681612c51565b016020015160f81c105b156116975750816100fc565b6116a383516080612452565b836040516020016116b5929190612dde565b604051602081830303815290604052905092915050565b604080518082019091526060808252602082015260006116eb83612649565b90506040518060400160405280828152602001611707836111f3565b90529392505050565b600061171e60106001612c9b565b826020015151141561173257506000919050565b600282602001515114156117b257600061174b83611312565b905060008160008151811061176257611762612c51565b016020015160f81c9050600281148061177e575060ff81166003145b1561178d575060029392505050565b60ff811615806117a0575060ff81166001145b156117af575060019392505050565b50505b60405162461bcd60e51b815260206004820152601160248201527f496e76616c6964206e6f646520747970650000000000000000000000000000006044820152606401610257565b60606100fc61180883611312565b61268d565b6040805180820190915260608082526020820152600061182c8361165d565b6040805180820182526000808252602091820152815180830190925282518252808301908201529091506020850151805161186990600190612c3a565b8151811061187957611879612c51565b602002602001018190525061011384602001516126d3565b60608161189f81601f612c9b565b10156118ed5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b826118f88382612c9b565b10156119465760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610257565b6119508284612c9b565b845110156119a05760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610257565b6060821580156119bf5760405191506000825260208201604052611a27565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119f85780518352602092830192016119e0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060602082511015611a40575090565b81805190602001206040516020016101c491815260200190565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611a865790505090506000610b66856000611413565b60408051808201909152606080825260208201526000611acc60106001612c9b565b67ffffffffffffffff811115611ae457611ae4612946565b604051908082528060200260200182016040528015611b1757816020015b6060815260200190600190039081611b025790505b50905060005b8151811015611b8c576040518060400160405280600181526020017f8000000000000000000000000000000000000000000000000000000000000000815250828281518110611b6e57611b6e612c51565b60200260200101819052508080611b8490612c80565b915050611b1d565b50611b96816116cc565b91505090565b604080518082019091526060808252602082015260006020835110611bc957611bc48361165d565b611bcb565b825b60408051808201825260008082526020918201528151808301909252825182528083019082015290915085602001518560ff1681518110611c0e57611c0e612c51565b6020026020010181905250610bc785602001516126d3565b60606000611c348386612c9b565b67ffffffffffffffff811115611c4c57611c4c612946565b604051908082528060200260200182016040528015611c9157816020015b6040805180820190915260608082526020820152815260200190600190039081611c6a5790505b50905060005b85811015611ce957868181518110611cb157611cb1612c51565b6020026020010151828281518110611ccb57611ccb612c51565b60200260200101819052508080611ce190612c80565b915050611c97565b5060005b83811015611d4a57848181518110611d0757611d07612c51565b6020026020010151828783611d1c9190612c9b565b81518110611d2c57611d2c612c51565b60200260200101819052508080611d4290612c80565b915050611ced565b5095945050505050565b604080518082018252606080825260208201819052825160028082529181019093529091600091816020015b6060815260200190600190039081611d805790505090506000611dac611da5866117fa565b6000611413565b9050611dba610b748261150b565b82600081518110611dcd57611dcd612c51565b6020026020010181905250602084511015611e06578382600181518110611df657611df6612c51565b6020026020010181905250611e0f565b610ba08461165d565b610bc7826116cc565b6060600080611e2684612017565b91935090915060019050816001811115611e4257611e42612d46565b14611e8f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610257565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611ea85790505090506000835b865181101561200c5760208210611f545760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610257565b600080611f916040518060400160405280858c60000151611f759190612c3a565b8152602001858c60200151611f8a9190612c9b565b9052612017565b509150915060405180604001604052808383611fad9190612c9b565b8152602001848b60200151611fc29190612c9b565b815250858581518110611fd757611fd7612c51565b6020908102919091010152611fed600185612c9b565b9350611ff98183612c9b565b6120039084612c9b565b92505050611ed5565b508152949350505050565b60008060008084600001511161206f5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610257565b6020840151805160001a607f8111612094576000600160009450945094505050612361565b60b781116121105760006120a9608083612c3a565b9050808760000151116120fe5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610257565b60019550935060009250612361915050565b60bf81116121ff57600061212560b783612c3a565b90508087600001511161217a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610257565b600183015160208290036101000a90046121948183612c9b565b8851116121e35760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610257565b6121ee826001612c9b565b965094506000935061236192505050565b60f7811161227a57600061221460c083612c3a565b9050808760000151116122695760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610257565b600195509350849250612361915050565b600061228760f783612c3a565b9050808760000151116122dc5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610257565b600183015160208290036101000a90046122f68183612c9b565b8851116123455760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610257565b612350826001612c9b565b965094506001935061236192505050565b9193909250565b606060008267ffffffffffffffff81111561238557612385612946565b6040519080825280601f01601f1916602001820160405280156123af576020820181803683370190505b5090508051600014156123c357905061130b565b60006123cf8587612c9b565b90506020820160005b6123e3602087612e0d565b81101561241a57825182526123f9602084612c9b565b9250612406602083612c9b565b91508061241281612c80565b9150506123d8565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606100fc826127a1565b60608060388410156124d157604080516001808252818301909252906020820181803683370190505090506124878385612db9565b60f81b8160008151811061249d5761249d612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506100f9565b600060015b6124e08187612e0d565b1561250657816124ef81612c80565b92506124ff905061010082612d27565b90506124d6565b612511826001612c9b565b67ffffffffffffffff81111561252957612529612946565b6040519080825280601f01601f191660200182016040528015612553576020820181803683370190505b5092506125608583612db9565b61256b906037612db9565b60f81b8360008151811061258157612581612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b81811161263f576101006125c98284612c3a565b6125d590610100612f05565b6125df9088612e0d565b6125e99190612da5565b60f81b8382815181106125fe576125fe612c51565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061263781612c80565b9150506125b5565b5050905092915050565b60606000612656836127b7565b9050612664815160c0612452565b81604051602001612676929190612dde565b604051602081830303815290604052915050919050565b60606002826000815181106126a4576126a4612c51565b01602001516126b6919060f81c612ce2565b60ff166126c8576100fc826002611336565b6100fc826001611336565b60408051808201909152606080825260208201526000825167ffffffffffffffff81111561270357612703612946565b60405190808252806020026020018201604052801561273657816020015b60608152602001906001900390816127215790505b50905060005b83518110156127975761276784828151811061275a5761275a612c51565b6020026020010151612447565b82828151811061277957612779612c51565b6020026020010181905250808061278f90612c80565b91505061273c565b5061130b816116cc565b60606100fc826020015160008460000151612368565b60608151600014156127d9576040805160008082526020820190925290610b0f565b6000805b8351811015612820578381815181106127f8576127f8612c51565b6020026020010151518261280c9190612c9b565b91508061281881612c80565b9150506127dd565b60008267ffffffffffffffff81111561283b5761283b612946565b6040519080825280601f01601f191660200182016040528015612865576020820181803683370190505b50600092509050602081015b8551831015611a2757600086848151811061288e5761288e612c51565b6020026020010151905060006020820190506128ac838284516128e9565b8785815181106128be576128be612c51565b602002602001015151836128d29190612c9b565b9250505082806128e190612c80565b935050612871565b8282825b602081106129255781518352612904602084612c9b565b9250612911602083612c9b565b915061291e602082612c3a565b90506128ed565b905182516020929092036101000a6000190180199091169116179052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261298657600080fd5b813567ffffffffffffffff808211156129a1576129a1612946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129e7576129e7612946565b81604052838152866020858801011115612a0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612a3557600080fd5b833567ffffffffffffffff80821115612a4d57600080fd5b612a5987838801612975565b94506020860135915080821115612a6f57600080fd5b50612a7c86828701612975565b925050604084013590509250925092565b60005b83811015612aa8578181015183820152602001612a90565b83811115612ab7576000848401525b50505050565b82151581526040602082015260008251806040840152612ae4816060850160208701612a8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60008060408385031215612b2a57600080fd5b823567ffffffffffffffff80821115612b4257600080fd5b612b4e86838701612975565b93506020850135915080821115612b6457600080fd5b50612b7185828601612975565b9150509250929050565b60008060008060808587031215612b9157600080fd5b843567ffffffffffffffff80821115612ba957600080fd5b612bb588838901612975565b95506020870135915080821115612bcb57600080fd5b612bd788838901612975565b94506040870135915080821115612bed57600080fd5b50612bfa87828801612975565b949793965093946060013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612c4c57612c4c612c0b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000600019821415612c9457612c94612c0b565b5060010190565b60008219821115612cae57612cae612c0b565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680612cf557612cf5612cb3565b8060ff84160691505092915050565b600060ff821660ff841680821015612d1e57612d1e612c0b565b90039392505050565b6000816000190483118215151615612d4157612d41612c0b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081612d8457612d84612c0b565b506000190190565b600060208284031215612d9e57600080fd5b5051919050565b600082612db457612db4612cb3565b500690565b600060ff821660ff84168060ff03821115612dd657612dd6612c0b565b019392505050565b60008351612df0818460208801612a8d565b835190830190612e04818360208801612a8d565b01949350505050565b600082612e1c57612e1c612cb3565b500490565b600181815b80851115612e5c578160001904821115612e4257612e42612c0b565b80851615612e4f57918102915b93841c9390800290612e26565b509250929050565b600082612e73575060016100fc565b81612e80575060006100fc565b8160018114612e965760028114612ea057612ebc565b60019150506100fc565b60ff841115612eb157612eb1612c0b565b50506001821b6100fc565b5060208310610133831016604e8410600b8410161715612edf575081810a6100fc565b612ee98383612e21565b8060001904821115612efd57612efd612c0b565b029392505050565b60006100f98383612e6456fea164736f6c6343000809000a"; ++ ++type TestLib_SecureMerkleTrieConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_SecureMerkleTrieConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_SecureMerkleTrie__factory extends ContractFactory { ++ constructor(...args: TestLib_SecureMerkleTrieConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_SecureMerkleTrie { ++ return super.attach(address) as TestLib_SecureMerkleTrie; ++ } ++ override connect(signer: Signer): TestLib_SecureMerkleTrie__factory { ++ return super.connect(signer) as TestLib_SecureMerkleTrie__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_SecureMerkleTrieInterface { ++ return new utils.Interface(_abi) as TestLib_SecureMerkleTrieInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_SecureMerkleTrie { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as TestLib_SecureMerkleTrie; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/index.ts +new file mode 100644 +index 0000000..a67049c +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/trie/index.ts +@@ -0,0 +1,5 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_MerkleTrie__factory } from "./TestLib_MerkleTrie__factory"; ++export { TestLib_SecureMerkleTrie__factory } from "./TestLib_SecureMerkleTrie__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Buffer__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Buffer__factory.ts +new file mode 100644 +index 0000000..7119241 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Buffer__factory.ts +@@ -0,0 +1,170 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_Buffer, ++ TestLib_BufferInterface, ++} from "../../../../contracts/test-libraries/utils/TestLib_Buffer"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "uint40", ++ name: "_index", ++ type: "uint40", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_extraData", ++ type: "bytes27", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint40", ++ name: "_index", ++ type: "uint40", ++ }, ++ ], ++ name: "deleteElementsAfterInclusive", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ ], ++ name: "get", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getExtraData", ++ outputs: [ ++ { ++ internalType: "bytes27", ++ name: "", ++ type: "bytes27", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [], ++ name: "getLength", ++ outputs: [ ++ { ++ internalType: "uint40", ++ name: "", ++ type: "uint40", ++ }, ++ ], ++ stateMutability: "view", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_value", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes27", ++ name: "_extraData", ++ type: "bytes27", ++ }, ++ ], ++ name: "push", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes27", ++ name: "_extraData", ++ type: "bytes27", ++ }, ++ ], ++ name: "setExtraData", ++ outputs: [], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b5061068d806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639507d39a1161005b5780639507d39a146100bd578063a77df992146100e3578063be1c766b14610102578063f8ab57d81461012057600080fd5b8063061bc18f146100825780632015276c1461009757806320f89a35146100aa575b600080fd5b610095610090366004610588565b610133565b005b6100956100a53660046105bb565b610143565b6100956100b83660046105de565b61014f565b6100d06100cb366004610600565b61015d565b6040519081526020015b60405180910390f35b6100eb61016f565b60405164ffffffffff1990911681526020016100da565b61010a610180565b60405164ffffffffff90911681526020016100da565b61009561012e366004610619565b61018c565b61013f60008383610197565b5050565b61013f60008383610283565b61015a600082610312565b50565b60006101698183610373565b92915050565b600061017b6000610442565b905090565b600061017b6000610490565b61015a6000826104db565b60006101d984604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b9050806000015164ffffffffff168364ffffffffff161061025b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e00000000000000000000000060448201526064015b60405180910390fd5b64ffffffffff8316815264ffffffffff198216602082015261027d8482610538565b50505050565b60006102c584604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805164ffffffffff16600090815260018601602052604090208490558051909150816102f082610634565b64ffffffffff1690525064ffffffffff198216602082015261027d8482610538565b600061035483604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b64ffffffffff1983166020820152905061036e8382610538565b505050565b6000806103b684604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b805190915064ffffffffff16831061042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e646578206f7574206f6620626f756e64732e0000000000000000000000006044820152606401610252565b50506000908152600191909101602052604090205490565b60008061048583604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b602001519392505050565b6000806104d383604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b519392505050565b600061051d83604080518082019091526000808252602082015250546040805180820190915264ffffffffff8216815264ffffffffff19909116602082015290565b905061036e828260200151856101979092919063ffffffff16565b8051602082015183548183179291908314610551578285555b5050505050565b803564ffffffffff8116811461056d57600080fd5b919050565b803564ffffffffff198116811461056d57600080fd5b6000806040838503121561059b57600080fd5b6105a483610558565b91506105b260208401610572565b90509250929050565b600080604083850312156105ce57600080fd5b823591506105b260208401610572565b6000602082840312156105f057600080fd5b6105f982610572565b9392505050565b60006020828403121561061257600080fd5b5035919050565b60006020828403121561062b57600080fd5b6105f982610558565b600064ffffffffff80831681811415610676577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600101939250505056fea164736f6c6343000809000a"; ++ ++type TestLib_BufferConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_BufferConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_Buffer__factory extends ContractFactory { ++ constructor(...args: TestLib_BufferConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_Buffer { ++ return super.attach(address) as TestLib_Buffer; ++ } ++ override connect(signer: Signer): TestLib_Buffer__factory { ++ return super.connect(signer) as TestLib_Buffer__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_BufferInterface { ++ return new utils.Interface(_abi) as TestLib_BufferInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_Buffer { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_Buffer; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Bytes32Utils__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Bytes32Utils__factory.ts +new file mode 100644 +index 0000000..313eb39 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_Bytes32Utils__factory.ts +@@ -0,0 +1,143 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_Bytes32Utils, ++ TestLib_Bytes32UtilsInterface, ++} from "../../../../contracts/test-libraries/utils/TestLib_Bytes32Utils"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "address", ++ name: "_in", ++ type: "address", ++ }, ++ ], ++ name: "fromAddress", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "_out", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bool", ++ name: "_in", ++ type: "bool", ++ }, ++ ], ++ name: "fromBool", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "_out", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_in", ++ type: "bytes32", ++ }, ++ ], ++ name: "toAddress", ++ outputs: [ ++ { ++ internalType: "address", ++ name: "_out", ++ type: "address", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_in", ++ type: "bytes32", ++ }, ++ ], ++ name: "toBool", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "_out", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506101c1806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063341f6623146100515780638f03f7fd1461008e578063934e03a4146100af578063b72e717d146100d2575b600080fd5b61006461005f36600461013c565b6100e5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a161009c366004610155565b6100ef565b604051908152602001610085565b6100c26100bd36600461013c565b6100fa565b6040519015158152602001610085565b6100a16100e036600461017e565b610104565b6000815b92915050565b60006100e982610122565b60008115156100e9565b600073ffffffffffffffffffffffffffffffffffffffff82166100e9565b600081610130576000610133565b60015b60ff1692915050565b60006020828403121561014e57600080fd5b5035919050565b60006020828403121561016757600080fd5b8135801515811461017757600080fd5b9392505050565b60006020828403121561019057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461017757600080fdfea164736f6c6343000809000a"; ++ ++type TestLib_Bytes32UtilsConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_Bytes32UtilsConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_Bytes32Utils__factory extends ContractFactory { ++ constructor(...args: TestLib_Bytes32UtilsConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_Bytes32Utils { ++ return super.attach(address) as TestLib_Bytes32Utils; ++ } ++ override connect(signer: Signer): TestLib_Bytes32Utils__factory { ++ return super.connect(signer) as TestLib_Bytes32Utils__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_Bytes32UtilsInterface { ++ return new utils.Interface(_abi) as TestLib_Bytes32UtilsInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_Bytes32Utils { ++ return new Contract( ++ address, ++ _abi, ++ signerOrProvider ++ ) as TestLib_Bytes32Utils; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_BytesUtils__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_BytesUtils__factory.ts +new file mode 100644 +index 0000000..5dee890 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_BytesUtils__factory.ts +@@ -0,0 +1,245 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_BytesUtils, ++ TestLib_BytesUtilsInterface, ++} from "../../../../contracts/test-libraries/utils/TestLib_BytesUtils"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_preBytes", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_postBytes", ++ type: "bytes", ++ }, ++ ], ++ name: "concat", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ { ++ internalType: "bytes", ++ name: "_other", ++ type: "bytes", ++ }, ++ ], ++ name: "equal", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ ], ++ name: "fromNibbles", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_start", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_length", ++ type: "uint256", ++ }, ++ ], ++ name: "slice", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ { ++ internalType: "uint256", ++ name: "_start", ++ type: "uint256", ++ }, ++ { ++ internalType: "uint256", ++ name: "_length", ++ type: "uint256", ++ }, ++ ], ++ name: "sliceWithTaintedMemory", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "nonpayable", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ ], ++ name: "toBytes32", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ ], ++ name: "toNibbles", ++ outputs: [ ++ { ++ internalType: "bytes", ++ name: "", ++ type: "bytes", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes", ++ name: "_bytes", ++ type: "bytes", ++ }, ++ ], ++ name: "toUint256", ++ outputs: [ ++ { ++ internalType: "uint256", ++ name: "", ++ type: "uint256", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b506111fa806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c6fa7f7a1161005b578063c6fa7f7a14610109578063cf89ee171461011c578063e00413961461012f578063efa739761461014257600080fd5b8063235266d21461008d57806347f53431146100b55780635f3376f3146100d6578063bd37c8aa146100f6575b600080fd5b6100a061009b3660046107f9565b610155565b60405190151581526020015b60405180910390f35b6100c86100c336600461085d565b610179565b6040519081526020016100ac565b6100e96100e43660046107f9565b61018a565b6040516100ac91906108c2565b6100c861010436600461085d565b6101b6565b6100e961011736600461085d565b6101c1565b6100e961012a366004610913565b6101cc565b6100e961013d366004610913565b61020b565b6100e961015036600461085d565b610218565b600061017283838051602091820120825192909101919091201490565b9392505050565b600061018482610223565b92915050565b6060828260405160200161019f929190610961565b604051602081830303815290604052905092915050565b600061018482610179565b60606101848261024b565b60606040516101da90610712565b604051809103906000f0801580156101f6573d6000803e3d6000fd5b50506102038484846103ce565b949350505050565b60606102038484846103ce565b6060610184826105c0565b600060208251101561023757506020015190565b818060200190518101906101849190610990565b606060008251600261025d91906109d8565b67ffffffffffffffff8111156102755761027561071f565b6040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b83518110156103c75760048482815181106102c2576102c2610a15565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826102f78360026109d8565b8151811061030757610307610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061034a5761034a610a15565b016020015161035c919060f81c610a73565b60f81b8261036b8360026109d8565b610376906001610a95565b8151811061038657610386610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806103bf81610aad565b9150506102a5565b5092915050565b6060816103dc81601f610a95565b1015610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b826104548382610a95565b10156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610440565b6104c68284610a95565b84511015610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610440565b60608215801561054f57604051915060008252602082016040526105b7565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610588578051835260209283019201610570565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606000600283516105d29190610ae6565b67ffffffffffffffff8111156105ea576105ea61071f565b6040519080825280601f01601f191660200182016040528015610614576020820181803683370190505b50905060005b81518110156103c7578361062f8260026109d8565b61063a906001610a95565b8151811061064a5761064a610a15565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660048561067f8460026109d8565b8151811061068f5761068f610a15565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b178282815181106106d1576106d1610a15565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061070a81610aad565b91505061061a565b6106f380610afb83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261075f57600080fd5b813567ffffffffffffffff8082111561077a5761077a61071f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156107c0576107c061071f565b816040528381528660208588010111156107d957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561080c57600080fd5b823567ffffffffffffffff8082111561082457600080fd5b6108308683870161074e565b9350602085013591508082111561084657600080fd5b506108538582860161074e565b9150509250929050565b60006020828403121561086f57600080fd5b813567ffffffffffffffff81111561088657600080fd5b6102038482850161074e565b60005b838110156108ad578181015183820152602001610895565b838111156108bc576000848401525b50505050565b60208152600082518060208401526108e1816040850160208701610892565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006060848603121561092857600080fd5b833567ffffffffffffffff81111561093f57600080fd5b61094b8682870161074e565b9660208601359650604090950135949350505050565b60008351610973818460208801610892565b835190830190610987818360208801610892565b01949350505050565b6000602082840312156109a257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a1057610a106109a9565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680610a8657610a86610a44565b8060ff84160691505092915050565b60008219821115610aa857610aa86109a9565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610adf57610adf6109a9565b5060010190565b600082610af557610af5610a44565b50049056fe608060405234801561001057600080fd5b506106d3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b41146101b1578063a9059cbb146101ed578063dd62ed3e1461020057600080fd5b806340c10f191461017c57806370a082311461019157600080fd5b806318160ddd116100a757806318160ddd1461013857806323b872dd1461014f578063313ce5671461016257600080fd5b806306fdde03146100c3578063095ea7b314610115575b600080fd5b6100ff6040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610511565b60405180910390f35b6101286101233660046105ad565b61022b565b604051901515815260200161010c565b61014160005481565b60405190815260200161010c565b61012861015d3660046105d7565b610241565b61016a601281565b60405160ff909116815260200161010c565b61018f61018a3660046105ad565b61031b565b005b61014161019f366004610613565b60016020526000908152604090205481565b6100ff6040518060400160405280600381526020017f545354000000000000000000000000000000000000000000000000000000000081525081565b6101286101fb3660046105ad565b6103c6565b61014161020e366004610635565b600260209081526000928352604080842090915290825290205481565b60006102383384846103d3565b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146103065773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546102d4908390610697565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610311848484610442565b5060019392505050565b8060005461032991906106ae565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461035c9082906106ae565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103ba9085815260200190565b60405180910390a35050565b6000610238338484610442565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054610473908290610697565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546104b09082906106ae565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104359085815260200190565b600060208083528351808285015260005b8181101561053e57858101830151858201604001528201610522565b81811115610550576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a857600080fd5b919050565b600080604083850312156105c057600080fd5b6105c983610584565b946020939093013593505050565b6000806000606084860312156105ec57600080fd5b6105f584610584565b925061060360208501610584565b9150604084013590509250925092565b60006020828403121561062557600080fd5b61062e82610584565b9392505050565b6000806040838503121561064857600080fd5b61065183610584565b915061065f60208401610584565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156106a9576106a9610668565b500390565b600082198211156106c1576106c1610668565b50019056fea164736f6c6343000809000aa164736f6c6343000809000a"; ++ ++type TestLib_BytesUtilsConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_BytesUtilsConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_BytesUtils__factory extends ContractFactory { ++ constructor(...args: TestLib_BytesUtilsConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_BytesUtils { ++ return super.attach(address) as TestLib_BytesUtils; ++ } ++ override connect(signer: Signer): TestLib_BytesUtils__factory { ++ return super.connect(signer) as TestLib_BytesUtils__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_BytesUtilsInterface { ++ return new utils.Interface(_abi) as TestLib_BytesUtilsInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_BytesUtils { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_BytesUtils; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_MerkleTree__factory.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_MerkleTree__factory.ts +new file mode 100644 +index 0000000..03078d2 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/TestLib_MerkleTree__factory.ts +@@ -0,0 +1,121 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; ++import type { Provider, TransactionRequest } from "@ethersproject/providers"; ++import type { PromiseOrValue } from "../../../../common"; ++import type { ++ TestLib_MerkleTree, ++ TestLib_MerkleTreeInterface, ++} from "../../../../contracts/test-libraries/utils/TestLib_MerkleTree"; ++ ++const _abi = [ ++ { ++ inputs: [ ++ { ++ internalType: "bytes32[]", ++ name: "_elements", ++ type: "bytes32[]", ++ }, ++ ], ++ name: "getMerkleRoot", ++ outputs: [ ++ { ++ internalType: "bytes32", ++ name: "", ++ type: "bytes32", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++ { ++ inputs: [ ++ { ++ internalType: "bytes32", ++ name: "_root", ++ type: "bytes32", ++ }, ++ { ++ internalType: "bytes32", ++ name: "_leaf", ++ type: "bytes32", ++ }, ++ { ++ internalType: "uint256", ++ name: "_index", ++ type: "uint256", ++ }, ++ { ++ internalType: "bytes32[]", ++ name: "_siblings", ++ type: "bytes32[]", ++ }, ++ { ++ internalType: "uint256", ++ name: "_totalLeaves", ++ type: "uint256", ++ }, ++ ], ++ name: "verify", ++ outputs: [ ++ { ++ internalType: "bool", ++ name: "", ++ type: "bool", ++ }, ++ ], ++ stateMutability: "pure", ++ type: "function", ++ }, ++] as const; ++ ++const _bytecode = ++ "0x608060405234801561001057600080fd5b50610c5b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634869bfb61461003b5780637b0467a014610061575b600080fd5b61004e610049366004610a55565b610084565b6040519081526020015b60405180910390f35b61007461006f366004610a92565b610095565b6040519015158152602001610058565b600061008f826100ae565b92915050565b60006100a486868686866105b1565b9695505050505050565b600080825111610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084015b60405180910390fd5b815160011415610171578160008151811061016257610162610af4565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561058757610422600285610b81565b915061042f600285610b95565b600114905060005b828110156104db578a61044b826002610ba9565b8151811061045b5761045b610af4565b602002602001015196508a8160026104739190610ba9565b61047e906001610be6565b8151811061048e5761048e610af4565b6020026020010151955086602089015285604089015287805190602001208b82815181106104be576104be610af4565b6020908102919091010152806104d381610bfe565b915050610437565b50801561055757896104ee600186610c37565b815181106104fe576104fe610af4565b6020026020010151955087836010811061051a5761051a610af4565b602002015160001b945085602088015284604088015286805190602001208a838151811061054a5761054a610af4565b6020026020010181815250505b80610563576000610566565b60015b6105739060ff1683610be6565b93508261057f81610bfe565b93505061040e565b8960008151811061059a5761059a610af4565b602002602001015198505050505050505050919050565b6000808211610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161013c565b8184106106d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161013c565b6106d98261086d565b83511461078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161013c565b8460005b84518110156108605785600116600114156107f9578481815181106107b9576107b9610af4565b6020026020010151826040516020016107dc929190918252602082015260400190565b604051602081830303815290604052805190602001209150610847565b8185828151811061080c5761080c610af4565b602002602001015160405160200161082e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c948061085881610bfe565b915050610792565b5090951495945050505050565b60008082116108fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161013c565b816001141561090f57506000919050565b81600060805b6001811061094d578061092b600180831b610c37565b901b8316156109455761093e8183610be6565b92811c9291505b60011c610915565b506001811b841461096657610963600182610be6565b90505b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126109ad57600080fd5b8135602067ffffffffffffffff808311156109ca576109ca61096d565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610a0d57610a0d61096d565b604052938452858101830193838101925087851115610a2b57600080fd5b83870191505b84821015610a4a57813583529183019190830190610a31565b979650505050505050565b600060208284031215610a6757600080fd5b813567ffffffffffffffff811115610a7e57600080fd5b610a8a8482850161099c565b949350505050565b600080600080600060a08688031215610aaa57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115610ad657600080fd5b610ae28882890161099c565b95989497509295608001359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082610b9057610b90610b23565b500490565b600082610ba457610ba4610b23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610be157610be1610b52565b500290565b60008219821115610bf957610bf9610b52565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610c3057610c30610b52565b5060010190565b600082821015610c4957610c49610b52565b50039056fea164736f6c6343000809000a"; ++ ++type TestLib_MerkleTreeConstructorParams = ++ | [signer?: Signer] ++ | ConstructorParameters; ++ ++const isSuperArgs = ( ++ xs: TestLib_MerkleTreeConstructorParams ++): xs is ConstructorParameters => xs.length > 1; ++ ++export class TestLib_MerkleTree__factory extends ContractFactory { ++ constructor(...args: TestLib_MerkleTreeConstructorParams) { ++ if (isSuperArgs(args)) { ++ super(...args); ++ } else { ++ super(_abi, _bytecode, args[0]); ++ } ++ } ++ ++ override deploy( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): Promise { ++ return super.deploy(overrides || {}) as Promise; ++ } ++ override getDeployTransaction( ++ overrides?: Overrides & { from?: PromiseOrValue } ++ ): TransactionRequest { ++ return super.getDeployTransaction(overrides || {}); ++ } ++ override attach(address: string): TestLib_MerkleTree { ++ return super.attach(address) as TestLib_MerkleTree; ++ } ++ override connect(signer: Signer): TestLib_MerkleTree__factory { ++ return super.connect(signer) as TestLib_MerkleTree__factory; ++ } ++ ++ static readonly bytecode = _bytecode; ++ static readonly abi = _abi; ++ static createInterface(): TestLib_MerkleTreeInterface { ++ return new utils.Interface(_abi) as TestLib_MerkleTreeInterface; ++ } ++ static connect( ++ address: string, ++ signerOrProvider: Signer | Provider ++ ): TestLib_MerkleTree { ++ return new Contract(address, _abi, signerOrProvider) as TestLib_MerkleTree; ++ } ++} +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/index.ts +new file mode 100644 +index 0000000..2d55337 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/contracts/test-libraries/utils/index.ts +@@ -0,0 +1,7 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export { TestLib_Buffer__factory } from "./TestLib_Buffer__factory"; ++export { TestLib_Bytes32Utils__factory } from "./TestLib_Bytes32Utils__factory"; ++export { TestLib_BytesUtils__factory } from "./TestLib_BytesUtils__factory"; ++export { TestLib_MerkleTree__factory } from "./TestLib_MerkleTree__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/factories/index.ts b/node_modules/@eth-optimism/contracts/dist/types/factories/index.ts +new file mode 100644 +index 0000000..e94c7fd +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/types/factories/index.ts +@@ -0,0 +1,6 @@ ++/* Autogenerated file. Do not edit manually. */ ++/* tslint:disable */ ++/* eslint-disable */ ++export * as boba from "./@boba"; ++export * as openzeppelin from "./@openzeppelin"; ++export * as contracts from "./contracts"; +diff --git a/node_modules/@eth-optimism/contracts/dist/types/hardhat.d.ts b/node_modules/@eth-optimism/contracts/dist/types/hardhat.d.ts +index 38bef8e..8d782c2 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/hardhat.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/hardhat.d.ts +@@ -12,6 +12,10 @@ import * as Contracts from "."; + + declare module "hardhat/types/runtime" { + interface HardhatEthersHelpers extends HardhatEthersHelpersBase { ++ getContractFactory( ++ name: "ITuringHelper", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "OwnableUpgradeable", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -28,10 +32,38 @@ declare module "hardhat/types/runtime" { + name: "ERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "ERC20Permit", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "IERC20Permit", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "ERC20Burnable", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "ERC20Votes", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "ERC20VotesComp", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "IERC20Metadata", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "ERC20VotesComp", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "ERC20Votes", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "IERC20", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -49,17 +81,17 @@ declare module "hardhat/types/runtime" { + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "AddressDictator", ++ name: "IL1CrossDomainMessenger", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "ChugSplashDictator", ++ name: "IL1CrossDomainMessengerFast", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "IL1CrossDomainMessenger", ++ name: "IL1DepositHash", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( + name: "IL1ERC20Bridge", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -68,14 +100,34 @@ declare module "hardhat/types/runtime" { + name: "IL1StandardBridge", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "IL1StandardBridgeAltL1", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "L1CrossDomainMessenger", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "L1CrossDomainMessengerFast", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "L1MultiMessageRelayer", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "L1MultiMessageRelayerFast", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "L1StandardBridge", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "L1StandardBridgeAltL1", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "CanonicalTransactionChain", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -101,9 +153,9 @@ declare module "hardhat/types/runtime" { + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "TeleportrDeposit", ++ name: "BOBA", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( + name: "BondManager", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -128,46 +180,74 @@ declare module "hardhat/types/runtime" { + name: "L2StandardBridge", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "L2StandardBridgeAltL1", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "L2StandardTokenFactory", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "IOVML1BlockNumber", ++ name: "Boba_GasPriceOracle", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "IOVML2ToL1MessagePasser", ++ name: "Boba_GasPriceOracleAltL1", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "OVMDeployerWhitelist", ++ name: "BobaTuringCredit", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "OVMETH", ++ name: "BobaTuringCreditAltL1", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "OVMGasPriceOracle", ++ name: "IOVM_L1BlockNumber", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "OVML2ToL1MessagePasser", ++ name: "IOVM_L2ToL1MessagePasser", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "OVMSequencerFeeVault", ++ name: "L2_BOBA", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "WETH9", ++ name: "L2_L1NativeToken", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; ++ getContractFactory( ++ name: "OVM_DeployerWhitelist", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "OVM_ETH", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "OVM_GasPriceOracle", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( +- name: "TeleportrDisburser", ++ name: "OVM_L2ToL1MessagePasser", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; ++ getContractFactory( ++ name: "OVM_SequencerFeeVault", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "OVM_SequencerFeeVaultAltL1", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; ++ getContractFactory( ++ name: "WETH9", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "CrossDomainEnabled", + signerOrOptions?: ethers.Signer | FactoryOptions +@@ -177,82 +257,95 @@ declare module "hardhat/types/runtime" { + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "LibAddressManager", ++ name: "Lib_AddressManager", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "LibAddressResolver", ++ name: "Lib_AddressResolver", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "LibResolvedDelegateProxy", ++ name: "Lib_ResolvedDelegateBobaProxy", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; ++ getContractFactory( ++ name: "Lib_ResolvedDelegateProxy", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "IL2StandardERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; ++ getContractFactory( ++ name: "L2GovernanceERC20", ++ signerOrOptions?: ethers.Signer | FactoryOptions ++ ): Promise; + getContractFactory( + name: "L2StandardERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "FailingReceiver", ++ name: "Helper_GasMeasurer", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "HelperSimpleProxy", ++ name: "Helper_SimpleProxy", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( + name: "TestERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( +- name: "TestLibCrossDomainUtils", ++ name: "TestLib_CrossDomainUtils", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibOVMCodec", ++ name: "TestLib_OVMCodec", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibRLPReader", ++ name: "TestLib_RLPReader", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibRLPWriter", ++ name: "TestLib_RLPWriter", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibAddressAliasHelper", ++ name: "TestLib_AddressAliasHelper", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibMerkleTrie", ++ name: "TestLib_MerkleTrie", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibSecureMerkleTrie", ++ name: "TestLib_SecureMerkleTrie", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibBuffer", ++ name: "TestLib_Buffer", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibBytes32Utils", ++ name: "TestLib_Bytes32Utils", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibBytesUtils", ++ name: "TestLib_BytesUtils", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + getContractFactory( +- name: "TestLibMerkleTree", ++ name: "TestLib_MerkleTree", + signerOrOptions?: ethers.Signer | FactoryOptions +- ): Promise; ++ ): Promise; + ++ getContractAt( ++ name: "ITuringHelper", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "OwnableUpgradeable", + address: string, +@@ -273,11 +366,46 @@ declare module "hardhat/types/runtime" { + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "ERC20Permit", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "IERC20Permit", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "ERC20Burnable", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "ERC20Votes", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "ERC20VotesComp", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "IERC20Metadata", + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "ERC20VotesComp", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "ERC20Votes", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "IERC20", + address: string, +@@ -299,20 +427,20 @@ declare module "hardhat/types/runtime" { + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "AddressDictator", ++ name: "IL1CrossDomainMessenger", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "ChugSplashDictator", ++ name: "IL1CrossDomainMessengerFast", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "IL1CrossDomainMessenger", ++ name: "IL1DepositHash", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( + name: "IL1ERC20Bridge", + address: string, +@@ -323,16 +451,41 @@ declare module "hardhat/types/runtime" { + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "IL1StandardBridgeAltL1", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "L1CrossDomainMessenger", + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "L1CrossDomainMessengerFast", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "L1MultiMessageRelayer", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "L1MultiMessageRelayerFast", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "L1StandardBridge", + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "L1StandardBridgeAltL1", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "CanonicalTransactionChain", + address: string, +@@ -364,10 +517,10 @@ declare module "hardhat/types/runtime" { + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "TeleportrDeposit", ++ name: "BOBA", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( + name: "BondManager", + address: string, +@@ -398,56 +551,91 @@ declare module "hardhat/types/runtime" { + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "L2StandardBridgeAltL1", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "L2StandardTokenFactory", + address: string, + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "IOVML1BlockNumber", ++ name: "Boba_GasPriceOracle", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "IOVML2ToL1MessagePasser", ++ name: "Boba_GasPriceOracleAltL1", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "OVMDeployerWhitelist", ++ name: "BobaTuringCredit", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "OVMETH", ++ name: "BobaTuringCreditAltL1", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "OVMGasPriceOracle", ++ name: "IOVM_L1BlockNumber", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "OVML2ToL1MessagePasser", ++ name: "IOVM_L2ToL1MessagePasser", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "OVMSequencerFeeVault", ++ name: "L2_BOBA", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "WETH9", ++ name: "L2_L1NativeToken", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; ++ getContractAt( ++ name: "OVM_DeployerWhitelist", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( +- name: "TeleportrDisburser", ++ name: "OVM_ETH", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; ++ getContractAt( ++ name: "OVM_GasPriceOracle", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "OVM_L2ToL1MessagePasser", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "OVM_SequencerFeeVault", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "OVM_SequencerFeeVaultAltL1", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "WETH9", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "CrossDomainEnabled", + address: string, +@@ -459,100 +647,110 @@ declare module "hardhat/types/runtime" { + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "LibAddressManager", ++ name: "Lib_AddressManager", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; ++ getContractAt( ++ name: "Lib_AddressResolver", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "LibAddressResolver", ++ name: "Lib_ResolvedDelegateBobaProxy", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "LibResolvedDelegateProxy", ++ name: "Lib_ResolvedDelegateProxy", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( + name: "IL2StandardERC20", + address: string, + signer?: ethers.Signer + ): Promise; ++ getContractAt( ++ name: "L2GovernanceERC20", ++ address: string, ++ signer?: ethers.Signer ++ ): Promise; + getContractAt( + name: "L2StandardERC20", + address: string, + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "FailingReceiver", ++ name: "Helper_GasMeasurer", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "HelperSimpleProxy", ++ name: "Helper_SimpleProxy", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( + name: "TestERC20", + address: string, + signer?: ethers.Signer + ): Promise; + getContractAt( +- name: "TestLibCrossDomainUtils", ++ name: "TestLib_CrossDomainUtils", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibOVMCodec", ++ name: "TestLib_OVMCodec", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibRLPReader", ++ name: "TestLib_RLPReader", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibRLPWriter", ++ name: "TestLib_RLPWriter", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibAddressAliasHelper", ++ name: "TestLib_AddressAliasHelper", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibMerkleTrie", ++ name: "TestLib_MerkleTrie", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibSecureMerkleTrie", ++ name: "TestLib_SecureMerkleTrie", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibBuffer", ++ name: "TestLib_Buffer", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibBytes32Utils", ++ name: "TestLib_Bytes32Utils", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibBytesUtils", ++ name: "TestLib_BytesUtils", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + getContractAt( +- name: "TestLibMerkleTree", ++ name: "TestLib_MerkleTree", + address: string, + signer?: ethers.Signer +- ): Promise; ++ ): Promise; + + // default types + getContractFactory( +diff --git a/node_modules/@eth-optimism/contracts/dist/types/index.ts b/node_modules/@eth-optimism/contracts/dist/types/index.ts +index 74e5ff1..3bafe65 100644 +--- a/node_modules/@eth-optimism/contracts/dist/types/index.ts ++++ b/node_modules/@eth-optimism/contracts/dist/types/index.ts +@@ -1,124 +1,170 @@ + /* Autogenerated file. Do not edit manually. */ + /* tslint:disable */ + /* eslint-disable */ +-export type { OwnableUpgradeable } from "./OwnableUpgradeable"; +-export type { PausableUpgradeable } from "./PausableUpgradeable"; +-export type { Ownable } from "./Ownable"; +-export type { ERC20 } from "./ERC20"; +-export type { IERC20Metadata } from "./IERC20Metadata"; +-export type { IERC20 } from "./IERC20"; +-export type { IERC165 } from "./IERC165"; +-export type { IL1ChugSplashDeployer } from "./IL1ChugSplashDeployer"; +-export type { L1ChugSplashProxy } from "./L1ChugSplashProxy"; +-export type { AddressDictator } from "./AddressDictator"; +-export type { ChugSplashDictator } from "./ChugSplashDictator"; +-export type { IL1CrossDomainMessenger } from "./IL1CrossDomainMessenger"; +-export type { IL1ERC20Bridge } from "./IL1ERC20Bridge"; +-export type { IL1StandardBridge } from "./IL1StandardBridge"; +-export type { L1CrossDomainMessenger } from "./L1CrossDomainMessenger"; +-export type { L1StandardBridge } from "./L1StandardBridge"; +-export type { CanonicalTransactionChain } from "./CanonicalTransactionChain"; +-export type { ChainStorageContainer } from "./ChainStorageContainer"; +-export type { ICanonicalTransactionChain } from "./ICanonicalTransactionChain"; +-export type { IChainStorageContainer } from "./IChainStorageContainer"; +-export type { IStateCommitmentChain } from "./IStateCommitmentChain"; +-export type { StateCommitmentChain } from "./StateCommitmentChain"; +-export type { TeleportrDeposit } from "./TeleportrDeposit"; +-export type { BondManager } from "./BondManager"; +-export type { IBondManager } from "./IBondManager"; +-export type { IL2CrossDomainMessenger } from "./IL2CrossDomainMessenger"; +-export type { IL2ERC20Bridge } from "./IL2ERC20Bridge"; +-export type { L2CrossDomainMessenger } from "./L2CrossDomainMessenger"; +-export type { L2StandardBridge } from "./L2StandardBridge"; +-export type { L2StandardTokenFactory } from "./L2StandardTokenFactory"; +-export type { IOVML1BlockNumber } from "./IOVML1BlockNumber"; +-export type { IOVML2ToL1MessagePasser } from "./IOVML2ToL1MessagePasser"; +-export type { OVMDeployerWhitelist } from "./OVMDeployerWhitelist"; +-export type { OVMETH } from "./OVMETH"; +-export type { OVMGasPriceOracle } from "./OVMGasPriceOracle"; +-export type { OVML2ToL1MessagePasser } from "./OVML2ToL1MessagePasser"; +-export type { OVMSequencerFeeVault } from "./OVMSequencerFeeVault"; +-export type { WETH9 } from "./WETH9"; +-export type { TeleportrDisburser } from "./TeleportrDisburser"; +-export type { CrossDomainEnabled } from "./CrossDomainEnabled"; +-export type { ICrossDomainMessenger } from "./ICrossDomainMessenger"; +-export type { LibAddressManager } from "./LibAddressManager"; +-export type { LibAddressResolver } from "./LibAddressResolver"; +-export type { LibResolvedDelegateProxy } from "./LibResolvedDelegateProxy"; +-export type { IL2StandardERC20 } from "./IL2StandardERC20"; +-export type { L2StandardERC20 } from "./L2StandardERC20"; +-export type { FailingReceiver } from "./FailingReceiver"; +-export type { HelperSimpleProxy } from "./HelperSimpleProxy"; +-export type { TestERC20 } from "./TestERC20"; +-export type { TestLibCrossDomainUtils } from "./TestLibCrossDomainUtils"; +-export type { TestLibOVMCodec } from "./TestLibOVMCodec"; +-export type { TestLibRLPReader } from "./TestLibRLPReader"; +-export type { TestLibRLPWriter } from "./TestLibRLPWriter"; +-export type { TestLibAddressAliasHelper } from "./TestLibAddressAliasHelper"; +-export type { TestLibMerkleTrie } from "./TestLibMerkleTrie"; +-export type { TestLibSecureMerkleTrie } from "./TestLibSecureMerkleTrie"; +-export type { TestLibBuffer } from "./TestLibBuffer"; +-export type { TestLibBytes32Utils } from "./TestLibBytes32Utils"; +-export type { TestLibBytesUtils } from "./TestLibBytesUtils"; +-export type { TestLibMerkleTree } from "./TestLibMerkleTree"; +- +-export { OwnableUpgradeable__factory } from "./factories/OwnableUpgradeable__factory"; +-export { PausableUpgradeable__factory } from "./factories/PausableUpgradeable__factory"; +-export { Ownable__factory } from "./factories/Ownable__factory"; +-export { ERC20__factory } from "./factories/ERC20__factory"; +-export { IERC20Metadata__factory } from "./factories/IERC20Metadata__factory"; +-export { IERC20__factory } from "./factories/IERC20__factory"; +-export { IERC165__factory } from "./factories/IERC165__factory"; +-export { IL1ChugSplashDeployer__factory } from "./factories/IL1ChugSplashDeployer__factory"; +-export { L1ChugSplashProxy__factory } from "./factories/L1ChugSplashProxy__factory"; +-export { AddressDictator__factory } from "./factories/AddressDictator__factory"; +-export { ChugSplashDictator__factory } from "./factories/ChugSplashDictator__factory"; +-export { IL1CrossDomainMessenger__factory } from "./factories/IL1CrossDomainMessenger__factory"; +-export { IL1ERC20Bridge__factory } from "./factories/IL1ERC20Bridge__factory"; +-export { IL1StandardBridge__factory } from "./factories/IL1StandardBridge__factory"; +-export { L1CrossDomainMessenger__factory } from "./factories/L1CrossDomainMessenger__factory"; +-export { L1StandardBridge__factory } from "./factories/L1StandardBridge__factory"; +-export { CanonicalTransactionChain__factory } from "./factories/CanonicalTransactionChain__factory"; +-export { ChainStorageContainer__factory } from "./factories/ChainStorageContainer__factory"; +-export { ICanonicalTransactionChain__factory } from "./factories/ICanonicalTransactionChain__factory"; +-export { IChainStorageContainer__factory } from "./factories/IChainStorageContainer__factory"; +-export { IStateCommitmentChain__factory } from "./factories/IStateCommitmentChain__factory"; +-export { StateCommitmentChain__factory } from "./factories/StateCommitmentChain__factory"; +-export { TeleportrDeposit__factory } from "./factories/TeleportrDeposit__factory"; +-export { BondManager__factory } from "./factories/BondManager__factory"; +-export { IBondManager__factory } from "./factories/IBondManager__factory"; +-export { IL2CrossDomainMessenger__factory } from "./factories/IL2CrossDomainMessenger__factory"; +-export { IL2ERC20Bridge__factory } from "./factories/IL2ERC20Bridge__factory"; +-export { L2CrossDomainMessenger__factory } from "./factories/L2CrossDomainMessenger__factory"; +-export { L2StandardBridge__factory } from "./factories/L2StandardBridge__factory"; +-export { L2StandardTokenFactory__factory } from "./factories/L2StandardTokenFactory__factory"; +-export { IOVML1BlockNumber__factory } from "./factories/IOVML1BlockNumber__factory"; +-export { IOVML2ToL1MessagePasser__factory } from "./factories/IOVML2ToL1MessagePasser__factory"; +-export { OVMDeployerWhitelist__factory } from "./factories/OVMDeployerWhitelist__factory"; +-export { OVMETH__factory } from "./factories/OVMETH__factory"; +-export { OVMGasPriceOracle__factory } from "./factories/OVMGasPriceOracle__factory"; +-export { OVML2ToL1MessagePasser__factory } from "./factories/OVML2ToL1MessagePasser__factory"; +-export { OVMSequencerFeeVault__factory } from "./factories/OVMSequencerFeeVault__factory"; +-export { WETH9__factory } from "./factories/WETH9__factory"; +-export { TeleportrDisburser__factory } from "./factories/TeleportrDisburser__factory"; +-export { CrossDomainEnabled__factory } from "./factories/CrossDomainEnabled__factory"; +-export { ICrossDomainMessenger__factory } from "./factories/ICrossDomainMessenger__factory"; +-export { LibAddressManager__factory } from "./factories/LibAddressManager__factory"; +-export { LibAddressResolver__factory } from "./factories/LibAddressResolver__factory"; +-export { LibResolvedDelegateProxy__factory } from "./factories/LibResolvedDelegateProxy__factory"; +-export { IL2StandardERC20__factory } from "./factories/IL2StandardERC20__factory"; +-export { L2StandardERC20__factory } from "./factories/L2StandardERC20__factory"; +-export { FailingReceiver__factory } from "./factories/FailingReceiver__factory"; +-export { HelperSimpleProxy__factory } from "./factories/HelperSimpleProxy__factory"; +-export { TestERC20__factory } from "./factories/TestERC20__factory"; +-export { TestLibCrossDomainUtils__factory } from "./factories/TestLibCrossDomainUtils__factory"; +-export { TestLibOVMCodec__factory } from "./factories/TestLibOVMCodec__factory"; +-export { TestLibRLPReader__factory } from "./factories/TestLibRLPReader__factory"; +-export { TestLibRLPWriter__factory } from "./factories/TestLibRLPWriter__factory"; +-export { TestLibAddressAliasHelper__factory } from "./factories/TestLibAddressAliasHelper__factory"; +-export { TestLibMerkleTrie__factory } from "./factories/TestLibMerkleTrie__factory"; +-export { TestLibSecureMerkleTrie__factory } from "./factories/TestLibSecureMerkleTrie__factory"; +-export { TestLibBuffer__factory } from "./factories/TestLibBuffer__factory"; +-export { TestLibBytes32Utils__factory } from "./factories/TestLibBytes32Utils__factory"; +-export { TestLibBytesUtils__factory } from "./factories/TestLibBytesUtils__factory"; +-export { TestLibMerkleTree__factory } from "./factories/TestLibMerkleTree__factory"; ++import type * as boba from "./@boba"; ++export type { boba }; ++import type * as openzeppelin from "./@openzeppelin"; ++export type { openzeppelin }; ++import type * as contracts from "./contracts"; ++export type { contracts }; ++export * as factories from "./factories"; ++export type { ITuringHelper } from "./@boba/turing-hybrid-compute/contracts/ITuringHelper"; ++export { ITuringHelper__factory } from "./factories/@boba/turing-hybrid-compute/contracts/ITuringHelper__factory"; ++export type { OwnableUpgradeable } from "./@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable"; ++export { OwnableUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory"; ++export type { PausableUpgradeable } from "./@openzeppelin/contracts-upgradeable/security/PausableUpgradeable"; ++export { PausableUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable__factory"; ++export type { Ownable } from "./@openzeppelin/contracts/access/Ownable"; ++export { Ownable__factory } from "./factories/@openzeppelin/contracts/access/Ownable__factory"; ++export type { ERC20 } from "./@openzeppelin/contracts/token/ERC20/ERC20"; ++export { ERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/ERC20__factory"; ++export type { ERC20Permit } from "./@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit"; ++export { ERC20Permit__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol/ERC20Permit__factory"; ++export type { IERC20Permit } from "./@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit"; ++export { IERC20Permit__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit__factory"; ++export type { ERC20Burnable } from "./@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable"; ++export { ERC20Burnable__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory"; ++export type { ERC20Votes } from "./@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes"; ++export { ERC20Votes__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes__factory"; ++export type { ERC20VotesComp } from "./@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp"; ++export { ERC20VotesComp__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp__factory"; ++export type { IERC20Metadata } from "./@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata"; ++export { IERC20Metadata__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory"; ++export type { IERC20 } from "./@openzeppelin/contracts/token/ERC20/IERC20"; ++export { IERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/IERC20__factory"; ++export type { IERC165 } from "./@openzeppelin/contracts/utils/introspection/IERC165"; ++export { IERC165__factory } from "./factories/@openzeppelin/contracts/utils/introspection/IERC165__factory"; ++export type { IL1ChugSplashDeployer } from "./contracts/chugsplash/interfaces/IL1ChugSplashDeployer"; ++export { IL1ChugSplashDeployer__factory } from "./factories/contracts/chugsplash/interfaces/IL1ChugSplashDeployer__factory"; ++export type { L1ChugSplashProxy } from "./contracts/chugsplash/L1ChugSplashProxy"; ++export { L1ChugSplashProxy__factory } from "./factories/contracts/chugsplash/L1ChugSplashProxy__factory"; ++export type { IL1CrossDomainMessenger } from "./contracts/L1/messaging/IL1CrossDomainMessenger"; ++export { IL1CrossDomainMessenger__factory } from "./factories/contracts/L1/messaging/IL1CrossDomainMessenger__factory"; ++export type { IL1CrossDomainMessengerFast } from "./contracts/L1/messaging/IL1CrossDomainMessengerFast"; ++export { IL1CrossDomainMessengerFast__factory } from "./factories/contracts/L1/messaging/IL1CrossDomainMessengerFast__factory"; ++export type { IL1DepositHash } from "./contracts/L1/messaging/IL1DepositHash"; ++export { IL1DepositHash__factory } from "./factories/contracts/L1/messaging/IL1DepositHash__factory"; ++export type { IL1ERC20Bridge } from "./contracts/L1/messaging/IL1ERC20Bridge"; ++export { IL1ERC20Bridge__factory } from "./factories/contracts/L1/messaging/IL1ERC20Bridge__factory"; ++export type { IL1StandardBridge } from "./contracts/L1/messaging/IL1StandardBridge"; ++export { IL1StandardBridge__factory } from "./factories/contracts/L1/messaging/IL1StandardBridge__factory"; ++export type { IL1StandardBridgeAltL1 } from "./contracts/L1/messaging/IL1StandardBridgeAltL1"; ++export { IL1StandardBridgeAltL1__factory } from "./factories/contracts/L1/messaging/IL1StandardBridgeAltL1__factory"; ++export type { L1CrossDomainMessenger } from "./contracts/L1/messaging/L1CrossDomainMessenger"; ++export { L1CrossDomainMessenger__factory } from "./factories/contracts/L1/messaging/L1CrossDomainMessenger__factory"; ++export type { L1CrossDomainMessengerFast } from "./contracts/L1/messaging/L1CrossDomainMessengerFast"; ++export { L1CrossDomainMessengerFast__factory } from "./factories/contracts/L1/messaging/L1CrossDomainMessengerFast__factory"; ++export type { L1MultiMessageRelayer } from "./contracts/L1/messaging/L1MultiMessageRelayer"; ++export { L1MultiMessageRelayer__factory } from "./factories/contracts/L1/messaging/L1MultiMessageRelayer__factory"; ++export type { L1MultiMessageRelayerFast } from "./contracts/L1/messaging/L1MultiMessageRelayerFast"; ++export { L1MultiMessageRelayerFast__factory } from "./factories/contracts/L1/messaging/L1MultiMessageRelayerFast__factory"; ++export type { L1StandardBridge } from "./contracts/L1/messaging/L1StandardBridge"; ++export { L1StandardBridge__factory } from "./factories/contracts/L1/messaging/L1StandardBridge__factory"; ++export type { L1StandardBridgeAltL1 } from "./contracts/L1/messaging/L1StandardBridgeAltL1"; ++export { L1StandardBridgeAltL1__factory } from "./factories/contracts/L1/messaging/L1StandardBridgeAltL1__factory"; ++export type { CanonicalTransactionChain } from "./contracts/L1/rollup/CanonicalTransactionChain"; ++export { CanonicalTransactionChain__factory } from "./factories/contracts/L1/rollup/CanonicalTransactionChain__factory"; ++export type { ChainStorageContainer } from "./contracts/L1/rollup/ChainStorageContainer"; ++export { ChainStorageContainer__factory } from "./factories/contracts/L1/rollup/ChainStorageContainer__factory"; ++export type { ICanonicalTransactionChain } from "./contracts/L1/rollup/ICanonicalTransactionChain"; ++export { ICanonicalTransactionChain__factory } from "./factories/contracts/L1/rollup/ICanonicalTransactionChain__factory"; ++export type { IChainStorageContainer } from "./contracts/L1/rollup/IChainStorageContainer"; ++export { IChainStorageContainer__factory } from "./factories/contracts/L1/rollup/IChainStorageContainer__factory"; ++export type { IStateCommitmentChain } from "./contracts/L1/rollup/IStateCommitmentChain"; ++export { IStateCommitmentChain__factory } from "./factories/contracts/L1/rollup/IStateCommitmentChain__factory"; ++export type { StateCommitmentChain } from "./contracts/L1/rollup/StateCommitmentChain"; ++export { StateCommitmentChain__factory } from "./factories/contracts/L1/rollup/StateCommitmentChain__factory"; ++export type { BOBA } from "./contracts/L1/token/BOBA"; ++export { BOBA__factory } from "./factories/contracts/L1/token/BOBA__factory"; ++export type { BondManager } from "./contracts/L1/verification/BondManager"; ++export { BondManager__factory } from "./factories/contracts/L1/verification/BondManager__factory"; ++export type { IBondManager } from "./contracts/L1/verification/IBondManager"; ++export { IBondManager__factory } from "./factories/contracts/L1/verification/IBondManager__factory"; ++export type { IL2CrossDomainMessenger } from "./contracts/L2/messaging/IL2CrossDomainMessenger"; ++export { IL2CrossDomainMessenger__factory } from "./factories/contracts/L2/messaging/IL2CrossDomainMessenger__factory"; ++export type { IL2ERC20Bridge } from "./contracts/L2/messaging/IL2ERC20Bridge"; ++export { IL2ERC20Bridge__factory } from "./factories/contracts/L2/messaging/IL2ERC20Bridge__factory"; ++export type { L2CrossDomainMessenger } from "./contracts/L2/messaging/L2CrossDomainMessenger"; ++export { L2CrossDomainMessenger__factory } from "./factories/contracts/L2/messaging/L2CrossDomainMessenger__factory"; ++export type { L2StandardBridge } from "./contracts/L2/messaging/L2StandardBridge"; ++export { L2StandardBridge__factory } from "./factories/contracts/L2/messaging/L2StandardBridge__factory"; ++export type { L2StandardBridgeAltL1 } from "./contracts/L2/messaging/L2StandardBridgeAltL1"; ++export { L2StandardBridgeAltL1__factory } from "./factories/contracts/L2/messaging/L2StandardBridgeAltL1__factory"; ++export type { L2StandardTokenFactory } from "./contracts/L2/messaging/L2StandardTokenFactory"; ++export { L2StandardTokenFactory__factory } from "./factories/contracts/L2/messaging/L2StandardTokenFactory__factory"; ++export type { Boba_GasPriceOracle } from "./contracts/L2/predeploys/Boba_GasPriceOracle"; ++export { Boba_GasPriceOracle__factory } from "./factories/contracts/L2/predeploys/Boba_GasPriceOracle__factory"; ++export type { Boba_GasPriceOracleAltL1 } from "./contracts/L2/predeploys/Boba_GasPriceOracleAltL1"; ++export { Boba_GasPriceOracleAltL1__factory } from "./factories/contracts/L2/predeploys/Boba_GasPriceOracleAltL1__factory"; ++export type { BobaTuringCredit } from "./contracts/L2/predeploys/BobaTuringCredit"; ++export { BobaTuringCredit__factory } from "./factories/contracts/L2/predeploys/BobaTuringCredit__factory"; ++export type { BobaTuringCreditAltL1 } from "./contracts/L2/predeploys/BobaTuringCreditAltL1"; ++export { BobaTuringCreditAltL1__factory } from "./factories/contracts/L2/predeploys/BobaTuringCreditAltL1__factory"; ++export type { IOVM_L1BlockNumber } from "./contracts/L2/predeploys/IOVM_L1BlockNumber"; ++export { IOVM_L1BlockNumber__factory } from "./factories/contracts/L2/predeploys/IOVM_L1BlockNumber__factory"; ++export type { IOVM_L2ToL1MessagePasser } from "./contracts/L2/predeploys/IOVM_L2ToL1MessagePasser"; ++export { IOVM_L2ToL1MessagePasser__factory } from "./factories/contracts/L2/predeploys/IOVM_L2ToL1MessagePasser__factory"; ++export type { L2_BOBA } from "./contracts/L2/predeploys/L2_BOBA"; ++export { L2_BOBA__factory } from "./factories/contracts/L2/predeploys/L2_BOBA__factory"; ++export type { L2_L1NativeToken } from "./contracts/L2/predeploys/L2_L1NativeToken"; ++export { L2_L1NativeToken__factory } from "./factories/contracts/L2/predeploys/L2_L1NativeToken__factory"; ++export type { OVM_DeployerWhitelist } from "./contracts/L2/predeploys/OVM_DeployerWhitelist"; ++export { OVM_DeployerWhitelist__factory } from "./factories/contracts/L2/predeploys/OVM_DeployerWhitelist__factory"; ++export type { OVM_ETH } from "./contracts/L2/predeploys/OVM_ETH"; ++export { OVM_ETH__factory } from "./factories/contracts/L2/predeploys/OVM_ETH__factory"; ++export type { OVM_GasPriceOracle } from "./contracts/L2/predeploys/OVM_GasPriceOracle"; ++export { OVM_GasPriceOracle__factory } from "./factories/contracts/L2/predeploys/OVM_GasPriceOracle__factory"; ++export type { OVM_L2ToL1MessagePasser } from "./contracts/L2/predeploys/OVM_L2ToL1MessagePasser"; ++export { OVM_L2ToL1MessagePasser__factory } from "./factories/contracts/L2/predeploys/OVM_L2ToL1MessagePasser__factory"; ++export type { OVM_SequencerFeeVault } from "./contracts/L2/predeploys/OVM_SequencerFeeVault"; ++export { OVM_SequencerFeeVault__factory } from "./factories/contracts/L2/predeploys/OVM_SequencerFeeVault__factory"; ++export type { OVM_SequencerFeeVaultAltL1 } from "./contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1"; ++export { OVM_SequencerFeeVaultAltL1__factory } from "./factories/contracts/L2/predeploys/OVM_SequencerFeeVaultAltL1__factory"; ++export type { WETH9 } from "./contracts/L2/predeploys/WETH9"; ++export { WETH9__factory } from "./factories/contracts/L2/predeploys/WETH9__factory"; ++export type { CrossDomainEnabled } from "./contracts/libraries/bridge/CrossDomainEnabled"; ++export { CrossDomainEnabled__factory } from "./factories/contracts/libraries/bridge/CrossDomainEnabled__factory"; ++export type { ICrossDomainMessenger } from "./contracts/libraries/bridge/ICrossDomainMessenger"; ++export { ICrossDomainMessenger__factory } from "./factories/contracts/libraries/bridge/ICrossDomainMessenger__factory"; ++export type { Lib_AddressManager } from "./contracts/libraries/resolver/Lib_AddressManager"; ++export { Lib_AddressManager__factory } from "./factories/contracts/libraries/resolver/Lib_AddressManager__factory"; ++export type { Lib_AddressResolver } from "./contracts/libraries/resolver/Lib_AddressResolver"; ++export { Lib_AddressResolver__factory } from "./factories/contracts/libraries/resolver/Lib_AddressResolver__factory"; ++export type { Lib_ResolvedDelegateBobaProxy } from "./contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy"; ++export { Lib_ResolvedDelegateBobaProxy__factory } from "./factories/contracts/libraries/resolver/Lib_ResolvedDelegateBobaProxy__factory"; ++export type { Lib_ResolvedDelegateProxy } from "./contracts/libraries/resolver/Lib_ResolvedDelegateProxy"; ++export { Lib_ResolvedDelegateProxy__factory } from "./factories/contracts/libraries/resolver/Lib_ResolvedDelegateProxy__factory"; ++export type { IL2StandardERC20 } from "./contracts/standards/IL2StandardERC20"; ++export { IL2StandardERC20__factory } from "./factories/contracts/standards/IL2StandardERC20__factory"; ++export type { L2GovernanceERC20 } from "./contracts/standards/L2GovernanceERC20"; ++export { L2GovernanceERC20__factory } from "./factories/contracts/standards/L2GovernanceERC20__factory"; ++export type { L2StandardERC20 } from "./contracts/standards/L2StandardERC20"; ++export { L2StandardERC20__factory } from "./factories/contracts/standards/L2StandardERC20__factory"; ++export type { Helper_GasMeasurer } from "./contracts/test-helpers/Helper_GasMeasurer"; ++export { Helper_GasMeasurer__factory } from "./factories/contracts/test-helpers/Helper_GasMeasurer__factory"; ++export type { Helper_SimpleProxy } from "./contracts/test-helpers/Helper_SimpleProxy"; ++export { Helper_SimpleProxy__factory } from "./factories/contracts/test-helpers/Helper_SimpleProxy__factory"; ++export type { TestERC20 } from "./contracts/test-helpers/TestERC20"; ++export { TestERC20__factory } from "./factories/contracts/test-helpers/TestERC20__factory"; ++export type { TestLib_CrossDomainUtils } from "./contracts/test-libraries/bridge/TestLib_CrossDomainUtils"; ++export { TestLib_CrossDomainUtils__factory } from "./factories/contracts/test-libraries/bridge/TestLib_CrossDomainUtils__factory"; ++export type { TestLib_OVMCodec } from "./contracts/test-libraries/codec/TestLib_OVMCodec"; ++export { TestLib_OVMCodec__factory } from "./factories/contracts/test-libraries/codec/TestLib_OVMCodec__factory"; ++export type { TestLib_RLPReader } from "./contracts/test-libraries/rlp/TestLib_RLPReader"; ++export { TestLib_RLPReader__factory } from "./factories/contracts/test-libraries/rlp/TestLib_RLPReader__factory"; ++export type { TestLib_RLPWriter } from "./contracts/test-libraries/rlp/TestLib_RLPWriter"; ++export { TestLib_RLPWriter__factory } from "./factories/contracts/test-libraries/rlp/TestLib_RLPWriter__factory"; ++export type { TestLib_AddressAliasHelper } from "./contracts/test-libraries/standards/TestLib_AddressAliasHelper"; ++export { TestLib_AddressAliasHelper__factory } from "./factories/contracts/test-libraries/standards/TestLib_AddressAliasHelper__factory"; ++export type { TestLib_MerkleTrie } from "./contracts/test-libraries/trie/TestLib_MerkleTrie"; ++export { TestLib_MerkleTrie__factory } from "./factories/contracts/test-libraries/trie/TestLib_MerkleTrie__factory"; ++export type { TestLib_SecureMerkleTrie } from "./contracts/test-libraries/trie/TestLib_SecureMerkleTrie"; ++export { TestLib_SecureMerkleTrie__factory } from "./factories/contracts/test-libraries/trie/TestLib_SecureMerkleTrie__factory"; ++export type { TestLib_Buffer } from "./contracts/test-libraries/utils/TestLib_Buffer"; ++export { TestLib_Buffer__factory } from "./factories/contracts/test-libraries/utils/TestLib_Buffer__factory"; ++export type { TestLib_Bytes32Utils } from "./contracts/test-libraries/utils/TestLib_Bytes32Utils"; ++export { TestLib_Bytes32Utils__factory } from "./factories/contracts/test-libraries/utils/TestLib_Bytes32Utils__factory"; ++export type { TestLib_BytesUtils } from "./contracts/test-libraries/utils/TestLib_BytesUtils"; ++export { TestLib_BytesUtils__factory } from "./factories/contracts/test-libraries/utils/TestLib_BytesUtils__factory"; ++export type { TestLib_MerkleTree } from "./contracts/test-libraries/utils/TestLib_MerkleTree"; ++export { TestLib_MerkleTree__factory } from "./factories/contracts/test-libraries/utils/TestLib_MerkleTree__factory"; +diff --git a/node_modules/@eth-optimism/contracts/dist/validation-utils.d.ts b/node_modules/@eth-optimism/contracts/dist/validation-utils.d.ts +index 99590ee..f305f0d 100644 +--- a/node_modules/@eth-optimism/contracts/dist/validation-utils.d.ts ++++ b/node_modules/@eth-optimism/contracts/dist/validation-utils.d.ts +@@ -1,7 +1,5 @@ + export declare const getInput: (query: any) => Promise; +-export declare const color: { +- [k: string]: (msg: string) => string; +-}; ++export declare const color: any; + export declare const getArtifactFromManagedName: (name: string) => any; + export declare const getEtherscanUrl: (network: any, address: string) => string; + export declare const printSectionHead: (msg: string) => void; +diff --git a/node_modules/@eth-optimism/contracts/dist/validation-utils.js b/node_modules/@eth-optimism/contracts/dist/validation-utils.js +index 2f1e0f6..325903b 100644 +--- a/node_modules/@eth-optimism/contracts/dist/validation-utils.js ++++ b/node_modules/@eth-optimism/contracts/dist/validation-utils.js +@@ -4,7 +4,7 @@ exports.printComparison = exports.printSectionHead = exports.getEtherscanUrl = e + const readline_1 = require("readline"); + const core_utils_1 = require("@eth-optimism/core-utils"); + const getInput = (query) => { +- const rl = readline_1.createInterface({ ++ const rl = (0, readline_1.createInterface)({ + input: process.stdin, + output: process.stdout, + }); +@@ -21,10 +21,10 @@ const codes = { + cyan: '\x1b[0;36m', + yellow: '\x1b[1;33m', + }; +-exports.color = Object.fromEntries(Object.entries(codes).map(([k]) => [ +- k, +- (msg) => `${codes[k]}${msg}${codes.reset}`, +-])); ++exports.color = Object.entries(codes).reduce((obj, [k]) => { ++ obj[k] = (msg) => `${codes[k]}${msg}${codes.reset}`; ++ return obj; ++}, {}); + const locateArtifact = (name) => { + return { + 'ChainStorageContainer-CTC-batches': 'L1/rollup/ChainStorageContainer.sol/ChainStorageContainer.json', +@@ -56,7 +56,7 @@ const printSectionHead = (msg) => { + exports.printSectionHead = printSectionHead; + const printComparison = (action, description, expected, deployed) => { + console.log(`\n${action}:`); +- if (core_utils_1.hexStringEquals(expected.value, deployed.value)) { ++ if ((0, core_utils_1.hexStringEquals)(expected.value, deployed.value)) { + console.log(exports.color.green(`${expected.name}: ${truncateLongString(expected.value)}`)); + console.log('matches'); + console.log(exports.color.green(`${deployed.name}: ${truncateLongString(deployed.value)}`)); +diff --git a/node_modules/@eth-optimism/contracts/dist/validation-utils.js.map b/node_modules/@eth-optimism/contracts/dist/validation-utils.js.map +new file mode 100644 +index 0000000..eb537c5 +--- /dev/null ++++ b/node_modules/@eth-optimism/contracts/dist/validation-utils.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"validation-utils.js","sourceRoot":"","sources":["../src/validation-utils.ts"],"names":[],"mappings":";;;AAAA,uCAA0C;AAE1C,yDAA0D;AAEnD,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;IAChC,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7B,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAZY,QAAA,QAAQ,YAYpB;AAED,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,YAAY;IACjB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,YAAY;CACrB,CAAA;AAEY,QAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;IAC7D,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;IAC3D,OAAO,GAAG,CAAA;AACZ,CAAC,EAAE,EAAE,CAAQ,CAAA;AAGb,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,OAAO;QACL,mCAAmC,EACjC,gEAAgE;QAClE,mCAAmC,EACjC,gEAAgE;QAClE,yBAAyB,EACvB,wEAAwE;QAC1E,oBAAoB,EAClB,8DAA8D;QAChE,WAAW,EAAE,kDAAkD;QAC/D,0BAA0B,EACxB,qEAAqE;QACvE,iCAAiC,EAC/B,iFAAiF;QACnF,2BAA2B,EACzB,yDAAyD;KAC5D,CAAC,IAAI,CAAC,CAAA;AACT,CAAC,CAAA;AAEM,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAE,EAAE;IAEzD,OAAO,OAAO,CAAC,0BAA0B,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAClE,CAAC,CAAA;AAHY,QAAA,0BAA0B,8BAGtC;AAEM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAe,EAAE,EAAE;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACjE,OAAO,WAAW,SAAS,wBAAwB,OAAO,EAAE,CAAA;AAC9D,CAAC,CAAA;AAHY,QAAA,eAAe,mBAG3B;AAGD,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAU,EAAE;IACnD,OAAO,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAC/D,CAAC,CAAA;AAEM,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5B,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAA;AACH,CAAC,CAAA;AALY,QAAA,gBAAgB,oBAK5B;AAEM,MAAM,eAAe,GAAG,CAC7B,MAAc,EACd,WAAmB,EACnB,QAAsC,EACtC,QAAsC,EACtC,EAAE;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,CAAA;IAC3B,IAAI,IAAA,4BAAe,EAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;QACnD,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CACvE,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtB,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CACvE,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,GAAG,WAAW,iBAAiB,CAAC,CAAC,CAAA;KAC1D;SAAM;QACL,MAAM,IAAI,KAAK,CACb,GAAG,WAAW,iBAAiB,QAAQ,CAAC,KAAK,qBAAqB,QAAQ,CAAC,KAAK,GAAG,CACpF,CAAA;KACF;AACH,CAAC,CAAA;AArBY,QAAA,eAAe,mBAqB3B"} +\ No newline at end of file diff --git a/boba_community/boba-relayer/patches/@eth-optimism+sdk+1.0.1.patch b/boba_community/boba-relayer/patches/@eth-optimism+sdk+1.0.1.patch new file mode 100644 index 0000000000..9f1c0412ec --- /dev/null +++ b/boba_community/boba-relayer/patches/@eth-optimism+sdk+1.0.1.patch @@ -0,0 +1,2176 @@ +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js b/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js +index 3b5e90d..463c5df 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js +@@ -36,11 +36,11 @@ class DAIBridgeAdapter extends standard_bridge_1.StandardBridgeAdapter { + }, + ], this.messenger.l1Provider); + const allowedL1Token = await l1Bridge.l1Token(); +- if (!core_utils_1.hexStringEquals(allowedL1Token, utils_1.toAddress(l1Token))) { ++ if (!(0, core_utils_1.hexStringEquals)(allowedL1Token, (0, utils_1.toAddress)(l1Token))) { + return false; + } + const allowedL2Token = await l1Bridge.l2Token(); +- if (!core_utils_1.hexStringEquals(allowedL2Token, utils_1.toAddress(l2Token))) { ++ if (!(0, core_utils_1.hexStringEquals)(allowedL2Token, (0, utils_1.toAddress)(l2Token))) { + return false; + } + return true; +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js.map b/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js.map +index 19621bf..b7bbc8e 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/dai-bridge.js.map +@@ -1 +1 @@ +-{"version":3,"file":"dai-bridge.js","sourceRoot":"","sources":["../../src/adapters/dai-bridge.ts"],"names":[],"mappings":";;;AACA,mCAAiC;AACjC,yDAA0D;AAG1D,oCAAoC;AACpC,uDAAyD;AAKzD,MAAa,gBAAiB,SAAQ,uCAAqB;IAClD,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAGpB,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,EACrB;YACE;gBACE,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP;wBACE,YAAY,EAAE,SAAS;wBACvB,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;YACD;gBACE,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP;wBACE,YAAY,EAAE,SAAS;wBACvB,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;SACF,EACD,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;QAC/C,IAAI,CAAC,4BAAe,CAAC,cAAc,EAAE,iBAAS,CAAC,OAAO,CAAC,CAAC,EAAE;YACxD,OAAO,KAAK,CAAA;SACb;QAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;QAC/C,IAAI,CAAC,4BAAe,CAAC,cAAc,EAAE,iBAAS,CAAC,OAAO,CAAC,CAAC,EAAE;YACxD,OAAO,KAAK,CAAA;SACb;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAnDD,4CAmDC"} +\ No newline at end of file ++{"version":3,"file":"dai-bridge.js","sourceRoot":"","sources":["../../src/adapters/dai-bridge.ts"],"names":[],"mappings":";;;AACA,mCAAiC;AACjC,yDAA0D;AAG1D,oCAAoC;AACpC,uDAAyD;AAKzD,MAAa,gBAAiB,SAAQ,uCAAqB;IAClD,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAGpB,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,EACrB;YACE;gBACE,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP;wBACE,YAAY,EAAE,SAAS;wBACvB,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;YACD;gBACE,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP;wBACE,YAAY,EAAE,SAAS;wBACvB,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;SACF,EACD,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;QAC/C,IAAI,CAAC,IAAA,4BAAe,EAAC,cAAc,EAAE,IAAA,iBAAS,EAAC,OAAO,CAAC,CAAC,EAAE;YACxD,OAAO,KAAK,CAAA;SACb;QAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;QAC/C,IAAI,CAAC,IAAA,4BAAe,EAAC,cAAc,EAAE,IAAA,iBAAS,EAAC,OAAO,CAAC,CAAC,EAAE;YACxD,OAAO,KAAK,CAAA;SACb;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAnDD,4CAmDC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js b/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js +index 6164a65..5c212df 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js +@@ -19,10 +19,10 @@ class ETHBridgeAdapter extends standard_bridge_1.StandardBridgeAdapter { + throw new Error(`token pair not supported by bridge`); + } + if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { +- return this.l1Bridge.populateTransaction.depositETH((opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', Object.assign(Object.assign({}, utils_1.omit((opts === null || opts === void 0 ? void 0 : opts.overrides) || {}, 'value')), { value: amount })); ++ return this.l1Bridge.populateTransaction.depositETH((opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', Object.assign(Object.assign({}, (0, utils_1.omit)((opts === null || opts === void 0 ? void 0 : opts.overrides) || {}, 'value')), { value: amount })); + } + else { +- return this.l1Bridge.populateTransaction.depositETHTo(utils_1.toAddress(opts.recipient), (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', Object.assign(Object.assign({}, utils_1.omit((opts === null || opts === void 0 ? void 0 : opts.overrides) || {}, 'value')), { value: amount })); ++ return this.l1Bridge.populateTransaction.depositETHTo((0, utils_1.toAddress)(opts.recipient), (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', Object.assign(Object.assign({}, (0, utils_1.omit)((opts === null || opts === void 0 ? void 0 : opts.overrides) || {}, 'value')), { value: amount })); + } + }, + withdraw: async (l1Token, l2Token, amount, opts) => { +@@ -30,10 +30,10 @@ class ETHBridgeAdapter extends standard_bridge_1.StandardBridgeAdapter { + throw new Error(`token pair not supported by bridge`); + } + if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { +- return this.l2Bridge.populateTransaction.withdraw(utils_1.toAddress(l2Token), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l2Bridge.populateTransaction.withdraw((0, utils_1.toAddress)(l2Token), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + else { +- return this.l2Bridge.populateTransaction.withdrawTo(utils_1.toAddress(l2Token), utils_1.toAddress(opts.recipient), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l2Bridge.populateTransaction.withdrawTo((0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(opts.recipient), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + }, + }; +@@ -66,8 +66,8 @@ class ETHBridgeAdapter extends standard_bridge_1.StandardBridgeAdapter { + const events = await this.l2Bridge.queryFilter(this.l2Bridge.filters.WithdrawalInitiated(undefined, undefined, address), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); + return events + .filter((event) => { +- return (core_utils_1.hexStringEquals(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && +- core_utils_1.hexStringEquals(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); ++ return ((0, core_utils_1.hexStringEquals)(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && ++ (0, core_utils_1.hexStringEquals)(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); + }) + .map((event) => { + return { +@@ -88,8 +88,8 @@ class ETHBridgeAdapter extends standard_bridge_1.StandardBridgeAdapter { + }); + } + async supportsTokenPair(l1Token, l2Token) { +- return (core_utils_1.hexStringEquals(utils_1.toAddress(l1Token), ethers_1.ethers.constants.AddressZero) && +- core_utils_1.hexStringEquals(utils_1.toAddress(l2Token), contracts_1.predeploys.OVM_ETH)); ++ return ((0, core_utils_1.hexStringEquals)((0, utils_1.toAddress)(l1Token), ethers_1.ethers.constants.AddressZero) && ++ (0, core_utils_1.hexStringEquals)((0, utils_1.toAddress)(l2Token), contracts_1.predeploys.OVM_ETH)); + } + } + exports.ETHBridgeAdapter = ETHBridgeAdapter; +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js.map b/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js.map +index 9faf79f..17e84d6 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/eth-bridge.js.map +@@ -1 +1 @@ +-{"version":3,"file":"eth-bridge.js","sourceRoot":"","sources":["../../src/adapters/eth-bridge.ts"],"names":[],"mappings":";;;AACA,mCAA+D;AAE/D,uDAA0E;AAC1E,yDAA0D;AAE1D,8CAKsB;AACtB,oCAA0C;AAC1C,uDAAyD;AAKzD,MAAa,gBAAiB,SAAQ,uCAAqB;IAA3D;;QA+FE,wBAAmB,GAAG;YACpB,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YAC3D,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,kCAEC,YAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,EAAE,OAAO,CAAC,KACvC,KAAK,EAAE,MAAM,IAEhB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CACnD,iBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EACzB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,kCAEC,YAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,EAAE,OAAO,CAAC,KACvC,KAAK,EAAE,MAAM,IAEhB,CAAA;iBACF;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAC/C,iBAAS,CAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,iBAAS,CAAC,OAAO,CAAC,EAClB,iBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;SACF,CAAA;IACH,CAAC;IA/KQ,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAqB;QAErB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAClD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW;gBACrC,OAAO,EAAE,sBAAU,CAAC,OAAO;gBAC3B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EACxE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAEhB,OAAO,CACL,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBAClE,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CACzD,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAGpB,OAAO,CACL,4BAAe,CAAC,iBAAS,CAAC,OAAO,CAAC,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;YACjE,4BAAe,CAAC,iBAAS,CAAC,OAAO,CAAC,EAAE,sBAAU,CAAC,OAAO,CAAC,CACxD,CAAA;IACH,CAAC;CAmFF;AAhLD,4CAgLC"} +\ No newline at end of file ++{"version":3,"file":"eth-bridge.js","sourceRoot":"","sources":["../../src/adapters/eth-bridge.ts"],"names":[],"mappings":";;;AACA,mCAAqD;AAErD,uDAAoD;AACpD,yDAA0D;AAE1D,8CAKsB;AACtB,oCAA0C;AAC1C,uDAAyD;AAKzD,MAAa,gBAAiB,SAAQ,uCAAqB;IAA3D;;QA+FE,wBAAmB,GAAG;YACpB,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YAC3D,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,kCAEC,IAAA,YAAI,EAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,EAAE,OAAO,CAAC,KACvC,KAAK,EAAE,MAAM,IAEhB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CACnD,IAAA,iBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EACzB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,kCAEC,IAAA,YAAI,EAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,EAAE,OAAO,CAAC,KACvC,KAAK,EAAE,MAAM,IAEhB,CAAA;iBACF;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAC/C,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,iBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;SACF,CAAA;IACH,CAAC;IA/KQ,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAqB;QAErB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAClD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW;gBACrC,OAAO,EAAE,sBAAU,CAAC,OAAO;gBAC3B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EACxE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAEhB,OAAO,CACL,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBAClE,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CACzD,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAGpB,OAAO,CACL,IAAA,4BAAe,EAAC,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;YACjE,IAAA,4BAAe,EAAC,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,sBAAU,CAAC,OAAO,CAAC,CACxD,CAAA;IACH,CAAC;CAmFF;AAhLD,4CAgLC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/index.js b/node_modules/@eth-optimism/sdk/dist/adapters/index.js +index 2ad8177..a3d1207 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/index.js ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/index.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/index.js.map b/node_modules/@eth-optimism/sdk/dist/adapters/index.js.map +index 08ad661..b1dc803 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/index.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/index.js.map +@@ -1 +1 @@ +-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAiC;AACjC,+CAA4B;AAC5B,+CAA4B"} +\ No newline at end of file ++{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,+CAA4B;AAC5B,+CAA4B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js b/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js +index 8d076b9..af292a0 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js +@@ -13,7 +13,7 @@ class StandardBridgeAdapter { + if (!(await this.supportsTokenPair(l1Token, l2Token))) { + throw new Error(`token pair not supported by bridge`); + } +- const token = new ethers_1.Contract(utils_1.toAddress(l1Token), contracts_1.getContractInterface('L2StandardERC20'), this.messenger.l1Provider); ++ const token = new ethers_1.Contract((0, utils_1.toAddress)(l1Token), (0, contracts_1.getContractInterface)('L2StandardERC20'), this.messenger.l1Provider); + return token.populateTransaction.approve(this.l1Bridge.address, amount, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + }, + deposit: async (l1Token, l2Token, amount, opts) => { +@@ -21,10 +21,10 @@ class StandardBridgeAdapter { + throw new Error(`token pair not supported by bridge`); + } + if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { +- return this.l1Bridge.populateTransaction.depositERC20(utils_1.toAddress(l1Token), utils_1.toAddress(l2Token), amount, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l1Bridge.populateTransaction.depositERC20((0, utils_1.toAddress)(l1Token), (0, utils_1.toAddress)(l2Token), amount, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + else { +- return this.l1Bridge.populateTransaction.depositERC20To(utils_1.toAddress(l1Token), utils_1.toAddress(l2Token), utils_1.toAddress(opts.recipient), amount, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l1Bridge.populateTransaction.depositERC20To((0, utils_1.toAddress)(l1Token), (0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(opts.recipient), amount, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 200000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + }, + withdraw: async (l1Token, l2Token, amount, opts) => { +@@ -32,10 +32,10 @@ class StandardBridgeAdapter { + throw new Error(`token pair not supported by bridge`); + } + if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { +- return this.l2Bridge.populateTransaction.withdraw(utils_1.toAddress(l2Token), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l2Bridge.populateTransaction.withdraw((0, utils_1.toAddress)(l2Token), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + else { +- return this.l2Bridge.populateTransaction.withdrawTo(utils_1.toAddress(l2Token), utils_1.toAddress(opts.recipient), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ return this.l2Bridge.populateTransaction.withdrawTo((0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(opts.recipient), amount, 0, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + }, + }; +@@ -51,15 +51,15 @@ class StandardBridgeAdapter { + }, + }; + this.messenger = opts.messenger; +- this.l1Bridge = new ethers_1.Contract(utils_1.toAddress(opts.l1Bridge), contracts_1.getContractInterface('L1StandardBridge'), this.messenger.l1Provider); +- this.l2Bridge = new ethers_1.Contract(utils_1.toAddress(opts.l2Bridge), contracts_1.getContractInterface('IL2ERC20Bridge'), this.messenger.l2Provider); ++ this.l1Bridge = new ethers_1.Contract((0, utils_1.toAddress)(opts.l1Bridge), (0, contracts_1.getContractInterface)('L1StandardBridge'), this.messenger.l1Provider); ++ this.l2Bridge = new ethers_1.Contract((0, utils_1.toAddress)(opts.l2Bridge), (0, contracts_1.getContractInterface)('IL2ERC20Bridge'), this.messenger.l2Provider); + } + async getDepositsByAddress(address, opts) { + const events = await this.l1Bridge.queryFilter(this.l1Bridge.filters.ERC20DepositInitiated(undefined, undefined, address), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); + return events + .filter((event) => { +- return (!core_utils_1.hexStringEquals(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && +- !core_utils_1.hexStringEquals(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); ++ return (!(0, core_utils_1.hexStringEquals)(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && ++ !(0, core_utils_1.hexStringEquals)(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); + }) + .map((event) => { + return { +@@ -83,8 +83,8 @@ class StandardBridgeAdapter { + const events = await this.l2Bridge.queryFilter(this.l2Bridge.filters.WithdrawalInitiated(undefined, undefined, address), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); + return events + .filter((event) => { +- return (!core_utils_1.hexStringEquals(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && +- !core_utils_1.hexStringEquals(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); ++ return (!(0, core_utils_1.hexStringEquals)(event.args._l1Token, ethers_1.ethers.constants.AddressZero) && ++ !(0, core_utils_1.hexStringEquals)(event.args._l2Token, contracts_1.predeploys.OVM_ETH)); + }) + .map((event) => { + return { +@@ -106,17 +106,17 @@ class StandardBridgeAdapter { + } + async supportsTokenPair(l1Token, l2Token) { + try { +- const contract = new ethers_1.Contract(utils_1.toAddress(l2Token), contracts_1.getContractInterface('L2StandardERC20'), this.messenger.l2Provider); +- if (core_utils_1.hexStringEquals(utils_1.toAddress(l1Token), ethers_1.ethers.constants.AddressZero) || +- core_utils_1.hexStringEquals(utils_1.toAddress(l2Token), contracts_1.predeploys.OVM_ETH)) { ++ const contract = new ethers_1.Contract((0, utils_1.toAddress)(l2Token), (0, contracts_1.getContractInterface)('L2StandardERC20'), this.messenger.l2Provider); ++ if ((0, core_utils_1.hexStringEquals)((0, utils_1.toAddress)(l1Token), ethers_1.ethers.constants.AddressZero) || ++ (0, core_utils_1.hexStringEquals)((0, utils_1.toAddress)(l2Token), contracts_1.predeploys.OVM_ETH)) { + return false; + } + const remoteL1Token = await contract.l1Token(); +- if (!core_utils_1.hexStringEquals(remoteL1Token, utils_1.toAddress(l1Token))) { ++ if (!(0, core_utils_1.hexStringEquals)(remoteL1Token, (0, utils_1.toAddress)(l1Token))) { + return false; + } + const remoteL2Bridge = await contract.l2Bridge(); +- if (!core_utils_1.hexStringEquals(remoteL2Bridge, this.l2Bridge.address)) { ++ if (!(0, core_utils_1.hexStringEquals)(remoteL2Bridge, this.l2Bridge.address)) { + return false; + } + return true; +@@ -134,7 +134,7 @@ class StandardBridgeAdapter { + if (!(await this.supportsTokenPair(l1Token, l2Token))) { + throw new Error(`token pair not supported by bridge`); + } +- const token = new ethers_1.Contract(utils_1.toAddress(l1Token), contracts_1.getContractInterface('L2StandardERC20'), this.messenger.l1Provider); ++ const token = new ethers_1.Contract((0, utils_1.toAddress)(l1Token), (0, contracts_1.getContractInterface)('L2StandardERC20'), this.messenger.l1Provider); + return token.allowance(await signer.getAddress(), this.l1Bridge.address); + } + async approve(l1Token, l2Token, amount, signer, opts) { +diff --git a/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js.map b/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js.map +index 40101b7..f20ff0a 100644 +--- a/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/adapters/standard-bridge.js.map +@@ -1 +1 @@ +-{"version":3,"file":"standard-bridge.js","sourceRoot":"","sources":["../../src/adapters/standard-bridge.ts"],"names":[],"mappings":";;;AACA,mCAAuE;AAMvE,uDAA0E;AAC1E,yDAA0D;AAE1D,8CAOsB;AACtB,oCAAoC;AAKpC,MAAa,qBAAqB;IAahC,YAAY,IAIX;QAkND,wBAAmB,GAAG;YACpB,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,MAAM,KAAK,GAAG,IAAI,iBAAQ,CACxB,iBAAS,CAAC,OAAO,CAAC,EAClB,gCAAoB,CAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;gBAED,OAAO,KAAK,CAAC,mBAAmB,CAAC,OAAO,CACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,EACrB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CACnD,iBAAS,CAAC,OAAO,CAAC,EAClB,iBAAS,CAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,cAAc,CACrD,iBAAS,CAAC,OAAO,CAAC,EAClB,iBAAS,CAAC,OAAO,CAAC,EAClB,iBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAC/C,iBAAS,CAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,iBAAS,CAAC,OAAO,CAAC,EAClB,iBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;SACF,CAAA;QAED,gBAAW,GAAG;YACZ,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACxE,CAAA;YACH,CAAC;SACF,CAAA;QA3VC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAQ,CAC1B,iBAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,gCAAoB,CAAC,kBAAkB,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAQ,CAC1B,iBAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,gCAAoB,CAAC,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CACzC,SAAS,EACT,SAAS,EACT,OAAO,CACR,EACD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAIhB,OAAO,CACL,CAAC,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACnE,CAAC,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CAC1D,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EACxE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAIhB,OAAO,CACL,CAAC,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACnE,CAAC,4BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CAC1D,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAEpB,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAC3B,iBAAS,CAAC,OAAO,CAAC,EAClB,gCAAoB,CAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;YAGD,IACE,4BAAe,CAAC,iBAAS,CAAC,OAAO,CAAC,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACjE,4BAAe,CAAC,iBAAS,CAAC,OAAO,CAAC,EAAE,sBAAU,CAAC,OAAO,CAAC,EACvD;gBACA,OAAO,KAAK,CAAA;aACb;YAGD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;YAC9C,IAAI,CAAC,4BAAe,CAAC,aAAa,EAAE,iBAAS,CAAC,OAAO,CAAC,CAAC,EAAE;gBACvD,OAAO,KAAK,CAAA;aACb;YAGD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;YAChD,IAAI,CAAC,4BAAe,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC3D,OAAO,KAAK,CAAA;aACb;YAED,OAAO,IAAI,CAAA;SACZ;QAAC,OAAO,GAAG,EAAE;YAGZ,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrD,OAAO,KAAK,CAAA;aACb;iBAAM;gBACL,MAAM,GAAG,CAAA;aACV;SACF;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAqB;QAErB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,MAAM,KAAK,GAAG,IAAI,iBAAQ,CACxB,iBAAS,CAAC,OAAO,CAAC,EAClB,gCAAoB,CAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QAED,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1E,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAEC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAIC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAGC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACxE,CAAA;IACH,CAAC;CA6IF;AA9WD,sDA8WC"} +\ No newline at end of file ++{"version":3,"file":"standard-bridge.js","sourceRoot":"","sources":["../../src/adapters/standard-bridge.ts"],"names":[],"mappings":";;;AACA,mCAAuE;AAMvE,uDAA0E;AAC1E,yDAA0D;AAE1D,8CAOsB;AACtB,oCAAoC;AAKpC,MAAa,qBAAqB;IAahC,YAAY,IAIX;QAkND,wBAAmB,GAAG;YACpB,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,MAAM,KAAK,GAAG,IAAI,iBAAQ,CACxB,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,gCAAoB,EAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;gBAED,OAAO,KAAK,CAAC,mBAAmB,CAAC,OAAO,CACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,EACrB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CACnD,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,cAAc,CACrD,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,iBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,MAAO,EAC3B,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;oBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,SAAS,EAAE;oBACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAC/C,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CACjD,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,iBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EACzB,MAAM,EACN,CAAC,EACD,IAAI,EACJ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;SACF,CAAA;QAED,gBAAW,GAAG;YACZ,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EACZ,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;YACH,CAAC;YAED,QAAQ,EAAE,KAAK,EACb,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACxE,CAAA;YACH,CAAC;SACF,CAAA;QA3VC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAQ,CAC1B,IAAA,iBAAS,EAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,IAAA,gCAAoB,EAAC,kBAAkB,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAQ,CAC1B,IAAA,iBAAS,EAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,IAAA,gCAAoB,EAAC,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CACzC,SAAS,EACT,SAAS,EACT,OAAO,CACR,EACD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAIhB,OAAO,CACL,CAAC,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACnE,CAAC,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CAC1D,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,IAGC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EACxE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAIhB,OAAO,CACL,CAAC,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACnE,CAAC,IAAA,4BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAU,CAAC,OAAO,CAAC,CAC1D,CAAA;QACH,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO;gBACL,SAAS,EAAE,6BAAgB,CAAC,QAAQ;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,OAAoB;QAEpB,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAC3B,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,gCAAoB,EAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;YAGD,IACE,IAAA,4BAAe,EAAC,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACjE,IAAA,4BAAe,EAAC,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,sBAAU,CAAC,OAAO,CAAC,EACvD;gBACA,OAAO,KAAK,CAAA;aACb;YAGD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;YAC9C,IAAI,CAAC,IAAA,4BAAe,EAAC,aAAa,EAAE,IAAA,iBAAS,EAAC,OAAO,CAAC,CAAC,EAAE;gBACvD,OAAO,KAAK,CAAA;aACb;YAGD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;YAChD,IAAI,CAAC,IAAA,4BAAe,EAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC3D,OAAO,KAAK,CAAA;aACb;YAED,OAAO,IAAI,CAAA;SACZ;QAAC,OAAO,GAAG,EAAE;YAGZ,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrD,OAAO,KAAK,CAAA;aACb;iBAAM;gBACL,MAAM,GAAG,CAAA;aACV;SACF;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAqB;QAErB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,MAAM,KAAK,GAAG,IAAI,iBAAQ,CACxB,IAAA,iBAAS,EAAC,OAAO,CAAC,EAClB,IAAA,gCAAoB,EAAC,iBAAiB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAC1B,CAAA;QAED,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1E,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAEC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAIC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACvE,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,MAAc,EACd,IAGC;QAED,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACxE,CAAA;IACH,CAAC;CA6IF;AA9WD,sDA8WC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.d.ts b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.d.ts +index d81c72b..8646d92 100644 +--- a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.d.ts +@@ -11,6 +11,7 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + bridges: BridgeAdapters; + depositConfirmationBlocks: number; + l1BlockTimeSeconds: number; ++ fastRelayer: boolean; + constructor(opts: { + l1SignerOrProvider: SignerOrProviderLike; + l2SignerOrProvider: SignerOrProviderLike; +@@ -19,6 +20,7 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + l1BlockTimeSeconds?: NumberLike; + contracts?: DeepPartial; + bridges?: BridgeAdapterData; ++ fastRelayer?: boolean; + }); + get l1Provider(): Provider; + get l2Provider(): Provider; +@@ -27,11 +29,6 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + getMessagesByTransaction(transaction: TransactionLike, opts?: { + direction?: MessageDirection; + }): Promise; +- getMessagesByAddress(address: AddressLike, opts?: { +- direction?: MessageDirection; +- fromBlock?: NumberLike; +- toBlock?: NumberLike; +- }): Promise; + getBridgeForTokenPair(l1Token: AddressLike, l2Token: AddressLike): Promise; + getDepositsByAddress(address: AddressLike, opts?: { + fromBlock?: BlockTag; +@@ -42,16 +39,30 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + toBlock?: BlockTag; + }): Promise; + toCrossChainMessage(message: MessageLike): Promise; +- getMessageStatus(message: MessageLike): Promise; +- getMessageReceipt(message: MessageLike): Promise; ++ getMessageStatus(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; ++ }): Promise; ++ getMessageStatusFromContracts(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ blockRange?: number; ++ }): Promise; ++ getMessageReceipt(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; ++ }): Promise; + waitForMessageReceipt(message: MessageLike, opts?: { + confirmations?: number; + pollIntervalMs?: number; + timeoutMs?: number; ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; + }): Promise; + waitForMessageStatus(message: MessageLike, status: MessageStatus, opts?: { + pollIntervalMs?: number; + timeoutMs?: number; ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; + }): Promise; + estimateL2MessageGasLimit(message: MessageRequestLike, opts?: { + bufferPercent?: number; +@@ -59,11 +70,24 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + }): Promise; + estimateMessageWaitTimeSeconds(message: MessageLike): Promise; + getChallengePeriodSeconds(): Promise; +- getMessageStateRoot(message: MessageLike): Promise; +- getStateBatchAppendedEventByBatchIndex(batchIndex: number): Promise; +- getStateBatchAppendedEventByTransactionIndex(transactionIndex: number): Promise; +- getStateRootBatchByTransactionIndex(transactionIndex: number): Promise; +- getMessageProof(message: MessageLike): Promise; ++ getMessageStateRoot(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ blockRange?: number; ++ }): Promise; ++ getStateBatchAppendedEventByBatchIndex(batchIndex: number, opts?: { ++ fromBlock?: BlockTag; ++ blockRange?: number; ++ }): Promise; ++ getStateBatchAppendedEventByTransactionIndex(transactionIndex: number, opts?: { ++ fromBlock?: BlockTag; ++ blockRange?: number; ++ }): Promise; ++ getStateRootBatchByTransactionIndex(transactionIndex: number, opts?: { ++ fromBlock?: BlockTag; ++ }): Promise; ++ getMessageProof(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ }): Promise; + sendMessage(message: CrossChainMessageRequest, opts?: { + signer?: Signer; + l2GasLimit?: NumberLike; +@@ -77,6 +101,11 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + signer?: Signer; + overrides?: Overrides; + }): Promise; ++ finalizeBatchMessage(messages: Array, opts?: { ++ signer?: Signer; ++ overrides?: Overrides; ++ fromBlock?: BlockTag; ++ }): Promise; + depositETH(amount: NumberLike, opts?: { + recipient?: AddressLike; + signer?: Signer; +@@ -117,6 +146,10 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + finalizeMessage: (message: MessageLike, opts?: { + overrides?: Overrides; + }) => Promise; ++ finalizeBatchMessage: (messages: Array, opts?: { ++ overrides?: Overrides; ++ fromBlock?: BlockTag; ++ }) => Promise; + depositETH: (amount: NumberLike, opts?: { + recipient?: AddressLike; + l2GasLimit?: NumberLike; +@@ -150,6 +183,10 @@ export declare class CrossChainMessenger implements ICrossChainMessenger { + finalizeMessage: (message: MessageLike, opts?: { + overrides?: Overrides; + }) => Promise; ++ finalizeBatchMessage: (messages: Array, opts?: { ++ overrides?: Overrides; ++ fromBlock?: BlockTag; ++ }) => Promise; + depositETH: (amount: NumberLike, opts?: { + recipient?: AddressLike; + l2GasLimit?: NumberLike; +diff --git a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js +index 66efc8c..7d3df91 100644 +--- a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js ++++ b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js +@@ -11,7 +11,10 @@ class CrossChainMessenger { + constructor(opts) { + this.populateTransaction = { + sendMessage: async (message, opts) => { +- if (message.direction === interfaces_1.MessageDirection.L1_TO_L2) { ++ if (message.direction === interfaces_1.MessageDirection.L1_TO_L2 && this.fastRelayer) { ++ return this.contracts.l1.L1CrossDomainMessengerFast.populateTransaction.sendMessage(message.target, message.message, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || (await this.estimateL2MessageGasLimit(message)), (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } ++ else if (message.direction === interfaces_1.MessageDirection.L1_TO_L2) { + return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.sendMessage(message.target, message.message, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || (await this.estimateL2MessageGasLimit(message)), (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); + } + else { +@@ -23,7 +26,12 @@ class CrossChainMessenger { + if (resolved.direction === interfaces_1.MessageDirection.L2_TO_L1) { + throw new Error(`cannot resend L2 to L1 message`); + } +- return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.replayMessage(resolved.target, resolved.sender, resolved.message, resolved.messageNonce, resolved.gasLimit, messageGasLimit, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ if (this.fastRelayer) { ++ return this.contracts.l1.L1CrossDomainMessengerFast.populateTransaction.replayMessage(resolved.target, resolved.sender, resolved.message, resolved.messageNonce, resolved.gasLimit, messageGasLimit, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } ++ else { ++ return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.replayMessage(resolved.target, resolved.sender, resolved.message, resolved.messageNonce, resolved.gasLimit, messageGasLimit, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } + }, + finalizeMessage: async (message, opts) => { + const resolved = await this.toCrossChainMessage(message); +@@ -31,7 +39,35 @@ class CrossChainMessenger { + throw new Error(`cannot finalize L1 to L2 message`); + } + const proof = await this.getMessageProof(resolved); +- return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.relayMessage(resolved.target, resolved.sender, resolved.message, resolved.messageNonce, proof, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ if (this.fastRelayer) { ++ return this.contracts.l1.L1CrossDomainMessengerFast.populateTransaction['relayMessage(address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))'](resolved.target, resolved.sender, resolved.message, resolved.messageNonce, proof, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } ++ else { ++ return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.relayMessage(resolved.target, resolved.sender, resolved.message, resolved.messageNonce, proof, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } ++ }, ++ finalizeBatchMessage: async (messages, opts) => { ++ const batchMessage = []; ++ for (const message of messages) { ++ const resolved = await this.toCrossChainMessage(message); ++ if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { ++ throw new Error(`cannot finalize L1 to L2 message`); ++ } ++ const proof = await this.getMessageProof(resolved, opts); ++ batchMessage.push({ ++ target: resolved.target, ++ sender: resolved.sender, ++ message: resolved.message, ++ messageNonce: resolved.messageNonce, ++ proof, ++ }); ++ } ++ if (this.fastRelayer) { ++ return this.contracts.l1.L1MultiMessageRelayerFast.populateTransaction['batchRelayMessages((address,address,bytes,uint256,(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]),bytes,bytes))[])'](batchMessage, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } ++ else { ++ return this.contracts.l1.L1MultiMessageRelayer.populateTransaction.batchRelayMessages(batchMessage, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); ++ } + }, + depositETH: async (amount, opts) => { + return this.bridges.ETH.populateTransaction.deposit(ethers_1.ethers.constants.AddressZero, contracts_1.predeploys.OVM_ETH, amount, opts); +@@ -68,6 +104,9 @@ class CrossChainMessenger { + finalizeMessage: async (message, opts) => { + return this.l1Provider.estimateGas(await this.populateTransaction.finalizeMessage(message, opts)); + }, ++ finalizeBatchMessage: async (messages, opts) => { ++ return this.l1Provider.estimateGas(await this.populateTransaction.finalizeBatchMessage(messages, opts)); ++ }, + depositETH: async (amount, opts) => { + return this.l1Provider.estimateGas(await this.populateTransaction.depositETH(amount, opts)); + }, +@@ -84,23 +123,24 @@ class CrossChainMessenger { + return this.l2Provider.estimateGas(await this.populateTransaction.withdrawERC20(l1Token, l2Token, amount, opts)); + }, + }; +- this.l1SignerOrProvider = utils_1.toSignerOrProvider(opts.l1SignerOrProvider); +- this.l2SignerOrProvider = utils_1.toSignerOrProvider(opts.l2SignerOrProvider); +- this.l1ChainId = utils_1.toNumber(opts.l1ChainId); ++ this.l1SignerOrProvider = (0, utils_1.toSignerOrProvider)(opts.l1SignerOrProvider); ++ this.l2SignerOrProvider = (0, utils_1.toSignerOrProvider)(opts.l2SignerOrProvider); ++ this.l1ChainId = (0, utils_1.toNumber)(opts.l1ChainId); ++ this.fastRelayer = opts.fastRelayer; + this.depositConfirmationBlocks = + (opts === null || opts === void 0 ? void 0 : opts.depositConfirmationBlocks) !== undefined +- ? utils_1.toNumber(opts.depositConfirmationBlocks) ++ ? (0, utils_1.toNumber)(opts.depositConfirmationBlocks) + : utils_1.DEPOSIT_CONFIRMATION_BLOCKS[this.l1ChainId] || 0; + this.l1BlockTimeSeconds = + (opts === null || opts === void 0 ? void 0 : opts.l1BlockTimeSeconds) !== undefined +- ? utils_1.toNumber(opts.l1BlockTimeSeconds) ++ ? (0, utils_1.toNumber)(opts.l1BlockTimeSeconds) + : utils_1.CHAIN_BLOCK_TIMES[this.l1ChainId] || 1; +- this.contracts = utils_1.getAllOEContracts(this.l1ChainId, { ++ this.contracts = (0, utils_1.getAllOEContracts)(this.l1ChainId, { + l1SignerOrProvider: this.l1SignerOrProvider, + l2SignerOrProvider: this.l2SignerOrProvider, + overrides: opts.contracts, + }); +- this.bridges = utils_1.getBridgeAdapters(this.l1ChainId, this, { ++ this.bridges = (0, utils_1.getBridgeAdapters)(this.l1ChainId, this, { + overrides: opts.bridges, + }); + } +@@ -140,7 +180,7 @@ class CrossChainMessenger { + if (typeof transaction.wait === 'function') { + await transaction.wait(); + } +- const txHash = utils_1.toTransactionHash(transaction); ++ const txHash = (0, utils_1.toTransactionHash)(transaction); + let receipt; + if (opts.direction !== undefined) { + if (opts.direction === interfaces_1.MessageDirection.L1_TO_L2) { +@@ -163,9 +203,13 @@ class CrossChainMessenger { + if (!receipt) { + throw new Error(`unable to find transaction receipt for ${txHash}`); + } +- const messenger = opts.direction === interfaces_1.MessageDirection.L1_TO_L2 ++ let messenger = opts.direction === interfaces_1.MessageDirection.L1_TO_L2 + ? this.contracts.l1.L1CrossDomainMessenger + : this.contracts.l2.L2CrossDomainMessenger; ++ if (opts.direction === interfaces_1.MessageDirection.L1_TO_L2 && this.fastRelayer) { ++ messenger = this.contracts.l1.L1CrossDomainMessengerFast; ++ console.log('SDK - using l1.L1CrossDomainMessengerFast'); ++ } + return receipt.logs + .filter((log) => { + return log.address === messenger.address; +@@ -189,15 +233,6 @@ class CrossChainMessenger { + }; + }); + } +- async getMessagesByAddress(address, opts) { +- throw new Error(` +- The function getMessagesByAddress is currently not enabled because the sender parameter of +- the SentMessage event is not indexed within the CrossChainMessenger contracts. +- getMessagesByAddress will be enabled by plugging in an Optimism Indexer (coming soon). +- See the following issue on GitHub for additional context: +- https://github.com/ethereum-optimism/optimism/issues/2129 +- `); +- } + async getBridgeForTokenPair(l1Token, l2Token) { + const bridges = []; + for (const bridge of Object.values(this.bridges)) { +@@ -263,9 +298,9 @@ class CrossChainMessenger { + return messages[0]; + } + } +- async getMessageStatus(message) { ++ async getMessageStatus(message, opts = {}) { + const resolved = await this.toCrossChainMessage(message); +- const receipt = await this.getMessageReceipt(resolved); ++ const receipt = await this.getMessageReceipt(resolved, opts); + if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { + if (receipt === null) { + return interfaces_1.MessageStatus.UNCONFIRMED_L1_TO_L2_MESSAGE; +@@ -302,18 +337,75 @@ class CrossChainMessenger { + return interfaces_1.MessageStatus.RELAYED; + } + else { +- return interfaces_1.MessageStatus.READY_FOR_RELAY; ++ return interfaces_1.MessageStatus.RELAYED_FAILED; ++ } ++ } ++ } ++ } ++ async getMessageStatusFromContracts(message, opts = {}) { ++ const resolved = await this.toCrossChainMessage(message); ++ const messageHash = (0, utils_1.hashCrossChainMessage)(resolved); ++ if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { ++ throw new Error(`can only determine for L2 to L1 messages`); ++ } ++ else { ++ const stateRoot = await this.getMessageStateRoot(resolved, opts); ++ if (stateRoot === null) { ++ return interfaces_1.MessageStatus.STATE_ROOT_NOT_PUBLISHED; ++ } ++ else { ++ const challengePeriod = await this.getChallengePeriodSeconds(); ++ const targetBlock = await this.l1Provider.getBlock(stateRoot.batch.blockNumber); ++ const latestBlock = await this.l1Provider.getBlock('latest'); ++ if (targetBlock.timestamp + challengePeriod > latestBlock.timestamp) { ++ return interfaces_1.MessageStatus.IN_CHALLENGE_PERIOD; ++ } ++ else { ++ let successStatus; ++ let failedStatus; ++ if (this.fastRelayer) { ++ successStatus = ++ await this.contracts.l1.L1CrossDomainMessengerFast.successfulMessages(messageHash); ++ failedStatus = ++ await this.contracts.l1.L1CrossDomainMessengerFast.failedMessages(messageHash); ++ } ++ else { ++ successStatus = ++ await this.contracts.l1.L1CrossDomainMessenger.successfulMessages(messageHash); ++ failedStatus = ++ await this.contracts.l1.L1CrossDomainMessenger.failedMessages(messageHash); ++ } ++ if (successStatus) { ++ return interfaces_1.MessageStatus.RELAYED; ++ } ++ else if (failedStatus) { ++ return interfaces_1.MessageStatus.RELAYED_FAILED; ++ } ++ else { ++ return interfaces_1.MessageStatus.READY_FOR_RELAY; ++ } + } + } + } + } +- async getMessageReceipt(message) { ++ async getMessageReceipt(message, opts) { + const resolved = await this.toCrossChainMessage(message); +- const messageHash = utils_1.hashCrossChainMessage(resolved); +- const messenger = resolved.direction === interfaces_1.MessageDirection.L1_TO_L2 ++ const messageHash = (0, utils_1.hashCrossChainMessage)(resolved); ++ let messenger = resolved.direction === interfaces_1.MessageDirection.L1_TO_L2 + ? this.contracts.l2.L2CrossDomainMessenger + : this.contracts.l1.L1CrossDomainMessenger; +- const relayedMessageEvents = await messenger.queryFilter(messenger.filters.RelayedMessage(messageHash)); ++ if (resolved.direction === interfaces_1.MessageDirection.L2_TO_L1 && this.fastRelayer) { ++ messenger = this.contracts.l1.L1CrossDomainMessengerFast; ++ console.log('SDK-fast: waiting for MessageReceipt...'); ++ } ++ let relayedMessageEvents = []; ++ if (utils_1.WHITELIST_CHAIN_ID.includes(this.l1ChainId) && ++ resolved.direction === interfaces_1.MessageDirection.L2_TO_L1) { ++ relayedMessageEvents = await (0, utils_1.getRelayedMessageEventsFromGraph)(this.l1Provider, messageHash, this.fastRelayer); ++ } ++ else { ++ relayedMessageEvents = await messenger.queryFilter(messenger.filters.RelayedMessage(messageHash), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); ++ } + if (relayedMessageEvents.length === 1) { + return { + receiptStatus: interfaces_1.MessageReceiptStatus.RELAYED_SUCCEEDED, +@@ -323,7 +415,14 @@ class CrossChainMessenger { + else if (relayedMessageEvents.length > 1) { + throw new Error(`multiple successful relays for message`); + } +- const failedRelayedMessageEvents = await messenger.queryFilter(messenger.filters.FailedRelayedMessage(messageHash)); ++ let failedRelayedMessageEvents = []; ++ if (utils_1.WHITELIST_CHAIN_ID.includes(this.l1ChainId) && ++ resolved.direction === interfaces_1.MessageDirection.L2_TO_L1) { ++ failedRelayedMessageEvents = await (0, utils_1.getFailedRelayedMessageEventsFromGraph)(this.l1Provider, messageHash, this.fastRelayer); ++ } ++ else { ++ failedRelayedMessageEvents = await messenger.queryFilter(messenger.filters.FailedRelayedMessage(messageHash), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); ++ } + if (failedRelayedMessageEvents.length > 0) { + return { + receiptStatus: interfaces_1.MessageReceiptStatus.RELAYED_FAILED, +@@ -337,12 +436,12 @@ class CrossChainMessenger { + let totalTimeMs = 0; + while (totalTimeMs < (opts.timeoutMs || Infinity)) { + const tick = Date.now(); +- const receipt = await this.getMessageReceipt(resolved); ++ const receipt = await this.getMessageReceipt(resolved, opts); + if (receipt !== null) { + return receipt; + } + else { +- await core_utils_1.sleep(opts.pollIntervalMs || 4000); ++ await (0, core_utils_1.sleep)(opts.pollIntervalMs || 4000); + totalTimeMs += Date.now() - tick; + } + } +@@ -353,7 +452,7 @@ class CrossChainMessenger { + let totalTimeMs = 0; + while (totalTimeMs < (opts.timeoutMs || Infinity)) { + const tick = Date.now(); +- const currentStatus = await this.getMessageStatus(resolved); ++ const currentStatus = await this.getMessageStatus(resolved, opts); + if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { + if (currentStatus === status) { + return; +@@ -376,7 +475,7 @@ class CrossChainMessenger { + return; + } + } +- await core_utils_1.sleep(opts.pollIntervalMs || 4000); ++ await (0, core_utils_1.sleep)(opts.pollIntervalMs || 4000); + totalTimeMs += Date.now() - tick; + } + throw new Error(`timed out waiting for message status change`); +@@ -419,7 +518,8 @@ class CrossChainMessenger { + } + else { + if (status === interfaces_1.MessageStatus.RELAYED || +- status === interfaces_1.MessageStatus.READY_FOR_RELAY) { ++ status === interfaces_1.MessageStatus.READY_FOR_RELAY || ++ status === interfaces_1.MessageStatus.RELAYED_FAILED) { + return 0; + } + else if (status === interfaces_1.MessageStatus.STATE_ROOT_NOT_PUBLISHED) { +@@ -438,17 +538,20 @@ class CrossChainMessenger { + } + } + async getChallengePeriodSeconds() { ++ if (this.fastRelayer) { ++ return 0; ++ } + const challengePeriod = await this.contracts.l1.StateCommitmentChain.FRAUD_PROOF_WINDOW(); + return challengePeriod.toNumber(); + } +- async getMessageStateRoot(message) { ++ async getMessageStateRoot(message, opts = {}) { + const resolved = await this.toCrossChainMessage(message); + if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { + throw new Error(`cannot get a state root for an L1 to L2 message`); + } + const messageTxReceipt = await this.l2Provider.getTransactionReceipt(resolved.transactionHash); + const messageTxIndex = messageTxReceipt.blockNumber - 1; +- const stateRootBatch = await this.getStateRootBatchByTransactionIndex(messageTxIndex); ++ const stateRootBatch = await this.getStateRootBatchByTransactionIndex(messageTxIndex, opts); + if (stateRootBatch === null) { + return null; + } +@@ -462,8 +565,14 @@ class CrossChainMessenger { + batch: stateRootBatch, + }; + } +- async getStateBatchAppendedEventByBatchIndex(batchIndex) { +- const events = await this.contracts.l1.StateCommitmentChain.queryFilter(this.contracts.l1.StateCommitmentChain.filters.StateBatchAppended(batchIndex)); ++ async getStateBatchAppendedEventByBatchIndex(batchIndex, opts) { ++ let events = []; ++ if (utils_1.WHITELIST_CHAIN_ID.includes(this.l1ChainId)) { ++ events = await (0, utils_1.getStateBatchAppendedEventByBatchIndexFromGraph)(this.l1Provider, batchIndex); ++ } ++ else { ++ events = await this.contracts.l1.StateCommitmentChain.queryFilter(this.contracts.l1.StateCommitmentChain.filters.StateBatchAppended(batchIndex), opts === null || opts === void 0 ? void 0 : opts.fromBlock); ++ } + if (events.length === 0) { + return null; + } +@@ -474,7 +583,7 @@ class CrossChainMessenger { + return events[0]; + } + } +- async getStateBatchAppendedEventByTransactionIndex(transactionIndex) { ++ async getStateBatchAppendedEventByTransactionIndex(transactionIndex, opts = {}) { + const isEventHi = (event, index) => { + const prevTotalElements = event.args._prevTotalElements.toNumber(); + return index < prevTotalElements; +@@ -490,7 +599,7 @@ class CrossChainMessenger { + } + let lowerBound = 0; + let upperBound = totalBatches.toNumber() - 1; +- let batchEvent = await this.getStateBatchAppendedEventByBatchIndex(upperBound); ++ let batchEvent = await this.getStateBatchAppendedEventByBatchIndex(upperBound, opts); + if (batchEvent === null) { + return null; + } +@@ -502,7 +611,7 @@ class CrossChainMessenger { + } + while (lowerBound < upperBound) { + const middleOfBounds = Math.floor((lowerBound + upperBound) / 2); +- batchEvent = await this.getStateBatchAppendedEventByBatchIndex(middleOfBounds); ++ batchEvent = await this.getStateBatchAppendedEventByBatchIndex(middleOfBounds, opts); + if (isEventHi(batchEvent, transactionIndex)) { + upperBound = middleOfBounds; + } +@@ -515,8 +624,8 @@ class CrossChainMessenger { + } + return batchEvent; + } +- async getStateRootBatchByTransactionIndex(transactionIndex) { +- const stateBatchAppendedEvent = await this.getStateBatchAppendedEventByTransactionIndex(transactionIndex); ++ async getStateRootBatchByTransactionIndex(transactionIndex, opts = {}) { ++ const stateBatchAppendedEvent = await this.getStateBatchAppendedEventByTransactionIndex(transactionIndex, opts); + if (stateBatchAppendedEvent === null) { + return null; + } +@@ -534,24 +643,24 @@ class CrossChainMessenger { + }, + }; + } +- async getMessageProof(message) { ++ async getMessageProof(message, opts) { + const resolved = await this.toCrossChainMessage(message); + if (resolved.direction === interfaces_1.MessageDirection.L1_TO_L2) { + throw new Error(`can only generate proofs for L2 to L1 messages`); + } +- const stateRoot = await this.getMessageStateRoot(resolved); ++ const stateRoot = await this.getMessageStateRoot(resolved, opts); + if (stateRoot === null) { + throw new Error(`state root for message not yet published`); + } +- const messageSlot = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.keccak256(utils_1.encodeCrossChainMessage(resolved) + +- core_utils_1.remove0x(this.contracts.l2.L2CrossDomainMessenger.address)) + '00'.repeat(32)); +- const stateTrieProof = await utils_1.makeStateTrieProof(this.l2Provider, resolved.blockNumber, this.contracts.l2.OVM_L2ToL1MessagePasser.address, messageSlot); ++ const messageSlot = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.keccak256((0, utils_1.encodeCrossChainMessage)(resolved) + ++ (0, core_utils_1.remove0x)(this.contracts.l2.L2CrossDomainMessenger.address)) + '00'.repeat(32)); ++ const stateTrieProof = await (0, utils_1.makeStateTrieProof)(this.l2Provider, resolved.blockNumber, this.contracts.l2.OVM_L2ToL1MessagePasser.address, messageSlot); + return { + stateRoot: stateRoot.stateRoot, + stateRootBatchHeader: stateRoot.batch.header, + stateRootProof: { + index: stateRoot.stateRootIndexInBatch, +- siblings: utils_1.makeMerkleTreeProof(stateRoot.batch.stateRoots, stateRoot.stateRootIndexInBatch), ++ siblings: (0, utils_1.makeMerkleTreeProof)(stateRoot.batch.stateRoots, stateRoot.stateRootIndexInBatch), + }, + stateTrieWitness: stateTrieProof.accountProof, + storageTrieWitness: stateTrieProof.storageProof, +@@ -572,6 +681,9 @@ class CrossChainMessenger { + async finalizeMessage(message, opts) { + return ((opts === null || opts === void 0 ? void 0 : opts.signer) || this.l1Signer).sendTransaction(await this.populateTransaction.finalizeMessage(message, opts)); + } ++ async finalizeBatchMessage(messages, opts) { ++ return ((opts === null || opts === void 0 ? void 0 : opts.signer) || this.l1Signer).sendTransaction(await this.populateTransaction.finalizeBatchMessage(messages, opts)); ++ } + async depositETH(amount, opts) { + return ((opts === null || opts === void 0 ? void 0 : opts.signer) || this.l1Signer).sendTransaction(await this.populateTransaction.depositETH(amount, opts)); + } +diff --git a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js.map b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js.map +index a169992..96e5436 100644 +--- a/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/cross-chain-messenger.js.map +@@ -1 +1 @@ +-{"version":3,"file":"cross-chain-messenger.js","sourceRoot":"","sources":["../src/cross-chain-messenger.ts"],"names":[],"mappings":";;;AACA,wEAMyC;AAEzC,mCAAqD;AACrD,yDAA0D;AAC1D,uDAAoD;AAEpD,6CAuBqB;AACrB,mCAagB;AAEhB,MAAa,mBAAmB;IAqB9B,YAAY,IAQX;QA04BD,wBAAmB,GAAG;YACpB,WAAW,EAAE,KAAK,EAChB,OAAiC,EACjC,IAGC,EAC4B,EAAE;gBAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,WAAW,CAC7E,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,EACnE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,WAAW,CAC7E,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,CAAC,EACD,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,eAA2B,EAC3B,IAEC,EAC4B,EAAE;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBACxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACpD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;iBAClD;gBAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,aAAa,CAC/E,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,QAAQ,EACjB,eAAe,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;YACH,CAAC;YAED,eAAe,EAAE,KAAK,EACpB,OAAoB,EACpB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBACxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;iBACpD;gBAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;gBAClD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,YAAY,CAC9E,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,KAAK,EACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;YACH,CAAC;YAED,UAAU,EAAE,KAAK,EACf,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CACjD,eAAM,CAAC,SAAS,CAAC,WAAW,EAC5B,sBAAU,CAAC,OAAO,EAClB,MAAM,EACN,IAAI,CACL,CAAA;YACH,CAAC;YAED,WAAW,EAAE,KAAK,EAChB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAClD,eAAM,CAAC,SAAS,CAAC,WAAW,EAC5B,sBAAU,CAAC,OAAO,EAClB,MAAM,EACN,IAAI,CACL,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3E,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3E,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC5E,CAAC;SACF,CAAA;QAED,gBAAW,GAAG;YACZ,WAAW,EAAE,KAAK,EAChB,OAAiC,EACjC,IAGC,EACmB,EAAE;gBACtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBACpE,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACnD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;iBACvC;qBAAM;oBACL,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;iBACvC;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,eAA2B,EAC3B,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,eAAe,EACf,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,eAAe,EAAE,KAAK,EACpB,OAAoB,EACpB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9D,CAAA;YACH,CAAC;YAED,UAAU,EAAE,KAAK,EACf,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CACxD,CAAA;YACH,CAAC;YAED,WAAW,EAAE,KAAK,EAChB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CACzD,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;SACF,CAAA;QAlpCC,IAAI,CAAC,kBAAkB,GAAG,0BAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACrE,IAAI,CAAC,kBAAkB,GAAG,0BAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACrE,IAAI,CAAC,SAAS,GAAG,gBAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEzC,IAAI,CAAC,yBAAyB;YAC5B,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,yBAAyB,MAAK,SAAS;gBAC3C,CAAC,CAAC,gBAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBAC1C,CAAC,CAAC,mCAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAEtD,IAAI,CAAC,kBAAkB;YACrB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,kBAAkB,MAAK,SAAS;gBACpC,CAAC,CAAC,gBAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC;gBACnC,CAAC,CAAC,yBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAE5C,IAAI,CAAC,SAAS,GAAG,yBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE;YACjD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,yBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YACrD,SAAS,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAe,CAAA;SAC/C;IACH,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAe,CAAA;SAC/C;IACH,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;IACH,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;IACH,CAAC;IAEM,KAAK,CAAC,wBAAwB,CACnC,WAA4B,EAC5B,OAEI,EAAE;QAIN,IAAI,OAAQ,WAAmB,CAAC,IAAI,KAAK,UAAU,EAAE;YACnD,MAAO,WAAmB,CAAC,IAAI,EAAE,CAAA;SAClC;QAGD,MAAM,MAAM,GAAG,yBAAiB,CAAC,WAAW,CAAC,CAAA;QAE7C,IAAI,OAA2B,CAAA;QAC/B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAEhC,IAAI,IAAI,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBAChD,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;aAC9D;iBAAM;gBACL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;aAC9D;SACF;aAAM;YAEL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAC7D,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,SAAS,GAAG,6BAAgB,CAAC,QAAQ,CAAA;aAC3C;iBAAM;gBACL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;gBAC7D,IAAI,CAAC,SAAS,GAAG,6BAAgB,CAAC,QAAQ,CAAA;aAC3C;SACF;QAED,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAA;SACpE;QAGD,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAA;QAE9C,OAAO,OAAO,CAAC,IAAI;aAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAEd,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAA;QAC1C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAEd,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChD,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAA;QACtC,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAEX,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChD,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBAC1B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;gBAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;gBACtC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;aACrC,CAAA;QACH,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,IAIC;QAED,MAAM,IAAI,KAAK,CAAC;;;;;;KAMf,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,OAAoB,EACpB,OAAoB;QAEpB,MAAM,OAAO,GAAqB,EAAE,CAAA;QACpC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAChD,IAAI,MAAM,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;gBACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;aACrB;SACF;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;SAC7D;QAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,OAGI,EAAE;QAEN,OAAO,CACL,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/C,OAAO,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC,CAAC,CACH,CACF;aACE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,OAGI,EAAE;QAEN,OAAO,CACL,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/C,OAAO,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACtD,CAAC,CAAC,CACH,CACF;aACE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,OAAoB;QAGpB,IAAK,OAA6B,CAAC,OAAO,EAAE;YAC1C,OAAO,OAA4B,CAAA;SACpC;aAAM,IACJ,OAA8B,CAAC,OAAO;YACtC,OAA8B,CAAC,OAAO;YACtC,OAA8B,CAAC,eAAe,EAC/C;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CACjD,OAA8B,CAAC,eAAe,CAChD,CAAA;YASD,MAAM,KAAK,GAAG,QAAQ;iBACnB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAEb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;YAChC,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,OAAO,CAAC,CAAC,QAAQ,GAAI,OAA8B,CAAC,QAAQ,CAAA;YAC9D,CAAC,CAAC,CAAA;YAEJ,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAChE;YAED,OAAO,KAAK,CAAA;SACb;aAAM;YAEL,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,OAA0B,CAC3B,CAAA;YAKD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;aAC9D;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;SACnB;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAoB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QAEtD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,OAAO,0BAAa,CAAC,4BAA4B,CAAA;aAClD;iBAAM;gBACL,IAAI,OAAO,CAAC,aAAa,KAAK,iCAAoB,CAAC,iBAAiB,EAAE;oBACpE,OAAO,0BAAa,CAAC,OAAO,CAAA;iBAC7B;qBAAM;oBACL,OAAO,0BAAa,CAAC,uBAAuB,CAAA;iBAC7C;aACF;SACF;aAAM;YACL,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAC1D,IAAI,SAAS,KAAK,IAAI,EAAE;oBACtB,OAAO,0BAAa,CAAC,wBAAwB,CAAA;iBAC9C;qBAAM;oBACL,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;oBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,SAAS,CAAC,KAAK,CAAC,WAAW,CAC5B,CAAA;oBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;oBAC5D,IAAI,WAAW,CAAC,SAAS,GAAG,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE;wBACnE,OAAO,0BAAa,CAAC,mBAAmB,CAAA;qBACzC;yBAAM;wBACL,OAAO,0BAAa,CAAC,eAAe,CAAA;qBACrC;iBACF;aACF;iBAAM;gBACL,IAAI,OAAO,CAAC,aAAa,KAAK,iCAAoB,CAAC,iBAAiB,EAAE;oBACpE,OAAO,0BAAa,CAAC,OAAO,CAAA;iBAC7B;qBAAM;oBACL,OAAO,0BAAa,CAAC,eAAe,CAAA;iBACrC;aACF;SACF;IACH,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,WAAW,GAAG,6BAAqB,CAAC,QAAQ,CAAC,CAAA;QAGnD,MAAM,SAAS,GACb,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ;YAC9C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAA;QAE9C,MAAM,oBAAoB,GAAG,MAAM,SAAS,CAAC,WAAW,CACtD,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAC9C,CAAA;QAGD,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;YACrC,OAAO;gBACL,aAAa,EAAE,iCAAoB,CAAC,iBAAiB;gBACrD,kBAAkB,EAChB,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE;aACxD,CAAA;SACF;aAAM,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YAE1C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;SAC1D;QAID,MAAM,0BAA0B,GAAG,MAAM,SAAS,CAAC,WAAW,CAC5D,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CACpD,CAAA;QAKD,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,OAAO;gBACL,aAAa,EAAE,iCAAoB,CAAC,cAAc;gBAClD,kBAAkB,EAAE,MAAM,0BAA0B,CAClD,0BAA0B,CAAC,MAAM,GAAG,CAAC,CACtC,CAAC,qBAAqB,EAAE;aAC1B,CAAA;SACF;QAWD,OAAO,IAAI,CAAA;IACb,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,OAAoB,EACpB,OAII,EAAE;QAGN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAExD,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,OAAO,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YACtD,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,OAAO,OAAO,CAAA;aACf;iBAAM;gBACL,MAAM,kBAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAA;gBACxC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;aACjC;SACF;QAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,MAAqB,EACrB,OAGI,EAAE;QAGN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAExD,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,OAAO,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAG3D,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBAEpD,IAAI,aAAa,KAAK,MAAM,EAAE;oBAC5B,OAAM;iBACP;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,4BAA4B;oBACrD,aAAa,GAAG,MAAM,EACtB;oBAGA,OAAM;iBACP;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,uBAAuB;oBAChD,aAAa,KAAK,0BAAa,CAAC,OAAO,EACvC;oBACA,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;iBACF;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;oBAChC,aAAa,KAAK,0BAAa,CAAC,uBAAuB,EACvD;oBACA,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;iBACF;aACF;YAGD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBACpD,IAAI,aAAa,IAAI,MAAM,EAAE;oBAG3B,OAAM;iBACP;aACF;YAED,MAAM,kBAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAA;YACxC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;SACjC;QAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,OAA2B,EAC3B,IAGC;QAED,IAAI,QAAsD,CAAA;QAC1D,IAAI,IAAY,CAAA;QAChB,IAAK,OAA6B,CAAC,YAAY,KAAK,SAAS,EAAE;YAC7D,QAAQ,GAAG,OAAmC,CAAA;YAC9C,IAAI,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;SAClB;aAAM;YACL,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAsB,CAAC,CAAA;YACjE,IAAI,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,KAAK,QAA8B,CAAC,MAAM,CAAA;SAC5D;QAGD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YACjD,IAAI;YACJ,EAAE,EAAE,QAAQ,CAAC,MAAM;YACnB,IAAI,EAAE,QAAQ,CAAC,OAAO;SACvB,CAAC,CAAA;QAGF,MAAM,aAAa,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,KAAI,EAAE,CAAA;QAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAEM,KAAK,CAAC,8BAA8B,CACzC,OAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;gBAChC,MAAM,KAAK,0BAAa,CAAC,uBAAuB,EAChD;gBAEA,OAAO,CAAC,CAAA;aACT;iBAAM;gBAIL,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CACzD,QAAQ,CAAC,eAAe,CACzB,CAAA;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,aAAa,EACtD,CAAC,CACF,CAAA;gBACD,OAAO,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAA;aAC5C;SACF;aAAM;YACL,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;gBAChC,MAAM,KAAK,0BAAa,CAAC,eAAe,EACxC;gBAEA,OAAO,CAAC,CAAA;aACT;iBAAM,IAAI,MAAM,KAAK,0BAAa,CAAC,wBAAwB,EAAE;gBAK5D,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAA;aACxC;iBAAM,IAAI,MAAM,KAAK,0BAAa,CAAC,mBAAmB,EAAE;gBAIvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAC1D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;gBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,SAAS,CAAC,KAAK,CAAC,WAAW,CAC5B,CAAA;gBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC5D,OAAO,IAAI,CAAC,GAAG,CACb,eAAe,GAAG,CAAC,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,EACjE,CAAC,CACF,CAAA;aACF;iBAAM;gBAEL,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;aAC7C;SACF;IACH,CAAC;IAEM,KAAK,CAAC,yBAAyB;QACpC,MAAM,eAAe,GACnB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,CAAA;QACnE,OAAO,eAAe,CAAC,QAAQ,EAAE,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,OAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAGxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;SACnE;QAID,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAClE,QAAQ,CAAC,eAAe,CACzB,CAAA;QAID,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAA;QAIvD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,mCAAmC,CACnE,cAAc,CACf,CAAA;QAGD,IAAI,cAAc,KAAK,IAAI,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;QAMD,MAAM,YAAY,GAChB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAA;QAGrE,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,IAAI,YAAY,EAAE;YAEpD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,OAAO;YACL,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC;YAClD,qBAAqB,EAAE,YAAY;YACnC,KAAK,EAAE,cAAc;SACtB,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,sCAAsC,CACjD,UAAkB;QAElB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,WAAW,CACrE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,kBAAkB,CAC/D,UAAU,CACX,CACF,CAAA;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,IAAI,CAAA;SACZ;aAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAE5B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;SAChE;aAAM;YACL,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;SACjB;IACH,CAAC;IAEM,KAAK,CAAC,4CAA4C,CACvD,gBAAwB;QAExB,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE;YACvD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA;YAClE,OAAO,KAAK,GAAG,iBAAiB,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE;YACvD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA;YAClE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAA;YAClD,OAAO,KAAK,IAAI,iBAAiB,GAAG,SAAS,CAAA;QAC/C,CAAC,CAAA;QAED,MAAM,YAAY,GAChB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAA;QAChE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACtB,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAC5C,IAAI,UAAU,GACZ,MAAM,IAAI,CAAC,sCAAsC,CAAC,UAAU,CAAC,CAAA;QAG/D,IAAI,UAAU,KAAK,IAAI,EAAE;YACvB,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;YAE3C,OAAO,IAAI,CAAA;SACZ;aAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;YAGnD,OAAO,UAAU,CAAA;SAClB;QAID,OAAO,UAAU,GAAG,UAAU,EAAE;YAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;YAChE,UAAU,GAAG,MAAM,IAAI,CAAC,sCAAsC,CAC5D,cAAc,CACf,CAAA;YAED,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAC3C,UAAU,GAAG,cAAc,CAAA;aAC5B;iBAAM,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAClD,UAAU,GAAG,cAAc,CAAA;aAC5B;iBAAM;gBACL,MAAK;aACN;SACF;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAC9C,gBAAwB;QAExB,MAAM,uBAAuB,GAC3B,MAAM,IAAI,CAAC,4CAA4C,CAAC,gBAAgB,CAAC,CAAA;QAC3E,IAAI,uBAAuB,KAAK,IAAI,EAAE;YACpC,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,qBAAqB,GAAG,MAAM,uBAAuB,CAAC,cAAc,EAAE,CAAA;QAC5E,MAAM,CAAC,UAAU,CAAC,GAChB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,kBAAkB,CACjE,kBAAkB,EAClB,qBAAqB,CAAC,IAAI,CAC3B,CAAA;QAEH,OAAO;YACL,WAAW,EAAE,uBAAuB,CAAC,WAAW;YAChD,UAAU;YACV,MAAM,EAAE;gBACN,UAAU,EAAE,uBAAuB,CAAC,IAAI,CAAC,WAAW;gBACpD,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;gBAClD,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;gBAClD,iBAAiB,EAAE,uBAAuB,CAAC,IAAI,CAAC,kBAAkB;gBAClE,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;aACnD;SACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,OAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAC1D,IAAI,SAAS,KAAK,IAAI,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;SAC5D;QAQD,MAAM,WAAW,GAAG,eAAM,CAAC,KAAK,CAAC,SAAS,CACxC,eAAM,CAAC,KAAK,CAAC,SAAS,CACpB,+BAAuB,CAAC,QAAQ,CAAC;YAC/B,qBAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAC7D,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CACpB,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,0BAAkB,CAC7C,IAAI,CAAC,UAAiB,EACtB,QAAQ,CAAC,WAAW,EACpB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,uBAAuB,CAAC,OAAO,EACjD,WAAW,CACZ,CAAA;QAED,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,oBAAoB,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YAC5C,cAAc,EAAE;gBACd,KAAK,EAAE,SAAS,CAAC,qBAAqB;gBACtC,QAAQ,EAAE,2BAAmB,CAC3B,SAAS,CAAC,KAAK,CAAC,UAAU,EAC1B,SAAS,CAAC,qBAAqB,CAChC;aACF;YACD,gBAAgB,EAAE,cAAc,CAAC,YAAY;YAC7C,kBAAkB,EAAE,cAAc,CAAC,YAAY;SAChD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,OAAiC,EACjC,IAIC;QAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpE,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACnD,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;SAC3D;aAAM;YACL,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;SAC3D;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,OAAoB,EACpB,eAA2B,EAC3B,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,eAAe,EACf,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,OAAoB,EACpB,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9D,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CACrB,MAAkB,EAClB,IAKC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,MAAkB,EAClB,IAIC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CACzD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,IAEC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzE,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAKC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;CA4QF;AAjrCD,kDAirCC"} +\ No newline at end of file ++{"version":3,"file":"cross-chain-messenger.js","sourceRoot":"","sources":["../src/cross-chain-messenger.ts"],"names":[],"mappings":";;;AACA,wEAMyC;AAEzC,mCAAqD;AACrD,yDAA0D;AAC1D,uDAAoD;AAEpD,6CAuBqB;AACrB,mCAiBgB;AAEhB,MAAa,mBAAmB;IAuB9B,YAAY,IASX;QAgjCD,wBAAmB,GAAG;YACpB,WAAW,EAAE,KAAK,EAChB,OAAiC,EACjC,IAGC,EAC4B,EAAE;gBAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;oBACvE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,WAAW,CACjF,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,EACnE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,WAAW,CAC7E,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,KAAI,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,EACnE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,WAAW,CAC7E,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,CAAC,EACD,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,eAA2B,EAC3B,IAEC,EAC4B,EAAE;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAExD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACpD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;iBAClD;gBAED,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,aAAa,CACnF,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,QAAQ,EACjB,eAAe,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,aAAa,CAC/E,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,QAAQ,EACjB,eAAe,EACf,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,eAAe,EAAE,KAAK,EACpB,OAAoB,EACpB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAExD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;iBACpD;gBAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;gBAElD,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAC,mBAAmB,CACrE,+HAA+H,CAChI,CACC,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,KAAK,EACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;qBAAM;oBACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,YAAY,CAC9E,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,EACrB,KAAK,EACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,oBAAoB,EAAE,KAAK,EACzB,QAA4B,EAC5B,IAGC,EAC4B,EAAE;gBAC/B,MAAM,YAAY,GAAG,EAAE,CAAA;gBACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;oBAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;oBAExD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;wBACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;qBACpD;oBACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;oBACxD,YAAY,CAAC,IAAI,CAAC;wBAChB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,KAAK;qBACN,CAAC,CAAA;iBACH;gBAED,IAAI,IAAI,CAAC,WAAW,EAAE;oBAEpB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAAC,mBAAmB,CACpE,yIAAyI,CAC1I,CAAC,YAAY,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CAAC,CAAA;iBACvC;qBAAM;oBACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,kBAAkB,CACnF,YAAY,EACZ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CACtB,CAAA;iBACF;YACH,CAAC;YAED,UAAU,EAAE,KAAK,EACf,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CACjD,eAAM,CAAC,SAAS,CAAC,WAAW,EAC5B,sBAAU,CAAC,OAAO,EAClB,MAAM,EACN,IAAI,CACL,CAAA;YACH,CAAC;YAED,WAAW,EAAE,KAAK,EAChB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAClD,eAAM,CAAC,SAAS,CAAC,WAAW,EAC5B,sBAAU,CAAC,OAAO,EAClB,MAAM,EACN,IAAI,CACL,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3E,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3E,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EAC4B,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC5E,CAAC;SACF,CAAA;QAED,gBAAW,GAAG;YACZ,WAAW,EAAE,KAAK,EAChB,OAAiC,EACjC,IAGC,EACmB,EAAE;gBACtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBACpE,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;oBACnD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;iBACvC;qBAAM;oBACL,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;iBACvC;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,eAA2B,EAC3B,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,eAAe,EACf,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,eAAe,EAAE,KAAK,EACpB,OAAoB,EACpB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9D,CAAA;YACH,CAAC;YAED,oBAAoB,EAAE,KAAK,EACzB,QAA4B,EAC5B,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CACpE,CAAA;YACH,CAAC;YAED,UAAU,EAAE,KAAK,EACf,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CACxD,CAAA;YACH,CAAC;YAED,WAAW,EAAE,KAAK,EAChB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CACzD,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAEC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,YAAY,EAAE,KAAK,EACjB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;YAED,aAAa,EAAE,KAAK,EAClB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC,EACmB,EAAE;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;YACH,CAAC;SACF,CAAA;QA54CC,IAAI,CAAC,kBAAkB,GAAG,IAAA,0BAAkB,EAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACrE,IAAI,CAAC,kBAAkB,GAAG,IAAA,0BAAkB,EAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACrE,IAAI,CAAC,SAAS,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAInC,IAAI,CAAC,yBAAyB;YAC5B,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,yBAAyB,MAAK,SAAS;gBAC3C,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,yBAAyB,CAAC;gBAC1C,CAAC,CAAC,mCAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAEtD,IAAI,CAAC,kBAAkB;YACrB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,kBAAkB,MAAK,SAAS;gBACpC,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,kBAAkB,CAAC;gBACnC,CAAC,CAAC,yBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAE5C,IAAI,CAAC,SAAS,GAAG,IAAA,yBAAiB,EAAC,IAAI,CAAC,SAAS,EAAE;YACjD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,IAAA,yBAAiB,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YACrD,SAAS,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAe,CAAA;SAC/C;IACH,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAe,CAAA;SAC/C;IACH,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;IACH,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,4BAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,IAAI,CAAC,kBAAkB,CAAA;SAC/B;IACH,CAAC;IAEM,KAAK,CAAC,wBAAwB,CACnC,WAA4B,EAC5B,OAEI,EAAE;QAIN,IAAI,OAAQ,WAAmB,CAAC,IAAI,KAAK,UAAU,EAAE;YACnD,MAAO,WAAmB,CAAC,IAAI,EAAE,CAAA;SAClC;QAGD,MAAM,MAAM,GAAG,IAAA,yBAAiB,EAAC,WAAW,CAAC,CAAA;QAE7C,IAAI,OAA2B,CAAA;QAC/B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAEhC,IAAI,IAAI,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBAChD,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;aAC9D;iBAAM;gBACL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;aAC9D;SACF;aAAM;YAEL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAC7D,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,SAAS,GAAG,6BAAgB,CAAC,QAAQ,CAAA;aAC3C;iBAAM;gBACL,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;gBAC7D,IAAI,CAAC,SAAS,GAAG,6BAAgB,CAAC,QAAQ,CAAA;aAC3C;SACF;QAED,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAA;SACpE;QAKD,IAAI,SAAS,GACX,IAAI,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAA;QAE9C,IAAI,IAAI,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;YACpE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;SACzD;QAED,OAAO,OAAO,CAAC,IAAI;aAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAEd,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAA;QAC1C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAEd,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChD,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAA;QACtC,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAEX,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChD,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBAC1B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;gBAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;gBACtC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;aACrC,CAAA;QACH,CAAC,CAAC,CAAA;IACN,CAAC;IAmBM,KAAK,CAAC,qBAAqB,CAChC,OAAoB,EACpB,OAAoB;QAEpB,MAAM,OAAO,GAAqB,EAAE,CAAA;QACpC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAChD,IAAI,MAAM,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;gBACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;aACrB;SACF;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;SAC7D;QAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,OAGI,EAAE;QAEN,OAAO,CACL,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/C,OAAO,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC,CAAC,CACH,CACF;aACE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,OAGI,EAAE;QAEN,OAAO,CACL,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/C,OAAO,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACtD,CAAC,CAAC,CACH,CACF;aACE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAEb,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,OAAoB;QAGpB,IAAK,OAA6B,CAAC,OAAO,EAAE;YAC1C,OAAO,OAA4B,CAAA;SACpC;aAAM,IACJ,OAA8B,CAAC,OAAO;YACtC,OAA8B,CAAC,OAAO;YACtC,OAA8B,CAAC,eAAe,EAC/C;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CACjD,OAA8B,CAAC,eAAe,CAChD,CAAA;YASD,MAAM,KAAK,GAAG,QAAQ;iBACnB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAEb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;YAChC,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,OAAO,CAAC,CAAC,QAAQ,GAAI,OAA8B,CAAC,QAAQ,CAAA;YAC9D,CAAC,CAAC,CAAA;YAEJ,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAChE;YAED,OAAO,KAAK,CAAA;SACb;aAAM;YAEL,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,OAA0B,CAC3B,CAAA;YAKD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;aAC9D;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;SACnB;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,OAAoB,EACpB,OAGI,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAExD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAE5D,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,OAAO,0BAAa,CAAC,4BAA4B,CAAA;aAClD;iBAAM;gBACL,IAAI,OAAO,CAAC,aAAa,KAAK,iCAAoB,CAAC,iBAAiB,EAAE;oBACpE,OAAO,0BAAa,CAAC,OAAO,CAAA;iBAC7B;qBAAM;oBACL,OAAO,0BAAa,CAAC,uBAAuB,CAAA;iBAC7C;aACF;SACF;aAAM;YACL,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAC1D,IAAI,SAAS,KAAK,IAAI,EAAE;oBACtB,OAAO,0BAAa,CAAC,wBAAwB,CAAA;iBAC9C;qBAAM;oBAEL,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;oBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,SAAS,CAAC,KAAK,CAAC,WAAW,CAC5B,CAAA;oBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;oBAC5D,IAAI,WAAW,CAAC,SAAS,GAAG,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE;wBACnE,OAAO,0BAAa,CAAC,mBAAmB,CAAA;qBACzC;yBAAM;wBACL,OAAO,0BAAa,CAAC,eAAe,CAAA;qBACrC;iBACF;aACF;iBAAM;gBACL,IAAI,OAAO,CAAC,aAAa,KAAK,iCAAoB,CAAC,iBAAiB,EAAE;oBACpE,OAAO,0BAAa,CAAC,OAAO,CAAA;iBAC7B;qBAAM;oBACL,OAAO,0BAAa,CAAC,cAAc,CAAA;iBACpC;aACF;SACF;IACH,CAAC;IAEM,KAAK,CAAC,6BAA6B,CACxC,OAAoB,EACpB,OAGI,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,WAAW,GAAG,IAAA,6BAAqB,EAAC,QAAQ,CAAC,CAAA;QACnD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;SAC5D;aAAM;YACL,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,SAAS,KAAK,IAAI,EAAE;gBACtB,OAAO,0BAAa,CAAC,wBAAwB,CAAA;aAC9C;iBAAM;gBAEL,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;gBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,SAAS,CAAC,KAAK,CAAC,WAAW,CAC5B,CAAA;gBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC5D,IAAI,WAAW,CAAC,SAAS,GAAG,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE;oBACnE,OAAO,0BAAa,CAAC,mBAAmB,CAAA;iBACzC;qBAAM;oBACL,IAAI,aAAsB,CAAA;oBAC1B,IAAI,YAAqB,CAAA;oBACzB,IAAI,IAAI,CAAC,WAAW,EAAE;wBACpB,aAAa;4BACX,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAC,kBAAkB,CACnE,WAAW,CACZ,CAAA;wBACH,YAAY;4BACV,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAC,cAAc,CAC/D,WAAW,CACZ,CAAA;qBACJ;yBAAM;wBACL,aAAa;4BACX,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,kBAAkB,CAC/D,WAAW,CACZ,CAAA;wBACH,YAAY;4BACV,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,cAAc,CAC3D,WAAW,CACZ,CAAA;qBACJ;oBACD,IAAI,aAAa,EAAE;wBACjB,OAAO,0BAAa,CAAC,OAAO,CAAA;qBAC7B;yBAAM,IAAI,YAAY,EAAE;wBACvB,OAAO,0BAAa,CAAC,cAAc,CAAA;qBACpC;yBAAM;wBACL,OAAO,0BAAa,CAAC,eAAe,CAAA;qBACrC;iBACF;aACF;SACF;IACH,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAAoB,EACpB,IAGC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,WAAW,GAAG,IAAA,6BAAqB,EAAC,QAAQ,CAAC,CAAA;QAGnD,IAAI,SAAS,GACX,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ;YAC9C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAA;QAE9C,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;YACxE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0BAA0B,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;SACvD;QAED,IAAI,oBAAoB,GAAmB,EAAE,CAAA;QAC7C,IACE,0BAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3C,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAChD;YACA,oBAAoB,GAAG,MAAM,IAAA,wCAAgC,EAC3D,IAAI,CAAC,UAAU,EACf,WAAW,EACX,IAAI,CAAC,WAAW,CACjB,CAAA;SACF;aAAM;YACL,oBAAoB,GAAG,MAAM,SAAS,CAAC,WAAW,CAChD,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,EAC7C,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;SACF;QAGD,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;YACrC,OAAO;gBACL,aAAa,EAAE,iCAAoB,CAAC,iBAAiB;gBACrD,kBAAkB,EAChB,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE;aACxD,CAAA;SACF;aAAM,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YAE1C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;SAC1D;QAID,IAAI,0BAA0B,GAAmB,EAAE,CAAA;QACnD,IACE,0BAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3C,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAChD;YACA,0BAA0B,GAAG,MAAM,IAAA,8CAAsC,EACvE,IAAI,CAAC,UAAU,EACf,WAAW,EACX,IAAI,CAAC,WAAW,CACjB,CAAA;SACF;aAAM;YACL,0BAA0B,GAAG,MAAM,SAAS,CAAC,WAAW,CACtD,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,EACnD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,EACf,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CACd,CAAA;SACF;QAKD,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,OAAO;gBACL,aAAa,EAAE,iCAAoB,CAAC,cAAc;gBAClD,kBAAkB,EAAE,MAAM,0BAA0B,CAClD,0BAA0B,CAAC,MAAM,GAAG,CAAC,CACtC,CAAC,qBAAqB,EAAE;aAC1B,CAAA;SACF;QAWD,OAAO,IAAI,CAAA;IACb,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,OAAoB,EACpB,OAMI,EAAE;QAGN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAExD,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,OAAO,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAC5D,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,OAAO,OAAO,CAAA;aACf;iBAAM;gBACL,MAAM,IAAA,kBAAK,EAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAA;gBACxC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;aACjC;SACF;QAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,OAAoB,EACpB,MAAqB,EACrB,OAKI,EAAE;QAGN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAExD,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,OAAO,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAGjE,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBAEpD,IAAI,aAAa,KAAK,MAAM,EAAE;oBAC5B,OAAM;iBACP;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,4BAA4B;oBACrD,aAAa,GAAG,MAAM,EACtB;oBAGA,OAAM;iBACP;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,uBAAuB;oBAChD,aAAa,KAAK,0BAAa,CAAC,OAAO,EACvC;oBACA,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;iBACF;gBAED,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;oBAChC,aAAa,KAAK,0BAAa,CAAC,uBAAuB,EACvD;oBACA,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;iBACF;aACF;YAGD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;gBACpD,IAAI,aAAa,IAAI,MAAM,EAAE;oBAG3B,OAAM;iBACP;aACF;YAED,MAAM,IAAA,kBAAK,EAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAA;YACxC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;SACjC;QAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,OAA2B,EAC3B,IAGC;QAED,IAAI,QAAsD,CAAA;QAC1D,IAAI,IAAY,CAAA;QAChB,IAAK,OAA6B,CAAC,YAAY,KAAK,SAAS,EAAE;YAC7D,QAAQ,GAAG,OAAmC,CAAA;YAC9C,IAAI,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;SAClB;aAAM;YACL,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAsB,CAAC,CAAA;YACjE,IAAI,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,KAAK,QAA8B,CAAC,MAAM,CAAA;SAC5D;QAGD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YACjD,IAAI;YACJ,EAAE,EAAE,QAAQ,CAAC,MAAM;YACnB,IAAI,EAAE,QAAQ,CAAC,OAAO;SACvB,CAAC,CAAA;QAGF,MAAM,aAAa,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,KAAI,EAAE,CAAA;QAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAEM,KAAK,CAAC,8BAA8B,CACzC,OAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;gBAChC,MAAM,KAAK,0BAAa,CAAC,uBAAuB,EAChD;gBAEA,OAAO,CAAC,CAAA;aACT;iBAAM;gBAIL,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CACzD,QAAQ,CAAC,eAAe,CACzB,CAAA;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,aAAa,EACtD,CAAC,CACF,CAAA;gBACD,OAAO,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAA;aAC5C;SACF;aAAM;YACL,IACE,MAAM,KAAK,0BAAa,CAAC,OAAO;gBAChC,MAAM,KAAK,0BAAa,CAAC,eAAe;gBACxC,MAAM,KAAK,0BAAa,CAAC,cAAc,EACvC;gBAEA,OAAO,CAAC,CAAA;aACT;iBAAM,IAAI,MAAM,KAAK,0BAAa,CAAC,wBAAwB,EAAE;gBAK5D,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAA;aACxC;iBAAM,IAAI,MAAM,KAAK,0BAAa,CAAC,mBAAmB,EAAE;gBAIvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAC1D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;gBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,SAAS,CAAC,KAAK,CAAC,WAAW,CAC5B,CAAA;gBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC5D,OAAO,IAAI,CAAC,GAAG,CACb,eAAe,GAAG,CAAC,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,EACjE,CAAC,CACF,CAAA;aACF;iBAAM;gBAEL,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;aAC7C;SACF;IACH,CAAC;IAEM,KAAK,CAAC,yBAAyB;QAEpC,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,CAAC,CAAA;SACT;QACD,MAAM,eAAe,GACnB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,CAAA;QACnE,OAAO,eAAe,CAAC,QAAQ,EAAE,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,OAAoB,EACpB,OAGI,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAGxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;SACnE;QAID,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAClE,QAAQ,CAAC,eAAe,CACzB,CAAA;QAID,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAA;QAIvD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,mCAAmC,CACnE,cAAc,EACd,IAAI,CACL,CAAA;QAGD,IAAI,cAAc,KAAK,IAAI,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;QAMD,MAAM,YAAY,GAChB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAA;QAGrE,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,IAAI,YAAY,EAAE;YAEpD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;SACtD;QAED,OAAO;YACL,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC;YAClD,qBAAqB,EAAE,YAAY;YACnC,KAAK,EAAE,cAAc;SACtB,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,sCAAsC,CACjD,UAAkB,EAClB,IAGC;QAED,IAAI,MAAM,GAAmB,EAAE,CAAA;QAC/B,IAAI,0BAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC/C,MAAM,GAAG,MAAM,IAAA,uDAA+C,EAC5D,IAAI,CAAC,UAAU,EACf,UAAU,CACX,CAAA;SACF;aAAM;YACL,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAC/D,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,kBAAkB,CAC/D,UAAU,CACX,EACD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,CAChB,CAAA;SACF;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,IAAI,CAAA;SACZ;aAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAE5B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;SAChE;aAAM;YACL,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;SACjB;IACH,CAAC;IAEM,KAAK,CAAC,4CAA4C,CACvD,gBAAwB,EACxB,OAGI,EAAE;QAEN,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE;YACvD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA;YAClE,OAAO,KAAK,GAAG,iBAAiB,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE;YACvD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA;YAClE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAA;YAClD,OAAO,KAAK,IAAI,iBAAiB,GAAG,SAAS,CAAA;QAC/C,CAAC,CAAA;QAED,MAAM,YAAY,GAChB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAA;QAChE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACtB,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAC5C,IAAI,UAAU,GACZ,MAAM,IAAI,CAAC,sCAAsC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAGrE,IAAI,UAAU,KAAK,IAAI,EAAE;YACvB,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;YAE3C,OAAO,IAAI,CAAA;SACZ;aAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;YAGnD,OAAO,UAAU,CAAA;SAClB;QAID,OAAO,UAAU,GAAG,UAAU,EAAE;YAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;YAChE,UAAU,GAAG,MAAM,IAAI,CAAC,sCAAsC,CAC5D,cAAc,EACd,IAAI,CACL,CAAA;YAED,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAC3C,UAAU,GAAG,cAAc,CAAA;aAC5B;iBAAM,IAAI,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAClD,UAAU,GAAG,cAAc,CAAA;aAC5B;iBAAM;gBACL,MAAK;aACN;SACF;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAC9C,gBAAwB,EACxB,OAEI,EAAE;QAEN,MAAM,uBAAuB,GAC3B,MAAM,IAAI,CAAC,4CAA4C,CACrD,gBAAgB,EAChB,IAAI,CACL,CAAA;QACH,IAAI,uBAAuB,KAAK,IAAI,EAAE;YACpC,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,qBAAqB,GAAG,MAAM,uBAAuB,CAAC,cAAc,EAAE,CAAA;QAC5E,MAAM,CAAC,UAAU,CAAC,GAChB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,kBAAkB,CACjE,kBAAkB,EAClB,qBAAqB,CAAC,IAAI,CAC3B,CAAA;QAEH,OAAO;YACL,WAAW,EAAE,uBAAuB,CAAC,WAAW;YAChD,UAAU;YACV,MAAM,EAAE;gBACN,UAAU,EAAE,uBAAuB,CAAC,IAAI,CAAC,WAAW;gBACpD,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;gBAClD,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;gBAClD,iBAAiB,EAAE,uBAAuB,CAAC,IAAI,CAAC,kBAAkB;gBAClE,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU;aACnD;SACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,OAAoB,EACpB,IAEC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACxD,IAAI,QAAQ,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAChE,IAAI,SAAS,KAAK,IAAI,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;SAC5D;QAQD,MAAM,WAAW,GAAG,eAAM,CAAC,KAAK,CAAC,SAAS,CACxC,eAAM,CAAC,KAAK,CAAC,SAAS,CACpB,IAAA,+BAAuB,EAAC,QAAQ,CAAC;YAC/B,IAAA,qBAAQ,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAC7D,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CACpB,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,IAAA,0BAAkB,EAC7C,IAAI,CAAC,UAAiB,EACtB,QAAQ,CAAC,WAAW,EACpB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,uBAAuB,CAAC,OAAO,EACjD,WAAW,CACZ,CAAA;QAED,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,oBAAoB,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YAC5C,cAAc,EAAE;gBACd,KAAK,EAAE,SAAS,CAAC,qBAAqB;gBACtC,QAAQ,EAAE,IAAA,2BAAmB,EAC3B,SAAS,CAAC,KAAK,CAAC,UAAU,EAC1B,SAAS,CAAC,qBAAqB,CAChC;aACF;YACD,gBAAgB,EAAE,cAAc,CAAC,YAAY;YAC7C,kBAAkB,EAAE,cAAc,CAAC,YAAY;SAChD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,OAAiC,EACjC,IAIC;QAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpE,IAAI,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,QAAQ,EAAE;YACnD,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;SAC3D;aAAM;YACL,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;SAC3D;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,OAAoB,EACpB,eAA2B,EAC3B,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,eAAe,EACf,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,OAAoB,EACpB,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9D,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,QAA4B,EAC5B,IAIC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CACpE,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CACrB,MAAkB,EAClB,IAKC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CACxD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,MAAkB,EAClB,IAIC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CACzD,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,OAAoB,EACpB,OAAoB,EACpB,IAEC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzE,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAGC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAKC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CACzC,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,OAAoB,EACpB,OAAoB,EACpB,MAAkB,EAClB,IAIC;QAED,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAC1C,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CACL,CACF,CAAA;IACH,CAAC;CAgWF;AA96CD,kDA86CC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/index.js b/node_modules/@eth-optimism/sdk/dist/index.js +index 100263e..0910b78 100644 +--- a/node_modules/@eth-optimism/sdk/dist/index.js ++++ b/node_modules/@eth-optimism/sdk/dist/index.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +diff --git a/node_modules/@eth-optimism/sdk/dist/index.js.map b/node_modules/@eth-optimism/sdk/dist/index.js.map +index db87abd..1e24b73 100644 +--- a/node_modules/@eth-optimism/sdk/dist/index.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/index.js.map +@@ -1 +1 @@ +-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAA4B;AAC5B,0CAAuB;AACvB,0DAAuC;AACvC,6CAA0B;AAC1B,gDAA6B"} +\ No newline at end of file ++{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,0CAAuB;AACvB,0DAAuC;AACvC,6CAA0B;AAC1B,gDAA6B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/cross-chain-messenger.d.ts b/node_modules/@eth-optimism/sdk/dist/interfaces/cross-chain-messenger.d.ts +index 7abc615..553d994 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/cross-chain-messenger.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/cross-chain-messenger.d.ts +@@ -15,14 +15,10 @@ export interface ICrossChainMessenger { + l2Signer: Signer; + depositConfirmationBlocks: number; + l1BlockTimeSeconds: number; ++ fastRelayer: boolean; + getMessagesByTransaction(transaction: TransactionLike, opts?: { + direction?: MessageDirection; + }): Promise; +- getMessagesByAddress(address: AddressLike, opts?: { +- direction?: MessageDirection; +- fromBlock?: NumberLike; +- toBlock?: NumberLike; +- }): Promise; + getBridgeForTokenPair(l1Token: AddressLike, l2Token: AddressLike): Promise; + getDepositsByAddress(address: AddressLike, opts?: { + fromBlock?: BlockTag; +@@ -34,11 +30,17 @@ export interface ICrossChainMessenger { + }): Promise; + toCrossChainMessage(message: MessageLike): Promise; + getMessageStatus(message: MessageLike): Promise; +- getMessageReceipt(message: MessageLike): Promise; ++ getMessageStatusFromContracts(message: MessageLike): Promise; ++ getMessageReceipt(message: MessageLike, opts?: { ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; ++ }): Promise; + waitForMessageReceipt(message: MessageLike, opts?: { + confirmations?: number; + pollIntervalMs?: number; + timeoutMs?: number; ++ fromBlock?: BlockTag; ++ toBlock?: BlockTag; + }): Promise; + waitForMessageStatus(message: MessageLike, status: MessageStatus, opts?: { + pollIntervalMs?: number; +@@ -68,6 +70,10 @@ export interface ICrossChainMessenger { + signer?: Signer; + overrides?: Overrides; + }): Promise; ++ finalizeBatchMessage(messages: Array, opts?: { ++ signer?: Signer; ++ overrides?: Overrides; ++ }): Promise; + depositETH(amount: NumberLike, opts?: { + signer?: Signer; + recipient?: AddressLike; +@@ -108,6 +114,9 @@ export interface ICrossChainMessenger { + finalizeMessage(message: MessageLike, opts?: { + overrides?: Overrides; + }): Promise; ++ finalizeBatchMessage(messages: Array, opts?: { ++ overrides?: Overrides; ++ }): Promise; + approveERC20(l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: { + overrides?: Overrides; + }): Promise; +@@ -141,6 +150,9 @@ export interface ICrossChainMessenger { + finalizeMessage(message: MessageLike, opts?: { + overrides?: Overrides; + }): Promise; ++ finalizeBatchMessage(messages: Array, opts?: { ++ overrides?: Overrides; ++ }): Promise; + approveERC20(l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: { + overrides?: Overrides; + }): Promise; +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/index.js b/node_modules/@eth-optimism/sdk/dist/interfaces/index.js +index c72eff4..73bb2c1 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/index.js ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/index.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/index.js.map b/node_modules/@eth-optimism/sdk/dist/interfaces/index.js.map +index 49d2a70..0517494 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/index.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/index.js.map +@@ -1 +1 @@ +-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAgC;AAChC,0DAAuC;AACvC,gDAA6B;AAC7B,0CAAuB"} +\ No newline at end of file ++{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,0DAAuC;AACvC,gDAA6B;AAC7B,0CAAuB"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/l2-provider.d.ts b/node_modules/@eth-optimism/sdk/dist/interfaces/l2-provider.d.ts +index afd4157..26658bd 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/l2-provider.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/l2-provider.d.ts +@@ -13,7 +13,7 @@ export interface L2BlockWithTransactions extends BlockWithTransactions { + stateRoot: string; + transactions: [L2Transaction]; + } +-export declare type L2Provider = TProvider & { ++export type L2Provider = TProvider & { + getL1GasPrice(): Promise; + estimateL1Gas(tx: TransactionRequest): Promise; + estimateL1GasCost(tx: TransactionRequest): Promise; +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/types.d.ts b/node_modules/@eth-optimism/sdk/dist/interfaces/types.d.ts +index c56d93e..e368010 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/types.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/types.d.ts +@@ -6,10 +6,13 @@ import { IBridgeAdapter } from './bridge-adapter'; + export interface OEL1Contracts { + AddressManager: Contract; + L1CrossDomainMessenger: Contract; ++ L1CrossDomainMessengerFast: Contract; + L1StandardBridge: Contract; + StateCommitmentChain: Contract; + CanonicalTransactionChain: Contract; + BondManager: Contract; ++ L1MultiMessageRelayer: Contract; ++ L1MultiMessageRelayerFast: Contract; + } + export interface OEL2Contracts { + L2CrossDomainMessenger: Contract; +@@ -26,10 +29,10 @@ export interface OEContracts { + l1: OEL1Contracts; + l2: OEL2Contracts; + } +-export declare type OEL1ContractsLike = { ++export type OEL1ContractsLike = { + [K in keyof OEL1Contracts]: AddressLike; + }; +-export declare type OEL2ContractsLike = { ++export type OEL2ContractsLike = { + [K in keyof OEL2Contracts]: AddressLike; + }; + export interface OEContractsLike { +@@ -56,7 +59,8 @@ export declare enum MessageStatus { + STATE_ROOT_NOT_PUBLISHED = 2, + IN_CHALLENGE_PERIOD = 3, + READY_FOR_RELAY = 4, +- RELAYED = 5 ++ RELAYED = 5, ++ RELAYED_FAILED = 6 + } + export declare enum MessageDirection { + L1_TO_L2 = 0, +@@ -127,11 +131,11 @@ export interface CrossChainMessageProof { + stateTrieWitness: string; + storageTrieWitness: string; + } +-export declare type TransactionLike = string | TransactionReceipt | TransactionResponse; +-export declare type MessageLike = CrossChainMessage | TransactionLike | TokenBridgeMessage; +-export declare type MessageRequestLike = CrossChainMessageRequest | CrossChainMessage | TransactionLike | TokenBridgeMessage; +-export declare type ProviderLike = string | Provider; +-export declare type SignerLike = string | Signer; +-export declare type SignerOrProviderLike = SignerLike | ProviderLike; +-export declare type AddressLike = string | Contract; +-export declare type NumberLike = string | number | BigNumber; ++export type TransactionLike = string | TransactionReceipt | TransactionResponse; ++export type MessageLike = CrossChainMessage | TransactionLike | TokenBridgeMessage; ++export type MessageRequestLike = CrossChainMessageRequest | CrossChainMessage | TransactionLike | TokenBridgeMessage; ++export type ProviderLike = string | Provider; ++export type SignerLike = string | Signer; ++export type SignerOrProviderLike = SignerLike | ProviderLike; ++export type AddressLike = string | Contract; ++export type NumberLike = string | number | BigNumber; +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/types.js b/node_modules/@eth-optimism/sdk/dist/interfaces/types.js +index c191eda..0cac969 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/types.js ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/types.js +@@ -9,6 +9,7 @@ var MessageStatus; + MessageStatus[MessageStatus["IN_CHALLENGE_PERIOD"] = 3] = "IN_CHALLENGE_PERIOD"; + MessageStatus[MessageStatus["READY_FOR_RELAY"] = 4] = "READY_FOR_RELAY"; + MessageStatus[MessageStatus["RELAYED"] = 5] = "RELAYED"; ++ MessageStatus[MessageStatus["RELAYED_FAILED"] = 6] = "RELAYED_FAILED"; + })(MessageStatus = exports.MessageStatus || (exports.MessageStatus = {})); + var MessageDirection; + (function (MessageDirection) { +diff --git a/node_modules/@eth-optimism/sdk/dist/interfaces/types.js.map b/node_modules/@eth-optimism/sdk/dist/interfaces/types.js.map +index 46de538..a2d5cae 100644 +--- a/node_modules/@eth-optimism/sdk/dist/interfaces/types.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/interfaces/types.js.map +@@ -1 +1 @@ +-{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":";;;AAiGA,IAAY,aAgCX;AAhCD,WAAY,aAAa;IAIvB,iGAA4B,CAAA;IAO5B,uFAAuB,CAAA;IAKvB,yFAAwB,CAAA;IAKxB,+EAAmB,CAAA;IAKnB,uEAAe,CAAA;IAKf,uDAAO,CAAA;AACT,CAAC,EAhCW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAgCxB;AAKD,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,+DAAQ,CAAA;IACR,+DAAQ,CAAA;AACV,CAAC,EAHW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAG3B;AAqDD,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,mFAAc,CAAA;IACd,yFAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAG/B"} +\ No newline at end of file ++{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":";;;AAoGA,IAAY,aAqCX;AArCD,WAAY,aAAa;IAIvB,iGAA4B,CAAA;IAO5B,uFAAuB,CAAA;IAKvB,yFAAwB,CAAA;IAKxB,+EAAmB,CAAA;IAKnB,uEAAe,CAAA;IAKf,uDAAO,CAAA;IAKP,qEAAc,CAAA;AAChB,CAAC,EArCW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAqCxB;AAKD,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,+DAAQ,CAAA;IACR,+DAAQ,CAAA;AACV,CAAC,EAHW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAG3B;AAqDD,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,mFAAc,CAAA;IACd,yFAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAG/B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/l2-provider.js b/node_modules/@eth-optimism/sdk/dist/l2-provider.js +index 334fd5e..0bfbb78 100644 +--- a/node_modules/@eth-optimism/sdk/dist/l2-provider.js ++++ b/node_modules/@eth-optimism/sdk/dist/l2-provider.js +@@ -10,7 +10,7 @@ const contracts_1 = require("@eth-optimism/contracts"); + const cloneDeep_1 = __importDefault(require("lodash/cloneDeep")); + const utils_1 = require("./utils"); + const connectGasPriceOracle = (provider) => { +- return new ethers_1.Contract(contracts_1.predeploys.OVM_GasPriceOracle, contracts_1.getContractInterface('OVM_GasPriceOracle'), utils_1.toProvider(provider)); ++ return new ethers_1.Contract(contracts_1.predeploys.OVM_GasPriceOracle, (0, contracts_1.getContractInterface)('OVM_GasPriceOracle'), (0, utils_1.toProvider)(provider)); + }; + const getL1GasPrice = async (l2Provider) => { + const gpo = connectGasPriceOracle(l2Provider); +@@ -19,43 +19,43 @@ const getL1GasPrice = async (l2Provider) => { + exports.getL1GasPrice = getL1GasPrice; + const estimateL1Gas = async (l2Provider, tx) => { + const gpo = connectGasPriceOracle(l2Provider); +- return gpo.getL1GasUsed(transactions_1.serialize({ ++ return gpo.getL1GasUsed((0, transactions_1.serialize)({ + data: tx.data, + to: tx.to, + gasPrice: tx.gasPrice, + type: tx.type, + gasLimit: tx.gasLimit, +- nonce: utils_1.toNumber(tx.nonce), ++ nonce: (0, utils_1.toNumber)(tx.nonce), + })); + }; + exports.estimateL1Gas = estimateL1Gas; + const estimateL1GasCost = async (l2Provider, tx) => { + const gpo = connectGasPriceOracle(l2Provider); +- return gpo.getL1Fee(transactions_1.serialize({ ++ return gpo.getL1Fee((0, transactions_1.serialize)({ + data: tx.data, + to: tx.to, + gasPrice: tx.gasPrice, + type: tx.type, + gasLimit: tx.gasLimit, +- nonce: utils_1.toNumber(tx.nonce), ++ nonce: (0, utils_1.toNumber)(tx.nonce), + })); + }; + exports.estimateL1GasCost = estimateL1GasCost; + const estimateL2GasCost = async (l2Provider, tx) => { +- const parsed = utils_1.toProvider(l2Provider); ++ const parsed = (0, utils_1.toProvider)(l2Provider); + const l2GasPrice = await parsed.getGasPrice(); + const l2GasCost = await parsed.estimateGas(tx); + return l2GasPrice.mul(l2GasCost); + }; + exports.estimateL2GasCost = estimateL2GasCost; + const estimateTotalGasCost = async (l2Provider, tx) => { +- const l1GasCost = await exports.estimateL1GasCost(l2Provider, tx); +- const l2GasCost = await exports.estimateL2GasCost(l2Provider, tx); ++ const l1GasCost = await (0, exports.estimateL1GasCost)(l2Provider, tx); ++ const l2GasCost = await (0, exports.estimateL2GasCost)(l2Provider, tx); + return l1GasCost.add(l2GasCost); + }; + exports.estimateTotalGasCost = estimateTotalGasCost; + const asL2Provider = (provider) => { +- const l2Provider = cloneDeep_1.default(provider); ++ const l2Provider = (0, cloneDeep_1.default)(provider); + if (l2Provider._isL2Provider) { + return l2Provider; + } +@@ -76,10 +76,10 @@ const asL2Provider = (provider) => { + parsed.transactions = parsed.transactions.map((tx, idx) => { + const ogTx = block.transactions[idx]; + tx.l1BlockNumber = ogTx.l1BlockNumber +- ? utils_1.toNumber(ogTx.l1BlockNumber) ++ ? (0, utils_1.toNumber)(ogTx.l1BlockNumber) + : ogTx.l1BlockNumber; + tx.l1Timestamp = ogTx.l1Timestamp +- ? utils_1.toNumber(ogTx.l1Timestamp) ++ ? (0, utils_1.toNumber)(ogTx.l1Timestamp) + : ogTx.l1Timestamp; + tx.l1TxOrigin = ogTx.l1TxOrigin; + tx.queueOrigin = ogTx.queueOrigin; +@@ -103,26 +103,26 @@ const asL2Provider = (provider) => { + const ogReceiptFormatter = formatter.receipt.bind(formatter); + formatter.receipt = (receipt) => { + const parsed = ogReceiptFormatter(receipt); +- parsed.l1GasPrice = utils_1.toBigNumber(receipt.l1GasPrice); +- parsed.l1GasUsed = utils_1.toBigNumber(receipt.l1GasUsed); +- parsed.l1Fee = utils_1.toBigNumber(receipt.l1Fee); ++ parsed.l1GasPrice = (0, utils_1.toBigNumber)(receipt.l1GasPrice); ++ parsed.l1GasUsed = (0, utils_1.toBigNumber)(receipt.l1GasUsed); ++ parsed.l1Fee = (0, utils_1.toBigNumber)(receipt.l1Fee); + parsed.l1FeeScalar = parseFloat(receipt.l1FeeScalar); + return parsed; + }; + l2Provider.getL1GasPrice = async () => { +- return exports.getL1GasPrice(l2Provider); ++ return (0, exports.getL1GasPrice)(l2Provider); + }; + l2Provider.estimateL1Gas = async (tx) => { +- return exports.estimateL1Gas(l2Provider, tx); ++ return (0, exports.estimateL1Gas)(l2Provider, tx); + }; + l2Provider.estimateL1GasCost = async (tx) => { +- return exports.estimateL1GasCost(l2Provider, tx); ++ return (0, exports.estimateL1GasCost)(l2Provider, tx); + }; + l2Provider.estimateL2GasCost = async (tx) => { +- return exports.estimateL2GasCost(l2Provider, tx); ++ return (0, exports.estimateL2GasCost)(l2Provider, tx); + }; + l2Provider.estimateTotalGasCost = async (tx) => { +- return exports.estimateTotalGasCost(l2Provider, tx); ++ return (0, exports.estimateTotalGasCost)(l2Provider, tx); + }; + l2Provider._isL2Provider = true; + return l2Provider; +diff --git a/node_modules/@eth-optimism/sdk/dist/l2-provider.js.map b/node_modules/@eth-optimism/sdk/dist/l2-provider.js.map +index aa0a34f..6dc5763 100644 +--- a/node_modules/@eth-optimism/sdk/dist/l2-provider.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/l2-provider.js.map +@@ -1 +1 @@ +-{"version":3,"file":"l2-provider.js","sourceRoot":"","sources":["../src/l2-provider.ts"],"names":[],"mappings":";;;;;;AACA,8DAAuD;AACvD,mCAA4C;AAC5C,uDAA0E;AAC1E,iEAAwC;AAGxC,mCAA2D;AAQ3D,MAAM,qBAAqB,GAAG,CAAC,QAAsB,EAAY,EAAE;IACjE,OAAO,IAAI,iBAAQ,CACjB,sBAAU,CAAC,kBAAkB,EAC7B,gCAAoB,CAAC,oBAAoB,CAAC,EAC1C,kBAAU,CAAC,QAAQ,CAAC,CACrB,CAAA;AACH,CAAC,CAAA;AAQM,MAAM,aAAa,GAAG,KAAK,EAChC,UAAwB,EACJ,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,SAAS,EAAE,CAAA;AACxB,CAAC,CAAA;AALY,QAAA,aAAa,iBAKzB;AASM,MAAM,aAAa,GAAG,KAAK,EAChC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,YAAY,CACrB,wBAAS,CAAC;QACR,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,KAAK,EAAE,gBAAQ,CAAC,EAAE,CAAC,KAAmB,CAAC;KACxC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,aAAa,iBAezB;AASM,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,QAAQ,CACjB,wBAAS,CAAC;QACR,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,KAAK,EAAE,gBAAQ,CAAC,EAAE,CAAC,KAAmB,CAAC;KACxC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,iBAAiB,qBAe7B;AASM,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,MAAM,GAAG,kBAAU,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;IAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9C,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AAClC,CAAC,CAAA;AARY,QAAA,iBAAiB,qBAQ7B;AASM,MAAM,oBAAoB,GAAG,KAAK,EACvC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,SAAS,GAAG,MAAM,yBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,MAAM,yBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC,CAAA;AAPY,QAAA,oBAAoB,wBAOhC;AAUM,MAAM,YAAY,GAAG,CAC1B,QAAmB,EACI,EAAE;IAGzB,MAAM,UAAU,GAAG,mBAAS,CAAC,QAAQ,CAAQ,CAAA;IAG7C,IAAI,UAAU,CAAC,aAAa,EAAE;QAC5B,OAAO,UAAU,CAAA;KAClB;IAKD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAA;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;KACtD;IAKD,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxD,SAAS,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QAClC,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,sBAAsB,GAAG,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9E,SAAS,CAAC,qBAAqB,GAAG,CAAC,KAAU,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QAClC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,GAAW,EAAE,EAAE;YACrE,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACpC,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;gBACnC,CAAC,CAAC,gBAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;YACtB,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;gBAC/B,CAAC,CAAC,gBAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;YACpB,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;YAC/B,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;YACjC,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;YACvC,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,qBAAqB,GAAG,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3E,SAAS,CAAC,mBAAmB,GAAG,CAAC,EAAO,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAA;QACzB,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAA;QACnC,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC,cAAc,CAAA;QACzC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAA;QACjC,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,aAAa;YACrC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YAChC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5D,SAAS,CAAC,OAAO,GAAG,CAAC,OAAY,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,CAAC,UAAU,GAAG,mBAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnD,MAAM,CAAC,SAAS,GAAG,mBAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,GAAG,mBAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACpD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,UAAU,CAAC,aAAa,GAAG,KAAK,IAAI,EAAE;QACpC,OAAO,qBAAa,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC,CAAA;IACD,UAAU,CAAC,aAAa,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC1D,OAAO,qBAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC,CAAA;IACD,UAAU,CAAC,iBAAiB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC9D,OAAO,yBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAA;IACD,UAAU,CAAC,iBAAiB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC9D,OAAO,yBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAA;IACD,UAAU,CAAC,oBAAoB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QACjE,OAAO,4BAAoB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;IAED,UAAU,CAAC,aAAa,GAAG,IAAI,CAAA;IAE/B,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAhGY,QAAA,YAAY,gBAgGxB"} +\ No newline at end of file ++{"version":3,"file":"l2-provider.js","sourceRoot":"","sources":["../src/l2-provider.ts"],"names":[],"mappings":";;;;;;AACA,8DAAuD;AACvD,mCAA4C;AAC5C,uDAA0E;AAC1E,iEAAwC;AAGxC,mCAA2D;AAQ3D,MAAM,qBAAqB,GAAG,CAAC,QAAsB,EAAY,EAAE;IACjE,OAAO,IAAI,iBAAQ,CACjB,sBAAU,CAAC,kBAAkB,EAC7B,IAAA,gCAAoB,EAAC,oBAAoB,CAAC,EAC1C,IAAA,kBAAU,EAAC,QAAQ,CAAC,CACrB,CAAA;AACH,CAAC,CAAA;AAQM,MAAM,aAAa,GAAG,KAAK,EAChC,UAAwB,EACJ,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,SAAS,EAAE,CAAA;AACxB,CAAC,CAAA;AALY,QAAA,aAAa,iBAKzB;AASM,MAAM,aAAa,GAAG,KAAK,EAChC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,YAAY,CACrB,IAAA,wBAAS,EAAC;QACR,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,KAAK,EAAE,IAAA,gBAAQ,EAAC,EAAE,CAAC,KAAmB,CAAC;KACxC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,aAAa,iBAezB;AASM,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO,GAAG,CAAC,QAAQ,CACjB,IAAA,wBAAS,EAAC;QACR,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,KAAK,EAAE,IAAA,gBAAQ,EAAC,EAAE,CAAC,KAAmB,CAAC;KACxC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,iBAAiB,qBAe7B;AASM,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,UAAU,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;IAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9C,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AAClC,CAAC,CAAA;AARY,QAAA,iBAAiB,qBAQ7B;AASM,MAAM,oBAAoB,GAAG,KAAK,EACvC,UAAwB,EACxB,EAAsB,EACF,EAAE;IACtB,MAAM,SAAS,GAAG,MAAM,IAAA,yBAAiB,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,MAAM,IAAA,yBAAiB,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC,CAAA;AAPY,QAAA,oBAAoB,wBAOhC;AAUM,MAAM,YAAY,GAAG,CAC1B,QAAmB,EACI,EAAE;IAGzB,MAAM,UAAU,GAAG,IAAA,mBAAS,EAAC,QAAQ,CAAQ,CAAA;IAG7C,IAAI,UAAU,CAAC,aAAa,EAAE;QAC5B,OAAO,UAAU,CAAA;KAClB;IAKD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAA;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;KACtD;IAKD,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxD,SAAS,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QAClC,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,sBAAsB,GAAG,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9E,SAAS,CAAC,qBAAqB,GAAG,CAAC,KAAU,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QAClC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,GAAW,EAAE,EAAE;YACrE,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACpC,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;gBACnC,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,aAAa,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;YACtB,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;gBAC/B,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;YACpB,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;YAC/B,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;YACjC,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;YACvC,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,qBAAqB,GAAG,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3E,SAAS,CAAC,mBAAmB,GAAG,CAAC,EAAO,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAA;QACzB,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAA;QACnC,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC,cAAc,CAAA;QACzC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAA;QACjC,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,aAAa;YACrC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YAChC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5D,SAAS,CAAC,OAAO,GAAG,CAAC,OAAY,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,CAAC,UAAU,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnD,MAAM,CAAC,SAAS,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACpD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAGD,UAAU,CAAC,aAAa,GAAG,KAAK,IAAI,EAAE;QACpC,OAAO,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAA;IAClC,CAAC,CAAA;IACD,UAAU,CAAC,aAAa,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC1D,OAAO,IAAA,qBAAa,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC,CAAA;IACD,UAAU,CAAC,iBAAiB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC9D,OAAO,IAAA,yBAAiB,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAA;IACD,UAAU,CAAC,iBAAiB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC9D,OAAO,IAAA,yBAAiB,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAA;IACD,UAAU,CAAC,oBAAoB,GAAG,KAAK,EAAE,EAAsB,EAAE,EAAE;QACjE,OAAO,IAAA,4BAAoB,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;IAED,UAAU,CAAC,aAAa,GAAG,IAAI,CAAA;IAE/B,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAhGY,QAAA,YAAY,gBAgGxB"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.d.ts b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.d.ts +new file mode 100644 +index 0000000..e222b53 +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.d.ts +@@ -0,0 +1,4 @@ ++export declare const chainID: any; ++export declare const getChainIDList: (network: string, layer: string) => Array; ++export declare const isMoonbeamL1: (l1RpcProvider: string) => Promise; ++export declare const getLatestConfirmedBlock: (l1RpcProvider: string) => Promise; +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js +new file mode 100644 +index 0000000..c626994 +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js +@@ -0,0 +1,47 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.getLatestConfirmedBlock = exports.isMoonbeamL1 = exports.getChainIDList = exports.chainID = void 0; ++const ethers_1 = require("ethers"); ++exports.chainID = { ++ moonbeam: { ++ mainnet: { ++ l1: 1284, ++ l2: 1294, ++ }, ++ testnet: { ++ l1: 1287, ++ l2: 1297, ++ }, ++ }, ++}; ++const getChainIDList = (network, layer) => { ++ if (typeof exports.chainID[network] !== 'undefined') { ++ return Object.keys(exports.chainID[network]).reduce((acc, cur) => { ++ return [...acc, exports.chainID[network][cur][layer]]; ++ }, []); ++ } ++ return []; ++}; ++exports.getChainIDList = getChainIDList; ++const isMoonbeamL1 = async (l1RpcProvider) => { ++ const node = new ethers_1.providers.StaticJsonRpcProvider(l1RpcProvider); ++ const chainId = (await node.getNetwork()).chainId; ++ return (0, exports.getChainIDList)('moonbeam', 'l1').includes(chainId); ++}; ++exports.isMoonbeamL1 = isMoonbeamL1; ++const getLatestConfirmedBlock = async (l1RpcProvider) => { ++ const node = new ethers_1.providers.StaticJsonRpcProvider(l1RpcProvider); ++ const chainId = (await node.getNetwork()).chainId; ++ if ((0, exports.getChainIDList)('moonbeam', 'l1').includes(chainId)) { ++ const finalizedHeadHash = await node.send('chain_getFinalizedHead', []); ++ const finalizedBlockHeader = await node.send('chain_getHeader', [ ++ finalizedHeadHash, ++ ]); ++ return parseInt(finalizedBlockHeader.number, 16); ++ } ++ else { ++ return null; ++ } ++}; ++exports.getLatestConfirmedBlock = getLatestConfirmedBlock; ++//# sourceMappingURL=chain-specific.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js.map b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js.map +new file mode 100644 +index 0000000..ead39cf +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/chain-specific.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"chain-specific.js","sourceRoot":"","sources":["../../src/utils/chain-specific.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAErB,QAAA,OAAO,GAAQ;IAC1B,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,IAAI;SACT;QACD,OAAO,EAAE;YACP,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,IAAI;SACT;KACF;CACF,CAAA;AAEM,MAAM,cAAc,GAAG,CAC5B,OAAe,EACf,KAAa,EACE,EAAE;IACjB,IAAI,OAAO,eAAO,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE;QAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,eAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvD,OAAO,CAAC,GAAG,GAAG,EAAE,eAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/C,CAAC,EAAE,EAAE,CAAC,CAAA;KACP;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAVY,QAAA,cAAc,kBAU1B;AAEM,MAAM,YAAY,GAAG,KAAK,EAAE,aAAqB,EAAoB,EAAE;IAC5E,MAAM,IAAI,GAAG,IAAI,kBAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACjD,OAAO,IAAA,sBAAc,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC3D,CAAC,CAAA;AAJY,QAAA,YAAY,gBAIxB;AAGM,MAAM,uBAAuB,GAAG,KAAK,EAC1C,aAAqB,EACJ,EAAE;IACnB,MAAM,IAAI,GAAG,IAAI,kBAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACjD,IAAI,IAAA,sBAAc,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACtD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAA;QACvE,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC9D,iBAAiB;SAClB,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;KACjD;SAAM;QACL,OAAO,IAAI,CAAA;KACZ;AACH,CAAC,CAAA;AAdY,QAAA,uBAAuB,2BAcnC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/coercion.js b/node_modules/@eth-optimism/sdk/dist/utils/coercion.js +index cfb0b9f..d225720 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/coercion.js ++++ b/node_modules/@eth-optimism/sdk/dist/utils/coercion.js +@@ -37,7 +37,7 @@ const toProvider = (provider) => { + exports.toProvider = toProvider; + const toTransactionHash = (transaction) => { + if (typeof transaction === 'string') { +- assert_1.default(ethers_1.ethers.utils.isHexString(transaction, 32), 'Invalid transaction hash'); ++ (0, assert_1.default)(ethers_1.ethers.utils.isHexString(transaction, 32), 'Invalid transaction hash'); + return transaction; + } + else if (transaction.transactionHash) { +@@ -56,16 +56,16 @@ const toBigNumber = (num) => { + }; + exports.toBigNumber = toBigNumber; + const toNumber = (num) => { +- return exports.toBigNumber(num).toNumber(); ++ return (0, exports.toBigNumber)(num).toNumber(); + }; + exports.toNumber = toNumber; + const toAddress = (addr) => { + if (typeof addr === 'string') { +- assert_1.default(ethers_1.ethers.utils.isAddress(addr), 'Invalid address'); ++ (0, assert_1.default)(ethers_1.ethers.utils.isAddress(addr), 'Invalid address'); + return ethers_1.ethers.utils.getAddress(addr); + } + else { +- assert_1.default(ethers_1.ethers.utils.isAddress(addr.address), 'Invalid address'); ++ (0, assert_1.default)(ethers_1.ethers.utils.isAddress(addr.address), 'Invalid address'); + return ethers_1.ethers.utils.getAddress(addr.address); + } + }; +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/coercion.js.map b/node_modules/@eth-optimism/sdk/dist/utils/coercion.js.map +index 232e922..1a9e633 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/coercion.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/utils/coercion.js.map +@@ -1 +1 @@ +-{"version":3,"file":"coercion.js","sourceRoot":"","sources":["../../src/utils/coercion.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,wEAIyC;AACzC,oEAAuD;AACvD,mCAA0C;AAiBnC,MAAM,kBAAkB,GAAG,CAChC,gBAAsC,EACnB,EAAE;IACrB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;QACxC,OAAO,IAAI,eAAM,CAAC,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;KAC9D;SAAM,IAAI,4BAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QAChD,OAAO,gBAA4B,CAAA;KACpC;SAAM,IAAI,wBAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QAC5C,OAAO,gBAA0B,CAAA;KAClC;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;AACH,CAAC,CAAA;AAZY,QAAA,kBAAkB,sBAY9B;AASM,MAAM,UAAU,GAAG,CAAC,QAAsB,EAAY,EAAE;IAC7D,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QAChC,OAAO,IAAI,eAAM,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;KACtD;SAAM,IAAI,4BAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxC,OAAO,QAAoB,CAAA;KAC5B;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;AACH,CAAC,CAAA;AARY,QAAA,UAAU,cAQtB;AAQM,MAAM,iBAAiB,GAAG,CAAC,WAA4B,EAAU,EAAE;IACxE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,gBAAM,CACJ,eAAM,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,EACzC,0BAA0B,CAC3B,CAAA;QAED,OAAO,WAAW,CAAA;KACnB;SAAM,IAAK,WAAkC,CAAC,eAAe,EAAE;QAC9D,OAAQ,WAAkC,CAAC,eAAe,CAAA;KAC3D;SAAM,IAAK,WAAmC,CAAC,IAAI,EAAE;QACpD,OAAQ,WAAmC,CAAC,IAAI,CAAA;KACjD;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACvC;AACH,CAAC,CAAA;AAfY,QAAA,iBAAiB,qBAe7B;AAQM,MAAM,WAAW,GAAG,CAAC,GAAe,EAAa,EAAE;IACxD,OAAO,eAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB;AAQM,MAAM,QAAQ,GAAG,CAAC,GAAe,EAAU,EAAE;IAClD,OAAO,mBAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;AACpC,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAQM,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAU,EAAE;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,gBAAM,CAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAA;QACvD,OAAO,eAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;KACrC;SAAM;QACL,gBAAM,CAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAA;QAC/D,OAAO,eAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KAC7C;AACH,CAAC,CAAA;AARY,QAAA,SAAS,aAQrB"} +\ No newline at end of file ++{"version":3,"file":"coercion.js","sourceRoot":"","sources":["../../src/utils/coercion.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,wEAIyC;AACzC,oEAAuD;AACvD,mCAA0C;AAiBnC,MAAM,kBAAkB,GAAG,CAChC,gBAAsC,EACnB,EAAE;IACrB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;QACxC,OAAO,IAAI,eAAM,CAAC,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;KAC9D;SAAM,IAAI,4BAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QAChD,OAAO,gBAA4B,CAAA;KACpC;SAAM,IAAI,wBAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QAC5C,OAAO,gBAA0B,CAAA;KAClC;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;AACH,CAAC,CAAA;AAZY,QAAA,kBAAkB,sBAY9B;AASM,MAAM,UAAU,GAAG,CAAC,QAAsB,EAAY,EAAE;IAC7D,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QAChC,OAAO,IAAI,eAAM,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;KACtD;SAAM,IAAI,4BAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxC,OAAO,QAAoB,CAAA;KAC5B;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;AACH,CAAC,CAAA;AARY,QAAA,UAAU,cAQtB;AAQM,MAAM,iBAAiB,GAAG,CAAC,WAA4B,EAAU,EAAE;IACxE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,IAAA,gBAAM,EACJ,eAAM,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,EACzC,0BAA0B,CAC3B,CAAA;QAED,OAAO,WAAW,CAAA;KACnB;SAAM,IAAK,WAAkC,CAAC,eAAe,EAAE;QAC9D,OAAQ,WAAkC,CAAC,eAAe,CAAA;KAC3D;SAAM,IAAK,WAAmC,CAAC,IAAI,EAAE;QACpD,OAAQ,WAAmC,CAAC,IAAI,CAAA;KACjD;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACvC;AACH,CAAC,CAAA;AAfY,QAAA,iBAAiB,qBAe7B;AAQM,MAAM,WAAW,GAAG,CAAC,GAAe,EAAa,EAAE;IACxD,OAAO,eAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB;AAQM,MAAM,QAAQ,GAAG,CAAC,GAAe,EAAU,EAAE;IAClD,OAAO,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;AACpC,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAQM,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAU,EAAE;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAA,gBAAM,EAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAA;QACvD,OAAO,eAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;KACrC;SAAM;QACL,IAAA,gBAAM,EAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAA;QAC/D,OAAO,eAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KAC7C;AACH,CAAC,CAAA;AARY,QAAA,SAAS,aAQrB"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/contracts.js b/node_modules/@eth-optimism/sdk/dist/utils/contracts.js +index ebb4ec2..c40a8a1 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/contracts.js ++++ b/node_modules/@eth-optimism/sdk/dist/utils/contracts.js +@@ -24,12 +24,43 @@ const NAME_REMAPPING = { + exports.CONTRACT_ADDRESSES = { + 1: { + l1: { +- AddressManager: '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', +- L1CrossDomainMessenger: '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', +- L1StandardBridge: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', +- StateCommitmentChain: '0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19', +- CanonicalTransactionChain: '0x5E4e65926BA27467555EB562121fac00D24E9dD2', +- BondManager: '0xcd626E1328b41fCF24737F137BcD4CE0c32bc8d1', ++ AddressManager: '0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089', ++ L1CrossDomainMessenger: '0x6D4528d192dB72E282265D6092F4B872f9Dff69e', ++ L1CrossDomainMessengerFast: '0xD05b8fD53614e1569cAC01c6D8d41416d0a7257E', ++ L1StandardBridge: '0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00', ++ StateCommitmentChain: '0xdE7355C971A5B733fe2133753Abd7e5441d441Ec', ++ CanonicalTransactionChain: '0xfBd2541e316948B259264c02f370eD088E04c3Db', ++ BondManager: '0x60660e6CDEb423cf847dD11De4C473130D65b627', ++ L1MultiMessageRelayer: '0x5fD2CF99586B9D92f56CbaD0A3Ea4DF256A0070B', ++ L1MultiMessageRelayerFast: '0x2d6134Ac3e480fBDD263B7163d333dCA285f9622', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 4: { ++ l1: { ++ AddressManager: '0x93A96D6A5beb1F661cf052722A1424CDDA3e9418', ++ L1CrossDomainMessenger: '0xF10EEfC14eB5b7885Ea9F7A631a21c7a82cf5D76', ++ L1CrossDomainMessengerFast: '0xe2a82CE9671A283190DD5E3f077027979F2c039E', ++ L1StandardBridge: '0xDe085C82536A06b40D20654c2AbA342F2abD7077', ++ StateCommitmentChain: '0x39e52546e091A28831414949B1601449be03b307', ++ CanonicalTransactionChain: '0x321Bf0Df8F02FE665a7f7CcE31684A6dadB014b0', ++ BondManager: '0xAF41D3399A91C43E8f2d70d9b47741b10CFA4Fc4', ++ L1MultiMessageRelayer: '0x5C6263BCAa00C7f5988E148dB3CA178e1262E69f', ++ L1MultiMessageRelayerFast: '0x94BC5F5330B9EF9f520551cDB6bD8FC707760Af6', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 5: { ++ l1: { ++ AddressManager: '0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148', ++ L1CrossDomainMessenger: '0xA6fA0867F39f3A3af7433C8A43f23bf26Efd1a48', ++ L1CrossDomainMessengerFast: '0x8b5A2d6aE932e8224B15c2C87dc8A972301c1B5d', ++ L1StandardBridge: '0xDBD71249Fe60c9f9bF581b3594734E295EAfA9b2', ++ StateCommitmentChain: '0x7Bb4cfa36F9F3880e18a46B74bBb9B334F6600F3', ++ CanonicalTransactionChain: '0x8B0eF5250b5d6EfA877eAc15BBdfbD3C8069242F', ++ BondManager: '0xF84979ADeb8D2Dd25f54cF8cBbB05C08eC188e11', ++ L1MultiMessageRelayer: '0xebE42F5cEA2184F6b416bFFAB0744b11281AE95b', ++ L1MultiMessageRelayerFast: '0xf3b489cCC93A9B74F17113E323E4Db2b1FdE2Cb8', + }, + l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, + }, +@@ -37,32 +68,195 @@ exports.CONTRACT_ADDRESSES = { + l1: { + AddressManager: '0x100Dd3b414Df5BbA2B542864fF94aF8024aFdf3a', + L1CrossDomainMessenger: '0x4361d0F75A0186C05f971c566dC6bEa5957483fD', ++ L1CrossDomainMessengerFast: '0x0000000000000000000000000000000000000000', + L1StandardBridge: '0x22F24361D548e5FaAfb36d1437839f080363982B', + StateCommitmentChain: '0xD7754711773489F31A0602635f3F167826ce53C5', + CanonicalTransactionChain: '0xf7B88A133202d41Fe5E2Ab22e6309a1A4D50AF74', + BondManager: '0xc5a603d273E28185c18Ba4d26A0024B2d2F42740', ++ L1MultiMessageRelayer: '0x0000000000000000000000000000000000000000', ++ L1MultiMessageRelayerFast: '0x0000000000000000000000000000000000000000', + }, + l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, + }, +- 5: { ++ 31337: { ++ l1: { ++ AddressManager: '0x5FbDB2315678afecb367f032d93F642f64180aa3', ++ L1CrossDomainMessenger: '0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f', ++ L1CrossDomainMessengerFast: '0x4EE6eCAD1c2Dae9f525404De8555724e3c35d07B', ++ L1StandardBridge: '0x09635F643e140090A9A8Dcd712eD6285858ceBef', ++ StateCommitmentChain: '0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE', ++ CanonicalTransactionChain: '0x0B306BF915C4d645ff596e518fAf3F9669b97016', ++ BondManager: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c', ++ L1MultiMessageRelayer: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042', ++ L1MultiMessageRelayerFast: '0xeF31027350Be2c7439C1b0BE022d49421488b72C', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 1281: { + l1: { +- AddressManager: '0x2F7E3cAC91b5148d336BbffB224B4dC79F09f01D', +- L1CrossDomainMessenger: '0xEcC89b9EDD804850C4F343A278Be902be11AaF42', +- L1StandardBridge: '0x73298186A143a54c20ae98EEE5a025bD5979De02', +- StateCommitmentChain: '0x1afcA918eff169eE20fF8AB6Be75f3E872eE1C1A', +- CanonicalTransactionChain: '0x2ebA8c4EfDB39A8Cd8f9eD65c50ec079f7CEBD81', +- BondManager: '0xE5AE60bD6F8DEe4D0c2BC9268e23B92F1cacC58F', ++ AddressManager: '0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3', ++ L1CrossDomainMessenger: '0xab7785d56697E65c2683c8121Aac93D3A028Ba95', ++ L1CrossDomainMessengerFast: '0xB942FA2273C7Bce69833e891BDdFd7212d2dA415', ++ L1StandardBridge: '0x78D714e1b47Bb86FE15788B917C9CC7B77975529', ++ StateCommitmentChain: '0x294c664f6D63bd1521231a2EeFC26d805ce00a08', ++ CanonicalTransactionChain: '0x598efcBD0B5b4Fd0142bEAae1a38f6Bd4d8a218d', ++ BondManager: '0xEC69d4f48f4f1740976968FAb9828d645Ad1d77f', ++ L1MultiMessageRelayer: '0xad856F238CBeafd064b80D12EadAea3981fB21B5', ++ L1MultiMessageRelayerFast: '0xAdD0E4aD78B01048027154c7a432a1cB6711178f', + }, + l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, + }, +- 31337: { ++ 1287: { + l1: { +- AddressManager: '0x5FbDB2315678afecb367f032d93F642f64180aa3', +- L1CrossDomainMessenger: '0x8A791620dd6260079BF849Dc5567aDC3F2FdC318', +- L1StandardBridge: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788', +- StateCommitmentChain: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9', +- CanonicalTransactionChain: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', +- BondManager: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707', ++ AddressManager: '0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B', ++ L1CrossDomainMessenger: '0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877', ++ L1CrossDomainMessengerFast: '0xAE8885D3b7937af9480cd7301925a88Dfb0cE9f6', ++ L1StandardBridge: '0xEcca5FEd8154420403549f5d8F123fcE69fae806', ++ StateCommitmentChain: '0x5E41Eaac5319CDf336c51969E2F164A686138B28', ++ CanonicalTransactionChain: '0xa8bD51a7F46321587921A33fa3c752b426c74754', ++ BondManager: '0x6c55306656E8b74F93653A753DE539c2F6ca18Db', ++ L1MultiMessageRelayer: '0x4c1bcfe4F0b1a57d3c578a8ED3dBEBCa29339c85', ++ L1MultiMessageRelayerFast: '0x874a7Ea9722b96924e186f0263866FA90a7C777b', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 1284: { ++ l1: { ++ AddressManager: '0x564c10A60af35a07f0EA8Be3106a4D81014b21a0', ++ L1CrossDomainMessenger: '0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF', ++ L1CrossDomainMessengerFast: '0x17d02C3e6cB69225d83d0bADEb0fC09aE735CA3b', ++ L1StandardBridge: '0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985', ++ StateCommitmentChain: '0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8', ++ CanonicalTransactionChain: '0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95', ++ BondManager: '0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5', ++ L1MultiMessageRelayer: '0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1', ++ L1MultiMessageRelayerFast: '0xE2EE964E39720f78Cd75BC146Ed078D301981759', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 4003: { ++ l1: { ++ AddressManager: '0xf536cAF1a894E09945E649FCE3032E8E03ECb9A0', ++ L1CrossDomainMessenger: '0x03466593AE8Bc085F384bC4EB91d5035F5a7936C', ++ L1CrossDomainMessengerFast: '0xC93DD6833E6A29004FcC84C757cCf0d5551aBFe1', ++ L1StandardBridge: '0xAEa06C2B29edfac53a0538A9843D018348845Ebf', ++ StateCommitmentChain: '0xC98Dd1b152d9e4cf2A6384a78d4FFE8D50E86C6c', ++ CanonicalTransactionChain: '0xFfB9dF984DC95ab53c561d818b708135612b087f', ++ BondManager: '0xE9BC1f638d05edF64Bf3e23A08ff3e2B0fb8b7F7', ++ L1MultiMessageRelayer: '0x9257aE2144eF338Da70D6884c98BD8CB90Da639E', ++ L1MultiMessageRelayerFast: '0xB6D431Bb85298030eA27a0E3769bEa5ed1F9fF53', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 4002: { ++ l1: { ++ AddressManager: '0x12ad9f501149D3FDd703cC10c567F416B7F0af8b', ++ L1CrossDomainMessenger: '0xEecAD665ca933eeA4a9a2db600E538c1391930d1', ++ L1CrossDomainMessengerFast: '0xE5781E5E9CbC67E91DF93eD01E922De30125e491', ++ L1StandardBridge: '0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f', ++ StateCommitmentChain: '0x352d964E9aD016f122dc78Afa5164417907E0FaF', ++ CanonicalTransactionChain: '0xE66Bd40BBeC97397758E22858331752f0ecBE02e', ++ BondManager: '0xa97a909D967B150E27AB58ca6d0cb40B39200Be1', ++ L1MultiMessageRelayer: '0xD7Cbc979C909d864c38670AcccD57209F7B556e3', ++ L1MultiMessageRelayerFast: '0x9Af237336C29dCbA346764af8e8E1F0ba83D1eE5', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 250: { ++ l1: { ++ AddressManager: '0x4e7325bcf09e091Bb8119258B885D4ef687B7386', ++ L1CrossDomainMessenger: '0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9', ++ L1CrossDomainMessengerFast: '0xC0597ED18446254E4dd0CA5D80eb07D3f2E462cF', ++ L1StandardBridge: '0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8', ++ StateCommitmentChain: '0xF764C4f8D2982432239A110Cf6B08e95631cE564', ++ CanonicalTransactionChain: '0x6001C473E020D3562Ea436B61aE4d2e91e7078cE', ++ BondManager: '0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1', ++ L1MultiMessageRelayer: '0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f', ++ L1MultiMessageRelayerFast: '0xE7beDcedF3E3054aF891DddeF61775A23a16CB90', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 43112: { ++ l1: { ++ AddressManager: '0x52C84043CD9c865236f11d9Fc9F56aa003c1f922', ++ L1CrossDomainMessenger: '0xDFBb4b49DfAe39720f68f8297ADb2368FeffaDdb', ++ L1CrossDomainMessengerFast: '0xD054149e4345Cc00cc2f2465C02a864f60d6bd46', ++ L1StandardBridge: '0x4475A8FBeF5Cf4a92a484B6f5602A91F3abC72D8', ++ StateCommitmentChain: '0xF5f1f185cF359dC48469e410Aeb6983cD4DC5812', ++ CanonicalTransactionChain: '0xa1E47689f396fED7d18D797d9D31D727d2c0d483', ++ BondManager: '0x97C0FE6aB595cbFD50ad3860DA5B2017d8B35c2E', ++ L1MultiMessageRelayer: '0xEC1bf080BDFBbBa102603Cc1C55aFd215C694a2b', ++ L1MultiMessageRelayerFast: '0x1AA001Cd20F35F3F4EF1A945053CeE4Acc24aDb4', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 43113: { ++ l1: { ++ AddressManager: '0xcE78de95b85212BC348452e91e0e74c17cf37c79', ++ L1CrossDomainMessenger: '0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b', ++ L1CrossDomainMessengerFast: '0xBc5249095c890F58C0b75795bd21667eFd123F5F', ++ L1StandardBridge: '0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56', ++ StateCommitmentChain: '0x57B9C47F2Ae857005238096486C5B107447dE221', ++ CanonicalTransactionChain: '0xA36D21C0125b5Dc52d95ED8FF1eF7188d4666EAE', ++ BondManager: '0x067cD503bd734a779830dafF0Db582B6a347c3df', ++ L1MultiMessageRelayer: '0x74546A4c6D5543Be7e8447159c47BAe7f5431C49', ++ L1MultiMessageRelayerFast: '0x5e6B412b4fA8373a17aD85B269fA5c354ea57e63', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 43114: { ++ l1: { ++ AddressManager: '0x00220f8ce1c4be8436574e575fE38558d85e2E6b', ++ L1CrossDomainMessenger: '0x0fc742332ae6D447d6619D93985Aa288B81CBb0C', ++ L1CrossDomainMessengerFast: '0x5b6714b7926e6D7e34154C9AC945B489978fA7E7', ++ L1StandardBridge: '0xf188F1e92B2c78956D2859b84684BFD17103e22c', ++ StateCommitmentChain: '0x1ef85D873Cf451C8B9a45DbE40b478E991F51210', ++ CanonicalTransactionChain: '0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3', ++ BondManager: '0x26c319B7B2cF823365414d082698C8ac90cbBA63', ++ L1MultiMessageRelayer: '0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8', ++ L1MultiMessageRelayerFast: '0xf9821061774b9693359F582b007A5F1C39d75Ae3', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 99: { ++ l1: { ++ AddressManager: '0xC194E4CFa59D2DfC520217dA22E23DF8D4658a37', ++ L1CrossDomainMessenger: '0x8b8656D5d37C3DC620B80817972E0d9a5267761b', ++ L1CrossDomainMessengerFast: '0x07B43F437c3A13eeb17EF2beBea046e61502151f', ++ L1StandardBridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', ++ StateCommitmentChain: '0x57a243B34F9232515Fa9FD8D4c2daFd611cF1BCA', ++ CanonicalTransactionChain: '0x3717E342Bc746c01244fb40e47521945091238ce', ++ BondManager: '0xcF8dDe2accE564024B4b92ef7db81B0e6698F07f', ++ L1MultiMessageRelayer: '0x90f502229E1fAa70cCf900B2D14595a5C55B3bE8', ++ L1MultiMessageRelayerFast: '0x64160054BdD6e53915C221cBBfAAbaf1f80c7f20', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 97: { ++ l1: { ++ AddressManager: '0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa', ++ L1CrossDomainMessenger: '0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145', ++ L1CrossDomainMessengerFast: '0xbbD6a271abcC44f6dE284E6051Da76b4fB57458C', ++ L1StandardBridge: '0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a', ++ StateCommitmentChain: '0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE', ++ CanonicalTransactionChain: '0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6', ++ BondManager: '0x6737867ddd04272a79E7207a008f213e336b00e1', ++ L1MultiMessageRelayer: '0x5e593AeB2Dbd855D79167831f091B4d959FbB2D1', ++ L1MultiMessageRelayerFast: '0x0F01394F5fc19bA1B9F669bA79b76c9EaAe37987', ++ }, ++ l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, ++ }, ++ 56: { ++ l1: { ++ AddressManager: '0xeb989B25597259cfa51Bd396cE1d4B085EC4c753', ++ L1CrossDomainMessenger: '0x31338a7D5d123E18a9a71447136B54B6D28241ae', ++ L1CrossDomainMessengerFast: '0xBe349cABeA97bB933f8C2594634Deb858167f83c', ++ L1StandardBridge: '0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC', ++ StateCommitmentChain: '0xeF85fA550e6EC5486121313C895EDe1005e2397f', ++ CanonicalTransactionChain: '0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4', ++ BondManager: '0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd', ++ L1MultiMessageRelayer: '0x1E633Dcd0d3D349126983D58988051F7c62c543D', ++ L1MultiMessageRelayerFast: '0x2dB5717B37Af9A1D9a28829Ea977B4aE4aEE2AED', + }, + l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, + }, +@@ -90,6 +284,30 @@ exports.BRIDGE_ADAPTER_DATA = { + l2Bridge: '0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65', + }, + }, ++ 4: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: exports.CONTRACT_ADDRESSES[4].l1.L1StandardBridge, ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: exports.CONTRACT_ADDRESSES[4].l1.L1StandardBridge, ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 5: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: exports.CONTRACT_ADDRESSES[5].l1.L1StandardBridge, ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: exports.CONTRACT_ADDRESSES[5].l1.L1StandardBridge, ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, + 42: { + Standard: { + Adapter: adapters_1.StandardBridgeAdapter, +@@ -117,27 +335,159 @@ exports.BRIDGE_ADAPTER_DATA = { + l2Bridge: '0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65', + }, + }, +- 5: { ++ 31337: { + Standard: { + Adapter: adapters_1.StandardBridgeAdapter, +- l1Bridge: exports.CONTRACT_ADDRESSES[5].l1.L1StandardBridge, ++ l1Bridge: exports.CONTRACT_ADDRESSES[31337].l1.L1StandardBridge, + l2Bridge: contracts_1.predeploys.L2StandardBridge, + }, + ETH: { + Adapter: adapters_1.ETHBridgeAdapter, +- l1Bridge: exports.CONTRACT_ADDRESSES[5].l1.L1StandardBridge, ++ l1Bridge: exports.CONTRACT_ADDRESSES[31337].l1.L1StandardBridge, + l2Bridge: contracts_1.predeploys.L2StandardBridge, + }, + }, +- 31337: { ++ 1281: { + Standard: { + Adapter: adapters_1.StandardBridgeAdapter, +- l1Bridge: exports.CONTRACT_ADDRESSES[31337].l1.L1StandardBridge, ++ l1Bridge: '0x78D714e1b47Bb86FE15788B917C9CC7B77975529', + l2Bridge: contracts_1.predeploys.L2StandardBridge, + }, + ETH: { + Adapter: adapters_1.ETHBridgeAdapter, +- l1Bridge: exports.CONTRACT_ADDRESSES[31337].l1.L1StandardBridge, ++ l1Bridge: '0x78D714e1b47Bb86FE15788B917C9CC7B77975529', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 1287: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0xEcca5FEd8154420403549f5d8F123fcE69fae806', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0xEcca5FEd8154420403549f5d8F123fcE69fae806', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 4003: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0xAEa06C2B29edfac53a0538A9843D018348845Ebf', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0xAEa06C2B29edfac53a0538A9843D018348845Ebf', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 4002: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 43112: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x4475A8FBeF5Cf4a92a484B6f5602A91F3abC72D8', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x4475A8FBeF5Cf4a92a484B6f5602A91F3abC72D8', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 43113: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 43114: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0xf188F1e92B2c78956D2859b84684BFD17103e22c', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0xf188F1e92B2c78956D2859b84684BFD17103e22c', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 99: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 97: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 1284: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 56: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ }, ++ 250: { ++ Standard: { ++ Adapter: adapters_1.StandardBridgeAdapter, ++ l1Bridge: '0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8', ++ l2Bridge: contracts_1.predeploys.L2StandardBridge, ++ }, ++ ETH: { ++ Adapter: adapters_1.ETHBridgeAdapter, ++ l1Bridge: '0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8', + l2Bridge: contracts_1.predeploys.L2StandardBridge, + }, + }, +@@ -147,7 +497,7 @@ const getOEContract = (contractName, l1ChainId, opts = {}) => { + if (addresses === undefined && opts.address === undefined) { + throw new Error(`cannot get contract ${contractName} for unknown L1 chain ID ${l1ChainId}, you must provide an address`); + } +- return new ethers_1.Contract(coercion_1.toAddress(opts.address || addresses.l1[contractName] || addresses.l2[contractName]), contracts_1.getContractInterface(NAME_REMAPPING[contractName] || contractName), opts.signerOrProvider); ++ return new ethers_1.Contract((0, coercion_1.toAddress)(opts.address || addresses.l1[contractName] || addresses.l2[contractName]), (0, contracts_1.getContractInterface)(NAME_REMAPPING[contractName] || contractName), opts.signerOrProvider); + }; + exports.getOEContract = getOEContract; + const getAllOEContracts = (l1ChainId, opts = {}) => { +@@ -156,23 +506,26 @@ const getAllOEContracts = (l1ChainId, opts = {}) => { + l1: { + AddressManager: undefined, + L1CrossDomainMessenger: undefined, ++ L1CrossDomainMessengerFast: undefined, + L1StandardBridge: undefined, + StateCommitmentChain: undefined, + CanonicalTransactionChain: undefined, + BondManager: undefined, ++ L1MultiMessageRelayer: undefined, ++ L1MultiMessageRelayerFast: undefined, + }, + l2: exports.DEFAULT_L2_CONTRACT_ADDRESSES, + }; + const l1Contracts = {}; + for (const [contractName, contractAddress] of Object.entries(addresses.l1)) { +- l1Contracts[contractName] = exports.getOEContract(contractName, l1ChainId, { ++ l1Contracts[contractName] = (0, exports.getOEContract)(contractName, l1ChainId, { + address: ((_b = (_a = opts.overrides) === null || _a === void 0 ? void 0 : _a.l1) === null || _b === void 0 ? void 0 : _b[contractName]) || contractAddress, + signerOrProvider: opts.l1SignerOrProvider, + }); + } + const l2Contracts = {}; + for (const [contractName, contractAddress] of Object.entries(addresses.l2)) { +- l2Contracts[contractName] = exports.getOEContract(contractName, l1ChainId, { ++ l2Contracts[contractName] = (0, exports.getOEContract)(contractName, l1ChainId, { + address: ((_d = (_c = opts.overrides) === null || _c === void 0 ? void 0 : _c.l2) === null || _d === void 0 ? void 0 : _d[contractName]) || contractAddress, + signerOrProvider: opts.l2SignerOrProvider, + }); +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/contracts.js.map b/node_modules/@eth-optimism/sdk/dist/utils/contracts.js.map +index 43cbe23..63b4b35 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/contracts.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/utils/contracts.js.map +@@ -1 +1 @@ +-{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/utils/contracts.ts"],"names":[],"mappings":";;;AAAA,uDAA0E;AAC1E,mCAAyC;AAEzC,yCAAsC;AAatC,0CAIoB;AAKP,QAAA,6BAA6B,GAAsB;IAC9D,sBAAsB,EAAE,sBAAU,CAAC,sBAAsB;IACzD,gBAAgB,EAAE,sBAAU,CAAC,gBAAgB;IAC7C,iBAAiB,EAAE,sBAAU,CAAC,iBAAiB;IAC/C,uBAAuB,EAAE,sBAAU,CAAC,uBAAuB;IAC3D,qBAAqB,EAAE,sBAAU,CAAC,qBAAqB;IACvD,OAAO,EAAE,sBAAU,CAAC,OAAO;IAC3B,kBAAkB,EAAE,sBAAU,CAAC,kBAAkB;IACjD,qBAAqB,EAAE,sBAAU,CAAC,qBAAqB;IACvD,IAAI,EAAE,sBAAU,CAAC,KAAK;CACvB,CAAA;AAMD,MAAM,cAAc,GAAG;IACrB,cAAc,EAAE,oBAAoB;IACpC,iBAAiB,EAAE,oBAAoB;IACvC,IAAI,EAAE,OAAO;CACd,CAAA;AAOY,QAAA,kBAAkB,GAE3B;IAEF,CAAC,EAAE;QACD,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;SAC1D;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,EAAE,EAAE;QACF,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;SAC1D;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,CAAC,EAAE;QACD,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;SAC1D;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,KAAK,EAAE;QACL,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;SAC1D;QACD,EAAE,EAAE,qCAA6B;KAClC;CACF,CAAA;AAKY,QAAA,mBAAmB,GAE5B;IAGF,CAAC,EAAE;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;KACF;IACD,EAAE,EAAE;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACpD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACpD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;KACF;IACD,CAAC,EAAE;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACvD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACvD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;CACF,CAAA;AA+BM,MAAM,aAAa,GAAG,CAC3B,YAAuD,EACvD,SAAiB,EACjB,OAGI,EAAE,EACI,EAAE;IACZ,MAAM,SAAS,GAAG,0BAAkB,CAAC,SAAS,CAAC,CAAA;IAC/C,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;QACzD,MAAM,IAAI,KAAK,CACb,uBAAuB,YAAY,4BAA4B,SAAS,+BAA+B,CACxG,CAAA;KACF;IAED,OAAO,IAAI,iBAAQ,CACjB,oBAAS,CACP,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,CACzE,EACD,gCAAoB,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,EAClE,IAAI,CAAC,gBAAgB,CACtB,CAAA;AACH,CAAC,CAAA;AAtBY,QAAA,aAAa,iBAsBzB;AAgBM,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,OAII,EAAE,EACO,EAAE;;IACf,MAAM,SAAS,GAAG,0BAAkB,CAAC,SAAS,CAAC,IAAI;QACjD,EAAE,EAAE;YACF,cAAc,EAAE,SAAS;YACzB,sBAAsB,EAAE,SAAS;YACjC,gBAAgB,EAAE,SAAS;YAC3B,oBAAoB,EAAE,SAAS;YAC/B,yBAAyB,EAAE,SAAS;YACpC,WAAW,EAAE,SAAS;SACvB;QACD,EAAE,EAAE,qCAA6B;KAClC,CAAA;IAGD,MAAM,WAAW,GAAkB,EAAS,CAAA;IAC5C,KAAK,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE;QAC1E,WAAW,CAAC,YAAY,CAAC,GAAG,qBAAa,CAAC,YAAmB,EAAE,SAAS,EAAE;YACxE,OAAO,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,EAAE,0CAAG,YAAY,CAAC,KAAI,eAAe;YAC9D,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;SAC1C,CAAC,CAAA;KACH;IAGD,MAAM,WAAW,GAAkB,EAAS,CAAA;IAC5C,KAAK,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE;QAC1E,WAAW,CAAC,YAAY,CAAC,GAAG,qBAAa,CAAC,YAAmB,EAAE,SAAS,EAAE;YACxE,OAAO,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,EAAE,0CAAG,YAAY,CAAC,KAAI,eAAe;YAC9D,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;SAC1C,CAAC,CAAA;KACH;IAED,OAAO;QACL,EAAE,EAAE,WAAW;QACf,EAAE,EAAE,WAAW;KAChB,CAAA;AACH,CAAC,CAAA;AA1CY,QAAA,iBAAiB,qBA0C7B;AAWM,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,SAA+B,EAC/B,IAEC,EACe,EAAE;IAClB,MAAM,QAAQ,GAAmB,EAAE,CAAA;IACnC,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,iCAChD,CAAC,2BAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GACtC,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CAAC,EAC1B,EAAE;QACF,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC;YAC5C,SAAS;YACT,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC,CAAA;KACH;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AApBY,QAAA,iBAAiB,qBAoB7B"} +\ No newline at end of file ++{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/utils/contracts.ts"],"names":[],"mappings":";;;AAAA,uDAA0E;AAC1E,mCAAyC;AAEzC,yCAAsC;AAatC,0CAIoB;AAKP,QAAA,6BAA6B,GAAsB;IAC9D,sBAAsB,EAAE,sBAAU,CAAC,sBAAsB;IACzD,gBAAgB,EAAE,sBAAU,CAAC,gBAAgB;IAC7C,iBAAiB,EAAE,sBAAU,CAAC,iBAAiB;IAC/C,uBAAuB,EAAE,sBAAU,CAAC,uBAAuB;IAC3D,qBAAqB,EAAE,sBAAU,CAAC,qBAAqB;IACvD,OAAO,EAAE,sBAAU,CAAC,OAAO;IAC3B,kBAAkB,EAAE,sBAAU,CAAC,kBAAkB;IACjD,qBAAqB,EAAE,sBAAU,CAAC,qBAAqB;IACvD,IAAI,EAAE,sBAAU,CAAC,KAAK;CACvB,CAAA;AAMD,MAAM,cAAc,GAAG;IACrB,cAAc,EAAE,oBAAoB;IACpC,iBAAiB,EAAE,oBAAoB;IACvC,IAAI,EAAE,OAAO;CACd,CAAA;AAOY,QAAA,kBAAkB,GAE3B;IAEF,CAAC,EAAE;QACD,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,CAAC,EAAE;QACD,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,CAAC,EAAE;QACD,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,EAAE,EAAE;QACF,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,KAAK,EAAE;QACL,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,GAAG,EAAE;QACH,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,KAAK,EAAE;QACL,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,KAAK,EAAE;QACL,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,KAAK,EAAE;QACL,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,EAAE,EAAE;QACF,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,EAAE,EAAE;QACF,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;IAED,EAAE,EAAE;QACF,EAAE,EAAE;YACF,cAAc,EAAE,4CAA4C;YAC5D,sBAAsB,EAAE,4CAA4C;YACpE,0BAA0B,EAAE,4CAA4C;YACxE,gBAAgB,EAAE,4CAA4C;YAC9D,oBAAoB,EAAE,4CAA4C;YAClE,yBAAyB,EAAE,4CAA4C;YACvE,WAAW,EAAE,4CAA4C;YACzD,qBAAqB,EAAE,4CAA4C;YACnE,yBAAyB,EAAE,4CAA4C;SACxE;QACD,EAAE,EAAE,qCAA6B;KAClC;CACF,CAAA;AAKY,QAAA,mBAAmB,GAE5B;IAGF,CAAC,EAAE;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;KACF;IACD,CAAC,EAAE;QAED,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,CAAC,EAAE;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACnD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,EAAE,EAAE;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACpD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACpD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,4CAA4C;SACvD;KACF;IACD,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,0BAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACvD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,0BAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,gBAAgB;YACvD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,EAAE,EAAE;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,EAAE,EAAE;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,EAAE,EAAE;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,OAAO,EAAE,gCAAqB;YAC9B,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2BAAgB;YACzB,QAAQ,EAAE,4CAA4C;YACtD,QAAQ,EAAE,sBAAU,CAAC,gBAAgB;SACtC;KACF;CACF,CAAA;AA+BM,MAAM,aAAa,GAAG,CAC3B,YAAuD,EACvD,SAAiB,EACjB,OAGI,EAAE,EACI,EAAE;IACZ,MAAM,SAAS,GAAG,0BAAkB,CAAC,SAAS,CAAC,CAAA;IAE/C,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;QACzD,MAAM,IAAI,KAAK,CACb,uBAAuB,YAAY,4BAA4B,SAAS,+BAA+B,CACxG,CAAA;KACF;IAED,OAAO,IAAI,iBAAQ,CACjB,IAAA,oBAAS,EACP,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,CACzE,EACD,IAAA,gCAAoB,EAAC,cAAc,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,EAClE,IAAI,CAAC,gBAAgB,CACtB,CAAA;AACH,CAAC,CAAA;AAvBY,QAAA,aAAa,iBAuBzB;AAgBM,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,OAII,EAAE,EACO,EAAE;;IACf,MAAM,SAAS,GAAG,0BAAkB,CAAC,SAAS,CAAC,IAAI;QACjD,EAAE,EAAE;YACF,cAAc,EAAE,SAAS;YACzB,sBAAsB,EAAE,SAAS;YACjC,0BAA0B,EAAE,SAAS;YACrC,gBAAgB,EAAE,SAAS;YAC3B,oBAAoB,EAAE,SAAS;YAC/B,yBAAyB,EAAE,SAAS;YACpC,WAAW,EAAE,SAAS;YACtB,qBAAqB,EAAE,SAAS;YAChC,yBAAyB,EAAE,SAAS;SACrC;QACD,EAAE,EAAE,qCAA6B;KAClC,CAAA;IAGD,MAAM,WAAW,GAAkB,EAAS,CAAA;IAC5C,KAAK,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE;QAC1E,WAAW,CAAC,YAAY,CAAC,GAAG,IAAA,qBAAa,EAAC,YAAmB,EAAE,SAAS,EAAE;YACxE,OAAO,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,EAAE,0CAAG,YAAY,CAAC,KAAI,eAAe;YAC9D,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;SAC1C,CAAC,CAAA;KACH;IAGD,MAAM,WAAW,GAAkB,EAAS,CAAA;IAC5C,KAAK,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE;QAC1E,WAAW,CAAC,YAAY,CAAC,GAAG,IAAA,qBAAa,EAAC,YAAmB,EAAE,SAAS,EAAE;YACxE,OAAO,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,EAAE,0CAAG,YAAY,CAAC,KAAI,eAAe;YAC9D,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;SAC1C,CAAC,CAAA;KACH;IAED,OAAO;QACL,EAAE,EAAE,WAAW;QACf,EAAE,EAAE,WAAW;KAChB,CAAA;AACH,CAAC,CAAA;AA7CY,QAAA,iBAAiB,qBA6C7B;AAWM,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,SAA+B,EAC/B,IAEC,EACe,EAAE;IAClB,MAAM,QAAQ,GAAmB,EAAE,CAAA;IACnC,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,iCAChD,CAAC,2BAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GACtC,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,KAAI,EAAE,CAAC,EAC1B,EAAE;QACF,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC;YAC5C,SAAS;YACT,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC,CAAA;KACH;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AApBY,QAAA,iBAAiB,qBAoB7B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/graph.d.ts b/node_modules/@eth-optimism/sdk/dist/utils/graph.d.ts +new file mode 100644 +index 0000000..80cb9f1 +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/graph.d.ts +@@ -0,0 +1,11 @@ ++import { ethers } from 'ethers'; ++export declare const WHITELIST_CHAIN_ID: Array; ++export declare const GRAPH_API_URL: any; ++export declare const getStateBatchAppendedEventByBatchIndexFromGraph: (provider: ethers.providers.Provider, batchIndex: number) => Promise; ++export declare const getRelayedMessageEventsFromGraph: (provider: ethers.providers.Provider, messageHash: string, fast: boolean) => Promise; ++export declare const getFailedRelayedMessageEventsFromGraph: (provider: ethers.providers.Provider, messageHash: string, fast: boolean) => Promise; ++export declare const getAddressSetEventsFromGraph: (provider: ethers.providers.Provider, name: string, fromBlock?: number, toBlock?: number) => Promise; ++export declare const isChainIDForGraph: (provider: ethers.providers.Provider) => Promise; +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/graph.js b/node_modules/@eth-optimism/sdk/dist/utils/graph.js +new file mode 100644 +index 0000000..c12013e +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/graph.js +@@ -0,0 +1,265 @@ ++"use strict"; ++var __importDefault = (this && this.__importDefault) || function (mod) { ++ return (mod && mod.__esModule) ? mod : { "default": mod }; ++}; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.isChainIDForGraph = exports.getAddressSetEventsFromGraph = exports.getFailedRelayedMessageEventsFromGraph = exports.getRelayedMessageEventsFromGraph = exports.getStateBatchAppendedEventByBatchIndexFromGraph = exports.GRAPH_API_URL = exports.WHITELIST_CHAIN_ID = void 0; ++const ethers_1 = require("ethers"); ++const node_fetch_1 = __importDefault(require("node-fetch")); ++exports.WHITELIST_CHAIN_ID = [ ++ 1287, 1284, 4002, 250, 43113, 43114, 97, 56, ++]; ++exports.GRAPH_API_URL = { ++ 1287: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabase-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabase-address-manager', ++ }, ++ 1284: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabeam-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabeam-address-manager', ++ }, ++ 4002: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaopera-tn-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaopera-tn-address-manager', ++ }, ++ 250: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaopera-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaopera-address-manager', ++ }, ++ 43113: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobafuji-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobafuji-address-manager', ++ }, ++ 43114: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaavax-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobaavax-address-manager', ++ }, ++ 97: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabnb-tn-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabnb-tn-address-manager', ++ }, ++ 56: { ++ rollup: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabnb-rollup', ++ addressManager: 'https://api.thegraph.com/subgraphs/name/bobanetwork/bobabnb-address-manager', ++ }, ++}; ++const intToBigNumber = (value) => { ++ return ethers_1.ethers.BigNumber.from(value); ++}; ++const intToHex = (value) => { ++ return ethers_1.ethers.utils.hexlify(value); ++}; ++const formatStateBatchAppendedEvent = (events) => { ++ for (var i = 0; i < events.length; i++) { ++ events[i]._batchIndex = intToBigNumber(events[i]._batchIndex); ++ events[i]._batchSize = intToBigNumber(events[i]._batchSize); ++ events[i]._prevTotalElements = intToBigNumber(events[i]._prevTotalElements); ++ events[i].blockNumber = intToHex(intToBigNumber(events[i].blockNumber)); ++ } ++ return events; ++}; ++const formatAddressSetEvent = (events) => { ++ for (var i = 0; i < events.length; i++) { ++ events[i].blockNumber = parseInt(events[i].blockNumber, 10); ++ } ++ return events; ++}; ++const addArgs = (events) => { ++ for (var i = 0; i < events.length; i++) { ++ events[i].args = Object.assign({}, events[i]); ++ } ++ return events; ++}; ++const addEventMethods = (events, provider) => { ++ for (var i = 0; i < events.length; i++) { ++ const event = events[i]; ++ events[i].getTransactionReceipt = async () => { ++ const receipt = await provider.getTransactionReceipt(event.transactionHash); ++ return receipt; ++ }; ++ events[i].getTransaction = async () => { ++ const transaction = await provider.getTransaction(event.transactionHash); ++ return transaction; ++ }; ++ } ++ return events; ++}; ++const getStateBatchAppendedEventByBatchIndexFromGraph = async (provider, batchIndex) => { ++ const chainID = (await provider.getNetwork()).chainId; ++ if (!exports.GRAPH_API_URL[chainID]) { ++ return []; ++ } ++ const response = await (0, node_fetch_1.default)(exports.GRAPH_API_URL[chainID].rollup, { ++ method: 'POST', ++ headers: { ++ 'Content-Type': 'application/json', ++ }, ++ body: JSON.stringify({ ++ query: ` ++ query { ++ stateBatchAppendedEntities(where: { ++ _batchIndex: "${batchIndex}" ++ }) { ++ _batchIndex ++ _batchRoot ++ _batchSize ++ _prevTotalElements ++ _extraData ++ transactionHash ++ blockNumber ++ } ++ } ++ `, ++ }), ++ }); ++ const data = await response.json(); ++ if (typeof data.data === 'undefined') { ++ return []; ++ } ++ let entity = formatStateBatchAppendedEvent(data.data.stateBatchAppendedEntities); ++ if (entity.length === 0) { ++ return []; ++ } ++ entity = formatStateBatchAppendedEvent(data.data.stateBatchAppendedEntities); ++ const events = addEventMethods(addArgs(entity), provider); ++ return events; ++}; ++exports.getStateBatchAppendedEventByBatchIndexFromGraph = getStateBatchAppendedEventByBatchIndexFromGraph; ++const getRelayedMessageEventsFromGraph = async (provider, messageHash, fast) => { ++ const chainID = (await provider.getNetwork()).chainId; ++ if (!exports.GRAPH_API_URL[chainID]) { ++ return []; ++ } ++ const response = await (0, node_fetch_1.default)(exports.GRAPH_API_URL[chainID].rollup, { ++ method: 'POST', ++ headers: { ++ 'Content-Type': 'application/json', ++ }, ++ body: JSON.stringify({ ++ query: ` ++ query { ++ ${fast ? 'relayedMessageFastEntities' : 'relayedMessageEntities'}(where: { ++ msgHash: "${messageHash}" ++ }) { ++ msgHash ++ transactionHash ++ blockNumber ++ } ++ } ++ `, ++ }), ++ }); ++ const data = await response.json(); ++ if (typeof data.data === 'undefined') { ++ return []; ++ } ++ let entity; ++ if (fast) { ++ entity = data.data.relayedMessageFastEntities; ++ } ++ else { ++ entity = data.data.relayedMessageEntities; ++ } ++ if (entity.length === 0) { ++ return []; ++ } ++ const events = addEventMethods(addArgs(entity), provider); ++ return events; ++}; ++exports.getRelayedMessageEventsFromGraph = getRelayedMessageEventsFromGraph; ++const getFailedRelayedMessageEventsFromGraph = async (provider, messageHash, fast) => { ++ const chainID = (await provider.getNetwork()).chainId; ++ if (!exports.GRAPH_API_URL[chainID]) { ++ return []; ++ } ++ const response = await (0, node_fetch_1.default)(exports.GRAPH_API_URL[chainID].rollup, { ++ method: 'POST', ++ headers: { ++ 'Content-Type': 'application/json', ++ }, ++ body: JSON.stringify({ ++ query: ` ++ query { ++ ${fast ++ ? 'failedRelayedMessageFastEntities' ++ : 'failedRelayedMessageEntities'}(where: { ++ msgHash: "${messageHash}" ++ }) { ++ msgHash ++ transactionHash ++ blockNumber ++ } ++ } ++ `, ++ }), ++ }); ++ const data = await response.json(); ++ if (typeof data.data === 'undefined') { ++ return []; ++ } ++ let entity; ++ if (fast) { ++ entity = data.data.failedRelayedMessageFastEntities; ++ } ++ else { ++ entity = data.data.failedRelayedMessageEntities; ++ } ++ if (entity.length === 0) { ++ return []; ++ } ++ const events = addEventMethods(addArgs(entity), provider); ++ return events; ++}; ++exports.getFailedRelayedMessageEventsFromGraph = getFailedRelayedMessageEventsFromGraph; ++const getAddressSetEventsFromGraph = async (provider, name, fromBlock, toBlock) => { ++ const chainID = (await provider.getNetwork()).chainId; ++ if (!exports.GRAPH_API_URL[chainID]) { ++ return []; ++ } ++ const response = await (0, node_fetch_1.default)(exports.GRAPH_API_URL[chainID].addressManager, { ++ method: 'POST', ++ headers: { ++ 'Content-Type': 'application/json', ++ }, ++ body: JSON.stringify({ ++ query: ` ++ query { addressSetEntities ++ ( ++ orderBy: blockNumber ++ orderDirection: desc ++ first: 1 ++ where: { ++ _name: "${ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.toUtf8Bytes(name))}" ++ ${fromBlock != null ? `blockNumber_gte: ${fromBlock}` : ''} ++ ${toBlock != null ? `blockNumber_lte: ${toBlock}` : ''} ++ } ++ ) ++ { ++ _name ++ _newAddress ++ _oldAddress ++ blockNumber ++ transactionHash ++ } ++ } ++ `, ++ }), ++ }); ++ const data = await response.json(); ++ if (typeof data.data === 'undefined') { ++ return []; ++ } ++ const entity = formatAddressSetEvent(data.data.addressSetEntities); ++ if (entity.length === 0) { ++ return []; ++ } ++ const events = addEventMethods(addArgs(entity), provider); ++ return events; ++}; ++exports.getAddressSetEventsFromGraph = getAddressSetEventsFromGraph; ++const isChainIDForGraph = async (provider) => { ++ const chainID = (await provider.getNetwork()).chainId; ++ return exports.WHITELIST_CHAIN_ID.includes(chainID); ++}; ++exports.isChainIDForGraph = isChainIDForGraph; ++//# sourceMappingURL=graph.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/graph.js.map b/node_modules/@eth-optimism/sdk/dist/utils/graph.js.map +new file mode 100644 +index 0000000..83c1eed +--- /dev/null ++++ b/node_modules/@eth-optimism/sdk/dist/utils/graph.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/utils/graph.ts"],"names":[],"mappings":";;;;;;AAAA,mCAA+B;AAC/B,4DAA8B;AAEjB,QAAA,kBAAkB,GAAkB;IAC/C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;CAC5C,CAAA;AAEY,QAAA,aAAa,GAAQ;IAEhC,IAAI,EAAE;QACJ,MAAM,EACJ,qEAAqE;QAEvE,cAAc,EACZ,8EAA8E;KACjF;IAED,IAAI,EAAE;QACJ,MAAM,EACJ,qEAAqE;QAEvE,cAAc,EACZ,8EAA8E;KACjF;IAED,IAAI,EAAE;QACJ,MAAM,EACJ,yEAAyE;QAE3E,cAAc,EACZ,kFAAkF;KACrF;IAED,GAAG,EAAE;QACH,MAAM,EACJ,sEAAsE;QAExE,cAAc,EACZ,+EAA+E;KAClF;IAED,KAAK,EAAE;QACL,MAAM,EACJ,qEAAqE;QAEvE,cAAc,EACZ,8EAA8E;KACjF;IAED,KAAK,EAAE;QACL,MAAM,EACJ,qEAAqE;QAEvE,cAAc,EACZ,8EAA8E;KACjF;IAED,EAAE,EAAE;QACF,MAAM,EACJ,uEAAuE;QAEzE,cAAc,EACZ,gFAAgF;KACnF;IAED,EAAE,EAAE;QACF,MAAM,EACJ,oEAAoE;QAEtE,cAAc,EACZ,6EAA6E;KAChF;CACF,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAU,EAAoB,EAAE;IACtD,OAAO,eAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACrC,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAU,EAAU,EAAE;IACtC,OAAO,eAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,6BAA6B,GAAG,CAAC,MAAW,EAAO,EAAE;IAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QAC7D,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;QAC3D,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAA;QAC3E,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;KACxE;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,MAAW,EAAO,EAAE;IAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;KAC5D;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,MAAW,EAAO,EAAE;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,qBAAQ,MAAM,CAAC,CAAC,CAAC,CAAE,CAAA;KAClC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CACtB,MAAsB,EACtB,QAAmC,EACnB,EAAE;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,CAAC,CAAC,CAAC,qBAAqB,GAAG,KAAK,IAAI,EAAE;YAC3C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,qBAAqB,CAClD,KAAK,CAAC,eAAe,CACtB,CAAA;YACD,OAAO,OAAO,CAAA;QAChB,CAAC,CAAA;QACD,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,KAAK,IAAI,EAAE;YACpC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YACxE,OAAO,WAAW,CAAA;QACpB,CAAC,CAAA;KACF;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAEM,MAAM,+CAA+C,GAAG,KAAK,EAClE,QAAmC,EACnC,UAAkB,EACY,EAAE;IAChC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACrD,IAAI,CAAC,qBAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAA;KACV;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,qBAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE;;;4BAGe,UAAU;;;;;;;;;;;OAW/B;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;QACpC,OAAO,EAAE,CAAA;KACV;IACD,IAAI,MAAM,GAAG,6BAA6B,CACxC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CACrC,CAAA;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,EAAE,CAAA;KACV;IACD,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;IAC5E,MAAM,MAAM,GAAmB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA5CY,QAAA,+CAA+C,mDA4C3D;AAEM,MAAM,gCAAgC,GAAG,KAAK,EACnD,QAAmC,EACnC,WAAmB,EACnB,IAAa,EACiB,EAAE;IAChC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACrD,IAAI,CAAC,qBAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAA;KACV;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,qBAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE;;YAGD,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,wBACxC;wBACc,WAAW;;;;;;;OAO5B;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;QACpC,OAAO,EAAE,CAAA;KACV;IACD,IAAI,MAAW,CAAA;IACf,IAAI,IAAI,EAAE;QACR,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAA;KAC9C;SAAM;QACL,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAA;KAC1C;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,EAAE,CAAA;KACV;IACD,MAAM,MAAM,GAAmB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA7CY,QAAA,gCAAgC,oCA6C5C;AAEM,MAAM,sCAAsC,GAAG,KAAK,EACzD,QAAmC,EACnC,WAAmB,EACnB,IAAa,EACiB,EAAE;IAChC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACrD,IAAI,CAAC,qBAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAA;KACV;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,qBAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE;;YAGD,IAAI;gBACF,CAAC,CAAC,kCAAkC;gBACpC,CAAC,CAAC,8BACN;wBACc,WAAW;;;;;;;OAO5B;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;QACpC,OAAO,EAAE,CAAA;KACV;IACD,IAAI,MAAW,CAAA;IACf,IAAI,IAAI,EAAE;QACR,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAA;KACpD;SAAM;QACL,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAA;KAChD;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,EAAE,CAAA;KACV;IACD,MAAM,MAAM,GAAmB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA/CY,QAAA,sCAAsC,0CA+ClD;AAEM,MAAM,4BAA4B,GAAG,KAAK,EAC/C,QAAmC,EACnC,IAAY,EACZ,SAAkB,EAClB,OAAgB,EAChB,EAAE;IACF,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACrD,IAAI,CAAC,qBAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAA;KACV;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,qBAAa,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE;;;;;;;wBAOW,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,eAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9D,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;gBACxD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;OAW7D;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;QACpC,OAAO,EAAE,CAAA;KACV;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,EAAE,CAAA;KACV;IACD,MAAM,MAAM,GAAmB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAjDY,QAAA,4BAA4B,gCAiDxC;AAEM,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAmC,EACnC,EAAE;IACF,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAA;IACrD,OAAO,0BAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC7C,CAAC,CAAA;AALY,QAAA,iBAAiB,qBAK7B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/index.d.ts b/node_modules/@eth-optimism/sdk/dist/utils/index.d.ts +index e94e15a..32a7c70 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/index.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/utils/index.d.ts +@@ -5,3 +5,5 @@ export * from './type-utils'; + export * from './misc-utils'; + export * from './merkle-utils'; + export * from './chain-constants'; ++export * from './graph'; ++export * from './chain-specific'; +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/index.js b/node_modules/@eth-optimism/sdk/dist/utils/index.js +index e312435..343e355 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/index.js ++++ b/node_modules/@eth-optimism/sdk/dist/utils/index.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +@@ -17,4 +21,6 @@ __exportStar(require("./type-utils"), exports); + __exportStar(require("./misc-utils"), exports); + __exportStar(require("./merkle-utils"), exports); + __exportStar(require("./chain-constants"), exports); ++__exportStar(require("./graph"), exports); ++__exportStar(require("./chain-specific"), exports); + //# sourceMappingURL=index.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/index.js.map b/node_modules/@eth-optimism/sdk/dist/utils/index.js.map +index a4a556b..d08284a 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/index.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/utils/index.js.map +@@ -1 +1 @@ +-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA0B;AAC1B,8CAA2B;AAC3B,qDAAkC;AAClC,+CAA4B;AAC5B,+CAA4B;AAC5B,iDAA8B;AAC9B,oDAAiC"} +\ No newline at end of file ++{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,8CAA2B;AAC3B,qDAAkC;AAClC,+CAA4B;AAC5B,+CAA4B;AAC5B,iDAA8B;AAC9B,oDAAiC;AACjC,0CAAuB;AACvB,mDAAgC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js b/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js +index 93db7c1..ad05a15 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js ++++ b/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js +@@ -1,7 +1,11 @@ + "use strict"; + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; +- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++ var desc = Object.getOwnPropertyDescriptor(m, k); ++ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { ++ desc = { enumerable: true, get: function() { return m[k]; } }; ++ } ++ Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +@@ -37,10 +41,10 @@ const makeMerkleTreeProof = (leaves, index) => { + } + const bufLeaves = parsedLeaves.map(core_utils_1.fromHexString); + const tree = new merkletreejs_1.MerkleTree(bufLeaves, (el) => { +- return core_utils_1.fromHexString(ethers_1.ethers.utils.keccak256(el)); ++ return (0, core_utils_1.fromHexString)(ethers_1.ethers.utils.keccak256(el)); + }); + const proof = tree.getProof(bufLeaves[index], index).map((element) => { +- return core_utils_1.toHexString(element.data); ++ return (0, core_utils_1.toHexString)(element.data); + }); + return proof; + }; +@@ -49,11 +53,11 @@ const makeStateTrieProof = async (provider, blockNumber, address, slot) => { + const proof = await provider.send('eth_getProof', [ + address, + [slot], +- core_utils_1.toRpcHexString(blockNumber), ++ (0, core_utils_1.toRpcHexString)(blockNumber), + ]); + return { +- accountProof: core_utils_1.toHexString(rlp.encode(proof.accountProof)), +- storageProof: core_utils_1.toHexString(rlp.encode(proof.storageProof[0].proof)), ++ accountProof: (0, core_utils_1.toHexString)(rlp.encode(proof.accountProof)), ++ storageProof: (0, core_utils_1.toHexString)(rlp.encode(proof.storageProof[0].proof)), + }; + }; + exports.makeStateTrieProof = makeStateTrieProof; +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js.map b/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js.map +index b265333..b354aa4 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/utils/merkle-utils.js.map +@@ -1 +1 @@ +-{"version":3,"file":"merkle-utils.js","sourceRoot":"","sources":["../../src/utils/merkle-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,mCAA+B;AAC/B,yDAIiC;AACjC,+CAAyC;AACzC,yCAA0B;AASnB,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,KAAa,EACH,EAAE;IAIZ,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC1E,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;YACrB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;SAC7B;aAAM;YACL,YAAY,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;SAClE;KACF;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,0BAAa,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,yBAAU,CAAC,SAAS,EAAE,CAAC,EAAmB,EAAU,EAAE;QACrE,OAAO,0BAAa,CAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;QACxE,OAAO,wBAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AA5BY,QAAA,mBAAmB,uBA4B/B;AAWM,MAAM,kBAAkB,GAAG,KAAK,EACrC,QAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,IAAY,EAIX,EAAE;IACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;QAChD,OAAO;QACP,CAAC,IAAI,CAAC;QACN,2BAAc,CAAC,WAAW,CAAC;KAC5B,CAAC,CAAA;IAEF,OAAO;QACL,YAAY,EAAE,wBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzD,YAAY,EAAE,wBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACnE,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,kBAAkB,sBAmB9B"} +\ No newline at end of file ++{"version":3,"file":"merkle-utils.js","sourceRoot":"","sources":["../../src/utils/merkle-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mCAA+B;AAC/B,yDAIiC;AACjC,+CAAyC;AACzC,yCAA0B;AASnB,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,KAAa,EACH,EAAE;IAIZ,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC1E,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;YACrB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;SAC7B;aAAM;YACL,YAAY,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;SAClE;KACF;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,0BAAa,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,yBAAU,CAAC,SAAS,EAAE,CAAC,EAAmB,EAAU,EAAE;QACrE,OAAO,IAAA,0BAAa,EAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;QACxE,OAAO,IAAA,wBAAW,EAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AA5BY,QAAA,mBAAmB,uBA4B/B;AAWM,MAAM,kBAAkB,GAAG,KAAK,EACrC,QAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,IAAY,EAIX,EAAE;IACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;QAChD,OAAO;QACP,CAAC,IAAI,CAAC;QACN,IAAA,2BAAc,EAAC,WAAW,CAAC;KAC5B,CAAC,CAAA;IAEF,OAAO;QACL,YAAY,EAAE,IAAA,wBAAW,EAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzD,YAAY,EAAE,IAAA,wBAAW,EAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACnE,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,kBAAkB,sBAmB9B"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js b/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js +index be14d7e..18280ed 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js ++++ b/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js +@@ -4,11 +4,11 @@ exports.hashCrossChainMessage = exports.encodeCrossChainMessage = void 0; + const contracts_1 = require("@eth-optimism/contracts"); + const ethers_1 = require("ethers"); + const encodeCrossChainMessage = (message) => { +- return contracts_1.getContractInterface('L2CrossDomainMessenger').encodeFunctionData('relayMessage', [message.target, message.sender, message.message, message.messageNonce]); ++ return (0, contracts_1.getContractInterface)('L2CrossDomainMessenger').encodeFunctionData('relayMessage', [message.target, message.sender, message.message, message.messageNonce]); + }; + exports.encodeCrossChainMessage = encodeCrossChainMessage; + const hashCrossChainMessage = (message) => { +- return ethers_1.ethers.utils.solidityKeccak256(['bytes'], [exports.encodeCrossChainMessage(message)]); ++ return ethers_1.ethers.utils.solidityKeccak256(['bytes'], [(0, exports.encodeCrossChainMessage)(message)]); + }; + exports.hashCrossChainMessage = hashCrossChainMessage; + //# sourceMappingURL=message-encoding.js.map +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js.map b/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js.map +index 46cd68c..0a83a70 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js.map ++++ b/node_modules/@eth-optimism/sdk/dist/utils/message-encoding.js.map +@@ -1 +1 @@ +-{"version":3,"file":"message-encoding.js","sourceRoot":"","sources":["../../src/utils/message-encoding.ts"],"names":[],"mappings":";;;AAAA,uDAA8D;AAC9D,mCAA+B;AAWxB,MAAM,uBAAuB,GAAG,CACrC,OAA8B,EACtB,EAAE;IACV,OAAO,gCAAoB,CAAC,wBAAwB,CAAC,CAAC,kBAAkB,CACtE,cAAc,EACd,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CACxE,CAAA;AACH,CAAC,CAAA;AAPY,QAAA,uBAAuB,2BAOnC;AAUM,MAAM,qBAAqB,GAAG,CACnC,OAA8B,EACtB,EAAE;IACV,OAAO,eAAM,CAAC,KAAK,CAAC,iBAAiB,CACnC,CAAC,OAAO,CAAC,EACT,CAAC,+BAAuB,CAAC,OAAO,CAAC,CAAC,CACnC,CAAA;AACH,CAAC,CAAA;AAPY,QAAA,qBAAqB,yBAOjC"} +\ No newline at end of file ++{"version":3,"file":"message-encoding.js","sourceRoot":"","sources":["../../src/utils/message-encoding.ts"],"names":[],"mappings":";;;AAAA,uDAA8D;AAC9D,mCAA+B;AAWxB,MAAM,uBAAuB,GAAG,CACrC,OAA8B,EACtB,EAAE;IACV,OAAO,IAAA,gCAAoB,EAAC,wBAAwB,CAAC,CAAC,kBAAkB,CACtE,cAAc,EACd,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CACxE,CAAA;AACH,CAAC,CAAA;AAPY,QAAA,uBAAuB,2BAOnC;AAUM,MAAM,qBAAqB,GAAG,CACnC,OAA8B,EACtB,EAAE;IACV,OAAO,eAAM,CAAC,KAAK,CAAC,iBAAiB,CACnC,CAAC,OAAO,CAAC,EACT,CAAC,IAAA,+BAAuB,EAAC,OAAO,CAAC,CAAC,CACnC,CAAA;AACH,CAAC,CAAA;AAPY,QAAA,qBAAqB,yBAOjC"} +\ No newline at end of file +diff --git a/node_modules/@eth-optimism/sdk/dist/utils/type-utils.d.ts b/node_modules/@eth-optimism/sdk/dist/utils/type-utils.d.ts +index 3dd6f5e..bc1ff91 100644 +--- a/node_modules/@eth-optimism/sdk/dist/utils/type-utils.d.ts ++++ b/node_modules/@eth-optimism/sdk/dist/utils/type-utils.d.ts +@@ -1,3 +1,3 @@ +-export declare type DeepPartial = { ++export type DeepPartial = { + [P in keyof T]?: DeepPartial; + }; diff --git a/boba_community/boba-relayer/src/constant.js b/boba_community/boba-relayer/src/constant.js new file mode 100644 index 0000000000..ee75818f8c --- /dev/null +++ b/boba_community/boba-relayer/src/constant.js @@ -0,0 +1,56 @@ +const { utils } = require('ethers') + +const FAST_RELAYER_LIST = { + // Mainnet + 1: ['0x1A26ef6575B7BBB864d984D9255C069F6c361a14'], + // Goerli + 5: ['0x1F32017A84dE07A524b9C6993D35B4bF70e8Dc93'], + // Moonbase + 1287: ['0x569a3e1A4A50D0F53BDF05d50D5FeAB3f716f5A1'], + // Moonbeam + 1284: ['0x3fBc139f80a474c9B19A734e9ABb285b6550dF58'], + // Fantom testnet + 4002: ['0x34024168ba3cfa608005b5E9f13389bb2532422A'], + // Fantom mainnet + 250: ['0x0bF5402a57970C7BD9883248534B644Ab545e6d4'], + // Avalanche testnet + 43113: ['0x30caB2fCA6260FB91B172D4AFB215514069868ea'], + // Avalanche Mainnet + 43114: ['0x1E6D9F4dDD7C52EF8964e81E5a9a137Ee2489b21'], + // BNB testnet + 97: ['0xed142c7BdA2A3d5b08Eae78C96b37FFe60Fecf80'], + // BNB mainnet + 56: ['0x88b5d70be4fc644c55b164AD09A3DFD44E31eC59'], +} + +const L2_CROSS_DOMAIN_MESSENGER_TOPIC = utils.id( + 'SentMessage(address,address,bytes,uint256,uint256)' +) + +const L2_CROSS_DOMAIN_MESSENGER_INTERFACE = new utils.Interface([ + 'function relayMessage(address, address, bytes, uint256)', +]) + +const STATE_COMMITMENT_CONTRACT_INTERFACE = new utils.Interface([ + 'function getTotalBatches() view returns (uint256)', + 'event StateBatchAppended(uint256 indexed _batchIndex,bytes32 _batchRoot,uint256 _batchSize,uint256 _prevTotalElements,bytes _extraData)', + 'function FRAUD_PROOF_WINDOW() view returns (uint256)', +]) + +const DEFAULT_L2_CONTRACT_ADDRESSES = { + OVM_L2CrossDomainMessenger: '0x4200000000000000000000000000000000000007', +} + +const CUSTOM_ERROR = { + INVALID_L2_TRANSACTION_HASH: 'INVALID_L2_TRANSACTION_HASH', + INVALID_L2_CROSS_DOMAIN_TX: 'INVALID_L2_CROSS_DOMAIN_TX', +} + +module.exports = { + L2_CROSS_DOMAIN_MESSENGER_TOPIC, + L2_CROSS_DOMAIN_MESSENGER_INTERFACE, + STATE_COMMITMENT_CONTRACT_INTERFACE, + DEFAULT_L2_CONTRACT_ADDRESSES, + FAST_RELAYER_LIST, + CUSTOM_ERROR, +} diff --git a/boba_community/boba-relayer/src/index.js b/boba_community/boba-relayer/src/index.js new file mode 100644 index 0000000000..bb65c871e9 --- /dev/null +++ b/boba_community/boba-relayer/src/index.js @@ -0,0 +1,158 @@ +const { providers, Wallet, utils } = require('ethers') +require('dotenv').config() + +const { + CUSTOM_ERROR, + FAST_RELAYER_LIST, + L2_CROSS_DOMAIN_MESSENGER_TOPIC, +} = require('./constant') + +const { formatTime } = require('./utils') + +const { + CrossChainMessenger, + MessageStatus, + CONTRACT_ADDRESSES, +} = require('@eth-optimism/sdk') + +const main = async () => { + const env = process.env + const L1_NODE_WEB3_URL = env.L1_NODE_WEB3_URL + const L2_NODE_WEB3_URL = env.L2_NODE_WEB3_URL + const PRIV_KEY = env.PRIV_KEY + const L2_TRANSACTION_HASH = env.L2_TRANSACTION_HASH + + // provider + const l1Provider = new providers.JsonRpcProvider(L1_NODE_WEB3_URL) + const l2Provider = new providers.JsonRpcProvider(L2_NODE_WEB3_URL) + const l1Wallet = new Wallet(PRIV_KEY).connect(l1Provider) + + // select network + const chainId = (await l1Provider.getNetwork()).chainId + if (typeof CONTRACT_ADDRESSES[chainId] === 'undefined') { + console.error(`!! chainId: ${chainId} is not supported`) + return null + } + const contractAddress = CONTRACT_ADDRESSES[chainId] + + // verify the cross chain message + const l2TxReceipt = await l2Provider.getTransactionReceipt( + L2_TRANSACTION_HASH + ) + if (l2TxReceipt === null) { + console.error( + `!! invalid L2_TRANSACTION_HASH: ${L2_TRANSACTION_HASH}. The transaction is not found.` + ) + return CUSTOM_ERROR.INVALID_L2_TRANSACTION_HASH + } + + const logData = l2TxReceipt.logs.filter( + (i) => + i.address === contractAddress.l2.L2CrossDomainMessenger && + i.topics[0] === L2_CROSS_DOMAIN_MESSENGER_TOPIC + ) + if (logData.length === 0) { + console.error( + `!! invalid L2_TRANSACTION_HASH: ${L2_TRANSACTION_HASH}. The transaction is not a cross chain message.` + ) + return CUSTOM_ERROR.INVALID_L2_CROSS_DOMAIN_TX + } + + let target + // get the L2 message hash + for (const log of logData) { + const messageHash = log.topics[1] + target = utils.defaultAbiCoder.decode(['address'], log.topics[1])[0] + console.log( + `Found l2 cross chain message hash: ${messageHash} to l1 address: ${target}` + ) + } + + const isFastMessage = FAST_RELAYER_LIST[chainId].includes(target) + + const messenger = new CrossChainMessenger({ + l1SignerOrProvider: l1Wallet, + l2SignerOrProvider: l2Provider, + l1ChainId: chainId, + fastRelayer: isFastMessage, + }) + + const l1BlockNumber = await l1Provider.getBlockNumber() + const fromBlock = Math.max(0, l1BlockNumber - 10000000) + const messages = await messenger.getMessagesByTransaction(L2_TRANSACTION_HASH) + + for (const message of messages) { + const messageStatus = await messenger.getMessageStatus(message, { + fromBlock, + }) + if (messageStatus === MessageStatus.RELAYED) { + console.log( + `Your message is relayed on L1 sucessfully! L1 transaction hash: ${message.transactionHash}.` + ) + return null + } + if (messageStatus === MessageStatus.IN_CHALLENGE_PERIOD) { + const batchEvent = + await messenger.getStateBatchAppendedEventByTransactionIndex( + l2TxReceipt.blockNumber, + { fromBlock } + ) + const l1LatestBlock = await l1Provider.getBlock('latest') + const l1BatchBlockNumber = batchEvent.blockNumber + const l1BatchTimestamp = (await l1Provider.getBlock(l1BatchBlockNumber)) + ?.timestamp + const challengeWindow = await messenger.getChallengePeriodSeconds() + console.log( + `Your message is in the challenge window. Please wait ${formatTime( + l1BatchTimestamp + challengeWindow - l1LatestBlock.timestamp + )} (h:mm:ss).` + ) + return null + } + if (messageStatus === MessageStatus.STATE_ROOT_NOT_PUBLISHED) { + const totalBatch = + await messenger.contracts.l1.StateCommitmentChain.getTotalBatches() + const batchEvent = await messenger.getStateBatchAppendedEventByBatchIndex( + totalBatch.toNumber() - 1, + { fromBlock } + ) + const totalElements = + batchEvent.args._prevTotalElements.toNumber() + + batchEvent.args._batchSize.toNumber() + console.log( + `Your transaction has not been included on L1. Batch element index: ${totalElements}. L2 transaction index: ${l2TxReceipt.blockNumber}.` + ) + return null + } + if ( + messageStatus === MessageStatus.RELAYED || + messageStatus === MessageStatus.RELAYED_FAILED + ) { + const messageReceipt = await messenger.getMessageReceipt(message, { + fromBlock, + }) + console.log( + `Your message is relayed on L1 sucessfully! L1 transaction hash: ${messageReceipt.transactionHash}.` + ) + return null + } + if (messageStatus === MessageStatus.READY_FOR_RELAY) { + console.log(`Your message is ready for relay!`) + const estimateGas = await l1Provider.estimateGas( + messenger.populateTransaction.finalizeMessage(message) + ) + const gasPrice = await l1Provider.getGasPrice() + const gasFee = utils.formatEther(estimateGas.mul(gasPrice)) + console.log(`Estimated gas fee: ${gasFee.toString()}`) + + // Relay the message + const overrideOptions = { gasLimit: estimateGas.mul(11).div(10) } + const tx = await messenger.finalizeMessage(message, { + overrides: overrideOptions, + }) + await tx.wait() + } + } +} + +main() diff --git a/boba_community/boba-relayer/src/utils.js b/boba_community/boba-relayer/src/utils.js new file mode 100644 index 0000000000..12a6d6f274 --- /dev/null +++ b/boba_community/boba-relayer/src/utils.js @@ -0,0 +1,16 @@ +const formatTime = (seconds) => { + const h = Math.floor(seconds / 3600) + const m = Math.floor((seconds % 3600) / 60) + const s = Math.round(seconds % 60) + return [ + h, + m > 9 ? m : h ? '0' + m : m || '0', + s > 9 ? s : '0' + s.filter(Boolean).join(':'), + ] + .filter(Boolean) + .join(':') +} + +module.exports = { + formatTime, +} diff --git a/boba_examples/boba-fee/src/index.js b/boba_examples/boba-fee/src/index.js index 98348f430c..f6e43edfe0 100644 --- a/boba_examples/boba-fee/src/index.js +++ b/boba_examples/boba-fee/src/index.js @@ -28,7 +28,7 @@ const main = async () => { // get address const BobaGasPriceOracleAddress = await addressManager.getAddress( - 'Boba_GasPriceOracle' + 'Proxy__Boba_GasPriceOracle' ) const BobaGasPriceOracleInterface = new utils.Interface([ diff --git a/boba_examples/turing-hello-world/test/local-webserver.ts b/boba_examples/turing-hello-world/test/local-webserver.ts index 189e480b08..4262d275bf 100644 --- a/boba_examples/turing-hello-world/test/local-webserver.ts +++ b/boba_examples/turing-hello-world/test/local-webserver.ts @@ -22,6 +22,7 @@ import GasOracleJson from "../../../packages/contracts/artifacts/contracts/L2/pr import HelloTuringJson from "../artifacts/contracts/HelloTuring.sol/HelloTuring.json" import TuringHelper from "../artifacts/contracts/TuringHelper.sol/TuringHelper.json" import L2GovernanceERC20Json from '@boba/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json' +import { Server } from "http"; let Factory__Hello: ContractFactory let hello: Contract @@ -44,12 +45,18 @@ const oracleWallet = new Wallet("0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1 if (hre.network.name === "boba_local") { describe("Basic Math", function () { + var server: Server + + after(async () => { + await server.close(console.error) + }) + before(async () => { var http = require('http') var ip = require("ip") - var server = module.exports = http.createServer(async function (req, res) { + server = module.exports = http.createServer(async function (req, res) { if (req.headers['content-type'] === 'application/json') { diff --git a/integration-tests/hardhat.config.ts b/integration-tests/hardhat.config.ts index 76acafc0a1..a9248dcec2 100644 --- a/integration-tests/hardhat.config.ts +++ b/integration-tests/hardhat.config.ts @@ -12,7 +12,7 @@ const config: HardhatUserConfig = { }, boba: { url: process.env.L2_URL || 'http://localhost:8545', - gas: "auto" + gas: 'auto', }, }, mocha: { diff --git a/integration-tests/package.json b/integration-tests/package.json index e750f07c89..7636b2c34f 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -25,7 +25,7 @@ "@eth-optimism/contracts": "^0.5.11", "@eth-optimism/core-utils": "0.8.1", "@eth-optimism/sdk": "1.0.1", - "@boba/bundler_sdk": "0.2.3", + "@bobanetwork/bundler_sdk": "*", "@ethersproject/abstract-provider": "^5.5.0", "@ethersproject/providers": "^5.5.3", "@ethersproject/transactions": "^5.5.0", diff --git a/integration-tests/test/alt-l2/basic_nft.spec.ts b/integration-tests/test/alt-l2/basic_nft.spec.ts index d628b1b3d5..425f80088b 100644 --- a/integration-tests/test/alt-l2/basic_nft.spec.ts +++ b/integration-tests/test/alt-l2/basic_nft.spec.ts @@ -100,7 +100,7 @@ describe('NFT Test\n', async () => { BigNumber.from(String(0)), //starting index for the tokenIDs ERC721.address, UUID, - 'BOBA_Goerli_2888' + 'BOBA_Goerli_2888', ], env.l2Wallet ) diff --git a/integration-tests/test/alt-l2/boba-fee-payment.spec.ts b/integration-tests/test/alt-l2/boba-fee-payment.spec.ts index a18eafb6f7..798f668068 100644 --- a/integration-tests/test/alt-l2/boba-fee-payment.spec.ts +++ b/integration-tests/test/alt-l2/boba-fee-payment.spec.ts @@ -1171,9 +1171,7 @@ describe('Boba Fee Payment Integration Tests', async () => { to: env.l2Wallet.address, value: ethers.utils.parseEther('0.5'), }) - ).to.be.rejectedWith( - 'insufficient l1 native token balance to pay for gas' - ) + ).to.be.rejectedWith('insufficient l1 native token balance to pay for gas') }) it('should return the correct receipt', async () => { diff --git a/integration-tests/test/alt-l2/boba_aa_alt_fee_token.spec.ts b/integration-tests/test/alt-l2/boba_aa_alt_fee_token.spec.ts new file mode 100644 index 0000000000..759add91af --- /dev/null +++ b/integration-tests/test/alt-l2/boba_aa_alt_fee_token.spec.ts @@ -0,0 +1,208 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +chai.use(chaiAsPromised) +const expect = chai.expect + +import { Contract, ContractFactory, utils, constants, BigNumber } from 'ethers' + +import { getFilteredLogIndex } from './shared/utils' + +import { OptimismEnv } from './shared/env' +import { hexConcat, hexZeroPad, parseEther } from 'ethers/lib/utils' +import { predeploys } from '@eth-optimism/contracts' +// use local sdk +import { SimpleAccountAPI } from '@bobanetwork/bundler_sdk' +import SimpleAccountJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccount.sol/SimpleAccount.json' +import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' +import L2StandardERC20Json from '@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json' +import EntryPointJson from '@boba/accountabstraction/artifacts/contracts/core/EntryPoint.sol/EntryPoint.json' +import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' + +import GPODepositPaymasterJson from '@boba/accountabstraction/artifacts/contracts/samples/GPODepositPaymaster.sol/GPODepositPaymaster.json' + +describe('AA Alt-L1 Alt Token as Paymaster Fee Test\n', async () => { + let env: OptimismEnv + let SimpleAccountFactory__factory: ContractFactory + let recipient: Contract + + let bundlerProvider: HttpRpcClient + let entryPointAddress: string + + let L2_L1NativeToken: Contract + + let GPODepositPaymaster__factory: ContractFactory + let GPODepositPaymaster: Contract + + let SampleRecipient__factory: ContractFactory + + let EntryPoint: Contract + + before(async () => { + env = await OptimismEnv.new() + entryPointAddress = env.addressesAABOBA.L2_BOBA_EntryPoint + + SampleRecipient__factory = new ContractFactory( + SampleRecipientJson.abi, + SampleRecipientJson.bytecode, + env.l2Wallet + ) + + recipient = await SampleRecipient__factory.deploy() + + L2_L1NativeToken = new Contract( + predeploys.L2_L1NativeToken_ALT_L1, + L2StandardERC20Json.abi, + env.l2Wallet + ) + + bundlerProvider = new HttpRpcClient( + env.bundlerUrl, + entryPointAddress, + await env.l2Wallet.provider.getNetwork().then((net) => net.chainId) + ) + + GPODepositPaymaster__factory = new ContractFactory( + GPODepositPaymasterJson.abi, + GPODepositPaymasterJson.bytecode, + env.l2Wallet + ) + + GPODepositPaymaster = await GPODepositPaymaster__factory.deploy( + entryPointAddress, + L2_L1NativeToken.address, + await L2_L1NativeToken.decimals(), + predeploys.Proxy__Boba_GasPriceOracle, + ) + + EntryPoint = new Contract( + entryPointAddress, + EntryPointJson.abi, + env.l2Wallet + ) + }) + describe('A user without native token pays for a tx using an alt token through a paymaster', async () => { + let accountAPI: SimpleAccountAPI + let account + let accountFactory + let preApproveTokenBalance + let preApproveDepositAmount + let preApproveEtherBalance + let postApproveTokenBalance + let postApproveDepositAmount + let postApproveEtherBalance + let signedOp + + before('the paymaster operator sets up the paymaster by staking and adding deposits', async () => { + await GPODepositPaymaster.addStake(1, { value: utils.parseEther('2') }) + await EntryPoint.depositTo(GPODepositPaymaster.address, { + value: utils.parseEther('1') + }) + }) + + before('the user approves the paymaster to spend their $BOBA token', async () => { + // deploy a 4337 Wallet and send operation to this wallet + SimpleAccountFactory__factory = new ContractFactory( + SimpleAccountFactoryJson.abi, + SimpleAccountFactoryJson.bytecode, + env.l2Wallet + ) + accountFactory = await SimpleAccountFactory__factory.deploy( + entryPointAddress + ) + await accountFactory.deployed() + console.log('Account Factory deployed to:', accountFactory.address) + await accountFactory.createAccount(env.l2Wallet.address, 0) + account = await accountFactory.getAddress(env.l2Wallet.address, 0) + console.log('Account deployed to:', account) + + await L2_L1NativeToken.transfer(account, utils.parseEther('1')) + + await L2_L1NativeToken.approve(GPODepositPaymaster.address, constants.MaxUint256) + await GPODepositPaymaster.addDepositFor(account, utils.parseEther('2')) + + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: account, + }) + + accountAPI = new SimpleAccountAPI({ + provider: env.l2Provider, + entryPointAddress, + owner: env.l2Wallet, + accountAddress: account, + }) + + const approveOp = await accountAPI.createSignedUserOp({ + target: L2_L1NativeToken.address, + data: L2_L1NativeToken.interface.encodeFunctionData('approve', [GPODepositPaymaster.address, constants.MaxUint256]), + }) + + preApproveTokenBalance = await L2_L1NativeToken.balanceOf(account) + preApproveDepositAmount = (await GPODepositPaymaster.depositInfo(account)).amount + preApproveEtherBalance = await env.l2Provider.getBalance(account) + + const requestId = await bundlerProvider.sendUserOpToBundler(approveOp) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + + postApproveTokenBalance = await L2_L1NativeToken.balanceOf(account) + postApproveDepositAmount = (await GPODepositPaymaster.depositInfo(account)).amount + postApproveEtherBalance = await env.l2Provider.getBalance(account) + }) + + it('should be able to submit a userOp including the paymaster to the bundler and trigger tx', async () => { + const op = await accountAPI.createUnsignedUserOp({ + target: recipient.address, + data: recipient.interface.encodeFunctionData('something', ['hello']), + }) + + + op.paymasterAndData = GPODepositPaymaster.address + op.preVerificationGas = await accountAPI.getPreVerificationGas(op) + + signedOp = await accountAPI.signUserOp(op) + + const requestId = await bundlerProvider.sendUserOpToBundler(signedOp) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + const receipt = await env.l2Provider.getTransactionReceipt(txid) + const returnedlogIndex = await getFilteredLogIndex( + receipt, + SampleRecipientJson.abi, + recipient.address, + 'Sender' + ) + const log = recipient.interface.parseLog(receipt.logs[returnedlogIndex]) + // tx.origin is the bundler + expect(log.args.txOrigin).to.eq(env.l2Wallet.address) + // msg.sender is the 4337 wallet + expect(log.args.msgSender).to.eq(account) + // message is received and emitted + expect(log.args.message).to.eq('hello') + const postCallTokenBalance = await L2_L1NativeToken.balanceOf(account) + const postCallDepositAmount = (await GPODepositPaymaster.depositInfo(account)).amount + const postCallEtherBalance = await env.l2Provider.getBalance(account) + + const returnedEPlogIndex = await getFilteredLogIndex( + receipt, + EntryPointJson.abi, + entryPointAddress, + 'UserOperationEvent' + ) + const logEP = EntryPoint.interface.parseLog(receipt.logs[returnedEPlogIndex]) + + // no token is used when approving, ether balance is used to pay approval fees + expect(preApproveTokenBalance).to.eq(postApproveTokenBalance) + expect(preApproveEtherBalance).to.gt(postApproveEtherBalance) + // users deposit amount on paymaster remains constant and is unused throughout + expect(preApproveDepositAmount).to.eq(postApproveDepositAmount) + expect(postApproveDepositAmount).to.eq(postCallDepositAmount) + // no ether is used when calling the recipient with the help of the paymaster, users boba token is used to pay + expect(postApproveEtherBalance).to.eq(postCallEtherBalance) + expect(postApproveTokenBalance).to.gt(postCallTokenBalance) + // account for l1 submission cost too + expect(BigNumber.from(postCallTokenBalance).add(logEP.args.actualGasCost)).to.closeTo(BigNumber.from(postApproveTokenBalance), utils.parseEther('0.3')) + }) + }) +}) diff --git a/integration-tests/test/alt-l2/boba_aa_wallet.spec.ts b/integration-tests/test/alt-l2/boba_aa_wallet.spec.ts new file mode 100644 index 0000000000..7f977405a6 --- /dev/null +++ b/integration-tests/test/alt-l2/boba_aa_wallet.spec.ts @@ -0,0 +1,205 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +chai.use(chaiAsPromised) +const expect = chai.expect + +import { Contract, ContractFactory, utils } from 'ethers' + +import { getFilteredLogIndex, l2Wallet } from './shared/utils' + +import { OptimismEnv } from './shared/env' +import { SimpleAccountAPI, wrapProvider } from '@bobanetwork/bundler_sdk' +import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' +import EntryPointWrapperJson from '@boba/accountabstraction/artifacts/contracts/bundler/EntryPointWrapper.sol/EntryPointWrapper.json' +import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' + +describe('AA Wallet Test\n', async () => { + let env: OptimismEnv + let SimpleAccount__factory: ContractFactory + let recipient: Contract + + let bundlerProvider: HttpRpcClient + let entryPointAddress: string + + let SampleRecipient__factory: ContractFactory + + before(async () => { + env = await OptimismEnv.new() + entryPointAddress = env.addressesAABOBA.L2_BOBA_EntryPoint + + SimpleAccount__factory = new ContractFactory( + SimpleAccountFactoryJson.abi, + SimpleAccountFactoryJson.bytecode, + env.l2Wallet + ) + + SampleRecipient__factory = new ContractFactory( + SampleRecipientJson.abi, + SampleRecipientJson.bytecode, + env.l2Wallet + ) + + recipient = await SampleRecipient__factory.deploy() + console.log('recipient', recipient.address) + + bundlerProvider = new HttpRpcClient( + env.bundlerUrl, + entryPointAddress, + await env.l2Wallet.provider.getNetwork().then((net) => net.chainId) + ) + }) + it('should be able to send a userOperation to a wallet through the bundler (low level api)', async () => { + // deploy a 4337 Wallet and send operation to this wallet + const accountFactory = await SimpleAccount__factory.deploy( + entryPointAddress, + { gasLimit: 9_500_000 } + ) + await accountFactory.deployed() + console.log('Account Factory deployed to:', accountFactory.address) + await accountFactory.createAccount(env.l2Wallet.address, 0) + const account = await accountFactory.getAddress(env.l2Wallet.address, 0) + console.log('Account deployed to:', account) + + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: account, + }) + + const accountAPI = new SimpleAccountAPI({ + provider: env.l2Provider, + entryPointAddress, + owner: env.l2Wallet, + accountAddress: account, + }) + + const op = await accountAPI.createSignedUserOp({ + target: recipient.address, + data: recipient.interface.encodeFunctionData('something', ['hello']), + }) + + expect(await op.sender).to.be.eq(account) + + const requestId = await bundlerProvider.sendUserOpToBundler(op) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + const receipt = await env.l2Provider.getTransactionReceipt(txid) + const returnedlogIndex = await getFilteredLogIndex( + receipt, + SampleRecipientJson.abi, + recipient.address, + 'Sender' + ) + const log = recipient.interface.parseLog(receipt.logs[returnedlogIndex]) + // tx.origin is the bundler + expect(log.args.txOrigin).to.eq(env.l2Wallet.address) + // msg.sender is the 4337 wallet + expect(log.args.msgSender).to.eq(account) + // message is received and emitted + expect(log.args.message).to.eq('hello') + }) + it('should be able to send a userOperation to a wallet through the bundler (high level api)', async () => { + // deploy an entryPointWrapper contract to get the create2 address on the provide + const EntryPointWrapper__factory = new ContractFactory( + EntryPointWrapperJson.abi, + EntryPointWrapperJson.bytecode, + env.l2Wallet + ) + + const entryPointWrapper = await EntryPointWrapper__factory.deploy(entryPointAddress) + + const aasigner = env.l2Provider.getSigner() + const config = { + chainId: await env.l2Provider.getNetwork().then(net => net.chainId), + entryPointAddress, + bundlerUrl: env.bundlerUrl + } + + const aaProvider = await wrapProvider(env.l2Provider, config, aasigner, entryPointWrapper.address, env.l2Wallet_3) + + const walletAddress = await aaProvider.getSigner().getAddress() + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: walletAddress, + }) + + recipient = recipient.connect(aaProvider.getSigner()) + const tx = await recipient.something('hello') + const receipt = await tx.wait() + const returnedlogIndex = await getFilteredLogIndex( + receipt, + SampleRecipientJson.abi, + recipient.address, + 'Sender' + ) + const log = recipient.interface.parseLog(receipt.logs[returnedlogIndex]) + // tx.origin is the bundler + expect(log.args.txOrigin).to.eq(env.l2Wallet.address) + // msg.sender is the 4337 wallet + expect(log.args.msgSender).to.eq(walletAddress) + // message is received and emitted + expect(log.args.message).to.eq('hello') + }) + it('should deploy a wallet if it does not exist through initCode', async () => { + // Deploy WalletDeployer + const accountFactory = await SimpleAccount__factory.deploy(entryPointAddress) + await accountFactory.deployed() + console.log('Account Factory deployed to:', accountFactory.address) + + // deploy an entryPointWrapper contract to get the create2 address on the provide + const EntryPointWrapper__factory = new ContractFactory( + EntryPointWrapperJson.abi, + EntryPointWrapperJson.bytecode, + env.l2Wallet + ) + + const entryPointWrapper = await EntryPointWrapper__factory.deploy(entryPointAddress) + + const accountAPI = new SimpleAccountAPI({ + provider: env.l2Provider, + entryPointAddress, + entryPointWrapperAddress: entryPointWrapper.address, + owner: env.l2Wallet_2, + factoryAddress: accountFactory.address, + }) + + const accountAddress = await accountAPI.getAccountAddress() + // computed address is correct + expect(accountAddress).to.be.eq(await accountFactory.getAddress(env.l2Wallet_2.address, 0)) + + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: accountAddress, + }) + + const op = await accountAPI.createSignedUserOp({ + target: recipient.address, + data: recipient.interface.encodeFunctionData('something', ['hello']), + }) + + expect(await op.sender).to.be.eq(accountAddress) + const preAccountCode = await env.l2Provider.getCode(op.sender) + expect(preAccountCode).to.be.eq('0x') + + const requestId = await bundlerProvider.sendUserOpToBundler(op) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + const receipt = await env.l2Provider.getTransactionReceipt(txid) + const returnedlogIndex = await getFilteredLogIndex( + receipt, + SampleRecipientJson.abi, + recipient.address, + 'Sender' + ) + const log = recipient.interface.parseLog(receipt.logs[returnedlogIndex]) + // tx.origin is the bundler + expect(log.args.txOrigin).to.eq(env.l2Wallet.address) + // msg.sender is the 4337 wallet + expect(log.args.msgSender).to.eq(accountAddress) + // message is received and emitted + expect(log.args.message).to.eq('hello') + + const postAccountCode = await env.l2Provider.getCode(op.sender) + expect(postAccountCode).to.be.not.eq('0x') + }) +}) diff --git a/integration-tests/test/alt-l2/bobalink.spec.ts b/integration-tests/test/alt-l2/bobalink.spec.ts index f92020bb5d..15b47854ef 100644 --- a/integration-tests/test/alt-l2/bobalink.spec.ts +++ b/integration-tests/test/alt-l2/bobalink.spec.ts @@ -14,6 +14,7 @@ const fetch = require('node-fetch') import { OptimismEnv } from './shared/env' import { waitForAndExecute } from './shared/utils' +import { Server } from 'http' describe('BobaLink Test\n', async () => { let env: OptimismEnv @@ -33,17 +34,24 @@ describe('BobaLink Test\n', async () => { gasLimit: 1000000, } - const addOracle = async (contract: Contract, oracleAddr: string, adminAddr: string, roundId = 0) => { + const addOracle = async ( + contract: Contract, + oracleAddr: string, + adminAddr: string, + roundId = 0 + ) => { const admin = await contract.getAdmin() if (admin === '0x0000000000000000000000000000000000000000') { - await contract.setOracle( - oracleAddr, - adminAddr, - roundId - ) + await contract.setOracle(oracleAddr, adminAddr, roundId) } } + let server: Server + + after(async () => { + await server.close(console.error) + }) + before(async () => { env = await OptimismEnv.new() @@ -80,10 +88,20 @@ describe('BobaLink Test\n', async () => { ) await BobaOracleHC.updateHCHelper(TuringHelper.address) - await BobaOracleHC.updateHCChainLinkPriceFeedAddr(BobaChainLinkOracle.address) + await BobaOracleHC.updateHCChainLinkPriceFeedAddr( + BobaChainLinkOracle.address + ) - await addOracle(BobaOracleHC, BobaChainLinkOracle.address, env.l2BobalinkWallet.address) - await addOracle(BobaChainLinkOracle, BobaChainLinkOracle.address, env.l2Wallet.address) + await addOracle( + BobaOracleHC, + BobaChainLinkOracle.address, + env.l2BobalinkWallet.address + ) + await addOracle( + BobaChainLinkOracle, + BobaChainLinkOracle.address, + env.l2Wallet.address + ) await TuringHelper.addPermittedCaller(BobaOracleHC.address) @@ -107,7 +125,7 @@ describe('BobaLink Test\n', async () => { const http = require('http') const ip = require("ip") // start local server - const server = module.exports = http.createServer(async function (req, res) { + server = module.exports = http.createServer(async function (req, res) { if (req.headers['content-type'] === 'application/json') { @@ -269,8 +287,13 @@ describe('BobaLink Test\n', async () => { await BobaOracleHC.updateHCUrl(`${URL}/fake`) const admin = await BobaOracleHC.getAdmin() const HCUrl = await BobaOracleHC.HCUrl() - await BobaOracleHC.connect(env.l2BobalinkWallet).estimateGas.getChainLinkQuote(lastRoundId) - await BobaOracleHC.connect(env.l2BobalinkWallet).getChainLinkQuote(lastRoundId, gasOverride) + await BobaOracleHC.connect( + env.l2BobalinkWallet + ).estimateGas.getChainLinkQuote(lastRoundId) + await BobaOracleHC.connect(env.l2BobalinkWallet).getChainLinkQuote( + lastRoundId, + gasOverride + ) const block = await env.l2Provider.getBlockNumber() const chainLinkQuoteEvents = await BobaOracleHC.queryFilter( BobaOracleHC.filters.ChainLinkQuoteGot(), @@ -299,7 +322,9 @@ describe('BobaLink Test\n', async () => { ) expect(latestAnswer).to.be.eq(price) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 1) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 1) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 1 + ) } await waitForAndExecute(test, 10) }) @@ -345,7 +370,9 @@ describe('BobaLink Test\n', async () => { expect(prevAnswer.answer).to.be.eq(price1) expect(latestAnswer.answer).to.be.eq(price2) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 2) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 2) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 2 + ) } await waitForAndExecute(test, 10) }) @@ -368,7 +395,9 @@ describe('BobaLink Test\n', async () => { ) expect(latestAnswer).to.be.eq(price) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 1) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 1) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 1 + ) } await waitForAndExecute(test, 10) }) @@ -395,7 +424,9 @@ describe('BobaLink Test\n', async () => { expect(prevAnswer.answer).to.be.eq(price1) expect(latestAnswer.answer).to.be.eq(price2) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 2) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 2) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 2 + ) } await waitForAndExecute(test, 10) }) diff --git a/integration-tests/test/alt-l2/erc1155_bridge.spec.ts b/integration-tests/test/alt-l2/erc1155_bridge.spec.ts index 24cc409580..cd0718527b 100644 --- a/integration-tests/test/alt-l2/erc1155_bridge.spec.ts +++ b/integration-tests/test/alt-l2/erc1155_bridge.spec.ts @@ -3,7 +3,11 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, ContractFactory, utils } from 'ethers' -import { getBobaContractAt, getBobaContractABI, deployBobaContractCore } from '@boba/contracts' +import { + getBobaContractAt, + getBobaContractABI, + deployBobaContractCore, +} from '@boba/contracts' import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -249,7 +253,9 @@ describe('ERC1155 Bridge Test', async () => { await approveTX.wait() const exitFee = await BOBABillingContract.exitFee() - const L2ERC1155BridgeABI = await getBobaContractABI('L2ERC1155BridgeAltL1') + const L2ERC1155BridgeABI = await getBobaContractABI( + 'L2ERC1155BridgeAltL1' + ) const withdrawTx = await env.waitForXDomainTransaction( L2Bridge.connect(env.l2Wallet_2).withdraw( @@ -954,7 +960,7 @@ describe('ERC1155 Bridge Test', async () => { const L2ERC1155Test = await deployBobaContractCore( 'L1ERC1155', [DUMMY_URI_1], - env.l2Wallet, + env.l2Wallet ) const mintTx = await L2ERC1155Test.mint( @@ -1436,7 +1442,9 @@ describe('ERC1155 Bridge Test', async () => { ) await env.waitForXDomainTransaction(backTx) - const L2ERC1155BridgeABI = await getBobaContractABI('L2ERC1155BridgeAltL1') + const L2ERC1155BridgeABI = await getBobaContractABI( + 'L2ERC1155BridgeAltL1' + ) // check event DepositFailed is emittted const returnedlogIndex = await getFilteredLogIndex( diff --git a/integration-tests/test/alt-l2/mrf_lp.spec.ts b/integration-tests/test/alt-l2/mrf_lp.spec.ts index b2a176ede9..7e976e30b7 100644 --- a/integration-tests/test/alt-l2/mrf_lp.spec.ts +++ b/integration-tests/test/alt-l2/mrf_lp.spec.ts @@ -4,7 +4,11 @@ chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, BigNumber, utils } from 'ethers' import { getContractFactory, predeploys } from '@eth-optimism/contracts' -import { deployBobaContractCore, getBobaContractABI, getBobaContractAt } from '@boba/contracts' +import { + deployBobaContractCore, + getBobaContractABI, + getBobaContractAt, +} from '@boba/contracts' import { expectLogs, getGasLimitOption } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -60,26 +64,31 @@ describe('Liquidity Pool Test', async () => { L1ERC20 = await deployBobaContractCore( 'L1ERC20', [initialSupply, tokenName, tokenSymbol, 18], - env.l1Wallet, + env.l1Wallet ) OMGLIkeToken = await deployBobaContractCore( 'OMGLikeToken', [], - env.l1Wallet, + env.l1Wallet ) - const Factory__L2ERC20 = getContractFactory( - 'L2StandardERC20', - env.l2Wallet - ) + const Factory__L2ERC20 = getContractFactory('L2StandardERC20', env.l2Wallet) L2ERC20 = await Factory__L2ERC20.deploy( - L2StandardBridgeAddress, L1ERC20.address, tokenName, tokenSymbol, 18, + L2StandardBridgeAddress, + L1ERC20.address, + tokenName, + tokenSymbol, + 18 ) await L2ERC20.deployTransaction.wait() L2OMGLikeToken = await Factory__L2ERC20.deploy( - L2StandardBridgeAddress, OMGLIkeToken.address, 'OMG', 'OMG', 18, + L2StandardBridgeAddress, + OMGLIkeToken.address, + 'OMG', + 'OMG', + 18 ) await L2OMGLikeToken.deployTransaction.wait() @@ -254,7 +263,9 @@ describe('Liquidity Pool Test', async () => { '0x0000000000000000000000000000000000000000' ) // console.log(poolETHInfo.l2TokenAddress) - expect(poolETHInfo.l2TokenAddress).to.deep.eq(predeploys.L2_L1NativeToken_ALT_L1) + expect(poolETHInfo.l2TokenAddress).to.deep.eq( + predeploys.L2_L1NativeToken_ALT_L1 + ) }) it('should register L2 the pool', async () => { @@ -276,7 +287,9 @@ describe('Liquidity Pool Test', async () => { expect(poolETHInfo.l1TokenAddress).to.deep.eq( '0x0000000000000000000000000000000000000000' ) - expect(poolETHInfo.l2TokenAddress).to.deep.eq(predeploys.L2_L1NativeToken_ALT_L1) + expect(poolETHInfo.l2TokenAddress).to.deep.eq( + predeploys.L2_L1NativeToken_ALT_L1 + ) }) it('shouldnt update the pool', async () => { @@ -1684,7 +1697,11 @@ describe('Liquidity Pool Test', async () => { env.l2Wallet ) L2ERC20 = await Factory__L2ERC20.deploy( - L2StandardBridgeAddress, L1ERC20.address, tokenName, tokenSymbol, 18 + L2StandardBridgeAddress, + L1ERC20.address, + tokenName, + tokenSymbol, + 18 ) await L2ERC20.deployTransaction.wait() diff --git a/integration-tests/test/alt-l2/nft_bridge.spec.ts b/integration-tests/test/alt-l2/nft_bridge.spec.ts index 300a683d1c..23b5f9470c 100644 --- a/integration-tests/test/alt-l2/nft_bridge.spec.ts +++ b/integration-tests/test/alt-l2/nft_bridge.spec.ts @@ -3,7 +3,11 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, utils, BigNumber } from 'ethers' -import { deployBobaContractCore, getBobaContractABI, getBobaContractAt } from '@boba/contracts' +import { + deployBobaContractCore, + getBobaContractABI, + getBobaContractAt, +} from '@boba/contracts' import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -95,7 +99,10 @@ describe('NFT Bridge Test', async () => { const ownerL1 = await L1ERC721.ownerOf(DUMMY_TOKEN_ID) const ownerL2 = await L2ERC721.ownerOf(DUMMY_TOKEN_ID) - const depositMap = await L1Bridge.deposits(L1ERC721.address, DUMMY_TOKEN_ID) + const depositMap = await L1Bridge.deposits( + L1ERC721.address, + DUMMY_TOKEN_ID + ) expect(ownerL1).to.deep.eq(L1Bridge.address) expect(ownerL2).to.deep.eq(env.l2Wallet.address) @@ -159,7 +166,10 @@ describe('NFT Bridge Test', async () => { const ownerL1 = await L1ERC721.ownerOf(DUMMY_TOKEN_ID) expect(ownerL1).to.be.deep.eq(env.l2Wallet_2.address) - const depositMap = await L1Bridge.deposits(L1ERC721.address, DUMMY_TOKEN_ID) + const depositMap = await L1Bridge.deposits( + L1ERC721.address, + DUMMY_TOKEN_ID + ) expect(depositMap).to.deep.eq(ethers.constants.AddressZero) }) @@ -484,7 +494,7 @@ describe('NFT Bridge Test', async () => { env.l2Wallet_2.address, DUMMY_TOKEN_ID, 9999999, - { value: exitFee.sub(BigNumber.from('1'))} + { value: exitFee.sub(BigNumber.from('1')) } ) ).to.be.revertedWith('Insufficient Boba amount') }) @@ -781,7 +791,10 @@ describe('NFT Bridge Test', async () => { }) it('should deposit NFT to L2 when approved for all', async () => { - const approveTx = await L1ERC721.setApprovalForAll(env.l1Wallet_2.address, true) + const approveTx = await L1ERC721.setApprovalForAll( + env.l1Wallet_2.address, + true + ) await approveTx.wait() await env.waitForXDomainTransaction( @@ -2034,7 +2047,9 @@ describe('NFT Bridge Test', async () => { const exitFee = await BOBABillingContract.exitFee() await env.waitForRevertXDomainTransactionL1( - L2Bridge.withdraw(L2ERC721.address, DUMMY_TOKEN_ID, 9999999, { value: exitFee }) + L2Bridge.withdraw(L2ERC721.address, DUMMY_TOKEN_ID, 9999999, { + value: exitFee, + }) ) await expect(L1ERC721.ownerOf(DUMMY_TOKEN_ID)).to.be.revertedWith( diff --git a/integration-tests/test/alt-l2/routed_exit_fee.spec.ts b/integration-tests/test/alt-l2/routed_exit_fee.spec.ts index 6a12f4f517..eeef4df110 100644 --- a/integration-tests/test/alt-l2/routed_exit_fee.spec.ts +++ b/integration-tests/test/alt-l2/routed_exit_fee.spec.ts @@ -44,7 +44,7 @@ describe('Standard Exit Fee', async () => { ExitFeeContract = await deployBobaContractCore( 'DiscretionaryExitFeeAltL1', [L2StandardBridgeAddress], - env.l2Wallet, + env.l2Wallet ) await ExitFeeContract.configureBillingContractAddress( @@ -55,13 +55,13 @@ describe('Standard Exit Fee', async () => { L1ERC20 = await deployBobaContractCore( 'L1ERC20', [initialSupply, tokenName, tokenSymbol, 18], - env.l1Wallet, + env.l1Wallet ) OMGLIkeToken = await deployBobaContractCore( 'OMGLikeToken', [], - env.l1Wallet, + env.l1Wallet ) Factory__L2ERC20 = getContractFactory('L2StandardERC20', env.l2Wallet) diff --git a/integration-tests/test/alt-l2/selfdestruct.spec.ts b/integration-tests/test/alt-l2/selfdestruct.spec.ts index b5a83e2184..d66e51c639 100644 --- a/integration-tests/test/alt-l2/selfdestruct.spec.ts +++ b/integration-tests/test/alt-l2/selfdestruct.spec.ts @@ -267,11 +267,7 @@ describe('SSTORE tests', async () => { before(async () => { env = await OptimismEnv.new() - SSTORETest = await ethers.deployContract( - 'TestDeleteSlot', - [], - env.l2Wallet - ) + SSTORETest = await ethers.deployContract('TestDeleteSlot', [], env.l2Wallet) Boba_GasPriceOracle = getContractFactory('Boba_GasPriceOracle') .attach(predeploys.Proxy__Boba_GasPriceOracle) diff --git a/integration-tests/test/alt-l2/shared/env.ts b/integration-tests/test/alt-l2/shared/env.ts index b24994a65a..342b8e735a 100644 --- a/integration-tests/test/alt-l2/shared/env.ts +++ b/integration-tests/test/alt-l2/shared/env.ts @@ -5,7 +5,11 @@ import { TransactionReceipt, } from '@ethersproject/providers' import { sleep } from '@eth-optimism/core-utils' -import { CrossChainMessenger, MessageStatus, MessageDirection } from '@eth-optimism/sdk' +import { + CrossChainMessenger, + MessageStatus, + MessageDirection, +} from '@eth-optimism/sdk' /* Imports: Internal */ import { @@ -26,6 +30,8 @@ import { getL1Bridge, getBASEDeployerAddresses, getBOBADeployerAddresses, + getAABOBADeployerAddresses, + BUNDLER_URL, } from './utils' export interface CrossDomainMessagePair { @@ -40,8 +46,11 @@ export class OptimismEnv { // L1 Contracts addressesBASE addressesBOBA + addressesAABOBA: any l1Bridge: Contract + bundlerUrl: string + // L2 Contracts L2BOBA: Contract @@ -67,6 +76,7 @@ export class OptimismEnv { constructor(args: any) { this.addressesBASE = args.addressesBASE this.addressesBOBA = args.addressesBOBA + this.addressesAABOBA = args.addressesAABOBA this.l1Bridge = args.l1Bridge this.L2BOBA = args.L2BOBA this.l1Wallet = args.l1Wallet @@ -84,11 +94,15 @@ export class OptimismEnv { this.l2Provider = args.l2Provider this.verifierProvider = args.verifierProvider this.replicaProvider = args.replicaProvider + this.bundlerUrl = args.bundlerUrl } static async new(): Promise { const addressesBASE = await getBASEDeployerAddresses() const addressesBOBA = await getBOBADeployerAddresses() + const addressesAABOBA = await getAABOBADeployerAddresses() + + const bundlerUrl = BUNDLER_URL const l1Bridge = await getL1Bridge( l1Wallet, @@ -116,6 +130,7 @@ export class OptimismEnv { return new OptimismEnv({ addressesBASE, addressesBOBA, + addressesAABOBA, messenger, messengerFast, L2BOBA, @@ -133,6 +148,7 @@ export class OptimismEnv { verifierProvider, replicaProvider, l1Bridge, + bundlerUrl, }) } @@ -318,7 +334,9 @@ export class OptimismEnv { tx: Promise | TransactionResponse ) { const { remoteReceipt } = await this.waitForXDomainTransaction(tx) - const backTx = await this.messenger.l2Provider.getTransaction(remoteReceipt.transactionHash) + const backTx = await this.messenger.l2Provider.getTransaction( + remoteReceipt.transactionHash + ) await this.waitForXDomainTransaction(backTx) } @@ -326,7 +344,9 @@ export class OptimismEnv { tx: Promise | TransactionResponse ) { const { remoteReceipt } = await this.waitForXDomainTransaction(tx) - const backTx = await this.messenger.l1Provider.getTransaction(remoteReceipt.transactionHash) + const backTx = await this.messenger.l1Provider.getTransaction( + remoteReceipt.transactionHash + ) await this.waitForXDomainTransaction(backTx) } diff --git a/integration-tests/test/alt-l2/shared/utils.ts b/integration-tests/test/alt-l2/shared/utils.ts index b478e65f4d..fee5a13c50 100644 --- a/integration-tests/test/alt-l2/shared/utils.ts +++ b/integration-tests/test/alt-l2/shared/utils.ts @@ -8,7 +8,7 @@ import { utils, constants, } from 'ethers' -import { getContractInterface,predeploys } from '@eth-optimism/contracts' +import { getContractInterface, predeploys } from '@eth-optimism/contracts' import { remove0x, sleep } from '@eth-optimism/core-utils' import { asL2Provider } from '@eth-optimism/sdk' import { cleanEnv, str, num, bool, makeValidator } from 'envalid' @@ -24,13 +24,9 @@ export const isLiveNetwork = () => { } export const HARDHAT_CHAIN_ID = 31337 -export const MOONBEAM_CHAIN_ID = 1281 -export const FANTOM_CHAIN_ID = 4003 export const AVALANCHE_CHAIN_ID = 43112 export const BNB_CHAIN_ID = 99 export const NON_ETHEREUM_CHAIN = [ - MOONBEAM_CHAIN_ID, - FANTOM_CHAIN_ID, AVALANCHE_CHAIN_ID, BNB_CHAIN_ID, ] @@ -212,6 +208,26 @@ if (!process.env.BASE_URL) { export const BASE_URL = process.env.BASE_URL || 'http://127.0.0.1:8080/addresses.json' +if (!process.env.AA_BOBA_URL) { + console.log(`!!You did not set process.env.AA_BOBA_URL!!`) + console.log(`Setting to default value of http://127.0.0.1:8080/aa-addr.json`) +} else { + console.log(`process.env.AA_BOBA_URL set to:`, process.env.AA_BOBA_URL) +} + +export const AA_BOBA_URL = + process.env.AA_BOBA_URL || 'http://127.0.0.1:8080/aa-addr.json' + +if (!process.env.BUNDLER_URL) { + console.log(`!!You did not set process.env.BUNDLER_URL!!`) + console.log(`Setting to default value of http://localhost:3000/rpc`) +} else { + console.log(`process.env.BUNDLER_URL set to:`, process.env.BUNDLER_URL) +} + +export const BUNDLER_URL = + process.env.BUNDLER_URL || 'http://localhost:3000/rpc' + // Gets the bridge contract export const getL1Bridge = async (wallet: Wallet, bridgeAddress: string) => { const l1BridgeInterface = getContractInterface('L1StandardBridgeAltL1') @@ -348,6 +364,14 @@ export const getBOBADeployerAddresses = async () => { return JSON.parse(result) } +export const getAABOBADeployerAddresses = async () => { + const options = { + uri: AA_BOBA_URL, + } + const result = await request.get(options) + return JSON.parse(result) +} + export const expectLogs = async ( receipt, emitterAbi, @@ -414,7 +438,7 @@ export const getFilteredLogIndex = async ( (log) => log.topics.length > 0 && log.topics[0] === eventTopic && - (!emitterAddress || log.address === emitterAddress) + (!emitterAddress || log.address.toLowerCase() === emitterAddress.toLowerCase()) ) return filteredLogs[0].logIndex diff --git a/integration-tests/test/alt-l2/turing.spec.ts b/integration-tests/test/alt-l2/turing.spec.ts index 09f8311e57..3b1c506d6e 100644 --- a/integration-tests/test/alt-l2/turing.spec.ts +++ b/integration-tests/test/alt-l2/turing.spec.ts @@ -8,7 +8,7 @@ chai.use(solidity) import { OptimismEnv } from './shared/env' import { verifyStateRoots } from './shared/state-root-verification' -import { Server } from "http"; +import { Server } from 'http' describe('Turing 256 Bit Random Number Test', async () => { let env: OptimismEnv @@ -52,11 +52,7 @@ describe('Turing 256 Bit Random Number Test', async () => { env.l2Wallet ) - TuringHelper = await ethers.deployContract( - 'TuringHelper', - [], - env.l2Wallet - ) + TuringHelper = await ethers.deployContract('TuringHelper', [], env.l2Wallet) console.log(' Helper contract deployed at', TuringHelper.address) await TuringHelper.deployTransaction.wait() @@ -156,8 +152,12 @@ describe('Turing 256 Bit Random Number Test', async () => { ) ) - const postL1BOBABalance = await L1BOBAToken.balanceOf(env.l1Wallet.address) - const postL2BOBABalance = await L2BOBAToken.balanceOf(env.l2Wallet.address) + const postL1BOBABalance = await L1BOBAToken.balanceOf( + env.l1Wallet.address + ) + const postL2BOBABalance = await L2BOBAToken.balanceOf( + env.l2Wallet.address + ) expect(preL1BOBABalance).to.deep.eq( postL1BOBABalance.add(depositBOBAAmount) @@ -211,9 +211,7 @@ describe('Turing 256 Bit Random Number Test', async () => { it('should be funded for two transactions', async () => { const txPrice = await BobaTuringCredit.turingPrice() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(txPrice.mul(2)) }) @@ -229,12 +227,10 @@ describe('Turing 256 Bit Random Number Test', async () => { .timeout(100000) .retries(3) - // The price of one transaction should have been deducted, leaving 1 - it('should now be funded for one transaction', async () => { + // The price of one transaction should have been deducted, leaving 1 + it('should now be funded for one transaction', async () => { const txPrice = await BobaTuringCredit.turingPrice() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(txPrice) }) @@ -243,9 +239,7 @@ describe('Turing 256 Bit Random Number Test', async () => { const tr = await random.getRandom() const res = await tr.wait() expect(res).to.be.ok - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(1) }) @@ -259,9 +253,7 @@ describe('Turing 256 Bit Random Number Test', async () => { { value: depositAmount } ) await depositTx.wait() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.at.least(txPrice.mul(6)) }) @@ -273,7 +265,7 @@ describe('Turing 256 Bit Random Number Test', async () => { await random.estimateGas.MixedInput(URL, 123, 999) expect(1).to.equal(0) } catch (e) { - expect(e.error.toString()).to.contain("SERVER_ERROR") + expect(e.error.toString()).to.contain('SERVER_ERROR') } }) @@ -283,7 +275,7 @@ describe('Turing 256 Bit Random Number Test', async () => { const tr = await random.NestedRandom(1) expect(1).to.equal(0) } catch (e) { - expect(e.error.toString()).to.contain("SERVER_ERROR") + expect(e.error.toString()).to.contain('SERVER_ERROR') } }) diff --git a/integration-tests/test/eth-l2/basic_nft.spec.ts b/integration-tests/test/eth-l2/basic_nft.spec.ts index c810d5fdf8..0900dfda3e 100644 --- a/integration-tests/test/eth-l2/basic_nft.spec.ts +++ b/integration-tests/test/eth-l2/basic_nft.spec.ts @@ -100,7 +100,7 @@ describe('NFT Test\n', async () => { BigNumber.from(String(0)), //starting index for the tokenIDs ERC721.address, UUID, - 'BOBA_Goerli_2888' + 'BOBA_Goerli_2888', ], env.l2Wallet ) diff --git a/integration-tests/test/eth-l2/boba_aa_fee_alt_token.spec.ts b/integration-tests/test/eth-l2/boba_aa_fee_alt_token.spec.ts index b6fb2ad580..7a670e6de9 100644 --- a/integration-tests/test/eth-l2/boba_aa_fee_alt_token.spec.ts +++ b/integration-tests/test/eth-l2/boba_aa_fee_alt_token.spec.ts @@ -10,13 +10,13 @@ import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' import { hexConcat, hexZeroPad, parseEther } from 'ethers/lib/utils' // use local sdk -import { SimpleAccountAPI } from '@boba/bundler_sdk' +import { SimpleAccountAPI } from '@bobanetwork/bundler_sdk' import SenderCreatorJson from '@boba/accountabstraction/artifacts/contracts/core/SenderCreator.sol/SenderCreator.json' import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' import L2StandardERC20Json from '@eth-optimism/contracts/artifacts/contracts/standards/L2StandardERC20.sol/L2StandardERC20.json' import EntryPointJson from '@boba/accountabstraction/artifacts/contracts/core/EntryPoint.sol/EntryPoint.json' import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' -import { HttpRpcClient } from '@boba/bundler_sdk/dist/HttpRpcClient' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' import ManualDepositPaymasterJson from '@boba/accountabstraction/artifacts/contracts/samples/ManualDepositPaymaster.sol/ManualDepositPaymaster.json' @@ -62,9 +62,18 @@ describe('AA Alt Fee Token Test\n', async () => { ) // set bridge as wallet_2 to easily mint - L2ERC20Token = await L2ERC20Token__factory.deploy(env.l2Wallet_2.address, env.l2Wallet_2.address, 'PEARL', 'PEARL', 18) + L2ERC20Token = await L2ERC20Token__factory.deploy( + env.l2Wallet_2.address, + env.l2Wallet_2.address, + 'PEARL', + 'PEARL', + 18 + ) // mint tokens to wallet - await L2ERC20Token.connect(env.l2Wallet_2).mint(env.l2Wallet.address, utils.parseEther('500')) + await L2ERC20Token.connect(env.l2Wallet_2).mint( + env.l2Wallet.address, + utils.parseEther('500') + ) bundlerProvider = new HttpRpcClient( env.bundlerUrl, @@ -79,7 +88,7 @@ describe('AA Alt Fee Token Test\n', async () => { ) ManualDepositPaymaster = await ManualDepositPaymaster__factory.deploy( - entryPointAddress, + entryPointAddress ) // add alt erc20 token @@ -110,81 +119,105 @@ describe('AA Alt Fee Token Test\n', async () => { let postApproveDepositAmount let postApproveEtherBalance let signedOp + let tokenDifference + + before( + 'the paymaster operator sets up the paymaster by staking and adding deposits', + async () => { + await ManualDepositPaymaster.addStake(1, { + value: utils.parseEther('2'), + }) + await EntryPoint.depositTo(ManualDepositPaymaster.address, { + value: utils.parseEther('1'), + }) + } + ) - before('the paymaster operator sets up the paymaster by staking and adding deposits', async () => { - await ManualDepositPaymaster.addStake(1, { value: utils.parseEther('2') }) - await EntryPoint.depositTo(ManualDepositPaymaster.address, { - value: utils.parseEther('1') - }) - }) - - before('the user approves the paymaster to spend their $BOBA token', async () => { - // deploy a 4337 Wallet and send operation to this wallet - SimpleAccountFactory__factory = new ContractFactory( - SimpleAccountFactoryJson.abi, - SimpleAccountFactoryJson.bytecode, - env.l2Wallet - ) - accountFactory = await SimpleAccountFactory__factory.deploy( - entryPointAddress - ) - await accountFactory.deployed() - console.log('Account Factory deployed to:', accountFactory.address) - await accountFactory.createAccount(env.l2Wallet.address, 0) - account = await accountFactory.getAddress(env.l2Wallet.address, 0) - console.log('Account deployed to:', account) - // const SenderCreator__factory = new ContractFactory( - // SenderCreatorJson.abi, - // SenderCreatorJson.bytecode, - // env.l2Wallet - // ) - // const senderCreator = await SenderCreator__factory.deploy() - // console.log('Sender Creator Factory deployed to:', senderCreator.address) - - await L2ERC20Token.transfer(account, utils.parseEther('1')) - - await L2ERC20Token.approve(ManualDepositPaymaster.address, constants.MaxUint256) - await ManualDepositPaymaster.addDepositFor(L2ERC20Token.address, account, utils.parseEther('2')) - - //the account approves the paymaster to use its tokens (in order for the paymaster to deduct fees from the account) - // this approve operation needs gas (in eth) because this step does not involve a paymaster - await env.l2Wallet.sendTransaction({ - value: utils.parseEther('2'), - to: account, - }) - - accountAPI = new SimpleAccountAPI({ - provider: env.l2Provider, - entryPointAddress, - //senderCreatorAddress: senderCreator.address, - owner: env.l2Wallet, - accountAddress: account - }) - - const approveOp = await accountAPI.createSignedUserOp({ + before( + 'the user approves the paymaster to spend their $BOBA token', + async () => { + // deploy a 4337 Wallet and send operation to this wallet + SimpleAccountFactory__factory = new ContractFactory( + SimpleAccountFactoryJson.abi, + SimpleAccountFactoryJson.bytecode, + env.l2Wallet + ) + accountFactory = await SimpleAccountFactory__factory.deploy( + entryPointAddress + ) + await accountFactory.deployed() + console.log('Account Factory deployed to:', accountFactory.address) + await accountFactory.createAccount(env.l2Wallet.address, 0) + account = await accountFactory.getAddress(env.l2Wallet.address, 0) + console.log('Account deployed to:', account) + + await L2ERC20Token.transfer(account, utils.parseEther('1')) + + await L2ERC20Token.approve( + ManualDepositPaymaster.address, + constants.MaxUint256 + ) + await ManualDepositPaymaster.addDepositFor( + L2ERC20Token.address, + account, + utils.parseEther('2') + ) + + //the account approves the paymaster to use its tokens (in order for the paymaster to deduct fees from the account) + // this approve operation needs gas (in eth) because this step does not involve a paymaster + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: account, + }) + + accountAPI = new SimpleAccountAPI({ + provider: env.l2Provider, + entryPointAddress, + owner: env.l2Wallet, + accountAddress: account, + }) + + const approveOp = await accountAPI.createSignedUserOp({ target: L2ERC20Token.address, - data: L2ERC20Token.interface.encodeFunctionData('approve', [ManualDepositPaymaster.address, constants.MaxUint256]), - }) - - preApproveTokenBalance = await L2ERC20Token.balanceOf(account) - preApproveDepositAmount = (await ManualDepositPaymaster.depositInfo(L2ERC20Token.address, account)).amount - preApproveEtherBalance = await env.l2Provider.getBalance(account) - - const requestId = await bundlerProvider.sendUserOpToBundler(approveOp) - const txid = await accountAPI.getUserOpReceipt(requestId) - console.log('reqId', requestId, 'txid=', txid) - - postApproveTokenBalance = await L2ERC20Token.balanceOf(account) - postApproveDepositAmount = (await ManualDepositPaymaster.depositInfo(L2ERC20Token.address, account)).amount - postApproveEtherBalance = await env.l2Provider.getBalance(account) - }) + data: L2ERC20Token.interface.encodeFunctionData('approve', [ + ManualDepositPaymaster.address, + constants.MaxUint256, + ]), + }) + + preApproveTokenBalance = await L2ERC20Token.balanceOf(account) + preApproveDepositAmount = ( + await ManualDepositPaymaster.depositInfo( + L2ERC20Token.address, + account + ) + ).amount + preApproveEtherBalance = await env.l2Provider.getBalance(account) + + const requestId = await bundlerProvider.sendUserOpToBundler(approveOp) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + + postApproveTokenBalance = await L2ERC20Token.balanceOf(account) + postApproveDepositAmount = ( + await ManualDepositPaymaster.depositInfo( + L2ERC20Token.address, + account + ) + ).amount + postApproveEtherBalance = await env.l2Provider.getBalance(account) + } + ) it('should be able to submit a userOp including the paymaster to the bundler and trigger tx', async () => { const op = await accountAPI.createUnsignedUserOp({ target: recipient.address, data: recipient.interface.encodeFunctionData('something', ['hello']), }) - op.paymasterAndData = hexConcat([ManualDepositPaymaster.address, hexZeroPad(L2ERC20Token.address, 20)]) + op.paymasterAndData = hexConcat([ + ManualDepositPaymaster.address, + hexZeroPad(L2ERC20Token.address, 20), + ]) op.preVerificationGas = await accountAPI.getPreVerificationGas(op) signedOp = await accountAPI.signUserOp(op) @@ -208,7 +241,10 @@ describe('AA Alt Fee Token Test\n', async () => { // message is received and emitted expect(log.args.message).to.eq('hello') const postCallTokenBalance = await L2ERC20Token.balanceOf(account) - const postCallDepositAmount = (await ManualDepositPaymaster.depositInfo(L2ERC20Token.address, account)).amount + tokenDifference = postApproveTokenBalance.sub(postCallTokenBalance) + const postCallDepositAmount = ( + await ManualDepositPaymaster.depositInfo(L2ERC20Token.address, account) + ).amount const postCallEtherBalance = await env.l2Provider.getBalance(account) const returnedEPlogIndex = await getFilteredLogIndex( @@ -217,7 +253,9 @@ describe('AA Alt Fee Token Test\n', async () => { entryPointAddress, 'UserOperationEvent' ) - const logEP = EntryPoint.interface.parseLog(receipt.logs[returnedEPlogIndex]) + const logEP = EntryPoint.interface.parseLog( + receipt.logs[returnedEPlogIndex] + ) // no token is used when approving, ether balance is used to pay approval fees expect(preApproveTokenBalance).to.eq(postApproveTokenBalance) @@ -228,7 +266,32 @@ describe('AA Alt Fee Token Test\n', async () => { // no ether is used when calling the recipient with the help of the paymaster, users boba token is used to pay expect(postApproveEtherBalance).to.eq(postCallEtherBalance) expect(postApproveTokenBalance).to.gt(postCallTokenBalance) - expect(BigNumber.from(postCallTokenBalance).add(logEP.args.actualGasCost)).to.closeTo(BigNumber.from(postApproveTokenBalance), utils.parseEther('0.0001')) + expect( + BigNumber.from(postCallTokenBalance).add(logEP.args.actualGasCost) + ).to.closeTo( + BigNumber.from(postApproveTokenBalance), + utils.parseEther('0.0001') + ) + }) + it('should not allow a non-owner to withdraw paymaster tokens', async () => { + const ownerDeposits = await ManualDepositPaymaster.balances(L2ERC20Token.address, env.l2Wallet.address) + expect (ownerDeposits).to.be.eq(tokenDifference) + + await expect( + ManualDepositPaymaster.connect(env.l2Wallet_2).withdrawTokensTo(L2ERC20Token.address, env.l2Wallet_2.address, ownerDeposits) + ).to.be.reverted + }) + it('should allow the paymaster owner to withdraw paymaster tokens', async () => { + const ownerDeposits = await ManualDepositPaymaster.balances(L2ERC20Token.address, env.l2Wallet.address) + expect(ownerDeposits).to.be.eq(tokenDifference) + + const preTokenBalance = await L2ERC20Token.balanceOf(env.l2Wallet.address) + await ManualDepositPaymaster.connect(env.l2Wallet).withdrawTokensTo(L2ERC20Token.address, env.l2Wallet.address, ownerDeposits) + const postTokenBalance = await L2ERC20Token.balanceOf(env.l2Wallet.address) + + expect(postTokenBalance).to.be.eq(preTokenBalance.add(ownerDeposits)) + const currentOwnerDeposits = await ManualDepositPaymaster.balances(L2ERC20Token.address, env.l2Wallet.address) + expect(currentOwnerDeposits).to.be.eq(0) }) }) }) diff --git a/integration-tests/test/eth-l2/boba_aa_fee_boba.spec.ts b/integration-tests/test/eth-l2/boba_aa_fee_boba.spec.ts index 48ca6ecfa0..e0b1b466a2 100644 --- a/integration-tests/test/eth-l2/boba_aa_fee_boba.spec.ts +++ b/integration-tests/test/eth-l2/boba_aa_fee_boba.spec.ts @@ -10,14 +10,14 @@ import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' import { hexConcat, hexZeroPad, parseEther } from 'ethers/lib/utils' // use local sdk -import { SimpleAccountAPI } from '@boba/bundler_sdk' +import { SimpleAccountAPI } from '@bobanetwork/bundler_sdk' import SenderCreatorJson from '@boba/accountabstraction/artifacts/contracts/core/SenderCreator.sol/SenderCreator.json' import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' import MockFeedRegistryJson from '@boba/accountabstraction/artifacts/contracts/test/mocks/MockFeedRegistry.sol/MockFeedRegistry.json' import L2GovernanceERC20Json from '@boba/contracts/artifacts/contracts/standards/L2GovernanceERC20.sol/L2GovernanceERC20.json' import EntryPointJson from '@boba/accountabstraction/artifacts/contracts/core/EntryPoint.sol/EntryPoint.json' import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' -import { HttpRpcClient } from '@boba/bundler_sdk/dist/HttpRpcClient' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' import BobaDepositPaymasterJson from '@boba/accountabstraction/artifacts/contracts/samples/BobaDepositPaymaster.sol/BobaDepositPaymaster.json' @@ -54,9 +54,9 @@ describe('AA Boba as Fee token Test\n', async () => { recipient = await SampleRecipient__factory.deploy() L2BOBAToken = new Contract( - env.addressesBOBA.TOKENS.BOBA.L2, - L2GovernanceERC20Json.abi, - env.l2Wallet + env.addressesBOBA.TOKENS.BOBA.L2, + L2GovernanceERC20Json.abi, + env.l2Wallet ) bundlerProvider = new HttpRpcClient( @@ -87,11 +87,11 @@ describe('AA Boba as Fee token Test\n', async () => { // add boba token await BobaDepositPaymaster.addToken( - L2BOBAToken.address, - // tokenPrice oracle - PriceOracle.address, - L2BOBAToken.address, - 18 + L2BOBAToken.address, + // tokenPrice oracle + PriceOracle.address, + L2BOBAToken.address, + 18 ) EntryPoint = new Contract( @@ -114,73 +114,83 @@ describe('AA Boba as Fee token Test\n', async () => { let postApproveEtherBalance let signedOp - before('the paymaster operator sets up the paymaster by staking and adding deposits', async () => { - await BobaDepositPaymaster.addStake(1, { value: utils.parseEther('2') }) - await EntryPoint.depositTo(BobaDepositPaymaster.address, { - value: utils.parseEther('1') - }) - }) + before( + 'the paymaster operator sets up the paymaster by staking and adding deposits', + async () => { + await BobaDepositPaymaster.addStake(1, { value: utils.parseEther('2') }) + await EntryPoint.depositTo(BobaDepositPaymaster.address, { + value: utils.parseEther('1'), + }) + } + ) - before('the user approves the paymaster to spend their $BOBA token', async () => { - // deploy a 4337 Wallet and send operation to this wallet - SimpleAccount__factory = new ContractFactory( - SimpleAccountFactoryJson.abi, - SimpleAccountFactoryJson.bytecode, - env.l2Wallet - ) - accountFactory = await SimpleAccount__factory.deploy( - entryPointAddress - ) - await accountFactory.deployed() - console.log('Account Factory deployed to:', accountFactory.address) - await accountFactory.createAccount(env.l2Wallet.address, 0) - account = await accountFactory.getAddress(env.l2Wallet.address, 0) - console.log('Account deployed to:', account) - const SenderCreator__factory = new ContractFactory( - SenderCreatorJson.abi, - SenderCreatorJson.bytecode, + before( + 'the user approves the paymaster to spend their $BOBA token', + async () => { + // deploy a 4337 Wallet and send operation to this wallet + SimpleAccount__factory = new ContractFactory( + SimpleAccountFactoryJson.abi, + SimpleAccountFactoryJson.bytecode, env.l2Wallet ) - const senderCreator = await SenderCreator__factory.deploy() - console.log('Sender Creator Factory deployed to:', senderCreator.address) - - await L2BOBAToken.transfer(account, utils.parseEther('1')) - - await L2BOBAToken.approve(BobaDepositPaymaster.address, constants.MaxUint256) - await BobaDepositPaymaster.addDepositFor(L2BOBAToken.address, account, utils.parseEther('2')) - - //the account approves the paymaster to use its tokens (in order for the paymaster to deduct fees from the account) - // this approve operation needs gas (in eth) because this step does not involve a paymaster - await env.l2Wallet.sendTransaction({ - value: utils.parseEther('2'), - to: account, - }) - - accountAPI = new SimpleAccountAPI({ - provider: env.l2Provider, - entryPointAddress, - senderCreatorAddress: senderCreator.address, - owner: env.l2Wallet, - accountAddress: account - }) + accountFactory = await SimpleAccount__factory.deploy(entryPointAddress) + await accountFactory.deployed() + console.log('Account Factory deployed to:', accountFactory.address) + await accountFactory.createAccount(env.l2Wallet.address, 0) + account = await accountFactory.getAddress(env.l2Wallet.address, 0) + console.log('Account deployed to:', account) + + await L2BOBAToken.transfer(account, utils.parseEther('1')) + + await L2BOBAToken.approve( + BobaDepositPaymaster.address, + constants.MaxUint256 + ) + await BobaDepositPaymaster.addDepositFor( + L2BOBAToken.address, + account, + utils.parseEther('2') + ) - const approveOp = await accountAPI.createSignedUserOp({ + //the account approves the paymaster to use its tokens (in order for the paymaster to deduct fees from the account) + // this approve operation needs gas (in eth) because this step does not involve a paymaster + await env.l2Wallet.sendTransaction({ + value: utils.parseEther('2'), + to: account, + }) + + accountAPI = new SimpleAccountAPI({ + provider: env.l2Provider, + entryPointAddress, + owner: env.l2Wallet, + accountAddress: account, + }) + + const approveOp = await accountAPI.createSignedUserOp({ target: L2BOBAToken.address, - data: L2BOBAToken.interface.encodeFunctionData('approve', [BobaDepositPaymaster.address, constants.MaxUint256]), - }) - - preApproveTokenBalance = await L2BOBAToken.balanceOf(account) - preApproveDepositAmount = (await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account)).amount - preApproveEtherBalance = await env.l2Provider.getBalance(account) - - const requestId = await bundlerProvider.sendUserOpToBundler(approveOp) - const txid = await accountAPI.getUserOpReceipt(requestId) - console.log('reqId', requestId, 'txid=', txid) - - postApproveTokenBalance = await L2BOBAToken.balanceOf(account) - postApproveDepositAmount = (await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account)).amount - postApproveEtherBalance = await env.l2Provider.getBalance(account) - }) + data: L2BOBAToken.interface.encodeFunctionData('approve', [ + BobaDepositPaymaster.address, + constants.MaxUint256, + ]), + }) + + preApproveTokenBalance = await L2BOBAToken.balanceOf(account) + preApproveDepositAmount = ( + await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account) + ).amount + preApproveEtherBalance = await env.l2Provider.getBalance(account) + + const requestId = await bundlerProvider.sendUserOpToBundler(approveOp) + const txid = await accountAPI.getUserOpReceipt(requestId) + console.log('reqId', requestId, 'txid=', txid) + + postApproveTokenBalance = await L2BOBAToken.balanceOf(account) + postApproveDepositAmount = ( + await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account) + ).amount + postApproveEtherBalance = await env.l2Provider.getBalance(account) + } + ) it('should be able to submit a userOp including the paymaster to the bundler and trigger tx', async () => { const op = await accountAPI.createUnsignedUserOp({ target: recipient.address, @@ -188,7 +198,10 @@ describe('AA Boba as Fee token Test\n', async () => { }) // TODO: check why paymasterAndData does not work when added to the walletAPI - op.paymasterAndData = hexConcat([BobaDepositPaymaster.address, hexZeroPad(L2BOBAToken.address, 20)]) + op.paymasterAndData = hexConcat([ + BobaDepositPaymaster.address, + hexZeroPad(L2BOBAToken.address, 20), + ]) op.preVerificationGas = await accountAPI.getPreVerificationGas(op) signedOp = await accountAPI.signUserOp(op) @@ -211,7 +224,9 @@ describe('AA Boba as Fee token Test\n', async () => { // message is received and emitted expect(log.args.message).to.eq('hello') const postCallTokenBalance = await L2BOBAToken.balanceOf(account) - const postCallDepositAmount = (await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account)).amount + const postCallDepositAmount = ( + await BobaDepositPaymaster.depositInfo(L2BOBAToken.address, account) + ).amount const postCallEtherBalance = await env.l2Provider.getBalance(account) const returnedEPlogIndex = await getFilteredLogIndex( @@ -220,7 +235,9 @@ describe('AA Boba as Fee token Test\n', async () => { entryPointAddress, 'UserOperationEvent' ) - const logEP = EntryPoint.interface.parseLog(receipt.logs[returnedEPlogIndex]) + const logEP = EntryPoint.interface.parseLog( + receipt.logs[returnedEPlogIndex] + ) // no token is used when approving, ether balance is used to pay approval fees expect(preApproveTokenBalance).to.eq(postApproveTokenBalance) @@ -231,7 +248,12 @@ describe('AA Boba as Fee token Test\n', async () => { // no ether is used when calling the recipient with the help of the paymaster, users boba token is used to pay expect(postApproveEtherBalance).to.eq(postCallEtherBalance) expect(postApproveTokenBalance).to.gt(postCallTokenBalance) - expect(BigNumber.from(postCallTokenBalance).add(logEP.args.actualGasCost)).to.closeTo(BigNumber.from(postApproveTokenBalance), utils.parseEther('0.0001')) + expect( + BigNumber.from(postCallTokenBalance).add(logEP.args.actualGasCost) + ).to.closeTo( + BigNumber.from(postApproveTokenBalance), + utils.parseEther('0.0001') + ) }) }) }) diff --git a/integration-tests/test/eth-l2/boba_aa_sponsoring_fee.spec.ts b/integration-tests/test/eth-l2/boba_aa_sponsoring_fee.spec.ts index a0a5fe26cc..f0f93bbdc4 100644 --- a/integration-tests/test/eth-l2/boba_aa_sponsoring_fee.spec.ts +++ b/integration-tests/test/eth-l2/boba_aa_sponsoring_fee.spec.ts @@ -10,12 +10,13 @@ import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' import { hexConcat, defaultAbiCoder } from 'ethers/lib/utils' // use local sdk -import { SimpleAccountAPI } from '@boba/bundler_sdk' +import { SimpleAccountAPI } from '@bobanetwork/bundler_sdk' import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' import EntryPointJson from '@boba/accountabstraction/artifacts/contracts/core/EntryPoint.sol/EntryPoint.json' import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' import SenderCreatorJson from '@boba/accountabstraction/artifacts/contracts/core/SenderCreator.sol/SenderCreator.json' -import { HttpRpcClient } from '@boba/bundler_sdk/dist/HttpRpcClient' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' +import EntryPointWrapperJson from '@boba/accountabstraction/artifacts/contracts/bundler/EntryPointWrapper.sol/EntryPointWrapper.json' import VerifyingPaymasterJson from '@boba/accountabstraction/artifacts/contracts/samples/VerifyingPaymaster.sol/VerifyingPaymaster.json' @@ -84,12 +85,15 @@ describe('Sponsoring Tx\n', async () => { let signedOp let account - before('the paymaster operator sets up the paymaster by staking and adding deposits', async () => { - await VerifyingPaymaster.addStake(1, { value: utils.parseEther('2') }) - await EntryPoint.depositTo(VerifyingPaymaster.address, { - value: utils.parseEther('1') - }) - }) + before( + 'the paymaster operator sets up the paymaster by staking and adding deposits', + async () => { + await VerifyingPaymaster.addStake(1, { value: utils.parseEther('2') }) + await EntryPoint.depositTo(VerifyingPaymaster.address, { + value: utils.parseEther('1'), + }) + } + ) before('account is created and accountAPI is setup', async () => { // deploy a 4337 Wallet and send operation to this wallet const accountFactory = await SimpleAccount__factory.deploy( @@ -98,46 +102,63 @@ describe('Sponsoring Tx\n', async () => { await accountFactory.deployed() console.log('Account Factory deployed to:', accountFactory.address) - // deploy a senderCreator contract to get the create2 address on the provide - const SenderCreator__factory = new ContractFactory( - SenderCreatorJson.abi, - SenderCreatorJson.bytecode, - env.l2Wallet_4 + const EntryPointWrapper__factory = new ContractFactory( + EntryPointWrapperJson.abi, + EntryPointWrapperJson.bytecode, + env.l2Wallet_4 ) - const senderCreator = await SenderCreator__factory.deploy() + const entryPointWrapper = await EntryPointWrapper__factory.deploy( + entryPointAddress + ) accountAPI = new SimpleAccountAPI({ provider: env.l2Provider, entryPointAddress, - senderCreatorAddress: senderCreator.address, + entryPointWrapperAddress: entryPointWrapper.address, owner: env.l2Wallet_4, factoryAddress: accountFactory.address, }) }) it('should be able to submit a userOp to the bundler and trigger tx', async () => { - const validUntil = (await env.l2Provider.getBlock('latest')).timestamp + 600 - const validAfter = (await env.l2Provider.getBlock('latest')).timestamp - 600 + const validUntil = + (await env.l2Provider.getBlock('latest')).timestamp + 600 + const validAfter = + (await env.l2Provider.getBlock('latest')).timestamp - 600 const op = await accountAPI.createSignedUserOp({ target: recipient.address, data: recipient.interface.encodeFunctionData('something', ['hello']), }) // add preverificaiton gas to account for paymaster signature - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), '0x' + '00'.repeat(65)]) - op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add(3000) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + '0x' + '00'.repeat(65), + ]) + op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add( + 3000 + ) const hash = await VerifyingPaymaster.getHash(op, validUntil, validAfter) const sig = await offchainSigner.signMessage(utils.arrayify(hash)) - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), sig]) - const res = await VerifyingPaymaster.parsePaymasterAndData(op.paymasterAndData) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + sig, + ]) + const res = await VerifyingPaymaster.parsePaymasterAndData( + op.paymasterAndData + ) expect(res.signature).to.eq(sig) expect(res.validAfter).to.eq(validAfter) expect(res.validUntil).to.eq(validUntil) signedOp = await accountAPI.signUserOp(op) - const preUserBalance = await env.l2Provider.getBalance(env.l2Wallet_4.address) + const preUserBalance = await env.l2Provider.getBalance( + env.l2Wallet_4.address + ) const prePaymasterDeposit = await VerifyingPaymaster.getDeposit() const requestId = await bundlerProvider.sendUserOpToBundler(signedOp) @@ -164,66 +185,100 @@ describe('Sponsoring Tx\n', async () => { entryPointAddress, 'UserOperationEvent' ) - const logEP = EntryPoint.interface.parseLog(receipt.logs[returnedEPlogIndex]) - const postUserBalance = await env.l2Provider.getBalance(env.l2Wallet_4.address) + const logEP = EntryPoint.interface.parseLog( + receipt.logs[returnedEPlogIndex] + ) + const postUserBalance = await env.l2Provider.getBalance( + env.l2Wallet_4.address + ) const postPaymasterDeposit = await VerifyingPaymaster.getDeposit() expect(postUserBalance).to.eq(preUserBalance) - expect(postPaymasterDeposit).to.eq(prePaymasterDeposit.sub(logEP.args.actualGasCost)) + expect(postPaymasterDeposit).to.eq( + prePaymasterDeposit.sub(logEP.args.actualGasCost) + ) }) it('should not be able to submit a userOp to the bundler and trigger tx when signature expired', async () => { - const validUntil = (await env.l2Provider.getBlock('latest')).timestamp - 300 - const validAfter = (await env.l2Provider.getBlock('latest')).timestamp - 600 + const validUntil = + (await env.l2Provider.getBlock('latest')).timestamp - 300 + const validAfter = + (await env.l2Provider.getBlock('latest')).timestamp - 600 const op = await accountAPI.createSignedUserOp({ target: recipient.address, data: recipient.interface.encodeFunctionData('something', ['hello']), }) // add preverificaiton gas to account for paymaster signature - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), '0x' + '00'.repeat(65)]) - op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add(3000) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + '0x' + '00'.repeat(65), + ]) + op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add( + 3000 + ) const hash = await VerifyingPaymaster.getHash(op, validUntil, validAfter) const sig = await offchainSigner.signMessage(utils.arrayify(hash)) - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), sig]) - const res = await VerifyingPaymaster.parsePaymasterAndData(op.paymasterAndData) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + sig, + ]) + const res = await VerifyingPaymaster.parsePaymasterAndData( + op.paymasterAndData + ) expect(res.signature).to.eq(sig) expect(res.validAfter).to.eq(validAfter) expect(res.validUntil).to.eq(validUntil) signedOp = await accountAPI.signUserOp(op) - await expect(bundlerProvider.sendUserOpToBundler(signedOp)).to.be.rejectedWith( - Error, /expires too soon/ - ) + await expect( + bundlerProvider.sendUserOpToBundler(signedOp) + ).to.be.rejectedWith(Error, /expires too soon/) }) it('should not be able to submit a userOp to the bundler and trigger tx when signature is not valid yet', async () => { - const validUntil = (await env.l2Provider.getBlock('latest')).timestamp + 800 - const validAfter = (await env.l2Provider.getBlock('latest')).timestamp + 600 + const validUntil = + (await env.l2Provider.getBlock('latest')).timestamp + 800 + const validAfter = + (await env.l2Provider.getBlock('latest')).timestamp + 600 const op = await accountAPI.createSignedUserOp({ target: recipient.address, data: recipient.interface.encodeFunctionData('something', ['hello']), }) // add preverificaiton gas to account for paymaster signature - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), '0x' + '00'.repeat(65)]) - op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add(3000) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + '0x' + '00'.repeat(65), + ]) + op.preVerificationGas = BigNumber.from(await op.preVerificationGas).add( + 3000 + ) const hash = await VerifyingPaymaster.getHash(op, validUntil, validAfter) const sig = await offchainSigner.signMessage(utils.arrayify(hash)) - op.paymasterAndData = hexConcat([VerifyingPaymaster.address, defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), sig]) - const res = await VerifyingPaymaster.parsePaymasterAndData(op.paymasterAndData) + op.paymasterAndData = hexConcat([ + VerifyingPaymaster.address, + defaultAbiCoder.encode(['uint48', 'uint48'], [validUntil, validAfter]), + sig, + ]) + const res = await VerifyingPaymaster.parsePaymasterAndData( + op.paymasterAndData + ) expect(res.signature).to.eq(sig) expect(res.validAfter).to.eq(validAfter) expect(res.validUntil).to.eq(validUntil) signedOp = await accountAPI.signUserOp(op) - await expect(bundlerProvider.sendUserOpToBundler(signedOp)).to.be.rejectedWith( - Error, /not valid yet/ - ) + await expect( + bundlerProvider.sendUserOpToBundler(signedOp) + ).to.be.rejectedWith(Error, /not valid yet/) }) }) }) diff --git a/integration-tests/test/eth-l2/boba_aa_wallet.spec.ts b/integration-tests/test/eth-l2/boba_aa_wallet.spec.ts index d311ecef27..f5094a0adf 100644 --- a/integration-tests/test/eth-l2/boba_aa_wallet.spec.ts +++ b/integration-tests/test/eth-l2/boba_aa_wallet.spec.ts @@ -9,11 +9,11 @@ import { getFilteredLogIndex, l2Wallet } from './shared/utils' import { OptimismEnv } from './shared/env' // use local sdk -import { SimpleAccountAPI, wrapProvider } from '@boba/bundler_sdk' +import { SimpleAccountAPI, wrapProvider } from '@bobanetwork/bundler_sdk' import SimpleAccountFactoryJson from '@boba/accountabstraction/artifacts/contracts/samples/SimpleAccountFactory.sol/SimpleAccountFactory.json' -import SenderCreatorJson from '@boba/accountabstraction/artifacts/contracts/core/SenderCreator.sol/SenderCreator.json' +import EntryPointWrapperJson from '@boba/accountabstraction/artifacts/contracts/bundler/EntryPointWrapper.sol/EntryPointWrapper.json' import SampleRecipientJson from '../../artifacts/contracts/SampleRecipient.sol/SampleRecipient.json' -import { HttpRpcClient } from '@boba/bundler_sdk/dist/HttpRpcClient' +import { HttpRpcClient } from '@bobanetwork/bundler_sdk/dist/HttpRpcClient' describe('AA Wallet Test\n', async () => { let env: OptimismEnv @@ -63,11 +63,11 @@ describe('AA Wallet Test\n', async () => { console.log('Account deployed to:', account) const accountAPI = new SimpleAccountAPI({ - provider: env.l2Provider, - entryPointAddress, - owner: env.l2Wallet, - accountAddress: account - }) + provider: env.l2Provider, + entryPointAddress, + owner: env.l2Wallet, + accountAddress: account, + }) const op = await accountAPI.createSignedUserOp({ target: recipient.address, @@ -98,28 +98,36 @@ describe('AA Wallet Test\n', async () => { expect(log.args.message).to.eq('hello') }) it('should be able to send a userOperation to a wallet through the bundler (high level api)', async () => { - // deploy a senderCreator contract to get the create2 address on the provide - const SenderCreator__factory = new ContractFactory( - SenderCreatorJson.abi, - SenderCreatorJson.bytecode, - env.l2Wallet + // deploy an entryPointWrapper contract to get the create2 address on the provide + const EntryPointWrapper__factory = new ContractFactory( + EntryPointWrapperJson.abi, + EntryPointWrapperJson.bytecode, + env.l2Wallet ) - const senderCreator = await SenderCreator__factory.deploy() + const entryPointWrapper = await EntryPointWrapper__factory.deploy( + entryPointAddress + ) const aasigner = env.l2Provider.getSigner() const config = { - chainId: await env.l2Provider.getNetwork().then(net => net.chainId), - entryPointAddress, - bundlerUrl: env.bundlerUrl + chainId: await env.l2Provider.getNetwork().then((net) => net.chainId), + entryPointAddress, + bundlerUrl: env.bundlerUrl, } - const aaProvider = await wrapProvider(env.l2Provider, config, aasigner, env.l2Wallet_3, senderCreator.address) + const aaProvider = await wrapProvider( + env.l2Provider, + config, + aasigner, + entryPointWrapper.address, + env.l2Wallet_3 + ) const walletAddress = await aaProvider.getSigner().getAddress() await env.l2Wallet.sendTransaction({ - value: utils.parseEther('2'), - to: walletAddress, + value: utils.parseEther('2'), + to: walletAddress, }) recipient = recipient.connect(aaProvider.getSigner()) @@ -140,24 +148,27 @@ describe('AA Wallet Test\n', async () => { expect(log.args.message).to.eq('hello') }) it('should deploy a wallet if it does not exist through initCode', async () => { - - const accountFactory = await SimpleAccount__factory.deploy(entryPointAddress) + const accountFactory = await SimpleAccount__factory.deploy( + entryPointAddress + ) await accountFactory.deployed() console.log('Account Factory deployed to:', accountFactory.address) - // deploy a senderCreator contract to get the create2 address on the provide - const SenderCreator__factory = new ContractFactory( - SenderCreatorJson.abi, - SenderCreatorJson.bytecode, - env.l2Wallet + // deploy an entryPointWrapper contract to get the create2 address on the provide + const EntryPointWrapper__factory = new ContractFactory( + EntryPointWrapperJson.abi, + EntryPointWrapperJson.bytecode, + env.l2Wallet ) - const senderCreator = await SenderCreator__factory.deploy() + const entryPointWrapper = await EntryPointWrapper__factory.deploy( + entryPointAddress + ) const accountAPI = new SimpleAccountAPI({ provider: env.l2Provider, entryPointAddress, - senderCreatorAddress: senderCreator.address, + entryPointWrapperAddress: entryPointWrapper.address, owner: env.l2Wallet_2, factoryAddress: accountFactory.address, }) @@ -165,7 +176,9 @@ describe('AA Wallet Test\n', async () => { const accountAddress = await accountAPI.getAccountAddress() // computed address is correct - expect(accountAddress).to.be.eq(await accountFactory.getAddress(env.l2Wallet_2.address, 0)) + expect(accountAddress).to.be.eq( + await accountFactory.getAddress(env.l2Wallet_2.address, 0) + ) await env.l2Wallet.sendTransaction({ value: utils.parseEther('2'), diff --git a/integration-tests/test/eth-l2/bobalink.spec.ts b/integration-tests/test/eth-l2/bobalink.spec.ts index 36e62c33d9..f34257ba04 100644 --- a/integration-tests/test/eth-l2/bobalink.spec.ts +++ b/integration-tests/test/eth-l2/bobalink.spec.ts @@ -37,14 +37,15 @@ describe('BobaLink Test\n', async () => { gasLimit: 1000000, } - const addOracle = async (contract: Contract, oracleAddr: string, adminAddr: string, roundId = 0) => { + const addOracle = async ( + contract: Contract, + oracleAddr: string, + adminAddr: string, + roundId = 0 + ) => { const admin = await contract.getAdmin() if (admin === '0x0000000000000000000000000000000000000000') { - await contract.setOracle( - oracleAddr, - adminAddr, - roundId - ) + await contract.setOracle(oracleAddr, adminAddr, roundId) } } @@ -101,10 +102,26 @@ describe('BobaLink Test\n', async () => { await EthOracleHC.updateHCChainLinkPriceFeedAddr(EthChainLinkOracle.address) await BtcOracleHC.updateHCChainLinkPriceFeedAddr(BtcChainLinkOracle.address) - await addOracle(EthOracleHC, EthChainLinkOracle.address, env.l2BobalinkWallet.address) - await addOracle(BtcOracleHC, BtcChainLinkOracle.address, env.l2BobalinkWallet.address) - await addOracle(EthChainLinkOracle, EthChainLinkOracle.address, env.l2Wallet.address) - await addOracle(BtcChainLinkOracle, BtcChainLinkOracle.address, env.l2Wallet.address) + await addOracle( + EthOracleHC, + EthChainLinkOracle.address, + env.l2BobalinkWallet.address + ) + await addOracle( + BtcOracleHC, + BtcChainLinkOracle.address, + env.l2BobalinkWallet.address + ) + await addOracle( + EthChainLinkOracle, + EthChainLinkOracle.address, + env.l2Wallet.address + ) + await addOracle( + BtcChainLinkOracle, + BtcChainLinkOracle.address, + env.l2Wallet.address + ) await TuringHelper.addPermittedCaller(EthOracleHC.address) await TuringHelper.addPermittedCaller(BtcOracleHC.address) @@ -295,8 +312,13 @@ describe('BobaLink Test\n', async () => { it('should get quote via Hybrid Compute', async () => { const lastRoundId = (await EthChainLinkOracle.latestRound()).toNumber() await EthOracleHC.updateHCUrl(`${URL}/fake`) - await EthOracleHC.connect(env.l2BobalinkWallet).estimateGas.getChainLinkQuote(lastRoundId) - await EthOracleHC.connect(env.l2BobalinkWallet).getChainLinkQuote(lastRoundId, gasOverride) + await EthOracleHC.connect( + env.l2BobalinkWallet + ).estimateGas.getChainLinkQuote(lastRoundId) + await EthOracleHC.connect(env.l2BobalinkWallet).getChainLinkQuote( + lastRoundId, + gasOverride + ) const block = await env.l2Provider.getBlockNumber() const chainLinkQuoteEvents = await EthOracleHC.queryFilter( EthOracleHC.filters.ChainLinkQuoteGot(), @@ -325,7 +347,9 @@ describe('BobaLink Test\n', async () => { ) expect(latestAnswer).to.be.eq(price) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 1) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 1) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 1 + ) } await waitForAndExecute(test, 10) }) @@ -371,7 +395,9 @@ describe('BobaLink Test\n', async () => { expect(prevAnswer.answer).to.be.eq(price1) expect(latestAnswer.answer).to.be.eq(price2) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 2) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 2) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 2 + ) } await waitForAndExecute(test, 10) }) @@ -394,7 +420,9 @@ describe('BobaLink Test\n', async () => { ) expect(latestAnswer).to.be.eq(price) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 1) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 1) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 1 + ) } await waitForAndExecute(test, 10) }) @@ -421,7 +449,9 @@ describe('BobaLink Test\n', async () => { expect(prevAnswer.answer).to.be.eq(price1) expect(latestAnswer.answer).to.be.eq(price2) expect(chainLinkQuoteEvents[0].args.CLRoundId).to.equal(lastRoundId + 2) - expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq(lastRoundId + 2) + expect(chainLinkQuoteEvents[0].args.CLLatestRoundId).to.eq( + lastRoundId + 2 + ) } await waitForAndExecute(test, 10) }) diff --git a/integration-tests/test/eth-l2/erc1155_bridge.spec.ts b/integration-tests/test/eth-l2/erc1155_bridge.spec.ts index 6410b5ec59..002ac6bbe5 100644 --- a/integration-tests/test/eth-l2/erc1155_bridge.spec.ts +++ b/integration-tests/test/eth-l2/erc1155_bridge.spec.ts @@ -3,7 +3,11 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, ContractFactory, utils } from 'ethers' -import { getBobaContractAt, getBobaContractABI, deployBobaContractCore } from '@boba/contracts' +import { + getBobaContractAt, + getBobaContractABI, + deployBobaContractCore, +} from '@boba/contracts' import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -1011,7 +1015,7 @@ describe('ERC1155 Bridge Test', async () => { const L2ERC1155Test = await deployBobaContractCore( 'L1ERC1155', [DUMMY_URI_1], - env.l2Wallet, + env.l2Wallet ) const mintTx = await L2ERC1155Test.mint( diff --git a/integration-tests/test/eth-l2/mrf_lp.spec.ts b/integration-tests/test/eth-l2/mrf_lp.spec.ts index 6ce9f79c68..7b1e5d5d67 100644 --- a/integration-tests/test/eth-l2/mrf_lp.spec.ts +++ b/integration-tests/test/eth-l2/mrf_lp.spec.ts @@ -4,7 +4,11 @@ chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, ContractFactory, BigNumber, utils } from 'ethers' import { getContractFactory } from '@eth-optimism/contracts' -import { deployBobaContractCore, getBobaContractABI, getBobaContractAt } from '@boba/contracts' +import { + deployBobaContractCore, + getBobaContractABI, + getBobaContractAt, +} from '@boba/contracts' import { expectLogs } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -58,32 +62,36 @@ describe('Liquidity Pool Test', async () => { L1ERC20 = await deployBobaContractCore( 'L1ERC20', [initialSupply, tokenName, tokenSymbol, 18], - env.l1Wallet, + env.l1Wallet ) await L1ERC20.deployTransaction.wait() OMGLIkeToken = await deployBobaContractCore( 'OMGLikeToken', [], - env.l1Wallet, + env.l1Wallet ) await OMGLIkeToken.deployTransaction.wait() - const Factory__L2ERC20 = getContractFactory( - 'L2StandardERC20', - env.l2Wallet - ) + const Factory__L2ERC20 = getContractFactory('L2StandardERC20', env.l2Wallet) L2ERC20 = await Factory__L2ERC20.deploy( - L2StandardBridgeAddress, L1ERC20.address, tokenName, tokenSymbol, 18, + L2StandardBridgeAddress, + L1ERC20.address, + tokenName, + tokenSymbol, + 18 ) await L2ERC20.deployTransaction.wait() L2OMGLikeToken = await Factory__L2ERC20.deploy( - L2StandardBridgeAddress, OMGLIkeToken.address, 'OMG', 'OMG', 18, + L2StandardBridgeAddress, + OMGLIkeToken.address, + 'OMG', + 'OMG', + 18 ) await L2OMGLikeToken.deployTransaction.wait() - L1LiquidityPool = await getBobaContractAt( 'L1LiquidityPool', env.addressesBOBA.Proxy__L1LiquidityPool, diff --git a/integration-tests/test/eth-l2/nft_bridge.spec.ts b/integration-tests/test/eth-l2/nft_bridge.spec.ts index aa37d8d363..3a35824228 100644 --- a/integration-tests/test/eth-l2/nft_bridge.spec.ts +++ b/integration-tests/test/eth-l2/nft_bridge.spec.ts @@ -3,7 +3,11 @@ import chaiAsPromised from 'chai-as-promised' chai.use(chaiAsPromised) import { ethers } from 'hardhat' import { Contract, utils } from 'ethers' -import { deployBobaContractCore, getBobaContractABI, getBobaContractAt } from '@boba/contracts' +import { + deployBobaContractCore, + getBobaContractABI, + getBobaContractAt, +} from '@boba/contracts' import { getFilteredLogIndex } from './shared/utils' import { OptimismEnv } from './shared/env' @@ -102,7 +106,10 @@ describe('NFT Bridge Test', async () => { const ownerL1 = await L1ERC721.ownerOf(DUMMY_TOKEN_ID) const ownerL2 = await L2ERC721.ownerOf(DUMMY_TOKEN_ID) - const depositMap = await L1Bridge.deposits(L1ERC721.address, DUMMY_TOKEN_ID) + const depositMap = await L1Bridge.deposits( + L1ERC721.address, + DUMMY_TOKEN_ID + ) expect(ownerL1).to.deep.eq(L1Bridge.address) expect(ownerL2).to.deep.eq(env.l2Wallet.address) @@ -189,7 +196,10 @@ describe('NFT Bridge Test', async () => { const ownerL1 = await L1ERC721.ownerOf(DUMMY_TOKEN_ID) expect(ownerL1).to.be.deep.eq(env.l2Wallet_2.address) - const depositMap = await L1Bridge.deposits(L1ERC721.address, DUMMY_TOKEN_ID) + const depositMap = await L1Bridge.deposits( + L1ERC721.address, + DUMMY_TOKEN_ID + ) expect(depositMap).to.deep.eq(ethers.constants.AddressZero) }) diff --git a/integration-tests/test/eth-l2/pool_dao_actions.spec.ts b/integration-tests/test/eth-l2/pool_dao_actions.spec.ts index ac975677b4..0d1306ff27 100644 --- a/integration-tests/test/eth-l2/pool_dao_actions.spec.ts +++ b/integration-tests/test/eth-l2/pool_dao_actions.spec.ts @@ -108,7 +108,7 @@ describe('Dao Action Test', async () => { GovernorBravoDelegate.address, governor_voting_period, // VOTING PERIOD - duration of the voting period in seconds governor_voting_delay, // VOTING DELAY - time between when a proposal is proposed and when the voting period starts, in seconds - governor_proposal_threshold // the votes necessary to propose + governor_proposal_threshold, // the votes necessary to propose ], env.l2Wallet ) diff --git a/integration-tests/test/eth-l2/routed_exit_fee.spec.ts b/integration-tests/test/eth-l2/routed_exit_fee.spec.ts index 3e4cda160f..3c47dad15e 100644 --- a/integration-tests/test/eth-l2/routed_exit_fee.spec.ts +++ b/integration-tests/test/eth-l2/routed_exit_fee.spec.ts @@ -43,7 +43,7 @@ describe('Standard Exit Fee', async () => { ExitFeeContract = await deployBobaContractCore( 'DiscretionaryExitFee', [L2StandardBridgeAddress], - env.l2Wallet, + env.l2Wallet ) await ExitFeeContract.configureBillingContractAddress( @@ -54,13 +54,13 @@ describe('Standard Exit Fee', async () => { L1ERC20 = await deployBobaContractCore( 'L1ERC20', [initialSupply, tokenName, tokenSymbol, 18], - env.l1Wallet, + env.l1Wallet ) OMGLIkeToken = await deployBobaContractCore( 'OMGLikeToken', [], - env.l1Wallet, + env.l1Wallet ) Factory__L2ERC20 = getContractFactory('L2StandardERC20', env.l2Wallet) diff --git a/integration-tests/test/eth-l2/shared/env.ts b/integration-tests/test/eth-l2/shared/env.ts index e98213dad0..a58e44898d 100644 --- a/integration-tests/test/eth-l2/shared/env.ts +++ b/integration-tests/test/eth-l2/shared/env.ts @@ -342,7 +342,9 @@ export class OptimismEnv { tx: Promise | TransactionResponse ) { const { remoteReceipt } = await this.waitForXDomainTransaction(tx) - const backTx = await this.messenger.l2Provider.getTransaction(remoteReceipt.transactionHash) + const backTx = await this.messenger.l2Provider.getTransaction( + remoteReceipt.transactionHash + ) await this.waitForXDomainTransaction(backTx) } @@ -350,7 +352,9 @@ export class OptimismEnv { tx: Promise | TransactionResponse ) { const { remoteReceipt } = await this.waitForXDomainTransaction(tx) - const backTx = await this.messenger.l1Provider.getTransaction(remoteReceipt.transactionHash) + const backTx = await this.messenger.l1Provider.getTransaction( + remoteReceipt.transactionHash + ) await this.waitForXDomainTransaction(backTx) } } diff --git a/integration-tests/test/eth-l2/shared/utils.ts b/integration-tests/test/eth-l2/shared/utils.ts index 0c5086bd56..dedb6f525e 100644 --- a/integration-tests/test/eth-l2/shared/utils.ts +++ b/integration-tests/test/eth-l2/shared/utils.ts @@ -8,7 +8,7 @@ import { utils, constants, } from 'ethers' -import { getContractInterface,predeploys } from '@eth-optimism/contracts' +import { getContractInterface, predeploys } from '@eth-optimism/contracts' import { remove0x, sleep } from '@eth-optimism/core-utils' import { CrossChainMessenger, @@ -443,7 +443,8 @@ export const getFilteredLogIndex = async ( (log) => log.topics.length > 0 && log.topics[0] === eventTopic && - (!emitterAddress || log.address.toLowerCase() === emitterAddress.toLowerCase()) + (!emitterAddress || + log.address.toLowerCase() === emitterAddress.toLowerCase()) ) return filteredLogs[0].logIndex @@ -452,7 +453,7 @@ export const getFilteredLogIndex = async ( export const waitForAndExecute = async ( fn: () => Promise, repeat: number, - intervalMs?: number, + intervalMs?: number ) => { while (repeat > 0) { try { diff --git a/integration-tests/test/eth-l2/turing.spec.ts b/integration-tests/test/eth-l2/turing.spec.ts index 025b22800a..c82df5adeb 100644 --- a/integration-tests/test/eth-l2/turing.spec.ts +++ b/integration-tests/test/eth-l2/turing.spec.ts @@ -45,11 +45,7 @@ describe('Turing 256 Bit Random Number Test', async () => { env.l2Wallet ) - TuringHelper = await ethers.deployContract( - 'TuringHelper', - [], - env.l2Wallet - ) + TuringHelper = await ethers.deployContract('TuringHelper', [], env.l2Wallet) console.log(' Helper contract deployed at', TuringHelper.address) await TuringHelper.deployTransaction.wait() @@ -149,8 +145,12 @@ describe('Turing 256 Bit Random Number Test', async () => { ) ) - const postL1BOBABalance = await L1BOBAToken.balanceOf(env.l1Wallet.address) - const postL2BOBABalance = await L2BOBAToken.balanceOf(env.l2Wallet.address) + const postL1BOBABalance = await L1BOBAToken.balanceOf( + env.l1Wallet.address + ) + const postL2BOBABalance = await L2BOBAToken.balanceOf( + env.l2Wallet.address + ) expect(preL1BOBABalance).to.deep.eq( postL1BOBABalance.add(depositBOBAAmount) @@ -209,9 +209,7 @@ describe('Turing 256 Bit Random Number Test', async () => { it('should be funded for two transactions', async () => { const txPrice = await BobaTuringCredit.turingPrice() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(txPrice.mul(2)) }) @@ -227,12 +225,10 @@ describe('Turing 256 Bit Random Number Test', async () => { .timeout(100000) .retries(3) - // The price of one transaction should have been deducted, leaving 1 - it('should now be funded for one transaction', async () => { + // The price of one transaction should have been deducted, leaving 1 + it('should now be funded for one transaction', async () => { const txPrice = await BobaTuringCredit.turingPrice() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(txPrice) }) @@ -241,9 +237,7 @@ describe('Turing 256 Bit Random Number Test', async () => { const tr = await random.getRandom() const res = await tr.wait() expect(res).to.be.ok - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.eq(1) }) @@ -256,9 +250,7 @@ describe('Turing 256 Bit Random Number Test', async () => { TuringHelper.address ) await depositTx.wait() - const bal = await BobaTuringCredit.prepaidBalance( - TuringHelper.address - ) + const bal = await BobaTuringCredit.prepaidBalance(TuringHelper.address) expect(bal).to.be.deep.at.least(txPrice.mul(6)) }) @@ -270,7 +262,7 @@ describe('Turing 256 Bit Random Number Test', async () => { await random.estimateGas.MixedInput(URL, 123, 999) expect(1).to.equal(0) } catch (e) { - expect(e.error.toString()).to.contain("SERVER_ERROR") + expect(e.error.toString()).to.contain('SERVER_ERROR') } }) @@ -280,7 +272,7 @@ describe('Turing 256 Bit Random Number Test', async () => { const tr = await random.NestedRandom(1) expect(1).to.equal(0) } catch (e) { - expect(e.error.toString()).to.contain("SERVER_ERROR") + expect(e.error.toString()).to.contain('SERVER_ERROR') } }) diff --git a/ops/docker-compose-avalanche-side.yml b/ops/docker-compose-avalanche-side.yml new file mode 100644 index 0000000000..f472413964 --- /dev/null +++ b/ops/docker-compose-avalanche-side.yml @@ -0,0 +1,103 @@ +version: "3" + +# Account #0 +x-deployer_pk: &deployer_pk + DEPLOYER_PRIVATE_KEY: '0x56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027' + +# Account #6 - bobalink test +x-bobalink_pk: &bobalink_pk + BOBALINK_REPORTER_KEY: '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e' + +# Account #19 +x-gas-price-oracle_pk: &gas-price-oracle_pk + GAS_PRICE_ORACLE_OWNER_PRIVATE_KEY: '0x89844cbaab9ba74876f1033227926246cf9a312014c3293e466f2e3e91ebe0de' + + +services: + bobalink: + depends_on: + - l2geth + image: bobanetwork/bobalink:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bobalink + environment: + L1_NODE_WEB3_URL: http://l2geth:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + ADDRESS_MANAGER_ADDRESS: "0x5FbDB2315678afecb367f032d93F642f64180aa3" + << : *bobalink_pk + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + POLLING_INTERVAL: 1000 + + # deploys account abstraction contracts and serves contract addresses + aa_deployer: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + image: bobanetwork/aa_deployer:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: aa_deployer + environment: + L1_NODE_WEB3_URL: http://l1_chain:9650/ext/bc/C/rpc + L2_NODE_WEB3_URL: http://l2geth:8545 + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + # DO NOT use in production + << : *deployer_pk + RETRIES: 200 + DTL_REGISTRY_URL: http://dtl:8081/aa-addr.json + # skip compilation when run in docker-compose, since the contracts + # were already compiled in the builder step + NO_COMPILE: 1 + + proxyd: + image: bobanetwork/proxyd:latest + build: + context: ../go/ + dockerfile: ./proxyd/Dockerfile + deploy: + replicas: 0 + + bundler: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + - aa_deployer + image: bobanetwork/bundler:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bundler + deploy: + replicas: 1 + ports: [ '3000:3000' ] + restart: on-failure + environment: + MIN_BALANCE: 0 + URL: http://dtl:8081/addresses.json + AA_DEPLOYER: http://dtl:8081/aa-addr.json + MNEMONIC_OR_PK: "0x56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" + L1_NODE_WEB3_URL: http://l1_chain:9650/ext/bc/C/rpc + L2_NODE_WEB3_URL: http://l2geth:8545 + BENEFICIARY: "0xb57255024fa928e3d296c41528171b5f67e8d447" + MAX_BUNDLE_GAS: 5000000 + #should be set to false in prod! + UNSAFE: 'true' + mem_limit: 300M + logging: + driver: "json-file" + options: + max-size: 10m + max-file: "10" + +networks: + default: + name: local-network diff --git a/ops/docker-compose-avalanche.yml b/ops/docker-compose-avalanche.yml index 025eb43d96..c46b31ec9b 100644 --- a/ops/docker-compose-avalanche.yml +++ b/ops/docker-compose-avalanche.yml @@ -124,8 +124,7 @@ services: FRAUD_PROOF_WINDOW_SECONDS: 0 L1_NODE_WEB3_URL: http://l1_chain:9650/ext/bc/C/rpc # these keys are hardhat's first 2 accounts, DO NOT use in production - << : *deployer_pk - << : *relayer_pk + << : [*deployer_pk, *relayer_pk] SEQUENCER_ADDRESS: "0x91ef3b19cdb344c5010358718e9347dd5cb2f362" PROPOSER_ADDRESS: "0xf31ca20d67bf4e3ddb4d7546c4a0983f3fa6ffea" # setting the whitelist owner to address(0) disables the whitelist @@ -173,9 +172,7 @@ services: ADDRESS_MANAGER_ADDRESS: "0x52C84043CD9c865236f11d9Fc9F56aa003c1f922" URL: http://dtl:8081/addresses.json # DO NOT use in production - << : *deployer_pk - << : *relayer_pk - << : *fast-relayer_pk + << : [*deployer_pk, *relayer_pk, *fast-relayer_pk] RETRIES: 500 DTL_REGISTRY_URL: http://dtl:8081/boba-addr.json # skip compilation when run in docker-compose, since the contracts @@ -365,14 +362,13 @@ services: URL: http://dtl:8081/addresses.json BASE_URL: http://dtl:8081/addresses.json BOBA_URL: http://dtl:8081/boba-addr.json + AA_BOBA_URL: http://dtl:8081/aa-addr.json + BUNDLER_URL: http://bundler:3000/rpc ENABLE_GAS_REPORT: 1 NO_NETWORK: 1 L2_CHAINID: 31338 #unfortunately, elsewhere the L2_CHAINID is called CHAIN_ID RETRIES: 200 - << : *integration_pk - << : *integration_2_pk - << : *integration_3_pk - << : *integration_4_pk + << : [*integration_pk, *integration_2_pk, *integration_3_pk, *integration_4_pk] volumes: - ~/result:/opt/optimism/integration-tests/result networks: diff --git a/ops/docker-compose-bnb-side.yml b/ops/docker-compose-bnb-side.yml new file mode 100644 index 0000000000..062738e806 --- /dev/null +++ b/ops/docker-compose-bnb-side.yml @@ -0,0 +1,103 @@ +version: "3" + +# Account #0 +x-deployer_pk: &deployer_pk + DEPLOYER_PRIVATE_KEY: '0x953dbe85f02d84377f90a6eb6d8a6dd128aa50f69c4671d32414b139040be24b' + +# Account #6 - bobalink test +x-bobalink_pk: &bobalink_pk + BOBALINK_REPORTER_KEY: '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e' + +# Account #19 +x-gas-price-oracle_pk: &gas-price-oracle_pk + GAS_PRICE_ORACLE_OWNER_PRIVATE_KEY: '0x68ef711b398fa47f22fbc44a972efbd2c2e25338e7c6afb92dc84b569bf784a5' + + +services: + bobalink: + depends_on: + - l2geth + image: bobanetwork/bobalink:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bobalink + environment: + L1_NODE_WEB3_URL: http://l2geth:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + ADDRESS_MANAGER_ADDRESS: "0x5FbDB2315678afecb367f032d93F642f64180aa3" + << : *bobalink_pk + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + POLLING_INTERVAL: 1000 + + # deploys account abstraction contracts and serves contract addresses + aa_deployer: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + image: bobanetwork/aa_deployer:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: aa_deployer + environment: + L1_NODE_WEB3_URL: http://l1_chain:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + # DO NOT use in production + << : *deployer_pk + RETRIES: 500 + DTL_REGISTRY_URL: http://dtl:8081/aa-addr.json + # skip compilation when run in docker-compose, since the contracts + # were already compiled in the builder step + NO_COMPILE: 1 + + proxyd: + image: bobanetwork/proxyd:latest + build: + context: ../go/ + dockerfile: ./proxyd/Dockerfile + deploy: + replicas: 0 + + bundler: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + - aa_deployer + image: bobanetwork/bundler:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bundler + deploy: + replicas: 1 + ports: [ '3000:3000' ] + restart: on-failure + environment: + MIN_BALANCE: 0 + URL: http://dtl:8081/addresses.json + AA_DEPLOYER: http://dtl:8081/aa-addr.json + MNEMONIC_OR_PK: "0x953dbe85f02d84377f90a6eb6d8a6dd128aa50f69c4671d32414b139040be24b" + L1_NODE_WEB3_URL: http://l1_chain:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + BENEFICIARY: "0xc32ec0115BCB6693d4b4854531cA5e6a99217ABF" + MAX_BUNDLE_GAS: 5000000 + #should be set to false in prod! + UNSAFE: 'true' + mem_limit: 300M + logging: + driver: "json-file" + options: + max-size: 10m + max-file: "10" + +networks: + default: + name: local-network diff --git a/ops/docker-compose-bnb.yml b/ops/docker-compose-bnb.yml index 66f45637e4..885c39b362 100644 --- a/ops/docker-compose-bnb.yml +++ b/ops/docker-compose-bnb.yml @@ -99,8 +99,7 @@ services: FRAUD_PROOF_WINDOW_SECONDS: 0 L1_NODE_WEB3_URL: http://l1_chain:8545 # these keys are hardhat's first 2 accounts, DO NOT use in production - << : *deployer_pk - << : *relayer_pk + << : [*deployer_pk, *relayer_pk] SEQUENCER_ADDRESS: "0xA2bC4Cf857f3D7a22b29c71774B4d8f25cc7edD0" PROPOSER_ADDRESS: "0x59b02D4d2F94ea5c55230715a58EBb0b703bCD4B" # setting the whitelist owner to address(0) disables the whitelist @@ -145,9 +144,7 @@ services: ADDRESS_MANAGER_ADDRESS: "0xC194E4CFa59D2DfC520217dA22E23DF8D4658a37" URL: http://dtl:8081/addresses.json # DO NOT use in production - << : *deployer_pk - << : *relayer_pk - << : *fast-relayer_pk + << : [*deployer_pk, *relayer_pk, *fast-relayer_pk] RETRIES: 500 DTL_REGISTRY_URL: http://dtl:8081/boba-addr.json # skip compilation when run in docker-compose, since the contracts @@ -335,14 +332,13 @@ services: URL: http://dtl:8081/addresses.json BASE_URL: http://dtl:8081/addresses.json BOBA_URL: http://dtl:8081/boba-addr.json + AA_BOBA_URL: http://dtl:8081/aa-addr.json + BUNDLER_URL: http://bundler:3000/rpc ENABLE_GAS_REPORT: 1 NO_NETWORK: 1 L2_CHAINID: 31338 #unfortunately, elsewhere the L2_CHAINID is called CHAIN_ID RETRIES: 500 - << : *integration_pk - << : *integration_2_pk - << : *integration_3_pk - << : *integration_4_pk + << : [*integration_pk, *integration_2_pk, *integration_3_pk, *integration_4_pk] volumes: - ~/result:/opt/optimism/integration-tests/result networks: diff --git a/ops/docker-compose-fantom-side.yml b/ops/docker-compose-fantom-side.yml new file mode 100644 index 0000000000..2946b73c2b --- /dev/null +++ b/ops/docker-compose-fantom-side.yml @@ -0,0 +1,103 @@ +version: "3" + +# Account #0 +x-deployer_pk: &deployer_pk + DEPLOYER_PRIVATE_KEY: '0x8ffbfce79f185f4b4fb06cb3b51fcdf0fb7403b6e0d4011893ebabfc68d5187c' + +# Account #6 - bobalink test +x-bobalink_pk: &bobalink_pk + BOBALINK_REPORTER_KEY: '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e' + +# Account #19 +x-gas-price-oracle_pk: &gas-price-oracle_pk + GAS_PRICE_ORACLE_OWNER_PRIVATE_KEY: '0xa6c4234c9bcae01a8d9d2301ab14ce2fcdd38fe57bc28fa03cd0678630cb8f5a' + + +services: + bobalink: + depends_on: + - l2geth + image: bobanetwork/bobalink:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bobalink + environment: + L1_NODE_WEB3_URL: http://l2geth:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + ADDRESS_MANAGER_ADDRESS: "0x5FbDB2315678afecb367f032d93F642f64180aa3" + << : *bobalink_pk + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + POLLING_INTERVAL: 1000 + + # deploys account abstraction contracts and serves contract addresses + aa_deployer: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + image: bobanetwork/aa_deployer:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: aa_deployer + environment: + L1_NODE_WEB3_URL: http://l1_chain:18545 + L2_NODE_WEB3_URL: http://l2geth:8545 + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + # DO NOT use in production + << : *deployer_pk + RETRIES: 200 + DTL_REGISTRY_URL: http://dtl:8081/aa-addr.json + # skip compilation when run in docker-compose, since the contracts + # were already compiled in the builder step + NO_COMPILE: 1 + + proxyd: + image: bobanetwork/proxyd:latest + build: + context: ../go/ + dockerfile: ./proxyd/Dockerfile + deploy: + replicas: 0 + + bundler: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + - aa_deployer + image: bobanetwork/bundler:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bundler + deploy: + replicas: 1 + ports: [ '3000:3000' ] + restart: on-failure + environment: + MIN_BALANCE: 0 + URL: http://dtl:8081/addresses.json + AA_DEPLOYER: http://dtl:8081/aa-addr.json + MNEMONIC_OR_PK: "0x8ffbfce79f185f4b4fb06cb3b51fcdf0fb7403b6e0d4011893ebabfc68d5187c" + L1_NODE_WEB3_URL: http://l1_chain:18545 + L2_NODE_WEB3_URL: http://l2geth:8545 + BENEFICIARY: "0x2327691f4EDb2A6341e7a29e3C15ba1Cf79066FD" + MAX_BUNDLE_GAS: 5000000 + #should be set to false in prod! + UNSAFE: 'true' + mem_limit: 300M + logging: + driver: "json-file" + options: + max-size: 10m + max-file: "10" + +networks: + default: + name: local-network diff --git a/ops/docker-compose-fantom.yml b/ops/docker-compose-fantom.yml index f5e6d388fd..28d8bd2dc9 100644 --- a/ops/docker-compose-fantom.yml +++ b/ops/docker-compose-fantom.yml @@ -83,8 +83,7 @@ services: FRAUD_PROOF_WINDOW_SECONDS: 0 L1_NODE_WEB3_URL: http://l1_chain:18545 # these keys are hardhat's first 2 accounts, DO NOT use in production - << : *deployer_pk - << : *relayer_pk + << : [*deployer_pk, *relayer_pk] SEQUENCER_ADDRESS: "0x6236C601FfD52c4793e3B49B15bcdc1137E6339D" PROPOSER_ADDRESS: "0x814B1fac2aE5AbBf40Bb289b263ED4c367C50AA9" # setting the whitelist owner to address(0) disables the whitelist @@ -129,9 +128,7 @@ services: ADDRESS_MANAGER_ADDRESS: "0xf536cAF1a894E09945E649FCE3032E8E03ECb9A0" URL: http://dtl:8081/addresses.json # DO NOT use in production - << : *deployer_pk - << : *relayer_pk - << : *fast-relayer_pk + << : [*deployer_pk, *relayer_pk, *fast-relayer_pk] RETRIES: 200 DTL_REGISTRY_URL: http://dtl:8081/boba-addr.json # skip compilation when run in docker-compose, since the contracts @@ -306,14 +303,13 @@ services: URL: http://dtl:8081/addresses.json BASE_URL: http://dtl:8081/addresses.json BOBA_URL: http://dtl:8081/boba-addr.json + AA_BOBA_URL: http://dtl:8081/aa-addr.json + BUNDLER_URL: http://bundler:3000/rpc ENABLE_GAS_REPORT: 1 NO_NETWORK: 1 L2_CHAINID: 31338 #unfortunately, elsewhere the L2_CHAINID is called CHAIN_ID RETRIES: 200 - << : *integration_pk - << : *integration_2_pk - << : *integration_3_pk - << : *integration_4_pk + << : [*integration_pk, *integration_2_pk, *integration_3_pk, *integration_4_pk] volumes: - ~/result:/opt/optimism/integration-tests/result diff --git a/ops/docker-compose-moonbeam-side.yml b/ops/docker-compose-moonbeam-side.yml new file mode 100644 index 0000000000..9c6ff6c772 --- /dev/null +++ b/ops/docker-compose-moonbeam-side.yml @@ -0,0 +1,103 @@ +version: "3" + +# Account #0 +x-deployer_pk: &deployer_pk + DEPLOYER_PRIVATE_KEY: '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133' + +# Account #6 - bobalink test +x-bobalink_pk: &bobalink_pk + BOBALINK_REPORTER_KEY: '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e' + +# Account #19 +x-gas-price-oracle_pk: &gas-price-oracle_pk + GAS_PRICE_ORACLE_OWNER_PRIVATE_KEY: '0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e' + + +services: + bobalink: + depends_on: + - l2geth + image: bobanetwork/bobalink:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bobalink + environment: + L1_NODE_WEB3_URL: http://l2geth:8545 + L2_NODE_WEB3_URL: http://l2geth:8545 + ADDRESS_MANAGER_ADDRESS: "0x5FbDB2315678afecb367f032d93F642f64180aa3" + << : *bobalink_pk + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + POLLING_INTERVAL: 1000 + + # deploys account abstraction contracts and serves contract addresses + aa_deployer: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + image: bobanetwork/aa_deployer:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: aa_deployer + environment: + L1_NODE_WEB3_URL: http://l1_chain:9933 + L2_NODE_WEB3_URL: http://l2geth:8545 + URL: http://dtl:8081/addresses.json + BOBA_URL: http://dtl:8081/boba-addr.json + # DO NOT use in production + << : *deployer_pk + RETRIES: 200 + DTL_REGISTRY_URL: http://dtl:8081/aa-addr.json + # skip compilation when run in docker-compose, since the contracts + # were already compiled in the builder step + NO_COMPILE: 1 + + proxyd: + image: bobanetwork/proxyd:latest + build: + context: ../go/ + dockerfile: ./proxyd/Dockerfile + deploy: + replicas: 0 + + bundler: + depends_on: + - l1_chain + - dtl + - l2geth + - boba_deployer + - aa_deployer + image: bobanetwork/bundler:latest + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.packages + target: bundler + deploy: + replicas: 1 + ports: [ '3000:3000' ] + restart: on-failure + environment: + MIN_BALANCE: 0 + URL: http://dtl:8081/addresses.json + AA_DEPLOYER: http://dtl:8081/aa-addr.json + MNEMONIC_OR_PK: "0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133" + L1_NODE_WEB3_URL: http://l1_chain:9933 + L2_NODE_WEB3_URL: http://l2geth:8545 + BENEFICIARY: "0x931f3600a299fd9B24cEfB3BfF79388D19804BeA" + MAX_BUNDLE_GAS: 5000000 + #should be set to false in prod! + UNSAFE: 'true' + mem_limit: 300M + logging: + driver: "json-file" + options: + max-size: 10m + max-file: "10" + +networks: + default: + name: local-network diff --git a/ops/docker-compose-moonbeam.yml b/ops/docker-compose-moonbeam.yml index d41a91aa39..1ff527807f 100644 --- a/ops/docker-compose-moonbeam.yml +++ b/ops/docker-compose-moonbeam.yml @@ -95,8 +95,7 @@ services: FRAUD_PROOF_WINDOW_SECONDS: 0 L1_NODE_WEB3_URL: http://l1_chain:9933 # these keys are hardhat's first 2 accounts, DO NOT use in production - << : *deployer_pk - << : *relayer_pk + << : [*deployer_pk, *relayer_pk] SEQUENCER_ADDRESS: "0x3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0" PROPOSER_ADDRESS: "0x798d4Ba9baf0064Ec19eB4F0a1a45785ae9D6DFc" # setting the whitelist owner to address(0) disables the whitelist @@ -140,9 +139,7 @@ services: ADDRESS_MANAGER_ADDRESS: "0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3" URL: http://dtl:8081/addresses.json # DO NOT use in production - << : *deployer_pk - << : *relayer_pk - << : *fast-relayer_pk + << : [*deployer_pk, *relayer_pk, *fast-relayer_pk] RETRIES: 200 DTL_REGISTRY_URL: http://dtl:8081/boba-addr.json # skip compilation when run in docker-compose, since the contracts @@ -318,12 +315,12 @@ services: URL: http://dtl:8081/addresses.json BASE_URL: http://dtl:8081/addresses.json BOBA_URL: http://dtl:8081/boba-addr.json + AA_BOBA_URL: http://dtl:8081/aa-addr.json + BUNDLER_URL: http://bundler:3000/rpc ENABLE_GAS_REPORT: 1 NO_NETWORK: 1 L2_CHAINID: 31338 #unfortunately, elsewhere the L2_CHAINID is called CHAIN_ID - << : *integration_pk - << : *integration_2_pk - << : *integration_3_pk + << : [*integration_pk, *integration_2_pk, *integration_3_pk] volumes: - ~/result:/opt/optimism/integration-tests/result diff --git a/packages/boba/account-abstraction/contracts/bundler/EntryPointWrapper.sol b/packages/boba/account-abstraction/contracts/bundler/EntryPointWrapper.sol index 22413acc9a..67ba41e0ec 100644 --- a/packages/boba/account-abstraction/contracts/bundler/EntryPointWrapper.sol +++ b/packages/boba/account-abstraction/contracts/bundler/EntryPointWrapper.sol @@ -90,6 +90,11 @@ contract EntryPointWrapper { StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo, AggregatorStakeInfo aggregatorInfo); + /** + * return value of getSenderAddress + */ + error SenderAddressResult(address sender); + IEntryPoint public entryPoint; StakeInfo private emptyStakeInfo = StakeInfo(0, 0); @@ -205,4 +210,18 @@ contract EntryPointWrapper { bytes memory data = abi.encode(hashes); return (keccak256(data)); } + + function getSenderAddress(bytes calldata initCode) external returns (address) { + try entryPoint.getSenderAddress(initCode) {} + catch (bytes memory revertData) { + bytes4 receivedSelector = bytes4(revertData); + + if (receivedSelector == SenderAddressResult.selector) { + address sender = abi.decode(slice(revertData, 4, revertData.length - 4), (address)); + return sender; + } else { + revert ("Invalid initCode"); + } + } + } } diff --git a/packages/boba/account-abstraction/deploy/2-deploy-deposit-paymaster.ts b/packages/boba/account-abstraction/deploy/2-deploy-deposit-paymaster.ts index f6c46584f2..c92a7cbfb4 100644 --- a/packages/boba/account-abstraction/deploy/2-deploy-deposit-paymaster.ts +++ b/packages/boba/account-abstraction/deploy/2-deploy-deposit-paymaster.ts @@ -6,6 +6,7 @@ import BobaDepositPaymasterJson from '../artifacts/contracts/samples/BobaDeposit import { DeterministicDeployer } from '../src/DeterministicDeployer' let Factory__BobaDepositPaymaster: ContractFactory +let BobaDepositPaymaster: Contract const deployFn: DeployFunction = async (hre) => { Factory__BobaDepositPaymaster = new ContractFactory( @@ -19,25 +20,18 @@ const deployFn: DeployFunction = async (hre) => { console.log(`Eth Price Oracle is located at: ${ethPriceOracle}`) const entryPointFromAM = await (hre as any).deployConfig.addressManager.getAddress('L2_Boba_EntryPoint') if (entryPoint.address.toLowerCase() === entryPointFromAM.toLowerCase()) { - const bobaDepositPaymasterConstructorArgs = ethers.utils.defaultAbiCoder.encode( - ["address", "address"], - [entryPoint.address, ethPriceOracle] - ) - const bobaDepositPaymasterCreationCode = ethers.utils.solidityPack( - ["bytes", "bytes"], - [Factory__BobaDepositPaymaster.bytecode, bobaDepositPaymasterConstructorArgs] - ) - const dep = new DeterministicDeployer((hre as any).deployConfig.l2Provider, (hre as any).deployConfig.deployer_l2, 'local') - const BobaDepositPaymasterAddress = await dep.deterministicDeploy(bobaDepositPaymasterCreationCode) - console.log('Boba Deposit Paymaster at', BobaDepositPaymasterAddress) + BobaDepositPaymaster = await Factory__BobaDepositPaymaster.deploy(entryPoint.address, ethPriceOracle) + await BobaDepositPaymaster.deployTransaction.wait() + + console.log('Boba Deposit Paymaster at', BobaDepositPaymaster.address) const BobaDepositPaymasterDeploymentSubmission: DeploymentSubmission = { - address: BobaDepositPaymasterAddress, + address: BobaDepositPaymaster.address, abi: BobaDepositPaymasterJson.abi } await hre.deployments.save('BobaDepositPaymaster', BobaDepositPaymasterDeploymentSubmission) - await registerBobaAddress( (hre as any).deployConfig.addressManager, 'L2_BobaDepositPaymaster', BobaDepositPaymasterAddress ) + await registerBobaAddress( (hre as any).deployConfig.addressManager, 'L2_BobaDepositPaymaster', BobaDepositPaymaster.address ) } } diff --git a/packages/boba/account-abstraction/deploy/3-deploy-verifying-paymaster.ts b/packages/boba/account-abstraction/deploy/3-deploy-verifying-paymaster.ts index ff5242d7aa..dbbfe55638 100644 --- a/packages/boba/account-abstraction/deploy/3-deploy-verifying-paymaster.ts +++ b/packages/boba/account-abstraction/deploy/3-deploy-verifying-paymaster.ts @@ -6,6 +6,7 @@ import BobaVerifyingPaymasterJson from '../artifacts/contracts/samples/BobaVerif import { DeterministicDeployer } from '../src/DeterministicDeployer' let Factory__BobaVerifyingPaymaster: ContractFactory +let BobaVerifyingPaymaster: Contract const deployFn: DeployFunction = async (hre) => { Factory__BobaVerifyingPaymaster = new ContractFactory( @@ -25,26 +26,18 @@ const deployFn: DeployFunction = async (hre) => { console.log(`Boba is located at: ${bobaToken}`) const entryPointFromAM = await (hre as any).deployConfig.addressManager.getAddress('L2_Boba_EntryPoint') if (entryPoint.address.toLowerCase() === entryPointFromAM.toLowerCase()) { - const bobaVerifyingPaymasterConstructorArgs = ethers.utils.defaultAbiCoder.encode( - ["address", "address","address", "address"], - [entryPoint.address, verifyingSignerAddress, bobaDepositPaymaster.address, bobaToken] - ) - const bobaVerifyingPaymasterCreationCode = ethers.utils.solidityPack( - ["bytes", "bytes"], - [Factory__BobaVerifyingPaymaster.bytecode, bobaVerifyingPaymasterConstructorArgs] - ) - const dep = new DeterministicDeployer((hre as any).deployConfig.l2Provider, (hre as any).deployConfig.deployer_l2, 'local') + BobaVerifyingPaymaster = await Factory__BobaVerifyingPaymaster.deploy(entryPoint.address, verifyingSignerAddress, bobaDepositPaymaster.address, bobaToken) + await BobaVerifyingPaymaster.deployTransaction.wait() - const BobaVerifyingPaymasterAddress = await dep.deterministicDeploy(bobaVerifyingPaymasterCreationCode) - console.log('Boba Verifying Paymaster at', BobaVerifyingPaymasterAddress) + console.log('Boba Verifying Paymaster at', BobaVerifyingPaymaster.address) const BobaVerifyingPaymasterDeploymentSubmission: DeploymentSubmission = { - address: BobaVerifyingPaymasterAddress, + address: BobaVerifyingPaymaster.address, abi: BobaVerifyingPaymasterJson.abi } await hre.deployments.save('BobaVerifyingPaymaster', BobaVerifyingPaymasterDeploymentSubmission) - await registerBobaAddress( (hre as any).deployConfig.addressManager, 'L2_BobaVerifyingPaymaster', BobaVerifyingPaymasterAddress ) + await registerBobaAddress( (hre as any).deployConfig.addressManager, 'L2_BobaVerifyingPaymaster', BobaVerifyingPaymaster.address ) } } diff --git a/packages/boba/account-abstraction/deploy/4-dump-addresses.ts b/packages/boba/account-abstraction/deploy/4-dump-addresses.ts deleted file mode 100644 index 397a9fdfbf..0000000000 --- a/packages/boba/account-abstraction/deploy/4-dump-addresses.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* Imports: External */ -import { DeployFunction } from 'hardhat-deploy/types' -import path from 'path' -import fs from 'fs' - -const deployFn: DeployFunction = async (hre) => { - const contracts = {} - const deployments = await hre.deployments.all() - - for (const key in deployments) { - if (deployments.hasOwnProperty(key)) { - if (key == 'EntryPoint') { - contracts['L2_BOBA_'+key] = deployments[key].address - } else { - contracts['L2_'+key] = deployments[key].address - } - } - } - - const addresses = JSON.stringify(contracts, null, 2) - - console.log(addresses) - - const dumpsPath = path.resolve(__dirname, '../dist/dumps') - - if (!fs.existsSync(dumpsPath)) { - fs.mkdirSync(dumpsPath, { recursive: true }) - } - const addrsPath = path.resolve(dumpsPath, 'addresses.json') - fs.writeFileSync(addrsPath, addresses) -} - -deployFn.tags = ['Log', 'required'] - -export default deployFn diff --git a/packages/boba/account-abstraction/deployments/boba_bnb_testnet/.chainId b/packages/boba/account-abstraction/deployments/boba_bnb_testnet/.chainId new file mode 100644 index 0000000000..18083380f3 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_bnb_testnet/.chainId @@ -0,0 +1 @@ +9728 \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_bnb_testnet/addresses.json b/packages/boba/account-abstraction/deployments/boba_bnb_testnet/addresses.json new file mode 100644 index 0000000000..f7f8b1a726 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_bnb_testnet/addresses.json @@ -0,0 +1,4 @@ +{ + "L2_BOBA_EntryPoint": "0xb6b46ef8aa4edce3f3a1b671e9fba945cc8b8642", + "L2_EntryPointWrapper": "0x5fd867caa5ce9a52174d6630ec4ee9e87d818bfe" +} \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/.chainId b/packages/boba/account-abstraction/deployments/boba_goerli/.chainId new file mode 100644 index 0000000000..adf791fcd6 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/.chainId @@ -0,0 +1 @@ +2888 \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/BobaDepositPaymaster.json b/packages/boba/account-abstraction/deployments/boba_goerli/BobaDepositPaymaster.json new file mode 100644 index 0000000000..0ca0ee3fee --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/BobaDepositPaymaster.json @@ -0,0 +1,518 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BobaDepositPaymaster", + "sourceName": "contracts/samples/BobaDepositPaymaster.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "_entryPoint", + "type": "address" + }, + { + "internalType": "contract IBobaStraw", + "name": "ethPriceOracle", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "COST_OF_POST", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "L2_ETH", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "L2_ETH_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "QUOTE_USD", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "addDepositFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "unstakeDelaySec", + "type": "uint32" + } + ], + "name": "addStake", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "contract IBobaStraw", + "name": "tokenPriceOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "base", + "type": "address" + }, + { + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" + } + ], + "name": "addToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "depositInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockBlock", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "entryPoint", + "outputs": [ + { + "internalType": "contract IEntryPoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lockTokenDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "name": "oracles", + "outputs": [ + { + "internalType": "contract IBobaStraw", + "name": "feedRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenBase", + "type": "address" + }, + { + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPaymaster.PostOpMode", + "name": "mode", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "actualGasCost", + "type": "uint256" + } + ], + "name": "postOp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "unlockBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTokenDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "maxCost", + "type": "uint256" + } + ], + "name": "validatePaymasterUserOp", + "outputs": [ + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validationData", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + } + ], + "name": "withdrawStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTokensTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620026b7380380620026b78339810160408190526200003491620001fb565b81620000403362000192565b6001600160a01b039081166080528116620000b05760405162461bcd60e51b815260206004820152602660248201527f4465706f7369745061796d61737465723a20496e636f727265637420657468206044820152656f7261636c6560d01b606482015260840160405180910390fd5b620000c8336000908152600360205260409020439055565b604080516060810182526001600160a01b039283168152734200000000000000000000000000000000000006602080830182815260129484019485526000929092526001905290517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731880549185166001600160a01b0319909216919091179055517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d173198054925160ff16600160a01b026001600160a81b03199093169190931617179055506200023a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001f857600080fd5b50565b600080604083850312156200020f57600080fd5b82516200021c81620001e2565b60208401519092506200022f81620001e2565b809150509250929050565b6080516124306200028760003960008181610474015281816105ec0152818161084a01528181610a0201528181610ac901528181610b5901528181610d110152610ffb01526124306000f3fe6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610538578063d0e30db01461055a578063f2fde38b14610562578063f465c77e1461058257600080fd5b8063c23f001f146104cb578063c399ec8814610503578063cc9c837c1461051857600080fd5b8063b0d691fe116100bb578063b0d691fe14610462578063bb9fe6bf14610496578063c23a5cea146104ab57600080fd5b80639ed0fb681461037d578063a9a23409146103a1578063addd5099146103c157600080fd5b8063493b017011610143578063796d43711161011d578063796d43711461033c5780637b775d4d146102305780638da5cb5b1461035257600080fd5b8063493b0170146102785780634a6f84cf146102ec578063715018a61461032757600080fd5b80632f3e96a7116101745780632f3e96a7146101f057806333032ec414610230578063382edd9e1461025857600080fd5b80630396cb601461019b5780631a02ef76146101b0578063205c2878146101d0575b600080fd5b6101ae6101a9366004611d13565b6105b0565b005b3480156101bc57600080fd5b506101ae6101cb366004611d6a565b610662565b3480156101dc57600080fd5b506101ae6101eb366004611dc6565b6107f6565b3480156101fc57600080fd5b5061020661034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023c57600080fd5b5061020673420000000000000000000000000000000000000681565b34801561026457600080fd5b506101ae610273366004611df2565b61088e565b34801561028457600080fd5b506102d7610293366004611e33565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610227565b3480156102f857600080fd5b50610319610307366004611e6c565b60036020526000908152604090205481565b604051908152602001610227565b34801561033357600080fd5b506101ae6109ca565b34801561034857600080fd5b506103196188b881565b34801561035e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610206565b34801561038957600080fd5b506101ae336000908152600360205260409020439055565b3480156103ad57600080fd5b506101ae6103bc366004611e89565b6109de565b3480156103cd57600080fd5b5061042c6103dc366004611e6c565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610227565b34801561046e57600080fd5b506102067f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a257600080fd5b506101ae6109f8565b3480156104b757600080fd5b506101ae6104c6366004611e6c565b610a7c565b3480156104d757600080fd5b506103196104e6366004611e33565b600260209081526000928352604080842090915290825290205481565b34801561050f57600080fd5b50610319610b28565b34801561052457600080fd5b506101ae610533366004611df2565b610bde565b34801561054457600080fd5b506101ae33600090815260036020526040812055565b6101ae610ce3565b34801561056e57600080fd5b506101ae61057d366004611e6c565b610d6b565b34801561058e57600080fd5b506105a261059d366004611f18565b610e08565b604051610227929190611fe2565b6105b8610e2b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b505050505050565b61066a610e2b565b73ffffffffffffffffffffffffffffffffffffffff83166106f85760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561072a57600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b6107fe610e2b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561064657600080fd5b6108b073ffffffffffffffffffffffffffffffffffffffff8416333084610e92565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160205260409020541661094a5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526002602090815260408083209386168352929052908120805483929061098e908490612033565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109c5576109c533600090815260036020526040812055565b505050565b6109d2610e2b565b6109dc6000610f6e565b565b6109e6610fe3565b6109f284848484611068565b50505050565b610a00610e2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a6857600080fd5b505af11580156109f2573d6000803e3d6000fd5b610a84610e2b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd9919061204b565b905090565b3360009081526003602052604090205415801590610c0a57503360009081526003602052604090205443115b610c7c5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cbc908490612064565b909155506109c5905073ffffffffffffffffffffffffffffffffffffffff841683836111e0565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b0d57600080fd5b610d73610e2b565b73ffffffffffffffffffffffffffffffffffffffff8116610dfc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ef565b610e0581610f6e565b50565b60606000610e14610fe3565b610e1f858585611236565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ef565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109f29085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611517565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109dc5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106ef565b60008080808061107a8789018961207b565b9450945094509450945060008183856188b861109691906120cc565b6110a0908a612033565b6110aa91906120cc565b6110b49190612109565b905060028a60028111156110ca576110ca612144565b146110f6576110f173ffffffffffffffffffffffffffffffffffffffff8616873084610e92565b611140565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a168352929052908120805483929061113a908490612064565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260408120829161118660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111cf9190612033565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109c59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610eec565b606060006188b88560a00135116112b55760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106ef565b3660006112c6610120880188612173565b9092509050602881146113415760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106ef565b600061135082601481866121df565b61135991612209565b60601c90508735600061136c8389611609565b905060006113798b611b13565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150156114145760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156114bc5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611579826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b429092919063ffffffff16565b8051909150156109c557808060200190518101906115979190612251565b6109c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff169382019390935290916116e75760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb919061204b565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c919061204b565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612273565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190612273565b60ff1690506000611a4483600a6123b0565b611a4e90856120cc565b611a5983600a6123b0565b611a63878c6120cc565b611a6d91906120cc565b611a779190612109565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731954909150611adf9074010000000000000000000000000000000000000000900460ff16600a6123bc565b6040880151611aef90600a6123bc565b611af990836120cc565b611b039190612109565b9750505050505050505b92915050565b600060e0820135610100830135808203611b2e575092915050565b611b3a82488301611b51565b949350505050565b6060611b3a8484600085611b69565b6000818310611b605781611b62565b825b9392505050565b606082471015611be15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106ef565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c0a91906123cb565b60006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b5091509150611c5d87838387611c68565b979650505050505050565b60608315611ce4578251600003611cdd5773ffffffffffffffffffffffffffffffffffffffff85163b611cdd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ef565b5081611b3a565b611b3a8383815115611cf95781518083602001fd5b8060405162461bcd60e51b81526004016106ef91906123e7565b600060208284031215611d2557600080fd5b813563ffffffff81168114611b6257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610e0557600080fd5b60ff81168114610e0557600080fd5b60008060008060808587031215611d8057600080fd5b8435611d8b81611d39565b93506020850135611d9b81611d39565b92506040850135611dab81611d39565b91506060850135611dbb81611d5b565b939692955090935050565b60008060408385031215611dd957600080fd5b8235611de481611d39565b946020939093013593505050565b600080600060608486031215611e0757600080fd5b8335611e1281611d39565b92506020840135611e2281611d39565b929592945050506040919091013590565b60008060408385031215611e4657600080fd5b8235611e5181611d39565b91506020830135611e6181611d39565b809150509250929050565b600060208284031215611e7e57600080fd5b8135611b6281611d39565b60008060008060608587031215611e9f57600080fd5b843560038110611eae57600080fd5b9350602085013567ffffffffffffffff80821115611ecb57600080fd5b818701915087601f830112611edf57600080fd5b813581811115611eee57600080fd5b886020828501011115611f0057600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f2d57600080fd5b833567ffffffffffffffff811115611f4457600080fd5b84016101608187031215611f5757600080fd5b95602085013595506040909401359392505050565b60005b83811015611f87578181015183820152602001611f6f565b838111156109f25750506000910152565b60008151808452611fb0816020860160208601611f6c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611ff56040830185611f98565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561204657612046612004565b500190565b60006020828403121561205d57600080fd5b5051919050565b60008282101561207657612076612004565b500390565b600080600080600060a0868803121561209357600080fd5b853561209e81611d39565b945060208601356120ae81611d39565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210457612104612004565b500290565b60008261213f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121a857600080fd5b83018035915067ffffffffffffffff8211156121c357600080fd5b6020019150368190038213156121d857600080fd5b9250929050565b600080858511156121ef57600080fd5b838611156121fc57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122495780818660140360031b1b83161692505b505092915050565b60006020828403121561226357600080fd5b81518015158114611b6257600080fd5b60006020828403121561228557600080fd5b8151611b6281611d5b565b600181815b808511156122e957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156122cf576122cf612004565b808516156122dc57918102915b93841c9390800290612295565b509250929050565b60008261230057506001611b0d565b8161230d57506000611b0d565b8160018114612323576002811461232d57612349565b6001915050611b0d565b60ff84111561233e5761233e612004565b50506001821b611b0d565b5060208310610133831016604e8410600b841016171561236c575081810a611b0d565b6123768383612290565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156123a8576123a8612004565b029392505050565b6000611b6283836122f1565b6000611b6260ff8416836122f1565b600082516123dd818460208701611f6c565b9190910192915050565b602081526000611b626020830184611f9856fea26469706673582212208a9cab613294aeef7047a8205015d7b3471fa40b68142b67434d61f70707bbe764736f6c634300080f0033", + "deployedBytecode": "0x6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610538578063d0e30db01461055a578063f2fde38b14610562578063f465c77e1461058257600080fd5b8063c23f001f146104cb578063c399ec8814610503578063cc9c837c1461051857600080fd5b8063b0d691fe116100bb578063b0d691fe14610462578063bb9fe6bf14610496578063c23a5cea146104ab57600080fd5b80639ed0fb681461037d578063a9a23409146103a1578063addd5099146103c157600080fd5b8063493b017011610143578063796d43711161011d578063796d43711461033c5780637b775d4d146102305780638da5cb5b1461035257600080fd5b8063493b0170146102785780634a6f84cf146102ec578063715018a61461032757600080fd5b80632f3e96a7116101745780632f3e96a7146101f057806333032ec414610230578063382edd9e1461025857600080fd5b80630396cb601461019b5780631a02ef76146101b0578063205c2878146101d0575b600080fd5b6101ae6101a9366004611d13565b6105b0565b005b3480156101bc57600080fd5b506101ae6101cb366004611d6a565b610662565b3480156101dc57600080fd5b506101ae6101eb366004611dc6565b6107f6565b3480156101fc57600080fd5b5061020661034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023c57600080fd5b5061020673420000000000000000000000000000000000000681565b34801561026457600080fd5b506101ae610273366004611df2565b61088e565b34801561028457600080fd5b506102d7610293366004611e33565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610227565b3480156102f857600080fd5b50610319610307366004611e6c565b60036020526000908152604090205481565b604051908152602001610227565b34801561033357600080fd5b506101ae6109ca565b34801561034857600080fd5b506103196188b881565b34801561035e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610206565b34801561038957600080fd5b506101ae336000908152600360205260409020439055565b3480156103ad57600080fd5b506101ae6103bc366004611e89565b6109de565b3480156103cd57600080fd5b5061042c6103dc366004611e6c565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610227565b34801561046e57600080fd5b506102067f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a257600080fd5b506101ae6109f8565b3480156104b757600080fd5b506101ae6104c6366004611e6c565b610a7c565b3480156104d757600080fd5b506103196104e6366004611e33565b600260209081526000928352604080842090915290825290205481565b34801561050f57600080fd5b50610319610b28565b34801561052457600080fd5b506101ae610533366004611df2565b610bde565b34801561054457600080fd5b506101ae33600090815260036020526040812055565b6101ae610ce3565b34801561056e57600080fd5b506101ae61057d366004611e6c565b610d6b565b34801561058e57600080fd5b506105a261059d366004611f18565b610e08565b604051610227929190611fe2565b6105b8610e2b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b505050505050565b61066a610e2b565b73ffffffffffffffffffffffffffffffffffffffff83166106f85760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561072a57600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b6107fe610e2b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561064657600080fd5b6108b073ffffffffffffffffffffffffffffffffffffffff8416333084610e92565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160205260409020541661094a5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526002602090815260408083209386168352929052908120805483929061098e908490612033565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109c5576109c533600090815260036020526040812055565b505050565b6109d2610e2b565b6109dc6000610f6e565b565b6109e6610fe3565b6109f284848484611068565b50505050565b610a00610e2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a6857600080fd5b505af11580156109f2573d6000803e3d6000fd5b610a84610e2b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd9919061204b565b905090565b3360009081526003602052604090205415801590610c0a57503360009081526003602052604090205443115b610c7c5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cbc908490612064565b909155506109c5905073ffffffffffffffffffffffffffffffffffffffff841683836111e0565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b0d57600080fd5b610d73610e2b565b73ffffffffffffffffffffffffffffffffffffffff8116610dfc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ef565b610e0581610f6e565b50565b60606000610e14610fe3565b610e1f858585611236565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ef565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109f29085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611517565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109dc5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106ef565b60008080808061107a8789018961207b565b9450945094509450945060008183856188b861109691906120cc565b6110a0908a612033565b6110aa91906120cc565b6110b49190612109565b905060028a60028111156110ca576110ca612144565b146110f6576110f173ffffffffffffffffffffffffffffffffffffffff8616873084610e92565b611140565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a168352929052908120805483929061113a908490612064565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260408120829161118660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111cf9190612033565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109c59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610eec565b606060006188b88560a00135116112b55760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106ef565b3660006112c6610120880188612173565b9092509050602881146113415760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106ef565b600061135082601481866121df565b61135991612209565b60601c90508735600061136c8389611609565b905060006113798b611b13565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150156114145760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156114bc5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611579826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b429092919063ffffffff16565b8051909150156109c557808060200190518101906115979190612251565b6109c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff169382019390935290916116e75760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb919061204b565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c919061204b565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612273565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190612273565b60ff1690506000611a4483600a6123b0565b611a4e90856120cc565b611a5983600a6123b0565b611a63878c6120cc565b611a6d91906120cc565b611a779190612109565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731954909150611adf9074010000000000000000000000000000000000000000900460ff16600a6123bc565b6040880151611aef90600a6123bc565b611af990836120cc565b611b039190612109565b9750505050505050505b92915050565b600060e0820135610100830135808203611b2e575092915050565b611b3a82488301611b51565b949350505050565b6060611b3a8484600085611b69565b6000818310611b605781611b62565b825b9392505050565b606082471015611be15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106ef565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c0a91906123cb565b60006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b5091509150611c5d87838387611c68565b979650505050505050565b60608315611ce4578251600003611cdd5773ffffffffffffffffffffffffffffffffffffffff85163b611cdd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ef565b5081611b3a565b611b3a8383815115611cf95781518083602001fd5b8060405162461bcd60e51b81526004016106ef91906123e7565b600060208284031215611d2557600080fd5b813563ffffffff81168114611b6257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610e0557600080fd5b60ff81168114610e0557600080fd5b60008060008060808587031215611d8057600080fd5b8435611d8b81611d39565b93506020850135611d9b81611d39565b92506040850135611dab81611d39565b91506060850135611dbb81611d5b565b939692955090935050565b60008060408385031215611dd957600080fd5b8235611de481611d39565b946020939093013593505050565b600080600060608486031215611e0757600080fd5b8335611e1281611d39565b92506020840135611e2281611d39565b929592945050506040919091013590565b60008060408385031215611e4657600080fd5b8235611e5181611d39565b91506020830135611e6181611d39565b809150509250929050565b600060208284031215611e7e57600080fd5b8135611b6281611d39565b60008060008060608587031215611e9f57600080fd5b843560038110611eae57600080fd5b9350602085013567ffffffffffffffff80821115611ecb57600080fd5b818701915087601f830112611edf57600080fd5b813581811115611eee57600080fd5b886020828501011115611f0057600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f2d57600080fd5b833567ffffffffffffffff811115611f4457600080fd5b84016101608187031215611f5757600080fd5b95602085013595506040909401359392505050565b60005b83811015611f87578181015183820152602001611f6f565b838111156109f25750506000910152565b60008151808452611fb0816020860160208601611f6c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611ff56040830185611f98565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561204657612046612004565b500190565b60006020828403121561205d57600080fd5b5051919050565b60008282101561207657612076612004565b500390565b600080600080600060a0868803121561209357600080fd5b853561209e81611d39565b945060208601356120ae81611d39565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210457612104612004565b500290565b60008261213f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121a857600080fd5b83018035915067ffffffffffffffff8211156121c357600080fd5b6020019150368190038213156121d857600080fd5b9250929050565b600080858511156121ef57600080fd5b838611156121fc57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122495780818660140360031b1b83161692505b505092915050565b60006020828403121561226357600080fd5b81518015158114611b6257600080fd5b60006020828403121561228557600080fd5b8151611b6281611d5b565b600181815b808511156122e957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156122cf576122cf612004565b808516156122dc57918102915b93841c9390800290612295565b509250929050565b60008261230057506001611b0d565b8161230d57506000611b0d565b8160018114612323576002811461232d57612349565b6001915050611b0d565b60ff84111561233e5761233e612004565b50506001821b611b0d565b5060208310610133831016604e8410600b841016171561236c575081810a611b0d565b6123768383612290565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156123a8576123a8612004565b029392505050565b6000611b6283836122f1565b6000611b6260ff8416836122f1565b600082516123dd818460208701611f6c565b9190910192915050565b602081526000611b626020830184611f9856fea26469706673582212208a9cab613294aeef7047a8205015d7b3471fa40b68142b67434d61f70707bbe764736f6c634300080f0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/BobaVerifyingPaymaster.json b/packages/boba/account-abstraction/deployments/boba_goerli/BobaVerifyingPaymaster.json new file mode 100644 index 0000000000..a1dc110b6b --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/BobaVerifyingPaymaster.json @@ -0,0 +1,486 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BobaVerifyingPaymaster", + "sourceName": "contracts/samples/BobaVerifyingPaymaster.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "_entryPoint", + "type": "address" + }, + { + "internalType": "address", + "name": "_verifyingSigner", + "type": "address" + }, + { + "internalType": "address", + "name": "_bobaDepositPaymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "_approvedToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "APPROVE_FUNCTION_SELECTOR", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEPOSIT_FOR_FUNCTION_SELECTOR", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "unstakeDelaySec", + "type": "uint32" + } + ], + "name": "addStake", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "approvedToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bobaDepositPaymaster", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "entryPoint", + "outputs": [ + { + "internalType": "contract IEntryPoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + } + ], + "name": "getHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + } + ], + "name": "parsePaymasterAndData", + "outputs": [ + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPaymaster.PostOpMode", + "name": "mode", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "actualGasCost", + "type": "uint256" + } + ], + "name": "postOp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "senderNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "maxCost", + "type": "uint256" + } + ], + "name": "validatePaymasterUserOp", + "outputs": [ + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validationData", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "verifyingSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + } + ], + "name": "withdrawStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001d1b38038062001d1b8339810160408190526200003491620000e7565b8362000040336200007e565b6001600160a01b0390811660805292831660a052600180549284166001600160a01b031993841617905560028054919093169116179055506200014f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000e457600080fd5b50565b60008060008060808587031215620000fe57600080fd5b84516200010b81620000ce565b60208601519094506200011e81620000ce565b60408601519093506200013181620000ce565b60608601519092506200014481620000ce565b939692955090935050565b60805160a051611b6e620001ad600039600081816101ab0152610e010152600081816103ba015281816104e5015281816105af015281816106d20152818161079901528181610829015281816108dc0152610b630152611b6e6000f3fe60806040526004361061015f5760003560e01c8063a9a23409116100c0578063c23a5cea11610074578063d0e30db011610059578063d0e30db014610453578063f2fde38b1461045b578063f465c77e1461047b57600080fd5b8063c23a5cea1461041e578063c399ec881461043e57600080fd5b8063b0d691fe116100a5578063b0d691fe146103a8578063bab46259146103dc578063bb9fe6bf1461040957600080fd5b8063a9a2340914610354578063b02f786e1461037457600080fd5b80637d3c11621161011757806394d4ad60116100fc57806394d4ad60146102c957806394e1fc19146102f95780639c90b4431461032757600080fd5b80637d3c1162146102715780638da5cb5b1461029e57600080fd5b806323d9ac9b1161014857806323d9ac9b1461019957806356fd76da146101f7578063715018a61461025c57600080fd5b80630396cb6014610164578063205c287814610179575b600080fd5b610177610172366004611566565b6104a9565b005b34801561018557600080fd5b506101776101943660046115b5565b61055b565b3480156101a557600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020357600080fd5b5061022b7f382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf81565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101ee565b34801561026857600080fd5b506101776105f3565b34801561027d57600080fd5b506001546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101cd565b3480156102d557600080fd5b506102e96102e4366004611623565b610607565b6040516101ee9493929190611665565b34801561030557600080fd5b50610319610314366004611703565b610644565b6040519081526020016101ee565b34801561033357600080fd5b50610319610342366004611761565b60036020526000908152604090205481565b34801561036057600080fd5b5061017761036f36600461177e565b6106ae565b34801561038057600080fd5b5061022b7f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba81565b3480156103b457600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e857600080fd5b506002546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b506101776106c8565b34801561042a57600080fd5b50610177610439366004611761565b61074c565b34801561044a57600080fd5b506103196107f8565b6101776108ae565b34801561046757600080fd5b50610177610476366004611761565b610936565b34801561048757600080fd5b5061049b6104963660046117de565b6109f2565b6040516101ee929190611897565b6104b1610a16565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050505050565b610563610a16565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561053f57600080fd5b6105fb610a16565b6106056000610a97565b565b600080368161061a6054601487896118b9565b81019061062791906118e3565b909450925061063985605481896118b9565b949793965094505050565b600061064f84610b0c565b73ffffffffffffffffffffffffffffffffffffffff85351660009081526003602090815260409182902054915161068f9392469230928991899101611916565b6040516020818303038152906040528051906020012090509392505050565b6106b6610b4b565b6106c284848484610bea565b50505050565b6106d0610a16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073857600080fd5b505af11580156106c2573d6000803e3d6000fd5b610754610a16565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156107dd57600080fd5b505af11580156107f1573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a99190611973565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156107dd57600080fd5b61093e610a16565b73ffffffffffffffffffffffffffffffffffffffff81166109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109ef81610a97565b50565b606060006109fe610b4b565b610a09858585610c4c565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109dd565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060366000610b1f61012085018561198c565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016109dd565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016109dd565b6060600080803681610c656102e46101208b018b61198c565b929650909450925090506040811480610c7e5750604181145b610d0c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016109dd565b6000610d6f610d1c8b8787610644565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600360205260408120805492935090610da4836119f1565b9190505550610de98184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f4d92505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4760018686610f73565b6040518060200160405280600081525090965096505050505050610a0e565b610e7b610e7660608c018c61198c565b610fab565b80610e965750610e96610e9160608c018c61198c565b61111c565b610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f566572696679696e675061796d61737465723a20696e76616c6964206f70657260448201527f6174696f6e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b610f2e60008686610f73565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610f5c858561127f565b91509150610f69816112c4565b5090505b92915050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610f9b576000610f9e565b60015b60ff161717949350505050565b600060e48214610fbd57506000610f6d565b6000610fcd6088608485876118b9565b610fd691611a50565b9050366000610fe96024600487896118b9565b90925090506000610ffc83830184611761565b60025490915073ffffffffffffffffffffffffffffffffffffffff80831691161461102e576000945050505050610f6d565b600061103e60c86088898b6118b9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509361108b935085016020908101925085019050611a98565b5090507fffffffff0000000000000000000000000000000000000000000000000000000086167f095ea7b3000000000000000000000000000000000000000000000000000000001480156110f9575060015473ffffffffffffffffffffffffffffffffffffffff8281169116145b1561110d5760019650505050505050610f6d565b50600098975050505050505050565b6000610104821461112f57506000610f6d565b600061113f6088608485876118b9565b61114891611a50565b905036600061115b6024600487896118b9565b9092509050600061116e83830184611761565b60015490915073ffffffffffffffffffffffffffffffffffffffff8083169116146111a0576000945050505050610f6d565b60006111b060e86088898b6118b9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949550936111fd935085016020908101925085019050611ac6565b50909150507fffffffff0000000000000000000000000000000000000000000000000000000086167f382edd9e000000000000000000000000000000000000000000000000000000001480156110f9575060025473ffffffffffffffffffffffffffffffffffffffff82811691160361110d5760019650505050505050610f6d565b60008082516041036112b55760208301516040840151606085015160001a6112a987828585611477565b945094505050506112bd565b506000905060025b9250929050565b60008160048111156112d8576112d8611b09565b036112e05750565b60018160048111156112f4576112f4611b09565b0361135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109dd565b600281600481111561136f5761136f611b09565b036113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109dd565b60038160048111156113ea576113ea611b09565b036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114ae575060009050600361155d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611502573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115565760006001925092505061155d565b9150600090505b94509492505050565b60006020828403121561157857600080fd5b813563ffffffff8116811461158c57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ef57600080fd5b600080604083850312156115c857600080fd5b82356115d381611593565b946020939093013593505050565b60008083601f8401126115f357600080fd5b50813567ffffffffffffffff81111561160b57600080fd5b6020830191508360208285010111156112bd57600080fd5b6000806020838503121561163657600080fd5b823567ffffffffffffffff81111561164d57600080fd5b611659858286016115e1565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156116e257600080fd5b50919050565b803565ffffffffffff811681146116fe57600080fd5b919050565b60008060006060848603121561171857600080fd5b833567ffffffffffffffff81111561172f57600080fd5b61173b868287016116cf565b93505061174a602085016116e8565b9150611758604085016116e8565b90509250925092565b60006020828403121561177357600080fd5b813561158c81611593565b6000806000806060858703121561179457600080fd5b8435600381106117a357600080fd5b9350602085013567ffffffffffffffff8111156117bf57600080fd5b6117cb878288016115e1565b9598909750949560400135949350505050565b6000806000606084860312156117f357600080fd5b833567ffffffffffffffff81111561180a57600080fd5b611816868287016116cf565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561185257602081850181015186830182015201611836565b81811115611864576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006118aa604083018561182c565b90508260208301529392505050565b600080858511156118c957600080fd5b838611156118d657600080fd5b5050820193919092039150565b600080604083850312156118f657600080fd5b6118ff836116e8565b915061190d602084016116e8565b90509250929050565b60c08152600061192960c083018961182c565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561198557600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126119c157600080fd5b83018035915067ffffffffffffffff8211156119dc57600080fd5b6020019150368190038213156112bd57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a49577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a905780818660040360031b1b83161692505b505092915050565b60008060408385031215611aab57600080fd5b8251611ab681611593565b6020939093015192949293505050565b600080600060608486031215611adb57600080fd5b8351611ae681611593565b6020850151909350611af781611593565b80925050604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220008fcb302fb6ec149df4a9d2191ed74ed9cf53f9fcae24ea6f33f25f9d3975ba64736f6c634300080f0033", + "deployedBytecode": "0x60806040526004361061015f5760003560e01c8063a9a23409116100c0578063c23a5cea11610074578063d0e30db011610059578063d0e30db014610453578063f2fde38b1461045b578063f465c77e1461047b57600080fd5b8063c23a5cea1461041e578063c399ec881461043e57600080fd5b8063b0d691fe116100a5578063b0d691fe146103a8578063bab46259146103dc578063bb9fe6bf1461040957600080fd5b8063a9a2340914610354578063b02f786e1461037457600080fd5b80637d3c11621161011757806394d4ad60116100fc57806394d4ad60146102c957806394e1fc19146102f95780639c90b4431461032757600080fd5b80637d3c1162146102715780638da5cb5b1461029e57600080fd5b806323d9ac9b1161014857806323d9ac9b1461019957806356fd76da146101f7578063715018a61461025c57600080fd5b80630396cb6014610164578063205c287814610179575b600080fd5b610177610172366004611566565b6104a9565b005b34801561018557600080fd5b506101776101943660046115b5565b61055b565b3480156101a557600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020357600080fd5b5061022b7f382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf81565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101ee565b34801561026857600080fd5b506101776105f3565b34801561027d57600080fd5b506001546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101cd565b3480156102d557600080fd5b506102e96102e4366004611623565b610607565b6040516101ee9493929190611665565b34801561030557600080fd5b50610319610314366004611703565b610644565b6040519081526020016101ee565b34801561033357600080fd5b50610319610342366004611761565b60036020526000908152604090205481565b34801561036057600080fd5b5061017761036f36600461177e565b6106ae565b34801561038057600080fd5b5061022b7f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba81565b3480156103b457600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e857600080fd5b506002546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b506101776106c8565b34801561042a57600080fd5b50610177610439366004611761565b61074c565b34801561044a57600080fd5b506103196107f8565b6101776108ae565b34801561046757600080fd5b50610177610476366004611761565b610936565b34801561048757600080fd5b5061049b6104963660046117de565b6109f2565b6040516101ee929190611897565b6104b1610a16565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050505050565b610563610a16565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561053f57600080fd5b6105fb610a16565b6106056000610a97565b565b600080368161061a6054601487896118b9565b81019061062791906118e3565b909450925061063985605481896118b9565b949793965094505050565b600061064f84610b0c565b73ffffffffffffffffffffffffffffffffffffffff85351660009081526003602090815260409182902054915161068f9392469230928991899101611916565b6040516020818303038152906040528051906020012090509392505050565b6106b6610b4b565b6106c284848484610bea565b50505050565b6106d0610a16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073857600080fd5b505af11580156106c2573d6000803e3d6000fd5b610754610a16565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156107dd57600080fd5b505af11580156107f1573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a99190611973565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156107dd57600080fd5b61093e610a16565b73ffffffffffffffffffffffffffffffffffffffff81166109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109ef81610a97565b50565b606060006109fe610b4b565b610a09858585610c4c565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109dd565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060366000610b1f61012085018561198c565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016109dd565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016109dd565b6060600080803681610c656102e46101208b018b61198c565b929650909450925090506040811480610c7e5750604181145b610d0c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016109dd565b6000610d6f610d1c8b8787610644565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600360205260408120805492935090610da4836119f1565b9190505550610de98184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f4d92505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4760018686610f73565b6040518060200160405280600081525090965096505050505050610a0e565b610e7b610e7660608c018c61198c565b610fab565b80610e965750610e96610e9160608c018c61198c565b61111c565b610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f566572696679696e675061796d61737465723a20696e76616c6964206f70657260448201527f6174696f6e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b610f2e60008686610f73565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610f5c858561127f565b91509150610f69816112c4565b5090505b92915050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610f9b576000610f9e565b60015b60ff161717949350505050565b600060e48214610fbd57506000610f6d565b6000610fcd6088608485876118b9565b610fd691611a50565b9050366000610fe96024600487896118b9565b90925090506000610ffc83830184611761565b60025490915073ffffffffffffffffffffffffffffffffffffffff80831691161461102e576000945050505050610f6d565b600061103e60c86088898b6118b9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509361108b935085016020908101925085019050611a98565b5090507fffffffff0000000000000000000000000000000000000000000000000000000086167f095ea7b3000000000000000000000000000000000000000000000000000000001480156110f9575060015473ffffffffffffffffffffffffffffffffffffffff8281169116145b1561110d5760019650505050505050610f6d565b50600098975050505050505050565b6000610104821461112f57506000610f6d565b600061113f6088608485876118b9565b61114891611a50565b905036600061115b6024600487896118b9565b9092509050600061116e83830184611761565b60015490915073ffffffffffffffffffffffffffffffffffffffff8083169116146111a0576000945050505050610f6d565b60006111b060e86088898b6118b9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949550936111fd935085016020908101925085019050611ac6565b50909150507fffffffff0000000000000000000000000000000000000000000000000000000086167f382edd9e000000000000000000000000000000000000000000000000000000001480156110f9575060025473ffffffffffffffffffffffffffffffffffffffff82811691160361110d5760019650505050505050610f6d565b60008082516041036112b55760208301516040840151606085015160001a6112a987828585611477565b945094505050506112bd565b506000905060025b9250929050565b60008160048111156112d8576112d8611b09565b036112e05750565b60018160048111156112f4576112f4611b09565b0361135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109dd565b600281600481111561136f5761136f611b09565b036113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109dd565b60038160048111156113ea576113ea611b09565b036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114ae575060009050600361155d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611502573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115565760006001925092505061155d565b9150600090505b94509492505050565b60006020828403121561157857600080fd5b813563ffffffff8116811461158c57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ef57600080fd5b600080604083850312156115c857600080fd5b82356115d381611593565b946020939093013593505050565b60008083601f8401126115f357600080fd5b50813567ffffffffffffffff81111561160b57600080fd5b6020830191508360208285010111156112bd57600080fd5b6000806020838503121561163657600080fd5b823567ffffffffffffffff81111561164d57600080fd5b611659858286016115e1565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156116e257600080fd5b50919050565b803565ffffffffffff811681146116fe57600080fd5b919050565b60008060006060848603121561171857600080fd5b833567ffffffffffffffff81111561172f57600080fd5b61173b868287016116cf565b93505061174a602085016116e8565b9150611758604085016116e8565b90509250925092565b60006020828403121561177357600080fd5b813561158c81611593565b6000806000806060858703121561179457600080fd5b8435600381106117a357600080fd5b9350602085013567ffffffffffffffff8111156117bf57600080fd5b6117cb878288016115e1565b9598909750949560400135949350505050565b6000806000606084860312156117f357600080fd5b833567ffffffffffffffff81111561180a57600080fd5b611816868287016116cf565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561185257602081850181015186830182015201611836565b81811115611864576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006118aa604083018561182c565b90508260208301529392505050565b600080858511156118c957600080fd5b838611156118d657600080fd5b5050820193919092039150565b600080604083850312156118f657600080fd5b6118ff836116e8565b915061190d602084016116e8565b90509250929050565b60c08152600061192960c083018961182c565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561198557600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126119c157600080fd5b83018035915067ffffffffffffffff8211156119dc57600080fd5b6020019150368190038213156112bd57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a49577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a905780818660040360031b1b83161692505b505092915050565b60008060408385031215611aab57600080fd5b8251611ab681611593565b6020939093015192949293505050565b600080600060608486031215611adb57600080fd5b8351611ae681611593565b6020850151909350611af781611593565b80925050604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220008fcb302fb6ec149df4a9d2191ed74ed9cf53f9fcae24ea6f33f25f9d3975ba64736f6c634300080f0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/EntryPoint.json b/packages/boba/account-abstraction/deployments/boba_goerli/EntryPoint.json new file mode 100644 index 0000000000..d0b0e7884b --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/EntryPoint.json @@ -0,0 +1,1318 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "EntryPoint", + "sourceName": "contracts/core/EntryPoint.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "paid", + "type": "uint256" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bool", + "name": "targetSuccess", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "targetResult", + "type": "bytes" + } + ], + "name": "ExecutionResult", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "opIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "FailedOp", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "SenderAddressResult", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "SignatureValidationFailed", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "sigFailed", + "type": "bool" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "paymasterContext", + "type": "bytes" + } + ], + "internalType": "struct IEntryPoint.ReturnInfo", + "name": "returnInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "senderInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "factoryInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "paymasterInfo", + "type": "tuple" + } + ], + "name": "ValidationResult", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "sigFailed", + "type": "bool" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "paymasterContext", + "type": "bytes" + } + ], + "internalType": "struct IEntryPoint.ReturnInfo", + "name": "returnInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "senderInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "factoryInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "paymasterInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "aggregator", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct IStakeManager.StakeInfo", + "name": "stakeInfo", + "type": "tuple" + } + ], + "internalType": "struct IEntryPoint.AggregatorStakeInfo", + "name": "aggregatorInfo", + "type": "tuple" + } + ], + "name": "ValidationResultWithAggregation", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "paymaster", + "type": "address" + } + ], + "name": "AccountDeployed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "BeforeExecution", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalDeposit", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "SignatureAggregatorChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalStaked", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "name": "StakeLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "withdrawTime", + "type": "uint256" + } + ], + "name": "StakeUnlocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "withdrawAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "StakeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "actualGasCost", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "actualGasUsed", + "type": "uint256" + } + ], + "name": "UserOperationEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "revertReason", + "type": "bytes" + } + ], + "name": "UserOperationRevertReason", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "withdrawAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "SIG_VALIDATION_FAILED", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + } + ], + "name": "_validateSenderAndPaymaster", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "unstakeDelaySec", + "type": "uint32" + } + ], + "name": "addStake", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "deposits", + "outputs": [ + { + "internalType": "uint112", + "name": "deposit", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "staked", + "type": "bool" + }, + { + "internalType": "uint112", + "name": "stake", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "unstakeDelaySec", + "type": "uint32" + }, + { + "internalType": "uint48", + "name": "withdrawTime", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getDepositInfo", + "outputs": [ + { + "components": [ + { + "internalType": "uint112", + "name": "deposit", + "type": "uint112" + }, + { + "internalType": "bool", + "name": "staked", + "type": "bool" + }, + { + "internalType": "uint112", + "name": "stake", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "unstakeDelaySec", + "type": "uint32" + }, + { + "internalType": "uint48", + "name": "withdrawTime", + "type": "uint48" + } + ], + "internalType": "struct IStakeManager.DepositInfo", + "name": "info", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint192", + "name": "key", + "type": "uint192" + } + ], + "name": "getNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + } + ], + "name": "getSenderAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + } + ], + "name": "getUserOpHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation[]", + "name": "userOps", + "type": "tuple[]" + }, + { + "internalType": "contract IAggregator", + "name": "aggregator", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct IEntryPoint.UserOpsPerAggregator[]", + "name": "opsPerAggregator", + "type": "tuple[]" + }, + { + "internalType": "address payable", + "name": "beneficiary", + "type": "address" + } + ], + "name": "handleAggregatedOps", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "address payable", + "name": "beneficiary", + "type": "address" + } + ], + "name": "handleOps", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint192", + "name": "key", + "type": "uint192" + } + ], + "name": "incrementNonce", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + } + ], + "internalType": "struct EntryPoint.MemoryUserOp", + "name": "mUserOp", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "userOpHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "contextOffset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + } + ], + "internalType": "struct EntryPoint.UserOpInfo", + "name": "opInfo", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + } + ], + "name": "innerHandleOp", + "outputs": [ + { + "internalType": "uint256", + "name": "actualGasCost", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint192", + "name": "", + "type": "uint192" + } + ], + "name": "nonceSequenceNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "op", + "type": "tuple" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "targetCallData", + "type": "bytes" + } + ], + "name": "simulateHandleOp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + } + ], + "name": "simulateValidation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + } + ], + "name": "withdrawStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "withdrawAmount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b03811183821017620000735782916200503e833903906000f080156200006757608052604051614faf90816200008f823960805181818161111d015281816135fb01526138910152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b61002161498f565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c6117e6565b61000e565b5061010c61160f565b5061010c6114d2565b5061010c61137e565b5061010c611238565b5061010c611217565b5061010c6111f6565b5061010c6110a0565b5061010c610f39565b5061010c610f1c565b5061010c610ec2565b5061010c610d9d565b5061010c610a75565b5061010c6109db565b5061010c61088e565b5061010c6107b4565b5061010c61061d565b5061010c610404565b5061010c61034d565b5060206003193601126103215760043563ffffffff81168082036103215761031c7fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0191610246610216336001600160a01b03166000526000602052604060002090565b91610222811515614ac1565b61023f610236600185015463ffffffff1690565b63ffffffff1690565b1115614b0c565b54926102fe6dffffffffffffffffffffffffffff946102c961026d34888460781c16611d01565b96610279881515614b57565b61028581891115614ba2565b6102a981610291610540565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526102f9336001600160a01b03166000526000602052604060002090565b614bed565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361032157565b50346103215760206003193601126103215760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610321576103be9033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6103c88154611f8b565b9055005b6001600160a01b0381160361032157565b602435906103ea826103cc565b565b60c435906103ea826103cc565b35906103ea826103cc565b503461032157604060031936011261032157602061046e600435610427816103cc565b6001600160a01b03610437610326565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176104c357604052565b6104cb610477565b604052565b610100810190811067ffffffffffffffff8211176104c357604052565b67ffffffffffffffff81116104c357604052565b6060810190811067ffffffffffffffff8211176104c357604052565b90601f601f19910116810190811067ffffffffffffffff8211176104c357604052565b604051906103ea826104a7565b6040519060c0820182811067ffffffffffffffff8211176104c357604052565b604051906040820182811067ffffffffffffffff8211176104c357604052565b601f19601f60209267ffffffffffffffff81116105ab575b01160190565b6105b3610477565b6105a5565b9291926105c48261058d565b916105d2604051938461051d565b829481845281830111610321578281602093846000960137010152565b9181601f840112156103215782359167ffffffffffffffff8311610321576020838186019501011161032157565b5034610321576101c06003193601126103215767ffffffffffffffff6004358181116103215736602382011215610321576106629036906024816004013591016105b8565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610321576101006040519161069f836104a7565b12610321576040516106b0816104d0565b6106b86103dd565b815260443560208201526064356040820152608435606082015260a43560808201526106e26103ec565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a435918211610321576107569261073e6107469336906004016105ef565b92909161236a565b6040519081529081906020820190565b0390f35b9060406003198301126103215760043567ffffffffffffffff9283821161032157806023830112156103215781600401359384116103215760248460051b830101116103215760240191906024356107b1816103cc565b90565b5034610321576107c33661075a565b6107ce929192611a0a565b6107d78361191b565b60005b84811061085757506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b8583106108275761081d8585611a8d565b6100216001600255565b90919360019061084d61083b8789876119bc565b610845888661199a565b519088611e52565b019401919061080c565b8061088561087e61086c60019486989661199a565b51610878848a886119bc565b84612d53565b9083612939565b019290926107da565b5034610321576040600319360112610321576004356108ac816103cc565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff815416928383116109975784836001600160a01b03829593610947849661090e6108fb87986109949c611cec565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b604080516001600160a01b03831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af161098e611a5d565b50614ee2565b80f35b606460405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103215760406003193601126103215760206004356109fb816103cc565b6001600160a01b03610a0b610326565b911660005260018252610a468160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461032157610a843661075a565b610a8c611a0a565b6000805b838210610c5957610aa1915061191b565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610bcc57505060008093815b818110610b105761081d868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611a8d565b610b67610b1e82848a611fc5565b610b3c610b30610b3060208401612067565b6001600160a01b031690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612013565b906000915b808310610b8457505050610b7f90611f8b565b610ad9565b90919497610bbf610bb9610bc592610bb38c8b610bac82610ba68e8b8d6119bc565b9261199a565b5191611e52565b90611d01565b99611f8b565b95611f8b565b9190610b6c565b610bd7818688611fc5565b6020610bef610be68380612013565b92909301612067565b916001600160a01b0360009316905b828410610c175750505050610c1290611f8b565b610aca565b90919294610bbf81610c4c85610c45610c33610c51968d61199a565b51610c3f8c8b8a6119bc565b85612d53565b908b612ae0565b611f8b565b929190610bfe565b610c64828587611fc5565b90610c6f8280612013565b92610c7f610b3060208301612067565b916001600160a01b038316610c976001821415612071565b610cb8575b505050610cb291610cac91611d01565b91611f8b565b90610a90565b909592610cd16040999693999895989788810190611b3d565b92908a3b156103215789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610d18946121e4565b03815a93600094fa9081610d84575b50610d6e5786517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b038a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610cac610cb2610c9c565b80610d91610d97926104ed565b80610f11565b38610d27565b5034610321576020600319360112610321576107566001600160a01b03600435610dc6816103cc565b608060409283928351610dd8816104a7565b600093818580935282602082015282878201528260608201520152168152806020522090610e6765ffffffffffff6001835194610e14866104a7565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b5034610321576020600319360112610321576001600160a01b03600435610ee8816103cc565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261032157565b503461032157600060031936011261032157602060405160018152f35b503461032157606060031936011261032157600467ffffffffffffffff813581811161032157610f6c90369084016105ef565b905060243591610f7b836103cc565b60443590811161032157610f9290369085016105ef565b929091159081611096575b50611049576014821015610fd3575b610d6a8360405191829162461bcd60e51b8352820160409060208152600060208201520190565b610fe3610fef92610fe9926125e2565b906125f0565b60601c90565b3b15610ffc573880610fac565b610d6a9060405191829162461bcd60e51b8352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610d6a8360405191829162461bcd60e51b8352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b1538610f9d565b50346103215760206003193601126103215760043567ffffffffffffffff8111610321576110d460249136906004016105ef565b9061110a6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612779565b036020826001600160a01b0392816000857f0000000000000000000000000000000000000000000000000000000000000000165af19182156111af575b60009261117f575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b6111a191925060203d81116111a8575b611199818361051d565b810190612764565b903861114f565b503d61118f565b6111b7611caf565b611147565b90816101609103126103215790565b6020600319820112610321576004359067ffffffffffffffff8211610321576107b1916004016111bc565b503461032157602061120f61120a366111cb565b61249e565b604051908152f35b50602060031936011261032157610021600435611233816103cc565b614a62565b50346103215760008060031936011261137b573381528060205260408120600181019063ffffffff825416908115611337576112d46112996112fc9361128b611286855460ff9060701c1690565b614d51565b65ffffffffffff4216614d9c565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103215760206003193601126103215760043561139c816103cc565b6109946001600160a01b036113c4336001600160a01b03166000526000602052604060002090565b9261147c6113e76108fb86546dffffffffffffffffffffffffffff9060781c1690565b946113f3861515614db6565b6114546001820161142c65ffffffffffff611418835465ffffffffffff9060201c1690565b16611424811515614e01565b421015614e4c565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b604080516001600160a01b03831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af16114cc611a5d565b50614e97565b50346103215760606003193601126103215767ffffffffffffffff600435818111610321576115059036906004016111bc565b60243591611512836103cc565b6044359081116103215761152d610d6a9136906004016105ef565b611535611898565b61153e8561284d565b61155161154b8287612ba4565b9061483f565b9461156182600092438452611d0e565b9643825281936060956001600160a01b0383166115db575b5050505060800151936115a8604061159a602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016122b4565b839550839496506115f560409492939451809481936122a6565b03925af1906080611604611a5d565b929190388080611579565b50346103215761161e366111cb565b611626611898565b61162f8261284d565b6116398183612ba4565b825160a00151919391611659906001600160a01b0316614947565b614947565b9061167061165485516001600160a01b0390511690565b946116796125aa565b506116a861168c60409586810190611b3d565b906000601483106117de5750610fe361165492610fe9926125e2565b916116b29161483f565b80516001600160a01b0316906001600160a01b038216600181149160808801519787810151918860208201516116ed9065ffffffffffff1690565b91015165ffffffffffff1691606001519261170661054d565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a0880152151590816117d5575b506117775750610d6a92519485947fe0cff05f0000000000000000000000000000000000000000000000000000000086526004860161270a565b9190610d6a9361178684614947565b6117a061179161056d565b6001600160a01b039096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612685565b9050153861173d565b915050614947565b5034610321576020600319360112610321576001600160a01b0360043561180c816103cc565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff811161188b575b60051b0190565b611893610477565b611884565b604051906118a5826104a7565b604051608083610100830167ffffffffffffffff81118482101761190e575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611916610477565b6118c4565b9061192582611871565b611932604051918261051d565b828152601f196119428294611871565b019060005b82811061195357505050565b60209061195e611898565b82828501015201611947565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209181518110156119af575b60051b010190565b6119b761196a565b6119a7565b91908110156119fd575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610321570190565b611a0561196a565b6119c6565b6002805414611a195760028055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611a88573d90611a6e8261058d565b91611a7c604051938461051d565b82523d6000602084013e565b606090565b6001600160a01b03168015611af957600080809381935af1611aad611a5d565b5015611ab557565b606460405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b90816020910312610321575190565b601f8260209493601f19938186528686013760008582860101520116010190565b60005b838110611bd15750506000910152565b8181015183820152602001611bc1565b90601f19601f602093611bff81518092818752878088019101611bbe565b0116010190565b90611c206080916107b196946101c0808652850191611b9d565b9360e081516001600160a01b0380825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a0818403910152611be1565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611cf957565b6103ea611cbc565b91908201809211611cf957565b905a91816020611d276060830151936060810190611b3d565b90611d608560405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611e22575b50611e1b575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611dc757611dc1611db66107b1945a90611cec565b608084015190611d01565b916140a7565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b611e4491925060203d8111611e4b575b611e3c818361051d565b810190611b8e565b9038611d70565b503d611e32565b909291925a93806020611e6e6060830151946060810190611b3d565b90611ea78660405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611f6b575b50611f64575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611f0f57611f09611efe6107b195965a90611cec565b608083015190611d01565b92614317565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b611f8491925060203d8111611e4b57611e3c818361051d565b9038611eb7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611fb9570190565b611fc1611cbc565b0190565b9190811015612006575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610321570190565b61200e61196a565b611fcf565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b356107b1816103cc565b1561207857565b606460405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561032157016020813591019167ffffffffffffffff821161032157813603831361032157565b6107b19161212a8161211d846103f9565b6001600160a01b03169052565b602082013560208201526121c561217661215b61214a60408601866120bc565b610160806040880152860191611b9d565b61216860608601866120bc565b908583036060870152611b9d565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206121b8818601866120bc565b9185840390860152611b9d565b916121d661014091828101906120bc565b929091818503910152611b9d565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612227575050505050508460206107b195968503910152611b9d565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156122a25760019184612290920161210c565b98602090810196950193019190612208565b8280fd5b908092918237016000815290565b9290936107b196959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a08201520190611be1565b156122f757565b606460405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406107b192600081528160208201520190611be1565b6040906107b1939281528160208201520190611be1565b909291925a9361237b3033146122f0565b8151946040860151955a611388606083015189010111612474576107b19660009580516123c2575b505050906123bc915a90036080840151019436916105b8565b91614526565b6123e4916123e0916123db85516001600160a01b031690565b614f38565b1590565b6123f0575b80806123a3565b6123bc929194506123ff614f4a565b908151612413575b505060019390916123e9565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2016001600160a01b0360208701519261246a602061245883516001600160a01b031690565b92015195604051938493169683612353565b0390a33880612407565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b6124b46124ae6040830183611b3d565b90614f2d565b906124c56124ae6060830183611b3d565b906125616124da6124ae610120840184611b3d565b60405194859360208501956101008201359260e08301359260c08101359260a0820135926080830135926001600160a01b0360208201359135168c9693909a999895926101209895926001600160a01b036101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612575601f199384810183528261051d565b519020604080516020810192835230918101919091524660608201526080928301815290916125a4908261051d565b51902090565b604051906040820182811067ffffffffffffffff8211176125d5575b60405260006020838281520152565b6125dd610477565b6125c6565b906014116103215790601490565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000903581811693926014811061262557505050565b60140360031b82901b16169150565b9060c060a06107b193805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a08201520190611be1565b92946126e66103ea956126d46101009599986126c26126ae602097610140808c528b0190612634565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b6001600160a01b0381511660e0850152015191019060208091805184520151910152565b6127536103ea9461274161272c60a0959998969960e0865260e0860190612634565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261032157516107b1816103cc565b9160206107b1938181520191611b9d565b906127ac6001600160a01b03916107b197959694606085526060850191611b9d565b941660208201526040818503910152611b9d565b60009060033d116127cd57565b905060046000803e60005160e01c90565b600060443d106107b15760405160031991823d016004833e815167ffffffffffffffff918282113d60248401111761283c57818401948551938411612844573d8501016020848701011161283c57506107b19291016020019061051d565b949350505050565b50949350505050565b61285a6040820182611b3d565b61287261286684612067565b93610120810190611b3d565b9290303b15610321576000936128b69160405196879586957f957122ab0000000000000000000000000000000000000000000000000000000087526004870161278a565b0381305afa9081612926575b506103ea5760016128d16127c0565b6308c379a0146128ea575b6128e257565b6103ea611caf565b6128f26127de565b806128fe575b506128dc565b805160009250156128f857610d6a90604051918291631101335b60e11b83526004830161233b565b80610d91612933926104ed565b386128c2565b919061294490612b0a565b6001600160a01b0392918316612a8b57612a365761296190612b0a565b91166129e15761296e5750565b60408051631101335b60e11b815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b929190612aec90612b0a565b90926001600160a01b0380809516911603612a8b57612a3657612961905b8015612b5057612b19906147f1565b6001600160a01b0365ffffffffffff806040840151164211908115612b40575b5091511691565b9050602083015116421038612b39565b50600090600090565b15612b6057565b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a93815190612bb78282612f4b565b612bc08161249e565b6020840152612bfe6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e085013517171115612b59565b612c0782612ff3565b612c128185846130a7565b9790612c366123e0612c2b87516001600160a01b031690565b6020880151906148e4565b612cff57612c4343600052565b6001600160a01b03612c6160a060609701516001600160a01b031690565b16612ce5575b505a810360a084013510612c915760809360c092604087015260608601525a900391013501910152565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b90935081612cf69297508584613bac565b95909238612c67565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a8251612d668184612f4b565b612d6f8361249e565b6020850152612dad6effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e087013517171115612b59565b612db681612ff3565b612dc28186868b613387565b9890612de66123e0612ddb86516001600160a01b031690565b6020870151906148e4565b612eab57612df343600052565b6001600160a01b03612e1160a060609601516001600160a01b031690565b16612e90575b505a840360a086013510612e435750604085015260608401526080919060c0905a900391013501910152565b60408051631101335b60e11b815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b90925081612ea2929850868685613de6565b96909138612e17565b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b15612f0757565b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b612fb090612f68612f5b82612067565b6001600160a01b03168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611b3d565b908115612fe857612fda610fe9610fe38460a094612fd560146103ea99981015612f00565b6125e2565b6001600160a01b0316910152565b505060a06000910152565b60a08101516001600160a01b0316156130285760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161300b565b6130496040929594939560608352606083019061210c565b9460208201520152565b906103ea602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b810103600f81018552018361051d565b916000926000925a9361314e60208351936130c985516001600160a01b031690565b956130e16130da6040830183611b3d565b908461358d565b60a08601516001600160a01b0316906130f943600052565b8580936001600160a01b0380941615988961332c575b60600151908601516040517f3a871cdd000000000000000000000000000000000000000000000000000000008152978896879586939060048501613031565b03938a1690f182918161330c575b50613303575060019061316d6127c0565b6308c379a0146132c8575b50613274575b61318b575b50505a900391565b6131a8906001600160a01b03166000526000602052604060002090565b6131c36108fb82546dffffffffffffffffffffffffffff1690565b80831161322057613219926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613183565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b6132d06127de565b90816132dc5750613178565b610d6a916132ea9150613053565b604051918291631101335b60e11b83526004830161233b565b955061317e9050565b61332591925060203d8111611e4b57611e3c818361051d565b903861315c565b94506133656108fb6133518c6001600160a01b03166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b81111561337c5750856060835b9691505061310f565b606087918d03613373565b90926000936000935a946133c360208351936133aa85516001600160a01b031690565b956130e16133bb6040830183611b3d565b90848c613820565b03938a1690f182918161356d575b5061356457506001906133e26127c0565b6308c379a014613527575b506134d2575b613401575b5050505a900391565b61341e906001600160a01b03166000526000602052604060002090565b9161343a6108fb84546dffffffffffffffffffffffffffff1690565b90818311613485575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff161790553880806133f8565b60408051631101335b60e11b815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61352f6127de565b908161353b57506133ed565b86916135479150613053565b90610d6a604051928392631101335b60e11b845260048401612353565b96506133f39050565b61358691925060203d8111611e4b57611e3c818361051d565b90386133d1565b90918061359957505050565b8151516001600160a01b031692833b6137cc57606083510151604051907f570e1a36000000000000000000000000000000000000000000000000000000008252602082806135eb878760048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f19182156137bf575b60009261379f575b5080821695861561374b57168095036136f7573b156136a357610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613677936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a3565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6137b891925060203d81116111a857611199818361051d565b903861362d565b6137c7611caf565b613625565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161382f575b50505050565b8251516001600160a01b031693843b613a6557606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613881888860048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f1918215613a58575b600092613a38575b508082169687156139e3571680960361398e573b156139415750610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361390e936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a338808080613829565b60408051631101335b60e11b815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b613a5191925060203d81116111a857611199818361051d565b90386138c3565b613a60611caf565b6138bb565b60408051631101335b60e11b815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b15613ab957565b606460405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261032157825167ffffffffffffffff81116103215783019080601f8301121561032157815191613b348361058d565b91613b42604051938461051d565b8383526020848301011161032157602092613b6291848085019101611bbe565b92015190565b906103ea602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b939192606094600094600093805192613bde60a08a86015195613bd0888811613ab2565b01516001600160a01b031690565b91613bfc836001600160a01b03166000526000602052604060002090565b94613c186108fb87546dffffffffffffffffffffffffffff1690565b96858810613d92576001600160a01b0360208a9894613c818a966dffffffffffffffffffffffffffff8b613cba9e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e00000000000000000000000000000000000000000000000000000000855260048501613031565b0395169103f1908183918493613d6c575b50613d65575050600190613cdd6127c0565b6308c379a014613d43575b50613cef57565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d4b6127de565b9081613d575750613ce8565b610d6a916132ea9150613b68565b9450925050565b909250613d8b91503d8085833e613d83818361051d565b810190613afd565b9138613ccb565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b919492939093606095600095600093825190613e0d60a08b84015193613bd0848611613ab2565b93613e2b856001600160a01b03166000526000602052604060002090565b613e466108fb82546dffffffffffffffffffffffffffff1690565b878110613f7b57926001600160a01b0360208a98969394613c818a966dffffffffffffffffffffffffffff8d613eb39e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493613f5d575b50613f55575050600190613ed66127c0565b6308c379a014613f36575b50613ee95750565b60408051631101335b60e11b815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b613f3e6127de565b9081613f4a5750613ee1565b613547925050613b68565b955093505050565b909250613f7491503d8085833e613d83818361051d565b9138613ec4565b610d6a8a604051918291631101335b60e11b835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115613fda57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919061402760409160028652606060208701526060860190611be1565b930152565b939291906003811015613fda57604091614027918652606060208701526060860190611be1565b906103ea603660405180947f4141353020706f73744f702072657665727465643a200000000000000000000060208301526140978151809260208686019101611bbe565b810103601681018552018361051d565b929190925a936000918051916140bc836147aa565b9260a08101956140d387516001600160a01b031690565b6001600160a01b03939084811690816141f5575050506140fa82516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946141466020928c61419c95510390614998565b01519489602061416e61416086516001600160a01b031690565b9a516001600160a01b031690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614205575b50506140fc565b6060850151600099509091803b15614313579189918983614258956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f19081614300575b506142fb5760016142716127c0565b6308c379a0146142dc575b614288575b38806141fe565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6142e46127de565b806142ef575061427c565b6132ea610d6a91614053565b614281565b80610d9161430d926104ed565b38614262565b8980fd5b9392915a9060009280519061432b826147aa565b9360a083019661434288516001600160a01b031690565b6001600160a01b03959086811690816144055750505061436984516001600160a01b031690565b915b5a9003019485029860408301908a8251106143b857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94939261414661419c938c602094510390614998565b60408051631101335b60e11b815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614415575b505061436b565b606087015160009a509091803b1561452257918a918a83614468956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f1908161450f575b5061450a5760016144816127c0565b6308c379a0146144ed575b614498575b388061440e565b610d6a8b604051918291631101335b60e11b835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6144f56127de565b80614500575061448c565b6135478d91614053565b614491565b80610d9161451c926104ed565b38614472565b8a80fd5b909392915a94805191614538836147aa565b9260a081019561454f87516001600160a01b031690565b6001600160a01b039381851691826146105750505061457582516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946145c16020928c61419c95510390614998565b6145ca88613fd0565b0151948960206145e461416086516001600160a01b031690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151614620575b5050614577565b87840261462c8a613fd0565b60028a146146b7576060860151823b156103215761467f93600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f180156146aa575b614697575b505b3880614619565b80610d916146a4926104ed565b3861468e565b6146b2611caf565b614689565b6060860151823b156103215761470293600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f19081614797575b5061479257600161471b6127c0565b6308c379a01461477f575b1561469057604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6147876127de565b806142ef5750614726565b614690565b80610d916147a4926104ed565b3861470c565b60e060c08201519101518082146147ce574801808210156147c9575090565b905090565b5090565b604051906147df82610501565b60006040838281528260208201520152565b6147f96147d2565b5065ffffffffffff808260a01c168015614838575b6040519261481b84610501565b6001600160a01b038116845260d01c602084015216604082015290565b508061480e565b61485461485a9161484e6147d2565b506147f1565b916147f1565b906001600160a01b0391828251169283156148d9575b65ffffffffffff9283918260408160208501511693015116938360408160208401511692015116908084106148d1575b508085116148c9575b50604051956148b787610501565b16855216602084015216604082015290565b9350386148a9565b9250386148a0565b815181169350614870565b6001600160a01b0316600052600160205267ffffffffffffffff6149338260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9182549261494084611f8b565b9055161490565b906001600160a01b036149586125aa565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b6103ea33614a62565b6001600160a01b0316600052600060205260406000206dffffffffffffffffffffffffffff80825416928301809311614a55575b808311614a11576103ea92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b606460405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b614a5d611cbc565b6149cc565b6001600160a01b0390614a753482614998565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b15614ac857565b606460405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b15614b1357565b606460405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b15614b5e57565b606460405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b15614ba957565b606460405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff608060016103ea94614c4d6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b15614d5857565b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff80809416911601918211611cf957565b15614dbd57565b606460405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15614e0857565b606460405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15614e5357565b606460405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15614e9e57565b606460405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15614ee957565b606460405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211614f71575b50604051906020818301016040528082526000602083013e90565b905038614f5656fea2646970667358221220b97d7aa061056a5e9c6ad974ba3ad5c6b5a83463963e9d403739fd7b4356401664736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea264697066735822122036a5a8d538d88359007715214f81c5bd42079bac3c4d3005ea4a12098b5b92e964736f6c63430008110033", + "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b61002161498f565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c6117e6565b61000e565b5061010c61160f565b5061010c6114d2565b5061010c61137e565b5061010c611238565b5061010c611217565b5061010c6111f6565b5061010c6110a0565b5061010c610f39565b5061010c610f1c565b5061010c610ec2565b5061010c610d9d565b5061010c610a75565b5061010c6109db565b5061010c61088e565b5061010c6107b4565b5061010c61061d565b5061010c610404565b5061010c61034d565b5060206003193601126103215760043563ffffffff81168082036103215761031c7fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0191610246610216336001600160a01b03166000526000602052604060002090565b91610222811515614ac1565b61023f610236600185015463ffffffff1690565b63ffffffff1690565b1115614b0c565b54926102fe6dffffffffffffffffffffffffffff946102c961026d34888460781c16611d01565b96610279881515614b57565b61028581891115614ba2565b6102a981610291610540565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526102f9336001600160a01b03166000526000602052604060002090565b614bed565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361032157565b50346103215760206003193601126103215760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610321576103be9033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6103c88154611f8b565b9055005b6001600160a01b0381160361032157565b602435906103ea826103cc565b565b60c435906103ea826103cc565b35906103ea826103cc565b503461032157604060031936011261032157602061046e600435610427816103cc565b6001600160a01b03610437610326565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176104c357604052565b6104cb610477565b604052565b610100810190811067ffffffffffffffff8211176104c357604052565b67ffffffffffffffff81116104c357604052565b6060810190811067ffffffffffffffff8211176104c357604052565b90601f601f19910116810190811067ffffffffffffffff8211176104c357604052565b604051906103ea826104a7565b6040519060c0820182811067ffffffffffffffff8211176104c357604052565b604051906040820182811067ffffffffffffffff8211176104c357604052565b601f19601f60209267ffffffffffffffff81116105ab575b01160190565b6105b3610477565b6105a5565b9291926105c48261058d565b916105d2604051938461051d565b829481845281830111610321578281602093846000960137010152565b9181601f840112156103215782359167ffffffffffffffff8311610321576020838186019501011161032157565b5034610321576101c06003193601126103215767ffffffffffffffff6004358181116103215736602382011215610321576106629036906024816004013591016105b8565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610321576101006040519161069f836104a7565b12610321576040516106b0816104d0565b6106b86103dd565b815260443560208201526064356040820152608435606082015260a43560808201526106e26103ec565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a435918211610321576107569261073e6107469336906004016105ef565b92909161236a565b6040519081529081906020820190565b0390f35b9060406003198301126103215760043567ffffffffffffffff9283821161032157806023830112156103215781600401359384116103215760248460051b830101116103215760240191906024356107b1816103cc565b90565b5034610321576107c33661075a565b6107ce929192611a0a565b6107d78361191b565b60005b84811061085757506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b8583106108275761081d8585611a8d565b6100216001600255565b90919360019061084d61083b8789876119bc565b610845888661199a565b519088611e52565b019401919061080c565b8061088561087e61086c60019486989661199a565b51610878848a886119bc565b84612d53565b9083612939565b019290926107da565b5034610321576040600319360112610321576004356108ac816103cc565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff815416928383116109975784836001600160a01b03829593610947849661090e6108fb87986109949c611cec565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b604080516001600160a01b03831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af161098e611a5d565b50614ee2565b80f35b606460405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103215760406003193601126103215760206004356109fb816103cc565b6001600160a01b03610a0b610326565b911660005260018252610a468160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461032157610a843661075a565b610a8c611a0a565b6000805b838210610c5957610aa1915061191b565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610bcc57505060008093815b818110610b105761081d868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611a8d565b610b67610b1e82848a611fc5565b610b3c610b30610b3060208401612067565b6001600160a01b031690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612013565b906000915b808310610b8457505050610b7f90611f8b565b610ad9565b90919497610bbf610bb9610bc592610bb38c8b610bac82610ba68e8b8d6119bc565b9261199a565b5191611e52565b90611d01565b99611f8b565b95611f8b565b9190610b6c565b610bd7818688611fc5565b6020610bef610be68380612013565b92909301612067565b916001600160a01b0360009316905b828410610c175750505050610c1290611f8b565b610aca565b90919294610bbf81610c4c85610c45610c33610c51968d61199a565b51610c3f8c8b8a6119bc565b85612d53565b908b612ae0565b611f8b565b929190610bfe565b610c64828587611fc5565b90610c6f8280612013565b92610c7f610b3060208301612067565b916001600160a01b038316610c976001821415612071565b610cb8575b505050610cb291610cac91611d01565b91611f8b565b90610a90565b909592610cd16040999693999895989788810190611b3d565b92908a3b156103215789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610d18946121e4565b03815a93600094fa9081610d84575b50610d6e5786517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b038a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610cac610cb2610c9c565b80610d91610d97926104ed565b80610f11565b38610d27565b5034610321576020600319360112610321576107566001600160a01b03600435610dc6816103cc565b608060409283928351610dd8816104a7565b600093818580935282602082015282878201528260608201520152168152806020522090610e6765ffffffffffff6001835194610e14866104a7565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b5034610321576020600319360112610321576001600160a01b03600435610ee8816103cc565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261032157565b503461032157600060031936011261032157602060405160018152f35b503461032157606060031936011261032157600467ffffffffffffffff813581811161032157610f6c90369084016105ef565b905060243591610f7b836103cc565b60443590811161032157610f9290369085016105ef565b929091159081611096575b50611049576014821015610fd3575b610d6a8360405191829162461bcd60e51b8352820160409060208152600060208201520190565b610fe3610fef92610fe9926125e2565b906125f0565b60601c90565b3b15610ffc573880610fac565b610d6a9060405191829162461bcd60e51b8352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610d6a8360405191829162461bcd60e51b8352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b1538610f9d565b50346103215760206003193601126103215760043567ffffffffffffffff8111610321576110d460249136906004016105ef565b9061110a6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612779565b036020826001600160a01b0392816000857f0000000000000000000000000000000000000000000000000000000000000000165af19182156111af575b60009261117f575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b6111a191925060203d81116111a8575b611199818361051d565b810190612764565b903861114f565b503d61118f565b6111b7611caf565b611147565b90816101609103126103215790565b6020600319820112610321576004359067ffffffffffffffff8211610321576107b1916004016111bc565b503461032157602061120f61120a366111cb565b61249e565b604051908152f35b50602060031936011261032157610021600435611233816103cc565b614a62565b50346103215760008060031936011261137b573381528060205260408120600181019063ffffffff825416908115611337576112d46112996112fc9361128b611286855460ff9060701c1690565b614d51565b65ffffffffffff4216614d9c565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103215760206003193601126103215760043561139c816103cc565b6109946001600160a01b036113c4336001600160a01b03166000526000602052604060002090565b9261147c6113e76108fb86546dffffffffffffffffffffffffffff9060781c1690565b946113f3861515614db6565b6114546001820161142c65ffffffffffff611418835465ffffffffffff9060201c1690565b16611424811515614e01565b421015614e4c565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b604080516001600160a01b03831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af16114cc611a5d565b50614e97565b50346103215760606003193601126103215767ffffffffffffffff600435818111610321576115059036906004016111bc565b60243591611512836103cc565b6044359081116103215761152d610d6a9136906004016105ef565b611535611898565b61153e8561284d565b61155161154b8287612ba4565b9061483f565b9461156182600092438452611d0e565b9643825281936060956001600160a01b0383166115db575b5050505060800151936115a8604061159a602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016122b4565b839550839496506115f560409492939451809481936122a6565b03925af1906080611604611a5d565b929190388080611579565b50346103215761161e366111cb565b611626611898565b61162f8261284d565b6116398183612ba4565b825160a00151919391611659906001600160a01b0316614947565b614947565b9061167061165485516001600160a01b0390511690565b946116796125aa565b506116a861168c60409586810190611b3d565b906000601483106117de5750610fe361165492610fe9926125e2565b916116b29161483f565b80516001600160a01b0316906001600160a01b038216600181149160808801519787810151918860208201516116ed9065ffffffffffff1690565b91015165ffffffffffff1691606001519261170661054d565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a0880152151590816117d5575b506117775750610d6a92519485947fe0cff05f0000000000000000000000000000000000000000000000000000000086526004860161270a565b9190610d6a9361178684614947565b6117a061179161056d565b6001600160a01b039096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612685565b9050153861173d565b915050614947565b5034610321576020600319360112610321576001600160a01b0360043561180c816103cc565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff811161188b575b60051b0190565b611893610477565b611884565b604051906118a5826104a7565b604051608083610100830167ffffffffffffffff81118482101761190e575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611916610477565b6118c4565b9061192582611871565b611932604051918261051d565b828152601f196119428294611871565b019060005b82811061195357505050565b60209061195e611898565b82828501015201611947565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209181518110156119af575b60051b010190565b6119b761196a565b6119a7565b91908110156119fd575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610321570190565b611a0561196a565b6119c6565b6002805414611a195760028055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611a88573d90611a6e8261058d565b91611a7c604051938461051d565b82523d6000602084013e565b606090565b6001600160a01b03168015611af957600080809381935af1611aad611a5d565b5015611ab557565b606460405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b90816020910312610321575190565b601f8260209493601f19938186528686013760008582860101520116010190565b60005b838110611bd15750506000910152565b8181015183820152602001611bc1565b90601f19601f602093611bff81518092818752878088019101611bbe565b0116010190565b90611c206080916107b196946101c0808652850191611b9d565b9360e081516001600160a01b0380825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a0818403910152611be1565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611cf957565b6103ea611cbc565b91908201809211611cf957565b905a91816020611d276060830151936060810190611b3d565b90611d608560405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611e22575b50611e1b575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611dc757611dc1611db66107b1945a90611cec565b608084015190611d01565b916140a7565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b611e4491925060203d8111611e4b575b611e3c818361051d565b810190611b8e565b9038611d70565b503d611e32565b909291925a93806020611e6e6060830151946060810190611b3d565b90611ea78660405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611f6b575b50611f64575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611f0f57611f09611efe6107b195965a90611cec565b608083015190611d01565b92614317565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b611f8491925060203d8111611e4b57611e3c818361051d565b9038611eb7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611fb9570190565b611fc1611cbc565b0190565b9190811015612006575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610321570190565b61200e61196a565b611fcf565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b356107b1816103cc565b1561207857565b606460405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561032157016020813591019167ffffffffffffffff821161032157813603831361032157565b6107b19161212a8161211d846103f9565b6001600160a01b03169052565b602082013560208201526121c561217661215b61214a60408601866120bc565b610160806040880152860191611b9d565b61216860608601866120bc565b908583036060870152611b9d565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206121b8818601866120bc565b9185840390860152611b9d565b916121d661014091828101906120bc565b929091818503910152611b9d565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612227575050505050508460206107b195968503910152611b9d565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156122a25760019184612290920161210c565b98602090810196950193019190612208565b8280fd5b908092918237016000815290565b9290936107b196959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a08201520190611be1565b156122f757565b606460405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406107b192600081528160208201520190611be1565b6040906107b1939281528160208201520190611be1565b909291925a9361237b3033146122f0565b8151946040860151955a611388606083015189010111612474576107b19660009580516123c2575b505050906123bc915a90036080840151019436916105b8565b91614526565b6123e4916123e0916123db85516001600160a01b031690565b614f38565b1590565b6123f0575b80806123a3565b6123bc929194506123ff614f4a565b908151612413575b505060019390916123e9565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2016001600160a01b0360208701519261246a602061245883516001600160a01b031690565b92015195604051938493169683612353565b0390a33880612407565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b6124b46124ae6040830183611b3d565b90614f2d565b906124c56124ae6060830183611b3d565b906125616124da6124ae610120840184611b3d565b60405194859360208501956101008201359260e08301359260c08101359260a0820135926080830135926001600160a01b0360208201359135168c9693909a999895926101209895926001600160a01b036101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612575601f199384810183528261051d565b519020604080516020810192835230918101919091524660608201526080928301815290916125a4908261051d565b51902090565b604051906040820182811067ffffffffffffffff8211176125d5575b60405260006020838281520152565b6125dd610477565b6125c6565b906014116103215790601490565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000903581811693926014811061262557505050565b60140360031b82901b16169150565b9060c060a06107b193805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a08201520190611be1565b92946126e66103ea956126d46101009599986126c26126ae602097610140808c528b0190612634565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b6001600160a01b0381511660e0850152015191019060208091805184520151910152565b6127536103ea9461274161272c60a0959998969960e0865260e0860190612634565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261032157516107b1816103cc565b9160206107b1938181520191611b9d565b906127ac6001600160a01b03916107b197959694606085526060850191611b9d565b941660208201526040818503910152611b9d565b60009060033d116127cd57565b905060046000803e60005160e01c90565b600060443d106107b15760405160031991823d016004833e815167ffffffffffffffff918282113d60248401111761283c57818401948551938411612844573d8501016020848701011161283c57506107b19291016020019061051d565b949350505050565b50949350505050565b61285a6040820182611b3d565b61287261286684612067565b93610120810190611b3d565b9290303b15610321576000936128b69160405196879586957f957122ab0000000000000000000000000000000000000000000000000000000087526004870161278a565b0381305afa9081612926575b506103ea5760016128d16127c0565b6308c379a0146128ea575b6128e257565b6103ea611caf565b6128f26127de565b806128fe575b506128dc565b805160009250156128f857610d6a90604051918291631101335b60e11b83526004830161233b565b80610d91612933926104ed565b386128c2565b919061294490612b0a565b6001600160a01b0392918316612a8b57612a365761296190612b0a565b91166129e15761296e5750565b60408051631101335b60e11b815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b929190612aec90612b0a565b90926001600160a01b0380809516911603612a8b57612a3657612961905b8015612b5057612b19906147f1565b6001600160a01b0365ffffffffffff806040840151164211908115612b40575b5091511691565b9050602083015116421038612b39565b50600090600090565b15612b6057565b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a93815190612bb78282612f4b565b612bc08161249e565b6020840152612bfe6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e085013517171115612b59565b612c0782612ff3565b612c128185846130a7565b9790612c366123e0612c2b87516001600160a01b031690565b6020880151906148e4565b612cff57612c4343600052565b6001600160a01b03612c6160a060609701516001600160a01b031690565b16612ce5575b505a810360a084013510612c915760809360c092604087015260608601525a900391013501910152565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b90935081612cf69297508584613bac565b95909238612c67565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a8251612d668184612f4b565b612d6f8361249e565b6020850152612dad6effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e087013517171115612b59565b612db681612ff3565b612dc28186868b613387565b9890612de66123e0612ddb86516001600160a01b031690565b6020870151906148e4565b612eab57612df343600052565b6001600160a01b03612e1160a060609601516001600160a01b031690565b16612e90575b505a840360a086013510612e435750604085015260608401526080919060c0905a900391013501910152565b60408051631101335b60e11b815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b90925081612ea2929850868685613de6565b96909138612e17565b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b15612f0757565b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b612fb090612f68612f5b82612067565b6001600160a01b03168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611b3d565b908115612fe857612fda610fe9610fe38460a094612fd560146103ea99981015612f00565b6125e2565b6001600160a01b0316910152565b505060a06000910152565b60a08101516001600160a01b0316156130285760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161300b565b6130496040929594939560608352606083019061210c565b9460208201520152565b906103ea602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b810103600f81018552018361051d565b916000926000925a9361314e60208351936130c985516001600160a01b031690565b956130e16130da6040830183611b3d565b908461358d565b60a08601516001600160a01b0316906130f943600052565b8580936001600160a01b0380941615988961332c575b60600151908601516040517f3a871cdd000000000000000000000000000000000000000000000000000000008152978896879586939060048501613031565b03938a1690f182918161330c575b50613303575060019061316d6127c0565b6308c379a0146132c8575b50613274575b61318b575b50505a900391565b6131a8906001600160a01b03166000526000602052604060002090565b6131c36108fb82546dffffffffffffffffffffffffffff1690565b80831161322057613219926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613183565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b6132d06127de565b90816132dc5750613178565b610d6a916132ea9150613053565b604051918291631101335b60e11b83526004830161233b565b955061317e9050565b61332591925060203d8111611e4b57611e3c818361051d565b903861315c565b94506133656108fb6133518c6001600160a01b03166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b81111561337c5750856060835b9691505061310f565b606087918d03613373565b90926000936000935a946133c360208351936133aa85516001600160a01b031690565b956130e16133bb6040830183611b3d565b90848c613820565b03938a1690f182918161356d575b5061356457506001906133e26127c0565b6308c379a014613527575b506134d2575b613401575b5050505a900391565b61341e906001600160a01b03166000526000602052604060002090565b9161343a6108fb84546dffffffffffffffffffffffffffff1690565b90818311613485575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff161790553880806133f8565b60408051631101335b60e11b815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61352f6127de565b908161353b57506133ed565b86916135479150613053565b90610d6a604051928392631101335b60e11b845260048401612353565b96506133f39050565b61358691925060203d8111611e4b57611e3c818361051d565b90386133d1565b90918061359957505050565b8151516001600160a01b031692833b6137cc57606083510151604051907f570e1a36000000000000000000000000000000000000000000000000000000008252602082806135eb878760048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f19182156137bf575b60009261379f575b5080821695861561374b57168095036136f7573b156136a357610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613677936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a3565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6137b891925060203d81116111a857611199818361051d565b903861362d565b6137c7611caf565b613625565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161382f575b50505050565b8251516001600160a01b031693843b613a6557606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613881888860048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f1918215613a58575b600092613a38575b508082169687156139e3571680960361398e573b156139415750610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361390e936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a338808080613829565b60408051631101335b60e11b815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b613a5191925060203d81116111a857611199818361051d565b90386138c3565b613a60611caf565b6138bb565b60408051631101335b60e11b815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b15613ab957565b606460405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261032157825167ffffffffffffffff81116103215783019080601f8301121561032157815191613b348361058d565b91613b42604051938461051d565b8383526020848301011161032157602092613b6291848085019101611bbe565b92015190565b906103ea602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b939192606094600094600093805192613bde60a08a86015195613bd0888811613ab2565b01516001600160a01b031690565b91613bfc836001600160a01b03166000526000602052604060002090565b94613c186108fb87546dffffffffffffffffffffffffffff1690565b96858810613d92576001600160a01b0360208a9894613c818a966dffffffffffffffffffffffffffff8b613cba9e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e00000000000000000000000000000000000000000000000000000000855260048501613031565b0395169103f1908183918493613d6c575b50613d65575050600190613cdd6127c0565b6308c379a014613d43575b50613cef57565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d4b6127de565b9081613d575750613ce8565b610d6a916132ea9150613b68565b9450925050565b909250613d8b91503d8085833e613d83818361051d565b810190613afd565b9138613ccb565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b919492939093606095600095600093825190613e0d60a08b84015193613bd0848611613ab2565b93613e2b856001600160a01b03166000526000602052604060002090565b613e466108fb82546dffffffffffffffffffffffffffff1690565b878110613f7b57926001600160a01b0360208a98969394613c818a966dffffffffffffffffffffffffffff8d613eb39e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493613f5d575b50613f55575050600190613ed66127c0565b6308c379a014613f36575b50613ee95750565b60408051631101335b60e11b815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b613f3e6127de565b9081613f4a5750613ee1565b613547925050613b68565b955093505050565b909250613f7491503d8085833e613d83818361051d565b9138613ec4565b610d6a8a604051918291631101335b60e11b835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115613fda57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919061402760409160028652606060208701526060860190611be1565b930152565b939291906003811015613fda57604091614027918652606060208701526060860190611be1565b906103ea603660405180947f4141353020706f73744f702072657665727465643a200000000000000000000060208301526140978151809260208686019101611bbe565b810103601681018552018361051d565b929190925a936000918051916140bc836147aa565b9260a08101956140d387516001600160a01b031690565b6001600160a01b03939084811690816141f5575050506140fa82516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946141466020928c61419c95510390614998565b01519489602061416e61416086516001600160a01b031690565b9a516001600160a01b031690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614205575b50506140fc565b6060850151600099509091803b15614313579189918983614258956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f19081614300575b506142fb5760016142716127c0565b6308c379a0146142dc575b614288575b38806141fe565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6142e46127de565b806142ef575061427c565b6132ea610d6a91614053565b614281565b80610d9161430d926104ed565b38614262565b8980fd5b9392915a9060009280519061432b826147aa565b9360a083019661434288516001600160a01b031690565b6001600160a01b03959086811690816144055750505061436984516001600160a01b031690565b915b5a9003019485029860408301908a8251106143b857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94939261414661419c938c602094510390614998565b60408051631101335b60e11b815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614415575b505061436b565b606087015160009a509091803b1561452257918a918a83614468956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f1908161450f575b5061450a5760016144816127c0565b6308c379a0146144ed575b614498575b388061440e565b610d6a8b604051918291631101335b60e11b835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6144f56127de565b80614500575061448c565b6135478d91614053565b614491565b80610d9161451c926104ed565b38614472565b8a80fd5b909392915a94805191614538836147aa565b9260a081019561454f87516001600160a01b031690565b6001600160a01b039381851691826146105750505061457582516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946145c16020928c61419c95510390614998565b6145ca88613fd0565b0151948960206145e461416086516001600160a01b031690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151614620575b5050614577565b87840261462c8a613fd0565b60028a146146b7576060860151823b156103215761467f93600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f180156146aa575b614697575b505b3880614619565b80610d916146a4926104ed565b3861468e565b6146b2611caf565b614689565b6060860151823b156103215761470293600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f19081614797575b5061479257600161471b6127c0565b6308c379a01461477f575b1561469057604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6147876127de565b806142ef5750614726565b614690565b80610d916147a4926104ed565b3861470c565b60e060c08201519101518082146147ce574801808210156147c9575090565b905090565b5090565b604051906147df82610501565b60006040838281528260208201520152565b6147f96147d2565b5065ffffffffffff808260a01c168015614838575b6040519261481b84610501565b6001600160a01b038116845260d01c602084015216604082015290565b508061480e565b61485461485a9161484e6147d2565b506147f1565b916147f1565b906001600160a01b0391828251169283156148d9575b65ffffffffffff9283918260408160208501511693015116938360408160208401511692015116908084106148d1575b508085116148c9575b50604051956148b787610501565b16855216602084015216604082015290565b9350386148a9565b9250386148a0565b815181169350614870565b6001600160a01b0316600052600160205267ffffffffffffffff6149338260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9182549261494084611f8b565b9055161490565b906001600160a01b036149586125aa565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b6103ea33614a62565b6001600160a01b0316600052600060205260406000206dffffffffffffffffffffffffffff80825416928301809311614a55575b808311614a11576103ea92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b606460405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b614a5d611cbc565b6149cc565b6001600160a01b0390614a753482614998565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b15614ac857565b606460405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b15614b1357565b606460405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b15614b5e57565b606460405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b15614ba957565b606460405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff608060016103ea94614c4d6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b15614d5857565b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff80809416911601918211611cf957565b15614dbd57565b606460405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15614e0857565b606460405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15614e5357565b606460405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15614e9e57565b606460405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15614ee957565b606460405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211614f71575b50604051906020818301016040528082526000602083013e90565b905038614f5656fea2646970667358221220b97d7aa061056a5e9c6ad974ba3ad5c6b5a83463963e9d403739fd7b4356401664736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/EntryPointWrapper.json b/packages/boba/account-abstraction/deployments/boba_goerli/EntryPointWrapper.json new file mode 100644 index 0000000000..ff72b1dab1 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/EntryPointWrapper.json @@ -0,0 +1,620 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "EntryPointWrapper", + "sourceName": "contracts/bundler/EntryPointWrapper.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "_entryPoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "opIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "FailedOp", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "SenderAddressResult", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "sigFailed", + "type": "bool" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "paymasterContext", + "type": "bytes" + } + ], + "internalType": "struct EntryPointWrapper.ReturnInfo", + "name": "returnInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "senderInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "factoryInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "paymasterInfo", + "type": "tuple" + } + ], + "name": "ValidationResult", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "sigFailed", + "type": "bool" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "paymasterContext", + "type": "bytes" + } + ], + "internalType": "struct EntryPointWrapper.ReturnInfo", + "name": "returnInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "senderInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "factoryInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "paymasterInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "aggregator", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "stakeInfo", + "type": "tuple" + } + ], + "internalType": "struct EntryPointWrapper.AggregatorStakeInfo", + "name": "aggregatorInfo", + "type": "tuple" + } + ], + "name": "ValidationResultWithAggregation", + "type": "error" + }, + { + "inputs": [], + "name": "entryPoint", + "outputs": [ + { + "internalType": "contract IEntryPoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getCodeHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + } + ], + "name": "getSenderAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "entryPoint", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation[]", + "name": "userOps", + "type": "tuple[]" + } + ], + "name": "getUserOpHashes", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "ret", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "initCode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "callGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "verificationGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preVerificationGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymasterAndData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct UserOperation", + "name": "userOp", + "type": "tuple" + } + ], + "name": "simulateValidation", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "status", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "opIndex", + "type": "uint256" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "internalType": "struct EntryPointWrapper.FailedOpStatus", + "name": "", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "selectorType", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "preOpGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prefund", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "sigFailed", + "type": "bool" + }, + { + "internalType": "uint48", + "name": "validAfter", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "validUntil", + "type": "uint48" + }, + { + "internalType": "bytes", + "name": "paymasterContext", + "type": "bytes" + } + ], + "internalType": "struct EntryPointWrapper.ReturnInfo", + "name": "returnInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "senderInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "factoryInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "paymasterInfo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "aggregator", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unstakeDelaySec", + "type": "uint256" + } + ], + "internalType": "struct EntryPointWrapper.StakeInfo", + "name": "stakeInfo", + "type": "tuple" + } + ], + "internalType": "struct EntryPointWrapper.AggregatorStakeInfo", + "name": "aggregatorInfo", + "type": "tuple" + } + ], + "internalType": "struct EntryPointWrapper.Response", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6000608081905260a08190526001819055600281905560c081905261010081815261012082905260e052600380546001600160a01b0319169055600481905560058190556101408181526101608290526101808290526101a08290526101c08290526102008281526102206040526101e08190526006838155600793909355600880546001600160681b0319169055909190600990620000a09082620004a5565b50506040805160e081018252600060c08083019182529082528251908101835260068054825260075460208381019190915260085460ff811615159584019590955265ffffffffffff610100860481166060850152670100000000000000909504909416608083015260098054939550938501939192909160a0840191620001289062000416565b80601f0160208091040260200160405190810160405280929190818152602001828054620001569062000416565b8015620001a75780601f106200017b57610100808354040283529160200191620001a7565b820191906000526020600020905b8154815290600101906020018083116200018957829003601f168201915b505050919092525050508152604080518082018252600154808252600254602083810182905280860193909352835180850185528281528084018290528486015283518085018552918252818301526060840152815180830183526003546001600160a01b031681528251808401909352600454835260055483830152908101919091526080909101528051600a908190620002449082620004a5565b5060208281015180516001840190815591810151600284015560408101516003840180546060840151608085015166ffffffffffffff1990921693151566ffffffffffff0019169390931761010065ffffffffffff948516021765ffffffffffff60381b1916670100000000000000939091169290920291909117905560a08101519091906004840190620002da9082620004a5565b505050604082810151805160058401556020908101516006840155606080850151805160078601558201516008850155608085015180516009860155820151600a85015560a0909401518051600b850180546001600160a01b0319166001600160a01b039092169190911790558101518051600c850155810151600d909301929092558051928301815260008084528383018181528251938401835290835290830182905282516018805460ff1916911515919091178155905160195590601a90620003a79082620004a5565b505050348015620003b757600080fd5b506040516200223438038062002234833981016040819052620003da9162000571565b600080546001600160a01b0319166001600160a01b0392909216919091179055620005a3565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200042b57607f821691505b6020821081036200044c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004a057600081815260208120601f850160051c810160208610156200047b5750805b601f850160051c820191505b818110156200049c5782815560010162000487565b5050505b505050565b81516001600160401b03811115620004c157620004c162000400565b620004d981620004d2845462000416565b8462000452565b602080601f831160018114620005115760008415620004f85750858301515b600019600386901b1c1916600185901b1785556200049c565b600085815260208120601f198616915b82811015620005425788860151825594840194600190910190840162000521565b5085821015620005615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200058457600080fd5b81516001600160a01b03811681146200059c57600080fd5b9392505050565b611c8180620005b36000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b249f69116100505780639b249f69146100b6578063b0d691fe146100ee578063ee2194231461010e57600080fd5b80633024e00c1461006c5780637b34b62114610095575b600080fd5b61007f61007a36600461103a565b61012f565b60405161008c91906111f9565b60405180910390f35b6100a86100a336600461123d565b61024d565b60405190815260200161008c565b6100c96100c43660046112d7565b610336565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008c565b6000546100c99073ffffffffffffffffffffffffffffffffffffffff1681565b61012161011c366004611349565b6104e3565b60405161008c9291906113e1565b6060815167ffffffffffffffff81111561014b5761014b610eb8565b604051908082528060200260200182016040528015610174578160200160208202803683370190505b50905060005b8251811015610245578373ffffffffffffffffffffffffffffffffffffffff1663a61935318483815181106101b1576101b161152b565b60200260200101516040518263ffffffff1660e01b81526004016101d5919061155a565b602060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102169190611648565b8282815181106102285761022861152b565b60209081029190910101528061023d81611690565b91505061017a565b505b92915050565b600080825167ffffffffffffffff81111561026a5761026a610eb8565b604051908082528060200260200182016040528015610293578160200160208202803683370190505b50905060005b8351811015610302578381815181106102b4576102b461152b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102e5576102e561152b565b6020908102919091010152806102fa81611690565b915050610299565b5060008160405160200161031691906111f9565b60408051601f198184030181529190528051602090910120949350505050565b600080546040517f9b249f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b249f699061038f90869086906004016116f3565b600060405180830381600087803b1580156103a957600080fd5b505af19250505080156103ba575060015b610247573d8080156103e8576040519150601f19603f3d011682016040523d82523d6000602084013e6103ed565b606091505b5060006103f98261170f565b90507f935847fa000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161047c57600061045e836004808651610459919061175f565b610c39565b8060200190518101906104719190611776565b935061024792505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420696e6974436f64650000000000000000000000000000000060448201526064015b60405180910390fd5b60408051606080820183526000808352602083015291810191909152610507610d97565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061055d9086906004016117fe565b600060405180830381600087803b15801561057757600080fd5b505af1925050508015610588575060015b610c34573d8080156105b6576040519150601f19603f3d011682016040523d82523d6000602084013e6105bb565b606091505b5060006105c78261170f565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016107a75760008060008061062b866004808951610459919061175f565b80602001905181019061063e9190611a3c565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161071490611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461074090611aae565b801561078d5780601f106107625761010080835404028352916020019161078d565b820191906000526020600020905b81548152906001019060200180831161077057829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161095357600080600080600061080b876004808a51610459919061175f565b80602001905181019061081e9190611b01565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916108bf90611aae565b80601f01602080910402602001604051908101604052809291908181526020018280546108eb90611aae565b80156109385780601f1061090d57610100808354040283529160200191610938565b820191906000526020600020905b81548152906001019060200180831161091b57829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610c31576000806109b2846004808751610459919061175f565b8060200190518101906109c59190611bd8565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c0016040529081600082018054610a0590611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611aae565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a0840191610afc90611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890611aae565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610c4781601f611c33565b1015610caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104da565b610cb98284611c33565b84511015610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104da565b606082158015610d425760405191506000825260208201604052610d8c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d7b578051835260209283019201610d63565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610df8604051806040016040528060008152602001600081525090565b8152602001610e1a604051806040016040528060008152602001600081525090565b8152602001610e3c604051806040016040528060008152602001600081525090565b8152602001610e49610e4e565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610e49604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b60405290565b60405160c0810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b6040805190810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f8057610f80610eb8565b604052919050565b600067ffffffffffffffff821115610fa257610fa2610eb8565b5060051b60200190565b8035610fb781610e93565b919050565b600067ffffffffffffffff821115610fd657610fd6610eb8565b50601f01601f191660200190565b600082601f830112610ff557600080fd5b813561100861100382610fbc565b610f57565b81815284602083860101111561101d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561104d57600080fd5b823561105881610e93565b915060208381013567ffffffffffffffff8082111561107657600080fd5b818601915086601f83011261108a57600080fd5b813561109861100382610f88565b81815260059190911b830184019084810190898311156110b757600080fd5b8585015b838110156111e8578035858111156110d257600080fd5b8601610160818d03601f190112156110e957600080fd5b6110f1610ee7565b6110fc898301610fac565b815260408201358982015260608201358781111561111957600080fd5b6111278e8b83860101610fe4565b60408301525060808201358781111561113f57600080fd5b61114d8e8b83860101610fe4565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e0820152610120820135610100820152610140808301358881111561119c57600080fd5b6111aa8f8c83870101610fe4565b61012084015250610160830135888111156111c457600080fd5b6111d28f8c83870101610fe4565b91830191909152508452509186019186016110bb565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561123157835183529284019291840191600101611215565b50909695505050505050565b6000602080838503121561125057600080fd5b823567ffffffffffffffff81111561126757600080fd5b8301601f8101851361127857600080fd5b803561128661100382610f88565b81815260059190911b820183019083810190878311156112a557600080fd5b928401925b828410156112cc5783356112bd81610e93565b825292840192908401906112aa565b979650505050505050565b600080602083850312156112ea57600080fd5b823567ffffffffffffffff8082111561130257600080fd5b818501915085601f83011261131657600080fd5b81358181111561132557600080fd5b86602082850101111561133757600080fd5b60209290920196919550909350505050565b60006020828403121561135b57600080fd5b813567ffffffffffffffff81111561137257600080fd5b82016101608185031215610d9057600080fd5b60005b838110156113a0578181015183820152602001611388565b838111156113af576000848401525b50505050565b600081518084526113cd816020860160208601611385565b601f01601f19169290920160200192915050565b6000604080835284511515818401526020808601516060850152818601516060608086015261141360a08601826113b5565b9050848103828601526101608651818352611430828401826113b5565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261149360c08201846113b5565b925050828601516114b08483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a08601519250611521610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261158160208201835173ffffffffffffffffffffffffffffffffffffffff169052565b60208201516040820152600060408301516101608060608501526115a96101808501836113b5565b91506060850151601f19808685030160808701526115c784836113b5565b9350608087015160a087015260a087015160c087015260c087015160e087015260e0870151915061010082818801528088015192505061012082818801528088015192505061014081878603018188015261162285846113b5565b90880151878203909201848801529350905061163e83826113b5565b9695505050505050565b60006020828403121561165a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116c1576116c1611661565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006117076020830184866116c8565b949350505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156117575780818460040360031b1b83161693505b505050919050565b60008282101561177157611771611661565b500390565b60006020828403121561178857600080fd5b8151610d9081610e93565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126117c857600080fd5b830160208101925035905067ffffffffffffffff8111156117e857600080fd5b8036038213156117f757600080fd5b9250929050565b6020815261182c6020820161181284610fac565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006118456040840184611793565b61016080606086015261185d610180860183856116c8565b925061186c6060870187611793565b9250601f19808786030160808801526118868585846116c8565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526118cd82890189611793565b945091506101408188870301818901526118e88686856116c8565b95506118f6818a018a611793565b9550925050808786030183880152506112cc8484836116c8565b805165ffffffffffff81168114610fb757600080fd5b600061193461100384610fbc565b905082815283838301111561194857600080fd5b610d90836020830184611385565b600082601f83011261196757600080fd5b610d9083835160208501611926565b600060c0828403121561198857600080fd5b611990610f11565b90508151815260208201516020820152604082015180151581146119b357600080fd5b60408201526119c460608301611910565b60608201526119d560808301611910565b608082015260a082015167ffffffffffffffff8111156119f457600080fd5b611a0084828501611956565b60a08301525092915050565b600060408284031215611a1e57600080fd5b611a26610f34565b9050815181526020820151602082015292915050565b60008060008060e08587031215611a5257600080fd5b845167ffffffffffffffff811115611a6957600080fd5b611a7587828801611976565b945050611a858660208701611a0c565b9250611a948660608701611a0c565b9150611aa38660a08701611a0c565b905092959194509250565b600181811c90821680611ac257607f821691505b602082108103611afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000806000806000858703610140811215611b1b57600080fd5b865167ffffffffffffffff811115611b3257600080fd5b611b3e89828a01611976565b965050611b4e8860208901611a0c565b9450611b5d8860608901611a0c565b9350611b6c8860a08901611a0c565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2082011215611b9e57600080fd5b50611ba7610f34565b60e0870151611bb581610e93565b8152611bc5886101008901611a0c565b6020820152809150509295509295909350565b60008060408385031215611beb57600080fd5b82519150602083015167ffffffffffffffff811115611c0957600080fd5b8301601f81018513611c1a57600080fd5b611c2985825160208401611926565b9150509250929050565b60008219821115611c4657611c46611661565b50019056fea26469706673582212209a1c7252e82e84056f2a73f6c8f87a6651303771a673fe8cebe2dbe5467b390664736f6c634300080f0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b249f69116100505780639b249f69146100b6578063b0d691fe146100ee578063ee2194231461010e57600080fd5b80633024e00c1461006c5780637b34b62114610095575b600080fd5b61007f61007a36600461103a565b61012f565b60405161008c91906111f9565b60405180910390f35b6100a86100a336600461123d565b61024d565b60405190815260200161008c565b6100c96100c43660046112d7565b610336565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008c565b6000546100c99073ffffffffffffffffffffffffffffffffffffffff1681565b61012161011c366004611349565b6104e3565b60405161008c9291906113e1565b6060815167ffffffffffffffff81111561014b5761014b610eb8565b604051908082528060200260200182016040528015610174578160200160208202803683370190505b50905060005b8251811015610245578373ffffffffffffffffffffffffffffffffffffffff1663a61935318483815181106101b1576101b161152b565b60200260200101516040518263ffffffff1660e01b81526004016101d5919061155a565b602060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102169190611648565b8282815181106102285761022861152b565b60209081029190910101528061023d81611690565b91505061017a565b505b92915050565b600080825167ffffffffffffffff81111561026a5761026a610eb8565b604051908082528060200260200182016040528015610293578160200160208202803683370190505b50905060005b8351811015610302578381815181106102b4576102b461152b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102e5576102e561152b565b6020908102919091010152806102fa81611690565b915050610299565b5060008160405160200161031691906111f9565b60408051601f198184030181529190528051602090910120949350505050565b600080546040517f9b249f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b249f699061038f90869086906004016116f3565b600060405180830381600087803b1580156103a957600080fd5b505af19250505080156103ba575060015b610247573d8080156103e8576040519150601f19603f3d011682016040523d82523d6000602084013e6103ed565b606091505b5060006103f98261170f565b90507f935847fa000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161047c57600061045e836004808651610459919061175f565b610c39565b8060200190518101906104719190611776565b935061024792505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420696e6974436f64650000000000000000000000000000000060448201526064015b60405180910390fd5b60408051606080820183526000808352602083015291810191909152610507610d97565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061055d9086906004016117fe565b600060405180830381600087803b15801561057757600080fd5b505af1925050508015610588575060015b610c34573d8080156105b6576040519150601f19603f3d011682016040523d82523d6000602084013e6105bb565b606091505b5060006105c78261170f565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016107a75760008060008061062b866004808951610459919061175f565b80602001905181019061063e9190611a3c565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161071490611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461074090611aae565b801561078d5780601f106107625761010080835404028352916020019161078d565b820191906000526020600020905b81548152906001019060200180831161077057829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161095357600080600080600061080b876004808a51610459919061175f565b80602001905181019061081e9190611b01565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916108bf90611aae565b80601f01602080910402602001604051908101604052809291908181526020018280546108eb90611aae565b80156109385780601f1061090d57610100808354040283529160200191610938565b820191906000526020600020905b81548152906001019060200180831161091b57829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610c31576000806109b2846004808751610459919061175f565b8060200190518101906109c59190611bd8565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c0016040529081600082018054610a0590611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611aae565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a0840191610afc90611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890611aae565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610c4781601f611c33565b1015610caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104da565b610cb98284611c33565b84511015610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104da565b606082158015610d425760405191506000825260208201604052610d8c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d7b578051835260209283019201610d63565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610df8604051806040016040528060008152602001600081525090565b8152602001610e1a604051806040016040528060008152602001600081525090565b8152602001610e3c604051806040016040528060008152602001600081525090565b8152602001610e49610e4e565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610e49604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b60405290565b60405160c0810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b6040805190810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f8057610f80610eb8565b604052919050565b600067ffffffffffffffff821115610fa257610fa2610eb8565b5060051b60200190565b8035610fb781610e93565b919050565b600067ffffffffffffffff821115610fd657610fd6610eb8565b50601f01601f191660200190565b600082601f830112610ff557600080fd5b813561100861100382610fbc565b610f57565b81815284602083860101111561101d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561104d57600080fd5b823561105881610e93565b915060208381013567ffffffffffffffff8082111561107657600080fd5b818601915086601f83011261108a57600080fd5b813561109861100382610f88565b81815260059190911b830184019084810190898311156110b757600080fd5b8585015b838110156111e8578035858111156110d257600080fd5b8601610160818d03601f190112156110e957600080fd5b6110f1610ee7565b6110fc898301610fac565b815260408201358982015260608201358781111561111957600080fd5b6111278e8b83860101610fe4565b60408301525060808201358781111561113f57600080fd5b61114d8e8b83860101610fe4565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e0820152610120820135610100820152610140808301358881111561119c57600080fd5b6111aa8f8c83870101610fe4565b61012084015250610160830135888111156111c457600080fd5b6111d28f8c83870101610fe4565b91830191909152508452509186019186016110bb565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561123157835183529284019291840191600101611215565b50909695505050505050565b6000602080838503121561125057600080fd5b823567ffffffffffffffff81111561126757600080fd5b8301601f8101851361127857600080fd5b803561128661100382610f88565b81815260059190911b820183019083810190878311156112a557600080fd5b928401925b828410156112cc5783356112bd81610e93565b825292840192908401906112aa565b979650505050505050565b600080602083850312156112ea57600080fd5b823567ffffffffffffffff8082111561130257600080fd5b818501915085601f83011261131657600080fd5b81358181111561132557600080fd5b86602082850101111561133757600080fd5b60209290920196919550909350505050565b60006020828403121561135b57600080fd5b813567ffffffffffffffff81111561137257600080fd5b82016101608185031215610d9057600080fd5b60005b838110156113a0578181015183820152602001611388565b838111156113af576000848401525b50505050565b600081518084526113cd816020860160208601611385565b601f01601f19169290920160200192915050565b6000604080835284511515818401526020808601516060850152818601516060608086015261141360a08601826113b5565b9050848103828601526101608651818352611430828401826113b5565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261149360c08201846113b5565b925050828601516114b08483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a08601519250611521610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261158160208201835173ffffffffffffffffffffffffffffffffffffffff169052565b60208201516040820152600060408301516101608060608501526115a96101808501836113b5565b91506060850151601f19808685030160808701526115c784836113b5565b9350608087015160a087015260a087015160c087015260c087015160e087015260e0870151915061010082818801528088015192505061012082818801528088015192505061014081878603018188015261162285846113b5565b90880151878203909201848801529350905061163e83826113b5565b9695505050505050565b60006020828403121561165a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116c1576116c1611661565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006117076020830184866116c8565b949350505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156117575780818460040360031b1b83161693505b505050919050565b60008282101561177157611771611661565b500390565b60006020828403121561178857600080fd5b8151610d9081610e93565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126117c857600080fd5b830160208101925035905067ffffffffffffffff8111156117e857600080fd5b8036038213156117f757600080fd5b9250929050565b6020815261182c6020820161181284610fac565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006118456040840184611793565b61016080606086015261185d610180860183856116c8565b925061186c6060870187611793565b9250601f19808786030160808801526118868585846116c8565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526118cd82890189611793565b945091506101408188870301818901526118e88686856116c8565b95506118f6818a018a611793565b9550925050808786030183880152506112cc8484836116c8565b805165ffffffffffff81168114610fb757600080fd5b600061193461100384610fbc565b905082815283838301111561194857600080fd5b610d90836020830184611385565b600082601f83011261196757600080fd5b610d9083835160208501611926565b600060c0828403121561198857600080fd5b611990610f11565b90508151815260208201516020820152604082015180151581146119b357600080fd5b60408201526119c460608301611910565b60608201526119d560808301611910565b608082015260a082015167ffffffffffffffff8111156119f457600080fd5b611a0084828501611956565b60a08301525092915050565b600060408284031215611a1e57600080fd5b611a26610f34565b9050815181526020820151602082015292915050565b60008060008060e08587031215611a5257600080fd5b845167ffffffffffffffff811115611a6957600080fd5b611a7587828801611976565b945050611a858660208701611a0c565b9250611a948660608701611a0c565b9150611aa38660a08701611a0c565b905092959194509250565b600181811c90821680611ac257607f821691505b602082108103611afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000806000806000858703610140811215611b1b57600080fd5b865167ffffffffffffffff811115611b3257600080fd5b611b3e89828a01611976565b965050611b4e8860208901611a0c565b9450611b5d8860608901611a0c565b9350611b6c8860a08901611a0c565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2082011215611b9e57600080fd5b50611ba7610f34565b60e0870151611bb581610e93565b8152611bc5886101008901611a0c565b6020820152809150509295509295909350565b60008060408385031215611beb57600080fd5b82519150602083015167ffffffffffffffff811115611c0957600080fd5b8301601f81018513611c1a57600080fd5b611c2985825160208401611926565b9150509250929050565b60008219821115611c4657611c46611661565b50019056fea26469706673582212209a1c7252e82e84056f2a73f6c8f87a6651303771a673fe8cebe2dbe5467b390664736f6c634300080f0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/addresses.json b/packages/boba/account-abstraction/deployments/boba_goerli/addresses.json new file mode 100644 index 0000000000..1539ee9353 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/addresses.json @@ -0,0 +1,7 @@ +{ + "L2_BOBA_EntryPoint": "0xa6e2cbb294d3b84e7900daf0052ffe26bb1328ff", + "L2_BobaDepositPaymaster": "0x06C1D387270E322D3B7b9Bed6777aaF8Aead4707", + "L2_BobaVerifyingPaymaster": "0xAa210aEC4649C92E1d9b7267AD767eF3dFa20677", + "L2_EntryPointWrapper": "0xb1b04b6ea9e013c0ff1970965d5d6d6e637e98d7" +} + \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/51f6e7e948df3fc9a57ba101deffd028.json b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/51f6e7e948df3fc9a57ba101deffd028.json new file mode 100644 index 0000000000..5e7e8596ba --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/51f6e7e948df3fc9a57ba101deffd028.json @@ -0,0 +1 @@ +{"id":"51f6e7e948df3fc9a57ba101deffd028","_format":"hh-sol-build-info-1","solcVersion":"0.8.17","solcLongVersion":"0.8.17+commit.8df45f5f","input":{"language":"Solidity","sources":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n"},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/Address.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized < type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initialized`\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initializing`\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n"},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeTo(address newImplementation) external virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n}\n"},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\n *\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\n * contract implement this interface (contract holders can be their own\n * implementer) and registering it on the\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\n *\n * See {IERC1820Registry} and {ERC1820Implementer}.\n */\ninterface IERC777Recipient {\n /**\n * @dev Called by an {IERC777} token contract whenever tokens are being\n * moved or created into a registered account (`to`). The type of operation\n * is conveyed by `from` being the zero address or not.\n *\n * This call occurs _after_ the token contract's state is updated, so\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\n *\n * This function may revert to prevent the operation from being executed.\n */\n function tokensReceived(\n address operator,\n address from,\n address to,\n uint256 amount,\n bytes calldata userData,\n bytes calldata operatorData\n ) external;\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n"},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n"},"@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n}\n"},"@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n"},"contracts/core/BaseAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-empty-blocks */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"./Helpers.sol\";\n\n/**\n * Basic account implementation.\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\n * specific account implementation should inherit it and provide the account-specific logic\n */\nabstract contract BaseAccount is IAccount {\n using UserOperationLib for UserOperation;\n\n //return value in case of signature failure, with no time-range.\n // equivalent to _packValidationData(true,0,0);\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\n\n /**\n * Return the account nonce.\n * This method returns the next sequential nonce.\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\n */\n function getNonce() public view virtual returns (uint256) {\n return entryPoint().getNonce(address(this), 0);\n }\n\n /**\n * return the entryPoint used by this account.\n * subclass should return the current entryPoint used by this account.\n */\n function entryPoint() public view virtual returns (IEntryPoint);\n\n /**\n * Validate user's signature and nonce.\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external override virtual returns (uint256 validationData) {\n _requireFromEntryPoint();\n validationData = _validateSignature(userOp, userOpHash);\n _validateNonce(userOp.nonce);\n _payPrefund(missingAccountFunds);\n }\n\n /**\n * ensure the request comes from the known entrypoint.\n */\n function _requireFromEntryPoint() internal virtual view {\n require(msg.sender == address(entryPoint()), \"account: not from EntryPoint\");\n }\n\n /**\n * validate the signature is valid for this message.\n * @param userOp validate the userOp.signature field\n * @param userOpHash convenient field: the hash of the request, to check the signature against\n * (also hashes the entrypoint and chain id)\n * @return validationData signature and time-range of this operation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal virtual returns (uint256 validationData);\n\n /**\n * Validate the nonce of the UserOperation.\n * This method may validate the nonce requirement of this account.\n * e.g.\n * To limit the nonce to use sequenced UserOps only (no \"out of order\" UserOps):\n * `require(nonce < type(uint64).max)`\n * For a hypothetical account that *requires* the nonce to be out-of-order:\n * `require(nonce & type(uint64).max == 0)`\n *\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\n * action is needed by the account itself.\n *\n * @param nonce to validate\n *\n * solhint-disable-next-line no-empty-blocks\n */\n function _validateNonce(uint256 nonce) internal view virtual {\n }\n\n /**\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\n * subclass MAY override this method for better funds management\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\n * it will not be required to send again)\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\n */\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\n if (missingAccountFunds != 0) {\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\"\");\n (success);\n //ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n}\n"},"contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n"},"contracts/interfaces/IAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"},"contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"},"contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"},"contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"},"contracts/interfaces/UserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"},"contracts/samples/callback/TokenCallbackHandler.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-empty-blocks */\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport \"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\nimport \"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\";\n\n/**\n * Token callback handler.\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\n */\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\n function tokensReceived(\n address,\n address,\n address,\n uint256,\n bytes calldata,\n bytes calldata\n ) external pure override {\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC721Receiver.onERC721Received.selector;\n }\n\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata,\n uint256[] calldata,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155BatchReceived.selector;\n }\n\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\n return\n interfaceId == type(IERC721Receiver).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"contracts/samples/SimpleAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\";\n\nimport \"../core/BaseAccount.sol\";\nimport \"./callback/TokenCallbackHandler.sol\";\n\n/**\n * minimal account.\n * this is sample minimal account.\n * has execute, eth handling methods\n * has a single signer that can send requests through the entryPoint.\n */\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\n using ECDSA for bytes32;\n\n address public owner;\n\n IEntryPoint private immutable _entryPoint;\n\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\n\n modifier onlyOwner() {\n _onlyOwner();\n _;\n }\n\n /// @inheritdoc BaseAccount\n function entryPoint() public view virtual override returns (IEntryPoint) {\n return _entryPoint;\n }\n\n\n // solhint-disable-next-line no-empty-blocks\n receive() external payable {}\n\n constructor(IEntryPoint anEntryPoint) {\n _entryPoint = anEntryPoint;\n _disableInitializers();\n }\n\n function _onlyOwner() internal view {\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\n require(msg.sender == owner || msg.sender == address(this), \"only owner\");\n }\n\n /**\n * execute a transaction (called directly from owner, or by entryPoint)\n */\n function execute(address dest, uint256 value, bytes calldata func) external {\n _requireFromEntryPointOrOwner();\n _call(dest, value, func);\n }\n\n /**\n * execute a sequence of transactions\n */\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\n _requireFromEntryPointOrOwner();\n require(dest.length == func.length, \"wrong array lengths\");\n for (uint256 i = 0; i < dest.length; i++) {\n _call(dest[i], 0, func[i]);\n }\n }\n\n /**\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\n * the implementation by calling `upgradeTo()`\n */\n function initialize(address anOwner) public virtual initializer {\n _initialize(anOwner);\n }\n\n function _initialize(address anOwner) internal virtual {\n owner = anOwner;\n emit SimpleAccountInitialized(_entryPoint, owner);\n }\n\n // Require the function call went through EntryPoint or owner\n function _requireFromEntryPointOrOwner() internal view {\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \"account: not Owner or EntryPoint\");\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override virtual returns (uint256 validationData) {\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n if (owner != hash.recover(userOp.signature))\n return SIG_VALIDATION_FAILED;\n return 0;\n }\n\n function _call(address target, uint256 value, bytes memory data) internal {\n (bool success, bytes memory result) = target.call{value : value}(data);\n if (!success) {\n assembly {\n revert(add(result, 32), mload(result))\n }\n }\n }\n\n /**\n * check current account deposit in the entryPoint\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint().balanceOf(address(this));\n }\n\n /**\n * deposit more funds for this account in the entryPoint\n */\n function addDeposit() public payable {\n entryPoint().depositTo{value : msg.value}(address(this));\n }\n\n /**\n * withdraw value from the account's deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\n entryPoint().withdrawTo(withdrawAddress, amount);\n }\n\n function _authorizeUpgrade(address newImplementation) internal view override {\n (newImplementation);\n _onlyOwner();\n }\n}\n\n"}},"settings":{"optimizer":{"enabled":true,"runs":10000},"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}},"output":{"sources":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","exportedSymbols":{"IERC1822Proxiable":[9]},"id":10,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"113:23:0"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1822Proxiable","contractDependencies":[],"contractKind":"interface","documentation":{"id":2,"nodeType":"StructuredDocumentation","src":"138:203:0","text":" @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n proxy whose upgrades are fully controlled by the current implementation."},"fullyImplemented":false,"id":9,"linearizedBaseContracts":[9],"name":"IERC1822Proxiable","nameLocation":"352:17:0","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3,"nodeType":"StructuredDocumentation","src":"376:438:0","text":" @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n address.\n IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n function revert if invoked through a proxy."},"functionSelector":"52d1902d","id":8,"implemented":false,"kind":"function","modifiers":[],"name":"proxiableUUID","nameLocation":"828:13:0","nodeType":"FunctionDefinition","parameters":{"id":4,"nodeType":"ParameterList","parameters":[],"src":"841:2:0"},"returnParameters":{"id":7,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8,"src":"867:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5,"name":"bytes32","nodeType":"ElementaryTypeName","src":"867:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"866:9:0"},"scope":9,"src":"819:57:0","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":10,"src":"342:536:0","usedErrors":[]}],"src":"113:766:0"},"id":0},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol","exportedSymbols":{"Address":[1031],"ERC1967Upgrade":[327],"IBeacon":[337],"IERC1822Proxiable":[9],"StorageSlot":[1091]},"id":328,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11,"literals":["solidity","^","0.8",".2"],"nodeType":"PragmaDirective","src":"116:23:1"},{"absolutePath":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","file":"../beacon/IBeacon.sol","id":12,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":328,"sourceUnit":338,"src":"141:31:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","file":"../../interfaces/draft-IERC1822.sol","id":13,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":328,"sourceUnit":10,"src":"173:45:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"../../utils/Address.sol","id":14,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":328,"sourceUnit":1032,"src":"219:33:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","file":"../../utils/StorageSlot.sol","id":15,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":328,"sourceUnit":1092,"src":"253:37:1","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"ERC1967Upgrade","contractDependencies":[],"contractKind":"contract","documentation":{"id":16,"nodeType":"StructuredDocumentation","src":"292:236:1","text":" @dev This abstract contract provides getters and event emitting update functions for\n https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n _Available since v4.1._\n @custom:oz-upgrades-unsafe-allow delegatecall"},"fullyImplemented":true,"id":327,"linearizedBaseContracts":[327],"name":"ERC1967Upgrade","nameLocation":"547:14:1","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":19,"mutability":"constant","name":"_ROLLBACK_SLOT","nameLocation":"672:14:1","nodeType":"VariableDeclaration","scope":327,"src":"647:108:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":17,"name":"bytes32","nodeType":"ElementaryTypeName","src":"647:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307834393130666466613136666564333236306564306537313437663763633664613131613630323038623562393430366431326136333536313466666439313433","id":18,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"689:66:1","typeDescriptions":{"typeIdentifier":"t_rational_33048860383849004559742813297059419343339852917517107368639918720169455489347_by_1","typeString":"int_const 3304...(69 digits omitted)...9347"},"value":"0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143"},"visibility":"private"},{"constant":true,"documentation":{"id":20,"nodeType":"StructuredDocumentation","src":"762:214:1","text":" @dev Storage slot with the address of the current implementation.\n This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n validated in the constructor."},"id":23,"mutability":"constant","name":"_IMPLEMENTATION_SLOT","nameLocation":"1007:20:1","nodeType":"VariableDeclaration","scope":327,"src":"981:115:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":21,"name":"bytes32","nodeType":"ElementaryTypeName","src":"981:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307833363038393461313362613161333231303636376338323834393264623938646361336532303736636333373335613932306133636135303564333832626263","id":22,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1030:66:1","typeDescriptions":{"typeIdentifier":"t_rational_24440054405305269366569402256811496959409073762505157381672968839269610695612_by_1","typeString":"int_const 2444...(69 digits omitted)...5612"},"value":"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":24,"nodeType":"StructuredDocumentation","src":"1103:68:1","text":" @dev Emitted when the implementation is upgraded."},"eventSelector":"bc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","id":28,"name":"Upgraded","nameLocation":"1182:8:1","nodeType":"EventDefinition","parameters":{"id":27,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26,"indexed":true,"mutability":"mutable","name":"implementation","nameLocation":"1207:14:1","nodeType":"VariableDeclaration","scope":28,"src":"1191:30:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25,"name":"address","nodeType":"ElementaryTypeName","src":"1191:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1190:32:1"},"src":"1176:47:1"},{"body":{"id":40,"nodeType":"Block","src":"1363:78:1","statements":[{"expression":{"expression":{"arguments":[{"id":36,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23,"src":"1407:20:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":34,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"1380:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":35,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1392:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"1380:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":37,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1380:48:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":38,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1429:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"1380:54:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":33,"id":39,"nodeType":"Return","src":"1373:61:1"}]},"documentation":{"id":29,"nodeType":"StructuredDocumentation","src":"1229:67:1","text":" @dev Returns the current implementation address."},"id":41,"implemented":true,"kind":"function","modifiers":[],"name":"_getImplementation","nameLocation":"1310:18:1","nodeType":"FunctionDefinition","parameters":{"id":30,"nodeType":"ParameterList","parameters":[],"src":"1328:2:1"},"returnParameters":{"id":33,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":41,"src":"1354:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31,"name":"address","nodeType":"ElementaryTypeName","src":"1354:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1353:9:1"},"scope":327,"src":"1301:140:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":64,"nodeType":"Block","src":"1595:196:1","statements":[{"expression":{"arguments":[{"arguments":[{"id":50,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"1632:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":48,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"1613:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":49,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1621:10:1","memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":719,"src":"1613:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":51,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1613:37:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374","id":52,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1652:47:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65","typeString":"literal_string \"ERC1967: new implementation is not a contract\""},"value":"ERC1967: new implementation is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65","typeString":"literal_string \"ERC1967: new implementation is not a contract\""}],"id":47,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1605:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":53,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1605:95:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54,"nodeType":"ExpressionStatement","src":"1605:95:1"},{"expression":{"id":62,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":58,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23,"src":"1737:20:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":55,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"1710:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":57,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1722:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"1710:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":59,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1710:48:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":60,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1759:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"1710:54:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":61,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"1767:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1710:74:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":63,"nodeType":"ExpressionStatement","src":"1710:74:1"}]},"documentation":{"id":42,"nodeType":"StructuredDocumentation","src":"1447:80:1","text":" @dev Stores a new address in the EIP1967 implementation slot."},"id":65,"implemented":true,"kind":"function","modifiers":[],"name":"_setImplementation","nameLocation":"1541:18:1","nodeType":"FunctionDefinition","parameters":{"id":45,"nodeType":"ParameterList","parameters":[{"constant":false,"id":44,"mutability":"mutable","name":"newImplementation","nameLocation":"1568:17:1","nodeType":"VariableDeclaration","scope":65,"src":"1560:25:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":43,"name":"address","nodeType":"ElementaryTypeName","src":"1560:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1559:27:1"},"returnParameters":{"id":46,"nodeType":"ParameterList","parameters":[],"src":"1595:0:1"},"scope":327,"src":"1532:259:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":79,"nodeType":"Block","src":"1953:96:1","statements":[{"expression":{"arguments":[{"id":72,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":68,"src":"1982:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":71,"name":"_setImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65,"src":"1963:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":73,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1963:37:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":74,"nodeType":"ExpressionStatement","src":"1963:37:1"},{"eventCall":{"arguments":[{"id":76,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":68,"src":"2024:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":75,"name":"Upgraded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28,"src":"2015:8:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":77,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2015:27:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":78,"nodeType":"EmitStatement","src":"2010:32:1"}]},"documentation":{"id":66,"nodeType":"StructuredDocumentation","src":"1797:95:1","text":" @dev Perform implementation upgrade\n Emits an {Upgraded} event."},"id":80,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeTo","nameLocation":"1906:10:1","nodeType":"FunctionDefinition","parameters":{"id":69,"nodeType":"ParameterList","parameters":[{"constant":false,"id":68,"mutability":"mutable","name":"newImplementation","nameLocation":"1925:17:1","nodeType":"VariableDeclaration","scope":80,"src":"1917:25:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":67,"name":"address","nodeType":"ElementaryTypeName","src":"1917:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1916:27:1"},"returnParameters":{"id":70,"nodeType":"ParameterList","parameters":[],"src":"1953:0:1"},"scope":327,"src":"1897:152:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":109,"nodeType":"Block","src":"2311:167:1","statements":[{"expression":{"arguments":[{"id":91,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":83,"src":"2332:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90,"name":"_upgradeTo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"2321:10:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":92,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2321:29:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":93,"nodeType":"ExpressionStatement","src":"2321:29:1"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":99,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":94,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85,"src":"2364:4:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":95,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2369:6:1","memberName":"length","nodeType":"MemberAccess","src":"2364:11:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":96,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2378:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2364:15:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":98,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87,"src":"2383:9:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2364:28:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":108,"nodeType":"IfStatement","src":"2360:112:1","trueBody":{"id":107,"nodeType":"Block","src":"2394:78:1","statements":[{"expression":{"arguments":[{"id":103,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":83,"src":"2437:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":104,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85,"src":"2456:4:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":100,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"2408:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":102,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2416:20:1","memberName":"functionDelegateCall","nodeType":"MemberAccess","referencedDeclaration":918,"src":"2408:28:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory) returns (bytes memory)"}},"id":105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2408:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":106,"nodeType":"ExpressionStatement","src":"2408:53:1"}]}}]},"documentation":{"id":81,"nodeType":"StructuredDocumentation","src":"2055:123:1","text":" @dev Perform implementation upgrade with additional setup call.\n Emits an {Upgraded} event."},"id":110,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeToAndCall","nameLocation":"2192:17:1","nodeType":"FunctionDefinition","parameters":{"id":88,"nodeType":"ParameterList","parameters":[{"constant":false,"id":83,"mutability":"mutable","name":"newImplementation","nameLocation":"2227:17:1","nodeType":"VariableDeclaration","scope":110,"src":"2219:25:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":82,"name":"address","nodeType":"ElementaryTypeName","src":"2219:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85,"mutability":"mutable","name":"data","nameLocation":"2267:4:1","nodeType":"VariableDeclaration","scope":110,"src":"2254:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":84,"name":"bytes","nodeType":"ElementaryTypeName","src":"2254:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":87,"mutability":"mutable","name":"forceCall","nameLocation":"2286:9:1","nodeType":"VariableDeclaration","scope":110,"src":"2281:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86,"name":"bool","nodeType":"ElementaryTypeName","src":"2281:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2209:92:1"},"returnParameters":{"id":89,"nodeType":"ParameterList","parameters":[],"src":"2311:0:1"},"scope":327,"src":"2183:295:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":162,"nodeType":"Block","src":"2782:820:1","statements":[{"condition":{"expression":{"arguments":[{"id":122,"name":"_ROLLBACK_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19,"src":"3123:14:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":120,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"3096:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3108:14:1","memberName":"getBooleanSlot","nodeType":"MemberAccess","referencedDeclaration":1068,"src":"3096:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_BooleanSlot_$1040_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.BooleanSlot storage pointer)"}},"id":123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3096:42:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$1040_storage_ptr","typeString":"struct StorageSlot.BooleanSlot storage pointer"}},"id":124,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3139:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1039,"src":"3096:48:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":160,"nodeType":"Block","src":"3214:382:1","statements":[{"clauses":[{"block":{"id":145,"nodeType":"Block","src":"3308:115:1","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":141,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":139,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":136,"src":"3334:4:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":140,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23,"src":"3342:20:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3334:28:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f786961626c6555554944","id":142,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3364:43:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c","typeString":"literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""},"value":"ERC1967Upgrade: unsupported proxiableUUID"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c","typeString":"literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""}],"id":138,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3326:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":143,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3326:82:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":144,"nodeType":"ExpressionStatement","src":"3326:82:1"}]},"errorName":"","id":146,"nodeType":"TryCatchClause","parameters":{"id":137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":136,"mutability":"mutable","name":"slot","nameLocation":"3302:4:1","nodeType":"VariableDeclaration","scope":146,"src":"3294:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":135,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3294:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3293:14:1"},"src":"3285:138:1"},{"block":{"id":151,"nodeType":"Block","src":"3430:89:1","statements":[{"expression":{"arguments":[{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e746174696f6e206973206e6f742055555053","id":148,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3455:48:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24","typeString":"literal_string \"ERC1967Upgrade: new implementation is not UUPS\""},"value":"ERC1967Upgrade: new implementation is not UUPS"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24","typeString":"literal_string \"ERC1967Upgrade: new implementation is not UUPS\""}],"id":147,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"3448:6:1","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":149,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3448:56:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":150,"nodeType":"ExpressionStatement","src":"3448:56:1"}]},"errorName":"","id":152,"nodeType":"TryCatchClause","src":"3424:95:1"}],"externalCall":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":131,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":113,"src":"3250:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":130,"name":"IERC1822Proxiable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9,"src":"3232:17:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1822Proxiable_$9_$","typeString":"type(contract IERC1822Proxiable)"}},"id":132,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3232:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1822Proxiable_$9","typeString":"contract IERC1822Proxiable"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3269:13:1","memberName":"proxiableUUID","nodeType":"MemberAccess","referencedDeclaration":8,"src":"3232:50:1","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bytes32_$","typeString":"function () view external returns (bytes32)"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3232:52:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":153,"nodeType":"TryStatement","src":"3228:291:1"},{"expression":{"arguments":[{"id":155,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":113,"src":"3550:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":156,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":115,"src":"3569:4:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":157,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":117,"src":"3575:9:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":154,"name":"_upgradeToAndCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110,"src":"3532:17:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3532:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":159,"nodeType":"ExpressionStatement","src":"3532:53:1"}]},"id":161,"nodeType":"IfStatement","src":"3092:504:1","trueBody":{"id":129,"nodeType":"Block","src":"3146:62:1","statements":[{"expression":{"arguments":[{"id":126,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":113,"src":"3179:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":125,"name":"_setImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65,"src":"3160:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3160:37:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":128,"nodeType":"ExpressionStatement","src":"3160:37:1"}]}}]},"documentation":{"id":111,"nodeType":"StructuredDocumentation","src":"2484:161:1","text":" @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n Emits an {Upgraded} event."},"id":163,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeToAndCallUUPS","nameLocation":"2659:21:1","nodeType":"FunctionDefinition","parameters":{"id":118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":113,"mutability":"mutable","name":"newImplementation","nameLocation":"2698:17:1","nodeType":"VariableDeclaration","scope":163,"src":"2690:25:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":112,"name":"address","nodeType":"ElementaryTypeName","src":"2690:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":115,"mutability":"mutable","name":"data","nameLocation":"2738:4:1","nodeType":"VariableDeclaration","scope":163,"src":"2725:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":114,"name":"bytes","nodeType":"ElementaryTypeName","src":"2725:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":117,"mutability":"mutable","name":"forceCall","nameLocation":"2757:9:1","nodeType":"VariableDeclaration","scope":163,"src":"2752:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":116,"name":"bool","nodeType":"ElementaryTypeName","src":"2752:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2680:92:1"},"returnParameters":{"id":119,"nodeType":"ParameterList","parameters":[],"src":"2782:0:1"},"scope":327,"src":"2650:952:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"constant":true,"documentation":{"id":164,"nodeType":"StructuredDocumentation","src":"3608:189:1","text":" @dev Storage slot with the admin of the contract.\n This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n validated in the constructor."},"id":167,"mutability":"constant","name":"_ADMIN_SLOT","nameLocation":"3828:11:1","nodeType":"VariableDeclaration","scope":327,"src":"3802:106:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":165,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3802:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307862353331323736383461353638623331373361653133623966386136303136653234336536336236653865653131373864366137313738353062356436313033","id":166,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3842:66:1","typeDescriptions":{"typeIdentifier":"t_rational_81955473079516046949633743016697847541294818689821282749996681496272635257091_by_1","typeString":"int_const 8195...(69 digits omitted)...7091"},"value":"0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":168,"nodeType":"StructuredDocumentation","src":"3915:67:1","text":" @dev Emitted when the admin account has changed."},"eventSelector":"7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f","id":174,"name":"AdminChanged","nameLocation":"3993:12:1","nodeType":"EventDefinition","parameters":{"id":173,"nodeType":"ParameterList","parameters":[{"constant":false,"id":170,"indexed":false,"mutability":"mutable","name":"previousAdmin","nameLocation":"4014:13:1","nodeType":"VariableDeclaration","scope":174,"src":"4006:21:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":169,"name":"address","nodeType":"ElementaryTypeName","src":"4006:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":172,"indexed":false,"mutability":"mutable","name":"newAdmin","nameLocation":"4037:8:1","nodeType":"VariableDeclaration","scope":174,"src":"4029:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":171,"name":"address","nodeType":"ElementaryTypeName","src":"4029:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4005:41:1"},"src":"3987:60:1"},{"body":{"id":186,"nodeType":"Block","src":"4161:69:1","statements":[{"expression":{"expression":{"arguments":[{"id":182,"name":"_ADMIN_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":167,"src":"4205:11:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":180,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"4178:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4190:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"4178:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4178:39:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":184,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4218:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"4178:45:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":179,"id":185,"nodeType":"Return","src":"4171:52:1"}]},"documentation":{"id":175,"nodeType":"StructuredDocumentation","src":"4053:50:1","text":" @dev Returns the current admin."},"id":187,"implemented":true,"kind":"function","modifiers":[],"name":"_getAdmin","nameLocation":"4117:9:1","nodeType":"FunctionDefinition","parameters":{"id":176,"nodeType":"ParameterList","parameters":[],"src":"4126:2:1"},"returnParameters":{"id":179,"nodeType":"ParameterList","parameters":[{"constant":false,"id":178,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":187,"src":"4152:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":177,"name":"address","nodeType":"ElementaryTypeName","src":"4152:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4151:9:1"},"scope":327,"src":"4108:122:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":212,"nodeType":"Block","src":"4357:156:1","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":199,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":194,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":190,"src":"4375:8:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":197,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4395:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4387:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"4387:7:1","typeDescriptions":{}}},"id":198,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4387:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4375:22:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e65772061646d696e20697320746865207a65726f2061646472657373","id":200,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4399:40:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5","typeString":"literal_string \"ERC1967: new admin is the zero address\""},"value":"ERC1967: new admin is the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5","typeString":"literal_string \"ERC1967: new admin is the zero address\""}],"id":193,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4367:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":201,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4367:73:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":202,"nodeType":"ExpressionStatement","src":"4367:73:1"},{"expression":{"id":210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":206,"name":"_ADMIN_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":167,"src":"4477:11:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":203,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"4450:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4462:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"4450:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":207,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4450:39:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":208,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"4490:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"4450:45:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":209,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":190,"src":"4498:8:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4450:56:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":211,"nodeType":"ExpressionStatement","src":"4450:56:1"}]},"documentation":{"id":188,"nodeType":"StructuredDocumentation","src":"4236:71:1","text":" @dev Stores a new address in the EIP1967 admin slot."},"id":213,"implemented":true,"kind":"function","modifiers":[],"name":"_setAdmin","nameLocation":"4321:9:1","nodeType":"FunctionDefinition","parameters":{"id":191,"nodeType":"ParameterList","parameters":[{"constant":false,"id":190,"mutability":"mutable","name":"newAdmin","nameLocation":"4339:8:1","nodeType":"VariableDeclaration","scope":213,"src":"4331:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":189,"name":"address","nodeType":"ElementaryTypeName","src":"4331:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4330:18:1"},"returnParameters":{"id":192,"nodeType":"ParameterList","parameters":[],"src":"4357:0:1"},"scope":327,"src":"4312:201:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":229,"nodeType":"Block","src":"4673:86:1","statements":[{"eventCall":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":220,"name":"_getAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":187,"src":"4701:9:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":221,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4701:11:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":222,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":216,"src":"4714:8:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":219,"name":"AdminChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":174,"src":"4688:12:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":223,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4688:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":224,"nodeType":"EmitStatement","src":"4683:40:1"},{"expression":{"arguments":[{"id":226,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":216,"src":"4743:8:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":225,"name":"_setAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4733:9:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":227,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4733:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":228,"nodeType":"ExpressionStatement","src":"4733:19:1"}]},"documentation":{"id":214,"nodeType":"StructuredDocumentation","src":"4519:100:1","text":" @dev Changes the admin of the proxy.\n Emits an {AdminChanged} event."},"id":230,"implemented":true,"kind":"function","modifiers":[],"name":"_changeAdmin","nameLocation":"4633:12:1","nodeType":"FunctionDefinition","parameters":{"id":217,"nodeType":"ParameterList","parameters":[{"constant":false,"id":216,"mutability":"mutable","name":"newAdmin","nameLocation":"4654:8:1","nodeType":"VariableDeclaration","scope":230,"src":"4646:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":215,"name":"address","nodeType":"ElementaryTypeName","src":"4646:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4645:18:1"},"returnParameters":{"id":218,"nodeType":"ParameterList","parameters":[],"src":"4673:0:1"},"scope":327,"src":"4624:135:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"constant":true,"documentation":{"id":231,"nodeType":"StructuredDocumentation","src":"4765:232:1","text":" @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor."},"id":234,"mutability":"constant","name":"_BEACON_SLOT","nameLocation":"5028:12:1","nodeType":"VariableDeclaration","scope":327,"src":"5002:107:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":232,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5002:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307861336630616437346535343233616562666438306433656634333436353738333335613961373261656165653539666636636233353832623335313333643530","id":233,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5043:66:1","typeDescriptions":{"typeIdentifier":"t_rational_74152234768234802001998023604048924213078445070507226371336425913862612794704_by_1","typeString":"int_const 7415...(69 digits omitted)...4704"},"value":"0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":235,"nodeType":"StructuredDocumentation","src":"5116:60:1","text":" @dev Emitted when the beacon is upgraded."},"eventSelector":"1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e","id":239,"name":"BeaconUpgraded","nameLocation":"5187:14:1","nodeType":"EventDefinition","parameters":{"id":238,"nodeType":"ParameterList","parameters":[{"constant":false,"id":237,"indexed":true,"mutability":"mutable","name":"beacon","nameLocation":"5218:6:1","nodeType":"VariableDeclaration","scope":239,"src":"5202:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":236,"name":"address","nodeType":"ElementaryTypeName","src":"5202:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5201:24:1"},"src":"5181:45:1"},{"body":{"id":251,"nodeType":"Block","src":"5342:70:1","statements":[{"expression":{"expression":{"arguments":[{"id":247,"name":"_BEACON_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":234,"src":"5386:12:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":245,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"5359:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5371:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"5359:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":248,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5359:40:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":249,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5400:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"5359:46:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":244,"id":250,"nodeType":"Return","src":"5352:53:1"}]},"documentation":{"id":240,"nodeType":"StructuredDocumentation","src":"5232:51:1","text":" @dev Returns the current beacon."},"id":252,"implemented":true,"kind":"function","modifiers":[],"name":"_getBeacon","nameLocation":"5297:10:1","nodeType":"FunctionDefinition","parameters":{"id":241,"nodeType":"ParameterList","parameters":[],"src":"5307:2:1"},"returnParameters":{"id":244,"nodeType":"ParameterList","parameters":[{"constant":false,"id":243,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":252,"src":"5333:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":242,"name":"address","nodeType":"ElementaryTypeName","src":"5333:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5332:9:1"},"scope":327,"src":"5288:124:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":287,"nodeType":"Block","src":"5541:324:1","statements":[{"expression":{"arguments":[{"arguments":[{"id":261,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":255,"src":"5578:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":259,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"5559:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5567:10:1","memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":719,"src":"5559:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":262,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5559:29:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e657720626561636f6e206973206e6f74206120636f6e7472616374","id":263,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5590:39:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470","typeString":"literal_string \"ERC1967: new beacon is not a contract\""},"value":"ERC1967: new beacon is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470","typeString":"literal_string \"ERC1967: new beacon is not a contract\""}],"id":258,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5551:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":264,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5551:79:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":265,"nodeType":"ExpressionStatement","src":"5551:79:1"},{"expression":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":270,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":255,"src":"5688:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":269,"name":"IBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":337,"src":"5680:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBeacon_$337_$","typeString":"type(contract IBeacon)"}},"id":271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5680:18:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBeacon_$337","typeString":"contract IBeacon"}},"id":272,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5699:14:1","memberName":"implementation","nodeType":"MemberAccess","referencedDeclaration":336,"src":"5680:33:1","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5680:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":267,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"5661:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5669:10:1","memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":719,"src":"5661:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":274,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5661:55:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a20626561636f6e20696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374","id":275,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5730:50:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8","typeString":"literal_string \"ERC1967: beacon implementation is not a contract\""},"value":"ERC1967: beacon implementation is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8","typeString":"literal_string \"ERC1967: beacon implementation is not a contract\""}],"id":266,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5640:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":276,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5640:150:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":277,"nodeType":"ExpressionStatement","src":"5640:150:1"},{"expression":{"id":285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":281,"name":"_BEACON_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":234,"src":"5827:12:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":278,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1091,"src":"5800:11:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1091_$","typeString":"type(library StorageSlot)"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5812:14:1","memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":1057,"src":"5800:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$1037_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":282,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5800:40:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":283,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"5841:5:1","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1036,"src":"5800:46:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":284,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":255,"src":"5849:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5800:58:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":286,"nodeType":"ExpressionStatement","src":"5800:58:1"}]},"documentation":{"id":253,"nodeType":"StructuredDocumentation","src":"5418:71:1","text":" @dev Stores a new beacon in the EIP1967 beacon slot."},"id":288,"implemented":true,"kind":"function","modifiers":[],"name":"_setBeacon","nameLocation":"5503:10:1","nodeType":"FunctionDefinition","parameters":{"id":256,"nodeType":"ParameterList","parameters":[{"constant":false,"id":255,"mutability":"mutable","name":"newBeacon","nameLocation":"5522:9:1","nodeType":"VariableDeclaration","scope":288,"src":"5514:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":254,"name":"address","nodeType":"ElementaryTypeName","src":"5514:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5513:19:1"},"returnParameters":{"id":257,"nodeType":"ParameterList","parameters":[],"src":"5541:0:1"},"scope":327,"src":"5494:371:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":325,"nodeType":"Block","src":"6294:217:1","statements":[{"expression":{"arguments":[{"id":299,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":291,"src":"6315:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":298,"name":"_setBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":288,"src":"6304:10:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":300,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6304:21:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":301,"nodeType":"ExpressionStatement","src":"6304:21:1"},{"eventCall":{"arguments":[{"id":303,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":291,"src":"6355:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":302,"name":"BeaconUpgraded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":239,"src":"6340:14:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":304,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6340:25:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":305,"nodeType":"EmitStatement","src":"6335:30:1"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":306,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":293,"src":"6379:4:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6384:6:1","memberName":"length","nodeType":"MemberAccess","src":"6379:11:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":308,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6393:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6379:15:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":310,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":295,"src":"6398:9:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6379:28:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":324,"nodeType":"IfStatement","src":"6375:130:1","trueBody":{"id":323,"nodeType":"Block","src":"6409:96:1","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":316,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":291,"src":"6460:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":315,"name":"IBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":337,"src":"6452:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBeacon_$337_$","typeString":"type(contract IBeacon)"}},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6452:18:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBeacon_$337","typeString":"contract IBeacon"}},"id":318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6471:14:1","memberName":"implementation","nodeType":"MemberAccess","referencedDeclaration":336,"src":"6452:33:1","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":319,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6452:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":320,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":293,"src":"6489:4:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":312,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"6423:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":314,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6431:20:1","memberName":"functionDelegateCall","nodeType":"MemberAccess","referencedDeclaration":918,"src":"6423:28:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory) returns (bytes memory)"}},"id":321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6423:71:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":322,"nodeType":"ExpressionStatement","src":"6423:71:1"}]}}]},"documentation":{"id":289,"nodeType":"StructuredDocumentation","src":"5871:292:1","text":" @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n Emits a {BeaconUpgraded} event."},"id":326,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeBeaconToAndCall","nameLocation":"6177:23:1","nodeType":"FunctionDefinition","parameters":{"id":296,"nodeType":"ParameterList","parameters":[{"constant":false,"id":291,"mutability":"mutable","name":"newBeacon","nameLocation":"6218:9:1","nodeType":"VariableDeclaration","scope":326,"src":"6210:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":290,"name":"address","nodeType":"ElementaryTypeName","src":"6210:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":293,"mutability":"mutable","name":"data","nameLocation":"6250:4:1","nodeType":"VariableDeclaration","scope":326,"src":"6237:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":292,"name":"bytes","nodeType":"ElementaryTypeName","src":"6237:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":295,"mutability":"mutable","name":"forceCall","nameLocation":"6269:9:1","nodeType":"VariableDeclaration","scope":326,"src":"6264:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":294,"name":"bool","nodeType":"ElementaryTypeName","src":"6264:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6200:84:1"},"returnParameters":{"id":297,"nodeType":"ParameterList","parameters":[],"src":"6294:0:1"},"scope":327,"src":"6168:343:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":328,"src":"529:5984:1","usedErrors":[]}],"src":"116:6398:1"},"id":1},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","exportedSymbols":{"IBeacon":[337]},"id":338,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":329,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"93:23:2"},{"abstract":false,"baseContracts":[],"canonicalName":"IBeacon","contractDependencies":[],"contractKind":"interface","documentation":{"id":330,"nodeType":"StructuredDocumentation","src":"118:79:2","text":" @dev This is the interface that {BeaconProxy} expects of its beacon."},"fullyImplemented":false,"id":337,"linearizedBaseContracts":[337],"name":"IBeacon","nameLocation":"208:7:2","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":331,"nodeType":"StructuredDocumentation","src":"222:162:2","text":" @dev Must return an address that can be used as a delegate call target.\n {BeaconProxy} will check that this address is a contract."},"functionSelector":"5c60da1b","id":336,"implemented":false,"kind":"function","modifiers":[],"name":"implementation","nameLocation":"398:14:2","nodeType":"FunctionDefinition","parameters":{"id":332,"nodeType":"ParameterList","parameters":[],"src":"412:2:2"},"returnParameters":{"id":335,"nodeType":"ParameterList","parameters":[{"constant":false,"id":334,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":336,"src":"438:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":333,"name":"address","nodeType":"ElementaryTypeName","src":"438:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"437:9:2"},"scope":337,"src":"389:58:2","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":338,"src":"198:251:2","usedErrors":[]}],"src":"93:357:2"},"id":2},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/utils/Initializable.sol","exportedSymbols":{"Address":[1031],"Initializable":[506]},"id":507,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":339,"literals":["solidity","^","0.8",".2"],"nodeType":"PragmaDirective","src":"113:23:3"},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"../../utils/Address.sol","id":340,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":507,"sourceUnit":1032,"src":"138:33:3","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"Initializable","contractDependencies":[],"contractKind":"contract","documentation":{"id":341,"nodeType":"StructuredDocumentation","src":"173:2198:3","text":" @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n case an upgrade adds a module that needs to be initialized.\n For example:\n [.hljs-theme-light.nopadding]\n ```\n contract MyToken is ERC20Upgradeable {\n function initialize() initializer public {\n __ERC20_init(\"MyToken\", \"MTK\");\n }\n }\n contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n function initializeV2() reinitializer(2) public {\n __ERC20Permit_init(\"MyToken\");\n }\n }\n ```\n TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n [CAUTION]\n ====\n Avoid leaving a contract uninitialized.\n An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n [.hljs-theme-light.nopadding]\n ```\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n ```\n ===="},"fullyImplemented":true,"id":506,"linearizedBaseContracts":[506],"name":"Initializable","nameLocation":"2390:13:3","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":342,"nodeType":"StructuredDocumentation","src":"2410:109:3","text":" @dev Indicates that the contract has been initialized.\n @custom:oz-retyped-from bool"},"id":344,"mutability":"mutable","name":"_initialized","nameLocation":"2538:12:3","nodeType":"VariableDeclaration","scope":506,"src":"2524:26:3","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":343,"name":"uint8","nodeType":"ElementaryTypeName","src":"2524:5:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"private"},{"constant":false,"documentation":{"id":345,"nodeType":"StructuredDocumentation","src":"2557:91:3","text":" @dev Indicates that the contract is in the process of being initialized."},"id":347,"mutability":"mutable","name":"_initializing","nameLocation":"2666:13:3","nodeType":"VariableDeclaration","scope":506,"src":"2653:26:3","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":346,"name":"bool","nodeType":"ElementaryTypeName","src":"2653:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"private"},{"anonymous":false,"documentation":{"id":348,"nodeType":"StructuredDocumentation","src":"2686:90:3","text":" @dev Triggered when the contract has been initialized or reinitialized."},"eventSelector":"7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498","id":352,"name":"Initialized","nameLocation":"2787:11:3","nodeType":"EventDefinition","parameters":{"id":351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":350,"indexed":false,"mutability":"mutable","name":"version","nameLocation":"2805:7:3","nodeType":"VariableDeclaration","scope":352,"src":"2799:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":349,"name":"uint8","nodeType":"ElementaryTypeName","src":"2799:5:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2798:15:3"},"src":"2781:33:3"},{"body":{"id":407,"nodeType":"Block","src":"3247:472:3","statements":[{"assignments":[356],"declarations":[{"constant":false,"id":356,"mutability":"mutable","name":"isTopLevelCall","nameLocation":"3262:14:3","nodeType":"VariableDeclaration","scope":407,"src":"3257:19:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":355,"name":"bool","nodeType":"ElementaryTypeName","src":"3257:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":359,"initialValue":{"id":358,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3279:14:3","subExpression":{"id":357,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"3280:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"3257:36:3"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":380,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":361,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":356,"src":"3325:14:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":362,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"3343:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"31","id":363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3358:1:3","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3343:16:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3325:34:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":366,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3324:36:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":378,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3365:34:3","subExpression":{"arguments":[{"arguments":[{"id":371,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3393:4:3","typeDescriptions":{"typeIdentifier":"t_contract$_Initializable_$506","typeString":"contract Initializable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Initializable_$506","typeString":"contract Initializable"}],"id":370,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3385:7:3","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":369,"name":"address","nodeType":"ElementaryTypeName","src":"3385:7:3","typeDescriptions":{}}},"id":372,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3385:13:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":367,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1031,"src":"3366:7:3","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$1031_$","typeString":"type(library Address)"}},"id":368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3374:10:3","memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":719,"src":"3366:18:3","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":373,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3366:33:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":375,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"3403:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":376,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3419:1:3","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3403:17:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3365:55:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":379,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3364:57:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3324:97:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564","id":381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3435:48:3","typeDescriptions":{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""},"value":"Initializable: contract is already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""}],"id":360,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3303:7:3","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3303:190:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":383,"nodeType":"ExpressionStatement","src":"3303:190:3"},{"expression":{"id":386,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":384,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"3503:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3518:1:3","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3503:16:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":387,"nodeType":"ExpressionStatement","src":"3503:16:3"},{"condition":{"id":388,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":356,"src":"3533:14:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":394,"nodeType":"IfStatement","src":"3529:65:3","trueBody":{"id":393,"nodeType":"Block","src":"3549:45:3","statements":[{"expression":{"id":391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":389,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"3563:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3579:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"3563:20:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":392,"nodeType":"ExpressionStatement","src":"3563:20:3"}]}},{"id":395,"nodeType":"PlaceholderStatement","src":"3603:1:3"},{"condition":{"id":396,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":356,"src":"3618:14:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":406,"nodeType":"IfStatement","src":"3614:99:3","trueBody":{"id":405,"nodeType":"Block","src":"3634:79:3","statements":[{"expression":{"id":399,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":397,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"3648:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":398,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3664:5:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3648:21:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":400,"nodeType":"ExpressionStatement","src":"3648:21:3"},{"eventCall":{"arguments":[{"hexValue":"31","id":402,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3700:1:3","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":401,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":352,"src":"3688:11:3","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":403,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3688:14:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":404,"nodeType":"EmitStatement","src":"3683:19:3"}]}}]},"documentation":{"id":353,"nodeType":"StructuredDocumentation","src":"2820:399:3","text":" @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n `onlyInitializing` functions can be used to initialize parent contracts.\n Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n constructor.\n Emits an {Initialized} event."},"id":408,"name":"initializer","nameLocation":"3233:11:3","nodeType":"ModifierDefinition","parameters":{"id":354,"nodeType":"ParameterList","parameters":[],"src":"3244:2:3"},"src":"3224:495:3","virtual":false,"visibility":"internal"},{"body":{"id":440,"nodeType":"Block","src":"4830:255:3","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":419,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4848:14:3","subExpression":{"id":414,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"4849:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":416,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"4866:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":417,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":411,"src":"4881:7:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4866:22:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4848:40:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564","id":420,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4890:48:3","typeDescriptions":{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""},"value":"Initializable: contract is already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""}],"id":413,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4840:7:3","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":421,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4840:99:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":422,"nodeType":"ExpressionStatement","src":"4840:99:3"},{"expression":{"id":425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":423,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"4949:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":424,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":411,"src":"4964:7:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4949:22:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":426,"nodeType":"ExpressionStatement","src":"4949:22:3"},{"expression":{"id":429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":427,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"4981:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4997:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"4981:20:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":430,"nodeType":"ExpressionStatement","src":"4981:20:3"},{"id":431,"nodeType":"PlaceholderStatement","src":"5011:1:3"},{"expression":{"id":434,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":432,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"5022:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":433,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5038:5:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"5022:21:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":435,"nodeType":"ExpressionStatement","src":"5022:21:3"},{"eventCall":{"arguments":[{"id":437,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":411,"src":"5070:7:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":436,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":352,"src":"5058:11:3","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5058:20:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":439,"nodeType":"EmitStatement","src":"5053:25:3"}]},"documentation":{"id":409,"nodeType":"StructuredDocumentation","src":"3725:1062:3","text":" @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n used to initialize parent contracts.\n A reinitializer may be used after the original initialization step. This is essential to configure modules that\n are added through upgrades and that require initialization.\n When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n cannot be nested. If one is invoked in the context of another, execution will revert.\n Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n a contract, executing them in the right order is up to the developer or operator.\n WARNING: setting the version to 255 will prevent any future reinitialization.\n Emits an {Initialized} event."},"id":441,"name":"reinitializer","nameLocation":"4801:13:3","nodeType":"ModifierDefinition","parameters":{"id":412,"nodeType":"ParameterList","parameters":[{"constant":false,"id":411,"mutability":"mutable","name":"version","nameLocation":"4821:7:3","nodeType":"VariableDeclaration","scope":441,"src":"4815:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":410,"name":"uint8","nodeType":"ElementaryTypeName","src":"4815:5:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"4814:15:3"},"src":"4792:293:3","virtual":false,"visibility":"internal"},{"body":{"id":450,"nodeType":"Block","src":"5323:97:3","statements":[{"expression":{"arguments":[{"id":445,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"5341:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420696e697469616c697a696e67","id":446,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5356:45:3","typeDescriptions":{"typeIdentifier":"t_stringliteral_d688db918bb9dd50354922faa108595679886fe9ff08046ad1ffe30aaea55f8b","typeString":"literal_string \"Initializable: contract is not initializing\""},"value":"Initializable: contract is not initializing"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d688db918bb9dd50354922faa108595679886fe9ff08046ad1ffe30aaea55f8b","typeString":"literal_string \"Initializable: contract is not initializing\""}],"id":444,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5333:7:3","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5333:69:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":448,"nodeType":"ExpressionStatement","src":"5333:69:3"},{"id":449,"nodeType":"PlaceholderStatement","src":"5412:1:3"}]},"documentation":{"id":442,"nodeType":"StructuredDocumentation","src":"5091:199:3","text":" @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n {initializer} and {reinitializer} modifiers, directly or indirectly."},"id":451,"name":"onlyInitializing","nameLocation":"5304:16:3","nodeType":"ModifierDefinition","parameters":{"id":443,"nodeType":"ParameterList","parameters":[],"src":"5320:2:3"},"src":"5295:125:3","virtual":false,"visibility":"internal"},{"body":{"id":486,"nodeType":"Block","src":"5955:230:3","statements":[{"expression":{"arguments":[{"id":457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5973:14:3","subExpression":{"id":456,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"5974:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469616c697a696e67","id":458,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5989:41:3","typeDescriptions":{"typeIdentifier":"t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a","typeString":"literal_string \"Initializable: contract is initializing\""},"value":"Initializable: contract is initializing"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a","typeString":"literal_string \"Initializable: contract is initializing\""}],"id":455,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5965:7:3","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":459,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5965:66:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":460,"nodeType":"ExpressionStatement","src":"5965:66:3"},{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":467,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":461,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"6045:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"arguments":[{"id":464,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6065:5:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":463,"name":"uint8","nodeType":"ElementaryTypeName","src":"6065:5:3","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":462,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6060:4:3","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6060:11:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":466,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6072:3:3","memberName":"max","nodeType":"MemberAccess","src":"6060:15:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6045:30:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":485,"nodeType":"IfStatement","src":"6041:138:3","trueBody":{"id":484,"nodeType":"Block","src":"6077:102:3","statements":[{"expression":{"id":474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":468,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"6091:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":471,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6111:5:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":470,"name":"uint8","nodeType":"ElementaryTypeName","src":"6111:5:3","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":469,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6106:4:3","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":472,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6106:11:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":473,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6118:3:3","memberName":"max","nodeType":"MemberAccess","src":"6106:15:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6091:30:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":475,"nodeType":"ExpressionStatement","src":"6091:30:3"},{"eventCall":{"arguments":[{"expression":{"arguments":[{"id":479,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6157:5:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":478,"name":"uint8","nodeType":"ElementaryTypeName","src":"6157:5:3","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":477,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6152:4:3","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":480,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6152:11:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":481,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6164:3:3","memberName":"max","nodeType":"MemberAccess","src":"6152:15:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":476,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":352,"src":"6140:11:3","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6140:28:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":483,"nodeType":"EmitStatement","src":"6135:33:3"}]}}]},"documentation":{"id":452,"nodeType":"StructuredDocumentation","src":"5426:475:3","text":" @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n through proxies.\n Emits an {Initialized} event the first time it is successfully executed."},"id":487,"implemented":true,"kind":"function","modifiers":[],"name":"_disableInitializers","nameLocation":"5915:20:3","nodeType":"FunctionDefinition","parameters":{"id":453,"nodeType":"ParameterList","parameters":[],"src":"5935:2:3"},"returnParameters":{"id":454,"nodeType":"ParameterList","parameters":[],"src":"5955:0:3"},"scope":506,"src":"5906:279:3","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":495,"nodeType":"Block","src":"6362:36:3","statements":[{"expression":{"id":493,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"6379:12:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":492,"id":494,"nodeType":"Return","src":"6372:19:3"}]},"documentation":{"id":488,"nodeType":"StructuredDocumentation","src":"6191:102:3","text":" @dev Internal function that returns the initialized version. Returns `_initialized`"},"id":496,"implemented":true,"kind":"function","modifiers":[],"name":"_getInitializedVersion","nameLocation":"6307:22:3","nodeType":"FunctionDefinition","parameters":{"id":489,"nodeType":"ParameterList","parameters":[],"src":"6329:2:3"},"returnParameters":{"id":492,"nodeType":"ParameterList","parameters":[{"constant":false,"id":491,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":496,"src":"6355:5:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":490,"name":"uint8","nodeType":"ElementaryTypeName","src":"6355:5:3","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"6354:7:3"},"scope":506,"src":"6298:100:3","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":504,"nodeType":"Block","src":"6568:37:3","statements":[{"expression":{"id":502,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":347,"src":"6585:13:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":501,"id":503,"nodeType":"Return","src":"6578:20:3"}]},"documentation":{"id":497,"nodeType":"StructuredDocumentation","src":"6404:103:3","text":" @dev Internal function that returns the initialized version. Returns `_initializing`"},"id":505,"implemented":true,"kind":"function","modifiers":[],"name":"_isInitializing","nameLocation":"6521:15:3","nodeType":"FunctionDefinition","parameters":{"id":498,"nodeType":"ParameterList","parameters":[],"src":"6536:2:3"},"returnParameters":{"id":501,"nodeType":"ParameterList","parameters":[{"constant":false,"id":500,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":505,"src":"6562:4:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":499,"name":"bool","nodeType":"ElementaryTypeName","src":"6562:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6561:6:3"},"scope":506,"src":"6512:93:3","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":507,"src":"2372:4235:3","usedErrors":[]}],"src":"113:6495:3"},"id":3},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","exportedSymbols":{"Address":[1031],"ERC1967Upgrade":[327],"IBeacon":[337],"IERC1822Proxiable":[9],"StorageSlot":[1091],"UUPSUpgradeable":[622]},"id":623,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":508,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"115:23:4"},{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","file":"../../interfaces/draft-IERC1822.sol","id":509,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":623,"sourceUnit":10,"src":"140:45:4","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol","file":"../ERC1967/ERC1967Upgrade.sol","id":510,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":623,"sourceUnit":328,"src":"186:39:4","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":512,"name":"IERC1822Proxiable","nameLocations":["913:17:4"],"nodeType":"IdentifierPath","referencedDeclaration":9,"src":"913:17:4"},"id":513,"nodeType":"InheritanceSpecifier","src":"913:17:4"},{"baseName":{"id":514,"name":"ERC1967Upgrade","nameLocations":["932:14:4"],"nodeType":"IdentifierPath","referencedDeclaration":327,"src":"932:14:4"},"id":515,"nodeType":"InheritanceSpecifier","src":"932:14:4"}],"canonicalName":"UUPSUpgradeable","contractDependencies":[],"contractKind":"contract","documentation":{"id":511,"nodeType":"StructuredDocumentation","src":"227:648:4","text":" @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n `UUPSUpgradeable` with a custom implementation of upgrades.\n The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n _Available since v4.1._"},"fullyImplemented":false,"id":622,"linearizedBaseContracts":[622,327,9],"name":"UUPSUpgradeable","nameLocation":"894:15:4","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":516,"nodeType":"StructuredDocumentation","src":"953:87:4","text":"@custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment"},"id":522,"mutability":"immutable","name":"__self","nameLocation":"1071:6:4","nodeType":"VariableDeclaration","scope":622,"src":"1045:48:4","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":517,"name":"address","nodeType":"ElementaryTypeName","src":"1045:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"id":520,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1088:4:4","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}],"id":519,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1080:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":518,"name":"address","nodeType":"ElementaryTypeName","src":"1080:7:4","typeDescriptions":{}}},"id":521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1080:13:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"body":{"id":544,"nodeType":"Block","src":"1619:205:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":531,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":528,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1645:4:4","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}],"id":527,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1637:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":526,"name":"address","nodeType":"ElementaryTypeName","src":"1637:7:4","typeDescriptions":{}}},"id":529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1637:13:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":530,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":522,"src":"1654:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1637:23:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682064656c656761746563616c6c","id":532,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1662:46:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb","typeString":"literal_string \"Function must be called through delegatecall\""},"value":"Function must be called through delegatecall"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb","typeString":"literal_string \"Function must be called through delegatecall\""}],"id":525,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1629:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1629:80:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":534,"nodeType":"ExpressionStatement","src":"1629:80:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":536,"name":"_getImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":41,"src":"1727:18:4","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1727:20:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":538,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":522,"src":"1751:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1727:30:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f756768206163746976652070726f7879","id":540,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1759:46:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434","typeString":"literal_string \"Function must be called through active proxy\""},"value":"Function must be called through active proxy"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434","typeString":"literal_string \"Function must be called through active proxy\""}],"id":535,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1719:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1719:87:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":542,"nodeType":"ExpressionStatement","src":"1719:87:4"},{"id":543,"nodeType":"PlaceholderStatement","src":"1816:1:4"}]},"documentation":{"id":523,"nodeType":"StructuredDocumentation","src":"1100:493:4","text":" @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n fail."},"id":545,"name":"onlyProxy","nameLocation":"1607:9:4","nodeType":"ModifierDefinition","parameters":{"id":524,"nodeType":"ParameterList","parameters":[],"src":"1616:2:4"},"src":"1598:226:4","virtual":false,"visibility":"internal"},{"body":{"id":559,"nodeType":"Block","src":"2054:120:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":551,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2080:4:4","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$622","typeString":"contract UUPSUpgradeable"}],"id":550,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2072:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":549,"name":"address","nodeType":"ElementaryTypeName","src":"2072:7:4","typeDescriptions":{}}},"id":552,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2072:13:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":553,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":522,"src":"2089:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2072:23:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c6c6564207468726f7567682064656c656761746563616c6c","id":555,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2097:58:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4","typeString":"literal_string \"UUPSUpgradeable: must not be called through delegatecall\""},"value":"UUPSUpgradeable: must not be called through delegatecall"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4","typeString":"literal_string \"UUPSUpgradeable: must not be called through delegatecall\""}],"id":548,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2064:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":556,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2064:92:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":557,"nodeType":"ExpressionStatement","src":"2064:92:4"},{"id":558,"nodeType":"PlaceholderStatement","src":"2166:1:4"}]},"documentation":{"id":546,"nodeType":"StructuredDocumentation","src":"1830:195:4","text":" @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n callable on the implementing contract but not through proxies."},"id":560,"name":"notDelegated","nameLocation":"2039:12:4","nodeType":"ModifierDefinition","parameters":{"id":547,"nodeType":"ParameterList","parameters":[],"src":"2051:2:4"},"src":"2030:144:4","virtual":false,"visibility":"internal"},{"baseFunctions":[8],"body":{"id":571,"nodeType":"Block","src":"2849:44:4","statements":[{"expression":{"id":569,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23,"src":"2866:20:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":568,"id":570,"nodeType":"Return","src":"2859:27:4"}]},"documentation":{"id":561,"nodeType":"StructuredDocumentation","src":"2180:577:4","text":" @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"functionSelector":"52d1902d","id":572,"implemented":true,"kind":"function","modifiers":[{"id":565,"kind":"modifierInvocation","modifierName":{"id":564,"name":"notDelegated","nameLocations":["2818:12:4"],"nodeType":"IdentifierPath","referencedDeclaration":560,"src":"2818:12:4"},"nodeType":"ModifierInvocation","src":"2818:12:4"}],"name":"proxiableUUID","nameLocation":"2771:13:4","nodeType":"FunctionDefinition","overrides":{"id":563,"nodeType":"OverrideSpecifier","overrides":[],"src":"2809:8:4"},"parameters":{"id":562,"nodeType":"ParameterList","parameters":[],"src":"2784:2:4"},"returnParameters":{"id":568,"nodeType":"ParameterList","parameters":[{"constant":false,"id":567,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":572,"src":"2840:7:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":566,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2840:7:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2839:9:4"},"scope":622,"src":"2762:131:4","stateMutability":"view","virtual":true,"visibility":"external"},{"body":{"id":593,"nodeType":"Block","src":"3146:124:4","statements":[{"expression":{"arguments":[{"id":581,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":575,"src":"3174:17:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":580,"name":"_authorizeUpgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":621,"src":"3156:17:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3156:36:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":583,"nodeType":"ExpressionStatement","src":"3156:36:4"},{"expression":{"arguments":[{"id":585,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":575,"src":"3224:17:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":588,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3253:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":587,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3243:9:4","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":586,"name":"bytes","nodeType":"ElementaryTypeName","src":"3247:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3243:12:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"66616c7365","id":590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3257:5:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":584,"name":"_upgradeToAndCallUUPS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":163,"src":"3202:21:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3202:61:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":592,"nodeType":"ExpressionStatement","src":"3202:61:4"}]},"documentation":{"id":573,"nodeType":"StructuredDocumentation","src":"2899:169:4","text":" @dev Upgrade the implementation of the proxy to `newImplementation`.\n Calls {_authorizeUpgrade}.\n Emits an {Upgraded} event."},"functionSelector":"3659cfe6","id":594,"implemented":true,"kind":"function","modifiers":[{"id":578,"kind":"modifierInvocation","modifierName":{"id":577,"name":"onlyProxy","nameLocations":["3136:9:4"],"nodeType":"IdentifierPath","referencedDeclaration":545,"src":"3136:9:4"},"nodeType":"ModifierInvocation","src":"3136:9:4"}],"name":"upgradeTo","nameLocation":"3082:9:4","nodeType":"FunctionDefinition","parameters":{"id":576,"nodeType":"ParameterList","parameters":[{"constant":false,"id":575,"mutability":"mutable","name":"newImplementation","nameLocation":"3100:17:4","nodeType":"VariableDeclaration","scope":594,"src":"3092:25:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":574,"name":"address","nodeType":"ElementaryTypeName","src":"3092:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3091:27:4"},"returnParameters":{"id":579,"nodeType":"ParameterList","parameters":[],"src":"3146:0:4"},"scope":622,"src":"3073:197:4","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":614,"nodeType":"Block","src":"3626:115:4","statements":[{"expression":{"arguments":[{"id":605,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":597,"src":"3654:17:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":604,"name":"_authorizeUpgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":621,"src":"3636:17:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3636:36:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":607,"nodeType":"ExpressionStatement","src":"3636:36:4"},{"expression":{"arguments":[{"id":609,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":597,"src":"3704:17:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":610,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":599,"src":"3723:4:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"74727565","id":611,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3729:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":608,"name":"_upgradeToAndCallUUPS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":163,"src":"3682:21:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3682:52:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":613,"nodeType":"ExpressionStatement","src":"3682:52:4"}]},"documentation":{"id":595,"nodeType":"StructuredDocumentation","src":"3276:238:4","text":" @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n encoded in `data`.\n Calls {_authorizeUpgrade}.\n Emits an {Upgraded} event."},"functionSelector":"4f1ef286","id":615,"implemented":true,"kind":"function","modifiers":[{"id":602,"kind":"modifierInvocation","modifierName":{"id":601,"name":"onlyProxy","nameLocations":["3616:9:4"],"nodeType":"IdentifierPath","referencedDeclaration":545,"src":"3616:9:4"},"nodeType":"ModifierInvocation","src":"3616:9:4"}],"name":"upgradeToAndCall","nameLocation":"3528:16:4","nodeType":"FunctionDefinition","parameters":{"id":600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":597,"mutability":"mutable","name":"newImplementation","nameLocation":"3553:17:4","nodeType":"VariableDeclaration","scope":615,"src":"3545:25:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":596,"name":"address","nodeType":"ElementaryTypeName","src":"3545:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":599,"mutability":"mutable","name":"data","nameLocation":"3585:4:4","nodeType":"VariableDeclaration","scope":615,"src":"3572:17:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":598,"name":"bytes","nodeType":"ElementaryTypeName","src":"3572:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3544:46:4"},"returnParameters":{"id":603,"nodeType":"ParameterList","parameters":[],"src":"3626:0:4"},"scope":622,"src":"3519:222:4","stateMutability":"payable","virtual":true,"visibility":"external"},{"documentation":{"id":616,"nodeType":"StructuredDocumentation","src":"3747:397:4","text":" @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n {upgradeTo} and {upgradeToAndCall}.\n Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n ```solidity\n function _authorizeUpgrade(address) internal override onlyOwner {}\n ```"},"id":621,"implemented":false,"kind":"function","modifiers":[],"name":"_authorizeUpgrade","nameLocation":"4158:17:4","nodeType":"FunctionDefinition","parameters":{"id":619,"nodeType":"ParameterList","parameters":[{"constant":false,"id":618,"mutability":"mutable","name":"newImplementation","nameLocation":"4184:17:4","nodeType":"VariableDeclaration","scope":621,"src":"4176:25:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":617,"name":"address","nodeType":"ElementaryTypeName","src":"4176:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4175:27:4"},"returnParameters":{"id":620,"nodeType":"ParameterList","parameters":[],"src":"4219:0:4"},"scope":622,"src":"4149:71:4","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":623,"src":"876:3346:4","usedErrors":[]}],"src":"115:4108:4"},"id":4},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","exportedSymbols":{"IERC1155Receiver":[663],"IERC165":[1639]},"id":664,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":624,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"118:23:5"},{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","file":"../../utils/introspection/IERC165.sol","id":625,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":664,"sourceUnit":1640,"src":"143:47:5","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":627,"name":"IERC165","nameLocations":["262:7:5"],"nodeType":"IdentifierPath","referencedDeclaration":1639,"src":"262:7:5"},"id":628,"nodeType":"InheritanceSpecifier","src":"262:7:5"}],"canonicalName":"IERC1155Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":626,"nodeType":"StructuredDocumentation","src":"192:39:5","text":" @dev _Available since v3.1._"},"fullyImplemented":false,"id":663,"linearizedBaseContracts":[663,1639],"name":"IERC1155Receiver","nameLocation":"242:16:5","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":629,"nodeType":"StructuredDocumentation","src":"276:826:5","text":" @dev Handles the receipt of a single ERC1155 token type. This function is\n called at the end of a `safeTransferFrom` after the balance has been updated.\n NOTE: To accept the transfer, this must return\n `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n (i.e. 0xf23a6e61, or its own function selector).\n @param operator The address which initiated the transfer (i.e. msg.sender)\n @param from The address which previously owned the token\n @param id The ID of the token being transferred\n @param value The amount of tokens being transferred\n @param data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed"},"functionSelector":"f23a6e61","id":644,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1116:17:5","nodeType":"FunctionDefinition","parameters":{"id":640,"nodeType":"ParameterList","parameters":[{"constant":false,"id":631,"mutability":"mutable","name":"operator","nameLocation":"1151:8:5","nodeType":"VariableDeclaration","scope":644,"src":"1143:16:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":630,"name":"address","nodeType":"ElementaryTypeName","src":"1143:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":633,"mutability":"mutable","name":"from","nameLocation":"1177:4:5","nodeType":"VariableDeclaration","scope":644,"src":"1169:12:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":632,"name":"address","nodeType":"ElementaryTypeName","src":"1169:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":635,"mutability":"mutable","name":"id","nameLocation":"1199:2:5","nodeType":"VariableDeclaration","scope":644,"src":"1191:10:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":634,"name":"uint256","nodeType":"ElementaryTypeName","src":"1191:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":637,"mutability":"mutable","name":"value","nameLocation":"1219:5:5","nodeType":"VariableDeclaration","scope":644,"src":"1211:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":636,"name":"uint256","nodeType":"ElementaryTypeName","src":"1211:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":639,"mutability":"mutable","name":"data","nameLocation":"1249:4:5","nodeType":"VariableDeclaration","scope":644,"src":"1234:19:5","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":638,"name":"bytes","nodeType":"ElementaryTypeName","src":"1234:5:5","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1133:126:5"},"returnParameters":{"id":643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":642,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":644,"src":"1278:6:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":641,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1278:6:5","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1277:8:5"},"scope":663,"src":"1107:179:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":645,"nodeType":"StructuredDocumentation","src":"1292:994:5","text":" @dev Handles the receipt of a multiple ERC1155 token types. This function\n is called at the end of a `safeBatchTransferFrom` after the balances have\n been updated.\n NOTE: To accept the transfer(s), this must return\n `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n (i.e. 0xbc197c81, or its own function selector).\n @param operator The address which initiated the batch transfer (i.e. msg.sender)\n @param from The address which previously owned the token\n @param ids An array containing ids of each token being transferred (order and length must match values array)\n @param values An array containing amounts of each token being transferred (order and length must match ids array)\n @param data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed"},"functionSelector":"bc197c81","id":662,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"2300:22:5","nodeType":"FunctionDefinition","parameters":{"id":658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":647,"mutability":"mutable","name":"operator","nameLocation":"2340:8:5","nodeType":"VariableDeclaration","scope":662,"src":"2332:16:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":646,"name":"address","nodeType":"ElementaryTypeName","src":"2332:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":649,"mutability":"mutable","name":"from","nameLocation":"2366:4:5","nodeType":"VariableDeclaration","scope":662,"src":"2358:12:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":648,"name":"address","nodeType":"ElementaryTypeName","src":"2358:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":652,"mutability":"mutable","name":"ids","nameLocation":"2399:3:5","nodeType":"VariableDeclaration","scope":662,"src":"2380:22:5","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":650,"name":"uint256","nodeType":"ElementaryTypeName","src":"2380:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":651,"nodeType":"ArrayTypeName","src":"2380:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":655,"mutability":"mutable","name":"values","nameLocation":"2431:6:5","nodeType":"VariableDeclaration","scope":662,"src":"2412:25:5","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":653,"name":"uint256","nodeType":"ElementaryTypeName","src":"2412:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":654,"nodeType":"ArrayTypeName","src":"2412:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":657,"mutability":"mutable","name":"data","nameLocation":"2462:4:5","nodeType":"VariableDeclaration","scope":662,"src":"2447:19:5","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":656,"name":"bytes","nodeType":"ElementaryTypeName","src":"2447:5:5","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2322:150:5"},"returnParameters":{"id":661,"nodeType":"ParameterList","parameters":[{"constant":false,"id":660,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":662,"src":"2491:6:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":659,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2491:6:5","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2490:8:5"},"scope":663,"src":"2291:208:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":664,"src":"232:2269:5","usedErrors":[]}],"src":"118:2384:5"},"id":5},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","exportedSymbols":{"IERC721Receiver":[681]},"id":682,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":665,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"116:23:6"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":666,"nodeType":"StructuredDocumentation","src":"141:152:6","text":" @title ERC721 token receiver interface\n @dev Interface for any contract that wants to support safeTransfers\n from ERC721 asset contracts."},"fullyImplemented":false,"id":681,"linearizedBaseContracts":[681],"name":"IERC721Receiver","nameLocation":"304:15:6","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":667,"nodeType":"StructuredDocumentation","src":"326:493:6","text":" @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n by `operator` from `from`, this function is called.\n It must return its Solidity selector to confirm the token transfer.\n If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`."},"functionSelector":"150b7a02","id":680,"implemented":false,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"833:16:6","nodeType":"FunctionDefinition","parameters":{"id":676,"nodeType":"ParameterList","parameters":[{"constant":false,"id":669,"mutability":"mutable","name":"operator","nameLocation":"867:8:6","nodeType":"VariableDeclaration","scope":680,"src":"859:16:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":668,"name":"address","nodeType":"ElementaryTypeName","src":"859:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":671,"mutability":"mutable","name":"from","nameLocation":"893:4:6","nodeType":"VariableDeclaration","scope":680,"src":"885:12:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":670,"name":"address","nodeType":"ElementaryTypeName","src":"885:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":673,"mutability":"mutable","name":"tokenId","nameLocation":"915:7:6","nodeType":"VariableDeclaration","scope":680,"src":"907:15:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":672,"name":"uint256","nodeType":"ElementaryTypeName","src":"907:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":675,"mutability":"mutable","name":"data","nameLocation":"947:4:6","nodeType":"VariableDeclaration","scope":680,"src":"932:19:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":674,"name":"bytes","nodeType":"ElementaryTypeName","src":"932:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"849:108:6"},"returnParameters":{"id":679,"nodeType":"ParameterList","parameters":[{"constant":false,"id":678,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":680,"src":"976:6:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":677,"name":"bytes4","nodeType":"ElementaryTypeName","src":"976:6:6","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"975:8:6"},"scope":681,"src":"824:160:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":682,"src":"294:692:6","usedErrors":[]}],"src":"116:871:6"},"id":6},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","exportedSymbols":{"IERC777Recipient":[701]},"id":702,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":683,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"102:23:7"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC777Recipient","contractDependencies":[],"contractKind":"interface","documentation":{"id":684,"nodeType":"StructuredDocumentation","src":"127:406:7","text":" @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\n Accounts can be notified of {IERC777} tokens being sent to them by having a\n contract implement this interface (contract holders can be their own\n implementer) and registering it on the\n https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\n See {IERC1820Registry} and {ERC1820Implementer}."},"fullyImplemented":false,"id":701,"linearizedBaseContracts":[701],"name":"IERC777Recipient","nameLocation":"544:16:7","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":685,"nodeType":"StructuredDocumentation","src":"567:474:7","text":" @dev Called by an {IERC777} token contract whenever tokens are being\n moved or created into a registered account (`to`). The type of operation\n is conveyed by `from` being the zero address or not.\n This call occurs _after_ the token contract's state is updated, so\n {IERC777-balanceOf}, etc., can be used to query the post-operation state.\n This function may revert to prevent the operation from being executed."},"functionSelector":"0023de29","id":700,"implemented":false,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"1055:14:7","nodeType":"FunctionDefinition","parameters":{"id":698,"nodeType":"ParameterList","parameters":[{"constant":false,"id":687,"mutability":"mutable","name":"operator","nameLocation":"1087:8:7","nodeType":"VariableDeclaration","scope":700,"src":"1079:16:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":686,"name":"address","nodeType":"ElementaryTypeName","src":"1079:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":689,"mutability":"mutable","name":"from","nameLocation":"1113:4:7","nodeType":"VariableDeclaration","scope":700,"src":"1105:12:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":688,"name":"address","nodeType":"ElementaryTypeName","src":"1105:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":691,"mutability":"mutable","name":"to","nameLocation":"1135:2:7","nodeType":"VariableDeclaration","scope":700,"src":"1127:10:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":690,"name":"address","nodeType":"ElementaryTypeName","src":"1127:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":693,"mutability":"mutable","name":"amount","nameLocation":"1155:6:7","nodeType":"VariableDeclaration","scope":700,"src":"1147:14:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":692,"name":"uint256","nodeType":"ElementaryTypeName","src":"1147:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":695,"mutability":"mutable","name":"userData","nameLocation":"1186:8:7","nodeType":"VariableDeclaration","scope":700,"src":"1171:23:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":694,"name":"bytes","nodeType":"ElementaryTypeName","src":"1171:5:7","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":697,"mutability":"mutable","name":"operatorData","nameLocation":"1219:12:7","nodeType":"VariableDeclaration","scope":700,"src":"1204:27:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":696,"name":"bytes","nodeType":"ElementaryTypeName","src":"1204:5:7","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1069:168:7"},"returnParameters":{"id":699,"nodeType":"ParameterList","parameters":[],"src":"1246:0:7"},"scope":701,"src":"1046:201:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":702,"src":"534:715:7","usedErrors":[]}],"src":"102:1148:7"},"id":7},"@openzeppelin/contracts/utils/Address.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","exportedSymbols":{"Address":[1031]},"id":1032,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":703,"literals":["solidity","^","0.8",".1"],"nodeType":"PragmaDirective","src":"101:23:8"},{"abstract":false,"baseContracts":[],"canonicalName":"Address","contractDependencies":[],"contractKind":"library","documentation":{"id":704,"nodeType":"StructuredDocumentation","src":"126:67:8","text":" @dev Collection of functions related to the address type"},"fullyImplemented":true,"id":1031,"linearizedBaseContracts":[1031],"name":"Address","nameLocation":"202:7:8","nodeType":"ContractDefinition","nodes":[{"body":{"id":718,"nodeType":"Block","src":"1241:254:8","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":716,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":712,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":707,"src":"1465:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1473:4:8","memberName":"code","nodeType":"MemberAccess","src":"1465:12:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1478:6:8","memberName":"length","nodeType":"MemberAccess","src":"1465:19:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1487:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1465:23:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":711,"id":717,"nodeType":"Return","src":"1458:30:8"}]},"documentation":{"id":705,"nodeType":"StructuredDocumentation","src":"216:954:8","text":" @dev Returns true if `account` is a contract.\n [IMPORTANT]\n ====\n It is unsafe to assume that an address for which this function returns\n false is an externally-owned account (EOA) and not a contract.\n Among others, `isContract` will return false for the following\n types of addresses:\n - an externally-owned account\n - a contract in construction\n - an address where a contract will be created\n - an address where a contract lived, but was destroyed\n ====\n [IMPORTANT]\n ====\n You shouldn't rely on `isContract` to protect against flash loan attacks!\n Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n constructor.\n ===="},"id":719,"implemented":true,"kind":"function","modifiers":[],"name":"isContract","nameLocation":"1184:10:8","nodeType":"FunctionDefinition","parameters":{"id":708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":707,"mutability":"mutable","name":"account","nameLocation":"1203:7:8","nodeType":"VariableDeclaration","scope":719,"src":"1195:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":706,"name":"address","nodeType":"ElementaryTypeName","src":"1195:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1194:17:8"},"returnParameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":710,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":719,"src":"1235:4:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":709,"name":"bool","nodeType":"ElementaryTypeName","src":"1235:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1234:6:8"},"scope":1031,"src":"1175:320:8","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":752,"nodeType":"Block","src":"2483:241:8","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":734,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":730,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2509:4:8","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1031","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1031","typeString":"library Address"}],"id":729,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2501:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":728,"name":"address","nodeType":"ElementaryTypeName","src":"2501:7:8","typeDescriptions":{}}},"id":731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2501:13:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":732,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2515:7:8","memberName":"balance","nodeType":"MemberAccess","src":"2501:21:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":733,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":724,"src":"2526:6:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2501:31:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e6365","id":735,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2534:31:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9","typeString":"literal_string \"Address: insufficient balance\""},"value":"Address: insufficient balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9","typeString":"literal_string \"Address: insufficient balance\""}],"id":727,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2493:7:8","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2493:73:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":737,"nodeType":"ExpressionStatement","src":"2493:73:8"},{"assignments":[739,null],"declarations":[{"constant":false,"id":739,"mutability":"mutable","name":"success","nameLocation":"2583:7:8","nodeType":"VariableDeclaration","scope":752,"src":"2578:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":738,"name":"bool","nodeType":"ElementaryTypeName","src":"2578:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":746,"initialValue":{"arguments":[{"hexValue":"","id":744,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2626:2:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":740,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":722,"src":"2596:9:8","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2606:4:8","memberName":"call","nodeType":"MemberAccess","src":"2596:14:8","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":742,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":724,"src":"2618:6:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2596:29:8","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":745,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2596:33:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"2577:52:8"},{"expression":{"arguments":[{"id":748,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":739,"src":"2647:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564","id":749,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2656:60:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae","typeString":"literal_string \"Address: unable to send value, recipient may have reverted\""},"value":"Address: unable to send value, recipient may have reverted"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae","typeString":"literal_string \"Address: unable to send value, recipient may have reverted\""}],"id":747,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2639:7:8","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2639:78:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":751,"nodeType":"ExpressionStatement","src":"2639:78:8"}]},"documentation":{"id":720,"nodeType":"StructuredDocumentation","src":"1501:906:8","text":" @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\n https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n of certain opcodes, possibly making contracts go over the 2300 gas limit\n imposed by `transfer`, making them unable to receive funds via\n `transfer`. {sendValue} removes this limitation.\n https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n IMPORTANT: because control is transferred to `recipient`, care must be\n taken to not create reentrancy vulnerabilities. Consider using\n {ReentrancyGuard} or the\n https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]."},"id":753,"implemented":true,"kind":"function","modifiers":[],"name":"sendValue","nameLocation":"2421:9:8","nodeType":"FunctionDefinition","parameters":{"id":725,"nodeType":"ParameterList","parameters":[{"constant":false,"id":722,"mutability":"mutable","name":"recipient","nameLocation":"2447:9:8","nodeType":"VariableDeclaration","scope":753,"src":"2431:25:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":721,"name":"address","nodeType":"ElementaryTypeName","src":"2431:15:8","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":724,"mutability":"mutable","name":"amount","nameLocation":"2466:6:8","nodeType":"VariableDeclaration","scope":753,"src":"2458:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":723,"name":"uint256","nodeType":"ElementaryTypeName","src":"2458:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2430:43:8"},"returnParameters":{"id":726,"nodeType":"ParameterList","parameters":[],"src":"2483:0:8"},"scope":1031,"src":"2412:312:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":770,"nodeType":"Block","src":"3555:96:8","statements":[{"expression":{"arguments":[{"id":764,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":756,"src":"3594:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":765,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":758,"src":"3602:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":766,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3608:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564","id":767,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3611:32:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df","typeString":"literal_string \"Address: low-level call failed\""},"value":"Address: low-level call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df","typeString":"literal_string \"Address: low-level call failed\""}],"id":763,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[811,855],"referencedDeclaration":855,"src":"3572:21:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3572:72:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":762,"id":769,"nodeType":"Return","src":"3565:79:8"}]},"documentation":{"id":754,"nodeType":"StructuredDocumentation","src":"2730:731:8","text":" @dev Performs a Solidity function call using a low level `call`. A\n plain `call` is an unsafe replacement for a function call: use this\n function instead.\n If `target` reverts with a revert reason, it is bubbled up by this\n function (like regular Solidity function calls).\n Returns the raw returned data. To convert to the expected return value,\n use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert.\n _Available since v3.1._"},"id":771,"implemented":true,"kind":"function","modifiers":[],"name":"functionCall","nameLocation":"3475:12:8","nodeType":"FunctionDefinition","parameters":{"id":759,"nodeType":"ParameterList","parameters":[{"constant":false,"id":756,"mutability":"mutable","name":"target","nameLocation":"3496:6:8","nodeType":"VariableDeclaration","scope":771,"src":"3488:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":755,"name":"address","nodeType":"ElementaryTypeName","src":"3488:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":758,"mutability":"mutable","name":"data","nameLocation":"3517:4:8","nodeType":"VariableDeclaration","scope":771,"src":"3504:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":757,"name":"bytes","nodeType":"ElementaryTypeName","src":"3504:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3487:35:8"},"returnParameters":{"id":762,"nodeType":"ParameterList","parameters":[{"constant":false,"id":761,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":771,"src":"3541:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":760,"name":"bytes","nodeType":"ElementaryTypeName","src":"3541:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3540:14:8"},"scope":1031,"src":"3466:185:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":790,"nodeType":"Block","src":"4020:76:8","statements":[{"expression":{"arguments":[{"id":784,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":774,"src":"4059:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":785,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":776,"src":"4067:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":786,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4073:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":787,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":778,"src":"4076:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":783,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[811,855],"referencedDeclaration":855,"src":"4037:21:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":788,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4037:52:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":782,"id":789,"nodeType":"Return","src":"4030:59:8"}]},"documentation":{"id":772,"nodeType":"StructuredDocumentation","src":"3657:211:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"},"id":791,"implemented":true,"kind":"function","modifiers":[],"name":"functionCall","nameLocation":"3882:12:8","nodeType":"FunctionDefinition","parameters":{"id":779,"nodeType":"ParameterList","parameters":[{"constant":false,"id":774,"mutability":"mutable","name":"target","nameLocation":"3912:6:8","nodeType":"VariableDeclaration","scope":791,"src":"3904:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":773,"name":"address","nodeType":"ElementaryTypeName","src":"3904:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":776,"mutability":"mutable","name":"data","nameLocation":"3941:4:8","nodeType":"VariableDeclaration","scope":791,"src":"3928:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":775,"name":"bytes","nodeType":"ElementaryTypeName","src":"3928:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":778,"mutability":"mutable","name":"errorMessage","nameLocation":"3969:12:8","nodeType":"VariableDeclaration","scope":791,"src":"3955:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":777,"name":"string","nodeType":"ElementaryTypeName","src":"3955:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3894:93:8"},"returnParameters":{"id":782,"nodeType":"ParameterList","parameters":[{"constant":false,"id":781,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":791,"src":"4006:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":780,"name":"bytes","nodeType":"ElementaryTypeName","src":"4006:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4005:14:8"},"scope":1031,"src":"3873:223:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":810,"nodeType":"Block","src":"4601:111:8","statements":[{"expression":{"arguments":[{"id":804,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":794,"src":"4640:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":805,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"4648:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":806,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":798,"src":"4654:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564","id":807,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4661:43:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc","typeString":"literal_string \"Address: low-level call with value failed\""},"value":"Address: low-level call with value failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc","typeString":"literal_string \"Address: low-level call with value failed\""}],"id":803,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[811,855],"referencedDeclaration":855,"src":"4618:21:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4618:87:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":802,"id":809,"nodeType":"Return","src":"4611:94:8"}]},"documentation":{"id":792,"nodeType":"StructuredDocumentation","src":"4102:351:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`.\n _Available since v3.1._"},"id":811,"implemented":true,"kind":"function","modifiers":[],"name":"functionCallWithValue","nameLocation":"4467:21:8","nodeType":"FunctionDefinition","parameters":{"id":799,"nodeType":"ParameterList","parameters":[{"constant":false,"id":794,"mutability":"mutable","name":"target","nameLocation":"4506:6:8","nodeType":"VariableDeclaration","scope":811,"src":"4498:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":793,"name":"address","nodeType":"ElementaryTypeName","src":"4498:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":796,"mutability":"mutable","name":"data","nameLocation":"4535:4:8","nodeType":"VariableDeclaration","scope":811,"src":"4522:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":795,"name":"bytes","nodeType":"ElementaryTypeName","src":"4522:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":798,"mutability":"mutable","name":"value","nameLocation":"4557:5:8","nodeType":"VariableDeclaration","scope":811,"src":"4549:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":797,"name":"uint256","nodeType":"ElementaryTypeName","src":"4549:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4488:80:8"},"returnParameters":{"id":802,"nodeType":"ParameterList","parameters":[{"constant":false,"id":801,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":811,"src":"4587:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":800,"name":"bytes","nodeType":"ElementaryTypeName","src":"4587:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4586:14:8"},"scope":1031,"src":"4458:254:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":854,"nodeType":"Block","src":"5139:267:8","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":828,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5165:4:8","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1031","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1031","typeString":"library Address"}],"id":827,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5157:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":826,"name":"address","nodeType":"ElementaryTypeName","src":"5157:7:8","typeDescriptions":{}}},"id":829,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5157:13:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5171:7:8","memberName":"balance","nodeType":"MemberAccess","src":"5157:21:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":831,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":818,"src":"5182:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5157:30:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c","id":833,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5189:40:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c","typeString":"literal_string \"Address: insufficient balance for call\""},"value":"Address: insufficient balance for call"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c","typeString":"literal_string \"Address: insufficient balance for call\""}],"id":825,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5149:7:8","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":834,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5149:81:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":835,"nodeType":"ExpressionStatement","src":"5149:81:8"},{"assignments":[837,839],"declarations":[{"constant":false,"id":837,"mutability":"mutable","name":"success","nameLocation":"5246:7:8","nodeType":"VariableDeclaration","scope":854,"src":"5241:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":836,"name":"bool","nodeType":"ElementaryTypeName","src":"5241:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":839,"mutability":"mutable","name":"returndata","nameLocation":"5268:10:8","nodeType":"VariableDeclaration","scope":854,"src":"5255:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":838,"name":"bytes","nodeType":"ElementaryTypeName","src":"5255:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":846,"initialValue":{"arguments":[{"id":844,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":816,"src":"5308:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":840,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":814,"src":"5282:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5289:4:8","memberName":"call","nodeType":"MemberAccess","src":"5282:11:8","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":842,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":818,"src":"5301:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"5282:25:8","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5282:31:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"5240:73:8"},{"expression":{"arguments":[{"id":848,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":814,"src":"5357:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":849,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":837,"src":"5365:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":850,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":839,"src":"5374:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":851,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":820,"src":"5386:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":847,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":986,"src":"5330:26:8","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5330:69:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":824,"id":853,"nodeType":"Return","src":"5323:76:8"}]},"documentation":{"id":812,"nodeType":"StructuredDocumentation","src":"4718:237:8","text":" @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n with `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"},"id":855,"implemented":true,"kind":"function","modifiers":[],"name":"functionCallWithValue","nameLocation":"4969:21:8","nodeType":"FunctionDefinition","parameters":{"id":821,"nodeType":"ParameterList","parameters":[{"constant":false,"id":814,"mutability":"mutable","name":"target","nameLocation":"5008:6:8","nodeType":"VariableDeclaration","scope":855,"src":"5000:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":813,"name":"address","nodeType":"ElementaryTypeName","src":"5000:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":816,"mutability":"mutable","name":"data","nameLocation":"5037:4:8","nodeType":"VariableDeclaration","scope":855,"src":"5024:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":815,"name":"bytes","nodeType":"ElementaryTypeName","src":"5024:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":818,"mutability":"mutable","name":"value","nameLocation":"5059:5:8","nodeType":"VariableDeclaration","scope":855,"src":"5051:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":817,"name":"uint256","nodeType":"ElementaryTypeName","src":"5051:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":820,"mutability":"mutable","name":"errorMessage","nameLocation":"5088:12:8","nodeType":"VariableDeclaration","scope":855,"src":"5074:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":819,"name":"string","nodeType":"ElementaryTypeName","src":"5074:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"4990:116:8"},"returnParameters":{"id":824,"nodeType":"ParameterList","parameters":[{"constant":false,"id":823,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":855,"src":"5125:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":822,"name":"bytes","nodeType":"ElementaryTypeName","src":"5125:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5124:14:8"},"scope":1031,"src":"4960:446:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":871,"nodeType":"Block","src":"5683:97:8","statements":[{"expression":{"arguments":[{"id":866,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":858,"src":"5719:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":867,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":860,"src":"5727:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"416464726573733a206c6f772d6c6576656c207374617469632063616c6c206661696c6564","id":868,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5733:39:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0","typeString":"literal_string \"Address: low-level static call failed\""},"value":"Address: low-level static call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0","typeString":"literal_string \"Address: low-level static call failed\""}],"id":865,"name":"functionStaticCall","nodeType":"Identifier","overloadedDeclarations":[872,901],"referencedDeclaration":901,"src":"5700:18:8","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,string memory) view returns (bytes memory)"}},"id":869,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5700:73:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":864,"id":870,"nodeType":"Return","src":"5693:80:8"}]},"documentation":{"id":856,"nodeType":"StructuredDocumentation","src":"5412:166:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"},"id":872,"implemented":true,"kind":"function","modifiers":[],"name":"functionStaticCall","nameLocation":"5592:18:8","nodeType":"FunctionDefinition","parameters":{"id":861,"nodeType":"ParameterList","parameters":[{"constant":false,"id":858,"mutability":"mutable","name":"target","nameLocation":"5619:6:8","nodeType":"VariableDeclaration","scope":872,"src":"5611:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":857,"name":"address","nodeType":"ElementaryTypeName","src":"5611:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":860,"mutability":"mutable","name":"data","nameLocation":"5640:4:8","nodeType":"VariableDeclaration","scope":872,"src":"5627:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":859,"name":"bytes","nodeType":"ElementaryTypeName","src":"5627:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5610:35:8"},"returnParameters":{"id":864,"nodeType":"ParameterList","parameters":[{"constant":false,"id":863,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":872,"src":"5669:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":862,"name":"bytes","nodeType":"ElementaryTypeName","src":"5669:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5668:14:8"},"scope":1031,"src":"5583:197:8","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":900,"nodeType":"Block","src":"6122:168:8","statements":[{"assignments":[885,887],"declarations":[{"constant":false,"id":885,"mutability":"mutable","name":"success","nameLocation":"6138:7:8","nodeType":"VariableDeclaration","scope":900,"src":"6133:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":884,"name":"bool","nodeType":"ElementaryTypeName","src":"6133:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":887,"mutability":"mutable","name":"returndata","nameLocation":"6160:10:8","nodeType":"VariableDeclaration","scope":900,"src":"6147:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":886,"name":"bytes","nodeType":"ElementaryTypeName","src":"6147:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":892,"initialValue":{"arguments":[{"id":890,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":877,"src":"6192:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":888,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":875,"src":"6174:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6181:10:8","memberName":"staticcall","nodeType":"MemberAccess","src":"6174:17:8","typeDescriptions":{"typeIdentifier":"t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) view returns (bool,bytes memory)"}},"id":891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6174:23:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"6132:65:8"},{"expression":{"arguments":[{"id":894,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":875,"src":"6241:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":895,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":885,"src":"6249:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":896,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":887,"src":"6258:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":897,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":879,"src":"6270:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":893,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":986,"src":"6214:26:8","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":898,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6214:69:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":883,"id":899,"nodeType":"Return","src":"6207:76:8"}]},"documentation":{"id":873,"nodeType":"StructuredDocumentation","src":"5786:173:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"},"id":901,"implemented":true,"kind":"function","modifiers":[],"name":"functionStaticCall","nameLocation":"5973:18:8","nodeType":"FunctionDefinition","parameters":{"id":880,"nodeType":"ParameterList","parameters":[{"constant":false,"id":875,"mutability":"mutable","name":"target","nameLocation":"6009:6:8","nodeType":"VariableDeclaration","scope":901,"src":"6001:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":874,"name":"address","nodeType":"ElementaryTypeName","src":"6001:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":877,"mutability":"mutable","name":"data","nameLocation":"6038:4:8","nodeType":"VariableDeclaration","scope":901,"src":"6025:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":876,"name":"bytes","nodeType":"ElementaryTypeName","src":"6025:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":879,"mutability":"mutable","name":"errorMessage","nameLocation":"6066:12:8","nodeType":"VariableDeclaration","scope":901,"src":"6052:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":878,"name":"string","nodeType":"ElementaryTypeName","src":"6052:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5991:93:8"},"returnParameters":{"id":883,"nodeType":"ParameterList","parameters":[{"constant":false,"id":882,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":901,"src":"6108:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":881,"name":"bytes","nodeType":"ElementaryTypeName","src":"6108:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6107:14:8"},"scope":1031,"src":"5964:326:8","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":917,"nodeType":"Block","src":"6566:101:8","statements":[{"expression":{"arguments":[{"id":912,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":904,"src":"6604:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":913,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":906,"src":"6612:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564","id":914,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6618:41:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398","typeString":"literal_string \"Address: low-level delegate call failed\""},"value":"Address: low-level delegate call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398","typeString":"literal_string \"Address: low-level delegate call failed\""}],"id":911,"name":"functionDelegateCall","nodeType":"Identifier","overloadedDeclarations":[918,947],"referencedDeclaration":947,"src":"6583:20:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,string memory) returns (bytes memory)"}},"id":915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6583:77:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":910,"id":916,"nodeType":"Return","src":"6576:84:8"}]},"documentation":{"id":902,"nodeType":"StructuredDocumentation","src":"6296:168:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"},"id":918,"implemented":true,"kind":"function","modifiers":[],"name":"functionDelegateCall","nameLocation":"6478:20:8","nodeType":"FunctionDefinition","parameters":{"id":907,"nodeType":"ParameterList","parameters":[{"constant":false,"id":904,"mutability":"mutable","name":"target","nameLocation":"6507:6:8","nodeType":"VariableDeclaration","scope":918,"src":"6499:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":903,"name":"address","nodeType":"ElementaryTypeName","src":"6499:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":906,"mutability":"mutable","name":"data","nameLocation":"6528:4:8","nodeType":"VariableDeclaration","scope":918,"src":"6515:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":905,"name":"bytes","nodeType":"ElementaryTypeName","src":"6515:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6498:35:8"},"returnParameters":{"id":910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":909,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":918,"src":"6552:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":908,"name":"bytes","nodeType":"ElementaryTypeName","src":"6552:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6551:14:8"},"scope":1031,"src":"6469:198:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":946,"nodeType":"Block","src":"7008:170:8","statements":[{"assignments":[931,933],"declarations":[{"constant":false,"id":931,"mutability":"mutable","name":"success","nameLocation":"7024:7:8","nodeType":"VariableDeclaration","scope":946,"src":"7019:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":930,"name":"bool","nodeType":"ElementaryTypeName","src":"7019:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":933,"mutability":"mutable","name":"returndata","nameLocation":"7046:10:8","nodeType":"VariableDeclaration","scope":946,"src":"7033:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":932,"name":"bytes","nodeType":"ElementaryTypeName","src":"7033:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":938,"initialValue":{"arguments":[{"id":936,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":923,"src":"7080:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":934,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":921,"src":"7060:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7067:12:8","memberName":"delegatecall","nodeType":"MemberAccess","src":"7060:19:8","typeDescriptions":{"typeIdentifier":"t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) returns (bool,bytes memory)"}},"id":937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7060:25:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"7018:67:8"},{"expression":{"arguments":[{"id":940,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":921,"src":"7129:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":941,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":931,"src":"7137:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":942,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":933,"src":"7146:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":943,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":925,"src":"7158:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":939,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":986,"src":"7102:26:8","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7102:69:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":929,"id":945,"nodeType":"Return","src":"7095:76:8"}]},"documentation":{"id":919,"nodeType":"StructuredDocumentation","src":"6673:175:8","text":" @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"},"id":947,"implemented":true,"kind":"function","modifiers":[],"name":"functionDelegateCall","nameLocation":"6862:20:8","nodeType":"FunctionDefinition","parameters":{"id":926,"nodeType":"ParameterList","parameters":[{"constant":false,"id":921,"mutability":"mutable","name":"target","nameLocation":"6900:6:8","nodeType":"VariableDeclaration","scope":947,"src":"6892:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":920,"name":"address","nodeType":"ElementaryTypeName","src":"6892:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":923,"mutability":"mutable","name":"data","nameLocation":"6929:4:8","nodeType":"VariableDeclaration","scope":947,"src":"6916:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":922,"name":"bytes","nodeType":"ElementaryTypeName","src":"6916:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":925,"mutability":"mutable","name":"errorMessage","nameLocation":"6957:12:8","nodeType":"VariableDeclaration","scope":947,"src":"6943:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":924,"name":"string","nodeType":"ElementaryTypeName","src":"6943:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"6882:93:8"},"returnParameters":{"id":929,"nodeType":"ParameterList","parameters":[{"constant":false,"id":928,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":947,"src":"6994:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":927,"name":"bytes","nodeType":"ElementaryTypeName","src":"6994:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6993:14:8"},"scope":1031,"src":"6853:325:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":985,"nodeType":"Block","src":"7660:434:8","statements":[{"condition":{"id":961,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"7674:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":983,"nodeType":"Block","src":"8030:58:8","statements":[{"expression":{"arguments":[{"id":979,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":954,"src":"8052:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":980,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":956,"src":"8064:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":978,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1030,"src":"8044:7:8","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (bytes memory,string memory) pure"}},"id":981,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8044:33:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":982,"nodeType":"ExpressionStatement","src":"8044:33:8"}]},"id":984,"nodeType":"IfStatement","src":"7670:418:8","trueBody":{"id":977,"nodeType":"Block","src":"7683:341:8","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":962,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":954,"src":"7701:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7712:6:8","memberName":"length","nodeType":"MemberAccess","src":"7701:17:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":964,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7722:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7701:22:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":974,"nodeType":"IfStatement","src":"7697:286:8","trueBody":{"id":973,"nodeType":"Block","src":"7725:258:8","statements":[{"expression":{"arguments":[{"arguments":[{"id":968,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":950,"src":"7927:6:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":967,"name":"isContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":719,"src":"7916:10:8","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7916:18:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","id":970,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7936:31:8","typeDescriptions":{"typeIdentifier":"t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad","typeString":"literal_string \"Address: call to non-contract\""},"value":"Address: call to non-contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad","typeString":"literal_string \"Address: call to non-contract\""}],"id":966,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7908:7:8","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":971,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7908:60:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":972,"nodeType":"ExpressionStatement","src":"7908:60:8"}]}},{"expression":{"id":975,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":954,"src":"8003:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":960,"id":976,"nodeType":"Return","src":"7996:17:8"}]}}]},"documentation":{"id":948,"nodeType":"StructuredDocumentation","src":"7184:277:8","text":" @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n _Available since v4.8._"},"id":986,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResultFromTarget","nameLocation":"7475:26:8","nodeType":"FunctionDefinition","parameters":{"id":957,"nodeType":"ParameterList","parameters":[{"constant":false,"id":950,"mutability":"mutable","name":"target","nameLocation":"7519:6:8","nodeType":"VariableDeclaration","scope":986,"src":"7511:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":949,"name":"address","nodeType":"ElementaryTypeName","src":"7511:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":952,"mutability":"mutable","name":"success","nameLocation":"7540:7:8","nodeType":"VariableDeclaration","scope":986,"src":"7535:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":951,"name":"bool","nodeType":"ElementaryTypeName","src":"7535:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":954,"mutability":"mutable","name":"returndata","nameLocation":"7570:10:8","nodeType":"VariableDeclaration","scope":986,"src":"7557:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":953,"name":"bytes","nodeType":"ElementaryTypeName","src":"7557:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":956,"mutability":"mutable","name":"errorMessage","nameLocation":"7604:12:8","nodeType":"VariableDeclaration","scope":986,"src":"7590:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":955,"name":"string","nodeType":"ElementaryTypeName","src":"7590:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7501:121:8"},"returnParameters":{"id":960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":959,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":986,"src":"7646:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":958,"name":"bytes","nodeType":"ElementaryTypeName","src":"7646:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7645:14:8"},"scope":1031,"src":"7466:628:8","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1009,"nodeType":"Block","src":"8475:135:8","statements":[{"condition":{"id":998,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":989,"src":"8489:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1007,"nodeType":"Block","src":"8546:58:8","statements":[{"expression":{"arguments":[{"id":1003,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":991,"src":"8568:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":1004,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":993,"src":"8580:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1002,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1030,"src":"8560:7:8","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (bytes memory,string memory) pure"}},"id":1005,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8560:33:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1006,"nodeType":"ExpressionStatement","src":"8560:33:8"}]},"id":1008,"nodeType":"IfStatement","src":"8485:119:8","trueBody":{"id":1001,"nodeType":"Block","src":"8498:42:8","statements":[{"expression":{"id":999,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":991,"src":"8519:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":997,"id":1000,"nodeType":"Return","src":"8512:17:8"}]}}]},"documentation":{"id":987,"nodeType":"StructuredDocumentation","src":"8100:210:8","text":" @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n revert reason or using the provided one.\n _Available since v4.3._"},"id":1010,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResult","nameLocation":"8324:16:8","nodeType":"FunctionDefinition","parameters":{"id":994,"nodeType":"ParameterList","parameters":[{"constant":false,"id":989,"mutability":"mutable","name":"success","nameLocation":"8355:7:8","nodeType":"VariableDeclaration","scope":1010,"src":"8350:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":988,"name":"bool","nodeType":"ElementaryTypeName","src":"8350:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":991,"mutability":"mutable","name":"returndata","nameLocation":"8385:10:8","nodeType":"VariableDeclaration","scope":1010,"src":"8372:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":990,"name":"bytes","nodeType":"ElementaryTypeName","src":"8372:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":993,"mutability":"mutable","name":"errorMessage","nameLocation":"8419:12:8","nodeType":"VariableDeclaration","scope":1010,"src":"8405:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":992,"name":"string","nodeType":"ElementaryTypeName","src":"8405:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"8340:97:8"},"returnParameters":{"id":997,"nodeType":"ParameterList","parameters":[{"constant":false,"id":996,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1010,"src":"8461:12:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":995,"name":"bytes","nodeType":"ElementaryTypeName","src":"8461:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8460:14:8"},"scope":1031,"src":"8315:295:8","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1029,"nodeType":"Block","src":"8699:457:8","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1020,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1017,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1012,"src":"8775:10:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1018,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8786:6:8","memberName":"length","nodeType":"MemberAccess","src":"8775:17:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":1019,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8795:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8775:21:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1027,"nodeType":"Block","src":"9105:45:8","statements":[{"expression":{"arguments":[{"id":1024,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1014,"src":"9126:12:8","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1023,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"9119:6:8","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1025,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9119:20:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1026,"nodeType":"ExpressionStatement","src":"9119:20:8"}]},"id":1028,"nodeType":"IfStatement","src":"8771:379:8","trueBody":{"id":1022,"nodeType":"Block","src":"8798:301:8","statements":[{"AST":{"nodeType":"YulBlock","src":"8956:133:8","statements":[{"nodeType":"YulVariableDeclaration","src":"8974:40:8","value":{"arguments":[{"name":"returndata","nodeType":"YulIdentifier","src":"9003:10:8"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8997:5:8"},"nodeType":"YulFunctionCall","src":"8997:17:8"},"variables":[{"name":"returndata_size","nodeType":"YulTypedName","src":"8978:15:8","type":""}]},{"expression":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9042:2:8","type":"","value":"32"},{"name":"returndata","nodeType":"YulIdentifier","src":"9046:10:8"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9038:3:8"},"nodeType":"YulFunctionCall","src":"9038:19:8"},{"name":"returndata_size","nodeType":"YulIdentifier","src":"9059:15:8"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9031:6:8"},"nodeType":"YulFunctionCall","src":"9031:44:8"},"nodeType":"YulExpressionStatement","src":"9031:44:8"}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1012,"isOffset":false,"isSlot":false,"src":"9003:10:8","valueSize":1},{"declaration":1012,"isOffset":false,"isSlot":false,"src":"9046:10:8","valueSize":1}],"id":1021,"nodeType":"InlineAssembly","src":"8947:142:8"}]}}]},"id":1030,"implemented":true,"kind":"function","modifiers":[],"name":"_revert","nameLocation":"8625:7:8","nodeType":"FunctionDefinition","parameters":{"id":1015,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1012,"mutability":"mutable","name":"returndata","nameLocation":"8646:10:8","nodeType":"VariableDeclaration","scope":1030,"src":"8633:23:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1011,"name":"bytes","nodeType":"ElementaryTypeName","src":"8633:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1014,"mutability":"mutable","name":"errorMessage","nameLocation":"8672:12:8","nodeType":"VariableDeclaration","scope":1030,"src":"8658:26:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1013,"name":"string","nodeType":"ElementaryTypeName","src":"8658:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"8632:53:8"},"returnParameters":{"id":1016,"nodeType":"ParameterList","parameters":[],"src":"8699:0:8"},"scope":1031,"src":"8616:540:8","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":1032,"src":"194:8964:8","usedErrors":[]}],"src":"101:9058:8"},"id":8},"@openzeppelin/contracts/utils/StorageSlot.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","exportedSymbols":{"StorageSlot":[1091]},"id":1092,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1033,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"105:23:9"},{"abstract":false,"baseContracts":[],"canonicalName":"StorageSlot","contractDependencies":[],"contractKind":"library","documentation":{"id":1034,"nodeType":"StructuredDocumentation","src":"130:1148:9","text":" @dev Library for reading and writing primitive types to specific storage slots.\n Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n This library helps with reading and writing to such slots without the need for inline assembly.\n The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n Example usage to set ERC1967 implementation slot:\n ```\n contract ERC1967 {\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n function _setImplementation(address newImplementation) internal {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n }\n ```\n _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._"},"fullyImplemented":true,"id":1091,"linearizedBaseContracts":[1091],"name":"StorageSlot","nameLocation":"1287:11:9","nodeType":"ContractDefinition","nodes":[{"canonicalName":"StorageSlot.AddressSlot","id":1037,"members":[{"constant":false,"id":1036,"mutability":"mutable","name":"value","nameLocation":"1342:5:9","nodeType":"VariableDeclaration","scope":1037,"src":"1334:13:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1035,"name":"address","nodeType":"ElementaryTypeName","src":"1334:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"AddressSlot","nameLocation":"1312:11:9","nodeType":"StructDefinition","scope":1091,"src":"1305:49:9","visibility":"public"},{"canonicalName":"StorageSlot.BooleanSlot","id":1040,"members":[{"constant":false,"id":1039,"mutability":"mutable","name":"value","nameLocation":"1394:5:9","nodeType":"VariableDeclaration","scope":1040,"src":"1389:10:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1038,"name":"bool","nodeType":"ElementaryTypeName","src":"1389:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"name":"BooleanSlot","nameLocation":"1367:11:9","nodeType":"StructDefinition","scope":1091,"src":"1360:46:9","visibility":"public"},{"canonicalName":"StorageSlot.Bytes32Slot","id":1043,"members":[{"constant":false,"id":1042,"mutability":"mutable","name":"value","nameLocation":"1449:5:9","nodeType":"VariableDeclaration","scope":1043,"src":"1441:13:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1041,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1441:7:9","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"name":"Bytes32Slot","nameLocation":"1419:11:9","nodeType":"StructDefinition","scope":1091,"src":"1412:49:9","visibility":"public"},{"canonicalName":"StorageSlot.Uint256Slot","id":1046,"members":[{"constant":false,"id":1045,"mutability":"mutable","name":"value","nameLocation":"1504:5:9","nodeType":"VariableDeclaration","scope":1046,"src":"1496:13:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1044,"name":"uint256","nodeType":"ElementaryTypeName","src":"1496:7:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Uint256Slot","nameLocation":"1474:11:9","nodeType":"StructDefinition","scope":1091,"src":"1467:49:9","visibility":"public"},{"body":{"id":1056,"nodeType":"Block","src":"1698:106:9","statements":[{"AST":{"nodeType":"YulBlock","src":"1760:38:9","statements":[{"nodeType":"YulAssignment","src":"1774:14:9","value":{"name":"slot","nodeType":"YulIdentifier","src":"1784:4:9"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"1774:6:9"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1053,"isOffset":false,"isSlot":true,"src":"1774:6:9","suffix":"slot","valueSize":1},{"declaration":1049,"isOffset":false,"isSlot":false,"src":"1784:4:9","valueSize":1}],"id":1055,"nodeType":"InlineAssembly","src":"1751:47:9"}]},"documentation":{"id":1047,"nodeType":"StructuredDocumentation","src":"1522:87:9","text":" @dev Returns an `AddressSlot` with member `value` located at `slot`."},"id":1057,"implemented":true,"kind":"function","modifiers":[],"name":"getAddressSlot","nameLocation":"1623:14:9","nodeType":"FunctionDefinition","parameters":{"id":1050,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1049,"mutability":"mutable","name":"slot","nameLocation":"1646:4:9","nodeType":"VariableDeclaration","scope":1057,"src":"1638:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1048,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1638:7:9","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1637:14:9"},"returnParameters":{"id":1054,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1053,"mutability":"mutable","name":"r","nameLocation":"1695:1:9","nodeType":"VariableDeclaration","scope":1057,"src":"1675:21:9","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot"},"typeName":{"id":1052,"nodeType":"UserDefinedTypeName","pathNode":{"id":1051,"name":"AddressSlot","nameLocations":["1675:11:9"],"nodeType":"IdentifierPath","referencedDeclaration":1037,"src":"1675:11:9"},"referencedDeclaration":1037,"src":"1675:11:9","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1037_storage_ptr","typeString":"struct StorageSlot.AddressSlot"}},"visibility":"internal"}],"src":"1674:23:9"},"scope":1091,"src":"1614:190:9","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1067,"nodeType":"Block","src":"1986:106:9","statements":[{"AST":{"nodeType":"YulBlock","src":"2048:38:9","statements":[{"nodeType":"YulAssignment","src":"2062:14:9","value":{"name":"slot","nodeType":"YulIdentifier","src":"2072:4:9"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2062:6:9"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1064,"isOffset":false,"isSlot":true,"src":"2062:6:9","suffix":"slot","valueSize":1},{"declaration":1060,"isOffset":false,"isSlot":false,"src":"2072:4:9","valueSize":1}],"id":1066,"nodeType":"InlineAssembly","src":"2039:47:9"}]},"documentation":{"id":1058,"nodeType":"StructuredDocumentation","src":"1810:87:9","text":" @dev Returns an `BooleanSlot` with member `value` located at `slot`."},"id":1068,"implemented":true,"kind":"function","modifiers":[],"name":"getBooleanSlot","nameLocation":"1911:14:9","nodeType":"FunctionDefinition","parameters":{"id":1061,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1060,"mutability":"mutable","name":"slot","nameLocation":"1934:4:9","nodeType":"VariableDeclaration","scope":1068,"src":"1926:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1059,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1926:7:9","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1925:14:9"},"returnParameters":{"id":1065,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1064,"mutability":"mutable","name":"r","nameLocation":"1983:1:9","nodeType":"VariableDeclaration","scope":1068,"src":"1963:21:9","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$1040_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"},"typeName":{"id":1063,"nodeType":"UserDefinedTypeName","pathNode":{"id":1062,"name":"BooleanSlot","nameLocations":["1963:11:9"],"nodeType":"IdentifierPath","referencedDeclaration":1040,"src":"1963:11:9"},"referencedDeclaration":1040,"src":"1963:11:9","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$1040_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"}},"visibility":"internal"}],"src":"1962:23:9"},"scope":1091,"src":"1902:190:9","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1078,"nodeType":"Block","src":"2274:106:9","statements":[{"AST":{"nodeType":"YulBlock","src":"2336:38:9","statements":[{"nodeType":"YulAssignment","src":"2350:14:9","value":{"name":"slot","nodeType":"YulIdentifier","src":"2360:4:9"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2350:6:9"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1075,"isOffset":false,"isSlot":true,"src":"2350:6:9","suffix":"slot","valueSize":1},{"declaration":1071,"isOffset":false,"isSlot":false,"src":"2360:4:9","valueSize":1}],"id":1077,"nodeType":"InlineAssembly","src":"2327:47:9"}]},"documentation":{"id":1069,"nodeType":"StructuredDocumentation","src":"2098:87:9","text":" @dev Returns an `Bytes32Slot` with member `value` located at `slot`."},"id":1079,"implemented":true,"kind":"function","modifiers":[],"name":"getBytes32Slot","nameLocation":"2199:14:9","nodeType":"FunctionDefinition","parameters":{"id":1072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1071,"mutability":"mutable","name":"slot","nameLocation":"2222:4:9","nodeType":"VariableDeclaration","scope":1079,"src":"2214:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1070,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2214:7:9","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2213:14:9"},"returnParameters":{"id":1076,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1075,"mutability":"mutable","name":"r","nameLocation":"2271:1:9","nodeType":"VariableDeclaration","scope":1079,"src":"2251:21:9","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$1043_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"},"typeName":{"id":1074,"nodeType":"UserDefinedTypeName","pathNode":{"id":1073,"name":"Bytes32Slot","nameLocations":["2251:11:9"],"nodeType":"IdentifierPath","referencedDeclaration":1043,"src":"2251:11:9"},"referencedDeclaration":1043,"src":"2251:11:9","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$1043_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"}},"visibility":"internal"}],"src":"2250:23:9"},"scope":1091,"src":"2190:190:9","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1089,"nodeType":"Block","src":"2562:106:9","statements":[{"AST":{"nodeType":"YulBlock","src":"2624:38:9","statements":[{"nodeType":"YulAssignment","src":"2638:14:9","value":{"name":"slot","nodeType":"YulIdentifier","src":"2648:4:9"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2638:6:9"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1086,"isOffset":false,"isSlot":true,"src":"2638:6:9","suffix":"slot","valueSize":1},{"declaration":1082,"isOffset":false,"isSlot":false,"src":"2648:4:9","valueSize":1}],"id":1088,"nodeType":"InlineAssembly","src":"2615:47:9"}]},"documentation":{"id":1080,"nodeType":"StructuredDocumentation","src":"2386:87:9","text":" @dev Returns an `Uint256Slot` with member `value` located at `slot`."},"id":1090,"implemented":true,"kind":"function","modifiers":[],"name":"getUint256Slot","nameLocation":"2487:14:9","nodeType":"FunctionDefinition","parameters":{"id":1083,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1082,"mutability":"mutable","name":"slot","nameLocation":"2510:4:9","nodeType":"VariableDeclaration","scope":1090,"src":"2502:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1081,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2502:7:9","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2501:14:9"},"returnParameters":{"id":1087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1086,"mutability":"mutable","name":"r","nameLocation":"2559:1:9","nodeType":"VariableDeclaration","scope":1090,"src":"2539:21:9","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1046_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"},"typeName":{"id":1085,"nodeType":"UserDefinedTypeName","pathNode":{"id":1084,"name":"Uint256Slot","nameLocations":["2539:11:9"],"nodeType":"IdentifierPath","referencedDeclaration":1046,"src":"2539:11:9"},"referencedDeclaration":1046,"src":"2539:11:9","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1046_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"}},"visibility":"internal"}],"src":"2538:23:9"},"scope":1091,"src":"2478:190:9","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1092,"src":"1279:1391:9","usedErrors":[]}],"src":"105:2566:9"},"id":9},"@openzeppelin/contracts/utils/Strings.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","exportedSymbols":{"Math":[2504],"Strings":[1266]},"id":1267,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1093,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"101:23:10"},{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","file":"./math/Math.sol","id":1094,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1267,"sourceUnit":2505,"src":"126:25:10","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Strings","contractDependencies":[],"contractKind":"library","documentation":{"id":1095,"nodeType":"StructuredDocumentation","src":"153:34:10","text":" @dev String operations."},"fullyImplemented":true,"id":1266,"linearizedBaseContracts":[1266],"name":"Strings","nameLocation":"196:7:10","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":1098,"mutability":"constant","name":"_SYMBOLS","nameLocation":"235:8:10","nodeType":"VariableDeclaration","scope":1266,"src":"210:54:10","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"},"typeName":{"id":1096,"name":"bytes16","nodeType":"ElementaryTypeName","src":"210:7:10","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"value":{"hexValue":"30313233343536373839616263646566","id":1097,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"246:18:10","typeDescriptions":{"typeIdentifier":"t_stringliteral_cb29997ed99ead0db59ce4d12b7d3723198c827273e5796737c926d78019c39f","typeString":"literal_string \"0123456789abcdef\""},"value":"0123456789abcdef"},"visibility":"private"},{"constant":true,"id":1101,"mutability":"constant","name":"_ADDRESS_LENGTH","nameLocation":"293:15:10","nodeType":"VariableDeclaration","scope":1266,"src":"270:43:10","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1099,"name":"uint8","nodeType":"ElementaryTypeName","src":"270:5:10","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"hexValue":"3230","id":1100,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"311:2:10","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"visibility":"private"},{"body":{"id":1148,"nodeType":"Block","src":"486:625:10","statements":[{"id":1147,"nodeType":"UncheckedBlock","src":"496:609:10","statements":[{"assignments":[1110],"declarations":[{"constant":false,"id":1110,"mutability":"mutable","name":"length","nameLocation":"528:6:10","nodeType":"VariableDeclaration","scope":1147,"src":"520:14:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1109,"name":"uint256","nodeType":"ElementaryTypeName","src":"520:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1117,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1113,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1104,"src":"548:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1111,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2504,"src":"537:4:10","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$2504_$","typeString":"type(library Math)"}},"id":1112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"542:5:10","memberName":"log10","nodeType":"MemberAccess","referencedDeclaration":2341,"src":"537:10:10","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":1114,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"537:17:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"557:1:10","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"537:21:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"520:38:10"},{"assignments":[1119],"declarations":[{"constant":false,"id":1119,"mutability":"mutable","name":"buffer","nameLocation":"586:6:10","nodeType":"VariableDeclaration","scope":1147,"src":"572:20:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1118,"name":"string","nodeType":"ElementaryTypeName","src":"572:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":1124,"initialValue":{"arguments":[{"id":1122,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1110,"src":"606:6:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1121,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"595:10:10","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"},"typeName":{"id":1120,"name":"string","nodeType":"ElementaryTypeName","src":"599:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"id":1123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"595:18:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"nodeType":"VariableDeclarationStatement","src":"572:41:10"},{"assignments":[1126],"declarations":[{"constant":false,"id":1126,"mutability":"mutable","name":"ptr","nameLocation":"635:3:10","nodeType":"VariableDeclaration","scope":1147,"src":"627:11:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1125,"name":"uint256","nodeType":"ElementaryTypeName","src":"627:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1127,"nodeType":"VariableDeclarationStatement","src":"627:11:10"},{"AST":{"nodeType":"YulBlock","src":"708:67:10","statements":[{"nodeType":"YulAssignment","src":"726:35:10","value":{"arguments":[{"name":"buffer","nodeType":"YulIdentifier","src":"737:6:10"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"749:2:10","type":"","value":"32"},{"name":"length","nodeType":"YulIdentifier","src":"753:6:10"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"745:3:10"},"nodeType":"YulFunctionCall","src":"745:15:10"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"733:3:10"},"nodeType":"YulFunctionCall","src":"733:28:10"},"variableNames":[{"name":"ptr","nodeType":"YulIdentifier","src":"726:3:10"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1119,"isOffset":false,"isSlot":false,"src":"737:6:10","valueSize":1},{"declaration":1110,"isOffset":false,"isSlot":false,"src":"753:6:10","valueSize":1},{"declaration":1126,"isOffset":false,"isSlot":false,"src":"726:3:10","valueSize":1}],"id":1128,"nodeType":"InlineAssembly","src":"699:76:10"},{"body":{"id":1143,"nodeType":"Block","src":"801:267:10","statements":[{"expression":{"id":1131,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"819:5:10","subExpression":{"id":1130,"name":"ptr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1126,"src":"819:3:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1132,"nodeType":"ExpressionStatement","src":"819:5:10"},{"AST":{"nodeType":"YulBlock","src":"902:84:10","statements":[{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"932:3:10"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"946:5:10"},{"kind":"number","nodeType":"YulLiteral","src":"953:2:10","type":"","value":"10"}],"functionName":{"name":"mod","nodeType":"YulIdentifier","src":"942:3:10"},"nodeType":"YulFunctionCall","src":"942:14:10"},{"name":"_SYMBOLS","nodeType":"YulIdentifier","src":"958:8:10"}],"functionName":{"name":"byte","nodeType":"YulIdentifier","src":"937:4:10"},"nodeType":"YulFunctionCall","src":"937:30:10"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"924:7:10"},"nodeType":"YulFunctionCall","src":"924:44:10"},"nodeType":"YulExpressionStatement","src":"924:44:10"}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1098,"isOffset":false,"isSlot":false,"src":"958:8:10","valueSize":1},{"declaration":1126,"isOffset":false,"isSlot":false,"src":"932:3:10","valueSize":1},{"declaration":1104,"isOffset":false,"isSlot":false,"src":"946:5:10","valueSize":1}],"id":1133,"nodeType":"InlineAssembly","src":"893:93:10"},{"expression":{"id":1136,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1134,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1104,"src":"1003:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"hexValue":"3130","id":1135,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1012:2:10","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"src":"1003:11:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1137,"nodeType":"ExpressionStatement","src":"1003:11:10"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1138,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1104,"src":"1036:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1139,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1045:1:10","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1036:10:10","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1142,"nodeType":"IfStatement","src":"1032:21:10","trueBody":{"id":1141,"nodeType":"Break","src":"1048:5:10"}}]},"condition":{"hexValue":"74727565","id":1129,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"795:4:10","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"id":1144,"nodeType":"WhileStatement","src":"788:280:10"},{"expression":{"id":1145,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1119,"src":"1088:6:10","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1108,"id":1146,"nodeType":"Return","src":"1081:13:10"}]}]},"documentation":{"id":1102,"nodeType":"StructuredDocumentation","src":"320:90:10","text":" @dev Converts a `uint256` to its ASCII `string` decimal representation."},"id":1149,"implemented":true,"kind":"function","modifiers":[],"name":"toString","nameLocation":"424:8:10","nodeType":"FunctionDefinition","parameters":{"id":1105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1104,"mutability":"mutable","name":"value","nameLocation":"441:5:10","nodeType":"VariableDeclaration","scope":1149,"src":"433:13:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1103,"name":"uint256","nodeType":"ElementaryTypeName","src":"433:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"432:15:10"},"returnParameters":{"id":1108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1107,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1149,"src":"471:13:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1106,"name":"string","nodeType":"ElementaryTypeName","src":"471:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"470:15:10"},"scope":1266,"src":"415:696:10","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1168,"nodeType":"Block","src":"1290:100:10","statements":[{"id":1167,"nodeType":"UncheckedBlock","src":"1300:84:10","statements":[{"expression":{"arguments":[{"id":1158,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1152,"src":"1343:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1161,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1152,"src":"1362:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1159,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2504,"src":"1350:4:10","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$2504_$","typeString":"type(library Math)"}},"id":1160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1355:6:10","memberName":"log256","nodeType":"MemberAccess","referencedDeclaration":2464,"src":"1350:11:10","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":1162,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1350:18:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1163,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1371:1:10","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1350:22:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1157,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[1169,1245,1265],"referencedDeclaration":1245,"src":"1331:11:10","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":1165,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1331:42:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1156,"id":1166,"nodeType":"Return","src":"1324:49:10"}]}]},"documentation":{"id":1150,"nodeType":"StructuredDocumentation","src":"1117:94:10","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation."},"id":1169,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"1225:11:10","nodeType":"FunctionDefinition","parameters":{"id":1153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1152,"mutability":"mutable","name":"value","nameLocation":"1245:5:10","nodeType":"VariableDeclaration","scope":1169,"src":"1237:13:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1151,"name":"uint256","nodeType":"ElementaryTypeName","src":"1237:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1236:15:10"},"returnParameters":{"id":1156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1155,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1169,"src":"1275:13:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1154,"name":"string","nodeType":"ElementaryTypeName","src":"1275:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1274:15:10"},"scope":1266,"src":"1216:174:10","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1244,"nodeType":"Block","src":"1603:347:10","statements":[{"assignments":[1180],"declarations":[{"constant":false,"id":1180,"mutability":"mutable","name":"buffer","nameLocation":"1626:6:10","nodeType":"VariableDeclaration","scope":1244,"src":"1613:19:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1179,"name":"bytes","nodeType":"ElementaryTypeName","src":"1613:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1189,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1185,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1645:1:10","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1184,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1174,"src":"1649:6:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1645:10:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32","id":1186,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1658:1:10","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"1645:14:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1635:9:10","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":1181,"name":"bytes","nodeType":"ElementaryTypeName","src":"1639:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":1188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1635:25:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1613:47:10"},{"expression":{"id":1194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1190,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"1670:6:10","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1192,"indexExpression":{"hexValue":"30","id":1191,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1677:1:10","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1670:9:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":1193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1682:3:10","typeDescriptions":{"typeIdentifier":"t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d","typeString":"literal_string \"0\""},"value":"0"},"src":"1670:15:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1195,"nodeType":"ExpressionStatement","src":"1670:15:10"},{"expression":{"id":1200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1196,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"1695:6:10","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1198,"indexExpression":{"hexValue":"31","id":1197,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1702:1:10","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1695:9:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"78","id":1199,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1707:3:10","typeDescriptions":{"typeIdentifier":"t_stringliteral_7521d1cadbcfa91eec65aa16715b94ffc1c9654ba57ea2ef1a2127bca1127a83","typeString":"literal_string \"x\""},"value":"x"},"src":"1695:15:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1201,"nodeType":"ExpressionStatement","src":"1695:15:10"},{"body":{"id":1230,"nodeType":"Block","src":"1765:83:10","statements":[{"expression":{"id":1224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1216,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"1779:6:10","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1218,"indexExpression":{"id":1217,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1203,"src":"1786:1:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1779:9:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1219,"name":"_SYMBOLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1098,"src":"1791:8:10","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"id":1223,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1220,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1172,"src":"1800:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"307866","id":1221,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1808:3:10","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"0xf"},"src":"1800:11:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1791:21:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"1779:33:10","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1225,"nodeType":"ExpressionStatement","src":"1779:33:10"},{"expression":{"id":1228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1226,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1172,"src":"1826:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":1227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1836:1:10","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"1826:11:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1229,"nodeType":"ExpressionStatement","src":"1826:11:10"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1210,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1203,"src":"1753:1:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"31","id":1211,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1757:1:10","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1753:5:10","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1231,"initializationExpression":{"assignments":[1203],"declarations":[{"constant":false,"id":1203,"mutability":"mutable","name":"i","nameLocation":"1733:1:10","nodeType":"VariableDeclaration","scope":1231,"src":"1725:9:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1202,"name":"uint256","nodeType":"ElementaryTypeName","src":"1725:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1209,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1737:1:10","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1205,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1174,"src":"1741:6:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1737:10:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1207,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1750:1:10","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1737:14:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1725:26:10"},"loopExpression":{"expression":{"id":1214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"1760:3:10","subExpression":{"id":1213,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1203,"src":"1762:1:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1215,"nodeType":"ExpressionStatement","src":"1760:3:10"},"nodeType":"ForStatement","src":"1720:128:10"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1233,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1172,"src":"1865:5:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1234,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1874:1:10","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1865:10:10","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"537472696e67733a20686578206c656e67746820696e73756666696369656e74","id":1236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1877:34:10","typeDescriptions":{"typeIdentifier":"t_stringliteral_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2","typeString":"literal_string \"Strings: hex length insufficient\""},"value":"Strings: hex length insufficient"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2","typeString":"literal_string \"Strings: hex length insufficient\""}],"id":1232,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1857:7:10","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1237,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1857:55:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1238,"nodeType":"ExpressionStatement","src":"1857:55:10"},{"expression":{"arguments":[{"id":1241,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"1936:6:10","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1240,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1929:6:10","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1239,"name":"string","nodeType":"ElementaryTypeName","src":"1929:6:10","typeDescriptions":{}}},"id":1242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1929:14:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1178,"id":1243,"nodeType":"Return","src":"1922:21:10"}]},"documentation":{"id":1170,"nodeType":"StructuredDocumentation","src":"1396:112:10","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length."},"id":1245,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"1522:11:10","nodeType":"FunctionDefinition","parameters":{"id":1175,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1172,"mutability":"mutable","name":"value","nameLocation":"1542:5:10","nodeType":"VariableDeclaration","scope":1245,"src":"1534:13:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1171,"name":"uint256","nodeType":"ElementaryTypeName","src":"1534:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1174,"mutability":"mutable","name":"length","nameLocation":"1557:6:10","nodeType":"VariableDeclaration","scope":1245,"src":"1549:14:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1173,"name":"uint256","nodeType":"ElementaryTypeName","src":"1549:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1533:31:10"},"returnParameters":{"id":1178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1177,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1245,"src":"1588:13:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1176,"name":"string","nodeType":"ElementaryTypeName","src":"1588:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1587:15:10"},"scope":1266,"src":"1513:437:10","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1264,"nodeType":"Block","src":"2175:76:10","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":1258,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1248,"src":"2220:4:10","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1257,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2212:7:10","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":1256,"name":"uint160","nodeType":"ElementaryTypeName","src":"2212:7:10","typeDescriptions":{}}},"id":1259,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2212:13:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":1255,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2204:7:10","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":1254,"name":"uint256","nodeType":"ElementaryTypeName","src":"2204:7:10","typeDescriptions":{}}},"id":1260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2204:22:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1261,"name":"_ADDRESS_LENGTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1101,"src":"2228:15:10","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":1253,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[1169,1245,1265],"referencedDeclaration":1245,"src":"2192:11:10","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":1262,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2192:52:10","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1252,"id":1263,"nodeType":"Return","src":"2185:59:10"}]},"documentation":{"id":1246,"nodeType":"StructuredDocumentation","src":"1956:141:10","text":" @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation."},"id":1265,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"2111:11:10","nodeType":"FunctionDefinition","parameters":{"id":1249,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1248,"mutability":"mutable","name":"addr","nameLocation":"2131:4:10","nodeType":"VariableDeclaration","scope":1265,"src":"2123:12:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1247,"name":"address","nodeType":"ElementaryTypeName","src":"2123:7:10","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2122:14:10"},"returnParameters":{"id":1252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1251,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1265,"src":"2160:13:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1250,"name":"string","nodeType":"ElementaryTypeName","src":"2160:6:10","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2159:15:10"},"scope":1266,"src":"2102:149:10","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1267,"src":"188:2065:10","usedErrors":[]}],"src":"101:2153:10"},"id":10},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","exportedSymbols":{"ECDSA":[1627],"Math":[2504],"Strings":[1266]},"id":1628,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1268,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"112:23:11"},{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","file":"../Strings.sol","id":1269,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1628,"sourceUnit":1267,"src":"137:24:11","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ECDSA","contractDependencies":[],"contractKind":"library","documentation":{"id":1270,"nodeType":"StructuredDocumentation","src":"163:205:11","text":" @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."},"fullyImplemented":true,"id":1627,"linearizedBaseContracts":[1627],"name":"ECDSA","nameLocation":"377:5:11","nodeType":"ContractDefinition","nodes":[{"canonicalName":"ECDSA.RecoverError","id":1276,"members":[{"id":1271,"name":"NoError","nameLocation":"417:7:11","nodeType":"EnumValue","src":"417:7:11"},{"id":1272,"name":"InvalidSignature","nameLocation":"434:16:11","nodeType":"EnumValue","src":"434:16:11"},{"id":1273,"name":"InvalidSignatureLength","nameLocation":"460:22:11","nodeType":"EnumValue","src":"460:22:11"},{"id":1274,"name":"InvalidSignatureS","nameLocation":"492:17:11","nodeType":"EnumValue","src":"492:17:11"},{"id":1275,"name":"InvalidSignatureV","nameLocation":"519:17:11","nodeType":"EnumValue","src":"519:17:11"}],"name":"RecoverError","nameLocation":"394:12:11","nodeType":"EnumDefinition","src":"389:175:11"},{"body":{"id":1319,"nodeType":"Block","src":"624:457:11","statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"id":1285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1282,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1279,"src":"638:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":1283,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"647:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1284,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"660:7:11","memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":1271,"src":"647:20:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"src":"638:29:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"id":1291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1288,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1279,"src":"734:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":1289,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"743:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1290,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"756:16:11","memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":1272,"src":"743:29:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"src":"734:38:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"id":1300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1297,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1279,"src":"843:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":1298,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"852:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1299,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"865:22:11","memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":1273,"src":"852:35:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"src":"843:44:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"id":1309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1306,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1279,"src":"965:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":1307,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"974:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1308,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"987:17:11","memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":1274,"src":"974:30:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"src":"965:39:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1315,"nodeType":"IfStatement","src":"961:114:11","trueBody":{"id":1314,"nodeType":"Block","src":"1006:69:11","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c7565","id":1311,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1027:36:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd","typeString":"literal_string \"ECDSA: invalid signature 's' value\""},"value":"ECDSA: invalid signature 's' value"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd","typeString":"literal_string \"ECDSA: invalid signature 's' value\""}],"id":1310,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"1020:6:11","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1312,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1020:44:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1313,"nodeType":"ExpressionStatement","src":"1020:44:11"}]}},"id":1316,"nodeType":"IfStatement","src":"839:236:11","trueBody":{"id":1305,"nodeType":"Block","src":"889:66:11","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","id":1302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"910:33:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77","typeString":"literal_string \"ECDSA: invalid signature length\""},"value":"ECDSA: invalid signature length"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77","typeString":"literal_string \"ECDSA: invalid signature length\""}],"id":1301,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"903:6:11","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1303,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"903:41:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1304,"nodeType":"ExpressionStatement","src":"903:41:11"}]}},"id":1317,"nodeType":"IfStatement","src":"730:345:11","trueBody":{"id":1296,"nodeType":"Block","src":"774:59:11","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","id":1293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"795:26:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be","typeString":"literal_string \"ECDSA: invalid signature\""},"value":"ECDSA: invalid signature"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be","typeString":"literal_string \"ECDSA: invalid signature\""}],"id":1292,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"788:6:11","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1294,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"788:34:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1295,"nodeType":"ExpressionStatement","src":"788:34:11"}]}},"id":1318,"nodeType":"IfStatement","src":"634:441:11","trueBody":{"id":1287,"nodeType":"Block","src":"669:55:11","statements":[{"functionReturnParameters":1281,"id":1286,"nodeType":"Return","src":"683:7:11"}]}}]},"id":1320,"implemented":true,"kind":"function","modifiers":[],"name":"_throwError","nameLocation":"579:11:11","nodeType":"FunctionDefinition","parameters":{"id":1280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1279,"mutability":"mutable","name":"error","nameLocation":"604:5:11","nodeType":"VariableDeclaration","scope":1320,"src":"591:18:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1278,"nodeType":"UserDefinedTypeName","pathNode":{"id":1277,"name":"RecoverError","nameLocations":["591:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"591:12:11"},"referencedDeclaration":1276,"src":"591:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"590:20:11"},"returnParameters":{"id":1281,"nodeType":"ParameterList","parameters":[],"src":"624:0:11"},"scope":1627,"src":"570:511:11","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":1365,"nodeType":"Block","src":"2249:626:11","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1336,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1333,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1325,"src":"2263:9:11","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2273:6:11","memberName":"length","nodeType":"MemberAccess","src":"2263:16:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3635","id":1335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2283:2:11","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"},"src":"2263:22:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1363,"nodeType":"Block","src":"2788:81:11","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":1357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2818:1:11","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1356,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2810:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1355,"name":"address","nodeType":"ElementaryTypeName","src":"2810:7:11","typeDescriptions":{}}},"id":1358,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2810:10:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1359,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"2822:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1360,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2835:22:11","memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":1273,"src":"2822:35:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"id":1361,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2809:49:11","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1332,"id":1362,"nodeType":"Return","src":"2802:56:11"}]},"id":1364,"nodeType":"IfStatement","src":"2259:610:11","trueBody":{"id":1354,"nodeType":"Block","src":"2287:495:11","statements":[{"assignments":[1338],"declarations":[{"constant":false,"id":1338,"mutability":"mutable","name":"r","nameLocation":"2309:1:11","nodeType":"VariableDeclaration","scope":1354,"src":"2301:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1337,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2301:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1339,"nodeType":"VariableDeclarationStatement","src":"2301:9:11"},{"assignments":[1341],"declarations":[{"constant":false,"id":1341,"mutability":"mutable","name":"s","nameLocation":"2332:1:11","nodeType":"VariableDeclaration","scope":1354,"src":"2324:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1340,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2324:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1342,"nodeType":"VariableDeclarationStatement","src":"2324:9:11"},{"assignments":[1344],"declarations":[{"constant":false,"id":1344,"mutability":"mutable","name":"v","nameLocation":"2353:1:11","nodeType":"VariableDeclaration","scope":1354,"src":"2347:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1343,"name":"uint8","nodeType":"ElementaryTypeName","src":"2347:5:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":1345,"nodeType":"VariableDeclarationStatement","src":"2347:7:11"},{"AST":{"nodeType":"YulBlock","src":"2555:171:11","statements":[{"nodeType":"YulAssignment","src":"2573:32:11","value":{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2588:9:11"},{"kind":"number","nodeType":"YulLiteral","src":"2599:4:11","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2584:3:11"},"nodeType":"YulFunctionCall","src":"2584:20:11"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2578:5:11"},"nodeType":"YulFunctionCall","src":"2578:27:11"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"2573:1:11"}]},{"nodeType":"YulAssignment","src":"2622:32:11","value":{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2637:9:11"},{"kind":"number","nodeType":"YulLiteral","src":"2648:4:11","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2633:3:11"},"nodeType":"YulFunctionCall","src":"2633:20:11"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2627:5:11"},"nodeType":"YulFunctionCall","src":"2627:27:11"},"variableNames":[{"name":"s","nodeType":"YulIdentifier","src":"2622:1:11"}]},{"nodeType":"YulAssignment","src":"2671:41:11","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2681:1:11","type":"","value":"0"},{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2694:9:11"},{"kind":"number","nodeType":"YulLiteral","src":"2705:4:11","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2690:3:11"},"nodeType":"YulFunctionCall","src":"2690:20:11"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2684:5:11"},"nodeType":"YulFunctionCall","src":"2684:27:11"}],"functionName":{"name":"byte","nodeType":"YulIdentifier","src":"2676:4:11"},"nodeType":"YulFunctionCall","src":"2676:36:11"},"variableNames":[{"name":"v","nodeType":"YulIdentifier","src":"2671:1:11"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":1338,"isOffset":false,"isSlot":false,"src":"2573:1:11","valueSize":1},{"declaration":1341,"isOffset":false,"isSlot":false,"src":"2622:1:11","valueSize":1},{"declaration":1325,"isOffset":false,"isSlot":false,"src":"2588:9:11","valueSize":1},{"declaration":1325,"isOffset":false,"isSlot":false,"src":"2637:9:11","valueSize":1},{"declaration":1325,"isOffset":false,"isSlot":false,"src":"2694:9:11","valueSize":1},{"declaration":1344,"isOffset":false,"isSlot":false,"src":"2671:1:11","valueSize":1}],"id":1346,"nodeType":"InlineAssembly","src":"2546:180:11"},{"expression":{"arguments":[{"id":1348,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1323,"src":"2757:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1349,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1344,"src":"2763:1:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":1350,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1338,"src":"2766:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1351,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1341,"src":"2769:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1347,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[1366,1440,1534],"referencedDeclaration":1534,"src":"2746:10:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":1352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2746:25:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1332,"id":1353,"nodeType":"Return","src":"2739:32:11"}]}}]},"documentation":{"id":1321,"nodeType":"StructuredDocumentation","src":"1087:1053:11","text":" @dev Returns the address that signed a hashed message (`hash`) with\n `signature` or error string. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n _Available since v4.3._"},"id":1366,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"2154:10:11","nodeType":"FunctionDefinition","parameters":{"id":1326,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1323,"mutability":"mutable","name":"hash","nameLocation":"2173:4:11","nodeType":"VariableDeclaration","scope":1366,"src":"2165:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1322,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2165:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1325,"mutability":"mutable","name":"signature","nameLocation":"2192:9:11","nodeType":"VariableDeclaration","scope":1366,"src":"2179:22:11","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1324,"name":"bytes","nodeType":"ElementaryTypeName","src":"2179:5:11","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2164:38:11"},"returnParameters":{"id":1332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1328,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1366,"src":"2226:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1327,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1331,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1366,"src":"2235:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1330,"nodeType":"UserDefinedTypeName","pathNode":{"id":1329,"name":"RecoverError","nameLocations":["2235:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"2235:12:11"},"referencedDeclaration":1276,"src":"2235:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"2225:23:11"},"scope":1627,"src":"2145:730:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1392,"nodeType":"Block","src":"3748:140:11","statements":[{"assignments":[1377,1380],"declarations":[{"constant":false,"id":1377,"mutability":"mutable","name":"recovered","nameLocation":"3767:9:11","nodeType":"VariableDeclaration","scope":1392,"src":"3759:17:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1376,"name":"address","nodeType":"ElementaryTypeName","src":"3759:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1380,"mutability":"mutable","name":"error","nameLocation":"3791:5:11","nodeType":"VariableDeclaration","scope":1392,"src":"3778:18:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1379,"nodeType":"UserDefinedTypeName","pathNode":{"id":1378,"name":"RecoverError","nameLocations":["3778:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"3778:12:11"},"referencedDeclaration":1276,"src":"3778:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":1385,"initialValue":{"arguments":[{"id":1382,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1369,"src":"3811:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1383,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1371,"src":"3817:9:11","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1381,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[1366,1440,1534],"referencedDeclaration":1366,"src":"3800:10:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError)"}},"id":1384,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3800:27:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"3758:69:11"},{"expression":{"arguments":[{"id":1387,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1380,"src":"3849:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}],"id":1386,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1320,"src":"3837:11:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$1276_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":1388,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3837:18:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1389,"nodeType":"ExpressionStatement","src":"3837:18:11"},{"expression":{"id":1390,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1377,"src":"3872:9:11","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":1375,"id":1391,"nodeType":"Return","src":"3865:16:11"}]},"documentation":{"id":1367,"nodeType":"StructuredDocumentation","src":"2881:775:11","text":" @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it."},"id":1393,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"3670:7:11","nodeType":"FunctionDefinition","parameters":{"id":1372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1369,"mutability":"mutable","name":"hash","nameLocation":"3686:4:11","nodeType":"VariableDeclaration","scope":1393,"src":"3678:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1368,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3678:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1371,"mutability":"mutable","name":"signature","nameLocation":"3705:9:11","nodeType":"VariableDeclaration","scope":1393,"src":"3692:22:11","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1370,"name":"bytes","nodeType":"ElementaryTypeName","src":"3692:5:11","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3677:38:11"},"returnParameters":{"id":1375,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1374,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1393,"src":"3739:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1373,"name":"address","nodeType":"ElementaryTypeName","src":"3739:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3738:9:11"},"scope":1627,"src":"3661:227:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1439,"nodeType":"Block","src":"4275:203:11","statements":[{"assignments":[1409],"declarations":[{"constant":false,"id":1409,"mutability":"mutable","name":"s","nameLocation":"4293:1:11","nodeType":"VariableDeclaration","scope":1439,"src":"4285:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1408,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4285:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1416,"initialValue":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":1415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1410,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1400,"src":"4297:2:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"arguments":[{"hexValue":"307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666","id":1413,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4310:66:11","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"},"value":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"}],"id":1412,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4302:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":1411,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4302:7:11","typeDescriptions":{}}},"id":1414,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4302:75:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4297:80:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4285:92:11"},{"assignments":[1418],"declarations":[{"constant":false,"id":1418,"mutability":"mutable","name":"v","nameLocation":"4393:1:11","nodeType":"VariableDeclaration","scope":1439,"src":"4387:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1417,"name":"uint8","nodeType":"ElementaryTypeName","src":"4387:5:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":1431,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1423,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1400,"src":"4412:2:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1422,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4404:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":1421,"name":"uint256","nodeType":"ElementaryTypeName","src":"4404:7:11","typeDescriptions":{}}},"id":1424,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4404:11:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"323535","id":1425,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4419:3:11","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"4404:18:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1427,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4403:20:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3237","id":1428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4426:2:11","typeDescriptions":{"typeIdentifier":"t_rational_27_by_1","typeString":"int_const 27"},"value":"27"},"src":"4403:25:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1420,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4397:5:11","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":1419,"name":"uint8","nodeType":"ElementaryTypeName","src":"4397:5:11","typeDescriptions":{}}},"id":1430,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4397:32:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"4387:42:11"},{"expression":{"arguments":[{"id":1433,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1396,"src":"4457:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1434,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1418,"src":"4463:1:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":1435,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1398,"src":"4466:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1436,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1409,"src":"4469:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1432,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[1366,1440,1534],"referencedDeclaration":1534,"src":"4446:10:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":1437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4446:25:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1407,"id":1438,"nodeType":"Return","src":"4439:32:11"}]},"documentation":{"id":1394,"nodeType":"StructuredDocumentation","src":"3894:243:11","text":" @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n _Available since v4.3._"},"id":1440,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"4151:10:11","nodeType":"FunctionDefinition","parameters":{"id":1401,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1396,"mutability":"mutable","name":"hash","nameLocation":"4179:4:11","nodeType":"VariableDeclaration","scope":1440,"src":"4171:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1395,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4171:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1398,"mutability":"mutable","name":"r","nameLocation":"4201:1:11","nodeType":"VariableDeclaration","scope":1440,"src":"4193:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1397,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4193:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1400,"mutability":"mutable","name":"vs","nameLocation":"4220:2:11","nodeType":"VariableDeclaration","scope":1440,"src":"4212:10:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1399,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4212:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4161:67:11"},"returnParameters":{"id":1407,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1403,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1440,"src":"4252:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1402,"name":"address","nodeType":"ElementaryTypeName","src":"4252:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1406,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1440,"src":"4261:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1405,"nodeType":"UserDefinedTypeName","pathNode":{"id":1404,"name":"RecoverError","nameLocations":["4261:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"4261:12:11"},"referencedDeclaration":1276,"src":"4261:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"4251:23:11"},"scope":1627,"src":"4142:336:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1469,"nodeType":"Block","src":"4759:136:11","statements":[{"assignments":[1453,1456],"declarations":[{"constant":false,"id":1453,"mutability":"mutable","name":"recovered","nameLocation":"4778:9:11","nodeType":"VariableDeclaration","scope":1469,"src":"4770:17:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1452,"name":"address","nodeType":"ElementaryTypeName","src":"4770:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1456,"mutability":"mutable","name":"error","nameLocation":"4802:5:11","nodeType":"VariableDeclaration","scope":1469,"src":"4789:18:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1455,"nodeType":"UserDefinedTypeName","pathNode":{"id":1454,"name":"RecoverError","nameLocations":["4789:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"4789:12:11"},"referencedDeclaration":1276,"src":"4789:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":1462,"initialValue":{"arguments":[{"id":1458,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1443,"src":"4822:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1459,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1445,"src":"4828:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1460,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1447,"src":"4831:2:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1457,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[1366,1440,1534],"referencedDeclaration":1440,"src":"4811:10:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":1461,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4811:23:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"4769:65:11"},{"expression":{"arguments":[{"id":1464,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1456,"src":"4856:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}],"id":1463,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1320,"src":"4844:11:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$1276_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":1465,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4844:18:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1466,"nodeType":"ExpressionStatement","src":"4844:18:11"},{"expression":{"id":1467,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1453,"src":"4879:9:11","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":1451,"id":1468,"nodeType":"Return","src":"4872:16:11"}]},"documentation":{"id":1441,"nodeType":"StructuredDocumentation","src":"4484:154:11","text":" @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n _Available since v4.2._"},"id":1470,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"4652:7:11","nodeType":"FunctionDefinition","parameters":{"id":1448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1443,"mutability":"mutable","name":"hash","nameLocation":"4677:4:11","nodeType":"VariableDeclaration","scope":1470,"src":"4669:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1442,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4669:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1445,"mutability":"mutable","name":"r","nameLocation":"4699:1:11","nodeType":"VariableDeclaration","scope":1470,"src":"4691:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1444,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4691:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1447,"mutability":"mutable","name":"vs","nameLocation":"4718:2:11","nodeType":"VariableDeclaration","scope":1470,"src":"4710:10:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1446,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4710:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4659:67:11"},"returnParameters":{"id":1451,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1450,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1470,"src":"4750:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1449,"name":"address","nodeType":"ElementaryTypeName","src":"4750:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4749:9:11"},"scope":1627,"src":"4643:252:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1533,"nodeType":"Block","src":"5218:1345:11","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1492,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1489,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1479,"src":"6114:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1488,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6106:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":1487,"name":"uint256","nodeType":"ElementaryTypeName","src":"6106:7:11","typeDescriptions":{}}},"id":1490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6106:10:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130","id":1491,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6119:66:11","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1","typeString":"int_const 5789...(69 digits omitted)...7168"},"value":"0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"},"src":"6106:79:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1502,"nodeType":"IfStatement","src":"6102:161:11","trueBody":{"id":1501,"nodeType":"Block","src":"6187:76:11","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":1495,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6217:1:11","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1494,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6209:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1493,"name":"address","nodeType":"ElementaryTypeName","src":"6209:7:11","typeDescriptions":{}}},"id":1496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6209:10:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1497,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"6221:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1498,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6234:17:11","memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":1274,"src":"6221:30:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"id":1499,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6208:44:11","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1486,"id":1500,"nodeType":"Return","src":"6201:51:11"}]}},{"assignments":[1504],"declarations":[{"constant":false,"id":1504,"mutability":"mutable","name":"signer","nameLocation":"6365:6:11","nodeType":"VariableDeclaration","scope":1533,"src":"6357:14:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1503,"name":"address","nodeType":"ElementaryTypeName","src":"6357:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1511,"initialValue":{"arguments":[{"id":1506,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1473,"src":"6384:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1507,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1475,"src":"6390:1:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":1508,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1477,"src":"6393:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1509,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1479,"src":"6396:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1505,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"6374:9:11","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":1510,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6374:24:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6357:41:11"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1517,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1512,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"6412:6:11","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1515,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6430:1:11","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1514,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6422:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1513,"name":"address","nodeType":"ElementaryTypeName","src":"6422:7:11","typeDescriptions":{}}},"id":1516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6422:10:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6412:20:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1527,"nodeType":"IfStatement","src":"6408:101:11","trueBody":{"id":1526,"nodeType":"Block","src":"6434:75:11","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":1520,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6464:1:11","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1519,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6456:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1518,"name":"address","nodeType":"ElementaryTypeName","src":"6456:7:11","typeDescriptions":{}}},"id":1521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6456:10:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1522,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"6468:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1523,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6481:16:11","memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":1272,"src":"6468:29:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"id":1524,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6455:43:11","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1486,"id":1525,"nodeType":"Return","src":"6448:50:11"}]}},{"expression":{"components":[{"id":1528,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"6527:6:11","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1529,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1276,"src":"6535:12:11","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$1276_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":1530,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6548:7:11","memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":1271,"src":"6535:20:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"id":1531,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6526:30:11","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":1486,"id":1532,"nodeType":"Return","src":"6519:37:11"}]},"documentation":{"id":1471,"nodeType":"StructuredDocumentation","src":"4901:163:11","text":" @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately.\n _Available since v4.3._"},"id":1534,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"5078:10:11","nodeType":"FunctionDefinition","parameters":{"id":1480,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1473,"mutability":"mutable","name":"hash","nameLocation":"5106:4:11","nodeType":"VariableDeclaration","scope":1534,"src":"5098:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1472,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5098:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1475,"mutability":"mutable","name":"v","nameLocation":"5126:1:11","nodeType":"VariableDeclaration","scope":1534,"src":"5120:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1474,"name":"uint8","nodeType":"ElementaryTypeName","src":"5120:5:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":1477,"mutability":"mutable","name":"r","nameLocation":"5145:1:11","nodeType":"VariableDeclaration","scope":1534,"src":"5137:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1476,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5137:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1479,"mutability":"mutable","name":"s","nameLocation":"5164:1:11","nodeType":"VariableDeclaration","scope":1534,"src":"5156:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1478,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5156:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5088:83:11"},"returnParameters":{"id":1486,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1482,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1534,"src":"5195:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1481,"name":"address","nodeType":"ElementaryTypeName","src":"5195:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1485,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1534,"src":"5204:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1484,"nodeType":"UserDefinedTypeName","pathNode":{"id":1483,"name":"RecoverError","nameLocations":["5204:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"5204:12:11"},"referencedDeclaration":1276,"src":"5204:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"5194:23:11"},"scope":1627,"src":"5069:1494:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1566,"nodeType":"Block","src":"6828:138:11","statements":[{"assignments":[1549,1552],"declarations":[{"constant":false,"id":1549,"mutability":"mutable","name":"recovered","nameLocation":"6847:9:11","nodeType":"VariableDeclaration","scope":1566,"src":"6839:17:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1548,"name":"address","nodeType":"ElementaryTypeName","src":"6839:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1552,"mutability":"mutable","name":"error","nameLocation":"6871:5:11","nodeType":"VariableDeclaration","scope":1566,"src":"6858:18:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":1551,"nodeType":"UserDefinedTypeName","pathNode":{"id":1550,"name":"RecoverError","nameLocations":["6858:12:11"],"nodeType":"IdentifierPath","referencedDeclaration":1276,"src":"6858:12:11"},"referencedDeclaration":1276,"src":"6858:12:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":1559,"initialValue":{"arguments":[{"id":1554,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1537,"src":"6891:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1555,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1539,"src":"6897:1:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":1556,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1541,"src":"6900:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1557,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1543,"src":"6903:1:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1553,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[1366,1440,1534],"referencedDeclaration":1534,"src":"6880:10:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":1558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6880:25:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$1276_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"6838:67:11"},{"expression":{"arguments":[{"id":1561,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1552,"src":"6927:5:11","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$1276","typeString":"enum ECDSA.RecoverError"}],"id":1560,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1320,"src":"6915:11:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$1276_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":1562,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6915:18:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1563,"nodeType":"ExpressionStatement","src":"6915:18:11"},{"expression":{"id":1564,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1549,"src":"6950:9:11","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":1547,"id":1565,"nodeType":"Return","src":"6943:16:11"}]},"documentation":{"id":1535,"nodeType":"StructuredDocumentation","src":"6569:122:11","text":" @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately."},"id":1567,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"6705:7:11","nodeType":"FunctionDefinition","parameters":{"id":1544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1537,"mutability":"mutable","name":"hash","nameLocation":"6730:4:11","nodeType":"VariableDeclaration","scope":1567,"src":"6722:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1536,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6722:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1539,"mutability":"mutable","name":"v","nameLocation":"6750:1:11","nodeType":"VariableDeclaration","scope":1567,"src":"6744:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1538,"name":"uint8","nodeType":"ElementaryTypeName","src":"6744:5:11","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":1541,"mutability":"mutable","name":"r","nameLocation":"6769:1:11","nodeType":"VariableDeclaration","scope":1567,"src":"6761:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1540,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6761:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1543,"mutability":"mutable","name":"s","nameLocation":"6788:1:11","nodeType":"VariableDeclaration","scope":1567,"src":"6780:9:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1542,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6780:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6712:83:11"},"returnParameters":{"id":1547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1546,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1567,"src":"6819:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1545,"name":"address","nodeType":"ElementaryTypeName","src":"6819:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6818:9:11"},"scope":1627,"src":"6696:270:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1583,"nodeType":"Block","src":"7334:187:11","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"19457468657265756d205369676e6564204d6573736167653a0a3332","id":1578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7472:34:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},"value":"\u0019Ethereum Signed Message:\n32"},{"id":1579,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1570,"src":"7508:4:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":1576,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7455:3:11","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":1577,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7459:12:11","memberName":"encodePacked","nodeType":"MemberAccess","src":"7455:16:11","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":1580,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7455:58:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1575,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7445:9:11","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7445:69:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":1574,"id":1582,"nodeType":"Return","src":"7438:76:11"}]},"documentation":{"id":1568,"nodeType":"StructuredDocumentation","src":"6972:279:11","text":" @dev Returns an Ethereum Signed Message, created from a `hash`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."},"id":1584,"implemented":true,"kind":"function","modifiers":[],"name":"toEthSignedMessageHash","nameLocation":"7265:22:11","nodeType":"FunctionDefinition","parameters":{"id":1571,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1570,"mutability":"mutable","name":"hash","nameLocation":"7296:4:11","nodeType":"VariableDeclaration","scope":1584,"src":"7288:12:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1569,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7288:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7287:14:11"},"returnParameters":{"id":1574,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1573,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1584,"src":"7325:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1572,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7325:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7324:9:11"},"scope":1627,"src":"7256:265:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1605,"nodeType":"Block","src":"7886:116:11","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"19457468657265756d205369676e6564204d6573736167653a0a","id":1595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7930:32:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""},"value":"\u0019Ethereum Signed Message:\n"},{"arguments":[{"expression":{"id":1598,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"7981:1:11","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7983:6:11","memberName":"length","nodeType":"MemberAccess","src":"7981:8:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1596,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1266,"src":"7964:7:11","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Strings_$1266_$","typeString":"type(library Strings)"}},"id":1597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7972:8:11","memberName":"toString","nodeType":"MemberAccess","referencedDeclaration":1149,"src":"7964:16:11","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"}},"id":1600,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7964:26:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":1601,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"7992:1:11","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":1593,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7913:3:11","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":1594,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7917:12:11","memberName":"encodePacked","nodeType":"MemberAccess","src":"7913:16:11","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":1602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7913:81:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1592,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7903:9:11","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7903:92:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":1591,"id":1604,"nodeType":"Return","src":"7896:99:11"}]},"documentation":{"id":1585,"nodeType":"StructuredDocumentation","src":"7527:274:11","text":" @dev Returns an Ethereum Signed Message, created from `s`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."},"id":1606,"implemented":true,"kind":"function","modifiers":[],"name":"toEthSignedMessageHash","nameLocation":"7815:22:11","nodeType":"FunctionDefinition","parameters":{"id":1588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1587,"mutability":"mutable","name":"s","nameLocation":"7851:1:11","nodeType":"VariableDeclaration","scope":1606,"src":"7838:14:11","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1586,"name":"bytes","nodeType":"ElementaryTypeName","src":"7838:5:11","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7837:16:11"},"returnParameters":{"id":1591,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1590,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1606,"src":"7877:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1589,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7877:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7876:9:11"},"scope":1627,"src":"7806:196:11","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1625,"nodeType":"Block","src":"8443:92:11","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"1901","id":1619,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8487:10:11","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"id":1620,"name":"domainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1609,"src":"8499:15:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1621,"name":"structHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1611,"src":"8516:10:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":1617,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8470:3:11","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":1618,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8474:12:11","memberName":"encodePacked","nodeType":"MemberAccess","src":"8470:16:11","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":1622,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8470:57:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1616,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8460:9:11","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1623,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8460:68:11","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":1615,"id":1624,"nodeType":"Return","src":"8453:75:11"}]},"documentation":{"id":1607,"nodeType":"StructuredDocumentation","src":"8008:328:11","text":" @dev Returns an Ethereum Signed Typed Data, created from a\n `domainSeparator` and a `structHash`. This produces hash corresponding\n to the one signed with the\n https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n JSON-RPC method as part of EIP-712.\n See {recover}."},"id":1626,"implemented":true,"kind":"function","modifiers":[],"name":"toTypedDataHash","nameLocation":"8350:15:11","nodeType":"FunctionDefinition","parameters":{"id":1612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1609,"mutability":"mutable","name":"domainSeparator","nameLocation":"8374:15:11","nodeType":"VariableDeclaration","scope":1626,"src":"8366:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1608,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8366:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1611,"mutability":"mutable","name":"structHash","nameLocation":"8399:10:11","nodeType":"VariableDeclaration","scope":1626,"src":"8391:18:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1610,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8391:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"8365:45:11"},"returnParameters":{"id":1615,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1614,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1626,"src":"8434:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1613,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8434:7:11","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"8433:9:11"},"scope":1627,"src":"8341:194:11","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1628,"src":"369:8168:11","usedErrors":[]}],"src":"112:8426:11"},"id":11},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","exportedSymbols":{"IERC165":[1639]},"id":1640,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1629,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"100:23:12"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC165","contractDependencies":[],"contractKind":"interface","documentation":{"id":1630,"nodeType":"StructuredDocumentation","src":"125:279:12","text":" @dev Interface of the ERC165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[EIP].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."},"fullyImplemented":false,"id":1639,"linearizedBaseContracts":[1639],"name":"IERC165","nameLocation":"415:7:12","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":1631,"nodeType":"StructuredDocumentation","src":"429:340:12","text":" @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."},"functionSelector":"01ffc9a7","id":1638,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"783:17:12","nodeType":"FunctionDefinition","parameters":{"id":1634,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1633,"mutability":"mutable","name":"interfaceId","nameLocation":"808:11:12","nodeType":"VariableDeclaration","scope":1638,"src":"801:18:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":1632,"name":"bytes4","nodeType":"ElementaryTypeName","src":"801:6:12","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"800:20:12"},"returnParameters":{"id":1637,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1636,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1638,"src":"844:4:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1635,"name":"bool","nodeType":"ElementaryTypeName","src":"844:4:12","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"843:6:12"},"scope":1639,"src":"774:76:12","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":1640,"src":"405:447:12","usedErrors":[]}],"src":"100:753:12"},"id":12},"@openzeppelin/contracts/utils/math/Math.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","exportedSymbols":{"Math":[2504]},"id":2505,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1641,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"103:23:13"},{"abstract":false,"baseContracts":[],"canonicalName":"Math","contractDependencies":[],"contractKind":"library","documentation":{"id":1642,"nodeType":"StructuredDocumentation","src":"128:73:13","text":" @dev Standard math utilities missing in the Solidity language."},"fullyImplemented":true,"id":2504,"linearizedBaseContracts":[2504],"name":"Math","nameLocation":"210:4:13","nodeType":"ContractDefinition","nodes":[{"canonicalName":"Math.Rounding","id":1646,"members":[{"id":1643,"name":"Down","nameLocation":"245:4:13","nodeType":"EnumValue","src":"245:4:13"},{"id":1644,"name":"Up","nameLocation":"287:2:13","nodeType":"EnumValue","src":"287:2:13"},{"id":1645,"name":"Zero","nameLocation":"318:4:13","nodeType":"EnumValue","src":"318:4:13"}],"name":"Rounding","nameLocation":"226:8:13","nodeType":"EnumDefinition","src":"221:122:13"},{"body":{"id":1663,"nodeType":"Block","src":"480:37:13","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1656,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1649,"src":"497:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1657,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1651,"src":"501:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"497:5:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":1660,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1651,"src":"509:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"497:13:13","trueExpression":{"id":1659,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1649,"src":"505:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1655,"id":1662,"nodeType":"Return","src":"490:20:13"}]},"documentation":{"id":1647,"nodeType":"StructuredDocumentation","src":"349:59:13","text":" @dev Returns the largest of two numbers."},"id":1664,"implemented":true,"kind":"function","modifiers":[],"name":"max","nameLocation":"422:3:13","nodeType":"FunctionDefinition","parameters":{"id":1652,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1649,"mutability":"mutable","name":"a","nameLocation":"434:1:13","nodeType":"VariableDeclaration","scope":1664,"src":"426:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1648,"name":"uint256","nodeType":"ElementaryTypeName","src":"426:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1651,"mutability":"mutable","name":"b","nameLocation":"445:1:13","nodeType":"VariableDeclaration","scope":1664,"src":"437:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1650,"name":"uint256","nodeType":"ElementaryTypeName","src":"437:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"425:22:13"},"returnParameters":{"id":1655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1654,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1664,"src":"471:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1653,"name":"uint256","nodeType":"ElementaryTypeName","src":"471:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"470:9:13"},"scope":2504,"src":"413:104:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1681,"nodeType":"Block","src":"655:37:13","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1676,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1674,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1667,"src":"672:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1675,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1669,"src":"676:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"672:5:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":1678,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1669,"src":"684:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"672:13:13","trueExpression":{"id":1677,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1667,"src":"680:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1673,"id":1680,"nodeType":"Return","src":"665:20:13"}]},"documentation":{"id":1665,"nodeType":"StructuredDocumentation","src":"523:60:13","text":" @dev Returns the smallest of two numbers."},"id":1682,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"597:3:13","nodeType":"FunctionDefinition","parameters":{"id":1670,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1667,"mutability":"mutable","name":"a","nameLocation":"609:1:13","nodeType":"VariableDeclaration","scope":1682,"src":"601:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1666,"name":"uint256","nodeType":"ElementaryTypeName","src":"601:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1669,"mutability":"mutable","name":"b","nameLocation":"620:1:13","nodeType":"VariableDeclaration","scope":1682,"src":"612:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1668,"name":"uint256","nodeType":"ElementaryTypeName","src":"612:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"600:22:13"},"returnParameters":{"id":1673,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1672,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1682,"src":"646:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1671,"name":"uint256","nodeType":"ElementaryTypeName","src":"646:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"645:9:13"},"scope":2504,"src":"588:104:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1704,"nodeType":"Block","src":"876:82:13","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1702,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1692,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1685,"src":"931:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":1693,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1687,"src":"935:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"931:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1695,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"930:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1701,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1696,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1685,"src":"941:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":1697,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1687,"src":"945:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"941:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1699,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"940:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"32","id":1700,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"950:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"940:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"930:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1691,"id":1703,"nodeType":"Return","src":"923:28:13"}]},"documentation":{"id":1683,"nodeType":"StructuredDocumentation","src":"698:102:13","text":" @dev Returns the average of two numbers. The result is rounded towards\n zero."},"id":1705,"implemented":true,"kind":"function","modifiers":[],"name":"average","nameLocation":"814:7:13","nodeType":"FunctionDefinition","parameters":{"id":1688,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1685,"mutability":"mutable","name":"a","nameLocation":"830:1:13","nodeType":"VariableDeclaration","scope":1705,"src":"822:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1684,"name":"uint256","nodeType":"ElementaryTypeName","src":"822:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1687,"mutability":"mutable","name":"b","nameLocation":"841:1:13","nodeType":"VariableDeclaration","scope":1705,"src":"833:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1686,"name":"uint256","nodeType":"ElementaryTypeName","src":"833:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"821:22:13"},"returnParameters":{"id":1691,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1690,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1705,"src":"867:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1689,"name":"uint256","nodeType":"ElementaryTypeName","src":"867:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"866:9:13"},"scope":2504,"src":"805:153:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1729,"nodeType":"Block","src":"1228:123:13","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1715,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1708,"src":"1316:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1321:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1316:6:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1724,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1721,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1719,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1708,"src":"1330:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":1720,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1334:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1330:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1722,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1329:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1723,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1710,"src":"1339:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1329:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1343:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1329:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"1316:28:13","trueExpression":{"hexValue":"30","id":1718,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1325:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1714,"id":1728,"nodeType":"Return","src":"1309:35:13"}]},"documentation":{"id":1706,"nodeType":"StructuredDocumentation","src":"964:188:13","text":" @dev Returns the ceiling of the division of two numbers.\n This differs from standard division with `/` in that it rounds up instead\n of rounding down."},"id":1730,"implemented":true,"kind":"function","modifiers":[],"name":"ceilDiv","nameLocation":"1166:7:13","nodeType":"FunctionDefinition","parameters":{"id":1711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1708,"mutability":"mutable","name":"a","nameLocation":"1182:1:13","nodeType":"VariableDeclaration","scope":1730,"src":"1174:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1707,"name":"uint256","nodeType":"ElementaryTypeName","src":"1174:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1710,"mutability":"mutable","name":"b","nameLocation":"1193:1:13","nodeType":"VariableDeclaration","scope":1730,"src":"1185:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1709,"name":"uint256","nodeType":"ElementaryTypeName","src":"1185:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1173:22:13"},"returnParameters":{"id":1714,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1713,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1730,"src":"1219:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1712,"name":"uint256","nodeType":"ElementaryTypeName","src":"1219:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1218:9:13"},"scope":2504,"src":"1157:194:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1851,"nodeType":"Block","src":"1795:3797:13","statements":[{"id":1850,"nodeType":"UncheckedBlock","src":"1805:3781:13","statements":[{"assignments":[1743],"declarations":[{"constant":false,"id":1743,"mutability":"mutable","name":"prod0","nameLocation":"2134:5:13","nodeType":"VariableDeclaration","scope":1850,"src":"2126:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1742,"name":"uint256","nodeType":"ElementaryTypeName","src":"2126:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1744,"nodeType":"VariableDeclarationStatement","src":"2126:13:13"},{"assignments":[1746],"declarations":[{"constant":false,"id":1746,"mutability":"mutable","name":"prod1","nameLocation":"2206:5:13","nodeType":"VariableDeclaration","scope":1850,"src":"2198:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1745,"name":"uint256","nodeType":"ElementaryTypeName","src":"2198:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1747,"nodeType":"VariableDeclarationStatement","src":"2198:13:13"},{"AST":{"nodeType":"YulBlock","src":"2278:157:13","statements":[{"nodeType":"YulVariableDeclaration","src":"2296:30:13","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2313:1:13"},{"name":"y","nodeType":"YulIdentifier","src":"2316:1:13"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2323:1:13","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2319:3:13"},"nodeType":"YulFunctionCall","src":"2319:6:13"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2306:6:13"},"nodeType":"YulFunctionCall","src":"2306:20:13"},"variables":[{"name":"mm","nodeType":"YulTypedName","src":"2300:2:13","type":""}]},{"nodeType":"YulAssignment","src":"2343:18:13","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2356:1:13"},{"name":"y","nodeType":"YulIdentifier","src":"2359:1:13"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"2352:3:13"},"nodeType":"YulFunctionCall","src":"2352:9:13"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"2343:5:13"}]},{"nodeType":"YulAssignment","src":"2378:43:13","value":{"arguments":[{"arguments":[{"name":"mm","nodeType":"YulIdentifier","src":"2395:2:13"},{"name":"prod0","nodeType":"YulIdentifier","src":"2399:5:13"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2391:3:13"},"nodeType":"YulFunctionCall","src":"2391:14:13"},{"arguments":[{"name":"mm","nodeType":"YulIdentifier","src":"2410:2:13"},{"name":"prod0","nodeType":"YulIdentifier","src":"2414:5:13"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2407:2:13"},"nodeType":"YulFunctionCall","src":"2407:13:13"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2387:3:13"},"nodeType":"YulFunctionCall","src":"2387:34:13"},"variableNames":[{"name":"prod1","nodeType":"YulIdentifier","src":"2378:5:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1743,"isOffset":false,"isSlot":false,"src":"2343:5:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"2399:5:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"2414:5:13","valueSize":1},{"declaration":1746,"isOffset":false,"isSlot":false,"src":"2378:5:13","valueSize":1},{"declaration":1733,"isOffset":false,"isSlot":false,"src":"2313:1:13","valueSize":1},{"declaration":1733,"isOffset":false,"isSlot":false,"src":"2356:1:13","valueSize":1},{"declaration":1735,"isOffset":false,"isSlot":false,"src":"2316:1:13","valueSize":1},{"declaration":1735,"isOffset":false,"isSlot":false,"src":"2359:1:13","valueSize":1}],"id":1748,"nodeType":"InlineAssembly","src":"2269:166:13"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1749,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1746,"src":"2516:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1750,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2525:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2516:10:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1757,"nodeType":"IfStatement","src":"2512:75:13","trueBody":{"id":1756,"nodeType":"Block","src":"2528:59:13","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1752,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1743,"src":"2553:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1753,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"2561:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2553:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1741,"id":1755,"nodeType":"Return","src":"2546:26:13"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1759,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"2697:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1760,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1746,"src":"2711:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2697:19:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":1758,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2689:7:13","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":1762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2689:28:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1763,"nodeType":"ExpressionStatement","src":"2689:28:13"},{"assignments":[1765],"declarations":[{"constant":false,"id":1765,"mutability":"mutable","name":"remainder","nameLocation":"2981:9:13","nodeType":"VariableDeclaration","scope":1850,"src":"2973:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1764,"name":"uint256","nodeType":"ElementaryTypeName","src":"2973:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1766,"nodeType":"VariableDeclarationStatement","src":"2973:17:13"},{"AST":{"nodeType":"YulBlock","src":"3013:291:13","statements":[{"nodeType":"YulAssignment","src":"3082:38:13","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"3102:1:13"},{"name":"y","nodeType":"YulIdentifier","src":"3105:1:13"},{"name":"denominator","nodeType":"YulIdentifier","src":"3108:11:13"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3095:6:13"},"nodeType":"YulFunctionCall","src":"3095:25:13"},"variableNames":[{"name":"remainder","nodeType":"YulIdentifier","src":"3082:9:13"}]},{"nodeType":"YulAssignment","src":"3202:41:13","value":{"arguments":[{"name":"prod1","nodeType":"YulIdentifier","src":"3215:5:13"},{"arguments":[{"name":"remainder","nodeType":"YulIdentifier","src":"3225:9:13"},{"name":"prod0","nodeType":"YulIdentifier","src":"3236:5:13"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3222:2:13"},"nodeType":"YulFunctionCall","src":"3222:20:13"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3211:3:13"},"nodeType":"YulFunctionCall","src":"3211:32:13"},"variableNames":[{"name":"prod1","nodeType":"YulIdentifier","src":"3202:5:13"}]},{"nodeType":"YulAssignment","src":"3260:30:13","value":{"arguments":[{"name":"prod0","nodeType":"YulIdentifier","src":"3273:5:13"},{"name":"remainder","nodeType":"YulIdentifier","src":"3280:9:13"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3269:3:13"},"nodeType":"YulFunctionCall","src":"3269:21:13"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"3260:5:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1737,"isOffset":false,"isSlot":false,"src":"3108:11:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"3236:5:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"3260:5:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"3273:5:13","valueSize":1},{"declaration":1746,"isOffset":false,"isSlot":false,"src":"3202:5:13","valueSize":1},{"declaration":1746,"isOffset":false,"isSlot":false,"src":"3215:5:13","valueSize":1},{"declaration":1765,"isOffset":false,"isSlot":false,"src":"3082:9:13","valueSize":1},{"declaration":1765,"isOffset":false,"isSlot":false,"src":"3225:9:13","valueSize":1},{"declaration":1765,"isOffset":false,"isSlot":false,"src":"3280:9:13","valueSize":1},{"declaration":1733,"isOffset":false,"isSlot":false,"src":"3102:1:13","valueSize":1},{"declaration":1735,"isOffset":false,"isSlot":false,"src":"3105:1:13","valueSize":1}],"id":1767,"nodeType":"InlineAssembly","src":"3004:300:13"},{"assignments":[1769],"declarations":[{"constant":false,"id":1769,"mutability":"mutable","name":"twos","nameLocation":"3619:4:13","nodeType":"VariableDeclaration","scope":1850,"src":"3611:12:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1768,"name":"uint256","nodeType":"ElementaryTypeName","src":"3611:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1777,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1770,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"3626:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"~","prefix":true,"src":"3641:12:13","subExpression":{"id":1771,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"3642:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1773,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3656:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3641:16:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1775,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3640:18:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3626:32:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3611:47:13"},{"AST":{"nodeType":"YulBlock","src":"3681:362:13","statements":[{"nodeType":"YulAssignment","src":"3746:37:13","value":{"arguments":[{"name":"denominator","nodeType":"YulIdentifier","src":"3765:11:13"},{"name":"twos","nodeType":"YulIdentifier","src":"3778:4:13"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"3761:3:13"},"nodeType":"YulFunctionCall","src":"3761:22:13"},"variableNames":[{"name":"denominator","nodeType":"YulIdentifier","src":"3746:11:13"}]},{"nodeType":"YulAssignment","src":"3850:25:13","value":{"arguments":[{"name":"prod0","nodeType":"YulIdentifier","src":"3863:5:13"},{"name":"twos","nodeType":"YulIdentifier","src":"3870:4:13"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"3859:3:13"},"nodeType":"YulFunctionCall","src":"3859:16:13"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"3850:5:13"}]},{"nodeType":"YulAssignment","src":"3990:39:13","value":{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4010:1:13","type":"","value":"0"},{"name":"twos","nodeType":"YulIdentifier","src":"4013:4:13"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4006:3:13"},"nodeType":"YulFunctionCall","src":"4006:12:13"},{"name":"twos","nodeType":"YulIdentifier","src":"4020:4:13"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"4002:3:13"},"nodeType":"YulFunctionCall","src":"4002:23:13"},{"kind":"number","nodeType":"YulLiteral","src":"4027:1:13","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3998:3:13"},"nodeType":"YulFunctionCall","src":"3998:31:13"},"variableNames":[{"name":"twos","nodeType":"YulIdentifier","src":"3990:4:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1737,"isOffset":false,"isSlot":false,"src":"3746:11:13","valueSize":1},{"declaration":1737,"isOffset":false,"isSlot":false,"src":"3765:11:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"3850:5:13","valueSize":1},{"declaration":1743,"isOffset":false,"isSlot":false,"src":"3863:5:13","valueSize":1},{"declaration":1769,"isOffset":false,"isSlot":false,"src":"3778:4:13","valueSize":1},{"declaration":1769,"isOffset":false,"isSlot":false,"src":"3870:4:13","valueSize":1},{"declaration":1769,"isOffset":false,"isSlot":false,"src":"3990:4:13","valueSize":1},{"declaration":1769,"isOffset":false,"isSlot":false,"src":"4013:4:13","valueSize":1},{"declaration":1769,"isOffset":false,"isSlot":false,"src":"4020:4:13","valueSize":1}],"id":1778,"nodeType":"InlineAssembly","src":"3672:371:13"},{"expression":{"id":1783,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1779,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1743,"src":"4109:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1780,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1746,"src":"4118:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1781,"name":"twos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1769,"src":"4126:4:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4118:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4109:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1784,"nodeType":"ExpressionStatement","src":"4109:21:13"},{"assignments":[1786],"declarations":[{"constant":false,"id":1786,"mutability":"mutable","name":"inverse","nameLocation":"4456:7:13","nodeType":"VariableDeclaration","scope":1850,"src":"4448:15:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1785,"name":"uint256","nodeType":"ElementaryTypeName","src":"4448:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1793,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1792,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1789,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"33","id":1787,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4467:1:13","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1788,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4471:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4467:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1790,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4466:17:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"hexValue":"32","id":1791,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4486:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"4466:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4448:39:13"},{"expression":{"id":1800,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1794,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4704:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4715:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1796,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4719:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1797,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4733:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4719:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4715:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4704:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1801,"nodeType":"ExpressionStatement","src":"4704:36:13"},{"expression":{"id":1808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1802,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4773:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1803,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4784:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1804,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4788:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1805,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4802:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4788:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4784:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4773:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1809,"nodeType":"ExpressionStatement","src":"4773:36:13"},{"expression":{"id":1816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1810,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4843:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1811,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4854:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1812,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4858:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1813,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4872:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4858:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4854:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4843:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1817,"nodeType":"ExpressionStatement","src":"4843:36:13"},{"expression":{"id":1824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1818,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4913:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1819,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4924:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1820,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4928:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1821,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4942:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4928:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4924:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4913:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1825,"nodeType":"ExpressionStatement","src":"4913:36:13"},{"expression":{"id":1832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1826,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4983:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1827,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4994:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1828,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"4998:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1829,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5012:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4998:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4994:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4983:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1833,"nodeType":"ExpressionStatement","src":"4983:36:13"},{"expression":{"id":1840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1834,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5054:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1835,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5065:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1838,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1836,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1737,"src":"5069:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1837,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5083:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5069:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5065:25:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5054:36:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1841,"nodeType":"ExpressionStatement","src":"5054:36:13"},{"expression":{"id":1846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1842,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1740,"src":"5524:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1843,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1743,"src":"5533:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1844,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5541:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5533:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5524:24:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1847,"nodeType":"ExpressionStatement","src":"5524:24:13"},{"expression":{"id":1848,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1740,"src":"5569:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1741,"id":1849,"nodeType":"Return","src":"5562:13:13"}]}]},"documentation":{"id":1731,"nodeType":"StructuredDocumentation","src":"1357:305:13","text":" @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n with further edits by Uniswap Labs also under MIT license."},"id":1852,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"1676:6:13","nodeType":"FunctionDefinition","parameters":{"id":1738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1733,"mutability":"mutable","name":"x","nameLocation":"1700:1:13","nodeType":"VariableDeclaration","scope":1852,"src":"1692:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1732,"name":"uint256","nodeType":"ElementaryTypeName","src":"1692:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1735,"mutability":"mutable","name":"y","nameLocation":"1719:1:13","nodeType":"VariableDeclaration","scope":1852,"src":"1711:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1734,"name":"uint256","nodeType":"ElementaryTypeName","src":"1711:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1737,"mutability":"mutable","name":"denominator","nameLocation":"1738:11:13","nodeType":"VariableDeclaration","scope":1852,"src":"1730:19:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1736,"name":"uint256","nodeType":"ElementaryTypeName","src":"1730:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1682:73:13"},"returnParameters":{"id":1741,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1740,"mutability":"mutable","name":"result","nameLocation":"1787:6:13","nodeType":"VariableDeclaration","scope":1852,"src":"1779:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1739,"name":"uint256","nodeType":"ElementaryTypeName","src":"1779:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1778:16:13"},"scope":2504,"src":"1667:3925:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1895,"nodeType":"Block","src":"5872:189:13","statements":[{"assignments":[1868],"declarations":[{"constant":false,"id":1868,"mutability":"mutable","name":"result","nameLocation":"5890:6:13","nodeType":"VariableDeclaration","scope":1895,"src":"5882:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1867,"name":"uint256","nodeType":"ElementaryTypeName","src":"5882:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1874,"initialValue":{"arguments":[{"id":1870,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1855,"src":"5906:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1871,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1857,"src":"5909:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1872,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"5912:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1869,"name":"mulDiv","nodeType":"Identifier","overloadedDeclarations":[1852,1896],"referencedDeclaration":1852,"src":"5899:6:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":1873,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5899:25:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5882:42:13"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1886,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"id":1878,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1875,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1862,"src":"5938:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":1876,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1646,"src":"5950:8:13","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$1646_$","typeString":"type(enum Math.Rounding)"}},"id":1877,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5959:2:13","memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":1644,"src":"5950:11:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"src":"5938:23:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1885,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1880,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1855,"src":"5972:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1881,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1857,"src":"5975:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1882,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"5978:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1879,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5965:6:13","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":1883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5965:25:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":1884,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5993:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5965:29:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5938:56:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1892,"nodeType":"IfStatement","src":"5934:98:13","trueBody":{"id":1891,"nodeType":"Block","src":"5996:36:13","statements":[{"expression":{"id":1889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1887,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1868,"src":"6010:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":1888,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6020:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"6010:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1890,"nodeType":"ExpressionStatement","src":"6010:11:13"}]}},{"expression":{"id":1893,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1868,"src":"6048:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1866,"id":1894,"nodeType":"Return","src":"6041:13:13"}]},"documentation":{"id":1853,"nodeType":"StructuredDocumentation","src":"5598:121:13","text":" @notice Calculates x * y / denominator with full precision, following the selected rounding direction."},"id":1896,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"5733:6:13","nodeType":"FunctionDefinition","parameters":{"id":1863,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1855,"mutability":"mutable","name":"x","nameLocation":"5757:1:13","nodeType":"VariableDeclaration","scope":1896,"src":"5749:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1854,"name":"uint256","nodeType":"ElementaryTypeName","src":"5749:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1857,"mutability":"mutable","name":"y","nameLocation":"5776:1:13","nodeType":"VariableDeclaration","scope":1896,"src":"5768:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1856,"name":"uint256","nodeType":"ElementaryTypeName","src":"5768:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1859,"mutability":"mutable","name":"denominator","nameLocation":"5795:11:13","nodeType":"VariableDeclaration","scope":1896,"src":"5787:19:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1858,"name":"uint256","nodeType":"ElementaryTypeName","src":"5787:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1862,"mutability":"mutable","name":"rounding","nameLocation":"5825:8:13","nodeType":"VariableDeclaration","scope":1896,"src":"5816:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"typeName":{"id":1861,"nodeType":"UserDefinedTypeName","pathNode":{"id":1860,"name":"Rounding","nameLocations":["5816:8:13"],"nodeType":"IdentifierPath","referencedDeclaration":1646,"src":"5816:8:13"},"referencedDeclaration":1646,"src":"5816:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"5739:100:13"},"returnParameters":{"id":1866,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1865,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1896,"src":"5863:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1864,"name":"uint256","nodeType":"ElementaryTypeName","src":"5863:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5862:9:13"},"scope":2504,"src":"5724:337:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2007,"nodeType":"Block","src":"6337:1585:13","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1904,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"6351:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6356:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6351:6:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1910,"nodeType":"IfStatement","src":"6347:45:13","trueBody":{"id":1909,"nodeType":"Block","src":"6359:33:13","statements":[{"expression":{"hexValue":"30","id":1907,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6380:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":1903,"id":1908,"nodeType":"Return","src":"6373:8:13"}]}},{"assignments":[1912],"declarations":[{"constant":false,"id":1912,"mutability":"mutable","name":"result","nameLocation":"7079:6:13","nodeType":"VariableDeclaration","scope":2007,"src":"7071:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1911,"name":"uint256","nodeType":"ElementaryTypeName","src":"7071:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1921,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1913,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7088:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1918,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1915,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7099:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1914,"name":"log2","nodeType":"Identifier","overloadedDeclarations":[2176,2212],"referencedDeclaration":2176,"src":"7094:4:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":1916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7094:7:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1917,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7105:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7094:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1919,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7093:14:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7088:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7071:36:13"},{"id":2006,"nodeType":"UncheckedBlock","src":"7508:408:13","statements":[{"expression":{"id":1931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1922,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7532:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1923,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7542:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1924,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7551:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1925,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7555:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7551:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7542:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1928,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7541:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1929,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7566:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7541:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7532:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1932,"nodeType":"ExpressionStatement","src":"7532:35:13"},{"expression":{"id":1942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1933,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7581:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1938,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1934,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7591:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1935,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7600:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1936,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7604:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7600:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7591:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1939,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7590:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1940,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7615:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7590:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7581:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1943,"nodeType":"ExpressionStatement","src":"7581:35:13"},{"expression":{"id":1953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1944,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7630:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1949,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1945,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7640:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1948,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1946,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7649:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1947,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7653:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7649:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7640:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1950,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7639:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1951,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7664:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7639:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7630:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1954,"nodeType":"ExpressionStatement","src":"7630:35:13"},{"expression":{"id":1964,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1955,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7679:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1960,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1956,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7689:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1957,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7698:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1958,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7702:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7698:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7689:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1961,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7688:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1962,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7713:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7688:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7679:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1965,"nodeType":"ExpressionStatement","src":"7679:35:13"},{"expression":{"id":1975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1966,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7728:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1967,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7738:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1970,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1968,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7747:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1969,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7751:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7747:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7738:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1972,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7737:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1973,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7762:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7737:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7728:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1976,"nodeType":"ExpressionStatement","src":"7728:35:13"},{"expression":{"id":1986,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1977,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7777:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1978,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7787:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1979,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7796:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1980,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7800:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7796:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7787:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1983,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7786:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1984,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7811:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7786:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7777:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1987,"nodeType":"ExpressionStatement","src":"7777:35:13"},{"expression":{"id":1997,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1988,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7826:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1989,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7836:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1992,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1990,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7845:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":1991,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7849:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7845:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7836:19:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1994,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7835:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":1995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7860:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7835:26:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7826:35:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1998,"nodeType":"ExpressionStatement","src":"7826:35:13"},{"expression":{"arguments":[{"id":2000,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7886:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2001,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1899,"src":"7894:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":2002,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"7898:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7894:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1999,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1682,"src":"7882:3:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":2004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7882:23:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1903,"id":2005,"nodeType":"Return","src":"7875:30:13"}]}]},"documentation":{"id":1897,"nodeType":"StructuredDocumentation","src":"6067:208:13","text":" @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11)."},"id":2008,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"6289:4:13","nodeType":"FunctionDefinition","parameters":{"id":1900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1899,"mutability":"mutable","name":"a","nameLocation":"6302:1:13","nodeType":"VariableDeclaration","scope":2008,"src":"6294:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1898,"name":"uint256","nodeType":"ElementaryTypeName","src":"6294:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6293:11:13"},"returnParameters":{"id":1903,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1902,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2008,"src":"6328:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1901,"name":"uint256","nodeType":"ElementaryTypeName","src":"6328:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6327:9:13"},"scope":2504,"src":"6280:1642:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2043,"nodeType":"Block","src":"8098:161:13","statements":[{"id":2042,"nodeType":"UncheckedBlock","src":"8108:145:13","statements":[{"assignments":[2020],"declarations":[{"constant":false,"id":2020,"mutability":"mutable","name":"result","nameLocation":"8140:6:13","nodeType":"VariableDeclaration","scope":2042,"src":"8132:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2019,"name":"uint256","nodeType":"ElementaryTypeName","src":"8132:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2024,"initialValue":{"arguments":[{"id":2022,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"8154:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2021,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[2008,2044],"referencedDeclaration":2008,"src":"8149:4:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":2023,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8149:7:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8132:24:13"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2025,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"8177:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"id":2029,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2026,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2014,"src":"8187:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":2027,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1646,"src":"8199:8:13","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$1646_$","typeString":"type(enum Math.Rounding)"}},"id":2028,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8208:2:13","memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":1644,"src":"8199:11:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"src":"8187:23:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2032,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2030,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"8214:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":2031,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"8223:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8214:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2033,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"8232:1:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8214:19:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8187:46:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2037,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8240:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"8187:54:13","trueExpression":{"hexValue":"31","id":2036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8236:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2039,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8186:56:13","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"8177:65:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2018,"id":2041,"nodeType":"Return","src":"8170:72:13"}]}]},"documentation":{"id":2009,"nodeType":"StructuredDocumentation","src":"7928:89:13","text":" @notice Calculates sqrt(a), following the selected rounding direction."},"id":2044,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"8031:4:13","nodeType":"FunctionDefinition","parameters":{"id":2015,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2011,"mutability":"mutable","name":"a","nameLocation":"8044:1:13","nodeType":"VariableDeclaration","scope":2044,"src":"8036:9:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2010,"name":"uint256","nodeType":"ElementaryTypeName","src":"8036:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2014,"mutability":"mutable","name":"rounding","nameLocation":"8056:8:13","nodeType":"VariableDeclaration","scope":2044,"src":"8047:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"typeName":{"id":2013,"nodeType":"UserDefinedTypeName","pathNode":{"id":2012,"name":"Rounding","nameLocations":["8047:8:13"],"nodeType":"IdentifierPath","referencedDeclaration":1646,"src":"8047:8:13"},"referencedDeclaration":1646,"src":"8047:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"8035:30:13"},"returnParameters":{"id":2018,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2017,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2044,"src":"8089:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2016,"name":"uint256","nodeType":"ElementaryTypeName","src":"8089:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8088:9:13"},"scope":2504,"src":"8022:237:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2175,"nodeType":"Block","src":"8444:922:13","statements":[{"assignments":[2053],"declarations":[{"constant":false,"id":2053,"mutability":"mutable","name":"result","nameLocation":"8462:6:13","nodeType":"VariableDeclaration","scope":2175,"src":"8454:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2052,"name":"uint256","nodeType":"ElementaryTypeName","src":"8454:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2055,"initialValue":{"hexValue":"30","id":2054,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8471:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8454:18:13"},{"id":2172,"nodeType":"UncheckedBlock","src":"8482:855:13","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2058,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2056,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8510:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313238","id":2057,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8519:3:13","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8510:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2059,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8525:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8510:16:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2070,"nodeType":"IfStatement","src":"8506:99:13","trueBody":{"id":2069,"nodeType":"Block","src":"8528:77:13","statements":[{"expression":{"id":2063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2061,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8546:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"313238","id":2062,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8556:3:13","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8546:13:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2064,"nodeType":"ExpressionStatement","src":"8546:13:13"},{"expression":{"id":2067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2065,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"8577:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"313238","id":2066,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8587:3:13","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8577:13:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2068,"nodeType":"ExpressionStatement","src":"8577:13:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2075,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2071,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8622:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":2072,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8631:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8622:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2074,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8636:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8622:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2085,"nodeType":"IfStatement","src":"8618:96:13","trueBody":{"id":2084,"nodeType":"Block","src":"8639:75:13","statements":[{"expression":{"id":2078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2076,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8657:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3634","id":2077,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8667:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8657:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2079,"nodeType":"ExpressionStatement","src":"8657:12:13"},{"expression":{"id":2082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2080,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"8687:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3634","id":2081,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8697:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8687:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2083,"nodeType":"ExpressionStatement","src":"8687:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2090,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2088,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2086,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8731:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3332","id":2087,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8740:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8731:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8745:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8731:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2100,"nodeType":"IfStatement","src":"8727:96:13","trueBody":{"id":2099,"nodeType":"Block","src":"8748:75:13","statements":[{"expression":{"id":2093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2091,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8766:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3332","id":2092,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8776:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8766:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2094,"nodeType":"ExpressionStatement","src":"8766:12:13"},{"expression":{"id":2097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2095,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"8796:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3332","id":2096,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8806:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8796:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2098,"nodeType":"ExpressionStatement","src":"8796:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2105,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2103,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2101,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8840:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3136","id":2102,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8849:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8840:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2104,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8854:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8840:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2115,"nodeType":"IfStatement","src":"8836:96:13","trueBody":{"id":2114,"nodeType":"Block","src":"8857:75:13","statements":[{"expression":{"id":2108,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2106,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8875:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3136","id":2107,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8885:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8875:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2109,"nodeType":"ExpressionStatement","src":"8875:12:13"},{"expression":{"id":2112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2110,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"8905:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":2111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8915:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8905:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2113,"nodeType":"ExpressionStatement","src":"8905:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2116,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8949:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"38","id":2117,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8958:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"8949:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2119,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8962:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8949:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2130,"nodeType":"IfStatement","src":"8945:93:13","trueBody":{"id":2129,"nodeType":"Block","src":"8965:73:13","statements":[{"expression":{"id":2123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2121,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"8983:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"38","id":2122,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8993:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"8983:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2124,"nodeType":"ExpressionStatement","src":"8983:11:13"},{"expression":{"id":2127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2125,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"9012:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":2126,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9022:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"9012:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2128,"nodeType":"ExpressionStatement","src":"9012:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2135,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2133,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2131,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"9055:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"34","id":2132,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9064:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9055:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2134,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9068:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9055:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2145,"nodeType":"IfStatement","src":"9051:93:13","trueBody":{"id":2144,"nodeType":"Block","src":"9071:73:13","statements":[{"expression":{"id":2138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2136,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"9089:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":2137,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9099:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9089:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2139,"nodeType":"ExpressionStatement","src":"9089:11:13"},{"expression":{"id":2142,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2140,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"9118:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":2141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9128:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9118:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2143,"nodeType":"ExpressionStatement","src":"9118:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2148,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2146,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"9161:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"32","id":2147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9170:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9161:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2149,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9174:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9161:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2160,"nodeType":"IfStatement","src":"9157:93:13","trueBody":{"id":2159,"nodeType":"Block","src":"9177:73:13","statements":[{"expression":{"id":2153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2151,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"9195:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"32","id":2152,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9205:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9195:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2154,"nodeType":"ExpressionStatement","src":"9195:11:13"},{"expression":{"id":2157,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2155,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"9224:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":2156,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9234:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9224:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2158,"nodeType":"ExpressionStatement","src":"9224:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2165,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2163,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2161,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2047,"src":"9267:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":2162,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9276:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"9267:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9280:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9267:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2171,"nodeType":"IfStatement","src":"9263:64:13","trueBody":{"id":2170,"nodeType":"Block","src":"9283:44:13","statements":[{"expression":{"id":2168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2166,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"9301:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":2167,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9311:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"9301:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2169,"nodeType":"ExpressionStatement","src":"9301:11:13"}]}}]},{"expression":{"id":2173,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2053,"src":"9353:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2051,"id":2174,"nodeType":"Return","src":"9346:13:13"}]},"documentation":{"id":2045,"nodeType":"StructuredDocumentation","src":"8265:113:13","text":" @dev Return the log in base 2, rounded down, of a positive value.\n Returns 0 if given 0."},"id":2176,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"8392:4:13","nodeType":"FunctionDefinition","parameters":{"id":2048,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2047,"mutability":"mutable","name":"value","nameLocation":"8405:5:13","nodeType":"VariableDeclaration","scope":2176,"src":"8397:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2046,"name":"uint256","nodeType":"ElementaryTypeName","src":"8397:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8396:15:13"},"returnParameters":{"id":2051,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2050,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2176,"src":"8435:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2049,"name":"uint256","nodeType":"ElementaryTypeName","src":"8435:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8434:9:13"},"scope":2504,"src":"8383:983:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2211,"nodeType":"Block","src":"9599:165:13","statements":[{"id":2210,"nodeType":"UncheckedBlock","src":"9609:149:13","statements":[{"assignments":[2188],"declarations":[{"constant":false,"id":2188,"mutability":"mutable","name":"result","nameLocation":"9641:6:13","nodeType":"VariableDeclaration","scope":2210,"src":"9633:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2187,"name":"uint256","nodeType":"ElementaryTypeName","src":"9633:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2192,"initialValue":{"arguments":[{"id":2190,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2179,"src":"9655:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2189,"name":"log2","nodeType":"Identifier","overloadedDeclarations":[2176,2212],"referencedDeclaration":2176,"src":"9650:4:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":2191,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9650:11:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9633:28:13"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2193,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2188,"src":"9682:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"id":2197,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2194,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2182,"src":"9692:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":2195,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1646,"src":"9704:8:13","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$1646_$","typeString":"type(enum Math.Rounding)"}},"id":2196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9713:2:13","memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":1644,"src":"9704:11:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"src":"9692:23:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":2198,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9719:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"id":2199,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2188,"src":"9724:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9719:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2201,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2179,"src":"9733:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9719:19:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9692:46:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9745:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9692:54:13","trueExpression":{"hexValue":"31","id":2204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9741:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2207,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9691:56:13","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"9682:65:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2186,"id":2209,"nodeType":"Return","src":"9675:72:13"}]}]},"documentation":{"id":2177,"nodeType":"StructuredDocumentation","src":"9372:142:13","text":" @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":2212,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"9528:4:13","nodeType":"FunctionDefinition","parameters":{"id":2183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2179,"mutability":"mutable","name":"value","nameLocation":"9541:5:13","nodeType":"VariableDeclaration","scope":2212,"src":"9533:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2178,"name":"uint256","nodeType":"ElementaryTypeName","src":"9533:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2182,"mutability":"mutable","name":"rounding","nameLocation":"9557:8:13","nodeType":"VariableDeclaration","scope":2212,"src":"9548:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"typeName":{"id":2181,"nodeType":"UserDefinedTypeName","pathNode":{"id":2180,"name":"Rounding","nameLocations":["9548:8:13"],"nodeType":"IdentifierPath","referencedDeclaration":1646,"src":"9548:8:13"},"referencedDeclaration":1646,"src":"9548:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"9532:34:13"},"returnParameters":{"id":2186,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2185,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2212,"src":"9590:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2184,"name":"uint256","nodeType":"ElementaryTypeName","src":"9590:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9589:9:13"},"scope":2504,"src":"9519:245:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2340,"nodeType":"Block","src":"9951:828:13","statements":[{"assignments":[2221],"declarations":[{"constant":false,"id":2221,"mutability":"mutable","name":"result","nameLocation":"9969:6:13","nodeType":"VariableDeclaration","scope":2340,"src":"9961:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2220,"name":"uint256","nodeType":"ElementaryTypeName","src":"9961:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2223,"initialValue":{"hexValue":"30","id":2222,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9978:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"9961:18:13"},{"id":2337,"nodeType":"UncheckedBlock","src":"9989:761:13","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2224,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10017:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":2227,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10026:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":2226,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10030:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10026:6:13","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"10017:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2240,"nodeType":"IfStatement","src":"10013:99:13","trueBody":{"id":2239,"nodeType":"Block","src":"10034:78:13","statements":[{"expression":{"id":2233,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2229,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10052:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":2232,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10061:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":2231,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10065:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10061:6:13","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"10052:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2234,"nodeType":"ExpressionStatement","src":"10052:15:13"},{"expression":{"id":2237,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2235,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10085:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3634","id":2236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10095:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10085:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2238,"nodeType":"ExpressionStatement","src":"10085:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2241,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10129:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":2244,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2242,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10138:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":2243,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10142:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10138:6:13","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"10129:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2257,"nodeType":"IfStatement","src":"10125:99:13","trueBody":{"id":2256,"nodeType":"Block","src":"10146:78:13","statements":[{"expression":{"id":2250,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2246,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10164:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":2249,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10173:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":2248,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10177:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10173:6:13","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"10164:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2251,"nodeType":"ExpressionStatement","src":"10164:15:13"},{"expression":{"id":2254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2252,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10197:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3332","id":2253,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10207:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10197:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2255,"nodeType":"ExpressionStatement","src":"10197:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2258,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10241:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":2261,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2259,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10250:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":2260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10254:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10250:6:13","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"10241:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2274,"nodeType":"IfStatement","src":"10237:99:13","trueBody":{"id":2273,"nodeType":"Block","src":"10258:78:13","statements":[{"expression":{"id":2267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2263,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10276:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":2266,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10285:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":2265,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10289:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10285:6:13","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"10276:15:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2268,"nodeType":"ExpressionStatement","src":"10276:15:13"},{"expression":{"id":2271,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2269,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10309:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":2270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10319:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10309:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2272,"nodeType":"ExpressionStatement","src":"10309:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2275,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10353:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":2278,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2276,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10362:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":2277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10366:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10362:5:13","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"10353:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2291,"nodeType":"IfStatement","src":"10349:96:13","trueBody":{"id":2290,"nodeType":"Block","src":"10369:76:13","statements":[{"expression":{"id":2284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2280,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10387:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":2283,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10396:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":2282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10400:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10396:5:13","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"10387:14:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2285,"nodeType":"ExpressionStatement","src":"10387:14:13"},{"expression":{"id":2288,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2286,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10419:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":2287,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10429:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10419:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2289,"nodeType":"ExpressionStatement","src":"10419:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2292,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10462:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":2295,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10471:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":2294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10475:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10471:5:13","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"10462:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2308,"nodeType":"IfStatement","src":"10458:96:13","trueBody":{"id":2307,"nodeType":"Block","src":"10478:76:13","statements":[{"expression":{"id":2301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2297,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10496:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":2300,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10505:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":2299,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10509:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10505:5:13","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"10496:14:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2302,"nodeType":"ExpressionStatement","src":"10496:14:13"},{"expression":{"id":2305,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2303,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10528:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":2304,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10538:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10528:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2306,"nodeType":"ExpressionStatement","src":"10528:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2309,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10571:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":2312,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2310,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10580:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":2311,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10584:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10580:5:13","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"10571:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2325,"nodeType":"IfStatement","src":"10567:96:13","trueBody":{"id":2324,"nodeType":"Block","src":"10587:76:13","statements":[{"expression":{"id":2318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2314,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10605:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":2317,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10614:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":2316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10618:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10614:5:13","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"10605:14:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2319,"nodeType":"ExpressionStatement","src":"10605:14:13"},{"expression":{"id":2322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2320,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10637:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":2321,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10647:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10637:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2323,"nodeType":"ExpressionStatement","src":"10637:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2326,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"10680:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"id":2329,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2327,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10689:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"31","id":2328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10693:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10689:5:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"}},"src":"10680:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2336,"nodeType":"IfStatement","src":"10676:64:13","trueBody":{"id":2335,"nodeType":"Block","src":"10696:44:13","statements":[{"expression":{"id":2333,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2331,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10714:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":2332,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10724:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10714:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2334,"nodeType":"ExpressionStatement","src":"10714:11:13"}]}}]},{"expression":{"id":2338,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2221,"src":"10766:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2219,"id":2339,"nodeType":"Return","src":"10759:13:13"}]},"documentation":{"id":2213,"nodeType":"StructuredDocumentation","src":"9770:114:13","text":" @dev Return the log in base 10, rounded down, of a positive value.\n Returns 0 if given 0."},"id":2341,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"9898:5:13","nodeType":"FunctionDefinition","parameters":{"id":2216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2215,"mutability":"mutable","name":"value","nameLocation":"9912:5:13","nodeType":"VariableDeclaration","scope":2341,"src":"9904:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2214,"name":"uint256","nodeType":"ElementaryTypeName","src":"9904:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9903:15:13"},"returnParameters":{"id":2219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2218,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2341,"src":"9942:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2217,"name":"uint256","nodeType":"ElementaryTypeName","src":"9942:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9941:9:13"},"scope":2504,"src":"9889:890:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2376,"nodeType":"Block","src":"11014:165:13","statements":[{"id":2375,"nodeType":"UncheckedBlock","src":"11024:149:13","statements":[{"assignments":[2353],"declarations":[{"constant":false,"id":2353,"mutability":"mutable","name":"result","nameLocation":"11056:6:13","nodeType":"VariableDeclaration","scope":2375,"src":"11048:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2352,"name":"uint256","nodeType":"ElementaryTypeName","src":"11048:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2357,"initialValue":{"arguments":[{"id":2355,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2344,"src":"11071:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2354,"name":"log10","nodeType":"Identifier","overloadedDeclarations":[2341,2377],"referencedDeclaration":2341,"src":"11065:5:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":2356,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11065:12:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11048:29:13"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2358,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2353,"src":"11098:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"id":2362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2359,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2347,"src":"11108:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":2360,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1646,"src":"11120:8:13","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$1646_$","typeString":"type(enum Math.Rounding)"}},"id":2361,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"11129:2:13","memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":1644,"src":"11120:11:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"src":"11108:23:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":2363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11135:2:13","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":2364,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2353,"src":"11139:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11135:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2366,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2344,"src":"11148:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11135:18:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11108:45:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2370,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11160:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2371,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"11108:53:13","trueExpression":{"hexValue":"31","id":2369,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11156:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2372,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11107:55:13","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"11098:64:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2351,"id":2374,"nodeType":"Return","src":"11091:71:13"}]}]},"documentation":{"id":2342,"nodeType":"StructuredDocumentation","src":"10785:143:13","text":" @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":2377,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"10942:5:13","nodeType":"FunctionDefinition","parameters":{"id":2348,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2344,"mutability":"mutable","name":"value","nameLocation":"10956:5:13","nodeType":"VariableDeclaration","scope":2377,"src":"10948:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2343,"name":"uint256","nodeType":"ElementaryTypeName","src":"10948:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2347,"mutability":"mutable","name":"rounding","nameLocation":"10972:8:13","nodeType":"VariableDeclaration","scope":2377,"src":"10963:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"typeName":{"id":2346,"nodeType":"UserDefinedTypeName","pathNode":{"id":2345,"name":"Rounding","nameLocations":["10963:8:13"],"nodeType":"IdentifierPath","referencedDeclaration":1646,"src":"10963:8:13"},"referencedDeclaration":1646,"src":"10963:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"10947:34:13"},"returnParameters":{"id":2351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2350,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2377,"src":"11005:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2349,"name":"uint256","nodeType":"ElementaryTypeName","src":"11005:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11004:9:13"},"scope":2504,"src":"10933:246:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2463,"nodeType":"Block","src":"11493:600:13","statements":[{"assignments":[2386],"declarations":[{"constant":false,"id":2386,"mutability":"mutable","name":"result","nameLocation":"11511:6:13","nodeType":"VariableDeclaration","scope":2463,"src":"11503:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2385,"name":"uint256","nodeType":"ElementaryTypeName","src":"11503:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2388,"initialValue":{"hexValue":"30","id":2387,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11520:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"11503:18:13"},{"id":2460,"nodeType":"UncheckedBlock","src":"11531:533:13","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2389,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11559:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313238","id":2390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11568:3:13","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"11559:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11574:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11559:16:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2403,"nodeType":"IfStatement","src":"11555:98:13","trueBody":{"id":2402,"nodeType":"Block","src":"11577:76:13","statements":[{"expression":{"id":2396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2394,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11595:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"313238","id":2395,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11605:3:13","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"11595:13:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2397,"nodeType":"ExpressionStatement","src":"11595:13:13"},{"expression":{"id":2400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2398,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"11626:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":2399,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11636:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11626:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2401,"nodeType":"ExpressionStatement","src":"11626:12:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2408,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2404,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11670:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":2405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11679:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"11670:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2407,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11684:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11670:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2418,"nodeType":"IfStatement","src":"11666:95:13","trueBody":{"id":2417,"nodeType":"Block","src":"11687:74:13","statements":[{"expression":{"id":2411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2409,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11705:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3634","id":2410,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11715:2:13","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"11705:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2412,"nodeType":"ExpressionStatement","src":"11705:12:13"},{"expression":{"id":2415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2413,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"11735:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":2414,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11745:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"11735:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2416,"nodeType":"ExpressionStatement","src":"11735:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2419,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11778:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3332","id":2420,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11787:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"11778:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11792:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11778:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2433,"nodeType":"IfStatement","src":"11774:95:13","trueBody":{"id":2432,"nodeType":"Block","src":"11795:74:13","statements":[{"expression":{"id":2426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2424,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11813:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3332","id":2425,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11823:2:13","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"11813:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2427,"nodeType":"ExpressionStatement","src":"11813:12:13"},{"expression":{"id":2430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2428,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"11843:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":2429,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11853:1:13","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"11843:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2431,"nodeType":"ExpressionStatement","src":"11843:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2434,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11886:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3136","id":2435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11895:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11886:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2437,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11900:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11886:15:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2448,"nodeType":"IfStatement","src":"11882:95:13","trueBody":{"id":2447,"nodeType":"Block","src":"11903:74:13","statements":[{"expression":{"id":2441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2439,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11921:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3136","id":2440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11931:2:13","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11921:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2442,"nodeType":"ExpressionStatement","src":"11921:12:13"},{"expression":{"id":2445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2443,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"11951:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":2444,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11961:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"11951:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2446,"nodeType":"ExpressionStatement","src":"11951:11:13"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2449,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"11994:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"38","id":2450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12003:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"11994:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12007:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11994:14:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2459,"nodeType":"IfStatement","src":"11990:64:13","trueBody":{"id":2458,"nodeType":"Block","src":"12010:44:13","statements":[{"expression":{"id":2456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2454,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"12028:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":2455,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12038:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"12028:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2457,"nodeType":"ExpressionStatement","src":"12028:11:13"}]}}]},{"expression":{"id":2461,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2386,"src":"12080:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2384,"id":2462,"nodeType":"Return","src":"12073:13:13"}]},"documentation":{"id":2378,"nodeType":"StructuredDocumentation","src":"11185:240:13","text":" @dev Return the log in base 256, rounded down, of a positive value.\n Returns 0 if given 0.\n Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string."},"id":2464,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"11439:6:13","nodeType":"FunctionDefinition","parameters":{"id":2381,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2380,"mutability":"mutable","name":"value","nameLocation":"11454:5:13","nodeType":"VariableDeclaration","scope":2464,"src":"11446:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2379,"name":"uint256","nodeType":"ElementaryTypeName","src":"11446:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11445:15:13"},"returnParameters":{"id":2384,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2383,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2464,"src":"11484:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2382,"name":"uint256","nodeType":"ElementaryTypeName","src":"11484:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11483:9:13"},"scope":2504,"src":"11430:663:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2502,"nodeType":"Block","src":"12329:173:13","statements":[{"id":2501,"nodeType":"UncheckedBlock","src":"12339:157:13","statements":[{"assignments":[2476],"declarations":[{"constant":false,"id":2476,"mutability":"mutable","name":"result","nameLocation":"12371:6:13","nodeType":"VariableDeclaration","scope":2501,"src":"12363:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2475,"name":"uint256","nodeType":"ElementaryTypeName","src":"12363:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2480,"initialValue":{"arguments":[{"id":2478,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2467,"src":"12387:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2477,"name":"log256","nodeType":"Identifier","overloadedDeclarations":[2464,2503],"referencedDeclaration":2464,"src":"12380:6:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":2479,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12380:13:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12363:30:13"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2481,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"12414:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"id":2485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2482,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2470,"src":"12424:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":2483,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1646,"src":"12436:8:13","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$1646_$","typeString":"type(enum Math.Rounding)"}},"id":2484,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"12445:2:13","memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":1644,"src":"12436:11:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"src":"12424:23:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2493,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2491,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":2486,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12451:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2487,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"12457:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"38","id":2488,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12466:1:13","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"12457:10:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2490,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12456:12:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12451:17:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2492,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2467,"src":"12471:5:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12451:25:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12424:52:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12483:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"12424:60:13","trueExpression":{"hexValue":"31","id":2495,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12479:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2498,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12423:62:13","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"12414:71:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2474,"id":2500,"nodeType":"Return","src":"12407:78:13"}]}]},"documentation":{"id":2465,"nodeType":"StructuredDocumentation","src":"12099:143:13","text":" @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":2503,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"12256:6:13","nodeType":"FunctionDefinition","parameters":{"id":2471,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2467,"mutability":"mutable","name":"value","nameLocation":"12271:5:13","nodeType":"VariableDeclaration","scope":2503,"src":"12263:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2466,"name":"uint256","nodeType":"ElementaryTypeName","src":"12263:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2470,"mutability":"mutable","name":"rounding","nameLocation":"12287:8:13","nodeType":"VariableDeclaration","scope":2503,"src":"12278:17:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"},"typeName":{"id":2469,"nodeType":"UserDefinedTypeName","pathNode":{"id":2468,"name":"Rounding","nameLocations":["12278:8:13"],"nodeType":"IdentifierPath","referencedDeclaration":1646,"src":"12278:8:13"},"referencedDeclaration":1646,"src":"12278:8:13","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$1646","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"12262:34:13"},"returnParameters":{"id":2474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2473,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2503,"src":"12320:7:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2472,"name":"uint256","nodeType":"ElementaryTypeName","src":"12320:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12319:9:13"},"scope":2504,"src":"12247:255:13","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":2505,"src":"202:12302:13","usedErrors":[]}],"src":"103:12402:13"},"id":13},"contracts/core/BaseAccount.sol":{"ast":{"absolutePath":"contracts/core/BaseAccount.sol","exportedSymbols":{"BaseAccount":[2646],"IAccount":[2901],"IAggregator":[2935],"IEntryPoint":[3139],"INonceManager":[3158],"IStakeManager":[3263],"UserOperation":[3290],"UserOperationLib":[3460],"ValidationData":[2655],"_intersectTimeRange":[2799],"_packValidationData":[2836,2874],"_parseValidationData":[2714],"calldataKeccak":[2884]},"id":2647,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2506,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:14"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":2507,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2647,"sourceUnit":2902,"src":"145:36:14","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":2508,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2647,"sourceUnit":3140,"src":"182:39:14","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/Helpers.sol","file":"./Helpers.sol","id":2509,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2647,"sourceUnit":2885,"src":"222:23:14","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":2511,"name":"IAccount","nameLocations":["513:8:14"],"nodeType":"IdentifierPath","referencedDeclaration":2901,"src":"513:8:14"},"id":2512,"nodeType":"InheritanceSpecifier","src":"513:8:14"}],"canonicalName":"BaseAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":2510,"nodeType":"StructuredDocumentation","src":"247:232:14","text":" Basic account implementation.\n this contract provides the basic logic for implementing the IAccount interface - validateUserOp\n specific account implementation should inherit it and provide the account-specific logic"},"fullyImplemented":false,"id":2646,"linearizedBaseContracts":[2646,2901],"name":"BaseAccount","nameLocation":"498:11:14","nodeType":"ContractDefinition","nodes":[{"global":false,"id":2516,"libraryName":{"id":2513,"name":"UserOperationLib","nameLocations":["534:16:14"],"nodeType":"IdentifierPath","referencedDeclaration":3460,"src":"534:16:14"},"nodeType":"UsingForDirective","src":"528:41:14","typeName":{"id":2515,"nodeType":"UserDefinedTypeName","pathNode":{"id":2514,"name":"UserOperation","nameLocations":["555:13:14"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"555:13:14"},"referencedDeclaration":3290,"src":"555:13:14","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}}},{"constant":true,"id":2519,"mutability":"constant","name":"SIG_VALIDATION_FAILED","nameLocation":"722:21:14","nodeType":"VariableDeclaration","scope":2646,"src":"696:51:14","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2517,"name":"uint256","nodeType":"ElementaryTypeName","src":"696:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":2518,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"746:1:14","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"internal"},{"body":{"id":2535,"nodeType":"Block","src":"993:63:14","statements":[{"expression":{"arguments":[{"arguments":[{"id":2530,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1040:4:14","typeDescriptions":{"typeIdentifier":"t_contract$_BaseAccount_$2646","typeString":"contract BaseAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BaseAccount_$2646","typeString":"contract BaseAccount"}],"id":2529,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1032:7:14","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2528,"name":"address","nodeType":"ElementaryTypeName","src":"1032:7:14","typeDescriptions":{}}},"id":2531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1032:13:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":2532,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1047:1:14","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":2525,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2543,"src":"1010:10:14","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":2526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1010:12:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"id":2527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1023:8:14","memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":3151,"src":"1010:21:14","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint192_$returns$_t_uint256_$","typeString":"function (address,uint192) view external returns (uint256)"}},"id":2533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1010:39:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2524,"id":2534,"nodeType":"Return","src":"1003:46:14"}]},"documentation":{"id":2520,"nodeType":"StructuredDocumentation","src":"754:176:14","text":" Return the account nonce.\n This method returns the next sequential nonce.\n For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"functionSelector":"d087d288","id":2536,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"944:8:14","nodeType":"FunctionDefinition","parameters":{"id":2521,"nodeType":"ParameterList","parameters":[],"src":"952:2:14"},"returnParameters":{"id":2524,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2523,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2536,"src":"984:7:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2522,"name":"uint256","nodeType":"ElementaryTypeName","src":"984:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"983:9:14"},"scope":2646,"src":"935:121:14","stateMutability":"view","virtual":true,"visibility":"public"},{"documentation":{"id":2537,"nodeType":"StructuredDocumentation","src":"1062:137:14","text":" return the entryPoint used by this account.\n subclass should return the current entryPoint used by this account."},"functionSelector":"b0d691fe","id":2543,"implemented":false,"kind":"function","modifiers":[],"name":"entryPoint","nameLocation":"1213:10:14","nodeType":"FunctionDefinition","parameters":{"id":2538,"nodeType":"ParameterList","parameters":[],"src":"1223:2:14"},"returnParameters":{"id":2542,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2541,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2543,"src":"1255:11:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},"typeName":{"id":2540,"nodeType":"UserDefinedTypeName","pathNode":{"id":2539,"name":"IEntryPoint","nameLocations":["1255:11:14"],"nodeType":"IdentifierPath","referencedDeclaration":3139,"src":"1255:11:14"},"referencedDeclaration":3139,"src":"1255:11:14","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1254:13:14"},"scope":2646,"src":"1204:64:14","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[2900],"body":{"id":2576,"nodeType":"Block","src":"1625:186:14","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":2557,"name":"_requireFromEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2594,"src":"1635:22:14","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":2558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1635:24:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2559,"nodeType":"ExpressionStatement","src":"1635:24:14"},{"expression":{"id":2565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2560,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2555,"src":"1669:14:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2562,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2547,"src":"1705:6:14","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":2563,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2549,"src":"1713:10:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2561,"name":"_validateSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2605,"src":"1686:18:14","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_UserOperation_$3290_calldata_ptr_$_t_bytes32_$returns$_t_uint256_$","typeString":"function (struct UserOperation calldata,bytes32) returns (uint256)"}},"id":2564,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1686:38:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1669:55:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2566,"nodeType":"ExpressionStatement","src":"1669:55:14"},{"expression":{"arguments":[{"expression":{"id":2568,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2547,"src":"1749:6:14","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":2569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1756:5:14","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":3271,"src":"1749:12:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2567,"name":"_validateNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2612,"src":"1734:14:14","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$__$","typeString":"function (uint256) view"}},"id":2570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1734:28:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2571,"nodeType":"ExpressionStatement","src":"1734:28:14"},{"expression":{"arguments":[{"id":2573,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2551,"src":"1784:19:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2572,"name":"_payPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2645,"src":"1772:11:14","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":2574,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1772:32:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2575,"nodeType":"ExpressionStatement","src":"1772:32:14"}]},"documentation":{"id":2544,"nodeType":"StructuredDocumentation","src":"1274:179:14","text":" Validate user's signature and nonce.\n subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"functionSelector":"3a871cdd","id":2577,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1467:14:14","nodeType":"FunctionDefinition","overrides":{"id":2553,"nodeType":"OverrideSpecifier","overrides":[],"src":"1575:8:14"},"parameters":{"id":2552,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2547,"mutability":"mutable","name":"userOp","nameLocation":"1505:6:14","nodeType":"VariableDeclaration","scope":2577,"src":"1482:29:14","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":2546,"nodeType":"UserDefinedTypeName","pathNode":{"id":2545,"name":"UserOperation","nameLocations":["1482:13:14"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"1482:13:14"},"referencedDeclaration":3290,"src":"1482:13:14","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":2549,"mutability":"mutable","name":"userOpHash","nameLocation":"1521:10:14","nodeType":"VariableDeclaration","scope":2577,"src":"1513:18:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2548,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1513:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2551,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"1541:19:14","nodeType":"VariableDeclaration","scope":2577,"src":"1533:27:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2550,"name":"uint256","nodeType":"ElementaryTypeName","src":"1533:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1481:80:14"},"returnParameters":{"id":2556,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2555,"mutability":"mutable","name":"validationData","nameLocation":"1609:14:14","nodeType":"VariableDeclaration","scope":2577,"src":"1601:22:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2554,"name":"uint256","nodeType":"ElementaryTypeName","src":"1601:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1600:24:14"},"scope":2646,"src":"1458:353:14","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":2593,"nodeType":"Block","src":"1948:93:14","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2582,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1966:3:14","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1970:6:14","memberName":"sender","nodeType":"MemberAccess","src":"1966:10:14","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":2586,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2543,"src":"1988:10:14","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":2587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1988:12:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}],"id":2585,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1980:7:14","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2584,"name":"address","nodeType":"ElementaryTypeName","src":"1980:7:14","typeDescriptions":{}}},"id":2588,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1980:21:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1966:35:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","id":2590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2003:30:14","typeDescriptions":{"typeIdentifier":"t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50","typeString":"literal_string \"account: not from EntryPoint\""},"value":"account: not from EntryPoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50","typeString":"literal_string \"account: not from EntryPoint\""}],"id":2581,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1958:7:14","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1958:76:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2592,"nodeType":"ExpressionStatement","src":"1958:76:14"}]},"documentation":{"id":2578,"nodeType":"StructuredDocumentation","src":"1817:70:14","text":" ensure the request comes from the known entrypoint."},"id":2594,"implemented":true,"kind":"function","modifiers":[],"name":"_requireFromEntryPoint","nameLocation":"1901:22:14","nodeType":"FunctionDefinition","parameters":{"id":2579,"nodeType":"ParameterList","parameters":[],"src":"1923:2:14"},"returnParameters":{"id":2580,"nodeType":"ParameterList","parameters":[],"src":"1948:0:14"},"scope":2646,"src":"1892:149:14","stateMutability":"view","virtual":true,"visibility":"internal"},{"documentation":{"id":2595,"nodeType":"StructuredDocumentation","src":"2047:904:14","text":" validate the signature is valid for this message.\n @param userOp validate the userOp.signature field\n @param userOpHash convenient field: the hash of the request, to check the signature against\n (also hashes the entrypoint and chain id)\n @return validationData signature and time-range of this operation\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"id":2605,"implemented":false,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"2965:18:14","nodeType":"FunctionDefinition","parameters":{"id":2601,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2598,"mutability":"mutable","name":"userOp","nameLocation":"3007:6:14","nodeType":"VariableDeclaration","scope":2605,"src":"2984:29:14","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":2597,"nodeType":"UserDefinedTypeName","pathNode":{"id":2596,"name":"UserOperation","nameLocations":["2984:13:14"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"2984:13:14"},"referencedDeclaration":3290,"src":"2984:13:14","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":2600,"mutability":"mutable","name":"userOpHash","nameLocation":"3023:10:14","nodeType":"VariableDeclaration","scope":2605,"src":"3015:18:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2599,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3015:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2983:51:14"},"returnParameters":{"id":2604,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2603,"mutability":"mutable","name":"validationData","nameLocation":"3073:14:14","nodeType":"VariableDeclaration","scope":2605,"src":"3065:22:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2602,"name":"uint256","nodeType":"ElementaryTypeName","src":"3065:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3064:24:14"},"scope":2646,"src":"2956:133:14","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":2611,"nodeType":"Block","src":"3801:7:14","statements":[]},"documentation":{"id":2606,"nodeType":"StructuredDocumentation","src":"3095:640:14","text":" Validate the nonce of the UserOperation.\n This method may validate the nonce requirement of this account.\n e.g.\n To limit the nonce to use sequenced UserOps only (no \"out of order\" UserOps):\n `require(nonce < type(uint64).max)`\n For a hypothetical account that *requires* the nonce to be out-of-order:\n `require(nonce & type(uint64).max == 0)`\n The actual nonce uniqueness is managed by the EntryPoint, and thus no other\n action is needed by the account itself.\n @param nonce to validate\n solhint-disable-next-line no-empty-blocks"},"id":2612,"implemented":true,"kind":"function","modifiers":[],"name":"_validateNonce","nameLocation":"3749:14:14","nodeType":"FunctionDefinition","parameters":{"id":2609,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2608,"mutability":"mutable","name":"nonce","nameLocation":"3772:5:14","nodeType":"VariableDeclaration","scope":2612,"src":"3764:13:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2607,"name":"uint256","nodeType":"ElementaryTypeName","src":"3764:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3763:15:14"},"returnParameters":{"id":2610,"nodeType":"ParameterList","parameters":[],"src":"3801:0:14"},"scope":2646,"src":"3740:68:14","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":2644,"nodeType":"Block","src":"4383:270:14","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2620,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2618,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2615,"src":"4397:19:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":2619,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4420:1:14","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4397:24:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2643,"nodeType":"IfStatement","src":"4393:254:14","trueBody":{"id":2642,"nodeType":"Block","src":"4423:224:14","statements":[{"assignments":[2622,null],"declarations":[{"constant":false,"id":2622,"mutability":"mutable","name":"success","nameLocation":"4443:7:14","nodeType":"VariableDeclaration","scope":2642,"src":"4438:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2621,"name":"bool","nodeType":"ElementaryTypeName","src":"4438:4:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":2638,"initialValue":{"arguments":[{"hexValue":"","id":2636,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4534:2:14","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"arguments":[{"expression":{"id":2625,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4463:3:14","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4467:6:14","memberName":"sender","nodeType":"MemberAccess","src":"4463:10:14","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2624,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4455:8:14","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":2623,"name":"address","nodeType":"ElementaryTypeName","src":"4455:8:14","stateMutability":"payable","typeDescriptions":{}}},"id":2627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4455:19:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":2628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4475:4:14","memberName":"call","nodeType":"MemberAccess","src":"4455:24:14","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":2635,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value","gas"],"nodeType":"FunctionCallOptions","options":[{"id":2629,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2615,"src":"4488:19:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"arguments":[{"id":2632,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4520:7:14","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2631,"name":"uint256","nodeType":"ElementaryTypeName","src":"4520:7:14","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":2630,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4515:4:14","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2633,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4515:13:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":2634,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4529:3:14","memberName":"max","nodeType":"MemberAccess","src":"4515:17:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4455:78:14","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":2637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4455:82:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4437:100:14"},{"expression":{"components":[{"id":2639,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2622,"src":"4552:7:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":2640,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4551:9:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2641,"nodeType":"ExpressionStatement","src":"4551:9:14"}]}}]},"documentation":{"id":2613,"nodeType":"StructuredDocumentation","src":"3814:497:14","text":" sends to the entrypoint (msg.sender) the missing funds for this transaction.\n subclass MAY override this method for better funds management\n (e.g. send to the entryPoint more than the minimum required, so that in future transactions\n it will not be required to send again)\n @param missingAccountFunds the minimum value this method should send the entrypoint.\n this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster."},"id":2645,"implemented":true,"kind":"function","modifiers":[],"name":"_payPrefund","nameLocation":"4325:11:14","nodeType":"FunctionDefinition","parameters":{"id":2616,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2615,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"4345:19:14","nodeType":"VariableDeclaration","scope":2645,"src":"4337:27:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2614,"name":"uint256","nodeType":"ElementaryTypeName","src":"4337:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4336:29:14"},"returnParameters":{"id":2617,"nodeType":"ParameterList","parameters":[],"src":"4383:0:14"},"scope":2646,"src":"4316:337:14","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":2647,"src":"480:4175:14","usedErrors":[]}],"src":"36:4620:14"},"id":14},"contracts/core/Helpers.sol":{"ast":{"absolutePath":"contracts/core/Helpers.sol","exportedSymbols":{"ValidationData":[2655],"_intersectTimeRange":[2799],"_packValidationData":[2836,2874],"_parseValidationData":[2714],"calldataKeccak":[2884]},"id":2885,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2648,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:15"},{"canonicalName":"ValidationData","id":2655,"members":[{"constant":false,"id":2650,"mutability":"mutable","name":"aggregator","nameLocation":"730:10:15","nodeType":"VariableDeclaration","scope":2655,"src":"722:18:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2649,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2652,"mutability":"mutable","name":"validAfter","nameLocation":"757:10:15","nodeType":"VariableDeclaration","scope":2655,"src":"750:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2651,"name":"uint48","nodeType":"ElementaryTypeName","src":"750:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":2654,"mutability":"mutable","name":"validUntil","nameLocation":"784:10:15","nodeType":"VariableDeclaration","scope":2655,"src":"777:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2653,"name":"uint48","nodeType":"ElementaryTypeName","src":"777:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"ValidationData","nameLocation":"697:14:15","nodeType":"StructDefinition","scope":2885,"src":"690:111:15","visibility":"public"},{"body":{"id":2713,"nodeType":"Block","src":"997:346:15","statements":[{"assignments":[2664],"declarations":[{"constant":false,"id":2664,"mutability":"mutable","name":"aggregator","nameLocation":"1015:10:15","nodeType":"VariableDeclaration","scope":2713,"src":"1007:18:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2663,"name":"address","nodeType":"ElementaryTypeName","src":"1007:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2672,"initialValue":{"arguments":[{"arguments":[{"id":2669,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2657,"src":"1044:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2668,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1036:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2667,"name":"uint160","nodeType":"ElementaryTypeName","src":"1036:7:15","typeDescriptions":{}}},"id":2670,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1036:23:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":2666,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1028:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2665,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:15","typeDescriptions":{}}},"id":2671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1028:32:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1007:53:15"},{"assignments":[2674],"declarations":[{"constant":false,"id":2674,"mutability":"mutable","name":"validUntil","nameLocation":"1077:10:15","nodeType":"VariableDeclaration","scope":2713,"src":"1070:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2673,"name":"uint48","nodeType":"ElementaryTypeName","src":"1070:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2681,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2677,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2657,"src":"1097:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313630","id":2678,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1115:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1097:21:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2676,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1090:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2675,"name":"uint48","nodeType":"ElementaryTypeName","src":"1090:6:15","typeDescriptions":{}}},"id":2680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1090:29:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1070:49:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2682,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2674,"src":"1133:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":2683,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1147:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1133:15:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2694,"nodeType":"IfStatement","src":"1129:75:15","trueBody":{"id":2693,"nodeType":"Block","src":"1150:54:15","statements":[{"expression":{"id":2691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2685,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2674,"src":"1164:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":2688,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1182:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2687,"name":"uint48","nodeType":"ElementaryTypeName","src":"1182:6:15","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":2686,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1177:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2689,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1177:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":2690,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1190:3:15","memberName":"max","nodeType":"MemberAccess","src":"1177:16:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1164:29:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2692,"nodeType":"ExpressionStatement","src":"1164:29:15"}]}},{"assignments":[2696],"declarations":[{"constant":false,"id":2696,"mutability":"mutable","name":"validAfter","nameLocation":"1220:10:15","nodeType":"VariableDeclaration","scope":2713,"src":"1213:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2695,"name":"uint48","nodeType":"ElementaryTypeName","src":"1213:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2706,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2704,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2699,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2657,"src":"1240:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2702,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3438","id":2700,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1259:2:15","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"313630","id":2701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1264:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1259:8:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2703,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1258:10:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"1240:28:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2698,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1233:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2697,"name":"uint48","nodeType":"ElementaryTypeName","src":"1233:6:15","typeDescriptions":{}}},"id":2705,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1233:36:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1213:56:15"},{"expression":{"arguments":[{"id":2708,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"1301:10:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2709,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2696,"src":"1313:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":2710,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2674,"src":"1325:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2707,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2655,"src":"1286:14:15","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$2655_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":2711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1286:50:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":2662,"id":2712,"nodeType":"Return","src":"1279:57:15"}]},"id":2714,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_parseValidationData","nameLocation":"913:20:15","nodeType":"FunctionDefinition","parameters":{"id":2658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2657,"mutability":"mutable","name":"validationData","nameLocation":"939:14:15","nodeType":"VariableDeclaration","scope":2714,"src":"934:19:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2656,"name":"uint","nodeType":"ElementaryTypeName","src":"934:4:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"933:21:15"},"returnParameters":{"id":2662,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2661,"mutability":"mutable","name":"data","nameLocation":"991:4:15","nodeType":"VariableDeclaration","scope":2714,"src":"969:26:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2660,"nodeType":"UserDefinedTypeName","pathNode":{"id":2659,"name":"ValidationData","nameLocations":["969:14:15"],"nodeType":"IdentifierPath","referencedDeclaration":2655,"src":"969:14:15"},"referencedDeclaration":2655,"src":"969:14:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"968:28:15"},"scope":2885,"src":"904:439:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2798,"nodeType":"Block","src":"1515:804:15","statements":[{"assignments":[2726],"declarations":[{"constant":false,"id":2726,"mutability":"mutable","name":"accountValidationData","nameLocation":"1547:21:15","nodeType":"VariableDeclaration","scope":2798,"src":"1525:43:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2725,"nodeType":"UserDefinedTypeName","pathNode":{"id":2724,"name":"ValidationData","nameLocations":["1525:14:15"],"nodeType":"IdentifierPath","referencedDeclaration":2655,"src":"1525:14:15"},"referencedDeclaration":2655,"src":"1525:14:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":2730,"initialValue":{"arguments":[{"id":2728,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2716,"src":"1592:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2727,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2714,"src":"1571:20:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$2655_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":2729,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1571:36:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1525:82:15"},{"assignments":[2733],"declarations":[{"constant":false,"id":2733,"mutability":"mutable","name":"pmValidationData","nameLocation":"1639:16:15","nodeType":"VariableDeclaration","scope":2798,"src":"1617:38:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2732,"nodeType":"UserDefinedTypeName","pathNode":{"id":2731,"name":"ValidationData","nameLocations":["1617:14:15"],"nodeType":"IdentifierPath","referencedDeclaration":2655,"src":"1617:14:15"},"referencedDeclaration":2655,"src":"1617:14:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":2737,"initialValue":{"arguments":[{"id":2735,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2718,"src":"1679:23:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2734,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2714,"src":"1658:20:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$2655_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":2736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1658:45:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1617:86:15"},{"assignments":[2739],"declarations":[{"constant":false,"id":2739,"mutability":"mutable","name":"aggregator","nameLocation":"1721:10:15","nodeType":"VariableDeclaration","scope":2798,"src":"1713:18:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2738,"name":"address","nodeType":"ElementaryTypeName","src":"1713:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2742,"initialValue":{"expression":{"id":2740,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"1734:21:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2741,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1756:10:15","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2650,"src":"1734:32:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1713:53:15"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2743,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2739,"src":"1780:10:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":2746,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1802:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2745,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1794:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2744,"name":"address","nodeType":"ElementaryTypeName","src":"1794:7:15","typeDescriptions":{}}},"id":2747,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1794:10:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1780:24:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2755,"nodeType":"IfStatement","src":"1776:95:15","trueBody":{"id":2754,"nodeType":"Block","src":"1806:65:15","statements":[{"expression":{"id":2752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2749,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2739,"src":"1820:10:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":2750,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2733,"src":"1833:16:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2751,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1850:10:15","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2650,"src":"1833:27:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1820:40:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2753,"nodeType":"ExpressionStatement","src":"1820:40:15"}]}},{"assignments":[2757],"declarations":[{"constant":false,"id":2757,"mutability":"mutable","name":"validAfter","nameLocation":"1887:10:15","nodeType":"VariableDeclaration","scope":2798,"src":"1880:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2756,"name":"uint48","nodeType":"ElementaryTypeName","src":"1880:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2760,"initialValue":{"expression":{"id":2758,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"1900:21:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2759,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1922:10:15","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2652,"src":"1900:32:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1880:52:15"},{"assignments":[2762],"declarations":[{"constant":false,"id":2762,"mutability":"mutable","name":"validUntil","nameLocation":"1949:10:15","nodeType":"VariableDeclaration","scope":2798,"src":"1942:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2761,"name":"uint48","nodeType":"ElementaryTypeName","src":"1942:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2765,"initialValue":{"expression":{"id":2763,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"1962:21:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2764,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1984:10:15","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2654,"src":"1962:32:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1942:52:15"},{"assignments":[2767],"declarations":[{"constant":false,"id":2767,"mutability":"mutable","name":"pmValidAfter","nameLocation":"2011:12:15","nodeType":"VariableDeclaration","scope":2798,"src":"2004:19:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2766,"name":"uint48","nodeType":"ElementaryTypeName","src":"2004:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2770,"initialValue":{"expression":{"id":2768,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2733,"src":"2026:16:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2769,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2043:10:15","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2652,"src":"2026:27:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2004:49:15"},{"assignments":[2772],"declarations":[{"constant":false,"id":2772,"mutability":"mutable","name":"pmValidUntil","nameLocation":"2070:12:15","nodeType":"VariableDeclaration","scope":2798,"src":"2063:19:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2771,"name":"uint48","nodeType":"ElementaryTypeName","src":"2063:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2775,"initialValue":{"expression":{"id":2773,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2733,"src":"2085:16:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2774,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2102:10:15","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2654,"src":"2085:27:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2063:49:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2776,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2757,"src":"2127:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2777,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2767,"src":"2140:12:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2127:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2783,"nodeType":"IfStatement","src":"2123:56:15","trueBody":{"expression":{"id":2781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2779,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2757,"src":"2154:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2780,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2767,"src":"2167:12:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2154:25:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2782,"nodeType":"ExpressionStatement","src":"2154:25:15"}},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2786,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2784,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2762,"src":"2193:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":2785,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2772,"src":"2206:12:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2193:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2791,"nodeType":"IfStatement","src":"2189:56:15","trueBody":{"expression":{"id":2789,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2787,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2762,"src":"2220:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2788,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2772,"src":"2233:12:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2220:25:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2790,"nodeType":"ExpressionStatement","src":"2220:25:15"}},{"expression":{"arguments":[{"id":2793,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2739,"src":"2277:10:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2794,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2757,"src":"2289:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":2795,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2762,"src":"2301:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2792,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2655,"src":"2262:14:15","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$2655_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":2796,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2262:50:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":2723,"id":2797,"nodeType":"Return","src":"2255:57:15"}]},"id":2799,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_intersectTimeRange","nameLocation":"1401:19:15","nodeType":"FunctionDefinition","parameters":{"id":2719,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2716,"mutability":"mutable","name":"validationData","nameLocation":"1429:14:15","nodeType":"VariableDeclaration","scope":2799,"src":"1421:22:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2715,"name":"uint256","nodeType":"ElementaryTypeName","src":"1421:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2718,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"1453:23:15","nodeType":"VariableDeclaration","scope":2799,"src":"1445:31:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2717,"name":"uint256","nodeType":"ElementaryTypeName","src":"1445:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1420:57:15"},"returnParameters":{"id":2723,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2722,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2799,"src":"1492:21:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2721,"nodeType":"UserDefinedTypeName","pathNode":{"id":2720,"name":"ValidationData","nameLocations":["1492:14:15"],"nodeType":"IdentifierPath","referencedDeclaration":2655,"src":"1492:14:15"},"referencedDeclaration":2655,"src":"1492:14:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"1491:23:15"},"scope":2885,"src":"1392:927:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2835,"nodeType":"Block","src":"2511:127:15","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2810,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2803,"src":"2536:4:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2811,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2541:10:15","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2650,"src":"2536:15:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2809,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2528:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2808,"name":"uint160","nodeType":"ElementaryTypeName","src":"2528:7:15","typeDescriptions":{}}},"id":2812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2528:24:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2819,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2815,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2803,"src":"2564:4:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2816,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2569:10:15","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2654,"src":"2564:15:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2814,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2556:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2813,"name":"uint256","nodeType":"ElementaryTypeName","src":"2556:7:15","typeDescriptions":{}}},"id":2817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2556:24:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":2818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2584:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"2556:31:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2820,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2555:33:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:60:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2824,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2803,"src":"2600:4:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData memory"}},"id":2825,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2605:10:15","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2652,"src":"2600:15:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2823,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2592:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2822,"name":"uint256","nodeType":"ElementaryTypeName","src":"2592:7:15","typeDescriptions":{}}},"id":2826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2592:24:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2829,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":2827,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2621:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":2828,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2627:2:15","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"2621:8:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2830,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2620:10:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"2592:38:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2832,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2591:40:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:103:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2807,"id":2834,"nodeType":"Return","src":"2521:110:15"}]},"documentation":{"id":2800,"nodeType":"StructuredDocumentation","src":"2321:105:15","text":" helper to pack the return value for validateUserOp\n @param data - the ValidationData to pack"},"id":2836,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2440:19:15","nodeType":"FunctionDefinition","parameters":{"id":2804,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2803,"mutability":"mutable","name":"data","nameLocation":"2482:4:15","nodeType":"VariableDeclaration","scope":2836,"src":"2460:26:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2802,"nodeType":"UserDefinedTypeName","pathNode":{"id":2801,"name":"ValidationData","nameLocations":["2460:14:15"],"nodeType":"IdentifierPath","referencedDeclaration":2655,"src":"2460:14:15"},"referencedDeclaration":2655,"src":"2460:14:15","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2655_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"2459:28:15"},"returnParameters":{"id":2807,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2806,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2836,"src":"2502:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2805,"name":"uint256","nodeType":"ElementaryTypeName","src":"2502:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2501:9:15"},"scope":2885,"src":"2431:207:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2873,"nodeType":"Block","src":"3062:112:15","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2871,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2860,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"condition":{"id":2848,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2839,"src":"3080:9:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2850,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3096:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2851,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3080:17:15","trueExpression":{"hexValue":"31","id":2849,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3092:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2852,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3079:19:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2855,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2841,"src":"3110:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2854,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3102:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2853,"name":"uint256","nodeType":"ElementaryTypeName","src":"3102:7:15","typeDescriptions":{}}},"id":2856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3102:19:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":2857,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3125:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"3102:26:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2859,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3101:28:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:50:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2863,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2843,"src":"3141:10:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2862,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3133:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2861,"name":"uint256","nodeType":"ElementaryTypeName","src":"3133:7:15","typeDescriptions":{}}},"id":2864,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3133:19:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2867,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":2865,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3157:3:15","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":2866,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3163:2:15","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"3157:8:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2868,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3156:10:15","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"3133:33:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2870,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3132:35:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:88:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2847,"id":2872,"nodeType":"Return","src":"3072:95:15"}]},"documentation":{"id":2837,"nodeType":"StructuredDocumentation","src":"2640:311:15","text":" helper to pack the return value for validateUserOp, when not using an aggregator\n @param sigFailed - true for signature failure, false for success\n @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n @param validAfter first timestamp this UserOperation is valid"},"id":2874,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2965:19:15","nodeType":"FunctionDefinition","parameters":{"id":2844,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2839,"mutability":"mutable","name":"sigFailed","nameLocation":"2990:9:15","nodeType":"VariableDeclaration","scope":2874,"src":"2985:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2838,"name":"bool","nodeType":"ElementaryTypeName","src":"2985:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2841,"mutability":"mutable","name":"validUntil","nameLocation":"3008:10:15","nodeType":"VariableDeclaration","scope":2874,"src":"3001:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2840,"name":"uint48","nodeType":"ElementaryTypeName","src":"3001:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":2843,"mutability":"mutable","name":"validAfter","nameLocation":"3027:10:15","nodeType":"VariableDeclaration","scope":2874,"src":"3020:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2842,"name":"uint48","nodeType":"ElementaryTypeName","src":"3020:6:15","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2984:54:15"},"returnParameters":{"id":2847,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2846,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2874,"src":"3053:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2845,"name":"uint256","nodeType":"ElementaryTypeName","src":"3053:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3052:9:15"},"scope":2885,"src":"2956:218:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2883,"nodeType":"Block","src":"3429:193:15","statements":[{"AST":{"nodeType":"YulBlock","src":"3448:168:15","statements":[{"nodeType":"YulVariableDeclaration","src":"3462:22:15","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3479:4:15","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3473:5:15"},"nodeType":"YulFunctionCall","src":"3473:11:15"},"variables":[{"name":"mem","nodeType":"YulTypedName","src":"3466:3:15","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3497:22:15","value":{"name":"data.length","nodeType":"YulIdentifier","src":"3508:11:15"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"3501:3:15","type":""}]},{"expression":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3545:3:15"},{"name":"data.offset","nodeType":"YulIdentifier","src":"3550:11:15"},{"name":"len","nodeType":"YulIdentifier","src":"3563:3:15"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"3532:12:15"},"nodeType":"YulFunctionCall","src":"3532:35:15"},"nodeType":"YulExpressionStatement","src":"3532:35:15"},{"nodeType":"YulAssignment","src":"3580:26:15","value":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3597:3:15"},{"name":"len","nodeType":"YulIdentifier","src":"3602:3:15"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"3587:9:15"},"nodeType":"YulFunctionCall","src":"3587:19:15"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"3580:3:15"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2877,"isOffset":false,"isSlot":false,"src":"3508:11:15","suffix":"length","valueSize":1},{"declaration":2877,"isOffset":true,"isSlot":false,"src":"3550:11:15","suffix":"offset","valueSize":1},{"declaration":2880,"isOffset":false,"isSlot":false,"src":"3580:3:15","valueSize":1}],"id":2882,"nodeType":"InlineAssembly","src":"3439:177:15"}]},"documentation":{"id":2875,"nodeType":"StructuredDocumentation","src":"3176:176:15","text":" keccak function over calldata.\n @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it."},"id":2884,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"calldataKeccak","nameLocation":"3366:14:15","nodeType":"FunctionDefinition","parameters":{"id":2878,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2877,"mutability":"mutable","name":"data","nameLocation":"3396:4:15","nodeType":"VariableDeclaration","scope":2884,"src":"3381:19:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2876,"name":"bytes","nodeType":"ElementaryTypeName","src":"3381:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:21:15"},"returnParameters":{"id":2881,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2880,"mutability":"mutable","name":"ret","nameLocation":"3424:3:15","nodeType":"VariableDeclaration","scope":2884,"src":"3416:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2879,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3416:7:15","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3415:13:15"},"scope":2885,"src":"3357:265:15","stateMutability":"pure","virtual":false,"visibility":"internal"}],"src":"36:3587:15"},"id":15},"contracts/interfaces/IAccount.sol":{"ast":{"absolutePath":"contracts/interfaces/IAccount.sol","exportedSymbols":{"IAccount":[2901],"UserOperation":[3290],"UserOperationLib":[3460],"calldataKeccak":[2884]},"id":2902,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2886,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:16"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":2887,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2902,"sourceUnit":3461,"src":"62:29:16","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAccount","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":2901,"linearizedBaseContracts":[2901],"name":"IAccount","nameLocation":"103:8:16","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2888,"nodeType":"StructuredDocumentation","src":"119:1861:16","text":" Validate user's signature and nonce\n the entryPoint will make the call to the recipient only if this validation call returns successfully.\n signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n This allows making a \"simulation call\" without a valid signature\n Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n @dev Must validate caller is the entryPoint.\n Must validate the signature and nonce\n @param userOp the operation that is about to be executed.\n @param userOpHash hash of the user's request data. can be used as the basis for signature.\n @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n The excess is left as a deposit in the entrypoint, for future calls.\n can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"functionSelector":"3a871cdd","id":2900,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1994:14:16","nodeType":"FunctionDefinition","parameters":{"id":2896,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2891,"mutability":"mutable","name":"userOp","nameLocation":"2032:6:16","nodeType":"VariableDeclaration","scope":2900,"src":"2009:29:16","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":2890,"nodeType":"UserDefinedTypeName","pathNode":{"id":2889,"name":"UserOperation","nameLocations":["2009:13:16"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"2009:13:16"},"referencedDeclaration":3290,"src":"2009:13:16","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":2893,"mutability":"mutable","name":"userOpHash","nameLocation":"2048:10:16","nodeType":"VariableDeclaration","scope":2900,"src":"2040:18:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2892,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2040:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2895,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"2068:19:16","nodeType":"VariableDeclaration","scope":2900,"src":"2060:27:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2894,"name":"uint256","nodeType":"ElementaryTypeName","src":"2060:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2008:80:16"},"returnParameters":{"id":2899,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2898,"mutability":"mutable","name":"validationData","nameLocation":"2119:14:16","nodeType":"VariableDeclaration","scope":2900,"src":"2111:22:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2897,"name":"uint256","nodeType":"ElementaryTypeName","src":"2111:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2110:24:16"},"scope":2901,"src":"1985:150:16","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2902,"src":"93:2044:16","usedErrors":[]}],"src":"36:2102:16"},"id":16},"contracts/interfaces/IAggregator.sol":{"ast":{"absolutePath":"contracts/interfaces/IAggregator.sol","exportedSymbols":{"IAggregator":[2935],"UserOperation":[3290],"UserOperationLib":[3460],"calldataKeccak":[2884]},"id":2936,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2903,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:17"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":2904,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2936,"sourceUnit":3461,"src":"62:29:17","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAggregator","contractDependencies":[],"contractKind":"interface","documentation":{"id":2905,"nodeType":"StructuredDocumentation","src":"93:43:17","text":" Aggregated Signatures validator."},"fullyImplemented":false,"id":2935,"linearizedBaseContracts":[2935],"name":"IAggregator","nameLocation":"147:11:17","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2906,"nodeType":"StructuredDocumentation","src":"166:136:17","text":" validate aggregated signature.\n revert if the aggregated signature does not match the given list of operations."},"functionSelector":"e3563a4f","id":2915,"implemented":false,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"316:18:17","nodeType":"FunctionDefinition","parameters":{"id":2913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2910,"mutability":"mutable","name":"userOps","nameLocation":"360:7:17","nodeType":"VariableDeclaration","scope":2915,"src":"335:32:17","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":2908,"nodeType":"UserDefinedTypeName","pathNode":{"id":2907,"name":"UserOperation","nameLocations":["335:13:17"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"335:13:17"},"referencedDeclaration":3290,"src":"335:13:17","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"id":2909,"nodeType":"ArrayTypeName","src":"335:15:17","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":2912,"mutability":"mutable","name":"signature","nameLocation":"384:9:17","nodeType":"VariableDeclaration","scope":2915,"src":"369:24:17","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2911,"name":"bytes","nodeType":"ElementaryTypeName","src":"369:5:17","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"334:60:17"},"returnParameters":{"id":2914,"nodeType":"ParameterList","parameters":[],"src":"408:0:17"},"scope":2935,"src":"307:102:17","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":2916,"nodeType":"StructuredDocumentation","src":"415:576:17","text":" validate signature of a single userOp\n This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n @param userOp the userOperation received from the user.\n @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n (usually empty, unless account and aggregator support some kind of \"multisig\""},"functionSelector":"64c530cd","id":2924,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"1005:23:17","nodeType":"FunctionDefinition","parameters":{"id":2920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2919,"mutability":"mutable","name":"userOp","nameLocation":"1052:6:17","nodeType":"VariableDeclaration","scope":2924,"src":"1029:29:17","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":2918,"nodeType":"UserDefinedTypeName","pathNode":{"id":2917,"name":"UserOperation","nameLocations":["1029:13:17"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"1029:13:17"},"referencedDeclaration":3290,"src":"1029:13:17","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1028:31:17"},"returnParameters":{"id":2923,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2922,"mutability":"mutable","name":"sigForUserOp","nameLocation":"1100:12:17","nodeType":"VariableDeclaration","scope":2924,"src":"1087:25:17","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2921,"name":"bytes","nodeType":"ElementaryTypeName","src":"1087:5:17","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1086:27:17"},"scope":2935,"src":"996:118:17","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":2925,"nodeType":"StructuredDocumentation","src":"1120:368:17","text":" aggregate multiple signatures into a single value.\n This method is called off-chain to calculate the signature to pass with handleOps()\n bundler MAY use optimized custom code perform this aggregation\n @param userOps array of UserOperations to collect the signatures from.\n @return aggregatedSignature the aggregated signature"},"functionSelector":"275e2d79","id":2934,"implemented":false,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"1502:19:17","nodeType":"FunctionDefinition","parameters":{"id":2930,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2929,"mutability":"mutable","name":"userOps","nameLocation":"1547:7:17","nodeType":"VariableDeclaration","scope":2934,"src":"1522:32:17","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":2927,"nodeType":"UserDefinedTypeName","pathNode":{"id":2926,"name":"UserOperation","nameLocations":["1522:13:17"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"1522:13:17"},"referencedDeclaration":3290,"src":"1522:13:17","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"id":2928,"nodeType":"ArrayTypeName","src":"1522:15:17","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"1521:34:17"},"returnParameters":{"id":2933,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2932,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"1592:19:17","nodeType":"VariableDeclaration","scope":2934,"src":"1579:32:17","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2931,"name":"bytes","nodeType":"ElementaryTypeName","src":"1579:5:17","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1578:34:17"},"scope":2935,"src":"1493:120:17","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":2936,"src":"137:1478:17","usedErrors":[]}],"src":"36:1580:17"},"id":17},"contracts/interfaces/IEntryPoint.sol":{"ast":{"absolutePath":"contracts/interfaces/IEntryPoint.sol","exportedSymbols":{"IAggregator":[2935],"IEntryPoint":[3139],"INonceManager":[3158],"IStakeManager":[3263],"UserOperation":[3290],"UserOperationLib":[3460],"calldataKeccak":[2884]},"id":3140,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2937,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:18"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":2938,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3140,"sourceUnit":3461,"src":"311:29:18","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"./IStakeManager.sol","id":2939,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3140,"sourceUnit":3264,"src":"341:29:18","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"./IAggregator.sol","id":2940,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3140,"sourceUnit":2936,"src":"371:27:18","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/INonceManager.sol","file":"./INonceManager.sol","id":2941,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3140,"sourceUnit":3159,"src":"399:29:18","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":2942,"name":"IStakeManager","nameLocations":["455:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3263,"src":"455:13:18"},"id":2943,"nodeType":"InheritanceSpecifier","src":"455:13:18"},{"baseName":{"id":2944,"name":"INonceManager","nameLocations":["470:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3158,"src":"470:13:18"},"id":2945,"nodeType":"InheritanceSpecifier","src":"470:13:18"}],"canonicalName":"IEntryPoint","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":3139,"linearizedBaseContracts":[3139,3158,3263],"name":"IEntryPoint","nameLocation":"440:11:18","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","id":2961,"name":"UserOperationEvent","nameLocation":"1191:18:18","nodeType":"EventDefinition","parameters":{"id":2960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2947,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1226:10:18","nodeType":"VariableDeclaration","scope":2961,"src":"1210:26:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2946,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1210:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2949,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1254:6:18","nodeType":"VariableDeclaration","scope":2961,"src":"1238:22:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2948,"name":"address","nodeType":"ElementaryTypeName","src":"1238:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2951,"indexed":true,"mutability":"mutable","name":"paymaster","nameLocation":"1278:9:18","nodeType":"VariableDeclaration","scope":2961,"src":"1262:25:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2950,"name":"address","nodeType":"ElementaryTypeName","src":"1262:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2953,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"1297:5:18","nodeType":"VariableDeclaration","scope":2961,"src":"1289:13:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2952,"name":"uint256","nodeType":"ElementaryTypeName","src":"1289:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2955,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"1309:7:18","nodeType":"VariableDeclaration","scope":2961,"src":"1304:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2954,"name":"bool","nodeType":"ElementaryTypeName","src":"1304:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2957,"indexed":false,"mutability":"mutable","name":"actualGasCost","nameLocation":"1326:13:18","nodeType":"VariableDeclaration","scope":2961,"src":"1318:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2956,"name":"uint256","nodeType":"ElementaryTypeName","src":"1318:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2959,"indexed":false,"mutability":"mutable","name":"actualGasUsed","nameLocation":"1349:13:18","nodeType":"VariableDeclaration","scope":2961,"src":"1341:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2958,"name":"uint256","nodeType":"ElementaryTypeName","src":"1341:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1209:154:18"},"src":"1185:179:18"},{"anonymous":false,"documentation":{"id":2962,"nodeType":"StructuredDocumentation","src":"1370:333:18","text":" account \"sender\" was deployed.\n @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n @param sender the account that is deployed\n @param factory the factory used to deploy this account (in the initCode)\n @param paymaster the paymaster used by this UserOp"},"eventSelector":"d51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d","id":2972,"name":"AccountDeployed","nameLocation":"1714:15:18","nodeType":"EventDefinition","parameters":{"id":2971,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2964,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1746:10:18","nodeType":"VariableDeclaration","scope":2972,"src":"1730:26:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2963,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1730:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2966,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1774:6:18","nodeType":"VariableDeclaration","scope":2972,"src":"1758:22:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2965,"name":"address","nodeType":"ElementaryTypeName","src":"1758:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2968,"indexed":false,"mutability":"mutable","name":"factory","nameLocation":"1790:7:18","nodeType":"VariableDeclaration","scope":2972,"src":"1782:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2967,"name":"address","nodeType":"ElementaryTypeName","src":"1782:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2970,"indexed":false,"mutability":"mutable","name":"paymaster","nameLocation":"1807:9:18","nodeType":"VariableDeclaration","scope":2972,"src":"1799:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2969,"name":"address","nodeType":"ElementaryTypeName","src":"1799:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1729:88:18"},"src":"1708:110:18"},{"anonymous":false,"documentation":{"id":2973,"nodeType":"StructuredDocumentation","src":"1824:337:18","text":" An event emitted if the UserOperation \"callData\" reverted with non-zero length\n @param userOpHash the request unique identifier.\n @param sender the sender of this request\n @param nonce the nonce used in the request\n @param revertReason - the return bytes from the (reverted) call to \"callData\"."},"eventSelector":"1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201","id":2983,"name":"UserOperationRevertReason","nameLocation":"2172:25:18","nodeType":"EventDefinition","parameters":{"id":2982,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2975,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"2214:10:18","nodeType":"VariableDeclaration","scope":2983,"src":"2198:26:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2974,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2198:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2977,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"2242:6:18","nodeType":"VariableDeclaration","scope":2983,"src":"2226:22:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2976,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2979,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"2258:5:18","nodeType":"VariableDeclaration","scope":2983,"src":"2250:13:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2978,"name":"uint256","nodeType":"ElementaryTypeName","src":"2250:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2981,"indexed":false,"mutability":"mutable","name":"revertReason","nameLocation":"2271:12:18","nodeType":"VariableDeclaration","scope":2983,"src":"2265:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2980,"name":"bytes","nodeType":"ElementaryTypeName","src":"2265:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2197:87:18"},"src":"2166:119:18"},{"anonymous":false,"documentation":{"id":2984,"nodeType":"StructuredDocumentation","src":"2291:158:18","text":" an event emitted by handleOps(), before starting the execution loop.\n any event emitted before this event, is part of the validation."},"eventSelector":"bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972","id":2986,"name":"BeforeExecution","nameLocation":"2460:15:18","nodeType":"EventDefinition","parameters":{"id":2985,"nodeType":"ParameterList","parameters":[],"src":"2475:2:18"},"src":"2454:24:18"},{"anonymous":false,"documentation":{"id":2987,"nodeType":"StructuredDocumentation","src":"2484:101:18","text":" signature aggregator used by the following UserOperationEvents within this bundle."},"eventSelector":"575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d","id":2991,"name":"SignatureAggregatorChanged","nameLocation":"2596:26:18","nodeType":"EventDefinition","parameters":{"id":2990,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2989,"indexed":true,"mutability":"mutable","name":"aggregator","nameLocation":"2639:10:18","nodeType":"VariableDeclaration","scope":2991,"src":"2623:26:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2988,"name":"address","nodeType":"ElementaryTypeName","src":"2623:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2622:28:18"},"src":"2590:61:18"},{"documentation":{"id":2992,"nodeType":"StructuredDocumentation","src":"2657:756:18","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":2998,"name":"FailedOp","nameLocation":"3424:8:18","nodeType":"ErrorDefinition","parameters":{"id":2997,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2994,"mutability":"mutable","name":"opIndex","nameLocation":"3441:7:18","nodeType":"VariableDeclaration","scope":2998,"src":"3433:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2993,"name":"uint256","nodeType":"ElementaryTypeName","src":"3433:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2996,"mutability":"mutable","name":"reason","nameLocation":"3457:6:18","nodeType":"VariableDeclaration","scope":2998,"src":"3450:13:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2995,"name":"string","nodeType":"ElementaryTypeName","src":"3450:6:18","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3432:32:18"},"src":"3418:47:18"},{"documentation":{"id":2999,"nodeType":"StructuredDocumentation","src":"3471:114:18","text":" error case when a signature aggregator fails to verify the aggregated signature it had created."},"errorSelector":"86a9f750","id":3003,"name":"SignatureValidationFailed","nameLocation":"3596:25:18","nodeType":"ErrorDefinition","parameters":{"id":3002,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3001,"mutability":"mutable","name":"aggregator","nameLocation":"3630:10:18","nodeType":"VariableDeclaration","scope":3003,"src":"3622:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3000,"name":"address","nodeType":"ElementaryTypeName","src":"3622:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3621:20:18"},"src":"3590:52:18"},{"documentation":{"id":3004,"nodeType":"StructuredDocumentation","src":"3648:327:18","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":3018,"name":"ValidationResult","nameLocation":"3986:16:18","nodeType":"ErrorDefinition","parameters":{"id":3017,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3007,"mutability":"mutable","name":"returnInfo","nameLocation":"4014:10:18","nodeType":"VariableDeclaration","scope":3018,"src":"4003:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3115_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":3006,"nodeType":"UserDefinedTypeName","pathNode":{"id":3005,"name":"ReturnInfo","nameLocations":["4003:10:18"],"nodeType":"IdentifierPath","referencedDeclaration":3115,"src":"4003:10:18"},"referencedDeclaration":3115,"src":"4003:10:18","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3115_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":3010,"mutability":"mutable","name":"senderInfo","nameLocation":"4044:10:18","nodeType":"VariableDeclaration","scope":3018,"src":"4034:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3009,"nodeType":"UserDefinedTypeName","pathNode":{"id":3008,"name":"StakeInfo","nameLocations":["4034:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4034:9:18"},"referencedDeclaration":3215,"src":"4034:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3013,"mutability":"mutable","name":"factoryInfo","nameLocation":"4066:11:18","nodeType":"VariableDeclaration","scope":3018,"src":"4056:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3012,"nodeType":"UserDefinedTypeName","pathNode":{"id":3011,"name":"StakeInfo","nameLocations":["4056:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4056:9:18"},"referencedDeclaration":3215,"src":"4056:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3016,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4089:13:18","nodeType":"VariableDeclaration","scope":3018,"src":"4079:23:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3015,"nodeType":"UserDefinedTypeName","pathNode":{"id":3014,"name":"StakeInfo","nameLocations":["4079:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4079:9:18"},"referencedDeclaration":3215,"src":"4079:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"4002:101:18"},"src":"3980:124:18"},{"documentation":{"id":3019,"nodeType":"StructuredDocumentation","src":"4110:561:18","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":3036,"name":"ValidationResultWithAggregation","nameLocation":"4682:31:18","nodeType":"ErrorDefinition","parameters":{"id":3035,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3022,"mutability":"mutable","name":"returnInfo","nameLocation":"4725:10:18","nodeType":"VariableDeclaration","scope":3036,"src":"4714:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3115_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":3021,"nodeType":"UserDefinedTypeName","pathNode":{"id":3020,"name":"ReturnInfo","nameLocations":["4714:10:18"],"nodeType":"IdentifierPath","referencedDeclaration":3115,"src":"4714:10:18"},"referencedDeclaration":3115,"src":"4714:10:18","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3115_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":3025,"mutability":"mutable","name":"senderInfo","nameLocation":"4755:10:18","nodeType":"VariableDeclaration","scope":3036,"src":"4745:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3024,"nodeType":"UserDefinedTypeName","pathNode":{"id":3023,"name":"StakeInfo","nameLocations":["4745:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4745:9:18"},"referencedDeclaration":3215,"src":"4745:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3028,"mutability":"mutable","name":"factoryInfo","nameLocation":"4777:11:18","nodeType":"VariableDeclaration","scope":3036,"src":"4767:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3027,"nodeType":"UserDefinedTypeName","pathNode":{"id":3026,"name":"StakeInfo","nameLocations":["4767:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4767:9:18"},"referencedDeclaration":3215,"src":"4767:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3031,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4800:13:18","nodeType":"VariableDeclaration","scope":3036,"src":"4790:23:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3030,"nodeType":"UserDefinedTypeName","pathNode":{"id":3029,"name":"StakeInfo","nameLocations":["4790:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"4790:9:18"},"referencedDeclaration":3215,"src":"4790:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3034,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"4843:14:18","nodeType":"VariableDeclaration","scope":3036,"src":"4823:34:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3121_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":3033,"nodeType":"UserDefinedTypeName","pathNode":{"id":3032,"name":"AggregatorStakeInfo","nameLocations":["4823:19:18"],"nodeType":"IdentifierPath","referencedDeclaration":3121,"src":"4823:19:18"},"referencedDeclaration":3121,"src":"4823:19:18","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3121_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"4713:145:18"},"src":"4676:183:18"},{"documentation":{"id":3037,"nodeType":"StructuredDocumentation","src":"4865:51:18","text":" return value of getSenderAddress"},"errorSelector":"6ca7b806","id":3041,"name":"SenderAddressResult","nameLocation":"4927:19:18","nodeType":"ErrorDefinition","parameters":{"id":3040,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3039,"mutability":"mutable","name":"sender","nameLocation":"4955:6:18","nodeType":"VariableDeclaration","scope":3041,"src":"4947:14:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3038,"name":"address","nodeType":"ElementaryTypeName","src":"4947:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4946:16:18"},"src":"4921:42:18"},{"documentation":{"id":3042,"nodeType":"StructuredDocumentation","src":"4969:51:18","text":" return value of simulateHandleOp"},"errorSelector":"8b7ac980","id":3056,"name":"ExecutionResult","nameLocation":"5031:15:18","nodeType":"ErrorDefinition","parameters":{"id":3055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3044,"mutability":"mutable","name":"preOpGas","nameLocation":"5055:8:18","nodeType":"VariableDeclaration","scope":3056,"src":"5047:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3043,"name":"uint256","nodeType":"ElementaryTypeName","src":"5047:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3046,"mutability":"mutable","name":"paid","nameLocation":"5073:4:18","nodeType":"VariableDeclaration","scope":3056,"src":"5065:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3045,"name":"uint256","nodeType":"ElementaryTypeName","src":"5065:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3048,"mutability":"mutable","name":"validAfter","nameLocation":"5086:10:18","nodeType":"VariableDeclaration","scope":3056,"src":"5079:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3047,"name":"uint48","nodeType":"ElementaryTypeName","src":"5079:6:18","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3050,"mutability":"mutable","name":"validUntil","nameLocation":"5105:10:18","nodeType":"VariableDeclaration","scope":3056,"src":"5098:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3049,"name":"uint48","nodeType":"ElementaryTypeName","src":"5098:6:18","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3052,"mutability":"mutable","name":"targetSuccess","nameLocation":"5122:13:18","nodeType":"VariableDeclaration","scope":3056,"src":"5117:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3051,"name":"bool","nodeType":"ElementaryTypeName","src":"5117:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3054,"mutability":"mutable","name":"targetResult","nameLocation":"5143:12:18","nodeType":"VariableDeclaration","scope":3056,"src":"5137:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3053,"name":"bytes","nodeType":"ElementaryTypeName","src":"5137:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5046:110:18"},"src":"5025:132:18"},{"canonicalName":"IEntryPoint.UserOpsPerAggregator","id":3066,"members":[{"constant":false,"id":3060,"mutability":"mutable","name":"userOps","nameLocation":"5255:7:18","nodeType":"VariableDeclaration","scope":3066,"src":"5239:23:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3058,"nodeType":"UserDefinedTypeName","pathNode":{"id":3057,"name":"UserOperation","nameLocations":["5239:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"5239:13:18"},"referencedDeclaration":3290,"src":"5239:13:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"id":3059,"nodeType":"ArrayTypeName","src":"5239:15:18","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":3063,"mutability":"mutable","name":"aggregator","nameLocation":"5315:10:18","nodeType":"VariableDeclaration","scope":3066,"src":"5303:22:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$2935","typeString":"contract IAggregator"},"typeName":{"id":3062,"nodeType":"UserDefinedTypeName","pathNode":{"id":3061,"name":"IAggregator","nameLocations":["5303:11:18"],"nodeType":"IdentifierPath","referencedDeclaration":2935,"src":"5303:11:18"},"referencedDeclaration":2935,"src":"5303:11:18","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$2935","typeString":"contract IAggregator"}},"visibility":"internal"},{"constant":false,"id":3065,"mutability":"mutable","name":"signature","nameLocation":"5373:9:18","nodeType":"VariableDeclaration","scope":3066,"src":"5367:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3064,"name":"bytes","nodeType":"ElementaryTypeName","src":"5367:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOpsPerAggregator","nameLocation":"5208:20:18","nodeType":"StructDefinition","scope":3139,"src":"5201:188:18","visibility":"public"},{"documentation":{"id":3067,"nodeType":"StructuredDocumentation","src":"5395:368:18","text":" Execute a batch of UserOperation.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":3076,"implemented":false,"kind":"function","modifiers":[],"name":"handleOps","nameLocation":"5777:9:18","nodeType":"FunctionDefinition","parameters":{"id":3074,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3071,"mutability":"mutable","name":"ops","nameLocation":"5812:3:18","nodeType":"VariableDeclaration","scope":3076,"src":"5787:28:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3069,"nodeType":"UserDefinedTypeName","pathNode":{"id":3068,"name":"UserOperation","nameLocations":["5787:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"5787:13:18"},"referencedDeclaration":3290,"src":"5787:13:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"id":3070,"nodeType":"ArrayTypeName","src":"5787:15:18","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3290_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":3073,"mutability":"mutable","name":"beneficiary","nameLocation":"5833:11:18","nodeType":"VariableDeclaration","scope":3076,"src":"5817:27:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3072,"name":"address","nodeType":"ElementaryTypeName","src":"5817:15:18","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"5786:59:18"},"returnParameters":{"id":3075,"nodeType":"ParameterList","parameters":[],"src":"5854:0:18"},"scope":3139,"src":"5768:87:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3077,"nodeType":"StructuredDocumentation","src":"5861:249:18","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":3086,"implemented":false,"kind":"function","modifiers":[],"name":"handleAggregatedOps","nameLocation":"6124:19:18","nodeType":"FunctionDefinition","parameters":{"id":3084,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3081,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"6185:16:18","nodeType":"VariableDeclaration","scope":3086,"src":"6153:48:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3066_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":3079,"nodeType":"UserDefinedTypeName","pathNode":{"id":3078,"name":"UserOpsPerAggregator","nameLocations":["6153:20:18"],"nodeType":"IdentifierPath","referencedDeclaration":3066,"src":"6153:20:18"},"referencedDeclaration":3066,"src":"6153:20:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3066_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":3080,"nodeType":"ArrayTypeName","src":"6153:22:18","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3066_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":3083,"mutability":"mutable","name":"beneficiary","nameLocation":"6227:11:18","nodeType":"VariableDeclaration","scope":3086,"src":"6211:27:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3082,"name":"address","nodeType":"ElementaryTypeName","src":"6211:15:18","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"6143:101:18"},"returnParameters":{"id":3085,"nodeType":"ParameterList","parameters":[],"src":"6253:0:18"},"scope":3139,"src":"6115:139:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3087,"nodeType":"StructuredDocumentation","src":"6260:197:18","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":3095,"implemented":false,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"6471:13:18","nodeType":"FunctionDefinition","parameters":{"id":3091,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3090,"mutability":"mutable","name":"userOp","nameLocation":"6508:6:18","nodeType":"VariableDeclaration","scope":3095,"src":"6485:29:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3089,"nodeType":"UserDefinedTypeName","pathNode":{"id":3088,"name":"UserOperation","nameLocations":["6485:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"6485:13:18"},"referencedDeclaration":3290,"src":"6485:13:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6484:31:18"},"returnParameters":{"id":3094,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3093,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3095,"src":"6539:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3092,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6539:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6538:9:18"},"scope":3139,"src":"6462:86:18","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3096,"nodeType":"StructuredDocumentation","src":"6554:398:18","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":3102,"implemented":false,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"6966:18:18","nodeType":"FunctionDefinition","parameters":{"id":3100,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3099,"mutability":"mutable","name":"userOp","nameLocation":"7008:6:18","nodeType":"VariableDeclaration","scope":3102,"src":"6985:29:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3098,"nodeType":"UserDefinedTypeName","pathNode":{"id":3097,"name":"UserOperation","nameLocations":["6985:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"6985:13:18"},"referencedDeclaration":3290,"src":"6985:13:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6984:31:18"},"returnParameters":{"id":3101,"nodeType":"ParameterList","parameters":[],"src":"7024:0:18"},"scope":3139,"src":"6957:68:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"IEntryPoint.ReturnInfo","id":3115,"members":[{"constant":false,"id":3104,"mutability":"mutable","name":"preOpGas","nameLocation":"7660:8:18","nodeType":"VariableDeclaration","scope":3115,"src":"7652:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3103,"name":"uint256","nodeType":"ElementaryTypeName","src":"7652:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3106,"mutability":"mutable","name":"prefund","nameLocation":"7686:7:18","nodeType":"VariableDeclaration","scope":3115,"src":"7678:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3105,"name":"uint256","nodeType":"ElementaryTypeName","src":"7678:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3108,"mutability":"mutable","name":"sigFailed","nameLocation":"7708:9:18","nodeType":"VariableDeclaration","scope":3115,"src":"7703:14:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3107,"name":"bool","nodeType":"ElementaryTypeName","src":"7703:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3110,"mutability":"mutable","name":"validAfter","nameLocation":"7734:10:18","nodeType":"VariableDeclaration","scope":3115,"src":"7727:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3109,"name":"uint48","nodeType":"ElementaryTypeName","src":"7727:6:18","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3112,"mutability":"mutable","name":"validUntil","nameLocation":"7761:10:18","nodeType":"VariableDeclaration","scope":3115,"src":"7754:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3111,"name":"uint48","nodeType":"ElementaryTypeName","src":"7754:6:18","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3114,"mutability":"mutable","name":"paymasterContext","nameLocation":"7787:16:18","nodeType":"VariableDeclaration","scope":3115,"src":"7781:22:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3113,"name":"bytes","nodeType":"ElementaryTypeName","src":"7781:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"7631:10:18","nodeType":"StructDefinition","scope":3139,"src":"7624:186:18","visibility":"public"},{"canonicalName":"IEntryPoint.AggregatorStakeInfo","id":3121,"members":[{"constant":false,"id":3117,"mutability":"mutable","name":"aggregator","nameLocation":"7990:10:18","nodeType":"VariableDeclaration","scope":3121,"src":"7982:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3116,"name":"address","nodeType":"ElementaryTypeName","src":"7982:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3120,"mutability":"mutable","name":"stakeInfo","nameLocation":"8020:9:18","nodeType":"VariableDeclaration","scope":3121,"src":"8010:19:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3119,"nodeType":"UserDefinedTypeName","pathNode":{"id":3118,"name":"StakeInfo","nameLocations":["8010:9:18"],"nodeType":"IdentifierPath","referencedDeclaration":3215,"src":"8010:9:18"},"referencedDeclaration":3215,"src":"8010:9:18","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3215_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"7952:19:18","nodeType":"StructDefinition","scope":3139,"src":"7945:91:18","visibility":"public"},{"documentation":{"id":3122,"nodeType":"StructuredDocumentation","src":"8042:337:18","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":3127,"implemented":false,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"8393:16:18","nodeType":"FunctionDefinition","parameters":{"id":3125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3124,"mutability":"mutable","name":"initCode","nameLocation":"8423:8:18","nodeType":"VariableDeclaration","scope":3127,"src":"8410:21:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3123,"name":"bytes","nodeType":"ElementaryTypeName","src":"8410:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8409:23:18"},"returnParameters":{"id":3126,"nodeType":"ParameterList","parameters":[],"src":"8441:0:18"},"scope":3139,"src":"8384:58:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3128,"nodeType":"StructuredDocumentation","src":"8449:847:18","text":" simulate full execution of a UserOperation (including both validation and target execution)\n this method will always revert with \"ExecutionResult\".\n it performs full validation of the UserOperation, but ignores signature error.\n an optional target address is called after the userop succeeds, and its value is returned\n (before the entire call is reverted)\n Note that in order to collect the the success/failure of the target call, it must be executed\n with trace enabled to track the emitted events.\n @param op the UserOperation to simulate\n @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n are set to the return from that call.\n @param targetCallData callData to pass to target address"},"functionSelector":"d6383f94","id":3138,"implemented":false,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"9310:16:18","nodeType":"FunctionDefinition","parameters":{"id":3136,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3131,"mutability":"mutable","name":"op","nameLocation":"9350:2:18","nodeType":"VariableDeclaration","scope":3138,"src":"9327:25:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3130,"nodeType":"UserDefinedTypeName","pathNode":{"id":3129,"name":"UserOperation","nameLocations":["9327:13:18"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"9327:13:18"},"referencedDeclaration":3290,"src":"9327:13:18","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":3133,"mutability":"mutable","name":"target","nameLocation":"9362:6:18","nodeType":"VariableDeclaration","scope":3138,"src":"9354:14:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3132,"name":"address","nodeType":"ElementaryTypeName","src":"9354:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3135,"mutability":"mutable","name":"targetCallData","nameLocation":"9385:14:18","nodeType":"VariableDeclaration","scope":3138,"src":"9370:29:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3134,"name":"bytes","nodeType":"ElementaryTypeName","src":"9370:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9326:74:18"},"returnParameters":{"id":3137,"nodeType":"ParameterList","parameters":[],"src":"9409:0:18"},"scope":3139,"src":"9301:109:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3140,"src":"430:8982:18","usedErrors":[2998,3003,3018,3036,3041,3056]}],"src":"163:9251:18"},"id":18},"contracts/interfaces/INonceManager.sol":{"ast":{"absolutePath":"contracts/interfaces/INonceManager.sol","exportedSymbols":{"INonceManager":[3158]},"id":3159,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3141,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:19"},{"abstract":false,"baseContracts":[],"canonicalName":"INonceManager","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":3158,"linearizedBaseContracts":[3158],"name":"INonceManager","nameLocation":"72:13:19","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3142,"nodeType":"StructuredDocumentation","src":"93:416:19","text":" Return the next nonce for this sender.\n Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n But UserOp with different keys can come with arbitrary order.\n @param sender the account address\n @param key the high 192 bit of the nonce\n @return nonce a full nonce to pass for next UserOp with this sender."},"functionSelector":"35567e1a","id":3151,"implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"523:8:19","nodeType":"FunctionDefinition","parameters":{"id":3147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3144,"mutability":"mutable","name":"sender","nameLocation":"540:6:19","nodeType":"VariableDeclaration","scope":3151,"src":"532:14:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3143,"name":"address","nodeType":"ElementaryTypeName","src":"532:7:19","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3146,"mutability":"mutable","name":"key","nameLocation":"556:3:19","nodeType":"VariableDeclaration","scope":3151,"src":"548:11:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":3145,"name":"uint192","nodeType":"ElementaryTypeName","src":"548:7:19","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"531:29:19"},"returnParameters":{"id":3150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3149,"mutability":"mutable","name":"nonce","nameLocation":"596:5:19","nodeType":"VariableDeclaration","scope":3151,"src":"588:13:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3148,"name":"uint256","nodeType":"ElementaryTypeName","src":"588:7:19","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"587:15:19"},"scope":3158,"src":"514:89:19","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3152,"nodeType":"StructuredDocumentation","src":"609:449:19","text":" Manually increment the nonce of the sender.\n This method is exposed just for completeness..\n Account does NOT need to call it, neither during validation, nor elsewhere,\n as the EntryPoint will update the nonce regardless.\n Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n UserOperations will not pay extra for the first transaction with a given key."},"functionSelector":"0bd28e3b","id":3157,"implemented":false,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"1072:14:19","nodeType":"FunctionDefinition","parameters":{"id":3155,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3154,"mutability":"mutable","name":"key","nameLocation":"1095:3:19","nodeType":"VariableDeclaration","scope":3157,"src":"1087:11:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":3153,"name":"uint192","nodeType":"ElementaryTypeName","src":"1087:7:19","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"1086:13:19"},"returnParameters":{"id":3156,"nodeType":"ParameterList","parameters":[],"src":"1108:0:19"},"scope":3158,"src":"1063:46:19","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3159,"src":"62:1049:19","usedErrors":[]}],"src":"36:1076:19"},"id":19},"contracts/interfaces/IStakeManager.sol":{"ast":{"absolutePath":"contracts/interfaces/IStakeManager.sol","exportedSymbols":{"IStakeManager":[3263]},"id":3264,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":3160,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:20"},{"abstract":false,"baseContracts":[],"canonicalName":"IStakeManager","contractDependencies":[],"contractKind":"interface","documentation":{"id":3161,"nodeType":"StructuredDocumentation","src":"67:211:20","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by the staked entity."},"fullyImplemented":false,"id":3263,"linearizedBaseContracts":[3263],"name":"IStakeManager","nameLocation":"289:13:20","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4","id":3167,"name":"Deposited","nameLocation":"316:9:20","nodeType":"EventDefinition","parameters":{"id":3166,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3163,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"351:7:20","nodeType":"VariableDeclaration","scope":3167,"src":"335:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3162,"name":"address","nodeType":"ElementaryTypeName","src":"335:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3165,"indexed":false,"mutability":"mutable","name":"totalDeposit","nameLocation":"376:12:20","nodeType":"VariableDeclaration","scope":3167,"src":"368:20:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3164,"name":"uint256","nodeType":"ElementaryTypeName","src":"368:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"325:69:20"},"src":"310:85:20"},{"anonymous":false,"eventSelector":"d1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb","id":3175,"name":"Withdrawn","nameLocation":"407:9:20","nodeType":"EventDefinition","parameters":{"id":3174,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3169,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"442:7:20","nodeType":"VariableDeclaration","scope":3175,"src":"426:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3168,"name":"address","nodeType":"ElementaryTypeName","src":"426:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3171,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"467:15:20","nodeType":"VariableDeclaration","scope":3175,"src":"459:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3170,"name":"address","nodeType":"ElementaryTypeName","src":"459:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3173,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"500:6:20","nodeType":"VariableDeclaration","scope":3175,"src":"492:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3172,"name":"uint256","nodeType":"ElementaryTypeName","src":"492:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"416:96:20"},"src":"401:112:20"},{"anonymous":false,"documentation":{"id":3176,"nodeType":"StructuredDocumentation","src":"519:52:20","text":"Emitted when stake or unstake delay are modified"},"eventSelector":"a5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01","id":3184,"name":"StakeLocked","nameLocation":"582:11:20","nodeType":"EventDefinition","parameters":{"id":3183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3178,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"619:7:20","nodeType":"VariableDeclaration","scope":3184,"src":"603:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3177,"name":"address","nodeType":"ElementaryTypeName","src":"603:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3180,"indexed":false,"mutability":"mutable","name":"totalStaked","nameLocation":"644:11:20","nodeType":"VariableDeclaration","scope":3184,"src":"636:19:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3179,"name":"uint256","nodeType":"ElementaryTypeName","src":"636:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3182,"indexed":false,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"673:15:20","nodeType":"VariableDeclaration","scope":3184,"src":"665:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3181,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"593:101:20"},"src":"576:119:20"},{"anonymous":false,"documentation":{"id":3185,"nodeType":"StructuredDocumentation","src":"701:52:20","text":"Emitted once a stake is scheduled for withdrawal"},"eventSelector":"fa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a","id":3191,"name":"StakeUnlocked","nameLocation":"764:13:20","nodeType":"EventDefinition","parameters":{"id":3190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3187,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"803:7:20","nodeType":"VariableDeclaration","scope":3191,"src":"787:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3186,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3189,"indexed":false,"mutability":"mutable","name":"withdrawTime","nameLocation":"828:12:20","nodeType":"VariableDeclaration","scope":3191,"src":"820:20:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3188,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"777:69:20"},"src":"758:89:20"},{"anonymous":false,"eventSelector":"b7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3","id":3199,"name":"StakeWithdrawn","nameLocation":"859:14:20","nodeType":"EventDefinition","parameters":{"id":3198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3193,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"899:7:20","nodeType":"VariableDeclaration","scope":3199,"src":"883:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3192,"name":"address","nodeType":"ElementaryTypeName","src":"883:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3195,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"924:15:20","nodeType":"VariableDeclaration","scope":3199,"src":"916:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3194,"name":"address","nodeType":"ElementaryTypeName","src":"916:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3197,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"957:6:20","nodeType":"VariableDeclaration","scope":3199,"src":"949:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3196,"name":"uint256","nodeType":"ElementaryTypeName","src":"949:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"873:96:20"},"src":"853:117:20"},{"canonicalName":"IStakeManager.DepositInfo","id":3210,"members":[{"constant":false,"id":3201,"mutability":"mutable","name":"deposit","nameLocation":"1650:7:20","nodeType":"VariableDeclaration","scope":3210,"src":"1642:15:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":3200,"name":"uint112","nodeType":"ElementaryTypeName","src":"1642:7:20","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":3203,"mutability":"mutable","name":"staked","nameLocation":"1672:6:20","nodeType":"VariableDeclaration","scope":3210,"src":"1667:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3202,"name":"bool","nodeType":"ElementaryTypeName","src":"1667:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3205,"mutability":"mutable","name":"stake","nameLocation":"1696:5:20","nodeType":"VariableDeclaration","scope":3210,"src":"1688:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":3204,"name":"uint112","nodeType":"ElementaryTypeName","src":"1688:7:20","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":3207,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1718:15:20","nodeType":"VariableDeclaration","scope":3210,"src":"1711:22:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":3206,"name":"uint32","nodeType":"ElementaryTypeName","src":"1711:6:20","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":3209,"mutability":"mutable","name":"withdrawTime","nameLocation":"1750:12:20","nodeType":"VariableDeclaration","scope":3210,"src":"1743:19:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3208,"name":"uint48","nodeType":"ElementaryTypeName","src":"1743:6:20","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"DepositInfo","nameLocation":"1620:11:20","nodeType":"StructDefinition","scope":3263,"src":"1613:156:20","visibility":"public"},{"canonicalName":"IStakeManager.StakeInfo","id":3215,"members":[{"constant":false,"id":3212,"mutability":"mutable","name":"stake","nameLocation":"1871:5:20","nodeType":"VariableDeclaration","scope":3215,"src":"1863:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3211,"name":"uint256","nodeType":"ElementaryTypeName","src":"1863:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3214,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1894:15:20","nodeType":"VariableDeclaration","scope":3215,"src":"1886:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3213,"name":"uint256","nodeType":"ElementaryTypeName","src":"1886:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1843:9:20","nodeType":"StructDefinition","scope":3263,"src":"1836:80:20","visibility":"public"},{"documentation":{"id":3216,"nodeType":"StructuredDocumentation","src":"1922:60:20","text":"@return info - full deposit information of given account"},"functionSelector":"5287ce12","id":3224,"implemented":false,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"1996:14:20","nodeType":"FunctionDefinition","parameters":{"id":3219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3218,"mutability":"mutable","name":"account","nameLocation":"2019:7:20","nodeType":"VariableDeclaration","scope":3224,"src":"2011:15:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3217,"name":"address","nodeType":"ElementaryTypeName","src":"2011:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2010:17:20"},"returnParameters":{"id":3223,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3222,"mutability":"mutable","name":"info","nameLocation":"2070:4:20","nodeType":"VariableDeclaration","scope":3224,"src":"2051:23:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3210_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":3221,"nodeType":"UserDefinedTypeName","pathNode":{"id":3220,"name":"DepositInfo","nameLocations":["2051:11:20"],"nodeType":"IdentifierPath","referencedDeclaration":3210,"src":"2051:11:20"},"referencedDeclaration":3210,"src":"2051:11:20","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3210_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"2050:25:20"},"scope":3263,"src":"1987:89:20","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3225,"nodeType":"StructuredDocumentation","src":"2082:56:20","text":"@return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":3232,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2152:9:20","nodeType":"FunctionDefinition","parameters":{"id":3228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3227,"mutability":"mutable","name":"account","nameLocation":"2170:7:20","nodeType":"VariableDeclaration","scope":3232,"src":"2162:15:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3226,"name":"address","nodeType":"ElementaryTypeName","src":"2162:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2161:17:20"},"returnParameters":{"id":3231,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3230,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3232,"src":"2202:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3229,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2201:9:20"},"scope":3263,"src":"2143:68:20","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3233,"nodeType":"StructuredDocumentation","src":"2217:58:20","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":3238,"implemented":false,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"2289:9:20","nodeType":"FunctionDefinition","parameters":{"id":3236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3235,"mutability":"mutable","name":"account","nameLocation":"2307:7:20","nodeType":"VariableDeclaration","scope":3238,"src":"2299:15:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3234,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:20","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2298:17:20"},"returnParameters":{"id":3237,"nodeType":"ParameterList","parameters":[],"src":"2332:0:20"},"scope":3263,"src":"2280:53:20","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":3239,"nodeType":"StructuredDocumentation","src":"2339:201:20","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":3244,"implemented":false,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2554:8:20","nodeType":"FunctionDefinition","parameters":{"id":3242,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3241,"mutability":"mutable","name":"_unstakeDelaySec","nameLocation":"2570:16:20","nodeType":"VariableDeclaration","scope":3244,"src":"2563:23:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":3240,"name":"uint32","nodeType":"ElementaryTypeName","src":"2563:6:20","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2562:25:20"},"returnParameters":{"id":3243,"nodeType":"ParameterList","parameters":[],"src":"2604:0:20"},"scope":3263,"src":"2545:60:20","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":3245,"nodeType":"StructuredDocumentation","src":"2611:128:20","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":3248,"implemented":false,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2753:11:20","nodeType":"FunctionDefinition","parameters":{"id":3246,"nodeType":"ParameterList","parameters":[],"src":"2764:2:20"},"returnParameters":{"id":3247,"nodeType":"ParameterList","parameters":[],"src":"2775:0:20"},"scope":3263,"src":"2744:32:20","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3249,"nodeType":"StructuredDocumentation","src":"2782:194:20","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":3254,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"2990:13:20","nodeType":"FunctionDefinition","parameters":{"id":3252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3251,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3020:15:20","nodeType":"VariableDeclaration","scope":3254,"src":"3004:31:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3250,"name":"address","nodeType":"ElementaryTypeName","src":"3004:15:20","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3003:33:20"},"returnParameters":{"id":3253,"nodeType":"ParameterList","parameters":[],"src":"3045:0:20"},"scope":3263,"src":"2981:65:20","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3255,"nodeType":"StructuredDocumentation","src":"3052:165:20","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":3262,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"3231:10:20","nodeType":"FunctionDefinition","parameters":{"id":3260,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3257,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3258:15:20","nodeType":"VariableDeclaration","scope":3262,"src":"3242:31:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3256,"name":"address","nodeType":"ElementaryTypeName","src":"3242:15:20","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":3259,"mutability":"mutable","name":"withdrawAmount","nameLocation":"3283:14:20","nodeType":"VariableDeclaration","scope":3262,"src":"3275:22:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3258,"name":"uint256","nodeType":"ElementaryTypeName","src":"3275:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3241:57:20"},"returnParameters":{"id":3261,"nodeType":"ParameterList","parameters":[],"src":"3307:0:20"},"scope":3263,"src":"3222:86:20","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3264,"src":"279:3031:20","usedErrors":[]}],"src":"41:3270:20"},"id":20},"contracts/interfaces/UserOperation.sol":{"ast":{"absolutePath":"contracts/interfaces/UserOperation.sol","exportedSymbols":{"UserOperation":[3290],"UserOperationLib":[3460],"calldataKeccak":[2884]},"id":3461,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3265,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:21"},{"absolutePath":"contracts/core/Helpers.sol","file":"../core/Helpers.sol","id":3267,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3461,"sourceUnit":2885,"src":"104:51:21","symbolAliases":[{"foreign":{"id":3266,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2884,"src":"112:14:21","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"canonicalName":"UserOperation","id":3290,"members":[{"constant":false,"id":3269,"mutability":"mutable","name":"sender","nameLocation":"1249:6:21","nodeType":"VariableDeclaration","scope":3290,"src":"1241:14:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3268,"name":"address","nodeType":"ElementaryTypeName","src":"1241:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3271,"mutability":"mutable","name":"nonce","nameLocation":"1273:5:21","nodeType":"VariableDeclaration","scope":3290,"src":"1265:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3270,"name":"uint256","nodeType":"ElementaryTypeName","src":"1265:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3273,"mutability":"mutable","name":"initCode","nameLocation":"1294:8:21","nodeType":"VariableDeclaration","scope":3290,"src":"1288:14:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3272,"name":"bytes","nodeType":"ElementaryTypeName","src":"1288:5:21","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3275,"mutability":"mutable","name":"callData","nameLocation":"1318:8:21","nodeType":"VariableDeclaration","scope":3290,"src":"1312:14:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3274,"name":"bytes","nodeType":"ElementaryTypeName","src":"1312:5:21","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3277,"mutability":"mutable","name":"callGasLimit","nameLocation":"1344:12:21","nodeType":"VariableDeclaration","scope":3290,"src":"1336:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3276,"name":"uint256","nodeType":"ElementaryTypeName","src":"1336:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3279,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"1374:20:21","nodeType":"VariableDeclaration","scope":3290,"src":"1366:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3278,"name":"uint256","nodeType":"ElementaryTypeName","src":"1366:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3281,"mutability":"mutable","name":"preVerificationGas","nameLocation":"1412:18:21","nodeType":"VariableDeclaration","scope":3290,"src":"1404:26:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3280,"name":"uint256","nodeType":"ElementaryTypeName","src":"1404:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3283,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"1448:12:21","nodeType":"VariableDeclaration","scope":3290,"src":"1440:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3282,"name":"uint256","nodeType":"ElementaryTypeName","src":"1440:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3285,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"1478:20:21","nodeType":"VariableDeclaration","scope":3290,"src":"1470:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3284,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3287,"mutability":"mutable","name":"paymasterAndData","nameLocation":"1514:16:21","nodeType":"VariableDeclaration","scope":3290,"src":"1508:22:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3286,"name":"bytes","nodeType":"ElementaryTypeName","src":"1508:5:21","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3289,"mutability":"mutable","name":"signature","nameLocation":"1546:9:21","nodeType":"VariableDeclaration","scope":3290,"src":"1540:15:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3288,"name":"bytes","nodeType":"ElementaryTypeName","src":"1540:5:21","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOperation","nameLocation":"1216:13:21","nodeType":"StructDefinition","scope":3461,"src":"1209:353:21","visibility":"public"},{"abstract":false,"baseContracts":[],"canonicalName":"UserOperationLib","contractDependencies":[],"contractKind":"library","documentation":{"id":3291,"nodeType":"StructuredDocumentation","src":"1564:77:21","text":" Utility functions helpful when working with UserOperation structs."},"fullyImplemented":true,"id":3460,"linearizedBaseContracts":[3460],"name":"UserOperationLib","nameLocation":"1650:16:21","nodeType":"ContractDefinition","nodes":[{"body":{"id":3311,"nodeType":"Block","src":"1756:199:21","statements":[{"assignments":[3300],"declarations":[{"constant":false,"id":3300,"mutability":"mutable","name":"data","nameLocation":"1774:4:21","nodeType":"VariableDeclaration","scope":3311,"src":"1766:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3299,"name":"address","nodeType":"ElementaryTypeName","src":"1766:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3301,"nodeType":"VariableDeclarationStatement","src":"1766:12:21"},{"AST":{"nodeType":"YulBlock","src":"1880:30:21","statements":[{"nodeType":"YulAssignment","src":"1881:28:21","value":{"arguments":[{"name":"userOp","nodeType":"YulIdentifier","src":"1902:6:21"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1889:12:21"},"nodeType":"YulFunctionCall","src":"1889:20:21"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"1881:4:21"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3300,"isOffset":false,"isSlot":false,"src":"1881:4:21","valueSize":1},{"declaration":3294,"isOffset":false,"isSlot":false,"src":"1902:6:21","valueSize":1}],"id":3302,"nodeType":"InlineAssembly","src":"1871:39:21"},{"expression":{"arguments":[{"arguments":[{"id":3307,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3300,"src":"1942:4:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3306,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1934:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":3305,"name":"uint160","nodeType":"ElementaryTypeName","src":"1934:7:21","typeDescriptions":{}}},"id":3308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1934:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":3304,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1926:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3303,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:21","typeDescriptions":{}}},"id":3309,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1926:22:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3298,"id":3310,"nodeType":"Return","src":"1919:29:21"}]},"id":3312,"implemented":true,"kind":"function","modifiers":[],"name":"getSender","nameLocation":"1683:9:21","nodeType":"FunctionDefinition","parameters":{"id":3295,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3294,"mutability":"mutable","name":"userOp","nameLocation":"1716:6:21","nodeType":"VariableDeclaration","scope":3312,"src":"1693:29:21","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3293,"nodeType":"UserDefinedTypeName","pathNode":{"id":3292,"name":"UserOperation","nameLocations":["1693:13:21"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"1693:13:21"},"referencedDeclaration":3290,"src":"1693:13:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1692:31:21"},"returnParameters":{"id":3298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3297,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3312,"src":"1747:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3296,"name":"address","nodeType":"ElementaryTypeName","src":"1747:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1746:9:21"},"scope":3460,"src":"1674:281:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3346,"nodeType":"Block","src":"2176:391:21","statements":[{"id":3345,"nodeType":"UncheckedBlock","src":"2182:379:21","statements":[{"assignments":[3321],"declarations":[{"constant":false,"id":3321,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"2210:12:21","nodeType":"VariableDeclaration","scope":3345,"src":"2202:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3320,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3324,"initialValue":{"expression":{"id":3322,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3315,"src":"2225:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2232:12:21","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3283,"src":"2225:19:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2202:42:21"},{"assignments":[3326],"declarations":[{"constant":false,"id":3326,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"2262:20:21","nodeType":"VariableDeclaration","scope":3345,"src":"2254:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3325,"name":"uint256","nodeType":"ElementaryTypeName","src":"2254:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3329,"initialValue":{"expression":{"id":3327,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3315,"src":"2285:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2292:20:21","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3285,"src":"2285:27:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2254:58:21"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3330,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3321,"src":"2326:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3331,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3326,"src":"2342:20:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2326:36:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3336,"nodeType":"IfStatement","src":"2322:161:21","trueBody":{"id":3335,"nodeType":"Block","src":"2364:119:21","statements":[{"expression":{"id":3333,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3321,"src":"2460:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3319,"id":3334,"nodeType":"Return","src":"2453:19:21"}]}},{"expression":{"arguments":[{"id":3338,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3321,"src":"2503:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3342,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3339,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3326,"src":"2517:20:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":3340,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2540:5:21","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":3341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2546:7:21","memberName":"basefee","nodeType":"MemberAccess","src":"2540:13:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2517:36:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3337,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3459,"src":"2499:3:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":3343,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2499:55:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3319,"id":3344,"nodeType":"Return","src":"2492:62:21"}]}]},"id":3347,"implemented":true,"kind":"function","modifiers":[],"name":"gasPrice","nameLocation":"2104:8:21","nodeType":"FunctionDefinition","parameters":{"id":3316,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3315,"mutability":"mutable","name":"userOp","nameLocation":"2136:6:21","nodeType":"VariableDeclaration","scope":3347,"src":"2113:29:21","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3314,"nodeType":"UserDefinedTypeName","pathNode":{"id":3313,"name":"UserOperation","nameLocations":["2113:13:21"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"2113:13:21"},"referencedDeclaration":3290,"src":"2113:13:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2112:31:21"},"returnParameters":{"id":3319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3318,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3347,"src":"2167:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3317,"name":"uint256","nodeType":"ElementaryTypeName","src":"2167:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2166:9:21"},"scope":3460,"src":"2095:472:21","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3426,"nodeType":"Block","src":"2659:856:21","statements":[{"assignments":[3356],"declarations":[{"constant":false,"id":3356,"mutability":"mutable","name":"sender","nameLocation":"2677:6:21","nodeType":"VariableDeclaration","scope":3426,"src":"2669:14:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3355,"name":"address","nodeType":"ElementaryTypeName","src":"2669:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3360,"initialValue":{"arguments":[{"id":3358,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2696:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":3357,"name":"getSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3312,"src":"2686:9:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3290_calldata_ptr_$returns$_t_address_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":3359,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2686:17:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2669:34:21"},{"assignments":[3362],"declarations":[{"constant":false,"id":3362,"mutability":"mutable","name":"nonce","nameLocation":"2721:5:21","nodeType":"VariableDeclaration","scope":3426,"src":"2713:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3361,"name":"uint256","nodeType":"ElementaryTypeName","src":"2713:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3365,"initialValue":{"expression":{"id":3363,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2729:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2736:5:21","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":3271,"src":"2729:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2713:28:21"},{"assignments":[3367],"declarations":[{"constant":false,"id":3367,"mutability":"mutable","name":"hashInitCode","nameLocation":"2759:12:21","nodeType":"VariableDeclaration","scope":3426,"src":"2751:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3366,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2751:7:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3372,"initialValue":{"arguments":[{"expression":{"id":3369,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2789:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3370,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2796:8:21","memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":3273,"src":"2789:15:21","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3368,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2884,"src":"2774:14:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3371,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2774:31:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2751:54:21"},{"assignments":[3374],"declarations":[{"constant":false,"id":3374,"mutability":"mutable","name":"hashCallData","nameLocation":"2823:12:21","nodeType":"VariableDeclaration","scope":3426,"src":"2815:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3373,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2815:7:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3379,"initialValue":{"arguments":[{"expression":{"id":3376,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2853:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2860:8:21","memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":3275,"src":"2853:15:21","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3375,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2884,"src":"2838:14:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2838:31:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2815:54:21"},{"assignments":[3381],"declarations":[{"constant":false,"id":3381,"mutability":"mutable","name":"callGasLimit","nameLocation":"2887:12:21","nodeType":"VariableDeclaration","scope":3426,"src":"2879:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3380,"name":"uint256","nodeType":"ElementaryTypeName","src":"2879:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3384,"initialValue":{"expression":{"id":3382,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2902:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2909:12:21","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":3277,"src":"2902:19:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2879:42:21"},{"assignments":[3386],"declarations":[{"constant":false,"id":3386,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"2939:20:21","nodeType":"VariableDeclaration","scope":3426,"src":"2931:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3385,"name":"uint256","nodeType":"ElementaryTypeName","src":"2931:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3389,"initialValue":{"expression":{"id":3387,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"2962:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2969:20:21","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":3279,"src":"2962:27:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2931:58:21"},{"assignments":[3391],"declarations":[{"constant":false,"id":3391,"mutability":"mutable","name":"preVerificationGas","nameLocation":"3007:18:21","nodeType":"VariableDeclaration","scope":3426,"src":"2999:26:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3390,"name":"uint256","nodeType":"ElementaryTypeName","src":"2999:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3394,"initialValue":{"expression":{"id":3392,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"3028:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3035:18:21","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":3281,"src":"3028:25:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2999:54:21"},{"assignments":[3396],"declarations":[{"constant":false,"id":3396,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"3071:12:21","nodeType":"VariableDeclaration","scope":3426,"src":"3063:20:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3395,"name":"uint256","nodeType":"ElementaryTypeName","src":"3063:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3399,"initialValue":{"expression":{"id":3397,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"3086:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3093:12:21","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3283,"src":"3086:19:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3063:42:21"},{"assignments":[3401],"declarations":[{"constant":false,"id":3401,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"3123:20:21","nodeType":"VariableDeclaration","scope":3426,"src":"3115:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3400,"name":"uint256","nodeType":"ElementaryTypeName","src":"3115:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3404,"initialValue":{"expression":{"id":3402,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"3146:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3153:20:21","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3285,"src":"3146:27:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3115:58:21"},{"assignments":[3406],"declarations":[{"constant":false,"id":3406,"mutability":"mutable","name":"hashPaymasterAndData","nameLocation":"3191:20:21","nodeType":"VariableDeclaration","scope":3426,"src":"3183:28:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3405,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3183:7:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3411,"initialValue":{"arguments":[{"expression":{"id":3408,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3350,"src":"3229:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3236:16:21","memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":3287,"src":"3229:23:21","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3407,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2884,"src":"3214:14:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3214:39:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3183:70:21"},{"expression":{"arguments":[{"id":3414,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3356,"src":"3295:6:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3415,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3362,"src":"3303:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3416,"name":"hashInitCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3367,"src":"3322:12:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3417,"name":"hashCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3374,"src":"3336:12:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3418,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"3362:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3419,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"3376:20:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3420,"name":"preVerificationGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3391,"src":"3398:18:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3421,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3396,"src":"3430:12:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3422,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3401,"src":"3444:20:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3423,"name":"hashPaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3406,"src":"3478:20:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3412,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3271:3:21","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":3413,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3275:6:21","memberName":"encode","nodeType":"MemberAccess","src":"3271:10:21","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":3424,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3271:237:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":3354,"id":3425,"nodeType":"Return","src":"3264:244:21"}]},"id":3427,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"2582:4:21","nodeType":"FunctionDefinition","parameters":{"id":3351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3350,"mutability":"mutable","name":"userOp","nameLocation":"2610:6:21","nodeType":"VariableDeclaration","scope":3427,"src":"2587:29:21","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3349,"nodeType":"UserDefinedTypeName","pathNode":{"id":3348,"name":"UserOperation","nameLocations":["2587:13:21"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"2587:13:21"},"referencedDeclaration":3290,"src":"2587:13:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2586:31:21"},"returnParameters":{"id":3354,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3353,"mutability":"mutable","name":"ret","nameLocation":"2654:3:21","nodeType":"VariableDeclaration","scope":3427,"src":"2641:16:21","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3352,"name":"bytes","nodeType":"ElementaryTypeName","src":"2641:5:21","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2640:18:21"},"scope":3460,"src":"2573:942:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3441,"nodeType":"Block","src":"3598:47:21","statements":[{"expression":{"arguments":[{"arguments":[{"id":3437,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3430,"src":"3630:6:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":3436,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3427,"src":"3625:4:21","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3290_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":3438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3625:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":3435,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3615:9:21","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":3439,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3615:23:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3434,"id":3440,"nodeType":"Return","src":"3608:30:21"}]},"id":3442,"implemented":true,"kind":"function","modifiers":[],"name":"hash","nameLocation":"3530:4:21","nodeType":"FunctionDefinition","parameters":{"id":3431,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3430,"mutability":"mutable","name":"userOp","nameLocation":"3558:6:21","nodeType":"VariableDeclaration","scope":3442,"src":"3535:29:21","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3429,"nodeType":"UserDefinedTypeName","pathNode":{"id":3428,"name":"UserOperation","nameLocations":["3535:13:21"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"3535:13:21"},"referencedDeclaration":3290,"src":"3535:13:21","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3534:31:21"},"returnParameters":{"id":3434,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3433,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3442,"src":"3589:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3432,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3589:7:21","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3588:9:21"},"scope":3460,"src":"3521:124:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3458,"nodeType":"Block","src":"3718:37:21","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3451,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3444,"src":"3735:1:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3452,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3446,"src":"3739:1:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3735:5:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":3455,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3446,"src":"3747:1:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3735:13:21","trueExpression":{"id":3454,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3444,"src":"3743:1:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3450,"id":3457,"nodeType":"Return","src":"3728:20:21"}]},"id":3459,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"3660:3:21","nodeType":"FunctionDefinition","parameters":{"id":3447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3444,"mutability":"mutable","name":"a","nameLocation":"3672:1:21","nodeType":"VariableDeclaration","scope":3459,"src":"3664:9:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3443,"name":"uint256","nodeType":"ElementaryTypeName","src":"3664:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3446,"mutability":"mutable","name":"b","nameLocation":"3683:1:21","nodeType":"VariableDeclaration","scope":3459,"src":"3675:9:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3445,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3663:22:21"},"returnParameters":{"id":3450,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3449,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3459,"src":"3709:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3448,"name":"uint256","nodeType":"ElementaryTypeName","src":"3709:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3708:9:21"},"scope":3460,"src":"3651:104:21","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":3461,"src":"1642:2115:21","usedErrors":[]}],"src":"36:3722:21"},"id":21},"contracts/samples/SimpleAccount.sol":{"ast":{"absolutePath":"contracts/samples/SimpleAccount.sol","exportedSymbols":{"Address":[1031],"BaseAccount":[2646],"ECDSA":[1627],"ERC1967Upgrade":[327],"IAccount":[2901],"IAggregator":[2935],"IBeacon":[337],"IERC1155Receiver":[663],"IERC165":[1639],"IERC1822Proxiable":[9],"IERC721Receiver":[681],"IERC777Recipient":[701],"IEntryPoint":[3139],"INonceManager":[3158],"IStakeManager":[3263],"Initializable":[506],"Math":[2504],"SimpleAccount":[3784],"StorageSlot":[1091],"Strings":[1266],"TokenCallbackHandler":[3908],"UUPSUpgradeable":[622],"UserOperation":[3290],"UserOperationLib":[3460],"ValidationData":[2655],"_intersectTimeRange":[2799],"_packValidationData":[2836,2874],"_parseValidationData":[2714],"calldataKeccak":[2884]},"id":3785,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3462,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:22"},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":3463,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3785,"sourceUnit":1628,"src":"184:62:22","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","id":3464,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3785,"sourceUnit":507,"src":"247:63:22","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","file":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","id":3465,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3785,"sourceUnit":623,"src":"311:65:22","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BaseAccount.sol","file":"../core/BaseAccount.sol","id":3466,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3785,"sourceUnit":2647,"src":"378:33:22","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/callback/TokenCallbackHandler.sol","file":"./callback/TokenCallbackHandler.sol","id":3467,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3785,"sourceUnit":3909,"src":"412:45:22","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":3469,"name":"BaseAccount","nameLocations":["663:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":2646,"src":"663:11:22"},"id":3470,"nodeType":"InheritanceSpecifier","src":"663:11:22"},{"baseName":{"id":3471,"name":"TokenCallbackHandler","nameLocations":["676:20:22"],"nodeType":"IdentifierPath","referencedDeclaration":3908,"src":"676:20:22"},"id":3472,"nodeType":"InheritanceSpecifier","src":"676:20:22"},{"baseName":{"id":3473,"name":"UUPSUpgradeable","nameLocations":["698:15:22"],"nodeType":"IdentifierPath","referencedDeclaration":622,"src":"698:15:22"},"id":3474,"nodeType":"InheritanceSpecifier","src":"698:15:22"},{"baseName":{"id":3475,"name":"Initializable","nameLocations":["715:13:22"],"nodeType":"IdentifierPath","referencedDeclaration":506,"src":"715:13:22"},"id":3476,"nodeType":"InheritanceSpecifier","src":"715:13:22"}],"canonicalName":"SimpleAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":3468,"nodeType":"StructuredDocumentation","src":"459:177:22","text":" minimal account.\n this is sample minimal account.\n has execute, eth handling methods\n has a single signer that can send requests through the entryPoint."},"fullyImplemented":true,"id":3784,"linearizedBaseContracts":[3784,506,622,327,9,3908,663,1639,681,701,2646,2901],"name":"SimpleAccount","nameLocation":"646:13:22","nodeType":"ContractDefinition","nodes":[{"global":false,"id":3479,"libraryName":{"id":3477,"name":"ECDSA","nameLocations":["741:5:22"],"nodeType":"IdentifierPath","referencedDeclaration":1627,"src":"741:5:22"},"nodeType":"UsingForDirective","src":"735:24:22","typeName":{"id":3478,"name":"bytes32","nodeType":"ElementaryTypeName","src":"751:7:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"constant":false,"functionSelector":"8da5cb5b","id":3481,"mutability":"mutable","name":"owner","nameLocation":"780:5:22","nodeType":"VariableDeclaration","scope":3784,"src":"765:20:22","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3480,"name":"address","nodeType":"ElementaryTypeName","src":"765:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"id":3484,"mutability":"immutable","name":"_entryPoint","nameLocation":"822:11:22","nodeType":"VariableDeclaration","scope":3784,"src":"792:41:22","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},"typeName":{"id":3483,"nodeType":"UserDefinedTypeName","pathNode":{"id":3482,"name":"IEntryPoint","nameLocations":["792:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":3139,"src":"792:11:22"},"referencedDeclaration":3139,"src":"792:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"visibility":"private"},{"anonymous":false,"eventSelector":"47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de","id":3491,"name":"SimpleAccountInitialized","nameLocation":"846:24:22","nodeType":"EventDefinition","parameters":{"id":3490,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3487,"indexed":true,"mutability":"mutable","name":"entryPoint","nameLocation":"891:10:22","nodeType":"VariableDeclaration","scope":3491,"src":"871:30:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},"typeName":{"id":3486,"nodeType":"UserDefinedTypeName","pathNode":{"id":3485,"name":"IEntryPoint","nameLocations":["871:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":3139,"src":"871:11:22"},"referencedDeclaration":3139,"src":"871:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":3489,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"919:5:22","nodeType":"VariableDeclaration","scope":3491,"src":"903:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3488,"name":"address","nodeType":"ElementaryTypeName","src":"903:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"870:55:22"},"src":"840:86:22"},{"body":{"id":3497,"nodeType":"Block","src":"953:40:22","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3493,"name":"_onlyOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3547,"src":"963:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":3494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"963:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3495,"nodeType":"ExpressionStatement","src":"963:12:22"},{"id":3496,"nodeType":"PlaceholderStatement","src":"985:1:22"}]},"id":3498,"name":"onlyOwner","nameLocation":"941:9:22","nodeType":"ModifierDefinition","parameters":{"id":3492,"nodeType":"ParameterList","parameters":[],"src":"950:2:22"},"src":"932:61:22","virtual":false,"visibility":"internal"},{"baseFunctions":[2543],"body":{"id":3508,"nodeType":"Block","src":"1104:35:22","statements":[{"expression":{"id":3506,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3484,"src":"1121:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"functionReturnParameters":3505,"id":3507,"nodeType":"Return","src":"1114:18:22"}]},"documentation":{"id":3499,"nodeType":"StructuredDocumentation","src":"999:27:22","text":"@inheritdoc BaseAccount"},"functionSelector":"b0d691fe","id":3509,"implemented":true,"kind":"function","modifiers":[],"name":"entryPoint","nameLocation":"1040:10:22","nodeType":"FunctionDefinition","overrides":{"id":3501,"nodeType":"OverrideSpecifier","overrides":[],"src":"1073:8:22"},"parameters":{"id":3500,"nodeType":"ParameterList","parameters":[],"src":"1050:2:22"},"returnParameters":{"id":3505,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3504,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3509,"src":"1091:11:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},"typeName":{"id":3503,"nodeType":"UserDefinedTypeName","pathNode":{"id":3502,"name":"IEntryPoint","nameLocations":["1091:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":3139,"src":"1091:11:22"},"referencedDeclaration":3139,"src":"1091:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1090:13:22"},"scope":3784,"src":"1031:108:22","stateMutability":"view","virtual":true,"visibility":"public"},{"body":{"id":3512,"nodeType":"Block","src":"1222:2:22","statements":[]},"id":3513,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3510,"nodeType":"ParameterList","parameters":[],"src":"1202:2:22"},"returnParameters":{"id":3511,"nodeType":"ParameterList","parameters":[],"src":"1222:0:22"},"scope":3784,"src":"1195:29:22","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":3526,"nodeType":"Block","src":"1268:75:22","statements":[{"expression":{"id":3521,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3519,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3484,"src":"1278:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3520,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3516,"src":"1292:12:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"src":"1278:26:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"id":3522,"nodeType":"ExpressionStatement","src":"1278:26:22"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3523,"name":"_disableInitializers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":487,"src":"1314:20:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1314:22:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3525,"nodeType":"ExpressionStatement","src":"1314:22:22"}]},"id":3527,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3517,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3516,"mutability":"mutable","name":"anEntryPoint","nameLocation":"1254:12:22","nodeType":"VariableDeclaration","scope":3527,"src":"1242:24:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},"typeName":{"id":3515,"nodeType":"UserDefinedTypeName","pathNode":{"id":3514,"name":"IEntryPoint","nameLocations":["1242:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":3139,"src":"1242:11:22"},"referencedDeclaration":3139,"src":"1242:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1241:26:22"},"returnParameters":{"id":3518,"nodeType":"ParameterList","parameters":[],"src":"1268:0:22"},"scope":3784,"src":"1230:113:22","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":3546,"nodeType":"Block","src":"1385:197:22","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3531,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1510:3:22","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3532,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1514:6:22","memberName":"sender","nodeType":"MemberAccess","src":"1510:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3533,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"1524:5:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1510:19:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3535,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1533:3:22","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1537:6:22","memberName":"sender","nodeType":"MemberAccess","src":"1533:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":3539,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1555:4:22","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}],"id":3538,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1547:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3537,"name":"address","nodeType":"ElementaryTypeName","src":"1547:7:22","typeDescriptions":{}}},"id":3540,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1547:13:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1533:27:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1510:50:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6f6e6c79206f776e6572","id":3543,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1562:12:22","typeDescriptions":{"typeIdentifier":"t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367","typeString":"literal_string \"only owner\""},"value":"only owner"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367","typeString":"literal_string \"only owner\""}],"id":3530,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1502:7:22","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1502:73:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3545,"nodeType":"ExpressionStatement","src":"1502:73:22"}]},"id":3547,"implemented":true,"kind":"function","modifiers":[],"name":"_onlyOwner","nameLocation":"1358:10:22","nodeType":"FunctionDefinition","parameters":{"id":3528,"nodeType":"ParameterList","parameters":[],"src":"1368:2:22"},"returnParameters":{"id":3529,"nodeType":"ParameterList","parameters":[],"src":"1385:0:22"},"scope":3784,"src":"1349:233:22","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3566,"nodeType":"Block","src":"1756:82:22","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3557,"name":"_requireFromEntryPointOrOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3662,"src":"1766:29:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":3558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1766:31:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3559,"nodeType":"ExpressionStatement","src":"1766:31:22"},{"expression":{"arguments":[{"id":3561,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3550,"src":"1813:4:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3562,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3552,"src":"1819:5:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3563,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3554,"src":"1826:4:22","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3560,"name":"_call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3719,"src":"1807:5:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":3564,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1807:24:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3565,"nodeType":"ExpressionStatement","src":"1807:24:22"}]},"documentation":{"id":3548,"nodeType":"StructuredDocumentation","src":"1588:87:22","text":" execute a transaction (called directly from owner, or by entryPoint)"},"functionSelector":"b61d27f6","id":3567,"implemented":true,"kind":"function","modifiers":[],"name":"execute","nameLocation":"1689:7:22","nodeType":"FunctionDefinition","parameters":{"id":3555,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3550,"mutability":"mutable","name":"dest","nameLocation":"1705:4:22","nodeType":"VariableDeclaration","scope":3567,"src":"1697:12:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3549,"name":"address","nodeType":"ElementaryTypeName","src":"1697:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3552,"mutability":"mutable","name":"value","nameLocation":"1719:5:22","nodeType":"VariableDeclaration","scope":3567,"src":"1711:13:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3551,"name":"uint256","nodeType":"ElementaryTypeName","src":"1711:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3554,"mutability":"mutable","name":"func","nameLocation":"1741:4:22","nodeType":"VariableDeclaration","scope":3567,"src":"1726:19:22","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3553,"name":"bytes","nodeType":"ElementaryTypeName","src":"1726:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1696:50:22"},"returnParameters":{"id":3556,"nodeType":"ParameterList","parameters":[],"src":"1756:0:22"},"scope":3784,"src":"1680:158:22","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":3612,"nodeType":"Block","src":"1981:218:22","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3577,"name":"_requireFromEntryPointOrOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3662,"src":"1991:29:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":3578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1991:31:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3579,"nodeType":"ExpressionStatement","src":"1991:31:22"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3581,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3571,"src":"2040:4:22","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":3582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2045:6:22","memberName":"length","nodeType":"MemberAccess","src":"2040:11:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":3583,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3574,"src":"2055:4:22","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":3584,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2060:6:22","memberName":"length","nodeType":"MemberAccess","src":"2055:11:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2040:26:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"77726f6e67206172726179206c656e67746873","id":3586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2068:21:22","typeDescriptions":{"typeIdentifier":"t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e","typeString":"literal_string \"wrong array lengths\""},"value":"wrong array lengths"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e","typeString":"literal_string \"wrong array lengths\""}],"id":3580,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2032:7:22","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2032:58:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3588,"nodeType":"ExpressionStatement","src":"2032:58:22"},{"body":{"id":3610,"nodeType":"Block","src":"2142:51:22","statements":[{"expression":{"arguments":[{"baseExpression":{"id":3601,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3571,"src":"2162:4:22","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":3603,"indexExpression":{"id":3602,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3590,"src":"2167:1:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2162:7:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":3604,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2171:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"baseExpression":{"id":3605,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3574,"src":"2174:4:22","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":3607,"indexExpression":{"id":3606,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3590,"src":"2179:1:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2174:7:22","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3600,"name":"_call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3719,"src":"2156:5:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":3608,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2156:26:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3609,"nodeType":"ExpressionStatement","src":"2156:26:22"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3596,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3593,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3590,"src":"2120:1:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":3594,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3571,"src":"2124:4:22","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":3595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2129:6:22","memberName":"length","nodeType":"MemberAccess","src":"2124:11:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2120:15:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3611,"initializationExpression":{"assignments":[3590],"declarations":[{"constant":false,"id":3590,"mutability":"mutable","name":"i","nameLocation":"2113:1:22","nodeType":"VariableDeclaration","scope":3611,"src":"2105:9:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3589,"name":"uint256","nodeType":"ElementaryTypeName","src":"2105:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3592,"initialValue":{"hexValue":"30","id":3591,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2117:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2105:13:22"},"loopExpression":{"expression":{"id":3598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2137:3:22","subExpression":{"id":3597,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3590,"src":"2137:1:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3599,"nodeType":"ExpressionStatement","src":"2137:3:22"},"nodeType":"ForStatement","src":"2100:93:22"}]},"documentation":{"id":3568,"nodeType":"StructuredDocumentation","src":"1844:53:22","text":" execute a sequence of transactions"},"functionSelector":"18dfb3c7","id":3613,"implemented":true,"kind":"function","modifiers":[],"name":"executeBatch","nameLocation":"1911:12:22","nodeType":"FunctionDefinition","parameters":{"id":3575,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3571,"mutability":"mutable","name":"dest","nameLocation":"1943:4:22","nodeType":"VariableDeclaration","scope":3613,"src":"1924:23:22","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":3569,"name":"address","nodeType":"ElementaryTypeName","src":"1924:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3570,"nodeType":"ArrayTypeName","src":"1924:9:22","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":3574,"mutability":"mutable","name":"func","nameLocation":"1966:4:22","nodeType":"VariableDeclaration","scope":3613,"src":"1949:21:22","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":3572,"name":"bytes","nodeType":"ElementaryTypeName","src":"1949:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":3573,"nodeType":"ArrayTypeName","src":"1949:7:22","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"}],"src":"1923:48:22"},"returnParameters":{"id":3576,"nodeType":"ParameterList","parameters":[],"src":"1981:0:22"},"scope":3784,"src":"1902:297:22","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":3625,"nodeType":"Block","src":"2547:37:22","statements":[{"expression":{"arguments":[{"id":3622,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3616,"src":"2569:7:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3621,"name":"_initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3641,"src":"2557:11:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3623,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2557:20:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3624,"nodeType":"ExpressionStatement","src":"2557:20:22"}]},"documentation":{"id":3614,"nodeType":"StructuredDocumentation","src":"2205:273:22","text":" @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\n a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\n the implementation by calling `upgradeTo()`"},"functionSelector":"c4d66de8","id":3626,"implemented":true,"kind":"function","modifiers":[{"id":3619,"kind":"modifierInvocation","modifierName":{"id":3618,"name":"initializer","nameLocations":["2535:11:22"],"nodeType":"IdentifierPath","referencedDeclaration":408,"src":"2535:11:22"},"nodeType":"ModifierInvocation","src":"2535:11:22"}],"name":"initialize","nameLocation":"2492:10:22","nodeType":"FunctionDefinition","parameters":{"id":3617,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3616,"mutability":"mutable","name":"anOwner","nameLocation":"2511:7:22","nodeType":"VariableDeclaration","scope":3626,"src":"2503:15:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3615,"name":"address","nodeType":"ElementaryTypeName","src":"2503:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2502:17:22"},"returnParameters":{"id":3620,"nodeType":"ParameterList","parameters":[],"src":"2547:0:22"},"scope":3784,"src":"2483:101:22","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":3640,"nodeType":"Block","src":"2645:91:22","statements":[{"expression":{"id":3633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3631,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"2655:5:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3632,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3628,"src":"2663:7:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2655:15:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3634,"nodeType":"ExpressionStatement","src":"2655:15:22"},{"eventCall":{"arguments":[{"id":3636,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3484,"src":"2710:11:22","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},{"id":3637,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"2723:5:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"},{"typeIdentifier":"t_address","typeString":"address"}],"id":3635,"name":"SimpleAccountInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3491,"src":"2685:24:22","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_contract$_IEntryPoint_$3139_$_t_address_$returns$__$","typeString":"function (contract IEntryPoint,address)"}},"id":3638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2685:44:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3639,"nodeType":"EmitStatement","src":"2680:49:22"}]},"id":3641,"implemented":true,"kind":"function","modifiers":[],"name":"_initialize","nameLocation":"2599:11:22","nodeType":"FunctionDefinition","parameters":{"id":3629,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3628,"mutability":"mutable","name":"anOwner","nameLocation":"2619:7:22","nodeType":"VariableDeclaration","scope":3641,"src":"2611:15:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3627,"name":"address","nodeType":"ElementaryTypeName","src":"2611:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2610:17:22"},"returnParameters":{"id":3630,"nodeType":"ParameterList","parameters":[],"src":"2645:0:22"},"scope":3784,"src":"2590:146:22","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":3661,"nodeType":"Block","src":"2863:120:22","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3645,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2881:3:22","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2885:6:22","memberName":"sender","nodeType":"MemberAccess","src":"2881:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":3649,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[3509],"referencedDeclaration":3509,"src":"2903:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":3650,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2903:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}],"id":3648,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2895:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3647,"name":"address","nodeType":"ElementaryTypeName","src":"2895:7:22","typeDescriptions":{}}},"id":3651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2895:21:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2881:35:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3653,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2920:3:22","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2924:6:22","memberName":"sender","nodeType":"MemberAccess","src":"2920:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3655,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"2934:5:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2920:19:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2881:58:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","id":3658,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2941:34:22","typeDescriptions":{"typeIdentifier":"t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21","typeString":"literal_string \"account: not Owner or EntryPoint\""},"value":"account: not Owner or EntryPoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21","typeString":"literal_string \"account: not Owner or EntryPoint\""}],"id":3644,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2873:7:22","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3659,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2873:103:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3660,"nodeType":"ExpressionStatement","src":"2873:103:22"}]},"id":3662,"implemented":true,"kind":"function","modifiers":[],"name":"_requireFromEntryPointOrOwner","nameLocation":"2817:29:22","nodeType":"FunctionDefinition","parameters":{"id":3642,"nodeType":"ParameterList","parameters":[],"src":"2846:2:22"},"returnParameters":{"id":3643,"nodeType":"ParameterList","parameters":[],"src":"2863:0:22"},"scope":3784,"src":"2808:175:22","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[2605],"body":{"id":3692,"nodeType":"Block","src":"3180:180:22","statements":[{"assignments":[3675],"declarations":[{"constant":false,"id":3675,"mutability":"mutable","name":"hash","nameLocation":"3198:4:22","nodeType":"VariableDeclaration","scope":3692,"src":"3190:12:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3674,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3190:7:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3679,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":3676,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3668,"src":"3205:10:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3216:22:22","memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":1584,"src":"3205:33:22","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":3678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3205:35:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3190:50:22"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3686,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3680,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"3254:5:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"expression":{"id":3683,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3666,"src":"3276:6:22","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3283:9:22","memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":3289,"src":"3276:16:22","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":3681,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3675,"src":"3263:4:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3268:7:22","memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":1393,"src":"3263:12:22","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":3685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3263:30:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3254:39:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3689,"nodeType":"IfStatement","src":"3250:85:22","trueBody":{"expression":{"id":3687,"name":"SIG_VALIDATION_FAILED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2519,"src":"3314:21:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3673,"id":3688,"nodeType":"Return","src":"3307:28:22"}},{"expression":{"hexValue":"30","id":3690,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3352:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":3673,"id":3691,"nodeType":"Return","src":"3345:8:22"}]},"documentation":{"id":3663,"nodeType":"StructuredDocumentation","src":"2989:44:22","text":"implement template method of BaseAccount"},"id":3693,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"3047:18:22","nodeType":"FunctionDefinition","overrides":{"id":3670,"nodeType":"OverrideSpecifier","overrides":[],"src":"3130:8:22"},"parameters":{"id":3669,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3666,"mutability":"mutable","name":"userOp","nameLocation":"3089:6:22","nodeType":"VariableDeclaration","scope":3693,"src":"3066:29:22","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3665,"nodeType":"UserDefinedTypeName","pathNode":{"id":3664,"name":"UserOperation","nameLocations":["3066:13:22"],"nodeType":"IdentifierPath","referencedDeclaration":3290,"src":"3066:13:22"},"referencedDeclaration":3290,"src":"3066:13:22","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3290_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":3668,"mutability":"mutable","name":"userOpHash","nameLocation":"3105:10:22","nodeType":"VariableDeclaration","scope":3693,"src":"3097:18:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3667,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3097:7:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3065:51:22"},"returnParameters":{"id":3673,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3672,"mutability":"mutable","name":"validationData","nameLocation":"3164:14:22","nodeType":"VariableDeclaration","scope":3693,"src":"3156:22:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3671,"name":"uint256","nodeType":"ElementaryTypeName","src":"3156:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3155:24:22"},"scope":3784,"src":"3038:322:22","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":3718,"nodeType":"Block","src":"3440:213:22","statements":[{"assignments":[3703,3705],"declarations":[{"constant":false,"id":3703,"mutability":"mutable","name":"success","nameLocation":"3456:7:22","nodeType":"VariableDeclaration","scope":3718,"src":"3451:12:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3702,"name":"bool","nodeType":"ElementaryTypeName","src":"3451:4:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3705,"mutability":"mutable","name":"result","nameLocation":"3478:6:22","nodeType":"VariableDeclaration","scope":3718,"src":"3465:19:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3704,"name":"bytes","nodeType":"ElementaryTypeName","src":"3465:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":3712,"initialValue":{"arguments":[{"id":3710,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3699,"src":"3515:4:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":3706,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3695,"src":"3488:6:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3707,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3495:4:22","memberName":"call","nodeType":"MemberAccess","src":"3488:11:22","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":3708,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3697,"src":"3508:5:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3488:26:22","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3488:32:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"3450:70:22"},{"condition":{"id":3714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3534:8:22","subExpression":{"id":3713,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3703,"src":"3535:7:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3717,"nodeType":"IfStatement","src":"3530:117:22","trueBody":{"id":3716,"nodeType":"Block","src":"3544:103:22","statements":[{"AST":{"nodeType":"YulBlock","src":"3567:70:22","statements":[{"expression":{"arguments":[{"arguments":[{"name":"result","nodeType":"YulIdentifier","src":"3596:6:22"},{"kind":"number","nodeType":"YulLiteral","src":"3604:2:22","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3592:3:22"},"nodeType":"YulFunctionCall","src":"3592:15:22"},{"arguments":[{"name":"result","nodeType":"YulIdentifier","src":"3615:6:22"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3609:5:22"},"nodeType":"YulFunctionCall","src":"3609:13:22"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3585:6:22"},"nodeType":"YulFunctionCall","src":"3585:38:22"},"nodeType":"YulExpressionStatement","src":"3585:38:22"}]},"evmVersion":"london","externalReferences":[{"declaration":3705,"isOffset":false,"isSlot":false,"src":"3596:6:22","valueSize":1},{"declaration":3705,"isOffset":false,"isSlot":false,"src":"3615:6:22","valueSize":1}],"id":3715,"nodeType":"InlineAssembly","src":"3558:79:22"}]}}]},"id":3719,"implemented":true,"kind":"function","modifiers":[],"name":"_call","nameLocation":"3375:5:22","nodeType":"FunctionDefinition","parameters":{"id":3700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3695,"mutability":"mutable","name":"target","nameLocation":"3389:6:22","nodeType":"VariableDeclaration","scope":3719,"src":"3381:14:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3694,"name":"address","nodeType":"ElementaryTypeName","src":"3381:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3697,"mutability":"mutable","name":"value","nameLocation":"3405:5:22","nodeType":"VariableDeclaration","scope":3719,"src":"3397:13:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3696,"name":"uint256","nodeType":"ElementaryTypeName","src":"3397:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3699,"mutability":"mutable","name":"data","nameLocation":"3425:4:22","nodeType":"VariableDeclaration","scope":3719,"src":"3412:17:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3698,"name":"bytes","nodeType":"ElementaryTypeName","src":"3412:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:50:22"},"returnParameters":{"id":3701,"nodeType":"ParameterList","parameters":[],"src":"3440:0:22"},"scope":3784,"src":"3366:287:22","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3734,"nodeType":"Block","src":"3782:61:22","statements":[{"expression":{"arguments":[{"arguments":[{"id":3730,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3830:4:22","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}],"id":3729,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3822:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3728,"name":"address","nodeType":"ElementaryTypeName","src":"3822:7:22","typeDescriptions":{}}},"id":3731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3822:13:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3725,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[3509],"referencedDeclaration":3509,"src":"3799:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":3726,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3799:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"id":3727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3812:9:22","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":3232,"src":"3799:22:22","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":3732,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3799:37:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3724,"id":3733,"nodeType":"Return","src":"3792:44:22"}]},"documentation":{"id":3720,"nodeType":"StructuredDocumentation","src":"3659:66:22","text":" check current account deposit in the entryPoint"},"functionSelector":"c399ec88","id":3735,"implemented":true,"kind":"function","modifiers":[],"name":"getDeposit","nameLocation":"3739:10:22","nodeType":"FunctionDefinition","parameters":{"id":3721,"nodeType":"ParameterList","parameters":[],"src":"3749:2:22"},"returnParameters":{"id":3724,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3723,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3735,"src":"3773:7:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3722,"name":"uint256","nodeType":"ElementaryTypeName","src":"3773:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3772:9:22"},"scope":3784,"src":"3730:113:22","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":3751,"nodeType":"Block","src":"3963:73:22","statements":[{"expression":{"arguments":[{"arguments":[{"id":3747,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4023:4:22","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$3784","typeString":"contract SimpleAccount"}],"id":3746,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4015:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3745,"name":"address","nodeType":"ElementaryTypeName","src":"4015:7:22","typeDescriptions":{}}},"id":3748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4015:13:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3739,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[3509],"referencedDeclaration":3509,"src":"3973:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":3740,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3973:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"id":3741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3986:9:22","memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":3238,"src":"3973:22:22","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":3744,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":3742,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4004:3:22","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4008:5:22","memberName":"value","nodeType":"MemberAccess","src":"4004:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3973:41:22","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":3749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3973:56:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3750,"nodeType":"ExpressionStatement","src":"3973:56:22"}]},"documentation":{"id":3736,"nodeType":"StructuredDocumentation","src":"3849:72:22","text":" deposit more funds for this account in the entryPoint"},"functionSelector":"4a58db19","id":3752,"implemented":true,"kind":"function","modifiers":[],"name":"addDeposit","nameLocation":"3935:10:22","nodeType":"FunctionDefinition","parameters":{"id":3737,"nodeType":"ParameterList","parameters":[],"src":"3945:2:22"},"returnParameters":{"id":3738,"nodeType":"ParameterList","parameters":[],"src":"3963:0:22"},"scope":3784,"src":"3926:110:22","stateMutability":"payable","virtual":false,"visibility":"public"},{"body":{"id":3769,"nodeType":"Block","src":"4281:65:22","statements":[{"expression":{"arguments":[{"id":3765,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3755,"src":"4315:15:22","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":3766,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3757,"src":"4332:6:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3762,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[3509],"referencedDeclaration":3509,"src":"4291:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$3139_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":3763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4291:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$3139","typeString":"contract IEntryPoint"}},"id":3764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4304:10:22","memberName":"withdrawTo","nodeType":"MemberAccess","referencedDeclaration":3262,"src":"4291:23:22","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256) external"}},"id":3767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4291:48:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3768,"nodeType":"ExpressionStatement","src":"4291:48:22"}]},"documentation":{"id":3753,"nodeType":"StructuredDocumentation","src":"4042:141:22","text":" withdraw value from the account's deposit\n @param withdrawAddress target to send to\n @param amount to withdraw"},"functionSelector":"4d44560d","id":3770,"implemented":true,"kind":"function","modifiers":[{"id":3760,"kind":"modifierInvocation","modifierName":{"id":3759,"name":"onlyOwner","nameLocations":["4271:9:22"],"nodeType":"IdentifierPath","referencedDeclaration":3498,"src":"4271:9:22"},"nodeType":"ModifierInvocation","src":"4271:9:22"}],"name":"withdrawDepositTo","nameLocation":"4197:17:22","nodeType":"FunctionDefinition","parameters":{"id":3758,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3755,"mutability":"mutable","name":"withdrawAddress","nameLocation":"4231:15:22","nodeType":"VariableDeclaration","scope":3770,"src":"4215:31:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3754,"name":"address","nodeType":"ElementaryTypeName","src":"4215:15:22","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":3757,"mutability":"mutable","name":"amount","nameLocation":"4256:6:22","nodeType":"VariableDeclaration","scope":3770,"src":"4248:14:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3756,"name":"uint256","nodeType":"ElementaryTypeName","src":"4248:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4214:49:22"},"returnParameters":{"id":3761,"nodeType":"ParameterList","parameters":[],"src":"4281:0:22"},"scope":3784,"src":"4188:158:22","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[621],"body":{"id":3782,"nodeType":"Block","src":"4429:58:22","statements":[{"expression":{"components":[{"id":3776,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3772,"src":"4440:17:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":3777,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4439:19:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3778,"nodeType":"ExpressionStatement","src":"4439:19:22"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3779,"name":"_onlyOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3547,"src":"4468:10:22","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":3780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4468:12:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3781,"nodeType":"ExpressionStatement","src":"4468:12:22"}]},"id":3783,"implemented":true,"kind":"function","modifiers":[],"name":"_authorizeUpgrade","nameLocation":"4361:17:22","nodeType":"FunctionDefinition","overrides":{"id":3774,"nodeType":"OverrideSpecifier","overrides":[],"src":"4420:8:22"},"parameters":{"id":3773,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3772,"mutability":"mutable","name":"newImplementation","nameLocation":"4387:17:22","nodeType":"VariableDeclaration","scope":3783,"src":"4379:25:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3771,"name":"address","nodeType":"ElementaryTypeName","src":"4379:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4378:27:22"},"returnParameters":{"id":3775,"nodeType":"ParameterList","parameters":[],"src":"4429:0:22"},"scope":3784,"src":"4352:135:22","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":3785,"src":"637:3852:22","usedErrors":[]}],"src":"36:4455:22"},"id":22},"contracts/samples/callback/TokenCallbackHandler.sol":{"ast":{"absolutePath":"contracts/samples/callback/TokenCallbackHandler.sol","exportedSymbols":{"IERC1155Receiver":[663],"IERC165":[1639],"IERC721Receiver":[681],"IERC777Recipient":[701],"TokenCallbackHandler":[3908]},"id":3909,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3786,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:23"},{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","file":"@openzeppelin/contracts/utils/introspection/IERC165.sol","id":3787,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3909,"sourceUnit":1640,"src":"101:65:23","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","file":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","id":3788,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3909,"sourceUnit":702,"src":"167:67:23","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","file":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","id":3789,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3909,"sourceUnit":682,"src":"235:66:23","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","file":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","id":3790,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3909,"sourceUnit":664,"src":"302:68:23","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":3792,"name":"IERC777Recipient","nameLocations":["523:16:23"],"nodeType":"IdentifierPath","referencedDeclaration":701,"src":"523:16:23"},"id":3793,"nodeType":"InheritanceSpecifier","src":"523:16:23"},{"baseName":{"id":3794,"name":"IERC721Receiver","nameLocations":["541:15:23"],"nodeType":"IdentifierPath","referencedDeclaration":681,"src":"541:15:23"},"id":3795,"nodeType":"InheritanceSpecifier","src":"541:15:23"},{"baseName":{"id":3796,"name":"IERC1155Receiver","nameLocations":["558:16:23"],"nodeType":"IdentifierPath","referencedDeclaration":663,"src":"558:16:23"},"id":3797,"nodeType":"InheritanceSpecifier","src":"558:16:23"}],"canonicalName":"TokenCallbackHandler","contractDependencies":[],"contractKind":"contract","documentation":{"id":3791,"nodeType":"StructuredDocumentation","src":"372:117:23","text":" Token callback handler.\n Handles supported tokens' callbacks, allowing account receiving these tokens."},"fullyImplemented":true,"id":3908,"linearizedBaseContracts":[3908,663,1639,681,701],"name":"TokenCallbackHandler","nameLocation":"499:20:23","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[700],"body":{"id":3813,"nodeType":"Block","src":"750:7:23","statements":[]},"functionSelector":"0023de29","id":3814,"implemented":true,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"590:14:23","nodeType":"FunctionDefinition","overrides":{"id":3811,"nodeType":"OverrideSpecifier","overrides":[],"src":"741:8:23"},"parameters":{"id":3810,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3799,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"614:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3798,"name":"address","nodeType":"ElementaryTypeName","src":"614:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3801,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"631:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3800,"name":"address","nodeType":"ElementaryTypeName","src":"631:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3803,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"648:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3802,"name":"address","nodeType":"ElementaryTypeName","src":"648:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3805,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"665:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3804,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3807,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"682:14:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3806,"name":"bytes","nodeType":"ElementaryTypeName","src":"682:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3809,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3814,"src":"706:14:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3808,"name":"bytes","nodeType":"ElementaryTypeName","src":"706:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"604:122:23"},"returnParameters":{"id":3812,"nodeType":"ParameterList","parameters":[],"src":"750:0:23"},"scope":3908,"src":"581:176:23","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[680],"body":{"id":3832,"nodeType":"Block","src":"910:65:23","statements":[{"expression":{"expression":{"expression":{"id":3828,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":681,"src":"927:15:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$681_$","typeString":"type(contract IERC721Receiver)"}},"id":3829,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"943:16:23","memberName":"onERC721Received","nodeType":"MemberAccess","referencedDeclaration":680,"src":"927:32:23","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC721Receiver.onERC721Received(address,address,uint256,bytes calldata) returns (bytes4)"}},"id":3830,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"960:8:23","memberName":"selector","nodeType":"MemberAccess","src":"927:41:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":3827,"id":3831,"nodeType":"Return","src":"920:48:23"}]},"functionSelector":"150b7a02","id":3833,"implemented":true,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"772:16:23","nodeType":"FunctionDefinition","overrides":{"id":3824,"nodeType":"OverrideSpecifier","overrides":[],"src":"884:8:23"},"parameters":{"id":3823,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3816,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3833,"src":"798:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3815,"name":"address","nodeType":"ElementaryTypeName","src":"798:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3818,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3833,"src":"815:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3817,"name":"address","nodeType":"ElementaryTypeName","src":"815:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3820,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3833,"src":"832:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3819,"name":"uint256","nodeType":"ElementaryTypeName","src":"832:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3822,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3833,"src":"849:14:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3821,"name":"bytes","nodeType":"ElementaryTypeName","src":"849:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"788:81:23"},"returnParameters":{"id":3827,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3826,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3833,"src":"902:6:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3825,"name":"bytes4","nodeType":"ElementaryTypeName","src":"902:6:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"901:8:23"},"scope":3908,"src":"763:212:23","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[644],"body":{"id":3853,"nodeType":"Block","src":"1146:67:23","statements":[{"expression":{"expression":{"expression":{"id":3849,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":663,"src":"1163:16:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$663_$","typeString":"type(contract IERC1155Receiver)"}},"id":3850,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1180:17:23","memberName":"onERC1155Received","nodeType":"MemberAccess","referencedDeclaration":644,"src":"1163:34:23","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155Receiver.onERC1155Received(address,address,uint256,uint256,bytes calldata) returns (bytes4)"}},"id":3851,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1198:8:23","memberName":"selector","nodeType":"MemberAccess","src":"1163:43:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":3848,"id":3852,"nodeType":"Return","src":"1156:50:23"}]},"functionSelector":"f23a6e61","id":3854,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"990:17:23","nodeType":"FunctionDefinition","overrides":{"id":3845,"nodeType":"OverrideSpecifier","overrides":[],"src":"1120:8:23"},"parameters":{"id":3844,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3835,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1017:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3834,"name":"address","nodeType":"ElementaryTypeName","src":"1017:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3837,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1034:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3836,"name":"address","nodeType":"ElementaryTypeName","src":"1034:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3839,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1051:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3838,"name":"uint256","nodeType":"ElementaryTypeName","src":"1051:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3841,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1068:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3840,"name":"uint256","nodeType":"ElementaryTypeName","src":"1068:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3843,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1085:14:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3842,"name":"bytes","nodeType":"ElementaryTypeName","src":"1085:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1007:98:23"},"returnParameters":{"id":3848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3847,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3854,"src":"1138:6:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3846,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1138:6:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1137:8:23"},"scope":3908,"src":"981:232:23","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[662],"body":{"id":3876,"nodeType":"Block","src":"1411:72:23","statements":[{"expression":{"expression":{"expression":{"id":3872,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":663,"src":"1428:16:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$663_$","typeString":"type(contract IERC1155Receiver)"}},"id":3873,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1445:22:23","memberName":"onERC1155BatchReceived","nodeType":"MemberAccess","referencedDeclaration":662,"src":"1428:39:23","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155Receiver.onERC1155BatchReceived(address,address,uint256[] calldata,uint256[] calldata,bytes calldata) returns (bytes4)"}},"id":3874,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1468:8:23","memberName":"selector","nodeType":"MemberAccess","src":"1428:48:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":3871,"id":3875,"nodeType":"Return","src":"1421:55:23"}]},"functionSelector":"bc197c81","id":3877,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"1228:22:23","nodeType":"FunctionDefinition","overrides":{"id":3868,"nodeType":"OverrideSpecifier","overrides":[],"src":"1385:8:23"},"parameters":{"id":3867,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3856,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1260:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3855,"name":"address","nodeType":"ElementaryTypeName","src":"1260:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3858,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1277:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3857,"name":"address","nodeType":"ElementaryTypeName","src":"1277:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3861,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1294:18:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":3859,"name":"uint256","nodeType":"ElementaryTypeName","src":"1294:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3860,"nodeType":"ArrayTypeName","src":"1294:9:23","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":3864,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1322:18:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":3862,"name":"uint256","nodeType":"ElementaryTypeName","src":"1322:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3863,"nodeType":"ArrayTypeName","src":"1322:9:23","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":3866,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1350:14:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3865,"name":"bytes","nodeType":"ElementaryTypeName","src":"1350:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1250:120:23"},"returnParameters":{"id":3871,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3870,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3877,"src":"1403:6:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3869,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1403:6:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1402:8:23"},"scope":3908,"src":"1219:264:23","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[1638],"body":{"id":3906,"nodeType":"Block","src":"1582:205:23","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":3890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3885,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3879,"src":"1611:11:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":3887,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":681,"src":"1631:15:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$681_$","typeString":"type(contract IERC721Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$681_$","typeString":"type(contract IERC721Receiver)"}],"id":3886,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1626:4:23","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3888,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1626:21:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Receiver_$681","typeString":"type(contract IERC721Receiver)"}},"id":3889,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1648:11:23","memberName":"interfaceId","nodeType":"MemberAccess","src":"1626:33:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1611:48:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":3896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3891,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3879,"src":"1675:11:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":3893,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":663,"src":"1695:16:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$663_$","typeString":"type(contract IERC1155Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$663_$","typeString":"type(contract IERC1155Receiver)"}],"id":3892,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1690:4:23","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3894,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1690:22:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155Receiver_$663","typeString":"type(contract IERC1155Receiver)"}},"id":3895,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1713:11:23","memberName":"interfaceId","nodeType":"MemberAccess","src":"1690:34:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1675:49:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1611:113:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":3903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3898,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3879,"src":"1740:11:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":3900,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1639,"src":"1760:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$1639_$","typeString":"type(contract IERC165)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC165_$1639_$","typeString":"type(contract IERC165)"}],"id":3899,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1755:4:23","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3901,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1755:13:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC165_$1639","typeString":"type(contract IERC165)"}},"id":3902,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1769:11:23","memberName":"interfaceId","nodeType":"MemberAccess","src":"1755:25:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1740:40:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1611:169:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3884,"id":3905,"nodeType":"Return","src":"1592:188:23"}]},"functionSelector":"01ffc9a7","id":3907,"implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"1498:17:23","nodeType":"FunctionDefinition","overrides":{"id":3881,"nodeType":"OverrideSpecifier","overrides":[],"src":"1558:8:23"},"parameters":{"id":3880,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3879,"mutability":"mutable","name":"interfaceId","nameLocation":"1523:11:23","nodeType":"VariableDeclaration","scope":3907,"src":"1516:18:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3878,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1516:6:23","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1515:20:23"},"returnParameters":{"id":3884,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3883,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3907,"src":"1576:4:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3882,"name":"bool","nodeType":"ElementaryTypeName","src":"1576:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1575:6:23"},"scope":3908,"src":"1489:298:23","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":3909,"src":"490:1299:23","usedErrors":[]}],"src":"36:1754:23"},"id":23}},"contracts":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"IERC1822Proxiable":{"abi":[{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"proxiableUUID()":"52d1902d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.\",\"kind\":\"dev\",\"methods\":{\"proxiableUUID()\":{\"details\":\"Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":\"IERC1822Proxiable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]}},\"version\":1}"}},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"ERC1967Upgrade":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"}],\"devdoc\":{\"custom:oz-upgrades-unsafe-allow\":\"delegatecall\",\"details\":\"This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_ADMIN_SLOT\":{\"details\":\"Storage slot with the admin of the contract. This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is validated in the constructor.\"},\"_BEACON_SLOT\":{\"details\":\"The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\"},\"_IMPLEMENTATION_SLOT\":{\"details\":\"Storage slot with the address of the current implementation. This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is validated in the constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":\"ERC1967Upgrade\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8\",\"dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725\"]},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]}},\"version\":1}"}},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"IBeacon":{"abi":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"implementation()":"5c60da1b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the interface that {BeaconProxy} expects of its beacon.\",\"kind\":\"dev\",\"methods\":{\"implementation()\":{\"details\":\"Must return an address that can be used as a delegate call target. {BeaconProxy} will check that this address is a contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":\"IBeacon\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]}},\"version\":1}"}},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"Initializable":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"}],\"devdoc\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor constructor() { _disableInitializers(); } ``` ====\",\"details\":\"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. The initialization functions use a version number. Once a version number is used, it is consumed and cannot be reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in case an upgrade adds a module that needs to be initialized. For example: [.hljs-theme-light.nopadding] ``` contract MyToken is ERC20Upgradeable { function initialize() initializer public { __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\"); } } contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { function initializeV2() reinitializer(2) public { __ERC20Permit_init(\\\"MyToken\\\"); } } ``` TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. [CAUTION] ==== Avoid leaving a contract uninitialized. An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: [.hljs-theme-light.nopadding] ```\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_initialized\":{\"custom:oz-retyped-from\":\"bool\",\"details\":\"Indicates that the contract has been initialized.\"},\"_initializing\":{\"details\":\"Indicates that the contract is in the process of being initialized.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":\"Initializable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://546651335214a63d1ea3b1d3297228a1df2165f17063b2e45b589ade861ddedc\",\"dweb:/ipfs/QmNwpHiPBRB6dmNz9WLVYvy2kUhYHZgWBMWRcoDuMsuZt9\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]}},\"version\":1}"}},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"UUPSUpgradeable":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"proxiableUUID()":"52d1902d","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing `UUPSUpgradeable` with a custom implementation of upgrades. The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. _Available since v4.1._\",\"kind\":\"dev\",\"methods\":{\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"__self\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable state-variable-assignment\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":\"UUPSUpgradeable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8\",\"dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725\"]},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://47e5b84668f9b898617da72e91a32559c6975357e267559b3e4ace0d0ca4a6a8\",\"dweb:/ipfs/QmUCVFEpcNdHfNpotEDnMRUeAGPShTcxrtzo3xpNJHZ67e\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]}},\"version\":1}"}},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"IERC1155Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"_Available since v3.1._\",\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"ids\":\"An array containing ids of each token being transferred (order and length must match values array)\",\"operator\":\"The address which initiated the batch transfer (i.e. msg.sender)\",\"values\":\"An array containing amounts of each token being transferred (order and length must match ids array)\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"id\":\"The ID of the token being transferred\",\"operator\":\"The address which initiated the transfer (i.e. msg.sender)\",\"value\":\"The amount of tokens being transferred\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":\"IERC1155Receiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec\",\"dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}"}},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"IERC721Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\"}},\"title\":\"ERC721 token receiver interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":\"IERC721Receiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708\",\"dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV\"]}},\"version\":1}"}},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"IERC777Recipient":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"userData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC777TokensRecipient standard as defined in the EIP. Accounts can be notified of {IERC777} tokens being sent to them by having a contract implement this interface (contract holders can be their own implementer) and registering it on the https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. See {IERC1820Registry} and {ERC1820Implementer}.\",\"kind\":\"dev\",\"methods\":{\"tokensReceived(address,address,address,uint256,bytes,bytes)\":{\"details\":\"Called by an {IERC777} token contract whenever tokens are being moved or created into a registered account (`to`). The type of operation is conveyed by `from` being the zero address or not. This call occurs _after_ the token contract's state is updated, so {IERC777-balanceOf}, etc., can be used to query the post-operation state. This function may revert to prevent the operation from being executed.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":\"IERC777Recipient\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04c0cd697050a6516b7779aa2343ad2d0e5217d8915ac2382681dfdf4e445be3\",\"dweb:/ipfs/QmPCBCZgm7pHBwwogE2F9NCN3UfTdLNhqc8UDEvw8kDzyA\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/Address.sol":{"Address":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122051065f02f0881a3c0be5a358e5c11b6b572db1c71aec726fa57155350078649b64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MLOAD MOD 0x5F MUL CREATE DUP9 BYTE EXTCODECOPY SIGNEXTEND 0xE5 LOG3 PC 0xE5 0xC1 SHL PUSH12 0x572DB1C71AEC726FA5715535 STOP PUSH25 0x649B64736F6C63430008110033000000000000000000000000 ","sourceMap":"194:8964:8:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122051065f02f0881a3c0be5a358e5c11b6b572db1c71aec726fa57155350078649b64736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MLOAD MOD 0x5F MUL CREATE DUP9 BYTE EXTCODECOPY SIGNEXTEND 0xE5 LOG3 PC 0xE5 0xC1 SHL PUSH12 0x572DB1C71AEC726FA5715535 STOP PUSH25 0x649B64736F6C63430008110033000000000000000000000000 ","sourceMap":"194:8964:8:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/StorageSlot.sol":{"StorageSlot":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212209c18ce67586f07d2906765728930b3677ce62b0317ec51a5c440a8b46c9a45d364736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 XOR 0xCE PUSH8 0x586F07D290676572 DUP10 ADDRESS 0xB3 PUSH8 0x7CE62B0317EC51A5 0xC4 BLOCKHASH 0xA8 0xB4 PUSH13 0x9A45D364736F6C634300081100 CALLER ","sourceMap":"1279:1391:9:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212209c18ce67586f07d2906765728930b3677ce62b0317ec51a5c440a8b46c9a45d364736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 XOR 0xCE PUSH8 0x586F07D290676572 DUP10 ADDRESS 0xB3 PUSH8 0x7CE62B0317EC51A5 0xC4 BLOCKHASH 0xA8 0xB4 PUSH13 0x9A45D364736F6C634300081100 CALLER ","sourceMap":"1279:1391:9:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ``` contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/Strings.sol":{"Strings":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220e458f080a3b6e89cf09e23f5535082acfc5b011072b249a0bbd786dab168d56364736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE4 PC CREATE DUP1 LOG3 0xB6 0xE8 SWAP13 CREATE SWAP15 0x23 CREATE2 MSTORE8 POP DUP3 0xAC 0xFC JUMPDEST ADD LT PUSH19 0xB249A0BBD786DAB168D56364736F6C63430008 GT STOP CALLER ","sourceMap":"188:2065:10:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220e458f080a3b6e89cf09e23f5535082acfc5b011072b249a0bbd786dab168d56364736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE4 PC CREATE DUP1 LOG3 0xB6 0xE8 SWAP13 CREATE SWAP15 0x23 CREATE2 MSTORE8 POP DUP3 0xAC 0xFC JUMPDEST ADD LT PUSH19 0xB249A0BBD786DAB168D56364736F6C63430008 GT STOP CALLER ","sourceMap":"188:2065:10:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"String operations.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Strings.sol\":\"Strings\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ECDSA":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a8db2caa44e4c8583ac14f46ad3c359eb75e8c5f19cfff9bb011bef7a8c6d08d64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA8 0xDB 0x2C 0xAA DIFFICULTY 0xE4 0xC8 PC GASPRICE 0xC1 0x4F CHAINID 0xAD EXTCODECOPY CALLDATALOAD SWAP15 0xB7 0x5E DUP13 0x5F NOT 0xCF SELFDESTRUCT SWAP12 0xB0 GT 0xBE 0xF7 0xA8 0xC6 0xD0 DUP14 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"369:8168:11:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220a8db2caa44e4c8583ac14f46ad3c359eb75e8c5f19cfff9bb011bef7a8c6d08d64736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA8 0xDB 0x2C 0xAA DIFFICULTY 0xE4 0xC8 PC GASPRICE 0xC1 0x4F CHAINID 0xAD EXTCODECOPY CALLDATALOAD SWAP15 0xB7 0x5E DUP13 0x5F NOT 0xCF SELFDESTRUCT SWAP12 0xB0 GT 0xBE 0xF7 0xA8 0xC6 0xD0 DUP14 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"369:8168:11:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":\"ECDSA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce501a941f4aa1555c04dabb5e07992503bb6a9b32ff8f7cdcefdb4a742210cb\",\"dweb:/ipfs/QmeScPrUpdrGYs9BytV3Z5ZWJcBXtuAgCW4BLHua4xFUxx\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"IERC165":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}"}},"@openzeppelin/contracts/utils/math/Math.sol":{"Math":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220f67014ef6be17ffb0523feff10786ac60a463afeb3685f8ab583b85d22ab19fb64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF6 PUSH17 0x14EF6BE17FFB0523FEFF10786AC60A463A INVALID 0xB3 PUSH9 0x5F8AB583B85D22AB19 0xFB PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"202:12302:13:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220f67014ef6be17ffb0523feff10786ac60a463afeb3685f8ab583b85d22ab19fb64736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF6 PUSH17 0x14EF6BE17FFB0523FEFF10786AC60A463A INVALID 0xB3 PUSH9 0x5F8AB583B85D22AB19 0xFB PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"202:12302:13:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/Math.sol\":\"Math\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]}},\"version\":1}"}},"contracts/core/BaseAccount.sol":{"BaseAccount":{"abi":[{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"entryPoint()":"b0d691fe","getNonce()":"d087d288","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"}},\"notice\":\"Basic account implementation. this contract provides the basic logic for implementing the IAccount interface - validateUserOp specific account implementation should inherit it and provide the account-specific logic\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/BaseAccount.sol\":\"BaseAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/BaseAccount.sol\":{\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b2d23d1276f85300e2ad0c7219614a072796b4f5581fd552b0bcaa47904400d3\",\"dweb:/ipfs/QmVWK5WZ3VskNTfCBxLqY4xBP7WGm3cRM9Qhdy56f5TfAk\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IAccount.sol":{"IAccount":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"details\":\"Must validate caller is the entryPoint. Must validate the signature and nonce\",\"params\":{\"missingAccountFunds\":\"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\",\"userOp\":\"the operation that is about to be executed.\",\"userOpHash\":\"hash of the user's request data. can be used as the basis for signature.\"},\"returns\":{\"validationData\":\"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \\\"simulation call\\\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAccount.sol\":\"IAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IAggregator.sol":{"IAggregator":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"sigForUserOp","type":"bytes"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"sigForUserOp\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"params\":{\"userOps\":\"array of UserOperations to collect the signatures from.\"},\"returns\":{\"aggregatedSignature\":\"the aggregated signature\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"sigForUserOp\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\"}},\"notice\":\"Aggregated Signatures validator.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAggregator.sol\":\"IAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IEntryPoint.sol":{"IEntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"params\":{\"factory\":\"the factory used to deploy this account (in the initCode)\",\"paymaster\":\"the paymaster used by this UserOp\",\"sender\":\"the account that is deployed\",\"userOpHash\":\"the userOp that deployed this account. UserOperationEvent will follow.\"}},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"params\":{\"nonce\":\"the nonce used in the request\",\"revertReason\":\"- the return bytes from the (reverted) call to \\\"callData\\\".\",\"sender\":\"the sender of this request\",\"userOpHash\":\"the request unique identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IEntryPoint.sol\":\"IEntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/INonceManager.sol":{"INonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/INonceManager.sol\":\"INonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]}},\"version\":1}"}},"contracts/interfaces/IStakeManager.sol":{"IStakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IStakeManager.sol\":\"IStakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]}},\"version\":1}"}},"contracts/interfaces/UserOperation.sol":{"UserOperationLib":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a303eed2aef4939a15ae1203e3b953b3cc35aa1ee3bc23127bc911aa1931565364736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 SUB 0xEE 0xD2 0xAE DELEGATECALL SWAP4 SWAP11 ISZERO 0xAE SLT SUB 0xE3 0xB9 MSTORE8 0xB3 0xCC CALLDATALOAD 0xAA 0x1E 0xE3 0xBC 0x23 SLT PUSH28 0xC911AA1931565364736F6C6343000811003300000000000000000000 ","sourceMap":"1642:2115:21:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220a303eed2aef4939a15ae1203e3b953b3cc35aa1ee3bc23127bc911aa1931565364736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 SUB 0xEE 0xD2 0xAE DELEGATECALL SWAP4 SWAP11 ISZERO 0xAE SLT SUB 0xE3 0xB9 MSTORE8 0xB3 0xCC CALLDATALOAD 0xAA 0x1E 0xE3 0xBC 0x23 SLT PUSH28 0xC911AA1931565364736F6C6343000811003300000000000000000000 ","sourceMap":"1642:2115:21:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when working with UserOperation structs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/UserOperation.sol\":\"UserOperationLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/samples/SimpleAccount.sol":{"SimpleAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"anOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c03461016157601f62001ebc38819003918201601f19168301916001600160401b038311848410176101665780849260209460405283398101031261016157516001600160a01b0381168103610161573060805260a05260005460ff8160081c1661010c5760ff808216106100d1575b604051611d3f90816200017d823960805181818161053301528181610acd0152610c72015260a05181818161071a015281816107db015281816108a601528181610d9301528181610f3001528181611140015281816118b0015261190f0152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a138610070565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806223de291461018257806301ffc9a714610179578063150b7a021461017057806318dfb3c7146101675780633659cfe61461015e5780633a871cdd146101555780634a58db191461014c5780634d44560d146101435780634f1ef2861461013a57806352d1902d146101315780638da5cb5b14610128578063b0d691fe1461011f578063b61d27f614610116578063bc197c811461010d578063c399ec8814610104578063c4d66de8146100fb578063d087d288146100f25763f23a6e610361000e576100ed6111ae565b61000e565b506100ed6110db565b506100ed610f95565b506100ed610ed4565b506100ed610e2a565b506100ed610db7565b506100ed610d65565b506100ed610d2d565b506100ed610c49565b506100ed610a69565b506100ed610865565b506100ed6107b6565b506100ed6106d0565b506100ed6104fc565b506100ed6103c2565b506100ed61031d565b506100ed61024a565b506100ed6101dc565b73ffffffffffffffffffffffffffffffffffffffff8116036101a957565b600080fd5b9181601f840112156101a95782359167ffffffffffffffff83116101a957602083818601950101116101a957565b50346101a95760c06003193601126101a9576101f960043561018b565b61020460243561018b565b61020f60443561018b565b67ffffffffffffffff6084358181116101a9576102309036906004016101ae565b505060a4359081116101a9576100199036906004016101ae565b50346101a95760206003193601126101a9576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101a957807f150b7a0200000000000000000000000000000000000000000000000000000000602092149081156102f3575b81156102c9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102be565b7f4e2312e000000000000000000000000000000000000000000000000000000000811491506102b7565b50346101a95760806003193601126101a95761033a60043561018b565b61034560243561018b565b60643567ffffffffffffffff81116101a9576103659036906004016101ae565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b9181601f840112156101a95782359167ffffffffffffffff83116101a9576020808501948460051b0101116101a957565b50346101a95760406003193601126101a95767ffffffffffffffff600480358281116101a9576103f59036908301610391565b60249291929384359081116101a9576104119036908401610391565b6104196118f7565b8083036104b95760005b83811061042c57005b61045d61044261043d83878a611737565b611755565b6104576104508486886117b0565b3691610a32565b90611c70565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461048c57600101610423565b866011867f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b60648460138860206040519362461bcd60e51b85528401528201527f77726f6e67206172726179206c656e67746873000000000000000000000000006044820152fd5b50346101a95760206003193601126101a95760043561051a8161018b565b73ffffffffffffffffffffffffffffffffffffffff90817f0000000000000000000000000000000000000000000000000000000000000000169161056083301415611222565b61058f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc938285541614611293565b610597611c90565b604051906105a482610970565b600082527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156105de5750506100199150611391565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa600091816106a0575b5061068d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b6100199361069b9114611320565b611463565b6106c291925060203d81116106c9575b6106ba81836109a8565b810190611304565b903861061d565b503d6106b0565b50346101a9576003196060813601126101a9576004359067ffffffffffffffff82116101a9576101609082360301126101a95773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036107725761075361076e9160243590600401611996565b61075e6044356116cd565b6040519081529081906020820190565b0390f35b606460405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152fd5b506000806003193601126108625773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681813b1561086257602491604051928380927fb760faf900000000000000000000000000000000000000000000000000000000825230600483015234905af18015610855575b610849575080f35b6108529061094f565b80f35b61085d611313565b610841565b80fd5b50346101a95760006040600319360112610862576004356108858161018b565b61088d611c90565b8173ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001692833b1561091b576044908360405195869485937f205c287800000000000000000000000000000000000000000000000000000000855216600484015260243560248401525af1801561085557610849575080f35b8280fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161096357604052565b61096b61091f565b604052565b6020810190811067ffffffffffffffff82111761096357604052565b6060810190811067ffffffffffffffff82111761096357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096357604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610a25575b01160190565b610a2d61091f565b610a1f565b929192610a3e826109e9565b91610a4c60405193846109a8565b8294818452818301116101a9578281602093846000960137010152565b5060406003193601126101a957600435610a828161018b565b60243567ffffffffffffffff81116101a957366023820112156101a957610ab3903690602481600401359101610a32565b9073ffffffffffffffffffffffffffffffffffffffff91827f00000000000000000000000000000000000000000000000000000000000000001692610afa84301415611222565b610b297f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc948286541614611293565b610b31611c90565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610b675750506100199150611391565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa60009181610c29575b50610c165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b61001993610c249114611320565b611542565b610c4291925060203d81116106c9576106ba81836109a8565b9038610ba6565b50346101a95760006003193601126101a95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610cc3576040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152602090f35b608460405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152fd5b50346101a95760006003193601126101a957602073ffffffffffffffffffffffffffffffffffffffff60005460101c16604051908152f35b50346101a95760006003193601126101a957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346101a95760606003193601126101a957600435610dd58161018b565b60443567ffffffffffffffff81116101a957600091610e04610dfc849336906004016101ae565b6104506118f7565b9060208251920190602435905af1610e1a6115a2565b9015610e2257005b602081519101fd5b50346101a95760a06003193601126101a957610e4760043561018b565b610e5260243561018b565b67ffffffffffffffff6044358181116101a957610e73903690600401610391565b50506064358181116101a957610e8d903690600401610391565b50506084359081116101a957610ea79036906004016101ae565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b50346101a95760006003193601126101a95760206040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152818160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610f88575b600091610f6b575b50604051908152f35b610f829150823d81116106c9576106ba81836109a8565b38610f62565b610f90611313565b610f5a565b50346101a95760206003193601126101a957600435610fb38161018b565b61101560005491610fdb60ff8460081c1615809481956110cd575b81156110ad575b506117da565b8261100c60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b6110775761184b565b61101b57005b6110487fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6110a86101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b61184b565b303b159150816110bf575b5038610fd5565b6001915060ff1614386110b8565b600160ff8216109150610fce565b50346101a95760006003193601126101a95761076e6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482015260208160448173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156111a1575b600091611183575b506040519081529081906020820190565b61119b915060203d81116106c9576106ba81836109a8565b38611172565b6111a9611313565b61116a565b50346101a95760a06003193601126101a9576111cb60043561018b565b6111d660243561018b565b60843567ffffffffffffffff81116101a9576111f69036906004016101ae565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b1561122957565b608460405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152fd5b1561129a57565b608460405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152fd5b908160209103126101a9575190565b506040513d6000823e3d90fd5b1561132757565b608460405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152fd5b803b156113f95773ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b608460405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b9061146d82611391565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511580159061153a575b6114bc575050565b61153791600080604051936114d08561098c565b602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208601527f206661696c6564000000000000000000000000000000000000000000000000006040860152602081519101845af46115316115a2565b9161161d565b50565b5060006114b4565b9061154c82611391565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511580159061159a576114bc575050565b5060016114b4565b3d156115cd573d906115b3826109e9565b916115c160405193846109a8565b82523d6000602084013e565b606090565b156115d957565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b919290156116405750815115611631575090565b61163d903b15156115d2565b90565b8251909150156116535750805190602001fd5b6040519062461bcd60e51b825281602080600483015282519283602484015260005b8481106116b6575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201611675565b806116d55750565b600080808093337ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1506115376115a2565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611748575b60051b0190565b611750611707565b611741565b3561163d8161018b565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101a9570180359067ffffffffffffffff82116101a9576020019181360383136101a957565b90916117c9928110156117cd575b60051b81019061175f565b9091565b6117d5611707565b6117be565b156117e157565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b7fffffffffffffffffffff0000000000000000000000000000000000000000ffff75ffffffffffffffffffffffffffffffffffffffff00006000549260101b169116178060005573ffffffffffffffffffffffffffffffffffffffff809160101c16907f0000000000000000000000000000000000000000000000000000000000000000167f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de600080a3565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000163314908115611985575b501561194157565b606460405162461bcd60e51b815260206004820152602060248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152fd5b905060005460101c16331438611939565b9060405160208101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526119d48161098c565b519020611a1b611a1373ffffffffffffffffffffffffffffffffffffffff92611a0d6104508560005460101c169661014081019061175f565b90611b9f565b919091611a64565b1603611a2657600090565b600190565b60051115611a3557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b611a6d81611a2b565b80611a755750565b611a7e81611a2b565b60018103611acb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b611ad481611a2b565b60028103611b215760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b80611b2d600392611a2b565b14611b3457565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608490fd5b906041815114600014611bc9576117c9916020820151906060604084015193015160001a90611bd3565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311611c645791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15611c57575b815173ffffffffffffffffffffffffffffffffffffffff811615611c51579190565b50600190565b611c5f611313565b611c2f565b50505050600090600390565b600091829182602083519301915af1611c876115a2565b9015610e225750565b73ffffffffffffffffffffffffffffffffffffffff60005460101c1633148015611d00575b15611cbc57565b606460405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152fd5b50303314611cb556fea264697066735822122020cdeee39118e142e546b384b484b154928553bd964056a61235bceed4a22a8364736f6c63430008110033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0x161 JUMPI PUSH1 0x1F PUSH3 0x1EBC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x166 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x161 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x161 JUMPI ADDRESS PUSH1 0x80 MSTORE PUSH1 0xA0 MSTORE PUSH1 0x0 SLOAD PUSH1 0xFF DUP2 PUSH1 0x8 SHR AND PUSH2 0x10C JUMPI PUSH1 0xFF DUP1 DUP3 AND LT PUSH2 0xD1 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1D3F SWAP1 DUP2 PUSH3 0x17D DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x533 ADD MSTORE DUP2 DUP2 PUSH2 0xACD ADD MSTORE PUSH2 0xC72 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x71A ADD MSTORE DUP2 DUP2 PUSH2 0x7DB ADD MSTORE DUP2 DUP2 PUSH2 0x8A6 ADD MSTORE DUP2 DUP2 PUSH2 0xD93 ADD MSTORE DUP2 DUP2 PUSH2 0xF30 ADD MSTORE DUP2 DUP2 PUSH2 0x1140 ADD MSTORE DUP2 DUP2 PUSH2 0x18B0 ADD MSTORE PUSH2 0x190F ADD MSTORE RETURN JUMPDEST PUSH1 0xFF SWAP1 DUP2 NOT AND OR PUSH1 0x0 SSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0xFF DUP2 MSTORE LOG1 CODESIZE PUSH2 0x70 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x23DE29 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x15E JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x14C JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x143 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x128 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0xFB JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0xF2 JUMPI PUSH4 0xF23A6E61 SUB PUSH2 0xE JUMPI PUSH2 0xED PUSH2 0x11AE JUMP JUMPDEST PUSH2 0xE JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x10DB JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xF95 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xED4 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xE2A JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xDB7 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xD65 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xD2D JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xC49 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xA69 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x865 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x7B6 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x6D0 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x4FC JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x3C2 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x31D JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x24A JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x1DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0x1A9 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1A9 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x1A9 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xC0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x1F9 PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x204 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x20F PUSH1 0x44 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x84 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x230 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0xA4 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1A9 JUMPI DUP1 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 PUSH1 0x20 SWAP3 EQ SWAP1 DUP2 ISZERO PUSH2 0x2F3 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x2C9 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 SWAP2 POP EQ CODESIZE PUSH2 0x2BE JUMP JUMPDEST PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP2 POP PUSH2 0x2B7 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x80 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x33A PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x345 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x365 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1A9 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1A9 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 DUP1 CALLDATALOAD DUP3 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x3F5 SWAP1 CALLDATASIZE SWAP1 DUP4 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x24 SWAP3 SWAP2 SWAP3 SWAP4 DUP5 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x411 SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x391 JUMP JUMPDEST PUSH2 0x419 PUSH2 0x18F7 JUMP JUMPDEST DUP1 DUP4 SUB PUSH2 0x4B9 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x42C JUMPI STOP JUMPDEST PUSH2 0x45D PUSH2 0x442 PUSH2 0x43D DUP4 DUP8 DUP11 PUSH2 0x1737 JUMP JUMPDEST PUSH2 0x1755 JUMP JUMPDEST PUSH2 0x457 PUSH2 0x450 DUP5 DUP7 DUP9 PUSH2 0x17B0 JUMP JUMPDEST CALLDATASIZE SWAP2 PUSH2 0xA32 JUMP JUMPDEST SWAP1 PUSH2 0x1C70 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x48C JUMPI PUSH1 0x1 ADD PUSH2 0x423 JUMP JUMPDEST DUP7 PUSH1 0x11 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE MSTORE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x64 DUP5 PUSH1 0x13 DUP9 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP4 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP6 MSTORE DUP5 ADD MSTORE DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x51A DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH32 0x0 AND SWAP2 PUSH2 0x560 DUP4 ADDRESS EQ ISZERO PUSH2 0x1222 JUMP JUMPDEST PUSH2 0x58F PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP4 DUP3 DUP6 SLOAD AND EQ PUSH2 0x1293 JUMP JUMPDEST PUSH2 0x597 PUSH2 0x1C90 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x5A4 DUP3 PUSH2 0x970 JUMP JUMPDEST PUSH1 0x0 DUP3 MSTORE PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5DE JUMPI POP POP PUSH2 0x19 SWAP2 POP PUSH2 0x1391 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x4 SWAP2 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x52D1902D00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 AND GAS STATICCALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x6A0 JUMPI JUMPDEST POP PUSH2 0x68D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x19 SWAP4 PUSH2 0x69B SWAP2 EQ PUSH2 0x1320 JUMP JUMPDEST PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x6C2 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI JUMPDEST PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1304 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x61D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6B0 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x3 NOT PUSH1 0x60 DUP2 CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1A9 JUMPI PUSH2 0x160 SWAP1 DUP3 CALLDATASIZE SUB ADD SLT PUSH2 0x1A9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x772 JUMPI PUSH2 0x753 PUSH2 0x76E SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x4 ADD PUSH2 0x1996 JUMP JUMPDEST PUSH2 0x75E PUSH1 0x44 CALLDATALOAD PUSH2 0x16CD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP PUSH1 0x0 DUP1 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x862 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 DUP2 EXTCODESIZE ISZERO PUSH2 0x862 JUMPI PUSH1 0x24 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE CALLVALUE SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x855 JUMPI JUMPDEST PUSH2 0x849 JUMPI POP DUP1 RETURN JUMPDEST PUSH2 0x852 SWAP1 PUSH2 0x94F JUMP JUMPDEST DUP1 RETURN JUMPDEST PUSH2 0x85D PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x841 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x862 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x885 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x88D PUSH2 0x1C90 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND SWAP3 DUP4 EXTCODESIZE ISZERO PUSH2 0x91B JUMPI PUSH1 0x44 SWAP1 DUP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 CALLDATALOAD PUSH1 0x24 DUP5 ADD MSTORE GAS CALL DUP1 ISZERO PUSH2 0x855 JUMPI PUSH2 0x849 JUMPI POP DUP1 RETURN JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x96B PUSH2 0x91F JUMP JUMPDEST PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA25 JUMPI JUMPDEST ADD AND ADD SWAP1 JUMP JUMPDEST PUSH2 0xA2D PUSH2 0x91F JUMP JUMPDEST PUSH2 0xA1F JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0xA3E DUP3 PUSH2 0x9E9 JUMP JUMPDEST SWAP2 PUSH2 0xA4C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x9A8 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1A9 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST POP PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xA82 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1A9 JUMPI PUSH2 0xAB3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x24 DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 PUSH32 0x0 AND SWAP3 PUSH2 0xAFA DUP5 ADDRESS EQ ISZERO PUSH2 0x1222 JUMP JUMPDEST PUSH2 0xB29 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP5 DUP3 DUP7 SLOAD AND EQ PUSH2 0x1293 JUMP JUMPDEST PUSH2 0xB31 PUSH2 0x1C90 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB67 JUMPI POP POP PUSH2 0x19 SWAP2 POP PUSH2 0x1391 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x4 SWAP2 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x52D1902D00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 AND GAS STATICCALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0xC29 JUMPI JUMPDEST POP PUSH2 0xC16 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x19 SWAP4 PUSH2 0xC24 SWAP2 EQ PUSH2 0x1320 JUMP JUMPDEST PUSH2 0x1542 JUMP JUMPDEST PUSH2 0xC42 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xBA6 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xCC3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 MSTORE PUSH1 0x20 SWAP1 RETURN JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xDD5 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE04 PUSH2 0xDFC DUP5 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST PUSH2 0x450 PUSH2 0x18F7 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 MLOAD SWAP3 ADD SWAP1 PUSH1 0x24 CALLDATALOAD SWAP1 GAS CALL PUSH2 0xE1A PUSH2 0x15A2 JUMP JUMPDEST SWAP1 ISZERO PUSH2 0xE22 JUMPI STOP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xA0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0xE47 PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0xE52 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xE73 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x391 JUMP JUMPDEST POP POP PUSH1 0x64 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xE8D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x391 JUMP JUMPDEST POP POP PUSH1 0x84 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xEA7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE DUP2 DUP2 PUSH1 0x24 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF88 JUMPI JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xF6B JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xF82 SWAP2 POP DUP3 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST CODESIZE PUSH2 0xF62 JUMP JUMPDEST PUSH2 0xF90 PUSH2 0x1313 JUMP JUMPDEST PUSH2 0xF5A JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xFB3 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x1015 PUSH1 0x0 SLOAD SWAP2 PUSH2 0xFDB PUSH1 0xFF DUP5 PUSH1 0x8 SHR AND ISZERO DUP1 SWAP5 DUP2 SWAP6 PUSH2 0x10CD JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x10AD JUMPI JUMPDEST POP PUSH2 0x17DA JUMP JUMPDEST DUP3 PUSH2 0x100C PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH1 0x0 SLOAD AND OR PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x1077 JUMPI PUSH2 0x184B JUMP JUMPDEST PUSH2 0x101B JUMPI STOP JUMPDEST PUSH2 0x1048 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF PUSH1 0x0 SLOAD AND PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 SWAP1 LOG1 STOP JUMPDEST PUSH2 0x10A8 PUSH2 0x100 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF PUSH1 0x0 SLOAD AND OR PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x184B JUMP JUMPDEST ADDRESS EXTCODESIZE ISZERO SWAP2 POP DUP2 PUSH2 0x10BF JUMPI JUMPDEST POP CODESIZE PUSH2 0xFD5 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP PUSH1 0xFF AND EQ CODESIZE PUSH2 0x10B8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xFF DUP3 AND LT SWAP2 POP PUSH2 0xFCE JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x76E PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11A1 JUMPI JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0x1183 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST PUSH2 0x119B SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST CODESIZE PUSH2 0x1172 JUMP JUMPDEST PUSH2 0x11A9 PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x116A JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xA0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x11CB PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x11D6 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x11F6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST ISZERO PUSH2 0x1229 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x129A JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1A9 JUMPI MLOAD SWAP1 JUMP JUMPDEST POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST ISZERO PUSH2 0x1327 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x13F9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH2 0x146D DUP3 PUSH2 0x1391 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B PUSH1 0x0 DUP1 LOG2 DUP1 MLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x153A JUMPI JUMPDEST PUSH2 0x14BC JUMPI POP POP JUMP JUMPDEST PUSH2 0x1537 SWAP2 PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x14D0 DUP6 PUSH2 0x98C JUMP JUMPDEST PUSH1 0x27 DUP6 MSTORE PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x20 DUP7 ADD MSTORE PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x20 DUP2 MLOAD SWAP2 ADD DUP5 GAS DELEGATECALL PUSH2 0x1531 PUSH2 0x15A2 JUMP JUMPDEST SWAP2 PUSH2 0x161D JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x14B4 JUMP JUMPDEST SWAP1 PUSH2 0x154C DUP3 PUSH2 0x1391 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B PUSH1 0x0 DUP1 LOG2 DUP1 MLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x159A JUMPI PUSH2 0x14BC JUMPI POP POP JUMP JUMPDEST POP PUSH1 0x1 PUSH2 0x14B4 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x15CD JUMPI RETURNDATASIZE SWAP1 PUSH2 0x15B3 DUP3 PUSH2 0x9E9 JUMP JUMPDEST SWAP2 PUSH2 0x15C1 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x9A8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x15D9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP3 SWAP1 ISZERO PUSH2 0x1640 JUMPI POP DUP2 MLOAD ISZERO PUSH2 0x1631 JUMPI POP SWAP1 JUMP JUMPDEST PUSH2 0x163D SWAP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x15D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1653 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP3 MSTORE DUP2 PUSH1 0x20 DUP1 PUSH1 0x4 DUP4 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x16B6 JUMPI POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x44 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 REVERT JUMPDEST DUP2 DUP2 ADD DUP4 ADD MLOAD DUP7 DUP3 ADD PUSH1 0x44 ADD MSTORE DUP6 SWAP4 POP DUP3 ADD PUSH2 0x1675 JUMP JUMPDEST DUP1 PUSH2 0x16D5 JUMPI POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 SWAP4 CALLER PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALL POP PUSH2 0x1537 PUSH2 0x15A2 JUMP JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1748 JUMPI JUMPDEST PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH2 0x1750 PUSH2 0x1707 JUMP JUMPDEST PUSH2 0x1741 JUMP JUMPDEST CALLDATALOAD PUSH2 0x163D DUP2 PUSH2 0x18B JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x1A9 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x1A9 JUMPI JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x17C9 SWAP3 DUP2 LT ISZERO PUSH2 0x17CD JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD SWAP1 PUSH2 0x175F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x17D5 PUSH2 0x1707 JUMP JUMPDEST PUSH2 0x17BE JUMP JUMPDEST ISZERO PUSH2 0x17E1 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF PUSH22 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 PUSH1 0x0 SLOAD SWAP3 PUSH1 0x10 SHL AND SWAP2 AND OR DUP1 PUSH1 0x0 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 PUSH1 0x10 SHR AND SWAP1 PUSH32 0x0 AND PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE PUSH1 0x0 DUP1 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1985 JUMPI JUMPDEST POP ISZERO PUSH2 0x1941 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND CALLER EQ CODESIZE PUSH2 0x1939 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP4 MSTORE PUSH1 0x3C DUP3 ADD MSTORE PUSH1 0x3C DUP2 MSTORE PUSH2 0x19D4 DUP2 PUSH2 0x98C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x1A1B PUSH2 0x1A13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1A0D PUSH2 0x450 DUP6 PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND SWAP7 PUSH2 0x140 DUP2 ADD SWAP1 PUSH2 0x175F JUMP JUMPDEST SWAP1 PUSH2 0x1B9F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x1A64 JUMP JUMPDEST AND SUB PUSH2 0x1A26 JUMPI PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x5 GT ISZERO PUSH2 0x1A35 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1A6D DUP2 PUSH2 0x1A2B JUMP JUMPDEST DUP1 PUSH2 0x1A75 JUMPI POP JUMP JUMPDEST PUSH2 0x1A7E DUP2 PUSH2 0x1A2B JUMP JUMPDEST PUSH1 0x1 DUP2 SUB PUSH2 0x1ACB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 SWAP1 REVERT JUMPDEST PUSH2 0x1AD4 DUP2 PUSH2 0x1A2B JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x1B21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1B2D PUSH1 0x3 SWAP3 PUSH2 0x1A2B JUMP JUMPDEST EQ PUSH2 0x1B34 JUMPI JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 PUSH1 0x41 DUP2 MLOAD EQ PUSH1 0x0 EQ PUSH2 0x1BC9 JUMPI PUSH2 0x17C9 SWAP2 PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x1BD3 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 PUSH1 0x2 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT PUSH2 0x1C64 JUMPI SWAP2 PUSH1 0x80 SWAP5 SWAP4 SWAP2 PUSH1 0xFF PUSH1 0x20 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP5 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 SWAP4 DUP5 SWAP2 DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x1C57 JUMPI JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1C51 JUMPI SWAP2 SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x1C5F PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x1C2F JUMP JUMPDEST POP POP POP POP PUSH1 0x0 SWAP1 PUSH1 0x3 SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 PUSH1 0x20 DUP4 MLOAD SWAP4 ADD SWAP2 GAS CALL PUSH2 0x1C87 PUSH2 0x15A2 JUMP JUMPDEST SWAP1 ISZERO PUSH2 0xE22 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND CALLER EQ DUP1 ISZERO PUSH2 0x1D00 JUMPI JUMPDEST ISZERO PUSH2 0x1CBC JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP ADDRESS CALLER EQ PUSH2 0x1CB5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 0xCD 0xEE 0xE3 SWAP2 XOR 0xE1 TIMESTAMP 0xE5 CHAINID 0xB3 DUP5 0xB4 DUP5 0xB1 SLOAD SWAP3 DUP6 MSTORE8 0xBD SWAP7 BLOCKHASH JUMP 0xA6 SLT CALLDATALOAD 0xBC 0xEE 0xD4 LOG2 0x2A DUP4 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"637:3852:22:-:0;;;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;-1:-1:-1;;;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;637:3852:22;;;;;;1088:4:4;1080:13;;637:3852:22;1278:26;-1:-1:-1;637:3852:22;;;;;;;;;;;;6045:30:3;6041:138;;-1:-1:-1;637:3852:22;;;;;;;;1080:13:4;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6041:138:3;637:3852:22;;;;;;-1:-1:-1;637:3852:22;6140:28:3;637:3852:22;;;;;;6140:28:3;6041:138;;;637:3852:22;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;-1:-1:-1;;;637:3852:22;;;;;;;;-1:-1:-1;637:3852:22;;;;;;-1:-1:-1;637:3852:22;;;;;-1:-1:-1;637:3852:22"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":913,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_bytes":{"entryPoint":2610,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes32_fromMemory":{"entryPoint":4868,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":430,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_bytes32":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_rational_by":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_stringliteral":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_stringliteral_520d":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_stringliteral_8e8e":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_stringliteral":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_bytes_calldata":{"entryPoint":5983,"id":null,"parameterSlots":2,"returnSlots":2},"array_allocation_size_bytes":{"entryPoint":2537,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":5943,"id":null,"parameterSlots":3,"returnSlots":1},"calldata_array_index_access_bytes_calldata_dyn_calldata":{"entryPoint":6064,"id":null,"parameterSlots":3,"returnSlots":2},"cleanup_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"external_fun_addDeposit":{"entryPoint":1974,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_entryPoint":{"entryPoint":3429,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_execute":{"entryPoint":3511,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_executeBatch":{"entryPoint":962,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getDeposit":{"entryPoint":3796,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getNonce":{"entryPoint":4315,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_initialize":{"entryPoint":3989,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_onERC1155BatchReceived":{"entryPoint":3626,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_onERC1155Received":{"entryPoint":4526,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_onERC721Received":{"entryPoint":797,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_owner":{"entryPoint":3373,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_proxiableUUID":{"entryPoint":3145,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_supportsInterface":{"entryPoint":586,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_tokensReceived":{"entryPoint":476,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_upgradeTo":{"entryPoint":1276,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_upgradeToAndCall":{"entryPoint":2665,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_validateUserOp":{"entryPoint":1744,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_withdrawDepositTo":{"entryPoint":2149,"id":null,"parameterSlots":0,"returnSlots":0},"extract_from_storage_value_offsett_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_returndata":{"entryPoint":5538,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":2472,"id":null,"parameterSlots":2,"returnSlots":0},"finalize_allocation_10843":{"entryPoint":2416,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_10848":{"entryPoint":2444,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_7607":{"entryPoint":2383,"id":null,"parameterSlots":1,"returnSlots":0},"fun_call":{"entryPoint":7280,"id":3719,"parameterSlots":2,"returnSlots":0},"fun_initialize":{"entryPoint":6219,"id":3641,"parameterSlots":1,"returnSlots":0},"fun_onlyOwner":{"entryPoint":7312,"id":3547,"parameterSlots":0,"returnSlots":0},"fun_payPrefund":{"entryPoint":5837,"id":2645,"parameterSlots":1,"returnSlots":0},"fun_requireFromEntryPointOrOwner":{"entryPoint":6391,"id":3662,"parameterSlots":0,"returnSlots":0},"fun_setImplementation":{"entryPoint":5009,"id":65,"parameterSlots":1,"returnSlots":0},"fun_throwError":{"entryPoint":6756,"id":1320,"parameterSlots":1,"returnSlots":0},"fun_tryRecover":{"entryPoint":7123,"id":1534,"parameterSlots":4,"returnSlots":2},"fun_tryRecover_1366":{"entryPoint":7071,"id":1366,"parameterSlots":2,"returnSlots":2},"fun_upgradeToAndCall":{"entryPoint":5442,"id":110,"parameterSlots":2,"returnSlots":0},"fun_upgradeToAndCall_10844":{"entryPoint":5219,"id":110,"parameterSlots":2,"returnSlots":0},"fun_validateSignature":{"entryPoint":6550,"id":3693,"parameterSlots":2,"returnSlots":1},"fun_verifyCallResultFromTarget":{"entryPoint":5661,"id":986,"parameterSlots":4,"returnSlots":1},"panic_error_0x32":{"entryPoint":5895,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":2335,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":5973,"id":null,"parameterSlots":1,"returnSlots":1},"require_helper_stringliteral_36e1":{"entryPoint":4642,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_52f1":{"entryPoint":4755,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_76b6":{"entryPoint":4896,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_7a2a":{"entryPoint":6106,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_cc2e":{"entryPoint":5586,"id":null,"parameterSlots":1,"returnSlots":0},"revert_forward":{"entryPoint":4883,"id":null,"parameterSlots":0,"returnSlots":0},"update_storage_value_offsett_bool_to_bool":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0},"update_storage_value_offsett_bool_to_bool_7615":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0},"update_storage_value_offsett_uint8_to_uint8":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0},"validator_assert_enum_RecoverError":{"entryPoint":6699,"id":null,"parameterSlots":1,"returnSlots":0},"validator_revert_address":{"entryPoint":395,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"522":[{"length":32,"start":1331},{"length":32,"start":2765},{"length":32,"start":3186}],"3484":[{"length":32,"start":1818},{"length":32,"start":2011},{"length":32,"start":2214},{"length":32,"start":3475},{"length":32,"start":3888},{"length":32,"start":4416},{"length":32,"start":6320},{"length":32,"start":6415}]},"linkReferences":{},"object":"6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806223de291461018257806301ffc9a714610179578063150b7a021461017057806318dfb3c7146101675780633659cfe61461015e5780633a871cdd146101555780634a58db191461014c5780634d44560d146101435780634f1ef2861461013a57806352d1902d146101315780638da5cb5b14610128578063b0d691fe1461011f578063b61d27f614610116578063bc197c811461010d578063c399ec8814610104578063c4d66de8146100fb578063d087d288146100f25763f23a6e610361000e576100ed6111ae565b61000e565b506100ed6110db565b506100ed610f95565b506100ed610ed4565b506100ed610e2a565b506100ed610db7565b506100ed610d65565b506100ed610d2d565b506100ed610c49565b506100ed610a69565b506100ed610865565b506100ed6107b6565b506100ed6106d0565b506100ed6104fc565b506100ed6103c2565b506100ed61031d565b506100ed61024a565b506100ed6101dc565b73ffffffffffffffffffffffffffffffffffffffff8116036101a957565b600080fd5b9181601f840112156101a95782359167ffffffffffffffff83116101a957602083818601950101116101a957565b50346101a95760c06003193601126101a9576101f960043561018b565b61020460243561018b565b61020f60443561018b565b67ffffffffffffffff6084358181116101a9576102309036906004016101ae565b505060a4359081116101a9576100199036906004016101ae565b50346101a95760206003193601126101a9576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101a957807f150b7a0200000000000000000000000000000000000000000000000000000000602092149081156102f3575b81156102c9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102be565b7f4e2312e000000000000000000000000000000000000000000000000000000000811491506102b7565b50346101a95760806003193601126101a95761033a60043561018b565b61034560243561018b565b60643567ffffffffffffffff81116101a9576103659036906004016101ae565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b9181601f840112156101a95782359167ffffffffffffffff83116101a9576020808501948460051b0101116101a957565b50346101a95760406003193601126101a95767ffffffffffffffff600480358281116101a9576103f59036908301610391565b60249291929384359081116101a9576104119036908401610391565b6104196118f7565b8083036104b95760005b83811061042c57005b61045d61044261043d83878a611737565b611755565b6104576104508486886117b0565b3691610a32565b90611c70565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461048c57600101610423565b866011867f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b60648460138860206040519362461bcd60e51b85528401528201527f77726f6e67206172726179206c656e67746873000000000000000000000000006044820152fd5b50346101a95760206003193601126101a95760043561051a8161018b565b73ffffffffffffffffffffffffffffffffffffffff90817f0000000000000000000000000000000000000000000000000000000000000000169161056083301415611222565b61058f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc938285541614611293565b610597611c90565b604051906105a482610970565b600082527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156105de5750506100199150611391565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa600091816106a0575b5061068d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b6100199361069b9114611320565b611463565b6106c291925060203d81116106c9575b6106ba81836109a8565b810190611304565b903861061d565b503d6106b0565b50346101a9576003196060813601126101a9576004359067ffffffffffffffff82116101a9576101609082360301126101a95773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036107725761075361076e9160243590600401611996565b61075e6044356116cd565b6040519081529081906020820190565b0390f35b606460405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152fd5b506000806003193601126108625773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681813b1561086257602491604051928380927fb760faf900000000000000000000000000000000000000000000000000000000825230600483015234905af18015610855575b610849575080f35b6108529061094f565b80f35b61085d611313565b610841565b80fd5b50346101a95760006040600319360112610862576004356108858161018b565b61088d611c90565b8173ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001692833b1561091b576044908360405195869485937f205c287800000000000000000000000000000000000000000000000000000000855216600484015260243560248401525af1801561085557610849575080f35b8280fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161096357604052565b61096b61091f565b604052565b6020810190811067ffffffffffffffff82111761096357604052565b6060810190811067ffffffffffffffff82111761096357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096357604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610a25575b01160190565b610a2d61091f565b610a1f565b929192610a3e826109e9565b91610a4c60405193846109a8565b8294818452818301116101a9578281602093846000960137010152565b5060406003193601126101a957600435610a828161018b565b60243567ffffffffffffffff81116101a957366023820112156101a957610ab3903690602481600401359101610a32565b9073ffffffffffffffffffffffffffffffffffffffff91827f00000000000000000000000000000000000000000000000000000000000000001692610afa84301415611222565b610b297f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc948286541614611293565b610b31611c90565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610b675750506100199150611391565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa60009181610c29575b50610c165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b61001993610c249114611320565b611542565b610c4291925060203d81116106c9576106ba81836109a8565b9038610ba6565b50346101a95760006003193601126101a95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610cc3576040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152602090f35b608460405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152fd5b50346101a95760006003193601126101a957602073ffffffffffffffffffffffffffffffffffffffff60005460101c16604051908152f35b50346101a95760006003193601126101a957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346101a95760606003193601126101a957600435610dd58161018b565b60443567ffffffffffffffff81116101a957600091610e04610dfc849336906004016101ae565b6104506118f7565b9060208251920190602435905af1610e1a6115a2565b9015610e2257005b602081519101fd5b50346101a95760a06003193601126101a957610e4760043561018b565b610e5260243561018b565b67ffffffffffffffff6044358181116101a957610e73903690600401610391565b50506064358181116101a957610e8d903690600401610391565b50506084359081116101a957610ea79036906004016101ae565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b50346101a95760006003193601126101a95760206040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152818160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610f88575b600091610f6b575b50604051908152f35b610f829150823d81116106c9576106ba81836109a8565b38610f62565b610f90611313565b610f5a565b50346101a95760206003193601126101a957600435610fb38161018b565b61101560005491610fdb60ff8460081c1615809481956110cd575b81156110ad575b506117da565b8261100c60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b6110775761184b565b61101b57005b6110487fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6110a86101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b61184b565b303b159150816110bf575b5038610fd5565b6001915060ff1614386110b8565b600160ff8216109150610fce565b50346101a95760006003193601126101a95761076e6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482015260208160448173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156111a1575b600091611183575b506040519081529081906020820190565b61119b915060203d81116106c9576106ba81836109a8565b38611172565b6111a9611313565b61116a565b50346101a95760a06003193601126101a9576111cb60043561018b565b6111d660243561018b565b60843567ffffffffffffffff81116101a9576111f69036906004016101ae565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b1561122957565b608460405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152fd5b1561129a57565b608460405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152fd5b908160209103126101a9575190565b506040513d6000823e3d90fd5b1561132757565b608460405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152fd5b803b156113f95773ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b608460405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b9061146d82611391565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511580159061153a575b6114bc575050565b61153791600080604051936114d08561098c565b602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208601527f206661696c6564000000000000000000000000000000000000000000000000006040860152602081519101845af46115316115a2565b9161161d565b50565b5060006114b4565b9061154c82611391565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511580159061159a576114bc575050565b5060016114b4565b3d156115cd573d906115b3826109e9565b916115c160405193846109a8565b82523d6000602084013e565b606090565b156115d957565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b919290156116405750815115611631575090565b61163d903b15156115d2565b90565b8251909150156116535750805190602001fd5b6040519062461bcd60e51b825281602080600483015282519283602484015260005b8481106116b6575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201611675565b806116d55750565b600080808093337ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1506115376115a2565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611748575b60051b0190565b611750611707565b611741565b3561163d8161018b565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101a9570180359067ffffffffffffffff82116101a9576020019181360383136101a957565b90916117c9928110156117cd575b60051b81019061175f565b9091565b6117d5611707565b6117be565b156117e157565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b7fffffffffffffffffffff0000000000000000000000000000000000000000ffff75ffffffffffffffffffffffffffffffffffffffff00006000549260101b169116178060005573ffffffffffffffffffffffffffffffffffffffff809160101c16907f0000000000000000000000000000000000000000000000000000000000000000167f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de600080a3565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000163314908115611985575b501561194157565b606460405162461bcd60e51b815260206004820152602060248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152fd5b905060005460101c16331438611939565b9060405160208101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526119d48161098c565b519020611a1b611a1373ffffffffffffffffffffffffffffffffffffffff92611a0d6104508560005460101c169661014081019061175f565b90611b9f565b919091611a64565b1603611a2657600090565b600190565b60051115611a3557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b611a6d81611a2b565b80611a755750565b611a7e81611a2b565b60018103611acb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b611ad481611a2b565b60028103611b215760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b80611b2d600392611a2b565b14611b3457565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608490fd5b906041815114600014611bc9576117c9916020820151906060604084015193015160001a90611bd3565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311611c645791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15611c57575b815173ffffffffffffffffffffffffffffffffffffffff811615611c51579190565b50600190565b611c5f611313565b611c2f565b50505050600090600390565b600091829182602083519301915af1611c876115a2565b9015610e225750565b73ffffffffffffffffffffffffffffffffffffffff60005460101c1633148015611d00575b15611cbc57565b606460405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152fd5b50303314611cb556fea264697066735822122020cdeee39118e142e546b384b484b154928553bd964056a61235bceed4a22a8364736f6c63430008110033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x23DE29 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x15E JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x14C JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x143 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x128 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0xFB JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0xF2 JUMPI PUSH4 0xF23A6E61 SUB PUSH2 0xE JUMPI PUSH2 0xED PUSH2 0x11AE JUMP JUMPDEST PUSH2 0xE JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x10DB JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xF95 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xED4 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xE2A JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xDB7 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xD65 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xD2D JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xC49 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0xA69 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x865 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x7B6 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x6D0 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x4FC JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x3C2 JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x31D JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x24A JUMP JUMPDEST POP PUSH2 0xED PUSH2 0x1DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0x1A9 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1A9 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x1A9 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xC0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x1F9 PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x204 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x20F PUSH1 0x44 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x84 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x230 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0xA4 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1A9 JUMPI DUP1 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 PUSH1 0x20 SWAP3 EQ SWAP1 DUP2 ISZERO PUSH2 0x2F3 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x2C9 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 SWAP2 POP EQ CODESIZE PUSH2 0x2BE JUMP JUMPDEST PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP2 POP PUSH2 0x2B7 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x80 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x33A PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x345 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x365 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1A9 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1A9 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 DUP1 CALLDATALOAD DUP3 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x3F5 SWAP1 CALLDATASIZE SWAP1 DUP4 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x24 SWAP3 SWAP2 SWAP3 SWAP4 DUP5 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x411 SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x391 JUMP JUMPDEST PUSH2 0x419 PUSH2 0x18F7 JUMP JUMPDEST DUP1 DUP4 SUB PUSH2 0x4B9 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x42C JUMPI STOP JUMPDEST PUSH2 0x45D PUSH2 0x442 PUSH2 0x43D DUP4 DUP8 DUP11 PUSH2 0x1737 JUMP JUMPDEST PUSH2 0x1755 JUMP JUMPDEST PUSH2 0x457 PUSH2 0x450 DUP5 DUP7 DUP9 PUSH2 0x17B0 JUMP JUMPDEST CALLDATASIZE SWAP2 PUSH2 0xA32 JUMP JUMPDEST SWAP1 PUSH2 0x1C70 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x48C JUMPI PUSH1 0x1 ADD PUSH2 0x423 JUMP JUMPDEST DUP7 PUSH1 0x11 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE MSTORE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x64 DUP5 PUSH1 0x13 DUP9 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP4 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP6 MSTORE DUP5 ADD MSTORE DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x51A DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH32 0x0 AND SWAP2 PUSH2 0x560 DUP4 ADDRESS EQ ISZERO PUSH2 0x1222 JUMP JUMPDEST PUSH2 0x58F PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP4 DUP3 DUP6 SLOAD AND EQ PUSH2 0x1293 JUMP JUMPDEST PUSH2 0x597 PUSH2 0x1C90 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x5A4 DUP3 PUSH2 0x970 JUMP JUMPDEST PUSH1 0x0 DUP3 MSTORE PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5DE JUMPI POP POP PUSH2 0x19 SWAP2 POP PUSH2 0x1391 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x4 SWAP2 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x52D1902D00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 AND GAS STATICCALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x6A0 JUMPI JUMPDEST POP PUSH2 0x68D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x19 SWAP4 PUSH2 0x69B SWAP2 EQ PUSH2 0x1320 JUMP JUMPDEST PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x6C2 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI JUMPDEST PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1304 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x61D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6B0 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x3 NOT PUSH1 0x60 DUP2 CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1A9 JUMPI PUSH2 0x160 SWAP1 DUP3 CALLDATASIZE SUB ADD SLT PUSH2 0x1A9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x772 JUMPI PUSH2 0x753 PUSH2 0x76E SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x4 ADD PUSH2 0x1996 JUMP JUMPDEST PUSH2 0x75E PUSH1 0x44 CALLDATALOAD PUSH2 0x16CD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP PUSH1 0x0 DUP1 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x862 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 DUP2 EXTCODESIZE ISZERO PUSH2 0x862 JUMPI PUSH1 0x24 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE CALLVALUE SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x855 JUMPI JUMPDEST PUSH2 0x849 JUMPI POP DUP1 RETURN JUMPDEST PUSH2 0x852 SWAP1 PUSH2 0x94F JUMP JUMPDEST DUP1 RETURN JUMPDEST PUSH2 0x85D PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x841 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x862 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x885 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x88D PUSH2 0x1C90 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND SWAP3 DUP4 EXTCODESIZE ISZERO PUSH2 0x91B JUMPI PUSH1 0x44 SWAP1 DUP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 CALLDATALOAD PUSH1 0x24 DUP5 ADD MSTORE GAS CALL DUP1 ISZERO PUSH2 0x855 JUMPI PUSH2 0x849 JUMPI POP DUP1 RETURN JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x96B PUSH2 0x91F JUMP JUMPDEST PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x963 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA25 JUMPI JUMPDEST ADD AND ADD SWAP1 JUMP JUMPDEST PUSH2 0xA2D PUSH2 0x91F JUMP JUMPDEST PUSH2 0xA1F JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0xA3E DUP3 PUSH2 0x9E9 JUMP JUMPDEST SWAP2 PUSH2 0xA4C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x9A8 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1A9 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST POP PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xA82 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1A9 JUMPI PUSH2 0xAB3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x24 DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 PUSH32 0x0 AND SWAP3 PUSH2 0xAFA DUP5 ADDRESS EQ ISZERO PUSH2 0x1222 JUMP JUMPDEST PUSH2 0xB29 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP5 DUP3 DUP7 SLOAD AND EQ PUSH2 0x1293 JUMP JUMPDEST PUSH2 0xB31 PUSH2 0x1C90 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB67 JUMPI POP POP PUSH2 0x19 SWAP2 POP PUSH2 0x1391 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x4 SWAP2 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x52D1902D00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 AND GAS STATICCALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0xC29 JUMPI JUMPDEST POP PUSH2 0xC16 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x19 SWAP4 PUSH2 0xC24 SWAP2 EQ PUSH2 0x1320 JUMP JUMPDEST PUSH2 0x1542 JUMP JUMPDEST PUSH2 0xC42 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xBA6 JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xCC3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 MSTORE PUSH1 0x20 SWAP1 RETURN JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xDD5 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE04 PUSH2 0xDFC DUP5 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST PUSH2 0x450 PUSH2 0x18F7 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 MLOAD SWAP3 ADD SWAP1 PUSH1 0x24 CALLDATALOAD SWAP1 GAS CALL PUSH2 0xE1A PUSH2 0x15A2 JUMP JUMPDEST SWAP1 ISZERO PUSH2 0xE22 JUMPI STOP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xA0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0xE47 PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0xE52 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xE73 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x391 JUMP JUMPDEST POP POP PUSH1 0x64 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xE8D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x391 JUMP JUMPDEST POP POP PUSH1 0x84 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0xEA7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE DUP2 DUP2 PUSH1 0x24 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF88 JUMPI JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xF6B JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xF82 SWAP2 POP DUP3 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST CODESIZE PUSH2 0xF62 JUMP JUMPDEST PUSH2 0xF90 PUSH2 0x1313 JUMP JUMPDEST PUSH2 0xF5A JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xFB3 DUP2 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x1015 PUSH1 0x0 SLOAD SWAP2 PUSH2 0xFDB PUSH1 0xFF DUP5 PUSH1 0x8 SHR AND ISZERO DUP1 SWAP5 DUP2 SWAP6 PUSH2 0x10CD JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x10AD JUMPI JUMPDEST POP PUSH2 0x17DA JUMP JUMPDEST DUP3 PUSH2 0x100C PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH1 0x0 SLOAD AND OR PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x1077 JUMPI PUSH2 0x184B JUMP JUMPDEST PUSH2 0x101B JUMPI STOP JUMPDEST PUSH2 0x1048 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF PUSH1 0x0 SLOAD AND PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 SWAP1 LOG1 STOP JUMPDEST PUSH2 0x10A8 PUSH2 0x100 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF PUSH1 0x0 SLOAD AND OR PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x184B JUMP JUMPDEST ADDRESS EXTCODESIZE ISZERO SWAP2 POP DUP2 PUSH2 0x10BF JUMPI JUMPDEST POP CODESIZE PUSH2 0xFD5 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP PUSH1 0xFF AND EQ CODESIZE PUSH2 0x10B8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xFF DUP3 AND LT SWAP2 POP PUSH2 0xFCE JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x76E PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11A1 JUMPI JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0x1183 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST PUSH2 0x119B SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x6C9 JUMPI PUSH2 0x6BA DUP2 DUP4 PUSH2 0x9A8 JUMP JUMPDEST CODESIZE PUSH2 0x1172 JUMP JUMPDEST PUSH2 0x11A9 PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x116A JUMP JUMPDEST POP CALLVALUE PUSH2 0x1A9 JUMPI PUSH1 0xA0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x1A9 JUMPI PUSH2 0x11CB PUSH1 0x4 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x11D6 PUSH1 0x24 CALLDATALOAD PUSH2 0x18B JUMP JUMPDEST PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A9 JUMPI PUSH2 0x11F6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST ISZERO PUSH2 0x1229 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x129A JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1A9 JUMPI MLOAD SWAP1 JUMP JUMPDEST POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST ISZERO PUSH2 0x1327 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x13F9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH2 0x146D DUP3 PUSH2 0x1391 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B PUSH1 0x0 DUP1 LOG2 DUP1 MLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x153A JUMPI JUMPDEST PUSH2 0x14BC JUMPI POP POP JUMP JUMPDEST PUSH2 0x1537 SWAP2 PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x14D0 DUP6 PUSH2 0x98C JUMP JUMPDEST PUSH1 0x27 DUP6 MSTORE PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x20 DUP7 ADD MSTORE PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x20 DUP2 MLOAD SWAP2 ADD DUP5 GAS DELEGATECALL PUSH2 0x1531 PUSH2 0x15A2 JUMP JUMPDEST SWAP2 PUSH2 0x161D JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x14B4 JUMP JUMPDEST SWAP1 PUSH2 0x154C DUP3 PUSH2 0x1391 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B PUSH1 0x0 DUP1 LOG2 DUP1 MLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x159A JUMPI PUSH2 0x14BC JUMPI POP POP JUMP JUMPDEST POP PUSH1 0x1 PUSH2 0x14B4 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x15CD JUMPI RETURNDATASIZE SWAP1 PUSH2 0x15B3 DUP3 PUSH2 0x9E9 JUMP JUMPDEST SWAP2 PUSH2 0x15C1 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x9A8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x15D9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP3 SWAP1 ISZERO PUSH2 0x1640 JUMPI POP DUP2 MLOAD ISZERO PUSH2 0x1631 JUMPI POP SWAP1 JUMP JUMPDEST PUSH2 0x163D SWAP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x15D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1653 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP3 MSTORE DUP2 PUSH1 0x20 DUP1 PUSH1 0x4 DUP4 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x16B6 JUMPI POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x44 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 REVERT JUMPDEST DUP2 DUP2 ADD DUP4 ADD MLOAD DUP7 DUP3 ADD PUSH1 0x44 ADD MSTORE DUP6 SWAP4 POP DUP3 ADD PUSH2 0x1675 JUMP JUMPDEST DUP1 PUSH2 0x16D5 JUMPI POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 SWAP4 CALLER PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALL POP PUSH2 0x1537 PUSH2 0x15A2 JUMP JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1748 JUMPI JUMPDEST PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH2 0x1750 PUSH2 0x1707 JUMP JUMPDEST PUSH2 0x1741 JUMP JUMPDEST CALLDATALOAD PUSH2 0x163D DUP2 PUSH2 0x18B JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x1A9 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1A9 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x1A9 JUMPI JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x17C9 SWAP3 DUP2 LT ISZERO PUSH2 0x17CD JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD SWAP1 PUSH2 0x175F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x17D5 PUSH2 0x1707 JUMP JUMPDEST PUSH2 0x17BE JUMP JUMPDEST ISZERO PUSH2 0x17E1 JUMPI JUMP JUMPDEST PUSH1 0x84 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF PUSH22 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 PUSH1 0x0 SLOAD SWAP3 PUSH1 0x10 SHL AND SWAP2 AND OR DUP1 PUSH1 0x0 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 PUSH1 0x10 SHR AND SWAP1 PUSH32 0x0 AND PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE PUSH1 0x0 DUP1 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1985 JUMPI JUMPDEST POP ISZERO PUSH2 0x1941 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND CALLER EQ CODESIZE PUSH2 0x1939 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP4 MSTORE PUSH1 0x3C DUP3 ADD MSTORE PUSH1 0x3C DUP2 MSTORE PUSH2 0x19D4 DUP2 PUSH2 0x98C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x1A1B PUSH2 0x1A13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1A0D PUSH2 0x450 DUP6 PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND SWAP7 PUSH2 0x140 DUP2 ADD SWAP1 PUSH2 0x175F JUMP JUMPDEST SWAP1 PUSH2 0x1B9F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x1A64 JUMP JUMPDEST AND SUB PUSH2 0x1A26 JUMPI PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x5 GT ISZERO PUSH2 0x1A35 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1A6D DUP2 PUSH2 0x1A2B JUMP JUMPDEST DUP1 PUSH2 0x1A75 JUMPI POP JUMP JUMPDEST PUSH2 0x1A7E DUP2 PUSH2 0x1A2B JUMP JUMPDEST PUSH1 0x1 DUP2 SUB PUSH2 0x1ACB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 SWAP1 REVERT JUMPDEST PUSH2 0x1AD4 DUP2 PUSH2 0x1A2B JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x1B21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1B2D PUSH1 0x3 SWAP3 PUSH2 0x1A2B JUMP JUMPDEST EQ PUSH2 0x1B34 JUMPI JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 PUSH1 0x41 DUP2 MLOAD EQ PUSH1 0x0 EQ PUSH2 0x1BC9 JUMPI PUSH2 0x17C9 SWAP2 PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x1BD3 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 PUSH1 0x2 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT PUSH2 0x1C64 JUMPI SWAP2 PUSH1 0x80 SWAP5 SWAP4 SWAP2 PUSH1 0xFF PUSH1 0x20 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP5 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 SWAP4 DUP5 SWAP2 DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x1C57 JUMPI JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1C51 JUMPI SWAP2 SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x1C5F PUSH2 0x1313 JUMP JUMPDEST PUSH2 0x1C2F JUMP JUMPDEST POP POP POP POP PUSH1 0x0 SWAP1 PUSH1 0x3 SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 PUSH1 0x20 DUP4 MLOAD SWAP4 ADD SWAP2 GAS CALL PUSH2 0x1C87 PUSH2 0x15A2 JUMP JUMPDEST SWAP1 ISZERO PUSH2 0xE22 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SLOAD PUSH1 0x10 SHR AND CALLER EQ DUP1 ISZERO PUSH2 0x1D00 JUMPI JUMPDEST ISZERO PUSH2 0x1CBC JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP ADDRESS CALLER EQ PUSH2 0x1CB5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 0xCD 0xEE 0xE3 SWAP2 XOR 0xE1 TIMESTAMP 0xE5 CHAINID 0xB3 DUP5 0xB4 DUP5 0xB1 SLOAD SWAP3 DUP6 MSTORE8 0xBD SWAP7 BLOCKHASH JUMP 0xA6 SLT CALLDATALOAD 0xBC 0xEE 0xD4 LOG2 0x2A DUP4 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"637:3852:22:-:0;;;;;;;;;-1:-1:-1;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;;;;;;1611:48:23;1626:33;637:3852:22;1611:48:23;;:113;;;;;637:3852:22;1611:169:23;;;;637:3852:22;;;;;;;;;;1611:169:23;1755:25;1740:40;;;1611:169;;;:113;1690:34;1675:49;;;-1:-1:-1;1611:113:23;;637:3852:22;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;927:41:23;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;1902:297;;:::i;:::-;2040:26;;;637:3852;;-1:-1:-1;2120:15:22;;;;;;637:3852;2137:3;2156:26;2162:7;;;;;;:::i;:::-;;:::i;:::-;637:3852;2174:7;;;;;:::i;:::-;637:3852;;;:::i;:::-;2156:26;;:::i;:::-;637:3852;;;;;;;2105:13;;637:3852;;;;;-1:-1:-1;637:3852:22;;-1:-1:-1;637:3852:22;;;;;;;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;:::i;:::-;;1654:6:4;;;637:3852:22;1645:4:4;1629:80;1645:4;;1637:23;;1629:80;:::i;:::-;1719:87;1030:66:1;637:3852:22;;;;;1727:30:4;1719:87;:::i;:::-;4439:19:22;;:::i;:::-;637:3852;;;;;;:::i;:::-;-1:-1:-1;637:3852:22;;689:66:1;;;;;;;3179:17;;;;;;:::i;3092:504::-;637:3852:22;;;;;;;;3232:52:1;;;;689:66;3232:52;;637:3852:22;;3232:52:1;;-1:-1:-1;;3232:52:1;;;3092:504;-1:-1:-1;3228:291:1;;637:3852:22;;-1:-1:-1;;;3448:56:1;;689:66;637:3852:22;3448:56:1;;689:66;;;;;637:3852:22;689:66:1;637:3852:22;;;689:66:1;;;;;;;;3448:56;3228:291;3575:9;3334:28;3326:82;3334:28;;3326:82;:::i;:::-;3575:9;:::i;3232:52::-;;;;;637:3852:22;3232:52:1;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;637:3852:22;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;1121:11;637:3852;1966:10:14;:35;637:3852:22;;1686:38:14;637:3852:22;;;;;;;1686:38:14;:::i;:::-;1784:19;637:3852:22;;1784:19:14;:::i;:::-;637:3852:22;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;;1121:11;637:3852;3973:56;;;;;;637:3852;;;;3973:56;;;;689:66:1;3973:56:22;;4023:4;637:3852;3973:56;;637:3852;4004:9;3973:56;;;;;;;637:3852;3973:56;;637:3852;;;3973:56;;;;:::i;:::-;637:3852;;3973:56;;;:::i;:::-;;;;637:3852;;;;;;;-1:-1:-1;637:3852:22;-1:-1:-1;;637:3852:22;;;;;;;;;;:::i;:::-;932:61;;:::i;:::-;637:3852;;1121:11;;637:3852;4291:48;;;;;;637:3852;;;;;4291:48;;;;;689:66:1;4291:48:22;;637:3852;;4291:48;;637:3852;;;;;;;4291:48;;;;;;;;637:3852;;;4291:48;637:3852;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;637:3852:22;;;;;;:::o;:::-;;;-1:-1:-1;;637:3852:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1654:6:4;;;637:3852:22;1645:4:4;1629:80;1645:4;;1637:23;;1629:80;:::i;:::-;1719:87;1030:66:1;637:3852:22;;;;;1727:30:4;1719:87;:::i;:::-;4439:19:22;;:::i;:::-;689:66:1;;;;;;;3179:17;;;;;;:::i;3092:504::-;3232:52;637:3852:22;;;;;;;3232:52:1;;;;689:66;3232:52;;637:3852:22;;3232:52:1;;;;;;;3092:504;-1:-1:-1;3228:291:1;;637:3852:22;;-1:-1:-1;;;3448:56:1;;689:66;637:3852:22;3448:56:1;;689:66;;;;;637:3852:22;689:66:1;637:3852:22;;;689:66:1;;;;;;;;3448:56;3228:291;3575:9;3334:28;3326:82;3334:28;;3326:82;:::i;:::-;3575:9;:::i;3232:52::-;;;;;;;;;;;;;;;:::i;:::-;;;;;637:3852:22;;;;;;-1:-1:-1;;637:3852:22;;;;;;2089:6:4;637:3852:22;2080:4:4;2072:23;637:3852:22;;;;1030:66:1;637:3852:22;;;;;;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;1121:11;637:3852;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;:::i;:::-;;;;;;;;3488:32;637:3852;;;;;;;;;;:::i;:::-;1680:158;;:::i;637:3852::-;3488:32;;;;;;637:3852;;;3488:32;;;;;:::i;:::-;3534:8;;3530:117;;637:3852;3530:117;3488:32;3558:79;;;;;637:3852;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;637:3852:22;;1428:48:23;637:3852:22;;;;;;;;;;;-1:-1:-1;;637:3852:22;;;;;3799:37;637:3852;;689:66:1;3799:37:22;;3830:4;637:3852;3799:37;;637:3852;1121:11;;637:3852;1121:11;637:3852;1121:11;637:3852;3799:37;;;;;;;637:3852;;3799:37;;;637:3852;;;;;;;;3799:37;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;637:3852;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;;:::i;:::-;2569:7;-1:-1:-1;637:3852:22;;3303:190:3;689:66:1;637:3852:22;;;689:66:1;3279:14:3;3325:34;;;;;;637:3852:22;3324:97:3;;;;637:3852:22;3303:190:3;;:::i;:::-;3503:16;;689:66:1;637:3852:22;3280:13:3;637:3852:22;;;3280:13:3;637:3852:22;;3503:16:3;3529:65;;2569:7:22;:::i;:::-;3614:99:3;;637:3852:22;3614:99:3;3648:21;637:3852:22;3280:13:3;637:3852:22;;3280:13:3;637:3852:22;;3648:21:3;637:3852:22;;3518:1:3;637:3852:22;;3688:14:3;;637:3852:22;;3688:14:3;637:3852:22;3529:65:3;3563:20;637:3852:22;;3280:13:3;637:3852:22;;;3280:13:3;637:3852:22;;3563:20:3;2569:7:22;:::i;3324:97:3:-;3393:4;1465:19:8;:23;;-1:-1:-1;1465:23:8;3365:55:3;;3324:97;;;;;3365:55;3419:1;689:66:1;;;;3403:17:3;3365:55;;;3325:34;3358:1;689:66:1;;;3343:16:3;;-1:-1:-1;3325:34:3;;637:3852:22;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;689:66:1;1010:39:14;;1040:4;637:3852:22;1010:39:14;;637:3852:22;;;;;;1010:39:14;1121:11:22;637:3852;1121:11;637:3852;1121:11;637:3852;1010:39:14;;;;;;;637:3852:22;;1010:39:14;;;637:3852:22;-1:-1:-1;637:3852:22;;;;;;;;;;;;;1010:39:14;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;637:3852:22;;;;;;-1:-1:-1;;637:3852:22;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;1163:43:23;637:3852:22;;;;;;;:::o;:::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;689:66:1;;;;;;;;;;;:::o;:::-;;637:3852:22;;689:66:1;;;;;;;;;;;:::o;:::-;;637:3852:22;;-1:-1:-1;;;689:66:1;;;;;;;;;;;637:3852:22;689:66:1;637:3852:22;;;689:66:1;;;;;;;1532:259;1465:19:8;;:23;637:3852:22;;;1030:66:1;637:3852:22;;;;;;;;;1532:259:1:o;637:3852:22:-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;2183:295:1;;1982:17;;;:::i;:::-;637:3852:22;;;2015:27:1;-1:-1:-1;2015:27:1;;637:3852:22;;2364:15:1;;;:28;;;2183:295;2360:112;;2183:295;;:::o;2360:112::-;7102:69:8;637:3852:22;-1:-1:-1;637:3852:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;7060:25:8;;;;;;;;;:::i;:::-;7102:69;;:::i;:::-;;2183:295:1:o;2364:28::-;;-1:-1:-1;2364:28:1;;2183:295;;1982:17;;;:::i;:::-;637:3852:22;;;2015:27:1;;;;637:3852:22;;2364:15:1;;;:28;;;2360:112;;2183:295;;:::o;2364:28::-;;3729:4:4;2364:28:1;;637:3852:22;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;637:3852:22;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;7466:628:8;;;;7670:418;;;637:3852:22;;;7701:22:8;7697:286;;7996:17;;:::o;7697:286::-;7908:60;1465:19;;:23;;7908:60;:::i;:::-;7996:17;:::o;7670:418::-;637:3852:22;;;;-1:-1:-1;8775:21:8;:17;;8947:142;;;;;;;8771:379;637:3852:22;;9119:20:8;-1:-1:-1;;;9119:20:8;;637:3852:22;;9119:20:8;;;;637:3852:22;;;;;;;;;8795:1:8;637:3852:22;;;;;;;;;;;;8795:1:8;637:3852:22;;;;;;;;;;;9119:20:8;;;;637:3852:22;;;;;;;;;;;;;;;-1:-1:-1;637:3852:22;;;;4316:337:14;4397:24;4393:254;;4316:337;:::o;4393:254::-;4420:1;4463:10;;;;;4515:17;4455:82;;;;:::i;637:3852:22:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;:::i;:::-;;;;;;;:::o;:::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;;;;;;2590:146;637:3852;;2655:15;637:3852;;;;;;;;;2655:15;637:3852;;;;;;;2710:11;;637:3852;2685:44;2655:15;2685:44;;2590:146::o;2808:175::-;637:3852;1121:11;;637:3852;2881:10;:35;:58;;;;;2808:175;637:3852;;;;2808:175::o;637:3852::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;2881:58;637:3852;;2934:5;637:3852;;;;2881:10;2920:19;2881:58;;;3038:322;;637:3852;;7455:58:11;;;637:3852:22;;;;;;;;;7455:58:11;;;;;:::i;:::-;637:3852:22;7445:69:11;;3849:5;3800:27;637:3852:22;;;3276:16;637:3852;-1:-1:-1;637:3852:22;;;;3276:16;;;;;;:::i;637:3852::-;3800:27:11;;:::i;:::-;3849:5;;;;:::i;:::-;637:3852:22;3254:39;3250:85;;-1:-1:-1;3038:322:22;:::o;3250:85::-;746:1:14;3307:28:22;:::o;637:3852::-;;-1:-1:-1;637:3852:22;;;:::o;:::-;;;;;;;;;;570:511:11;637:3852:22;;;:::i;:::-;638:29:11;;;683:7;:::o;634:441::-;637:3852:22;;;:::i;:::-;743:29:11;734:38;;743:29;;637:3852:22;;-1:-1:-1;;;788:34:11;;637:3852:22;788:34:11;;;637:3852:22;;;;;;;;;;;;;3448:56:1;730:345:11;637:3852:22;;;:::i;:::-;852:35:11;843:44;;852:35;;637:3852:22;;-1:-1:-1;;;903:41:11;;637:3852:22;903:41:11;;;637:3852:22;;;;;;;;;;;;;3448:56:1;839:236:11;637:3852:22;;974:30:11;637:3852:22;;:::i;:::-;965:39:11;961:114;;570:511::o;961:114::-;637:3852:22;;-1:-1:-1;;;1020:44:11;;637:3852:22;1020:44:11;;;637:3852:22;;;;;;;;;;;;;;;;;;3448:56:1;2145:730:11;;2283:2;637:3852:22;;2263:22:11;2259:610;2283:2;;;2746:25;2546:180;;;;;;;;;;;;;;-1:-1:-1;2546:180:11;2746:25;;:::i;2259:610::-;2802:56;;2818:1;2802:56;2822:35;2802:56;:::o;5069:1494::-;;;;6119:66;6106:79;;6102:161;;637:3852:22;;;;;689:66:1;637:3852:22;;;;;;;689:66:1;637:3852:22;;;;;;;;;;;;-1:-1:-1;6374:24:11;;;;;;;;;;;;5069:1494;6374:24;;637:3852:22;;;6412:20:11;6408:101;;6519:37;5069:1494;:::o;6408:101::-;6448:50;6374:24;6448:50;:::o;6374:24::-;;;:::i;:::-;;;6102:161;6201:51;;;;6217:1;6201:51;6221:30;6201:51;:::o;3366:287:22:-;2117:1;3366:287;;;3488:32;;;;;;;;;;;:::i;:::-;3534:8;;3530:117;;3366:287;:::o;1349:233::-;637:3852;1524:5;637:3852;;;;1510:10;:19;:50;;;;1349:233;637:3852;;;1349:233::o;637:3852::-;;;;-1:-1:-1;;;637:3852:22;;;;;;;;;;;;;;;;;;1510:50;1555:4;;1510:10;1533:27;1510:50;"},"methodIdentifiers":{"addDeposit()":"4a58db19","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"minimal account. this is sample minimal account. has execute, eth handling methods has a single signer that can send requests through the entryPoint.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/SimpleAccount.sol\":\"SimpleAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8\",\"dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725\"]},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://546651335214a63d1ea3b1d3297228a1df2165f17063b2e45b589ade861ddedc\",\"dweb:/ipfs/QmNwpHiPBRB6dmNz9WLVYvy2kUhYHZgWBMWRcoDuMsuZt9\"]},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://47e5b84668f9b898617da72e91a32559c6975357e267559b3e4ace0d0ca4a6a8\",\"dweb:/ipfs/QmUCVFEpcNdHfNpotEDnMRUeAGPShTcxrtzo3xpNJHZ67e\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec\",\"dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708\",\"dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV\"]},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04c0cd697050a6516b7779aa2343ad2d0e5217d8915ac2382681dfdf4e445be3\",\"dweb:/ipfs/QmPCBCZgm7pHBwwogE2F9NCN3UfTdLNhqc8UDEvw8kDzyA\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce501a941f4aa1555c04dabb5e07992503bb6a9b32ff8f7cdcefdb4a742210cb\",\"dweb:/ipfs/QmeScPrUpdrGYs9BytV3Z5ZWJcBXtuAgCW4BLHua4xFUxx\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/core/BaseAccount.sol\":{\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b2d23d1276f85300e2ad0c7219614a072796b4f5581fd552b0bcaa47904400d3\",\"dweb:/ipfs/QmVWK5WZ3VskNTfCBxLqY4xBP7WGm3cRM9Qhdy56f5TfAk\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]},\"contracts/samples/SimpleAccount.sol\":{\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7c7f1546b6880ec112761fd36465c5730611ca9b15e3121c2e3c494ee3f9b3ce\",\"dweb:/ipfs/QmPDJv3UTPSvrEoCUEhxTa2CoDmciwougiX3mmRTHcV5gB\"]},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://8f91c2d9845513fc88bf73efecd4907d9895b6f9fbe1d6fca09c4d3ad2d787f3\",\"dweb:/ipfs/QmQAFiKpqjVjWrm538tVEYuZvML6iNxNkQAy4UzchJEcpB\"]}},\"version\":1}"}},"contracts/samples/callback/TokenCallbackHandler.sol":{"TokenCallbackHandler":{"abi":[{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234610016576104ab908161001c8239f35b600080fdfe60808060405260048036101561001457600080fd5b600091823560e01c90816223de291461032b57816301ffc9a71461023d57508063150b7a02146101b0578063bc197c81146100ec5763f23a6e611461005857600080fd5b346100e85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e85761008f6103cb565b506100986103f3565b5060843567ffffffffffffffff81116100e4576100b89250369101610416565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b8280fd5b5080fd5b50346100e85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576101246103cb565b5061012d6103f3565b5067ffffffffffffffff6044358181116101ac5761014e9036908401610444565b50506064358181116101ac576101679036908401610444565b50506084359081116100e4576101809250369101610416565b505060206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b8380fd5b50346100e85760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576101e86103cb565b506101f16103f3565b5060643567ffffffffffffffff81116100e4576102119250369101610416565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b919050346100e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e457357fffffffff0000000000000000000000000000000000000000000000000000000081168091036100e457602092507f150b7a02000000000000000000000000000000000000000000000000000000008114908115610301575b81156102d7575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102d0565b7f4e2312e000000000000000000000000000000000000000000000000000000000811491506102c9565b5050346100e85760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576103646103cb565b5061036d6103f3565b5060443573ffffffffffffffffffffffffffffffffffffffff8116036100e85767ffffffffffffffff906084358281116101ac576103ae9036908301610416565b505060a4359182116100e4576103c691369101610416565b505080f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103ee57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103ee57565b9181601f840112156103ee5782359167ffffffffffffffff83116103ee57602083818601950101116103ee57565b9181601f840112156103ee5782359167ffffffffffffffff83116103ee576020808501948460051b0101116103ee5756fea264697066735822122055bd8f16f4cc0d26157fda9a65d896919c08db7a3f0c218e7fc189bafa2a5cce64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x16 JUMPI PUSH2 0x4AB SWAP1 DUP2 PUSH2 0x1C DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 DUP1 CALLDATASIZE LT ISZERO PUSH2 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH3 0x23DE29 EQ PUSH2 0x32B JUMPI DUP2 PUSH4 0x1FFC9A7 EQ PUSH2 0x23D JUMPI POP DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0xEC JUMPI PUSH4 0xF23A6E61 EQ PUSH2 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x8F PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x98 PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0xB8 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x124 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x12D PUSH2 0x3F3 JUMP JUMPDEST POP PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x14E SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x444 JUMP JUMPDEST POP POP PUSH1 0x64 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x167 SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x444 JUMP JUMPDEST POP POP PUSH1 0x84 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0x180 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x1E8 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x1F1 PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0x211 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 POP CALLVALUE PUSH2 0xE4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE4 JUMPI CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP1 SWAP2 SUB PUSH2 0xE4 JUMPI PUSH1 0x20 SWAP3 POP PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP1 DUP2 ISZERO PUSH2 0x301 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x2D7 JUMPI JUMPDEST POP ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 SWAP2 POP EQ CODESIZE PUSH2 0x2D0 JUMP JUMPDEST PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP2 POP PUSH2 0x2C9 JUMP JUMPDEST POP POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xC0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x364 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x36D PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x44 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0xE8 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x84 CALLDATALOAD DUP3 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x3AE SWAP1 CALLDATASIZE SWAP1 DUP4 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0xA4 CALLDATALOAD SWAP2 DUP3 GT PUSH2 0xE4 JUMPI PUSH2 0x3C6 SWAP2 CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP DUP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3EE JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3EE JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3EE JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3EE JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x3EE JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3EE JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3EE JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x3EE JUMPI JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SSTORE 0xBD DUP16 AND DELEGATECALL 0xCC 0xD 0x26 ISZERO PUSH32 0xDA9A65D896919C08DB7A3F0C218E7FC189BAFA2A5CCE64736F6C634300081100 CALLER ","sourceMap":"490:1299:23:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1011,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_address_1567":{"entryPoint":971,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":1092,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":1046,"id":null,"parameterSlots":2,"returnSlots":2}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"60808060405260048036101561001457600080fd5b600091823560e01c90816223de291461032b57816301ffc9a71461023d57508063150b7a02146101b0578063bc197c81146100ec5763f23a6e611461005857600080fd5b346100e85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e85761008f6103cb565b506100986103f3565b5060843567ffffffffffffffff81116100e4576100b89250369101610416565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b8280fd5b5080fd5b50346100e85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576101246103cb565b5061012d6103f3565b5067ffffffffffffffff6044358181116101ac5761014e9036908401610444565b50506064358181116101ac576101679036908401610444565b50506084359081116100e4576101809250369101610416565b505060206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b8380fd5b50346100e85760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576101e86103cb565b506101f16103f3565b5060643567ffffffffffffffff81116100e4576102119250369101610416565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b919050346100e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e457357fffffffff0000000000000000000000000000000000000000000000000000000081168091036100e457602092507f150b7a02000000000000000000000000000000000000000000000000000000008114908115610301575b81156102d7575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102d0565b7f4e2312e000000000000000000000000000000000000000000000000000000000811491506102c9565b5050346100e85760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e8576103646103cb565b5061036d6103f3565b5060443573ffffffffffffffffffffffffffffffffffffffff8116036100e85767ffffffffffffffff906084358281116101ac576103ae9036908301610416565b505060a4359182116100e4576103c691369101610416565b505080f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103ee57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103ee57565b9181601f840112156103ee5782359167ffffffffffffffff83116103ee57602083818601950101116103ee57565b9181601f840112156103ee5782359167ffffffffffffffff83116103ee576020808501948460051b0101116103ee5756fea264697066735822122055bd8f16f4cc0d26157fda9a65d896919c08db7a3f0c218e7fc189bafa2a5cce64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 DUP1 CALLDATASIZE LT ISZERO PUSH2 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH3 0x23DE29 EQ PUSH2 0x32B JUMPI DUP2 PUSH4 0x1FFC9A7 EQ PUSH2 0x23D JUMPI POP DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0xEC JUMPI PUSH4 0xF23A6E61 EQ PUSH2 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x8F PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x98 PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0xB8 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x124 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x12D PUSH2 0x3F3 JUMP JUMPDEST POP PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x14E SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x444 JUMP JUMPDEST POP POP PUSH1 0x64 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x167 SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x444 JUMP JUMPDEST POP POP PUSH1 0x84 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0x180 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x1E8 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x1F1 PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE4 JUMPI PUSH2 0x211 SWAP3 POP CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 POP CALLVALUE PUSH2 0xE4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE4 JUMPI CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP1 SWAP2 SUB PUSH2 0xE4 JUMPI PUSH1 0x20 SWAP3 POP PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP1 DUP2 ISZERO PUSH2 0x301 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x2D7 JUMPI JUMPDEST POP ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 SWAP2 POP EQ CODESIZE PUSH2 0x2D0 JUMP JUMPDEST PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 DUP2 EQ SWAP2 POP PUSH2 0x2C9 JUMP JUMPDEST POP POP CALLVALUE PUSH2 0xE8 JUMPI PUSH1 0xC0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE8 JUMPI PUSH2 0x364 PUSH2 0x3CB JUMP JUMPDEST POP PUSH2 0x36D PUSH2 0x3F3 JUMP JUMPDEST POP PUSH1 0x44 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0xE8 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x84 CALLDATALOAD DUP3 DUP2 GT PUSH2 0x1AC JUMPI PUSH2 0x3AE SWAP1 CALLDATASIZE SWAP1 DUP4 ADD PUSH2 0x416 JUMP JUMPDEST POP POP PUSH1 0xA4 CALLDATALOAD SWAP2 DUP3 GT PUSH2 0xE4 JUMPI PUSH2 0x3C6 SWAP2 CALLDATASIZE SWAP2 ADD PUSH2 0x416 JUMP JUMPDEST POP POP DUP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3EE JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3EE JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3EE JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3EE JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x3EE JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3EE JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3EE JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x3EE JUMPI JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SSTORE 0xBD DUP16 AND DELEGATECALL 0xCC 0xD 0x26 ISZERO PUSH32 0xDA9A65D896919C08DB7A3F0C218E7FC189BAFA2A5CCE64736F6C634300081100 CALLER ","sourceMap":"490:1299:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;1163:43;490:1299;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;490:1299:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;1428:48;490:1299;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;927:41;490:1299;;;;;;;;;;;;;;;;;;;;;;;;;;;1611:48;;1626:33;1611:48;;:113;;;;;490:1299;1611:169;;;;490:1299;;;;;;;1611:169;1755:25;1740:40;;;1611:169;;;:113;1690:34;1675:49;;;-1:-1:-1;1611:113:23;;490:1299;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"},"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Token callback handler. Handles supported tokens' callbacks, allowing account receiving these tokens.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/callback/TokenCallbackHandler.sol\":\"TokenCallbackHandler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0e28648f994abf1d6bc345644a361cc0b7efa544f8bc0c8ec26011fed85a91ec\",\"dweb:/ipfs/QmVVE7AiRjKaQYYji7TkjmTeVzGpNmms5eoxqTCfvvpj6D\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e75cf83beb757b8855791088546b8337e9d4684e169400c20d44a515353b708\",\"dweb:/ipfs/QmYvPafLfoquiDMEj7CKHtvbgHu7TJNPSVPSCjrtjV8HjV\"]},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04c0cd697050a6516b7779aa2343ad2d0e5217d8915ac2382681dfdf4e445be3\",\"dweb:/ipfs/QmPCBCZgm7pHBwwogE2F9NCN3UfTdLNhqc8UDEvw8kDzyA\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://8f91c2d9845513fc88bf73efecd4907d9895b6f9fbe1d6fca09c4d3ad2d787f3\",\"dweb:/ipfs/QmQAFiKpqjVjWrm538tVEYuZvML6iNxNkQAy4UzchJEcpB\"]}},\"version\":1}"}}}}} \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/adf4769f3831cb7edc939048310ac86e.json b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/adf4769f3831cb7edc939048310ac86e.json new file mode 100644 index 0000000000..1965facc36 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/adf4769f3831cb7edc939048310ac86e.json @@ -0,0 +1 @@ +{"id":"adf4769f3831cb7edc939048310ac86e","_format":"hh-sol-build-info-1","solcVersion":"0.8.17","solcLongVersion":"0.8.17+commit.8df45f5f","input":{"language":"Solidity","sources":{"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"},"contracts/core/EntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"},"contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n"},"contracts/core/NonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"},"contracts/core/SenderCreator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"},"contracts/core/StakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"},"contracts/interfaces/IAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"},"contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"},"contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"},"contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"contracts/interfaces/IPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"},"contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"},"contracts/interfaces/UserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"},"contracts/utils/Exec.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":10000},"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}},"output":{"sources":{"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/security/ReentrancyGuard.sol","exportedSymbols":{"ReentrancyGuard":[53]},"id":54,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"112:23:0"},{"abstract":true,"baseContracts":[],"canonicalName":"ReentrancyGuard","contractDependencies":[],"contractKind":"contract","documentation":{"id":2,"nodeType":"StructuredDocumentation","src":"137:750:0","text":" @dev Contract module that helps prevent reentrant calls to a function.\n Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n available, which can be applied to functions to make sure there are no nested\n (reentrant) calls to them.\n Note that because there is a single `nonReentrant` guard, functions marked as\n `nonReentrant` may not call one another. This can be worked around by making\n those functions `private`, and then adding `external` `nonReentrant` entry\n points to them.\n TIP: If you would like to learn more about reentrancy and alternative ways\n to protect against it, check out our blog post\n https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]."},"fullyImplemented":true,"id":53,"linearizedBaseContracts":[53],"name":"ReentrancyGuard","nameLocation":"906:15:0","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":5,"mutability":"constant","name":"_NOT_ENTERED","nameLocation":"1701:12:0","nodeType":"VariableDeclaration","scope":53,"src":"1676:41:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3,"name":"uint256","nodeType":"ElementaryTypeName","src":"1676:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":4,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1716:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"private"},{"constant":true,"id":8,"mutability":"constant","name":"_ENTERED","nameLocation":"1748:8:0","nodeType":"VariableDeclaration","scope":53,"src":"1723:37:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6,"name":"uint256","nodeType":"ElementaryTypeName","src":"1723:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32","id":7,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1759:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"visibility":"private"},{"constant":false,"id":10,"mutability":"mutable","name":"_status","nameLocation":"1783:7:0","nodeType":"VariableDeclaration","scope":53,"src":"1767:23:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9,"name":"uint256","nodeType":"ElementaryTypeName","src":"1767:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"body":{"id":17,"nodeType":"Block","src":"1811:39:0","statements":[{"expression":{"id":15,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10,"src":"1821:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14,"name":"_NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5,"src":"1831:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1821:22:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16,"nodeType":"ExpressionStatement","src":"1821:22:0"}]},"id":18,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":11,"nodeType":"ParameterList","parameters":[],"src":"1808:2:0"},"returnParameters":{"id":12,"nodeType":"ParameterList","parameters":[],"src":"1811:0:0"},"scope":53,"src":"1797:53:0","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28,"nodeType":"Block","src":"2251:79:0","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":21,"name":"_nonReentrantBefore","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"2261:19:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2261:21:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23,"nodeType":"ExpressionStatement","src":"2261:21:0"},{"id":24,"nodeType":"PlaceholderStatement","src":"2292:1:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":25,"name":"_nonReentrantAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52,"src":"2303:18:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2303:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27,"nodeType":"ExpressionStatement","src":"2303:20:0"}]},"documentation":{"id":19,"nodeType":"StructuredDocumentation","src":"1856:366:0","text":" @dev Prevents a contract from calling itself, directly or indirectly.\n Calling a `nonReentrant` function from another `nonReentrant`\n function is not supported. It is possible to prevent this from happening\n by making the `nonReentrant` function external, and making it call a\n `private` function that does the actual work."},"id":29,"name":"nonReentrant","nameLocation":"2236:12:0","nodeType":"ModifierDefinition","parameters":{"id":20,"nodeType":"ParameterList","parameters":[],"src":"2248:2:0"},"src":"2227:103:0","virtual":false,"visibility":"internal"},{"body":{"id":43,"nodeType":"Block","src":"2375:248:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":35,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10,"src":"2468:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":34,"name":"_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8,"src":"2479:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2468:19:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5265656e7472616e637947756172643a207265656e7472616e742063616c6c","id":36,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2489:33:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619","typeString":"literal_string \"ReentrancyGuard: reentrant call\""},"value":"ReentrancyGuard: reentrant call"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619","typeString":"literal_string \"ReentrancyGuard: reentrant call\""}],"id":32,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2460:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":37,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2460:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":38,"nodeType":"ExpressionStatement","src":"2460:63:0"},{"expression":{"id":41,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":39,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10,"src":"2598:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":40,"name":"_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8,"src":"2608:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2598:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":42,"nodeType":"ExpressionStatement","src":"2598:18:0"}]},"id":44,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantBefore","nameLocation":"2345:19:0","nodeType":"FunctionDefinition","parameters":{"id":30,"nodeType":"ParameterList","parameters":[],"src":"2364:2:0"},"returnParameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"2375:0:0"},"scope":53,"src":"2336:287:0","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":51,"nodeType":"Block","src":"2667:171:0","statements":[{"expression":{"id":49,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":47,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10,"src":"2809:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":48,"name":"_NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5,"src":"2819:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2809:22:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50,"nodeType":"ExpressionStatement","src":"2809:22:0"}]},"id":52,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantAfter","nameLocation":"2638:18:0","nodeType":"FunctionDefinition","parameters":{"id":45,"nodeType":"ParameterList","parameters":[],"src":"2656:2:0"},"returnParameters":{"id":46,"nodeType":"ParameterList","parameters":[],"src":"2667:0:0"},"scope":53,"src":"2629:209:0","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":54,"src":"888:1952:0","usedErrors":[]}],"src":"112:2729:0"},"id":0},"contracts/core/EntryPoint.sol":{"ast":{"absolutePath":"contracts/core/EntryPoint.sol","exportedSymbols":{"EntryPoint":[2277],"Exec":[3779],"IAccount":[3094],"IAggregator":[3128],"IEntryPoint":[3332],"INonceManager":[3351],"IPaymaster":[3386],"IStakeManager":[3491],"NonceManager":[2605],"ReentrancyGuard":[53],"SenderCreator":[2652],"StakeManager":[3077],"UserOperation":[3518],"UserOperationLib":[3688],"ValidationData":[2286],"_intersectTimeRange":[2430],"_packValidationData":[2467,2505],"_parseValidationData":[2345],"calldataKeccak":[2515]},"id":2278,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":55,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:1"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":56,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":3095,"src":"275:36:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IPaymaster.sol","file":"../interfaces/IPaymaster.sol","id":57,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":3387,"src":"312:38:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":58,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":3333,"src":"351:39:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/utils/Exec.sol","file":"../utils/Exec.sol","id":59,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":3780,"src":"392:27:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/StakeManager.sol","file":"./StakeManager.sol","id":60,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":3078,"src":"420:28:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/SenderCreator.sol","file":"./SenderCreator.sol","id":61,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":2653,"src":"449:29:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/Helpers.sol","file":"./Helpers.sol","id":62,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":2516,"src":"479:23:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/NonceManager.sol","file":"./NonceManager.sol","id":63,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":2606,"src":"503:28:1","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/security/ReentrancyGuard.sol","file":"@openzeppelin/contracts/security/ReentrancyGuard.sol","id":64,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2278,"sourceUnit":54,"src":"532:62:1","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":65,"name":"IEntryPoint","nameLocations":["619:11:1"],"nodeType":"IdentifierPath","referencedDeclaration":3332,"src":"619:11:1"},"id":66,"nodeType":"InheritanceSpecifier","src":"619:11:1"},{"baseName":{"id":67,"name":"StakeManager","nameLocations":["632:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":3077,"src":"632:12:1"},"id":68,"nodeType":"InheritanceSpecifier","src":"632:12:1"},{"baseName":{"id":69,"name":"NonceManager","nameLocations":["646:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":2605,"src":"646:12:1"},"id":70,"nodeType":"InheritanceSpecifier","src":"646:12:1"},{"baseName":{"id":71,"name":"ReentrancyGuard","nameLocations":["660:15:1"],"nodeType":"IdentifierPath","referencedDeclaration":53,"src":"660:15:1"},"id":72,"nodeType":"InheritanceSpecifier","src":"660:15:1"}],"canonicalName":"EntryPoint","contractDependencies":[2652],"contractKind":"contract","fullyImplemented":true,"id":2277,"linearizedBaseContracts":[2277,53,2605,3077,3332,3351,3491],"name":"EntryPoint","nameLocation":"605:10:1","nodeType":"ContractDefinition","nodes":[{"global":false,"id":76,"libraryName":{"id":73,"name":"UserOperationLib","nameLocations":["689:16:1"],"nodeType":"IdentifierPath","referencedDeclaration":3688,"src":"689:16:1"},"nodeType":"UsingForDirective","src":"683:41:1","typeName":{"id":75,"nodeType":"UserDefinedTypeName","pathNode":{"id":74,"name":"UserOperation","nameLocations":["710:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"710:13:1"},"referencedDeclaration":3518,"src":"710:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}}},{"constant":false,"id":83,"mutability":"immutable","name":"senderCreator","nameLocation":"762:13:1","nodeType":"VariableDeclaration","scope":2277,"src":"730:67:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"},"typeName":{"id":78,"nodeType":"UserDefinedTypeName","pathNode":{"id":77,"name":"SenderCreator","nameLocations":["730:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":2652,"src":"730:13:1"},"referencedDeclaration":2652,"src":"730:13:1","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"}},"value":{"arguments":[],"expression":{"argumentTypes":[],"id":81,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"778:17:1","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$__$returns$_t_contract$_SenderCreator_$2652_$","typeString":"function () returns (contract SenderCreator)"},"typeName":{"id":80,"nodeType":"UserDefinedTypeName","pathNode":{"id":79,"name":"SenderCreator","nameLocations":["782:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":2652,"src":"782:13:1"},"referencedDeclaration":2652,"src":"782:13:1","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"}}},"id":82,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"778:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"}},"visibility":"private"},{"constant":true,"id":89,"mutability":"constant","name":"SIMULATE_FIND_AGGREGATOR","nameLocation":"901:24:1","nodeType":"VariableDeclaration","scope":2277,"src":"876:62:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":84,"name":"address","nodeType":"ElementaryTypeName","src":"876:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"31","id":87,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"936:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":86,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"928:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85,"name":"address","nodeType":"ElementaryTypeName","src":"928:7:1","typeDescriptions":{}}},"id":88,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"928:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"constant":true,"id":92,"mutability":"constant","name":"INNER_OUT_OF_GAS","nameLocation":"1020:16:1","nodeType":"VariableDeclaration","scope":2277,"src":"995:57:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":90,"name":"bytes32","nodeType":"ElementaryTypeName","src":"995:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"deaddead","id":91,"isConstant":false,"isLValue":false,"isPure":true,"kind":"hexString","lValueRequested":false,"nodeType":"Literal","src":"1039:13:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_f151d40b3e75f8fa1cd1fce06fa6cde57ba88f05b41b14197de40325455f967a","typeString":"literal_string hex\"deaddead\""},"value":"ޭޭ"},"visibility":"private"},{"constant":true,"id":95,"mutability":"constant","name":"REVERT_REASON_MAX_LEN","nameLocation":"1084:21:1","nodeType":"VariableDeclaration","scope":2277,"src":"1059:53:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":93,"name":"uint256","nodeType":"ElementaryTypeName","src":"1059:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32303438","id":94,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1108:4:1","typeDescriptions":{"typeIdentifier":"t_rational_2048_by_1","typeString":"int_const 2048"},"value":"2048"},"visibility":"private"},{"constant":true,"documentation":{"id":96,"nodeType":"StructuredDocumentation","src":"1119:167:1","text":" for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n in case of signature failure, instead of revert."},"functionSelector":"8f41ec5a","id":99,"mutability":"constant","name":"SIG_VALIDATION_FAILED","nameLocation":"1315:21:1","nodeType":"VariableDeclaration","scope":2277,"src":"1291:49:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97,"name":"uint256","nodeType":"ElementaryTypeName","src":"1291:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":98,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1339:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"public"},{"body":{"id":131,"nodeType":"Block","src":"1635:204:1","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":113,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":108,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102,"src":"1653:11:1","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1676:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":110,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1668:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":109,"name":"address","nodeType":"ElementaryTypeName","src":"1668:7:1","typeDescriptions":{}}},"id":112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1668:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1653:25:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393020696e76616c69642062656e6566696369617279","id":114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1680:26:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814","typeString":"literal_string \"AA90 invalid beneficiary\""},"value":"AA90 invalid beneficiary"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814","typeString":"literal_string \"AA90 invalid beneficiary\""}],"id":107,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1645:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1645:62:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":116,"nodeType":"ExpressionStatement","src":"1645:62:1"},{"assignments":[118,null],"declarations":[{"constant":false,"id":118,"mutability":"mutable","name":"success","nameLocation":"1723:7:1","nodeType":"VariableDeclaration","scope":131,"src":"1718:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":117,"name":"bool","nodeType":"ElementaryTypeName","src":"1718:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":125,"initialValue":{"arguments":[{"hexValue":"","id":123,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1768:2:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":119,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102,"src":"1735:11:1","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1747:4:1","memberName":"call","nodeType":"MemberAccess","src":"1735:16:1","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":121,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104,"src":"1760:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"1735:32:1","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1735:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"1717:54:1"},{"expression":{"arguments":[{"id":127,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":118,"src":"1789:7:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"41413931206661696c65642073656e6420746f2062656e6566696369617279","id":128,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1798:33:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea","typeString":"literal_string \"AA91 failed send to beneficiary\""},"value":"AA91 failed send to beneficiary"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea","typeString":"literal_string \"AA91 failed send to beneficiary\""}],"id":126,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1781:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1781:51:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":130,"nodeType":"ExpressionStatement","src":"1781:51:1"}]},"documentation":{"id":100,"nodeType":"StructuredDocumentation","src":"1347:208:1","text":" compensate the caller's beneficiary address with the collected fees of all UserOperations.\n @param beneficiary the address to receive the fees\n @param amount amount to transfer."},"id":132,"implemented":true,"kind":"function","modifiers":[],"name":"_compensate","nameLocation":"1569:11:1","nodeType":"FunctionDefinition","parameters":{"id":105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":102,"mutability":"mutable","name":"beneficiary","nameLocation":"1597:11:1","nodeType":"VariableDeclaration","scope":132,"src":"1581:27:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":101,"name":"address","nodeType":"ElementaryTypeName","src":"1581:15:1","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":104,"mutability":"mutable","name":"amount","nameLocation":"1618:6:1","nodeType":"VariableDeclaration","scope":132,"src":"1610:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":103,"name":"uint256","nodeType":"ElementaryTypeName","src":"1610:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1580:45:1"},"returnParameters":{"id":106,"nodeType":"ParameterList","parameters":[],"src":"1635:0:1"},"scope":2277,"src":"1560:279:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":213,"nodeType":"Block","src":"2251:997:1","statements":[{"assignments":[147],"declarations":[{"constant":false,"id":147,"mutability":"mutable","name":"preGas","nameLocation":"2269:6:1","nodeType":"VariableDeclaration","scope":213,"src":"2261:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":146,"name":"uint256","nodeType":"ElementaryTypeName","src":"2261:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":150,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":148,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"2278:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":149,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2278:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2261:26:1"},{"assignments":[152],"declarations":[{"constant":false,"id":152,"mutability":"mutable","name":"context","nameLocation":"2310:7:1","nodeType":"VariableDeclaration","scope":213,"src":"2297:20:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":151,"name":"bytes","nodeType":"ElementaryTypeName","src":"2297:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":157,"initialValue":{"arguments":[{"expression":{"id":154,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2345:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":155,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2352:13:1","memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":726,"src":"2345:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":153,"name":"getMemoryBytesFromOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2271,"src":"2320:24:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":156,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2320:46:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2297:69:1"},{"clauses":[{"block":{"id":172,"nodeType":"Block","src":"2467:51:1","statements":[{"expression":{"id":170,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":168,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":144,"src":"2481:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":169,"name":"_actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":166,"src":"2493:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2481:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":171,"nodeType":"ExpressionStatement","src":"2481:26:1"}]},"errorName":"","id":173,"nodeType":"TryCatchClause","parameters":{"id":167,"nodeType":"ParameterList","parameters":[{"constant":false,"id":166,"mutability":"mutable","name":"_actualGasCost","nameLocation":"2451:14:1","nodeType":"VariableDeclaration","scope":173,"src":"2443:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":165,"name":"uint256","nodeType":"ElementaryTypeName","src":"2443:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2442:24:1"},"src":"2434:84:1"},{"block":{"id":210,"nodeType":"Block","src":"2525:717:1","statements":[{"assignments":[175],"declarations":[{"constant":false,"id":175,"mutability":"mutable","name":"innerRevertCode","nameLocation":"2547:15:1","nodeType":"VariableDeclaration","scope":210,"src":"2539:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":174,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2539:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":176,"nodeType":"VariableDeclarationStatement","src":"2539:23:1"},{"AST":{"nodeType":"YulBlock","src":"2585:100:1","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2618:1:1","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2621:1:1","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2624:2:1","type":"","value":"32"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"2603:14:1"},"nodeType":"YulFunctionCall","src":"2603:24:1"},"nodeType":"YulExpressionStatement","src":"2603:24:1"},{"nodeType":"YulAssignment","src":"2644:27:1","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2669:1:1","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2663:5:1"},"nodeType":"YulFunctionCall","src":"2663:8:1"},"variableNames":[{"name":"innerRevertCode","nodeType":"YulIdentifier","src":"2644:15:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":175,"isOffset":false,"isSlot":false,"src":"2644:15:1","valueSize":1}],"id":177,"nodeType":"InlineAssembly","src":"2576:109:1"},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":180,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":178,"name":"innerRevertCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":175,"src":"2783:15:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":179,"name":"INNER_OUT_OF_GAS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":92,"src":"2802:16:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2783:35:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":187,"nodeType":"IfStatement","src":"2779:268:1","trueBody":{"id":186,"nodeType":"Block","src":"2820:227:1","statements":[{"errorCall":{"arguments":[{"id":182,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":135,"src":"3005:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413935206f7574206f6620676173","id":183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3014:17:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980","typeString":"literal_string \"AA95 out of gas\""},"value":"AA95 out of gas"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980","typeString":"literal_string \"AA95 out of gas\""}],"id":181,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"2996:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":184,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2996:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":185,"nodeType":"RevertStatement","src":"2989:43:1"}]}},{"assignments":[189],"declarations":[{"constant":false,"id":189,"mutability":"mutable","name":"actualGas","nameLocation":"3069:9:1","nodeType":"VariableDeclaration","scope":210,"src":"3061:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":188,"name":"uint256","nodeType":"ElementaryTypeName","src":"3061:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":197,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":196,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":190,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":147,"src":"3081:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":191,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3090:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3090:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3081:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":194,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"3102:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":195,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3109:8:1","memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":728,"src":"3102:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3081:36:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3061:56:1"},{"expression":{"id":208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":198,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":144,"src":"3131:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":200,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":135,"src":"3157:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"expression":{"id":201,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"3166:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3177:10:1","memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":3359,"src":"3166:21:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$3359_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":203,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3188:14:1","memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":3358,"src":"3166:36:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},{"id":204,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"3204:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":205,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":152,"src":"3212:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":206,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":189,"src":"3221:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":199,"name":"_handlePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2200,"src":"3143:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_enum$_PostOpMode_$3359_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,enum IPaymaster.PostOpMode,struct EntryPoint.UserOpInfo memory,bytes memory,uint256) returns (uint256)"}},"id":207,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3143:88:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3131:100:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":209,"nodeType":"ExpressionStatement","src":"3131:100:1"}]},"errorName":"","id":211,"nodeType":"TryCatchClause","src":"2519:723:1"}],"externalCall":{"arguments":[{"expression":{"id":160,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":138,"src":"2400:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2407:8:1","memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":3503,"src":"2400:15:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":162,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2417:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":163,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":152,"src":"2425:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":158,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2381:4:1","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}},"id":159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2386:13:1","memberName":"innerHandleOp","nodeType":"MemberAccess","referencedDeclaration":861,"src":"2381:18:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory,struct EntryPoint.UserOpInfo memory,bytes memory) external returns (uint256)"}},"id":164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2381:52:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":212,"nodeType":"TryStatement","src":"2377:865:1"}]},"documentation":{"id":133,"nodeType":"StructuredDocumentation","src":"1845:267:1","text":" execute a user op\n @param opIndex index into the opInfo array\n @param userOp the userOp to execute\n @param opInfo the opInfo filled by validatePrepayment for this userOp.\n @return collected the total amount this userOp paid."},"id":214,"implemented":true,"kind":"function","modifiers":[],"name":"_executeUserOp","nameLocation":"2126:14:1","nodeType":"FunctionDefinition","parameters":{"id":142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":135,"mutability":"mutable","name":"opIndex","nameLocation":"2149:7:1","nodeType":"VariableDeclaration","scope":214,"src":"2141:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":134,"name":"uint256","nodeType":"ElementaryTypeName","src":"2141:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":138,"mutability":"mutable","name":"userOp","nameLocation":"2181:6:1","nodeType":"VariableDeclaration","scope":214,"src":"2158:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":137,"nodeType":"UserDefinedTypeName","pathNode":{"id":136,"name":"UserOperation","nameLocations":["2158:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"2158:13:1"},"referencedDeclaration":3518,"src":"2158:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"opInfo","nameLocation":"2207:6:1","nodeType":"VariableDeclaration","scope":214,"src":"2189:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":140,"nodeType":"UserDefinedTypeName","pathNode":{"id":139,"name":"UserOpInfo","nameLocations":["2189:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"2189:10:1"},"referencedDeclaration":729,"src":"2189:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"src":"2140:74:1"},"returnParameters":{"id":145,"nodeType":"ParameterList","parameters":[{"constant":false,"id":144,"mutability":"mutable","name":"collected","nameLocation":"2240:9:1","nodeType":"VariableDeclaration","scope":214,"src":"2232:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":143,"name":"uint256","nodeType":"ElementaryTypeName","src":"2232:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2231:19:1"},"scope":2277,"src":"2117:1131:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"baseFunctions":[3269],"body":{"id":321,"nodeType":"Block","src":"3726:694:1","statements":[{"assignments":[227],"declarations":[{"constant":false,"id":227,"mutability":"mutable","name":"opslen","nameLocation":"3745:6:1","nodeType":"VariableDeclaration","scope":321,"src":"3737:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":226,"name":"uint256","nodeType":"ElementaryTypeName","src":"3737:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":230,"initialValue":{"expression":{"id":228,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":219,"src":"3754:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3758:6:1","memberName":"length","nodeType":"MemberAccess","src":"3754:10:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3737:27:1"},{"assignments":[235],"declarations":[{"constant":false,"id":235,"mutability":"mutable","name":"opInfos","nameLocation":"3794:7:1","nodeType":"VariableDeclaration","scope":321,"src":"3774:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo[]"},"typeName":{"baseType":{"id":233,"nodeType":"UserDefinedTypeName","pathNode":{"id":232,"name":"UserOpInfo","nameLocations":["3774:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"3774:10:1"},"referencedDeclaration":729,"src":"3774:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":234,"nodeType":"ArrayTypeName","src":"3774:12:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}},"visibility":"internal"}],"id":242,"initialValue":{"arguments":[{"id":240,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":227,"src":"3821:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3804:16:1","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct EntryPoint.UserOpInfo memory[] memory)"},"typeName":{"baseType":{"id":237,"nodeType":"UserDefinedTypeName","pathNode":{"id":236,"name":"UserOpInfo","nameLocations":["3808:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"3808:10:1"},"referencedDeclaration":729,"src":"3808:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":238,"nodeType":"ArrayTypeName","src":"3808:12:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3804:24:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3774:54:1"},{"id":320,"nodeType":"UncheckedBlock","src":"3835:567:1","statements":[{"body":{"id":282,"nodeType":"Block","src":"3892:272:1","statements":[{"assignments":[255],"declarations":[{"constant":false,"id":255,"mutability":"mutable","name":"opInfo","nameLocation":"3924:6:1","nodeType":"VariableDeclaration","scope":282,"src":"3906:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":254,"nodeType":"UserDefinedTypeName","pathNode":{"id":253,"name":"UserOpInfo","nameLocations":["3906:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"3906:10:1"},"referencedDeclaration":729,"src":"3906:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":259,"initialValue":{"baseExpression":{"id":256,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":235,"src":"3933:7:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":258,"indexExpression":{"id":257,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"3941:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3933:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"3906:37:1"},{"assignments":[261,263],"declarations":[{"constant":false,"id":261,"mutability":"mutable","name":"validationData","nameLocation":"3966:14:1","nodeType":"VariableDeclaration","scope":282,"src":"3958:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":260,"name":"uint256","nodeType":"ElementaryTypeName","src":"3958:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":263,"mutability":"mutable","name":"pmValidationData","nameLocation":"3990:16:1","nodeType":"VariableDeclaration","scope":282,"src":"3982:24:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":262,"name":"uint256","nodeType":"ElementaryTypeName","src":"3982:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":271,"initialValue":{"arguments":[{"id":265,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"4030:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":266,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":219,"src":"4033:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":268,"indexExpression":{"id":267,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"4037:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4033:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":269,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":255,"src":"4041:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":264,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"4010:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4010:38:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"3957:91:1"},{"expression":{"arguments":[{"id":273,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"4105:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":274,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":261,"src":"4108:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":275,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":263,"src":"4124:16:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"30","id":278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4150:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":277,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4142:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":276,"name":"address","nodeType":"ElementaryTypeName","src":"4142:7:1","typeDescriptions":{}}},"id":279,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4142:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":272,"name":"_validateAccountAndPaymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1788,"src":"4062:42:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$returns$__$","typeString":"function (uint256,uint256,uint256,address) view"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4062:91:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":281,"nodeType":"ExpressionStatement","src":"4062:91:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":247,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"3875:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":248,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":227,"src":"3879:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3875:10:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":283,"initializationExpression":{"assignments":[244],"declarations":[{"constant":false,"id":244,"mutability":"mutable","name":"i","nameLocation":"3868:1:1","nodeType":"VariableDeclaration","scope":283,"src":"3860:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":243,"name":"uint256","nodeType":"ElementaryTypeName","src":"3860:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":246,"initialValue":{"hexValue":"30","id":245,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3872:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"3860:13:1"},"loopExpression":{"expression":{"id":251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"3887:3:1","subExpression":{"id":250,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"3887:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":252,"nodeType":"ExpressionStatement","src":"3887:3:1"},"nodeType":"ForStatement","src":"3855:309:1"},{"assignments":[285],"declarations":[{"constant":false,"id":285,"mutability":"mutable","name":"collected","nameLocation":"4182:9:1","nodeType":"VariableDeclaration","scope":320,"src":"4174:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":284,"name":"uint256","nodeType":"ElementaryTypeName","src":"4174:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":287,"initialValue":{"hexValue":"30","id":286,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4194:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4174:21:1"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":288,"name":"BeforeExecution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3179,"src":"4210:15:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4210:17:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":290,"nodeType":"EmitStatement","src":"4205:22:1"},{"body":{"id":313,"nodeType":"Block","src":"4275:75:1","statements":[{"expression":{"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":301,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":285,"src":"4289:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":303,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":292,"src":"4317:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":304,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":219,"src":"4320:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":306,"indexExpression":{"id":305,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":292,"src":"4324:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4320:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"baseExpression":{"id":307,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":235,"src":"4328:7:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":309,"indexExpression":{"id":308,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":292,"src":"4336:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4328:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":302,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":214,"src":"4302:14:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":310,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4302:37:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4289:50:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":312,"nodeType":"ExpressionStatement","src":"4289:50:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":297,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":295,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":292,"src":"4258:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":296,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":227,"src":"4262:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4258:10:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":314,"initializationExpression":{"assignments":[292],"declarations":[{"constant":false,"id":292,"mutability":"mutable","name":"i","nameLocation":"4251:1:1","nodeType":"VariableDeclaration","scope":314,"src":"4243:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":291,"name":"uint256","nodeType":"ElementaryTypeName","src":"4243:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":294,"initialValue":{"hexValue":"30","id":293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4255:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4243:13:1"},"loopExpression":{"expression":{"id":299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4270:3:1","subExpression":{"id":298,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":292,"src":"4270:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":300,"nodeType":"ExpressionStatement","src":"4270:3:1"},"nodeType":"ForStatement","src":"4238:112:1"},{"expression":{"arguments":[{"id":316,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":221,"src":"4372:11:1","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":317,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":285,"src":"4385:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":315,"name":"_compensate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":132,"src":"4360:11:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256)"}},"id":318,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4360:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":319,"nodeType":"ExpressionStatement","src":"4360:35:1"}]}]},"documentation":{"id":215,"nodeType":"StructuredDocumentation","src":"3254:369:1","text":" Execute a batch of UserOperations.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":322,"implemented":true,"kind":"function","modifiers":[{"id":224,"kind":"modifierInvocation","modifierName":{"id":223,"name":"nonReentrant","nameLocations":["3713:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":29,"src":"3713:12:1"},"nodeType":"ModifierInvocation","src":"3713:12:1"}],"name":"handleOps","nameLocation":"3637:9:1","nodeType":"FunctionDefinition","parameters":{"id":222,"nodeType":"ParameterList","parameters":[{"constant":false,"id":219,"mutability":"mutable","name":"ops","nameLocation":"3672:3:1","nodeType":"VariableDeclaration","scope":322,"src":"3647:28:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":217,"nodeType":"UserDefinedTypeName","pathNode":{"id":216,"name":"UserOperation","nameLocations":["3647:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"3647:13:1"},"referencedDeclaration":3518,"src":"3647:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":218,"nodeType":"ArrayTypeName","src":"3647:15:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":221,"mutability":"mutable","name":"beneficiary","nameLocation":"3693:11:1","nodeType":"VariableDeclaration","scope":322,"src":"3677:27:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":220,"name":"address","nodeType":"ElementaryTypeName","src":"3677:15:1","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3646:59:1"},"returnParameters":{"id":225,"nodeType":"ParameterList","parameters":[],"src":"3726:0:1"},"scope":2277,"src":"3628:792:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[3279],"body":{"id":611,"nodeType":"Block","src":"4830:2256:1","statements":[{"assignments":[335],"declarations":[{"constant":false,"id":335,"mutability":"mutable","name":"opasLen","nameLocation":"4849:7:1","nodeType":"VariableDeclaration","scope":611,"src":"4841:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":334,"name":"uint256","nodeType":"ElementaryTypeName","src":"4841:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":338,"initialValue":{"expression":{"id":336,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"4859:16:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4876:6:1","memberName":"length","nodeType":"MemberAccess","src":"4859:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4841:41:1"},{"assignments":[340],"declarations":[{"constant":false,"id":340,"mutability":"mutable","name":"totalOps","nameLocation":"4900:8:1","nodeType":"VariableDeclaration","scope":611,"src":"4892:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":339,"name":"uint256","nodeType":"ElementaryTypeName","src":"4892:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":342,"initialValue":{"hexValue":"30","id":341,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4911:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4892:20:1"},{"body":{"id":421,"nodeType":"Block","src":"4960:693:1","statements":[{"assignments":[355],"declarations":[{"constant":false,"id":355,"mutability":"mutable","name":"opa","nameLocation":"5004:3:1","nodeType":"VariableDeclaration","scope":421,"src":"4974:33:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":354,"nodeType":"UserDefinedTypeName","pathNode":{"id":353,"name":"UserOpsPerAggregator","nameLocations":["4974:20:1"],"nodeType":"IdentifierPath","referencedDeclaration":3259,"src":"4974:20:1"},"referencedDeclaration":3259,"src":"4974:20:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":359,"initialValue":{"baseExpression":{"id":356,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"5010:16:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":358,"indexExpression":{"id":357,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"5027:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5010:19:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"4974:55:1"},{"assignments":[364],"declarations":[{"constant":false,"id":364,"mutability":"mutable","name":"ops","nameLocation":"5068:3:1","nodeType":"VariableDeclaration","scope":421,"src":"5043:28:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":362,"nodeType":"UserDefinedTypeName","pathNode":{"id":361,"name":"UserOperation","nameLocations":["5043:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"5043:13:1"},"referencedDeclaration":3518,"src":"5043:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":363,"nodeType":"ArrayTypeName","src":"5043:15:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":367,"initialValue":{"expression":{"id":365,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":355,"src":"5074:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5078:7:1","memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":3253,"src":"5074:11:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"5043:42:1"},{"assignments":[370],"declarations":[{"constant":false,"id":370,"mutability":"mutable","name":"aggregator","nameLocation":"5111:10:1","nodeType":"VariableDeclaration","scope":421,"src":"5099:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"},"typeName":{"id":369,"nodeType":"UserDefinedTypeName","pathNode":{"id":368,"name":"IAggregator","nameLocations":["5099:11:1"],"nodeType":"IdentifierPath","referencedDeclaration":3128,"src":"5099:11:1"},"referencedDeclaration":3128,"src":"5099:11:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"visibility":"internal"}],"id":373,"initialValue":{"expression":{"id":371,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":355,"src":"5124:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5128:10:1","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":3256,"src":"5124:14:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"nodeType":"VariableDeclarationStatement","src":"5099:39:1"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":377,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":370,"src":"5233:10:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}],"id":376,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5225:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":375,"name":"address","nodeType":"ElementaryTypeName","src":"5225:7:1","typeDescriptions":{}}},"id":378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5225:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"31","id":381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5256:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":380,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5248:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":379,"name":"address","nodeType":"ElementaryTypeName","src":"5248:7:1","typeDescriptions":{}}},"id":382,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5248:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5225:33:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393620696e76616c69642061676772656761746f72","id":384,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5260:25:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883","typeString":"literal_string \"AA96 invalid aggregator\""},"value":"AA96 invalid aggregator"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883","typeString":"literal_string \"AA96 invalid aggregator\""}],"id":374,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5217:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":385,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5217:69:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":386,"nodeType":"ExpressionStatement","src":"5217:69:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":389,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":370,"src":"5313:10:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}],"id":388,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5305:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":387,"name":"address","nodeType":"ElementaryTypeName","src":"5305:7:1","typeDescriptions":{}}},"id":390,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5305:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":393,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5336:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":392,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5328:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":391,"name":"address","nodeType":"ElementaryTypeName","src":"5328:7:1","typeDescriptions":{}}},"id":394,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5328:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5305:33:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":415,"nodeType":"IfStatement","src":"5301:305:1","trueBody":{"id":414,"nodeType":"Block","src":"5340:266:1","statements":[{"clauses":[{"block":{"id":402,"nodeType":"Block","src":"5473:2:1","statements":[]},"errorName":"","id":403,"nodeType":"TryCatchClause","src":"5473:2:1"},{"block":{"id":411,"nodeType":"Block","src":"5498:94:1","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":407,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":370,"src":"5561:10:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}],"id":406,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5553:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":405,"name":"address","nodeType":"ElementaryTypeName","src":"5553:7:1","typeDescriptions":{}}},"id":408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5553:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":404,"name":"SignatureValidationFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3196,"src":"5527:25:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5527:46:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":410,"nodeType":"RevertStatement","src":"5520:53:1"}]},"errorName":"","id":412,"nodeType":"TryCatchClause","src":"5492:100:1"}],"externalCall":{"arguments":[{"id":398,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":364,"src":"5453:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},{"expression":{"id":399,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":355,"src":"5458:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5462:9:1","memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":3258,"src":"5458:13:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":396,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":370,"src":"5423:10:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"id":397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5434:18:1","memberName":"validateSignatures","nodeType":"MemberAccess","referencedDeclaration":3108,"src":"5423:29:1","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_array$_t_struct$_UserOperation_$3518_memory_ptr_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (struct UserOperation memory[] memory,bytes memory) view external"}},"id":401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5423:49:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":413,"nodeType":"TryStatement","src":"5419:173:1"}]}},{"expression":{"id":419,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":416,"name":"totalOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":340,"src":"5620:8:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"expression":{"id":417,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":364,"src":"5632:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5636:6:1","memberName":"length","nodeType":"MemberAccess","src":"5632:10:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5620:22:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":420,"nodeType":"ExpressionStatement","src":"5620:22:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":347,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"4942:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":348,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":335,"src":"4946:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4942:11:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":422,"initializationExpression":{"assignments":[344],"declarations":[{"constant":false,"id":344,"mutability":"mutable","name":"i","nameLocation":"4935:1:1","nodeType":"VariableDeclaration","scope":422,"src":"4927:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":343,"name":"uint256","nodeType":"ElementaryTypeName","src":"4927:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":346,"initialValue":{"hexValue":"30","id":345,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4939:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4927:13:1"},"loopExpression":{"expression":{"id":351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4955:3:1","subExpression":{"id":350,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":344,"src":"4955:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":352,"nodeType":"ExpressionStatement","src":"4955:3:1"},"nodeType":"ForStatement","src":"4922:731:1"},{"assignments":[427],"declarations":[{"constant":false,"id":427,"mutability":"mutable","name":"opInfos","nameLocation":"5683:7:1","nodeType":"VariableDeclaration","scope":611,"src":"5663:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo[]"},"typeName":{"baseType":{"id":425,"nodeType":"UserDefinedTypeName","pathNode":{"id":424,"name":"UserOpInfo","nameLocations":["5663:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"5663:10:1"},"referencedDeclaration":729,"src":"5663:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":426,"nodeType":"ArrayTypeName","src":"5663:12:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}},"visibility":"internal"}],"id":434,"initialValue":{"arguments":[{"id":432,"name":"totalOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":340,"src":"5710:8:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"5693:16:1","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct EntryPoint.UserOpInfo memory[] memory)"},"typeName":{"baseType":{"id":429,"nodeType":"UserDefinedTypeName","pathNode":{"id":428,"name":"UserOpInfo","nameLocations":["5697:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"5697:10:1"},"referencedDeclaration":729,"src":"5697:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":430,"nodeType":"ArrayTypeName","src":"5697:12:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}}},"id":433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5693:26:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"5663:56:1"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":435,"name":"BeforeExecution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3179,"src":"5735:15:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":436,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5735:17:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":437,"nodeType":"EmitStatement","src":"5730:22:1"},{"assignments":[439],"declarations":[{"constant":false,"id":439,"mutability":"mutable","name":"opIndex","nameLocation":"5771:7:1","nodeType":"VariableDeclaration","scope":611,"src":"5763:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":438,"name":"uint256","nodeType":"ElementaryTypeName","src":"5763:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":441,"initialValue":{"hexValue":"30","id":440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5781:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5763:19:1"},{"body":{"id":522,"nodeType":"Block","src":"5830:631:1","statements":[{"assignments":[454],"declarations":[{"constant":false,"id":454,"mutability":"mutable","name":"opa","nameLocation":"5874:3:1","nodeType":"VariableDeclaration","scope":522,"src":"5844:33:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":453,"nodeType":"UserDefinedTypeName","pathNode":{"id":452,"name":"UserOpsPerAggregator","nameLocations":["5844:20:1"],"nodeType":"IdentifierPath","referencedDeclaration":3259,"src":"5844:20:1"},"referencedDeclaration":3259,"src":"5844:20:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":458,"initialValue":{"baseExpression":{"id":455,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"5880:16:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":457,"indexExpression":{"id":456,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":443,"src":"5897:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5880:19:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"5844:55:1"},{"assignments":[463],"declarations":[{"constant":false,"id":463,"mutability":"mutable","name":"ops","nameLocation":"5938:3:1","nodeType":"VariableDeclaration","scope":522,"src":"5913:28:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":461,"nodeType":"UserDefinedTypeName","pathNode":{"id":460,"name":"UserOperation","nameLocations":["5913:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"5913:13:1"},"referencedDeclaration":3518,"src":"5913:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":462,"nodeType":"ArrayTypeName","src":"5913:15:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":466,"initialValue":{"expression":{"id":464,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":454,"src":"5944:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5948:7:1","memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":3253,"src":"5944:11:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"5913:42:1"},{"assignments":[469],"declarations":[{"constant":false,"id":469,"mutability":"mutable","name":"aggregator","nameLocation":"5981:10:1","nodeType":"VariableDeclaration","scope":522,"src":"5969:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"},"typeName":{"id":468,"nodeType":"UserDefinedTypeName","pathNode":{"id":467,"name":"IAggregator","nameLocations":["5969:11:1"],"nodeType":"IdentifierPath","referencedDeclaration":3128,"src":"5969:11:1"},"referencedDeclaration":3128,"src":"5969:11:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"visibility":"internal"}],"id":472,"initialValue":{"expression":{"id":470,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":454,"src":"5994:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":471,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5998:10:1","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":3256,"src":"5994:14:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"nodeType":"VariableDeclarationStatement","src":"5969:39:1"},{"assignments":[474],"declarations":[{"constant":false,"id":474,"mutability":"mutable","name":"opslen","nameLocation":"6031:6:1","nodeType":"VariableDeclaration","scope":522,"src":"6023:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":473,"name":"uint256","nodeType":"ElementaryTypeName","src":"6023:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":477,"initialValue":{"expression":{"id":475,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":463,"src":"6040:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6044:6:1","memberName":"length","nodeType":"MemberAccess","src":"6040:10:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6023:27:1"},{"body":{"id":520,"nodeType":"Block","src":"6101:350:1","statements":[{"assignments":[490],"declarations":[{"constant":false,"id":490,"mutability":"mutable","name":"opInfo","nameLocation":"6137:6:1","nodeType":"VariableDeclaration","scope":520,"src":"6119:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":489,"nodeType":"UserDefinedTypeName","pathNode":{"id":488,"name":"UserOpInfo","nameLocations":["6119:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"6119:10:1"},"referencedDeclaration":729,"src":"6119:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":494,"initialValue":{"baseExpression":{"id":491,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":427,"src":"6146:7:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":493,"indexExpression":{"id":492,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6154:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6146:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"6119:43:1"},{"assignments":[496,498],"declarations":[{"constant":false,"id":496,"mutability":"mutable","name":"validationData","nameLocation":"6189:14:1","nodeType":"VariableDeclaration","scope":520,"src":"6181:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":495,"name":"uint256","nodeType":"ElementaryTypeName","src":"6181:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":498,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"6213:23:1","nodeType":"VariableDeclaration","scope":520,"src":"6205:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":497,"name":"uint256","nodeType":"ElementaryTypeName","src":"6205:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":506,"initialValue":{"arguments":[{"id":500,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6260:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":501,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":463,"src":"6269:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":503,"indexExpression":{"id":502,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":479,"src":"6273:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6269:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":504,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":490,"src":"6277:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":499,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"6240:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6240:44:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6180:104:1"},{"expression":{"arguments":[{"id":508,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":479,"src":"6345:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":509,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":496,"src":"6348:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":510,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":498,"src":"6364:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":513,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":469,"src":"6397:10:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}],"id":512,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6389:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":511,"name":"address","nodeType":"ElementaryTypeName","src":"6389:7:1","typeDescriptions":{}}},"id":514,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6389:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":507,"name":"_validateAccountAndPaymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1788,"src":"6302:42:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$returns$__$","typeString":"function (uint256,uint256,uint256,address) view"}},"id":515,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6302:107:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":516,"nodeType":"ExpressionStatement","src":"6302:107:1"},{"expression":{"id":518,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6427:9:1","subExpression":{"id":517,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6427:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":519,"nodeType":"ExpressionStatement","src":"6427:9:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":482,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":479,"src":"6084:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":483,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":474,"src":"6088:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6084:10:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":521,"initializationExpression":{"assignments":[479],"declarations":[{"constant":false,"id":479,"mutability":"mutable","name":"i","nameLocation":"6077:1:1","nodeType":"VariableDeclaration","scope":521,"src":"6069:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":478,"name":"uint256","nodeType":"ElementaryTypeName","src":"6069:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":481,"initialValue":{"hexValue":"30","id":480,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6081:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6069:13:1"},"loopExpression":{"expression":{"id":486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6096:3:1","subExpression":{"id":485,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":479,"src":"6096:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":487,"nodeType":"ExpressionStatement","src":"6096:3:1"},"nodeType":"ForStatement","src":"6064:387:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":446,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":443,"src":"5812:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":447,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":335,"src":"5816:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5812:11:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":523,"initializationExpression":{"assignments":[443],"declarations":[{"constant":false,"id":443,"mutability":"mutable","name":"a","nameLocation":"5805:1:1","nodeType":"VariableDeclaration","scope":523,"src":"5797:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":442,"name":"uint256","nodeType":"ElementaryTypeName","src":"5797:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":445,"initialValue":{"hexValue":"30","id":444,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5809:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5797:13:1"},"loopExpression":{"expression":{"id":450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5825:3:1","subExpression":{"id":449,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":443,"src":"5825:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":451,"nodeType":"ExpressionStatement","src":"5825:3:1"},"nodeType":"ForStatement","src":"5792:669:1"},{"assignments":[525],"declarations":[{"constant":false,"id":525,"mutability":"mutable","name":"collected","nameLocation":"6479:9:1","nodeType":"VariableDeclaration","scope":611,"src":"6471:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":524,"name":"uint256","nodeType":"ElementaryTypeName","src":"6471:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":527,"initialValue":{"hexValue":"30","id":526,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6491:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6471:21:1"},{"expression":{"id":530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":528,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6502:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":529,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6512:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6502:11:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":531,"nodeType":"ExpressionStatement","src":"6502:11:1"},{"body":{"id":597,"nodeType":"Block","src":"6561:420:1","statements":[{"assignments":[544],"declarations":[{"constant":false,"id":544,"mutability":"mutable","name":"opa","nameLocation":"6605:3:1","nodeType":"VariableDeclaration","scope":597,"src":"6575:33:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":543,"nodeType":"UserDefinedTypeName","pathNode":{"id":542,"name":"UserOpsPerAggregator","nameLocations":["6575:20:1"],"nodeType":"IdentifierPath","referencedDeclaration":3259,"src":"6575:20:1"},"referencedDeclaration":3259,"src":"6575:20:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":548,"initialValue":{"baseExpression":{"id":545,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"6611:16:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":547,"indexExpression":{"id":546,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"6628:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6611:19:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"6575:55:1"},{"eventCall":{"arguments":[{"arguments":[{"expression":{"id":552,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":544,"src":"6684:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6688:10:1","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":3256,"src":"6684:14:1","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}],"id":551,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6676:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":550,"name":"address","nodeType":"ElementaryTypeName","src":"6676:7:1","typeDescriptions":{}}},"id":554,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6676:23:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":549,"name":"SignatureAggregatorChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3184,"src":"6649:26:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6649:51:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":556,"nodeType":"EmitStatement","src":"6644:56:1"},{"assignments":[561],"declarations":[{"constant":false,"id":561,"mutability":"mutable","name":"ops","nameLocation":"6739:3:1","nodeType":"VariableDeclaration","scope":597,"src":"6714:28:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":559,"nodeType":"UserDefinedTypeName","pathNode":{"id":558,"name":"UserOperation","nameLocations":["6714:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"6714:13:1"},"referencedDeclaration":3518,"src":"6714:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":560,"nodeType":"ArrayTypeName","src":"6714:15:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":564,"initialValue":{"expression":{"id":562,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":544,"src":"6745:3:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6749:7:1","memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":3253,"src":"6745:11:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"6714:42:1"},{"assignments":[566],"declarations":[{"constant":false,"id":566,"mutability":"mutable","name":"opslen","nameLocation":"6778:6:1","nodeType":"VariableDeclaration","scope":597,"src":"6770:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":565,"name":"uint256","nodeType":"ElementaryTypeName","src":"6770:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":569,"initialValue":{"expression":{"id":567,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":561,"src":"6787:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6791:6:1","memberName":"length","nodeType":"MemberAccess","src":"6787:10:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6770:27:1"},{"body":{"id":595,"nodeType":"Block","src":"6849:122:1","statements":[{"expression":{"id":590,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":580,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":525,"src":"6867:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":582,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6895:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":583,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":561,"src":"6904:3:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":585,"indexExpression":{"id":584,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":571,"src":"6908:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6904:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"baseExpression":{"id":586,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":427,"src":"6912:7:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$729_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":588,"indexExpression":{"id":587,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6920:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6912:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":581,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":214,"src":"6880:14:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6880:49:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6867:62:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":591,"nodeType":"ExpressionStatement","src":"6867:62:1"},{"expression":{"id":593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6947:9:1","subExpression":{"id":592,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":439,"src":"6947:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":594,"nodeType":"ExpressionStatement","src":"6947:9:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":574,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":571,"src":"6832:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":575,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":566,"src":"6836:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6832:10:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":596,"initializationExpression":{"assignments":[571],"declarations":[{"constant":false,"id":571,"mutability":"mutable","name":"i","nameLocation":"6825:1:1","nodeType":"VariableDeclaration","scope":596,"src":"6817:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":570,"name":"uint256","nodeType":"ElementaryTypeName","src":"6817:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":573,"initialValue":{"hexValue":"30","id":572,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6829:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6817:13:1"},"loopExpression":{"expression":{"id":578,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6844:3:1","subExpression":{"id":577,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":571,"src":"6844:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":579,"nodeType":"ExpressionStatement","src":"6844:3:1"},"nodeType":"ForStatement","src":"6812:159:1"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":536,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"6543:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":537,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":335,"src":"6547:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6543:11:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":598,"initializationExpression":{"assignments":[533],"declarations":[{"constant":false,"id":533,"mutability":"mutable","name":"a","nameLocation":"6536:1:1","nodeType":"VariableDeclaration","scope":598,"src":"6528:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":532,"name":"uint256","nodeType":"ElementaryTypeName","src":"6528:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":535,"initialValue":{"hexValue":"30","id":534,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6540:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6528:13:1"},"loopExpression":{"expression":{"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6556:3:1","subExpression":{"id":539,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"6556:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":541,"nodeType":"ExpressionStatement","src":"6556:3:1"},"nodeType":"ForStatement","src":"6523:458:1"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":602,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7030:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7022:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":600,"name":"address","nodeType":"ElementaryTypeName","src":"7022:7:1","typeDescriptions":{}}},"id":603,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7022:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":599,"name":"SignatureAggregatorChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3184,"src":"6995:26:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6995:38:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":605,"nodeType":"EmitStatement","src":"6990:43:1"},{"expression":{"arguments":[{"id":607,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":329,"src":"7056:11:1","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":608,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":525,"src":"7069:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":606,"name":"_compensate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":132,"src":"7044:11:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256)"}},"id":609,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7044:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":610,"nodeType":"ExpressionStatement","src":"7044:35:1"}]},"documentation":{"id":323,"nodeType":"StructuredDocumentation","src":"4426:249:1","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":612,"implemented":true,"kind":"function","modifiers":[{"id":332,"kind":"modifierInvocation","modifierName":{"id":331,"name":"nonReentrant","nameLocations":["4817:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":29,"src":"4817:12:1"},"nodeType":"ModifierInvocation","src":"4817:12:1"}],"name":"handleAggregatedOps","nameLocation":"4689:19:1","nodeType":"FunctionDefinition","parameters":{"id":330,"nodeType":"ParameterList","parameters":[{"constant":false,"id":327,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"4750:16:1","nodeType":"VariableDeclaration","scope":612,"src":"4718:48:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":325,"nodeType":"UserDefinedTypeName","pathNode":{"id":324,"name":"UserOpsPerAggregator","nameLocations":["4718:20:1"],"nodeType":"IdentifierPath","referencedDeclaration":3259,"src":"4718:20:1"},"referencedDeclaration":3259,"src":"4718:20:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":326,"nodeType":"ArrayTypeName","src":"4718:22:1","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":329,"mutability":"mutable","name":"beneficiary","nameLocation":"4792:11:1","nodeType":"VariableDeclaration","scope":612,"src":"4776:27:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":328,"name":"address","nodeType":"ElementaryTypeName","src":"4776:15:1","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"4708:101:1"},"returnParameters":{"id":333,"nodeType":"ParameterList","parameters":[],"src":"4830:0:1"},"scope":2277,"src":"4680:2406:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[3331],"body":{"id":699,"nodeType":"Block","src":"7242:688:1","statements":[{"assignments":[626],"declarations":[{"constant":false,"id":626,"mutability":"mutable","name":"opInfo","nameLocation":"7271:6:1","nodeType":"VariableDeclaration","scope":699,"src":"7253:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":625,"nodeType":"UserDefinedTypeName","pathNode":{"id":624,"name":"UserOpInfo","nameLocations":["7253:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"7253:10:1"},"referencedDeclaration":729,"src":"7253:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":627,"nodeType":"VariableDeclarationStatement","src":"7253:24:1"},{"expression":{"arguments":[{"id":629,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"7314:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":628,"name":"_simulationOnlyValidations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1351,"src":"7287:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$__$","typeString":"function (struct UserOperation calldata) view"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7287:30:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":631,"nodeType":"ExpressionStatement","src":"7287:30:1"},{"assignments":[633,635],"declarations":[{"constant":false,"id":633,"mutability":"mutable","name":"validationData","nameLocation":"7336:14:1","nodeType":"VariableDeclaration","scope":699,"src":"7328:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":632,"name":"uint256","nodeType":"ElementaryTypeName","src":"7328:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":635,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"7360:23:1","nodeType":"VariableDeclaration","scope":699,"src":"7352:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":634,"name":"uint256","nodeType":"ElementaryTypeName","src":"7352:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":641,"initialValue":{"arguments":[{"hexValue":"30","id":637,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7407:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":638,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"7410:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":639,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":626,"src":"7414:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":636,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"7387:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":640,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7387:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"7327:94:1"},{"assignments":[644],"declarations":[{"constant":false,"id":644,"mutability":"mutable","name":"data","nameLocation":"7453:4:1","nodeType":"VariableDeclaration","scope":699,"src":"7431:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":643,"nodeType":"UserDefinedTypeName","pathNode":{"id":642,"name":"ValidationData","nameLocations":["7431:14:1"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"7431:14:1"},"referencedDeclaration":2286,"src":"7431:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":649,"initialValue":{"arguments":[{"id":646,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":633,"src":"7480:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":647,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":635,"src":"7496:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":645,"name":"_intersectTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2430,"src":"7460:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_struct$_ValidationData_$2286_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (struct ValidationData memory)"}},"id":648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7460:60:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"7431:89:1"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":650,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2276,"src":"7531:12:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7531:14:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":652,"nodeType":"ExpressionStatement","src":"7531:14:1"},{"assignments":[654],"declarations":[{"constant":false,"id":654,"mutability":"mutable","name":"paid","nameLocation":"7563:4:1","nodeType":"VariableDeclaration","scope":699,"src":"7555:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":653,"name":"uint256","nodeType":"ElementaryTypeName","src":"7555:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":660,"initialValue":{"arguments":[{"hexValue":"30","id":656,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7585:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":657,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"7588:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":658,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":626,"src":"7592:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":655,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":214,"src":"7570:14:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":659,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7570:29:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7555:44:1"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":661,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2276,"src":"7609:12:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7609:14:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":663,"nodeType":"ExpressionStatement","src":"7609:14:1"},{"assignments":[665],"declarations":[{"constant":false,"id":665,"mutability":"mutable","name":"targetSuccess","nameLocation":"7638:13:1","nodeType":"VariableDeclaration","scope":699,"src":"7633:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":664,"name":"bool","nodeType":"ElementaryTypeName","src":"7633:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":666,"nodeType":"VariableDeclarationStatement","src":"7633:18:1"},{"assignments":[668],"declarations":[{"constant":false,"id":668,"mutability":"mutable","name":"targetResult","nameLocation":"7674:12:1","nodeType":"VariableDeclaration","scope":699,"src":"7661:25:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":667,"name":"bytes","nodeType":"ElementaryTypeName","src":"7661:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":669,"nodeType":"VariableDeclarationStatement","src":"7661:25:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":670,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":618,"src":"7700:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":673,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7718:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":672,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7710:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":671,"name":"address","nodeType":"ElementaryTypeName","src":"7710:7:1","typeDescriptions":{}}},"id":674,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7710:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7700:20:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":686,"nodeType":"IfStatement","src":"7696:110:1","trueBody":{"id":685,"nodeType":"Block","src":"7722:84:1","statements":[{"expression":{"id":683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":676,"name":"targetSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"7737:13:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":677,"name":"targetResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":668,"src":"7752:12:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"id":678,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"7736:29:1","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":681,"name":"targetCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":620,"src":"7780:14:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":679,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":618,"src":"7768:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":680,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7775:4:1","memberName":"call","nodeType":"MemberAccess","src":"7768:11:1","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7768:27:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"src":"7736:59:1","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":684,"nodeType":"ExpressionStatement","src":"7736:59:1"}]}},{"errorCall":{"arguments":[{"expression":{"id":688,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":626,"src":"7838:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":689,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7845:8:1","memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":728,"src":"7838:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":690,"name":"paid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":654,"src":"7855:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":691,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":644,"src":"7861:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":692,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7866:10:1","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"7861:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"expression":{"id":693,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":644,"src":"7878:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":694,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7883:10:1","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"7878:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":695,"name":"targetSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"7895:13:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":696,"name":"targetResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":668,"src":"7910:12:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":687,"name":"ExecutionResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3249,"src":"7822:15:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint48_$_t_uint48_$_t_bool_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (uint256,uint256,uint48,uint48,bool,bytes memory) pure"}},"id":697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7822:101:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":698,"nodeType":"RevertStatement","src":"7815:108:1"}]},"documentation":{"id":613,"nodeType":"StructuredDocumentation","src":"7092:27:1","text":"@inheritdoc IEntryPoint"},"functionSelector":"d6383f94","id":700,"implemented":true,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"7133:16:1","nodeType":"FunctionDefinition","overrides":{"id":622,"nodeType":"OverrideSpecifier","overrides":[],"src":"7233:8:1"},"parameters":{"id":621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":616,"mutability":"mutable","name":"op","nameLocation":"7173:2:1","nodeType":"VariableDeclaration","scope":700,"src":"7150:25:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":615,"nodeType":"UserDefinedTypeName","pathNode":{"id":614,"name":"UserOperation","nameLocations":["7150:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"7150:13:1"},"referencedDeclaration":3518,"src":"7150:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":618,"mutability":"mutable","name":"target","nameLocation":"7185:6:1","nodeType":"VariableDeclaration","scope":700,"src":"7177:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":617,"name":"address","nodeType":"ElementaryTypeName","src":"7177:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":620,"mutability":"mutable","name":"targetCallData","nameLocation":"7208:14:1","nodeType":"VariableDeclaration","scope":700,"src":"7193:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":619,"name":"bytes","nodeType":"ElementaryTypeName","src":"7193:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7149:74:1"},"returnParameters":{"id":623,"nodeType":"ParameterList","parameters":[],"src":"7242:0:1"},"scope":2277,"src":"7124:806:1","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"EntryPoint.MemoryUserOp","id":717,"members":[{"constant":false,"id":702,"mutability":"mutable","name":"sender","nameLocation":"8121:6:1","nodeType":"VariableDeclaration","scope":717,"src":"8113:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":701,"name":"address","nodeType":"ElementaryTypeName","src":"8113:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":704,"mutability":"mutable","name":"nonce","nameLocation":"8145:5:1","nodeType":"VariableDeclaration","scope":717,"src":"8137:13:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":703,"name":"uint256","nodeType":"ElementaryTypeName","src":"8137:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":706,"mutability":"mutable","name":"callGasLimit","nameLocation":"8168:12:1","nodeType":"VariableDeclaration","scope":717,"src":"8160:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":705,"name":"uint256","nodeType":"ElementaryTypeName","src":"8160:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":708,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"8198:20:1","nodeType":"VariableDeclaration","scope":717,"src":"8190:28:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"8190:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":710,"mutability":"mutable","name":"preVerificationGas","nameLocation":"8236:18:1","nodeType":"VariableDeclaration","scope":717,"src":"8228:26:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":709,"name":"uint256","nodeType":"ElementaryTypeName","src":"8228:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":712,"mutability":"mutable","name":"paymaster","nameLocation":"8272:9:1","nodeType":"VariableDeclaration","scope":717,"src":"8264:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":711,"name":"address","nodeType":"ElementaryTypeName","src":"8264:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":714,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"8299:12:1","nodeType":"VariableDeclaration","scope":717,"src":"8291:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":713,"name":"uint256","nodeType":"ElementaryTypeName","src":"8291:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":716,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"8329:20:1","nodeType":"VariableDeclaration","scope":717,"src":"8321:28:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":715,"name":"uint256","nodeType":"ElementaryTypeName","src":"8321:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"MemoryUserOp","nameLocation":"8090:12:1","nodeType":"StructDefinition","scope":2277,"src":"8083:273:1","visibility":"public"},{"canonicalName":"EntryPoint.UserOpInfo","id":729,"members":[{"constant":false,"id":720,"mutability":"mutable","name":"mUserOp","nameLocation":"8403:7:1","nodeType":"VariableDeclaration","scope":729,"src":"8390:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":719,"nodeType":"UserDefinedTypeName","pathNode":{"id":718,"name":"MemoryUserOp","nameLocations":["8390:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"8390:12:1"},"referencedDeclaration":717,"src":"8390:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"},{"constant":false,"id":722,"mutability":"mutable","name":"userOpHash","nameLocation":"8428:10:1","nodeType":"VariableDeclaration","scope":729,"src":"8420:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":721,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8420:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":724,"mutability":"mutable","name":"prefund","nameLocation":"8456:7:1","nodeType":"VariableDeclaration","scope":729,"src":"8448:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":723,"name":"uint256","nodeType":"ElementaryTypeName","src":"8448:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":726,"mutability":"mutable","name":"contextOffset","nameLocation":"8481:13:1","nodeType":"VariableDeclaration","scope":729,"src":"8473:21:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":725,"name":"uint256","nodeType":"ElementaryTypeName","src":"8473:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":728,"mutability":"mutable","name":"preOpGas","nameLocation":"8512:8:1","nodeType":"VariableDeclaration","scope":729,"src":"8504:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":727,"name":"uint256","nodeType":"ElementaryTypeName","src":"8504:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"UserOpInfo","nameLocation":"8369:10:1","nodeType":"StructDefinition","scope":2277,"src":"8362:165:1","visibility":"public"},{"body":{"id":860,"nodeType":"Block","src":"8834:1347:1","statements":[{"assignments":[743],"declarations":[{"constant":false,"id":743,"mutability":"mutable","name":"preGas","nameLocation":"8852:6:1","nodeType":"VariableDeclaration","scope":860,"src":"8844:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":742,"name":"uint256","nodeType":"ElementaryTypeName","src":"8844:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":746,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":744,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"8861:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":745,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8861:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8844:26:1"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":748,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8888:3:1","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8892:6:1","memberName":"sender","nodeType":"MemberAccess","src":"8888:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":752,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"8910:4:1","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}],"id":751,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8902:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":750,"name":"address","nodeType":"ElementaryTypeName","src":"8902:7:1","typeDescriptions":{}}},"id":753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8902:13:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8888:27:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393220696e7465726e616c2063616c6c206f6e6c79","id":755,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8917:25:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66","typeString":"literal_string \"AA92 internal call only\""},"value":"AA92 internal call only"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66","typeString":"literal_string \"AA92 internal call only\""}],"id":747,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8880:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":756,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8880:63:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":757,"nodeType":"ExpressionStatement","src":"8880:63:1"},{"assignments":[760],"declarations":[{"constant":false,"id":760,"mutability":"mutable","name":"mUserOp","nameLocation":"8973:7:1","nodeType":"VariableDeclaration","scope":860,"src":"8953:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":759,"nodeType":"UserDefinedTypeName","pathNode":{"id":758,"name":"MemoryUserOp","nameLocations":["8953:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"8953:12:1"},"referencedDeclaration":717,"src":"8953:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":763,"initialValue":{"expression":{"id":761,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":735,"src":"8983:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":762,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8990:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"8983:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"8953:44:1"},{"assignments":[765],"declarations":[{"constant":false,"id":765,"mutability":"mutable","name":"callGasLimit","nameLocation":"9013:12:1","nodeType":"VariableDeclaration","scope":860,"src":"9008:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":764,"name":"uint","nodeType":"ElementaryTypeName","src":"9008:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":768,"initialValue":{"expression":{"id":766,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"9028:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":767,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9036:12:1","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":706,"src":"9028:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9008:40:1"},{"id":781,"nodeType":"UncheckedBlock","src":"9054:293:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":769,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"9155:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":770,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9155:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":771,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":765,"src":"9167:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":772,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"9182:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":773,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9190:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"9182:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9167:43:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"35303030","id":775,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9213:4:1","typeDescriptions":{"typeIdentifier":"t_rational_5000_by_1","typeString":"int_const 5000"},"value":"5000"},"src":"9167:50:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9155:62:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":780,"nodeType":"IfStatement","src":"9151:190:1","trueBody":{"id":779,"nodeType":"Block","src":"9219:122:1","statements":[{"AST":{"nodeType":"YulBlock","src":"9242:89:1","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9267:1:1","type":"","value":"0"},{"name":"INNER_OUT_OF_GAS","nodeType":"YulIdentifier","src":"9270:16:1"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9260:6:1"},"nodeType":"YulFunctionCall","src":"9260:27:1"},"nodeType":"YulExpressionStatement","src":"9260:27:1"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9311:1:1","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9314:2:1","type":"","value":"32"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9304:6:1"},"nodeType":"YulFunctionCall","src":"9304:13:1"},"nodeType":"YulExpressionStatement","src":"9304:13:1"}]},"evmVersion":"london","externalReferences":[{"declaration":92,"isOffset":false,"isSlot":false,"src":"9270:16:1","valueSize":1}],"id":778,"nodeType":"InlineAssembly","src":"9233:98:1"}]}}]},{"assignments":[786],"declarations":[{"constant":false,"id":786,"mutability":"mutable","name":"mode","nameLocation":"9379:4:1","nodeType":"VariableDeclaration","scope":860,"src":"9357:26:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":785,"nodeType":"UserDefinedTypeName","pathNode":{"id":784,"name":"IPaymaster.PostOpMode","nameLocations":["9357:10:1","9368:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":3359,"src":"9357:21:1"},"referencedDeclaration":3359,"src":"9357:21:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"}],"id":790,"initialValue":{"expression":{"expression":{"id":787,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"9386:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":788,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9397:10:1","memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":3359,"src":"9386:21:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$3359_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":789,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9408:11:1","memberName":"opSucceeded","nodeType":"MemberAccess","referencedDeclaration":3356,"src":"9386:33:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"VariableDeclarationStatement","src":"9357:62:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":791,"name":"callData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":732,"src":"9433:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":792,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9442:6:1","memberName":"length","nodeType":"MemberAccess","src":"9433:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":793,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9451:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9433:19:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":840,"nodeType":"IfStatement","src":"9429:466:1","trueBody":{"id":839,"nodeType":"Block","src":"9454:441:1","statements":[{"assignments":[796],"declarations":[{"constant":false,"id":796,"mutability":"mutable","name":"success","nameLocation":"9473:7:1","nodeType":"VariableDeclaration","scope":839,"src":"9468:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":795,"name":"bool","nodeType":"ElementaryTypeName","src":"9468:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":805,"initialValue":{"arguments":[{"expression":{"id":799,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"9493:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":800,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9501:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"9493:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":801,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9509:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":802,"name":"callData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":732,"src":"9512:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":803,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":765,"src":"9522:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":797,"name":"Exec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3779,"src":"9483:4:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Exec_$3779_$","typeString":"type(library Exec)"}},"id":798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9488:4:1","memberName":"call","nodeType":"MemberAccess","referencedDeclaration":3706,"src":"9483:9:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,uint256) returns (bool)"}},"id":804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9483:52:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"9468:67:1"},{"condition":{"id":807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"9553:8:1","subExpression":{"id":806,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"9554:7:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":838,"nodeType":"IfStatement","src":"9549:336:1","trueBody":{"id":837,"nodeType":"Block","src":"9563:322:1","statements":[{"assignments":[809],"declarations":[{"constant":false,"id":809,"mutability":"mutable","name":"result","nameLocation":"9594:6:1","nodeType":"VariableDeclaration","scope":837,"src":"9581:19:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":808,"name":"bytes","nodeType":"ElementaryTypeName","src":"9581:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":814,"initialValue":{"arguments":[{"id":812,"name":"REVERT_REASON_MAX_LEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":95,"src":"9622:21:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":810,"name":"Exec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3779,"src":"9603:4:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Exec_$3779_$","typeString":"type(library Exec)"}},"id":811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9608:13:1","memberName":"getReturnData","nodeType":"MemberAccess","referencedDeclaration":3741,"src":"9603:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":813,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9603:41:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9581:63:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":818,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":815,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":809,"src":"9666:6:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9673:6:1","memberName":"length","nodeType":"MemberAccess","src":"9666:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":817,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9682:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9666:17:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":830,"nodeType":"IfStatement","src":"9662:152:1","trueBody":{"id":829,"nodeType":"Block","src":"9685:129:1","statements":[{"eventCall":{"arguments":[{"expression":{"id":820,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":735,"src":"9738:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":821,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9745:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"9738:17:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":822,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"9757:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":823,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9765:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"9757:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":824,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"9773:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":825,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9781:5:1","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":704,"src":"9773:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":826,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":809,"src":"9788:6:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":819,"name":"UserOperationRevertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3176,"src":"9712:25:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes32,address,uint256,bytes memory)"}},"id":827,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9712:83:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":828,"nodeType":"EmitStatement","src":"9707:88:1"}]}},{"expression":{"id":835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":831,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":786,"src":"9831:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"expression":{"id":832,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"9838:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9849:10:1","memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":3359,"src":"9838:21:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$3359_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":834,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9860:10:1","memberName":"opReverted","nodeType":"MemberAccess","referencedDeclaration":3357,"src":"9838:32:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"src":"9831:39:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"id":836,"nodeType":"ExpressionStatement","src":"9831:39:1"}]}}]}},{"id":859,"nodeType":"UncheckedBlock","src":"9901:274:1","statements":[{"assignments":[842],"declarations":[{"constant":false,"id":842,"mutability":"mutable","name":"actualGas","nameLocation":"9929:9:1","nodeType":"VariableDeclaration","scope":859,"src":"9921:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":841,"name":"uint256","nodeType":"ElementaryTypeName","src":"9921:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":850,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":843,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":743,"src":"9941:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":844,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"9950:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9950:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9941:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":847,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":735,"src":"9962:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":848,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9969:8:1","memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":728,"src":"9962:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9941:36:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9921:56:1"},{"expression":{"arguments":[{"hexValue":"30","id":852,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10132:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":853,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":786,"src":"10135:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},{"id":854,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":735,"src":"10141:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":855,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":737,"src":"10149:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":856,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":842,"src":"10158:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":851,"name":"_handlePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2200,"src":"10118:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_enum$_PostOpMode_$3359_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,enum IPaymaster.PostOpMode,struct EntryPoint.UserOpInfo memory,bytes memory,uint256) returns (uint256)"}},"id":857,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10118:50:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":741,"id":858,"nodeType":"Return","src":"10111:57:1"}]}]},"documentation":{"id":730,"nodeType":"StructuredDocumentation","src":"8533:159:1","text":" inner function to handle a UserOperation.\n Must be declared \"external\" to open a call context, but it can only be called by handleOps."},"functionSelector":"1d732756","id":861,"implemented":true,"kind":"function","modifiers":[],"name":"innerHandleOp","nameLocation":"8706:13:1","nodeType":"FunctionDefinition","parameters":{"id":738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":732,"mutability":"mutable","name":"callData","nameLocation":"8733:8:1","nodeType":"VariableDeclaration","scope":861,"src":"8720:21:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":731,"name":"bytes","nodeType":"ElementaryTypeName","src":"8720:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":735,"mutability":"mutable","name":"opInfo","nameLocation":"8761:6:1","nodeType":"VariableDeclaration","scope":861,"src":"8743:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":734,"nodeType":"UserDefinedTypeName","pathNode":{"id":733,"name":"UserOpInfo","nameLocations":["8743:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"8743:10:1"},"referencedDeclaration":729,"src":"8743:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":737,"mutability":"mutable","name":"context","nameLocation":"8784:7:1","nodeType":"VariableDeclaration","scope":861,"src":"8769:22:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":736,"name":"bytes","nodeType":"ElementaryTypeName","src":"8769:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8719:73:1"},"returnParameters":{"id":741,"nodeType":"ParameterList","parameters":[{"constant":false,"id":740,"mutability":"mutable","name":"actualGasCost","nameLocation":"8819:13:1","nodeType":"VariableDeclaration","scope":861,"src":"8811:21:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":739,"name":"uint256","nodeType":"ElementaryTypeName","src":"8811:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8810:23:1"},"scope":2277,"src":"8697:1484:1","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[3288],"body":{"id":885,"nodeType":"Block","src":"10473:90:1","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":873,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":865,"src":"10511:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10518:4:1","memberName":"hash","nodeType":"MemberAccess","referencedDeclaration":3670,"src":"10511:11:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$_t_bytes32_$bound_to$_t_struct$_UserOperation_$3518_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes32)"}},"id":875,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10511:13:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":878,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"10534:4:1","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}],"id":877,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10526:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":876,"name":"address","nodeType":"ElementaryTypeName","src":"10526:7:1","typeDescriptions":{}}},"id":879,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10526:13:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":880,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"10541:5:1","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":881,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10547:7:1","memberName":"chainid","nodeType":"MemberAccess","src":"10541:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":871,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"10500:3:1","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":872,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10504:6:1","memberName":"encode","nodeType":"MemberAccess","src":"10500:10:1","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10500:55:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":870,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"10490:9:1","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10490:66:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":869,"id":884,"nodeType":"Return","src":"10483:73:1"}]},"documentation":{"id":862,"nodeType":"StructuredDocumentation","src":"10187:197:1","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":886,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"10398:13:1","nodeType":"FunctionDefinition","parameters":{"id":866,"nodeType":"ParameterList","parameters":[{"constant":false,"id":865,"mutability":"mutable","name":"userOp","nameLocation":"10435:6:1","nodeType":"VariableDeclaration","scope":886,"src":"10412:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":864,"nodeType":"UserDefinedTypeName","pathNode":{"id":863,"name":"UserOperation","nameLocations":["10412:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"10412:13:1"},"referencedDeclaration":3518,"src":"10412:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"10411:31:1"},"returnParameters":{"id":869,"nodeType":"ParameterList","parameters":[{"constant":false,"id":868,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":886,"src":"10464:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":867,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10464:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"10463:9:1"},"scope":2277,"src":"10389:174:1","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":988,"nodeType":"Block","src":"10761:729:1","statements":[{"expression":{"id":901,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":896,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"10771:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":898,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"10779:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"10771:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":899,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"10788:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":900,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10795:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":3497,"src":"10788:13:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10771:30:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":902,"nodeType":"ExpressionStatement","src":"10771:30:1"},{"expression":{"id":908,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":903,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"10811:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":905,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"10819:5:1","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":704,"src":"10811:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":906,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"10827:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10834:5:1","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":3499,"src":"10827:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10811:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":909,"nodeType":"ExpressionStatement","src":"10811:28:1"},{"expression":{"id":915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":910,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"10849:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":912,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"10857:12:1","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":706,"src":"10849:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":913,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"10872:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10879:12:1","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":3505,"src":"10872:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10849:42:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":916,"nodeType":"ExpressionStatement","src":"10849:42:1"},{"expression":{"id":922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":917,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"10901:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":919,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"10909:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"10901:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":920,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"10932:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":921,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10939:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":3507,"src":"10932:27:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10901:58:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":923,"nodeType":"ExpressionStatement","src":"10901:58:1"},{"expression":{"id":929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":924,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"10969:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":926,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"10977:18:1","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":710,"src":"10969:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":927,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"10998:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":928,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11005:18:1","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":3509,"src":"10998:25:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10969:54:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":930,"nodeType":"ExpressionStatement","src":"10969:54:1"},{"expression":{"id":936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":931,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"11033:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":933,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"11041:12:1","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":714,"src":"11033:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":934,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"11056:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11063:12:1","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3511,"src":"11056:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11033:42:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":937,"nodeType":"ExpressionStatement","src":"11033:42:1"},{"expression":{"id":943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":938,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"11085:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":940,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"11093:20:1","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":716,"src":"11085:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":941,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"11116:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11123:20:1","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3513,"src":"11116:27:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11085:58:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":944,"nodeType":"ExpressionStatement","src":"11085:58:1"},{"assignments":[946],"declarations":[{"constant":false,"id":946,"mutability":"mutable","name":"paymasterAndData","nameLocation":"11168:16:1","nodeType":"VariableDeclaration","scope":988,"src":"11153:31:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":945,"name":"bytes","nodeType":"ElementaryTypeName","src":"11153:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":949,"initialValue":{"expression":{"id":947,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":890,"src":"11187:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":948,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11194:16:1","memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":3515,"src":"11187:23:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"11153:57:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":950,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":946,"src":"11224:16:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":951,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11241:6:1","memberName":"length","nodeType":"MemberAccess","src":"11224:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":952,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11250:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11224:27:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":986,"nodeType":"Block","src":"11429:55:1","statements":[{"expression":{"id":984,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":977,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"11443:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":979,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"11451:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"11443:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":982,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11471:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":981,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11463:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":980,"name":"address","nodeType":"ElementaryTypeName","src":"11463:7:1","typeDescriptions":{}}},"id":983,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11463:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11443:30:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":985,"nodeType":"ExpressionStatement","src":"11443:30:1"}]},"id":987,"nodeType":"IfStatement","src":"11220:264:1","trueBody":{"id":976,"nodeType":"Block","src":"11253:170:1","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":958,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":955,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":946,"src":"11275:16:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11292:6:1","memberName":"length","nodeType":"MemberAccess","src":"11275:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":957,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11302:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"11275:29:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393320696e76616c6964207061796d6173746572416e6444617461","id":959,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11306:31:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd","typeString":"literal_string \"AA93 invalid paymasterAndData\""},"value":"AA93 invalid paymasterAndData"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd","typeString":"literal_string \"AA93 invalid paymasterAndData\""}],"id":954,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11267:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11267:71:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":961,"nodeType":"ExpressionStatement","src":"11267:71:1"},{"expression":{"id":974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":962,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":893,"src":"11352:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":964,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"11360:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"11352:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"baseExpression":{"id":969,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":946,"src":"11388:16:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":970,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11407:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"11388:22:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":968,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11380:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":967,"name":"bytes20","nodeType":"ElementaryTypeName","src":"11380:7:1","typeDescriptions":{}}},"id":972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11380:31:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":966,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11372:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":965,"name":"address","nodeType":"ElementaryTypeName","src":"11372:7:1","typeDescriptions":{}}},"id":973,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11372:40:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11352:60:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":975,"nodeType":"ExpressionStatement","src":"11352:60:1"}]}}]},"documentation":{"id":887,"nodeType":"StructuredDocumentation","src":"10569:84:1","text":" copy general fields from userOp into the memory opInfo structure."},"id":989,"implemented":true,"kind":"function","modifiers":[],"name":"_copyUserOpToMemory","nameLocation":"10667:19:1","nodeType":"FunctionDefinition","parameters":{"id":894,"nodeType":"ParameterList","parameters":[{"constant":false,"id":890,"mutability":"mutable","name":"userOp","nameLocation":"10710:6:1","nodeType":"VariableDeclaration","scope":989,"src":"10687:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":889,"nodeType":"UserDefinedTypeName","pathNode":{"id":888,"name":"UserOperation","nameLocations":["10687:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"10687:13:1"},"referencedDeclaration":3518,"src":"10687:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":893,"mutability":"mutable","name":"mUserOp","nameLocation":"10738:7:1","nodeType":"VariableDeclaration","scope":989,"src":"10718:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":892,"nodeType":"UserDefinedTypeName","pathNode":{"id":891,"name":"MemoryUserOp","nameLocations":["10718:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"10718:12:1"},"referencedDeclaration":717,"src":"10718:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"10686:60:1"},"returnParameters":{"id":895,"nodeType":"ParameterList","parameters":[],"src":"10761:0:1"},"scope":2277,"src":"10658:832:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"baseFunctions":[3295],"body":{"id":1151,"nodeType":"Block","src":"11967:1426:1","statements":[{"assignments":[998],"declarations":[{"constant":false,"id":998,"mutability":"mutable","name":"outOpInfo","nameLocation":"11995:9:1","nodeType":"VariableDeclaration","scope":1151,"src":"11977:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":997,"nodeType":"UserDefinedTypeName","pathNode":{"id":996,"name":"UserOpInfo","nameLocations":["11977:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"11977:10:1"},"referencedDeclaration":729,"src":"11977:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":999,"nodeType":"VariableDeclarationStatement","src":"11977:27:1"},{"expression":{"arguments":[{"id":1001,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":993,"src":"12042:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":1000,"name":"_simulationOnlyValidations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1351,"src":"12015:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$__$","typeString":"function (struct UserOperation calldata) view"}},"id":1002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12015:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1003,"nodeType":"ExpressionStatement","src":"12015:34:1"},{"assignments":[1005,1007],"declarations":[{"constant":false,"id":1005,"mutability":"mutable","name":"validationData","nameLocation":"12068:14:1","nodeType":"VariableDeclaration","scope":1151,"src":"12060:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1004,"name":"uint256","nodeType":"ElementaryTypeName","src":"12060:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1007,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"12092:23:1","nodeType":"VariableDeclaration","scope":1151,"src":"12084:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1006,"name":"uint256","nodeType":"ElementaryTypeName","src":"12084:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1013,"initialValue":{"arguments":[{"hexValue":"30","id":1009,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12139:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":1010,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":993,"src":"12142:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":1011,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12150:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":1008,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2011,"src":"12119:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":1012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12119:41:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"12059:101:1"},{"assignments":[1016],"declarations":[{"constant":false,"id":1016,"mutability":"mutable","name":"paymasterInfo","nameLocation":"12187:13:1","nodeType":"VariableDeclaration","scope":1151,"src":"12170:30:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":1015,"nodeType":"UserDefinedTypeName","pathNode":{"id":1014,"name":"StakeInfo","nameLocations":["12170:9:1"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"12170:9:1"},"referencedDeclaration":3443,"src":"12170:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":1022,"initialValue":{"arguments":[{"expression":{"expression":{"id":1018,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12217:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1019,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12227:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"12217:17:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1020,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12235:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"12217:27:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1017,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2708,"src":"12203:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$3443_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":1021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12203:42:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12170:75:1"},{"assignments":[1025],"declarations":[{"constant":false,"id":1025,"mutability":"mutable","name":"senderInfo","nameLocation":"12272:10:1","nodeType":"VariableDeclaration","scope":1151,"src":"12255:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":1024,"nodeType":"UserDefinedTypeName","pathNode":{"id":1023,"name":"StakeInfo","nameLocations":["12255:9:1"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"12255:9:1"},"referencedDeclaration":3443,"src":"12255:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":1031,"initialValue":{"arguments":[{"expression":{"expression":{"id":1027,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12299:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1028,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12309:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"12299:17:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1029,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12317:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"12299:24:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1026,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2708,"src":"12285:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$3443_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":1030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12285:39:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12255:69:1"},{"assignments":[1034],"declarations":[{"constant":false,"id":1034,"mutability":"mutable","name":"factoryInfo","nameLocation":"12351:11:1","nodeType":"VariableDeclaration","scope":1151,"src":"12334:28:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":1033,"nodeType":"UserDefinedTypeName","pathNode":{"id":1032,"name":"StakeInfo","nameLocations":["12334:9:1"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"12334:9:1"},"referencedDeclaration":3443,"src":"12334:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":1035,"nodeType":"VariableDeclarationStatement","src":"12334:28:1"},{"id":1069,"nodeType":"Block","src":"12372:219:1","statements":[{"assignments":[1037],"declarations":[{"constant":false,"id":1037,"mutability":"mutable","name":"initCode","nameLocation":"12401:8:1","nodeType":"VariableDeclaration","scope":1069,"src":"12386:23:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1036,"name":"bytes","nodeType":"ElementaryTypeName","src":"12386:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1040,"initialValue":{"expression":{"id":1038,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":993,"src":"12412:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1039,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12419:8:1","memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":3501,"src":"12412:15:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"12386:41:1"},{"assignments":[1042],"declarations":[{"constant":false,"id":1042,"mutability":"mutable","name":"factory","nameLocation":"12449:7:1","nodeType":"VariableDeclaration","scope":1069,"src":"12441:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1041,"name":"address","nodeType":"ElementaryTypeName","src":"12441:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1062,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1043,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1037,"src":"12459:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":1044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12468:6:1","memberName":"length","nodeType":"MemberAccess","src":"12459:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":1045,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12478:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"12459:21:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"hexValue":"30","id":1059,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12528:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1058,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12520:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1057,"name":"address","nodeType":"ElementaryTypeName","src":"12520:7:1","typeDescriptions":{}}},"id":1060,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12520:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"12459:71:1","trueExpression":{"arguments":[{"arguments":[{"baseExpression":{"id":1051,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1037,"src":"12499:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":1053,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12512:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":1054,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"12499:16:1","startExpression":{"hexValue":"30","id":1052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12508:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":1050,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12491:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":1049,"name":"bytes20","nodeType":"ElementaryTypeName","src":"12491:7:1","typeDescriptions":{}}},"id":1055,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12491:25:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":1048,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12483:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1047,"name":"address","nodeType":"ElementaryTypeName","src":"12483:7:1","typeDescriptions":{}}},"id":1056,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12483:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12441:89:1"},{"expression":{"id":1067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1063,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1034,"src":"12544:11:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1065,"name":"factory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1042,"src":"12572:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1064,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2708,"src":"12558:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$3443_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":1066,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12558:22:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"src":"12544:36:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":1068,"nodeType":"ExpressionStatement","src":"12544:36:1"}]},{"assignments":[1072],"declarations":[{"constant":false,"id":1072,"mutability":"mutable","name":"data","nameLocation":"12623:4:1","nodeType":"VariableDeclaration","scope":1151,"src":"12601:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":1071,"nodeType":"UserDefinedTypeName","pathNode":{"id":1070,"name":"ValidationData","nameLocations":["12601:14:1"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"12601:14:1"},"referencedDeclaration":2286,"src":"12601:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":1077,"initialValue":{"arguments":[{"id":1074,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1005,"src":"12650:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1075,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1007,"src":"12666:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1073,"name":"_intersectTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2430,"src":"12630:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_struct$_ValidationData_$2286_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (struct ValidationData memory)"}},"id":1076,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12630:60:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"12601:89:1"},{"assignments":[1079],"declarations":[{"constant":false,"id":1079,"mutability":"mutable","name":"aggregator","nameLocation":"12708:10:1","nodeType":"VariableDeclaration","scope":1151,"src":"12700:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1078,"name":"address","nodeType":"ElementaryTypeName","src":"12700:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1082,"initialValue":{"expression":{"id":1080,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1072,"src":"12721:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1081,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12726:10:1","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2281,"src":"12721:15:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12700:36:1"},{"assignments":[1084],"declarations":[{"constant":false,"id":1084,"mutability":"mutable","name":"sigFailed","nameLocation":"12751:9:1","nodeType":"VariableDeclaration","scope":1151,"src":"12746:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1083,"name":"bool","nodeType":"ElementaryTypeName","src":"12746:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":1091,"initialValue":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1090,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1085,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1079,"src":"12763:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"31","id":1088,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12785:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":1087,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12777:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1086,"name":"address","nodeType":"ElementaryTypeName","src":"12777:7:1","typeDescriptions":{}}},"id":1089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12777:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12763:24:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"12746:41:1"},{"assignments":[1094],"declarations":[{"constant":false,"id":1094,"mutability":"mutable","name":"returnInfo","nameLocation":"12815:10:1","nodeType":"VariableDeclaration","scope":1151,"src":"12797:28:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":1093,"nodeType":"UserDefinedTypeName","pathNode":{"id":1092,"name":"ReturnInfo","nameLocations":["12797:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":3308,"src":"12797:10:1"},"referencedDeclaration":3308,"src":"12797:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"}],"id":1110,"initialValue":{"arguments":[{"expression":{"id":1096,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12839:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1097,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12849:8:1","memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":728,"src":"12839:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":1098,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12859:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1099,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12869:7:1","memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":724,"src":"12859:17:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1100,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1084,"src":"12890:9:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"expression":{"id":1101,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1072,"src":"12901:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1102,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12906:10:1","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"12901:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"expression":{"id":1103,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1072,"src":"12918:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1104,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12923:10:1","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"12918:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"arguments":[{"expression":{"id":1106,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"12960:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1107,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12970:13:1","memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":726,"src":"12960:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1105,"name":"getMemoryBytesFromOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2271,"src":"12935:24:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":1108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12935:49:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1095,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3308,"src":"12828:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$3308_storage_ptr_$","typeString":"type(struct IEntryPoint.ReturnInfo storage pointer)"}},"id":1109,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12828:157:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12797:188:1"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1111,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1079,"src":"13000:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13022:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1113,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13014:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1112,"name":"address","nodeType":"ElementaryTypeName","src":"13014:7:1","typeDescriptions":{}}},"id":1115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13014:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13000:24:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1117,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1079,"src":"13028:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"31","id":1120,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13050:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":1119,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13042:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1118,"name":"address","nodeType":"ElementaryTypeName","src":"13042:7:1","typeDescriptions":{}}},"id":1121,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13042:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13028:24:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"13000:52:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1143,"nodeType":"IfStatement","src":"12996:305:1","trueBody":{"id":1142,"nodeType":"Block","src":"13054:247:1","statements":[{"assignments":[1126],"declarations":[{"constant":false,"id":1126,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"13095:14:1","nodeType":"VariableDeclaration","scope":1142,"src":"13068:41:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":1125,"nodeType":"UserDefinedTypeName","pathNode":{"id":1124,"name":"AggregatorStakeInfo","nameLocations":["13068:19:1"],"nodeType":"IdentifierPath","referencedDeclaration":3314,"src":"13068:19:1"},"referencedDeclaration":3314,"src":"13068:19:1","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"id":1133,"initialValue":{"arguments":[{"id":1128,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1079,"src":"13132:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":1130,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1079,"src":"13158:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1129,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2708,"src":"13144:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$3443_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":1131,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13144:25:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}],"id":1127,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3314,"src":"13112:19:1","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$3314_storage_ptr_$","typeString":"type(struct IEntryPoint.AggregatorStakeInfo storage pointer)"}},"id":1132,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13112:58:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"13068:102:1"},{"errorCall":{"arguments":[{"id":1135,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1094,"src":"13223:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},{"id":1136,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1025,"src":"13235:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":1137,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1034,"src":"13247:11:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":1138,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1016,"src":"13260:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":1139,"name":"aggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1126,"src":"13275:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}],"id":1134,"name":"ValidationResultWithAggregation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3229,"src":"13191:31:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$3308_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$_t_struct$_AggregatorStakeInfo_$3314_memory_ptr_$returns$__$","typeString":"function (struct IEntryPoint.ReturnInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IEntryPoint.AggregatorStakeInfo memory) pure"}},"id":1140,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13191:99:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1141,"nodeType":"RevertStatement","src":"13184:106:1"}]}},{"errorCall":{"arguments":[{"id":1145,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1094,"src":"13334:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},{"id":1146,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1025,"src":"13346:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":1147,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1034,"src":"13358:11:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":1148,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1016,"src":"13371:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}],"id":1144,"name":"ValidationResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3211,"src":"13317:16:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$3308_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$_t_struct$_StakeInfo_$3443_memory_ptr_$returns$__$","typeString":"function (struct IEntryPoint.ReturnInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory) pure"}},"id":1149,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13317:68:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1150,"nodeType":"RevertStatement","src":"13310:75:1"}]},"documentation":{"id":990,"nodeType":"StructuredDocumentation","src":"11496:398:1","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":1152,"implemented":true,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"11908:18:1","nodeType":"FunctionDefinition","parameters":{"id":994,"nodeType":"ParameterList","parameters":[{"constant":false,"id":993,"mutability":"mutable","name":"userOp","nameLocation":"11950:6:1","nodeType":"VariableDeclaration","scope":1152,"src":"11927:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":992,"nodeType":"UserDefinedTypeName","pathNode":{"id":991,"name":"UserOperation","nameLocations":["11927:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"11927:13:1"},"referencedDeclaration":3518,"src":"11927:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"11926:31:1"},"returnParameters":{"id":995,"nodeType":"ParameterList","parameters":[],"src":"11967:0:1"},"scope":2277,"src":"11899:1494:1","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":1194,"nodeType":"Block","src":"13505:445:1","statements":[{"id":1193,"nodeType":"UncheckedBlock","src":"13511:433:1","statements":[{"assignments":[1161],"declarations":[{"constant":false,"id":1161,"mutability":"mutable","name":"mul","nameLocation":"13711:3:1","nodeType":"VariableDeclaration","scope":1193,"src":"13703:11:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1160,"name":"uint256","nodeType":"ElementaryTypeName","src":"13703:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1172,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1162,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1155,"src":"13717:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1163,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13725:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"13717:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1166,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13746:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1165,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13738:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1164,"name":"address","nodeType":"ElementaryTypeName","src":"13738:7:1","typeDescriptions":{}}},"id":1167,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13738:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13717:31:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"31","id":1170,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13755:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"id":1171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"13717:39:1","trueExpression":{"hexValue":"33","id":1169,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13751:1:1","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"13703:53:1"},{"assignments":[1174],"declarations":[{"constant":false,"id":1174,"mutability":"mutable","name":"requiredGas","nameLocation":"13774:11:1","nodeType":"VariableDeclaration","scope":1193,"src":"13766:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1173,"name":"uint256","nodeType":"ElementaryTypeName","src":"13766:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1185,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1175,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1155,"src":"13788:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1176,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13796:12:1","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":706,"src":"13788:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1180,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1177,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1155,"src":"13811:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1178,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13819:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"13811:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1179,"name":"mul","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1161,"src":"13842:3:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13811:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13788:57:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":1182,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1155,"src":"13848:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1183,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13856:18:1","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":710,"src":"13848:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13788:86:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13766:108:1"},{"expression":{"id":1191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1186,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1158,"src":"13885:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1187,"name":"requiredGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1174,"src":"13903:11:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":1188,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1155,"src":"13917:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1189,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13925:12:1","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":714,"src":"13917:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13903:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13885:52:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1192,"nodeType":"ExpressionStatement","src":"13885:52:1"}]}]},"id":1195,"implemented":true,"kind":"function","modifiers":[],"name":"_getRequiredPrefund","nameLocation":"13408:19:1","nodeType":"FunctionDefinition","parameters":{"id":1156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1155,"mutability":"mutable","name":"mUserOp","nameLocation":"13448:7:1","nodeType":"VariableDeclaration","scope":1195,"src":"13428:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":1154,"nodeType":"UserDefinedTypeName","pathNode":{"id":1153,"name":"MemoryUserOp","nameLocations":["13428:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"13428:12:1"},"referencedDeclaration":717,"src":"13428:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"13427:29:1"},"returnParameters":{"id":1159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1158,"mutability":"mutable","name":"requiredPrefund","nameLocation":"13488:15:1","nodeType":"VariableDeclaration","scope":1195,"src":"13480:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1157,"name":"uint256","nodeType":"ElementaryTypeName","src":"13480:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13479:25:1"},"scope":2277,"src":"13399:551:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1294,"nodeType":"Block","src":"14111:777:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1205,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1202,"src":"14125:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":1206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14134:6:1","memberName":"length","nodeType":"MemberAccess","src":"14125:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":1207,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14144:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14125:20:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1293,"nodeType":"IfStatement","src":"14121:761:1","trueBody":{"id":1292,"nodeType":"Block","src":"14147:735:1","statements":[{"assignments":[1210],"declarations":[{"constant":false,"id":1210,"mutability":"mutable","name":"sender","nameLocation":"14169:6:1","nodeType":"VariableDeclaration","scope":1292,"src":"14161:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1209,"name":"address","nodeType":"ElementaryTypeName","src":"14161:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1214,"initialValue":{"expression":{"expression":{"id":1211,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1200,"src":"14178:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1212,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14185:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"14178:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1213,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14193:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"14178:21:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14161:38:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":1215,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1210,"src":"14217:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1216,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14224:4:1","memberName":"code","nodeType":"MemberAccess","src":"14217:11:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1217,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14229:6:1","memberName":"length","nodeType":"MemberAccess","src":"14217:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":1218,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14239:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14217:23:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1225,"nodeType":"IfStatement","src":"14213:88:1","trueBody":{"errorCall":{"arguments":[{"id":1221,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1197,"src":"14258:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414131302073656e64657220616c726561647920636f6e7374727563746564","id":1222,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14267:33:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79","typeString":"literal_string \"AA10 sender already constructed\""},"value":"AA10 sender already constructed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79","typeString":"literal_string \"AA10 sender already constructed\""}],"id":1220,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"14249:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1223,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14249:52:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1224,"nodeType":"RevertStatement","src":"14242:59:1"}},{"assignments":[1227],"declarations":[{"constant":false,"id":1227,"mutability":"mutable","name":"sender1","nameLocation":"14323:7:1","nodeType":"VariableDeclaration","scope":1292,"src":"14315:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1226,"name":"address","nodeType":"ElementaryTypeName","src":"14315:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1236,"initialValue":{"arguments":[{"id":1234,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1202,"src":"14403:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":1228,"name":"senderCreator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":83,"src":"14333:13:1","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"}},"id":1229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14347:12:1","memberName":"createSender","nodeType":"MemberAccess","referencedDeclaration":2651,"src":"14333:26:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes memory) external returns (address)"}},"id":1233,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"expression":{"id":1230,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1200,"src":"14366:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1231,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14373:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"14366:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1232,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14381:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"14366:35:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"14333:69:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$gas","typeString":"function (bytes memory) external returns (address)"}},"id":1235,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14333:79:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14315:97:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1237,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1227,"src":"14430:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1240,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14449:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14441:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1238,"name":"address","nodeType":"ElementaryTypeName","src":"14441:7:1","typeDescriptions":{}}},"id":1241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14441:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14430:21:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1248,"nodeType":"IfStatement","src":"14426:82:1","trueBody":{"errorCall":{"arguments":[{"id":1244,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1197,"src":"14469:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313320696e6974436f6465206661696c6564206f72204f4f47","id":1245,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14478:29:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73","typeString":"literal_string \"AA13 initCode failed or OOG\""},"value":"AA13 initCode failed or OOG"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73","typeString":"literal_string \"AA13 initCode failed or OOG\""}],"id":1243,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"14460:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14460:48:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1247,"nodeType":"RevertStatement","src":"14453:55:1"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1249,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1227,"src":"14526:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1250,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1210,"src":"14537:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14526:17:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1257,"nodeType":"IfStatement","src":"14522:83:1","trueBody":{"errorCall":{"arguments":[{"id":1253,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1197,"src":"14561:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313420696e6974436f6465206d7573742072657475726e2073656e646572","id":1254,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14570:34:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602","typeString":"literal_string \"AA14 initCode must return sender\""},"value":"AA14 initCode must return sender"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602","typeString":"literal_string \"AA14 initCode must return sender\""}],"id":1252,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"14552:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14552:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1256,"nodeType":"RevertStatement","src":"14545:60:1"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":1258,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1227,"src":"14623:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14631:4:1","memberName":"code","nodeType":"MemberAccess","src":"14623:12:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14636:6:1","memberName":"length","nodeType":"MemberAccess","src":"14623:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1261,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14646:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14623:24:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1268,"nodeType":"IfStatement","src":"14619:90:1","trueBody":{"errorCall":{"arguments":[{"id":1264,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1197,"src":"14665:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313520696e6974436f6465206d757374206372656174652073656e646572","id":1265,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14674:34:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6","typeString":"literal_string \"AA15 initCode must create sender\""},"value":"AA15 initCode must create sender"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6","typeString":"literal_string \"AA15 initCode must create sender\""}],"id":1263,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"14656:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14656:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1267,"nodeType":"RevertStatement","src":"14649:60:1"}},{"assignments":[1270],"declarations":[{"constant":false,"id":1270,"mutability":"mutable","name":"factory","nameLocation":"14731:7:1","nodeType":"VariableDeclaration","scope":1292,"src":"14723:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1269,"name":"address","nodeType":"ElementaryTypeName","src":"14723:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1281,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":1275,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1202,"src":"14757:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":1277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14770:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":1278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"14757:16:1","startExpression":{"hexValue":"30","id":1276,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14766:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":1274,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14749:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":1273,"name":"bytes20","nodeType":"ElementaryTypeName","src":"14749:7:1","typeDescriptions":{}}},"id":1279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14749:25:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":1272,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14741:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1271,"name":"address","nodeType":"ElementaryTypeName","src":"14741:7:1","typeDescriptions":{}}},"id":1280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14741:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14723:52:1"},{"eventCall":{"arguments":[{"expression":{"id":1283,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1200,"src":"14810:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1284,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14817:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"14810:17:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1285,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1210,"src":"14829:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1286,"name":"factory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1270,"src":"14837:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"expression":{"id":1287,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1200,"src":"14846:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1288,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14853:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"14846:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1289,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14861:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"14846:24:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":1282,"name":"AccountDeployed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3165,"src":"14794:15:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address,address)"}},"id":1290,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14794:77:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1291,"nodeType":"EmitStatement","src":"14789:82:1"}]}}]},"id":1295,"implemented":true,"kind":"function","modifiers":[],"name":"_createSenderIfNeeded","nameLocation":"14012:21:1","nodeType":"FunctionDefinition","parameters":{"id":1203,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1197,"mutability":"mutable","name":"opIndex","nameLocation":"14042:7:1","nodeType":"VariableDeclaration","scope":1295,"src":"14034:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1196,"name":"uint256","nodeType":"ElementaryTypeName","src":"14034:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1200,"mutability":"mutable","name":"opInfo","nameLocation":"14069:6:1","nodeType":"VariableDeclaration","scope":1295,"src":"14051:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":1199,"nodeType":"UserDefinedTypeName","pathNode":{"id":1198,"name":"UserOpInfo","nameLocations":["14051:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"14051:10:1"},"referencedDeclaration":729,"src":"14051:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":1202,"mutability":"mutable","name":"initCode","nameLocation":"14092:8:1","nodeType":"VariableDeclaration","scope":1295,"src":"14077:23:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1201,"name":"bytes","nodeType":"ElementaryTypeName","src":"14077:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"14033:68:1"},"returnParameters":{"id":1204,"nodeType":"ParameterList","parameters":[],"src":"14111:0:1"},"scope":2277,"src":"14003:885:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[3320],"body":{"id":1312,"nodeType":"Block","src":"15294:114:1","statements":[{"assignments":[1302],"declarations":[{"constant":false,"id":1302,"mutability":"mutable","name":"sender","nameLocation":"15312:6:1","nodeType":"VariableDeclaration","scope":1312,"src":"15304:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1301,"name":"address","nodeType":"ElementaryTypeName","src":"15304:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1307,"initialValue":{"arguments":[{"id":1305,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1298,"src":"15348:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":1303,"name":"senderCreator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":83,"src":"15321:13:1","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$2652","typeString":"contract SenderCreator"}},"id":1304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15335:12:1","memberName":"createSender","nodeType":"MemberAccess","referencedDeclaration":2651,"src":"15321:26:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes memory) external returns (address)"}},"id":1306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15321:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"15304:53:1"},{"errorCall":{"arguments":[{"id":1309,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1302,"src":"15394:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1308,"name":"SenderAddressResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3234,"src":"15374:19:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":1310,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15374:27:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1311,"nodeType":"RevertStatement","src":"15367:34:1"}]},"documentation":{"id":1296,"nodeType":"StructuredDocumentation","src":"14894:337:1","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":1313,"implemented":true,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"15245:16:1","nodeType":"FunctionDefinition","parameters":{"id":1299,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1298,"mutability":"mutable","name":"initCode","nameLocation":"15277:8:1","nodeType":"VariableDeclaration","scope":1313,"src":"15262:23:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1297,"name":"bytes","nodeType":"ElementaryTypeName","src":"15262:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"15261:25:1"},"returnParameters":{"id":1300,"nodeType":"ParameterList","parameters":[],"src":"15294:0:1"},"scope":2277,"src":"15236:172:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1350,"nodeType":"Block","src":"15495:340:1","statements":[{"clauses":[{"block":{"id":1328,"nodeType":"Block","src":"15652:2:1","statements":[]},"errorName":"","id":1329,"nodeType":"TryCatchClause","src":"15652:2:1"},{"block":{"id":1347,"nodeType":"Block","src":"15703:126:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1339,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":1335,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1331,"src":"15727:12:1","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1334,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15721:5:1","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1333,"name":"bytes","nodeType":"ElementaryTypeName","src":"15721:5:1","typeDescriptions":{}}},"id":1336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15721:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15741:6:1","memberName":"length","nodeType":"MemberAccess","src":"15721:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":1338,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15751:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15721:31:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1346,"nodeType":"IfStatement","src":"15717:102:1","trueBody":{"id":1345,"nodeType":"Block","src":"15754:65:1","statements":[{"errorCall":{"arguments":[{"hexValue":"30","id":1341,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15788:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":1342,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1331,"src":"15791:12:1","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1340,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"15779:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1343,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15779:25:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1344,"nodeType":"RevertStatement","src":"15772:32:1"}]}}]},"errorName":"Error","id":1348,"nodeType":"TryCatchClause","parameters":{"id":1332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1331,"mutability":"mutable","name":"revertReason","nameLocation":"15689:12:1","nodeType":"VariableDeclaration","scope":1348,"src":"15675:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1330,"name":"string","nodeType":"ElementaryTypeName","src":"15675:6:1","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"15674:28:1"},"src":"15663:166:1"}],"externalCall":{"arguments":[{"expression":{"id":1321,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1316,"src":"15595:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15602:8:1","memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":3501,"src":"15595:15:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"expression":{"id":1323,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1316,"src":"15612:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15619:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":3497,"src":"15612:13:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1325,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1316,"src":"15627:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15634:16:1","memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":3515,"src":"15627:23:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":1319,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"15562:4:1","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$2277","typeString":"contract EntryPoint"}},"id":1320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15567:27:1","memberName":"_validateSenderAndPaymaster","nodeType":"MemberAccess","referencedDeclaration":1412,"src":"15562:32:1","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory,address,bytes memory) view external"}},"id":1327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15562:89:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1349,"nodeType":"TryStatement","src":"15558:271:1"}]},"id":1351,"implemented":true,"kind":"function","modifiers":[],"name":"_simulationOnlyValidations","nameLocation":"15423:26:1","nodeType":"FunctionDefinition","parameters":{"id":1317,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1316,"mutability":"mutable","name":"userOp","nameLocation":"15473:6:1","nodeType":"VariableDeclaration","scope":1351,"src":"15450:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1315,"nodeType":"UserDefinedTypeName","pathNode":{"id":1314,"name":"UserOperation","nameLocations":["15450:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"15450:13:1"},"referencedDeclaration":3518,"src":"15450:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"15449:31:1"},"returnParameters":{"id":1318,"nodeType":"ParameterList","parameters":[],"src":"15495:0:1"},"scope":2277,"src":"15414:421:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1411,"nodeType":"Block","src":"16126:562:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1370,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1361,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1354,"src":"16140:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":1362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16149:6:1","memberName":"length","nodeType":"MemberAccess","src":"16140:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16159:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16140:20:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":1365,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1356,"src":"16164:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16171:4:1","memberName":"code","nodeType":"MemberAccess","src":"16164:11:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16176:6:1","memberName":"length","nodeType":"MemberAccess","src":"16164:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16186:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16164:23:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16140:47:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1376,"nodeType":"IfStatement","src":"16136:182:1","trueBody":{"id":1375,"nodeType":"Block","src":"16189:129:1","statements":[{"expression":{"arguments":[{"hexValue":"41413230206163636f756e74206e6f74206465706c6f796564","id":1372,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16279:27:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e","typeString":"literal_string \"AA20 account not deployed\""},"value":"AA20 account not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e","typeString":"literal_string \"AA20 account not deployed\""}],"id":1371,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16272:6:1","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1373,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16272:35:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1374,"nodeType":"ExpressionStatement","src":"16272:35:1"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1380,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1377,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1358,"src":"16331:16:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":1378,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16348:6:1","memberName":"length","nodeType":"MemberAccess","src":"16331:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":1379,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16358:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"16331:29:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1406,"nodeType":"IfStatement","src":"16327:310:1","trueBody":{"id":1405,"nodeType":"Block","src":"16362:275:1","statements":[{"assignments":[1382],"declarations":[{"constant":false,"id":1382,"mutability":"mutable","name":"paymaster","nameLocation":"16384:9:1","nodeType":"VariableDeclaration","scope":1405,"src":"16376:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1381,"name":"address","nodeType":"ElementaryTypeName","src":"16376:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1393,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":1387,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1358,"src":"16412:16:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":1389,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16433:2:1","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":1390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"16412:24:1","startExpression":{"hexValue":"30","id":1388,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16429:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":1386,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16404:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":1385,"name":"bytes20","nodeType":"ElementaryTypeName","src":"16404:7:1","typeDescriptions":{}}},"id":1391,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16404:33:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":1384,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16396:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1383,"name":"address","nodeType":"ElementaryTypeName","src":"16396:7:1","typeDescriptions":{}}},"id":1392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16396:42:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"16376:62:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":1394,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1382,"src":"16456:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16466:4:1","memberName":"code","nodeType":"MemberAccess","src":"16456:14:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16471:6:1","memberName":"length","nodeType":"MemberAccess","src":"16456:21:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1397,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16481:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16456:26:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1404,"nodeType":"IfStatement","src":"16452:175:1","trueBody":{"id":1403,"nodeType":"Block","src":"16484:143:1","statements":[{"expression":{"arguments":[{"hexValue":"41413330207061796d6173746572206e6f74206465706c6f796564","id":1400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16582:29:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60","typeString":"literal_string \"AA30 paymaster not deployed\""},"value":"AA30 paymaster not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60","typeString":"literal_string \"AA30 paymaster not deployed\""}],"id":1399,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16575:6:1","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16575:37:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1402,"nodeType":"ExpressionStatement","src":"16575:37:1"}]}}]}},{"expression":{"arguments":[{"hexValue":"","id":1408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16678:2:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":1407,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16671:6:1","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":1409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16671:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1410,"nodeType":"ExpressionStatement","src":"16671:10:1"}]},"documentation":{"id":1352,"nodeType":"StructuredDocumentation","src":"15841:155:1","text":" Called only during simulation.\n This function always reverts to prevent warm/cold storage differentiation in simulation vs execution."},"functionSelector":"957122ab","id":1412,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSenderAndPaymaster","nameLocation":"16010:27:1","nodeType":"FunctionDefinition","parameters":{"id":1359,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1354,"mutability":"mutable","name":"initCode","nameLocation":"16053:8:1","nodeType":"VariableDeclaration","scope":1412,"src":"16038:23:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1353,"name":"bytes","nodeType":"ElementaryTypeName","src":"16038:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1356,"mutability":"mutable","name":"sender","nameLocation":"16071:6:1","nodeType":"VariableDeclaration","scope":1412,"src":"16063:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1355,"name":"address","nodeType":"ElementaryTypeName","src":"16063:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1358,"mutability":"mutable","name":"paymasterAndData","nameLocation":"16094:16:1","nodeType":"VariableDeclaration","scope":1412,"src":"16079:31:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1357,"name":"bytes","nodeType":"ElementaryTypeName","src":"16079:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"16037:74:1"},"returnParameters":{"id":1360,"nodeType":"ParameterList","parameters":[],"src":"16126:0:1"},"scope":2277,"src":"16001:687:1","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":1583,"nodeType":"Block","src":"17115:1380:1","statements":[{"id":1582,"nodeType":"UncheckedBlock","src":"17121:1368:1","statements":[{"assignments":[1431],"declarations":[{"constant":false,"id":1431,"mutability":"mutable","name":"preGas","nameLocation":"17149:6:1","nodeType":"VariableDeclaration","scope":1582,"src":"17141:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1430,"name":"uint256","nodeType":"ElementaryTypeName","src":"17141:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1434,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":1432,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"17158:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17158:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17141:26:1"},{"assignments":[1437],"declarations":[{"constant":false,"id":1437,"mutability":"mutable","name":"mUserOp","nameLocation":"17197:7:1","nodeType":"VariableDeclaration","scope":1582,"src":"17177:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":1436,"nodeType":"UserDefinedTypeName","pathNode":{"id":1435,"name":"MemoryUserOp","nameLocations":["17177:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"17177:12:1"},"referencedDeclaration":717,"src":"17177:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":1440,"initialValue":{"expression":{"id":1438,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1421,"src":"17207:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1439,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17214:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"17207:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"17177:44:1"},{"assignments":[1442],"declarations":[{"constant":false,"id":1442,"mutability":"mutable","name":"sender","nameLocation":"17239:6:1","nodeType":"VariableDeclaration","scope":1582,"src":"17231:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1441,"name":"address","nodeType":"ElementaryTypeName","src":"17231:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1445,"initialValue":{"expression":{"id":1443,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"17248:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1444,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17256:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"17248:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"17231:31:1"},{"expression":{"arguments":[{"id":1447,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1415,"src":"17294:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1448,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1421,"src":"17303:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"expression":{"id":1449,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1418,"src":"17311:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17314:8:1","memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":3501,"src":"17311:11:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":1446,"name":"_createSenderIfNeeded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1295,"src":"17272:21:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (uint256,struct EntryPoint.UserOpInfo memory,bytes calldata)"}},"id":1451,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17272:51:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1452,"nodeType":"ExpressionStatement","src":"17272:51:1"},{"assignments":[1454],"declarations":[{"constant":false,"id":1454,"mutability":"mutable","name":"paymaster","nameLocation":"17341:9:1","nodeType":"VariableDeclaration","scope":1582,"src":"17333:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1453,"name":"address","nodeType":"ElementaryTypeName","src":"17333:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1457,"initialValue":{"expression":{"id":1455,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"17353:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1456,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17361:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"17353:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"17333:37:1"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":1458,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2276,"src":"17380:12:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":1459,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17380:14:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1460,"nodeType":"ExpressionStatement","src":"17380:14:1"},{"assignments":[1462],"declarations":[{"constant":false,"id":1462,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"17412:19:1","nodeType":"VariableDeclaration","scope":1582,"src":"17404:27:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1461,"name":"uint256","nodeType":"ElementaryTypeName","src":"17404:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1464,"initialValue":{"hexValue":"30","id":1463,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17434:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"17404:31:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1465,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1454,"src":"17449:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1468,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17470:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1467,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17462:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1466,"name":"address","nodeType":"ElementaryTypeName","src":"17462:7:1","typeDescriptions":{}}},"id":1469,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17462:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"17449:23:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1489,"nodeType":"IfStatement","src":"17445:170:1","trueBody":{"id":1488,"nodeType":"Block","src":"17474:141:1","statements":[{"assignments":[1472],"declarations":[{"constant":false,"id":1472,"mutability":"mutable","name":"bal","nameLocation":"17496:3:1","nodeType":"VariableDeclaration","scope":1488,"src":"17488:11:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1471,"name":"uint256","nodeType":"ElementaryTypeName","src":"17488:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1476,"initialValue":{"arguments":[{"id":1474,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1442,"src":"17512:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1473,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17502:9:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":1475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17502:17:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17488:31:1"},{"expression":{"id":1486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1477,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1462,"src":"17533:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1478,"name":"bal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1472,"src":"17555:3:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1479,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1423,"src":"17561:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17555:21:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1482,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1423,"src":"17583:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":1483,"name":"bal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1472,"src":"17601:3:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17583:21:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"17555:49:1","trueExpression":{"hexValue":"30","id":1481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17579:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17533:71:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1487,"nodeType":"ExpressionStatement","src":"17533:71:1"}]}},{"clauses":[{"block":{"id":1509,"nodeType":"Block","src":"17782:57:1","statements":[{"expression":{"id":1507,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1505,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1428,"src":"17796:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1506,"name":"_validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1503,"src":"17813:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17796:32:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1508,"nodeType":"ExpressionStatement","src":"17796:32:1"}]},"errorName":"","id":1510,"nodeType":"TryCatchClause","parameters":{"id":1504,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1503,"mutability":"mutable","name":"_validationData","nameLocation":"17765:15:1","nodeType":"VariableDeclaration","scope":1510,"src":"17757:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1502,"name":"uint256","nodeType":"ElementaryTypeName","src":"17757:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17756:25:1"},"src":"17748:91:1"},{"block":{"id":1524,"nodeType":"Block","src":"17880:97:1","statements":[{"errorCall":{"arguments":[{"id":1515,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1415,"src":"17910:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"414132332072657665727465643a20","id":1519,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17933:17:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5","typeString":"literal_string \"AA23 reverted: \""},"value":"AA23 reverted: "},{"id":1520,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"17952:12:1","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5","typeString":"literal_string \"AA23 reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":1517,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17919:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1516,"name":"string","nodeType":"ElementaryTypeName","src":"17919:6:1","typeDescriptions":{}}},"id":1518,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17926:6:1","memberName":"concat","nodeType":"MemberAccess","src":"17919:13:1","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":1521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17919:46:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1514,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"17901:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17901:65:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1523,"nodeType":"RevertStatement","src":"17894:72:1"}]},"errorName":"Error","id":1525,"nodeType":"TryCatchClause","parameters":{"id":1513,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1512,"mutability":"mutable","name":"revertReason","nameLocation":"17866:12:1","nodeType":"VariableDeclaration","scope":1525,"src":"17852:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1511,"name":"string","nodeType":"ElementaryTypeName","src":"17852:6:1","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"17851:28:1"},"src":"17840:137:1"},{"block":{"id":1531,"nodeType":"Block","src":"17984:75:1","statements":[{"errorCall":{"arguments":[{"id":1527,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1415,"src":"18014:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141323320726576657274656420286f72204f4f4729","id":1528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18023:24:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d","typeString":"literal_string \"AA23 reverted (or OOG)\""},"value":"AA23 reverted (or OOG)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d","typeString":"literal_string \"AA23 reverted (or OOG)\""}],"id":1526,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"18005:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18005:43:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1530,"nodeType":"RevertStatement","src":"17998:50:1"}]},"errorName":"","id":1532,"nodeType":"TryCatchClause","src":"17978:81:1"}],"externalCall":{"arguments":[{"id":1497,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1418,"src":"17696:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"expression":{"id":1498,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1421,"src":"17700:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1499,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17707:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"17700:17:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1500,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1462,"src":"17719:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":1491,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1442,"src":"17637:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1490,"name":"IAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3094,"src":"17628:8:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IAccount_$3094_$","typeString":"type(contract IAccount)"}},"id":1492,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17628:16:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IAccount_$3094","typeString":"contract IAccount"}},"id":1493,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17645:14:1","memberName":"validateUserOp","nodeType":"MemberAccess","referencedDeclaration":3093,"src":"17628:31:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$3518_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_uint256_$","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (uint256)"}},"id":1496,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":1494,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"17666:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1495,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17674:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"17666:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"17628:67:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$3518_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_uint256_$gas","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (uint256)"}},"id":1501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17628:111:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1533,"nodeType":"TryStatement","src":"17624:435:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1534,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1454,"src":"18072:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1537,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18093:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1536,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18085:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1535,"name":"address","nodeType":"ElementaryTypeName","src":"18085:7:1","typeDescriptions":{}}},"id":1538,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18085:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18072:23:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1574,"nodeType":"IfStatement","src":"18068:350:1","trueBody":{"id":1573,"nodeType":"Block","src":"18097:321:1","statements":[{"assignments":[1542],"declarations":[{"constant":false,"id":1542,"mutability":"mutable","name":"senderInfo","nameLocation":"18131:10:1","nodeType":"VariableDeclaration","scope":1573,"src":"18111:30:1","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":1541,"nodeType":"UserDefinedTypeName","pathNode":{"id":1540,"name":"DepositInfo","nameLocations":["18111:11:1"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"18111:11:1"},"referencedDeclaration":3438,"src":"18111:11:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":1546,"initialValue":{"baseExpression":{"id":1543,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"18144:8:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":1545,"indexExpression":{"id":1544,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1442,"src":"18153:6:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18144:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"18111:49:1"},{"assignments":[1548],"declarations":[{"constant":false,"id":1548,"mutability":"mutable","name":"deposit","nameLocation":"18182:7:1","nodeType":"VariableDeclaration","scope":1573,"src":"18174:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1547,"name":"uint256","nodeType":"ElementaryTypeName","src":"18174:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1551,"initialValue":{"expression":{"id":1549,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1542,"src":"18192:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":1550,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18203:7:1","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"18192:18:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"18174:36:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1552,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1423,"src":"18228:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1553,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"18246:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18228:25:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1561,"nodeType":"IfStatement","src":"18224:115:1","trueBody":{"id":1560,"nodeType":"Block","src":"18255:84:1","statements":[{"errorCall":{"arguments":[{"id":1556,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1415,"src":"18289:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413231206469646e2774207061792070726566756e64","id":1557,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18298:25:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d","typeString":"literal_string \"AA21 didn't pay prefund\""},"value":"AA21 didn't pay prefund"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d","typeString":"literal_string \"AA21 didn't pay prefund\""}],"id":1555,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"18280:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18280:44:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1559,"nodeType":"RevertStatement","src":"18273:51:1"}]}},{"expression":{"id":1571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1562,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1542,"src":"18352:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":1564,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"18363:7:1","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"18352:18:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1567,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"18381:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":1568,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1423,"src":"18391:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18381:25:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1566,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18373:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":1565,"name":"uint112","nodeType":"ElementaryTypeName","src":"18373:7:1","typeDescriptions":{}}},"id":1570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18373:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"18352:55:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":1572,"nodeType":"ExpressionStatement","src":"18352:55:1"}]}},{"expression":{"id":1580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1575,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1426,"src":"18427:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1579,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1576,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1431,"src":"18464:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":1577,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"18473:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18473:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18464:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18427:55:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1581,"nodeType":"ExpressionStatement","src":"18427:55:1"}]}]},"documentation":{"id":1413,"nodeType":"StructuredDocumentation","src":"16694:195:1","text":" call account.validateUserOp.\n revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n decrement account's deposit if needed"},"id":1584,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAccountPrepayment","nameLocation":"16903:26:1","nodeType":"FunctionDefinition","parameters":{"id":1424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1415,"mutability":"mutable","name":"opIndex","nameLocation":"16938:7:1","nodeType":"VariableDeclaration","scope":1584,"src":"16930:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1414,"name":"uint256","nodeType":"ElementaryTypeName","src":"16930:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1418,"mutability":"mutable","name":"op","nameLocation":"16970:2:1","nodeType":"VariableDeclaration","scope":1584,"src":"16947:25:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1417,"nodeType":"UserDefinedTypeName","pathNode":{"id":1416,"name":"UserOperation","nameLocations":["16947:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"16947:13:1"},"referencedDeclaration":3518,"src":"16947:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":1421,"mutability":"mutable","name":"opInfo","nameLocation":"16992:6:1","nodeType":"VariableDeclaration","scope":1584,"src":"16974:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":1420,"nodeType":"UserDefinedTypeName","pathNode":{"id":1419,"name":"UserOpInfo","nameLocations":["16974:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"16974:10:1"},"referencedDeclaration":729,"src":"16974:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":1423,"mutability":"mutable","name":"requiredPrefund","nameLocation":"17008:15:1","nodeType":"VariableDeclaration","scope":1584,"src":"17000:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1422,"name":"uint256","nodeType":"ElementaryTypeName","src":"17000:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16929:95:1"},"returnParameters":{"id":1429,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1426,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"17055:34:1","nodeType":"VariableDeclaration","scope":1584,"src":"17047:42:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1425,"name":"uint256","nodeType":"ElementaryTypeName","src":"17047:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1428,"mutability":"mutable","name":"validationData","nameLocation":"17099:14:1","nodeType":"VariableDeclaration","scope":1584,"src":"17091:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1427,"name":"uint256","nodeType":"ElementaryTypeName","src":"17091:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17046:68:1"},"scope":2277,"src":"16894:1601:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1716,"nodeType":"Block","src":"18998:1172:1","statements":[{"id":1715,"nodeType":"UncheckedBlock","src":"19004:1160:1","statements":[{"assignments":[1606],"declarations":[{"constant":false,"id":1606,"mutability":"mutable","name":"mUserOp","nameLocation":"19044:7:1","nodeType":"VariableDeclaration","scope":1715,"src":"19024:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":1605,"nodeType":"UserDefinedTypeName","pathNode":{"id":1604,"name":"MemoryUserOp","nameLocations":["19024:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"19024:12:1"},"referencedDeclaration":717,"src":"19024:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":1609,"initialValue":{"expression":{"id":1607,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1593,"src":"19054:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1608,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19061:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"19054:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"19024:44:1"},{"assignments":[1611],"declarations":[{"constant":false,"id":1611,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"19086:20:1","nodeType":"VariableDeclaration","scope":1715,"src":"19078:28:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1610,"name":"uint256","nodeType":"ElementaryTypeName","src":"19078:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1614,"initialValue":{"expression":{"id":1612,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1606,"src":"19109:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1613,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19117:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"19109:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19078:59:1"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1616,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1611,"src":"19155:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1617,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1597,"src":"19178:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19155:57:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141343120746f6f206c6974746c6520766572696669636174696f6e476173","id":1619,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"19214:33:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5","typeString":"literal_string \"AA41 too little verificationGas\""},"value":"AA41 too little verificationGas"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5","typeString":"literal_string \"AA41 too little verificationGas\""}],"id":1615,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"19147:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1620,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19147:101:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1621,"nodeType":"ExpressionStatement","src":"19147:101:1"},{"assignments":[1623],"declarations":[{"constant":false,"id":1623,"mutability":"mutable","name":"gas","nameLocation":"19266:3:1","nodeType":"VariableDeclaration","scope":1715,"src":"19258:11:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1622,"name":"uint256","nodeType":"ElementaryTypeName","src":"19258:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1627,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1624,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1611,"src":"19272:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":1625,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1597,"src":"19295:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19272:57:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19258:71:1"},{"assignments":[1629],"declarations":[{"constant":false,"id":1629,"mutability":"mutable","name":"paymaster","nameLocation":"19348:9:1","nodeType":"VariableDeclaration","scope":1715,"src":"19340:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1628,"name":"address","nodeType":"ElementaryTypeName","src":"19340:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1632,"initialValue":{"expression":{"id":1630,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1606,"src":"19360:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1631,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19368:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"19360:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"19340:37:1"},{"assignments":[1635],"declarations":[{"constant":false,"id":1635,"mutability":"mutable","name":"paymasterInfo","nameLocation":"19407:13:1","nodeType":"VariableDeclaration","scope":1715,"src":"19387:33:1","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":1634,"nodeType":"UserDefinedTypeName","pathNode":{"id":1633,"name":"DepositInfo","nameLocations":["19387:11:1"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"19387:11:1"},"referencedDeclaration":3438,"src":"19387:11:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":1639,"initialValue":{"baseExpression":{"id":1636,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"19423:8:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":1638,"indexExpression":{"id":1637,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1629,"src":"19432:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19423:19:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"19387:55:1"},{"assignments":[1641],"declarations":[{"constant":false,"id":1641,"mutability":"mutable","name":"deposit","nameLocation":"19460:7:1","nodeType":"VariableDeclaration","scope":1715,"src":"19452:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1640,"name":"uint256","nodeType":"ElementaryTypeName","src":"19452:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1644,"initialValue":{"expression":{"id":1642,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1635,"src":"19470:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":1643,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19484:7:1","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"19470:21:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"19452:39:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1645,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1641,"src":"19505:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1646,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1595,"src":"19515:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19505:25:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1654,"nodeType":"IfStatement","src":"19501:114:1","trueBody":{"id":1653,"nodeType":"Block","src":"19532:83:1","statements":[{"errorCall":{"arguments":[{"id":1649,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"19562:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413331207061796d6173746572206465706f73697420746f6f206c6f77","id":1650,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"19571:32:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f","typeString":"literal_string \"AA31 paymaster deposit too low\""},"value":"AA31 paymaster deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f","typeString":"literal_string \"AA31 paymaster deposit too low\""}],"id":1648,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"19553:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19553:51:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1652,"nodeType":"RevertStatement","src":"19546:58:1"}]}},{"expression":{"id":1664,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1655,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1635,"src":"19624:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":1657,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"19638:7:1","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"19624:21:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1662,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1660,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1641,"src":"19656:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":1661,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1595,"src":"19666:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19656:25:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1659,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19648:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":1658,"name":"uint112","nodeType":"ElementaryTypeName","src":"19648:7:1","typeDescriptions":{}}},"id":1663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19648:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"19624:58:1","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":1665,"nodeType":"ExpressionStatement","src":"19624:58:1"},{"clauses":[{"block":{"id":1690,"nodeType":"Block","src":"19849:89:1","statements":[{"expression":{"id":1684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1682,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1600,"src":"19863:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1683,"name":"_context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1678,"src":"19873:8:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"src":"19863:18:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1685,"nodeType":"ExpressionStatement","src":"19863:18:1"},{"expression":{"id":1688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1686,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1602,"src":"19895:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1687,"name":"_validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1680,"src":"19912:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19895:32:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1689,"nodeType":"ExpressionStatement","src":"19895:32:1"}]},"errorName":"","id":1691,"nodeType":"TryCatchClause","parameters":{"id":1681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1678,"mutability":"mutable","name":"_context","nameLocation":"19815:8:1","nodeType":"VariableDeclaration","scope":1691,"src":"19802:21:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1677,"name":"bytes","nodeType":"ElementaryTypeName","src":"19802:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1680,"mutability":"mutable","name":"_validationData","nameLocation":"19833:15:1","nodeType":"VariableDeclaration","scope":1691,"src":"19825:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1679,"name":"uint256","nodeType":"ElementaryTypeName","src":"19825:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19801:48:1"},"src":"19793:145:1"},{"block":{"id":1705,"nodeType":"Block","src":"19979:97:1","statements":[{"errorCall":{"arguments":[{"id":1696,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"20009:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"414133332072657665727465643a20","id":1700,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20032:17:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e","typeString":"literal_string \"AA33 reverted: \""},"value":"AA33 reverted: "},{"id":1701,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1693,"src":"20051:12:1","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e","typeString":"literal_string \"AA33 reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":1698,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"20018:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1697,"name":"string","nodeType":"ElementaryTypeName","src":"20018:6:1","typeDescriptions":{}}},"id":1699,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"20025:6:1","memberName":"concat","nodeType":"MemberAccess","src":"20018:13:1","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":1702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20018:46:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1695,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"20000:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20000:65:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1704,"nodeType":"RevertStatement","src":"19993:72:1"}]},"errorName":"Error","id":1706,"nodeType":"TryCatchClause","parameters":{"id":1694,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1693,"mutability":"mutable","name":"revertReason","nameLocation":"19965:12:1","nodeType":"VariableDeclaration","scope":1706,"src":"19951:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1692,"name":"string","nodeType":"ElementaryTypeName","src":"19951:6:1","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"19950:28:1"},"src":"19939:137:1"},{"block":{"id":1712,"nodeType":"Block","src":"20083:75:1","statements":[{"errorCall":{"arguments":[{"id":1708,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"20113:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141333320726576657274656420286f72204f4f4729","id":1709,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20122:24:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c","typeString":"literal_string \"AA33 reverted (or OOG)\""},"value":"AA33 reverted (or OOG)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c","typeString":"literal_string \"AA33 reverted (or OOG)\""}],"id":1707,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"20104:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1710,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20104:43:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1711,"nodeType":"RevertStatement","src":"20097:50:1"}]},"errorName":"","id":1713,"nodeType":"TryCatchClause","src":"20077:81:1"}],"externalCall":{"arguments":[{"id":1672,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1590,"src":"19753:2:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"expression":{"id":1673,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1593,"src":"19757:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1674,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19764:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"19757:17:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1675,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1595,"src":"19776:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":1667,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1629,"src":"19707:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1666,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"19696:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":1668,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19696:21:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$3386","typeString":"contract IPaymaster"}},"id":1669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19718:23:1","memberName":"validatePaymasterUserOp","nodeType":"MemberAccess","referencedDeclaration":3374,"src":"19696:45:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$3518_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (bytes memory,uint256)"}},"id":1671,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"id":1670,"name":"gas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1623,"src":"19748:3:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"19696:56:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$3518_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$gas","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (bytes memory,uint256)"}},"id":1676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19696:96:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"id":1714,"nodeType":"TryStatement","src":"19692:466:1"}]}]},"documentation":{"id":1585,"nodeType":"StructuredDocumentation","src":"18501:247:1","text":" In case the request has a paymaster:\n Validate paymaster has enough deposit.\n Call paymaster.validatePaymasterUserOp.\n Revert with proper FailedOp in case paymaster reverts.\n Decrement paymaster's deposit"},"id":1717,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterPrepayment","nameLocation":"18762:28:1","nodeType":"FunctionDefinition","parameters":{"id":1598,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1587,"mutability":"mutable","name":"opIndex","nameLocation":"18799:7:1","nodeType":"VariableDeclaration","scope":1717,"src":"18791:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1586,"name":"uint256","nodeType":"ElementaryTypeName","src":"18791:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1590,"mutability":"mutable","name":"op","nameLocation":"18831:2:1","nodeType":"VariableDeclaration","scope":1717,"src":"18808:25:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1589,"nodeType":"UserDefinedTypeName","pathNode":{"id":1588,"name":"UserOperation","nameLocations":["18808:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"18808:13:1"},"referencedDeclaration":3518,"src":"18808:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":1593,"mutability":"mutable","name":"opInfo","nameLocation":"18853:6:1","nodeType":"VariableDeclaration","scope":1717,"src":"18835:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":1592,"nodeType":"UserDefinedTypeName","pathNode":{"id":1591,"name":"UserOpInfo","nameLocations":["18835:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"18835:10:1"},"referencedDeclaration":729,"src":"18835:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":1595,"mutability":"mutable","name":"requiredPreFund","nameLocation":"18869:15:1","nodeType":"VariableDeclaration","scope":1717,"src":"18861:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1594,"name":"uint256","nodeType":"ElementaryTypeName","src":"18861:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1597,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"18894:34:1","nodeType":"VariableDeclaration","scope":1717,"src":"18886:42:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1596,"name":"uint256","nodeType":"ElementaryTypeName","src":"18886:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18790:139:1"},"returnParameters":{"id":1603,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1600,"mutability":"mutable","name":"context","nameLocation":"18965:7:1","nodeType":"VariableDeclaration","scope":1717,"src":"18952:20:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1599,"name":"bytes","nodeType":"ElementaryTypeName","src":"18952:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1602,"mutability":"mutable","name":"validationData","nameLocation":"18982:14:1","nodeType":"VariableDeclaration","scope":1717,"src":"18974:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1601,"name":"uint256","nodeType":"ElementaryTypeName","src":"18974:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18951:46:1"},"scope":2277,"src":"18753:1417:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1787,"nodeType":"Block","src":"20446:893:1","statements":[{"assignments":[1730,1732],"declarations":[{"constant":false,"id":1730,"mutability":"mutable","name":"aggregator","nameLocation":"20465:10:1","nodeType":"VariableDeclaration","scope":1787,"src":"20457:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1729,"name":"address","nodeType":"ElementaryTypeName","src":"20457:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1732,"mutability":"mutable","name":"outOfTimeRange","nameLocation":"20482:14:1","nodeType":"VariableDeclaration","scope":1787,"src":"20477:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1731,"name":"bool","nodeType":"ElementaryTypeName","src":"20477:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":1736,"initialValue":{"arguments":[{"id":1734,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1722,"src":"20519:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1733,"name":"_getValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1836,"src":"20500:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_address_$_t_bool_$","typeString":"function (uint256) view returns (address,bool)"}},"id":1735,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20500:34:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"nodeType":"VariableDeclarationStatement","src":"20456:78:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1737,"name":"expectedAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1726,"src":"20548:18:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1738,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1730,"src":"20570:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"20548:32:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1746,"nodeType":"IfStatement","src":"20544:111:1","trueBody":{"id":1745,"nodeType":"Block","src":"20582:73:1","statements":[{"errorCall":{"arguments":[{"id":1741,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1720,"src":"20612:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413234207369676e6174757265206572726f72","id":1742,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20621:22:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""},"value":"AA24 signature error"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""}],"id":1740,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"20603:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20603:41:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1744,"nodeType":"RevertStatement","src":"20596:48:1"}]}},{"condition":{"id":1747,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1732,"src":"20668:14:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1754,"nodeType":"IfStatement","src":"20664:96:1","trueBody":{"id":1753,"nodeType":"Block","src":"20684:76:1","statements":[{"errorCall":{"arguments":[{"id":1749,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1720,"src":"20714:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414132322065787069726564206f72206e6f7420647565","id":1750,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20723:25:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766","typeString":"literal_string \"AA22 expired or not due\""},"value":"AA22 expired or not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766","typeString":"literal_string \"AA22 expired or not due\""}],"id":1748,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"20705:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20705:44:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1752,"nodeType":"RevertStatement","src":"20698:51:1"}]}},{"assignments":[1756],"declarations":[{"constant":false,"id":1756,"mutability":"mutable","name":"pmAggregator","nameLocation":"21005:12:1","nodeType":"VariableDeclaration","scope":1787,"src":"20997:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1755,"name":"address","nodeType":"ElementaryTypeName","src":"20997:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1757,"nodeType":"VariableDeclarationStatement","src":"20997:20:1"},{"expression":{"id":1764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":1758,"name":"pmAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1756,"src":"21028:12:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1759,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1732,"src":"21042:14:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":1760,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"21027:30:1","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1762,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1724,"src":"21079:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1761,"name":"_getValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1836,"src":"21060:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_address_$_t_bool_$","typeString":"function (uint256) view returns (address,bool)"}},"id":1763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21060:43:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"src":"21027:76:1","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1765,"nodeType":"ExpressionStatement","src":"21027:76:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1771,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1766,"name":"pmAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1756,"src":"21117:12:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1769,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21141:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1768,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21133:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1767,"name":"address","nodeType":"ElementaryTypeName","src":"21133:7:1","typeDescriptions":{}}},"id":1770,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21133:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21117:26:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1778,"nodeType":"IfStatement","src":"21113:105:1","trueBody":{"id":1777,"nodeType":"Block","src":"21145:73:1","statements":[{"errorCall":{"arguments":[{"id":1773,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1720,"src":"21175:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413334207369676e6174757265206572726f72","id":1774,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21184:22:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871","typeString":"literal_string \"AA34 signature error\""},"value":"AA34 signature error"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871","typeString":"literal_string \"AA34 signature error\""}],"id":1772,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"21166:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21166:41:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1776,"nodeType":"RevertStatement","src":"21159:48:1"}]}},{"condition":{"id":1779,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1732,"src":"21231:14:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1786,"nodeType":"IfStatement","src":"21227:106:1","trueBody":{"id":1785,"nodeType":"Block","src":"21247:86:1","statements":[{"errorCall":{"arguments":[{"id":1781,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1720,"src":"21277:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413332207061796d61737465722065787069726564206f72206e6f7420647565","id":1782,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21286:35:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b","typeString":"literal_string \"AA32 paymaster expired or not due\""},"value":"AA32 paymaster expired or not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b","typeString":"literal_string \"AA32 paymaster expired or not due\""}],"id":1780,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"21268:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21268:54:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1784,"nodeType":"RevertStatement","src":"21261:61:1"}]}}]},"documentation":{"id":1718,"nodeType":"StructuredDocumentation","src":"20176:97:1","text":" revert if either account validationData or paymaster validationData is expired"},"id":1788,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAccountAndPaymasterValidationData","nameLocation":"20287:42:1","nodeType":"FunctionDefinition","parameters":{"id":1727,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1720,"mutability":"mutable","name":"opIndex","nameLocation":"20338:7:1","nodeType":"VariableDeclaration","scope":1788,"src":"20330:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1719,"name":"uint256","nodeType":"ElementaryTypeName","src":"20330:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1722,"mutability":"mutable","name":"validationData","nameLocation":"20355:14:1","nodeType":"VariableDeclaration","scope":1788,"src":"20347:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1721,"name":"uint256","nodeType":"ElementaryTypeName","src":"20347:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1724,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"20379:23:1","nodeType":"VariableDeclaration","scope":1788,"src":"20371:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1723,"name":"uint256","nodeType":"ElementaryTypeName","src":"20371:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1726,"mutability":"mutable","name":"expectedAggregator","nameLocation":"20412:18:1","nodeType":"VariableDeclaration","scope":1788,"src":"20404:26:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1725,"name":"address","nodeType":"ElementaryTypeName","src":"20404:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"20329:102:1"},"returnParameters":{"id":1728,"nodeType":"ParameterList","parameters":[],"src":"20446:0:1"},"scope":2277,"src":"20278:1061:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1835,"nodeType":"Block","src":"21461:356:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1797,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1790,"src":"21475:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21493:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21475:19:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1808,"nodeType":"IfStatement","src":"21471:76:1","trueBody":{"id":1807,"nodeType":"Block","src":"21496:51:1","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":1802,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21526:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1801,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21518:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1800,"name":"address","nodeType":"ElementaryTypeName","src":"21518:7:1","typeDescriptions":{}}},"id":1803,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21518:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"66616c7365","id":1804,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"21530:5:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"id":1805,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"21517:19:1","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"functionReturnParameters":1796,"id":1806,"nodeType":"Return","src":"21510:26:1"}]}},{"assignments":[1811],"declarations":[{"constant":false,"id":1811,"mutability":"mutable","name":"data","nameLocation":"21578:4:1","nodeType":"VariableDeclaration","scope":1835,"src":"21556:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":1810,"nodeType":"UserDefinedTypeName","pathNode":{"id":1809,"name":"ValidationData","nameLocations":["21556:14:1"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"21556:14:1"},"referencedDeclaration":2286,"src":"21556:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":1815,"initialValue":{"arguments":[{"id":1813,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1790,"src":"21606:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1812,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2345,"src":"21585:20:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$2286_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":1814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21585:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"21556:65:1"},{"expression":{"id":1828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1816,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1795,"src":"21685:14:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1827,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1817,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"21702:5:1","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":1818,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"21708:9:1","memberName":"timestamp","nodeType":"MemberAccess","src":"21702:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"id":1819,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1811,"src":"21720:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1820,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21725:10:1","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"21720:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"21702:33:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1822,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"21739:5:1","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":1823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"21745:9:1","memberName":"timestamp","nodeType":"MemberAccess","src":"21739:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":1824,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1811,"src":"21757:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1825,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21762:10:1","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"21757:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"21739:33:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"21702:70:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"21685:87:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1829,"nodeType":"ExpressionStatement","src":"21685:87:1"},{"expression":{"id":1833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1830,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1793,"src":"21782:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":1831,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1811,"src":"21795:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":1832,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21800:10:1","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2281,"src":"21795:15:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21782:28:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1834,"nodeType":"ExpressionStatement","src":"21782:28:1"}]},"id":1836,"implemented":true,"kind":"function","modifiers":[],"name":"_getValidationData","nameLocation":"21354:18:1","nodeType":"FunctionDefinition","parameters":{"id":1791,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1790,"mutability":"mutable","name":"validationData","nameLocation":"21381:14:1","nodeType":"VariableDeclaration","scope":1836,"src":"21373:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1789,"name":"uint256","nodeType":"ElementaryTypeName","src":"21373:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"21372:24:1"},"returnParameters":{"id":1796,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1793,"mutability":"mutable","name":"aggregator","nameLocation":"21428:10:1","nodeType":"VariableDeclaration","scope":1836,"src":"21420:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1792,"name":"address","nodeType":"ElementaryTypeName","src":"21420:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1795,"mutability":"mutable","name":"outOfTimeRange","nameLocation":"21445:14:1","nodeType":"VariableDeclaration","scope":1836,"src":"21440:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1794,"name":"bool","nodeType":"ElementaryTypeName","src":"21440:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"21419:41:1"},"scope":2277,"src":"21345:472:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":2010,"nodeType":"Block","src":"22358:1844:1","statements":[{"assignments":[1853],"declarations":[{"constant":false,"id":1853,"mutability":"mutable","name":"preGas","nameLocation":"22377:6:1","nodeType":"VariableDeclaration","scope":2010,"src":"22369:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1852,"name":"uint256","nodeType":"ElementaryTypeName","src":"22369:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1856,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":1854,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"22386:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1855,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22386:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22369:26:1"},{"assignments":[1859],"declarations":[{"constant":false,"id":1859,"mutability":"mutable","name":"mUserOp","nameLocation":"22425:7:1","nodeType":"VariableDeclaration","scope":2010,"src":"22405:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":1858,"nodeType":"UserDefinedTypeName","pathNode":{"id":1857,"name":"MemoryUserOp","nameLocations":["22405:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"22405:12:1"},"referencedDeclaration":717,"src":"22405:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":1862,"initialValue":{"expression":{"id":1860,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"22435:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1861,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22445:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"22435:17:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"22405:47:1"},{"expression":{"arguments":[{"id":1864,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"22482:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":1865,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"22490:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":1863,"name":"_copyUserOpToMemory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":989,"src":"22462:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_MemoryUserOp_$717_memory_ptr_$returns$__$","typeString":"function (struct UserOperation calldata,struct EntryPoint.MemoryUserOp memory) pure"}},"id":1866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22462:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1867,"nodeType":"ExpressionStatement","src":"22462:36:1"},{"expression":{"id":1874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1868,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"22508:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1870,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"22518:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"22508:20:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1872,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"22545:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":1871,"name":"getUserOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":886,"src":"22531:13:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (struct UserOperation calldata) view returns (bytes32)"}},"id":1873,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22531:21:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"22508:44:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":1875,"nodeType":"ExpressionStatement","src":"22508:44:1"},{"assignments":[1877],"declarations":[{"constant":false,"id":1877,"mutability":"mutable","name":"maxGasValues","nameLocation":"22723:12:1","nodeType":"VariableDeclaration","scope":2010,"src":"22715:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1876,"name":"uint256","nodeType":"ElementaryTypeName","src":"22715:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1892,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1891,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1885,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1882,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1878,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"22738:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1879,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22746:18:1","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":710,"src":"22738:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":1880,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"22767:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1881,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22775:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"22767:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:57:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":1883,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"22798:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1884,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22806:12:1","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":706,"src":"22798:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:80:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":1886,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"22829:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22836:12:1","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3511,"src":"22829:19:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:110:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":1889,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"22851:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22858:20:1","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3513,"src":"22851:27:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:140:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22715:163:1"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1900,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1894,"name":"maxGasValues","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1877,"src":"22896:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":1897,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22917:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"},"typeName":{"id":1896,"name":"uint120","nodeType":"ElementaryTypeName","src":"22917:7:1","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"}],"id":1895,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"22912:4:1","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":1898,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22912:13:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint120","typeString":"type(uint120)"}},"id":1899,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"22926:3:1","memberName":"max","nodeType":"MemberAccess","src":"22912:17:1","typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"}},"src":"22896:33:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"41413934206761732076616c756573206f766572666c6f77","id":1901,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"22931:26:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69","typeString":"literal_string \"AA94 gas values overflow\""},"value":"AA94 gas values overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69","typeString":"literal_string \"AA94 gas values overflow\""}],"id":1893,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"22888:7:1","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1902,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22888:70:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1903,"nodeType":"ExpressionStatement","src":"22888:70:1"},{"assignments":[1905],"declarations":[{"constant":false,"id":1905,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"22977:34:1","nodeType":"VariableDeclaration","scope":2010,"src":"22969:42:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1904,"name":"uint256","nodeType":"ElementaryTypeName","src":"22969:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1906,"nodeType":"VariableDeclarationStatement","src":"22969:42:1"},{"assignments":[1908],"declarations":[{"constant":false,"id":1908,"mutability":"mutable","name":"requiredPreFund","nameLocation":"23030:15:1","nodeType":"VariableDeclaration","scope":2010,"src":"23022:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1907,"name":"uint256","nodeType":"ElementaryTypeName","src":"23022:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1912,"initialValue":{"arguments":[{"id":1910,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"23069:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":1909,"name":"_getRequiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1195,"src":"23049:19:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_MemoryUserOp_$717_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct EntryPoint.MemoryUserOp memory) pure returns (uint256)"}},"id":1911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23049:28:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"23021:56:1"},{"expression":{"id":1922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":1913,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1905,"src":"23088:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1914,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1848,"src":"23124:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1915,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"23087:52:1","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1917,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1839,"src":"23169:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1918,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"23178:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":1919,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"23186:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":1920,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1908,"src":"23197:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1916,"name":"_validateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1584,"src":"23142:26:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256) returns (uint256,uint256)"}},"id":1921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23142:71:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"23087:126:1","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1923,"nodeType":"ExpressionStatement","src":"23087:126:1"},{"condition":{"id":1930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"23228:55:1","subExpression":{"arguments":[{"expression":{"id":1925,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"23253:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1926,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23261:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"23253:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":1927,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"23269:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1928,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23277:5:1","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":704,"src":"23269:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1924,"name":"_validateAndUpdateNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2604,"src":"23229:23:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) returns (bool)"}},"id":1929,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23229:54:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1937,"nodeType":"IfStatement","src":"23224:140:1","trueBody":{"id":1936,"nodeType":"Block","src":"23285:79:1","statements":[{"errorCall":{"arguments":[{"id":1932,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1839,"src":"23315:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141323520696e76616c6964206163636f756e74206e6f6e6365","id":1933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23324:28:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5","typeString":"literal_string \"AA25 invalid account nonce\""},"value":"AA25 invalid account nonce"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5","typeString":"literal_string \"AA25 invalid account nonce\""}],"id":1931,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"23306:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23306:47:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1935,"nodeType":"RevertStatement","src":"23299:54:1"}]}},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":1938,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2276,"src":"23540:12:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":1939,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23540:14:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1940,"nodeType":"ExpressionStatement","src":"23540:14:1"},{"assignments":[1942],"declarations":[{"constant":false,"id":1942,"mutability":"mutable","name":"context","nameLocation":"23578:7:1","nodeType":"VariableDeclaration","scope":2010,"src":"23565:20:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1941,"name":"bytes","nodeType":"ElementaryTypeName","src":"23565:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1943,"nodeType":"VariableDeclarationStatement","src":"23565:20:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1950,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1944,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1859,"src":"23599:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":1945,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23607:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"23599:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23628:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1947,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23620:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1946,"name":"address","nodeType":"ElementaryTypeName","src":"23620:7:1","typeDescriptions":{}}},"id":1949,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23620:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"23599:31:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1964,"nodeType":"IfStatement","src":"23595:208:1","trueBody":{"id":1963,"nodeType":"Block","src":"23632:171:1","statements":[{"expression":{"id":1961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":1951,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1942,"src":"23647:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":1952,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1850,"src":"23656:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":1953,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"23646:34:1","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1955,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1839,"src":"23712:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1956,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"23721:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":1957,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"23729:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":1958,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1908,"src":"23740:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1959,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1905,"src":"23757:34:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1954,"name":"_validatePaymasterPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1717,"src":"23683:28:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$3518_calldata_ptr_$_t_struct$_UserOpInfo_$729_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256,uint256) returns (bytes memory,uint256)"}},"id":1960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23683:109:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"src":"23646:146:1","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1962,"nodeType":"ExpressionStatement","src":"23646:146:1"}]}},{"id":2009,"nodeType":"UncheckedBlock","src":"23808:388:1","statements":[{"assignments":[1966],"declarations":[{"constant":false,"id":1966,"mutability":"mutable","name":"gasUsed","nameLocation":"23836:7:1","nodeType":"VariableDeclaration","scope":2009,"src":"23828:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1965,"name":"uint256","nodeType":"ElementaryTypeName","src":"23828:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1971,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1970,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1967,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1853,"src":"23846:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":1968,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"23855:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23855:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23846:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"23828:36:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1972,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"23879:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1973,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"23886:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":3507,"src":"23879:27:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1974,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1966,"src":"23909:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23879:37:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1982,"nodeType":"IfStatement","src":"23875:126:1","trueBody":{"id":1981,"nodeType":"Block","src":"23918:83:1","statements":[{"errorCall":{"arguments":[{"id":1977,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1839,"src":"23948:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413430206f76657220766572696669636174696f6e4761734c696d6974","id":1978,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23957:32:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf","typeString":"literal_string \"AA40 over verificationGasLimit\""},"value":"AA40 over verificationGasLimit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf","typeString":"literal_string \"AA40 over verificationGasLimit\""}],"id":1976,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"23939:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":1979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23939:51:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1980,"nodeType":"RevertStatement","src":"23932:58:1"}]}},{"expression":{"id":1987,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1983,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"24010:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1985,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"24020:7:1","memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":724,"src":"24010:17:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1986,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1908,"src":"24030:15:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24010:35:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1988,"nodeType":"ExpressionStatement","src":"24010:35:1"},{"expression":{"id":1995,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1989,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"24055:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1991,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"24065:13:1","memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":726,"src":"24055:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1993,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1942,"src":"24104:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1992,"name":"getOffsetOfMemoryBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2262,"src":"24081:22:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) pure returns (uint256)"}},"id":1994,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24081:31:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24055:57:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1996,"nodeType":"ExpressionStatement","src":"24055:57:1"},{"expression":{"id":2007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":1997,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1845,"src":"24122:9:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":1999,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"24132:8:1","memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":728,"src":"24122:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2006,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2000,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1853,"src":"24143:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":2001,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"24152:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":2002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24152:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24143:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":2004,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1842,"src":"24164:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":2005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"24171:18:1","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":3509,"src":"24164:25:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24143:46:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24122:67:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2008,"nodeType":"ExpressionStatement","src":"24122:67:1"}]}]},"documentation":{"id":1837,"nodeType":"StructuredDocumentation","src":"21823:346:1","text":" validate account and paymaster (if defined).\n also make sure total validation doesn't exceed verificationGasLimit\n this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n @param opIndex the index of this userOp into the \"opInfos\" array\n @param userOp the userOp to validate"},"id":2011,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePrepayment","nameLocation":"22183:19:1","nodeType":"FunctionDefinition","parameters":{"id":1846,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1839,"mutability":"mutable","name":"opIndex","nameLocation":"22211:7:1","nodeType":"VariableDeclaration","scope":2011,"src":"22203:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1838,"name":"uint256","nodeType":"ElementaryTypeName","src":"22203:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1842,"mutability":"mutable","name":"userOp","nameLocation":"22243:6:1","nodeType":"VariableDeclaration","scope":2011,"src":"22220:29:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1841,"nodeType":"UserDefinedTypeName","pathNode":{"id":1840,"name":"UserOperation","nameLocations":["22220:13:1"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"22220:13:1"},"referencedDeclaration":3518,"src":"22220:13:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":1845,"mutability":"mutable","name":"outOpInfo","nameLocation":"22269:9:1","nodeType":"VariableDeclaration","scope":2011,"src":"22251:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":1844,"nodeType":"UserDefinedTypeName","pathNode":{"id":1843,"name":"UserOpInfo","nameLocations":["22251:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"22251:10:1"},"referencedDeclaration":729,"src":"22251:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"src":"22202:77:1"},"returnParameters":{"id":1851,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1848,"mutability":"mutable","name":"validationData","nameLocation":"22309:14:1","nodeType":"VariableDeclaration","scope":2011,"src":"22301:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1847,"name":"uint256","nodeType":"ElementaryTypeName","src":"22301:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1850,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"22333:23:1","nodeType":"VariableDeclaration","scope":2011,"src":"22325:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1849,"name":"uint256","nodeType":"ElementaryTypeName","src":"22325:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"22300:57:1"},"scope":2277,"src":"22174:2028:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":2199,"nodeType":"Block","src":"25021:1761:1","statements":[{"assignments":[2030],"declarations":[{"constant":false,"id":2030,"mutability":"mutable","name":"preGas","nameLocation":"25039:6:1","nodeType":"VariableDeclaration","scope":2199,"src":"25031:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2029,"name":"uint256","nodeType":"ElementaryTypeName","src":"25031:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2033,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":2031,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"25048:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":2032,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25048:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25031:26:1"},{"id":2198,"nodeType":"UncheckedBlock","src":"25063:1700:1","statements":[{"assignments":[2035],"declarations":[{"constant":false,"id":2035,"mutability":"mutable","name":"refundAddress","nameLocation":"25091:13:1","nodeType":"VariableDeclaration","scope":2198,"src":"25083:21:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2034,"name":"address","nodeType":"ElementaryTypeName","src":"25083:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2036,"nodeType":"VariableDeclarationStatement","src":"25083:21:1"},{"assignments":[2039],"declarations":[{"constant":false,"id":2039,"mutability":"mutable","name":"mUserOp","nameLocation":"25134:7:1","nodeType":"VariableDeclaration","scope":2198,"src":"25114:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":2038,"nodeType":"UserDefinedTypeName","pathNode":{"id":2037,"name":"MemoryUserOp","nameLocations":["25114:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"25114:12:1"},"referencedDeclaration":717,"src":"25114:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":2042,"initialValue":{"expression":{"id":2040,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"25144:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":2041,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25151:7:1","memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":720,"src":"25144:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"25114:44:1"},{"assignments":[2044],"declarations":[{"constant":false,"id":2044,"mutability":"mutable","name":"gasPrice","nameLocation":"25176:8:1","nodeType":"VariableDeclaration","scope":2198,"src":"25168:16:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2043,"name":"uint256","nodeType":"ElementaryTypeName","src":"25168:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2048,"initialValue":{"arguments":[{"id":2046,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"25205:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":2045,"name":"getUserOpGasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2236,"src":"25187:17:1","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_MemoryUserOp_$717_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct EntryPoint.MemoryUserOp memory) view returns (uint256)"}},"id":2047,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25187:26:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25168:45:1"},{"assignments":[2050],"declarations":[{"constant":false,"id":2050,"mutability":"mutable","name":"paymaster","nameLocation":"25232:9:1","nodeType":"VariableDeclaration","scope":2198,"src":"25224:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2049,"name":"address","nodeType":"ElementaryTypeName","src":"25224:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2053,"initialValue":{"expression":{"id":2051,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"25244:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2052,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25252:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"25244:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25224:37:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2054,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2050,"src":"25275:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":2057,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25296:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2056,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25288:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2055,"name":"address","nodeType":"ElementaryTypeName","src":"25288:7:1","typeDescriptions":{}}},"id":2058,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25288:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25275:23:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":2138,"nodeType":"Block","src":"25361:869:1","statements":[{"expression":{"id":2068,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2066,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2035,"src":"25375:13:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2067,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2050,"src":"25391:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25375:25:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2069,"nodeType":"ExpressionStatement","src":"25375:25:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2070,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2022,"src":"25418:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2071,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25426:6:1","memberName":"length","nodeType":"MemberAccess","src":"25418:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2072,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25435:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"25418:18:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2137,"nodeType":"IfStatement","src":"25414:806:1","trueBody":{"id":2136,"nodeType":"Block","src":"25438:782:1","statements":[{"expression":{"id":2078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2074,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"25456:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2077,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2075,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2024,"src":"25472:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":2076,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2044,"src":"25484:8:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25472:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25456:36:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2079,"nodeType":"ExpressionStatement","src":"25456:36:1"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},"id":2084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2080,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2017,"src":"25514:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"expression":{"id":2081,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"25522:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":2082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25533:10:1","memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":3359,"src":"25522:21:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$3359_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":2083,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"25544:14:1","memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":3358,"src":"25522:36:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"src":"25514:44:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":2134,"nodeType":"Block","src":"25701:505:1","statements":[{"clauses":[{"block":{"id":2109,"nodeType":"Block","src":"25887:2:1","statements":[]},"errorName":"","id":2110,"nodeType":"TryCatchClause","src":"25887:2:1"},{"block":{"id":2124,"nodeType":"Block","src":"25944:122:1","statements":[{"errorCall":{"arguments":[{"id":2115,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2014,"src":"25986:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"4141353020706f73744f702072657665727465643a20","id":2119,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26009:24:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023","typeString":"literal_string \"AA50 postOp reverted: \""},"value":"AA50 postOp reverted: "},{"id":2120,"name":"reason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2112,"src":"26035:6:1","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023","typeString":"literal_string \"AA50 postOp reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":2117,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25995:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":2116,"name":"string","nodeType":"ElementaryTypeName","src":"25995:6:1","typeDescriptions":{}}},"id":2118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26002:6:1","memberName":"concat","nodeType":"MemberAccess","src":"25995:13:1","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":2121,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25995:47:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2114,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"25977:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":2122,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25977:66:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2123,"nodeType":"RevertStatement","src":"25970:73:1"}]},"errorName":"Error","id":2125,"nodeType":"TryCatchClause","parameters":{"id":2113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2112,"mutability":"mutable","name":"reason","nameLocation":"25936:6:1","nodeType":"VariableDeclaration","scope":2125,"src":"25922:20:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2111,"name":"string","nodeType":"ElementaryTypeName","src":"25922:6:1","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"25921:22:1"},"src":"25910:156:1"},{"block":{"id":2131,"nodeType":"Block","src":"26093:95:1","statements":[{"errorCall":{"arguments":[{"id":2127,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2014,"src":"26135:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141353020706f73744f7020726576657274","id":2128,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26144:20:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706","typeString":"literal_string \"AA50 postOp revert\""},"value":"AA50 postOp revert"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706","typeString":"literal_string \"AA50 postOp revert\""}],"id":2126,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"26126:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":2129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26126:39:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2130,"nodeType":"RevertStatement","src":"26119:46:1"}]},"errorName":"","id":2132,"nodeType":"TryCatchClause","src":"26087:101:1"}],"externalCall":{"arguments":[{"id":2105,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2017,"src":"25857:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},{"id":2106,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2022,"src":"25863:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2107,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"25872:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":2099,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2050,"src":"25803:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2098,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"25792:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":2100,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25792:21:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$3386","typeString":"contract IPaymaster"}},"id":2101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25814:6:1","memberName":"postOp","nodeType":"MemberAccess","referencedDeclaration":3385,"src":"25792:28:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$3359_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":2104,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":2102,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"25827:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2103,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25835:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"25827:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"25792:64:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$3359_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$gas","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":2108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25792:94:1","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2133,"nodeType":"TryStatement","src":"25788:400:1"}]},"id":2135,"nodeType":"IfStatement","src":"25510:696:1","trueBody":{"id":2097,"nodeType":"Block","src":"25560:135:1","statements":[{"expression":{"arguments":[{"id":2092,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2017,"src":"25647:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},{"id":2093,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2022,"src":"25653:7:1","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2094,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"25662:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":2086,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2050,"src":"25593:9:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2085,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"25582:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":2087,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25582:21:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$3386","typeString":"contract IPaymaster"}},"id":2088,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25604:6:1","memberName":"postOp","nodeType":"MemberAccess","referencedDeclaration":3385,"src":"25582:28:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$3359_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":2091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":2089,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"25617:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2090,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25625:20:1","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":708,"src":"25617:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"25582:64:1","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$3359_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$gas","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":2095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25582:94:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2096,"nodeType":"ExpressionStatement","src":"25582:94:1"}]}}]}}]},"id":2139,"nodeType":"IfStatement","src":"25271:959:1","trueBody":{"id":2065,"nodeType":"Block","src":"25300:55:1","statements":[{"expression":{"id":2063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2060,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2035,"src":"25314:13:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":2061,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"25330:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2062,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25338:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"25330:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25314:30:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2064,"nodeType":"ExpressionStatement","src":"25314:30:1"}]}},{"expression":{"id":2145,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2140,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2024,"src":"26239:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2144,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2141,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2030,"src":"26252:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":2142,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"26261:7:1","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":2143,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26261:9:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26252:18:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26239:31:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2146,"nodeType":"ExpressionStatement","src":"26239:31:1"},{"expression":{"id":2151,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2147,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"26280:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2148,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2024,"src":"26296:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":2149,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2044,"src":"26308:8:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26296:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26280:36:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2152,"nodeType":"ExpressionStatement","src":"26280:36:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2156,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2153,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"26330:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":2154,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26337:7:1","memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":724,"src":"26330:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2155,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"26347:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26330:30:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2163,"nodeType":"IfStatement","src":"26326:121:1","trueBody":{"id":2162,"nodeType":"Block","src":"26362:85:1","statements":[{"errorCall":{"arguments":[{"id":2158,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2014,"src":"26392:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414135312070726566756e642062656c6f772061637475616c476173436f7374","id":2159,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26401:34:1","typeDescriptions":{"typeIdentifier":"t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb","typeString":"literal_string \"AA51 prefund below actualGasCost\""},"value":"AA51 prefund below actualGasCost"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb","typeString":"literal_string \"AA51 prefund below actualGasCost\""}],"id":2157,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3191,"src":"26383:8:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":2160,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26383:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2161,"nodeType":"RevertStatement","src":"26376:60:1"}]}},{"assignments":[2165],"declarations":[{"constant":false,"id":2165,"mutability":"mutable","name":"refund","nameLocation":"26464:6:1","nodeType":"VariableDeclaration","scope":2198,"src":"26456:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2164,"name":"uint256","nodeType":"ElementaryTypeName","src":"26456:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2170,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2169,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2166,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"26473:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":2167,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26480:7:1","memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":724,"src":"26473:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":2168,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"26490:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26473:30:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"26456:47:1"},{"expression":{"arguments":[{"id":2172,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2035,"src":"26531:13:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2173,"name":"refund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2165,"src":"26546:6:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2171,"name":"_incrementDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2773,"src":"26513:17:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":2174,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26513:40:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2175,"nodeType":"ExpressionStatement","src":"26513:40:1"},{"assignments":[2177],"declarations":[{"constant":false,"id":2177,"mutability":"mutable","name":"success","nameLocation":"26568:7:1","nodeType":"VariableDeclaration","scope":2198,"src":"26563:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2176,"name":"bool","nodeType":"ElementaryTypeName","src":"26563:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2183,"initialValue":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},"id":2182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2178,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2017,"src":"26578:4:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"expression":{"id":2179,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3386,"src":"26586:10:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$3386_$","typeString":"type(contract IPaymaster)"}},"id":2180,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26597:10:1","memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":3359,"src":"26586:21:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$3359_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":2181,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"26608:11:1","memberName":"opSucceeded","nodeType":"MemberAccess","referencedDeclaration":3356,"src":"26586:33:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"src":"26578:41:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"26563:56:1"},{"eventCall":{"arguments":[{"expression":{"id":2185,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2020,"src":"26653:6:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":2186,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26660:10:1","memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":722,"src":"26653:17:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":2187,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"26672:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2188,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26680:6:1","memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":702,"src":"26672:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2189,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"26688:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2190,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26696:9:1","memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":712,"src":"26688:17:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2191,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2039,"src":"26707:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2192,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26715:5:1","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":704,"src":"26707:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2193,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2177,"src":"26722:7:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":2194,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2027,"src":"26731:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2195,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2024,"src":"26746:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2184,"name":"UserOperationEvent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3154,"src":"26634:18:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$_t_bool_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (bytes32,address,address,uint256,bool,uint256,uint256)"}},"id":2196,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26634:122:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2197,"nodeType":"EmitStatement","src":"26629:127:1"}]}]},"documentation":{"id":2012,"nodeType":"StructuredDocumentation","src":"24208:633:1","text":" process post-operation.\n called just after the callData is executed.\n if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n the excess amount is refunded to the account (or paymaster - if it was used in the request)\n @param opIndex index in the batch\n @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n @param opInfo userOp fields and info collected during validation\n @param context the context returned in validatePaymasterUserOp\n @param actualGas the gas used so far by this user operation"},"id":2200,"implemented":true,"kind":"function","modifiers":[],"name":"_handlePostOp","nameLocation":"24855:13:1","nodeType":"FunctionDefinition","parameters":{"id":2025,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2014,"mutability":"mutable","name":"opIndex","nameLocation":"24877:7:1","nodeType":"VariableDeclaration","scope":2200,"src":"24869:15:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2013,"name":"uint256","nodeType":"ElementaryTypeName","src":"24869:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2017,"mutability":"mutable","name":"mode","nameLocation":"24908:4:1","nodeType":"VariableDeclaration","scope":2200,"src":"24886:26:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":2016,"nodeType":"UserDefinedTypeName","pathNode":{"id":2015,"name":"IPaymaster.PostOpMode","nameLocations":["24886:10:1","24897:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":3359,"src":"24886:21:1"},"referencedDeclaration":3359,"src":"24886:21:1","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":2020,"mutability":"mutable","name":"opInfo","nameLocation":"24932:6:1","nodeType":"VariableDeclaration","scope":2200,"src":"24914:24:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":2019,"nodeType":"UserDefinedTypeName","pathNode":{"id":2018,"name":"UserOpInfo","nameLocations":["24914:10:1"],"nodeType":"IdentifierPath","referencedDeclaration":729,"src":"24914:10:1"},"referencedDeclaration":729,"src":"24914:10:1","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$729_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":2022,"mutability":"mutable","name":"context","nameLocation":"24953:7:1","nodeType":"VariableDeclaration","scope":2200,"src":"24940:20:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2021,"name":"bytes","nodeType":"ElementaryTypeName","src":"24940:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2024,"mutability":"mutable","name":"actualGas","nameLocation":"24970:9:1","nodeType":"VariableDeclaration","scope":2200,"src":"24962:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2023,"name":"uint256","nodeType":"ElementaryTypeName","src":"24962:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"24868:112:1"},"returnParameters":{"id":2028,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2027,"mutability":"mutable","name":"actualGasCost","nameLocation":"25006:13:1","nodeType":"VariableDeclaration","scope":2200,"src":"24998:21:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2026,"name":"uint256","nodeType":"ElementaryTypeName","src":"24998:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"24997:23:1"},"scope":2277,"src":"24846:1936:1","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":2235,"nodeType":"Block","src":"27038:393:1","statements":[{"id":2234,"nodeType":"UncheckedBlock","src":"27044:381:1","statements":[{"assignments":[2210],"declarations":[{"constant":false,"id":2210,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"27072:12:1","nodeType":"VariableDeclaration","scope":2234,"src":"27064:20:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2209,"name":"uint256","nodeType":"ElementaryTypeName","src":"27064:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2213,"initialValue":{"expression":{"id":2211,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2204,"src":"27087:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2212,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27095:12:1","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":714,"src":"27087:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27064:43:1"},{"assignments":[2215],"declarations":[{"constant":false,"id":2215,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"27125:20:1","nodeType":"VariableDeclaration","scope":2234,"src":"27117:28:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2214,"name":"uint256","nodeType":"ElementaryTypeName","src":"27117:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2218,"initialValue":{"expression":{"id":2216,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2204,"src":"27148:7:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":2217,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27156:20:1","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":716,"src":"27148:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27117:59:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2221,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2219,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2210,"src":"27190:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2220,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"27206:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27190:36:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2225,"nodeType":"IfStatement","src":"27186:161:1","trueBody":{"id":2224,"nodeType":"Block","src":"27228:119:1","statements":[{"expression":{"id":2222,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2210,"src":"27324:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2208,"id":2223,"nodeType":"Return","src":"27317:19:1"}]}},{"expression":{"arguments":[{"id":2227,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2210,"src":"27367:12:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2228,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2215,"src":"27381:20:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":2229,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"27404:5:1","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":2230,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"27410:7:1","memberName":"basefee","nodeType":"MemberAccess","src":"27404:13:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27381:36:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2226,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2253,"src":"27363:3:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":2232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27363:55:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2208,"id":2233,"nodeType":"Return","src":"27356:62:1"}]}]},"documentation":{"id":2201,"nodeType":"StructuredDocumentation","src":"26788:157:1","text":" the gas price this UserOp agrees to pay.\n relayer/block builder might submit the TX with higher priorityFee, but the user should not"},"id":2236,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpGasPrice","nameLocation":"26959:17:1","nodeType":"FunctionDefinition","parameters":{"id":2205,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2204,"mutability":"mutable","name":"mUserOp","nameLocation":"26997:7:1","nodeType":"VariableDeclaration","scope":2236,"src":"26977:27:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":2203,"nodeType":"UserDefinedTypeName","pathNode":{"id":2202,"name":"MemoryUserOp","nameLocations":["26977:12:1"],"nodeType":"IdentifierPath","referencedDeclaration":717,"src":"26977:12:1"},"referencedDeclaration":717,"src":"26977:12:1","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$717_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"26976:29:1"},"returnParameters":{"id":2208,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2207,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2236,"src":"27029:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2206,"name":"uint256","nodeType":"ElementaryTypeName","src":"27029:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27028:9:1"},"scope":2277,"src":"26950:481:1","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":2252,"nodeType":"Block","src":"27504:37:1","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2245,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2238,"src":"27521:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2246,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2240,"src":"27525:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27521:5:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":2249,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2240,"src":"27533:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2250,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"27521:13:1","trueExpression":{"id":2248,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2238,"src":"27529:1:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2244,"id":2251,"nodeType":"Return","src":"27514:20:1"}]},"id":2253,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"27446:3:1","nodeType":"FunctionDefinition","parameters":{"id":2241,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2238,"mutability":"mutable","name":"a","nameLocation":"27458:1:1","nodeType":"VariableDeclaration","scope":2253,"src":"27450:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2237,"name":"uint256","nodeType":"ElementaryTypeName","src":"27450:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2240,"mutability":"mutable","name":"b","nameLocation":"27469:1:1","nodeType":"VariableDeclaration","scope":2253,"src":"27461:9:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2239,"name":"uint256","nodeType":"ElementaryTypeName","src":"27461:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27449:22:1"},"returnParameters":{"id":2244,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2243,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2253,"src":"27495:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2242,"name":"uint256","nodeType":"ElementaryTypeName","src":"27495:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27494:9:1"},"scope":2277,"src":"27437:104:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2261,"nodeType":"Block","src":"27637:41:1","statements":[{"AST":{"nodeType":"YulBlock","src":"27656:16:1","statements":[{"nodeType":"YulAssignment","src":"27657:14:1","value":{"name":"data","nodeType":"YulIdentifier","src":"27667:4:1"},"variableNames":[{"name":"offset","nodeType":"YulIdentifier","src":"27657:6:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2255,"isOffset":false,"isSlot":false,"src":"27667:4:1","valueSize":1},{"declaration":2258,"isOffset":false,"isSlot":false,"src":"27657:6:1","valueSize":1}],"id":2260,"nodeType":"InlineAssembly","src":"27647:25:1"}]},"id":2262,"implemented":true,"kind":"function","modifiers":[],"name":"getOffsetOfMemoryBytes","nameLocation":"27556:22:1","nodeType":"FunctionDefinition","parameters":{"id":2256,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2255,"mutability":"mutable","name":"data","nameLocation":"27592:4:1","nodeType":"VariableDeclaration","scope":2262,"src":"27579:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2254,"name":"bytes","nodeType":"ElementaryTypeName","src":"27579:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"27578:19:1"},"returnParameters":{"id":2259,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2258,"mutability":"mutable","name":"offset","nameLocation":"27629:6:1","nodeType":"VariableDeclaration","scope":2262,"src":"27621:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2257,"name":"uint256","nodeType":"ElementaryTypeName","src":"27621:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27620:16:1"},"scope":2277,"src":"27547:131:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2270,"nodeType":"Block","src":"27776:41:1","statements":[{"AST":{"nodeType":"YulBlock","src":"27795:16:1","statements":[{"nodeType":"YulAssignment","src":"27796:14:1","value":{"name":"offset","nodeType":"YulIdentifier","src":"27804:6:1"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"27796:4:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2267,"isOffset":false,"isSlot":false,"src":"27796:4:1","valueSize":1},{"declaration":2264,"isOffset":false,"isSlot":false,"src":"27804:6:1","valueSize":1}],"id":2269,"nodeType":"InlineAssembly","src":"27786:25:1"}]},"id":2271,"implemented":true,"kind":"function","modifiers":[],"name":"getMemoryBytesFromOffset","nameLocation":"27693:24:1","nodeType":"FunctionDefinition","parameters":{"id":2265,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2264,"mutability":"mutable","name":"offset","nameLocation":"27726:6:1","nodeType":"VariableDeclaration","scope":2271,"src":"27718:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2263,"name":"uint256","nodeType":"ElementaryTypeName","src":"27718:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27717:16:1"},"returnParameters":{"id":2268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2267,"mutability":"mutable","name":"data","nameLocation":"27770:4:1","nodeType":"VariableDeclaration","scope":2271,"src":"27757:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2266,"name":"bytes","nodeType":"ElementaryTypeName","src":"27757:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"27756:19:1"},"scope":2277,"src":"27684:133:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2275,"nodeType":"Block","src":"28048:46:1","statements":[{"AST":{"nodeType":"YulBlock","src":"28067:21:1","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"28075:1:1","type":"","value":"0"},{"arguments":[],"functionName":{"name":"number","nodeType":"YulIdentifier","src":"28078:6:1"},"nodeType":"YulFunctionCall","src":"28078:8:1"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28068:6:1"},"nodeType":"YulFunctionCall","src":"28068:19:1"},"nodeType":"YulExpressionStatement","src":"28068:19:1"}]},"evmVersion":"london","externalReferences":[],"id":2274,"nodeType":"InlineAssembly","src":"28058:30:1"}]},"id":2276,"implemented":true,"kind":"function","modifiers":[],"name":"numberMarker","nameLocation":"28019:12:1","nodeType":"FunctionDefinition","parameters":{"id":2272,"nodeType":"ParameterList","parameters":[],"src":"28031:2:1"},"returnParameters":{"id":2273,"nodeType":"ParameterList","parameters":[],"src":"28048:0:1"},"scope":2277,"src":"28010:84:1","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":2278,"src":"596:27500:1","usedErrors":[3191,3196,3211,3229,3234,3249]}],"src":"163:27935:1"},"id":1},"contracts/core/Helpers.sol":{"ast":{"absolutePath":"contracts/core/Helpers.sol","exportedSymbols":{"ValidationData":[2286],"_intersectTimeRange":[2430],"_packValidationData":[2467,2505],"_parseValidationData":[2345],"calldataKeccak":[2515]},"id":2516,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2279,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:2"},{"canonicalName":"ValidationData","id":2286,"members":[{"constant":false,"id":2281,"mutability":"mutable","name":"aggregator","nameLocation":"730:10:2","nodeType":"VariableDeclaration","scope":2286,"src":"722:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2280,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2283,"mutability":"mutable","name":"validAfter","nameLocation":"757:10:2","nodeType":"VariableDeclaration","scope":2286,"src":"750:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2282,"name":"uint48","nodeType":"ElementaryTypeName","src":"750:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":2285,"mutability":"mutable","name":"validUntil","nameLocation":"784:10:2","nodeType":"VariableDeclaration","scope":2286,"src":"777:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2284,"name":"uint48","nodeType":"ElementaryTypeName","src":"777:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"ValidationData","nameLocation":"697:14:2","nodeType":"StructDefinition","scope":2516,"src":"690:111:2","visibility":"public"},{"body":{"id":2344,"nodeType":"Block","src":"997:346:2","statements":[{"assignments":[2295],"declarations":[{"constant":false,"id":2295,"mutability":"mutable","name":"aggregator","nameLocation":"1015:10:2","nodeType":"VariableDeclaration","scope":2344,"src":"1007:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2294,"name":"address","nodeType":"ElementaryTypeName","src":"1007:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2303,"initialValue":{"arguments":[{"arguments":[{"id":2300,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2288,"src":"1044:14:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2299,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1036:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2298,"name":"uint160","nodeType":"ElementaryTypeName","src":"1036:7:2","typeDescriptions":{}}},"id":2301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1036:23:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":2297,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1028:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2296,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:2","typeDescriptions":{}}},"id":2302,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1028:32:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1007:53:2"},{"assignments":[2305],"declarations":[{"constant":false,"id":2305,"mutability":"mutable","name":"validUntil","nameLocation":"1077:10:2","nodeType":"VariableDeclaration","scope":2344,"src":"1070:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2304,"name":"uint48","nodeType":"ElementaryTypeName","src":"1070:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2312,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2308,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2288,"src":"1097:14:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313630","id":2309,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1115:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1097:21:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2307,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1090:6:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2306,"name":"uint48","nodeType":"ElementaryTypeName","src":"1090:6:2","typeDescriptions":{}}},"id":2311,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1090:29:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1070:49:2"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2315,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2313,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2305,"src":"1133:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":2314,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1147:1:2","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1133:15:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2325,"nodeType":"IfStatement","src":"1129:75:2","trueBody":{"id":2324,"nodeType":"Block","src":"1150:54:2","statements":[{"expression":{"id":2322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2316,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2305,"src":"1164:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":2319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1182:6:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2318,"name":"uint48","nodeType":"ElementaryTypeName","src":"1182:6:2","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":2317,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1177:4:2","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1177:12:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":2321,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1190:3:2","memberName":"max","nodeType":"MemberAccess","src":"1177:16:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1164:29:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2323,"nodeType":"ExpressionStatement","src":"1164:29:2"}]}},{"assignments":[2327],"declarations":[{"constant":false,"id":2327,"mutability":"mutable","name":"validAfter","nameLocation":"1220:10:2","nodeType":"VariableDeclaration","scope":2344,"src":"1213:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2326,"name":"uint48","nodeType":"ElementaryTypeName","src":"1213:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2337,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2330,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2288,"src":"1240:14:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2333,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3438","id":2331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1259:2:2","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"313630","id":2332,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1264:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1259:8:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2334,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1258:10:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"1240:28:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2329,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1233:6:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2328,"name":"uint48","nodeType":"ElementaryTypeName","src":"1233:6:2","typeDescriptions":{}}},"id":2336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1233:36:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1213:56:2"},{"expression":{"arguments":[{"id":2339,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2295,"src":"1301:10:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2340,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2327,"src":"1313:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":2341,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2305,"src":"1325:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2338,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2286,"src":"1286:14:2","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$2286_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":2342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1286:50:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":2293,"id":2343,"nodeType":"Return","src":"1279:57:2"}]},"id":2345,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_parseValidationData","nameLocation":"913:20:2","nodeType":"FunctionDefinition","parameters":{"id":2289,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2288,"mutability":"mutable","name":"validationData","nameLocation":"939:14:2","nodeType":"VariableDeclaration","scope":2345,"src":"934:19:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2287,"name":"uint","nodeType":"ElementaryTypeName","src":"934:4:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"933:21:2"},"returnParameters":{"id":2293,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2292,"mutability":"mutable","name":"data","nameLocation":"991:4:2","nodeType":"VariableDeclaration","scope":2345,"src":"969:26:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2291,"nodeType":"UserDefinedTypeName","pathNode":{"id":2290,"name":"ValidationData","nameLocations":["969:14:2"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"969:14:2"},"referencedDeclaration":2286,"src":"969:14:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"968:28:2"},"scope":2516,"src":"904:439:2","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2429,"nodeType":"Block","src":"1515:804:2","statements":[{"assignments":[2357],"declarations":[{"constant":false,"id":2357,"mutability":"mutable","name":"accountValidationData","nameLocation":"1547:21:2","nodeType":"VariableDeclaration","scope":2429,"src":"1525:43:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2356,"nodeType":"UserDefinedTypeName","pathNode":{"id":2355,"name":"ValidationData","nameLocations":["1525:14:2"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"1525:14:2"},"referencedDeclaration":2286,"src":"1525:14:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":2361,"initialValue":{"arguments":[{"id":2359,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2347,"src":"1592:14:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2358,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2345,"src":"1571:20:2","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$2286_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":2360,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1571:36:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1525:82:2"},{"assignments":[2364],"declarations":[{"constant":false,"id":2364,"mutability":"mutable","name":"pmValidationData","nameLocation":"1639:16:2","nodeType":"VariableDeclaration","scope":2429,"src":"1617:38:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2363,"nodeType":"UserDefinedTypeName","pathNode":{"id":2362,"name":"ValidationData","nameLocations":["1617:14:2"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"1617:14:2"},"referencedDeclaration":2286,"src":"1617:14:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":2368,"initialValue":{"arguments":[{"id":2366,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2349,"src":"1679:23:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2365,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2345,"src":"1658:20:2","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$2286_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":2367,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1658:45:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1617:86:2"},{"assignments":[2370],"declarations":[{"constant":false,"id":2370,"mutability":"mutable","name":"aggregator","nameLocation":"1721:10:2","nodeType":"VariableDeclaration","scope":2429,"src":"1713:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2369,"name":"address","nodeType":"ElementaryTypeName","src":"1713:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2373,"initialValue":{"expression":{"id":2371,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2357,"src":"1734:21:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2372,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1756:10:2","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2281,"src":"1734:32:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1713:53:2"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2379,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2374,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2370,"src":"1780:10:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":2377,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1802:1:2","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2376,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1794:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2375,"name":"address","nodeType":"ElementaryTypeName","src":"1794:7:2","typeDescriptions":{}}},"id":2378,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1794:10:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1780:24:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2386,"nodeType":"IfStatement","src":"1776:95:2","trueBody":{"id":2385,"nodeType":"Block","src":"1806:65:2","statements":[{"expression":{"id":2383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2380,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2370,"src":"1820:10:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":2381,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2364,"src":"1833:16:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2382,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1850:10:2","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2281,"src":"1833:27:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1820:40:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2384,"nodeType":"ExpressionStatement","src":"1820:40:2"}]}},{"assignments":[2388],"declarations":[{"constant":false,"id":2388,"mutability":"mutable","name":"validAfter","nameLocation":"1887:10:2","nodeType":"VariableDeclaration","scope":2429,"src":"1880:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2387,"name":"uint48","nodeType":"ElementaryTypeName","src":"1880:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2391,"initialValue":{"expression":{"id":2389,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2357,"src":"1900:21:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2390,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1922:10:2","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"1900:32:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1880:52:2"},{"assignments":[2393],"declarations":[{"constant":false,"id":2393,"mutability":"mutable","name":"validUntil","nameLocation":"1949:10:2","nodeType":"VariableDeclaration","scope":2429,"src":"1942:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2392,"name":"uint48","nodeType":"ElementaryTypeName","src":"1942:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2396,"initialValue":{"expression":{"id":2394,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2357,"src":"1962:21:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2395,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1984:10:2","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"1962:32:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1942:52:2"},{"assignments":[2398],"declarations":[{"constant":false,"id":2398,"mutability":"mutable","name":"pmValidAfter","nameLocation":"2011:12:2","nodeType":"VariableDeclaration","scope":2429,"src":"2004:19:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2397,"name":"uint48","nodeType":"ElementaryTypeName","src":"2004:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2401,"initialValue":{"expression":{"id":2399,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2364,"src":"2026:16:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2400,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2043:10:2","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"2026:27:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2004:49:2"},{"assignments":[2403],"declarations":[{"constant":false,"id":2403,"mutability":"mutable","name":"pmValidUntil","nameLocation":"2070:12:2","nodeType":"VariableDeclaration","scope":2429,"src":"2063:19:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2402,"name":"uint48","nodeType":"ElementaryTypeName","src":"2063:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2406,"initialValue":{"expression":{"id":2404,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2364,"src":"2085:16:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2405,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2102:10:2","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"2085:27:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2063:49:2"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2407,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2388,"src":"2127:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2408,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2398,"src":"2140:12:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2127:25:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2414,"nodeType":"IfStatement","src":"2123:56:2","trueBody":{"expression":{"id":2412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2410,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2388,"src":"2154:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2411,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2398,"src":"2167:12:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2154:25:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2413,"nodeType":"ExpressionStatement","src":"2154:25:2"}},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2415,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2393,"src":"2193:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":2416,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2403,"src":"2206:12:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2193:25:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2422,"nodeType":"IfStatement","src":"2189:56:2","trueBody":{"expression":{"id":2420,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2418,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2393,"src":"2220:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2419,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2403,"src":"2233:12:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2220:25:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2421,"nodeType":"ExpressionStatement","src":"2220:25:2"}},{"expression":{"arguments":[{"id":2424,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2370,"src":"2277:10:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2425,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2388,"src":"2289:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":2426,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2393,"src":"2301:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2423,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2286,"src":"2262:14:2","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$2286_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":2427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2262:50:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":2354,"id":2428,"nodeType":"Return","src":"2255:57:2"}]},"id":2430,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_intersectTimeRange","nameLocation":"1401:19:2","nodeType":"FunctionDefinition","parameters":{"id":2350,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2347,"mutability":"mutable","name":"validationData","nameLocation":"1429:14:2","nodeType":"VariableDeclaration","scope":2430,"src":"1421:22:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2346,"name":"uint256","nodeType":"ElementaryTypeName","src":"1421:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2349,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"1453:23:2","nodeType":"VariableDeclaration","scope":2430,"src":"1445:31:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2348,"name":"uint256","nodeType":"ElementaryTypeName","src":"1445:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1420:57:2"},"returnParameters":{"id":2354,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2353,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2430,"src":"1492:21:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2352,"nodeType":"UserDefinedTypeName","pathNode":{"id":2351,"name":"ValidationData","nameLocations":["1492:14:2"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"1492:14:2"},"referencedDeclaration":2286,"src":"1492:14:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"1491:23:2"},"scope":2516,"src":"1392:927:2","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2466,"nodeType":"Block","src":"2511:127:2","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2452,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2441,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2434,"src":"2536:4:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2442,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2541:10:2","memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":2281,"src":"2536:15:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2440,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2528:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2439,"name":"uint160","nodeType":"ElementaryTypeName","src":"2528:7:2","typeDescriptions":{}}},"id":2443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2528:24:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2446,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2434,"src":"2564:4:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2447,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2569:10:2","memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"2564:15:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2445,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2556:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2444,"name":"uint256","nodeType":"ElementaryTypeName","src":"2556:7:2","typeDescriptions":{}}},"id":2448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2556:24:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":2449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2584:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"2556:31:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2451,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2555:33:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:60:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2455,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2434,"src":"2600:4:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData memory"}},"id":2456,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2605:10:2","memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":2283,"src":"2600:15:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2454,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2592:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2453,"name":"uint256","nodeType":"ElementaryTypeName","src":"2592:7:2","typeDescriptions":{}}},"id":2457,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2592:24:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2460,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":2458,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2621:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":2459,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2627:2:2","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"2621:8:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2461,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2620:10:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"2592:38:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2463,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2591:40:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:103:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2438,"id":2465,"nodeType":"Return","src":"2521:110:2"}]},"documentation":{"id":2431,"nodeType":"StructuredDocumentation","src":"2321:105:2","text":" helper to pack the return value for validateUserOp\n @param data - the ValidationData to pack"},"id":2467,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2440:19:2","nodeType":"FunctionDefinition","parameters":{"id":2435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2434,"mutability":"mutable","name":"data","nameLocation":"2482:4:2","nodeType":"VariableDeclaration","scope":2467,"src":"2460:26:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":2433,"nodeType":"UserDefinedTypeName","pathNode":{"id":2432,"name":"ValidationData","nameLocations":["2460:14:2"],"nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"2460:14:2"},"referencedDeclaration":2286,"src":"2460:14:2","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$2286_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"2459:28:2"},"returnParameters":{"id":2438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2437,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2467,"src":"2502:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2436,"name":"uint256","nodeType":"ElementaryTypeName","src":"2502:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2501:9:2"},"scope":2516,"src":"2431:207:2","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2504,"nodeType":"Block","src":"3062:112:2","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2491,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"condition":{"id":2479,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2470,"src":"3080:9:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":2481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3096:1:2","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":2482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3080:17:2","trueExpression":{"hexValue":"31","id":2480,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3092:1:2","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":2483,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3079:19:2","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2486,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2472,"src":"3110:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2485,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3102:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2484,"name":"uint256","nodeType":"ElementaryTypeName","src":"3102:7:2","typeDescriptions":{}}},"id":2487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3102:19:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":2488,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3125:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"3102:26:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2490,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3101:28:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:50:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2494,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2474,"src":"3141:10:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2493,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3133:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2492,"name":"uint256","nodeType":"ElementaryTypeName","src":"3133:7:2","typeDescriptions":{}}},"id":2495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3133:19:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":2498,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":2496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3157:3:2","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":2497,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3163:2:2","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"3157:8:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":2499,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3156:10:2","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"3133:33:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2501,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3132:35:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:88:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2478,"id":2503,"nodeType":"Return","src":"3072:95:2"}]},"documentation":{"id":2468,"nodeType":"StructuredDocumentation","src":"2640:311:2","text":" helper to pack the return value for validateUserOp, when not using an aggregator\n @param sigFailed - true for signature failure, false for success\n @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n @param validAfter first timestamp this UserOperation is valid"},"id":2505,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2965:19:2","nodeType":"FunctionDefinition","parameters":{"id":2475,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2470,"mutability":"mutable","name":"sigFailed","nameLocation":"2990:9:2","nodeType":"VariableDeclaration","scope":2505,"src":"2985:14:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2469,"name":"bool","nodeType":"ElementaryTypeName","src":"2985:4:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2472,"mutability":"mutable","name":"validUntil","nameLocation":"3008:10:2","nodeType":"VariableDeclaration","scope":2505,"src":"3001:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2471,"name":"uint48","nodeType":"ElementaryTypeName","src":"3001:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":2474,"mutability":"mutable","name":"validAfter","nameLocation":"3027:10:2","nodeType":"VariableDeclaration","scope":2505,"src":"3020:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2473,"name":"uint48","nodeType":"ElementaryTypeName","src":"3020:6:2","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2984:54:2"},"returnParameters":{"id":2478,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2477,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2505,"src":"3053:7:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2476,"name":"uint256","nodeType":"ElementaryTypeName","src":"3053:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3052:9:2"},"scope":2516,"src":"2956:218:2","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2514,"nodeType":"Block","src":"3429:193:2","statements":[{"AST":{"nodeType":"YulBlock","src":"3448:168:2","statements":[{"nodeType":"YulVariableDeclaration","src":"3462:22:2","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3479:4:2","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3473:5:2"},"nodeType":"YulFunctionCall","src":"3473:11:2"},"variables":[{"name":"mem","nodeType":"YulTypedName","src":"3466:3:2","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3497:22:2","value":{"name":"data.length","nodeType":"YulIdentifier","src":"3508:11:2"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"3501:3:2","type":""}]},{"expression":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3545:3:2"},{"name":"data.offset","nodeType":"YulIdentifier","src":"3550:11:2"},{"name":"len","nodeType":"YulIdentifier","src":"3563:3:2"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"3532:12:2"},"nodeType":"YulFunctionCall","src":"3532:35:2"},"nodeType":"YulExpressionStatement","src":"3532:35:2"},{"nodeType":"YulAssignment","src":"3580:26:2","value":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3597:3:2"},{"name":"len","nodeType":"YulIdentifier","src":"3602:3:2"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"3587:9:2"},"nodeType":"YulFunctionCall","src":"3587:19:2"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"3580:3:2"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2508,"isOffset":false,"isSlot":false,"src":"3508:11:2","suffix":"length","valueSize":1},{"declaration":2508,"isOffset":true,"isSlot":false,"src":"3550:11:2","suffix":"offset","valueSize":1},{"declaration":2511,"isOffset":false,"isSlot":false,"src":"3580:3:2","valueSize":1}],"id":2513,"nodeType":"InlineAssembly","src":"3439:177:2"}]},"documentation":{"id":2506,"nodeType":"StructuredDocumentation","src":"3176:176:2","text":" keccak function over calldata.\n @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it."},"id":2515,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"calldataKeccak","nameLocation":"3366:14:2","nodeType":"FunctionDefinition","parameters":{"id":2509,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2508,"mutability":"mutable","name":"data","nameLocation":"3396:4:2","nodeType":"VariableDeclaration","scope":2515,"src":"3381:19:2","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2507,"name":"bytes","nodeType":"ElementaryTypeName","src":"3381:5:2","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:21:2"},"returnParameters":{"id":2512,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2511,"mutability":"mutable","name":"ret","nameLocation":"3424:3:2","nodeType":"VariableDeclaration","scope":2515,"src":"3416:11:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2510,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3416:7:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3415:13:2"},"scope":2516,"src":"3357:265:2","stateMutability":"pure","virtual":false,"visibility":"internal"}],"src":"36:3587:2"},"id":2},"contracts/core/NonceManager.sol":{"ast":{"absolutePath":"contracts/core/NonceManager.sol","exportedSymbols":{"IAggregator":[3128],"IEntryPoint":[3332],"INonceManager":[3351],"IStakeManager":[3491],"NonceManager":[2605],"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":2606,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2517,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:3"},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":2518,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2606,"sourceUnit":3333,"src":"62:39:3","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":2520,"name":"INonceManager","nameLocations":["170:13:3"],"nodeType":"IdentifierPath","referencedDeclaration":3351,"src":"170:13:3"},"id":2521,"nodeType":"InheritanceSpecifier","src":"170:13:3"}],"canonicalName":"NonceManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":2519,"nodeType":"StructuredDocumentation","src":"103:41:3","text":" nonce management functionality"},"fullyImplemented":true,"id":2605,"linearizedBaseContracts":[2605,3351],"name":"NonceManager","nameLocation":"154:12:3","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":2522,"nodeType":"StructuredDocumentation","src":"191:72:3","text":" The next valid sequence number for a given nonce key."},"functionSelector":"1b2e01b8","id":2528,"mutability":"mutable","name":"nonceSequenceNumber","nameLocation":"323:19:3","nodeType":"VariableDeclaration","scope":2605,"src":"268:74:3","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"},"typeName":{"id":2527,"keyType":{"id":2523,"name":"address","nodeType":"ElementaryTypeName","src":"276:7:3","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"268:47:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"},"valueType":{"id":2526,"keyType":{"id":2524,"name":"uint192","nodeType":"ElementaryTypeName","src":"295:7:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"nodeType":"Mapping","src":"287:27:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"},"valueType":{"id":2525,"name":"uint256","nodeType":"ElementaryTypeName","src":"306:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"baseFunctions":[3344],"body":{"id":2552,"nodeType":"Block","src":"445:79:3","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":2538,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2528,"src":"462:19:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":2540,"indexExpression":{"id":2539,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2530,"src":"482:6:3","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"462:27:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":2542,"indexExpression":{"id":2541,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2532,"src":"490:3:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"462:32:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2545,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2532,"src":"506:3:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint192","typeString":"uint192"}],"id":2544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"498:7:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2543,"name":"uint256","nodeType":"ElementaryTypeName","src":"498:7:3","typeDescriptions":{}}},"id":2546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"498:12:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"3634","id":2547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"514:2:3","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"498:18:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2549,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"497:20:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"462:55:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2537,"id":2551,"nodeType":"Return","src":"455:62:3"}]},"functionSelector":"35567e1a","id":2553,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"358:8:3","nodeType":"FunctionDefinition","overrides":{"id":2534,"nodeType":"OverrideSpecifier","overrides":[],"src":"412:8:3"},"parameters":{"id":2533,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2530,"mutability":"mutable","name":"sender","nameLocation":"375:6:3","nodeType":"VariableDeclaration","scope":2553,"src":"367:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2529,"name":"address","nodeType":"ElementaryTypeName","src":"367:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2532,"mutability":"mutable","name":"key","nameLocation":"391:3:3","nodeType":"VariableDeclaration","scope":2553,"src":"383:11:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":2531,"name":"uint192","nodeType":"ElementaryTypeName","src":"383:7:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"366:29:3"},"returnParameters":{"id":2537,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2536,"mutability":"mutable","name":"nonce","nameLocation":"438:5:3","nodeType":"VariableDeclaration","scope":2553,"src":"430:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2535,"name":"uint256","nodeType":"ElementaryTypeName","src":"430:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"429:15:3"},"scope":2605,"src":"349:175:3","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[3350],"body":{"id":2567,"nodeType":"Block","src":"838:55:3","statements":[{"expression":{"id":2565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"848:38:3","subExpression":{"baseExpression":{"baseExpression":{"id":2559,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2528,"src":"848:19:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":2563,"indexExpression":{"expression":{"id":2560,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"868:3:3","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2561,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"872:6:3","memberName":"sender","nodeType":"MemberAccess","src":"868:10:3","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"848:31:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":2564,"indexExpression":{"id":2562,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2555,"src":"880:3:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"848:36:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2566,"nodeType":"ExpressionStatement","src":"848:38:3"}]},"functionSelector":"0bd28e3b","id":2568,"implemented":true,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"794:14:3","nodeType":"FunctionDefinition","overrides":{"id":2557,"nodeType":"OverrideSpecifier","overrides":[],"src":"829:8:3"},"parameters":{"id":2556,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2555,"mutability":"mutable","name":"key","nameLocation":"817:3:3","nodeType":"VariableDeclaration","scope":2568,"src":"809:11:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":2554,"name":"uint192","nodeType":"ElementaryTypeName","src":"809:7:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"808:13:3"},"returnParameters":{"id":2558,"nodeType":"ParameterList","parameters":[],"src":"838:0:3"},"scope":2605,"src":"785:108:3","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":2603,"nodeType":"Block","src":"1096:146:3","statements":[{"assignments":[2579],"declarations":[{"constant":false,"id":2579,"mutability":"mutable","name":"key","nameLocation":"1115:3:3","nodeType":"VariableDeclaration","scope":2603,"src":"1107:11:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":2578,"name":"uint192","nodeType":"ElementaryTypeName","src":"1107:7:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"id":2586,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2584,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2582,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2573,"src":"1129:5:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":2583,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1138:2:3","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"1129:11:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2581,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1121:7:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint192_$","typeString":"type(uint192)"},"typeName":{"id":2580,"name":"uint192","nodeType":"ElementaryTypeName","src":"1121:7:3","typeDescriptions":{}}},"id":2585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1121:20:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"nodeType":"VariableDeclarationStatement","src":"1107:34:3"},{"assignments":[2588],"declarations":[{"constant":false,"id":2588,"mutability":"mutable","name":"seq","nameLocation":"1158:3:3","nodeType":"VariableDeclaration","scope":2603,"src":"1151:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":2587,"name":"uint64","nodeType":"ElementaryTypeName","src":"1151:6:3","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"id":2593,"initialValue":{"arguments":[{"id":2591,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2573,"src":"1171:5:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2590,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1164:6:3","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":2589,"name":"uint64","nodeType":"ElementaryTypeName","src":"1164:6:3","typeDescriptions":{}}},"id":2592,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1164:13:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"VariableDeclarationStatement","src":"1151:26:3"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"1194:34:3","subExpression":{"baseExpression":{"baseExpression":{"id":2594,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2528,"src":"1194:19:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":2596,"indexExpression":{"id":2595,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2571,"src":"1214:6:3","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1194:27:3","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":2598,"indexExpression":{"id":2597,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2579,"src":"1222:3:3","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1194:32:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2600,"name":"seq","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2588,"src":"1232:3:3","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"1194:41:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":2577,"id":2602,"nodeType":"Return","src":"1187:48:3"}]},"documentation":{"id":2569,"nodeType":"StructuredDocumentation","src":"899:104:3","text":" validate nonce uniqueness for this account.\n called just after validateUserOp()"},"id":2604,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAndUpdateNonce","nameLocation":"1017:23:3","nodeType":"FunctionDefinition","parameters":{"id":2574,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2571,"mutability":"mutable","name":"sender","nameLocation":"1049:6:3","nodeType":"VariableDeclaration","scope":2604,"src":"1041:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2570,"name":"address","nodeType":"ElementaryTypeName","src":"1041:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2573,"mutability":"mutable","name":"nonce","nameLocation":"1065:5:3","nodeType":"VariableDeclaration","scope":2604,"src":"1057:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2572,"name":"uint256","nodeType":"ElementaryTypeName","src":"1057:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1040:31:3"},"returnParameters":{"id":2577,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2576,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2604,"src":"1090:4:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2575,"name":"bool","nodeType":"ElementaryTypeName","src":"1090:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1089:6:3"},"scope":2605,"src":"1008:234:3","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":2606,"src":"145:1100:3","usedErrors":[]}],"src":"36:1210:3"},"id":3},"contracts/core/SenderCreator.sol":{"ast":{"absolutePath":"contracts/core/SenderCreator.sol","exportedSymbols":{"SenderCreator":[2652]},"id":2653,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":2607,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:4"},{"abstract":false,"baseContracts":[],"canonicalName":"SenderCreator","contractDependencies":[],"contractKind":"contract","documentation":{"id":2608,"nodeType":"StructuredDocumentation","src":"62:142:4","text":" helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n which is explicitly not the entryPoint itself."},"fullyImplemented":true,"id":2652,"linearizedBaseContracts":[2652],"name":"SenderCreator","nameLocation":"214:13:4","nodeType":"ContractDefinition","nodes":[{"body":{"id":2650,"nodeType":"Block","src":"626:419:4","statements":[{"assignments":[2617],"declarations":[{"constant":false,"id":2617,"mutability":"mutable","name":"factory","nameLocation":"644:7:4","nodeType":"VariableDeclaration","scope":2650,"src":"636:15:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2616,"name":"address","nodeType":"ElementaryTypeName","src":"636:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2628,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":2622,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2611,"src":"670:8:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":2624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"683:2:4","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":2625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"670:16:4","startExpression":{"hexValue":"30","id":2623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"679:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":2621,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"662:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":2620,"name":"bytes20","nodeType":"ElementaryTypeName","src":"662:7:4","typeDescriptions":{}}},"id":2626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"662:25:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":2619,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"654:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2618,"name":"address","nodeType":"ElementaryTypeName","src":"654:7:4","typeDescriptions":{}}},"id":2627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"654:34:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"636:52:4"},{"assignments":[2630],"declarations":[{"constant":false,"id":2630,"mutability":"mutable","name":"initCallData","nameLocation":"711:12:4","nodeType":"VariableDeclaration","scope":2650,"src":"698:25:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2629,"name":"bytes","nodeType":"ElementaryTypeName","src":"698:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2634,"initialValue":{"baseExpression":{"id":2631,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2611,"src":"726:8:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":2633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"726:14:4","startExpression":{"hexValue":"3230","id":2632,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"735:2:4","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"698:42:4"},{"assignments":[2636],"declarations":[{"constant":false,"id":2636,"mutability":"mutable","name":"success","nameLocation":"755:7:4","nodeType":"VariableDeclaration","scope":2650,"src":"750:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2635,"name":"bool","nodeType":"ElementaryTypeName","src":"750:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2637,"nodeType":"VariableDeclarationStatement","src":"750:12:4"},{"AST":{"nodeType":"YulBlock","src":"830:142:4","statements":[{"nodeType":"YulAssignment","src":"844:87:4","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"860:3:4"},"nodeType":"YulFunctionCall","src":"860:5:4"},{"name":"factory","nodeType":"YulIdentifier","src":"867:7:4"},{"kind":"number","nodeType":"YulLiteral","src":"876:1:4","type":"","value":"0"},{"arguments":[{"name":"initCallData","nodeType":"YulIdentifier","src":"883:12:4"},{"kind":"number","nodeType":"YulLiteral","src":"897:4:4","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"879:3:4"},"nodeType":"YulFunctionCall","src":"879:23:4"},{"arguments":[{"name":"initCallData","nodeType":"YulIdentifier","src":"910:12:4"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"904:5:4"},"nodeType":"YulFunctionCall","src":"904:19:4"},{"kind":"number","nodeType":"YulLiteral","src":"925:1:4","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"928:2:4","type":"","value":"32"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"855:4:4"},"nodeType":"YulFunctionCall","src":"855:76:4"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"844:7:4"}]},{"nodeType":"YulAssignment","src":"944:18:4","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"960:1:4","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"954:5:4"},"nodeType":"YulFunctionCall","src":"954:8:4"},"variableNames":[{"name":"sender","nodeType":"YulIdentifier","src":"944:6:4"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2617,"isOffset":false,"isSlot":false,"src":"867:7:4","valueSize":1},{"declaration":2630,"isOffset":false,"isSlot":false,"src":"883:12:4","valueSize":1},{"declaration":2630,"isOffset":false,"isSlot":false,"src":"910:12:4","valueSize":1},{"declaration":2614,"isOffset":false,"isSlot":false,"src":"944:6:4","valueSize":1},{"declaration":2636,"isOffset":false,"isSlot":false,"src":"844:7:4","valueSize":1}],"id":2638,"nodeType":"InlineAssembly","src":"821:151:4"},{"condition":{"id":2640,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"985:8:4","subExpression":{"id":2639,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2636,"src":"986:7:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2649,"nodeType":"IfStatement","src":"981:58:4","trueBody":{"id":2648,"nodeType":"Block","src":"995:44:4","statements":[{"expression":{"id":2646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2641,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2614,"src":"1009:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":2644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1026:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2643,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1018:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2642,"name":"address","nodeType":"ElementaryTypeName","src":"1018:7:4","typeDescriptions":{}}},"id":2645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1018:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1009:19:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2647,"nodeType":"ExpressionStatement","src":"1009:19:4"}]}}]},"documentation":{"id":2609,"nodeType":"StructuredDocumentation","src":"235:305:4","text":" call the \"initCode\" factory to create and return the sender account address\n @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n @return sender the returned address of the created account, or zero address on failure."},"functionSelector":"570e1a36","id":2651,"implemented":true,"kind":"function","modifiers":[],"name":"createSender","nameLocation":"554:12:4","nodeType":"FunctionDefinition","parameters":{"id":2612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2611,"mutability":"mutable","name":"initCode","nameLocation":"582:8:4","nodeType":"VariableDeclaration","scope":2651,"src":"567:23:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2610,"name":"bytes","nodeType":"ElementaryTypeName","src":"567:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"566:25:4"},"returnParameters":{"id":2615,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2614,"mutability":"mutable","name":"sender","nameLocation":"618:6:4","nodeType":"VariableDeclaration","scope":2651,"src":"610:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2613,"name":"address","nodeType":"ElementaryTypeName","src":"610:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"609:16:4"},"scope":2652,"src":"545:500:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2653,"src":"205:842:4","usedErrors":[]}],"src":"36:1012:4"},"id":4},"contracts/core/StakeManager.sol":{"ast":{"absolutePath":"contracts/core/StakeManager.sol","exportedSymbols":{"IStakeManager":[3491],"StakeManager":[3077]},"id":3078,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2654,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:5"},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"../interfaces/IStakeManager.sol","id":2655,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3078,"sourceUnit":3492,"src":"67:41:5","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":2657,"name":"IStakeManager","nameLocations":["433:13:5"],"nodeType":"IdentifierPath","referencedDeclaration":3491,"src":"433:13:5"},"id":2658,"nodeType":"InheritanceSpecifier","src":"433:13:5"}],"canonicalName":"StakeManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":2656,"nodeType":"StructuredDocumentation","src":"193:205:5","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by a paymaster."},"fullyImplemented":true,"id":3077,"linearizedBaseContracts":[3077,3491],"name":"StakeManager","nameLocation":"417:12:5","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":2659,"nodeType":"StructuredDocumentation","src":"454:47:5","text":"maps paymaster to their deposits and stakes"},"functionSelector":"fc7e286d","id":2664,"mutability":"mutable","name":"deposits","nameLocation":"545:8:5","nodeType":"VariableDeclaration","scope":3077,"src":"506:47:5","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo)"},"typeName":{"id":2663,"keyType":{"id":2660,"name":"address","nodeType":"ElementaryTypeName","src":"514:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"506:31:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo)"},"valueType":{"id":2662,"nodeType":"UserDefinedTypeName","pathNode":{"id":2661,"name":"DepositInfo","nameLocations":["525:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"525:11:5"},"referencedDeclaration":3438,"src":"525:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}}},"visibility":"public"},{"baseFunctions":[3452],"body":{"id":2677,"nodeType":"Block","src":"681:41:5","statements":[{"expression":{"baseExpression":{"id":2673,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"698:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2675,"indexExpression":{"id":2674,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2667,"src":"707:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"698:17:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"functionReturnParameters":2672,"id":2676,"nodeType":"Return","src":"691:24:5"}]},"documentation":{"id":2665,"nodeType":"StructuredDocumentation","src":"560:29:5","text":"@inheritdoc IStakeManager"},"functionSelector":"5287ce12","id":2678,"implemented":true,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"603:14:5","nodeType":"FunctionDefinition","parameters":{"id":2668,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2667,"mutability":"mutable","name":"account","nameLocation":"626:7:5","nodeType":"VariableDeclaration","scope":2678,"src":"618:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2666,"name":"address","nodeType":"ElementaryTypeName","src":"618:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"617:17:5"},"returnParameters":{"id":2672,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2671,"mutability":"mutable","name":"info","nameLocation":"675:4:5","nodeType":"VariableDeclaration","scope":2678,"src":"656:23:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2670,"nodeType":"UserDefinedTypeName","pathNode":{"id":2669,"name":"DepositInfo","nameLocations":["656:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"656:11:5"},"referencedDeclaration":3438,"src":"656:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"655:25:5"},"scope":3077,"src":"594:128:5","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":2707,"nodeType":"Block","src":"864:165:5","statements":[{"assignments":[2688],"declarations":[{"constant":false,"id":2688,"mutability":"mutable","name":"depositInfo","nameLocation":"894:11:5","nodeType":"VariableDeclaration","scope":2707,"src":"874:31:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2687,"nodeType":"UserDefinedTypeName","pathNode":{"id":2686,"name":"DepositInfo","nameLocations":["874:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"874:11:5"},"referencedDeclaration":3438,"src":"874:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2692,"initialValue":{"baseExpression":{"id":2689,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"908:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2691,"indexExpression":{"id":2690,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2680,"src":"917:4:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"908:14:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"874:48:5"},{"expression":{"id":2698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2693,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2684,"src":"932:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":2695,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"937:5:5","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":3440,"src":"932:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":2696,"name":"depositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2688,"src":"945:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2697,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"957:5:5","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":3433,"src":"945:17:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"932:30:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2699,"nodeType":"ExpressionStatement","src":"932:30:5"},{"expression":{"id":2705,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2700,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2684,"src":"972:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":2702,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"977:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3442,"src":"972:20:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":2703,"name":"depositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2688,"src":"995:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2704,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1007:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3435,"src":"995:27:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"972:50:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2706,"nodeType":"ExpressionStatement","src":"972:50:5"}]},"id":2708,"implemented":true,"kind":"function","modifiers":[],"name":"_getStakeInfo","nameLocation":"790:13:5","nodeType":"FunctionDefinition","parameters":{"id":2681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2680,"mutability":"mutable","name":"addr","nameLocation":"812:4:5","nodeType":"VariableDeclaration","scope":2708,"src":"804:12:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2679,"name":"address","nodeType":"ElementaryTypeName","src":"804:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"803:14:5"},"returnParameters":{"id":2685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2684,"mutability":"mutable","name":"info","nameLocation":"858:4:5","nodeType":"VariableDeclaration","scope":2708,"src":"841:21:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":2683,"nodeType":"UserDefinedTypeName","pathNode":{"id":2682,"name":"StakeInfo","nameLocations":["841:9:5"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"841:9:5"},"referencedDeclaration":3443,"src":"841:9:5","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"840:23:5"},"scope":3077,"src":"781:248:5","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[3460],"body":{"id":2721,"nodeType":"Block","src":"1161:49:5","statements":[{"expression":{"expression":{"baseExpression":{"id":2716,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"1178:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2718,"indexExpression":{"id":2717,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2711,"src":"1187:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1178:17:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"id":2719,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1196:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"1178:25:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"functionReturnParameters":2715,"id":2720,"nodeType":"Return","src":"1171:32:5"}]},"documentation":{"id":2709,"nodeType":"StructuredDocumentation","src":"1035:55:5","text":"return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":2722,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1104:9:5","nodeType":"FunctionDefinition","parameters":{"id":2712,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2711,"mutability":"mutable","name":"account","nameLocation":"1122:7:5","nodeType":"VariableDeclaration","scope":2722,"src":"1114:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2710,"name":"address","nodeType":"ElementaryTypeName","src":"1114:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1113:17:5"},"returnParameters":{"id":2715,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2714,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2722,"src":"1152:7:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2713,"name":"uint256","nodeType":"ElementaryTypeName","src":"1152:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1151:9:5"},"scope":3077,"src":"1095:115:5","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":2730,"nodeType":"Block","src":"1243:38:5","statements":[{"expression":{"arguments":[{"expression":{"id":2726,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1263:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1267:6:5","memberName":"sender","nodeType":"MemberAccess","src":"1263:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2725,"name":"depositTo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2799,"src":"1253:9:5","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":2728,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1253:21:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2729,"nodeType":"ExpressionStatement","src":"1253:21:5"}]},"id":2731,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2723,"nodeType":"ParameterList","parameters":[],"src":"1223:2:5"},"returnParameters":{"id":2724,"nodeType":"ParameterList","parameters":[],"src":"1243:0:5"},"scope":3077,"src":"1216:65:5","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":2772,"nodeType":"Block","src":"1356:224:5","statements":[{"assignments":[2740],"declarations":[{"constant":false,"id":2740,"mutability":"mutable","name":"info","nameLocation":"1386:4:5","nodeType":"VariableDeclaration","scope":2772,"src":"1366:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2739,"nodeType":"UserDefinedTypeName","pathNode":{"id":2738,"name":"DepositInfo","nameLocations":["1366:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"1366:11:5"},"referencedDeclaration":3438,"src":"1366:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2744,"initialValue":{"baseExpression":{"id":2741,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"1393:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2743,"indexExpression":{"id":2742,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2733,"src":"1402:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1393:17:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"1366:44:5"},{"assignments":[2746],"declarations":[{"constant":false,"id":2746,"mutability":"mutable","name":"newAmount","nameLocation":"1428:9:5","nodeType":"VariableDeclaration","scope":2772,"src":"1420:17:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2745,"name":"uint256","nodeType":"ElementaryTypeName","src":"1420:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2751,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2747,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2740,"src":"1440:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2748,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1445:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"1440:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":2749,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2735,"src":"1455:6:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1440:21:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1420:41:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2753,"name":"newAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2746,"src":"1479:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":2756,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1497:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":2755,"name":"uint112","nodeType":"ElementaryTypeName","src":"1497:7:5","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"}],"id":2754,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1492:4:5","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2757,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1492:13:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint112","typeString":"type(uint112)"}},"id":2758,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1506:3:5","memberName":"max","nodeType":"MemberAccess","src":"1492:17:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"1479:30:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6465706f736974206f766572666c6f77","id":2760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1511:18:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa","typeString":"literal_string \"deposit overflow\""},"value":"deposit overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa","typeString":"literal_string \"deposit overflow\""}],"id":2752,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1471:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1471:59:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2762,"nodeType":"ExpressionStatement","src":"1471:59:5"},{"expression":{"id":2770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2763,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2740,"src":"1540:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2765,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1545:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"1540:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2768,"name":"newAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2746,"src":"1563:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2767,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1555:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":2766,"name":"uint112","nodeType":"ElementaryTypeName","src":"1555:7:5","typeDescriptions":{}}},"id":2769,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1555:18:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"1540:33:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":2771,"nodeType":"ExpressionStatement","src":"1540:33:5"}]},"id":2773,"implemented":true,"kind":"function","modifiers":[],"name":"_incrementDeposit","nameLocation":"1296:17:5","nodeType":"FunctionDefinition","parameters":{"id":2736,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2733,"mutability":"mutable","name":"account","nameLocation":"1322:7:5","nodeType":"VariableDeclaration","scope":2773,"src":"1314:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2732,"name":"address","nodeType":"ElementaryTypeName","src":"1314:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2735,"mutability":"mutable","name":"amount","nameLocation":"1339:6:5","nodeType":"VariableDeclaration","scope":2773,"src":"1331:14:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2734,"name":"uint256","nodeType":"ElementaryTypeName","src":"1331:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1313:33:5"},"returnParameters":{"id":2737,"nodeType":"ParameterList","parameters":[],"src":"1356:0:5"},"scope":3077,"src":"1287:293:5","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[3466],"body":{"id":2798,"nodeType":"Block","src":"1700:155:5","statements":[{"expression":{"arguments":[{"id":2780,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2776,"src":"1728:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2781,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1737:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1741:5:5","memberName":"value","nodeType":"MemberAccess","src":"1737:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2779,"name":"_incrementDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2773,"src":"1710:17:5","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":2783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1710:37:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2784,"nodeType":"ExpressionStatement","src":"1710:37:5"},{"assignments":[2787],"declarations":[{"constant":false,"id":2787,"mutability":"mutable","name":"info","nameLocation":"1777:4:5","nodeType":"VariableDeclaration","scope":2798,"src":"1757:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2786,"nodeType":"UserDefinedTypeName","pathNode":{"id":2785,"name":"DepositInfo","nameLocations":["1757:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"1757:11:5"},"referencedDeclaration":3438,"src":"1757:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2791,"initialValue":{"baseExpression":{"id":2788,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"1784:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2790,"indexExpression":{"id":2789,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2776,"src":"1793:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1784:17:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"1757:44:5"},{"eventCall":{"arguments":[{"id":2793,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2776,"src":"1826:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2794,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2787,"src":"1835:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2795,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1840:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"1835:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint112","typeString":"uint112"}],"id":2792,"name":"Deposited","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3395,"src":"1816:9:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":2796,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1816:32:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2797,"nodeType":"EmitStatement","src":"1811:37:5"}]},"documentation":{"id":2774,"nodeType":"StructuredDocumentation","src":"1586:58:5","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":2799,"implemented":true,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"1658:9:5","nodeType":"FunctionDefinition","parameters":{"id":2777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2776,"mutability":"mutable","name":"account","nameLocation":"1676:7:5","nodeType":"VariableDeclaration","scope":2799,"src":"1668:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2775,"name":"address","nodeType":"ElementaryTypeName","src":"1668:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1667:17:5"},"returnParameters":{"id":2778,"nodeType":"ParameterList","parameters":[],"src":"1700:0:5"},"scope":3077,"src":"1649:206:5","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[3472],"body":{"id":2878,"nodeType":"Block","src":"2123:615:5","statements":[{"assignments":[2807],"declarations":[{"constant":false,"id":2807,"mutability":"mutable","name":"info","nameLocation":"2153:4:5","nodeType":"VariableDeclaration","scope":2878,"src":"2133:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2806,"nodeType":"UserDefinedTypeName","pathNode":{"id":2805,"name":"DepositInfo","nameLocations":["2133:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"2133:11:5"},"referencedDeclaration":3438,"src":"2133:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2812,"initialValue":{"baseExpression":{"id":2808,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"2160:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2811,"indexExpression":{"expression":{"id":2809,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2169:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2173:6:5","memberName":"sender","nodeType":"MemberAccess","src":"2169:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2160:20:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"2133:47:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":2816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2814,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2802,"src":"2198:15:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2815,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2216:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2198:19:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d757374207370656369667920756e7374616b652064656c6179","id":2817,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2219:28:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b","typeString":"literal_string \"must specify unstake delay\""},"value":"must specify unstake delay"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b","typeString":"literal_string \"must specify unstake delay\""}],"id":2813,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2190:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2818,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2190:58:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2819,"nodeType":"ExpressionStatement","src":"2190:58:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":2824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2821,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2802,"src":"2266:15:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"id":2822,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2807,"src":"2285:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2823,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2290:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3435,"src":"2285:20:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"2266:39:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"63616e6e6f7420646563726561736520756e7374616b652074696d65","id":2825,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2307:30:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7","typeString":"literal_string \"cannot decrease unstake time\""},"value":"cannot decrease unstake time"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7","typeString":"literal_string \"cannot decrease unstake time\""}],"id":2820,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2258:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2258:80:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2827,"nodeType":"ExpressionStatement","src":"2258:80:5"},{"assignments":[2829],"declarations":[{"constant":false,"id":2829,"mutability":"mutable","name":"stake","nameLocation":"2356:5:5","nodeType":"VariableDeclaration","scope":2878,"src":"2348:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2828,"name":"uint256","nodeType":"ElementaryTypeName","src":"2348:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2835,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2830,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2807,"src":"2364:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2831,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2369:5:5","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":3433,"src":"2364:10:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":2832,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2377:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2381:5:5","memberName":"value","nodeType":"MemberAccess","src":"2377:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2364:22:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2348:38:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2837,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2829,"src":"2404:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2838,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2412:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2404:9:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6e6f207374616b6520737065636966696564","id":2840,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2415:20:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8","typeString":"literal_string \"no stake specified\""},"value":"no stake specified"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8","typeString":"literal_string \"no stake specified\""}],"id":2836,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2396:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2396:40:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2842,"nodeType":"ExpressionStatement","src":"2396:40:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2844,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2829,"src":"2454:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":2847,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2468:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":2846,"name":"uint112","nodeType":"ElementaryTypeName","src":"2468:7:5","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"}],"id":2845,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2463:4:5","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2463:13:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint112","typeString":"type(uint112)"}},"id":2849,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2477:3:5","memberName":"max","nodeType":"MemberAccess","src":"2463:17:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"2454:26:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"7374616b65206f766572666c6f77","id":2851,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2482:16:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8","typeString":"literal_string \"stake overflow\""},"value":"stake overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8","typeString":"literal_string \"stake overflow\""}],"id":2843,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2446:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2446:53:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2853,"nodeType":"ExpressionStatement","src":"2446:53:5"},{"expression":{"id":2869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2854,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"2509:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2857,"indexExpression":{"expression":{"id":2855,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2518:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2856,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2522:6:5","memberName":"sender","nodeType":"MemberAccess","src":"2518:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2509:20:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":2859,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2807,"src":"2557:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2860,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2562:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"2557:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},{"hexValue":"74727565","id":2861,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2583:4:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"arguments":[{"id":2864,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2829,"src":"2609:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2863,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2601:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":2862,"name":"uint112","nodeType":"ElementaryTypeName","src":"2601:7:5","typeDescriptions":{}}},"id":2865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2601:14:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},{"id":2866,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2802,"src":"2629:15:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"hexValue":"30","id":2867,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2658:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint112","typeString":"uint112"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint112","typeString":"uint112"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2858,"name":"DepositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3438,"src":"2532:11:5","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_DepositInfo_$3438_storage_ptr_$","typeString":"type(struct IStakeManager.DepositInfo storage pointer)"}},"id":2868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2532:137:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_memory_ptr","typeString":"struct IStakeManager.DepositInfo memory"}},"src":"2509:160:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"id":2870,"nodeType":"ExpressionStatement","src":"2509:160:5"},{"eventCall":{"arguments":[{"expression":{"id":2872,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2696:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2700:6:5","memberName":"sender","nodeType":"MemberAccess","src":"2696:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2874,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2829,"src":"2708:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2875,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2802,"src":"2715:15:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"id":2871,"name":"StakeLocked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3412,"src":"2684:11:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,uint256,uint256)"}},"id":2876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2684:47:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2877,"nodeType":"EmitStatement","src":"2679:52:5"}]},"documentation":{"id":2800,"nodeType":"StructuredDocumentation","src":"1861:200:5","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":2879,"implemented":true,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2075:8:5","nodeType":"FunctionDefinition","parameters":{"id":2803,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2802,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"2091:15:5","nodeType":"VariableDeclaration","scope":2879,"src":"2084:22:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":2801,"name":"uint32","nodeType":"ElementaryTypeName","src":"2084:6:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2083:24:5"},"returnParameters":{"id":2804,"nodeType":"ParameterList","parameters":[],"src":"2123:0:5"},"scope":3077,"src":"2066:672:5","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[3476],"body":{"id":2934,"nodeType":"Block","src":"2909:376:5","statements":[{"assignments":[2885],"declarations":[{"constant":false,"id":2885,"mutability":"mutable","name":"info","nameLocation":"2939:4:5","nodeType":"VariableDeclaration","scope":2934,"src":"2919:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2884,"nodeType":"UserDefinedTypeName","pathNode":{"id":2883,"name":"DepositInfo","nameLocations":["2919:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"2919:11:5"},"referencedDeclaration":3438,"src":"2919:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2890,"initialValue":{"baseExpression":{"id":2886,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"2946:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2889,"indexExpression":{"expression":{"id":2887,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2955:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2959:6:5","memberName":"sender","nodeType":"MemberAccess","src":"2955:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2946:20:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"2919:47:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":2895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2892,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2885,"src":"2984:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2893,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2989:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3435,"src":"2984:20:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":2894,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3008:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2984:25:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6e6f74207374616b6564","id":2896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3011:12:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12","typeString":"literal_string \"not staked\""},"value":"not staked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12","typeString":"literal_string \"not staked\""}],"id":2891,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2976:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2897,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2976:48:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2898,"nodeType":"ExpressionStatement","src":"2976:48:5"},{"expression":{"arguments":[{"expression":{"id":2900,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2885,"src":"3042:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2901,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3047:6:5","memberName":"staked","nodeType":"MemberAccess","referencedDeclaration":3431,"src":"3042:11:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"616c726561647920756e7374616b696e67","id":2902,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3055:19:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8","typeString":"literal_string \"already unstaking\""},"value":"already unstaking"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8","typeString":"literal_string \"already unstaking\""}],"id":2899,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3034:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2903,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3034:41:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2904,"nodeType":"ExpressionStatement","src":"3034:41:5"},{"assignments":[2906],"declarations":[{"constant":false,"id":2906,"mutability":"mutable","name":"withdrawTime","nameLocation":"3092:12:5","nodeType":"VariableDeclaration","scope":2934,"src":"3085:19:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":2905,"name":"uint48","nodeType":"ElementaryTypeName","src":"3085:6:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":2915,"initialValue":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":2909,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3114:5:5","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":2910,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3120:9:5","memberName":"timestamp","nodeType":"MemberAccess","src":"3114:15:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2908,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3107:6:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":2907,"name":"uint48","nodeType":"ElementaryTypeName","src":"3107:6:5","typeDescriptions":{}}},"id":2911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3107:23:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":2912,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2885,"src":"3133:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2913,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3138:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3435,"src":"3133:20:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"3107:46:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"3085:68:5"},{"expression":{"id":2920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2916,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2885,"src":"3163:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2918,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3168:12:5","memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":3437,"src":"3163:17:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2919,"name":"withdrawTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2906,"src":"3183:12:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"3163:32:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2921,"nodeType":"ExpressionStatement","src":"3163:32:5"},{"expression":{"id":2926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2922,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2885,"src":"3205:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2924,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3210:6:5","memberName":"staked","nodeType":"MemberAccess","referencedDeclaration":3431,"src":"3205:11:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":2925,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3219:5:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3205:19:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2927,"nodeType":"ExpressionStatement","src":"3205:19:5"},{"eventCall":{"arguments":[{"expression":{"id":2929,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3253:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3257:6:5","memberName":"sender","nodeType":"MemberAccess","src":"3253:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2931,"name":"withdrawTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2906,"src":"3265:12:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":2928,"name":"StakeUnlocked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3419,"src":"3239:13:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":2932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3239:39:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2933,"nodeType":"EmitStatement","src":"3234:44:5"}]},"documentation":{"id":2880,"nodeType":"StructuredDocumentation","src":"2744:128:5","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":2935,"implemented":true,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2886:11:5","nodeType":"FunctionDefinition","parameters":{"id":2881,"nodeType":"ParameterList","parameters":[],"src":"2897:2:5"},"returnParameters":{"id":2882,"nodeType":"ParameterList","parameters":[],"src":"2909:0:5"},"scope":3077,"src":"2877:408:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[3482],"body":{"id":3017,"nodeType":"Block","src":"3556:586:5","statements":[{"assignments":[2943],"declarations":[{"constant":false,"id":2943,"mutability":"mutable","name":"info","nameLocation":"3586:4:5","nodeType":"VariableDeclaration","scope":3017,"src":"3566:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":2942,"nodeType":"UserDefinedTypeName","pathNode":{"id":2941,"name":"DepositInfo","nameLocations":["3566:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"3566:11:5"},"referencedDeclaration":3438,"src":"3566:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":2948,"initialValue":{"baseExpression":{"id":2944,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"3593:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":2947,"indexExpression":{"expression":{"id":2945,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3602:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2946,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3606:6:5","memberName":"sender","nodeType":"MemberAccess","src":"3602:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3593:20:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"3566:47:5"},{"assignments":[2950],"declarations":[{"constant":false,"id":2950,"mutability":"mutable","name":"stake","nameLocation":"3631:5:5","nodeType":"VariableDeclaration","scope":3017,"src":"3623:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2949,"name":"uint256","nodeType":"ElementaryTypeName","src":"3623:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2953,"initialValue":{"expression":{"id":2951,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3639:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2952,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3644:5:5","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":3433,"src":"3639:10:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"3623:26:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2957,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2955,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2950,"src":"3667:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2956,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3675:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3667:9:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4e6f207374616b6520746f207769746864726177","id":2958,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3678:22:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705","typeString":"literal_string \"No stake to withdraw\""},"value":"No stake to withdraw"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705","typeString":"literal_string \"No stake to withdraw\""}],"id":2954,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3659:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2959,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3659:42:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2960,"nodeType":"ExpressionStatement","src":"3659:42:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":2965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2962,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3719:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2963,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3724:12:5","memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":3437,"src":"3719:17:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2964,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3739:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3719:21:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d7573742063616c6c20756e6c6f636b5374616b652829206669727374","id":2966,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3742:31:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5","typeString":"literal_string \"must call unlockStake() first\""},"value":"must call unlockStake() first"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5","typeString":"literal_string \"must call unlockStake() first\""}],"id":2961,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3711:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3711:63:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2968,"nodeType":"ExpressionStatement","src":"3711:63:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2970,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3792:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2971,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3797:12:5","memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":3437,"src":"3792:17:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":2972,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3813:5:5","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":2973,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3819:9:5","memberName":"timestamp","nodeType":"MemberAccess","src":"3813:15:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3792:36:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5374616b65207769746864726177616c206973206e6f7420647565","id":2975,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3830:29:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45","typeString":"literal_string \"Stake withdrawal is not due\""},"value":"Stake withdrawal is not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45","typeString":"literal_string \"Stake withdrawal is not due\""}],"id":2969,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3784:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2976,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3784:76:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2977,"nodeType":"ExpressionStatement","src":"3784:76:5"},{"expression":{"id":2982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2978,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3870:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2980,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3875:15:5","memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":3435,"src":"3870:20:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":2981,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3893:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3870:24:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"id":2983,"nodeType":"ExpressionStatement","src":"3870:24:5"},{"expression":{"id":2988,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2984,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3904:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2986,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3909:12:5","memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":3437,"src":"3904:17:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":2987,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3924:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3904:21:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":2989,"nodeType":"ExpressionStatement","src":"3904:21:5"},{"expression":{"id":2994,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":2990,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2943,"src":"3935:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":2992,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3940:5:5","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":3433,"src":"3935:10:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":2993,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3948:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3935:14:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":2995,"nodeType":"ExpressionStatement","src":"3935:14:5"},{"eventCall":{"arguments":[{"expression":{"id":2997,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3979:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3983:6:5","memberName":"sender","nodeType":"MemberAccess","src":"3979:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2999,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2938,"src":"3991:15:5","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":3000,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2950,"src":"4008:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2996,"name":"StakeWithdrawn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3427,"src":"3964:14:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3001,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3964:50:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3002,"nodeType":"EmitStatement","src":"3959:55:5"},{"assignments":[3004,null],"declarations":[{"constant":false,"id":3004,"mutability":"mutable","name":"success","nameLocation":"4030:7:5","nodeType":"VariableDeclaration","scope":3017,"src":"4025:12:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3003,"name":"bool","nodeType":"ElementaryTypeName","src":"4025:4:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":3011,"initialValue":{"arguments":[{"hexValue":"","id":3009,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4078:2:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":3005,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2938,"src":"4042:15:5","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":3006,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4058:4:5","memberName":"call","nodeType":"MemberAccess","src":"4042:20:5","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":3007,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2950,"src":"4071:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4042:35:5","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4042:39:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4024:57:5"},{"expression":{"arguments":[{"id":3013,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3004,"src":"4099:7:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6661696c656420746f207769746864726177207374616b65","id":3014,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4108:26:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b","typeString":"literal_string \"failed to withdraw stake\""},"value":"failed to withdraw stake"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b","typeString":"literal_string \"failed to withdraw stake\""}],"id":3012,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4091:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3015,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4091:44:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3016,"nodeType":"ExpressionStatement","src":"4091:44:5"}]},"documentation":{"id":2936,"nodeType":"StructuredDocumentation","src":"3292:194:5","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":3018,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"3500:13:5","nodeType":"FunctionDefinition","parameters":{"id":2939,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2938,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3530:15:5","nodeType":"VariableDeclaration","scope":3018,"src":"3514:31:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":2937,"name":"address","nodeType":"ElementaryTypeName","src":"3514:15:5","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3513:33:5"},"returnParameters":{"id":2940,"nodeType":"ParameterList","parameters":[],"src":"3556:0:5"},"scope":3077,"src":"3491:651:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[3490],"body":{"id":3075,"nodeType":"Block","src":"4404:398:5","statements":[{"assignments":[3028],"declarations":[{"constant":false,"id":3028,"mutability":"mutable","name":"info","nameLocation":"4434:4:5","nodeType":"VariableDeclaration","scope":3075,"src":"4414:24:5","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":3027,"nodeType":"UserDefinedTypeName","pathNode":{"id":3026,"name":"DepositInfo","nameLocations":["4414:11:5"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"4414:11:5"},"referencedDeclaration":3438,"src":"4414:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":3033,"initialValue":{"baseExpression":{"id":3029,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2664,"src":"4441:8:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$3438_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":3032,"indexExpression":{"expression":{"id":3030,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4450:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4454:6:5","memberName":"sender","nodeType":"MemberAccess","src":"4450:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4441:20:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"4414:47:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3035,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3023,"src":"4479:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":3036,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3028,"src":"4497:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":3037,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4502:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"4497:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"4479:30:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"576974686472617720616d6f756e7420746f6f206c61726765","id":3039,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4511:27:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178","typeString":"literal_string \"Withdraw amount too large\""},"value":"Withdraw amount too large"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178","typeString":"literal_string \"Withdraw amount too large\""}],"id":3034,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4471:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3040,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4471:68:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3041,"nodeType":"ExpressionStatement","src":"4471:68:5"},{"expression":{"id":3052,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":3042,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3028,"src":"4549:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":3044,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"4554:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"4549:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3047,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3028,"src":"4572:4:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":3048,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4577:7:5","memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":3429,"src":"4572:12:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":3049,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3023,"src":"4587:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4572:29:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3046,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4564:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":3045,"name":"uint112","nodeType":"ElementaryTypeName","src":"4564:7:5","typeDescriptions":{}}},"id":3051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4564:38:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"4549:53:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":3053,"nodeType":"ExpressionStatement","src":"4549:53:5"},{"eventCall":{"arguments":[{"expression":{"id":3055,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4627:3:5","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":3056,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4631:6:5","memberName":"sender","nodeType":"MemberAccess","src":"4627:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3057,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3021,"src":"4639:15:5","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":3058,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3023,"src":"4656:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3054,"name":"Withdrawn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3403,"src":"4617:9:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3059,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4617:54:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3060,"nodeType":"EmitStatement","src":"4612:59:5"},{"assignments":[3062,null],"declarations":[{"constant":false,"id":3062,"mutability":"mutable","name":"success","nameLocation":"4687:7:5","nodeType":"VariableDeclaration","scope":3075,"src":"4682:12:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3061,"name":"bool","nodeType":"ElementaryTypeName","src":"4682:4:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":3069,"initialValue":{"arguments":[{"hexValue":"","id":3067,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4744:2:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":3063,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3021,"src":"4699:15:5","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":3064,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4715:4:5","memberName":"call","nodeType":"MemberAccess","src":"4699:20:5","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":3065,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3023,"src":"4728:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4699:44:5","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":3068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4699:48:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4681:66:5"},{"expression":{"arguments":[{"id":3071,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3062,"src":"4765:7:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6661696c656420746f207769746864726177","id":3072,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4774:20:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41","typeString":"literal_string \"failed to withdraw\""},"value":"failed to withdraw"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41","typeString":"literal_string \"failed to withdraw\""}],"id":3070,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4757:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3073,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4757:38:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3074,"nodeType":"ExpressionStatement","src":"4757:38:5"}]},"documentation":{"id":3019,"nodeType":"StructuredDocumentation","src":"4148:165:5","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":3076,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"4327:10:5","nodeType":"FunctionDefinition","parameters":{"id":3024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3021,"mutability":"mutable","name":"withdrawAddress","nameLocation":"4354:15:5","nodeType":"VariableDeclaration","scope":3076,"src":"4338:31:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3020,"name":"address","nodeType":"ElementaryTypeName","src":"4338:15:5","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":3023,"mutability":"mutable","name":"withdrawAmount","nameLocation":"4379:14:5","nodeType":"VariableDeclaration","scope":3076,"src":"4371:22:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3022,"name":"uint256","nodeType":"ElementaryTypeName","src":"4371:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4337:57:5"},"returnParameters":{"id":3025,"nodeType":"ParameterList","parameters":[],"src":"4404:0:5"},"scope":3077,"src":"4318:484:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3078,"src":"399:4405:5","usedErrors":[]}],"src":"41:4764:5"},"id":5},"contracts/interfaces/IAccount.sol":{"ast":{"absolutePath":"contracts/interfaces/IAccount.sol","exportedSymbols":{"IAccount":[3094],"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":3095,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3079,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:6"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":3080,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3095,"sourceUnit":3689,"src":"62:29:6","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAccount","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":3094,"linearizedBaseContracts":[3094],"name":"IAccount","nameLocation":"103:8:6","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3081,"nodeType":"StructuredDocumentation","src":"119:1861:6","text":" Validate user's signature and nonce\n the entryPoint will make the call to the recipient only if this validation call returns successfully.\n signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n This allows making a \"simulation call\" without a valid signature\n Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n @dev Must validate caller is the entryPoint.\n Must validate the signature and nonce\n @param userOp the operation that is about to be executed.\n @param userOpHash hash of the user's request data. can be used as the basis for signature.\n @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n The excess is left as a deposit in the entrypoint, for future calls.\n can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"functionSelector":"3a871cdd","id":3093,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1994:14:6","nodeType":"FunctionDefinition","parameters":{"id":3089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3084,"mutability":"mutable","name":"userOp","nameLocation":"2032:6:6","nodeType":"VariableDeclaration","scope":3093,"src":"2009:29:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3083,"nodeType":"UserDefinedTypeName","pathNode":{"id":3082,"name":"UserOperation","nameLocations":["2009:13:6"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"2009:13:6"},"referencedDeclaration":3518,"src":"2009:13:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":3086,"mutability":"mutable","name":"userOpHash","nameLocation":"2048:10:6","nodeType":"VariableDeclaration","scope":3093,"src":"2040:18:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3085,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2040:7:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3088,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"2068:19:6","nodeType":"VariableDeclaration","scope":3093,"src":"2060:27:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3087,"name":"uint256","nodeType":"ElementaryTypeName","src":"2060:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2008:80:6"},"returnParameters":{"id":3092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3091,"mutability":"mutable","name":"validationData","nameLocation":"2119:14:6","nodeType":"VariableDeclaration","scope":3093,"src":"2111:22:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3090,"name":"uint256","nodeType":"ElementaryTypeName","src":"2111:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2110:24:6"},"scope":3094,"src":"1985:150:6","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3095,"src":"93:2044:6","usedErrors":[]}],"src":"36:2102:6"},"id":6},"contracts/interfaces/IAggregator.sol":{"ast":{"absolutePath":"contracts/interfaces/IAggregator.sol","exportedSymbols":{"IAggregator":[3128],"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":3129,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3096,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:7"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":3097,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3129,"sourceUnit":3689,"src":"62:29:7","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAggregator","contractDependencies":[],"contractKind":"interface","documentation":{"id":3098,"nodeType":"StructuredDocumentation","src":"93:43:7","text":" Aggregated Signatures validator."},"fullyImplemented":false,"id":3128,"linearizedBaseContracts":[3128],"name":"IAggregator","nameLocation":"147:11:7","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3099,"nodeType":"StructuredDocumentation","src":"166:136:7","text":" validate aggregated signature.\n revert if the aggregated signature does not match the given list of operations."},"functionSelector":"e3563a4f","id":3108,"implemented":false,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"316:18:7","nodeType":"FunctionDefinition","parameters":{"id":3106,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3103,"mutability":"mutable","name":"userOps","nameLocation":"360:7:7","nodeType":"VariableDeclaration","scope":3108,"src":"335:32:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3101,"nodeType":"UserDefinedTypeName","pathNode":{"id":3100,"name":"UserOperation","nameLocations":["335:13:7"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"335:13:7"},"referencedDeclaration":3518,"src":"335:13:7","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":3102,"nodeType":"ArrayTypeName","src":"335:15:7","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":3105,"mutability":"mutable","name":"signature","nameLocation":"384:9:7","nodeType":"VariableDeclaration","scope":3108,"src":"369:24:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3104,"name":"bytes","nodeType":"ElementaryTypeName","src":"369:5:7","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"334:60:7"},"returnParameters":{"id":3107,"nodeType":"ParameterList","parameters":[],"src":"408:0:7"},"scope":3128,"src":"307:102:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3109,"nodeType":"StructuredDocumentation","src":"415:576:7","text":" validate signature of a single userOp\n This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n @param userOp the userOperation received from the user.\n @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n (usually empty, unless account and aggregator support some kind of \"multisig\""},"functionSelector":"64c530cd","id":3117,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"1005:23:7","nodeType":"FunctionDefinition","parameters":{"id":3113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3112,"mutability":"mutable","name":"userOp","nameLocation":"1052:6:7","nodeType":"VariableDeclaration","scope":3117,"src":"1029:29:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3111,"nodeType":"UserDefinedTypeName","pathNode":{"id":3110,"name":"UserOperation","nameLocations":["1029:13:7"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"1029:13:7"},"referencedDeclaration":3518,"src":"1029:13:7","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1028:31:7"},"returnParameters":{"id":3116,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3115,"mutability":"mutable","name":"sigForUserOp","nameLocation":"1100:12:7","nodeType":"VariableDeclaration","scope":3117,"src":"1087:25:7","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3114,"name":"bytes","nodeType":"ElementaryTypeName","src":"1087:5:7","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1086:27:7"},"scope":3128,"src":"996:118:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3118,"nodeType":"StructuredDocumentation","src":"1120:368:7","text":" aggregate multiple signatures into a single value.\n This method is called off-chain to calculate the signature to pass with handleOps()\n bundler MAY use optimized custom code perform this aggregation\n @param userOps array of UserOperations to collect the signatures from.\n @return aggregatedSignature the aggregated signature"},"functionSelector":"275e2d79","id":3127,"implemented":false,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"1502:19:7","nodeType":"FunctionDefinition","parameters":{"id":3123,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3122,"mutability":"mutable","name":"userOps","nameLocation":"1547:7:7","nodeType":"VariableDeclaration","scope":3127,"src":"1522:32:7","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3120,"nodeType":"UserDefinedTypeName","pathNode":{"id":3119,"name":"UserOperation","nameLocations":["1522:13:7"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"1522:13:7"},"referencedDeclaration":3518,"src":"1522:13:7","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":3121,"nodeType":"ArrayTypeName","src":"1522:15:7","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"1521:34:7"},"returnParameters":{"id":3126,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3125,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"1592:19:7","nodeType":"VariableDeclaration","scope":3127,"src":"1579:32:7","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3124,"name":"bytes","nodeType":"ElementaryTypeName","src":"1579:5:7","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1578:34:7"},"scope":3128,"src":"1493:120:7","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":3129,"src":"137:1478:7","usedErrors":[]}],"src":"36:1580:7"},"id":7},"contracts/interfaces/IEntryPoint.sol":{"ast":{"absolutePath":"contracts/interfaces/IEntryPoint.sol","exportedSymbols":{"IAggregator":[3128],"IEntryPoint":[3332],"INonceManager":[3351],"IStakeManager":[3491],"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":3333,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3130,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:8"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":3131,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3333,"sourceUnit":3689,"src":"311:29:8","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"./IStakeManager.sol","id":3132,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3333,"sourceUnit":3492,"src":"341:29:8","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"./IAggregator.sol","id":3133,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3333,"sourceUnit":3129,"src":"371:27:8","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/INonceManager.sol","file":"./INonceManager.sol","id":3134,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3333,"sourceUnit":3352,"src":"399:29:8","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":3135,"name":"IStakeManager","nameLocations":["455:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3491,"src":"455:13:8"},"id":3136,"nodeType":"InheritanceSpecifier","src":"455:13:8"},{"baseName":{"id":3137,"name":"INonceManager","nameLocations":["470:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3351,"src":"470:13:8"},"id":3138,"nodeType":"InheritanceSpecifier","src":"470:13:8"}],"canonicalName":"IEntryPoint","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":3332,"linearizedBaseContracts":[3332,3351,3491],"name":"IEntryPoint","nameLocation":"440:11:8","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","id":3154,"name":"UserOperationEvent","nameLocation":"1191:18:8","nodeType":"EventDefinition","parameters":{"id":3153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3140,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1226:10:8","nodeType":"VariableDeclaration","scope":3154,"src":"1210:26:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3139,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1210:7:8","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3142,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1254:6:8","nodeType":"VariableDeclaration","scope":3154,"src":"1238:22:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3141,"name":"address","nodeType":"ElementaryTypeName","src":"1238:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3144,"indexed":true,"mutability":"mutable","name":"paymaster","nameLocation":"1278:9:8","nodeType":"VariableDeclaration","scope":3154,"src":"1262:25:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3143,"name":"address","nodeType":"ElementaryTypeName","src":"1262:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3146,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"1297:5:8","nodeType":"VariableDeclaration","scope":3154,"src":"1289:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3145,"name":"uint256","nodeType":"ElementaryTypeName","src":"1289:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3148,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"1309:7:8","nodeType":"VariableDeclaration","scope":3154,"src":"1304:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3147,"name":"bool","nodeType":"ElementaryTypeName","src":"1304:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3150,"indexed":false,"mutability":"mutable","name":"actualGasCost","nameLocation":"1326:13:8","nodeType":"VariableDeclaration","scope":3154,"src":"1318:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3149,"name":"uint256","nodeType":"ElementaryTypeName","src":"1318:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3152,"indexed":false,"mutability":"mutable","name":"actualGasUsed","nameLocation":"1349:13:8","nodeType":"VariableDeclaration","scope":3154,"src":"1341:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3151,"name":"uint256","nodeType":"ElementaryTypeName","src":"1341:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1209:154:8"},"src":"1185:179:8"},{"anonymous":false,"documentation":{"id":3155,"nodeType":"StructuredDocumentation","src":"1370:333:8","text":" account \"sender\" was deployed.\n @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n @param sender the account that is deployed\n @param factory the factory used to deploy this account (in the initCode)\n @param paymaster the paymaster used by this UserOp"},"eventSelector":"d51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d","id":3165,"name":"AccountDeployed","nameLocation":"1714:15:8","nodeType":"EventDefinition","parameters":{"id":3164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3157,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1746:10:8","nodeType":"VariableDeclaration","scope":3165,"src":"1730:26:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3156,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1730:7:8","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3159,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1774:6:8","nodeType":"VariableDeclaration","scope":3165,"src":"1758:22:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3158,"name":"address","nodeType":"ElementaryTypeName","src":"1758:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3161,"indexed":false,"mutability":"mutable","name":"factory","nameLocation":"1790:7:8","nodeType":"VariableDeclaration","scope":3165,"src":"1782:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3160,"name":"address","nodeType":"ElementaryTypeName","src":"1782:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3163,"indexed":false,"mutability":"mutable","name":"paymaster","nameLocation":"1807:9:8","nodeType":"VariableDeclaration","scope":3165,"src":"1799:17:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3162,"name":"address","nodeType":"ElementaryTypeName","src":"1799:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1729:88:8"},"src":"1708:110:8"},{"anonymous":false,"documentation":{"id":3166,"nodeType":"StructuredDocumentation","src":"1824:337:8","text":" An event emitted if the UserOperation \"callData\" reverted with non-zero length\n @param userOpHash the request unique identifier.\n @param sender the sender of this request\n @param nonce the nonce used in the request\n @param revertReason - the return bytes from the (reverted) call to \"callData\"."},"eventSelector":"1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201","id":3176,"name":"UserOperationRevertReason","nameLocation":"2172:25:8","nodeType":"EventDefinition","parameters":{"id":3175,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3168,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"2214:10:8","nodeType":"VariableDeclaration","scope":3176,"src":"2198:26:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3167,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2198:7:8","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3170,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"2242:6:8","nodeType":"VariableDeclaration","scope":3176,"src":"2226:22:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3169,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3172,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"2258:5:8","nodeType":"VariableDeclaration","scope":3176,"src":"2250:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3171,"name":"uint256","nodeType":"ElementaryTypeName","src":"2250:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3174,"indexed":false,"mutability":"mutable","name":"revertReason","nameLocation":"2271:12:8","nodeType":"VariableDeclaration","scope":3176,"src":"2265:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3173,"name":"bytes","nodeType":"ElementaryTypeName","src":"2265:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2197:87:8"},"src":"2166:119:8"},{"anonymous":false,"documentation":{"id":3177,"nodeType":"StructuredDocumentation","src":"2291:158:8","text":" an event emitted by handleOps(), before starting the execution loop.\n any event emitted before this event, is part of the validation."},"eventSelector":"bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972","id":3179,"name":"BeforeExecution","nameLocation":"2460:15:8","nodeType":"EventDefinition","parameters":{"id":3178,"nodeType":"ParameterList","parameters":[],"src":"2475:2:8"},"src":"2454:24:8"},{"anonymous":false,"documentation":{"id":3180,"nodeType":"StructuredDocumentation","src":"2484:101:8","text":" signature aggregator used by the following UserOperationEvents within this bundle."},"eventSelector":"575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d","id":3184,"name":"SignatureAggregatorChanged","nameLocation":"2596:26:8","nodeType":"EventDefinition","parameters":{"id":3183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3182,"indexed":true,"mutability":"mutable","name":"aggregator","nameLocation":"2639:10:8","nodeType":"VariableDeclaration","scope":3184,"src":"2623:26:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3181,"name":"address","nodeType":"ElementaryTypeName","src":"2623:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2622:28:8"},"src":"2590:61:8"},{"documentation":{"id":3185,"nodeType":"StructuredDocumentation","src":"2657:756:8","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":3191,"name":"FailedOp","nameLocation":"3424:8:8","nodeType":"ErrorDefinition","parameters":{"id":3190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3187,"mutability":"mutable","name":"opIndex","nameLocation":"3441:7:8","nodeType":"VariableDeclaration","scope":3191,"src":"3433:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3186,"name":"uint256","nodeType":"ElementaryTypeName","src":"3433:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3189,"mutability":"mutable","name":"reason","nameLocation":"3457:6:8","nodeType":"VariableDeclaration","scope":3191,"src":"3450:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":3188,"name":"string","nodeType":"ElementaryTypeName","src":"3450:6:8","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3432:32:8"},"src":"3418:47:8"},{"documentation":{"id":3192,"nodeType":"StructuredDocumentation","src":"3471:114:8","text":" error case when a signature aggregator fails to verify the aggregated signature it had created."},"errorSelector":"86a9f750","id":3196,"name":"SignatureValidationFailed","nameLocation":"3596:25:8","nodeType":"ErrorDefinition","parameters":{"id":3195,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3194,"mutability":"mutable","name":"aggregator","nameLocation":"3630:10:8","nodeType":"VariableDeclaration","scope":3196,"src":"3622:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3193,"name":"address","nodeType":"ElementaryTypeName","src":"3622:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3621:20:8"},"src":"3590:52:8"},{"documentation":{"id":3197,"nodeType":"StructuredDocumentation","src":"3648:327:8","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":3211,"name":"ValidationResult","nameLocation":"3986:16:8","nodeType":"ErrorDefinition","parameters":{"id":3210,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3200,"mutability":"mutable","name":"returnInfo","nameLocation":"4014:10:8","nodeType":"VariableDeclaration","scope":3211,"src":"4003:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":3199,"nodeType":"UserDefinedTypeName","pathNode":{"id":3198,"name":"ReturnInfo","nameLocations":["4003:10:8"],"nodeType":"IdentifierPath","referencedDeclaration":3308,"src":"4003:10:8"},"referencedDeclaration":3308,"src":"4003:10:8","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":3203,"mutability":"mutable","name":"senderInfo","nameLocation":"4044:10:8","nodeType":"VariableDeclaration","scope":3211,"src":"4034:20:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3202,"nodeType":"UserDefinedTypeName","pathNode":{"id":3201,"name":"StakeInfo","nameLocations":["4034:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4034:9:8"},"referencedDeclaration":3443,"src":"4034:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3206,"mutability":"mutable","name":"factoryInfo","nameLocation":"4066:11:8","nodeType":"VariableDeclaration","scope":3211,"src":"4056:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3205,"nodeType":"UserDefinedTypeName","pathNode":{"id":3204,"name":"StakeInfo","nameLocations":["4056:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4056:9:8"},"referencedDeclaration":3443,"src":"4056:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3209,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4089:13:8","nodeType":"VariableDeclaration","scope":3211,"src":"4079:23:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3208,"nodeType":"UserDefinedTypeName","pathNode":{"id":3207,"name":"StakeInfo","nameLocations":["4079:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4079:9:8"},"referencedDeclaration":3443,"src":"4079:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"4002:101:8"},"src":"3980:124:8"},{"documentation":{"id":3212,"nodeType":"StructuredDocumentation","src":"4110:561:8","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":3229,"name":"ValidationResultWithAggregation","nameLocation":"4682:31:8","nodeType":"ErrorDefinition","parameters":{"id":3228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3215,"mutability":"mutable","name":"returnInfo","nameLocation":"4725:10:8","nodeType":"VariableDeclaration","scope":3229,"src":"4714:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":3214,"nodeType":"UserDefinedTypeName","pathNode":{"id":3213,"name":"ReturnInfo","nameLocations":["4714:10:8"],"nodeType":"IdentifierPath","referencedDeclaration":3308,"src":"4714:10:8"},"referencedDeclaration":3308,"src":"4714:10:8","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$3308_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":3218,"mutability":"mutable","name":"senderInfo","nameLocation":"4755:10:8","nodeType":"VariableDeclaration","scope":3229,"src":"4745:20:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3217,"nodeType":"UserDefinedTypeName","pathNode":{"id":3216,"name":"StakeInfo","nameLocations":["4745:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4745:9:8"},"referencedDeclaration":3443,"src":"4745:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3221,"mutability":"mutable","name":"factoryInfo","nameLocation":"4777:11:8","nodeType":"VariableDeclaration","scope":3229,"src":"4767:21:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3220,"nodeType":"UserDefinedTypeName","pathNode":{"id":3219,"name":"StakeInfo","nameLocations":["4767:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4767:9:8"},"referencedDeclaration":3443,"src":"4767:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3224,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4800:13:8","nodeType":"VariableDeclaration","scope":3229,"src":"4790:23:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3223,"nodeType":"UserDefinedTypeName","pathNode":{"id":3222,"name":"StakeInfo","nameLocations":["4790:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"4790:9:8"},"referencedDeclaration":3443,"src":"4790:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":3227,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"4843:14:8","nodeType":"VariableDeclaration","scope":3229,"src":"4823:34:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":3226,"nodeType":"UserDefinedTypeName","pathNode":{"id":3225,"name":"AggregatorStakeInfo","nameLocations":["4823:19:8"],"nodeType":"IdentifierPath","referencedDeclaration":3314,"src":"4823:19:8"},"referencedDeclaration":3314,"src":"4823:19:8","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$3314_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"4713:145:8"},"src":"4676:183:8"},{"documentation":{"id":3230,"nodeType":"StructuredDocumentation","src":"4865:51:8","text":" return value of getSenderAddress"},"errorSelector":"6ca7b806","id":3234,"name":"SenderAddressResult","nameLocation":"4927:19:8","nodeType":"ErrorDefinition","parameters":{"id":3233,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3232,"mutability":"mutable","name":"sender","nameLocation":"4955:6:8","nodeType":"VariableDeclaration","scope":3234,"src":"4947:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3231,"name":"address","nodeType":"ElementaryTypeName","src":"4947:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4946:16:8"},"src":"4921:42:8"},{"documentation":{"id":3235,"nodeType":"StructuredDocumentation","src":"4969:51:8","text":" return value of simulateHandleOp"},"errorSelector":"8b7ac980","id":3249,"name":"ExecutionResult","nameLocation":"5031:15:8","nodeType":"ErrorDefinition","parameters":{"id":3248,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3237,"mutability":"mutable","name":"preOpGas","nameLocation":"5055:8:8","nodeType":"VariableDeclaration","scope":3249,"src":"5047:16:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3236,"name":"uint256","nodeType":"ElementaryTypeName","src":"5047:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3239,"mutability":"mutable","name":"paid","nameLocation":"5073:4:8","nodeType":"VariableDeclaration","scope":3249,"src":"5065:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3238,"name":"uint256","nodeType":"ElementaryTypeName","src":"5065:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3241,"mutability":"mutable","name":"validAfter","nameLocation":"5086:10:8","nodeType":"VariableDeclaration","scope":3249,"src":"5079:17:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3240,"name":"uint48","nodeType":"ElementaryTypeName","src":"5079:6:8","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3243,"mutability":"mutable","name":"validUntil","nameLocation":"5105:10:8","nodeType":"VariableDeclaration","scope":3249,"src":"5098:17:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3242,"name":"uint48","nodeType":"ElementaryTypeName","src":"5098:6:8","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3245,"mutability":"mutable","name":"targetSuccess","nameLocation":"5122:13:8","nodeType":"VariableDeclaration","scope":3249,"src":"5117:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3244,"name":"bool","nodeType":"ElementaryTypeName","src":"5117:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3247,"mutability":"mutable","name":"targetResult","nameLocation":"5143:12:8","nodeType":"VariableDeclaration","scope":3249,"src":"5137:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3246,"name":"bytes","nodeType":"ElementaryTypeName","src":"5137:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5046:110:8"},"src":"5025:132:8"},{"canonicalName":"IEntryPoint.UserOpsPerAggregator","id":3259,"members":[{"constant":false,"id":3253,"mutability":"mutable","name":"userOps","nameLocation":"5255:7:8","nodeType":"VariableDeclaration","scope":3259,"src":"5239:23:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3251,"nodeType":"UserDefinedTypeName","pathNode":{"id":3250,"name":"UserOperation","nameLocations":["5239:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"5239:13:8"},"referencedDeclaration":3518,"src":"5239:13:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":3252,"nodeType":"ArrayTypeName","src":"5239:15:8","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":3256,"mutability":"mutable","name":"aggregator","nameLocation":"5315:10:8","nodeType":"VariableDeclaration","scope":3259,"src":"5303:22:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"},"typeName":{"id":3255,"nodeType":"UserDefinedTypeName","pathNode":{"id":3254,"name":"IAggregator","nameLocations":["5303:11:8"],"nodeType":"IdentifierPath","referencedDeclaration":3128,"src":"5303:11:8"},"referencedDeclaration":3128,"src":"5303:11:8","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$3128","typeString":"contract IAggregator"}},"visibility":"internal"},{"constant":false,"id":3258,"mutability":"mutable","name":"signature","nameLocation":"5373:9:8","nodeType":"VariableDeclaration","scope":3259,"src":"5367:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3257,"name":"bytes","nodeType":"ElementaryTypeName","src":"5367:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOpsPerAggregator","nameLocation":"5208:20:8","nodeType":"StructDefinition","scope":3332,"src":"5201:188:8","visibility":"public"},{"documentation":{"id":3260,"nodeType":"StructuredDocumentation","src":"5395:368:8","text":" Execute a batch of UserOperation.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":3269,"implemented":false,"kind":"function","modifiers":[],"name":"handleOps","nameLocation":"5777:9:8","nodeType":"FunctionDefinition","parameters":{"id":3267,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3264,"mutability":"mutable","name":"ops","nameLocation":"5812:3:8","nodeType":"VariableDeclaration","scope":3269,"src":"5787:28:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":3262,"nodeType":"UserDefinedTypeName","pathNode":{"id":3261,"name":"UserOperation","nameLocations":["5787:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"5787:13:8"},"referencedDeclaration":3518,"src":"5787:13:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"id":3263,"nodeType":"ArrayTypeName","src":"5787:15:8","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$3518_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":3266,"mutability":"mutable","name":"beneficiary","nameLocation":"5833:11:8","nodeType":"VariableDeclaration","scope":3269,"src":"5817:27:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3265,"name":"address","nodeType":"ElementaryTypeName","src":"5817:15:8","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"5786:59:8"},"returnParameters":{"id":3268,"nodeType":"ParameterList","parameters":[],"src":"5854:0:8"},"scope":3332,"src":"5768:87:8","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3270,"nodeType":"StructuredDocumentation","src":"5861:249:8","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":3279,"implemented":false,"kind":"function","modifiers":[],"name":"handleAggregatedOps","nameLocation":"6124:19:8","nodeType":"FunctionDefinition","parameters":{"id":3277,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3274,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"6185:16:8","nodeType":"VariableDeclaration","scope":3279,"src":"6153:48:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":3272,"nodeType":"UserDefinedTypeName","pathNode":{"id":3271,"name":"UserOpsPerAggregator","nameLocations":["6153:20:8"],"nodeType":"IdentifierPath","referencedDeclaration":3259,"src":"6153:20:8"},"referencedDeclaration":3259,"src":"6153:20:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$3259_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":3273,"nodeType":"ArrayTypeName","src":"6153:22:8","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$3259_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":3276,"mutability":"mutable","name":"beneficiary","nameLocation":"6227:11:8","nodeType":"VariableDeclaration","scope":3279,"src":"6211:27:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3275,"name":"address","nodeType":"ElementaryTypeName","src":"6211:15:8","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"6143:101:8"},"returnParameters":{"id":3278,"nodeType":"ParameterList","parameters":[],"src":"6253:0:8"},"scope":3332,"src":"6115:139:8","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3280,"nodeType":"StructuredDocumentation","src":"6260:197:8","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":3288,"implemented":false,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"6471:13:8","nodeType":"FunctionDefinition","parameters":{"id":3284,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3283,"mutability":"mutable","name":"userOp","nameLocation":"6508:6:8","nodeType":"VariableDeclaration","scope":3288,"src":"6485:29:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3282,"nodeType":"UserDefinedTypeName","pathNode":{"id":3281,"name":"UserOperation","nameLocations":["6485:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"6485:13:8"},"referencedDeclaration":3518,"src":"6485:13:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6484:31:8"},"returnParameters":{"id":3287,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3286,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3288,"src":"6539:7:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3285,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6539:7:8","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6538:9:8"},"scope":3332,"src":"6462:86:8","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3289,"nodeType":"StructuredDocumentation","src":"6554:398:8","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":3295,"implemented":false,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"6966:18:8","nodeType":"FunctionDefinition","parameters":{"id":3293,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3292,"mutability":"mutable","name":"userOp","nameLocation":"7008:6:8","nodeType":"VariableDeclaration","scope":3295,"src":"6985:29:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3291,"nodeType":"UserDefinedTypeName","pathNode":{"id":3290,"name":"UserOperation","nameLocations":["6985:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"6985:13:8"},"referencedDeclaration":3518,"src":"6985:13:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6984:31:8"},"returnParameters":{"id":3294,"nodeType":"ParameterList","parameters":[],"src":"7024:0:8"},"scope":3332,"src":"6957:68:8","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"IEntryPoint.ReturnInfo","id":3308,"members":[{"constant":false,"id":3297,"mutability":"mutable","name":"preOpGas","nameLocation":"7660:8:8","nodeType":"VariableDeclaration","scope":3308,"src":"7652:16:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3296,"name":"uint256","nodeType":"ElementaryTypeName","src":"7652:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3299,"mutability":"mutable","name":"prefund","nameLocation":"7686:7:8","nodeType":"VariableDeclaration","scope":3308,"src":"7678:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3298,"name":"uint256","nodeType":"ElementaryTypeName","src":"7678:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3301,"mutability":"mutable","name":"sigFailed","nameLocation":"7708:9:8","nodeType":"VariableDeclaration","scope":3308,"src":"7703:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3300,"name":"bool","nodeType":"ElementaryTypeName","src":"7703:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3303,"mutability":"mutable","name":"validAfter","nameLocation":"7734:10:8","nodeType":"VariableDeclaration","scope":3308,"src":"7727:17:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3302,"name":"uint48","nodeType":"ElementaryTypeName","src":"7727:6:8","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3305,"mutability":"mutable","name":"validUntil","nameLocation":"7761:10:8","nodeType":"VariableDeclaration","scope":3308,"src":"7754:17:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3304,"name":"uint48","nodeType":"ElementaryTypeName","src":"7754:6:8","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":3307,"mutability":"mutable","name":"paymasterContext","nameLocation":"7787:16:8","nodeType":"VariableDeclaration","scope":3308,"src":"7781:22:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3306,"name":"bytes","nodeType":"ElementaryTypeName","src":"7781:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"7631:10:8","nodeType":"StructDefinition","scope":3332,"src":"7624:186:8","visibility":"public"},{"canonicalName":"IEntryPoint.AggregatorStakeInfo","id":3314,"members":[{"constant":false,"id":3310,"mutability":"mutable","name":"aggregator","nameLocation":"7990:10:8","nodeType":"VariableDeclaration","scope":3314,"src":"7982:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3309,"name":"address","nodeType":"ElementaryTypeName","src":"7982:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3313,"mutability":"mutable","name":"stakeInfo","nameLocation":"8020:9:8","nodeType":"VariableDeclaration","scope":3314,"src":"8010:19:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":3312,"nodeType":"UserDefinedTypeName","pathNode":{"id":3311,"name":"StakeInfo","nameLocations":["8010:9:8"],"nodeType":"IdentifierPath","referencedDeclaration":3443,"src":"8010:9:8"},"referencedDeclaration":3443,"src":"8010:9:8","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$3443_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"7952:19:8","nodeType":"StructDefinition","scope":3332,"src":"7945:91:8","visibility":"public"},{"documentation":{"id":3315,"nodeType":"StructuredDocumentation","src":"8042:337:8","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":3320,"implemented":false,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"8393:16:8","nodeType":"FunctionDefinition","parameters":{"id":3318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3317,"mutability":"mutable","name":"initCode","nameLocation":"8423:8:8","nodeType":"VariableDeclaration","scope":3320,"src":"8410:21:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3316,"name":"bytes","nodeType":"ElementaryTypeName","src":"8410:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8409:23:8"},"returnParameters":{"id":3319,"nodeType":"ParameterList","parameters":[],"src":"8441:0:8"},"scope":3332,"src":"8384:58:8","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3321,"nodeType":"StructuredDocumentation","src":"8449:847:8","text":" simulate full execution of a UserOperation (including both validation and target execution)\n this method will always revert with \"ExecutionResult\".\n it performs full validation of the UserOperation, but ignores signature error.\n an optional target address is called after the userop succeeds, and its value is returned\n (before the entire call is reverted)\n Note that in order to collect the the success/failure of the target call, it must be executed\n with trace enabled to track the emitted events.\n @param op the UserOperation to simulate\n @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n are set to the return from that call.\n @param targetCallData callData to pass to target address"},"functionSelector":"d6383f94","id":3331,"implemented":false,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"9310:16:8","nodeType":"FunctionDefinition","parameters":{"id":3329,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3324,"mutability":"mutable","name":"op","nameLocation":"9350:2:8","nodeType":"VariableDeclaration","scope":3331,"src":"9327:25:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3323,"nodeType":"UserDefinedTypeName","pathNode":{"id":3322,"name":"UserOperation","nameLocations":["9327:13:8"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"9327:13:8"},"referencedDeclaration":3518,"src":"9327:13:8","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":3326,"mutability":"mutable","name":"target","nameLocation":"9362:6:8","nodeType":"VariableDeclaration","scope":3331,"src":"9354:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3325,"name":"address","nodeType":"ElementaryTypeName","src":"9354:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3328,"mutability":"mutable","name":"targetCallData","nameLocation":"9385:14:8","nodeType":"VariableDeclaration","scope":3331,"src":"9370:29:8","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3327,"name":"bytes","nodeType":"ElementaryTypeName","src":"9370:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9326:74:8"},"returnParameters":{"id":3330,"nodeType":"ParameterList","parameters":[],"src":"9409:0:8"},"scope":3332,"src":"9301:109:8","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3333,"src":"430:8982:8","usedErrors":[3191,3196,3211,3229,3234,3249]}],"src":"163:9251:8"},"id":8},"contracts/interfaces/INonceManager.sol":{"ast":{"absolutePath":"contracts/interfaces/INonceManager.sol","exportedSymbols":{"INonceManager":[3351]},"id":3352,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3334,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:9"},{"abstract":false,"baseContracts":[],"canonicalName":"INonceManager","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":3351,"linearizedBaseContracts":[3351],"name":"INonceManager","nameLocation":"72:13:9","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3335,"nodeType":"StructuredDocumentation","src":"93:416:9","text":" Return the next nonce for this sender.\n Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n But UserOp with different keys can come with arbitrary order.\n @param sender the account address\n @param key the high 192 bit of the nonce\n @return nonce a full nonce to pass for next UserOp with this sender."},"functionSelector":"35567e1a","id":3344,"implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"523:8:9","nodeType":"FunctionDefinition","parameters":{"id":3340,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3337,"mutability":"mutable","name":"sender","nameLocation":"540:6:9","nodeType":"VariableDeclaration","scope":3344,"src":"532:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3336,"name":"address","nodeType":"ElementaryTypeName","src":"532:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3339,"mutability":"mutable","name":"key","nameLocation":"556:3:9","nodeType":"VariableDeclaration","scope":3344,"src":"548:11:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":3338,"name":"uint192","nodeType":"ElementaryTypeName","src":"548:7:9","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"531:29:9"},"returnParameters":{"id":3343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3342,"mutability":"mutable","name":"nonce","nameLocation":"596:5:9","nodeType":"VariableDeclaration","scope":3344,"src":"588:13:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3341,"name":"uint256","nodeType":"ElementaryTypeName","src":"588:7:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"587:15:9"},"scope":3351,"src":"514:89:9","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3345,"nodeType":"StructuredDocumentation","src":"609:449:9","text":" Manually increment the nonce of the sender.\n This method is exposed just for completeness..\n Account does NOT need to call it, neither during validation, nor elsewhere,\n as the EntryPoint will update the nonce regardless.\n Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n UserOperations will not pay extra for the first transaction with a given key."},"functionSelector":"0bd28e3b","id":3350,"implemented":false,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"1072:14:9","nodeType":"FunctionDefinition","parameters":{"id":3348,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3347,"mutability":"mutable","name":"key","nameLocation":"1095:3:9","nodeType":"VariableDeclaration","scope":3350,"src":"1087:11:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":3346,"name":"uint192","nodeType":"ElementaryTypeName","src":"1087:7:9","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"1086:13:9"},"returnParameters":{"id":3349,"nodeType":"ParameterList","parameters":[],"src":"1108:0:9"},"scope":3351,"src":"1063:46:9","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3352,"src":"62:1049:9","usedErrors":[]}],"src":"36:1076:9"},"id":9},"contracts/interfaces/IPaymaster.sol":{"ast":{"absolutePath":"contracts/interfaces/IPaymaster.sol","exportedSymbols":{"IPaymaster":[3386],"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":3387,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3353,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:10"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":3354,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3387,"sourceUnit":3689,"src":"62:29:10","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IPaymaster","contractDependencies":[],"contractKind":"interface","documentation":{"id":3355,"nodeType":"StructuredDocumentation","src":"93:216:10","text":" the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction."},"fullyImplemented":false,"id":3386,"linearizedBaseContracts":[3386],"name":"IPaymaster","nameLocation":"320:10:10","nodeType":"ContractDefinition","nodes":[{"canonicalName":"IPaymaster.PostOpMode","id":3359,"members":[{"id":3356,"name":"opSucceeded","nameLocation":"364:11:10","nodeType":"EnumValue","src":"364:11:10"},{"id":3357,"name":"opReverted","nameLocation":"406:10:10","nodeType":"EnumValue","src":"406:10:10"},{"id":3358,"name":"postOpReverted","nameLocation":"473:14:10","nodeType":"EnumValue","src":"473:14:10"}],"name":"PostOpMode","nameLocation":"343:10:10","nodeType":"EnumDefinition","src":"338:269:10"},{"documentation":{"id":3360,"nodeType":"StructuredDocumentation","src":"613:1254:10","text":" payment validation: check if paymaster agrees to pay.\n Must verify sender is the entryPoint.\n Revert to reject this request.\n Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n @param userOp the user operation\n @param userOpHash hash of the user's request data.\n @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n @return context value to send to a postOp\n zero length to signify postOp is not required.\n @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"functionSelector":"f465c77e","id":3374,"implemented":false,"kind":"function","modifiers":[],"name":"validatePaymasterUserOp","nameLocation":"1881:23:10","nodeType":"FunctionDefinition","parameters":{"id":3368,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3363,"mutability":"mutable","name":"userOp","nameLocation":"1928:6:10","nodeType":"VariableDeclaration","scope":3374,"src":"1905:29:10","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3362,"nodeType":"UserDefinedTypeName","pathNode":{"id":3361,"name":"UserOperation","nameLocations":["1905:13:10"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"1905:13:10"},"referencedDeclaration":3518,"src":"1905:13:10","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":3365,"mutability":"mutable","name":"userOpHash","nameLocation":"1944:10:10","nodeType":"VariableDeclaration","scope":3374,"src":"1936:18:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3364,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1936:7:10","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3367,"mutability":"mutable","name":"maxCost","nameLocation":"1964:7:10","nodeType":"VariableDeclaration","scope":3374,"src":"1956:15:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3366,"name":"uint256","nodeType":"ElementaryTypeName","src":"1956:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1904:68:10"},"returnParameters":{"id":3373,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3370,"mutability":"mutable","name":"context","nameLocation":"2008:7:10","nodeType":"VariableDeclaration","scope":3374,"src":"1995:20:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3369,"name":"bytes","nodeType":"ElementaryTypeName","src":"1995:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3372,"mutability":"mutable","name":"validationData","nameLocation":"2025:14:10","nodeType":"VariableDeclaration","scope":3374,"src":"2017:22:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3371,"name":"uint256","nodeType":"ElementaryTypeName","src":"2017:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1994:46:10"},"scope":3386,"src":"1872:169:10","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3375,"nodeType":"StructuredDocumentation","src":"2047:616:10","text":" post-operation handler.\n Must verify sender is the entryPoint\n @param mode enum with the following options:\n opSucceeded - user operation succeeded.\n opReverted - user op reverted. still has to pay for gas.\n postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n Now this is the 2nd call, after user's op was deliberately reverted.\n @param context - the context value returned by validatePaymasterUserOp\n @param actualGasCost - actual gas used so far (without this postOp call)."},"functionSelector":"a9a23409","id":3385,"implemented":false,"kind":"function","modifiers":[],"name":"postOp","nameLocation":"2677:6:10","nodeType":"FunctionDefinition","parameters":{"id":3383,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3378,"mutability":"mutable","name":"mode","nameLocation":"2695:4:10","nodeType":"VariableDeclaration","scope":3385,"src":"2684:15:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":3377,"nodeType":"UserDefinedTypeName","pathNode":{"id":3376,"name":"PostOpMode","nameLocations":["2684:10:10"],"nodeType":"IdentifierPath","referencedDeclaration":3359,"src":"2684:10:10"},"referencedDeclaration":3359,"src":"2684:10:10","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$3359","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":3380,"mutability":"mutable","name":"context","nameLocation":"2716:7:10","nodeType":"VariableDeclaration","scope":3385,"src":"2701:22:10","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3379,"name":"bytes","nodeType":"ElementaryTypeName","src":"2701:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3382,"mutability":"mutable","name":"actualGasCost","nameLocation":"2733:13:10","nodeType":"VariableDeclaration","scope":3385,"src":"2725:21:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3381,"name":"uint256","nodeType":"ElementaryTypeName","src":"2725:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2683:64:10"},"returnParameters":{"id":3384,"nodeType":"ParameterList","parameters":[],"src":"2756:0:10"},"scope":3386,"src":"2668:89:10","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3387,"src":"310:2449:10","usedErrors":[]}],"src":"36:2724:10"},"id":10},"contracts/interfaces/IStakeManager.sol":{"ast":{"absolutePath":"contracts/interfaces/IStakeManager.sol","exportedSymbols":{"IStakeManager":[3491]},"id":3492,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":3388,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:11"},{"abstract":false,"baseContracts":[],"canonicalName":"IStakeManager","contractDependencies":[],"contractKind":"interface","documentation":{"id":3389,"nodeType":"StructuredDocumentation","src":"67:211:11","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by the staked entity."},"fullyImplemented":false,"id":3491,"linearizedBaseContracts":[3491],"name":"IStakeManager","nameLocation":"289:13:11","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4","id":3395,"name":"Deposited","nameLocation":"316:9:11","nodeType":"EventDefinition","parameters":{"id":3394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3391,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"351:7:11","nodeType":"VariableDeclaration","scope":3395,"src":"335:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3390,"name":"address","nodeType":"ElementaryTypeName","src":"335:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3393,"indexed":false,"mutability":"mutable","name":"totalDeposit","nameLocation":"376:12:11","nodeType":"VariableDeclaration","scope":3395,"src":"368:20:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3392,"name":"uint256","nodeType":"ElementaryTypeName","src":"368:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"325:69:11"},"src":"310:85:11"},{"anonymous":false,"eventSelector":"d1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb","id":3403,"name":"Withdrawn","nameLocation":"407:9:11","nodeType":"EventDefinition","parameters":{"id":3402,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3397,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"442:7:11","nodeType":"VariableDeclaration","scope":3403,"src":"426:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3396,"name":"address","nodeType":"ElementaryTypeName","src":"426:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3399,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"467:15:11","nodeType":"VariableDeclaration","scope":3403,"src":"459:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3398,"name":"address","nodeType":"ElementaryTypeName","src":"459:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3401,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"500:6:11","nodeType":"VariableDeclaration","scope":3403,"src":"492:14:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3400,"name":"uint256","nodeType":"ElementaryTypeName","src":"492:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"416:96:11"},"src":"401:112:11"},{"anonymous":false,"documentation":{"id":3404,"nodeType":"StructuredDocumentation","src":"519:52:11","text":"Emitted when stake or unstake delay are modified"},"eventSelector":"a5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01","id":3412,"name":"StakeLocked","nameLocation":"582:11:11","nodeType":"EventDefinition","parameters":{"id":3411,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3406,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"619:7:11","nodeType":"VariableDeclaration","scope":3412,"src":"603:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3405,"name":"address","nodeType":"ElementaryTypeName","src":"603:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3408,"indexed":false,"mutability":"mutable","name":"totalStaked","nameLocation":"644:11:11","nodeType":"VariableDeclaration","scope":3412,"src":"636:19:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3407,"name":"uint256","nodeType":"ElementaryTypeName","src":"636:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3410,"indexed":false,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"673:15:11","nodeType":"VariableDeclaration","scope":3412,"src":"665:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3409,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"593:101:11"},"src":"576:119:11"},{"anonymous":false,"documentation":{"id":3413,"nodeType":"StructuredDocumentation","src":"701:52:11","text":"Emitted once a stake is scheduled for withdrawal"},"eventSelector":"fa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a","id":3419,"name":"StakeUnlocked","nameLocation":"764:13:11","nodeType":"EventDefinition","parameters":{"id":3418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3415,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"803:7:11","nodeType":"VariableDeclaration","scope":3419,"src":"787:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3414,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3417,"indexed":false,"mutability":"mutable","name":"withdrawTime","nameLocation":"828:12:11","nodeType":"VariableDeclaration","scope":3419,"src":"820:20:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3416,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"777:69:11"},"src":"758:89:11"},{"anonymous":false,"eventSelector":"b7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3","id":3427,"name":"StakeWithdrawn","nameLocation":"859:14:11","nodeType":"EventDefinition","parameters":{"id":3426,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3421,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"899:7:11","nodeType":"VariableDeclaration","scope":3427,"src":"883:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3420,"name":"address","nodeType":"ElementaryTypeName","src":"883:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3423,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"924:15:11","nodeType":"VariableDeclaration","scope":3427,"src":"916:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3422,"name":"address","nodeType":"ElementaryTypeName","src":"916:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3425,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"957:6:11","nodeType":"VariableDeclaration","scope":3427,"src":"949:14:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3424,"name":"uint256","nodeType":"ElementaryTypeName","src":"949:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"873:96:11"},"src":"853:117:11"},{"canonicalName":"IStakeManager.DepositInfo","id":3438,"members":[{"constant":false,"id":3429,"mutability":"mutable","name":"deposit","nameLocation":"1650:7:11","nodeType":"VariableDeclaration","scope":3438,"src":"1642:15:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":3428,"name":"uint112","nodeType":"ElementaryTypeName","src":"1642:7:11","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":3431,"mutability":"mutable","name":"staked","nameLocation":"1672:6:11","nodeType":"VariableDeclaration","scope":3438,"src":"1667:11:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3430,"name":"bool","nodeType":"ElementaryTypeName","src":"1667:4:11","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":3433,"mutability":"mutable","name":"stake","nameLocation":"1696:5:11","nodeType":"VariableDeclaration","scope":3438,"src":"1688:13:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":3432,"name":"uint112","nodeType":"ElementaryTypeName","src":"1688:7:11","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":3435,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1718:15:11","nodeType":"VariableDeclaration","scope":3438,"src":"1711:22:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":3434,"name":"uint32","nodeType":"ElementaryTypeName","src":"1711:6:11","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":3437,"mutability":"mutable","name":"withdrawTime","nameLocation":"1750:12:11","nodeType":"VariableDeclaration","scope":3438,"src":"1743:19:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":3436,"name":"uint48","nodeType":"ElementaryTypeName","src":"1743:6:11","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"DepositInfo","nameLocation":"1620:11:11","nodeType":"StructDefinition","scope":3491,"src":"1613:156:11","visibility":"public"},{"canonicalName":"IStakeManager.StakeInfo","id":3443,"members":[{"constant":false,"id":3440,"mutability":"mutable","name":"stake","nameLocation":"1871:5:11","nodeType":"VariableDeclaration","scope":3443,"src":"1863:13:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3439,"name":"uint256","nodeType":"ElementaryTypeName","src":"1863:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3442,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1894:15:11","nodeType":"VariableDeclaration","scope":3443,"src":"1886:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3441,"name":"uint256","nodeType":"ElementaryTypeName","src":"1886:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1843:9:11","nodeType":"StructDefinition","scope":3491,"src":"1836:80:11","visibility":"public"},{"documentation":{"id":3444,"nodeType":"StructuredDocumentation","src":"1922:60:11","text":"@return info - full deposit information of given account"},"functionSelector":"5287ce12","id":3452,"implemented":false,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"1996:14:11","nodeType":"FunctionDefinition","parameters":{"id":3447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3446,"mutability":"mutable","name":"account","nameLocation":"2019:7:11","nodeType":"VariableDeclaration","scope":3452,"src":"2011:15:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3445,"name":"address","nodeType":"ElementaryTypeName","src":"2011:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2010:17:11"},"returnParameters":{"id":3451,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3450,"mutability":"mutable","name":"info","nameLocation":"2070:4:11","nodeType":"VariableDeclaration","scope":3452,"src":"2051:23:11","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":3449,"nodeType":"UserDefinedTypeName","pathNode":{"id":3448,"name":"DepositInfo","nameLocations":["2051:11:11"],"nodeType":"IdentifierPath","referencedDeclaration":3438,"src":"2051:11:11"},"referencedDeclaration":3438,"src":"2051:11:11","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$3438_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"2050:25:11"},"scope":3491,"src":"1987:89:11","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3453,"nodeType":"StructuredDocumentation","src":"2082:56:11","text":"@return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":3460,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2152:9:11","nodeType":"FunctionDefinition","parameters":{"id":3456,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3455,"mutability":"mutable","name":"account","nameLocation":"2170:7:11","nodeType":"VariableDeclaration","scope":3460,"src":"2162:15:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3454,"name":"address","nodeType":"ElementaryTypeName","src":"2162:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2161:17:11"},"returnParameters":{"id":3459,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3458,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3460,"src":"2202:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3457,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2201:9:11"},"scope":3491,"src":"2143:68:11","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":3461,"nodeType":"StructuredDocumentation","src":"2217:58:11","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":3466,"implemented":false,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"2289:9:11","nodeType":"FunctionDefinition","parameters":{"id":3464,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3463,"mutability":"mutable","name":"account","nameLocation":"2307:7:11","nodeType":"VariableDeclaration","scope":3466,"src":"2299:15:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3462,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2298:17:11"},"returnParameters":{"id":3465,"nodeType":"ParameterList","parameters":[],"src":"2332:0:11"},"scope":3491,"src":"2280:53:11","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":3467,"nodeType":"StructuredDocumentation","src":"2339:201:11","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":3472,"implemented":false,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2554:8:11","nodeType":"FunctionDefinition","parameters":{"id":3470,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3469,"mutability":"mutable","name":"_unstakeDelaySec","nameLocation":"2570:16:11","nodeType":"VariableDeclaration","scope":3472,"src":"2563:23:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":3468,"name":"uint32","nodeType":"ElementaryTypeName","src":"2563:6:11","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2562:25:11"},"returnParameters":{"id":3471,"nodeType":"ParameterList","parameters":[],"src":"2604:0:11"},"scope":3491,"src":"2545:60:11","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":3473,"nodeType":"StructuredDocumentation","src":"2611:128:11","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":3476,"implemented":false,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2753:11:11","nodeType":"FunctionDefinition","parameters":{"id":3474,"nodeType":"ParameterList","parameters":[],"src":"2764:2:11"},"returnParameters":{"id":3475,"nodeType":"ParameterList","parameters":[],"src":"2775:0:11"},"scope":3491,"src":"2744:32:11","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3477,"nodeType":"StructuredDocumentation","src":"2782:194:11","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":3482,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"2990:13:11","nodeType":"FunctionDefinition","parameters":{"id":3480,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3479,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3020:15:11","nodeType":"VariableDeclaration","scope":3482,"src":"3004:31:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3478,"name":"address","nodeType":"ElementaryTypeName","src":"3004:15:11","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3003:33:11"},"returnParameters":{"id":3481,"nodeType":"ParameterList","parameters":[],"src":"3045:0:11"},"scope":3491,"src":"2981:65:11","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3483,"nodeType":"StructuredDocumentation","src":"3052:165:11","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":3490,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"3231:10:11","nodeType":"FunctionDefinition","parameters":{"id":3488,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3485,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3258:15:11","nodeType":"VariableDeclaration","scope":3490,"src":"3242:31:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":3484,"name":"address","nodeType":"ElementaryTypeName","src":"3242:15:11","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":3487,"mutability":"mutable","name":"withdrawAmount","nameLocation":"3283:14:11","nodeType":"VariableDeclaration","scope":3490,"src":"3275:22:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3486,"name":"uint256","nodeType":"ElementaryTypeName","src":"3275:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3241:57:11"},"returnParameters":{"id":3489,"nodeType":"ParameterList","parameters":[],"src":"3307:0:11"},"scope":3491,"src":"3222:86:11","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3492,"src":"279:3031:11","usedErrors":[]}],"src":"41:3270:11"},"id":11},"contracts/interfaces/UserOperation.sol":{"ast":{"absolutePath":"contracts/interfaces/UserOperation.sol","exportedSymbols":{"UserOperation":[3518],"UserOperationLib":[3688],"calldataKeccak":[2515]},"id":3689,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":3493,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:12"},{"absolutePath":"contracts/core/Helpers.sol","file":"../core/Helpers.sol","id":3495,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3689,"sourceUnit":2516,"src":"104:51:12","symbolAliases":[{"foreign":{"id":3494,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2515,"src":"112:14:12","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"canonicalName":"UserOperation","id":3518,"members":[{"constant":false,"id":3497,"mutability":"mutable","name":"sender","nameLocation":"1249:6:12","nodeType":"VariableDeclaration","scope":3518,"src":"1241:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3496,"name":"address","nodeType":"ElementaryTypeName","src":"1241:7:12","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3499,"mutability":"mutable","name":"nonce","nameLocation":"1273:5:12","nodeType":"VariableDeclaration","scope":3518,"src":"1265:13:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3498,"name":"uint256","nodeType":"ElementaryTypeName","src":"1265:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3501,"mutability":"mutable","name":"initCode","nameLocation":"1294:8:12","nodeType":"VariableDeclaration","scope":3518,"src":"1288:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3500,"name":"bytes","nodeType":"ElementaryTypeName","src":"1288:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3503,"mutability":"mutable","name":"callData","nameLocation":"1318:8:12","nodeType":"VariableDeclaration","scope":3518,"src":"1312:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3502,"name":"bytes","nodeType":"ElementaryTypeName","src":"1312:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3505,"mutability":"mutable","name":"callGasLimit","nameLocation":"1344:12:12","nodeType":"VariableDeclaration","scope":3518,"src":"1336:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3504,"name":"uint256","nodeType":"ElementaryTypeName","src":"1336:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3507,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"1374:20:12","nodeType":"VariableDeclaration","scope":3518,"src":"1366:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3506,"name":"uint256","nodeType":"ElementaryTypeName","src":"1366:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3509,"mutability":"mutable","name":"preVerificationGas","nameLocation":"1412:18:12","nodeType":"VariableDeclaration","scope":3518,"src":"1404:26:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3508,"name":"uint256","nodeType":"ElementaryTypeName","src":"1404:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3511,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"1448:12:12","nodeType":"VariableDeclaration","scope":3518,"src":"1440:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3510,"name":"uint256","nodeType":"ElementaryTypeName","src":"1440:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3513,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"1478:20:12","nodeType":"VariableDeclaration","scope":3518,"src":"1470:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3512,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3515,"mutability":"mutable","name":"paymasterAndData","nameLocation":"1514:16:12","nodeType":"VariableDeclaration","scope":3518,"src":"1508:22:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3514,"name":"bytes","nodeType":"ElementaryTypeName","src":"1508:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3517,"mutability":"mutable","name":"signature","nameLocation":"1546:9:12","nodeType":"VariableDeclaration","scope":3518,"src":"1540:15:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":3516,"name":"bytes","nodeType":"ElementaryTypeName","src":"1540:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOperation","nameLocation":"1216:13:12","nodeType":"StructDefinition","scope":3689,"src":"1209:353:12","visibility":"public"},{"abstract":false,"baseContracts":[],"canonicalName":"UserOperationLib","contractDependencies":[],"contractKind":"library","documentation":{"id":3519,"nodeType":"StructuredDocumentation","src":"1564:77:12","text":" Utility functions helpful when working with UserOperation structs."},"fullyImplemented":true,"id":3688,"linearizedBaseContracts":[3688],"name":"UserOperationLib","nameLocation":"1650:16:12","nodeType":"ContractDefinition","nodes":[{"body":{"id":3539,"nodeType":"Block","src":"1756:199:12","statements":[{"assignments":[3528],"declarations":[{"constant":false,"id":3528,"mutability":"mutable","name":"data","nameLocation":"1774:4:12","nodeType":"VariableDeclaration","scope":3539,"src":"1766:12:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3527,"name":"address","nodeType":"ElementaryTypeName","src":"1766:7:12","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3529,"nodeType":"VariableDeclarationStatement","src":"1766:12:12"},{"AST":{"nodeType":"YulBlock","src":"1880:30:12","statements":[{"nodeType":"YulAssignment","src":"1881:28:12","value":{"arguments":[{"name":"userOp","nodeType":"YulIdentifier","src":"1902:6:12"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1889:12:12"},"nodeType":"YulFunctionCall","src":"1889:20:12"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"1881:4:12"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3528,"isOffset":false,"isSlot":false,"src":"1881:4:12","valueSize":1},{"declaration":3522,"isOffset":false,"isSlot":false,"src":"1902:6:12","valueSize":1}],"id":3530,"nodeType":"InlineAssembly","src":"1871:39:12"},{"expression":{"arguments":[{"arguments":[{"id":3535,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3528,"src":"1942:4:12","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3534,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1934:7:12","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":3533,"name":"uint160","nodeType":"ElementaryTypeName","src":"1934:7:12","typeDescriptions":{}}},"id":3536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1934:13:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":3532,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1926:7:12","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3531,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:12","typeDescriptions":{}}},"id":3537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1926:22:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3526,"id":3538,"nodeType":"Return","src":"1919:29:12"}]},"id":3540,"implemented":true,"kind":"function","modifiers":[],"name":"getSender","nameLocation":"1683:9:12","nodeType":"FunctionDefinition","parameters":{"id":3523,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3522,"mutability":"mutable","name":"userOp","nameLocation":"1716:6:12","nodeType":"VariableDeclaration","scope":3540,"src":"1693:29:12","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3521,"nodeType":"UserDefinedTypeName","pathNode":{"id":3520,"name":"UserOperation","nameLocations":["1693:13:12"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"1693:13:12"},"referencedDeclaration":3518,"src":"1693:13:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1692:31:12"},"returnParameters":{"id":3526,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3525,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3540,"src":"1747:7:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3524,"name":"address","nodeType":"ElementaryTypeName","src":"1747:7:12","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1746:9:12"},"scope":3688,"src":"1674:281:12","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3574,"nodeType":"Block","src":"2176:391:12","statements":[{"id":3573,"nodeType":"UncheckedBlock","src":"2182:379:12","statements":[{"assignments":[3549],"declarations":[{"constant":false,"id":3549,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"2210:12:12","nodeType":"VariableDeclaration","scope":3573,"src":"2202:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3548,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3552,"initialValue":{"expression":{"id":3550,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3543,"src":"2225:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3551,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2232:12:12","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3511,"src":"2225:19:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2202:42:12"},{"assignments":[3554],"declarations":[{"constant":false,"id":3554,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"2262:20:12","nodeType":"VariableDeclaration","scope":3573,"src":"2254:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3553,"name":"uint256","nodeType":"ElementaryTypeName","src":"2254:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3557,"initialValue":{"expression":{"id":3555,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3543,"src":"2285:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2292:20:12","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3513,"src":"2285:27:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2254:58:12"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3558,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3549,"src":"2326:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3559,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3554,"src":"2342:20:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2326:36:12","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3564,"nodeType":"IfStatement","src":"2322:161:12","trueBody":{"id":3563,"nodeType":"Block","src":"2364:119:12","statements":[{"expression":{"id":3561,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3549,"src":"2460:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3547,"id":3562,"nodeType":"Return","src":"2453:19:12"}]}},{"expression":{"arguments":[{"id":3566,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3549,"src":"2503:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3567,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3554,"src":"2517:20:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":3568,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2540:5:12","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":3569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2546:7:12","memberName":"basefee","nodeType":"MemberAccess","src":"2540:13:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2517:36:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3565,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3687,"src":"2499:3:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":3571,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2499:55:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3547,"id":3572,"nodeType":"Return","src":"2492:62:12"}]}]},"id":3575,"implemented":true,"kind":"function","modifiers":[],"name":"gasPrice","nameLocation":"2104:8:12","nodeType":"FunctionDefinition","parameters":{"id":3544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3543,"mutability":"mutable","name":"userOp","nameLocation":"2136:6:12","nodeType":"VariableDeclaration","scope":3575,"src":"2113:29:12","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3542,"nodeType":"UserDefinedTypeName","pathNode":{"id":3541,"name":"UserOperation","nameLocations":["2113:13:12"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"2113:13:12"},"referencedDeclaration":3518,"src":"2113:13:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2112:31:12"},"returnParameters":{"id":3547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3546,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3575,"src":"2167:7:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3545,"name":"uint256","nodeType":"ElementaryTypeName","src":"2167:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2166:9:12"},"scope":3688,"src":"2095:472:12","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3654,"nodeType":"Block","src":"2659:856:12","statements":[{"assignments":[3584],"declarations":[{"constant":false,"id":3584,"mutability":"mutable","name":"sender","nameLocation":"2677:6:12","nodeType":"VariableDeclaration","scope":3654,"src":"2669:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3583,"name":"address","nodeType":"ElementaryTypeName","src":"2669:7:12","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3588,"initialValue":{"arguments":[{"id":3586,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2696:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":3585,"name":"getSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3540,"src":"2686:9:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$_t_address_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":3587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2686:17:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2669:34:12"},{"assignments":[3590],"declarations":[{"constant":false,"id":3590,"mutability":"mutable","name":"nonce","nameLocation":"2721:5:12","nodeType":"VariableDeclaration","scope":3654,"src":"2713:13:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3589,"name":"uint256","nodeType":"ElementaryTypeName","src":"2713:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3593,"initialValue":{"expression":{"id":3591,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2729:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2736:5:12","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":3499,"src":"2729:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2713:28:12"},{"assignments":[3595],"declarations":[{"constant":false,"id":3595,"mutability":"mutable","name":"hashInitCode","nameLocation":"2759:12:12","nodeType":"VariableDeclaration","scope":3654,"src":"2751:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3594,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2751:7:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3600,"initialValue":{"arguments":[{"expression":{"id":3597,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2789:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2796:8:12","memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":3501,"src":"2789:15:12","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3596,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2515,"src":"2774:14:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2774:31:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2751:54:12"},{"assignments":[3602],"declarations":[{"constant":false,"id":3602,"mutability":"mutable","name":"hashCallData","nameLocation":"2823:12:12","nodeType":"VariableDeclaration","scope":3654,"src":"2815:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3601,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2815:7:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3607,"initialValue":{"arguments":[{"expression":{"id":3604,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2853:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2860:8:12","memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":3503,"src":"2853:15:12","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3603,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2515,"src":"2838:14:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2838:31:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2815:54:12"},{"assignments":[3609],"declarations":[{"constant":false,"id":3609,"mutability":"mutable","name":"callGasLimit","nameLocation":"2887:12:12","nodeType":"VariableDeclaration","scope":3654,"src":"2879:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3608,"name":"uint256","nodeType":"ElementaryTypeName","src":"2879:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3612,"initialValue":{"expression":{"id":3610,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2902:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3611,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2909:12:12","memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":3505,"src":"2902:19:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2879:42:12"},{"assignments":[3614],"declarations":[{"constant":false,"id":3614,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"2939:20:12","nodeType":"VariableDeclaration","scope":3654,"src":"2931:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3613,"name":"uint256","nodeType":"ElementaryTypeName","src":"2931:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3617,"initialValue":{"expression":{"id":3615,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"2962:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2969:20:12","memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":3507,"src":"2962:27:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2931:58:12"},{"assignments":[3619],"declarations":[{"constant":false,"id":3619,"mutability":"mutable","name":"preVerificationGas","nameLocation":"3007:18:12","nodeType":"VariableDeclaration","scope":3654,"src":"2999:26:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3618,"name":"uint256","nodeType":"ElementaryTypeName","src":"2999:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3622,"initialValue":{"expression":{"id":3620,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"3028:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3621,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3035:18:12","memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":3509,"src":"3028:25:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2999:54:12"},{"assignments":[3624],"declarations":[{"constant":false,"id":3624,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"3071:12:12","nodeType":"VariableDeclaration","scope":3654,"src":"3063:20:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3623,"name":"uint256","nodeType":"ElementaryTypeName","src":"3063:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3627,"initialValue":{"expression":{"id":3625,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"3086:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3093:12:12","memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3511,"src":"3086:19:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3063:42:12"},{"assignments":[3629],"declarations":[{"constant":false,"id":3629,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"3123:20:12","nodeType":"VariableDeclaration","scope":3654,"src":"3115:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3628,"name":"uint256","nodeType":"ElementaryTypeName","src":"3115:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3632,"initialValue":{"expression":{"id":3630,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"3146:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3153:20:12","memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":3513,"src":"3146:27:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3115:58:12"},{"assignments":[3634],"declarations":[{"constant":false,"id":3634,"mutability":"mutable","name":"hashPaymasterAndData","nameLocation":"3191:20:12","nodeType":"VariableDeclaration","scope":3654,"src":"3183:28:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3633,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3183:7:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3639,"initialValue":{"arguments":[{"expression":{"id":3636,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3578,"src":"3229:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":3637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3236:16:12","memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":3515,"src":"3229:23:12","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":3635,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2515,"src":"3214:14:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":3638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3214:39:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3183:70:12"},{"expression":{"arguments":[{"id":3642,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3584,"src":"3295:6:12","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3643,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3590,"src":"3303:5:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3644,"name":"hashInitCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3595,"src":"3322:12:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3645,"name":"hashCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3602,"src":"3336:12:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3646,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3609,"src":"3362:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3647,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3614,"src":"3376:20:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3648,"name":"preVerificationGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3619,"src":"3398:18:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3649,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3624,"src":"3430:12:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3650,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3629,"src":"3444:20:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":3651,"name":"hashPaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3634,"src":"3478:20:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3640,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3271:3:12","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":3641,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3275:6:12","memberName":"encode","nodeType":"MemberAccess","src":"3271:10:12","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":3652,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3271:237:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":3582,"id":3653,"nodeType":"Return","src":"3264:244:12"}]},"id":3655,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"2582:4:12","nodeType":"FunctionDefinition","parameters":{"id":3579,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3578,"mutability":"mutable","name":"userOp","nameLocation":"2610:6:12","nodeType":"VariableDeclaration","scope":3655,"src":"2587:29:12","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3577,"nodeType":"UserDefinedTypeName","pathNode":{"id":3576,"name":"UserOperation","nameLocations":["2587:13:12"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"2587:13:12"},"referencedDeclaration":3518,"src":"2587:13:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2586:31:12"},"returnParameters":{"id":3582,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3581,"mutability":"mutable","name":"ret","nameLocation":"2654:3:12","nodeType":"VariableDeclaration","scope":3655,"src":"2641:16:12","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3580,"name":"bytes","nodeType":"ElementaryTypeName","src":"2641:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2640:18:12"},"scope":3688,"src":"2573:942:12","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3669,"nodeType":"Block","src":"3598:47:12","statements":[{"expression":{"arguments":[{"arguments":[{"id":3665,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3658,"src":"3630:6:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":3664,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3655,"src":"3625:4:12","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$3518_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":3666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3625:12:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":3663,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3615:9:12","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":3667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3615:23:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3662,"id":3668,"nodeType":"Return","src":"3608:30:12"}]},"id":3670,"implemented":true,"kind":"function","modifiers":[],"name":"hash","nameLocation":"3530:4:12","nodeType":"FunctionDefinition","parameters":{"id":3659,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3658,"mutability":"mutable","name":"userOp","nameLocation":"3558:6:12","nodeType":"VariableDeclaration","scope":3670,"src":"3535:29:12","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":3657,"nodeType":"UserDefinedTypeName","pathNode":{"id":3656,"name":"UserOperation","nameLocations":["3535:13:12"],"nodeType":"IdentifierPath","referencedDeclaration":3518,"src":"3535:13:12"},"referencedDeclaration":3518,"src":"3535:13:12","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$3518_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3534:31:12"},"returnParameters":{"id":3662,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3661,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3670,"src":"3589:7:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3660,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3589:7:12","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3588:9:12"},"scope":3688,"src":"3521:124:12","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3686,"nodeType":"Block","src":"3718:37:12","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3679,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3672,"src":"3735:1:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3680,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3674,"src":"3739:1:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3735:5:12","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":3683,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3674,"src":"3747:1:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3735:13:12","trueExpression":{"id":3682,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3672,"src":"3743:1:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3678,"id":3685,"nodeType":"Return","src":"3728:20:12"}]},"id":3687,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"3660:3:12","nodeType":"FunctionDefinition","parameters":{"id":3675,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3672,"mutability":"mutable","name":"a","nameLocation":"3672:1:12","nodeType":"VariableDeclaration","scope":3687,"src":"3664:9:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3671,"name":"uint256","nodeType":"ElementaryTypeName","src":"3664:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3674,"mutability":"mutable","name":"b","nameLocation":"3683:1:12","nodeType":"VariableDeclaration","scope":3687,"src":"3675:9:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3673,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3663:22:12"},"returnParameters":{"id":3678,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3677,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3687,"src":"3709:7:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3676,"name":"uint256","nodeType":"ElementaryTypeName","src":"3709:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3708:9:12"},"scope":3688,"src":"3651:104:12","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":3689,"src":"1642:2115:12","usedErrors":[]}],"src":"36:3722:12"},"id":12},"contracts/utils/Exec.sol":{"ast":{"absolutePath":"contracts/utils/Exec.sol","exportedSymbols":{"Exec":[3779]},"id":3780,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":3690,"literals":["solidity",">=","0.7",".5","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:13"},{"abstract":false,"baseContracts":[],"canonicalName":"Exec","contractDependencies":[],"contractKind":"library","documentation":{"id":3691,"nodeType":"StructuredDocumentation","src":"114:95:13","text":" Utility functions helpful when making different kinds of contract calls in Solidity."},"fullyImplemented":true,"id":3779,"linearizedBaseContracts":[3779],"name":"Exec","nameLocation":"218:4:13","nodeType":"ContractDefinition","nodes":[{"body":{"id":3705,"nodeType":"Block","src":"375:118:13","statements":[{"AST":{"nodeType":"YulBlock","src":"394:93:13","statements":[{"nodeType":"YulAssignment","src":"408:69:13","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"424:5:13"},{"name":"to","nodeType":"YulIdentifier","src":"431:2:13"},{"name":"value","nodeType":"YulIdentifier","src":"435:5:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"446:4:13"},{"kind":"number","nodeType":"YulLiteral","src":"452:4:13","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"442:3:13"},"nodeType":"YulFunctionCall","src":"442:15:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"465:4:13"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"459:5:13"},"nodeType":"YulFunctionCall","src":"459:11:13"},{"kind":"number","nodeType":"YulLiteral","src":"472:1:13","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"475:1:13","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"419:4:13"},"nodeType":"YulFunctionCall","src":"419:58:13"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"408:7:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3697,"isOffset":false,"isSlot":false,"src":"446:4:13","valueSize":1},{"declaration":3697,"isOffset":false,"isSlot":false,"src":"465:4:13","valueSize":1},{"declaration":3702,"isOffset":false,"isSlot":false,"src":"408:7:13","valueSize":1},{"declaration":3693,"isOffset":false,"isSlot":false,"src":"431:2:13","valueSize":1},{"declaration":3699,"isOffset":false,"isSlot":false,"src":"424:5:13","valueSize":1},{"declaration":3695,"isOffset":false,"isSlot":false,"src":"435:5:13","valueSize":1}],"id":3704,"nodeType":"InlineAssembly","src":"385:102:13"}]},"id":3706,"implemented":true,"kind":"function","modifiers":[],"name":"call","nameLocation":"239:4:13","nodeType":"FunctionDefinition","parameters":{"id":3700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3693,"mutability":"mutable","name":"to","nameLocation":"261:2:13","nodeType":"VariableDeclaration","scope":3706,"src":"253:10:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3692,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3695,"mutability":"mutable","name":"value","nameLocation":"281:5:13","nodeType":"VariableDeclaration","scope":3706,"src":"273:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3694,"name":"uint256","nodeType":"ElementaryTypeName","src":"273:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3697,"mutability":"mutable","name":"data","nameLocation":"309:4:13","nodeType":"VariableDeclaration","scope":3706,"src":"296:17:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3696,"name":"bytes","nodeType":"ElementaryTypeName","src":"296:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3699,"mutability":"mutable","name":"txGas","nameLocation":"331:5:13","nodeType":"VariableDeclaration","scope":3706,"src":"323:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3698,"name":"uint256","nodeType":"ElementaryTypeName","src":"323:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"243:99:13"},"returnParameters":{"id":3703,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3702,"mutability":"mutable","name":"success","nameLocation":"366:7:13","nodeType":"VariableDeclaration","scope":3706,"src":"361:12:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3701,"name":"bool","nodeType":"ElementaryTypeName","src":"361:4:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"360:14:13"},"scope":3779,"src":"230:263:13","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3718,"nodeType":"Block","src":"632:117:13","statements":[{"AST":{"nodeType":"YulBlock","src":"651:92:13","statements":[{"nodeType":"YulAssignment","src":"665:68:13","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"687:5:13"},{"name":"to","nodeType":"YulIdentifier","src":"694:2:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"702:4:13"},{"kind":"number","nodeType":"YulLiteral","src":"708:4:13","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"698:3:13"},"nodeType":"YulFunctionCall","src":"698:15:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"721:4:13"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"715:5:13"},"nodeType":"YulFunctionCall","src":"715:11:13"},{"kind":"number","nodeType":"YulLiteral","src":"728:1:13","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"731:1:13","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"676:10:13"},"nodeType":"YulFunctionCall","src":"676:57:13"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"665:7:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3710,"isOffset":false,"isSlot":false,"src":"702:4:13","valueSize":1},{"declaration":3710,"isOffset":false,"isSlot":false,"src":"721:4:13","valueSize":1},{"declaration":3715,"isOffset":false,"isSlot":false,"src":"665:7:13","valueSize":1},{"declaration":3708,"isOffset":false,"isSlot":false,"src":"694:2:13","valueSize":1},{"declaration":3712,"isOffset":false,"isSlot":false,"src":"687:5:13","valueSize":1}],"id":3717,"nodeType":"InlineAssembly","src":"642:101:13"}]},"id":3719,"implemented":true,"kind":"function","modifiers":[],"name":"staticcall","nameLocation":"508:10:13","nodeType":"FunctionDefinition","parameters":{"id":3713,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3708,"mutability":"mutable","name":"to","nameLocation":"536:2:13","nodeType":"VariableDeclaration","scope":3719,"src":"528:10:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3707,"name":"address","nodeType":"ElementaryTypeName","src":"528:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3710,"mutability":"mutable","name":"data","nameLocation":"561:4:13","nodeType":"VariableDeclaration","scope":3719,"src":"548:17:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3709,"name":"bytes","nodeType":"ElementaryTypeName","src":"548:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3712,"mutability":"mutable","name":"txGas","nameLocation":"583:5:13","nodeType":"VariableDeclaration","scope":3719,"src":"575:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3711,"name":"uint256","nodeType":"ElementaryTypeName","src":"575:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"518:76:13"},"returnParameters":{"id":3716,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3715,"mutability":"mutable","name":"success","nameLocation":"623:7:13","nodeType":"VariableDeclaration","scope":3719,"src":"618:12:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3714,"name":"bool","nodeType":"ElementaryTypeName","src":"618:4:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"617:14:13"},"scope":3779,"src":"499:250:13","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3731,"nodeType":"Block","src":"885:119:13","statements":[{"AST":{"nodeType":"YulBlock","src":"904:94:13","statements":[{"nodeType":"YulAssignment","src":"918:70:13","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"942:5:13"},{"name":"to","nodeType":"YulIdentifier","src":"949:2:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"957:4:13"},{"kind":"number","nodeType":"YulLiteral","src":"963:4:13","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"953:3:13"},"nodeType":"YulFunctionCall","src":"953:15:13"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"976:4:13"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"970:5:13"},"nodeType":"YulFunctionCall","src":"970:11:13"},{"kind":"number","nodeType":"YulLiteral","src":"983:1:13","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"986:1:13","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"929:12:13"},"nodeType":"YulFunctionCall","src":"929:59:13"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"918:7:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3723,"isOffset":false,"isSlot":false,"src":"957:4:13","valueSize":1},{"declaration":3723,"isOffset":false,"isSlot":false,"src":"976:4:13","valueSize":1},{"declaration":3728,"isOffset":false,"isSlot":false,"src":"918:7:13","valueSize":1},{"declaration":3721,"isOffset":false,"isSlot":false,"src":"949:2:13","valueSize":1},{"declaration":3725,"isOffset":false,"isSlot":false,"src":"942:5:13","valueSize":1}],"id":3730,"nodeType":"InlineAssembly","src":"895:103:13"}]},"id":3732,"implemented":true,"kind":"function","modifiers":[],"name":"delegateCall","nameLocation":"764:12:13","nodeType":"FunctionDefinition","parameters":{"id":3726,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3721,"mutability":"mutable","name":"to","nameLocation":"794:2:13","nodeType":"VariableDeclaration","scope":3732,"src":"786:10:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3720,"name":"address","nodeType":"ElementaryTypeName","src":"786:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3723,"mutability":"mutable","name":"data","nameLocation":"819:4:13","nodeType":"VariableDeclaration","scope":3732,"src":"806:17:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3722,"name":"bytes","nodeType":"ElementaryTypeName","src":"806:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3725,"mutability":"mutable","name":"txGas","nameLocation":"841:5:13","nodeType":"VariableDeclaration","scope":3732,"src":"833:13:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3724,"name":"uint256","nodeType":"ElementaryTypeName","src":"833:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"776:76:13"},"returnParameters":{"id":3729,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3728,"mutability":"mutable","name":"success","nameLocation":"876:7:13","nodeType":"VariableDeclaration","scope":3732,"src":"871:12:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3727,"name":"bool","nodeType":"ElementaryTypeName","src":"871:4:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"870:14:13"},"scope":3779,"src":"755:249:13","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3740,"nodeType":"Block","src":"1153:349:13","statements":[{"AST":{"nodeType":"YulBlock","src":"1172:324:13","statements":[{"nodeType":"YulVariableDeclaration","src":"1186:27:13","value":{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1197:14:13"},"nodeType":"YulFunctionCall","src":"1197:16:13"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"1190:3:13","type":""}]},{"body":{"nodeType":"YulBlock","src":"1245:45:13","statements":[{"nodeType":"YulAssignment","src":"1263:13:13","value":{"name":"maxLen","nodeType":"YulIdentifier","src":"1270:6:13"},"variableNames":[{"name":"len","nodeType":"YulIdentifier","src":"1263:3:13"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1232:3:13"},{"name":"maxLen","nodeType":"YulIdentifier","src":"1237:6:13"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1229:2:13"},"nodeType":"YulFunctionCall","src":"1229:15:13"},"nodeType":"YulIf","src":"1226:64:13"},{"nodeType":"YulVariableDeclaration","src":"1303:22:13","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1320:4:13","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1314:5:13"},"nodeType":"YulFunctionCall","src":"1314:11:13"},"variables":[{"name":"ptr","nodeType":"YulTypedName","src":"1307:3:13","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1345:4:13","type":"","value":"0x40"},{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1355:3:13"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1364:3:13"},{"kind":"number","nodeType":"YulLiteral","src":"1369:4:13","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1360:3:13"},"nodeType":"YulFunctionCall","src":"1360:14:13"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1351:3:13"},"nodeType":"YulFunctionCall","src":"1351:24:13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1338:6:13"},"nodeType":"YulFunctionCall","src":"1338:38:13"},"nodeType":"YulExpressionStatement","src":"1338:38:13"},{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1396:3:13"},{"name":"len","nodeType":"YulIdentifier","src":"1401:3:13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1389:6:13"},"nodeType":"YulFunctionCall","src":"1389:16:13"},"nodeType":"YulExpressionStatement","src":"1389:16:13"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1437:3:13"},{"kind":"number","nodeType":"YulLiteral","src":"1442:4:13","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1433:3:13"},"nodeType":"YulFunctionCall","src":"1433:14:13"},{"kind":"number","nodeType":"YulLiteral","src":"1449:1:13","type":"","value":"0"},{"name":"len","nodeType":"YulIdentifier","src":"1452:3:13"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"1418:14:13"},"nodeType":"YulFunctionCall","src":"1418:38:13"},"nodeType":"YulExpressionStatement","src":"1418:38:13"},{"nodeType":"YulAssignment","src":"1469:17:13","value":{"name":"ptr","nodeType":"YulIdentifier","src":"1483:3:13"},"variableNames":[{"name":"returnData","nodeType":"YulIdentifier","src":"1469:10:13"}]}]},"evmVersion":"london","externalReferences":[{"declaration":3734,"isOffset":false,"isSlot":false,"src":"1237:6:13","valueSize":1},{"declaration":3734,"isOffset":false,"isSlot":false,"src":"1270:6:13","valueSize":1},{"declaration":3737,"isOffset":false,"isSlot":false,"src":"1469:10:13","valueSize":1}],"id":3739,"nodeType":"InlineAssembly","src":"1163:333:13"}]},"id":3741,"implemented":true,"kind":"function","modifiers":[],"name":"getReturnData","nameLocation":"1075:13:13","nodeType":"FunctionDefinition","parameters":{"id":3735,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3734,"mutability":"mutable","name":"maxLen","nameLocation":"1097:6:13","nodeType":"VariableDeclaration","scope":3741,"src":"1089:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3733,"name":"uint256","nodeType":"ElementaryTypeName","src":"1089:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1088:16:13"},"returnParameters":{"id":3738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3737,"mutability":"mutable","name":"returnData","nameLocation":"1141:10:13","nodeType":"VariableDeclaration","scope":3741,"src":"1128:23:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3736,"name":"bytes","nodeType":"ElementaryTypeName","src":"1128:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1127:25:13"},"scope":3779,"src":"1066:436:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3747,"nodeType":"Block","src":"1645:95:13","statements":[{"AST":{"nodeType":"YulBlock","src":"1664:70:13","statements":[{"expression":{"arguments":[{"arguments":[{"name":"returnData","nodeType":"YulIdentifier","src":"1689:10:13"},{"kind":"number","nodeType":"YulLiteral","src":"1701:2:13","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1685:3:13"},"nodeType":"YulFunctionCall","src":"1685:19:13"},{"arguments":[{"name":"returnData","nodeType":"YulIdentifier","src":"1712:10:13"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1706:5:13"},"nodeType":"YulFunctionCall","src":"1706:17:13"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1678:6:13"},"nodeType":"YulFunctionCall","src":"1678:46:13"},"nodeType":"YulExpressionStatement","src":"1678:46:13"}]},"evmVersion":"london","externalReferences":[{"declaration":3743,"isOffset":false,"isSlot":false,"src":"1689:10:13","valueSize":1},{"declaration":3743,"isOffset":false,"isSlot":false,"src":"1712:10:13","valueSize":1}],"id":3746,"nodeType":"InlineAssembly","src":"1655:79:13"}]},"id":3748,"implemented":true,"kind":"function","modifiers":[],"name":"revertWithData","nameLocation":"1591:14:13","nodeType":"FunctionDefinition","parameters":{"id":3744,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3743,"mutability":"mutable","name":"returnData","nameLocation":"1619:10:13","nodeType":"VariableDeclaration","scope":3748,"src":"1606:23:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3742,"name":"bytes","nodeType":"ElementaryTypeName","src":"1606:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1605:25:13"},"returnParameters":{"id":3745,"nodeType":"ParameterList","parameters":[],"src":"1645:0:13"},"scope":3779,"src":"1582:158:13","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3777,"nodeType":"Block","src":"1825:142:13","statements":[{"assignments":[3758],"declarations":[{"constant":false,"id":3758,"mutability":"mutable","name":"success","nameLocation":"1840:7:13","nodeType":"VariableDeclaration","scope":3777,"src":"1835:12:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3757,"name":"bool","nodeType":"ElementaryTypeName","src":"1835:4:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":3766,"initialValue":{"arguments":[{"id":3760,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3750,"src":"1855:2:13","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":3761,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1858:1:13","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":3762,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3752,"src":"1860:4:13","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[],"expression":{"argumentTypes":[],"id":3763,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1865:7:13","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":3764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1865:9:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3759,"name":"call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3706,"src":"1850:4:13","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,uint256) returns (bool)"}},"id":3765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1850:25:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"1835:40:13"},{"condition":{"id":3768,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1889:8:13","subExpression":{"id":3767,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3758,"src":"1890:7:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3776,"nodeType":"IfStatement","src":"1885:76:13","trueBody":{"id":3775,"nodeType":"Block","src":"1899:62:13","statements":[{"expression":{"arguments":[{"arguments":[{"id":3771,"name":"maxLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3754,"src":"1942:6:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3770,"name":"getReturnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3741,"src":"1928:13:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":3772,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1928:21:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":3769,"name":"revertWithData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3748,"src":"1913:14:13","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":3773,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1913:37:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3774,"nodeType":"ExpressionStatement","src":"1913:37:13"}]}}]},"id":3778,"implemented":true,"kind":"function","modifiers":[],"name":"callAndRevert","nameLocation":"1755:13:13","nodeType":"FunctionDefinition","parameters":{"id":3755,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3750,"mutability":"mutable","name":"to","nameLocation":"1777:2:13","nodeType":"VariableDeclaration","scope":3778,"src":"1769:10:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3749,"name":"address","nodeType":"ElementaryTypeName","src":"1769:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3752,"mutability":"mutable","name":"data","nameLocation":"1794:4:13","nodeType":"VariableDeclaration","scope":3778,"src":"1781:17:13","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3751,"name":"bytes","nodeType":"ElementaryTypeName","src":"1781:5:13","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3754,"mutability":"mutable","name":"maxLen","nameLocation":"1808:6:13","nodeType":"VariableDeclaration","scope":3778,"src":"1800:14:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3753,"name":"uint256","nodeType":"ElementaryTypeName","src":"1800:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1768:47:13"},"returnParameters":{"id":3756,"nodeType":"ParameterList","parameters":[],"src":"1825:0:13"},"scope":3779,"src":"1746:221:13","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":3780,"src":"210:1759:13","usedErrors":[]}],"src":"42:1928:13"},"id":13}},"contracts":{"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"ReentrancyGuard":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]}},\"version\":1}"}},"contracts/core/EntryPoint.sol":{"EntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"SIG_VALIDATION_FAILED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"}],"name":"_validateSenderAndPaymaster","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"callData","type":"bytes"},{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"address","name":"paymaster","type":"address"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"}],"internalType":"struct EntryPoint.MemoryUserOp","name":"mUserOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"uint256","name":"contextOffset","type":"uint256"},{"internalType":"uint256","name":"preOpGas","type":"uint256"}],"internalType":"struct EntryPoint.UserOpInfo","name":"opInfo","type":"tuple"},{"internalType":"bytes","name":"context","type":"bytes"}],"name":"innerHandleOp","outputs":[{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint192","name":"","type":"uint192"}],"name":"nonceSequenceNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a080604052346200008957600160025561022c8181016001600160401b03811183821017620000735782916200503e833903906000f080156200006757608052604051614faf90816200008f823960805181818161111d015281816135fb01526138910152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b61002161498f565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c6117e6565b61000e565b5061010c61160f565b5061010c6114d2565b5061010c61137e565b5061010c611238565b5061010c611217565b5061010c6111f6565b5061010c6110a0565b5061010c610f39565b5061010c610f1c565b5061010c610ec2565b5061010c610d9d565b5061010c610a75565b5061010c6109db565b5061010c61088e565b5061010c6107b4565b5061010c61061d565b5061010c610404565b5061010c61034d565b5060206003193601126103215760043563ffffffff81168082036103215761031c7fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0191610246610216336001600160a01b03166000526000602052604060002090565b91610222811515614ac1565b61023f610236600185015463ffffffff1690565b63ffffffff1690565b1115614b0c565b54926102fe6dffffffffffffffffffffffffffff946102c961026d34888460781c16611d01565b96610279881515614b57565b61028581891115614ba2565b6102a981610291610540565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526102f9336001600160a01b03166000526000602052604060002090565b614bed565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361032157565b50346103215760206003193601126103215760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610321576103be9033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6103c88154611f8b565b9055005b6001600160a01b0381160361032157565b602435906103ea826103cc565b565b60c435906103ea826103cc565b35906103ea826103cc565b503461032157604060031936011261032157602061046e600435610427816103cc565b6001600160a01b03610437610326565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176104c357604052565b6104cb610477565b604052565b610100810190811067ffffffffffffffff8211176104c357604052565b67ffffffffffffffff81116104c357604052565b6060810190811067ffffffffffffffff8211176104c357604052565b90601f601f19910116810190811067ffffffffffffffff8211176104c357604052565b604051906103ea826104a7565b6040519060c0820182811067ffffffffffffffff8211176104c357604052565b604051906040820182811067ffffffffffffffff8211176104c357604052565b601f19601f60209267ffffffffffffffff81116105ab575b01160190565b6105b3610477565b6105a5565b9291926105c48261058d565b916105d2604051938461051d565b829481845281830111610321578281602093846000960137010152565b9181601f840112156103215782359167ffffffffffffffff8311610321576020838186019501011161032157565b5034610321576101c06003193601126103215767ffffffffffffffff6004358181116103215736602382011215610321576106629036906024816004013591016105b8565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610321576101006040519161069f836104a7565b12610321576040516106b0816104d0565b6106b86103dd565b815260443560208201526064356040820152608435606082015260a43560808201526106e26103ec565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a435918211610321576107569261073e6107469336906004016105ef565b92909161236a565b6040519081529081906020820190565b0390f35b9060406003198301126103215760043567ffffffffffffffff9283821161032157806023830112156103215781600401359384116103215760248460051b830101116103215760240191906024356107b1816103cc565b90565b5034610321576107c33661075a565b6107ce929192611a0a565b6107d78361191b565b60005b84811061085757506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b8583106108275761081d8585611a8d565b6100216001600255565b90919360019061084d61083b8789876119bc565b610845888661199a565b519088611e52565b019401919061080c565b8061088561087e61086c60019486989661199a565b51610878848a886119bc565b84612d53565b9083612939565b019290926107da565b5034610321576040600319360112610321576004356108ac816103cc565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff815416928383116109975784836001600160a01b03829593610947849661090e6108fb87986109949c611cec565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b604080516001600160a01b03831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af161098e611a5d565b50614ee2565b80f35b606460405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103215760406003193601126103215760206004356109fb816103cc565b6001600160a01b03610a0b610326565b911660005260018252610a468160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461032157610a843661075a565b610a8c611a0a565b6000805b838210610c5957610aa1915061191b565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610bcc57505060008093815b818110610b105761081d868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611a8d565b610b67610b1e82848a611fc5565b610b3c610b30610b3060208401612067565b6001600160a01b031690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612013565b906000915b808310610b8457505050610b7f90611f8b565b610ad9565b90919497610bbf610bb9610bc592610bb38c8b610bac82610ba68e8b8d6119bc565b9261199a565b5191611e52565b90611d01565b99611f8b565b95611f8b565b9190610b6c565b610bd7818688611fc5565b6020610bef610be68380612013565b92909301612067565b916001600160a01b0360009316905b828410610c175750505050610c1290611f8b565b610aca565b90919294610bbf81610c4c85610c45610c33610c51968d61199a565b51610c3f8c8b8a6119bc565b85612d53565b908b612ae0565b611f8b565b929190610bfe565b610c64828587611fc5565b90610c6f8280612013565b92610c7f610b3060208301612067565b916001600160a01b038316610c976001821415612071565b610cb8575b505050610cb291610cac91611d01565b91611f8b565b90610a90565b909592610cd16040999693999895989788810190611b3d565b92908a3b156103215789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610d18946121e4565b03815a93600094fa9081610d84575b50610d6e5786517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b038a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610cac610cb2610c9c565b80610d91610d97926104ed565b80610f11565b38610d27565b5034610321576020600319360112610321576107566001600160a01b03600435610dc6816103cc565b608060409283928351610dd8816104a7565b600093818580935282602082015282878201528260608201520152168152806020522090610e6765ffffffffffff6001835194610e14866104a7565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b5034610321576020600319360112610321576001600160a01b03600435610ee8816103cc565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261032157565b503461032157600060031936011261032157602060405160018152f35b503461032157606060031936011261032157600467ffffffffffffffff813581811161032157610f6c90369084016105ef565b905060243591610f7b836103cc565b60443590811161032157610f9290369085016105ef565b929091159081611096575b50611049576014821015610fd3575b610d6a8360405191829162461bcd60e51b8352820160409060208152600060208201520190565b610fe3610fef92610fe9926125e2565b906125f0565b60601c90565b3b15610ffc573880610fac565b610d6a9060405191829162461bcd60e51b8352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610d6a8360405191829162461bcd60e51b8352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b1538610f9d565b50346103215760206003193601126103215760043567ffffffffffffffff8111610321576110d460249136906004016105ef565b9061110a6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612779565b036020826001600160a01b0392816000857f0000000000000000000000000000000000000000000000000000000000000000165af19182156111af575b60009261117f575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b6111a191925060203d81116111a8575b611199818361051d565b810190612764565b903861114f565b503d61118f565b6111b7611caf565b611147565b90816101609103126103215790565b6020600319820112610321576004359067ffffffffffffffff8211610321576107b1916004016111bc565b503461032157602061120f61120a366111cb565b61249e565b604051908152f35b50602060031936011261032157610021600435611233816103cc565b614a62565b50346103215760008060031936011261137b573381528060205260408120600181019063ffffffff825416908115611337576112d46112996112fc9361128b611286855460ff9060701c1690565b614d51565b65ffffffffffff4216614d9c565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103215760206003193601126103215760043561139c816103cc565b6109946001600160a01b036113c4336001600160a01b03166000526000602052604060002090565b9261147c6113e76108fb86546dffffffffffffffffffffffffffff9060781c1690565b946113f3861515614db6565b6114546001820161142c65ffffffffffff611418835465ffffffffffff9060201c1690565b16611424811515614e01565b421015614e4c565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b604080516001600160a01b03831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af16114cc611a5d565b50614e97565b50346103215760606003193601126103215767ffffffffffffffff600435818111610321576115059036906004016111bc565b60243591611512836103cc565b6044359081116103215761152d610d6a9136906004016105ef565b611535611898565b61153e8561284d565b61155161154b8287612ba4565b9061483f565b9461156182600092438452611d0e565b9643825281936060956001600160a01b0383166115db575b5050505060800151936115a8604061159a602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016122b4565b839550839496506115f560409492939451809481936122a6565b03925af1906080611604611a5d565b929190388080611579565b50346103215761161e366111cb565b611626611898565b61162f8261284d565b6116398183612ba4565b825160a00151919391611659906001600160a01b0316614947565b614947565b9061167061165485516001600160a01b0390511690565b946116796125aa565b506116a861168c60409586810190611b3d565b906000601483106117de5750610fe361165492610fe9926125e2565b916116b29161483f565b80516001600160a01b0316906001600160a01b038216600181149160808801519787810151918860208201516116ed9065ffffffffffff1690565b91015165ffffffffffff1691606001519261170661054d565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a0880152151590816117d5575b506117775750610d6a92519485947fe0cff05f0000000000000000000000000000000000000000000000000000000086526004860161270a565b9190610d6a9361178684614947565b6117a061179161056d565b6001600160a01b039096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612685565b9050153861173d565b915050614947565b5034610321576020600319360112610321576001600160a01b0360043561180c816103cc565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff811161188b575b60051b0190565b611893610477565b611884565b604051906118a5826104a7565b604051608083610100830167ffffffffffffffff81118482101761190e575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611916610477565b6118c4565b9061192582611871565b611932604051918261051d565b828152601f196119428294611871565b019060005b82811061195357505050565b60209061195e611898565b82828501015201611947565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209181518110156119af575b60051b010190565b6119b761196a565b6119a7565b91908110156119fd575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610321570190565b611a0561196a565b6119c6565b6002805414611a195760028055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611a88573d90611a6e8261058d565b91611a7c604051938461051d565b82523d6000602084013e565b606090565b6001600160a01b03168015611af957600080809381935af1611aad611a5d565b5015611ab557565b606460405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b90816020910312610321575190565b601f8260209493601f19938186528686013760008582860101520116010190565b60005b838110611bd15750506000910152565b8181015183820152602001611bc1565b90601f19601f602093611bff81518092818752878088019101611bbe565b0116010190565b90611c206080916107b196946101c0808652850191611b9d565b9360e081516001600160a01b0380825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a0818403910152611be1565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611cf957565b6103ea611cbc565b91908201809211611cf957565b905a91816020611d276060830151936060810190611b3d565b90611d608560405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611e22575b50611e1b575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611dc757611dc1611db66107b1945a90611cec565b608084015190611d01565b916140a7565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b611e4491925060203d8111611e4b575b611e3c818361051d565b810190611b8e565b9038611d70565b503d611e32565b909291925a93806020611e6e6060830151946060810190611b3d565b90611ea78660405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611f6b575b50611f64575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611f0f57611f09611efe6107b195965a90611cec565b608083015190611d01565b92614317565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b611f8491925060203d8111611e4b57611e3c818361051d565b9038611eb7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611fb9570190565b611fc1611cbc565b0190565b9190811015612006575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610321570190565b61200e61196a565b611fcf565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b356107b1816103cc565b1561207857565b606460405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561032157016020813591019167ffffffffffffffff821161032157813603831361032157565b6107b19161212a8161211d846103f9565b6001600160a01b03169052565b602082013560208201526121c561217661215b61214a60408601866120bc565b610160806040880152860191611b9d565b61216860608601866120bc565b908583036060870152611b9d565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206121b8818601866120bc565b9185840390860152611b9d565b916121d661014091828101906120bc565b929091818503910152611b9d565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612227575050505050508460206107b195968503910152611b9d565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156122a25760019184612290920161210c565b98602090810196950193019190612208565b8280fd5b908092918237016000815290565b9290936107b196959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a08201520190611be1565b156122f757565b606460405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406107b192600081528160208201520190611be1565b6040906107b1939281528160208201520190611be1565b909291925a9361237b3033146122f0565b8151946040860151955a611388606083015189010111612474576107b19660009580516123c2575b505050906123bc915a90036080840151019436916105b8565b91614526565b6123e4916123e0916123db85516001600160a01b031690565b614f38565b1590565b6123f0575b80806123a3565b6123bc929194506123ff614f4a565b908151612413575b505060019390916123e9565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2016001600160a01b0360208701519261246a602061245883516001600160a01b031690565b92015195604051938493169683612353565b0390a33880612407565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b6124b46124ae6040830183611b3d565b90614f2d565b906124c56124ae6060830183611b3d565b906125616124da6124ae610120840184611b3d565b60405194859360208501956101008201359260e08301359260c08101359260a0820135926080830135926001600160a01b0360208201359135168c9693909a999895926101209895926001600160a01b036101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612575601f199384810183528261051d565b519020604080516020810192835230918101919091524660608201526080928301815290916125a4908261051d565b51902090565b604051906040820182811067ffffffffffffffff8211176125d5575b60405260006020838281520152565b6125dd610477565b6125c6565b906014116103215790601490565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000903581811693926014811061262557505050565b60140360031b82901b16169150565b9060c060a06107b193805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a08201520190611be1565b92946126e66103ea956126d46101009599986126c26126ae602097610140808c528b0190612634565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b6001600160a01b0381511660e0850152015191019060208091805184520151910152565b6127536103ea9461274161272c60a0959998969960e0865260e0860190612634565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261032157516107b1816103cc565b9160206107b1938181520191611b9d565b906127ac6001600160a01b03916107b197959694606085526060850191611b9d565b941660208201526040818503910152611b9d565b60009060033d116127cd57565b905060046000803e60005160e01c90565b600060443d106107b15760405160031991823d016004833e815167ffffffffffffffff918282113d60248401111761283c57818401948551938411612844573d8501016020848701011161283c57506107b19291016020019061051d565b949350505050565b50949350505050565b61285a6040820182611b3d565b61287261286684612067565b93610120810190611b3d565b9290303b15610321576000936128b69160405196879586957f957122ab0000000000000000000000000000000000000000000000000000000087526004870161278a565b0381305afa9081612926575b506103ea5760016128d16127c0565b6308c379a0146128ea575b6128e257565b6103ea611caf565b6128f26127de565b806128fe575b506128dc565b805160009250156128f857610d6a90604051918291631101335b60e11b83526004830161233b565b80610d91612933926104ed565b386128c2565b919061294490612b0a565b6001600160a01b0392918316612a8b57612a365761296190612b0a565b91166129e15761296e5750565b60408051631101335b60e11b815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b929190612aec90612b0a565b90926001600160a01b0380809516911603612a8b57612a3657612961905b8015612b5057612b19906147f1565b6001600160a01b0365ffffffffffff806040840151164211908115612b40575b5091511691565b9050602083015116421038612b39565b50600090600090565b15612b6057565b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a93815190612bb78282612f4b565b612bc08161249e565b6020840152612bfe6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e085013517171115612b59565b612c0782612ff3565b612c128185846130a7565b9790612c366123e0612c2b87516001600160a01b031690565b6020880151906148e4565b612cff57612c4343600052565b6001600160a01b03612c6160a060609701516001600160a01b031690565b16612ce5575b505a810360a084013510612c915760809360c092604087015260608601525a900391013501910152565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b90935081612cf69297508584613bac565b95909238612c67565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a8251612d668184612f4b565b612d6f8361249e565b6020850152612dad6effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e087013517171115612b59565b612db681612ff3565b612dc28186868b613387565b9890612de66123e0612ddb86516001600160a01b031690565b6020870151906148e4565b612eab57612df343600052565b6001600160a01b03612e1160a060609601516001600160a01b031690565b16612e90575b505a840360a086013510612e435750604085015260608401526080919060c0905a900391013501910152565b60408051631101335b60e11b815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b90925081612ea2929850868685613de6565b96909138612e17565b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b15612f0757565b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b612fb090612f68612f5b82612067565b6001600160a01b03168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611b3d565b908115612fe857612fda610fe9610fe38460a094612fd560146103ea99981015612f00565b6125e2565b6001600160a01b0316910152565b505060a06000910152565b60a08101516001600160a01b0316156130285760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161300b565b6130496040929594939560608352606083019061210c565b9460208201520152565b906103ea602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b810103600f81018552018361051d565b916000926000925a9361314e60208351936130c985516001600160a01b031690565b956130e16130da6040830183611b3d565b908461358d565b60a08601516001600160a01b0316906130f943600052565b8580936001600160a01b0380941615988961332c575b60600151908601516040517f3a871cdd000000000000000000000000000000000000000000000000000000008152978896879586939060048501613031565b03938a1690f182918161330c575b50613303575060019061316d6127c0565b6308c379a0146132c8575b50613274575b61318b575b50505a900391565b6131a8906001600160a01b03166000526000602052604060002090565b6131c36108fb82546dffffffffffffffffffffffffffff1690565b80831161322057613219926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613183565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b6132d06127de565b90816132dc5750613178565b610d6a916132ea9150613053565b604051918291631101335b60e11b83526004830161233b565b955061317e9050565b61332591925060203d8111611e4b57611e3c818361051d565b903861315c565b94506133656108fb6133518c6001600160a01b03166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b81111561337c5750856060835b9691505061310f565b606087918d03613373565b90926000936000935a946133c360208351936133aa85516001600160a01b031690565b956130e16133bb6040830183611b3d565b90848c613820565b03938a1690f182918161356d575b5061356457506001906133e26127c0565b6308c379a014613527575b506134d2575b613401575b5050505a900391565b61341e906001600160a01b03166000526000602052604060002090565b9161343a6108fb84546dffffffffffffffffffffffffffff1690565b90818311613485575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff161790553880806133f8565b60408051631101335b60e11b815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61352f6127de565b908161353b57506133ed565b86916135479150613053565b90610d6a604051928392631101335b60e11b845260048401612353565b96506133f39050565b61358691925060203d8111611e4b57611e3c818361051d565b90386133d1565b90918061359957505050565b8151516001600160a01b031692833b6137cc57606083510151604051907f570e1a36000000000000000000000000000000000000000000000000000000008252602082806135eb878760048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f19182156137bf575b60009261379f575b5080821695861561374b57168095036136f7573b156136a357610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613677936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a3565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6137b891925060203d81116111a857611199818361051d565b903861362d565b6137c7611caf565b613625565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161382f575b50505050565b8251516001600160a01b031693843b613a6557606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613881888860048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f1918215613a58575b600092613a38575b508082169687156139e3571680960361398e573b156139415750610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361390e936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a338808080613829565b60408051631101335b60e11b815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b613a5191925060203d81116111a857611199818361051d565b90386138c3565b613a60611caf565b6138bb565b60408051631101335b60e11b815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b15613ab957565b606460405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261032157825167ffffffffffffffff81116103215783019080601f8301121561032157815191613b348361058d565b91613b42604051938461051d565b8383526020848301011161032157602092613b6291848085019101611bbe565b92015190565b906103ea602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b939192606094600094600093805192613bde60a08a86015195613bd0888811613ab2565b01516001600160a01b031690565b91613bfc836001600160a01b03166000526000602052604060002090565b94613c186108fb87546dffffffffffffffffffffffffffff1690565b96858810613d92576001600160a01b0360208a9894613c818a966dffffffffffffffffffffffffffff8b613cba9e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e00000000000000000000000000000000000000000000000000000000855260048501613031565b0395169103f1908183918493613d6c575b50613d65575050600190613cdd6127c0565b6308c379a014613d43575b50613cef57565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d4b6127de565b9081613d575750613ce8565b610d6a916132ea9150613b68565b9450925050565b909250613d8b91503d8085833e613d83818361051d565b810190613afd565b9138613ccb565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b919492939093606095600095600093825190613e0d60a08b84015193613bd0848611613ab2565b93613e2b856001600160a01b03166000526000602052604060002090565b613e466108fb82546dffffffffffffffffffffffffffff1690565b878110613f7b57926001600160a01b0360208a98969394613c818a966dffffffffffffffffffffffffffff8d613eb39e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493613f5d575b50613f55575050600190613ed66127c0565b6308c379a014613f36575b50613ee95750565b60408051631101335b60e11b815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b613f3e6127de565b9081613f4a5750613ee1565b613547925050613b68565b955093505050565b909250613f7491503d8085833e613d83818361051d565b9138613ec4565b610d6a8a604051918291631101335b60e11b835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115613fda57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919061402760409160028652606060208701526060860190611be1565b930152565b939291906003811015613fda57604091614027918652606060208701526060860190611be1565b906103ea603660405180947f4141353020706f73744f702072657665727465643a200000000000000000000060208301526140978151809260208686019101611bbe565b810103601681018552018361051d565b929190925a936000918051916140bc836147aa565b9260a08101956140d387516001600160a01b031690565b6001600160a01b03939084811690816141f5575050506140fa82516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946141466020928c61419c95510390614998565b01519489602061416e61416086516001600160a01b031690565b9a516001600160a01b031690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614205575b50506140fc565b6060850151600099509091803b15614313579189918983614258956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f19081614300575b506142fb5760016142716127c0565b6308c379a0146142dc575b614288575b38806141fe565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6142e46127de565b806142ef575061427c565b6132ea610d6a91614053565b614281565b80610d9161430d926104ed565b38614262565b8980fd5b9392915a9060009280519061432b826147aa565b9360a083019661434288516001600160a01b031690565b6001600160a01b03959086811690816144055750505061436984516001600160a01b031690565b915b5a9003019485029860408301908a8251106143b857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94939261414661419c938c602094510390614998565b60408051631101335b60e11b815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614415575b505061436b565b606087015160009a509091803b1561452257918a918a83614468956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f1908161450f575b5061450a5760016144816127c0565b6308c379a0146144ed575b614498575b388061440e565b610d6a8b604051918291631101335b60e11b835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6144f56127de565b80614500575061448c565b6135478d91614053565b614491565b80610d9161451c926104ed565b38614472565b8a80fd5b909392915a94805191614538836147aa565b9260a081019561454f87516001600160a01b031690565b6001600160a01b039381851691826146105750505061457582516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946145c16020928c61419c95510390614998565b6145ca88613fd0565b0151948960206145e461416086516001600160a01b031690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151614620575b5050614577565b87840261462c8a613fd0565b60028a146146b7576060860151823b156103215761467f93600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f180156146aa575b614697575b505b3880614619565b80610d916146a4926104ed565b3861468e565b6146b2611caf565b614689565b6060860151823b156103215761470293600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f19081614797575b5061479257600161471b6127c0565b6308c379a01461477f575b1561469057604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6147876127de565b806142ef5750614726565b614690565b80610d916147a4926104ed565b3861470c565b60e060c08201519101518082146147ce574801808210156147c9575090565b905090565b5090565b604051906147df82610501565b60006040838281528260208201520152565b6147f96147d2565b5065ffffffffffff808260a01c168015614838575b6040519261481b84610501565b6001600160a01b038116845260d01c602084015216604082015290565b508061480e565b61485461485a9161484e6147d2565b506147f1565b916147f1565b906001600160a01b0391828251169283156148d9575b65ffffffffffff9283918260408160208501511693015116938360408160208401511692015116908084106148d1575b508085116148c9575b50604051956148b787610501565b16855216602084015216604082015290565b9350386148a9565b9250386148a0565b815181169350614870565b6001600160a01b0316600052600160205267ffffffffffffffff6149338260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9182549261494084611f8b565b9055161490565b906001600160a01b036149586125aa565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b6103ea33614a62565b6001600160a01b0316600052600060205260406000206dffffffffffffffffffffffffffff80825416928301809311614a55575b808311614a11576103ea92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b606460405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b614a5d611cbc565b6149cc565b6001600160a01b0390614a753482614998565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b15614ac857565b606460405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b15614b1357565b606460405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b15614b5e57565b606460405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b15614ba957565b606460405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff608060016103ea94614c4d6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b15614d5857565b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff80809416911601918211611cf957565b15614dbd57565b606460405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15614e0857565b606460405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15614e5357565b606460405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15614e9e57565b606460405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15614ee957565b606460405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211614f71575b50604051906020818301016040528082526000602083013e90565b905038614f5656fea2646970667358221220b97d7aa061056a5e9c6ad974ba3ad5c6b5a83463963e9d403739fd7b4356401664736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea264697066735822122036a5a8d538d88359007715214f81c5bd42079bac3c4d3005ea4a12098b5b92e964736f6c63430008110033","opcodes":"PUSH1 0xA0 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH3 0x89 JUMPI PUSH1 0x1 PUSH1 0x2 SSTORE PUSH2 0x22C DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH3 0x73 JUMPI DUP3 SWAP2 PUSH3 0x503E DUP4 CODECOPY SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO PUSH3 0x67 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4FAF SWAP1 DUP2 PUSH3 0x8F DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x111D ADD MSTORE DUP2 DUP2 PUSH2 0x35FB ADD MSTORE PUSH2 0x3891 ADD MSTORE RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x23 JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21 PUSH2 0x498F JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1B3 JUMPI DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x1A1 JUMPI DUP1 PUSH4 0x1D732756 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x1FAD948C EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x17D JUMPI DUP1 PUSH4 0x4B1D7CF5 EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0x5287CE12 EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0x8F41EC5A EQ PUSH2 0x159 JUMPI DUP1 PUSH4 0x957122AB EQ PUSH2 0x150 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0xB760FAF9 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x123 JUMPI DUP1 PUSH4 0xD6383F94 EQ PUSH2 0x11A JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x111 JUMPI PUSH4 0xFC7E286D SUB PUSH2 0xE JUMPI PUSH2 0x10C PUSH2 0x17E6 JUMP JUMPDEST PUSH2 0xE JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x160F JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x14D2 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x137E JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x1238 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x1217 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x11F6 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x10A0 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xF39 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xF1C JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xEC2 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xD9D JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xA75 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x9DB JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x88E JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x7B4 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x61D JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x404 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x34D JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x321 JUMPI PUSH2 0x31C PUSH32 0xA5AE833D0BB1DCD632D98A8B70973E8516812898E19BF27B70071EBC8DC52C01 SWAP2 PUSH2 0x246 PUSH2 0x216 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x222 DUP2 ISZERO ISZERO PUSH2 0x4AC1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x236 PUSH1 0x1 DUP6 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST GT ISZERO PUSH2 0x4B0C JUMP JUMPDEST SLOAD SWAP3 PUSH2 0x2FE PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 PUSH2 0x2C9 PUSH2 0x26D CALLVALUE DUP9 DUP5 PUSH1 0x78 SHR AND PUSH2 0x1D01 JUMP JUMPDEST SWAP7 PUSH2 0x279 DUP9 ISZERO ISZERO PUSH2 0x4B57 JUMP JUMPDEST PUSH2 0x285 DUP2 DUP10 GT ISZERO PUSH2 0x4BA2 JUMP JUMPDEST PUSH2 0x2A9 DUP2 PUSH2 0x291 PUSH2 0x540 JUMP JUMPDEST SWAP5 AND DUP5 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP5 ADD MSTORE DUP8 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP4 ADD MSTORE JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP4 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x2F9 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x4BED JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x20 DUP6 ADD MSTORE CALLER SWAP4 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x321 JUMPI PUSH2 0x3BE SWAP1 CALLER PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3C8 DUP2 SLOAD PUSH2 0x1F8B JUMP JUMPDEST SWAP1 SSTORE STOP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SUB PUSH2 0x321 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST JUMP JUMPDEST PUSH1 0xC4 CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH2 0x46E PUSH1 0x4 CALLDATALOAD PUSH2 0x427 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x437 PUSH2 0x326 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA0 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x4CB PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x100 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH1 0x1F NOT SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0xC0 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F PUSH1 0x20 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5AB JUMPI JUMPDEST ADD AND ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B3 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x5A5 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x5C4 DUP3 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x5D2 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x321 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x321 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x1C0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x321 JUMPI PUSH2 0x662 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x24 DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 ADD PUSH2 0x5B8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC CALLDATASIZE ADD PUSH2 0x180 DUP2 SLT PUSH2 0x321 JUMPI PUSH2 0x100 PUSH1 0x40 MLOAD SWAP2 PUSH2 0x69F DUP4 PUSH2 0x4A7 JUMP JUMPDEST SLT PUSH2 0x321 JUMPI PUSH1 0x40 MLOAD PUSH2 0x6B0 DUP2 PUSH2 0x4D0 JUMP JUMPDEST PUSH2 0x6B8 PUSH2 0x3DD JUMP JUMPDEST DUP2 MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x64 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x84 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x6E2 PUSH2 0x3EC JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE4 CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x104 CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE DUP2 MSTORE PUSH2 0x124 CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x144 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x164 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x184 CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x1A4 CALLDATALOAD SWAP2 DUP3 GT PUSH2 0x321 JUMPI PUSH2 0x756 SWAP3 PUSH2 0x73E PUSH2 0x746 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x236A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x40 PUSH1 0x3 NOT DUP4 ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 DUP3 GT PUSH2 0x321 JUMPI DUP1 PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP4 DUP5 GT PUSH2 0x321 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0x321 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 PUSH1 0x24 CALLDATALOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x7C3 CALLDATASIZE PUSH2 0x75A JUMP JUMPDEST PUSH2 0x7CE SWAP3 SWAP2 SWAP3 PUSH2 0x1A0A JUMP JUMPDEST PUSH2 0x7D7 DUP4 PUSH2 0x191B JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x857 JUMPI POP PUSH1 0x0 SWAP3 PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 DUP5 DUP1 LOG1 DUP4 SWAP2 JUMPDEST DUP6 DUP4 LT PUSH2 0x827 JUMPI PUSH2 0x81D DUP6 DUP6 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x21 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST SWAP1 SWAP2 SWAP4 PUSH1 0x1 SWAP1 PUSH2 0x84D PUSH2 0x83B DUP8 DUP10 DUP8 PUSH2 0x19BC JUMP JUMPDEST PUSH2 0x845 DUP9 DUP7 PUSH2 0x199A JUMP JUMPDEST MLOAD SWAP1 DUP9 PUSH2 0x1E52 JUMP JUMPDEST ADD SWAP5 ADD SWAP2 SWAP1 PUSH2 0x80C JUMP JUMPDEST DUP1 PUSH2 0x885 PUSH2 0x87E PUSH2 0x86C PUSH1 0x1 SWAP5 DUP7 SWAP9 SWAP7 PUSH2 0x199A JUMP JUMPDEST MLOAD PUSH2 0x878 DUP5 DUP11 DUP9 PUSH2 0x19BC JUMP JUMPDEST DUP5 PUSH2 0x2D53 JUMP JUMPDEST SWAP1 DUP4 PUSH2 0x2939 JUMP JUMPDEST ADD SWAP3 SWAP1 SWAP3 PUSH2 0x7DA JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8AC DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x0 SWAP2 CALLER DUP4 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP3 DUP4 DUP4 GT PUSH2 0x997 JUMPI DUP5 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 SWAP6 SWAP4 PUSH2 0x947 DUP5 SWAP7 PUSH2 0x90E PUSH2 0x8FB DUP8 SWAP9 PUSH2 0x994 SWAP13 PUSH2 0x1CEC JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xD1C19FBCD4551A5EDFB66D43D2E337C04837AFDA3482B42BDF569A8FCCDAE5FB SWAP2 LOG2 AND GAS CALL PUSH2 0x98E PUSH2 0x1A5D JUMP JUMPDEST POP PUSH2 0x4EE2 JUMP JUMPDEST DUP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x576974686472617720616D6F756E7420746F6F206C6172676500000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x4 CALLDATALOAD PUSH2 0x9FB DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0xA0B PUSH2 0x326 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x1 DUP3 MSTORE PUSH2 0xA46 DUP2 PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 PUSH1 0x40 MLOAD SWAP3 PUSH1 0x40 SHL AND OR DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0xA84 CALLDATASIZE PUSH2 0x75A JUMP JUMPDEST PUSH2 0xA8C PUSH2 0x1A0A JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST DUP4 DUP3 LT PUSH2 0xC59 JUMPI PUSH2 0xAA1 SWAP2 POP PUSH2 0x191B JUMP JUMPDEST PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 PUSH1 0x0 DUP1 LOG1 PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT PUSH2 0xBCC JUMPI POP POP PUSH1 0x0 DUP1 SWAP4 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB10 JUMPI PUSH2 0x81D DUP7 DUP7 PUSH1 0x0 PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D DUP2 DUP1 LOG2 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0xB67 PUSH2 0xB1E DUP3 DUP5 DUP11 PUSH2 0x1FC5 JUMP JUMPDEST PUSH2 0xB3C PUSH2 0xB30 PUSH2 0xB30 PUSH1 0x20 DUP5 ADD PUSH2 0x2067 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D PUSH1 0x0 DUP1 LOG2 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP1 DUP4 LT PUSH2 0xB84 JUMPI POP POP POP PUSH2 0xB7F SWAP1 PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0xAD9 JUMP JUMPDEST SWAP1 SWAP2 SWAP5 SWAP8 PUSH2 0xBBF PUSH2 0xBB9 PUSH2 0xBC5 SWAP3 PUSH2 0xBB3 DUP13 DUP12 PUSH2 0xBAC DUP3 PUSH2 0xBA6 DUP15 DUP12 DUP14 PUSH2 0x19BC JUMP JUMPDEST SWAP3 PUSH2 0x199A JUMP JUMPDEST MLOAD SWAP2 PUSH2 0x1E52 JUMP JUMPDEST SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP10 PUSH2 0x1F8B JUMP JUMPDEST SWAP6 PUSH2 0x1F8B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xB6C JUMP JUMPDEST PUSH2 0xBD7 DUP2 DUP7 DUP9 PUSH2 0x1FC5 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xBEF PUSH2 0xBE6 DUP4 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 ADD PUSH2 0x2067 JUMP JUMPDEST SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x0 SWAP4 AND SWAP1 JUMPDEST DUP3 DUP5 LT PUSH2 0xC17 JUMPI POP POP POP POP PUSH2 0xC12 SWAP1 PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0xACA JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP5 PUSH2 0xBBF DUP2 PUSH2 0xC4C DUP6 PUSH2 0xC45 PUSH2 0xC33 PUSH2 0xC51 SWAP7 DUP14 PUSH2 0x199A JUMP JUMPDEST MLOAD PUSH2 0xC3F DUP13 DUP12 DUP11 PUSH2 0x19BC JUMP JUMPDEST DUP6 PUSH2 0x2D53 JUMP JUMPDEST SWAP1 DUP12 PUSH2 0x2AE0 JUMP JUMPDEST PUSH2 0x1F8B JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xBFE JUMP JUMPDEST PUSH2 0xC64 DUP3 DUP6 DUP8 PUSH2 0x1FC5 JUMP JUMPDEST SWAP1 PUSH2 0xC6F DUP3 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP3 PUSH2 0xC7F PUSH2 0xB30 PUSH1 0x20 DUP4 ADD PUSH2 0x2067 JUMP JUMPDEST SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xC97 PUSH1 0x1 DUP3 EQ ISZERO PUSH2 0x2071 JUMP JUMPDEST PUSH2 0xCB8 JUMPI JUMPDEST POP POP POP PUSH2 0xCB2 SWAP2 PUSH2 0xCAC SWAP2 PUSH2 0x1D01 JUMP JUMPDEST SWAP2 PUSH2 0x1F8B JUMP JUMPDEST SWAP1 PUSH2 0xA90 JUMP JUMPDEST SWAP1 SWAP6 SWAP3 PUSH2 0xCD1 PUSH1 0x40 SWAP10 SWAP7 SWAP4 SWAP10 SWAP9 SWAP6 SWAP9 SWAP8 DUP9 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP3 SWAP1 DUP11 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI DUP10 SWAP4 DUP12 SWAP2 DUP11 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xE3563A4F00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 SWAP15 DUP16 DUP6 ADD SWAP4 PUSH2 0xD18 SWAP5 PUSH2 0x21E4 JUMP JUMPDEST SUB DUP2 GAS SWAP4 PUSH1 0x0 SWAP5 STATICCALL SWAP1 DUP2 PUSH2 0xD84 JUMPI JUMPDEST POP PUSH2 0xD6E JUMPI DUP7 MLOAD PUSH32 0x86A9F75000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP2 DUP11 ADD SWAP1 DUP2 MSTORE DUP2 SWAP1 PUSH1 0x20 ADD SUB SWAP1 REVERT JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP5 SWAP8 POP SWAP3 SWAP6 POP SWAP1 SWAP4 POP SWAP2 DUP2 PUSH2 0xCAC PUSH2 0xCB2 PUSH2 0xC9C JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0xD97 SWAP3 PUSH2 0x4ED JUMP JUMPDEST DUP1 PUSH2 0xF11 JUMP JUMPDEST CODESIZE PUSH2 0xD27 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH2 0x756 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0xDC6 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 SWAP3 DUP4 SWAP3 DUP4 MLOAD PUSH2 0xDD8 DUP2 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x0 SWAP4 DUP2 DUP6 DUP1 SWAP4 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP8 DUP3 ADD MSTORE DUP3 PUSH1 0x60 DUP3 ADD MSTORE ADD MSTORE AND DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE KECCAK256 SWAP1 PUSH2 0xE67 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 DUP4 MLOAD SWAP5 PUSH2 0xE14 DUP7 PUSH2 0x4A7 JUMP JUMPDEST DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP9 MSTORE PUSH1 0x70 DUP3 SWAP1 SHR PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x78 SWAP2 SWAP1 SWAP2 SHR AND DUP6 DUP8 ADD MSTORE ADD SLOAD PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x20 SHR AND PUSH1 0x80 DUP5 ADD SWAP1 PUSH6 0xFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST MLOAD SWAP2 DUP3 SWAP2 DUP3 SWAP2 SWAP1 SWAP2 PUSH1 0x80 PUSH6 0xFFFFFFFFFFFF DUP2 PUSH1 0xA0 DUP5 ADD SWAP6 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 MLOAD AND DUP7 MSTORE PUSH1 0x20 DUP3 ADD MLOAD ISZERO ISZERO PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD AND PUSH1 0x40 DUP7 ADD MSTORE PUSH4 0xFFFFFFFF PUSH1 0x60 DUP3 ADD MLOAD AND PUSH1 0x60 DUP7 ADD MSTORE ADD MLOAD AND SWAP2 ADD MSTORE JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0xEE8 DUP2 PUSH2 0x3CC JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0xF6C SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP1 POP PUSH1 0x24 CALLDATALOAD SWAP2 PUSH2 0xF7B DUP4 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0xF92 SWAP1 CALLDATASIZE SWAP1 DUP6 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 ISZERO SWAP1 DUP2 PUSH2 0x1096 JUMPI JUMPDEST POP PUSH2 0x1049 JUMPI PUSH1 0x14 DUP3 LT ISZERO PUSH2 0xFD3 JUMPI JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x40 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xFE3 PUSH2 0xFEF SWAP3 PUSH2 0xFE9 SWAP3 PUSH2 0x25E2 JUMP JUMPDEST SWAP1 PUSH2 0x25F0 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO PUSH2 0xFFC JUMPI CODESIZE DUP1 PUSH2 0xFAC JUMP JUMPDEST PUSH2 0xD6A SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x60 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x1B PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x41413330207061796D6173746572206E6F74206465706C6F7965640000000000 PUSH1 0x40 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x60 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x19 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x41413230206163636F756E74206E6F74206465706C6F79656400000000000000 PUSH1 0x40 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 POP EXTCODESIZE ISZERO CODESIZE PUSH2 0xF9D JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x10D4 PUSH1 0x24 SWAP2 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP1 PUSH2 0x110A PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB PUSH1 0x20 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP2 PUSH1 0x0 DUP6 PUSH32 0x0 AND GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x11AF JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x117F JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH32 0x6CA7B80600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE AND PUSH1 0x4 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x11A1 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI JUMPDEST PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2764 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x114F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x118F JUMP JUMPDEST PUSH2 0x11B7 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x1147 JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x160 SWAP2 SUB SLT PUSH2 0x321 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x3 NOT DUP3 ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH2 0x7B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x11BC JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH2 0x120F PUSH2 0x120A CALLDATASIZE PUSH2 0x11CB JUMP JUMPDEST PUSH2 0x249E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH2 0x21 PUSH1 0x4 CALLDATALOAD PUSH2 0x1233 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH2 0x4A62 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x0 DUP1 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x137B JUMPI CALLER DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x1 DUP2 ADD SWAP1 PUSH4 0xFFFFFFFF DUP3 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x1337 JUMPI PUSH2 0x12D4 PUSH2 0x1299 PUSH2 0x12FC SWAP4 PUSH2 0x128B PUSH2 0x1286 DUP6 SLOAD PUSH1 0xFF SWAP1 PUSH1 0x70 SHR AND SWAP1 JUMP JUMPDEST PUSH2 0x4D51 JUMP JUMPDEST PUSH6 0xFFFFFFFFFFFF TIMESTAMP AND PUSH2 0x4D9C JUMP JUMPDEST DUP5 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF AND PUSH1 0x20 DUP3 SWAP1 SHL PUSH10 0xFFFFFFFFFFFF00000000 AND OR SWAP1 SWAP5 SSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH6 0xFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE CALLER SWAP1 PUSH32 0xFA9B3C14CC825C412C9ED81B3BA365A5B459439403F18829E572ED53A4180F0A SWAP1 PUSH1 0x20 SWAP1 LOG2 DUP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F74207374616B656400000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x139C DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH2 0x994 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x13C4 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x147C PUSH2 0x13E7 PUSH2 0x8FB DUP7 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x78 SHR AND SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x13F3 DUP7 ISZERO ISZERO PUSH2 0x4DB6 JUMP JUMPDEST PUSH2 0x1454 PUSH1 0x1 DUP3 ADD PUSH2 0x142C PUSH6 0xFFFFFFFFFFFF PUSH2 0x1418 DUP4 SLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 PUSH1 0x20 SHR AND SWAP1 JUMP JUMPDEST AND PUSH2 0x1424 DUP2 ISZERO ISZERO PUSH2 0x4E01 JUMP JUMPDEST TIMESTAMP LT ISZERO PUSH2 0x4E4C JUMP JUMPDEST DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xB7C918E0E249F999E965CAFEB6C664271B3F4317D296461500E71DA39F0CBDA3 SWAP2 LOG2 PUSH1 0x0 DUP1 DUP1 SWAP6 DUP2 SWAP5 DUP3 SWAP5 AND GAS CALL PUSH2 0x14CC PUSH2 0x1A5D JUMP JUMPDEST POP PUSH2 0x4E97 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x1505 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x11BC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH2 0x1512 DUP4 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x152D PUSH2 0xD6A SWAP2 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST PUSH2 0x1535 PUSH2 0x1898 JUMP JUMPDEST PUSH2 0x153E DUP6 PUSH2 0x284D JUMP JUMPDEST PUSH2 0x1551 PUSH2 0x154B DUP3 DUP8 PUSH2 0x2BA4 JUMP JUMPDEST SWAP1 PUSH2 0x483F JUMP JUMPDEST SWAP5 PUSH2 0x1561 DUP3 PUSH1 0x0 SWAP3 NUMBER DUP5 MSTORE PUSH2 0x1D0E JUMP JUMPDEST SWAP7 NUMBER DUP3 MSTORE DUP2 SWAP4 PUSH1 0x60 SWAP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x15DB JUMPI JUMPDEST POP POP POP POP PUSH1 0x80 ADD MLOAD SWAP4 PUSH2 0x15A8 PUSH1 0x40 PUSH2 0x159A PUSH1 0x20 DUP5 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 PUSH32 0x8B7AC98000000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 DUP9 ADD PUSH2 0x22B4 JUMP JUMPDEST DUP4 SWAP6 POP DUP4 SWAP5 SWAP7 POP PUSH2 0x15F5 PUSH1 0x40 SWAP5 SWAP3 SWAP4 SWAP5 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH2 0x22A6 JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP1 PUSH1 0x80 PUSH2 0x1604 PUSH2 0x1A5D JUMP JUMPDEST SWAP3 SWAP2 SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1579 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x161E CALLDATASIZE PUSH2 0x11CB JUMP JUMPDEST PUSH2 0x1626 PUSH2 0x1898 JUMP JUMPDEST PUSH2 0x162F DUP3 PUSH2 0x284D JUMP JUMPDEST PUSH2 0x1639 DUP2 DUP4 PUSH2 0x2BA4 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xA0 ADD MLOAD SWAP2 SWAP4 SWAP2 PUSH2 0x1659 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4947 JUMP JUMPDEST PUSH2 0x4947 JUMP JUMPDEST SWAP1 PUSH2 0x1670 PUSH2 0x1654 DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 MLOAD AND SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x1679 PUSH2 0x25AA JUMP JUMPDEST POP PUSH2 0x16A8 PUSH2 0x168C PUSH1 0x40 SWAP6 DUP7 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x14 DUP4 LT PUSH2 0x17DE JUMPI POP PUSH2 0xFE3 PUSH2 0x1654 SWAP3 PUSH2 0xFE9 SWAP3 PUSH2 0x25E2 JUMP JUMPDEST SWAP2 PUSH2 0x16B2 SWAP2 PUSH2 0x483F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 DUP2 EQ SWAP2 PUSH1 0x80 DUP9 ADD MLOAD SWAP8 DUP8 DUP2 ADD MLOAD SWAP2 DUP9 PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x16ED SWAP1 PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP2 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP2 PUSH1 0x60 ADD MLOAD SWAP3 PUSH2 0x1706 PUSH2 0x54D JUMP JUMPDEST SWAP11 DUP12 MSTORE PUSH1 0x20 DUP12 ADD MSTORE DUP5 ISZERO ISZERO DUP10 DUP12 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x60 DUP11 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x80 DUP10 ADD MSTORE PUSH1 0xA0 DUP9 ADD MSTORE ISZERO ISZERO SWAP1 DUP2 PUSH2 0x17D5 JUMPI JUMPDEST POP PUSH2 0x1777 JUMPI POP PUSH2 0xD6A SWAP3 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xE0CFF05F00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x270A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xD6A SWAP4 PUSH2 0x1786 DUP5 PUSH2 0x4947 JUMP JUMPDEST PUSH2 0x17A0 PUSH2 0x1791 PUSH2 0x56D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND DUP7 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE MLOAD SWAP6 DUP7 SWAP6 PUSH32 0xFAECB4E400000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x2685 JUMP JUMPDEST SWAP1 POP ISZERO CODESIZE PUSH2 0x173D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4947 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0x180C DUP2 PUSH2 0x3CC JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0xA0 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 DUP3 SLOAD SWAP3 ADD SLOAD PUSH1 0x40 MLOAD SWAP3 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 DUP2 AND DUP6 MSTORE PUSH1 0xFF DUP2 PUSH1 0x70 SHR AND ISZERO ISZERO PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x78 SHR AND PUSH1 0x40 DUP5 ADD MSTORE PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x20 SHR AND PUSH1 0x80 DUP3 ADD MSTORE RETURN JUMPDEST PUSH1 0x20 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x188B JUMPI JUMPDEST PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH2 0x1893 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x1884 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x18A5 DUP3 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP4 PUSH2 0x100 DUP4 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP5 DUP3 LT OR PUSH2 0x190E JUMPI JUMPDEST PUSH1 0x40 MSTORE PUSH1 0x0 SWAP3 DUP4 DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP4 PUSH1 0x60 DUP3 ADD MSTORE DUP4 DUP4 DUP3 ADD MSTORE DUP4 PUSH1 0xA0 DUP3 ADD MSTORE DUP4 PUSH1 0xC0 DUP3 ADD MSTORE DUP4 PUSH1 0xE0 DUP3 ADD MSTORE DUP2 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE DUP3 PUSH1 0x40 DUP3 ADD MSTORE DUP3 PUSH1 0x60 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1916 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x18C4 JUMP JUMPDEST SWAP1 PUSH2 0x1925 DUP3 PUSH2 0x1871 JUMP JUMPDEST PUSH2 0x1932 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0x51D JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x1F NOT PUSH2 0x1942 DUP3 SWAP5 PUSH2 0x1871 JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1953 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x195E PUSH2 0x1898 JUMP JUMPDEST DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x1947 JUMP JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 SWAP2 DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x19AF JUMPI JUMPDEST PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x19B7 PUSH2 0x196A JUMP JUMPDEST PUSH2 0x19A7 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x19FD JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x1A05 PUSH2 0x196A JUMP JUMPDEST PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD EQ PUSH2 0x1A19 JUMPI PUSH1 0x2 DUP1 SSTORE JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1A88 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x1A6E DUP3 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x1A7C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL PUSH2 0x1AAD PUSH2 0x1A5D JUMP JUMPDEST POP ISZERO PUSH2 0x1AB5 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413931206661696C65642073656E6420746F2062656E656669636961727900 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393020696E76616C69642062656E65666963696172790000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x321 JUMPI MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH1 0x1F NOT SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1BD1 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BC1 JUMP JUMPDEST SWAP1 PUSH1 0x1F NOT PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x1BFF DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1C20 PUSH1 0x80 SWAP2 PUSH2 0x7B1 SWAP7 SWAP5 PUSH2 0x1C0 DUP1 DUP7 MSTORE DUP6 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP4 PUSH1 0xE0 DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 MLOAD AND PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP6 DUP8 ADD MSTORE DUP5 DUP3 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD AND PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xC0 DUP2 ADD MLOAD DUP3 DUP7 ADD MSTORE ADD MLOAD PUSH2 0x100 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH2 0x140 DUP5 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH2 0x160 DUP5 ADD MSTORE ADD MLOAD PUSH2 0x180 DUP3 ADD MSTORE PUSH2 0x1A0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x1BE1 JUMP JUMPDEST POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x1CBC JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST SWAP1 GAS SWAP2 DUP2 PUSH1 0x20 PUSH2 0x1D27 PUSH1 0x60 DUP4 ADD MLOAD SWAP4 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x1D60 DUP6 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP5 PUSH32 0x1D73275600000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x1C06 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 ADDRESS GAS CALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x1E22 JUMPI JUMPDEST POP PUSH2 0x1E1B JUMPI POP PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MLOAD EQ PUSH2 0x1DC7 JUMPI PUSH2 0x1DC1 PUSH2 0x1DB6 PUSH2 0x7B1 SWAP5 GAS SWAP1 PUSH2 0x1CEC JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MLOAD SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP2 PUSH2 0x40A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH2 0x1E44 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI JUMPDEST PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1B8E JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x1D70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1E32 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 GAS SWAP4 DUP1 PUSH1 0x20 PUSH2 0x1E6E PUSH1 0x60 DUP4 ADD MLOAD SWAP5 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x1EA7 DUP7 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP5 PUSH32 0x1D73275600000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x1C06 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 ADDRESS GAS CALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x1F6B JUMPI JUMPDEST POP PUSH2 0x1F64 JUMPI POP PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MLOAD EQ PUSH2 0x1F0F JUMPI PUSH2 0x1F09 PUSH2 0x1EFE PUSH2 0x7B1 SWAP6 SWAP7 GAS SWAP1 PUSH2 0x1CEC JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP3 PUSH2 0x4317 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP5 POP POP POP POP JUMP JUMPDEST PUSH2 0x1F84 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x1EB7 JUMP JUMPDEST PUSH1 0x1 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x1FB9 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x1FC1 PUSH2 0x1CBC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2006 JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x200E PUSH2 0x196A JUMP JUMPDEST PUSH2 0x1FCF JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 PUSH1 0x5 SHL CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST CALLDATALOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST ISZERO PUSH2 0x2078 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393620696E76616C69642061676772656761746F72000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP3 CALLDATASIZE SUB ADD DUP2 SLT ISZERO PUSH2 0x321 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST PUSH2 0x7B1 SWAP2 PUSH2 0x212A DUP2 PUSH2 0x211D DUP5 PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x21C5 PUSH2 0x2176 PUSH2 0x215B PUSH2 0x214A PUSH1 0x40 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x40 DUP9 ADD MSTORE DUP7 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST PUSH2 0x2168 PUSH1 0x60 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST PUSH1 0x80 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x120 PUSH2 0x21B8 DUP2 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST SWAP2 DUP6 DUP5 SUB SWAP1 DUP7 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP2 PUSH2 0x21D6 PUSH2 0x140 SWAP2 DUP3 DUP2 ADD SWAP1 PUSH2 0x20BC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP5 SWAP4 SWAP2 SWAP3 SWAP1 DUP4 PUSH1 0x40 DUP8 ADD PUSH1 0x40 DUP9 MSTORE MSTORE PUSH1 0x60 DUP7 ADD SWAP4 PUSH1 0x60 DUP2 PUSH1 0x5 SHL DUP9 ADD ADD SWAP5 DUP3 PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP5 DUP4 LT PUSH2 0x2227 JUMPI POP POP POP POP POP POP DUP5 PUSH1 0x20 PUSH2 0x7B1 SWAP6 SWAP7 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP12 DUP3 SUB ADD DUP6 MSTORE DUP9 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT ISZERO PUSH2 0x22A2 JUMPI PUSH1 0x1 SWAP2 DUP5 PUSH2 0x2290 SWAP3 ADD PUSH2 0x210C JUMP JUMPDEST SWAP9 PUSH1 0x20 SWAP1 DUP2 ADD SWAP7 SWAP6 ADD SWAP4 ADD SWAP2 SWAP1 PUSH2 0x2208 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x7B1 SWAP7 SWAP6 SWAP3 PUSH1 0xC0 SWAP6 DUP6 MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH6 0xFFFFFFFFFFFF DUP1 SWAP3 AND PUSH1 0x40 DUP6 ADD MSTORE AND PUSH1 0x60 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP3 ADD MSTORE DUP2 PUSH1 0xA0 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST ISZERO PUSH2 0x22F7 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393220696E7465726E616C2063616C6C206F6E6C79000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH1 0x40 PUSH2 0x7B1 SWAP3 PUSH1 0x0 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH2 0x7B1 SWAP4 SWAP3 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 GAS SWAP4 PUSH2 0x237B ADDRESS CALLER EQ PUSH2 0x22F0 JUMP JUMPDEST DUP2 MLOAD SWAP5 PUSH1 0x40 DUP7 ADD MLOAD SWAP6 GAS PUSH2 0x1388 PUSH1 0x60 DUP4 ADD MLOAD DUP10 ADD ADD GT PUSH2 0x2474 JUMPI PUSH2 0x7B1 SWAP7 PUSH1 0x0 SWAP6 DUP1 MLOAD PUSH2 0x23C2 JUMPI JUMPDEST POP POP POP SWAP1 PUSH2 0x23BC SWAP2 GAS SWAP1 SUB PUSH1 0x80 DUP5 ADD MLOAD ADD SWAP5 CALLDATASIZE SWAP2 PUSH2 0x5B8 JUMP JUMPDEST SWAP2 PUSH2 0x4526 JUMP JUMPDEST PUSH2 0x23E4 SWAP2 PUSH2 0x23E0 SWAP2 PUSH2 0x23DB DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x4F38 JUMP JUMPDEST ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x23F0 JUMPI JUMPDEST DUP1 DUP1 PUSH2 0x23A3 JUMP JUMPDEST PUSH2 0x23BC SWAP3 SWAP2 SWAP5 POP PUSH2 0x23FF PUSH2 0x4F4A JUMP JUMPDEST SWAP1 DUP2 MLOAD PUSH2 0x2413 JUMPI JUMPDEST POP POP PUSH1 0x1 SWAP4 SWAP1 SWAP2 PUSH2 0x23E9 JUMP JUMPDEST PUSH32 0x1C4FADA7374C0A9EE8841FC38AFE82932DC0F8E69012E927F061A8BAE611A201 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP8 ADD MLOAD SWAP3 PUSH2 0x246A PUSH1 0x20 PUSH2 0x2458 DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP3 ADD MLOAD SWAP6 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND SWAP7 DUP4 PUSH2 0x2353 JUMP JUMPDEST SUB SWAP1 LOG3 CODESIZE DUP1 PUSH2 0x2407 JUMP JUMPDEST PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x24B4 PUSH2 0x24AE PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x4F2D JUMP JUMPDEST SWAP1 PUSH2 0x24C5 PUSH2 0x24AE PUSH1 0x60 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x2561 PUSH2 0x24DA PUSH2 0x24AE PUSH2 0x120 DUP5 ADD DUP5 PUSH2 0x1B3D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD SWAP6 PUSH2 0x100 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0xE0 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0xA0 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0x80 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD SWAP2 CALLDATALOAD AND DUP13 SWAP7 SWAP4 SWAP1 SWAP11 SWAP10 SWAP9 SWAP6 SWAP3 PUSH2 0x120 SWAP9 SWAP6 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x140 DUP11 ADD SWAP14 AND DUP10 MSTORE PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 PUSH2 0x2575 PUSH1 0x1F NOT SWAP4 DUP5 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x51D JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 DUP4 MSTORE ADDRESS SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP3 DUP4 ADD DUP2 MSTORE SWAP1 SWAP2 PUSH2 0x25A4 SWAP1 DUP3 PUSH2 0x51D JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x25D5 JUMPI JUMPDEST PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 DUP3 DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x25DD PUSH2 0x477 JUMP JUMPDEST PUSH2 0x25C6 JUMP JUMPDEST SWAP1 PUSH1 0x14 GT PUSH2 0x321 JUMPI SWAP1 PUSH1 0x14 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 SWAP1 CALLDATALOAD DUP2 DUP2 AND SWAP4 SWAP3 PUSH1 0x14 DUP2 LT PUSH2 0x2625 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x14 SUB PUSH1 0x3 SHL DUP3 SWAP1 SHL AND AND SWAP2 POP JUMP JUMPDEST SWAP1 PUSH1 0xC0 PUSH1 0xA0 PUSH2 0x7B1 SWAP4 DUP1 MLOAD DUP5 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD ISZERO ISZERO PUSH1 0x40 DUP6 ADD MSTORE PUSH6 0xFFFFFFFFFFFF DUP1 PUSH1 0x60 DUP4 ADD MLOAD AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD AND PUSH1 0x80 DUP6 ADD MSTORE ADD MLOAD SWAP2 DUP2 PUSH1 0xA0 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP3 SWAP5 PUSH2 0x26E6 PUSH2 0x3EA SWAP6 PUSH2 0x26D4 PUSH2 0x100 SWAP6 SWAP10 SWAP9 PUSH2 0x26C2 PUSH2 0x26AE PUSH1 0x20 SWAP8 PUSH2 0x140 DUP1 DUP13 MSTORE DUP12 ADD SWAP1 PUSH2 0x2634 JUMP JUMPDEST SWAP12 DUP8 DUP11 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP10 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0xC0 DUP7 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 MLOAD AND PUSH1 0xE0 DUP6 ADD MSTORE ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2753 PUSH2 0x3EA SWAP5 PUSH2 0x2741 PUSH2 0x272C PUSH1 0xA0 SWAP6 SWAP10 SWAP9 SWAP7 SWAP10 PUSH1 0xE0 DUP7 MSTORE PUSH1 0xE0 DUP7 ADD SWAP1 PUSH2 0x2634 JUMP JUMPDEST SWAP9 PUSH1 0x20 DUP6 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE JUMP JUMPDEST ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x321 JUMPI MLOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x7B1 SWAP4 DUP2 DUP2 MSTORE ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP1 PUSH2 0x27AC PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x7B1 SWAP8 SWAP6 SWAP7 SWAP5 PUSH1 0x60 DUP6 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST PUSH1 0x0 SWAP1 PUSH1 0x3 RETURNDATASIZE GT PUSH2 0x27CD JUMPI JUMP JUMPDEST SWAP1 POP PUSH1 0x4 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x44 RETURNDATASIZE LT PUSH2 0x7B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0x3 NOT SWAP2 DUP3 RETURNDATASIZE ADD PUSH1 0x4 DUP4 RETURNDATACOPY DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP3 GT RETURNDATASIZE PUSH1 0x24 DUP5 ADD GT OR PUSH2 0x283C JUMPI DUP2 DUP5 ADD SWAP5 DUP6 MLOAD SWAP4 DUP5 GT PUSH2 0x2844 JUMPI RETURNDATASIZE DUP6 ADD ADD PUSH1 0x20 DUP5 DUP8 ADD ADD GT PUSH2 0x283C JUMPI POP PUSH2 0x7B1 SWAP3 SWAP2 ADD PUSH1 0x20 ADD SWAP1 PUSH2 0x51D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x285A PUSH1 0x40 DUP3 ADD DUP3 PUSH2 0x1B3D JUMP JUMPDEST PUSH2 0x2872 PUSH2 0x2866 DUP5 PUSH2 0x2067 JUMP JUMPDEST SWAP4 PUSH2 0x120 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP3 SWAP1 ADDRESS EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH1 0x0 SWAP4 PUSH2 0x28B6 SWAP2 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x957122AB00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x278A JUMP JUMPDEST SUB DUP2 ADDRESS GAS STATICCALL SWAP1 DUP2 PUSH2 0x2926 JUMPI JUMPDEST POP PUSH2 0x3EA JUMPI PUSH1 0x1 PUSH2 0x28D1 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x28EA JUMPI JUMPDEST PUSH2 0x28E2 JUMPI JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x28F2 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x28FE JUMPI JUMPDEST POP PUSH2 0x28DC JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP3 POP ISZERO PUSH2 0x28F8 JUMPI PUSH2 0xD6A SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x233B JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x2933 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x28C2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2944 SWAP1 PUSH2 0x2B0A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP2 DUP4 AND PUSH2 0x2A8B JUMPI PUSH2 0x2A36 JUMPI PUSH2 0x2961 SWAP1 PUSH2 0x2B0A JUMP JUMPDEST SWAP2 AND PUSH2 0x29E1 JUMPI PUSH2 0x296E JUMPI POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413332207061796D61737465722065787069726564206F72206E6F74206475 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6500000000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413334207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414132322065787069726564206F72206E6F7420647565000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2AEC SWAP1 PUSH2 0x2B0A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP1 SWAP6 AND SWAP2 AND SUB PUSH2 0x2A8B JUMPI PUSH2 0x2A36 JUMPI PUSH2 0x2961 SWAP1 JUMPDEST DUP1 ISZERO PUSH2 0x2B50 JUMPI PUSH2 0x2B19 SWAP1 PUSH2 0x47F1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH6 0xFFFFFFFFFFFF DUP1 PUSH1 0x40 DUP5 ADD MLOAD AND TIMESTAMP GT SWAP1 DUP2 ISZERO PUSH2 0x2B40 JUMPI JUMPDEST POP SWAP2 MLOAD AND SWAP2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD MLOAD AND TIMESTAMP LT CODESIZE PUSH2 0x2B39 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2B60 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413934206761732076616C756573206F766572666C6F770000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x0 SWAP2 GAS SWAP4 DUP2 MLOAD SWAP1 PUSH2 0x2BB7 DUP3 DUP3 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2BC0 DUP2 PUSH2 0x249E JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BFE PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD OR PUSH1 0x40 DUP6 ADD MLOAD OR PUSH2 0x100 DUP5 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 DUP6 ADD CALLDATALOAD OR OR GT ISZERO PUSH2 0x2B59 JUMP JUMPDEST PUSH2 0x2C07 DUP3 PUSH2 0x2FF3 JUMP JUMPDEST PUSH2 0x2C12 DUP2 DUP6 DUP5 PUSH2 0x30A7 JUMP JUMPDEST SWAP8 SWAP1 PUSH2 0x2C36 PUSH2 0x23E0 PUSH2 0x2C2B DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD MLOAD SWAP1 PUSH2 0x48E4 JUMP JUMPDEST PUSH2 0x2CFF JUMPI PUSH2 0x2C43 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x2C61 PUSH1 0xA0 PUSH1 0x60 SWAP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST AND PUSH2 0x2CE5 JUMPI JUMPDEST POP GAS DUP2 SUB PUSH1 0xA0 DUP5 ADD CALLDATALOAD LT PUSH2 0x2C91 JUMPI PUSH1 0x80 SWAP4 PUSH1 0xC0 SWAP3 PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD MSTORE GAS SWAP1 SUB SWAP2 ADD CALLDATALOAD ADD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP4 POP DUP2 PUSH2 0x2CF6 SWAP3 SWAP8 POP DUP6 DUP5 PUSH2 0x3BAC JUMP JUMPDEST SWAP6 SWAP1 SWAP3 CODESIZE PUSH2 0x2C67 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH1 0x0 SWAP3 GAS DUP3 MLOAD PUSH2 0x2D66 DUP2 DUP5 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2D6F DUP4 PUSH2 0x249E JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x2DAD PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD OR PUSH1 0x40 DUP5 ADD MLOAD OR PUSH2 0x100 DUP7 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 DUP8 ADD CALLDATALOAD OR OR GT ISZERO PUSH2 0x2B59 JUMP JUMPDEST PUSH2 0x2DB6 DUP2 PUSH2 0x2FF3 JUMP JUMPDEST PUSH2 0x2DC2 DUP2 DUP7 DUP7 DUP12 PUSH2 0x3387 JUMP JUMPDEST SWAP9 SWAP1 PUSH2 0x2DE6 PUSH2 0x23E0 PUSH2 0x2DDB DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 PUSH2 0x48E4 JUMP JUMPDEST PUSH2 0x2EAB JUMPI PUSH2 0x2DF3 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x2E11 PUSH1 0xA0 PUSH1 0x60 SWAP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST AND PUSH2 0x2E90 JUMPI JUMPDEST POP GAS DUP5 SUB PUSH1 0xA0 DUP7 ADD CALLDATALOAD LT PUSH2 0x2E43 JUMPI POP PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 SWAP2 SWAP1 PUSH1 0xC0 SWAP1 GAS SWAP1 SUB SWAP2 ADD CALLDATALOAD ADD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 SWAP3 POP DUP2 PUSH2 0x2EA2 SWAP3 SWAP9 POP DUP7 DUP7 DUP6 PUSH2 0x3DE6 JUMP JUMPDEST SWAP7 SWAP1 SWAP2 CODESIZE PUSH2 0x2E17 JUMP JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2F07 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393320696E76616C6964207061796D6173746572416E6444617461000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x2FB0 SWAP1 PUSH2 0x2F68 PUSH2 0x2F5B DUP3 PUSH2 0x2067 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0xA0 DUP2 ADD CALLDATALOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0xC0 DUP2 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xE0 DUP2 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x100 DUP2 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x120 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2FE8 JUMPI PUSH2 0x2FDA PUSH2 0xFE9 PUSH2 0xFE3 DUP5 PUSH1 0xA0 SWAP5 PUSH2 0x2FD5 PUSH1 0x14 PUSH2 0x3EA SWAP10 SWAP9 LT ISZERO PUSH2 0x2F00 JUMP JUMPDEST PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 ADD MSTORE JUMP JUMPDEST POP POP PUSH1 0xA0 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x3028 JUMPI PUSH1 0xC0 PUSH1 0x3 JUMPDEST PUSH1 0xFF PUSH1 0x40 DUP5 ADD MLOAD SWAP2 AND PUSH1 0x60 DUP5 ADD MLOAD MUL ADD PUSH1 0x80 DUP4 ADD MLOAD ADD SWAP2 ADD MLOAD MUL SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x1 PUSH2 0x300B JUMP JUMPDEST PUSH2 0x3049 PUSH1 0x40 SWAP3 SWAP6 SWAP5 SWAP4 SWAP6 PUSH1 0x60 DUP4 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x210C JUMP JUMPDEST SWAP5 PUSH1 0x20 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x2F PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x414132332072657665727465643A200000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST DUP2 ADD SUB PUSH1 0xF DUP2 ADD DUP6 MSTORE ADD DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP3 GAS SWAP4 PUSH2 0x314E PUSH1 0x20 DUP4 MLOAD SWAP4 PUSH2 0x30C9 DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP6 PUSH2 0x30E1 PUSH2 0x30DA PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP5 PUSH2 0x358D JUMP JUMPDEST PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x30F9 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST DUP6 DUP1 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 SWAP5 AND ISZERO SWAP9 DUP10 PUSH2 0x332C JUMPI JUMPDEST PUSH1 0x60 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x3A871CDD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 SWAP1 PUSH1 0x4 DUP6 ADD PUSH2 0x3031 JUMP JUMPDEST SUB SWAP4 DUP11 AND SWAP1 CALL DUP3 SWAP2 DUP2 PUSH2 0x330C JUMPI JUMPDEST POP PUSH2 0x3303 JUMPI POP PUSH1 0x1 SWAP1 PUSH2 0x316D PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x32C8 JUMPI JUMPDEST POP PUSH2 0x3274 JUMPI JUMPDEST PUSH2 0x318B JUMPI JUMPDEST POP POP GAS SWAP1 SUB SWAP2 JUMP JUMPDEST PUSH2 0x31A8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x31C3 PUSH2 0x8FB DUP3 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP1 DUP4 GT PUSH2 0x3220 JUMPI PUSH2 0x3219 SWAP3 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST CODESIZE DUP1 PUSH2 0x3183 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x32D0 PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x32DC JUMPI POP PUSH2 0x3178 JUMP JUMPDEST PUSH2 0xD6A SWAP2 PUSH2 0x32EA SWAP2 POP PUSH2 0x3053 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x233B JUMP JUMPDEST SWAP6 POP PUSH2 0x317E SWAP1 POP JUMP JUMPDEST PUSH2 0x3325 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x315C JUMP JUMPDEST SWAP5 POP PUSH2 0x3365 PUSH2 0x8FB PUSH2 0x3351 DUP13 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP12 DUP2 GT ISZERO PUSH2 0x337C JUMPI POP DUP6 PUSH1 0x60 DUP4 JUMPDEST SWAP7 SWAP2 POP POP PUSH2 0x310F JUMP JUMPDEST PUSH1 0x60 DUP8 SWAP2 DUP14 SUB PUSH2 0x3373 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x0 SWAP4 PUSH1 0x0 SWAP4 GAS SWAP5 PUSH2 0x33C3 PUSH1 0x20 DUP4 MLOAD SWAP4 PUSH2 0x33AA DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP6 PUSH2 0x30E1 PUSH2 0x33BB PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP5 DUP13 PUSH2 0x3820 JUMP JUMPDEST SUB SWAP4 DUP11 AND SWAP1 CALL DUP3 SWAP2 DUP2 PUSH2 0x356D JUMPI JUMPDEST POP PUSH2 0x3564 JUMPI POP PUSH1 0x1 SWAP1 PUSH2 0x33E2 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3527 JUMPI JUMPDEST POP PUSH2 0x34D2 JUMPI JUMPDEST PUSH2 0x3401 JUMPI JUMPDEST POP POP POP GAS SWAP1 SUB SWAP2 JUMP JUMPDEST PUSH2 0x341E SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x343A PUSH2 0x8FB DUP5 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 DUP2 DUP4 GT PUSH2 0x3485 JUMPI POP DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND SWAP2 SWAP1 SUB PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x33F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x352F PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x353B JUMPI POP PUSH2 0x33ED JUMP JUMPDEST DUP7 SWAP2 PUSH2 0x3547 SWAP2 POP PUSH2 0x3053 JUMP JUMPDEST SWAP1 PUSH2 0xD6A PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x2353 JUMP JUMPDEST SWAP7 POP PUSH2 0x33F3 SWAP1 POP JUMP JUMPDEST PUSH2 0x3586 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x33D1 JUMP JUMPDEST SWAP1 SWAP2 DUP1 PUSH2 0x3599 JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 DUP4 EXTCODESIZE PUSH2 0x37CC JUMPI PUSH1 0x60 DUP4 MLOAD ADD MLOAD PUSH1 0x40 MLOAD SWAP1 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 DUP3 DUP1 PUSH2 0x35EB DUP8 DUP8 PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 PUSH32 0x0 AND SWAP1 CALL SWAP2 DUP3 ISZERO PUSH2 0x37BF JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x379F JUMPI JUMPDEST POP DUP1 DUP3 AND SWAP6 DUP7 ISZERO PUSH2 0x374B JUMPI AND DUP1 SWAP6 SUB PUSH2 0x36F7 JUMPI EXTCODESIZE ISZERO PUSH2 0x36A3 JUMPI PUSH2 0xFE9 PUSH2 0xFE3 PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D SWAP4 PUSH2 0x3677 SWAP4 PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP4 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x37B8 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x362D JUMP JUMPDEST PUSH2 0x37C7 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x3625 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP2 PUSH2 0x382F JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP3 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP4 DUP5 EXTCODESIZE PUSH2 0x3A65 JUMPI PUSH1 0x60 DUP5 MLOAD ADD MLOAD PUSH1 0x40 MLOAD SWAP1 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 DUP3 DUP1 PUSH2 0x3881 DUP9 DUP9 PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 PUSH32 0x0 AND SWAP1 CALL SWAP2 DUP3 ISZERO PUSH2 0x3A58 JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x3A38 JUMPI JUMPDEST POP DUP1 DUP3 AND SWAP7 DUP8 ISZERO PUSH2 0x39E3 JUMPI AND DUP1 SWAP7 SUB PUSH2 0x398E JUMPI EXTCODESIZE ISZERO PUSH2 0x3941 JUMPI POP PUSH2 0xFE9 PUSH2 0xFE3 PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D SWAP4 PUSH2 0x390E SWAP4 PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP4 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3829 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x3A51 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x38C3 JUMP JUMPDEST PUSH2 0x3A60 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x38BB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST ISZERO PUSH2 0x3AB9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141343120746F6F206C6974746C6520766572696669636174696F6E47617300 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x321 JUMPI DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x321 JUMPI DUP4 ADD SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP2 MLOAD SWAP2 PUSH2 0x3B34 DUP4 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x3B42 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP4 DUP4 MSTORE PUSH1 0x20 DUP5 DUP4 ADD ADD GT PUSH2 0x321 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x3B62 SWAP2 DUP5 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x2F PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x414133332072657665727465643A200000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST SWAP4 SWAP2 SWAP3 PUSH1 0x60 SWAP5 PUSH1 0x0 SWAP5 PUSH1 0x0 SWAP4 DUP1 MLOAD SWAP3 PUSH2 0x3BDE PUSH1 0xA0 DUP11 DUP7 ADD MLOAD SWAP6 PUSH2 0x3BD0 DUP9 DUP9 GT PUSH2 0x3AB2 JUMP JUMPDEST ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x3BFC DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x3C18 PUSH2 0x8FB DUP8 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP7 DUP6 DUP9 LT PUSH2 0x3D92 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP11 SWAP9 SWAP5 PUSH2 0x3C81 DUP11 SWAP7 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH2 0x3CBA SWAP15 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST ADD MLOAD SWAP5 PUSH1 0x40 MLOAD SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP4 PUSH32 0xF465C77E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x3031 JUMP JUMPDEST SUB SWAP6 AND SWAP2 SUB CALL SWAP1 DUP2 DUP4 SWAP2 DUP5 SWAP4 PUSH2 0x3D6C JUMPI JUMPDEST POP PUSH2 0x3D65 JUMPI POP POP PUSH1 0x1 SWAP1 PUSH2 0x3CDD PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3D43 JUMPI JUMPDEST POP PUSH2 0x3CEF JUMPI JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x3D4B PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x3D57 JUMPI POP PUSH2 0x3CE8 JUMP JUMPDEST PUSH2 0xD6A SWAP2 PUSH2 0x32EA SWAP2 POP PUSH2 0x3B68 JUMP JUMPDEST SWAP5 POP SWAP3 POP POP JUMP JUMPDEST SWAP1 SWAP3 POP PUSH2 0x3D8B SWAP2 POP RETURNDATASIZE DUP1 DUP6 DUP4 RETURNDATACOPY PUSH2 0x3D83 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AFD JUMP JUMPDEST SWAP2 CODESIZE PUSH2 0x3CCB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH1 0x60 SWAP6 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP4 DUP3 MLOAD SWAP1 PUSH2 0x3E0D PUSH1 0xA0 DUP12 DUP5 ADD MLOAD SWAP4 PUSH2 0x3BD0 DUP5 DUP7 GT PUSH2 0x3AB2 JUMP JUMPDEST SWAP4 PUSH2 0x3E2B DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3E46 PUSH2 0x8FB DUP3 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP8 DUP2 LT PUSH2 0x3F7B JUMPI SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP11 SWAP9 SWAP7 SWAP4 SWAP5 PUSH2 0x3C81 DUP11 SWAP7 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 PUSH2 0x3EB3 SWAP15 SWAP13 SWAP11 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST SUB SWAP6 AND SWAP2 SUB CALL SWAP1 DUP2 DUP4 SWAP2 DUP5 SWAP4 PUSH2 0x3F5D JUMPI JUMPDEST POP PUSH2 0x3F55 JUMPI POP POP PUSH1 0x1 SWAP1 PUSH2 0x3ED6 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3F36 JUMPI JUMPDEST POP PUSH2 0x3EE9 JUMPI POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x3F3E PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x3F4A JUMPI POP PUSH2 0x3EE1 JUMP JUMPDEST PUSH2 0x3547 SWAP3 POP POP PUSH2 0x3B68 JUMP JUMPDEST SWAP6 POP SWAP4 POP POP POP JUMP JUMPDEST SWAP1 SWAP3 POP PUSH2 0x3F74 SWAP2 POP RETURNDATASIZE DUP1 DUP6 DUP4 RETURNDATACOPY PUSH2 0x3D83 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP2 CODESIZE PUSH2 0x3EC4 JUMP JUMPDEST PUSH2 0xD6A DUP11 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x3FDA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x4027 PUSH1 0x40 SWAP2 PUSH1 0x2 DUP7 MSTORE PUSH1 0x60 PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x3FDA JUMPI PUSH1 0x40 SWAP2 PUSH2 0x4027 SWAP2 DUP7 MSTORE PUSH1 0x60 PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x36 PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x4141353020706F73744F702072657665727465643A2000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST DUP2 ADD SUB PUSH1 0x16 DUP2 ADD DUP6 MSTORE ADD DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 GAS SWAP4 PUSH1 0x0 SWAP2 DUP1 MLOAD SWAP2 PUSH2 0x40BC DUP4 PUSH2 0x47AA JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP6 PUSH2 0x40D3 DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 DUP5 DUP2 AND SWAP1 DUP2 PUSH2 0x41F5 JUMPI POP POP POP PUSH2 0x40FA DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP9 JUMPDEST GAS SWAP1 SUB ADD SWAP4 DUP5 MUL SWAP8 PUSH1 0x40 DUP5 ADD SWAP1 DUP10 DUP3 MLOAD LT PUSH2 0x41A1 JUMPI PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 PUSH2 0x4146 PUSH1 0x20 SWAP3 DUP13 PUSH2 0x419C SWAP6 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST ADD MLOAD SWAP5 DUP10 PUSH1 0x20 PUSH2 0x416E PUSH2 0x4160 DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP5 ADD MLOAD SWAP8 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP11 AND SWAP9 DUP6 SWAP1 SWAP5 SWAP4 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x80 DUP4 ADD SWAP7 DUP4 MSTORE ISZERO ISZERO PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP11 SWAP2 DUP1 MLOAD PUSH2 0x4205 JUMPI JUMPDEST POP POP PUSH2 0x40FC JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 SWAP10 POP SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x4313 JUMPI SWAP2 DUP10 SWAP2 DUP10 DUP4 PUSH2 0x4258 SWAP6 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP7 DUP3 SWAP6 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP13 MUL SWAP1 PUSH1 0x4 DUP5 ADD PUSH2 0x4009 JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x4300 JUMPI JUMPDEST POP PUSH2 0x42FB JUMPI PUSH1 0x1 PUSH2 0x4271 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x42DC JUMPI JUMPDEST PUSH2 0x4288 JUMPI JUMPDEST CODESIZE DUP1 PUSH2 0x41FE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x42E4 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x42EF JUMPI POP PUSH2 0x427C JUMP JUMPDEST PUSH2 0x32EA PUSH2 0xD6A SWAP2 PUSH2 0x4053 JUMP JUMPDEST PUSH2 0x4281 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x430D SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x4262 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST SWAP4 SWAP3 SWAP2 GAS SWAP1 PUSH1 0x0 SWAP3 DUP1 MLOAD SWAP1 PUSH2 0x432B DUP3 PUSH2 0x47AA JUMP JUMPDEST SWAP4 PUSH1 0xA0 DUP4 ADD SWAP7 PUSH2 0x4342 DUP9 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 SWAP1 DUP7 DUP2 AND SWAP1 DUP2 PUSH2 0x4405 JUMPI POP POP POP PUSH2 0x4369 DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP2 JUMPDEST GAS SWAP1 SUB ADD SWAP5 DUP6 MUL SWAP9 PUSH1 0x40 DUP4 ADD SWAP1 DUP11 DUP3 MLOAD LT PUSH2 0x43B8 JUMPI POP PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 SWAP4 SWAP3 PUSH2 0x4146 PUSH2 0x419C SWAP4 DUP13 PUSH1 0x20 SWAP5 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP4 SWAP2 DUP1 MLOAD PUSH2 0x4415 JUMPI JUMPDEST POP POP PUSH2 0x436B JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD PUSH1 0x0 SWAP11 POP SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x4522 JUMPI SWAP2 DUP11 SWAP2 DUP11 DUP4 PUSH2 0x4468 SWAP6 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP7 DUP3 SWAP6 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP13 MUL SWAP1 PUSH1 0x4 DUP5 ADD PUSH2 0x4009 JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x450F JUMPI JUMPDEST POP PUSH2 0x450A JUMPI PUSH1 0x1 PUSH2 0x4481 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x44ED JUMPI JUMPDEST PUSH2 0x4498 JUMPI JUMPDEST CODESIZE DUP1 PUSH2 0x440E JUMP JUMPDEST PUSH2 0xD6A DUP12 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x44F5 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x4500 JUMPI POP PUSH2 0x448C JUMP JUMPDEST PUSH2 0x3547 DUP14 SWAP2 PUSH2 0x4053 JUMP JUMPDEST PUSH2 0x4491 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x451C SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x4472 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP2 GAS SWAP5 DUP1 MLOAD SWAP2 PUSH2 0x4538 DUP4 PUSH2 0x47AA JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP6 PUSH2 0x454F DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP2 DUP6 AND SWAP2 DUP3 PUSH2 0x4610 JUMPI POP POP POP PUSH2 0x4575 DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP9 JUMPDEST GAS SWAP1 SUB ADD SWAP4 DUP5 MUL SWAP8 PUSH1 0x40 DUP5 ADD SWAP1 DUP10 DUP3 MLOAD LT PUSH2 0x41A1 JUMPI PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 PUSH2 0x45C1 PUSH1 0x20 SWAP3 DUP13 PUSH2 0x419C SWAP6 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST PUSH2 0x45CA DUP9 PUSH2 0x3FD0 JUMP JUMPDEST ADD MLOAD SWAP5 DUP10 PUSH1 0x20 PUSH2 0x45E4 PUSH2 0x4160 DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP5 ADD MLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP9 ISZERO PUSH1 0x20 DUP3 ADD MSTORE SWAP8 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE SWAP1 DUP3 AND SWAP6 SWAP1 SWAP2 AND SWAP4 SWAP1 DUP2 SWAP1 PUSH1 0x80 DUP3 ADD SWAP1 JUMP JUMPDEST SWAP11 SWAP2 DUP2 MLOAD PUSH2 0x4620 JUMPI JUMPDEST POP POP PUSH2 0x4577 JUMP JUMPDEST DUP8 DUP5 MUL PUSH2 0x462C DUP11 PUSH2 0x3FD0 JUMP JUMPDEST PUSH1 0x2 DUP11 EQ PUSH2 0x46B7 JUMPI PUSH1 0x60 DUP7 ADD MLOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH2 0x467F SWAP4 PUSH1 0x0 DUP1 SWAP5 DUP14 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x402C JUMP JUMPDEST SUB SWAP4 CALL DUP1 ISZERO PUSH2 0x46AA JUMPI JUMPDEST PUSH2 0x4697 JUMPI JUMPDEST POP JUMPDEST CODESIZE DUP1 PUSH2 0x4619 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x46A4 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x468E JUMP JUMPDEST PUSH2 0x46B2 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x4689 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH2 0x4702 SWAP4 PUSH1 0x0 DUP1 SWAP5 DUP14 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x402C JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x4797 JUMPI JUMPDEST POP PUSH2 0x4792 JUMPI PUSH1 0x1 PUSH2 0x471B PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x477F JUMPI JUMPDEST ISZERO PUSH2 0x4690 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x4787 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x42EF JUMPI POP PUSH2 0x4726 JUMP JUMPDEST PUSH2 0x4690 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x47A4 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x470C JUMP JUMPDEST PUSH1 0xE0 PUSH1 0xC0 DUP3 ADD MLOAD SWAP2 ADD MLOAD DUP1 DUP3 EQ PUSH2 0x47CE JUMPI BASEFEE ADD DUP1 DUP3 LT ISZERO PUSH2 0x47C9 JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x47DF DUP3 PUSH2 0x501 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 DUP3 DUP2 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x47F9 PUSH2 0x47D2 JUMP JUMPDEST POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 PUSH1 0xA0 SHR AND DUP1 ISZERO PUSH2 0x4838 JUMPI JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x481B DUP5 PUSH2 0x501 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0xD0 SHR PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST POP DUP1 PUSH2 0x480E JUMP JUMPDEST PUSH2 0x4854 PUSH2 0x485A SWAP2 PUSH2 0x484E PUSH2 0x47D2 JUMP JUMPDEST POP PUSH2 0x47F1 JUMP JUMPDEST SWAP2 PUSH2 0x47F1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 DUP3 MLOAD AND SWAP3 DUP4 ISZERO PUSH2 0x48D9 JUMPI JUMPDEST PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 SWAP2 DUP3 PUSH1 0x40 DUP2 PUSH1 0x20 DUP6 ADD MLOAD AND SWAP4 ADD MLOAD AND SWAP4 DUP4 PUSH1 0x40 DUP2 PUSH1 0x20 DUP5 ADD MLOAD AND SWAP3 ADD MLOAD AND SWAP1 DUP1 DUP5 LT PUSH2 0x48D1 JUMPI JUMPDEST POP DUP1 DUP6 GT PUSH2 0x48C9 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP6 PUSH2 0x48B7 DUP8 PUSH2 0x501 JUMP JUMPDEST AND DUP6 MSTORE AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST SWAP4 POP CODESIZE PUSH2 0x48A9 JUMP JUMPDEST SWAP3 POP CODESIZE PUSH2 0x48A0 JUMP JUMPDEST DUP2 MLOAD DUP2 AND SWAP4 POP PUSH2 0x4870 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH8 0xFFFFFFFFFFFFFFFF PUSH2 0x4933 DUP3 PUSH1 0x40 SHR PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 DUP3 SLOAD SWAP3 PUSH2 0x4940 DUP5 PUSH2 0x1F8B JUMP JUMPDEST SWAP1 SSTORE AND EQ SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x4958 PUSH2 0x25AA JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD PUSH1 0x78 SHR AND DUP6 MSTORE ADD SLOAD AND PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x3EA CALLER PUSH2 0x4A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 DUP4 ADD DUP1 SWAP4 GT PUSH2 0x4A55 JUMPI JUMPDEST DUP1 DUP4 GT PUSH2 0x4A11 JUMPI PUSH2 0x3EA SWAP3 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6465706F736974206F766572666C6F7700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x4A5D PUSH2 0x1CBC JUMP JUMPDEST PUSH2 0x49CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 PUSH2 0x4A75 CALLVALUE DUP3 PUSH2 0x4998 JUMP JUMPDEST AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 PUSH1 0x20 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG2 JUMP JUMPDEST ISZERO PUSH2 0x4AC8 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374207370656369667920756E7374616B652064656C6179000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4B13 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F7420646563726561736520756E7374616B652074696D6500000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4B5E JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207374616B65207370656369666965640000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4BA9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7374616B65206F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH6 0xFFFFFFFFFFFF PUSH1 0x80 PUSH1 0x1 PUSH2 0x3EA SWAP5 PUSH2 0x4C4D PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 MLOAD AND DUP3 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD ISZERO ISZERO PUSH15 0xFF0000000000000000000000000000 DUP3 SLOAD SWAP2 PUSH1 0x70 SHL AND DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR DUP4 SSTORE PUSH32 0xFFFFFF000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH29 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 PUSH1 0x40 DUP10 ADD MLOAD PUSH1 0x78 SHL AND SWAP3 AND OR OR DUP2 SSTORE ADD SWAP3 PUSH4 0xFFFFFFFF PUSH1 0x60 DUP3 ADD MLOAD AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 DUP6 SLOAD AND OR DUP5 SSTORE ADD MLOAD AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF PUSH10 0xFFFFFFFFFFFF00000000 DUP4 SLOAD SWAP3 PUSH1 0x20 SHL AND SWAP2 AND OR SWAP1 SSTORE JUMP JUMPDEST ISZERO PUSH2 0x4D58 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x616C726561647920756E7374616B696E67000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP1 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP1 SWAP5 AND SWAP2 AND ADD SWAP2 DUP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST ISZERO PUSH2 0x4DBD JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207374616B6520746F207769746864726177000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E08 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742063616C6C20756E6C6F636B5374616B652829206669727374000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E53 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5374616B65207769746864726177616C206973206E6F74206475650000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E9E JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F207769746864726177207374616B650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4EE9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F2077697468647261770000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP2 DUP3 CALLDATACOPY KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 DUP4 DUP1 SWAP4 PUSH1 0x20 DUP5 MLOAD SWAP5 ADD SWAP3 CALL SWAP1 JUMP JUMPDEST RETURNDATASIZE PUSH2 0x800 DUP1 DUP3 GT PUSH2 0x4F71 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP2 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP1 JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x4F56 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB9 PUSH30 0x7AA061056A5E9C6AD974BA3AD5C6B5A83463963E9D403739FD7B43564016 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x16 JUMPI PUSH2 0x210 SWAP1 DUP2 PUSH2 0x1C DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x570E1A36 EQ PUSH2 0x28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP3 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC9 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 DUP4 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP5 ADD ADD GT PUSH2 0xC9 JUMPI PUSH2 0xC5 PUSH2 0x9E DUP5 PUSH1 0x24 DUP6 ADD PUSH2 0xFC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST DUP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x14 GT PUSH2 0x1BB JUMPI PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC DUP3 ADD DUP4 DUP2 GT PUSH2 0x1CD JUMPI JUMPDEST PUSH1 0x40 MLOAD SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0xB DUP8 ADD AND ADD AND DUP6 ADD SWAP1 DUP6 DUP3 LT SWAP1 DUP3 GT OR PUSH2 0x1C0 JUMPI JUMPDEST PUSH1 0x40 MSTORE DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 CALLDATASIZE DUP5 DUP5 ADD GT PUSH2 0x1BB JUMPI PUSH1 0x20 SWAP5 PUSH1 0x0 PUSH1 0xC DUP2 SWAP7 DUP3 SWAP5 PUSH1 0x14 DUP9 ADD DUP8 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP3 CALLDATALOAD PUSH1 0x60 SHR GAS CALL SWAP1 PUSH1 0x0 MLOAD SWAP2 ISZERO PUSH2 0x1B5 JUMPI JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C8 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x1D5 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x13A JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATASIZE 0xA5 0xA8 0xD5 CODESIZE 0xD8 DUP4 MSIZE STOP PUSH24 0x15214F81C5BD42079BAC3C4D3005EA4A12098B5B92E96473 PUSH16 0x6C634300081100330000000000000000 ","sourceMap":"596:27500:1:-:0;;;;;;;1716:1:0;1821:22;1716:1;778:19:1;;;;-1:-1:-1;;;;;778:19:1;;;;;;;;;;;;;;;-1:-1:-1;778:19:1;;;;;;;596:27500;;;;;;;;778:19;596:27500;;;;;;;;;;;;;;;;778:19;596:27500;;;-1:-1:-1;596:27500:1;;;;;778:19;596:27500;;;-1:-1:-1;596:27500:1;;;;;-1:-1:-1;596:27500:1;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode":{"entryPoint":3857,"id":null,"parameterSlots":2,"returnSlots":0},"abi_decode_address":{"entryPoint":1017,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_address_16604":{"entryPoint":989,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_address_16609":{"entryPoint":1004,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_address_fromMemory":{"entryPoint":10084,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_array_struct_UserOperation_calldata_dyn_calldatat_address_payable":{"entryPoint":1882,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_available_length_bytes":{"entryPoint":1464,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":1519,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytest_uint256_fromMemory":{"entryPoint":15101,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_struct_UserOperation_calldata":{"entryPoint":4555,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_struct_UserOperation_calldata_ptr":{"entryPoint":4540,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_uint192":{"entryPoint":806,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_uint256_fromMemory":{"entryPoint":7054,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_payable_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_to_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_address_uint256_bytes32_bytes32_uint256_uint256_uint256_uint256_uint256_bytes32":{"entryPoint":null,"id":null,"parameterSlots":11,"returnSlots":1},"abi_encode_array_struct_UserOperation_calldata_dyn_calldata_bytes_calldata":{"entryPoint":8676,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes":{"entryPoint":7137,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":10105,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_calldata_address_bytes_calldata":{"entryPoint":10122,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_bytes_calldata_struct_UserOpInfo_bytes":{"entryPoint":7174,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes_calldata_to_bytes":{"entryPoint":7069,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_calldata_to_bytes_nonPadded_inplace":{"entryPoint":8870,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_enum_PostOpMode_bytes_uint256":{"entryPoint":16428,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_enum_PostOpMode_bytes_uint256_25581":{"entryPoint":16393,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_stringliteral_71b8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_stringliteral_c5d2":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_stringliteral_d82b":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_struct_DepositInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_ReturnInfo":{"entryPoint":9780,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_ReturnInfo_struct_StakeInfo_struct_StakeInfo_struct_StakeInfo":{"entryPoint":9994,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_struct_ReturnInfo_struct_StakeInfo_struct_StakeInfo_struct_StakeInfo_struct_AggregatorStakeInfo":{"entryPoint":9861,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_struct_StakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_struct_UserOperation_calldata":{"entryPoint":8460,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_UserOperation_calldata_bytes32_uint256":{"entryPoint":12337,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_bool_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_uint256_bytes":{"entryPoint":9043,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_uint256_bytes_25583":{"entryPoint":9019,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_15a8":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_1a6d":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_1a6d_25573":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_230f":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_2674":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_423a":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_423a_32136":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_4f6a":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_6d9d":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_6d9d_25585":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_7d1d":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_7d1d_25575":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_90de":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_90de_25584":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_a46d":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_a46d_38109":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_af9d":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_af9d_32135":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_b1ed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_b1ed_32138":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_b49b":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_bb1e":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_bb1e_38111":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_cf8e":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_cf8e_38110":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_d8c5":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_d8c5_32134":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_stringliteral_eb8a":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_uint256_stringliteral_eb8a_25570":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_uint256_uint256_uint48_uint48_bool_bytes":{"entryPoint":8884,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_uint256_uint32":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_uint48":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_array_struct_UserOperation_calldata_dyn_calldata":{"entryPoint":8211,"id":null,"parameterSlots":2,"returnSlots":2},"access_calldata_tail_bytes_calldata":{"entryPoint":6973,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_and_zero_memory_array_array_struct_UserOpInfo_dyn":{"entryPoint":6427,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_and_zero_memory_struct_struct_StakeInfo":{"entryPoint":9642,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_and_zero_memory_struct_struct_UserOpInfo":{"entryPoint":6296,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_and_zero_memory_struct_struct_ValidationData":{"entryPoint":18386,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory":{"entryPoint":1344,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_16636":{"entryPoint":1357,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_16637":{"entryPoint":1389,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_UserOpInfo_dyn":{"entryPoint":6257,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":1421,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_access_bytes_calldata":{"entryPoint":8380,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_access_struct_UserOperation_calldata_dyn_calldata":{"entryPoint":6588,"id":null,"parameterSlots":3,"returnSlots":1},"calldata_array_index_access_struct_UserOpsPerAggregator_calldata_dyn_calldata":{"entryPoint":8133,"id":null,"parameterSlots":3,"returnSlots":1},"calldata_array_index_range_access_bytes_calldata":{"entryPoint":9698,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_bytes_calldata_16635":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"checked_add_uint256":{"entryPoint":7425,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_uint48":{"entryPoint":19868,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":7404,"id":null,"parameterSlots":2,"returnSlots":1},"cleanup_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_uint112":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_uint32":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_uint48":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes20_to_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes_to_fixedbytes_from_bytes_calldata_to_bytes20":{"entryPoint":9712,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":7102,"id":null,"parameterSlots":3,"returnSlots":0},"copy_struct_to_storage_from_struct_DepositInfo_to_struct_DepositInfo":{"entryPoint":19437,"id":null,"parameterSlots":2,"returnSlots":0},"external_fun_SIG_VALIDATION_FAILED":{"entryPoint":3868,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_addStake":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_balanceOf":{"entryPoint":3778,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_depositTo":{"entryPoint":4631,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_deposits":{"entryPoint":6118,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getDepositInfo":{"entryPoint":3485,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getNonce":{"entryPoint":2523,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getSenderAddress":{"entryPoint":4256,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getUserOpHash":{"entryPoint":4598,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_handleAggregatedOps":{"entryPoint":2677,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_handleOps":{"entryPoint":1972,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_incrementNonce":{"entryPoint":845,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_innerHandleOp":{"entryPoint":1565,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_nonceSequenceNumber":{"entryPoint":1028,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_simulateHandleOp":{"entryPoint":5330,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_simulateValidation":{"entryPoint":5647,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_unlockStake":{"entryPoint":4664,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_validateSenderAndPaymaster":{"entryPoint":3897,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_withdrawStake":{"entryPoint":4990,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_withdrawTo":{"entryPoint":2190,"id":null,"parameterSlots":0,"returnSlots":0},"extract_from_storage_value_offsett_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_from_storage_value_offsett_uint112":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_from_storage_value_offsett_uint48":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_returndata":{"entryPoint":6749,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":1309,"id":null,"parameterSlots":2,"returnSlots":0},"finalize_allocation_16602":{"entryPoint":1191,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_16603":{"entryPoint":1232,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_16621":{"entryPoint":1261,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_16622":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_16671":{"entryPoint":1281,"id":null,"parameterSlots":1,"returnSlots":0},"fun":{"entryPoint":18831,"id":2731,"parameterSlots":0,"returnSlots":0},"fun_call":{"entryPoint":20280,"id":3706,"parameterSlots":3,"returnSlots":1},"fun_calldataKeccak":{"entryPoint":20269,"id":2515,"parameterSlots":2,"returnSlots":1},"fun_compensate":{"entryPoint":6797,"id":132,"parameterSlots":2,"returnSlots":0},"fun_copyUserOpToMemory":{"entryPoint":12107,"id":989,"parameterSlots":2,"returnSlots":0},"fun_createSenderIfNeeded":{"entryPoint":14368,"id":1295,"parameterSlots":4,"returnSlots":0},"fun_createSenderIfNeeded_32132":{"entryPoint":13709,"id":1295,"parameterSlots":3,"returnSlots":0},"fun_depositTo":{"entryPoint":19042,"id":2799,"parameterSlots":1,"returnSlots":0},"fun_executeUserOp":{"entryPoint":7762,"id":214,"parameterSlots":3,"returnSlots":1},"fun_executeUserOp_16632":{"entryPoint":7438,"id":214,"parameterSlots":2,"returnSlots":1},"fun_getRequiredPrefund":{"entryPoint":12275,"id":1195,"parameterSlots":1,"returnSlots":1},"fun_getReturnData":{"entryPoint":20298,"id":3741,"parameterSlots":0,"returnSlots":1},"fun_getStakeInfo":{"entryPoint":18759,"id":2708,"parameterSlots":1,"returnSlots":1},"fun_getUserOpGasPrice":{"entryPoint":18346,"id":2236,"parameterSlots":1,"returnSlots":1},"fun_getUserOpHash":{"entryPoint":9374,"id":886,"parameterSlots":1,"returnSlots":1},"fun_getValidationData":{"entryPoint":11018,"id":1836,"parameterSlots":1,"returnSlots":2},"fun_handlePostOp":{"entryPoint":16551,"id":2200,"parameterSlots":3,"returnSlots":1},"fun_handlePostOp_16644":{"entryPoint":17175,"id":2200,"parameterSlots":4,"returnSlots":1},"fun_handlePostOp_16652":{"entryPoint":17702,"id":2200,"parameterSlots":4,"returnSlots":1},"fun_incrementDeposit":{"entryPoint":18840,"id":2773,"parameterSlots":2,"returnSlots":0},"fun_innerHandleOp":{"entryPoint":9066,"id":861,"parameterSlots":4,"returnSlots":1},"fun_intersectTimeRange":{"entryPoint":18495,"id":2430,"parameterSlots":2,"returnSlots":1},"fun_nonReentrantAfter":{"entryPoint":null,"id":52,"parameterSlots":0,"returnSlots":0},"fun_nonReentrantBefore":{"entryPoint":6666,"id":44,"parameterSlots":0,"returnSlots":0},"fun_numberMarker":{"entryPoint":null,"id":2276,"parameterSlots":0,"returnSlots":0},"fun_parseValidationData":{"entryPoint":18417,"id":2345,"parameterSlots":1,"returnSlots":1},"fun_simulationOnlyValidations":{"entryPoint":10317,"id":1351,"parameterSlots":1,"returnSlots":0},"fun_validateAccountAndPaymasterValidationData":{"entryPoint":10976,"id":1788,"parameterSlots":4,"returnSlots":0},"fun_validateAccountAndPaymasterValidationData_16617":{"entryPoint":10553,"id":1788,"parameterSlots":3,"returnSlots":0},"fun_validateAccountPrepayment":{"entryPoint":13191,"id":1584,"parameterSlots":4,"returnSlots":2},"fun_validateAccountPrepayment_25572":{"entryPoint":12455,"id":1584,"parameterSlots":3,"returnSlots":2},"fun_validateAndUpdateNonce":{"entryPoint":18660,"id":2604,"parameterSlots":2,"returnSlots":1},"fun_validatePaymasterPrepayment":{"entryPoint":15846,"id":1717,"parameterSlots":5,"returnSlots":2},"fun_validatePaymasterPrepayment_25574":{"entryPoint":15276,"id":1717,"parameterSlots":4,"returnSlots":2},"fun_validatePrepayment":{"entryPoint":11603,"id":2011,"parameterSlots":3,"returnSlots":2},"fun_validatePrepayment_16631":{"entryPoint":11172,"id":2011,"parameterSlots":2,"returnSlots":2},"increment_uint256":{"entryPoint":8075,"id":null,"parameterSlots":1,"returnSlots":1},"mapping_index_access_mapping_address_mapping_uint192_uint256__of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"mapping_index_access_mapping_address_mapping_uint192_uint256_of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"mapping_index_access_mapping_uint192_uint256_of_uint192":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"memory_array_index_access_struct_UserOpInfo_dyn":{"entryPoint":6554,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x11":{"entryPoint":7356,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":6506,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":1143,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_calldatat_contract_IAggregator":{"entryPoint":8295,"id":null,"parameterSlots":1,"returnSlots":1},"read_from_memoryt_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"read_from_storage_split_offset_uint112":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"require_helper_stringliteral":{"entryPoint":19894,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_163f":{"entryPoint":19287,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_1dfd":{"entryPoint":20119,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_2454":{"entryPoint":11097,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_5cd6":{"entryPoint":20044,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_6a64":{"entryPoint":19362,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_845e":{"entryPoint":15026,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_9973":{"entryPoint":19969,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_a34e":{"entryPoint":20194,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_b778":{"entryPoint":19137,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_be41":{"entryPoint":19212,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_bed5":{"entryPoint":12032,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_bf4e":{"entryPoint":8944,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_c7b8":{"entryPoint":8305,"id":null,"parameterSlots":1,"returnSlots":0},"require_helper_stringliteral_eaba":{"entryPoint":19793,"id":null,"parameterSlots":1,"returnSlots":0},"return_data_selector":{"entryPoint":10176,"id":null,"parameterSlots":0,"returnSlots":1},"revert_forward":{"entryPoint":7343,"id":null,"parameterSlots":0,"returnSlots":0},"string_concat_stringliteral_64c3_string":{"entryPoint":12371,"id":null,"parameterSlots":1,"returnSlots":1},"string_concat_stringliteral_89cf_string":{"entryPoint":16467,"id":null,"parameterSlots":1,"returnSlots":1},"string_concat_stringliteral_d505_string":{"entryPoint":15208,"id":null,"parameterSlots":1,"returnSlots":1},"try_decode_error_message":{"entryPoint":10206,"id":null,"parameterSlots":0,"returnSlots":1},"update_storage_value_offsett_bool_to_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"update_storage_value_offsett_uint112_to_uint112":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"update_storage_value_offsett_uint112_to_uint112_16630":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"update_storage_value_offsett_uint32_to_uint32":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"update_storage_value_offsett_uint48_to_uint48":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"update_storage_value_offsett_uint48_to_uint48_16629":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"validator_assert_enum_PostOpMode":{"entryPoint":16336,"id":null,"parameterSlots":1,"returnSlots":0},"validator_revert_address":{"entryPoint":972,"id":null,"parameterSlots":1,"returnSlots":0},"write_to_memory_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_bool":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_bool_16592":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"write_to_memory_uint112":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_uint32":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_uint48":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"83":[{"length":32,"start":4381},{"length":32,"start":13819},{"length":32,"start":14481}]},"linkReferences":{},"object":"60806040526004361015610023575b361561001957600080fd5b61002161498f565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c6117e6565b61000e565b5061010c61160f565b5061010c6114d2565b5061010c61137e565b5061010c611238565b5061010c611217565b5061010c6111f6565b5061010c6110a0565b5061010c610f39565b5061010c610f1c565b5061010c610ec2565b5061010c610d9d565b5061010c610a75565b5061010c6109db565b5061010c61088e565b5061010c6107b4565b5061010c61061d565b5061010c610404565b5061010c61034d565b5060206003193601126103215760043563ffffffff81168082036103215761031c7fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0191610246610216336001600160a01b03166000526000602052604060002090565b91610222811515614ac1565b61023f610236600185015463ffffffff1690565b63ffffffff1690565b1115614b0c565b54926102fe6dffffffffffffffffffffffffffff946102c961026d34888460781c16611d01565b96610279881515614b57565b61028581891115614ba2565b6102a981610291610540565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526102f9336001600160a01b03166000526000602052604060002090565b614bed565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361032157565b50346103215760206003193601126103215760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610321576103be9033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6103c88154611f8b565b9055005b6001600160a01b0381160361032157565b602435906103ea826103cc565b565b60c435906103ea826103cc565b35906103ea826103cc565b503461032157604060031936011261032157602061046e600435610427816103cc565b6001600160a01b03610437610326565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176104c357604052565b6104cb610477565b604052565b610100810190811067ffffffffffffffff8211176104c357604052565b67ffffffffffffffff81116104c357604052565b6060810190811067ffffffffffffffff8211176104c357604052565b90601f601f19910116810190811067ffffffffffffffff8211176104c357604052565b604051906103ea826104a7565b6040519060c0820182811067ffffffffffffffff8211176104c357604052565b604051906040820182811067ffffffffffffffff8211176104c357604052565b601f19601f60209267ffffffffffffffff81116105ab575b01160190565b6105b3610477565b6105a5565b9291926105c48261058d565b916105d2604051938461051d565b829481845281830111610321578281602093846000960137010152565b9181601f840112156103215782359167ffffffffffffffff8311610321576020838186019501011161032157565b5034610321576101c06003193601126103215767ffffffffffffffff6004358181116103215736602382011215610321576106629036906024816004013591016105b8565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610321576101006040519161069f836104a7565b12610321576040516106b0816104d0565b6106b86103dd565b815260443560208201526064356040820152608435606082015260a43560808201526106e26103ec565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a435918211610321576107569261073e6107469336906004016105ef565b92909161236a565b6040519081529081906020820190565b0390f35b9060406003198301126103215760043567ffffffffffffffff9283821161032157806023830112156103215781600401359384116103215760248460051b830101116103215760240191906024356107b1816103cc565b90565b5034610321576107c33661075a565b6107ce929192611a0a565b6107d78361191b565b60005b84811061085757506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b8583106108275761081d8585611a8d565b6100216001600255565b90919360019061084d61083b8789876119bc565b610845888661199a565b519088611e52565b019401919061080c565b8061088561087e61086c60019486989661199a565b51610878848a886119bc565b84612d53565b9083612939565b019290926107da565b5034610321576040600319360112610321576004356108ac816103cc565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff815416928383116109975784836001600160a01b03829593610947849661090e6108fb87986109949c611cec565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b604080516001600160a01b03831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af161098e611a5d565b50614ee2565b80f35b606460405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103215760406003193601126103215760206004356109fb816103cc565b6001600160a01b03610a0b610326565b911660005260018252610a468160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461032157610a843661075a565b610a8c611a0a565b6000805b838210610c5957610aa1915061191b565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610bcc57505060008093815b818110610b105761081d868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611a8d565b610b67610b1e82848a611fc5565b610b3c610b30610b3060208401612067565b6001600160a01b031690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612013565b906000915b808310610b8457505050610b7f90611f8b565b610ad9565b90919497610bbf610bb9610bc592610bb38c8b610bac82610ba68e8b8d6119bc565b9261199a565b5191611e52565b90611d01565b99611f8b565b95611f8b565b9190610b6c565b610bd7818688611fc5565b6020610bef610be68380612013565b92909301612067565b916001600160a01b0360009316905b828410610c175750505050610c1290611f8b565b610aca565b90919294610bbf81610c4c85610c45610c33610c51968d61199a565b51610c3f8c8b8a6119bc565b85612d53565b908b612ae0565b611f8b565b929190610bfe565b610c64828587611fc5565b90610c6f8280612013565b92610c7f610b3060208301612067565b916001600160a01b038316610c976001821415612071565b610cb8575b505050610cb291610cac91611d01565b91611f8b565b90610a90565b909592610cd16040999693999895989788810190611b3d565b92908a3b156103215789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610d18946121e4565b03815a93600094fa9081610d84575b50610d6e5786517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b038a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610cac610cb2610c9c565b80610d91610d97926104ed565b80610f11565b38610d27565b5034610321576020600319360112610321576107566001600160a01b03600435610dc6816103cc565b608060409283928351610dd8816104a7565b600093818580935282602082015282878201528260608201520152168152806020522090610e6765ffffffffffff6001835194610e14866104a7565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b5034610321576020600319360112610321576001600160a01b03600435610ee8816103cc565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261032157565b503461032157600060031936011261032157602060405160018152f35b503461032157606060031936011261032157600467ffffffffffffffff813581811161032157610f6c90369084016105ef565b905060243591610f7b836103cc565b60443590811161032157610f9290369085016105ef565b929091159081611096575b50611049576014821015610fd3575b610d6a8360405191829162461bcd60e51b8352820160409060208152600060208201520190565b610fe3610fef92610fe9926125e2565b906125f0565b60601c90565b3b15610ffc573880610fac565b610d6a9060405191829162461bcd60e51b8352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610d6a8360405191829162461bcd60e51b8352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b1538610f9d565b50346103215760206003193601126103215760043567ffffffffffffffff8111610321576110d460249136906004016105ef565b9061110a6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612779565b036020826001600160a01b0392816000857f0000000000000000000000000000000000000000000000000000000000000000165af19182156111af575b60009261117f575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b6111a191925060203d81116111a8575b611199818361051d565b810190612764565b903861114f565b503d61118f565b6111b7611caf565b611147565b90816101609103126103215790565b6020600319820112610321576004359067ffffffffffffffff8211610321576107b1916004016111bc565b503461032157602061120f61120a366111cb565b61249e565b604051908152f35b50602060031936011261032157610021600435611233816103cc565b614a62565b50346103215760008060031936011261137b573381528060205260408120600181019063ffffffff825416908115611337576112d46112996112fc9361128b611286855460ff9060701c1690565b614d51565b65ffffffffffff4216614d9c565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103215760206003193601126103215760043561139c816103cc565b6109946001600160a01b036113c4336001600160a01b03166000526000602052604060002090565b9261147c6113e76108fb86546dffffffffffffffffffffffffffff9060781c1690565b946113f3861515614db6565b6114546001820161142c65ffffffffffff611418835465ffffffffffff9060201c1690565b16611424811515614e01565b421015614e4c565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b604080516001600160a01b03831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af16114cc611a5d565b50614e97565b50346103215760606003193601126103215767ffffffffffffffff600435818111610321576115059036906004016111bc565b60243591611512836103cc565b6044359081116103215761152d610d6a9136906004016105ef565b611535611898565b61153e8561284d565b61155161154b8287612ba4565b9061483f565b9461156182600092438452611d0e565b9643825281936060956001600160a01b0383166115db575b5050505060800151936115a8604061159a602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016122b4565b839550839496506115f560409492939451809481936122a6565b03925af1906080611604611a5d565b929190388080611579565b50346103215761161e366111cb565b611626611898565b61162f8261284d565b6116398183612ba4565b825160a00151919391611659906001600160a01b0316614947565b614947565b9061167061165485516001600160a01b0390511690565b946116796125aa565b506116a861168c60409586810190611b3d565b906000601483106117de5750610fe361165492610fe9926125e2565b916116b29161483f565b80516001600160a01b0316906001600160a01b038216600181149160808801519787810151918860208201516116ed9065ffffffffffff1690565b91015165ffffffffffff1691606001519261170661054d565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a0880152151590816117d5575b506117775750610d6a92519485947fe0cff05f0000000000000000000000000000000000000000000000000000000086526004860161270a565b9190610d6a9361178684614947565b6117a061179161056d565b6001600160a01b039096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612685565b9050153861173d565b915050614947565b5034610321576020600319360112610321576001600160a01b0360043561180c816103cc565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff811161188b575b60051b0190565b611893610477565b611884565b604051906118a5826104a7565b604051608083610100830167ffffffffffffffff81118482101761190e575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611916610477565b6118c4565b9061192582611871565b611932604051918261051d565b828152601f196119428294611871565b019060005b82811061195357505050565b60209061195e611898565b82828501015201611947565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209181518110156119af575b60051b010190565b6119b761196a565b6119a7565b91908110156119fd575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610321570190565b611a0561196a565b6119c6565b6002805414611a195760028055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611a88573d90611a6e8261058d565b91611a7c604051938461051d565b82523d6000602084013e565b606090565b6001600160a01b03168015611af957600080809381935af1611aad611a5d565b5015611ab557565b606460405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b90816020910312610321575190565b601f8260209493601f19938186528686013760008582860101520116010190565b60005b838110611bd15750506000910152565b8181015183820152602001611bc1565b90601f19601f602093611bff81518092818752878088019101611bbe565b0116010190565b90611c206080916107b196946101c0808652850191611b9d565b9360e081516001600160a01b0380825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a0818403910152611be1565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611cf957565b6103ea611cbc565b91908201809211611cf957565b905a91816020611d276060830151936060810190611b3d565b90611d608560405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611e22575b50611e1b575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611dc757611dc1611db66107b1945a90611cec565b608084015190611d01565b916140a7565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b611e4491925060203d8111611e4b575b611e3c818361051d565b810190611b8e565b9038611d70565b503d611e32565b909291925a93806020611e6e6060830151946060810190611b3d565b90611ea78660405195869485947f1d73275600000000000000000000000000000000000000000000000000000000865260048601611c06565b03816000305af160009181611f6b575b50611f64575060206000803e7fdeaddead0000000000000000000000000000000000000000000000000000000060005114611f0f57611f09611efe6107b195965a90611cec565b608083015190611d01565b92614317565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b611f8491925060203d8111611e4b57611e3c818361051d565b9038611eb7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611fb9570190565b611fc1611cbc565b0190565b9190811015612006575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610321570190565b61200e61196a565b611fcf565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b356107b1816103cc565b1561207857565b606460405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561032157016020813591019167ffffffffffffffff821161032157813603831361032157565b6107b19161212a8161211d846103f9565b6001600160a01b03169052565b602082013560208201526121c561217661215b61214a60408601866120bc565b610160806040880152860191611b9d565b61216860608601866120bc565b908583036060870152611b9d565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206121b8818601866120bc565b9185840390860152611b9d565b916121d661014091828101906120bc565b929091818503910152611b9d565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612227575050505050508460206107b195968503910152611b9d565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156122a25760019184612290920161210c565b98602090810196950193019190612208565b8280fd5b908092918237016000815290565b9290936107b196959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a08201520190611be1565b156122f757565b606460405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406107b192600081528160208201520190611be1565b6040906107b1939281528160208201520190611be1565b909291925a9361237b3033146122f0565b8151946040860151955a611388606083015189010111612474576107b19660009580516123c2575b505050906123bc915a90036080840151019436916105b8565b91614526565b6123e4916123e0916123db85516001600160a01b031690565b614f38565b1590565b6123f0575b80806123a3565b6123bc929194506123ff614f4a565b908151612413575b505060019390916123e9565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2016001600160a01b0360208701519261246a602061245883516001600160a01b031690565b92015195604051938493169683612353565b0390a33880612407565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b6124b46124ae6040830183611b3d565b90614f2d565b906124c56124ae6060830183611b3d565b906125616124da6124ae610120840184611b3d565b60405194859360208501956101008201359260e08301359260c08101359260a0820135926080830135926001600160a01b0360208201359135168c9693909a999895926101209895926001600160a01b036101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612575601f199384810183528261051d565b519020604080516020810192835230918101919091524660608201526080928301815290916125a4908261051d565b51902090565b604051906040820182811067ffffffffffffffff8211176125d5575b60405260006020838281520152565b6125dd610477565b6125c6565b906014116103215790601490565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000903581811693926014811061262557505050565b60140360031b82901b16169150565b9060c060a06107b193805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a08201520190611be1565b92946126e66103ea956126d46101009599986126c26126ae602097610140808c528b0190612634565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b6001600160a01b0381511660e0850152015191019060208091805184520151910152565b6127536103ea9461274161272c60a0959998969960e0865260e0860190612634565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261032157516107b1816103cc565b9160206107b1938181520191611b9d565b906127ac6001600160a01b03916107b197959694606085526060850191611b9d565b941660208201526040818503910152611b9d565b60009060033d116127cd57565b905060046000803e60005160e01c90565b600060443d106107b15760405160031991823d016004833e815167ffffffffffffffff918282113d60248401111761283c57818401948551938411612844573d8501016020848701011161283c57506107b19291016020019061051d565b949350505050565b50949350505050565b61285a6040820182611b3d565b61287261286684612067565b93610120810190611b3d565b9290303b15610321576000936128b69160405196879586957f957122ab0000000000000000000000000000000000000000000000000000000087526004870161278a565b0381305afa9081612926575b506103ea5760016128d16127c0565b6308c379a0146128ea575b6128e257565b6103ea611caf565b6128f26127de565b806128fe575b506128dc565b805160009250156128f857610d6a90604051918291631101335b60e11b83526004830161233b565b80610d91612933926104ed565b386128c2565b919061294490612b0a565b6001600160a01b0392918316612a8b57612a365761296190612b0a565b91166129e15761296e5750565b60408051631101335b60e11b815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610d6a83604051918291631101335b60e11b835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b929190612aec90612b0a565b90926001600160a01b0380809516911603612a8b57612a3657612961905b8015612b5057612b19906147f1565b6001600160a01b0365ffffffffffff806040840151164211908115612b40575b5091511691565b9050602083015116421038612b39565b50600090600090565b15612b6057565b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a93815190612bb78282612f4b565b612bc08161249e565b6020840152612bfe6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e085013517171115612b59565b612c0782612ff3565b612c128185846130a7565b9790612c366123e0612c2b87516001600160a01b031690565b6020880151906148e4565b612cff57612c4343600052565b6001600160a01b03612c6160a060609701516001600160a01b031690565b16612ce5575b505a810360a084013510612c915760809360c092604087015260608601525a900391013501910152565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b90935081612cf69297508584613bac565b95909238612c67565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a8251612d668184612f4b565b612d6f8361249e565b6020850152612dad6effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e087013517171115612b59565b612db681612ff3565b612dc28186868b613387565b9890612de66123e0612ddb86516001600160a01b031690565b6020870151906148e4565b612eab57612df343600052565b6001600160a01b03612e1160a060609601516001600160a01b031690565b16612e90575b505a840360a086013510612e435750604085015260608401526080919060c0905a900391013501910152565b60408051631101335b60e11b815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b90925081612ea2929850868685613de6565b96909138612e17565b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b15612f0757565b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b612fb090612f68612f5b82612067565b6001600160a01b03168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611b3d565b908115612fe857612fda610fe9610fe38460a094612fd560146103ea99981015612f00565b6125e2565b6001600160a01b0316910152565b505060a06000910152565b60a08101516001600160a01b0316156130285760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161300b565b6130496040929594939560608352606083019061210c565b9460208201520152565b906103ea602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b810103600f81018552018361051d565b916000926000925a9361314e60208351936130c985516001600160a01b031690565b956130e16130da6040830183611b3d565b908461358d565b60a08601516001600160a01b0316906130f943600052565b8580936001600160a01b0380941615988961332c575b60600151908601516040517f3a871cdd000000000000000000000000000000000000000000000000000000008152978896879586939060048501613031565b03938a1690f182918161330c575b50613303575060019061316d6127c0565b6308c379a0146132c8575b50613274575b61318b575b50505a900391565b6131a8906001600160a01b03166000526000602052604060002090565b6131c36108fb82546dffffffffffffffffffffffffffff1690565b80831161322057613219926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613183565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b6132d06127de565b90816132dc5750613178565b610d6a916132ea9150613053565b604051918291631101335b60e11b83526004830161233b565b955061317e9050565b61332591925060203d8111611e4b57611e3c818361051d565b903861315c565b94506133656108fb6133518c6001600160a01b03166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b81111561337c5750856060835b9691505061310f565b606087918d03613373565b90926000936000935a946133c360208351936133aa85516001600160a01b031690565b956130e16133bb6040830183611b3d565b90848c613820565b03938a1690f182918161356d575b5061356457506001906133e26127c0565b6308c379a014613527575b506134d2575b613401575b5050505a900391565b61341e906001600160a01b03166000526000602052604060002090565b9161343a6108fb84546dffffffffffffffffffffffffffff1690565b90818311613485575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff161790553880806133f8565b60408051631101335b60e11b815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61352f6127de565b908161353b57506133ed565b86916135479150613053565b90610d6a604051928392631101335b60e11b845260048401612353565b96506133f39050565b61358691925060203d8111611e4b57611e3c818361051d565b90386133d1565b90918061359957505050565b8151516001600160a01b031692833b6137cc57606083510151604051907f570e1a36000000000000000000000000000000000000000000000000000000008252602082806135eb878760048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f19182156137bf575b60009261379f575b5080821695861561374b57168095036136f7573b156136a357610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613677936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a3565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6137b891925060203d81116111a857611199818361051d565b903861362d565b6137c7611caf565b613625565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161382f575b50505050565b8251516001600160a01b031693843b613a6557606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613881888860048401612779565b038160006001600160a01b0395867f00000000000000000000000000000000000000000000000000000000000000001690f1918215613a58575b600092613a38575b508082169687156139e3571680960361398e573b156139415750610fe9610fe37fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361390e936125e2565b602083810151935160a00151604080516001600160a01b039485168152939091169183019190915290a338808080613829565b60408051631101335b60e11b815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610d6a82604051918291631101335b60e11b835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610d6a84604051918291631101335b60e11b835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b613a5191925060203d81116111a857611199818361051d565b90386138c3565b613a60611caf565b6138bb565b60408051631101335b60e11b815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b15613ab957565b606460405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261032157825167ffffffffffffffff81116103215783019080601f8301121561032157815191613b348361058d565b91613b42604051938461051d565b8383526020848301011161032157602092613b6291848085019101611bbe565b92015190565b906103ea602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526130978151809260208686019101611bbe565b939192606094600094600093805192613bde60a08a86015195613bd0888811613ab2565b01516001600160a01b031690565b91613bfc836001600160a01b03166000526000602052604060002090565b94613c186108fb87546dffffffffffffffffffffffffffff1690565b96858810613d92576001600160a01b0360208a9894613c818a966dffffffffffffffffffffffffffff8b613cba9e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e00000000000000000000000000000000000000000000000000000000855260048501613031565b0395169103f1908183918493613d6c575b50613d65575050600190613cdd6127c0565b6308c379a014613d43575b50613cef57565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d4b6127de565b9081613d575750613ce8565b610d6a916132ea9150613b68565b9450925050565b909250613d8b91503d8085833e613d83818361051d565b810190613afd565b9138613ccb565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b919492939093606095600095600093825190613e0d60a08b84015193613bd0848611613ab2565b93613e2b856001600160a01b03166000526000602052604060002090565b613e466108fb82546dffffffffffffffffffffffffffff1690565b878110613f7b57926001600160a01b0360208a98969394613c818a966dffffffffffffffffffffffffffff8d613eb39e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493613f5d575b50613f55575050600190613ed66127c0565b6308c379a014613f36575b50613ee95750565b60408051631101335b60e11b815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b613f3e6127de565b9081613f4a5750613ee1565b613547925050613b68565b955093505050565b909250613f7491503d8085833e613d83818361051d565b9138613ec4565b610d6a8a604051918291631101335b60e11b835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115613fda57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919061402760409160028652606060208701526060860190611be1565b930152565b939291906003811015613fda57604091614027918652606060208701526060860190611be1565b906103ea603660405180947f4141353020706f73744f702072657665727465643a200000000000000000000060208301526140978151809260208686019101611bbe565b810103601681018552018361051d565b929190925a936000918051916140bc836147aa565b9260a08101956140d387516001600160a01b031690565b6001600160a01b03939084811690816141f5575050506140fa82516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946141466020928c61419c95510390614998565b01519489602061416e61416086516001600160a01b031690565b9a516001600160a01b031690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614205575b50506140fc565b6060850151600099509091803b15614313579189918983614258956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f19081614300575b506142fb5760016142716127c0565b6308c379a0146142dc575b614288575b38806141fe565b604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6142e46127de565b806142ef575061427c565b6132ea610d6a91614053565b614281565b80610d9161430d926104ed565b38614262565b8980fd5b9392915a9060009280519061432b826147aa565b9360a083019661434288516001600160a01b031690565b6001600160a01b03959086811690816144055750505061436984516001600160a01b031690565b915b5a9003019485029860408301908a8251106143b857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94939261414661419c938c602094510390614998565b60408051631101335b60e11b815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614415575b505061436b565b606087015160009a509091803b1561452257918a918a83614468956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614009565b0393f1908161450f575b5061450a5760016144816127c0565b6308c379a0146144ed575b614498575b388061440e565b610d6a8b604051918291631101335b60e11b835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6144f56127de565b80614500575061448c565b6135478d91614053565b614491565b80610d9161451c926104ed565b38614472565b8a80fd5b909392915a94805191614538836147aa565b9260a081019561454f87516001600160a01b031690565b6001600160a01b039381851691826146105750505061457582516001600160a01b031690565b985b5a900301938402976040840190898251106141a1577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946145c16020928c61419c95510390614998565b6145ca88613fd0565b0151948960206145e461416086516001600160a01b031690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151614620575b5050614577565b87840261462c8a613fd0565b60028a146146b7576060860151823b156103215761467f93600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f180156146aa575b614697575b505b3880614619565b80610d916146a4926104ed565b3861468e565b6146b2611caf565b614689565b6060860151823b156103215761470293600080948d604051978896879586937fa9a234090000000000000000000000000000000000000000000000000000000085526004850161402c565b0393f19081614797575b5061479257600161471b6127c0565b6308c379a01461477f575b1561469057604051631101335b60e11b815280610d6a600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6147876127de565b806142ef5750614726565b614690565b80610d916147a4926104ed565b3861470c565b60e060c08201519101518082146147ce574801808210156147c9575090565b905090565b5090565b604051906147df82610501565b60006040838281528260208201520152565b6147f96147d2565b5065ffffffffffff808260a01c168015614838575b6040519261481b84610501565b6001600160a01b038116845260d01c602084015216604082015290565b508061480e565b61485461485a9161484e6147d2565b506147f1565b916147f1565b906001600160a01b0391828251169283156148d9575b65ffffffffffff9283918260408160208501511693015116938360408160208401511692015116908084106148d1575b508085116148c9575b50604051956148b787610501565b16855216602084015216604082015290565b9350386148a9565b9250386148a0565b815181169350614870565b6001600160a01b0316600052600160205267ffffffffffffffff6149338260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9182549261494084611f8b565b9055161490565b906001600160a01b036149586125aa565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b6103ea33614a62565b6001600160a01b0316600052600060205260406000206dffffffffffffffffffffffffffff80825416928301809311614a55575b808311614a11576103ea92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b606460405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b614a5d611cbc565b6149cc565b6001600160a01b0390614a753482614998565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b15614ac857565b606460405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b15614b1357565b606460405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b15614b5e57565b606460405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b15614ba957565b606460405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff608060016103ea94614c4d6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b15614d5857565b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff80809416911601918211611cf957565b15614dbd57565b606460405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15614e0857565b606460405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15614e5357565b606460405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15614e9e57565b606460405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15614ee957565b606460405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211614f71575b50604051906020818301016040528082526000602083013e90565b905038614f5656fea2646970667358221220b97d7aa061056a5e9c6ad974ba3ad5c6b5a83463963e9d403739fd7b4356401664736f6c63430008110033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x23 JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21 PUSH2 0x498F JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1B3 JUMPI DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x1A1 JUMPI DUP1 PUSH4 0x1D732756 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x1FAD948C EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x17D JUMPI DUP1 PUSH4 0x4B1D7CF5 EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0x5287CE12 EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0x8F41EC5A EQ PUSH2 0x159 JUMPI DUP1 PUSH4 0x957122AB EQ PUSH2 0x150 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0xB760FAF9 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x123 JUMPI DUP1 PUSH4 0xD6383F94 EQ PUSH2 0x11A JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x111 JUMPI PUSH4 0xFC7E286D SUB PUSH2 0xE JUMPI PUSH2 0x10C PUSH2 0x17E6 JUMP JUMPDEST PUSH2 0xE JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x160F JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x14D2 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x137E JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x1238 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x1217 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x11F6 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x10A0 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xF39 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xF1C JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xEC2 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xD9D JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0xA75 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x9DB JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x88E JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x7B4 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x61D JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x404 JUMP JUMPDEST POP PUSH2 0x10C PUSH2 0x34D JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x321 JUMPI PUSH2 0x31C PUSH32 0xA5AE833D0BB1DCD632D98A8B70973E8516812898E19BF27B70071EBC8DC52C01 SWAP2 PUSH2 0x246 PUSH2 0x216 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x222 DUP2 ISZERO ISZERO PUSH2 0x4AC1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x236 PUSH1 0x1 DUP6 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST GT ISZERO PUSH2 0x4B0C JUMP JUMPDEST SLOAD SWAP3 PUSH2 0x2FE PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 PUSH2 0x2C9 PUSH2 0x26D CALLVALUE DUP9 DUP5 PUSH1 0x78 SHR AND PUSH2 0x1D01 JUMP JUMPDEST SWAP7 PUSH2 0x279 DUP9 ISZERO ISZERO PUSH2 0x4B57 JUMP JUMPDEST PUSH2 0x285 DUP2 DUP10 GT ISZERO PUSH2 0x4BA2 JUMP JUMPDEST PUSH2 0x2A9 DUP2 PUSH2 0x291 PUSH2 0x540 JUMP JUMPDEST SWAP5 AND DUP5 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP5 ADD MSTORE DUP8 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP4 ADD MSTORE JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP4 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x2F9 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x4BED JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x20 DUP6 ADD MSTORE CALLER SWAP4 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x321 JUMPI PUSH2 0x3BE SWAP1 CALLER PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3C8 DUP2 SLOAD PUSH2 0x1F8B JUMP JUMPDEST SWAP1 SSTORE STOP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SUB PUSH2 0x321 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST JUMP JUMPDEST PUSH1 0xC4 CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x3CC JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH2 0x46E PUSH1 0x4 CALLDATALOAD PUSH2 0x427 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x437 PUSH2 0x326 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA0 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x4CB PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x100 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH1 0x1F NOT SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x3EA DUP3 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0xC0 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F PUSH1 0x20 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5AB JUMPI JUMPDEST ADD AND ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B3 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x5A5 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x5C4 DUP3 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x5D2 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x321 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x321 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x1C0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x321 JUMPI PUSH2 0x662 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x24 DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 ADD PUSH2 0x5B8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC CALLDATASIZE ADD PUSH2 0x180 DUP2 SLT PUSH2 0x321 JUMPI PUSH2 0x100 PUSH1 0x40 MLOAD SWAP2 PUSH2 0x69F DUP4 PUSH2 0x4A7 JUMP JUMPDEST SLT PUSH2 0x321 JUMPI PUSH1 0x40 MLOAD PUSH2 0x6B0 DUP2 PUSH2 0x4D0 JUMP JUMPDEST PUSH2 0x6B8 PUSH2 0x3DD JUMP JUMPDEST DUP2 MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x64 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x84 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x6E2 PUSH2 0x3EC JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE4 CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x104 CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE DUP2 MSTORE PUSH2 0x124 CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x144 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x164 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x184 CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x1A4 CALLDATALOAD SWAP2 DUP3 GT PUSH2 0x321 JUMPI PUSH2 0x756 SWAP3 PUSH2 0x73E PUSH2 0x746 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x236A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x40 PUSH1 0x3 NOT DUP4 ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 DUP3 GT PUSH2 0x321 JUMPI DUP1 PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP4 DUP5 GT PUSH2 0x321 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0x321 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 PUSH1 0x24 CALLDATALOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x7C3 CALLDATASIZE PUSH2 0x75A JUMP JUMPDEST PUSH2 0x7CE SWAP3 SWAP2 SWAP3 PUSH2 0x1A0A JUMP JUMPDEST PUSH2 0x7D7 DUP4 PUSH2 0x191B JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x857 JUMPI POP PUSH1 0x0 SWAP3 PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 DUP5 DUP1 LOG1 DUP4 SWAP2 JUMPDEST DUP6 DUP4 LT PUSH2 0x827 JUMPI PUSH2 0x81D DUP6 DUP6 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x21 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST SWAP1 SWAP2 SWAP4 PUSH1 0x1 SWAP1 PUSH2 0x84D PUSH2 0x83B DUP8 DUP10 DUP8 PUSH2 0x19BC JUMP JUMPDEST PUSH2 0x845 DUP9 DUP7 PUSH2 0x199A JUMP JUMPDEST MLOAD SWAP1 DUP9 PUSH2 0x1E52 JUMP JUMPDEST ADD SWAP5 ADD SWAP2 SWAP1 PUSH2 0x80C JUMP JUMPDEST DUP1 PUSH2 0x885 PUSH2 0x87E PUSH2 0x86C PUSH1 0x1 SWAP5 DUP7 SWAP9 SWAP7 PUSH2 0x199A JUMP JUMPDEST MLOAD PUSH2 0x878 DUP5 DUP11 DUP9 PUSH2 0x19BC JUMP JUMPDEST DUP5 PUSH2 0x2D53 JUMP JUMPDEST SWAP1 DUP4 PUSH2 0x2939 JUMP JUMPDEST ADD SWAP3 SWAP1 SWAP3 PUSH2 0x7DA JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8AC DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x0 SWAP2 CALLER DUP4 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP3 DUP4 DUP4 GT PUSH2 0x997 JUMPI DUP5 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 SWAP6 SWAP4 PUSH2 0x947 DUP5 SWAP7 PUSH2 0x90E PUSH2 0x8FB DUP8 SWAP9 PUSH2 0x994 SWAP13 PUSH2 0x1CEC JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xD1C19FBCD4551A5EDFB66D43D2E337C04837AFDA3482B42BDF569A8FCCDAE5FB SWAP2 LOG2 AND GAS CALL PUSH2 0x98E PUSH2 0x1A5D JUMP JUMPDEST POP PUSH2 0x4EE2 JUMP JUMPDEST DUP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x576974686472617720616D6F756E7420746F6F206C6172676500000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x40 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x4 CALLDATALOAD PUSH2 0x9FB DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0xA0B PUSH2 0x326 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x1 DUP3 MSTORE PUSH2 0xA46 DUP2 PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 PUSH1 0x40 MLOAD SWAP3 PUSH1 0x40 SHL AND OR DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0xA84 CALLDATASIZE PUSH2 0x75A JUMP JUMPDEST PUSH2 0xA8C PUSH2 0x1A0A JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST DUP4 DUP3 LT PUSH2 0xC59 JUMPI PUSH2 0xAA1 SWAP2 POP PUSH2 0x191B JUMP JUMPDEST PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 PUSH1 0x0 DUP1 LOG1 PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT PUSH2 0xBCC JUMPI POP POP PUSH1 0x0 DUP1 SWAP4 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB10 JUMPI PUSH2 0x81D DUP7 DUP7 PUSH1 0x0 PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D DUP2 DUP1 LOG2 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0xB67 PUSH2 0xB1E DUP3 DUP5 DUP11 PUSH2 0x1FC5 JUMP JUMPDEST PUSH2 0xB3C PUSH2 0xB30 PUSH2 0xB30 PUSH1 0x20 DUP5 ADD PUSH2 0x2067 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D PUSH1 0x0 DUP1 LOG2 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP1 DUP4 LT PUSH2 0xB84 JUMPI POP POP POP PUSH2 0xB7F SWAP1 PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0xAD9 JUMP JUMPDEST SWAP1 SWAP2 SWAP5 SWAP8 PUSH2 0xBBF PUSH2 0xBB9 PUSH2 0xBC5 SWAP3 PUSH2 0xBB3 DUP13 DUP12 PUSH2 0xBAC DUP3 PUSH2 0xBA6 DUP15 DUP12 DUP14 PUSH2 0x19BC JUMP JUMPDEST SWAP3 PUSH2 0x199A JUMP JUMPDEST MLOAD SWAP2 PUSH2 0x1E52 JUMP JUMPDEST SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP10 PUSH2 0x1F8B JUMP JUMPDEST SWAP6 PUSH2 0x1F8B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xB6C JUMP JUMPDEST PUSH2 0xBD7 DUP2 DUP7 DUP9 PUSH2 0x1FC5 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xBEF PUSH2 0xBE6 DUP4 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 ADD PUSH2 0x2067 JUMP JUMPDEST SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x0 SWAP4 AND SWAP1 JUMPDEST DUP3 DUP5 LT PUSH2 0xC17 JUMPI POP POP POP POP PUSH2 0xC12 SWAP1 PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0xACA JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP5 PUSH2 0xBBF DUP2 PUSH2 0xC4C DUP6 PUSH2 0xC45 PUSH2 0xC33 PUSH2 0xC51 SWAP7 DUP14 PUSH2 0x199A JUMP JUMPDEST MLOAD PUSH2 0xC3F DUP13 DUP12 DUP11 PUSH2 0x19BC JUMP JUMPDEST DUP6 PUSH2 0x2D53 JUMP JUMPDEST SWAP1 DUP12 PUSH2 0x2AE0 JUMP JUMPDEST PUSH2 0x1F8B JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xBFE JUMP JUMPDEST PUSH2 0xC64 DUP3 DUP6 DUP8 PUSH2 0x1FC5 JUMP JUMPDEST SWAP1 PUSH2 0xC6F DUP3 DUP1 PUSH2 0x2013 JUMP JUMPDEST SWAP3 PUSH2 0xC7F PUSH2 0xB30 PUSH1 0x20 DUP4 ADD PUSH2 0x2067 JUMP JUMPDEST SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xC97 PUSH1 0x1 DUP3 EQ ISZERO PUSH2 0x2071 JUMP JUMPDEST PUSH2 0xCB8 JUMPI JUMPDEST POP POP POP PUSH2 0xCB2 SWAP2 PUSH2 0xCAC SWAP2 PUSH2 0x1D01 JUMP JUMPDEST SWAP2 PUSH2 0x1F8B JUMP JUMPDEST SWAP1 PUSH2 0xA90 JUMP JUMPDEST SWAP1 SWAP6 SWAP3 PUSH2 0xCD1 PUSH1 0x40 SWAP10 SWAP7 SWAP4 SWAP10 SWAP9 SWAP6 SWAP9 SWAP8 DUP9 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP3 SWAP1 DUP11 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI DUP10 SWAP4 DUP12 SWAP2 DUP11 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xE3563A4F00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 SWAP15 DUP16 DUP6 ADD SWAP4 PUSH2 0xD18 SWAP5 PUSH2 0x21E4 JUMP JUMPDEST SUB DUP2 GAS SWAP4 PUSH1 0x0 SWAP5 STATICCALL SWAP1 DUP2 PUSH2 0xD84 JUMPI JUMPDEST POP PUSH2 0xD6E JUMPI DUP7 MLOAD PUSH32 0x86A9F75000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP2 DUP11 ADD SWAP1 DUP2 MSTORE DUP2 SWAP1 PUSH1 0x20 ADD SUB SWAP1 REVERT JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP5 SWAP8 POP SWAP3 SWAP6 POP SWAP1 SWAP4 POP SWAP2 DUP2 PUSH2 0xCAC PUSH2 0xCB2 PUSH2 0xC9C JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0xD97 SWAP3 PUSH2 0x4ED JUMP JUMPDEST DUP1 PUSH2 0xF11 JUMP JUMPDEST CODESIZE PUSH2 0xD27 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH2 0x756 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0xDC6 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 SWAP3 DUP4 SWAP3 DUP4 MLOAD PUSH2 0xDD8 DUP2 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x0 SWAP4 DUP2 DUP6 DUP1 SWAP4 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP8 DUP3 ADD MSTORE DUP3 PUSH1 0x60 DUP3 ADD MSTORE ADD MSTORE AND DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE KECCAK256 SWAP1 PUSH2 0xE67 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 DUP4 MLOAD SWAP5 PUSH2 0xE14 DUP7 PUSH2 0x4A7 JUMP JUMPDEST DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP9 MSTORE PUSH1 0x70 DUP3 SWAP1 SHR PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x78 SWAP2 SWAP1 SWAP2 SHR AND DUP6 DUP8 ADD MSTORE ADD SLOAD PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x20 SHR AND PUSH1 0x80 DUP5 ADD SWAP1 PUSH6 0xFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST MLOAD SWAP2 DUP3 SWAP2 DUP3 SWAP2 SWAP1 SWAP2 PUSH1 0x80 PUSH6 0xFFFFFFFFFFFF DUP2 PUSH1 0xA0 DUP5 ADD SWAP6 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 MLOAD AND DUP7 MSTORE PUSH1 0x20 DUP3 ADD MLOAD ISZERO ISZERO PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD AND PUSH1 0x40 DUP7 ADD MSTORE PUSH4 0xFFFFFFFF PUSH1 0x60 DUP3 ADD MLOAD AND PUSH1 0x60 DUP7 ADD MSTORE ADD MLOAD AND SWAP2 ADD MSTORE JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0xEE8 DUP2 PUSH2 0x3CC JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x321 JUMPI JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x0 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0xF6C SWAP1 CALLDATASIZE SWAP1 DUP5 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP1 POP PUSH1 0x24 CALLDATALOAD SWAP2 PUSH2 0xF7B DUP4 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0xF92 SWAP1 CALLDATASIZE SWAP1 DUP6 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 ISZERO SWAP1 DUP2 PUSH2 0x1096 JUMPI JUMPDEST POP PUSH2 0x1049 JUMPI PUSH1 0x14 DUP3 LT ISZERO PUSH2 0xFD3 JUMPI JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x40 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xFE3 PUSH2 0xFEF SWAP3 PUSH2 0xFE9 SWAP3 PUSH2 0x25E2 JUMP JUMPDEST SWAP1 PUSH2 0x25F0 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO PUSH2 0xFFC JUMPI CODESIZE DUP1 PUSH2 0xFAC JUMP JUMPDEST PUSH2 0xD6A SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x60 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x1B PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x41413330207061796D6173746572206E6F74206465706C6F7965640000000000 PUSH1 0x40 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE DUP3 ADD PUSH1 0x60 SWAP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x19 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x41413230206163636F756E74206E6F74206465706C6F79656400000000000000 PUSH1 0x40 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 POP EXTCODESIZE ISZERO CODESIZE PUSH2 0xF9D JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x10D4 PUSH1 0x24 SWAP2 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST SWAP1 PUSH2 0x110A PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB PUSH1 0x20 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP2 PUSH1 0x0 DUP6 PUSH32 0x0 AND GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x11AF JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x117F JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH32 0x6CA7B80600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE AND PUSH1 0x4 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x11A1 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI JUMPDEST PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2764 JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x114F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x118F JUMP JUMPDEST PUSH2 0x11B7 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x1147 JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x160 SWAP2 SUB SLT PUSH2 0x321 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x3 NOT DUP3 ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH2 0x7B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x11BC JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH2 0x120F PUSH2 0x120A CALLDATASIZE PUSH2 0x11CB JUMP JUMPDEST PUSH2 0x249E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH2 0x21 PUSH1 0x4 CALLDATALOAD PUSH2 0x1233 DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH2 0x4A62 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x0 DUP1 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x137B JUMPI CALLER DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x1 DUP2 ADD SWAP1 PUSH4 0xFFFFFFFF DUP3 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x1337 JUMPI PUSH2 0x12D4 PUSH2 0x1299 PUSH2 0x12FC SWAP4 PUSH2 0x128B PUSH2 0x1286 DUP6 SLOAD PUSH1 0xFF SWAP1 PUSH1 0x70 SHR AND SWAP1 JUMP JUMPDEST PUSH2 0x4D51 JUMP JUMPDEST PUSH6 0xFFFFFFFFFFFF TIMESTAMP AND PUSH2 0x4D9C JUMP JUMPDEST DUP5 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF AND PUSH1 0x20 DUP3 SWAP1 SHL PUSH10 0xFFFFFFFFFFFF00000000 AND OR SWAP1 SWAP5 SSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH6 0xFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE CALLER SWAP1 PUSH32 0xFA9B3C14CC825C412C9ED81B3BA365A5B459439403F18829E572ED53A4180F0A SWAP1 PUSH1 0x20 SWAP1 LOG2 DUP1 RETURN JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F74207374616B656400000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x139C DUP2 PUSH2 0x3CC JUMP JUMPDEST PUSH2 0x994 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x13C4 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x147C PUSH2 0x13E7 PUSH2 0x8FB DUP7 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x78 SHR AND SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x13F3 DUP7 ISZERO ISZERO PUSH2 0x4DB6 JUMP JUMPDEST PUSH2 0x1454 PUSH1 0x1 DUP3 ADD PUSH2 0x142C PUSH6 0xFFFFFFFFFFFF PUSH2 0x1418 DUP4 SLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 PUSH1 0x20 SHR AND SWAP1 JUMP JUMPDEST AND PUSH2 0x1424 DUP2 ISZERO ISZERO PUSH2 0x4E01 JUMP JUMPDEST TIMESTAMP LT ISZERO PUSH2 0x4E4C JUMP JUMPDEST DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xB7C918E0E249F999E965CAFEB6C664271B3F4317D296461500E71DA39F0CBDA3 SWAP2 LOG2 PUSH1 0x0 DUP1 DUP1 SWAP6 DUP2 SWAP5 DUP3 SWAP5 AND GAS CALL PUSH2 0x14CC PUSH2 0x1A5D JUMP JUMPDEST POP PUSH2 0x4E97 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x60 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x1505 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x11BC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH2 0x1512 DUP4 PUSH2 0x3CC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 GT PUSH2 0x321 JUMPI PUSH2 0x152D PUSH2 0xD6A SWAP2 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5EF JUMP JUMPDEST PUSH2 0x1535 PUSH2 0x1898 JUMP JUMPDEST PUSH2 0x153E DUP6 PUSH2 0x284D JUMP JUMPDEST PUSH2 0x1551 PUSH2 0x154B DUP3 DUP8 PUSH2 0x2BA4 JUMP JUMPDEST SWAP1 PUSH2 0x483F JUMP JUMPDEST SWAP5 PUSH2 0x1561 DUP3 PUSH1 0x0 SWAP3 NUMBER DUP5 MSTORE PUSH2 0x1D0E JUMP JUMPDEST SWAP7 NUMBER DUP3 MSTORE DUP2 SWAP4 PUSH1 0x60 SWAP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x15DB JUMPI JUMPDEST POP POP POP POP PUSH1 0x80 ADD MLOAD SWAP4 PUSH2 0x15A8 PUSH1 0x40 PUSH2 0x159A PUSH1 0x20 DUP5 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 PUSH32 0x8B7AC98000000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 DUP9 ADD PUSH2 0x22B4 JUMP JUMPDEST DUP4 SWAP6 POP DUP4 SWAP5 SWAP7 POP PUSH2 0x15F5 PUSH1 0x40 SWAP5 SWAP3 SWAP4 SWAP5 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH2 0x22A6 JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP1 PUSH1 0x80 PUSH2 0x1604 PUSH2 0x1A5D JUMP JUMPDEST SWAP3 SWAP2 SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1579 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH2 0x161E CALLDATASIZE PUSH2 0x11CB JUMP JUMPDEST PUSH2 0x1626 PUSH2 0x1898 JUMP JUMPDEST PUSH2 0x162F DUP3 PUSH2 0x284D JUMP JUMPDEST PUSH2 0x1639 DUP2 DUP4 PUSH2 0x2BA4 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xA0 ADD MLOAD SWAP2 SWAP4 SWAP2 PUSH2 0x1659 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4947 JUMP JUMPDEST PUSH2 0x4947 JUMP JUMPDEST SWAP1 PUSH2 0x1670 PUSH2 0x1654 DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 MLOAD AND SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x1679 PUSH2 0x25AA JUMP JUMPDEST POP PUSH2 0x16A8 PUSH2 0x168C PUSH1 0x40 SWAP6 DUP7 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x14 DUP4 LT PUSH2 0x17DE JUMPI POP PUSH2 0xFE3 PUSH2 0x1654 SWAP3 PUSH2 0xFE9 SWAP3 PUSH2 0x25E2 JUMP JUMPDEST SWAP2 PUSH2 0x16B2 SWAP2 PUSH2 0x483F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 DUP2 EQ SWAP2 PUSH1 0x80 DUP9 ADD MLOAD SWAP8 DUP8 DUP2 ADD MLOAD SWAP2 DUP9 PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x16ED SWAP1 PUSH6 0xFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP2 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP2 PUSH1 0x60 ADD MLOAD SWAP3 PUSH2 0x1706 PUSH2 0x54D JUMP JUMPDEST SWAP11 DUP12 MSTORE PUSH1 0x20 DUP12 ADD MSTORE DUP5 ISZERO ISZERO DUP10 DUP12 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x60 DUP11 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x80 DUP10 ADD MSTORE PUSH1 0xA0 DUP9 ADD MSTORE ISZERO ISZERO SWAP1 DUP2 PUSH2 0x17D5 JUMPI JUMPDEST POP PUSH2 0x1777 JUMPI POP PUSH2 0xD6A SWAP3 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xE0CFF05F00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x270A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xD6A SWAP4 PUSH2 0x1786 DUP5 PUSH2 0x4947 JUMP JUMPDEST PUSH2 0x17A0 PUSH2 0x1791 PUSH2 0x56D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND DUP7 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE MLOAD SWAP6 DUP7 SWAP6 PUSH32 0xFAECB4E400000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x2685 JUMP JUMPDEST SWAP1 POP ISZERO CODESIZE PUSH2 0x173D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4947 JUMP JUMPDEST POP CALLVALUE PUSH2 0x321 JUMPI PUSH1 0x20 PUSH1 0x3 NOT CALLDATASIZE ADD SLT PUSH2 0x321 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x4 CALLDATALOAD PUSH2 0x180C DUP2 PUSH2 0x3CC JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0xA0 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 DUP3 SLOAD SWAP3 ADD SLOAD PUSH1 0x40 MLOAD SWAP3 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 DUP2 AND DUP6 MSTORE PUSH1 0xFF DUP2 PUSH1 0x70 SHR AND ISZERO ISZERO PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x78 SHR AND PUSH1 0x40 DUP5 ADD MSTORE PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x20 SHR AND PUSH1 0x80 DUP3 ADD MSTORE RETURN JUMPDEST PUSH1 0x20 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x188B JUMPI JUMPDEST PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH2 0x1893 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x1884 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x18A5 DUP3 PUSH2 0x4A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP4 PUSH2 0x100 DUP4 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP5 DUP3 LT OR PUSH2 0x190E JUMPI JUMPDEST PUSH1 0x40 MSTORE PUSH1 0x0 SWAP3 DUP4 DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP4 PUSH1 0x60 DUP3 ADD MSTORE DUP4 DUP4 DUP3 ADD MSTORE DUP4 PUSH1 0xA0 DUP3 ADD MSTORE DUP4 PUSH1 0xC0 DUP3 ADD MSTORE DUP4 PUSH1 0xE0 DUP3 ADD MSTORE DUP2 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE DUP3 PUSH1 0x40 DUP3 ADD MSTORE DUP3 PUSH1 0x60 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1916 PUSH2 0x477 JUMP JUMPDEST PUSH2 0x18C4 JUMP JUMPDEST SWAP1 PUSH2 0x1925 DUP3 PUSH2 0x1871 JUMP JUMPDEST PUSH2 0x1932 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0x51D JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x1F NOT PUSH2 0x1942 DUP3 SWAP5 PUSH2 0x1871 JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1953 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x195E PUSH2 0x1898 JUMP JUMPDEST DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x1947 JUMP JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 SWAP2 DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x19AF JUMPI JUMPDEST PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x19B7 PUSH2 0x196A JUMP JUMPDEST PUSH2 0x19A7 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x19FD JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x1A05 PUSH2 0x196A JUMP JUMPDEST PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD EQ PUSH2 0x1A19 JUMPI PUSH1 0x2 DUP1 SSTORE JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1A88 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x1A6E DUP3 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x1A7C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL PUSH2 0x1AAD PUSH2 0x1A5D JUMP JUMPDEST POP ISZERO PUSH2 0x1AB5 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413931206661696C65642073656E6420746F2062656E656669636961727900 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393020696E76616C69642062656E65666963696172790000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x321 JUMPI MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH1 0x1F NOT SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1BD1 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BC1 JUMP JUMPDEST SWAP1 PUSH1 0x1F NOT PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x1BFF DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1C20 PUSH1 0x80 SWAP2 PUSH2 0x7B1 SWAP7 SWAP5 PUSH2 0x1C0 DUP1 DUP7 MSTORE DUP6 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP4 PUSH1 0xE0 DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 MLOAD AND PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP6 DUP8 ADD MSTORE DUP5 DUP3 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD AND PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xC0 DUP2 ADD MLOAD DUP3 DUP7 ADD MSTORE ADD MLOAD PUSH2 0x100 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH2 0x140 DUP5 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH2 0x160 DUP5 ADD MSTORE ADD MLOAD PUSH2 0x180 DUP3 ADD MSTORE PUSH2 0x1A0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x1BE1 JUMP JUMPDEST POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x1CBC JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST SWAP1 GAS SWAP2 DUP2 PUSH1 0x20 PUSH2 0x1D27 PUSH1 0x60 DUP4 ADD MLOAD SWAP4 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x1D60 DUP6 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP5 PUSH32 0x1D73275600000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x1C06 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 ADDRESS GAS CALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x1E22 JUMPI JUMPDEST POP PUSH2 0x1E1B JUMPI POP PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MLOAD EQ PUSH2 0x1DC7 JUMPI PUSH2 0x1DC1 PUSH2 0x1DB6 PUSH2 0x7B1 SWAP5 GAS SWAP1 PUSH2 0x1CEC JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MLOAD SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP2 PUSH2 0x40A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH2 0x1E44 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI JUMPDEST PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1B8E JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x1D70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1E32 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 GAS SWAP4 DUP1 PUSH1 0x20 PUSH2 0x1E6E PUSH1 0x60 DUP4 ADD MLOAD SWAP5 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x1EA7 DUP7 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 DUP6 SWAP5 PUSH32 0x1D73275600000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0x1C06 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 ADDRESS GAS CALL PUSH1 0x0 SWAP2 DUP2 PUSH2 0x1F6B JUMPI JUMPDEST POP PUSH2 0x1F64 JUMPI POP PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MLOAD EQ PUSH2 0x1F0F JUMPI PUSH2 0x1F09 PUSH2 0x1EFE PUSH2 0x7B1 SWAP6 SWAP7 GAS SWAP1 PUSH2 0x1CEC JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD SWAP1 PUSH2 0x1D01 JUMP JUMPDEST SWAP3 PUSH2 0x4317 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP5 POP POP POP POP JUMP JUMPDEST PUSH2 0x1F84 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x1EB7 JUMP JUMPDEST PUSH1 0x1 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x1FB9 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x1FC1 PUSH2 0x1CBC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2006 JUMPI JUMPDEST PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x200E PUSH2 0x196A JUMP JUMPDEST PUSH2 0x1FCF JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x321 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 PUSH1 0x5 SHL CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST CALLDATALOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST ISZERO PUSH2 0x2078 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393620696E76616C69642061676772656761746F72000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP3 CALLDATASIZE SUB ADD DUP2 SLT ISZERO PUSH2 0x321 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x321 JUMPI DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x321 JUMPI JUMP JUMPDEST PUSH2 0x7B1 SWAP2 PUSH2 0x212A DUP2 PUSH2 0x211D DUP5 PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x21C5 PUSH2 0x2176 PUSH2 0x215B PUSH2 0x214A PUSH1 0x40 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x40 DUP9 ADD MSTORE DUP7 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST PUSH2 0x2168 PUSH1 0x60 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST PUSH1 0x80 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x120 PUSH2 0x21B8 DUP2 DUP7 ADD DUP7 PUSH2 0x20BC JUMP JUMPDEST SWAP2 DUP6 DUP5 SUB SWAP1 DUP7 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP2 PUSH2 0x21D6 PUSH2 0x140 SWAP2 DUP3 DUP2 ADD SWAP1 PUSH2 0x20BC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP5 SWAP4 SWAP2 SWAP3 SWAP1 DUP4 PUSH1 0x40 DUP8 ADD PUSH1 0x40 DUP9 MSTORE MSTORE PUSH1 0x60 DUP7 ADD SWAP4 PUSH1 0x60 DUP2 PUSH1 0x5 SHL DUP9 ADD ADD SWAP5 DUP3 PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP5 DUP4 LT PUSH2 0x2227 JUMPI POP POP POP POP POP POP DUP5 PUSH1 0x20 PUSH2 0x7B1 SWAP6 SWAP7 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP12 DUP3 SUB ADD DUP6 MSTORE DUP9 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT ISZERO PUSH2 0x22A2 JUMPI PUSH1 0x1 SWAP2 DUP5 PUSH2 0x2290 SWAP3 ADD PUSH2 0x210C JUMP JUMPDEST SWAP9 PUSH1 0x20 SWAP1 DUP2 ADD SWAP7 SWAP6 ADD SWAP4 ADD SWAP2 SWAP1 PUSH2 0x2208 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x7B1 SWAP7 SWAP6 SWAP3 PUSH1 0xC0 SWAP6 DUP6 MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH6 0xFFFFFFFFFFFF DUP1 SWAP3 AND PUSH1 0x40 DUP6 ADD MSTORE AND PUSH1 0x60 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP3 ADD MSTORE DUP2 PUSH1 0xA0 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST ISZERO PUSH2 0x22F7 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393220696E7465726E616C2063616C6C206F6E6C79000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH1 0x40 PUSH2 0x7B1 SWAP3 PUSH1 0x0 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH2 0x7B1 SWAP4 SWAP3 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 GAS SWAP4 PUSH2 0x237B ADDRESS CALLER EQ PUSH2 0x22F0 JUMP JUMPDEST DUP2 MLOAD SWAP5 PUSH1 0x40 DUP7 ADD MLOAD SWAP6 GAS PUSH2 0x1388 PUSH1 0x60 DUP4 ADD MLOAD DUP10 ADD ADD GT PUSH2 0x2474 JUMPI PUSH2 0x7B1 SWAP7 PUSH1 0x0 SWAP6 DUP1 MLOAD PUSH2 0x23C2 JUMPI JUMPDEST POP POP POP SWAP1 PUSH2 0x23BC SWAP2 GAS SWAP1 SUB PUSH1 0x80 DUP5 ADD MLOAD ADD SWAP5 CALLDATASIZE SWAP2 PUSH2 0x5B8 JUMP JUMPDEST SWAP2 PUSH2 0x4526 JUMP JUMPDEST PUSH2 0x23E4 SWAP2 PUSH2 0x23E0 SWAP2 PUSH2 0x23DB DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x4F38 JUMP JUMPDEST ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x23F0 JUMPI JUMPDEST DUP1 DUP1 PUSH2 0x23A3 JUMP JUMPDEST PUSH2 0x23BC SWAP3 SWAP2 SWAP5 POP PUSH2 0x23FF PUSH2 0x4F4A JUMP JUMPDEST SWAP1 DUP2 MLOAD PUSH2 0x2413 JUMPI JUMPDEST POP POP PUSH1 0x1 SWAP4 SWAP1 SWAP2 PUSH2 0x23E9 JUMP JUMPDEST PUSH32 0x1C4FADA7374C0A9EE8841FC38AFE82932DC0F8E69012E927F061A8BAE611A201 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP8 ADD MLOAD SWAP3 PUSH2 0x246A PUSH1 0x20 PUSH2 0x2458 DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP3 ADD MLOAD SWAP6 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND SWAP7 DUP4 PUSH2 0x2353 JUMP JUMPDEST SUB SWAP1 LOG3 CODESIZE DUP1 PUSH2 0x2407 JUMP JUMPDEST PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x24B4 PUSH2 0x24AE PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x4F2D JUMP JUMPDEST SWAP1 PUSH2 0x24C5 PUSH2 0x24AE PUSH1 0x60 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 PUSH2 0x2561 PUSH2 0x24DA PUSH2 0x24AE PUSH2 0x120 DUP5 ADD DUP5 PUSH2 0x1B3D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD SWAP6 PUSH2 0x100 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0xE0 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0xA0 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0x80 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD SWAP2 CALLDATALOAD AND DUP13 SWAP7 SWAP4 SWAP1 SWAP11 SWAP10 SWAP9 SWAP6 SWAP3 PUSH2 0x120 SWAP9 SWAP6 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x140 DUP11 ADD SWAP14 AND DUP10 MSTORE PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 PUSH2 0x2575 PUSH1 0x1F NOT SWAP4 DUP5 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x51D JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 DUP4 MSTORE ADDRESS SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP3 DUP4 ADD DUP2 MSTORE SWAP1 SWAP2 PUSH2 0x25A4 SWAP1 DUP3 PUSH2 0x51D JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x25D5 JUMPI JUMPDEST PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 DUP3 DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x25DD PUSH2 0x477 JUMP JUMPDEST PUSH2 0x25C6 JUMP JUMPDEST SWAP1 PUSH1 0x14 GT PUSH2 0x321 JUMPI SWAP1 PUSH1 0x14 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 SWAP1 CALLDATALOAD DUP2 DUP2 AND SWAP4 SWAP3 PUSH1 0x14 DUP2 LT PUSH2 0x2625 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x14 SUB PUSH1 0x3 SHL DUP3 SWAP1 SHL AND AND SWAP2 POP JUMP JUMPDEST SWAP1 PUSH1 0xC0 PUSH1 0xA0 PUSH2 0x7B1 SWAP4 DUP1 MLOAD DUP5 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD ISZERO ISZERO PUSH1 0x40 DUP6 ADD MSTORE PUSH6 0xFFFFFFFFFFFF DUP1 PUSH1 0x60 DUP4 ADD MLOAD AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD AND PUSH1 0x80 DUP6 ADD MSTORE ADD MLOAD SWAP2 DUP2 PUSH1 0xA0 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP3 SWAP5 PUSH2 0x26E6 PUSH2 0x3EA SWAP6 PUSH2 0x26D4 PUSH2 0x100 SWAP6 SWAP10 SWAP9 PUSH2 0x26C2 PUSH2 0x26AE PUSH1 0x20 SWAP8 PUSH2 0x140 DUP1 DUP13 MSTORE DUP12 ADD SWAP1 PUSH2 0x2634 JUMP JUMPDEST SWAP12 DUP8 DUP11 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP10 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0xC0 DUP7 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 MLOAD AND PUSH1 0xE0 DUP6 ADD MSTORE ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2753 PUSH2 0x3EA SWAP5 PUSH2 0x2741 PUSH2 0x272C PUSH1 0xA0 SWAP6 SWAP10 SWAP9 SWAP7 SWAP10 PUSH1 0xE0 DUP7 MSTORE PUSH1 0xE0 DUP7 ADD SWAP1 PUSH2 0x2634 JUMP JUMPDEST SWAP9 PUSH1 0x20 DUP6 ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x20 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE JUMP JUMPDEST ADD SWAP1 PUSH1 0x20 DUP1 SWAP2 DUP1 MLOAD DUP5 MSTORE ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x321 JUMPI MLOAD PUSH2 0x7B1 DUP2 PUSH2 0x3CC JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x7B1 SWAP4 DUP2 DUP2 MSTORE ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP1 PUSH2 0x27AC PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x7B1 SWAP8 SWAP6 SWAP7 SWAP5 PUSH1 0x60 DUP6 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 PUSH2 0x1B9D JUMP JUMPDEST SWAP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x1B9D JUMP JUMPDEST PUSH1 0x0 SWAP1 PUSH1 0x3 RETURNDATASIZE GT PUSH2 0x27CD JUMPI JUMP JUMPDEST SWAP1 POP PUSH1 0x4 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x44 RETURNDATASIZE LT PUSH2 0x7B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0x3 NOT SWAP2 DUP3 RETURNDATASIZE ADD PUSH1 0x4 DUP4 RETURNDATACOPY DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP3 GT RETURNDATASIZE PUSH1 0x24 DUP5 ADD GT OR PUSH2 0x283C JUMPI DUP2 DUP5 ADD SWAP5 DUP6 MLOAD SWAP4 DUP5 GT PUSH2 0x2844 JUMPI RETURNDATASIZE DUP6 ADD ADD PUSH1 0x20 DUP5 DUP8 ADD ADD GT PUSH2 0x283C JUMPI POP PUSH2 0x7B1 SWAP3 SWAP2 ADD PUSH1 0x20 ADD SWAP1 PUSH2 0x51D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x285A PUSH1 0x40 DUP3 ADD DUP3 PUSH2 0x1B3D JUMP JUMPDEST PUSH2 0x2872 PUSH2 0x2866 DUP5 PUSH2 0x2067 JUMP JUMPDEST SWAP4 PUSH2 0x120 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP3 SWAP1 ADDRESS EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH1 0x0 SWAP4 PUSH2 0x28B6 SWAP2 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x957122AB00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x278A JUMP JUMPDEST SUB DUP2 ADDRESS GAS STATICCALL SWAP1 DUP2 PUSH2 0x2926 JUMPI JUMPDEST POP PUSH2 0x3EA JUMPI PUSH1 0x1 PUSH2 0x28D1 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x28EA JUMPI JUMPDEST PUSH2 0x28E2 JUMPI JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x28F2 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x28FE JUMPI JUMPDEST POP PUSH2 0x28DC JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP3 POP ISZERO PUSH2 0x28F8 JUMPI PUSH2 0xD6A SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x233B JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x2933 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x28C2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2944 SWAP1 PUSH2 0x2B0A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP2 DUP4 AND PUSH2 0x2A8B JUMPI PUSH2 0x2A36 JUMPI PUSH2 0x2961 SWAP1 PUSH2 0x2B0A JUMP JUMPDEST SWAP2 AND PUSH2 0x29E1 JUMPI PUSH2 0x296E JUMPI POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413332207061796D61737465722065787069726564206F72206E6F74206475 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6500000000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413334207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414132322065787069726564206F72206E6F7420647565000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2AEC SWAP1 PUSH2 0x2B0A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP1 SWAP6 AND SWAP2 AND SUB PUSH2 0x2A8B JUMPI PUSH2 0x2A36 JUMPI PUSH2 0x2961 SWAP1 JUMPDEST DUP1 ISZERO PUSH2 0x2B50 JUMPI PUSH2 0x2B19 SWAP1 PUSH2 0x47F1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH6 0xFFFFFFFFFFFF DUP1 PUSH1 0x40 DUP5 ADD MLOAD AND TIMESTAMP GT SWAP1 DUP2 ISZERO PUSH2 0x2B40 JUMPI JUMPDEST POP SWAP2 MLOAD AND SWAP2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD MLOAD AND TIMESTAMP LT CODESIZE PUSH2 0x2B39 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2B60 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413934206761732076616C756573206F766572666C6F770000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x0 SWAP2 GAS SWAP4 DUP2 MLOAD SWAP1 PUSH2 0x2BB7 DUP3 DUP3 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2BC0 DUP2 PUSH2 0x249E JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BFE PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD OR PUSH1 0x40 DUP6 ADD MLOAD OR PUSH2 0x100 DUP5 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 DUP6 ADD CALLDATALOAD OR OR GT ISZERO PUSH2 0x2B59 JUMP JUMPDEST PUSH2 0x2C07 DUP3 PUSH2 0x2FF3 JUMP JUMPDEST PUSH2 0x2C12 DUP2 DUP6 DUP5 PUSH2 0x30A7 JUMP JUMPDEST SWAP8 SWAP1 PUSH2 0x2C36 PUSH2 0x23E0 PUSH2 0x2C2B DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD MLOAD SWAP1 PUSH2 0x48E4 JUMP JUMPDEST PUSH2 0x2CFF JUMPI PUSH2 0x2C43 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x2C61 PUSH1 0xA0 PUSH1 0x60 SWAP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST AND PUSH2 0x2CE5 JUMPI JUMPDEST POP GAS DUP2 SUB PUSH1 0xA0 DUP5 ADD CALLDATALOAD LT PUSH2 0x2C91 JUMPI PUSH1 0x80 SWAP4 PUSH1 0xC0 SWAP3 PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD MSTORE GAS SWAP1 SUB SWAP2 ADD CALLDATALOAD ADD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP4 POP DUP2 PUSH2 0x2CF6 SWAP3 SWAP8 POP DUP6 DUP5 PUSH2 0x3BAC JUMP JUMPDEST SWAP6 SWAP1 SWAP3 CODESIZE PUSH2 0x2C67 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH1 0x0 SWAP3 GAS DUP3 MLOAD PUSH2 0x2D66 DUP2 DUP5 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2D6F DUP4 PUSH2 0x249E JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x2DAD PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD OR PUSH1 0x40 DUP5 ADD MLOAD OR PUSH2 0x100 DUP7 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 DUP8 ADD CALLDATALOAD OR OR GT ISZERO PUSH2 0x2B59 JUMP JUMPDEST PUSH2 0x2DB6 DUP2 PUSH2 0x2FF3 JUMP JUMPDEST PUSH2 0x2DC2 DUP2 DUP7 DUP7 DUP12 PUSH2 0x3387 JUMP JUMPDEST SWAP9 SWAP1 PUSH2 0x2DE6 PUSH2 0x23E0 PUSH2 0x2DDB DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 PUSH2 0x48E4 JUMP JUMPDEST PUSH2 0x2EAB JUMPI PUSH2 0x2DF3 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x2E11 PUSH1 0xA0 PUSH1 0x60 SWAP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST AND PUSH2 0x2E90 JUMPI JUMPDEST POP GAS DUP5 SUB PUSH1 0xA0 DUP7 ADD CALLDATALOAD LT PUSH2 0x2E43 JUMPI POP PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 SWAP2 SWAP1 PUSH1 0xC0 SWAP1 GAS SWAP1 SUB SWAP2 ADD CALLDATALOAD ADD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 SWAP3 POP DUP2 PUSH2 0x2EA2 SWAP3 SWAP9 POP DUP7 DUP7 DUP6 PUSH2 0x3DE6 JUMP JUMPDEST SWAP7 SWAP1 SWAP2 CODESIZE PUSH2 0x2E17 JUMP JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2F07 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393320696E76616C6964207061796D6173746572416E6444617461000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x2FB0 SWAP1 PUSH2 0x2F68 PUSH2 0x2F5B DUP3 PUSH2 0x2067 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0xA0 DUP2 ADD CALLDATALOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0xC0 DUP2 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xE0 DUP2 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x100 DUP2 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x120 DUP2 ADD SWAP1 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2FE8 JUMPI PUSH2 0x2FDA PUSH2 0xFE9 PUSH2 0xFE3 DUP5 PUSH1 0xA0 SWAP5 PUSH2 0x2FD5 PUSH1 0x14 PUSH2 0x3EA SWAP10 SWAP9 LT ISZERO PUSH2 0x2F00 JUMP JUMPDEST PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 ADD MSTORE JUMP JUMPDEST POP POP PUSH1 0xA0 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x3028 JUMPI PUSH1 0xC0 PUSH1 0x3 JUMPDEST PUSH1 0xFF PUSH1 0x40 DUP5 ADD MLOAD SWAP2 AND PUSH1 0x60 DUP5 ADD MLOAD MUL ADD PUSH1 0x80 DUP4 ADD MLOAD ADD SWAP2 ADD MLOAD MUL SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x1 PUSH2 0x300B JUMP JUMPDEST PUSH2 0x3049 PUSH1 0x40 SWAP3 SWAP6 SWAP5 SWAP4 SWAP6 PUSH1 0x60 DUP4 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x210C JUMP JUMPDEST SWAP5 PUSH1 0x20 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x2F PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x414132332072657665727465643A200000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST DUP2 ADD SUB PUSH1 0xF DUP2 ADD DUP6 MSTORE ADD DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP3 GAS SWAP4 PUSH2 0x314E PUSH1 0x20 DUP4 MLOAD SWAP4 PUSH2 0x30C9 DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP6 PUSH2 0x30E1 PUSH2 0x30DA PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP5 PUSH2 0x358D JUMP JUMPDEST PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x30F9 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST DUP6 DUP1 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 SWAP5 AND ISZERO SWAP9 DUP10 PUSH2 0x332C JUMPI JUMPDEST PUSH1 0x60 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x3A871CDD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 SWAP1 PUSH1 0x4 DUP6 ADD PUSH2 0x3031 JUMP JUMPDEST SUB SWAP4 DUP11 AND SWAP1 CALL DUP3 SWAP2 DUP2 PUSH2 0x330C JUMPI JUMPDEST POP PUSH2 0x3303 JUMPI POP PUSH1 0x1 SWAP1 PUSH2 0x316D PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x32C8 JUMPI JUMPDEST POP PUSH2 0x3274 JUMPI JUMPDEST PUSH2 0x318B JUMPI JUMPDEST POP POP GAS SWAP1 SUB SWAP2 JUMP JUMPDEST PUSH2 0x31A8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x31C3 PUSH2 0x8FB DUP3 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP1 DUP4 GT PUSH2 0x3220 JUMPI PUSH2 0x3219 SWAP3 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST CODESIZE DUP1 PUSH2 0x3183 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x32D0 PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x32DC JUMPI POP PUSH2 0x3178 JUMP JUMPDEST PUSH2 0xD6A SWAP2 PUSH2 0x32EA SWAP2 POP PUSH2 0x3053 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x233B JUMP JUMPDEST SWAP6 POP PUSH2 0x317E SWAP1 POP JUMP JUMPDEST PUSH2 0x3325 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x315C JUMP JUMPDEST SWAP5 POP PUSH2 0x3365 PUSH2 0x8FB PUSH2 0x3351 DUP13 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP12 DUP2 GT ISZERO PUSH2 0x337C JUMPI POP DUP6 PUSH1 0x60 DUP4 JUMPDEST SWAP7 SWAP2 POP POP PUSH2 0x310F JUMP JUMPDEST PUSH1 0x60 DUP8 SWAP2 DUP14 SUB PUSH2 0x3373 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x0 SWAP4 PUSH1 0x0 SWAP4 GAS SWAP5 PUSH2 0x33C3 PUSH1 0x20 DUP4 MLOAD SWAP4 PUSH2 0x33AA DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP6 PUSH2 0x30E1 PUSH2 0x33BB PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1B3D JUMP JUMPDEST SWAP1 DUP5 DUP13 PUSH2 0x3820 JUMP JUMPDEST SUB SWAP4 DUP11 AND SWAP1 CALL DUP3 SWAP2 DUP2 PUSH2 0x356D JUMPI JUMPDEST POP PUSH2 0x3564 JUMPI POP PUSH1 0x1 SWAP1 PUSH2 0x33E2 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3527 JUMPI JUMPDEST POP PUSH2 0x34D2 JUMPI JUMPDEST PUSH2 0x3401 JUMPI JUMPDEST POP POP POP GAS SWAP1 SUB SWAP2 JUMP JUMPDEST PUSH2 0x341E SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x343A PUSH2 0x8FB DUP5 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 DUP2 DUP4 GT PUSH2 0x3485 JUMPI POP DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND SWAP2 SWAP1 SUB PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x33F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x352F PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x353B JUMPI POP PUSH2 0x33ED JUMP JUMPDEST DUP7 SWAP2 PUSH2 0x3547 SWAP2 POP PUSH2 0x3053 JUMP JUMPDEST SWAP1 PUSH2 0xD6A PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x2353 JUMP JUMPDEST SWAP7 POP PUSH2 0x33F3 SWAP1 POP JUMP JUMPDEST PUSH2 0x3586 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1E4B JUMPI PUSH2 0x1E3C DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x33D1 JUMP JUMPDEST SWAP1 SWAP2 DUP1 PUSH2 0x3599 JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 DUP4 EXTCODESIZE PUSH2 0x37CC JUMPI PUSH1 0x60 DUP4 MLOAD ADD MLOAD PUSH1 0x40 MLOAD SWAP1 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 DUP3 DUP1 PUSH2 0x35EB DUP8 DUP8 PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 PUSH32 0x0 AND SWAP1 CALL SWAP2 DUP3 ISZERO PUSH2 0x37BF JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x379F JUMPI JUMPDEST POP DUP1 DUP3 AND SWAP6 DUP7 ISZERO PUSH2 0x374B JUMPI AND DUP1 SWAP6 SUB PUSH2 0x36F7 JUMPI EXTCODESIZE ISZERO PUSH2 0x36A3 JUMPI PUSH2 0xFE9 PUSH2 0xFE3 PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D SWAP4 PUSH2 0x3677 SWAP4 PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP4 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x37B8 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x362D JUMP JUMPDEST PUSH2 0x37C7 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x3625 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP2 PUSH2 0x382F JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP3 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP4 DUP5 EXTCODESIZE PUSH2 0x3A65 JUMPI PUSH1 0x60 DUP5 MLOAD ADD MLOAD PUSH1 0x40 MLOAD SWAP1 PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 DUP3 DUP1 PUSH2 0x3881 DUP9 DUP9 PUSH1 0x4 DUP5 ADD PUSH2 0x2779 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 PUSH32 0x0 AND SWAP1 CALL SWAP2 DUP3 ISZERO PUSH2 0x3A58 JUMPI JUMPDEST PUSH1 0x0 SWAP3 PUSH2 0x3A38 JUMPI JUMPDEST POP DUP1 DUP3 AND SWAP7 DUP8 ISZERO PUSH2 0x39E3 JUMPI AND DUP1 SWAP7 SUB PUSH2 0x398E JUMPI EXTCODESIZE ISZERO PUSH2 0x3941 JUMPI POP PUSH2 0xFE9 PUSH2 0xFE3 PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D SWAP4 PUSH2 0x390E SWAP4 PUSH2 0x25E2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP4 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3829 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0xD6A DUP3 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD6A DUP5 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x3A51 SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x11A8 JUMPI PUSH2 0x1199 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0x38C3 JUMP JUMPDEST PUSH2 0x3A60 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x38BB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST ISZERO PUSH2 0x3AB9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141343120746F6F206C6974746C6520766572696669636174696F6E47617300 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x321 JUMPI DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x321 JUMPI DUP4 ADD SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x321 JUMPI DUP2 MLOAD SWAP2 PUSH2 0x3B34 DUP4 PUSH2 0x58D JUMP JUMPDEST SWAP2 PUSH2 0x3B42 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x51D JUMP JUMPDEST DUP4 DUP4 MSTORE PUSH1 0x20 DUP5 DUP4 ADD ADD GT PUSH2 0x321 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x3B62 SWAP2 DUP5 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x2F PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x414133332072657665727465643A200000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST SWAP4 SWAP2 SWAP3 PUSH1 0x60 SWAP5 PUSH1 0x0 SWAP5 PUSH1 0x0 SWAP4 DUP1 MLOAD SWAP3 PUSH2 0x3BDE PUSH1 0xA0 DUP11 DUP7 ADD MLOAD SWAP6 PUSH2 0x3BD0 DUP9 DUP9 GT PUSH2 0x3AB2 JUMP JUMPDEST ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x3BFC DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP5 PUSH2 0x3C18 PUSH2 0x8FB DUP8 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP7 DUP6 DUP9 LT PUSH2 0x3D92 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP11 SWAP9 SWAP5 PUSH2 0x3C81 DUP11 SWAP7 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH2 0x3CBA SWAP15 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST ADD MLOAD SWAP5 PUSH1 0x40 MLOAD SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP4 PUSH32 0xF465C77E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x3031 JUMP JUMPDEST SUB SWAP6 AND SWAP2 SUB CALL SWAP1 DUP2 DUP4 SWAP2 DUP5 SWAP4 PUSH2 0x3D6C JUMPI JUMPDEST POP PUSH2 0x3D65 JUMPI POP POP PUSH1 0x1 SWAP1 PUSH2 0x3CDD PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3D43 JUMPI JUMPDEST POP PUSH2 0x3CEF JUMPI JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x3D4B PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x3D57 JUMPI POP PUSH2 0x3CE8 JUMP JUMPDEST PUSH2 0xD6A SWAP2 PUSH2 0x32EA SWAP2 POP PUSH2 0x3B68 JUMP JUMPDEST SWAP5 POP SWAP3 POP POP JUMP JUMPDEST SWAP1 SWAP3 POP PUSH2 0x3D8B SWAP2 POP RETURNDATASIZE DUP1 DUP6 DUP4 RETURNDATACOPY PUSH2 0x3D83 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AFD JUMP JUMPDEST SWAP2 CODESIZE PUSH2 0x3CCB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH1 0x60 SWAP6 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP4 DUP3 MLOAD SWAP1 PUSH2 0x3E0D PUSH1 0xA0 DUP12 DUP5 ADD MLOAD SWAP4 PUSH2 0x3BD0 DUP5 DUP7 GT PUSH2 0x3AB2 JUMP JUMPDEST SWAP4 PUSH2 0x3E2B DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3E46 PUSH2 0x8FB DUP3 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP8 DUP2 LT PUSH2 0x3F7B JUMPI SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP11 SWAP9 SWAP7 SWAP4 SWAP5 PUSH2 0x3C81 DUP11 SWAP7 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 PUSH2 0x3EB3 SWAP15 SWAP13 SWAP11 SUB AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST SUB SWAP6 AND SWAP2 SUB CALL SWAP1 DUP2 DUP4 SWAP2 DUP5 SWAP4 PUSH2 0x3F5D JUMPI JUMPDEST POP PUSH2 0x3F55 JUMPI POP POP PUSH1 0x1 SWAP1 PUSH2 0x3ED6 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x3F36 JUMPI JUMPDEST POP PUSH2 0x3EE9 JUMPI POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH2 0x3F3E PUSH2 0x27DE JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x3F4A JUMPI POP PUSH2 0x3EE1 JUMP JUMPDEST PUSH2 0x3547 SWAP3 POP POP PUSH2 0x3B68 JUMP JUMPDEST SWAP6 POP SWAP4 POP POP POP JUMP JUMPDEST SWAP1 SWAP3 POP PUSH2 0x3F74 SWAP2 POP RETURNDATASIZE DUP1 DUP6 DUP4 RETURNDATACOPY PUSH2 0x3D83 DUP2 DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP2 CODESIZE PUSH2 0x3EC4 JUMP JUMPDEST PUSH2 0xD6A DUP11 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x3FDA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x4027 PUSH1 0x40 SWAP2 PUSH1 0x2 DUP7 MSTORE PUSH1 0x60 PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x3FDA JUMPI PUSH1 0x40 SWAP2 PUSH2 0x4027 SWAP2 DUP7 MSTORE PUSH1 0x60 PUSH1 0x20 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x1BE1 JUMP JUMPDEST SWAP1 PUSH2 0x3EA PUSH1 0x36 PUSH1 0x40 MLOAD DUP1 SWAP5 PUSH32 0x4141353020706F73744F702072657665727465643A2000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4097 DUP2 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x1BBE JUMP JUMPDEST DUP2 ADD SUB PUSH1 0x16 DUP2 ADD DUP6 MSTORE ADD DUP4 PUSH2 0x51D JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 GAS SWAP4 PUSH1 0x0 SWAP2 DUP1 MLOAD SWAP2 PUSH2 0x40BC DUP4 PUSH2 0x47AA JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP6 PUSH2 0x40D3 DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 DUP5 DUP2 AND SWAP1 DUP2 PUSH2 0x41F5 JUMPI POP POP POP PUSH2 0x40FA DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP9 JUMPDEST GAS SWAP1 SUB ADD SWAP4 DUP5 MUL SWAP8 PUSH1 0x40 DUP5 ADD SWAP1 DUP10 DUP3 MLOAD LT PUSH2 0x41A1 JUMPI PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 PUSH2 0x4146 PUSH1 0x20 SWAP3 DUP13 PUSH2 0x419C SWAP6 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST ADD MLOAD SWAP5 DUP10 PUSH1 0x20 PUSH2 0x416E PUSH2 0x4160 DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP5 ADD MLOAD SWAP8 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP11 AND SWAP9 DUP6 SWAP1 SWAP5 SWAP4 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x80 DUP4 ADD SWAP7 DUP4 MSTORE ISZERO ISZERO PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST SWAP11 SWAP2 DUP1 MLOAD PUSH2 0x4205 JUMPI JUMPDEST POP POP PUSH2 0x40FC JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 SWAP10 POP SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x4313 JUMPI SWAP2 DUP10 SWAP2 DUP10 DUP4 PUSH2 0x4258 SWAP6 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP7 DUP3 SWAP6 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP13 MUL SWAP1 PUSH1 0x4 DUP5 ADD PUSH2 0x4009 JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x4300 JUMPI JUMPDEST POP PUSH2 0x42FB JUMPI PUSH1 0x1 PUSH2 0x4271 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x42DC JUMPI JUMPDEST PUSH2 0x4288 JUMPI JUMPDEST CODESIZE DUP1 PUSH2 0x41FE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x42E4 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x42EF JUMPI POP PUSH2 0x427C JUMP JUMPDEST PUSH2 0x32EA PUSH2 0xD6A SWAP2 PUSH2 0x4053 JUMP JUMPDEST PUSH2 0x4281 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x430D SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x4262 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST SWAP4 SWAP3 SWAP2 GAS SWAP1 PUSH1 0x0 SWAP3 DUP1 MLOAD SWAP1 PUSH2 0x432B DUP3 PUSH2 0x47AA JUMP JUMPDEST SWAP4 PUSH1 0xA0 DUP4 ADD SWAP7 PUSH2 0x4342 DUP9 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 SWAP1 DUP7 DUP2 AND SWAP1 DUP2 PUSH2 0x4405 JUMPI POP POP POP PUSH2 0x4369 DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP2 JUMPDEST GAS SWAP1 SUB ADD SWAP5 DUP6 MUL SWAP9 PUSH1 0x40 DUP4 ADD SWAP1 DUP11 DUP3 MLOAD LT PUSH2 0x43B8 JUMPI POP PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 SWAP4 SWAP3 PUSH2 0x4146 PUSH2 0x419C SWAP4 DUP13 PUSH1 0x20 SWAP5 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP4 SWAP2 DUP1 MLOAD PUSH2 0x4415 JUMPI JUMPDEST POP POP PUSH2 0x436B JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD PUSH1 0x0 SWAP11 POP SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x4522 JUMPI SWAP2 DUP11 SWAP2 DUP11 DUP4 PUSH2 0x4468 SWAP6 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP7 DUP3 SWAP6 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP13 MUL SWAP1 PUSH1 0x4 DUP5 ADD PUSH2 0x4009 JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x450F JUMPI JUMPDEST POP PUSH2 0x450A JUMPI PUSH1 0x1 PUSH2 0x4481 PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x44ED JUMPI JUMPDEST PUSH2 0x4498 JUMPI JUMPDEST CODESIZE DUP1 PUSH2 0x440E JUMP JUMPDEST PUSH2 0xD6A DUP12 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH4 0x1101335B PUSH1 0xE1 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH1 0x80 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x44F5 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x4500 JUMPI POP PUSH2 0x448C JUMP JUMPDEST PUSH2 0x3547 DUP14 SWAP2 PUSH2 0x4053 JUMP JUMPDEST PUSH2 0x4491 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x451C SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x4472 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP2 GAS SWAP5 DUP1 MLOAD SWAP2 PUSH2 0x4538 DUP4 PUSH2 0x47AA JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP6 PUSH2 0x454F DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP2 DUP6 AND SWAP2 DUP3 PUSH2 0x4610 JUMPI POP POP POP PUSH2 0x4575 DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP9 JUMPDEST GAS SWAP1 SUB ADD SWAP4 DUP5 MUL SWAP8 PUSH1 0x40 DUP5 ADD SWAP1 DUP10 DUP3 MLOAD LT PUSH2 0x41A1 JUMPI PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F SWAP5 PUSH2 0x45C1 PUSH1 0x20 SWAP3 DUP13 PUSH2 0x419C SWAP6 MLOAD SUB SWAP1 PUSH2 0x4998 JUMP JUMPDEST PUSH2 0x45CA DUP9 PUSH2 0x3FD0 JUMP JUMPDEST ADD MLOAD SWAP5 DUP10 PUSH1 0x20 PUSH2 0x45E4 PUSH2 0x4160 DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP5 ADD MLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP9 ISZERO PUSH1 0x20 DUP3 ADD MSTORE SWAP8 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE SWAP1 DUP3 AND SWAP6 SWAP1 SWAP2 AND SWAP4 SWAP1 DUP2 SWAP1 PUSH1 0x80 DUP3 ADD SWAP1 JUMP JUMPDEST SWAP11 SWAP2 DUP2 MLOAD PUSH2 0x4620 JUMPI JUMPDEST POP POP PUSH2 0x4577 JUMP JUMPDEST DUP8 DUP5 MUL PUSH2 0x462C DUP11 PUSH2 0x3FD0 JUMP JUMPDEST PUSH1 0x2 DUP11 EQ PUSH2 0x46B7 JUMPI PUSH1 0x60 DUP7 ADD MLOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH2 0x467F SWAP4 PUSH1 0x0 DUP1 SWAP5 DUP14 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x402C JUMP JUMPDEST SUB SWAP4 CALL DUP1 ISZERO PUSH2 0x46AA JUMPI JUMPDEST PUSH2 0x4697 JUMPI JUMPDEST POP JUMPDEST CODESIZE DUP1 PUSH2 0x4619 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x46A4 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x468E JUMP JUMPDEST PUSH2 0x46B2 PUSH2 0x1CAF JUMP JUMPDEST PUSH2 0x4689 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x321 JUMPI PUSH2 0x4702 SWAP4 PUSH1 0x0 DUP1 SWAP5 DUP14 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP4 PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x402C JUMP JUMPDEST SUB SWAP4 CALL SWAP1 DUP2 PUSH2 0x4797 JUMPI JUMPDEST POP PUSH2 0x4792 JUMPI PUSH1 0x1 PUSH2 0x471B PUSH2 0x27C0 JUMP JUMPDEST PUSH4 0x8C379A0 EQ PUSH2 0x477F JUMPI JUMPDEST ISZERO PUSH2 0x4690 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0xD6A PUSH1 0x4 DUP3 ADD PUSH1 0x80 SWAP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x4787 PUSH2 0x27DE JUMP JUMPDEST DUP1 PUSH2 0x42EF JUMPI POP PUSH2 0x4726 JUMP JUMPDEST PUSH2 0x4690 JUMP JUMPDEST DUP1 PUSH2 0xD91 PUSH2 0x47A4 SWAP3 PUSH2 0x4ED JUMP JUMPDEST CODESIZE PUSH2 0x470C JUMP JUMPDEST PUSH1 0xE0 PUSH1 0xC0 DUP3 ADD MLOAD SWAP2 ADD MLOAD DUP1 DUP3 EQ PUSH2 0x47CE JUMPI BASEFEE ADD DUP1 DUP3 LT ISZERO PUSH2 0x47C9 JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH2 0x47DF DUP3 PUSH2 0x501 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 DUP3 DUP2 MSTORE DUP3 PUSH1 0x20 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x47F9 PUSH2 0x47D2 JUMP JUMPDEST POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 PUSH1 0xA0 SHR AND DUP1 ISZERO PUSH2 0x4838 JUMPI JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x481B DUP5 PUSH2 0x501 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0xD0 SHR PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST POP DUP1 PUSH2 0x480E JUMP JUMPDEST PUSH2 0x4854 PUSH2 0x485A SWAP2 PUSH2 0x484E PUSH2 0x47D2 JUMP JUMPDEST POP PUSH2 0x47F1 JUMP JUMPDEST SWAP2 PUSH2 0x47F1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 DUP3 MLOAD AND SWAP3 DUP4 ISZERO PUSH2 0x48D9 JUMPI JUMPDEST PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 SWAP2 DUP3 PUSH1 0x40 DUP2 PUSH1 0x20 DUP6 ADD MLOAD AND SWAP4 ADD MLOAD AND SWAP4 DUP4 PUSH1 0x40 DUP2 PUSH1 0x20 DUP5 ADD MLOAD AND SWAP3 ADD MLOAD AND SWAP1 DUP1 DUP5 LT PUSH2 0x48D1 JUMPI JUMPDEST POP DUP1 DUP6 GT PUSH2 0x48C9 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP6 PUSH2 0x48B7 DUP8 PUSH2 0x501 JUMP JUMPDEST AND DUP6 MSTORE AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST SWAP4 POP CODESIZE PUSH2 0x48A9 JUMP JUMPDEST SWAP3 POP CODESIZE PUSH2 0x48A0 JUMP JUMPDEST DUP2 MLOAD DUP2 AND SWAP4 POP PUSH2 0x4870 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH8 0xFFFFFFFFFFFFFFFF PUSH2 0x4933 DUP3 PUSH1 0x40 SHR PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 DUP3 SLOAD SWAP3 PUSH2 0x4940 DUP5 PUSH2 0x1F8B JUMP JUMPDEST SWAP1 SSTORE AND EQ SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x4958 PUSH2 0x25AA JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD PUSH1 0x78 SHR AND DUP6 MSTORE ADD SLOAD AND PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x3EA CALLER PUSH2 0x4A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 DUP4 ADD DUP1 SWAP4 GT PUSH2 0x4A55 JUMPI JUMPDEST DUP1 DUP4 GT PUSH2 0x4A11 JUMPI PUSH2 0x3EA SWAP3 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6465706F736974206F766572666C6F7700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST PUSH2 0x4A5D PUSH2 0x1CBC JUMP JUMPDEST PUSH2 0x49CC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 PUSH2 0x4A75 CALLVALUE DUP3 PUSH2 0x4998 JUMP JUMPDEST AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 PUSH1 0x20 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG2 JUMP JUMPDEST ISZERO PUSH2 0x4AC8 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374207370656369667920756E7374616B652064656C6179000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4B13 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F7420646563726561736520756E7374616B652074696D6500000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4B5E JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207374616B65207370656369666965640000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4BA9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7374616B65206F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 PUSH6 0xFFFFFFFFFFFF PUSH1 0x80 PUSH1 0x1 PUSH2 0x3EA SWAP5 PUSH2 0x4C4D PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 MLOAD AND DUP3 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD ISZERO ISZERO PUSH15 0xFF0000000000000000000000000000 DUP3 SLOAD SWAP2 PUSH1 0x70 SHL AND DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR DUP4 SSTORE PUSH32 0xFFFFFF000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH29 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 PUSH1 0x40 DUP10 ADD MLOAD PUSH1 0x78 SHL AND SWAP3 AND OR OR DUP2 SSTORE ADD SWAP3 PUSH4 0xFFFFFFFF PUSH1 0x60 DUP3 ADD MLOAD AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 DUP6 SLOAD AND OR DUP5 SSTORE ADD MLOAD AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF PUSH10 0xFFFFFFFFFFFF00000000 DUP4 SLOAD SWAP3 PUSH1 0x20 SHL AND SWAP2 AND OR SWAP1 SSTORE JUMP JUMPDEST ISZERO PUSH2 0x4D58 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x616C726561647920756E7374616B696E67000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST SWAP2 SWAP1 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP1 SWAP5 AND SWAP2 AND ADD SWAP2 DUP3 GT PUSH2 0x1CF9 JUMPI JUMP JUMPDEST ISZERO PUSH2 0x4DBD JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207374616B6520746F207769746864726177000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E08 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742063616C6C20756E6C6F636B5374616B652829206669727374000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E53 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5374616B65207769746864726177616C206973206E6F74206475650000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4E9E JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F207769746864726177207374616B650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST ISZERO PUSH2 0x4EE9 JUMPI JUMP JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F2077697468647261770000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP2 DUP3 CALLDATACOPY KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 DUP4 DUP1 SWAP4 PUSH1 0x20 DUP5 MLOAD SWAP5 ADD SWAP3 CALL SWAP1 JUMP JUMPDEST RETURNDATASIZE PUSH2 0x800 DUP1 DUP3 GT PUSH2 0x4F71 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP2 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP1 JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x4F56 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB9 PUSH30 0x7AA061056A5E9C6AD974BA3AD5C6B5A83463963E9D403739FD7B43564016 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"596:27500:1:-:0;;;;;;;;;-1:-1:-1;596:27500:1;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;2684:47:5;;2169:10;2258:80;2160:20;2169:10;-1:-1:-1;;;;;596:27500:1;2160:8:5;596:27500:1;2160:8:5;596:27500:1;;;2160:8:5;596:27500:1;;;2160:20:5;2198:19;2190:58;2198:19;;;2190:58;:::i;:::-;2266:39;596:27500:1;2285:20:5;;;596:27500:1;;;;;;;;;;2266:39:5;-1:-1:-1;2266:39:5;2258:80;:::i;:::-;596:27500:1;;;;2377:9:5;2532:137;2364:22;2377:9;596:27500:1;;;;;2364:22:5;:::i;:::-;2404:9;2396:40;2404:9;;;2396:40;:::i;:::-;2446:53;2454:26;;;;2446:53;:::i;:::-;2532:137;596:27500:1;;;:::i;:::-;;;2532:137:5;596:27500:1;;;;;;2532:137:5;2285:20;596:27500:1;2532:137:5;;596:27500:1;;;;;2532:137:5;;;596:27500:1;;2532:137:5;596:27500:1;;;2532:137:5;;;596:27500:1;;2532:137:5;;;596:27500:1;2509:20:5;2169:10;-1:-1:-1;;;;;596:27500:1;2160:8:5;596:27500:1;2160:8:5;596:27500:1;;;2160:8:5;596:27500:1;;;2509:20:5;596:27500:1;:::i;:::-;2532:137:5;596:27500:1;;;;;;;;;;;;;2169:10:5;;596:27500:1;;;;;;;2684:47:5;;;;596:27500:1;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;848:36:3;868:10;;-1:-1:-1;596:27500:1;848:19:3;596:27500:1;;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;848:36:3;:38;596:27500:1;;848:38:3;:::i;:::-;1759:1:0;;596:27500:1;;-1:-1:-1;;;;;596:27500:1;;;;;:::o;:::-;;;;;;;:::i;:::-;:::o;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;-1:-1:-1;;596:27500:1;;;;;;268:74:3;596:27500:1;;;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;:::i;:::-;;;-1:-1:-1;596:27500:1;268:74:3;596:27500:1;;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;268:74:3;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;12412:15;596:27500;;12412:15;596:27500;;;;;;;;;;;12412:15;596:27500;:::o;:::-;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;596:27500:1;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;2227:103:0;;;;;:::i;:::-;3804:24:1;;;:::i;:::-;3872:1;3875:10;;;;;;4174:21;3872:1;4210:17;;;;;4243:13;4238:112;4258:10;;;;;;4385:9;;;;:::i;:::-;2292:1:0;1339::1;2809:22:0;1759:1;2629:209;4270:3:1;4320:6;;;596:27500;4320:6;4302:37;4320:6;;;;;:::i;:::-;4328:10;;;;:::i;:::-;;4302:37;;;:::i;:::-;596:27500;4270:3;596:27500;4243:13;;;;3887:3;3933:10;4142;4010:38;3933:10;596:27500;3933:10;;;;;:::i;:::-;;4033:6;;;;;:::i;:::-;4010:38;;:::i;:::-;4142:10;;;:::i;:::-;596:27500;3860:13;;;;;596:27500;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;4450:10:5;;596:27500:1;;;;;;;;;;;;4479:30:5;;;;596:27500:1;;4572:29:5;;-1:-1:-1;;;;;4572:29:5;;;4549:53;4572:29;;4564:38;4572:29;;;4757:38;4572:29;;:::i;:::-;596:27500:1;;;;4564:38:5;596:27500:1;;;;;;;;;;4549:53:5;596:27500:1;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;4450:10:5;;4617:54;;;596:27500:1;4699:48:5;;;;:::i;:::-;;4757:38;:::i;:::-;596:27500:1;;;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;:::i;:::-;;;-1:-1:-1;596:27500:1;462:19:3;596:27500:1;;462:32:3;596:27500:1;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;462:32:3;596:27500:1;;;;;;;;462:55:3;596:27500:1;;;;;;;;;;;:::i;:::-;2227:103:0;;:::i;:::-;4911:1:1;4927:13;4942:11;;;;;;5693:26;;;;:::i;:::-;5735:17;4911:1;5735:17;;4911:1;5797:13;5812:11;;;;;;6502;;4911:1;6471:21;6528:13;;6543:11;;;;;;7069:9;6995:38;;4911:1;6649:51;6995:38;;;7069:9;:::i;6556:3::-;6745:11;6611:19;;;;;:::i;:::-;6649:51;6676:23;6684:14;5124;6684;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;6649:51;;4911:1;6649:51;;6745:11;;:::i;:::-;6817:13;4911:1;6812:159;6832:10;;;;;;6556:3;;;;;;:::i;:::-;6528:13;;6844:3;6904:6;;;;6947:9;6867:62;6844:3;6904:6;6880:49;6904:6;;6912:16;6904:6;;;;;;:::i;:::-;6912:16;;:::i;:::-;;6880:49;;:::i;:::-;6867:62;;:::i;:::-;6947:9;;:::i;:::-;6844:3;;:::i;:::-;6817:13;;;;5825:3;5880:19;;;;;:::i;:::-;5124:14;5994;5944:11;;;;:::i;:::-;5994:14;;;;;:::i;:::-;6069:13;-1:-1:-1;;;;;4911:1:1;596:27500;;6064:387;6084:10;;;;;;5825:3;;;;;;;:::i;:::-;5797:13;;6096:3;6146:16;;;;6427:9;6146:16;6389:19;6146:16;6240:44;6146:16;6096:3;6146:16;;;:::i;:::-;;6269:6;;;;;:::i;:::-;6240:44;;:::i;:::-;6389:19;;;:::i;:::-;6427:9;:::i;6096:3::-;6069:13;;;;;4955:3;5010:19;;;;;:::i;:::-;5074:11;;;;;:::i;:::-;5124:14;5225:19;5124:14;;;;;:::i;5225:19::-;596:27500;-1:-1:-1;;;;;596:27500:1;;5217:69;5256:1;5225:33;;;5217:69;:::i;:::-;5301:305;;4955:3;5620:22;;;4955:3;5620:22;;;;:::i;:::-;4955:3;;:::i;:::-;4927:13;;;5301:305;5458:13;;;;;;;;;;;;;;;;;;:::i;:::-;5423:49;;;;;;;596:27500;;;;;;5423:49;;;;;596:27500;5423:49;;596:27500;5423:49;;;;;;;;:::i;:::-;;;;;4911:1;5423:49;;;;;;5301:305;-1:-1:-1;5419:173:1;;596:27500;;5527:46;;;-1:-1:-1;;;;;596:27500:1;;5527:46;;;596:27500;;;;;;;5527:46;;;;;;;5419:173;;;-1:-1:-1;5419:173:1;;-1:-1:-1;5419:173:1;;-1:-1:-1;5419:173:1;;5620:22;4955:3;5301:305;;5423:49;;;;;;:::i;:::-;;;:::i;:::-;;;;596:27500;;;;;;-1:-1:-1;;596:27500:1;;;;;;-1:-1:-1;;;;;596:27500:1;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;-1:-1:-1;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;-1:-1:-1;;;;;596:27500:1;;;;;:::i;:::-;;-1:-1:-1;596:27500:1;-1:-1:-1;596:27500:1;;;;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;1339:1;596:27500;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;16140:20;;;;:47;;;;596:27500;16136:182;;;16358:2;16331:29;;;16327:310;;596:27500;16671:10;596:27500;;;16671:10;;;-1:-1:-1;;;16671:10:1;;;;1759:1:0;596:27500:1;;;;;;;;1759:1:0;;596:27500:1;;16327:310;16412:24;16396:42;16412:24;16404:33;16412:24;;:::i;:::-;16404:33;;:::i;:::-;596:27500;;;;16396:42;16456:21;:26;16452:175;;16327:310;;;;16452:175;16575:37;596:27500;;;16575:37;;;-1:-1:-1;;;16575:37:1;;;;596:27500;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;16136:182;16272:35;596:27500;;;16272:35;;;-1:-1:-1;;;16272:35:1;;;;596:27500;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;16140:47;16164:18;;;:23;16140:47;;;596:27500;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15321:36;596:27500;;15321:36;;;596:27500;15321:36;;596:27500;15321:36;;;:::i;:::-;;596:27500;;-1:-1:-1;;;;;15321:13:1;;-1:-1:-1;15321:13:1;;596:27500;15321:36;;;;;;;596:27500;-1:-1:-1;15321:36:1;;;596:27500;;;;15374:27;;;;596:27500;;15374:27;;596:27500;15374:27;15321:36;;;;;596:27500;15321:36;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;596:27500;;;;;;;;;;:::o;:::-;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;-1:-1:-1;;596:27500:1;;;;;2955:10:5;596:27500:1;;;;;;;;2984:20:5;;;596:27500:1;;;;;2984:25:5;;;596:27500:1;;3163:32:5;3107:46;3205:19;596:27500:1;3034:41:5;596:27500:1;;;;;;;;;;;3034:41:5;:::i;:::-;596:27500:1;3114:15:5;596:27500:1;3107:46:5;:::i;:::-;596:27500:1;;;;;;;;;;;;;;;3163:32:5;596:27500:1;;;;;;;3205:19:5;596:27500:1;;;;;;;;;2955:10:5;;3239:39;;596:27500:1;;3239:39:5;596:27500:1;;;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;:::i;:::-;4091:44:5;-1:-1:-1;;;;;3593:20:5;3602:10;-1:-1:-1;;;;;596:27500:1;2160:8:5;596:27500:1;2160:8:5;596:27500:1;;;2160:8:5;596:27500:1;;;3593:20:5;596:27500:1;3935:14:5;3623:26;596:27500:1;;;;;;;;;;3623:26:5;3667:9;3659:42;3667:9;;;3659:42;:::i;:::-;3904:21;3719:17;;;3784:76;596:27500:1;;;;;;;;;;;;;3711:63:5;3719:21;;;3711:63;:::i;:::-;3813:15;-1:-1:-1;3792:36:5;3784:76;:::i;:::-;596:27500:1;;;;;;;3904:21:5;596:27500:1;;;;;;;3935:14:5;596:27500:1;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;3602:10:5;;3964:50;;;-1:-1:-1;596:27500:1;;;;;;;;4042:39:5;;;;:::i;:::-;;4091:44;:::i;596:27500:1:-;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;7822:101;596:27500;;;;;;:::i;:::-;;;:::i;:::-;7314:2;;;:::i;:::-;7460:60;7387:34;;;;:::i;:::-;7460:60;;:::i;:::-;-1:-1:-1;7570:29:1;-1:-1:-1;;28058:30:1;;;;7570:29;:::i;:::-;28058:30;;;;7633:18;7661:25;596:27500;;-1:-1:-1;;;;;596:27500:1;;7696:110;;596:27500;7838:15;;;;;;596:27500;7861:15;596:27500;;;;7861:15;;596:27500;;;;;;7878:15;;596:27500;;;;;;;;;7822:101;;;;;;596:27500;7822:101;;;:::i;7696:110::-;596:27500;;;;;;;;;;;;;;;;;;;:::i;:::-;7768:27;;;;;7838:15;7768:27;;:::i;:::-;7736:59;7696:110;;;;;;;596:27500;;;;;;;;:::i;:::-;;;:::i;:::-;12042:6;;;:::i;:::-;12119:41;;;;:::i;:::-;12217:17;;:27;;596:27500;12217:17;;;12203:42;;-1:-1:-1;;;;;596:27500:1;12203:42;:::i;12217:27::-;12203:42;:::i;:::-;12299:17;12285:39;12299:24;:17;;-1:-1:-1;;;;;596:27500:1;;;;;12285:39;596:27500;;;:::i;:::-;;12558:22;12412:15;;;;;;;;:::i;:::-;12459:71;-1:-1:-1;12478:2:1;12459:21;;12478:2;;12499:16;;12483:34;12499:16;12491:25;12499:16;;:::i;12558:22::-;12630:60;;;;:::i;:::-;596:27500;;-1:-1:-1;;;;;596:27500:1;;-1:-1:-1;;;;;596:27500:1;;12785:1;12763:24;;12839:18;;;;596:27500;12859:17;;;;596:27500;12901:15;;;;;596:27500;;;;;;;;12918:15;;596:27500;;;12960:23;;;596:27500;;;;:::i;:::-;;;;12901:15;12828:157;;596:27500;;;;12828:157;;;596:27500;;;12960:23;12828:157;;596:27500;;;12839:18;12828:157;;596:27500;12217:27;12828:157;;596:27500;13000:24;;:52;;;;12459:71;12996:305;;;596:27500;13317:68;596:27500;;13317:68;;;;;;596:27500;13317:68;;;:::i;12996:305::-;13144:25;;13191:99;13144:25;;;;:::i;:::-;13112:58;596:27500;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;;;;13112:58;12901:15;13112:58;;596:27500;;13191:99;;;;;;596:27500;13191:99;;;:::i;13000:52::-;13028:24;;;13000:52;;;12459:71;;;;12558:22;:::i;596:27500::-;;;;;;-1:-1:-1;;596:27500:1;;;;;-1:-1:-1;;;;;596:27500:1;;;;;:::i;:::-;;-1:-1:-1;596:27500:1;-1:-1:-1;596:27500:1;;;;-1:-1:-1;596:27500:1;;506:47:5;596:27500:1;;506:47:5;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;596:27500:1;;;;:::i;:::-;;;-1:-1:-1;596:27500:1;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;2336:287:0;2468:7;596:27500:1;;2468:19:0;1759:1;;2468:7;1759:1;;2336:287::o;1759:1::-;;596:27500:1;;-1:-1:-1;;;1759:1:0;;;;;;;;;;;;;;;;;;596:27500:1;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;596:27500:1;;;;:::o;:::-;;;:::o;1560:279::-;-1:-1:-1;;;;;596:27500:1;1653:25;;596:27500;;1676:1;1735:36;;;;;;;;;:::i;:::-;;596:27500;;;1560:279::o;596:27500::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;1759:1:0;596:27500:1;;-1:-1:-1;;596:27500:1;1759:1:0;;;;;;596:27500:1;-1:-1:-1;596:27500:1;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;596:27500:1;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;;596:27500:1;1759:1:0;596:27500:1;;;;1759:1:0;;;;;;;;;596:27500:1;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1039:13;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::o;2117:1131::-;;2278:9;2345:20;;2381:52;2400:15;2345:20;;;596:27500;2400:15;2345:20;2400:15;;;;:::i;:::-;596:27500;2381:52;596:27500;;;2381:52;;;;;596:27500;2381:52;;;;;;:::i;:::-;;:4;-1:-1:-1;2381:4:1;:52;;-1:-1:-1;;2381:52:1;;;2117:1131;-1:-1:-1;2377:865:1;;2576:109;2381:52;-1:-1:-1;2576:109:1;;596:27500;-1:-1:-1;2576:109:1;2783:35;2779:268;;3081:36;:18;3143:88;3090:9;;3081:18;;:::i;:::-;3102:15;;;596:27500;3081:36;;:::i;:::-;3143:88;;:::i;2779:268::-;596:27500;;-1:-1:-1;;;2996:36:1;;;;2381:52;2996:36;;1039:13;;-1:-1:-1;596:27500:1;;1039:13;;;;;;;;;1759:1:0;1039:13:1;1759:1:0;;;1039:13:1;;;;2377:865;2481:26;;;;2377:865;2117:1131::o;2381:52::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;2117:1131;;;;;2278:9;2345:20;;2381:52;2400:15;2345:20;;;596:27500;2400:15;2345:20;2400:15;;;;:::i;:::-;596:27500;2381:52;596:27500;;;2381:52;;;;;596:27500;2381:52;;;;;;:::i;:::-;;:4;-1:-1:-1;2381:4:1;:52;;-1:-1:-1;;2381:52:1;;;2117:1131;-1:-1:-1;2377:865:1;;2576:109;2381:52;-1:-1:-1;2576:109:1;;596:27500;-1:-1:-1;2576:109:1;2783:35;2779:268;;3081:36;:18;3143:88;3090:9;;;3081:18;;:::i;:::-;3102:15;;;596:27500;3081:36;;:::i;:::-;3143:88;;:::i;2779:268::-;2996:36;596:27500;;;2996:36;;;-1:-1:-1;;;2996:36:1;;2381:52;2996:36;;1039:13;;596:27500;;1039:13;;;;;;;;;1759:1:0;1039:13:1;1759:1:0;;;1039:13:1;;;;2377:865;2481:26;-1:-1:-1;;;;2117:1131:1:o;2381:52::-;;;;;;;;;;;;;;;:::i;:::-;;;;;596:27500;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1759:1:0;;;;596:27500:1;1759:1:0;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;1759:1:0;596:27500:1;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1759:1:0;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;1108:4;;;;;8983:14;596:27500;;1108:4;;;;;;;;:::i;:::-;;;;;;596:27500;;1108:4;;;;;;;;:::i;8697:1484::-;;;;;8861:9;8910:4;8880:63;8910:4;8888:10;:27;8880:63;:::i;:::-;8983:14;;9028:20;;;;596:27500;9155:9;;9213:4;9182:28;;;596:27500;;;;-1:-1:-1;9151:190:1;;10118:50;9357:62;-1:-1:-1;596:27500:1;;;9429:466;;8697:1484;9950:9;;;;1108:4;9950:9;;1108:4;;9962:15;;;596:27500;;1108:4;;;;:::i;:::-;10118:50;;:::i;9429:466::-;9553:8;596:27500;9483:52;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;9483:52;:::i;:::-;9553:8;;596:27500;9553:8;9549:336;;9429:466;;;;;9549:336;1108:4;9603:41;;;;;;:::i;:::-;596:27500;;;9662:152;;9549:336;9831:39;;9838:32;9549:336;;;;;9662:152;9712:83;-1:-1:-1;;;;;9738:17:1;;;1108:4;596:27500;9712:83;9738:17;596:27500;;;-1:-1:-1;;;;;596:27500:1;;;;9773:13;;596:27500;;9028:20;596:27500;;;;;9712:83;;;:::i;:::-;;;;9662:152;;;;9151:190;9233:98;-1:-1:-1;9233:98:1;;-1:-1:-1;9233:98:1;10389:174;2774:31:12;2789:15;;;;;;:::i;:::-;2774:31;;:::i;:::-;2853:15;2838:31;2853:15;;;;;;:::i;2838:31::-;3229:23;3271:237;3214:39;3229:23;;;;;;:::i;3214:39::-;2789:15;596:27500:1;3271:237:12;;;2729:12;3271:237;;3146:27;;;;596:27500:1;3086:19:12;;;;596:27500:1;3028:25:12;;;;596:27500:1;2962:27:12;;;;596:27500:1;2902:19:12;;;;596:27500:1;2729:12:12;-1:-1:-1;;;;;2729:12:12;;;596:27500:1;1871:39:12;;596:27500:1;3271:237:12;596:27500:1;;;;;;;;;;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:237:12;;;;-1:-1:-1;;3271:237:12;;;;;;;;:::i;:::-;596:27500:1;3615:23:12;;2789:15;596:27500:1;;2729:12:12;10500:55:1;;596:27500;;;10534:4;596:27500;;;;;;;10541:13;596:27500;;;;;10500:55;;;;;;;;;596:27500;10500:55;:::i;:::-;596:27500;10490:66;;10389:174;:::o;596:27500::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;596:27500:1;;;;;;;:::o;:::-;;;:::i;:::-;;;;;16358:2;596:27500;;;;16358:2;596:27500;:::o;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;596:27500:1:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;596:27500:1;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;:::o;15414:421::-;15595:15;;;;;;:::i;:::-;15627:23;15612:13;;;:::i;:::-;15627:23;;;;;;:::i;:::-;15562:4;;;:89;;;;15612:13;596:27500;15562:89;596:27500;15595:15;596:27500;15562:89;;;;;596:27500;15562:89;;;;;;:::i;:::-;;:4;;:89;;;;;;15414:421;-1:-1:-1;15558:271:1;;;;;:::i;:::-;;;;;;;;15414:421::o;15558:271::-;;;:::i;:::-;15663:166;;:::i;:::-;;;;15558:271;;;;15663:166;596:27500;;15612:13;;-1:-1:-1;15717:102:1;15663:166;15717:102;15779:25;596:27500;15595:15;596:27500;15779:25;;;-1:-1:-1;;;15779:25:1;;15562:89;15779:25;;;:::i;15562:89::-;;;;;;:::i;:::-;;;;20278:1061;;;20500:34;20278:1061;20500:34;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;;20544:111;;20664:96;;21060:43;;;:::i;:::-;596:27500;;21113:105;;21227:106;;20278:1061;:::o;21227:106::-;596:27500;;;-1:-1:-1;;;21268:54:1;;;;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;5527:46;21113:105;21166:41;596:27500;;;21166:41;;;-1:-1:-1;;;21166:41:1;;;;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;20664:96;20705:44;596:27500;;;20705:44;;;-1:-1:-1;;;20705:44:1;;;;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;20544:111;20603:41;596:27500;;;20603:41;;;-1:-1:-1;;;20603:41:1;;;;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;20278:1061;;;;20500:34;20278:1061;20500:34;:::i;:::-;596:27500;;-1:-1:-1;;;;;596:27500:1;;;;;;20548:32;20544:111;;20664:96;;21060:43;;21345:472;21475:19;;21471:76;;21585:36;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;21720:15;;;;596:27500;;21702:15;:33;:70;;;;;21345:472;21685:87;596:27500;;;21345:472;:::o;21702:70::-;21757:15;;;;;596:27500;;21702:15;21739:33;21702:70;;;21471:76;21510:26;21493:1;21510:26;21493:1;21510:26;:::o;596:27500::-;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;22174:2028;;-1:-1:-1;22386:9:1;;22435:17;;;22490:7;;;;;:::i;:::-;22531:21;;;:::i;:::-;22508:20;;;596:27500;22888:70;596:27500;22738:26;;;596:27500;22767:28;;;596:27500;22738:57;22798:20;;;596:27500;22738:80;22851:27;;;596:27500;22829:19;;;;596:27500;22738:110;:140;22896:33;;22888:70;:::i;:::-;23049:28;;;:::i;:::-;23142:71;;;;;:::i;:::-;23087:126;;23228:55;23229:54;596:27500;;;-1:-1:-1;;;;;596:27500:1;;;;22508:20;23269:13;;596:27500;23229:54;;:::i;23228:55::-;23224:140;;;28058:30;;;28010:84;23224:140;-1:-1:-1;;;;;596:27500:1;23599:17;22767:28;23599:17;;596:27500;-1:-1:-1;;;;;596:27500:1;;;;;23595:208;;22174:2028;23855:9;;1108:4;;23599:17;23879:27;;596:27500;23879:37;23875:126;;22738:26;24010:17;24164:25;24010:17;22798:20;24010:17;;596:27500;22767:28;24055:23;;596:27500;24152:9;1108:4;;24164:25;;596:27500;;24122:18;;596:27500;22174:2028::o;23875:126::-;22798:20;596:27500;-1:-1:-1;;;23939:51:1;;;;;;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;23595:208;23683:109;;;;;;;;;;;:::i;:::-;23646:146;;23595:208;;;;23224:140;22798:20;596:27500;-1:-1:-1;;;23306:47:1;;;;;;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;22174:2028;;;;596:27500;22386:9;;22435:17;;22490:7;;;;:::i;:::-;22531:21;;;:::i;:::-;22508:20;;;596:27500;22888:70;596:27500;22738:26;;;596:27500;22767:28;;;596:27500;22738:57;22798:20;;;596:27500;22738:80;22851:27;;;596:27500;22829:19;;;;596:27500;22738:110;:140;22896:33;;22888:70;:::i;:::-;23049:28;;;:::i;:::-;23142:71;;;;;;:::i;:::-;23087:126;;23228:55;23229:54;596:27500;;;-1:-1:-1;;;;;596:27500:1;;;;22508:20;23269:13;;596:27500;23229:54;;:::i;23228:55::-;23224:140;;;28058:30;;;28010:84;23224:140;-1:-1:-1;;;;;596:27500:1;23599:17;22767:28;23599:17;;596:27500;-1:-1:-1;;;;;596:27500:1;;;;;23595:208;;22174:2028;23855:9;;1108:4;;23599:17;23879:27;;596:27500;23879:37;23875:126;;-1:-1:-1;22798:20:1;24010:17;;596:27500;22767:28;24055:23;;596:27500;22738:26;;24010:17;24164:25;;24152:9;1108:4;;24164:25;;596:27500;;24122:18;;596:27500;22174:2028::o;23875:126::-;22798:20;596:27500;;-1:-1:-1;;;23939:51:1;;;;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;23595:208;23683:109;;;;;;;;;;;;:::i;:::-;23646:146;;23595:208;;;;23224:140;23306:47;596:27500;22798:20;596:27500;23306:47;;;-1:-1:-1;;;23306:47:1;;;;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;10658:832;11187:23;10658:832;10771:30;10788:13;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;;10771:30;10827:12;;;596:27500;10827:12;10811:13;;596:27500;10872:19;;;596:27500;10849:20;;;596:27500;10932:27;;;596:27500;10901:28;;;596:27500;10998:25;;;596:27500;10872:19;10969:26;;596:27500;11056:19;;;596:27500;10998:25;11033:20;;596:27500;11116:27;;;596:27500;11056:19;11085:28;;596:27500;11187:23;;;;;:::i;:::-;11224:27;;;;;11372:40;11380:31;11388:22;11275:29;10932:27;11275:29;11267:71;11302:2;11352:60;11275:29;;;;11267:71;:::i;:::-;11388:22;:::i;11372:40::-;-1:-1:-1;;;;;596:27500:1;11352:17;;596:27500;;11220:264;11443:17;;10932:27;596:27500;11443:17;;596:27500;10658:832::o;13399:551::-;13717:17;;;596:27500;-1:-1:-1;;;;;596:27500:1;13717:31;:39;;13917:20;13751:1;13717:39;596:27500;13788:20;;;596:27500;;;13811:28;;;596:27500;;;13848:26;;;596:27500;;13917:20;;596:27500;;13399:551;:::o;13717:39::-;13917:20;13755:1;13717:39;;596:27500;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;16894:1601::-;;-1:-1:-1;17091:22:1;-1:-1:-1;17158:9:1;;17207:14;17628:111;17700:17;17207:14;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;17311:11;;;;;;;;:::i;:::-;;;;:::i;:::-;17353:17;;;596:27500;-1:-1:-1;;;;;596:27500:1;17333:37;;28058:30;;;28010:84;17333:37;17404:31;;596:27500;-1:-1:-1;;;;;596:27500:1;;;17449:23;17445:170;;;;16894:1601;17666:28;;596:27500;17700:17;;;1108:4;17311:11;596:27500;;17628:111;;596:27500;;;;;;;1108:4;17628:111;;;;:::i;:::-;;596:27500;;;17628:111;;;;;;;16894:1601;-1:-1:-1;17624:435:1;;;;;;;:::i;:::-;;;;;;;;;;18068:350;;17624:435;18473:9;;;1108:4;;16894:1601;:::o;18068:350::-;18144:16;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;18144:16;18174:36;596:27500;;;;;;;18174:36;18228:25;;;18224:115;;18352:55;1108:4;596:27500;1108:4;;596:27500;;;;;;;;;;;18352:55;18068:350;;;;18224:115;17311:11;596:27500;-1:-1:-1;;;18280:44:1;;;;17628:111;18280:44;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;17624:435;17311:11;596:27500;-1:-1:-1;;;18005:43:1;;;;17628:111;18005:43;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;17624:435;17840:137;;:::i;:::-;;;;;17624:435;;;17840:137;17901:65;17840:137;17919:46;17840:137;17919:46;;:::i;:::-;17311:11;596:27500;17901:65;;;-1:-1:-1;;;17901:65:1;;17628:111;17901:65;;;:::i;17624:435::-;17796:32;-1:-1:-1;17624:435:1;;-1:-1:-1;17624:435:1;17628:111;;;;;17700:17;17628:111;;;;;;;;;:::i;:::-;;;;;17445:170;1178:17:5;;1171:32;1178:25;:17;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;1178:17:5;596:27500:1;;;;;1171:32:5;17555:21:1;;;;;;:49;;17666:28;17555:49;;17445:170;;;;;;17555:49;17666:28;1108:4;;;;17555:49;;16894:1601;;;596:27500;17091:22;596:27500;17158:9;;17207:14;17628:111;17700:17;17207:14;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;17311:11;;;;;;;;:::i;:::-;;;;;:::i;17628:111::-;;596:27500;;;17628:111;;;;;;;16894:1601;-1:-1:-1;17624:435:1;;;;;;;:::i;:::-;;;;;;;;;;18068:350;;17624:435;18473:9;;;;1108:4;;16894:1601;:::o;18068:350::-;18144:16;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;18144:16;596:27500;18174:36;596:27500;;;;;;;18174:36;18228:25;;;;18224:115;;-1:-1:-1;596:27500:1;;;;1108:4;;;596:27500;;;;;18068:350;;;;;18224:115;17311:11;596:27500;;-1:-1:-1;;;18280:44:1;;17628:111;18280:44;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;17624:435;18005:43;596:27500;17311:11;596:27500;18005:43;;;-1:-1:-1;;;18005:43:1;;17628:111;18005:43;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;17624:435;17840:137;;:::i;:::-;;;;;17624:435;;;17840:137;;;17919:46;17840:137;17919:46;;:::i;:::-;596:27500;17901:65;17311:11;596:27500;17901:65;;;-1:-1:-1;;;17901:65:1;;17628:111;17901:65;;;:::i;17624:435::-;17796:32;-1:-1:-1;17624:435:1;;-1:-1:-1;17624:435:1;17628:111;;;;;17700:17;17628:111;;;;;;;;;:::i;:::-;;;;;14003:885;;;14125:20;14121:761;;14003:885;;;:::o;14121:761::-;14178:14;;596:27500;-1:-1:-1;;;;;596:27500:1;14217:18;;;14213:88;;14366:35;:14;;:35;596:27500;;;14333:79;596:27500;14333:79;;;;;;;;;;;;:::i;:::-;;596:27500;-1:-1:-1;;;;;;14333:13:1;;;596:27500;14333:79;;;;;;;14121:761;-1:-1:-1;14333:79:1;;;14121:761;596:27500;;;;14430:21;;;14426:82;;596:27500;14526:17;;;14522:83;;14623:19;:24;14619:90;;14749:25;14757:16;14794:77;14757:16;14741:34;14757:16;;:::i;14741:34::-;14333:79;14810:17;;;1108:4;14846:14;;:24;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;14794:77;14003:885::o;14619:90::-;596:27500;;-1:-1:-1;;;14656:53:1;;;;14333:79;14656:53;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14522:83;596:27500;;-1:-1:-1;;;14552:53:1;;;;14333:79;14552:53;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14426:82;596:27500;;-1:-1:-1;;;14460:48:1;;;;14333:79;14460:48;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14333:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;14213:88;596:27500;;-1:-1:-1;;;14249:52:1;;;;;;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14003:885;;;;14125:20;14121:761;;14003:885;;;;;:::o;14121:761::-;14178:14;;596:27500;-1:-1:-1;;;;;596:27500:1;14217:18;;;14213:88;;14366:35;:14;;:35;596:27500;;;14333:79;596:27500;14333:79;;;;;;;;;;;;:::i;:::-;;596:27500;14144:1;-1:-1:-1;;;;;14333:13:1;;;596:27500;14333:79;;;;;;;14121:761;14144:1;14333:79;;;14121:761;596:27500;;;;14430:21;;;14426:82;;596:27500;14526:17;;;14522:83;;14623:19;:24;14619:90;;14757:16;14749:25;14757:16;14794:77;14757:16;14741:34;14757:16;;:::i;14741:34::-;14333:79;14810:17;;;1108:4;14846:14;;:24;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;;;;;;;14794:77;14121:761;;;;;;14619:90;596:27500;;;-1:-1:-1;;;14656:53:1;;14333:79;14656:53;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;14522:83;14552:53;596:27500;;;14552:53;;;-1:-1:-1;;;14552:53:1;;14333:79;14552:53;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14426:82;14460:48;596:27500;;;14460:48;;;-1:-1:-1;;;14460:48:1;;14333:79;14460:48;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;14333:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;14213:88;596:27500;;;-1:-1:-1;;;14249:52:1;;;;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;596:27500;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18753:1417::-;;;;596:27500;18974:22;-1:-1:-1;18974:22:1;-1:-1:-1;19054:14:1;;;19109:28;596:27500;19360:17;19109:28;;;596:27500;19155:57;19147:101;19155:57;;;19147:101;:::i;:::-;19360:17;596:27500;-1:-1:-1;;;;;596:27500:1;;;;19423:19;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;19423:19;596:27500;19452:39;596:27500;;;;;;;19452:39;19505:25;;;;19501:114;;-1:-1:-1;;;;;19757:17:1;1108:4;;;19624:58;1108:4;;596:27500;1108:4;19696:96;1108:4;;596:27500;;;;;;;;;;;19624:58;19757:17;1108:4;596:27500;;;19696:96;;;;;;;596:27500;19696:96;;;;;;:::i;:::-;;596:27500;;1108:4;;19696:96;;;;-1:-1:-1;;19696:96:1;;;18753:1417;-1:-1:-1;19692:466:1;;;;;;;;:::i;:::-;;;;;;;;;18753:1417::o;19692:466::-;596:27500;;-1:-1:-1;;;20104:43:1;;;;19696:96;20104:43;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;19692:466;19939:137;;:::i;:::-;;;;;19692:466;;;19939:137;20000:65;19939:137;20018:46;19939:137;20018:46;;:::i;19692:466::-;19863:18;-1:-1:-1;19863:18:1;-1:-1:-1;;18753:1417:1:o;19696:96::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;19501:114;596:27500;;-1:-1:-1;;;19553:51:1;;;;;;;596:27500;;-1:-1:-1;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;18753:1417;;;;;;;596:27500;18974:22;596:27500;18974:22;596:27500;19054:14;;;19109:28;596:27500;19360:17;19109:28;;;596:27500;19155:57;19147:101;19155:57;;;19147:101;:::i;596:27500::-;19423:19;;;-1:-1:-1;;;;;596:27500:1;;;;;;;;;;;19423:19;19452:39;596:27500;;;;;;;19452:39;19505:25;;;19501:114;;1108:4;-1:-1:-1;;;;;19757:17:1;1108:4;;;;;19624:58;1108:4;;596:27500;1108:4;19696:96;1108:4;;;;596:27500;;;;;;;;;;;19696:96;;596:27500;;1108:4;;19696:96;;;;596:27500;;19696:96;;;18753:1417;-1:-1:-1;19692:466:1;;;;;;;;:::i;:::-;;;;;;;;;;18753:1417::o;19692:466::-;596:27500;;;-1:-1:-1;;;20104:43:1;;19696:96;20104:43;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;19692:466;19939:137;;:::i;:::-;;;;;19692:466;;;19939:137;20018:46;19939:137;;20018:46;;:::i;19692:466::-;19863:18;-1:-1:-1;19863:18:1;-1:-1:-1;;;18753:1417:1:o;19696:96::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;19501:114;19553:51;596:27500;;;19553:51;;;-1:-1:-1;;;19553:51:1;;;;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;-1:-1:-1;596:27500:1;;;:::o;:::-;;;;;;;;;;;;;;;;;3166:36;596:27500;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;24846:1936::-;;;;;25048:9;25083:21;-1:-1:-1;25144:14:1;;;25187:26;;;;:::i;:::-;25244:17;;;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;-1:-1:-1;;;;;596:27500:1;;;;;;25275:23;596:27500;;;;;;;;-1:-1:-1;;;;;596:27500:1;;;;25271:959;;26261:9;1108:4;;596:27500;;;;26330:14;;;;596:27500;;;;26330:30;26326:121;;26634:122;596:27500;26546:6;26653:17;596:27500;;26634:122;596:27500;;1108:4;26546:6;;:::i;:::-;26653:17;1108:4;596:27500;;26653:17;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;;;-1:-1:-1;;;;;596:27500:1;;;;26707:13;;596:27500;;;26330:14;596:27500;;;;;;;26634:122;;596:27500;;;;;;;;;;;;;;;;;;;;;;;;;26634:122;;;;24846:1936::o;26326:121::-;26330:14;596:27500;-1:-1:-1;;;26383:53:1;;;;;;;596:27500;;8983:14;596:27500;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;25271:959;25375:25;;596:27500;;25414:806;;25271:959;;;;;25414:806;25827:28;;;596:27500;-1:-1:-1;;;25510:696:1;;25792:94;;;;;596:27500;;;;;25792:94;596:27500;;;25792:94;;;;;;596:27500;25792:94;;596:27500;;25792:94;;;;;:::i;:::-;;;;;;;;25414:806;-1:-1:-1;25788:400:1;;25514:44;25788:400;;:::i;:::-;;;;;;;;;25414:806;;;;25788:400;596:27500;;-1:-1:-1;;;26126:39:1;;;;25792:94;26126:39;;596:27500;;8983:14;596:27500;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;25788:400;25910:156;;:::i;:::-;;;;25788:400;;;25910:156;25995:47;25977:66;25910:156;25995:47;:::i;25788:400::-;;;25792:94;;;;;;:::i;:::-;;;;;596:27500;;;24846:1936;;;;25048:9;25083:21;-1:-1:-1;25144:14:1;;;25187:26;;;;:::i;:::-;25244:17;;;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;-1:-1:-1;;;;;596:27500:1;;;;;;25275:23;596:27500;;;;;;;;-1:-1:-1;;;;;596:27500:1;;;;25271:959;;26261:9;1108:4;;596:27500;;;;26330:14;;;;596:27500;;;;26330:30;26326:121;;596:27500;26634:122;596:27500;;;26546:6;26634:122;596:27500;;26653:17;596:27500;;1108:4;26546:6;;:::i;26326:121::-;26330:14;596:27500;;-1:-1:-1;;;26383:53:1;;;;;596:27500;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;5527:46;25271:959;25375:25;;596:27500;;25414:806;;25271:959;;;;;25414:806;25827:28;;;596:27500;-1:-1:-1;;;25510:696:1;;25792:94;;;;;596:27500;;;;;25792:94;596:27500;;;25792:94;;;;;;596:27500;25792:94;;596:27500;;25792:94;;;;;:::i;:::-;;;;;;;;25414:806;-1:-1:-1;25788:400:1;;25514:44;25788:400;;:::i;:::-;;;;;;;;;25414:806;;;;25788:400;26126:39;596:27500;;;26126:39;;;-1:-1:-1;;;26126:39:1;;25792:94;26126:39;;596:27500;;;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;25788:400;25910:156;;:::i;:::-;;;;25788:400;;;25910:156;25995:47;25910:156;;25995:47;:::i;25788:400::-;;;25792:94;;;;;;:::i;:::-;;;;;596:27500;;;24846:1936;;;;;25048:9;25083:21;25144:14;;25187:26;;;;:::i;:::-;25244:17;;;;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;-1:-1:-1;;;;;596:27500:1;;;;;25275:23;596:27500;;;;;;;;-1:-1:-1;;;;;596:27500:1;;;;25271:959;;26261:9;1108:4;;596:27500;;;;26330:14;;;;596:27500;;;;26330:30;26326:121;;26634:122;596:27500;26546:6;26653:17;596:27500;;26634:122;596:27500;;1108:4;26546:6;;:::i;:::-;596:27500;;;:::i;:::-;26653:17;1108:4;596:27500;;26653:17;596:27500;;;;-1:-1:-1;;;;;596:27500:1;;;;26707:13;;596:27500;26330:14;596:27500;;;;;26578:41;;596:27500;;;;;;;;;;;;;;;;;;;;;;;;;;;;25271:959;25375:25;;596:27500;;25414:806;;25271:959;;;;;25414:806;596:27500;;;;;;:::i;:::-;25522:36;25514:44;;25522:36;;25617:28;;;596:27500;25582:94;;;;;;596:27500;8983:14;596:27500;;;;;25582:94;;;;;;;596:27500;25582:94;;;;;;:::i;:::-;;;;;;;;25510:696;25582:94;;25510:696;;;25414:806;;;;25582:94;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;25510:696;25827:28;;;596:27500;25792:94;;;;;;596:27500;8983:14;596:27500;;;;;25792:94;;;;;;;596:27500;25792:94;;;;;;:::i;:::-;;;;;;;;25510:696;-1:-1:-1;25788:400:1;;;;;:::i;:::-;;;;;;;25510:696;25788:400;596:27500;;-1:-1:-1;;;26126:39:1;;;;25792:94;26126:39;;596:27500;;8983:14;596:27500;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;25788:400;25910:156;;:::i;:::-;;;;25788:400;;;;25510:696;;25792:94;;;;;;:::i;:::-;;;;26950:481;27148:28;27087:20;;;596:27500;27148:28;;596:27500;27190:36;;;27186:161;;27404:13;596:27500;27521:5;;;;;;:13;26950:481;:::o;27521:13::-;;;26950:481;:::o;27186:161::-;27317:19;;:::o;596:27500::-;;;;;;;:::i;:::-;-1:-1:-1;596:27500:1;;;;;;;;;;;;:::o;904:439:2:-;596:27500:1;;:::i;:::-;;;;;1115:3:2;596:27500:1;;1133:15:2;;1129:75;;904:439;596:27500:1;;;;;;:::i;:::-;-1:-1:-1;;;;;596:27500:1;;;;1259:8:2;596:27500:1;1286:50:2;;;596:27500:1;;;1286:50:2;;596:27500:1;904:439:2;:::o;1129:75::-;1164:29;;1129:75;;1392:927;1571:36;1658:45;1392:927;596:27500:1;;:::i;:::-;;1571:36:2;:::i;:::-;1658:45;;:::i;:::-;596:27500:1;-1:-1:-1;;;;;596:27500:1;;;;;1780:24:2;;;1776:95;;1392:927;596:27500:1;1900:32:2;;;;1962;1900;;;;596:27500:1;;1962:32:2;;596:27500:1;;2026:27:2;;1962:32;2026:27;1900:32;2026:27;;596:27500:1;;2085:27:2;;596:27500:1;;2127:25:2;;;;2123:56;;1392:927;2193:25;;;;2189:56;;1392:927;596:27500:1;1962:32:2;596:27500:1;;;;;:::i;:::-;;;;;1900:32:2;2262:50;;596:27500:1;;1962:32:2;2262:50;;596:27500:1;1392:927:2;:::o;2189:56::-;2220:25;-1:-1:-1;2189:56:2;;;2123;2154:25;-1:-1:-1;2123:56:2;;;1776:95;596:27500:1;;;;;-1:-1:-1;1776:95:2;;1008:234:3;-1:-1:-1;;;;;596:27500:1;-1:-1:-1;596:27500:1;1194:19:3;596:27500:1;;;1194:32:3;596:27500:1;1138:2:3;596:27500:1;1138:2:3;-1:-1:-1;596:27500:1;;;;;;;;;;;;;1194:32:3;596:27500:1;;;1194:34:3;;;;:::i;:::-;1759:1:0;;596:27500:1;1194:41:3;1008:234;:::o;781:248:5:-;;-1:-1:-1;;;;;596:27500:1;;:::i;:::-;;;908:8:5;596:27500:1;908:8:5;596:27500:1;;;995:27:5;596:27500:1;908:8:5;596:27500:1;;;;;;;;;995:27:5;596:27500:1;;;972:20:5;;596:27500:1;781:248:5:o;1216:65::-;1263:10;;;:::i;1287:293::-;-1:-1:-1;;;;;596:27500:1;1393:8:5;596:27500:1;1393:8:5;596:27500:1;;;1393:8:5;596:27500:1;;;;;;1039:13;;;;;;;;1287:293:5;1479:30;;;596:27500:1;;1540:33:5;596:27500:1;;;;;;;;;;;;;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;1039:13;;;:::i;:::-;;;1649:206:5;-1:-1:-1;;;;;1649:206:5;1737:9;;;;:::i;:::-;596:27500:1;;1784:8:5;596:27500:1;1784:8:5;596:27500:1;;1816:32:5;596:27500:1;;;1784:8:5;596:27500:1;;;;;;;;1816:32:5;1649:206::o;596:27500:1:-;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;;;;;:::o;:::-;;;;-1:-1:-1;;;596:27500:1;;;;;;;;;;;1759:1:0;596:27500:1;1759:1:0;;;596:27500:1;;3357:265:2;3439:177;;;;;;;3357:265;:::o;230:263:13:-;;8983:14:1;230:263:13;;;;385:102;;;;;;;230:263;:::o;1066:436::-;1163:333;1108:4:1;1163:333:13;;;;;1066:436;1163:333;;;;;;;;;;;;;;;;;;;1066:436;:::o;1163:333::-;;;;;"},"methodIdentifiers":{"SIG_VALIDATION_FAILED()":"8f41ec5a","_validateSenderAndPaymaster(bytes,address,bytes)":"957122ab","addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","deposits(address)":"fc7e286d","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)":"1d732756","nonceSequenceNumber(address,uint192)":"1b2e01b8","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}"}},"contracts/core/NonceManager.sol":{"NonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint192","name":"","type":"uint192"}],"name":"nonceSequenceNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080806040523461001657610292908161001c8239f35b600080fdfe604060808152600436101561001357600080fd5b600090813560e01c80630bd28e3b1461011c5780631b2e01b8146100c2576335567e1a1461004057600080fd5b346100be5773ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082602094610088366101e5565b9416815280865281812077ffffffffffffffffffffffffffffffffffffffffffffffff8516825286522054918351931b16178152f35b5080fd5b50346100be578060209273ffffffffffffffffffffffffffffffffffffffff6100ea366101e5565b9116825281855277ffffffffffffffffffffffffffffffffffffffffffffffff83832091168252845220549051908152f35b50346100be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100be5760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168091036101e15733835282602052818320908352602052812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146101b457600101905580f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102575760043573ffffffffffffffffffffffffffffffffffffffff81168103610257579060243577ffffffffffffffffffffffffffffffffffffffffffffffff811681036102575790565b600080fdfea26469706673582212208531ec2c14a0c3ba45044a5812d77ff0bbd10126e92fe479db814384086dffea64736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x16 JUMPI PUSH2 0x292 SWAP1 DUP2 PUSH2 0x1C DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x40 PUSH1 0x80 DUP2 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0xC2 JUMPI PUSH4 0x35567E1A EQ PUSH2 0x40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xBE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP3 PUSH1 0x20 SWAP5 PUSH2 0x88 CALLDATASIZE PUSH2 0x1E5 JUMP JUMPDEST SWAP5 AND DUP2 MSTORE DUP1 DUP7 MSTORE DUP2 DUP2 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP3 MSTORE DUP7 MSTORE KECCAK256 SLOAD SWAP2 DUP4 MLOAD SWAP4 SHL AND OR DUP2 MSTORE RETURN JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xBE JUMPI DUP1 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xEA CALLDATASIZE PUSH2 0x1E5 JUMP JUMPDEST SWAP2 AND DUP3 MSTORE DUP2 DUP6 MSTORE PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD SWAP1 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xBE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBE JUMPI PUSH1 0x4 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1E1 JUMPI CALLER DUP4 MSTORE DUP3 PUSH1 0x20 MSTORE DUP2 DUP4 KECCAK256 SWAP1 DUP4 MSTORE PUSH1 0x20 MSTORE DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x1B4 JUMPI PUSH1 0x1 ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 DUP4 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x40 SWAP2 ADD SLT PUSH2 0x257 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x257 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x257 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 BALANCE 0xEC 0x2C EQ LOG0 0xC3 0xBA GASLIMIT DIV 0x4A PC SLT 0xD7 PUSH32 0xF0BBD10126E92FE479DB814384086DFFEA64736F6C6343000811003300000000 ","sourceMap":"145:1100:3:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_addresst_uint192":{"entryPoint":485,"id":null,"parameterSlots":1,"returnSlots":2}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"604060808152600436101561001357600080fd5b600090813560e01c80630bd28e3b1461011c5780631b2e01b8146100c2576335567e1a1461004057600080fd5b346100be5773ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082602094610088366101e5565b9416815280865281812077ffffffffffffffffffffffffffffffffffffffffffffffff8516825286522054918351931b16178152f35b5080fd5b50346100be578060209273ffffffffffffffffffffffffffffffffffffffff6100ea366101e5565b9116825281855277ffffffffffffffffffffffffffffffffffffffffffffffff83832091168252845220549051908152f35b50346100be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100be5760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168091036101e15733835282602052818320908352602052812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146101b457600101905580f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102575760043573ffffffffffffffffffffffffffffffffffffffff81168103610257579060243577ffffffffffffffffffffffffffffffffffffffffffffffff811681036102575790565b600080fdfea26469706673582212208531ec2c14a0c3ba45044a5812d77ff0bbd10126e92fe479db814384086dffea64736f6c63430008110033","opcodes":"PUSH1 0x40 PUSH1 0x80 DUP2 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0xC2 JUMPI PUSH4 0x35567E1A EQ PUSH2 0x40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xBE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP3 PUSH1 0x20 SWAP5 PUSH2 0x88 CALLDATASIZE PUSH2 0x1E5 JUMP JUMPDEST SWAP5 AND DUP2 MSTORE DUP1 DUP7 MSTORE DUP2 DUP2 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP3 MSTORE DUP7 MSTORE KECCAK256 SLOAD SWAP2 DUP4 MLOAD SWAP4 SHL AND OR DUP2 MSTORE RETURN JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xBE JUMPI DUP1 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xEA CALLDATASIZE PUSH2 0x1E5 JUMP JUMPDEST SWAP2 AND DUP3 MSTORE DUP2 DUP6 MSTORE PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD SWAP1 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xBE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBE JUMPI PUSH1 0x4 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1E1 JUMPI CALLER DUP4 MSTORE DUP3 PUSH1 0x20 MSTORE DUP2 DUP4 KECCAK256 SWAP1 DUP4 MSTORE PUSH1 0x20 MSTORE DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x1B4 JUMPI PUSH1 0x1 ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 DUP4 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x40 SWAP2 ADD SLT PUSH2 0x257 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x257 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x257 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 BALANCE 0xEC 0x2C EQ LOG0 0xC3 0xBA GASLIMIT DIV 0x4A PC SLT 0xD7 PUSH32 0xF0BBD10126E92FE479DB814384086DFFEA64736F6C6343000811003300000000 ","sourceMap":"145:1100:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;462:55;145:1100;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;868:10;145:1100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;145:1100:3;"},"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b","nonceSequenceNumber(address,uint192)":"1b2e01b8"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"}},\"notice\":\"nonce management functionality\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/NonceManager.sol\":\"NonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/core/SenderCreator.sol":{"SenderCreator":{"abi":[{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"createSender","outputs":[{"internalType":"address","name":"sender","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea264697066735822122036a5a8d538d88359007715214f81c5bd42079bac3c4d3005ea4a12098b5b92e964736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x16 JUMPI PUSH2 0x210 SWAP1 DUP2 PUSH2 0x1C DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x570E1A36 EQ PUSH2 0x28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP3 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC9 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 DUP4 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP5 ADD ADD GT PUSH2 0xC9 JUMPI PUSH2 0xC5 PUSH2 0x9E DUP5 PUSH1 0x24 DUP6 ADD PUSH2 0xFC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST DUP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x14 GT PUSH2 0x1BB JUMPI PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC DUP3 ADD DUP4 DUP2 GT PUSH2 0x1CD JUMPI JUMPDEST PUSH1 0x40 MLOAD SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0xB DUP8 ADD AND ADD AND DUP6 ADD SWAP1 DUP6 DUP3 LT SWAP1 DUP3 GT OR PUSH2 0x1C0 JUMPI JUMPDEST PUSH1 0x40 MSTORE DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 CALLDATASIZE DUP5 DUP5 ADD GT PUSH2 0x1BB JUMPI PUSH1 0x20 SWAP5 PUSH1 0x0 PUSH1 0xC DUP2 SWAP7 DUP3 SWAP5 PUSH1 0x14 DUP9 ADD DUP8 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP3 CALLDATALOAD PUSH1 0x60 SHR GAS CALL SWAP1 PUSH1 0x0 MLOAD SWAP2 ISZERO PUSH2 0x1B5 JUMPI JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C8 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x1D5 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x13A JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATASIZE 0xA5 0xA8 0xD5 CODESIZE 0xD8 DUP4 MSIZE STOP PUSH24 0x15214F81C5BD42079BAC3C4D3005EA4A12098B5B92E96473 PUSH16 0x6C634300081100330000000000000000 ","sourceMap":"205:842:4:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"fun_createSender":{"entryPoint":252,"id":2651,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":204,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea264697066735822122036a5a8d538d88359007715214f81c5bd42079bac3c4d3005ea4a12098b5b92e964736f6c63430008110033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x570E1A36 EQ PUSH2 0x28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP3 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC9 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 DUP4 GT PUSH2 0xC9 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP5 ADD ADD GT PUSH2 0xC9 JUMPI PUSH2 0xC5 PUSH2 0x9E DUP5 PUSH1 0x24 DUP6 ADD PUSH2 0xFC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST DUP1 REVERT JUMPDEST POP PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x14 GT PUSH2 0x1BB JUMPI PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC DUP3 ADD DUP4 DUP2 GT PUSH2 0x1CD JUMPI JUMPDEST PUSH1 0x40 MLOAD SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0xB DUP8 ADD AND ADD AND DUP6 ADD SWAP1 DUP6 DUP3 LT SWAP1 DUP3 GT OR PUSH2 0x1C0 JUMPI JUMPDEST PUSH1 0x40 MSTORE DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 CALLDATASIZE DUP5 DUP5 ADD GT PUSH2 0x1BB JUMPI PUSH1 0x20 SWAP5 PUSH1 0x0 PUSH1 0xC DUP2 SWAP7 DUP3 SWAP5 PUSH1 0x14 DUP9 ADD DUP8 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP3 CALLDATALOAD PUSH1 0x60 SHR GAS CALL SWAP1 PUSH1 0x0 MLOAD SWAP2 ISZERO PUSH2 0x1B5 JUMPI JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C8 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x1D5 PUSH2 0xCC JUMP JUMPDEST PUSH2 0x13A JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATASIZE 0xA5 0xA8 0xD5 CODESIZE 0xD8 DUP4 MSIZE STOP PUSH24 0x15214F81C5BD42079BAC3C4D3005EA4A12098B5B92E96473 PUSH16 0x6C634300081100330000000000000000 ","sourceMap":"205:842:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;545:500;;205:842;683:2;205:842;;;;;;;;;;;;;545:500;205:842;;;;;;;;;;;;;;;;;;;;;;;;545:500;205:842;;;;;;;;;;;;;;;;;;-1:-1:-1;205:842:4;;;;;683:2;205:842;;;;;;;;821:151;205:842;;;;821:151;;;-1:-1:-1;821:151:4;985:8;;981:58;;545:500::o;981:58::-;-1:-1:-1;;;545:500:4:o;205:842::-;-1:-1:-1;205:842:4;;;;;:::i;:::-;;;;;;:::i;:::-;;"},"methodIdentifiers":{"createSender(bytes)":"570e1a36"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"createSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createSender(bytes)\":{\"params\":{\"initCode\":\"the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\"},\"returns\":{\"sender\":\"the returned address of the created account, or zero address on failure.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createSender(bytes)\":{\"notice\":\"call the \\\"initCode\\\" factory to create and return the sender account address\"}},\"notice\":\"helper contract for EntryPoint, to call userOp.initCode from a \\\"neutral\\\" address, which is explicitly not the entryPoint itself.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/SenderCreator.sol\":\"SenderCreator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]}},\"version\":1}"}},"contracts/core/StakeManager.sol":{"StakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","deposits(address)":"fc7e286d","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by a paymaster.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/StakeManager.sol\":\"StakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]}},\"version\":1}"}},"contracts/interfaces/IAccount.sol":{"IAccount":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"details\":\"Must validate caller is the entryPoint. Must validate the signature and nonce\",\"params\":{\"missingAccountFunds\":\"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\",\"userOp\":\"the operation that is about to be executed.\",\"userOpHash\":\"hash of the user's request data. can be used as the basis for signature.\"},\"returns\":{\"validationData\":\"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \\\"simulation call\\\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAccount.sol\":\"IAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IAggregator.sol":{"IAggregator":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"sigForUserOp","type":"bytes"}],"stateMutability":"view","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"sigForUserOp\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"params\":{\"userOps\":\"array of UserOperations to collect the signatures from.\"},\"returns\":{\"aggregatedSignature\":\"the aggregated signature\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"sigForUserOp\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\"}},\"notice\":\"Aggregated Signatures validator.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAggregator.sol\":\"IAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IEntryPoint.sol":{"IEntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"params\":{\"factory\":\"the factory used to deploy this account (in the initCode)\",\"paymaster\":\"the paymaster used by this UserOp\",\"sender\":\"the account that is deployed\",\"userOpHash\":\"the userOp that deployed this account. UserOperationEvent will follow.\"}},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"params\":{\"nonce\":\"the nonce used in the request\",\"revertReason\":\"- the return bytes from the (reverted) call to \\\"callData\\\".\",\"sender\":\"the sender of this request\",\"userOpHash\":\"the request unique identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IEntryPoint.sol\":\"IEntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/INonceManager.sol":{"INonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/INonceManager.sol\":\"INonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]}},\"version\":1}"}},"contracts/interfaces/IPaymaster.sol":{"IPaymaster":{"abi":[{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"postOp(uint8,bytes,uint256)":"a9a23409","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"}},\"notice\":\"the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations. a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IPaymaster.sol\":\"IPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/interfaces/IStakeManager.sol":{"IStakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IStakeManager.sol\":\"IStakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]}},\"version\":1}"}},"contracts/interfaces/UserOperation.sol":{"UserOperationLib":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a303eed2aef4939a15ae1203e3b953b3cc35aa1ee3bc23127bc911aa1931565364736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 SUB 0xEE 0xD2 0xAE DELEGATECALL SWAP4 SWAP11 ISZERO 0xAE SLT SUB 0xE3 0xB9 MSTORE8 0xB3 0xCC CALLDATALOAD 0xAA 0x1E 0xE3 0xBC 0x23 SLT PUSH28 0xC911AA1931565364736F6C6343000811003300000000000000000000 ","sourceMap":"1642:2115:12:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220a303eed2aef4939a15ae1203e3b953b3cc35aa1ee3bc23127bc911aa1931565364736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 SUB 0xEE 0xD2 0xAE DELEGATECALL SWAP4 SWAP11 ISZERO 0xAE SLT SUB 0xE3 0xB9 MSTORE8 0xB3 0xCC CALLDATALOAD 0xAA 0x1E 0xE3 0xBC 0x23 SLT PUSH28 0xC911AA1931565364736F6C6343000811003300000000000000000000 ","sourceMap":"1642:2115:12:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when working with UserOperation structs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/UserOperation.sol\":\"UserOperationLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://27ca49685fb8ba83094396696c2ab654d205a3dc8e47e67c5e36b5a6b195119c\",\"dweb:/ipfs/QmSNWkADUZXa9PQQESnQ4qgx7cwiFSboEYW6yRWhxg9NPf\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d51f838e74a11b96abab049853e0bf8dc1382d9d3b0deb9829b100c9c66555e2\",\"dweb:/ipfs/QmYD1SvzyzUUjKDPE9H22xQV1V6BeHj17L3MCYeWGeggVS\"]}},\"version\":1}"}},"contracts/utils/Exec.sol":{"Exec":{"abi":[],"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220d506302e6cfa5199140f2c581f11b4132a3bfe075e9fedbe88fdd1bcdb00ed3664736f6c63430008110033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 MOD ADDRESS 0x2E PUSH13 0xFA5199140F2C581F11B4132A3B INVALID SMOD 0x5E SWAP16 0xED 0xBE DUP9 REVERT 0xD1 0xBC 0xDB STOP 0xED CALLDATASIZE PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"210:1759:13:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220d506302e6cfa5199140f2c581f11b4132a3bfe075e9fedbe88fdd1bcdb00ed3664736f6c63430008110033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 MOD ADDRESS 0x2E PUSH13 0xFA5199140F2C581F11B4132A3B INVALID SMOD 0x5E SWAP16 0xED 0xBE DUP9 REVERT 0xD1 0xBC 0xDB STOP 0xED CALLDATASIZE PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ","sourceMap":"210:1759:13:-:0;;"},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when making different kinds of contract calls in Solidity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/Exec.sol\":\"Exec\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}"}}}}} \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/dc1c9c8b476960fded4294d8921901a6.json b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/dc1c9c8b476960fded4294d8921901a6.json new file mode 100644 index 0000000000..f1a3135708 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/dc1c9c8b476960fded4294d8921901a6.json @@ -0,0 +1 @@ +{"id":"dc1c9c8b476960fded4294d8921901a6","_format":"hh-sol-build-info-1","solcVersion":"0.8.15","solcLongVersion":"0.8.15+commit.e14f2714","input":{"language":"Solidity","sources":{"@gnosis.pm/safe-contracts/contracts/base/Executor.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/Enum.sol\";\n\n/// @title Executor - A contract that can execute transactions\n/// @author Richard Meissner - \ncontract Executor {\n function execute(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation,\n uint256 txGas\n ) internal returns (bool success) {\n if (operation == Enum.Operation.DelegateCall) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n } else {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../common/SelfAuthorized.sol\";\n\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\n/// @author Richard Meissner - \ncontract FallbackManager is SelfAuthorized {\n event ChangedFallbackHandler(address handler);\n\n // keccak256(\"fallback_manager.handler.address\")\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\n\n function internalSetFallbackHandler(address handler) internal {\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, handler)\n }\n }\n\n /// @dev Allows to add a contract to handle fallback calls.\n /// Only fallback calls without value and with data will be forwarded.\n /// This can only be done via a Safe transaction.\n /// @param handler contract to handle fallbacks calls.\n function setFallbackHandler(address handler) public authorized {\n internalSetFallbackHandler(handler);\n emit ChangedFallbackHandler(handler);\n }\n\n // solhint-disable-next-line payable-fallback,no-complex-fallback\n fallback() external {\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let handler := sload(slot)\n if iszero(handler) {\n return(0, 0)\n }\n calldatacopy(0, 0, calldatasize())\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\n // Then the address without padding is stored right after the calldata\n mstore(calldatasize(), shl(96, caller()))\n // Add 20 bytes for the address appended add the end\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\n returndatacopy(0, 0, returndatasize())\n if iszero(success) {\n revert(0, returndatasize())\n }\n return(0, returndatasize())\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../common/Enum.sol\";\nimport \"../common/SelfAuthorized.sol\";\n\ninterface Guard {\n function checkTransaction(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver,\n bytes memory signatures,\n address msgSender\n ) external;\n\n function checkAfterExecution(bytes32 txHash, bool success) external;\n}\n\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\n/// @author Richard Meissner - \ncontract GuardManager is SelfAuthorized {\n event ChangedGuard(address guard);\n // keccak256(\"guard_manager.guard.address\")\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\n\n /// @dev Set a guard that checks transactions before execution\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\n function setGuard(address guard) external authorized {\n bytes32 slot = GUARD_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, guard)\n }\n emit ChangedGuard(guard);\n }\n\n function getGuard() internal view returns (address guard) {\n bytes32 slot = GUARD_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n guard := sload(slot)\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/Enum.sol\";\nimport \"../common/SelfAuthorized.sol\";\nimport \"./Executor.sol\";\n\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract ModuleManager is SelfAuthorized, Executor {\n event EnabledModule(address module);\n event DisabledModule(address module);\n event ExecutionFromModuleSuccess(address indexed module);\n event ExecutionFromModuleFailure(address indexed module);\n\n address internal constant SENTINEL_MODULES = address(0x1);\n\n mapping(address => address) internal modules;\n\n function setupModules(address to, bytes memory data) internal {\n require(modules[SENTINEL_MODULES] == address(0), \"GS100\");\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\n if (to != address(0))\n // Setup has to complete successfully or transaction fails.\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \"GS000\");\n }\n\n /// @dev Allows to add a module to the whitelist.\n /// This can only be done via a Safe transaction.\n /// @notice Enables the module `module` for the Safe.\n /// @param module Module to be whitelisted.\n function enableModule(address module) public authorized {\n // Module address cannot be null or sentinel.\n require(module != address(0) && module != SENTINEL_MODULES, \"GS101\");\n // Module cannot be added twice.\n require(modules[module] == address(0), \"GS102\");\n modules[module] = modules[SENTINEL_MODULES];\n modules[SENTINEL_MODULES] = module;\n emit EnabledModule(module);\n }\n\n /// @dev Allows to remove a module from the whitelist.\n /// This can only be done via a Safe transaction.\n /// @notice Disables the module `module` for the Safe.\n /// @param prevModule Module that pointed to the module to be removed in the linked list\n /// @param module Module to be removed.\n function disableModule(address prevModule, address module) public authorized {\n // Validate module address and check that it corresponds to module index.\n require(module != address(0) && module != SENTINEL_MODULES, \"GS101\");\n require(modules[prevModule] == module, \"GS103\");\n modules[prevModule] = modules[module];\n modules[module] = address(0);\n emit DisabledModule(module);\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) public virtual returns (bool success) {\n // Only whitelisted modules are allowed.\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \"GS104\");\n // Execute transaction without further confirmations.\n success = execute(to, value, data, operation, gasleft());\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\n else emit ExecutionFromModuleFailure(msg.sender);\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModuleReturnData(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) public returns (bool success, bytes memory returnData) {\n success = execTransactionFromModule(to, value, data, operation);\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // Load free memory location\n let ptr := mload(0x40)\n // We allocate memory for the return data by setting the free memory location to\n // current free memory location + data size + 32 bytes for data size value\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\n // Store the size\n mstore(ptr, returndatasize())\n // Store the data\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\n // Point the return data to the correct memory location\n returnData := ptr\n }\n }\n\n /// @dev Returns if an module is enabled\n /// @return True if the module is enabled\n function isModuleEnabled(address module) public view returns (bool) {\n return SENTINEL_MODULES != module && modules[module] != address(0);\n }\n\n /// @dev Returns array of modules.\n /// @param start Start of the page.\n /// @param pageSize Maximum number of modules that should be returned.\n /// @return array Array of modules.\n /// @return next Start of the next page.\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 moduleCount = 0;\n address currentModule = modules[start];\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\n array[moduleCount] = currentModule;\n currentModule = modules[currentModule];\n moduleCount++;\n }\n next = currentModule;\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n assembly {\n mstore(array, moduleCount)\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/SelfAuthorized.sol\";\n\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract OwnerManager is SelfAuthorized {\n event AddedOwner(address owner);\n event RemovedOwner(address owner);\n event ChangedThreshold(uint256 threshold);\n\n address internal constant SENTINEL_OWNERS = address(0x1);\n\n mapping(address => address) internal owners;\n uint256 internal ownerCount;\n uint256 internal threshold;\n\n /// @dev Setup function sets initial storage of contract.\n /// @param _owners List of Safe owners.\n /// @param _threshold Number of required confirmations for a Safe transaction.\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\n // Threshold can only be 0 at initialization.\n // Check ensures that setup function can only be called once.\n require(threshold == 0, \"GS200\");\n // Validate that threshold is smaller than number of added owners.\n require(_threshold <= _owners.length, \"GS201\");\n // There has to be at least one Safe owner.\n require(_threshold >= 1, \"GS202\");\n // Initializing Safe owners.\n address currentOwner = SENTINEL_OWNERS;\n for (uint256 i = 0; i < _owners.length; i++) {\n // Owner address cannot be null.\n address owner = _owners[i];\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \"GS203\");\n // No duplicate owners allowed.\n require(owners[owner] == address(0), \"GS204\");\n owners[currentOwner] = owner;\n currentOwner = owner;\n }\n owners[currentOwner] = SENTINEL_OWNERS;\n ownerCount = _owners.length;\n threshold = _threshold;\n }\n\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\n /// This can only be done via a Safe transaction.\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\n /// @param owner New owner address.\n /// @param _threshold New threshold.\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\n // Owner address cannot be null, the sentinel or the Safe itself.\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \"GS203\");\n // No duplicate owners allowed.\n require(owners[owner] == address(0), \"GS204\");\n owners[owner] = owners[SENTINEL_OWNERS];\n owners[SENTINEL_OWNERS] = owner;\n ownerCount++;\n emit AddedOwner(owner);\n // Change threshold if threshold was changed.\n if (threshold != _threshold) changeThreshold(_threshold);\n }\n\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\n /// This can only be done via a Safe transaction.\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\n /// @param owner Owner address to be removed.\n /// @param _threshold New threshold.\n function removeOwner(\n address prevOwner,\n address owner,\n uint256 _threshold\n ) public authorized {\n // Only allow to remove an owner, if threshold can still be reached.\n require(ownerCount - 1 >= _threshold, \"GS201\");\n // Validate owner address and check that it corresponds to owner index.\n require(owner != address(0) && owner != SENTINEL_OWNERS, \"GS203\");\n require(owners[prevOwner] == owner, \"GS205\");\n owners[prevOwner] = owners[owner];\n owners[owner] = address(0);\n ownerCount--;\n emit RemovedOwner(owner);\n // Change threshold if threshold was changed.\n if (threshold != _threshold) changeThreshold(_threshold);\n }\n\n /// @dev Allows to swap/replace an owner from the Safe with another address.\n /// This can only be done via a Safe transaction.\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\n /// @param oldOwner Owner address to be replaced.\n /// @param newOwner New owner address.\n function swapOwner(\n address prevOwner,\n address oldOwner,\n address newOwner\n ) public authorized {\n // Owner address cannot be null, the sentinel or the Safe itself.\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \"GS203\");\n // No duplicate owners allowed.\n require(owners[newOwner] == address(0), \"GS204\");\n // Validate oldOwner address and check that it corresponds to owner index.\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \"GS203\");\n require(owners[prevOwner] == oldOwner, \"GS205\");\n owners[newOwner] = owners[oldOwner];\n owners[prevOwner] = newOwner;\n owners[oldOwner] = address(0);\n emit RemovedOwner(oldOwner);\n emit AddedOwner(newOwner);\n }\n\n /// @dev Allows to update the number of required confirmations by Safe owners.\n /// This can only be done via a Safe transaction.\n /// @notice Changes the threshold of the Safe to `_threshold`.\n /// @param _threshold New threshold.\n function changeThreshold(uint256 _threshold) public authorized {\n // Validate that threshold is smaller than number of owners.\n require(_threshold <= ownerCount, \"GS201\");\n // There has to be at least one Safe owner.\n require(_threshold >= 1, \"GS202\");\n threshold = _threshold;\n emit ChangedThreshold(threshold);\n }\n\n function getThreshold() public view returns (uint256) {\n return threshold;\n }\n\n function isOwner(address owner) public view returns (bool) {\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\n }\n\n /// @dev Returns array of owners.\n /// @return Array of Safe owners.\n function getOwners() public view returns (address[] memory) {\n address[] memory array = new address[](ownerCount);\n\n // populate return array\n uint256 index = 0;\n address currentOwner = owners[SENTINEL_OWNERS];\n while (currentOwner != SENTINEL_OWNERS) {\n array[index] = currentOwner;\n currentOwner = owners[currentOwner];\n index++;\n }\n return array;\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/Enum.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title Enum - Collection of enums\n/// @author Richard Meissner - \ncontract Enum {\n enum Operation {Call, DelegateCall}\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\n/// @author Richard Meissner - \ncontract EtherPaymentFallback {\n event SafeReceived(address indexed sender, uint256 value);\n\n /// @dev Fallback function accepts Ether transactions.\n receive() external payable {\n emit SafeReceived(msg.sender, msg.value);\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SecuredTokenTransfer - Secure token transfer\n/// @author Richard Meissner - \ncontract SecuredTokenTransfer {\n /// @dev Transfers a token and returns if it was a success\n /// @param token Token that should be transferred\n /// @param receiver Receiver to whom the token should be transferred\n /// @param amount The amount of tokens that should be transferred\n function transferToken(\n address token,\n address receiver,\n uint256 amount\n ) internal returns (bool transferred) {\n // 0xa9059cbb - keccack(\"transfer(address,uint256)\")\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // We write the return value to scratch space.\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n switch returndatasize()\n case 0 {\n transferred := success\n }\n case 0x20 {\n transferred := iszero(or(iszero(success), iszero(mload(0))))\n }\n default {\n transferred := 0\n }\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SelfAuthorized - authorizes current contract to perform actions\n/// @author Richard Meissner - \ncontract SelfAuthorized {\n function requireSelfCall() private view {\n require(msg.sender == address(this), \"GS031\");\n }\n\n modifier authorized() {\n // This is a function call as it minimized the bytecode size\n requireSelfCall();\n _;\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\n/// @author Richard Meissner - \ncontract SignatureDecoder {\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\n /// @param signatures concatenated rsv signatures\n function signatureSplit(bytes memory signatures, uint256 pos)\n internal\n pure\n returns (\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n {\n // The signature format is a compact form of:\n // {bytes32 r}{bytes32 s}{uint8 v}\n // Compact means, uint8 is not padded to 32 bytes.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let signaturePos := mul(0x41, pos)\n r := mload(add(signatures, add(signaturePos, 0x20)))\n s := mload(add(signatures, add(signaturePos, 0x40)))\n // Here we are loading the last 32 bytes, including 31 bytes\n // of 's'. There is no 'mload8' to do this.\n //\n // 'byte' is not working due to the Solidity parser, so lets\n // use the second best option, 'and'\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\n/// @author Richard Meissner - \ncontract Singleton {\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\n // It should also always be ensured that the address is stored alone (uses a full word)\n address private singleton;\n}\n"},"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\ncontract StorageAccessible {\n /**\n * @dev Reads `length` bytes of storage in the currents contract\n * @param offset - the offset in the current contract's storage in words to start reading from\n * @param length - the number of words (32 bytes) of data to read\n * @return the bytes that were read.\n */\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\n bytes memory result = new bytes(length * 32);\n for (uint256 index = 0; index < length; index++) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let word := sload(add(offset, index))\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\n }\n }\n return result;\n }\n\n /**\n * @dev Performs a delegetecall on a targetContract in the context of self.\n * Internally reverts execution to avoid side effects (making it static).\n *\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\n * Specifically, the `returndata` after a call to this method will be:\n * `success:bool || response.length:uint256 || response:bytes`.\n *\n * @param targetContract Address of the contract containing the code to execute.\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\n */\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\n\n mstore(0x00, success)\n mstore(0x20, returndatasize())\n returndatacopy(0x40, 0, returndatasize())\n revert(0, add(returndatasize(), 0x40))\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\n/// @author Richard Meissner - \ncontract GnosisSafeStorage {\n // From /common/Singleton.sol\n address internal singleton;\n // From /common/ModuleManager.sol\n mapping(address => address) internal modules;\n // From /common/OwnerManager.sol\n mapping(address => address) internal owners;\n uint256 internal ownerCount;\n uint256 internal threshold;\n\n // From /GnosisSafe.sol\n bytes32 internal nonce;\n bytes32 internal domainSeparator;\n mapping(bytes32 => uint256) internal signedMessages;\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\n}\n"},"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n * @title GnosisSafeMath\n * @dev Math operations with safety checks that revert on error\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\n * TODO: remove once open zeppelin update to solc 0.5.0\n */\nlibrary GnosisSafeMath {\n /**\n * @dev Multiplies two numbers, reverts on overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b);\n\n return c;\n }\n\n /**\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Adds two numbers, reverts on overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a);\n\n return c;\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"./base/ModuleManager.sol\";\nimport \"./base/OwnerManager.sol\";\nimport \"./base/FallbackManager.sol\";\nimport \"./base/GuardManager.sol\";\nimport \"./common/EtherPaymentFallback.sol\";\nimport \"./common/Singleton.sol\";\nimport \"./common/SignatureDecoder.sol\";\nimport \"./common/SecuredTokenTransfer.sol\";\nimport \"./common/StorageAccessible.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./external/GnosisSafeMath.sol\";\n\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract GnosisSafe is\n EtherPaymentFallback,\n Singleton,\n ModuleManager,\n OwnerManager,\n SignatureDecoder,\n SecuredTokenTransfer,\n ISignatureValidatorConstants,\n FallbackManager,\n StorageAccessible,\n GuardManager\n{\n using GnosisSafeMath for uint256;\n\n string public constant VERSION = \"1.3.0\";\n\n // keccak256(\n // \"EIP712Domain(uint256 chainId,address verifyingContract)\"\n // );\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\n\n // keccak256(\n // \"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\"\n // );\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\n\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\n event SignMsg(bytes32 indexed msgHash);\n event ExecutionFailure(bytes32 txHash, uint256 payment);\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\n\n uint256 public nonce;\n bytes32 private _deprecatedDomainSeparator;\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\n mapping(bytes32 => uint256) public signedMessages;\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\n\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\n constructor() {\n // By setting the threshold it is not possible to call setup anymore,\n // so we create a Safe with 0 owners and threshold 1.\n // This is an unusable Safe, perfect for the singleton\n threshold = 1;\n }\n\n /// @dev Setup function sets initial storage of contract.\n /// @param _owners List of Safe owners.\n /// @param _threshold Number of required confirmations for a Safe transaction.\n /// @param to Contract address for optional delegate call.\n /// @param data Data payload for optional delegate call.\n /// @param fallbackHandler Handler for fallback calls to this contract\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\n /// @param payment Value that should be paid\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\n function setup(\n address[] calldata _owners,\n uint256 _threshold,\n address to,\n bytes calldata data,\n address fallbackHandler,\n address paymentToken,\n uint256 payment,\n address payable paymentReceiver\n ) external {\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\n setupOwners(_owners, _threshold);\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\n setupModules(to, data);\n\n if (payment > 0) {\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\n }\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\n }\n\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\n /// Note: The fees are always transferred, even if the user transaction fails.\n /// @param to Destination address of Safe transaction.\n /// @param value Ether value of Safe transaction.\n /// @param data Data payload of Safe transaction.\n /// @param operation Operation type of Safe transaction.\n /// @param safeTxGas Gas that should be used for the Safe transaction.\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n /// @param gasPrice Gas price that should be used for the payment calculation.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\n function execTransaction(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver,\n bytes memory signatures\n ) public payable virtual returns (bool success) {\n bytes32 txHash;\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n {\n bytes memory txHashData =\n encodeTransactionData(\n // Transaction info\n to,\n value,\n data,\n operation,\n safeTxGas,\n // Payment info\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n // Signature info\n nonce\n );\n // Increase nonce and execute transaction.\n nonce++;\n txHash = keccak256(txHashData);\n checkSignatures(txHash, txHashData, signatures);\n }\n address guard = getGuard();\n {\n if (guard != address(0)) {\n Guard(guard).checkTransaction(\n // Transaction info\n to,\n value,\n data,\n operation,\n safeTxGas,\n // Payment info\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n // Signature info\n signatures,\n msg.sender\n );\n }\n }\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \"GS010\");\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n {\n uint256 gasUsed = gasleft();\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\n gasUsed = gasUsed.sub(gasleft());\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\n require(success || safeTxGas != 0 || gasPrice != 0, \"GS013\");\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\n uint256 payment = 0;\n if (gasPrice > 0) {\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\n }\n if (success) emit ExecutionSuccess(txHash, payment);\n else emit ExecutionFailure(txHash, payment);\n }\n {\n if (guard != address(0)) {\n Guard(guard).checkAfterExecution(txHash, success);\n }\n }\n }\n\n function handlePayment(\n uint256 gasUsed,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver\n ) private returns (uint256 payment) {\n // solhint-disable-next-line avoid-tx-origin\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\n if (gasToken == address(0)) {\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\n require(receiver.send(payment), \"GS011\");\n } else {\n payment = gasUsed.add(baseGas).mul(gasPrice);\n require(transferToken(gasToken, receiver, payment), \"GS012\");\n }\n }\n\n /**\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n * @param data That should be signed (this is passed to an external validator contract)\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n */\n function checkSignatures(\n bytes32 dataHash,\n bytes memory data,\n bytes memory signatures\n ) public view {\n // Load threshold to avoid multiple storage loads\n uint256 _threshold = threshold;\n // Check that a threshold is set\n require(_threshold > 0, \"GS001\");\n checkNSignatures(dataHash, data, signatures, _threshold);\n }\n\n /**\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n * @param data That should be signed (this is passed to an external validator contract)\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n * @param requiredSignatures Amount of required valid signatures.\n */\n function checkNSignatures(\n bytes32 dataHash,\n bytes memory data,\n bytes memory signatures,\n uint256 requiredSignatures\n ) public view {\n // Check that the provided signature data is not too short\n require(signatures.length >= requiredSignatures.mul(65), \"GS020\");\n // There cannot be an owner with address 0.\n address lastOwner = address(0);\n address currentOwner;\n uint8 v;\n bytes32 r;\n bytes32 s;\n uint256 i;\n for (i = 0; i < requiredSignatures; i++) {\n (v, r, s) = signatureSplit(signatures, i);\n if (v == 0) {\n // If v is 0 then it is a contract signature\n // When handling contract signatures the address of the contract is encoded into r\n currentOwner = address(uint160(uint256(r)));\n\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\n // Here we only check that the pointer is not pointing inside the part that is being processed\n require(uint256(s) >= requiredSignatures.mul(65), \"GS021\");\n\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\n require(uint256(s).add(32) <= signatures.length, \"GS022\");\n\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\n uint256 contractSignatureLen;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\n }\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \"GS023\");\n\n // Check signature\n bytes memory contractSignature;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\n contractSignature := add(add(signatures, s), 0x20)\n }\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \"GS024\");\n } else if (v == 1) {\n // If v is 1 then it is an approved hash\n // When handling approved hashes the address of the approver is encoded into r\n currentOwner = address(uint160(uint256(r)));\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \"GS025\");\n } else if (v > 30) {\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\n currentOwner = ecrecover(keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", dataHash)), v - 4, r, s);\n } else {\n // Default is the ecrecover flow with the provided data hash\n // Use ecrecover with the messageHash for EOA signatures\n currentOwner = ecrecover(dataHash, v, r, s);\n }\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \"GS026\");\n lastOwner = currentOwner;\n }\n }\n\n /// @dev Allows to estimate a Safe transaction.\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\n /// @param to Destination address of Safe transaction.\n /// @param value Ether value of Safe transaction.\n /// @param data Data payload of Safe transaction.\n /// @param operation Operation type of Safe transaction.\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\n function requiredTxGas(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation\n ) external returns (uint256) {\n uint256 startGas = gasleft();\n // We don't provide an error message here, as we use it to return the estimate\n require(execute(to, value, data, operation, gasleft()));\n uint256 requiredGas = startGas - gasleft();\n // Convert response to string and return via error message\n revert(string(abi.encodePacked(requiredGas)));\n }\n\n /**\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\n */\n function approveHash(bytes32 hashToApprove) external {\n require(owners[msg.sender] != address(0), \"GS030\");\n approvedHashes[msg.sender][hashToApprove] = 1;\n emit ApproveHash(hashToApprove, msg.sender);\n }\n\n /// @dev Returns the chain id used by this contract.\n function getChainId() public view returns (uint256) {\n uint256 id;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n id := chainid()\n }\n return id;\n }\n\n function domainSeparator() public view returns (bytes32) {\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\n }\n\n /// @dev Returns the bytes that are hashed to be signed by owners.\n /// @param to Destination address.\n /// @param value Ether value.\n /// @param data Data payload.\n /// @param operation Operation type.\n /// @param safeTxGas Gas that should be used for the safe transaction.\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n /// @param gasPrice Maximum gas price that should be used for this transaction.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param _nonce Transaction nonce.\n /// @return Transaction hash bytes.\n function encodeTransactionData(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address refundReceiver,\n uint256 _nonce\n ) public view returns (bytes memory) {\n bytes32 safeTxHash =\n keccak256(\n abi.encode(\n SAFE_TX_TYPEHASH,\n to,\n value,\n keccak256(data),\n operation,\n safeTxGas,\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n _nonce\n )\n );\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\n }\n\n /// @dev Returns hash to be signed by owners.\n /// @param to Destination address.\n /// @param value Ether value.\n /// @param data Data payload.\n /// @param operation Operation type.\n /// @param safeTxGas Fas that should be used for the safe transaction.\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\n /// @param gasPrice Maximum gas price that should be used for this transaction.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param _nonce Transaction nonce.\n /// @return Transaction hash.\n function getTransactionHash(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address refundReceiver,\n uint256 _nonce\n ) public view returns (bytes32) {\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../interfaces/ERC1155TokenReceiver.sol\";\nimport \"../interfaces/ERC721TokenReceiver.sol\";\nimport \"../interfaces/ERC777TokensRecipient.sol\";\nimport \"../interfaces/IERC165.sol\";\n\n/// @title Default Callback Handler - returns true for known token callbacks\n/// @author Richard Meissner - \ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\n string public constant NAME = \"Default Callback Handler\";\n string public constant VERSION = \"1.0.0\";\n\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0xf23a6e61;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata,\n uint256[] calldata,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0xbc197c81;\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0x150b7a02;\n }\n\n function tokensReceived(\n address,\n address,\n address,\n uint256,\n bytes calldata,\n bytes calldata\n ) external pure override {\n // We implement this for completeness, doesn't really have any value\n }\n\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\n return\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\n interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\n*/\ninterface ERC1155TokenReceiver {\n /**\n @notice Handle the receipt of a single ERC1155 token type.\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \n This function MUST return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\n This function MUST revert if it rejects the transfer.\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n @param _operator The address which initiated the transfer (i.e. msg.sender)\n @param _from The address which previously owned the token\n @param _id The ID of the token being transferred\n @param _value The amount of tokens being transferred\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n */\n function onERC1155Received(\n address _operator,\n address _from,\n uint256 _id,\n uint256 _value,\n bytes calldata _data\n ) external returns (bytes4);\n\n /**\n @notice Handle the receipt of multiple ERC1155 token types.\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \n This function MUST return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\n This function MUST revert if it rejects the transfer(s).\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\n @param _from The address which previously owned the token\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n */\n function onERC1155BatchReceived(\n address _operator,\n address _from,\n uint256[] calldata _ids,\n uint256[] calldata _values,\n bytes calldata _data\n ) external returns (bytes4);\n}\n"},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface ERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(\n address _operator,\n address _from,\n uint256 _tokenId,\n bytes calldata _data\n ) external returns (bytes4);\n}\n"},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\ninterface ERC777TokensRecipient {\n function tokensReceived(\n address operator,\n address from,\n address to,\n uint256 amount,\n bytes calldata data,\n bytes calldata operatorData\n ) external;\n}\n"},"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\ncontract ISignatureValidatorConstants {\n // bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\n}\n\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param _data Arbitrary length data signed on the behalf of address(this)\n * @param _signature Signature byte array associated with _data\n *\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\n * MUST allow external calls\n */\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\n}\n"},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\n/// @author Richard Meissner - \ninterface IProxy {\n function masterCopy() external view returns (address);\n}\n\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract GnosisSafeProxy {\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\n address internal singleton;\n\n /// @dev Constructor function sets address of singleton contract.\n /// @param _singleton Singleton address.\n constructor(address _singleton) {\n require(_singleton != address(0), \"Invalid singleton address provided\");\n singleton = _singleton;\n }\n\n /// @dev Fallback function forwards all transactions and returns all received return data.\n fallback() external payable {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\n // 0xa619486e == keccak(\"masterCopy()\"). The value is right padded to 32-bytes with 0s\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\n mstore(0, _singleton)\n return(0, 0x20)\n }\n calldatacopy(0, 0, calldatasize())\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\n returndatacopy(0, 0, returndatasize())\n if eq(success, 0) {\n revert(0, returndatasize())\n }\n return(0, returndatasize())\n }\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"./GnosisSafeProxy.sol\";\nimport \"./IProxyCreationCallback.sol\";\n\n/// @title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n/// @author Stefan George - \ncontract GnosisSafeProxyFactory {\n event ProxyCreation(GnosisSafeProxy proxy, address singleton);\n\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n /// @param singleton Address of singleton contract.\n /// @param data Payload for message call sent to new proxy contract.\n function createProxy(address singleton, bytes memory data) public returns (GnosisSafeProxy proxy) {\n proxy = new GnosisSafeProxy(singleton);\n if (data.length > 0)\n // solhint-disable-next-line no-inline-assembly\n assembly {\n if eq(call(gas(), proxy, 0, add(data, 0x20), mload(data), 0, 0), 0) {\n revert(0, 0)\n }\n }\n emit ProxyCreation(proxy, singleton);\n }\n\n /// @dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.\n function proxyRuntimeCode() public pure returns (bytes memory) {\n return type(GnosisSafeProxy).runtimeCode;\n }\n\n /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.\n function proxyCreationCode() public pure returns (bytes memory) {\n return type(GnosisSafeProxy).creationCode;\n }\n\n /// @dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.\n /// This method is only meant as an utility to be called from other methods\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function deployProxyWithNonce(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce\n ) internal returns (GnosisSafeProxy proxy) {\n // If the initializer changes the proxy address should change too. Hashing the initializer data is cheaper than just concatinating it\n bytes32 salt = keccak256(abi.encodePacked(keccak256(initializer), saltNonce));\n bytes memory deploymentData = abi.encodePacked(type(GnosisSafeProxy).creationCode, uint256(uint160(_singleton)));\n // solhint-disable-next-line no-inline-assembly\n assembly {\n proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)\n }\n require(address(proxy) != address(0), \"Create2 call failed\");\n }\n\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function createProxyWithNonce(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce\n ) public returns (GnosisSafeProxy proxy) {\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\n if (initializer.length > 0)\n // solhint-disable-next-line no-inline-assembly\n assembly {\n if eq(call(gas(), proxy, 0, add(initializer, 0x20), mload(initializer), 0, 0), 0) {\n revert(0, 0)\n }\n }\n emit ProxyCreation(proxy, _singleton);\n }\n\n /// @dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n /// @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.\n function createProxyWithCallback(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce,\n IProxyCreationCallback callback\n ) public returns (GnosisSafeProxy proxy) {\n uint256 saltNonceWithCallback = uint256(keccak256(abi.encodePacked(saltNonce, callback)));\n proxy = createProxyWithNonce(_singleton, initializer, saltNonceWithCallback);\n if (address(callback) != address(0)) callback.proxyCreated(proxy, _singleton, initializer, saltNonce);\n }\n\n /// @dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`\n /// This method is only meant for address calculation purpose when you use an initializer that would revert,\n /// therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function calculateCreateProxyWithNonceAddress(\n address _singleton,\n bytes calldata initializer,\n uint256 saltNonce\n ) external returns (GnosisSafeProxy proxy) {\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\n revert(string(abi.encodePacked(proxy)));\n }\n}\n"},"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"./GnosisSafeProxy.sol\";\n\ninterface IProxyCreationCallback {\n function proxyCreated(\n GnosisSafeProxy proxy,\n address _singleton,\n bytes calldata initializer,\n uint256 saltNonce\n ) external;\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts/interfaces/IERC1271.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n *\n * _Available since v4.1._\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n"},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n"},"@openzeppelin/contracts/proxy/Proxy.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n"},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/Address.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized < type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initialized`\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initializing`\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n"},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeTo(address newImplementation) external virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n}\n"},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\n *\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\n * contract implement this interface (contract holders can be their own\n * implementer) and registering it on the\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\n *\n * See {IERC1820Registry} and {ERC1820Implementer}.\n */\ninterface IERC777Recipient {\n /**\n * @dev Called by an {IERC777} token contract whenever tokens are being\n * moved or created into a registered account (`to`). The type of operation\n * is conveyed by `from` being the zero address or not.\n *\n * This call occurs _after_ the token contract's state is updated, so\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\n *\n * This function may revert to prevent the operation from being executed.\n */\n function tokensReceived(\n address operator,\n address from,\n address to,\n uint256 amount,\n bytes calldata userData,\n bytes calldata operatorData\n ) external;\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"},"@openzeppelin/contracts/utils/Create2.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n"},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n"},"@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n}\n"},"@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n"},"contracts/bundler/EntryPointWrapper.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IEntryPoint.sol\";\n\ncontract EntryPointWrapper {\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n struct FailedOpStatus {\n bool status;\n uint256 opIndex;\n string reason;\n }\n\n struct Response {\n string selectorType;\n ReturnInfo returnInfo;\n StakeInfo senderInfo;\n StakeInfo factoryInfo;\n StakeInfo paymasterInfo;\n AggregatorStakeInfo aggregatorInfo;\n }\n\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n IEntryPoint public entryPoint;\n\n StakeInfo private emptyStakeInfo = StakeInfo(0, 0);\n AggregatorStakeInfo private emptyAggregatorInfo = AggregatorStakeInfo(address(0), emptyStakeInfo);\n ReturnInfo private emptyReturnInfo = ReturnInfo(0, 0, false, 0, 0, new bytes(0));\n Response private emptyResponse = Response(\"\", emptyReturnInfo, emptyStakeInfo, emptyStakeInfo, emptyStakeInfo, emptyAggregatorInfo);\n FailedOpStatus private emptyFailedOp = FailedOpStatus(false, 0, \"\");\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n }\n\n function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n try entryPoint.simulateValidation(userOp) {}\n catch (bytes memory revertData) {\n bytes4 receivedSelector = bytes4(revertData);\n\n if (receivedSelector == ValidationResult.selector) {\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo));\n return (emptyFailedOp, Response('ValidationResult', returnInfo, senderInfo, factoryInfo, paymasterInfo, emptyAggregatorInfo));\n } else if (receivedSelector == ValidationResultWithAggregation.selector) {\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo, AggregatorStakeInfo memory aggregatorInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo, AggregatorStakeInfo));\n return (emptyFailedOp, Response('ValidationResultWithAggregation', returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo));\n } else if (receivedSelector == FailedOp.selector){\n (uint256 opIndex, string memory reason) = abi.decode(slice(revertData, 4, revertData.length - 4), (uint256, string));\n return (FailedOpStatus(true, opIndex, reason), emptyResponse);\n }\n }\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\n ret = new bytes32[](userOps.length);\n for (uint i = 0; i < userOps.length; i++) {\n ret[i] = entryPoint.getUserOpHash(userOps[i]);\n }\n return ret;\n }\n\n function getCodeHashes(address[] memory addresses) public view returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](addresses.length);\n for (uint i = 0; i < addresses.length; i++) {\n hashes[i] = addresses[i].codehash;\n }\n bytes memory data = abi.encode(hashes);\n return (keccak256(data));\n }\n}\n"},"contracts/core/BaseAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-empty-blocks */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"./Helpers.sol\";\n\n/**\n * Basic account implementation.\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\n * specific account implementation should inherit it and provide the account-specific logic\n */\nabstract contract BaseAccount is IAccount {\n using UserOperationLib for UserOperation;\n\n //return value in case of signature failure, with no time-range.\n // equivalent to _packValidationData(true,0,0);\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\n\n /**\n * Return the account nonce.\n * This method returns the next sequential nonce.\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\n */\n function getNonce() public view virtual returns (uint256) {\n return entryPoint().getNonce(address(this), 0);\n }\n\n /**\n * return the entryPoint used by this account.\n * subclass should return the current entryPoint used by this account.\n */\n function entryPoint() public view virtual returns (IEntryPoint);\n\n /**\n * Validate user's signature and nonce.\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external override virtual returns (uint256 validationData) {\n _requireFromEntryPoint();\n validationData = _validateSignature(userOp, userOpHash);\n _validateNonce(userOp.nonce);\n _payPrefund(missingAccountFunds);\n }\n\n /**\n * ensure the request comes from the known entrypoint.\n */\n function _requireFromEntryPoint() internal virtual view {\n require(msg.sender == address(entryPoint()), \"account: not from EntryPoint\");\n }\n\n /**\n * validate the signature is valid for this message.\n * @param userOp validate the userOp.signature field\n * @param userOpHash convenient field: the hash of the request, to check the signature against\n * (also hashes the entrypoint and chain id)\n * @return validationData signature and time-range of this operation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal virtual returns (uint256 validationData);\n\n /**\n * Validate the nonce of the UserOperation.\n * This method may validate the nonce requirement of this account.\n * e.g.\n * To limit the nonce to use sequenced UserOps only (no \"out of order\" UserOps):\n * `require(nonce < type(uint64).max)`\n * For a hypothetical account that *requires* the nonce to be out-of-order:\n * `require(nonce & type(uint64).max == 0)`\n *\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\n * action is needed by the account itself.\n *\n * @param nonce to validate\n *\n * solhint-disable-next-line no-empty-blocks\n */\n function _validateNonce(uint256 nonce) internal view virtual {\n }\n\n /**\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\n * subclass MAY override this method for better funds management\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\n * it will not be required to send again)\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\n */\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\n if (missingAccountFunds != 0) {\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\"\");\n (success);\n //ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n}\n"},"contracts/core/BasePaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"./Helpers.sol\";\n\n/**\n * Helper class for creating a paymaster.\n * provides helper methods for staking.\n * validates that the postOp is called only by the entryPoint\n */\nabstract contract BasePaymaster is IPaymaster, Ownable {\n\n IEntryPoint immutable public entryPoint;\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n }\n\n /// @inheritdoc IPaymaster\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external override returns (bytes memory context, uint256 validationData) {\n _requireFromEntryPoint();\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\n }\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual returns (bytes memory context, uint256 validationData);\n\n /// @inheritdoc IPaymaster\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\n _requireFromEntryPoint();\n _postOp(mode, context, actualGasCost);\n }\n\n /**\n * post-operation handler.\n * (verified to be called only through the entryPoint)\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\n\n (mode,context,actualGasCost); // unused params\n // subclass must override this method if validatePaymasterUserOp returns a context\n revert(\"must override\");\n }\n\n /**\n * add a deposit for this paymaster, used for paying for transaction fees\n */\n function deposit() public payable {\n entryPoint.depositTo{value : msg.value}(address(this));\n }\n\n /**\n * withdraw value from the deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\n entryPoint.withdrawTo(withdrawAddress, amount);\n }\n /**\n * add stake for this paymaster.\n * This method can also carry eth value to add to the current stake.\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\n */\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\n }\n\n /**\n * return current paymaster's deposit on the entryPoint.\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint.balanceOf(address(this));\n }\n\n /**\n * unlock the stake, in order to withdraw it.\n * The paymaster can't serve requests once unlocked, until it calls addStake again\n */\n function unlockStake() external onlyOwner {\n entryPoint.unlockStake();\n }\n\n /**\n * withdraw the entire paymaster's stake.\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\n entryPoint.withdrawStake(withdrawAddress);\n }\n\n /// validate the call is made from a valid entrypoint\n function _requireFromEntryPoint() internal virtual {\n require(msg.sender == address(entryPoint), \"Sender not EntryPoint\");\n }\n}\n"},"contracts/core/EntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"},"contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n"},"contracts/core/NonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"},"contracts/core/SenderCreator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"},"contracts/core/StakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"},"contracts/interfaces/IAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"},"contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"},"contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"},"contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"contracts/interfaces/IPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"},"contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"},"contracts/interfaces/UserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"},"contracts/samples/bls/BLSAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../SimpleAccount.sol\";\nimport \"./IBLSAccount.sol\";\n\n/**\n * Minimal BLS-based account that uses an aggregated signature.\n * The account must maintain its own BLS public key, and expose its trusted signature aggregator.\n * Note that unlike the \"standard\" SimpleAccount, this account can't be called directly\n * (normal SimpleAccount uses its \"signer\" address as both the ecrecover signer, and as a legitimate\n * Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)\n */\ncontract BLSAccount is SimpleAccount, IBLSAccount {\n address public immutable aggregator;\n uint256[4] private publicKey;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n /**\n * The initializer for the BLSAccount instance.\n * @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\n */\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\n super._initialize(address(0));\n _setBlsPublicKey(aPublicKey);\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n\n (userOp, userOpHash);\n if (userOp.initCode.length != 0) {\n // BLSSignatureAggregator.getUserOpPublicKey() assumes that during account creation, the public key is\n // the suffix of the initCode.\n // The account MUST validate it\n bytes32 pubKeyHash = keccak256(abi.encode(getBlsPublicKey()));\n require(keccak256(userOp.initCode[userOp.initCode.length - 128 :]) == pubKeyHash, \"wrong pubkey\");\n }\n return _packValidationData(ValidationData(aggregator, 0,0));\n }\n\n /**\n * Allows the owner to set or change the BLS key.\n * @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\n */\n function setBlsPublicKey(uint256[4] memory newPublicKey) public onlyOwner {\n _setBlsPublicKey(newPublicKey);\n }\n\n function _setBlsPublicKey(uint256[4] memory newPublicKey) internal {\n emit PublicKeyChanged(publicKey, newPublicKey);\n publicKey = newPublicKey;\n }\n\n /// @inheritdoc IBLSAccount\n function getBlsPublicKey() public override view returns (uint256[4] memory) {\n return publicKey;\n }\n}\n"},"contracts/samples/bls/BLSAccountFactory.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"../../interfaces/IEntryPoint.sol\";\nimport \"./BLSAccount.sol\";\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * Based on SimpleAccountFactory.\n * Cannot be a subclass since both constructor and createAccount depend on the\n * constructor and initializer of the actual account contract.\n */\ncontract BLSAccountFactory {\n BLSAccount public immutable accountImplementation;\n\n constructor(IEntryPoint entryPoint, address aggregator){\n accountImplementation = new BLSAccount(entryPoint, aggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n * Also note that our BLSSignatureAggregator requires that the public key is the last parameter\n */\n function createAccount(uint256 salt, uint256[4] calldata aPublicKey) public returns (BLSAccount) {\n\n // the BLSSignatureAggregator depends on the public-key being the last 4 uint256 of msg.data.\n uint slot;\n assembly {slot := aPublicKey}\n require(slot == msg.data.length - 128, \"wrong pubkey offset\");\n\n address addr = getAddress(salt, aPublicKey);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return BLSAccount(payable(addr));\n }\n return BLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(BLSAccount.initialize, aPublicKey)\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(uint256 salt, uint256[4] memory aPublicKey) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(BLSAccount.initialize, (aPublicKey))\n )\n )));\n }\n}\n"},"contracts/samples/bls/BLSHelper.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n// code taken from : https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\n// missing core functions from \"thehubbleproject/bls\": jacAdd (and sum)\nlibrary BLSHelper {\n\n struct XY {\n uint x;\n uint y;\n }\n /**\n * sum all the points in the array\n * NOTE: the \"ecAdd\" (below) has a special case where x1==y2.\n * @param points an array of bytes32[2], representing an (x,y) of a point\n * @param _pp the modulus of the curve\n * @return ret the sum of all points\n */\n function sum(XY[] memory points, uint256 _pp) internal pure returns (XY memory ret){\n uint x = points[0].x;\n uint y = points[0].y;\n uint z = 1;\n\n for (uint i = 1; i < points.length; i++) {\n (x, y, z) = jacAdd(x, y, z, points[i].x, points[i].y, 1, _pp);\n }\n (x, y) = toAffine(x, y, z, _pp);\n ret.x = x;\n ret.y = y;\n }\n\n /// @dev Adds two points (x1, y1, z1) and (x2, y2, z2).\n /// @param _x1 coordinate x of P1\n /// @param _y1 coordinate y of P1\n /// @param _z1 coordinate z of P1\n /// @param _x2 coordinate x of square\n /// @param _y2 coordinate y of square\n /// @param _z2 coordinate z of square\n /// @param _pp the modulus\n /// @return (qx, qy, qz) P1+square in Jacobian\n function jacAdd(\n uint256 _x1,\n uint256 _y1,\n uint256 _z1,\n uint256 _x2,\n uint256 _y2,\n uint256 _z2,\n uint256 _pp)\n internal pure returns (uint256, uint256, uint256)\n {\n if (_x1 == 0 && _y1 == 0)\n return (_x2, _y2, _z2);\n if (_x2 == 0 && _y2 == 0)\n return (_x1, _y1, _z1);\n\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\n uint[4] memory zs;\n // z1^2, z1^3, z2^2, z2^3\n zs[0] = mulmod(_z1, _z1, _pp);\n zs[1] = mulmod(_z1, zs[0], _pp);\n zs[2] = mulmod(_z2, _z2, _pp);\n zs[3] = mulmod(_z2, zs[2], _pp);\n\n // u1, s1, u2, s2\n zs = [\n mulmod(_x1, zs[2], _pp),\n mulmod(_y1, zs[3], _pp),\n mulmod(_x2, zs[0], _pp),\n mulmod(_y2, zs[1], _pp)\n ];\n\n // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used\n require(zs[0] != zs[2] || zs[1] != zs[3], \"Use jacDouble function instead\");\n\n uint[4] memory hr;\n //h\n hr[0] = addmod(zs[2], _pp - zs[0], _pp);\n //r\n hr[1] = addmod(zs[3], _pp - zs[1], _pp);\n //h^2\n hr[2] = mulmod(hr[0], hr[0], _pp);\n // h^3\n hr[3] = mulmod(hr[2], hr[0], _pp);\n // qx = -h^3 -2u1h^2+r^2\n uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\n qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\n // qy = -s1*z1*h^3+r(u1*h^2 -x^3)\n uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\n qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\n // qz = h*z1*z2\n uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\n return (qx, qy, qz);\n }\n\n\n /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\n /// @param _x coordinate x\n /// @param _y coordinate y\n /// @param _z coordinate z\n /// @param _pp the modulus\n /// @return (x', y') affine coordinates\n function toAffine(\n uint256 _x,\n uint256 _y,\n uint256 _z,\n uint256 _pp)\n internal pure returns (uint256, uint256)\n {\n uint256 zInv = invMod(_z, _pp);\n uint256 zInv2 = mulmod(zInv, zInv, _pp);\n uint256 x2 = mulmod(_x, zInv2, _pp);\n uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\n\n return (x2, y2);\n }\n\n\n /// @dev Modular euclidean inverse of a number (mod p).\n /// @param _x The number\n /// @param _pp The modulus\n /// @return q such that x*q = 1 (mod _pp)\n function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\n require(_x != 0 && _x != _pp && _pp != 0, \"Invalid number\");\n uint256 q = 0;\n uint256 newT = 1;\n uint256 r = _pp;\n uint256 t;\n while (_x != 0) {\n t = r / _x;\n (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\n (r, _x) = (_x, r - t * _x);\n }\n\n return q;\n }\n\n /// @dev Doubles a point (x, y, z).\n /// @param _x coordinate x of P1\n /// @param _y coordinate y of P1\n /// @param _z coordinate z of P1\n /// @param _aa the a scalar in the curve equation\n /// @param _pp the modulus\n /// @return (qx, qy, qz) 2P in Jacobian\n function jacDouble(\n uint256 _x,\n uint256 _y,\n uint256 _z,\n uint256 _aa,\n uint256 _pp)\n internal pure returns (uint256, uint256, uint256)\n {\n if (_z == 0)\n return (_x, _y, _z);\n\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\n // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4)\n // x, y, z at this point represent the squares of _x, _y, _z\n uint256 x = mulmod(_x, _x, _pp); //x1^2\n uint256 y = mulmod(_y, _y, _pp); //y1^2\n uint256 z = mulmod(_z, _z, _pp); //z1^2\n\n // s\n uint s = mulmod(4, mulmod(_x, y, _pp), _pp);\n // m\n uint m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\n\n // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper\n // This allows to reduce the gas cost and stack footprint of the algorithm\n // qx\n x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\n // qy = -8*y1^4 + M(S-T)\n y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\n // qz = 2*y1*z1\n z = mulmod(2, mulmod(_y, _z, _pp), _pp);\n\n return (x, y, z);\n }\n\n /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\n /// @param _x1 coordinate x of P1\n /// @param _y1 coordinate y of P1\n /// @param _x2 coordinate x of P2\n /// @param _y2 coordinate y of P2\n /// @param _aa constant of the curve\n /// @param _pp the modulus\n /// @return (qx, qy) = P1+P2 in affine coordinates\n function ecAdd(\n uint256 _x1,\n uint256 _y1,\n uint256 _x2,\n uint256 _y2,\n uint256 _aa,\n uint256 _pp)\n internal pure returns (uint256, uint256)\n {\n uint x = 0;\n uint y = 0;\n uint z = 0;\n\n // Double if x1==x2 else add\n if (_x1 == _x2) {\n // y1 = -y2 mod p\n if (addmod(_y1, _y2, _pp) == 0) {\n return (0, 0);\n } else {\n // P1 = P2\n (x, y, z) = jacDouble(\n _x1,\n _y1,\n 1,\n _aa,\n _pp);\n }\n } else {\n (x, y, z) = jacAdd(\n _x1,\n _y1,\n 1,\n _x2,\n _y2,\n 1,\n _pp);\n }\n // Get back to affine\n return toAffine(\n x,\n y,\n z,\n _pp);\n }\n\n}\n"},"contracts/samples/bls/BLSSignatureAggregator.sol":{"content":"//SPDX-License-Identifier: Unlicense\npragma solidity >=0.8.4 <0.9.0;\npragma abicoder v2;\n\nimport \"../../interfaces/IAggregator.sol\";\nimport \"../../interfaces/IEntryPoint.sol\";\nimport {BLSOpen} from \"./lib/BLSOpen.sol\";\nimport \"./IBLSAccount.sol\";\nimport \"./BLSHelper.sol\";\n\n/**\n * A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount\n */\ncontract BLSSignatureAggregator is IAggregator {\n using UserOperationLib for UserOperation;\n\n bytes32 public constant BLS_DOMAIN = keccak256(\"eip4337.bls.domain\");\n\n //copied from BLS.sol\n uint256 public constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n /**\n * @return publicKey - the public key from a BLS keypair the Aggregator will use to verify this UserOp;\n * normally public key will be queried from the deployed BLSAccount itself;\n * the public key will be read from the 'initCode' if the account is not deployed yet;\n */\n function getUserOpPublicKey(UserOperation memory userOp) public view returns (uint256[4] memory publicKey) {\n bytes memory initCode = userOp.initCode;\n if (initCode.length > 0) {\n publicKey = getTrailingPublicKey(initCode);\n } else {\n return IBLSAccount(userOp.sender).getBlsPublicKey{gas : 50000}();\n }\n }\n\n /**\n * return the trailing 4 words of input data\n */\n function getTrailingPublicKey(bytes memory data) public pure returns (uint256[4] memory publicKey) {\n uint len = data.length;\n require(len > 32 * 4, \"data too short for sig\");\n\n /* solhint-disable-next-line no-inline-assembly */\n assembly {\n // actual buffer starts at data+32, so last 128 bytes start at data+32+len-128 = data+len-96\n let ofs := sub(add(data, len), 96)\n mstore(publicKey, mload(ofs))\n mstore(add(publicKey, 32), mload(add(ofs, 32)))\n mstore(add(publicKey, 64), mload(add(ofs, 64)))\n mstore(add(publicKey, 96), mload(add(ofs, 96)))\n }\n }\n\n /// @inheritdoc IAggregator\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature)\n external view override {\n require(signature.length == 64, \"BLS: invalid signature\");\n (uint256[2] memory blsSignature) = abi.decode(signature, (uint256[2]));\n\n uint userOpsLen = userOps.length;\n uint256[4][] memory blsPublicKeys = new uint256[4][](userOpsLen);\n uint256[2][] memory messages = new uint256[2][](userOpsLen);\n for (uint256 i = 0; i < userOpsLen; i++) {\n\n UserOperation memory userOp = userOps[i];\n blsPublicKeys[i] = getUserOpPublicKey(userOp);\n\n messages[i] = _userOpToMessage(userOp, _getPublicKeyHash(blsPublicKeys[i]));\n }\n require(BLSOpen.verifyMultiple(blsSignature, blsPublicKeys, messages), \"BLS: validateSignatures failed\");\n }\n\n /**\n * get a hash of userOp\n * NOTE: this hash is not the same as UserOperation.hash()\n * (slightly less efficient, since it uses memory userOp)\n */\n function internalUserOpHash(UserOperation memory userOp) internal pure returns (bytes32) {\n return keccak256(abi.encode(\n userOp.sender,\n userOp.nonce,\n keccak256(userOp.initCode),\n keccak256(userOp.callData),\n userOp.callGasLimit,\n userOp.verificationGasLimit,\n userOp.preVerificationGas,\n userOp.maxFeePerGas,\n userOp.maxPriorityFeePerGas,\n keccak256(userOp.paymasterAndData)\n ));\n }\n\n /**\n * return the BLS \"message\" for the given UserOp.\n * the account checks the signature over this value using its public key\n */\n function userOpToMessage(UserOperation memory userOp) public view returns (uint256[2] memory) {\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\n return _userOpToMessage(userOp, publicKeyHash);\n }\n\n function _userOpToMessage(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (uint256[2] memory) {\n bytes32 userOpHash = _getUserOpHash(userOp, publicKeyHash);\n return BLSOpen.hashToPoint(BLS_DOMAIN, abi.encodePacked(userOpHash));\n }\n\n // helper for test\n function getUserOpHash(UserOperation memory userOp) public view returns (bytes32) {\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\n return _getUserOpHash(userOp, publicKeyHash);\n }\n\n function _getUserOpHash(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (bytes32) {\n return keccak256(abi.encode(internalUserOpHash(userOp), publicKeyHash, address(this), block.chainid));\n }\n\n function _getPublicKeyHash(uint256[4] memory publicKey) internal pure returns(bytes32) {\n return keccak256(abi.encode(publicKey));\n }\n /**\n * validate signature of a single userOp\n * This method is called after EntryPoint.simulateValidation() returns an aggregator.\n * First it validates the signature over the userOp. then it return data to be used when creating the handleOps:\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp) {\n uint256[2] memory signature = abi.decode(userOp.signature, (uint256[2]));\n uint256[4] memory pubkey = getUserOpPublicKey(userOp);\n uint256[2] memory message = _userOpToMessage(userOp, _getPublicKeyHash(pubkey));\n\n require(BLSOpen.verifySingle(signature, pubkey, message), \"BLS: wrong sig\");\n return \"\";\n }\n\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\n BLSHelper.XY[] memory points = new BLSHelper.XY[](userOps.length);\n for (uint i = 0; i < points.length; i++) {\n (uint256 x, uint256 y) = abi.decode(userOps[i].signature, (uint256, uint256));\n points[i] = BLSHelper.XY(x, y);\n }\n BLSHelper.XY memory sum = BLSHelper.sum(points, N);\n return abi.encode(sum.x, sum.y);\n }\n\n /**\n * allow staking for this aggregator\n * there is no limit on stake or delay, but it is not a problem, since it is a permissionless\n * signature aggregator, which doesn't support unstaking.\n */\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\n entryPoint.addStake{value : msg.value}(delay);\n }\n}\n"},"contracts/samples/bls/IBLSAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.6;\n\nimport \"../../interfaces/IAccount.sol\";\n\n/**\n * a BLS account should expose its own public key.\n */\ninterface IBLSAccount is IAccount {\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\n\n /**\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\n */\n function getBlsPublicKey() external view returns (uint256[4] memory);\n}\n"},"contracts/samples/bls/lib/BLSOpen.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\nimport { BLS } from \"./hubble-contracts/contracts/libs/BLS.sol\";\n\nlibrary BLSOpen {\n function verifySingle(\n uint256[2] memory signature,\n uint256[4] memory pubkey,\n uint256[2] memory message\n ) external view returns (bool) {\n uint256[4][] memory pubkeys = new uint256[4][](1);\n uint256[2][] memory messages = new uint256[2][](1);\n pubkeys[0] = pubkey;\n messages[0] = message;\n\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\n signature,\n pubkeys,\n messages\n );\n return callSuccess && verified;\n\n // // NB: (result, success) opposite of `call` convention (success, result).\n // (bool verified, bool callSuccess) = BLS.verifySingle(\n // signature,\n // pubkey,\n // message\n // );\n // return callSuccess && verified;\n }\n\n function verifyMultiple(\n uint256[2] memory signature,\n uint256[4][] memory pubkeys,\n uint256[2][] memory messages\n ) external view returns (bool) {\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\n signature,\n pubkeys,\n messages\n );\n return callSuccess && verified;\n }\n\n function hashToPoint(\n bytes32 domain,\n bytes memory message\n ) external view returns (uint256[2] memory) {\n return BLS.hashToPoint(\n domain,\n message\n );\n }\n\n function isZeroBLSKey(uint256[4] memory blsKey) public pure returns (bool) {\n bool isZero = true;\n for (uint256 i=0; isZero && i<4; i++) {\n isZero = (blsKey[i] == 0);\n }\n return isZero;\n }\n\n}\n"},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\nimport { ModexpInverse, ModexpSqrt } from \"./ModExp.sol\";\nimport {\n BNPairingPrecompileCostEstimator\n} from \"./BNPairingPrecompileCostEstimator.sol\";\n\n/**\n @title Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\n @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\n @dev We use G1 points for signatures and messages, and G2 points for public keys\n */\nlibrary BLS {\n // Field order\n // prettier-ignore\n uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Negated genarator of G2\n // prettier-ignore\n uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n // prettier-ignore\n uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n // prettier-ignore\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\n // prettier-ignore\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\n\n // sqrt(-3)\n // prettier-ignore\n uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;\n // (sqrt(-3) - 1) / 2\n // prettier-ignore\n uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;\n\n // prettier-ignore\n uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;\n // prettier-ignore\n uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;\n\n // estimator address\n// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;\n\n function verifySingle(\n uint256[2] memory signature,\n uint256[4] memory pubkey,\n uint256[2] memory message\n ) internal view returns (bool, bool) {\n uint256[12] memory input =\n [\n signature[0],\n signature[1],\n N_G2_X1,\n N_G2_X0,\n N_G2_Y1,\n N_G2_Y0,\n message[0],\n message[1],\n pubkey[1],\n pubkey[0],\n pubkey[3],\n pubkey[2]\n ];\n uint256[1] memory out;\n uint256 precompileGasCost = gasleft();\n// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(\n// 2\n// );\n bool callSuccess;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(\n precompileGasCost,\n 8,\n input,\n 384,\n out,\n 0x20\n )\n }\n if (!callSuccess) {\n return (false, false);\n }\n return (out[0] != 0, true);\n }\n\n function verifyMultiple(\n uint256[2] memory signature,\n uint256[4][] memory pubkeys,\n uint256[2][] memory messages\n ) internal view returns (bool checkResult, bool callSuccess) {\n uint256 size = pubkeys.length;\n require(size > 0, \"BLS: number of public key is zero\");\n require(\n size == messages.length,\n \"BLS: number of public keys and messages must be equal\"\n );\n uint256 inputSize = (size + 1) * 6;\n uint256[] memory input = new uint256[](inputSize);\n input[0] = signature[0];\n input[1] = signature[1];\n input[2] = N_G2_X1;\n input[3] = N_G2_X0;\n input[4] = N_G2_Y1;\n input[5] = N_G2_Y0;\n for (uint256 i = 0; i < size; i++) {\n input[i * 6 + 6] = messages[i][0];\n input[i * 6 + 7] = messages[i][1];\n input[i * 6 + 8] = pubkeys[i][1];\n input[i * 6 + 9] = pubkeys[i][0];\n input[i * 6 + 10] = pubkeys[i][3];\n input[i * 6 + 11] = pubkeys[i][2];\n }\n uint256[1] memory out;\n\n // prettier-ignore\n uint256 precompileGasCost = gasleft();\n// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(\n precompileGasCost,\n 8,\n add(input, 0x20),\n mul(inputSize, 0x20),\n out,\n 0x20\n )\n }\n if (!callSuccess) {\n return (false, false);\n }\n return (out[0] != 0, true);\n }\n\n /**\n @notice Fouque-Tibouchi Hash to Curve\n */\n function hashToPoint(bytes32 domain, bytes memory message)\n internal\n view\n returns (uint256[2] memory)\n {\n uint256[2] memory u = hashToField(domain, message);\n uint256[2] memory p0 = mapToPoint(u[0]);\n uint256[2] memory p1 = mapToPoint(u[1]);\n uint256[4] memory bnAddInput;\n bnAddInput[0] = p0[0];\n bnAddInput[1] = p0[1];\n bnAddInput[2] = p1[0];\n bnAddInput[3] = p1[1];\n bool success;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)\n switch success\n case 0 {\n invalid()\n }\n }\n require(success, \"BLS: bn add call failed\");\n return p0;\n }\n\n function mapToPoint(uint256 _x)\n internal\n pure\n returns (uint256[2] memory p)\n {\n require(_x < N, \"mapToPointFT: invalid field element\");\n uint256 x = _x;\n\n (, bool decision) = sqrt(x);\n\n uint256 a0 = mulmod(x, x, N);\n a0 = addmod(a0, 4, N);\n uint256 a1 = mulmod(x, Z0, N);\n uint256 a2 = mulmod(a1, a0, N);\n a2 = inverse(a2);\n a1 = mulmod(a1, a1, N);\n a1 = mulmod(a1, a2, N);\n\n // x1\n a1 = mulmod(x, a1, N);\n x = addmod(Z1, N - a1, N);\n // check curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n bool found;\n (a1, found) = sqrt(a1);\n if (found) {\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n // x2\n x = N - addmod(x, 1, N);\n // check curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n (a1, found) = sqrt(a1);\n if (found) {\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n // x3\n x = mulmod(a0, a0, N);\n x = mulmod(x, x, N);\n x = mulmod(x, a2, N);\n x = mulmod(x, a2, N);\n x = addmod(x, 1, N);\n // must be on curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n (a1, found) = sqrt(a1);\n require(found, \"BLS: bad ft mapping implementation\");\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n function isValidSignature(uint256[2] memory signature)\n internal\n pure\n returns (bool)\n {\n if ((signature[0] >= N) || (signature[1] >= N)) {\n return false;\n } else {\n return isOnCurveG1(signature);\n }\n }\n\n function isOnCurveG1(uint256[2] memory point)\n internal\n pure\n returns (bool _isOnCurve)\n {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t0 := mload(point)\n let t1 := mload(add(point, 32))\n let t2 := mulmod(t0, t0, N)\n t2 := mulmod(t2, t0, N)\n t2 := addmod(t2, 3, N)\n t1 := mulmod(t1, t1, N)\n _isOnCurve := eq(t1, t2)\n }\n }\n\n function isOnCurveG2(uint256[4] memory point)\n internal\n pure\n returns (bool _isOnCurve)\n {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n // x0, x1\n let t0 := mload(point)\n let t1 := mload(add(point, 32))\n // x0 ^ 2\n let t2 := mulmod(t0, t0, N)\n // x1 ^ 2\n let t3 := mulmod(t1, t1, N)\n // 3 * x0 ^ 2\n let t4 := add(add(t2, t2), t2)\n // 3 * x1 ^ 2\n let t5 := addmod(add(t3, t3), t3, N)\n // x0 * (x0 ^ 2 - 3 * x1 ^ 2)\n t2 := mulmod(add(t2, sub(N, t5)), t0, N)\n // x1 * (3 * x0 ^ 2 - x1 ^ 2)\n t3 := mulmod(add(t4, sub(N, t3)), t1, N)\n\n // x ^ 3 + b\n t0 := addmod(\n t2,\n 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,\n N\n )\n t1 := addmod(\n t3,\n 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,\n N\n )\n\n // y0, y1\n t2 := mload(add(point, 64))\n t3 := mload(add(point, 96))\n // y ^ 2\n t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)\n t3 := mulmod(shl(1, t2), t3, N)\n\n // y ^ 2 == x ^ 3 + b\n _isOnCurve := and(eq(t0, t4), eq(t1, t3))\n }\n }\n\n function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {\n x = ModexpSqrt.run(xx);\n hasRoot = mulmod(x, x, N) == xx;\n }\n\n function inverse(uint256 a) internal pure returns (uint256) {\n return ModexpInverse.run(a);\n }\n\n function hashToField(bytes32 domain, bytes memory messages)\n internal\n pure\n returns (uint256[2] memory)\n {\n bytes memory _msg = expandMsgTo96(domain, messages);\n uint256 u0;\n uint256 u1;\n uint256 a0;\n uint256 a1;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let p := add(_msg, 24)\n u1 := and(mload(p), MASK24)\n p := add(_msg, 48)\n u0 := and(mload(p), MASK24)\n a0 := addmod(mulmod(u1, T24, N), u0, N)\n p := add(_msg, 72)\n u1 := and(mload(p), MASK24)\n p := add(_msg, 96)\n u0 := and(mload(p), MASK24)\n a1 := addmod(mulmod(u1, T24, N), u0, N)\n }\n return [a0, a1];\n }\n\n function expandMsgTo96(bytes32 domain, bytes memory message)\n internal\n pure\n returns (bytes memory)\n {\n // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>\n uint256 t0 = message.length;\n bytes memory msg0 = new bytes(32 + t0 + 64 + 4);\n bytes memory out = new bytes(96);\n // b0\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let p := add(msg0, 96)\n for {\n let z := 0\n } lt(z, t0) {\n z := add(z, 32)\n } {\n mstore(add(p, z), mload(add(message, add(z, 32))))\n }\n p := add(p, t0)\n\n mstore8(p, 0)\n p := add(p, 1)\n mstore8(p, 96)\n p := add(p, 1)\n mstore8(p, 0)\n p := add(p, 1)\n\n mstore(p, domain)\n p := add(p, 32)\n mstore8(p, 32)\n }\n bytes32 b0 = sha256(msg0);\n bytes32 bi;\n t0 = 32 + 34;\n\n // resize intermediate message\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(msg0, t0)\n }\n\n // b1\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(msg0, 32), b0)\n mstore8(add(msg0, 64), 1)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 32), bi)\n }\n\n // b2\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t := xor(b0, bi)\n mstore(add(msg0, 32), t)\n mstore8(add(msg0, 64), 2)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 64), bi)\n }\n\n // b3\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t := xor(b0, bi)\n mstore(add(msg0, 32), t)\n mstore8(add(msg0, 64), 3)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 96), bi)\n }\n\n return out;\n }\n}\n"},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.6.12;\n\ncontract BNPairingPrecompileCostEstimator {\n uint256 public baseCost;\n uint256 public perPairCost;\n\n // G1 Generator\n uint256 private constant G1_X = 1;\n uint256 private constant G1_Y = 2;\n\n // G2 genarator\n // prettier-ignore\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n // prettier-ignore\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n // prettier-ignore\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n // prettier-ignore\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\n // G2 negated genarator y coordinates\n // prettier-ignore\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\n // prettier-ignore\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\n\n function run() external {\n _run();\n }\n\n function getGasCost(uint256 pairCount) external view returns (uint256) {\n return pairCount * perPairCost + baseCost;\n }\n\n function _run() internal {\n uint256 gasCost1Pair = _gasCost1Pair();\n uint256 gasCost2Pair = _gasCost2Pair();\n perPairCost = gasCost2Pair - gasCost1Pair;\n baseCost = gasCost1Pair - perPairCost;\n }\n\n function _gasCost1Pair() internal view returns (uint256) {\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\n uint256[1] memory out;\n bool callSuccess;\n uint256 suppliedGas = gasleft() - 2000;\n require(\n gasleft() > 2000,\n \"BNPairingPrecompileCostEstimator: not enough gas, single pair\"\n );\n uint256 gasT0 = gasleft();\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\n }\n uint256 gasCost = gasT0 - gasleft();\n require(\n callSuccess,\n \"BNPairingPrecompileCostEstimator: single pair call is failed\"\n );\n require(\n out[0] == 0,\n \"BNPairingPrecompileCostEstimator: single pair call result must be 0\"\n );\n return gasCost;\n }\n\n function _gasCost2Pair() internal view returns (uint256) {\n uint256[12] memory input =\n [\n G1_X,\n G1_Y,\n G2_X1,\n G2_X0,\n G2_Y1,\n G2_Y0,\n G1_X,\n G1_Y,\n G2_X1,\n G2_X0,\n N_G2_Y1,\n N_G2_Y0\n ];\n uint256[1] memory out;\n bool callSuccess;\n uint256 suppliedGas = gasleft() - 2000;\n require(\n gasleft() > 2000,\n \"BNPairingPrecompileCostEstimator: not enough gas, couple pair\"\n );\n uint256 gasT0 = gasleft();\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\n }\n uint256 gasCost = gasT0 - gasleft();\n require(\n callSuccess,\n \"BNPairingPrecompileCostEstimator: couple pair call is failed\"\n );\n require(\n out[0] == 1,\n \"BNPairingPrecompileCostEstimator: couple pair call result must be 1\"\n );\n return gasCost;\n }\n}\n"},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\n/**\n @title Compute Inverse by Modular Exponentiation\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\n @dev the function body is generated with the modified addchain script\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\n */\nlibrary ModexpInverse {\n function run(uint256 t2) internal pure returns (uint256 t0) {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let\n n\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n t0 := mulmod(t2, t2, n)\n let t5 := mulmod(t0, t2, n)\n let t1 := mulmod(t5, t0, n)\n let t3 := mulmod(t5, t5, n)\n let t8 := mulmod(t1, t0, n)\n let t4 := mulmod(t3, t5, n)\n let t6 := mulmod(t3, t1, n)\n t0 := mulmod(t3, t3, n)\n let t7 := mulmod(t8, t3, n)\n t3 := mulmod(t4, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n }\n }\n}\n\n/**\n @title Compute Squre Root by Modular Exponentiation\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\n */\nlibrary ModexpSqrt {\n function run(uint256 t6) internal pure returns (uint256 t0) {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let\n n\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n\n t0 := mulmod(t6, t6, n)\n let t4 := mulmod(t0, t6, n)\n let t2 := mulmod(t4, t0, n)\n let t3 := mulmod(t4, t4, n)\n let t8 := mulmod(t2, t0, n)\n let t1 := mulmod(t3, t4, n)\n let t5 := mulmod(t3, t2, n)\n t0 := mulmod(t3, t3, n)\n let t7 := mulmod(t8, t3, n)\n t3 := mulmod(t1, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n }\n }\n}\n"},"contracts/samples/BobaDepositPaymaster.sol":{"content":"/**\n * Credit - DepositPaymaster.sol from https://github.com/eth-infinitism/account-abstraction\n */\n\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../core/BasePaymaster.sol\";\nimport \"./IBobaStraw.sol\";\n\n/**\n * A token-based paymaster that accepts token deposits\n * The deposit is only a safeguard: the user pays with his token balance.\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n * thus the required deposit is to cover just one method call.\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n * (but can't use the deposit for this or further operations)\n *\n * paymasterAndData holds the paymaster address followed by the token address to use.\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n * (the standard rules ban accessing data of an external contract)\n * It can only be used if it is \"whitelisted\" by the bundler.\n * (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)\n * If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value\n * on validation and asynchronously update the ratio\n */\ncontract BobaDepositPaymaster is BasePaymaster {\n\n using UserOperationLib for UserOperation;\n using SafeERC20 for IERC20;\n\n struct Oracle {\n IBobaStraw feedRegistry;\n address tokenBase;\n uint8 tokenDecimals;\n }\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 35000;\n address public constant QUOTE_USD = 0x0000000000000000000000000000000000000348;\n\n // for alt-l1, treat this as the native token\n address public constant L2_ETH_ADDRESS = 0x4200000000000000000000000000000000000006;\n IERC20 public constant L2_ETH = IERC20(L2_ETH_ADDRESS);\n\n IBobaStraw private constant NULL_ORACLE = IBobaStraw(address(0));\n\n mapping(IERC20 => Oracle) public oracles;\n mapping(IERC20 => mapping(address => uint256)) public balances;\n mapping(address => uint256) public unlockBlock;\n\n constructor(IEntryPoint _entryPoint, IBobaStraw ethPriceOracle) BasePaymaster(_entryPoint) {\n require(ethPriceOracle != NULL_ORACLE, \"DepositPaymaster: Incorrect eth oracle\");\n //owner account is unblocked, to allow withdraw of paid tokens;\n unlockTokenDeposit();\n // set native token base\n oracles[L2_ETH] = Oracle(ethPriceOracle, L2_ETH_ADDRESS, 18);\n }\n\n /**\n * owner of the paymaster should add supported tokens\n */\n function addToken(IERC20 token, IBobaStraw tokenPriceOracle, address base, uint8 tokenDecimals) external onlyOwner {\n require(tokenPriceOracle != NULL_ORACLE, \"DepositPaymaster: Incorrect token oracle\");\n require(oracles[token].feedRegistry == NULL_ORACLE);\n oracles[token] = Oracle(tokenPriceOracle, base, tokenDecimals);\n }\n\n /**\n * deposit tokens that a specific account can use to pay for gas.\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n * Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n * use them - either as gas, or using withdrawTo()\n *\n * @param token the token to deposit.\n * @param account the account to deposit for.\n * @param amount the amount of token to deposit.\n */\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\n //(sender must have approval for the paymaster)\n // native tokens will fail here\n token.safeTransferFrom(msg.sender, address(this), amount);\n require(oracles[token].feedRegistry != NULL_ORACLE, \"DepositPaymaster: unsupported token\");\n balances[token][account] += amount;\n if (msg.sender == account) {\n lockTokenDeposit();\n }\n }\n\n /**\n * @return amount - the amount of given token deposited to the Paymaster.\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\n */\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\n amount = balances[token][account];\n _unlockBlock = unlockBlock[account];\n }\n\n /**\n * unlock deposit, so that it can be withdrawn.\n * can't be called in the same block as withdrawTo()\n */\n function unlockTokenDeposit() public {\n unlockBlock[msg.sender] = block.number;\n }\n\n /**\n * lock the tokens deposited for this account so they can be used to pay for gas.\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\n */\n function lockTokenDeposit() public {\n unlockBlock[msg.sender] = 0;\n }\n\n /**\n * withdraw tokens.\n * can only be called after unlock() is called in a previous block.\n * @param token the token deposit to withdraw\n * @param target address to send to\n * @param amount amount to withdraw\n */\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \"DepositPaymaster: must unlockTokenDeposit\");\n balances[token][msg.sender] -= amount;\n token.safeTransfer(target, amount);\n }\n\n /**\n * translate the given eth value to token amount\n * @param token the token to use\n * @param ethBought the required eth value we want to \"buy\"\n * @return requiredTokens the amount of tokens required to get this amount of eth\n */\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\n Oracle memory oracleInfo = oracles[token];\n require(oracleInfo.feedRegistry != NULL_ORACLE, \"DepositPaymaster: unsupported token\");\n address base = oracleInfo.tokenBase;\n uint256 ethPrice = uint256(oracles[L2_ETH].feedRegistry.latestAnswer(oracles[L2_ETH].tokenBase, QUOTE_USD));\n uint256 tokenPrice = uint256(oracleInfo.feedRegistry.latestAnswer(base, QUOTE_USD));\n uint256 ethPriceDecimals = uint256(oracles[L2_ETH].feedRegistry.decimals(oracles[L2_ETH].tokenBase, QUOTE_USD));\n uint256 tokenPriceDecimals = uint256(oracleInfo.feedRegistry.decimals(base, QUOTE_USD));\n uint256 requiredAmount = (ethBought * ethPrice * (10**tokenPriceDecimals)) / (tokenPrice * (10**ethPriceDecimals));\n // there is no requiredAmount = 0 check, priceRatio from oracle shouldnt exceed ethBought\n return ((requiredAmount * (10**oracleInfo.tokenDecimals)) / (10**oracles[L2_ETH].tokenDecimals));\n }\n\n /**\n * Validate the request:\n * The sender should have enough deposit to pay the max possible cost.\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\n * this deposit will be used to compensate the paymaster for the transaction.\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal view override returns (bytes memory context, uint256 validationData) {\n\n (userOpHash);\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n require(userOp.verificationGasLimit > COST_OF_POST, \"DepositPaymaster: gas too low for postOp\");\n\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n require(paymasterAndData.length == 20+20, \"DepositPaymaster: paymasterAndData must specify token\");\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\n address account = userOp.getSender();\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\n uint256 gasPriceUserOp = userOp.gasPrice();\n require(unlockBlock[account] == 0, \"DepositPaymaster: deposit not locked\");\n require(balances[token][account] >= maxTokenCost, \"DepositPaymaster: deposit too low\");\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\n }\n\n /**\n * perform the post-operation to charge the sender for the gas.\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n * this time in *postOpReverted* mode.\n * In this mode, we use the deposit to pay (which we validated to be large enough)\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\n //use same conversion rate as used for validation.\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\n if (mode != PostOpMode.postOpReverted) {\n // attempt to pay with tokens:\n token.safeTransferFrom(account, address(this), actualTokenCost);\n } else {\n //in case above transferFrom failed, pay with deposit:\n balances[token][account] -= actualTokenCost;\n }\n balances[token][owner()] += actualTokenCost;\n }\n}\n"},"contracts/samples/BobaVerifyingPaymaster.sol":{"content":"/**\n * Credit - VerifyingPaymaster.sol from https://github.com/eth-infinitism/account-abstraction\n */\n\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n/* solhint-disable no-inline-assembly */\n\nimport \"../core/BasePaymaster.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\n/**\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\n * The paymaster trusts an external signer to sign the transaction.\n * The calling user must pass the UserOp to that external signer first, which performs\n * whatever off-chain verification before signing the UserOp.\n * Note that this signature is NOT a replacement for account-specific signature:\n * - the paymaster checks a signature to agree to PAY for GAS.\n * - the account checks a signature to prove identity and account ownership.\n */\ncontract BobaVerifyingPaymaster is BasePaymaster {\n\n using ECDSA for bytes32;\n using UserOperationLib for UserOperation;\n\n uint256 private constant VALID_TIMESTAMP_OFFSET = 20;\n\n uint256 private constant SIGNATURE_OFFSET = 84;\n\n address public immutable verifyingSigner;\n address public bobaDepositPaymaster;\n address public approvedToken;\n\n bytes4 public constant APPROVE_FUNCTION_SELECTOR = bytes4(keccak256(\"approve(address,uint256)\"));\n bytes4 public constant DEPOSIT_FOR_FUNCTION_SELECTOR = bytes4(keccak256(\"addDepositFor(address,address,uint256)\"));\n\n constructor(IEntryPoint _entryPoint, address _verifyingSigner, address _bobaDepositPaymaster, address _approvedToken) BasePaymaster(_entryPoint) {\n verifyingSigner = _verifyingSigner;\n bobaDepositPaymaster = _bobaDepositPaymaster;\n approvedToken = _approvedToken;\n }\n\n mapping(address => uint256) public senderNonce;\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n // lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata pnd = userOp.paymasterAndData;\n // copy directly the userOp from calldata up to (but not including) the paymasterAndData.\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\n // than referencing each field separately.\n assembly {\n let ofs := userOp\n let len := sub(sub(pnd.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n }\n\n\n /**\n * return the hash we're going to sign off-chain (and validate on-chain)\n * this method is called by the off-chain service, to sign the request.\n * it is called on-chain from the validatePaymasterUserOp, to validate the signature.\n * note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\",\n * which will carry the signature itself.\n */\n function getHash(UserOperation calldata userOp, uint48 validUntil, uint48 validAfter)\n public view returns (bytes32) {\n //can't use userOp.hash(), since it contains also the paymasterAndData itself.\n\n return keccak256(abi.encode(\n pack(userOp),\n block.chainid,\n address(this),\n senderNonce[userOp.getSender()],\n validUntil,\n validAfter\n ));\n }\n\n /**\n * verify our external signer signed this request.\n * the \"paymasterAndData\" is expected to be the paymaster and a signature over the entire request params\n * paymasterAndData[:20] : address(this)\n * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\n * paymasterAndData[84:] : signature\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\n internal override returns (bytes memory context, uint256 validationData) {\n (requiredPreFund);\n\n (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);\n //ECDSA library supports both 64 and 65-byte long signatures.\n // we only \"require\" it here so that the revert reason on invalid signature will be of \"VerifyingPaymaster\", and not \"ECDSA\"\n require(signature.length == 64 || signature.length == 65, \"VerifyingPaymaster: invalid signature length in paymasterAndData\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));\n senderNonce[userOp.getSender()]++;\n\n //don't revert on signature failure: return SIG_VALIDATION_FAILED\n if (verifyingSigner != ECDSA.recover(hash, signature)) {\n return (\"\",_packValidationData(true,validUntil,validAfter));\n }\n\n require(_validateCallDataApprove(userOp.callData) || _validateCallDataDeposit(userOp.callData), \"VerifyingPaymaster: invalid operation\");\n //no need for other on-chain validation: entire UserOp should have been checked\n // by the external service prior to signing it.\n return (\"\",_packValidationData(false,validUntil,validAfter));\n }\n\n function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns(uint48 validUntil, uint48 validAfter, bytes calldata signature) {\n (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET:SIGNATURE_OFFSET],(uint48, uint48));\n signature = paymasterAndData[SIGNATURE_OFFSET:];\n }\n\n function _validateCallDataApprove(bytes calldata opCallData) internal view returns(bool) {\n // check approve\n if (opCallData.length != 228) return false;\n bytes4 funcSelector = bytes4(opCallData[132:136]);\n bytes calldata destData = opCallData[4:36];\n address dest = abi.decode(destData, (address));\n if (dest != approvedToken) return false;\n bytes memory approveParam = opCallData[136:200];\n (address spender, ) = abi.decode(approveParam, (address, uint256));\n if (funcSelector == APPROVE_FUNCTION_SELECTOR && spender == bobaDepositPaymaster) return true;\n return false;\n }\n\n function _validateCallDataDeposit(bytes calldata opCallData) internal view returns(bool) {\n // check approve\n if (opCallData.length != 260) return false;\n bytes4 funcSelector = bytes4(opCallData[132:136]);\n bytes calldata destData = opCallData[4:36];\n address dest = abi.decode(destData, (address));\n if (dest != bobaDepositPaymaster) return false;\n bytes memory depositParam = opCallData[136:232];\n (address token, , ) = abi.decode(depositParam, (address, address, uint256));\n if (funcSelector == DEPOSIT_FOR_FUNCTION_SELECTOR && token == approvedToken) return true;\n return false;\n }\n\n}\n"},"contracts/samples/callback/TokenCallbackHandler.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-empty-blocks */\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport \"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\nimport \"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\";\n\n/**\n * Token callback handler.\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\n */\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\n function tokensReceived(\n address,\n address,\n address,\n uint256,\n bytes calldata,\n bytes calldata\n ) external pure override {\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC721Receiver.onERC721Received.selector;\n }\n\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata,\n uint256[] calldata,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155BatchReceived.selector;\n }\n\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\n return\n interfaceId == type(IERC721Receiver).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"contracts/samples/DepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../core/BasePaymaster.sol\";\nimport \"./IOracle.sol\";\n\n/**\n * A token-based paymaster that accepts token deposits\n * The deposit is only a safeguard: the user pays with his token balance.\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n * thus the required deposit is to cover just one method call.\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n * (but can't use the deposit for this or further operations)\n *\n * paymasterAndData holds the paymaster address followed by the token address to use.\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n * (the standard rules ban accessing data of an external contract)\n * It can only be used if it is \"whitelisted\" by the bundler.\n * (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)\n */\ncontract DepositPaymaster is BasePaymaster {\n\n using UserOperationLib for UserOperation;\n using SafeERC20 for IERC20;\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 35000;\n\n IOracle private constant NULL_ORACLE = IOracle(address(0));\n mapping(IERC20 => IOracle) public oracles;\n mapping(IERC20 => mapping(address => uint256)) public balances;\n mapping(address => uint256) public unlockBlock;\n\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\n //owner account is unblocked, to allow withdraw of paid tokens;\n unlockTokenDeposit();\n }\n\n /**\n * owner of the paymaster should add supported tokens\n */\n function addToken(IERC20 token, IOracle tokenPriceOracle) external onlyOwner {\n require(oracles[token] == NULL_ORACLE, \"Token already set\");\n oracles[token] = tokenPriceOracle;\n }\n\n /**\n * deposit tokens that a specific account can use to pay for gas.\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n * Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n * use them - either as gas, or using withdrawTo()\n *\n * @param token the token to deposit.\n * @param account the account to deposit for.\n * @param amount the amount of token to deposit.\n */\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\n //(sender must have approval for the paymaster)\n token.safeTransferFrom(msg.sender, address(this), amount);\n require(oracles[token] != NULL_ORACLE, \"unsupported token\");\n balances[token][account] += amount;\n if (msg.sender == account) {\n lockTokenDeposit();\n }\n }\n\n /**\n * @return amount - the amount of given token deposited to the Paymaster.\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\n */\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\n amount = balances[token][account];\n _unlockBlock = unlockBlock[account];\n }\n\n /**\n * unlock deposit, so that it can be withdrawn.\n * can't be called in the same block as withdrawTo()\n */\n function unlockTokenDeposit() public {\n unlockBlock[msg.sender] = block.number;\n }\n\n /**\n * lock the tokens deposited for this account so they can be used to pay for gas.\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\n */\n function lockTokenDeposit() public {\n unlockBlock[msg.sender] = 0;\n }\n\n /**\n * withdraw tokens.\n * can only be called after unlock() is called in a previous block.\n * @param token the token deposit to withdraw\n * @param target address to send to\n * @param amount amount to withdraw\n */\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \"DepositPaymaster: must unlockTokenDeposit\");\n balances[token][msg.sender] -= amount;\n token.safeTransfer(target, amount);\n }\n\n /**\n * translate the given eth value to token amount\n * @param token the token to use\n * @param ethBought the required eth value we want to \"buy\"\n * @return requiredTokens the amount of tokens required to get this amount of eth\n */\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\n IOracle oracle = oracles[token];\n require(oracle != NULL_ORACLE, \"DepositPaymaster: unsupported token\");\n return oracle.getTokenValueOfEth(ethBought);\n }\n\n /**\n * Validate the request:\n * The sender should have enough deposit to pay the max possible cost.\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\n * this deposit will be used to compensate the paymaster for the transaction.\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal view override returns (bytes memory context, uint256 validationData) {\n\n (userOpHash);\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n require(userOp.verificationGasLimit > COST_OF_POST, \"DepositPaymaster: gas too low for postOp\");\n\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n require(paymasterAndData.length == 20+20, \"DepositPaymaster: paymasterAndData must specify token\");\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\n address account = userOp.getSender();\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\n uint256 gasPriceUserOp = userOp.gasPrice();\n require(unlockBlock[account] == 0, \"DepositPaymaster: deposit not locked\");\n require(balances[token][account] >= maxTokenCost, \"DepositPaymaster: deposit too low\");\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\n }\n\n /**\n * perform the post-operation to charge the sender for the gas.\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n * this time in *postOpReverted* mode.\n * In this mode, we use the deposit to pay (which we validated to be large enough)\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\n //use same conversion rate as used for validation.\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\n if (mode != PostOpMode.postOpReverted) {\n // attempt to pay with tokens:\n token.safeTransferFrom(account, address(this), actualTokenCost);\n } else {\n //in case above transferFrom failed, pay with deposit:\n balances[token][account] -= actualTokenCost;\n }\n balances[token][owner()] += actualTokenCost;\n }\n}\n"},"contracts/samples/gnosis/EIP4337Fallback.sol":{"content":"//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable no-inline-assembly */\n\nimport \"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\";\nimport \"@openzeppelin/contracts/interfaces/IERC1271.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"../../interfaces/IAccount.sol\";\nimport \"./EIP4337Manager.sol\";\n\nusing ECDSA for bytes32;\n\n/**\n * The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\n * This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\n * Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\n * Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\n */\ncontract EIP4337Fallback is DefaultCallbackHandler, IAccount, IERC1271 {\n bytes4 internal constant ERC1271_MAGIC_VALUE = 0x1626ba7e;\n\n address immutable public eip4337manager;\n constructor(address _eip4337manager) {\n eip4337manager = _eip4337manager;\n }\n\n /**\n * delegate the contract call to the EIP4337Manager\n */\n function delegateToManager() internal returns (bytes memory) {\n // delegate entire msg.data (including the appended \"msg.sender\") to the EIP4337Manager\n // will work only for GnosisSafe contracts\n GnosisSafe safe = GnosisSafe(payable(msg.sender));\n (bool success, bytes memory ret) = safe.execTransactionFromModuleReturnData(eip4337manager, 0, msg.data, Enum.Operation.DelegateCall);\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /**\n * called from the Safe. delegate actual work to EIP4337Manager\n */\n function validateUserOp(UserOperation calldata, bytes32, uint256) override external returns (uint256 deadline){\n bytes memory ret = delegateToManager();\n return abi.decode(ret, (uint256));\n }\n\n /**\n * Helper for wallet to get the next nonce.\n */\n function getNonce() public returns (uint256 nonce) {\n bytes memory ret = delegateToManager();\n (nonce) = abi.decode(ret, (uint256));\n }\n\n /**\n * called from the Safe. delegate actual work to EIP4337Manager\n */\n function executeAndRevert(\n address,\n uint256,\n bytes memory,\n Enum.Operation\n ) external {\n delegateToManager();\n }\n\n function isValidSignature(\n bytes32 _hash,\n bytes memory _signature\n ) external override view returns (bytes4) {\n bytes32 hash = _hash.toEthSignedMessageHash();\n address recovered = hash.recover(_signature);\n\n GnosisSafe safe = GnosisSafe(payable(address(msg.sender)));\n\n // Validate signatures\n if (safe.isOwner(recovered)) {\n return ERC1271_MAGIC_VALUE;\n } else {\n return 0xffffffff;\n }\n }\n}\n"},"contracts/samples/gnosis/EIP4337Manager.sol":{"content":"//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\";\nimport \"./EIP4337Fallback.sol\";\nimport \"../../interfaces/IAccount.sol\";\nimport \"../../interfaces/IEntryPoint.sol\";\nimport \"../../utils/Exec.sol\";\n\n using ECDSA for bytes32;\n\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n * Inherits GnosisSafe so that it can reference the memory storage\n */\ncontract EIP4337Manager is IAccount, GnosisSafeStorage, Executor {\n\n address public immutable eip4337Fallback;\n address public immutable entryPoint;\n\n // return value in case of signature failure, with no time-range.\n // equivalent to _packValidationData(true,0,0);\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\n\n address internal constant SENTINEL_MODULES = address(0x1);\n\n constructor(address anEntryPoint) {\n entryPoint = anEntryPoint;\n eip4337Fallback = address(new EIP4337Fallback(address(this)));\n }\n\n /**\n * delegate-called (using execFromModule) through the fallback, so \"real\" msg.sender is attached as last 20 bytes\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\n require(msgSender == entryPoint, \"account: not from entrypoint\");\n\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n address recovered = hash.recover(userOp.signature);\n require(threshold == 1, \"account: only threshold 1\");\n if (!pThis.isOwner(recovered)) {\n validationData = SIG_VALIDATION_FAILED;\n }\n\n // mimic normal Safe nonce behaviour: prevent parallel nonces\n require(userOp.nonce < type(uint64).max, \"account: nonsequential nonce\");\n\n if (missingAccountFunds > 0) {\n //Note: MAY pay more than the minimum, to deposit for future transactions\n (bool success,) = payable(msgSender).call{value : missingAccountFunds}(\"\");\n (success);\n //ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n\n /**\n * Execute a call but also revert if the execution fails.\n * The default behavior of the Safe is to not revert if the call fails,\n * which is challenging for integrating with ERC4337 because then the\n * EntryPoint wouldn't know to emit the UserOperationRevertReason event,\n * which the frontend/client uses to capture the reason for the failure.\n */\n function executeAndRevert(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) external {\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\n require(msgSender == entryPoint, \"account: not from entrypoint\");\n require(msg.sender == eip4337Fallback, \"account: not from EIP4337Fallback\");\n\n bool success = execute(\n to,\n value,\n data,\n operation,\n type(uint256).max\n );\n\n bytes memory returnData = Exec.getReturnData(type(uint256).max);\n // Revert with the actual reason string\n // Adopted from: https://github.com/Uniswap/v3-periphery/blob/464a8a49611272f7349c970e0fadb7ec1d3c1086/contracts/base/Multicall.sol#L16-L23\n if (!success) {\n if (returnData.length < 68) revert();\n assembly {\n returnData := add(returnData, 0x04)\n }\n revert(abi.decode(returnData, (string)));\n }\n }\n\n /**\n * Helper for wallet to get the next nonce.\n */\n function getNonce() public view returns (uint256) {\n return IEntryPoint(entryPoint).getNonce(address(this), 0);\n }\n\n /**\n * set up a safe as EIP-4337 enabled.\n * called from the GnosisSafeAccountFactory during construction time\n * - enable 3 modules (this module, fallback and the entrypoint)\n * - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \"this\" is the safe itself\n */\n function setup4337Modules(\n EIP4337Manager manager //the manager (this contract)\n ) external {\n GnosisSafe safe = GnosisSafe(payable(address(this)));\n require(!safe.isModuleEnabled(manager.entryPoint()), \"setup4337Modules: entrypoint already enabled\");\n require(!safe.isModuleEnabled(manager.eip4337Fallback()), \"setup4337Modules: eip4337Fallback already enabled\");\n safe.enableModule(manager.entryPoint());\n safe.enableModule(manager.eip4337Fallback());\n }\n\n /**\n * replace EIP4337 module, to support a new EntryPoint.\n * must be called using execTransaction and Enum.Operation.DelegateCall\n * @param prevModule returned by getCurrentEIP4337Manager\n * @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\n * @param newManager the new EIP4337Manager, usually with a new EntryPoint\n */\n function replaceEIP4337Manager(address prevModule, EIP4337Manager oldManager, EIP4337Manager newManager) public {\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\n address oldFallback = oldManager.eip4337Fallback();\n require(pThis.isModuleEnabled(oldFallback), \"replaceEIP4337Manager: oldManager is not active\");\n pThis.disableModule(oldFallback, oldManager.entryPoint());\n pThis.disableModule(prevModule, oldFallback);\n\n address eip4337fallback = newManager.eip4337Fallback();\n\n pThis.enableModule(newManager.entryPoint());\n pThis.enableModule(eip4337fallback);\n pThis.setFallbackHandler(eip4337fallback);\n\n validateEip4337(pThis, newManager);\n }\n\n /**\n * Validate this gnosisSafe is callable through the EntryPoint.\n * the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\n * we don't test full transaction\n */\n function validateEip4337(GnosisSafe safe, EIP4337Manager manager) public {\n\n // this prevents mistaken replaceEIP4337Manager to disable the module completely.\n // minimal signature that pass \"recover\"\n bytes memory sig = new bytes(65);\n sig[64] = bytes1(uint8(27));\n sig[2] = bytes1(uint8(1));\n sig[35] = bytes1(uint8(1));\n uint256 nonce = uint256(IEntryPoint(manager.entryPoint()).getNonce(address(safe), 0));\n UserOperation memory userOp = UserOperation(address(safe), nonce, \"\", \"\", 0, 1000000, 0, 0, 0, \"\", sig);\n UserOperation[] memory userOps = new UserOperation[](1);\n userOps[0] = userOp;\n IEntryPoint _entryPoint = IEntryPoint(payable(manager.entryPoint()));\n try _entryPoint.handleOps(userOps, payable(msg.sender)) {\n revert(\"validateEip4337: handleOps must fail\");\n } catch (bytes memory error) {\n if (keccak256(error) != keccak256(abi.encodeWithSignature(\"FailedOp(uint256,string)\", 0, \"AA24 signature error\"))) {\n revert(string(error));\n }\n }\n }\n /**\n * enumerate modules, and find the currently active EIP4337 manager (and previous module)\n * @return prev prev module, needed by replaceEIP4337Manager\n * @return manager the current active EIP4337Manager\n */\n function getCurrentEIP4337Manager(GnosisSafe safe) public view returns (address prev, address manager) {\n prev = address(SENTINEL_MODULES);\n (address[] memory modules,) = safe.getModulesPaginated(SENTINEL_MODULES, 100);\n for (uint i = 0; i < modules.length; i++) {\n address module = modules[i];\n try EIP4337Fallback(module).eip4337manager() returns (address _manager) {\n return (prev, _manager);\n }\n // solhint-disable-next-line no-empty-blocks\n catch {}\n prev = module;\n }\n return (address(0), address(0));\n }\n}\n"},"contracts/samples/gnosis/GnosisAccountFactory.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\";\nimport \"./EIP4337Manager.sol\";\n\n/**\n * A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract.\n */\ncontract GnosisSafeAccountFactory {\n\n GnosisSafeProxyFactory public immutable proxyFactory;\n address public immutable safeSingleton;\n EIP4337Manager public immutable eip4337Manager;\n\n constructor(GnosisSafeProxyFactory _proxyFactory, address _safeSingleton, EIP4337Manager _eip4337Manager) {\n proxyFactory = _proxyFactory;\n safeSingleton = _safeSingleton;\n eip4337Manager = _eip4337Manager;\n }\n\n function createAccount(address owner,uint256 salt) public returns (address) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return addr;\n }\n return address(proxyFactory.createProxyWithNonce(\n safeSingleton, getInitializer(owner), salt));\n }\n\n function getInitializer(address owner) internal view returns (bytes memory) {\n address[] memory owners = new address[](1);\n owners[0] = owner;\n uint threshold = 1;\n address eip4337fallback = eip4337Manager.eip4337Fallback();\n\n bytes memory setup4337Modules = abi.encodeCall(\n EIP4337Manager.setup4337Modules, (eip4337Manager));\n\n return abi.encodeCall(GnosisSafe.setup, (\n owners, threshold,\n address (eip4337Manager), setup4337Modules,\n eip4337fallback,\n address(0), 0, payable(0) //no payment receiver\n ));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n * (uses the same \"create2 signature\" used by GnosisSafeProxyFactory.createProxyWithNonce)\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n bytes memory initializer = getInitializer(owner);\n //copied from deployProxyWithNonce\n bytes32 salt2 = keccak256(abi.encodePacked(keccak256(initializer), salt));\n bytes memory deploymentData = abi.encodePacked(proxyFactory.proxyCreationCode(), uint256(uint160(safeSingleton)));\n return Create2.computeAddress(bytes32(salt2), keccak256(deploymentData), address (proxyFactory));\n }\n}\n"},"contracts/samples/GPODepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../core/BasePaymaster.sol\";\nimport \"./IBobaGasPriceOracle.sol\";\n\n/**\n * Intended to be used for Boba Alt-L1 deployments\n * This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the\n * secondary (or native token)\n */\ncontract GPODepositPaymaster is BasePaymaster {\n\n using UserOperationLib for UserOperation;\n using SafeERC20 for IERC20;\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 35000;\n\n mapping(address => uint256) public balances;\n mapping(address => uint256) public unlockBlock;\n\n IERC20 public supportedToken;\n uint8 public supportedTokenDecimals;\n IBobaGasPriceOracle public gasPriceOracle;\n\n constructor(IEntryPoint _entryPoint, address _supportedToken, uint8 _supportedTokenDecimals, address _gasPriceOracle) BasePaymaster(_entryPoint) {\n supportedToken = IERC20(_supportedToken);\n supportedTokenDecimals = _supportedTokenDecimals;\n gasPriceOracle = IBobaGasPriceOracle(_gasPriceOracle);\n //owner account is unblocked, to allow withdraw of paid tokens;\n unlockTokenDeposit();\n }\n\n /**\n * deposit tokens that a specific account can use to pay for gas.\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n * Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n * use them - either as gas, or using withdrawTo()\n *\n * @param account the account to deposit for.\n * @param amount the amount of token to deposit.\n */\n function addDepositFor(address account, uint256 amount) external {\n //(sender must have approval for the paymaster)\n supportedToken.safeTransferFrom(msg.sender, address(this), amount);\n balances[account] += amount;\n if (msg.sender == account) {\n lockTokenDeposit();\n }\n }\n\n /**\n * @return amount - the amount of given token deposited to the Paymaster.\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\n */\n function depositInfo(address account) public view returns (uint256 amount, uint256 _unlockBlock) {\n amount = balances[account];\n _unlockBlock = unlockBlock[account];\n }\n\n /**\n * unlock deposit, so that it can be withdrawn.\n * can't be called in the same block as withdrawTo()\n */\n function unlockTokenDeposit() public {\n unlockBlock[msg.sender] = block.number;\n }\n\n /**\n * lock the tokens deposited for this account so they can be used to pay for gas.\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\n */\n function lockTokenDeposit() public {\n unlockBlock[msg.sender] = 0;\n }\n\n /**\n * withdraw tokens.\n * can only be called after unlock() is called in a previous block.\n * @param target address to send to\n * @param amount amount to withdraw\n */\n function withdrawTokensTo(address target, uint256 amount) public {\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \"DepositPaymaster: must unlockTokenDeposit\");\n balances[msg.sender] -= amount;\n supportedToken.safeTransfer(target, amount);\n }\n\n /**\n * translate the given eth value to token amount\n * @param ethBought the required eth value we want to \"buy\"\n * @return requiredTokens the amount of tokens required to get this amount of eth\n */\n function getTokenValueOfEth(uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\n uint256 priceRatioDecimals = gasPriceOracle.decimals();\n uint256 priceRatio = gasPriceOracle.priceRatio();\n uint256 requiredAmount = (ethBought * priceRatio) / (10**priceRatioDecimals);\n return (requiredAmount / (10**(18 - supportedTokenDecimals)));\n }\n\n /**\n * Validate the request:\n * The sender should have enough deposit to pay the max possible cost.\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\n * this deposit will be used to compensate the paymaster for the transaction.\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal view override returns (bytes memory context, uint256 validationData) {\n\n (userOpHash);\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n require(userOp.verificationGasLimit > COST_OF_POST, \"DepositPaymaster: gas too low for postOp\");\n\n address account = userOp.getSender();\n uint256 maxTokenCost = getTokenValueOfEth(maxCost);\n uint256 gasPriceUserOp = userOp.gasPrice();\n require(unlockBlock[account] == 0, \"DepositPaymaster: deposit not locked\");\n require(balances[account] >= maxTokenCost, \"DepositPaymaster: deposit too low\");\n return (abi.encode(account, gasPriceUserOp, maxTokenCost, maxCost),0);\n }\n\n /**\n * perform the post-operation to charge the sender for the gas.\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n * this time in *postOpReverted* mode.\n * In this mode, we use the deposit to pay (which we validated to be large enough)\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n\n (address account, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, uint256, uint256, uint256));\n //use same conversion rate as used for validation.\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\n if (mode != PostOpMode.postOpReverted) {\n // attempt to pay with tokens:\n supportedToken.safeTransferFrom(account, address(this), actualTokenCost);\n } else {\n //in case above transferFrom failed, pay with deposit:\n balances[account] -= actualTokenCost;\n }\n balances[owner()] += actualTokenCost;\n }\n}\n"},"contracts/samples/IBobaGasPriceOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.12;\npragma experimental ABIEncoderV2;\n\ninterface IBobaGasPriceOracle {\n function decimals() external view returns (uint256);\n\n function priceRatio() external view returns (uint256);\n}\n"},"contracts/samples/IBobaStraw.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.12;\npragma experimental ABIEncoderV2;\n\ninterface IBobaStraw {\n function latestRoundData(\n address base,\n address quote\n )\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n function getRoundData(\n address base,\n address quote,\n uint80 _roundId\n )\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n // V2 AggregatorInterface\n\n function latestAnswer(\n address base,\n address quote\n )\n external\n view\n returns (\n int256 answer\n );\n\n function latestTimestamp(\n address base,\n address quote\n )\n external\n view\n returns (\n uint256 timestamp\n );\n\n function decimals(\n address base,\n address quote\n )\n external\n view\n returns (\n uint8\n );\n}\n"},"contracts/samples/IOracle.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface IOracle {\n\n /**\n * return amount of tokens that are required to receive that much eth.\n */\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\n}\n\n"},"contracts/samples/ManualDepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../core/BasePaymaster.sol\";\nimport \"./IOracle.sol\";\n\n/**\n * A token-based paymaster that accepts token deposits\n * The deposit is only a safeguard: the user pays with his token balance.\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n * thus the required deposit is to cover just one method call.\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n * (but can't use the deposit for this or further operations)\n *\n * paymasterAndData holds the paymaster address followed by the token address to use.\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n * (the standard rules ban accessing data of an external contract)\n * It can only be used if it is \"whitelisted\" by the bundler.\n * (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)\n */\ncontract ManualDepositPaymaster is BasePaymaster {\n\n using UserOperationLib for UserOperation;\n using SafeERC20 for IERC20;\n\n struct SupportedTokenInfo {\n IERC20 token;\n uint8 tokenDecimals;\n uint256 priceRatio; // ratio = token : native\n uint256 priceRatioDecimals;\n uint256 minRatio;\n uint256 maxRatio;\n }\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 35000;\n\n mapping(IERC20 => SupportedTokenInfo) public priceRatioInfo;\n mapping(IERC20 => mapping(address => uint256)) public balances;\n mapping(address => uint256) public unlockBlock;\n\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\n //owner account is unblocked, to allow withdraw of paid tokens;\n unlockTokenDeposit();\n }\n\n /**\n * owner of the paymaster should add supported tokens\n */\n function addToken(IERC20 token, uint8 tokenDecimals, uint256 priceRatio, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\n require(priceRatioInfo[token].token == IERC20(address(0)));\n require(priceRatio != 0, \"DepositPaymaster: price ratio cannot be zero\");\n require(minRatio != 0, \"DepositPaymaster: min ratio cannot be zero\");\n require(priceRatio >= minRatio && priceRatio <= maxRatio, \"DepositPaymaster: Invalid price ratio\");\n require(token != IERC20(address(0)), \"DepositPaymaster: Invalid token\");\n priceRatioInfo[token] = SupportedTokenInfo(token, tokenDecimals, priceRatio, priceRatioDecimals, minRatio, maxRatio);\n }\n\n /**\n * deposit tokens that a specific account can use to pay for gas.\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n * Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n * use them - either as gas, or using withdrawTo()\n *\n * @param token the token to deposit.\n * @param account the account to deposit for.\n * @param amount the amount of token to deposit.\n */\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\n //(sender must have approval for the paymaster)\n token.safeTransferFrom(msg.sender, address(this), amount);\n require(priceRatioInfo[token].token != IERC20(address(0)), \"DepositPaymaster: unsupported token\");\n balances[token][account] += amount;\n if (msg.sender == account) {\n lockTokenDeposit();\n }\n }\n\n /**\n * @return amount - the amount of given token deposited to the Paymaster.\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\n */\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\n amount = balances[token][account];\n _unlockBlock = unlockBlock[account];\n }\n\n /**\n * unlock deposit, so that it can be withdrawn.\n * can't be called in the same block as withdrawTo()\n */\n function unlockTokenDeposit() public {\n unlockBlock[msg.sender] = block.number;\n }\n\n /**\n * lock the tokens deposited for this account so they can be used to pay for gas.\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\n */\n function lockTokenDeposit() public {\n unlockBlock[msg.sender] = 0;\n }\n\n /**\n * withdraw tokens.\n * can only be called after unlock() is called in a previous block.\n * @param token the token deposit to withdraw\n * @param target address to send to\n * @param amount amount to withdraw\n */\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \"DepositPaymaster: must unlockTokenDeposit\");\n balances[token][msg.sender] -= amount;\n token.safeTransfer(target, amount);\n }\n\n /**\n * translate the given eth value to token amount\n * @param token the token to use\n * @param ethBought the required eth value we want to \"buy\"\n * @return requiredTokens the amount of tokens required to get this amount of eth\n */\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\n require(priceRatioInfo[token].token != IERC20(address(0)), \"DepositPaymaster: unsupported token\");\n uint256 requiredAmount = (ethBought * (10**priceRatioInfo[token].priceRatioDecimals)) / priceRatioInfo[token].priceRatio;\n // there is no requiredAmount = 0 check, priceRatio set by owner and shouldn't exceed ethBought\n return (requiredAmount / (10**(18 - priceRatioInfo[token].tokenDecimals)));\n }\n\n /**\n * allows the owner to update the token params\n */\n function updateTokenParams(IERC20 token, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\n require(priceRatioInfo[token].token != IERC20(address(0)), \"DepositPaymaster: unsupported token\");\n require(minRatio != 0, \"min ratio cannot be zero\");\n priceRatioInfo[token].priceRatioDecimals = priceRatioDecimals;\n priceRatioInfo[token].minRatio = minRatio;\n priceRatioInfo[token].maxRatio = maxRatio;\n }\n\n /**\n * allows the owner to update the price Ratio of a token\n * can be called as per precision desired by owner\n */\n function updatePriceRatio(IERC20 token, uint256 priceRatio) external onlyOwner {\n require(priceRatioInfo[token].token != IERC20(address(0)), \"DepositPaymaster: unsupported token\");\n require(priceRatio >= priceRatioInfo[token].minRatio && priceRatio <= priceRatioInfo[token].maxRatio, \"DepositPaymaster: Invalid price ratio\");\n priceRatioInfo[token].priceRatio = priceRatio;\n }\n\n /**\n * Validate the request:\n * The sender should have enough deposit to pay the max possible cost.\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\n * this deposit will be used to compensate the paymaster for the transaction.\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal view override returns (bytes memory context, uint256 validationData) {\n\n (userOpHash);\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n require(userOp.verificationGasLimit > COST_OF_POST, \"DepositPaymaster: gas too low for postOp\");\n\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n require(paymasterAndData.length == 20+20, \"DepositPaymaster: paymasterAndData must specify token\");\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\n address account = userOp.getSender();\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\n uint256 gasPriceUserOp = userOp.gasPrice();\n require(unlockBlock[account] == 0, \"DepositPaymaster: deposit not locked\");\n require(balances[token][account] >= maxTokenCost, \"DepositPaymaster: deposit too low\");\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\n }\n\n /**\n * perform the post-operation to charge the sender for the gas.\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n * this time in *postOpReverted* mode.\n * In this mode, we use the deposit to pay (which we validated to be large enough)\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n\n (address account, IERC20 token, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\n //use same conversion rate as used for validation.\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\n if (mode != PostOpMode.postOpReverted) {\n // attempt to pay with tokens:\n token.safeTransferFrom(account, address(this), actualTokenCost);\n } else {\n //in case above transferFrom failed, pay with deposit:\n balances[token][account] -= actualTokenCost;\n }\n balances[token][owner()] += actualTokenCost;\n }\n}\n"},"contracts/samples/SimpleAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\";\n\nimport \"../core/BaseAccount.sol\";\nimport \"./callback/TokenCallbackHandler.sol\";\n\n/**\n * minimal account.\n * this is sample minimal account.\n * has execute, eth handling methods\n * has a single signer that can send requests through the entryPoint.\n */\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\n using ECDSA for bytes32;\n\n address public owner;\n\n IEntryPoint private immutable _entryPoint;\n\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\n\n modifier onlyOwner() {\n _onlyOwner();\n _;\n }\n\n /// @inheritdoc BaseAccount\n function entryPoint() public view virtual override returns (IEntryPoint) {\n return _entryPoint;\n }\n\n\n // solhint-disable-next-line no-empty-blocks\n receive() external payable {}\n\n constructor(IEntryPoint anEntryPoint) {\n _entryPoint = anEntryPoint;\n _disableInitializers();\n }\n\n function _onlyOwner() internal view {\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\n require(msg.sender == owner || msg.sender == address(this), \"only owner\");\n }\n\n /**\n * execute a transaction (called directly from owner, or by entryPoint)\n */\n function execute(address dest, uint256 value, bytes calldata func) external {\n _requireFromEntryPointOrOwner();\n _call(dest, value, func);\n }\n\n /**\n * execute a sequence of transactions\n */\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\n _requireFromEntryPointOrOwner();\n require(dest.length == func.length, \"wrong array lengths\");\n for (uint256 i = 0; i < dest.length; i++) {\n _call(dest[i], 0, func[i]);\n }\n }\n\n /**\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\n * the implementation by calling `upgradeTo()`\n */\n function initialize(address anOwner) public virtual initializer {\n _initialize(anOwner);\n }\n\n function _initialize(address anOwner) internal virtual {\n owner = anOwner;\n emit SimpleAccountInitialized(_entryPoint, owner);\n }\n\n // Require the function call went through EntryPoint or owner\n function _requireFromEntryPointOrOwner() internal view {\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \"account: not Owner or EntryPoint\");\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override virtual returns (uint256 validationData) {\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n if (owner != hash.recover(userOp.signature))\n return SIG_VALIDATION_FAILED;\n return 0;\n }\n\n function _call(address target, uint256 value, bytes memory data) internal {\n (bool success, bytes memory result) = target.call{value : value}(data);\n if (!success) {\n assembly {\n revert(add(result, 32), mload(result))\n }\n }\n }\n\n /**\n * check current account deposit in the entryPoint\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint().balanceOf(address(this));\n }\n\n /**\n * deposit more funds for this account in the entryPoint\n */\n function addDeposit() public payable {\n entryPoint().depositTo{value : msg.value}(address(this));\n }\n\n /**\n * withdraw value from the account's deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\n entryPoint().withdrawTo(withdrawAddress, amount);\n }\n\n function _authorizeUpgrade(address newImplementation) internal view override {\n (newImplementation);\n _onlyOwner();\n }\n}\n\n"},"contracts/samples/SimpleAccountFactory.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"./SimpleAccount.sol\";\n\n/**\n * A sample factory contract for SimpleAccount\n * A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\n * The factory's createAccount returns the target account address even if it is already installed.\n * This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\n */\ncontract SimpleAccountFactory {\n SimpleAccount public immutable accountImplementation;\n\n constructor(IEntryPoint _entryPoint) {\n accountImplementation = new SimpleAccount(_entryPoint);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n */\n function createAccount(address owner,uint256 salt) public returns (SimpleAccount ret) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return SimpleAccount(payable(addr));\n }\n ret = SimpleAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(SimpleAccount.initialize, (owner))\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(SimpleAccount.initialize, (owner))\n )\n )));\n }\n}\n"},"contracts/samples/TokenPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * A sample paymaster that defines itself as a token to pay for gas.\n * The paymaster IS the token to use, since a paymaster cannot use an external contract.\n * Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract.\n * subclass should override \"getTokenValueOfEth\" to provide actual token exchange rate, settable by the owner.\n * Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts):\n * - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted,\n * and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster)\n * in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit)\n * - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or\n * to whitelist the account and the called method ids.\n */\ncontract TokenPaymaster is BasePaymaster, ERC20 {\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 15000;\n\n address public immutable theFactory;\n\n constructor(address accountFactory, string memory _symbol, IEntryPoint _entryPoint) ERC20(_symbol, _symbol) BasePaymaster(_entryPoint) {\n theFactory = accountFactory;\n //make it non-empty\n _mint(address(this), 1);\n\n //owner is allowed to withdraw tokens from the paymaster's balance\n _approve(address(this), msg.sender, type(uint).max);\n }\n\n\n /**\n * helpers for owner, to mint and withdraw tokens.\n * @param recipient - the address that will receive the minted tokens.\n * @param amount - the amount it will receive.\n */\n function mintTokens(address recipient, uint256 amount) external onlyOwner {\n _mint(recipient, amount);\n }\n\n /**\n * transfer paymaster ownership.\n * owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance)\n * when changing owner, the old owner's withdrawal rights are revoked.\n */\n function transferOwnership(address newOwner) public override virtual onlyOwner {\n // remove allowance of current owner\n _approve(address(this), owner(), 0);\n super.transferOwnership(newOwner);\n // new owner is allowed to withdraw tokens from the paymaster's balance\n _approve(address(this), newOwner, type(uint).max);\n }\n\n //Note: this method assumes a fixed ratio of token-to-eth. subclass should override to supply oracle\n // or a setter.\n function getTokenValueOfEth(uint256 valueEth) internal view virtual returns (uint256 valueToken) {\n return valueEth / 100;\n }\n\n /**\n * validate the request:\n * if this is a constructor call, make sure it is a known account.\n * verify the sender has enough tokens.\n * (since the paymaster is also the token, there is no notion of \"approval\")\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\n internal view override returns (bytes memory context, uint256 validationData) {\n uint256 tokenPrefund = getTokenValueOfEth(requiredPreFund);\n\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n // make sure that verificationGasLimit is high enough to handle postOp\n require(userOp.verificationGasLimit > COST_OF_POST, \"TokenPaymaster: gas too low for postOp\");\n\n if (userOp.initCode.length != 0) {\n _validateConstructor(userOp);\n require(balanceOf(userOp.sender) >= tokenPrefund, \"TokenPaymaster: no balance (pre-create)\");\n } else {\n\n require(balanceOf(userOp.sender) >= tokenPrefund, \"TokenPaymaster: no balance\");\n }\n\n return (abi.encode(userOp.sender), 0);\n }\n\n // when constructing an account, validate constructor code and parameters\n // we trust our factory (and that it doesn't have any other public methods)\n function _validateConstructor(UserOperation calldata userOp) internal virtual view {\n address factory = address(bytes20(userOp.initCode[0 : 20]));\n require(factory == theFactory, \"TokenPaymaster: wrong account factory\");\n }\n\n /**\n * actual charge of user.\n * this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases)\n * BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting\n * the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp),\n * and the transaction should succeed there.\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n //we don't really care about the mode, we just pay the gas with the user's tokens.\n (mode);\n address sender = abi.decode(context, (address));\n uint256 charge = getTokenValueOfEth(actualGasCost + COST_OF_POST);\n //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed.\n _transfer(sender, address(this), charge);\n }\n}\n"},"contracts/samples/VerifyingPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n/* solhint-disable no-inline-assembly */\n\nimport \"../core/BasePaymaster.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n/**\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\n * The paymaster trusts an external signer to sign the transaction.\n * The calling user must pass the UserOp to that external signer first, which performs\n * whatever off-chain verification before signing the UserOp.\n * Note that this signature is NOT a replacement for the account-specific signature:\n * - the paymaster checks a signature to agree to PAY for GAS.\n * - the account checks a signature to prove identity and account ownership.\n */\ncontract VerifyingPaymaster is BasePaymaster {\n\n using ECDSA for bytes32;\n using UserOperationLib for UserOperation;\n\n address public immutable verifyingSigner;\n\n uint256 private constant VALID_TIMESTAMP_OFFSET = 20;\n\n uint256 private constant SIGNATURE_OFFSET = 84;\n\n constructor(IEntryPoint _entryPoint, address _verifyingSigner) BasePaymaster(_entryPoint) {\n verifyingSigner = _verifyingSigner;\n }\n\n mapping(address => uint256) public senderNonce;\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n // lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata pnd = userOp.paymasterAndData;\n // copy directly the userOp from calldata up to (but not including) the paymasterAndData.\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\n // than referencing each field separately.\n assembly {\n let ofs := userOp\n let len := sub(sub(pnd.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n }\n\n /**\n * return the hash we're going to sign off-chain (and validate on-chain)\n * this method is called by the off-chain service, to sign the request.\n * it is called on-chain from the validatePaymasterUserOp, to validate the signature.\n * note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\",\n * which will carry the signature itself.\n */\n function getHash(UserOperation calldata userOp, uint48 validUntil, uint48 validAfter)\n public view returns (bytes32) {\n //can't use userOp.hash(), since it contains also the paymasterAndData itself.\n\n return keccak256(abi.encode(\n pack(userOp),\n block.chainid,\n address(this),\n senderNonce[userOp.getSender()],\n validUntil,\n validAfter\n ));\n }\n\n /**\n * verify our external signer signed this request.\n * the \"paymasterAndData\" is expected to be the paymaster and a signature over the entire request params\n * paymasterAndData[:20] : address(this)\n * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\n * paymasterAndData[84:] : signature\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\n internal override returns (bytes memory context, uint256 validationData) {\n (requiredPreFund);\n\n (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);\n //ECDSA library supports both 64 and 65-byte long signatures.\n // we only \"require\" it here so that the revert reason on invalid signature will be of \"VerifyingPaymaster\", and not \"ECDSA\"\n require(signature.length == 64 || signature.length == 65, \"VerifyingPaymaster: invalid signature length in paymasterAndData\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));\n senderNonce[userOp.getSender()]++;\n\n //don't revert on signature failure: return SIG_VALIDATION_FAILED\n if (verifyingSigner != ECDSA.recover(hash, signature)) {\n return (\"\",_packValidationData(true,validUntil,validAfter));\n }\n\n //no need for other on-chain validation: entire UserOp should have been checked\n // by the external service prior to signing it.\n return (\"\",_packValidationData(false,validUntil,validAfter));\n }\n\n function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns(uint48 validUntil, uint48 validAfter, bytes calldata signature) {\n (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET:SIGNATURE_OFFSET],(uint48, uint48));\n signature = paymasterAndData[SIGNATURE_OFFSET:];\n }\n}\n"},"contracts/test/BrokenBlsAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"../samples/SimpleAccount.sol\";\nimport \"../samples/bls/IBLSAccount.sol\";\n\n/**\n * for testing: a BLS account that fails to return its public-key (completely ignores its publickey)\n * this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.\n */\ncontract BrokenBLSAccount is SimpleAccount, IBLSAccount {\n address public immutable aggregator;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable values slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\n (aPublicKey);\n super._initialize(address(0));\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n\n (userOp, userOpHash);\n return _packValidationData(ValidationData(aggregator, 0,0));\n }\n\n function getBlsPublicKey() external override pure returns (uint256[4] memory) {\n uint256[4] memory pubkey;\n return pubkey;\n }\n}\n\n\n/**\n * Based n SimpleAccountFactory\n * can't be a subclass, since both constructor and createAccount depend on the\n * actual wallet contract constructor and initializer\n */\ncontract BrokenBLSAccountFactory {\n BrokenBLSAccount public immutable accountImplementation;\n\n constructor(IEntryPoint entryPoint, address aggregator){\n accountImplementation = new BrokenBLSAccount(entryPoint, aggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n * Also note that out BLSSignatureAggregator requires that the public-key is the last parameter\n */\n function createAccount(uint salt, uint256[4] memory aPublicKey) public returns (BrokenBLSAccount) {\n\n address addr = getAddress(salt, aPublicKey);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return BrokenBLSAccount(payable(addr));\n }\n return BrokenBLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(BrokenBLSAccount.initialize, aPublicKey)\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(uint salt, uint256[4] memory aPublicKey) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(BrokenBLSAccount.initialize, (aPublicKey))\n )\n )));\n }\n}\n"},"contracts/test/MaliciousAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../core/EntryPoint.sol\";\n\ncontract MaliciousAccount is IAccount {\n IEntryPoint private ep;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\n external returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n // Now calculate basefee per EntryPoint.getUserOpGasPrice() and compare it to the basefe we pass off-chain in the signature\n uint256 externalBaseFee = abi.decode(userOp.signature, (uint256));\n uint256 requiredGas = userOp.callGasLimit + userOp.verificationGasLimit + userOp.preVerificationGas;\n uint256 gasPrice = missingAccountFunds / requiredGas;\n uint256 basefee = gasPrice - userOp.maxPriorityFeePerGas;\n require (basefee == externalBaseFee, \"Revert after first validation\");\n return 0;\n }\n}\n"},"contracts/test/mocks/MockFeedRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.12;\npragma experimental ABIEncoderV2;\n\nimport \"../../samples/IBobaStraw.sol\";\n\ncontract MockFeedRegistry is IBobaStraw {\n\n int256 public fixedReturnValue = 45;\n uint8 public decimalsOverride = 8;\n\n function latestRoundData(\n address base,\n address quote\n )\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n ) {\n return (0,0,0,0,0);\n }\n\n function getRoundData(\n address base,\n address quote,\n uint80 _roundId\n )\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n ) {\n return (0,0,0,0,0);\n }\n\n // V2 AggregatorInterface\n\n function latestAnswer(\n address base,\n address quote\n )\n external\n view\n returns (\n int256 answer\n ) {\n return fixedReturnValue;\n }\n\n function latestTimestamp(\n address base,\n address quote\n )\n external\n view\n returns (\n uint256 timestamp\n ) {\n return 0;\n }\n\n function decimals(\n address base,\n address quote\n )\n external\n view\n returns (\n uint8\n ) {\n return decimalsOverride;\n }\n\n function updateFixedRetunValue(\n int256 newValue\n )\n external\n {\n fixedReturnValue = newValue;\n }\n\n function updateDecimals(\n uint8 newDecimals\n )\n external\n {\n decimalsOverride = newDecimals;\n }\n}\n"},"contracts/test/mocks/MockGasPriceOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.12;\npragma experimental ABIEncoderV2;\n\nimport \"../../samples/IBobaGasPriceOracle.sol\";\n\ncontract MockGasPriceOracle is IBobaGasPriceOracle {\n uint256 public fixedReturnValue = 45;\n uint256 public decimalsOverride = 8;\n\n function decimals() external view returns (uint256) {\n return decimalsOverride;\n }\n\n function priceRatio() external view returns (uint256) {\n return fixedReturnValue;\n }\n\n function updateFixedRetunValue(uint256 newValue) external {\n fixedReturnValue = newValue;\n }\n\n function updateDecimals(uint256 newDecimals) external {\n decimalsOverride = newDecimals;\n }\n}"},"contracts/test/TestAggregatedAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * test aggregated-signature account.\n * works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum\n * a true aggregated account should expose data (e.g. its public key) to the aggregator.\n */\ncontract TestAggregatedAccount is SimpleAccount {\n address public immutable aggregator;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n /// @inheritdoc SimpleAccount\n function initialize(address) public virtual override initializer {\n super._initialize(address(0));\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n (userOp, userOpHash);\n return _packValidationData(ValidationData(aggregator, 0, 0));\n }\n}\n"},"contracts/test/TestAggregatedAccountFactory.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"./TestAggregatedAccount.sol\";\n\n/**\n * Based on SimpleAccountFactory.\n * Cannot be a subclass since both constructor and createAccount depend on the\n * constructor and initializer of the actual account contract.\n */\ncontract TestAggregatedAccountFactory {\n TestAggregatedAccount public immutable accountImplementation;\n\n constructor(IEntryPoint anEntryPoint, address anAggregator){\n accountImplementation = new TestAggregatedAccount(anEntryPoint, anAggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n */\n function createAccount(address owner,uint256 salt) public returns (TestAggregatedAccount ret) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return TestAggregatedAccount(payable(addr));\n }\n ret = TestAggregatedAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\n )\n )));\n }\n}\n"},"contracts/test/TestCounter.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n//sample \"receiver\" contract, for testing \"exec\" from account.\ncontract TestCounter {\n mapping(address => uint256) public counters;\n\n function count() public {\n counters[msg.sender] = counters[msg.sender] + 1;\n }\n\n function countFail() public pure {\n revert(\"count failed\");\n }\n\n function justemit() public {\n emit CalledFrom(msg.sender);\n }\n\n event CalledFrom(address sender);\n\n //helper method to waste gas\n // repeat - waste gas on writing storage in a loop\n // junk - dynamic buffer to stress the function size.\n mapping(uint256 => uint256) public xxx;\n uint256 public offset;\n\n function gasWaster(uint256 repeat, string calldata /*junk*/) external {\n for (uint256 i = 1; i <= repeat; i++) {\n offset++;\n xxx[offset] = i;\n }\n }\n}\n"},"contracts/test/TestExpirePaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * test expiry mechanism: paymasterData encodes the \"validUntil\" and validAfter\" times\n */\ncontract TestExpirePaymaster is BasePaymaster {\n // solhint-disable no-empty-blocks\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint)\n {}\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual override view\n returns (bytes memory context, uint256 validationData) {\n (userOp, userOpHash, maxCost);\n (uint48 validAfter, uint48 validUntil) = abi.decode(userOp.paymasterAndData[20 :], (uint48, uint48));\n validationData = _packValidationData(false, validUntil, validAfter);\n context = \"\";\n }\n}\n"},"contracts/test/TestExpiryAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * A test account, for testing expiry.\n * add \"temporary\" owners, each with a time range (since..till) times for each.\n * NOTE: this is not a full \"session key\" implementation: a real session key should probably limit\n * other things, like target contracts and methods to be called.\n * also, the \"since\" value is not really useful, only for testing the entrypoint.\n */\ncontract TestExpiryAccount is SimpleAccount {\n using ECDSA for bytes32;\n\n mapping(address => uint48) public ownerAfter;\n mapping(address => uint48) public ownerUntil;\n\n // solhint-disable-next-line no-empty-blocks\n constructor(IEntryPoint anEntryPoint) SimpleAccount(anEntryPoint) {}\n\n function initialize(address anOwner) public virtual override initializer {\n super._initialize(anOwner);\n addTemporaryOwner(anOwner, 0, type(uint48).max);\n }\n\n // As this is a test contract, no need for proxy, so no need to disable init\n // solhint-disable-next-line no-empty-blocks\n function _disableInitializers() internal override {}\n\n function addTemporaryOwner(address owner, uint48 _after, uint48 _until) public onlyOwner {\n require(_until > _after, \"wrong until/after\");\n ownerAfter[owner] = _after;\n ownerUntil[owner] = _until;\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n address signer = hash.recover(userOp.signature);\n uint48 _until = ownerUntil[signer];\n uint48 _after = ownerAfter[signer];\n\n //we have \"until\" value for all valid owners. so zero means \"invalid signature\"\n bool sigFailed = _until == 0;\n return _packValidationData(sigFailed, _until, _after);\n }\n}\n"},"contracts/test/TestHelpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../core/Helpers.sol\";\n\ncontract TestHelpers {\n\n function parseValidationData(uint validationData) public pure returns (ValidationData memory) {\n return _parseValidationData(validationData);\n }\n\n function intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) public pure returns (ValidationData memory) {\n return _intersectTimeRange(validationData, paymasterValidationData);\n }\n\n function packValidationDataStruct(ValidationData memory data) public pure returns (uint256) {\n return _packValidationData(data);\n }\n\n function packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) public pure returns (uint256) {\n return _packValidationData(sigFailed, validUntil, validAfter);\n }\n}\n"},"contracts/test/TestOracle.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/IOracle.sol\";\n\ncontract TestOracle is IOracle {\n function getTokenValueOfEth(uint256 ethOutput) external pure override returns (uint256 tokenInput) {\n return ethOutput * 2;\n }\n}\n"},"contracts/test/TestPaymasterAcceptAll.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * test paymaster, that pays for everything, without any check.\n */\ncontract TestPaymasterAcceptAll is BasePaymaster {\n\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\n // to support \"deterministic address\" factory\n // solhint-disable avoid-tx-origin\n if (tx.origin != msg.sender) {\n transferOwnership(tx.origin);\n }\n\n }\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual override view\n returns (bytes memory context, uint256 validationData) {\n (userOp, userOpHash, maxCost);\n return (\"\", maxCost == 12345 ? 1 : 0);\n }\n}\n"},"contracts/test/TestRevertAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n/* solhint-disable no-inline-assembly */\n\nimport \"../samples/SimpleAccount.sol\";\ncontract TestRevertAccount is IAccount {\n IEntryPoint private ep;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n\n function validateUserOp(UserOperation calldata, bytes32, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n return 0;\n }\n\n function revertLong(uint256 length) public pure{\n assembly {\n revert(0, length)\n }\n }\n}\n"},"contracts/test/TestSignatureAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"../interfaces/IAggregator.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * test signature aggregator.\n * the aggregated signature is the SUM of the nonce fields..\n */\ncontract TestSignatureAggregator is IAggregator {\n\n /// @inheritdoc IAggregator\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external pure override {\n uint sum = 0;\n for (uint i = 0; i < userOps.length; i++) {\n uint nonce = userOps[i].nonce;\n sum += nonce;\n }\n require(signature.length == 32, \"TestSignatureValidator: sig must be uint\");\n (uint sig) = abi.decode(signature, (uint));\n require(sig == sum, \"TestSignatureValidator: aggregated signature mismatch (nonce sum)\");\n }\n\n /// @inheritdoc IAggregator\n function validateUserOpSignature(UserOperation calldata)\n external pure returns (bytes memory) {\n return \"\";\n }\n\n /**\n * dummy test aggregator: sum all nonce values of UserOps.\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\n uint sum = 0;\n for (uint i = 0; i < userOps.length; i++) {\n sum += userOps[i].nonce;\n }\n return abi.encode(sum);\n }\n\n /**\n * Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call.\n * @param entryPoint - the EntryPoint to send the stake to.\n * @param delay - the new lock duration before the deposit can be withdrawn.\n */\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\n entryPoint.addStake{value: msg.value}(delay);\n }\n}\n"},"contracts/test/TestToken.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract TestToken is ERC20 {\n uint8 public decimalsOverride = 18;\n constructor ()\n // solhint-disable-next-line no-empty-blocks\n ERC20(\"TST\", \"TestToken\") {\n }\n\n function mint(address sender, uint256 amount) external {\n _mint(sender, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return decimalsOverride;\n }\n\n function setDecimals(uint8 _decimals) public {\n decimalsOverride = _decimals;\n }\n}\n"},"contracts/test/TestTokenValueBobaDepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/BobaDepositPaymaster.sol\";\n\ncontract TestTokenValueBobaDepositPaymaster is BobaDepositPaymaster {\n\n constructor(IEntryPoint _entryPoint, IBobaStraw ethPriceOracle) BobaDepositPaymaster(_entryPoint, ethPriceOracle) {\n }\n\n function getTokenValueOfEthTest(IERC20 token, uint256 ethBought) public view returns (uint256) {\n return BobaDepositPaymaster.getTokenValueOfEth(token, ethBought);\n }\n}\n"},"contracts/test/TestTokenValueGPODepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/GPODepositPaymaster.sol\";\n\ncontract TestTokenValueGPODepositPaymaster is GPODepositPaymaster {\n\n constructor(IEntryPoint _entryPoint, address _supportedToken, uint8 _supportedTokenDecimals, address _gasPriceOracle) GPODepositPaymaster(_entryPoint, _supportedToken, _supportedTokenDecimals, _gasPriceOracle) {\n }\n\n function getTokenValueOfEthTest(uint256 ethBought) public view returns (uint256) {\n return GPODepositPaymaster.getTokenValueOfEth(ethBought);\n }\n}\n"},"contracts/test/TestTokenValueManualDepositPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/ManualDepositPaymaster.sol\";\n\ncontract TestTokenValueManualDepositPaymaster is ManualDepositPaymaster {\n\n constructor(IEntryPoint _entryPoint) ManualDepositPaymaster(_entryPoint) {\n }\n\n function getTokenValueOfEthTest(IERC20 token, uint256 ethBought) public view returns (uint256) {\n return ManualDepositPaymaster.getTokenValueOfEth(token, ethBought);\n }\n}\n"},"contracts/test/TestUtil.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/UserOperation.sol\";\n\ncontract TestUtil {\n using UserOperationLib for UserOperation;\n\n function packUserOp(UserOperation calldata op) external pure returns (bytes memory){\n return op.pack();\n }\n\n}\n"},"contracts/test/TestWarmColdAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../interfaces/IAccount.sol\";\n\n// Using eip-2929 (https://eips.ethereum.org/EIPS/eip-2929) warm/cold storage access gas costs to detect simulation vs execution\n// COLD_ACCOUNT_ACCESS_COST == 2600, COLD_SLOAD_COST == 2100, WARM_STORAGE_READ_COST == 100\ncontract TestWarmColdAccount is IAccount {\n IEntryPoint private ep;\n uint public state = 1;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n if (userOp.nonce == 1) {\n // can only succeed if storage is already warm\n this.touchStorage{gas: 1000}();\n } else if (userOp.nonce == 2) {\n address paymaster = address(bytes20(userOp.paymasterAndData[: 20]));\n // can only succeed if storage is already warm\n this.touchPaymaster{gas: 1000}(paymaster);\n }\n return 0;\n }\n\n function touchStorage() public view returns (uint256) {\n return state;\n }\n\n function touchPaymaster(address paymaster) public view returns (uint256) {\n return paymaster.code.length;\n }\n}\n"},"contracts/utils/Exec.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":10000},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"metadata":{"useLiteralContent":true}}},"output":{"errors":[{"component":"general","errorCode":"2519","formattedMessage":"Warning: This declaration shadows an existing declaration.\n --> contracts/bundler/EntryPointWrapper.sol:192:30:\n |\n192 | function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\n | ^^^^^^^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n --> contracts/bundler/EntryPointWrapper.sol:93:5:\n |\n93 | IEntryPoint public entryPoint;\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n","message":"This declaration shadows an existing declaration.","secondarySourceLocations":[{"end":3712,"file":"contracts/bundler/EntryPointWrapper.sol","message":"The shadowed declaration is here:","start":3683}],"severity":"warning","sourceLocation":{"end":8700,"file":"contracts/bundler/EntryPointWrapper.sol","start":8678},"type":"Warning"},{"component":"general","errorCode":"6321","formattedMessage":"Warning: Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n --> contracts/bundler/EntryPointWrapper.sol:105:82:\n |\n105 | function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n | ^^^^^^^^^^^^^^^^^^^^^\n\n","message":"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.","severity":"warning","sourceLocation":{"end":4357,"file":"contracts/bundler/EntryPointWrapper.sol","start":4336},"type":"Warning"},{"component":"general","errorCode":"6321","formattedMessage":"Warning: Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n --> contracts/bundler/EntryPointWrapper.sol:105:105:\n |\n105 | function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n | ^^^^^^^^^^^^^^^\n\n","message":"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.","severity":"warning","sourceLocation":{"end":4374,"file":"contracts/bundler/EntryPointWrapper.sol","start":4359},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:13:5:\n |\n13 | address base,\n | ^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":296,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":284},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:14:5:\n |\n14 | address quote\n | ^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":315,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":302},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:29:5:\n |\n29 | address base,\n | ^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":560,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":548},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:30:5:\n |\n30 | address quote,\n | ^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":579,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":566},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:31:5:\n |\n31 | uint80 _roundId\n | ^^^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":600,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":585},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:48:5:\n |\n48 | address base,\n | ^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":874,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":862},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:49:5:\n |\n49 | address quote\n | ^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":893,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":880},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:60:5:\n |\n60 | address base,\n | ^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":1046,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":1034},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:61:5:\n |\n61 | address quote\n | ^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":1065,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":1052},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:72:5:\n |\n72 | address base,\n | ^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":1198,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":1186},"type":"Warning"},{"component":"general","errorCode":"5667","formattedMessage":"Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n --> contracts/test/mocks/MockFeedRegistry.sol:73:5:\n |\n73 | address quote\n | ^^^^^^^^^^^^^\n\n","message":"Unused function parameter. Remove or comment out the variable name to silence this warning.","severity":"warning","sourceLocation":{"end":1217,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":1204},"type":"Warning"},{"component":"general","errorCode":"2018","formattedMessage":"Warning: Function state mutability can be restricted to pure\n --> contracts/test/mocks/MockFeedRegistry.sol:12:3:\n |\n12 | function latestRoundData(\n | ^ (Relevant source part starts here and spans across multiple lines).\n\n","message":"Function state mutability can be restricted to pure","severity":"warning","sourceLocation":{"end":517,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":254},"type":"Warning"},{"component":"general","errorCode":"2018","formattedMessage":"Warning: Function state mutability can be restricted to pure\n --> contracts/test/mocks/MockFeedRegistry.sol:28:3:\n |\n28 | function getRoundData(\n | ^ (Relevant source part starts here and spans across multiple lines).\n\n","message":"Function state mutability can be restricted to pure","severity":"warning","sourceLocation":{"end":802,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":521},"type":"Warning"},{"component":"general","errorCode":"2018","formattedMessage":"Warning: Function state mutability can be restricted to pure\n --> contracts/test/mocks/MockFeedRegistry.sol:59:3:\n |\n59 | function latestTimestamp(\n | ^ (Relevant source part starts here and spans across multiple lines).\n\n","message":"Function state mutability can be restricted to pure","severity":"warning","sourceLocation":{"end":1159,"file":"contracts/test/mocks/MockFeedRegistry.sol","start":1004},"type":"Warning"}],"sources":{"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol","exportedSymbols":{"Enum":[1998],"EtherPaymentFallback":[2020],"Executor":[984],"FallbackManager":[1035],"GnosisSafe":[952],"GnosisSafeMath":[2286],"Guard":[1073],"GuardManager":[1113],"ISignatureValidator":[2517],"ISignatureValidatorConstants":[2504],"ModuleManager":[1480],"OwnerManager":[1991],"SecuredTokenTransfer":[2047],"SelfAuthorized":[2073],"SignatureDecoder":[2093],"Singleton":[2099],"StorageAccessible":[2148]},"id":953,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:0"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol","file":"./base/ModuleManager.sol","id":2,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":1481,"src":"75:34:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol","file":"./base/OwnerManager.sol","id":3,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":1992,"src":"110:33:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol","file":"./base/FallbackManager.sol","id":4,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":1036,"src":"144:36:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol","file":"./base/GuardManager.sol","id":5,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":1114,"src":"181:33:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol","file":"./common/EtherPaymentFallback.sol","id":6,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2021,"src":"215:43:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol","file":"./common/Singleton.sol","id":7,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2100,"src":"259:32:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol","file":"./common/SignatureDecoder.sol","id":8,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2094,"src":"292:39:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol","file":"./common/SecuredTokenTransfer.sol","id":9,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2048,"src":"332:43:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol","file":"./common/StorageAccessible.sol","id":10,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2149,"src":"376:40:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol","file":"./interfaces/ISignatureValidator.sol","id":11,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2518,"src":"417:46:0","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol","file":"./external/GnosisSafeMath.sol","id":12,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":953,"sourceUnit":2287,"src":"464:39:0","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14,"name":"EtherPaymentFallback","nodeType":"IdentifierPath","referencedDeclaration":2020,"src":"749:20:0"},"id":15,"nodeType":"InheritanceSpecifier","src":"749:20:0"},{"baseName":{"id":16,"name":"Singleton","nodeType":"IdentifierPath","referencedDeclaration":2099,"src":"775:9:0"},"id":17,"nodeType":"InheritanceSpecifier","src":"775:9:0"},{"baseName":{"id":18,"name":"ModuleManager","nodeType":"IdentifierPath","referencedDeclaration":1480,"src":"790:13:0"},"id":19,"nodeType":"InheritanceSpecifier","src":"790:13:0"},{"baseName":{"id":20,"name":"OwnerManager","nodeType":"IdentifierPath","referencedDeclaration":1991,"src":"809:12:0"},"id":21,"nodeType":"InheritanceSpecifier","src":"809:12:0"},{"baseName":{"id":22,"name":"SignatureDecoder","nodeType":"IdentifierPath","referencedDeclaration":2093,"src":"827:16:0"},"id":23,"nodeType":"InheritanceSpecifier","src":"827:16:0"},{"baseName":{"id":24,"name":"SecuredTokenTransfer","nodeType":"IdentifierPath","referencedDeclaration":2047,"src":"849:20:0"},"id":25,"nodeType":"InheritanceSpecifier","src":"849:20:0"},{"baseName":{"id":26,"name":"ISignatureValidatorConstants","nodeType":"IdentifierPath","referencedDeclaration":2504,"src":"875:28:0"},"id":27,"nodeType":"InheritanceSpecifier","src":"875:28:0"},{"baseName":{"id":28,"name":"FallbackManager","nodeType":"IdentifierPath","referencedDeclaration":1035,"src":"909:15:0"},"id":29,"nodeType":"InheritanceSpecifier","src":"909:15:0"},{"baseName":{"id":30,"name":"StorageAccessible","nodeType":"IdentifierPath","referencedDeclaration":2148,"src":"930:17:0"},"id":31,"nodeType":"InheritanceSpecifier","src":"930:17:0"},{"baseName":{"id":32,"name":"GuardManager","nodeType":"IdentifierPath","referencedDeclaration":1113,"src":"953:12:0"},"id":33,"nodeType":"InheritanceSpecifier","src":"953:12:0"}],"canonicalName":"GnosisSafe","contractDependencies":[],"contractKind":"contract","documentation":{"id":13,"nodeType":"StructuredDocumentation","src":"505:217:0","text":"@title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\n @author Stefan George - \n @author Richard Meissner - "},"fullyImplemented":true,"id":952,"linearizedBaseContracts":[952,1113,2148,1035,2504,2047,2093,1991,1480,984,2073,2099,2020],"name":"GnosisSafe","nameLocation":"731:10:0","nodeType":"ContractDefinition","nodes":[{"global":false,"id":36,"libraryName":{"id":34,"name":"GnosisSafeMath","nodeType":"IdentifierPath","referencedDeclaration":2286,"src":"978:14:0"},"nodeType":"UsingForDirective","src":"972:33:0","typeName":{"id":35,"name":"uint256","nodeType":"ElementaryTypeName","src":"997:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},{"constant":true,"functionSelector":"ffa1ad74","id":39,"mutability":"constant","name":"VERSION","nameLocation":"1034:7:0","nodeType":"VariableDeclaration","scope":952,"src":"1011:40:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":37,"name":"string","nodeType":"ElementaryTypeName","src":"1011:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e332e30","id":38,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1044:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b84356389","typeString":"literal_string \"1.3.0\""},"value":"1.3.0"},"visibility":"public"},{"constant":true,"id":42,"mutability":"constant","name":"DOMAIN_SEPARATOR_TYPEHASH","nameLocation":"1180:25:0","nodeType":"VariableDeclaration","scope":952,"src":"1155:119:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":40,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1155:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307834376537393533346132343539353265386231363839336133333662383561336439656139666138633537336633643830336166623932613739343639323138","id":41,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1208:66:0","typeDescriptions":{"typeIdentifier":"t_rational_32523383700587834770323112271211932718128200013265661849047136999858837557784_by_1","typeString":"int_const 3252...(69 digits omitted)...7784"},"value":"0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218"},"visibility":"private"},{"constant":true,"id":45,"mutability":"constant","name":"SAFE_TX_TYPEHASH","nameLocation":"1512:16:0","nodeType":"VariableDeclaration","scope":952,"src":"1487:110:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":43,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1487:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307862623833313064343836333638646236626436663834393430326664643733616435336433313662356134623236343461643665666530663934313238366438","id":44,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1531:66:0","typeDescriptions":{"typeIdentifier":"t_rational_84814075808141314178395468817534025465894426928601295766380145544921651250904_by_1","typeString":"int_const 8481...(69 digits omitted)...0904"},"value":"0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8"},"visibility":"private"},{"anonymous":false,"eventSelector":"141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8","id":58,"name":"SafeSetup","nameLocation":"1610:9:0","nodeType":"EventDefinition","parameters":{"id":57,"nodeType":"ParameterList","parameters":[{"constant":false,"id":47,"indexed":true,"mutability":"mutable","name":"initiator","nameLocation":"1636:9:0","nodeType":"VariableDeclaration","scope":58,"src":"1620:25:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":46,"name":"address","nodeType":"ElementaryTypeName","src":"1620:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50,"indexed":false,"mutability":"mutable","name":"owners","nameLocation":"1657:6:0","nodeType":"VariableDeclaration","scope":58,"src":"1647:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":48,"name":"address","nodeType":"ElementaryTypeName","src":"1647:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":49,"nodeType":"ArrayTypeName","src":"1647:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":52,"indexed":false,"mutability":"mutable","name":"threshold","nameLocation":"1673:9:0","nodeType":"VariableDeclaration","scope":58,"src":"1665:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":51,"name":"uint256","nodeType":"ElementaryTypeName","src":"1665:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":54,"indexed":false,"mutability":"mutable","name":"initializer","nameLocation":"1692:11:0","nodeType":"VariableDeclaration","scope":58,"src":"1684:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53,"name":"address","nodeType":"ElementaryTypeName","src":"1684:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":56,"indexed":false,"mutability":"mutable","name":"fallbackHandler","nameLocation":"1713:15:0","nodeType":"VariableDeclaration","scope":58,"src":"1705:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":55,"name":"address","nodeType":"ElementaryTypeName","src":"1705:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1619:110:0"},"src":"1604:126:0"},{"anonymous":false,"eventSelector":"f2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c","id":64,"name":"ApproveHash","nameLocation":"1741:11:0","nodeType":"EventDefinition","parameters":{"id":63,"nodeType":"ParameterList","parameters":[{"constant":false,"id":60,"indexed":true,"mutability":"mutable","name":"approvedHash","nameLocation":"1769:12:0","nodeType":"VariableDeclaration","scope":64,"src":"1753:28:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":59,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1753:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":62,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"1799:5:0","nodeType":"VariableDeclaration","scope":64,"src":"1783:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":61,"name":"address","nodeType":"ElementaryTypeName","src":"1783:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1752:53:0"},"src":"1735:71:0"},{"anonymous":false,"eventSelector":"e7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4","id":68,"name":"SignMsg","nameLocation":"1817:7:0","nodeType":"EventDefinition","parameters":{"id":67,"nodeType":"ParameterList","parameters":[{"constant":false,"id":66,"indexed":true,"mutability":"mutable","name":"msgHash","nameLocation":"1841:7:0","nodeType":"VariableDeclaration","scope":68,"src":"1825:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":65,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1825:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1824:25:0"},"src":"1811:39:0"},{"anonymous":false,"eventSelector":"23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23","id":74,"name":"ExecutionFailure","nameLocation":"1861:16:0","nodeType":"EventDefinition","parameters":{"id":73,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"indexed":false,"mutability":"mutable","name":"txHash","nameLocation":"1886:6:0","nodeType":"VariableDeclaration","scope":74,"src":"1878:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":69,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1878:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":72,"indexed":false,"mutability":"mutable","name":"payment","nameLocation":"1902:7:0","nodeType":"VariableDeclaration","scope":74,"src":"1894:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":71,"name":"uint256","nodeType":"ElementaryTypeName","src":"1894:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1877:33:0"},"src":"1855:56:0"},{"anonymous":false,"eventSelector":"442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e","id":80,"name":"ExecutionSuccess","nameLocation":"1922:16:0","nodeType":"EventDefinition","parameters":{"id":79,"nodeType":"ParameterList","parameters":[{"constant":false,"id":76,"indexed":false,"mutability":"mutable","name":"txHash","nameLocation":"1947:6:0","nodeType":"VariableDeclaration","scope":80,"src":"1939:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":75,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1939:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":78,"indexed":false,"mutability":"mutable","name":"payment","nameLocation":"1963:7:0","nodeType":"VariableDeclaration","scope":80,"src":"1955:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":77,"name":"uint256","nodeType":"ElementaryTypeName","src":"1955:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1938:33:0"},"src":"1916:56:0"},{"constant":false,"functionSelector":"affed0e0","id":82,"mutability":"mutable","name":"nonce","nameLocation":"1993:5:0","nodeType":"VariableDeclaration","scope":952,"src":"1978:20:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":81,"name":"uint256","nodeType":"ElementaryTypeName","src":"1978:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"id":84,"mutability":"mutable","name":"_deprecatedDomainSeparator","nameLocation":"2020:26:0","nodeType":"VariableDeclaration","scope":952,"src":"2004:42:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":83,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2004:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"private"},{"constant":false,"functionSelector":"5ae6bd37","id":88,"mutability":"mutable","name":"signedMessages","nameLocation":"2184:14:0","nodeType":"VariableDeclaration","scope":952,"src":"2149:49:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"typeName":{"id":87,"keyType":{"id":85,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2157:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2149:27:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":86,"name":"uint256","nodeType":"ElementaryTypeName","src":"2168:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"7d832974","id":94,"mutability":"mutable","name":"approvedHashes","nameLocation":"2364:14:0","nodeType":"VariableDeclaration","scope":952,"src":"2309:69:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"typeName":{"id":93,"keyType":{"id":89,"name":"address","nodeType":"ElementaryTypeName","src":"2317:7:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2309:47:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"valueType":{"id":92,"keyType":{"id":90,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2336:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2328:27:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":91,"name":"uint256","nodeType":"ElementaryTypeName","src":"2347:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"body":{"id":101,"nodeType":"Block","src":"2504:233:0","statements":[{"expression":{"id":99,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"2717:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":98,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2729:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2717:13:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":100,"nodeType":"ExpressionStatement","src":"2717:13:0"}]},"id":102,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":95,"nodeType":"ParameterList","parameters":[],"src":"2501:2:0"},"returnParameters":{"id":96,"nodeType":"ParameterList","parameters":[],"src":"2504:0:0"},"scope":952,"src":"2490:247:0","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":166,"nodeType":"Block","src":"3625:879:0","statements":[{"expression":{"arguments":[{"id":124,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"3764:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":125,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"3773:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":123,"name":"setupOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1629,"src":"3752:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (address[] memory,uint256)"}},"id":126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3752:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":127,"nodeType":"ExpressionStatement","src":"3752:32:0"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":128,"name":"fallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":114,"src":"3798:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":131,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3825:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":130,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3817:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":129,"name":"address","nodeType":"ElementaryTypeName","src":"3817:7:0","typeDescriptions":{}}},"id":132,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3817:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3798:29:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":138,"nodeType":"IfStatement","src":"3794:78:0","trueBody":{"expression":{"arguments":[{"id":135,"name":"fallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":114,"src":"3856:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":134,"name":"internalSetFallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1008,"src":"3829:26:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":136,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3829:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":137,"nodeType":"ExpressionStatement","src":"3829:43:0"}},{"expression":{"arguments":[{"id":140,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110,"src":"4020:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":141,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":112,"src":"4024:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":139,"name":"setupModules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1196,"src":"4007:12:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4007:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":143,"nodeType":"ExpressionStatement","src":"4007:22:0"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":146,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":144,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":118,"src":"4044:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":145,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4054:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4044:11:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":156,"nodeType":"IfStatement","src":"4040:380:0","trueBody":{"id":155,"nodeType":"Block","src":"4057:363:0","statements":[{"expression":{"arguments":[{"id":148,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":118,"src":"4364:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"30","id":149,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4373:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"31","id":150,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4376:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":151,"name":"paymentToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":116,"src":"4379:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":152,"name":"paymentReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":120,"src":"4393:15:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":147,"name":"handlePayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":461,"src":"4350:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_payable_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256,address,address payable) returns (uint256)"}},"id":153,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4350:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":154,"nodeType":"ExpressionStatement","src":"4350:59:0"}]}},{"eventCall":{"arguments":[{"expression":{"id":158,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4444:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4444:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":160,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"4456:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":161,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"4465:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":162,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110,"src":"4477:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":163,"name":"fallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":114,"src":"4481:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":157,"name":"SafeSetup","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":58,"src":"4434:9:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$_t_address_$_t_address_$returns$__$","typeString":"function (address,address[] memory,uint256,address,address)"}},"id":164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4434:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":165,"nodeType":"EmitStatement","src":"4429:68:0"}]},"documentation":{"id":103,"nodeType":"StructuredDocumentation","src":"2743:605:0","text":"@dev Setup function sets initial storage of contract.\n @param _owners List of Safe owners.\n @param _threshold Number of required confirmations for a Safe transaction.\n @param to Contract address for optional delegate call.\n @param data Data payload for optional delegate call.\n @param fallbackHandler Handler for fallback calls to this contract\n @param paymentToken Token that should be used for the payment (0 is ETH)\n @param payment Value that should be paid\n @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)"},"functionSelector":"b63e800d","id":167,"implemented":true,"kind":"function","modifiers":[],"name":"setup","nameLocation":"3362:5:0","nodeType":"FunctionDefinition","parameters":{"id":121,"nodeType":"ParameterList","parameters":[{"constant":false,"id":106,"mutability":"mutable","name":"_owners","nameLocation":"3396:7:0","nodeType":"VariableDeclaration","scope":167,"src":"3377:26:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":104,"name":"address","nodeType":"ElementaryTypeName","src":"3377:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":105,"nodeType":"ArrayTypeName","src":"3377:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":108,"mutability":"mutable","name":"_threshold","nameLocation":"3421:10:0","nodeType":"VariableDeclaration","scope":167,"src":"3413:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":107,"name":"uint256","nodeType":"ElementaryTypeName","src":"3413:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":110,"mutability":"mutable","name":"to","nameLocation":"3449:2:0","nodeType":"VariableDeclaration","scope":167,"src":"3441:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109,"name":"address","nodeType":"ElementaryTypeName","src":"3441:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":112,"mutability":"mutable","name":"data","nameLocation":"3476:4:0","nodeType":"VariableDeclaration","scope":167,"src":"3461:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":111,"name":"bytes","nodeType":"ElementaryTypeName","src":"3461:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":114,"mutability":"mutable","name":"fallbackHandler","nameLocation":"3498:15:0","nodeType":"VariableDeclaration","scope":167,"src":"3490:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":113,"name":"address","nodeType":"ElementaryTypeName","src":"3490:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":116,"mutability":"mutable","name":"paymentToken","nameLocation":"3531:12:0","nodeType":"VariableDeclaration","scope":167,"src":"3523:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":115,"name":"address","nodeType":"ElementaryTypeName","src":"3523:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":118,"mutability":"mutable","name":"payment","nameLocation":"3561:7:0","nodeType":"VariableDeclaration","scope":167,"src":"3553:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":117,"name":"uint256","nodeType":"ElementaryTypeName","src":"3553:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":120,"mutability":"mutable","name":"paymentReceiver","nameLocation":"3594:15:0","nodeType":"VariableDeclaration","scope":167,"src":"3578:31:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":119,"name":"address","nodeType":"ElementaryTypeName","src":"3578:15:0","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3367:248:0"},"returnParameters":{"id":122,"nodeType":"ParameterList","parameters":[],"src":"3625:0:0"},"scope":952,"src":"3353:1151:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":375,"nodeType":"Block","src":"5891:3268:0","statements":[{"assignments":[195],"declarations":[{"constant":false,"id":195,"mutability":"mutable","name":"txHash","nameLocation":"5909:6:0","nodeType":"VariableDeclaration","scope":375,"src":"5901:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":194,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5901:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":196,"nodeType":"VariableDeclarationStatement","src":"5901:14:0"},{"id":227,"nodeType":"Block","src":"6014:692:0","statements":[{"assignments":[198],"declarations":[{"constant":false,"id":198,"mutability":"mutable","name":"txHashData","nameLocation":"6041:10:0","nodeType":"VariableDeclaration","scope":227,"src":"6028:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":197,"name":"bytes","nodeType":"ElementaryTypeName","src":"6028:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":211,"initialValue":{"arguments":[{"id":200,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"6153:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":201,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"6177:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":202,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":174,"src":"6204:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":203,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"6230:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"id":204,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"6261:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":205,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":181,"src":"6328:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":206,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"6357:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":207,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":185,"src":"6387:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":208,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":187,"src":"6417:14:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":209,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":82,"src":"6491:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":199,"name":"encodeTransactionData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":908,"src":"6070:21:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,uint256,bytes calldata,enum Enum.Operation,uint256,uint256,uint256,address,address,uint256) view returns (bytes memory)"}},"id":210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6070:444:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"6028:486:0"},{"expression":{"id":213,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6583:7:0","subExpression":{"id":212,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":82,"src":"6583:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":214,"nodeType":"ExpressionStatement","src":"6583:7:0"},{"expression":{"id":219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":215,"name":"txHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"6604:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":217,"name":"txHashData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":198,"src":"6623:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":216,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"6613:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":218,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6613:21:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"6604:30:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":220,"nodeType":"ExpressionStatement","src":"6604:30:0"},{"expression":{"arguments":[{"id":222,"name":"txHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"6664:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":223,"name":"txHashData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":198,"src":"6672:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":224,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":189,"src":"6684:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":221,"name":"checkSignatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":490,"src":"6648:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes32,bytes memory,bytes memory) view"}},"id":225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6648:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":226,"nodeType":"ExpressionStatement","src":"6648:47:0"}]},{"assignments":[229],"declarations":[{"constant":false,"id":229,"mutability":"mutable","name":"guard","nameLocation":"6723:5:0","nodeType":"VariableDeclaration","scope":375,"src":"6715:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":228,"name":"address","nodeType":"ElementaryTypeName","src":"6715:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":232,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":230,"name":"getGuard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1112,"src":"6731:8:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":231,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6731:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6715:26:0"},{"id":259,"nodeType":"Block","src":"6751:571:0","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":233,"name":"guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":229,"src":"6769:5:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6786:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":235,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6778:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":234,"name":"address","nodeType":"ElementaryTypeName","src":"6778:7:0","typeDescriptions":{}}},"id":237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6778:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6769:19:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":258,"nodeType":"IfStatement","src":"6765:547:0","trueBody":{"id":257,"nodeType":"Block","src":"6790:522:0","statements":[{"expression":{"arguments":[{"id":243,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"6899:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":244,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"6923:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":245,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":174,"src":"6950:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":246,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"6976:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"id":247,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"7007:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":248,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":181,"src":"7074:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":249,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"7103:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":250,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":185,"src":"7133:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":251,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":187,"src":"7163:14:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":252,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":189,"src":"7237:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":253,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7269:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"7269:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"id":240,"name":"guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":229,"src":"6814:5:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":239,"name":"Guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1073,"src":"6808:5:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Guard_$1073_$","typeString":"type(contract Guard)"}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6808:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Guard_$1073","typeString":"contract Guard"}},"id":242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"checkTransaction","nodeType":"MemberAccess","referencedDeclaration":1065,"src":"6808:29:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_payable_$_t_bytes_memory_ptr_$_t_address_$returns$__$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256,uint256,uint256,address,address payable,bytes memory,address) external"}},"id":255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6808:489:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":256,"nodeType":"ExpressionStatement","src":"6808:489:0"}]}}]},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":261,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"7613:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":262,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7613:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":271,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"7654:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32353030","id":272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7666:4:0","typeDescriptions":{"typeIdentifier":"t_rational_2500_by_1","typeString":"int_const 2500"},"value":"2500"},"src":"7654:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":263,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"7628:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3634","id":264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7640:2:0","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"7628:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":266,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7627:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"3633","id":267,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7646:2:0","typeDescriptions":{"typeIdentifier":"t_rational_63_by_1","typeString":"int_const 63"},"value":"63"},"src":"7627:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":269,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7626:23:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","referencedDeclaration":2285,"src":"7626:27:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":274,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7626:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"353030","id":275,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7674:3:0","typeDescriptions":{"typeIdentifier":"t_rational_500_by_1","typeString":"int_const 500"},"value":"500"},"src":"7626:51:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7613:64:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303130","id":278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7679:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_9d970fd9adbe3047cd5b7a20406b6bf2e613338cfe3a19aca4ca1810b67fad10","typeString":"literal_string \"GS010\""},"value":"GS010"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9d970fd9adbe3047cd5b7a20406b6bf2e613338cfe3a19aca4ca1810b67fad10","typeString":"literal_string \"GS010\""}],"id":260,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7605:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7605:82:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":280,"nodeType":"ExpressionStatement","src":"7605:82:0"},{"id":357,"nodeType":"Block","src":"7786:1227:0","statements":[{"assignments":[282],"declarations":[{"constant":false,"id":282,"mutability":"mutable","name":"gasUsed","nameLocation":"7808:7:0","nodeType":"VariableDeclaration","scope":357,"src":"7800:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":281,"name":"uint256","nodeType":"ElementaryTypeName","src":"7800:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":285,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":283,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"7818:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":284,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7818:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7800:27:0"},{"expression":{"id":303,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":286,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"8096:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":288,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"8114:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":289,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"8118:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":290,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":174,"src":"8125:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":291,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"8131:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":292,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"8142:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8154:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8142:13:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":300,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"8179:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"8142:46:0","trueExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":298,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":295,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"8159:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":296,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8159:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"32353030","id":297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8171:4:0","typeDescriptions":{"typeIdentifier":"t_rational_2500_by_1","typeString":"int_const 2500"},"value":"2500"},"src":"8159:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":299,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8158:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":287,"name":"execute","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":983,"src":"8106:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256) returns (bool)"}},"id":302,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8106:83:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8096:93:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":304,"nodeType":"ExpressionStatement","src":"8096:93:0"},{"expression":{"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":305,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":282,"src":"8203:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":308,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"8225:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":309,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8225:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":306,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":282,"src":"8213:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sub","nodeType":"MemberAccess","referencedDeclaration":2242,"src":"8213:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":310,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8213:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8203:32:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":312,"nodeType":"ExpressionStatement","src":"8203:32:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":314,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"8519:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":315,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"8530:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8543:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8530:14:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8519:25:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":319,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"8548:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8560:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8548:13:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8519:42:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303133","id":323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8563:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_99333b4627cde46d9c53d7148b33b8b1f4f065f5dceb2cb210893e67e551978e","typeString":"literal_string \"GS013\""},"value":"GS013"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_99333b4627cde46d9c53d7148b33b8b1f4f065f5dceb2cb210893e67e551978e","typeString":"literal_string \"GS013\""}],"id":313,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8511:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8511:60:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":325,"nodeType":"ExpressionStatement","src":"8511:60:0"},{"assignments":[327],"declarations":[{"constant":false,"id":327,"mutability":"mutable","name":"payment","nameLocation":"8728:7:0","nodeType":"VariableDeclaration","scope":357,"src":"8720:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":326,"name":"uint256","nodeType":"ElementaryTypeName","src":"8720:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":329,"initialValue":{"hexValue":"30","id":328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8738:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8720:19:0"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":330,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"8757:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8768:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8757:12:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":344,"nodeType":"IfStatement","src":"8753:128:0","trueBody":{"id":343,"nodeType":"Block","src":"8771:110:0","statements":[{"expression":{"id":341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":333,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"8789:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":335,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":282,"src":"8813:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":336,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":181,"src":"8822:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":337,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":183,"src":"8831:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":338,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":185,"src":"8841:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":339,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":187,"src":"8851:14:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":334,"name":"handlePayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":461,"src":"8799:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_payable_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256,address,address payable) returns (uint256)"}},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8799:67:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8789:77:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":342,"nodeType":"ExpressionStatement","src":"8789:77:0"}]}},{"condition":{"id":345,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"8898:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"eventCall":{"arguments":[{"id":352,"name":"txHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"8986:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":353,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"8994:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":351,"name":"ExecutionFailure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":74,"src":"8969:16:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8969:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":355,"nodeType":"EmitStatement","src":"8964:38:0"},"id":356,"nodeType":"IfStatement","src":"8894:108:0","trueBody":{"eventCall":{"arguments":[{"id":347,"name":"txHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"8929:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":348,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"8937:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":346,"name":"ExecutionSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"8912:16:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":349,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8912:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":350,"nodeType":"EmitStatement","src":"8907:38:0"}}]},{"id":374,"nodeType":"Block","src":"9022:131:0","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":363,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":358,"name":"guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":229,"src":"9040:5:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":361,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9057:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":360,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9049:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":359,"name":"address","nodeType":"ElementaryTypeName","src":"9049:7:0","typeDescriptions":{}}},"id":362,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9049:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9040:19:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":373,"nodeType":"IfStatement","src":"9036:107:0","trueBody":{"id":372,"nodeType":"Block","src":"9061:82:0","statements":[{"expression":{"arguments":[{"id":368,"name":"txHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"9112:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":369,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"9120:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[{"id":365,"name":"guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":229,"src":"9085:5:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":364,"name":"Guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1073,"src":"9079:5:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Guard_$1073_$","typeString":"type(contract Guard)"}},"id":366,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9079:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Guard_$1073","typeString":"contract Guard"}},"id":367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"checkAfterExecution","nodeType":"MemberAccess","referencedDeclaration":1072,"src":"9079:32:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes32_$_t_bool_$returns$__$","typeString":"function (bytes32,bool) external"}},"id":370,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9079:49:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":371,"nodeType":"ExpressionStatement","src":"9079:49:0"}]}}]}]},"documentation":{"id":168,"nodeType":"StructuredDocumentation","src":"4510:1016:0","text":"@dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\n Note: The fees are always transferred, even if the user transaction fails.\n @param to Destination address of Safe transaction.\n @param value Ether value of Safe transaction.\n @param data Data payload of Safe transaction.\n @param operation Operation type of Safe transaction.\n @param safeTxGas Gas that should be used for the Safe transaction.\n @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n @param gasPrice Gas price that should be used for the payment calculation.\n @param gasToken Token address (or 0 if ETH) that is used for the payment.\n @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})"},"functionSelector":"6a761202","id":376,"implemented":true,"kind":"function","modifiers":[],"name":"execTransaction","nameLocation":"5540:15:0","nodeType":"FunctionDefinition","parameters":{"id":190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":170,"mutability":"mutable","name":"to","nameLocation":"5573:2:0","nodeType":"VariableDeclaration","scope":376,"src":"5565:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":169,"name":"address","nodeType":"ElementaryTypeName","src":"5565:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":172,"mutability":"mutable","name":"value","nameLocation":"5593:5:0","nodeType":"VariableDeclaration","scope":376,"src":"5585:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":171,"name":"uint256","nodeType":"ElementaryTypeName","src":"5585:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":174,"mutability":"mutable","name":"data","nameLocation":"5623:4:0","nodeType":"VariableDeclaration","scope":376,"src":"5608:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":173,"name":"bytes","nodeType":"ElementaryTypeName","src":"5608:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":177,"mutability":"mutable","name":"operation","nameLocation":"5652:9:0","nodeType":"VariableDeclaration","scope":376,"src":"5637:24:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":176,"nodeType":"UserDefinedTypeName","pathNode":{"id":175,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"5637:14:0"},"referencedDeclaration":1997,"src":"5637:14:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"},{"constant":false,"id":179,"mutability":"mutable","name":"safeTxGas","nameLocation":"5679:9:0","nodeType":"VariableDeclaration","scope":376,"src":"5671:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":178,"name":"uint256","nodeType":"ElementaryTypeName","src":"5671:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":181,"mutability":"mutable","name":"baseGas","nameLocation":"5706:7:0","nodeType":"VariableDeclaration","scope":376,"src":"5698:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":180,"name":"uint256","nodeType":"ElementaryTypeName","src":"5698:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":183,"mutability":"mutable","name":"gasPrice","nameLocation":"5731:8:0","nodeType":"VariableDeclaration","scope":376,"src":"5723:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":182,"name":"uint256","nodeType":"ElementaryTypeName","src":"5723:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":185,"mutability":"mutable","name":"gasToken","nameLocation":"5757:8:0","nodeType":"VariableDeclaration","scope":376,"src":"5749:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":184,"name":"address","nodeType":"ElementaryTypeName","src":"5749:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":187,"mutability":"mutable","name":"refundReceiver","nameLocation":"5791:14:0","nodeType":"VariableDeclaration","scope":376,"src":"5775:30:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":186,"name":"address","nodeType":"ElementaryTypeName","src":"5775:15:0","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":189,"mutability":"mutable","name":"signatures","nameLocation":"5828:10:0","nodeType":"VariableDeclaration","scope":376,"src":"5815:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":188,"name":"bytes","nodeType":"ElementaryTypeName","src":"5815:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5555:289:0"},"returnParameters":{"id":193,"nodeType":"ParameterList","parameters":[{"constant":false,"id":192,"mutability":"mutable","name":"success","nameLocation":"5882:7:0","nodeType":"VariableDeclaration","scope":376,"src":"5877:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":191,"name":"bool","nodeType":"ElementaryTypeName","src":"5877:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5876:14:0"},"scope":952,"src":"5531:3628:0","stateMutability":"payable","virtual":true,"visibility":"public"},{"body":{"id":460,"nodeType":"Block","src":"9370:616:0","statements":[{"assignments":[392],"declarations":[{"constant":false,"id":392,"mutability":"mutable","name":"receiver","nameLocation":"9449:8:0","nodeType":"VariableDeclaration","scope":460,"src":"9433:24:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":391,"name":"address","nodeType":"ElementaryTypeName","src":"9433:15:0","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"id":406,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":393,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":386,"src":"9460:14:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":396,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9486:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":395,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9478:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":394,"name":"address","nodeType":"ElementaryTypeName","src":"9478:7:0","typeDescriptions":{}}},"id":397,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9478:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9460:28:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":404,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":386,"src":"9512:14:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9460:66:0","trueExpression":{"arguments":[{"expression":{"id":401,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"9499:2:0","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"9499:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":400,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9491:8:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":399,"name":"address","nodeType":"ElementaryTypeName","src":"9491:8:0","stateMutability":"payable","typeDescriptions":{}}},"id":403,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9491:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"VariableDeclarationStatement","src":"9433:93:0"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":407,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":384,"src":"9540:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":410,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9560:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":409,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9552:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":408,"name":"address","nodeType":"ElementaryTypeName","src":"9552:7:0","typeDescriptions":{}}},"id":411,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9552:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9540:22:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":458,"nodeType":"Block","src":"9837:143:0","statements":[{"expression":{"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":439,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":389,"src":"9851:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":445,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":382,"src":"9886:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":442,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":380,"src":"9873:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":440,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":378,"src":"9861:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"add","nodeType":"MemberAccess","referencedDeclaration":2267,"src":"9861:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9861:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":444,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mul","nodeType":"MemberAccess","referencedDeclaration":2217,"src":"9861:24:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":446,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9861:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9851:44:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":448,"nodeType":"ExpressionStatement","src":"9851:44:0"},{"expression":{"arguments":[{"arguments":[{"id":451,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":384,"src":"9931:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":452,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":392,"src":"9941:8:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":453,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":389,"src":"9951:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":450,"name":"transferToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2046,"src":"9917:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) returns (bool)"}},"id":454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9917:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303132","id":455,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9961:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_74edef16877c9a34a97f281dbea2805f9198008e7df330ab6416449a66143b07","typeString":"literal_string \"GS012\""},"value":"GS012"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_74edef16877c9a34a97f281dbea2805f9198008e7df330ab6416449a66143b07","typeString":"literal_string \"GS012\""}],"id":449,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9909:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":456,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9909:60:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":457,"nodeType":"ExpressionStatement","src":"9909:60:0"}]},"id":459,"nodeType":"IfStatement","src":"9536:444:0","trueBody":{"id":438,"nodeType":"Block","src":"9564:267:0","statements":[{"expression":{"id":428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":413,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":389,"src":"9683:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":419,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":382,"src":"9718:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":420,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"9729:2:0","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasprice","nodeType":"MemberAccess","src":"9729:11:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9718:22:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"expression":{"id":424,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"9754:2:0","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasprice","nodeType":"MemberAccess","src":"9754:11:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9718:47:0","trueExpression":{"id":423,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":382,"src":"9743:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":416,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":380,"src":"9705:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":414,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":378,"src":"9693:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"add","nodeType":"MemberAccess","referencedDeclaration":2267,"src":"9693:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9693:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mul","nodeType":"MemberAccess","referencedDeclaration":2217,"src":"9693:24:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9693:73:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9683:83:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":429,"nodeType":"ExpressionStatement","src":"9683:83:0"},{"expression":{"arguments":[{"arguments":[{"id":433,"name":"payment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":389,"src":"9802:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":431,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":392,"src":"9788:8:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"send","nodeType":"MemberAccess","src":"9788:13:0","typeDescriptions":{"typeIdentifier":"t_function_send_nonpayable$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) returns (bool)"}},"id":434,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9788:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303131","id":435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9812:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4353e9bcd8ea99b4d56990ac4b8777f1ab67cada8356790f30e482f2408a44b0","typeString":"literal_string \"GS011\""},"value":"GS011"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4353e9bcd8ea99b4d56990ac4b8777f1ab67cada8356790f30e482f2408a44b0","typeString":"literal_string \"GS011\""}],"id":430,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9780:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":436,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9780:40:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":437,"nodeType":"ExpressionStatement","src":"9780:40:0"}]}}]},"id":461,"implemented":true,"kind":"function","modifiers":[],"name":"handlePayment","nameLocation":"9174:13:0","nodeType":"FunctionDefinition","parameters":{"id":387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":378,"mutability":"mutable","name":"gasUsed","nameLocation":"9205:7:0","nodeType":"VariableDeclaration","scope":461,"src":"9197:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":377,"name":"uint256","nodeType":"ElementaryTypeName","src":"9197:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":380,"mutability":"mutable","name":"baseGas","nameLocation":"9230:7:0","nodeType":"VariableDeclaration","scope":461,"src":"9222:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":379,"name":"uint256","nodeType":"ElementaryTypeName","src":"9222:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":382,"mutability":"mutable","name":"gasPrice","nameLocation":"9255:8:0","nodeType":"VariableDeclaration","scope":461,"src":"9247:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":381,"name":"uint256","nodeType":"ElementaryTypeName","src":"9247:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":384,"mutability":"mutable","name":"gasToken","nameLocation":"9281:8:0","nodeType":"VariableDeclaration","scope":461,"src":"9273:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":383,"name":"address","nodeType":"ElementaryTypeName","src":"9273:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":386,"mutability":"mutable","name":"refundReceiver","nameLocation":"9315:14:0","nodeType":"VariableDeclaration","scope":461,"src":"9299:30:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":385,"name":"address","nodeType":"ElementaryTypeName","src":"9299:15:0","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"9187:148:0"},"returnParameters":{"id":390,"nodeType":"ParameterList","parameters":[{"constant":false,"id":389,"mutability":"mutable","name":"payment","nameLocation":"9361:7:0","nodeType":"VariableDeclaration","scope":461,"src":"9353:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":388,"name":"uint256","nodeType":"ElementaryTypeName","src":"9353:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9352:17:0"},"scope":952,"src":"9165:821:0","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":489,"nodeType":"Block","src":"10570:254:0","statements":[{"assignments":[472],"declarations":[{"constant":false,"id":472,"mutability":"mutable","name":"_threshold","nameLocation":"10646:10:0","nodeType":"VariableDeclaration","scope":489,"src":"10638:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":471,"name":"uint256","nodeType":"ElementaryTypeName","src":"10638:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":474,"initialValue":{"id":473,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"10659:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10638:30:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":476,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":472,"src":"10727:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10740:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10727:14:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303031","id":479,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10743:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_93293a4a2e4cde533ea81b8912d8934c2d7892ceb975e9ad2c25f4abf449a730","typeString":"literal_string \"GS001\""},"value":"GS001"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_93293a4a2e4cde533ea81b8912d8934c2d7892ceb975e9ad2c25f4abf449a730","typeString":"literal_string \"GS001\""}],"id":475,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10719:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10719:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":481,"nodeType":"ExpressionStatement","src":"10719:32:0"},{"expression":{"arguments":[{"id":483,"name":"dataHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"10778:8:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":484,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":466,"src":"10788:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":485,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":468,"src":"10794:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":486,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":472,"src":"10806:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":482,"name":"checkNSignatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":731,"src":"10761:16:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (bytes32,bytes memory,bytes memory,uint256) view"}},"id":487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10761:56:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":488,"nodeType":"ExpressionStatement","src":"10761:56:0"}]},"documentation":{"id":462,"nodeType":"StructuredDocumentation","src":"9992:444:0","text":" @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n @param dataHash Hash of the data (could be either a message hash or transaction hash)\n @param data That should be signed (this is passed to an external validator contract)\n @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash."},"functionSelector":"934f3a11","id":490,"implemented":true,"kind":"function","modifiers":[],"name":"checkSignatures","nameLocation":"10450:15:0","nodeType":"FunctionDefinition","parameters":{"id":469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":464,"mutability":"mutable","name":"dataHash","nameLocation":"10483:8:0","nodeType":"VariableDeclaration","scope":490,"src":"10475:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":463,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10475:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":466,"mutability":"mutable","name":"data","nameLocation":"10514:4:0","nodeType":"VariableDeclaration","scope":490,"src":"10501:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":465,"name":"bytes","nodeType":"ElementaryTypeName","src":"10501:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":468,"mutability":"mutable","name":"signatures","nameLocation":"10541:10:0","nodeType":"VariableDeclaration","scope":490,"src":"10528:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":467,"name":"bytes","nodeType":"ElementaryTypeName","src":"10528:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10465:92:0"},"returnParameters":{"id":470,"nodeType":"ParameterList","parameters":[],"src":"10570:0:0"},"scope":952,"src":"10441:383:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":730,"nodeType":"Block","src":"11515:3646:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":503,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":497,"src":"11600:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"11600:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"arguments":[{"hexValue":"3635","id":507,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11644:2:0","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"}],"expression":{"id":505,"name":"requiredSignatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"11621:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mul","nodeType":"MemberAccess","referencedDeclaration":2217,"src":"11621:22:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11621:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11600:47:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303230","id":510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11649:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f27dba96666375fe844b71e8ea4f388db2ce9f87fa9882d36a17036a7478b232","typeString":"literal_string \"GS020\""},"value":"GS020"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f27dba96666375fe844b71e8ea4f388db2ce9f87fa9882d36a17036a7478b232","typeString":"literal_string \"GS020\""}],"id":502,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11592:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":511,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11592:65:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":512,"nodeType":"ExpressionStatement","src":"11592:65:0"},{"assignments":[514],"declarations":[{"constant":false,"id":514,"mutability":"mutable","name":"lastOwner","nameLocation":"11727:9:0","nodeType":"VariableDeclaration","scope":730,"src":"11719:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":513,"name":"address","nodeType":"ElementaryTypeName","src":"11719:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":519,"initialValue":{"arguments":[{"hexValue":"30","id":517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11747:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":516,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11739:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":515,"name":"address","nodeType":"ElementaryTypeName","src":"11739:7:0","typeDescriptions":{}}},"id":518,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11739:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"11719:30:0"},{"assignments":[521],"declarations":[{"constant":false,"id":521,"mutability":"mutable","name":"currentOwner","nameLocation":"11767:12:0","nodeType":"VariableDeclaration","scope":730,"src":"11759:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":520,"name":"address","nodeType":"ElementaryTypeName","src":"11759:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":522,"nodeType":"VariableDeclarationStatement","src":"11759:20:0"},{"assignments":[524],"declarations":[{"constant":false,"id":524,"mutability":"mutable","name":"v","nameLocation":"11795:1:0","nodeType":"VariableDeclaration","scope":730,"src":"11789:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":523,"name":"uint8","nodeType":"ElementaryTypeName","src":"11789:5:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":525,"nodeType":"VariableDeclarationStatement","src":"11789:7:0"},{"assignments":[527],"declarations":[{"constant":false,"id":527,"mutability":"mutable","name":"r","nameLocation":"11814:1:0","nodeType":"VariableDeclaration","scope":730,"src":"11806:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":526,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11806:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":528,"nodeType":"VariableDeclarationStatement","src":"11806:9:0"},{"assignments":[530],"declarations":[{"constant":false,"id":530,"mutability":"mutable","name":"s","nameLocation":"11833:1:0","nodeType":"VariableDeclaration","scope":730,"src":"11825:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":529,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11825:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":531,"nodeType":"VariableDeclarationStatement","src":"11825:9:0"},{"assignments":[533],"declarations":[{"constant":false,"id":533,"mutability":"mutable","name":"i","nameLocation":"11852:1:0","nodeType":"VariableDeclaration","scope":730,"src":"11844:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":532,"name":"uint256","nodeType":"ElementaryTypeName","src":"11844:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":534,"nodeType":"VariableDeclarationStatement","src":"11844:9:0"},{"body":{"id":728,"nodeType":"Block","src":"11904:3251:0","statements":[{"expression":{"id":553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":545,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"11919:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":546,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":527,"src":"11922:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":547,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"11925:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":548,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"11918:9:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint8_$_t_bytes32_$_t_bytes32_$","typeString":"tuple(uint8,bytes32,bytes32)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":550,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":497,"src":"11945:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":551,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"11957:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":549,"name":"signatureSplit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2092,"src":"11930:14:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint8_$_t_bytes32_$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (uint8,bytes32,bytes32)"}},"id":552,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11930:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint8_$_t_bytes32_$_t_bytes32_$","typeString":"tuple(uint8,bytes32,bytes32)"}},"src":"11918:41:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":554,"nodeType":"ExpressionStatement","src":"11918:41:0"},{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":555,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"11977:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":556,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11982:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11977:6:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":637,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"13857:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":638,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13862:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"13857:6:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":672,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":670,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"14357:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3330","id":671,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14361:2:0","typeDescriptions":{"typeIdentifier":"t_rational_30_by_1","typeString":"int_const 30"},"value":"30"},"src":"14357:6:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":700,"nodeType":"Block","src":"14752:226:0","statements":[{"expression":{"id":698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":691,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14920:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":693,"name":"dataHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":493,"src":"14945:8:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":694,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"14955:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":695,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":527,"src":"14958:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":696,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"14961:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":692,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"14935:9:0","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14935:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14920:43:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":699,"nodeType":"ExpressionStatement","src":"14920:43:0"}]},"id":701,"nodeType":"IfStatement","src":"14353:625:0","trueBody":{"id":690,"nodeType":"Block","src":"14365:381:0","statements":[{"expression":{"id":688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":673,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14619:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"19457468657265756d205369676e6564204d6573736167653a0a3332","id":678,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14671:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},"value":"\u0019Ethereum Signed Message:\n32"},{"id":679,"name":"dataHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":493,"src":"14707:8:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":676,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"14654:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":677,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"14654:16:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14654:62:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":675,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"14644:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":681,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14644:73:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":682,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"14719:1:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":683,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14723:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"14719:5:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":685,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":527,"src":"14726:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":686,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"14729:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":674,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"14634:9:0","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14634:97:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14619:112:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":689,"nodeType":"ExpressionStatement","src":"14619:112:0"}]}},"id":702,"nodeType":"IfStatement","src":"13853:1125:0","trueBody":{"id":669,"nodeType":"Block","src":"13865:482:0","statements":[{"expression":{"id":651,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":640,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14035:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"id":647,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":527,"src":"14074:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":646,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14066:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":645,"name":"uint256","nodeType":"ElementaryTypeName","src":"14066:7:0","typeDescriptions":{}}},"id":648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14066:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":644,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14058:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":643,"name":"uint160","nodeType":"ElementaryTypeName","src":"14058:7:0","typeDescriptions":{}}},"id":649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14058:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":642,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14050:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":641,"name":"address","nodeType":"ElementaryTypeName","src":"14050:7:0","typeDescriptions":{}}},"id":650,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14050:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14035:43:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":652,"nodeType":"ExpressionStatement","src":"14035:43:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":654,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"14249:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"14249:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":656,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14263:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14249:26:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":664,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":658,"name":"approvedHashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":94,"src":"14279:14:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"}},"id":660,"indexExpression":{"id":659,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14294:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14279:28:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":662,"indexExpression":{"id":661,"name":"dataHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":493,"src":"14308:8:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14279:38:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":663,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14321:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14279:43:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"14249:73:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303235","id":666,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14324:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_bc2491dc7fc5c71a630e01bcb9c3e39f61f559ab54f6528d2adb67d65ed9ff6b","typeString":"literal_string \"GS025\""},"value":"GS025"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bc2491dc7fc5c71a630e01bcb9c3e39f61f559ab54f6528d2adb67d65ed9ff6b","typeString":"literal_string \"GS025\""}],"id":653,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"14241:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14241:91:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":668,"nodeType":"ExpressionStatement","src":"14241:91:0"}]}},"id":703,"nodeType":"IfStatement","src":"11973:3005:0","trueBody":{"id":636,"nodeType":"Block","src":"11985:1862:0","statements":[{"expression":{"id":569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":558,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"12163:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"id":565,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":527,"src":"12202:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12194:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":563,"name":"uint256","nodeType":"ElementaryTypeName","src":"12194:7:0","typeDescriptions":{}}},"id":566,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12194:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":562,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12186:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":561,"name":"uint160","nodeType":"ElementaryTypeName","src":"12186:7:0","typeDescriptions":{}}},"id":567,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12186:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":560,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12178:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":559,"name":"address","nodeType":"ElementaryTypeName","src":"12178:7:0","typeDescriptions":{}}},"id":568,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12178:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12163:43:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":570,"nodeType":"ExpressionStatement","src":"12163:43:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":574,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"12601:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":573,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12593:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":572,"name":"uint256","nodeType":"ElementaryTypeName","src":"12593:7:0","typeDescriptions":{}}},"id":575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12593:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"arguments":[{"hexValue":"3635","id":578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12630:2:0","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"}],"expression":{"id":576,"name":"requiredSignatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"12607:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mul","nodeType":"MemberAccess","referencedDeclaration":2217,"src":"12607:22:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12607:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12593:40:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303231","id":581,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12635:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d153a9d5a0d4e2c2b7d4e887f02c1da6287d6d54f20f4d8ce40382a23140787a","typeString":"literal_string \"GS021\""},"value":"GS021"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d153a9d5a0d4e2c2b7d4e887f02c1da6287d6d54f20f4d8ce40382a23140787a","typeString":"literal_string \"GS021\""}],"id":571,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"12585:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12585:58:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":583,"nodeType":"ExpressionStatement","src":"12585:58:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"hexValue":"3332","id":590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12798:2:0","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"}],"expression":{"arguments":[{"id":587,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"12791:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":586,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12783:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":585,"name":"uint256","nodeType":"ElementaryTypeName","src":"12783:7:0","typeDescriptions":{}}},"id":588,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12783:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"add","nodeType":"MemberAccess","referencedDeclaration":2267,"src":"12783:14:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12783:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":592,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":497,"src":"12805:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"12805:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12783:39:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303232","id":595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12824:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_372498b513e17609439d064ce0277017b054c808f722c83ff57cee4e06a9e457","typeString":"literal_string \"GS022\""},"value":"GS022"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_372498b513e17609439d064ce0277017b054c808f722c83ff57cee4e06a9e457","typeString":"literal_string \"GS022\""}],"id":584,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"12775:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12775:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":597,"nodeType":"ExpressionStatement","src":"12775:57:0"},{"assignments":[599],"declarations":[{"constant":false,"id":599,"mutability":"mutable","name":"contractSignatureLen","nameLocation":"12984:20:0","nodeType":"VariableDeclaration","scope":636,"src":"12976:28:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":598,"name":"uint256","nodeType":"ElementaryTypeName","src":"12976:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":600,"nodeType":"VariableDeclarationStatement","src":"12976:28:0"},{"AST":{"nodeType":"YulBlock","src":"13095:100:0","statements":[{"nodeType":"YulAssignment","src":"13117:60:0","value":{"arguments":[{"arguments":[{"arguments":[{"name":"signatures","nodeType":"YulIdentifier","src":"13155:10:0"},{"name":"s","nodeType":"YulIdentifier","src":"13167:1:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13151:3:0"},"nodeType":"YulFunctionCall","src":"13151:18:0"},{"kind":"number","nodeType":"YulLiteral","src":"13171:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13147:3:0"},"nodeType":"YulFunctionCall","src":"13147:29:0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13141:5:0"},"nodeType":"YulFunctionCall","src":"13141:36:0"},"variableNames":[{"name":"contractSignatureLen","nodeType":"YulIdentifier","src":"13117:20:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":599,"isOffset":false,"isSlot":false,"src":"13117:20:0","valueSize":1},{"declaration":530,"isOffset":false,"isSlot":false,"src":"13167:1:0","valueSize":1},{"declaration":497,"isOffset":false,"isSlot":false,"src":"13155:10:0","valueSize":1}],"id":601,"nodeType":"InlineAssembly","src":"13086:109:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":611,"name":"contractSignatureLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":599,"src":"13243:20:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"hexValue":"3332","id":608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13235:2:0","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"}],"expression":{"arguments":[{"id":605,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"13228:1:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":604,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13220:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":603,"name":"uint256","nodeType":"ElementaryTypeName","src":"13220:7:0","typeDescriptions":{}}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13220:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"add","nodeType":"MemberAccess","referencedDeclaration":2267,"src":"13220:14:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":609,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13220:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"add","nodeType":"MemberAccess","referencedDeclaration":2267,"src":"13220:22:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13220:44:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":613,"name":"signatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":497,"src":"13268:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"13268:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13220:65:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303233","id":616,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13287:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_00aecc0fa22d38afc0f465808a9fee188ba139fb53b2ca550ea01d91d6ecf29f","typeString":"literal_string \"GS023\""},"value":"GS023"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_00aecc0fa22d38afc0f465808a9fee188ba139fb53b2ca550ea01d91d6ecf29f","typeString":"literal_string \"GS023\""}],"id":602,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"13212:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13212:83:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":618,"nodeType":"ExpressionStatement","src":"13212:83:0"},{"assignments":[620],"declarations":[{"constant":false,"id":620,"mutability":"mutable","name":"contractSignature","nameLocation":"13362:17:0","nodeType":"VariableDeclaration","scope":636,"src":"13349:30:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":619,"name":"bytes","nodeType":"ElementaryTypeName","src":"13349:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":621,"nodeType":"VariableDeclarationStatement","src":"13349:30:0"},{"AST":{"nodeType":"YulBlock","src":"13470:229:0","statements":[{"nodeType":"YulAssignment","src":"13631:50:0","value":{"arguments":[{"arguments":[{"name":"signatures","nodeType":"YulIdentifier","src":"13660:10:0"},{"name":"s","nodeType":"YulIdentifier","src":"13672:1:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13656:3:0"},"nodeType":"YulFunctionCall","src":"13656:18:0"},{"kind":"number","nodeType":"YulLiteral","src":"13676:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13652:3:0"},"nodeType":"YulFunctionCall","src":"13652:29:0"},"variableNames":[{"name":"contractSignature","nodeType":"YulIdentifier","src":"13631:17:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":620,"isOffset":false,"isSlot":false,"src":"13631:17:0","valueSize":1},{"declaration":530,"isOffset":false,"isSlot":false,"src":"13672:1:0","valueSize":1},{"declaration":497,"isOffset":false,"isSlot":false,"src":"13660:10:0","valueSize":1}],"id":622,"nodeType":"InlineAssembly","src":"13461:238:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":632,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":628,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":495,"src":"13775:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":629,"name":"contractSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":620,"src":"13781:17:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":625,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"13744:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":624,"name":"ISignatureValidator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2517,"src":"13724:19:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISignatureValidator_$2517_$","typeString":"type(contract ISignatureValidator)"}},"id":626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13724:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISignatureValidator_$2517","typeString":"contract ISignatureValidator"}},"id":627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isValidSignature","nodeType":"MemberAccess","referencedDeclaration":2516,"src":"13724:50:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (bytes memory,bytes memory) view external returns (bytes4)"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13724:75:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":631,"name":"EIP1271_MAGIC_VALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2503,"src":"13803:19:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"13724:98:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303234","id":633,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13824:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_1d9dfad0f7e80ccb3a898324566cbd9ed8451678d229622c4c1b5f1f19330139","typeString":"literal_string \"GS024\""},"value":"GS024"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1d9dfad0f7e80ccb3a898324566cbd9ed8451678d229622c4c1b5f1f19330139","typeString":"literal_string \"GS024\""}],"id":623,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"13716:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":634,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13716:116:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":635,"nodeType":"ExpressionStatement","src":"13716:116:0"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":720,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":716,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":707,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":705,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"14999:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":706,"name":"lastOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":514,"src":"15014:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14999:24:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":708,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"15027:6:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":710,"indexExpression":{"id":709,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"15034:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15027:20:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":713,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15059:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":712,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15051:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":711,"name":"address","nodeType":"ElementaryTypeName","src":"15051:7:0","typeDescriptions":{}}},"id":714,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15051:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15027:34:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"14999:62:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":719,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":717,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"15065:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":718,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"15081:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15065:31:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"14999:97:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303236","id":721,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"15098:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_14032cc06a7a2043c1b961d6b7d6cbfaea1511224ce5ca723af49fa68e55c159","typeString":"literal_string \"GS026\""},"value":"GS026"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_14032cc06a7a2043c1b961d6b7d6cbfaea1511224ce5ca723af49fa68e55c159","typeString":"literal_string \"GS026\""}],"id":704,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"14991:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":722,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14991:115:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":723,"nodeType":"ExpressionStatement","src":"14991:115:0"},{"expression":{"id":726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":724,"name":"lastOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":514,"src":"15120:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":725,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"15132:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15120:24:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":727,"nodeType":"ExpressionStatement","src":"15120:24:0"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":539,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"11875:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":540,"name":"requiredSignatures","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"11879:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11875:22:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":729,"initializationExpression":{"expression":{"id":537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":535,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"11868:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11872:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11868:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":538,"nodeType":"ExpressionStatement","src":"11868:5:0"},"loopExpression":{"expression":{"id":543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"11899:3:0","subExpression":{"id":542,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"11899:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":544,"nodeType":"ExpressionStatement","src":"11899:3:0"},"nodeType":"ForStatement","src":"11863:3292:0"}]},"documentation":{"id":491,"nodeType":"StructuredDocumentation","src":"10830:514:0","text":" @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n @param dataHash Hash of the data (could be either a message hash or transaction hash)\n @param data That should be signed (this is passed to an external validator contract)\n @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n @param requiredSignatures Amount of required valid signatures."},"functionSelector":"12fb68e0","id":731,"implemented":true,"kind":"function","modifiers":[],"name":"checkNSignatures","nameLocation":"11358:16:0","nodeType":"FunctionDefinition","parameters":{"id":500,"nodeType":"ParameterList","parameters":[{"constant":false,"id":493,"mutability":"mutable","name":"dataHash","nameLocation":"11392:8:0","nodeType":"VariableDeclaration","scope":731,"src":"11384:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":492,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11384:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":495,"mutability":"mutable","name":"data","nameLocation":"11423:4:0","nodeType":"VariableDeclaration","scope":731,"src":"11410:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":494,"name":"bytes","nodeType":"ElementaryTypeName","src":"11410:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":497,"mutability":"mutable","name":"signatures","nameLocation":"11450:10:0","nodeType":"VariableDeclaration","scope":731,"src":"11437:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":496,"name":"bytes","nodeType":"ElementaryTypeName","src":"11437:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":499,"mutability":"mutable","name":"requiredSignatures","nameLocation":"11478:18:0","nodeType":"VariableDeclaration","scope":731,"src":"11470:26:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":498,"name":"uint256","nodeType":"ElementaryTypeName","src":"11470:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11374:128:0"},"returnParameters":{"id":501,"nodeType":"ParameterList","parameters":[],"src":"11515:0:0"},"scope":952,"src":"11349:3812:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":779,"nodeType":"Block","src":"16132:371:0","statements":[{"assignments":[747],"declarations":[{"constant":false,"id":747,"mutability":"mutable","name":"startGas","nameLocation":"16150:8:0","nodeType":"VariableDeclaration","scope":779,"src":"16142:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":746,"name":"uint256","nodeType":"ElementaryTypeName","src":"16142:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":750,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":748,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"16161:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16161:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"16142:28:0"},{"expression":{"arguments":[{"arguments":[{"id":753,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":734,"src":"16283:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":754,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":736,"src":"16287:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":755,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":738,"src":"16294:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":756,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":741,"src":"16300:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"arguments":[],"expression":{"argumentTypes":[],"id":757,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"16311:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":758,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16311:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":752,"name":"execute","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":983,"src":"16275:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256) returns (bool)"}},"id":759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16275:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":751,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"16267:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":760,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16267:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":761,"nodeType":"ExpressionStatement","src":"16267:55:0"},{"assignments":[763],"declarations":[{"constant":false,"id":763,"mutability":"mutable","name":"requiredGas","nameLocation":"16340:11:0","nodeType":"VariableDeclaration","scope":779,"src":"16332:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":762,"name":"uint256","nodeType":"ElementaryTypeName","src":"16332:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":768,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":764,"name":"startGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":747,"src":"16354:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":765,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"16365:7:0","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":766,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16365:9:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16354:20:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"16332:42:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":774,"name":"requiredGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":763,"src":"16482:11:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":772,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"16465:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":773,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"16465:16:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16465:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":771,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16458:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":770,"name":"string","nodeType":"ElementaryTypeName","src":"16458:6:0","typeDescriptions":{}}},"id":776,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16458:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":769,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16451:6:0","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16451:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":778,"nodeType":"ExpressionStatement","src":"16451:45:0"}]},"documentation":{"id":732,"nodeType":"StructuredDocumentation","src":"15167:798:0","text":"@dev Allows to estimate a Safe transaction.\n This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\n Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\n @param to Destination address of Safe transaction.\n @param value Ether value of Safe transaction.\n @param data Data payload of Safe transaction.\n @param operation Operation type of Safe transaction.\n @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\n @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version."},"functionSelector":"c4ca3a9c","id":780,"implemented":true,"kind":"function","modifiers":[],"name":"requiredTxGas","nameLocation":"15979:13:0","nodeType":"FunctionDefinition","parameters":{"id":742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":734,"mutability":"mutable","name":"to","nameLocation":"16010:2:0","nodeType":"VariableDeclaration","scope":780,"src":"16002:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":733,"name":"address","nodeType":"ElementaryTypeName","src":"16002:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":736,"mutability":"mutable","name":"value","nameLocation":"16030:5:0","nodeType":"VariableDeclaration","scope":780,"src":"16022:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":735,"name":"uint256","nodeType":"ElementaryTypeName","src":"16022:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":738,"mutability":"mutable","name":"data","nameLocation":"16060:4:0","nodeType":"VariableDeclaration","scope":780,"src":"16045:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":737,"name":"bytes","nodeType":"ElementaryTypeName","src":"16045:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":741,"mutability":"mutable","name":"operation","nameLocation":"16089:9:0","nodeType":"VariableDeclaration","scope":780,"src":"16074:24:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":740,"nodeType":"UserDefinedTypeName","pathNode":{"id":739,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"16074:14:0"},"referencedDeclaration":1997,"src":"16074:14:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"}],"src":"15992:112:0"},"returnParameters":{"id":745,"nodeType":"ParameterList","parameters":[{"constant":false,"id":744,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":780,"src":"16123:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":743,"name":"uint256","nodeType":"ElementaryTypeName","src":"16123:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16122:9:0"},"scope":952,"src":"15970:533:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":814,"nodeType":"Block","src":"16803:175:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":795,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":787,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"16821:6:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":790,"indexExpression":{"expression":{"id":788,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"16828:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":789,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"16828:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16821:18:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":793,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16851:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":792,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16843:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":791,"name":"address","nodeType":"ElementaryTypeName","src":"16843:7:0","typeDescriptions":{}}},"id":794,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16843:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16821:32:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303330","id":796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16855:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_26b7fa7d947085035b53de5c25693e568c405e1e894ad22389a1528045f35ba8","typeString":"literal_string \"GS030\""},"value":"GS030"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_26b7fa7d947085035b53de5c25693e568c405e1e894ad22389a1528045f35ba8","typeString":"literal_string \"GS030\""}],"id":786,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"16813:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":797,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16813:50:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":798,"nodeType":"ExpressionStatement","src":"16813:50:0"},{"expression":{"id":806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":799,"name":"approvedHashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":94,"src":"16873:14:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"}},"id":803,"indexExpression":{"expression":{"id":800,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"16888:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"16888:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16873:26:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":804,"indexExpression":{"id":802,"name":"hashToApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":783,"src":"16900:13:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"16873:41:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":805,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16917:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"16873:45:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":807,"nodeType":"ExpressionStatement","src":"16873:45:0"},{"eventCall":{"arguments":[{"id":809,"name":"hashToApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":783,"src":"16945:13:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":810,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"16960:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"16960:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":808,"name":"ApproveHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64,"src":"16933:11:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$returns$__$","typeString":"function (bytes32,address)"}},"id":812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16933:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":813,"nodeType":"EmitStatement","src":"16928:43:0"}]},"documentation":{"id":781,"nodeType":"StructuredDocumentation","src":"16509:236:0","text":" @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\n @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract."},"functionSelector":"d4d9bdcd","id":815,"implemented":true,"kind":"function","modifiers":[],"name":"approveHash","nameLocation":"16759:11:0","nodeType":"FunctionDefinition","parameters":{"id":784,"nodeType":"ParameterList","parameters":[{"constant":false,"id":783,"mutability":"mutable","name":"hashToApprove","nameLocation":"16779:13:0","nodeType":"VariableDeclaration","scope":815,"src":"16771:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":782,"name":"bytes32","nodeType":"ElementaryTypeName","src":"16771:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"16770:23:0"},"returnParameters":{"id":785,"nodeType":"ParameterList","parameters":[],"src":"16803:0:0"},"scope":952,"src":"16750:228:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":827,"nodeType":"Block","src":"17093:159:0","statements":[{"assignments":[822],"declarations":[{"constant":false,"id":822,"mutability":"mutable","name":"id","nameLocation":"17111:2:0","nodeType":"VariableDeclaration","scope":827,"src":"17103:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":821,"name":"uint256","nodeType":"ElementaryTypeName","src":"17103:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":823,"nodeType":"VariableDeclarationStatement","src":"17103:10:0"},{"AST":{"nodeType":"YulBlock","src":"17188:39:0","statements":[{"nodeType":"YulAssignment","src":"17202:15:0","value":{"arguments":[],"functionName":{"name":"chainid","nodeType":"YulIdentifier","src":"17208:7:0"},"nodeType":"YulFunctionCall","src":"17208:9:0"},"variableNames":[{"name":"id","nodeType":"YulIdentifier","src":"17202:2:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":822,"isOffset":false,"isSlot":false,"src":"17202:2:0","valueSize":1}],"id":824,"nodeType":"InlineAssembly","src":"17179:48:0"},{"expression":{"id":825,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":822,"src":"17243:2:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":820,"id":826,"nodeType":"Return","src":"17236:9:0"}]},"documentation":{"id":816,"nodeType":"StructuredDocumentation","src":"16984:52:0","text":"@dev Returns the chain id used by this contract."},"functionSelector":"3408e470","id":828,"implemented":true,"kind":"function","modifiers":[],"name":"getChainId","nameLocation":"17050:10:0","nodeType":"FunctionDefinition","parameters":{"id":817,"nodeType":"ParameterList","parameters":[],"src":"17060:2:0"},"returnParameters":{"id":820,"nodeType":"ParameterList","parameters":[{"constant":false,"id":819,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":828,"src":"17084:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":818,"name":"uint256","nodeType":"ElementaryTypeName","src":"17084:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17083:9:0"},"scope":952,"src":"17041:211:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":843,"nodeType":"Block","src":"17315:92:0","statements":[{"expression":{"arguments":[{"arguments":[{"id":836,"name":"DOMAIN_SEPARATOR_TYPEHASH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"17353:25:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":837,"name":"getChainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":828,"src":"17380:10:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17380:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":839,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"17394:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}],"expression":{"id":834,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"17342:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":835,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"17342:10:0","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":840,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17342:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":833,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"17332:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17332:68:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":832,"id":842,"nodeType":"Return","src":"17325:75:0"}]},"functionSelector":"f698da25","id":844,"implemented":true,"kind":"function","modifiers":[],"name":"domainSeparator","nameLocation":"17267:15:0","nodeType":"FunctionDefinition","parameters":{"id":829,"nodeType":"ParameterList","parameters":[],"src":"17282:2:0"},"returnParameters":{"id":832,"nodeType":"ParameterList","parameters":[{"constant":false,"id":831,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":844,"src":"17306:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":830,"name":"bytes32","nodeType":"ElementaryTypeName","src":"17306:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"17305:9:0"},"scope":952,"src":"17258:149:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":907,"nodeType":"Block","src":"18532:552:0","statements":[{"assignments":[872],"declarations":[{"constant":false,"id":872,"mutability":"mutable","name":"safeTxHash","nameLocation":"18550:10:0","nodeType":"VariableDeclaration","scope":907,"src":"18542:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":871,"name":"bytes32","nodeType":"ElementaryTypeName","src":"18542:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":891,"initialValue":{"arguments":[{"arguments":[{"id":876,"name":"SAFE_TX_TYPEHASH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45,"src":"18634:16:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":877,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":847,"src":"18672:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":878,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":849,"src":"18696:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":880,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":851,"src":"18733:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":879,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"18723:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18723:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":882,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":854,"src":"18760:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"id":883,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":856,"src":"18791:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":884,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":858,"src":"18822:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":885,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":860,"src":"18851:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":886,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":862,"src":"18881:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":887,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":864,"src":"18911:14:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":888,"name":"_nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":866,"src":"18947:6:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":874,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"18602:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":875,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"18602:10:0","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":889,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18602:369:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":873,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"18575:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":890,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18575:410:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"18542:443:0"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30783139","id":896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19026:4:0","typeDescriptions":{"typeIdentifier":"t_rational_25_by_1","typeString":"int_const 25"},"value":"0x19"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_25_by_1","typeString":"int_const 25"}],"id":895,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19019:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":894,"name":"bytes1","nodeType":"ElementaryTypeName","src":"19019:6:0","typeDescriptions":{}}},"id":897,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19019:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},{"arguments":[{"hexValue":"30783031","id":900,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19040:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"0x01"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":899,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19033:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":898,"name":"bytes1","nodeType":"ElementaryTypeName","src":"19033:6:0","typeDescriptions":{}}},"id":901,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19033:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},{"arguments":[],"expression":{"argumentTypes":[],"id":902,"name":"domainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":844,"src":"19047:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":903,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19047:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":904,"name":"safeTxHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":872,"src":"19066:10:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"},{"typeIdentifier":"t_bytes1","typeString":"bytes1"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":892,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"19002:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":893,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"19002:16:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":905,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19002:75:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":870,"id":906,"nodeType":"Return","src":"18995:82:0"}]},"documentation":{"id":845,"nodeType":"StructuredDocumentation","src":"17413:776:0","text":"@dev Returns the bytes that are hashed to be signed by owners.\n @param to Destination address.\n @param value Ether value.\n @param data Data payload.\n @param operation Operation type.\n @param safeTxGas Gas that should be used for the safe transaction.\n @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n @param gasPrice Maximum gas price that should be used for this transaction.\n @param gasToken Token address (or 0 if ETH) that is used for the payment.\n @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n @param _nonce Transaction nonce.\n @return Transaction hash bytes."},"functionSelector":"e86637db","id":908,"implemented":true,"kind":"function","modifiers":[],"name":"encodeTransactionData","nameLocation":"18203:21:0","nodeType":"FunctionDefinition","parameters":{"id":867,"nodeType":"ParameterList","parameters":[{"constant":false,"id":847,"mutability":"mutable","name":"to","nameLocation":"18242:2:0","nodeType":"VariableDeclaration","scope":908,"src":"18234:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":846,"name":"address","nodeType":"ElementaryTypeName","src":"18234:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":849,"mutability":"mutable","name":"value","nameLocation":"18262:5:0","nodeType":"VariableDeclaration","scope":908,"src":"18254:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":848,"name":"uint256","nodeType":"ElementaryTypeName","src":"18254:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":851,"mutability":"mutable","name":"data","nameLocation":"18292:4:0","nodeType":"VariableDeclaration","scope":908,"src":"18277:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":850,"name":"bytes","nodeType":"ElementaryTypeName","src":"18277:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":854,"mutability":"mutable","name":"operation","nameLocation":"18321:9:0","nodeType":"VariableDeclaration","scope":908,"src":"18306:24:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":853,"nodeType":"UserDefinedTypeName","pathNode":{"id":852,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"18306:14:0"},"referencedDeclaration":1997,"src":"18306:14:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"},{"constant":false,"id":856,"mutability":"mutable","name":"safeTxGas","nameLocation":"18348:9:0","nodeType":"VariableDeclaration","scope":908,"src":"18340:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":855,"name":"uint256","nodeType":"ElementaryTypeName","src":"18340:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":858,"mutability":"mutable","name":"baseGas","nameLocation":"18375:7:0","nodeType":"VariableDeclaration","scope":908,"src":"18367:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":857,"name":"uint256","nodeType":"ElementaryTypeName","src":"18367:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":860,"mutability":"mutable","name":"gasPrice","nameLocation":"18400:8:0","nodeType":"VariableDeclaration","scope":908,"src":"18392:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":859,"name":"uint256","nodeType":"ElementaryTypeName","src":"18392:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":862,"mutability":"mutable","name":"gasToken","nameLocation":"18426:8:0","nodeType":"VariableDeclaration","scope":908,"src":"18418:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":861,"name":"address","nodeType":"ElementaryTypeName","src":"18418:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":864,"mutability":"mutable","name":"refundReceiver","nameLocation":"18452:14:0","nodeType":"VariableDeclaration","scope":908,"src":"18444:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":863,"name":"address","nodeType":"ElementaryTypeName","src":"18444:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":866,"mutability":"mutable","name":"_nonce","nameLocation":"18484:6:0","nodeType":"VariableDeclaration","scope":908,"src":"18476:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":865,"name":"uint256","nodeType":"ElementaryTypeName","src":"18476:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18224:272:0"},"returnParameters":{"id":870,"nodeType":"ParameterList","parameters":[{"constant":false,"id":869,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":908,"src":"18518:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":868,"name":"bytes","nodeType":"ElementaryTypeName","src":"18518:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"18517:14:0"},"scope":952,"src":"18194:890:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":950,"nodeType":"Block","src":"20100:148:0","statements":[{"expression":{"arguments":[{"arguments":[{"id":937,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":911,"src":"20149:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":938,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":913,"src":"20153:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":939,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":915,"src":"20160:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":940,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":918,"src":"20166:9:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"id":941,"name":"safeTxGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":920,"src":"20177:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":942,"name":"baseGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":922,"src":"20188:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":943,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":924,"src":"20197:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":944,"name":"gasToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":926,"src":"20207:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":945,"name":"refundReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":928,"src":"20217:14:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":946,"name":"_nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":930,"src":"20233:6:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":936,"name":"encodeTransactionData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":908,"src":"20127:21:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,uint256,bytes calldata,enum Enum.Operation,uint256,uint256,uint256,address,address,uint256) view returns (bytes memory)"}},"id":947,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20127:113:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":935,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"20117:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":948,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20117:124:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":934,"id":949,"nodeType":"Return","src":"20110:131:0"}]},"documentation":{"id":909,"nodeType":"StructuredDocumentation","src":"19090:675:0","text":"@dev Returns hash to be signed by owners.\n @param to Destination address.\n @param value Ether value.\n @param data Data payload.\n @param operation Operation type.\n @param safeTxGas Fas that should be used for the safe transaction.\n @param baseGas Gas costs for data used to trigger the safe transaction.\n @param gasPrice Maximum gas price that should be used for this transaction.\n @param gasToken Token address (or 0 if ETH) that is used for the payment.\n @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n @param _nonce Transaction nonce.\n @return Transaction hash."},"functionSelector":"d8d11f78","id":951,"implemented":true,"kind":"function","modifiers":[],"name":"getTransactionHash","nameLocation":"19779:18:0","nodeType":"FunctionDefinition","parameters":{"id":931,"nodeType":"ParameterList","parameters":[{"constant":false,"id":911,"mutability":"mutable","name":"to","nameLocation":"19815:2:0","nodeType":"VariableDeclaration","scope":951,"src":"19807:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":910,"name":"address","nodeType":"ElementaryTypeName","src":"19807:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":913,"mutability":"mutable","name":"value","nameLocation":"19835:5:0","nodeType":"VariableDeclaration","scope":951,"src":"19827:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":912,"name":"uint256","nodeType":"ElementaryTypeName","src":"19827:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":915,"mutability":"mutable","name":"data","nameLocation":"19865:4:0","nodeType":"VariableDeclaration","scope":951,"src":"19850:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":914,"name":"bytes","nodeType":"ElementaryTypeName","src":"19850:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":918,"mutability":"mutable","name":"operation","nameLocation":"19894:9:0","nodeType":"VariableDeclaration","scope":951,"src":"19879:24:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":917,"nodeType":"UserDefinedTypeName","pathNode":{"id":916,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"19879:14:0"},"referencedDeclaration":1997,"src":"19879:14:0","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"},{"constant":false,"id":920,"mutability":"mutable","name":"safeTxGas","nameLocation":"19921:9:0","nodeType":"VariableDeclaration","scope":951,"src":"19913:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":919,"name":"uint256","nodeType":"ElementaryTypeName","src":"19913:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":922,"mutability":"mutable","name":"baseGas","nameLocation":"19948:7:0","nodeType":"VariableDeclaration","scope":951,"src":"19940:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":921,"name":"uint256","nodeType":"ElementaryTypeName","src":"19940:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":924,"mutability":"mutable","name":"gasPrice","nameLocation":"19973:8:0","nodeType":"VariableDeclaration","scope":951,"src":"19965:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":923,"name":"uint256","nodeType":"ElementaryTypeName","src":"19965:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":926,"mutability":"mutable","name":"gasToken","nameLocation":"19999:8:0","nodeType":"VariableDeclaration","scope":951,"src":"19991:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":925,"name":"address","nodeType":"ElementaryTypeName","src":"19991:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":928,"mutability":"mutable","name":"refundReceiver","nameLocation":"20025:14:0","nodeType":"VariableDeclaration","scope":951,"src":"20017:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":927,"name":"address","nodeType":"ElementaryTypeName","src":"20017:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":930,"mutability":"mutable","name":"_nonce","nameLocation":"20057:6:0","nodeType":"VariableDeclaration","scope":951,"src":"20049:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":929,"name":"uint256","nodeType":"ElementaryTypeName","src":"20049:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19797:272:0"},"returnParameters":{"id":934,"nodeType":"ParameterList","parameters":[{"constant":false,"id":933,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":951,"src":"20091:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":932,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20091:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"20090:9:0"},"scope":952,"src":"19770:478:0","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":953,"src":"722:19528:0","usedErrors":[]}],"src":"42:20209:0"},"id":0},"@gnosis.pm/safe-contracts/contracts/base/Executor.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/Executor.sol","exportedSymbols":{"Enum":[1998],"Executor":[984]},"id":985,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":954,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:1"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Enum.sol","file":"../common/Enum.sol","id":955,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":985,"sourceUnit":1999,"src":"74:28:1","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Executor","contractDependencies":[],"contractKind":"contract","documentation":{"id":956,"nodeType":"StructuredDocumentation","src":"104:114:1","text":"@title Executor - A contract that can execute transactions\n @author Richard Meissner - "},"fullyImplemented":true,"id":984,"linearizedBaseContracts":[984],"name":"Executor","nameLocation":"227:8:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":982,"nodeType":"Block","src":"424:457:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"id":976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":972,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":965,"src":"438:9:1","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"expression":{"id":973,"name":"Enum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1998,"src":"451:4:1","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Enum_$1998_$","typeString":"type(contract Enum)"}},"id":974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"Operation","nodeType":"MemberAccess","referencedDeclaration":1997,"src":"451:14:1","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Operation_$1997_$","typeString":"type(enum Enum.Operation)"}},"id":975,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"DelegateCall","nodeType":"MemberAccess","referencedDeclaration":1996,"src":"451:27:1","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"src":"438:40:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":980,"nodeType":"Block","src":"681:194:1","statements":[{"AST":{"nodeType":"YulBlock","src":"764:101:1","statements":[{"nodeType":"YulAssignment","src":"782:69:1","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"798:5:1"},{"name":"to","nodeType":"YulIdentifier","src":"805:2:1"},{"name":"value","nodeType":"YulIdentifier","src":"809:5:1"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"820:4:1"},{"kind":"number","nodeType":"YulLiteral","src":"826:4:1","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"816:3:1"},"nodeType":"YulFunctionCall","src":"816:15:1"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"839:4:1"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"833:5:1"},"nodeType":"YulFunctionCall","src":"833:11:1"},{"kind":"number","nodeType":"YulLiteral","src":"846:1:1","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"849:1:1","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"793:4:1"},"nodeType":"YulFunctionCall","src":"793:58:1"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"782:7:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":962,"isOffset":false,"isSlot":false,"src":"820:4:1","valueSize":1},{"declaration":962,"isOffset":false,"isSlot":false,"src":"839:4:1","valueSize":1},{"declaration":970,"isOffset":false,"isSlot":false,"src":"782:7:1","valueSize":1},{"declaration":958,"isOffset":false,"isSlot":false,"src":"805:2:1","valueSize":1},{"declaration":967,"isOffset":false,"isSlot":false,"src":"798:5:1","valueSize":1},{"declaration":960,"isOffset":false,"isSlot":false,"src":"809:5:1","valueSize":1}],"id":979,"nodeType":"InlineAssembly","src":"755:110:1"}]},"id":981,"nodeType":"IfStatement","src":"434:441:1","trueBody":{"id":978,"nodeType":"Block","src":"480:195:1","statements":[{"AST":{"nodeType":"YulBlock","src":"563:102:1","statements":[{"nodeType":"YulAssignment","src":"581:70:1","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"605:5:1"},{"name":"to","nodeType":"YulIdentifier","src":"612:2:1"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"620:4:1"},{"kind":"number","nodeType":"YulLiteral","src":"626:4:1","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"616:3:1"},"nodeType":"YulFunctionCall","src":"616:15:1"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"639:4:1"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"633:5:1"},"nodeType":"YulFunctionCall","src":"633:11:1"},{"kind":"number","nodeType":"YulLiteral","src":"646:1:1","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"649:1:1","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"592:12:1"},"nodeType":"YulFunctionCall","src":"592:59:1"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"581:7:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":962,"isOffset":false,"isSlot":false,"src":"620:4:1","valueSize":1},{"declaration":962,"isOffset":false,"isSlot":false,"src":"639:4:1","valueSize":1},{"declaration":970,"isOffset":false,"isSlot":false,"src":"581:7:1","valueSize":1},{"declaration":958,"isOffset":false,"isSlot":false,"src":"612:2:1","valueSize":1},{"declaration":967,"isOffset":false,"isSlot":false,"src":"605:5:1","valueSize":1}],"id":977,"nodeType":"InlineAssembly","src":"554:111:1"}]}}]},"id":983,"implemented":true,"kind":"function","modifiers":[],"name":"execute","nameLocation":"251:7:1","nodeType":"FunctionDefinition","parameters":{"id":968,"nodeType":"ParameterList","parameters":[{"constant":false,"id":958,"mutability":"mutable","name":"to","nameLocation":"276:2:1","nodeType":"VariableDeclaration","scope":983,"src":"268:10:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":957,"name":"address","nodeType":"ElementaryTypeName","src":"268:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":960,"mutability":"mutable","name":"value","nameLocation":"296:5:1","nodeType":"VariableDeclaration","scope":983,"src":"288:13:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":959,"name":"uint256","nodeType":"ElementaryTypeName","src":"288:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":962,"mutability":"mutable","name":"data","nameLocation":"324:4:1","nodeType":"VariableDeclaration","scope":983,"src":"311:17:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":961,"name":"bytes","nodeType":"ElementaryTypeName","src":"311:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":965,"mutability":"mutable","name":"operation","nameLocation":"353:9:1","nodeType":"VariableDeclaration","scope":983,"src":"338:24:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":964,"nodeType":"UserDefinedTypeName","pathNode":{"id":963,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"338:14:1"},"referencedDeclaration":1997,"src":"338:14:1","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"},{"constant":false,"id":967,"mutability":"mutable","name":"txGas","nameLocation":"380:5:1","nodeType":"VariableDeclaration","scope":983,"src":"372:13:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":966,"name":"uint256","nodeType":"ElementaryTypeName","src":"372:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"258:133:1"},"returnParameters":{"id":971,"nodeType":"ParameterList","parameters":[{"constant":false,"id":970,"mutability":"mutable","name":"success","nameLocation":"415:7:1","nodeType":"VariableDeclaration","scope":983,"src":"410:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":969,"name":"bool","nodeType":"ElementaryTypeName","src":"410:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"409:14:1"},"scope":984,"src":"242:639:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":985,"src":"218:665:1","usedErrors":[]}],"src":"42:842:1"},"id":1},"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol","exportedSymbols":{"FallbackManager":[1035],"SelfAuthorized":[2073]},"id":1036,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":986,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:2"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol","file":"../common/SelfAuthorized.sol","id":987,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1036,"sourceUnit":2074,"src":"75:38:2","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":989,"name":"SelfAuthorized","nodeType":"IdentifierPath","referencedDeclaration":2073,"src":"285:14:2"},"id":990,"nodeType":"InheritanceSpecifier","src":"285:14:2"}],"canonicalName":"FallbackManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":988,"nodeType":"StructuredDocumentation","src":"115:142:2","text":"@title Fallback Manager - A contract that manages fallback calls made to this contract\n @author Richard Meissner - "},"fullyImplemented":true,"id":1035,"linearizedBaseContracts":[1035,2073],"name":"FallbackManager","nameLocation":"266:15:2","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0","id":994,"name":"ChangedFallbackHandler","nameLocation":"312:22:2","nodeType":"EventDefinition","parameters":{"id":993,"nodeType":"ParameterList","parameters":[{"constant":false,"id":992,"indexed":false,"mutability":"mutable","name":"handler","nameLocation":"343:7:2","nodeType":"VariableDeclaration","scope":994,"src":"335:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":991,"name":"address","nodeType":"ElementaryTypeName","src":"335:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"334:17:2"},"src":"306:46:2"},{"constant":true,"id":997,"mutability":"constant","name":"FALLBACK_HANDLER_STORAGE_SLOT","nameLocation":"437:29:2","nodeType":"VariableDeclaration","scope":1035,"src":"411:124:2","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":995,"name":"bytes32","nodeType":"ElementaryTypeName","src":"411:7:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307836633961366334613339323834653337656431636635336433333735373764313432313261343837306662393736613433363663363933623933393931386435","id":996,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"469:66:2","typeDescriptions":{"typeIdentifier":"t_rational_49122629484629529244014240937346711770925847994644146912111677022347558721749_by_1","typeString":"int_const 4912...(69 digits omitted)...1749"},"value":"0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5"},"visibility":"internal"},{"body":{"id":1007,"nodeType":"Block","src":"604:180:2","statements":[{"assignments":[1003],"declarations":[{"constant":false,"id":1003,"mutability":"mutable","name":"slot","nameLocation":"622:4:2","nodeType":"VariableDeclaration","scope":1007,"src":"614:12:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1002,"name":"bytes32","nodeType":"ElementaryTypeName","src":"614:7:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1005,"initialValue":{"id":1004,"name":"FALLBACK_HANDLER_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":997,"src":"629:29:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"614:44:2"},{"AST":{"nodeType":"YulBlock","src":"733:45:2","statements":[{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"754:4:2"},{"name":"handler","nodeType":"YulIdentifier","src":"760:7:2"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"747:6:2"},"nodeType":"YulFunctionCall","src":"747:21:2"},"nodeType":"YulExpressionStatement","src":"747:21:2"}]},"evmVersion":"london","externalReferences":[{"declaration":999,"isOffset":false,"isSlot":false,"src":"760:7:2","valueSize":1},{"declaration":1003,"isOffset":false,"isSlot":false,"src":"754:4:2","valueSize":1}],"id":1006,"nodeType":"InlineAssembly","src":"724:54:2"}]},"id":1008,"implemented":true,"kind":"function","modifiers":[],"name":"internalSetFallbackHandler","nameLocation":"551:26:2","nodeType":"FunctionDefinition","parameters":{"id":1000,"nodeType":"ParameterList","parameters":[{"constant":false,"id":999,"mutability":"mutable","name":"handler","nameLocation":"586:7:2","nodeType":"VariableDeclaration","scope":1008,"src":"578:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":998,"name":"address","nodeType":"ElementaryTypeName","src":"578:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"577:17:2"},"returnParameters":{"id":1001,"nodeType":"ParameterList","parameters":[],"src":"604:0:2"},"scope":1035,"src":"542:242:2","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1024,"nodeType":"Block","src":"1115:98:2","statements":[{"expression":{"arguments":[{"id":1017,"name":"handler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1011,"src":"1152:7:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1016,"name":"internalSetFallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1008,"src":"1125:26:2","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1125:35:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1019,"nodeType":"ExpressionStatement","src":"1125:35:2"},{"eventCall":{"arguments":[{"id":1021,"name":"handler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1011,"src":"1198:7:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1020,"name":"ChangedFallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":994,"src":"1175:22:2","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1022,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1175:31:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1023,"nodeType":"EmitStatement","src":"1170:36:2"}]},"documentation":{"id":1009,"nodeType":"StructuredDocumentation","src":"790:257:2","text":"@dev Allows to add a contract to handle fallback calls.\n Only fallback calls without value and with data will be forwarded.\n This can only be done via a Safe transaction.\n @param handler contract to handle fallbacks calls."},"functionSelector":"f08a0323","id":1025,"implemented":true,"kind":"function","modifiers":[{"id":1014,"kind":"modifierInvocation","modifierName":{"id":1013,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"1104:10:2"},"nodeType":"ModifierInvocation","src":"1104:10:2"}],"name":"setFallbackHandler","nameLocation":"1061:18:2","nodeType":"FunctionDefinition","parameters":{"id":1012,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1011,"mutability":"mutable","name":"handler","nameLocation":"1088:7:2","nodeType":"VariableDeclaration","scope":1025,"src":"1080:15:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1010,"name":"address","nodeType":"ElementaryTypeName","src":"1080:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1079:17:2"},"returnParameters":{"id":1015,"nodeType":"ParameterList","parameters":[],"src":"1115:0:2"},"scope":1035,"src":"1052:161:2","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1033,"nodeType":"Block","src":"1309:872:2","statements":[{"assignments":[1029],"declarations":[{"constant":false,"id":1029,"mutability":"mutable","name":"slot","nameLocation":"1327:4:2","nodeType":"VariableDeclaration","scope":1033,"src":"1319:12:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1028,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1319:7:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1031,"initialValue":{"id":1030,"name":"FALLBACK_HANDLER_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":997,"src":"1334:29:2","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1319:44:2"},{"AST":{"nodeType":"YulBlock","src":"1438:737:2","statements":[{"nodeType":"YulVariableDeclaration","src":"1452:26:2","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1473:4:2"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1467:5:2"},"nodeType":"YulFunctionCall","src":"1467:11:2"},"variables":[{"name":"handler","nodeType":"YulTypedName","src":"1456:7:2","type":""}]},{"body":{"nodeType":"YulBlock","src":"1510:44:2","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1535:1:2","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1538:1:2","type":"","value":"0"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"1528:6:2"},"nodeType":"YulFunctionCall","src":"1528:12:2"},"nodeType":"YulExpressionStatement","src":"1528:12:2"}]},"condition":{"arguments":[{"name":"handler","nodeType":"YulIdentifier","src":"1501:7:2"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1494:6:2"},"nodeType":"YulFunctionCall","src":"1494:15:2"},"nodeType":"YulIf","src":"1491:63:2"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1580:1:2","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1583:1:2","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1586:12:2"},"nodeType":"YulFunctionCall","src":"1586:14:2"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1567:12:2"},"nodeType":"YulFunctionCall","src":"1567:34:2"},"nodeType":"YulExpressionStatement","src":"1567:34:2"},{"expression":{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1799:12:2"},"nodeType":"YulFunctionCall","src":"1799:14:2"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1819:2:2","type":"","value":"96"},{"arguments":[],"functionName":{"name":"caller","nodeType":"YulIdentifier","src":"1823:6:2"},"nodeType":"YulFunctionCall","src":"1823:8:2"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1815:3:2"},"nodeType":"YulFunctionCall","src":"1815:17:2"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1792:6:2"},"nodeType":"YulFunctionCall","src":"1792:41:2"},"nodeType":"YulExpressionStatement","src":"1792:41:2"},{"nodeType":"YulVariableDeclaration","src":"1911:72:2","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1931:3:2"},"nodeType":"YulFunctionCall","src":"1931:5:2"},{"name":"handler","nodeType":"YulIdentifier","src":"1938:7:2"},{"kind":"number","nodeType":"YulLiteral","src":"1947:1:2","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1950:1:2","type":"","value":"0"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1957:12:2"},"nodeType":"YulFunctionCall","src":"1957:14:2"},{"kind":"number","nodeType":"YulLiteral","src":"1973:2:2","type":"","value":"20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1953:3:2"},"nodeType":"YulFunctionCall","src":"1953:23:2"},{"kind":"number","nodeType":"YulLiteral","src":"1978:1:2","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1981:1:2","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"1926:4:2"},"nodeType":"YulFunctionCall","src":"1926:57:2"},"variables":[{"name":"success","nodeType":"YulTypedName","src":"1915:7:2","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2011:1:2","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2014:1:2","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2017:14:2"},"nodeType":"YulFunctionCall","src":"2017:16:2"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"1996:14:2"},"nodeType":"YulFunctionCall","src":"1996:38:2"},"nodeType":"YulExpressionStatement","src":"1996:38:2"},{"body":{"nodeType":"YulBlock","src":"2066:59:2","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2091:1:2","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2094:14:2"},"nodeType":"YulFunctionCall","src":"2094:16:2"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2084:6:2"},"nodeType":"YulFunctionCall","src":"2084:27:2"},"nodeType":"YulExpressionStatement","src":"2084:27:2"}]},"condition":{"arguments":[{"name":"success","nodeType":"YulIdentifier","src":"2057:7:2"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2050:6:2"},"nodeType":"YulFunctionCall","src":"2050:15:2"},"nodeType":"YulIf","src":"2047:78:2"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2145:1:2","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2148:14:2"},"nodeType":"YulFunctionCall","src":"2148:16:2"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"2138:6:2"},"nodeType":"YulFunctionCall","src":"2138:27:2"},"nodeType":"YulExpressionStatement","src":"2138:27:2"}]},"evmVersion":"london","externalReferences":[{"declaration":1029,"isOffset":false,"isSlot":false,"src":"1473:4:2","valueSize":1}],"id":1032,"nodeType":"InlineAssembly","src":"1429:746:2"}]},"id":1034,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1026,"nodeType":"ParameterList","parameters":[],"src":"1297:2:2"},"returnParameters":{"id":1027,"nodeType":"ParameterList","parameters":[],"src":"1309:0:2"},"scope":1035,"src":"1289:892:2","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":1036,"src":"257:1926:2","usedErrors":[]}],"src":"42:2142:2"},"id":2},"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol","exportedSymbols":{"Enum":[1998],"Guard":[1073],"GuardManager":[1113],"SelfAuthorized":[2073]},"id":1114,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1037,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:3"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Enum.sol","file":"../common/Enum.sol","id":1038,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1114,"sourceUnit":1999,"src":"75:28:3","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol","file":"../common/SelfAuthorized.sol","id":1039,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1114,"sourceUnit":2074,"src":"104:38:3","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Guard","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":1073,"linearizedBaseContracts":[1073],"name":"Guard","nameLocation":"154:5:3","nodeType":"ContractDefinition","nodes":[{"functionSelector":"75f0bb52","id":1065,"implemented":false,"kind":"function","modifiers":[],"name":"checkTransaction","nameLocation":"175:16:3","nodeType":"FunctionDefinition","parameters":{"id":1063,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1041,"mutability":"mutable","name":"to","nameLocation":"209:2:3","nodeType":"VariableDeclaration","scope":1065,"src":"201:10:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1040,"name":"address","nodeType":"ElementaryTypeName","src":"201:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1043,"mutability":"mutable","name":"value","nameLocation":"229:5:3","nodeType":"VariableDeclaration","scope":1065,"src":"221:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1042,"name":"uint256","nodeType":"ElementaryTypeName","src":"221:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1045,"mutability":"mutable","name":"data","nameLocation":"257:4:3","nodeType":"VariableDeclaration","scope":1065,"src":"244:17:3","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1044,"name":"bytes","nodeType":"ElementaryTypeName","src":"244:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1048,"mutability":"mutable","name":"operation","nameLocation":"286:9:3","nodeType":"VariableDeclaration","scope":1065,"src":"271:24:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":1047,"nodeType":"UserDefinedTypeName","pathNode":{"id":1046,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"271:14:3"},"referencedDeclaration":1997,"src":"271:14:3","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"},{"constant":false,"id":1050,"mutability":"mutable","name":"safeTxGas","nameLocation":"313:9:3","nodeType":"VariableDeclaration","scope":1065,"src":"305:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1049,"name":"uint256","nodeType":"ElementaryTypeName","src":"305:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1052,"mutability":"mutable","name":"baseGas","nameLocation":"340:7:3","nodeType":"VariableDeclaration","scope":1065,"src":"332:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1051,"name":"uint256","nodeType":"ElementaryTypeName","src":"332:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1054,"mutability":"mutable","name":"gasPrice","nameLocation":"365:8:3","nodeType":"VariableDeclaration","scope":1065,"src":"357:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1053,"name":"uint256","nodeType":"ElementaryTypeName","src":"357:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1056,"mutability":"mutable","name":"gasToken","nameLocation":"391:8:3","nodeType":"VariableDeclaration","scope":1065,"src":"383:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1055,"name":"address","nodeType":"ElementaryTypeName","src":"383:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1058,"mutability":"mutable","name":"refundReceiver","nameLocation":"425:14:3","nodeType":"VariableDeclaration","scope":1065,"src":"409:30:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":1057,"name":"address","nodeType":"ElementaryTypeName","src":"409:15:3","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":1060,"mutability":"mutable","name":"signatures","nameLocation":"462:10:3","nodeType":"VariableDeclaration","scope":1065,"src":"449:23:3","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1059,"name":"bytes","nodeType":"ElementaryTypeName","src":"449:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1062,"mutability":"mutable","name":"msgSender","nameLocation":"490:9:3","nodeType":"VariableDeclaration","scope":1065,"src":"482:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1061,"name":"address","nodeType":"ElementaryTypeName","src":"482:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"191:314:3"},"returnParameters":{"id":1064,"nodeType":"ParameterList","parameters":[],"src":"514:0:3"},"scope":1073,"src":"166:349:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"93271368","id":1072,"implemented":false,"kind":"function","modifiers":[],"name":"checkAfterExecution","nameLocation":"530:19:3","nodeType":"FunctionDefinition","parameters":{"id":1070,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1067,"mutability":"mutable","name":"txHash","nameLocation":"558:6:3","nodeType":"VariableDeclaration","scope":1072,"src":"550:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1066,"name":"bytes32","nodeType":"ElementaryTypeName","src":"550:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":1069,"mutability":"mutable","name":"success","nameLocation":"571:7:3","nodeType":"VariableDeclaration","scope":1072,"src":"566:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1068,"name":"bool","nodeType":"ElementaryTypeName","src":"566:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"549:30:3"},"returnParameters":{"id":1071,"nodeType":"ParameterList","parameters":[],"src":"588:0:3"},"scope":1073,"src":"521:68:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":1114,"src":"144:447:3","usedErrors":[]},{"abstract":false,"baseContracts":[{"baseName":{"id":1075,"name":"SelfAuthorized","nodeType":"IdentifierPath","referencedDeclaration":2073,"src":"760:14:3"},"id":1076,"nodeType":"InheritanceSpecifier","src":"760:14:3"}],"canonicalName":"GuardManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":1074,"nodeType":"StructuredDocumentation","src":"593:142:3","text":"@title Fallback Manager - A contract that manages fallback calls made to this contract\n @author Richard Meissner - "},"fullyImplemented":true,"id":1113,"linearizedBaseContracts":[1113,2073],"name":"GuardManager","nameLocation":"744:12:3","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2","id":1080,"name":"ChangedGuard","nameLocation":"787:12:3","nodeType":"EventDefinition","parameters":{"id":1079,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1078,"indexed":false,"mutability":"mutable","name":"guard","nameLocation":"808:5:3","nodeType":"VariableDeclaration","scope":1080,"src":"800:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1077,"name":"address","nodeType":"ElementaryTypeName","src":"800:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"799:15:3"},"src":"781:34:3"},{"constant":true,"id":1083,"mutability":"constant","name":"GUARD_STORAGE_SLOT","nameLocation":"894:18:3","nodeType":"VariableDeclaration","scope":1113,"src":"868:113:3","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1081,"name":"bytes32","nodeType":"ElementaryTypeName","src":"868:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307834613230346636323063386335636364636133666435346430303362616464383562613530303433366134333166306362646134663535386339336333346338","id":1082,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"915:66:3","typeDescriptions":{"typeIdentifier":"t_rational_33528237782592280163068556224972516439282563014722366175641814928123294921928_by_1","typeString":"int_const 3352...(69 digits omitted)...1928"},"value":"0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8"},"visibility":"internal"},{"body":{"id":1100,"nodeType":"Block","src":"1203:201:3","statements":[{"assignments":[1092],"declarations":[{"constant":false,"id":1092,"mutability":"mutable","name":"slot","nameLocation":"1221:4:3","nodeType":"VariableDeclaration","scope":1100,"src":"1213:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1091,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1213:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1094,"initialValue":{"id":1093,"name":"GUARD_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1083,"src":"1228:18:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1213:33:3"},{"AST":{"nodeType":"YulBlock","src":"1321:43:3","statements":[{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1342:4:3"},{"name":"guard","nodeType":"YulIdentifier","src":"1348:5:3"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"1335:6:3"},"nodeType":"YulFunctionCall","src":"1335:19:3"},"nodeType":"YulExpressionStatement","src":"1335:19:3"}]},"evmVersion":"london","externalReferences":[{"declaration":1086,"isOffset":false,"isSlot":false,"src":"1348:5:3","valueSize":1},{"declaration":1092,"isOffset":false,"isSlot":false,"src":"1342:4:3","valueSize":1}],"id":1095,"nodeType":"InlineAssembly","src":"1312:52:3"},{"eventCall":{"arguments":[{"id":1097,"name":"guard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1086,"src":"1391:5:3","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1096,"name":"ChangedGuard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1080,"src":"1378:12:3","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1378:19:3","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1099,"nodeType":"EmitStatement","src":"1373:24:3"}]},"documentation":{"id":1084,"nodeType":"StructuredDocumentation","src":"988:157:3","text":"@dev Set a guard that checks transactions before execution\n @param guard The address of the guard to be used or the 0 address to disable the guard"},"functionSelector":"e19a9dd9","id":1101,"implemented":true,"kind":"function","modifiers":[{"id":1089,"kind":"modifierInvocation","modifierName":{"id":1088,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"1192:10:3"},"nodeType":"ModifierInvocation","src":"1192:10:3"}],"name":"setGuard","nameLocation":"1159:8:3","nodeType":"FunctionDefinition","parameters":{"id":1087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1086,"mutability":"mutable","name":"guard","nameLocation":"1176:5:3","nodeType":"VariableDeclaration","scope":1101,"src":"1168:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1085,"name":"address","nodeType":"ElementaryTypeName","src":"1168:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1167:15:3"},"returnParameters":{"id":1090,"nodeType":"ParameterList","parameters":[],"src":"1203:0:3"},"scope":1113,"src":"1150:254:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":1111,"nodeType":"Block","src":"1468:168:3","statements":[{"assignments":[1107],"declarations":[{"constant":false,"id":1107,"mutability":"mutable","name":"slot","nameLocation":"1486:4:3","nodeType":"VariableDeclaration","scope":1111,"src":"1478:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1106,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1478:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1109,"initialValue":{"id":1108,"name":"GUARD_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1083,"src":"1493:18:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1478:33:3"},{"AST":{"nodeType":"YulBlock","src":"1586:44:3","statements":[{"nodeType":"YulAssignment","src":"1600:20:3","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1615:4:3"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1609:5:3"},"nodeType":"YulFunctionCall","src":"1609:11:3"},"variableNames":[{"name":"guard","nodeType":"YulIdentifier","src":"1600:5:3"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1104,"isOffset":false,"isSlot":false,"src":"1600:5:3","valueSize":1},{"declaration":1107,"isOffset":false,"isSlot":false,"src":"1615:4:3","valueSize":1}],"id":1110,"nodeType":"InlineAssembly","src":"1577:53:3"}]},"id":1112,"implemented":true,"kind":"function","modifiers":[],"name":"getGuard","nameLocation":"1419:8:3","nodeType":"FunctionDefinition","parameters":{"id":1102,"nodeType":"ParameterList","parameters":[],"src":"1427:2:3"},"returnParameters":{"id":1105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1104,"mutability":"mutable","name":"guard","nameLocation":"1461:5:3","nodeType":"VariableDeclaration","scope":1112,"src":"1453:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1103,"name":"address","nodeType":"ElementaryTypeName","src":"1453:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1452:15:3"},"scope":1113,"src":"1410:226:3","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":1114,"src":"735:903:3","usedErrors":[]}],"src":"42:1597:3"},"id":3},"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol","exportedSymbols":{"Enum":[1998],"Executor":[984],"ModuleManager":[1480],"SelfAuthorized":[2073]},"id":1481,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1115,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:4"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Enum.sol","file":"../common/Enum.sol","id":1116,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1481,"sourceUnit":1999,"src":"74:28:4","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol","file":"../common/SelfAuthorized.sol","id":1117,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1481,"sourceUnit":2074,"src":"103:38:4","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/Executor.sol","file":"./Executor.sol","id":1118,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1481,"sourceUnit":985,"src":"142:24:4","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":1120,"name":"SelfAuthorized","nodeType":"IdentifierPath","referencedDeclaration":2073,"src":"400:14:4"},"id":1121,"nodeType":"InheritanceSpecifier","src":"400:14:4"},{"baseName":{"id":1122,"name":"Executor","nodeType":"IdentifierPath","referencedDeclaration":984,"src":"416:8:4"},"id":1123,"nodeType":"InheritanceSpecifier","src":"416:8:4"}],"canonicalName":"ModuleManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":1119,"nodeType":"StructuredDocumentation","src":"168:206:4","text":"@title Module Manager - A contract that manages modules that can execute transactions via this contract\n @author Stefan George - \n @author Richard Meissner - "},"fullyImplemented":true,"id":1480,"linearizedBaseContracts":[1480,984,2073],"name":"ModuleManager","nameLocation":"383:13:4","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"ecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440","id":1127,"name":"EnabledModule","nameLocation":"437:13:4","nodeType":"EventDefinition","parameters":{"id":1126,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1125,"indexed":false,"mutability":"mutable","name":"module","nameLocation":"459:6:4","nodeType":"VariableDeclaration","scope":1127,"src":"451:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1124,"name":"address","nodeType":"ElementaryTypeName","src":"451:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"450:16:4"},"src":"431:36:4"},{"anonymous":false,"eventSelector":"aab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276","id":1131,"name":"DisabledModule","nameLocation":"478:14:4","nodeType":"EventDefinition","parameters":{"id":1130,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1129,"indexed":false,"mutability":"mutable","name":"module","nameLocation":"501:6:4","nodeType":"VariableDeclaration","scope":1131,"src":"493:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1128,"name":"address","nodeType":"ElementaryTypeName","src":"493:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"492:16:4"},"src":"472:37:4"},{"anonymous":false,"eventSelector":"6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8","id":1135,"name":"ExecutionFromModuleSuccess","nameLocation":"520:26:4","nodeType":"EventDefinition","parameters":{"id":1134,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1133,"indexed":true,"mutability":"mutable","name":"module","nameLocation":"563:6:4","nodeType":"VariableDeclaration","scope":1135,"src":"547:22:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1132,"name":"address","nodeType":"ElementaryTypeName","src":"547:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"546:24:4"},"src":"514:57:4"},{"anonymous":false,"eventSelector":"acd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375","id":1139,"name":"ExecutionFromModuleFailure","nameLocation":"582:26:4","nodeType":"EventDefinition","parameters":{"id":1138,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1137,"indexed":true,"mutability":"mutable","name":"module","nameLocation":"625:6:4","nodeType":"VariableDeclaration","scope":1139,"src":"609:22:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1136,"name":"address","nodeType":"ElementaryTypeName","src":"609:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"608:24:4"},"src":"576:57:4"},{"constant":true,"id":1145,"mutability":"constant","name":"SENTINEL_MODULES","nameLocation":"665:16:4","nodeType":"VariableDeclaration","scope":1480,"src":"639:57:4","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1140,"name":"address","nodeType":"ElementaryTypeName","src":"639:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307831","id":1143,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"692:3:4","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"0x1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":1142,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"684:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1141,"name":"address","nodeType":"ElementaryTypeName","src":"684:7:4","typeDescriptions":{}}},"id":1144,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"684:12:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1149,"mutability":"mutable","name":"modules","nameLocation":"740:7:4","nodeType":"VariableDeclaration","scope":1480,"src":"703:44:4","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":1148,"keyType":{"id":1146,"name":"address","nodeType":"ElementaryTypeName","src":"711:7:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"703:27:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":1147,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"body":{"id":1195,"nodeType":"Block","src":"816:322:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1157,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"834:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1159,"indexExpression":{"id":1158,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"842:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"834:25:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1162,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"871:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1161,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"863:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1160,"name":"address","nodeType":"ElementaryTypeName","src":"863:7:4","typeDescriptions":{}}},"id":1163,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"863:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"834:39:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313030","id":1165,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"875:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_8c9c6f726a0896ef73f47c5bcc7192641db350a8b0b2e1f61e0f0c694ec59426","typeString":"literal_string \"GS100\""},"value":"GS100"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8c9c6f726a0896ef73f47c5bcc7192641db350a8b0b2e1f61e0f0c694ec59426","typeString":"literal_string \"GS100\""}],"id":1156,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"826:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1166,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"826:57:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1167,"nodeType":"ExpressionStatement","src":"826:57:4"},{"expression":{"id":1172,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1168,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"893:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1170,"indexExpression":{"id":1169,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"901:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"893:25:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1171,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"921:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"893:44:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1173,"nodeType":"ExpressionStatement","src":"893:44:4"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1174,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1151,"src":"951:2:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1177,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"965:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1176,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"957:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1175,"name":"address","nodeType":"ElementaryTypeName","src":"957:7:4","typeDescriptions":{}}},"id":1178,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"957:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"951:16:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1194,"nodeType":"IfStatement","src":"947:184:4","trueBody":{"expression":{"arguments":[{"arguments":[{"id":1182,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1151,"src":"1069:2:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":1183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1073:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":1184,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1153,"src":"1076:4:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"expression":{"id":1185,"name":"Enum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1998,"src":"1082:4:4","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Enum_$1998_$","typeString":"type(contract Enum)"}},"id":1186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"Operation","nodeType":"MemberAccess","referencedDeclaration":1997,"src":"1082:14:4","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Operation_$1997_$","typeString":"type(enum Enum.Operation)"}},"id":1187,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"DelegateCall","nodeType":"MemberAccess","referencedDeclaration":1996,"src":"1082:27:4","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"arguments":[],"expression":{"argumentTypes":[],"id":1188,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1111:7:4","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1111:9:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1181,"name":"execute","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":983,"src":"1061:7:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256) returns (bool)"}},"id":1190,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1061:60:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303030","id":1191,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1123:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_3fdb21530a98d914fa570cd548d7a3608c11195b5a11ec44ecd149309d9dcced","typeString":"literal_string \"GS000\""},"value":"GS000"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3fdb21530a98d914fa570cd548d7a3608c11195b5a11ec44ecd149309d9dcced","typeString":"literal_string \"GS000\""}],"id":1180,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1053:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1053:78:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1193,"nodeType":"ExpressionStatement","src":"1053:78:4"}}]},"id":1196,"implemented":true,"kind":"function","modifiers":[],"name":"setupModules","nameLocation":"763:12:4","nodeType":"FunctionDefinition","parameters":{"id":1154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1151,"mutability":"mutable","name":"to","nameLocation":"784:2:4","nodeType":"VariableDeclaration","scope":1196,"src":"776:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1150,"name":"address","nodeType":"ElementaryTypeName","src":"776:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1153,"mutability":"mutable","name":"data","nameLocation":"801:4:4","nodeType":"VariableDeclaration","scope":1196,"src":"788:17:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1152,"name":"bytes","nodeType":"ElementaryTypeName","src":"788:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"775:31:4"},"returnParameters":{"id":1155,"nodeType":"ParameterList","parameters":[],"src":"816:0:4"},"scope":1480,"src":"754:384:4","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1248,"nodeType":"Block","src":"1419:370:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1205,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1491:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1509:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1207,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1501:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1206,"name":"address","nodeType":"ElementaryTypeName","src":"1501:7:4","typeDescriptions":{}}},"id":1209,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1501:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1491:20:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1213,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1211,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1515:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1212,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"1525:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1515:26:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1491:50:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313031","id":1215,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1543:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f","typeString":"literal_string \"GS101\""},"value":"GS101"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f","typeString":"literal_string \"GS101\""}],"id":1204,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1483:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1483:68:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1217,"nodeType":"ExpressionStatement","src":"1483:68:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1226,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1219,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"1610:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1221,"indexExpression":{"id":1220,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1618:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1610:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1637:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1223,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1629:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1222,"name":"address","nodeType":"ElementaryTypeName","src":"1629:7:4","typeDescriptions":{}}},"id":1225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1629:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1610:29:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313032","id":1227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1641:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12","typeString":"literal_string \"GS102\""},"value":"GS102"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12","typeString":"literal_string \"GS102\""}],"id":1218,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1602:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1228,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1602:47:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1229,"nodeType":"ExpressionStatement","src":"1602:47:4"},{"expression":{"id":1236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1230,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"1659:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1232,"indexExpression":{"id":1231,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1667:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1659:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1233,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"1677:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1235,"indexExpression":{"id":1234,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"1685:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1677:25:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1659:43:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1237,"nodeType":"ExpressionStatement","src":"1659:43:4"},{"expression":{"id":1242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1238,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"1712:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1240,"indexExpression":{"id":1239,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"1720:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1712:25:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1241,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1740:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1712:34:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1243,"nodeType":"ExpressionStatement","src":"1712:34:4"},{"eventCall":{"arguments":[{"id":1245,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1199,"src":"1775:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1244,"name":"EnabledModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1127,"src":"1761:13:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1761:21:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1247,"nodeType":"EmitStatement","src":"1756:26:4"}]},"documentation":{"id":1197,"nodeType":"StructuredDocumentation","src":"1144:214:4","text":"@dev Allows to add a module to the whitelist.\n This can only be done via a Safe transaction.\n @notice Enables the module `module` for the Safe.\n @param module Module to be whitelisted."},"functionSelector":"610b5925","id":1249,"implemented":true,"kind":"function","modifiers":[{"id":1202,"kind":"modifierInvocation","modifierName":{"id":1201,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"1408:10:4"},"nodeType":"ModifierInvocation","src":"1408:10:4"}],"name":"enableModule","nameLocation":"1372:12:4","nodeType":"FunctionDefinition","parameters":{"id":1200,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1199,"mutability":"mutable","name":"module","nameLocation":"1393:6:4","nodeType":"VariableDeclaration","scope":1249,"src":"1385:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1198,"name":"address","nodeType":"ElementaryTypeName","src":"1385:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1384:16:4"},"returnParameters":{"id":1203,"nodeType":"ParameterList","parameters":[],"src":"1419:0:4"},"scope":1480,"src":"1363:426:4","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1303,"nodeType":"Block","src":"2186:346:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1269,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1260,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2286:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1263,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2304:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2296:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1261,"name":"address","nodeType":"ElementaryTypeName","src":"2296:7:4","typeDescriptions":{}}},"id":1264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2296:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2286:20:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1266,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2310:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1267,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"2320:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2310:26:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2286:50:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313031","id":1270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2338:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f","typeString":"literal_string \"GS101\""},"value":"GS101"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f","typeString":"literal_string \"GS101\""}],"id":1259,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2278:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2278:68:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1272,"nodeType":"ExpressionStatement","src":"2278:68:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1274,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"2364:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1276,"indexExpression":{"id":1275,"name":"prevModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1252,"src":"2372:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2364:19:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1277,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2387:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2364:29:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313033","id":1279,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2395:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be","typeString":"literal_string \"GS103\""},"value":"GS103"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be","typeString":"literal_string \"GS103\""}],"id":1273,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2356:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2356:47:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1281,"nodeType":"ExpressionStatement","src":"2356:47:4"},{"expression":{"id":1288,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1282,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"2413:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1284,"indexExpression":{"id":1283,"name":"prevModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1252,"src":"2421:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2413:19:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1285,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"2435:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1287,"indexExpression":{"id":1286,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2443:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2435:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2413:37:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1289,"nodeType":"ExpressionStatement","src":"2413:37:4"},{"expression":{"id":1297,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1290,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"2460:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1292,"indexExpression":{"id":1291,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2468:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2460:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":1295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2486:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1294,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2478:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1293,"name":"address","nodeType":"ElementaryTypeName","src":"2478:7:4","typeDescriptions":{}}},"id":1296,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2478:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2460:28:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1298,"nodeType":"ExpressionStatement","src":"2460:28:4"},{"eventCall":{"arguments":[{"id":1300,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1254,"src":"2518:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1299,"name":"DisabledModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1131,"src":"2503:14:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2503:22:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1302,"nodeType":"EmitStatement","src":"2498:27:4"}]},"documentation":{"id":1250,"nodeType":"StructuredDocumentation","src":"1795:309:4","text":"@dev Allows to remove a module from the whitelist.\n This can only be done via a Safe transaction.\n @notice Disables the module `module` for the Safe.\n @param prevModule Module that pointed to the module to be removed in the linked list\n @param module Module to be removed."},"functionSelector":"e009cfde","id":1304,"implemented":true,"kind":"function","modifiers":[{"id":1257,"kind":"modifierInvocation","modifierName":{"id":1256,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"2175:10:4"},"nodeType":"ModifierInvocation","src":"2175:10:4"}],"name":"disableModule","nameLocation":"2118:13:4","nodeType":"FunctionDefinition","parameters":{"id":1255,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1252,"mutability":"mutable","name":"prevModule","nameLocation":"2140:10:4","nodeType":"VariableDeclaration","scope":1304,"src":"2132:18:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1251,"name":"address","nodeType":"ElementaryTypeName","src":"2132:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1254,"mutability":"mutable","name":"module","nameLocation":"2160:6:4","nodeType":"VariableDeclaration","scope":1304,"src":"2152:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1253,"name":"address","nodeType":"ElementaryTypeName","src":"2152:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2131:36:4"},"returnParameters":{"id":1258,"nodeType":"ParameterList","parameters":[],"src":"2186:0:4"},"scope":1480,"src":"2109:423:4","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1360,"nodeType":"Block","src":"3051:403:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1333,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1320,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3118:3:4","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3118:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1322,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"3132:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3118:30:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1324,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"3152:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1327,"indexExpression":{"expression":{"id":1325,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3160:3:4","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3160:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3152:19:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3183:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1329,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3175:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1328,"name":"address","nodeType":"ElementaryTypeName","src":"3175:7:4","typeDescriptions":{}}},"id":1331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3175:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3152:33:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3118:67:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753313034","id":1334,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3187:7:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23","typeString":"literal_string \"GS104\""},"value":"GS104"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23","typeString":"literal_string \"GS104\""}],"id":1319,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3110:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3110:85:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1336,"nodeType":"ExpressionStatement","src":"3110:85:4"},{"expression":{"id":1346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1337,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1317,"src":"3267:7:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1339,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1307,"src":"3285:2:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1340,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1309,"src":"3289:5:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1341,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1311,"src":"3296:4:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":1342,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1314,"src":"3302:9:4","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"arguments":[],"expression":{"argumentTypes":[],"id":1343,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3313:7:4","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":1344,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3313:9:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1338,"name":"execute","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":983,"src":"3277:7:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256) returns (bool)"}},"id":1345,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3277:46:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3267:56:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1347,"nodeType":"ExpressionStatement","src":"3267:56:4"},{"condition":{"id":1348,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1317,"src":"3337:7:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"eventCall":{"arguments":[{"expression":{"id":1355,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3436:3:4","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3436:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1354,"name":"ExecutionFromModuleFailure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1139,"src":"3409:26:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3409:38:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1358,"nodeType":"EmitStatement","src":"3404:43:4"},"id":1359,"nodeType":"IfStatement","src":"3333:114:4","trueBody":{"eventCall":{"arguments":[{"expression":{"id":1350,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3378:3:4","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3378:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1349,"name":"ExecutionFromModuleSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1135,"src":"3351:26:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3351:38:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1353,"nodeType":"EmitStatement","src":"3346:43:4"}}]},"documentation":{"id":1305,"nodeType":"StructuredDocumentation","src":"2538:325:4","text":"@dev Allows a Module to execute a Safe transaction without any further confirmations.\n @param to Destination address of module transaction.\n @param value Ether value of module transaction.\n @param data Data payload of module transaction.\n @param operation Operation type of module transaction."},"functionSelector":"468721a7","id":1361,"implemented":true,"kind":"function","modifiers":[],"name":"execTransactionFromModule","nameLocation":"2877:25:4","nodeType":"FunctionDefinition","parameters":{"id":1315,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1307,"mutability":"mutable","name":"to","nameLocation":"2920:2:4","nodeType":"VariableDeclaration","scope":1361,"src":"2912:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1306,"name":"address","nodeType":"ElementaryTypeName","src":"2912:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1309,"mutability":"mutable","name":"value","nameLocation":"2940:5:4","nodeType":"VariableDeclaration","scope":1361,"src":"2932:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1308,"name":"uint256","nodeType":"ElementaryTypeName","src":"2932:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1311,"mutability":"mutable","name":"data","nameLocation":"2968:4:4","nodeType":"VariableDeclaration","scope":1361,"src":"2955:17:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1310,"name":"bytes","nodeType":"ElementaryTypeName","src":"2955:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1314,"mutability":"mutable","name":"operation","nameLocation":"2997:9:4","nodeType":"VariableDeclaration","scope":1361,"src":"2982:24:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":1313,"nodeType":"UserDefinedTypeName","pathNode":{"id":1312,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"2982:14:4"},"referencedDeclaration":1997,"src":"2982:14:4","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"}],"src":"2902:110:4"},"returnParameters":{"id":1318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1317,"mutability":"mutable","name":"success","nameLocation":"3042:7:4","nodeType":"VariableDeclaration","scope":1361,"src":"3037:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1316,"name":"bool","nodeType":"ElementaryTypeName","src":"3037:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3036:14:4"},"scope":1480,"src":"2868:586:4","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":1388,"nodeType":"Block","src":"4015:749:4","statements":[{"expression":{"id":1385,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1378,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1374,"src":"4025:7:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1380,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1364,"src":"4061:2:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1381,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1366,"src":"4065:5:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1382,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1368,"src":"4072:4:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":1383,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1371,"src":"4078:9:4","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}],"id":1379,"name":"execTransactionFromModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1361,"src":"4035:25:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation) returns (bool)"}},"id":1384,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4035:53:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4025:63:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1386,"nodeType":"ExpressionStatement","src":"4025:63:4"},{"AST":{"nodeType":"YulBlock","src":"4163:595:4","statements":[{"nodeType":"YulVariableDeclaration","src":"4218:22:4","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4235:4:4","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4229:5:4"},"nodeType":"YulFunctionCall","src":"4229:11:4"},"variables":[{"name":"ptr","nodeType":"YulTypedName","src":"4222:3:4","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4440:4:4","type":"","value":"0x40"},{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"4450:3:4"},{"arguments":[{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"4459:14:4"},"nodeType":"YulFunctionCall","src":"4459:16:4"},{"kind":"number","nodeType":"YulLiteral","src":"4477:4:4","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4455:3:4"},"nodeType":"YulFunctionCall","src":"4455:27:4"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4446:3:4"},"nodeType":"YulFunctionCall","src":"4446:37:4"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4433:6:4"},"nodeType":"YulFunctionCall","src":"4433:51:4"},"nodeType":"YulExpressionStatement","src":"4433:51:4"},{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"4534:3:4"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"4539:14:4"},"nodeType":"YulFunctionCall","src":"4539:16:4"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4527:6:4"},"nodeType":"YulFunctionCall","src":"4527:29:4"},"nodeType":"YulExpressionStatement","src":"4527:29:4"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"4618:3:4"},{"kind":"number","nodeType":"YulLiteral","src":"4623:4:4","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4614:3:4"},"nodeType":"YulFunctionCall","src":"4614:14:4"},{"kind":"number","nodeType":"YulLiteral","src":"4630:1:4","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"4633:14:4"},"nodeType":"YulFunctionCall","src":"4633:16:4"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"4599:14:4"},"nodeType":"YulFunctionCall","src":"4599:51:4"},"nodeType":"YulExpressionStatement","src":"4599:51:4"},{"nodeType":"YulAssignment","src":"4731:17:4","value":{"name":"ptr","nodeType":"YulIdentifier","src":"4745:3:4"},"variableNames":[{"name":"returnData","nodeType":"YulIdentifier","src":"4731:10:4"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1376,"isOffset":false,"isSlot":false,"src":"4731:10:4","valueSize":1}],"id":1387,"nodeType":"InlineAssembly","src":"4154:604:4"}]},"documentation":{"id":1362,"nodeType":"StructuredDocumentation","src":"3460:340:4","text":"@dev Allows a Module to execute a Safe transaction without any further confirmations and return data\n @param to Destination address of module transaction.\n @param value Ether value of module transaction.\n @param data Data payload of module transaction.\n @param operation Operation type of module transaction."},"functionSelector":"5229073f","id":1389,"implemented":true,"kind":"function","modifiers":[],"name":"execTransactionFromModuleReturnData","nameLocation":"3814:35:4","nodeType":"FunctionDefinition","parameters":{"id":1372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1364,"mutability":"mutable","name":"to","nameLocation":"3867:2:4","nodeType":"VariableDeclaration","scope":1389,"src":"3859:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1363,"name":"address","nodeType":"ElementaryTypeName","src":"3859:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1366,"mutability":"mutable","name":"value","nameLocation":"3887:5:4","nodeType":"VariableDeclaration","scope":1389,"src":"3879:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1365,"name":"uint256","nodeType":"ElementaryTypeName","src":"3879:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1368,"mutability":"mutable","name":"data","nameLocation":"3915:4:4","nodeType":"VariableDeclaration","scope":1389,"src":"3902:17:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1367,"name":"bytes","nodeType":"ElementaryTypeName","src":"3902:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1371,"mutability":"mutable","name":"operation","nameLocation":"3944:9:4","nodeType":"VariableDeclaration","scope":1389,"src":"3929:24:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":1370,"nodeType":"UserDefinedTypeName","pathNode":{"id":1369,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"3929:14:4"},"referencedDeclaration":1997,"src":"3929:14:4","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"}],"src":"3849:110:4"},"returnParameters":{"id":1377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1374,"mutability":"mutable","name":"success","nameLocation":"3981:7:4","nodeType":"VariableDeclaration","scope":1389,"src":"3976:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1373,"name":"bool","nodeType":"ElementaryTypeName","src":"3976:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1376,"mutability":"mutable","name":"returnData","nameLocation":"4003:10:4","nodeType":"VariableDeclaration","scope":1389,"src":"3990:23:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1375,"name":"bytes","nodeType":"ElementaryTypeName","src":"3990:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3975:39:4"},"scope":1480,"src":"3805:959:4","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1410,"nodeType":"Block","src":"4929:83:4","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1408,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1399,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1397,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"4946:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1398,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1392,"src":"4966:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4946:26:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1400,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"4976:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1402,"indexExpression":{"id":1401,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1392,"src":"4984:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4976:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5003:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1404,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4995:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1403,"name":"address","nodeType":"ElementaryTypeName","src":"4995:7:4","typeDescriptions":{}}},"id":1406,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4995:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4976:29:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4946:59:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":1396,"id":1409,"nodeType":"Return","src":"4939:66:4"}]},"documentation":{"id":1390,"nodeType":"StructuredDocumentation","src":"4770:86:4","text":"@dev Returns if an module is enabled\n @return True if the module is enabled"},"functionSelector":"2d9ad53d","id":1411,"implemented":true,"kind":"function","modifiers":[],"name":"isModuleEnabled","nameLocation":"4870:15:4","nodeType":"FunctionDefinition","parameters":{"id":1393,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1392,"mutability":"mutable","name":"module","nameLocation":"4894:6:4","nodeType":"VariableDeclaration","scope":1411,"src":"4886:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1391,"name":"address","nodeType":"ElementaryTypeName","src":"4886:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4885:16:4"},"returnParameters":{"id":1396,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1395,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1411,"src":"4923:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1394,"name":"bool","nodeType":"ElementaryTypeName","src":"4923:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4922:6:4"},"scope":1480,"src":"4861:151:4","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":1478,"nodeType":"Block","src":"5380:652:4","statements":[{"expression":{"id":1430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1424,"name":"array","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1420,"src":"5431:5:4","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":1428,"name":"pageSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1416,"src":"5453:8:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1427,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"5439:13:4","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (address[] memory)"},"typeName":{"baseType":{"id":1425,"name":"address","nodeType":"ElementaryTypeName","src":"5443:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1426,"nodeType":"ArrayTypeName","src":"5443:9:4","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}}},"id":1429,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5439:23:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"src":"5431:31:4","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1431,"nodeType":"ExpressionStatement","src":"5431:31:4"},{"assignments":[1433],"declarations":[{"constant":false,"id":1433,"mutability":"mutable","name":"moduleCount","nameLocation":"5514:11:4","nodeType":"VariableDeclaration","scope":1478,"src":"5506:19:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1432,"name":"uint256","nodeType":"ElementaryTypeName","src":"5506:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1435,"initialValue":{"hexValue":"30","id":1434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5528:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5506:23:4"},{"assignments":[1437],"declarations":[{"constant":false,"id":1437,"mutability":"mutable","name":"currentModule","nameLocation":"5547:13:4","nodeType":"VariableDeclaration","scope":1478,"src":"5539:21:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1436,"name":"address","nodeType":"ElementaryTypeName","src":"5539:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1441,"initialValue":{"baseExpression":{"id":1438,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"5563:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1440,"indexExpression":{"id":1439,"name":"start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1414,"src":"5571:5:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5563:14:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5539:38:4"},{"body":{"id":1471,"nodeType":"Block","src":"5688:138:4","statements":[{"expression":{"id":1460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1456,"name":"array","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1420,"src":"5702:5:4","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1458,"indexExpression":{"id":1457,"name":"moduleCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1433,"src":"5708:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5702:18:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1459,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5723:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5702:34:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1461,"nodeType":"ExpressionStatement","src":"5702:34:4"},{"expression":{"id":1466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1462,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5750:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1463,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1149,"src":"5766:7:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1465,"indexExpression":{"id":1464,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5774:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5766:22:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5750:38:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1467,"nodeType":"ExpressionStatement","src":"5750:38:4"},{"expression":{"id":1469,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5802:13:4","subExpression":{"id":1468,"name":"moduleCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1433,"src":"5802:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1470,"nodeType":"ExpressionStatement","src":"5802:13:4"}]},"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1455,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1442,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5594:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"307830","id":1445,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5619:3:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1444,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5611:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1443,"name":"address","nodeType":"ElementaryTypeName","src":"5611:7:4","typeDescriptions":{}}},"id":1446,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5611:12:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5594:29:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1448,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5627:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1449,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1145,"src":"5644:16:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5627:33:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5594:66:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1454,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1452,"name":"moduleCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1433,"src":"5664:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1453,"name":"pageSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1416,"src":"5678:8:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5664:22:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5594:92:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1472,"nodeType":"WhileStatement","src":"5587:239:4"},{"expression":{"id":1475,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1473,"name":"next","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1422,"src":"5835:4:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1474,"name":"currentModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1437,"src":"5842:13:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5835:20:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1476,"nodeType":"ExpressionStatement","src":"5835:20:4"},{"AST":{"nodeType":"YulBlock","src":"5976:50:4","statements":[{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"5997:5:4"},{"name":"moduleCount","nodeType":"YulIdentifier","src":"6004:11:4"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5990:6:4"},"nodeType":"YulFunctionCall","src":"5990:26:4"},"nodeType":"YulExpressionStatement","src":"5990:26:4"}]},"evmVersion":"london","externalReferences":[{"declaration":1420,"isOffset":false,"isSlot":false,"src":"5997:5:4","valueSize":1},{"declaration":1433,"isOffset":false,"isSlot":false,"src":"6004:11:4","valueSize":1}],"id":1477,"nodeType":"InlineAssembly","src":"5967:59:4"}]},"documentation":{"id":1412,"nodeType":"StructuredDocumentation","src":"5018:234:4","text":"@dev Returns array of modules.\n @param start Start of the page.\n @param pageSize Maximum number of modules that should be returned.\n @return array Array of modules.\n @return next Start of the next page."},"functionSelector":"cc2f8452","id":1479,"implemented":true,"kind":"function","modifiers":[],"name":"getModulesPaginated","nameLocation":"5266:19:4","nodeType":"FunctionDefinition","parameters":{"id":1417,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1414,"mutability":"mutable","name":"start","nameLocation":"5294:5:4","nodeType":"VariableDeclaration","scope":1479,"src":"5286:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1413,"name":"address","nodeType":"ElementaryTypeName","src":"5286:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1416,"mutability":"mutable","name":"pageSize","nameLocation":"5309:8:4","nodeType":"VariableDeclaration","scope":1479,"src":"5301:16:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1415,"name":"uint256","nodeType":"ElementaryTypeName","src":"5301:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5285:33:4"},"returnParameters":{"id":1423,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1420,"mutability":"mutable","name":"array","nameLocation":"5359:5:4","nodeType":"VariableDeclaration","scope":1479,"src":"5342:22:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":1418,"name":"address","nodeType":"ElementaryTypeName","src":"5342:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1419,"nodeType":"ArrayTypeName","src":"5342:9:4","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":1422,"mutability":"mutable","name":"next","nameLocation":"5374:4:4","nodeType":"VariableDeclaration","scope":1479,"src":"5366:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1421,"name":"address","nodeType":"ElementaryTypeName","src":"5366:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5341:38:4"},"scope":1480,"src":"5257:775:4","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":1481,"src":"374:5660:4","usedErrors":[]}],"src":"42:5993:4"},"id":4},"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol","exportedSymbols":{"OwnerManager":[1991],"SelfAuthorized":[2073]},"id":1992,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1482,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:5"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol","file":"../common/SelfAuthorized.sol","id":1483,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1992,"sourceUnit":2074,"src":"74:38:5","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":1485,"name":"SelfAuthorized","nodeType":"IdentifierPath","referencedDeclaration":2073,"src":"323:14:5"},"id":1486,"nodeType":"InheritanceSpecifier","src":"323:14:5"}],"canonicalName":"OwnerManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":1484,"nodeType":"StructuredDocumentation","src":"114:184:5","text":"@title OwnerManager - Manages a set of owners and a threshold to perform actions.\n @author Stefan George - \n @author Richard Meissner - "},"fullyImplemented":true,"id":1991,"linearizedBaseContracts":[1991,2073],"name":"OwnerManager","nameLocation":"307:12:5","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26","id":1490,"name":"AddedOwner","nameLocation":"350:10:5","nodeType":"EventDefinition","parameters":{"id":1489,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1488,"indexed":false,"mutability":"mutable","name":"owner","nameLocation":"369:5:5","nodeType":"VariableDeclaration","scope":1490,"src":"361:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1487,"name":"address","nodeType":"ElementaryTypeName","src":"361:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"360:15:5"},"src":"344:32:5"},{"anonymous":false,"eventSelector":"f8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf","id":1494,"name":"RemovedOwner","nameLocation":"387:12:5","nodeType":"EventDefinition","parameters":{"id":1493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1492,"indexed":false,"mutability":"mutable","name":"owner","nameLocation":"408:5:5","nodeType":"VariableDeclaration","scope":1494,"src":"400:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1491,"name":"address","nodeType":"ElementaryTypeName","src":"400:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"399:15:5"},"src":"381:34:5"},{"anonymous":false,"eventSelector":"610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93","id":1498,"name":"ChangedThreshold","nameLocation":"426:16:5","nodeType":"EventDefinition","parameters":{"id":1497,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1496,"indexed":false,"mutability":"mutable","name":"threshold","nameLocation":"451:9:5","nodeType":"VariableDeclaration","scope":1498,"src":"443:17:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1495,"name":"uint256","nodeType":"ElementaryTypeName","src":"443:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"442:19:5"},"src":"420:42:5"},{"constant":true,"id":1504,"mutability":"constant","name":"SENTINEL_OWNERS","nameLocation":"494:15:5","nodeType":"VariableDeclaration","scope":1991,"src":"468:56:5","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1499,"name":"address","nodeType":"ElementaryTypeName","src":"468:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307831","id":1502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"520:3:5","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"0x1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":1501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"512:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1500,"name":"address","nodeType":"ElementaryTypeName","src":"512:7:5","typeDescriptions":{}}},"id":1503,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"512:12:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1508,"mutability":"mutable","name":"owners","nameLocation":"568:6:5","nodeType":"VariableDeclaration","scope":1991,"src":"531:43:5","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":1507,"keyType":{"id":1505,"name":"address","nodeType":"ElementaryTypeName","src":"539:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"531:27:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":1506,"name":"address","nodeType":"ElementaryTypeName","src":"550:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":1510,"mutability":"mutable","name":"ownerCount","nameLocation":"597:10:5","nodeType":"VariableDeclaration","scope":1991,"src":"580:27:5","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1509,"name":"uint256","nodeType":"ElementaryTypeName","src":"580:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1512,"mutability":"mutable","name":"threshold","nameLocation":"630:9:5","nodeType":"VariableDeclaration","scope":1991,"src":"613:26:5","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1511,"name":"uint256","nodeType":"ElementaryTypeName","src":"613:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"body":{"id":1628,"nodeType":"Block","src":"911:1060:5","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1522,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"1053:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1066:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1053:14:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323030","id":1525,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1069:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a328c389014707497c45ecba7527a678d30fabfd6868fe8bade352062f7774b","typeString":"literal_string \"GS200\""},"value":"GS200"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3a328c389014707497c45ecba7527a678d30fabfd6868fe8bade352062f7774b","typeString":"literal_string \"GS200\""}],"id":1521,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1045:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1045:32:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1527,"nodeType":"ExpressionStatement","src":"1045:32:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1532,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1529,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1518,"src":"1170:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":1530,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1516,"src":"1184:7:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1531,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1184:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1170:28:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323031","id":1533,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1200:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""},"value":"GS201"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""}],"id":1528,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1162:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1162:46:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1535,"nodeType":"ExpressionStatement","src":"1162:46:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1537,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1518,"src":"1278:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"31","id":1538,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1292:1:5","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1278:15:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323032","id":1540,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1295:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b","typeString":"literal_string \"GS202\""},"value":"GS202"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b","typeString":"literal_string \"GS202\""}],"id":1536,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1270:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1270:33:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1542,"nodeType":"ExpressionStatement","src":"1270:33:5"},{"assignments":[1544],"declarations":[{"constant":false,"id":1544,"mutability":"mutable","name":"currentOwner","nameLocation":"1358:12:5","nodeType":"VariableDeclaration","scope":1628,"src":"1350:20:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1543,"name":"address","nodeType":"ElementaryTypeName","src":"1350:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1546,"initialValue":{"id":1545,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"1373:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1350:38:5"},{"body":{"id":1611,"nodeType":"Block","src":"1443:405:5","statements":[{"assignments":[1559],"declarations":[{"constant":false,"id":1559,"mutability":"mutable","name":"owner","nameLocation":"1510:5:5","nodeType":"VariableDeclaration","scope":1611,"src":"1502:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1558,"name":"address","nodeType":"ElementaryTypeName","src":"1502:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1563,"initialValue":{"baseExpression":{"id":1560,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1516,"src":"1518:7:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1562,"indexExpression":{"id":1561,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"1526:1:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1518:10:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1502:26:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1581,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1574,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1565,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1550:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1567:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1567,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1559:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1566,"name":"address","nodeType":"ElementaryTypeName","src":"1559:7:5","typeDescriptions":{}}},"id":1569,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1559:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1550:19:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1573,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1571,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1573:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1572,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"1582:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1573:24:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1550:47:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1575,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1601:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":1578,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1618:4:5","typeDescriptions":{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}],"id":1577,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1610:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1576,"name":"address","nodeType":"ElementaryTypeName","src":"1610:7:5","typeDescriptions":{}}},"id":1579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1610:13:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1601:22:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1550:73:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1584,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1582,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1544,"src":"1627:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1583,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1643:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1627:21:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1550:98:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323033","id":1586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1650:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""},"value":"GS203"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""}],"id":1564,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1542:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1542:116:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1588,"nodeType":"ExpressionStatement","src":"1542:116:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1590,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"1724:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1592,"indexExpression":{"id":1591,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1731:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1724:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1749:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1594,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1741:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1593,"name":"address","nodeType":"ElementaryTypeName","src":"1741:7:5","typeDescriptions":{}}},"id":1596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1741:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1724:27:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323034","id":1598,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1753:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""},"value":"GS204"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""}],"id":1589,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1716:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1716:45:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1600,"nodeType":"ExpressionStatement","src":"1716:45:5"},{"expression":{"id":1605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1601,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"1775:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1603,"indexExpression":{"id":1602,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1544,"src":"1782:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1775:20:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1604,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1798:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1775:28:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1606,"nodeType":"ExpressionStatement","src":"1775:28:5"},{"expression":{"id":1609,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1607,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1544,"src":"1817:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1608,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1559,"src":"1832:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1817:20:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1610,"nodeType":"ExpressionStatement","src":"1817:20:5"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1551,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"1418:1:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":1552,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1516,"src":"1422:7:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1422:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1418:18:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1612,"initializationExpression":{"assignments":[1548],"declarations":[{"constant":false,"id":1548,"mutability":"mutable","name":"i","nameLocation":"1411:1:5","nodeType":"VariableDeclaration","scope":1612,"src":"1403:9:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1547,"name":"uint256","nodeType":"ElementaryTypeName","src":"1403:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1550,"initialValue":{"hexValue":"30","id":1549,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1415:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"1403:13:5"},"loopExpression":{"expression":{"id":1556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"1438:3:5","subExpression":{"id":1555,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"1438:1:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1557,"nodeType":"ExpressionStatement","src":"1438:3:5"},"nodeType":"ForStatement","src":"1398:450:5"},{"expression":{"id":1617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1613,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"1857:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1615,"indexExpression":{"id":1614,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1544,"src":"1864:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1857:20:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1616,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"1880:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1857:38:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1618,"nodeType":"ExpressionStatement","src":"1857:38:5"},{"expression":{"id":1622,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1619,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"1905:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":1620,"name":"_owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1516,"src":"1918:7:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1621,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1918:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1905:27:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1623,"nodeType":"ExpressionStatement","src":"1905:27:5"},{"expression":{"id":1626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1624,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"1942:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1625,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1518,"src":"1954:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1942:22:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1627,"nodeType":"ExpressionStatement","src":"1942:22:5"}]},"documentation":{"id":1513,"nodeType":"StructuredDocumentation","src":"646:184:5","text":"@dev Setup function sets initial storage of contract.\n @param _owners List of Safe owners.\n @param _threshold Number of required confirmations for a Safe transaction."},"id":1629,"implemented":true,"kind":"function","modifiers":[],"name":"setupOwners","nameLocation":"844:11:5","nodeType":"FunctionDefinition","parameters":{"id":1519,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1516,"mutability":"mutable","name":"_owners","nameLocation":"873:7:5","nodeType":"VariableDeclaration","scope":1629,"src":"856:24:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":1514,"name":"address","nodeType":"ElementaryTypeName","src":"856:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1515,"nodeType":"ArrayTypeName","src":"856:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":1518,"mutability":"mutable","name":"_threshold","nameLocation":"890:10:5","nodeType":"VariableDeclaration","scope":1629,"src":"882:18:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1517,"name":"uint256","nodeType":"ElementaryTypeName","src":"882:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"855:46:5"},"returnParameters":{"id":1520,"nodeType":"ParameterList","parameters":[],"src":"911:0:5"},"scope":1991,"src":"835:1136:5","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1701,"nodeType":"Block","src":"2389:541:5","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1649,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1645,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1640,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2481:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1643,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2498:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1642,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2490:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1641,"name":"address","nodeType":"ElementaryTypeName","src":"2490:7:5","typeDescriptions":{}}},"id":1644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2490:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2481:19:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1646,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2504:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1647,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"2513:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2504:24:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2481:47:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1650,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2532:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":1653,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2549:4:5","typeDescriptions":{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}],"id":1652,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2541:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1651,"name":"address","nodeType":"ElementaryTypeName","src":"2541:7:5","typeDescriptions":{}}},"id":1654,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2541:13:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2532:22:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2481:73:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323033","id":1657,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2556:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""},"value":"GS203"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""}],"id":1639,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2473:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2473:91:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1659,"nodeType":"ExpressionStatement","src":"2473:91:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1661,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"2622:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1663,"indexExpression":{"id":1662,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2629:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2622:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1666,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2647:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1665,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2639:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1664,"name":"address","nodeType":"ElementaryTypeName","src":"2639:7:5","typeDescriptions":{}}},"id":1667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2639:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2622:27:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323034","id":1669,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2651:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""},"value":"GS204"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""}],"id":1660,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2614:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1670,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2614:45:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1671,"nodeType":"ExpressionStatement","src":"2614:45:5"},{"expression":{"id":1678,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1672,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"2669:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1674,"indexExpression":{"id":1673,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2676:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2669:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1675,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"2685:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1677,"indexExpression":{"id":1676,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"2692:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2685:23:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2669:39:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1679,"nodeType":"ExpressionStatement","src":"2669:39:5"},{"expression":{"id":1684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1680,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"2718:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1682,"indexExpression":{"id":1681,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"2725:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2718:23:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1683,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2744:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2718:31:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1685,"nodeType":"ExpressionStatement","src":"2718:31:5"},{"expression":{"id":1687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2759:12:5","subExpression":{"id":1686,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"2759:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1688,"nodeType":"ExpressionStatement","src":"2759:12:5"},{"eventCall":{"arguments":[{"id":1690,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1632,"src":"2797:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1689,"name":"AddedOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1490,"src":"2786:10:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2786:17:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1692,"nodeType":"EmitStatement","src":"2781:22:5"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1693,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"2871:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1694,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1634,"src":"2884:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2871:23:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1700,"nodeType":"IfStatement","src":"2867:56:5","trueBody":{"expression":{"arguments":[{"id":1697,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1634,"src":"2912:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1696,"name":"changeThreshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1910,"src":"2896:15:5","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":1698,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2896:27:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1699,"nodeType":"ExpressionStatement","src":"2896:27:5"}}]},"documentation":{"id":1630,"nodeType":"StructuredDocumentation","src":"1977:323:5","text":"@dev Allows to add a new owner to the Safe and update the threshold at the same time.\n This can only be done via a Safe transaction.\n @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\n @param owner New owner address.\n @param _threshold New threshold."},"functionSelector":"0d582f13","id":1702,"implemented":true,"kind":"function","modifiers":[{"id":1637,"kind":"modifierInvocation","modifierName":{"id":1636,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"2378:10:5"},"nodeType":"ModifierInvocation","src":"2378:10:5"}],"name":"addOwnerWithThreshold","nameLocation":"2314:21:5","nodeType":"FunctionDefinition","parameters":{"id":1635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1632,"mutability":"mutable","name":"owner","nameLocation":"2344:5:5","nodeType":"VariableDeclaration","scope":1702,"src":"2336:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1631,"name":"address","nodeType":"ElementaryTypeName","src":"2336:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1634,"mutability":"mutable","name":"_threshold","nameLocation":"2359:10:5","nodeType":"VariableDeclaration","scope":1702,"src":"2351:18:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1633,"name":"uint256","nodeType":"ElementaryTypeName","src":"2351:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2335:35:5"},"returnParameters":{"id":1638,"nodeType":"ParameterList","parameters":[],"src":"2389:0:5"},"scope":1991,"src":"2305:625:5","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1778,"nodeType":"Block","src":"3494:604:5","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1719,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1715,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"3589:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":1716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3602:1:5","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3589:14:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":1718,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1709,"src":"3607:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3589:28:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323031","id":1720,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3619:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""},"value":"GS201"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""}],"id":1714,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3581:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3581:46:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1722,"nodeType":"ExpressionStatement","src":"3581:46:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1729,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1724,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3725:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3742:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1726,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3734:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1725,"name":"address","nodeType":"ElementaryTypeName","src":"3734:7:5","typeDescriptions":{}}},"id":1728,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3734:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3725:19:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1732,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1730,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3748:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1731,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"3757:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3748:24:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3725:47:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323033","id":1734,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3774:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""},"value":"GS203"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""}],"id":1723,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3717:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1735,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3717:65:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1736,"nodeType":"ExpressionStatement","src":"3717:65:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1742,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1738,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"3800:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1740,"indexExpression":{"id":1739,"name":"prevOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1705,"src":"3807:9:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3800:17:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1741,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3821:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3800:26:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323035","id":1743,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3828:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39","typeString":"literal_string \"GS205\""},"value":"GS205"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39","typeString":"literal_string \"GS205\""}],"id":1737,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3792:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1744,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3792:44:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1745,"nodeType":"ExpressionStatement","src":"3792:44:5"},{"expression":{"id":1752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1746,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"3846:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1748,"indexExpression":{"id":1747,"name":"prevOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1705,"src":"3853:9:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3846:17:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1749,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"3866:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1751,"indexExpression":{"id":1750,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3873:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3866:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3846:33:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1753,"nodeType":"ExpressionStatement","src":"3846:33:5"},{"expression":{"id":1761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1754,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"3889:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1756,"indexExpression":{"id":1755,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3896:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3889:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":1759,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3913:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1758,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3905:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1757,"name":"address","nodeType":"ElementaryTypeName","src":"3905:7:5","typeDescriptions":{}}},"id":1760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3905:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3889:26:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1762,"nodeType":"ExpressionStatement","src":"3889:26:5"},{"expression":{"id":1764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"3925:12:5","subExpression":{"id":1763,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"3925:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1765,"nodeType":"ExpressionStatement","src":"3925:12:5"},{"eventCall":{"arguments":[{"id":1767,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1707,"src":"3965:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1766,"name":"RemovedOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1494,"src":"3952:12:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3952:19:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1769,"nodeType":"EmitStatement","src":"3947:24:5"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1770,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"4039:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1771,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1709,"src":"4052:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4039:23:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1777,"nodeType":"IfStatement","src":"4035:56:5","trueBody":{"expression":{"arguments":[{"id":1774,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1709,"src":"4080:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1773,"name":"changeThreshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1910,"src":"4064:15:5","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":1775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4064:27:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1776,"nodeType":"ExpressionStatement","src":"4064:27:5"}}]},"documentation":{"id":1703,"nodeType":"StructuredDocumentation","src":"2936:430:5","text":"@dev Allows to remove an owner from the Safe and update the threshold at the same time.\n This can only be done via a Safe transaction.\n @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\n @param prevOwner Owner that pointed to the owner to be removed in the linked list\n @param owner Owner address to be removed.\n @param _threshold New threshold."},"functionSelector":"f8dc5dd9","id":1779,"implemented":true,"kind":"function","modifiers":[{"id":1712,"kind":"modifierInvocation","modifierName":{"id":1711,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"3483:10:5"},"nodeType":"ModifierInvocation","src":"3483:10:5"}],"name":"removeOwner","nameLocation":"3380:11:5","nodeType":"FunctionDefinition","parameters":{"id":1710,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1705,"mutability":"mutable","name":"prevOwner","nameLocation":"3409:9:5","nodeType":"VariableDeclaration","scope":1779,"src":"3401:17:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1704,"name":"address","nodeType":"ElementaryTypeName","src":"3401:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1707,"mutability":"mutable","name":"owner","nameLocation":"3436:5:5","nodeType":"VariableDeclaration","scope":1779,"src":"3428:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1706,"name":"address","nodeType":"ElementaryTypeName","src":"3428:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1709,"mutability":"mutable","name":"_threshold","nameLocation":"3459:10:5","nodeType":"VariableDeclaration","scope":1779,"src":"3451:18:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1708,"name":"uint256","nodeType":"ElementaryTypeName","src":"3451:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3391:84:5"},"returnParameters":{"id":1713,"nodeType":"ParameterList","parameters":[],"src":"3494:0:5"},"scope":1991,"src":"3371:727:5","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1878,"nodeType":"Block","src":"4629:704:5","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1792,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4721:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4741:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1794,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4733:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1793,"name":"address","nodeType":"ElementaryTypeName","src":"4733:7:5","typeDescriptions":{}}},"id":1796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4733:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4721:22:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1800,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1798,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4747:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1799,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"4759:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4747:27:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4721:53:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1802,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4778:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":1805,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4798:4:5","typeDescriptions":{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OwnerManager_$1991","typeString":"contract OwnerManager"}],"id":1804,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4790:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1803,"name":"address","nodeType":"ElementaryTypeName","src":"4790:7:5","typeDescriptions":{}}},"id":1806,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4790:13:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4778:25:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4721:82:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323033","id":1809,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4805:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""},"value":"GS203"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""}],"id":1791,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4713:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1810,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4713:100:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1811,"nodeType":"ExpressionStatement","src":"4713:100:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1813,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"4871:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1815,"indexExpression":{"id":1814,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"4878:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4871:16:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":1818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4899:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1817,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4891:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1816,"name":"address","nodeType":"ElementaryTypeName","src":"4891:7:5","typeDescriptions":{}}},"id":1819,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4891:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4871:30:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323034","id":1821,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4903:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""},"value":"GS204"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597","typeString":"literal_string \"GS204\""}],"id":1812,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4863:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4863:48:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1823,"nodeType":"ExpressionStatement","src":"4863:48:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1825,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5012:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1828,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5032:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1827,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5024:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1826,"name":"address","nodeType":"ElementaryTypeName","src":"5024:7:5","typeDescriptions":{}}},"id":1829,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5024:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5012:22:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1831,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5038:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1832,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"5050:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5038:27:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5012:53:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323033","id":1835,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5067:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""},"value":"GS203"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300","typeString":"literal_string \"GS203\""}],"id":1824,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5004:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1836,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5004:71:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1837,"nodeType":"ExpressionStatement","src":"5004:71:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1839,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"5093:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1841,"indexExpression":{"id":1840,"name":"prevOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1782,"src":"5100:9:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5093:17:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1842,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5114:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5093:29:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323035","id":1844,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5124:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39","typeString":"literal_string \"GS205\""},"value":"GS205"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39","typeString":"literal_string \"GS205\""}],"id":1838,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5085:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5085:47:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1846,"nodeType":"ExpressionStatement","src":"5085:47:5"},{"expression":{"id":1853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1847,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"5142:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1849,"indexExpression":{"id":1848,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5149:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5142:16:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1850,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"5161:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1852,"indexExpression":{"id":1851,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5168:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5161:16:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5142:35:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1854,"nodeType":"ExpressionStatement","src":"5142:35:5"},{"expression":{"id":1859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1855,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"5187:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1857,"indexExpression":{"id":1856,"name":"prevOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1782,"src":"5194:9:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5187:17:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1858,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5207:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5187:28:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1860,"nodeType":"ExpressionStatement","src":"5187:28:5"},{"expression":{"id":1868,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1861,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"5225:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1863,"indexExpression":{"id":1862,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5232:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5225:16:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":1866,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5252:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1865,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5244:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1864,"name":"address","nodeType":"ElementaryTypeName","src":"5244:7:5","typeDescriptions":{}}},"id":1867,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5244:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5225:29:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1869,"nodeType":"ExpressionStatement","src":"5225:29:5"},{"eventCall":{"arguments":[{"id":1871,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1784,"src":"5282:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1870,"name":"RemovedOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1494,"src":"5269:12:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1872,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5269:22:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1873,"nodeType":"EmitStatement","src":"5264:27:5"},{"eventCall":{"arguments":[{"id":1875,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1786,"src":"5317:8:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1874,"name":"AddedOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1490,"src":"5306:10:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":1876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5306:20:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1877,"nodeType":"EmitStatement","src":"5301:25:5"}]},"documentation":{"id":1780,"nodeType":"StructuredDocumentation","src":"4104:398:5","text":"@dev Allows to swap/replace an owner from the Safe with another address.\n This can only be done via a Safe transaction.\n @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\n @param prevOwner Owner that pointed to the owner to be replaced in the linked list\n @param oldOwner Owner address to be replaced.\n @param newOwner New owner address."},"functionSelector":"e318b52b","id":1879,"implemented":true,"kind":"function","modifiers":[{"id":1789,"kind":"modifierInvocation","modifierName":{"id":1788,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"4618:10:5"},"nodeType":"ModifierInvocation","src":"4618:10:5"}],"name":"swapOwner","nameLocation":"4516:9:5","nodeType":"FunctionDefinition","parameters":{"id":1787,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1782,"mutability":"mutable","name":"prevOwner","nameLocation":"4543:9:5","nodeType":"VariableDeclaration","scope":1879,"src":"4535:17:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1781,"name":"address","nodeType":"ElementaryTypeName","src":"4535:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1784,"mutability":"mutable","name":"oldOwner","nameLocation":"4570:8:5","nodeType":"VariableDeclaration","scope":1879,"src":"4562:16:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1783,"name":"address","nodeType":"ElementaryTypeName","src":"4562:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1786,"mutability":"mutable","name":"newOwner","nameLocation":"4596:8:5","nodeType":"VariableDeclaration","scope":1879,"src":"4588:16:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1785,"name":"address","nodeType":"ElementaryTypeName","src":"4588:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4525:85:5"},"returnParameters":{"id":1790,"nodeType":"ParameterList","parameters":[],"src":"4629:0:5"},"scope":1991,"src":"4507:826:5","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1909,"nodeType":"Block","src":"5652:297:5","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1888,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1882,"src":"5739:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":1889,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"5753:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5739:24:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323031","id":1891,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5765:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""},"value":"GS201"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7","typeString":"literal_string \"GS201\""}],"id":1887,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5731:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1892,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5731:42:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1893,"nodeType":"ExpressionStatement","src":"5731:42:5"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1895,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1882,"src":"5843:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"31","id":1896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5857:1:5","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"5843:15:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753323032","id":1898,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5860:7:5","typeDescriptions":{"typeIdentifier":"t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b","typeString":"literal_string \"GS202\""},"value":"GS202"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b","typeString":"literal_string \"GS202\""}],"id":1894,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5835:7:5","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":1899,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5835:33:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1900,"nodeType":"ExpressionStatement","src":"5835:33:5"},{"expression":{"id":1903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1901,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"5878:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1902,"name":"_threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1882,"src":"5890:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5878:22:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1904,"nodeType":"ExpressionStatement","src":"5878:22:5"},{"eventCall":{"arguments":[{"id":1906,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"5932:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1905,"name":"ChangedThreshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1498,"src":"5915:16:5","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":1907,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5915:27:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1908,"nodeType":"EmitStatement","src":"5910:32:5"}]},"documentation":{"id":1880,"nodeType":"StructuredDocumentation","src":"5339:245:5","text":"@dev Allows to update the number of required confirmations by Safe owners.\n This can only be done via a Safe transaction.\n @notice Changes the threshold of the Safe to `_threshold`.\n @param _threshold New threshold."},"functionSelector":"694e80c3","id":1910,"implemented":true,"kind":"function","modifiers":[{"id":1885,"kind":"modifierInvocation","modifierName":{"id":1884,"name":"authorized","nodeType":"IdentifierPath","referencedDeclaration":2072,"src":"5641:10:5"},"nodeType":"ModifierInvocation","src":"5641:10:5"}],"name":"changeThreshold","nameLocation":"5598:15:5","nodeType":"FunctionDefinition","parameters":{"id":1883,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1882,"mutability":"mutable","name":"_threshold","nameLocation":"5622:10:5","nodeType":"VariableDeclaration","scope":1910,"src":"5614:18:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1881,"name":"uint256","nodeType":"ElementaryTypeName","src":"5614:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5613:20:5"},"returnParameters":{"id":1886,"nodeType":"ParameterList","parameters":[],"src":"5652:0:5"},"scope":1991,"src":"5589:360:5","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":1917,"nodeType":"Block","src":"6009:33:5","statements":[{"expression":{"id":1915,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1512,"src":"6026:9:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1914,"id":1916,"nodeType":"Return","src":"6019:16:5"}]},"functionSelector":"e75235b8","id":1918,"implemented":true,"kind":"function","modifiers":[],"name":"getThreshold","nameLocation":"5964:12:5","nodeType":"FunctionDefinition","parameters":{"id":1911,"nodeType":"ParameterList","parameters":[],"src":"5976:2:5"},"returnParameters":{"id":1914,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1913,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1918,"src":"6000:7:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1912,"name":"uint256","nodeType":"ElementaryTypeName","src":"6000:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5999:9:5"},"scope":1991,"src":"5955:87:5","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":1938,"nodeType":"Block","src":"6107:79:5","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1925,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1920,"src":"6124:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1926,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"6133:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6124:24:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":1928,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"6152:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1930,"indexExpression":{"id":1929,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1920,"src":"6159:5:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6152:13:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":1933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6177:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":1932,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6169:7:5","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1931,"name":"address","nodeType":"ElementaryTypeName","src":"6169:7:5","typeDescriptions":{}}},"id":1934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6169:10:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6152:27:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6124:55:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":1924,"id":1937,"nodeType":"Return","src":"6117:62:5"}]},"functionSelector":"2f54bf6e","id":1939,"implemented":true,"kind":"function","modifiers":[],"name":"isOwner","nameLocation":"6057:7:5","nodeType":"FunctionDefinition","parameters":{"id":1921,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1920,"mutability":"mutable","name":"owner","nameLocation":"6073:5:5","nodeType":"VariableDeclaration","scope":1939,"src":"6065:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1919,"name":"address","nodeType":"ElementaryTypeName","src":"6065:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6064:15:5"},"returnParameters":{"id":1924,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1923,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1939,"src":"6101:4:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1922,"name":"bool","nodeType":"ElementaryTypeName","src":"6101:4:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6100:6:5"},"scope":1991,"src":"6048:138:5","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":1989,"nodeType":"Block","src":"6328:377:5","statements":[{"assignments":[1950],"declarations":[{"constant":false,"id":1950,"mutability":"mutable","name":"array","nameLocation":"6355:5:5","nodeType":"VariableDeclaration","scope":1989,"src":"6338:22:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":1948,"name":"address","nodeType":"ElementaryTypeName","src":"6338:7:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1949,"nodeType":"ArrayTypeName","src":"6338:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"id":1956,"initialValue":{"arguments":[{"id":1954,"name":"ownerCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1510,"src":"6377:10:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1953,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"6363:13:5","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (address[] memory)"},"typeName":{"baseType":{"id":1951,"name":"address","nodeType":"ElementaryTypeName","src":"6367:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1952,"nodeType":"ArrayTypeName","src":"6367:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}}},"id":1955,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6363:25:5","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"nodeType":"VariableDeclarationStatement","src":"6338:50:5"},{"assignments":[1958],"declarations":[{"constant":false,"id":1958,"mutability":"mutable","name":"index","nameLocation":"6440:5:5","nodeType":"VariableDeclaration","scope":1989,"src":"6432:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1957,"name":"uint256","nodeType":"ElementaryTypeName","src":"6432:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1960,"initialValue":{"hexValue":"30","id":1959,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6448:1:5","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6432:17:5"},{"assignments":[1962],"declarations":[{"constant":false,"id":1962,"mutability":"mutable","name":"currentOwner","nameLocation":"6467:12:5","nodeType":"VariableDeclaration","scope":1989,"src":"6459:20:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1961,"name":"address","nodeType":"ElementaryTypeName","src":"6459:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1966,"initialValue":{"baseExpression":{"id":1963,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"6482:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1965,"indexExpression":{"id":1964,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"6489:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6482:23:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6459:46:5"},{"body":{"id":1985,"nodeType":"Block","src":"6555:122:5","statements":[{"expression":{"id":1974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1970,"name":"array","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1950,"src":"6569:5:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":1972,"indexExpression":{"id":1971,"name":"index","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1958,"src":"6575:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6569:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1973,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1962,"src":"6584:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6569:27:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1975,"nodeType":"ExpressionStatement","src":"6569:27:5"},{"expression":{"id":1980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1976,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1962,"src":"6610:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1977,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1508,"src":"6625:6:5","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"}},"id":1979,"indexExpression":{"id":1978,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1962,"src":"6632:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6625:20:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6610:35:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1981,"nodeType":"ExpressionStatement","src":"6610:35:5"},{"expression":{"id":1983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6659:7:5","subExpression":{"id":1982,"name":"index","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1958,"src":"6659:5:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1984,"nodeType":"ExpressionStatement","src":"6659:7:5"}]},"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":1969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1967,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1962,"src":"6522:12:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":1968,"name":"SENTINEL_OWNERS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1504,"src":"6538:15:5","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6522:31:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1986,"nodeType":"WhileStatement","src":"6515:162:5"},{"expression":{"id":1987,"name":"array","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1950,"src":"6693:5:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"functionReturnParameters":1945,"id":1988,"nodeType":"Return","src":"6686:12:5"}]},"documentation":{"id":1940,"nodeType":"StructuredDocumentation","src":"6192:71:5","text":"@dev Returns array of owners.\n @return Array of Safe owners."},"functionSelector":"a0e67e2b","id":1990,"implemented":true,"kind":"function","modifiers":[],"name":"getOwners","nameLocation":"6277:9:5","nodeType":"FunctionDefinition","parameters":{"id":1941,"nodeType":"ParameterList","parameters":[],"src":"6286:2:5"},"returnParameters":{"id":1945,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1944,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1990,"src":"6310:16:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":1942,"name":"address","nodeType":"ElementaryTypeName","src":"6310:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1943,"nodeType":"ArrayTypeName","src":"6310:9:5","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"6309:18:5"},"scope":1991,"src":"6268:437:5","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":1992,"src":"298:6409:5","usedErrors":[]}],"src":"42:6666:5"},"id":5},"@gnosis.pm/safe-contracts/contracts/common/Enum.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Enum.sol","exportedSymbols":{"Enum":[1998]},"id":1999,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1993,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:6"},{"abstract":false,"baseContracts":[],"canonicalName":"Enum","contractDependencies":[],"contractKind":"contract","documentation":{"id":1994,"nodeType":"StructuredDocumentation","src":"75:89:6","text":"@title Enum - Collection of enums\n @author Richard Meissner - "},"fullyImplemented":true,"id":1998,"linearizedBaseContracts":[1998],"name":"Enum","nameLocation":"173:4:6","nodeType":"ContractDefinition","nodes":[{"canonicalName":"Enum.Operation","id":1997,"members":[{"id":1995,"name":"Call","nameLocation":"200:4:6","nodeType":"EnumValue","src":"200:4:6"},{"id":1996,"name":"DelegateCall","nameLocation":"206:12:6","nodeType":"EnumValue","src":"206:12:6"}],"name":"Operation","nameLocation":"189:9:6","nodeType":"EnumDefinition","src":"184:35:6"}],"scope":1999,"src":"164:57:6","usedErrors":[]}],"src":"42:180:6"},"id":6},"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol","exportedSymbols":{"EtherPaymentFallback":[2020]},"id":2021,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2000,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:7"},{"abstract":false,"baseContracts":[],"canonicalName":"EtherPaymentFallback","contractDependencies":[],"contractKind":"contract","documentation":{"id":2001,"nodeType":"StructuredDocumentation","src":"75:141:7","text":"@title EtherPaymentFallback - A contract that has a fallback to accept ether payments\n @author Richard Meissner - "},"fullyImplemented":true,"id":2020,"linearizedBaseContracts":[2020],"name":"EtherPaymentFallback","nameLocation":"225:20:7","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d","id":2007,"name":"SafeReceived","nameLocation":"258:12:7","nodeType":"EventDefinition","parameters":{"id":2006,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2003,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"287:6:7","nodeType":"VariableDeclaration","scope":2007,"src":"271:22:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2002,"name":"address","nodeType":"ElementaryTypeName","src":"271:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2005,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"303:5:7","nodeType":"VariableDeclaration","scope":2007,"src":"295:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2004,"name":"uint256","nodeType":"ElementaryTypeName","src":"295:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"270:39:7"},"src":"252:58:7"},{"body":{"id":2018,"nodeType":"Block","src":"402:57:7","statements":[{"eventCall":{"arguments":[{"expression":{"id":2012,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"430:3:7","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"430:10:7","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2014,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"442:3:7","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2015,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"442:9:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2011,"name":"SafeReceived","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2007,"src":"417:12:7","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":2016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"417:35:7","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2017,"nodeType":"EmitStatement","src":"412:40:7"}]},"documentation":{"id":2008,"nodeType":"StructuredDocumentation","src":"316:54:7","text":"@dev Fallback function accepts Ether transactions."},"id":2019,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2009,"nodeType":"ParameterList","parameters":[],"src":"382:2:7"},"returnParameters":{"id":2010,"nodeType":"ParameterList","parameters":[],"src":"402:0:7"},"scope":2020,"src":"375:84:7","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":2021,"src":"216:245:7","usedErrors":[]}],"src":"42:420:7"},"id":7},"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol","exportedSymbols":{"SecuredTokenTransfer":[2047]},"id":2048,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2022,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:8"},{"abstract":false,"baseContracts":[],"canonicalName":"SecuredTokenTransfer","contractDependencies":[],"contractKind":"contract","documentation":{"id":2023,"nodeType":"StructuredDocumentation","src":"75:107:8","text":"@title SecuredTokenTransfer - Secure token transfer\n @author Richard Meissner - "},"fullyImplemented":true,"id":2047,"linearizedBaseContracts":[2047],"name":"SecuredTokenTransfer","nameLocation":"191:20:8","nodeType":"ContractDefinition","nodes":[{"body":{"id":2045,"nodeType":"Block","src":"616:832:8","statements":[{"assignments":[2036],"declarations":[{"constant":false,"id":2036,"mutability":"mutable","name":"data","nameLocation":"700:4:8","nodeType":"VariableDeclaration","scope":2045,"src":"687:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2035,"name":"bytes","nodeType":"ElementaryTypeName","src":"687:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2043,"initialValue":{"arguments":[{"hexValue":"30786139303539636262","id":2039,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"730:10:8","typeDescriptions":{"typeIdentifier":"t_rational_2835717307_by_1","typeString":"int_const 2835717307"},"value":"0xa9059cbb"},{"id":2040,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2028,"src":"742:8:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2041,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2030,"src":"752:6:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_2835717307_by_1","typeString":"int_const 2835717307"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":2037,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"707:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":2038,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"707:22:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":2042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"707:52:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"687:72:8"},{"AST":{"nodeType":"YulBlock","src":"834:608:8","statements":[{"nodeType":"YulVariableDeclaration","src":"1015:87:8","value":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1039:3:8"},"nodeType":"YulFunctionCall","src":"1039:5:8"},{"kind":"number","nodeType":"YulLiteral","src":"1046:5:8","type":"","value":"10000"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1035:3:8"},"nodeType":"YulFunctionCall","src":"1035:17:8"},{"name":"token","nodeType":"YulIdentifier","src":"1054:5:8"},{"kind":"number","nodeType":"YulLiteral","src":"1061:1:8","type":"","value":"0"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1068:4:8"},{"kind":"number","nodeType":"YulLiteral","src":"1074:4:8","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1064:3:8"},"nodeType":"YulFunctionCall","src":"1064:15:8"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1087:4:8"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1081:5:8"},"nodeType":"YulFunctionCall","src":"1081:11:8"},{"kind":"number","nodeType":"YulLiteral","src":"1094:1:8","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1097:4:8","type":"","value":"0x20"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"1030:4:8"},"nodeType":"YulFunctionCall","src":"1030:72:8"},"variables":[{"name":"success","nodeType":"YulTypedName","src":"1019:7:8","type":""}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"1162:62:8","statements":[{"nodeType":"YulAssignment","src":"1184:22:8","value":{"name":"success","nodeType":"YulIdentifier","src":"1199:7:8"},"variableNames":[{"name":"transferred","nodeType":"YulIdentifier","src":"1184:11:8"}]}]},"nodeType":"YulCase","src":"1155:69:8","value":{"kind":"number","nodeType":"YulLiteral","src":"1160:1:8","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"1251:100:8","statements":[{"nodeType":"YulAssignment","src":"1273:60:8","value":{"arguments":[{"arguments":[{"arguments":[{"name":"success","nodeType":"YulIdentifier","src":"1305:7:8"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1298:6:8"},"nodeType":"YulFunctionCall","src":"1298:15:8"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1328:1:8","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1322:5:8"},"nodeType":"YulFunctionCall","src":"1322:8:8"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1315:6:8"},"nodeType":"YulFunctionCall","src":"1315:16:8"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1295:2:8"},"nodeType":"YulFunctionCall","src":"1295:37:8"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1288:6:8"},"nodeType":"YulFunctionCall","src":"1288:45:8"},"variableNames":[{"name":"transferred","nodeType":"YulIdentifier","src":"1273:11:8"}]}]},"nodeType":"YulCase","src":"1241:110:8","value":{"kind":"number","nodeType":"YulLiteral","src":"1246:4:8","type":"","value":"0x20"}},{"body":{"nodeType":"YulBlock","src":"1376:56:8","statements":[{"nodeType":"YulAssignment","src":"1398:16:8","value":{"kind":"number","nodeType":"YulLiteral","src":"1413:1:8","type":"","value":"0"},"variableNames":[{"name":"transferred","nodeType":"YulIdentifier","src":"1398:11:8"}]}]},"nodeType":"YulCase","src":"1368:64:8","value":"default"}],"expression":{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1122:14:8"},"nodeType":"YulFunctionCall","src":"1122:16:8"},"nodeType":"YulSwitch","src":"1115:317:8"}]},"evmVersion":"london","externalReferences":[{"declaration":2036,"isOffset":false,"isSlot":false,"src":"1068:4:8","valueSize":1},{"declaration":2036,"isOffset":false,"isSlot":false,"src":"1087:4:8","valueSize":1},{"declaration":2026,"isOffset":false,"isSlot":false,"src":"1054:5:8","valueSize":1},{"declaration":2033,"isOffset":false,"isSlot":false,"src":"1184:11:8","valueSize":1},{"declaration":2033,"isOffset":false,"isSlot":false,"src":"1273:11:8","valueSize":1},{"declaration":2033,"isOffset":false,"isSlot":false,"src":"1398:11:8","valueSize":1}],"id":2044,"nodeType":"InlineAssembly","src":"825:617:8"}]},"documentation":{"id":2024,"nodeType":"StructuredDocumentation","src":"218:255:8","text":"@dev Transfers a token and returns if it was a success\n @param token Token that should be transferred\n @param receiver Receiver to whom the token should be transferred\n @param amount The amount of tokens that should be transferred"},"id":2046,"implemented":true,"kind":"function","modifiers":[],"name":"transferToken","nameLocation":"487:13:8","nodeType":"FunctionDefinition","parameters":{"id":2031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2026,"mutability":"mutable","name":"token","nameLocation":"518:5:8","nodeType":"VariableDeclaration","scope":2046,"src":"510:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2025,"name":"address","nodeType":"ElementaryTypeName","src":"510:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2028,"mutability":"mutable","name":"receiver","nameLocation":"541:8:8","nodeType":"VariableDeclaration","scope":2046,"src":"533:16:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2027,"name":"address","nodeType":"ElementaryTypeName","src":"533:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2030,"mutability":"mutable","name":"amount","nameLocation":"567:6:8","nodeType":"VariableDeclaration","scope":2046,"src":"559:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2029,"name":"uint256","nodeType":"ElementaryTypeName","src":"559:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"500:79:8"},"returnParameters":{"id":2034,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2033,"mutability":"mutable","name":"transferred","nameLocation":"603:11:8","nodeType":"VariableDeclaration","scope":2046,"src":"598:16:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2032,"name":"bool","nodeType":"ElementaryTypeName","src":"598:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"597:18:8"},"scope":2047,"src":"478:970:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":2048,"src":"182:1268:8","usedErrors":[]}],"src":"42:1409:8"},"id":8},"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol","exportedSymbols":{"SelfAuthorized":[2073]},"id":2074,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2049,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:9"},{"abstract":false,"baseContracts":[],"canonicalName":"SelfAuthorized","contractDependencies":[],"contractKind":"contract","documentation":{"id":2050,"nodeType":"StructuredDocumentation","src":"75:126:9","text":"@title SelfAuthorized - authorizes current contract to perform actions\n @author Richard Meissner - "},"fullyImplemented":true,"id":2073,"linearizedBaseContracts":[2073],"name":"SelfAuthorized","nameLocation":"210:14:9","nodeType":"ContractDefinition","nodes":[{"body":{"id":2064,"nodeType":"Block","src":"271:62:9","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2054,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"289:3:9","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":2055,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"289:10:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":2058,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"311:4:9","typeDescriptions":{"typeIdentifier":"t_contract$_SelfAuthorized_$2073","typeString":"contract SelfAuthorized"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SelfAuthorized_$2073","typeString":"contract SelfAuthorized"}],"id":2057,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"303:7:9","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2056,"name":"address","nodeType":"ElementaryTypeName","src":"303:7:9","typeDescriptions":{}}},"id":2059,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"303:13:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"289:27:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4753303331","id":2061,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"318:7:9","typeDescriptions":{"typeIdentifier":"t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17","typeString":"literal_string \"GS031\""},"value":"GS031"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17","typeString":"literal_string \"GS031\""}],"id":2053,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"281:7:9","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"281:45:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2063,"nodeType":"ExpressionStatement","src":"281:45:9"}]},"id":2065,"implemented":true,"kind":"function","modifiers":[],"name":"requireSelfCall","nameLocation":"240:15:9","nodeType":"FunctionDefinition","parameters":{"id":2051,"nodeType":"ParameterList","parameters":[],"src":"255:2:9"},"returnParameters":{"id":2052,"nodeType":"ParameterList","parameters":[],"src":"271:0:9"},"scope":2073,"src":"231:102:9","stateMutability":"view","virtual":false,"visibility":"private"},{"body":{"id":2071,"nodeType":"Block","src":"361:114:9","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":2067,"name":"requireSelfCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2065,"src":"440:15:9","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":2068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"440:17:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2069,"nodeType":"ExpressionStatement","src":"440:17:9"},{"id":2070,"nodeType":"PlaceholderStatement","src":"467:1:9"}]},"id":2072,"name":"authorized","nameLocation":"348:10:9","nodeType":"ModifierDefinition","parameters":{"id":2066,"nodeType":"ParameterList","parameters":[],"src":"358:2:9"},"src":"339:136:9","virtual":false,"visibility":"internal"}],"scope":2074,"src":"201:276:9","usedErrors":[]}],"src":"42:436:9"},"id":9},"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol","exportedSymbols":{"SignatureDecoder":[2093]},"id":2094,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2075,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:10"},{"abstract":false,"baseContracts":[],"canonicalName":"SignatureDecoder","contractDependencies":[],"contractKind":"contract","documentation":{"id":2076,"nodeType":"StructuredDocumentation","src":"75:124:10","text":"@title SignatureDecoder - Decodes signatures that a encoded as bytes\n @author Richard Meissner - "},"fullyImplemented":true,"id":2093,"linearizedBaseContracts":[2093],"name":"SignatureDecoder","nameLocation":"208:16:10","nodeType":"ContractDefinition","nodes":[{"body":{"id":2091,"nodeType":"Block","src":"802:769:10","statements":[{"AST":{"nodeType":"YulBlock","src":"1035:530:10","statements":[{"nodeType":"YulVariableDeclaration","src":"1049:34:10","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1073:4:10","type":"","value":"0x41"},{"name":"pos","nodeType":"YulIdentifier","src":"1079:3:10"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"1069:3:10"},"nodeType":"YulFunctionCall","src":"1069:14:10"},"variables":[{"name":"signaturePos","nodeType":"YulTypedName","src":"1053:12:10","type":""}]},{"nodeType":"YulAssignment","src":"1096:52:10","value":{"arguments":[{"arguments":[{"name":"signatures","nodeType":"YulIdentifier","src":"1111:10:10"},{"arguments":[{"name":"signaturePos","nodeType":"YulIdentifier","src":"1127:12:10"},{"kind":"number","nodeType":"YulLiteral","src":"1141:4:10","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1123:3:10"},"nodeType":"YulFunctionCall","src":"1123:23:10"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1107:3:10"},"nodeType":"YulFunctionCall","src":"1107:40:10"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1101:5:10"},"nodeType":"YulFunctionCall","src":"1101:47:10"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"1096:1:10"}]},{"nodeType":"YulAssignment","src":"1161:52:10","value":{"arguments":[{"arguments":[{"name":"signatures","nodeType":"YulIdentifier","src":"1176:10:10"},{"arguments":[{"name":"signaturePos","nodeType":"YulIdentifier","src":"1192:12:10"},{"kind":"number","nodeType":"YulLiteral","src":"1206:4:10","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1188:3:10"},"nodeType":"YulFunctionCall","src":"1188:23:10"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1172:3:10"},"nodeType":"YulFunctionCall","src":"1172:40:10"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1166:5:10"},"nodeType":"YulFunctionCall","src":"1166:47:10"},"variableNames":[{"name":"s","nodeType":"YulIdentifier","src":"1161:1:10"}]},{"nodeType":"YulAssignment","src":"1492:63:10","value":{"arguments":[{"arguments":[{"arguments":[{"name":"signatures","nodeType":"YulIdentifier","src":"1511:10:10"},{"arguments":[{"name":"signaturePos","nodeType":"YulIdentifier","src":"1527:12:10"},{"kind":"number","nodeType":"YulLiteral","src":"1541:4:10","type":"","value":"0x41"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1523:3:10"},"nodeType":"YulFunctionCall","src":"1523:23:10"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1507:3:10"},"nodeType":"YulFunctionCall","src":"1507:40:10"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1501:5:10"},"nodeType":"YulFunctionCall","src":"1501:47:10"},{"kind":"number","nodeType":"YulLiteral","src":"1550:4:10","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1497:3:10"},"nodeType":"YulFunctionCall","src":"1497:58:10"},"variableNames":[{"name":"v","nodeType":"YulIdentifier","src":"1492:1:10"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2081,"isOffset":false,"isSlot":false,"src":"1079:3:10","valueSize":1},{"declaration":2086,"isOffset":false,"isSlot":false,"src":"1096:1:10","valueSize":1},{"declaration":2088,"isOffset":false,"isSlot":false,"src":"1161:1:10","valueSize":1},{"declaration":2079,"isOffset":false,"isSlot":false,"src":"1111:10:10","valueSize":1},{"declaration":2079,"isOffset":false,"isSlot":false,"src":"1176:10:10","valueSize":1},{"declaration":2079,"isOffset":false,"isSlot":false,"src":"1511:10:10","valueSize":1},{"declaration":2084,"isOffset":false,"isSlot":false,"src":"1492:1:10","valueSize":1}],"id":2090,"nodeType":"InlineAssembly","src":"1026:539:10"}]},"documentation":{"id":2077,"nodeType":"StructuredDocumentation","src":"231:376:10","text":"@dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\n @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\n @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\n @param signatures concatenated rsv signatures"},"id":2092,"implemented":true,"kind":"function","modifiers":[],"name":"signatureSplit","nameLocation":"621:14:10","nodeType":"FunctionDefinition","parameters":{"id":2082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2079,"mutability":"mutable","name":"signatures","nameLocation":"649:10:10","nodeType":"VariableDeclaration","scope":2092,"src":"636:23:10","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2078,"name":"bytes","nodeType":"ElementaryTypeName","src":"636:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2081,"mutability":"mutable","name":"pos","nameLocation":"669:3:10","nodeType":"VariableDeclaration","scope":2092,"src":"661:11:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2080,"name":"uint256","nodeType":"ElementaryTypeName","src":"661:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"635:38:10"},"returnParameters":{"id":2089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2084,"mutability":"mutable","name":"v","nameLocation":"740:1:10","nodeType":"VariableDeclaration","scope":2092,"src":"734:7:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":2083,"name":"uint8","nodeType":"ElementaryTypeName","src":"734:5:10","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":2086,"mutability":"mutable","name":"r","nameLocation":"763:1:10","nodeType":"VariableDeclaration","scope":2092,"src":"755:9:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2085,"name":"bytes32","nodeType":"ElementaryTypeName","src":"755:7:10","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2088,"mutability":"mutable","name":"s","nameLocation":"786:1:10","nodeType":"VariableDeclaration","scope":2092,"src":"778:9:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2087,"name":"bytes32","nodeType":"ElementaryTypeName","src":"778:7:10","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"720:77:10"},"scope":2093,"src":"612:959:10","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":2094,"src":"199:1374:10","usedErrors":[]}],"src":"42:1532:10"},"id":10},"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol","exportedSymbols":{"Singleton":[2099]},"id":2100,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2095,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:11"},{"abstract":false,"baseContracts":[],"canonicalName":"Singleton","contractDependencies":[],"contractKind":"contract","documentation":{"id":2096,"nodeType":"StructuredDocumentation","src":"75:246:11","text":"@title Singleton - Base for singleton contracts (should always be first super contract)\n This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\n @author Richard Meissner - "},"fullyImplemented":true,"id":2099,"linearizedBaseContracts":[2099],"name":"Singleton","nameLocation":"330:9:11","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":2098,"mutability":"mutable","name":"singleton","nameLocation":"583:9:11","nodeType":"VariableDeclaration","scope":2099,"src":"567:25:11","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2097,"name":"address","nodeType":"ElementaryTypeName","src":"567:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"}],"scope":2100,"src":"321:274:11","usedErrors":[]}],"src":"42:554:11"},"id":11},"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol","exportedSymbols":{"StorageAccessible":[2148]},"id":2149,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2101,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:12"},{"abstract":false,"baseContracts":[],"canonicalName":"StorageAccessible","contractDependencies":[],"contractKind":"contract","documentation":{"id":2102,"nodeType":"StructuredDocumentation","src":"75:240:12","text":"@title StorageAccessible - generic base contract that allows callers to access all internal storage.\n @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol"},"fullyImplemented":true,"id":2148,"linearizedBaseContracts":[2148],"name":"StorageAccessible","nameLocation":"324:17:12","nodeType":"ContractDefinition","nodes":[{"body":{"id":2136,"nodeType":"Block","src":"732:375:12","statements":[{"assignments":[2113],"declarations":[{"constant":false,"id":2113,"mutability":"mutable","name":"result","nameLocation":"755:6:12","nodeType":"VariableDeclaration","scope":2136,"src":"742:19:12","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2112,"name":"bytes","nodeType":"ElementaryTypeName","src":"742:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2120,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2116,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2107,"src":"774:6:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3332","id":2117,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"783:2:12","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"774:11:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2115,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"764:9:12","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":2114,"name":"bytes","nodeType":"ElementaryTypeName","src":"768:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":2119,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"764:22:12","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"742:44:12"},{"body":{"id":2132,"nodeType":"Block","src":"845:233:12","statements":[{"AST":{"nodeType":"YulBlock","src":"928:140:12","statements":[{"nodeType":"YulVariableDeclaration","src":"946:37:12","value":{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"968:6:12"},{"name":"index","nodeType":"YulIdentifier","src":"976:5:12"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"964:3:12"},"nodeType":"YulFunctionCall","src":"964:18:12"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"958:5:12"},"nodeType":"YulFunctionCall","src":"958:25:12"},"variables":[{"name":"word","nodeType":"YulTypedName","src":"950:4:12","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"result","nodeType":"YulIdentifier","src":"1015:6:12"},{"kind":"number","nodeType":"YulLiteral","src":"1023:4:12","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1011:3:12"},"nodeType":"YulFunctionCall","src":"1011:17:12"},{"arguments":[{"name":"index","nodeType":"YulIdentifier","src":"1034:5:12"},{"kind":"number","nodeType":"YulLiteral","src":"1041:4:12","type":"","value":"0x20"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"1030:3:12"},"nodeType":"YulFunctionCall","src":"1030:16:12"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1007:3:12"},"nodeType":"YulFunctionCall","src":"1007:40:12"},{"name":"word","nodeType":"YulIdentifier","src":"1049:4:12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1000:6:12"},"nodeType":"YulFunctionCall","src":"1000:54:12"},"nodeType":"YulExpressionStatement","src":"1000:54:12"}]},"evmVersion":"london","externalReferences":[{"declaration":2122,"isOffset":false,"isSlot":false,"src":"1034:5:12","valueSize":1},{"declaration":2122,"isOffset":false,"isSlot":false,"src":"976:5:12","valueSize":1},{"declaration":2105,"isOffset":false,"isSlot":false,"src":"968:6:12","valueSize":1},{"declaration":2113,"isOffset":false,"isSlot":false,"src":"1015:6:12","valueSize":1}],"id":2131,"nodeType":"InlineAssembly","src":"919:149:12"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2125,"name":"index","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2122,"src":"820:5:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2126,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2107,"src":"828:6:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"820:14:12","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2133,"initializationExpression":{"assignments":[2122],"declarations":[{"constant":false,"id":2122,"mutability":"mutable","name":"index","nameLocation":"809:5:12","nodeType":"VariableDeclaration","scope":2133,"src":"801:13:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2121,"name":"uint256","nodeType":"ElementaryTypeName","src":"801:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2124,"initialValue":{"hexValue":"30","id":2123,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"817:1:12","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"801:17:12"},"loopExpression":{"expression":{"id":2129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"836:7:12","subExpression":{"id":2128,"name":"index","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2122,"src":"836:5:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2130,"nodeType":"ExpressionStatement","src":"836:7:12"},"nodeType":"ForStatement","src":"796:282:12"},{"expression":{"id":2134,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2113,"src":"1094:6:12","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":2111,"id":2135,"nodeType":"Return","src":"1087:13:12"}]},"documentation":{"id":2103,"nodeType":"StructuredDocumentation","src":"348:290:12","text":" @dev Reads `length` bytes of storage in the currents contract\n @param offset - the offset in the current contract's storage in words to start reading from\n @param length - the number of words (32 bytes) of data to read\n @return the bytes that were read."},"functionSelector":"5624b25b","id":2137,"implemented":true,"kind":"function","modifiers":[],"name":"getStorageAt","nameLocation":"652:12:12","nodeType":"FunctionDefinition","parameters":{"id":2108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2105,"mutability":"mutable","name":"offset","nameLocation":"673:6:12","nodeType":"VariableDeclaration","scope":2137,"src":"665:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2104,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2107,"mutability":"mutable","name":"length","nameLocation":"689:6:12","nodeType":"VariableDeclaration","scope":2137,"src":"681:14:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2106,"name":"uint256","nodeType":"ElementaryTypeName","src":"681:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"664:32:12"},"returnParameters":{"id":2111,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2110,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2137,"src":"718:12:12","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2109,"name":"bytes","nodeType":"ElementaryTypeName","src":"718:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"717:14:12"},"scope":2148,"src":"643:464:12","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":2146,"nodeType":"Block","src":"1830:396:12","statements":[{"AST":{"nodeType":"YulBlock","src":"1905:315:12","statements":[{"nodeType":"YulVariableDeclaration","src":"1919:108:12","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1947:3:12"},"nodeType":"YulFunctionCall","src":"1947:5:12"},{"name":"targetContract","nodeType":"YulIdentifier","src":"1954:14:12"},{"arguments":[{"name":"calldataPayload","nodeType":"YulIdentifier","src":"1974:15:12"},{"kind":"number","nodeType":"YulLiteral","src":"1991:4:12","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1970:3:12"},"nodeType":"YulFunctionCall","src":"1970:26:12"},{"arguments":[{"name":"calldataPayload","nodeType":"YulIdentifier","src":"2004:15:12"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1998:5:12"},"nodeType":"YulFunctionCall","src":"1998:22:12"},{"kind":"number","nodeType":"YulLiteral","src":"2022:1:12","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2025:1:12","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"1934:12:12"},"nodeType":"YulFunctionCall","src":"1934:93:12"},"variables":[{"name":"success","nodeType":"YulTypedName","src":"1923:7:12","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2048:4:12","type":"","value":"0x00"},{"name":"success","nodeType":"YulIdentifier","src":"2054:7:12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2041:6:12"},"nodeType":"YulFunctionCall","src":"2041:21:12"},"nodeType":"YulExpressionStatement","src":"2041:21:12"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2082:4:12","type":"","value":"0x20"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2088:14:12"},"nodeType":"YulFunctionCall","src":"2088:16:12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2075:6:12"},"nodeType":"YulFunctionCall","src":"2075:30:12"},"nodeType":"YulExpressionStatement","src":"2075:30:12"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2133:4:12","type":"","value":"0x40"},{"kind":"number","nodeType":"YulLiteral","src":"2139:1:12","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2142:14:12"},"nodeType":"YulFunctionCall","src":"2142:16:12"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"2118:14:12"},"nodeType":"YulFunctionCall","src":"2118:41:12"},"nodeType":"YulExpressionStatement","src":"2118:41:12"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2179:1:12","type":"","value":"0"},{"arguments":[{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"2186:14:12"},"nodeType":"YulFunctionCall","src":"2186:16:12"},{"kind":"number","nodeType":"YulLiteral","src":"2204:4:12","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2182:3:12"},"nodeType":"YulFunctionCall","src":"2182:27:12"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2172:6:12"},"nodeType":"YulFunctionCall","src":"2172:38:12"},"nodeType":"YulExpressionStatement","src":"2172:38:12"}]},"evmVersion":"london","externalReferences":[{"declaration":2142,"isOffset":false,"isSlot":false,"src":"1974:15:12","valueSize":1},{"declaration":2142,"isOffset":false,"isSlot":false,"src":"2004:15:12","valueSize":1},{"declaration":2140,"isOffset":false,"isSlot":false,"src":"1954:14:12","valueSize":1}],"id":2145,"nodeType":"InlineAssembly","src":"1896:324:12"}]},"documentation":{"id":2138,"nodeType":"StructuredDocumentation","src":"1113:622:12","text":" @dev Performs a delegetecall on a targetContract in the context of self.\n Internally reverts execution to avoid side effects (making it static).\n This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\n Specifically, the `returndata` after a call to this method will be:\n `success:bool || response.length:uint256 || response:bytes`.\n @param targetContract Address of the contract containing the code to execute.\n @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments)."},"functionSelector":"b4faba09","id":2147,"implemented":true,"kind":"function","modifiers":[],"name":"simulateAndRevert","nameLocation":"1749:17:12","nodeType":"FunctionDefinition","parameters":{"id":2143,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2140,"mutability":"mutable","name":"targetContract","nameLocation":"1775:14:12","nodeType":"VariableDeclaration","scope":2147,"src":"1767:22:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2139,"name":"address","nodeType":"ElementaryTypeName","src":"1767:7:12","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2142,"mutability":"mutable","name":"calldataPayload","nameLocation":"1804:15:12","nodeType":"VariableDeclaration","scope":2147,"src":"1791:28:12","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2141,"name":"bytes","nodeType":"ElementaryTypeName","src":"1791:5:12","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1766:54:12"},"returnParameters":{"id":2144,"nodeType":"ParameterList","parameters":[],"src":"1830:0:12"},"scope":2148,"src":"1740:486:12","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2149,"src":"315:1913:12","usedErrors":[]}],"src":"42:2187:12"},"id":12},"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol","exportedSymbols":{"GnosisSafeStorage":[2180]},"id":2181,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2150,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:13"},{"abstract":false,"baseContracts":[],"canonicalName":"GnosisSafeStorage","contractDependencies":[],"contractKind":"contract","documentation":{"id":2151,"nodeType":"StructuredDocumentation","src":"75:143:13","text":"@title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\n @author Richard Meissner - "},"fullyImplemented":true,"id":2180,"linearizedBaseContracts":[2180],"name":"GnosisSafeStorage","nameLocation":"227:17:13","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":2153,"mutability":"mutable","name":"singleton","nameLocation":"302:9:13","nodeType":"VariableDeclaration","scope":2180,"src":"285:26:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2152,"name":"address","nodeType":"ElementaryTypeName","src":"285:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2157,"mutability":"mutable","name":"modules","nameLocation":"392:7:13","nodeType":"VariableDeclaration","scope":2180,"src":"355:44:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":2156,"keyType":{"id":2154,"name":"address","nodeType":"ElementaryTypeName","src":"363:7:13","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"355:27:13","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":2155,"name":"address","nodeType":"ElementaryTypeName","src":"374:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":2161,"mutability":"mutable","name":"owners","nameLocation":"479:6:13","nodeType":"VariableDeclaration","scope":2180,"src":"442:43:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":2160,"keyType":{"id":2158,"name":"address","nodeType":"ElementaryTypeName","src":"450:7:13","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"442:27:13","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":2159,"name":"address","nodeType":"ElementaryTypeName","src":"461:7:13","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":2163,"mutability":"mutable","name":"ownerCount","nameLocation":"508:10:13","nodeType":"VariableDeclaration","scope":2180,"src":"491:27:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2162,"name":"uint256","nodeType":"ElementaryTypeName","src":"491:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2165,"mutability":"mutable","name":"threshold","nameLocation":"541:9:13","nodeType":"VariableDeclaration","scope":2180,"src":"524:26:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2164,"name":"uint256","nodeType":"ElementaryTypeName","src":"524:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2167,"mutability":"mutable","name":"nonce","nameLocation":"602:5:13","nodeType":"VariableDeclaration","scope":2180,"src":"585:22:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2166,"name":"bytes32","nodeType":"ElementaryTypeName","src":"585:7:13","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2169,"mutability":"mutable","name":"domainSeparator","nameLocation":"630:15:13","nodeType":"VariableDeclaration","scope":2180,"src":"613:32:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2168,"name":"bytes32","nodeType":"ElementaryTypeName","src":"613:7:13","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2173,"mutability":"mutable","name":"signedMessages","nameLocation":"688:14:13","nodeType":"VariableDeclaration","scope":2180,"src":"651:51:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"typeName":{"id":2172,"keyType":{"id":2170,"name":"bytes32","nodeType":"ElementaryTypeName","src":"659:7:13","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"651:27:13","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":2171,"name":"uint256","nodeType":"ElementaryTypeName","src":"670:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"constant":false,"id":2179,"mutability":"mutable","name":"approvedHashes","nameLocation":"765:14:13","nodeType":"VariableDeclaration","scope":2180,"src":"708:71:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"typeName":{"id":2178,"keyType":{"id":2174,"name":"address","nodeType":"ElementaryTypeName","src":"716:7:13","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"708:47:13","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"valueType":{"id":2177,"keyType":{"id":2175,"name":"bytes32","nodeType":"ElementaryTypeName","src":"735:7:13","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"727:27:13","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":2176,"name":"uint256","nodeType":"ElementaryTypeName","src":"746:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"internal"}],"scope":2181,"src":"218:564:13","usedErrors":[]}],"src":"42:741:13"},"id":13},"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol","exportedSymbols":{"GnosisSafeMath":[2286]},"id":2287,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2182,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:14"},{"abstract":false,"baseContracts":[],"canonicalName":"GnosisSafeMath","contractDependencies":[],"contractKind":"library","documentation":{"id":2183,"nodeType":"StructuredDocumentation","src":"75:214:14","text":" @title GnosisSafeMath\n @dev Math operations with safety checks that revert on error\n Renamed from SafeMath to GnosisSafeMath to avoid conflicts\n TODO: remove once open zeppelin update to solc 0.5.0"},"fullyImplemented":true,"id":2286,"linearizedBaseContracts":[2286],"name":"GnosisSafeMath","nameLocation":"298:14:14","nodeType":"ContractDefinition","nodes":[{"body":{"id":2216,"nodeType":"Block","src":"459:354:14","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2195,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2193,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2186,"src":"690:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":2194,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"695:1:14","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"690:6:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2199,"nodeType":"IfStatement","src":"686:45:14","trueBody":{"id":2198,"nodeType":"Block","src":"698:33:14","statements":[{"expression":{"hexValue":"30","id":2196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"719:1:14","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":2192,"id":2197,"nodeType":"Return","src":"712:8:14"}]}},{"assignments":[2201],"declarations":[{"constant":false,"id":2201,"mutability":"mutable","name":"c","nameLocation":"749:1:14","nodeType":"VariableDeclaration","scope":2216,"src":"741:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2200,"name":"uint256","nodeType":"ElementaryTypeName","src":"741:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2205,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2202,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2186,"src":"753:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":2203,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2188,"src":"757:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"753:5:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"741:17:14"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2207,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2201,"src":"776:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":2208,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2186,"src":"780:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"776:5:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2210,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2188,"src":"785:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"776:10:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":2206,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"768:7:14","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":2212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"768:19:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2213,"nodeType":"ExpressionStatement","src":"768:19:14"},{"expression":{"id":2214,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2201,"src":"805:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2192,"id":2215,"nodeType":"Return","src":"798:8:14"}]},"documentation":{"id":2184,"nodeType":"StructuredDocumentation","src":"319:68:14","text":" @dev Multiplies two numbers, reverts on overflow."},"id":2217,"implemented":true,"kind":"function","modifiers":[],"name":"mul","nameLocation":"401:3:14","nodeType":"FunctionDefinition","parameters":{"id":2189,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2186,"mutability":"mutable","name":"a","nameLocation":"413:1:14","nodeType":"VariableDeclaration","scope":2217,"src":"405:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2185,"name":"uint256","nodeType":"ElementaryTypeName","src":"405:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2188,"mutability":"mutable","name":"b","nameLocation":"424:1:14","nodeType":"VariableDeclaration","scope":2217,"src":"416:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2187,"name":"uint256","nodeType":"ElementaryTypeName","src":"416:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"404:22:14"},"returnParameters":{"id":2192,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2191,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2217,"src":"450:7:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2190,"name":"uint256","nodeType":"ElementaryTypeName","src":"450:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"449:9:14"},"scope":2286,"src":"392:421:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2241,"nodeType":"Block","src":"1003:78:14","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2230,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2228,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2222,"src":"1021:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":2229,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2220,"src":"1026:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1021:6:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":2227,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1013:7:14","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":2231,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1013:15:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2232,"nodeType":"ExpressionStatement","src":"1013:15:14"},{"assignments":[2234],"declarations":[{"constant":false,"id":2234,"mutability":"mutable","name":"c","nameLocation":"1046:1:14","nodeType":"VariableDeclaration","scope":2241,"src":"1038:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2233,"name":"uint256","nodeType":"ElementaryTypeName","src":"1038:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2238,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2237,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2235,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2220,"src":"1050:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":2236,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2222,"src":"1054:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1050:5:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1038:17:14"},{"expression":{"id":2239,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2234,"src":"1073:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2226,"id":2240,"nodeType":"Return","src":"1066:8:14"}]},"documentation":{"id":2218,"nodeType":"StructuredDocumentation","src":"819:112:14","text":" @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend)."},"id":2242,"implemented":true,"kind":"function","modifiers":[],"name":"sub","nameLocation":"945:3:14","nodeType":"FunctionDefinition","parameters":{"id":2223,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2220,"mutability":"mutable","name":"a","nameLocation":"957:1:14","nodeType":"VariableDeclaration","scope":2242,"src":"949:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2219,"name":"uint256","nodeType":"ElementaryTypeName","src":"949:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2222,"mutability":"mutable","name":"b","nameLocation":"968:1:14","nodeType":"VariableDeclaration","scope":2242,"src":"960:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2221,"name":"uint256","nodeType":"ElementaryTypeName","src":"960:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"948:22:14"},"returnParameters":{"id":2226,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2225,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2242,"src":"994:7:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2224,"name":"uint256","nodeType":"ElementaryTypeName","src":"994:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"993:9:14"},"scope":2286,"src":"936:145:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2266,"nodeType":"Block","src":"1221:78:14","statements":[{"assignments":[2253],"declarations":[{"constant":false,"id":2253,"mutability":"mutable","name":"c","nameLocation":"1239:1:14","nodeType":"VariableDeclaration","scope":2266,"src":"1231:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2252,"name":"uint256","nodeType":"ElementaryTypeName","src":"1231:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2257,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2254,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2245,"src":"1243:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":2255,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2247,"src":"1247:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1243:5:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1231:17:14"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2259,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2253,"src":"1266:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":2260,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2245,"src":"1271:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1266:6:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":2258,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1258:7:14","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":2262,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1258:15:14","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2263,"nodeType":"ExpressionStatement","src":"1258:15:14"},{"expression":{"id":2264,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2253,"src":"1291:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2251,"id":2265,"nodeType":"Return","src":"1284:8:14"}]},"documentation":{"id":2243,"nodeType":"StructuredDocumentation","src":"1087:62:14","text":" @dev Adds two numbers, reverts on overflow."},"id":2267,"implemented":true,"kind":"function","modifiers":[],"name":"add","nameLocation":"1163:3:14","nodeType":"FunctionDefinition","parameters":{"id":2248,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2245,"mutability":"mutable","name":"a","nameLocation":"1175:1:14","nodeType":"VariableDeclaration","scope":2267,"src":"1167:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2244,"name":"uint256","nodeType":"ElementaryTypeName","src":"1167:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2247,"mutability":"mutable","name":"b","nameLocation":"1186:1:14","nodeType":"VariableDeclaration","scope":2267,"src":"1178:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2246,"name":"uint256","nodeType":"ElementaryTypeName","src":"1178:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1166:22:14"},"returnParameters":{"id":2251,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2250,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2267,"src":"1212:7:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2249,"name":"uint256","nodeType":"ElementaryTypeName","src":"1212:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1211:9:14"},"scope":2286,"src":"1154:145:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2284,"nodeType":"Block","src":"1436:38:14","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2277,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2270,"src":"1453:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":2278,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2272,"src":"1458:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1453:6:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":2281,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2272,"src":"1466:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"1453:14:14","trueExpression":{"id":2280,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2270,"src":"1462:1:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2276,"id":2283,"nodeType":"Return","src":"1446:21:14"}]},"documentation":{"id":2268,"nodeType":"StructuredDocumentation","src":"1305:59:14","text":" @dev Returns the largest of two numbers."},"id":2285,"implemented":true,"kind":"function","modifiers":[],"name":"max","nameLocation":"1378:3:14","nodeType":"FunctionDefinition","parameters":{"id":2273,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2270,"mutability":"mutable","name":"a","nameLocation":"1390:1:14","nodeType":"VariableDeclaration","scope":2285,"src":"1382:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2269,"name":"uint256","nodeType":"ElementaryTypeName","src":"1382:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2272,"mutability":"mutable","name":"b","nameLocation":"1401:1:14","nodeType":"VariableDeclaration","scope":2285,"src":"1393:9:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2271,"name":"uint256","nodeType":"ElementaryTypeName","src":"1393:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1381:22:14"},"returnParameters":{"id":2276,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2275,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2285,"src":"1427:7:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2274,"name":"uint256","nodeType":"ElementaryTypeName","src":"1427:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1426:9:14"},"scope":2286,"src":"1369:105:14","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":2287,"src":"290:1186:14","usedErrors":[]}],"src":"42:1435:14"},"id":14},"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol","exportedSymbols":{"DefaultCallbackHandler":[2412],"ERC1155TokenReceiver":[2450],"ERC721TokenReceiver":[2468],"ERC777TokensRecipient":[2486],"IERC165":[2498]},"id":2413,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2288,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:15"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol","file":"../interfaces/ERC1155TokenReceiver.sol","id":2289,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2413,"sourceUnit":2451,"src":"75:48:15","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol","file":"../interfaces/ERC721TokenReceiver.sol","id":2290,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2413,"sourceUnit":2469,"src":"124:47:15","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol","file":"../interfaces/ERC777TokensRecipient.sol","id":2291,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2413,"sourceUnit":2487,"src":"172:49:15","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol","file":"../interfaces/IERC165.sol","id":2292,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2413,"sourceUnit":2499,"src":"222:35:15","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":2294,"name":"ERC1155TokenReceiver","nodeType":"IdentifierPath","referencedDeclaration":2450,"src":"422:20:15"},"id":2295,"nodeType":"InheritanceSpecifier","src":"422:20:15"},{"baseName":{"id":2296,"name":"ERC777TokensRecipient","nodeType":"IdentifierPath","referencedDeclaration":2486,"src":"444:21:15"},"id":2297,"nodeType":"InheritanceSpecifier","src":"444:21:15"},{"baseName":{"id":2298,"name":"ERC721TokenReceiver","nodeType":"IdentifierPath","referencedDeclaration":2468,"src":"467:19:15"},"id":2299,"nodeType":"InheritanceSpecifier","src":"467:19:15"},{"baseName":{"id":2300,"name":"IERC165","nodeType":"IdentifierPath","referencedDeclaration":2498,"src":"488:7:15"},"id":2301,"nodeType":"InheritanceSpecifier","src":"488:7:15"}],"canonicalName":"DefaultCallbackHandler","contractDependencies":[],"contractKind":"contract","documentation":{"id":2293,"nodeType":"StructuredDocumentation","src":"259:128:15","text":"@title Default Callback Handler - returns true for known token callbacks\n @author Richard Meissner - "},"fullyImplemented":true,"id":2412,"linearizedBaseContracts":[2412,2498,2468,2486,2450],"name":"DefaultCallbackHandler","nameLocation":"396:22:15","nodeType":"ContractDefinition","nodes":[{"constant":true,"functionSelector":"a3f4df7e","id":2304,"mutability":"constant","name":"NAME","nameLocation":"525:4:15","nodeType":"VariableDeclaration","scope":2412,"src":"502:56:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2302,"name":"string","nodeType":"ElementaryTypeName","src":"502:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"44656661756c742043616c6c6261636b2048616e646c6572","id":2303,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"532:26:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_d9f4673df8041f58efa900bb2ad896c81d43067459342942ea342c4c043a7691","typeString":"literal_string \"Default Callback Handler\""},"value":"Default Callback Handler"},"visibility":"public"},{"constant":true,"functionSelector":"ffa1ad74","id":2307,"mutability":"constant","name":"VERSION","nameLocation":"587:7:15","nodeType":"VariableDeclaration","scope":2412,"src":"564:40:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2305,"name":"string","nodeType":"ElementaryTypeName","src":"564:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e302e30","id":2306,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"597:7:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c","typeString":"literal_string \"1.0.0\""},"value":"1.0.0"},"visibility":"public"},{"baseFunctions":[2431],"body":{"id":2325,"nodeType":"Block","src":"776:34:15","statements":[{"expression":{"hexValue":"30786632336136653631","id":2323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"793:10:15","typeDescriptions":{"typeIdentifier":"t_rational_4063915617_by_1","typeString":"int_const 4063915617"},"value":"0xf23a6e61"},"functionReturnParameters":2322,"id":2324,"nodeType":"Return","src":"786:17:15"}]},"functionSelector":"f23a6e61","id":2326,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"620:17:15","nodeType":"FunctionDefinition","overrides":{"id":2319,"nodeType":"OverrideSpecifier","overrides":[],"src":"750:8:15"},"parameters":{"id":2318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2309,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"647:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2308,"name":"address","nodeType":"ElementaryTypeName","src":"647:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2311,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"664:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2310,"name":"address","nodeType":"ElementaryTypeName","src":"664:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2313,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"681:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2312,"name":"uint256","nodeType":"ElementaryTypeName","src":"681:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2315,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"698:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2314,"name":"uint256","nodeType":"ElementaryTypeName","src":"698:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2317,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"715:14:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2316,"name":"bytes","nodeType":"ElementaryTypeName","src":"715:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"637:98:15"},"returnParameters":{"id":2322,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2321,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2326,"src":"768:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2320,"name":"bytes4","nodeType":"ElementaryTypeName","src":"768:6:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"767:8:15"},"scope":2412,"src":"611:199:15","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[2449],"body":{"id":2346,"nodeType":"Block","src":"1008:34:15","statements":[{"expression":{"hexValue":"30786263313937633831","id":2344,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1025:10:15","typeDescriptions":{"typeIdentifier":"t_rational_3155786881_by_1","typeString":"int_const 3155786881"},"value":"0xbc197c81"},"functionReturnParameters":2343,"id":2345,"nodeType":"Return","src":"1018:17:15"}]},"functionSelector":"bc197c81","id":2347,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"825:22:15","nodeType":"FunctionDefinition","overrides":{"id":2340,"nodeType":"OverrideSpecifier","overrides":[],"src":"982:8:15"},"parameters":{"id":2339,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2328,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"857:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2327,"name":"address","nodeType":"ElementaryTypeName","src":"857:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2330,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"874:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2329,"name":"address","nodeType":"ElementaryTypeName","src":"874:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2333,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"891:18:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":2331,"name":"uint256","nodeType":"ElementaryTypeName","src":"891:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2332,"nodeType":"ArrayTypeName","src":"891:9:15","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":2336,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"919:18:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":2334,"name":"uint256","nodeType":"ElementaryTypeName","src":"919:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2335,"nodeType":"ArrayTypeName","src":"919:9:15","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":2338,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"947:14:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2337,"name":"bytes","nodeType":"ElementaryTypeName","src":"947:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"847:120:15"},"returnParameters":{"id":2343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2342,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2347,"src":"1000:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2341,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1000:6:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"999:8:15"},"scope":2412,"src":"816:226:15","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[2467],"body":{"id":2363,"nodeType":"Block","src":"1195:34:15","statements":[{"expression":{"hexValue":"30783135306237613032","id":2361,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1212:10:15","typeDescriptions":{"typeIdentifier":"t_rational_353073666_by_1","typeString":"int_const 353073666"},"value":"0x150b7a02"},"functionReturnParameters":2360,"id":2362,"nodeType":"Return","src":"1205:17:15"}]},"functionSelector":"150b7a02","id":2364,"implemented":true,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"1057:16:15","nodeType":"FunctionDefinition","overrides":{"id":2357,"nodeType":"OverrideSpecifier","overrides":[],"src":"1169:8:15"},"parameters":{"id":2356,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2349,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2364,"src":"1083:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2348,"name":"address","nodeType":"ElementaryTypeName","src":"1083:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2351,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2364,"src":"1100:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2350,"name":"address","nodeType":"ElementaryTypeName","src":"1100:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2353,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2364,"src":"1117:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2352,"name":"uint256","nodeType":"ElementaryTypeName","src":"1117:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2355,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2364,"src":"1134:14:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2354,"name":"bytes","nodeType":"ElementaryTypeName","src":"1134:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1073:81:15"},"returnParameters":{"id":2360,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2359,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2364,"src":"1187:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2358,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1187:6:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1186:8:15"},"scope":2412,"src":"1048:181:15","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[2485],"body":{"id":2380,"nodeType":"Block","src":"1404:84:15","statements":[]},"functionSelector":"0023de29","id":2381,"implemented":true,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"1244:14:15","nodeType":"FunctionDefinition","overrides":{"id":2378,"nodeType":"OverrideSpecifier","overrides":[],"src":"1395:8:15"},"parameters":{"id":2377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2366,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1268:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2365,"name":"address","nodeType":"ElementaryTypeName","src":"1268:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2368,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1285:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2367,"name":"address","nodeType":"ElementaryTypeName","src":"1285:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2370,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1302:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2369,"name":"address","nodeType":"ElementaryTypeName","src":"1302:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2372,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1319:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2371,"name":"uint256","nodeType":"ElementaryTypeName","src":"1319:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2374,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1336:14:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2373,"name":"bytes","nodeType":"ElementaryTypeName","src":"1336:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2376,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2381,"src":"1360:14:15","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2375,"name":"bytes","nodeType":"ElementaryTypeName","src":"1360:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1258:122:15"},"returnParameters":{"id":2379,"nodeType":"ParameterList","parameters":[],"src":"1404:0:15"},"scope":2412,"src":"1235:253:15","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[2497],"body":{"id":2410,"nodeType":"Block","src":"1587:213:15","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2408,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":2394,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2389,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2383,"src":"1616:11:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":2391,"name":"ERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2450,"src":"1636:20:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155TokenReceiver_$2450_$","typeString":"type(contract ERC1155TokenReceiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC1155TokenReceiver_$2450_$","typeString":"type(contract ERC1155TokenReceiver)"}],"id":2390,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1631:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1631:26:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC1155TokenReceiver_$2450","typeString":"type(contract ERC1155TokenReceiver)"}},"id":2393,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1631:38:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1616:53:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":2400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2395,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2383,"src":"1685:11:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":2397,"name":"ERC721TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2468,"src":"1705:19:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721TokenReceiver_$2468_$","typeString":"type(contract ERC721TokenReceiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC721TokenReceiver_$2468_$","typeString":"type(contract ERC721TokenReceiver)"}],"id":2396,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1700:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2398,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1700:25:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC721TokenReceiver_$2468","typeString":"type(contract ERC721TokenReceiver)"}},"id":2399,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1700:37:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1685:52:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1616:121:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":2407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2402,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2383,"src":"1753:11:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":2404,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2498,"src":"1773:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$2498_$","typeString":"type(contract IERC165)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC165_$2498_$","typeString":"type(contract IERC165)"}],"id":2403,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1768:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1768:13:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC165_$2498","typeString":"type(contract IERC165)"}},"id":2406,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1768:25:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1753:40:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1616:177:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":2388,"id":2409,"nodeType":"Return","src":"1597:196:15"}]},"functionSelector":"01ffc9a7","id":2411,"implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"1503:17:15","nodeType":"FunctionDefinition","overrides":{"id":2385,"nodeType":"OverrideSpecifier","overrides":[],"src":"1563:8:15"},"parameters":{"id":2384,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2383,"mutability":"mutable","name":"interfaceId","nameLocation":"1528:11:15","nodeType":"VariableDeclaration","scope":2411,"src":"1521:18:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2382,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1521:6:15","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1520:20:15"},"returnParameters":{"id":2388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2387,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2411,"src":"1581:4:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2386,"name":"bool","nodeType":"ElementaryTypeName","src":"1581:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1580:6:15"},"scope":2412,"src":"1494:306:15","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":2413,"src":"387:1415:15","usedErrors":[]}],"src":"42:1761:15"},"id":15},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol","exportedSymbols":{"ERC1155TokenReceiver":[2450]},"id":2451,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2414,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:16"},{"abstract":false,"baseContracts":[],"canonicalName":"ERC1155TokenReceiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":2415,"nodeType":"StructuredDocumentation","src":"75:73:16","text":"Note: The ERC-165 identifier for this interface is 0x4e2312e0."},"fullyImplemented":false,"id":2450,"linearizedBaseContracts":[2450],"name":"ERC1155TokenReceiver","nameLocation":"159:20:16","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2416,"nodeType":"StructuredDocumentation","src":"186:1083:16","text":"@notice Handle the receipt of a single ERC1155 token type.\n@dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \nThis function MUST return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\nThis function MUST revert if it rejects the transfer.\nReturn of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n@param _operator The address which initiated the transfer (i.e. msg.sender)\n@param _from The address which previously owned the token\n@param _id The ID of the token being transferred\n@param _value The amount of tokens being transferred\n@param _data Additional data with no specified format\n@return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`"},"functionSelector":"f23a6e61","id":2431,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1283:17:16","nodeType":"FunctionDefinition","parameters":{"id":2427,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2418,"mutability":"mutable","name":"_operator","nameLocation":"1318:9:16","nodeType":"VariableDeclaration","scope":2431,"src":"1310:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2417,"name":"address","nodeType":"ElementaryTypeName","src":"1310:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2420,"mutability":"mutable","name":"_from","nameLocation":"1345:5:16","nodeType":"VariableDeclaration","scope":2431,"src":"1337:13:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2419,"name":"address","nodeType":"ElementaryTypeName","src":"1337:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2422,"mutability":"mutable","name":"_id","nameLocation":"1368:3:16","nodeType":"VariableDeclaration","scope":2431,"src":"1360:11:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2421,"name":"uint256","nodeType":"ElementaryTypeName","src":"1360:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2424,"mutability":"mutable","name":"_value","nameLocation":"1389:6:16","nodeType":"VariableDeclaration","scope":2431,"src":"1381:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2423,"name":"uint256","nodeType":"ElementaryTypeName","src":"1381:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2426,"mutability":"mutable","name":"_data","nameLocation":"1420:5:16","nodeType":"VariableDeclaration","scope":2431,"src":"1405:20:16","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2425,"name":"bytes","nodeType":"ElementaryTypeName","src":"1405:5:16","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1300:131:16"},"returnParameters":{"id":2430,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2429,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2431,"src":"1450:6:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2428,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1450:6:16","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1449:8:16"},"scope":2450,"src":"1274:184:16","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":2432,"nodeType":"StructuredDocumentation","src":"1464:1245:16","text":"@notice Handle the receipt of multiple ERC1155 token types.\n@dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \nThis function MUST return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\nThis function MUST revert if it rejects the transfer(s).\nReturn of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n@param _operator The address which initiated the batch transfer (i.e. msg.sender)\n@param _from The address which previously owned the token\n@param _ids An array containing ids of each token being transferred (order and length must match _values array)\n@param _values An array containing amounts of each token being transferred (order and length must match _ids array)\n@param _data Additional data with no specified format\n@return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`"},"functionSelector":"bc197c81","id":2449,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"2723:22:16","nodeType":"FunctionDefinition","parameters":{"id":2445,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2434,"mutability":"mutable","name":"_operator","nameLocation":"2763:9:16","nodeType":"VariableDeclaration","scope":2449,"src":"2755:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2433,"name":"address","nodeType":"ElementaryTypeName","src":"2755:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2436,"mutability":"mutable","name":"_from","nameLocation":"2790:5:16","nodeType":"VariableDeclaration","scope":2449,"src":"2782:13:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2435,"name":"address","nodeType":"ElementaryTypeName","src":"2782:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2439,"mutability":"mutable","name":"_ids","nameLocation":"2824:4:16","nodeType":"VariableDeclaration","scope":2449,"src":"2805:23:16","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":2437,"name":"uint256","nodeType":"ElementaryTypeName","src":"2805:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2438,"nodeType":"ArrayTypeName","src":"2805:9:16","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":2442,"mutability":"mutable","name":"_values","nameLocation":"2857:7:16","nodeType":"VariableDeclaration","scope":2449,"src":"2838:26:16","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":2440,"name":"uint256","nodeType":"ElementaryTypeName","src":"2838:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2441,"nodeType":"ArrayTypeName","src":"2838:9:16","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":2444,"mutability":"mutable","name":"_data","nameLocation":"2889:5:16","nodeType":"VariableDeclaration","scope":2449,"src":"2874:20:16","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2443,"name":"bytes","nodeType":"ElementaryTypeName","src":"2874:5:16","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2745:155:16"},"returnParameters":{"id":2448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2447,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2449,"src":"2919:6:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2446,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2919:6:16","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2918:8:16"},"scope":2450,"src":"2714:213:16","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2451,"src":"149:2780:16","usedErrors":[]}],"src":"42:2888:16"},"id":16},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol","exportedSymbols":{"ERC721TokenReceiver":[2468]},"id":2469,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2452,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:17"},{"abstract":false,"baseContracts":[],"canonicalName":"ERC721TokenReceiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":2453,"nodeType":"StructuredDocumentation","src":"75:72:17","text":"@dev Note: the ERC-165 identifier for this interface is 0x150b7a02."},"fullyImplemented":false,"id":2468,"linearizedBaseContracts":[2468],"name":"ERC721TokenReceiver","nameLocation":"157:19:17","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2454,"nodeType":"StructuredDocumentation","src":"183:760:17","text":"@notice Handle the receipt of an NFT\n @dev The ERC721 smart contract calls this function on the recipient\n after a `transfer`. This function MAY throw to revert and reject the\n transfer. Return of other than the magic value MUST result in the\n transaction being reverted.\n Note: the contract address is always the message sender.\n @param _operator The address which called `safeTransferFrom` function\n @param _from The address which previously owned the token\n @param _tokenId The NFT identifier which is being transferred\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n unless throwing"},"functionSelector":"150b7a02","id":2467,"implemented":false,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"957:16:17","nodeType":"FunctionDefinition","parameters":{"id":2463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2456,"mutability":"mutable","name":"_operator","nameLocation":"991:9:17","nodeType":"VariableDeclaration","scope":2467,"src":"983:17:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2455,"name":"address","nodeType":"ElementaryTypeName","src":"983:7:17","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2458,"mutability":"mutable","name":"_from","nameLocation":"1018:5:17","nodeType":"VariableDeclaration","scope":2467,"src":"1010:13:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2457,"name":"address","nodeType":"ElementaryTypeName","src":"1010:7:17","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2460,"mutability":"mutable","name":"_tokenId","nameLocation":"1041:8:17","nodeType":"VariableDeclaration","scope":2467,"src":"1033:16:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2459,"name":"uint256","nodeType":"ElementaryTypeName","src":"1033:7:17","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2462,"mutability":"mutable","name":"_data","nameLocation":"1074:5:17","nodeType":"VariableDeclaration","scope":2467,"src":"1059:20:17","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2461,"name":"bytes","nodeType":"ElementaryTypeName","src":"1059:5:17","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"973:112:17"},"returnParameters":{"id":2466,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2465,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2467,"src":"1104:6:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2464,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1104:6:17","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1103:8:17"},"scope":2468,"src":"948:164:17","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2469,"src":"147:967:17","usedErrors":[]}],"src":"42:1073:17"},"id":17},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol","exportedSymbols":{"ERC777TokensRecipient":[2486]},"id":2487,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2470,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:18"},{"abstract":false,"baseContracts":[],"canonicalName":"ERC777TokensRecipient","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":2486,"linearizedBaseContracts":[2486],"name":"ERC777TokensRecipient","nameLocation":"85:21:18","nodeType":"ContractDefinition","nodes":[{"functionSelector":"0023de29","id":2485,"implemented":false,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"122:14:18","nodeType":"FunctionDefinition","parameters":{"id":2483,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2472,"mutability":"mutable","name":"operator","nameLocation":"154:8:18","nodeType":"VariableDeclaration","scope":2485,"src":"146:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2471,"name":"address","nodeType":"ElementaryTypeName","src":"146:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2474,"mutability":"mutable","name":"from","nameLocation":"180:4:18","nodeType":"VariableDeclaration","scope":2485,"src":"172:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2473,"name":"address","nodeType":"ElementaryTypeName","src":"172:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2476,"mutability":"mutable","name":"to","nameLocation":"202:2:18","nodeType":"VariableDeclaration","scope":2485,"src":"194:10:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2475,"name":"address","nodeType":"ElementaryTypeName","src":"194:7:18","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2478,"mutability":"mutable","name":"amount","nameLocation":"222:6:18","nodeType":"VariableDeclaration","scope":2485,"src":"214:14:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2477,"name":"uint256","nodeType":"ElementaryTypeName","src":"214:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2480,"mutability":"mutable","name":"data","nameLocation":"253:4:18","nodeType":"VariableDeclaration","scope":2485,"src":"238:19:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2479,"name":"bytes","nodeType":"ElementaryTypeName","src":"238:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2482,"mutability":"mutable","name":"operatorData","nameLocation":"282:12:18","nodeType":"VariableDeclaration","scope":2485,"src":"267:27:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2481,"name":"bytes","nodeType":"ElementaryTypeName","src":"267:5:18","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"136:164:18"},"returnParameters":{"id":2484,"nodeType":"ParameterList","parameters":[],"src":"309:0:18"},"scope":2486,"src":"113:197:18","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2487,"src":"75:237:18","usedErrors":[]}],"src":"42:271:18"},"id":18},"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol","exportedSymbols":{"IERC165":[2498]},"id":2499,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2488,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:19"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC165","contractDependencies":[],"contractKind":"interface","documentation":{"id":2489,"nodeType":"StructuredDocumentation","src":"75:137:19","text":"@notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol"},"fullyImplemented":false,"id":2498,"linearizedBaseContracts":[2498],"name":"IERC165","nameLocation":"222:7:19","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2490,"nodeType":"StructuredDocumentation","src":"236:340:19","text":" @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."},"functionSelector":"01ffc9a7","id":2497,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"590:17:19","nodeType":"FunctionDefinition","parameters":{"id":2493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2492,"mutability":"mutable","name":"interfaceId","nameLocation":"615:11:19","nodeType":"VariableDeclaration","scope":2497,"src":"608:18:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2491,"name":"bytes4","nodeType":"ElementaryTypeName","src":"608:6:19","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"607:20:19"},"returnParameters":{"id":2496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2495,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2497,"src":"651:4:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2494,"name":"bool","nodeType":"ElementaryTypeName","src":"651:4:19","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"650:6:19"},"scope":2498,"src":"581:76:19","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":2499,"src":"212:447:19","usedErrors":[]}],"src":"42:618:19"},"id":19},"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol","exportedSymbols":{"ISignatureValidator":[2517],"ISignatureValidatorConstants":[2504]},"id":2518,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2500,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:20"},{"abstract":false,"baseContracts":[],"canonicalName":"ISignatureValidatorConstants","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":2504,"linearizedBaseContracts":[2504],"name":"ISignatureValidatorConstants","nameLocation":"84:28:20","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":2503,"mutability":"constant","name":"EIP1271_MAGIC_VALUE","nameLocation":"201:19:20","nodeType":"VariableDeclaration","scope":2504,"src":"176:57:20","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2501,"name":"bytes4","nodeType":"ElementaryTypeName","src":"176:6:20","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"hexValue":"30783230633133623062","id":2502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"223:10:20","typeDescriptions":{"typeIdentifier":"t_rational_549534475_by_1","typeString":"int_const 549534475"},"value":"0x20c13b0b"},"visibility":"internal"}],"scope":2518,"src":"75:161:20","usedErrors":[]},{"abstract":true,"baseContracts":[{"baseName":{"id":2505,"name":"ISignatureValidatorConstants","nodeType":"IdentifierPath","referencedDeclaration":2504,"src":"279:28:20"},"id":2506,"nodeType":"InheritanceSpecifier","src":"279:28:20"}],"canonicalName":"ISignatureValidator","contractDependencies":[],"contractKind":"contract","fullyImplemented":false,"id":2517,"linearizedBaseContracts":[2517,2504],"name":"ISignatureValidator","nameLocation":"256:19:20","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2507,"nodeType":"StructuredDocumentation","src":"314:455:20","text":" @dev Should return whether the signature provided is valid for the provided data\n @param _data Arbitrary length data signed on the behalf of address(this)\n @param _signature Signature byte array associated with _data\n MUST return the bytes4 magic value 0x20c13b0b when function passes.\n MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\n MUST allow external calls"},"functionSelector":"20c13b0b","id":2516,"implemented":false,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"783:16:20","nodeType":"FunctionDefinition","parameters":{"id":2512,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2509,"mutability":"mutable","name":"_data","nameLocation":"813:5:20","nodeType":"VariableDeclaration","scope":2516,"src":"800:18:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2508,"name":"bytes","nodeType":"ElementaryTypeName","src":"800:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2511,"mutability":"mutable","name":"_signature","nameLocation":"833:10:20","nodeType":"VariableDeclaration","scope":2516,"src":"820:23:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2510,"name":"bytes","nodeType":"ElementaryTypeName","src":"820:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"799:45:20"},"returnParameters":{"id":2515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2514,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2516,"src":"874:6:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2513,"name":"bytes4","nodeType":"ElementaryTypeName","src":"874:6:20","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"873:8:20"},"scope":2517,"src":"774:108:20","stateMutability":"view","virtual":true,"visibility":"public"}],"scope":2518,"src":"238:646:20","usedErrors":[]}],"src":"42:843:20"},"id":20},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol","exportedSymbols":{"GnosisSafeProxy":[2557],"IProxy":[2526]},"id":2558,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2519,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:21"},{"abstract":false,"baseContracts":[],"canonicalName":"IProxy","contractDependencies":[],"contractKind":"interface","documentation":{"id":2520,"nodeType":"StructuredDocumentation","src":"75:131:21","text":"@title IProxy - Helper interface to access masterCopy of the Proxy on-chain\n @author Richard Meissner - "},"fullyImplemented":false,"id":2526,"linearizedBaseContracts":[2526],"name":"IProxy","nameLocation":"216:6:21","nodeType":"ContractDefinition","nodes":[{"functionSelector":"a619486e","id":2525,"implemented":false,"kind":"function","modifiers":[],"name":"masterCopy","nameLocation":"238:10:21","nodeType":"FunctionDefinition","parameters":{"id":2521,"nodeType":"ParameterList","parameters":[],"src":"248:2:21"},"returnParameters":{"id":2524,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2523,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2525,"src":"274:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2522,"name":"address","nodeType":"ElementaryTypeName","src":"274:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"273:9:21"},"scope":2526,"src":"229:54:21","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":2558,"src":"206:79:21","usedErrors":[]},{"abstract":false,"baseContracts":[],"canonicalName":"GnosisSafeProxy","contractDependencies":[],"contractKind":"contract","documentation":{"id":2527,"nodeType":"StructuredDocumentation","src":"287:225:21","text":"@title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\n @author Stefan George - \n @author Richard Meissner - "},"fullyImplemented":true,"id":2557,"linearizedBaseContracts":[2557],"name":"GnosisSafeProxy","nameLocation":"521:15:21","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":2529,"mutability":"mutable","name":"singleton","nameLocation":"815:9:21","nodeType":"VariableDeclaration","scope":2557,"src":"798:26:21","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2528,"name":"address","nodeType":"ElementaryTypeName","src":"798:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"body":{"id":2549,"nodeType":"Block","src":"978:120:21","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2536,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2532,"src":"996:10:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":2539,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1018:1:21","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2538,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1010:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2537,"name":"address","nodeType":"ElementaryTypeName","src":"1010:7:21","typeDescriptions":{}}},"id":2540,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1010:10:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"996:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e76616c69642073696e676c65746f6e20616464726573732070726f7669646564","id":2542,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1022:36:21","typeDescriptions":{"typeIdentifier":"t_stringliteral_f4a46125d24bcf992f3a005546c0f3eafebe1847b2ccd7a103878ded65e88250","typeString":"literal_string \"Invalid singleton address provided\""},"value":"Invalid singleton address provided"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f4a46125d24bcf992f3a005546c0f3eafebe1847b2ccd7a103878ded65e88250","typeString":"literal_string \"Invalid singleton address provided\""}],"id":2535,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"988:7:21","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"988:71:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2544,"nodeType":"ExpressionStatement","src":"988:71:21"},{"expression":{"id":2547,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2545,"name":"singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2529,"src":"1069:9:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2546,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2532,"src":"1081:10:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1069:22:21","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2548,"nodeType":"ExpressionStatement","src":"1069:22:21"}]},"documentation":{"id":2530,"nodeType":"StructuredDocumentation","src":"831:110:21","text":"@dev Constructor function sets address of singleton contract.\n @param _singleton Singleton address."},"id":2550,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2533,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2532,"mutability":"mutable","name":"_singleton","nameLocation":"966:10:21","nodeType":"VariableDeclaration","scope":2550,"src":"958:18:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2531,"name":"address","nodeType":"ElementaryTypeName","src":"958:7:21","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"957:20:21"},"returnParameters":{"id":2534,"nodeType":"ParameterList","parameters":[],"src":"978:0:21"},"scope":2557,"src":"946:152:21","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":2555,"nodeType":"Block","src":"1227:780:21","statements":[{"AST":{"nodeType":"YulBlock","src":"1302:699:21","statements":[{"nodeType":"YulVariableDeclaration","src":"1316:75:21","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1344:1:21","type":"","value":"0"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1338:5:21"},"nodeType":"YulFunctionCall","src":"1338:8:21"},{"kind":"number","nodeType":"YulLiteral","src":"1348:42:21","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1334:3:21"},"nodeType":"YulFunctionCall","src":"1334:57:21"},"variables":[{"name":"_singleton","nodeType":"YulTypedName","src":"1320:10:21","type":""}]},{"body":{"nodeType":"YulBlock","src":"1594:85:21","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1619:1:21","type":"","value":"0"},{"name":"_singleton","nodeType":"YulIdentifier","src":"1622:10:21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1612:6:21"},"nodeType":"YulFunctionCall","src":"1612:21:21"},"nodeType":"YulExpressionStatement","src":"1612:21:21"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1657:1:21","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1660:4:21","type":"","value":"0x20"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"1650:6:21"},"nodeType":"YulFunctionCall","src":"1650:15:21"},"nodeType":"YulExpressionStatement","src":"1650:15:21"}]},"condition":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1522:1:21","type":"","value":"0"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1509:12:21"},"nodeType":"YulFunctionCall","src":"1509:15:21"},{"kind":"number","nodeType":"YulLiteral","src":"1526:66:21","type":"","value":"0xa619486e00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1506:2:21"},"nodeType":"YulFunctionCall","src":"1506:87:21"},"nodeType":"YulIf","src":"1503:176:21"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1705:1:21","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1708:1:21","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1711:12:21"},"nodeType":"YulFunctionCall","src":"1711:14:21"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1692:12:21"},"nodeType":"YulFunctionCall","src":"1692:34:21"},"nodeType":"YulExpressionStatement","src":"1692:34:21"},{"nodeType":"YulVariableDeclaration","src":"1739:71:21","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1767:3:21"},"nodeType":"YulFunctionCall","src":"1767:5:21"},{"name":"_singleton","nodeType":"YulIdentifier","src":"1774:10:21"},{"kind":"number","nodeType":"YulLiteral","src":"1786:1:21","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1789:12:21"},"nodeType":"YulFunctionCall","src":"1789:14:21"},{"kind":"number","nodeType":"YulLiteral","src":"1805:1:21","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1808:1:21","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"1754:12:21"},"nodeType":"YulFunctionCall","src":"1754:56:21"},"variables":[{"name":"success","nodeType":"YulTypedName","src":"1743:7:21","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1838:1:21","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1841:1:21","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1844:14:21"},"nodeType":"YulFunctionCall","src":"1844:16:21"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"1823:14:21"},"nodeType":"YulFunctionCall","src":"1823:38:21"},"nodeType":"YulExpressionStatement","src":"1823:38:21"},{"body":{"nodeType":"YulBlock","src":"1892:59:21","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1917:1:21","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1920:14:21"},"nodeType":"YulFunctionCall","src":"1920:16:21"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1910:6:21"},"nodeType":"YulFunctionCall","src":"1910:27:21"},"nodeType":"YulExpressionStatement","src":"1910:27:21"}]},"condition":{"arguments":[{"name":"success","nodeType":"YulIdentifier","src":"1880:7:21"},{"kind":"number","nodeType":"YulLiteral","src":"1889:1:21","type":"","value":"0"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1877:2:21"},"nodeType":"YulFunctionCall","src":"1877:14:21"},"nodeType":"YulIf","src":"1874:77:21"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1971:1:21","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1974:14:21"},"nodeType":"YulFunctionCall","src":"1974:16:21"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"1964:6:21"},"nodeType":"YulFunctionCall","src":"1964:27:21"},"nodeType":"YulExpressionStatement","src":"1964:27:21"}]},"evmVersion":"london","externalReferences":[],"id":2554,"nodeType":"InlineAssembly","src":"1293:708:21"}]},"documentation":{"id":2551,"nodeType":"StructuredDocumentation","src":"1104:90:21","text":"@dev Fallback function forwards all transactions and returns all received return data."},"id":2556,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2552,"nodeType":"ParameterList","parameters":[],"src":"1207:2:21"},"returnParameters":{"id":2553,"nodeType":"ParameterList","parameters":[],"src":"1227:0:21"},"scope":2557,"src":"1199:808:21","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":2558,"src":"512:1497:21","usedErrors":[]}],"src":"42:1968:21"},"id":21},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol","exportedSymbols":{"GnosisSafeProxy":[2557],"GnosisSafeProxyFactory":[2804],"IProxy":[2526],"IProxyCreationCallback":[2820]},"id":2805,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2559,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:22"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol","file":"./GnosisSafeProxy.sol","id":2560,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2805,"sourceUnit":2558,"src":"75:31:22","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol","file":"./IProxyCreationCallback.sol","id":2561,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2805,"sourceUnit":2821,"src":"107:38:22","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"GnosisSafeProxyFactory","contractDependencies":[2557],"contractKind":"contract","documentation":{"id":2562,"nodeType":"StructuredDocumentation","src":"147:177:22","text":"@title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n @author Stefan George - "},"fullyImplemented":true,"id":2804,"linearizedBaseContracts":[2804],"name":"GnosisSafeProxyFactory","nameLocation":"333:22:22","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235","id":2569,"name":"ProxyCreation","nameLocation":"368:13:22","nodeType":"EventDefinition","parameters":{"id":2568,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2565,"indexed":false,"mutability":"mutable","name":"proxy","nameLocation":"398:5:22","nodeType":"VariableDeclaration","scope":2569,"src":"382:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2564,"nodeType":"UserDefinedTypeName","pathNode":{"id":2563,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"382:15:22"},"referencedDeclaration":2557,"src":"382:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"},{"constant":false,"id":2567,"indexed":false,"mutability":"mutable","name":"singleton","nameLocation":"413:9:22","nodeType":"VariableDeclaration","scope":2569,"src":"405:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2566,"name":"address","nodeType":"ElementaryTypeName","src":"405:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"381:42:22"},"src":"362:62:22"},{"body":{"id":2599,"nodeType":"Block","src":"773:364:22","statements":[{"expression":{"id":2586,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2580,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2578,"src":"783:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2584,"name":"singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2572,"src":"811:9:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"791:19:22","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_address_$returns$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"function (address) returns (contract GnosisSafeProxy)"},"typeName":{"id":2582,"nodeType":"UserDefinedTypeName","pathNode":{"id":2581,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"795:15:22"},"referencedDeclaration":2557,"src":"795:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}}},"id":2585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"791:30:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"src":"783:38:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"id":2587,"nodeType":"ExpressionStatement","src":"783:38:22"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2588,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2574,"src":"835:4:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"835:11:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"849:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"835:15:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2593,"nodeType":"IfStatement","src":"831:254:22","trueBody":{"AST":{"nodeType":"YulBlock","src":"933:152:22","statements":[{"body":{"nodeType":"YulBlock","src":"1019:52:22","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1048:1:22","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1051:1:22","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1041:6:22"},"nodeType":"YulFunctionCall","src":"1041:12:22"},"nodeType":"YulExpressionStatement","src":"1041:12:22"}]},"condition":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"962:3:22"},"nodeType":"YulFunctionCall","src":"962:5:22"},{"name":"proxy","nodeType":"YulIdentifier","src":"969:5:22"},{"kind":"number","nodeType":"YulLiteral","src":"976:1:22","type":"","value":"0"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"983:4:22"},{"kind":"number","nodeType":"YulLiteral","src":"989:4:22","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"979:3:22"},"nodeType":"YulFunctionCall","src":"979:15:22"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1002:4:22"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"996:5:22"},"nodeType":"YulFunctionCall","src":"996:11:22"},{"kind":"number","nodeType":"YulLiteral","src":"1009:1:22","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1012:1:22","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"957:4:22"},"nodeType":"YulFunctionCall","src":"957:57:22"},{"kind":"number","nodeType":"YulLiteral","src":"1016:1:22","type":"","value":"0"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"954:2:22"},"nodeType":"YulFunctionCall","src":"954:64:22"},"nodeType":"YulIf","src":"951:120:22"}]},"evmVersion":"london","externalReferences":[{"declaration":2574,"isOffset":false,"isSlot":false,"src":"1002:4:22","valueSize":1},{"declaration":2574,"isOffset":false,"isSlot":false,"src":"983:4:22","valueSize":1},{"declaration":2578,"isOffset":false,"isSlot":false,"src":"969:5:22","valueSize":1}],"id":2592,"nodeType":"InlineAssembly","src":"924:161:22"}},{"eventCall":{"arguments":[{"id":2595,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2578,"src":"1113:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},{"id":2596,"name":"singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2572,"src":"1120:9:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},{"typeIdentifier":"t_address","typeString":"address"}],"id":2594,"name":"ProxyCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2569,"src":"1099:13:22","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_contract$_GnosisSafeProxy_$2557_$_t_address_$returns$__$","typeString":"function (contract GnosisSafeProxy,address)"}},"id":2597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1099:31:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2598,"nodeType":"EmitStatement","src":"1094:36:22"}]},"documentation":{"id":2570,"nodeType":"StructuredDocumentation","src":"430:240:22","text":"@dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n @param singleton Address of singleton contract.\n @param data Payload for message call sent to new proxy contract."},"functionSelector":"61b69abd","id":2600,"implemented":true,"kind":"function","modifiers":[],"name":"createProxy","nameLocation":"684:11:22","nodeType":"FunctionDefinition","parameters":{"id":2575,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2572,"mutability":"mutable","name":"singleton","nameLocation":"704:9:22","nodeType":"VariableDeclaration","scope":2600,"src":"696:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2571,"name":"address","nodeType":"ElementaryTypeName","src":"696:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2574,"mutability":"mutable","name":"data","nameLocation":"728:4:22","nodeType":"VariableDeclaration","scope":2600,"src":"715:17:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2573,"name":"bytes","nodeType":"ElementaryTypeName","src":"715:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"695:38:22"},"returnParameters":{"id":2579,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2578,"mutability":"mutable","name":"proxy","nameLocation":"766:5:22","nodeType":"VariableDeclaration","scope":2600,"src":"750:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2577,"nodeType":"UserDefinedTypeName","pathNode":{"id":2576,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"750:15:22"},"referencedDeclaration":2557,"src":"750:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"}],"src":"749:23:22"},"scope":2804,"src":"675:462:22","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":2611,"nodeType":"Block","src":"1340:57:22","statements":[{"expression":{"expression":{"arguments":[{"id":2607,"name":"GnosisSafeProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2557,"src":"1362:15:22","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}],"id":2606,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1357:4:22","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1357:21:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_GnosisSafeProxy_$2557","typeString":"type(contract GnosisSafeProxy)"}},"id":2609,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"runtimeCode","nodeType":"MemberAccess","src":"1357:33:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":2605,"id":2610,"nodeType":"Return","src":"1350:40:22"}]},"documentation":{"id":2601,"nodeType":"StructuredDocumentation","src":"1143:129:22","text":"@dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed."},"functionSelector":"addacc0f","id":2612,"implemented":true,"kind":"function","modifiers":[],"name":"proxyRuntimeCode","nameLocation":"1286:16:22","nodeType":"FunctionDefinition","parameters":{"id":2602,"nodeType":"ParameterList","parameters":[],"src":"1302:2:22"},"returnParameters":{"id":2605,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2604,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2612,"src":"1326:12:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2603,"name":"bytes","nodeType":"ElementaryTypeName","src":"1326:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1325:14:22"},"scope":2804,"src":"1277:120:22","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":2623,"nodeType":"Block","src":"1612:58:22","statements":[{"expression":{"expression":{"arguments":[{"id":2619,"name":"GnosisSafeProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2557,"src":"1634:15:22","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}],"id":2618,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1629:4:22","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2620,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1629:21:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_GnosisSafeProxy_$2557","typeString":"type(contract GnosisSafeProxy)"}},"id":2621,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"1629:34:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":2617,"id":2622,"nodeType":"Return","src":"1622:41:22"}]},"documentation":{"id":2613,"nodeType":"StructuredDocumentation","src":"1403:140:22","text":"@dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address."},"functionSelector":"53e5d935","id":2624,"implemented":true,"kind":"function","modifiers":[],"name":"proxyCreationCode","nameLocation":"1557:17:22","nodeType":"FunctionDefinition","parameters":{"id":2614,"nodeType":"ParameterList","parameters":[],"src":"1574:2:22"},"returnParameters":{"id":2617,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2616,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2624,"src":"1598:12:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2615,"name":"bytes","nodeType":"ElementaryTypeName","src":"1598:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1597:14:22"},"scope":2804,"src":"1548:122:22","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":2680,"nodeType":"Block","src":"2284:603:22","statements":[{"assignments":[2638],"declarations":[{"constant":false,"id":2638,"mutability":"mutable","name":"salt","nameLocation":"2444:4:22","nodeType":"VariableDeclaration","scope":2680,"src":"2436:12:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2637,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2436:7:22","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":2648,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":2643,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2629,"src":"2488:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2642,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2478:9:22","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":2644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2478:22:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":2645,"name":"saltNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2631,"src":"2502:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":2640,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2461:3:22","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":2641,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"2461:16:22","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":2646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2461:51:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2639,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2451:9:22","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":2647,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2451:62:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2436:77:22"},{"assignments":[2650],"declarations":[{"constant":false,"id":2650,"mutability":"mutable","name":"deploymentData","nameLocation":"2536:14:22","nodeType":"VariableDeclaration","scope":2680,"src":"2523:27:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2649,"name":"bytes","nodeType":"ElementaryTypeName","src":"2523:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2665,"initialValue":{"arguments":[{"expression":{"arguments":[{"id":2654,"name":"GnosisSafeProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2557,"src":"2575:15:22","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"type(contract GnosisSafeProxy)"}],"id":2653,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2570:4:22","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2655,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2570:21:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_GnosisSafeProxy_$2557","typeString":"type(contract GnosisSafeProxy)"}},"id":2656,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"2570:34:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":2661,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2627,"src":"2622:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2660,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2614:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2659,"name":"uint160","nodeType":"ElementaryTypeName","src":"2614:7:22","typeDescriptions":{}}},"id":2662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2614:19:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":2658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2606:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2657,"name":"uint256","nodeType":"ElementaryTypeName","src":"2606:7:22","typeDescriptions":{}}},"id":2663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2606:28:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":2651,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2553:3:22","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":2652,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"2553:16:22","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":2664,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2553:82:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2523:112:22"},{"AST":{"nodeType":"YulBlock","src":"2710:101:22","statements":[{"nodeType":"YulAssignment","src":"2724:77:22","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2741:3:22","type":"","value":"0x0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2750:4:22","type":"","value":"0x20"},{"name":"deploymentData","nodeType":"YulIdentifier","src":"2756:14:22"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2746:3:22"},"nodeType":"YulFunctionCall","src":"2746:25:22"},{"arguments":[{"name":"deploymentData","nodeType":"YulIdentifier","src":"2779:14:22"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2773:5:22"},"nodeType":"YulFunctionCall","src":"2773:21:22"},{"name":"salt","nodeType":"YulIdentifier","src":"2796:4:22"}],"functionName":{"name":"create2","nodeType":"YulIdentifier","src":"2733:7:22"},"nodeType":"YulFunctionCall","src":"2733:68:22"},"variableNames":[{"name":"proxy","nodeType":"YulIdentifier","src":"2724:5:22"}]}]},"evmVersion":"london","externalReferences":[{"declaration":2650,"isOffset":false,"isSlot":false,"src":"2756:14:22","valueSize":1},{"declaration":2650,"isOffset":false,"isSlot":false,"src":"2779:14:22","valueSize":1},{"declaration":2635,"isOffset":false,"isSlot":false,"src":"2724:5:22","valueSize":1},{"declaration":2638,"isOffset":false,"isSlot":false,"src":"2796:4:22","valueSize":1}],"id":2666,"nodeType":"InlineAssembly","src":"2701:110:22"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2676,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2670,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2635,"src":"2836:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}],"id":2669,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2828:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2668,"name":"address","nodeType":"ElementaryTypeName","src":"2828:7:22","typeDescriptions":{}}},"id":2671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2828:14:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":2674,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2854:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2673,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2846:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2672,"name":"address","nodeType":"ElementaryTypeName","src":"2846:7:22","typeDescriptions":{}}},"id":2675,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2846:10:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2828:28:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"437265617465322063616c6c206661696c6564","id":2677,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2858:21:22","typeDescriptions":{"typeIdentifier":"t_stringliteral_d7c71a0bdd2eb2834ad042153c811dd478e4ee2324e3003b9522e03e7b3735dc","typeString":"literal_string \"Create2 call failed\""},"value":"Create2 call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d7c71a0bdd2eb2834ad042153c811dd478e4ee2324e3003b9522e03e7b3735dc","typeString":"literal_string \"Create2 call failed\""}],"id":2667,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2820:7:22","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2820:60:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2679,"nodeType":"ExpressionStatement","src":"2820:60:22"}]},"documentation":{"id":2625,"nodeType":"StructuredDocumentation","src":"1676:437:22","text":"@dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.\n This method is only meant as an utility to be called from other methods\n @param _singleton Address of singleton contract.\n @param initializer Payload for message call sent to new proxy contract.\n @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract."},"id":2681,"implemented":true,"kind":"function","modifiers":[],"name":"deployProxyWithNonce","nameLocation":"2127:20:22","nodeType":"FunctionDefinition","parameters":{"id":2632,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2627,"mutability":"mutable","name":"_singleton","nameLocation":"2165:10:22","nodeType":"VariableDeclaration","scope":2681,"src":"2157:18:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2626,"name":"address","nodeType":"ElementaryTypeName","src":"2157:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2629,"mutability":"mutable","name":"initializer","nameLocation":"2198:11:22","nodeType":"VariableDeclaration","scope":2681,"src":"2185:24:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2628,"name":"bytes","nodeType":"ElementaryTypeName","src":"2185:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2631,"mutability":"mutable","name":"saltNonce","nameLocation":"2227:9:22","nodeType":"VariableDeclaration","scope":2681,"src":"2219:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2630,"name":"uint256","nodeType":"ElementaryTypeName","src":"2219:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2147:95:22"},"returnParameters":{"id":2636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2635,"mutability":"mutable","name":"proxy","nameLocation":"2277:5:22","nodeType":"VariableDeclaration","scope":2681,"src":"2261:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2634,"nodeType":"UserDefinedTypeName","pathNode":{"id":2633,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"2261:15:22"},"referencedDeclaration":2557,"src":"2261:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"}],"src":"2260:23:22"},"scope":2804,"src":"2118:769:22","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":2713,"nodeType":"Block","src":"3432:412:22","statements":[{"expression":{"id":2700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2694,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2692,"src":"3442:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2696,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2684,"src":"3471:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2697,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2686,"src":"3483:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2698,"name":"saltNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2688,"src":"3496:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2695,"name":"deployProxyWithNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2681,"src":"3450:20:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"function (address,bytes memory,uint256) returns (contract GnosisSafeProxy)"}},"id":2699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3450:56:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"src":"3442:64:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"id":2701,"nodeType":"ExpressionStatement","src":"3442:64:22"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2705,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2702,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2686,"src":"3520:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2703,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3520:18:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":2704,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3541:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3520:22:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2707,"nodeType":"IfStatement","src":"3516:275:22","trueBody":{"AST":{"nodeType":"YulBlock","src":"3625:166:22","statements":[{"body":{"nodeType":"YulBlock","src":"3725:52:22","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3754:1:22","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3757:1:22","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3747:6:22"},"nodeType":"YulFunctionCall","src":"3747:12:22"},"nodeType":"YulExpressionStatement","src":"3747:12:22"}]},"condition":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"3654:3:22"},"nodeType":"YulFunctionCall","src":"3654:5:22"},{"name":"proxy","nodeType":"YulIdentifier","src":"3661:5:22"},{"kind":"number","nodeType":"YulLiteral","src":"3668:1:22","type":"","value":"0"},{"arguments":[{"name":"initializer","nodeType":"YulIdentifier","src":"3675:11:22"},{"kind":"number","nodeType":"YulLiteral","src":"3688:4:22","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3671:3:22"},"nodeType":"YulFunctionCall","src":"3671:22:22"},{"arguments":[{"name":"initializer","nodeType":"YulIdentifier","src":"3701:11:22"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3695:5:22"},"nodeType":"YulFunctionCall","src":"3695:18:22"},{"kind":"number","nodeType":"YulLiteral","src":"3715:1:22","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3718:1:22","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"3649:4:22"},"nodeType":"YulFunctionCall","src":"3649:71:22"},{"kind":"number","nodeType":"YulLiteral","src":"3722:1:22","type":"","value":"0"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"3646:2:22"},"nodeType":"YulFunctionCall","src":"3646:78:22"},"nodeType":"YulIf","src":"3643:134:22"}]},"evmVersion":"london","externalReferences":[{"declaration":2686,"isOffset":false,"isSlot":false,"src":"3675:11:22","valueSize":1},{"declaration":2686,"isOffset":false,"isSlot":false,"src":"3701:11:22","valueSize":1},{"declaration":2692,"isOffset":false,"isSlot":false,"src":"3661:5:22","valueSize":1}],"id":2706,"nodeType":"InlineAssembly","src":"3616:175:22"}},{"eventCall":{"arguments":[{"id":2709,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2692,"src":"3819:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},{"id":2710,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2684,"src":"3826:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},{"typeIdentifier":"t_address","typeString":"address"}],"id":2708,"name":"ProxyCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2569,"src":"3805:13:22","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_contract$_GnosisSafeProxy_$2557_$_t_address_$returns$__$","typeString":"function (contract GnosisSafeProxy,address)"}},"id":2711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3805:32:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2712,"nodeType":"EmitStatement","src":"3800:37:22"}]},"documentation":{"id":2682,"nodeType":"StructuredDocumentation","src":"2893:370:22","text":"@dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n @param _singleton Address of singleton contract.\n @param initializer Payload for message call sent to new proxy contract.\n @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract."},"functionSelector":"1688f0b9","id":2714,"implemented":true,"kind":"function","modifiers":[],"name":"createProxyWithNonce","nameLocation":"3277:20:22","nodeType":"FunctionDefinition","parameters":{"id":2689,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2684,"mutability":"mutable","name":"_singleton","nameLocation":"3315:10:22","nodeType":"VariableDeclaration","scope":2714,"src":"3307:18:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2683,"name":"address","nodeType":"ElementaryTypeName","src":"3307:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2686,"mutability":"mutable","name":"initializer","nameLocation":"3348:11:22","nodeType":"VariableDeclaration","scope":2714,"src":"3335:24:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2685,"name":"bytes","nodeType":"ElementaryTypeName","src":"3335:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2688,"mutability":"mutable","name":"saltNonce","nameLocation":"3377:9:22","nodeType":"VariableDeclaration","scope":2714,"src":"3369:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2687,"name":"uint256","nodeType":"ElementaryTypeName","src":"3369:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3297:95:22"},"returnParameters":{"id":2693,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2692,"mutability":"mutable","name":"proxy","nameLocation":"3425:5:22","nodeType":"VariableDeclaration","scope":2714,"src":"3409:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2691,"nodeType":"UserDefinedTypeName","pathNode":{"id":2690,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"3409:15:22"},"referencedDeclaration":2557,"src":"3409:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"}],"src":"3408:23:22"},"scope":2804,"src":"3268:576:22","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":2770,"nodeType":"Block","src":"4590:303:22","statements":[{"assignments":[2731],"declarations":[{"constant":false,"id":2731,"mutability":"mutable","name":"saltNonceWithCallback","nameLocation":"4608:21:22","nodeType":"VariableDeclaration","scope":2770,"src":"4600:29:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2730,"name":"uint256","nodeType":"ElementaryTypeName","src":"4600:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2742,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":2737,"name":"saltNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2721,"src":"4667:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2738,"name":"callback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2724,"src":"4678:8:22","typeDescriptions":{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}],"expression":{"id":2735,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4650:3:22","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":2736,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"4650:16:22","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":2739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4650:37:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2734,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4640:9:22","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":2740,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4640:48:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2733,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4632:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":2732,"name":"uint256","nodeType":"ElementaryTypeName","src":"4632:7:22","typeDescriptions":{}}},"id":2741,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4632:57:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4600:89:22"},{"expression":{"id":2749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2743,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2728,"src":"4699:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2745,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2717,"src":"4728:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2746,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2719,"src":"4740:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2747,"name":"saltNonceWithCallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2731,"src":"4753:21:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2744,"name":"createProxyWithNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2714,"src":"4707:20:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"function (address,bytes memory,uint256) returns (contract GnosisSafeProxy)"}},"id":2748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4707:68:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"src":"4699:76:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"id":2750,"nodeType":"ExpressionStatement","src":"4699:76:22"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":2753,"name":"callback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2724,"src":"4797:8:22","typeDescriptions":{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}],"id":2752,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4789:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2751,"name":"address","nodeType":"ElementaryTypeName","src":"4789:7:22","typeDescriptions":{}}},"id":2754,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4789:17:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":2757,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4818:1:22","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2756,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4810:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2755,"name":"address","nodeType":"ElementaryTypeName","src":"4810:7:22","typeDescriptions":{}}},"id":2758,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4810:10:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4789:31:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2769,"nodeType":"IfStatement","src":"4785:101:22","trueBody":{"expression":{"arguments":[{"id":2763,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2728,"src":"4844:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},{"id":2764,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2717,"src":"4851:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2765,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2719,"src":"4863:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2766,"name":"saltNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2721,"src":"4876:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":2760,"name":"callback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2724,"src":"4822:8:22","typeDescriptions":{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}},"id":2762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"proxyCreated","nodeType":"MemberAccess","referencedDeclaration":2819,"src":"4822:21:22","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_contract$_GnosisSafeProxy_$2557_$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (contract GnosisSafeProxy,address,bytes memory,uint256) external"}},"id":2767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4822:64:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2768,"nodeType":"ExpressionStatement","src":"4822:64:22"}}]},"documentation":{"id":2715,"nodeType":"StructuredDocumentation","src":"3850:527:22","text":"@dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\n @param _singleton Address of singleton contract.\n @param initializer Payload for message call sent to new proxy contract.\n @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized."},"functionSelector":"d18af54d","id":2771,"implemented":true,"kind":"function","modifiers":[],"name":"createProxyWithCallback","nameLocation":"4391:23:22","nodeType":"FunctionDefinition","parameters":{"id":2725,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2717,"mutability":"mutable","name":"_singleton","nameLocation":"4432:10:22","nodeType":"VariableDeclaration","scope":2771,"src":"4424:18:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2716,"name":"address","nodeType":"ElementaryTypeName","src":"4424:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2719,"mutability":"mutable","name":"initializer","nameLocation":"4465:11:22","nodeType":"VariableDeclaration","scope":2771,"src":"4452:24:22","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2718,"name":"bytes","nodeType":"ElementaryTypeName","src":"4452:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2721,"mutability":"mutable","name":"saltNonce","nameLocation":"4494:9:22","nodeType":"VariableDeclaration","scope":2771,"src":"4486:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2720,"name":"uint256","nodeType":"ElementaryTypeName","src":"4486:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2724,"mutability":"mutable","name":"callback","nameLocation":"4536:8:22","nodeType":"VariableDeclaration","scope":2771,"src":"4513:31:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"},"typeName":{"id":2723,"nodeType":"UserDefinedTypeName","pathNode":{"id":2722,"name":"IProxyCreationCallback","nodeType":"IdentifierPath","referencedDeclaration":2820,"src":"4513:22:22"},"referencedDeclaration":2820,"src":"4513:22:22","typeDescriptions":{"typeIdentifier":"t_contract$_IProxyCreationCallback_$2820","typeString":"contract IProxyCreationCallback"}},"visibility":"internal"}],"src":"4414:136:22"},"returnParameters":{"id":2729,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2728,"mutability":"mutable","name":"proxy","nameLocation":"4583:5:22","nodeType":"VariableDeclaration","scope":2771,"src":"4567:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2727,"nodeType":"UserDefinedTypeName","pathNode":{"id":2726,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"4567:15:22"},"referencedDeclaration":2557,"src":"4567:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"}],"src":"4566:23:22"},"scope":2804,"src":"4382:511:22","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":2802,"nodeType":"Block","src":"5694:130:22","statements":[{"expression":{"id":2790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2784,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2782,"src":"5704:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":2786,"name":"_singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2774,"src":"5733:10:22","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2787,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2776,"src":"5745:11:22","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":2788,"name":"saltNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2778,"src":"5758:9:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2785,"name":"deployProxyWithNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2681,"src":"5712:20:22","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"function (address,bytes memory,uint256) returns (contract GnosisSafeProxy)"}},"id":2789,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5712:56:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"src":"5704:64:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"id":2791,"nodeType":"ExpressionStatement","src":"5704:64:22"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":2797,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2782,"src":"5809:5:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}],"expression":{"id":2795,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5792:3:22","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":2796,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"5792:16:22","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":2798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5792:23:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2794,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5785:6:22","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":2793,"name":"string","nodeType":"ElementaryTypeName","src":"5785:6:22","typeDescriptions":{}}},"id":2799,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5785:31:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2792,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"5778:6:22","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":2800,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5778:39:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2801,"nodeType":"ExpressionStatement","src":"5778:39:22"}]},"documentation":{"id":2772,"nodeType":"StructuredDocumentation","src":"4899:606:22","text":"@dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`\n This method is only meant for address calculation purpose when you use an initializer that would revert,\n therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\n @param _singleton Address of singleton contract.\n @param initializer Payload for message call sent to new proxy contract.\n @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract."},"functionSelector":"2500510e","id":2803,"implemented":true,"kind":"function","modifiers":[],"name":"calculateCreateProxyWithNonceAddress","nameLocation":"5519:36:22","nodeType":"FunctionDefinition","parameters":{"id":2779,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2774,"mutability":"mutable","name":"_singleton","nameLocation":"5573:10:22","nodeType":"VariableDeclaration","scope":2803,"src":"5565:18:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2773,"name":"address","nodeType":"ElementaryTypeName","src":"5565:7:22","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2776,"mutability":"mutable","name":"initializer","nameLocation":"5608:11:22","nodeType":"VariableDeclaration","scope":2803,"src":"5593:26:22","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2775,"name":"bytes","nodeType":"ElementaryTypeName","src":"5593:5:22","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2778,"mutability":"mutable","name":"saltNonce","nameLocation":"5637:9:22","nodeType":"VariableDeclaration","scope":2803,"src":"5629:17:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2777,"name":"uint256","nodeType":"ElementaryTypeName","src":"5629:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5555:97:22"},"returnParameters":{"id":2783,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2782,"mutability":"mutable","name":"proxy","nameLocation":"5687:5:22","nodeType":"VariableDeclaration","scope":2803,"src":"5671:21:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2781,"nodeType":"UserDefinedTypeName","pathNode":{"id":2780,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"5671:15:22"},"referencedDeclaration":2557,"src":"5671:15:22","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"}],"src":"5670:23:22"},"scope":2804,"src":"5510:314:22","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2805,"src":"324:5502:22","usedErrors":[]}],"src":"42:5785:22"},"id":22},"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol":{"ast":{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol","exportedSymbols":{"GnosisSafeProxy":[2557],"IProxy":[2526],"IProxyCreationCallback":[2820]},"id":2821,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":2806,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:23"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol","file":"./GnosisSafeProxy.sol","id":2807,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2821,"sourceUnit":2558,"src":"74:31:23","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IProxyCreationCallback","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":2820,"linearizedBaseContracts":[2820],"name":"IProxyCreationCallback","nameLocation":"117:22:23","nodeType":"ContractDefinition","nodes":[{"functionSelector":"1e52b518","id":2819,"implemented":false,"kind":"function","modifiers":[],"name":"proxyCreated","nameLocation":"155:12:23","nodeType":"FunctionDefinition","parameters":{"id":2817,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2810,"mutability":"mutable","name":"proxy","nameLocation":"193:5:23","nodeType":"VariableDeclaration","scope":2819,"src":"177:21:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"},"typeName":{"id":2809,"nodeType":"UserDefinedTypeName","pathNode":{"id":2808,"name":"GnosisSafeProxy","nodeType":"IdentifierPath","referencedDeclaration":2557,"src":"177:15:23"},"referencedDeclaration":2557,"src":"177:15:23","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}},"visibility":"internal"},{"constant":false,"id":2812,"mutability":"mutable","name":"_singleton","nameLocation":"216:10:23","nodeType":"VariableDeclaration","scope":2819,"src":"208:18:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2811,"name":"address","nodeType":"ElementaryTypeName","src":"208:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2814,"mutability":"mutable","name":"initializer","nameLocation":"251:11:23","nodeType":"VariableDeclaration","scope":2819,"src":"236:26:23","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":2813,"name":"bytes","nodeType":"ElementaryTypeName","src":"236:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2816,"mutability":"mutable","name":"saltNonce","nameLocation":"280:9:23","nodeType":"VariableDeclaration","scope":2819,"src":"272:17:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2815,"name":"uint256","nodeType":"ElementaryTypeName","src":"272:7:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"167:128:23"},"returnParameters":{"id":2818,"nodeType":"ParameterList","parameters":[],"src":"304:0:23"},"scope":2820,"src":"146:159:23","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":2821,"src":"107:200:23","usedErrors":[]}],"src":"42:266:23"},"id":23},"@openzeppelin/contracts/access/Ownable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/access/Ownable.sol","exportedSymbols":{"Context":[5151],"Ownable":[2933]},"id":2934,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2822,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"102:23:24"},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"../utils/Context.sol","id":2823,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2934,"sourceUnit":5152,"src":"127:30:24","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":2825,"name":"Context","nodeType":"IdentifierPath","referencedDeclaration":5151,"src":"683:7:24"},"id":2826,"nodeType":"InheritanceSpecifier","src":"683:7:24"}],"canonicalName":"Ownable","contractDependencies":[],"contractKind":"contract","documentation":{"id":2824,"nodeType":"StructuredDocumentation","src":"159:494:24","text":" @dev Contract module which provides a basic access control mechanism, where\n there is an account (an owner) that can be granted exclusive access to\n specific functions.\n By default, the owner account will be the one that deploys the contract. This\n can later be changed with {transferOwnership}.\n This module is used through inheritance. It will make available the modifier\n `onlyOwner`, which can be applied to your functions to restrict their use to\n the owner."},"fullyImplemented":true,"id":2933,"linearizedBaseContracts":[2933,5151],"name":"Ownable","nameLocation":"672:7:24","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":2828,"mutability":"mutable","name":"_owner","nameLocation":"713:6:24","nodeType":"VariableDeclaration","scope":2933,"src":"697:22:24","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2827,"name":"address","nodeType":"ElementaryTypeName","src":"697:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"anonymous":false,"eventSelector":"8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","id":2834,"name":"OwnershipTransferred","nameLocation":"732:20:24","nodeType":"EventDefinition","parameters":{"id":2833,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2830,"indexed":true,"mutability":"mutable","name":"previousOwner","nameLocation":"769:13:24","nodeType":"VariableDeclaration","scope":2834,"src":"753:29:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2829,"name":"address","nodeType":"ElementaryTypeName","src":"753:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2832,"indexed":true,"mutability":"mutable","name":"newOwner","nameLocation":"800:8:24","nodeType":"VariableDeclaration","scope":2834,"src":"784:24:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2831,"name":"address","nodeType":"ElementaryTypeName","src":"784:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"752:57:24"},"src":"726:84:24"},{"body":{"id":2843,"nodeType":"Block","src":"926:49:24","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":2839,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"955:10:24","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":2840,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"955:12:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2838,"name":"_transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2932,"src":"936:18:24","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":2841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"936:32:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2842,"nodeType":"ExpressionStatement","src":"936:32:24"}]},"documentation":{"id":2835,"nodeType":"StructuredDocumentation","src":"816:91:24","text":" @dev Initializes the contract setting the deployer as the initial owner."},"id":2844,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2836,"nodeType":"ParameterList","parameters":[],"src":"923:2:24"},"returnParameters":{"id":2837,"nodeType":"ParameterList","parameters":[],"src":"926:0:24"},"scope":2933,"src":"912:63:24","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":2851,"nodeType":"Block","src":"1084:41:24","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":2847,"name":"_checkOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2875,"src":"1094:11:24","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":2848,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1094:13:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2849,"nodeType":"ExpressionStatement","src":"1094:13:24"},{"id":2850,"nodeType":"PlaceholderStatement","src":"1117:1:24"}]},"documentation":{"id":2845,"nodeType":"StructuredDocumentation","src":"981:77:24","text":" @dev Throws if called by any account other than the owner."},"id":2852,"name":"onlyOwner","nameLocation":"1072:9:24","nodeType":"ModifierDefinition","parameters":{"id":2846,"nodeType":"ParameterList","parameters":[],"src":"1081:2:24"},"src":"1063:62:24","virtual":false,"visibility":"internal"},{"body":{"id":2860,"nodeType":"Block","src":"1256:30:24","statements":[{"expression":{"id":2858,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2828,"src":"1273:6:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":2857,"id":2859,"nodeType":"Return","src":"1266:13:24"}]},"documentation":{"id":2853,"nodeType":"StructuredDocumentation","src":"1131:65:24","text":" @dev Returns the address of the current owner."},"functionSelector":"8da5cb5b","id":2861,"implemented":true,"kind":"function","modifiers":[],"name":"owner","nameLocation":"1210:5:24","nodeType":"FunctionDefinition","parameters":{"id":2854,"nodeType":"ParameterList","parameters":[],"src":"1215:2:24"},"returnParameters":{"id":2857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2856,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2861,"src":"1247:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2855,"name":"address","nodeType":"ElementaryTypeName","src":"1247:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1246:9:24"},"scope":2933,"src":"1201:85:24","stateMutability":"view","virtual":true,"visibility":"public"},{"body":{"id":2874,"nodeType":"Block","src":"1404:85:24","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":2866,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"1422:5:24","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":2867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1422:7:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":2868,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"1433:10:24","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":2869,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1433:12:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1422:23:24","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","id":2871,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1447:34:24","typeDescriptions":{"typeIdentifier":"t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe","typeString":"literal_string \"Ownable: caller is not the owner\""},"value":"Ownable: caller is not the owner"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe","typeString":"literal_string \"Ownable: caller is not the owner\""}],"id":2865,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1414:7:24","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2872,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1414:68:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2873,"nodeType":"ExpressionStatement","src":"1414:68:24"}]},"documentation":{"id":2862,"nodeType":"StructuredDocumentation","src":"1292:62:24","text":" @dev Throws if the sender is not the owner."},"id":2875,"implemented":true,"kind":"function","modifiers":[],"name":"_checkOwner","nameLocation":"1368:11:24","nodeType":"FunctionDefinition","parameters":{"id":2863,"nodeType":"ParameterList","parameters":[],"src":"1379:2:24"},"returnParameters":{"id":2864,"nodeType":"ParameterList","parameters":[],"src":"1404:0:24"},"scope":2933,"src":"1359:130:24","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":2888,"nodeType":"Block","src":"1885:47:24","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":2884,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1922:1:24","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2883,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1914:7:24","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2882,"name":"address","nodeType":"ElementaryTypeName","src":"1914:7:24","typeDescriptions":{}}},"id":2885,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1914:10:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2881,"name":"_transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2932,"src":"1895:18:24","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":2886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1895:30:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2887,"nodeType":"ExpressionStatement","src":"1895:30:24"}]},"documentation":{"id":2876,"nodeType":"StructuredDocumentation","src":"1495:331:24","text":" @dev Leaves the contract without owner. It will not be possible to call\n `onlyOwner` functions anymore. Can only be called by the current owner.\n NOTE: Renouncing ownership will leave the contract without an owner,\n thereby removing any functionality that is only available to the owner."},"functionSelector":"715018a6","id":2889,"implemented":true,"kind":"function","modifiers":[{"id":2879,"kind":"modifierInvocation","modifierName":{"id":2878,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"1875:9:24"},"nodeType":"ModifierInvocation","src":"1875:9:24"}],"name":"renounceOwnership","nameLocation":"1840:17:24","nodeType":"FunctionDefinition","parameters":{"id":2877,"nodeType":"ParameterList","parameters":[],"src":"1857:2:24"},"returnParameters":{"id":2880,"nodeType":"ParameterList","parameters":[],"src":"1885:0:24"},"scope":2933,"src":"1831:101:24","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":2911,"nodeType":"Block","src":"2151:128:24","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":2903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2898,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2892,"src":"2169:8:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":2901,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2189:1:24","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2900,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2181:7:24","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2899,"name":"address","nodeType":"ElementaryTypeName","src":"2181:7:24","typeDescriptions":{}}},"id":2902,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2181:10:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2169:22:24","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373","id":2904,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2193:40:24","typeDescriptions":{"typeIdentifier":"t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe","typeString":"literal_string \"Ownable: new owner is the zero address\""},"value":"Ownable: new owner is the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe","typeString":"literal_string \"Ownable: new owner is the zero address\""}],"id":2897,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2161:7:24","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":2905,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2161:73:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2906,"nodeType":"ExpressionStatement","src":"2161:73:24"},{"expression":{"arguments":[{"id":2908,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2892,"src":"2263:8:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":2907,"name":"_transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2932,"src":"2244:18:24","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":2909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2244:28:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2910,"nodeType":"ExpressionStatement","src":"2244:28:24"}]},"documentation":{"id":2890,"nodeType":"StructuredDocumentation","src":"1938:138:24","text":" @dev Transfers ownership of the contract to a new account (`newOwner`).\n Can only be called by the current owner."},"functionSelector":"f2fde38b","id":2912,"implemented":true,"kind":"function","modifiers":[{"id":2895,"kind":"modifierInvocation","modifierName":{"id":2894,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2141:9:24"},"nodeType":"ModifierInvocation","src":"2141:9:24"}],"name":"transferOwnership","nameLocation":"2090:17:24","nodeType":"FunctionDefinition","parameters":{"id":2893,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2892,"mutability":"mutable","name":"newOwner","nameLocation":"2116:8:24","nodeType":"VariableDeclaration","scope":2912,"src":"2108:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2891,"name":"address","nodeType":"ElementaryTypeName","src":"2108:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2107:18:24"},"returnParameters":{"id":2896,"nodeType":"ParameterList","parameters":[],"src":"2151:0:24"},"scope":2933,"src":"2081:198:24","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":2931,"nodeType":"Block","src":"2496:124:24","statements":[{"assignments":[2919],"declarations":[{"constant":false,"id":2919,"mutability":"mutable","name":"oldOwner","nameLocation":"2514:8:24","nodeType":"VariableDeclaration","scope":2931,"src":"2506:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2918,"name":"address","nodeType":"ElementaryTypeName","src":"2506:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2921,"initialValue":{"id":2920,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2828,"src":"2525:6:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2506:25:24"},{"expression":{"id":2924,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2922,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2828,"src":"2541:6:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2923,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2915,"src":"2550:8:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2541:17:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":2925,"nodeType":"ExpressionStatement","src":"2541:17:24"},{"eventCall":{"arguments":[{"id":2927,"name":"oldOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2919,"src":"2594:8:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2928,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2915,"src":"2604:8:24","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":2926,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2834,"src":"2573:20:24","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":2929,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2573:40:24","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2930,"nodeType":"EmitStatement","src":"2568:45:24"}]},"documentation":{"id":2913,"nodeType":"StructuredDocumentation","src":"2285:143:24","text":" @dev Transfers ownership of the contract to a new account (`newOwner`).\n Internal function without access restriction."},"id":2932,"implemented":true,"kind":"function","modifiers":[],"name":"_transferOwnership","nameLocation":"2442:18:24","nodeType":"FunctionDefinition","parameters":{"id":2916,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2915,"mutability":"mutable","name":"newOwner","nameLocation":"2469:8:24","nodeType":"VariableDeclaration","scope":2932,"src":"2461:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2914,"name":"address","nodeType":"ElementaryTypeName","src":"2461:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2460:18:24"},"returnParameters":{"id":2917,"nodeType":"ParameterList","parameters":[],"src":"2496:0:24"},"scope":2933,"src":"2433:187:24","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":2934,"src":"654:1968:24","usedErrors":[]}],"src":"102:2521:24"},"id":24},"@openzeppelin/contracts/interfaces/IERC1271.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/IERC1271.sol","exportedSymbols":{"IERC1271":[2947]},"id":2948,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2935,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"92:23:25"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1271","contractDependencies":[],"contractKind":"interface","documentation":{"id":2936,"nodeType":"StructuredDocumentation","src":"117:189:25","text":" @dev Interface of the ERC1271 standard signature validation method for\n contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n _Available since v4.1._"},"fullyImplemented":false,"id":2947,"linearizedBaseContracts":[2947],"name":"IERC1271","nameLocation":"317:8:25","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2937,"nodeType":"StructuredDocumentation","src":"332:220:25","text":" @dev Should return whether the signature provided is valid for the provided data\n @param hash Hash of the data to be signed\n @param signature Signature byte array associated with _data"},"functionSelector":"1626ba7e","id":2946,"implemented":false,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"566:16:25","nodeType":"FunctionDefinition","parameters":{"id":2942,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2939,"mutability":"mutable","name":"hash","nameLocation":"591:4:25","nodeType":"VariableDeclaration","scope":2946,"src":"583:12:25","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2938,"name":"bytes32","nodeType":"ElementaryTypeName","src":"583:7:25","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2941,"mutability":"mutable","name":"signature","nameLocation":"610:9:25","nodeType":"VariableDeclaration","scope":2946,"src":"597:22:25","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2940,"name":"bytes","nodeType":"ElementaryTypeName","src":"597:5:25","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"582:38:25"},"returnParameters":{"id":2945,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2944,"mutability":"mutable","name":"magicValue","nameLocation":"651:10:25","nodeType":"VariableDeclaration","scope":2946,"src":"644:17:25","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":2943,"name":"bytes4","nodeType":"ElementaryTypeName","src":"644:6:25","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"643:19:25"},"scope":2947,"src":"557:106:25","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":2948,"src":"307:358:25","usedErrors":[]}],"src":"92:574:25"},"id":25},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","exportedSymbols":{"IERC1822Proxiable":[2957]},"id":2958,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2949,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"113:23:26"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1822Proxiable","contractDependencies":[],"contractKind":"interface","documentation":{"id":2950,"nodeType":"StructuredDocumentation","src":"138:203:26","text":" @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n proxy whose upgrades are fully controlled by the current implementation."},"fullyImplemented":false,"id":2957,"linearizedBaseContracts":[2957],"name":"IERC1822Proxiable","nameLocation":"352:17:26","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":2951,"nodeType":"StructuredDocumentation","src":"376:438:26","text":" @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n address.\n IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n function revert if invoked through a proxy."},"functionSelector":"52d1902d","id":2956,"implemented":false,"kind":"function","modifiers":[],"name":"proxiableUUID","nameLocation":"828:13:26","nodeType":"FunctionDefinition","parameters":{"id":2952,"nodeType":"ParameterList","parameters":[],"src":"841:2:26"},"returnParameters":{"id":2955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2954,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2956,"src":"867:7:26","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2953,"name":"bytes32","nodeType":"ElementaryTypeName","src":"867:7:26","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"866:9:26"},"scope":2957,"src":"819:57:26","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":2958,"src":"342:536:26","usedErrors":[]}],"src":"113:766:26"},"id":26},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","exportedSymbols":{"Address":[5129],"ERC1967Proxy":[2994],"ERC1967Upgrade":[3312],"IBeacon":[3374],"IERC1822Proxiable":[2957],"Proxy":[3364],"StorageSlot":[5292]},"id":2995,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2959,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"114:23:27"},{"absolutePath":"@openzeppelin/contracts/proxy/Proxy.sol","file":"../Proxy.sol","id":2960,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2995,"sourceUnit":3365,"src":"139:22:27","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol","file":"./ERC1967Upgrade.sol","id":2961,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2995,"sourceUnit":3313,"src":"162:30:27","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":2963,"name":"Proxy","nodeType":"IdentifierPath","referencedDeclaration":3364,"src":"592:5:27"},"id":2964,"nodeType":"InheritanceSpecifier","src":"592:5:27"},{"baseName":{"id":2965,"name":"ERC1967Upgrade","nodeType":"IdentifierPath","referencedDeclaration":3312,"src":"599:14:27"},"id":2966,"nodeType":"InheritanceSpecifier","src":"599:14:27"}],"canonicalName":"ERC1967Proxy","contractDependencies":[],"contractKind":"contract","documentation":{"id":2962,"nodeType":"StructuredDocumentation","src":"194:372:27","text":" @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n implementation address that can be changed. This address is stored in storage in the location specified by\n https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n implementation behind the proxy."},"fullyImplemented":true,"id":2994,"linearizedBaseContracts":[2994,3312,3364],"name":"ERC1967Proxy","nameLocation":"576:12:27","nodeType":"ContractDefinition","nodes":[{"body":{"id":2980,"nodeType":"Block","src":"1014:56:27","statements":[{"expression":{"arguments":[{"id":2975,"name":"_logic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2969,"src":"1042:6:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":2976,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2971,"src":"1050:5:27","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"66616c7365","id":2977,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1057:5:27","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":2974,"name":"_upgradeToAndCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3095,"src":"1024:17:27","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":2978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1024:39:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2979,"nodeType":"ExpressionStatement","src":"1024:39:27"}]},"documentation":{"id":2967,"nodeType":"StructuredDocumentation","src":"620:333:27","text":" @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n function call, and allows initializing the storage of the proxy like a Solidity constructor."},"id":2981,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":2972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2969,"mutability":"mutable","name":"_logic","nameLocation":"978:6:27","nodeType":"VariableDeclaration","scope":2981,"src":"970:14:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2968,"name":"address","nodeType":"ElementaryTypeName","src":"970:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2971,"mutability":"mutable","name":"_data","nameLocation":"999:5:27","nodeType":"VariableDeclaration","scope":2981,"src":"986:18:27","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2970,"name":"bytes","nodeType":"ElementaryTypeName","src":"986:5:27","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"969:36:27"},"returnParameters":{"id":2973,"nodeType":"ParameterList","parameters":[],"src":"1014:0:27"},"scope":2994,"src":"958:112:27","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[3329],"body":{"id":2992,"nodeType":"Block","src":"1229:59:27","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":2988,"name":"ERC1967Upgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3312,"src":"1246:14:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1967Upgrade_$3312_$","typeString":"type(contract ERC1967Upgrade)"}},"id":2989,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_getImplementation","nodeType":"MemberAccess","referencedDeclaration":3026,"src":"1246:33:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":2990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1246:35:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":2987,"id":2991,"nodeType":"Return","src":"1239:42:27"}]},"documentation":{"id":2982,"nodeType":"StructuredDocumentation","src":"1076:67:27","text":" @dev Returns the current implementation address."},"id":2993,"implemented":true,"kind":"function","modifiers":[],"name":"_implementation","nameLocation":"1157:15:27","nodeType":"FunctionDefinition","overrides":{"id":2984,"nodeType":"OverrideSpecifier","overrides":[],"src":"1197:8:27"},"parameters":{"id":2983,"nodeType":"ParameterList","parameters":[],"src":"1172:2:27"},"returnParameters":{"id":2987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2986,"mutability":"mutable","name":"impl","nameLocation":"1223:4:27","nodeType":"VariableDeclaration","scope":2993,"src":"1215:12:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2985,"name":"address","nodeType":"ElementaryTypeName","src":"1215:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1214:14:27"},"scope":2994,"src":"1148:140:27","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":2995,"src":"567:723:27","usedErrors":[]}],"src":"114:1177:27"},"id":27},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol","exportedSymbols":{"Address":[5129],"ERC1967Upgrade":[3312],"IBeacon":[3374],"IERC1822Proxiable":[2957],"StorageSlot":[5292]},"id":3313,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2996,"literals":["solidity","^","0.8",".2"],"nodeType":"PragmaDirective","src":"116:23:28"},{"absolutePath":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","file":"../beacon/IBeacon.sol","id":2997,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3313,"sourceUnit":3375,"src":"141:31:28","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","file":"../../interfaces/draft-IERC1822.sol","id":2998,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3313,"sourceUnit":2958,"src":"173:45:28","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"../../utils/Address.sol","id":2999,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3313,"sourceUnit":5130,"src":"219:33:28","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","file":"../../utils/StorageSlot.sol","id":3000,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3313,"sourceUnit":5293,"src":"253:37:28","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"ERC1967Upgrade","contractDependencies":[],"contractKind":"contract","documentation":{"id":3001,"nodeType":"StructuredDocumentation","src":"292:236:28","text":" @dev This abstract contract provides getters and event emitting update functions for\n https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n _Available since v4.1._\n @custom:oz-upgrades-unsafe-allow delegatecall"},"fullyImplemented":true,"id":3312,"linearizedBaseContracts":[3312],"name":"ERC1967Upgrade","nameLocation":"547:14:28","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":3004,"mutability":"constant","name":"_ROLLBACK_SLOT","nameLocation":"672:14:28","nodeType":"VariableDeclaration","scope":3312,"src":"647:108:28","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3002,"name":"bytes32","nodeType":"ElementaryTypeName","src":"647:7:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307834393130666466613136666564333236306564306537313437663763633664613131613630323038623562393430366431326136333536313466666439313433","id":3003,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"689:66:28","typeDescriptions":{"typeIdentifier":"t_rational_33048860383849004559742813297059419343339852917517107368639918720169455489347_by_1","typeString":"int_const 3304...(69 digits omitted)...9347"},"value":"0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143"},"visibility":"private"},{"constant":true,"documentation":{"id":3005,"nodeType":"StructuredDocumentation","src":"762:214:28","text":" @dev Storage slot with the address of the current implementation.\n This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n validated in the constructor."},"id":3008,"mutability":"constant","name":"_IMPLEMENTATION_SLOT","nameLocation":"1007:20:28","nodeType":"VariableDeclaration","scope":3312,"src":"981:115:28","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3006,"name":"bytes32","nodeType":"ElementaryTypeName","src":"981:7:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307833363038393461313362613161333231303636376338323834393264623938646361336532303736636333373335613932306133636135303564333832626263","id":3007,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1030:66:28","typeDescriptions":{"typeIdentifier":"t_rational_24440054405305269366569402256811496959409073762505157381672968839269610695612_by_1","typeString":"int_const 2444...(69 digits omitted)...5612"},"value":"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":3009,"nodeType":"StructuredDocumentation","src":"1103:68:28","text":" @dev Emitted when the implementation is upgraded."},"eventSelector":"bc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","id":3013,"name":"Upgraded","nameLocation":"1182:8:28","nodeType":"EventDefinition","parameters":{"id":3012,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3011,"indexed":true,"mutability":"mutable","name":"implementation","nameLocation":"1207:14:28","nodeType":"VariableDeclaration","scope":3013,"src":"1191:30:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3010,"name":"address","nodeType":"ElementaryTypeName","src":"1191:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1190:32:28"},"src":"1176:47:28"},{"body":{"id":3025,"nodeType":"Block","src":"1363:78:28","statements":[{"expression":{"expression":{"arguments":[{"id":3021,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3008,"src":"1407:20:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3019,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"1380:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3020,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"1380:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3022,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1380:48:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3023,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"1380:54:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3018,"id":3024,"nodeType":"Return","src":"1373:61:28"}]},"documentation":{"id":3014,"nodeType":"StructuredDocumentation","src":"1229:67:28","text":" @dev Returns the current implementation address."},"id":3026,"implemented":true,"kind":"function","modifiers":[],"name":"_getImplementation","nameLocation":"1310:18:28","nodeType":"FunctionDefinition","parameters":{"id":3015,"nodeType":"ParameterList","parameters":[],"src":"1328:2:28"},"returnParameters":{"id":3018,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3017,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3026,"src":"1354:7:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3016,"name":"address","nodeType":"ElementaryTypeName","src":"1354:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1353:9:28"},"scope":3312,"src":"1301:140:28","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3049,"nodeType":"Block","src":"1595:196:28","statements":[{"expression":{"arguments":[{"arguments":[{"id":3035,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3029,"src":"1632:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":3033,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"1613:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":4817,"src":"1613:18:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":3036,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1613:37:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374","id":3037,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1652:47:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65","typeString":"literal_string \"ERC1967: new implementation is not a contract\""},"value":"ERC1967: new implementation is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65","typeString":"literal_string \"ERC1967: new implementation is not a contract\""}],"id":3032,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1605:7:28","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3038,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1605:95:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3039,"nodeType":"ExpressionStatement","src":"1605:95:28"},{"expression":{"id":3047,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":3043,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3008,"src":"1737:20:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3040,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"1710:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"1710:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1710:48:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3045,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"1710:54:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3046,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3029,"src":"1767:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1710:74:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3048,"nodeType":"ExpressionStatement","src":"1710:74:28"}]},"documentation":{"id":3027,"nodeType":"StructuredDocumentation","src":"1447:80:28","text":" @dev Stores a new address in the EIP1967 implementation slot."},"id":3050,"implemented":true,"kind":"function","modifiers":[],"name":"_setImplementation","nameLocation":"1541:18:28","nodeType":"FunctionDefinition","parameters":{"id":3030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3029,"mutability":"mutable","name":"newImplementation","nameLocation":"1568:17:28","nodeType":"VariableDeclaration","scope":3050,"src":"1560:25:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3028,"name":"address","nodeType":"ElementaryTypeName","src":"1560:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1559:27:28"},"returnParameters":{"id":3031,"nodeType":"ParameterList","parameters":[],"src":"1595:0:28"},"scope":3312,"src":"1532:259:28","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":3064,"nodeType":"Block","src":"1953:96:28","statements":[{"expression":{"arguments":[{"id":3057,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3053,"src":"1982:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3056,"name":"_setImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3050,"src":"1963:18:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1963:37:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3059,"nodeType":"ExpressionStatement","src":"1963:37:28"},{"eventCall":{"arguments":[{"id":3061,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3053,"src":"2024:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3060,"name":"Upgraded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3013,"src":"2015:8:28","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2015:27:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3063,"nodeType":"EmitStatement","src":"2010:32:28"}]},"documentation":{"id":3051,"nodeType":"StructuredDocumentation","src":"1797:95:28","text":" @dev Perform implementation upgrade\n Emits an {Upgraded} event."},"id":3065,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeTo","nameLocation":"1906:10:28","nodeType":"FunctionDefinition","parameters":{"id":3054,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3053,"mutability":"mutable","name":"newImplementation","nameLocation":"1925:17:28","nodeType":"VariableDeclaration","scope":3065,"src":"1917:25:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3052,"name":"address","nodeType":"ElementaryTypeName","src":"1917:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1916:27:28"},"returnParameters":{"id":3055,"nodeType":"ParameterList","parameters":[],"src":"1953:0:28"},"scope":3312,"src":"1897:152:28","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3094,"nodeType":"Block","src":"2311:167:28","statements":[{"expression":{"arguments":[{"id":3076,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3068,"src":"2332:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3075,"name":"_upgradeTo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3065,"src":"2321:10:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3077,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2321:29:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3078,"nodeType":"ExpressionStatement","src":"2321:29:28"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3079,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3070,"src":"2364:4:28","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":3080,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2364:11:28","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3081,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2378:1:28","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2364:15:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":3083,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3072,"src":"2383:9:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2364:28:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3093,"nodeType":"IfStatement","src":"2360:112:28","trueBody":{"id":3092,"nodeType":"Block","src":"2394:78:28","statements":[{"expression":{"arguments":[{"id":3088,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3068,"src":"2437:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3089,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3070,"src":"2456:4:28","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":3085,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"2408:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"functionDelegateCall","nodeType":"MemberAccess","referencedDeclaration":5016,"src":"2408:28:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory) returns (bytes memory)"}},"id":3090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2408:53:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":3091,"nodeType":"ExpressionStatement","src":"2408:53:28"}]}}]},"documentation":{"id":3066,"nodeType":"StructuredDocumentation","src":"2055:123:28","text":" @dev Perform implementation upgrade with additional setup call.\n Emits an {Upgraded} event."},"id":3095,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeToAndCall","nameLocation":"2192:17:28","nodeType":"FunctionDefinition","parameters":{"id":3073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3068,"mutability":"mutable","name":"newImplementation","nameLocation":"2227:17:28","nodeType":"VariableDeclaration","scope":3095,"src":"2219:25:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3067,"name":"address","nodeType":"ElementaryTypeName","src":"2219:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3070,"mutability":"mutable","name":"data","nameLocation":"2267:4:28","nodeType":"VariableDeclaration","scope":3095,"src":"2254:17:28","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3069,"name":"bytes","nodeType":"ElementaryTypeName","src":"2254:5:28","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3072,"mutability":"mutable","name":"forceCall","nameLocation":"2286:9:28","nodeType":"VariableDeclaration","scope":3095,"src":"2281:14:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3071,"name":"bool","nodeType":"ElementaryTypeName","src":"2281:4:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2209:92:28"},"returnParameters":{"id":3074,"nodeType":"ParameterList","parameters":[],"src":"2311:0:28"},"scope":3312,"src":"2183:295:28","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3147,"nodeType":"Block","src":"2782:820:28","statements":[{"condition":{"expression":{"arguments":[{"id":3107,"name":"_ROLLBACK_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3004,"src":"3123:14:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3105,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"3096:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3106,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getBooleanSlot","nodeType":"MemberAccess","referencedDeclaration":5269,"src":"3096:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_BooleanSlot_$5241_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.BooleanSlot storage pointer)"}},"id":3108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3096:42:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$5241_storage_ptr","typeString":"struct StorageSlot.BooleanSlot storage pointer"}},"id":3109,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5240,"src":"3096:48:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":3145,"nodeType":"Block","src":"3214:382:28","statements":[{"clauses":[{"block":{"id":3130,"nodeType":"Block","src":"3308:115:28","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3126,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3124,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3121,"src":"3334:4:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3125,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3008,"src":"3342:20:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3334:28:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f786961626c6555554944","id":3127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3364:43:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c","typeString":"literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""},"value":"ERC1967Upgrade: unsupported proxiableUUID"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c","typeString":"literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""}],"id":3123,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3326:7:28","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3128,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3326:82:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3129,"nodeType":"ExpressionStatement","src":"3326:82:28"}]},"errorName":"","id":3131,"nodeType":"TryCatchClause","parameters":{"id":3122,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3121,"mutability":"mutable","name":"slot","nameLocation":"3302:4:28","nodeType":"VariableDeclaration","scope":3131,"src":"3294:12:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3120,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3294:7:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3293:14:28"},"src":"3285:138:28"},{"block":{"id":3136,"nodeType":"Block","src":"3430:89:28","statements":[{"expression":{"arguments":[{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e746174696f6e206973206e6f742055555053","id":3133,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3455:48:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24","typeString":"literal_string \"ERC1967Upgrade: new implementation is not UUPS\""},"value":"ERC1967Upgrade: new implementation is not UUPS"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24","typeString":"literal_string \"ERC1967Upgrade: new implementation is not UUPS\""}],"id":3132,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"3448:6:28","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":3134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3448:56:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3135,"nodeType":"ExpressionStatement","src":"3448:56:28"}]},"errorName":"","id":3137,"nodeType":"TryCatchClause","src":"3424:95:28"}],"externalCall":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":3116,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3098,"src":"3250:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3115,"name":"IERC1822Proxiable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2957,"src":"3232:17:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1822Proxiable_$2957_$","typeString":"type(contract IERC1822Proxiable)"}},"id":3117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3232:36:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1822Proxiable_$2957","typeString":"contract IERC1822Proxiable"}},"id":3118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"proxiableUUID","nodeType":"MemberAccess","referencedDeclaration":2956,"src":"3232:50:28","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bytes32_$","typeString":"function () view external returns (bytes32)"}},"id":3119,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3232:52:28","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3138,"nodeType":"TryStatement","src":"3228:291:28"},{"expression":{"arguments":[{"id":3140,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3098,"src":"3550:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3141,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3100,"src":"3569:4:28","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":3142,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3102,"src":"3575:9:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":3139,"name":"_upgradeToAndCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3095,"src":"3532:17:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":3143,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3532:53:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3144,"nodeType":"ExpressionStatement","src":"3532:53:28"}]},"id":3146,"nodeType":"IfStatement","src":"3092:504:28","trueBody":{"id":3114,"nodeType":"Block","src":"3146:62:28","statements":[{"expression":{"arguments":[{"id":3111,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3098,"src":"3179:17:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3110,"name":"_setImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3050,"src":"3160:18:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3112,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3160:37:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3113,"nodeType":"ExpressionStatement","src":"3160:37:28"}]}}]},"documentation":{"id":3096,"nodeType":"StructuredDocumentation","src":"2484:161:28","text":" @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n Emits an {Upgraded} event."},"id":3148,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeToAndCallUUPS","nameLocation":"2659:21:28","nodeType":"FunctionDefinition","parameters":{"id":3103,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3098,"mutability":"mutable","name":"newImplementation","nameLocation":"2698:17:28","nodeType":"VariableDeclaration","scope":3148,"src":"2690:25:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3097,"name":"address","nodeType":"ElementaryTypeName","src":"2690:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3100,"mutability":"mutable","name":"data","nameLocation":"2738:4:28","nodeType":"VariableDeclaration","scope":3148,"src":"2725:17:28","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3099,"name":"bytes","nodeType":"ElementaryTypeName","src":"2725:5:28","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3102,"mutability":"mutable","name":"forceCall","nameLocation":"2757:9:28","nodeType":"VariableDeclaration","scope":3148,"src":"2752:14:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3101,"name":"bool","nodeType":"ElementaryTypeName","src":"2752:4:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2680:92:28"},"returnParameters":{"id":3104,"nodeType":"ParameterList","parameters":[],"src":"2782:0:28"},"scope":3312,"src":"2650:952:28","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"constant":true,"documentation":{"id":3149,"nodeType":"StructuredDocumentation","src":"3608:189:28","text":" @dev Storage slot with the admin of the contract.\n This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n validated in the constructor."},"id":3152,"mutability":"constant","name":"_ADMIN_SLOT","nameLocation":"3828:11:28","nodeType":"VariableDeclaration","scope":3312,"src":"3802:106:28","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3150,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3802:7:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307862353331323736383461353638623331373361653133623966386136303136653234336536336236653865653131373864366137313738353062356436313033","id":3151,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3842:66:28","typeDescriptions":{"typeIdentifier":"t_rational_81955473079516046949633743016697847541294818689821282749996681496272635257091_by_1","typeString":"int_const 8195...(69 digits omitted)...7091"},"value":"0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":3153,"nodeType":"StructuredDocumentation","src":"3915:67:28","text":" @dev Emitted when the admin account has changed."},"eventSelector":"7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f","id":3159,"name":"AdminChanged","nameLocation":"3993:12:28","nodeType":"EventDefinition","parameters":{"id":3158,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3155,"indexed":false,"mutability":"mutable","name":"previousAdmin","nameLocation":"4014:13:28","nodeType":"VariableDeclaration","scope":3159,"src":"4006:21:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3154,"name":"address","nodeType":"ElementaryTypeName","src":"4006:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3157,"indexed":false,"mutability":"mutable","name":"newAdmin","nameLocation":"4037:8:28","nodeType":"VariableDeclaration","scope":3159,"src":"4029:16:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3156,"name":"address","nodeType":"ElementaryTypeName","src":"4029:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4005:41:28"},"src":"3987:60:28"},{"body":{"id":3171,"nodeType":"Block","src":"4161:69:28","statements":[{"expression":{"expression":{"arguments":[{"id":3167,"name":"_ADMIN_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3152,"src":"4205:11:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3165,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"4178:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"4178:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4178:39:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3169,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"4178:45:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3164,"id":3170,"nodeType":"Return","src":"4171:52:28"}]},"documentation":{"id":3160,"nodeType":"StructuredDocumentation","src":"4053:50:28","text":" @dev Returns the current admin."},"id":3172,"implemented":true,"kind":"function","modifiers":[],"name":"_getAdmin","nameLocation":"4117:9:28","nodeType":"FunctionDefinition","parameters":{"id":3161,"nodeType":"ParameterList","parameters":[],"src":"4126:2:28"},"returnParameters":{"id":3164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3163,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3172,"src":"4152:7:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3162,"name":"address","nodeType":"ElementaryTypeName","src":"4152:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4151:9:28"},"scope":3312,"src":"4108:122:28","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3197,"nodeType":"Block","src":"4357:156:28","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3179,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3175,"src":"4375:8:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":3182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4395:1:28","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3181,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4387:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3180,"name":"address","nodeType":"ElementaryTypeName","src":"4387:7:28","typeDescriptions":{}}},"id":3183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4387:10:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4375:22:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e65772061646d696e20697320746865207a65726f2061646472657373","id":3185,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4399:40:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5","typeString":"literal_string \"ERC1967: new admin is the zero address\""},"value":"ERC1967: new admin is the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5","typeString":"literal_string \"ERC1967: new admin is the zero address\""}],"id":3178,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4367:7:28","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3186,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4367:73:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3187,"nodeType":"ExpressionStatement","src":"4367:73:28"},{"expression":{"id":3195,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":3191,"name":"_ADMIN_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3152,"src":"4477:11:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3188,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"4450:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"4450:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4450:39:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3193,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"4450:45:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3194,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3175,"src":"4498:8:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4450:56:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3196,"nodeType":"ExpressionStatement","src":"4450:56:28"}]},"documentation":{"id":3173,"nodeType":"StructuredDocumentation","src":"4236:71:28","text":" @dev Stores a new address in the EIP1967 admin slot."},"id":3198,"implemented":true,"kind":"function","modifiers":[],"name":"_setAdmin","nameLocation":"4321:9:28","nodeType":"FunctionDefinition","parameters":{"id":3176,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3175,"mutability":"mutable","name":"newAdmin","nameLocation":"4339:8:28","nodeType":"VariableDeclaration","scope":3198,"src":"4331:16:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3174,"name":"address","nodeType":"ElementaryTypeName","src":"4331:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4330:18:28"},"returnParameters":{"id":3177,"nodeType":"ParameterList","parameters":[],"src":"4357:0:28"},"scope":3312,"src":"4312:201:28","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":3214,"nodeType":"Block","src":"4673:86:28","statements":[{"eventCall":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":3205,"name":"_getAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3172,"src":"4701:9:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3206,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4701:11:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3207,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3201,"src":"4714:8:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":3204,"name":"AdminChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3159,"src":"4688:12:28","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":3208,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4688:35:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3209,"nodeType":"EmitStatement","src":"4683:40:28"},{"expression":{"arguments":[{"id":3211,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3201,"src":"4743:8:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3210,"name":"_setAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3198,"src":"4733:9:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4733:19:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3213,"nodeType":"ExpressionStatement","src":"4733:19:28"}]},"documentation":{"id":3199,"nodeType":"StructuredDocumentation","src":"4519:100:28","text":" @dev Changes the admin of the proxy.\n Emits an {AdminChanged} event."},"id":3215,"implemented":true,"kind":"function","modifiers":[],"name":"_changeAdmin","nameLocation":"4633:12:28","nodeType":"FunctionDefinition","parameters":{"id":3202,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3201,"mutability":"mutable","name":"newAdmin","nameLocation":"4654:8:28","nodeType":"VariableDeclaration","scope":3215,"src":"4646:16:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3200,"name":"address","nodeType":"ElementaryTypeName","src":"4646:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4645:18:28"},"returnParameters":{"id":3203,"nodeType":"ParameterList","parameters":[],"src":"4673:0:28"},"scope":3312,"src":"4624:135:28","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"constant":true,"documentation":{"id":3216,"nodeType":"StructuredDocumentation","src":"4765:232:28","text":" @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor."},"id":3219,"mutability":"constant","name":"_BEACON_SLOT","nameLocation":"5028:12:28","nodeType":"VariableDeclaration","scope":3312,"src":"5002:107:28","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3217,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5002:7:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"307861336630616437346535343233616562666438306433656634333436353738333335613961373261656165653539666636636233353832623335313333643530","id":3218,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5043:66:28","typeDescriptions":{"typeIdentifier":"t_rational_74152234768234802001998023604048924213078445070507226371336425913862612794704_by_1","typeString":"int_const 7415...(69 digits omitted)...4704"},"value":"0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50"},"visibility":"internal"},{"anonymous":false,"documentation":{"id":3220,"nodeType":"StructuredDocumentation","src":"5116:60:28","text":" @dev Emitted when the beacon is upgraded."},"eventSelector":"1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e","id":3224,"name":"BeaconUpgraded","nameLocation":"5187:14:28","nodeType":"EventDefinition","parameters":{"id":3223,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3222,"indexed":true,"mutability":"mutable","name":"beacon","nameLocation":"5218:6:28","nodeType":"VariableDeclaration","scope":3224,"src":"5202:22:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3221,"name":"address","nodeType":"ElementaryTypeName","src":"5202:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5201:24:28"},"src":"5181:45:28"},{"body":{"id":3236,"nodeType":"Block","src":"5342:70:28","statements":[{"expression":{"expression":{"arguments":[{"id":3232,"name":"_BEACON_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3219,"src":"5386:12:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3230,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"5359:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"5359:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5359:40:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3234,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"5359:46:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3229,"id":3235,"nodeType":"Return","src":"5352:53:28"}]},"documentation":{"id":3225,"nodeType":"StructuredDocumentation","src":"5232:51:28","text":" @dev Returns the current beacon."},"id":3237,"implemented":true,"kind":"function","modifiers":[],"name":"_getBeacon","nameLocation":"5297:10:28","nodeType":"FunctionDefinition","parameters":{"id":3226,"nodeType":"ParameterList","parameters":[],"src":"5307:2:28"},"returnParameters":{"id":3229,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3228,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3237,"src":"5333:7:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3227,"name":"address","nodeType":"ElementaryTypeName","src":"5333:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5332:9:28"},"scope":3312,"src":"5288:124:28","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3272,"nodeType":"Block","src":"5541:324:28","statements":[{"expression":{"arguments":[{"arguments":[{"id":3246,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3240,"src":"5578:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":3244,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"5559:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":4817,"src":"5559:18:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":3247,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5559:29:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a206e657720626561636f6e206973206e6f74206120636f6e7472616374","id":3248,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5590:39:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470","typeString":"literal_string \"ERC1967: new beacon is not a contract\""},"value":"ERC1967: new beacon is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470","typeString":"literal_string \"ERC1967: new beacon is not a contract\""}],"id":3243,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5551:7:28","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3249,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5551:79:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3250,"nodeType":"ExpressionStatement","src":"5551:79:28"},{"expression":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":3255,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3240,"src":"5688:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3254,"name":"IBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3374,"src":"5680:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBeacon_$3374_$","typeString":"type(contract IBeacon)"}},"id":3256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5680:18:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBeacon_$3374","typeString":"contract IBeacon"}},"id":3257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"implementation","nodeType":"MemberAccess","referencedDeclaration":3373,"src":"5680:33:28","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":3258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5680:35:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":3252,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"5661:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":4817,"src":"5661:18:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":3259,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5661:55:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"455243313936373a20626561636f6e20696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374","id":3260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5730:50:28","typeDescriptions":{"typeIdentifier":"t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8","typeString":"literal_string \"ERC1967: beacon implementation is not a contract\""},"value":"ERC1967: beacon implementation is not a contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8","typeString":"literal_string \"ERC1967: beacon implementation is not a contract\""}],"id":3251,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5640:7:28","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3261,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5640:150:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3262,"nodeType":"ExpressionStatement","src":"5640:150:28"},{"expression":{"id":3270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"arguments":[{"id":3266,"name":"_BEACON_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3219,"src":"5827:12:28","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3263,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5292,"src":"5800:11:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$5292_$","typeString":"type(library StorageSlot)"}},"id":3265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddressSlot","nodeType":"MemberAccess","referencedDeclaration":5258,"src":"5800:26:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$5238_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"}},"id":3267,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5800:40:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot storage pointer"}},"id":3268,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":5237,"src":"5800:46:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3269,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3240,"src":"5849:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5800:58:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":3271,"nodeType":"ExpressionStatement","src":"5800:58:28"}]},"documentation":{"id":3238,"nodeType":"StructuredDocumentation","src":"5418:71:28","text":" @dev Stores a new beacon in the EIP1967 beacon slot."},"id":3273,"implemented":true,"kind":"function","modifiers":[],"name":"_setBeacon","nameLocation":"5503:10:28","nodeType":"FunctionDefinition","parameters":{"id":3241,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3240,"mutability":"mutable","name":"newBeacon","nameLocation":"5522:9:28","nodeType":"VariableDeclaration","scope":3273,"src":"5514:17:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3239,"name":"address","nodeType":"ElementaryTypeName","src":"5514:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5513:19:28"},"returnParameters":{"id":3242,"nodeType":"ParameterList","parameters":[],"src":"5541:0:28"},"scope":3312,"src":"5494:371:28","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":3310,"nodeType":"Block","src":"6294:217:28","statements":[{"expression":{"arguments":[{"id":3284,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3276,"src":"6315:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3283,"name":"_setBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3273,"src":"6304:10:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3285,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6304:21:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3286,"nodeType":"ExpressionStatement","src":"6304:21:28"},{"eventCall":{"arguments":[{"id":3288,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3276,"src":"6355:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3287,"name":"BeaconUpgraded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3224,"src":"6340:14:28","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6340:25:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3290,"nodeType":"EmitStatement","src":"6335:30:28"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":3291,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3278,"src":"6379:4:28","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":3292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6379:11:28","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6393:1:28","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6379:15:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":3295,"name":"forceCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3280,"src":"6398:9:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6379:28:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3309,"nodeType":"IfStatement","src":"6375:130:28","trueBody":{"id":3308,"nodeType":"Block","src":"6409:96:28","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":3301,"name":"newBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3276,"src":"6460:9:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3300,"name":"IBeacon","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3374,"src":"6452:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBeacon_$3374_$","typeString":"type(contract IBeacon)"}},"id":3302,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6452:18:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBeacon_$3374","typeString":"contract IBeacon"}},"id":3303,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"implementation","nodeType":"MemberAccess","referencedDeclaration":3373,"src":"6452:33:28","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":3304,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6452:35:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3305,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3278,"src":"6489:4:28","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":3297,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"6423:7:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"functionDelegateCall","nodeType":"MemberAccess","referencedDeclaration":5016,"src":"6423:28:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory) returns (bytes memory)"}},"id":3306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6423:71:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":3307,"nodeType":"ExpressionStatement","src":"6423:71:28"}]}}]},"documentation":{"id":3274,"nodeType":"StructuredDocumentation","src":"5871:292:28","text":" @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n Emits a {BeaconUpgraded} event."},"id":3311,"implemented":true,"kind":"function","modifiers":[],"name":"_upgradeBeaconToAndCall","nameLocation":"6177:23:28","nodeType":"FunctionDefinition","parameters":{"id":3281,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3276,"mutability":"mutable","name":"newBeacon","nameLocation":"6218:9:28","nodeType":"VariableDeclaration","scope":3311,"src":"6210:17:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3275,"name":"address","nodeType":"ElementaryTypeName","src":"6210:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3278,"mutability":"mutable","name":"data","nameLocation":"6250:4:28","nodeType":"VariableDeclaration","scope":3311,"src":"6237:17:28","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3277,"name":"bytes","nodeType":"ElementaryTypeName","src":"6237:5:28","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":3280,"mutability":"mutable","name":"forceCall","nameLocation":"6269:9:28","nodeType":"VariableDeclaration","scope":3311,"src":"6264:14:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3279,"name":"bool","nodeType":"ElementaryTypeName","src":"6264:4:28","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6200:84:28"},"returnParameters":{"id":3282,"nodeType":"ParameterList","parameters":[],"src":"6294:0:28"},"scope":3312,"src":"6168:343:28","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":3313,"src":"529:5984:28","usedErrors":[]}],"src":"116:6398:28"},"id":28},"@openzeppelin/contracts/proxy/Proxy.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/Proxy.sol","exportedSymbols":{"Proxy":[3364]},"id":3365,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3314,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"99:23:29"},{"abstract":true,"baseContracts":[],"canonicalName":"Proxy","contractDependencies":[],"contractKind":"contract","documentation":{"id":3315,"nodeType":"StructuredDocumentation","src":"124:598:29","text":" @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n be specified by overriding the virtual {_implementation} function.\n Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n different contract through the {_delegate} function.\n The success and return data of the delegated call will be returned back to the caller of the proxy."},"fullyImplemented":false,"id":3364,"linearizedBaseContracts":[3364],"name":"Proxy","nameLocation":"741:5:29","nodeType":"ContractDefinition","nodes":[{"body":{"id":3322,"nodeType":"Block","src":"1008:835:29","statements":[{"AST":{"nodeType":"YulBlock","src":"1027:810:29","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1280:1:29","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1283:1:29","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1286:12:29"},"nodeType":"YulFunctionCall","src":"1286:14:29"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1267:12:29"},"nodeType":"YulFunctionCall","src":"1267:34:29"},"nodeType":"YulExpressionStatement","src":"1267:34:29"},{"nodeType":"YulVariableDeclaration","src":"1428:74:29","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1455:3:29"},"nodeType":"YulFunctionCall","src":"1455:5:29"},{"name":"implementation","nodeType":"YulIdentifier","src":"1462:14:29"},{"kind":"number","nodeType":"YulLiteral","src":"1478:1:29","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1481:12:29"},"nodeType":"YulFunctionCall","src":"1481:14:29"},{"kind":"number","nodeType":"YulLiteral","src":"1497:1:29","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1500:1:29","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"1442:12:29"},"nodeType":"YulFunctionCall","src":"1442:60:29"},"variables":[{"name":"result","nodeType":"YulTypedName","src":"1432:6:29","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1570:1:29","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1573:1:29","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1576:14:29"},"nodeType":"YulFunctionCall","src":"1576:16:29"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"1555:14:29"},"nodeType":"YulFunctionCall","src":"1555:38:29"},"nodeType":"YulExpressionStatement","src":"1555:38:29"},{"cases":[{"body":{"nodeType":"YulBlock","src":"1688:59:29","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1713:1:29","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1716:14:29"},"nodeType":"YulFunctionCall","src":"1716:16:29"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1706:6:29"},"nodeType":"YulFunctionCall","src":"1706:27:29"},"nodeType":"YulExpressionStatement","src":"1706:27:29"}]},"nodeType":"YulCase","src":"1681:66:29","value":{"kind":"number","nodeType":"YulLiteral","src":"1686:1:29","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"1768:59:29","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1793:1:29","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1796:14:29"},"nodeType":"YulFunctionCall","src":"1796:16:29"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"1786:6:29"},"nodeType":"YulFunctionCall","src":"1786:27:29"},"nodeType":"YulExpressionStatement","src":"1786:27:29"}]},"nodeType":"YulCase","src":"1760:67:29","value":"default"}],"expression":{"name":"result","nodeType":"YulIdentifier","src":"1614:6:29"},"nodeType":"YulSwitch","src":"1607:220:29"}]},"evmVersion":"london","externalReferences":[{"declaration":3318,"isOffset":false,"isSlot":false,"src":"1462:14:29","valueSize":1}],"id":3321,"nodeType":"InlineAssembly","src":"1018:819:29"}]},"documentation":{"id":3316,"nodeType":"StructuredDocumentation","src":"753:190:29","text":" @dev Delegates the current call to `implementation`.\n This function does not return to its internal call site, it will return directly to the external caller."},"id":3323,"implemented":true,"kind":"function","modifiers":[],"name":"_delegate","nameLocation":"957:9:29","nodeType":"FunctionDefinition","parameters":{"id":3319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3318,"mutability":"mutable","name":"implementation","nameLocation":"975:14:29","nodeType":"VariableDeclaration","scope":3323,"src":"967:22:29","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3317,"name":"address","nodeType":"ElementaryTypeName","src":"967:7:29","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"966:24:29"},"returnParameters":{"id":3320,"nodeType":"ParameterList","parameters":[],"src":"1008:0:29"},"scope":3364,"src":"948:895:29","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"documentation":{"id":3324,"nodeType":"StructuredDocumentation","src":"1849:173:29","text":" @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n and {_fallback} should delegate."},"id":3329,"implemented":false,"kind":"function","modifiers":[],"name":"_implementation","nameLocation":"2036:15:29","nodeType":"FunctionDefinition","parameters":{"id":3325,"nodeType":"ParameterList","parameters":[],"src":"2051:2:29"},"returnParameters":{"id":3328,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3327,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3329,"src":"2085:7:29","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3326,"name":"address","nodeType":"ElementaryTypeName","src":"2085:7:29","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2084:9:29"},"scope":3364,"src":"2027:67:29","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":3341,"nodeType":"Block","src":"2360:72:29","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3333,"name":"_beforeFallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3363,"src":"2370:15:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2370:17:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3335,"nodeType":"ExpressionStatement","src":"2370:17:29"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":3337,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3329,"src":"2407:15:29","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3338,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2407:17:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3336,"name":"_delegate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3323,"src":"2397:9:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3339,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2397:28:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3340,"nodeType":"ExpressionStatement","src":"2397:28:29"}]},"documentation":{"id":3330,"nodeType":"StructuredDocumentation","src":"2100:217:29","text":" @dev Delegates the current call to the address returned by `_implementation()`.\n This function does not return to its internal call site, it will return directly to the external caller."},"id":3342,"implemented":true,"kind":"function","modifiers":[],"name":"_fallback","nameLocation":"2331:9:29","nodeType":"FunctionDefinition","parameters":{"id":3331,"nodeType":"ParameterList","parameters":[],"src":"2340:2:29"},"returnParameters":{"id":3332,"nodeType":"ParameterList","parameters":[],"src":"2360:0:29"},"scope":3364,"src":"2322:110:29","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":3349,"nodeType":"Block","src":"2665:28:29","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3346,"name":"_fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3342,"src":"2675:9:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3347,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2675:11:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3348,"nodeType":"ExpressionStatement","src":"2675:11:29"}]},"documentation":{"id":3343,"nodeType":"StructuredDocumentation","src":"2438:186:29","text":" @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n function in the contract matches the call data."},"id":3350,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3344,"nodeType":"ParameterList","parameters":[],"src":"2637:2:29"},"returnParameters":{"id":3345,"nodeType":"ParameterList","parameters":[],"src":"2665:0:29"},"scope":3364,"src":"2629:64:29","stateMutability":"payable","virtual":true,"visibility":"external"},{"body":{"id":3357,"nodeType":"Block","src":"2888:28:29","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3354,"name":"_fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3342,"src":"2898:9:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3355,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2898:11:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3356,"nodeType":"ExpressionStatement","src":"2898:11:29"}]},"documentation":{"id":3351,"nodeType":"StructuredDocumentation","src":"2699:149:29","text":" @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n is empty."},"id":3358,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3352,"nodeType":"ParameterList","parameters":[],"src":"2860:2:29"},"returnParameters":{"id":3353,"nodeType":"ParameterList","parameters":[],"src":"2888:0:29"},"scope":3364,"src":"2853:63:29","stateMutability":"payable","virtual":true,"visibility":"external"},{"body":{"id":3362,"nodeType":"Block","src":"3242:2:29","statements":[]},"documentation":{"id":3359,"nodeType":"StructuredDocumentation","src":"2922:271:29","text":" @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n call, or as part of the Solidity `fallback` or `receive` functions.\n If overridden should call `super._beforeFallback()`."},"id":3363,"implemented":true,"kind":"function","modifiers":[],"name":"_beforeFallback","nameLocation":"3207:15:29","nodeType":"FunctionDefinition","parameters":{"id":3360,"nodeType":"ParameterList","parameters":[],"src":"3222:2:29"},"returnParameters":{"id":3361,"nodeType":"ParameterList","parameters":[],"src":"3242:0:29"},"scope":3364,"src":"3198:46:29","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":3365,"src":"723:2523:29","usedErrors":[]}],"src":"99:3148:29"},"id":29},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","exportedSymbols":{"IBeacon":[3374]},"id":3375,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3366,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"93:23:30"},{"abstract":false,"baseContracts":[],"canonicalName":"IBeacon","contractDependencies":[],"contractKind":"interface","documentation":{"id":3367,"nodeType":"StructuredDocumentation","src":"118:79:30","text":" @dev This is the interface that {BeaconProxy} expects of its beacon."},"fullyImplemented":false,"id":3374,"linearizedBaseContracts":[3374],"name":"IBeacon","nameLocation":"208:7:30","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3368,"nodeType":"StructuredDocumentation","src":"222:162:30","text":" @dev Must return an address that can be used as a delegate call target.\n {BeaconProxy} will check that this address is a contract."},"functionSelector":"5c60da1b","id":3373,"implemented":false,"kind":"function","modifiers":[],"name":"implementation","nameLocation":"398:14:30","nodeType":"FunctionDefinition","parameters":{"id":3369,"nodeType":"ParameterList","parameters":[],"src":"412:2:30"},"returnParameters":{"id":3372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3371,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3373,"src":"438:7:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3370,"name":"address","nodeType":"ElementaryTypeName","src":"438:7:30","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"437:9:30"},"scope":3374,"src":"389:58:30","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":3375,"src":"198:251:30","usedErrors":[]}],"src":"93:357:30"},"id":30},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/utils/Initializable.sol","exportedSymbols":{"Address":[5129],"Initializable":[3543]},"id":3544,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3376,"literals":["solidity","^","0.8",".2"],"nodeType":"PragmaDirective","src":"113:23:31"},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"../../utils/Address.sol","id":3377,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3544,"sourceUnit":5130,"src":"138:33:31","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"Initializable","contractDependencies":[],"contractKind":"contract","documentation":{"id":3378,"nodeType":"StructuredDocumentation","src":"173:2198:31","text":" @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n case an upgrade adds a module that needs to be initialized.\n For example:\n [.hljs-theme-light.nopadding]\n ```\n contract MyToken is ERC20Upgradeable {\n function initialize() initializer public {\n __ERC20_init(\"MyToken\", \"MTK\");\n }\n }\n contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n function initializeV2() reinitializer(2) public {\n __ERC20Permit_init(\"MyToken\");\n }\n }\n ```\n TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n [CAUTION]\n ====\n Avoid leaving a contract uninitialized.\n An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n [.hljs-theme-light.nopadding]\n ```\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n ```\n ===="},"fullyImplemented":true,"id":3543,"linearizedBaseContracts":[3543],"name":"Initializable","nameLocation":"2390:13:31","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":3379,"nodeType":"StructuredDocumentation","src":"2410:109:31","text":" @dev Indicates that the contract has been initialized.\n @custom:oz-retyped-from bool"},"id":3381,"mutability":"mutable","name":"_initialized","nameLocation":"2538:12:31","nodeType":"VariableDeclaration","scope":3543,"src":"2524:26:31","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3380,"name":"uint8","nodeType":"ElementaryTypeName","src":"2524:5:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"private"},{"constant":false,"documentation":{"id":3382,"nodeType":"StructuredDocumentation","src":"2557:91:31","text":" @dev Indicates that the contract is in the process of being initialized."},"id":3384,"mutability":"mutable","name":"_initializing","nameLocation":"2666:13:31","nodeType":"VariableDeclaration","scope":3543,"src":"2653:26:31","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3383,"name":"bool","nodeType":"ElementaryTypeName","src":"2653:4:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"private"},{"anonymous":false,"documentation":{"id":3385,"nodeType":"StructuredDocumentation","src":"2686:90:31","text":" @dev Triggered when the contract has been initialized or reinitialized."},"eventSelector":"7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498","id":3389,"name":"Initialized","nameLocation":"2787:11:31","nodeType":"EventDefinition","parameters":{"id":3388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3387,"indexed":false,"mutability":"mutable","name":"version","nameLocation":"2805:7:31","nodeType":"VariableDeclaration","scope":3389,"src":"2799:13:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3386,"name":"uint8","nodeType":"ElementaryTypeName","src":"2799:5:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2798:15:31"},"src":"2781:33:31"},{"body":{"id":3444,"nodeType":"Block","src":"3247:472:31","statements":[{"assignments":[3393],"declarations":[{"constant":false,"id":3393,"mutability":"mutable","name":"isTopLevelCall","nameLocation":"3262:14:31","nodeType":"VariableDeclaration","scope":3444,"src":"3257:19:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3392,"name":"bool","nodeType":"ElementaryTypeName","src":"3257:4:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":3396,"initialValue":{"id":3395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3279:14:31","subExpression":{"id":3394,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"3280:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"3257:36:31"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3398,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3393,"src":"3325:14:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":3401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3399,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"3343:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"31","id":3400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3358:1:31","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3343:16:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3325:34:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":3403,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3324:36:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3365:34:31","subExpression":{"arguments":[{"arguments":[{"id":3408,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3393:4:31","typeDescriptions":{"typeIdentifier":"t_contract$_Initializable_$3543","typeString":"contract Initializable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Initializable_$3543","typeString":"contract Initializable"}],"id":3407,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3385:7:31","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3406,"name":"address","nodeType":"ElementaryTypeName","src":"3385:7:31","typeDescriptions":{}}},"id":3409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3385:13:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":3404,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5129,"src":"3366:7:31","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Address_$5129_$","typeString":"type(library Address)"}},"id":3405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isContract","nodeType":"MemberAccess","referencedDeclaration":4817,"src":"3366:18:31","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":3410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3366:33:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":3414,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3412,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"3403:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":3413,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3419:1:31","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3403:17:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3365:55:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":3416,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3364:57:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3324:97:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564","id":3418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3435:48:31","typeDescriptions":{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""},"value":"Initializable: contract is already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""}],"id":3397,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3303:7:31","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3303:190:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3420,"nodeType":"ExpressionStatement","src":"3303:190:31"},{"expression":{"id":3423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3421,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"3503:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":3422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3518:1:31","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3503:16:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":3424,"nodeType":"ExpressionStatement","src":"3503:16:31"},{"condition":{"id":3425,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3393,"src":"3533:14:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3431,"nodeType":"IfStatement","src":"3529:65:31","trueBody":{"id":3430,"nodeType":"Block","src":"3549:45:31","statements":[{"expression":{"id":3428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3426,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"3563:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":3427,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3579:4:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"3563:20:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3429,"nodeType":"ExpressionStatement","src":"3563:20:31"}]}},{"id":3432,"nodeType":"PlaceholderStatement","src":"3603:1:31"},{"condition":{"id":3433,"name":"isTopLevelCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3393,"src":"3618:14:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3443,"nodeType":"IfStatement","src":"3614:99:31","trueBody":{"id":3442,"nodeType":"Block","src":"3634:79:31","statements":[{"expression":{"id":3436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3434,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"3648:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":3435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3664:5:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3648:21:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3437,"nodeType":"ExpressionStatement","src":"3648:21:31"},{"eventCall":{"arguments":[{"hexValue":"31","id":3439,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3700:1:31","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":3438,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3389,"src":"3688:11:31","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":3440,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3688:14:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3441,"nodeType":"EmitStatement","src":"3683:19:31"}]}}]},"documentation":{"id":3390,"nodeType":"StructuredDocumentation","src":"2820:399:31","text":" @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n `onlyInitializing` functions can be used to initialize parent contracts.\n Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n constructor.\n Emits an {Initialized} event."},"id":3445,"name":"initializer","nameLocation":"3233:11:31","nodeType":"ModifierDefinition","parameters":{"id":3391,"nodeType":"ParameterList","parameters":[],"src":"3244:2:31"},"src":"3224:495:31","virtual":false,"visibility":"internal"},{"body":{"id":3477,"nodeType":"Block","src":"4830:255:31","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":3456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3452,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4848:14:31","subExpression":{"id":3451,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"4849:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":3455,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3453,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"4866:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3454,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"4881:7:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4866:22:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4848:40:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564","id":3457,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4890:48:31","typeDescriptions":{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""},"value":"Initializable: contract is already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759","typeString":"literal_string \"Initializable: contract is already initialized\""}],"id":3450,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4840:7:31","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3458,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4840:99:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3459,"nodeType":"ExpressionStatement","src":"4840:99:31"},{"expression":{"id":3462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3460,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"4949:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3461,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"4964:7:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4949:22:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":3463,"nodeType":"ExpressionStatement","src":"4949:22:31"},{"expression":{"id":3466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3464,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"4981:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":3465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4997:4:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"4981:20:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3467,"nodeType":"ExpressionStatement","src":"4981:20:31"},{"id":3468,"nodeType":"PlaceholderStatement","src":"5011:1:31"},{"expression":{"id":3471,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3469,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"5022:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":3470,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5038:5:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"5022:21:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3472,"nodeType":"ExpressionStatement","src":"5022:21:31"},{"eventCall":{"arguments":[{"id":3474,"name":"version","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"5070:7:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":3473,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3389,"src":"5058:11:31","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":3475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5058:20:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3476,"nodeType":"EmitStatement","src":"5053:25:31"}]},"documentation":{"id":3446,"nodeType":"StructuredDocumentation","src":"3725:1062:31","text":" @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n used to initialize parent contracts.\n A reinitializer may be used after the original initialization step. This is essential to configure modules that\n are added through upgrades and that require initialization.\n When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n cannot be nested. If one is invoked in the context of another, execution will revert.\n Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n a contract, executing them in the right order is up to the developer or operator.\n WARNING: setting the version to 255 will prevent any future reinitialization.\n Emits an {Initialized} event."},"id":3478,"name":"reinitializer","nameLocation":"4801:13:31","nodeType":"ModifierDefinition","parameters":{"id":3449,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3448,"mutability":"mutable","name":"version","nameLocation":"4821:7:31","nodeType":"VariableDeclaration","scope":3478,"src":"4815:13:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3447,"name":"uint8","nodeType":"ElementaryTypeName","src":"4815:5:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"4814:15:31"},"src":"4792:293:31","virtual":false,"visibility":"internal"},{"body":{"id":3487,"nodeType":"Block","src":"5323:97:31","statements":[{"expression":{"arguments":[{"id":3482,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"5341:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420696e697469616c697a696e67","id":3483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5356:45:31","typeDescriptions":{"typeIdentifier":"t_stringliteral_d688db918bb9dd50354922faa108595679886fe9ff08046ad1ffe30aaea55f8b","typeString":"literal_string \"Initializable: contract is not initializing\""},"value":"Initializable: contract is not initializing"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d688db918bb9dd50354922faa108595679886fe9ff08046ad1ffe30aaea55f8b","typeString":"literal_string \"Initializable: contract is not initializing\""}],"id":3481,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5333:7:31","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5333:69:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3485,"nodeType":"ExpressionStatement","src":"5333:69:31"},{"id":3486,"nodeType":"PlaceholderStatement","src":"5412:1:31"}]},"documentation":{"id":3479,"nodeType":"StructuredDocumentation","src":"5091:199:31","text":" @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n {initializer} and {reinitializer} modifiers, directly or indirectly."},"id":3488,"name":"onlyInitializing","nameLocation":"5304:16:31","nodeType":"ModifierDefinition","parameters":{"id":3480,"nodeType":"ParameterList","parameters":[],"src":"5320:2:31"},"src":"5295:125:31","virtual":false,"visibility":"internal"},{"body":{"id":3523,"nodeType":"Block","src":"5955:230:31","statements":[{"expression":{"arguments":[{"id":3494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5973:14:31","subExpression":{"id":3493,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"5974:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469616c697a696e67","id":3495,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5989:41:31","typeDescriptions":{"typeIdentifier":"t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a","typeString":"literal_string \"Initializable: contract is initializing\""},"value":"Initializable: contract is initializing"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a","typeString":"literal_string \"Initializable: contract is initializing\""}],"id":3492,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5965:7:31","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3496,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5965:66:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3497,"nodeType":"ExpressionStatement","src":"5965:66:31"},{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":3504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3498,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"6045:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"arguments":[{"id":3501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6065:5:31","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":3500,"name":"uint8","nodeType":"ElementaryTypeName","src":"6065:5:31","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":3499,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6060:4:31","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6060:11:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":3503,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"6060:15:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6045:30:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3522,"nodeType":"IfStatement","src":"6041:138:31","trueBody":{"id":3521,"nodeType":"Block","src":"6077:102:31","statements":[{"expression":{"id":3511,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3505,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"6091:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":3508,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6111:5:31","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":3507,"name":"uint8","nodeType":"ElementaryTypeName","src":"6111:5:31","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":3506,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6106:4:31","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3509,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6106:11:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":3510,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"6106:15:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6091:30:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":3512,"nodeType":"ExpressionStatement","src":"6091:30:31"},{"eventCall":{"arguments":[{"expression":{"arguments":[{"id":3516,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6157:5:31","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":3515,"name":"uint8","nodeType":"ElementaryTypeName","src":"6157:5:31","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":3514,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6152:4:31","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":3517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6152:11:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":3518,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"6152:15:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":3513,"name":"Initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3389,"src":"6140:11:31","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint8_$returns$__$","typeString":"function (uint8)"}},"id":3519,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6140:28:31","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3520,"nodeType":"EmitStatement","src":"6135:33:31"}]}}]},"documentation":{"id":3489,"nodeType":"StructuredDocumentation","src":"5426:475:31","text":" @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n through proxies.\n Emits an {Initialized} event the first time it is successfully executed."},"id":3524,"implemented":true,"kind":"function","modifiers":[],"name":"_disableInitializers","nameLocation":"5915:20:31","nodeType":"FunctionDefinition","parameters":{"id":3490,"nodeType":"ParameterList","parameters":[],"src":"5935:2:31"},"returnParameters":{"id":3491,"nodeType":"ParameterList","parameters":[],"src":"5955:0:31"},"scope":3543,"src":"5906:279:31","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":3532,"nodeType":"Block","src":"6362:36:31","statements":[{"expression":{"id":3530,"name":"_initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"6379:12:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":3529,"id":3531,"nodeType":"Return","src":"6372:19:31"}]},"documentation":{"id":3525,"nodeType":"StructuredDocumentation","src":"6191:102:31","text":" @dev Internal function that returns the initialized version. Returns `_initialized`"},"id":3533,"implemented":true,"kind":"function","modifiers":[],"name":"_getInitializedVersion","nameLocation":"6307:22:31","nodeType":"FunctionDefinition","parameters":{"id":3526,"nodeType":"ParameterList","parameters":[],"src":"6329:2:31"},"returnParameters":{"id":3529,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3528,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3533,"src":"6355:5:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3527,"name":"uint8","nodeType":"ElementaryTypeName","src":"6355:5:31","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"6354:7:31"},"scope":3543,"src":"6298:100:31","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3541,"nodeType":"Block","src":"6568:37:31","statements":[{"expression":{"id":3539,"name":"_initializing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3384,"src":"6585:13:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3538,"id":3540,"nodeType":"Return","src":"6578:20:31"}]},"documentation":{"id":3534,"nodeType":"StructuredDocumentation","src":"6404:103:31","text":" @dev Internal function that returns the initialized version. Returns `_initializing`"},"id":3542,"implemented":true,"kind":"function","modifiers":[],"name":"_isInitializing","nameLocation":"6521:15:31","nodeType":"FunctionDefinition","parameters":{"id":3535,"nodeType":"ParameterList","parameters":[],"src":"6536:2:31"},"returnParameters":{"id":3538,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3537,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3542,"src":"6562:4:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3536,"name":"bool","nodeType":"ElementaryTypeName","src":"6562:4:31","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6561:6:31"},"scope":3543,"src":"6512:93:31","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":3544,"src":"2372:4235:31","usedErrors":[]}],"src":"113:6495:31"},"id":31},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","exportedSymbols":{"Address":[5129],"ERC1967Upgrade":[3312],"IBeacon":[3374],"IERC1822Proxiable":[2957],"StorageSlot":[5292],"UUPSUpgradeable":[3659]},"id":3660,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3545,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"115:23:32"},{"absolutePath":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","file":"../../interfaces/draft-IERC1822.sol","id":3546,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3660,"sourceUnit":2958,"src":"140:45:32","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol","file":"../ERC1967/ERC1967Upgrade.sol","id":3547,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3660,"sourceUnit":3313,"src":"186:39:32","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":3549,"name":"IERC1822Proxiable","nodeType":"IdentifierPath","referencedDeclaration":2957,"src":"913:17:32"},"id":3550,"nodeType":"InheritanceSpecifier","src":"913:17:32"},{"baseName":{"id":3551,"name":"ERC1967Upgrade","nodeType":"IdentifierPath","referencedDeclaration":3312,"src":"932:14:32"},"id":3552,"nodeType":"InheritanceSpecifier","src":"932:14:32"}],"canonicalName":"UUPSUpgradeable","contractDependencies":[],"contractKind":"contract","documentation":{"id":3548,"nodeType":"StructuredDocumentation","src":"227:648:32","text":" @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n `UUPSUpgradeable` with a custom implementation of upgrades.\n The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n _Available since v4.1._"},"fullyImplemented":false,"id":3659,"linearizedBaseContracts":[3659,3312,2957],"name":"UUPSUpgradeable","nameLocation":"894:15:32","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":3553,"nodeType":"StructuredDocumentation","src":"953:87:32","text":"@custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment"},"id":3559,"mutability":"immutable","name":"__self","nameLocation":"1071:6:32","nodeType":"VariableDeclaration","scope":3659,"src":"1045:48:32","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3554,"name":"address","nodeType":"ElementaryTypeName","src":"1045:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"id":3557,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1088:4:32","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}],"id":3556,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1080:7:32","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3555,"name":"address","nodeType":"ElementaryTypeName","src":"1080:7:32","typeDescriptions":{}}},"id":3558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1080:13:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"body":{"id":3581,"nodeType":"Block","src":"1619:205:32","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3565,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1645:4:32","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}],"id":3564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1637:7:32","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3563,"name":"address","nodeType":"ElementaryTypeName","src":"1637:7:32","typeDescriptions":{}}},"id":3566,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1637:13:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":3567,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3559,"src":"1654:6:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1637:23:32","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682064656c656761746563616c6c","id":3569,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1662:46:32","typeDescriptions":{"typeIdentifier":"t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb","typeString":"literal_string \"Function must be called through delegatecall\""},"value":"Function must be called through delegatecall"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb","typeString":"literal_string \"Function must be called through delegatecall\""}],"id":3562,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1629:7:32","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1629:80:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3571,"nodeType":"ExpressionStatement","src":"1629:80:32"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":3573,"name":"_getImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3026,"src":"1727:18:32","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3574,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1727:20:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3575,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3559,"src":"1751:6:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1727:30:32","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f756768206163746976652070726f7879","id":3577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1759:46:32","typeDescriptions":{"typeIdentifier":"t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434","typeString":"literal_string \"Function must be called through active proxy\""},"value":"Function must be called through active proxy"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434","typeString":"literal_string \"Function must be called through active proxy\""}],"id":3572,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1719:7:32","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1719:87:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3579,"nodeType":"ExpressionStatement","src":"1719:87:32"},{"id":3580,"nodeType":"PlaceholderStatement","src":"1816:1:32"}]},"documentation":{"id":3560,"nodeType":"StructuredDocumentation","src":"1100:493:32","text":" @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n fail."},"id":3582,"name":"onlyProxy","nameLocation":"1607:9:32","nodeType":"ModifierDefinition","parameters":{"id":3561,"nodeType":"ParameterList","parameters":[],"src":"1616:2:32"},"src":"1598:226:32","virtual":false,"visibility":"internal"},{"body":{"id":3596,"nodeType":"Block","src":"2054:120:32","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3588,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2080:4:32","typeDescriptions":{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_UUPSUpgradeable_$3659","typeString":"contract UUPSUpgradeable"}],"id":3587,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2072:7:32","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3586,"name":"address","nodeType":"ElementaryTypeName","src":"2072:7:32","typeDescriptions":{}}},"id":3589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2072:13:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3590,"name":"__self","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3559,"src":"2089:6:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2072:23:32","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c6c6564207468726f7567682064656c656761746563616c6c","id":3592,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2097:58:32","typeDescriptions":{"typeIdentifier":"t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4","typeString":"literal_string \"UUPSUpgradeable: must not be called through delegatecall\""},"value":"UUPSUpgradeable: must not be called through delegatecall"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4","typeString":"literal_string \"UUPSUpgradeable: must not be called through delegatecall\""}],"id":3585,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2064:7:32","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3593,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2064:92:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3594,"nodeType":"ExpressionStatement","src":"2064:92:32"},{"id":3595,"nodeType":"PlaceholderStatement","src":"2166:1:32"}]},"documentation":{"id":3583,"nodeType":"StructuredDocumentation","src":"1830:195:32","text":" @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n callable on the implementing contract but not through proxies."},"id":3597,"name":"notDelegated","nameLocation":"2039:12:32","nodeType":"ModifierDefinition","parameters":{"id":3584,"nodeType":"ParameterList","parameters":[],"src":"2051:2:32"},"src":"2030:144:32","virtual":false,"visibility":"internal"},{"baseFunctions":[2956],"body":{"id":3608,"nodeType":"Block","src":"2849:44:32","statements":[{"expression":{"id":3606,"name":"_IMPLEMENTATION_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3008,"src":"2866:20:32","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3605,"id":3607,"nodeType":"Return","src":"2859:27:32"}]},"documentation":{"id":3598,"nodeType":"StructuredDocumentation","src":"2180:577:32","text":" @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"functionSelector":"52d1902d","id":3609,"implemented":true,"kind":"function","modifiers":[{"id":3602,"kind":"modifierInvocation","modifierName":{"id":3601,"name":"notDelegated","nodeType":"IdentifierPath","referencedDeclaration":3597,"src":"2818:12:32"},"nodeType":"ModifierInvocation","src":"2818:12:32"}],"name":"proxiableUUID","nameLocation":"2771:13:32","nodeType":"FunctionDefinition","overrides":{"id":3600,"nodeType":"OverrideSpecifier","overrides":[],"src":"2809:8:32"},"parameters":{"id":3599,"nodeType":"ParameterList","parameters":[],"src":"2784:2:32"},"returnParameters":{"id":3605,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3604,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3609,"src":"2840:7:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3603,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2840:7:32","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2839:9:32"},"scope":3659,"src":"2762:131:32","stateMutability":"view","virtual":true,"visibility":"external"},{"body":{"id":3630,"nodeType":"Block","src":"3146:124:32","statements":[{"expression":{"arguments":[{"id":3618,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3612,"src":"3174:17:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3617,"name":"_authorizeUpgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3658,"src":"3156:17:32","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3156:36:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3620,"nodeType":"ExpressionStatement","src":"3156:36:32"},{"expression":{"arguments":[{"id":3622,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3612,"src":"3224:17:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":3625,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3253:1:32","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3624,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3243:9:32","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":3623,"name":"bytes","nodeType":"ElementaryTypeName","src":"3247:5:32","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":3626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3243:12:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"66616c7365","id":3627,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3257:5:32","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":3621,"name":"_upgradeToAndCallUUPS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3148,"src":"3202:21:32","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":3628,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3202:61:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3629,"nodeType":"ExpressionStatement","src":"3202:61:32"}]},"documentation":{"id":3610,"nodeType":"StructuredDocumentation","src":"2899:169:32","text":" @dev Upgrade the implementation of the proxy to `newImplementation`.\n Calls {_authorizeUpgrade}.\n Emits an {Upgraded} event."},"functionSelector":"3659cfe6","id":3631,"implemented":true,"kind":"function","modifiers":[{"id":3615,"kind":"modifierInvocation","modifierName":{"id":3614,"name":"onlyProxy","nodeType":"IdentifierPath","referencedDeclaration":3582,"src":"3136:9:32"},"nodeType":"ModifierInvocation","src":"3136:9:32"}],"name":"upgradeTo","nameLocation":"3082:9:32","nodeType":"FunctionDefinition","parameters":{"id":3613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3612,"mutability":"mutable","name":"newImplementation","nameLocation":"3100:17:32","nodeType":"VariableDeclaration","scope":3631,"src":"3092:25:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3611,"name":"address","nodeType":"ElementaryTypeName","src":"3092:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3091:27:32"},"returnParameters":{"id":3616,"nodeType":"ParameterList","parameters":[],"src":"3146:0:32"},"scope":3659,"src":"3073:197:32","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":3651,"nodeType":"Block","src":"3626:115:32","statements":[{"expression":{"arguments":[{"id":3642,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3634,"src":"3654:17:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":3641,"name":"_authorizeUpgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3658,"src":"3636:17:32","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":3643,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3636:36:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3644,"nodeType":"ExpressionStatement","src":"3636:36:32"},{"expression":{"arguments":[{"id":3646,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3634,"src":"3704:17:32","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3647,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3636,"src":"3723:4:32","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"74727565","id":3648,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3729:4:32","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":3645,"name":"_upgradeToAndCallUUPS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3148,"src":"3682:21:32","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$","typeString":"function (address,bytes memory,bool)"}},"id":3649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3682:52:32","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3650,"nodeType":"ExpressionStatement","src":"3682:52:32"}]},"documentation":{"id":3632,"nodeType":"StructuredDocumentation","src":"3276:238:32","text":" @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n encoded in `data`.\n Calls {_authorizeUpgrade}.\n Emits an {Upgraded} event."},"functionSelector":"4f1ef286","id":3652,"implemented":true,"kind":"function","modifiers":[{"id":3639,"kind":"modifierInvocation","modifierName":{"id":3638,"name":"onlyProxy","nodeType":"IdentifierPath","referencedDeclaration":3582,"src":"3616:9:32"},"nodeType":"ModifierInvocation","src":"3616:9:32"}],"name":"upgradeToAndCall","nameLocation":"3528:16:32","nodeType":"FunctionDefinition","parameters":{"id":3637,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3634,"mutability":"mutable","name":"newImplementation","nameLocation":"3553:17:32","nodeType":"VariableDeclaration","scope":3652,"src":"3545:25:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3633,"name":"address","nodeType":"ElementaryTypeName","src":"3545:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3636,"mutability":"mutable","name":"data","nameLocation":"3585:4:32","nodeType":"VariableDeclaration","scope":3652,"src":"3572:17:32","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":3635,"name":"bytes","nodeType":"ElementaryTypeName","src":"3572:5:32","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3544:46:32"},"returnParameters":{"id":3640,"nodeType":"ParameterList","parameters":[],"src":"3626:0:32"},"scope":3659,"src":"3519:222:32","stateMutability":"payable","virtual":true,"visibility":"external"},{"documentation":{"id":3653,"nodeType":"StructuredDocumentation","src":"3747:397:32","text":" @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n {upgradeTo} and {upgradeToAndCall}.\n Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n ```solidity\n function _authorizeUpgrade(address) internal override onlyOwner {}\n ```"},"id":3658,"implemented":false,"kind":"function","modifiers":[],"name":"_authorizeUpgrade","nameLocation":"4158:17:32","nodeType":"FunctionDefinition","parameters":{"id":3656,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3655,"mutability":"mutable","name":"newImplementation","nameLocation":"4184:17:32","nodeType":"VariableDeclaration","scope":3658,"src":"4176:25:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3654,"name":"address","nodeType":"ElementaryTypeName","src":"4176:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4175:27:32"},"returnParameters":{"id":3657,"nodeType":"ParameterList","parameters":[],"src":"4219:0:32"},"scope":3659,"src":"4149:71:32","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":3660,"src":"876:3346:32","usedErrors":[]}],"src":"115:4108:32"},"id":32},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/security/ReentrancyGuard.sol","exportedSymbols":{"ReentrancyGuard":[3713]},"id":3714,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3661,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"112:23:33"},{"abstract":true,"baseContracts":[],"canonicalName":"ReentrancyGuard","contractDependencies":[],"contractKind":"contract","documentation":{"id":3662,"nodeType":"StructuredDocumentation","src":"137:750:33","text":" @dev Contract module that helps prevent reentrant calls to a function.\n Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n available, which can be applied to functions to make sure there are no nested\n (reentrant) calls to them.\n Note that because there is a single `nonReentrant` guard, functions marked as\n `nonReentrant` may not call one another. This can be worked around by making\n those functions `private`, and then adding `external` `nonReentrant` entry\n points to them.\n TIP: If you would like to learn more about reentrancy and alternative ways\n to protect against it, check out our blog post\n https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]."},"fullyImplemented":true,"id":3713,"linearizedBaseContracts":[3713],"name":"ReentrancyGuard","nameLocation":"906:15:33","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":3665,"mutability":"constant","name":"_NOT_ENTERED","nameLocation":"1701:12:33","nodeType":"VariableDeclaration","scope":3713,"src":"1676:41:33","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3663,"name":"uint256","nodeType":"ElementaryTypeName","src":"1676:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":3664,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1716:1:33","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"private"},{"constant":true,"id":3668,"mutability":"constant","name":"_ENTERED","nameLocation":"1748:8:33","nodeType":"VariableDeclaration","scope":3713,"src":"1723:37:33","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3666,"name":"uint256","nodeType":"ElementaryTypeName","src":"1723:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32","id":3667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1759:1:33","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"visibility":"private"},{"constant":false,"id":3670,"mutability":"mutable","name":"_status","nameLocation":"1783:7:33","nodeType":"VariableDeclaration","scope":3713,"src":"1767:23:33","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3669,"name":"uint256","nodeType":"ElementaryTypeName","src":"1767:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"body":{"id":3677,"nodeType":"Block","src":"1811:39:33","statements":[{"expression":{"id":3675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3673,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3670,"src":"1821:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3674,"name":"_NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3665,"src":"1831:12:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1821:22:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3676,"nodeType":"ExpressionStatement","src":"1821:22:33"}]},"id":3678,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3671,"nodeType":"ParameterList","parameters":[],"src":"1808:2:33"},"returnParameters":{"id":3672,"nodeType":"ParameterList","parameters":[],"src":"1811:0:33"},"scope":3713,"src":"1797:53:33","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":3688,"nodeType":"Block","src":"2251:79:33","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3681,"name":"_nonReentrantBefore","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3704,"src":"2261:19:33","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2261:21:33","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3683,"nodeType":"ExpressionStatement","src":"2261:21:33"},{"id":3684,"nodeType":"PlaceholderStatement","src":"2292:1:33"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":3685,"name":"_nonReentrantAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3712,"src":"2303:18:33","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":3686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2303:20:33","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3687,"nodeType":"ExpressionStatement","src":"2303:20:33"}]},"documentation":{"id":3679,"nodeType":"StructuredDocumentation","src":"1856:366:33","text":" @dev Prevents a contract from calling itself, directly or indirectly.\n Calling a `nonReentrant` function from another `nonReentrant`\n function is not supported. It is possible to prevent this from happening\n by making the `nonReentrant` function external, and making it call a\n `private` function that does the actual work."},"id":3689,"name":"nonReentrant","nameLocation":"2236:12:33","nodeType":"ModifierDefinition","parameters":{"id":3680,"nodeType":"ParameterList","parameters":[],"src":"2248:2:33"},"src":"2227:103:33","virtual":false,"visibility":"internal"},{"body":{"id":3703,"nodeType":"Block","src":"2375:248:33","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3693,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3670,"src":"2468:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":3694,"name":"_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3668,"src":"2479:8:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2468:19:33","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5265656e7472616e637947756172643a207265656e7472616e742063616c6c","id":3696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2489:33:33","typeDescriptions":{"typeIdentifier":"t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619","typeString":"literal_string \"ReentrancyGuard: reentrant call\""},"value":"ReentrancyGuard: reentrant call"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619","typeString":"literal_string \"ReentrancyGuard: reentrant call\""}],"id":3692,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2460:7:33","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":3697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2460:63:33","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3698,"nodeType":"ExpressionStatement","src":"2460:63:33"},{"expression":{"id":3701,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3699,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3670,"src":"2598:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3700,"name":"_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3668,"src":"2608:8:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2598:18:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3702,"nodeType":"ExpressionStatement","src":"2598:18:33"}]},"id":3704,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantBefore","nameLocation":"2345:19:33","nodeType":"FunctionDefinition","parameters":{"id":3690,"nodeType":"ParameterList","parameters":[],"src":"2364:2:33"},"returnParameters":{"id":3691,"nodeType":"ParameterList","parameters":[],"src":"2375:0:33"},"scope":3713,"src":"2336:287:33","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":3711,"nodeType":"Block","src":"2667:171:33","statements":[{"expression":{"id":3709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3707,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3670,"src":"2809:7:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3708,"name":"_NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3665,"src":"2819:12:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2809:22:33","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3710,"nodeType":"ExpressionStatement","src":"2809:22:33"}]},"id":3712,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantAfter","nameLocation":"2638:18:33","nodeType":"FunctionDefinition","parameters":{"id":3705,"nodeType":"ParameterList","parameters":[],"src":"2656:2:33"},"returnParameters":{"id":3706,"nodeType":"ParameterList","parameters":[],"src":"2667:0:33"},"scope":3713,"src":"2629:209:33","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":3714,"src":"888:1952:33","usedErrors":[]}],"src":"112:2729:33"},"id":33},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","exportedSymbols":{"IERC1155Receiver":[3754],"IERC165":[5840]},"id":3755,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3715,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"118:23:34"},{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","file":"../../utils/introspection/IERC165.sol","id":3716,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":3755,"sourceUnit":5841,"src":"143:47:34","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":3718,"name":"IERC165","nodeType":"IdentifierPath","referencedDeclaration":5840,"src":"262:7:34"},"id":3719,"nodeType":"InheritanceSpecifier","src":"262:7:34"}],"canonicalName":"IERC1155Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":3717,"nodeType":"StructuredDocumentation","src":"192:39:34","text":" @dev _Available since v3.1._"},"fullyImplemented":false,"id":3754,"linearizedBaseContracts":[3754,5840],"name":"IERC1155Receiver","nameLocation":"242:16:34","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3720,"nodeType":"StructuredDocumentation","src":"276:826:34","text":" @dev Handles the receipt of a single ERC1155 token type. This function is\n called at the end of a `safeTransferFrom` after the balance has been updated.\n NOTE: To accept the transfer, this must return\n `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n (i.e. 0xf23a6e61, or its own function selector).\n @param operator The address which initiated the transfer (i.e. msg.sender)\n @param from The address which previously owned the token\n @param id The ID of the token being transferred\n @param value The amount of tokens being transferred\n @param data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed"},"functionSelector":"f23a6e61","id":3735,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1116:17:34","nodeType":"FunctionDefinition","parameters":{"id":3731,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3722,"mutability":"mutable","name":"operator","nameLocation":"1151:8:34","nodeType":"VariableDeclaration","scope":3735,"src":"1143:16:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3721,"name":"address","nodeType":"ElementaryTypeName","src":"1143:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3724,"mutability":"mutable","name":"from","nameLocation":"1177:4:34","nodeType":"VariableDeclaration","scope":3735,"src":"1169:12:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3723,"name":"address","nodeType":"ElementaryTypeName","src":"1169:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3726,"mutability":"mutable","name":"id","nameLocation":"1199:2:34","nodeType":"VariableDeclaration","scope":3735,"src":"1191:10:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3725,"name":"uint256","nodeType":"ElementaryTypeName","src":"1191:7:34","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3728,"mutability":"mutable","name":"value","nameLocation":"1219:5:34","nodeType":"VariableDeclaration","scope":3735,"src":"1211:13:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3727,"name":"uint256","nodeType":"ElementaryTypeName","src":"1211:7:34","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":3730,"mutability":"mutable","name":"data","nameLocation":"1249:4:34","nodeType":"VariableDeclaration","scope":3735,"src":"1234:19:34","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3729,"name":"bytes","nodeType":"ElementaryTypeName","src":"1234:5:34","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1133:126:34"},"returnParameters":{"id":3734,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3733,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3735,"src":"1278:6:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3732,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1278:6:34","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1277:8:34"},"scope":3754,"src":"1107:179:34","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":3736,"nodeType":"StructuredDocumentation","src":"1292:994:34","text":" @dev Handles the receipt of a multiple ERC1155 token types. This function\n is called at the end of a `safeBatchTransferFrom` after the balances have\n been updated.\n NOTE: To accept the transfer(s), this must return\n `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n (i.e. 0xbc197c81, or its own function selector).\n @param operator The address which initiated the batch transfer (i.e. msg.sender)\n @param from The address which previously owned the token\n @param ids An array containing ids of each token being transferred (order and length must match values array)\n @param values An array containing amounts of each token being transferred (order and length must match ids array)\n @param data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed"},"functionSelector":"bc197c81","id":3753,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"2300:22:34","nodeType":"FunctionDefinition","parameters":{"id":3749,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3738,"mutability":"mutable","name":"operator","nameLocation":"2340:8:34","nodeType":"VariableDeclaration","scope":3753,"src":"2332:16:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3737,"name":"address","nodeType":"ElementaryTypeName","src":"2332:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3740,"mutability":"mutable","name":"from","nameLocation":"2366:4:34","nodeType":"VariableDeclaration","scope":3753,"src":"2358:12:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3739,"name":"address","nodeType":"ElementaryTypeName","src":"2358:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3743,"mutability":"mutable","name":"ids","nameLocation":"2399:3:34","nodeType":"VariableDeclaration","scope":3753,"src":"2380:22:34","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":3741,"name":"uint256","nodeType":"ElementaryTypeName","src":"2380:7:34","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3742,"nodeType":"ArrayTypeName","src":"2380:9:34","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":3746,"mutability":"mutable","name":"values","nameLocation":"2431:6:34","nodeType":"VariableDeclaration","scope":3753,"src":"2412:25:34","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":3744,"name":"uint256","nodeType":"ElementaryTypeName","src":"2412:7:34","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3745,"nodeType":"ArrayTypeName","src":"2412:9:34","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":3748,"mutability":"mutable","name":"data","nameLocation":"2462:4:34","nodeType":"VariableDeclaration","scope":3753,"src":"2447:19:34","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":3747,"name":"bytes","nodeType":"ElementaryTypeName","src":"2447:5:34","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2322:150:34"},"returnParameters":{"id":3752,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3751,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3753,"src":"2491:6:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":3750,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2491:6:34","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2490:8:34"},"scope":3754,"src":"2291:208:34","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":3755,"src":"232:2269:34","usedErrors":[]}],"src":"118:2384:34"},"id":34},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/ERC20.sol","exportedSymbols":{"Context":[5151],"ERC20":[4341],"IERC20":[4419],"IERC20Metadata":[4444]},"id":4342,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3756,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"105:23:35"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"./IERC20.sol","id":3757,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4342,"sourceUnit":4420,"src":"130:22:35","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","file":"./extensions/IERC20Metadata.sol","id":3758,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4342,"sourceUnit":4445,"src":"153:41:35","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"../../utils/Context.sol","id":3759,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4342,"sourceUnit":5152,"src":"195:33:35","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":3761,"name":"Context","nodeType":"IdentifierPath","referencedDeclaration":5151,"src":"1419:7:35"},"id":3762,"nodeType":"InheritanceSpecifier","src":"1419:7:35"},{"baseName":{"id":3763,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1428:6:35"},"id":3764,"nodeType":"InheritanceSpecifier","src":"1428:6:35"},{"baseName":{"id":3765,"name":"IERC20Metadata","nodeType":"IdentifierPath","referencedDeclaration":4444,"src":"1436:14:35"},"id":3766,"nodeType":"InheritanceSpecifier","src":"1436:14:35"}],"canonicalName":"ERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":3760,"nodeType":"StructuredDocumentation","src":"230:1170:35","text":" @dev Implementation of the {IERC20} interface.\n This implementation is agnostic to the way tokens are created. This means\n that a supply mechanism has to be added in a derived contract using {_mint}.\n For a generic mechanism see {ERC20PresetMinterPauser}.\n TIP: For a detailed writeup see our guide\n https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n to implement supply mechanisms].\n We have followed general OpenZeppelin Contracts guidelines: functions revert\n instead returning `false` on failure. This behavior is nonetheless\n conventional and does not conflict with the expectations of ERC20\n applications.\n Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n This allows applications to reconstruct the allowance for all accounts just\n by listening to said events. Other implementations of the EIP may not emit\n these events, as it isn't required by the specification.\n Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n functions have been added to mitigate the well-known issues around setting\n allowances. See {IERC20-approve}."},"fullyImplemented":true,"id":4341,"linearizedBaseContracts":[4341,4444,4419,5151],"name":"ERC20","nameLocation":"1410:5:35","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":3770,"mutability":"mutable","name":"_balances","nameLocation":"1493:9:35","nodeType":"VariableDeclaration","scope":4341,"src":"1457:45:35","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":3769,"keyType":{"id":3767,"name":"address","nodeType":"ElementaryTypeName","src":"1465:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1457:27:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":3768,"name":"uint256","nodeType":"ElementaryTypeName","src":"1476:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"private"},{"constant":false,"id":3776,"mutability":"mutable","name":"_allowances","nameLocation":"1565:11:35","nodeType":"VariableDeclaration","scope":4341,"src":"1509:67:35","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":3775,"keyType":{"id":3771,"name":"address","nodeType":"ElementaryTypeName","src":"1517:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1509:47:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueType":{"id":3774,"keyType":{"id":3772,"name":"address","nodeType":"ElementaryTypeName","src":"1536:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1528:27:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":3773,"name":"uint256","nodeType":"ElementaryTypeName","src":"1547:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"private"},{"constant":false,"id":3778,"mutability":"mutable","name":"_totalSupply","nameLocation":"1599:12:35","nodeType":"VariableDeclaration","scope":4341,"src":"1583:28:35","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3777,"name":"uint256","nodeType":"ElementaryTypeName","src":"1583:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"constant":false,"id":3780,"mutability":"mutable","name":"_name","nameLocation":"1633:5:35","nodeType":"VariableDeclaration","scope":4341,"src":"1618:20:35","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":3779,"name":"string","nodeType":"ElementaryTypeName","src":"1618:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"private"},{"constant":false,"id":3782,"mutability":"mutable","name":"_symbol","nameLocation":"1659:7:35","nodeType":"VariableDeclaration","scope":4341,"src":"1644:22:35","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":3781,"name":"string","nodeType":"ElementaryTypeName","src":"1644:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"private"},{"body":{"id":3798,"nodeType":"Block","src":"2032:57:35","statements":[{"expression":{"id":3792,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3790,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3780,"src":"2042:5:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3791,"name":"name_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3785,"src":"2050:5:35","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2042:13:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":3793,"nodeType":"ExpressionStatement","src":"2042:13:35"},{"expression":{"id":3796,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3794,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3782,"src":"2065:7:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":3795,"name":"symbol_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3787,"src":"2075:7:35","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2065:17:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":3797,"nodeType":"ExpressionStatement","src":"2065:17:35"}]},"documentation":{"id":3783,"nodeType":"StructuredDocumentation","src":"1673:298:35","text":" @dev Sets the values for {name} and {symbol}.\n The default value of {decimals} is 18. To select a different value for\n {decimals} you should overload it.\n All two of these values are immutable: they can only be set once during\n construction."},"id":3799,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":3788,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3785,"mutability":"mutable","name":"name_","nameLocation":"2002:5:35","nodeType":"VariableDeclaration","scope":3799,"src":"1988:19:35","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":3784,"name":"string","nodeType":"ElementaryTypeName","src":"1988:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":3787,"mutability":"mutable","name":"symbol_","nameLocation":"2023:7:35","nodeType":"VariableDeclaration","scope":3799,"src":"2009:21:35","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":3786,"name":"string","nodeType":"ElementaryTypeName","src":"2009:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1987:44:35"},"returnParameters":{"id":3789,"nodeType":"ParameterList","parameters":[],"src":"2032:0:35"},"scope":4341,"src":"1976:113:35","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[4431],"body":{"id":3808,"nodeType":"Block","src":"2223:29:35","statements":[{"expression":{"id":3806,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3780,"src":"2240:5:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":3805,"id":3807,"nodeType":"Return","src":"2233:12:35"}]},"documentation":{"id":3800,"nodeType":"StructuredDocumentation","src":"2095:54:35","text":" @dev Returns the name of the token."},"functionSelector":"06fdde03","id":3809,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"2163:4:35","nodeType":"FunctionDefinition","overrides":{"id":3802,"nodeType":"OverrideSpecifier","overrides":[],"src":"2190:8:35"},"parameters":{"id":3801,"nodeType":"ParameterList","parameters":[],"src":"2167:2:35"},"returnParameters":{"id":3805,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3804,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3809,"src":"2208:13:35","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":3803,"name":"string","nodeType":"ElementaryTypeName","src":"2208:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2207:15:35"},"scope":4341,"src":"2154:98:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4437],"body":{"id":3818,"nodeType":"Block","src":"2436:31:35","statements":[{"expression":{"id":3816,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3782,"src":"2453:7:35","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":3815,"id":3817,"nodeType":"Return","src":"2446:14:35"}]},"documentation":{"id":3810,"nodeType":"StructuredDocumentation","src":"2258:102:35","text":" @dev Returns the symbol of the token, usually a shorter version of the\n name."},"functionSelector":"95d89b41","id":3819,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"2374:6:35","nodeType":"FunctionDefinition","overrides":{"id":3812,"nodeType":"OverrideSpecifier","overrides":[],"src":"2403:8:35"},"parameters":{"id":3811,"nodeType":"ParameterList","parameters":[],"src":"2380:2:35"},"returnParameters":{"id":3815,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3814,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3819,"src":"2421:13:35","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":3813,"name":"string","nodeType":"ElementaryTypeName","src":"2421:6:35","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2420:15:35"},"scope":4341,"src":"2365:102:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4443],"body":{"id":3828,"nodeType":"Block","src":"3156:26:35","statements":[{"expression":{"hexValue":"3138","id":3826,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3173:2:35","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"functionReturnParameters":3825,"id":3827,"nodeType":"Return","src":"3166:9:35"}]},"documentation":{"id":3820,"nodeType":"StructuredDocumentation","src":"2473:613:35","text":" @dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5.05` (`505 / 10 ** 2`).\n Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei. This is the value {ERC20} uses, unless this function is\n overridden;\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n {IERC20-balanceOf} and {IERC20-transfer}."},"functionSelector":"313ce567","id":3829,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"3100:8:35","nodeType":"FunctionDefinition","overrides":{"id":3822,"nodeType":"OverrideSpecifier","overrides":[],"src":"3131:8:35"},"parameters":{"id":3821,"nodeType":"ParameterList","parameters":[],"src":"3108:2:35"},"returnParameters":{"id":3825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3824,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3829,"src":"3149:5:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3823,"name":"uint8","nodeType":"ElementaryTypeName","src":"3149:5:35","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"3148:7:35"},"scope":4341,"src":"3091:91:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4368],"body":{"id":3838,"nodeType":"Block","src":"3312:36:35","statements":[{"expression":{"id":3836,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3778,"src":"3329:12:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3835,"id":3837,"nodeType":"Return","src":"3322:19:35"}]},"documentation":{"id":3830,"nodeType":"StructuredDocumentation","src":"3188:49:35","text":" @dev See {IERC20-totalSupply}."},"functionSelector":"18160ddd","id":3839,"implemented":true,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"3251:11:35","nodeType":"FunctionDefinition","overrides":{"id":3832,"nodeType":"OverrideSpecifier","overrides":[],"src":"3285:8:35"},"parameters":{"id":3831,"nodeType":"ParameterList","parameters":[],"src":"3262:2:35"},"returnParameters":{"id":3835,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3834,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3839,"src":"3303:7:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3833,"name":"uint256","nodeType":"ElementaryTypeName","src":"3303:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3302:9:35"},"scope":4341,"src":"3242:106:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4376],"body":{"id":3852,"nodeType":"Block","src":"3489:42:35","statements":[{"expression":{"baseExpression":{"id":3848,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"3506:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":3850,"indexExpression":{"id":3849,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3842,"src":"3516:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3506:18:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3847,"id":3851,"nodeType":"Return","src":"3499:25:35"}]},"documentation":{"id":3840,"nodeType":"StructuredDocumentation","src":"3354:47:35","text":" @dev See {IERC20-balanceOf}."},"functionSelector":"70a08231","id":3853,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"3415:9:35","nodeType":"FunctionDefinition","overrides":{"id":3844,"nodeType":"OverrideSpecifier","overrides":[],"src":"3462:8:35"},"parameters":{"id":3843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3842,"mutability":"mutable","name":"account","nameLocation":"3433:7:35","nodeType":"VariableDeclaration","scope":3853,"src":"3425:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3841,"name":"address","nodeType":"ElementaryTypeName","src":"3425:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3424:17:35"},"returnParameters":{"id":3847,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3846,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3853,"src":"3480:7:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3845,"name":"uint256","nodeType":"ElementaryTypeName","src":"3480:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3479:9:35"},"scope":4341,"src":"3406:125:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4386],"body":{"id":3877,"nodeType":"Block","src":"3812:104:35","statements":[{"assignments":[3865],"declarations":[{"constant":false,"id":3865,"mutability":"mutable","name":"owner","nameLocation":"3830:5:35","nodeType":"VariableDeclaration","scope":3877,"src":"3822:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3864,"name":"address","nodeType":"ElementaryTypeName","src":"3822:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3868,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":3866,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"3838:10:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3838:12:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"3822:28:35"},{"expression":{"arguments":[{"id":3870,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3865,"src":"3870:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3871,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3856,"src":"3877:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3872,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3858,"src":"3881:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3869,"name":"_transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4101,"src":"3860:9:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3873,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3860:28:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3874,"nodeType":"ExpressionStatement","src":"3860:28:35"},{"expression":{"hexValue":"74727565","id":3875,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3905:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":3863,"id":3876,"nodeType":"Return","src":"3898:11:35"}]},"documentation":{"id":3854,"nodeType":"StructuredDocumentation","src":"3537:185:35","text":" @dev See {IERC20-transfer}.\n Requirements:\n - `to` cannot be the zero address.\n - the caller must have a balance of at least `amount`."},"functionSelector":"a9059cbb","id":3878,"implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"3736:8:35","nodeType":"FunctionDefinition","overrides":{"id":3860,"nodeType":"OverrideSpecifier","overrides":[],"src":"3788:8:35"},"parameters":{"id":3859,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3856,"mutability":"mutable","name":"to","nameLocation":"3753:2:35","nodeType":"VariableDeclaration","scope":3878,"src":"3745:10:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3855,"name":"address","nodeType":"ElementaryTypeName","src":"3745:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3858,"mutability":"mutable","name":"amount","nameLocation":"3765:6:35","nodeType":"VariableDeclaration","scope":3878,"src":"3757:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3857,"name":"uint256","nodeType":"ElementaryTypeName","src":"3757:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3744:28:35"},"returnParameters":{"id":3863,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3862,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3878,"src":"3806:4:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3861,"name":"bool","nodeType":"ElementaryTypeName","src":"3806:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3805:6:35"},"scope":4341,"src":"3727:189:35","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[4396],"body":{"id":3895,"nodeType":"Block","src":"4072:51:35","statements":[{"expression":{"baseExpression":{"baseExpression":{"id":3889,"name":"_allowances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3776,"src":"4089:11:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":3891,"indexExpression":{"id":3890,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3881,"src":"4101:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4089:18:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":3893,"indexExpression":{"id":3892,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3883,"src":"4108:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4089:27:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":3888,"id":3894,"nodeType":"Return","src":"4082:34:35"}]},"documentation":{"id":3879,"nodeType":"StructuredDocumentation","src":"3922:47:35","text":" @dev See {IERC20-allowance}."},"functionSelector":"dd62ed3e","id":3896,"implemented":true,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"3983:9:35","nodeType":"FunctionDefinition","overrides":{"id":3885,"nodeType":"OverrideSpecifier","overrides":[],"src":"4045:8:35"},"parameters":{"id":3884,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3881,"mutability":"mutable","name":"owner","nameLocation":"4001:5:35","nodeType":"VariableDeclaration","scope":3896,"src":"3993:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3880,"name":"address","nodeType":"ElementaryTypeName","src":"3993:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3883,"mutability":"mutable","name":"spender","nameLocation":"4016:7:35","nodeType":"VariableDeclaration","scope":3896,"src":"4008:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3882,"name":"address","nodeType":"ElementaryTypeName","src":"4008:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3992:32:35"},"returnParameters":{"id":3888,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3887,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3896,"src":"4063:7:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3886,"name":"uint256","nodeType":"ElementaryTypeName","src":"4063:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4062:9:35"},"scope":4341,"src":"3974:149:35","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[4406],"body":{"id":3920,"nodeType":"Block","src":"4520:108:35","statements":[{"assignments":[3908],"declarations":[{"constant":false,"id":3908,"mutability":"mutable","name":"owner","nameLocation":"4538:5:35","nodeType":"VariableDeclaration","scope":3920,"src":"4530:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3907,"name":"address","nodeType":"ElementaryTypeName","src":"4530:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3911,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":3909,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"4546:10:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3910,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4546:12:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4530:28:35"},{"expression":{"arguments":[{"id":3913,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3908,"src":"4577:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3914,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3899,"src":"4584:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3915,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3901,"src":"4593:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3912,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"4568:8:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4568:32:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3917,"nodeType":"ExpressionStatement","src":"4568:32:35"},{"expression":{"hexValue":"74727565","id":3918,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4617:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":3906,"id":3919,"nodeType":"Return","src":"4610:11:35"}]},"documentation":{"id":3897,"nodeType":"StructuredDocumentation","src":"4129:297:35","text":" @dev See {IERC20-approve}.\n NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n `transferFrom`. This is semantically equivalent to an infinite approval.\n Requirements:\n - `spender` cannot be the zero address."},"functionSelector":"095ea7b3","id":3921,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"4440:7:35","nodeType":"FunctionDefinition","overrides":{"id":3903,"nodeType":"OverrideSpecifier","overrides":[],"src":"4496:8:35"},"parameters":{"id":3902,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3899,"mutability":"mutable","name":"spender","nameLocation":"4456:7:35","nodeType":"VariableDeclaration","scope":3921,"src":"4448:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3898,"name":"address","nodeType":"ElementaryTypeName","src":"4448:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3901,"mutability":"mutable","name":"amount","nameLocation":"4473:6:35","nodeType":"VariableDeclaration","scope":3921,"src":"4465:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3900,"name":"uint256","nodeType":"ElementaryTypeName","src":"4465:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4447:33:35"},"returnParameters":{"id":3906,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3905,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3921,"src":"4514:4:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3904,"name":"bool","nodeType":"ElementaryTypeName","src":"4514:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4513:6:35"},"scope":4341,"src":"4431:197:35","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[4418],"body":{"id":3953,"nodeType":"Block","src":"5323:153:35","statements":[{"assignments":[3935],"declarations":[{"constant":false,"id":3935,"mutability":"mutable","name":"spender","nameLocation":"5341:7:35","nodeType":"VariableDeclaration","scope":3953,"src":"5333:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3934,"name":"address","nodeType":"ElementaryTypeName","src":"5333:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3938,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":3936,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"5351:10:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5351:12:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5333:30:35"},{"expression":{"arguments":[{"id":3940,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3924,"src":"5389:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3941,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3935,"src":"5395:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3942,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3928,"src":"5404:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3939,"name":"_spendAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4318,"src":"5373:15:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3943,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5373:38:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3944,"nodeType":"ExpressionStatement","src":"5373:38:35"},{"expression":{"arguments":[{"id":3946,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3924,"src":"5431:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3947,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3926,"src":"5437:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3948,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3928,"src":"5441:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3945,"name":"_transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4101,"src":"5421:9:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3949,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5421:27:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3950,"nodeType":"ExpressionStatement","src":"5421:27:35"},{"expression":{"hexValue":"74727565","id":3951,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5465:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":3933,"id":3952,"nodeType":"Return","src":"5458:11:35"}]},"documentation":{"id":3922,"nodeType":"StructuredDocumentation","src":"4634:551:35","text":" @dev See {IERC20-transferFrom}.\n Emits an {Approval} event indicating the updated allowance. This is not\n required by the EIP. See the note at the beginning of {ERC20}.\n NOTE: Does not update the allowance if the current allowance\n is the maximum `uint256`.\n Requirements:\n - `from` and `to` cannot be the zero address.\n - `from` must have a balance of at least `amount`.\n - the caller must have allowance for ``from``'s tokens of at least\n `amount`."},"functionSelector":"23b872dd","id":3954,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"5199:12:35","nodeType":"FunctionDefinition","overrides":{"id":3930,"nodeType":"OverrideSpecifier","overrides":[],"src":"5299:8:35"},"parameters":{"id":3929,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3924,"mutability":"mutable","name":"from","nameLocation":"5229:4:35","nodeType":"VariableDeclaration","scope":3954,"src":"5221:12:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3923,"name":"address","nodeType":"ElementaryTypeName","src":"5221:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3926,"mutability":"mutable","name":"to","nameLocation":"5251:2:35","nodeType":"VariableDeclaration","scope":3954,"src":"5243:10:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3925,"name":"address","nodeType":"ElementaryTypeName","src":"5243:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3928,"mutability":"mutable","name":"amount","nameLocation":"5271:6:35","nodeType":"VariableDeclaration","scope":3954,"src":"5263:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3927,"name":"uint256","nodeType":"ElementaryTypeName","src":"5263:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5211:72:35"},"returnParameters":{"id":3933,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3932,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3954,"src":"5317:4:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3931,"name":"bool","nodeType":"ElementaryTypeName","src":"5317:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5316:6:35"},"scope":4341,"src":"5190:286:35","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":3982,"nodeType":"Block","src":"5965:140:35","statements":[{"assignments":[3965],"declarations":[{"constant":false,"id":3965,"mutability":"mutable","name":"owner","nameLocation":"5983:5:35","nodeType":"VariableDeclaration","scope":3982,"src":"5975:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3964,"name":"address","nodeType":"ElementaryTypeName","src":"5975:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3968,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":3966,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"5991:10:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5991:12:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5975:28:35"},{"expression":{"arguments":[{"id":3970,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3965,"src":"6022:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3971,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3957,"src":"6029:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3977,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3973,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3965,"src":"6048:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":3974,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3957,"src":"6055:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":3972,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3896,"src":"6038:9:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":3975,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6038:25:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":3976,"name":"addedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3959,"src":"6066:10:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6038:38:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3969,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"6013:8:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":3978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6013:64:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3979,"nodeType":"ExpressionStatement","src":"6013:64:35"},{"expression":{"hexValue":"74727565","id":3980,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6094:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":3963,"id":3981,"nodeType":"Return","src":"6087:11:35"}]},"documentation":{"id":3955,"nodeType":"StructuredDocumentation","src":"5482:384:35","text":" @dev Atomically increases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address."},"functionSelector":"39509351","id":3983,"implemented":true,"kind":"function","modifiers":[],"name":"increaseAllowance","nameLocation":"5880:17:35","nodeType":"FunctionDefinition","parameters":{"id":3960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3957,"mutability":"mutable","name":"spender","nameLocation":"5906:7:35","nodeType":"VariableDeclaration","scope":3983,"src":"5898:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3956,"name":"address","nodeType":"ElementaryTypeName","src":"5898:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3959,"mutability":"mutable","name":"addedValue","nameLocation":"5923:10:35","nodeType":"VariableDeclaration","scope":3983,"src":"5915:18:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3958,"name":"uint256","nodeType":"ElementaryTypeName","src":"5915:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5897:37:35"},"returnParameters":{"id":3963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3962,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3983,"src":"5959:4:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3961,"name":"bool","nodeType":"ElementaryTypeName","src":"5959:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5958:6:35"},"scope":4341,"src":"5871:234:35","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":4023,"nodeType":"Block","src":"6691:328:35","statements":[{"assignments":[3994],"declarations":[{"constant":false,"id":3994,"mutability":"mutable","name":"owner","nameLocation":"6709:5:35","nodeType":"VariableDeclaration","scope":4023,"src":"6701:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3993,"name":"address","nodeType":"ElementaryTypeName","src":"6701:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3997,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":3995,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5141,"src":"6717:10:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":3996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6717:12:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6701:28:35"},{"assignments":[3999],"declarations":[{"constant":false,"id":3999,"mutability":"mutable","name":"currentAllowance","nameLocation":"6747:16:35","nodeType":"VariableDeclaration","scope":4023,"src":"6739:24:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3998,"name":"uint256","nodeType":"ElementaryTypeName","src":"6739:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4004,"initialValue":{"arguments":[{"id":4001,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"6776:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4002,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3986,"src":"6783:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":4000,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3896,"src":"6766:9:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":4003,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6766:25:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6739:52:35"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4006,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3999,"src":"6809:16:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4007,"name":"subtractedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3988,"src":"6829:15:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6809:35:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f","id":4009,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6846:39:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8","typeString":"literal_string \"ERC20: decreased allowance below zero\""},"value":"ERC20: decreased allowance below zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8","typeString":"literal_string \"ERC20: decreased allowance below zero\""}],"id":4005,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6801:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6801:85:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4011,"nodeType":"ExpressionStatement","src":"6801:85:35"},{"id":4020,"nodeType":"UncheckedBlock","src":"6896:95:35","statements":[{"expression":{"arguments":[{"id":4013,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"6929:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4014,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3986,"src":"6936:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4015,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3999,"src":"6945:16:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4016,"name":"subtractedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3988,"src":"6964:15:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6945:34:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4012,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"6920:8:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6920:60:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4019,"nodeType":"ExpressionStatement","src":"6920:60:35"}]},{"expression":{"hexValue":"74727565","id":4021,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7008:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":3992,"id":4022,"nodeType":"Return","src":"7001:11:35"}]},"documentation":{"id":3984,"nodeType":"StructuredDocumentation","src":"6111:476:35","text":" @dev Atomically decreases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address.\n - `spender` must have allowance for the caller of at least\n `subtractedValue`."},"functionSelector":"a457c2d7","id":4024,"implemented":true,"kind":"function","modifiers":[],"name":"decreaseAllowance","nameLocation":"6601:17:35","nodeType":"FunctionDefinition","parameters":{"id":3989,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3986,"mutability":"mutable","name":"spender","nameLocation":"6627:7:35","nodeType":"VariableDeclaration","scope":4024,"src":"6619:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3985,"name":"address","nodeType":"ElementaryTypeName","src":"6619:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3988,"mutability":"mutable","name":"subtractedValue","nameLocation":"6644:15:35","nodeType":"VariableDeclaration","scope":4024,"src":"6636:23:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3987,"name":"uint256","nodeType":"ElementaryTypeName","src":"6636:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6618:42:35"},"returnParameters":{"id":3992,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3991,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4024,"src":"6685:4:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3990,"name":"bool","nodeType":"ElementaryTypeName","src":"6685:4:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6684:6:35"},"scope":4341,"src":"6592:427:35","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":4100,"nodeType":"Block","src":"7581:710:35","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4035,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"7599:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4038,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7615:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4037,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7607:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4036,"name":"address","nodeType":"ElementaryTypeName","src":"7607:7:35","typeDescriptions":{}}},"id":4039,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7607:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7599:18:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373","id":4041,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7619:39:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea","typeString":"literal_string \"ERC20: transfer from the zero address\""},"value":"ERC20: transfer from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea","typeString":"literal_string \"ERC20: transfer from the zero address\""}],"id":4034,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7591:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7591:68:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4043,"nodeType":"ExpressionStatement","src":"7591:68:35"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4045,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4029,"src":"7677:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4048,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7691:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4047,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7683:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4046,"name":"address","nodeType":"ElementaryTypeName","src":"7683:7:35","typeDescriptions":{}}},"id":4049,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7683:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7677:16:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e7366657220746f20746865207a65726f2061646472657373","id":4051,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7695:37:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f","typeString":"literal_string \"ERC20: transfer to the zero address\""},"value":"ERC20: transfer to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f","typeString":"literal_string \"ERC20: transfer to the zero address\""}],"id":4044,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7669:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7669:64:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4053,"nodeType":"ExpressionStatement","src":"7669:64:35"},{"expression":{"arguments":[{"id":4055,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"7765:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4056,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4029,"src":"7771:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4057,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"7775:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4054,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4329,"src":"7744:20:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7744:38:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4059,"nodeType":"ExpressionStatement","src":"7744:38:35"},{"assignments":[4061],"declarations":[{"constant":false,"id":4061,"mutability":"mutable","name":"fromBalance","nameLocation":"7801:11:35","nodeType":"VariableDeclaration","scope":4100,"src":"7793:19:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4060,"name":"uint256","nodeType":"ElementaryTypeName","src":"7793:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4065,"initialValue":{"baseExpression":{"id":4062,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"7815:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4064,"indexExpression":{"id":4063,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"7825:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7815:15:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7793:37:35"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4067,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4061,"src":"7848:11:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4068,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"7863:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7848:21:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365","id":4070,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7871:40:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6","typeString":"literal_string \"ERC20: transfer amount exceeds balance\""},"value":"ERC20: transfer amount exceeds balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6","typeString":"literal_string \"ERC20: transfer amount exceeds balance\""}],"id":4066,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7840:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4071,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7840:72:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4072,"nodeType":"ExpressionStatement","src":"7840:72:35"},{"id":4087,"nodeType":"UncheckedBlock","src":"7922:273:35","statements":[{"expression":{"id":4079,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4073,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"7946:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4075,"indexExpression":{"id":4074,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"7956:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7946:15:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4076,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4061,"src":"7964:11:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4077,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"7978:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7964:20:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7946:38:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4080,"nodeType":"ExpressionStatement","src":"7946:38:35"},{"expression":{"id":4085,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4081,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"8161:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4083,"indexExpression":{"id":4082,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4029,"src":"8171:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8161:13:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":4084,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"8178:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8161:23:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4086,"nodeType":"ExpressionStatement","src":"8161:23:35"}]},{"eventCall":{"arguments":[{"id":4089,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"8219:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4090,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4029,"src":"8225:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4091,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"8229:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4088,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4353,"src":"8210:8:35","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4092,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8210:26:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4093,"nodeType":"EmitStatement","src":"8205:31:35"},{"expression":{"arguments":[{"id":4095,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"8267:4:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4096,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4029,"src":"8273:2:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4097,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"8277:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4094,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4340,"src":"8247:19:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8247:37:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4099,"nodeType":"ExpressionStatement","src":"8247:37:35"}]},"documentation":{"id":4025,"nodeType":"StructuredDocumentation","src":"7025:443:35","text":" @dev Moves `amount` of tokens from `from` to `to`.\n This internal function is equivalent to {transfer}, and can be used to\n e.g. implement automatic token fees, slashing mechanisms, etc.\n Emits a {Transfer} event.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `from` must have a balance of at least `amount`."},"id":4101,"implemented":true,"kind":"function","modifiers":[],"name":"_transfer","nameLocation":"7482:9:35","nodeType":"FunctionDefinition","parameters":{"id":4032,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4027,"mutability":"mutable","name":"from","nameLocation":"7509:4:35","nodeType":"VariableDeclaration","scope":4101,"src":"7501:12:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4026,"name":"address","nodeType":"ElementaryTypeName","src":"7501:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4029,"mutability":"mutable","name":"to","nameLocation":"7531:2:35","nodeType":"VariableDeclaration","scope":4101,"src":"7523:10:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4028,"name":"address","nodeType":"ElementaryTypeName","src":"7523:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4031,"mutability":"mutable","name":"amount","nameLocation":"7551:6:35","nodeType":"VariableDeclaration","scope":4101,"src":"7543:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4030,"name":"uint256","nodeType":"ElementaryTypeName","src":"7543:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7491:72:35"},"returnParameters":{"id":4033,"nodeType":"ParameterList","parameters":[],"src":"7581:0:35"},"scope":4341,"src":"7473:818:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4157,"nodeType":"Block","src":"8632:470:35","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4110,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4104,"src":"8650:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4113,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8669:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4112,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8661:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4111,"name":"address","nodeType":"ElementaryTypeName","src":"8661:7:35","typeDescriptions":{}}},"id":4114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8661:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8650:21:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206d696e7420746f20746865207a65726f2061646472657373","id":4116,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8673:33:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e","typeString":"literal_string \"ERC20: mint to the zero address\""},"value":"ERC20: mint to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e","typeString":"literal_string \"ERC20: mint to the zero address\""}],"id":4109,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8642:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8642:65:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4118,"nodeType":"ExpressionStatement","src":"8642:65:35"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":4122,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8747:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4121,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8739:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4120,"name":"address","nodeType":"ElementaryTypeName","src":"8739:7:35","typeDescriptions":{}}},"id":4123,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8739:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4124,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4104,"src":"8751:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4125,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4106,"src":"8760:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4119,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4329,"src":"8718:20:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8718:49:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4127,"nodeType":"ExpressionStatement","src":"8718:49:35"},{"expression":{"id":4130,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4128,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3778,"src":"8778:12:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":4129,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4106,"src":"8794:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8778:22:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4131,"nodeType":"ExpressionStatement","src":"8778:22:35"},{"id":4138,"nodeType":"UncheckedBlock","src":"8810:175:35","statements":[{"expression":{"id":4136,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4132,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"8946:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4134,"indexExpression":{"id":4133,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4104,"src":"8956:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8946:18:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":4135,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4106,"src":"8968:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8946:28:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4137,"nodeType":"ExpressionStatement","src":"8946:28:35"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":4142,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9016:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4141,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9008:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4140,"name":"address","nodeType":"ElementaryTypeName","src":"9008:7:35","typeDescriptions":{}}},"id":4143,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9008:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4144,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4104,"src":"9020:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4145,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4106,"src":"9029:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4139,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4353,"src":"8999:8:35","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4146,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8999:37:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4147,"nodeType":"EmitStatement","src":"8994:42:35"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":4151,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9075:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4150,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9067:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4149,"name":"address","nodeType":"ElementaryTypeName","src":"9067:7:35","typeDescriptions":{}}},"id":4152,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9067:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4153,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4104,"src":"9079:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4154,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4106,"src":"9088:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4148,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4340,"src":"9047:19:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4155,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9047:48:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4156,"nodeType":"ExpressionStatement","src":"9047:48:35"}]},"documentation":{"id":4102,"nodeType":"StructuredDocumentation","src":"8297:265:35","text":"@dev Creates `amount` tokens and assigns them to `account`, increasing\n the total supply.\n Emits a {Transfer} event with `from` set to the zero address.\n Requirements:\n - `account` cannot be the zero address."},"id":4158,"implemented":true,"kind":"function","modifiers":[],"name":"_mint","nameLocation":"8576:5:35","nodeType":"FunctionDefinition","parameters":{"id":4107,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4104,"mutability":"mutable","name":"account","nameLocation":"8590:7:35","nodeType":"VariableDeclaration","scope":4158,"src":"8582:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4103,"name":"address","nodeType":"ElementaryTypeName","src":"8582:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4106,"mutability":"mutable","name":"amount","nameLocation":"8607:6:35","nodeType":"VariableDeclaration","scope":4158,"src":"8599:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4105,"name":"uint256","nodeType":"ElementaryTypeName","src":"8599:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8581:33:35"},"returnParameters":{"id":4108,"nodeType":"ParameterList","parameters":[],"src":"8632:0:35"},"scope":4341,"src":"8567:535:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4229,"nodeType":"Block","src":"9487:594:35","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4172,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4167,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"9505:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4170,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9524:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4169,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9516:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4168,"name":"address","nodeType":"ElementaryTypeName","src":"9516:7:35","typeDescriptions":{}}},"id":4171,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9516:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9505:21:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206275726e2066726f6d20746865207a65726f2061646472657373","id":4173,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9528:35:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f","typeString":"literal_string \"ERC20: burn from the zero address\""},"value":"ERC20: burn from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f","typeString":"literal_string \"ERC20: burn from the zero address\""}],"id":4166,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9497:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4174,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9497:67:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4175,"nodeType":"ExpressionStatement","src":"9497:67:35"},{"expression":{"arguments":[{"id":4177,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"9596:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":4180,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9613:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4179,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9605:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4178,"name":"address","nodeType":"ElementaryTypeName","src":"9605:7:35","typeDescriptions":{}}},"id":4181,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9605:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4182,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"9617:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4176,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4329,"src":"9575:20:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9575:49:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4184,"nodeType":"ExpressionStatement","src":"9575:49:35"},{"assignments":[4186],"declarations":[{"constant":false,"id":4186,"mutability":"mutable","name":"accountBalance","nameLocation":"9643:14:35","nodeType":"VariableDeclaration","scope":4229,"src":"9635:22:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4185,"name":"uint256","nodeType":"ElementaryTypeName","src":"9635:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4190,"initialValue":{"baseExpression":{"id":4187,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"9660:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4189,"indexExpression":{"id":4188,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"9670:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9660:18:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9635:43:35"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4192,"name":"accountBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4186,"src":"9696:14:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4193,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"9714:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9696:24:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365","id":4195,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9722:36:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd","typeString":"literal_string \"ERC20: burn amount exceeds balance\""},"value":"ERC20: burn amount exceeds balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd","typeString":"literal_string \"ERC20: burn amount exceeds balance\""}],"id":4191,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9688:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4196,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9688:71:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4197,"nodeType":"ExpressionStatement","src":"9688:71:35"},{"id":4210,"nodeType":"UncheckedBlock","src":"9769:194:35","statements":[{"expression":{"id":4204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4198,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3770,"src":"9793:9:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4200,"indexExpression":{"id":4199,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"9803:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9793:18:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4201,"name":"accountBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4186,"src":"9814:14:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4202,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"9831:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9814:23:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9793:44:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4205,"nodeType":"ExpressionStatement","src":"9793:44:35"},{"expression":{"id":4208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4206,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3778,"src":"9930:12:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":4207,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"9946:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9930:22:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4209,"nodeType":"ExpressionStatement","src":"9930:22:35"}]},{"eventCall":{"arguments":[{"id":4212,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"9987:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":4215,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10004:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4214,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9996:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4213,"name":"address","nodeType":"ElementaryTypeName","src":"9996:7:35","typeDescriptions":{}}},"id":4216,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9996:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4217,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"10008:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4211,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4353,"src":"9978:8:35","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4218,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9978:37:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4219,"nodeType":"EmitStatement","src":"9973:42:35"},{"expression":{"arguments":[{"id":4221,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4161,"src":"10046:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":4224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10063:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4223,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10055:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4222,"name":"address","nodeType":"ElementaryTypeName","src":"10055:7:35","typeDescriptions":{}}},"id":4225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10055:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4226,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4163,"src":"10067:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4220,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4340,"src":"10026:19:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4227,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10026:48:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4228,"nodeType":"ExpressionStatement","src":"10026:48:35"}]},"documentation":{"id":4159,"nodeType":"StructuredDocumentation","src":"9108:309:35","text":" @dev Destroys `amount` tokens from `account`, reducing the\n total supply.\n Emits a {Transfer} event with `to` set to the zero address.\n Requirements:\n - `account` cannot be the zero address.\n - `account` must have at least `amount` tokens."},"id":4230,"implemented":true,"kind":"function","modifiers":[],"name":"_burn","nameLocation":"9431:5:35","nodeType":"FunctionDefinition","parameters":{"id":4164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4161,"mutability":"mutable","name":"account","nameLocation":"9445:7:35","nodeType":"VariableDeclaration","scope":4230,"src":"9437:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4160,"name":"address","nodeType":"ElementaryTypeName","src":"9437:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4163,"mutability":"mutable","name":"amount","nameLocation":"9462:6:35","nodeType":"VariableDeclaration","scope":4230,"src":"9454:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4162,"name":"uint256","nodeType":"ElementaryTypeName","src":"9454:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9436:33:35"},"returnParameters":{"id":4165,"nodeType":"ParameterList","parameters":[],"src":"9487:0:35"},"scope":4341,"src":"9422:659:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4274,"nodeType":"Block","src":"10617:257:35","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4241,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4233,"src":"10635:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4244,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10652:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4243,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10644:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4242,"name":"address","nodeType":"ElementaryTypeName","src":"10644:7:35","typeDescriptions":{}}},"id":4245,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10644:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10635:19:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373","id":4247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10656:38:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208","typeString":"literal_string \"ERC20: approve from the zero address\""},"value":"ERC20: approve from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208","typeString":"literal_string \"ERC20: approve from the zero address\""}],"id":4240,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10627:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4248,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10627:68:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4249,"nodeType":"ExpressionStatement","src":"10627:68:35"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4251,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4235,"src":"10713:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4254,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10732:1:35","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4253,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10724:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4252,"name":"address","nodeType":"ElementaryTypeName","src":"10724:7:35","typeDescriptions":{}}},"id":4255,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10724:10:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10713:21:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f2061646472657373","id":4257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10736:36:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029","typeString":"literal_string \"ERC20: approve to the zero address\""},"value":"ERC20: approve to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029","typeString":"literal_string \"ERC20: approve to the zero address\""}],"id":4250,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10705:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10705:68:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4259,"nodeType":"ExpressionStatement","src":"10705:68:35"},{"expression":{"id":4266,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":4260,"name":"_allowances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3776,"src":"10784:11:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":4263,"indexExpression":{"id":4261,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4233,"src":"10796:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10784:18:35","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":4264,"indexExpression":{"id":4262,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4235,"src":"10803:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10784:27:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4265,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4237,"src":"10814:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10784:36:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4267,"nodeType":"ExpressionStatement","src":"10784:36:35"},{"eventCall":{"arguments":[{"id":4269,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4233,"src":"10844:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4270,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4235,"src":"10851:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4271,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4237,"src":"10860:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4268,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4362,"src":"10835:8:35","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4272,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10835:32:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4273,"nodeType":"EmitStatement","src":"10830:37:35"}]},"documentation":{"id":4231,"nodeType":"StructuredDocumentation","src":"10087:412:35","text":" @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n This internal function is equivalent to `approve`, and can be used to\n e.g. set automatic allowances for certain subsystems, etc.\n Emits an {Approval} event.\n Requirements:\n - `owner` cannot be the zero address.\n - `spender` cannot be the zero address."},"id":4275,"implemented":true,"kind":"function","modifiers":[],"name":"_approve","nameLocation":"10513:8:35","nodeType":"FunctionDefinition","parameters":{"id":4238,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4233,"mutability":"mutable","name":"owner","nameLocation":"10539:5:35","nodeType":"VariableDeclaration","scope":4275,"src":"10531:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4232,"name":"address","nodeType":"ElementaryTypeName","src":"10531:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4235,"mutability":"mutable","name":"spender","nameLocation":"10562:7:35","nodeType":"VariableDeclaration","scope":4275,"src":"10554:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4234,"name":"address","nodeType":"ElementaryTypeName","src":"10554:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4237,"mutability":"mutable","name":"amount","nameLocation":"10587:6:35","nodeType":"VariableDeclaration","scope":4275,"src":"10579:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4236,"name":"uint256","nodeType":"ElementaryTypeName","src":"10579:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10521:78:35"},"returnParameters":{"id":4239,"nodeType":"ParameterList","parameters":[],"src":"10617:0:35"},"scope":4341,"src":"10504:370:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4317,"nodeType":"Block","src":"11275:321:35","statements":[{"assignments":[4286],"declarations":[{"constant":false,"id":4286,"mutability":"mutable","name":"currentAllowance","nameLocation":"11293:16:35","nodeType":"VariableDeclaration","scope":4317,"src":"11285:24:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4285,"name":"uint256","nodeType":"ElementaryTypeName","src":"11285:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4291,"initialValue":{"arguments":[{"id":4288,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4278,"src":"11322:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4289,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4280,"src":"11329:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":4287,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3896,"src":"11312:9:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":4290,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11312:25:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11285:52:35"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4298,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4292,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4286,"src":"11351:16:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":4295,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11376:7:35","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":4294,"name":"uint256","nodeType":"ElementaryTypeName","src":"11376:7:35","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":4293,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"11371:4:35","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":4296,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11371:13:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":4297,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"11371:17:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11351:37:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4316,"nodeType":"IfStatement","src":"11347:243:35","trueBody":{"id":4315,"nodeType":"Block","src":"11390:200:35","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4300,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4286,"src":"11412:16:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4301,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4282,"src":"11432:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11412:26:35","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20696e73756666696369656e7420616c6c6f77616e6365","id":4303,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11440:31:35","typeDescriptions":{"typeIdentifier":"t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe","typeString":"literal_string \"ERC20: insufficient allowance\""},"value":"ERC20: insufficient allowance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe","typeString":"literal_string \"ERC20: insufficient allowance\""}],"id":4299,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11404:7:35","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4304,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11404:68:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4305,"nodeType":"ExpressionStatement","src":"11404:68:35"},{"id":4314,"nodeType":"UncheckedBlock","src":"11486:94:35","statements":[{"expression":{"arguments":[{"id":4307,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4278,"src":"11523:5:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4308,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4280,"src":"11530:7:35","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4309,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4286,"src":"11539:16:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4310,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4282,"src":"11558:6:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11539:25:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4306,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"11514:8:35","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":4312,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11514:51:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4313,"nodeType":"ExpressionStatement","src":"11514:51:35"}]}]}}]},"documentation":{"id":4276,"nodeType":"StructuredDocumentation","src":"10880:270:35","text":" @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n Does not update the allowance amount in case of infinite allowance.\n Revert if not enough allowance is available.\n Might emit an {Approval} event."},"id":4318,"implemented":true,"kind":"function","modifiers":[],"name":"_spendAllowance","nameLocation":"11164:15:35","nodeType":"FunctionDefinition","parameters":{"id":4283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4278,"mutability":"mutable","name":"owner","nameLocation":"11197:5:35","nodeType":"VariableDeclaration","scope":4318,"src":"11189:13:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4277,"name":"address","nodeType":"ElementaryTypeName","src":"11189:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4280,"mutability":"mutable","name":"spender","nameLocation":"11220:7:35","nodeType":"VariableDeclaration","scope":4318,"src":"11212:15:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4279,"name":"address","nodeType":"ElementaryTypeName","src":"11212:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4282,"mutability":"mutable","name":"amount","nameLocation":"11245:6:35","nodeType":"VariableDeclaration","scope":4318,"src":"11237:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4281,"name":"uint256","nodeType":"ElementaryTypeName","src":"11237:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11179:78:35"},"returnParameters":{"id":4284,"nodeType":"ParameterList","parameters":[],"src":"11275:0:35"},"scope":4341,"src":"11155:441:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4328,"nodeType":"Block","src":"12299:2:35","statements":[]},"documentation":{"id":4319,"nodeType":"StructuredDocumentation","src":"11602:573:35","text":" @dev Hook that is called before any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n will be transferred to `to`.\n - when `from` is zero, `amount` tokens will be minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."},"id":4329,"implemented":true,"kind":"function","modifiers":[],"name":"_beforeTokenTransfer","nameLocation":"12189:20:35","nodeType":"FunctionDefinition","parameters":{"id":4326,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4321,"mutability":"mutable","name":"from","nameLocation":"12227:4:35","nodeType":"VariableDeclaration","scope":4329,"src":"12219:12:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4320,"name":"address","nodeType":"ElementaryTypeName","src":"12219:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4323,"mutability":"mutable","name":"to","nameLocation":"12249:2:35","nodeType":"VariableDeclaration","scope":4329,"src":"12241:10:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4322,"name":"address","nodeType":"ElementaryTypeName","src":"12241:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4325,"mutability":"mutable","name":"amount","nameLocation":"12269:6:35","nodeType":"VariableDeclaration","scope":4329,"src":"12261:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4324,"name":"uint256","nodeType":"ElementaryTypeName","src":"12261:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12209:72:35"},"returnParameters":{"id":4327,"nodeType":"ParameterList","parameters":[],"src":"12299:0:35"},"scope":4341,"src":"12180:121:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":4339,"nodeType":"Block","src":"13007:2:35","statements":[]},"documentation":{"id":4330,"nodeType":"StructuredDocumentation","src":"12307:577:35","text":" @dev Hook that is called after any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n has been transferred to `to`.\n - when `from` is zero, `amount` tokens have been minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."},"id":4340,"implemented":true,"kind":"function","modifiers":[],"name":"_afterTokenTransfer","nameLocation":"12898:19:35","nodeType":"FunctionDefinition","parameters":{"id":4337,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4332,"mutability":"mutable","name":"from","nameLocation":"12935:4:35","nodeType":"VariableDeclaration","scope":4340,"src":"12927:12:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4331,"name":"address","nodeType":"ElementaryTypeName","src":"12927:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4334,"mutability":"mutable","name":"to","nameLocation":"12957:2:35","nodeType":"VariableDeclaration","scope":4340,"src":"12949:10:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4333,"name":"address","nodeType":"ElementaryTypeName","src":"12949:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4336,"mutability":"mutable","name":"amount","nameLocation":"12977:6:35","nodeType":"VariableDeclaration","scope":4340,"src":"12969:14:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4335,"name":"uint256","nodeType":"ElementaryTypeName","src":"12969:7:35","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12917:72:35"},"returnParameters":{"id":4338,"nodeType":"ParameterList","parameters":[],"src":"13007:0:35"},"scope":4341,"src":"12889:120:35","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":4342,"src":"1401:11610:35","usedErrors":[]}],"src":"105:12907:35"},"id":35},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","exportedSymbols":{"IERC20":[4419]},"id":4420,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4343,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"106:23:36"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20","contractDependencies":[],"contractKind":"interface","documentation":{"id":4344,"nodeType":"StructuredDocumentation","src":"131:70:36","text":" @dev Interface of the ERC20 standard as defined in the EIP."},"fullyImplemented":false,"id":4419,"linearizedBaseContracts":[4419],"name":"IERC20","nameLocation":"212:6:36","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"documentation":{"id":4345,"nodeType":"StructuredDocumentation","src":"225:158:36","text":" @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."},"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","id":4353,"name":"Transfer","nameLocation":"394:8:36","nodeType":"EventDefinition","parameters":{"id":4352,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4347,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"419:4:36","nodeType":"VariableDeclaration","scope":4353,"src":"403:20:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4346,"name":"address","nodeType":"ElementaryTypeName","src":"403:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4349,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"441:2:36","nodeType":"VariableDeclaration","scope":4353,"src":"425:18:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4348,"name":"address","nodeType":"ElementaryTypeName","src":"425:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4351,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"453:5:36","nodeType":"VariableDeclaration","scope":4353,"src":"445:13:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4350,"name":"uint256","nodeType":"ElementaryTypeName","src":"445:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"402:57:36"},"src":"388:72:36"},{"anonymous":false,"documentation":{"id":4354,"nodeType":"StructuredDocumentation","src":"466:148:36","text":" @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."},"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","id":4362,"name":"Approval","nameLocation":"625:8:36","nodeType":"EventDefinition","parameters":{"id":4361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4356,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"650:5:36","nodeType":"VariableDeclaration","scope":4362,"src":"634:21:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4355,"name":"address","nodeType":"ElementaryTypeName","src":"634:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4358,"indexed":true,"mutability":"mutable","name":"spender","nameLocation":"673:7:36","nodeType":"VariableDeclaration","scope":4362,"src":"657:23:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4357,"name":"address","nodeType":"ElementaryTypeName","src":"657:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4360,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"690:5:36","nodeType":"VariableDeclaration","scope":4362,"src":"682:13:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4359,"name":"uint256","nodeType":"ElementaryTypeName","src":"682:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"633:63:36"},"src":"619:78:36"},{"documentation":{"id":4363,"nodeType":"StructuredDocumentation","src":"703:66:36","text":" @dev Returns the amount of tokens in existence."},"functionSelector":"18160ddd","id":4368,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"783:11:36","nodeType":"FunctionDefinition","parameters":{"id":4364,"nodeType":"ParameterList","parameters":[],"src":"794:2:36"},"returnParameters":{"id":4367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4366,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4368,"src":"820:7:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4365,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"819:9:36"},"scope":4419,"src":"774:55:36","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4369,"nodeType":"StructuredDocumentation","src":"835:72:36","text":" @dev Returns the amount of tokens owned by `account`."},"functionSelector":"70a08231","id":4376,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"921:9:36","nodeType":"FunctionDefinition","parameters":{"id":4372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4371,"mutability":"mutable","name":"account","nameLocation":"939:7:36","nodeType":"VariableDeclaration","scope":4376,"src":"931:15:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4370,"name":"address","nodeType":"ElementaryTypeName","src":"931:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"930:17:36"},"returnParameters":{"id":4375,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4374,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4376,"src":"971:7:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4373,"name":"uint256","nodeType":"ElementaryTypeName","src":"971:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"970:9:36"},"scope":4419,"src":"912:68:36","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4377,"nodeType":"StructuredDocumentation","src":"986:202:36","text":" @dev Moves `amount` tokens from the caller's account to `to`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"a9059cbb","id":4386,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"1202:8:36","nodeType":"FunctionDefinition","parameters":{"id":4382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4379,"mutability":"mutable","name":"to","nameLocation":"1219:2:36","nodeType":"VariableDeclaration","scope":4386,"src":"1211:10:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4378,"name":"address","nodeType":"ElementaryTypeName","src":"1211:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4381,"mutability":"mutable","name":"amount","nameLocation":"1231:6:36","nodeType":"VariableDeclaration","scope":4386,"src":"1223:14:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4380,"name":"uint256","nodeType":"ElementaryTypeName","src":"1223:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1210:28:36"},"returnParameters":{"id":4385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4384,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4386,"src":"1257:4:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4383,"name":"bool","nodeType":"ElementaryTypeName","src":"1257:4:36","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1256:6:36"},"scope":4419,"src":"1193:70:36","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":4387,"nodeType":"StructuredDocumentation","src":"1269:264:36","text":" @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."},"functionSelector":"dd62ed3e","id":4396,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"1547:9:36","nodeType":"FunctionDefinition","parameters":{"id":4392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4389,"mutability":"mutable","name":"owner","nameLocation":"1565:5:36","nodeType":"VariableDeclaration","scope":4396,"src":"1557:13:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4388,"name":"address","nodeType":"ElementaryTypeName","src":"1557:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4391,"mutability":"mutable","name":"spender","nameLocation":"1580:7:36","nodeType":"VariableDeclaration","scope":4396,"src":"1572:15:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4390,"name":"address","nodeType":"ElementaryTypeName","src":"1572:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1556:32:36"},"returnParameters":{"id":4395,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4394,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4396,"src":"1612:7:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4393,"name":"uint256","nodeType":"ElementaryTypeName","src":"1612:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1611:9:36"},"scope":4419,"src":"1538:83:36","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4397,"nodeType":"StructuredDocumentation","src":"1627:642:36","text":" @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."},"functionSelector":"095ea7b3","id":4406,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"2283:7:36","nodeType":"FunctionDefinition","parameters":{"id":4402,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4399,"mutability":"mutable","name":"spender","nameLocation":"2299:7:36","nodeType":"VariableDeclaration","scope":4406,"src":"2291:15:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4398,"name":"address","nodeType":"ElementaryTypeName","src":"2291:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4401,"mutability":"mutable","name":"amount","nameLocation":"2316:6:36","nodeType":"VariableDeclaration","scope":4406,"src":"2308:14:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4400,"name":"uint256","nodeType":"ElementaryTypeName","src":"2308:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2290:33:36"},"returnParameters":{"id":4405,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4404,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4406,"src":"2342:4:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4403,"name":"bool","nodeType":"ElementaryTypeName","src":"2342:4:36","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2341:6:36"},"scope":4419,"src":"2274:74:36","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":4407,"nodeType":"StructuredDocumentation","src":"2354:287:36","text":" @dev Moves `amount` tokens from `from` to `to` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","id":4418,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"2655:12:36","nodeType":"FunctionDefinition","parameters":{"id":4414,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4409,"mutability":"mutable","name":"from","nameLocation":"2685:4:36","nodeType":"VariableDeclaration","scope":4418,"src":"2677:12:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4408,"name":"address","nodeType":"ElementaryTypeName","src":"2677:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4411,"mutability":"mutable","name":"to","nameLocation":"2707:2:36","nodeType":"VariableDeclaration","scope":4418,"src":"2699:10:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4410,"name":"address","nodeType":"ElementaryTypeName","src":"2699:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4413,"mutability":"mutable","name":"amount","nameLocation":"2727:6:36","nodeType":"VariableDeclaration","scope":4418,"src":"2719:14:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4412,"name":"uint256","nodeType":"ElementaryTypeName","src":"2719:7:36","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2667:72:36"},"returnParameters":{"id":4417,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4416,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4418,"src":"2758:4:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4415,"name":"bool","nodeType":"ElementaryTypeName","src":"2758:4:36","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2757:6:36"},"scope":4419,"src":"2646:118:36","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":4420,"src":"202:2564:36","usedErrors":[]}],"src":"106:2661:36"},"id":36},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","exportedSymbols":{"IERC20":[4419],"IERC20Metadata":[4444]},"id":4445,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4421,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"110:23:37"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"../IERC20.sol","id":4422,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4445,"sourceUnit":4420,"src":"135:23:37","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":4424,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"305:6:37"},"id":4425,"nodeType":"InheritanceSpecifier","src":"305:6:37"}],"canonicalName":"IERC20Metadata","contractDependencies":[],"contractKind":"interface","documentation":{"id":4423,"nodeType":"StructuredDocumentation","src":"160:116:37","text":" @dev Interface for the optional metadata functions from the ERC20 standard.\n _Available since v4.1._"},"fullyImplemented":false,"id":4444,"linearizedBaseContracts":[4444,4419],"name":"IERC20Metadata","nameLocation":"287:14:37","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":4426,"nodeType":"StructuredDocumentation","src":"318:54:37","text":" @dev Returns the name of the token."},"functionSelector":"06fdde03","id":4431,"implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"386:4:37","nodeType":"FunctionDefinition","parameters":{"id":4427,"nodeType":"ParameterList","parameters":[],"src":"390:2:37"},"returnParameters":{"id":4430,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4429,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4431,"src":"416:13:37","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4428,"name":"string","nodeType":"ElementaryTypeName","src":"416:6:37","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"415:15:37"},"scope":4444,"src":"377:54:37","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4432,"nodeType":"StructuredDocumentation","src":"437:56:37","text":" @dev Returns the symbol of the token."},"functionSelector":"95d89b41","id":4437,"implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"507:6:37","nodeType":"FunctionDefinition","parameters":{"id":4433,"nodeType":"ParameterList","parameters":[],"src":"513:2:37"},"returnParameters":{"id":4436,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4435,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4437,"src":"539:13:37","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4434,"name":"string","nodeType":"ElementaryTypeName","src":"539:6:37","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"538:15:37"},"scope":4444,"src":"498:56:37","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4438,"nodeType":"StructuredDocumentation","src":"560:65:37","text":" @dev Returns the decimals places of the token."},"functionSelector":"313ce567","id":4443,"implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"639:8:37","nodeType":"FunctionDefinition","parameters":{"id":4439,"nodeType":"ParameterList","parameters":[],"src":"647:2:37"},"returnParameters":{"id":4442,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4441,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4443,"src":"673:5:37","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":4440,"name":"uint8","nodeType":"ElementaryTypeName","src":"673:5:37","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"672:7:37"},"scope":4444,"src":"630:50:37","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":4445,"src":"277:405:37","usedErrors":[]}],"src":"110:573:37"},"id":37},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","exportedSymbols":{"IERC20Permit":[4480]},"id":4481,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4446,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"114:23:38"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Permit","contractDependencies":[],"contractKind":"interface","documentation":{"id":4447,"nodeType":"StructuredDocumentation","src":"139:480:38","text":" @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n need to send a transaction, and thus is not required to hold Ether at all."},"fullyImplemented":false,"id":4480,"linearizedBaseContracts":[4480],"name":"IERC20Permit","nameLocation":"630:12:38","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":4448,"nodeType":"StructuredDocumentation","src":"649:792:38","text":" @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n given ``owner``'s signed approval.\n IMPORTANT: The same issues {IERC20-approve} has related to transaction\n ordering also apply here.\n Emits an {Approval} event.\n Requirements:\n - `spender` cannot be the zero address.\n - `deadline` must be a timestamp in the future.\n - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n over the EIP712-formatted function arguments.\n - the signature must use ``owner``'s current nonce (see {nonces}).\n For more information on the signature format, see the\n https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n section]."},"functionSelector":"d505accf","id":4465,"implemented":false,"kind":"function","modifiers":[],"name":"permit","nameLocation":"1455:6:38","nodeType":"FunctionDefinition","parameters":{"id":4463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4450,"mutability":"mutable","name":"owner","nameLocation":"1479:5:38","nodeType":"VariableDeclaration","scope":4465,"src":"1471:13:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4449,"name":"address","nodeType":"ElementaryTypeName","src":"1471:7:38","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4452,"mutability":"mutable","name":"spender","nameLocation":"1502:7:38","nodeType":"VariableDeclaration","scope":4465,"src":"1494:15:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4451,"name":"address","nodeType":"ElementaryTypeName","src":"1494:7:38","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4454,"mutability":"mutable","name":"value","nameLocation":"1527:5:38","nodeType":"VariableDeclaration","scope":4465,"src":"1519:13:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4453,"name":"uint256","nodeType":"ElementaryTypeName","src":"1519:7:38","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4456,"mutability":"mutable","name":"deadline","nameLocation":"1550:8:38","nodeType":"VariableDeclaration","scope":4465,"src":"1542:16:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4455,"name":"uint256","nodeType":"ElementaryTypeName","src":"1542:7:38","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4458,"mutability":"mutable","name":"v","nameLocation":"1574:1:38","nodeType":"VariableDeclaration","scope":4465,"src":"1568:7:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":4457,"name":"uint8","nodeType":"ElementaryTypeName","src":"1568:5:38","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":4460,"mutability":"mutable","name":"r","nameLocation":"1593:1:38","nodeType":"VariableDeclaration","scope":4465,"src":"1585:9:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4459,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1585:7:38","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4462,"mutability":"mutable","name":"s","nameLocation":"1612:1:38","nodeType":"VariableDeclaration","scope":4465,"src":"1604:9:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4461,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1604:7:38","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1461:158:38"},"returnParameters":{"id":4464,"nodeType":"ParameterList","parameters":[],"src":"1628:0:38"},"scope":4480,"src":"1446:183:38","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":4466,"nodeType":"StructuredDocumentation","src":"1635:294:38","text":" @dev Returns the current nonce for `owner`. This value must be\n included whenever a signature is generated for {permit}.\n Every successful call to {permit} increases ``owner``'s nonce by one. This\n prevents a signature from being used multiple times."},"functionSelector":"7ecebe00","id":4473,"implemented":false,"kind":"function","modifiers":[],"name":"nonces","nameLocation":"1943:6:38","nodeType":"FunctionDefinition","parameters":{"id":4469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4468,"mutability":"mutable","name":"owner","nameLocation":"1958:5:38","nodeType":"VariableDeclaration","scope":4473,"src":"1950:13:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4467,"name":"address","nodeType":"ElementaryTypeName","src":"1950:7:38","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1949:15:38"},"returnParameters":{"id":4472,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4471,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4473,"src":"1988:7:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4470,"name":"uint256","nodeType":"ElementaryTypeName","src":"1988:7:38","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1987:9:38"},"scope":4480,"src":"1934:63:38","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":4474,"nodeType":"StructuredDocumentation","src":"2003:128:38","text":" @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"functionSelector":"3644e515","id":4479,"implemented":false,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"2198:16:38","nodeType":"FunctionDefinition","parameters":{"id":4475,"nodeType":"ParameterList","parameters":[],"src":"2214:2:38"},"returnParameters":{"id":4478,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4477,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4479,"src":"2240:7:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4476,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2240:7:38","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2239:9:38"},"scope":4480,"src":"2189:60:38","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":4481,"src":"620:1631:38","usedErrors":[]}],"src":"114:2138:38"},"id":38},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","exportedSymbols":{"Address":[5129],"IERC20":[4419],"IERC20Permit":[4480],"SafeERC20":[4761]},"id":4762,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4482,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"115:23:39"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"../IERC20.sol","id":4483,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4762,"sourceUnit":4420,"src":"140:23:39","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","file":"../extensions/draft-IERC20Permit.sol","id":4484,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4762,"sourceUnit":4481,"src":"164:46:39","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"../../../utils/Address.sol","id":4485,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4762,"sourceUnit":5130,"src":"211:36:39","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SafeERC20","contractDependencies":[],"contractKind":"library","documentation":{"id":4486,"nodeType":"StructuredDocumentation","src":"249:457:39","text":" @title SafeERC20\n @dev Wrappers around ERC20 operations that throw on failure (when the token\n contract returns false). Tokens that return no value (and instead revert or\n throw on failure) are also supported, non-reverting calls are assumed to be\n successful.\n To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n which allows you to call the safe operations as `token.safeTransfer(...)`, etc."},"fullyImplemented":true,"id":4761,"linearizedBaseContracts":[4761],"name":"SafeERC20","nameLocation":"715:9:39","nodeType":"ContractDefinition","nodes":[{"global":false,"id":4489,"libraryName":{"id":4487,"name":"Address","nodeType":"IdentifierPath","referencedDeclaration":5129,"src":"737:7:39"},"nodeType":"UsingForDirective","src":"731:26:39","typeName":{"id":4488,"name":"address","nodeType":"ElementaryTypeName","src":"749:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"body":{"id":4511,"nodeType":"Block","src":"865:103:39","statements":[{"expression":{"arguments":[{"id":4500,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4492,"src":"895:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"arguments":[{"expression":{"expression":{"id":4503,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4492,"src":"925:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":4386,"src":"925:14:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},"id":4505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"925:23:39","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":4506,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4494,"src":"950:2:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4507,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4496,"src":"954:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4501,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"902:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4502,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"902:22:39","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":4508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"902:58:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4499,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4760,"src":"875:19:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":4509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"875:86:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4510,"nodeType":"ExpressionStatement","src":"875:86:39"}]},"id":4512,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransfer","nameLocation":"772:12:39","nodeType":"FunctionDefinition","parameters":{"id":4497,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4492,"mutability":"mutable","name":"token","nameLocation":"801:5:39","nodeType":"VariableDeclaration","scope":4512,"src":"794:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4491,"nodeType":"UserDefinedTypeName","pathNode":{"id":4490,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"794:6:39"},"referencedDeclaration":4419,"src":"794:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4494,"mutability":"mutable","name":"to","nameLocation":"824:2:39","nodeType":"VariableDeclaration","scope":4512,"src":"816:10:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4493,"name":"address","nodeType":"ElementaryTypeName","src":"816:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4496,"mutability":"mutable","name":"value","nameLocation":"844:5:39","nodeType":"VariableDeclaration","scope":4512,"src":"836:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4495,"name":"uint256","nodeType":"ElementaryTypeName","src":"836:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"784:71:39"},"returnParameters":{"id":4498,"nodeType":"ParameterList","parameters":[],"src":"865:0:39"},"scope":4761,"src":"763:205:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4537,"nodeType":"Block","src":"1102:113:39","statements":[{"expression":{"arguments":[{"id":4525,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4515,"src":"1132:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"arguments":[{"expression":{"expression":{"id":4528,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4515,"src":"1162:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":4418,"src":"1162:18:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"}},"id":4530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"1162:27:39","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":4531,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4517,"src":"1191:4:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4532,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4519,"src":"1197:2:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4533,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4521,"src":"1201:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4526,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1139:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4527,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"1139:22:39","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":4534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1139:68:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4524,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4760,"src":"1112:19:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":4535,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1112:96:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4536,"nodeType":"ExpressionStatement","src":"1112:96:39"}]},"id":4538,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"983:16:39","nodeType":"FunctionDefinition","parameters":{"id":4522,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4515,"mutability":"mutable","name":"token","nameLocation":"1016:5:39","nodeType":"VariableDeclaration","scope":4538,"src":"1009:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4514,"nodeType":"UserDefinedTypeName","pathNode":{"id":4513,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1009:6:39"},"referencedDeclaration":4419,"src":"1009:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4517,"mutability":"mutable","name":"from","nameLocation":"1039:4:39","nodeType":"VariableDeclaration","scope":4538,"src":"1031:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4516,"name":"address","nodeType":"ElementaryTypeName","src":"1031:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4519,"mutability":"mutable","name":"to","nameLocation":"1061:2:39","nodeType":"VariableDeclaration","scope":4538,"src":"1053:10:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4518,"name":"address","nodeType":"ElementaryTypeName","src":"1053:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4521,"mutability":"mutable","name":"value","nameLocation":"1081:5:39","nodeType":"VariableDeclaration","scope":4538,"src":"1073:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4520,"name":"uint256","nodeType":"ElementaryTypeName","src":"1073:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"999:93:39"},"returnParameters":{"id":4523,"nodeType":"ParameterList","parameters":[],"src":"1102:0:39"},"scope":4761,"src":"974:241:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4581,"nodeType":"Block","src":"1581:497:39","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4552,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4550,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4546,"src":"1830:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4551,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1839:1:39","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1830:10:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":4553,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1829:12:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":4558,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1870:4:39","typeDescriptions":{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}],"id":4557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1862:7:39","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4556,"name":"address","nodeType":"ElementaryTypeName","src":"1862:7:39","typeDescriptions":{}}},"id":4559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1862:13:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4560,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4544,"src":"1877:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":4554,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4542,"src":"1846:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":4396,"src":"1846:15:39","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view external returns (uint256)"}},"id":4561,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1846:39:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1889:1:39","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1846:44:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":4564,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1845:46:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1829:62:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365","id":4566,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1905:56:39","typeDescriptions":{"typeIdentifier":"t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25","typeString":"literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""},"value":"SafeERC20: approve from non-zero to non-zero allowance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25","typeString":"literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""}],"id":4549,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1808:7:39","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4567,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1808:163:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4568,"nodeType":"ExpressionStatement","src":"1808:163:39"},{"expression":{"arguments":[{"id":4570,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4542,"src":"2001:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"arguments":[{"expression":{"expression":{"id":4573,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4542,"src":"2031:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4574,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":4406,"src":"2031:13:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},"id":4575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"2031:22:39","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":4576,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4544,"src":"2055:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4577,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4546,"src":"2064:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4571,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2008:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4572,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"2008:22:39","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":4578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2008:62:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4569,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4760,"src":"1981:19:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":4579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1981:90:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4580,"nodeType":"ExpressionStatement","src":"1981:90:39"}]},"documentation":{"id":4539,"nodeType":"StructuredDocumentation","src":"1221:249:39","text":" @dev Deprecated. This function has issues similar to the ones found in\n {IERC20-approve}, and its usage is discouraged.\n Whenever possible, use {safeIncreaseAllowance} and\n {safeDecreaseAllowance} instead."},"id":4582,"implemented":true,"kind":"function","modifiers":[],"name":"safeApprove","nameLocation":"1484:11:39","nodeType":"FunctionDefinition","parameters":{"id":4547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4542,"mutability":"mutable","name":"token","nameLocation":"1512:5:39","nodeType":"VariableDeclaration","scope":4582,"src":"1505:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4541,"nodeType":"UserDefinedTypeName","pathNode":{"id":4540,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1505:6:39"},"referencedDeclaration":4419,"src":"1505:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4544,"mutability":"mutable","name":"spender","nameLocation":"1535:7:39","nodeType":"VariableDeclaration","scope":4582,"src":"1527:15:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4543,"name":"address","nodeType":"ElementaryTypeName","src":"1527:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4546,"mutability":"mutable","name":"value","nameLocation":"1560:5:39","nodeType":"VariableDeclaration","scope":4582,"src":"1552:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4545,"name":"uint256","nodeType":"ElementaryTypeName","src":"1552:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1495:76:39"},"returnParameters":{"id":4548,"nodeType":"ParameterList","parameters":[],"src":"1581:0:39"},"scope":4761,"src":"1475:603:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4617,"nodeType":"Block","src":"2200:194:39","statements":[{"assignments":[4593],"declarations":[{"constant":false,"id":4593,"mutability":"mutable","name":"newAllowance","nameLocation":"2218:12:39","nodeType":"VariableDeclaration","scope":4617,"src":"2210:20:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4592,"name":"uint256","nodeType":"ElementaryTypeName","src":"2210:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4604,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":4598,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2257:4:39","typeDescriptions":{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}],"id":4597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2249:7:39","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4596,"name":"address","nodeType":"ElementaryTypeName","src":"2249:7:39","typeDescriptions":{}}},"id":4599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2249:13:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4600,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4587,"src":"2264:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":4594,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4585,"src":"2233:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":4396,"src":"2233:15:39","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view external returns (uint256)"}},"id":4601,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2233:39:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":4602,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4589,"src":"2275:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2233:47:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2210:70:39"},{"expression":{"arguments":[{"id":4606,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4585,"src":"2310:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"arguments":[{"expression":{"expression":{"id":4609,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4585,"src":"2340:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":4406,"src":"2340:13:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},"id":4611,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"2340:22:39","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":4612,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4587,"src":"2364:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4613,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4593,"src":"2373:12:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4607,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2317:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4608,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"2317:22:39","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":4614,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2317:69:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4605,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4760,"src":"2290:19:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":4615,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2290:97:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4616,"nodeType":"ExpressionStatement","src":"2290:97:39"}]},"id":4618,"implemented":true,"kind":"function","modifiers":[],"name":"safeIncreaseAllowance","nameLocation":"2093:21:39","nodeType":"FunctionDefinition","parameters":{"id":4590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4585,"mutability":"mutable","name":"token","nameLocation":"2131:5:39","nodeType":"VariableDeclaration","scope":4618,"src":"2124:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4584,"nodeType":"UserDefinedTypeName","pathNode":{"id":4583,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2124:6:39"},"referencedDeclaration":4419,"src":"2124:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4587,"mutability":"mutable","name":"spender","nameLocation":"2154:7:39","nodeType":"VariableDeclaration","scope":4618,"src":"2146:15:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4586,"name":"address","nodeType":"ElementaryTypeName","src":"2146:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4589,"mutability":"mutable","name":"value","nameLocation":"2179:5:39","nodeType":"VariableDeclaration","scope":4618,"src":"2171:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4588,"name":"uint256","nodeType":"ElementaryTypeName","src":"2171:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2114:76:39"},"returnParameters":{"id":4591,"nodeType":"ParameterList","parameters":[],"src":"2200:0:39"},"scope":4761,"src":"2084:310:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4665,"nodeType":"Block","src":"2516:370:39","statements":[{"id":4664,"nodeType":"UncheckedBlock","src":"2526:354:39","statements":[{"assignments":[4629],"declarations":[{"constant":false,"id":4629,"mutability":"mutable","name":"oldAllowance","nameLocation":"2558:12:39","nodeType":"VariableDeclaration","scope":4664,"src":"2550:20:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4628,"name":"uint256","nodeType":"ElementaryTypeName","src":"2550:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4638,"initialValue":{"arguments":[{"arguments":[{"id":4634,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2597:4:39","typeDescriptions":{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeERC20_$4761","typeString":"library SafeERC20"}],"id":4633,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2589:7:39","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4632,"name":"address","nodeType":"ElementaryTypeName","src":"2589:7:39","typeDescriptions":{}}},"id":4635,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2589:13:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4636,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4623,"src":"2604:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":4630,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4621,"src":"2573:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":4396,"src":"2573:15:39","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view external returns (uint256)"}},"id":4637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2573:39:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2550:62:39"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4642,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4640,"name":"oldAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4629,"src":"2634:12:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4641,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4625,"src":"2650:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2634:21:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5361666545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f","id":4643,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2657:43:39","typeDescriptions":{"typeIdentifier":"t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a","typeString":"literal_string \"SafeERC20: decreased allowance below zero\""},"value":"SafeERC20: decreased allowance below zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a","typeString":"literal_string \"SafeERC20: decreased allowance below zero\""}],"id":4639,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2626:7:39","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2626:75:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4645,"nodeType":"ExpressionStatement","src":"2626:75:39"},{"assignments":[4647],"declarations":[{"constant":false,"id":4647,"mutability":"mutable","name":"newAllowance","nameLocation":"2723:12:39","nodeType":"VariableDeclaration","scope":4664,"src":"2715:20:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4646,"name":"uint256","nodeType":"ElementaryTypeName","src":"2715:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4651,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4648,"name":"oldAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4629,"src":"2738:12:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4649,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4625,"src":"2753:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2738:20:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2715:43:39"},{"expression":{"arguments":[{"id":4653,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4621,"src":"2792:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"arguments":[{"expression":{"expression":{"id":4656,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4621,"src":"2822:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":4657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":4406,"src":"2822:13:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},"id":4658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"2822:22:39","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":4659,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4623,"src":"2846:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4660,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4647,"src":"2855:12:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4654,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2799:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4655,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"2799:22:39","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":4661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2799:69:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4652,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4760,"src":"2772:19:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":4662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2772:97:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4663,"nodeType":"ExpressionStatement","src":"2772:97:39"}]}]},"id":4666,"implemented":true,"kind":"function","modifiers":[],"name":"safeDecreaseAllowance","nameLocation":"2409:21:39","nodeType":"FunctionDefinition","parameters":{"id":4626,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4621,"mutability":"mutable","name":"token","nameLocation":"2447:5:39","nodeType":"VariableDeclaration","scope":4666,"src":"2440:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4620,"nodeType":"UserDefinedTypeName","pathNode":{"id":4619,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2440:6:39"},"referencedDeclaration":4419,"src":"2440:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4623,"mutability":"mutable","name":"spender","nameLocation":"2470:7:39","nodeType":"VariableDeclaration","scope":4666,"src":"2462:15:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4622,"name":"address","nodeType":"ElementaryTypeName","src":"2462:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4625,"mutability":"mutable","name":"value","nameLocation":"2495:5:39","nodeType":"VariableDeclaration","scope":4666,"src":"2487:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4624,"name":"uint256","nodeType":"ElementaryTypeName","src":"2487:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2430:76:39"},"returnParameters":{"id":4627,"nodeType":"ParameterList","parameters":[],"src":"2516:0:39"},"scope":4761,"src":"2400:486:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4721,"nodeType":"Block","src":"3107:257:39","statements":[{"assignments":[4687],"declarations":[{"constant":false,"id":4687,"mutability":"mutable","name":"nonceBefore","nameLocation":"3125:11:39","nodeType":"VariableDeclaration","scope":4721,"src":"3117:19:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4686,"name":"uint256","nodeType":"ElementaryTypeName","src":"3117:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4692,"initialValue":{"arguments":[{"id":4690,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4671,"src":"3152:5:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":4688,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4669,"src":"3139:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Permit_$4480","typeString":"contract IERC20Permit"}},"id":4689,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonces","nodeType":"MemberAccess","referencedDeclaration":4473,"src":"3139:12:39","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":4691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3139:19:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3117:41:39"},{"expression":{"arguments":[{"id":4696,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4671,"src":"3181:5:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4697,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4673,"src":"3188:7:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4698,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4675,"src":"3197:5:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4699,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4677,"src":"3204:8:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4700,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4679,"src":"3214:1:39","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":4701,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4681,"src":"3217:1:39","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":4702,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4683,"src":"3220:1:39","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":4693,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4669,"src":"3168:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Permit_$4480","typeString":"contract IERC20Permit"}},"id":4695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"permit","nodeType":"MemberAccess","referencedDeclaration":4465,"src":"3168:12:39","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$","typeString":"function (address,address,uint256,uint256,uint8,bytes32,bytes32) external"}},"id":4703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3168:54:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4704,"nodeType":"ExpressionStatement","src":"3168:54:39"},{"assignments":[4706],"declarations":[{"constant":false,"id":4706,"mutability":"mutable","name":"nonceAfter","nameLocation":"3240:10:39","nodeType":"VariableDeclaration","scope":4721,"src":"3232:18:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4705,"name":"uint256","nodeType":"ElementaryTypeName","src":"3232:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4711,"initialValue":{"arguments":[{"id":4709,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4671,"src":"3266:5:39","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":4707,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4669,"src":"3253:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Permit_$4480","typeString":"contract IERC20Permit"}},"id":4708,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonces","nodeType":"MemberAccess","referencedDeclaration":4473,"src":"3253:12:39","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":4710,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3253:19:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3232:40:39"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4713,"name":"nonceAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4706,"src":"3290:10:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4716,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4714,"name":"nonceBefore","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4687,"src":"3304:11:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":4715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3318:1:39","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3304:15:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3290:29:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5361666545524332303a207065726d697420646964206e6f742073756363656564","id":4718,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3321:35:39","typeDescriptions":{"typeIdentifier":"t_stringliteral_cde8e927812a7a656f8f04e89ac4f4113d47940dd2125d11fcb8e0bd36bfc59d","typeString":"literal_string \"SafeERC20: permit did not succeed\""},"value":"SafeERC20: permit did not succeed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_cde8e927812a7a656f8f04e89ac4f4113d47940dd2125d11fcb8e0bd36bfc59d","typeString":"literal_string \"SafeERC20: permit did not succeed\""}],"id":4712,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3282:7:39","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3282:75:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4720,"nodeType":"ExpressionStatement","src":"3282:75:39"}]},"id":4722,"implemented":true,"kind":"function","modifiers":[],"name":"safePermit","nameLocation":"2901:10:39","nodeType":"FunctionDefinition","parameters":{"id":4684,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4669,"mutability":"mutable","name":"token","nameLocation":"2934:5:39","nodeType":"VariableDeclaration","scope":4722,"src":"2921:18:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Permit_$4480","typeString":"contract IERC20Permit"},"typeName":{"id":4668,"nodeType":"UserDefinedTypeName","pathNode":{"id":4667,"name":"IERC20Permit","nodeType":"IdentifierPath","referencedDeclaration":4480,"src":"2921:12:39"},"referencedDeclaration":4480,"src":"2921:12:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Permit_$4480","typeString":"contract IERC20Permit"}},"visibility":"internal"},{"constant":false,"id":4671,"mutability":"mutable","name":"owner","nameLocation":"2957:5:39","nodeType":"VariableDeclaration","scope":4722,"src":"2949:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4670,"name":"address","nodeType":"ElementaryTypeName","src":"2949:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4673,"mutability":"mutable","name":"spender","nameLocation":"2980:7:39","nodeType":"VariableDeclaration","scope":4722,"src":"2972:15:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4672,"name":"address","nodeType":"ElementaryTypeName","src":"2972:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4675,"mutability":"mutable","name":"value","nameLocation":"3005:5:39","nodeType":"VariableDeclaration","scope":4722,"src":"2997:13:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4674,"name":"uint256","nodeType":"ElementaryTypeName","src":"2997:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4677,"mutability":"mutable","name":"deadline","nameLocation":"3028:8:39","nodeType":"VariableDeclaration","scope":4722,"src":"3020:16:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4676,"name":"uint256","nodeType":"ElementaryTypeName","src":"3020:7:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4679,"mutability":"mutable","name":"v","nameLocation":"3052:1:39","nodeType":"VariableDeclaration","scope":4722,"src":"3046:7:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":4678,"name":"uint8","nodeType":"ElementaryTypeName","src":"3046:5:39","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":4681,"mutability":"mutable","name":"r","nameLocation":"3071:1:39","nodeType":"VariableDeclaration","scope":4722,"src":"3063:9:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4680,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3063:7:39","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4683,"mutability":"mutable","name":"s","nameLocation":"3090:1:39","nodeType":"VariableDeclaration","scope":4722,"src":"3082:9:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4682,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3082:7:39","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2911:186:39"},"returnParameters":{"id":4685,"nodeType":"ParameterList","parameters":[],"src":"3107:0:39"},"scope":4761,"src":"2892:472:39","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4759,"nodeType":"Block","src":"3817:636:39","statements":[{"assignments":[4732],"declarations":[{"constant":false,"id":4732,"mutability":"mutable","name":"returndata","nameLocation":"4179:10:39","nodeType":"VariableDeclaration","scope":4759,"src":"4166:23:39","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4731,"name":"bytes","nodeType":"ElementaryTypeName","src":"4166:5:39","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":4741,"initialValue":{"arguments":[{"id":4738,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4728,"src":"4220:4:39","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564","id":4739,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4226:34:39","typeDescriptions":{"typeIdentifier":"t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b","typeString":"literal_string \"SafeERC20: low-level call failed\""},"value":"SafeERC20: low-level call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b","typeString":"literal_string \"SafeERC20: low-level call failed\""}],"expression":{"arguments":[{"id":4735,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4726,"src":"4200:5:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}],"id":4734,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4192:7:39","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4733,"name":"address","nodeType":"ElementaryTypeName","src":"4192:7:39","typeDescriptions":{}}},"id":4736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4192:14:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4737,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"functionCall","nodeType":"MemberAccess","referencedDeclaration":4889,"src":"4192:27:39","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$bound_to$_t_address_$","typeString":"function (address,bytes memory,string memory) returns (bytes memory)"}},"id":4740,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4192:69:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"4166:95:39"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4742,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4732,"src":"4275:10:39","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4275:17:39","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4744,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4295:1:39","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4275:21:39","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4758,"nodeType":"IfStatement","src":"4271:176:39","trueBody":{"id":4757,"nodeType":"Block","src":"4298:149:39","statements":[{"expression":{"arguments":[{"arguments":[{"id":4749,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4732,"src":"4370:10:39","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":4751,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4383:4:39","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":4750,"name":"bool","nodeType":"ElementaryTypeName","src":"4383:4:39","typeDescriptions":{}}}],"id":4752,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4382:6:39","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}],"expression":{"id":4747,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4359:3:39","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":4748,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"4359:10:39","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":4753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4359:30:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564","id":4754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4391:44:39","typeDescriptions":{"typeIdentifier":"t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd","typeString":"literal_string \"SafeERC20: ERC20 operation did not succeed\""},"value":"SafeERC20: ERC20 operation did not succeed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd","typeString":"literal_string \"SafeERC20: ERC20 operation did not succeed\""}],"id":4746,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4351:7:39","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4351:85:39","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4756,"nodeType":"ExpressionStatement","src":"4351:85:39"}]}}]},"documentation":{"id":4723,"nodeType":"StructuredDocumentation","src":"3370:372:39","text":" @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n on the return value: the return value is optional (but if data is returned, it must not be false).\n @param token The token targeted by the call.\n @param data The call data (encoded using abi.encode or one of its variants)."},"id":4760,"implemented":true,"kind":"function","modifiers":[],"name":"_callOptionalReturn","nameLocation":"3756:19:39","nodeType":"FunctionDefinition","parameters":{"id":4729,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4726,"mutability":"mutable","name":"token","nameLocation":"3783:5:39","nodeType":"VariableDeclaration","scope":4760,"src":"3776:12:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":4725,"nodeType":"UserDefinedTypeName","pathNode":{"id":4724,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"3776:6:39"},"referencedDeclaration":4419,"src":"3776:6:39","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":4728,"mutability":"mutable","name":"data","nameLocation":"3803:4:39","nodeType":"VariableDeclaration","scope":4760,"src":"3790:17:39","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4727,"name":"bytes","nodeType":"ElementaryTypeName","src":"3790:5:39","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3775:33:39"},"returnParameters":{"id":4730,"nodeType":"ParameterList","parameters":[],"src":"3817:0:39"},"scope":4761,"src":"3747:706:39","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":4762,"src":"707:3748:39","usedErrors":[]}],"src":"115:4341:39"},"id":39},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","exportedSymbols":{"IERC721Receiver":[4779]},"id":4780,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4763,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"116:23:40"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":4764,"nodeType":"StructuredDocumentation","src":"141:152:40","text":" @title ERC721 token receiver interface\n @dev Interface for any contract that wants to support safeTransfers\n from ERC721 asset contracts."},"fullyImplemented":false,"id":4779,"linearizedBaseContracts":[4779],"name":"IERC721Receiver","nameLocation":"304:15:40","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":4765,"nodeType":"StructuredDocumentation","src":"326:493:40","text":" @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n by `operator` from `from`, this function is called.\n It must return its Solidity selector to confirm the token transfer.\n If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`."},"functionSelector":"150b7a02","id":4778,"implemented":false,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"833:16:40","nodeType":"FunctionDefinition","parameters":{"id":4774,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4767,"mutability":"mutable","name":"operator","nameLocation":"867:8:40","nodeType":"VariableDeclaration","scope":4778,"src":"859:16:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4766,"name":"address","nodeType":"ElementaryTypeName","src":"859:7:40","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4769,"mutability":"mutable","name":"from","nameLocation":"893:4:40","nodeType":"VariableDeclaration","scope":4778,"src":"885:12:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4768,"name":"address","nodeType":"ElementaryTypeName","src":"885:7:40","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4771,"mutability":"mutable","name":"tokenId","nameLocation":"915:7:40","nodeType":"VariableDeclaration","scope":4778,"src":"907:15:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4770,"name":"uint256","nodeType":"ElementaryTypeName","src":"907:7:40","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4773,"mutability":"mutable","name":"data","nameLocation":"947:4:40","nodeType":"VariableDeclaration","scope":4778,"src":"932:19:40","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":4772,"name":"bytes","nodeType":"ElementaryTypeName","src":"932:5:40","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"849:108:40"},"returnParameters":{"id":4777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4776,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4778,"src":"976:6:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":4775,"name":"bytes4","nodeType":"ElementaryTypeName","src":"976:6:40","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"975:8:40"},"scope":4779,"src":"824:160:40","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":4780,"src":"294:692:40","usedErrors":[]}],"src":"116:871:40"},"id":40},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","exportedSymbols":{"IERC777Recipient":[4799]},"id":4800,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4781,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"102:23:41"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC777Recipient","contractDependencies":[],"contractKind":"interface","documentation":{"id":4782,"nodeType":"StructuredDocumentation","src":"127:406:41","text":" @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\n Accounts can be notified of {IERC777} tokens being sent to them by having a\n contract implement this interface (contract holders can be their own\n implementer) and registering it on the\n https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\n See {IERC1820Registry} and {ERC1820Implementer}."},"fullyImplemented":false,"id":4799,"linearizedBaseContracts":[4799],"name":"IERC777Recipient","nameLocation":"544:16:41","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":4783,"nodeType":"StructuredDocumentation","src":"567:474:41","text":" @dev Called by an {IERC777} token contract whenever tokens are being\n moved or created into a registered account (`to`). The type of operation\n is conveyed by `from` being the zero address or not.\n This call occurs _after_ the token contract's state is updated, so\n {IERC777-balanceOf}, etc., can be used to query the post-operation state.\n This function may revert to prevent the operation from being executed."},"functionSelector":"0023de29","id":4798,"implemented":false,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"1055:14:41","nodeType":"FunctionDefinition","parameters":{"id":4796,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4785,"mutability":"mutable","name":"operator","nameLocation":"1087:8:41","nodeType":"VariableDeclaration","scope":4798,"src":"1079:16:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4784,"name":"address","nodeType":"ElementaryTypeName","src":"1079:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4787,"mutability":"mutable","name":"from","nameLocation":"1113:4:41","nodeType":"VariableDeclaration","scope":4798,"src":"1105:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4786,"name":"address","nodeType":"ElementaryTypeName","src":"1105:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4789,"mutability":"mutable","name":"to","nameLocation":"1135:2:41","nodeType":"VariableDeclaration","scope":4798,"src":"1127:10:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4788,"name":"address","nodeType":"ElementaryTypeName","src":"1127:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4791,"mutability":"mutable","name":"amount","nameLocation":"1155:6:41","nodeType":"VariableDeclaration","scope":4798,"src":"1147:14:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4790,"name":"uint256","nodeType":"ElementaryTypeName","src":"1147:7:41","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4793,"mutability":"mutable","name":"userData","nameLocation":"1186:8:41","nodeType":"VariableDeclaration","scope":4798,"src":"1171:23:41","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":4792,"name":"bytes","nodeType":"ElementaryTypeName","src":"1171:5:41","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":4795,"mutability":"mutable","name":"operatorData","nameLocation":"1219:12:41","nodeType":"VariableDeclaration","scope":4798,"src":"1204:27:41","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":4794,"name":"bytes","nodeType":"ElementaryTypeName","src":"1204:5:41","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1069:168:41"},"returnParameters":{"id":4797,"nodeType":"ParameterList","parameters":[],"src":"1246:0:41"},"scope":4799,"src":"1046:201:41","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":4800,"src":"534:715:41","usedErrors":[]}],"src":"102:1148:41"},"id":41},"@openzeppelin/contracts/utils/Address.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","exportedSymbols":{"Address":[5129]},"id":5130,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4801,"literals":["solidity","^","0.8",".1"],"nodeType":"PragmaDirective","src":"101:23:42"},{"abstract":false,"baseContracts":[],"canonicalName":"Address","contractDependencies":[],"contractKind":"library","documentation":{"id":4802,"nodeType":"StructuredDocumentation","src":"126:67:42","text":" @dev Collection of functions related to the address type"},"fullyImplemented":true,"id":5129,"linearizedBaseContracts":[5129],"name":"Address","nameLocation":"202:7:42","nodeType":"ContractDefinition","nodes":[{"body":{"id":4816,"nodeType":"Block","src":"1241:254:42","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":4810,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4805,"src":"1465:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"1465:12:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1465:19:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4813,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1487:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1465:23:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":4809,"id":4815,"nodeType":"Return","src":"1458:30:42"}]},"documentation":{"id":4803,"nodeType":"StructuredDocumentation","src":"216:954:42","text":" @dev Returns true if `account` is a contract.\n [IMPORTANT]\n ====\n It is unsafe to assume that an address for which this function returns\n false is an externally-owned account (EOA) and not a contract.\n Among others, `isContract` will return false for the following\n types of addresses:\n - an externally-owned account\n - a contract in construction\n - an address where a contract will be created\n - an address where a contract lived, but was destroyed\n ====\n [IMPORTANT]\n ====\n You shouldn't rely on `isContract` to protect against flash loan attacks!\n Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n constructor.\n ===="},"id":4817,"implemented":true,"kind":"function","modifiers":[],"name":"isContract","nameLocation":"1184:10:42","nodeType":"FunctionDefinition","parameters":{"id":4806,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4805,"mutability":"mutable","name":"account","nameLocation":"1203:7:42","nodeType":"VariableDeclaration","scope":4817,"src":"1195:15:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4804,"name":"address","nodeType":"ElementaryTypeName","src":"1195:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1194:17:42"},"returnParameters":{"id":4809,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4808,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4817,"src":"1235:4:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4807,"name":"bool","nodeType":"ElementaryTypeName","src":"1235:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1234:6:42"},"scope":5129,"src":"1175:320:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":4850,"nodeType":"Block","src":"2483:241:42","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":4828,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2509:4:42","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$5129","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$5129","typeString":"library Address"}],"id":4827,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2501:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4826,"name":"address","nodeType":"ElementaryTypeName","src":"2501:7:42","typeDescriptions":{}}},"id":4829,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2501:13:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balance","nodeType":"MemberAccess","src":"2501:21:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4831,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4822,"src":"2526:6:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2501:31:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e6365","id":4833,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2534:31:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9","typeString":"literal_string \"Address: insufficient balance\""},"value":"Address: insufficient balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9","typeString":"literal_string \"Address: insufficient balance\""}],"id":4825,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2493:7:42","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4834,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2493:73:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4835,"nodeType":"ExpressionStatement","src":"2493:73:42"},{"assignments":[4837,null],"declarations":[{"constant":false,"id":4837,"mutability":"mutable","name":"success","nameLocation":"2583:7:42","nodeType":"VariableDeclaration","scope":4850,"src":"2578:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4836,"name":"bool","nodeType":"ElementaryTypeName","src":"2578:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":4844,"initialValue":{"arguments":[{"hexValue":"","id":4842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2626:2:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":4838,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4820,"src":"2596:9:42","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":4839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"2596:14:42","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":4841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":4840,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4822,"src":"2618:6:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2596:29:42","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":4843,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2596:33:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"2577:52:42"},{"expression":{"arguments":[{"id":4846,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4837,"src":"2647:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564","id":4847,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2656:60:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae","typeString":"literal_string \"Address: unable to send value, recipient may have reverted\""},"value":"Address: unable to send value, recipient may have reverted"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae","typeString":"literal_string \"Address: unable to send value, recipient may have reverted\""}],"id":4845,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2639:7:42","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4848,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2639:78:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4849,"nodeType":"ExpressionStatement","src":"2639:78:42"}]},"documentation":{"id":4818,"nodeType":"StructuredDocumentation","src":"1501:906:42","text":" @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\n https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n of certain opcodes, possibly making contracts go over the 2300 gas limit\n imposed by `transfer`, making them unable to receive funds via\n `transfer`. {sendValue} removes this limitation.\n https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n IMPORTANT: because control is transferred to `recipient`, care must be\n taken to not create reentrancy vulnerabilities. Consider using\n {ReentrancyGuard} or the\n https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]."},"id":4851,"implemented":true,"kind":"function","modifiers":[],"name":"sendValue","nameLocation":"2421:9:42","nodeType":"FunctionDefinition","parameters":{"id":4823,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4820,"mutability":"mutable","name":"recipient","nameLocation":"2447:9:42","nodeType":"VariableDeclaration","scope":4851,"src":"2431:25:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":4819,"name":"address","nodeType":"ElementaryTypeName","src":"2431:15:42","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":4822,"mutability":"mutable","name":"amount","nameLocation":"2466:6:42","nodeType":"VariableDeclaration","scope":4851,"src":"2458:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4821,"name":"uint256","nodeType":"ElementaryTypeName","src":"2458:7:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2430:43:42"},"returnParameters":{"id":4824,"nodeType":"ParameterList","parameters":[],"src":"2483:0:42"},"scope":5129,"src":"2412:312:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4868,"nodeType":"Block","src":"3555:96:42","statements":[{"expression":{"arguments":[{"id":4862,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4854,"src":"3594:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4863,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4856,"src":"3602:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":4864,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3608:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564","id":4865,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3611:32:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df","typeString":"literal_string \"Address: low-level call failed\""},"value":"Address: low-level call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df","typeString":"literal_string \"Address: low-level call failed\""}],"id":4861,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[4909,4953],"referencedDeclaration":4953,"src":"3572:21:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":4866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3572:72:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4860,"id":4867,"nodeType":"Return","src":"3565:79:42"}]},"documentation":{"id":4852,"nodeType":"StructuredDocumentation","src":"2730:731:42","text":" @dev Performs a Solidity function call using a low level `call`. A\n plain `call` is an unsafe replacement for a function call: use this\n function instead.\n If `target` reverts with a revert reason, it is bubbled up by this\n function (like regular Solidity function calls).\n Returns the raw returned data. To convert to the expected return value,\n use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert.\n _Available since v3.1._"},"id":4869,"implemented":true,"kind":"function","modifiers":[],"name":"functionCall","nameLocation":"3475:12:42","nodeType":"FunctionDefinition","parameters":{"id":4857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4854,"mutability":"mutable","name":"target","nameLocation":"3496:6:42","nodeType":"VariableDeclaration","scope":4869,"src":"3488:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4853,"name":"address","nodeType":"ElementaryTypeName","src":"3488:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4856,"mutability":"mutable","name":"data","nameLocation":"3517:4:42","nodeType":"VariableDeclaration","scope":4869,"src":"3504:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4855,"name":"bytes","nodeType":"ElementaryTypeName","src":"3504:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3487:35:42"},"returnParameters":{"id":4860,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4859,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4869,"src":"3541:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4858,"name":"bytes","nodeType":"ElementaryTypeName","src":"3541:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3540:14:42"},"scope":5129,"src":"3466:185:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4888,"nodeType":"Block","src":"4020:76:42","statements":[{"expression":{"arguments":[{"id":4882,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4872,"src":"4059:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4883,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4874,"src":"4067:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":4884,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4073:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":4885,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4876,"src":"4076:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4881,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[4909,4953],"referencedDeclaration":4953,"src":"4037:21:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":4886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4037:52:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4880,"id":4887,"nodeType":"Return","src":"4030:59:42"}]},"documentation":{"id":4870,"nodeType":"StructuredDocumentation","src":"3657:211:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"},"id":4889,"implemented":true,"kind":"function","modifiers":[],"name":"functionCall","nameLocation":"3882:12:42","nodeType":"FunctionDefinition","parameters":{"id":4877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4872,"mutability":"mutable","name":"target","nameLocation":"3912:6:42","nodeType":"VariableDeclaration","scope":4889,"src":"3904:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4871,"name":"address","nodeType":"ElementaryTypeName","src":"3904:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4874,"mutability":"mutable","name":"data","nameLocation":"3941:4:42","nodeType":"VariableDeclaration","scope":4889,"src":"3928:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4873,"name":"bytes","nodeType":"ElementaryTypeName","src":"3928:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":4876,"mutability":"mutable","name":"errorMessage","nameLocation":"3969:12:42","nodeType":"VariableDeclaration","scope":4889,"src":"3955:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4875,"name":"string","nodeType":"ElementaryTypeName","src":"3955:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3894:93:42"},"returnParameters":{"id":4880,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4879,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4889,"src":"4006:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4878,"name":"bytes","nodeType":"ElementaryTypeName","src":"4006:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4005:14:42"},"scope":5129,"src":"3873:223:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4908,"nodeType":"Block","src":"4601:111:42","statements":[{"expression":{"arguments":[{"id":4902,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4892,"src":"4640:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4903,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4894,"src":"4648:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":4904,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4896,"src":"4654:5:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564","id":4905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4661:43:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc","typeString":"literal_string \"Address: low-level call with value failed\""},"value":"Address: low-level call with value failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc","typeString":"literal_string \"Address: low-level call with value failed\""}],"id":4901,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[4909,4953],"referencedDeclaration":4953,"src":"4618:21:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256,string memory) returns (bytes memory)"}},"id":4906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4618:87:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4900,"id":4907,"nodeType":"Return","src":"4611:94:42"}]},"documentation":{"id":4890,"nodeType":"StructuredDocumentation","src":"4102:351:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`.\n _Available since v3.1._"},"id":4909,"implemented":true,"kind":"function","modifiers":[],"name":"functionCallWithValue","nameLocation":"4467:21:42","nodeType":"FunctionDefinition","parameters":{"id":4897,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4892,"mutability":"mutable","name":"target","nameLocation":"4506:6:42","nodeType":"VariableDeclaration","scope":4909,"src":"4498:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4891,"name":"address","nodeType":"ElementaryTypeName","src":"4498:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4894,"mutability":"mutable","name":"data","nameLocation":"4535:4:42","nodeType":"VariableDeclaration","scope":4909,"src":"4522:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4893,"name":"bytes","nodeType":"ElementaryTypeName","src":"4522:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":4896,"mutability":"mutable","name":"value","nameLocation":"4557:5:42","nodeType":"VariableDeclaration","scope":4909,"src":"4549:13:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4895,"name":"uint256","nodeType":"ElementaryTypeName","src":"4549:7:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4488:80:42"},"returnParameters":{"id":4900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4899,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4909,"src":"4587:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4898,"name":"bytes","nodeType":"ElementaryTypeName","src":"4587:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4586:14:42"},"scope":5129,"src":"4458:254:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4952,"nodeType":"Block","src":"5139:267:42","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":4926,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5165:4:42","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$5129","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$5129","typeString":"library Address"}],"id":4925,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5157:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4924,"name":"address","nodeType":"ElementaryTypeName","src":"5157:7:42","typeDescriptions":{}}},"id":4927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5157:13:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4928,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balance","nodeType":"MemberAccess","src":"5157:21:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4929,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4916,"src":"5182:5:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5157:30:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c","id":4931,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5189:40:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c","typeString":"literal_string \"Address: insufficient balance for call\""},"value":"Address: insufficient balance for call"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c","typeString":"literal_string \"Address: insufficient balance for call\""}],"id":4923,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5149:7:42","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5149:81:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4933,"nodeType":"ExpressionStatement","src":"5149:81:42"},{"assignments":[4935,4937],"declarations":[{"constant":false,"id":4935,"mutability":"mutable","name":"success","nameLocation":"5246:7:42","nodeType":"VariableDeclaration","scope":4952,"src":"5241:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4934,"name":"bool","nodeType":"ElementaryTypeName","src":"5241:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4937,"mutability":"mutable","name":"returndata","nameLocation":"5268:10:42","nodeType":"VariableDeclaration","scope":4952,"src":"5255:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4936,"name":"bytes","nodeType":"ElementaryTypeName","src":"5255:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":4944,"initialValue":{"arguments":[{"id":4942,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4914,"src":"5308:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":4938,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4912,"src":"5282:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"5282:11:42","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":4941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":4940,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4916,"src":"5301:5:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"5282:25:42","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":4943,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5282:31:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"5240:73:42"},{"expression":{"arguments":[{"id":4946,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4912,"src":"5357:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4947,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4935,"src":"5365:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4948,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4937,"src":"5374:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":4949,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4918,"src":"5386:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4945,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5084,"src":"5330:26:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":4950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5330:69:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4922,"id":4951,"nodeType":"Return","src":"5323:76:42"}]},"documentation":{"id":4910,"nodeType":"StructuredDocumentation","src":"4718:237:42","text":" @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n with `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"},"id":4953,"implemented":true,"kind":"function","modifiers":[],"name":"functionCallWithValue","nameLocation":"4969:21:42","nodeType":"FunctionDefinition","parameters":{"id":4919,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4912,"mutability":"mutable","name":"target","nameLocation":"5008:6:42","nodeType":"VariableDeclaration","scope":4953,"src":"5000:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4911,"name":"address","nodeType":"ElementaryTypeName","src":"5000:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4914,"mutability":"mutable","name":"data","nameLocation":"5037:4:42","nodeType":"VariableDeclaration","scope":4953,"src":"5024:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4913,"name":"bytes","nodeType":"ElementaryTypeName","src":"5024:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":4916,"mutability":"mutable","name":"value","nameLocation":"5059:5:42","nodeType":"VariableDeclaration","scope":4953,"src":"5051:13:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4915,"name":"uint256","nodeType":"ElementaryTypeName","src":"5051:7:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4918,"mutability":"mutable","name":"errorMessage","nameLocation":"5088:12:42","nodeType":"VariableDeclaration","scope":4953,"src":"5074:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4917,"name":"string","nodeType":"ElementaryTypeName","src":"5074:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"4990:116:42"},"returnParameters":{"id":4922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4921,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4953,"src":"5125:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4920,"name":"bytes","nodeType":"ElementaryTypeName","src":"5125:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5124:14:42"},"scope":5129,"src":"4960:446:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":4969,"nodeType":"Block","src":"5683:97:42","statements":[{"expression":{"arguments":[{"id":4964,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4956,"src":"5719:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4965,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4958,"src":"5727:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"416464726573733a206c6f772d6c6576656c207374617469632063616c6c206661696c6564","id":4966,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5733:39:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0","typeString":"literal_string \"Address: low-level static call failed\""},"value":"Address: low-level static call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0","typeString":"literal_string \"Address: low-level static call failed\""}],"id":4963,"name":"functionStaticCall","nodeType":"Identifier","overloadedDeclarations":[4970,4999],"referencedDeclaration":4999,"src":"5700:18:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,string memory) view returns (bytes memory)"}},"id":4967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5700:73:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4962,"id":4968,"nodeType":"Return","src":"5693:80:42"}]},"documentation":{"id":4954,"nodeType":"StructuredDocumentation","src":"5412:166:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"},"id":4970,"implemented":true,"kind":"function","modifiers":[],"name":"functionStaticCall","nameLocation":"5592:18:42","nodeType":"FunctionDefinition","parameters":{"id":4959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4956,"mutability":"mutable","name":"target","nameLocation":"5619:6:42","nodeType":"VariableDeclaration","scope":4970,"src":"5611:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4955,"name":"address","nodeType":"ElementaryTypeName","src":"5611:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4958,"mutability":"mutable","name":"data","nameLocation":"5640:4:42","nodeType":"VariableDeclaration","scope":4970,"src":"5627:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4957,"name":"bytes","nodeType":"ElementaryTypeName","src":"5627:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5610:35:42"},"returnParameters":{"id":4962,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4961,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4970,"src":"5669:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4960,"name":"bytes","nodeType":"ElementaryTypeName","src":"5669:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5668:14:42"},"scope":5129,"src":"5583:197:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":4998,"nodeType":"Block","src":"6122:168:42","statements":[{"assignments":[4983,4985],"declarations":[{"constant":false,"id":4983,"mutability":"mutable","name":"success","nameLocation":"6138:7:42","nodeType":"VariableDeclaration","scope":4998,"src":"6133:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4982,"name":"bool","nodeType":"ElementaryTypeName","src":"6133:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4985,"mutability":"mutable","name":"returndata","nameLocation":"6160:10:42","nodeType":"VariableDeclaration","scope":4998,"src":"6147:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4984,"name":"bytes","nodeType":"ElementaryTypeName","src":"6147:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":4990,"initialValue":{"arguments":[{"id":4988,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4975,"src":"6192:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":4986,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4973,"src":"6174:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4987,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"staticcall","nodeType":"MemberAccess","src":"6174:17:42","typeDescriptions":{"typeIdentifier":"t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) view returns (bool,bytes memory)"}},"id":4989,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6174:23:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"6132:65:42"},{"expression":{"arguments":[{"id":4992,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4973,"src":"6241:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":4993,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4983,"src":"6249:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4994,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4985,"src":"6258:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":4995,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4977,"src":"6270:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4991,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5084,"src":"6214:26:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":4996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6214:69:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":4981,"id":4997,"nodeType":"Return","src":"6207:76:42"}]},"documentation":{"id":4971,"nodeType":"StructuredDocumentation","src":"5786:173:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"},"id":4999,"implemented":true,"kind":"function","modifiers":[],"name":"functionStaticCall","nameLocation":"5973:18:42","nodeType":"FunctionDefinition","parameters":{"id":4978,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4973,"mutability":"mutable","name":"target","nameLocation":"6009:6:42","nodeType":"VariableDeclaration","scope":4999,"src":"6001:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4972,"name":"address","nodeType":"ElementaryTypeName","src":"6001:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4975,"mutability":"mutable","name":"data","nameLocation":"6038:4:42","nodeType":"VariableDeclaration","scope":4999,"src":"6025:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4974,"name":"bytes","nodeType":"ElementaryTypeName","src":"6025:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":4977,"mutability":"mutable","name":"errorMessage","nameLocation":"6066:12:42","nodeType":"VariableDeclaration","scope":4999,"src":"6052:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4976,"name":"string","nodeType":"ElementaryTypeName","src":"6052:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5991:93:42"},"returnParameters":{"id":4981,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4980,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4999,"src":"6108:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4979,"name":"bytes","nodeType":"ElementaryTypeName","src":"6108:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6107:14:42"},"scope":5129,"src":"5964:326:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5015,"nodeType":"Block","src":"6566:101:42","statements":[{"expression":{"arguments":[{"id":5010,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5002,"src":"6604:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":5011,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5004,"src":"6612:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564","id":5012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6618:41:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398","typeString":"literal_string \"Address: low-level delegate call failed\""},"value":"Address: low-level delegate call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398","typeString":"literal_string \"Address: low-level delegate call failed\""}],"id":5009,"name":"functionDelegateCall","nodeType":"Identifier","overloadedDeclarations":[5016,5045],"referencedDeclaration":5045,"src":"6583:20:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,string memory) returns (bytes memory)"}},"id":5013,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6583:77:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":5008,"id":5014,"nodeType":"Return","src":"6576:84:42"}]},"documentation":{"id":5000,"nodeType":"StructuredDocumentation","src":"6296:168:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"},"id":5016,"implemented":true,"kind":"function","modifiers":[],"name":"functionDelegateCall","nameLocation":"6478:20:42","nodeType":"FunctionDefinition","parameters":{"id":5005,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5002,"mutability":"mutable","name":"target","nameLocation":"6507:6:42","nodeType":"VariableDeclaration","scope":5016,"src":"6499:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5001,"name":"address","nodeType":"ElementaryTypeName","src":"6499:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5004,"mutability":"mutable","name":"data","nameLocation":"6528:4:42","nodeType":"VariableDeclaration","scope":5016,"src":"6515:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5003,"name":"bytes","nodeType":"ElementaryTypeName","src":"6515:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6498:35:42"},"returnParameters":{"id":5008,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5007,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5016,"src":"6552:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5006,"name":"bytes","nodeType":"ElementaryTypeName","src":"6552:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6551:14:42"},"scope":5129,"src":"6469:198:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":5044,"nodeType":"Block","src":"7008:170:42","statements":[{"assignments":[5029,5031],"declarations":[{"constant":false,"id":5029,"mutability":"mutable","name":"success","nameLocation":"7024:7:42","nodeType":"VariableDeclaration","scope":5044,"src":"7019:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5028,"name":"bool","nodeType":"ElementaryTypeName","src":"7019:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5031,"mutability":"mutable","name":"returndata","nameLocation":"7046:10:42","nodeType":"VariableDeclaration","scope":5044,"src":"7033:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5030,"name":"bytes","nodeType":"ElementaryTypeName","src":"7033:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":5036,"initialValue":{"arguments":[{"id":5034,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5021,"src":"7080:4:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":5032,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5019,"src":"7060:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":5033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"delegatecall","nodeType":"MemberAccess","src":"7060:19:42","typeDescriptions":{"typeIdentifier":"t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) returns (bool,bytes memory)"}},"id":5035,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7060:25:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"7018:67:42"},{"expression":{"arguments":[{"id":5038,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5019,"src":"7129:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":5039,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5029,"src":"7137:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":5040,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5031,"src":"7146:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5041,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5023,"src":"7158:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":5037,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5084,"src":"7102:26:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory,string memory) view returns (bytes memory)"}},"id":5042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7102:69:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":5027,"id":5043,"nodeType":"Return","src":"7095:76:42"}]},"documentation":{"id":5017,"nodeType":"StructuredDocumentation","src":"6673:175:42","text":" @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"},"id":5045,"implemented":true,"kind":"function","modifiers":[],"name":"functionDelegateCall","nameLocation":"6862:20:42","nodeType":"FunctionDefinition","parameters":{"id":5024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5019,"mutability":"mutable","name":"target","nameLocation":"6900:6:42","nodeType":"VariableDeclaration","scope":5045,"src":"6892:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5018,"name":"address","nodeType":"ElementaryTypeName","src":"6892:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5021,"mutability":"mutable","name":"data","nameLocation":"6929:4:42","nodeType":"VariableDeclaration","scope":5045,"src":"6916:17:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5020,"name":"bytes","nodeType":"ElementaryTypeName","src":"6916:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5023,"mutability":"mutable","name":"errorMessage","nameLocation":"6957:12:42","nodeType":"VariableDeclaration","scope":5045,"src":"6943:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5022,"name":"string","nodeType":"ElementaryTypeName","src":"6943:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"6882:93:42"},"returnParameters":{"id":5027,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5026,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5045,"src":"6994:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5025,"name":"bytes","nodeType":"ElementaryTypeName","src":"6994:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6993:14:42"},"scope":5129,"src":"6853:325:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":5083,"nodeType":"Block","src":"7660:434:42","statements":[{"condition":{"id":5059,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5050,"src":"7674:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":5081,"nodeType":"Block","src":"8030:58:42","statements":[{"expression":{"arguments":[{"id":5077,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5052,"src":"8052:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5078,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5054,"src":"8064:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":5076,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5128,"src":"8044:7:42","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (bytes memory,string memory) pure"}},"id":5079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8044:33:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5080,"nodeType":"ExpressionStatement","src":"8044:33:42"}]},"id":5082,"nodeType":"IfStatement","src":"7670:418:42","trueBody":{"id":5075,"nodeType":"Block","src":"7683:341:42","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":5060,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5052,"src":"7701:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7701:17:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5062,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7722:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7701:22:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5072,"nodeType":"IfStatement","src":"7697:286:42","trueBody":{"id":5071,"nodeType":"Block","src":"7725:258:42","statements":[{"expression":{"arguments":[{"arguments":[{"id":5066,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5048,"src":"7927:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":5065,"name":"isContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4817,"src":"7916:10:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":5067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7916:18:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","id":5068,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7936:31:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad","typeString":"literal_string \"Address: call to non-contract\""},"value":"Address: call to non-contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad","typeString":"literal_string \"Address: call to non-contract\""}],"id":5064,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7908:7:42","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":5069,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7908:60:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5070,"nodeType":"ExpressionStatement","src":"7908:60:42"}]}},{"expression":{"id":5073,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5052,"src":"8003:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":5058,"id":5074,"nodeType":"Return","src":"7996:17:42"}]}}]},"documentation":{"id":5046,"nodeType":"StructuredDocumentation","src":"7184:277:42","text":" @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n _Available since v4.8._"},"id":5084,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResultFromTarget","nameLocation":"7475:26:42","nodeType":"FunctionDefinition","parameters":{"id":5055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5048,"mutability":"mutable","name":"target","nameLocation":"7519:6:42","nodeType":"VariableDeclaration","scope":5084,"src":"7511:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5047,"name":"address","nodeType":"ElementaryTypeName","src":"7511:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5050,"mutability":"mutable","name":"success","nameLocation":"7540:7:42","nodeType":"VariableDeclaration","scope":5084,"src":"7535:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5049,"name":"bool","nodeType":"ElementaryTypeName","src":"7535:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5052,"mutability":"mutable","name":"returndata","nameLocation":"7570:10:42","nodeType":"VariableDeclaration","scope":5084,"src":"7557:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5051,"name":"bytes","nodeType":"ElementaryTypeName","src":"7557:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5054,"mutability":"mutable","name":"errorMessage","nameLocation":"7604:12:42","nodeType":"VariableDeclaration","scope":5084,"src":"7590:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5053,"name":"string","nodeType":"ElementaryTypeName","src":"7590:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7501:121:42"},"returnParameters":{"id":5058,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5057,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5084,"src":"7646:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5056,"name":"bytes","nodeType":"ElementaryTypeName","src":"7646:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7645:14:42"},"scope":5129,"src":"7466:628:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5107,"nodeType":"Block","src":"8475:135:42","statements":[{"condition":{"id":5096,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5087,"src":"8489:7:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":5105,"nodeType":"Block","src":"8546:58:42","statements":[{"expression":{"arguments":[{"id":5101,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5089,"src":"8568:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5102,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5091,"src":"8580:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":5100,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5128,"src":"8560:7:42","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (bytes memory,string memory) pure"}},"id":5103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8560:33:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5104,"nodeType":"ExpressionStatement","src":"8560:33:42"}]},"id":5106,"nodeType":"IfStatement","src":"8485:119:42","trueBody":{"id":5099,"nodeType":"Block","src":"8498:42:42","statements":[{"expression":{"id":5097,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5089,"src":"8519:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":5095,"id":5098,"nodeType":"Return","src":"8512:17:42"}]}}]},"documentation":{"id":5085,"nodeType":"StructuredDocumentation","src":"8100:210:42","text":" @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n revert reason or using the provided one.\n _Available since v4.3._"},"id":5108,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResult","nameLocation":"8324:16:42","nodeType":"FunctionDefinition","parameters":{"id":5092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5087,"mutability":"mutable","name":"success","nameLocation":"8355:7:42","nodeType":"VariableDeclaration","scope":5108,"src":"8350:12:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5086,"name":"bool","nodeType":"ElementaryTypeName","src":"8350:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5089,"mutability":"mutable","name":"returndata","nameLocation":"8385:10:42","nodeType":"VariableDeclaration","scope":5108,"src":"8372:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5088,"name":"bytes","nodeType":"ElementaryTypeName","src":"8372:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5091,"mutability":"mutable","name":"errorMessage","nameLocation":"8419:12:42","nodeType":"VariableDeclaration","scope":5108,"src":"8405:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5090,"name":"string","nodeType":"ElementaryTypeName","src":"8405:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"8340:97:42"},"returnParameters":{"id":5095,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5094,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5108,"src":"8461:12:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5093,"name":"bytes","nodeType":"ElementaryTypeName","src":"8461:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8460:14:42"},"scope":5129,"src":"8315:295:42","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5127,"nodeType":"Block","src":"8699:457:42","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":5115,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5110,"src":"8775:10:42","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8775:17:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":5117,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8795:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8775:21:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":5125,"nodeType":"Block","src":"9105:45:42","statements":[{"expression":{"arguments":[{"id":5122,"name":"errorMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5112,"src":"9126:12:42","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":5121,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"9119:6:42","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":5123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9119:20:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5124,"nodeType":"ExpressionStatement","src":"9119:20:42"}]},"id":5126,"nodeType":"IfStatement","src":"8771:379:42","trueBody":{"id":5120,"nodeType":"Block","src":"8798:301:42","statements":[{"AST":{"nodeType":"YulBlock","src":"8956:133:42","statements":[{"nodeType":"YulVariableDeclaration","src":"8974:40:42","value":{"arguments":[{"name":"returndata","nodeType":"YulIdentifier","src":"9003:10:42"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8997:5:42"},"nodeType":"YulFunctionCall","src":"8997:17:42"},"variables":[{"name":"returndata_size","nodeType":"YulTypedName","src":"8978:15:42","type":""}]},{"expression":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9042:2:42","type":"","value":"32"},{"name":"returndata","nodeType":"YulIdentifier","src":"9046:10:42"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9038:3:42"},"nodeType":"YulFunctionCall","src":"9038:19:42"},{"name":"returndata_size","nodeType":"YulIdentifier","src":"9059:15:42"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9031:6:42"},"nodeType":"YulFunctionCall","src":"9031:44:42"},"nodeType":"YulExpressionStatement","src":"9031:44:42"}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5110,"isOffset":false,"isSlot":false,"src":"9003:10:42","valueSize":1},{"declaration":5110,"isOffset":false,"isSlot":false,"src":"9046:10:42","valueSize":1}],"id":5119,"nodeType":"InlineAssembly","src":"8947:142:42"}]}}]},"id":5128,"implemented":true,"kind":"function","modifiers":[],"name":"_revert","nameLocation":"8625:7:42","nodeType":"FunctionDefinition","parameters":{"id":5113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5110,"mutability":"mutable","name":"returndata","nameLocation":"8646:10:42","nodeType":"VariableDeclaration","scope":5128,"src":"8633:23:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5109,"name":"bytes","nodeType":"ElementaryTypeName","src":"8633:5:42","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5112,"mutability":"mutable","name":"errorMessage","nameLocation":"8672:12:42","nodeType":"VariableDeclaration","scope":5128,"src":"8658:26:42","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5111,"name":"string","nodeType":"ElementaryTypeName","src":"8658:6:42","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"8632:53:42"},"returnParameters":{"id":5114,"nodeType":"ParameterList","parameters":[],"src":"8699:0:42"},"scope":5129,"src":"8616:540:42","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":5130,"src":"194:8964:42","usedErrors":[]}],"src":"101:9058:42"},"id":42},"@openzeppelin/contracts/utils/Context.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","exportedSymbols":{"Context":[5151]},"id":5152,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5131,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"86:23:43"},{"abstract":true,"baseContracts":[],"canonicalName":"Context","contractDependencies":[],"contractKind":"contract","documentation":{"id":5132,"nodeType":"StructuredDocumentation","src":"111:496:43","text":" @dev Provides information about the current execution context, including the\n sender of the transaction and its data. While these are generally available\n via msg.sender and msg.data, they should not be accessed in such a direct\n manner, since when dealing with meta-transactions the account sending and\n paying for execution may not be the actual sender (as far as an application\n is concerned).\n This contract is only required for intermediate, library-like contracts."},"fullyImplemented":true,"id":5151,"linearizedBaseContracts":[5151],"name":"Context","nameLocation":"626:7:43","nodeType":"ContractDefinition","nodes":[{"body":{"id":5140,"nodeType":"Block","src":"702:34:43","statements":[{"expression":{"expression":{"id":5137,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"719:3:43","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":5138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"719:10:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":5136,"id":5139,"nodeType":"Return","src":"712:17:43"}]},"id":5141,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"649:10:43","nodeType":"FunctionDefinition","parameters":{"id":5133,"nodeType":"ParameterList","parameters":[],"src":"659:2:43"},"returnParameters":{"id":5136,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5135,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5141,"src":"693:7:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5134,"name":"address","nodeType":"ElementaryTypeName","src":"693:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"692:9:43"},"scope":5151,"src":"640:96:43","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":5149,"nodeType":"Block","src":"809:32:43","statements":[{"expression":{"expression":{"id":5146,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"826:3:43","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":5147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"826:8:43","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":5145,"id":5148,"nodeType":"Return","src":"819:15:43"}]},"id":5150,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"751:8:43","nodeType":"FunctionDefinition","parameters":{"id":5142,"nodeType":"ParameterList","parameters":[],"src":"759:2:43"},"returnParameters":{"id":5145,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5144,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5150,"src":"793:14:43","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":5143,"name":"bytes","nodeType":"ElementaryTypeName","src":"793:5:43","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"792:16:43"},"scope":5151,"src":"742:99:43","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":5152,"src":"608:235:43","usedErrors":[]}],"src":"86:758:43"},"id":43},"@openzeppelin/contracts/utils/Create2.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","exportedSymbols":{"Create2":[5232]},"id":5233,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5153,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"101:23:44"},{"abstract":false,"baseContracts":[],"canonicalName":"Create2","contractDependencies":[],"contractKind":"library","documentation":{"id":5154,"nodeType":"StructuredDocumentation","src":"126:367:44","text":" @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n `CREATE2` can be used to compute in advance the address where a smart\n contract will be deployed, which allows for interesting new mechanisms known\n as 'counterfactual interactions'.\n See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n information."},"fullyImplemented":true,"id":5232,"linearizedBaseContracts":[5232],"name":"Create2","nameLocation":"502:7:44","nodeType":"ContractDefinition","nodes":[{"body":{"id":5196,"nodeType":"Block","src":"1212:383:44","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":5169,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1238:4:44","typeDescriptions":{"typeIdentifier":"t_contract$_Create2_$5232","typeString":"library Create2"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Create2_$5232","typeString":"library Create2"}],"id":5168,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1230:7:44","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5167,"name":"address","nodeType":"ElementaryTypeName","src":"1230:7:44","typeDescriptions":{}}},"id":5170,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1230:13:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":5171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balance","nodeType":"MemberAccess","src":"1230:21:44","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":5172,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5157,"src":"1255:6:44","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1230:31:44","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"437265617465323a20696e73756666696369656e742062616c616e6365","id":5174,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1263:31:44","typeDescriptions":{"typeIdentifier":"t_stringliteral_f94f9c62541b73155a9def26a7988ac5579c2c6b698df8f608ced5572b7d72ca","typeString":"literal_string \"Create2: insufficient balance\""},"value":"Create2: insufficient balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f94f9c62541b73155a9def26a7988ac5579c2c6b698df8f608ced5572b7d72ca","typeString":"literal_string \"Create2: insufficient balance\""}],"id":5166,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1222:7:44","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":5175,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1222:73:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5176,"nodeType":"ExpressionStatement","src":"1222:73:44"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":5178,"name":"bytecode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5161,"src":"1313:8:44","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1313:15:44","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":5180,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1332:1:44","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1313:20:44","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"437265617465323a2062797465636f6465206c656e677468206973207a65726f","id":5182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1335:34:44","typeDescriptions":{"typeIdentifier":"t_stringliteral_124767115c09b0dd37c31c42ddb030d84459c933a30879cc32c4c922ae5928f0","typeString":"literal_string \"Create2: bytecode length is zero\""},"value":"Create2: bytecode length is zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_124767115c09b0dd37c31c42ddb030d84459c933a30879cc32c4c922ae5928f0","typeString":"literal_string \"Create2: bytecode length is zero\""}],"id":5177,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1305:7:44","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":5183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1305:65:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5184,"nodeType":"ExpressionStatement","src":"1305:65:44"},{"AST":{"nodeType":"YulBlock","src":"1432:91:44","statements":[{"nodeType":"YulAssignment","src":"1446:67:44","value":{"arguments":[{"name":"amount","nodeType":"YulIdentifier","src":"1462:6:44"},{"arguments":[{"name":"bytecode","nodeType":"YulIdentifier","src":"1474:8:44"},{"kind":"number","nodeType":"YulLiteral","src":"1484:4:44","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1470:3:44"},"nodeType":"YulFunctionCall","src":"1470:19:44"},{"arguments":[{"name":"bytecode","nodeType":"YulIdentifier","src":"1497:8:44"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1491:5:44"},"nodeType":"YulFunctionCall","src":"1491:15:44"},{"name":"salt","nodeType":"YulIdentifier","src":"1508:4:44"}],"functionName":{"name":"create2","nodeType":"YulIdentifier","src":"1454:7:44"},"nodeType":"YulFunctionCall","src":"1454:59:44"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"1446:4:44"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5164,"isOffset":false,"isSlot":false,"src":"1446:4:44","valueSize":1},{"declaration":5157,"isOffset":false,"isSlot":false,"src":"1462:6:44","valueSize":1},{"declaration":5161,"isOffset":false,"isSlot":false,"src":"1474:8:44","valueSize":1},{"declaration":5161,"isOffset":false,"isSlot":false,"src":"1497:8:44","valueSize":1},{"declaration":5159,"isOffset":false,"isSlot":false,"src":"1508:4:44","valueSize":1}],"id":5185,"nodeType":"InlineAssembly","src":"1423:100:44"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":5192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5187,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5164,"src":"1540:4:44","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":5190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1556:1:44","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5189,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1548:7:44","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5188,"name":"address","nodeType":"ElementaryTypeName","src":"1548:7:44","typeDescriptions":{}}},"id":5191,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1548:10:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1540:18:44","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"437265617465323a204661696c6564206f6e206465706c6f79","id":5193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1560:27:44","typeDescriptions":{"typeIdentifier":"t_stringliteral_87142438d464a3cd804331cca8480b31569380ef25d1f39b80404975699f0676","typeString":"literal_string \"Create2: Failed on deploy\""},"value":"Create2: Failed on deploy"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_87142438d464a3cd804331cca8480b31569380ef25d1f39b80404975699f0676","typeString":"literal_string \"Create2: Failed on deploy\""}],"id":5186,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1532:7:44","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":5194,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1532:56:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5195,"nodeType":"ExpressionStatement","src":"1532:56:44"}]},"documentation":{"id":5155,"nodeType":"StructuredDocumentation","src":"516:560:44","text":" @dev Deploys a contract using `CREATE2`. The address where the contract\n will be deployed can be known in advance via {computeAddress}.\n The bytecode for a contract can be obtained from Solidity with\n `type(contractName).creationCode`.\n Requirements:\n - `bytecode` must not be empty.\n - `salt` must have not been used for `bytecode` already.\n - the factory must have a balance of at least `amount`.\n - if `amount` is non-zero, `bytecode` must have a `payable` constructor."},"id":5197,"implemented":true,"kind":"function","modifiers":[],"name":"deploy","nameLocation":"1090:6:44","nodeType":"FunctionDefinition","parameters":{"id":5162,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5157,"mutability":"mutable","name":"amount","nameLocation":"1114:6:44","nodeType":"VariableDeclaration","scope":5197,"src":"1106:14:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5156,"name":"uint256","nodeType":"ElementaryTypeName","src":"1106:7:44","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5159,"mutability":"mutable","name":"salt","nameLocation":"1138:4:44","nodeType":"VariableDeclaration","scope":5197,"src":"1130:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5158,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1130:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5161,"mutability":"mutable","name":"bytecode","nameLocation":"1165:8:44","nodeType":"VariableDeclaration","scope":5197,"src":"1152:21:44","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5160,"name":"bytes","nodeType":"ElementaryTypeName","src":"1152:5:44","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1096:83:44"},"returnParameters":{"id":5165,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5164,"mutability":"mutable","name":"addr","nameLocation":"1206:4:44","nodeType":"VariableDeclaration","scope":5197,"src":"1198:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5163,"name":"address","nodeType":"ElementaryTypeName","src":"1198:7:44","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1197:14:44"},"scope":5232,"src":"1081:514:44","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":5216,"nodeType":"Block","src":"1891:73:44","statements":[{"expression":{"arguments":[{"id":5208,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5200,"src":"1923:4:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5209,"name":"bytecodeHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5202,"src":"1929:12:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":5212,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1951:4:44","typeDescriptions":{"typeIdentifier":"t_contract$_Create2_$5232","typeString":"library Create2"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Create2_$5232","typeString":"library Create2"}],"id":5211,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1943:7:44","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5210,"name":"address","nodeType":"ElementaryTypeName","src":"1943:7:44","typeDescriptions":{}}},"id":5213,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1943:13:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":5207,"name":"computeAddress","nodeType":"Identifier","overloadedDeclarations":[5217,5231],"referencedDeclaration":5231,"src":"1908:14:44","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_address_$returns$_t_address_$","typeString":"function (bytes32,bytes32,address) pure returns (address)"}},"id":5214,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1908:49:44","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":5206,"id":5215,"nodeType":"Return","src":"1901:56:44"}]},"documentation":{"id":5198,"nodeType":"StructuredDocumentation","src":"1601:193:44","text":" @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n `bytecodeHash` or `salt` will result in a new destination address."},"id":5217,"implemented":true,"kind":"function","modifiers":[],"name":"computeAddress","nameLocation":"1808:14:44","nodeType":"FunctionDefinition","parameters":{"id":5203,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5200,"mutability":"mutable","name":"salt","nameLocation":"1831:4:44","nodeType":"VariableDeclaration","scope":5217,"src":"1823:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5199,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1823:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5202,"mutability":"mutable","name":"bytecodeHash","nameLocation":"1845:12:44","nodeType":"VariableDeclaration","scope":5217,"src":"1837:20:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5201,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1837:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1822:36:44"},"returnParameters":{"id":5206,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5205,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5217,"src":"1882:7:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5204,"name":"address","nodeType":"ElementaryTypeName","src":"1882:7:44","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1881:9:44"},"scope":5232,"src":"1799:165:44","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5230,"nodeType":"Block","src":"2352:1657:44","statements":[{"AST":{"nodeType":"YulBlock","src":"2414:1589:44","statements":[{"nodeType":"YulVariableDeclaration","src":"2428:22:44","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2445:4:44","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2439:5:44"},"nodeType":"YulFunctionCall","src":"2439:11:44"},"variables":[{"name":"ptr","nodeType":"YulTypedName","src":"2432:3:44","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"3652:3:44"},{"kind":"number","nodeType":"YulLiteral","src":"3657:4:44","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3648:3:44"},"nodeType":"YulFunctionCall","src":"3648:14:44"},{"name":"bytecodeHash","nodeType":"YulIdentifier","src":"3664:12:44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3641:6:44"},"nodeType":"YulFunctionCall","src":"3641:36:44"},"nodeType":"YulExpressionStatement","src":"3641:36:44"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"3701:3:44"},{"kind":"number","nodeType":"YulLiteral","src":"3706:4:44","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3697:3:44"},"nodeType":"YulFunctionCall","src":"3697:14:44"},{"name":"salt","nodeType":"YulIdentifier","src":"3713:4:44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3690:6:44"},"nodeType":"YulFunctionCall","src":"3690:28:44"},"nodeType":"YulExpressionStatement","src":"3690:28:44"},{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"3738:3:44"},{"name":"deployer","nodeType":"YulIdentifier","src":"3743:8:44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3731:6:44"},"nodeType":"YulFunctionCall","src":"3731:21:44"},"nodeType":"YulExpressionStatement","src":"3731:21:44"},{"nodeType":"YulVariableDeclaration","src":"3814:27:44","value":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"3831:3:44"},{"kind":"number","nodeType":"YulLiteral","src":"3836:4:44","type":"","value":"0x0b"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3827:3:44"},"nodeType":"YulFunctionCall","src":"3827:14:44"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"3818:5:44","type":""}]},{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"3940:5:44"},{"kind":"number","nodeType":"YulLiteral","src":"3947:4:44","type":"","value":"0xff"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"3932:7:44"},"nodeType":"YulFunctionCall","src":"3932:20:44"},"nodeType":"YulExpressionStatement","src":"3932:20:44"},{"nodeType":"YulAssignment","src":"3965:28:44","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"3983:5:44"},{"kind":"number","nodeType":"YulLiteral","src":"3990:2:44","type":"","value":"85"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"3973:9:44"},"nodeType":"YulFunctionCall","src":"3973:20:44"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"3965:4:44"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5227,"isOffset":false,"isSlot":false,"src":"3965:4:44","valueSize":1},{"declaration":5222,"isOffset":false,"isSlot":false,"src":"3664:12:44","valueSize":1},{"declaration":5224,"isOffset":false,"isSlot":false,"src":"3743:8:44","valueSize":1},{"declaration":5220,"isOffset":false,"isSlot":false,"src":"3713:4:44","valueSize":1}],"id":5229,"nodeType":"InlineAssembly","src":"2405:1598:44"}]},"documentation":{"id":5218,"nodeType":"StructuredDocumentation","src":"1970:232:44","text":" @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}."},"id":5231,"implemented":true,"kind":"function","modifiers":[],"name":"computeAddress","nameLocation":"2216:14:44","nodeType":"FunctionDefinition","parameters":{"id":5225,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5220,"mutability":"mutable","name":"salt","nameLocation":"2248:4:44","nodeType":"VariableDeclaration","scope":5231,"src":"2240:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5219,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2240:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5222,"mutability":"mutable","name":"bytecodeHash","nameLocation":"2270:12:44","nodeType":"VariableDeclaration","scope":5231,"src":"2262:20:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5221,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2262:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5224,"mutability":"mutable","name":"deployer","nameLocation":"2300:8:44","nodeType":"VariableDeclaration","scope":5231,"src":"2292:16:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5223,"name":"address","nodeType":"ElementaryTypeName","src":"2292:7:44","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2230:84:44"},"returnParameters":{"id":5228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5227,"mutability":"mutable","name":"addr","nameLocation":"2346:4:44","nodeType":"VariableDeclaration","scope":5231,"src":"2338:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5226,"name":"address","nodeType":"ElementaryTypeName","src":"2338:7:44","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2337:14:44"},"scope":5232,"src":"2207:1802:44","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":5233,"src":"494:3517:44","usedErrors":[]}],"src":"101:3911:44"},"id":44},"@openzeppelin/contracts/utils/StorageSlot.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","exportedSymbols":{"StorageSlot":[5292]},"id":5293,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5234,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"105:23:45"},{"abstract":false,"baseContracts":[],"canonicalName":"StorageSlot","contractDependencies":[],"contractKind":"library","documentation":{"id":5235,"nodeType":"StructuredDocumentation","src":"130:1148:45","text":" @dev Library for reading and writing primitive types to specific storage slots.\n Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n This library helps with reading and writing to such slots without the need for inline assembly.\n The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n Example usage to set ERC1967 implementation slot:\n ```\n contract ERC1967 {\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n function _setImplementation(address newImplementation) internal {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n }\n ```\n _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._"},"fullyImplemented":true,"id":5292,"linearizedBaseContracts":[5292],"name":"StorageSlot","nameLocation":"1287:11:45","nodeType":"ContractDefinition","nodes":[{"canonicalName":"StorageSlot.AddressSlot","id":5238,"members":[{"constant":false,"id":5237,"mutability":"mutable","name":"value","nameLocation":"1342:5:45","nodeType":"VariableDeclaration","scope":5238,"src":"1334:13:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5236,"name":"address","nodeType":"ElementaryTypeName","src":"1334:7:45","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"AddressSlot","nameLocation":"1312:11:45","nodeType":"StructDefinition","scope":5292,"src":"1305:49:45","visibility":"public"},{"canonicalName":"StorageSlot.BooleanSlot","id":5241,"members":[{"constant":false,"id":5240,"mutability":"mutable","name":"value","nameLocation":"1394:5:45","nodeType":"VariableDeclaration","scope":5241,"src":"1389:10:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5239,"name":"bool","nodeType":"ElementaryTypeName","src":"1389:4:45","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"name":"BooleanSlot","nameLocation":"1367:11:45","nodeType":"StructDefinition","scope":5292,"src":"1360:46:45","visibility":"public"},{"canonicalName":"StorageSlot.Bytes32Slot","id":5244,"members":[{"constant":false,"id":5243,"mutability":"mutable","name":"value","nameLocation":"1449:5:45","nodeType":"VariableDeclaration","scope":5244,"src":"1441:13:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5242,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1441:7:45","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"name":"Bytes32Slot","nameLocation":"1419:11:45","nodeType":"StructDefinition","scope":5292,"src":"1412:49:45","visibility":"public"},{"canonicalName":"StorageSlot.Uint256Slot","id":5247,"members":[{"constant":false,"id":5246,"mutability":"mutable","name":"value","nameLocation":"1504:5:45","nodeType":"VariableDeclaration","scope":5247,"src":"1496:13:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5245,"name":"uint256","nodeType":"ElementaryTypeName","src":"1496:7:45","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Uint256Slot","nameLocation":"1474:11:45","nodeType":"StructDefinition","scope":5292,"src":"1467:49:45","visibility":"public"},{"body":{"id":5257,"nodeType":"Block","src":"1698:106:45","statements":[{"AST":{"nodeType":"YulBlock","src":"1760:38:45","statements":[{"nodeType":"YulAssignment","src":"1774:14:45","value":{"name":"slot","nodeType":"YulIdentifier","src":"1784:4:45"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"1774:6:45"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5254,"isOffset":false,"isSlot":true,"src":"1774:6:45","suffix":"slot","valueSize":1},{"declaration":5250,"isOffset":false,"isSlot":false,"src":"1784:4:45","valueSize":1}],"id":5256,"nodeType":"InlineAssembly","src":"1751:47:45"}]},"documentation":{"id":5248,"nodeType":"StructuredDocumentation","src":"1522:87:45","text":" @dev Returns an `AddressSlot` with member `value` located at `slot`."},"id":5258,"implemented":true,"kind":"function","modifiers":[],"name":"getAddressSlot","nameLocation":"1623:14:45","nodeType":"FunctionDefinition","parameters":{"id":5251,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5250,"mutability":"mutable","name":"slot","nameLocation":"1646:4:45","nodeType":"VariableDeclaration","scope":5258,"src":"1638:12:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5249,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1638:7:45","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1637:14:45"},"returnParameters":{"id":5255,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5254,"mutability":"mutable","name":"r","nameLocation":"1695:1:45","nodeType":"VariableDeclaration","scope":5258,"src":"1675:21:45","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot"},"typeName":{"id":5253,"nodeType":"UserDefinedTypeName","pathNode":{"id":5252,"name":"AddressSlot","nodeType":"IdentifierPath","referencedDeclaration":5238,"src":"1675:11:45"},"referencedDeclaration":5238,"src":"1675:11:45","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$5238_storage_ptr","typeString":"struct StorageSlot.AddressSlot"}},"visibility":"internal"}],"src":"1674:23:45"},"scope":5292,"src":"1614:190:45","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5268,"nodeType":"Block","src":"1986:106:45","statements":[{"AST":{"nodeType":"YulBlock","src":"2048:38:45","statements":[{"nodeType":"YulAssignment","src":"2062:14:45","value":{"name":"slot","nodeType":"YulIdentifier","src":"2072:4:45"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2062:6:45"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5265,"isOffset":false,"isSlot":true,"src":"2062:6:45","suffix":"slot","valueSize":1},{"declaration":5261,"isOffset":false,"isSlot":false,"src":"2072:4:45","valueSize":1}],"id":5267,"nodeType":"InlineAssembly","src":"2039:47:45"}]},"documentation":{"id":5259,"nodeType":"StructuredDocumentation","src":"1810:87:45","text":" @dev Returns an `BooleanSlot` with member `value` located at `slot`."},"id":5269,"implemented":true,"kind":"function","modifiers":[],"name":"getBooleanSlot","nameLocation":"1911:14:45","nodeType":"FunctionDefinition","parameters":{"id":5262,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5261,"mutability":"mutable","name":"slot","nameLocation":"1934:4:45","nodeType":"VariableDeclaration","scope":5269,"src":"1926:12:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5260,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1926:7:45","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1925:14:45"},"returnParameters":{"id":5266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5265,"mutability":"mutable","name":"r","nameLocation":"1983:1:45","nodeType":"VariableDeclaration","scope":5269,"src":"1963:21:45","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$5241_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"},"typeName":{"id":5264,"nodeType":"UserDefinedTypeName","pathNode":{"id":5263,"name":"BooleanSlot","nodeType":"IdentifierPath","referencedDeclaration":5241,"src":"1963:11:45"},"referencedDeclaration":5241,"src":"1963:11:45","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$5241_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"}},"visibility":"internal"}],"src":"1962:23:45"},"scope":5292,"src":"1902:190:45","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5279,"nodeType":"Block","src":"2274:106:45","statements":[{"AST":{"nodeType":"YulBlock","src":"2336:38:45","statements":[{"nodeType":"YulAssignment","src":"2350:14:45","value":{"name":"slot","nodeType":"YulIdentifier","src":"2360:4:45"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2350:6:45"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5276,"isOffset":false,"isSlot":true,"src":"2350:6:45","suffix":"slot","valueSize":1},{"declaration":5272,"isOffset":false,"isSlot":false,"src":"2360:4:45","valueSize":1}],"id":5278,"nodeType":"InlineAssembly","src":"2327:47:45"}]},"documentation":{"id":5270,"nodeType":"StructuredDocumentation","src":"2098:87:45","text":" @dev Returns an `Bytes32Slot` with member `value` located at `slot`."},"id":5280,"implemented":true,"kind":"function","modifiers":[],"name":"getBytes32Slot","nameLocation":"2199:14:45","nodeType":"FunctionDefinition","parameters":{"id":5273,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5272,"mutability":"mutable","name":"slot","nameLocation":"2222:4:45","nodeType":"VariableDeclaration","scope":5280,"src":"2214:12:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5271,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2214:7:45","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2213:14:45"},"returnParameters":{"id":5277,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5276,"mutability":"mutable","name":"r","nameLocation":"2271:1:45","nodeType":"VariableDeclaration","scope":5280,"src":"2251:21:45","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$5244_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"},"typeName":{"id":5275,"nodeType":"UserDefinedTypeName","pathNode":{"id":5274,"name":"Bytes32Slot","nodeType":"IdentifierPath","referencedDeclaration":5244,"src":"2251:11:45"},"referencedDeclaration":5244,"src":"2251:11:45","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$5244_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"}},"visibility":"internal"}],"src":"2250:23:45"},"scope":5292,"src":"2190:190:45","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5290,"nodeType":"Block","src":"2562:106:45","statements":[{"AST":{"nodeType":"YulBlock","src":"2624:38:45","statements":[{"nodeType":"YulAssignment","src":"2638:14:45","value":{"name":"slot","nodeType":"YulIdentifier","src":"2648:4:45"},"variableNames":[{"name":"r.slot","nodeType":"YulIdentifier","src":"2638:6:45"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5287,"isOffset":false,"isSlot":true,"src":"2638:6:45","suffix":"slot","valueSize":1},{"declaration":5283,"isOffset":false,"isSlot":false,"src":"2648:4:45","valueSize":1}],"id":5289,"nodeType":"InlineAssembly","src":"2615:47:45"}]},"documentation":{"id":5281,"nodeType":"StructuredDocumentation","src":"2386:87:45","text":" @dev Returns an `Uint256Slot` with member `value` located at `slot`."},"id":5291,"implemented":true,"kind":"function","modifiers":[],"name":"getUint256Slot","nameLocation":"2487:14:45","nodeType":"FunctionDefinition","parameters":{"id":5284,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5283,"mutability":"mutable","name":"slot","nameLocation":"2510:4:45","nodeType":"VariableDeclaration","scope":5291,"src":"2502:12:45","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5282,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2502:7:45","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2501:14:45"},"returnParameters":{"id":5288,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5287,"mutability":"mutable","name":"r","nameLocation":"2559:1:45","nodeType":"VariableDeclaration","scope":5291,"src":"2539:21:45","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$5247_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"},"typeName":{"id":5286,"nodeType":"UserDefinedTypeName","pathNode":{"id":5285,"name":"Uint256Slot","nodeType":"IdentifierPath","referencedDeclaration":5247,"src":"2539:11:45"},"referencedDeclaration":5247,"src":"2539:11:45","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$5247_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"}},"visibility":"internal"}],"src":"2538:23:45"},"scope":5292,"src":"2478:190:45","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":5293,"src":"1279:1391:45","usedErrors":[]}],"src":"105:2566:45"},"id":45},"@openzeppelin/contracts/utils/Strings.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","exportedSymbols":{"Math":[6705],"Strings":[5467]},"id":5468,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5294,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"101:23:46"},{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","file":"./math/Math.sol","id":5295,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":5468,"sourceUnit":6706,"src":"126:25:46","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Strings","contractDependencies":[],"contractKind":"library","documentation":{"id":5296,"nodeType":"StructuredDocumentation","src":"153:34:46","text":" @dev String operations."},"fullyImplemented":true,"id":5467,"linearizedBaseContracts":[5467],"name":"Strings","nameLocation":"196:7:46","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":5299,"mutability":"constant","name":"_SYMBOLS","nameLocation":"235:8:46","nodeType":"VariableDeclaration","scope":5467,"src":"210:54:46","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"},"typeName":{"id":5297,"name":"bytes16","nodeType":"ElementaryTypeName","src":"210:7:46","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"value":{"hexValue":"30313233343536373839616263646566","id":5298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"246:18:46","typeDescriptions":{"typeIdentifier":"t_stringliteral_cb29997ed99ead0db59ce4d12b7d3723198c827273e5796737c926d78019c39f","typeString":"literal_string \"0123456789abcdef\""},"value":"0123456789abcdef"},"visibility":"private"},{"constant":true,"id":5302,"mutability":"constant","name":"_ADDRESS_LENGTH","nameLocation":"293:15:46","nodeType":"VariableDeclaration","scope":5467,"src":"270:43:46","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5300,"name":"uint8","nodeType":"ElementaryTypeName","src":"270:5:46","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"hexValue":"3230","id":5301,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"311:2:46","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"visibility":"private"},{"body":{"id":5349,"nodeType":"Block","src":"486:625:46","statements":[{"id":5348,"nodeType":"UncheckedBlock","src":"496:609:46","statements":[{"assignments":[5311],"declarations":[{"constant":false,"id":5311,"mutability":"mutable","name":"length","nameLocation":"528:6:46","nodeType":"VariableDeclaration","scope":5348,"src":"520:14:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5310,"name":"uint256","nodeType":"ElementaryTypeName","src":"520:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5318,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5314,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5305,"src":"548:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5312,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6705,"src":"537:4:46","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$6705_$","typeString":"type(library Math)"}},"id":5313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log10","nodeType":"MemberAccess","referencedDeclaration":6542,"src":"537:10:46","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5315,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"537:17:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":5316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"557:1:46","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"537:21:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"520:38:46"},{"assignments":[5320],"declarations":[{"constant":false,"id":5320,"mutability":"mutable","name":"buffer","nameLocation":"586:6:46","nodeType":"VariableDeclaration","scope":5348,"src":"572:20:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5319,"name":"string","nodeType":"ElementaryTypeName","src":"572:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":5325,"initialValue":{"arguments":[{"id":5323,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5311,"src":"606:6:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5322,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"595:10:46","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"},"typeName":{"id":5321,"name":"string","nodeType":"ElementaryTypeName","src":"599:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"id":5324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"595:18:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"nodeType":"VariableDeclarationStatement","src":"572:41:46"},{"assignments":[5327],"declarations":[{"constant":false,"id":5327,"mutability":"mutable","name":"ptr","nameLocation":"635:3:46","nodeType":"VariableDeclaration","scope":5348,"src":"627:11:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5326,"name":"uint256","nodeType":"ElementaryTypeName","src":"627:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5328,"nodeType":"VariableDeclarationStatement","src":"627:11:46"},{"AST":{"nodeType":"YulBlock","src":"708:67:46","statements":[{"nodeType":"YulAssignment","src":"726:35:46","value":{"arguments":[{"name":"buffer","nodeType":"YulIdentifier","src":"737:6:46"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"749:2:46","type":"","value":"32"},{"name":"length","nodeType":"YulIdentifier","src":"753:6:46"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"745:3:46"},"nodeType":"YulFunctionCall","src":"745:15:46"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"733:3:46"},"nodeType":"YulFunctionCall","src":"733:28:46"},"variableNames":[{"name":"ptr","nodeType":"YulIdentifier","src":"726:3:46"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5320,"isOffset":false,"isSlot":false,"src":"737:6:46","valueSize":1},{"declaration":5311,"isOffset":false,"isSlot":false,"src":"753:6:46","valueSize":1},{"declaration":5327,"isOffset":false,"isSlot":false,"src":"726:3:46","valueSize":1}],"id":5329,"nodeType":"InlineAssembly","src":"699:76:46"},{"body":{"id":5344,"nodeType":"Block","src":"801:267:46","statements":[{"expression":{"id":5332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"819:5:46","subExpression":{"id":5331,"name":"ptr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5327,"src":"819:3:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5333,"nodeType":"ExpressionStatement","src":"819:5:46"},{"AST":{"nodeType":"YulBlock","src":"902:84:46","statements":[{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"932:3:46"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"946:5:46"},{"kind":"number","nodeType":"YulLiteral","src":"953:2:46","type":"","value":"10"}],"functionName":{"name":"mod","nodeType":"YulIdentifier","src":"942:3:46"},"nodeType":"YulFunctionCall","src":"942:14:46"},{"name":"_SYMBOLS","nodeType":"YulIdentifier","src":"958:8:46"}],"functionName":{"name":"byte","nodeType":"YulIdentifier","src":"937:4:46"},"nodeType":"YulFunctionCall","src":"937:30:46"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"924:7:46"},"nodeType":"YulFunctionCall","src":"924:44:46"},"nodeType":"YulExpressionStatement","src":"924:44:46"}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5299,"isOffset":false,"isSlot":false,"src":"958:8:46","valueSize":1},{"declaration":5327,"isOffset":false,"isSlot":false,"src":"932:3:46","valueSize":1},{"declaration":5305,"isOffset":false,"isSlot":false,"src":"946:5:46","valueSize":1}],"id":5334,"nodeType":"InlineAssembly","src":"893:93:46"},{"expression":{"id":5337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5335,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5305,"src":"1003:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"hexValue":"3130","id":5336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1012:2:46","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"src":"1003:11:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5338,"nodeType":"ExpressionStatement","src":"1003:11:46"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5339,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5305,"src":"1036:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5340,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1045:1:46","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1036:10:46","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5343,"nodeType":"IfStatement","src":"1032:21:46","trueBody":{"id":5342,"nodeType":"Break","src":"1048:5:46"}}]},"condition":{"hexValue":"74727565","id":5330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"795:4:46","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"id":5345,"nodeType":"WhileStatement","src":"788:280:46"},{"expression":{"id":5346,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5320,"src":"1088:6:46","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":5309,"id":5347,"nodeType":"Return","src":"1081:13:46"}]}]},"documentation":{"id":5303,"nodeType":"StructuredDocumentation","src":"320:90:46","text":" @dev Converts a `uint256` to its ASCII `string` decimal representation."},"id":5350,"implemented":true,"kind":"function","modifiers":[],"name":"toString","nameLocation":"424:8:46","nodeType":"FunctionDefinition","parameters":{"id":5306,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5305,"mutability":"mutable","name":"value","nameLocation":"441:5:46","nodeType":"VariableDeclaration","scope":5350,"src":"433:13:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5304,"name":"uint256","nodeType":"ElementaryTypeName","src":"433:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"432:15:46"},"returnParameters":{"id":5309,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5308,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5350,"src":"471:13:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5307,"name":"string","nodeType":"ElementaryTypeName","src":"471:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"470:15:46"},"scope":5467,"src":"415:696:46","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5369,"nodeType":"Block","src":"1290:100:46","statements":[{"id":5368,"nodeType":"UncheckedBlock","src":"1300:84:46","statements":[{"expression":{"arguments":[{"id":5359,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5353,"src":"1343:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5362,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5353,"src":"1362:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5360,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6705,"src":"1350:4:46","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$6705_$","typeString":"type(library Math)"}},"id":5361,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log256","nodeType":"MemberAccess","referencedDeclaration":6665,"src":"1350:11:46","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1350:18:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":5364,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1371:1:46","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1350:22:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5358,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[5370,5446,5466],"referencedDeclaration":5446,"src":"1331:11:46","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":5366,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1331:42:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":5357,"id":5367,"nodeType":"Return","src":"1324:49:46"}]}]},"documentation":{"id":5351,"nodeType":"StructuredDocumentation","src":"1117:94:46","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation."},"id":5370,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"1225:11:46","nodeType":"FunctionDefinition","parameters":{"id":5354,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5353,"mutability":"mutable","name":"value","nameLocation":"1245:5:46","nodeType":"VariableDeclaration","scope":5370,"src":"1237:13:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5352,"name":"uint256","nodeType":"ElementaryTypeName","src":"1237:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1236:15:46"},"returnParameters":{"id":5357,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5356,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5370,"src":"1275:13:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5355,"name":"string","nodeType":"ElementaryTypeName","src":"1275:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1274:15:46"},"scope":5467,"src":"1216:174:46","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5445,"nodeType":"Block","src":"1603:347:46","statements":[{"assignments":[5381],"declarations":[{"constant":false,"id":5381,"mutability":"mutable","name":"buffer","nameLocation":"1626:6:46","nodeType":"VariableDeclaration","scope":5445,"src":"1613:19:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5380,"name":"bytes","nodeType":"ElementaryTypeName","src":"1613:5:46","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":5390,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5386,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":5384,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1645:1:46","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5385,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5375,"src":"1649:6:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1645:10:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32","id":5387,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1658:1:46","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"1645:14:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5383,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1635:9:46","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":5382,"name":"bytes","nodeType":"ElementaryTypeName","src":"1639:5:46","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":5389,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1635:25:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1613:47:46"},{"expression":{"id":5395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":5391,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5381,"src":"1670:6:46","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5393,"indexExpression":{"hexValue":"30","id":5392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1677:1:46","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1670:9:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":5394,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1682:3:46","typeDescriptions":{"typeIdentifier":"t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d","typeString":"literal_string \"0\""},"value":"0"},"src":"1670:15:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":5396,"nodeType":"ExpressionStatement","src":"1670:15:46"},{"expression":{"id":5401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":5397,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5381,"src":"1695:6:46","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5399,"indexExpression":{"hexValue":"31","id":5398,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1702:1:46","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1695:9:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"78","id":5400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1707:3:46","typeDescriptions":{"typeIdentifier":"t_stringliteral_7521d1cadbcfa91eec65aa16715b94ffc1c9654ba57ea2ef1a2127bca1127a83","typeString":"literal_string \"x\""},"value":"x"},"src":"1695:15:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":5402,"nodeType":"ExpressionStatement","src":"1695:15:46"},{"body":{"id":5431,"nodeType":"Block","src":"1765:83:46","statements":[{"expression":{"id":5425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":5417,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5381,"src":"1779:6:46","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5419,"indexExpression":{"id":5418,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5404,"src":"1786:1:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1779:9:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":5420,"name":"_SYMBOLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5299,"src":"1791:8:46","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"id":5424,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5421,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5373,"src":"1800:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"307866","id":5422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1808:3:46","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"0xf"},"src":"1800:11:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1791:21:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"1779:33:46","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":5426,"nodeType":"ExpressionStatement","src":"1779:33:46"},{"expression":{"id":5429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5427,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5373,"src":"1826:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":5428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1836:1:46","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"1826:11:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5430,"nodeType":"ExpressionStatement","src":"1826:11:46"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5413,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5411,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5404,"src":"1753:1:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"31","id":5412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1757:1:46","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1753:5:46","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5432,"initializationExpression":{"assignments":[5404],"declarations":[{"constant":false,"id":5404,"mutability":"mutable","name":"i","nameLocation":"1733:1:46","nodeType":"VariableDeclaration","scope":5432,"src":"1725:9:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5403,"name":"uint256","nodeType":"ElementaryTypeName","src":"1725:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5410,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":5405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1737:1:46","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5406,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5375,"src":"1741:6:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1737:10:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":5408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1750:1:46","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1737:14:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1725:26:46"},"loopExpression":{"expression":{"id":5415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"1760:3:46","subExpression":{"id":5414,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5404,"src":"1762:1:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5416,"nodeType":"ExpressionStatement","src":"1760:3:46"},"nodeType":"ForStatement","src":"1720:128:46"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5434,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5373,"src":"1865:5:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1874:1:46","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1865:10:46","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"537472696e67733a20686578206c656e67746820696e73756666696369656e74","id":5437,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1877:34:46","typeDescriptions":{"typeIdentifier":"t_stringliteral_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2","typeString":"literal_string \"Strings: hex length insufficient\""},"value":"Strings: hex length insufficient"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2","typeString":"literal_string \"Strings: hex length insufficient\""}],"id":5433,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1857:7:46","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":5438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1857:55:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5439,"nodeType":"ExpressionStatement","src":"1857:55:46"},{"expression":{"arguments":[{"id":5442,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5381,"src":"1936:6:46","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5441,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1929:6:46","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":5440,"name":"string","nodeType":"ElementaryTypeName","src":"1929:6:46","typeDescriptions":{}}},"id":5443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1929:14:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":5379,"id":5444,"nodeType":"Return","src":"1922:21:46"}]},"documentation":{"id":5371,"nodeType":"StructuredDocumentation","src":"1396:112:46","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length."},"id":5446,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"1522:11:46","nodeType":"FunctionDefinition","parameters":{"id":5376,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5373,"mutability":"mutable","name":"value","nameLocation":"1542:5:46","nodeType":"VariableDeclaration","scope":5446,"src":"1534:13:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5372,"name":"uint256","nodeType":"ElementaryTypeName","src":"1534:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5375,"mutability":"mutable","name":"length","nameLocation":"1557:6:46","nodeType":"VariableDeclaration","scope":5446,"src":"1549:14:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5374,"name":"uint256","nodeType":"ElementaryTypeName","src":"1549:7:46","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1533:31:46"},"returnParameters":{"id":5379,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5378,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5446,"src":"1588:13:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5377,"name":"string","nodeType":"ElementaryTypeName","src":"1588:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1587:15:46"},"scope":5467,"src":"1513:437:46","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5465,"nodeType":"Block","src":"2175:76:46","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":5459,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5449,"src":"2220:4:46","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":5458,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2212:7:46","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":5457,"name":"uint160","nodeType":"ElementaryTypeName","src":"2212:7:46","typeDescriptions":{}}},"id":5460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2212:13:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":5456,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2204:7:46","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":5455,"name":"uint256","nodeType":"ElementaryTypeName","src":"2204:7:46","typeDescriptions":{}}},"id":5461,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2204:22:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5462,"name":"_ADDRESS_LENGTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5302,"src":"2228:15:46","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":5454,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[5370,5446,5466],"referencedDeclaration":5446,"src":"2192:11:46","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":5463,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2192:52:46","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":5453,"id":5464,"nodeType":"Return","src":"2185:59:46"}]},"documentation":{"id":5447,"nodeType":"StructuredDocumentation","src":"1956:141:46","text":" @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation."},"id":5466,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"2111:11:46","nodeType":"FunctionDefinition","parameters":{"id":5450,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5449,"mutability":"mutable","name":"addr","nameLocation":"2131:4:46","nodeType":"VariableDeclaration","scope":5466,"src":"2123:12:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5448,"name":"address","nodeType":"ElementaryTypeName","src":"2123:7:46","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2122:14:46"},"returnParameters":{"id":5453,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5452,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5466,"src":"2160:13:46","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":5451,"name":"string","nodeType":"ElementaryTypeName","src":"2160:6:46","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2159:15:46"},"scope":5467,"src":"2102:149:46","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":5468,"src":"188:2065:46","usedErrors":[]}],"src":"101:2153:46"},"id":46},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","exportedSymbols":{"ECDSA":[5828],"Math":[6705],"Strings":[5467]},"id":5829,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5469,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"112:23:47"},{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","file":"../Strings.sol","id":5470,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":5829,"sourceUnit":5468,"src":"137:24:47","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ECDSA","contractDependencies":[],"contractKind":"library","documentation":{"id":5471,"nodeType":"StructuredDocumentation","src":"163:205:47","text":" @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."},"fullyImplemented":true,"id":5828,"linearizedBaseContracts":[5828],"name":"ECDSA","nameLocation":"377:5:47","nodeType":"ContractDefinition","nodes":[{"canonicalName":"ECDSA.RecoverError","id":5477,"members":[{"id":5472,"name":"NoError","nameLocation":"417:7:47","nodeType":"EnumValue","src":"417:7:47"},{"id":5473,"name":"InvalidSignature","nameLocation":"434:16:47","nodeType":"EnumValue","src":"434:16:47"},{"id":5474,"name":"InvalidSignatureLength","nameLocation":"460:22:47","nodeType":"EnumValue","src":"460:22:47"},{"id":5475,"name":"InvalidSignatureS","nameLocation":"492:17:47","nodeType":"EnumValue","src":"492:17:47"},{"id":5476,"name":"InvalidSignatureV","nameLocation":"519:17:47","nodeType":"EnumValue","src":"519:17:47"}],"name":"RecoverError","nameLocation":"394:12:47","nodeType":"EnumDefinition","src":"389:175:47"},{"body":{"id":5520,"nodeType":"Block","src":"624:457:47","statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"id":5486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5483,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5480,"src":"638:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":5484,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"647:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5485,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":5472,"src":"647:20:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"src":"638:29:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"id":5492,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5489,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5480,"src":"734:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":5490,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"743:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5491,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":5473,"src":"743:29:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"src":"734:38:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"id":5501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5498,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5480,"src":"843:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":5499,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"852:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5500,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":5474,"src":"852:35:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"src":"843:44:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"id":5510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5507,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5480,"src":"965:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":5508,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"974:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":5475,"src":"974:30:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"src":"965:39:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5516,"nodeType":"IfStatement","src":"961:114:47","trueBody":{"id":5515,"nodeType":"Block","src":"1006:69:47","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c7565","id":5512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1027:36:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd","typeString":"literal_string \"ECDSA: invalid signature 's' value\""},"value":"ECDSA: invalid signature 's' value"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd","typeString":"literal_string \"ECDSA: invalid signature 's' value\""}],"id":5511,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"1020:6:47","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":5513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1020:44:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5514,"nodeType":"ExpressionStatement","src":"1020:44:47"}]}},"id":5517,"nodeType":"IfStatement","src":"839:236:47","trueBody":{"id":5506,"nodeType":"Block","src":"889:66:47","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","id":5503,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"910:33:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77","typeString":"literal_string \"ECDSA: invalid signature length\""},"value":"ECDSA: invalid signature length"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77","typeString":"literal_string \"ECDSA: invalid signature length\""}],"id":5502,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"903:6:47","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":5504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"903:41:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5505,"nodeType":"ExpressionStatement","src":"903:41:47"}]}},"id":5518,"nodeType":"IfStatement","src":"730:345:47","trueBody":{"id":5497,"nodeType":"Block","src":"774:59:47","statements":[{"expression":{"arguments":[{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","id":5494,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"795:26:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be","typeString":"literal_string \"ECDSA: invalid signature\""},"value":"ECDSA: invalid signature"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be","typeString":"literal_string \"ECDSA: invalid signature\""}],"id":5493,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"788:6:47","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":5495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"788:34:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5496,"nodeType":"ExpressionStatement","src":"788:34:47"}]}},"id":5519,"nodeType":"IfStatement","src":"634:441:47","trueBody":{"id":5488,"nodeType":"Block","src":"669:55:47","statements":[{"functionReturnParameters":5482,"id":5487,"nodeType":"Return","src":"683:7:47"}]}}]},"id":5521,"implemented":true,"kind":"function","modifiers":[],"name":"_throwError","nameLocation":"579:11:47","nodeType":"FunctionDefinition","parameters":{"id":5481,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5480,"mutability":"mutable","name":"error","nameLocation":"604:5:47","nodeType":"VariableDeclaration","scope":5521,"src":"591:18:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5479,"nodeType":"UserDefinedTypeName","pathNode":{"id":5478,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"591:12:47"},"referencedDeclaration":5477,"src":"591:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"590:20:47"},"returnParameters":{"id":5482,"nodeType":"ParameterList","parameters":[],"src":"624:0:47"},"scope":5828,"src":"570:511:47","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":5566,"nodeType":"Block","src":"2249:626:47","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":5534,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5526,"src":"2263:9:47","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5535,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2263:16:47","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3635","id":5536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2283:2:47","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"},"src":"2263:22:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":5564,"nodeType":"Block","src":"2788:81:47","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":5558,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2818:1:47","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2810:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5556,"name":"address","nodeType":"ElementaryTypeName","src":"2810:7:47","typeDescriptions":{}}},"id":5559,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2810:10:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":5560,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"2822:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5561,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":5474,"src":"2822:35:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"id":5562,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2809:49:47","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5533,"id":5563,"nodeType":"Return","src":"2802:56:47"}]},"id":5565,"nodeType":"IfStatement","src":"2259:610:47","trueBody":{"id":5555,"nodeType":"Block","src":"2287:495:47","statements":[{"assignments":[5539],"declarations":[{"constant":false,"id":5539,"mutability":"mutable","name":"r","nameLocation":"2309:1:47","nodeType":"VariableDeclaration","scope":5555,"src":"2301:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5538,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2301:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":5540,"nodeType":"VariableDeclarationStatement","src":"2301:9:47"},{"assignments":[5542],"declarations":[{"constant":false,"id":5542,"mutability":"mutable","name":"s","nameLocation":"2332:1:47","nodeType":"VariableDeclaration","scope":5555,"src":"2324:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5541,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2324:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":5543,"nodeType":"VariableDeclarationStatement","src":"2324:9:47"},{"assignments":[5545],"declarations":[{"constant":false,"id":5545,"mutability":"mutable","name":"v","nameLocation":"2353:1:47","nodeType":"VariableDeclaration","scope":5555,"src":"2347:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5544,"name":"uint8","nodeType":"ElementaryTypeName","src":"2347:5:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":5546,"nodeType":"VariableDeclarationStatement","src":"2347:7:47"},{"AST":{"nodeType":"YulBlock","src":"2555:171:47","statements":[{"nodeType":"YulAssignment","src":"2573:32:47","value":{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2588:9:47"},{"kind":"number","nodeType":"YulLiteral","src":"2599:4:47","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2584:3:47"},"nodeType":"YulFunctionCall","src":"2584:20:47"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2578:5:47"},"nodeType":"YulFunctionCall","src":"2578:27:47"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"2573:1:47"}]},{"nodeType":"YulAssignment","src":"2622:32:47","value":{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2637:9:47"},{"kind":"number","nodeType":"YulLiteral","src":"2648:4:47","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2633:3:47"},"nodeType":"YulFunctionCall","src":"2633:20:47"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2627:5:47"},"nodeType":"YulFunctionCall","src":"2627:27:47"},"variableNames":[{"name":"s","nodeType":"YulIdentifier","src":"2622:1:47"}]},{"nodeType":"YulAssignment","src":"2671:41:47","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2681:1:47","type":"","value":"0"},{"arguments":[{"arguments":[{"name":"signature","nodeType":"YulIdentifier","src":"2694:9:47"},{"kind":"number","nodeType":"YulLiteral","src":"2705:4:47","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2690:3:47"},"nodeType":"YulFunctionCall","src":"2690:20:47"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2684:5:47"},"nodeType":"YulFunctionCall","src":"2684:27:47"}],"functionName":{"name":"byte","nodeType":"YulIdentifier","src":"2676:4:47"},"nodeType":"YulFunctionCall","src":"2676:36:47"},"variableNames":[{"name":"v","nodeType":"YulIdentifier","src":"2671:1:47"}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":5539,"isOffset":false,"isSlot":false,"src":"2573:1:47","valueSize":1},{"declaration":5542,"isOffset":false,"isSlot":false,"src":"2622:1:47","valueSize":1},{"declaration":5526,"isOffset":false,"isSlot":false,"src":"2588:9:47","valueSize":1},{"declaration":5526,"isOffset":false,"isSlot":false,"src":"2637:9:47","valueSize":1},{"declaration":5526,"isOffset":false,"isSlot":false,"src":"2694:9:47","valueSize":1},{"declaration":5545,"isOffset":false,"isSlot":false,"src":"2671:1:47","valueSize":1}],"id":5547,"nodeType":"InlineAssembly","src":"2546:180:47"},{"expression":{"arguments":[{"id":5549,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5524,"src":"2757:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5550,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5545,"src":"2763:1:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":5551,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5539,"src":"2766:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5552,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5542,"src":"2769:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5548,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[5567,5641,5735],"referencedDeclaration":5735,"src":"2746:10:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":5553,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2746:25:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5533,"id":5554,"nodeType":"Return","src":"2739:32:47"}]}}]},"documentation":{"id":5522,"nodeType":"StructuredDocumentation","src":"1087:1053:47","text":" @dev Returns the address that signed a hashed message (`hash`) with\n `signature` or error string. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n _Available since v4.3._"},"id":5567,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"2154:10:47","nodeType":"FunctionDefinition","parameters":{"id":5527,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5524,"mutability":"mutable","name":"hash","nameLocation":"2173:4:47","nodeType":"VariableDeclaration","scope":5567,"src":"2165:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5523,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2165:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5526,"mutability":"mutable","name":"signature","nameLocation":"2192:9:47","nodeType":"VariableDeclaration","scope":5567,"src":"2179:22:47","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5525,"name":"bytes","nodeType":"ElementaryTypeName","src":"2179:5:47","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2164:38:47"},"returnParameters":{"id":5533,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5529,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5567,"src":"2226:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5528,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5532,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5567,"src":"2235:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5531,"nodeType":"UserDefinedTypeName","pathNode":{"id":5530,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"2235:12:47"},"referencedDeclaration":5477,"src":"2235:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"2225:23:47"},"scope":5828,"src":"2145:730:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5593,"nodeType":"Block","src":"3748:140:47","statements":[{"assignments":[5578,5581],"declarations":[{"constant":false,"id":5578,"mutability":"mutable","name":"recovered","nameLocation":"3767:9:47","nodeType":"VariableDeclaration","scope":5593,"src":"3759:17:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5577,"name":"address","nodeType":"ElementaryTypeName","src":"3759:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5581,"mutability":"mutable","name":"error","nameLocation":"3791:5:47","nodeType":"VariableDeclaration","scope":5593,"src":"3778:18:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5580,"nodeType":"UserDefinedTypeName","pathNode":{"id":5579,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"3778:12:47"},"referencedDeclaration":5477,"src":"3778:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":5586,"initialValue":{"arguments":[{"id":5583,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5570,"src":"3811:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5584,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5572,"src":"3817:9:47","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5582,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[5567,5641,5735],"referencedDeclaration":5567,"src":"3800:10:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError)"}},"id":5585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3800:27:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"3758:69:47"},{"expression":{"arguments":[{"id":5588,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5581,"src":"3849:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}],"id":5587,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5521,"src":"3837:11:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$5477_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":5589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3837:18:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5590,"nodeType":"ExpressionStatement","src":"3837:18:47"},{"expression":{"id":5591,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5578,"src":"3872:9:47","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":5576,"id":5592,"nodeType":"Return","src":"3865:16:47"}]},"documentation":{"id":5568,"nodeType":"StructuredDocumentation","src":"2881:775:47","text":" @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it."},"id":5594,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"3670:7:47","nodeType":"FunctionDefinition","parameters":{"id":5573,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5570,"mutability":"mutable","name":"hash","nameLocation":"3686:4:47","nodeType":"VariableDeclaration","scope":5594,"src":"3678:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5569,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3678:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5572,"mutability":"mutable","name":"signature","nameLocation":"3705:9:47","nodeType":"VariableDeclaration","scope":5594,"src":"3692:22:47","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5571,"name":"bytes","nodeType":"ElementaryTypeName","src":"3692:5:47","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3677:38:47"},"returnParameters":{"id":5576,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5575,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5594,"src":"3739:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5574,"name":"address","nodeType":"ElementaryTypeName","src":"3739:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3738:9:47"},"scope":5828,"src":"3661:227:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5640,"nodeType":"Block","src":"4275:203:47","statements":[{"assignments":[5610],"declarations":[{"constant":false,"id":5610,"mutability":"mutable","name":"s","nameLocation":"4293:1:47","nodeType":"VariableDeclaration","scope":5640,"src":"4285:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5609,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4285:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":5617,"initialValue":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":5616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5611,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5601,"src":"4297:2:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"arguments":[{"hexValue":"307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666","id":5614,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4310:66:47","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"},"value":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"}],"id":5613,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4302:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":5612,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4302:7:47","typeDescriptions":{}}},"id":5615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4302:75:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4297:80:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4285:92:47"},{"assignments":[5619],"declarations":[{"constant":false,"id":5619,"mutability":"mutable","name":"v","nameLocation":"4393:1:47","nodeType":"VariableDeclaration","scope":5640,"src":"4387:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5618,"name":"uint8","nodeType":"ElementaryTypeName","src":"4387:5:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":5632,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5624,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5601,"src":"4412:2:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5623,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4404:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":5622,"name":"uint256","nodeType":"ElementaryTypeName","src":"4404:7:47","typeDescriptions":{}}},"id":5625,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4404:11:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"323535","id":5626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4419:3:47","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"4404:18:47","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5628,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4403:20:47","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3237","id":5629,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4426:2:47","typeDescriptions":{"typeIdentifier":"t_rational_27_by_1","typeString":"int_const 27"},"value":"27"},"src":"4403:25:47","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5621,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4397:5:47","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":5620,"name":"uint8","nodeType":"ElementaryTypeName","src":"4397:5:47","typeDescriptions":{}}},"id":5631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4397:32:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"4387:42:47"},{"expression":{"arguments":[{"id":5634,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5597,"src":"4457:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5635,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5619,"src":"4463:1:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":5636,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5599,"src":"4466:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5637,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5610,"src":"4469:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5633,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[5567,5641,5735],"referencedDeclaration":5735,"src":"4446:10:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":5638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4446:25:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5608,"id":5639,"nodeType":"Return","src":"4439:32:47"}]},"documentation":{"id":5595,"nodeType":"StructuredDocumentation","src":"3894:243:47","text":" @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n _Available since v4.3._"},"id":5641,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"4151:10:47","nodeType":"FunctionDefinition","parameters":{"id":5602,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5597,"mutability":"mutable","name":"hash","nameLocation":"4179:4:47","nodeType":"VariableDeclaration","scope":5641,"src":"4171:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5596,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4171:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5599,"mutability":"mutable","name":"r","nameLocation":"4201:1:47","nodeType":"VariableDeclaration","scope":5641,"src":"4193:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5598,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4193:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5601,"mutability":"mutable","name":"vs","nameLocation":"4220:2:47","nodeType":"VariableDeclaration","scope":5641,"src":"4212:10:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5600,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4212:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4161:67:47"},"returnParameters":{"id":5608,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5604,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5641,"src":"4252:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5603,"name":"address","nodeType":"ElementaryTypeName","src":"4252:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5607,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5641,"src":"4261:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5606,"nodeType":"UserDefinedTypeName","pathNode":{"id":5605,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"4261:12:47"},"referencedDeclaration":5477,"src":"4261:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"4251:23:47"},"scope":5828,"src":"4142:336:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5670,"nodeType":"Block","src":"4759:136:47","statements":[{"assignments":[5654,5657],"declarations":[{"constant":false,"id":5654,"mutability":"mutable","name":"recovered","nameLocation":"4778:9:47","nodeType":"VariableDeclaration","scope":5670,"src":"4770:17:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5653,"name":"address","nodeType":"ElementaryTypeName","src":"4770:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5657,"mutability":"mutable","name":"error","nameLocation":"4802:5:47","nodeType":"VariableDeclaration","scope":5670,"src":"4789:18:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5656,"nodeType":"UserDefinedTypeName","pathNode":{"id":5655,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"4789:12:47"},"referencedDeclaration":5477,"src":"4789:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":5663,"initialValue":{"arguments":[{"id":5659,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5644,"src":"4822:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5660,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5646,"src":"4828:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5661,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5648,"src":"4831:2:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5658,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[5567,5641,5735],"referencedDeclaration":5641,"src":"4811:10:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":5662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4811:23:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"4769:65:47"},{"expression":{"arguments":[{"id":5665,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5657,"src":"4856:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}],"id":5664,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5521,"src":"4844:11:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$5477_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":5666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4844:18:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5667,"nodeType":"ExpressionStatement","src":"4844:18:47"},{"expression":{"id":5668,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5654,"src":"4879:9:47","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":5652,"id":5669,"nodeType":"Return","src":"4872:16:47"}]},"documentation":{"id":5642,"nodeType":"StructuredDocumentation","src":"4484:154:47","text":" @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n _Available since v4.2._"},"id":5671,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"4652:7:47","nodeType":"FunctionDefinition","parameters":{"id":5649,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5644,"mutability":"mutable","name":"hash","nameLocation":"4677:4:47","nodeType":"VariableDeclaration","scope":5671,"src":"4669:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5643,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4669:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5646,"mutability":"mutable","name":"r","nameLocation":"4699:1:47","nodeType":"VariableDeclaration","scope":5671,"src":"4691:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5645,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4691:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5648,"mutability":"mutable","name":"vs","nameLocation":"4718:2:47","nodeType":"VariableDeclaration","scope":5671,"src":"4710:10:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5647,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4710:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4659:67:47"},"returnParameters":{"id":5652,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5651,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5671,"src":"4750:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5650,"name":"address","nodeType":"ElementaryTypeName","src":"4750:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4749:9:47"},"scope":5828,"src":"4643:252:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5734,"nodeType":"Block","src":"5218:1345:47","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5690,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5680,"src":"6114:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5689,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6106:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":5688,"name":"uint256","nodeType":"ElementaryTypeName","src":"6106:7:47","typeDescriptions":{}}},"id":5691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6106:10:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130","id":5692,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6119:66:47","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1","typeString":"int_const 5789...(69 digits omitted)...7168"},"value":"0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"},"src":"6106:79:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5703,"nodeType":"IfStatement","src":"6102:161:47","trueBody":{"id":5702,"nodeType":"Block","src":"6187:76:47","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":5696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6217:1:47","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5695,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6209:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5694,"name":"address","nodeType":"ElementaryTypeName","src":"6209:7:47","typeDescriptions":{}}},"id":5697,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6209:10:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":5698,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"6221:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5699,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":5475,"src":"6221:30:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"id":5700,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6208:44:47","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5687,"id":5701,"nodeType":"Return","src":"6201:51:47"}]}},{"assignments":[5705],"declarations":[{"constant":false,"id":5705,"mutability":"mutable","name":"signer","nameLocation":"6365:6:47","nodeType":"VariableDeclaration","scope":5734,"src":"6357:14:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5704,"name":"address","nodeType":"ElementaryTypeName","src":"6357:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":5712,"initialValue":{"arguments":[{"id":5707,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5674,"src":"6384:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5708,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5676,"src":"6390:1:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":5709,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5678,"src":"6393:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5710,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5680,"src":"6396:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5706,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"6374:9:47","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":5711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6374:24:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6357:41:47"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":5718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5713,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5705,"src":"6412:6:47","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":5716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6430:1:47","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6422:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5714,"name":"address","nodeType":"ElementaryTypeName","src":"6422:7:47","typeDescriptions":{}}},"id":5717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6422:10:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6412:20:47","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5728,"nodeType":"IfStatement","src":"6408:101:47","trueBody":{"id":5727,"nodeType":"Block","src":"6434:75:47","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":5721,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6464:1:47","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5720,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6456:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":5719,"name":"address","nodeType":"ElementaryTypeName","src":"6456:7:47","typeDescriptions":{}}},"id":5722,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6456:10:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":5723,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"6468:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5724,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":5473,"src":"6468:29:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"id":5725,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6455:43:47","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5687,"id":5726,"nodeType":"Return","src":"6448:50:47"}]}},{"expression":{"components":[{"id":5729,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5705,"src":"6527:6:47","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":5730,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5477,"src":"6535:12:47","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$5477_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":5731,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":5472,"src":"6535:20:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"id":5732,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6526:30:47","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"functionReturnParameters":5687,"id":5733,"nodeType":"Return","src":"6519:37:47"}]},"documentation":{"id":5672,"nodeType":"StructuredDocumentation","src":"4901:163:47","text":" @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately.\n _Available since v4.3._"},"id":5735,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"5078:10:47","nodeType":"FunctionDefinition","parameters":{"id":5681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5674,"mutability":"mutable","name":"hash","nameLocation":"5106:4:47","nodeType":"VariableDeclaration","scope":5735,"src":"5098:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5673,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5098:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5676,"mutability":"mutable","name":"v","nameLocation":"5126:1:47","nodeType":"VariableDeclaration","scope":5735,"src":"5120:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5675,"name":"uint8","nodeType":"ElementaryTypeName","src":"5120:5:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":5678,"mutability":"mutable","name":"r","nameLocation":"5145:1:47","nodeType":"VariableDeclaration","scope":5735,"src":"5137:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5677,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5137:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5680,"mutability":"mutable","name":"s","nameLocation":"5164:1:47","nodeType":"VariableDeclaration","scope":5735,"src":"5156:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5679,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5156:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5088:83:47"},"returnParameters":{"id":5687,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5683,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5735,"src":"5195:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5682,"name":"address","nodeType":"ElementaryTypeName","src":"5195:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5686,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5735,"src":"5204:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5685,"nodeType":"UserDefinedTypeName","pathNode":{"id":5684,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"5204:12:47"},"referencedDeclaration":5477,"src":"5204:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"src":"5194:23:47"},"scope":5828,"src":"5069:1494:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5767,"nodeType":"Block","src":"6828:138:47","statements":[{"assignments":[5750,5753],"declarations":[{"constant":false,"id":5750,"mutability":"mutable","name":"recovered","nameLocation":"6847:9:47","nodeType":"VariableDeclaration","scope":5767,"src":"6839:17:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5749,"name":"address","nodeType":"ElementaryTypeName","src":"6839:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5753,"mutability":"mutable","name":"error","nameLocation":"6871:5:47","nodeType":"VariableDeclaration","scope":5767,"src":"6858:18:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":5752,"nodeType":"UserDefinedTypeName","pathNode":{"id":5751,"name":"RecoverError","nodeType":"IdentifierPath","referencedDeclaration":5477,"src":"6858:12:47"},"referencedDeclaration":5477,"src":"6858:12:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"}],"id":5760,"initialValue":{"arguments":[{"id":5755,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5738,"src":"6891:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5756,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5740,"src":"6897:1:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":5757,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5742,"src":"6900:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5758,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5744,"src":"6903:1:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":5754,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[5567,5641,5735],"referencedDeclaration":5735,"src":"6880:10:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"}},"id":5759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6880:25:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$5477_$","typeString":"tuple(address,enum ECDSA.RecoverError)"}},"nodeType":"VariableDeclarationStatement","src":"6838:67:47"},{"expression":{"arguments":[{"id":5762,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5753,"src":"6927:5:47","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$5477","typeString":"enum ECDSA.RecoverError"}],"id":5761,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5521,"src":"6915:11:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$5477_$returns$__$","typeString":"function (enum ECDSA.RecoverError) pure"}},"id":5763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6915:18:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5764,"nodeType":"ExpressionStatement","src":"6915:18:47"},{"expression":{"id":5765,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5750,"src":"6950:9:47","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":5748,"id":5766,"nodeType":"Return","src":"6943:16:47"}]},"documentation":{"id":5736,"nodeType":"StructuredDocumentation","src":"6569:122:47","text":" @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately."},"id":5768,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"6705:7:47","nodeType":"FunctionDefinition","parameters":{"id":5745,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5738,"mutability":"mutable","name":"hash","nameLocation":"6730:4:47","nodeType":"VariableDeclaration","scope":5768,"src":"6722:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5737,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6722:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5740,"mutability":"mutable","name":"v","nameLocation":"6750:1:47","nodeType":"VariableDeclaration","scope":5768,"src":"6744:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5739,"name":"uint8","nodeType":"ElementaryTypeName","src":"6744:5:47","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":5742,"mutability":"mutable","name":"r","nameLocation":"6769:1:47","nodeType":"VariableDeclaration","scope":5768,"src":"6761:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5741,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6761:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5744,"mutability":"mutable","name":"s","nameLocation":"6788:1:47","nodeType":"VariableDeclaration","scope":5768,"src":"6780:9:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5743,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6780:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6712:83:47"},"returnParameters":{"id":5748,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5747,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5768,"src":"6819:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":5746,"name":"address","nodeType":"ElementaryTypeName","src":"6819:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6818:9:47"},"scope":5828,"src":"6696:270:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5784,"nodeType":"Block","src":"7334:187:47","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"19457468657265756d205369676e6564204d6573736167653a0a3332","id":5779,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7472:34:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},"value":"\u0019Ethereum Signed Message:\n32"},{"id":5780,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5771,"src":"7508:4:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":5777,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7455:3:47","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":5778,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"7455:16:47","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":5781,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7455:58:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5776,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7445:9:47","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":5782,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7445:69:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":5775,"id":5783,"nodeType":"Return","src":"7438:76:47"}]},"documentation":{"id":5769,"nodeType":"StructuredDocumentation","src":"6972:279:47","text":" @dev Returns an Ethereum Signed Message, created from a `hash`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."},"id":5785,"implemented":true,"kind":"function","modifiers":[],"name":"toEthSignedMessageHash","nameLocation":"7265:22:47","nodeType":"FunctionDefinition","parameters":{"id":5772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5771,"mutability":"mutable","name":"hash","nameLocation":"7296:4:47","nodeType":"VariableDeclaration","scope":5785,"src":"7288:12:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5770,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7288:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7287:14:47"},"returnParameters":{"id":5775,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5774,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5785,"src":"7325:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5773,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7325:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7324:9:47"},"scope":5828,"src":"7256:265:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5806,"nodeType":"Block","src":"7886:116:47","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"19457468657265756d205369676e6564204d6573736167653a0a","id":5796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7930:32:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""},"value":"\u0019Ethereum Signed Message:\n"},{"arguments":[{"expression":{"id":5799,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5788,"src":"7981:1:47","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5800,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7981:8:47","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5797,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5467,"src":"7964:7:47","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Strings_$5467_$","typeString":"type(library Strings)"}},"id":5798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toString","nodeType":"MemberAccess","referencedDeclaration":5350,"src":"7964:16:47","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"}},"id":5801,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7964:26:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":5802,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5788,"src":"7992:1:47","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4","typeString":"literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":5794,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7913:3:47","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":5795,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"7913:16:47","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":5803,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7913:81:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5793,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7903:9:47","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":5804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7903:92:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":5792,"id":5805,"nodeType":"Return","src":"7896:99:47"}]},"documentation":{"id":5786,"nodeType":"StructuredDocumentation","src":"7527:274:47","text":" @dev Returns an Ethereum Signed Message, created from `s`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."},"id":5807,"implemented":true,"kind":"function","modifiers":[],"name":"toEthSignedMessageHash","nameLocation":"7815:22:47","nodeType":"FunctionDefinition","parameters":{"id":5789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5788,"mutability":"mutable","name":"s","nameLocation":"7851:1:47","nodeType":"VariableDeclaration","scope":5807,"src":"7838:14:47","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5787,"name":"bytes","nodeType":"ElementaryTypeName","src":"7838:5:47","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7837:16:47"},"returnParameters":{"id":5792,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5791,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5807,"src":"7877:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5790,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7877:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7876:9:47"},"scope":5828,"src":"7806:196:47","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5826,"nodeType":"Block","src":"8443:92:47","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"1901","id":5820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8487:10:47","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"id":5821,"name":"domainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5810,"src":"8499:15:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":5822,"name":"structHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5812,"src":"8516:10:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":5818,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8470:3:47","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":5819,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"8470:16:47","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":5823,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8470:57:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5817,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8460:9:47","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":5824,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8460:68:47","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":5816,"id":5825,"nodeType":"Return","src":"8453:75:47"}]},"documentation":{"id":5808,"nodeType":"StructuredDocumentation","src":"8008:328:47","text":" @dev Returns an Ethereum Signed Typed Data, created from a\n `domainSeparator` and a `structHash`. This produces hash corresponding\n to the one signed with the\n https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n JSON-RPC method as part of EIP-712.\n See {recover}."},"id":5827,"implemented":true,"kind":"function","modifiers":[],"name":"toTypedDataHash","nameLocation":"8350:15:47","nodeType":"FunctionDefinition","parameters":{"id":5813,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5810,"mutability":"mutable","name":"domainSeparator","nameLocation":"8374:15:47","nodeType":"VariableDeclaration","scope":5827,"src":"8366:23:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5809,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8366:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":5812,"mutability":"mutable","name":"structHash","nameLocation":"8399:10:47","nodeType":"VariableDeclaration","scope":5827,"src":"8391:18:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5811,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8391:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"8365:45:47"},"returnParameters":{"id":5816,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5815,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5827,"src":"8434:7:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":5814,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8434:7:47","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"8433:9:47"},"scope":5828,"src":"8341:194:47","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":5829,"src":"369:8168:47","usedErrors":[]}],"src":"112:8426:47"},"id":47},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","exportedSymbols":{"IERC165":[5840]},"id":5841,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5830,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"100:23:48"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC165","contractDependencies":[],"contractKind":"interface","documentation":{"id":5831,"nodeType":"StructuredDocumentation","src":"125:279:48","text":" @dev Interface of the ERC165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[EIP].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."},"fullyImplemented":false,"id":5840,"linearizedBaseContracts":[5840],"name":"IERC165","nameLocation":"415:7:48","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":5832,"nodeType":"StructuredDocumentation","src":"429:340:48","text":" @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."},"functionSelector":"01ffc9a7","id":5839,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"783:17:48","nodeType":"FunctionDefinition","parameters":{"id":5835,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5834,"mutability":"mutable","name":"interfaceId","nameLocation":"808:11:48","nodeType":"VariableDeclaration","scope":5839,"src":"801:18:48","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":5833,"name":"bytes4","nodeType":"ElementaryTypeName","src":"801:6:48","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"800:20:48"},"returnParameters":{"id":5838,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5837,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5839,"src":"844:4:48","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5836,"name":"bool","nodeType":"ElementaryTypeName","src":"844:4:48","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"843:6:48"},"scope":5840,"src":"774:76:48","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":5841,"src":"405:447:48","usedErrors":[]}],"src":"100:753:48"},"id":48},"@openzeppelin/contracts/utils/math/Math.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","exportedSymbols":{"Math":[6705]},"id":6706,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5842,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"103:23:49"},{"abstract":false,"baseContracts":[],"canonicalName":"Math","contractDependencies":[],"contractKind":"library","documentation":{"id":5843,"nodeType":"StructuredDocumentation","src":"128:73:49","text":" @dev Standard math utilities missing in the Solidity language."},"fullyImplemented":true,"id":6705,"linearizedBaseContracts":[6705],"name":"Math","nameLocation":"210:4:49","nodeType":"ContractDefinition","nodes":[{"canonicalName":"Math.Rounding","id":5847,"members":[{"id":5844,"name":"Down","nameLocation":"245:4:49","nodeType":"EnumValue","src":"245:4:49"},{"id":5845,"name":"Up","nameLocation":"287:2:49","nodeType":"EnumValue","src":"287:2:49"},{"id":5846,"name":"Zero","nameLocation":"318:4:49","nodeType":"EnumValue","src":"318:4:49"}],"name":"Rounding","nameLocation":"226:8:49","nodeType":"EnumDefinition","src":"221:122:49"},{"body":{"id":5864,"nodeType":"Block","src":"480:37:49","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5857,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5850,"src":"497:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":5858,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5852,"src":"501:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"497:5:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":5861,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5852,"src":"509:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"497:13:49","trueExpression":{"id":5860,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5850,"src":"505:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5856,"id":5863,"nodeType":"Return","src":"490:20:49"}]},"documentation":{"id":5848,"nodeType":"StructuredDocumentation","src":"349:59:49","text":" @dev Returns the largest of two numbers."},"id":5865,"implemented":true,"kind":"function","modifiers":[],"name":"max","nameLocation":"422:3:49","nodeType":"FunctionDefinition","parameters":{"id":5853,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5850,"mutability":"mutable","name":"a","nameLocation":"434:1:49","nodeType":"VariableDeclaration","scope":5865,"src":"426:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5849,"name":"uint256","nodeType":"ElementaryTypeName","src":"426:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5852,"mutability":"mutable","name":"b","nameLocation":"445:1:49","nodeType":"VariableDeclaration","scope":5865,"src":"437:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5851,"name":"uint256","nodeType":"ElementaryTypeName","src":"437:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"425:22:49"},"returnParameters":{"id":5856,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5855,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5865,"src":"471:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5854,"name":"uint256","nodeType":"ElementaryTypeName","src":"471:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"470:9:49"},"scope":6705,"src":"413:104:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5882,"nodeType":"Block","src":"655:37:49","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5877,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5875,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5868,"src":"672:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":5876,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5870,"src":"676:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"672:5:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":5879,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5870,"src":"684:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"672:13:49","trueExpression":{"id":5878,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5868,"src":"680:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5874,"id":5881,"nodeType":"Return","src":"665:20:49"}]},"documentation":{"id":5866,"nodeType":"StructuredDocumentation","src":"523:60:49","text":" @dev Returns the smallest of two numbers."},"id":5883,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"597:3:49","nodeType":"FunctionDefinition","parameters":{"id":5871,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5868,"mutability":"mutable","name":"a","nameLocation":"609:1:49","nodeType":"VariableDeclaration","scope":5883,"src":"601:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5867,"name":"uint256","nodeType":"ElementaryTypeName","src":"601:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5870,"mutability":"mutable","name":"b","nameLocation":"620:1:49","nodeType":"VariableDeclaration","scope":5883,"src":"612:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5869,"name":"uint256","nodeType":"ElementaryTypeName","src":"612:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"600:22:49"},"returnParameters":{"id":5874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5873,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5883,"src":"646:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5872,"name":"uint256","nodeType":"ElementaryTypeName","src":"646:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"645:9:49"},"scope":6705,"src":"588:104:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5905,"nodeType":"Block","src":"876:82:49","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5893,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5886,"src":"931:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":5894,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5888,"src":"935:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"931:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5896,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"930:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5902,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5897,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5886,"src":"941:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":5898,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5888,"src":"945:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"941:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5900,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"940:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"32","id":5901,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"950:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"940:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"930:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5892,"id":5904,"nodeType":"Return","src":"923:28:49"}]},"documentation":{"id":5884,"nodeType":"StructuredDocumentation","src":"698:102:49","text":" @dev Returns the average of two numbers. The result is rounded towards\n zero."},"id":5906,"implemented":true,"kind":"function","modifiers":[],"name":"average","nameLocation":"814:7:49","nodeType":"FunctionDefinition","parameters":{"id":5889,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5886,"mutability":"mutable","name":"a","nameLocation":"830:1:49","nodeType":"VariableDeclaration","scope":5906,"src":"822:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5885,"name":"uint256","nodeType":"ElementaryTypeName","src":"822:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5888,"mutability":"mutable","name":"b","nameLocation":"841:1:49","nodeType":"VariableDeclaration","scope":5906,"src":"833:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5887,"name":"uint256","nodeType":"ElementaryTypeName","src":"833:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"821:22:49"},"returnParameters":{"id":5892,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5891,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5906,"src":"867:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5890,"name":"uint256","nodeType":"ElementaryTypeName","src":"867:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"866:9:49"},"scope":6705,"src":"805:153:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5930,"nodeType":"Block","src":"1228:123:49","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5918,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5916,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5909,"src":"1316:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5917,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1321:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1316:6:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5920,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5909,"src":"1330:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":5921,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1334:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1330:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5923,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1329:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5924,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5911,"src":"1339:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1329:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":5926,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1343:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1329:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5928,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"1316:28:49","trueExpression":{"hexValue":"30","id":5919,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1325:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5915,"id":5929,"nodeType":"Return","src":"1309:35:49"}]},"documentation":{"id":5907,"nodeType":"StructuredDocumentation","src":"964:188:49","text":" @dev Returns the ceiling of the division of two numbers.\n This differs from standard division with `/` in that it rounds up instead\n of rounding down."},"id":5931,"implemented":true,"kind":"function","modifiers":[],"name":"ceilDiv","nameLocation":"1166:7:49","nodeType":"FunctionDefinition","parameters":{"id":5912,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5909,"mutability":"mutable","name":"a","nameLocation":"1182:1:49","nodeType":"VariableDeclaration","scope":5931,"src":"1174:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5908,"name":"uint256","nodeType":"ElementaryTypeName","src":"1174:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5911,"mutability":"mutable","name":"b","nameLocation":"1193:1:49","nodeType":"VariableDeclaration","scope":5931,"src":"1185:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5910,"name":"uint256","nodeType":"ElementaryTypeName","src":"1185:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1173:22:49"},"returnParameters":{"id":5915,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5914,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5931,"src":"1219:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5913,"name":"uint256","nodeType":"ElementaryTypeName","src":"1219:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1218:9:49"},"scope":6705,"src":"1157:194:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6052,"nodeType":"Block","src":"1795:3797:49","statements":[{"id":6051,"nodeType":"UncheckedBlock","src":"1805:3781:49","statements":[{"assignments":[5944],"declarations":[{"constant":false,"id":5944,"mutability":"mutable","name":"prod0","nameLocation":"2134:5:49","nodeType":"VariableDeclaration","scope":6051,"src":"2126:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5943,"name":"uint256","nodeType":"ElementaryTypeName","src":"2126:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5945,"nodeType":"VariableDeclarationStatement","src":"2126:13:49"},{"assignments":[5947],"declarations":[{"constant":false,"id":5947,"mutability":"mutable","name":"prod1","nameLocation":"2206:5:49","nodeType":"VariableDeclaration","scope":6051,"src":"2198:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5946,"name":"uint256","nodeType":"ElementaryTypeName","src":"2198:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5948,"nodeType":"VariableDeclarationStatement","src":"2198:13:49"},{"AST":{"nodeType":"YulBlock","src":"2278:157:49","statements":[{"nodeType":"YulVariableDeclaration","src":"2296:30:49","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2313:1:49"},{"name":"y","nodeType":"YulIdentifier","src":"2316:1:49"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2323:1:49","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2319:3:49"},"nodeType":"YulFunctionCall","src":"2319:6:49"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2306:6:49"},"nodeType":"YulFunctionCall","src":"2306:20:49"},"variables":[{"name":"mm","nodeType":"YulTypedName","src":"2300:2:49","type":""}]},{"nodeType":"YulAssignment","src":"2343:18:49","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2356:1:49"},{"name":"y","nodeType":"YulIdentifier","src":"2359:1:49"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"2352:3:49"},"nodeType":"YulFunctionCall","src":"2352:9:49"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"2343:5:49"}]},{"nodeType":"YulAssignment","src":"2378:43:49","value":{"arguments":[{"arguments":[{"name":"mm","nodeType":"YulIdentifier","src":"2395:2:49"},{"name":"prod0","nodeType":"YulIdentifier","src":"2399:5:49"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2391:3:49"},"nodeType":"YulFunctionCall","src":"2391:14:49"},{"arguments":[{"name":"mm","nodeType":"YulIdentifier","src":"2410:2:49"},{"name":"prod0","nodeType":"YulIdentifier","src":"2414:5:49"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2407:2:49"},"nodeType":"YulFunctionCall","src":"2407:13:49"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2387:3:49"},"nodeType":"YulFunctionCall","src":"2387:34:49"},"variableNames":[{"name":"prod1","nodeType":"YulIdentifier","src":"2378:5:49"}]}]},"evmVersion":"london","externalReferences":[{"declaration":5944,"isOffset":false,"isSlot":false,"src":"2343:5:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"2399:5:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"2414:5:49","valueSize":1},{"declaration":5947,"isOffset":false,"isSlot":false,"src":"2378:5:49","valueSize":1},{"declaration":5934,"isOffset":false,"isSlot":false,"src":"2313:1:49","valueSize":1},{"declaration":5934,"isOffset":false,"isSlot":false,"src":"2356:1:49","valueSize":1},{"declaration":5936,"isOffset":false,"isSlot":false,"src":"2316:1:49","valueSize":1},{"declaration":5936,"isOffset":false,"isSlot":false,"src":"2359:1:49","valueSize":1}],"id":5949,"nodeType":"InlineAssembly","src":"2269:166:49"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5950,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5947,"src":"2516:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5951,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2525:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2516:10:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5958,"nodeType":"IfStatement","src":"2512:75:49","trueBody":{"id":5957,"nodeType":"Block","src":"2528:59:49","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5953,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5944,"src":"2553:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5954,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"2561:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2553:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5942,"id":5956,"nodeType":"Return","src":"2546:26:49"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5960,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"2697:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":5961,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5947,"src":"2711:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2697:19:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":5959,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2689:7:49","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":5963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2689:28:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5964,"nodeType":"ExpressionStatement","src":"2689:28:49"},{"assignments":[5966],"declarations":[{"constant":false,"id":5966,"mutability":"mutable","name":"remainder","nameLocation":"2981:9:49","nodeType":"VariableDeclaration","scope":6051,"src":"2973:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5965,"name":"uint256","nodeType":"ElementaryTypeName","src":"2973:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5967,"nodeType":"VariableDeclarationStatement","src":"2973:17:49"},{"AST":{"nodeType":"YulBlock","src":"3013:291:49","statements":[{"nodeType":"YulAssignment","src":"3082:38:49","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"3102:1:49"},{"name":"y","nodeType":"YulIdentifier","src":"3105:1:49"},{"name":"denominator","nodeType":"YulIdentifier","src":"3108:11:49"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3095:6:49"},"nodeType":"YulFunctionCall","src":"3095:25:49"},"variableNames":[{"name":"remainder","nodeType":"YulIdentifier","src":"3082:9:49"}]},{"nodeType":"YulAssignment","src":"3202:41:49","value":{"arguments":[{"name":"prod1","nodeType":"YulIdentifier","src":"3215:5:49"},{"arguments":[{"name":"remainder","nodeType":"YulIdentifier","src":"3225:9:49"},{"name":"prod0","nodeType":"YulIdentifier","src":"3236:5:49"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3222:2:49"},"nodeType":"YulFunctionCall","src":"3222:20:49"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3211:3:49"},"nodeType":"YulFunctionCall","src":"3211:32:49"},"variableNames":[{"name":"prod1","nodeType":"YulIdentifier","src":"3202:5:49"}]},{"nodeType":"YulAssignment","src":"3260:30:49","value":{"arguments":[{"name":"prod0","nodeType":"YulIdentifier","src":"3273:5:49"},{"name":"remainder","nodeType":"YulIdentifier","src":"3280:9:49"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3269:3:49"},"nodeType":"YulFunctionCall","src":"3269:21:49"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"3260:5:49"}]}]},"evmVersion":"london","externalReferences":[{"declaration":5938,"isOffset":false,"isSlot":false,"src":"3108:11:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"3236:5:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"3260:5:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"3273:5:49","valueSize":1},{"declaration":5947,"isOffset":false,"isSlot":false,"src":"3202:5:49","valueSize":1},{"declaration":5947,"isOffset":false,"isSlot":false,"src":"3215:5:49","valueSize":1},{"declaration":5966,"isOffset":false,"isSlot":false,"src":"3082:9:49","valueSize":1},{"declaration":5966,"isOffset":false,"isSlot":false,"src":"3225:9:49","valueSize":1},{"declaration":5966,"isOffset":false,"isSlot":false,"src":"3280:9:49","valueSize":1},{"declaration":5934,"isOffset":false,"isSlot":false,"src":"3102:1:49","valueSize":1},{"declaration":5936,"isOffset":false,"isSlot":false,"src":"3105:1:49","valueSize":1}],"id":5968,"nodeType":"InlineAssembly","src":"3004:300:49"},{"assignments":[5970],"declarations":[{"constant":false,"id":5970,"mutability":"mutable","name":"twos","nameLocation":"3619:4:49","nodeType":"VariableDeclaration","scope":6051,"src":"3611:12:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5969,"name":"uint256","nodeType":"ElementaryTypeName","src":"3611:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5978,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5977,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5971,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"3626:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5973,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"~","prefix":true,"src":"3641:12:49","subExpression":{"id":5972,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"3642:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":5974,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3656:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3641:16:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5976,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3640:18:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3626:32:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3611:47:49"},{"AST":{"nodeType":"YulBlock","src":"3681:362:49","statements":[{"nodeType":"YulAssignment","src":"3746:37:49","value":{"arguments":[{"name":"denominator","nodeType":"YulIdentifier","src":"3765:11:49"},{"name":"twos","nodeType":"YulIdentifier","src":"3778:4:49"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"3761:3:49"},"nodeType":"YulFunctionCall","src":"3761:22:49"},"variableNames":[{"name":"denominator","nodeType":"YulIdentifier","src":"3746:11:49"}]},{"nodeType":"YulAssignment","src":"3850:25:49","value":{"arguments":[{"name":"prod0","nodeType":"YulIdentifier","src":"3863:5:49"},{"name":"twos","nodeType":"YulIdentifier","src":"3870:4:49"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"3859:3:49"},"nodeType":"YulFunctionCall","src":"3859:16:49"},"variableNames":[{"name":"prod0","nodeType":"YulIdentifier","src":"3850:5:49"}]},{"nodeType":"YulAssignment","src":"3990:39:49","value":{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4010:1:49","type":"","value":"0"},{"name":"twos","nodeType":"YulIdentifier","src":"4013:4:49"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4006:3:49"},"nodeType":"YulFunctionCall","src":"4006:12:49"},{"name":"twos","nodeType":"YulIdentifier","src":"4020:4:49"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"4002:3:49"},"nodeType":"YulFunctionCall","src":"4002:23:49"},{"kind":"number","nodeType":"YulLiteral","src":"4027:1:49","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3998:3:49"},"nodeType":"YulFunctionCall","src":"3998:31:49"},"variableNames":[{"name":"twos","nodeType":"YulIdentifier","src":"3990:4:49"}]}]},"evmVersion":"london","externalReferences":[{"declaration":5938,"isOffset":false,"isSlot":false,"src":"3746:11:49","valueSize":1},{"declaration":5938,"isOffset":false,"isSlot":false,"src":"3765:11:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"3850:5:49","valueSize":1},{"declaration":5944,"isOffset":false,"isSlot":false,"src":"3863:5:49","valueSize":1},{"declaration":5970,"isOffset":false,"isSlot":false,"src":"3778:4:49","valueSize":1},{"declaration":5970,"isOffset":false,"isSlot":false,"src":"3870:4:49","valueSize":1},{"declaration":5970,"isOffset":false,"isSlot":false,"src":"3990:4:49","valueSize":1},{"declaration":5970,"isOffset":false,"isSlot":false,"src":"4013:4:49","valueSize":1},{"declaration":5970,"isOffset":false,"isSlot":false,"src":"4020:4:49","valueSize":1}],"id":5979,"nodeType":"InlineAssembly","src":"3672:371:49"},{"expression":{"id":5984,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5980,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5944,"src":"4109:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5981,"name":"prod1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5947,"src":"4118:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5982,"name":"twos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5970,"src":"4126:4:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4118:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4109:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5985,"nodeType":"ExpressionStatement","src":"4109:21:49"},{"assignments":[5987],"declarations":[{"constant":false,"id":5987,"mutability":"mutable","name":"inverse","nameLocation":"4456:7:49","nodeType":"VariableDeclaration","scope":6051,"src":"4448:15:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5986,"name":"uint256","nodeType":"ElementaryTypeName","src":"4448:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5994,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5990,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"33","id":5988,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4467:1:49","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5989,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4471:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4467:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5991,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4466:17:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"hexValue":"32","id":5992,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4486:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"4466:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4448:39:49"},{"expression":{"id":6001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5995,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4704:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6000,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":5996,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4715:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5999,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5997,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4719:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5998,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4733:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4719:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4715:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4704:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6002,"nodeType":"ExpressionStatement","src":"4704:36:49"},{"expression":{"id":6009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6003,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4773:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":6004,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4784:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6005,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4788:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6006,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4802:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4788:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4784:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4773:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6010,"nodeType":"ExpressionStatement","src":"4773:36:49"},{"expression":{"id":6017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6011,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4843:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6016,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":6012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4854:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6015,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6013,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4858:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6014,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4872:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4858:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4854:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4843:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6018,"nodeType":"ExpressionStatement","src":"4843:36:49"},{"expression":{"id":6025,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6019,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4913:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6024,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":6020,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4924:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6021,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4928:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6022,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4942:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4928:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4924:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4913:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6026,"nodeType":"ExpressionStatement","src":"4913:36:49"},{"expression":{"id":6033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6027,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"4983:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6032,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":6028,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4994:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6029,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"4998:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6030,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"5012:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4998:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4994:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4983:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6034,"nodeType":"ExpressionStatement","src":"4983:36:49"},{"expression":{"id":6041,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6035,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"5054:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":6036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5065:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6039,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6037,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5938,"src":"5069:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6038,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"5083:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5069:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5065:25:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5054:36:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6042,"nodeType":"ExpressionStatement","src":"5054:36:49"},{"expression":{"id":6047,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6043,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5941,"src":"5524:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6044,"name":"prod0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5944,"src":"5533:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6045,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5987,"src":"5541:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5533:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5524:24:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6048,"nodeType":"ExpressionStatement","src":"5524:24:49"},{"expression":{"id":6049,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5941,"src":"5569:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5942,"id":6050,"nodeType":"Return","src":"5562:13:49"}]}]},"documentation":{"id":5932,"nodeType":"StructuredDocumentation","src":"1357:305:49","text":" @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n with further edits by Uniswap Labs also under MIT license."},"id":6053,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"1676:6:49","nodeType":"FunctionDefinition","parameters":{"id":5939,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5934,"mutability":"mutable","name":"x","nameLocation":"1700:1:49","nodeType":"VariableDeclaration","scope":6053,"src":"1692:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5933,"name":"uint256","nodeType":"ElementaryTypeName","src":"1692:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5936,"mutability":"mutable","name":"y","nameLocation":"1719:1:49","nodeType":"VariableDeclaration","scope":6053,"src":"1711:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5935,"name":"uint256","nodeType":"ElementaryTypeName","src":"1711:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5938,"mutability":"mutable","name":"denominator","nameLocation":"1738:11:49","nodeType":"VariableDeclaration","scope":6053,"src":"1730:19:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5937,"name":"uint256","nodeType":"ElementaryTypeName","src":"1730:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1682:73:49"},"returnParameters":{"id":5942,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5941,"mutability":"mutable","name":"result","nameLocation":"1787:6:49","nodeType":"VariableDeclaration","scope":6053,"src":"1779:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5940,"name":"uint256","nodeType":"ElementaryTypeName","src":"1779:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1778:16:49"},"scope":6705,"src":"1667:3925:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6096,"nodeType":"Block","src":"5872:189:49","statements":[{"assignments":[6069],"declarations":[{"constant":false,"id":6069,"mutability":"mutable","name":"result","nameLocation":"5890:6:49","nodeType":"VariableDeclaration","scope":6096,"src":"5882:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6068,"name":"uint256","nodeType":"ElementaryTypeName","src":"5882:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6075,"initialValue":{"arguments":[{"id":6071,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6056,"src":"5906:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":6072,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6058,"src":"5909:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":6073,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6060,"src":"5912:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6070,"name":"mulDiv","nodeType":"Identifier","overloadedDeclarations":[6053,6097],"referencedDeclaration":6053,"src":"5899:6:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":6074,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5899:25:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5882:42:49"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":6087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"id":6079,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6076,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6063,"src":"5938:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6077,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5847,"src":"5950:8:49","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$5847_$","typeString":"type(enum Math.Rounding)"}},"id":6078,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":5845,"src":"5950:11:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"src":"5938:23:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":6081,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6056,"src":"5972:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":6082,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6058,"src":"5975:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":6083,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6060,"src":"5978:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6080,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5965:6:49","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":6084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5965:25:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5993:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5965:29:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5938:56:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6093,"nodeType":"IfStatement","src":"5934:98:49","trueBody":{"id":6092,"nodeType":"Block","src":"5996:36:49","statements":[{"expression":{"id":6090,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6088,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6069,"src":"6010:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":6089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6020:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"6010:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6091,"nodeType":"ExpressionStatement","src":"6010:11:49"}]}},{"expression":{"id":6094,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6069,"src":"6048:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6067,"id":6095,"nodeType":"Return","src":"6041:13:49"}]},"documentation":{"id":6054,"nodeType":"StructuredDocumentation","src":"5598:121:49","text":" @notice Calculates x * y / denominator with full precision, following the selected rounding direction."},"id":6097,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"5733:6:49","nodeType":"FunctionDefinition","parameters":{"id":6064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6056,"mutability":"mutable","name":"x","nameLocation":"5757:1:49","nodeType":"VariableDeclaration","scope":6097,"src":"5749:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6055,"name":"uint256","nodeType":"ElementaryTypeName","src":"5749:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6058,"mutability":"mutable","name":"y","nameLocation":"5776:1:49","nodeType":"VariableDeclaration","scope":6097,"src":"5768:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6057,"name":"uint256","nodeType":"ElementaryTypeName","src":"5768:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6060,"mutability":"mutable","name":"denominator","nameLocation":"5795:11:49","nodeType":"VariableDeclaration","scope":6097,"src":"5787:19:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6059,"name":"uint256","nodeType":"ElementaryTypeName","src":"5787:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6063,"mutability":"mutable","name":"rounding","nameLocation":"5825:8:49","nodeType":"VariableDeclaration","scope":6097,"src":"5816:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"typeName":{"id":6062,"nodeType":"UserDefinedTypeName","pathNode":{"id":6061,"name":"Rounding","nodeType":"IdentifierPath","referencedDeclaration":5847,"src":"5816:8:49"},"referencedDeclaration":5847,"src":"5816:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"5739:100:49"},"returnParameters":{"id":6067,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6066,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6097,"src":"5863:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6065,"name":"uint256","nodeType":"ElementaryTypeName","src":"5863:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5862:9:49"},"scope":6705,"src":"5724:337:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6208,"nodeType":"Block","src":"6337:1585:49","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6107,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6105,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"6351:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":6106,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6356:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6351:6:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6111,"nodeType":"IfStatement","src":"6347:45:49","trueBody":{"id":6110,"nodeType":"Block","src":"6359:33:49","statements":[{"expression":{"hexValue":"30","id":6108,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6380:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":6104,"id":6109,"nodeType":"Return","src":"6373:8:49"}]}},{"assignments":[6113],"declarations":[{"constant":false,"id":6113,"mutability":"mutable","name":"result","nameLocation":"7079:6:49","nodeType":"VariableDeclaration","scope":6208,"src":"7071:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6112,"name":"uint256","nodeType":"ElementaryTypeName","src":"7071:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6122,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":6114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7088:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6119,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":6116,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7099:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6115,"name":"log2","nodeType":"Identifier","overloadedDeclarations":[6377,6413],"referencedDeclaration":6377,"src":"7094:4:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":6117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7094:7:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6118,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7105:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7094:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6120,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7093:14:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7088:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7071:36:49"},{"id":6207,"nodeType":"UncheckedBlock","src":"7508:408:49","statements":[{"expression":{"id":6132,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6123,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7532:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6131,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6124,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7542:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6125,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7551:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6126,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7555:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7551:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7542:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6129,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7541:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7566:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7541:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7532:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6133,"nodeType":"ExpressionStatement","src":"7532:35:49"},{"expression":{"id":6143,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6134,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7581:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6142,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6135,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7591:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6136,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7600:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6137,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7604:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7600:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7591:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6140,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7590:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7615:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7590:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7581:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6144,"nodeType":"ExpressionStatement","src":"7581:35:49"},{"expression":{"id":6154,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6145,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7630:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6146,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7640:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6149,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6147,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7649:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6148,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7653:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7649:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7640:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6151,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7639:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6152,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7664:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7639:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7630:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6155,"nodeType":"ExpressionStatement","src":"7630:35:49"},{"expression":{"id":6165,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6156,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7679:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6157,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7689:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6158,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7698:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6159,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7702:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7698:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7689:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6162,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7688:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6163,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7713:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7688:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7679:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6166,"nodeType":"ExpressionStatement","src":"7679:35:49"},{"expression":{"id":6176,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6167,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7728:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6175,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6172,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6168,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7738:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6169,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7747:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6170,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7751:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7747:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7738:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6173,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7737:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6174,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7762:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7737:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7728:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6177,"nodeType":"ExpressionStatement","src":"7728:35:49"},{"expression":{"id":6187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6178,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7777:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6179,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7787:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6180,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7796:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6181,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7800:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7796:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7787:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6184,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7786:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6185,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7811:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7786:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7777:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6188,"nodeType":"ExpressionStatement","src":"7777:35:49"},{"expression":{"id":6198,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6189,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7826:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6197,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6190,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7836:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6191,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7845:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6192,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7849:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7845:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7836:19:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6195,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7835:21:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7860:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7835:26:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7826:35:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6199,"nodeType":"ExpressionStatement","src":"7826:35:49"},{"expression":{"arguments":[{"id":6201,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7886:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6202,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6100,"src":"7894:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":6203,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6113,"src":"7898:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7894:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6200,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5883,"src":"7882:3:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":6205,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7882:23:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6104,"id":6206,"nodeType":"Return","src":"7875:30:49"}]}]},"documentation":{"id":6098,"nodeType":"StructuredDocumentation","src":"6067:208:49","text":" @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11)."},"id":6209,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"6289:4:49","nodeType":"FunctionDefinition","parameters":{"id":6101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6100,"mutability":"mutable","name":"a","nameLocation":"6302:1:49","nodeType":"VariableDeclaration","scope":6209,"src":"6294:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6099,"name":"uint256","nodeType":"ElementaryTypeName","src":"6294:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6293:11:49"},"returnParameters":{"id":6104,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6103,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6209,"src":"6328:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6102,"name":"uint256","nodeType":"ElementaryTypeName","src":"6328:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6327:9:49"},"scope":6705,"src":"6280:1642:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6244,"nodeType":"Block","src":"8098:161:49","statements":[{"id":6243,"nodeType":"UncheckedBlock","src":"8108:145:49","statements":[{"assignments":[6221],"declarations":[{"constant":false,"id":6221,"mutability":"mutable","name":"result","nameLocation":"8140:6:49","nodeType":"VariableDeclaration","scope":6243,"src":"8132:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6220,"name":"uint256","nodeType":"ElementaryTypeName","src":"8132:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6225,"initialValue":{"arguments":[{"id":6223,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6212,"src":"8154:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6222,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[6209,6245],"referencedDeclaration":6209,"src":"8149:4:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":6224,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8149:7:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8132:24:49"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6226,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6221,"src":"8177:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":6236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"id":6230,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6227,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6215,"src":"8187:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6228,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5847,"src":"8199:8:49","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$5847_$","typeString":"type(enum Math.Rounding)"}},"id":6229,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":5845,"src":"8199:11:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"src":"8187:23:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6233,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6231,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6221,"src":"8214:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":6232,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6221,"src":"8223:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8214:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":6234,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6212,"src":"8232:1:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8214:19:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8187:46:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":6238,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8240:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":6239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"8187:54:49","trueExpression":{"hexValue":"31","id":6237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8236:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":6240,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8186:56:49","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"8177:65:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6219,"id":6242,"nodeType":"Return","src":"8170:72:49"}]}]},"documentation":{"id":6210,"nodeType":"StructuredDocumentation","src":"7928:89:49","text":" @notice Calculates sqrt(a), following the selected rounding direction."},"id":6245,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"8031:4:49","nodeType":"FunctionDefinition","parameters":{"id":6216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6212,"mutability":"mutable","name":"a","nameLocation":"8044:1:49","nodeType":"VariableDeclaration","scope":6245,"src":"8036:9:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6211,"name":"uint256","nodeType":"ElementaryTypeName","src":"8036:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6215,"mutability":"mutable","name":"rounding","nameLocation":"8056:8:49","nodeType":"VariableDeclaration","scope":6245,"src":"8047:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"typeName":{"id":6214,"nodeType":"UserDefinedTypeName","pathNode":{"id":6213,"name":"Rounding","nodeType":"IdentifierPath","referencedDeclaration":5847,"src":"8047:8:49"},"referencedDeclaration":5847,"src":"8047:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"8035:30:49"},"returnParameters":{"id":6219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6218,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6245,"src":"8089:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6217,"name":"uint256","nodeType":"ElementaryTypeName","src":"8089:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8088:9:49"},"scope":6705,"src":"8022:237:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6376,"nodeType":"Block","src":"8444:922:49","statements":[{"assignments":[6254],"declarations":[{"constant":false,"id":6254,"mutability":"mutable","name":"result","nameLocation":"8462:6:49","nodeType":"VariableDeclaration","scope":6376,"src":"8454:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6253,"name":"uint256","nodeType":"ElementaryTypeName","src":"8454:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6256,"initialValue":{"hexValue":"30","id":6255,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8471:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8454:18:49"},{"id":6373,"nodeType":"UncheckedBlock","src":"8482:855:49","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6257,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8510:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313238","id":6258,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8519:3:49","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8510:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8525:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8510:16:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6271,"nodeType":"IfStatement","src":"8506:99:49","trueBody":{"id":6270,"nodeType":"Block","src":"8528:77:49","statements":[{"expression":{"id":6264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6262,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8546:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"313238","id":6263,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8556:3:49","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8546:13:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6265,"nodeType":"ExpressionStatement","src":"8546:13:49"},{"expression":{"id":6268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6266,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"8577:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"313238","id":6267,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8587:3:49","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"8577:13:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6269,"nodeType":"ExpressionStatement","src":"8577:13:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6272,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8622:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":6273,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8631:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8622:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6275,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8636:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8622:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6286,"nodeType":"IfStatement","src":"8618:96:49","trueBody":{"id":6285,"nodeType":"Block","src":"8639:75:49","statements":[{"expression":{"id":6279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6277,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8657:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3634","id":6278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8667:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8657:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6280,"nodeType":"ExpressionStatement","src":"8657:12:49"},{"expression":{"id":6283,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6281,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"8687:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3634","id":6282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8697:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"8687:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6284,"nodeType":"ExpressionStatement","src":"8687:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6287,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8731:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3332","id":6288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8740:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8731:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6290,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8745:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8731:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6301,"nodeType":"IfStatement","src":"8727:96:49","trueBody":{"id":6300,"nodeType":"Block","src":"8748:75:49","statements":[{"expression":{"id":6294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6292,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8766:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3332","id":6293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8776:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8766:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6295,"nodeType":"ExpressionStatement","src":"8766:12:49"},{"expression":{"id":6298,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6296,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"8796:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3332","id":6297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8806:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"8796:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6299,"nodeType":"ExpressionStatement","src":"8796:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6306,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6302,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8840:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3136","id":6303,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8849:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8840:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8854:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8840:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6316,"nodeType":"IfStatement","src":"8836:96:49","trueBody":{"id":6315,"nodeType":"Block","src":"8857:75:49","statements":[{"expression":{"id":6309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6307,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8875:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3136","id":6308,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8885:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8875:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6310,"nodeType":"ExpressionStatement","src":"8875:12:49"},{"expression":{"id":6313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6311,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"8905:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":6312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8915:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"8905:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6314,"nodeType":"ExpressionStatement","src":"8905:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6319,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6317,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8949:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"38","id":6318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8958:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"8949:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8962:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8949:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6331,"nodeType":"IfStatement","src":"8945:93:49","trueBody":{"id":6330,"nodeType":"Block","src":"8965:73:49","statements":[{"expression":{"id":6324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6322,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"8983:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"38","id":6323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8993:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"8983:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6325,"nodeType":"ExpressionStatement","src":"8983:11:49"},{"expression":{"id":6328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6326,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"9012:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":6327,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9022:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"9012:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6329,"nodeType":"ExpressionStatement","src":"9012:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6336,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6332,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"9055:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"34","id":6333,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9064:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9055:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9068:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9055:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6346,"nodeType":"IfStatement","src":"9051:93:49","trueBody":{"id":6345,"nodeType":"Block","src":"9071:73:49","statements":[{"expression":{"id":6339,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6337,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"9089:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":6338,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9099:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9089:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6340,"nodeType":"ExpressionStatement","src":"9089:11:49"},{"expression":{"id":6343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6341,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"9118:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":6342,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9128:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9118:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6344,"nodeType":"ExpressionStatement","src":"9118:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6347,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"9161:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"32","id":6348,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9170:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9161:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9174:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9161:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6361,"nodeType":"IfStatement","src":"9157:93:49","trueBody":{"id":6360,"nodeType":"Block","src":"9177:73:49","statements":[{"expression":{"id":6354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6352,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"9195:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"32","id":6353,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9205:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9195:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6355,"nodeType":"ExpressionStatement","src":"9195:11:49"},{"expression":{"id":6358,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6356,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"9224:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":6357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9234:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9224:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6359,"nodeType":"ExpressionStatement","src":"9224:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6362,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6248,"src":"9267:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":6363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9276:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"9267:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6365,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9280:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9267:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6372,"nodeType":"IfStatement","src":"9263:64:49","trueBody":{"id":6371,"nodeType":"Block","src":"9283:44:49","statements":[{"expression":{"id":6369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6367,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"9301:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":6368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9311:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"9301:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6370,"nodeType":"ExpressionStatement","src":"9301:11:49"}]}}]},{"expression":{"id":6374,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6254,"src":"9353:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6252,"id":6375,"nodeType":"Return","src":"9346:13:49"}]},"documentation":{"id":6246,"nodeType":"StructuredDocumentation","src":"8265:113:49","text":" @dev Return the log in base 2, rounded down, of a positive value.\n Returns 0 if given 0."},"id":6377,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"8392:4:49","nodeType":"FunctionDefinition","parameters":{"id":6249,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6248,"mutability":"mutable","name":"value","nameLocation":"8405:5:49","nodeType":"VariableDeclaration","scope":6377,"src":"8397:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6247,"name":"uint256","nodeType":"ElementaryTypeName","src":"8397:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8396:15:49"},"returnParameters":{"id":6252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6251,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6377,"src":"8435:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6250,"name":"uint256","nodeType":"ElementaryTypeName","src":"8435:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8434:9:49"},"scope":6705,"src":"8383:983:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6412,"nodeType":"Block","src":"9599:165:49","statements":[{"id":6411,"nodeType":"UncheckedBlock","src":"9609:149:49","statements":[{"assignments":[6389],"declarations":[{"constant":false,"id":6389,"mutability":"mutable","name":"result","nameLocation":"9641:6:49","nodeType":"VariableDeclaration","scope":6411,"src":"9633:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6388,"name":"uint256","nodeType":"ElementaryTypeName","src":"9633:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6393,"initialValue":{"arguments":[{"id":6391,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6380,"src":"9655:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6390,"name":"log2","nodeType":"Identifier","overloadedDeclarations":[6377,6413],"referencedDeclaration":6377,"src":"9650:4:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":6392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9650:11:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9633:28:49"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6394,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6389,"src":"9682:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":6404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"id":6398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6395,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6383,"src":"9692:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6396,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5847,"src":"9704:8:49","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$5847_$","typeString":"type(enum Math.Rounding)"}},"id":6397,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":5845,"src":"9704:11:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"src":"9692:23:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":6399,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9719:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"id":6400,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6389,"src":"9724:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9719:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":6402,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6380,"src":"9733:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9719:19:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9692:46:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":6406,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9745:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":6407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9692:54:49","trueExpression":{"hexValue":"31","id":6405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9741:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":6408,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9691:56:49","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"9682:65:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6387,"id":6410,"nodeType":"Return","src":"9675:72:49"}]}]},"documentation":{"id":6378,"nodeType":"StructuredDocumentation","src":"9372:142:49","text":" @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":6413,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"9528:4:49","nodeType":"FunctionDefinition","parameters":{"id":6384,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6380,"mutability":"mutable","name":"value","nameLocation":"9541:5:49","nodeType":"VariableDeclaration","scope":6413,"src":"9533:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6379,"name":"uint256","nodeType":"ElementaryTypeName","src":"9533:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6383,"mutability":"mutable","name":"rounding","nameLocation":"9557:8:49","nodeType":"VariableDeclaration","scope":6413,"src":"9548:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"typeName":{"id":6382,"nodeType":"UserDefinedTypeName","pathNode":{"id":6381,"name":"Rounding","nodeType":"IdentifierPath","referencedDeclaration":5847,"src":"9548:8:49"},"referencedDeclaration":5847,"src":"9548:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"9532:34:49"},"returnParameters":{"id":6387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6386,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6413,"src":"9590:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6385,"name":"uint256","nodeType":"ElementaryTypeName","src":"9590:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9589:9:49"},"scope":6705,"src":"9519:245:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6541,"nodeType":"Block","src":"9951:828:49","statements":[{"assignments":[6422],"declarations":[{"constant":false,"id":6422,"mutability":"mutable","name":"result","nameLocation":"9969:6:49","nodeType":"VariableDeclaration","scope":6541,"src":"9961:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6421,"name":"uint256","nodeType":"ElementaryTypeName","src":"9961:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6424,"initialValue":{"hexValue":"30","id":6423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9978:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"9961:18:49"},{"id":6538,"nodeType":"UncheckedBlock","src":"9989:761:49","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6425,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10017:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":6428,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6426,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10026:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":6427,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10030:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10026:6:49","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"10017:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6441,"nodeType":"IfStatement","src":"10013:99:49","trueBody":{"id":6440,"nodeType":"Block","src":"10034:78:49","statements":[{"expression":{"id":6434,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6430,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10052:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":6433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6431,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10061:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":6432,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10065:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10061:6:49","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"10052:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6435,"nodeType":"ExpressionStatement","src":"10052:15:49"},{"expression":{"id":6438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6436,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10085:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3634","id":6437,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10095:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10085:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6439,"nodeType":"ExpressionStatement","src":"10085:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6442,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10129:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":6445,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6443,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10138:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":6444,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10142:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10138:6:49","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"10129:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6458,"nodeType":"IfStatement","src":"10125:99:49","trueBody":{"id":6457,"nodeType":"Block","src":"10146:78:49","statements":[{"expression":{"id":6451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6447,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10164:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":6450,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10173:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":6449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10177:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10173:6:49","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"10164:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6452,"nodeType":"ExpressionStatement","src":"10164:15:49"},{"expression":{"id":6455,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6453,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10197:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3332","id":6454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10207:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"10197:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6456,"nodeType":"ExpressionStatement","src":"10197:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6459,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10241:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":6462,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6460,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10250:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":6461,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10254:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10250:6:49","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"10241:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6475,"nodeType":"IfStatement","src":"10237:99:49","trueBody":{"id":6474,"nodeType":"Block","src":"10258:78:49","statements":[{"expression":{"id":6468,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6464,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10276:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":6467,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10285:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":6466,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10289:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10285:6:49","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"10276:15:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6469,"nodeType":"ExpressionStatement","src":"10276:15:49"},{"expression":{"id":6472,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6470,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10309:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":6471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10319:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"10309:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6473,"nodeType":"ExpressionStatement","src":"10309:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6476,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10353:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":6479,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10362:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":6478,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10366:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10362:5:49","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"10353:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6492,"nodeType":"IfStatement","src":"10349:96:49","trueBody":{"id":6491,"nodeType":"Block","src":"10369:76:49","statements":[{"expression":{"id":6485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6481,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10387:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":6484,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10396:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":6483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10400:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10396:5:49","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"10387:14:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6486,"nodeType":"ExpressionStatement","src":"10387:14:49"},{"expression":{"id":6489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6487,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10419:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":6488,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10429:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"10419:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6490,"nodeType":"ExpressionStatement","src":"10419:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6493,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10462:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":6496,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6494,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10471:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":6495,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10475:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10471:5:49","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"10462:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6509,"nodeType":"IfStatement","src":"10458:96:49","trueBody":{"id":6508,"nodeType":"Block","src":"10478:76:49","statements":[{"expression":{"id":6502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6498,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10496:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":6501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6499,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10505:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":6500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10509:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10505:5:49","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"10496:14:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6503,"nodeType":"ExpressionStatement","src":"10496:14:49"},{"expression":{"id":6506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6504,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10528:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":6505,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10538:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10528:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6507,"nodeType":"ExpressionStatement","src":"10528:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6510,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10571:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":6513,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10580:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":6512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10584:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10580:5:49","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"10571:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6526,"nodeType":"IfStatement","src":"10567:96:49","trueBody":{"id":6525,"nodeType":"Block","src":"10587:76:49","statements":[{"expression":{"id":6519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6515,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10605:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":6518,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10614:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":6517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10618:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10614:5:49","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"10605:14:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6520,"nodeType":"ExpressionStatement","src":"10605:14:49"},{"expression":{"id":6523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6521,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10637:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":6522,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10647:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10637:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6524,"nodeType":"ExpressionStatement","src":"10637:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6531,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6527,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6416,"src":"10680:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"id":6530,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10689:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"31","id":6529,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10693:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10689:5:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"}},"src":"10680:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6537,"nodeType":"IfStatement","src":"10676:64:49","trueBody":{"id":6536,"nodeType":"Block","src":"10696:44:49","statements":[{"expression":{"id":6534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6532,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10714:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":6533,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10724:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10714:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6535,"nodeType":"ExpressionStatement","src":"10714:11:49"}]}}]},{"expression":{"id":6539,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6422,"src":"10766:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6420,"id":6540,"nodeType":"Return","src":"10759:13:49"}]},"documentation":{"id":6414,"nodeType":"StructuredDocumentation","src":"9770:114:49","text":" @dev Return the log in base 10, rounded down, of a positive value.\n Returns 0 if given 0."},"id":6542,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"9898:5:49","nodeType":"FunctionDefinition","parameters":{"id":6417,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6416,"mutability":"mutable","name":"value","nameLocation":"9912:5:49","nodeType":"VariableDeclaration","scope":6542,"src":"9904:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6415,"name":"uint256","nodeType":"ElementaryTypeName","src":"9904:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9903:15:49"},"returnParameters":{"id":6420,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6419,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6542,"src":"9942:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6418,"name":"uint256","nodeType":"ElementaryTypeName","src":"9942:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9941:9:49"},"scope":6705,"src":"9889:890:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6577,"nodeType":"Block","src":"11014:165:49","statements":[{"id":6576,"nodeType":"UncheckedBlock","src":"11024:149:49","statements":[{"assignments":[6554],"declarations":[{"constant":false,"id":6554,"mutability":"mutable","name":"result","nameLocation":"11056:6:49","nodeType":"VariableDeclaration","scope":6576,"src":"11048:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6553,"name":"uint256","nodeType":"ElementaryTypeName","src":"11048:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6558,"initialValue":{"arguments":[{"id":6556,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6545,"src":"11071:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6555,"name":"log10","nodeType":"Identifier","overloadedDeclarations":[6542,6578],"referencedDeclaration":6542,"src":"11065:5:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":6557,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11065:12:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11048:29:49"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6574,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6559,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6554,"src":"11098:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":6569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"id":6563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6560,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6548,"src":"11108:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6561,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5847,"src":"11120:8:49","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$5847_$","typeString":"type(enum Math.Rounding)"}},"id":6562,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":5845,"src":"11120:11:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"src":"11108:23:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6566,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":6564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11135:2:49","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":6565,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6554,"src":"11139:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11135:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":6567,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6545,"src":"11148:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11135:18:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11108:45:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":6571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11160:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":6572,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"11108:53:49","trueExpression":{"hexValue":"31","id":6570,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11156:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":6573,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11107:55:49","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"11098:64:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6552,"id":6575,"nodeType":"Return","src":"11091:71:49"}]}]},"documentation":{"id":6543,"nodeType":"StructuredDocumentation","src":"10785:143:49","text":" @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":6578,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"10942:5:49","nodeType":"FunctionDefinition","parameters":{"id":6549,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6545,"mutability":"mutable","name":"value","nameLocation":"10956:5:49","nodeType":"VariableDeclaration","scope":6578,"src":"10948:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6544,"name":"uint256","nodeType":"ElementaryTypeName","src":"10948:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6548,"mutability":"mutable","name":"rounding","nameLocation":"10972:8:49","nodeType":"VariableDeclaration","scope":6578,"src":"10963:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"typeName":{"id":6547,"nodeType":"UserDefinedTypeName","pathNode":{"id":6546,"name":"Rounding","nodeType":"IdentifierPath","referencedDeclaration":5847,"src":"10963:8:49"},"referencedDeclaration":5847,"src":"10963:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"10947:34:49"},"returnParameters":{"id":6552,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6551,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6578,"src":"11005:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6550,"name":"uint256","nodeType":"ElementaryTypeName","src":"11005:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11004:9:49"},"scope":6705,"src":"10933:246:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6664,"nodeType":"Block","src":"11493:600:49","statements":[{"assignments":[6587],"declarations":[{"constant":false,"id":6587,"mutability":"mutable","name":"result","nameLocation":"11511:6:49","nodeType":"VariableDeclaration","scope":6664,"src":"11503:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6586,"name":"uint256","nodeType":"ElementaryTypeName","src":"11503:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6589,"initialValue":{"hexValue":"30","id":6588,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11520:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"11503:18:49"},{"id":6661,"nodeType":"UncheckedBlock","src":"11531:533:49","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6590,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11559:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313238","id":6591,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11568:3:49","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"11559:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6593,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11574:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11559:16:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6604,"nodeType":"IfStatement","src":"11555:98:49","trueBody":{"id":6603,"nodeType":"Block","src":"11577:76:49","statements":[{"expression":{"id":6597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6595,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11595:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"313238","id":6596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11605:3:49","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"11595:13:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6598,"nodeType":"ExpressionStatement","src":"11595:13:49"},{"expression":{"id":6601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6599,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"11626:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":6600,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11636:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11626:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6602,"nodeType":"ExpressionStatement","src":"11626:12:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6609,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6605,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11670:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":6606,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11679:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"11670:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11684:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11670:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6619,"nodeType":"IfStatement","src":"11666:95:49","trueBody":{"id":6618,"nodeType":"Block","src":"11687:74:49","statements":[{"expression":{"id":6612,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6610,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11705:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3634","id":6611,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11715:2:49","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"11705:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6613,"nodeType":"ExpressionStatement","src":"11705:12:49"},{"expression":{"id":6616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6614,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"11735:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":6615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11745:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"11735:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6617,"nodeType":"ExpressionStatement","src":"11735:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6622,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6620,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11778:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3332","id":6621,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11787:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"11778:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11792:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11778:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6634,"nodeType":"IfStatement","src":"11774:95:49","trueBody":{"id":6633,"nodeType":"Block","src":"11795:74:49","statements":[{"expression":{"id":6627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6625,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11813:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3332","id":6626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11823:2:49","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"11813:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6628,"nodeType":"ExpressionStatement","src":"11813:12:49"},{"expression":{"id":6631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6629,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"11843:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":6630,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11853:1:49","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"11843:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6632,"nodeType":"ExpressionStatement","src":"11843:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6635,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11886:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3136","id":6636,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11895:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11886:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6638,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11900:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11886:15:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6649,"nodeType":"IfStatement","src":"11882:95:49","trueBody":{"id":6648,"nodeType":"Block","src":"11903:74:49","statements":[{"expression":{"id":6642,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6640,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11921:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3136","id":6641,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11931:2:49","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"11921:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6643,"nodeType":"ExpressionStatement","src":"11921:12:49"},{"expression":{"id":6646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6644,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"11951:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":6645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11961:1:49","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"11951:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6647,"nodeType":"ExpressionStatement","src":"11951:11:49"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6650,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6581,"src":"11994:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"38","id":6651,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12003:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"11994:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":6653,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12007:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11994:14:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6660,"nodeType":"IfStatement","src":"11990:64:49","trueBody":{"id":6659,"nodeType":"Block","src":"12010:44:49","statements":[{"expression":{"id":6657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6655,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"12028:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":6656,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12038:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"12028:11:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6658,"nodeType":"ExpressionStatement","src":"12028:11:49"}]}}]},{"expression":{"id":6662,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"12080:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6585,"id":6663,"nodeType":"Return","src":"12073:13:49"}]},"documentation":{"id":6579,"nodeType":"StructuredDocumentation","src":"11185:240:49","text":" @dev Return the log in base 256, rounded down, of a positive value.\n Returns 0 if given 0.\n Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string."},"id":6665,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"11439:6:49","nodeType":"FunctionDefinition","parameters":{"id":6582,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6581,"mutability":"mutable","name":"value","nameLocation":"11454:5:49","nodeType":"VariableDeclaration","scope":6665,"src":"11446:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6580,"name":"uint256","nodeType":"ElementaryTypeName","src":"11446:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11445:15:49"},"returnParameters":{"id":6585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6584,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6665,"src":"11484:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6583,"name":"uint256","nodeType":"ElementaryTypeName","src":"11484:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11483:9:49"},"scope":6705,"src":"11430:663:49","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6703,"nodeType":"Block","src":"12329:173:49","statements":[{"id":6702,"nodeType":"UncheckedBlock","src":"12339:157:49","statements":[{"assignments":[6677],"declarations":[{"constant":false,"id":6677,"mutability":"mutable","name":"result","nameLocation":"12371:6:49","nodeType":"VariableDeclaration","scope":6702,"src":"12363:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6676,"name":"uint256","nodeType":"ElementaryTypeName","src":"12363:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":6681,"initialValue":{"arguments":[{"id":6679,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6668,"src":"12387:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6678,"name":"log256","nodeType":"Identifier","overloadedDeclarations":[6665,6704],"referencedDeclaration":6665,"src":"12380:6:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":6680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12380:13:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12363:30:49"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6682,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6677,"src":"12414:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":6695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"id":6686,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6683,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6671,"src":"12424:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6684,"name":"Rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5847,"src":"12436:8:49","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Rounding_$5847_$","typeString":"type(enum Math.Rounding)"}},"id":6685,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"Up","nodeType":"MemberAccess","referencedDeclaration":5845,"src":"12436:11:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"src":"12424:23:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6692,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":6687,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12451:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6688,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6677,"src":"12457:6:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"38","id":6689,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12466:1:49","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"12457:10:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":6691,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12456:12:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12451:17:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":6693,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6668,"src":"12471:5:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12451:25:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12424:52:49","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":6697,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12483:1:49","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":6698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"12424:60:49","trueExpression":{"hexValue":"31","id":6696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12479:1:49","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":6699,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12423:62:49","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"12414:71:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6675,"id":6701,"nodeType":"Return","src":"12407:78:49"}]}]},"documentation":{"id":6666,"nodeType":"StructuredDocumentation","src":"12099:143:49","text":" @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":6704,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"12256:6:49","nodeType":"FunctionDefinition","parameters":{"id":6672,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6668,"mutability":"mutable","name":"value","nameLocation":"12271:5:49","nodeType":"VariableDeclaration","scope":6704,"src":"12263:13:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6667,"name":"uint256","nodeType":"ElementaryTypeName","src":"12263:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6671,"mutability":"mutable","name":"rounding","nameLocation":"12287:8:49","nodeType":"VariableDeclaration","scope":6704,"src":"12278:17:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"},"typeName":{"id":6670,"nodeType":"UserDefinedTypeName","pathNode":{"id":6669,"name":"Rounding","nodeType":"IdentifierPath","referencedDeclaration":5847,"src":"12278:8:49"},"referencedDeclaration":5847,"src":"12278:8:49","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$5847","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"12262:34:49"},"returnParameters":{"id":6675,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6674,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6704,"src":"12320:7:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6673,"name":"uint256","nodeType":"ElementaryTypeName","src":"12320:7:49","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12319:9:49"},"scope":6705,"src":"12247:255:49","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":6706,"src":"202:12302:49","usedErrors":[]}],"src":"103:12402:49"},"id":49},"contracts/bundler/EntryPointWrapper.sol":{"ast":{"absolutePath":"contracts/bundler/EntryPointWrapper.sol","exportedSymbols":{"EntryPointWrapper":[7166],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":7167,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":6707,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:50"},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":6708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7167,"sourceUnit":10808,"src":"148:39:50","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"EntryPointWrapper","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":7166,"linearizedBaseContracts":[7166],"name":"EntryPointWrapper","nameLocation":"198:17:50","nodeType":"ContractDefinition","nodes":[{"canonicalName":"EntryPointWrapper.ReturnInfo","id":6721,"members":[{"constant":false,"id":6710,"mutability":"mutable","name":"preOpGas","nameLocation":"851:8:50","nodeType":"VariableDeclaration","scope":6721,"src":"843:16:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6709,"name":"uint256","nodeType":"ElementaryTypeName","src":"843:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6712,"mutability":"mutable","name":"prefund","nameLocation":"877:7:50","nodeType":"VariableDeclaration","scope":6721,"src":"869:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6711,"name":"uint256","nodeType":"ElementaryTypeName","src":"869:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6714,"mutability":"mutable","name":"sigFailed","nameLocation":"899:9:50","nodeType":"VariableDeclaration","scope":6721,"src":"894:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":6713,"name":"bool","nodeType":"ElementaryTypeName","src":"894:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":6716,"mutability":"mutable","name":"validAfter","nameLocation":"925:10:50","nodeType":"VariableDeclaration","scope":6721,"src":"918:17:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":6715,"name":"uint48","nodeType":"ElementaryTypeName","src":"918:6:50","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":6718,"mutability":"mutable","name":"validUntil","nameLocation":"952:10:50","nodeType":"VariableDeclaration","scope":6721,"src":"945:17:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":6717,"name":"uint48","nodeType":"ElementaryTypeName","src":"945:6:50","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":6720,"mutability":"mutable","name":"paymasterContext","nameLocation":"978:16:50","nodeType":"VariableDeclaration","scope":6721,"src":"972:22:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":6719,"name":"bytes","nodeType":"ElementaryTypeName","src":"972:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"822:10:50","nodeType":"StructDefinition","scope":7166,"src":"815:186:50","visibility":"public"},{"canonicalName":"EntryPointWrapper.StakeInfo","id":6726,"members":[{"constant":false,"id":6723,"mutability":"mutable","name":"stake","nameLocation":"1042:5:50","nodeType":"VariableDeclaration","scope":6726,"src":"1034:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6722,"name":"uint256","nodeType":"ElementaryTypeName","src":"1034:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6725,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1065:15:50","nodeType":"VariableDeclaration","scope":6726,"src":"1057:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6724,"name":"uint256","nodeType":"ElementaryTypeName","src":"1057:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1014:9:50","nodeType":"StructDefinition","scope":7166,"src":"1007:80:50","visibility":"public"},{"canonicalName":"EntryPointWrapper.AggregatorStakeInfo","id":6732,"members":[{"constant":false,"id":6728,"mutability":"mutable","name":"aggregator","nameLocation":"1267:10:50","nodeType":"VariableDeclaration","scope":6732,"src":"1259:18:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":6727,"name":"address","nodeType":"ElementaryTypeName","src":"1259:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":6731,"mutability":"mutable","name":"stakeInfo","nameLocation":"1297:9:50","nodeType":"VariableDeclaration","scope":6732,"src":"1287:19:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6730,"nodeType":"UserDefinedTypeName","pathNode":{"id":6729,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"1287:9:50"},"referencedDeclaration":6726,"src":"1287:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"1229:19:50","nodeType":"StructDefinition","scope":7166,"src":"1222:91:50","visibility":"public"},{"canonicalName":"EntryPointWrapper.FailedOpStatus","id":6739,"members":[{"constant":false,"id":6734,"mutability":"mutable","name":"status","nameLocation":"1356:6:50","nodeType":"VariableDeclaration","scope":6739,"src":"1351:11:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":6733,"name":"bool","nodeType":"ElementaryTypeName","src":"1351:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":6736,"mutability":"mutable","name":"opIndex","nameLocation":"1380:7:50","nodeType":"VariableDeclaration","scope":6739,"src":"1372:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6735,"name":"uint256","nodeType":"ElementaryTypeName","src":"1372:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6738,"mutability":"mutable","name":"reason","nameLocation":"1404:6:50","nodeType":"VariableDeclaration","scope":6739,"src":"1397:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":6737,"name":"string","nodeType":"ElementaryTypeName","src":"1397:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"name":"FailedOpStatus","nameLocation":"1326:14:50","nodeType":"StructDefinition","scope":7166,"src":"1319:98:50","visibility":"public"},{"canonicalName":"EntryPointWrapper.Response","id":6757,"members":[{"constant":false,"id":6741,"mutability":"mutable","name":"selectorType","nameLocation":"1456:12:50","nodeType":"VariableDeclaration","scope":6757,"src":"1449:19:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":6740,"name":"string","nodeType":"ElementaryTypeName","src":"1449:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":6744,"mutability":"mutable","name":"returnInfo","nameLocation":"1489:10:50","nodeType":"VariableDeclaration","scope":6757,"src":"1478:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6743,"nodeType":"UserDefinedTypeName","pathNode":{"id":6742,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"1478:10:50"},"referencedDeclaration":6721,"src":"1478:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":6747,"mutability":"mutable","name":"senderInfo","nameLocation":"1519:10:50","nodeType":"VariableDeclaration","scope":6757,"src":"1509:20:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6746,"nodeType":"UserDefinedTypeName","pathNode":{"id":6745,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"1509:9:50"},"referencedDeclaration":6726,"src":"1509:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6750,"mutability":"mutable","name":"factoryInfo","nameLocation":"1549:11:50","nodeType":"VariableDeclaration","scope":6757,"src":"1539:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6749,"nodeType":"UserDefinedTypeName","pathNode":{"id":6748,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"1539:9:50"},"referencedDeclaration":6726,"src":"1539:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6753,"mutability":"mutable","name":"paymasterInfo","nameLocation":"1580:13:50","nodeType":"VariableDeclaration","scope":6757,"src":"1570:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6752,"nodeType":"UserDefinedTypeName","pathNode":{"id":6751,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"1570:9:50"},"referencedDeclaration":6726,"src":"1570:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6756,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"1623:14:50","nodeType":"VariableDeclaration","scope":6757,"src":"1603:34:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":6755,"nodeType":"UserDefinedTypeName","pathNode":{"id":6754,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6732,"src":"1603:19:50"},"referencedDeclaration":6732,"src":"1603:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"name":"Response","nameLocation":"1430:8:50","nodeType":"StructDefinition","scope":7166,"src":"1423:221:50","visibility":"public"},{"documentation":{"id":6758,"nodeType":"StructuredDocumentation","src":"1652:756:50","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":6764,"name":"FailedOp","nameLocation":"2419:8:50","nodeType":"ErrorDefinition","parameters":{"id":6763,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6760,"mutability":"mutable","name":"opIndex","nameLocation":"2436:7:50","nodeType":"VariableDeclaration","scope":6764,"src":"2428:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6759,"name":"uint256","nodeType":"ElementaryTypeName","src":"2428:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6762,"mutability":"mutable","name":"reason","nameLocation":"2452:6:50","nodeType":"VariableDeclaration","scope":6764,"src":"2445:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":6761,"name":"string","nodeType":"ElementaryTypeName","src":"2445:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2427:32:50"},"src":"2413:47:50"},{"documentation":{"id":6765,"nodeType":"StructuredDocumentation","src":"2466:327:50","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":6779,"name":"ValidationResult","nameLocation":"2804:16:50","nodeType":"ErrorDefinition","parameters":{"id":6778,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6768,"mutability":"mutable","name":"returnInfo","nameLocation":"2832:10:50","nodeType":"VariableDeclaration","scope":6779,"src":"2821:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6767,"nodeType":"UserDefinedTypeName","pathNode":{"id":6766,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"2821:10:50"},"referencedDeclaration":6721,"src":"2821:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":6771,"mutability":"mutable","name":"senderInfo","nameLocation":"2862:10:50","nodeType":"VariableDeclaration","scope":6779,"src":"2852:20:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6770,"nodeType":"UserDefinedTypeName","pathNode":{"id":6769,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"2852:9:50"},"referencedDeclaration":6726,"src":"2852:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6774,"mutability":"mutable","name":"factoryInfo","nameLocation":"2884:11:50","nodeType":"VariableDeclaration","scope":6779,"src":"2874:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6773,"nodeType":"UserDefinedTypeName","pathNode":{"id":6772,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"2874:9:50"},"referencedDeclaration":6726,"src":"2874:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6777,"mutability":"mutable","name":"paymasterInfo","nameLocation":"2907:13:50","nodeType":"VariableDeclaration","scope":6779,"src":"2897:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6776,"nodeType":"UserDefinedTypeName","pathNode":{"id":6775,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"2897:9:50"},"referencedDeclaration":6726,"src":"2897:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"src":"2820:101:50"},"src":"2798:124:50"},{"documentation":{"id":6780,"nodeType":"StructuredDocumentation","src":"2928:561:50","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":6797,"name":"ValidationResultWithAggregation","nameLocation":"3500:31:50","nodeType":"ErrorDefinition","parameters":{"id":6796,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6783,"mutability":"mutable","name":"returnInfo","nameLocation":"3543:10:50","nodeType":"VariableDeclaration","scope":6797,"src":"3532:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6782,"nodeType":"UserDefinedTypeName","pathNode":{"id":6781,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"3532:10:50"},"referencedDeclaration":6721,"src":"3532:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":6786,"mutability":"mutable","name":"senderInfo","nameLocation":"3573:10:50","nodeType":"VariableDeclaration","scope":6797,"src":"3563:20:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6785,"nodeType":"UserDefinedTypeName","pathNode":{"id":6784,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"3563:9:50"},"referencedDeclaration":6726,"src":"3563:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6789,"mutability":"mutable","name":"factoryInfo","nameLocation":"3595:11:50","nodeType":"VariableDeclaration","scope":6797,"src":"3585:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6788,"nodeType":"UserDefinedTypeName","pathNode":{"id":6787,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"3585:9:50"},"referencedDeclaration":6726,"src":"3585:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6792,"mutability":"mutable","name":"paymasterInfo","nameLocation":"3618:13:50","nodeType":"VariableDeclaration","scope":6797,"src":"3608:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6791,"nodeType":"UserDefinedTypeName","pathNode":{"id":6790,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"3608:9:50"},"referencedDeclaration":6726,"src":"3608:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6795,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"3661:14:50","nodeType":"VariableDeclaration","scope":6797,"src":"3641:34:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":6794,"nodeType":"UserDefinedTypeName","pathNode":{"id":6793,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6732,"src":"3641:19:50"},"referencedDeclaration":6732,"src":"3641:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"3531:145:50"},"src":"3494:183:50"},{"constant":false,"functionSelector":"b0d691fe","id":6800,"mutability":"mutable","name":"entryPoint","nameLocation":"3702:10:50","nodeType":"VariableDeclaration","scope":7166,"src":"3683:29:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":6799,"nodeType":"UserDefinedTypeName","pathNode":{"id":6798,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"3683:11:50"},"referencedDeclaration":10807,"src":"3683:11:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"public"},{"constant":false,"id":6807,"mutability":"mutable","name":"emptyStakeInfo","nameLocation":"3737:14:50","nodeType":"VariableDeclaration","scope":7166,"src":"3719:50:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6802,"nodeType":"UserDefinedTypeName","pathNode":{"id":6801,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"3719:9:50"},"referencedDeclaration":6726,"src":"3719:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"value":{"arguments":[{"hexValue":"30","id":6804,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3764:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":6805,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3767:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":6803,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"3754:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},"id":6806,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3754:15:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},"visibility":"private"},{"constant":false,"id":6817,"mutability":"mutable","name":"emptyAggregatorInfo","nameLocation":"3803:19:50","nodeType":"VariableDeclaration","scope":7166,"src":"3775:97:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":6809,"nodeType":"UserDefinedTypeName","pathNode":{"id":6808,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6732,"src":"3775:19:50"},"referencedDeclaration":6732,"src":"3775:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"value":{"arguments":[{"arguments":[{"hexValue":"30","id":6813,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3853:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":6812,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3845:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":6811,"name":"address","nodeType":"ElementaryTypeName","src":"3845:7:50","typeDescriptions":{}}},"id":6814,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3845:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":6815,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6807,"src":"3857:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}],"id":6810,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6732,"src":"3825:19:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$6732_storage_ptr_$","typeString":"type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer)"}},"id":6816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3825:47:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}},"visibility":"private"},{"constant":false,"id":6831,"mutability":"mutable","name":"emptyReturnInfo","nameLocation":"3897:15:50","nodeType":"VariableDeclaration","scope":7166,"src":"3878:80:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6819,"nodeType":"UserDefinedTypeName","pathNode":{"id":6818,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"3878:10:50"},"referencedDeclaration":6721,"src":"3878:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"value":{"arguments":[{"hexValue":"30","id":6821,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3926:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":6822,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3929:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"66616c7365","id":6823,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3932:5:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":6824,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3939:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":6825,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3942:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"arguments":[{"hexValue":"30","id":6828,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3955:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":6827,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3945:9:50","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":6826,"name":"bytes","nodeType":"ElementaryTypeName","src":"3949:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":6829,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3945:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":6820,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6721,"src":"3915:10:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},"id":6830,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3915:43:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},"visibility":"private"},{"constant":false,"id":6842,"mutability":"mutable","name":"emptyResponse","nameLocation":"3981:13:50","nodeType":"VariableDeclaration","scope":7166,"src":"3964:131:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_storage","typeString":"struct EntryPointWrapper.Response"},"typeName":{"id":6833,"nodeType":"UserDefinedTypeName","pathNode":{"id":6832,"name":"Response","nodeType":"IdentifierPath","referencedDeclaration":6757,"src":"3964:8:50"},"referencedDeclaration":6757,"src":"3964:8:50","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_storage_ptr","typeString":"struct EntryPointWrapper.Response"}},"value":{"arguments":[{"hexValue":"","id":6835,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4006:2:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"id":6836,"name":"emptyReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6831,"src":"4010:15:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage","typeString":"struct EntryPointWrapper.ReturnInfo storage ref"}},{"id":6837,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6807,"src":"4027:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":6838,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6807,"src":"4043:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":6839,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6807,"src":"4059:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":6840,"name":"emptyAggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6817,"src":"4075:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage","typeString":"struct EntryPointWrapper.ReturnInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}],"id":6834,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6757,"src":"3997:8:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$6757_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":6841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3997:98:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}},"visibility":"private"},{"constant":false,"id":6850,"mutability":"mutable","name":"emptyFailedOp","nameLocation":"4124:13:50","nodeType":"VariableDeclaration","scope":7166,"src":"4101:67:50","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_storage","typeString":"struct EntryPointWrapper.FailedOpStatus"},"typeName":{"id":6844,"nodeType":"UserDefinedTypeName","pathNode":{"id":6843,"name":"FailedOpStatus","nodeType":"IdentifierPath","referencedDeclaration":6739,"src":"4101:14:50"},"referencedDeclaration":6739,"src":"4101:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_storage_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"}},"value":{"arguments":[{"hexValue":"66616c7365","id":6846,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4155:5:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":6847,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4162:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"","id":6848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4165:2:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":6845,"name":"FailedOpStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6739,"src":"4140:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_FailedOpStatus_$6739_storage_ptr_$","typeString":"type(struct EntryPointWrapper.FailedOpStatus storage pointer)"}},"id":6849,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4140:28:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus memory"}},"visibility":"private"},{"body":{"id":6860,"nodeType":"Block","src":"4212:41:50","statements":[{"expression":{"id":6858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6856,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6800,"src":"4222:10:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":6857,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6853,"src":"4235:11:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"4222:24:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":6859,"nodeType":"ExpressionStatement","src":"4222:24:50"}]},"id":6861,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":6854,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6853,"mutability":"mutable","name":"_entryPoint","nameLocation":"4199:11:50","nodeType":"VariableDeclaration","scope":6861,"src":"4187:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":6852,"nodeType":"UserDefinedTypeName","pathNode":{"id":6851,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"4187:11:50"},"referencedDeclaration":10807,"src":"4187:11:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"4186:25:50"},"returnParameters":{"id":6855,"nodeType":"ParameterList","parameters":[],"src":"4212:0:50"},"scope":7166,"src":"4175:78:50","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":7023,"nodeType":"Block","src":"4376:1461:50","statements":[{"clauses":[{"block":{"id":6877,"nodeType":"Block","src":"4428:2:50","statements":[]},"errorName":"","id":6878,"nodeType":"TryCatchClause","src":"4428:2:50"},{"block":{"id":7020,"nodeType":"Block","src":"4471:1360:50","statements":[{"assignments":[6883],"declarations":[{"constant":false,"id":6883,"mutability":"mutable","name":"receivedSelector","nameLocation":"4492:16:50","nodeType":"VariableDeclaration","scope":7020,"src":"4485:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":6882,"name":"bytes4","nodeType":"ElementaryTypeName","src":"4485:6:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":6888,"initialValue":{"arguments":[{"id":6886,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"4518:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":6885,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4511:6:50","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":6884,"name":"bytes4","nodeType":"ElementaryTypeName","src":"4511:6:50","typeDescriptions":{}}},"id":6887,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4511:18:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"4485:44:50"},{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":6892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6889,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6883,"src":"4548:16:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6890,"name":"ValidationResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6779,"src":"4568:16:50","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$6721_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$returns$__$","typeString":"function (struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory) pure"}},"id":6891,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"4568:25:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"4548:45:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":6937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6934,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6883,"src":"5007:16:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6935,"name":"ValidationResultWithAggregation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6797,"src":"5027:31:50","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$6721_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_AggregatorStakeInfo_$6732_memory_ptr_$returns$__$","typeString":"function (struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.AggregatorStakeInfo memory) pure"}},"id":6936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"5027:40:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"5007:60:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":6986,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6983,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6883,"src":"5555:16:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":6984,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6764,"src":"5575:8:50","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":6985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"5575:17:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"5555:37:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7017,"nodeType":"IfStatement","src":"5551:270:50","trueBody":{"id":7016,"nodeType":"Block","src":"5593:228:50","statements":[{"assignments":[6988,6990],"declarations":[{"constant":false,"id":6988,"mutability":"mutable","name":"opIndex","nameLocation":"5620:7:50","nodeType":"VariableDeclaration","scope":7016,"src":"5612:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6987,"name":"uint256","nodeType":"ElementaryTypeName","src":"5612:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6990,"mutability":"mutable","name":"reason","nameLocation":"5643:6:50","nodeType":"VariableDeclaration","scope":7016,"src":"5629:20:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":6989,"name":"string","nodeType":"ElementaryTypeName","src":"5629:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":7007,"initialValue":{"arguments":[{"arguments":[{"id":6994,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"5670:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":6995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5682:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6999,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":6996,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"5685:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":6997,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5685:17:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":6998,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5705:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"5685:21:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6993,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7061,"src":"5664:5:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":7000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5664:43:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":7002,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5710:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":7001,"name":"uint256","nodeType":"ElementaryTypeName","src":"5710:7:50","typeDescriptions":{}}},{"id":7004,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5719:6:50","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":7003,"name":"string","nodeType":"ElementaryTypeName","src":"5719:6:50","typeDescriptions":{}}}],"id":7005,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5709:17:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_string_storage_ptr_$_$","typeString":"tuple(type(uint256),type(string storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_string_storage_ptr_$_$","typeString":"tuple(type(uint256),type(string storage pointer))"}],"expression":{"id":6991,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5653:3:50","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":6992,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5653:10:50","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":7006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5653:74:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_string_memory_ptr_$","typeString":"tuple(uint256,string memory)"}},"nodeType":"VariableDeclarationStatement","src":"5611:116:50"},{"expression":{"components":[{"arguments":[{"hexValue":"74727565","id":7009,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5768:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":7010,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6988,"src":"5774:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":7011,"name":"reason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6990,"src":"5783:6:50","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":7008,"name":"FailedOpStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6739,"src":"5753:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_FailedOpStatus_$6739_storage_ptr_$","typeString":"type(struct EntryPointWrapper.FailedOpStatus storage pointer)"}},"id":7012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5753:37:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus memory"}},{"id":7013,"name":"emptyResponse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6842,"src":"5792:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_storage","typeString":"struct EntryPointWrapper.Response storage ref"}}],"id":7014,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5752:54:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$6739_memory_ptr_$_t_struct$_Response_$6757_storage_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus memory,struct EntryPointWrapper.Response storage ref)"}},"functionReturnParameters":6872,"id":7015,"nodeType":"Return","src":"5745:61:50"}]}},"id":7018,"nodeType":"IfStatement","src":"5003:818:50","trueBody":{"id":6982,"nodeType":"Block","src":"5069:476:50","statements":[{"assignments":[6940,6943,6946,6949,6952],"declarations":[{"constant":false,"id":6940,"mutability":"mutable","name":"returnInfo","nameLocation":"5106:10:50","nodeType":"VariableDeclaration","scope":6982,"src":"5088:28:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6939,"nodeType":"UserDefinedTypeName","pathNode":{"id":6938,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"5088:10:50"},"referencedDeclaration":6721,"src":"5088:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":6943,"mutability":"mutable","name":"senderInfo","nameLocation":"5135:10:50","nodeType":"VariableDeclaration","scope":6982,"src":"5118:27:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6942,"nodeType":"UserDefinedTypeName","pathNode":{"id":6941,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"5118:9:50"},"referencedDeclaration":6726,"src":"5118:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6946,"mutability":"mutable","name":"factoryInfo","nameLocation":"5164:11:50","nodeType":"VariableDeclaration","scope":6982,"src":"5147:28:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6945,"nodeType":"UserDefinedTypeName","pathNode":{"id":6944,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"5147:9:50"},"referencedDeclaration":6726,"src":"5147:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6949,"mutability":"mutable","name":"paymasterInfo","nameLocation":"5194:13:50","nodeType":"VariableDeclaration","scope":6982,"src":"5177:30:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6948,"nodeType":"UserDefinedTypeName","pathNode":{"id":6947,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"5177:9:50"},"referencedDeclaration":6726,"src":"5177:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6952,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"5236:14:50","nodeType":"VariableDeclaration","scope":6982,"src":"5209:41:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":6951,"nodeType":"UserDefinedTypeName","pathNode":{"id":6950,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6732,"src":"5209:19:50"},"referencedDeclaration":6732,"src":"5209:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"id":6970,"initialValue":{"arguments":[{"arguments":[{"id":6956,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"5271:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":6957,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5283:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":6958,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"5286:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":6959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5286:17:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":6960,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5306:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"5286:21:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6955,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7061,"src":"5265:5:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":6962,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5265:43:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":6963,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6721,"src":"5311:10:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},{"id":6964,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"5323:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":6965,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"5334:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":6966,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"5345:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":6967,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6732,"src":"5356:19:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$6732_storage_ptr_$","typeString":"type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer)"}}],"id":6968,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5310:66:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_AggregatorStakeInfo_$6732_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_AggregatorStakeInfo_$6732_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer))"}],"expression":{"id":6953,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5254:3:50","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":6954,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5254:10:50","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":6969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5254:123:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_ReturnInfo_$6721_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_AggregatorStakeInfo_$6732_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.AggregatorStakeInfo memory)"}},"nodeType":"VariableDeclarationStatement","src":"5087:290:50"},{"expression":{"components":[{"id":6971,"name":"emptyFailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6850,"src":"5403:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_storage","typeString":"struct EntryPointWrapper.FailedOpStatus storage ref"}},{"arguments":[{"hexValue":"56616c69646174696f6e526573756c74576974684167677265676174696f6e","id":6973,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5427:33:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_ea3130099f23ccb989b6d42303a297f831545c15c36a5fc95fe55cdc635ccfdc","typeString":"literal_string \"ValidationResultWithAggregation\""},"value":"ValidationResultWithAggregation"},{"id":6974,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6940,"src":"5462:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},{"id":6975,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6943,"src":"5474:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6976,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6946,"src":"5486:11:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6977,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6949,"src":"5499:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6978,"name":"aggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6952,"src":"5514:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_ea3130099f23ccb989b6d42303a297f831545c15c36a5fc95fe55cdc635ccfdc","typeString":"literal_string \"ValidationResultWithAggregation\""},{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}],"id":6972,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6757,"src":"5418:8:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$6757_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":6979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5418:111:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}}],"id":6980,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5402:128:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$6739_storage_$_t_struct$_Response_$6757_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus storage ref,struct EntryPointWrapper.Response memory)"}},"functionReturnParameters":6872,"id":6981,"nodeType":"Return","src":"5395:135:50"}]}},"id":7019,"nodeType":"IfStatement","src":"4544:1277:50","trueBody":{"id":6933,"nodeType":"Block","src":"4595:402:50","statements":[{"assignments":[6895,6898,6901,6904],"declarations":[{"constant":false,"id":6895,"mutability":"mutable","name":"returnInfo","nameLocation":"4632:10:50","nodeType":"VariableDeclaration","scope":6933,"src":"4614:28:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":6894,"nodeType":"UserDefinedTypeName","pathNode":{"id":6893,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":6721,"src":"4614:10:50"},"referencedDeclaration":6721,"src":"4614:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":6898,"mutability":"mutable","name":"senderInfo","nameLocation":"4661:10:50","nodeType":"VariableDeclaration","scope":6933,"src":"4644:27:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6897,"nodeType":"UserDefinedTypeName","pathNode":{"id":6896,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"4644:9:50"},"referencedDeclaration":6726,"src":"4644:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6901,"mutability":"mutable","name":"factoryInfo","nameLocation":"4690:11:50","nodeType":"VariableDeclaration","scope":6933,"src":"4673:28:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6900,"nodeType":"UserDefinedTypeName","pathNode":{"id":6899,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"4673:9:50"},"referencedDeclaration":6726,"src":"4673:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":6904,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4720:13:50","nodeType":"VariableDeclaration","scope":6933,"src":"4703:30:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":6903,"nodeType":"UserDefinedTypeName","pathNode":{"id":6902,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":6726,"src":"4703:9:50"},"referencedDeclaration":6726,"src":"4703:9:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"id":6921,"initialValue":{"arguments":[{"arguments":[{"id":6908,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"4754:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":6909,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4766:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":6910,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6880,"src":"4769:10:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":6911,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4769:17:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":6912,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4789:1:50","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"4769:21:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6907,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7061,"src":"4748:5:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":6914,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4748:43:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":6915,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6721,"src":"4794:10:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},{"id":6916,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"4806:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":6917,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"4817:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":6918,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6726,"src":"4828:9:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}}],"id":6919,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4793:45:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$6721_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$6726_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer))"}],"expression":{"id":6905,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4737:3:50","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":6906,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"4737:10:50","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":6920,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4737:102:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_ReturnInfo_$6721_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$_t_struct$_StakeInfo_$6726_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory)"}},"nodeType":"VariableDeclarationStatement","src":"4613:226:50"},{"expression":{"components":[{"id":6922,"name":"emptyFailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6850,"src":"4865:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_storage","typeString":"struct EntryPointWrapper.FailedOpStatus storage ref"}},{"arguments":[{"hexValue":"56616c69646174696f6e526573756c74","id":6924,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4889:18:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_2553a72894d908a298b00dbf33bbabad7e5ce84b5e86e2b9599904735a8f7bdc","typeString":"literal_string \"ValidationResult\""},"value":"ValidationResult"},{"id":6925,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6895,"src":"4909:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},{"id":6926,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6898,"src":"4921:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6927,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6901,"src":"4933:11:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6928,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6904,"src":"4946:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":6929,"name":"emptyAggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6817,"src":"4961:19:50","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2553a72894d908a298b00dbf33bbabad7e5ce84b5e86e2b9599904735a8f7bdc","typeString":"literal_string \"ValidationResult\""},{"typeIdentifier":"t_struct$_ReturnInfo_$6721_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$6726_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$6732_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}],"id":6923,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6757,"src":"4880:8:50","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$6757_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":6930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4880:101:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}}],"id":6931,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4864:118:50","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$6739_storage_$_t_struct$_Response_$6757_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus storage ref,struct EntryPointWrapper.Response memory)"}},"functionReturnParameters":6872,"id":6932,"nodeType":"Return","src":"4857:125:50"}]}}]},"errorName":"","id":7021,"nodeType":"TryCatchClause","parameters":{"id":6881,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6880,"mutability":"mutable","name":"revertData","nameLocation":"4459:10:50","nodeType":"VariableDeclaration","scope":7021,"src":"4446:23:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":6879,"name":"bytes","nodeType":"ElementaryTypeName","src":"4446:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4445:25:50"},"src":"4439:1392:50"}],"externalCall":{"arguments":[{"id":6875,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6864,"src":"4420:6:50","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"expression":{"id":6873,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6800,"src":"4390:10:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":6874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"simulateValidation","nodeType":"MemberAccess","referencedDeclaration":10770,"src":"4390:29:50","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$10993_memory_ptr_$returns$__$","typeString":"function (struct UserOperation memory) external"}},"id":6876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4390:37:50","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7022,"nodeType":"TryStatement","src":"4386:1445:50"}]},"functionSelector":"ee219423","id":7024,"implemented":true,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"4268:18:50","nodeType":"FunctionDefinition","parameters":{"id":6865,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6864,"mutability":"mutable","name":"userOp","nameLocation":"4310:6:50","nodeType":"VariableDeclaration","scope":7024,"src":"4287:29:50","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":6863,"nodeType":"UserDefinedTypeName","pathNode":{"id":6862,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4287:13:50"},"referencedDeclaration":10993,"src":"4287:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"4286:31:50"},"returnParameters":{"id":6872,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6868,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7024,"src":"4336:21:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"},"typeName":{"id":6867,"nodeType":"UserDefinedTypeName","pathNode":{"id":6866,"name":"FailedOpStatus","nodeType":"IdentifierPath","referencedDeclaration":6739,"src":"4336:14:50"},"referencedDeclaration":6739,"src":"4336:14:50","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$6739_storage_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"}},"visibility":"internal"},{"constant":false,"id":6871,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7024,"src":"4359:15:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_memory_ptr","typeString":"struct EntryPointWrapper.Response"},"typeName":{"id":6870,"nodeType":"UserDefinedTypeName","pathNode":{"id":6869,"name":"Response","nodeType":"IdentifierPath","referencedDeclaration":6757,"src":"4359:8:50"},"referencedDeclaration":6757,"src":"4359:8:50","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$6757_storage_ptr","typeString":"struct EntryPointWrapper.Response"}},"visibility":"internal"}],"src":"4335:40:50"},"scope":7166,"src":"4259:1578:50","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":7060,"nodeType":"Block","src":"6007:2640:50","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7036,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7030,"src":"6025:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3331","id":7037,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6035:2:50","typeDescriptions":{"typeIdentifier":"t_rational_31_by_1","typeString":"int_const 31"},"value":"31"},"src":"6025:12:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":7039,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7030,"src":"6041:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6025:23:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"736c6963655f6f766572666c6f77","id":7041,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6050:16:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e","typeString":"literal_string \"slice_overflow\""},"value":"slice_overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e","typeString":"literal_string \"slice_overflow\""}],"id":7035,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6017:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6017:50:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7043,"nodeType":"ExpressionStatement","src":"6017:50:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":7045,"name":"_bytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7026,"src":"6085:6:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":7046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6085:13:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7049,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7047,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7028,"src":"6102:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":7048,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7030,"src":"6111:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6102:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6085:33:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"736c6963655f6f75744f66426f756e6473","id":7051,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6120:19:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0","typeString":"literal_string \"slice_outOfBounds\""},"value":"slice_outOfBounds"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0","typeString":"literal_string \"slice_outOfBounds\""}],"id":7044,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6077:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6077:63:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7053,"nodeType":"ExpressionStatement","src":"6077:63:50"},{"assignments":[7055],"declarations":[{"constant":false,"id":7055,"mutability":"mutable","name":"tempBytes","nameLocation":"6164:9:50","nodeType":"VariableDeclaration","scope":7060,"src":"6151:22:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7054,"name":"bytes","nodeType":"ElementaryTypeName","src":"6151:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":7056,"nodeType":"VariableDeclarationStatement","src":"6151:22:50"},{"AST":{"nodeType":"YulBlock","src":"6193:2421:50","statements":[{"cases":[{"body":{"nodeType":"YulBlock","src":"6249:1960:50","statements":[{"nodeType":"YulAssignment","src":"6405:24:50","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6424:4:50","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6418:5:50"},"nodeType":"YulFunctionCall","src":"6418:11:50"},"variableNames":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"6405:9:50"}]},{"nodeType":"YulVariableDeclaration","src":"7053:33:50","value":{"arguments":[{"name":"_length","nodeType":"YulIdentifier","src":"7074:7:50"},{"kind":"number","nodeType":"YulLiteral","src":"7083:2:50","type":"","value":"31"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7070:3:50"},"nodeType":"YulFunctionCall","src":"7070:16:50"},"variables":[{"name":"lengthmod","nodeType":"YulTypedName","src":"7057:9:50","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7407:70:50","value":{"arguments":[{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"7425:9:50"},{"name":"lengthmod","nodeType":"YulIdentifier","src":"7436:9:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7421:3:50"},"nodeType":"YulFunctionCall","src":"7421:25:50"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7452:4:50","type":"","value":"0x20"},{"arguments":[{"name":"lengthmod","nodeType":"YulIdentifier","src":"7465:9:50"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7458:6:50"},"nodeType":"YulFunctionCall","src":"7458:17:50"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"7448:3:50"},"nodeType":"YulFunctionCall","src":"7448:28:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7417:3:50"},"nodeType":"YulFunctionCall","src":"7417:60:50"},"variables":[{"name":"mc","nodeType":"YulTypedName","src":"7411:2:50","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7494:27:50","value":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7509:2:50"},{"name":"_length","nodeType":"YulIdentifier","src":"7513:7:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7505:3:50"},"nodeType":"YulFunctionCall","src":"7505:16:50"},"variables":[{"name":"end","nodeType":"YulTypedName","src":"7498:3:50","type":""}]},{"body":{"nodeType":"YulBlock","src":"7903:61:50","statements":[{"expression":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7932:2:50"},{"arguments":[{"name":"cc","nodeType":"YulIdentifier","src":"7942:2:50"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7936:5:50"},"nodeType":"YulFunctionCall","src":"7936:9:50"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7925:6:50"},"nodeType":"YulFunctionCall","src":"7925:21:50"},"nodeType":"YulExpressionStatement","src":"7925:21:50"}]},"condition":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7794:2:50"},{"name":"end","nodeType":"YulIdentifier","src":"7798:3:50"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7791:2:50"},"nodeType":"YulFunctionCall","src":"7791:11:50"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"7803:99:50","statements":[{"nodeType":"YulAssignment","src":"7825:19:50","value":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7835:2:50"},{"kind":"number","nodeType":"YulLiteral","src":"7839:4:50","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7831:3:50"},"nodeType":"YulFunctionCall","src":"7831:13:50"},"variableNames":[{"name":"mc","nodeType":"YulIdentifier","src":"7825:2:50"}]},{"nodeType":"YulAssignment","src":"7865:19:50","value":{"arguments":[{"name":"cc","nodeType":"YulIdentifier","src":"7875:2:50"},{"kind":"number","nodeType":"YulLiteral","src":"7879:4:50","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7871:3:50"},"nodeType":"YulFunctionCall","src":"7871:13:50"},"variableNames":[{"name":"cc","nodeType":"YulIdentifier","src":"7865:2:50"}]}]},"pre":{"nodeType":"YulBlock","src":"7543:247:50","statements":[{"nodeType":"YulVariableDeclaration","src":"7692:80:50","value":{"arguments":[{"arguments":[{"arguments":[{"name":"_bytes","nodeType":"YulIdentifier","src":"7714:6:50"},{"name":"lengthmod","nodeType":"YulIdentifier","src":"7722:9:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7710:3:50"},"nodeType":"YulFunctionCall","src":"7710:22:50"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7738:4:50","type":"","value":"0x20"},{"arguments":[{"name":"lengthmod","nodeType":"YulIdentifier","src":"7751:9:50"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7744:6:50"},"nodeType":"YulFunctionCall","src":"7744:17:50"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"7734:3:50"},"nodeType":"YulFunctionCall","src":"7734:28:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7706:3:50"},"nodeType":"YulFunctionCall","src":"7706:57:50"},{"name":"_start","nodeType":"YulIdentifier","src":"7765:6:50"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7702:3:50"},"nodeType":"YulFunctionCall","src":"7702:70:50"},"variables":[{"name":"cc","nodeType":"YulTypedName","src":"7696:2:50","type":""}]}]},"src":"7539:425:50"},{"expression":{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"7989:9:50"},{"name":"_length","nodeType":"YulIdentifier","src":"8000:7:50"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7982:6:50"},"nodeType":"YulFunctionCall","src":"7982:26:50"},"nodeType":"YulExpressionStatement","src":"7982:26:50"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8163:4:50","type":"","value":"0x40"},{"arguments":[{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"8177:2:50"},{"kind":"number","nodeType":"YulLiteral","src":"8181:2:50","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8173:3:50"},"nodeType":"YulFunctionCall","src":"8173:11:50"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8190:2:50","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"8186:3:50"},"nodeType":"YulFunctionCall","src":"8186:7:50"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8169:3:50"},"nodeType":"YulFunctionCall","src":"8169:25:50"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8156:6:50"},"nodeType":"YulFunctionCall","src":"8156:39:50"},"nodeType":"YulExpressionStatement","src":"8156:39:50"}]},"nodeType":"YulCase","src":"6242:1967:50","value":{"kind":"number","nodeType":"YulLiteral","src":"6247:1:50","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"8313:291:50","statements":[{"nodeType":"YulAssignment","src":"8331:24:50","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8350:4:50","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8344:5:50"},"nodeType":"YulFunctionCall","src":"8344:11:50"},"variableNames":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8331:9:50"}]},{"expression":{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8525:9:50"},{"kind":"number","nodeType":"YulLiteral","src":"8536:1:50","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8518:6:50"},"nodeType":"YulFunctionCall","src":"8518:20:50"},"nodeType":"YulExpressionStatement","src":"8518:20:50"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8563:4:50","type":"","value":"0x40"},{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8573:9:50"},{"kind":"number","nodeType":"YulLiteral","src":"8584:4:50","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8569:3:50"},"nodeType":"YulFunctionCall","src":"8569:20:50"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8556:6:50"},"nodeType":"YulFunctionCall","src":"8556:34:50"},"nodeType":"YulExpressionStatement","src":"8556:34:50"}]},"nodeType":"YulCase","src":"8305:299:50","value":"default"}],"expression":{"arguments":[{"name":"_length","nodeType":"YulIdentifier","src":"6221:7:50"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6214:6:50"},"nodeType":"YulFunctionCall","src":"6214:15:50"},"nodeType":"YulSwitch","src":"6207:2397:50"}]},"evmVersion":"london","externalReferences":[{"declaration":7026,"isOffset":false,"isSlot":false,"src":"7714:6:50","valueSize":1},{"declaration":7030,"isOffset":false,"isSlot":false,"src":"6221:7:50","valueSize":1},{"declaration":7030,"isOffset":false,"isSlot":false,"src":"7074:7:50","valueSize":1},{"declaration":7030,"isOffset":false,"isSlot":false,"src":"7513:7:50","valueSize":1},{"declaration":7030,"isOffset":false,"isSlot":false,"src":"8000:7:50","valueSize":1},{"declaration":7028,"isOffset":false,"isSlot":false,"src":"7765:6:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"6405:9:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"7425:9:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"7989:9:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"8331:9:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"8525:9:50","valueSize":1},{"declaration":7055,"isOffset":false,"isSlot":false,"src":"8573:9:50","valueSize":1}],"id":7057,"nodeType":"InlineAssembly","src":"6184:2430:50"},{"expression":{"id":7058,"name":"tempBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7055,"src":"8631:9:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":7034,"id":7059,"nodeType":"Return","src":"8624:16:50"}]},"id":7061,"implemented":true,"kind":"function","modifiers":[],"name":"slice","nameLocation":"5852:5:50","nodeType":"FunctionDefinition","parameters":{"id":7031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7026,"mutability":"mutable","name":"_bytes","nameLocation":"5880:6:50","nodeType":"VariableDeclaration","scope":7061,"src":"5867:19:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7025,"name":"bytes","nodeType":"ElementaryTypeName","src":"5867:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":7028,"mutability":"mutable","name":"_start","nameLocation":"5904:6:50","nodeType":"VariableDeclaration","scope":7061,"src":"5896:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7027,"name":"uint256","nodeType":"ElementaryTypeName","src":"5896:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":7030,"mutability":"mutable","name":"_length","nameLocation":"5928:7:50","nodeType":"VariableDeclaration","scope":7061,"src":"5920:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7029,"name":"uint256","nodeType":"ElementaryTypeName","src":"5920:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5857:84:50"},"returnParameters":{"id":7034,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7033,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7061,"src":"5989:12:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7032,"name":"bytes","nodeType":"ElementaryTypeName","src":"5989:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5988:14:50"},"scope":7166,"src":"5843:2804:50","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7109,"nodeType":"Block","src":"8777:193:50","statements":[{"expression":{"id":7081,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7074,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"8787:3:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":7078,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7068,"src":"8807:7:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":7079,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8807:14:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7077,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"8793:13:50","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":7075,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8797:7:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7076,"nodeType":"ArrayTypeName","src":"8797:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":7080,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8793:29:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"src":"8787:35:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":7082,"nodeType":"ExpressionStatement","src":"8787:35:50"},{"body":{"id":7105,"nodeType":"Block","src":"8874:70:50","statements":[{"expression":{"id":7103,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":7094,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"8888:3:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":7096,"indexExpression":{"id":7095,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7084,"src":"8892:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8888:6:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":7099,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7068,"src":"8922:7:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":7101,"indexExpression":{"id":7100,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7084,"src":"8930:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8922:10:50","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}],"expression":{"id":7097,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7064,"src":"8897:10:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7098,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getUserOpHash","nodeType":"MemberAccess","referencedDeclaration":10763,"src":"8897:24:50","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct UserOperation memory) view external returns (bytes32)"}},"id":7102,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8897:36:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8888:45:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7104,"nodeType":"ExpressionStatement","src":"8888:45:50"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7090,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7087,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7084,"src":"8849:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":7088,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7068,"src":"8853:7:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":7089,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8853:14:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8849:18:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7106,"initializationExpression":{"assignments":[7084],"declarations":[{"constant":false,"id":7084,"mutability":"mutable","name":"i","nameLocation":"8842:1:50","nodeType":"VariableDeclaration","scope":7106,"src":"8837:6:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7083,"name":"uint","nodeType":"ElementaryTypeName","src":"8837:4:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7086,"initialValue":{"hexValue":"30","id":7085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8846:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8837:10:50"},"loopExpression":{"expression":{"id":7092,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"8869:3:50","subExpression":{"id":7091,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7084,"src":"8869:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7093,"nodeType":"ExpressionStatement","src":"8869:3:50"},"nodeType":"ForStatement","src":"8832:112:50"},{"expression":{"id":7107,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"8960:3:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"functionReturnParameters":7073,"id":7108,"nodeType":"Return","src":"8953:10:50"}]},"functionSelector":"3024e00c","id":7110,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpHashes","nameLocation":"8662:15:50","nodeType":"FunctionDefinition","parameters":{"id":7069,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7064,"mutability":"mutable","name":"entryPoint","nameLocation":"8690:10:50","nodeType":"VariableDeclaration","scope":7110,"src":"8678:22:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":7063,"nodeType":"UserDefinedTypeName","pathNode":{"id":7062,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"8678:11:50"},"referencedDeclaration":10807,"src":"8678:11:50","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":7068,"mutability":"mutable","name":"userOps","nameLocation":"8725:7:50","nodeType":"VariableDeclaration","scope":7110,"src":"8702:30:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":7066,"nodeType":"UserDefinedTypeName","pathNode":{"id":7065,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"8702:13:50"},"referencedDeclaration":10993,"src":"8702:13:50","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":7067,"nodeType":"ArrayTypeName","src":"8702:15:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"8677:56:50"},"returnParameters":{"id":7073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7072,"mutability":"mutable","name":"ret","nameLocation":"8772:3:50","nodeType":"VariableDeclaration","scope":7110,"src":"8755:20:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":7070,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8755:7:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7071,"nodeType":"ArrayTypeName","src":"8755:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"8754:22:50"},"scope":7166,"src":"8653:317:50","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":7164,"nodeType":"Block","src":"9057:267:50","statements":[{"assignments":[7122],"declarations":[{"constant":false,"id":7122,"mutability":"mutable","name":"hashes","nameLocation":"9084:6:50","nodeType":"VariableDeclaration","scope":7164,"src":"9067:23:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":7120,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9067:7:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7121,"nodeType":"ArrayTypeName","src":"9067:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":7129,"initialValue":{"arguments":[{"expression":{"id":7126,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7113,"src":"9107:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":7127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9107:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7125,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9093:13:50","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":7123,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9097:7:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7124,"nodeType":"ArrayTypeName","src":"9097:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":7128,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9093:31:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9067:57:50"},{"body":{"id":7150,"nodeType":"Block","src":"9178:58:50","statements":[{"expression":{"id":7148,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":7141,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7122,"src":"9192:6:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":7143,"indexExpression":{"id":7142,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7131,"src":"9199:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9192:9:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"baseExpression":{"id":7144,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7113,"src":"9204:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":7146,"indexExpression":{"id":7145,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7131,"src":"9214:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9204:12:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":7147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"codehash","nodeType":"MemberAccess","src":"9204:21:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9192:33:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":7149,"nodeType":"ExpressionStatement","src":"9192:33:50"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7137,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7134,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7131,"src":"9151:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":7135,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7113,"src":"9155:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":7136,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9155:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9151:20:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7151,"initializationExpression":{"assignments":[7131],"declarations":[{"constant":false,"id":7131,"mutability":"mutable","name":"i","nameLocation":"9144:1:50","nodeType":"VariableDeclaration","scope":7151,"src":"9139:6:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7130,"name":"uint","nodeType":"ElementaryTypeName","src":"9139:4:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7133,"initialValue":{"hexValue":"30","id":7132,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9148:1:50","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"9139:10:50"},"loopExpression":{"expression":{"id":7139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"9173:3:50","subExpression":{"id":7138,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7131,"src":"9173:1:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7140,"nodeType":"ExpressionStatement","src":"9173:3:50"},"nodeType":"ForStatement","src":"9134:102:50"},{"assignments":[7153],"declarations":[{"constant":false,"id":7153,"mutability":"mutable","name":"data","nameLocation":"9258:4:50","nodeType":"VariableDeclaration","scope":7164,"src":"9245:17:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7152,"name":"bytes","nodeType":"ElementaryTypeName","src":"9245:5:50","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":7158,"initialValue":{"arguments":[{"id":7156,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7122,"src":"9276:6:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}],"expression":{"id":7154,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"9265:3:50","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":7155,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"9265:10:50","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":7157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9265:18:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9245:38:50"},{"expression":{"components":[{"arguments":[{"id":7160,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7153,"src":"9311:4:50","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":7159,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"9301:9:50","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":7161,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9301:15:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":7162,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9300:17:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":7117,"id":7163,"nodeType":"Return","src":"9293:24:50"}]},"functionSelector":"7b34b621","id":7165,"implemented":true,"kind":"function","modifiers":[],"name":"getCodeHashes","nameLocation":"8985:13:50","nodeType":"FunctionDefinition","parameters":{"id":7114,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7113,"mutability":"mutable","name":"addresses","nameLocation":"9016:9:50","nodeType":"VariableDeclaration","scope":7165,"src":"8999:26:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":7111,"name":"address","nodeType":"ElementaryTypeName","src":"8999:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":7112,"nodeType":"ArrayTypeName","src":"8999:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"8998:28:50"},"returnParameters":{"id":7117,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7116,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7165,"src":"9048:7:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7115,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9048:7:50","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"9047:9:50"},"scope":7166,"src":"8976:348:50","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":7167,"src":"189:9137:50","usedErrors":[6764,6779,6797]}],"src":"36:9291:50"},"id":50},"contracts/core/BaseAccount.sol":{"ast":{"absolutePath":"contracts/core/BaseAccount.sol","exportedSymbols":{"BaseAccount":[7308],"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":7309,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":7168,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:51"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":7169,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7309,"sourceUnit":10570,"src":"145:36:51","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":7170,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7309,"sourceUnit":10808,"src":"182:39:51","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/Helpers.sol","file":"./Helpers.sol","id":7171,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7309,"sourceUnit":9991,"src":"222:23:51","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7173,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"513:8:51"},"id":7174,"nodeType":"InheritanceSpecifier","src":"513:8:51"}],"canonicalName":"BaseAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":7172,"nodeType":"StructuredDocumentation","src":"247:232:51","text":" Basic account implementation.\n this contract provides the basic logic for implementing the IAccount interface - validateUserOp\n specific account implementation should inherit it and provide the account-specific logic"},"fullyImplemented":false,"id":7308,"linearizedBaseContracts":[7308,10569],"name":"BaseAccount","nameLocation":"498:11:51","nodeType":"ContractDefinition","nodes":[{"global":false,"id":7178,"libraryName":{"id":7175,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"534:16:51"},"nodeType":"UsingForDirective","src":"528:41:51","typeName":{"id":7177,"nodeType":"UserDefinedTypeName","pathNode":{"id":7176,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"555:13:51"},"referencedDeclaration":10993,"src":"555:13:51","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"constant":true,"id":7181,"mutability":"constant","name":"SIG_VALIDATION_FAILED","nameLocation":"722:21:51","nodeType":"VariableDeclaration","scope":7308,"src":"696:51:51","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7179,"name":"uint256","nodeType":"ElementaryTypeName","src":"696:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":7180,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"746:1:51","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"internal"},{"body":{"id":7197,"nodeType":"Block","src":"993:63:51","statements":[{"expression":{"arguments":[{"arguments":[{"id":7192,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1040:4:51","typeDescriptions":{"typeIdentifier":"t_contract$_BaseAccount_$7308","typeString":"contract BaseAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BaseAccount_$7308","typeString":"contract BaseAccount"}],"id":7191,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1032:7:51","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7190,"name":"address","nodeType":"ElementaryTypeName","src":"1032:7:51","typeDescriptions":{}}},"id":7193,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1032:13:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":7194,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1047:1:51","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":7187,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7205,"src":"1010:10:51","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":7188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1010:12:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7189,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":10819,"src":"1010:21:51","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint192_$returns$_t_uint256_$","typeString":"function (address,uint192) view external returns (uint256)"}},"id":7195,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1010:39:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":7186,"id":7196,"nodeType":"Return","src":"1003:46:51"}]},"documentation":{"id":7182,"nodeType":"StructuredDocumentation","src":"754:176:51","text":" Return the account nonce.\n This method returns the next sequential nonce.\n For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"functionSelector":"d087d288","id":7198,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"944:8:51","nodeType":"FunctionDefinition","parameters":{"id":7183,"nodeType":"ParameterList","parameters":[],"src":"952:2:51"},"returnParameters":{"id":7186,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7185,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7198,"src":"984:7:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7184,"name":"uint256","nodeType":"ElementaryTypeName","src":"984:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"983:9:51"},"scope":7308,"src":"935:121:51","stateMutability":"view","virtual":true,"visibility":"public"},{"documentation":{"id":7199,"nodeType":"StructuredDocumentation","src":"1062:137:51","text":" return the entryPoint used by this account.\n subclass should return the current entryPoint used by this account."},"functionSelector":"b0d691fe","id":7205,"implemented":false,"kind":"function","modifiers":[],"name":"entryPoint","nameLocation":"1213:10:51","nodeType":"FunctionDefinition","parameters":{"id":7200,"nodeType":"ParameterList","parameters":[],"src":"1223:2:51"},"returnParameters":{"id":7204,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7203,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7205,"src":"1255:11:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":7202,"nodeType":"UserDefinedTypeName","pathNode":{"id":7201,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1255:11:51"},"referencedDeclaration":10807,"src":"1255:11:51","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1254:13:51"},"scope":7308,"src":"1204:64:51","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[10568],"body":{"id":7238,"nodeType":"Block","src":"1625:186:51","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":7219,"name":"_requireFromEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7256,"src":"1635:22:51","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":7220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1635:24:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7221,"nodeType":"ExpressionStatement","src":"1635:24:51"},{"expression":{"id":7227,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7222,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7217,"src":"1669:14:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7224,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7209,"src":"1705:6:51","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":7225,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7211,"src":"1713:10:51","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":7223,"name":"_validateSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7267,"src":"1686:18:51","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$returns$_t_uint256_$","typeString":"function (struct UserOperation calldata,bytes32) returns (uint256)"}},"id":7226,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1686:38:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1669:55:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7228,"nodeType":"ExpressionStatement","src":"1669:55:51"},{"expression":{"arguments":[{"expression":{"id":7230,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7209,"src":"1749:6:51","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":7231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"1749:12:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7229,"name":"_validateNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7274,"src":"1734:14:51","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$__$","typeString":"function (uint256) view"}},"id":7232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1734:28:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7233,"nodeType":"ExpressionStatement","src":"1734:28:51"},{"expression":{"arguments":[{"id":7235,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7213,"src":"1784:19:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7234,"name":"_payPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7307,"src":"1772:11:51","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":7236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1772:32:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7237,"nodeType":"ExpressionStatement","src":"1772:32:51"}]},"documentation":{"id":7206,"nodeType":"StructuredDocumentation","src":"1274:179:51","text":" Validate user's signature and nonce.\n subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"functionSelector":"3a871cdd","id":7239,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1467:14:51","nodeType":"FunctionDefinition","overrides":{"id":7215,"nodeType":"OverrideSpecifier","overrides":[],"src":"1575:8:51"},"parameters":{"id":7214,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7209,"mutability":"mutable","name":"userOp","nameLocation":"1505:6:51","nodeType":"VariableDeclaration","scope":7239,"src":"1482:29:51","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":7208,"nodeType":"UserDefinedTypeName","pathNode":{"id":7207,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1482:13:51"},"referencedDeclaration":10993,"src":"1482:13:51","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":7211,"mutability":"mutable","name":"userOpHash","nameLocation":"1521:10:51","nodeType":"VariableDeclaration","scope":7239,"src":"1513:18:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7210,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1513:7:51","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":7213,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"1541:19:51","nodeType":"VariableDeclaration","scope":7239,"src":"1533:27:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7212,"name":"uint256","nodeType":"ElementaryTypeName","src":"1533:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1481:80:51"},"returnParameters":{"id":7218,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7217,"mutability":"mutable","name":"validationData","nameLocation":"1609:14:51","nodeType":"VariableDeclaration","scope":7239,"src":"1601:22:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7216,"name":"uint256","nodeType":"ElementaryTypeName","src":"1601:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1600:24:51"},"scope":7308,"src":"1458:353:51","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":7255,"nodeType":"Block","src":"1948:93:51","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":7251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":7244,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1966:3:51","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":7245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1966:10:51","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":7248,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7205,"src":"1988:10:51","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":7249,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1988:12:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}],"id":7247,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1980:7:51","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7246,"name":"address","nodeType":"ElementaryTypeName","src":"1980:7:51","typeDescriptions":{}}},"id":7250,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1980:21:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1966:35:51","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","id":7252,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2003:30:51","typeDescriptions":{"typeIdentifier":"t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50","typeString":"literal_string \"account: not from EntryPoint\""},"value":"account: not from EntryPoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50","typeString":"literal_string \"account: not from EntryPoint\""}],"id":7243,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1958:7:51","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1958:76:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7254,"nodeType":"ExpressionStatement","src":"1958:76:51"}]},"documentation":{"id":7240,"nodeType":"StructuredDocumentation","src":"1817:70:51","text":" ensure the request comes from the known entrypoint."},"id":7256,"implemented":true,"kind":"function","modifiers":[],"name":"_requireFromEntryPoint","nameLocation":"1901:22:51","nodeType":"FunctionDefinition","parameters":{"id":7241,"nodeType":"ParameterList","parameters":[],"src":"1923:2:51"},"returnParameters":{"id":7242,"nodeType":"ParameterList","parameters":[],"src":"1948:0:51"},"scope":7308,"src":"1892:149:51","stateMutability":"view","virtual":true,"visibility":"internal"},{"documentation":{"id":7257,"nodeType":"StructuredDocumentation","src":"2047:904:51","text":" validate the signature is valid for this message.\n @param userOp validate the userOp.signature field\n @param userOpHash convenient field: the hash of the request, to check the signature against\n (also hashes the entrypoint and chain id)\n @return validationData signature and time-range of this operation\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"id":7267,"implemented":false,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"2965:18:51","nodeType":"FunctionDefinition","parameters":{"id":7263,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7260,"mutability":"mutable","name":"userOp","nameLocation":"3007:6:51","nodeType":"VariableDeclaration","scope":7267,"src":"2984:29:51","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":7259,"nodeType":"UserDefinedTypeName","pathNode":{"id":7258,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2984:13:51"},"referencedDeclaration":10993,"src":"2984:13:51","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":7262,"mutability":"mutable","name":"userOpHash","nameLocation":"3023:10:51","nodeType":"VariableDeclaration","scope":7267,"src":"3015:18:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7261,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3015:7:51","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2983:51:51"},"returnParameters":{"id":7266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7265,"mutability":"mutable","name":"validationData","nameLocation":"3073:14:51","nodeType":"VariableDeclaration","scope":7267,"src":"3065:22:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7264,"name":"uint256","nodeType":"ElementaryTypeName","src":"3065:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3064:24:51"},"scope":7308,"src":"2956:133:51","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":7273,"nodeType":"Block","src":"3801:7:51","statements":[]},"documentation":{"id":7268,"nodeType":"StructuredDocumentation","src":"3095:640:51","text":" Validate the nonce of the UserOperation.\n This method may validate the nonce requirement of this account.\n e.g.\n To limit the nonce to use sequenced UserOps only (no \"out of order\" UserOps):\n `require(nonce < type(uint64).max)`\n For a hypothetical account that *requires* the nonce to be out-of-order:\n `require(nonce & type(uint64).max == 0)`\n The actual nonce uniqueness is managed by the EntryPoint, and thus no other\n action is needed by the account itself.\n @param nonce to validate\n solhint-disable-next-line no-empty-blocks"},"id":7274,"implemented":true,"kind":"function","modifiers":[],"name":"_validateNonce","nameLocation":"3749:14:51","nodeType":"FunctionDefinition","parameters":{"id":7271,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7270,"mutability":"mutable","name":"nonce","nameLocation":"3772:5:51","nodeType":"VariableDeclaration","scope":7274,"src":"3764:13:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7269,"name":"uint256","nodeType":"ElementaryTypeName","src":"3764:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3763:15:51"},"returnParameters":{"id":7272,"nodeType":"ParameterList","parameters":[],"src":"3801:0:51"},"scope":7308,"src":"3740:68:51","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":7306,"nodeType":"Block","src":"4383:270:51","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7280,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7277,"src":"4397:19:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":7281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4420:1:51","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4397:24:51","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7305,"nodeType":"IfStatement","src":"4393:254:51","trueBody":{"id":7304,"nodeType":"Block","src":"4423:224:51","statements":[{"assignments":[7284,null],"declarations":[{"constant":false,"id":7284,"mutability":"mutable","name":"success","nameLocation":"4443:7:51","nodeType":"VariableDeclaration","scope":7304,"src":"4438:12:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7283,"name":"bool","nodeType":"ElementaryTypeName","src":"4438:4:51","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":7300,"initialValue":{"arguments":[{"hexValue":"","id":7298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4534:2:51","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"arguments":[{"expression":{"id":7287,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4463:3:51","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":7288,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4463:10:51","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":7286,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4455:8:51","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":7285,"name":"address","nodeType":"ElementaryTypeName","src":"4455:8:51","stateMutability":"payable","typeDescriptions":{}}},"id":7289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4455:19:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":7290,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"4455:24:51","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":7297,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value","gas"],"nodeType":"FunctionCallOptions","options":[{"id":7291,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7277,"src":"4488:19:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"arguments":[{"id":7294,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4520:7:51","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":7293,"name":"uint256","nodeType":"ElementaryTypeName","src":"4520:7:51","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":7292,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4515:4:51","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":7295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4515:13:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":7296,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"4515:17:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4455:78:51","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":7299,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4455:82:51","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4437:100:51"},{"expression":{"components":[{"id":7301,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7284,"src":"4552:7:51","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":7302,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4551:9:51","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7303,"nodeType":"ExpressionStatement","src":"4551:9:51"}]}}]},"documentation":{"id":7275,"nodeType":"StructuredDocumentation","src":"3814:497:51","text":" sends to the entrypoint (msg.sender) the missing funds for this transaction.\n subclass MAY override this method for better funds management\n (e.g. send to the entryPoint more than the minimum required, so that in future transactions\n it will not be required to send again)\n @param missingAccountFunds the minimum value this method should send the entrypoint.\n this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster."},"id":7307,"implemented":true,"kind":"function","modifiers":[],"name":"_payPrefund","nameLocation":"4325:11:51","nodeType":"FunctionDefinition","parameters":{"id":7278,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7277,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"4345:19:51","nodeType":"VariableDeclaration","scope":7307,"src":"4337:27:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7276,"name":"uint256","nodeType":"ElementaryTypeName","src":"4337:7:51","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4336:29:51"},"returnParameters":{"id":7279,"nodeType":"ParameterList","parameters":[],"src":"4383:0:51"},"scope":7308,"src":"4316:337:51","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":7309,"src":"480:4175:51","usedErrors":[]}],"src":"36:4620:51"},"id":51},"contracts/core/BasePaymaster.sol":{"ast":{"absolutePath":"contracts/core/BasePaymaster.sol","exportedSymbols":{"BasePaymaster":[7528],"Context":[5151],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":7529,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":7310,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:52"},{"absolutePath":"@openzeppelin/contracts/access/Ownable.sol","file":"@openzeppelin/contracts/access/Ownable.sol","id":7311,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7529,"sourceUnit":2934,"src":"100:52:52","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IPaymaster.sol","file":"../interfaces/IPaymaster.sol","id":7312,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7529,"sourceUnit":10862,"src":"153:38:52","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":7313,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7529,"sourceUnit":10808,"src":"192:39:52","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/Helpers.sol","file":"./Helpers.sol","id":7314,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7529,"sourceUnit":9991,"src":"232:23:52","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7316,"name":"IPaymaster","nodeType":"IdentifierPath","referencedDeclaration":10861,"src":"444:10:52"},"id":7317,"nodeType":"InheritanceSpecifier","src":"444:10:52"},{"baseName":{"id":7318,"name":"Ownable","nodeType":"IdentifierPath","referencedDeclaration":2933,"src":"456:7:52"},"id":7319,"nodeType":"InheritanceSpecifier","src":"456:7:52"}],"canonicalName":"BasePaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":7315,"nodeType":"StructuredDocumentation","src":"257:151:52","text":" Helper class for creating a paymaster.\n provides helper methods for staking.\n validates that the postOp is called only by the entryPoint"},"fullyImplemented":false,"id":7528,"linearizedBaseContracts":[7528,2933,5151,10861],"name":"BasePaymaster","nameLocation":"427:13:52","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"b0d691fe","id":7322,"mutability":"immutable","name":"entryPoint","nameLocation":"500:10:52","nodeType":"VariableDeclaration","scope":7528,"src":"471:39:52","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":7321,"nodeType":"UserDefinedTypeName","pathNode":{"id":7320,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"471:11:52"},"referencedDeclaration":10807,"src":"471:11:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"public"},{"body":{"id":7332,"nodeType":"Block","src":"554:41:52","statements":[{"expression":{"id":7330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7328,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"564:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":7329,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7325,"src":"577:11:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"564:24:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7331,"nodeType":"ExpressionStatement","src":"564:24:52"}]},"id":7333,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":7326,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7325,"mutability":"mutable","name":"_entryPoint","nameLocation":"541:11:52","nodeType":"VariableDeclaration","scope":7333,"src":"529:23:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":7324,"nodeType":"UserDefinedTypeName","pathNode":{"id":7323,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"529:11:52"},"referencedDeclaration":10807,"src":"529:11:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"528:25:52"},"returnParameters":{"id":7327,"nodeType":"ParameterList","parameters":[],"src":"554:0:52"},"scope":7528,"src":"517:78:52","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[10849],"body":{"id":7358,"nodeType":"Block","src":"810:112:52","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":7349,"name":"_requireFromEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7527,"src":"821:22:52","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":7350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"821:24:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7351,"nodeType":"ExpressionStatement","src":"821:24:52"},{"expression":{"arguments":[{"id":7353,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7337,"src":"887:6:52","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":7354,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7339,"src":"895:10:52","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":7355,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7341,"src":"907:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7352,"name":"_validatePaymasterUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7373,"src":"862:24:52","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"function (struct UserOperation calldata,bytes32,uint256) returns (bytes memory,uint256)"}},"id":7356,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"862:53:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"functionReturnParameters":7348,"id":7357,"nodeType":"Return","src":"855:60:52"}]},"documentation":{"id":7334,"nodeType":"StructuredDocumentation","src":"601:26:52","text":"@inheritdoc IPaymaster"},"functionSelector":"f465c77e","id":7359,"implemented":true,"kind":"function","modifiers":[],"name":"validatePaymasterUserOp","nameLocation":"641:23:52","nodeType":"FunctionDefinition","overrides":{"id":7343,"nodeType":"OverrideSpecifier","overrides":[],"src":"746:8:52"},"parameters":{"id":7342,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7337,"mutability":"mutable","name":"userOp","nameLocation":"688:6:52","nodeType":"VariableDeclaration","scope":7359,"src":"665:29:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":7336,"nodeType":"UserDefinedTypeName","pathNode":{"id":7335,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"665:13:52"},"referencedDeclaration":10993,"src":"665:13:52","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":7339,"mutability":"mutable","name":"userOpHash","nameLocation":"704:10:52","nodeType":"VariableDeclaration","scope":7359,"src":"696:18:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7338,"name":"bytes32","nodeType":"ElementaryTypeName","src":"696:7:52","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":7341,"mutability":"mutable","name":"maxCost","nameLocation":"724:7:52","nodeType":"VariableDeclaration","scope":7359,"src":"716:15:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7340,"name":"uint256","nodeType":"ElementaryTypeName","src":"716:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"664:68:52"},"returnParameters":{"id":7348,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7345,"mutability":"mutable","name":"context","nameLocation":"777:7:52","nodeType":"VariableDeclaration","scope":7359,"src":"764:20:52","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7344,"name":"bytes","nodeType":"ElementaryTypeName","src":"764:5:52","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":7347,"mutability":"mutable","name":"validationData","nameLocation":"794:14:52","nodeType":"VariableDeclaration","scope":7359,"src":"786:22:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7346,"name":"uint256","nodeType":"ElementaryTypeName","src":"786:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"763:46:52"},"scope":7528,"src":"632:290:52","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":7373,"implemented":false,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"937:24:52","nodeType":"FunctionDefinition","parameters":{"id":7367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7362,"mutability":"mutable","name":"userOp","nameLocation":"985:6:52","nodeType":"VariableDeclaration","scope":7373,"src":"962:29:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":7361,"nodeType":"UserDefinedTypeName","pathNode":{"id":7360,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"962:13:52"},"referencedDeclaration":10993,"src":"962:13:52","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":7364,"mutability":"mutable","name":"userOpHash","nameLocation":"1001:10:52","nodeType":"VariableDeclaration","scope":7373,"src":"993:18:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7363,"name":"bytes32","nodeType":"ElementaryTypeName","src":"993:7:52","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":7366,"mutability":"mutable","name":"maxCost","nameLocation":"1021:7:52","nodeType":"VariableDeclaration","scope":7373,"src":"1013:15:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7365,"name":"uint256","nodeType":"ElementaryTypeName","src":"1013:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"961:68:52"},"returnParameters":{"id":7372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7369,"mutability":"mutable","name":"context","nameLocation":"1073:7:52","nodeType":"VariableDeclaration","scope":7373,"src":"1060:20:52","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7368,"name":"bytes","nodeType":"ElementaryTypeName","src":"1060:5:52","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":7371,"mutability":"mutable","name":"validationData","nameLocation":"1090:14:52","nodeType":"VariableDeclaration","scope":7373,"src":"1082:22:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7370,"name":"uint256","nodeType":"ElementaryTypeName","src":"1082:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1059:46:52"},"scope":7528,"src":"928:178:52","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[10860],"body":{"id":7394,"nodeType":"Block","src":"1241:88:52","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":7385,"name":"_requireFromEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7527,"src":"1251:22:52","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":7386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1251:24:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7387,"nodeType":"ExpressionStatement","src":"1251:24:52"},{"expression":{"arguments":[{"id":7389,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7377,"src":"1293:4:52","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":7390,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7379,"src":"1299:7:52","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":7391,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7381,"src":"1308:13:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7388,"name":"_postOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7416,"src":"1285:7:52","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_enum$_PostOpMode_$10834_$_t_bytes_calldata_ptr_$_t_uint256_$returns$__$","typeString":"function (enum IPaymaster.PostOpMode,bytes calldata,uint256)"}},"id":7392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1285:37:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7393,"nodeType":"ExpressionStatement","src":"1285:37:52"}]},"documentation":{"id":7374,"nodeType":"StructuredDocumentation","src":"1112:26:52","text":"@inheritdoc IPaymaster"},"functionSelector":"a9a23409","id":7395,"implemented":true,"kind":"function","modifiers":[],"name":"postOp","nameLocation":"1152:6:52","nodeType":"FunctionDefinition","overrides":{"id":7383,"nodeType":"OverrideSpecifier","overrides":[],"src":"1232:8:52"},"parameters":{"id":7382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7377,"mutability":"mutable","name":"mode","nameLocation":"1170:4:52","nodeType":"VariableDeclaration","scope":7395,"src":"1159:15:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":7376,"nodeType":"UserDefinedTypeName","pathNode":{"id":7375,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"1159:10:52"},"referencedDeclaration":10834,"src":"1159:10:52","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":7379,"mutability":"mutable","name":"context","nameLocation":"1191:7:52","nodeType":"VariableDeclaration","scope":7395,"src":"1176:22:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":7378,"name":"bytes","nodeType":"ElementaryTypeName","src":"1176:5:52","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":7381,"mutability":"mutable","name":"actualGasCost","nameLocation":"1208:13:52","nodeType":"VariableDeclaration","scope":7395,"src":"1200:21:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7380,"name":"uint256","nodeType":"ElementaryTypeName","src":"1200:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1158:64:52"},"returnParameters":{"id":7384,"nodeType":"ParameterList","parameters":[],"src":"1241:0:52"},"scope":7528,"src":"1143:186:52","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":7415,"nodeType":"Block","src":"2187:187:52","statements":[{"expression":{"components":[{"id":7406,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7399,"src":"2199:4:52","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":7407,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7401,"src":"2204:7:52","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":7408,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7403,"src":"2212:13:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":7409,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2198:28:52","typeDescriptions":{"typeIdentifier":"t_tuple$_t_enum$_PostOpMode_$10834_$_t_bytes_calldata_ptr_$_t_uint256_$","typeString":"tuple(enum IPaymaster.PostOpMode,bytes calldata,uint256)"}},"id":7410,"nodeType":"ExpressionStatement","src":"2198:28:52"},{"expression":{"arguments":[{"hexValue":"6d757374206f76657272696465","id":7412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2351:15:52","typeDescriptions":{"typeIdentifier":"t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d","typeString":"literal_string \"must override\""},"value":"must override"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d","typeString":"literal_string \"must override\""}],"id":7411,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"2344:6:52","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":7413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2344:23:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7414,"nodeType":"ExpressionStatement","src":"2344:23:52"}]},"documentation":{"id":7396,"nodeType":"StructuredDocumentation","src":"1335:749:52","text":" post-operation handler.\n (verified to be called only through the entryPoint)\n @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\n @param mode enum with the following options:\n opSucceeded - user operation succeeded.\n opReverted - user op reverted. still has to pay for gas.\n postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n Now this is the 2nd call, after user's op was deliberately reverted.\n @param context - the context value returned by validatePaymasterUserOp\n @param actualGasCost - actual gas used so far (without this postOp call)."},"id":7416,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"2098:7:52","nodeType":"FunctionDefinition","parameters":{"id":7404,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7399,"mutability":"mutable","name":"mode","nameLocation":"2117:4:52","nodeType":"VariableDeclaration","scope":7416,"src":"2106:15:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":7398,"nodeType":"UserDefinedTypeName","pathNode":{"id":7397,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"2106:10:52"},"referencedDeclaration":10834,"src":"2106:10:52","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":7401,"mutability":"mutable","name":"context","nameLocation":"2138:7:52","nodeType":"VariableDeclaration","scope":7416,"src":"2123:22:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":7400,"name":"bytes","nodeType":"ElementaryTypeName","src":"2123:5:52","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":7403,"mutability":"mutable","name":"actualGasCost","nameLocation":"2155:13:52","nodeType":"VariableDeclaration","scope":7416,"src":"2147:21:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7402,"name":"uint256","nodeType":"ElementaryTypeName","src":"2147:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2105:64:52"},"returnParameters":{"id":7405,"nodeType":"ParameterList","parameters":[],"src":"2187:0:52"},"scope":7528,"src":"2089:285:52","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":7432,"nodeType":"Block","src":"2508:71:52","statements":[{"expression":{"arguments":[{"arguments":[{"id":7428,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2566:4:52","typeDescriptions":{"typeIdentifier":"t_contract$_BasePaymaster_$7528","typeString":"contract BasePaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BasePaymaster_$7528","typeString":"contract BasePaymaster"}],"id":7427,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2558:7:52","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7426,"name":"address","nodeType":"ElementaryTypeName","src":"2558:7:52","typeDescriptions":{}}},"id":7429,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2558:13:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":7420,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"2518:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":10941,"src":"2518:20:52","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":7425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":7423,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2547:3:52","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":7424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"2547:9:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2518:39:52","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":7430,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2518:54:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7431,"nodeType":"ExpressionStatement","src":"2518:54:52"}]},"documentation":{"id":7417,"nodeType":"StructuredDocumentation","src":"2380:89:52","text":" add a deposit for this paymaster, used for paying for transaction fees"},"functionSelector":"d0e30db0","id":7433,"implemented":true,"kind":"function","modifiers":[],"name":"deposit","nameLocation":"2483:7:52","nodeType":"FunctionDefinition","parameters":{"id":7418,"nodeType":"ParameterList","parameters":[],"src":"2490:2:52"},"returnParameters":{"id":7419,"nodeType":"ParameterList","parameters":[],"src":"2508:0:52"},"scope":7528,"src":"2474:105:52","stateMutability":"payable","virtual":false,"visibility":"public"},{"body":{"id":7450,"nodeType":"Block","src":"2807:63:52","statements":[{"expression":{"arguments":[{"id":7446,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7436,"src":"2839:15:52","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":7447,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7438,"src":"2856:6:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":7443,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"2817:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"withdrawTo","nodeType":"MemberAccess","referencedDeclaration":10965,"src":"2817:21:52","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256) external"}},"id":7448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2817:46:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7449,"nodeType":"ExpressionStatement","src":"2817:46:52"}]},"documentation":{"id":7434,"nodeType":"StructuredDocumentation","src":"2585:131:52","text":" withdraw value from the deposit\n @param withdrawAddress target to send to\n @param amount to withdraw"},"functionSelector":"205c2878","id":7451,"implemented":true,"kind":"function","modifiers":[{"id":7441,"kind":"modifierInvocation","modifierName":{"id":7440,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2797:9:52"},"nodeType":"ModifierInvocation","src":"2797:9:52"}],"name":"withdrawTo","nameLocation":"2730:10:52","nodeType":"FunctionDefinition","parameters":{"id":7439,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7436,"mutability":"mutable","name":"withdrawAddress","nameLocation":"2757:15:52","nodeType":"VariableDeclaration","scope":7451,"src":"2741:31:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":7435,"name":"address","nodeType":"ElementaryTypeName","src":"2741:15:52","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":7438,"mutability":"mutable","name":"amount","nameLocation":"2782:6:52","nodeType":"VariableDeclaration","scope":7451,"src":"2774:14:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7437,"name":"uint256","nodeType":"ElementaryTypeName","src":"2774:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2740:49:52"},"returnParameters":{"id":7442,"nodeType":"ParameterList","parameters":[],"src":"2807:0:52"},"scope":7528,"src":"2721:149:52","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":7468,"nodeType":"Block","src":"3163:72:52","statements":[{"expression":{"arguments":[{"id":7465,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7454,"src":"3212:15:52","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":7459,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"3173:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7461,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addStake","nodeType":"MemberAccess","referencedDeclaration":10947,"src":"3173:19:52","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$","typeString":"function (uint32) payable external"}},"id":7464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":7462,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3201:3:52","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":7463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"3201:9:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3173:38:52","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$value","typeString":"function (uint32) payable external"}},"id":7466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3173:55:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7467,"nodeType":"ExpressionStatement","src":"3173:55:52"}]},"documentation":{"id":7452,"nodeType":"StructuredDocumentation","src":"2875:214:52","text":" add stake for this paymaster.\n This method can also carry eth value to add to the current stake.\n @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased."},"functionSelector":"0396cb60","id":7469,"implemented":true,"kind":"function","modifiers":[{"id":7457,"kind":"modifierInvocation","modifierName":{"id":7456,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"3153:9:52"},"nodeType":"ModifierInvocation","src":"3153:9:52"}],"name":"addStake","nameLocation":"3103:8:52","nodeType":"FunctionDefinition","parameters":{"id":7455,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7454,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"3119:15:52","nodeType":"VariableDeclaration","scope":7469,"src":"3112:22:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":7453,"name":"uint32","nodeType":"ElementaryTypeName","src":"3112:6:52","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"3111:24:52"},"returnParameters":{"id":7458,"nodeType":"ParameterList","parameters":[],"src":"3163:0:52"},"scope":7528,"src":"3094:141:52","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":7483,"nodeType":"Block","src":"3370:59:52","statements":[{"expression":{"arguments":[{"arguments":[{"id":7479,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3416:4:52","typeDescriptions":{"typeIdentifier":"t_contract$_BasePaymaster_$7528","typeString":"contract BasePaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BasePaymaster_$7528","typeString":"contract BasePaymaster"}],"id":7478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3408:7:52","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7477,"name":"address","nodeType":"ElementaryTypeName","src":"3408:7:52","typeDescriptions":{}}},"id":7480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3408:13:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":7475,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"3387:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":10935,"src":"3387:20:52","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":7481,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3387:35:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":7474,"id":7482,"nodeType":"Return","src":"3380:42:52"}]},"documentation":{"id":7470,"nodeType":"StructuredDocumentation","src":"3241:72:52","text":" return current paymaster's deposit on the entryPoint."},"functionSelector":"c399ec88","id":7484,"implemented":true,"kind":"function","modifiers":[],"name":"getDeposit","nameLocation":"3327:10:52","nodeType":"FunctionDefinition","parameters":{"id":7471,"nodeType":"ParameterList","parameters":[],"src":"3337:2:52"},"returnParameters":{"id":7474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7473,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7484,"src":"3361:7:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7472,"name":"uint256","nodeType":"ElementaryTypeName","src":"3361:7:52","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3360:9:52"},"scope":7528,"src":"3318:111:52","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":7495,"nodeType":"Block","src":"3630:41:52","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":7490,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"3640:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7492,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"unlockStake","nodeType":"MemberAccess","referencedDeclaration":10951,"src":"3640:22:52","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":7493,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3640:24:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7494,"nodeType":"ExpressionStatement","src":"3640:24:52"}]},"documentation":{"id":7485,"nodeType":"StructuredDocumentation","src":"3435:148:52","text":" unlock the stake, in order to withdraw it.\n The paymaster can't serve requests once unlocked, until it calls addStake again"},"functionSelector":"bb9fe6bf","id":7496,"implemented":true,"kind":"function","modifiers":[{"id":7488,"kind":"modifierInvocation","modifierName":{"id":7487,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"3620:9:52"},"nodeType":"ModifierInvocation","src":"3620:9:52"}],"name":"unlockStake","nameLocation":"3597:11:52","nodeType":"FunctionDefinition","parameters":{"id":7486,"nodeType":"ParameterList","parameters":[],"src":"3608:2:52"},"returnParameters":{"id":7489,"nodeType":"ParameterList","parameters":[],"src":"3630:0:52"},"scope":7528,"src":"3588:83:52","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":7510,"nodeType":"Block","src":"3965:58:52","statements":[{"expression":{"arguments":[{"id":7507,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7499,"src":"4000:15:52","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"id":7504,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"3975:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":7506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"withdrawStake","nodeType":"MemberAccess","referencedDeclaration":10957,"src":"3975:24:52","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_payable_$returns$__$","typeString":"function (address payable) external"}},"id":7508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3975:41:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7509,"nodeType":"ExpressionStatement","src":"3975:41:52"}]},"documentation":{"id":7497,"nodeType":"StructuredDocumentation","src":"3677:208:52","text":" withdraw the entire paymaster's stake.\n stake must be unlocked first (and then wait for the unstakeDelay to be over)\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":7511,"implemented":true,"kind":"function","modifiers":[{"id":7502,"kind":"modifierInvocation","modifierName":{"id":7501,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"3955:9:52"},"nodeType":"ModifierInvocation","src":"3955:9:52"}],"name":"withdrawStake","nameLocation":"3899:13:52","nodeType":"FunctionDefinition","parameters":{"id":7500,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7499,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3929:15:52","nodeType":"VariableDeclaration","scope":7511,"src":"3913:31:52","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":7498,"name":"address","nodeType":"ElementaryTypeName","src":"3913:15:52","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3912:33:52"},"returnParameters":{"id":7503,"nodeType":"ParameterList","parameters":[],"src":"3965:0:52"},"scope":7528,"src":"3890:133:52","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":7526,"nodeType":"Block","src":"4138:84:52","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":7522,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":7516,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4156:3:52","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":7517,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4156:10:52","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":7520,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7322,"src":"4178:10:52","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}],"id":7519,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4170:7:52","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7518,"name":"address","nodeType":"ElementaryTypeName","src":"4170:7:52","typeDescriptions":{}}},"id":7521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4170:19:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4156:33:52","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","id":7523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4191:23:52","typeDescriptions":{"typeIdentifier":"t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9","typeString":"literal_string \"Sender not EntryPoint\""},"value":"Sender not EntryPoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9","typeString":"literal_string \"Sender not EntryPoint\""}],"id":7515,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4148:7:52","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4148:67:52","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7525,"nodeType":"ExpressionStatement","src":"4148:67:52"}]},"documentation":{"id":7512,"nodeType":"StructuredDocumentation","src":"4029:53:52","text":"validate the call is made from a valid entrypoint"},"id":7527,"implemented":true,"kind":"function","modifiers":[],"name":"_requireFromEntryPoint","nameLocation":"4096:22:52","nodeType":"FunctionDefinition","parameters":{"id":7513,"nodeType":"ParameterList","parameters":[],"src":"4118:2:52"},"returnParameters":{"id":7514,"nodeType":"ParameterList","parameters":[],"src":"4138:0:52"},"scope":7528,"src":"4087:135:52","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":7529,"src":"409:3815:52","usedErrors":[]}],"src":"36:4189:52"},"id":52},"contracts/core/EntryPoint.sol":{"ast":{"absolutePath":"contracts/core/EntryPoint.sol","exportedSymbols":{"EntryPoint":[9752],"Exec":[20709],"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"NonceManager":[10080],"ReentrancyGuard":[3713],"SenderCreator":[10127],"StakeManager":[10552],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":9753,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":7530,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:53"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":7531,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10570,"src":"275:36:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IPaymaster.sol","file":"../interfaces/IPaymaster.sol","id":7532,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10862,"src":"312:38:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":7533,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10808,"src":"351:39:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/utils/Exec.sol","file":"../utils/Exec.sol","id":7534,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":20710,"src":"392:27:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/StakeManager.sol","file":"./StakeManager.sol","id":7535,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10553,"src":"420:28:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/SenderCreator.sol","file":"./SenderCreator.sol","id":7536,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10128,"src":"449:29:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/Helpers.sol","file":"./Helpers.sol","id":7537,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":9991,"src":"479:23:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/NonceManager.sol","file":"./NonceManager.sol","id":7538,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":10081,"src":"503:28:53","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/security/ReentrancyGuard.sol","file":"@openzeppelin/contracts/security/ReentrancyGuard.sol","id":7539,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9753,"sourceUnit":3714,"src":"532:62:53","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":7540,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"619:11:53"},"id":7541,"nodeType":"InheritanceSpecifier","src":"619:11:53"},{"baseName":{"id":7542,"name":"StakeManager","nodeType":"IdentifierPath","referencedDeclaration":10552,"src":"632:12:53"},"id":7543,"nodeType":"InheritanceSpecifier","src":"632:12:53"},{"baseName":{"id":7544,"name":"NonceManager","nodeType":"IdentifierPath","referencedDeclaration":10080,"src":"646:12:53"},"id":7545,"nodeType":"InheritanceSpecifier","src":"646:12:53"},{"baseName":{"id":7546,"name":"ReentrancyGuard","nodeType":"IdentifierPath","referencedDeclaration":3713,"src":"660:15:53"},"id":7547,"nodeType":"InheritanceSpecifier","src":"660:15:53"}],"canonicalName":"EntryPoint","contractDependencies":[10127],"contractKind":"contract","fullyImplemented":true,"id":9752,"linearizedBaseContracts":[9752,3713,10080,10552,10807,10826,10966],"name":"EntryPoint","nameLocation":"605:10:53","nodeType":"ContractDefinition","nodes":[{"global":false,"id":7551,"libraryName":{"id":7548,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"689:16:53"},"nodeType":"UsingForDirective","src":"683:41:53","typeName":{"id":7550,"nodeType":"UserDefinedTypeName","pathNode":{"id":7549,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"710:13:53"},"referencedDeclaration":10993,"src":"710:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"constant":false,"id":7558,"mutability":"immutable","name":"senderCreator","nameLocation":"762:13:53","nodeType":"VariableDeclaration","scope":9752,"src":"730:67:53","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"},"typeName":{"id":7553,"nodeType":"UserDefinedTypeName","pathNode":{"id":7552,"name":"SenderCreator","nodeType":"IdentifierPath","referencedDeclaration":10127,"src":"730:13:53"},"referencedDeclaration":10127,"src":"730:13:53","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"}},"value":{"arguments":[],"expression":{"argumentTypes":[],"id":7556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"778:17:53","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$__$returns$_t_contract$_SenderCreator_$10127_$","typeString":"function () returns (contract SenderCreator)"},"typeName":{"id":7555,"nodeType":"UserDefinedTypeName","pathNode":{"id":7554,"name":"SenderCreator","nodeType":"IdentifierPath","referencedDeclaration":10127,"src":"782:13:53"},"referencedDeclaration":10127,"src":"782:13:53","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"}}},"id":7557,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"778:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"}},"visibility":"private"},{"constant":true,"id":7564,"mutability":"constant","name":"SIMULATE_FIND_AGGREGATOR","nameLocation":"901:24:53","nodeType":"VariableDeclaration","scope":9752,"src":"876:62:53","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":7559,"name":"address","nodeType":"ElementaryTypeName","src":"876:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"31","id":7562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"936:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":7561,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"928:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7560,"name":"address","nodeType":"ElementaryTypeName","src":"928:7:53","typeDescriptions":{}}},"id":7563,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"928:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"constant":true,"id":7567,"mutability":"constant","name":"INNER_OUT_OF_GAS","nameLocation":"1020:16:53","nodeType":"VariableDeclaration","scope":9752,"src":"995:57:53","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7565,"name":"bytes32","nodeType":"ElementaryTypeName","src":"995:7:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"deaddead","id":7566,"isConstant":false,"isLValue":false,"isPure":true,"kind":"hexString","lValueRequested":false,"nodeType":"Literal","src":"1039:13:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_f151d40b3e75f8fa1cd1fce06fa6cde57ba88f05b41b14197de40325455f967a","typeString":"literal_string hex\"deaddead\""},"value":"ޭޭ"},"visibility":"private"},{"constant":true,"id":7570,"mutability":"constant","name":"REVERT_REASON_MAX_LEN","nameLocation":"1084:21:53","nodeType":"VariableDeclaration","scope":9752,"src":"1059:53:53","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7568,"name":"uint256","nodeType":"ElementaryTypeName","src":"1059:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32303438","id":7569,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1108:4:53","typeDescriptions":{"typeIdentifier":"t_rational_2048_by_1","typeString":"int_const 2048"},"value":"2048"},"visibility":"private"},{"constant":true,"documentation":{"id":7571,"nodeType":"StructuredDocumentation","src":"1119:167:53","text":" for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n in case of signature failure, instead of revert."},"functionSelector":"8f41ec5a","id":7574,"mutability":"constant","name":"SIG_VALIDATION_FAILED","nameLocation":"1315:21:53","nodeType":"VariableDeclaration","scope":9752,"src":"1291:49:53","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7572,"name":"uint256","nodeType":"ElementaryTypeName","src":"1291:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":7573,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1339:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"public"},{"body":{"id":7606,"nodeType":"Block","src":"1635:204:53","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":7588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7583,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7577,"src":"1653:11:53","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":7586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1676:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":7585,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1668:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7584,"name":"address","nodeType":"ElementaryTypeName","src":"1668:7:53","typeDescriptions":{}}},"id":7587,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1668:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1653:25:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393020696e76616c69642062656e6566696369617279","id":7589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1680:26:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814","typeString":"literal_string \"AA90 invalid beneficiary\""},"value":"AA90 invalid beneficiary"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814","typeString":"literal_string \"AA90 invalid beneficiary\""}],"id":7582,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1645:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1645:62:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7591,"nodeType":"ExpressionStatement","src":"1645:62:53"},{"assignments":[7593,null],"declarations":[{"constant":false,"id":7593,"mutability":"mutable","name":"success","nameLocation":"1723:7:53","nodeType":"VariableDeclaration","scope":7606,"src":"1718:12:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7592,"name":"bool","nodeType":"ElementaryTypeName","src":"1718:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":7600,"initialValue":{"arguments":[{"hexValue":"","id":7598,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1768:2:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":7594,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7577,"src":"1735:11:53","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":7595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"1735:16:53","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":7597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":7596,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7579,"src":"1760:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"1735:32:53","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":7599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1735:36:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"1717:54:53"},{"expression":{"arguments":[{"id":7602,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7593,"src":"1789:7:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"41413931206661696c65642073656e6420746f2062656e6566696369617279","id":7603,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1798:33:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea","typeString":"literal_string \"AA91 failed send to beneficiary\""},"value":"AA91 failed send to beneficiary"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea","typeString":"literal_string \"AA91 failed send to beneficiary\""}],"id":7601,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1781:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1781:51:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7605,"nodeType":"ExpressionStatement","src":"1781:51:53"}]},"documentation":{"id":7575,"nodeType":"StructuredDocumentation","src":"1347:208:53","text":" compensate the caller's beneficiary address with the collected fees of all UserOperations.\n @param beneficiary the address to receive the fees\n @param amount amount to transfer."},"id":7607,"implemented":true,"kind":"function","modifiers":[],"name":"_compensate","nameLocation":"1569:11:53","nodeType":"FunctionDefinition","parameters":{"id":7580,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7577,"mutability":"mutable","name":"beneficiary","nameLocation":"1597:11:53","nodeType":"VariableDeclaration","scope":7607,"src":"1581:27:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":7576,"name":"address","nodeType":"ElementaryTypeName","src":"1581:15:53","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":7579,"mutability":"mutable","name":"amount","nameLocation":"1618:6:53","nodeType":"VariableDeclaration","scope":7607,"src":"1610:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7578,"name":"uint256","nodeType":"ElementaryTypeName","src":"1610:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1580:45:53"},"returnParameters":{"id":7581,"nodeType":"ParameterList","parameters":[],"src":"1635:0:53"},"scope":9752,"src":"1560:279:53","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":7688,"nodeType":"Block","src":"2251:997:53","statements":[{"assignments":[7622],"declarations":[{"constant":false,"id":7622,"mutability":"mutable","name":"preGas","nameLocation":"2269:6:53","nodeType":"VariableDeclaration","scope":7688,"src":"2261:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7621,"name":"uint256","nodeType":"ElementaryTypeName","src":"2261:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7625,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":7623,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"2278:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":7624,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2278:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2261:26:53"},{"assignments":[7627],"declarations":[{"constant":false,"id":7627,"mutability":"mutable","name":"context","nameLocation":"2310:7:53","nodeType":"VariableDeclaration","scope":7688,"src":"2297:20:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":7626,"name":"bytes","nodeType":"ElementaryTypeName","src":"2297:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":7632,"initialValue":{"arguments":[{"expression":{"id":7629,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7616,"src":"2345:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":7630,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":8201,"src":"2345:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7628,"name":"getMemoryBytesFromOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9746,"src":"2320:24:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":7631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2320:46:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2297:69:53"},{"clauses":[{"block":{"id":7647,"nodeType":"Block","src":"2467:51:53","statements":[{"expression":{"id":7645,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7643,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7619,"src":"2481:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":7644,"name":"_actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7641,"src":"2493:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2481:26:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7646,"nodeType":"ExpressionStatement","src":"2481:26:53"}]},"errorName":"","id":7648,"nodeType":"TryCatchClause","parameters":{"id":7642,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7641,"mutability":"mutable","name":"_actualGasCost","nameLocation":"2451:14:53","nodeType":"VariableDeclaration","scope":7648,"src":"2443:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7640,"name":"uint256","nodeType":"ElementaryTypeName","src":"2443:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2442:24:53"},"src":"2434:84:53"},{"block":{"id":7685,"nodeType":"Block","src":"2525:717:53","statements":[{"assignments":[7650],"declarations":[{"constant":false,"id":7650,"mutability":"mutable","name":"innerRevertCode","nameLocation":"2547:15:53","nodeType":"VariableDeclaration","scope":7685,"src":"2539:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7649,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2539:7:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":7651,"nodeType":"VariableDeclarationStatement","src":"2539:23:53"},{"AST":{"nodeType":"YulBlock","src":"2585:100:53","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2618:1:53","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2621:1:53","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2624:2:53","type":"","value":"32"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"2603:14:53"},"nodeType":"YulFunctionCall","src":"2603:24:53"},"nodeType":"YulExpressionStatement","src":"2603:24:53"},{"nodeType":"YulAssignment","src":"2644:27:53","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2669:1:53","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2663:5:53"},"nodeType":"YulFunctionCall","src":"2663:8:53"},"variableNames":[{"name":"innerRevertCode","nodeType":"YulIdentifier","src":"2644:15:53"}]}]},"evmVersion":"london","externalReferences":[{"declaration":7650,"isOffset":false,"isSlot":false,"src":"2644:15:53","valueSize":1}],"id":7652,"nodeType":"InlineAssembly","src":"2576:109:53"},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":7655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7653,"name":"innerRevertCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7650,"src":"2783:15:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":7654,"name":"INNER_OUT_OF_GAS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7567,"src":"2802:16:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2783:35:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7662,"nodeType":"IfStatement","src":"2779:268:53","trueBody":{"id":7661,"nodeType":"Block","src":"2820:227:53","statements":[{"errorCall":{"arguments":[{"id":7657,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7610,"src":"3005:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413935206f7574206f6620676173","id":7658,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3014:17:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980","typeString":"literal_string \"AA95 out of gas\""},"value":"AA95 out of gas"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980","typeString":"literal_string \"AA95 out of gas\""}],"id":7656,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"2996:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":7659,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2996:36:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7660,"nodeType":"RevertStatement","src":"2989:43:53"}]}},{"assignments":[7664],"declarations":[{"constant":false,"id":7664,"mutability":"mutable","name":"actualGas","nameLocation":"3069:9:53","nodeType":"VariableDeclaration","scope":7685,"src":"3061:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7663,"name":"uint256","nodeType":"ElementaryTypeName","src":"3061:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7672,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7671,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7665,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7622,"src":"3081:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":7666,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3090:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":7667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3090:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3081:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":7669,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7616,"src":"3102:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":7670,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":8203,"src":"3102:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3081:36:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3061:56:53"},{"expression":{"id":7683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7673,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7619,"src":"3131:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7675,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7610,"src":"3157:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"expression":{"id":7676,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"3166:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":7677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":10834,"src":"3166:21:53","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":7678,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"3166:36:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":7679,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7616,"src":"3204:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":7680,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7627,"src":"3212:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":7681,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7664,"src":"3221:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7674,"name":"_handlePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9675,"src":"3143:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_enum$_PostOpMode_$10834_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,enum IPaymaster.PostOpMode,struct EntryPoint.UserOpInfo memory,bytes memory,uint256) returns (uint256)"}},"id":7682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3143:88:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3131:100:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7684,"nodeType":"ExpressionStatement","src":"3131:100:53"}]},"errorName":"","id":7686,"nodeType":"TryCatchClause","src":"2519:723:53"}],"externalCall":{"arguments":[{"expression":{"id":7635,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7613,"src":"2400:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":7636,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":10978,"src":"2400:15:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":7637,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7616,"src":"2417:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":7638,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7627,"src":"2425:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":7633,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2381:4:53","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}},"id":7634,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"innerHandleOp","nodeType":"MemberAccess","referencedDeclaration":8336,"src":"2381:18:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory,struct EntryPoint.UserOpInfo memory,bytes memory) external returns (uint256)"}},"id":7639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2381:52:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7687,"nodeType":"TryStatement","src":"2377:865:53"}]},"documentation":{"id":7608,"nodeType":"StructuredDocumentation","src":"1845:267:53","text":" execute a user op\n @param opIndex index into the opInfo array\n @param userOp the userOp to execute\n @param opInfo the opInfo filled by validatePrepayment for this userOp.\n @return collected the total amount this userOp paid."},"id":7689,"implemented":true,"kind":"function","modifiers":[],"name":"_executeUserOp","nameLocation":"2126:14:53","nodeType":"FunctionDefinition","parameters":{"id":7617,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7610,"mutability":"mutable","name":"opIndex","nameLocation":"2149:7:53","nodeType":"VariableDeclaration","scope":7689,"src":"2141:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7609,"name":"uint256","nodeType":"ElementaryTypeName","src":"2141:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":7613,"mutability":"mutable","name":"userOp","nameLocation":"2181:6:53","nodeType":"VariableDeclaration","scope":7689,"src":"2158:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":7612,"nodeType":"UserDefinedTypeName","pathNode":{"id":7611,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2158:13:53"},"referencedDeclaration":10993,"src":"2158:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":7616,"mutability":"mutable","name":"opInfo","nameLocation":"2207:6:53","nodeType":"VariableDeclaration","scope":7689,"src":"2189:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":7615,"nodeType":"UserDefinedTypeName","pathNode":{"id":7614,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"2189:10:53"},"referencedDeclaration":8204,"src":"2189:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"src":"2140:74:53"},"returnParameters":{"id":7620,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7619,"mutability":"mutable","name":"collected","nameLocation":"2240:9:53","nodeType":"VariableDeclaration","scope":7689,"src":"2232:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7618,"name":"uint256","nodeType":"ElementaryTypeName","src":"2232:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2231:19:53"},"scope":9752,"src":"2117:1131:53","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"baseFunctions":[10744],"body":{"id":7796,"nodeType":"Block","src":"3726:694:53","statements":[{"assignments":[7702],"declarations":[{"constant":false,"id":7702,"mutability":"mutable","name":"opslen","nameLocation":"3745:6:53","nodeType":"VariableDeclaration","scope":7796,"src":"3737:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7701,"name":"uint256","nodeType":"ElementaryTypeName","src":"3737:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7705,"initialValue":{"expression":{"id":7703,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7694,"src":"3754:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7704,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3754:10:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3737:27:53"},{"assignments":[7710],"declarations":[{"constant":false,"id":7710,"mutability":"mutable","name":"opInfos","nameLocation":"3794:7:53","nodeType":"VariableDeclaration","scope":7796,"src":"3774:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo[]"},"typeName":{"baseType":{"id":7708,"nodeType":"UserDefinedTypeName","pathNode":{"id":7707,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"3774:10:53"},"referencedDeclaration":8204,"src":"3774:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":7709,"nodeType":"ArrayTypeName","src":"3774:12:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}},"visibility":"internal"}],"id":7717,"initialValue":{"arguments":[{"id":7715,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7702,"src":"3821:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7714,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3804:16:53","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct EntryPoint.UserOpInfo memory[] memory)"},"typeName":{"baseType":{"id":7712,"nodeType":"UserDefinedTypeName","pathNode":{"id":7711,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"3808:10:53"},"referencedDeclaration":8204,"src":"3808:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":7713,"nodeType":"ArrayTypeName","src":"3808:12:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}}},"id":7716,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3804:24:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3774:54:53"},{"id":7795,"nodeType":"UncheckedBlock","src":"3835:567:53","statements":[{"body":{"id":7757,"nodeType":"Block","src":"3892:272:53","statements":[{"assignments":[7730],"declarations":[{"constant":false,"id":7730,"mutability":"mutable","name":"opInfo","nameLocation":"3924:6:53","nodeType":"VariableDeclaration","scope":7757,"src":"3906:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":7729,"nodeType":"UserDefinedTypeName","pathNode":{"id":7728,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"3906:10:53"},"referencedDeclaration":8204,"src":"3906:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":7734,"initialValue":{"baseExpression":{"id":7731,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7710,"src":"3933:7:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":7733,"indexExpression":{"id":7732,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"3941:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3933:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"3906:37:53"},{"assignments":[7736,7738],"declarations":[{"constant":false,"id":7736,"mutability":"mutable","name":"validationData","nameLocation":"3966:14:53","nodeType":"VariableDeclaration","scope":7757,"src":"3958:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7735,"name":"uint256","nodeType":"ElementaryTypeName","src":"3958:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":7738,"mutability":"mutable","name":"pmValidationData","nameLocation":"3990:16:53","nodeType":"VariableDeclaration","scope":7757,"src":"3982:24:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7737,"name":"uint256","nodeType":"ElementaryTypeName","src":"3982:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7746,"initialValue":{"arguments":[{"id":7740,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"4030:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":7741,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7694,"src":"4033:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7743,"indexExpression":{"id":7742,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"4037:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4033:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":7744,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7730,"src":"4041:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":7739,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9486,"src":"4010:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":7745,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4010:38:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"3957:91:53"},{"expression":{"arguments":[{"id":7748,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"4105:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":7749,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7736,"src":"4108:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":7750,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7738,"src":"4124:16:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"30","id":7753,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4150:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":7752,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4142:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7751,"name":"address","nodeType":"ElementaryTypeName","src":"4142:7:53","typeDescriptions":{}}},"id":7754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4142:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":7747,"name":"_validateAccountAndPaymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9263,"src":"4062:42:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$returns$__$","typeString":"function (uint256,uint256,uint256,address) view"}},"id":7755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4062:91:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7756,"nodeType":"ExpressionStatement","src":"4062:91:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7724,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7722,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"3875:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7723,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7702,"src":"3879:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3875:10:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7758,"initializationExpression":{"assignments":[7719],"declarations":[{"constant":false,"id":7719,"mutability":"mutable","name":"i","nameLocation":"3868:1:53","nodeType":"VariableDeclaration","scope":7758,"src":"3860:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7718,"name":"uint256","nodeType":"ElementaryTypeName","src":"3860:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7721,"initialValue":{"hexValue":"30","id":7720,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3872:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"3860:13:53"},"loopExpression":{"expression":{"id":7726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"3887:3:53","subExpression":{"id":7725,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7719,"src":"3887:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7727,"nodeType":"ExpressionStatement","src":"3887:3:53"},"nodeType":"ForStatement","src":"3855:309:53"},{"assignments":[7760],"declarations":[{"constant":false,"id":7760,"mutability":"mutable","name":"collected","nameLocation":"4182:9:53","nodeType":"VariableDeclaration","scope":7795,"src":"4174:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7759,"name":"uint256","nodeType":"ElementaryTypeName","src":"4174:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7762,"initialValue":{"hexValue":"30","id":7761,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4194:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4174:21:53"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":7763,"name":"BeforeExecution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10654,"src":"4210:15:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":7764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4210:17:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7765,"nodeType":"EmitStatement","src":"4205:22:53"},{"body":{"id":7788,"nodeType":"Block","src":"4275:75:53","statements":[{"expression":{"id":7786,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7776,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7760,"src":"4289:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":7778,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7767,"src":"4317:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":7779,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7694,"src":"4320:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7781,"indexExpression":{"id":7780,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7767,"src":"4324:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4320:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"baseExpression":{"id":7782,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7710,"src":"4328:7:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":7784,"indexExpression":{"id":7783,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7767,"src":"4336:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4328:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":7777,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7689,"src":"4302:14:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":7785,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4302:37:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4289:50:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7787,"nodeType":"ExpressionStatement","src":"4289:50:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7770,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7767,"src":"4258:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7771,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7702,"src":"4262:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4258:10:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7789,"initializationExpression":{"assignments":[7767],"declarations":[{"constant":false,"id":7767,"mutability":"mutable","name":"i","nameLocation":"4251:1:53","nodeType":"VariableDeclaration","scope":7789,"src":"4243:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7766,"name":"uint256","nodeType":"ElementaryTypeName","src":"4243:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7769,"initialValue":{"hexValue":"30","id":7768,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4255:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4243:13:53"},"loopExpression":{"expression":{"id":7774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4270:3:53","subExpression":{"id":7773,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7767,"src":"4270:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7775,"nodeType":"ExpressionStatement","src":"4270:3:53"},"nodeType":"ForStatement","src":"4238:112:53"},{"expression":{"arguments":[{"id":7791,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7696,"src":"4372:11:53","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":7792,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7760,"src":"4385:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7790,"name":"_compensate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7607,"src":"4360:11:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256)"}},"id":7793,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4360:35:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7794,"nodeType":"ExpressionStatement","src":"4360:35:53"}]}]},"documentation":{"id":7690,"nodeType":"StructuredDocumentation","src":"3254:369:53","text":" Execute a batch of UserOperations.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":7797,"implemented":true,"kind":"function","modifiers":[{"id":7699,"kind":"modifierInvocation","modifierName":{"id":7698,"name":"nonReentrant","nodeType":"IdentifierPath","referencedDeclaration":3689,"src":"3713:12:53"},"nodeType":"ModifierInvocation","src":"3713:12:53"}],"name":"handleOps","nameLocation":"3637:9:53","nodeType":"FunctionDefinition","parameters":{"id":7697,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7694,"mutability":"mutable","name":"ops","nameLocation":"3672:3:53","nodeType":"VariableDeclaration","scope":7797,"src":"3647:28:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":7692,"nodeType":"UserDefinedTypeName","pathNode":{"id":7691,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3647:13:53"},"referencedDeclaration":10993,"src":"3647:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":7693,"nodeType":"ArrayTypeName","src":"3647:15:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":7696,"mutability":"mutable","name":"beneficiary","nameLocation":"3693:11:53","nodeType":"VariableDeclaration","scope":7797,"src":"3677:27:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":7695,"name":"address","nodeType":"ElementaryTypeName","src":"3677:15:53","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3646:59:53"},"returnParameters":{"id":7700,"nodeType":"ParameterList","parameters":[],"src":"3726:0:53"},"scope":9752,"src":"3628:792:53","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[10754],"body":{"id":8086,"nodeType":"Block","src":"4830:2256:53","statements":[{"assignments":[7810],"declarations":[{"constant":false,"id":7810,"mutability":"mutable","name":"opasLen","nameLocation":"4849:7:53","nodeType":"VariableDeclaration","scope":8086,"src":"4841:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7809,"name":"uint256","nodeType":"ElementaryTypeName","src":"4841:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7813,"initialValue":{"expression":{"id":7811,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7802,"src":"4859:16:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":7812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4859:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4841:41:53"},{"assignments":[7815],"declarations":[{"constant":false,"id":7815,"mutability":"mutable","name":"totalOps","nameLocation":"4900:8:53","nodeType":"VariableDeclaration","scope":8086,"src":"4892:16:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7814,"name":"uint256","nodeType":"ElementaryTypeName","src":"4892:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7817,"initialValue":{"hexValue":"30","id":7816,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4911:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4892:20:53"},{"body":{"id":7896,"nodeType":"Block","src":"4960:693:53","statements":[{"assignments":[7830],"declarations":[{"constant":false,"id":7830,"mutability":"mutable","name":"opa","nameLocation":"5004:3:53","nodeType":"VariableDeclaration","scope":7896,"src":"4974:33:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":7829,"nodeType":"UserDefinedTypeName","pathNode":{"id":7828,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":10734,"src":"4974:20:53"},"referencedDeclaration":10734,"src":"4974:20:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":7834,"initialValue":{"baseExpression":{"id":7831,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7802,"src":"5010:16:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":7833,"indexExpression":{"id":7832,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7819,"src":"5027:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5010:19:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"4974:55:53"},{"assignments":[7839],"declarations":[{"constant":false,"id":7839,"mutability":"mutable","name":"ops","nameLocation":"5068:3:53","nodeType":"VariableDeclaration","scope":7896,"src":"5043:28:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":7837,"nodeType":"UserDefinedTypeName","pathNode":{"id":7836,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5043:13:53"},"referencedDeclaration":10993,"src":"5043:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":7838,"nodeType":"ArrayTypeName","src":"5043:15:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":7842,"initialValue":{"expression":{"id":7840,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7830,"src":"5074:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":7841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":10728,"src":"5074:11:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"5043:42:53"},{"assignments":[7845],"declarations":[{"constant":false,"id":7845,"mutability":"mutable","name":"aggregator","nameLocation":"5111:10:53","nodeType":"VariableDeclaration","scope":7896,"src":"5099:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"},"typeName":{"id":7844,"nodeType":"UserDefinedTypeName","pathNode":{"id":7843,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":10603,"src":"5099:11:53"},"referencedDeclaration":10603,"src":"5099:11:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"visibility":"internal"}],"id":7848,"initialValue":{"expression":{"id":7846,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7830,"src":"5124:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":7847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":10731,"src":"5124:14:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"nodeType":"VariableDeclarationStatement","src":"5099:39:53"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":7858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":7852,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7845,"src":"5233:10:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}],"id":7851,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5225:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7850,"name":"address","nodeType":"ElementaryTypeName","src":"5225:7:53","typeDescriptions":{}}},"id":7853,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5225:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"31","id":7856,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5256:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":7855,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5248:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7854,"name":"address","nodeType":"ElementaryTypeName","src":"5248:7:53","typeDescriptions":{}}},"id":7857,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5248:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5225:33:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393620696e76616c69642061676772656761746f72","id":7859,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5260:25:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883","typeString":"literal_string \"AA96 invalid aggregator\""},"value":"AA96 invalid aggregator"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883","typeString":"literal_string \"AA96 invalid aggregator\""}],"id":7849,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5217:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":7860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5217:69:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7861,"nodeType":"ExpressionStatement","src":"5217:69:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":7870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":7864,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7845,"src":"5313:10:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}],"id":7863,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5305:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7862,"name":"address","nodeType":"ElementaryTypeName","src":"5305:7:53","typeDescriptions":{}}},"id":7865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5305:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":7868,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5336:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":7867,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5328:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7866,"name":"address","nodeType":"ElementaryTypeName","src":"5328:7:53","typeDescriptions":{}}},"id":7869,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5328:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5305:33:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7890,"nodeType":"IfStatement","src":"5301:305:53","trueBody":{"id":7889,"nodeType":"Block","src":"5340:266:53","statements":[{"clauses":[{"block":{"id":7877,"nodeType":"Block","src":"5473:2:53","statements":[]},"errorName":"","id":7878,"nodeType":"TryCatchClause","src":"5473:2:53"},{"block":{"id":7886,"nodeType":"Block","src":"5498:94:53","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":7882,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7845,"src":"5561:10:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}],"id":7881,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5553:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7880,"name":"address","nodeType":"ElementaryTypeName","src":"5553:7:53","typeDescriptions":{}}},"id":7883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5553:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":7879,"name":"SignatureValidationFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10671,"src":"5527:25:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":7884,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5527:46:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7885,"nodeType":"RevertStatement","src":"5520:53:53"}]},"errorName":"","id":7887,"nodeType":"TryCatchClause","src":"5492:100:53"}],"externalCall":{"arguments":[{"id":7873,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7839,"src":"5453:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},{"expression":{"id":7874,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7830,"src":"5458:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":7875,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10733,"src":"5458:13:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":7871,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7845,"src":"5423:10:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"id":7872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"validateSignatures","nodeType":"MemberAccess","referencedDeclaration":10583,"src":"5423:29:53","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (struct UserOperation memory[] memory,bytes memory) view external"}},"id":7876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5423:49:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7888,"nodeType":"TryStatement","src":"5419:173:53"}]}},{"expression":{"id":7894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7891,"name":"totalOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7815,"src":"5620:8:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"expression":{"id":7892,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7839,"src":"5632:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7893,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5632:10:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5620:22:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7895,"nodeType":"ExpressionStatement","src":"5620:22:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7822,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7819,"src":"4942:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7823,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"4946:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4942:11:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7897,"initializationExpression":{"assignments":[7819],"declarations":[{"constant":false,"id":7819,"mutability":"mutable","name":"i","nameLocation":"4935:1:53","nodeType":"VariableDeclaration","scope":7897,"src":"4927:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7818,"name":"uint256","nodeType":"ElementaryTypeName","src":"4927:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7821,"initialValue":{"hexValue":"30","id":7820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4939:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4927:13:53"},"loopExpression":{"expression":{"id":7826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4955:3:53","subExpression":{"id":7825,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7819,"src":"4955:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7827,"nodeType":"ExpressionStatement","src":"4955:3:53"},"nodeType":"ForStatement","src":"4922:731:53"},{"assignments":[7902],"declarations":[{"constant":false,"id":7902,"mutability":"mutable","name":"opInfos","nameLocation":"5683:7:53","nodeType":"VariableDeclaration","scope":8086,"src":"5663:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo[]"},"typeName":{"baseType":{"id":7900,"nodeType":"UserDefinedTypeName","pathNode":{"id":7899,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"5663:10:53"},"referencedDeclaration":8204,"src":"5663:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":7901,"nodeType":"ArrayTypeName","src":"5663:12:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}},"visibility":"internal"}],"id":7909,"initialValue":{"arguments":[{"id":7907,"name":"totalOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7815,"src":"5710:8:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7906,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"5693:16:53","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct EntryPoint.UserOpInfo memory[] memory)"},"typeName":{"baseType":{"id":7904,"nodeType":"UserDefinedTypeName","pathNode":{"id":7903,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"5697:10:53"},"referencedDeclaration":8204,"src":"5697:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"id":7905,"nodeType":"ArrayTypeName","src":"5697:12:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_storage_$dyn_storage_ptr","typeString":"struct EntryPoint.UserOpInfo[]"}}},"id":7908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5693:26:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"5663:56:53"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":7910,"name":"BeforeExecution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10654,"src":"5735:15:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":7911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5735:17:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7912,"nodeType":"EmitStatement","src":"5730:22:53"},{"assignments":[7914],"declarations":[{"constant":false,"id":7914,"mutability":"mutable","name":"opIndex","nameLocation":"5771:7:53","nodeType":"VariableDeclaration","scope":8086,"src":"5763:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7913,"name":"uint256","nodeType":"ElementaryTypeName","src":"5763:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7916,"initialValue":{"hexValue":"30","id":7915,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5781:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5763:19:53"},{"body":{"id":7997,"nodeType":"Block","src":"5830:631:53","statements":[{"assignments":[7929],"declarations":[{"constant":false,"id":7929,"mutability":"mutable","name":"opa","nameLocation":"5874:3:53","nodeType":"VariableDeclaration","scope":7997,"src":"5844:33:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":7928,"nodeType":"UserDefinedTypeName","pathNode":{"id":7927,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":10734,"src":"5844:20:53"},"referencedDeclaration":10734,"src":"5844:20:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":7933,"initialValue":{"baseExpression":{"id":7930,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7802,"src":"5880:16:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":7932,"indexExpression":{"id":7931,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7918,"src":"5897:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5880:19:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"5844:55:53"},{"assignments":[7938],"declarations":[{"constant":false,"id":7938,"mutability":"mutable","name":"ops","nameLocation":"5938:3:53","nodeType":"VariableDeclaration","scope":7997,"src":"5913:28:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":7936,"nodeType":"UserDefinedTypeName","pathNode":{"id":7935,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5913:13:53"},"referencedDeclaration":10993,"src":"5913:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":7937,"nodeType":"ArrayTypeName","src":"5913:15:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":7941,"initialValue":{"expression":{"id":7939,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7929,"src":"5944:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":7940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":10728,"src":"5944:11:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"5913:42:53"},{"assignments":[7944],"declarations":[{"constant":false,"id":7944,"mutability":"mutable","name":"aggregator","nameLocation":"5981:10:53","nodeType":"VariableDeclaration","scope":7997,"src":"5969:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"},"typeName":{"id":7943,"nodeType":"UserDefinedTypeName","pathNode":{"id":7942,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":10603,"src":"5969:11:53"},"referencedDeclaration":10603,"src":"5969:11:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"visibility":"internal"}],"id":7947,"initialValue":{"expression":{"id":7945,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7929,"src":"5994:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":7946,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":10731,"src":"5994:14:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"nodeType":"VariableDeclarationStatement","src":"5969:39:53"},{"assignments":[7949],"declarations":[{"constant":false,"id":7949,"mutability":"mutable","name":"opslen","nameLocation":"6031:6:53","nodeType":"VariableDeclaration","scope":7997,"src":"6023:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7948,"name":"uint256","nodeType":"ElementaryTypeName","src":"6023:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7952,"initialValue":{"expression":{"id":7950,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7938,"src":"6040:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7951,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6040:10:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6023:27:53"},{"body":{"id":7995,"nodeType":"Block","src":"6101:350:53","statements":[{"assignments":[7965],"declarations":[{"constant":false,"id":7965,"mutability":"mutable","name":"opInfo","nameLocation":"6137:6:53","nodeType":"VariableDeclaration","scope":7995,"src":"6119:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":7964,"nodeType":"UserDefinedTypeName","pathNode":{"id":7963,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"6119:10:53"},"referencedDeclaration":8204,"src":"6119:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":7969,"initialValue":{"baseExpression":{"id":7966,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7902,"src":"6146:7:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":7968,"indexExpression":{"id":7967,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6154:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6146:16:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"6119:43:53"},{"assignments":[7971,7973],"declarations":[{"constant":false,"id":7971,"mutability":"mutable","name":"validationData","nameLocation":"6189:14:53","nodeType":"VariableDeclaration","scope":7995,"src":"6181:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7970,"name":"uint256","nodeType":"ElementaryTypeName","src":"6181:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":7973,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"6213:23:53","nodeType":"VariableDeclaration","scope":7995,"src":"6205:31:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7972,"name":"uint256","nodeType":"ElementaryTypeName","src":"6205:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7981,"initialValue":{"arguments":[{"id":7975,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6260:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":7976,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7938,"src":"6269:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":7978,"indexExpression":{"id":7977,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7954,"src":"6273:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6269:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":7979,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7965,"src":"6277:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":7974,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9486,"src":"6240:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":7980,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6240:44:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6180:104:53"},{"expression":{"arguments":[{"id":7983,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7954,"src":"6345:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":7984,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7971,"src":"6348:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":7985,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7973,"src":"6364:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":7988,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7944,"src":"6397:10:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}],"id":7987,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6389:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":7986,"name":"address","nodeType":"ElementaryTypeName","src":"6389:7:53","typeDescriptions":{}}},"id":7989,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6389:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":7982,"name":"_validateAccountAndPaymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9263,"src":"6302:42:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$returns$__$","typeString":"function (uint256,uint256,uint256,address) view"}},"id":7990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6302:107:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7991,"nodeType":"ExpressionStatement","src":"6302:107:53"},{"expression":{"id":7993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6427:9:53","subExpression":{"id":7992,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6427:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7994,"nodeType":"ExpressionStatement","src":"6427:9:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7957,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7954,"src":"6084:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7958,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7949,"src":"6088:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6084:10:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7996,"initializationExpression":{"assignments":[7954],"declarations":[{"constant":false,"id":7954,"mutability":"mutable","name":"i","nameLocation":"6077:1:53","nodeType":"VariableDeclaration","scope":7996,"src":"6069:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7953,"name":"uint256","nodeType":"ElementaryTypeName","src":"6069:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7956,"initialValue":{"hexValue":"30","id":7955,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6081:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6069:13:53"},"loopExpression":{"expression":{"id":7961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6096:3:53","subExpression":{"id":7960,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7954,"src":"6096:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7962,"nodeType":"ExpressionStatement","src":"6096:3:53"},"nodeType":"ForStatement","src":"6064:387:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7923,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7921,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7918,"src":"5812:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7922,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"5816:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5812:11:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7998,"initializationExpression":{"assignments":[7918],"declarations":[{"constant":false,"id":7918,"mutability":"mutable","name":"a","nameLocation":"5805:1:53","nodeType":"VariableDeclaration","scope":7998,"src":"5797:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7917,"name":"uint256","nodeType":"ElementaryTypeName","src":"5797:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":7920,"initialValue":{"hexValue":"30","id":7919,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5809:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5797:13:53"},"loopExpression":{"expression":{"id":7925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5825:3:53","subExpression":{"id":7924,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7918,"src":"5825:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":7926,"nodeType":"ExpressionStatement","src":"5825:3:53"},"nodeType":"ForStatement","src":"5792:669:53"},{"assignments":[8000],"declarations":[{"constant":false,"id":8000,"mutability":"mutable","name":"collected","nameLocation":"6479:9:53","nodeType":"VariableDeclaration","scope":8086,"src":"6471:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7999,"name":"uint256","nodeType":"ElementaryTypeName","src":"6471:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8002,"initialValue":{"hexValue":"30","id":8001,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6491:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6471:21:53"},{"expression":{"id":8005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8003,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6502:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":8004,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6512:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6502:11:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8006,"nodeType":"ExpressionStatement","src":"6502:11:53"},{"body":{"id":8072,"nodeType":"Block","src":"6561:420:53","statements":[{"assignments":[8019],"declarations":[{"constant":false,"id":8019,"mutability":"mutable","name":"opa","nameLocation":"6605:3:53","nodeType":"VariableDeclaration","scope":8072,"src":"6575:33:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"},"typeName":{"id":8018,"nodeType":"UserDefinedTypeName","pathNode":{"id":8017,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":10734,"src":"6575:20:53"},"referencedDeclaration":10734,"src":"6575:20:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"visibility":"internal"}],"id":8023,"initialValue":{"baseExpression":{"id":8020,"name":"opsPerAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7802,"src":"6611:16:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata[] calldata"}},"id":8022,"indexExpression":{"id":8021,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8008,"src":"6628:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6611:19:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"nodeType":"VariableDeclarationStatement","src":"6575:55:53"},{"eventCall":{"arguments":[{"arguments":[{"expression":{"id":8027,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8019,"src":"6684:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":8028,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":10731,"src":"6684:14:53","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}],"id":8026,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6676:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8025,"name":"address","nodeType":"ElementaryTypeName","src":"6676:7:53","typeDescriptions":{}}},"id":8029,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6676:23:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8024,"name":"SignatureAggregatorChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10659,"src":"6649:26:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":8030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6649:51:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8031,"nodeType":"EmitStatement","src":"6644:56:53"},{"assignments":[8036],"declarations":[{"constant":false,"id":8036,"mutability":"mutable","name":"ops","nameLocation":"6739:3:53","nodeType":"VariableDeclaration","scope":8072,"src":"6714:28:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":8034,"nodeType":"UserDefinedTypeName","pathNode":{"id":8033,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"6714:13:53"},"referencedDeclaration":10993,"src":"6714:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":8035,"nodeType":"ArrayTypeName","src":"6714:15:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":8039,"initialValue":{"expression":{"id":8037,"name":"opa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8019,"src":"6745:3:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator calldata"}},"id":8038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"userOps","nodeType":"MemberAccess","referencedDeclaration":10728,"src":"6745:11:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"nodeType":"VariableDeclarationStatement","src":"6714:42:53"},{"assignments":[8041],"declarations":[{"constant":false,"id":8041,"mutability":"mutable","name":"opslen","nameLocation":"6778:6:53","nodeType":"VariableDeclaration","scope":8072,"src":"6770:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8040,"name":"uint256","nodeType":"ElementaryTypeName","src":"6770:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8044,"initialValue":{"expression":{"id":8042,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8036,"src":"6787:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":8043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6787:10:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6770:27:53"},{"body":{"id":8070,"nodeType":"Block","src":"6849:122:53","statements":[{"expression":{"id":8065,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8055,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8000,"src":"6867:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":8057,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6895:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":8058,"name":"ops","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8036,"src":"6904:3:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":8060,"indexExpression":{"id":8059,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8046,"src":"6908:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6904:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"baseExpression":{"id":8061,"name":"opInfos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7902,"src":"6912:7:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpInfo_$8204_memory_ptr_$dyn_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory[] memory"}},"id":8063,"indexExpression":{"id":8062,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6920:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6912:16:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":8056,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7689,"src":"6880:14:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":8064,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6880:49:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6867:62:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8066,"nodeType":"ExpressionStatement","src":"6867:62:53"},{"expression":{"id":8068,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6947:9:53","subExpression":{"id":8067,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7914,"src":"6947:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8069,"nodeType":"ExpressionStatement","src":"6947:9:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8051,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8049,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8046,"src":"6832:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":8050,"name":"opslen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8041,"src":"6836:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6832:10:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8071,"initializationExpression":{"assignments":[8046],"declarations":[{"constant":false,"id":8046,"mutability":"mutable","name":"i","nameLocation":"6825:1:53","nodeType":"VariableDeclaration","scope":8071,"src":"6817:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8045,"name":"uint256","nodeType":"ElementaryTypeName","src":"6817:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8048,"initialValue":{"hexValue":"30","id":8047,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6829:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6817:13:53"},"loopExpression":{"expression":{"id":8053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6844:3:53","subExpression":{"id":8052,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8046,"src":"6844:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8054,"nodeType":"ExpressionStatement","src":"6844:3:53"},"nodeType":"ForStatement","src":"6812:159:53"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8011,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8008,"src":"6543:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":8012,"name":"opasLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"6547:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6543:11:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8073,"initializationExpression":{"assignments":[8008],"declarations":[{"constant":false,"id":8008,"mutability":"mutable","name":"a","nameLocation":"6536:1:53","nodeType":"VariableDeclaration","scope":8073,"src":"6528:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8007,"name":"uint256","nodeType":"ElementaryTypeName","src":"6528:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8010,"initialValue":{"hexValue":"30","id":8009,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6540:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6528:13:53"},"loopExpression":{"expression":{"id":8015,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6556:3:53","subExpression":{"id":8014,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8008,"src":"6556:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8016,"nodeType":"ExpressionStatement","src":"6556:3:53"},"nodeType":"ForStatement","src":"6523:458:53"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":8077,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7030:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8076,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7022:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8075,"name":"address","nodeType":"ElementaryTypeName","src":"7022:7:53","typeDescriptions":{}}},"id":8078,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7022:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8074,"name":"SignatureAggregatorChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10659,"src":"6995:26:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":8079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6995:38:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8080,"nodeType":"EmitStatement","src":"6990:43:53"},{"expression":{"arguments":[{"id":8082,"name":"beneficiary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7804,"src":"7056:11:53","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":8083,"name":"collected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8000,"src":"7069:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8081,"name":"_compensate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7607,"src":"7044:11:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256)"}},"id":8084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7044:35:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8085,"nodeType":"ExpressionStatement","src":"7044:35:53"}]},"documentation":{"id":7798,"nodeType":"StructuredDocumentation","src":"4426:249:53","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":8087,"implemented":true,"kind":"function","modifiers":[{"id":7807,"kind":"modifierInvocation","modifierName":{"id":7806,"name":"nonReentrant","nodeType":"IdentifierPath","referencedDeclaration":3689,"src":"4817:12:53"},"nodeType":"ModifierInvocation","src":"4817:12:53"}],"name":"handleAggregatedOps","nameLocation":"4689:19:53","nodeType":"FunctionDefinition","parameters":{"id":7805,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7802,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"4750:16:53","nodeType":"VariableDeclaration","scope":8087,"src":"4718:48:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":7800,"nodeType":"UserDefinedTypeName","pathNode":{"id":7799,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":10734,"src":"4718:20:53"},"referencedDeclaration":10734,"src":"4718:20:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":7801,"nodeType":"ArrayTypeName","src":"4718:22:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":7804,"mutability":"mutable","name":"beneficiary","nameLocation":"4792:11:53","nodeType":"VariableDeclaration","scope":8087,"src":"4776:27:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":7803,"name":"address","nodeType":"ElementaryTypeName","src":"4776:15:53","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"4708:101:53"},"returnParameters":{"id":7808,"nodeType":"ParameterList","parameters":[],"src":"4830:0:53"},"scope":9752,"src":"4680:2406:53","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[10806],"body":{"id":8174,"nodeType":"Block","src":"7242:688:53","statements":[{"assignments":[8101],"declarations":[{"constant":false,"id":8101,"mutability":"mutable","name":"opInfo","nameLocation":"7271:6:53","nodeType":"VariableDeclaration","scope":8174,"src":"7253:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":8100,"nodeType":"UserDefinedTypeName","pathNode":{"id":8099,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"7253:10:53"},"referencedDeclaration":8204,"src":"7253:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":8102,"nodeType":"VariableDeclarationStatement","src":"7253:24:53"},{"expression":{"arguments":[{"id":8104,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"7314:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":8103,"name":"_simulationOnlyValidations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8826,"src":"7287:26:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$__$","typeString":"function (struct UserOperation calldata) view"}},"id":8105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7287:30:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8106,"nodeType":"ExpressionStatement","src":"7287:30:53"},{"assignments":[8108,8110],"declarations":[{"constant":false,"id":8108,"mutability":"mutable","name":"validationData","nameLocation":"7336:14:53","nodeType":"VariableDeclaration","scope":8174,"src":"7328:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8107,"name":"uint256","nodeType":"ElementaryTypeName","src":"7328:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8110,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"7360:23:53","nodeType":"VariableDeclaration","scope":8174,"src":"7352:31:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8109,"name":"uint256","nodeType":"ElementaryTypeName","src":"7352:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8116,"initialValue":{"arguments":[{"hexValue":"30","id":8112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7407:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8113,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"7410:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":8114,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8101,"src":"7414:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":8111,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9486,"src":"7387:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":8115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7387:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"7327:94:53"},{"assignments":[8119],"declarations":[{"constant":false,"id":8119,"mutability":"mutable","name":"data","nameLocation":"7453:4:53","nodeType":"VariableDeclaration","scope":8174,"src":"7431:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":8118,"nodeType":"UserDefinedTypeName","pathNode":{"id":8117,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"7431:14:53"},"referencedDeclaration":9761,"src":"7431:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":8124,"initialValue":{"arguments":[{"id":8121,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8108,"src":"7480:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8122,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8110,"src":"7496:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8120,"name":"_intersectTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9905,"src":"7460:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (struct ValidationData memory)"}},"id":8123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7460:60:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"7431:89:53"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":8125,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9751,"src":"7531:12:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":8126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7531:14:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8127,"nodeType":"ExpressionStatement","src":"7531:14:53"},{"assignments":[8129],"declarations":[{"constant":false,"id":8129,"mutability":"mutable","name":"paid","nameLocation":"7563:4:53","nodeType":"VariableDeclaration","scope":8174,"src":"7555:12:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8128,"name":"uint256","nodeType":"ElementaryTypeName","src":"7555:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8135,"initialValue":{"arguments":[{"hexValue":"30","id":8131,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7585:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8132,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"7588:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":8133,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8101,"src":"7592:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":8130,"name":"_executeUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7689,"src":"7570:14:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256)"}},"id":8134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7570:29:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7555:44:53"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":8136,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9751,"src":"7609:12:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":8137,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7609:14:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8138,"nodeType":"ExpressionStatement","src":"7609:14:53"},{"assignments":[8140],"declarations":[{"constant":false,"id":8140,"mutability":"mutable","name":"targetSuccess","nameLocation":"7638:13:53","nodeType":"VariableDeclaration","scope":8174,"src":"7633:18:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8139,"name":"bool","nodeType":"ElementaryTypeName","src":"7633:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":8141,"nodeType":"VariableDeclarationStatement","src":"7633:18:53"},{"assignments":[8143],"declarations":[{"constant":false,"id":8143,"mutability":"mutable","name":"targetResult","nameLocation":"7674:12:53","nodeType":"VariableDeclaration","scope":8174,"src":"7661:25:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":8142,"name":"bytes","nodeType":"ElementaryTypeName","src":"7661:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":8144,"nodeType":"VariableDeclarationStatement","src":"7661:25:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8145,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8093,"src":"7700:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":8148,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7718:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8147,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7710:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8146,"name":"address","nodeType":"ElementaryTypeName","src":"7710:7:53","typeDescriptions":{}}},"id":8149,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7710:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7700:20:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8161,"nodeType":"IfStatement","src":"7696:110:53","trueBody":{"id":8160,"nodeType":"Block","src":"7722:84:53","statements":[{"expression":{"id":8158,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":8151,"name":"targetSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8140,"src":"7737:13:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":8152,"name":"targetResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8143,"src":"7752:12:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"id":8153,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"7736:29:53","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":8156,"name":"targetCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8095,"src":"7780:14:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":8154,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8093,"src":"7768:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8155,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"7768:11:53","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":8157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7768:27:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"src":"7736:59:53","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8159,"nodeType":"ExpressionStatement","src":"7736:59:53"}]}},{"errorCall":{"arguments":[{"expression":{"id":8163,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8101,"src":"7838:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8164,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":8203,"src":"7838:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8165,"name":"paid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8129,"src":"7855:4:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":8166,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8119,"src":"7861:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":8167,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"7861:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"expression":{"id":8168,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8119,"src":"7878:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":8169,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"7878:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":8170,"name":"targetSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8140,"src":"7895:13:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":8171,"name":"targetResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8143,"src":"7910:12:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":8162,"name":"ExecutionResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10724,"src":"7822:15:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint48_$_t_uint48_$_t_bool_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (uint256,uint256,uint48,uint48,bool,bytes memory) pure"}},"id":8172,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7822:101:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8173,"nodeType":"RevertStatement","src":"7815:108:53"}]},"documentation":{"id":8088,"nodeType":"StructuredDocumentation","src":"7092:27:53","text":"@inheritdoc IEntryPoint"},"functionSelector":"d6383f94","id":8175,"implemented":true,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"7133:16:53","nodeType":"FunctionDefinition","overrides":{"id":8097,"nodeType":"OverrideSpecifier","overrides":[],"src":"7233:8:53"},"parameters":{"id":8096,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8091,"mutability":"mutable","name":"op","nameLocation":"7173:2:53","nodeType":"VariableDeclaration","scope":8175,"src":"7150:25:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8090,"nodeType":"UserDefinedTypeName","pathNode":{"id":8089,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7150:13:53"},"referencedDeclaration":10993,"src":"7150:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":8093,"mutability":"mutable","name":"target","nameLocation":"7185:6:53","nodeType":"VariableDeclaration","scope":8175,"src":"7177:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8092,"name":"address","nodeType":"ElementaryTypeName","src":"7177:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8095,"mutability":"mutable","name":"targetCallData","nameLocation":"7208:14:53","nodeType":"VariableDeclaration","scope":8175,"src":"7193:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8094,"name":"bytes","nodeType":"ElementaryTypeName","src":"7193:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7149:74:53"},"returnParameters":{"id":8098,"nodeType":"ParameterList","parameters":[],"src":"7242:0:53"},"scope":9752,"src":"7124:806:53","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"EntryPoint.MemoryUserOp","id":8192,"members":[{"constant":false,"id":8177,"mutability":"mutable","name":"sender","nameLocation":"8121:6:53","nodeType":"VariableDeclaration","scope":8192,"src":"8113:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8176,"name":"address","nodeType":"ElementaryTypeName","src":"8113:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8179,"mutability":"mutable","name":"nonce","nameLocation":"8145:5:53","nodeType":"VariableDeclaration","scope":8192,"src":"8137:13:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8178,"name":"uint256","nodeType":"ElementaryTypeName","src":"8137:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8181,"mutability":"mutable","name":"callGasLimit","nameLocation":"8168:12:53","nodeType":"VariableDeclaration","scope":8192,"src":"8160:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8180,"name":"uint256","nodeType":"ElementaryTypeName","src":"8160:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8183,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"8198:20:53","nodeType":"VariableDeclaration","scope":8192,"src":"8190:28:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8182,"name":"uint256","nodeType":"ElementaryTypeName","src":"8190:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8185,"mutability":"mutable","name":"preVerificationGas","nameLocation":"8236:18:53","nodeType":"VariableDeclaration","scope":8192,"src":"8228:26:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8184,"name":"uint256","nodeType":"ElementaryTypeName","src":"8228:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8187,"mutability":"mutable","name":"paymaster","nameLocation":"8272:9:53","nodeType":"VariableDeclaration","scope":8192,"src":"8264:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8186,"name":"address","nodeType":"ElementaryTypeName","src":"8264:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8189,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"8299:12:53","nodeType":"VariableDeclaration","scope":8192,"src":"8291:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8188,"name":"uint256","nodeType":"ElementaryTypeName","src":"8291:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8191,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"8329:20:53","nodeType":"VariableDeclaration","scope":8192,"src":"8321:28:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8190,"name":"uint256","nodeType":"ElementaryTypeName","src":"8321:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"MemoryUserOp","nameLocation":"8090:12:53","nodeType":"StructDefinition","scope":9752,"src":"8083:273:53","visibility":"public"},{"canonicalName":"EntryPoint.UserOpInfo","id":8204,"members":[{"constant":false,"id":8195,"mutability":"mutable","name":"mUserOp","nameLocation":"8403:7:53","nodeType":"VariableDeclaration","scope":8204,"src":"8390:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":8194,"nodeType":"UserDefinedTypeName","pathNode":{"id":8193,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"8390:12:53"},"referencedDeclaration":8192,"src":"8390:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"},{"constant":false,"id":8197,"mutability":"mutable","name":"userOpHash","nameLocation":"8428:10:53","nodeType":"VariableDeclaration","scope":8204,"src":"8420:18:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8196,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8420:7:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8199,"mutability":"mutable","name":"prefund","nameLocation":"8456:7:53","nodeType":"VariableDeclaration","scope":8204,"src":"8448:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8198,"name":"uint256","nodeType":"ElementaryTypeName","src":"8448:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8201,"mutability":"mutable","name":"contextOffset","nameLocation":"8481:13:53","nodeType":"VariableDeclaration","scope":8204,"src":"8473:21:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8200,"name":"uint256","nodeType":"ElementaryTypeName","src":"8473:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8203,"mutability":"mutable","name":"preOpGas","nameLocation":"8512:8:53","nodeType":"VariableDeclaration","scope":8204,"src":"8504:16:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8202,"name":"uint256","nodeType":"ElementaryTypeName","src":"8504:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"UserOpInfo","nameLocation":"8369:10:53","nodeType":"StructDefinition","scope":9752,"src":"8362:165:53","visibility":"public"},{"body":{"id":8335,"nodeType":"Block","src":"8834:1347:53","statements":[{"assignments":[8218],"declarations":[{"constant":false,"id":8218,"mutability":"mutable","name":"preGas","nameLocation":"8852:6:53","nodeType":"VariableDeclaration","scope":8335,"src":"8844:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8217,"name":"uint256","nodeType":"ElementaryTypeName","src":"8844:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8221,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":8219,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"8861:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":8220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8861:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8844:26:53"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8223,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8888:3:53","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":8224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"8888:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":8227,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"8910:4:53","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}],"id":8226,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8902:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8225,"name":"address","nodeType":"ElementaryTypeName","src":"8902:7:53","typeDescriptions":{}}},"id":8228,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8902:13:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8888:27:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393220696e7465726e616c2063616c6c206f6e6c79","id":8230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8917:25:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66","typeString":"literal_string \"AA92 internal call only\""},"value":"AA92 internal call only"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66","typeString":"literal_string \"AA92 internal call only\""}],"id":8222,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8880:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":8231,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8880:63:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8232,"nodeType":"ExpressionStatement","src":"8880:63:53"},{"assignments":[8235],"declarations":[{"constant":false,"id":8235,"mutability":"mutable","name":"mUserOp","nameLocation":"8973:7:53","nodeType":"VariableDeclaration","scope":8335,"src":"8953:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":8234,"nodeType":"UserDefinedTypeName","pathNode":{"id":8233,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"8953:12:53"},"referencedDeclaration":8192,"src":"8953:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":8238,"initialValue":{"expression":{"id":8236,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8210,"src":"8983:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8237,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"8983:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"8953:44:53"},{"assignments":[8240],"declarations":[{"constant":false,"id":8240,"mutability":"mutable","name":"callGasLimit","nameLocation":"9013:12:53","nodeType":"VariableDeclaration","scope":8335,"src":"9008:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8239,"name":"uint","nodeType":"ElementaryTypeName","src":"9008:4:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8243,"initialValue":{"expression":{"id":8241,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8235,"src":"9028:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8242,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":8181,"src":"9028:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9008:40:53"},{"id":8256,"nodeType":"UncheckedBlock","src":"9054:293:53","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8252,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":8244,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"9155:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":8245,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9155:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8246,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8240,"src":"9167:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":8247,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8235,"src":"9182:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8248,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"9182:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9167:43:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"35303030","id":8250,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9213:4:53","typeDescriptions":{"typeIdentifier":"t_rational_5000_by_1","typeString":"int_const 5000"},"value":"5000"},"src":"9167:50:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9155:62:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8255,"nodeType":"IfStatement","src":"9151:190:53","trueBody":{"id":8254,"nodeType":"Block","src":"9219:122:53","statements":[{"AST":{"nodeType":"YulBlock","src":"9242:89:53","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9267:1:53","type":"","value":"0"},{"name":"INNER_OUT_OF_GAS","nodeType":"YulIdentifier","src":"9270:16:53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9260:6:53"},"nodeType":"YulFunctionCall","src":"9260:27:53"},"nodeType":"YulExpressionStatement","src":"9260:27:53"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9311:1:53","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9314:2:53","type":"","value":"32"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9304:6:53"},"nodeType":"YulFunctionCall","src":"9304:13:53"},"nodeType":"YulExpressionStatement","src":"9304:13:53"}]},"evmVersion":"london","externalReferences":[{"declaration":7567,"isOffset":false,"isSlot":false,"src":"9270:16:53","valueSize":1}],"id":8253,"nodeType":"InlineAssembly","src":"9233:98:53"}]}}]},{"assignments":[8261],"declarations":[{"constant":false,"id":8261,"mutability":"mutable","name":"mode","nameLocation":"9379:4:53","nodeType":"VariableDeclaration","scope":8335,"src":"9357:26:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":8260,"nodeType":"UserDefinedTypeName","pathNode":{"id":8259,"name":"IPaymaster.PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"9357:21:53"},"referencedDeclaration":10834,"src":"9357:21:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"}],"id":8265,"initialValue":{"expression":{"expression":{"id":8262,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"9386:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":8263,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":10834,"src":"9386:21:53","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":8264,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"opSucceeded","nodeType":"MemberAccess","referencedDeclaration":10831,"src":"9386:33:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"VariableDeclarationStatement","src":"9357:62:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8269,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8266,"name":"callData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8207,"src":"9433:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9433:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":8268,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9451:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9433:19:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8315,"nodeType":"IfStatement","src":"9429:466:53","trueBody":{"id":8314,"nodeType":"Block","src":"9454:441:53","statements":[{"assignments":[8271],"declarations":[{"constant":false,"id":8271,"mutability":"mutable","name":"success","nameLocation":"9473:7:53","nodeType":"VariableDeclaration","scope":8314,"src":"9468:12:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8270,"name":"bool","nodeType":"ElementaryTypeName","src":"9468:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":8280,"initialValue":{"arguments":[{"expression":{"id":8274,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8235,"src":"9493:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8275,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"9493:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":8276,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9509:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8277,"name":"callData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8207,"src":"9512:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":8278,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8240,"src":"9522:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":8272,"name":"Exec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20709,"src":"9483:4:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Exec_$20709_$","typeString":"type(library Exec)"}},"id":8273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","referencedDeclaration":20636,"src":"9483:9:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,uint256) returns (bool)"}},"id":8279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9483:52:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"9468:67:53"},{"condition":{"id":8282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"9553:8:53","subExpression":{"id":8281,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8271,"src":"9554:7:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8313,"nodeType":"IfStatement","src":"9549:336:53","trueBody":{"id":8312,"nodeType":"Block","src":"9563:322:53","statements":[{"assignments":[8284],"declarations":[{"constant":false,"id":8284,"mutability":"mutable","name":"result","nameLocation":"9594:6:53","nodeType":"VariableDeclaration","scope":8312,"src":"9581:19:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":8283,"name":"bytes","nodeType":"ElementaryTypeName","src":"9581:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":8289,"initialValue":{"arguments":[{"id":8287,"name":"REVERT_REASON_MAX_LEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7570,"src":"9622:21:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":8285,"name":"Exec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20709,"src":"9603:4:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Exec_$20709_$","typeString":"type(library Exec)"}},"id":8286,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getReturnData","nodeType":"MemberAccess","referencedDeclaration":20671,"src":"9603:18:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":8288,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9603:41:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9581:63:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8290,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8284,"src":"9666:6:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9666:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":8292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9682:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9666:17:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8305,"nodeType":"IfStatement","src":"9662:152:53","trueBody":{"id":8304,"nodeType":"Block","src":"9685:129:53","statements":[{"eventCall":{"arguments":[{"expression":{"id":8295,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8210,"src":"9738:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8296,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"9738:17:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":8297,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8235,"src":"9757:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8298,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"9757:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":8299,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8235,"src":"9773:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8300,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":8179,"src":"9773:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8301,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8284,"src":"9788:6:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":8294,"name":"UserOperationRevertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10651,"src":"9712:25:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes32,address,uint256,bytes memory)"}},"id":8302,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9712:83:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8303,"nodeType":"EmitStatement","src":"9707:88:53"}]}},{"expression":{"id":8310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8306,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8261,"src":"9831:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"expression":{"id":8307,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"9838:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":8308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":10834,"src":"9838:21:53","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":8309,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"opReverted","nodeType":"MemberAccess","referencedDeclaration":10832,"src":"9838:32:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"9831:39:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"id":8311,"nodeType":"ExpressionStatement","src":"9831:39:53"}]}}]}},{"id":8334,"nodeType":"UncheckedBlock","src":"9901:274:53","statements":[{"assignments":[8317],"declarations":[{"constant":false,"id":8317,"mutability":"mutable","name":"actualGas","nameLocation":"9929:9:53","nodeType":"VariableDeclaration","scope":8334,"src":"9921:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8316,"name":"uint256","nodeType":"ElementaryTypeName","src":"9921:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8325,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8318,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8218,"src":"9941:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":8319,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"9950:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":8320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9950:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9941:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":8322,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8210,"src":"9962:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8323,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":8203,"src":"9962:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9941:36:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9921:56:53"},{"expression":{"arguments":[{"hexValue":"30","id":8327,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10132:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8328,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8261,"src":"10135:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":8329,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8210,"src":"10141:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":8330,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8212,"src":"10149:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":8331,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8317,"src":"10158:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8326,"name":"_handlePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9675,"src":"10118:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_enum$_PostOpMode_$10834_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,enum IPaymaster.PostOpMode,struct EntryPoint.UserOpInfo memory,bytes memory,uint256) returns (uint256)"}},"id":8332,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10118:50:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":8216,"id":8333,"nodeType":"Return","src":"10111:57:53"}]}]},"documentation":{"id":8205,"nodeType":"StructuredDocumentation","src":"8533:159:53","text":" inner function to handle a UserOperation.\n Must be declared \"external\" to open a call context, but it can only be called by handleOps."},"functionSelector":"1d732756","id":8336,"implemented":true,"kind":"function","modifiers":[],"name":"innerHandleOp","nameLocation":"8706:13:53","nodeType":"FunctionDefinition","parameters":{"id":8213,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8207,"mutability":"mutable","name":"callData","nameLocation":"8733:8:53","nodeType":"VariableDeclaration","scope":8336,"src":"8720:21:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":8206,"name":"bytes","nodeType":"ElementaryTypeName","src":"8720:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":8210,"mutability":"mutable","name":"opInfo","nameLocation":"8761:6:53","nodeType":"VariableDeclaration","scope":8336,"src":"8743:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":8209,"nodeType":"UserDefinedTypeName","pathNode":{"id":8208,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"8743:10:53"},"referencedDeclaration":8204,"src":"8743:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":8212,"mutability":"mutable","name":"context","nameLocation":"8784:7:53","nodeType":"VariableDeclaration","scope":8336,"src":"8769:22:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8211,"name":"bytes","nodeType":"ElementaryTypeName","src":"8769:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8719:73:53"},"returnParameters":{"id":8216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8215,"mutability":"mutable","name":"actualGasCost","nameLocation":"8819:13:53","nodeType":"VariableDeclaration","scope":8336,"src":"8811:21:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8214,"name":"uint256","nodeType":"ElementaryTypeName","src":"8811:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8810:23:53"},"scope":9752,"src":"8697:1484:53","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[10763],"body":{"id":8360,"nodeType":"Block","src":"10473:90:53","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8348,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8340,"src":"10511:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hash","nodeType":"MemberAccess","referencedDeclaration":11145,"src":"10511:11:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes32_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes32)"}},"id":8350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10511:13:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":8353,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"10534:4:53","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}],"id":8352,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10526:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8351,"name":"address","nodeType":"ElementaryTypeName","src":"10526:7:53","typeDescriptions":{}}},"id":8354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10526:13:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":8355,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"10541:5:53","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":8356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"10541:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":8346,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"10500:3:53","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":8347,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"10500:10:53","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":8357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10500:55:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":8345,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"10490:9:53","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":8358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10490:66:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":8344,"id":8359,"nodeType":"Return","src":"10483:73:53"}]},"documentation":{"id":8337,"nodeType":"StructuredDocumentation","src":"10187:197:53","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":8361,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"10398:13:53","nodeType":"FunctionDefinition","parameters":{"id":8341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8340,"mutability":"mutable","name":"userOp","nameLocation":"10435:6:53","nodeType":"VariableDeclaration","scope":8361,"src":"10412:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8339,"nodeType":"UserDefinedTypeName","pathNode":{"id":8338,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"10412:13:53"},"referencedDeclaration":10993,"src":"10412:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"10411:31:53"},"returnParameters":{"id":8344,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8343,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8361,"src":"10464:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8342,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10464:7:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"10463:9:53"},"scope":9752,"src":"10389:174:53","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":8463,"nodeType":"Block","src":"10761:729:53","statements":[{"expression":{"id":8376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8371,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"10771:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8373,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"10771:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8374,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"10788:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"10788:13:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10771:30:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8377,"nodeType":"ExpressionStatement","src":"10771:30:53"},{"expression":{"id":8383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8378,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"10811:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8380,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":8179,"src":"10811:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8381,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"10827:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"10827:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10811:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8384,"nodeType":"ExpressionStatement","src":"10811:28:53"},{"expression":{"id":8390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8385,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"10849:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8387,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":8181,"src":"10849:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8388,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"10872:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":10980,"src":"10872:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10849:42:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8391,"nodeType":"ExpressionStatement","src":"10849:42:53"},{"expression":{"id":8397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8392,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"10901:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8394,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"10901:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8395,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"10932:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"10932:27:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10901:58:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8398,"nodeType":"ExpressionStatement","src":"10901:58:53"},{"expression":{"id":8404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8399,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"10969:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8401,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":8185,"src":"10969:26:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8402,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"10998:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":10984,"src":"10998:25:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10969:54:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8405,"nodeType":"ExpressionStatement","src":"10969:54:53"},{"expression":{"id":8411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8406,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"11033:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8408,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":8189,"src":"11033:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8409,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"11056:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8410,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10986,"src":"11056:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11033:42:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8412,"nodeType":"ExpressionStatement","src":"11033:42:53"},{"expression":{"id":8418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8413,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"11085:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8415,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":8191,"src":"11085:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":8416,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"11116:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"11116:27:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11085:58:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8419,"nodeType":"ExpressionStatement","src":"11085:58:53"},{"assignments":[8421],"declarations":[{"constant":false,"id":8421,"mutability":"mutable","name":"paymasterAndData","nameLocation":"11168:16:53","nodeType":"VariableDeclaration","scope":8463,"src":"11153:31:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8420,"name":"bytes","nodeType":"ElementaryTypeName","src":"11153:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":8424,"initialValue":{"expression":{"id":8422,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8365,"src":"11187:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"11187:23:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"11153:57:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8425,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8421,"src":"11224:16:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"11224:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":8427,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11250:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11224:27:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":8461,"nodeType":"Block","src":"11429:55:53","statements":[{"expression":{"id":8459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8452,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"11443:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8454,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"11443:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":8457,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11471:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8456,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11463:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8455,"name":"address","nodeType":"ElementaryTypeName","src":"11463:7:53","typeDescriptions":{}}},"id":8458,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11463:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11443:30:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8460,"nodeType":"ExpressionStatement","src":"11443:30:53"}]},"id":8462,"nodeType":"IfStatement","src":"11220:264:53","trueBody":{"id":8451,"nodeType":"Block","src":"11253:170:53","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8433,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8430,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8421,"src":"11275:16:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"11275:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":8432,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11302:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"11275:29:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141393320696e76616c6964207061796d6173746572416e6444617461","id":8434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11306:31:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd","typeString":"literal_string \"AA93 invalid paymasterAndData\""},"value":"AA93 invalid paymasterAndData"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd","typeString":"literal_string \"AA93 invalid paymasterAndData\""}],"id":8429,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11267:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":8435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11267:71:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8436,"nodeType":"ExpressionStatement","src":"11267:71:53"},{"expression":{"id":8449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8437,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8368,"src":"11352:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8439,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"11352:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"baseExpression":{"id":8444,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8421,"src":"11388:16:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":8445,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11407:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":8446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"11388:22:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":8443,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11380:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":8442,"name":"bytes20","nodeType":"ElementaryTypeName","src":"11380:7:53","typeDescriptions":{}}},"id":8447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11380:31:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":8441,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11372:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8440,"name":"address","nodeType":"ElementaryTypeName","src":"11372:7:53","typeDescriptions":{}}},"id":8448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11372:40:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11352:60:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8450,"nodeType":"ExpressionStatement","src":"11352:60:53"}]}}]},"documentation":{"id":8362,"nodeType":"StructuredDocumentation","src":"10569:84:53","text":" copy general fields from userOp into the memory opInfo structure."},"id":8464,"implemented":true,"kind":"function","modifiers":[],"name":"_copyUserOpToMemory","nameLocation":"10667:19:53","nodeType":"FunctionDefinition","parameters":{"id":8369,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8365,"mutability":"mutable","name":"userOp","nameLocation":"10710:6:53","nodeType":"VariableDeclaration","scope":8464,"src":"10687:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8364,"nodeType":"UserDefinedTypeName","pathNode":{"id":8363,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"10687:13:53"},"referencedDeclaration":10993,"src":"10687:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":8368,"mutability":"mutable","name":"mUserOp","nameLocation":"10738:7:53","nodeType":"VariableDeclaration","scope":8464,"src":"10718:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":8367,"nodeType":"UserDefinedTypeName","pathNode":{"id":8366,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"10718:12:53"},"referencedDeclaration":8192,"src":"10718:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"10686:60:53"},"returnParameters":{"id":8370,"nodeType":"ParameterList","parameters":[],"src":"10761:0:53"},"scope":9752,"src":"10658:832:53","stateMutability":"pure","virtual":false,"visibility":"internal"},{"baseFunctions":[10770],"body":{"id":8626,"nodeType":"Block","src":"11967:1426:53","statements":[{"assignments":[8473],"declarations":[{"constant":false,"id":8473,"mutability":"mutable","name":"outOpInfo","nameLocation":"11995:9:53","nodeType":"VariableDeclaration","scope":8626,"src":"11977:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":8472,"nodeType":"UserDefinedTypeName","pathNode":{"id":8471,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"11977:10:53"},"referencedDeclaration":8204,"src":"11977:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"id":8474,"nodeType":"VariableDeclarationStatement","src":"11977:27:53"},{"expression":{"arguments":[{"id":8476,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8468,"src":"12042:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":8475,"name":"_simulationOnlyValidations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8826,"src":"12015:26:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$__$","typeString":"function (struct UserOperation calldata) view"}},"id":8477,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12015:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8478,"nodeType":"ExpressionStatement","src":"12015:34:53"},{"assignments":[8480,8482],"declarations":[{"constant":false,"id":8480,"mutability":"mutable","name":"validationData","nameLocation":"12068:14:53","nodeType":"VariableDeclaration","scope":8626,"src":"12060:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8479,"name":"uint256","nodeType":"ElementaryTypeName","src":"12060:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8482,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"12092:23:53","nodeType":"VariableDeclaration","scope":8626,"src":"12084:31:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8481,"name":"uint256","nodeType":"ElementaryTypeName","src":"12084:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8488,"initialValue":{"arguments":[{"hexValue":"30","id":8484,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12139:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8485,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8468,"src":"12142:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":8486,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12150:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}],"id":8483,"name":"_validatePrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9486,"src":"12119:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory) returns (uint256,uint256)"}},"id":8487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12119:41:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"12059:101:53"},{"assignments":[8491],"declarations":[{"constant":false,"id":8491,"mutability":"mutable","name":"paymasterInfo","nameLocation":"12187:13:53","nodeType":"VariableDeclaration","scope":8626,"src":"12170:30:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":8490,"nodeType":"UserDefinedTypeName","pathNode":{"id":8489,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"12170:9:53"},"referencedDeclaration":10918,"src":"12170:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":8497,"initialValue":{"arguments":[{"expression":{"expression":{"id":8493,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12217:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8494,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"12217:17:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8495,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"12217:27:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8492,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10183,"src":"12203:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$10918_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":8496,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12203:42:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12170:75:53"},{"assignments":[8500],"declarations":[{"constant":false,"id":8500,"mutability":"mutable","name":"senderInfo","nameLocation":"12272:10:53","nodeType":"VariableDeclaration","scope":8626,"src":"12255:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":8499,"nodeType":"UserDefinedTypeName","pathNode":{"id":8498,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"12255:9:53"},"referencedDeclaration":10918,"src":"12255:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":8506,"initialValue":{"arguments":[{"expression":{"expression":{"id":8502,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12299:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8503,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"12299:17:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8504,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"12299:24:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8501,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10183,"src":"12285:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$10918_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":8505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12285:39:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12255:69:53"},{"assignments":[8509],"declarations":[{"constant":false,"id":8509,"mutability":"mutable","name":"factoryInfo","nameLocation":"12351:11:53","nodeType":"VariableDeclaration","scope":8626,"src":"12334:28:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":8508,"nodeType":"UserDefinedTypeName","pathNode":{"id":8507,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"12334:9:53"},"referencedDeclaration":10918,"src":"12334:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"id":8510,"nodeType":"VariableDeclarationStatement","src":"12334:28:53"},{"id":8544,"nodeType":"Block","src":"12372:219:53","statements":[{"assignments":[8512],"declarations":[{"constant":false,"id":8512,"mutability":"mutable","name":"initCode","nameLocation":"12401:8:53","nodeType":"VariableDeclaration","scope":8544,"src":"12386:23:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8511,"name":"bytes","nodeType":"ElementaryTypeName","src":"12386:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":8515,"initialValue":{"expression":{"id":8513,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8468,"src":"12412:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"12412:15:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"12386:41:53"},{"assignments":[8517],"declarations":[{"constant":false,"id":8517,"mutability":"mutable","name":"factory","nameLocation":"12449:7:53","nodeType":"VariableDeclaration","scope":8544,"src":"12441:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8516,"name":"address","nodeType":"ElementaryTypeName","src":"12441:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8537,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8521,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8518,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8512,"src":"12459:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"12459:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":8520,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12478:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"12459:21:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"hexValue":"30","id":8534,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12528:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8533,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12520:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8532,"name":"address","nodeType":"ElementaryTypeName","src":"12520:7:53","typeDescriptions":{}}},"id":8535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12520:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"12459:71:53","trueExpression":{"arguments":[{"arguments":[{"baseExpression":{"id":8526,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8512,"src":"12499:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":8528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12512:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":8529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"12499:16:53","startExpression":{"hexValue":"30","id":8527,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12508:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":8525,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12491:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":8524,"name":"bytes20","nodeType":"ElementaryTypeName","src":"12491:7:53","typeDescriptions":{}}},"id":8530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12491:25:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":8523,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12483:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8522,"name":"address","nodeType":"ElementaryTypeName","src":"12483:7:53","typeDescriptions":{}}},"id":8531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12483:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12441:89:53"},{"expression":{"id":8542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8538,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8509,"src":"12544:11:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":8540,"name":"factory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8517,"src":"12572:7:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8539,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10183,"src":"12558:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$10918_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":8541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12558:22:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"src":"12544:36:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":8543,"nodeType":"ExpressionStatement","src":"12544:36:53"}]},{"assignments":[8547],"declarations":[{"constant":false,"id":8547,"mutability":"mutable","name":"data","nameLocation":"12623:4:53","nodeType":"VariableDeclaration","scope":8626,"src":"12601:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":8546,"nodeType":"UserDefinedTypeName","pathNode":{"id":8545,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"12601:14:53"},"referencedDeclaration":9761,"src":"12601:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":8552,"initialValue":{"arguments":[{"id":8549,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8480,"src":"12650:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8550,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8482,"src":"12666:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8548,"name":"_intersectTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9905,"src":"12630:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (struct ValidationData memory)"}},"id":8551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12630:60:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"12601:89:53"},{"assignments":[8554],"declarations":[{"constant":false,"id":8554,"mutability":"mutable","name":"aggregator","nameLocation":"12708:10:53","nodeType":"VariableDeclaration","scope":8626,"src":"12700:18:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8553,"name":"address","nodeType":"ElementaryTypeName","src":"12700:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8557,"initialValue":{"expression":{"id":8555,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8547,"src":"12721:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":8556,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":9756,"src":"12721:15:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12700:36:53"},{"assignments":[8559],"declarations":[{"constant":false,"id":8559,"mutability":"mutable","name":"sigFailed","nameLocation":"12751:9:53","nodeType":"VariableDeclaration","scope":8626,"src":"12746:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8558,"name":"bool","nodeType":"ElementaryTypeName","src":"12746:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":8566,"initialValue":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8560,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8554,"src":"12763:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"31","id":8563,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12785:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":8562,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12777:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8561,"name":"address","nodeType":"ElementaryTypeName","src":"12777:7:53","typeDescriptions":{}}},"id":8564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12777:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12763:24:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"12746:41:53"},{"assignments":[8569],"declarations":[{"constant":false,"id":8569,"mutability":"mutable","name":"returnInfo","nameLocation":"12815:10:53","nodeType":"VariableDeclaration","scope":8626,"src":"12797:28:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":8568,"nodeType":"UserDefinedTypeName","pathNode":{"id":8567,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":10783,"src":"12797:10:53"},"referencedDeclaration":10783,"src":"12797:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"}],"id":8585,"initialValue":{"arguments":[{"expression":{"id":8571,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12839:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8572,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":8203,"src":"12839:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":8573,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12859:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8574,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":8199,"src":"12859:17:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8575,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8559,"src":"12890:9:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"expression":{"id":8576,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8547,"src":"12901:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":8577,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"12901:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"expression":{"id":8578,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8547,"src":"12918:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":8579,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"12918:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"arguments":[{"expression":{"id":8581,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8473,"src":"12960:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8582,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":8201,"src":"12960:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8580,"name":"getMemoryBytesFromOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9746,"src":"12935:24:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":8583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12935:49:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":8570,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10783,"src":"12828:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$10783_storage_ptr_$","typeString":"type(struct IEntryPoint.ReturnInfo storage pointer)"}},"id":8584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12828:157:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"12797:188:53"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":8598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8586,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8554,"src":"13000:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":8589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13022:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8588,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13014:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8587,"name":"address","nodeType":"ElementaryTypeName","src":"13014:7:53","typeDescriptions":{}}},"id":8590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13014:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13000:24:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8592,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8554,"src":"13028:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"31","id":8595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13050:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":8594,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13042:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8593,"name":"address","nodeType":"ElementaryTypeName","src":"13042:7:53","typeDescriptions":{}}},"id":8596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13042:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13028:24:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"13000:52:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8618,"nodeType":"IfStatement","src":"12996:305:53","trueBody":{"id":8617,"nodeType":"Block","src":"13054:247:53","statements":[{"assignments":[8601],"declarations":[{"constant":false,"id":8601,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"13095:14:53","nodeType":"VariableDeclaration","scope":8617,"src":"13068:41:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":8600,"nodeType":"UserDefinedTypeName","pathNode":{"id":8599,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10789,"src":"13068:19:53"},"referencedDeclaration":10789,"src":"13068:19:53","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"id":8608,"initialValue":{"arguments":[{"id":8603,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8554,"src":"13132:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":8605,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8554,"src":"13158:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8604,"name":"_getStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10183,"src":"13144:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_struct$_StakeInfo_$10918_memory_ptr_$","typeString":"function (address) view returns (struct IStakeManager.StakeInfo memory)"}},"id":8606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13144:25:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}],"id":8602,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10789,"src":"13112:19:53","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$10789_storage_ptr_$","typeString":"type(struct IEntryPoint.AggregatorStakeInfo storage pointer)"}},"id":8607,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13112:58:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}},"nodeType":"VariableDeclarationStatement","src":"13068:102:53"},{"errorCall":{"arguments":[{"id":8610,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8569,"src":"13223:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},{"id":8611,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8500,"src":"13235:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":8612,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8509,"src":"13247:11:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":8613,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8491,"src":"13260:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":8614,"name":"aggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8601,"src":"13275:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo memory"}],"id":8609,"name":"ValidationResultWithAggregation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10704,"src":"13191:31:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$10783_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$_t_struct$_AggregatorStakeInfo_$10789_memory_ptr_$returns$__$","typeString":"function (struct IEntryPoint.ReturnInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IEntryPoint.AggregatorStakeInfo memory) pure"}},"id":8615,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13191:99:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8616,"nodeType":"RevertStatement","src":"13184:106:53"}]}},{"errorCall":{"arguments":[{"id":8620,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8569,"src":"13334:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"}},{"id":8621,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8500,"src":"13346:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":8622,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8509,"src":"13358:11:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},{"id":8623,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8491,"src":"13371:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}],"id":8619,"name":"ValidationResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10686,"src":"13317:16:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$10783_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$_t_struct$_StakeInfo_$10918_memory_ptr_$returns$__$","typeString":"function (struct IEntryPoint.ReturnInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory,struct IStakeManager.StakeInfo memory) pure"}},"id":8624,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13317:68:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8625,"nodeType":"RevertStatement","src":"13310:75:53"}]},"documentation":{"id":8465,"nodeType":"StructuredDocumentation","src":"11496:398:53","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":8627,"implemented":true,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"11908:18:53","nodeType":"FunctionDefinition","parameters":{"id":8469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8468,"mutability":"mutable","name":"userOp","nameLocation":"11950:6:53","nodeType":"VariableDeclaration","scope":8627,"src":"11927:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8467,"nodeType":"UserDefinedTypeName","pathNode":{"id":8466,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"11927:13:53"},"referencedDeclaration":10993,"src":"11927:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"11926:31:53"},"returnParameters":{"id":8470,"nodeType":"ParameterList","parameters":[],"src":"11967:0:53"},"scope":9752,"src":"11899:1494:53","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":8669,"nodeType":"Block","src":"13505:445:53","statements":[{"id":8668,"nodeType":"UncheckedBlock","src":"13511:433:53","statements":[{"assignments":[8636],"declarations":[{"constant":false,"id":8636,"mutability":"mutable","name":"mul","nameLocation":"13711:3:53","nodeType":"VariableDeclaration","scope":8668,"src":"13703:11:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8635,"name":"uint256","nodeType":"ElementaryTypeName","src":"13703:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8647,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8637,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8630,"src":"13717:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8638,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"13717:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":8641,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13746:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8640,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13738:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8639,"name":"address","nodeType":"ElementaryTypeName","src":"13738:7:53","typeDescriptions":{}}},"id":8642,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13738:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13717:31:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"31","id":8645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13755:1:53","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"id":8646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"13717:39:53","trueExpression":{"hexValue":"33","id":8644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13751:1:53","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"13703:53:53"},{"assignments":[8649],"declarations":[{"constant":false,"id":8649,"mutability":"mutable","name":"requiredGas","nameLocation":"13774:11:53","nodeType":"VariableDeclaration","scope":8668,"src":"13766:19:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8648,"name":"uint256","nodeType":"ElementaryTypeName","src":"13766:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8660,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8650,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8630,"src":"13788:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8651,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":8181,"src":"13788:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8652,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8630,"src":"13811:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8653,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"13811:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":8654,"name":"mul","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8636,"src":"13842:3:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13811:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13788:57:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":8657,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8630,"src":"13848:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8658,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":8185,"src":"13848:26:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13788:86:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13766:108:53"},{"expression":{"id":8666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8661,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8633,"src":"13885:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8662,"name":"requiredGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8649,"src":"13903:11:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":8663,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8630,"src":"13917:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8664,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":8189,"src":"13917:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13903:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13885:52:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8667,"nodeType":"ExpressionStatement","src":"13885:52:53"}]}]},"id":8670,"implemented":true,"kind":"function","modifiers":[],"name":"_getRequiredPrefund","nameLocation":"13408:19:53","nodeType":"FunctionDefinition","parameters":{"id":8631,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8630,"mutability":"mutable","name":"mUserOp","nameLocation":"13448:7:53","nodeType":"VariableDeclaration","scope":8670,"src":"13428:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":8629,"nodeType":"UserDefinedTypeName","pathNode":{"id":8628,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"13428:12:53"},"referencedDeclaration":8192,"src":"13428:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"13427:29:53"},"returnParameters":{"id":8634,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8633,"mutability":"mutable","name":"requiredPrefund","nameLocation":"13488:15:53","nodeType":"VariableDeclaration","scope":8670,"src":"13480:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8632,"name":"uint256","nodeType":"ElementaryTypeName","src":"13480:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13479:25:53"},"scope":9752,"src":"13399:551:53","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":8769,"nodeType":"Block","src":"14111:777:53","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8680,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8677,"src":"14125:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"14125:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":8682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14144:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14125:20:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8768,"nodeType":"IfStatement","src":"14121:761:53","trueBody":{"id":8767,"nodeType":"Block","src":"14147:735:53","statements":[{"assignments":[8685],"declarations":[{"constant":false,"id":8685,"mutability":"mutable","name":"sender","nameLocation":"14169:6:53","nodeType":"VariableDeclaration","scope":8767,"src":"14161:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8684,"name":"address","nodeType":"ElementaryTypeName","src":"14161:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8689,"initialValue":{"expression":{"expression":{"id":8686,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"14178:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8687,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"14178:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8688,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"14178:21:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14161:38:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":8690,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8685,"src":"14217:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"14217:11:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8692,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"14217:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":8693,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14239:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14217:23:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8700,"nodeType":"IfStatement","src":"14213:88:53","trueBody":{"errorCall":{"arguments":[{"id":8696,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8672,"src":"14258:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414131302073656e64657220616c726561647920636f6e7374727563746564","id":8697,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14267:33:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79","typeString":"literal_string \"AA10 sender already constructed\""},"value":"AA10 sender already constructed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79","typeString":"literal_string \"AA10 sender already constructed\""}],"id":8695,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"14249:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8698,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14249:52:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8699,"nodeType":"RevertStatement","src":"14242:59:53"}},{"assignments":[8702],"declarations":[{"constant":false,"id":8702,"mutability":"mutable","name":"sender1","nameLocation":"14323:7:53","nodeType":"VariableDeclaration","scope":8767,"src":"14315:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8701,"name":"address","nodeType":"ElementaryTypeName","src":"14315:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8711,"initialValue":{"arguments":[{"id":8709,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8677,"src":"14403:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":8703,"name":"senderCreator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7558,"src":"14333:13:53","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"}},"id":8704,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"createSender","nodeType":"MemberAccess","referencedDeclaration":10126,"src":"14333:26:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes memory) external returns (address)"}},"id":8708,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"expression":{"id":8705,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"14366:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8706,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"14366:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8707,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"14366:35:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"14333:69:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$gas","typeString":"function (bytes memory) external returns (address)"}},"id":8710,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14333:79:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14315:97:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8712,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8702,"src":"14430:7:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":8715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14449:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8714,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14441:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8713,"name":"address","nodeType":"ElementaryTypeName","src":"14441:7:53","typeDescriptions":{}}},"id":8716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14441:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14430:21:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8723,"nodeType":"IfStatement","src":"14426:82:53","trueBody":{"errorCall":{"arguments":[{"id":8719,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8672,"src":"14469:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313320696e6974436f6465206661696c6564206f72204f4f47","id":8720,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14478:29:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73","typeString":"literal_string \"AA13 initCode failed or OOG\""},"value":"AA13 initCode failed or OOG"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73","typeString":"literal_string \"AA13 initCode failed or OOG\""}],"id":8718,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"14460:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14460:48:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8722,"nodeType":"RevertStatement","src":"14453:55:53"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8724,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8702,"src":"14526:7:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":8725,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8685,"src":"14537:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14526:17:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8732,"nodeType":"IfStatement","src":"14522:83:53","trueBody":{"errorCall":{"arguments":[{"id":8728,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8672,"src":"14561:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313420696e6974436f6465206d7573742072657475726e2073656e646572","id":8729,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14570:34:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602","typeString":"literal_string \"AA14 initCode must return sender\""},"value":"AA14 initCode must return sender"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602","typeString":"literal_string \"AA14 initCode must return sender\""}],"id":8727,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"14552:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14552:53:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8731,"nodeType":"RevertStatement","src":"14545:60:53"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8737,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":8733,"name":"sender1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8702,"src":"14623:7:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8734,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"14623:12:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8735,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"14623:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":8736,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14646:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14623:24:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8743,"nodeType":"IfStatement","src":"14619:90:53","trueBody":{"errorCall":{"arguments":[{"id":8739,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8672,"src":"14665:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141313520696e6974436f6465206d757374206372656174652073656e646572","id":8740,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14674:34:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6","typeString":"literal_string \"AA15 initCode must create sender\""},"value":"AA15 initCode must create sender"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6","typeString":"literal_string \"AA15 initCode must create sender\""}],"id":8738,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"14656:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8741,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14656:53:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8742,"nodeType":"RevertStatement","src":"14649:60:53"}},{"assignments":[8745],"declarations":[{"constant":false,"id":8745,"mutability":"mutable","name":"factory","nameLocation":"14731:7:53","nodeType":"VariableDeclaration","scope":8767,"src":"14723:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8744,"name":"address","nodeType":"ElementaryTypeName","src":"14723:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8756,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":8750,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8677,"src":"14757:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":8752,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14770:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":8753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"14757:16:53","startExpression":{"hexValue":"30","id":8751,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14766:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":8749,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14749:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":8748,"name":"bytes20","nodeType":"ElementaryTypeName","src":"14749:7:53","typeDescriptions":{}}},"id":8754,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14749:25:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":8747,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14741:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8746,"name":"address","nodeType":"ElementaryTypeName","src":"14741:7:53","typeDescriptions":{}}},"id":8755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14741:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14723:52:53"},{"eventCall":{"arguments":[{"expression":{"id":8758,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"14810:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8759,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"14810:17:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8760,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8685,"src":"14829:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8761,"name":"factory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8745,"src":"14837:7:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"expression":{"id":8762,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"14846:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8763,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"14846:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8764,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"14846:24:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8757,"name":"AccountDeployed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10640,"src":"14794:15:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address,address)"}},"id":8765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14794:77:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8766,"nodeType":"EmitStatement","src":"14789:82:53"}]}}]},"id":8770,"implemented":true,"kind":"function","modifiers":[],"name":"_createSenderIfNeeded","nameLocation":"14012:21:53","nodeType":"FunctionDefinition","parameters":{"id":8678,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8672,"mutability":"mutable","name":"opIndex","nameLocation":"14042:7:53","nodeType":"VariableDeclaration","scope":8770,"src":"14034:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8671,"name":"uint256","nodeType":"ElementaryTypeName","src":"14034:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8675,"mutability":"mutable","name":"opInfo","nameLocation":"14069:6:53","nodeType":"VariableDeclaration","scope":8770,"src":"14051:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":8674,"nodeType":"UserDefinedTypeName","pathNode":{"id":8673,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"14051:10:53"},"referencedDeclaration":8204,"src":"14051:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":8677,"mutability":"mutable","name":"initCode","nameLocation":"14092:8:53","nodeType":"VariableDeclaration","scope":8770,"src":"14077:23:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8676,"name":"bytes","nodeType":"ElementaryTypeName","src":"14077:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"14033:68:53"},"returnParameters":{"id":8679,"nodeType":"ParameterList","parameters":[],"src":"14111:0:53"},"scope":9752,"src":"14003:885:53","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[10795],"body":{"id":8787,"nodeType":"Block","src":"15294:114:53","statements":[{"assignments":[8777],"declarations":[{"constant":false,"id":8777,"mutability":"mutable","name":"sender","nameLocation":"15312:6:53","nodeType":"VariableDeclaration","scope":8787,"src":"15304:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8776,"name":"address","nodeType":"ElementaryTypeName","src":"15304:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8782,"initialValue":{"arguments":[{"id":8780,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8773,"src":"15348:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":8778,"name":"senderCreator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7558,"src":"15321:13:53","typeDescriptions":{"typeIdentifier":"t_contract$_SenderCreator_$10127","typeString":"contract SenderCreator"}},"id":8779,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"createSender","nodeType":"MemberAccess","referencedDeclaration":10126,"src":"15321:26:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes memory) external returns (address)"}},"id":8781,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15321:36:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"15304:53:53"},{"errorCall":{"arguments":[{"id":8784,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8777,"src":"15394:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8783,"name":"SenderAddressResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10709,"src":"15374:19:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":8785,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15374:27:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8786,"nodeType":"RevertStatement","src":"15367:34:53"}]},"documentation":{"id":8771,"nodeType":"StructuredDocumentation","src":"14894:337:53","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":8788,"implemented":true,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"15245:16:53","nodeType":"FunctionDefinition","parameters":{"id":8774,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8773,"mutability":"mutable","name":"initCode","nameLocation":"15277:8:53","nodeType":"VariableDeclaration","scope":8788,"src":"15262:23:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8772,"name":"bytes","nodeType":"ElementaryTypeName","src":"15262:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"15261:25:53"},"returnParameters":{"id":8775,"nodeType":"ParameterList","parameters":[],"src":"15294:0:53"},"scope":9752,"src":"15236:172:53","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":8825,"nodeType":"Block","src":"15495:340:53","statements":[{"clauses":[{"block":{"id":8803,"nodeType":"Block","src":"15652:2:53","statements":[]},"errorName":"","id":8804,"nodeType":"TryCatchClause","src":"15652:2:53"},{"block":{"id":8822,"nodeType":"Block","src":"15703:126:53","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":8810,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8806,"src":"15727:12:53","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":8809,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15721:5:53","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":8808,"name":"bytes","nodeType":"ElementaryTypeName","src":"15721:5:53","typeDescriptions":{}}},"id":8811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15721:19:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"15721:26:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":8813,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15751:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15721:31:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8821,"nodeType":"IfStatement","src":"15717:102:53","trueBody":{"id":8820,"nodeType":"Block","src":"15754:65:53","statements":[{"errorCall":{"arguments":[{"hexValue":"30","id":8816,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15788:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":8817,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8806,"src":"15791:12:53","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":8815,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"15779:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8818,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15779:25:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8819,"nodeType":"RevertStatement","src":"15772:32:53"}]}}]},"errorName":"Error","id":8823,"nodeType":"TryCatchClause","parameters":{"id":8807,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8806,"mutability":"mutable","name":"revertReason","nameLocation":"15689:12:53","nodeType":"VariableDeclaration","scope":8823,"src":"15675:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":8805,"name":"string","nodeType":"ElementaryTypeName","src":"15675:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"15674:28:53"},"src":"15663:166:53"}],"externalCall":{"arguments":[{"expression":{"id":8796,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8791,"src":"15595:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"15595:15:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"expression":{"id":8798,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8791,"src":"15612:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"15612:13:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":8800,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8791,"src":"15627:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"15627:23:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":8794,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"15562:4:53","typeDescriptions":{"typeIdentifier":"t_contract$_EntryPoint_$9752","typeString":"contract EntryPoint"}},"id":8795,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_validateSenderAndPaymaster","nodeType":"MemberAccess","referencedDeclaration":8887,"src":"15562:32:53","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory,address,bytes memory) view external"}},"id":8802,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15562:89:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8824,"nodeType":"TryStatement","src":"15558:271:53"}]},"id":8826,"implemented":true,"kind":"function","modifiers":[],"name":"_simulationOnlyValidations","nameLocation":"15423:26:53","nodeType":"FunctionDefinition","parameters":{"id":8792,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8791,"mutability":"mutable","name":"userOp","nameLocation":"15473:6:53","nodeType":"VariableDeclaration","scope":8826,"src":"15450:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8790,"nodeType":"UserDefinedTypeName","pathNode":{"id":8789,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"15450:13:53"},"referencedDeclaration":10993,"src":"15450:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"15449:31:53"},"returnParameters":{"id":8793,"nodeType":"ParameterList","parameters":[],"src":"15495:0:53"},"scope":9752,"src":"15414:421:53","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":8886,"nodeType":"Block","src":"16126:562:53","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":8845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8836,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8829,"src":"16140:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8837,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"16140:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":8838,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16159:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16140:20:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":8840,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8831,"src":"16164:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"16164:11:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8842,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"16164:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":8843,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16186:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16164:23:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16140:47:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8851,"nodeType":"IfStatement","src":"16136:182:53","trueBody":{"id":8850,"nodeType":"Block","src":"16189:129:53","statements":[{"expression":{"arguments":[{"hexValue":"41413230206163636f756e74206e6f74206465706c6f796564","id":8847,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16279:27:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e","typeString":"literal_string \"AA20 account not deployed\""},"value":"AA20 account not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e","typeString":"literal_string \"AA20 account not deployed\""}],"id":8846,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16272:6:53","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":8848,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16272:35:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8849,"nodeType":"ExpressionStatement","src":"16272:35:53"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8855,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":8852,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8833,"src":"16331:16:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":8853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"16331:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"3230","id":8854,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16358:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"16331:29:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8881,"nodeType":"IfStatement","src":"16327:310:53","trueBody":{"id":8880,"nodeType":"Block","src":"16362:275:53","statements":[{"assignments":[8857],"declarations":[{"constant":false,"id":8857,"mutability":"mutable","name":"paymaster","nameLocation":"16384:9:53","nodeType":"VariableDeclaration","scope":8880,"src":"16376:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8856,"name":"address","nodeType":"ElementaryTypeName","src":"16376:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8868,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":8862,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8833,"src":"16412:16:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":8864,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16433:2:53","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":8865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"16412:24:53","startExpression":{"hexValue":"30","id":8863,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16429:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":8861,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16404:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":8860,"name":"bytes20","nodeType":"ElementaryTypeName","src":"16404:7:53","typeDescriptions":{}}},"id":8866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16404:33:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":8859,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16396:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8858,"name":"address","nodeType":"ElementaryTypeName","src":"16396:7:53","typeDescriptions":{}}},"id":8867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16396:42:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"16376:62:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":8869,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8857,"src":"16456:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"16456:14:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":8871,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"16456:21:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":8872,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16481:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"16456:26:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8879,"nodeType":"IfStatement","src":"16452:175:53","trueBody":{"id":8878,"nodeType":"Block","src":"16484:143:53","statements":[{"expression":{"arguments":[{"hexValue":"41413330207061796d6173746572206e6f74206465706c6f796564","id":8875,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16582:29:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60","typeString":"literal_string \"AA30 paymaster not deployed\""},"value":"AA30 paymaster not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60","typeString":"literal_string \"AA30 paymaster not deployed\""}],"id":8874,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16575:6:53","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":8876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16575:37:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8877,"nodeType":"ExpressionStatement","src":"16575:37:53"}]}}]}},{"expression":{"arguments":[{"hexValue":"","id":8883,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"16678:2:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":8882,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"16671:6:53","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":8884,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16671:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8885,"nodeType":"ExpressionStatement","src":"16671:10:53"}]},"documentation":{"id":8827,"nodeType":"StructuredDocumentation","src":"15841:155:53","text":" Called only during simulation.\n This function always reverts to prevent warm/cold storage differentiation in simulation vs execution."},"functionSelector":"957122ab","id":8887,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSenderAndPaymaster","nameLocation":"16010:27:53","nodeType":"FunctionDefinition","parameters":{"id":8834,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8829,"mutability":"mutable","name":"initCode","nameLocation":"16053:8:53","nodeType":"VariableDeclaration","scope":8887,"src":"16038:23:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8828,"name":"bytes","nodeType":"ElementaryTypeName","src":"16038:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":8831,"mutability":"mutable","name":"sender","nameLocation":"16071:6:53","nodeType":"VariableDeclaration","scope":8887,"src":"16063:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8830,"name":"address","nodeType":"ElementaryTypeName","src":"16063:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8833,"mutability":"mutable","name":"paymasterAndData","nameLocation":"16094:16:53","nodeType":"VariableDeclaration","scope":8887,"src":"16079:31:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8832,"name":"bytes","nodeType":"ElementaryTypeName","src":"16079:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"16037:74:53"},"returnParameters":{"id":8835,"nodeType":"ParameterList","parameters":[],"src":"16126:0:53"},"scope":9752,"src":"16001:687:53","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":9058,"nodeType":"Block","src":"17115:1380:53","statements":[{"id":9057,"nodeType":"UncheckedBlock","src":"17121:1368:53","statements":[{"assignments":[8906],"declarations":[{"constant":false,"id":8906,"mutability":"mutable","name":"preGas","nameLocation":"17149:6:53","nodeType":"VariableDeclaration","scope":9057,"src":"17141:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8905,"name":"uint256","nodeType":"ElementaryTypeName","src":"17141:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8909,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":8907,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"17158:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":8908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17158:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17141:26:53"},{"assignments":[8912],"declarations":[{"constant":false,"id":8912,"mutability":"mutable","name":"mUserOp","nameLocation":"17197:7:53","nodeType":"VariableDeclaration","scope":9057,"src":"17177:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":8911,"nodeType":"UserDefinedTypeName","pathNode":{"id":8910,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"17177:12:53"},"referencedDeclaration":8192,"src":"17177:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":8915,"initialValue":{"expression":{"id":8913,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8896,"src":"17207:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8914,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"17207:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"17177:44:53"},{"assignments":[8917],"declarations":[{"constant":false,"id":8917,"mutability":"mutable","name":"sender","nameLocation":"17239:6:53","nodeType":"VariableDeclaration","scope":9057,"src":"17231:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8916,"name":"address","nodeType":"ElementaryTypeName","src":"17231:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8920,"initialValue":{"expression":{"id":8918,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8912,"src":"17248:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8919,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"17248:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"17231:31:53"},{"expression":{"arguments":[{"id":8922,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8890,"src":"17294:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":8923,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8896,"src":"17303:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"expression":{"id":8924,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8893,"src":"17311:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":8925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"17311:11:53","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":8921,"name":"_createSenderIfNeeded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8770,"src":"17272:21:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (uint256,struct EntryPoint.UserOpInfo memory,bytes calldata)"}},"id":8926,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17272:51:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8927,"nodeType":"ExpressionStatement","src":"17272:51:53"},{"assignments":[8929],"declarations":[{"constant":false,"id":8929,"mutability":"mutable","name":"paymaster","nameLocation":"17341:9:53","nodeType":"VariableDeclaration","scope":9057,"src":"17333:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8928,"name":"address","nodeType":"ElementaryTypeName","src":"17333:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8932,"initialValue":{"expression":{"id":8930,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8912,"src":"17353:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8931,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"17353:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"17333:37:53"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":8933,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9751,"src":"17380:12:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":8934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17380:14:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8935,"nodeType":"ExpressionStatement","src":"17380:14:53"},{"assignments":[8937],"declarations":[{"constant":false,"id":8937,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"17412:19:53","nodeType":"VariableDeclaration","scope":9057,"src":"17404:27:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8936,"name":"uint256","nodeType":"ElementaryTypeName","src":"17404:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8939,"initialValue":{"hexValue":"30","id":8938,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17434:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"17404:31:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8945,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8940,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8929,"src":"17449:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":8943,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17470:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8942,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17462:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8941,"name":"address","nodeType":"ElementaryTypeName","src":"17462:7:53","typeDescriptions":{}}},"id":8944,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17462:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"17449:23:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8964,"nodeType":"IfStatement","src":"17445:170:53","trueBody":{"id":8963,"nodeType":"Block","src":"17474:141:53","statements":[{"assignments":[8947],"declarations":[{"constant":false,"id":8947,"mutability":"mutable","name":"bal","nameLocation":"17496:3:53","nodeType":"VariableDeclaration","scope":8963,"src":"17488:11:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8946,"name":"uint256","nodeType":"ElementaryTypeName","src":"17488:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":8951,"initialValue":{"arguments":[{"id":8949,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8917,"src":"17512:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8948,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10197,"src":"17502:9:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":8950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17502:17:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17488:31:53"},{"expression":{"id":8961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8952,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8937,"src":"17533:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8953,"name":"bal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8947,"src":"17555:3:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":8954,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8898,"src":"17561:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17555:21:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8957,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8898,"src":"17583:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":8958,"name":"bal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8947,"src":"17601:3:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17583:21:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8960,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"17555:49:53","trueExpression":{"hexValue":"30","id":8956,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17579:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17533:71:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8962,"nodeType":"ExpressionStatement","src":"17533:71:53"}]}},{"clauses":[{"block":{"id":8984,"nodeType":"Block","src":"17782:57:53","statements":[{"expression":{"id":8982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8980,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8903,"src":"17796:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":8981,"name":"_validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8978,"src":"17813:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17796:32:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8983,"nodeType":"ExpressionStatement","src":"17796:32:53"}]},"errorName":"","id":8985,"nodeType":"TryCatchClause","parameters":{"id":8979,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8978,"mutability":"mutable","name":"_validationData","nameLocation":"17765:15:53","nodeType":"VariableDeclaration","scope":8985,"src":"17757:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8977,"name":"uint256","nodeType":"ElementaryTypeName","src":"17757:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17756:25:53"},"src":"17748:91:53"},{"block":{"id":8999,"nodeType":"Block","src":"17880:97:53","statements":[{"errorCall":{"arguments":[{"id":8990,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8890,"src":"17910:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"414132332072657665727465643a20","id":8994,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17933:17:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5","typeString":"literal_string \"AA23 reverted: \""},"value":"AA23 reverted: "},{"id":8995,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8987,"src":"17952:12:53","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5","typeString":"literal_string \"AA23 reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":8992,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17919:6:53","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":8991,"name":"string","nodeType":"ElementaryTypeName","src":"17919:6:53","typeDescriptions":{}}},"id":8993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"concat","nodeType":"MemberAccess","src":"17919:13:53","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":8996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17919:46:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":8989,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"17901:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":8997,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17901:65:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8998,"nodeType":"RevertStatement","src":"17894:72:53"}]},"errorName":"Error","id":9000,"nodeType":"TryCatchClause","parameters":{"id":8988,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8987,"mutability":"mutable","name":"revertReason","nameLocation":"17866:12:53","nodeType":"VariableDeclaration","scope":9000,"src":"17852:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":8986,"name":"string","nodeType":"ElementaryTypeName","src":"17852:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"17851:28:53"},"src":"17840:137:53"},{"block":{"id":9006,"nodeType":"Block","src":"17984:75:53","statements":[{"errorCall":{"arguments":[{"id":9002,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8890,"src":"18014:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141323320726576657274656420286f72204f4f4729","id":9003,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18023:24:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d","typeString":"literal_string \"AA23 reverted (or OOG)\""},"value":"AA23 reverted (or OOG)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d","typeString":"literal_string \"AA23 reverted (or OOG)\""}],"id":9001,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"18005:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18005:43:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9005,"nodeType":"RevertStatement","src":"17998:50:53"}]},"errorName":"","id":9007,"nodeType":"TryCatchClause","src":"17978:81:53"}],"externalCall":{"arguments":[{"id":8972,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8893,"src":"17696:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"expression":{"id":8973,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8896,"src":"17700:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":8974,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"17700:17:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8975,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8937,"src":"17719:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":8966,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8917,"src":"17637:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8965,"name":"IAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10569,"src":"17628:8:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IAccount_$10569_$","typeString":"type(contract IAccount)"}},"id":8967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17628:16:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IAccount_$10569","typeString":"contract IAccount"}},"id":8968,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"validateUserOp","nodeType":"MemberAccess","referencedDeclaration":10568,"src":"17628:31:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_uint256_$","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (uint256)"}},"id":8971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":8969,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8912,"src":"17666:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":8970,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"17666:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"17628:67:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_uint256_$gas","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (uint256)"}},"id":8976,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17628:111:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9008,"nodeType":"TryStatement","src":"17624:435:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9014,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9009,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8929,"src":"18072:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":9012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18093:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9011,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18085:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9010,"name":"address","nodeType":"ElementaryTypeName","src":"18085:7:53","typeDescriptions":{}}},"id":9013,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18085:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18072:23:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9049,"nodeType":"IfStatement","src":"18068:350:53","trueBody":{"id":9048,"nodeType":"Block","src":"18097:321:53","statements":[{"assignments":[9017],"declarations":[{"constant":false,"id":9017,"mutability":"mutable","name":"senderInfo","nameLocation":"18131:10:53","nodeType":"VariableDeclaration","scope":9048,"src":"18111:30:53","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":9016,"nodeType":"UserDefinedTypeName","pathNode":{"id":9015,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"18111:11:53"},"referencedDeclaration":10913,"src":"18111:11:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":9021,"initialValue":{"baseExpression":{"id":9018,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"18144:8:53","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":9020,"indexExpression":{"id":9019,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8917,"src":"18153:6:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18144:16:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"18111:49:53"},{"assignments":[9023],"declarations":[{"constant":false,"id":9023,"mutability":"mutable","name":"deposit","nameLocation":"18182:7:53","nodeType":"VariableDeclaration","scope":9048,"src":"18174:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9022,"name":"uint256","nodeType":"ElementaryTypeName","src":"18174:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9026,"initialValue":{"expression":{"id":9024,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9017,"src":"18192:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":9025,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"18192:18:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"18174:36:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9029,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9027,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8898,"src":"18228:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":9028,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9023,"src":"18246:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18228:25:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9036,"nodeType":"IfStatement","src":"18224:115:53","trueBody":{"id":9035,"nodeType":"Block","src":"18255:84:53","statements":[{"errorCall":{"arguments":[{"id":9031,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8890,"src":"18289:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413231206469646e2774207061792070726566756e64","id":9032,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18298:25:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d","typeString":"literal_string \"AA21 didn't pay prefund\""},"value":"AA21 didn't pay prefund"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d","typeString":"literal_string \"AA21 didn't pay prefund\""}],"id":9030,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"18280:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9033,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18280:44:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9034,"nodeType":"RevertStatement","src":"18273:51:53"}]}},{"expression":{"id":9046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9037,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9017,"src":"18352:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":9039,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"18352:18:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9042,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9023,"src":"18381:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":9043,"name":"requiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8898,"src":"18391:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18381:25:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9041,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18373:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":9040,"name":"uint112","nodeType":"ElementaryTypeName","src":"18373:7:53","typeDescriptions":{}}},"id":9045,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18373:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"18352:55:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":9047,"nodeType":"ExpressionStatement","src":"18352:55:53"}]}},{"expression":{"id":9055,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9050,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8901,"src":"18427:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9054,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9051,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8906,"src":"18464:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":9052,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"18473:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9053,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18473:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18464:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18427:55:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9056,"nodeType":"ExpressionStatement","src":"18427:55:53"}]}]},"documentation":{"id":8888,"nodeType":"StructuredDocumentation","src":"16694:195:53","text":" call account.validateUserOp.\n revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n decrement account's deposit if needed"},"id":9059,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAccountPrepayment","nameLocation":"16903:26:53","nodeType":"FunctionDefinition","parameters":{"id":8899,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8890,"mutability":"mutable","name":"opIndex","nameLocation":"16938:7:53","nodeType":"VariableDeclaration","scope":9059,"src":"16930:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8889,"name":"uint256","nodeType":"ElementaryTypeName","src":"16930:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8893,"mutability":"mutable","name":"op","nameLocation":"16970:2:53","nodeType":"VariableDeclaration","scope":9059,"src":"16947:25:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":8892,"nodeType":"UserDefinedTypeName","pathNode":{"id":8891,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"16947:13:53"},"referencedDeclaration":10993,"src":"16947:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":8896,"mutability":"mutable","name":"opInfo","nameLocation":"16992:6:53","nodeType":"VariableDeclaration","scope":9059,"src":"16974:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":8895,"nodeType":"UserDefinedTypeName","pathNode":{"id":8894,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"16974:10:53"},"referencedDeclaration":8204,"src":"16974:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":8898,"mutability":"mutable","name":"requiredPrefund","nameLocation":"17008:15:53","nodeType":"VariableDeclaration","scope":9059,"src":"17000:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8897,"name":"uint256","nodeType":"ElementaryTypeName","src":"17000:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16929:95:53"},"returnParameters":{"id":8904,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8901,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"17055:34:53","nodeType":"VariableDeclaration","scope":9059,"src":"17047:42:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8900,"name":"uint256","nodeType":"ElementaryTypeName","src":"17047:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8903,"mutability":"mutable","name":"validationData","nameLocation":"17099:14:53","nodeType":"VariableDeclaration","scope":9059,"src":"17091:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8902,"name":"uint256","nodeType":"ElementaryTypeName","src":"17091:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17046:68:53"},"scope":9752,"src":"16894:1601:53","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9191,"nodeType":"Block","src":"18998:1172:53","statements":[{"id":9190,"nodeType":"UncheckedBlock","src":"19004:1160:53","statements":[{"assignments":[9081],"declarations":[{"constant":false,"id":9081,"mutability":"mutable","name":"mUserOp","nameLocation":"19044:7:53","nodeType":"VariableDeclaration","scope":9190,"src":"19024:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":9080,"nodeType":"UserDefinedTypeName","pathNode":{"id":9079,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"19024:12:53"},"referencedDeclaration":8192,"src":"19024:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":9084,"initialValue":{"expression":{"id":9082,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9068,"src":"19054:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9083,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"19054:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"19024:44:53"},{"assignments":[9086],"declarations":[{"constant":false,"id":9086,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"19086:20:53","nodeType":"VariableDeclaration","scope":9190,"src":"19078:28:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9085,"name":"uint256","nodeType":"ElementaryTypeName","src":"19078:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9089,"initialValue":{"expression":{"id":9087,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9081,"src":"19109:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9088,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"19109:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19078:59:53"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9091,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9086,"src":"19155:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":9092,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9072,"src":"19178:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19155:57:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4141343120746f6f206c6974746c6520766572696669636174696f6e476173","id":9094,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"19214:33:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5","typeString":"literal_string \"AA41 too little verificationGas\""},"value":"AA41 too little verificationGas"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5","typeString":"literal_string \"AA41 too little verificationGas\""}],"id":9090,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"19147:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":9095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19147:101:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9096,"nodeType":"ExpressionStatement","src":"19147:101:53"},{"assignments":[9098],"declarations":[{"constant":false,"id":9098,"mutability":"mutable","name":"gas","nameLocation":"19266:3:53","nodeType":"VariableDeclaration","scope":9190,"src":"19258:11:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9097,"name":"uint256","nodeType":"ElementaryTypeName","src":"19258:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9102,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9099,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9086,"src":"19272:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":9100,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9072,"src":"19295:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19272:57:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19258:71:53"},{"assignments":[9104],"declarations":[{"constant":false,"id":9104,"mutability":"mutable","name":"paymaster","nameLocation":"19348:9:53","nodeType":"VariableDeclaration","scope":9190,"src":"19340:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9103,"name":"address","nodeType":"ElementaryTypeName","src":"19340:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9107,"initialValue":{"expression":{"id":9105,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9081,"src":"19360:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9106,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"19360:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"19340:37:53"},{"assignments":[9110],"declarations":[{"constant":false,"id":9110,"mutability":"mutable","name":"paymasterInfo","nameLocation":"19407:13:53","nodeType":"VariableDeclaration","scope":9190,"src":"19387:33:53","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":9109,"nodeType":"UserDefinedTypeName","pathNode":{"id":9108,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"19387:11:53"},"referencedDeclaration":10913,"src":"19387:11:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":9114,"initialValue":{"baseExpression":{"id":9111,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"19423:8:53","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":9113,"indexExpression":{"id":9112,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9104,"src":"19432:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19423:19:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"19387:55:53"},{"assignments":[9116],"declarations":[{"constant":false,"id":9116,"mutability":"mutable","name":"deposit","nameLocation":"19460:7:53","nodeType":"VariableDeclaration","scope":9190,"src":"19452:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9115,"name":"uint256","nodeType":"ElementaryTypeName","src":"19452:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9119,"initialValue":{"expression":{"id":9117,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9110,"src":"19470:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":9118,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"19470:21:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"19452:39:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9120,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9116,"src":"19505:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":9121,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9070,"src":"19515:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19505:25:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9129,"nodeType":"IfStatement","src":"19501:114:53","trueBody":{"id":9128,"nodeType":"Block","src":"19532:83:53","statements":[{"errorCall":{"arguments":[{"id":9124,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9062,"src":"19562:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413331207061796d6173746572206465706f73697420746f6f206c6f77","id":9125,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"19571:32:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f","typeString":"literal_string \"AA31 paymaster deposit too low\""},"value":"AA31 paymaster deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f","typeString":"literal_string \"AA31 paymaster deposit too low\""}],"id":9123,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"19553:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19553:51:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9127,"nodeType":"RevertStatement","src":"19546:58:53"}]}},{"expression":{"id":9139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9130,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9110,"src":"19624:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":9132,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"19624:21:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9137,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9135,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9116,"src":"19656:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":9136,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9070,"src":"19666:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19656:25:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9134,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19648:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":9133,"name":"uint112","nodeType":"ElementaryTypeName","src":"19648:7:53","typeDescriptions":{}}},"id":9138,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19648:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"19624:58:53","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":9140,"nodeType":"ExpressionStatement","src":"19624:58:53"},{"clauses":[{"block":{"id":9165,"nodeType":"Block","src":"19849:89:53","statements":[{"expression":{"id":9159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9157,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9075,"src":"19863:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9158,"name":"_context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9153,"src":"19873:8:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"src":"19863:18:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":9160,"nodeType":"ExpressionStatement","src":"19863:18:53"},{"expression":{"id":9163,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9161,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9077,"src":"19895:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9162,"name":"_validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9155,"src":"19912:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19895:32:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9164,"nodeType":"ExpressionStatement","src":"19895:32:53"}]},"errorName":"","id":9166,"nodeType":"TryCatchClause","parameters":{"id":9156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9153,"mutability":"mutable","name":"_context","nameLocation":"19815:8:53","nodeType":"VariableDeclaration","scope":9166,"src":"19802:21:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9152,"name":"bytes","nodeType":"ElementaryTypeName","src":"19802:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":9155,"mutability":"mutable","name":"_validationData","nameLocation":"19833:15:53","nodeType":"VariableDeclaration","scope":9166,"src":"19825:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9154,"name":"uint256","nodeType":"ElementaryTypeName","src":"19825:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19801:48:53"},"src":"19793:145:53"},{"block":{"id":9180,"nodeType":"Block","src":"19979:97:53","statements":[{"errorCall":{"arguments":[{"id":9171,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9062,"src":"20009:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"414133332072657665727465643a20","id":9175,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20032:17:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e","typeString":"literal_string \"AA33 reverted: \""},"value":"AA33 reverted: "},{"id":9176,"name":"revertReason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9168,"src":"20051:12:53","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e","typeString":"literal_string \"AA33 reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":9173,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"20018:6:53","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":9172,"name":"string","nodeType":"ElementaryTypeName","src":"20018:6:53","typeDescriptions":{}}},"id":9174,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"concat","nodeType":"MemberAccess","src":"20018:13:53","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":9177,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20018:46:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":9170,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"20000:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9178,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20000:65:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9179,"nodeType":"RevertStatement","src":"19993:72:53"}]},"errorName":"Error","id":9181,"nodeType":"TryCatchClause","parameters":{"id":9169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9168,"mutability":"mutable","name":"revertReason","nameLocation":"19965:12:53","nodeType":"VariableDeclaration","scope":9181,"src":"19951:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":9167,"name":"string","nodeType":"ElementaryTypeName","src":"19951:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"19950:28:53"},"src":"19939:137:53"},{"block":{"id":9187,"nodeType":"Block","src":"20083:75:53","statements":[{"errorCall":{"arguments":[{"id":9183,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9062,"src":"20113:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141333320726576657274656420286f72204f4f4729","id":9184,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20122:24:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c","typeString":"literal_string \"AA33 reverted (or OOG)\""},"value":"AA33 reverted (or OOG)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c","typeString":"literal_string \"AA33 reverted (or OOG)\""}],"id":9182,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"20104:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20104:43:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9186,"nodeType":"RevertStatement","src":"20097:50:53"}]},"errorName":"","id":9188,"nodeType":"TryCatchClause","src":"20077:81:53"}],"externalCall":{"arguments":[{"id":9147,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9065,"src":"19753:2:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"expression":{"id":9148,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9068,"src":"19757:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9149,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"19757:17:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":9150,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9070,"src":"19776:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":9142,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9104,"src":"19707:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9141,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"19696:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":9143,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19696:21:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$10861","typeString":"contract IPaymaster"}},"id":9144,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"validatePaymasterUserOp","nodeType":"MemberAccess","referencedDeclaration":10849,"src":"19696:45:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (bytes memory,uint256)"}},"id":9146,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"id":9145,"name":"gas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9098,"src":"19748:3:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"19696:56:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$gas","typeString":"function (struct UserOperation memory,bytes32,uint256) external returns (bytes memory,uint256)"}},"id":9151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19696:96:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"id":9189,"nodeType":"TryStatement","src":"19692:466:53"}]}]},"documentation":{"id":9060,"nodeType":"StructuredDocumentation","src":"18501:247:53","text":" In case the request has a paymaster:\n Validate paymaster has enough deposit.\n Call paymaster.validatePaymasterUserOp.\n Revert with proper FailedOp in case paymaster reverts.\n Decrement paymaster's deposit"},"id":9192,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterPrepayment","nameLocation":"18762:28:53","nodeType":"FunctionDefinition","parameters":{"id":9073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9062,"mutability":"mutable","name":"opIndex","nameLocation":"18799:7:53","nodeType":"VariableDeclaration","scope":9192,"src":"18791:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9061,"name":"uint256","nodeType":"ElementaryTypeName","src":"18791:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9065,"mutability":"mutable","name":"op","nameLocation":"18831:2:53","nodeType":"VariableDeclaration","scope":9192,"src":"18808:25:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":9064,"nodeType":"UserDefinedTypeName","pathNode":{"id":9063,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"18808:13:53"},"referencedDeclaration":10993,"src":"18808:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":9068,"mutability":"mutable","name":"opInfo","nameLocation":"18853:6:53","nodeType":"VariableDeclaration","scope":9192,"src":"18835:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":9067,"nodeType":"UserDefinedTypeName","pathNode":{"id":9066,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"18835:10:53"},"referencedDeclaration":8204,"src":"18835:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":9070,"mutability":"mutable","name":"requiredPreFund","nameLocation":"18869:15:53","nodeType":"VariableDeclaration","scope":9192,"src":"18861:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9069,"name":"uint256","nodeType":"ElementaryTypeName","src":"18861:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9072,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"18894:34:53","nodeType":"VariableDeclaration","scope":9192,"src":"18886:42:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9071,"name":"uint256","nodeType":"ElementaryTypeName","src":"18886:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18790:139:53"},"returnParameters":{"id":9078,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9075,"mutability":"mutable","name":"context","nameLocation":"18965:7:53","nodeType":"VariableDeclaration","scope":9192,"src":"18952:20:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9074,"name":"bytes","nodeType":"ElementaryTypeName","src":"18952:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":9077,"mutability":"mutable","name":"validationData","nameLocation":"18982:14:53","nodeType":"VariableDeclaration","scope":9192,"src":"18974:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9076,"name":"uint256","nodeType":"ElementaryTypeName","src":"18974:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18951:46:53"},"scope":9752,"src":"18753:1417:53","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9262,"nodeType":"Block","src":"20446:893:53","statements":[{"assignments":[9205,9207],"declarations":[{"constant":false,"id":9205,"mutability":"mutable","name":"aggregator","nameLocation":"20465:10:53","nodeType":"VariableDeclaration","scope":9262,"src":"20457:18:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9204,"name":"address","nodeType":"ElementaryTypeName","src":"20457:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9207,"mutability":"mutable","name":"outOfTimeRange","nameLocation":"20482:14:53","nodeType":"VariableDeclaration","scope":9262,"src":"20477:19:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9206,"name":"bool","nodeType":"ElementaryTypeName","src":"20477:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":9211,"initialValue":{"arguments":[{"id":9209,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9197,"src":"20519:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9208,"name":"_getValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9311,"src":"20500:18:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_address_$_t_bool_$","typeString":"function (uint256) view returns (address,bool)"}},"id":9210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20500:34:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"nodeType":"VariableDeclarationStatement","src":"20456:78:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9212,"name":"expectedAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9201,"src":"20548:18:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":9213,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9205,"src":"20570:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"20548:32:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9221,"nodeType":"IfStatement","src":"20544:111:53","trueBody":{"id":9220,"nodeType":"Block","src":"20582:73:53","statements":[{"errorCall":{"arguments":[{"id":9216,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9195,"src":"20612:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413234207369676e6174757265206572726f72","id":9217,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20621:22:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""},"value":"AA24 signature error"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""}],"id":9215,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"20603:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9218,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20603:41:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9219,"nodeType":"RevertStatement","src":"20596:48:53"}]}},{"condition":{"id":9222,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9207,"src":"20668:14:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9229,"nodeType":"IfStatement","src":"20664:96:53","trueBody":{"id":9228,"nodeType":"Block","src":"20684:76:53","statements":[{"errorCall":{"arguments":[{"id":9224,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9195,"src":"20714:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414132322065787069726564206f72206e6f7420647565","id":9225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"20723:25:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766","typeString":"literal_string \"AA22 expired or not due\""},"value":"AA22 expired or not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766","typeString":"literal_string \"AA22 expired or not due\""}],"id":9223,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"20705:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9226,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20705:44:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9227,"nodeType":"RevertStatement","src":"20698:51:53"}]}},{"assignments":[9231],"declarations":[{"constant":false,"id":9231,"mutability":"mutable","name":"pmAggregator","nameLocation":"21005:12:53","nodeType":"VariableDeclaration","scope":9262,"src":"20997:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9230,"name":"address","nodeType":"ElementaryTypeName","src":"20997:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9232,"nodeType":"VariableDeclarationStatement","src":"20997:20:53"},{"expression":{"id":9239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":9233,"name":"pmAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9231,"src":"21028:12:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9234,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9207,"src":"21042:14:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":9235,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"21027:30:53","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9237,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9199,"src":"21079:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9236,"name":"_getValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9311,"src":"21060:18:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_address_$_t_bool_$","typeString":"function (uint256) view returns (address,bool)"}},"id":9238,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21060:43:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"src":"21027:76:53","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9240,"nodeType":"ExpressionStatement","src":"21027:76:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9241,"name":"pmAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9231,"src":"21117:12:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":9244,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21141:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9243,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21133:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9242,"name":"address","nodeType":"ElementaryTypeName","src":"21133:7:53","typeDescriptions":{}}},"id":9245,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21133:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21117:26:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9253,"nodeType":"IfStatement","src":"21113:105:53","trueBody":{"id":9252,"nodeType":"Block","src":"21145:73:53","statements":[{"errorCall":{"arguments":[{"id":9248,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9195,"src":"21175:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413334207369676e6174757265206572726f72","id":9249,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21184:22:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871","typeString":"literal_string \"AA34 signature error\""},"value":"AA34 signature error"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871","typeString":"literal_string \"AA34 signature error\""}],"id":9247,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"21166:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9250,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21166:41:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9251,"nodeType":"RevertStatement","src":"21159:48:53"}]}},{"condition":{"id":9254,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9207,"src":"21231:14:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9261,"nodeType":"IfStatement","src":"21227:106:53","trueBody":{"id":9260,"nodeType":"Block","src":"21247:86:53","statements":[{"errorCall":{"arguments":[{"id":9256,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9195,"src":"21277:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413332207061796d61737465722065787069726564206f72206e6f7420647565","id":9257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21286:35:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b","typeString":"literal_string \"AA32 paymaster expired or not due\""},"value":"AA32 paymaster expired or not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b","typeString":"literal_string \"AA32 paymaster expired or not due\""}],"id":9255,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"21268:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21268:54:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9259,"nodeType":"RevertStatement","src":"21261:61:53"}]}}]},"documentation":{"id":9193,"nodeType":"StructuredDocumentation","src":"20176:97:53","text":" revert if either account validationData or paymaster validationData is expired"},"id":9263,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAccountAndPaymasterValidationData","nameLocation":"20287:42:53","nodeType":"FunctionDefinition","parameters":{"id":9202,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9195,"mutability":"mutable","name":"opIndex","nameLocation":"20338:7:53","nodeType":"VariableDeclaration","scope":9263,"src":"20330:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9194,"name":"uint256","nodeType":"ElementaryTypeName","src":"20330:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9197,"mutability":"mutable","name":"validationData","nameLocation":"20355:14:53","nodeType":"VariableDeclaration","scope":9263,"src":"20347:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9196,"name":"uint256","nodeType":"ElementaryTypeName","src":"20347:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9199,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"20379:23:53","nodeType":"VariableDeclaration","scope":9263,"src":"20371:31:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9198,"name":"uint256","nodeType":"ElementaryTypeName","src":"20371:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9201,"mutability":"mutable","name":"expectedAggregator","nameLocation":"20412:18:53","nodeType":"VariableDeclaration","scope":9263,"src":"20404:26:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9200,"name":"address","nodeType":"ElementaryTypeName","src":"20404:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"20329:102:53"},"returnParameters":{"id":9203,"nodeType":"ParameterList","parameters":[],"src":"20446:0:53"},"scope":9752,"src":"20278:1061:53","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9310,"nodeType":"Block","src":"21461:356:53","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9272,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9265,"src":"21475:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":9273,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21493:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21475:19:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9283,"nodeType":"IfStatement","src":"21471:76:53","trueBody":{"id":9282,"nodeType":"Block","src":"21496:51:53","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":9277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21526:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9276,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21518:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9275,"name":"address","nodeType":"ElementaryTypeName","src":"21518:7:53","typeDescriptions":{}}},"id":9278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21518:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"66616c7365","id":9279,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"21530:5:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"id":9280,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"21517:19:53","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_bool_$","typeString":"tuple(address,bool)"}},"functionReturnParameters":9271,"id":9281,"nodeType":"Return","src":"21510:26:53"}]}},{"assignments":[9286],"declarations":[{"constant":false,"id":9286,"mutability":"mutable","name":"data","nameLocation":"21578:4:53","nodeType":"VariableDeclaration","scope":9310,"src":"21556:26:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9285,"nodeType":"UserDefinedTypeName","pathNode":{"id":9284,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"21556:14:53"},"referencedDeclaration":9761,"src":"21556:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":9290,"initialValue":{"arguments":[{"id":9288,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9265,"src":"21606:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9287,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9820,"src":"21585:20:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":9289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21585:36:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"21556:65:53"},{"expression":{"id":9303,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9291,"name":"outOfTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9270,"src":"21685:14:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":9302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9292,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"21702:5:53","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":9293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"21702:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"id":9294,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9286,"src":"21720:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9295,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"21720:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"21702:33:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9297,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"21739:5:53","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":9298,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"21739:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":9299,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9286,"src":"21757:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9300,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"21757:15:53","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"21739:33:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"21702:70:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"21685:87:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9304,"nodeType":"ExpressionStatement","src":"21685:87:53"},{"expression":{"id":9308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9305,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9268,"src":"21782:10:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":9306,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9286,"src":"21795:4:53","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9307,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":9756,"src":"21795:15:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21782:28:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9309,"nodeType":"ExpressionStatement","src":"21782:28:53"}]},"id":9311,"implemented":true,"kind":"function","modifiers":[],"name":"_getValidationData","nameLocation":"21354:18:53","nodeType":"FunctionDefinition","parameters":{"id":9266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9265,"mutability":"mutable","name":"validationData","nameLocation":"21381:14:53","nodeType":"VariableDeclaration","scope":9311,"src":"21373:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9264,"name":"uint256","nodeType":"ElementaryTypeName","src":"21373:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"21372:24:53"},"returnParameters":{"id":9271,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9268,"mutability":"mutable","name":"aggregator","nameLocation":"21428:10:53","nodeType":"VariableDeclaration","scope":9311,"src":"21420:18:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9267,"name":"address","nodeType":"ElementaryTypeName","src":"21420:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9270,"mutability":"mutable","name":"outOfTimeRange","nameLocation":"21445:14:53","nodeType":"VariableDeclaration","scope":9311,"src":"21440:19:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9269,"name":"bool","nodeType":"ElementaryTypeName","src":"21440:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"21419:41:53"},"scope":9752,"src":"21345:472:53","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9485,"nodeType":"Block","src":"22358:1844:53","statements":[{"assignments":[9328],"declarations":[{"constant":false,"id":9328,"mutability":"mutable","name":"preGas","nameLocation":"22377:6:53","nodeType":"VariableDeclaration","scope":9485,"src":"22369:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9327,"name":"uint256","nodeType":"ElementaryTypeName","src":"22369:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9331,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":9329,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"22386:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9330,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22386:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22369:26:53"},{"assignments":[9334],"declarations":[{"constant":false,"id":9334,"mutability":"mutable","name":"mUserOp","nameLocation":"22425:7:53","nodeType":"VariableDeclaration","scope":9485,"src":"22405:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":9333,"nodeType":"UserDefinedTypeName","pathNode":{"id":9332,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"22405:12:53"},"referencedDeclaration":8192,"src":"22405:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":9337,"initialValue":{"expression":{"id":9335,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"22435:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9336,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"22435:17:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"22405:47:53"},{"expression":{"arguments":[{"id":9339,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"22482:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":9340,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"22490:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":9338,"name":"_copyUserOpToMemory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8464,"src":"22462:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_MemoryUserOp_$8192_memory_ptr_$returns$__$","typeString":"function (struct UserOperation calldata,struct EntryPoint.MemoryUserOp memory) pure"}},"id":9341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22462:36:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9342,"nodeType":"ExpressionStatement","src":"22462:36:53"},{"expression":{"id":9349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9343,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"22508:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9345,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"22508:20:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9347,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"22545:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":9346,"name":"getUserOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8361,"src":"22531:13:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (struct UserOperation calldata) view returns (bytes32)"}},"id":9348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22531:21:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"22508:44:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":9350,"nodeType":"ExpressionStatement","src":"22508:44:53"},{"assignments":[9352],"declarations":[{"constant":false,"id":9352,"mutability":"mutable","name":"maxGasValues","nameLocation":"22723:12:53","nodeType":"VariableDeclaration","scope":9485,"src":"22715:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9351,"name":"uint256","nodeType":"ElementaryTypeName","src":"22715:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9367,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9363,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9360,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9353,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"22738:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9354,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":8185,"src":"22738:26:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":9355,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"22767:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9356,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"22767:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:57:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":9358,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"22798:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9359,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":8181,"src":"22798:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:80:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":9361,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"22829:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":9362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10986,"src":"22829:19:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:110:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"expression":{"id":9364,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"22851:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":9365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"22851:27:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22738:140:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22715:163:53"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9369,"name":"maxGasValues","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9352,"src":"22896:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":9372,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22917:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"},"typeName":{"id":9371,"name":"uint120","nodeType":"ElementaryTypeName","src":"22917:7:53","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"}],"id":9370,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"22912:4:53","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":9373,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22912:13:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint120","typeString":"type(uint120)"}},"id":9374,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"22912:17:53","typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"}},"src":"22896:33:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"41413934206761732076616c756573206f766572666c6f77","id":9376,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"22931:26:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69","typeString":"literal_string \"AA94 gas values overflow\""},"value":"AA94 gas values overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69","typeString":"literal_string \"AA94 gas values overflow\""}],"id":9368,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"22888:7:53","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":9377,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22888:70:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9378,"nodeType":"ExpressionStatement","src":"22888:70:53"},{"assignments":[9380],"declarations":[{"constant":false,"id":9380,"mutability":"mutable","name":"gasUsedByValidateAccountPrepayment","nameLocation":"22977:34:53","nodeType":"VariableDeclaration","scope":9485,"src":"22969:42:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9379,"name":"uint256","nodeType":"ElementaryTypeName","src":"22969:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9381,"nodeType":"VariableDeclarationStatement","src":"22969:42:53"},{"assignments":[9383],"declarations":[{"constant":false,"id":9383,"mutability":"mutable","name":"requiredPreFund","nameLocation":"23030:15:53","nodeType":"VariableDeclaration","scope":9485,"src":"23022:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9382,"name":"uint256","nodeType":"ElementaryTypeName","src":"23022:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9387,"initialValue":{"arguments":[{"id":9385,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"23069:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":9384,"name":"_getRequiredPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8670,"src":"23049:19:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_MemoryUserOp_$8192_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct EntryPoint.MemoryUserOp memory) pure returns (uint256)"}},"id":9386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23049:28:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"23021:56:53"},{"expression":{"id":9397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":9388,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9380,"src":"23088:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9389,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9323,"src":"23124:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9390,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"23087:52:53","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9392,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9314,"src":"23169:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9393,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"23178:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":9394,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"23186:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":9395,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9383,"src":"23197:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9391,"name":"_validateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9059,"src":"23142:26:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256) returns (uint256,uint256)"}},"id":9396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23142:71:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"23087:126:53","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9398,"nodeType":"ExpressionStatement","src":"23087:126:53"},{"condition":{"id":9405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"23228:55:53","subExpression":{"arguments":[{"expression":{"id":9400,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"23253:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9401,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"23253:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":9402,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"23269:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9403,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":8179,"src":"23269:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9399,"name":"_validateAndUpdateNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10079,"src":"23229:23:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) returns (bool)"}},"id":9404,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23229:54:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9412,"nodeType":"IfStatement","src":"23224:140:53","trueBody":{"id":9411,"nodeType":"Block","src":"23285:79:53","statements":[{"errorCall":{"arguments":[{"id":9407,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9314,"src":"23315:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141323520696e76616c6964206163636f756e74206e6f6e6365","id":9408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23324:28:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5","typeString":"literal_string \"AA25 invalid account nonce\""},"value":"AA25 invalid account nonce"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5","typeString":"literal_string \"AA25 invalid account nonce\""}],"id":9406,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"23306:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23306:47:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9410,"nodeType":"RevertStatement","src":"23299:54:53"}]}},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":9413,"name":"numberMarker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9751,"src":"23540:12:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":9414,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23540:14:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9415,"nodeType":"ExpressionStatement","src":"23540:14:53"},{"assignments":[9417],"declarations":[{"constant":false,"id":9417,"mutability":"mutable","name":"context","nameLocation":"23578:7:53","nodeType":"VariableDeclaration","scope":9485,"src":"23565:20:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9416,"name":"bytes","nodeType":"ElementaryTypeName","src":"23565:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":9418,"nodeType":"VariableDeclarationStatement","src":"23565:20:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9419,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9334,"src":"23599:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9420,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"23599:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":9423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23628:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9422,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23620:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9421,"name":"address","nodeType":"ElementaryTypeName","src":"23620:7:53","typeDescriptions":{}}},"id":9424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23620:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"23599:31:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9439,"nodeType":"IfStatement","src":"23595:208:53","trueBody":{"id":9438,"nodeType":"Block","src":"23632:171:53","statements":[{"expression":{"id":9436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":9426,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9417,"src":"23647:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":9427,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9325,"src":"23656:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9428,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"23646:34:53","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9430,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9314,"src":"23712:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9431,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"23721:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":9432,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"23729:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},{"id":9433,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9383,"src":"23740:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9434,"name":"gasUsedByValidateAccountPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9380,"src":"23757:34:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9429,"name":"_validatePaymasterPrepayment","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9192,"src":"23683:28:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_struct$_UserOpInfo_$8204_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"function (uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256,uint256) returns (bytes memory,uint256)"}},"id":9435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23683:109:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_uint256_$","typeString":"tuple(bytes memory,uint256)"}},"src":"23646:146:53","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9437,"nodeType":"ExpressionStatement","src":"23646:146:53"}]}},{"id":9484,"nodeType":"UncheckedBlock","src":"23808:388:53","statements":[{"assignments":[9441],"declarations":[{"constant":false,"id":9441,"mutability":"mutable","name":"gasUsed","nameLocation":"23836:7:53","nodeType":"VariableDeclaration","scope":9484,"src":"23828:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9440,"name":"uint256","nodeType":"ElementaryTypeName","src":"23828:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9446,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9442,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9328,"src":"23846:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":9443,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"23855:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9444,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23855:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23846:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"23828:36:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9447,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"23879:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":9448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"23879:27:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":9449,"name":"gasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9441,"src":"23909:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23879:37:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9457,"nodeType":"IfStatement","src":"23875:126:53","trueBody":{"id":9456,"nodeType":"Block","src":"23918:83:53","statements":[{"errorCall":{"arguments":[{"id":9452,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9314,"src":"23948:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"41413430206f76657220766572696669636174696f6e4761734c696d6974","id":9453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23957:32:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf","typeString":"literal_string \"AA40 over verificationGasLimit\""},"value":"AA40 over verificationGasLimit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf","typeString":"literal_string \"AA40 over verificationGasLimit\""}],"id":9451,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"23939:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23939:51:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9455,"nodeType":"RevertStatement","src":"23932:58:53"}]}},{"expression":{"id":9462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9458,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"24010:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9460,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":8199,"src":"24010:17:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9461,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9383,"src":"24030:15:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24010:35:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9463,"nodeType":"ExpressionStatement","src":"24010:35:53"},{"expression":{"id":9470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9464,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"24055:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9466,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"contextOffset","nodeType":"MemberAccess","referencedDeclaration":8201,"src":"24055:23:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9468,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9417,"src":"24104:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":9467,"name":"getOffsetOfMemoryBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9737,"src":"24081:22:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) pure returns (uint256)"}},"id":9469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24081:31:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24055:57:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9471,"nodeType":"ExpressionStatement","src":"24055:57:53"},{"expression":{"id":9482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9472,"name":"outOpInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9320,"src":"24122:9:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9474,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"preOpGas","nodeType":"MemberAccess","referencedDeclaration":8203,"src":"24122:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9481,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9475,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9328,"src":"24143:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":9476,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"24152:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9477,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24152:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24143:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":9479,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9317,"src":"24164:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":9480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":10984,"src":"24164:25:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24143:46:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24122:67:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9483,"nodeType":"ExpressionStatement","src":"24122:67:53"}]}]},"documentation":{"id":9312,"nodeType":"StructuredDocumentation","src":"21823:346:53","text":" validate account and paymaster (if defined).\n also make sure total validation doesn't exceed verificationGasLimit\n this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n @param opIndex the index of this userOp into the \"opInfos\" array\n @param userOp the userOp to validate"},"id":9486,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePrepayment","nameLocation":"22183:19:53","nodeType":"FunctionDefinition","parameters":{"id":9321,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9314,"mutability":"mutable","name":"opIndex","nameLocation":"22211:7:53","nodeType":"VariableDeclaration","scope":9486,"src":"22203:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9313,"name":"uint256","nodeType":"ElementaryTypeName","src":"22203:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9317,"mutability":"mutable","name":"userOp","nameLocation":"22243:6:53","nodeType":"VariableDeclaration","scope":9486,"src":"22220:29:53","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":9316,"nodeType":"UserDefinedTypeName","pathNode":{"id":9315,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"22220:13:53"},"referencedDeclaration":10993,"src":"22220:13:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":9320,"mutability":"mutable","name":"outOpInfo","nameLocation":"22269:9:53","nodeType":"VariableDeclaration","scope":9486,"src":"22251:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":9319,"nodeType":"UserDefinedTypeName","pathNode":{"id":9318,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"22251:10:53"},"referencedDeclaration":8204,"src":"22251:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"}],"src":"22202:77:53"},"returnParameters":{"id":9326,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9323,"mutability":"mutable","name":"validationData","nameLocation":"22309:14:53","nodeType":"VariableDeclaration","scope":9486,"src":"22301:22:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9322,"name":"uint256","nodeType":"ElementaryTypeName","src":"22301:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9325,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"22333:23:53","nodeType":"VariableDeclaration","scope":9486,"src":"22325:31:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9324,"name":"uint256","nodeType":"ElementaryTypeName","src":"22325:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"22300:57:53"},"scope":9752,"src":"22174:2028:53","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":9674,"nodeType":"Block","src":"25021:1761:53","statements":[{"assignments":[9505],"declarations":[{"constant":false,"id":9505,"mutability":"mutable","name":"preGas","nameLocation":"25039:6:53","nodeType":"VariableDeclaration","scope":9674,"src":"25031:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9504,"name":"uint256","nodeType":"ElementaryTypeName","src":"25031:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9508,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":9506,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"25048:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25048:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25031:26:53"},{"id":9673,"nodeType":"UncheckedBlock","src":"25063:1700:53","statements":[{"assignments":[9510],"declarations":[{"constant":false,"id":9510,"mutability":"mutable","name":"refundAddress","nameLocation":"25091:13:53","nodeType":"VariableDeclaration","scope":9673,"src":"25083:21:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9509,"name":"address","nodeType":"ElementaryTypeName","src":"25083:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9511,"nodeType":"VariableDeclarationStatement","src":"25083:21:53"},{"assignments":[9514],"declarations":[{"constant":false,"id":9514,"mutability":"mutable","name":"mUserOp","nameLocation":"25134:7:53","nodeType":"VariableDeclaration","scope":9673,"src":"25114:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":9513,"nodeType":"UserDefinedTypeName","pathNode":{"id":9512,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"25114:12:53"},"referencedDeclaration":8192,"src":"25114:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"id":9517,"initialValue":{"expression":{"id":9515,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9495,"src":"25144:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9516,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"mUserOp","nodeType":"MemberAccess","referencedDeclaration":8195,"src":"25144:14:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"nodeType":"VariableDeclarationStatement","src":"25114:44:53"},{"assignments":[9519],"declarations":[{"constant":false,"id":9519,"mutability":"mutable","name":"gasPrice","nameLocation":"25176:8:53","nodeType":"VariableDeclaration","scope":9673,"src":"25168:16:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9518,"name":"uint256","nodeType":"ElementaryTypeName","src":"25168:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9523,"initialValue":{"arguments":[{"id":9521,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"25205:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}],"id":9520,"name":"getUserOpGasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9711,"src":"25187:17:53","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_MemoryUserOp_$8192_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct EntryPoint.MemoryUserOp memory) view returns (uint256)"}},"id":9522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25187:26:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25168:45:53"},{"assignments":[9525],"declarations":[{"constant":false,"id":9525,"mutability":"mutable","name":"paymaster","nameLocation":"25232:9:53","nodeType":"VariableDeclaration","scope":9673,"src":"25224:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9524,"name":"address","nodeType":"ElementaryTypeName","src":"25224:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9528,"initialValue":{"expression":{"id":9526,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"25244:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9527,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"25244:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25224:37:53"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9529,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9525,"src":"25275:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":9532,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25296:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9531,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25288:7:53","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9530,"name":"address","nodeType":"ElementaryTypeName","src":"25288:7:53","typeDescriptions":{}}},"id":9533,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25288:10:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25275:23:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":9613,"nodeType":"Block","src":"25361:869:53","statements":[{"expression":{"id":9543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9541,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9510,"src":"25375:13:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9542,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9525,"src":"25391:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25375:25:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9544,"nodeType":"ExpressionStatement","src":"25375:25:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9545,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9497,"src":"25418:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":9546,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"25418:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":9547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25435:1:53","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"25418:18:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9612,"nodeType":"IfStatement","src":"25414:806:53","trueBody":{"id":9611,"nodeType":"Block","src":"25438:782:53","statements":[{"expression":{"id":9553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9549,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"25456:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9552,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9550,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9499,"src":"25472:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":9551,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9519,"src":"25484:8:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25472:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25456:36:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9554,"nodeType":"ExpressionStatement","src":"25456:36:53"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":9559,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9555,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9492,"src":"25514:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"expression":{"id":9556,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"25522:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":9557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":10834,"src":"25522:21:53","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":9558,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"25522:36:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"25514:44:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":9609,"nodeType":"Block","src":"25701:505:53","statements":[{"clauses":[{"block":{"id":9584,"nodeType":"Block","src":"25887:2:53","statements":[]},"errorName":"","id":9585,"nodeType":"TryCatchClause","src":"25887:2:53"},{"block":{"id":9599,"nodeType":"Block","src":"25944:122:53","statements":[{"errorCall":{"arguments":[{"id":9590,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9489,"src":"25986:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"4141353020706f73744f702072657665727465643a20","id":9594,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26009:24:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023","typeString":"literal_string \"AA50 postOp reverted: \""},"value":"AA50 postOp reverted: "},{"id":9595,"name":"reason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9587,"src":"26035:6:53","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023","typeString":"literal_string \"AA50 postOp reverted: \""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":9592,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25995:6:53","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":9591,"name":"string","nodeType":"ElementaryTypeName","src":"25995:6:53","typeDescriptions":{}}},"id":9593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"concat","nodeType":"MemberAccess","src":"25995:13:53","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":9596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25995:47:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":9589,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"25977:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25977:66:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9598,"nodeType":"RevertStatement","src":"25970:73:53"}]},"errorName":"Error","id":9600,"nodeType":"TryCatchClause","parameters":{"id":9588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9587,"mutability":"mutable","name":"reason","nameLocation":"25936:6:53","nodeType":"VariableDeclaration","scope":9600,"src":"25922:20:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":9586,"name":"string","nodeType":"ElementaryTypeName","src":"25922:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"25921:22:53"},"src":"25910:156:53"},{"block":{"id":9606,"nodeType":"Block","src":"26093:95:53","statements":[{"errorCall":{"arguments":[{"id":9602,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9489,"src":"26135:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"4141353020706f73744f7020726576657274","id":9603,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26144:20:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706","typeString":"literal_string \"AA50 postOp revert\""},"value":"AA50 postOp revert"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706","typeString":"literal_string \"AA50 postOp revert\""}],"id":9601,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"26126:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26126:39:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9605,"nodeType":"RevertStatement","src":"26119:46:53"}]},"errorName":"","id":9607,"nodeType":"TryCatchClause","src":"26087:101:53"}],"externalCall":{"arguments":[{"id":9580,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9492,"src":"25857:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":9581,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9497,"src":"25863:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":9582,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"25872:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":9574,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9525,"src":"25803:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9573,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"25792:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":9575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25792:21:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$10861","typeString":"contract IPaymaster"}},"id":9576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"postOp","nodeType":"MemberAccess","referencedDeclaration":10860,"src":"25792:28:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$10834_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":9579,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":9577,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"25827:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9578,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"25827:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"25792:64:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$10834_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$gas","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":9583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25792:94:53","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9608,"nodeType":"TryStatement","src":"25788:400:53"}]},"id":9610,"nodeType":"IfStatement","src":"25510:696:53","trueBody":{"id":9572,"nodeType":"Block","src":"25560:135:53","statements":[{"expression":{"arguments":[{"id":9567,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9492,"src":"25647:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},{"id":9568,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9497,"src":"25653:7:53","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":9569,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"25662:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":9561,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9525,"src":"25593:9:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9560,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"25582:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":9562,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25582:21:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPaymaster_$10861","typeString":"contract IPaymaster"}},"id":9563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"postOp","nodeType":"MemberAccess","referencedDeclaration":10860,"src":"25582:28:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$10834_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":9566,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":9564,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"25617:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9565,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":8183,"src":"25617:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"25582:64:53","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_enum$_PostOpMode_$10834_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$gas","typeString":"function (enum IPaymaster.PostOpMode,bytes memory,uint256) external"}},"id":9570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25582:94:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9571,"nodeType":"ExpressionStatement","src":"25582:94:53"}]}}]}}]},"id":9614,"nodeType":"IfStatement","src":"25271:959:53","trueBody":{"id":9540,"nodeType":"Block","src":"25300:55:53","statements":[{"expression":{"id":9538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9535,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9510,"src":"25314:13:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":9536,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"25330:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9537,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"25330:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25314:30:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9539,"nodeType":"ExpressionStatement","src":"25314:30:53"}]}},{"expression":{"id":9620,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9615,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9499,"src":"26239:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9616,"name":"preGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9505,"src":"26252:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":9617,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"26261:7:53","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":9618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26261:9:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26252:18:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26239:31:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9621,"nodeType":"ExpressionStatement","src":"26239:31:53"},{"expression":{"id":9626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9622,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"26280:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9623,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9499,"src":"26296:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":9624,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9519,"src":"26308:8:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26296:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26280:36:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9627,"nodeType":"ExpressionStatement","src":"26280:36:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9628,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9495,"src":"26330:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9629,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":8199,"src":"26330:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":9630,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"26347:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26330:30:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9638,"nodeType":"IfStatement","src":"26326:121:53","trueBody":{"id":9637,"nodeType":"Block","src":"26362:85:53","statements":[{"errorCall":{"arguments":[{"id":9633,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9489,"src":"26392:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"414135312070726566756e642062656c6f772061637475616c476173436f7374","id":9634,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"26401:34:53","typeDescriptions":{"typeIdentifier":"t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb","typeString":"literal_string \"AA51 prefund below actualGasCost\""},"value":"AA51 prefund below actualGasCost"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb","typeString":"literal_string \"AA51 prefund below actualGasCost\""}],"id":9632,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10666,"src":"26383:8:53","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":9635,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26383:53:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9636,"nodeType":"RevertStatement","src":"26376:60:53"}]}},{"assignments":[9640],"declarations":[{"constant":false,"id":9640,"mutability":"mutable","name":"refund","nameLocation":"26464:6:53","nodeType":"VariableDeclaration","scope":9673,"src":"26456:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9639,"name":"uint256","nodeType":"ElementaryTypeName","src":"26456:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9645,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9644,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":9641,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9495,"src":"26473:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9642,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"prefund","nodeType":"MemberAccess","referencedDeclaration":8199,"src":"26473:14:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":9643,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"26490:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26473:30:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"26456:47:53"},{"expression":{"arguments":[{"id":9647,"name":"refundAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9510,"src":"26531:13:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9648,"name":"refund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9640,"src":"26546:6:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9646,"name":"_incrementDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10248,"src":"26513:17:53","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":9649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26513:40:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9650,"nodeType":"ExpressionStatement","src":"26513:40:53"},{"assignments":[9652],"declarations":[{"constant":false,"id":9652,"mutability":"mutable","name":"success","nameLocation":"26568:7:53","nodeType":"VariableDeclaration","scope":9673,"src":"26563:12:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9651,"name":"bool","nodeType":"ElementaryTypeName","src":"26563:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":9658,"initialValue":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":9657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9653,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9492,"src":"26578:4:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"expression":{"id":9654,"name":"IPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10861,"src":"26586:10:53","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IPaymaster_$10861_$","typeString":"type(contract IPaymaster)"}},"id":9655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PostOpMode","nodeType":"MemberAccess","referencedDeclaration":10834,"src":"26586:21:53","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":9656,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"opSucceeded","nodeType":"MemberAccess","referencedDeclaration":10831,"src":"26586:33:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"26578:41:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"26563:56:53"},{"eventCall":{"arguments":[{"expression":{"id":9660,"name":"opInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9495,"src":"26653:6:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo memory"}},"id":9661,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"userOpHash","nodeType":"MemberAccess","referencedDeclaration":8197,"src":"26653:17:53","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":9662,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"26672:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9663,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":8177,"src":"26672:14:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":9664,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"26688:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9665,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymaster","nodeType":"MemberAccess","referencedDeclaration":8187,"src":"26688:17:53","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":9666,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9514,"src":"26707:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9667,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":8179,"src":"26707:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9668,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9652,"src":"26722:7:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":9669,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9502,"src":"26731:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":9670,"name":"actualGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9499,"src":"26746:9:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9659,"name":"UserOperationEvent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10629,"src":"26634:18:53","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$_t_bool_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (bytes32,address,address,uint256,bool,uint256,uint256)"}},"id":9671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26634:122:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9672,"nodeType":"EmitStatement","src":"26629:127:53"}]}]},"documentation":{"id":9487,"nodeType":"StructuredDocumentation","src":"24208:633:53","text":" process post-operation.\n called just after the callData is executed.\n if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n the excess amount is refunded to the account (or paymaster - if it was used in the request)\n @param opIndex index in the batch\n @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n @param opInfo userOp fields and info collected during validation\n @param context the context returned in validatePaymasterUserOp\n @param actualGas the gas used so far by this user operation"},"id":9675,"implemented":true,"kind":"function","modifiers":[],"name":"_handlePostOp","nameLocation":"24855:13:53","nodeType":"FunctionDefinition","parameters":{"id":9500,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9489,"mutability":"mutable","name":"opIndex","nameLocation":"24877:7:53","nodeType":"VariableDeclaration","scope":9675,"src":"24869:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9488,"name":"uint256","nodeType":"ElementaryTypeName","src":"24869:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9492,"mutability":"mutable","name":"mode","nameLocation":"24908:4:53","nodeType":"VariableDeclaration","scope":9675,"src":"24886:26:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":9491,"nodeType":"UserDefinedTypeName","pathNode":{"id":9490,"name":"IPaymaster.PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"24886:21:53"},"referencedDeclaration":10834,"src":"24886:21:53","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":9495,"mutability":"mutable","name":"opInfo","nameLocation":"24932:6:53","nodeType":"VariableDeclaration","scope":9675,"src":"24914:24:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_memory_ptr","typeString":"struct EntryPoint.UserOpInfo"},"typeName":{"id":9494,"nodeType":"UserDefinedTypeName","pathNode":{"id":9493,"name":"UserOpInfo","nodeType":"IdentifierPath","referencedDeclaration":8204,"src":"24914:10:53"},"referencedDeclaration":8204,"src":"24914:10:53","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpInfo_$8204_storage_ptr","typeString":"struct EntryPoint.UserOpInfo"}},"visibility":"internal"},{"constant":false,"id":9497,"mutability":"mutable","name":"context","nameLocation":"24953:7:53","nodeType":"VariableDeclaration","scope":9675,"src":"24940:20:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9496,"name":"bytes","nodeType":"ElementaryTypeName","src":"24940:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":9499,"mutability":"mutable","name":"actualGas","nameLocation":"24970:9:53","nodeType":"VariableDeclaration","scope":9675,"src":"24962:17:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9498,"name":"uint256","nodeType":"ElementaryTypeName","src":"24962:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"24868:112:53"},"returnParameters":{"id":9503,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9502,"mutability":"mutable","name":"actualGasCost","nameLocation":"25006:13:53","nodeType":"VariableDeclaration","scope":9675,"src":"24998:21:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9501,"name":"uint256","nodeType":"ElementaryTypeName","src":"24998:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"24997:23:53"},"scope":9752,"src":"24846:1936:53","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":9710,"nodeType":"Block","src":"27038:393:53","statements":[{"id":9709,"nodeType":"UncheckedBlock","src":"27044:381:53","statements":[{"assignments":[9685],"declarations":[{"constant":false,"id":9685,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"27072:12:53","nodeType":"VariableDeclaration","scope":9709,"src":"27064:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9684,"name":"uint256","nodeType":"ElementaryTypeName","src":"27064:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9688,"initialValue":{"expression":{"id":9686,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9679,"src":"27087:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9687,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":8189,"src":"27087:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27064:43:53"},{"assignments":[9690],"declarations":[{"constant":false,"id":9690,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"27125:20:53","nodeType":"VariableDeclaration","scope":9709,"src":"27117:28:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9689,"name":"uint256","nodeType":"ElementaryTypeName","src":"27117:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":9693,"initialValue":{"expression":{"id":9691,"name":"mUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9679,"src":"27148:7:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp memory"}},"id":9692,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":8191,"src":"27148:28:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27117:59:53"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9696,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9694,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9685,"src":"27190:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":9695,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9690,"src":"27206:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27190:36:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9700,"nodeType":"IfStatement","src":"27186:161:53","trueBody":{"id":9699,"nodeType":"Block","src":"27228:119:53","statements":[{"expression":{"id":9697,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9685,"src":"27324:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":9683,"id":9698,"nodeType":"Return","src":"27317:19:53"}]}},{"expression":{"arguments":[{"id":9702,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9685,"src":"27367:12:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9706,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9703,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9690,"src":"27381:20:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":9704,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"27404:5:53","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":9705,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","src":"27404:13:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27381:36:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9701,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9728,"src":"27363:3:53","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":9707,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27363:55:53","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":9683,"id":9708,"nodeType":"Return","src":"27356:62:53"}]}]},"documentation":{"id":9676,"nodeType":"StructuredDocumentation","src":"26788:157:53","text":" the gas price this UserOp agrees to pay.\n relayer/block builder might submit the TX with higher priorityFee, but the user should not"},"id":9711,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpGasPrice","nameLocation":"26959:17:53","nodeType":"FunctionDefinition","parameters":{"id":9680,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9679,"mutability":"mutable","name":"mUserOp","nameLocation":"26997:7:53","nodeType":"VariableDeclaration","scope":9711,"src":"26977:27:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_memory_ptr","typeString":"struct EntryPoint.MemoryUserOp"},"typeName":{"id":9678,"nodeType":"UserDefinedTypeName","pathNode":{"id":9677,"name":"MemoryUserOp","nodeType":"IdentifierPath","referencedDeclaration":8192,"src":"26977:12:53"},"referencedDeclaration":8192,"src":"26977:12:53","typeDescriptions":{"typeIdentifier":"t_struct$_MemoryUserOp_$8192_storage_ptr","typeString":"struct EntryPoint.MemoryUserOp"}},"visibility":"internal"}],"src":"26976:29:53"},"returnParameters":{"id":9683,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9682,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":9711,"src":"27029:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9681,"name":"uint256","nodeType":"ElementaryTypeName","src":"27029:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27028:9:53"},"scope":9752,"src":"26950:481:53","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9727,"nodeType":"Block","src":"27504:37:53","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9720,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9713,"src":"27521:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":9721,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9715,"src":"27525:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27521:5:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":9724,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9715,"src":"27533:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":9725,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"27521:13:53","trueExpression":{"id":9723,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9713,"src":"27529:1:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":9719,"id":9726,"nodeType":"Return","src":"27514:20:53"}]},"id":9728,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"27446:3:53","nodeType":"FunctionDefinition","parameters":{"id":9716,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9713,"mutability":"mutable","name":"a","nameLocation":"27458:1:53","nodeType":"VariableDeclaration","scope":9728,"src":"27450:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9712,"name":"uint256","nodeType":"ElementaryTypeName","src":"27450:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9715,"mutability":"mutable","name":"b","nameLocation":"27469:1:53","nodeType":"VariableDeclaration","scope":9728,"src":"27461:9:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9714,"name":"uint256","nodeType":"ElementaryTypeName","src":"27461:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27449:22:53"},"returnParameters":{"id":9719,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9718,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":9728,"src":"27495:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9717,"name":"uint256","nodeType":"ElementaryTypeName","src":"27495:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27494:9:53"},"scope":9752,"src":"27437:104:53","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9736,"nodeType":"Block","src":"27637:41:53","statements":[{"AST":{"nodeType":"YulBlock","src":"27656:16:53","statements":[{"nodeType":"YulAssignment","src":"27657:14:53","value":{"name":"data","nodeType":"YulIdentifier","src":"27667:4:53"},"variableNames":[{"name":"offset","nodeType":"YulIdentifier","src":"27657:6:53"}]}]},"evmVersion":"london","externalReferences":[{"declaration":9730,"isOffset":false,"isSlot":false,"src":"27667:4:53","valueSize":1},{"declaration":9733,"isOffset":false,"isSlot":false,"src":"27657:6:53","valueSize":1}],"id":9735,"nodeType":"InlineAssembly","src":"27647:25:53"}]},"id":9737,"implemented":true,"kind":"function","modifiers":[],"name":"getOffsetOfMemoryBytes","nameLocation":"27556:22:53","nodeType":"FunctionDefinition","parameters":{"id":9731,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9730,"mutability":"mutable","name":"data","nameLocation":"27592:4:53","nodeType":"VariableDeclaration","scope":9737,"src":"27579:17:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9729,"name":"bytes","nodeType":"ElementaryTypeName","src":"27579:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"27578:19:53"},"returnParameters":{"id":9734,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9733,"mutability":"mutable","name":"offset","nameLocation":"27629:6:53","nodeType":"VariableDeclaration","scope":9737,"src":"27621:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9732,"name":"uint256","nodeType":"ElementaryTypeName","src":"27621:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27620:16:53"},"scope":9752,"src":"27547:131:53","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9745,"nodeType":"Block","src":"27776:41:53","statements":[{"AST":{"nodeType":"YulBlock","src":"27795:16:53","statements":[{"nodeType":"YulAssignment","src":"27796:14:53","value":{"name":"offset","nodeType":"YulIdentifier","src":"27804:6:53"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"27796:4:53"}]}]},"evmVersion":"london","externalReferences":[{"declaration":9742,"isOffset":false,"isSlot":false,"src":"27796:4:53","valueSize":1},{"declaration":9739,"isOffset":false,"isSlot":false,"src":"27804:6:53","valueSize":1}],"id":9744,"nodeType":"InlineAssembly","src":"27786:25:53"}]},"id":9746,"implemented":true,"kind":"function","modifiers":[],"name":"getMemoryBytesFromOffset","nameLocation":"27693:24:53","nodeType":"FunctionDefinition","parameters":{"id":9740,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9739,"mutability":"mutable","name":"offset","nameLocation":"27726:6:53","nodeType":"VariableDeclaration","scope":9746,"src":"27718:14:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9738,"name":"uint256","nodeType":"ElementaryTypeName","src":"27718:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27717:16:53"},"returnParameters":{"id":9743,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9742,"mutability":"mutable","name":"data","nameLocation":"27770:4:53","nodeType":"VariableDeclaration","scope":9746,"src":"27757:17:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9741,"name":"bytes","nodeType":"ElementaryTypeName","src":"27757:5:53","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"27756:19:53"},"scope":9752,"src":"27684:133:53","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9750,"nodeType":"Block","src":"28048:46:53","statements":[{"AST":{"nodeType":"YulBlock","src":"28067:21:53","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"28075:1:53","type":"","value":"0"},{"arguments":[],"functionName":{"name":"number","nodeType":"YulIdentifier","src":"28078:6:53"},"nodeType":"YulFunctionCall","src":"28078:8:53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28068:6:53"},"nodeType":"YulFunctionCall","src":"28068:19:53"},"nodeType":"YulExpressionStatement","src":"28068:19:53"}]},"evmVersion":"london","externalReferences":[],"id":9749,"nodeType":"InlineAssembly","src":"28058:30:53"}]},"id":9751,"implemented":true,"kind":"function","modifiers":[],"name":"numberMarker","nameLocation":"28019:12:53","nodeType":"FunctionDefinition","parameters":{"id":9747,"nodeType":"ParameterList","parameters":[],"src":"28031:2:53"},"returnParameters":{"id":9748,"nodeType":"ParameterList","parameters":[],"src":"28048:0:53"},"scope":9752,"src":"28010:84:53","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":9753,"src":"596:27500:53","usedErrors":[10666,10671,10686,10704,10709,10724]}],"src":"163:27935:53"},"id":53},"contracts/core/Helpers.sol":{"ast":{"absolutePath":"contracts/core/Helpers.sol","exportedSymbols":{"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":9991,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":9754,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:54"},{"canonicalName":"ValidationData","id":9761,"members":[{"constant":false,"id":9756,"mutability":"mutable","name":"aggregator","nameLocation":"730:10:54","nodeType":"VariableDeclaration","scope":9761,"src":"722:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9755,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9758,"mutability":"mutable","name":"validAfter","nameLocation":"757:10:54","nodeType":"VariableDeclaration","scope":9761,"src":"750:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9757,"name":"uint48","nodeType":"ElementaryTypeName","src":"750:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":9760,"mutability":"mutable","name":"validUntil","nameLocation":"784:10:54","nodeType":"VariableDeclaration","scope":9761,"src":"777:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9759,"name":"uint48","nodeType":"ElementaryTypeName","src":"777:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"ValidationData","nameLocation":"697:14:54","nodeType":"StructDefinition","scope":9991,"src":"690:111:54","visibility":"public"},{"body":{"id":9819,"nodeType":"Block","src":"997:346:54","statements":[{"assignments":[9770],"declarations":[{"constant":false,"id":9770,"mutability":"mutable","name":"aggregator","nameLocation":"1015:10:54","nodeType":"VariableDeclaration","scope":9819,"src":"1007:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9769,"name":"address","nodeType":"ElementaryTypeName","src":"1007:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9778,"initialValue":{"arguments":[{"arguments":[{"id":9775,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9763,"src":"1044:14:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9774,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1036:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":9773,"name":"uint160","nodeType":"ElementaryTypeName","src":"1036:7:54","typeDescriptions":{}}},"id":9776,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1036:23:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":9772,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1028:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9771,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:54","typeDescriptions":{}}},"id":9777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1028:32:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1007:53:54"},{"assignments":[9780],"declarations":[{"constant":false,"id":9780,"mutability":"mutable","name":"validUntil","nameLocation":"1077:10:54","nodeType":"VariableDeclaration","scope":9819,"src":"1070:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9779,"name":"uint48","nodeType":"ElementaryTypeName","src":"1070:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9787,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9785,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9783,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9763,"src":"1097:14:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313630","id":9784,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1115:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1097:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9782,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1090:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":9781,"name":"uint48","nodeType":"ElementaryTypeName","src":"1090:6:54","typeDescriptions":{}}},"id":9786,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1090:29:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1070:49:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":9790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9788,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9780,"src":"1133:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":9789,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1147:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1133:15:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9800,"nodeType":"IfStatement","src":"1129:75:54","trueBody":{"id":9799,"nodeType":"Block","src":"1150:54:54","statements":[{"expression":{"id":9797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9791,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9780,"src":"1164:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":9794,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1182:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":9793,"name":"uint48","nodeType":"ElementaryTypeName","src":"1182:6:54","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":9792,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1177:4:54","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":9795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1177:12:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":9796,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"1177:16:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1164:29:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":9798,"nodeType":"ExpressionStatement","src":"1164:29:54"}]}},{"assignments":[9802],"declarations":[{"constant":false,"id":9802,"mutability":"mutable","name":"validAfter","nameLocation":"1220:10:54","nodeType":"VariableDeclaration","scope":9819,"src":"1213:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9801,"name":"uint48","nodeType":"ElementaryTypeName","src":"1213:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9812,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9805,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9763,"src":"1240:14:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":9808,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3438","id":9806,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1259:2:54","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"313630","id":9807,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1264:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1259:8:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":9809,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1258:10:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"1240:28:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9804,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1233:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":9803,"name":"uint48","nodeType":"ElementaryTypeName","src":"1233:6:54","typeDescriptions":{}}},"id":9811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1233:36:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1213:56:54"},{"expression":{"arguments":[{"id":9814,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9770,"src":"1301:10:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9815,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9802,"src":"1313:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":9816,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9780,"src":"1325:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9813,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9761,"src":"1286:14:54","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$9761_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":9817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1286:50:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":9768,"id":9818,"nodeType":"Return","src":"1279:57:54"}]},"id":9820,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_parseValidationData","nameLocation":"913:20:54","nodeType":"FunctionDefinition","parameters":{"id":9764,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9763,"mutability":"mutable","name":"validationData","nameLocation":"939:14:54","nodeType":"VariableDeclaration","scope":9820,"src":"934:19:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9762,"name":"uint","nodeType":"ElementaryTypeName","src":"934:4:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"933:21:54"},"returnParameters":{"id":9768,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9767,"mutability":"mutable","name":"data","nameLocation":"991:4:54","nodeType":"VariableDeclaration","scope":9820,"src":"969:26:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9766,"nodeType":"UserDefinedTypeName","pathNode":{"id":9765,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"969:14:54"},"referencedDeclaration":9761,"src":"969:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"968:28:54"},"scope":9991,"src":"904:439:54","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9904,"nodeType":"Block","src":"1515:804:54","statements":[{"assignments":[9832],"declarations":[{"constant":false,"id":9832,"mutability":"mutable","name":"accountValidationData","nameLocation":"1547:21:54","nodeType":"VariableDeclaration","scope":9904,"src":"1525:43:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9831,"nodeType":"UserDefinedTypeName","pathNode":{"id":9830,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"1525:14:54"},"referencedDeclaration":9761,"src":"1525:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":9836,"initialValue":{"arguments":[{"id":9834,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9822,"src":"1592:14:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9833,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9820,"src":"1571:20:54","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":9835,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1571:36:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1525:82:54"},{"assignments":[9839],"declarations":[{"constant":false,"id":9839,"mutability":"mutable","name":"pmValidationData","nameLocation":"1639:16:54","nodeType":"VariableDeclaration","scope":9904,"src":"1617:38:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9838,"nodeType":"UserDefinedTypeName","pathNode":{"id":9837,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"1617:14:54"},"referencedDeclaration":9761,"src":"1617:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":9843,"initialValue":{"arguments":[{"id":9841,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9824,"src":"1679:23:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9840,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9820,"src":"1658:20:54","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":9842,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1658:45:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1617:86:54"},{"assignments":[9845],"declarations":[{"constant":false,"id":9845,"mutability":"mutable","name":"aggregator","nameLocation":"1721:10:54","nodeType":"VariableDeclaration","scope":9904,"src":"1713:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9844,"name":"address","nodeType":"ElementaryTypeName","src":"1713:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9848,"initialValue":{"expression":{"id":9846,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9832,"src":"1734:21:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9847,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":9756,"src":"1734:32:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1713:53:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9849,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9845,"src":"1780:10:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":9852,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1802:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9851,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1794:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9850,"name":"address","nodeType":"ElementaryTypeName","src":"1794:7:54","typeDescriptions":{}}},"id":9853,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1794:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1780:24:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9861,"nodeType":"IfStatement","src":"1776:95:54","trueBody":{"id":9860,"nodeType":"Block","src":"1806:65:54","statements":[{"expression":{"id":9858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9855,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9845,"src":"1820:10:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":9856,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9839,"src":"1833:16:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9857,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":9756,"src":"1833:27:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1820:40:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9859,"nodeType":"ExpressionStatement","src":"1820:40:54"}]}},{"assignments":[9863],"declarations":[{"constant":false,"id":9863,"mutability":"mutable","name":"validAfter","nameLocation":"1887:10:54","nodeType":"VariableDeclaration","scope":9904,"src":"1880:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9862,"name":"uint48","nodeType":"ElementaryTypeName","src":"1880:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9866,"initialValue":{"expression":{"id":9864,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9832,"src":"1900:21:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9865,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"1900:32:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1880:52:54"},{"assignments":[9868],"declarations":[{"constant":false,"id":9868,"mutability":"mutable","name":"validUntil","nameLocation":"1949:10:54","nodeType":"VariableDeclaration","scope":9904,"src":"1942:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9867,"name":"uint48","nodeType":"ElementaryTypeName","src":"1942:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9871,"initialValue":{"expression":{"id":9869,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9832,"src":"1962:21:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9870,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"1962:32:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1942:52:54"},{"assignments":[9873],"declarations":[{"constant":false,"id":9873,"mutability":"mutable","name":"pmValidAfter","nameLocation":"2011:12:54","nodeType":"VariableDeclaration","scope":9904,"src":"2004:19:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9872,"name":"uint48","nodeType":"ElementaryTypeName","src":"2004:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9876,"initialValue":{"expression":{"id":9874,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9839,"src":"2026:16:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9875,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"2026:27:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2004:49:54"},{"assignments":[9878],"declarations":[{"constant":false,"id":9878,"mutability":"mutable","name":"pmValidUntil","nameLocation":"2070:12:54","nodeType":"VariableDeclaration","scope":9904,"src":"2063:19:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9877,"name":"uint48","nodeType":"ElementaryTypeName","src":"2063:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":9881,"initialValue":{"expression":{"id":9879,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9839,"src":"2085:16:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9880,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"2085:27:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2063:49:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":9884,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9882,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9863,"src":"2127:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":9883,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9873,"src":"2140:12:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2127:25:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9889,"nodeType":"IfStatement","src":"2123:56:54","trueBody":{"expression":{"id":9887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9885,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9863,"src":"2154:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9886,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9873,"src":"2167:12:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2154:25:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":9888,"nodeType":"ExpressionStatement","src":"2154:25:54"}},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":9892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9890,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9868,"src":"2193:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":9891,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9878,"src":"2206:12:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2193:25:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9897,"nodeType":"IfStatement","src":"2189:56:54","trueBody":{"expression":{"id":9895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9893,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9868,"src":"2220:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9894,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9878,"src":"2233:12:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2220:25:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":9896,"nodeType":"ExpressionStatement","src":"2220:25:54"}},{"expression":{"arguments":[{"id":9899,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9845,"src":"2277:10:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9900,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9863,"src":"2289:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":9901,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9868,"src":"2301:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9898,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9761,"src":"2262:14:54","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$9761_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":9902,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2262:50:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":9829,"id":9903,"nodeType":"Return","src":"2255:57:54"}]},"id":9905,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_intersectTimeRange","nameLocation":"1401:19:54","nodeType":"FunctionDefinition","parameters":{"id":9825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9822,"mutability":"mutable","name":"validationData","nameLocation":"1429:14:54","nodeType":"VariableDeclaration","scope":9905,"src":"1421:22:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9821,"name":"uint256","nodeType":"ElementaryTypeName","src":"1421:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9824,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"1453:23:54","nodeType":"VariableDeclaration","scope":9905,"src":"1445:31:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9823,"name":"uint256","nodeType":"ElementaryTypeName","src":"1445:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1420:57:54"},"returnParameters":{"id":9829,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9828,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":9905,"src":"1492:21:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9827,"nodeType":"UserDefinedTypeName","pathNode":{"id":9826,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"1492:14:54"},"referencedDeclaration":9761,"src":"1492:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"1491:23:54"},"scope":9991,"src":"1392:927:54","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9941,"nodeType":"Block","src":"2511:127:54","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":9916,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9909,"src":"2536:4:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9917,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":9756,"src":"2536:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9915,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2528:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":9914,"name":"uint160","nodeType":"ElementaryTypeName","src":"2528:7:54","typeDescriptions":{}}},"id":9918,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2528:24:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":9921,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9909,"src":"2564:4:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9922,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":9760,"src":"2564:15:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9920,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2556:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9919,"name":"uint256","nodeType":"ElementaryTypeName","src":"2556:7:54","typeDescriptions":{}}},"id":9923,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2556:24:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":9924,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2584:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"2556:31:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9926,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2555:33:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:60:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":9930,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9909,"src":"2600:4:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"id":9931,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":9758,"src":"2600:15:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9929,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2592:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9928,"name":"uint256","nodeType":"ElementaryTypeName","src":"2592:7:54","typeDescriptions":{}}},"id":9932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2592:24:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":9935,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":9933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2621:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":9934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2627:2:54","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"2621:8:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":9936,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2620:10:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"2592:38:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9938,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2591:40:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:103:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":9913,"id":9940,"nodeType":"Return","src":"2521:110:54"}]},"documentation":{"id":9906,"nodeType":"StructuredDocumentation","src":"2321:105:54","text":" helper to pack the return value for validateUserOp\n @param data - the ValidationData to pack"},"id":9942,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2440:19:54","nodeType":"FunctionDefinition","parameters":{"id":9910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9909,"mutability":"mutable","name":"data","nameLocation":"2482:4:54","nodeType":"VariableDeclaration","scope":9942,"src":"2460:26:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":9908,"nodeType":"UserDefinedTypeName","pathNode":{"id":9907,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"2460:14:54"},"referencedDeclaration":9761,"src":"2460:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"2459:28:54"},"returnParameters":{"id":9913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9912,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":9942,"src":"2502:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9911,"name":"uint256","nodeType":"ElementaryTypeName","src":"2502:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2501:9:54"},"scope":9991,"src":"2431:207:54","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9979,"nodeType":"Block","src":"3062:112:54","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9977,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"condition":{"id":9954,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9945,"src":"3080:9:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":9956,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3096:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":9957,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3080:17:54","trueExpression":{"hexValue":"31","id":9955,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3092:1:54","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":9958,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3079:19:54","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9964,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":9961,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9947,"src":"3110:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9960,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3102:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9959,"name":"uint256","nodeType":"ElementaryTypeName","src":"3102:7:54","typeDescriptions":{}}},"id":9962,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3102:19:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":9963,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3125:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"3102:26:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9965,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3101:28:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:50:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":9969,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9949,"src":"3141:10:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":9968,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3133:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9967,"name":"uint256","nodeType":"ElementaryTypeName","src":"3133:7:54","typeDescriptions":{}}},"id":9970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3133:19:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":9973,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":9971,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3157:3:54","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":9972,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3163:2:54","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"3157:8:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":9974,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3156:10:54","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"3133:33:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":9976,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3132:35:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:88:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":9953,"id":9978,"nodeType":"Return","src":"3072:95:54"}]},"documentation":{"id":9943,"nodeType":"StructuredDocumentation","src":"2640:311:54","text":" helper to pack the return value for validateUserOp, when not using an aggregator\n @param sigFailed - true for signature failure, false for success\n @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n @param validAfter first timestamp this UserOperation is valid"},"id":9980,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2965:19:54","nodeType":"FunctionDefinition","parameters":{"id":9950,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9945,"mutability":"mutable","name":"sigFailed","nameLocation":"2990:9:54","nodeType":"VariableDeclaration","scope":9980,"src":"2985:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9944,"name":"bool","nodeType":"ElementaryTypeName","src":"2985:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":9947,"mutability":"mutable","name":"validUntil","nameLocation":"3008:10:54","nodeType":"VariableDeclaration","scope":9980,"src":"3001:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9946,"name":"uint48","nodeType":"ElementaryTypeName","src":"3001:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":9949,"mutability":"mutable","name":"validAfter","nameLocation":"3027:10:54","nodeType":"VariableDeclaration","scope":9980,"src":"3020:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9948,"name":"uint48","nodeType":"ElementaryTypeName","src":"3020:6:54","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2984:54:54"},"returnParameters":{"id":9953,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9952,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":9980,"src":"3053:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9951,"name":"uint256","nodeType":"ElementaryTypeName","src":"3053:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3052:9:54"},"scope":9991,"src":"2956:218:54","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":9989,"nodeType":"Block","src":"3429:193:54","statements":[{"AST":{"nodeType":"YulBlock","src":"3448:168:54","statements":[{"nodeType":"YulVariableDeclaration","src":"3462:22:54","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3479:4:54","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3473:5:54"},"nodeType":"YulFunctionCall","src":"3473:11:54"},"variables":[{"name":"mem","nodeType":"YulTypedName","src":"3466:3:54","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3497:22:54","value":{"name":"data.length","nodeType":"YulIdentifier","src":"3508:11:54"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"3501:3:54","type":""}]},{"expression":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3545:3:54"},{"name":"data.offset","nodeType":"YulIdentifier","src":"3550:11:54"},{"name":"len","nodeType":"YulIdentifier","src":"3563:3:54"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"3532:12:54"},"nodeType":"YulFunctionCall","src":"3532:35:54"},"nodeType":"YulExpressionStatement","src":"3532:35:54"},{"nodeType":"YulAssignment","src":"3580:26:54","value":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3597:3:54"},{"name":"len","nodeType":"YulIdentifier","src":"3602:3:54"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"3587:9:54"},"nodeType":"YulFunctionCall","src":"3587:19:54"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"3580:3:54"}]}]},"evmVersion":"london","externalReferences":[{"declaration":9983,"isOffset":false,"isSlot":false,"src":"3508:11:54","suffix":"length","valueSize":1},{"declaration":9983,"isOffset":true,"isSlot":false,"src":"3550:11:54","suffix":"offset","valueSize":1},{"declaration":9986,"isOffset":false,"isSlot":false,"src":"3580:3:54","valueSize":1}],"id":9988,"nodeType":"InlineAssembly","src":"3439:177:54"}]},"documentation":{"id":9981,"nodeType":"StructuredDocumentation","src":"3176:176:54","text":" keccak function over calldata.\n @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it."},"id":9990,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"calldataKeccak","nameLocation":"3366:14:54","nodeType":"FunctionDefinition","parameters":{"id":9984,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9983,"mutability":"mutable","name":"data","nameLocation":"3396:4:54","nodeType":"VariableDeclaration","scope":9990,"src":"3381:19:54","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":9982,"name":"bytes","nodeType":"ElementaryTypeName","src":"3381:5:54","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:21:54"},"returnParameters":{"id":9987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9986,"mutability":"mutable","name":"ret","nameLocation":"3424:3:54","nodeType":"VariableDeclaration","scope":9990,"src":"3416:11:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9985,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3416:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3415:13:54"},"scope":9991,"src":"3357:265:54","stateMutability":"pure","virtual":false,"visibility":"internal"}],"src":"36:3587:54"},"id":54},"contracts/core/NonceManager.sol":{"ast":{"absolutePath":"contracts/core/NonceManager.sol","exportedSymbols":{"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"NonceManager":[10080],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":10081,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":9992,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:55"},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":9993,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10081,"sourceUnit":10808,"src":"62:39:55","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":9995,"name":"INonceManager","nodeType":"IdentifierPath","referencedDeclaration":10826,"src":"170:13:55"},"id":9996,"nodeType":"InheritanceSpecifier","src":"170:13:55"}],"canonicalName":"NonceManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":9994,"nodeType":"StructuredDocumentation","src":"103:41:55","text":" nonce management functionality"},"fullyImplemented":true,"id":10080,"linearizedBaseContracts":[10080,10826],"name":"NonceManager","nameLocation":"154:12:55","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":9997,"nodeType":"StructuredDocumentation","src":"191:72:55","text":" The next valid sequence number for a given nonce key."},"functionSelector":"1b2e01b8","id":10003,"mutability":"mutable","name":"nonceSequenceNumber","nameLocation":"323:19:55","nodeType":"VariableDeclaration","scope":10080,"src":"268:74:55","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"},"typeName":{"id":10002,"keyType":{"id":9998,"name":"address","nodeType":"ElementaryTypeName","src":"276:7:55","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"268:47:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"},"valueType":{"id":10001,"keyType":{"id":9999,"name":"uint192","nodeType":"ElementaryTypeName","src":"295:7:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"nodeType":"Mapping","src":"287:27:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"},"valueType":{"id":10000,"name":"uint256","nodeType":"ElementaryTypeName","src":"306:7:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"baseFunctions":[10819],"body":{"id":10027,"nodeType":"Block","src":"445:79:55","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10025,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":10013,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10003,"src":"462:19:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":10015,"indexExpression":{"id":10014,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10005,"src":"482:6:55","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"462:27:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":10017,"indexExpression":{"id":10016,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10007,"src":"490:3:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"462:32:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":10020,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10007,"src":"506:3:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint192","typeString":"uint192"}],"id":10019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"498:7:55","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":10018,"name":"uint256","nodeType":"ElementaryTypeName","src":"498:7:55","typeDescriptions":{}}},"id":10021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"498:12:55","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"3634","id":10022,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"514:2:55","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"498:18:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":10024,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"497:20:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"462:55:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":10012,"id":10026,"nodeType":"Return","src":"455:62:55"}]},"functionSelector":"35567e1a","id":10028,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"358:8:55","nodeType":"FunctionDefinition","overrides":{"id":10009,"nodeType":"OverrideSpecifier","overrides":[],"src":"412:8:55"},"parameters":{"id":10008,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10005,"mutability":"mutable","name":"sender","nameLocation":"375:6:55","nodeType":"VariableDeclaration","scope":10028,"src":"367:14:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10004,"name":"address","nodeType":"ElementaryTypeName","src":"367:7:55","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10007,"mutability":"mutable","name":"key","nameLocation":"391:3:55","nodeType":"VariableDeclaration","scope":10028,"src":"383:11:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":10006,"name":"uint192","nodeType":"ElementaryTypeName","src":"383:7:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"366:29:55"},"returnParameters":{"id":10012,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10011,"mutability":"mutable","name":"nonce","nameLocation":"438:5:55","nodeType":"VariableDeclaration","scope":10028,"src":"430:13:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10010,"name":"uint256","nodeType":"ElementaryTypeName","src":"430:7:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"429:15:55"},"scope":10080,"src":"349:175:55","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[10825],"body":{"id":10042,"nodeType":"Block","src":"838:55:55","statements":[{"expression":{"id":10040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"848:38:55","subExpression":{"baseExpression":{"baseExpression":{"id":10034,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10003,"src":"848:19:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":10038,"indexExpression":{"expression":{"id":10035,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"868:3:55","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10036,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"868:10:55","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"848:31:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":10039,"indexExpression":{"id":10037,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10030,"src":"880:3:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"848:36:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10041,"nodeType":"ExpressionStatement","src":"848:38:55"}]},"functionSelector":"0bd28e3b","id":10043,"implemented":true,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"794:14:55","nodeType":"FunctionDefinition","overrides":{"id":10032,"nodeType":"OverrideSpecifier","overrides":[],"src":"829:8:55"},"parameters":{"id":10031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10030,"mutability":"mutable","name":"key","nameLocation":"817:3:55","nodeType":"VariableDeclaration","scope":10043,"src":"809:11:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":10029,"name":"uint192","nodeType":"ElementaryTypeName","src":"809:7:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"808:13:55"},"returnParameters":{"id":10033,"nodeType":"ParameterList","parameters":[],"src":"838:0:55"},"scope":10080,"src":"785:108:55","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":10078,"nodeType":"Block","src":"1096:146:55","statements":[{"assignments":[10054],"declarations":[{"constant":false,"id":10054,"mutability":"mutable","name":"key","nameLocation":"1115:3:55","nodeType":"VariableDeclaration","scope":10078,"src":"1107:11:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":10053,"name":"uint192","nodeType":"ElementaryTypeName","src":"1107:7:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"id":10061,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10057,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10048,"src":"1129:5:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"3634","id":10058,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1138:2:55","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"1129:11:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10056,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1121:7:55","typeDescriptions":{"typeIdentifier":"t_type$_t_uint192_$","typeString":"type(uint192)"},"typeName":{"id":10055,"name":"uint192","nodeType":"ElementaryTypeName","src":"1121:7:55","typeDescriptions":{}}},"id":10060,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1121:20:55","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"nodeType":"VariableDeclarationStatement","src":"1107:34:55"},{"assignments":[10063],"declarations":[{"constant":false,"id":10063,"mutability":"mutable","name":"seq","nameLocation":"1158:3:55","nodeType":"VariableDeclaration","scope":10078,"src":"1151:10:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":10062,"name":"uint64","nodeType":"ElementaryTypeName","src":"1151:6:55","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"id":10068,"initialValue":{"arguments":[{"id":10066,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10048,"src":"1171:5:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10065,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1164:6:55","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":10064,"name":"uint64","nodeType":"ElementaryTypeName","src":"1164:6:55","typeDescriptions":{}}},"id":10067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1164:13:55","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"VariableDeclarationStatement","src":"1151:26:55"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10076,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"1194:34:55","subExpression":{"baseExpression":{"baseExpression":{"id":10069,"name":"nonceSequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10003,"src":"1194:19:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint192_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint192 => uint256))"}},"id":10071,"indexExpression":{"id":10070,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10046,"src":"1214:6:55","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1194:27:55","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint192_$_t_uint256_$","typeString":"mapping(uint192 => uint256)"}},"id":10073,"indexExpression":{"id":10072,"name":"key","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10054,"src":"1222:3:55","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1194:32:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":10075,"name":"seq","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10063,"src":"1232:3:55","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"1194:41:55","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":10052,"id":10077,"nodeType":"Return","src":"1187:48:55"}]},"documentation":{"id":10044,"nodeType":"StructuredDocumentation","src":"899:104:55","text":" validate nonce uniqueness for this account.\n called just after validateUserOp()"},"id":10079,"implemented":true,"kind":"function","modifiers":[],"name":"_validateAndUpdateNonce","nameLocation":"1017:23:55","nodeType":"FunctionDefinition","parameters":{"id":10049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10046,"mutability":"mutable","name":"sender","nameLocation":"1049:6:55","nodeType":"VariableDeclaration","scope":10079,"src":"1041:14:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10045,"name":"address","nodeType":"ElementaryTypeName","src":"1041:7:55","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10048,"mutability":"mutable","name":"nonce","nameLocation":"1065:5:55","nodeType":"VariableDeclaration","scope":10079,"src":"1057:13:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10047,"name":"uint256","nodeType":"ElementaryTypeName","src":"1057:7:55","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1040:31:55"},"returnParameters":{"id":10052,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10051,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10079,"src":"1090:4:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10050,"name":"bool","nodeType":"ElementaryTypeName","src":"1090:4:55","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1089:6:55"},"scope":10080,"src":"1008:234:55","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":10081,"src":"145:1100:55","usedErrors":[]}],"src":"36:1210:55"},"id":55},"contracts/core/SenderCreator.sol":{"ast":{"absolutePath":"contracts/core/SenderCreator.sol","exportedSymbols":{"SenderCreator":[10127]},"id":10128,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10082,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:56"},{"abstract":false,"baseContracts":[],"canonicalName":"SenderCreator","contractDependencies":[],"contractKind":"contract","documentation":{"id":10083,"nodeType":"StructuredDocumentation","src":"62:142:56","text":" helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n which is explicitly not the entryPoint itself."},"fullyImplemented":true,"id":10127,"linearizedBaseContracts":[10127],"name":"SenderCreator","nameLocation":"214:13:56","nodeType":"ContractDefinition","nodes":[{"body":{"id":10125,"nodeType":"Block","src":"626:419:56","statements":[{"assignments":[10092],"declarations":[{"constant":false,"id":10092,"mutability":"mutable","name":"factory","nameLocation":"644:7:56","nodeType":"VariableDeclaration","scope":10125,"src":"636:15:56","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10091,"name":"address","nodeType":"ElementaryTypeName","src":"636:7:56","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":10103,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":10097,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10086,"src":"670:8:56","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":10099,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"683:2:56","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":10100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"670:16:56","startExpression":{"hexValue":"30","id":10098,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"679:1:56","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":10096,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"662:7:56","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10095,"name":"bytes20","nodeType":"ElementaryTypeName","src":"662:7:56","typeDescriptions":{}}},"id":10101,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"662:25:56","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":10094,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"654:7:56","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10093,"name":"address","nodeType":"ElementaryTypeName","src":"654:7:56","typeDescriptions":{}}},"id":10102,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"654:34:56","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"636:52:56"},{"assignments":[10105],"declarations":[{"constant":false,"id":10105,"mutability":"mutable","name":"initCallData","nameLocation":"711:12:56","nodeType":"VariableDeclaration","scope":10125,"src":"698:25:56","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10104,"name":"bytes","nodeType":"ElementaryTypeName","src":"698:5:56","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":10109,"initialValue":{"baseExpression":{"id":10106,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10086,"src":"726:8:56","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":10108,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"726:14:56","startExpression":{"hexValue":"3230","id":10107,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"735:2:56","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"698:42:56"},{"assignments":[10111],"declarations":[{"constant":false,"id":10111,"mutability":"mutable","name":"success","nameLocation":"755:7:56","nodeType":"VariableDeclaration","scope":10125,"src":"750:12:56","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10110,"name":"bool","nodeType":"ElementaryTypeName","src":"750:4:56","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":10112,"nodeType":"VariableDeclarationStatement","src":"750:12:56"},{"AST":{"nodeType":"YulBlock","src":"830:142:56","statements":[{"nodeType":"YulAssignment","src":"844:87:56","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"860:3:56"},"nodeType":"YulFunctionCall","src":"860:5:56"},{"name":"factory","nodeType":"YulIdentifier","src":"867:7:56"},{"kind":"number","nodeType":"YulLiteral","src":"876:1:56","type":"","value":"0"},{"arguments":[{"name":"initCallData","nodeType":"YulIdentifier","src":"883:12:56"},{"kind":"number","nodeType":"YulLiteral","src":"897:4:56","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"879:3:56"},"nodeType":"YulFunctionCall","src":"879:23:56"},{"arguments":[{"name":"initCallData","nodeType":"YulIdentifier","src":"910:12:56"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"904:5:56"},"nodeType":"YulFunctionCall","src":"904:19:56"},{"kind":"number","nodeType":"YulLiteral","src":"925:1:56","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"928:2:56","type":"","value":"32"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"855:4:56"},"nodeType":"YulFunctionCall","src":"855:76:56"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"844:7:56"}]},{"nodeType":"YulAssignment","src":"944:18:56","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"960:1:56","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"954:5:56"},"nodeType":"YulFunctionCall","src":"954:8:56"},"variableNames":[{"name":"sender","nodeType":"YulIdentifier","src":"944:6:56"}]}]},"evmVersion":"london","externalReferences":[{"declaration":10092,"isOffset":false,"isSlot":false,"src":"867:7:56","valueSize":1},{"declaration":10105,"isOffset":false,"isSlot":false,"src":"883:12:56","valueSize":1},{"declaration":10105,"isOffset":false,"isSlot":false,"src":"910:12:56","valueSize":1},{"declaration":10089,"isOffset":false,"isSlot":false,"src":"944:6:56","valueSize":1},{"declaration":10111,"isOffset":false,"isSlot":false,"src":"844:7:56","valueSize":1}],"id":10113,"nodeType":"InlineAssembly","src":"821:151:56"},{"condition":{"id":10115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"985:8:56","subExpression":{"id":10114,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10111,"src":"986:7:56","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10124,"nodeType":"IfStatement","src":"981:58:56","trueBody":{"id":10123,"nodeType":"Block","src":"995:44:56","statements":[{"expression":{"id":10121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10116,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10089,"src":"1009:6:56","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":10119,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1026:1:56","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10118,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1018:7:56","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10117,"name":"address","nodeType":"ElementaryTypeName","src":"1018:7:56","typeDescriptions":{}}},"id":10120,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1018:10:56","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1009:19:56","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":10122,"nodeType":"ExpressionStatement","src":"1009:19:56"}]}}]},"documentation":{"id":10084,"nodeType":"StructuredDocumentation","src":"235:305:56","text":" call the \"initCode\" factory to create and return the sender account address\n @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n @return sender the returned address of the created account, or zero address on failure."},"functionSelector":"570e1a36","id":10126,"implemented":true,"kind":"function","modifiers":[],"name":"createSender","nameLocation":"554:12:56","nodeType":"FunctionDefinition","parameters":{"id":10087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10086,"mutability":"mutable","name":"initCode","nameLocation":"582:8:56","nodeType":"VariableDeclaration","scope":10126,"src":"567:23:56","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":10085,"name":"bytes","nodeType":"ElementaryTypeName","src":"567:5:56","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"566:25:56"},"returnParameters":{"id":10090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10089,"mutability":"mutable","name":"sender","nameLocation":"618:6:56","nodeType":"VariableDeclaration","scope":10126,"src":"610:14:56","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10088,"name":"address","nodeType":"ElementaryTypeName","src":"610:7:56","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"609:16:56"},"scope":10127,"src":"545:500:56","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10128,"src":"205:842:56","usedErrors":[]}],"src":"36:1012:56"},"id":56},"contracts/core/StakeManager.sol":{"ast":{"absolutePath":"contracts/core/StakeManager.sol","exportedSymbols":{"IStakeManager":[10966],"StakeManager":[10552]},"id":10553,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":10129,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:57"},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"../interfaces/IStakeManager.sol","id":10130,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10553,"sourceUnit":10967,"src":"67:41:57","symbolAliases":[],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":10132,"name":"IStakeManager","nodeType":"IdentifierPath","referencedDeclaration":10966,"src":"433:13:57"},"id":10133,"nodeType":"InheritanceSpecifier","src":"433:13:57"}],"canonicalName":"StakeManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":10131,"nodeType":"StructuredDocumentation","src":"193:205:57","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by a paymaster."},"fullyImplemented":true,"id":10552,"linearizedBaseContracts":[10552,10966],"name":"StakeManager","nameLocation":"417:12:57","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":10134,"nodeType":"StructuredDocumentation","src":"454:47:57","text":"maps paymaster to their deposits and stakes"},"functionSelector":"fc7e286d","id":10139,"mutability":"mutable","name":"deposits","nameLocation":"545:8:57","nodeType":"VariableDeclaration","scope":10552,"src":"506:47:57","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo)"},"typeName":{"id":10138,"keyType":{"id":10135,"name":"address","nodeType":"ElementaryTypeName","src":"514:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"506:31:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo)"},"valueType":{"id":10137,"nodeType":"UserDefinedTypeName","pathNode":{"id":10136,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"525:11:57"},"referencedDeclaration":10913,"src":"525:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}}},"visibility":"public"},{"baseFunctions":[10927],"body":{"id":10152,"nodeType":"Block","src":"681:41:57","statements":[{"expression":{"baseExpression":{"id":10148,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"698:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10150,"indexExpression":{"id":10149,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10142,"src":"707:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"698:17:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"functionReturnParameters":10147,"id":10151,"nodeType":"Return","src":"691:24:57"}]},"documentation":{"id":10140,"nodeType":"StructuredDocumentation","src":"560:29:57","text":"@inheritdoc IStakeManager"},"functionSelector":"5287ce12","id":10153,"implemented":true,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"603:14:57","nodeType":"FunctionDefinition","parameters":{"id":10143,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10142,"mutability":"mutable","name":"account","nameLocation":"626:7:57","nodeType":"VariableDeclaration","scope":10153,"src":"618:15:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10141,"name":"address","nodeType":"ElementaryTypeName","src":"618:7:57","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"617:17:57"},"returnParameters":{"id":10147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10146,"mutability":"mutable","name":"info","nameLocation":"675:4:57","nodeType":"VariableDeclaration","scope":10153,"src":"656:23:57","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10145,"nodeType":"UserDefinedTypeName","pathNode":{"id":10144,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"656:11:57"},"referencedDeclaration":10913,"src":"656:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"655:25:57"},"scope":10552,"src":"594:128:57","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":10182,"nodeType":"Block","src":"864:165:57","statements":[{"assignments":[10163],"declarations":[{"constant":false,"id":10163,"mutability":"mutable","name":"depositInfo","nameLocation":"894:11:57","nodeType":"VariableDeclaration","scope":10182,"src":"874:31:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10162,"nodeType":"UserDefinedTypeName","pathNode":{"id":10161,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"874:11:57"},"referencedDeclaration":10913,"src":"874:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10167,"initialValue":{"baseExpression":{"id":10164,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"908:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10166,"indexExpression":{"id":10165,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10155,"src":"917:4:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"908:14:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"874:48:57"},{"expression":{"id":10173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10168,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10159,"src":"932:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":10170,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":10915,"src":"932:10:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":10171,"name":"depositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10163,"src":"945:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10172,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":10908,"src":"945:17:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"932:30:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10174,"nodeType":"ExpressionStatement","src":"932:30:57"},{"expression":{"id":10180,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10175,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10159,"src":"972:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo memory"}},"id":10177,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10917,"src":"972:20:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":10178,"name":"depositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10163,"src":"995:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10179,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10910,"src":"995:27:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"972:50:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10181,"nodeType":"ExpressionStatement","src":"972:50:57"}]},"id":10183,"implemented":true,"kind":"function","modifiers":[],"name":"_getStakeInfo","nameLocation":"790:13:57","nodeType":"FunctionDefinition","parameters":{"id":10156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10155,"mutability":"mutable","name":"addr","nameLocation":"812:4:57","nodeType":"VariableDeclaration","scope":10183,"src":"804:12:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10154,"name":"address","nodeType":"ElementaryTypeName","src":"804:7:57","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"803:14:57"},"returnParameters":{"id":10160,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10159,"mutability":"mutable","name":"info","nameLocation":"858:4:57","nodeType":"VariableDeclaration","scope":10183,"src":"841:21:57","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10158,"nodeType":"UserDefinedTypeName","pathNode":{"id":10157,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"841:9:57"},"referencedDeclaration":10918,"src":"841:9:57","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"840:23:57"},"scope":10552,"src":"781:248:57","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[10935],"body":{"id":10196,"nodeType":"Block","src":"1161:49:57","statements":[{"expression":{"expression":{"baseExpression":{"id":10191,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"1178:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10193,"indexExpression":{"id":10192,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10186,"src":"1187:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1178:17:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"id":10194,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"1178:25:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"functionReturnParameters":10190,"id":10195,"nodeType":"Return","src":"1171:32:57"}]},"documentation":{"id":10184,"nodeType":"StructuredDocumentation","src":"1035:55:57","text":"return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":10197,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1104:9:57","nodeType":"FunctionDefinition","parameters":{"id":10187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10186,"mutability":"mutable","name":"account","nameLocation":"1122:7:57","nodeType":"VariableDeclaration","scope":10197,"src":"1114:15:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10185,"name":"address","nodeType":"ElementaryTypeName","src":"1114:7:57","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1113:17:57"},"returnParameters":{"id":10190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10189,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10197,"src":"1152:7:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10188,"name":"uint256","nodeType":"ElementaryTypeName","src":"1152:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1151:9:57"},"scope":10552,"src":"1095:115:57","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":10205,"nodeType":"Block","src":"1243:38:57","statements":[{"expression":{"arguments":[{"expression":{"id":10201,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1263:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1263:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10200,"name":"depositTo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10274,"src":"1253:9:57","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":10203,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1253:21:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10204,"nodeType":"ExpressionStatement","src":"1253:21:57"}]},"id":10206,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":10198,"nodeType":"ParameterList","parameters":[],"src":"1223:2:57"},"returnParameters":{"id":10199,"nodeType":"ParameterList","parameters":[],"src":"1243:0:57"},"scope":10552,"src":"1216:65:57","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":10247,"nodeType":"Block","src":"1356:224:57","statements":[{"assignments":[10215],"declarations":[{"constant":false,"id":10215,"mutability":"mutable","name":"info","nameLocation":"1386:4:57","nodeType":"VariableDeclaration","scope":10247,"src":"1366:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10214,"nodeType":"UserDefinedTypeName","pathNode":{"id":10213,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"1366:11:57"},"referencedDeclaration":10913,"src":"1366:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10219,"initialValue":{"baseExpression":{"id":10216,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"1393:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10218,"indexExpression":{"id":10217,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10208,"src":"1402:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1393:17:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"1366:44:57"},{"assignments":[10221],"declarations":[{"constant":false,"id":10221,"mutability":"mutable","name":"newAmount","nameLocation":"1428:9:57","nodeType":"VariableDeclaration","scope":10247,"src":"1420:17:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10220,"name":"uint256","nodeType":"ElementaryTypeName","src":"1420:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10226,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10225,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10222,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10215,"src":"1440:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10223,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"1440:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":10224,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10210,"src":"1455:6:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1440:21:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1420:41:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10234,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10228,"name":"newAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10221,"src":"1479:9:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":10231,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1497:7:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":10230,"name":"uint112","nodeType":"ElementaryTypeName","src":"1497:7:57","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"}],"id":10229,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1492:4:57","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":10232,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1492:13:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint112","typeString":"type(uint112)"}},"id":10233,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"1492:17:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"1479:30:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6465706f736974206f766572666c6f77","id":10235,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1511:18:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa","typeString":"literal_string \"deposit overflow\""},"value":"deposit overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa","typeString":"literal_string \"deposit overflow\""}],"id":10227,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1471:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1471:59:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10237,"nodeType":"ExpressionStatement","src":"1471:59:57"},{"expression":{"id":10245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10238,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10215,"src":"1540:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10240,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"1540:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":10243,"name":"newAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10221,"src":"1563:9:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10242,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1555:7:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":10241,"name":"uint112","nodeType":"ElementaryTypeName","src":"1555:7:57","typeDescriptions":{}}},"id":10244,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1555:18:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"1540:33:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":10246,"nodeType":"ExpressionStatement","src":"1540:33:57"}]},"id":10248,"implemented":true,"kind":"function","modifiers":[],"name":"_incrementDeposit","nameLocation":"1296:17:57","nodeType":"FunctionDefinition","parameters":{"id":10211,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10208,"mutability":"mutable","name":"account","nameLocation":"1322:7:57","nodeType":"VariableDeclaration","scope":10248,"src":"1314:15:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10207,"name":"address","nodeType":"ElementaryTypeName","src":"1314:7:57","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10210,"mutability":"mutable","name":"amount","nameLocation":"1339:6:57","nodeType":"VariableDeclaration","scope":10248,"src":"1331:14:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10209,"name":"uint256","nodeType":"ElementaryTypeName","src":"1331:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1313:33:57"},"returnParameters":{"id":10212,"nodeType":"ParameterList","parameters":[],"src":"1356:0:57"},"scope":10552,"src":"1287:293:57","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[10941],"body":{"id":10273,"nodeType":"Block","src":"1700:155:57","statements":[{"expression":{"arguments":[{"id":10255,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"1728:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":10256,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1737:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"1737:9:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10254,"name":"_incrementDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10248,"src":"1710:17:57","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":10258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1710:37:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10259,"nodeType":"ExpressionStatement","src":"1710:37:57"},{"assignments":[10262],"declarations":[{"constant":false,"id":10262,"mutability":"mutable","name":"info","nameLocation":"1777:4:57","nodeType":"VariableDeclaration","scope":10273,"src":"1757:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10261,"nodeType":"UserDefinedTypeName","pathNode":{"id":10260,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"1757:11:57"},"referencedDeclaration":10913,"src":"1757:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10266,"initialValue":{"baseExpression":{"id":10263,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"1784:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10265,"indexExpression":{"id":10264,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"1793:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1784:17:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"1757:44:57"},{"eventCall":{"arguments":[{"id":10268,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"1826:7:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":10269,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10262,"src":"1835:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10270,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"1835:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint112","typeString":"uint112"}],"id":10267,"name":"Deposited","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10870,"src":"1816:9:57","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":10271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1816:32:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10272,"nodeType":"EmitStatement","src":"1811:37:57"}]},"documentation":{"id":10249,"nodeType":"StructuredDocumentation","src":"1586:58:57","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":10274,"implemented":true,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"1658:9:57","nodeType":"FunctionDefinition","parameters":{"id":10252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10251,"mutability":"mutable","name":"account","nameLocation":"1676:7:57","nodeType":"VariableDeclaration","scope":10274,"src":"1668:15:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10250,"name":"address","nodeType":"ElementaryTypeName","src":"1668:7:57","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1667:17:57"},"returnParameters":{"id":10253,"nodeType":"ParameterList","parameters":[],"src":"1700:0:57"},"scope":10552,"src":"1649:206:57","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[10947],"body":{"id":10353,"nodeType":"Block","src":"2123:615:57","statements":[{"assignments":[10282],"declarations":[{"constant":false,"id":10282,"mutability":"mutable","name":"info","nameLocation":"2153:4:57","nodeType":"VariableDeclaration","scope":10353,"src":"2133:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10281,"nodeType":"UserDefinedTypeName","pathNode":{"id":10280,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"2133:11:57"},"referencedDeclaration":10913,"src":"2133:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10287,"initialValue":{"baseExpression":{"id":10283,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"2160:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10286,"indexExpression":{"expression":{"id":10284,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2169:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2169:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2160:20:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"2133:47:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":10291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10289,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10277,"src":"2198:15:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10290,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2216:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2198:19:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d757374207370656369667920756e7374616b652064656c6179","id":10292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2219:28:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b","typeString":"literal_string \"must specify unstake delay\""},"value":"must specify unstake delay"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b","typeString":"literal_string \"must specify unstake delay\""}],"id":10288,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2190:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2190:58:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10294,"nodeType":"ExpressionStatement","src":"2190:58:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":10299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10296,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10277,"src":"2266:15:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"id":10297,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10282,"src":"2285:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10298,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10910,"src":"2285:20:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"2266:39:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"63616e6e6f7420646563726561736520756e7374616b652074696d65","id":10300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2307:30:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7","typeString":"literal_string \"cannot decrease unstake time\""},"value":"cannot decrease unstake time"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7","typeString":"literal_string \"cannot decrease unstake time\""}],"id":10295,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2258:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2258:80:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10302,"nodeType":"ExpressionStatement","src":"2258:80:57"},{"assignments":[10304],"declarations":[{"constant":false,"id":10304,"mutability":"mutable","name":"stake","nameLocation":"2356:5:57","nodeType":"VariableDeclaration","scope":10353,"src":"2348:13:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10303,"name":"uint256","nodeType":"ElementaryTypeName","src":"2348:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10310,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10305,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10282,"src":"2364:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10306,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":10908,"src":"2364:10:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":10307,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2377:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"2377:9:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2364:22:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2348:38:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10314,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10312,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10304,"src":"2404:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10313,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2412:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2404:9:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6e6f207374616b6520737065636966696564","id":10315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2415:20:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8","typeString":"literal_string \"no stake specified\""},"value":"no stake specified"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8","typeString":"literal_string \"no stake specified\""}],"id":10311,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2396:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10316,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2396:40:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10317,"nodeType":"ExpressionStatement","src":"2396:40:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10325,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10319,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10304,"src":"2454:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":10322,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2468:7:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":10321,"name":"uint112","nodeType":"ElementaryTypeName","src":"2468:7:57","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"}],"id":10320,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2463:4:57","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":10323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2463:13:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint112","typeString":"type(uint112)"}},"id":10324,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"2463:17:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"2454:26:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"7374616b65206f766572666c6f77","id":10326,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2482:16:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8","typeString":"literal_string \"stake overflow\""},"value":"stake overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8","typeString":"literal_string \"stake overflow\""}],"id":10318,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2446:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2446:53:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10328,"nodeType":"ExpressionStatement","src":"2446:53:57"},{"expression":{"id":10344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":10329,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"2509:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10332,"indexExpression":{"expression":{"id":10330,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2518:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10331,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2518:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2509:20:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":10334,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10282,"src":"2557:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10335,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"2557:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},{"hexValue":"74727565","id":10336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2583:4:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"arguments":[{"id":10339,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10304,"src":"2609:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2601:7:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":10337,"name":"uint112","nodeType":"ElementaryTypeName","src":"2601:7:57","typeDescriptions":{}}},"id":10340,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2601:14:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},{"id":10341,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10277,"src":"2629:15:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"hexValue":"30","id":10342,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2658:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint112","typeString":"uint112"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint112","typeString":"uint112"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10333,"name":"DepositInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10913,"src":"2532:11:57","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_DepositInfo_$10913_storage_ptr_$","typeString":"type(struct IStakeManager.DepositInfo storage pointer)"}},"id":10343,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2532:137:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_memory_ptr","typeString":"struct IStakeManager.DepositInfo memory"}},"src":"2509:160:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"id":10345,"nodeType":"ExpressionStatement","src":"2509:160:57"},{"eventCall":{"arguments":[{"expression":{"id":10347,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2696:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10348,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2696:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10349,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10304,"src":"2708:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10350,"name":"unstakeDelaySec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10277,"src":"2715:15:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"id":10346,"name":"StakeLocked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10887,"src":"2684:11:57","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,uint256,uint256)"}},"id":10351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2684:47:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10352,"nodeType":"EmitStatement","src":"2679:52:57"}]},"documentation":{"id":10275,"nodeType":"StructuredDocumentation","src":"1861:200:57","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":10354,"implemented":true,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2075:8:57","nodeType":"FunctionDefinition","parameters":{"id":10278,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10277,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"2091:15:57","nodeType":"VariableDeclaration","scope":10354,"src":"2084:22:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":10276,"name":"uint32","nodeType":"ElementaryTypeName","src":"2084:6:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2083:24:57"},"returnParameters":{"id":10279,"nodeType":"ParameterList","parameters":[],"src":"2123:0:57"},"scope":10552,"src":"2066:672:57","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[10951],"body":{"id":10409,"nodeType":"Block","src":"2909:376:57","statements":[{"assignments":[10360],"declarations":[{"constant":false,"id":10360,"mutability":"mutable","name":"info","nameLocation":"2939:4:57","nodeType":"VariableDeclaration","scope":10409,"src":"2919:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10359,"nodeType":"UserDefinedTypeName","pathNode":{"id":10358,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"2919:11:57"},"referencedDeclaration":10913,"src":"2919:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10365,"initialValue":{"baseExpression":{"id":10361,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"2946:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10364,"indexExpression":{"expression":{"id":10362,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2955:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10363,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2955:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2946:20:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"2919:47:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":10370,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10367,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10360,"src":"2984:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10368,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10910,"src":"2984:20:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":10369,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3008:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2984:25:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6e6f74207374616b6564","id":10371,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3011:12:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12","typeString":"literal_string \"not staked\""},"value":"not staked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12","typeString":"literal_string \"not staked\""}],"id":10366,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2976:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10372,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2976:48:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10373,"nodeType":"ExpressionStatement","src":"2976:48:57"},{"expression":{"arguments":[{"expression":{"id":10375,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10360,"src":"3042:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10376,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"staked","nodeType":"MemberAccess","referencedDeclaration":10906,"src":"3042:11:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"616c726561647920756e7374616b696e67","id":10377,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3055:19:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8","typeString":"literal_string \"already unstaking\""},"value":"already unstaking"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8","typeString":"literal_string \"already unstaking\""}],"id":10374,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3034:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3034:41:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10379,"nodeType":"ExpressionStatement","src":"3034:41:57"},{"assignments":[10381],"declarations":[{"constant":false,"id":10381,"mutability":"mutable","name":"withdrawTime","nameLocation":"3092:12:57","nodeType":"VariableDeclaration","scope":10409,"src":"3085:19:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10380,"name":"uint48","nodeType":"ElementaryTypeName","src":"3085:6:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":10390,"initialValue":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":10389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":10384,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3114:5:57","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":10385,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"3114:15:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10383,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3107:6:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":10382,"name":"uint48","nodeType":"ElementaryTypeName","src":"3107:6:57","typeDescriptions":{}}},"id":10386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3107:23:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":10387,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10360,"src":"3133:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10388,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10910,"src":"3133:20:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"3107:46:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"3085:68:57"},{"expression":{"id":10395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10391,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10360,"src":"3163:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10393,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":10912,"src":"3163:17:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":10394,"name":"withdrawTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10381,"src":"3183:12:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"3163:32:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":10396,"nodeType":"ExpressionStatement","src":"3163:32:57"},{"expression":{"id":10401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10397,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10360,"src":"3205:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10399,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"staked","nodeType":"MemberAccess","referencedDeclaration":10906,"src":"3205:11:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":10400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3219:5:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3205:19:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10402,"nodeType":"ExpressionStatement","src":"3205:19:57"},{"eventCall":{"arguments":[{"expression":{"id":10404,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3253:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3253:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10406,"name":"withdrawTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10381,"src":"3265:12:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":10403,"name":"StakeUnlocked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10894,"src":"3239:13:57","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":10407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3239:39:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10408,"nodeType":"EmitStatement","src":"3234:44:57"}]},"documentation":{"id":10355,"nodeType":"StructuredDocumentation","src":"2744:128:57","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":10410,"implemented":true,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2886:11:57","nodeType":"FunctionDefinition","parameters":{"id":10356,"nodeType":"ParameterList","parameters":[],"src":"2897:2:57"},"returnParameters":{"id":10357,"nodeType":"ParameterList","parameters":[],"src":"2909:0:57"},"scope":10552,"src":"2877:408:57","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[10957],"body":{"id":10492,"nodeType":"Block","src":"3556:586:57","statements":[{"assignments":[10418],"declarations":[{"constant":false,"id":10418,"mutability":"mutable","name":"info","nameLocation":"3586:4:57","nodeType":"VariableDeclaration","scope":10492,"src":"3566:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10417,"nodeType":"UserDefinedTypeName","pathNode":{"id":10416,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"3566:11:57"},"referencedDeclaration":10913,"src":"3566:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10423,"initialValue":{"baseExpression":{"id":10419,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"3593:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10422,"indexExpression":{"expression":{"id":10420,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3602:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3602:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3593:20:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"3566:47:57"},{"assignments":[10425],"declarations":[{"constant":false,"id":10425,"mutability":"mutable","name":"stake","nameLocation":"3631:5:57","nodeType":"VariableDeclaration","scope":10492,"src":"3623:13:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10424,"name":"uint256","nodeType":"ElementaryTypeName","src":"3623:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10428,"initialValue":{"expression":{"id":10426,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3639:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10427,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":10908,"src":"3639:10:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"VariableDeclarationStatement","src":"3623:26:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10430,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10425,"src":"3667:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10431,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3675:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3667:9:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4e6f207374616b6520746f207769746864726177","id":10433,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3678:22:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705","typeString":"literal_string \"No stake to withdraw\""},"value":"No stake to withdraw"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705","typeString":"literal_string \"No stake to withdraw\""}],"id":10429,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3659:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10434,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3659:42:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10435,"nodeType":"ExpressionStatement","src":"3659:42:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":10440,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10437,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3719:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10438,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":10912,"src":"3719:17:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10439,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3739:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3719:21:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d7573742063616c6c20756e6c6f636b5374616b652829206669727374","id":10441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3742:31:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5","typeString":"literal_string \"must call unlockStake() first\""},"value":"must call unlockStake() first"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5","typeString":"literal_string \"must call unlockStake() first\""}],"id":10436,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3711:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3711:63:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10443,"nodeType":"ExpressionStatement","src":"3711:63:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10445,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3792:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10446,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":10912,"src":"3792:17:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":10447,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3813:5:57","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":10448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"3813:15:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3792:36:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5374616b65207769746864726177616c206973206e6f7420647565","id":10450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3830:29:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45","typeString":"literal_string \"Stake withdrawal is not due\""},"value":"Stake withdrawal is not due"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45","typeString":"literal_string \"Stake withdrawal is not due\""}],"id":10444,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3784:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10451,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3784:76:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10452,"nodeType":"ExpressionStatement","src":"3784:76:57"},{"expression":{"id":10457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10453,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3870:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10455,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"unstakeDelaySec","nodeType":"MemberAccess","referencedDeclaration":10910,"src":"3870:20:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":10456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3893:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3870:24:57","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"id":10458,"nodeType":"ExpressionStatement","src":"3870:24:57"},{"expression":{"id":10463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10459,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3904:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10461,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"withdrawTime","nodeType":"MemberAccess","referencedDeclaration":10912,"src":"3904:17:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":10462,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3924:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3904:21:57","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":10464,"nodeType":"ExpressionStatement","src":"3904:21:57"},{"expression":{"id":10469,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10465,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10418,"src":"3935:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10467,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":10908,"src":"3935:10:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":10468,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3948:1:57","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3935:14:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":10470,"nodeType":"ExpressionStatement","src":"3935:14:57"},{"eventCall":{"arguments":[{"expression":{"id":10472,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3979:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10473,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3979:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10474,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10413,"src":"3991:15:57","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":10475,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10425,"src":"4008:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10471,"name":"StakeWithdrawn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10902,"src":"3964:14:57","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":10476,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3964:50:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10477,"nodeType":"EmitStatement","src":"3959:55:57"},{"assignments":[10479,null],"declarations":[{"constant":false,"id":10479,"mutability":"mutable","name":"success","nameLocation":"4030:7:57","nodeType":"VariableDeclaration","scope":10492,"src":"4025:12:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10478,"name":"bool","nodeType":"ElementaryTypeName","src":"4025:4:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":10486,"initialValue":{"arguments":[{"hexValue":"","id":10484,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4078:2:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":10480,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10413,"src":"4042:15:57","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":10481,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"4042:20:57","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":10483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":10482,"name":"stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10425,"src":"4071:5:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4042:35:57","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":10485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4042:39:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4024:57:57"},{"expression":{"arguments":[{"id":10488,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10479,"src":"4099:7:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6661696c656420746f207769746864726177207374616b65","id":10489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4108:26:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b","typeString":"literal_string \"failed to withdraw stake\""},"value":"failed to withdraw stake"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b","typeString":"literal_string \"failed to withdraw stake\""}],"id":10487,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4091:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4091:44:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10491,"nodeType":"ExpressionStatement","src":"4091:44:57"}]},"documentation":{"id":10411,"nodeType":"StructuredDocumentation","src":"3292:194:57","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":10493,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"3500:13:57","nodeType":"FunctionDefinition","parameters":{"id":10414,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10413,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3530:15:57","nodeType":"VariableDeclaration","scope":10493,"src":"3514:31:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10412,"name":"address","nodeType":"ElementaryTypeName","src":"3514:15:57","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3513:33:57"},"returnParameters":{"id":10415,"nodeType":"ParameterList","parameters":[],"src":"3556:0:57"},"scope":10552,"src":"3491:651:57","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[10965],"body":{"id":10550,"nodeType":"Block","src":"4404:398:57","statements":[{"assignments":[10503],"declarations":[{"constant":false,"id":10503,"mutability":"mutable","name":"info","nameLocation":"4434:4:57","nodeType":"VariableDeclaration","scope":10550,"src":"4414:24:57","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10502,"nodeType":"UserDefinedTypeName","pathNode":{"id":10501,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"4414:11:57"},"referencedDeclaration":10913,"src":"4414:11:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"id":10508,"initialValue":{"baseExpression":{"id":10504,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10139,"src":"4441:8:57","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_DepositInfo_$10913_storage_$","typeString":"mapping(address => struct IStakeManager.DepositInfo storage ref)"}},"id":10507,"indexExpression":{"expression":{"id":10505,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4450:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4450:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4441:20:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage","typeString":"struct IStakeManager.DepositInfo storage ref"}},"nodeType":"VariableDeclarationStatement","src":"4414:47:57"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10510,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10498,"src":"4479:14:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":10511,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10503,"src":"4497:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10512,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"4497:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"4479:30:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"576974686472617720616d6f756e7420746f6f206c61726765","id":10514,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4511:27:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178","typeString":"literal_string \"Withdraw amount too large\""},"value":"Withdraw amount too large"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178","typeString":"literal_string \"Withdraw amount too large\""}],"id":10509,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4471:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10515,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4471:68:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10516,"nodeType":"ExpressionStatement","src":"4471:68:57"},{"expression":{"id":10527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10517,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10503,"src":"4549:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10519,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"4549:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10525,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10522,"name":"info","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10503,"src":"4572:4:57","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo storage pointer"}},"id":10523,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":10904,"src":"4572:12:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":10524,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10498,"src":"4587:14:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4572:29:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10521,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4564:7:57","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":10520,"name":"uint112","nodeType":"ElementaryTypeName","src":"4564:7:57","typeDescriptions":{}}},"id":10526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4564:38:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"4549:53:57","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"id":10528,"nodeType":"ExpressionStatement","src":"4549:53:57"},{"eventCall":{"arguments":[{"expression":{"id":10530,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4627:3:57","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":10531,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4627:10:57","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10532,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10496,"src":"4639:15:57","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":10533,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10498,"src":"4656:14:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10529,"name":"Withdrawn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10878,"src":"4617:9:57","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":10534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4617:54:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10535,"nodeType":"EmitStatement","src":"4612:59:57"},{"assignments":[10537,null],"declarations":[{"constant":false,"id":10537,"mutability":"mutable","name":"success","nameLocation":"4687:7:57","nodeType":"VariableDeclaration","scope":10550,"src":"4682:12:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10536,"name":"bool","nodeType":"ElementaryTypeName","src":"4682:4:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":10544,"initialValue":{"arguments":[{"hexValue":"","id":10542,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4744:2:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":10538,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10496,"src":"4699:15:57","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":10539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"4699:20:57","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":10541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":10540,"name":"withdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10498,"src":"4728:14:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4699:44:57","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":10543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4699:48:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4681:66:57"},{"expression":{"arguments":[{"id":10546,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"4765:7:57","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6661696c656420746f207769746864726177","id":10547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4774:20:57","typeDescriptions":{"typeIdentifier":"t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41","typeString":"literal_string \"failed to withdraw\""},"value":"failed to withdraw"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41","typeString":"literal_string \"failed to withdraw\""}],"id":10545,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4757:7:57","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":10548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4757:38:57","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10549,"nodeType":"ExpressionStatement","src":"4757:38:57"}]},"documentation":{"id":10494,"nodeType":"StructuredDocumentation","src":"4148:165:57","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":10551,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"4327:10:57","nodeType":"FunctionDefinition","parameters":{"id":10499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10496,"mutability":"mutable","name":"withdrawAddress","nameLocation":"4354:15:57","nodeType":"VariableDeclaration","scope":10551,"src":"4338:31:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10495,"name":"address","nodeType":"ElementaryTypeName","src":"4338:15:57","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":10498,"mutability":"mutable","name":"withdrawAmount","nameLocation":"4379:14:57","nodeType":"VariableDeclaration","scope":10551,"src":"4371:22:57","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10497,"name":"uint256","nodeType":"ElementaryTypeName","src":"4371:7:57","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4337:57:57"},"returnParameters":{"id":10500,"nodeType":"ParameterList","parameters":[],"src":"4404:0:57"},"scope":10552,"src":"4318:484:57","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10553,"src":"399:4405:57","usedErrors":[]}],"src":"41:4764:57"},"id":57},"contracts/interfaces/IAccount.sol":{"ast":{"absolutePath":"contracts/interfaces/IAccount.sol","exportedSymbols":{"IAccount":[10569],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":10570,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10554,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:58"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":10555,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10570,"sourceUnit":11164,"src":"62:29:58","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAccount","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":10569,"linearizedBaseContracts":[10569],"name":"IAccount","nameLocation":"103:8:58","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":10556,"nodeType":"StructuredDocumentation","src":"119:1861:58","text":" Validate user's signature and nonce\n the entryPoint will make the call to the recipient only if this validation call returns successfully.\n signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n This allows making a \"simulation call\" without a valid signature\n Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n @dev Must validate caller is the entryPoint.\n Must validate the signature and nonce\n @param userOp the operation that is about to be executed.\n @param userOpHash hash of the user's request data. can be used as the basis for signature.\n @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n The excess is left as a deposit in the entrypoint, for future calls.\n can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"functionSelector":"3a871cdd","id":10568,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1994:14:58","nodeType":"FunctionDefinition","parameters":{"id":10564,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10559,"mutability":"mutable","name":"userOp","nameLocation":"2032:6:58","nodeType":"VariableDeclaration","scope":10568,"src":"2009:29:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10558,"nodeType":"UserDefinedTypeName","pathNode":{"id":10557,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2009:13:58"},"referencedDeclaration":10993,"src":"2009:13:58","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":10561,"mutability":"mutable","name":"userOpHash","nameLocation":"2048:10:58","nodeType":"VariableDeclaration","scope":10568,"src":"2040:18:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10560,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2040:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10563,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"2068:19:58","nodeType":"VariableDeclaration","scope":10568,"src":"2060:27:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10562,"name":"uint256","nodeType":"ElementaryTypeName","src":"2060:7:58","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2008:80:58"},"returnParameters":{"id":10567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10566,"mutability":"mutable","name":"validationData","nameLocation":"2119:14:58","nodeType":"VariableDeclaration","scope":10568,"src":"2111:22:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10565,"name":"uint256","nodeType":"ElementaryTypeName","src":"2111:7:58","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2110:24:58"},"scope":10569,"src":"1985:150:58","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10570,"src":"93:2044:58","usedErrors":[]}],"src":"36:2102:58"},"id":58},"contracts/interfaces/IAggregator.sol":{"ast":{"absolutePath":"contracts/interfaces/IAggregator.sol","exportedSymbols":{"IAggregator":[10603],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":10604,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10571,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:59"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":10572,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10604,"sourceUnit":11164,"src":"62:29:59","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAggregator","contractDependencies":[],"contractKind":"interface","documentation":{"id":10573,"nodeType":"StructuredDocumentation","src":"93:43:59","text":" Aggregated Signatures validator."},"fullyImplemented":false,"id":10603,"linearizedBaseContracts":[10603],"name":"IAggregator","nameLocation":"147:11:59","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":10574,"nodeType":"StructuredDocumentation","src":"166:136:59","text":" validate aggregated signature.\n revert if the aggregated signature does not match the given list of operations."},"functionSelector":"e3563a4f","id":10583,"implemented":false,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"316:18:59","nodeType":"FunctionDefinition","parameters":{"id":10581,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10578,"mutability":"mutable","name":"userOps","nameLocation":"360:7:59","nodeType":"VariableDeclaration","scope":10583,"src":"335:32:59","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":10576,"nodeType":"UserDefinedTypeName","pathNode":{"id":10575,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"335:13:59"},"referencedDeclaration":10993,"src":"335:13:59","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":10577,"nodeType":"ArrayTypeName","src":"335:15:59","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":10580,"mutability":"mutable","name":"signature","nameLocation":"384:9:59","nodeType":"VariableDeclaration","scope":10583,"src":"369:24:59","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":10579,"name":"bytes","nodeType":"ElementaryTypeName","src":"369:5:59","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"334:60:59"},"returnParameters":{"id":10582,"nodeType":"ParameterList","parameters":[],"src":"408:0:59"},"scope":10603,"src":"307:102:59","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10584,"nodeType":"StructuredDocumentation","src":"415:576:59","text":" validate signature of a single userOp\n This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n @param userOp the userOperation received from the user.\n @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n (usually empty, unless account and aggregator support some kind of \"multisig\""},"functionSelector":"64c530cd","id":10592,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"1005:23:59","nodeType":"FunctionDefinition","parameters":{"id":10588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10587,"mutability":"mutable","name":"userOp","nameLocation":"1052:6:59","nodeType":"VariableDeclaration","scope":10592,"src":"1029:29:59","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10586,"nodeType":"UserDefinedTypeName","pathNode":{"id":10585,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1029:13:59"},"referencedDeclaration":10993,"src":"1029:13:59","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1028:31:59"},"returnParameters":{"id":10591,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10590,"mutability":"mutable","name":"sigForUserOp","nameLocation":"1100:12:59","nodeType":"VariableDeclaration","scope":10592,"src":"1087:25:59","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10589,"name":"bytes","nodeType":"ElementaryTypeName","src":"1087:5:59","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1086:27:59"},"scope":10603,"src":"996:118:59","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10593,"nodeType":"StructuredDocumentation","src":"1120:368:59","text":" aggregate multiple signatures into a single value.\n This method is called off-chain to calculate the signature to pass with handleOps()\n bundler MAY use optimized custom code perform this aggregation\n @param userOps array of UserOperations to collect the signatures from.\n @return aggregatedSignature the aggregated signature"},"functionSelector":"275e2d79","id":10602,"implemented":false,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"1502:19:59","nodeType":"FunctionDefinition","parameters":{"id":10598,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10597,"mutability":"mutable","name":"userOps","nameLocation":"1547:7:59","nodeType":"VariableDeclaration","scope":10602,"src":"1522:32:59","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":10595,"nodeType":"UserDefinedTypeName","pathNode":{"id":10594,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1522:13:59"},"referencedDeclaration":10993,"src":"1522:13:59","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":10596,"nodeType":"ArrayTypeName","src":"1522:15:59","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"1521:34:59"},"returnParameters":{"id":10601,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10600,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"1592:19:59","nodeType":"VariableDeclaration","scope":10602,"src":"1579:32:59","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10599,"name":"bytes","nodeType":"ElementaryTypeName","src":"1579:5:59","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1578:34:59"},"scope":10603,"src":"1493:120:59","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":10604,"src":"137:1478:59","usedErrors":[]}],"src":"36:1580:59"},"id":59},"contracts/interfaces/IEntryPoint.sol":{"ast":{"absolutePath":"contracts/interfaces/IEntryPoint.sol","exportedSymbols":{"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":10808,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10605,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:60"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":10606,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10808,"sourceUnit":11164,"src":"311:29:60","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"./IStakeManager.sol","id":10607,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10808,"sourceUnit":10967,"src":"341:29:60","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"./IAggregator.sol","id":10608,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10808,"sourceUnit":10604,"src":"371:27:60","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/INonceManager.sol","file":"./INonceManager.sol","id":10609,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10808,"sourceUnit":10827,"src":"399:29:60","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":10610,"name":"IStakeManager","nodeType":"IdentifierPath","referencedDeclaration":10966,"src":"455:13:60"},"id":10611,"nodeType":"InheritanceSpecifier","src":"455:13:60"},{"baseName":{"id":10612,"name":"INonceManager","nodeType":"IdentifierPath","referencedDeclaration":10826,"src":"470:13:60"},"id":10613,"nodeType":"InheritanceSpecifier","src":"470:13:60"}],"canonicalName":"IEntryPoint","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":10807,"linearizedBaseContracts":[10807,10826,10966],"name":"IEntryPoint","nameLocation":"440:11:60","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","id":10629,"name":"UserOperationEvent","nameLocation":"1191:18:60","nodeType":"EventDefinition","parameters":{"id":10628,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10615,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1226:10:60","nodeType":"VariableDeclaration","scope":10629,"src":"1210:26:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10614,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1210:7:60","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10617,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1254:6:60","nodeType":"VariableDeclaration","scope":10629,"src":"1238:22:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10616,"name":"address","nodeType":"ElementaryTypeName","src":"1238:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10619,"indexed":true,"mutability":"mutable","name":"paymaster","nameLocation":"1278:9:60","nodeType":"VariableDeclaration","scope":10629,"src":"1262:25:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10618,"name":"address","nodeType":"ElementaryTypeName","src":"1262:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10621,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"1297:5:60","nodeType":"VariableDeclaration","scope":10629,"src":"1289:13:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10620,"name":"uint256","nodeType":"ElementaryTypeName","src":"1289:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10623,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"1309:7:60","nodeType":"VariableDeclaration","scope":10629,"src":"1304:12:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10622,"name":"bool","nodeType":"ElementaryTypeName","src":"1304:4:60","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10625,"indexed":false,"mutability":"mutable","name":"actualGasCost","nameLocation":"1326:13:60","nodeType":"VariableDeclaration","scope":10629,"src":"1318:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10624,"name":"uint256","nodeType":"ElementaryTypeName","src":"1318:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10627,"indexed":false,"mutability":"mutable","name":"actualGasUsed","nameLocation":"1349:13:60","nodeType":"VariableDeclaration","scope":10629,"src":"1341:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10626,"name":"uint256","nodeType":"ElementaryTypeName","src":"1341:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1209:154:60"},"src":"1185:179:60"},{"anonymous":false,"documentation":{"id":10630,"nodeType":"StructuredDocumentation","src":"1370:333:60","text":" account \"sender\" was deployed.\n @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n @param sender the account that is deployed\n @param factory the factory used to deploy this account (in the initCode)\n @param paymaster the paymaster used by this UserOp"},"eventSelector":"d51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d","id":10640,"name":"AccountDeployed","nameLocation":"1714:15:60","nodeType":"EventDefinition","parameters":{"id":10639,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10632,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1746:10:60","nodeType":"VariableDeclaration","scope":10640,"src":"1730:26:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10631,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1730:7:60","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10634,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1774:6:60","nodeType":"VariableDeclaration","scope":10640,"src":"1758:22:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10633,"name":"address","nodeType":"ElementaryTypeName","src":"1758:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10636,"indexed":false,"mutability":"mutable","name":"factory","nameLocation":"1790:7:60","nodeType":"VariableDeclaration","scope":10640,"src":"1782:15:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10635,"name":"address","nodeType":"ElementaryTypeName","src":"1782:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10638,"indexed":false,"mutability":"mutable","name":"paymaster","nameLocation":"1807:9:60","nodeType":"VariableDeclaration","scope":10640,"src":"1799:17:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10637,"name":"address","nodeType":"ElementaryTypeName","src":"1799:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1729:88:60"},"src":"1708:110:60"},{"anonymous":false,"documentation":{"id":10641,"nodeType":"StructuredDocumentation","src":"1824:337:60","text":" An event emitted if the UserOperation \"callData\" reverted with non-zero length\n @param userOpHash the request unique identifier.\n @param sender the sender of this request\n @param nonce the nonce used in the request\n @param revertReason - the return bytes from the (reverted) call to \"callData\"."},"eventSelector":"1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201","id":10651,"name":"UserOperationRevertReason","nameLocation":"2172:25:60","nodeType":"EventDefinition","parameters":{"id":10650,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10643,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"2214:10:60","nodeType":"VariableDeclaration","scope":10651,"src":"2198:26:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10642,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2198:7:60","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10645,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"2242:6:60","nodeType":"VariableDeclaration","scope":10651,"src":"2226:22:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10644,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10647,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"2258:5:60","nodeType":"VariableDeclaration","scope":10651,"src":"2250:13:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10646,"name":"uint256","nodeType":"ElementaryTypeName","src":"2250:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10649,"indexed":false,"mutability":"mutable","name":"revertReason","nameLocation":"2271:12:60","nodeType":"VariableDeclaration","scope":10651,"src":"2265:18:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10648,"name":"bytes","nodeType":"ElementaryTypeName","src":"2265:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2197:87:60"},"src":"2166:119:60"},{"anonymous":false,"documentation":{"id":10652,"nodeType":"StructuredDocumentation","src":"2291:158:60","text":" an event emitted by handleOps(), before starting the execution loop.\n any event emitted before this event, is part of the validation."},"eventSelector":"bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972","id":10654,"name":"BeforeExecution","nameLocation":"2460:15:60","nodeType":"EventDefinition","parameters":{"id":10653,"nodeType":"ParameterList","parameters":[],"src":"2475:2:60"},"src":"2454:24:60"},{"anonymous":false,"documentation":{"id":10655,"nodeType":"StructuredDocumentation","src":"2484:101:60","text":" signature aggregator used by the following UserOperationEvents within this bundle."},"eventSelector":"575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d","id":10659,"name":"SignatureAggregatorChanged","nameLocation":"2596:26:60","nodeType":"EventDefinition","parameters":{"id":10658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10657,"indexed":true,"mutability":"mutable","name":"aggregator","nameLocation":"2639:10:60","nodeType":"VariableDeclaration","scope":10659,"src":"2623:26:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10656,"name":"address","nodeType":"ElementaryTypeName","src":"2623:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2622:28:60"},"src":"2590:61:60"},{"documentation":{"id":10660,"nodeType":"StructuredDocumentation","src":"2657:756:60","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":10666,"name":"FailedOp","nameLocation":"3424:8:60","nodeType":"ErrorDefinition","parameters":{"id":10665,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10662,"mutability":"mutable","name":"opIndex","nameLocation":"3441:7:60","nodeType":"VariableDeclaration","scope":10666,"src":"3433:15:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10661,"name":"uint256","nodeType":"ElementaryTypeName","src":"3433:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10664,"mutability":"mutable","name":"reason","nameLocation":"3457:6:60","nodeType":"VariableDeclaration","scope":10666,"src":"3450:13:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":10663,"name":"string","nodeType":"ElementaryTypeName","src":"3450:6:60","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3432:32:60"},"src":"3418:47:60"},{"documentation":{"id":10667,"nodeType":"StructuredDocumentation","src":"3471:114:60","text":" error case when a signature aggregator fails to verify the aggregated signature it had created."},"errorSelector":"86a9f750","id":10671,"name":"SignatureValidationFailed","nameLocation":"3596:25:60","nodeType":"ErrorDefinition","parameters":{"id":10670,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10669,"mutability":"mutable","name":"aggregator","nameLocation":"3630:10:60","nodeType":"VariableDeclaration","scope":10671,"src":"3622:18:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10668,"name":"address","nodeType":"ElementaryTypeName","src":"3622:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3621:20:60"},"src":"3590:52:60"},{"documentation":{"id":10672,"nodeType":"StructuredDocumentation","src":"3648:327:60","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":10686,"name":"ValidationResult","nameLocation":"3986:16:60","nodeType":"ErrorDefinition","parameters":{"id":10685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10675,"mutability":"mutable","name":"returnInfo","nameLocation":"4014:10:60","nodeType":"VariableDeclaration","scope":10686,"src":"4003:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":10674,"nodeType":"UserDefinedTypeName","pathNode":{"id":10673,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":10783,"src":"4003:10:60"},"referencedDeclaration":10783,"src":"4003:10:60","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":10678,"mutability":"mutable","name":"senderInfo","nameLocation":"4044:10:60","nodeType":"VariableDeclaration","scope":10686,"src":"4034:20:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10677,"nodeType":"UserDefinedTypeName","pathNode":{"id":10676,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4034:9:60"},"referencedDeclaration":10918,"src":"4034:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":10681,"mutability":"mutable","name":"factoryInfo","nameLocation":"4066:11:60","nodeType":"VariableDeclaration","scope":10686,"src":"4056:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10680,"nodeType":"UserDefinedTypeName","pathNode":{"id":10679,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4056:9:60"},"referencedDeclaration":10918,"src":"4056:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":10684,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4089:13:60","nodeType":"VariableDeclaration","scope":10686,"src":"4079:23:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10683,"nodeType":"UserDefinedTypeName","pathNode":{"id":10682,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4079:9:60"},"referencedDeclaration":10918,"src":"4079:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"4002:101:60"},"src":"3980:124:60"},{"documentation":{"id":10687,"nodeType":"StructuredDocumentation","src":"4110:561:60","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":10704,"name":"ValidationResultWithAggregation","nameLocation":"4682:31:60","nodeType":"ErrorDefinition","parameters":{"id":10703,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10690,"mutability":"mutable","name":"returnInfo","nameLocation":"4725:10:60","nodeType":"VariableDeclaration","scope":10704,"src":"4714:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":10689,"nodeType":"UserDefinedTypeName","pathNode":{"id":10688,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":10783,"src":"4714:10:60"},"referencedDeclaration":10783,"src":"4714:10:60","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$10783_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":10693,"mutability":"mutable","name":"senderInfo","nameLocation":"4755:10:60","nodeType":"VariableDeclaration","scope":10704,"src":"4745:20:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10692,"nodeType":"UserDefinedTypeName","pathNode":{"id":10691,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4745:9:60"},"referencedDeclaration":10918,"src":"4745:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":10696,"mutability":"mutable","name":"factoryInfo","nameLocation":"4777:11:60","nodeType":"VariableDeclaration","scope":10704,"src":"4767:21:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10695,"nodeType":"UserDefinedTypeName","pathNode":{"id":10694,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4767:9:60"},"referencedDeclaration":10918,"src":"4767:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":10699,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4800:13:60","nodeType":"VariableDeclaration","scope":10704,"src":"4790:23:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10698,"nodeType":"UserDefinedTypeName","pathNode":{"id":10697,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"4790:9:60"},"referencedDeclaration":10918,"src":"4790:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":10702,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"4843:14:60","nodeType":"VariableDeclaration","scope":10704,"src":"4823:34:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":10701,"nodeType":"UserDefinedTypeName","pathNode":{"id":10700,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10789,"src":"4823:19:60"},"referencedDeclaration":10789,"src":"4823:19:60","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$10789_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"4713:145:60"},"src":"4676:183:60"},{"documentation":{"id":10705,"nodeType":"StructuredDocumentation","src":"4865:51:60","text":" return value of getSenderAddress"},"errorSelector":"6ca7b806","id":10709,"name":"SenderAddressResult","nameLocation":"4927:19:60","nodeType":"ErrorDefinition","parameters":{"id":10708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10707,"mutability":"mutable","name":"sender","nameLocation":"4955:6:60","nodeType":"VariableDeclaration","scope":10709,"src":"4947:14:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10706,"name":"address","nodeType":"ElementaryTypeName","src":"4947:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4946:16:60"},"src":"4921:42:60"},{"documentation":{"id":10710,"nodeType":"StructuredDocumentation","src":"4969:51:60","text":" return value of simulateHandleOp"},"errorSelector":"8b7ac980","id":10724,"name":"ExecutionResult","nameLocation":"5031:15:60","nodeType":"ErrorDefinition","parameters":{"id":10723,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10712,"mutability":"mutable","name":"preOpGas","nameLocation":"5055:8:60","nodeType":"VariableDeclaration","scope":10724,"src":"5047:16:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10711,"name":"uint256","nodeType":"ElementaryTypeName","src":"5047:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10714,"mutability":"mutable","name":"paid","nameLocation":"5073:4:60","nodeType":"VariableDeclaration","scope":10724,"src":"5065:12:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10713,"name":"uint256","nodeType":"ElementaryTypeName","src":"5065:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10716,"mutability":"mutable","name":"validAfter","nameLocation":"5086:10:60","nodeType":"VariableDeclaration","scope":10724,"src":"5079:17:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10715,"name":"uint48","nodeType":"ElementaryTypeName","src":"5079:6:60","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":10718,"mutability":"mutable","name":"validUntil","nameLocation":"5105:10:60","nodeType":"VariableDeclaration","scope":10724,"src":"5098:17:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10717,"name":"uint48","nodeType":"ElementaryTypeName","src":"5098:6:60","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":10720,"mutability":"mutable","name":"targetSuccess","nameLocation":"5122:13:60","nodeType":"VariableDeclaration","scope":10724,"src":"5117:18:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10719,"name":"bool","nodeType":"ElementaryTypeName","src":"5117:4:60","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10722,"mutability":"mutable","name":"targetResult","nameLocation":"5143:12:60","nodeType":"VariableDeclaration","scope":10724,"src":"5137:18:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10721,"name":"bytes","nodeType":"ElementaryTypeName","src":"5137:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5046:110:60"},"src":"5025:132:60"},{"canonicalName":"IEntryPoint.UserOpsPerAggregator","id":10734,"members":[{"constant":false,"id":10728,"mutability":"mutable","name":"userOps","nameLocation":"5255:7:60","nodeType":"VariableDeclaration","scope":10734,"src":"5239:23:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":10726,"nodeType":"UserDefinedTypeName","pathNode":{"id":10725,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5239:13:60"},"referencedDeclaration":10993,"src":"5239:13:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":10727,"nodeType":"ArrayTypeName","src":"5239:15:60","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":10731,"mutability":"mutable","name":"aggregator","nameLocation":"5315:10:60","nodeType":"VariableDeclaration","scope":10734,"src":"5303:22:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"},"typeName":{"id":10730,"nodeType":"UserDefinedTypeName","pathNode":{"id":10729,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":10603,"src":"5303:11:60"},"referencedDeclaration":10603,"src":"5303:11:60","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$10603","typeString":"contract IAggregator"}},"visibility":"internal"},{"constant":false,"id":10733,"mutability":"mutable","name":"signature","nameLocation":"5373:9:60","nodeType":"VariableDeclaration","scope":10734,"src":"5367:15:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10732,"name":"bytes","nodeType":"ElementaryTypeName","src":"5367:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOpsPerAggregator","nameLocation":"5208:20:60","nodeType":"StructDefinition","scope":10807,"src":"5201:188:60","visibility":"public"},{"documentation":{"id":10735,"nodeType":"StructuredDocumentation","src":"5395:368:60","text":" Execute a batch of UserOperation.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":10744,"implemented":false,"kind":"function","modifiers":[],"name":"handleOps","nameLocation":"5777:9:60","nodeType":"FunctionDefinition","parameters":{"id":10742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10739,"mutability":"mutable","name":"ops","nameLocation":"5812:3:60","nodeType":"VariableDeclaration","scope":10744,"src":"5787:28:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":10737,"nodeType":"UserDefinedTypeName","pathNode":{"id":10736,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5787:13:60"},"referencedDeclaration":10993,"src":"5787:13:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":10738,"nodeType":"ArrayTypeName","src":"5787:15:60","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":10741,"mutability":"mutable","name":"beneficiary","nameLocation":"5833:11:60","nodeType":"VariableDeclaration","scope":10744,"src":"5817:27:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10740,"name":"address","nodeType":"ElementaryTypeName","src":"5817:15:60","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"5786:59:60"},"returnParameters":{"id":10743,"nodeType":"ParameterList","parameters":[],"src":"5854:0:60"},"scope":10807,"src":"5768:87:60","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10745,"nodeType":"StructuredDocumentation","src":"5861:249:60","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":10754,"implemented":false,"kind":"function","modifiers":[],"name":"handleAggregatedOps","nameLocation":"6124:19:60","nodeType":"FunctionDefinition","parameters":{"id":10752,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10749,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"6185:16:60","nodeType":"VariableDeclaration","scope":10754,"src":"6153:48:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":10747,"nodeType":"UserDefinedTypeName","pathNode":{"id":10746,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":10734,"src":"6153:20:60"},"referencedDeclaration":10734,"src":"6153:20:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$10734_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":10748,"nodeType":"ArrayTypeName","src":"6153:22:60","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$10734_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":10751,"mutability":"mutable","name":"beneficiary","nameLocation":"6227:11:60","nodeType":"VariableDeclaration","scope":10754,"src":"6211:27:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10750,"name":"address","nodeType":"ElementaryTypeName","src":"6211:15:60","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"6143:101:60"},"returnParameters":{"id":10753,"nodeType":"ParameterList","parameters":[],"src":"6253:0:60"},"scope":10807,"src":"6115:139:60","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10755,"nodeType":"StructuredDocumentation","src":"6260:197:60","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":10763,"implemented":false,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"6471:13:60","nodeType":"FunctionDefinition","parameters":{"id":10759,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10758,"mutability":"mutable","name":"userOp","nameLocation":"6508:6:60","nodeType":"VariableDeclaration","scope":10763,"src":"6485:29:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10757,"nodeType":"UserDefinedTypeName","pathNode":{"id":10756,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"6485:13:60"},"referencedDeclaration":10993,"src":"6485:13:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6484:31:60"},"returnParameters":{"id":10762,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10761,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10763,"src":"6539:7:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10760,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6539:7:60","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6538:9:60"},"scope":10807,"src":"6462:86:60","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10764,"nodeType":"StructuredDocumentation","src":"6554:398:60","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":10770,"implemented":false,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"6966:18:60","nodeType":"FunctionDefinition","parameters":{"id":10768,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10767,"mutability":"mutable","name":"userOp","nameLocation":"7008:6:60","nodeType":"VariableDeclaration","scope":10770,"src":"6985:29:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10766,"nodeType":"UserDefinedTypeName","pathNode":{"id":10765,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"6985:13:60"},"referencedDeclaration":10993,"src":"6985:13:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6984:31:60"},"returnParameters":{"id":10769,"nodeType":"ParameterList","parameters":[],"src":"7024:0:60"},"scope":10807,"src":"6957:68:60","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"IEntryPoint.ReturnInfo","id":10783,"members":[{"constant":false,"id":10772,"mutability":"mutable","name":"preOpGas","nameLocation":"7660:8:60","nodeType":"VariableDeclaration","scope":10783,"src":"7652:16:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10771,"name":"uint256","nodeType":"ElementaryTypeName","src":"7652:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10774,"mutability":"mutable","name":"prefund","nameLocation":"7686:7:60","nodeType":"VariableDeclaration","scope":10783,"src":"7678:15:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10773,"name":"uint256","nodeType":"ElementaryTypeName","src":"7678:7:60","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10776,"mutability":"mutable","name":"sigFailed","nameLocation":"7708:9:60","nodeType":"VariableDeclaration","scope":10783,"src":"7703:14:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10775,"name":"bool","nodeType":"ElementaryTypeName","src":"7703:4:60","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10778,"mutability":"mutable","name":"validAfter","nameLocation":"7734:10:60","nodeType":"VariableDeclaration","scope":10783,"src":"7727:17:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10777,"name":"uint48","nodeType":"ElementaryTypeName","src":"7727:6:60","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":10780,"mutability":"mutable","name":"validUntil","nameLocation":"7761:10:60","nodeType":"VariableDeclaration","scope":10783,"src":"7754:17:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10779,"name":"uint48","nodeType":"ElementaryTypeName","src":"7754:6:60","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":10782,"mutability":"mutable","name":"paymasterContext","nameLocation":"7787:16:60","nodeType":"VariableDeclaration","scope":10783,"src":"7781:22:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10781,"name":"bytes","nodeType":"ElementaryTypeName","src":"7781:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"7631:10:60","nodeType":"StructDefinition","scope":10807,"src":"7624:186:60","visibility":"public"},{"canonicalName":"IEntryPoint.AggregatorStakeInfo","id":10789,"members":[{"constant":false,"id":10785,"mutability":"mutable","name":"aggregator","nameLocation":"7990:10:60","nodeType":"VariableDeclaration","scope":10789,"src":"7982:18:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10784,"name":"address","nodeType":"ElementaryTypeName","src":"7982:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10788,"mutability":"mutable","name":"stakeInfo","nameLocation":"8020:9:60","nodeType":"VariableDeclaration","scope":10789,"src":"8010:19:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":10787,"nodeType":"UserDefinedTypeName","pathNode":{"id":10786,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":10918,"src":"8010:9:60"},"referencedDeclaration":10918,"src":"8010:9:60","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$10918_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"7952:19:60","nodeType":"StructDefinition","scope":10807,"src":"7945:91:60","visibility":"public"},{"documentation":{"id":10790,"nodeType":"StructuredDocumentation","src":"8042:337:60","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":10795,"implemented":false,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"8393:16:60","nodeType":"FunctionDefinition","parameters":{"id":10793,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10792,"mutability":"mutable","name":"initCode","nameLocation":"8423:8:60","nodeType":"VariableDeclaration","scope":10795,"src":"8410:21:60","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10791,"name":"bytes","nodeType":"ElementaryTypeName","src":"8410:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8409:23:60"},"returnParameters":{"id":10794,"nodeType":"ParameterList","parameters":[],"src":"8441:0:60"},"scope":10807,"src":"8384:58:60","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10796,"nodeType":"StructuredDocumentation","src":"8449:847:60","text":" simulate full execution of a UserOperation (including both validation and target execution)\n this method will always revert with \"ExecutionResult\".\n it performs full validation of the UserOperation, but ignores signature error.\n an optional target address is called after the userop succeeds, and its value is returned\n (before the entire call is reverted)\n Note that in order to collect the the success/failure of the target call, it must be executed\n with trace enabled to track the emitted events.\n @param op the UserOperation to simulate\n @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n are set to the return from that call.\n @param targetCallData callData to pass to target address"},"functionSelector":"d6383f94","id":10806,"implemented":false,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"9310:16:60","nodeType":"FunctionDefinition","parameters":{"id":10804,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10799,"mutability":"mutable","name":"op","nameLocation":"9350:2:60","nodeType":"VariableDeclaration","scope":10806,"src":"9327:25:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10798,"nodeType":"UserDefinedTypeName","pathNode":{"id":10797,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"9327:13:60"},"referencedDeclaration":10993,"src":"9327:13:60","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":10801,"mutability":"mutable","name":"target","nameLocation":"9362:6:60","nodeType":"VariableDeclaration","scope":10806,"src":"9354:14:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10800,"name":"address","nodeType":"ElementaryTypeName","src":"9354:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10803,"mutability":"mutable","name":"targetCallData","nameLocation":"9385:14:60","nodeType":"VariableDeclaration","scope":10806,"src":"9370:29:60","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":10802,"name":"bytes","nodeType":"ElementaryTypeName","src":"9370:5:60","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9326:74:60"},"returnParameters":{"id":10805,"nodeType":"ParameterList","parameters":[],"src":"9409:0:60"},"scope":10807,"src":"9301:109:60","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10808,"src":"430:8982:60","usedErrors":[10666,10671,10686,10704,10709,10724]}],"src":"163:9251:60"},"id":60},"contracts/interfaces/INonceManager.sol":{"ast":{"absolutePath":"contracts/interfaces/INonceManager.sol","exportedSymbols":{"INonceManager":[10826]},"id":10827,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10809,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:61"},{"abstract":false,"baseContracts":[],"canonicalName":"INonceManager","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":10826,"linearizedBaseContracts":[10826],"name":"INonceManager","nameLocation":"72:13:61","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":10810,"nodeType":"StructuredDocumentation","src":"93:416:61","text":" Return the next nonce for this sender.\n Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n But UserOp with different keys can come with arbitrary order.\n @param sender the account address\n @param key the high 192 bit of the nonce\n @return nonce a full nonce to pass for next UserOp with this sender."},"functionSelector":"35567e1a","id":10819,"implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"523:8:61","nodeType":"FunctionDefinition","parameters":{"id":10815,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10812,"mutability":"mutable","name":"sender","nameLocation":"540:6:61","nodeType":"VariableDeclaration","scope":10819,"src":"532:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10811,"name":"address","nodeType":"ElementaryTypeName","src":"532:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10814,"mutability":"mutable","name":"key","nameLocation":"556:3:61","nodeType":"VariableDeclaration","scope":10819,"src":"548:11:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":10813,"name":"uint192","nodeType":"ElementaryTypeName","src":"548:7:61","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"531:29:61"},"returnParameters":{"id":10818,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10817,"mutability":"mutable","name":"nonce","nameLocation":"596:5:61","nodeType":"VariableDeclaration","scope":10819,"src":"588:13:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10816,"name":"uint256","nodeType":"ElementaryTypeName","src":"588:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"587:15:61"},"scope":10826,"src":"514:89:61","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10820,"nodeType":"StructuredDocumentation","src":"609:449:61","text":" Manually increment the nonce of the sender.\n This method is exposed just for completeness..\n Account does NOT need to call it, neither during validation, nor elsewhere,\n as the EntryPoint will update the nonce regardless.\n Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n UserOperations will not pay extra for the first transaction with a given key."},"functionSelector":"0bd28e3b","id":10825,"implemented":false,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"1072:14:61","nodeType":"FunctionDefinition","parameters":{"id":10823,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10822,"mutability":"mutable","name":"key","nameLocation":"1095:3:61","nodeType":"VariableDeclaration","scope":10825,"src":"1087:11:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":10821,"name":"uint192","nodeType":"ElementaryTypeName","src":"1087:7:61","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"1086:13:61"},"returnParameters":{"id":10824,"nodeType":"ParameterList","parameters":[],"src":"1108:0:61"},"scope":10826,"src":"1063:46:61","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10827,"src":"62:1049:61","usedErrors":[]}],"src":"36:1076:61"},"id":61},"contracts/interfaces/IPaymaster.sol":{"ast":{"absolutePath":"contracts/interfaces/IPaymaster.sol","exportedSymbols":{"IPaymaster":[10861],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":10862,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10828,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:62"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":10829,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":10862,"sourceUnit":11164,"src":"62:29:62","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IPaymaster","contractDependencies":[],"contractKind":"interface","documentation":{"id":10830,"nodeType":"StructuredDocumentation","src":"93:216:62","text":" the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction."},"fullyImplemented":false,"id":10861,"linearizedBaseContracts":[10861],"name":"IPaymaster","nameLocation":"320:10:62","nodeType":"ContractDefinition","nodes":[{"canonicalName":"IPaymaster.PostOpMode","id":10834,"members":[{"id":10831,"name":"opSucceeded","nameLocation":"364:11:62","nodeType":"EnumValue","src":"364:11:62"},{"id":10832,"name":"opReverted","nameLocation":"406:10:62","nodeType":"EnumValue","src":"406:10:62"},{"id":10833,"name":"postOpReverted","nameLocation":"473:14:62","nodeType":"EnumValue","src":"473:14:62"}],"name":"PostOpMode","nameLocation":"343:10:62","nodeType":"EnumDefinition","src":"338:269:62"},{"documentation":{"id":10835,"nodeType":"StructuredDocumentation","src":"613:1254:62","text":" payment validation: check if paymaster agrees to pay.\n Must verify sender is the entryPoint.\n Revert to reject this request.\n Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n @param userOp the user operation\n @param userOpHash hash of the user's request data.\n @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n @return context value to send to a postOp\n zero length to signify postOp is not required.\n @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n otherwise, an address of an \"authorizer\" contract.\n <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n <6-byte> validAfter - first timestamp this operation is valid\n Note that the validation code cannot use block.timestamp (or block.number) directly."},"functionSelector":"f465c77e","id":10849,"implemented":false,"kind":"function","modifiers":[],"name":"validatePaymasterUserOp","nameLocation":"1881:23:62","nodeType":"FunctionDefinition","parameters":{"id":10843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10838,"mutability":"mutable","name":"userOp","nameLocation":"1928:6:62","nodeType":"VariableDeclaration","scope":10849,"src":"1905:29:62","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10837,"nodeType":"UserDefinedTypeName","pathNode":{"id":10836,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1905:13:62"},"referencedDeclaration":10993,"src":"1905:13:62","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":10840,"mutability":"mutable","name":"userOpHash","nameLocation":"1944:10:62","nodeType":"VariableDeclaration","scope":10849,"src":"1936:18:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10839,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1936:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10842,"mutability":"mutable","name":"maxCost","nameLocation":"1964:7:62","nodeType":"VariableDeclaration","scope":10849,"src":"1956:15:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10841,"name":"uint256","nodeType":"ElementaryTypeName","src":"1956:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1904:68:62"},"returnParameters":{"id":10848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10845,"mutability":"mutable","name":"context","nameLocation":"2008:7:62","nodeType":"VariableDeclaration","scope":10849,"src":"1995:20:62","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10844,"name":"bytes","nodeType":"ElementaryTypeName","src":"1995:5:62","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":10847,"mutability":"mutable","name":"validationData","nameLocation":"2025:14:62","nodeType":"VariableDeclaration","scope":10849,"src":"2017:22:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10846,"name":"uint256","nodeType":"ElementaryTypeName","src":"2017:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1994:46:62"},"scope":10861,"src":"1872:169:62","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10850,"nodeType":"StructuredDocumentation","src":"2047:616:62","text":" post-operation handler.\n Must verify sender is the entryPoint\n @param mode enum with the following options:\n opSucceeded - user operation succeeded.\n opReverted - user op reverted. still has to pay for gas.\n postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n Now this is the 2nd call, after user's op was deliberately reverted.\n @param context - the context value returned by validatePaymasterUserOp\n @param actualGasCost - actual gas used so far (without this postOp call)."},"functionSelector":"a9a23409","id":10860,"implemented":false,"kind":"function","modifiers":[],"name":"postOp","nameLocation":"2677:6:62","nodeType":"FunctionDefinition","parameters":{"id":10858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10853,"mutability":"mutable","name":"mode","nameLocation":"2695:4:62","nodeType":"VariableDeclaration","scope":10860,"src":"2684:15:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":10852,"nodeType":"UserDefinedTypeName","pathNode":{"id":10851,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"2684:10:62"},"referencedDeclaration":10834,"src":"2684:10:62","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":10855,"mutability":"mutable","name":"context","nameLocation":"2716:7:62","nodeType":"VariableDeclaration","scope":10860,"src":"2701:22:62","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":10854,"name":"bytes","nodeType":"ElementaryTypeName","src":"2701:5:62","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":10857,"mutability":"mutable","name":"actualGasCost","nameLocation":"2733:13:62","nodeType":"VariableDeclaration","scope":10860,"src":"2725:21:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10856,"name":"uint256","nodeType":"ElementaryTypeName","src":"2725:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2683:64:62"},"returnParameters":{"id":10859,"nodeType":"ParameterList","parameters":[],"src":"2756:0:62"},"scope":10861,"src":"2668:89:62","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10862,"src":"310:2449:62","usedErrors":[]}],"src":"36:2724:62"},"id":62},"contracts/interfaces/IStakeManager.sol":{"ast":{"absolutePath":"contracts/interfaces/IStakeManager.sol","exportedSymbols":{"IStakeManager":[10966]},"id":10967,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":10863,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:63"},{"abstract":false,"baseContracts":[],"canonicalName":"IStakeManager","contractDependencies":[],"contractKind":"interface","documentation":{"id":10864,"nodeType":"StructuredDocumentation","src":"67:211:63","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by the staked entity."},"fullyImplemented":false,"id":10966,"linearizedBaseContracts":[10966],"name":"IStakeManager","nameLocation":"289:13:63","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4","id":10870,"name":"Deposited","nameLocation":"316:9:63","nodeType":"EventDefinition","parameters":{"id":10869,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10866,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"351:7:63","nodeType":"VariableDeclaration","scope":10870,"src":"335:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10865,"name":"address","nodeType":"ElementaryTypeName","src":"335:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10868,"indexed":false,"mutability":"mutable","name":"totalDeposit","nameLocation":"376:12:63","nodeType":"VariableDeclaration","scope":10870,"src":"368:20:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10867,"name":"uint256","nodeType":"ElementaryTypeName","src":"368:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"325:69:63"},"src":"310:85:63"},{"anonymous":false,"eventSelector":"d1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb","id":10878,"name":"Withdrawn","nameLocation":"407:9:63","nodeType":"EventDefinition","parameters":{"id":10877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10872,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"442:7:63","nodeType":"VariableDeclaration","scope":10878,"src":"426:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10871,"name":"address","nodeType":"ElementaryTypeName","src":"426:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10874,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"467:15:63","nodeType":"VariableDeclaration","scope":10878,"src":"459:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10873,"name":"address","nodeType":"ElementaryTypeName","src":"459:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10876,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"500:6:63","nodeType":"VariableDeclaration","scope":10878,"src":"492:14:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10875,"name":"uint256","nodeType":"ElementaryTypeName","src":"492:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"416:96:63"},"src":"401:112:63"},{"anonymous":false,"documentation":{"id":10879,"nodeType":"StructuredDocumentation","src":"519:52:63","text":"Emitted when stake or unstake delay are modified"},"eventSelector":"a5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01","id":10887,"name":"StakeLocked","nameLocation":"582:11:63","nodeType":"EventDefinition","parameters":{"id":10886,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10881,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"619:7:63","nodeType":"VariableDeclaration","scope":10887,"src":"603:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10880,"name":"address","nodeType":"ElementaryTypeName","src":"603:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10883,"indexed":false,"mutability":"mutable","name":"totalStaked","nameLocation":"644:11:63","nodeType":"VariableDeclaration","scope":10887,"src":"636:19:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10882,"name":"uint256","nodeType":"ElementaryTypeName","src":"636:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10885,"indexed":false,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"673:15:63","nodeType":"VariableDeclaration","scope":10887,"src":"665:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10884,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"593:101:63"},"src":"576:119:63"},{"anonymous":false,"documentation":{"id":10888,"nodeType":"StructuredDocumentation","src":"701:52:63","text":"Emitted once a stake is scheduled for withdrawal"},"eventSelector":"fa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a","id":10894,"name":"StakeUnlocked","nameLocation":"764:13:63","nodeType":"EventDefinition","parameters":{"id":10893,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10890,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"803:7:63","nodeType":"VariableDeclaration","scope":10894,"src":"787:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10889,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10892,"indexed":false,"mutability":"mutable","name":"withdrawTime","nameLocation":"828:12:63","nodeType":"VariableDeclaration","scope":10894,"src":"820:20:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10891,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"777:69:63"},"src":"758:89:63"},{"anonymous":false,"eventSelector":"b7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3","id":10902,"name":"StakeWithdrawn","nameLocation":"859:14:63","nodeType":"EventDefinition","parameters":{"id":10901,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10896,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"899:7:63","nodeType":"VariableDeclaration","scope":10902,"src":"883:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10895,"name":"address","nodeType":"ElementaryTypeName","src":"883:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10898,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"924:15:63","nodeType":"VariableDeclaration","scope":10902,"src":"916:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10897,"name":"address","nodeType":"ElementaryTypeName","src":"916:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10900,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"957:6:63","nodeType":"VariableDeclaration","scope":10902,"src":"949:14:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10899,"name":"uint256","nodeType":"ElementaryTypeName","src":"949:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"873:96:63"},"src":"853:117:63"},{"canonicalName":"IStakeManager.DepositInfo","id":10913,"members":[{"constant":false,"id":10904,"mutability":"mutable","name":"deposit","nameLocation":"1650:7:63","nodeType":"VariableDeclaration","scope":10913,"src":"1642:15:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":10903,"name":"uint112","nodeType":"ElementaryTypeName","src":"1642:7:63","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":10906,"mutability":"mutable","name":"staked","nameLocation":"1672:6:63","nodeType":"VariableDeclaration","scope":10913,"src":"1667:11:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10905,"name":"bool","nodeType":"ElementaryTypeName","src":"1667:4:63","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10908,"mutability":"mutable","name":"stake","nameLocation":"1696:5:63","nodeType":"VariableDeclaration","scope":10913,"src":"1688:13:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":10907,"name":"uint112","nodeType":"ElementaryTypeName","src":"1688:7:63","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":10910,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1718:15:63","nodeType":"VariableDeclaration","scope":10913,"src":"1711:22:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":10909,"name":"uint32","nodeType":"ElementaryTypeName","src":"1711:6:63","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":10912,"mutability":"mutable","name":"withdrawTime","nameLocation":"1750:12:63","nodeType":"VariableDeclaration","scope":10913,"src":"1743:19:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":10911,"name":"uint48","nodeType":"ElementaryTypeName","src":"1743:6:63","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"DepositInfo","nameLocation":"1620:11:63","nodeType":"StructDefinition","scope":10966,"src":"1613:156:63","visibility":"public"},{"canonicalName":"IStakeManager.StakeInfo","id":10918,"members":[{"constant":false,"id":10915,"mutability":"mutable","name":"stake","nameLocation":"1871:5:63","nodeType":"VariableDeclaration","scope":10918,"src":"1863:13:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10914,"name":"uint256","nodeType":"ElementaryTypeName","src":"1863:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10917,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1894:15:63","nodeType":"VariableDeclaration","scope":10918,"src":"1886:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10916,"name":"uint256","nodeType":"ElementaryTypeName","src":"1886:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1843:9:63","nodeType":"StructDefinition","scope":10966,"src":"1836:80:63","visibility":"public"},{"documentation":{"id":10919,"nodeType":"StructuredDocumentation","src":"1922:60:63","text":"@return info - full deposit information of given account"},"functionSelector":"5287ce12","id":10927,"implemented":false,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"1996:14:63","nodeType":"FunctionDefinition","parameters":{"id":10922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10921,"mutability":"mutable","name":"account","nameLocation":"2019:7:63","nodeType":"VariableDeclaration","scope":10927,"src":"2011:15:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10920,"name":"address","nodeType":"ElementaryTypeName","src":"2011:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2010:17:63"},"returnParameters":{"id":10926,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10925,"mutability":"mutable","name":"info","nameLocation":"2070:4:63","nodeType":"VariableDeclaration","scope":10927,"src":"2051:23:63","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":10924,"nodeType":"UserDefinedTypeName","pathNode":{"id":10923,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":10913,"src":"2051:11:63"},"referencedDeclaration":10913,"src":"2051:11:63","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$10913_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"2050:25:63"},"scope":10966,"src":"1987:89:63","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10928,"nodeType":"StructuredDocumentation","src":"2082:56:63","text":"@return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":10935,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2152:9:63","nodeType":"FunctionDefinition","parameters":{"id":10931,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10930,"mutability":"mutable","name":"account","nameLocation":"2170:7:63","nodeType":"VariableDeclaration","scope":10935,"src":"2162:15:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10929,"name":"address","nodeType":"ElementaryTypeName","src":"2162:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2161:17:63"},"returnParameters":{"id":10934,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10933,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10935,"src":"2202:7:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10932,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2201:9:63"},"scope":10966,"src":"2143:68:63","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":10936,"nodeType":"StructuredDocumentation","src":"2217:58:63","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":10941,"implemented":false,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"2289:9:63","nodeType":"FunctionDefinition","parameters":{"id":10939,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10938,"mutability":"mutable","name":"account","nameLocation":"2307:7:63","nodeType":"VariableDeclaration","scope":10941,"src":"2299:15:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10937,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:63","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2298:17:63"},"returnParameters":{"id":10940,"nodeType":"ParameterList","parameters":[],"src":"2332:0:63"},"scope":10966,"src":"2280:53:63","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":10942,"nodeType":"StructuredDocumentation","src":"2339:201:63","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":10947,"implemented":false,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2554:8:63","nodeType":"FunctionDefinition","parameters":{"id":10945,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10944,"mutability":"mutable","name":"_unstakeDelaySec","nameLocation":"2570:16:63","nodeType":"VariableDeclaration","scope":10947,"src":"2563:23:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":10943,"name":"uint32","nodeType":"ElementaryTypeName","src":"2563:6:63","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2562:25:63"},"returnParameters":{"id":10946,"nodeType":"ParameterList","parameters":[],"src":"2604:0:63"},"scope":10966,"src":"2545:60:63","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":10948,"nodeType":"StructuredDocumentation","src":"2611:128:63","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":10951,"implemented":false,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2753:11:63","nodeType":"FunctionDefinition","parameters":{"id":10949,"nodeType":"ParameterList","parameters":[],"src":"2764:2:63"},"returnParameters":{"id":10950,"nodeType":"ParameterList","parameters":[],"src":"2775:0:63"},"scope":10966,"src":"2744:32:63","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10952,"nodeType":"StructuredDocumentation","src":"2782:194:63","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":10957,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"2990:13:63","nodeType":"FunctionDefinition","parameters":{"id":10955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10954,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3020:15:63","nodeType":"VariableDeclaration","scope":10957,"src":"3004:31:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10953,"name":"address","nodeType":"ElementaryTypeName","src":"3004:15:63","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3003:33:63"},"returnParameters":{"id":10956,"nodeType":"ParameterList","parameters":[],"src":"3045:0:63"},"scope":10966,"src":"2981:65:63","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":10958,"nodeType":"StructuredDocumentation","src":"3052:165:63","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":10965,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"3231:10:63","nodeType":"FunctionDefinition","parameters":{"id":10963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10960,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3258:15:63","nodeType":"VariableDeclaration","scope":10965,"src":"3242:31:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":10959,"name":"address","nodeType":"ElementaryTypeName","src":"3242:15:63","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":10962,"mutability":"mutable","name":"withdrawAmount","nameLocation":"3283:14:63","nodeType":"VariableDeclaration","scope":10965,"src":"3275:22:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10961,"name":"uint256","nodeType":"ElementaryTypeName","src":"3275:7:63","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3241:57:63"},"returnParameters":{"id":10964,"nodeType":"ParameterList","parameters":[],"src":"3307:0:63"},"scope":10966,"src":"3222:86:63","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":10967,"src":"279:3031:63","usedErrors":[]}],"src":"41:3270:63"},"id":63},"contracts/interfaces/UserOperation.sol":{"ast":{"absolutePath":"contracts/interfaces/UserOperation.sol","exportedSymbols":{"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":11164,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":10968,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:64"},{"absolutePath":"contracts/core/Helpers.sol","file":"../core/Helpers.sol","id":10970,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11164,"sourceUnit":9991,"src":"104:51:64","symbolAliases":[{"foreign":{"id":10969,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9990,"src":"112:14:64","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"canonicalName":"UserOperation","id":10993,"members":[{"constant":false,"id":10972,"mutability":"mutable","name":"sender","nameLocation":"1249:6:64","nodeType":"VariableDeclaration","scope":10993,"src":"1241:14:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10971,"name":"address","nodeType":"ElementaryTypeName","src":"1241:7:64","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10974,"mutability":"mutable","name":"nonce","nameLocation":"1273:5:64","nodeType":"VariableDeclaration","scope":10993,"src":"1265:13:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10973,"name":"uint256","nodeType":"ElementaryTypeName","src":"1265:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10976,"mutability":"mutable","name":"initCode","nameLocation":"1294:8:64","nodeType":"VariableDeclaration","scope":10993,"src":"1288:14:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10975,"name":"bytes","nodeType":"ElementaryTypeName","src":"1288:5:64","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":10978,"mutability":"mutable","name":"callData","nameLocation":"1318:8:64","nodeType":"VariableDeclaration","scope":10993,"src":"1312:14:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10977,"name":"bytes","nodeType":"ElementaryTypeName","src":"1312:5:64","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":10980,"mutability":"mutable","name":"callGasLimit","nameLocation":"1344:12:64","nodeType":"VariableDeclaration","scope":10993,"src":"1336:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10979,"name":"uint256","nodeType":"ElementaryTypeName","src":"1336:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10982,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"1374:20:64","nodeType":"VariableDeclaration","scope":10993,"src":"1366:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10981,"name":"uint256","nodeType":"ElementaryTypeName","src":"1366:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10984,"mutability":"mutable","name":"preVerificationGas","nameLocation":"1412:18:64","nodeType":"VariableDeclaration","scope":10993,"src":"1404:26:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10983,"name":"uint256","nodeType":"ElementaryTypeName","src":"1404:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10986,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"1448:12:64","nodeType":"VariableDeclaration","scope":10993,"src":"1440:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10985,"name":"uint256","nodeType":"ElementaryTypeName","src":"1440:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10988,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"1478:20:64","nodeType":"VariableDeclaration","scope":10993,"src":"1470:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10987,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10990,"mutability":"mutable","name":"paymasterAndData","nameLocation":"1514:16:64","nodeType":"VariableDeclaration","scope":10993,"src":"1508:22:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10989,"name":"bytes","nodeType":"ElementaryTypeName","src":"1508:5:64","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":10992,"mutability":"mutable","name":"signature","nameLocation":"1546:9:64","nodeType":"VariableDeclaration","scope":10993,"src":"1540:15:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":10991,"name":"bytes","nodeType":"ElementaryTypeName","src":"1540:5:64","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOperation","nameLocation":"1216:13:64","nodeType":"StructDefinition","scope":11164,"src":"1209:353:64","visibility":"public"},{"abstract":false,"baseContracts":[],"canonicalName":"UserOperationLib","contractDependencies":[],"contractKind":"library","documentation":{"id":10994,"nodeType":"StructuredDocumentation","src":"1564:77:64","text":" Utility functions helpful when working with UserOperation structs."},"fullyImplemented":true,"id":11163,"linearizedBaseContracts":[11163],"name":"UserOperationLib","nameLocation":"1650:16:64","nodeType":"ContractDefinition","nodes":[{"body":{"id":11014,"nodeType":"Block","src":"1756:199:64","statements":[{"assignments":[11003],"declarations":[{"constant":false,"id":11003,"mutability":"mutable","name":"data","nameLocation":"1774:4:64","nodeType":"VariableDeclaration","scope":11014,"src":"1766:12:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11002,"name":"address","nodeType":"ElementaryTypeName","src":"1766:7:64","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11004,"nodeType":"VariableDeclarationStatement","src":"1766:12:64"},{"AST":{"nodeType":"YulBlock","src":"1880:30:64","statements":[{"nodeType":"YulAssignment","src":"1881:28:64","value":{"arguments":[{"name":"userOp","nodeType":"YulIdentifier","src":"1902:6:64"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1889:12:64"},"nodeType":"YulFunctionCall","src":"1889:20:64"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"1881:4:64"}]}]},"evmVersion":"london","externalReferences":[{"declaration":11003,"isOffset":false,"isSlot":false,"src":"1881:4:64","valueSize":1},{"declaration":10997,"isOffset":false,"isSlot":false,"src":"1902:6:64","valueSize":1}],"id":11005,"nodeType":"InlineAssembly","src":"1871:39:64"},{"expression":{"arguments":[{"arguments":[{"id":11010,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11003,"src":"1942:4:64","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":11009,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1934:7:64","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":11008,"name":"uint160","nodeType":"ElementaryTypeName","src":"1934:7:64","typeDescriptions":{}}},"id":11011,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1934:13:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":11007,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1926:7:64","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11006,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:64","typeDescriptions":{}}},"id":11012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1926:22:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":11001,"id":11013,"nodeType":"Return","src":"1919:29:64"}]},"id":11015,"implemented":true,"kind":"function","modifiers":[],"name":"getSender","nameLocation":"1683:9:64","nodeType":"FunctionDefinition","parameters":{"id":10998,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10997,"mutability":"mutable","name":"userOp","nameLocation":"1716:6:64","nodeType":"VariableDeclaration","scope":11015,"src":"1693:29:64","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":10996,"nodeType":"UserDefinedTypeName","pathNode":{"id":10995,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1693:13:64"},"referencedDeclaration":10993,"src":"1693:13:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1692:31:64"},"returnParameters":{"id":11001,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11000,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11015,"src":"1747:7:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10999,"name":"address","nodeType":"ElementaryTypeName","src":"1747:7:64","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1746:9:64"},"scope":11163,"src":"1674:281:64","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":11049,"nodeType":"Block","src":"2176:391:64","statements":[{"id":11048,"nodeType":"UncheckedBlock","src":"2182:379:64","statements":[{"assignments":[11024],"declarations":[{"constant":false,"id":11024,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"2210:12:64","nodeType":"VariableDeclaration","scope":11048,"src":"2202:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11023,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11027,"initialValue":{"expression":{"id":11025,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11018,"src":"2225:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11026,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10986,"src":"2225:19:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2202:42:64"},{"assignments":[11029],"declarations":[{"constant":false,"id":11029,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"2262:20:64","nodeType":"VariableDeclaration","scope":11048,"src":"2254:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11028,"name":"uint256","nodeType":"ElementaryTypeName","src":"2254:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11032,"initialValue":{"expression":{"id":11030,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11018,"src":"2285:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"2285:27:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2254:58:64"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11033,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11024,"src":"2326:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11034,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11029,"src":"2342:20:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2326:36:64","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11039,"nodeType":"IfStatement","src":"2322:161:64","trueBody":{"id":11038,"nodeType":"Block","src":"2364:119:64","statements":[{"expression":{"id":11036,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11024,"src":"2460:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":11022,"id":11037,"nodeType":"Return","src":"2453:19:64"}]}},{"expression":{"arguments":[{"id":11041,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11024,"src":"2503:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11045,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11042,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11029,"src":"2517:20:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":11043,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2540:5:64","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":11044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","src":"2540:13:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2517:36:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":11040,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11162,"src":"2499:3:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":11046,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2499:55:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":11022,"id":11047,"nodeType":"Return","src":"2492:62:64"}]}]},"id":11050,"implemented":true,"kind":"function","modifiers":[],"name":"gasPrice","nameLocation":"2104:8:64","nodeType":"FunctionDefinition","parameters":{"id":11019,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11018,"mutability":"mutable","name":"userOp","nameLocation":"2136:6:64","nodeType":"VariableDeclaration","scope":11050,"src":"2113:29:64","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11017,"nodeType":"UserDefinedTypeName","pathNode":{"id":11016,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2113:13:64"},"referencedDeclaration":10993,"src":"2113:13:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2112:31:64"},"returnParameters":{"id":11022,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11021,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11050,"src":"2167:7:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11020,"name":"uint256","nodeType":"ElementaryTypeName","src":"2167:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2166:9:64"},"scope":11163,"src":"2095:472:64","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11129,"nodeType":"Block","src":"2659:856:64","statements":[{"assignments":[11059],"declarations":[{"constant":false,"id":11059,"mutability":"mutable","name":"sender","nameLocation":"2677:6:64","nodeType":"VariableDeclaration","scope":11129,"src":"2669:14:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11058,"name":"address","nodeType":"ElementaryTypeName","src":"2669:7:64","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11063,"initialValue":{"arguments":[{"id":11061,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2696:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":11060,"name":"getSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11015,"src":"2686:9:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":11062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2686:17:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2669:34:64"},{"assignments":[11065],"declarations":[{"constant":false,"id":11065,"mutability":"mutable","name":"nonce","nameLocation":"2721:5:64","nodeType":"VariableDeclaration","scope":11129,"src":"2713:13:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11064,"name":"uint256","nodeType":"ElementaryTypeName","src":"2713:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11068,"initialValue":{"expression":{"id":11066,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2729:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"2729:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2713:28:64"},{"assignments":[11070],"declarations":[{"constant":false,"id":11070,"mutability":"mutable","name":"hashInitCode","nameLocation":"2759:12:64","nodeType":"VariableDeclaration","scope":11129,"src":"2751:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11069,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2751:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11075,"initialValue":{"arguments":[{"expression":{"id":11072,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2789:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"2789:15:64","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11071,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9990,"src":"2774:14:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":11074,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2774:31:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2751:54:64"},{"assignments":[11077],"declarations":[{"constant":false,"id":11077,"mutability":"mutable","name":"hashCallData","nameLocation":"2823:12:64","nodeType":"VariableDeclaration","scope":11129,"src":"2815:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11076,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2815:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11082,"initialValue":{"arguments":[{"expression":{"id":11079,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2853:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11080,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":10978,"src":"2853:15:64","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11078,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9990,"src":"2838:14:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":11081,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2838:31:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2815:54:64"},{"assignments":[11084],"declarations":[{"constant":false,"id":11084,"mutability":"mutable","name":"callGasLimit","nameLocation":"2887:12:64","nodeType":"VariableDeclaration","scope":11129,"src":"2879:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11083,"name":"uint256","nodeType":"ElementaryTypeName","src":"2879:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11087,"initialValue":{"expression":{"id":11085,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2902:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":10980,"src":"2902:19:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2879:42:64"},{"assignments":[11089],"declarations":[{"constant":false,"id":11089,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"2939:20:64","nodeType":"VariableDeclaration","scope":11129,"src":"2931:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11088,"name":"uint256","nodeType":"ElementaryTypeName","src":"2931:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11092,"initialValue":{"expression":{"id":11090,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"2962:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"2962:27:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2931:58:64"},{"assignments":[11094],"declarations":[{"constant":false,"id":11094,"mutability":"mutable","name":"preVerificationGas","nameLocation":"3007:18:64","nodeType":"VariableDeclaration","scope":11129,"src":"2999:26:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11093,"name":"uint256","nodeType":"ElementaryTypeName","src":"2999:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11097,"initialValue":{"expression":{"id":11095,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"3028:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11096,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":10984,"src":"3028:25:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2999:54:64"},{"assignments":[11099],"declarations":[{"constant":false,"id":11099,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"3071:12:64","nodeType":"VariableDeclaration","scope":11129,"src":"3063:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11098,"name":"uint256","nodeType":"ElementaryTypeName","src":"3063:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11102,"initialValue":{"expression":{"id":11100,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"3086:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10986,"src":"3086:19:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3063:42:64"},{"assignments":[11104],"declarations":[{"constant":false,"id":11104,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"3123:20:64","nodeType":"VariableDeclaration","scope":11129,"src":"3115:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11103,"name":"uint256","nodeType":"ElementaryTypeName","src":"3115:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11107,"initialValue":{"expression":{"id":11105,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"3146:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11106,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"3146:27:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3115:58:64"},{"assignments":[11109],"declarations":[{"constant":false,"id":11109,"mutability":"mutable","name":"hashPaymasterAndData","nameLocation":"3191:20:64","nodeType":"VariableDeclaration","scope":11129,"src":"3183:28:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11108,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3183:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11114,"initialValue":{"arguments":[{"expression":{"id":11111,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11053,"src":"3229:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"3229:23:64","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11110,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9990,"src":"3214:14:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":11113,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3214:39:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3183:70:64"},{"expression":{"arguments":[{"id":11117,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11059,"src":"3295:6:64","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11118,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11065,"src":"3303:5:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11119,"name":"hashInitCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11070,"src":"3322:12:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":11120,"name":"hashCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11077,"src":"3336:12:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":11121,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11084,"src":"3362:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11122,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11089,"src":"3376:20:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11123,"name":"preVerificationGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11094,"src":"3398:18:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11124,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11099,"src":"3430:12:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11125,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11104,"src":"3444:20:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11126,"name":"hashPaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11109,"src":"3478:20:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":11115,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3271:3:64","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":11116,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"3271:10:64","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":11127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3271:237:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":11057,"id":11128,"nodeType":"Return","src":"3264:244:64"}]},"id":11130,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"2582:4:64","nodeType":"FunctionDefinition","parameters":{"id":11054,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11053,"mutability":"mutable","name":"userOp","nameLocation":"2610:6:64","nodeType":"VariableDeclaration","scope":11130,"src":"2587:29:64","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11052,"nodeType":"UserDefinedTypeName","pathNode":{"id":11051,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2587:13:64"},"referencedDeclaration":10993,"src":"2587:13:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2586:31:64"},"returnParameters":{"id":11057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11056,"mutability":"mutable","name":"ret","nameLocation":"2654:3:64","nodeType":"VariableDeclaration","scope":11130,"src":"2641:16:64","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":11055,"name":"bytes","nodeType":"ElementaryTypeName","src":"2641:5:64","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2640:18:64"},"scope":11163,"src":"2573:942:64","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":11144,"nodeType":"Block","src":"3598:47:64","statements":[{"expression":{"arguments":[{"arguments":[{"id":11140,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11133,"src":"3630:6:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":11139,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11130,"src":"3625:4:64","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":11141,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3625:12:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":11138,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3615:9:64","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":11142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3615:23:64","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":11137,"id":11143,"nodeType":"Return","src":"3608:30:64"}]},"id":11145,"implemented":true,"kind":"function","modifiers":[],"name":"hash","nameLocation":"3530:4:64","nodeType":"FunctionDefinition","parameters":{"id":11134,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11133,"mutability":"mutable","name":"userOp","nameLocation":"3558:6:64","nodeType":"VariableDeclaration","scope":11145,"src":"3535:29:64","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11132,"nodeType":"UserDefinedTypeName","pathNode":{"id":11131,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3535:13:64"},"referencedDeclaration":10993,"src":"3535:13:64","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3534:31:64"},"returnParameters":{"id":11137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11136,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11145,"src":"3589:7:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11135,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3589:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3588:9:64"},"scope":11163,"src":"3521:124:64","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":11161,"nodeType":"Block","src":"3718:37:64","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11156,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11154,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11147,"src":"3735:1:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11155,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11149,"src":"3739:1:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3735:5:64","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":11158,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11149,"src":"3747:1:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3735:13:64","trueExpression":{"id":11157,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11147,"src":"3743:1:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":11153,"id":11160,"nodeType":"Return","src":"3728:20:64"}]},"id":11162,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"3660:3:64","nodeType":"FunctionDefinition","parameters":{"id":11150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11147,"mutability":"mutable","name":"a","nameLocation":"3672:1:64","nodeType":"VariableDeclaration","scope":11162,"src":"3664:9:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11146,"name":"uint256","nodeType":"ElementaryTypeName","src":"3664:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":11149,"mutability":"mutable","name":"b","nameLocation":"3683:1:64","nodeType":"VariableDeclaration","scope":11162,"src":"3675:9:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11148,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3663:22:64"},"returnParameters":{"id":11153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11152,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11162,"src":"3709:7:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11151,"name":"uint256","nodeType":"ElementaryTypeName","src":"3709:7:64","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3708:9:64"},"scope":11163,"src":"3651:104:64","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":11164,"src":"1642:2115:64","usedErrors":[]}],"src":"36:3722:64"},"id":64},"contracts/samples/BobaDepositPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/BobaDepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"BobaDepositPaymaster":[11779],"Context":[5151],"IAggregator":[10603],"IBobaStraw":[13138],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"SafeERC20":[4761],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":11780,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":11165,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"137:24:65"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"@openzeppelin/contracts/token/ERC20/IERC20.sol","id":11166,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11780,"sourceUnit":4420,"src":"200:56:65","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":11167,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11780,"sourceUnit":4762,"src":"257:65:65","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":11168,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11780,"sourceUnit":7529,"src":"324:35:65","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/IBobaStraw.sol","file":"./IBobaStraw.sol","id":11169,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11780,"sourceUnit":13139,"src":"360:26:65","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":11171,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1516:13:65"},"id":11172,"nodeType":"InheritanceSpecifier","src":"1516:13:65"}],"canonicalName":"BobaDepositPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":11170,"nodeType":"StructuredDocumentation","src":"388:1094:65","text":" A token-based paymaster that accepts token deposits\n The deposit is only a safeguard: the user pays with his token balance.\n only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n thus the required deposit is to cover just one method call.\n The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n (but can't use the deposit for this or further operations)\n paymasterAndData holds the paymaster address followed by the token address to use.\n @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n (the standard rules ban accessing data of an external contract)\n It can only be used if it is \"whitelisted\" by the bundler.\n (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)\n If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value\n on validation and asynchronously update the ratio"},"fullyImplemented":true,"id":11779,"linearizedBaseContracts":[11779,7528,2933,5151,10861],"name":"BobaDepositPaymaster","nameLocation":"1492:20:65","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11176,"libraryName":{"id":11173,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"1543:16:65"},"nodeType":"UsingForDirective","src":"1537:41:65","typeName":{"id":11175,"nodeType":"UserDefinedTypeName","pathNode":{"id":11174,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1564:13:65"},"referencedDeclaration":10993,"src":"1564:13:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"global":false,"id":11180,"libraryName":{"id":11177,"name":"SafeERC20","nodeType":"IdentifierPath","referencedDeclaration":4761,"src":"1589:9:65"},"nodeType":"UsingForDirective","src":"1583:27:65","typeName":{"id":11179,"nodeType":"UserDefinedTypeName","pathNode":{"id":11178,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1603:6:65"},"referencedDeclaration":4419,"src":"1603:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}}},{"canonicalName":"BobaDepositPaymaster.Oracle","id":11188,"members":[{"constant":false,"id":11183,"mutability":"mutable","name":"feedRegistry","nameLocation":"1651:12:65","nodeType":"VariableDeclaration","scope":11188,"src":"1640:23:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"typeName":{"id":11182,"nodeType":"UserDefinedTypeName","pathNode":{"id":11181,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"1640:10:65"},"referencedDeclaration":13138,"src":"1640:10:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"visibility":"internal"},{"constant":false,"id":11185,"mutability":"mutable","name":"tokenBase","nameLocation":"1681:9:65","nodeType":"VariableDeclaration","scope":11188,"src":"1673:17:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11184,"name":"address","nodeType":"ElementaryTypeName","src":"1673:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11187,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1706:13:65","nodeType":"VariableDeclaration","scope":11188,"src":"1700:19:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":11186,"name":"uint8","nodeType":"ElementaryTypeName","src":"1700:5:65","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"name":"Oracle","nameLocation":"1623:6:65","nodeType":"StructDefinition","scope":11779,"src":"1616:110:65","visibility":"public"},{"constant":true,"functionSelector":"796d4371","id":11191,"mutability":"constant","name":"COST_OF_POST","nameLocation":"1792:12:65","nodeType":"VariableDeclaration","scope":11779,"src":"1768:44:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11189,"name":"uint256","nodeType":"ElementaryTypeName","src":"1768:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3335303030","id":11190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1807:5:65","typeDescriptions":{"typeIdentifier":"t_rational_35000_by_1","typeString":"int_const 35000"},"value":"35000"},"visibility":"public"},{"constant":true,"functionSelector":"2f3e96a7","id":11194,"mutability":"constant","name":"QUOTE_USD","nameLocation":"1842:9:65","nodeType":"VariableDeclaration","scope":11779,"src":"1818:78:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11192,"name":"address","nodeType":"ElementaryTypeName","src":"1818:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"hexValue":"307830303030303030303030303030303030303030303030303030303030303030303030303030333438","id":11193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1854:42:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x0000000000000000000000000000000000000348"},"visibility":"public"},{"constant":true,"functionSelector":"7b775d4d","id":11197,"mutability":"constant","name":"L2_ETH_ADDRESS","nameLocation":"1977:14:65","nodeType":"VariableDeclaration","scope":11779,"src":"1953:83:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11195,"name":"address","nodeType":"ElementaryTypeName","src":"1953:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"hexValue":"307834323030303030303030303030303030303030303030303030303030303030303030303030303036","id":11196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1994:42:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x4200000000000000000000000000000000000006"},"visibility":"public"},{"constant":true,"functionSelector":"33032ec4","id":11203,"mutability":"constant","name":"L2_ETH","nameLocation":"2065:6:65","nodeType":"VariableDeclaration","scope":11779,"src":"2042:54:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11199,"nodeType":"UserDefinedTypeName","pathNode":{"id":11198,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2042:6:65"},"referencedDeclaration":4419,"src":"2042:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"value":{"arguments":[{"id":11201,"name":"L2_ETH_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11197,"src":"2081:14:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":11200,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"2074:6:65","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":11202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2074:22:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"public"},{"constant":true,"id":11212,"mutability":"constant","name":"NULL_ORACLE","nameLocation":"2131:11:65","nodeType":"VariableDeclaration","scope":11779,"src":"2103:64:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"typeName":{"id":11205,"nodeType":"UserDefinedTypeName","pathNode":{"id":11204,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"2103:10:65"},"referencedDeclaration":13138,"src":"2103:10:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"value":{"arguments":[{"arguments":[{"hexValue":"30","id":11209,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2164:1:65","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":11208,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2156:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11207,"name":"address","nodeType":"ElementaryTypeName","src":"2156:7:65","typeDescriptions":{}}},"id":11210,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2156:10:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":11206,"name":"IBobaStraw","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13138,"src":"2145:10:65","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBobaStraw_$13138_$","typeString":"type(contract IBobaStraw)"}},"id":11211,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2145:22:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"visibility":"private"},{"constant":false,"functionSelector":"addd5099","id":11218,"mutability":"mutable","name":"oracles","nameLocation":"2207:7:65","nodeType":"VariableDeclaration","scope":11779,"src":"2174:40:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle)"},"typeName":{"id":11217,"keyType":{"id":11214,"nodeType":"UserDefinedTypeName","pathNode":{"id":11213,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2182:6:65"},"referencedDeclaration":4419,"src":"2182:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"2174:25:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle)"},"valueType":{"id":11216,"nodeType":"UserDefinedTypeName","pathNode":{"id":11215,"name":"Oracle","nodeType":"IdentifierPath","referencedDeclaration":11188,"src":"2192:6:65"},"referencedDeclaration":11188,"src":"2192:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage_ptr","typeString":"struct BobaDepositPaymaster.Oracle"}}},"visibility":"public"},{"constant":false,"functionSelector":"c23f001f","id":11225,"mutability":"mutable","name":"balances","nameLocation":"2274:8:65","nodeType":"VariableDeclaration","scope":11779,"src":"2220:62:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"typeName":{"id":11224,"keyType":{"id":11220,"nodeType":"UserDefinedTypeName","pathNode":{"id":11219,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2228:6:65"},"referencedDeclaration":4419,"src":"2228:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"2220:46:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"valueType":{"id":11223,"keyType":{"id":11221,"name":"address","nodeType":"ElementaryTypeName","src":"2246:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2238:27:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":11222,"name":"uint256","nodeType":"ElementaryTypeName","src":"2257:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"constant":false,"functionSelector":"4a6f84cf","id":11229,"mutability":"mutable","name":"unlockBlock","nameLocation":"2323:11:65","nodeType":"VariableDeclaration","scope":11779,"src":"2288:46:65","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":11228,"keyType":{"id":11226,"name":"address","nodeType":"ElementaryTypeName","src":"2296:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2288:27:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":11227,"name":"uint256","nodeType":"ElementaryTypeName","src":"2307:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":11261,"nodeType":"Block","src":"2432:302:65","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"id":11244,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11242,"name":"ethPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11235,"src":"2450:14:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":11243,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11212,"src":"2468:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"src":"2450:29:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20496e636f727265637420657468206f7261636c65","id":11245,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2481:40:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16","typeString":"literal_string \"DepositPaymaster: Incorrect eth oracle\""},"value":"DepositPaymaster: Incorrect eth oracle"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16","typeString":"literal_string \"DepositPaymaster: Incorrect eth oracle\""}],"id":11241,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2442:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2442:80:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11247,"nodeType":"ExpressionStatement","src":"2442:80:65"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":11248,"name":"unlockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11397,"src":"2604:18:65","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":11249,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2604:20:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11250,"nodeType":"ExpressionStatement","src":"2604:20:65"},{"expression":{"id":11259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11251,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"2667:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11253,"indexExpression":{"id":11252,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"2675:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2667:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11255,"name":"ethPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11235,"src":"2692:14:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},{"id":11256,"name":"L2_ETH_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11197,"src":"2708:14:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"3138","id":11257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2724:2:65","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"}],"id":11254,"name":"Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11188,"src":"2685:6:65","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Oracle_$11188_storage_ptr_$","typeString":"type(struct BobaDepositPaymaster.Oracle storage pointer)"}},"id":11258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2685:42:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"src":"2667:60:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11260,"nodeType":"ExpressionStatement","src":"2667:60:65"}]},"id":11262,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":11238,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11232,"src":"2419:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":11239,"kind":"baseConstructorSpecifier","modifierName":{"id":11237,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"2405:13:65"},"nodeType":"ModifierInvocation","src":"2405:26:65"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":11236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11232,"mutability":"mutable","name":"_entryPoint","nameLocation":"2365:11:65","nodeType":"VariableDeclaration","scope":11262,"src":"2353:23:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":11231,"nodeType":"UserDefinedTypeName","pathNode":{"id":11230,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"2353:11:65"},"referencedDeclaration":10807,"src":"2353:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":11235,"mutability":"mutable","name":"ethPriceOracle","nameLocation":"2389:14:65","nodeType":"VariableDeclaration","scope":11262,"src":"2378:25:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"typeName":{"id":11234,"nodeType":"UserDefinedTypeName","pathNode":{"id":11233,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"2378:10:65"},"referencedDeclaration":13138,"src":"2378:10:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"visibility":"internal"}],"src":"2352:52:65"},"returnParameters":{"id":11240,"nodeType":"ParameterList","parameters":[],"src":"2432:0:65"},"scope":11779,"src":"2341:393:65","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":11304,"nodeType":"Block","src":"2929:234:65","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"id":11281,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11279,"name":"tokenPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11269,"src":"2947:16:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":11280,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11212,"src":"2967:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"src":"2947:31:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20496e636f727265637420746f6b656e206f7261636c65","id":11282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2980:42:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a","typeString":"literal_string \"DepositPaymaster: Incorrect token oracle\""},"value":"DepositPaymaster: Incorrect token oracle"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a","typeString":"literal_string \"DepositPaymaster: Incorrect token oracle\""}],"id":11278,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2939:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2939:84:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11284,"nodeType":"ExpressionStatement","src":"2939:84:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"id":11291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":11286,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"3041:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11288,"indexExpression":{"id":11287,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11266,"src":"3049:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3041:14:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11289,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"3041:27:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11290,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11212,"src":"3072:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"src":"3041:42:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":11285,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3033:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":11292,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3033:51:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11293,"nodeType":"ExpressionStatement","src":"3033:51:65"},{"expression":{"id":11302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11294,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"3094:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11296,"indexExpression":{"id":11295,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11266,"src":"3102:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3094:14:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11298,"name":"tokenPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11269,"src":"3118:16:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},{"id":11299,"name":"base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11271,"src":"3136:4:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11300,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11273,"src":"3142:13:65","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":11297,"name":"Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11188,"src":"3111:6:65","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Oracle_$11188_storage_ptr_$","typeString":"type(struct BobaDepositPaymaster.Oracle storage pointer)"}},"id":11301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3111:45:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"src":"3094:62:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11303,"nodeType":"ExpressionStatement","src":"3094:62:65"}]},"documentation":{"id":11263,"nodeType":"StructuredDocumentation","src":"2740:69:65","text":" owner of the paymaster should add supported tokens"},"functionSelector":"1a02ef76","id":11305,"implemented":true,"kind":"function","modifiers":[{"id":11276,"kind":"modifierInvocation","modifierName":{"id":11275,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2919:9:65"},"nodeType":"ModifierInvocation","src":"2919:9:65"}],"name":"addToken","nameLocation":"2823:8:65","nodeType":"FunctionDefinition","parameters":{"id":11274,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11266,"mutability":"mutable","name":"token","nameLocation":"2839:5:65","nodeType":"VariableDeclaration","scope":11305,"src":"2832:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11265,"nodeType":"UserDefinedTypeName","pathNode":{"id":11264,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2832:6:65"},"referencedDeclaration":4419,"src":"2832:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11269,"mutability":"mutable","name":"tokenPriceOracle","nameLocation":"2857:16:65","nodeType":"VariableDeclaration","scope":11305,"src":"2846:27:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"typeName":{"id":11268,"nodeType":"UserDefinedTypeName","pathNode":{"id":11267,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"2846:10:65"},"referencedDeclaration":13138,"src":"2846:10:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"visibility":"internal"},{"constant":false,"id":11271,"mutability":"mutable","name":"base","nameLocation":"2883:4:65","nodeType":"VariableDeclaration","scope":11305,"src":"2875:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11270,"name":"address","nodeType":"ElementaryTypeName","src":"2875:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11273,"mutability":"mutable","name":"tokenDecimals","nameLocation":"2895:13:65","nodeType":"VariableDeclaration","scope":11305,"src":"2889:19:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":11272,"name":"uint8","nodeType":"ElementaryTypeName","src":"2889:5:65","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2831:78:65"},"returnParameters":{"id":11277,"nodeType":"ParameterList","parameters":[],"src":"2929:0:65"},"scope":11779,"src":"2814:349:65","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":11355,"nodeType":"Block","src":"3776:393:65","statements":[{"expression":{"arguments":[{"expression":{"id":11319,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3905:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3905:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":11323,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3925:4:65","typeDescriptions":{"typeIdentifier":"t_contract$_BobaDepositPaymaster_$11779","typeString":"contract BobaDepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BobaDepositPaymaster_$11779","typeString":"contract BobaDepositPaymaster"}],"id":11322,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3917:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11321,"name":"address","nodeType":"ElementaryTypeName","src":"3917:7:65","typeDescriptions":{}}},"id":11324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3917:13:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11325,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11313,"src":"3932:6:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":11316,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11309,"src":"3882:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":11318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"3882:22:65","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":11326,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3882:57:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11327,"nodeType":"ExpressionStatement","src":"3882:57:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"id":11334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":11329,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"3957:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11331,"indexExpression":{"id":11330,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11309,"src":"3965:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3957:14:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11332,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"3957:27:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":11333,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11212,"src":"3988:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"src":"3957:42:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":11335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4001:37:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":11328,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3949:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3949:90:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11337,"nodeType":"ExpressionStatement","src":"3949:90:65"},{"expression":{"id":11344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":11338,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"4049:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11341,"indexExpression":{"id":11339,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11309,"src":"4058:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4049:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11342,"indexExpression":{"id":11340,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11311,"src":"4065:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4049:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":11343,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11313,"src":"4077:6:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4049:34:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11345,"nodeType":"ExpressionStatement","src":"4049:34:65"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11346,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4097:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11347,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4097:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11348,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11311,"src":"4111:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4097:21:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11354,"nodeType":"IfStatement","src":"4093:70:65","trueBody":{"id":11353,"nodeType":"Block","src":"4120:43:65","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":11350,"name":"lockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11409,"src":"4134:16:65","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":11351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4134:18:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11352,"nodeType":"ExpressionStatement","src":"4134:18:65"}]}}]},"documentation":{"id":11306,"nodeType":"StructuredDocumentation","src":"3169:523:65","text":" deposit tokens that a specific account can use to pay for gas.\n The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n use them - either as gas, or using withdrawTo()\n @param token the token to deposit.\n @param account the account to deposit for.\n @param amount the amount of token to deposit."},"functionSelector":"382edd9e","id":11356,"implemented":true,"kind":"function","modifiers":[],"name":"addDepositFor","nameLocation":"3706:13:65","nodeType":"FunctionDefinition","parameters":{"id":11314,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11309,"mutability":"mutable","name":"token","nameLocation":"3727:5:65","nodeType":"VariableDeclaration","scope":11356,"src":"3720:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11308,"nodeType":"UserDefinedTypeName","pathNode":{"id":11307,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"3720:6:65"},"referencedDeclaration":4419,"src":"3720:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11311,"mutability":"mutable","name":"account","nameLocation":"3742:7:65","nodeType":"VariableDeclaration","scope":11356,"src":"3734:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11310,"name":"address","nodeType":"ElementaryTypeName","src":"3734:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11313,"mutability":"mutable","name":"amount","nameLocation":"3759:6:65","nodeType":"VariableDeclaration","scope":11356,"src":"3751:14:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11312,"name":"uint256","nodeType":"ElementaryTypeName","src":"3751:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3719:47:65"},"returnParameters":{"id":11315,"nodeType":"ParameterList","parameters":[],"src":"3776:0:65"},"scope":11779,"src":"3697:472:65","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":11383,"nodeType":"Block","src":"4466:95:65","statements":[{"expression":{"id":11375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11369,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11365,"src":"4476:6:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":11370,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"4485:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11372,"indexExpression":{"id":11371,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11360,"src":"4494:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4485:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11374,"indexExpression":{"id":11373,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11362,"src":"4501:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4485:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4476:33:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11376,"nodeType":"ExpressionStatement","src":"4476:33:65"},{"expression":{"id":11381,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11377,"name":"_unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11367,"src":"4519:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":11378,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"4534:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11380,"indexExpression":{"id":11379,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11362,"src":"4546:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4534:20:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4519:35:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11382,"nodeType":"ExpressionStatement","src":"4519:35:65"}]},"documentation":{"id":11357,"nodeType":"StructuredDocumentation","src":"4175:175:65","text":" @return amount - the amount of given token deposited to the Paymaster.\n @return _unlockBlock - the block height at which the deposit can be withdrawn."},"functionSelector":"493b0170","id":11384,"implemented":true,"kind":"function","modifiers":[],"name":"depositInfo","nameLocation":"4364:11:65","nodeType":"FunctionDefinition","parameters":{"id":11363,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11360,"mutability":"mutable","name":"token","nameLocation":"4383:5:65","nodeType":"VariableDeclaration","scope":11384,"src":"4376:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11359,"nodeType":"UserDefinedTypeName","pathNode":{"id":11358,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"4376:6:65"},"referencedDeclaration":4419,"src":"4376:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11362,"mutability":"mutable","name":"account","nameLocation":"4398:7:65","nodeType":"VariableDeclaration","scope":11384,"src":"4390:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11361,"name":"address","nodeType":"ElementaryTypeName","src":"4390:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4375:31:65"},"returnParameters":{"id":11368,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11365,"mutability":"mutable","name":"amount","nameLocation":"4436:6:65","nodeType":"VariableDeclaration","scope":11384,"src":"4428:14:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11364,"name":"uint256","nodeType":"ElementaryTypeName","src":"4428:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":11367,"mutability":"mutable","name":"_unlockBlock","nameLocation":"4452:12:65","nodeType":"VariableDeclaration","scope":11384,"src":"4444:20:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11366,"name":"uint256","nodeType":"ElementaryTypeName","src":"4444:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4427:38:65"},"scope":11779,"src":"4355:206:65","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":11396,"nodeType":"Block","src":"4729:55:65","statements":[{"expression":{"id":11394,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11388,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"4739:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11391,"indexExpression":{"expression":{"id":11389,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4751:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4751:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4739:23:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":11392,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4765:5:65","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":11393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"4765:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4739:38:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11395,"nodeType":"ExpressionStatement","src":"4739:38:65"}]},"documentation":{"id":11385,"nodeType":"StructuredDocumentation","src":"4567:120:65","text":" unlock deposit, so that it can be withdrawn.\n can't be called in the same block as withdrawTo()"},"functionSelector":"9ed0fb68","id":11397,"implemented":true,"kind":"function","modifiers":[],"name":"unlockTokenDeposit","nameLocation":"4701:18:65","nodeType":"FunctionDefinition","parameters":{"id":11386,"nodeType":"ParameterList","parameters":[],"src":"4719:2:65"},"returnParameters":{"id":11387,"nodeType":"ParameterList","parameters":[],"src":"4729:0:65"},"scope":11779,"src":"4692:92:65","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":11408,"nodeType":"Block","src":"5036:44:65","statements":[{"expression":{"id":11406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11401,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"5046:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11404,"indexExpression":{"expression":{"id":11402,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5058:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5058:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5046:23:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":11405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5072:1:65","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5046:27:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11407,"nodeType":"ExpressionStatement","src":"5046:27:65"}]},"documentation":{"id":11398,"nodeType":"StructuredDocumentation","src":"4790:206:65","text":" lock the tokens deposited for this account so they can be used to pay for gas.\n after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"functionSelector":"cd8f80c2","id":11409,"implemented":true,"kind":"function","modifiers":[],"name":"lockTokenDeposit","nameLocation":"5010:16:65","nodeType":"FunctionDefinition","parameters":{"id":11399,"nodeType":"ParameterList","parameters":[],"src":"5026:2:65"},"returnParameters":{"id":11400,"nodeType":"ParameterList","parameters":[],"src":"5036:0:65"},"scope":11779,"src":"5001:79:65","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":11454,"nodeType":"Block","src":"5407:232:65","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":11434,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":11421,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"5425:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11424,"indexExpression":{"expression":{"id":11422,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5437:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5437:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5425:23:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":11425,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5452:1:65","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5425:28:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11433,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11427,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5457:5:65","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":11428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"5457:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"baseExpression":{"id":11429,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"5472:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11432,"indexExpression":{"expression":{"id":11430,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5484:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5484:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5472:23:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5457:38:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5425:70:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b656e4465706f736974","id":11435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5497:43:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""},"value":"DepositPaymaster: must unlockTokenDeposit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""}],"id":11420,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5417:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11436,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5417:124:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11437,"nodeType":"ExpressionStatement","src":"5417:124:65"},{"expression":{"id":11445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":11438,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"5551:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11442,"indexExpression":{"id":11439,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11413,"src":"5560:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5551:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11443,"indexExpression":{"expression":{"id":11440,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5567:3:65","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5567:10:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5551:27:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":11444,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11417,"src":"5582:6:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5551:37:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11446,"nodeType":"ExpressionStatement","src":"5551:37:65"},{"expression":{"arguments":[{"id":11450,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11415,"src":"5617:6:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11451,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11417,"src":"5625:6:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":11447,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11413,"src":"5598:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":11449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":4512,"src":"5598:18:65","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,uint256)"}},"id":11452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5598:34:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11453,"nodeType":"ExpressionStatement","src":"5598:34:65"}]},"documentation":{"id":11410,"nodeType":"StructuredDocumentation","src":"5086:237:65","text":" withdraw tokens.\n can only be called after unlock() is called in a previous block.\n @param token the token deposit to withdraw\n @param target address to send to\n @param amount amount to withdraw"},"functionSelector":"cc9c837c","id":11455,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTokensTo","nameLocation":"5337:16:65","nodeType":"FunctionDefinition","parameters":{"id":11418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11413,"mutability":"mutable","name":"token","nameLocation":"5361:5:65","nodeType":"VariableDeclaration","scope":11455,"src":"5354:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11412,"nodeType":"UserDefinedTypeName","pathNode":{"id":11411,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"5354:6:65"},"referencedDeclaration":4419,"src":"5354:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11415,"mutability":"mutable","name":"target","nameLocation":"5376:6:65","nodeType":"VariableDeclaration","scope":11455,"src":"5368:14:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11414,"name":"address","nodeType":"ElementaryTypeName","src":"5368:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11417,"mutability":"mutable","name":"amount","nameLocation":"5392:6:65","nodeType":"VariableDeclaration","scope":11455,"src":"5384:14:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11416,"name":"uint256","nodeType":"ElementaryTypeName","src":"5384:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5353:46:65"},"returnParameters":{"id":11419,"nodeType":"ParameterList","parameters":[],"src":"5407:0:65"},"scope":11779,"src":"5328:311:65","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":11582,"nodeType":"Block","src":"6017:955:65","statements":[{"assignments":[11468],"declarations":[{"constant":false,"id":11468,"mutability":"mutable","name":"oracleInfo","nameLocation":"6041:10:65","nodeType":"VariableDeclaration","scope":11582,"src":"6027:24:65","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle"},"typeName":{"id":11467,"nodeType":"UserDefinedTypeName","pathNode":{"id":11466,"name":"Oracle","nodeType":"IdentifierPath","referencedDeclaration":11188,"src":"6027:6:65"},"referencedDeclaration":11188,"src":"6027:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage_ptr","typeString":"struct BobaDepositPaymaster.Oracle"}},"visibility":"internal"}],"id":11472,"initialValue":{"baseExpression":{"id":11469,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6054:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11471,"indexExpression":{"id":11470,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11459,"src":"6062:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6054:14:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"nodeType":"VariableDeclarationStatement","src":"6027:41:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"id":11477,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11474,"name":"oracleInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11468,"src":"6086:10:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"id":11475,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"6086:23:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":11476,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11212,"src":"6113:11:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"src":"6086:38:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":11478,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6126:37:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":11473,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6078:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11479,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6078:86:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11480,"nodeType":"ExpressionStatement","src":"6078:86:65"},{"assignments":[11482],"declarations":[{"constant":false,"id":11482,"mutability":"mutable","name":"base","nameLocation":"6182:4:65","nodeType":"VariableDeclaration","scope":11582,"src":"6174:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11481,"name":"address","nodeType":"ElementaryTypeName","src":"6174:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11485,"initialValue":{"expression":{"id":11483,"name":"oracleInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11468,"src":"6189:10:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"id":11484,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenBase","nodeType":"MemberAccess","referencedDeclaration":11185,"src":"6189:20:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6174:35:65"},{"assignments":[11487],"declarations":[{"constant":false,"id":11487,"mutability":"mutable","name":"ethPrice","nameLocation":"6227:8:65","nodeType":"VariableDeclaration","scope":11582,"src":"6219:16:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11486,"name":"uint256","nodeType":"ElementaryTypeName","src":"6219:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11502,"initialValue":{"arguments":[{"arguments":[{"expression":{"baseExpression":{"id":11495,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6288:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11497,"indexExpression":{"id":11496,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"6296:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6288:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11498,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenBase","nodeType":"MemberAccess","referencedDeclaration":11185,"src":"6288:25:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11499,"name":"QUOTE_USD","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11194,"src":"6315:9:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"expression":{"baseExpression":{"id":11490,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6246:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11492,"indexExpression":{"id":11491,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"6254:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6246:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11493,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"6246:28:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"id":11494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"latestAnswer","nodeType":"MemberAccess","referencedDeclaration":13119,"src":"6246:41:65","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_int256_$","typeString":"function (address,address) view external returns (int256)"}},"id":11500,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6246:79:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":11489,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6238:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11488,"name":"uint256","nodeType":"ElementaryTypeName","src":"6238:7:65","typeDescriptions":{}}},"id":11501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6238:88:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6219:107:65"},{"assignments":[11504],"declarations":[{"constant":false,"id":11504,"mutability":"mutable","name":"tokenPrice","nameLocation":"6344:10:65","nodeType":"VariableDeclaration","scope":11582,"src":"6336:18:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11503,"name":"uint256","nodeType":"ElementaryTypeName","src":"6336:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11514,"initialValue":{"arguments":[{"arguments":[{"id":11510,"name":"base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11482,"src":"6402:4:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11511,"name":"QUOTE_USD","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11194,"src":"6408:9:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"expression":{"id":11507,"name":"oracleInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11468,"src":"6365:10:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"id":11508,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"6365:23:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"id":11509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"latestAnswer","nodeType":"MemberAccess","referencedDeclaration":13119,"src":"6365:36:65","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_int256_$","typeString":"function (address,address) view external returns (int256)"}},"id":11512,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6365:53:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":11506,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6357:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11505,"name":"uint256","nodeType":"ElementaryTypeName","src":"6357:7:65","typeDescriptions":{}}},"id":11513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6357:62:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6336:83:65"},{"assignments":[11516],"declarations":[{"constant":false,"id":11516,"mutability":"mutable","name":"ethPriceDecimals","nameLocation":"6437:16:65","nodeType":"VariableDeclaration","scope":11582,"src":"6429:24:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11515,"name":"uint256","nodeType":"ElementaryTypeName","src":"6429:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11531,"initialValue":{"arguments":[{"arguments":[{"expression":{"baseExpression":{"id":11524,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6502:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11526,"indexExpression":{"id":11525,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"6510:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6502:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11527,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenBase","nodeType":"MemberAccess","referencedDeclaration":11185,"src":"6502:25:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11528,"name":"QUOTE_USD","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11194,"src":"6529:9:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"expression":{"baseExpression":{"id":11519,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6464:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11521,"indexExpression":{"id":11520,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"6472:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6464:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11522,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"6464:28:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"id":11523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"decimals","nodeType":"MemberAccess","referencedDeclaration":13137,"src":"6464:37:65","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint8_$","typeString":"function (address,address) view external returns (uint8)"}},"id":11529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6464:75:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":11518,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6456:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11517,"name":"uint256","nodeType":"ElementaryTypeName","src":"6456:7:65","typeDescriptions":{}}},"id":11530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6456:84:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6429:111:65"},{"assignments":[11533],"declarations":[{"constant":false,"id":11533,"mutability":"mutable","name":"tokenPriceDecimals","nameLocation":"6558:18:65","nodeType":"VariableDeclaration","scope":11582,"src":"6550:26:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11532,"name":"uint256","nodeType":"ElementaryTypeName","src":"6550:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11543,"initialValue":{"arguments":[{"arguments":[{"id":11539,"name":"base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11482,"src":"6620:4:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11540,"name":"QUOTE_USD","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11194,"src":"6626:9:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"expression":{"id":11536,"name":"oracleInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11468,"src":"6587:10:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"id":11537,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"feedRegistry","nodeType":"MemberAccess","referencedDeclaration":11183,"src":"6587:23:65","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"id":11538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"decimals","nodeType":"MemberAccess","referencedDeclaration":13137,"src":"6587:32:65","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint8_$","typeString":"function (address,address) view external returns (uint8)"}},"id":11541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6587:49:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":11535,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6579:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11534,"name":"uint256","nodeType":"ElementaryTypeName","src":"6579:7:65","typeDescriptions":{}}},"id":11542,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6579:58:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6550:87:65"},{"assignments":[11545],"declarations":[{"constant":false,"id":11545,"mutability":"mutable","name":"requiredAmount","nameLocation":"6655:14:65","nodeType":"VariableDeclaration","scope":11582,"src":"6647:22:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11544,"name":"uint256","nodeType":"ElementaryTypeName","src":"6647:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11563,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11562,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11546,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11461,"src":"6673:9:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":11547,"name":"ethPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11487,"src":"6685:8:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6673:20:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11551,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":11549,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6697:2:65","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":11550,"name":"tokenPriceDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11533,"src":"6701:18:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6697:22:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11552,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6696:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6673:47:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11554,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6672:49:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11555,"name":"tokenPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11504,"src":"6725:10:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11558,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":11556,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6739:2:65","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":11557,"name":"ethPriceDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11516,"src":"6743:16:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6739:20:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11559,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6738:22:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6725:35:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11561,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6724:37:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6672:89:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6647:114:65"},{"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11579,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11564,"name":"requiredAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11545,"src":"6878:14:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":11565,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6896:2:65","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"expression":{"id":11566,"name":"oracleInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11468,"src":"6900:10:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_memory_ptr","typeString":"struct BobaDepositPaymaster.Oracle memory"}},"id":11567,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":11187,"src":"6900:24:65","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6896:28:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11569,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6895:30:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6878:47:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11571,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6877:49:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":11572,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6930:2:65","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"expression":{"baseExpression":{"id":11573,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"6934:7:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_Oracle_$11188_storage_$","typeString":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle storage ref)"}},"id":11575,"indexExpression":{"id":11574,"name":"L2_ETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11203,"src":"6942:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6934:15:65","typeDescriptions":{"typeIdentifier":"t_struct$_Oracle_$11188_storage","typeString":"struct BobaDepositPaymaster.Oracle storage ref"}},"id":11576,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":11187,"src":"6934:29:65","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6930:33:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11578,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6929:35:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6877:87:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11580,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6876:89:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":11465,"id":11581,"nodeType":"Return","src":"6869:96:65"}]},"documentation":{"id":11456,"nodeType":"StructuredDocumentation","src":"5645:251:65","text":" translate the given eth value to token amount\n @param token the token to use\n @param ethBought the required eth value we want to \"buy\"\n @return requiredTokens the amount of tokens required to get this amount of eth"},"id":11583,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"5910:18:65","nodeType":"FunctionDefinition","parameters":{"id":11462,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11459,"mutability":"mutable","name":"token","nameLocation":"5936:5:65","nodeType":"VariableDeclaration","scope":11583,"src":"5929:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11458,"nodeType":"UserDefinedTypeName","pathNode":{"id":11457,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"5929:6:65"},"referencedDeclaration":4419,"src":"5929:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11461,"mutability":"mutable","name":"ethBought","nameLocation":"5951:9:65","nodeType":"VariableDeclaration","scope":11583,"src":"5943:17:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11460,"name":"uint256","nodeType":"ElementaryTypeName","src":"5943:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5928:33:65"},"returnParameters":{"id":11465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11464,"mutability":"mutable","name":"requiredTokens","nameLocation":"6001:14:65","nodeType":"VariableDeclaration","scope":11583,"src":"5993:22:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11463,"name":"uint256","nodeType":"ElementaryTypeName","src":"5993:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5992:24:65"},"scope":11779,"src":"5901:1071:65","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[7373],"body":{"id":11690,"nodeType":"Block","src":"7455:917:65","statements":[{"expression":{"components":[{"id":11599,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11589,"src":"7467:10:65","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":11600,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7466:12:65","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":11601,"nodeType":"ExpressionStatement","src":"7466:12:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11603,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11587,"src":"7599:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"7599:27:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":11605,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11191,"src":"7629:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7599:42:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f7220706f73744f70","id":11607,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7643:42:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""},"value":"DepositPaymaster: gas too low for postOp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""}],"id":11602,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7591:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11608,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7591:95:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11609,"nodeType":"ExpressionStatement","src":"7591:95:65"},{"assignments":[11611],"declarations":[{"constant":false,"id":11611,"mutability":"mutable","name":"paymasterAndData","nameLocation":"7712:16:65","nodeType":"VariableDeclaration","scope":11690,"src":"7697:31:65","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":11610,"name":"bytes","nodeType":"ElementaryTypeName","src":"7697:5:65","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":11614,"initialValue":{"expression":{"id":11612,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11587,"src":"7731:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11613,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"7731:23:65","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"7697:57:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11621,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11616,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11611,"src":"7772:16:65","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":11617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7772:23:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"id":11620,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3230","id":11618,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7799:2:65","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3230","id":11619,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7802:2:65","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"7799:5:65","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"}},"src":"7772:32:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e6444617461206d757374207370656369667920746f6b656e","id":11622,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7806:55:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""},"value":"DepositPaymaster: paymasterAndData must specify token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""}],"id":11615,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7764:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11623,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7764:98:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11624,"nodeType":"ExpressionStatement","src":"7764:98:65"},{"assignments":[11627],"declarations":[{"constant":false,"id":11627,"mutability":"mutable","name":"token","nameLocation":"7879:5:65","nodeType":"VariableDeclaration","scope":11690,"src":"7872:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11626,"nodeType":"UserDefinedTypeName","pathNode":{"id":11625,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"7872:6:65"},"referencedDeclaration":4419,"src":"7872:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"}],"id":11639,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"baseExpression":{"id":11633,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11611,"src":"7910:16:65","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":11635,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"7910:21:65","startExpression":{"hexValue":"3230","id":11634,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7927:2:65","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":11632,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7902:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":11631,"name":"bytes20","nodeType":"ElementaryTypeName","src":"7902:7:65","typeDescriptions":{}}},"id":11636,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7902:30:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":11630,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7894:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11629,"name":"address","nodeType":"ElementaryTypeName","src":"7894:7:65","typeDescriptions":{}}},"id":11637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7894:39:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":11628,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"7887:6:65","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":11638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7887:47:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"VariableDeclarationStatement","src":"7872:62:65"},{"assignments":[11641],"declarations":[{"constant":false,"id":11641,"mutability":"mutable","name":"account","nameLocation":"7952:7:65","nodeType":"VariableDeclaration","scope":11690,"src":"7944:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11640,"name":"address","nodeType":"ElementaryTypeName","src":"7944:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11645,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11642,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11587,"src":"7962:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"7962:16:65","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":11644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7962:18:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"7944:36:65"},{"assignments":[11647],"declarations":[{"constant":false,"id":11647,"mutability":"mutable","name":"maxTokenCost","nameLocation":"7998:12:65","nodeType":"VariableDeclaration","scope":11690,"src":"7990:20:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11646,"name":"uint256","nodeType":"ElementaryTypeName","src":"7990:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11652,"initialValue":{"arguments":[{"id":11649,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11627,"src":"8032:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":11650,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11591,"src":"8039:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":11648,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11583,"src":"8013:18:65","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_contract$_IERC20_$4419_$_t_uint256_$returns$_t_uint256_$","typeString":"function (contract IERC20,uint256) view returns (uint256)"}},"id":11651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8013:34:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7990:57:65"},{"assignments":[11654],"declarations":[{"constant":false,"id":11654,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"8065:14:65","nodeType":"VariableDeclaration","scope":11690,"src":"8057:22:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11653,"name":"uint256","nodeType":"ElementaryTypeName","src":"8057:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11658,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11655,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11587,"src":"8082:6:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasPrice","nodeType":"MemberAccess","referencedDeclaration":11050,"src":"8082:15:65","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) view returns (uint256)"}},"id":11657,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8082:17:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8057:42:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11664,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":11660,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11229,"src":"8117:11:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11662,"indexExpression":{"id":11661,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11641,"src":"8129:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8117:20:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":11663,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8141:1:65","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8117:25:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f636b6564","id":11665,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8144:38:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""},"value":"DepositPaymaster: deposit not locked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""}],"id":11659,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8109:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8109:74:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11667,"nodeType":"ExpressionStatement","src":"8109:74:65"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":11669,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"8201:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11671,"indexExpression":{"id":11670,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11627,"src":"8210:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8201:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11673,"indexExpression":{"id":11672,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11641,"src":"8217:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8201:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":11674,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11647,"src":"8229:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8201:40:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f77","id":11676,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8243:35:65","typeDescriptions":{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""},"value":"DepositPaymaster: deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""}],"id":11668,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8193:7:65","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8193:86:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11678,"nodeType":"ExpressionStatement","src":"8193:86:65"},{"expression":{"components":[{"arguments":[{"id":11681,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11641,"src":"8308:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11682,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11627,"src":"8317:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":11683,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11654,"src":"8324:14:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11684,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11647,"src":"8340:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11685,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11591,"src":"8354:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":11679,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8297:3:65","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":11680,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"8297:10:65","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":11686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8297:65:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":11687,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8363:1:65","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":11688,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8296:69:65","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_rational_0_by_1_$","typeString":"tuple(bytes memory,int_const 0)"}},"functionReturnParameters":11598,"id":11689,"nodeType":"Return","src":"8289:76:65"}]},"documentation":{"id":11584,"nodeType":"StructuredDocumentation","src":"6978:288:65","text":" Validate the request:\n The sender should have enough deposit to pay the max possible cost.\n Note that the sender's balance is not checked. If it fails to pay from its balance,\n this deposit will be used to compensate the paymaster for the transaction."},"id":11691,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"7280:24:65","nodeType":"FunctionDefinition","overrides":{"id":11593,"nodeType":"OverrideSpecifier","overrides":[],"src":"7391:8:65"},"parameters":{"id":11592,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11587,"mutability":"mutable","name":"userOp","nameLocation":"7328:6:65","nodeType":"VariableDeclaration","scope":11691,"src":"7305:29:65","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11586,"nodeType":"UserDefinedTypeName","pathNode":{"id":11585,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7305:13:65"},"referencedDeclaration":10993,"src":"7305:13:65","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":11589,"mutability":"mutable","name":"userOpHash","nameLocation":"7344:10:65","nodeType":"VariableDeclaration","scope":11691,"src":"7336:18:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11588,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7336:7:65","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":11591,"mutability":"mutable","name":"maxCost","nameLocation":"7364:7:65","nodeType":"VariableDeclaration","scope":11691,"src":"7356:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11590,"name":"uint256","nodeType":"ElementaryTypeName","src":"7356:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7304:68:65"},"returnParameters":{"id":11598,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11595,"mutability":"mutable","name":"context","nameLocation":"7422:7:65","nodeType":"VariableDeclaration","scope":11691,"src":"7409:20:65","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":11594,"name":"bytes","nodeType":"ElementaryTypeName","src":"7409:5:65","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":11597,"mutability":"mutable","name":"validationData","nameLocation":"7439:14:65","nodeType":"VariableDeclaration","scope":11691,"src":"7431:22:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11596,"name":"uint256","nodeType":"ElementaryTypeName","src":"7431:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7408:46:65"},"scope":11779,"src":"7271:1101:65","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[7416],"body":{"id":11777,"nodeType":"Block","src":"8882:720:65","statements":[{"assignments":[11704,11707,11709,11711,11713],"declarations":[{"constant":false,"id":11704,"mutability":"mutable","name":"account","nameLocation":"8902:7:65","nodeType":"VariableDeclaration","scope":11777,"src":"8894:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11703,"name":"address","nodeType":"ElementaryTypeName","src":"8894:7:65","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11707,"mutability":"mutable","name":"token","nameLocation":"8918:5:65","nodeType":"VariableDeclaration","scope":11777,"src":"8911:12:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":11706,"nodeType":"UserDefinedTypeName","pathNode":{"id":11705,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"8911:6:65"},"referencedDeclaration":4419,"src":"8911:6:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":11709,"mutability":"mutable","name":"gasPricePostOp","nameLocation":"8933:14:65","nodeType":"VariableDeclaration","scope":11777,"src":"8925:22:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11708,"name":"uint256","nodeType":"ElementaryTypeName","src":"8925:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":11711,"mutability":"mutable","name":"maxTokenCost","nameLocation":"8957:12:65","nodeType":"VariableDeclaration","scope":11777,"src":"8949:20:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11710,"name":"uint256","nodeType":"ElementaryTypeName","src":"8949:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":11713,"mutability":"mutable","name":"maxCost","nameLocation":"8979:7:65","nodeType":"VariableDeclaration","scope":11777,"src":"8971:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11712,"name":"uint256","nodeType":"ElementaryTypeName","src":"8971:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11728,"initialValue":{"arguments":[{"id":11716,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11697,"src":"9001:7:65","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":11718,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9011:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11717,"name":"address","nodeType":"ElementaryTypeName","src":"9011:7:65","typeDescriptions":{}}},{"id":11719,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"9020:6:65","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},{"id":11721,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9028:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11720,"name":"uint256","nodeType":"ElementaryTypeName","src":"9028:7:65","typeDescriptions":{}}},{"id":11723,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9037:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11722,"name":"uint256","nodeType":"ElementaryTypeName","src":"9037:7:65","typeDescriptions":{}}},{"id":11725,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9046:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11724,"name":"uint256","nodeType":"ElementaryTypeName","src":"9046:7:65","typeDescriptions":{}}}],"id":11726,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"9010:44:65","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}],"expression":{"id":11714,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8990:3:65","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":11715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"8990:10:65","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":11727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8990:65:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_contract$_IERC20_$4419_$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(address payable,contract IERC20,uint256,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"8893:162:65"},{"assignments":[11730],"declarations":[{"constant":false,"id":11730,"mutability":"mutable","name":"actualTokenCost","nameLocation":"9132:15:65","nodeType":"VariableDeclaration","scope":11777,"src":"9124:23:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11729,"name":"uint256","nodeType":"ElementaryTypeName","src":"9124:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11741,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11740,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11735,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11731,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11699,"src":"9151:13:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11734,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11732,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11191,"src":"9167:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":11733,"name":"gasPricePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11709,"src":"9182:14:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9167:29:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9151:45:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11736,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9150:47:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":11737,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11711,"src":"9200:12:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9150:62:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":11739,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11713,"src":"9215:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9150:72:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9124:98:65"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":11745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11742,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11695,"src":"9236:4:65","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":11743,"name":"PostOpMode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10834,"src":"9244:10:65","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":11744,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"9244:25:65","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"9236:33:65","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":11766,"nodeType":"Block","src":"9408:135:65","statements":[{"expression":{"id":11764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":11758,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"9489:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11761,"indexExpression":{"id":11759,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11707,"src":"9498:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9489:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11762,"indexExpression":{"id":11760,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11704,"src":"9505:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9489:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":11763,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11730,"src":"9517:15:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9489:43:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11765,"nodeType":"ExpressionStatement","src":"9489:43:65"}]},"id":11767,"nodeType":"IfStatement","src":"9232:311:65","trueBody":{"id":11757,"nodeType":"Block","src":"9271:131:65","statements":[{"expression":{"arguments":[{"id":11749,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11704,"src":"9351:7:65","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":11752,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"9368:4:65","typeDescriptions":{"typeIdentifier":"t_contract$_BobaDepositPaymaster_$11779","typeString":"contract BobaDepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BobaDepositPaymaster_$11779","typeString":"contract BobaDepositPaymaster"}],"id":11751,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9360:7:65","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11750,"name":"address","nodeType":"ElementaryTypeName","src":"9360:7:65","typeDescriptions":{}}},"id":11753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9360:13:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":11754,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11730,"src":"9375:15:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":11746,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11707,"src":"9328:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":11748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"9328:22:65","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":11755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9328:63:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11756,"nodeType":"ExpressionStatement","src":"9328:63:65"}]}},{"expression":{"id":11775,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":11768,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11225,"src":"9552:8:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":11772,"indexExpression":{"id":11769,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11707,"src":"9561:5:65","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9552:15:65","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11773,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":11770,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"9568:5:65","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11771,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9568:7:65","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9552:24:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":11774,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11730,"src":"9580:15:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9552:43:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11776,"nodeType":"ExpressionStatement","src":"9552:43:65"}]},"documentation":{"id":11692,"nodeType":"StructuredDocumentation","src":"8378:400:65","text":" perform the post-operation to charge the sender for the gas.\n in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n this time in *postOpReverted* mode.\n In this mode, we use the deposit to pay (which we validated to be large enough)"},"id":11778,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"8792:7:65","nodeType":"FunctionDefinition","overrides":{"id":11701,"nodeType":"OverrideSpecifier","overrides":[],"src":"8873:8:65"},"parameters":{"id":11700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11695,"mutability":"mutable","name":"mode","nameLocation":"8811:4:65","nodeType":"VariableDeclaration","scope":11778,"src":"8800:15:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":11694,"nodeType":"UserDefinedTypeName","pathNode":{"id":11693,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"8800:10:65"},"referencedDeclaration":10834,"src":"8800:10:65","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":11697,"mutability":"mutable","name":"context","nameLocation":"8832:7:65","nodeType":"VariableDeclaration","scope":11778,"src":"8817:22:65","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":11696,"name":"bytes","nodeType":"ElementaryTypeName","src":"8817:5:65","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":11699,"mutability":"mutable","name":"actualGasCost","nameLocation":"8849:13:65","nodeType":"VariableDeclaration","scope":11778,"src":"8841:21:65","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11698,"name":"uint256","nodeType":"ElementaryTypeName","src":"8841:7:65","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8799:64:65"},"returnParameters":{"id":11702,"nodeType":"ParameterList","parameters":[],"src":"8882:0:65"},"scope":11779,"src":"8783:819:65","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":11780,"src":"1483:8121:65","usedErrors":[]}],"src":"137:9468:65"},"id":65},"contracts/samples/BobaVerifyingPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/BobaVerifyingPaymaster.sol","exportedSymbols":{"BasePaymaster":[7528],"BobaVerifyingPaymaster":[12200],"Context":[5151],"ECDSA":[5828],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Math":[6705],"Ownable":[2933],"Strings":[5467],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":12201,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":11781,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"139:24:66"},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":11782,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12201,"sourceUnit":7529,"src":"243:35:66","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":11783,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12201,"sourceUnit":5829,"src":"279:62:66","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":11785,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"914:13:66"},"id":11786,"nodeType":"InheritanceSpecifier","src":"914:13:66"}],"canonicalName":"BobaVerifyingPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":11784,"nodeType":"StructuredDocumentation","src":"343:535:66","text":" A sample paymaster that uses external service to decide whether to pay for the UserOp.\n The paymaster trusts an external signer to sign the transaction.\n The calling user must pass the UserOp to that external signer first, which performs\n whatever off-chain verification before signing the UserOp.\n Note that this signature is NOT a replacement for account-specific signature:\n - the paymaster checks a signature to agree to PAY for GAS.\n - the account checks a signature to prove identity and account ownership."},"fullyImplemented":true,"id":12200,"linearizedBaseContracts":[12200,7528,2933,5151,10861],"name":"BobaVerifyingPaymaster","nameLocation":"888:22:66","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11789,"libraryName":{"id":11787,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"941:5:66"},"nodeType":"UsingForDirective","src":"935:24:66","typeName":{"id":11788,"name":"bytes32","nodeType":"ElementaryTypeName","src":"951:7:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"global":false,"id":11793,"libraryName":{"id":11790,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"970:16:66"},"nodeType":"UsingForDirective","src":"964:41:66","typeName":{"id":11792,"nodeType":"UserDefinedTypeName","pathNode":{"id":11791,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"991:13:66"},"referencedDeclaration":10993,"src":"991:13:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"constant":true,"id":11796,"mutability":"constant","name":"VALID_TIMESTAMP_OFFSET","nameLocation":"1036:22:66","nodeType":"VariableDeclaration","scope":12200,"src":"1011:52:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11794,"name":"uint256","nodeType":"ElementaryTypeName","src":"1011:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3230","id":11795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1061:2:66","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"visibility":"private"},{"constant":true,"id":11799,"mutability":"constant","name":"SIGNATURE_OFFSET","nameLocation":"1095:16:66","nodeType":"VariableDeclaration","scope":12200,"src":"1070:46:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11797,"name":"uint256","nodeType":"ElementaryTypeName","src":"1070:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3834","id":11798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1114:2:66","typeDescriptions":{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"},"value":"84"},"visibility":"private"},{"constant":false,"functionSelector":"23d9ac9b","id":11801,"mutability":"immutable","name":"verifyingSigner","nameLocation":"1148:15:66","nodeType":"VariableDeclaration","scope":12200,"src":"1123:40:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11800,"name":"address","nodeType":"ElementaryTypeName","src":"1123:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"functionSelector":"7d3c1162","id":11803,"mutability":"mutable","name":"bobaDepositPaymaster","nameLocation":"1184:20:66","nodeType":"VariableDeclaration","scope":12200,"src":"1169:35:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11802,"name":"address","nodeType":"ElementaryTypeName","src":"1169:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"functionSelector":"bab46259","id":11805,"mutability":"mutable","name":"approvedToken","nameLocation":"1225:13:66","nodeType":"VariableDeclaration","scope":12200,"src":"1210:28:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11804,"name":"address","nodeType":"ElementaryTypeName","src":"1210:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":true,"functionSelector":"b02f786e","id":11813,"mutability":"constant","name":"APPROVE_FUNCTION_SELECTOR","nameLocation":"1268:25:66","nodeType":"VariableDeclaration","scope":12200,"src":"1245:96:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11806,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1245:6:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"arguments":[{"arguments":[{"hexValue":"617070726f766528616464726573732c75696e7432353629","id":11810,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1313:26:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba","typeString":"literal_string \"approve(address,uint256)\""},"value":"approve(address,uint256)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba","typeString":"literal_string \"approve(address,uint256)\""}],"id":11809,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1303:9:66","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":11811,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1303:37:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11808,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1296:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":11807,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1296:6:66","typeDescriptions":{}}},"id":11812,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1296:45:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"public"},{"constant":true,"functionSelector":"56fd76da","id":11821,"mutability":"constant","name":"DEPOSIT_FOR_FUNCTION_SELECTOR","nameLocation":"1370:29:66","nodeType":"VariableDeclaration","scope":12200,"src":"1347:114:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11814,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1347:6:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"arguments":[{"arguments":[{"hexValue":"6164644465706f736974466f7228616464726573732c616464726573732c75696e7432353629","id":11818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1419:40:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf","typeString":"literal_string \"addDepositFor(address,address,uint256)\""},"value":"addDepositFor(address,address,uint256)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf","typeString":"literal_string \"addDepositFor(address,address,uint256)\""}],"id":11817,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1409:9:66","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":11819,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1409:51:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11816,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1402:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":11815,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1402:6:66","typeDescriptions":{}}},"id":11820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1402:59:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"public"},{"body":{"id":11848,"nodeType":"Block","src":"1613:145:66","statements":[{"expression":{"id":11838,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11836,"name":"verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11801,"src":"1623:15:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11837,"name":"_verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11826,"src":"1641:16:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1623:34:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11839,"nodeType":"ExpressionStatement","src":"1623:34:66"},{"expression":{"id":11842,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11840,"name":"bobaDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11803,"src":"1667:20:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11841,"name":"_bobaDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11828,"src":"1690:21:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1667:44:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11843,"nodeType":"ExpressionStatement","src":"1667:44:66"},{"expression":{"id":11846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11844,"name":"approvedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11805,"src":"1721:13:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11845,"name":"_approvedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11830,"src":"1737:14:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1721:30:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11847,"nodeType":"ExpressionStatement","src":"1721:30:66"}]},"id":11849,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":11833,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11824,"src":"1600:11:66","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":11834,"kind":"baseConstructorSpecifier","modifierName":{"id":11832,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1586:13:66"},"nodeType":"ModifierInvocation","src":"1586:26:66"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":11831,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11824,"mutability":"mutable","name":"_entryPoint","nameLocation":"1492:11:66","nodeType":"VariableDeclaration","scope":11849,"src":"1480:23:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":11823,"nodeType":"UserDefinedTypeName","pathNode":{"id":11822,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1480:11:66"},"referencedDeclaration":10807,"src":"1480:11:66","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":11826,"mutability":"mutable","name":"_verifyingSigner","nameLocation":"1513:16:66","nodeType":"VariableDeclaration","scope":11849,"src":"1505:24:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11825,"name":"address","nodeType":"ElementaryTypeName","src":"1505:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11828,"mutability":"mutable","name":"_bobaDepositPaymaster","nameLocation":"1539:21:66","nodeType":"VariableDeclaration","scope":11849,"src":"1531:29:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11827,"name":"address","nodeType":"ElementaryTypeName","src":"1531:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":11830,"mutability":"mutable","name":"_approvedToken","nameLocation":"1570:14:66","nodeType":"VariableDeclaration","scope":11849,"src":"1562:22:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11829,"name":"address","nodeType":"ElementaryTypeName","src":"1562:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1479:106:66"},"returnParameters":{"id":11835,"nodeType":"ParameterList","parameters":[],"src":"1613:0:66"},"scope":12200,"src":"1468:290:66","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"constant":false,"functionSelector":"9c90b443","id":11853,"mutability":"mutable","name":"senderNonce","nameLocation":"1799:11:66","nodeType":"VariableDeclaration","scope":12200,"src":"1764:46:66","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":11852,"keyType":{"id":11850,"name":"address","nodeType":"ElementaryTypeName","src":"1772:7:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1764:27:66","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":11851,"name":"uint256","nodeType":"ElementaryTypeName","src":"1783:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":11867,"nodeType":"Block","src":"1903:643:66","statements":[{"assignments":[11862],"declarations":[{"constant":false,"id":11862,"mutability":"mutable","name":"pnd","nameLocation":"1997:3:66","nodeType":"VariableDeclaration","scope":11867,"src":"1982:18:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":11861,"name":"bytes","nodeType":"ElementaryTypeName","src":"1982:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":11865,"initialValue":{"expression":{"id":11863,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11856,"src":"2003:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11864,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"2003:23:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"1982:44:66"},{"AST":{"nodeType":"YulBlock","src":"2288:252:66","statements":[{"nodeType":"YulVariableDeclaration","src":"2302:17:66","value":{"name":"userOp","nodeType":"YulIdentifier","src":"2313:6:66"},"variables":[{"name":"ofs","nodeType":"YulTypedName","src":"2306:3:66","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2332:40:66","value":{"arguments":[{"arguments":[{"name":"pnd.offset","nodeType":"YulIdentifier","src":"2351:10:66"},{"name":"ofs","nodeType":"YulIdentifier","src":"2363:3:66"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2347:3:66"},"nodeType":"YulFunctionCall","src":"2347:20:66"},{"kind":"number","nodeType":"YulLiteral","src":"2369:2:66","type":"","value":"32"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2343:3:66"},"nodeType":"YulFunctionCall","src":"2343:29:66"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"2336:3:66","type":""}]},{"nodeType":"YulAssignment","src":"2385:18:66","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2398:4:66","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2392:5:66"},"nodeType":"YulFunctionCall","src":"2392:11:66"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"2385:3:66"}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2423:4:66","type":"","value":"0x40"},{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"2433:3:66"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2442:3:66"},{"kind":"number","nodeType":"YulLiteral","src":"2447:2:66","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2438:3:66"},"nodeType":"YulFunctionCall","src":"2438:12:66"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2429:3:66"},"nodeType":"YulFunctionCall","src":"2429:22:66"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2416:6:66"},"nodeType":"YulFunctionCall","src":"2416:36:66"},"nodeType":"YulExpressionStatement","src":"2416:36:66"},{"expression":{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"2472:3:66"},{"name":"len","nodeType":"YulIdentifier","src":"2477:3:66"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2465:6:66"},"nodeType":"YulFunctionCall","src":"2465:16:66"},"nodeType":"YulExpressionStatement","src":"2465:16:66"},{"expression":{"arguments":[{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"2511:3:66"},{"kind":"number","nodeType":"YulLiteral","src":"2516:2:66","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2507:3:66"},"nodeType":"YulFunctionCall","src":"2507:12:66"},{"name":"ofs","nodeType":"YulIdentifier","src":"2521:3:66"},{"name":"len","nodeType":"YulIdentifier","src":"2526:3:66"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2494:12:66"},"nodeType":"YulFunctionCall","src":"2494:36:66"},"nodeType":"YulExpressionStatement","src":"2494:36:66"}]},"evmVersion":"london","externalReferences":[{"declaration":11862,"isOffset":true,"isSlot":false,"src":"2351:10:66","suffix":"offset","valueSize":1},{"declaration":11859,"isOffset":false,"isSlot":false,"src":"2385:3:66","valueSize":1},{"declaration":11859,"isOffset":false,"isSlot":false,"src":"2433:3:66","valueSize":1},{"declaration":11859,"isOffset":false,"isSlot":false,"src":"2472:3:66","valueSize":1},{"declaration":11859,"isOffset":false,"isSlot":false,"src":"2511:3:66","valueSize":1},{"declaration":11856,"isOffset":false,"isSlot":false,"src":"2313:6:66","valueSize":1}],"id":11866,"nodeType":"InlineAssembly","src":"2279:261:66"}]},"id":11868,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"1826:4:66","nodeType":"FunctionDefinition","parameters":{"id":11857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11856,"mutability":"mutable","name":"userOp","nameLocation":"1854:6:66","nodeType":"VariableDeclaration","scope":11868,"src":"1831:29:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11855,"nodeType":"UserDefinedTypeName","pathNode":{"id":11854,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1831:13:66"},"referencedDeclaration":10993,"src":"1831:13:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1830:31:66"},"returnParameters":{"id":11860,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11859,"mutability":"mutable","name":"ret","nameLocation":"1898:3:66","nodeType":"VariableDeclaration","scope":11868,"src":"1885:16:66","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":11858,"name":"bytes","nodeType":"ElementaryTypeName","src":"1885:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1884:18:66"},"scope":12200,"src":"1817:729:66","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":11903,"nodeType":"Block","src":"3081:344:66","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":11885,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11872,"src":"3229:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":11884,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11868,"src":"3224:4:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":11886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3224:12:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":11887,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3254:5:66","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":11888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"3254:13:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":11891,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3293:4:66","typeDescriptions":{"typeIdentifier":"t_contract$_BobaVerifyingPaymaster_$12200","typeString":"contract BobaVerifyingPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BobaVerifyingPaymaster_$12200","typeString":"contract BobaVerifyingPaymaster"}],"id":11890,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3285:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11889,"name":"address","nodeType":"ElementaryTypeName","src":"3285:7:66","typeDescriptions":{}}},"id":11892,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3285:13:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":11893,"name":"senderNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11853,"src":"3316:11:66","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11897,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11894,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11872,"src":"3328:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"3328:16:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":11896,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3328:18:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3316:31:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":11898,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11874,"src":"3365:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":11899,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11876,"src":"3393:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"expression":{"id":11882,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3196:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":11883,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"3196:10:66","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":11900,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3196:221:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":11881,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3186:9:66","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":11901,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3186:232:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":11880,"id":11902,"nodeType":"Return","src":"3179:239:66"}]},"documentation":{"id":11869,"nodeType":"StructuredDocumentation","src":"2553:403:66","text":" return the hash we're going to sign off-chain (and validate on-chain)\n this method is called by the off-chain service, to sign the request.\n it is called on-chain from the validatePaymasterUserOp, to validate the signature.\n note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\",\n which will carry the signature itself."},"functionSelector":"94e1fc19","id":11904,"implemented":true,"kind":"function","modifiers":[],"name":"getHash","nameLocation":"2970:7:66","nodeType":"FunctionDefinition","parameters":{"id":11877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11872,"mutability":"mutable","name":"userOp","nameLocation":"3001:6:66","nodeType":"VariableDeclaration","scope":11904,"src":"2978:29:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11871,"nodeType":"UserDefinedTypeName","pathNode":{"id":11870,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2978:13:66"},"referencedDeclaration":10993,"src":"2978:13:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":11874,"mutability":"mutable","name":"validUntil","nameLocation":"3016:10:66","nodeType":"VariableDeclaration","scope":11904,"src":"3009:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":11873,"name":"uint48","nodeType":"ElementaryTypeName","src":"3009:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":11876,"mutability":"mutable","name":"validAfter","nameLocation":"3035:10:66","nodeType":"VariableDeclaration","scope":11904,"src":"3028:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":11875,"name":"uint48","nodeType":"ElementaryTypeName","src":"3028:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2977:69:66"},"returnParameters":{"id":11880,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11879,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11904,"src":"3072:7:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11878,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3072:7:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3071:9:66"},"scope":12200,"src":"2961:464:66","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[7373],"body":{"id":12003,"nodeType":"Block","src":"3956:1217:66","statements":[{"expression":{"components":[{"id":11920,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11912,"src":"3967:15:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11921,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3966:17:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11922,"nodeType":"ExpressionStatement","src":"3966:17:66"},{"assignments":[11924,11926,11928],"declarations":[{"constant":false,"id":11924,"mutability":"mutable","name":"validUntil","nameLocation":"4002:10:66","nodeType":"VariableDeclaration","scope":12003,"src":"3995:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":11923,"name":"uint48","nodeType":"ElementaryTypeName","src":"3995:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":11926,"mutability":"mutable","name":"validAfter","nameLocation":"4021:10:66","nodeType":"VariableDeclaration","scope":12003,"src":"4014:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":11925,"name":"uint48","nodeType":"ElementaryTypeName","src":"4014:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":11928,"mutability":"mutable","name":"signature","nameLocation":"4048:9:66","nodeType":"VariableDeclaration","scope":12003,"src":"4033:24:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":11927,"name":"bytes","nodeType":"ElementaryTypeName","src":"4033:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":11933,"initialValue":{"arguments":[{"expression":{"id":11930,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11908,"src":"4083:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"4083:23:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11929,"name":"parsePaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12039,"src":"4061:21:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_uint48_$_t_uint48_$_t_bytes_calldata_ptr_$","typeString":"function (bytes calldata) pure returns (uint48,uint48,bytes calldata)"}},"id":11932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4061:46:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$_t_bytes_calldata_ptr_$","typeString":"tuple(uint48,uint48,bytes calldata)"}},"nodeType":"VariableDeclarationStatement","src":"3994:113:66"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":11943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11938,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11935,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11928,"src":"4328:9:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":11936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4328:16:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3634","id":11937,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4348:2:66","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"4328:22:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":11939,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11928,"src":"4354:9:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":11940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4354:16:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3635","id":11941,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4374:2:66","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"},"src":"4354:22:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4328:48:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964207369676e6174757265206c656e67746820696e207061796d6173746572416e6444617461","id":11944,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4378:66:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7","typeString":"literal_string \"VerifyingPaymaster: invalid signature length in paymasterAndData\""},"value":"VerifyingPaymaster: invalid signature length in paymasterAndData"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7","typeString":"literal_string \"VerifyingPaymaster: invalid signature length in paymasterAndData\""}],"id":11934,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4320:7:66","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11945,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4320:125:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11946,"nodeType":"ExpressionStatement","src":"4320:125:66"},{"assignments":[11948],"declarations":[{"constant":false,"id":11948,"mutability":"mutable","name":"hash","nameLocation":"4463:4:66","nodeType":"VariableDeclaration","scope":12003,"src":"4455:12:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11947,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4455:7:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11957,"initialValue":{"arguments":[{"arguments":[{"id":11952,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11908,"src":"4507:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":11953,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11924,"src":"4515:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":11954,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11926,"src":"4527:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":11951,"name":"getHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11904,"src":"4499:7:66","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_uint48_$_t_uint48_$returns$_t_bytes32_$","typeString":"function (struct UserOperation calldata,uint48,uint48) view returns (bytes32)"}},"id":11955,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4499:39:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":11949,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5828,"src":"4470:5:66","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ECDSA_$5828_$","typeString":"type(library ECDSA)"}},"id":11950,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"4470:28:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":11956,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4470:69:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4455:84:66"},{"expression":{"id":11963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4549:33:66","subExpression":{"baseExpression":{"id":11958,"name":"senderNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11853,"src":"4549:11:66","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":11962,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11959,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11908,"src":"4561:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11960,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"4561:16:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":11961,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4561:18:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4549:31:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11964,"nodeType":"ExpressionStatement","src":"4549:33:66"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11965,"name":"verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11801,"src":"4671:15:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":11968,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11948,"src":"4704:4:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":11969,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11928,"src":"4710:9:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":11966,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5828,"src":"4690:5:66","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ECDSA_$5828_$","typeString":"type(library ECDSA)"}},"id":11967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"4690:13:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":11970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4690:30:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4671:49:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11981,"nodeType":"IfStatement","src":"4667:139:66","trueBody":{"id":11980,"nodeType":"Block","src":"4722:84:66","statements":[{"expression":{"components":[{"hexValue":"","id":11972,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4744:2:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"arguments":[{"hexValue":"74727565","id":11974,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4767:4:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":11975,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11924,"src":"4772:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":11976,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11926,"src":"4783:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":11973,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"4747:19:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":11977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4747:47:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11978,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4743:52:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$_t_uint256_$","typeString":"tuple(literal_string \"\",uint256)"}},"functionReturnParameters":11919,"id":11979,"nodeType":"Return","src":"4736:59:66"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":11991,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":11984,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11908,"src":"4849:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":10978,"src":"4849:15:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11983,"name":"_validateCallDataApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12118,"src":"4824:24:66","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_calldata_ptr_$returns$_t_bool_$","typeString":"function (bytes calldata) view returns (bool)"}},"id":11986,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4824:41:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"arguments":[{"expression":{"id":11988,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11908,"src":"4894:6:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":11989,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":10978,"src":"4894:15:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":11987,"name":"_validateCallDataDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12199,"src":"4869:24:66","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_calldata_ptr_$returns$_t_bool_$","typeString":"function (bytes calldata) view returns (bool)"}},"id":11990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4869:41:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4824:86:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964206f7065726174696f6e","id":11992,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4912:39:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_d26e0daa1e3de06cf3b41f98f2e7efd5b683a0ee78ec78511a62dcf2146f778c","typeString":"literal_string \"VerifyingPaymaster: invalid operation\""},"value":"VerifyingPaymaster: invalid operation"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d26e0daa1e3de06cf3b41f98f2e7efd5b683a0ee78ec78511a62dcf2146f778c","typeString":"literal_string \"VerifyingPaymaster: invalid operation\""}],"id":11982,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4816:7:66","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":11993,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4816:136:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11994,"nodeType":"ExpressionStatement","src":"4816:136:66"},{"expression":{"components":[{"hexValue":"","id":11995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5114:2:66","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"arguments":[{"hexValue":"66616c7365","id":11997,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5137:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"id":11998,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11924,"src":"5143:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":11999,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11926,"src":"5154:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":11996,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"5117:19:66","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":12000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5117:48:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12001,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5113:53:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$_t_uint256_$","typeString":"tuple(literal_string \"\",uint256)"}},"functionReturnParameters":11919,"id":12002,"nodeType":"Return","src":"5106:60:66"}]},"documentation":{"id":11905,"nodeType":"StructuredDocumentation","src":"3431:329:66","text":" verify our external signer signed this request.\n the \"paymasterAndData\" is expected to be the paymaster and a signature over the entire request params\n paymasterAndData[:20] : address(this)\n paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\n paymasterAndData[84:] : signature"},"id":12004,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"3774:24:66","nodeType":"FunctionDefinition","overrides":{"id":11914,"nodeType":"OverrideSpecifier","overrides":[],"src":"3892:8:66"},"parameters":{"id":11913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11908,"mutability":"mutable","name":"userOp","nameLocation":"3822:6:66","nodeType":"VariableDeclaration","scope":12004,"src":"3799:29:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":11907,"nodeType":"UserDefinedTypeName","pathNode":{"id":11906,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3799:13:66"},"referencedDeclaration":10993,"src":"3799:13:66","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":11910,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12004,"src":"3830:7:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11909,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3830:7:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":11912,"mutability":"mutable","name":"requiredPreFund","nameLocation":"3862:15:66","nodeType":"VariableDeclaration","scope":12004,"src":"3854:23:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11911,"name":"uint256","nodeType":"ElementaryTypeName","src":"3854:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3798:80:66"},"returnParameters":{"id":11919,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11916,"mutability":"mutable","name":"context","nameLocation":"3923:7:66","nodeType":"VariableDeclaration","scope":12004,"src":"3910:20:66","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":11915,"name":"bytes","nodeType":"ElementaryTypeName","src":"3910:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":11918,"mutability":"mutable","name":"validationData","nameLocation":"3940:14:66","nodeType":"VariableDeclaration","scope":12004,"src":"3932:22:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11917,"name":"uint256","nodeType":"ElementaryTypeName","src":"3932:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3909:46:66"},"scope":12200,"src":"3765:1408:66","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12038,"nodeType":"Block","src":"5327:187:66","statements":[{"expression":{"id":12030,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":12015,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12009,"src":"5338:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":12016,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12011,"src":"5350:10:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"id":12017,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"5337:24:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$","typeString":"tuple(uint48,uint48)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":12020,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12006,"src":"5375:16:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"id":12022,"name":"SIGNATURE_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11799,"src":"5415:16:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"5375:57:66","startExpression":{"id":12021,"name":"VALID_TIMESTAMP_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11796,"src":"5392:22:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},{"components":[{"id":12025,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5434:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":12024,"name":"uint48","nodeType":"ElementaryTypeName","src":"5434:6:66","typeDescriptions":{}}},{"id":12027,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5442:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":12026,"name":"uint48","nodeType":"ElementaryTypeName","src":"5442:6:66","typeDescriptions":{}}}],"id":12028,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5433:16:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"},{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}],"expression":{"id":12018,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5364:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5364:10:66","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12029,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5364:86:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$","typeString":"tuple(uint48,uint48)"}},"src":"5337:113:66","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12031,"nodeType":"ExpressionStatement","src":"5337:113:66"},{"expression":{"id":12036,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12032,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12013,"src":"5460:9:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":12033,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12006,"src":"5472:16:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"5472:35:66","startExpression":{"id":12034,"name":"SIGNATURE_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11799,"src":"5489:16:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"src":"5460:47:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12037,"nodeType":"ExpressionStatement","src":"5460:47:66"}]},"functionSelector":"94d4ad60","id":12039,"implemented":true,"kind":"function","modifiers":[],"name":"parsePaymasterAndData","nameLocation":"5188:21:66","nodeType":"FunctionDefinition","parameters":{"id":12007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12006,"mutability":"mutable","name":"paymasterAndData","nameLocation":"5225:16:66","nodeType":"VariableDeclaration","scope":12039,"src":"5210:31:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12005,"name":"bytes","nodeType":"ElementaryTypeName","src":"5210:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5209:33:66"},"returnParameters":{"id":12014,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12009,"mutability":"mutable","name":"validUntil","nameLocation":"5270:10:66","nodeType":"VariableDeclaration","scope":12039,"src":"5263:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":12008,"name":"uint48","nodeType":"ElementaryTypeName","src":"5263:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":12011,"mutability":"mutable","name":"validAfter","nameLocation":"5289:10:66","nodeType":"VariableDeclaration","scope":12039,"src":"5282:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":12010,"name":"uint48","nodeType":"ElementaryTypeName","src":"5282:6:66","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":12013,"mutability":"mutable","name":"signature","nameLocation":"5316:9:66","nodeType":"VariableDeclaration","scope":12039,"src":"5301:24:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12012,"name":"bytes","nodeType":"ElementaryTypeName","src":"5301:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5262:64:66"},"scope":12200,"src":"5179:335:66","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":12117,"nodeType":"Block","src":"5609:558:66","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12049,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12046,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12041,"src":"5648:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12047,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5648:17:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"323238","id":12048,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5669:3:66","typeDescriptions":{"typeIdentifier":"t_rational_228_by_1","typeString":"int_const 228"},"value":"228"},"src":"5648:24:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12052,"nodeType":"IfStatement","src":"5644:42:66","trueBody":{"expression":{"hexValue":"66616c7365","id":12050,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5681:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12045,"id":12051,"nodeType":"Return","src":"5674:12:66"}},{"assignments":[12054],"declarations":[{"constant":false,"id":12054,"mutability":"mutable","name":"funcSelector","nameLocation":"5703:12:66","nodeType":"VariableDeclaration","scope":12117,"src":"5696:19:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":12053,"name":"bytes4","nodeType":"ElementaryTypeName","src":"5696:6:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":12062,"initialValue":{"arguments":[{"baseExpression":{"id":12057,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12041,"src":"5725:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"313336","id":12059,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5740:3:66","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},"id":12060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"5725:19:66","startExpression":{"hexValue":"313332","id":12058,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5736:3:66","typeDescriptions":{"typeIdentifier":"t_rational_132_by_1","typeString":"int_const 132"},"value":"132"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":12056,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5718:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":12055,"name":"bytes4","nodeType":"ElementaryTypeName","src":"5718:6:66","typeDescriptions":{}}},"id":12061,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5718:27:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"5696:49:66"},{"assignments":[12064],"declarations":[{"constant":false,"id":12064,"mutability":"mutable","name":"destData","nameLocation":"5770:8:66","nodeType":"VariableDeclaration","scope":12117,"src":"5755:23:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12063,"name":"bytes","nodeType":"ElementaryTypeName","src":"5755:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12069,"initialValue":{"baseExpression":{"id":12065,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12041,"src":"5781:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3336","id":12067,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5794:2:66","typeDescriptions":{"typeIdentifier":"t_rational_36_by_1","typeString":"int_const 36"},"value":"36"},"id":12068,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"5781:16:66","startExpression":{"hexValue":"34","id":12066,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5792:1:66","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"5755:42:66"},{"assignments":[12071],"declarations":[{"constant":false,"id":12071,"mutability":"mutable","name":"dest","nameLocation":"5815:4:66","nodeType":"VariableDeclaration","scope":12117,"src":"5807:12:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12070,"name":"address","nodeType":"ElementaryTypeName","src":"5807:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12079,"initialValue":{"arguments":[{"id":12074,"name":"destData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12064,"src":"5833:8:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":12076,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5844:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12075,"name":"address","nodeType":"ElementaryTypeName","src":"5844:7:66","typeDescriptions":{}}}],"id":12077,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5843:9:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}],"expression":{"id":12072,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5822:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12073,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5822:10:66","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12078,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5822:31:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"VariableDeclarationStatement","src":"5807:46:66"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12080,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12071,"src":"5867:4:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":12081,"name":"approvedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11805,"src":"5875:13:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5867:21:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12085,"nodeType":"IfStatement","src":"5863:39:66","trueBody":{"expression":{"hexValue":"66616c7365","id":12083,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5897:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12045,"id":12084,"nodeType":"Return","src":"5890:12:66"}},{"assignments":[12087],"declarations":[{"constant":false,"id":12087,"mutability":"mutable","name":"approveParam","nameLocation":"5925:12:66","nodeType":"VariableDeclaration","scope":12117,"src":"5912:25:66","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":12086,"name":"bytes","nodeType":"ElementaryTypeName","src":"5912:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12092,"initialValue":{"baseExpression":{"id":12088,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12041,"src":"5940:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"323030","id":12090,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5955:3:66","typeDescriptions":{"typeIdentifier":"t_rational_200_by_1","typeString":"int_const 200"},"value":"200"},"id":12091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"5940:19:66","startExpression":{"hexValue":"313336","id":12089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5951:3:66","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"5912:47:66"},{"assignments":[12094,null],"declarations":[{"constant":false,"id":12094,"mutability":"mutable","name":"spender","nameLocation":"5978:7:66","nodeType":"VariableDeclaration","scope":12117,"src":"5970:15:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12093,"name":"address","nodeType":"ElementaryTypeName","src":"5970:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},null],"id":12104,"initialValue":{"arguments":[{"id":12097,"name":"approveParam","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12087,"src":"6002:12:66","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":12099,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6017:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12098,"name":"address","nodeType":"ElementaryTypeName","src":"6017:7:66","typeDescriptions":{}}},{"id":12101,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6026:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12100,"name":"uint256","nodeType":"ElementaryTypeName","src":"6026:7:66","typeDescriptions":{}}}],"id":12102,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6016:18:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(uint256))"}],"expression":{"id":12095,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5991:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12096,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5991:10:66","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5991:44:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_uint256_$","typeString":"tuple(address payable,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"5969:66:66"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":12111,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":12107,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12105,"name":"funcSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12054,"src":"6049:12:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12106,"name":"APPROVE_FUNCTION_SELECTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11813,"src":"6065:25:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"6049:41:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12110,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12108,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12094,"src":"6094:7:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12109,"name":"bobaDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11803,"src":"6105:20:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6094:31:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6049:76:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12114,"nodeType":"IfStatement","src":"6045:93:66","trueBody":{"expression":{"hexValue":"74727565","id":12112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6134:4:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":12045,"id":12113,"nodeType":"Return","src":"6127:11:66"}},{"expression":{"hexValue":"66616c7365","id":12115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6155:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12045,"id":12116,"nodeType":"Return","src":"6148:12:66"}]},"id":12118,"implemented":true,"kind":"function","modifiers":[],"name":"_validateCallDataApprove","nameLocation":"5529:24:66","nodeType":"FunctionDefinition","parameters":{"id":12042,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12041,"mutability":"mutable","name":"opCallData","nameLocation":"5569:10:66","nodeType":"VariableDeclaration","scope":12118,"src":"5554:25:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12040,"name":"bytes","nodeType":"ElementaryTypeName","src":"5554:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5553:27:66"},"returnParameters":{"id":12045,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12044,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12118,"src":"5603:4:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12043,"name":"bool","nodeType":"ElementaryTypeName","src":"5603:4:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5602:6:66"},"scope":12200,"src":"5520:647:66","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12198,"nodeType":"Block","src":"6262:569:66","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12125,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12120,"src":"6301:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12126,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6301:17:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"323630","id":12127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6322:3:66","typeDescriptions":{"typeIdentifier":"t_rational_260_by_1","typeString":"int_const 260"},"value":"260"},"src":"6301:24:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12131,"nodeType":"IfStatement","src":"6297:42:66","trueBody":{"expression":{"hexValue":"66616c7365","id":12129,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6334:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12124,"id":12130,"nodeType":"Return","src":"6327:12:66"}},{"assignments":[12133],"declarations":[{"constant":false,"id":12133,"mutability":"mutable","name":"funcSelector","nameLocation":"6356:12:66","nodeType":"VariableDeclaration","scope":12198,"src":"6349:19:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":12132,"name":"bytes4","nodeType":"ElementaryTypeName","src":"6349:6:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":12141,"initialValue":{"arguments":[{"baseExpression":{"id":12136,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12120,"src":"6378:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"313336","id":12138,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6393:3:66","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},"id":12139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"6378:19:66","startExpression":{"hexValue":"313332","id":12137,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6389:3:66","typeDescriptions":{"typeIdentifier":"t_rational_132_by_1","typeString":"int_const 132"},"value":"132"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":12135,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6371:6:66","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":12134,"name":"bytes4","nodeType":"ElementaryTypeName","src":"6371:6:66","typeDescriptions":{}}},"id":12140,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6371:27:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"6349:49:66"},{"assignments":[12143],"declarations":[{"constant":false,"id":12143,"mutability":"mutable","name":"destData","nameLocation":"6423:8:66","nodeType":"VariableDeclaration","scope":12198,"src":"6408:23:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12142,"name":"bytes","nodeType":"ElementaryTypeName","src":"6408:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12148,"initialValue":{"baseExpression":{"id":12144,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12120,"src":"6434:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3336","id":12146,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6447:2:66","typeDescriptions":{"typeIdentifier":"t_rational_36_by_1","typeString":"int_const 36"},"value":"36"},"id":12147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"6434:16:66","startExpression":{"hexValue":"34","id":12145,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6445:1:66","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"6408:42:66"},{"assignments":[12150],"declarations":[{"constant":false,"id":12150,"mutability":"mutable","name":"dest","nameLocation":"6468:4:66","nodeType":"VariableDeclaration","scope":12198,"src":"6460:12:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12149,"name":"address","nodeType":"ElementaryTypeName","src":"6460:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12158,"initialValue":{"arguments":[{"id":12153,"name":"destData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12143,"src":"6486:8:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":12155,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6497:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12154,"name":"address","nodeType":"ElementaryTypeName","src":"6497:7:66","typeDescriptions":{}}}],"id":12156,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6496:9:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}],"expression":{"id":12151,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6475:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12152,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"6475:10:66","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6475:31:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"VariableDeclarationStatement","src":"6460:46:66"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12159,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12150,"src":"6520:4:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":12160,"name":"bobaDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11803,"src":"6528:20:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6520:28:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12164,"nodeType":"IfStatement","src":"6516:46:66","trueBody":{"expression":{"hexValue":"66616c7365","id":12162,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6557:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12124,"id":12163,"nodeType":"Return","src":"6550:12:66"}},{"assignments":[12166],"declarations":[{"constant":false,"id":12166,"mutability":"mutable","name":"depositParam","nameLocation":"6585:12:66","nodeType":"VariableDeclaration","scope":12198,"src":"6572:25:66","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":12165,"name":"bytes","nodeType":"ElementaryTypeName","src":"6572:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12171,"initialValue":{"baseExpression":{"id":12167,"name":"opCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12120,"src":"6600:10:66","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"323332","id":12169,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6615:3:66","typeDescriptions":{"typeIdentifier":"t_rational_232_by_1","typeString":"int_const 232"},"value":"232"},"id":12170,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"6600:19:66","startExpression":{"hexValue":"313336","id":12168,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6611:3:66","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"nodeType":"VariableDeclarationStatement","src":"6572:47:66"},{"assignments":[12173,null,null],"declarations":[{"constant":false,"id":12173,"mutability":"mutable","name":"token","nameLocation":"6638:5:66","nodeType":"VariableDeclaration","scope":12198,"src":"6630:13:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12172,"name":"address","nodeType":"ElementaryTypeName","src":"6630:7:66","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},null,null],"id":12185,"initialValue":{"arguments":[{"id":12176,"name":"depositParam","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12166,"src":"6662:12:66","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":12178,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6677:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12177,"name":"address","nodeType":"ElementaryTypeName","src":"6677:7:66","typeDescriptions":{}}},{"id":12180,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6686:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12179,"name":"address","nodeType":"ElementaryTypeName","src":"6686:7:66","typeDescriptions":{}}},{"id":12182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6695:7:66","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12181,"name":"uint256","nodeType":"ElementaryTypeName","src":"6695:7:66","typeDescriptions":{}}}],"id":12183,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6676:27:66","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(address),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(address),type(uint256))"}],"expression":{"id":12174,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6651:3:66","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12175,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"6651:10:66","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12184,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6651:53:66","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_address_payable_$_t_uint256_$","typeString":"tuple(address payable,address payable,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6629:75:66"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":12192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":12188,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12186,"name":"funcSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12133,"src":"6718:12:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12187,"name":"DEPOSIT_FOR_FUNCTION_SELECTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11821,"src":"6734:29:66","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"6718:45:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12189,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12173,"src":"6767:5:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12190,"name":"approvedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11805,"src":"6776:13:66","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6767:22:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6718:71:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12195,"nodeType":"IfStatement","src":"6714:88:66","trueBody":{"expression":{"hexValue":"74727565","id":12193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6798:4:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":12124,"id":12194,"nodeType":"Return","src":"6791:11:66"}},{"expression":{"hexValue":"66616c7365","id":12196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6819:5:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":12124,"id":12197,"nodeType":"Return","src":"6812:12:66"}]},"id":12199,"implemented":true,"kind":"function","modifiers":[],"name":"_validateCallDataDeposit","nameLocation":"6182:24:66","nodeType":"FunctionDefinition","parameters":{"id":12121,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12120,"mutability":"mutable","name":"opCallData","nameLocation":"6222:10:66","nodeType":"VariableDeclaration","scope":12199,"src":"6207:25:66","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12119,"name":"bytes","nodeType":"ElementaryTypeName","src":"6207:5:66","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6206:27:66"},"returnParameters":{"id":12124,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12123,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12199,"src":"6256:4:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12122,"name":"bool","nodeType":"ElementaryTypeName","src":"6256:4:66","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6255:6:66"},"scope":12200,"src":"6173:658:66","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":12201,"src":"879:5955:66","usedErrors":[]}],"src":"139:6696:66"},"id":66},"contracts/samples/DepositPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/DepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"Context":[5151],"DepositPaymaster":[12663],"IAggregator":[10603],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IOracle":[13149],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"SafeERC20":[4761],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":12664,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":12202,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:67"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"@openzeppelin/contracts/token/ERC20/IERC20.sol","id":12203,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12664,"sourceUnit":4420,"src":"99:56:67","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":12204,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12664,"sourceUnit":4762,"src":"156:65:67","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":12205,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12664,"sourceUnit":7529,"src":"223:35:67","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/IOracle.sol","file":"./IOracle.sol","id":12206,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12664,"sourceUnit":13150,"src":"259:23:67","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":12208,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1244:13:67"},"id":12209,"nodeType":"InheritanceSpecifier","src":"1244:13:67"}],"canonicalName":"DepositPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":12207,"nodeType":"StructuredDocumentation","src":"284:930:67","text":" A token-based paymaster that accepts token deposits\n The deposit is only a safeguard: the user pays with his token balance.\n only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n thus the required deposit is to cover just one method call.\n The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n (but can't use the deposit for this or further operations)\n paymasterAndData holds the paymaster address followed by the token address to use.\n @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n (the standard rules ban accessing data of an external contract)\n It can only be used if it is \"whitelisted\" by the bundler.\n (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)"},"fullyImplemented":true,"id":12663,"linearizedBaseContracts":[12663,7528,2933,5151,10861],"name":"DepositPaymaster","nameLocation":"1224:16:67","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12213,"libraryName":{"id":12210,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"1271:16:67"},"nodeType":"UsingForDirective","src":"1265:41:67","typeName":{"id":12212,"nodeType":"UserDefinedTypeName","pathNode":{"id":12211,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1292:13:67"},"referencedDeclaration":10993,"src":"1292:13:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"global":false,"id":12217,"libraryName":{"id":12214,"name":"SafeERC20","nodeType":"IdentifierPath","referencedDeclaration":4761,"src":"1317:9:67"},"nodeType":"UsingForDirective","src":"1311:27:67","typeName":{"id":12216,"nodeType":"UserDefinedTypeName","pathNode":{"id":12215,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1331:6:67"},"referencedDeclaration":4419,"src":"1331:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}}},{"constant":true,"functionSelector":"796d4371","id":12220,"mutability":"constant","name":"COST_OF_POST","nameLocation":"1404:12:67","nodeType":"VariableDeclaration","scope":12663,"src":"1380:44:67","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12218,"name":"uint256","nodeType":"ElementaryTypeName","src":"1380:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3335303030","id":12219,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1419:5:67","typeDescriptions":{"typeIdentifier":"t_rational_35000_by_1","typeString":"int_const 35000"},"value":"35000"},"visibility":"public"},{"constant":true,"id":12229,"mutability":"constant","name":"NULL_ORACLE","nameLocation":"1456:11:67","nodeType":"VariableDeclaration","scope":12663,"src":"1431:58:67","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"typeName":{"id":12222,"nodeType":"UserDefinedTypeName","pathNode":{"id":12221,"name":"IOracle","nodeType":"IdentifierPath","referencedDeclaration":13149,"src":"1431:7:67"},"referencedDeclaration":13149,"src":"1431:7:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"value":{"arguments":[{"arguments":[{"hexValue":"30","id":12226,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1486:1:67","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":12225,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1478:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12224,"name":"address","nodeType":"ElementaryTypeName","src":"1478:7:67","typeDescriptions":{}}},"id":12227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1478:10:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":12223,"name":"IOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13149,"src":"1470:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOracle_$13149_$","typeString":"type(contract IOracle)"}},"id":12228,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1470:19:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"visibility":"private"},{"constant":false,"functionSelector":"addd5099","id":12235,"mutability":"mutable","name":"oracles","nameLocation":"1529:7:67","nodeType":"VariableDeclaration","scope":12663,"src":"1495:41:67","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"},"typeName":{"id":12234,"keyType":{"id":12231,"nodeType":"UserDefinedTypeName","pathNode":{"id":12230,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1503:6:67"},"referencedDeclaration":4419,"src":"1503:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"1495:26:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"},"valueType":{"id":12233,"nodeType":"UserDefinedTypeName","pathNode":{"id":12232,"name":"IOracle","nodeType":"IdentifierPath","referencedDeclaration":13149,"src":"1513:7:67"},"referencedDeclaration":13149,"src":"1513:7:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}}},"visibility":"public"},{"constant":false,"functionSelector":"c23f001f","id":12242,"mutability":"mutable","name":"balances","nameLocation":"1596:8:67","nodeType":"VariableDeclaration","scope":12663,"src":"1542:62:67","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"typeName":{"id":12241,"keyType":{"id":12237,"nodeType":"UserDefinedTypeName","pathNode":{"id":12236,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1550:6:67"},"referencedDeclaration":4419,"src":"1550:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"1542:46:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"valueType":{"id":12240,"keyType":{"id":12238,"name":"address","nodeType":"ElementaryTypeName","src":"1568:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1560:27:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":12239,"name":"uint256","nodeType":"ElementaryTypeName","src":"1579:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"constant":false,"functionSelector":"4a6f84cf","id":12246,"mutability":"mutable","name":"unlockBlock","nameLocation":"1645:11:67","nodeType":"VariableDeclaration","scope":12663,"src":"1610:46:67","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":12245,"keyType":{"id":12243,"name":"address","nodeType":"ElementaryTypeName","src":"1618:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1610:27:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":12244,"name":"uint256","nodeType":"ElementaryTypeName","src":"1629:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":12258,"nodeType":"Block","src":"1727:109:67","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":12255,"name":"unlockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12378,"src":"1809:18:67","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1809:20:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12257,"nodeType":"ExpressionStatement","src":"1809:20:67"}]},"id":12259,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":12252,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12249,"src":"1714:11:67","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":12253,"kind":"baseConstructorSpecifier","modifierName":{"id":12251,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1700:13:67"},"nodeType":"ModifierInvocation","src":"1700:26:67"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":12250,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12249,"mutability":"mutable","name":"_entryPoint","nameLocation":"1687:11:67","nodeType":"VariableDeclaration","scope":12259,"src":"1675:23:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":12248,"nodeType":"UserDefinedTypeName","pathNode":{"id":12247,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1675:11:67"},"referencedDeclaration":10807,"src":"1675:11:67","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1674:25:67"},"returnParameters":{"id":12254,"nodeType":"ParameterList","parameters":[],"src":"1727:0:67"},"scope":12663,"src":"1663:173:67","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12286,"nodeType":"Block","src":"1993:119:67","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"id":12276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12272,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12235,"src":"2011:7:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"}},"id":12274,"indexExpression":{"id":12273,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12263,"src":"2019:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2011:14:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12275,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12229,"src":"2029:11:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"src":"2011:29:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546f6b656e20616c726561647920736574","id":12277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2042:19:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_3f1933bd5ead9cc60725798c84c3187e65fc3fa59401c57f2eee69bc2353d104","typeString":"literal_string \"Token already set\""},"value":"Token already set"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3f1933bd5ead9cc60725798c84c3187e65fc3fa59401c57f2eee69bc2353d104","typeString":"literal_string \"Token already set\""}],"id":12271,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2003:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2003:59:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12279,"nodeType":"ExpressionStatement","src":"2003:59:67"},{"expression":{"id":12284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12280,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12235,"src":"2072:7:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"}},"id":12282,"indexExpression":{"id":12281,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12263,"src":"2080:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2072:14:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":12283,"name":"tokenPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12266,"src":"2089:16:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"src":"2072:33:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"id":12285,"nodeType":"ExpressionStatement","src":"2072:33:67"}]},"documentation":{"id":12260,"nodeType":"StructuredDocumentation","src":"1842:69:67","text":" owner of the paymaster should add supported tokens"},"functionSelector":"5476bd72","id":12287,"implemented":true,"kind":"function","modifiers":[{"id":12269,"kind":"modifierInvocation","modifierName":{"id":12268,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"1983:9:67"},"nodeType":"ModifierInvocation","src":"1983:9:67"}],"name":"addToken","nameLocation":"1925:8:67","nodeType":"FunctionDefinition","parameters":{"id":12267,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12263,"mutability":"mutable","name":"token","nameLocation":"1941:5:67","nodeType":"VariableDeclaration","scope":12287,"src":"1934:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12262,"nodeType":"UserDefinedTypeName","pathNode":{"id":12261,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1934:6:67"},"referencedDeclaration":4419,"src":"1934:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12266,"mutability":"mutable","name":"tokenPriceOracle","nameLocation":"1956:16:67","nodeType":"VariableDeclaration","scope":12287,"src":"1948:24:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"typeName":{"id":12265,"nodeType":"UserDefinedTypeName","pathNode":{"id":12264,"name":"IOracle","nodeType":"IdentifierPath","referencedDeclaration":13149,"src":"1948:7:67"},"referencedDeclaration":13149,"src":"1948:7:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"visibility":"internal"}],"src":"1933:40:67"},"returnParameters":{"id":12270,"nodeType":"ParameterList","parameters":[],"src":"1993:0:67"},"scope":12663,"src":"1916:196:67","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":12336,"nodeType":"Block","src":"2725:322:67","statements":[{"expression":{"arguments":[{"expression":{"id":12301,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2814:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2814:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":12305,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2834:4:67","typeDescriptions":{"typeIdentifier":"t_contract$_DepositPaymaster_$12663","typeString":"contract DepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DepositPaymaster_$12663","typeString":"contract DepositPaymaster"}],"id":12304,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2826:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12303,"name":"address","nodeType":"ElementaryTypeName","src":"2826:7:67","typeDescriptions":{}}},"id":12306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2826:13:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12307,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12295,"src":"2841:6:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12298,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12291,"src":"2791:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"2791:22:67","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":12308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2791:57:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12309,"nodeType":"ExpressionStatement","src":"2791:57:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"id":12315,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12311,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12235,"src":"2866:7:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"}},"id":12313,"indexExpression":{"id":12312,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12291,"src":"2874:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2866:14:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":12314,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12229,"src":"2884:11:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"src":"2866:29:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"756e737570706f7274656420746f6b656e","id":12316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2897:19:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_507d798c5ad4be89d4f3da658d37b2094b23f09aca616c68bd08d2df2115802a","typeString":"literal_string \"unsupported token\""},"value":"unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_507d798c5ad4be89d4f3da658d37b2094b23f09aca616c68bd08d2df2115802a","typeString":"literal_string \"unsupported token\""}],"id":12310,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2858:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2858:59:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12318,"nodeType":"ExpressionStatement","src":"2858:59:67"},{"expression":{"id":12325,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":12319,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"2927:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12322,"indexExpression":{"id":12320,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12291,"src":"2936:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2927:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12323,"indexExpression":{"id":12321,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12293,"src":"2943:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2927:24:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":12324,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12295,"src":"2955:6:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2927:34:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12326,"nodeType":"ExpressionStatement","src":"2927:34:67"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12327,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2975:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2975:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12329,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12293,"src":"2989:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2975:21:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12335,"nodeType":"IfStatement","src":"2971:70:67","trueBody":{"id":12334,"nodeType":"Block","src":"2998:43:67","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":12331,"name":"lockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12390,"src":"3012:16:67","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12332,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3012:18:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12333,"nodeType":"ExpressionStatement","src":"3012:18:67"}]}}]},"documentation":{"id":12288,"nodeType":"StructuredDocumentation","src":"2118:523:67","text":" deposit tokens that a specific account can use to pay for gas.\n The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n use them - either as gas, or using withdrawTo()\n @param token the token to deposit.\n @param account the account to deposit for.\n @param amount the amount of token to deposit."},"functionSelector":"382edd9e","id":12337,"implemented":true,"kind":"function","modifiers":[],"name":"addDepositFor","nameLocation":"2655:13:67","nodeType":"FunctionDefinition","parameters":{"id":12296,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12291,"mutability":"mutable","name":"token","nameLocation":"2676:5:67","nodeType":"VariableDeclaration","scope":12337,"src":"2669:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12290,"nodeType":"UserDefinedTypeName","pathNode":{"id":12289,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2669:6:67"},"referencedDeclaration":4419,"src":"2669:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12293,"mutability":"mutable","name":"account","nameLocation":"2691:7:67","nodeType":"VariableDeclaration","scope":12337,"src":"2683:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12292,"name":"address","nodeType":"ElementaryTypeName","src":"2683:7:67","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12295,"mutability":"mutable","name":"amount","nameLocation":"2708:6:67","nodeType":"VariableDeclaration","scope":12337,"src":"2700:14:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12294,"name":"uint256","nodeType":"ElementaryTypeName","src":"2700:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2668:47:67"},"returnParameters":{"id":12297,"nodeType":"ParameterList","parameters":[],"src":"2725:0:67"},"scope":12663,"src":"2646:401:67","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":12364,"nodeType":"Block","src":"3344:95:67","statements":[{"expression":{"id":12356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12350,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12346,"src":"3354:6:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":12351,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"3363:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12353,"indexExpression":{"id":12352,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12341,"src":"3372:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3363:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12355,"indexExpression":{"id":12354,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12343,"src":"3379:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3363:24:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3354:33:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12357,"nodeType":"ExpressionStatement","src":"3354:33:67"},{"expression":{"id":12362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12358,"name":"_unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12348,"src":"3397:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":12359,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"3412:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12361,"indexExpression":{"id":12360,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12343,"src":"3424:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3412:20:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3397:35:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12363,"nodeType":"ExpressionStatement","src":"3397:35:67"}]},"documentation":{"id":12338,"nodeType":"StructuredDocumentation","src":"3053:175:67","text":" @return amount - the amount of given token deposited to the Paymaster.\n @return _unlockBlock - the block height at which the deposit can be withdrawn."},"functionSelector":"493b0170","id":12365,"implemented":true,"kind":"function","modifiers":[],"name":"depositInfo","nameLocation":"3242:11:67","nodeType":"FunctionDefinition","parameters":{"id":12344,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12341,"mutability":"mutable","name":"token","nameLocation":"3261:5:67","nodeType":"VariableDeclaration","scope":12365,"src":"3254:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12340,"nodeType":"UserDefinedTypeName","pathNode":{"id":12339,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"3254:6:67"},"referencedDeclaration":4419,"src":"3254:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12343,"mutability":"mutable","name":"account","nameLocation":"3276:7:67","nodeType":"VariableDeclaration","scope":12365,"src":"3268:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12342,"name":"address","nodeType":"ElementaryTypeName","src":"3268:7:67","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3253:31:67"},"returnParameters":{"id":12349,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12346,"mutability":"mutable","name":"amount","nameLocation":"3314:6:67","nodeType":"VariableDeclaration","scope":12365,"src":"3306:14:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12345,"name":"uint256","nodeType":"ElementaryTypeName","src":"3306:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12348,"mutability":"mutable","name":"_unlockBlock","nameLocation":"3330:12:67","nodeType":"VariableDeclaration","scope":12365,"src":"3322:20:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12347,"name":"uint256","nodeType":"ElementaryTypeName","src":"3322:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3305:38:67"},"scope":12663,"src":"3233:206:67","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":12377,"nodeType":"Block","src":"3607:55:67","statements":[{"expression":{"id":12375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12369,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"3617:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12372,"indexExpression":{"expression":{"id":12370,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3629:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12371,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3629:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3617:23:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":12373,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3643:5:67","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"3643:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3617:38:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12376,"nodeType":"ExpressionStatement","src":"3617:38:67"}]},"documentation":{"id":12366,"nodeType":"StructuredDocumentation","src":"3445:120:67","text":" unlock deposit, so that it can be withdrawn.\n can't be called in the same block as withdrawTo()"},"functionSelector":"9ed0fb68","id":12378,"implemented":true,"kind":"function","modifiers":[],"name":"unlockTokenDeposit","nameLocation":"3579:18:67","nodeType":"FunctionDefinition","parameters":{"id":12367,"nodeType":"ParameterList","parameters":[],"src":"3597:2:67"},"returnParameters":{"id":12368,"nodeType":"ParameterList","parameters":[],"src":"3607:0:67"},"scope":12663,"src":"3570:92:67","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12389,"nodeType":"Block","src":"3914:44:67","statements":[{"expression":{"id":12387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12382,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"3924:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12385,"indexExpression":{"expression":{"id":12383,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3936:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3936:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3924:23:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":12386,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3950:1:67","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3924:27:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12388,"nodeType":"ExpressionStatement","src":"3924:27:67"}]},"documentation":{"id":12379,"nodeType":"StructuredDocumentation","src":"3668:206:67","text":" lock the tokens deposited for this account so they can be used to pay for gas.\n after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"functionSelector":"cd8f80c2","id":12390,"implemented":true,"kind":"function","modifiers":[],"name":"lockTokenDeposit","nameLocation":"3888:16:67","nodeType":"FunctionDefinition","parameters":{"id":12380,"nodeType":"ParameterList","parameters":[],"src":"3904:2:67"},"returnParameters":{"id":12381,"nodeType":"ParameterList","parameters":[],"src":"3914:0:67"},"scope":12663,"src":"3879:79:67","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12435,"nodeType":"Block","src":"4285:232:67","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":12415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12402,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"4303:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12405,"indexExpression":{"expression":{"id":12403,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4315:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4315:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4303:23:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":12406,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4330:1:67","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4303:28:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12414,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12408,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4335:5:67","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"4335:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"baseExpression":{"id":12410,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"4350:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12413,"indexExpression":{"expression":{"id":12411,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4362:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4362:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4350:23:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4335:38:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4303:70:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b656e4465706f736974","id":12416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4375:43:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""},"value":"DepositPaymaster: must unlockTokenDeposit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""}],"id":12401,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4295:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4295:124:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12418,"nodeType":"ExpressionStatement","src":"4295:124:67"},{"expression":{"id":12426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":12419,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"4429:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12423,"indexExpression":{"id":12420,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12394,"src":"4438:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4429:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12424,"indexExpression":{"expression":{"id":12421,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4445:3:67","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4445:10:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4429:27:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":12425,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12398,"src":"4460:6:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4429:37:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12427,"nodeType":"ExpressionStatement","src":"4429:37:67"},{"expression":{"arguments":[{"id":12431,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12396,"src":"4495:6:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12432,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12398,"src":"4503:6:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12428,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12394,"src":"4476:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":4512,"src":"4476:18:67","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,uint256)"}},"id":12433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4476:34:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12434,"nodeType":"ExpressionStatement","src":"4476:34:67"}]},"documentation":{"id":12391,"nodeType":"StructuredDocumentation","src":"3964:237:67","text":" withdraw tokens.\n can only be called after unlock() is called in a previous block.\n @param token the token deposit to withdraw\n @param target address to send to\n @param amount amount to withdraw"},"functionSelector":"cc9c837c","id":12436,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTokensTo","nameLocation":"4215:16:67","nodeType":"FunctionDefinition","parameters":{"id":12399,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12394,"mutability":"mutable","name":"token","nameLocation":"4239:5:67","nodeType":"VariableDeclaration","scope":12436,"src":"4232:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12393,"nodeType":"UserDefinedTypeName","pathNode":{"id":12392,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"4232:6:67"},"referencedDeclaration":4419,"src":"4232:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12396,"mutability":"mutable","name":"target","nameLocation":"4254:6:67","nodeType":"VariableDeclaration","scope":12436,"src":"4246:14:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12395,"name":"address","nodeType":"ElementaryTypeName","src":"4246:7:67","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12398,"mutability":"mutable","name":"amount","nameLocation":"4270:6:67","nodeType":"VariableDeclaration","scope":12436,"src":"4262:14:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12397,"name":"uint256","nodeType":"ElementaryTypeName","src":"4262:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4231:46:67"},"returnParameters":{"id":12400,"nodeType":"ParameterList","parameters":[],"src":"4285:0:67"},"scope":12663,"src":"4206:311:67","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12466,"nodeType":"Block","src":"4895:180:67","statements":[{"assignments":[12449],"declarations":[{"constant":false,"id":12449,"mutability":"mutable","name":"oracle","nameLocation":"4913:6:67","nodeType":"VariableDeclaration","scope":12466,"src":"4905:14:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"typeName":{"id":12448,"nodeType":"UserDefinedTypeName","pathNode":{"id":12447,"name":"IOracle","nodeType":"IdentifierPath","referencedDeclaration":13149,"src":"4905:7:67"},"referencedDeclaration":13149,"src":"4905:7:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"visibility":"internal"}],"id":12453,"initialValue":{"baseExpression":{"id":12450,"name":"oracles","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12235,"src":"4922:7:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_contract$_IOracle_$13149_$","typeString":"mapping(contract IERC20 => contract IOracle)"}},"id":12452,"indexExpression":{"id":12451,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12440,"src":"4930:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4922:14:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"nodeType":"VariableDeclarationStatement","src":"4905:31:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"},"id":12457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12455,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12449,"src":"4954:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":12456,"name":"NULL_ORACLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12229,"src":"4964:11:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"src":"4954:21:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":12458,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4977:37:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":12454,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4946:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12459,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4946:69:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12460,"nodeType":"ExpressionStatement","src":"4946:69:67"},{"expression":{"arguments":[{"id":12463,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12442,"src":"5058:9:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12461,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12449,"src":"5032:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IOracle_$13149","typeString":"contract IOracle"}},"id":12462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getTokenValueOfEth","nodeType":"MemberAccess","referencedDeclaration":13148,"src":"5032:25:67","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view external returns (uint256)"}},"id":12464,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5032:36:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":12446,"id":12465,"nodeType":"Return","src":"5025:43:67"}]},"documentation":{"id":12437,"nodeType":"StructuredDocumentation","src":"4523:251:67","text":" translate the given eth value to token amount\n @param token the token to use\n @param ethBought the required eth value we want to \"buy\"\n @return requiredTokens the amount of tokens required to get this amount of eth"},"id":12467,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"4788:18:67","nodeType":"FunctionDefinition","parameters":{"id":12443,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12440,"mutability":"mutable","name":"token","nameLocation":"4814:5:67","nodeType":"VariableDeclaration","scope":12467,"src":"4807:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12439,"nodeType":"UserDefinedTypeName","pathNode":{"id":12438,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"4807:6:67"},"referencedDeclaration":4419,"src":"4807:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12442,"mutability":"mutable","name":"ethBought","nameLocation":"4829:9:67","nodeType":"VariableDeclaration","scope":12467,"src":"4821:17:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12441,"name":"uint256","nodeType":"ElementaryTypeName","src":"4821:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4806:33:67"},"returnParameters":{"id":12446,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12445,"mutability":"mutable","name":"requiredTokens","nameLocation":"4879:14:67","nodeType":"VariableDeclaration","scope":12467,"src":"4871:22:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12444,"name":"uint256","nodeType":"ElementaryTypeName","src":"4871:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4870:24:67"},"scope":12663,"src":"4779:296:67","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[7373],"body":{"id":12574,"nodeType":"Block","src":"5558:917:67","statements":[{"expression":{"components":[{"id":12483,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12473,"src":"5570:10:67","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":12484,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5569:12:67","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":12485,"nodeType":"ExpressionStatement","src":"5569:12:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12487,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12471,"src":"5702:6:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"5702:27:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":12489,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12220,"src":"5732:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5702:42:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f7220706f73744f70","id":12491,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5746:42:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""},"value":"DepositPaymaster: gas too low for postOp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""}],"id":12486,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5694:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12492,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5694:95:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12493,"nodeType":"ExpressionStatement","src":"5694:95:67"},{"assignments":[12495],"declarations":[{"constant":false,"id":12495,"mutability":"mutable","name":"paymasterAndData","nameLocation":"5815:16:67","nodeType":"VariableDeclaration","scope":12574,"src":"5800:31:67","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12494,"name":"bytes","nodeType":"ElementaryTypeName","src":"5800:5:67","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12498,"initialValue":{"expression":{"id":12496,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12471,"src":"5834:6:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"5834:23:67","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"5800:57:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12500,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12495,"src":"5875:16:67","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5875:23:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"id":12504,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3230","id":12502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5902:2:67","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3230","id":12503,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5905:2:67","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"5902:5:67","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"}},"src":"5875:32:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e6444617461206d757374207370656369667920746f6b656e","id":12506,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5909:55:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""},"value":"DepositPaymaster: paymasterAndData must specify token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""}],"id":12499,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5867:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5867:98:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12508,"nodeType":"ExpressionStatement","src":"5867:98:67"},{"assignments":[12511],"declarations":[{"constant":false,"id":12511,"mutability":"mutable","name":"token","nameLocation":"5982:5:67","nodeType":"VariableDeclaration","scope":12574,"src":"5975:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12510,"nodeType":"UserDefinedTypeName","pathNode":{"id":12509,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"5975:6:67"},"referencedDeclaration":4419,"src":"5975:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"}],"id":12523,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"baseExpression":{"id":12517,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12495,"src":"6013:16:67","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":12519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"6013:21:67","startExpression":{"hexValue":"3230","id":12518,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6030:2:67","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":12516,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6005:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":12515,"name":"bytes20","nodeType":"ElementaryTypeName","src":"6005:7:67","typeDescriptions":{}}},"id":12520,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6005:30:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":12514,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5997:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12513,"name":"address","nodeType":"ElementaryTypeName","src":"5997:7:67","typeDescriptions":{}}},"id":12521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5997:39:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":12512,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"5990:6:67","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":12522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5990:47:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"VariableDeclarationStatement","src":"5975:62:67"},{"assignments":[12525],"declarations":[{"constant":false,"id":12525,"mutability":"mutable","name":"account","nameLocation":"6055:7:67","nodeType":"VariableDeclaration","scope":12574,"src":"6047:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12524,"name":"address","nodeType":"ElementaryTypeName","src":"6047:7:67","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12529,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12526,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12471,"src":"6065:6:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"6065:16:67","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":12528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6065:18:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6047:36:67"},{"assignments":[12531],"declarations":[{"constant":false,"id":12531,"mutability":"mutable","name":"maxTokenCost","nameLocation":"6101:12:67","nodeType":"VariableDeclaration","scope":12574,"src":"6093:20:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12530,"name":"uint256","nodeType":"ElementaryTypeName","src":"6093:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12536,"initialValue":{"arguments":[{"id":12533,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12511,"src":"6135:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":12534,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12475,"src":"6142:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12532,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12467,"src":"6116:18:67","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_contract$_IERC20_$4419_$_t_uint256_$returns$_t_uint256_$","typeString":"function (contract IERC20,uint256) view returns (uint256)"}},"id":12535,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6116:34:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6093:57:67"},{"assignments":[12538],"declarations":[{"constant":false,"id":12538,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"6168:14:67","nodeType":"VariableDeclaration","scope":12574,"src":"6160:22:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12537,"name":"uint256","nodeType":"ElementaryTypeName","src":"6160:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12542,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12539,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12471,"src":"6185:6:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasPrice","nodeType":"MemberAccess","referencedDeclaration":11050,"src":"6185:15:67","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) view returns (uint256)"}},"id":12541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6185:17:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6160:42:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12544,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12246,"src":"6220:11:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12546,"indexExpression":{"id":12545,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12525,"src":"6232:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6220:20:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":12547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6244:1:67","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6220:25:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f636b6564","id":12549,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6247:38:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""},"value":"DepositPaymaster: deposit not locked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""}],"id":12543,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6212:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6212:74:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12551,"nodeType":"ExpressionStatement","src":"6212:74:67"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12559,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":12553,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"6304:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12555,"indexExpression":{"id":12554,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12511,"src":"6313:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6304:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12557,"indexExpression":{"id":12556,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12525,"src":"6320:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6304:24:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":12558,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12531,"src":"6332:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6304:40:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f77","id":12560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6346:35:67","typeDescriptions":{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""},"value":"DepositPaymaster: deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""}],"id":12552,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6296:7:67","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12561,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6296:86:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12562,"nodeType":"ExpressionStatement","src":"6296:86:67"},{"expression":{"components":[{"arguments":[{"id":12565,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12525,"src":"6411:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12566,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12511,"src":"6420:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":12567,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12538,"src":"6427:14:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":12568,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12531,"src":"6443:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":12569,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12475,"src":"6457:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12563,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6400:3:67","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"6400:10:67","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6400:65:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":12571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6466:1:67","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":12572,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6399:69:67","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_rational_0_by_1_$","typeString":"tuple(bytes memory,int_const 0)"}},"functionReturnParameters":12482,"id":12573,"nodeType":"Return","src":"6392:76:67"}]},"documentation":{"id":12468,"nodeType":"StructuredDocumentation","src":"5081:288:67","text":" Validate the request:\n The sender should have enough deposit to pay the max possible cost.\n Note that the sender's balance is not checked. If it fails to pay from its balance,\n this deposit will be used to compensate the paymaster for the transaction."},"id":12575,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"5383:24:67","nodeType":"FunctionDefinition","overrides":{"id":12477,"nodeType":"OverrideSpecifier","overrides":[],"src":"5494:8:67"},"parameters":{"id":12476,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12471,"mutability":"mutable","name":"userOp","nameLocation":"5431:6:67","nodeType":"VariableDeclaration","scope":12575,"src":"5408:29:67","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":12470,"nodeType":"UserDefinedTypeName","pathNode":{"id":12469,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5408:13:67"},"referencedDeclaration":10993,"src":"5408:13:67","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":12473,"mutability":"mutable","name":"userOpHash","nameLocation":"5447:10:67","nodeType":"VariableDeclaration","scope":12575,"src":"5439:18:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12472,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5439:7:67","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":12475,"mutability":"mutable","name":"maxCost","nameLocation":"5467:7:67","nodeType":"VariableDeclaration","scope":12575,"src":"5459:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12474,"name":"uint256","nodeType":"ElementaryTypeName","src":"5459:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5407:68:67"},"returnParameters":{"id":12482,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12479,"mutability":"mutable","name":"context","nameLocation":"5525:7:67","nodeType":"VariableDeclaration","scope":12575,"src":"5512:20:67","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":12478,"name":"bytes","nodeType":"ElementaryTypeName","src":"5512:5:67","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12481,"mutability":"mutable","name":"validationData","nameLocation":"5542:14:67","nodeType":"VariableDeclaration","scope":12575,"src":"5534:22:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12480,"name":"uint256","nodeType":"ElementaryTypeName","src":"5534:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5511:46:67"},"scope":12663,"src":"5374:1101:67","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[7416],"body":{"id":12661,"nodeType":"Block","src":"6985:720:67","statements":[{"assignments":[12588,12591,12593,12595,12597],"declarations":[{"constant":false,"id":12588,"mutability":"mutable","name":"account","nameLocation":"7005:7:67","nodeType":"VariableDeclaration","scope":12661,"src":"6997:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12587,"name":"address","nodeType":"ElementaryTypeName","src":"6997:7:67","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12591,"mutability":"mutable","name":"token","nameLocation":"7021:5:67","nodeType":"VariableDeclaration","scope":12661,"src":"7014:12:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12590,"nodeType":"UserDefinedTypeName","pathNode":{"id":12589,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"7014:6:67"},"referencedDeclaration":4419,"src":"7014:6:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":12593,"mutability":"mutable","name":"gasPricePostOp","nameLocation":"7036:14:67","nodeType":"VariableDeclaration","scope":12661,"src":"7028:22:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12592,"name":"uint256","nodeType":"ElementaryTypeName","src":"7028:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12595,"mutability":"mutable","name":"maxTokenCost","nameLocation":"7060:12:67","nodeType":"VariableDeclaration","scope":12661,"src":"7052:20:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12594,"name":"uint256","nodeType":"ElementaryTypeName","src":"7052:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12597,"mutability":"mutable","name":"maxCost","nameLocation":"7082:7:67","nodeType":"VariableDeclaration","scope":12661,"src":"7074:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12596,"name":"uint256","nodeType":"ElementaryTypeName","src":"7074:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12612,"initialValue":{"arguments":[{"id":12600,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12581,"src":"7104:7:67","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":12602,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7114:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12601,"name":"address","nodeType":"ElementaryTypeName","src":"7114:7:67","typeDescriptions":{}}},{"id":12603,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"7123:6:67","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},{"id":12605,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7131:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12604,"name":"uint256","nodeType":"ElementaryTypeName","src":"7131:7:67","typeDescriptions":{}}},{"id":12607,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7140:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12606,"name":"uint256","nodeType":"ElementaryTypeName","src":"7140:7:67","typeDescriptions":{}}},{"id":12609,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7149:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12608,"name":"uint256","nodeType":"ElementaryTypeName","src":"7149:7:67","typeDescriptions":{}}}],"id":12610,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"7113:44:67","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}],"expression":{"id":12598,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7093:3:67","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12599,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"7093:10:67","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":12611,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7093:65:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_contract$_IERC20_$4419_$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(address payable,contract IERC20,uint256,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6996:162:67"},{"assignments":[12614],"declarations":[{"constant":false,"id":12614,"mutability":"mutable","name":"actualTokenCost","nameLocation":"7235:15:67","nodeType":"VariableDeclaration","scope":12661,"src":"7227:23:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12613,"name":"uint256","nodeType":"ElementaryTypeName","src":"7227:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12625,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12622,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12615,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12583,"src":"7254:13:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12616,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12220,"src":"7270:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":12617,"name":"gasPricePostOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12593,"src":"7285:14:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7270:29:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7254:45:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12620,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7253:47:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":12621,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12595,"src":"7303:12:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7253:62:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":12623,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12597,"src":"7318:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7253:72:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7227:98:67"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":12629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12626,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12579,"src":"7339:4:67","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":12627,"name":"PostOpMode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10834,"src":"7347:10:67","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":12628,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"7347:25:67","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"7339:33:67","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":12650,"nodeType":"Block","src":"7511:135:67","statements":[{"expression":{"id":12648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":12642,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"7592:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12645,"indexExpression":{"id":12643,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12591,"src":"7601:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7592:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12646,"indexExpression":{"id":12644,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12588,"src":"7608:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7592:24:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":12647,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12614,"src":"7620:15:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7592:43:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12649,"nodeType":"ExpressionStatement","src":"7592:43:67"}]},"id":12651,"nodeType":"IfStatement","src":"7335:311:67","trueBody":{"id":12641,"nodeType":"Block","src":"7374:131:67","statements":[{"expression":{"arguments":[{"id":12633,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12588,"src":"7454:7:67","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":12636,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"7471:4:67","typeDescriptions":{"typeIdentifier":"t_contract$_DepositPaymaster_$12663","typeString":"contract DepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DepositPaymaster_$12663","typeString":"contract DepositPaymaster"}],"id":12635,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7463:7:67","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12634,"name":"address","nodeType":"ElementaryTypeName","src":"7463:7:67","typeDescriptions":{}}},"id":12637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7463:13:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12638,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12614,"src":"7478:15:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12630,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12591,"src":"7431:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12632,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"7431:22:67","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":12639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7431:63:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12640,"nodeType":"ExpressionStatement","src":"7431:63:67"}]}},{"expression":{"id":12659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":12652,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12242,"src":"7655:8:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":12656,"indexExpression":{"id":12653,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12591,"src":"7664:5:67","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7655:15:67","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12657,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":12654,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"7671:5:67","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":12655,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7671:7:67","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7655:24:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":12658,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12614,"src":"7683:15:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7655:43:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12660,"nodeType":"ExpressionStatement","src":"7655:43:67"}]},"documentation":{"id":12576,"nodeType":"StructuredDocumentation","src":"6481:400:67","text":" perform the post-operation to charge the sender for the gas.\n in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n this time in *postOpReverted* mode.\n In this mode, we use the deposit to pay (which we validated to be large enough)"},"id":12662,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"6895:7:67","nodeType":"FunctionDefinition","overrides":{"id":12585,"nodeType":"OverrideSpecifier","overrides":[],"src":"6976:8:67"},"parameters":{"id":12584,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12579,"mutability":"mutable","name":"mode","nameLocation":"6914:4:67","nodeType":"VariableDeclaration","scope":12662,"src":"6903:15:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":12578,"nodeType":"UserDefinedTypeName","pathNode":{"id":12577,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"6903:10:67"},"referencedDeclaration":10834,"src":"6903:10:67","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":12581,"mutability":"mutable","name":"context","nameLocation":"6935:7:67","nodeType":"VariableDeclaration","scope":12662,"src":"6920:22:67","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12580,"name":"bytes","nodeType":"ElementaryTypeName","src":"6920:5:67","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12583,"mutability":"mutable","name":"actualGasCost","nameLocation":"6952:13:67","nodeType":"VariableDeclaration","scope":12662,"src":"6944:21:67","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12582,"name":"uint256","nodeType":"ElementaryTypeName","src":"6944:7:67","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6902:64:67"},"returnParameters":{"id":12586,"nodeType":"ParameterList","parameters":[],"src":"6985:0:67"},"scope":12663,"src":"6886:819:67","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":12664,"src":"1215:6492:67","usedErrors":[]}],"src":"36:7672:67"},"id":67},"contracts/samples/GPODepositPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/GPODepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"Context":[5151],"GPODepositPaymaster":[13057],"IAggregator":[10603],"IBobaGasPriceOracle":[13071],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"SafeERC20":[4761],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":13058,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":12665,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:68"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"@openzeppelin/contracts/token/ERC20/IERC20.sol","id":12666,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13058,"sourceUnit":4420,"src":"99:56:68","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":12667,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13058,"sourceUnit":4762,"src":"156:65:68","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":12668,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13058,"sourceUnit":7529,"src":"223:35:68","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/IBobaGasPriceOracle.sol","file":"./IBobaGasPriceOracle.sol","id":12669,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13058,"sourceUnit":13072,"src":"259:35:68","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":12671,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"515:13:68"},"id":12672,"nodeType":"InheritanceSpecifier","src":"515:13:68"}],"canonicalName":"GPODepositPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":12670,"nodeType":"StructuredDocumentation","src":"296:186:68","text":" Intended to be used for Boba Alt-L1 deployments\n This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the\n secondary (or native token)"},"fullyImplemented":true,"id":13057,"linearizedBaseContracts":[13057,7528,2933,5151,10861],"name":"GPODepositPaymaster","nameLocation":"492:19:68","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12676,"libraryName":{"id":12673,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"542:16:68"},"nodeType":"UsingForDirective","src":"536:41:68","typeName":{"id":12675,"nodeType":"UserDefinedTypeName","pathNode":{"id":12674,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"563:13:68"},"referencedDeclaration":10993,"src":"563:13:68","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"global":false,"id":12680,"libraryName":{"id":12677,"name":"SafeERC20","nodeType":"IdentifierPath","referencedDeclaration":4761,"src":"588:9:68"},"nodeType":"UsingForDirective","src":"582:27:68","typeName":{"id":12679,"nodeType":"UserDefinedTypeName","pathNode":{"id":12678,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"602:6:68"},"referencedDeclaration":4419,"src":"602:6:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}}},{"constant":true,"functionSelector":"796d4371","id":12683,"mutability":"constant","name":"COST_OF_POST","nameLocation":"675:12:68","nodeType":"VariableDeclaration","scope":13057,"src":"651:44:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12681,"name":"uint256","nodeType":"ElementaryTypeName","src":"651:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3335303030","id":12682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"690:5:68","typeDescriptions":{"typeIdentifier":"t_rational_35000_by_1","typeString":"int_const 35000"},"value":"35000"},"visibility":"public"},{"constant":false,"functionSelector":"27e235e3","id":12687,"mutability":"mutable","name":"balances","nameLocation":"737:8:68","nodeType":"VariableDeclaration","scope":13057,"src":"702:43:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":12686,"keyType":{"id":12684,"name":"address","nodeType":"ElementaryTypeName","src":"710:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"702:27:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":12685,"name":"uint256","nodeType":"ElementaryTypeName","src":"721:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"4a6f84cf","id":12691,"mutability":"mutable","name":"unlockBlock","nameLocation":"786:11:68","nodeType":"VariableDeclaration","scope":13057,"src":"751:46:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":12690,"keyType":{"id":12688,"name":"address","nodeType":"ElementaryTypeName","src":"759:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"751:27:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":12689,"name":"uint256","nodeType":"ElementaryTypeName","src":"770:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"0ee0599c","id":12694,"mutability":"mutable","name":"supportedToken","nameLocation":"818:14:68","nodeType":"VariableDeclaration","scope":13057,"src":"804:28:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":12693,"nodeType":"UserDefinedTypeName","pathNode":{"id":12692,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"804:6:68"},"referencedDeclaration":4419,"src":"804:6:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"public"},{"constant":false,"functionSelector":"23038894","id":12696,"mutability":"mutable","name":"supportedTokenDecimals","nameLocation":"851:22:68","nodeType":"VariableDeclaration","scope":13057,"src":"838:35:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":12695,"name":"uint8","nodeType":"ElementaryTypeName","src":"838:5:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"public"},{"constant":false,"functionSelector":"6f6dc5ae","id":12699,"mutability":"mutable","name":"gasPriceOracle","nameLocation":"906:14:68","nodeType":"VariableDeclaration","scope":13057,"src":"879:41:68","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"},"typeName":{"id":12698,"nodeType":"UserDefinedTypeName","pathNode":{"id":12697,"name":"IBobaGasPriceOracle","nodeType":"IdentifierPath","referencedDeclaration":13071,"src":"879:19:68"},"referencedDeclaration":13071,"src":"879:19:68","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"visibility":"public"},{"body":{"id":12733,"nodeType":"Block","src":"1072:280:68","statements":[{"expression":{"id":12718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12714,"name":"supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12694,"src":"1082:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":12716,"name":"_supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12704,"src":"1106:15:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":12715,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"1099:6:68","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":12717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1099:23:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"1082:40:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12719,"nodeType":"ExpressionStatement","src":"1082:40:68"},{"expression":{"id":12722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12720,"name":"supportedTokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12696,"src":"1132:22:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":12721,"name":"_supportedTokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12706,"src":"1157:23:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"1132:48:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":12723,"nodeType":"ExpressionStatement","src":"1132:48:68"},{"expression":{"id":12728,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12724,"name":"gasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12699,"src":"1190:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":12726,"name":"_gasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12708,"src":"1227:15:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":12725,"name":"IBobaGasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13071,"src":"1207:19:68","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBobaGasPriceOracle_$13071_$","typeString":"type(contract IBobaGasPriceOracle)"}},"id":12727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1207:36:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"src":"1190:53:68","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"id":12729,"nodeType":"ExpressionStatement","src":"1190:53:68"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":12730,"name":"unlockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12806,"src":"1325:18:68","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1325:20:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12732,"nodeType":"ExpressionStatement","src":"1325:20:68"}]},"id":12734,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":12711,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12702,"src":"1059:11:68","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":12712,"kind":"baseConstructorSpecifier","modifierName":{"id":12710,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1045:13:68"},"nodeType":"ModifierInvocation","src":"1045:26:68"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":12709,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12702,"mutability":"mutable","name":"_entryPoint","nameLocation":"951:11:68","nodeType":"VariableDeclaration","scope":12734,"src":"939:23:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":12701,"nodeType":"UserDefinedTypeName","pathNode":{"id":12700,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"939:11:68"},"referencedDeclaration":10807,"src":"939:11:68","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":12704,"mutability":"mutable","name":"_supportedToken","nameLocation":"972:15:68","nodeType":"VariableDeclaration","scope":12734,"src":"964:23:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12703,"name":"address","nodeType":"ElementaryTypeName","src":"964:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12706,"mutability":"mutable","name":"_supportedTokenDecimals","nameLocation":"995:23:68","nodeType":"VariableDeclaration","scope":12734,"src":"989:29:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":12705,"name":"uint8","nodeType":"ElementaryTypeName","src":"989:5:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":12708,"mutability":"mutable","name":"_gasPriceOracle","nameLocation":"1028:15:68","nodeType":"VariableDeclaration","scope":12734,"src":"1020:23:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12707,"name":"address","nodeType":"ElementaryTypeName","src":"1020:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"938:106:68"},"returnParameters":{"id":12713,"nodeType":"ParameterList","parameters":[],"src":"1072:0:68"},"scope":13057,"src":"927:425:68","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12769,"nodeType":"Block","src":"1909:255:68","statements":[{"expression":{"arguments":[{"expression":{"id":12745,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2007:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2007:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":12749,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2027:4:68","typeDescriptions":{"typeIdentifier":"t_contract$_GPODepositPaymaster_$13057","typeString":"contract GPODepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GPODepositPaymaster_$13057","typeString":"contract GPODepositPaymaster"}],"id":12748,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2019:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":12747,"name":"address","nodeType":"ElementaryTypeName","src":"2019:7:68","typeDescriptions":{}}},"id":12750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2019:13:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12751,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12739,"src":"2034:6:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12742,"name":"supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12694,"src":"1975:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12744,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"1975:31:68","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":12752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1975:66:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12753,"nodeType":"ExpressionStatement","src":"1975:66:68"},{"expression":{"id":12758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12754,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"2051:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12756,"indexExpression":{"id":12755,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12737,"src":"2060:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2051:17:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":12757,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12739,"src":"2072:6:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2051:27:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12759,"nodeType":"ExpressionStatement","src":"2051:27:68"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":12763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12760,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2092:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2092:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12762,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12737,"src":"2106:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2092:21:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12768,"nodeType":"IfStatement","src":"2088:70:68","trueBody":{"id":12767,"nodeType":"Block","src":"2115:43:68","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":12764,"name":"lockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12818,"src":"2129:16:68","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2129:18:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12766,"nodeType":"ExpressionStatement","src":"2129:18:68"}]}}]},"documentation":{"id":12735,"nodeType":"StructuredDocumentation","src":"1358:481:68","text":" deposit tokens that a specific account can use to pay for gas.\n The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n use them - either as gas, or using withdrawTo()\n @param account the account to deposit for.\n @param amount the amount of token to deposit."},"functionSelector":"4f16bbf3","id":12770,"implemented":true,"kind":"function","modifiers":[],"name":"addDepositFor","nameLocation":"1853:13:68","nodeType":"FunctionDefinition","parameters":{"id":12740,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12737,"mutability":"mutable","name":"account","nameLocation":"1875:7:68","nodeType":"VariableDeclaration","scope":12770,"src":"1867:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12736,"name":"address","nodeType":"ElementaryTypeName","src":"1867:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12739,"mutability":"mutable","name":"amount","nameLocation":"1892:6:68","nodeType":"VariableDeclaration","scope":12770,"src":"1884:14:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12738,"name":"uint256","nodeType":"ElementaryTypeName","src":"1884:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1866:33:68"},"returnParameters":{"id":12741,"nodeType":"ParameterList","parameters":[],"src":"1909:0:68"},"scope":13057,"src":"1844:320:68","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":12792,"nodeType":"Block","src":"2447:88:68","statements":[{"expression":{"id":12784,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12780,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12776,"src":"2457:6:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":12781,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"2466:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12783,"indexExpression":{"id":12782,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12773,"src":"2475:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2466:17:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2457:26:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12785,"nodeType":"ExpressionStatement","src":"2457:26:68"},{"expression":{"id":12790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12786,"name":"_unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12778,"src":"2493:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":12787,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"2508:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12789,"indexExpression":{"id":12788,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12773,"src":"2520:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2508:20:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2493:35:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12791,"nodeType":"ExpressionStatement","src":"2493:35:68"}]},"documentation":{"id":12771,"nodeType":"StructuredDocumentation","src":"2170:175:68","text":" @return amount - the amount of given token deposited to the Paymaster.\n @return _unlockBlock - the block height at which the deposit can be withdrawn."},"functionSelector":"63445989","id":12793,"implemented":true,"kind":"function","modifiers":[],"name":"depositInfo","nameLocation":"2359:11:68","nodeType":"FunctionDefinition","parameters":{"id":12774,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12773,"mutability":"mutable","name":"account","nameLocation":"2379:7:68","nodeType":"VariableDeclaration","scope":12793,"src":"2371:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12772,"name":"address","nodeType":"ElementaryTypeName","src":"2371:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2370:17:68"},"returnParameters":{"id":12779,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12776,"mutability":"mutable","name":"amount","nameLocation":"2417:6:68","nodeType":"VariableDeclaration","scope":12793,"src":"2409:14:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12775,"name":"uint256","nodeType":"ElementaryTypeName","src":"2409:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12778,"mutability":"mutable","name":"_unlockBlock","nameLocation":"2433:12:68","nodeType":"VariableDeclaration","scope":12793,"src":"2425:20:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12777,"name":"uint256","nodeType":"ElementaryTypeName","src":"2425:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2408:38:68"},"scope":13057,"src":"2350:185:68","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":12805,"nodeType":"Block","src":"2703:55:68","statements":[{"expression":{"id":12803,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12797,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"2713:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12800,"indexExpression":{"expression":{"id":12798,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2725:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2725:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2713:23:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":12801,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2739:5:68","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12802,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"2739:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2713:38:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12804,"nodeType":"ExpressionStatement","src":"2713:38:68"}]},"documentation":{"id":12794,"nodeType":"StructuredDocumentation","src":"2541:120:68","text":" unlock deposit, so that it can be withdrawn.\n can't be called in the same block as withdrawTo()"},"functionSelector":"9ed0fb68","id":12806,"implemented":true,"kind":"function","modifiers":[],"name":"unlockTokenDeposit","nameLocation":"2675:18:68","nodeType":"FunctionDefinition","parameters":{"id":12795,"nodeType":"ParameterList","parameters":[],"src":"2693:2:68"},"returnParameters":{"id":12796,"nodeType":"ParameterList","parameters":[],"src":"2703:0:68"},"scope":13057,"src":"2666:92:68","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12817,"nodeType":"Block","src":"3010:44:68","statements":[{"expression":{"id":12815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12810,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"3020:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12813,"indexExpression":{"expression":{"id":12811,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3032:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3032:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3020:23:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":12814,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3046:1:68","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3020:27:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12816,"nodeType":"ExpressionStatement","src":"3020:27:68"}]},"documentation":{"id":12807,"nodeType":"StructuredDocumentation","src":"2764:206:68","text":" lock the tokens deposited for this account so they can be used to pay for gas.\n after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"functionSelector":"cd8f80c2","id":12818,"implemented":true,"kind":"function","modifiers":[],"name":"lockTokenDeposit","nameLocation":"2984:16:68","nodeType":"FunctionDefinition","parameters":{"id":12808,"nodeType":"ParameterList","parameters":[],"src":"3000:2:68"},"returnParameters":{"id":12809,"nodeType":"ParameterList","parameters":[],"src":"3010:0:68"},"scope":13057,"src":"2975:79:68","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12858,"nodeType":"Block","src":"3317:234:68","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":12840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12827,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"3335:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12830,"indexExpression":{"expression":{"id":12828,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3347:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3347:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3335:23:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":12831,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3362:1:68","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3335:28:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12833,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3367:5:68","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"3367:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"baseExpression":{"id":12835,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"3382:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12838,"indexExpression":{"expression":{"id":12836,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3394:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12837,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3394:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3382:23:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3367:38:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3335:70:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b656e4465706f736974","id":12841,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3407:43:68","typeDescriptions":{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""},"value":"DepositPaymaster: must unlockTokenDeposit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""}],"id":12826,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3327:7:68","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12842,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3327:124:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12843,"nodeType":"ExpressionStatement","src":"3327:124:68"},{"expression":{"id":12849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":12844,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"3461:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12847,"indexExpression":{"expression":{"id":12845,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3470:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3470:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3461:20:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":12848,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12823,"src":"3485:6:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3461:30:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12850,"nodeType":"ExpressionStatement","src":"3461:30:68"},{"expression":{"arguments":[{"id":12854,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12821,"src":"3529:6:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12855,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12823,"src":"3537:6:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12851,"name":"supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12694,"src":"3501:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":12853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":4512,"src":"3501:27:68","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,uint256)"}},"id":12856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3501:43:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12857,"nodeType":"ExpressionStatement","src":"3501:43:68"}]},"documentation":{"id":12819,"nodeType":"StructuredDocumentation","src":"3060:187:68","text":" withdraw tokens.\n can only be called after unlock() is called in a previous block.\n @param target address to send to\n @param amount amount to withdraw"},"functionSelector":"f5bf3fcf","id":12859,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTokensTo","nameLocation":"3261:16:68","nodeType":"FunctionDefinition","parameters":{"id":12824,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12821,"mutability":"mutable","name":"target","nameLocation":"3286:6:68","nodeType":"VariableDeclaration","scope":12859,"src":"3278:14:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12820,"name":"address","nodeType":"ElementaryTypeName","src":"3278:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12823,"mutability":"mutable","name":"amount","nameLocation":"3302:6:68","nodeType":"VariableDeclaration","scope":12859,"src":"3294:14:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12822,"name":"uint256","nodeType":"ElementaryTypeName","src":"3294:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3277:32:68"},"returnParameters":{"id":12825,"nodeType":"ParameterList","parameters":[],"src":"3317:0:68"},"scope":13057,"src":"3252:299:68","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12902,"nodeType":"Block","src":"3878:286:68","statements":[{"assignments":[12868],"declarations":[{"constant":false,"id":12868,"mutability":"mutable","name":"priceRatioDecimals","nameLocation":"3896:18:68","nodeType":"VariableDeclaration","scope":12902,"src":"3888:26:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12867,"name":"uint256","nodeType":"ElementaryTypeName","src":"3888:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12872,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12869,"name":"gasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12699,"src":"3917:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"id":12870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"decimals","nodeType":"MemberAccess","referencedDeclaration":13065,"src":"3917:23:68","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":12871,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3917:25:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3888:54:68"},{"assignments":[12874],"declarations":[{"constant":false,"id":12874,"mutability":"mutable","name":"priceRatio","nameLocation":"3960:10:68","nodeType":"VariableDeclaration","scope":12902,"src":"3952:18:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12873,"name":"uint256","nodeType":"ElementaryTypeName","src":"3952:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12878,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12875,"name":"gasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12699,"src":"3973:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaGasPriceOracle_$13071","typeString":"contract IBobaGasPriceOracle"}},"id":12876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"priceRatio","nodeType":"MemberAccess","referencedDeclaration":13070,"src":"3973:25:68","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":12877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3973:27:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3952:48:68"},{"assignments":[12880],"declarations":[{"constant":false,"id":12880,"mutability":"mutable","name":"requiredAmount","nameLocation":"4018:14:68","nodeType":"VariableDeclaration","scope":12902,"src":"4010:22:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12879,"name":"uint256","nodeType":"ElementaryTypeName","src":"4010:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12890,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12883,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12881,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12862,"src":"4036:9:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":12882,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12874,"src":"4048:10:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4036:22:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12884,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4035:24:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":12885,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4063:2:68","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":12886,"name":"priceRatioDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12868,"src":"4067:18:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4063:22:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12888,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4062:24:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4035:51:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4010:76:68"},{"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12891,"name":"requiredAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12880,"src":"4104:14:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":12892,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4122:2:68","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":12895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3138","id":12893,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4127:2:68","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":12894,"name":"supportedTokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12696,"src":"4132:22:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4127:27:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":12896,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4126:29:68","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4122:33:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12898,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4121:35:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4104:52:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":12900,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4103:54:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":12866,"id":12901,"nodeType":"Return","src":"4096:61:68"}]},"documentation":{"id":12860,"nodeType":"StructuredDocumentation","src":"3557:214:68","text":" translate the given eth value to token amount\n @param ethBought the required eth value we want to \"buy\"\n @return requiredTokens the amount of tokens required to get this amount of eth"},"id":12903,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"3785:18:68","nodeType":"FunctionDefinition","parameters":{"id":12863,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12862,"mutability":"mutable","name":"ethBought","nameLocation":"3812:9:68","nodeType":"VariableDeclaration","scope":12903,"src":"3804:17:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12861,"name":"uint256","nodeType":"ElementaryTypeName","src":"3804:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3803:19:68"},"returnParameters":{"id":12866,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12865,"mutability":"mutable","name":"requiredTokens","nameLocation":"3862:14:68","nodeType":"VariableDeclaration","scope":12903,"src":"3854:22:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12864,"name":"uint256","nodeType":"ElementaryTypeName","src":"3854:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3853:24:68"},"scope":13057,"src":"3776:388:68","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[7373],"body":{"id":12976,"nodeType":"Block","src":"4647:649:68","statements":[{"expression":{"components":[{"id":12919,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12909,"src":"4659:10:68","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":12920,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4658:12:68","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":12921,"nodeType":"ExpressionStatement","src":"4658:12:68"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12923,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12907,"src":"4791:6:68","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12924,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"4791:27:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":12925,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12683,"src":"4821:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4791:42:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f7220706f73744f70","id":12927,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4835:42:68","typeDescriptions":{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""},"value":"DepositPaymaster: gas too low for postOp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""}],"id":12922,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4783:7:68","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12928,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4783:95:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12929,"nodeType":"ExpressionStatement","src":"4783:95:68"},{"assignments":[12931],"declarations":[{"constant":false,"id":12931,"mutability":"mutable","name":"account","nameLocation":"4897:7:68","nodeType":"VariableDeclaration","scope":12976,"src":"4889:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12930,"name":"address","nodeType":"ElementaryTypeName","src":"4889:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12935,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12932,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12907,"src":"4907:6:68","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"4907:16:68","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":12934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4907:18:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4889:36:68"},{"assignments":[12937],"declarations":[{"constant":false,"id":12937,"mutability":"mutable","name":"maxTokenCost","nameLocation":"4943:12:68","nodeType":"VariableDeclaration","scope":12976,"src":"4935:20:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12936,"name":"uint256","nodeType":"ElementaryTypeName","src":"4935:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12941,"initialValue":{"arguments":[{"id":12939,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12911,"src":"4977:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12938,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12903,"src":"4958:18:68","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":12940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4958:27:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4935:50:68"},{"assignments":[12943],"declarations":[{"constant":false,"id":12943,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"5003:14:68","nodeType":"VariableDeclaration","scope":12976,"src":"4995:22:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12942,"name":"uint256","nodeType":"ElementaryTypeName","src":"4995:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12947,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12944,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12907,"src":"5020:6:68","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":12945,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasPrice","nodeType":"MemberAccess","referencedDeclaration":11050,"src":"5020:15:68","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) view returns (uint256)"}},"id":12946,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5020:17:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4995:42:68"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12949,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12691,"src":"5055:11:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12951,"indexExpression":{"id":12950,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12931,"src":"5067:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5055:20:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":12952,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5079:1:68","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5055:25:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f636b6564","id":12954,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5082:38:68","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""},"value":"DepositPaymaster: deposit not locked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""}],"id":12948,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5047:7:68","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12955,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5047:74:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12956,"nodeType":"ExpressionStatement","src":"5047:74:68"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":12958,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"5139:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":12960,"indexExpression":{"id":12959,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12931,"src":"5148:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5139:17:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":12961,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12937,"src":"5160:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5139:33:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f77","id":12963,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5174:35:68","typeDescriptions":{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""},"value":"DepositPaymaster: deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""}],"id":12957,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5131:7:68","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":12964,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5131:79:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12965,"nodeType":"ExpressionStatement","src":"5131:79:68"},{"expression":{"components":[{"arguments":[{"id":12968,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12931,"src":"5239:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12969,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12943,"src":"5248:14:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":12970,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12937,"src":"5264:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":12971,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12911,"src":"5278:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12966,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5228:3:68","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12967,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"5228:10:68","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5228:58:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":12973,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5287:1:68","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":12974,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5227:62:68","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_rational_0_by_1_$","typeString":"tuple(bytes memory,int_const 0)"}},"functionReturnParameters":12918,"id":12975,"nodeType":"Return","src":"5220:69:68"}]},"documentation":{"id":12904,"nodeType":"StructuredDocumentation","src":"4170:288:68","text":" Validate the request:\n The sender should have enough deposit to pay the max possible cost.\n Note that the sender's balance is not checked. If it fails to pay from its balance,\n this deposit will be used to compensate the paymaster for the transaction."},"id":12977,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"4472:24:68","nodeType":"FunctionDefinition","overrides":{"id":12913,"nodeType":"OverrideSpecifier","overrides":[],"src":"4583:8:68"},"parameters":{"id":12912,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12907,"mutability":"mutable","name":"userOp","nameLocation":"4520:6:68","nodeType":"VariableDeclaration","scope":12977,"src":"4497:29:68","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":12906,"nodeType":"UserDefinedTypeName","pathNode":{"id":12905,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4497:13:68"},"referencedDeclaration":10993,"src":"4497:13:68","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":12909,"mutability":"mutable","name":"userOpHash","nameLocation":"4536:10:68","nodeType":"VariableDeclaration","scope":12977,"src":"4528:18:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12908,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4528:7:68","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":12911,"mutability":"mutable","name":"maxCost","nameLocation":"4556:7:68","nodeType":"VariableDeclaration","scope":12977,"src":"4548:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12910,"name":"uint256","nodeType":"ElementaryTypeName","src":"4548:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4496:68:68"},"returnParameters":{"id":12918,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12915,"mutability":"mutable","name":"context","nameLocation":"4614:7:68","nodeType":"VariableDeclaration","scope":12977,"src":"4601:20:68","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":12914,"name":"bytes","nodeType":"ElementaryTypeName","src":"4601:5:68","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12917,"mutability":"mutable","name":"validationData","nameLocation":"4631:14:68","nodeType":"VariableDeclaration","scope":12977,"src":"4623:22:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12916,"name":"uint256","nodeType":"ElementaryTypeName","src":"4623:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4600:46:68"},"scope":13057,"src":"4463:833:68","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[7416],"body":{"id":13055,"nodeType":"Block","src":"5806:693:68","statements":[{"assignments":[12990,12992,12994,12996],"declarations":[{"constant":false,"id":12990,"mutability":"mutable","name":"account","nameLocation":"5826:7:68","nodeType":"VariableDeclaration","scope":13055,"src":"5818:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12989,"name":"address","nodeType":"ElementaryTypeName","src":"5818:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12992,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"5843:14:68","nodeType":"VariableDeclaration","scope":13055,"src":"5835:22:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12991,"name":"uint256","nodeType":"ElementaryTypeName","src":"5835:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12994,"mutability":"mutable","name":"maxTokenCost","nameLocation":"5867:12:68","nodeType":"VariableDeclaration","scope":13055,"src":"5859:20:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12993,"name":"uint256","nodeType":"ElementaryTypeName","src":"5859:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12996,"mutability":"mutable","name":"maxCost","nameLocation":"5889:7:68","nodeType":"VariableDeclaration","scope":13055,"src":"5881:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12995,"name":"uint256","nodeType":"ElementaryTypeName","src":"5881:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13010,"initialValue":{"arguments":[{"id":12999,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12983,"src":"5911:7:68","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":13001,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5921:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13000,"name":"address","nodeType":"ElementaryTypeName","src":"5921:7:68","typeDescriptions":{}}},{"id":13003,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5930:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13002,"name":"uint256","nodeType":"ElementaryTypeName","src":"5930:7:68","typeDescriptions":{}}},{"id":13005,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5939:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13004,"name":"uint256","nodeType":"ElementaryTypeName","src":"5939:7:68","typeDescriptions":{}}},{"id":13007,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5948:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13006,"name":"uint256","nodeType":"ElementaryTypeName","src":"5948:7:68","typeDescriptions":{}}}],"id":13008,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5920:36:68","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(uint256),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(uint256),type(uint256),type(uint256))"}],"expression":{"id":12997,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5900:3:68","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12998,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5900:10:68","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":13009,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5900:57:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(address payable,uint256,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"5817:140:68"},{"assignments":[13012],"declarations":[{"constant":false,"id":13012,"mutability":"mutable","name":"actualTokenCost","nameLocation":"6034:15:68","nodeType":"VariableDeclaration","scope":13055,"src":"6026:23:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13011,"name":"uint256","nodeType":"ElementaryTypeName","src":"6026:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13023,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13022,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13020,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13013,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12985,"src":"6053:13:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13016,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13014,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12683,"src":"6069:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":13015,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12992,"src":"6084:14:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6069:29:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6053:45:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13018,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6052:47:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":13019,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12994,"src":"6102:12:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6052:62:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":13021,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12996,"src":"6117:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6052:72:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6026:98:68"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":13027,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13024,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12981,"src":"6138:4:68","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":13025,"name":"PostOpMode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10834,"src":"6146:10:68","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":13026,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"6146:25:68","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"6138:33:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":13046,"nodeType":"Block","src":"6319:128:68","statements":[{"expression":{"id":13044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":13040,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"6400:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13042,"indexExpression":{"id":13041,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12990,"src":"6409:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6400:17:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":13043,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13012,"src":"6421:15:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6400:36:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13045,"nodeType":"ExpressionStatement","src":"6400:36:68"}]},"id":13047,"nodeType":"IfStatement","src":"6134:313:68","trueBody":{"id":13039,"nodeType":"Block","src":"6173:140:68","statements":[{"expression":{"arguments":[{"id":13031,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12990,"src":"6262:7:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":13034,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"6279:4:68","typeDescriptions":{"typeIdentifier":"t_contract$_GPODepositPaymaster_$13057","typeString":"contract GPODepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GPODepositPaymaster_$13057","typeString":"contract GPODepositPaymaster"}],"id":13033,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6271:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13032,"name":"address","nodeType":"ElementaryTypeName","src":"6271:7:68","typeDescriptions":{}}},"id":13035,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6271:13:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13036,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13012,"src":"6286:15:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":13028,"name":"supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12694,"src":"6230:14:68","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":13030,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"6230:31:68","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":13037,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6230:72:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13038,"nodeType":"ExpressionStatement","src":"6230:72:68"}]}},{"expression":{"id":13053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":13048,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12687,"src":"6456:8:68","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13051,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":13049,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"6465:5:68","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":13050,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6465:7:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6456:17:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":13052,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13012,"src":"6477:15:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6456:36:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13054,"nodeType":"ExpressionStatement","src":"6456:36:68"}]},"documentation":{"id":12978,"nodeType":"StructuredDocumentation","src":"5302:400:68","text":" perform the post-operation to charge the sender for the gas.\n in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n this time in *postOpReverted* mode.\n In this mode, we use the deposit to pay (which we validated to be large enough)"},"id":13056,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"5716:7:68","nodeType":"FunctionDefinition","overrides":{"id":12987,"nodeType":"OverrideSpecifier","overrides":[],"src":"5797:8:68"},"parameters":{"id":12986,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12981,"mutability":"mutable","name":"mode","nameLocation":"5735:4:68","nodeType":"VariableDeclaration","scope":13056,"src":"5724:15:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":12980,"nodeType":"UserDefinedTypeName","pathNode":{"id":12979,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"5724:10:68"},"referencedDeclaration":10834,"src":"5724:10:68","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":12983,"mutability":"mutable","name":"context","nameLocation":"5756:7:68","nodeType":"VariableDeclaration","scope":13056,"src":"5741:22:68","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12982,"name":"bytes","nodeType":"ElementaryTypeName","src":"5741:5:68","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12985,"mutability":"mutable","name":"actualGasCost","nameLocation":"5773:13:68","nodeType":"VariableDeclaration","scope":13056,"src":"5765:21:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12984,"name":"uint256","nodeType":"ElementaryTypeName","src":"5765:7:68","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5723:64:68"},"returnParameters":{"id":12988,"nodeType":"ParameterList","parameters":[],"src":"5806:0:68"},"scope":13057,"src":"5707:792:68","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":13058,"src":"483:6018:68","usedErrors":[]}],"src":"36:6466:68"},"id":68},"contracts/samples/IBobaGasPriceOracle.sol":{"ast":{"absolutePath":"contracts/samples/IBobaGasPriceOracle.sol","exportedSymbols":{"IBobaGasPriceOracle":[13071]},"id":13072,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13059,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"32:24:69"},{"id":13060,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:69"},{"abstract":false,"baseContracts":[],"canonicalName":"IBobaGasPriceOracle","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":13071,"linearizedBaseContracts":[13071],"name":"IBobaGasPriceOracle","nameLocation":"102:19:69","nodeType":"ContractDefinition","nodes":[{"functionSelector":"313ce567","id":13065,"implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"135:8:69","nodeType":"FunctionDefinition","parameters":{"id":13061,"nodeType":"ParameterList","parameters":[],"src":"143:2:69"},"returnParameters":{"id":13064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13063,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13065,"src":"169:7:69","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13062,"name":"uint256","nodeType":"ElementaryTypeName","src":"169:7:69","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"168:9:69"},"scope":13071,"src":"126:52:69","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"0aa2f420","id":13070,"implemented":false,"kind":"function","modifiers":[],"name":"priceRatio","nameLocation":"191:10:69","nodeType":"FunctionDefinition","parameters":{"id":13066,"nodeType":"ParameterList","parameters":[],"src":"201:2:69"},"returnParameters":{"id":13069,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13068,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13070,"src":"227:7:69","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13067,"name":"uint256","nodeType":"ElementaryTypeName","src":"227:7:69","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"226:9:69"},"scope":13071,"src":"182:54:69","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13072,"src":"92:146:69","usedErrors":[]}],"src":"32:207:69"},"id":69},"contracts/samples/IBobaStraw.sol":{"ast":{"absolutePath":"contracts/samples/IBobaStraw.sol","exportedSymbols":{"IBobaStraw":[13138]},"id":13139,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13073,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"32:24:70"},{"id":13074,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:70"},{"abstract":false,"baseContracts":[],"canonicalName":"IBobaStraw","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":13138,"linearizedBaseContracts":[13138],"name":"IBobaStraw","nameLocation":"102:10:70","nodeType":"ContractDefinition","nodes":[{"functionSelector":"bcfd032d","id":13091,"implemented":false,"kind":"function","modifiers":[],"name":"latestRoundData","nameLocation":"126:15:70","nodeType":"FunctionDefinition","parameters":{"id":13079,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13076,"mutability":"mutable","name":"base","nameLocation":"155:4:70","nodeType":"VariableDeclaration","scope":13091,"src":"147:12:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13075,"name":"address","nodeType":"ElementaryTypeName","src":"147:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13078,"mutability":"mutable","name":"quote","nameLocation":"173:5:70","nodeType":"VariableDeclaration","scope":13091,"src":"165:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13077,"name":"address","nodeType":"ElementaryTypeName","src":"165:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"141:41:70"},"returnParameters":{"id":13090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13081,"mutability":"mutable","name":"roundId","nameLocation":"232:7:70","nodeType":"VariableDeclaration","scope":13091,"src":"225:14:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":13080,"name":"uint80","nodeType":"ElementaryTypeName","src":"225:6:70","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"},{"constant":false,"id":13083,"mutability":"mutable","name":"answer","nameLocation":"254:6:70","nodeType":"VariableDeclaration","scope":13091,"src":"247:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":13082,"name":"int256","nodeType":"ElementaryTypeName","src":"247:6:70","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":13085,"mutability":"mutable","name":"startedAt","nameLocation":"276:9:70","nodeType":"VariableDeclaration","scope":13091,"src":"268:17:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13084,"name":"uint256","nodeType":"ElementaryTypeName","src":"268:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13087,"mutability":"mutable","name":"updatedAt","nameLocation":"301:9:70","nodeType":"VariableDeclaration","scope":13091,"src":"293:17:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13086,"name":"uint256","nodeType":"ElementaryTypeName","src":"293:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13089,"mutability":"mutable","name":"answeredInRound","nameLocation":"325:15:70","nodeType":"VariableDeclaration","scope":13091,"src":"318:22:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":13088,"name":"uint80","nodeType":"ElementaryTypeName","src":"318:6:70","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"217:129:70"},"scope":13138,"src":"117:230:70","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"fc58749e","id":13110,"implemented":false,"kind":"function","modifiers":[],"name":"getRoundData","nameLocation":"360:12:70","nodeType":"FunctionDefinition","parameters":{"id":13098,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13093,"mutability":"mutable","name":"base","nameLocation":"386:4:70","nodeType":"VariableDeclaration","scope":13110,"src":"378:12:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13092,"name":"address","nodeType":"ElementaryTypeName","src":"378:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13095,"mutability":"mutable","name":"quote","nameLocation":"404:5:70","nodeType":"VariableDeclaration","scope":13110,"src":"396:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13094,"name":"address","nodeType":"ElementaryTypeName","src":"396:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13097,"mutability":"mutable","name":"_roundId","nameLocation":"422:8:70","nodeType":"VariableDeclaration","scope":13110,"src":"415:15:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":13096,"name":"uint80","nodeType":"ElementaryTypeName","src":"415:6:70","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"372:62:70"},"returnParameters":{"id":13109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13100,"mutability":"mutable","name":"roundId","nameLocation":"484:7:70","nodeType":"VariableDeclaration","scope":13110,"src":"477:14:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":13099,"name":"uint80","nodeType":"ElementaryTypeName","src":"477:6:70","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"},{"constant":false,"id":13102,"mutability":"mutable","name":"answer","nameLocation":"506:6:70","nodeType":"VariableDeclaration","scope":13110,"src":"499:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":13101,"name":"int256","nodeType":"ElementaryTypeName","src":"499:6:70","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":13104,"mutability":"mutable","name":"startedAt","nameLocation":"528:9:70","nodeType":"VariableDeclaration","scope":13110,"src":"520:17:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13103,"name":"uint256","nodeType":"ElementaryTypeName","src":"520:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13106,"mutability":"mutable","name":"updatedAt","nameLocation":"553:9:70","nodeType":"VariableDeclaration","scope":13110,"src":"545:17:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13105,"name":"uint256","nodeType":"ElementaryTypeName","src":"545:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13108,"mutability":"mutable","name":"answeredInRound","nameLocation":"577:15:70","nodeType":"VariableDeclaration","scope":13110,"src":"570:22:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":13107,"name":"uint80","nodeType":"ElementaryTypeName","src":"570:6:70","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"469:129:70"},"scope":13138,"src":"351:248:70","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"d4c282a3","id":13119,"implemented":false,"kind":"function","modifiers":[],"name":"latestAnswer","nameLocation":"641:12:70","nodeType":"FunctionDefinition","parameters":{"id":13115,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13112,"mutability":"mutable","name":"base","nameLocation":"667:4:70","nodeType":"VariableDeclaration","scope":13119,"src":"659:12:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13111,"name":"address","nodeType":"ElementaryTypeName","src":"659:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13114,"mutability":"mutable","name":"quote","nameLocation":"685:5:70","nodeType":"VariableDeclaration","scope":13119,"src":"677:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13113,"name":"address","nodeType":"ElementaryTypeName","src":"677:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"653:41:70"},"returnParameters":{"id":13118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13117,"mutability":"mutable","name":"answer","nameLocation":"744:6:70","nodeType":"VariableDeclaration","scope":13119,"src":"737:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":13116,"name":"int256","nodeType":"ElementaryTypeName","src":"737:6:70","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"729:27:70"},"scope":13138,"src":"632:125:70","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"672ff44f","id":13128,"implemented":false,"kind":"function","modifiers":[],"name":"latestTimestamp","nameLocation":"770:15:70","nodeType":"FunctionDefinition","parameters":{"id":13124,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13121,"mutability":"mutable","name":"base","nameLocation":"799:4:70","nodeType":"VariableDeclaration","scope":13128,"src":"791:12:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13120,"name":"address","nodeType":"ElementaryTypeName","src":"791:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13123,"mutability":"mutable","name":"quote","nameLocation":"817:5:70","nodeType":"VariableDeclaration","scope":13128,"src":"809:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13122,"name":"address","nodeType":"ElementaryTypeName","src":"809:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"785:41:70"},"returnParameters":{"id":13127,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13126,"mutability":"mutable","name":"timestamp","nameLocation":"877:9:70","nodeType":"VariableDeclaration","scope":13128,"src":"869:17:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13125,"name":"uint256","nodeType":"ElementaryTypeName","src":"869:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"861:31:70"},"scope":13138,"src":"761:132:70","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"58e2d3a8","id":13137,"implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"906:8:70","nodeType":"FunctionDefinition","parameters":{"id":13133,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13130,"mutability":"mutable","name":"base","nameLocation":"928:4:70","nodeType":"VariableDeclaration","scope":13137,"src":"920:12:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13129,"name":"address","nodeType":"ElementaryTypeName","src":"920:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13132,"mutability":"mutable","name":"quote","nameLocation":"946:5:70","nodeType":"VariableDeclaration","scope":13137,"src":"938:13:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13131,"name":"address","nodeType":"ElementaryTypeName","src":"938:7:70","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"914:41:70"},"returnParameters":{"id":13136,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13135,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13137,"src":"998:5:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":13134,"name":"uint8","nodeType":"ElementaryTypeName","src":"998:5:70","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"990:19:70"},"scope":13138,"src":"897:113:70","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13139,"src":"92:920:70","usedErrors":[]}],"src":"32:981:70"},"id":70},"contracts/samples/IOracle.sol":{"ast":{"absolutePath":"contracts/samples/IOracle.sol","exportedSymbols":{"IOracle":[13149]},"id":13150,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":13140,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:71"},{"abstract":false,"baseContracts":[],"canonicalName":"IOracle","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":13149,"linearizedBaseContracts":[13149],"name":"IOracle","nameLocation":"72:7:71","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":13141,"nodeType":"StructuredDocumentation","src":"87:86:71","text":" return amount of tokens that are required to receive that much eth."},"functionSelector":"d1eca9cf","id":13148,"implemented":false,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"187:18:71","nodeType":"FunctionDefinition","parameters":{"id":13144,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13143,"mutability":"mutable","name":"ethOutput","nameLocation":"214:9:71","nodeType":"VariableDeclaration","scope":13148,"src":"206:17:71","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13142,"name":"uint256","nodeType":"ElementaryTypeName","src":"206:7:71","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"205:19:71"},"returnParameters":{"id":13147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13146,"mutability":"mutable","name":"tokenInput","nameLocation":"256:10:71","nodeType":"VariableDeclaration","scope":13148,"src":"248:18:71","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13145,"name":"uint256","nodeType":"ElementaryTypeName","src":"248:7:71","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"247:20:71"},"scope":13149,"src":"178:90:71","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13150,"src":"62:208:71","usedErrors":[]}],"src":"36:236:71"},"id":71},"contracts/samples/ManualDepositPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/ManualDepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"Context":[5151],"IAggregator":[10603],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IOracle":[13149],"IPaymaster":[10861],"IStakeManager":[10966],"ManualDepositPaymaster":[13817],"Ownable":[2933],"SafeERC20":[4761],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":13818,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":13151,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:72"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"@openzeppelin/contracts/token/ERC20/IERC20.sol","id":13152,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13818,"sourceUnit":4420,"src":"99:56:72","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":13153,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13818,"sourceUnit":4762,"src":"156:65:72","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":13154,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13818,"sourceUnit":7529,"src":"223:35:72","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/IOracle.sol","file":"./IOracle.sol","id":13155,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13818,"sourceUnit":13150,"src":"259:23:72","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13157,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1250:13:72"},"id":13158,"nodeType":"InheritanceSpecifier","src":"1250:13:72"}],"canonicalName":"ManualDepositPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":13156,"nodeType":"StructuredDocumentation","src":"284:930:72","text":" A token-based paymaster that accepts token deposits\n The deposit is only a safeguard: the user pays with his token balance.\n only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n thus the required deposit is to cover just one method call.\n The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n (but can't use the deposit for this or further operations)\n paymasterAndData holds the paymaster address followed by the token address to use.\n @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n (the standard rules ban accessing data of an external contract)\n It can only be used if it is \"whitelisted\" by the bundler.\n (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)"},"fullyImplemented":true,"id":13817,"linearizedBaseContracts":[13817,7528,2933,5151,10861],"name":"ManualDepositPaymaster","nameLocation":"1224:22:72","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13162,"libraryName":{"id":13159,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"1277:16:72"},"nodeType":"UsingForDirective","src":"1271:41:72","typeName":{"id":13161,"nodeType":"UserDefinedTypeName","pathNode":{"id":13160,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1298:13:72"},"referencedDeclaration":10993,"src":"1298:13:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"global":false,"id":13166,"libraryName":{"id":13163,"name":"SafeERC20","nodeType":"IdentifierPath","referencedDeclaration":4761,"src":"1323:9:72"},"nodeType":"UsingForDirective","src":"1317:27:72","typeName":{"id":13165,"nodeType":"UserDefinedTypeName","pathNode":{"id":13164,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1337:6:72"},"referencedDeclaration":4419,"src":"1337:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}}},{"canonicalName":"ManualDepositPaymaster.SupportedTokenInfo","id":13180,"members":[{"constant":false,"id":13169,"mutability":"mutable","name":"token","nameLocation":"1393:5:72","nodeType":"VariableDeclaration","scope":13180,"src":"1386:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13168,"nodeType":"UserDefinedTypeName","pathNode":{"id":13167,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1386:6:72"},"referencedDeclaration":4419,"src":"1386:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13171,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1414:13:72","nodeType":"VariableDeclaration","scope":13180,"src":"1408:19:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":13170,"name":"uint8","nodeType":"ElementaryTypeName","src":"1408:5:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":13173,"mutability":"mutable","name":"priceRatio","nameLocation":"1445:10:72","nodeType":"VariableDeclaration","scope":13180,"src":"1437:18:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13172,"name":"uint256","nodeType":"ElementaryTypeName","src":"1437:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13175,"mutability":"mutable","name":"priceRatioDecimals","nameLocation":"1499:18:72","nodeType":"VariableDeclaration","scope":13180,"src":"1491:26:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13174,"name":"uint256","nodeType":"ElementaryTypeName","src":"1491:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13177,"mutability":"mutable","name":"minRatio","nameLocation":"1535:8:72","nodeType":"VariableDeclaration","scope":13180,"src":"1527:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13176,"name":"uint256","nodeType":"ElementaryTypeName","src":"1527:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13179,"mutability":"mutable","name":"maxRatio","nameLocation":"1561:8:72","nodeType":"VariableDeclaration","scope":13180,"src":"1553:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13178,"name":"uint256","nodeType":"ElementaryTypeName","src":"1553:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"SupportedTokenInfo","nameLocation":"1357:18:72","nodeType":"StructDefinition","scope":13817,"src":"1350:226:72","visibility":"public"},{"constant":true,"functionSelector":"796d4371","id":13183,"mutability":"constant","name":"COST_OF_POST","nameLocation":"1642:12:72","nodeType":"VariableDeclaration","scope":13817,"src":"1618:44:72","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13181,"name":"uint256","nodeType":"ElementaryTypeName","src":"1618:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3335303030","id":13182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1657:5:72","typeDescriptions":{"typeIdentifier":"t_rational_35000_by_1","typeString":"int_const 35000"},"value":"35000"},"visibility":"public"},{"constant":false,"functionSelector":"439a70b2","id":13189,"mutability":"mutable","name":"priceRatioInfo","nameLocation":"1714:14:72","nodeType":"VariableDeclaration","scope":13817,"src":"1669:59:72","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo)"},"typeName":{"id":13188,"keyType":{"id":13185,"nodeType":"UserDefinedTypeName","pathNode":{"id":13184,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1677:6:72"},"referencedDeclaration":4419,"src":"1677:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"1669:37:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo)"},"valueType":{"id":13187,"nodeType":"UserDefinedTypeName","pathNode":{"id":13186,"name":"SupportedTokenInfo","nodeType":"IdentifierPath","referencedDeclaration":13180,"src":"1687:18:72"},"referencedDeclaration":13180,"src":"1687:18:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage_ptr","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo"}}},"visibility":"public"},{"constant":false,"functionSelector":"c23f001f","id":13196,"mutability":"mutable","name":"balances","nameLocation":"1788:8:72","nodeType":"VariableDeclaration","scope":13817,"src":"1734:62:72","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"typeName":{"id":13195,"keyType":{"id":13191,"nodeType":"UserDefinedTypeName","pathNode":{"id":13190,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"1742:6:72"},"referencedDeclaration":4419,"src":"1742:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"Mapping","src":"1734:46:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"},"valueType":{"id":13194,"keyType":{"id":13192,"name":"address","nodeType":"ElementaryTypeName","src":"1760:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1752:27:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":13193,"name":"uint256","nodeType":"ElementaryTypeName","src":"1771:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"constant":false,"functionSelector":"4a6f84cf","id":13200,"mutability":"mutable","name":"unlockBlock","nameLocation":"1837:11:72","nodeType":"VariableDeclaration","scope":13817,"src":"1802:46:72","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":13199,"keyType":{"id":13197,"name":"address","nodeType":"ElementaryTypeName","src":"1810:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1802:27:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":13198,"name":"uint256","nodeType":"ElementaryTypeName","src":"1821:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":13212,"nodeType":"Block","src":"1919:109:72","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13209,"name":"unlockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13394,"src":"2001:18:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":13210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2001:20:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13211,"nodeType":"ExpressionStatement","src":"2001:20:72"}]},"id":13213,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13206,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13203,"src":"1906:11:72","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":13207,"kind":"baseConstructorSpecifier","modifierName":{"id":13205,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1892:13:72"},"nodeType":"ModifierInvocation","src":"1892:26:72"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13204,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13203,"mutability":"mutable","name":"_entryPoint","nameLocation":"1879:11:72","nodeType":"VariableDeclaration","scope":13213,"src":"1867:23:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":13202,"nodeType":"UserDefinedTypeName","pathNode":{"id":13201,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1867:11:72"},"referencedDeclaration":10807,"src":"1867:11:72","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1866:25:72"},"returnParameters":{"id":13208,"nodeType":"ParameterList","parameters":[],"src":"1919:0:72"},"scope":13817,"src":"1855:173:72","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13296,"nodeType":"Block","src":"2264:550:72","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13243,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":13233,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"2282:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13235,"indexExpression":{"id":13234,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13217,"src":"2297:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2282:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13236,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"token","nodeType":"MemberAccess","referencedDeclaration":13169,"src":"2282:27:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13240,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2328:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2320:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13238,"name":"address","nodeType":"ElementaryTypeName","src":"2320:7:72","typeDescriptions":{}}},"id":13241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2320:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13237,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"2313:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13242,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2313:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"2282:49:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":13232,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2274:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":13244,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2274:58:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13245,"nodeType":"ExpressionStatement","src":"2274:58:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13247,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13221,"src":"2350:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":13248,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2364:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2350:15:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20707269636520726174696f2063616e6e6f74206265207a65726f","id":13250,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2367:46:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d","typeString":"literal_string \"DepositPaymaster: price ratio cannot be zero\""},"value":"DepositPaymaster: price ratio cannot be zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d","typeString":"literal_string \"DepositPaymaster: price ratio cannot be zero\""}],"id":13246,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2342:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13251,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2342:72:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13252,"nodeType":"ExpressionStatement","src":"2342:72:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13254,"name":"minRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13225,"src":"2432:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":13255,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2444:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2432:13:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e6f74206265207a65726f","id":13257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2447:44:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04","typeString":"literal_string \"DepositPaymaster: min ratio cannot be zero\""},"value":"DepositPaymaster: min ratio cannot be zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04","typeString":"literal_string \"DepositPaymaster: min ratio cannot be zero\""}],"id":13253,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2424:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2424:68:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13259,"nodeType":"ExpressionStatement","src":"2424:68:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13263,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13261,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13221,"src":"2510:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":13262,"name":"minRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13225,"src":"2524:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2510:22:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13266,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13264,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13221,"src":"2536:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":13265,"name":"maxRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13227,"src":"2550:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2536:22:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2510:48:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420707269636520726174696f","id":13268,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2560:39:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8","typeString":"literal_string \"DepositPaymaster: Invalid price ratio\""},"value":"DepositPaymaster: Invalid price ratio"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8","typeString":"literal_string \"DepositPaymaster: Invalid price ratio\""}],"id":13260,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2502:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2502:98:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13270,"nodeType":"ExpressionStatement","src":"2502:98:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13272,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13217,"src":"2618:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13276,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2642:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2634:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13274,"name":"address","nodeType":"ElementaryTypeName","src":"2634:7:72","typeDescriptions":{}}},"id":13277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13273,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"2627:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2627:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"2618:27:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420746f6b656e","id":13280,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2647:33:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1","typeString":"literal_string \"DepositPaymaster: Invalid token\""},"value":"DepositPaymaster: Invalid token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1","typeString":"literal_string \"DepositPaymaster: Invalid token\""}],"id":13271,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2610:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13281,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2610:71:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13282,"nodeType":"ExpressionStatement","src":"2610:71:72"},{"expression":{"id":13294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":13283,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"2691:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13285,"indexExpression":{"id":13284,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13217,"src":"2706:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2691:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":13287,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13217,"src":"2734:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":13288,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13219,"src":"2741:13:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":13289,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13221,"src":"2756:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13290,"name":"priceRatioDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13223,"src":"2768:18:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13291,"name":"minRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13225,"src":"2788:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13292,"name":"maxRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13227,"src":"2798:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":13286,"name":"SupportedTokenInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13180,"src":"2715:18:72","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_SupportedTokenInfo_$13180_storage_ptr_$","typeString":"type(struct ManualDepositPaymaster.SupportedTokenInfo storage pointer)"}},"id":13293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2715:92:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_memory_ptr","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo memory"}},"src":"2691:116:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13295,"nodeType":"ExpressionStatement","src":"2691:116:72"}]},"documentation":{"id":13214,"nodeType":"StructuredDocumentation","src":"2034:69:72","text":" owner of the paymaster should add supported tokens"},"functionSelector":"763d9c79","id":13297,"implemented":true,"kind":"function","modifiers":[{"id":13230,"kind":"modifierInvocation","modifierName":{"id":13229,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2254:9:72"},"nodeType":"ModifierInvocation","src":"2254:9:72"}],"name":"addToken","nameLocation":"2117:8:72","nodeType":"FunctionDefinition","parameters":{"id":13228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13217,"mutability":"mutable","name":"token","nameLocation":"2133:5:72","nodeType":"VariableDeclaration","scope":13297,"src":"2126:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13216,"nodeType":"UserDefinedTypeName","pathNode":{"id":13215,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"2126:6:72"},"referencedDeclaration":4419,"src":"2126:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13219,"mutability":"mutable","name":"tokenDecimals","nameLocation":"2146:13:72","nodeType":"VariableDeclaration","scope":13297,"src":"2140:19:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":13218,"name":"uint8","nodeType":"ElementaryTypeName","src":"2140:5:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":13221,"mutability":"mutable","name":"priceRatio","nameLocation":"2169:10:72","nodeType":"VariableDeclaration","scope":13297,"src":"2161:18:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13220,"name":"uint256","nodeType":"ElementaryTypeName","src":"2161:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13223,"mutability":"mutable","name":"priceRatioDecimals","nameLocation":"2189:18:72","nodeType":"VariableDeclaration","scope":13297,"src":"2181:26:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13222,"name":"uint256","nodeType":"ElementaryTypeName","src":"2181:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13225,"mutability":"mutable","name":"minRatio","nameLocation":"2217:8:72","nodeType":"VariableDeclaration","scope":13297,"src":"2209:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13224,"name":"uint256","nodeType":"ElementaryTypeName","src":"2209:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13227,"mutability":"mutable","name":"maxRatio","nameLocation":"2235:8:72","nodeType":"VariableDeclaration","scope":13297,"src":"2227:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13226,"name":"uint256","nodeType":"ElementaryTypeName","src":"2227:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2125:119:72"},"returnParameters":{"id":13231,"nodeType":"ParameterList","parameters":[],"src":"2264:0:72"},"scope":13817,"src":"2108:706:72","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":13352,"nodeType":"Block","src":"3427:360:72","statements":[{"expression":{"arguments":[{"expression":{"id":13311,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3516:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13312,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3516:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":13315,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3536:4:72","typeDescriptions":{"typeIdentifier":"t_contract$_ManualDepositPaymaster_$13817","typeString":"contract ManualDepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ManualDepositPaymaster_$13817","typeString":"contract ManualDepositPaymaster"}],"id":13314,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3528:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13313,"name":"address","nodeType":"ElementaryTypeName","src":"3528:7:72","typeDescriptions":{}}},"id":13316,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3528:13:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13317,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13305,"src":"3543:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":13308,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13301,"src":"3493:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":13310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"3493:22:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":13318,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3493:57:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13319,"nodeType":"ExpressionStatement","src":"3493:57:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13331,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":13321,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"3568:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13323,"indexExpression":{"id":13322,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13301,"src":"3583:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3568:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13324,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"token","nodeType":"MemberAccess","referencedDeclaration":13169,"src":"3568:27:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3614:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13327,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3606:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13326,"name":"address","nodeType":"ElementaryTypeName","src":"3606:7:72","typeDescriptions":{}}},"id":13329,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3606:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13325,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"3599:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3599:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"3568:49:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":13332,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3619:37:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":13320,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3560:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13333,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3560:97:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13334,"nodeType":"ExpressionStatement","src":"3560:97:72"},{"expression":{"id":13341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":13335,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"3667:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13338,"indexExpression":{"id":13336,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13301,"src":"3676:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3667:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13339,"indexExpression":{"id":13337,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13303,"src":"3683:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3667:24:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":13340,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13305,"src":"3695:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3667:34:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13342,"nodeType":"ExpressionStatement","src":"3667:34:72"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13343,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3715:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3715:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":13345,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13303,"src":"3729:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3715:21:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13351,"nodeType":"IfStatement","src":"3711:70:72","trueBody":{"id":13350,"nodeType":"Block","src":"3738:43:72","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13347,"name":"lockTokenDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13406,"src":"3752:16:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":13348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3752:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13349,"nodeType":"ExpressionStatement","src":"3752:18:72"}]}}]},"documentation":{"id":13298,"nodeType":"StructuredDocumentation","src":"2820:523:72","text":" deposit tokens that a specific account can use to pay for gas.\n The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n use them - either as gas, or using withdrawTo()\n @param token the token to deposit.\n @param account the account to deposit for.\n @param amount the amount of token to deposit."},"functionSelector":"382edd9e","id":13353,"implemented":true,"kind":"function","modifiers":[],"name":"addDepositFor","nameLocation":"3357:13:72","nodeType":"FunctionDefinition","parameters":{"id":13306,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13301,"mutability":"mutable","name":"token","nameLocation":"3378:5:72","nodeType":"VariableDeclaration","scope":13353,"src":"3371:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13300,"nodeType":"UserDefinedTypeName","pathNode":{"id":13299,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"3371:6:72"},"referencedDeclaration":4419,"src":"3371:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13303,"mutability":"mutable","name":"account","nameLocation":"3393:7:72","nodeType":"VariableDeclaration","scope":13353,"src":"3385:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13302,"name":"address","nodeType":"ElementaryTypeName","src":"3385:7:72","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13305,"mutability":"mutable","name":"amount","nameLocation":"3410:6:72","nodeType":"VariableDeclaration","scope":13353,"src":"3402:14:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13304,"name":"uint256","nodeType":"ElementaryTypeName","src":"3402:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3370:47:72"},"returnParameters":{"id":13307,"nodeType":"ParameterList","parameters":[],"src":"3427:0:72"},"scope":13817,"src":"3348:439:72","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":13380,"nodeType":"Block","src":"4084:95:72","statements":[{"expression":{"id":13372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13366,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13362,"src":"4094:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":13367,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"4103:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13369,"indexExpression":{"id":13368,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13357,"src":"4112:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4103:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13371,"indexExpression":{"id":13370,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13359,"src":"4119:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4103:24:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4094:33:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13373,"nodeType":"ExpressionStatement","src":"4094:33:72"},{"expression":{"id":13378,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13374,"name":"_unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13364,"src":"4137:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":13375,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"4152:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13377,"indexExpression":{"id":13376,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13359,"src":"4164:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4152:20:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4137:35:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13379,"nodeType":"ExpressionStatement","src":"4137:35:72"}]},"documentation":{"id":13354,"nodeType":"StructuredDocumentation","src":"3793:175:72","text":" @return amount - the amount of given token deposited to the Paymaster.\n @return _unlockBlock - the block height at which the deposit can be withdrawn."},"functionSelector":"493b0170","id":13381,"implemented":true,"kind":"function","modifiers":[],"name":"depositInfo","nameLocation":"3982:11:72","nodeType":"FunctionDefinition","parameters":{"id":13360,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13357,"mutability":"mutable","name":"token","nameLocation":"4001:5:72","nodeType":"VariableDeclaration","scope":13381,"src":"3994:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13356,"nodeType":"UserDefinedTypeName","pathNode":{"id":13355,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"3994:6:72"},"referencedDeclaration":4419,"src":"3994:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13359,"mutability":"mutable","name":"account","nameLocation":"4016:7:72","nodeType":"VariableDeclaration","scope":13381,"src":"4008:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13358,"name":"address","nodeType":"ElementaryTypeName","src":"4008:7:72","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3993:31:72"},"returnParameters":{"id":13365,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13362,"mutability":"mutable","name":"amount","nameLocation":"4054:6:72","nodeType":"VariableDeclaration","scope":13381,"src":"4046:14:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13361,"name":"uint256","nodeType":"ElementaryTypeName","src":"4046:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13364,"mutability":"mutable","name":"_unlockBlock","nameLocation":"4070:12:72","nodeType":"VariableDeclaration","scope":13381,"src":"4062:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13363,"name":"uint256","nodeType":"ElementaryTypeName","src":"4062:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4045:38:72"},"scope":13817,"src":"3973:206:72","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":13393,"nodeType":"Block","src":"4347:55:72","statements":[{"expression":{"id":13391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":13385,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"4357:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13388,"indexExpression":{"expression":{"id":13386,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4369:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4369:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4357:23:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":13389,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4383:5:72","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":13390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"4383:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4357:38:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13392,"nodeType":"ExpressionStatement","src":"4357:38:72"}]},"documentation":{"id":13382,"nodeType":"StructuredDocumentation","src":"4185:120:72","text":" unlock deposit, so that it can be withdrawn.\n can't be called in the same block as withdrawTo()"},"functionSelector":"9ed0fb68","id":13394,"implemented":true,"kind":"function","modifiers":[],"name":"unlockTokenDeposit","nameLocation":"4319:18:72","nodeType":"FunctionDefinition","parameters":{"id":13383,"nodeType":"ParameterList","parameters":[],"src":"4337:2:72"},"returnParameters":{"id":13384,"nodeType":"ParameterList","parameters":[],"src":"4347:0:72"},"scope":13817,"src":"4310:92:72","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13405,"nodeType":"Block","src":"4654:44:72","statements":[{"expression":{"id":13403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":13398,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"4664:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13401,"indexExpression":{"expression":{"id":13399,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4676:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4676:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4664:23:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":13402,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4690:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4664:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13404,"nodeType":"ExpressionStatement","src":"4664:27:72"}]},"documentation":{"id":13395,"nodeType":"StructuredDocumentation","src":"4408:206:72","text":" lock the tokens deposited for this account so they can be used to pay for gas.\n after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"functionSelector":"cd8f80c2","id":13406,"implemented":true,"kind":"function","modifiers":[],"name":"lockTokenDeposit","nameLocation":"4628:16:72","nodeType":"FunctionDefinition","parameters":{"id":13396,"nodeType":"ParameterList","parameters":[],"src":"4644:2:72"},"returnParameters":{"id":13397,"nodeType":"ParameterList","parameters":[],"src":"4654:0:72"},"scope":13817,"src":"4619:79:72","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13451,"nodeType":"Block","src":"5025:232:72","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":13418,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"5043:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13421,"indexExpression":{"expression":{"id":13419,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5055:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13420,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5055:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5043:23:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":13422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5070:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5043:28:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13424,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5075:5:72","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":13425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"5075:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"baseExpression":{"id":13426,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"5090:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13429,"indexExpression":{"expression":{"id":13427,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5102:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5102:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5090:23:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5075:38:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5043:70:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b656e4465706f736974","id":13432,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5115:43:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""},"value":"DepositPaymaster: must unlockTokenDeposit"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6","typeString":"literal_string \"DepositPaymaster: must unlockTokenDeposit\""}],"id":13417,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5035:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5035:124:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13434,"nodeType":"ExpressionStatement","src":"5035:124:72"},{"expression":{"id":13442,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":13435,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"5169:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13439,"indexExpression":{"id":13436,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13410,"src":"5178:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5169:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13440,"indexExpression":{"expression":{"id":13437,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5185:3:72","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5185:10:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5169:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":13441,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13414,"src":"5200:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5169:37:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13443,"nodeType":"ExpressionStatement","src":"5169:37:72"},{"expression":{"arguments":[{"id":13447,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13412,"src":"5235:6:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13448,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13414,"src":"5243:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":13444,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13410,"src":"5216:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":13446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":4512,"src":"5216:18:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,uint256)"}},"id":13449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5216:34:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13450,"nodeType":"ExpressionStatement","src":"5216:34:72"}]},"documentation":{"id":13407,"nodeType":"StructuredDocumentation","src":"4704:237:72","text":" withdraw tokens.\n can only be called after unlock() is called in a previous block.\n @param token the token deposit to withdraw\n @param target address to send to\n @param amount amount to withdraw"},"functionSelector":"cc9c837c","id":13452,"implemented":true,"kind":"function","modifiers":[],"name":"withdrawTokensTo","nameLocation":"4955:16:72","nodeType":"FunctionDefinition","parameters":{"id":13415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13410,"mutability":"mutable","name":"token","nameLocation":"4979:5:72","nodeType":"VariableDeclaration","scope":13452,"src":"4972:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13409,"nodeType":"UserDefinedTypeName","pathNode":{"id":13408,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"4972:6:72"},"referencedDeclaration":4419,"src":"4972:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13412,"mutability":"mutable","name":"target","nameLocation":"4994:6:72","nodeType":"VariableDeclaration","scope":13452,"src":"4986:14:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13411,"name":"address","nodeType":"ElementaryTypeName","src":"4986:7:72","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13414,"mutability":"mutable","name":"amount","nameLocation":"5010:6:72","nodeType":"VariableDeclaration","scope":13452,"src":"5002:14:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13413,"name":"uint256","nodeType":"ElementaryTypeName","src":"5002:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4971:46:72"},"returnParameters":{"id":13416,"nodeType":"ParameterList","parameters":[],"src":"5025:0:72"},"scope":13817,"src":"4946:311:72","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13510,"nodeType":"Block","src":"5635:432:72","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":13464,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"5653:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13466,"indexExpression":{"id":13465,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13456,"src":"5668:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5653:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13467,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"token","nodeType":"MemberAccess","referencedDeclaration":13169,"src":"5653:27:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5699:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13470,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5691:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13469,"name":"address","nodeType":"ElementaryTypeName","src":"5691:7:72","typeDescriptions":{}}},"id":13472,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5691:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13468,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"5684:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13473,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5684:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"5653:49:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":13475,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5704:37:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":13463,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5645:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13476,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5645:97:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13477,"nodeType":"ExpressionStatement","src":"5645:97:72"},{"assignments":[13479],"declarations":[{"constant":false,"id":13479,"mutability":"mutable","name":"requiredAmount","nameLocation":"5760:14:72","nodeType":"VariableDeclaration","scope":13510,"src":"5752:22:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13478,"name":"uint256","nodeType":"ElementaryTypeName","src":"5752:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13495,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13480,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13458,"src":"5778:9:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":13481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5791:2:72","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"expression":{"baseExpression":{"id":13482,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"5795:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13484,"indexExpression":{"id":13483,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13456,"src":"5810:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5795:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13485,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"priceRatioDecimals","nodeType":"MemberAccess","referencedDeclaration":13175,"src":"5795:40:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5791:44:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13487,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5790:46:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5778:58:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13489,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5777:60:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"expression":{"baseExpression":{"id":13490,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"5840:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13492,"indexExpression":{"id":13491,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13456,"src":"5855:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5840:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13493,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"priceRatio","nodeType":"MemberAccess","referencedDeclaration":13173,"src":"5840:32:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5777:95:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5752:120:72"},{"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13507,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13496,"name":"requiredAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13479,"src":"5994:14:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":13497,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6012:2:72","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":13503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3138","id":13498,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6017:2:72","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"baseExpression":{"id":13499,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6022:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13501,"indexExpression":{"id":13500,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13456,"src":"6037:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6022:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13502,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":13171,"src":"6022:35:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6017:40:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":13504,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6016:42:72","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"6012:46:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13506,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6011:48:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5994:65:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13508,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5993:67:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":13462,"id":13509,"nodeType":"Return","src":"5986:74:72"}]},"documentation":{"id":13453,"nodeType":"StructuredDocumentation","src":"5263:251:72","text":" translate the given eth value to token amount\n @param token the token to use\n @param ethBought the required eth value we want to \"buy\"\n @return requiredTokens the amount of tokens required to get this amount of eth"},"id":13511,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"5528:18:72","nodeType":"FunctionDefinition","parameters":{"id":13459,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13456,"mutability":"mutable","name":"token","nameLocation":"5554:5:72","nodeType":"VariableDeclaration","scope":13511,"src":"5547:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13455,"nodeType":"UserDefinedTypeName","pathNode":{"id":13454,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"5547:6:72"},"referencedDeclaration":4419,"src":"5547:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13458,"mutability":"mutable","name":"ethBought","nameLocation":"5569:9:72","nodeType":"VariableDeclaration","scope":13511,"src":"5561:17:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13457,"name":"uint256","nodeType":"ElementaryTypeName","src":"5561:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5546:33:72"},"returnParameters":{"id":13462,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13461,"mutability":"mutable","name":"requiredTokens","nameLocation":"5619:14:72","nodeType":"VariableDeclaration","scope":13511,"src":"5611:22:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13460,"name":"uint256","nodeType":"ElementaryTypeName","src":"5611:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5610:24:72"},"scope":13817,"src":"5519:548:72","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":13569,"nodeType":"Block","src":"6264:347:72","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":13527,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6282:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13529,"indexExpression":{"id":13528,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13515,"src":"6297:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6282:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13530,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"token","nodeType":"MemberAccess","referencedDeclaration":13169,"src":"6282:27:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13534,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6328:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13533,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6320:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13532,"name":"address","nodeType":"ElementaryTypeName","src":"6320:7:72","typeDescriptions":{}}},"id":13535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6320:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13531,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"6313:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6313:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"6282:49:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":13538,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6333:37:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":13526,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6274:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6274:97:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13540,"nodeType":"ExpressionStatement","src":"6274:97:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13544,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13542,"name":"minRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13519,"src":"6389:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":13543,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6401:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6389:13:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d696e20726174696f2063616e6e6f74206265207a65726f","id":13545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6404:26:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1","typeString":"literal_string \"min ratio cannot be zero\""},"value":"min ratio cannot be zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1","typeString":"literal_string \"min ratio cannot be zero\""}],"id":13541,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6381:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6381:50:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13547,"nodeType":"ExpressionStatement","src":"6381:50:72"},{"expression":{"id":13553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":13548,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6441:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13550,"indexExpression":{"id":13549,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13515,"src":"6456:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6441:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13551,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"priceRatioDecimals","nodeType":"MemberAccess","referencedDeclaration":13175,"src":"6441:40:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13552,"name":"priceRatioDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13517,"src":"6484:18:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6441:61:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13554,"nodeType":"ExpressionStatement","src":"6441:61:72"},{"expression":{"id":13560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":13555,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6512:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13557,"indexExpression":{"id":13556,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13515,"src":"6527:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6512:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13558,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"minRatio","nodeType":"MemberAccess","referencedDeclaration":13177,"src":"6512:30:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13559,"name":"minRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13519,"src":"6545:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6512:41:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13561,"nodeType":"ExpressionStatement","src":"6512:41:72"},{"expression":{"id":13567,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":13562,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6563:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13564,"indexExpression":{"id":13563,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13515,"src":"6578:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6563:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13565,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"maxRatio","nodeType":"MemberAccess","referencedDeclaration":13179,"src":"6563:30:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13566,"name":"maxRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13521,"src":"6596:8:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6563:41:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13568,"nodeType":"ExpressionStatement","src":"6563:41:72"}]},"documentation":{"id":13512,"nodeType":"StructuredDocumentation","src":"6073:62:72","text":" allows the owner to update the token params"},"functionSelector":"e29db4dc","id":13570,"implemented":true,"kind":"function","modifiers":[{"id":13524,"kind":"modifierInvocation","modifierName":{"id":13523,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"6254:9:72"},"nodeType":"ModifierInvocation","src":"6254:9:72"}],"name":"updateTokenParams","nameLocation":"6149:17:72","nodeType":"FunctionDefinition","parameters":{"id":13522,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13515,"mutability":"mutable","name":"token","nameLocation":"6174:5:72","nodeType":"VariableDeclaration","scope":13570,"src":"6167:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13514,"nodeType":"UserDefinedTypeName","pathNode":{"id":13513,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"6167:6:72"},"referencedDeclaration":4419,"src":"6167:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13517,"mutability":"mutable","name":"priceRatioDecimals","nameLocation":"6189:18:72","nodeType":"VariableDeclaration","scope":13570,"src":"6181:26:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13516,"name":"uint256","nodeType":"ElementaryTypeName","src":"6181:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13519,"mutability":"mutable","name":"minRatio","nameLocation":"6217:8:72","nodeType":"VariableDeclaration","scope":13570,"src":"6209:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13518,"name":"uint256","nodeType":"ElementaryTypeName","src":"6209:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13521,"mutability":"mutable","name":"maxRatio","nameLocation":"6235:8:72","nodeType":"VariableDeclaration","scope":13570,"src":"6227:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13520,"name":"uint256","nodeType":"ElementaryTypeName","src":"6227:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6166:78:72"},"returnParameters":{"id":13525,"nodeType":"ParameterList","parameters":[],"src":"6264:0:72"},"scope":13817,"src":"6140:471:72","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":13620,"nodeType":"Block","src":"6828:321:72","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"id":13592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":13582,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6846:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13584,"indexExpression":{"id":13583,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13574,"src":"6861:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6846:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13585,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"token","nodeType":"MemberAccess","referencedDeclaration":13169,"src":"6846:27:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6892:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13588,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6884:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13587,"name":"address","nodeType":"ElementaryTypeName","src":"6884:7:72","typeDescriptions":{}}},"id":13590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6884:10:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13586,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"6877:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13591,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6877:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"src":"6846:49:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f6b656e","id":13593,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6897:37:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""},"value":"DepositPaymaster: unsupported token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24","typeString":"literal_string \"DepositPaymaster: unsupported token\""}],"id":13581,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6838:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13594,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6838:97:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13595,"nodeType":"ExpressionStatement","src":"6838:97:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13609,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13597,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13576,"src":"6953:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"baseExpression":{"id":13598,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"6967:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13600,"indexExpression":{"id":13599,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13574,"src":"6982:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6967:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13601,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"minRatio","nodeType":"MemberAccess","referencedDeclaration":13177,"src":"6967:30:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6953:44:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13608,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13603,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13576,"src":"7001:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"baseExpression":{"id":13604,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"7015:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13606,"indexExpression":{"id":13605,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13574,"src":"7030:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7015:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13607,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxRatio","nodeType":"MemberAccess","referencedDeclaration":13179,"src":"7015:30:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7001:44:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6953:92:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420707269636520726174696f","id":13610,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7047:39:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8","typeString":"literal_string \"DepositPaymaster: Invalid price ratio\""},"value":"DepositPaymaster: Invalid price ratio"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8","typeString":"literal_string \"DepositPaymaster: Invalid price ratio\""}],"id":13596,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6945:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13611,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6945:142:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13612,"nodeType":"ExpressionStatement","src":"6945:142:72"},{"expression":{"id":13618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":13613,"name":"priceRatioInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13189,"src":"7097:14:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_struct$_SupportedTokenInfo_$13180_storage_$","typeString":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo storage ref)"}},"id":13615,"indexExpression":{"id":13614,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13574,"src":"7112:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7097:21:72","typeDescriptions":{"typeIdentifier":"t_struct$_SupportedTokenInfo_$13180_storage","typeString":"struct ManualDepositPaymaster.SupportedTokenInfo storage ref"}},"id":13616,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"priceRatio","nodeType":"MemberAccess","referencedDeclaration":13173,"src":"7097:32:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13617,"name":"priceRatio","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13576,"src":"7132:10:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7097:45:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13619,"nodeType":"ExpressionStatement","src":"7097:45:72"}]},"documentation":{"id":13571,"nodeType":"StructuredDocumentation","src":"6617:127:72","text":" allows the owner to update the price Ratio of a token\n can be called as per precision desired by owner"},"functionSelector":"24ee2999","id":13621,"implemented":true,"kind":"function","modifiers":[{"id":13579,"kind":"modifierInvocation","modifierName":{"id":13578,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"6818:9:72"},"nodeType":"ModifierInvocation","src":"6818:9:72"}],"name":"updatePriceRatio","nameLocation":"6758:16:72","nodeType":"FunctionDefinition","parameters":{"id":13577,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13574,"mutability":"mutable","name":"token","nameLocation":"6782:5:72","nodeType":"VariableDeclaration","scope":13621,"src":"6775:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13573,"nodeType":"UserDefinedTypeName","pathNode":{"id":13572,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"6775:6:72"},"referencedDeclaration":4419,"src":"6775:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13576,"mutability":"mutable","name":"priceRatio","nameLocation":"6797:10:72","nodeType":"VariableDeclaration","scope":13621,"src":"6789:18:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13575,"name":"uint256","nodeType":"ElementaryTypeName","src":"6789:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6774:34:72"},"returnParameters":{"id":13580,"nodeType":"ParameterList","parameters":[],"src":"6828:0:72"},"scope":13817,"src":"6749:400:72","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[7373],"body":{"id":13728,"nodeType":"Block","src":"7632:917:72","statements":[{"expression":{"components":[{"id":13637,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13627,"src":"7644:10:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":13638,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7643:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":13639,"nodeType":"ExpressionStatement","src":"7643:12:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13644,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13641,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13625,"src":"7776:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":13642,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"7776:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":13643,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13183,"src":"7806:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7776:42:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f7220706f73744f70","id":13645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7820:42:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""},"value":"DepositPaymaster: gas too low for postOp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd","typeString":"literal_string \"DepositPaymaster: gas too low for postOp\""}],"id":13640,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7768:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7768:95:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13647,"nodeType":"ExpressionStatement","src":"7768:95:72"},{"assignments":[13649],"declarations":[{"constant":false,"id":13649,"mutability":"mutable","name":"paymasterAndData","nameLocation":"7889:16:72","nodeType":"VariableDeclaration","scope":13728,"src":"7874:31:72","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13648,"name":"bytes","nodeType":"ElementaryTypeName","src":"7874:5:72","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":13652,"initialValue":{"expression":{"id":13650,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13625,"src":"7908:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":13651,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"7908:23:72","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"7874:57:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13654,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13649,"src":"7949:16:72","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":13655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7949:23:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"id":13658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3230","id":13656,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7976:2:72","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3230","id":13657,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7979:2:72","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"7976:5:72","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"}},"src":"7949:32:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e6444617461206d757374207370656369667920746f6b656e","id":13660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7983:55:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""},"value":"DepositPaymaster: paymasterAndData must specify token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8","typeString":"literal_string \"DepositPaymaster: paymasterAndData must specify token\""}],"id":13653,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7941:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7941:98:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13662,"nodeType":"ExpressionStatement","src":"7941:98:72"},{"assignments":[13665],"declarations":[{"constant":false,"id":13665,"mutability":"mutable","name":"token","nameLocation":"8056:5:72","nodeType":"VariableDeclaration","scope":13728,"src":"8049:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13664,"nodeType":"UserDefinedTypeName","pathNode":{"id":13663,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"8049:6:72"},"referencedDeclaration":4419,"src":"8049:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"}],"id":13677,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"baseExpression":{"id":13671,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13649,"src":"8087:16:72","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":13673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"8087:21:72","startExpression":{"hexValue":"3230","id":13672,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8104:2:72","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":13670,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8079:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":13669,"name":"bytes20","nodeType":"ElementaryTypeName","src":"8079:7:72","typeDescriptions":{}}},"id":13674,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8079:30:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":13668,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8071:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13667,"name":"address","nodeType":"ElementaryTypeName","src":"8071:7:72","typeDescriptions":{}}},"id":13675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8071:39:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13666,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"8064:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},"id":13676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8064:47:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"nodeType":"VariableDeclarationStatement","src":"8049:62:72"},{"assignments":[13679],"declarations":[{"constant":false,"id":13679,"mutability":"mutable","name":"account","nameLocation":"8129:7:72","nodeType":"VariableDeclaration","scope":13728,"src":"8121:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13678,"name":"address","nodeType":"ElementaryTypeName","src":"8121:7:72","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":13683,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13680,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13625,"src":"8139:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":13681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"8139:16:72","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":13682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8139:18:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"8121:36:72"},{"assignments":[13685],"declarations":[{"constant":false,"id":13685,"mutability":"mutable","name":"maxTokenCost","nameLocation":"8175:12:72","nodeType":"VariableDeclaration","scope":13728,"src":"8167:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13684,"name":"uint256","nodeType":"ElementaryTypeName","src":"8167:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13690,"initialValue":{"arguments":[{"id":13687,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13665,"src":"8209:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":13688,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13629,"src":"8216:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":13686,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13511,"src":"8190:18:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_contract$_IERC20_$4419_$_t_uint256_$returns$_t_uint256_$","typeString":"function (contract IERC20,uint256) view returns (uint256)"}},"id":13689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8190:34:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8167:57:72"},{"assignments":[13692],"declarations":[{"constant":false,"id":13692,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"8242:14:72","nodeType":"VariableDeclaration","scope":13728,"src":"8234:22:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13691,"name":"uint256","nodeType":"ElementaryTypeName","src":"8234:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13696,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13693,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13625,"src":"8259:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":13694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gasPrice","nodeType":"MemberAccess","referencedDeclaration":11050,"src":"8259:15:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) view returns (uint256)"}},"id":13695,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8259:17:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8234:42:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13702,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":13698,"name":"unlockBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"8294:11:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13700,"indexExpression":{"id":13699,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13679,"src":"8306:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8294:20:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":13701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8318:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8294:25:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f636b6564","id":13703,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8321:38:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""},"value":"DepositPaymaster: deposit not locked"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7","typeString":"literal_string \"DepositPaymaster: deposit not locked\""}],"id":13697,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8286:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13704,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8286:74:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13705,"nodeType":"ExpressionStatement","src":"8286:74:72"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"id":13707,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"8378:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13709,"indexExpression":{"id":13708,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13665,"src":"8387:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8378:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13711,"indexExpression":{"id":13710,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13679,"src":"8394:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8378:24:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":13712,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13685,"src":"8406:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8378:40:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f77","id":13714,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8420:35:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""},"value":"DepositPaymaster: deposit too low"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb","typeString":"literal_string \"DepositPaymaster: deposit too low\""}],"id":13706,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8370:7:72","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13715,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8370:86:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13716,"nodeType":"ExpressionStatement","src":"8370:86:72"},{"expression":{"components":[{"arguments":[{"id":13719,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13679,"src":"8485:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13720,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13665,"src":"8494:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":13721,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13692,"src":"8501:14:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13722,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13685,"src":"8517:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13723,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13629,"src":"8531:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":13717,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8474:3:72","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":13718,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"8474:10:72","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":13724,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8474:65:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":13725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8540:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":13726,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8473:69:72","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_rational_0_by_1_$","typeString":"tuple(bytes memory,int_const 0)"}},"functionReturnParameters":13636,"id":13727,"nodeType":"Return","src":"8466:76:72"}]},"documentation":{"id":13622,"nodeType":"StructuredDocumentation","src":"7155:288:72","text":" Validate the request:\n The sender should have enough deposit to pay the max possible cost.\n Note that the sender's balance is not checked. If it fails to pay from its balance,\n this deposit will be used to compensate the paymaster for the transaction."},"id":13729,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"7457:24:72","nodeType":"FunctionDefinition","overrides":{"id":13631,"nodeType":"OverrideSpecifier","overrides":[],"src":"7568:8:72"},"parameters":{"id":13630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13625,"mutability":"mutable","name":"userOp","nameLocation":"7505:6:72","nodeType":"VariableDeclaration","scope":13729,"src":"7482:29:72","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":13624,"nodeType":"UserDefinedTypeName","pathNode":{"id":13623,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7482:13:72"},"referencedDeclaration":10993,"src":"7482:13:72","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":13627,"mutability":"mutable","name":"userOpHash","nameLocation":"7521:10:72","nodeType":"VariableDeclaration","scope":13729,"src":"7513:18:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13626,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7513:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13629,"mutability":"mutable","name":"maxCost","nameLocation":"7541:7:72","nodeType":"VariableDeclaration","scope":13729,"src":"7533:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13628,"name":"uint256","nodeType":"ElementaryTypeName","src":"7533:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7481:68:72"},"returnParameters":{"id":13636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13633,"mutability":"mutable","name":"context","nameLocation":"7599:7:72","nodeType":"VariableDeclaration","scope":13729,"src":"7586:20:72","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":13632,"name":"bytes","nodeType":"ElementaryTypeName","src":"7586:5:72","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":13635,"mutability":"mutable","name":"validationData","nameLocation":"7616:14:72","nodeType":"VariableDeclaration","scope":13729,"src":"7608:22:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13634,"name":"uint256","nodeType":"ElementaryTypeName","src":"7608:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7585:46:72"},"scope":13817,"src":"7448:1101:72","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[7416],"body":{"id":13815,"nodeType":"Block","src":"9059:720:72","statements":[{"assignments":[13742,13745,13747,13749,13751],"declarations":[{"constant":false,"id":13742,"mutability":"mutable","name":"account","nameLocation":"9079:7:72","nodeType":"VariableDeclaration","scope":13815,"src":"9071:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13741,"name":"address","nodeType":"ElementaryTypeName","src":"9071:7:72","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13745,"mutability":"mutable","name":"token","nameLocation":"9095:5:72","nodeType":"VariableDeclaration","scope":13815,"src":"9088:12:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":13744,"nodeType":"UserDefinedTypeName","pathNode":{"id":13743,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"9088:6:72"},"referencedDeclaration":4419,"src":"9088:6:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":13747,"mutability":"mutable","name":"gasPriceUserOp","nameLocation":"9110:14:72","nodeType":"VariableDeclaration","scope":13815,"src":"9102:22:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13746,"name":"uint256","nodeType":"ElementaryTypeName","src":"9102:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13749,"mutability":"mutable","name":"maxTokenCost","nameLocation":"9134:12:72","nodeType":"VariableDeclaration","scope":13815,"src":"9126:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13748,"name":"uint256","nodeType":"ElementaryTypeName","src":"9126:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13751,"mutability":"mutable","name":"maxCost","nameLocation":"9156:7:72","nodeType":"VariableDeclaration","scope":13815,"src":"9148:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13750,"name":"uint256","nodeType":"ElementaryTypeName","src":"9148:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13766,"initialValue":{"arguments":[{"id":13754,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13735,"src":"9178:7:72","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":13756,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9188:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13755,"name":"address","nodeType":"ElementaryTypeName","src":"9188:7:72","typeDescriptions":{}}},{"id":13757,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4419,"src":"9197:6:72","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$4419_$","typeString":"type(contract IERC20)"}},{"id":13759,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9205:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13758,"name":"uint256","nodeType":"ElementaryTypeName","src":"9205:7:72","typeDescriptions":{}}},{"id":13761,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9214:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13760,"name":"uint256","nodeType":"ElementaryTypeName","src":"9214:7:72","typeDescriptions":{}}},{"id":13763,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9223:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":13762,"name":"uint256","nodeType":"ElementaryTypeName","src":"9223:7:72","typeDescriptions":{}}}],"id":13764,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"9187:44:72","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_address_$_$_t_type$_t_contract$_IERC20_$4419_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(address),type(contract IERC20),type(uint256),type(uint256),type(uint256))"}],"expression":{"id":13752,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"9167:3:72","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":13753,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"9167:10:72","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":13765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9167:65:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_payable_$_t_contract$_IERC20_$4419_$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(address payable,contract IERC20,uint256,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"9070:162:72"},{"assignments":[13768],"declarations":[{"constant":false,"id":13768,"mutability":"mutable","name":"actualTokenCost","nameLocation":"9309:15:72","nodeType":"VariableDeclaration","scope":13815,"src":"9301:23:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13767,"name":"uint256","nodeType":"ElementaryTypeName","src":"9301:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13779,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13773,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13769,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13737,"src":"9328:13:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13770,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13183,"src":"9344:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":13771,"name":"gasPriceUserOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13747,"src":"9359:14:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9344:29:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9328:45:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":13774,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9327:47:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":13775,"name":"maxTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13749,"src":"9377:12:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9327:62:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":13777,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13751,"src":"9392:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9327:72:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9301:98:72"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"id":13783,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13780,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13733,"src":"9413:4:72","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":13781,"name":"PostOpMode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10834,"src":"9421:10:72","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_PostOpMode_$10834_$","typeString":"type(enum IPaymaster.PostOpMode)"}},"id":13782,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"postOpReverted","nodeType":"MemberAccess","referencedDeclaration":10833,"src":"9421:25:72","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"src":"9413:33:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":13804,"nodeType":"Block","src":"9585:135:72","statements":[{"expression":{"id":13802,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":13796,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"9666:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13799,"indexExpression":{"id":13797,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13745,"src":"9675:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9666:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13800,"indexExpression":{"id":13798,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13742,"src":"9682:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9666:24:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":13801,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13768,"src":"9694:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9666:43:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13803,"nodeType":"ExpressionStatement","src":"9666:43:72"}]},"id":13805,"nodeType":"IfStatement","src":"9409:311:72","trueBody":{"id":13795,"nodeType":"Block","src":"9448:131:72","statements":[{"expression":{"arguments":[{"id":13787,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13742,"src":"9528:7:72","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":13790,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"9545:4:72","typeDescriptions":{"typeIdentifier":"t_contract$_ManualDepositPaymaster_$13817","typeString":"contract ManualDepositPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ManualDepositPaymaster_$13817","typeString":"contract ManualDepositPaymaster"}],"id":13789,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9537:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13788,"name":"address","nodeType":"ElementaryTypeName","src":"9537:7:72","typeDescriptions":{}}},"id":13791,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9537:13:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13792,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13768,"src":"9552:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":13784,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13745,"src":"9505:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"id":13786,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":4538,"src":"9505:22:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$4419_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$4419_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":13793,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9505:63:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13794,"nodeType":"ExpressionStatement","src":"9505:63:72"}]}},{"expression":{"id":13813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":13806,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13196,"src":"9729:8:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IERC20_$4419_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(contract IERC20 => mapping(address => uint256))"}},"id":13810,"indexExpression":{"id":13807,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13745,"src":"9738:5:72","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9729:15:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":13811,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":13808,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"9745:5:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":13809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9745:7:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9729:24:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":13812,"name":"actualTokenCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13768,"src":"9757:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9729:43:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13814,"nodeType":"ExpressionStatement","src":"9729:43:72"}]},"documentation":{"id":13730,"nodeType":"StructuredDocumentation","src":"8555:400:72","text":" perform the post-operation to charge the sender for the gas.\n in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n this time in *postOpReverted* mode.\n In this mode, we use the deposit to pay (which we validated to be large enough)"},"id":13816,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"8969:7:72","nodeType":"FunctionDefinition","overrides":{"id":13739,"nodeType":"OverrideSpecifier","overrides":[],"src":"9050:8:72"},"parameters":{"id":13738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13733,"mutability":"mutable","name":"mode","nameLocation":"8988:4:72","nodeType":"VariableDeclaration","scope":13816,"src":"8977:15:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":13732,"nodeType":"UserDefinedTypeName","pathNode":{"id":13731,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"8977:10:72"},"referencedDeclaration":10834,"src":"8977:10:72","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":13735,"mutability":"mutable","name":"context","nameLocation":"9009:7:72","nodeType":"VariableDeclaration","scope":13816,"src":"8994:22:72","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13734,"name":"bytes","nodeType":"ElementaryTypeName","src":"8994:5:72","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":13737,"mutability":"mutable","name":"actualGasCost","nameLocation":"9026:13:72","nodeType":"VariableDeclaration","scope":13816,"src":"9018:21:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13736,"name":"uint256","nodeType":"ElementaryTypeName","src":"9018:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8976:64:72"},"returnParameters":{"id":13740,"nodeType":"ParameterList","parameters":[],"src":"9059:0:72"},"scope":13817,"src":"8960:819:72","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":13818,"src":"1215:8566:72","usedErrors":[]}],"src":"36:9746:72"},"id":72},"contracts/samples/SimpleAccount.sol":{"ast":{"absolutePath":"contracts/samples/SimpleAccount.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":14142,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":13819,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:73"},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":13820,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14142,"sourceUnit":5829,"src":"184:62:73","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","id":13821,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14142,"sourceUnit":3544,"src":"247:63:73","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","file":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","id":13822,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14142,"sourceUnit":3660,"src":"311:65:73","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BaseAccount.sol","file":"../core/BaseAccount.sol","id":13823,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14142,"sourceUnit":7309,"src":"378:33:73","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/callback/TokenCallbackHandler.sol","file":"./callback/TokenCallbackHandler.sol","id":13824,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14142,"sourceUnit":17938,"src":"412:45:73","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13826,"name":"BaseAccount","nodeType":"IdentifierPath","referencedDeclaration":7308,"src":"663:11:73"},"id":13827,"nodeType":"InheritanceSpecifier","src":"663:11:73"},{"baseName":{"id":13828,"name":"TokenCallbackHandler","nodeType":"IdentifierPath","referencedDeclaration":17937,"src":"676:20:73"},"id":13829,"nodeType":"InheritanceSpecifier","src":"676:20:73"},{"baseName":{"id":13830,"name":"UUPSUpgradeable","nodeType":"IdentifierPath","referencedDeclaration":3659,"src":"698:15:73"},"id":13831,"nodeType":"InheritanceSpecifier","src":"698:15:73"},{"baseName":{"id":13832,"name":"Initializable","nodeType":"IdentifierPath","referencedDeclaration":3543,"src":"715:13:73"},"id":13833,"nodeType":"InheritanceSpecifier","src":"715:13:73"}],"canonicalName":"SimpleAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":13825,"nodeType":"StructuredDocumentation","src":"459:177:73","text":" minimal account.\n this is sample minimal account.\n has execute, eth handling methods\n has a single signer that can send requests through the entryPoint."},"fullyImplemented":true,"id":14141,"linearizedBaseContracts":[14141,3543,3659,3312,2957,17937,3754,5840,4779,4799,7308,10569],"name":"SimpleAccount","nameLocation":"646:13:73","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13836,"libraryName":{"id":13834,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"741:5:73"},"nodeType":"UsingForDirective","src":"735:24:73","typeName":{"id":13835,"name":"bytes32","nodeType":"ElementaryTypeName","src":"751:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"constant":false,"functionSelector":"8da5cb5b","id":13838,"mutability":"mutable","name":"owner","nameLocation":"780:5:73","nodeType":"VariableDeclaration","scope":14141,"src":"765:20:73","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13837,"name":"address","nodeType":"ElementaryTypeName","src":"765:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"id":13841,"mutability":"immutable","name":"_entryPoint","nameLocation":"822:11:73","nodeType":"VariableDeclaration","scope":14141,"src":"792:41:73","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":13840,"nodeType":"UserDefinedTypeName","pathNode":{"id":13839,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"792:11:73"},"referencedDeclaration":10807,"src":"792:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"private"},{"anonymous":false,"eventSelector":"47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de","id":13848,"name":"SimpleAccountInitialized","nameLocation":"846:24:73","nodeType":"EventDefinition","parameters":{"id":13847,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13844,"indexed":true,"mutability":"mutable","name":"entryPoint","nameLocation":"891:10:73","nodeType":"VariableDeclaration","scope":13848,"src":"871:30:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":13843,"nodeType":"UserDefinedTypeName","pathNode":{"id":13842,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"871:11:73"},"referencedDeclaration":10807,"src":"871:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":13846,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"919:5:73","nodeType":"VariableDeclaration","scope":13848,"src":"903:21:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13845,"name":"address","nodeType":"ElementaryTypeName","src":"903:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"870:55:73"},"src":"840:86:73"},{"body":{"id":13854,"nodeType":"Block","src":"953:40:73","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13850,"name":"_onlyOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13904,"src":"963:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":13851,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"963:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13852,"nodeType":"ExpressionStatement","src":"963:12:73"},{"id":13853,"nodeType":"PlaceholderStatement","src":"985:1:73"}]},"id":13855,"name":"onlyOwner","nameLocation":"941:9:73","nodeType":"ModifierDefinition","parameters":{"id":13849,"nodeType":"ParameterList","parameters":[],"src":"950:2:73"},"src":"932:61:73","virtual":false,"visibility":"internal"},{"baseFunctions":[7205],"body":{"id":13865,"nodeType":"Block","src":"1104:35:73","statements":[{"expression":{"id":13863,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13841,"src":"1121:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"functionReturnParameters":13862,"id":13864,"nodeType":"Return","src":"1114:18:73"}]},"documentation":{"id":13856,"nodeType":"StructuredDocumentation","src":"999:27:73","text":"@inheritdoc BaseAccount"},"functionSelector":"b0d691fe","id":13866,"implemented":true,"kind":"function","modifiers":[],"name":"entryPoint","nameLocation":"1040:10:73","nodeType":"FunctionDefinition","overrides":{"id":13858,"nodeType":"OverrideSpecifier","overrides":[],"src":"1073:8:73"},"parameters":{"id":13857,"nodeType":"ParameterList","parameters":[],"src":"1050:2:73"},"returnParameters":{"id":13862,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13861,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13866,"src":"1091:11:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":13860,"nodeType":"UserDefinedTypeName","pathNode":{"id":13859,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1091:11:73"},"referencedDeclaration":10807,"src":"1091:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1090:13:73"},"scope":14141,"src":"1031:108:73","stateMutability":"view","virtual":true,"visibility":"public"},{"body":{"id":13869,"nodeType":"Block","src":"1222:2:73","statements":[]},"id":13870,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13867,"nodeType":"ParameterList","parameters":[],"src":"1202:2:73"},"returnParameters":{"id":13868,"nodeType":"ParameterList","parameters":[],"src":"1222:0:73"},"scope":14141,"src":"1195:29:73","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":13883,"nodeType":"Block","src":"1268:75:73","statements":[{"expression":{"id":13878,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13876,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13841,"src":"1278:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13877,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13873,"src":"1292:12:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"1278:26:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":13879,"nodeType":"ExpressionStatement","src":"1278:26:73"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13880,"name":"_disableInitializers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3524,"src":"1314:20:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":13881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1314:22:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13882,"nodeType":"ExpressionStatement","src":"1314:22:73"}]},"id":13884,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13873,"mutability":"mutable","name":"anEntryPoint","nameLocation":"1254:12:73","nodeType":"VariableDeclaration","scope":13884,"src":"1242:24:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":13872,"nodeType":"UserDefinedTypeName","pathNode":{"id":13871,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1242:11:73"},"referencedDeclaration":10807,"src":"1242:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1241:26:73"},"returnParameters":{"id":13875,"nodeType":"ParameterList","parameters":[],"src":"1268:0:73"},"scope":14141,"src":"1230:113:73","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13903,"nodeType":"Block","src":"1385:197:73","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13891,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13888,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1510:3:73","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1510:10:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":13890,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13838,"src":"1524:5:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1510:19:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13892,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1533:3:73","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13893,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1533:10:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":13896,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1555:4:73","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}],"id":13895,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1547:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13894,"name":"address","nodeType":"ElementaryTypeName","src":"1547:7:73","typeDescriptions":{}}},"id":13897,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1547:13:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1533:27:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1510:50:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6f6e6c79206f776e6572","id":13900,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1562:12:73","typeDescriptions":{"typeIdentifier":"t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367","typeString":"literal_string \"only owner\""},"value":"only owner"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367","typeString":"literal_string \"only owner\""}],"id":13887,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1502:7:73","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13901,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1502:73:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13902,"nodeType":"ExpressionStatement","src":"1502:73:73"}]},"id":13904,"implemented":true,"kind":"function","modifiers":[],"name":"_onlyOwner","nameLocation":"1358:10:73","nodeType":"FunctionDefinition","parameters":{"id":13885,"nodeType":"ParameterList","parameters":[],"src":"1368:2:73"},"returnParameters":{"id":13886,"nodeType":"ParameterList","parameters":[],"src":"1385:0:73"},"scope":14141,"src":"1349:233:73","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":13923,"nodeType":"Block","src":"1756:82:73","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13914,"name":"_requireFromEntryPointOrOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14019,"src":"1766:29:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":13915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1766:31:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13916,"nodeType":"ExpressionStatement","src":"1766:31:73"},{"expression":{"arguments":[{"id":13918,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13907,"src":"1813:4:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13919,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13909,"src":"1819:5:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":13920,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13911,"src":"1826:4:73","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":13917,"name":"_call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14076,"src":"1807:5:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":13921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1807:24:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13922,"nodeType":"ExpressionStatement","src":"1807:24:73"}]},"documentation":{"id":13905,"nodeType":"StructuredDocumentation","src":"1588:87:73","text":" execute a transaction (called directly from owner, or by entryPoint)"},"functionSelector":"b61d27f6","id":13924,"implemented":true,"kind":"function","modifiers":[],"name":"execute","nameLocation":"1689:7:73","nodeType":"FunctionDefinition","parameters":{"id":13912,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13907,"mutability":"mutable","name":"dest","nameLocation":"1705:4:73","nodeType":"VariableDeclaration","scope":13924,"src":"1697:12:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13906,"name":"address","nodeType":"ElementaryTypeName","src":"1697:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13909,"mutability":"mutable","name":"value","nameLocation":"1719:5:73","nodeType":"VariableDeclaration","scope":13924,"src":"1711:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13908,"name":"uint256","nodeType":"ElementaryTypeName","src":"1711:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":13911,"mutability":"mutable","name":"func","nameLocation":"1741:4:73","nodeType":"VariableDeclaration","scope":13924,"src":"1726:19:73","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13910,"name":"bytes","nodeType":"ElementaryTypeName","src":"1726:5:73","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1696:50:73"},"returnParameters":{"id":13913,"nodeType":"ParameterList","parameters":[],"src":"1756:0:73"},"scope":14141,"src":"1680:158:73","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":13969,"nodeType":"Block","src":"1981:218:73","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13934,"name":"_requireFromEntryPointOrOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14019,"src":"1991:29:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":13935,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1991:31:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13936,"nodeType":"ExpressionStatement","src":"1991:31:73"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13938,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13928,"src":"2040:4:73","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":13939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2040:11:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":13940,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13931,"src":"2055:4:73","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":13941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2055:11:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2040:26:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"77726f6e67206172726179206c656e67746873","id":13943,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2068:21:73","typeDescriptions":{"typeIdentifier":"t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e","typeString":"literal_string \"wrong array lengths\""},"value":"wrong array lengths"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e","typeString":"literal_string \"wrong array lengths\""}],"id":13937,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2032:7:73","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":13944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2032:58:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13945,"nodeType":"ExpressionStatement","src":"2032:58:73"},{"body":{"id":13967,"nodeType":"Block","src":"2142:51:73","statements":[{"expression":{"arguments":[{"baseExpression":{"id":13958,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13928,"src":"2162:4:73","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":13960,"indexExpression":{"id":13959,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13947,"src":"2167:1:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2162:7:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":13961,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2171:1:73","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"baseExpression":{"id":13962,"name":"func","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13931,"src":"2174:4:73","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":13964,"indexExpression":{"id":13963,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13947,"src":"2179:1:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2174:7:73","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":13957,"name":"_call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14076,"src":"2156:5:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":13965,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2156:26:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13966,"nodeType":"ExpressionStatement","src":"2156:26:73"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13950,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13947,"src":"2120:1:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":13951,"name":"dest","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13928,"src":"2124:4:73","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":13952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2124:11:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2120:15:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13968,"initializationExpression":{"assignments":[13947],"declarations":[{"constant":false,"id":13947,"mutability":"mutable","name":"i","nameLocation":"2113:1:73","nodeType":"VariableDeclaration","scope":13968,"src":"2105:9:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13946,"name":"uint256","nodeType":"ElementaryTypeName","src":"2105:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":13949,"initialValue":{"hexValue":"30","id":13948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2117:1:73","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2105:13:73"},"loopExpression":{"expression":{"id":13955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2137:3:73","subExpression":{"id":13954,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13947,"src":"2137:1:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13956,"nodeType":"ExpressionStatement","src":"2137:3:73"},"nodeType":"ForStatement","src":"2100:93:73"}]},"documentation":{"id":13925,"nodeType":"StructuredDocumentation","src":"1844:53:73","text":" execute a sequence of transactions"},"functionSelector":"18dfb3c7","id":13970,"implemented":true,"kind":"function","modifiers":[],"name":"executeBatch","nameLocation":"1911:12:73","nodeType":"FunctionDefinition","parameters":{"id":13932,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13928,"mutability":"mutable","name":"dest","nameLocation":"1943:4:73","nodeType":"VariableDeclaration","scope":13970,"src":"1924:23:73","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":13926,"name":"address","nodeType":"ElementaryTypeName","src":"1924:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":13927,"nodeType":"ArrayTypeName","src":"1924:9:73","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":13931,"mutability":"mutable","name":"func","nameLocation":"1966:4:73","nodeType":"VariableDeclaration","scope":13970,"src":"1949:21:73","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":13929,"name":"bytes","nodeType":"ElementaryTypeName","src":"1949:5:73","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":13930,"nodeType":"ArrayTypeName","src":"1949:7:73","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"}],"src":"1923:48:73"},"returnParameters":{"id":13933,"nodeType":"ParameterList","parameters":[],"src":"1981:0:73"},"scope":14141,"src":"1902:297:73","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":13982,"nodeType":"Block","src":"2547:37:73","statements":[{"expression":{"arguments":[{"id":13979,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13973,"src":"2569:7:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13978,"name":"_initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13998,"src":"2557:11:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":13980,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2557:20:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13981,"nodeType":"ExpressionStatement","src":"2557:20:73"}]},"documentation":{"id":13971,"nodeType":"StructuredDocumentation","src":"2205:273:73","text":" @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\n a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\n the implementation by calling `upgradeTo()`"},"functionSelector":"c4d66de8","id":13983,"implemented":true,"kind":"function","modifiers":[{"id":13976,"kind":"modifierInvocation","modifierName":{"id":13975,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":3445,"src":"2535:11:73"},"nodeType":"ModifierInvocation","src":"2535:11:73"}],"name":"initialize","nameLocation":"2492:10:73","nodeType":"FunctionDefinition","parameters":{"id":13974,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13973,"mutability":"mutable","name":"anOwner","nameLocation":"2511:7:73","nodeType":"VariableDeclaration","scope":13983,"src":"2503:15:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13972,"name":"address","nodeType":"ElementaryTypeName","src":"2503:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2502:17:73"},"returnParameters":{"id":13977,"nodeType":"ParameterList","parameters":[],"src":"2547:0:73"},"scope":14141,"src":"2483:101:73","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":13997,"nodeType":"Block","src":"2645:91:73","statements":[{"expression":{"id":13990,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13988,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13838,"src":"2655:5:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13989,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13985,"src":"2663:7:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2655:15:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":13991,"nodeType":"ExpressionStatement","src":"2655:15:73"},{"eventCall":{"arguments":[{"id":13993,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13841,"src":"2710:11:73","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":13994,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13838,"src":"2723:5:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},{"typeIdentifier":"t_address","typeString":"address"}],"id":13992,"name":"SimpleAccountInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13848,"src":"2685:24:73","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_contract$_IEntryPoint_$10807_$_t_address_$returns$__$","typeString":"function (contract IEntryPoint,address)"}},"id":13995,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2685:44:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13996,"nodeType":"EmitStatement","src":"2680:49:73"}]},"id":13998,"implemented":true,"kind":"function","modifiers":[],"name":"_initialize","nameLocation":"2599:11:73","nodeType":"FunctionDefinition","parameters":{"id":13986,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13985,"mutability":"mutable","name":"anOwner","nameLocation":"2619:7:73","nodeType":"VariableDeclaration","scope":13998,"src":"2611:15:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13984,"name":"address","nodeType":"ElementaryTypeName","src":"2611:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2610:17:73"},"returnParameters":{"id":13987,"nodeType":"ParameterList","parameters":[],"src":"2645:0:73"},"scope":14141,"src":"2590:146:73","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":14018,"nodeType":"Block","src":"2863:120:73","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":14014,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":14009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":14002,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2881:3:73","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2881:10:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":14006,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[13866],"referencedDeclaration":13866,"src":"2903:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":14007,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2903:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}],"id":14005,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2895:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14004,"name":"address","nodeType":"ElementaryTypeName","src":"2895:7:73","typeDescriptions":{}}},"id":14008,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2895:21:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2881:35:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":14013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":14010,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2920:3:73","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14011,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2920:10:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":14012,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13838,"src":"2934:5:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2920:19:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2881:58:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","id":14015,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2941:34:73","typeDescriptions":{"typeIdentifier":"t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21","typeString":"literal_string \"account: not Owner or EntryPoint\""},"value":"account: not Owner or EntryPoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21","typeString":"literal_string \"account: not Owner or EntryPoint\""}],"id":14001,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2873:7:73","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2873:103:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14017,"nodeType":"ExpressionStatement","src":"2873:103:73"}]},"id":14019,"implemented":true,"kind":"function","modifiers":[],"name":"_requireFromEntryPointOrOwner","nameLocation":"2817:29:73","nodeType":"FunctionDefinition","parameters":{"id":13999,"nodeType":"ParameterList","parameters":[],"src":"2846:2:73"},"returnParameters":{"id":14000,"nodeType":"ParameterList","parameters":[],"src":"2863:0:73"},"scope":14141,"src":"2808:175:73","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[7267],"body":{"id":14049,"nodeType":"Block","src":"3180:180:73","statements":[{"assignments":[14032],"declarations":[{"constant":false,"id":14032,"mutability":"mutable","name":"hash","nameLocation":"3198:4:73","nodeType":"VariableDeclaration","scope":14049,"src":"3190:12:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14031,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3190:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":14036,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14033,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14025,"src":"3205:10:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":14034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"3205:33:73","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":14035,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3205:35:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3190:50:73"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":14043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14037,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13838,"src":"3254:5:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"expression":{"id":14040,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14023,"src":"3276:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14041,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"3276:16:73","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":14038,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14032,"src":"3263:4:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":14039,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"3263:12:73","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":14042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3263:30:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3254:39:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14046,"nodeType":"IfStatement","src":"3250:85:73","trueBody":{"expression":{"id":14044,"name":"SIG_VALIDATION_FAILED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7181,"src":"3314:21:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":14030,"id":14045,"nodeType":"Return","src":"3307:28:73"}},{"expression":{"hexValue":"30","id":14047,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3352:1:73","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":14030,"id":14048,"nodeType":"Return","src":"3345:8:73"}]},"documentation":{"id":14020,"nodeType":"StructuredDocumentation","src":"2989:44:73","text":"implement template method of BaseAccount"},"id":14050,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"3047:18:73","nodeType":"FunctionDefinition","overrides":{"id":14027,"nodeType":"OverrideSpecifier","overrides":[],"src":"3130:8:73"},"parameters":{"id":14026,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14023,"mutability":"mutable","name":"userOp","nameLocation":"3089:6:73","nodeType":"VariableDeclaration","scope":14050,"src":"3066:29:73","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14022,"nodeType":"UserDefinedTypeName","pathNode":{"id":14021,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3066:13:73"},"referencedDeclaration":10993,"src":"3066:13:73","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":14025,"mutability":"mutable","name":"userOpHash","nameLocation":"3105:10:73","nodeType":"VariableDeclaration","scope":14050,"src":"3097:18:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14024,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3097:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3065:51:73"},"returnParameters":{"id":14030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14029,"mutability":"mutable","name":"validationData","nameLocation":"3164:14:73","nodeType":"VariableDeclaration","scope":14050,"src":"3156:22:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14028,"name":"uint256","nodeType":"ElementaryTypeName","src":"3156:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3155:24:73"},"scope":14141,"src":"3038:322:73","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":14075,"nodeType":"Block","src":"3440:213:73","statements":[{"assignments":[14060,14062],"declarations":[{"constant":false,"id":14060,"mutability":"mutable","name":"success","nameLocation":"3456:7:73","nodeType":"VariableDeclaration","scope":14075,"src":"3451:12:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":14059,"name":"bool","nodeType":"ElementaryTypeName","src":"3451:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":14062,"mutability":"mutable","name":"result","nameLocation":"3478:6:73","nodeType":"VariableDeclaration","scope":14075,"src":"3465:19:73","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":14061,"name":"bytes","nodeType":"ElementaryTypeName","src":"3465:5:73","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":14069,"initialValue":{"arguments":[{"id":14067,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14056,"src":"3515:4:73","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":14063,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14052,"src":"3488:6:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14064,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"3488:11:73","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":14066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":14065,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14054,"src":"3508:5:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3488:26:73","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":14068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3488:32:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"3450:70:73"},{"condition":{"id":14071,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3534:8:73","subExpression":{"id":14070,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14060,"src":"3535:7:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14074,"nodeType":"IfStatement","src":"3530:117:73","trueBody":{"id":14073,"nodeType":"Block","src":"3544:103:73","statements":[{"AST":{"nodeType":"YulBlock","src":"3567:70:73","statements":[{"expression":{"arguments":[{"arguments":[{"name":"result","nodeType":"YulIdentifier","src":"3596:6:73"},{"kind":"number","nodeType":"YulLiteral","src":"3604:2:73","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3592:3:73"},"nodeType":"YulFunctionCall","src":"3592:15:73"},{"arguments":[{"name":"result","nodeType":"YulIdentifier","src":"3615:6:73"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3609:5:73"},"nodeType":"YulFunctionCall","src":"3609:13:73"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3585:6:73"},"nodeType":"YulFunctionCall","src":"3585:38:73"},"nodeType":"YulExpressionStatement","src":"3585:38:73"}]},"evmVersion":"london","externalReferences":[{"declaration":14062,"isOffset":false,"isSlot":false,"src":"3596:6:73","valueSize":1},{"declaration":14062,"isOffset":false,"isSlot":false,"src":"3615:6:73","valueSize":1}],"id":14072,"nodeType":"InlineAssembly","src":"3558:79:73"}]}}]},"id":14076,"implemented":true,"kind":"function","modifiers":[],"name":"_call","nameLocation":"3375:5:73","nodeType":"FunctionDefinition","parameters":{"id":14057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14052,"mutability":"mutable","name":"target","nameLocation":"3389:6:73","nodeType":"VariableDeclaration","scope":14076,"src":"3381:14:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14051,"name":"address","nodeType":"ElementaryTypeName","src":"3381:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14054,"mutability":"mutable","name":"value","nameLocation":"3405:5:73","nodeType":"VariableDeclaration","scope":14076,"src":"3397:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14053,"name":"uint256","nodeType":"ElementaryTypeName","src":"3397:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":14056,"mutability":"mutable","name":"data","nameLocation":"3425:4:73","nodeType":"VariableDeclaration","scope":14076,"src":"3412:17:73","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":14055,"name":"bytes","nodeType":"ElementaryTypeName","src":"3412:5:73","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:50:73"},"returnParameters":{"id":14058,"nodeType":"ParameterList","parameters":[],"src":"3440:0:73"},"scope":14141,"src":"3366:287:73","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":14091,"nodeType":"Block","src":"3782:61:73","statements":[{"expression":{"arguments":[{"arguments":[{"id":14087,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3830:4:73","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}],"id":14086,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3822:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14085,"name":"address","nodeType":"ElementaryTypeName","src":"3822:7:73","typeDescriptions":{}}},"id":14088,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3822:13:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14082,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[13866],"referencedDeclaration":13866,"src":"3799:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":14083,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3799:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":14084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":10935,"src":"3799:22:73","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":14089,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3799:37:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":14081,"id":14090,"nodeType":"Return","src":"3792:44:73"}]},"documentation":{"id":14077,"nodeType":"StructuredDocumentation","src":"3659:66:73","text":" check current account deposit in the entryPoint"},"functionSelector":"c399ec88","id":14092,"implemented":true,"kind":"function","modifiers":[],"name":"getDeposit","nameLocation":"3739:10:73","nodeType":"FunctionDefinition","parameters":{"id":14078,"nodeType":"ParameterList","parameters":[],"src":"3749:2:73"},"returnParameters":{"id":14081,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14080,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14092,"src":"3773:7:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14079,"name":"uint256","nodeType":"ElementaryTypeName","src":"3773:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3772:9:73"},"scope":14141,"src":"3730:113:73","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":14108,"nodeType":"Block","src":"3963:73:73","statements":[{"expression":{"arguments":[{"arguments":[{"id":14104,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4023:4:73","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}],"id":14103,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4015:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14102,"name":"address","nodeType":"ElementaryTypeName","src":"4015:7:73","typeDescriptions":{}}},"id":14105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4015:13:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14096,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[13866],"referencedDeclaration":13866,"src":"3973:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":14097,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3973:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":14098,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":10941,"src":"3973:22:73","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":14101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":14099,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4004:3:73","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"4004:9:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3973:41:73","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":14106,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3973:56:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14107,"nodeType":"ExpressionStatement","src":"3973:56:73"}]},"documentation":{"id":14093,"nodeType":"StructuredDocumentation","src":"3849:72:73","text":" deposit more funds for this account in the entryPoint"},"functionSelector":"4a58db19","id":14109,"implemented":true,"kind":"function","modifiers":[],"name":"addDeposit","nameLocation":"3935:10:73","nodeType":"FunctionDefinition","parameters":{"id":14094,"nodeType":"ParameterList","parameters":[],"src":"3945:2:73"},"returnParameters":{"id":14095,"nodeType":"ParameterList","parameters":[],"src":"3963:0:73"},"scope":14141,"src":"3926:110:73","stateMutability":"payable","virtual":false,"visibility":"public"},{"body":{"id":14126,"nodeType":"Block","src":"4281:65:73","statements":[{"expression":{"arguments":[{"id":14122,"name":"withdrawAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14112,"src":"4315:15:73","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":14123,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14114,"src":"4332:6:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14119,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[13866],"referencedDeclaration":13866,"src":"4291:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_contract$_IEntryPoint_$10807_$","typeString":"function () view returns (contract IEntryPoint)"}},"id":14120,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":14121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"withdrawTo","nodeType":"MemberAccess","referencedDeclaration":10965,"src":"4291:23:73","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_payable_$_t_uint256_$returns$__$","typeString":"function (address payable,uint256) external"}},"id":14124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:48:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14125,"nodeType":"ExpressionStatement","src":"4291:48:73"}]},"documentation":{"id":14110,"nodeType":"StructuredDocumentation","src":"4042:141:73","text":" withdraw value from the account's deposit\n @param withdrawAddress target to send to\n @param amount to withdraw"},"functionSelector":"4d44560d","id":14127,"implemented":true,"kind":"function","modifiers":[{"id":14117,"kind":"modifierInvocation","modifierName":{"id":14116,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":13855,"src":"4271:9:73"},"nodeType":"ModifierInvocation","src":"4271:9:73"}],"name":"withdrawDepositTo","nameLocation":"4197:17:73","nodeType":"FunctionDefinition","parameters":{"id":14115,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14112,"mutability":"mutable","name":"withdrawAddress","nameLocation":"4231:15:73","nodeType":"VariableDeclaration","scope":14127,"src":"4215:31:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":14111,"name":"address","nodeType":"ElementaryTypeName","src":"4215:15:73","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":14114,"mutability":"mutable","name":"amount","nameLocation":"4256:6:73","nodeType":"VariableDeclaration","scope":14127,"src":"4248:14:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14113,"name":"uint256","nodeType":"ElementaryTypeName","src":"4248:7:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4214:49:73"},"returnParameters":{"id":14118,"nodeType":"ParameterList","parameters":[],"src":"4281:0:73"},"scope":14141,"src":"4188:158:73","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[3658],"body":{"id":14139,"nodeType":"Block","src":"4429:58:73","statements":[{"expression":{"components":[{"id":14133,"name":"newImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14129,"src":"4440:17:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14134,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4439:19:73","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14135,"nodeType":"ExpressionStatement","src":"4439:19:73"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14136,"name":"_onlyOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13904,"src":"4468:10:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":14137,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4468:12:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14138,"nodeType":"ExpressionStatement","src":"4468:12:73"}]},"id":14140,"implemented":true,"kind":"function","modifiers":[],"name":"_authorizeUpgrade","nameLocation":"4361:17:73","nodeType":"FunctionDefinition","overrides":{"id":14131,"nodeType":"OverrideSpecifier","overrides":[],"src":"4420:8:73"},"parameters":{"id":14130,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14129,"mutability":"mutable","name":"newImplementation","nameLocation":"4387:17:73","nodeType":"VariableDeclaration","scope":14140,"src":"4379:25:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14128,"name":"address","nodeType":"ElementaryTypeName","src":"4379:7:73","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4378:27:73"},"returnParameters":{"id":14132,"nodeType":"ParameterList","parameters":[],"src":"4429:0:73"},"scope":14141,"src":"4352:135:73","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":14142,"src":"637:3852:73","usedErrors":[]}],"src":"36:4455:73"},"id":73},"contracts/samples/SimpleAccountFactory.sol":{"ast":{"absolutePath":"contracts/samples/SimpleAccountFactory.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"Create2":[5232],"ECDSA":[5828],"ERC1967Proxy":[2994],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"Proxy":[3364],"SimpleAccount":[14141],"SimpleAccountFactory":[14273],"StorageSlot":[5292],"Strings":[5467],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":14274,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":14143,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:74"},{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","file":"@openzeppelin/contracts/utils/Create2.sol","id":14144,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14274,"sourceUnit":5233,"src":"62:51:74","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","file":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","id":14145,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14274,"sourceUnit":2995,"src":"114:64:74","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"./SimpleAccount.sol","id":14146,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14274,"sourceUnit":14142,"src":"180:29:74","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SimpleAccountFactory","contractDependencies":[2994,14141],"contractKind":"contract","documentation":{"id":14147,"nodeType":"StructuredDocumentation","src":"211:388:74","text":" A sample factory contract for SimpleAccount\n A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\n The factory's createAccount returns the target account address even if it is already installed.\n This way, the entryPoint.getSenderAddress() can be called either before or after the account is created."},"fullyImplemented":true,"id":14273,"linearizedBaseContracts":[14273],"name":"SimpleAccountFactory","nameLocation":"609:20:74","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"11464fbe","id":14150,"mutability":"immutable","name":"accountImplementation","nameLocation":"667:21:74","nodeType":"VariableDeclaration","scope":14273,"src":"636:52:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"},"typeName":{"id":14149,"nodeType":"UserDefinedTypeName","pathNode":{"id":14148,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"636:13:74"},"referencedDeclaration":14141,"src":"636:13:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"visibility":"public"},{"body":{"id":14164,"nodeType":"Block","src":"732:71:74","statements":[{"expression":{"id":14162,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14156,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14150,"src":"742:21:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":14160,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14153,"src":"784:11:74","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}],"id":14159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"766:17:74","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_contract$_IEntryPoint_$10807_$returns$_t_contract$_SimpleAccount_$14141_$","typeString":"function (contract IEntryPoint) returns (contract SimpleAccount)"},"typeName":{"id":14158,"nodeType":"UserDefinedTypeName","pathNode":{"id":14157,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"770:13:74"},"referencedDeclaration":14141,"src":"770:13:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}},"id":14161,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"766:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"src":"742:54:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"id":14163,"nodeType":"ExpressionStatement","src":"742:54:74"}]},"id":14165,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14153,"mutability":"mutable","name":"_entryPoint","nameLocation":"719:11:74","nodeType":"VariableDeclaration","scope":14165,"src":"707:23:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":14152,"nodeType":"UserDefinedTypeName","pathNode":{"id":14151,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"707:11:74"},"referencedDeclaration":10807,"src":"707:11:74","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"706:25:74"},"returnParameters":{"id":14155,"nodeType":"ParameterList","parameters":[],"src":"732:0:74"},"scope":14273,"src":"695:108:74","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14229,"nodeType":"Block","src":"1269:391:74","statements":[{"assignments":[14177],"declarations":[{"constant":false,"id":14177,"mutability":"mutable","name":"addr","nameLocation":"1287:4:74","nodeType":"VariableDeclaration","scope":14229,"src":"1279:12:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14176,"name":"address","nodeType":"ElementaryTypeName","src":"1279:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14182,"initialValue":{"arguments":[{"id":14179,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14168,"src":"1305:5:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":14180,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14170,"src":"1312:4:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14178,"name":"getAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14272,"src":"1294:10:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_uint256_$returns$_t_address_$","typeString":"function (address,uint256) view returns (address)"}},"id":14181,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1294:23:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1279:38:74"},{"assignments":[14184],"declarations":[{"constant":false,"id":14184,"mutability":"mutable","name":"codeSize","nameLocation":"1332:8:74","nodeType":"VariableDeclaration","scope":14229,"src":"1327:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14183,"name":"uint","nodeType":"ElementaryTypeName","src":"1327:4:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14188,"initialValue":{"expression":{"expression":{"id":14185,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14177,"src":"1343:4:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"1343:9:74","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":14187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1343:16:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1327:32:74"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14189,"name":"codeSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14184,"src":"1373:8:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":14190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1384:1:74","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1373:12:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14200,"nodeType":"IfStatement","src":"1369:78:74","trueBody":{"id":14199,"nodeType":"Block","src":"1387:60:74","statements":[{"expression":{"arguments":[{"arguments":[{"id":14195,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14177,"src":"1430:4:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":14194,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1422:8:74","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":14193,"name":"address","nodeType":"ElementaryTypeName","src":"1422:8:74","stateMutability":"payable","typeDescriptions":{}}},"id":14196,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1422:13:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":14192,"name":"SimpleAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14141,"src":"1408:13:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SimpleAccount_$14141_$","typeString":"type(contract SimpleAccount)"}},"id":14197,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1408:28:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"functionReturnParameters":14175,"id":14198,"nodeType":"Return","src":"1401:35:74"}]}},{"expression":{"id":14227,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14201,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14174,"src":"1456:3:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"id":14215,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14150,"src":"1548:21:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}],"id":14214,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1540:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14213,"name":"address","nodeType":"ElementaryTypeName","src":"1540:7:74","typeDescriptions":{}}},"id":14216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1540:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":14219,"name":"SimpleAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14141,"src":"1603:13:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SimpleAccount_$14141_$","typeString":"type(contract SimpleAccount)"}},"id":14220,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":13983,"src":"1603:24:74","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function SimpleAccount.initialize(address)"}},{"components":[{"id":14221,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14168,"src":"1630:5:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14222,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1629:7:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function SimpleAccount.initialize(address)"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14217,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1588:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14218,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1588:14:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14223,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1588:49:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":14207,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"1484:16:74","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"},"typeName":{"id":14206,"nodeType":"UserDefinedTypeName","pathNode":{"id":14205,"name":"ERC1967Proxy","nodeType":"IdentifierPath","referencedDeclaration":2994,"src":"1488:12:74"},"referencedDeclaration":2994,"src":"1488:12:74","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}},"id":14212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"id":14210,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14170,"src":"1516:4:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14209,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1508:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":14208,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1508:7:74","typeDescriptions":{}}},"id":14211,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1508:13:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"1484:38:74","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$salt","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"}},"id":14224,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1484:167:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}],"id":14204,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1476:8:74","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":14203,"name":"address","nodeType":"ElementaryTypeName","src":"1476:8:74","stateMutability":"payable","typeDescriptions":{}}},"id":14225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1476:176:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":14202,"name":"SimpleAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14141,"src":"1462:13:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SimpleAccount_$14141_$","typeString":"type(contract SimpleAccount)"}},"id":14226,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1462:191:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"src":"1456:197:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"id":14228,"nodeType":"ExpressionStatement","src":"1456:197:74"}]},"documentation":{"id":14166,"nodeType":"StructuredDocumentation","src":"809:369:74","text":" create an account, and return its address.\n returns the address even if the account is already deployed.\n Note that during UserOperation execution, this method is called only if the account is not deployed.\n This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation"},"functionSelector":"5fbfb9cf","id":14230,"implemented":true,"kind":"function","modifiers":[],"name":"createAccount","nameLocation":"1192:13:74","nodeType":"FunctionDefinition","parameters":{"id":14171,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14168,"mutability":"mutable","name":"owner","nameLocation":"1214:5:74","nodeType":"VariableDeclaration","scope":14230,"src":"1206:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14167,"name":"address","nodeType":"ElementaryTypeName","src":"1206:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14170,"mutability":"mutable","name":"salt","nameLocation":"1228:4:74","nodeType":"VariableDeclaration","scope":14230,"src":"1220:12:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14169,"name":"uint256","nodeType":"ElementaryTypeName","src":"1220:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1205:28:74"},"returnParameters":{"id":14175,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14174,"mutability":"mutable","name":"ret","nameLocation":"1264:3:74","nodeType":"VariableDeclaration","scope":14230,"src":"1250:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"},"typeName":{"id":14173,"nodeType":"UserDefinedTypeName","pathNode":{"id":14172,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"1250:13:74"},"referencedDeclaration":14141,"src":"1250:13:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}},"visibility":"internal"}],"src":"1249:19:74"},"scope":14273,"src":"1183:477:74","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14271,"nodeType":"Block","src":"1863:322:74","statements":[{"expression":{"arguments":[{"arguments":[{"id":14244,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14235,"src":"1911:4:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14243,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1903:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":14242,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1903:7:74","typeDescriptions":{}}},"id":14245,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1903:13:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"expression":{"arguments":[{"id":14250,"name":"ERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2994,"src":"1967:12:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}],"id":14249,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1962:4:74","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":14251,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1962:18:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC1967Proxy_$2994","typeString":"type(contract ERC1967Proxy)"}},"id":14252,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"1962:31:74","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":14257,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14150,"src":"2051:21:74","typeDescriptions":{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SimpleAccount_$14141","typeString":"contract SimpleAccount"}],"id":14256,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2043:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14255,"name":"address","nodeType":"ElementaryTypeName","src":"2043:7:74","typeDescriptions":{}}},"id":14258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2043:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":14261,"name":"SimpleAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14141,"src":"2110:13:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SimpleAccount_$14141_$","typeString":"type(contract SimpleAccount)"}},"id":14262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":13983,"src":"2110:24:74","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function SimpleAccount.initialize(address)"}},{"components":[{"id":14263,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14233,"src":"2137:5:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14264,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2136:7:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function SimpleAccount.initialize(address)"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14259,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2095:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14260,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"2095:14:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2095:49:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":14253,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2011:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14254,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"2011:10:74","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2011:151:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":14247,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1928:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14248,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"1928:16:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14267,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1928:248:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":14246,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1918:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":14268,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1918:259:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":14240,"name":"Create2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5232,"src":"1880:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Create2_$5232_$","typeString":"type(library Create2)"}},"id":14241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"computeAddress","nodeType":"MemberAccess","referencedDeclaration":5217,"src":"1880:22:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,bytes32) view returns (address)"}},"id":14269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1880:298:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":14239,"id":14270,"nodeType":"Return","src":"1873:305:74"}]},"documentation":{"id":14231,"nodeType":"StructuredDocumentation","src":"1666:114:74","text":" calculate the counterfactual address of this account as it would be returned by createAccount()"},"functionSelector":"8cb84e18","id":14272,"implemented":true,"kind":"function","modifiers":[],"name":"getAddress","nameLocation":"1794:10:74","nodeType":"FunctionDefinition","parameters":{"id":14236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14233,"mutability":"mutable","name":"owner","nameLocation":"1813:5:74","nodeType":"VariableDeclaration","scope":14272,"src":"1805:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14232,"name":"address","nodeType":"ElementaryTypeName","src":"1805:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14235,"mutability":"mutable","name":"salt","nameLocation":"1827:4:74","nodeType":"VariableDeclaration","scope":14272,"src":"1819:12:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14234,"name":"uint256","nodeType":"ElementaryTypeName","src":"1819:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1804:28:74"},"returnParameters":{"id":14239,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14238,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14272,"src":"1854:7:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14237,"name":"address","nodeType":"ElementaryTypeName","src":"1854:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1853:9:74"},"scope":14273,"src":"1785:400:74","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":14274,"src":"600:1587:74","usedErrors":[]}],"src":"36:2152:74"},"id":74},"contracts/samples/TokenPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/TokenPaymaster.sol","exportedSymbols":{"BasePaymaster":[7528],"Context":[5151],"ERC20":[4341],"IAggregator":[10603],"IERC20":[4419],"IERC20Metadata":[4444],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"TokenPaymaster":[14541],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":14542,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":14275,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:75"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/ERC20.sol","file":"@openzeppelin/contracts/token/ERC20/ERC20.sol","id":14276,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14542,"sourceUnit":4342,"src":"99:55:75","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":14277,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14542,"sourceUnit":7529,"src":"155:35:75","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14279,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1239:13:75"},"id":14280,"nodeType":"InheritanceSpecifier","src":"1239:13:75"},{"baseName":{"id":14281,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":4341,"src":"1254:5:75"},"id":14282,"nodeType":"InheritanceSpecifier","src":"1254:5:75"}],"canonicalName":"TokenPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":14278,"nodeType":"StructuredDocumentation","src":"192:1019:75","text":" A sample paymaster that defines itself as a token to pay for gas.\n The paymaster IS the token to use, since a paymaster cannot use an external contract.\n Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract.\n subclass should override \"getTokenValueOfEth\" to provide actual token exchange rate, settable by the owner.\n Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts):\n - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted,\n and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster)\n in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit)\n - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or\n to whitelist the account and the called method ids."},"fullyImplemented":true,"id":14541,"linearizedBaseContracts":[14541,4341,4444,4419,7528,2933,5151,10861],"name":"TokenPaymaster","nameLocation":"1221:14:75","nodeType":"ContractDefinition","nodes":[{"constant":true,"functionSelector":"796d4371","id":14285,"mutability":"constant","name":"COST_OF_POST","nameLocation":"1327:12:75","nodeType":"VariableDeclaration","scope":14541,"src":"1303:44:75","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14283,"name":"uint256","nodeType":"ElementaryTypeName","src":"1303:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3135303030","id":14284,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1342:5:75","typeDescriptions":{"typeIdentifier":"t_rational_15000_by_1","typeString":"int_const 15000"},"value":"15000"},"visibility":"public"},{"constant":false,"functionSelector":"9f5ca221","id":14287,"mutability":"immutable","name":"theFactory","nameLocation":"1379:10:75","nodeType":"VariableDeclaration","scope":14541,"src":"1354:35:75","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14286,"name":"address","nodeType":"ElementaryTypeName","src":"1354:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"body":{"id":14330,"nodeType":"Block","src":"1531:242:75","statements":[{"expression":{"id":14306,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14304,"name":"theFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14287,"src":"1541:10:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14305,"name":"accountFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14289,"src":"1554:14:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1541:27:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14307,"nodeType":"ExpressionStatement","src":"1541:27:75"},{"expression":{"arguments":[{"arguments":[{"id":14311,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1620:4:75","typeDescriptions":{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}],"id":14310,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1612:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14309,"name":"address","nodeType":"ElementaryTypeName","src":"1612:7:75","typeDescriptions":{}}},"id":14312,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1612:13:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"31","id":14313,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1627:1:75","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":14308,"name":"_mint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4158,"src":"1606:5:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":14314,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1606:23:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14315,"nodeType":"ExpressionStatement","src":"1606:23:75"},{"expression":{"arguments":[{"arguments":[{"id":14319,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1732:4:75","typeDescriptions":{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}],"id":14318,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1724:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14317,"name":"address","nodeType":"ElementaryTypeName","src":"1724:7:75","typeDescriptions":{}}},"id":14320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1724:13:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":14321,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1739:3:75","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1739:10:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"arguments":[{"id":14325,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1756:4:75","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":14324,"name":"uint","nodeType":"ElementaryTypeName","src":"1756:4:75","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":14323,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1751:4:75","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":14326,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1751:10:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":14327,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"1751:14:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14316,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"1715:8:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":14328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1715:51:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14329,"nodeType":"ExpressionStatement","src":"1715:51:75"}]},"id":14331,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14297,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14291,"src":"1486:7:75","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":14298,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14291,"src":"1495:7:75","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"id":14299,"kind":"baseConstructorSpecifier","modifierName":{"id":14296,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":4341,"src":"1480:5:75"},"nodeType":"ModifierInvocation","src":"1480:23:75"},{"arguments":[{"id":14301,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14294,"src":"1518:11:75","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":14302,"kind":"baseConstructorSpecifier","modifierName":{"id":14300,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1504:13:75"},"nodeType":"ModifierInvocation","src":"1504:26:75"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14295,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14289,"mutability":"mutable","name":"accountFactory","nameLocation":"1416:14:75","nodeType":"VariableDeclaration","scope":14331,"src":"1408:22:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14288,"name":"address","nodeType":"ElementaryTypeName","src":"1408:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14291,"mutability":"mutable","name":"_symbol","nameLocation":"1446:7:75","nodeType":"VariableDeclaration","scope":14331,"src":"1432:21:75","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":14290,"name":"string","nodeType":"ElementaryTypeName","src":"1432:6:75","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":14294,"mutability":"mutable","name":"_entryPoint","nameLocation":"1467:11:75","nodeType":"VariableDeclaration","scope":14331,"src":"1455:23:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":14293,"nodeType":"UserDefinedTypeName","pathNode":{"id":14292,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1455:11:75"},"referencedDeclaration":10807,"src":"1455:11:75","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"1407:72:75"},"returnParameters":{"id":14303,"nodeType":"ParameterList","parameters":[],"src":"1531:0:75"},"scope":14541,"src":"1396:377:75","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14346,"nodeType":"Block","src":"2051:41:75","statements":[{"expression":{"arguments":[{"id":14342,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14334,"src":"2067:9:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":14343,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14336,"src":"2078:6:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14341,"name":"_mint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4158,"src":"2061:5:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":14344,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2061:24:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14345,"nodeType":"ExpressionStatement","src":"2061:24:75"}]},"documentation":{"id":14332,"nodeType":"StructuredDocumentation","src":"1780:192:75","text":" helpers for owner, to mint and withdraw tokens.\n @param recipient - the address that will receive the minted tokens.\n @param amount - the amount it will receive."},"functionSelector":"f0dda65c","id":14347,"implemented":true,"kind":"function","modifiers":[{"id":14339,"kind":"modifierInvocation","modifierName":{"id":14338,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2041:9:75"},"nodeType":"ModifierInvocation","src":"2041:9:75"}],"name":"mintTokens","nameLocation":"1986:10:75","nodeType":"FunctionDefinition","parameters":{"id":14337,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14334,"mutability":"mutable","name":"recipient","nameLocation":"2005:9:75","nodeType":"VariableDeclaration","scope":14347,"src":"1997:17:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14333,"name":"address","nodeType":"ElementaryTypeName","src":"1997:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14336,"mutability":"mutable","name":"amount","nameLocation":"2024:6:75","nodeType":"VariableDeclaration","scope":14347,"src":"2016:14:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14335,"name":"uint256","nodeType":"ElementaryTypeName","src":"2016:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1996:35:75"},"returnParameters":{"id":14340,"nodeType":"ParameterList","parameters":[],"src":"2051:0:75"},"scope":14541,"src":"1977:115:75","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[2912],"body":{"id":14385,"nodeType":"Block","src":"2414:279:75","statements":[{"expression":{"arguments":[{"arguments":[{"id":14359,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2486:4:75","typeDescriptions":{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}],"id":14358,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2478:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14357,"name":"address","nodeType":"ElementaryTypeName","src":"2478:7:75","typeDescriptions":{}}},"id":14360,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2478:13:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[],"expression":{"argumentTypes":[],"id":14361,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2861,"src":"2493:5:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14362,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2493:7:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":14363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2502:1:75","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":14356,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"2469:8:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":14364,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2469:35:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14365,"nodeType":"ExpressionStatement","src":"2469:35:75"},{"expression":{"arguments":[{"id":14369,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14350,"src":"2538:8:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14366,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"2514:5:75","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_TokenPaymaster_$14541_$","typeString":"type(contract super TokenPaymaster)"}},"id":14368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transferOwnership","nodeType":"MemberAccess","referencedDeclaration":2912,"src":"2514:23:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":14370,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2514:33:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14371,"nodeType":"ExpressionStatement","src":"2514:33:75"},{"expression":{"arguments":[{"arguments":[{"id":14375,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2654:4:75","typeDescriptions":{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}],"id":14374,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2646:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14373,"name":"address","nodeType":"ElementaryTypeName","src":"2646:7:75","typeDescriptions":{}}},"id":14376,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2646:13:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":14377,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14350,"src":"2661:8:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"arguments":[{"id":14380,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2676:4:75","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":14379,"name":"uint","nodeType":"ElementaryTypeName","src":"2676:4:75","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":14378,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2671:4:75","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":14381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2671:10:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":14382,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"2671:14:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14372,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4275,"src":"2637:8:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":14383,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2637:49:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14384,"nodeType":"ExpressionStatement","src":"2637:49:75"}]},"documentation":{"id":14348,"nodeType":"StructuredDocumentation","src":"2098:232:75","text":" transfer paymaster ownership.\n owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance)\n when changing owner, the old owner's withdrawal rights are revoked."},"functionSelector":"f2fde38b","id":14386,"implemented":true,"kind":"function","modifiers":[{"id":14354,"kind":"modifierInvocation","modifierName":{"id":14353,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":2852,"src":"2404:9:75"},"nodeType":"ModifierInvocation","src":"2404:9:75"}],"name":"transferOwnership","nameLocation":"2344:17:75","nodeType":"FunctionDefinition","overrides":{"id":14352,"nodeType":"OverrideSpecifier","overrides":[],"src":"2387:8:75"},"parameters":{"id":14351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14350,"mutability":"mutable","name":"newOwner","nameLocation":"2370:8:75","nodeType":"VariableDeclaration","scope":14386,"src":"2362:16:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14349,"name":"address","nodeType":"ElementaryTypeName","src":"2362:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2361:18:75"},"returnParameters":{"id":14355,"nodeType":"ParameterList","parameters":[],"src":"2414:0:75"},"scope":14541,"src":"2335:358:75","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":14397,"nodeType":"Block","src":"2921:38:75","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14393,"name":"valueEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14388,"src":"2938:8:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"313030","id":14394,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2949:3:75","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"value":"100"},"src":"2938:14:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":14392,"id":14396,"nodeType":"Return","src":"2931:21:75"}]},"id":14398,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"2833:18:75","nodeType":"FunctionDefinition","parameters":{"id":14389,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14388,"mutability":"mutable","name":"valueEth","nameLocation":"2860:8:75","nodeType":"VariableDeclaration","scope":14398,"src":"2852:16:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14387,"name":"uint256","nodeType":"ElementaryTypeName","src":"2852:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2851:18:75"},"returnParameters":{"id":14392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14391,"mutability":"mutable","name":"valueToken","nameLocation":"2909:10:75","nodeType":"VariableDeclaration","scope":14398,"src":"2901:18:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14390,"name":"uint256","nodeType":"ElementaryTypeName","src":"2901:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2900:20:75"},"scope":14541,"src":"2824:135:75","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[7373],"body":{"id":14468,"nodeType":"Block","src":"3407:722:75","statements":[{"assignments":[14415],"declarations":[{"constant":false,"id":14415,"mutability":"mutable","name":"tokenPrefund","nameLocation":"3425:12:75","nodeType":"VariableDeclaration","scope":14468,"src":"3417:20:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14414,"name":"uint256","nodeType":"ElementaryTypeName","src":"3417:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14419,"initialValue":{"arguments":[{"id":14417,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14406,"src":"3459:15:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14416,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14398,"src":"3440:18:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":14418,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3440:35:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3417:58:75"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":14421,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"3676:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"3676:27:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":14423,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14285,"src":"3706:12:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3676:42:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f7220706f73744f70","id":14425,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3720:40:75","typeDescriptions":{"typeIdentifier":"t_stringliteral_e63029b4be8f7147d8fa8c7176417177721349d796aec4cd58131ce1ae4a4e98","typeString":"literal_string \"TokenPaymaster: gas too low for postOp\""},"value":"TokenPaymaster: gas too low for postOp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e63029b4be8f7147d8fa8c7176417177721349d796aec4cd58131ce1ae4a4e98","typeString":"literal_string \"TokenPaymaster: gas too low for postOp\""}],"id":14420,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3668:7:75","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14426,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3668:93:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14427,"nodeType":"ExpressionStatement","src":"3668:93:75"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":14428,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"3776:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"3776:15:75","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3776:22:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":14431,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3802:1:75","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3776:27:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":14458,"nodeType":"Block","src":"3970:105:75","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14454,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":14450,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"4003:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"4003:13:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":14449,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3853,"src":"3993:9:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":14452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3993:24:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":14453,"name":"tokenPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14415,"src":"4021:12:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3993:40:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546f6b656e5061796d61737465723a206e6f2062616c616e6365","id":14455,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4035:28:75","typeDescriptions":{"typeIdentifier":"t_stringliteral_ba1208b32158094aac35ebe5e696720821cdfa1d15e4b106c836c9b43fcf322a","typeString":"literal_string \"TokenPaymaster: no balance\""},"value":"TokenPaymaster: no balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ba1208b32158094aac35ebe5e696720821cdfa1d15e4b106c836c9b43fcf322a","typeString":"literal_string \"TokenPaymaster: no balance\""}],"id":14448,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3985:7:75","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14456,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3985:79:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14457,"nodeType":"ExpressionStatement","src":"3985:79:75"}]},"id":14459,"nodeType":"IfStatement","src":"3772:303:75","trueBody":{"id":14447,"nodeType":"Block","src":"3805:159:75","statements":[{"expression":{"arguments":[{"id":14434,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"3840:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":14433,"name":"_validateConstructor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14497,"src":"3819:20:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$__$","typeString":"function (struct UserOperation calldata) view"}},"id":14435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3819:28:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14436,"nodeType":"ExpressionStatement","src":"3819:28:75"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14443,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":14439,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"3879:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14440,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"3879:13:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":14438,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3853,"src":"3869:9:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":14441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3869:24:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":14442,"name":"tokenPrefund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14415,"src":"3897:12:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3869:40:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d63726561746529","id":14444,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3911:41:75","typeDescriptions":{"typeIdentifier":"t_stringliteral_a3a5fd70368e4e698a4b1ca2306756bd67295a1b90e45690e5829cd9be775e0d","typeString":"literal_string \"TokenPaymaster: no balance (pre-create)\""},"value":"TokenPaymaster: no balance (pre-create)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a3a5fd70368e4e698a4b1ca2306756bd67295a1b90e45690e5829cd9be775e0d","typeString":"literal_string \"TokenPaymaster: no balance (pre-create)\""}],"id":14437,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3861:7:75","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14445,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3861:92:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14446,"nodeType":"ExpressionStatement","src":"3861:92:75"}]}},{"expression":{"components":[{"arguments":[{"expression":{"id":14462,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14402,"src":"4104:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"4104:13:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14460,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4093:3:75","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14461,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"4093:10:75","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14464,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4093:25:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":14465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4120:1:75","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":14466,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4092:30:75","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bytes_memory_ptr_$_t_rational_0_by_1_$","typeString":"tuple(bytes memory,int_const 0)"}},"functionReturnParameters":14413,"id":14467,"nodeType":"Return","src":"4085:37:75"}]},"documentation":{"id":14399,"nodeType":"StructuredDocumentation","src":"2965:241:75","text":" validate the request:\n if this is a constructor call, make sure it is a known account.\n verify the sender has enough tokens.\n (since the paymaster is also the token, there is no notion of \"approval\")"},"id":14469,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"3220:24:75","nodeType":"FunctionDefinition","overrides":{"id":14408,"nodeType":"OverrideSpecifier","overrides":[],"src":"3343:8:75"},"parameters":{"id":14407,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14402,"mutability":"mutable","name":"userOp","nameLocation":"3268:6:75","nodeType":"VariableDeclaration","scope":14469,"src":"3245:29:75","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14401,"nodeType":"UserDefinedTypeName","pathNode":{"id":14400,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3245:13:75"},"referencedDeclaration":10993,"src":"3245:13:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":14404,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14469,"src":"3276:7:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14403,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3276:7:75","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":14406,"mutability":"mutable","name":"requiredPreFund","nameLocation":"3308:15:75","nodeType":"VariableDeclaration","scope":14469,"src":"3300:23:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14405,"name":"uint256","nodeType":"ElementaryTypeName","src":"3300:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3244:80:75"},"returnParameters":{"id":14413,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14410,"mutability":"mutable","name":"context","nameLocation":"3374:7:75","nodeType":"VariableDeclaration","scope":14469,"src":"3361:20:75","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":14409,"name":"bytes","nodeType":"ElementaryTypeName","src":"3361:5:75","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":14412,"mutability":"mutable","name":"validationData","nameLocation":"3391:14:75","nodeType":"VariableDeclaration","scope":14469,"src":"3383:22:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14411,"name":"uint256","nodeType":"ElementaryTypeName","src":"3383:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3360:46:75"},"scope":14541,"src":"3211:918:75","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":14496,"nodeType":"Block","src":"4376:157:75","statements":[{"assignments":[14476],"declarations":[{"constant":false,"id":14476,"mutability":"mutable","name":"factory","nameLocation":"4394:7:75","nodeType":"VariableDeclaration","scope":14496,"src":"4386:15:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14475,"name":"address","nodeType":"ElementaryTypeName","src":"4386:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14488,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":14481,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14472,"src":"4420:6:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"4420:15:75","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":14484,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4440:2:75","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":14485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"4420:23:75","startExpression":{"hexValue":"30","id":14483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4436:1:75","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":14480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4412:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":14479,"name":"bytes20","nodeType":"ElementaryTypeName","src":"4412:7:75","typeDescriptions":{}}},"id":14486,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4412:32:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":14478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4404:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14477,"name":"address","nodeType":"ElementaryTypeName","src":"4404:7:75","typeDescriptions":{}}},"id":14487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4404:41:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4386:59:75"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":14492,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14490,"name":"factory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14476,"src":"4463:7:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":14491,"name":"theFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14287,"src":"4474:10:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4463:21:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546f6b656e5061796d61737465723a2077726f6e67206163636f756e7420666163746f7279","id":14493,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4486:39:75","typeDescriptions":{"typeIdentifier":"t_stringliteral_c8acd6a8133474c975607944c89a9c2827b6234a8b3c94e8e794cae85c818cf6","typeString":"literal_string \"TokenPaymaster: wrong account factory\""},"value":"TokenPaymaster: wrong account factory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c8acd6a8133474c975607944c89a9c2827b6234a8b3c94e8e794cae85c818cf6","typeString":"literal_string \"TokenPaymaster: wrong account factory\""}],"id":14489,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4455:7:75","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4455:71:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14495,"nodeType":"ExpressionStatement","src":"4455:71:75"}]},"id":14497,"implemented":true,"kind":"function","modifiers":[],"name":"_validateConstructor","nameLocation":"4302:20:75","nodeType":"FunctionDefinition","parameters":{"id":14473,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14472,"mutability":"mutable","name":"userOp","nameLocation":"4346:6:75","nodeType":"VariableDeclaration","scope":14497,"src":"4323:29:75","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14471,"nodeType":"UserDefinedTypeName","pathNode":{"id":14470,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4323:13:75"},"referencedDeclaration":10993,"src":"4323:13:75","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"4322:31:75"},"returnParameters":{"id":14474,"nodeType":"ParameterList","parameters":[],"src":"4376:0:75"},"scope":14541,"src":"4293:240:75","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[7416],"body":{"id":14539,"nodeType":"Block","src":"5103:409:75","statements":[{"expression":{"components":[{"id":14509,"name":"mode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14501,"src":"5205:4:75","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}}],"id":14510,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5204:6:75","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"id":14511,"nodeType":"ExpressionStatement","src":"5204:6:75"},{"assignments":[14513],"declarations":[{"constant":false,"id":14513,"mutability":"mutable","name":"sender","nameLocation":"5228:6:75","nodeType":"VariableDeclaration","scope":14539,"src":"5220:14:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14512,"name":"address","nodeType":"ElementaryTypeName","src":"5220:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14521,"initialValue":{"arguments":[{"id":14516,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14503,"src":"5248:7:75","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":14518,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5258:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14517,"name":"address","nodeType":"ElementaryTypeName","src":"5258:7:75","typeDescriptions":{}}}],"id":14519,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5257:9:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}],"expression":{"id":14514,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5237:3:75","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14515,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5237:10:75","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":14520,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5237:30:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"VariableDeclarationStatement","src":"5220:47:75"},{"assignments":[14523],"declarations":[{"constant":false,"id":14523,"mutability":"mutable","name":"charge","nameLocation":"5285:6:75","nodeType":"VariableDeclaration","scope":14539,"src":"5277:14:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14522,"name":"uint256","nodeType":"ElementaryTypeName","src":"5277:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14529,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14525,"name":"actualGasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14505,"src":"5313:13:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":14526,"name":"COST_OF_POST","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14285,"src":"5329:12:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5313:28:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14524,"name":"getTokenValueOfEth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14398,"src":"5294:18:75","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":14528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5294:48:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5277:65:75"},{"expression":{"arguments":[{"id":14531,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14513,"src":"5475:6:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":14534,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5491:4:75","typeDescriptions":{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenPaymaster_$14541","typeString":"contract TokenPaymaster"}],"id":14533,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5483:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14532,"name":"address","nodeType":"ElementaryTypeName","src":"5483:7:75","typeDescriptions":{}}},"id":14535,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5483:13:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":14536,"name":"charge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14523,"src":"5498:6:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14530,"name":"_transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4101,"src":"5465:9:75","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":14537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5465:40:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14538,"nodeType":"ExpressionStatement","src":"5465:40:75"}]},"documentation":{"id":14498,"nodeType":"StructuredDocumentation","src":"4539:460:75","text":" actual charge of user.\n this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases)\n BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting\n the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp),\n and the transaction should succeed there."},"id":14540,"implemented":true,"kind":"function","modifiers":[],"name":"_postOp","nameLocation":"5013:7:75","nodeType":"FunctionDefinition","overrides":{"id":14507,"nodeType":"OverrideSpecifier","overrides":[],"src":"5094:8:75"},"parameters":{"id":14506,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14501,"mutability":"mutable","name":"mode","nameLocation":"5032:4:75","nodeType":"VariableDeclaration","scope":14540,"src":"5021:15:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"},"typeName":{"id":14500,"nodeType":"UserDefinedTypeName","pathNode":{"id":14499,"name":"PostOpMode","nodeType":"IdentifierPath","referencedDeclaration":10834,"src":"5021:10:75"},"referencedDeclaration":10834,"src":"5021:10:75","typeDescriptions":{"typeIdentifier":"t_enum$_PostOpMode_$10834","typeString":"enum IPaymaster.PostOpMode"}},"visibility":"internal"},{"constant":false,"id":14503,"mutability":"mutable","name":"context","nameLocation":"5053:7:75","nodeType":"VariableDeclaration","scope":14540,"src":"5038:22:75","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14502,"name":"bytes","nodeType":"ElementaryTypeName","src":"5038:5:75","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":14505,"mutability":"mutable","name":"actualGasCost","nameLocation":"5070:13:75","nodeType":"VariableDeclaration","scope":14540,"src":"5062:21:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14504,"name":"uint256","nodeType":"ElementaryTypeName","src":"5062:7:75","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5020:64:75"},"returnParameters":{"id":14508,"nodeType":"ParameterList","parameters":[],"src":"5103:0:75"},"scope":14541,"src":"5004:508:75","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":14542,"src":"1212:4302:75","usedErrors":[]}],"src":"36:5479:75"},"id":75},"contracts/samples/VerifyingPaymaster.sol":{"ast":{"absolutePath":"contracts/samples/VerifyingPaymaster.sol","exportedSymbols":{"BasePaymaster":[7528],"Context":[5151],"ECDSA":[5828],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Math":[6705],"Ownable":[2933],"Strings":[5467],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"VerifyingPaymaster":[14757],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":14758,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":14543,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:76"},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":14544,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14758,"sourceUnit":7529,"src":"140:35:76","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":14545,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14758,"sourceUnit":5829,"src":"176:62:76","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14547,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"810:13:76"},"id":14548,"nodeType":"InheritanceSpecifier","src":"810:13:76"}],"canonicalName":"VerifyingPaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":14546,"nodeType":"StructuredDocumentation","src":"239:539:76","text":" A sample paymaster that uses external service to decide whether to pay for the UserOp.\n The paymaster trusts an external signer to sign the transaction.\n The calling user must pass the UserOp to that external signer first, which performs\n whatever off-chain verification before signing the UserOp.\n Note that this signature is NOT a replacement for the account-specific signature:\n - the paymaster checks a signature to agree to PAY for GAS.\n - the account checks a signature to prove identity and account ownership."},"fullyImplemented":true,"id":14757,"linearizedBaseContracts":[14757,7528,2933,5151,10861],"name":"VerifyingPaymaster","nameLocation":"788:18:76","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14551,"libraryName":{"id":14549,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"837:5:76"},"nodeType":"UsingForDirective","src":"831:24:76","typeName":{"id":14550,"name":"bytes32","nodeType":"ElementaryTypeName","src":"847:7:76","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"global":false,"id":14555,"libraryName":{"id":14552,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"866:16:76"},"nodeType":"UsingForDirective","src":"860:41:76","typeName":{"id":14554,"nodeType":"UserDefinedTypeName","pathNode":{"id":14553,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"887:13:76"},"referencedDeclaration":10993,"src":"887:13:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"constant":false,"functionSelector":"23d9ac9b","id":14557,"mutability":"immutable","name":"verifyingSigner","nameLocation":"932:15:76","nodeType":"VariableDeclaration","scope":14757,"src":"907:40:76","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14556,"name":"address","nodeType":"ElementaryTypeName","src":"907:7:76","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":true,"id":14560,"mutability":"constant","name":"VALID_TIMESTAMP_OFFSET","nameLocation":"979:22:76","nodeType":"VariableDeclaration","scope":14757,"src":"954:52:76","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14558,"name":"uint256","nodeType":"ElementaryTypeName","src":"954:7:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3230","id":14559,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1004:2:76","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"visibility":"private"},{"constant":true,"id":14563,"mutability":"constant","name":"SIGNATURE_OFFSET","nameLocation":"1038:16:76","nodeType":"VariableDeclaration","scope":14757,"src":"1013:46:76","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14561,"name":"uint256","nodeType":"ElementaryTypeName","src":"1013:7:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3834","id":14562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1057:2:76","typeDescriptions":{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"},"value":"84"},"visibility":"private"},{"body":{"id":14578,"nodeType":"Block","src":"1156:51:76","statements":[{"expression":{"id":14576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14574,"name":"verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14557,"src":"1166:15:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14575,"name":"_verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14568,"src":"1184:16:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1166:34:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14577,"nodeType":"ExpressionStatement","src":"1166:34:76"}]},"id":14579,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14571,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14566,"src":"1143:11:76","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":14572,"kind":"baseConstructorSpecifier","modifierName":{"id":14570,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"1129:13:76"},"nodeType":"ModifierInvocation","src":"1129:26:76"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14569,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14566,"mutability":"mutable","name":"_entryPoint","nameLocation":"1090:11:76","nodeType":"VariableDeclaration","scope":14579,"src":"1078:23:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":14565,"nodeType":"UserDefinedTypeName","pathNode":{"id":14564,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1078:11:76"},"referencedDeclaration":10807,"src":"1078:11:76","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":14568,"mutability":"mutable","name":"_verifyingSigner","nameLocation":"1111:16:76","nodeType":"VariableDeclaration","scope":14579,"src":"1103:24:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14567,"name":"address","nodeType":"ElementaryTypeName","src":"1103:7:76","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1077:51:76"},"returnParameters":{"id":14573,"nodeType":"ParameterList","parameters":[],"src":"1156:0:76"},"scope":14757,"src":"1066:141:76","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"constant":false,"functionSelector":"9c90b443","id":14583,"mutability":"mutable","name":"senderNonce","nameLocation":"1248:11:76","nodeType":"VariableDeclaration","scope":14757,"src":"1213:46:76","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":14582,"keyType":{"id":14580,"name":"address","nodeType":"ElementaryTypeName","src":"1221:7:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1213:27:76","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":14581,"name":"uint256","nodeType":"ElementaryTypeName","src":"1232:7:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":14597,"nodeType":"Block","src":"1352:643:76","statements":[{"assignments":[14592],"declarations":[{"constant":false,"id":14592,"mutability":"mutable","name":"pnd","nameLocation":"1446:3:76","nodeType":"VariableDeclaration","scope":14597,"src":"1431:18:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14591,"name":"bytes","nodeType":"ElementaryTypeName","src":"1431:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":14595,"initialValue":{"expression":{"id":14593,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14586,"src":"1452:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"1452:23:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"1431:44:76"},{"AST":{"nodeType":"YulBlock","src":"1737:252:76","statements":[{"nodeType":"YulVariableDeclaration","src":"1751:17:76","value":{"name":"userOp","nodeType":"YulIdentifier","src":"1762:6:76"},"variables":[{"name":"ofs","nodeType":"YulTypedName","src":"1755:3:76","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1781:40:76","value":{"arguments":[{"arguments":[{"name":"pnd.offset","nodeType":"YulIdentifier","src":"1800:10:76"},{"name":"ofs","nodeType":"YulIdentifier","src":"1812:3:76"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1796:3:76"},"nodeType":"YulFunctionCall","src":"1796:20:76"},{"kind":"number","nodeType":"YulLiteral","src":"1818:2:76","type":"","value":"32"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1792:3:76"},"nodeType":"YulFunctionCall","src":"1792:29:76"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"1785:3:76","type":""}]},{"nodeType":"YulAssignment","src":"1834:18:76","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1847:4:76","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1841:5:76"},"nodeType":"YulFunctionCall","src":"1841:11:76"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"1834:3:76"}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1872:4:76","type":"","value":"0x40"},{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"1882:3:76"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1891:3:76"},{"kind":"number","nodeType":"YulLiteral","src":"1896:2:76","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1887:3:76"},"nodeType":"YulFunctionCall","src":"1887:12:76"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1878:3:76"},"nodeType":"YulFunctionCall","src":"1878:22:76"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1865:6:76"},"nodeType":"YulFunctionCall","src":"1865:36:76"},"nodeType":"YulExpressionStatement","src":"1865:36:76"},{"expression":{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"1921:3:76"},{"name":"len","nodeType":"YulIdentifier","src":"1926:3:76"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1914:6:76"},"nodeType":"YulFunctionCall","src":"1914:16:76"},"nodeType":"YulExpressionStatement","src":"1914:16:76"},{"expression":{"arguments":[{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"1960:3:76"},{"kind":"number","nodeType":"YulLiteral","src":"1965:2:76","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1956:3:76"},"nodeType":"YulFunctionCall","src":"1956:12:76"},{"name":"ofs","nodeType":"YulIdentifier","src":"1970:3:76"},{"name":"len","nodeType":"YulIdentifier","src":"1975:3:76"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1943:12:76"},"nodeType":"YulFunctionCall","src":"1943:36:76"},"nodeType":"YulExpressionStatement","src":"1943:36:76"}]},"evmVersion":"london","externalReferences":[{"declaration":14592,"isOffset":true,"isSlot":false,"src":"1800:10:76","suffix":"offset","valueSize":1},{"declaration":14589,"isOffset":false,"isSlot":false,"src":"1834:3:76","valueSize":1},{"declaration":14589,"isOffset":false,"isSlot":false,"src":"1882:3:76","valueSize":1},{"declaration":14589,"isOffset":false,"isSlot":false,"src":"1921:3:76","valueSize":1},{"declaration":14589,"isOffset":false,"isSlot":false,"src":"1960:3:76","valueSize":1},{"declaration":14586,"isOffset":false,"isSlot":false,"src":"1762:6:76","valueSize":1}],"id":14596,"nodeType":"InlineAssembly","src":"1728:261:76"}]},"id":14598,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"1275:4:76","nodeType":"FunctionDefinition","parameters":{"id":14587,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14586,"mutability":"mutable","name":"userOp","nameLocation":"1303:6:76","nodeType":"VariableDeclaration","scope":14598,"src":"1280:29:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14585,"nodeType":"UserDefinedTypeName","pathNode":{"id":14584,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1280:13:76"},"referencedDeclaration":10993,"src":"1280:13:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1279:31:76"},"returnParameters":{"id":14590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14589,"mutability":"mutable","name":"ret","nameLocation":"1347:3:76","nodeType":"VariableDeclaration","scope":14598,"src":"1334:16:76","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":14588,"name":"bytes","nodeType":"ElementaryTypeName","src":"1334:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1333:18:76"},"scope":14757,"src":"1266:729:76","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":14633,"nodeType":"Block","src":"2529:344:76","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":14615,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14602,"src":"2677:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":14614,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14598,"src":"2672:4:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":14616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2672:12:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":14617,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2702:5:76","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":14618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"2702:13:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":14621,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2741:4:76","typeDescriptions":{"typeIdentifier":"t_contract$_VerifyingPaymaster_$14757","typeString":"contract VerifyingPaymaster"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_VerifyingPaymaster_$14757","typeString":"contract VerifyingPaymaster"}],"id":14620,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2733:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14619,"name":"address","nodeType":"ElementaryTypeName","src":"2733:7:76","typeDescriptions":{}}},"id":14622,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2733:13:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":14623,"name":"senderNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14583,"src":"2764:11:76","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":14627,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14624,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14602,"src":"2776:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"2776:16:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":14626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2776:18:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2764:31:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":14628,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14604,"src":"2813:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":14629,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14606,"src":"2841:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"expression":{"id":14612,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2644:3:76","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14613,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"2644:10:76","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2644:221:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":14611,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2634:9:76","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":14631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:232:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":14610,"id":14632,"nodeType":"Return","src":"2627:239:76"}]},"documentation":{"id":14599,"nodeType":"StructuredDocumentation","src":"2001:403:76","text":" return the hash we're going to sign off-chain (and validate on-chain)\n this method is called by the off-chain service, to sign the request.\n it is called on-chain from the validatePaymasterUserOp, to validate the signature.\n note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\",\n which will carry the signature itself."},"functionSelector":"94e1fc19","id":14634,"implemented":true,"kind":"function","modifiers":[],"name":"getHash","nameLocation":"2418:7:76","nodeType":"FunctionDefinition","parameters":{"id":14607,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14602,"mutability":"mutable","name":"userOp","nameLocation":"2449:6:76","nodeType":"VariableDeclaration","scope":14634,"src":"2426:29:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14601,"nodeType":"UserDefinedTypeName","pathNode":{"id":14600,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2426:13:76"},"referencedDeclaration":10993,"src":"2426:13:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":14604,"mutability":"mutable","name":"validUntil","nameLocation":"2464:10:76","nodeType":"VariableDeclaration","scope":14634,"src":"2457:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14603,"name":"uint48","nodeType":"ElementaryTypeName","src":"2457:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14606,"mutability":"mutable","name":"validAfter","nameLocation":"2483:10:76","nodeType":"VariableDeclaration","scope":14634,"src":"2476:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14605,"name":"uint48","nodeType":"ElementaryTypeName","src":"2476:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2425:69:76"},"returnParameters":{"id":14610,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14609,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14634,"src":"2520:7:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14608,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2520:7:76","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2519:9:76"},"scope":14757,"src":"2409:464:76","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[7373],"body":{"id":14720,"nodeType":"Block","src":"3404:1071:76","statements":[{"expression":{"components":[{"id":14650,"name":"requiredPreFund","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14642,"src":"3415:15:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":14651,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3414:17:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14652,"nodeType":"ExpressionStatement","src":"3414:17:76"},{"assignments":[14654,14656,14658],"declarations":[{"constant":false,"id":14654,"mutability":"mutable","name":"validUntil","nameLocation":"3450:10:76","nodeType":"VariableDeclaration","scope":14720,"src":"3443:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14653,"name":"uint48","nodeType":"ElementaryTypeName","src":"3443:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14656,"mutability":"mutable","name":"validAfter","nameLocation":"3469:10:76","nodeType":"VariableDeclaration","scope":14720,"src":"3462:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14655,"name":"uint48","nodeType":"ElementaryTypeName","src":"3462:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14658,"mutability":"mutable","name":"signature","nameLocation":"3496:9:76","nodeType":"VariableDeclaration","scope":14720,"src":"3481:24:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14657,"name":"bytes","nodeType":"ElementaryTypeName","src":"3481:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":14663,"initialValue":{"arguments":[{"expression":{"id":14660,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14638,"src":"3531:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"3531:23:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":14659,"name":"parsePaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14756,"src":"3509:21:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_uint48_$_t_uint48_$_t_bytes_calldata_ptr_$","typeString":"function (bytes calldata) pure returns (uint48,uint48,bytes calldata)"}},"id":14662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:46:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$_t_bytes_calldata_ptr_$","typeString":"tuple(uint48,uint48,bytes calldata)"}},"nodeType":"VariableDeclarationStatement","src":"3442:113:76"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":14673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":14665,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14658,"src":"3776:9:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3776:16:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3634","id":14667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3796:2:76","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"3776:22:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14672,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":14669,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14658,"src":"3802:9:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3802:16:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3635","id":14671,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3822:2:76","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"},"src":"3802:22:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3776:48:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964207369676e6174757265206c656e67746820696e207061796d6173746572416e6444617461","id":14674,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3826:66:76","typeDescriptions":{"typeIdentifier":"t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7","typeString":"literal_string \"VerifyingPaymaster: invalid signature length in paymasterAndData\""},"value":"VerifyingPaymaster: invalid signature length in paymasterAndData"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7","typeString":"literal_string \"VerifyingPaymaster: invalid signature length in paymasterAndData\""}],"id":14664,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3768:7:76","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3768:125:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14676,"nodeType":"ExpressionStatement","src":"3768:125:76"},{"assignments":[14678],"declarations":[{"constant":false,"id":14678,"mutability":"mutable","name":"hash","nameLocation":"3911:4:76","nodeType":"VariableDeclaration","scope":14720,"src":"3903:12:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14677,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3903:7:76","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":14687,"initialValue":{"arguments":[{"arguments":[{"id":14682,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14638,"src":"3955:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":14683,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14654,"src":"3963:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":14684,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14656,"src":"3975:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":14681,"name":"getHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14634,"src":"3947:7:76","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_uint48_$_t_uint48_$returns$_t_bytes32_$","typeString":"function (struct UserOperation calldata,uint48,uint48) view returns (bytes32)"}},"id":14685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3947:39:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":14679,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5828,"src":"3918:5:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ECDSA_$5828_$","typeString":"type(library ECDSA)"}},"id":14680,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"3918:28:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":14686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3918:69:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3903:84:76"},{"expression":{"id":14693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"3997:33:76","subExpression":{"baseExpression":{"id":14688,"name":"senderNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14583,"src":"3997:11:76","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":14692,"indexExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14689,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14638,"src":"4009:6:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSender","nodeType":"MemberAccess","referencedDeclaration":11015,"src":"4009:16:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_address_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":14691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4009:18:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3997:31:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14694,"nodeType":"ExpressionStatement","src":"3997:33:76"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":14701,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14695,"name":"verifyingSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14557,"src":"4119:15:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":14698,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14678,"src":"4152:4:76","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":14699,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14658,"src":"4158:9:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":14696,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5828,"src":"4138:5:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ECDSA_$5828_$","typeString":"type(library ECDSA)"}},"id":14697,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"4138:13:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":14700,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4138:30:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4119:49:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14711,"nodeType":"IfStatement","src":"4115:139:76","trueBody":{"id":14710,"nodeType":"Block","src":"4170:84:76","statements":[{"expression":{"components":[{"hexValue":"","id":14702,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4192:2:76","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"arguments":[{"hexValue":"74727565","id":14704,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4215:4:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":14705,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14654,"src":"4220:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":14706,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14656,"src":"4231:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":14703,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"4195:19:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":14707,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4195:47:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":14708,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4191:52:76","typeDescriptions":{"typeIdentifier":"t_tuple$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$_t_uint256_$","typeString":"tuple(literal_string \"\",uint256)"}},"functionReturnParameters":14649,"id":14709,"nodeType":"Return","src":"4184:59:76"}]}},{"expression":{"components":[{"hexValue":"","id":14712,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4416:2:76","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"arguments":[{"hexValue":"66616c7365","id":14714,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4439:5:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"id":14715,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14654,"src":"4445:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":14716,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14656,"src":"4456:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":14713,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"4419:19:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":14717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4419:48:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":14718,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4415:53:76","typeDescriptions":{"typeIdentifier":"t_tuple$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$_t_uint256_$","typeString":"tuple(literal_string \"\",uint256)"}},"functionReturnParameters":14649,"id":14719,"nodeType":"Return","src":"4408:60:76"}]},"documentation":{"id":14635,"nodeType":"StructuredDocumentation","src":"2879:329:76","text":" verify our external signer signed this request.\n the \"paymasterAndData\" is expected to be the paymaster and a signature over the entire request params\n paymasterAndData[:20] : address(this)\n paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\n paymasterAndData[84:] : signature"},"id":14721,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"3222:24:76","nodeType":"FunctionDefinition","overrides":{"id":14644,"nodeType":"OverrideSpecifier","overrides":[],"src":"3340:8:76"},"parameters":{"id":14643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14638,"mutability":"mutable","name":"userOp","nameLocation":"3270:6:76","nodeType":"VariableDeclaration","scope":14721,"src":"3247:29:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14637,"nodeType":"UserDefinedTypeName","pathNode":{"id":14636,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3247:13:76"},"referencedDeclaration":10993,"src":"3247:13:76","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":14640,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14721,"src":"3278:7:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14639,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3278:7:76","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":14642,"mutability":"mutable","name":"requiredPreFund","nameLocation":"3310:15:76","nodeType":"VariableDeclaration","scope":14721,"src":"3302:23:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14641,"name":"uint256","nodeType":"ElementaryTypeName","src":"3302:7:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3246:80:76"},"returnParameters":{"id":14649,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14646,"mutability":"mutable","name":"context","nameLocation":"3371:7:76","nodeType":"VariableDeclaration","scope":14721,"src":"3358:20:76","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":14645,"name":"bytes","nodeType":"ElementaryTypeName","src":"3358:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":14648,"mutability":"mutable","name":"validationData","nameLocation":"3388:14:76","nodeType":"VariableDeclaration","scope":14721,"src":"3380:22:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14647,"name":"uint256","nodeType":"ElementaryTypeName","src":"3380:7:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3357:46:76"},"scope":14757,"src":"3213:1262:76","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":14755,"nodeType":"Block","src":"4629:187:76","statements":[{"expression":{"id":14747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":14732,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14726,"src":"4640:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":14733,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14728,"src":"4652:10:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"id":14734,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"4639:24:76","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$","typeString":"tuple(uint48,uint48)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":14737,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14723,"src":"4677:16:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"id":14739,"name":"SIGNATURE_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14563,"src":"4717:16:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14740,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"4677:57:76","startExpression":{"id":14738,"name":"VALID_TIMESTAMP_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14560,"src":"4694:22:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},{"components":[{"id":14742,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4736:6:76","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":14741,"name":"uint48","nodeType":"ElementaryTypeName","src":"4736:6:76","typeDescriptions":{}}},{"id":14744,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4744:6:76","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":14743,"name":"uint48","nodeType":"ElementaryTypeName","src":"4744:6:76","typeDescriptions":{}}}],"id":14745,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4735:16:76","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"},{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}],"expression":{"id":14735,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4666:3:76","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14736,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"4666:10:76","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":14746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4666:86:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$","typeString":"tuple(uint48,uint48)"}},"src":"4639:113:76","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14748,"nodeType":"ExpressionStatement","src":"4639:113:76"},{"expression":{"id":14753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14749,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14730,"src":"4762:9:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":14750,"name":"paymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14723,"src":"4774:16:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"4774:35:76","startExpression":{"id":14751,"name":"SIGNATURE_OFFSET","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14563,"src":"4791:16:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"src":"4762:47:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14754,"nodeType":"ExpressionStatement","src":"4762:47:76"}]},"functionSelector":"94d4ad60","id":14756,"implemented":true,"kind":"function","modifiers":[],"name":"parsePaymasterAndData","nameLocation":"4490:21:76","nodeType":"FunctionDefinition","parameters":{"id":14724,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14723,"mutability":"mutable","name":"paymasterAndData","nameLocation":"4527:16:76","nodeType":"VariableDeclaration","scope":14756,"src":"4512:31:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14722,"name":"bytes","nodeType":"ElementaryTypeName","src":"4512:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4511:33:76"},"returnParameters":{"id":14731,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14726,"mutability":"mutable","name":"validUntil","nameLocation":"4572:10:76","nodeType":"VariableDeclaration","scope":14756,"src":"4565:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14725,"name":"uint48","nodeType":"ElementaryTypeName","src":"4565:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14728,"mutability":"mutable","name":"validAfter","nameLocation":"4591:10:76","nodeType":"VariableDeclaration","scope":14756,"src":"4584:17:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":14727,"name":"uint48","nodeType":"ElementaryTypeName","src":"4584:6:76","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14730,"mutability":"mutable","name":"signature","nameLocation":"4618:9:76","nodeType":"VariableDeclaration","scope":14756,"src":"4603:24:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14729,"name":"bytes","nodeType":"ElementaryTypeName","src":"4603:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4564:64:76"},"scope":14757,"src":"4481:335:76","stateMutability":"pure","virtual":false,"visibility":"public"}],"scope":14758,"src":"779:4039:76","usedErrors":[]}],"src":"36:4783:76"},"id":76},"contracts/samples/bls/BLSAccount.sol":{"ast":{"absolutePath":"contracts/samples/bls/BLSAccount.sol","exportedSymbols":{"Address":[5129],"BLSAccount":[14914],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBLSAccount":[16427],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":14915,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":14759,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:77"},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../SimpleAccount.sol","id":14760,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14915,"sourceUnit":14142,"src":"62:30:77","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/bls/IBLSAccount.sol","file":"./IBLSAccount.sol","id":14761,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14915,"sourceUnit":16428,"src":"93:27:77","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14763,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"601:13:77"},"id":14764,"nodeType":"InheritanceSpecifier","src":"601:13:77"},{"baseName":{"id":14765,"name":"IBLSAccount","nodeType":"IdentifierPath","referencedDeclaration":16427,"src":"616:11:77"},"id":14766,"nodeType":"InheritanceSpecifier","src":"616:11:77"}],"canonicalName":"BLSAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":14762,"nodeType":"StructuredDocumentation","src":"122:455:77","text":" Minimal BLS-based account that uses an aggregated signature.\n The account must maintain its own BLS public key, and expose its trusted signature aggregator.\n Note that unlike the \"standard\" SimpleAccount, this account can't be called directly\n (normal SimpleAccount uses its \"signer\" address as both the ecrecover signer, and as a legitimate\n Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)"},"fullyImplemented":true,"id":14914,"linearizedBaseContracts":[14914,16427,14141,3543,3659,3312,2957,17937,3754,5840,4779,4799,7308,10569],"name":"BLSAccount","nameLocation":"587:10:77","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"245a7bfc","id":14768,"mutability":"immutable","name":"aggregator","nameLocation":"659:10:77","nodeType":"VariableDeclaration","scope":14914,"src":"634:35:77","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14767,"name":"address","nodeType":"ElementaryTypeName","src":"634:7:77","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"id":14772,"mutability":"mutable","name":"publicKey","nameLocation":"694:9:77","nodeType":"VariableDeclaration","scope":14914,"src":"675:28:77","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14769,"name":"uint256","nodeType":"ElementaryTypeName","src":"675:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14771,"length":{"hexValue":"34","id":14770,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"683:1:77","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"675:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"private"},{"body":{"id":14787,"nodeType":"Block","src":"976:42:77","statements":[{"expression":{"id":14785,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14783,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14768,"src":"986:10:77","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14784,"name":"anAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14777,"src":"999:12:77","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"986:25:77","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14786,"nodeType":"ExpressionStatement","src":"986:25:77"}]},"id":14788,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14780,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14775,"src":"961:12:77","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":14781,"kind":"baseConstructorSpecifier","modifierName":{"id":14779,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"947:13:77"},"nodeType":"ModifierInvocation","src":"947:27:77"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14778,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14775,"mutability":"mutable","name":"anEntryPoint","nameLocation":"911:12:77","nodeType":"VariableDeclaration","scope":14788,"src":"899:24:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":14774,"nodeType":"UserDefinedTypeName","pathNode":{"id":14773,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"899:11:77"},"referencedDeclaration":10807,"src":"899:11:77","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":14777,"mutability":"mutable","name":"anAggregator","nameLocation":"933:12:77","nodeType":"VariableDeclaration","scope":14788,"src":"925:20:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14776,"name":"address","nodeType":"ElementaryTypeName","src":"925:7:77","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"898:48:77"},"returnParameters":{"id":14782,"nodeType":"ParameterList","parameters":[],"src":"976:0:77"},"scope":14914,"src":"887:131:77","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14811,"nodeType":"Block","src":"1285:84:77","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":14803,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1321:1:77","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":14802,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1313:7:77","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14801,"name":"address","nodeType":"ElementaryTypeName","src":"1313:7:77","typeDescriptions":{}}},"id":14804,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1313:10:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14798,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"1295:5:77","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_BLSAccount_$14914_$","typeString":"type(contract super BLSAccount)"}},"id":14800,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_initialize","nodeType":"MemberAccess","referencedDeclaration":13998,"src":"1295:17:77","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":14805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1295:29:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14806,"nodeType":"ExpressionStatement","src":"1295:29:77"},{"expression":{"arguments":[{"id":14808,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14793,"src":"1351:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":14807,"name":"_setBlsPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14901,"src":"1334:16:77","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function (uint256[4] memory)"}},"id":14809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1334:28:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14810,"nodeType":"ExpressionStatement","src":"1334:28:77"}]},"documentation":{"id":14789,"nodeType":"StructuredDocumentation","src":"1024:179:77","text":" The initializer for the BLSAccount instance.\n @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account."},"functionSelector":"ee472f36","id":14812,"implemented":true,"kind":"function","modifiers":[{"id":14796,"kind":"modifierInvocation","modifierName":{"id":14795,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":3445,"src":"1273:11:77"},"nodeType":"ModifierInvocation","src":"1273:11:77"}],"name":"initialize","nameLocation":"1217:10:77","nodeType":"FunctionDefinition","parameters":{"id":14794,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14793,"mutability":"mutable","name":"aPublicKey","nameLocation":"1246:10:77","nodeType":"VariableDeclaration","scope":14812,"src":"1228:28:77","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14790,"name":"uint256","nodeType":"ElementaryTypeName","src":"1228:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14792,"length":{"hexValue":"34","id":14791,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1236:1:77","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1228:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1227:30:77"},"returnParameters":{"id":14797,"nodeType":"ParameterList","parameters":[],"src":"1285:0:77"},"scope":14914,"src":"1208:161:77","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[14050],"body":{"id":14868,"nodeType":"Block","src":"1514:548:77","statements":[{"expression":{"components":[{"id":14823,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14815,"src":"1526:6:77","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":14824,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14817,"src":"1534:10:77","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":14825,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1525:20:77","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$","typeString":"tuple(struct UserOperation calldata,bytes32)"}},"id":14826,"nodeType":"ExpressionStatement","src":"1525:20:77"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":14827,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14815,"src":"1559:6:77","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"1559:15:77","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1559:22:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":14830,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1585:1:77","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1559:27:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14859,"nodeType":"IfStatement","src":"1555:432:77","trueBody":{"id":14858,"nodeType":"Block","src":"1588:399:77","statements":[{"assignments":[14833],"declarations":[{"constant":false,"id":14833,"mutability":"mutable","name":"pubKeyHash","nameLocation":"1812:10:77","nodeType":"VariableDeclaration","scope":14858,"src":"1804:18:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14832,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1804:7:77","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":14841,"initialValue":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":14837,"name":"getBlsPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14913,"src":"1846:15:77","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function () view returns (uint256[4] memory)"}},"id":14838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1846:17:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"expression":{"id":14835,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1835:3:77","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14836,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"1835:10:77","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14839,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1835:29:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":14834,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1825:9:77","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":14840,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1825:40:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1804:61:77"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":14854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"baseExpression":{"expression":{"id":14844,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14815,"src":"1897:6:77","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"1897:15:77","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14851,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"1897:47:77","startExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":14846,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14815,"src":"1913:6:77","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":14847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"1913:15:77","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1913:22:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"313238","id":14849,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1938:3:77","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"1913:28:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":14843,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1887:9:77","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":14852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1887:58:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":14853,"name":"pubKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14833,"src":"1949:10:77","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"1887:72:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"77726f6e67207075626b6579","id":14855,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1961:14:77","typeDescriptions":{"typeIdentifier":"t_stringliteral_0d47f95102ecb77a503f8bf26fe03155315a477d7b00a1b0cee7c3b13797c2b5","typeString":"literal_string \"wrong pubkey\""},"value":"wrong pubkey"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0d47f95102ecb77a503f8bf26fe03155315a477d7b00a1b0cee7c3b13797c2b5","typeString":"literal_string \"wrong pubkey\""}],"id":14842,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1879:7:77","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1879:97:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14857,"nodeType":"ExpressionStatement","src":"1879:97:77"}]}},{"expression":{"arguments":[{"arguments":[{"id":14862,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14768,"src":"2038:10:77","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":14863,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2050:1:77","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":14864,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2052:1:77","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":14861,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9761,"src":"2023:14:77","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$9761_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":14865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2023:31:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}],"id":14860,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9942,"src":"2003:19:77","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_ValidationData_$9761_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct ValidationData memory) pure returns (uint256)"}},"id":14866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2003:52:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":14822,"id":14867,"nodeType":"Return","src":"1996:59:77"}]},"id":14869,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"1384:18:77","nodeType":"FunctionDefinition","overrides":{"id":14819,"nodeType":"OverrideSpecifier","overrides":[],"src":"1467:8:77"},"parameters":{"id":14818,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14815,"mutability":"mutable","name":"userOp","nameLocation":"1426:6:77","nodeType":"VariableDeclaration","scope":14869,"src":"1403:29:77","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":14814,"nodeType":"UserDefinedTypeName","pathNode":{"id":14813,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1403:13:77"},"referencedDeclaration":10993,"src":"1403:13:77","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":14817,"mutability":"mutable","name":"userOpHash","nameLocation":"1442:10:77","nodeType":"VariableDeclaration","scope":14869,"src":"1434:18:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14816,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1434:7:77","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1402:51:77"},"returnParameters":{"id":14822,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14821,"mutability":"mutable","name":"validationData","nameLocation":"1498:14:77","nodeType":"VariableDeclaration","scope":14869,"src":"1490:22:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14820,"name":"uint256","nodeType":"ElementaryTypeName","src":"1490:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1489:24:77"},"scope":14914,"src":"1375:687:77","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":14883,"nodeType":"Block","src":"2330:47:77","statements":[{"expression":{"arguments":[{"id":14880,"name":"newPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14874,"src":"2357:12:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":14879,"name":"_setBlsPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14901,"src":"2340:16:77","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function (uint256[4] memory)"}},"id":14881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2340:30:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14882,"nodeType":"ExpressionStatement","src":"2340:30:77"}]},"documentation":{"id":14870,"nodeType":"StructuredDocumentation","src":"2068:183:77","text":" Allows the owner to set or change the BLS key.\n @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account."},"functionSelector":"18fc5c44","id":14884,"implemented":true,"kind":"function","modifiers":[{"id":14877,"kind":"modifierInvocation","modifierName":{"id":14876,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":13855,"src":"2320:9:77"},"nodeType":"ModifierInvocation","src":"2320:9:77"}],"name":"setBlsPublicKey","nameLocation":"2265:15:77","nodeType":"FunctionDefinition","parameters":{"id":14875,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14874,"mutability":"mutable","name":"newPublicKey","nameLocation":"2299:12:77","nodeType":"VariableDeclaration","scope":14884,"src":"2281:30:77","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14871,"name":"uint256","nodeType":"ElementaryTypeName","src":"2281:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14873,"length":{"hexValue":"34","id":14872,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2289:1:77","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2281:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"2280:32:77"},"returnParameters":{"id":14878,"nodeType":"ParameterList","parameters":[],"src":"2330:0:77"},"scope":14914,"src":"2256:121:77","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14900,"nodeType":"Block","src":"2450:97:77","statements":[{"eventCall":{"arguments":[{"id":14892,"name":"publicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14772,"src":"2482:9:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4] storage ref"}},{"id":14893,"name":"newPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14888,"src":"2493:12:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4] storage ref"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":14891,"name":"PublicKeyChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16418,"src":"2465:16:77","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function (uint256[4] memory,uint256[4] memory)"}},"id":14894,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2465:41:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14895,"nodeType":"EmitStatement","src":"2460:46:77"},{"expression":{"id":14898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14896,"name":"publicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14772,"src":"2516:9:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4] storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14897,"name":"newPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14888,"src":"2528:12:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"src":"2516:24:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4] storage ref"}},"id":14899,"nodeType":"ExpressionStatement","src":"2516:24:77"}]},"id":14901,"implemented":true,"kind":"function","modifiers":[],"name":"_setBlsPublicKey","nameLocation":"2392:16:77","nodeType":"FunctionDefinition","parameters":{"id":14889,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14888,"mutability":"mutable","name":"newPublicKey","nameLocation":"2427:12:77","nodeType":"VariableDeclaration","scope":14901,"src":"2409:30:77","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14885,"name":"uint256","nodeType":"ElementaryTypeName","src":"2409:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14887,"length":{"hexValue":"34","id":14886,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2417:1:77","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2409:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"2408:32:77"},"returnParameters":{"id":14890,"nodeType":"ParameterList","parameters":[],"src":"2450:0:77"},"scope":14914,"src":"2383:164:77","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[16426],"body":{"id":14912,"nodeType":"Block","src":"2661:33:77","statements":[{"expression":{"id":14910,"name":"publicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14772,"src":"2678:9:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage","typeString":"uint256[4] storage ref"}},"functionReturnParameters":14909,"id":14911,"nodeType":"Return","src":"2671:16:77"}]},"documentation":{"id":14902,"nodeType":"StructuredDocumentation","src":"2553:27:77","text":"@inheritdoc IBLSAccount"},"functionSelector":"e02afbae","id":14913,"implemented":true,"kind":"function","modifiers":[],"name":"getBlsPublicKey","nameLocation":"2594:15:77","nodeType":"FunctionDefinition","overrides":{"id":14904,"nodeType":"OverrideSpecifier","overrides":[],"src":"2619:8:77"},"parameters":{"id":14903,"nodeType":"ParameterList","parameters":[],"src":"2609:2:77"},"returnParameters":{"id":14909,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14908,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14913,"src":"2642:17:77","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14905,"name":"uint256","nodeType":"ElementaryTypeName","src":"2642:7:77","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14907,"length":{"hexValue":"34","id":14906,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2650:1:77","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2642:10:77","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"2641:19:77"},"scope":14914,"src":"2585:109:77","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":14915,"src":"578:2118:77","usedErrors":[]}],"src":"36:2661:77"},"id":77},"contracts/samples/bls/BLSAccountFactory.sol":{"ast":{"absolutePath":"contracts/samples/bls/BLSAccountFactory.sol","exportedSymbols":{"Address":[5129],"BLSAccount":[14914],"BLSAccountFactory":[15066],"BaseAccount":[7308],"Create2":[5232],"ECDSA":[5828],"ERC1967Proxy":[2994],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBLSAccount":[16427],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"Proxy":[3364],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":15067,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":14916,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:78"},{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","file":"@openzeppelin/contracts/utils/Create2.sol","id":14917,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15067,"sourceUnit":5233,"src":"62:51:78","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","file":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","id":14918,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15067,"sourceUnit":2995,"src":"114:64:78","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../../interfaces/IEntryPoint.sol","id":14919,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15067,"sourceUnit":10808,"src":"180:42:78","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/bls/BLSAccount.sol","file":"./BLSAccount.sol","id":14920,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15067,"sourceUnit":14915,"src":"223:26:78","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"BLSAccountFactory","contractDependencies":[2994,14914],"contractKind":"contract","documentation":{"id":14921,"nodeType":"StructuredDocumentation","src":"293:183:78","text":" Based on SimpleAccountFactory.\n Cannot be a subclass since both constructor and createAccount depend on the\n constructor and initializer of the actual account contract."},"fullyImplemented":true,"id":15066,"linearizedBaseContracts":[15066],"name":"BLSAccountFactory","nameLocation":"486:17:78","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"11464fbe","id":14924,"mutability":"immutable","name":"accountImplementation","nameLocation":"538:21:78","nodeType":"VariableDeclaration","scope":15066,"src":"510:49:78","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"},"typeName":{"id":14923,"nodeType":"UserDefinedTypeName","pathNode":{"id":14922,"name":"BLSAccount","nodeType":"IdentifierPath","referencedDeclaration":14914,"src":"510:10:78"},"referencedDeclaration":14914,"src":"510:10:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"visibility":"public"},{"body":{"id":14941,"nodeType":"Block","src":"621:79:78","statements":[{"expression":{"id":14939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":14932,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14924,"src":"631:21:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":14936,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14927,"src":"670:10:78","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":14937,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14929,"src":"682:10:78","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},{"typeIdentifier":"t_address","typeString":"address"}],"id":14935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"655:14:78","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_contract$_IEntryPoint_$10807_$_t_address_$returns$_t_contract$_BLSAccount_$14914_$","typeString":"function (contract IEntryPoint,address) returns (contract BLSAccount)"},"typeName":{"id":14934,"nodeType":"UserDefinedTypeName","pathNode":{"id":14933,"name":"BLSAccount","nodeType":"IdentifierPath","referencedDeclaration":14914,"src":"659:10:78"},"referencedDeclaration":14914,"src":"659:10:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}}},"id":14938,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"655:38:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"src":"631:62:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"id":14940,"nodeType":"ExpressionStatement","src":"631:62:78"}]},"id":14942,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14930,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14927,"mutability":"mutable","name":"entryPoint","nameLocation":"590:10:78","nodeType":"VariableDeclaration","scope":14942,"src":"578:22:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":14926,"nodeType":"UserDefinedTypeName","pathNode":{"id":14925,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"578:11:78"},"referencedDeclaration":10807,"src":"578:11:78","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":14929,"mutability":"mutable","name":"aggregator","nameLocation":"610:10:78","nodeType":"VariableDeclaration","scope":14942,"src":"602:18:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14928,"name":"address","nodeType":"ElementaryTypeName","src":"602:7:78","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"577:44:78"},"returnParameters":{"id":14931,"nodeType":"ParameterList","parameters":[],"src":"621:0:78"},"scope":15066,"src":"566:134:78","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":15020,"nodeType":"Block","src":"1277:623:78","statements":[{"assignments":[14956],"declarations":[{"constant":false,"id":14956,"mutability":"mutable","name":"slot","nameLocation":"1395:4:78","nodeType":"VariableDeclaration","scope":15020,"src":"1390:9:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14955,"name":"uint","nodeType":"ElementaryTypeName","src":"1390:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14957,"nodeType":"VariableDeclarationStatement","src":"1390:9:78"},{"AST":{"nodeType":"YulBlock","src":"1418:20:78","statements":[{"nodeType":"YulAssignment","src":"1419:18:78","value":{"name":"aPublicKey","nodeType":"YulIdentifier","src":"1427:10:78"},"variableNames":[{"name":"slot","nodeType":"YulIdentifier","src":"1419:4:78"}]}]},"evmVersion":"london","externalReferences":[{"declaration":14949,"isOffset":false,"isSlot":false,"src":"1427:10:78","valueSize":1},{"declaration":14956,"isOffset":false,"isSlot":false,"src":"1419:4:78","valueSize":1}],"id":14958,"nodeType":"InlineAssembly","src":"1409:29:78"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14960,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14956,"src":"1455:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":14961,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1463:3:78","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"1463:8:78","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1463:15:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"313238","id":14964,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1481:3:78","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"1463:21:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1455:29:78","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"77726f6e67207075626b6579206f6666736574","id":14967,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1486:21:78","typeDescriptions":{"typeIdentifier":"t_stringliteral_d71ed9cb0762f140854c40f0de09e93ead56c0d0cc8feffde23605abb710553b","typeString":"literal_string \"wrong pubkey offset\""},"value":"wrong pubkey offset"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d71ed9cb0762f140854c40f0de09e93ead56c0d0cc8feffde23605abb710553b","typeString":"literal_string \"wrong pubkey offset\""}],"id":14959,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1447:7:78","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":14968,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1447:61:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14969,"nodeType":"ExpressionStatement","src":"1447:61:78"},{"assignments":[14971],"declarations":[{"constant":false,"id":14971,"mutability":"mutable","name":"addr","nameLocation":"1527:4:78","nodeType":"VariableDeclaration","scope":15020,"src":"1519:12:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14970,"name":"address","nodeType":"ElementaryTypeName","src":"1519:7:78","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14976,"initialValue":{"arguments":[{"id":14973,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14945,"src":"1545:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":14974,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14949,"src":"1551:10:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_calldata_ptr","typeString":"uint256[4] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$4_calldata_ptr","typeString":"uint256[4] calldata"}],"id":14972,"name":"getAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15065,"src":"1534:10:78","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_address_$","typeString":"function (uint256,uint256[4] memory) view returns (address)"}},"id":14975,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1534:28:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1519:43:78"},{"assignments":[14978],"declarations":[{"constant":false,"id":14978,"mutability":"mutable","name":"codeSize","nameLocation":"1577:8:78","nodeType":"VariableDeclaration","scope":15020,"src":"1572:13:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14977,"name":"uint","nodeType":"ElementaryTypeName","src":"1572:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14982,"initialValue":{"expression":{"expression":{"id":14979,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14971,"src":"1588:4:78","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"1588:9:78","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":14981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1588:16:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1572:32:78"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":14985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":14983,"name":"codeSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14978,"src":"1618:8:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":14984,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1629:1:78","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1618:12:78","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":14994,"nodeType":"IfStatement","src":"1614:75:78","trueBody":{"id":14993,"nodeType":"Block","src":"1632:57:78","statements":[{"expression":{"arguments":[{"arguments":[{"id":14989,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14971,"src":"1672:4:78","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":14988,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1664:8:78","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":14987,"name":"address","nodeType":"ElementaryTypeName","src":"1664:8:78","stateMutability":"payable","typeDescriptions":{}}},"id":14990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1664:13:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":14986,"name":"BLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14914,"src":"1653:10:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSAccount_$14914_$","typeString":"type(contract BLSAccount)"}},"id":14991,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1653:25:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"functionReturnParameters":14954,"id":14992,"nodeType":"Return","src":"1646:32:78"}]}},{"expression":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"id":15008,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14924,"src":"1788:21:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}],"id":15007,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1780:7:78","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15006,"name":"address","nodeType":"ElementaryTypeName","src":"1780:7:78","typeDescriptions":{}}},"id":15009,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1780:30:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":15012,"name":"BLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14914,"src":"1843:10:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSAccount_$14914_$","typeString":"type(contract BLSAccount)"}},"id":15013,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":14812,"src":"1843:21:78","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BLSAccount.initialize(uint256[4] memory)"}},{"id":15014,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14949,"src":"1866:10:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_calldata_ptr","typeString":"uint256[4] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BLSAccount.initialize(uint256[4] memory)"},{"typeIdentifier":"t_array$_t_uint256_$4_calldata_ptr","typeString":"uint256[4] calldata"}],"expression":{"id":15010,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1828:3:78","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15011,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1828:14:78","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":15015,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1828:49:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":15000,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"1724:16:78","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"},"typeName":{"id":14999,"nodeType":"UserDefinedTypeName","pathNode":{"id":14998,"name":"ERC1967Proxy","nodeType":"IdentifierPath","referencedDeclaration":2994,"src":"1728:12:78"},"referencedDeclaration":2994,"src":"1728:12:78","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}},"id":15005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"id":15003,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14945,"src":"1756:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15002,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1748:7:78","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":15001,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1748:7:78","typeDescriptions":{}}},"id":15004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1748:13:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"1724:38:78","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$salt","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"}},"id":15016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1724:167:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}],"id":14997,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1716:8:78","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":14996,"name":"address","nodeType":"ElementaryTypeName","src":"1716:8:78","stateMutability":"payable","typeDescriptions":{}}},"id":15017,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1716:176:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":14995,"name":"BLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14914,"src":"1705:10:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSAccount_$14914_$","typeString":"type(contract BLSAccount)"}},"id":15018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1705:188:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"functionReturnParameters":14954,"id":15019,"nodeType":"Return","src":"1698:195:78"}]},"documentation":{"id":14943,"nodeType":"StructuredDocumentation","src":"706:469:78","text":" create an account, and return its address.\n returns the address even if the account is already deployed.\n Note that during UserOperation execution, this method is called only if the account is not deployed.\n This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n Also note that our BLSSignatureAggregator requires that the public key is the last parameter"},"functionSelector":"19c2a1b2","id":15021,"implemented":true,"kind":"function","modifiers":[],"name":"createAccount","nameLocation":"1189:13:78","nodeType":"FunctionDefinition","parameters":{"id":14950,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14945,"mutability":"mutable","name":"salt","nameLocation":"1211:4:78","nodeType":"VariableDeclaration","scope":15021,"src":"1203:12:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14944,"name":"uint256","nodeType":"ElementaryTypeName","src":"1203:7:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":14949,"mutability":"mutable","name":"aPublicKey","nameLocation":"1237:10:78","nodeType":"VariableDeclaration","scope":15021,"src":"1217:30:78","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_calldata_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":14946,"name":"uint256","nodeType":"ElementaryTypeName","src":"1217:7:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14948,"length":{"hexValue":"34","id":14947,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1225:1:78","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1217:10:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1202:46:78"},"returnParameters":{"id":14954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14953,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15021,"src":"1265:10:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"},"typeName":{"id":14952,"nodeType":"UserDefinedTypeName","pathNode":{"id":14951,"name":"BLSAccount","nodeType":"IdentifierPath","referencedDeclaration":14914,"src":"1265:10:78"},"referencedDeclaration":14914,"src":"1265:10:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}},"visibility":"internal"}],"src":"1264:12:78"},"scope":15066,"src":"1180:720:78","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":15064,"nodeType":"Block","src":"2119:324:78","statements":[{"expression":{"arguments":[{"arguments":[{"id":15037,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15024,"src":"2167:4:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15036,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2159:7:78","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":15035,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2159:7:78","typeDescriptions":{}}},"id":15038,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2159:13:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"expression":{"arguments":[{"id":15043,"name":"ERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2994,"src":"2223:12:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}],"id":15042,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2218:4:78","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":15044,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2218:18:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC1967Proxy_$2994","typeString":"type(contract ERC1967Proxy)"}},"id":15045,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"2218:31:78","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":15050,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14924,"src":"2307:21:78","typeDescriptions":{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BLSAccount_$14914","typeString":"contract BLSAccount"}],"id":15049,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2299:7:78","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15048,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:78","typeDescriptions":{}}},"id":15051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2299:30:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":15054,"name":"BLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14914,"src":"2366:10:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSAccount_$14914_$","typeString":"type(contract BLSAccount)"}},"id":15055,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":14812,"src":"2366:21:78","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BLSAccount.initialize(uint256[4] memory)"}},{"components":[{"id":15056,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15028,"src":"2390:10:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"id":15057,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2389:12:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BLSAccount.initialize(uint256[4] memory)"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"expression":{"id":15052,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2351:3:78","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15053,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"2351:14:78","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":15058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2351:51:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":15046,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2267:3:78","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15047,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"2267:10:78","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":15059,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2267:153:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":15040,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2184:3:78","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15041,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"2184:16:78","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":15060,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2184:250:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":15039,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2174:9:78","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":15061,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2174:261:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":15033,"name":"Create2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5232,"src":"2136:7:78","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Create2_$5232_$","typeString":"type(library Create2)"}},"id":15034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"computeAddress","nodeType":"MemberAccess","referencedDeclaration":5217,"src":"2136:22:78","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,bytes32) view returns (address)"}},"id":15062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2136:300:78","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":15032,"id":15063,"nodeType":"Return","src":"2129:307:78"}]},"documentation":{"id":15022,"nodeType":"StructuredDocumentation","src":"1906:114:78","text":" calculate the counterfactual address of this account as it would be returned by createAccount()"},"functionSelector":"de3398dd","id":15065,"implemented":true,"kind":"function","modifiers":[],"name":"getAddress","nameLocation":"2034:10:78","nodeType":"FunctionDefinition","parameters":{"id":15029,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15024,"mutability":"mutable","name":"salt","nameLocation":"2053:4:78","nodeType":"VariableDeclaration","scope":15065,"src":"2045:12:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15023,"name":"uint256","nodeType":"ElementaryTypeName","src":"2045:7:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15028,"mutability":"mutable","name":"aPublicKey","nameLocation":"2077:10:78","nodeType":"VariableDeclaration","scope":15065,"src":"2059:28:78","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":15025,"name":"uint256","nodeType":"ElementaryTypeName","src":"2059:7:78","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15027,"length":{"hexValue":"34","id":15026,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2067:1:78","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2059:10:78","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"2044:44:78"},"returnParameters":{"id":15032,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15031,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15065,"src":"2110:7:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15030,"name":"address","nodeType":"ElementaryTypeName","src":"2110:7:78","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2109:9:78"},"scope":15066,"src":"2025:418:78","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":15067,"src":"477:1968:78","usedErrors":[]}],"src":"36:2410:78"},"id":78},"contracts/samples/bls/BLSHelper.sol":{"ast":{"absolutePath":"contracts/samples/bls/BLSHelper.sol","exportedSymbols":{"BLSHelper":[15864]},"id":15865,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":15068,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:79"},{"abstract":false,"baseContracts":[],"canonicalName":"BLSHelper","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":15864,"linearizedBaseContracts":[15864],"name":"BLSHelper","nameLocation":"254:9:79","nodeType":"ContractDefinition","nodes":[{"canonicalName":"BLSHelper.XY","id":15073,"members":[{"constant":false,"id":15070,"mutability":"mutable","name":"x","nameLocation":"296:1:79","nodeType":"VariableDeclaration","scope":15073,"src":"291:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15069,"name":"uint","nodeType":"ElementaryTypeName","src":"291:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15072,"mutability":"mutable","name":"y","nameLocation":"312:1:79","nodeType":"VariableDeclaration","scope":15073,"src":"307:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15071,"name":"uint","nodeType":"ElementaryTypeName","src":"307:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"XY","nameLocation":"278:2:79","nodeType":"StructDefinition","scope":15864,"src":"271:49:79","visibility":"public"},{"body":{"id":15161,"nodeType":"Block","src":"691:303:79","statements":[{"assignments":[15087],"declarations":[{"constant":false,"id":15087,"mutability":"mutable","name":"x","nameLocation":"706:1:79","nodeType":"VariableDeclaration","scope":15161,"src":"701:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15086,"name":"uint","nodeType":"ElementaryTypeName","src":"701:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15092,"initialValue":{"expression":{"baseExpression":{"id":15088,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15078,"src":"710:6:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":15090,"indexExpression":{"hexValue":"30","id":15089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"717:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"710:9:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15091,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"x","nodeType":"MemberAccess","referencedDeclaration":15070,"src":"710:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"701:20:79"},{"assignments":[15094],"declarations":[{"constant":false,"id":15094,"mutability":"mutable","name":"y","nameLocation":"736:1:79","nodeType":"VariableDeclaration","scope":15161,"src":"731:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15093,"name":"uint","nodeType":"ElementaryTypeName","src":"731:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15099,"initialValue":{"expression":{"baseExpression":{"id":15095,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15078,"src":"740:6:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":15097,"indexExpression":{"hexValue":"30","id":15096,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"747:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"740:9:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15098,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"y","nodeType":"MemberAccess","referencedDeclaration":15072,"src":"740:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"731:20:79"},{"assignments":[15101],"declarations":[{"constant":false,"id":15101,"mutability":"mutable","name":"z","nameLocation":"766:1:79","nodeType":"VariableDeclaration","scope":15161,"src":"761:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15100,"name":"uint","nodeType":"ElementaryTypeName","src":"761:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15103,"initialValue":{"hexValue":"31","id":15102,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"770:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"761:10:79"},{"body":{"id":15136,"nodeType":"Block","src":"823:86:79","statements":[{"expression":{"id":15134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15115,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15087,"src":"838:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15116,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15094,"src":"841:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15117,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15101,"src":"844:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15118,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"837:9:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15120,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15087,"src":"856:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15121,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15094,"src":"859:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15122,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15101,"src":"862:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"baseExpression":{"id":15123,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15078,"src":"865:6:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":15125,"indexExpression":{"id":15124,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15105,"src":"872:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"865:9:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15126,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"x","nodeType":"MemberAccess","referencedDeclaration":15070,"src":"865:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"baseExpression":{"id":15127,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15078,"src":"878:6:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":15129,"indexExpression":{"id":15128,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15105,"src":"885:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"878:9:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15130,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"y","nodeType":"MemberAccess","referencedDeclaration":15072,"src":"878:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":15131,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"891:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":15132,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15080,"src":"894:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15119,"name":"jacAdd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15485,"src":"849:6:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256,uint256,uint256,uint256,uint256,uint256) pure returns (uint256,uint256,uint256)"}},"id":15133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"849:49:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"src":"837:61:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15135,"nodeType":"ExpressionStatement","src":"837:61:79"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15111,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15108,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15105,"src":"799:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":15109,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15078,"src":"803:6:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":15110,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"803:13:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"799:17:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15137,"initializationExpression":{"assignments":[15105],"declarations":[{"constant":false,"id":15105,"mutability":"mutable","name":"i","nameLocation":"792:1:79","nodeType":"VariableDeclaration","scope":15137,"src":"787:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15104,"name":"uint","nodeType":"ElementaryTypeName","src":"787:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15107,"initialValue":{"hexValue":"31","id":15106,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"796:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"787:10:79"},"loopExpression":{"expression":{"id":15113,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"818:3:79","subExpression":{"id":15112,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15105,"src":"818:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15114,"nodeType":"ExpressionStatement","src":"818:3:79"},"nodeType":"ForStatement","src":"782:127:79"},{"expression":{"id":15147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15138,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15087,"src":"919:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15139,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15094,"src":"922:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15140,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"918:6:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15142,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15087,"src":"936:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15143,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15094,"src":"939:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15144,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15101,"src":"942:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15145,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15080,"src":"945:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15141,"name":"toAffine","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15541,"src":"927:8:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256,uint256,uint256) pure returns (uint256,uint256)"}},"id":15146,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"927:22:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"918:31:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15148,"nodeType":"ExpressionStatement","src":"918:31:79"},{"expression":{"id":15153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":15149,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15084,"src":"959:3:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15151,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"x","nodeType":"MemberAccess","referencedDeclaration":15070,"src":"959:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":15152,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15087,"src":"967:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"959:9:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15154,"nodeType":"ExpressionStatement","src":"959:9:79"},{"expression":{"id":15159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":15155,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15084,"src":"978:3:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":15157,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"y","nodeType":"MemberAccess","referencedDeclaration":15072,"src":"978:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":15158,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15094,"src":"986:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"978:9:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15160,"nodeType":"ExpressionStatement","src":"978:9:79"}]},"documentation":{"id":15074,"nodeType":"StructuredDocumentation","src":"325:278:79","text":" sum all the points in the array\n NOTE: the \"ecAdd\" (below) has a special case where x1==y2.\n @param points an array of bytes32[2], representing an (x,y) of a point\n @param _pp the modulus of the curve\n @return ret the sum of all points"},"id":15162,"implemented":true,"kind":"function","modifiers":[],"name":"sum","nameLocation":"617:3:79","nodeType":"FunctionDefinition","parameters":{"id":15081,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15078,"mutability":"mutable","name":"points","nameLocation":"633:6:79","nodeType":"VariableDeclaration","scope":15162,"src":"621:18:79","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY[]"},"typeName":{"baseType":{"id":15076,"nodeType":"UserDefinedTypeName","pathNode":{"id":15075,"name":"XY","nodeType":"IdentifierPath","referencedDeclaration":15073,"src":"621:2:79"},"referencedDeclaration":15073,"src":"621:2:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_storage_ptr","typeString":"struct BLSHelper.XY"}},"id":15077,"nodeType":"ArrayTypeName","src":"621:4:79","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_storage_$dyn_storage_ptr","typeString":"struct BLSHelper.XY[]"}},"visibility":"internal"},{"constant":false,"id":15080,"mutability":"mutable","name":"_pp","nameLocation":"649:3:79","nodeType":"VariableDeclaration","scope":15162,"src":"641:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15079,"name":"uint256","nodeType":"ElementaryTypeName","src":"641:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"620:33:79"},"returnParameters":{"id":15085,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15084,"mutability":"mutable","name":"ret","nameLocation":"687:3:79","nodeType":"VariableDeclaration","scope":15162,"src":"677:13:79","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY"},"typeName":{"id":15083,"nodeType":"UserDefinedTypeName","pathNode":{"id":15082,"name":"XY","nodeType":"IdentifierPath","referencedDeclaration":15073,"src":"677:2:79"},"referencedDeclaration":15073,"src":"677:2:79","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_storage_ptr","typeString":"struct BLSHelper.XY"}},"visibility":"internal"}],"src":"676:15:79"},"scope":15864,"src":"608:386:79","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":15484,"nodeType":"Block","src":"1604:1628:79","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":15192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15188,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15186,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15165,"src":"1618:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15187,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1625:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1618:8:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15189,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15167,"src":"1630:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1637:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1630:8:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1618:20:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15198,"nodeType":"IfStatement","src":"1614:60:79","trueBody":{"expression":{"components":[{"id":15193,"name":"_x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15171,"src":"1660:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15194,"name":"_y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15173,"src":"1665:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15195,"name":"_z2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15175,"src":"1670:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15196,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1659:15:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"functionReturnParameters":15185,"id":15197,"nodeType":"Return","src":"1652:22:79"}},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":15205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15201,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15199,"name":"_x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15171,"src":"1688:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15200,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1695:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1688:8:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15202,"name":"_y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15173,"src":"1700:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1707:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1700:8:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1688:20:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15211,"nodeType":"IfStatement","src":"1684:60:79","trueBody":{"expression":{"components":[{"id":15206,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15165,"src":"1730:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15207,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15167,"src":"1735:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15208,"name":"_z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15169,"src":"1740:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15209,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1729:15:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"functionReturnParameters":15185,"id":15210,"nodeType":"Return","src":"1722:22:79"}},{"assignments":[15217],"declarations":[{"constant":false,"id":15217,"mutability":"mutable","name":"zs","nameLocation":"1907:2:79","nodeType":"VariableDeclaration","scope":15484,"src":"1892:17:79","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":15215,"name":"uint","nodeType":"ElementaryTypeName","src":"1892:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15216,"length":{"hexValue":"34","id":15214,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1897:1:79","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1892:7:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":15218,"nodeType":"VariableDeclarationStatement","src":"1892:17:79"},{"expression":{"id":15227,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15219,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"1953:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15221,"indexExpression":{"hexValue":"30","id":15220,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1956:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1953:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15223,"name":"_z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15169,"src":"1968:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15224,"name":"_z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15169,"src":"1973:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15225,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"1978:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15222,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"1961:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15226,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1961:21:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1953:29:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15228,"nodeType":"ExpressionStatement","src":"1953:29:79"},{"expression":{"id":15239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15229,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"1992:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15231,"indexExpression":{"hexValue":"31","id":15230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1995:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1992:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15233,"name":"_z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15169,"src":"2007:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15234,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2012:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15236,"indexExpression":{"hexValue":"30","id":15235,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2015:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2012:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15237,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2019:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15232,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2000:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15238,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2000:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1992:31:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15240,"nodeType":"ExpressionStatement","src":"1992:31:79"},{"expression":{"id":15249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15241,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2033:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15243,"indexExpression":{"hexValue":"32","id":15242,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2036:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2033:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15245,"name":"_z2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15175,"src":"2048:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15246,"name":"_z2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15175,"src":"2053:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15247,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2058:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15244,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2041:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15248,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2041:21:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2033:29:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15250,"nodeType":"ExpressionStatement","src":"2033:29:79"},{"expression":{"id":15261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15251,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2072:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15253,"indexExpression":{"hexValue":"33","id":15252,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2075:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2072:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15255,"name":"_z2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15175,"src":"2087:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15256,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2092:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15258,"indexExpression":{"hexValue":"32","id":15257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2095:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2092:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15259,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2099:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15254,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2080:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2080:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2072:31:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15262,"nodeType":"ExpressionStatement","src":"2072:31:79"},{"expression":{"id":15293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15263,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2140:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"arguments":[{"id":15265,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15165,"src":"2162:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15266,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2167:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15268,"indexExpression":{"hexValue":"32","id":15267,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2170:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2167:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15269,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2174:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15264,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2155:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15270,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2155:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15272,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15167,"src":"2195:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15273,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2200:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15275,"indexExpression":{"hexValue":"33","id":15274,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2203:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2200:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15276,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2207:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15271,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2188:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15277,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2188:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15279,"name":"_x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15171,"src":"2228:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15280,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2233:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15282,"indexExpression":{"hexValue":"30","id":15281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2236:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2233:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15283,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2240:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15278,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2221:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15284,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2221:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15286,"name":"_y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15173,"src":"2261:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15287,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2266:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15289,"indexExpression":{"hexValue":"31","id":15288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2269:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2266:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15290,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2273:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15285,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2254:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15291,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2254:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15292,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2145:142:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"src":"2140:147:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15294,"nodeType":"ExpressionStatement","src":"2140:147:79"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":15310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":15296,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2393:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15298,"indexExpression":{"hexValue":"30","id":15297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2396:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2393:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"id":15299,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2402:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15301,"indexExpression":{"hexValue":"32","id":15300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2405:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2402:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2393:14:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":15303,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2411:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15305,"indexExpression":{"hexValue":"31","id":15304,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2414:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2411:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"id":15306,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2420:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15308,"indexExpression":{"hexValue":"33","id":15307,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2423:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2420:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2411:14:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2393:32:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"557365206a6163446f75626c652066756e6374696f6e20696e7374656164","id":15311,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2427:32:79","typeDescriptions":{"typeIdentifier":"t_stringliteral_5fdf44d35b202e4b4a5d1b6167961ee48e84a906ae5e709d7bddb824c86220a6","typeString":"literal_string \"Use jacDouble function instead\""},"value":"Use jacDouble function instead"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5fdf44d35b202e4b4a5d1b6167961ee48e84a906ae5e709d7bddb824c86220a6","typeString":"literal_string \"Use jacDouble function instead\""}],"id":15295,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2385:7:79","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":15312,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2385:75:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15313,"nodeType":"ExpressionStatement","src":"2385:75:79"},{"assignments":[15319],"declarations":[{"constant":false,"id":15319,"mutability":"mutable","name":"hr","nameLocation":"2486:2:79","nodeType":"VariableDeclaration","scope":15484,"src":"2471:17:79","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":15317,"name":"uint","nodeType":"ElementaryTypeName","src":"2471:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15318,"length":{"hexValue":"34","id":15316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2476:1:79","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2471:7:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":15320,"nodeType":"VariableDeclarationStatement","src":"2471:17:79"},{"expression":{"id":15335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15321,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2510:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15323,"indexExpression":{"hexValue":"30","id":15322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2513:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2510:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":15325,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2525:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15327,"indexExpression":{"hexValue":"32","id":15326,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2528:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2525:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15328,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2532:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"baseExpression":{"id":15329,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2538:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15331,"indexExpression":{"hexValue":"30","id":15330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2541:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2538:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2532:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15333,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2545:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15324,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"2518:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2518:31:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2510:39:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15336,"nodeType":"ExpressionStatement","src":"2510:39:79"},{"expression":{"id":15351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15337,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2571:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15339,"indexExpression":{"hexValue":"31","id":15338,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2574:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2571:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":15341,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2586:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15343,"indexExpression":{"hexValue":"33","id":15342,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2589:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2586:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15348,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15344,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2593:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"baseExpression":{"id":15345,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2599:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15347,"indexExpression":{"hexValue":"31","id":15346,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2602:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2599:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2593:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15349,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2606:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15340,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"2579:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2579:31:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2571:39:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15352,"nodeType":"ExpressionStatement","src":"2571:39:79"},{"expression":{"id":15365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15353,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2634:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15355,"indexExpression":{"hexValue":"32","id":15354,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2637:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2634:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":15357,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2649:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15359,"indexExpression":{"hexValue":"30","id":15358,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2652:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2649:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15360,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2656:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15362,"indexExpression":{"hexValue":"30","id":15361,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2659:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2656:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15363,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2663:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15356,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2642:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15364,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2642:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2634:33:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15366,"nodeType":"ExpressionStatement","src":"2634:33:79"},{"expression":{"id":15379,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":15367,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2692:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15369,"indexExpression":{"hexValue":"33","id":15368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2695:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2692:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":15371,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2707:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15373,"indexExpression":{"hexValue":"32","id":15372,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2710:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2707:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15374,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2714:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15376,"indexExpression":{"hexValue":"30","id":15375,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2717:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2714:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15377,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2721:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15370,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2700:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2700:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2692:33:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15380,"nodeType":"ExpressionStatement","src":"2692:33:79"},{"assignments":[15382],"declarations":[{"constant":false,"id":15382,"mutability":"mutable","name":"qx","nameLocation":"2777:2:79","nodeType":"VariableDeclaration","scope":15484,"src":"2769:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15381,"name":"uint256","nodeType":"ElementaryTypeName","src":"2769:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15400,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"id":15385,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2796:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15387,"indexExpression":{"hexValue":"31","id":15386,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2799:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2796:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15388,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2803:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15390,"indexExpression":{"hexValue":"31","id":15389,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2806:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2803:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15391,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2810:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15384,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2789:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2789:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15393,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2816:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"baseExpression":{"id":15394,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2822:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15396,"indexExpression":{"hexValue":"33","id":15395,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2825:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2822:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2816:11:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15398,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2829:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15383,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"2782:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15399,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2782:51:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2769:64:79"},{"expression":{"id":15421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15401,"name":"qx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15382,"src":"2843:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15403,"name":"qx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15382,"src":"2855:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15404,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2859:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"hexValue":"32","id":15406,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2872:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},{"arguments":[{"baseExpression":{"id":15408,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"2882:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15410,"indexExpression":{"hexValue":"30","id":15409,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2885:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2882:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15411,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2889:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15413,"indexExpression":{"hexValue":"32","id":15412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2892:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2889:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15414,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2896:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15407,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2875:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15415,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2875:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15416,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2902:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15405,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2865:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2865:41:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2859:47:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15419,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"2908:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15402,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"2848:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15420,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2848:64:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2843:69:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15422,"nodeType":"ExpressionStatement","src":"2843:69:79"},{"assignments":[15424],"declarations":[{"constant":false,"id":15424,"mutability":"mutable","name":"qy","nameLocation":"2972:2:79","nodeType":"VariableDeclaration","scope":15484,"src":"2964:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15423,"name":"uint256","nodeType":"ElementaryTypeName","src":"2964:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15446,"initialValue":{"arguments":[{"baseExpression":{"id":15426,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"2984:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15428,"indexExpression":{"hexValue":"31","id":15427,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2987:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2984:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"arguments":[{"baseExpression":{"id":15431,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"3005:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15433,"indexExpression":{"hexValue":"30","id":15432,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3008:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3005:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15434,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"3012:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15436,"indexExpression":{"hexValue":"32","id":15435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3015:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3012:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15437,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3019:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15430,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2998:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2998:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15439,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3025:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":15440,"name":"qx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15382,"src":"3031:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3025:8:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15442,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3035:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15429,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"2991:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2991:48:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15444,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3041:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15425,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"2977:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15445,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2977:68:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2964:81:79"},{"expression":{"id":15463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15447,"name":"qy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15424,"src":"3055:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15449,"name":"qy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15424,"src":"3067:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15450,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3071:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"baseExpression":{"id":15452,"name":"zs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15217,"src":"3084:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15454,"indexExpression":{"hexValue":"31","id":15453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3087:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3084:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":15455,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"3091:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15457,"indexExpression":{"hexValue":"33","id":15456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3094:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3091:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15458,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3098:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15451,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3077:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15459,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3077:25:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3071:31:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15461,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3104:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15448,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"3060:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15462,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3060:48:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3055:53:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15464,"nodeType":"ExpressionStatement","src":"3055:53:79"},{"assignments":[15466],"declarations":[{"constant":false,"id":15466,"mutability":"mutable","name":"qz","nameLocation":"3150:2:79","nodeType":"VariableDeclaration","scope":15484,"src":"3142:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15465,"name":"uint256","nodeType":"ElementaryTypeName","src":"3142:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15478,"initialValue":{"arguments":[{"baseExpression":{"id":15468,"name":"hr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15319,"src":"3162:2:79","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15470,"indexExpression":{"hexValue":"30","id":15469,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3165:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3162:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15472,"name":"_z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15169,"src":"3176:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15473,"name":"_z2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15175,"src":"3181:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15474,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3186:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15471,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3169:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3169:21:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15476,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15177,"src":"3192:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15467,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3155:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15477,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3155:41:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3142:54:79"},{"expression":{"components":[{"id":15479,"name":"qx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15382,"src":"3214:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15480,"name":"qy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15424,"src":"3218:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15481,"name":"qz","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15466,"src":"3222:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15482,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3213:12:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"functionReturnParameters":15185,"id":15483,"nodeType":"Return","src":"3206:19:79"}]},"documentation":{"id":15163,"nodeType":"StructuredDocumentation","src":"1000:377:79","text":"@dev Adds two points (x1, y1, z1) and (x2, y2, z2).\n @param _x1 coordinate x of P1\n @param _y1 coordinate y of P1\n @param _z1 coordinate z of P1\n @param _x2 coordinate x of square\n @param _y2 coordinate y of square\n @param _z2 coordinate z of square\n @param _pp the modulus\n @return (qx, qy, qz) P1+square in Jacobian"},"id":15485,"implemented":true,"kind":"function","modifiers":[],"name":"jacAdd","nameLocation":"1391:6:79","nodeType":"FunctionDefinition","parameters":{"id":15178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15165,"mutability":"mutable","name":"_x1","nameLocation":"1415:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1407:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15164,"name":"uint256","nodeType":"ElementaryTypeName","src":"1407:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15167,"mutability":"mutable","name":"_y1","nameLocation":"1436:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1428:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15166,"name":"uint256","nodeType":"ElementaryTypeName","src":"1428:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15169,"mutability":"mutable","name":"_z1","nameLocation":"1457:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1449:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15168,"name":"uint256","nodeType":"ElementaryTypeName","src":"1449:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15171,"mutability":"mutable","name":"_x2","nameLocation":"1478:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1470:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15170,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15173,"mutability":"mutable","name":"_y2","nameLocation":"1499:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1491:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15172,"name":"uint256","nodeType":"ElementaryTypeName","src":"1491:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15175,"mutability":"mutable","name":"_z2","nameLocation":"1520:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1512:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15174,"name":"uint256","nodeType":"ElementaryTypeName","src":"1512:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15177,"mutability":"mutable","name":"_pp","nameLocation":"1541:3:79","nodeType":"VariableDeclaration","scope":15485,"src":"1533:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15176,"name":"uint256","nodeType":"ElementaryTypeName","src":"1533:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1397:148:79"},"returnParameters":{"id":15185,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15180,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15485,"src":"1573:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15179,"name":"uint256","nodeType":"ElementaryTypeName","src":"1573:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15182,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15485,"src":"1582:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15181,"name":"uint256","nodeType":"ElementaryTypeName","src":"1582:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15184,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15485,"src":"1591:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15183,"name":"uint256","nodeType":"ElementaryTypeName","src":"1591:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1572:27:79"},"scope":15864,"src":"1382:1850:79","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":15540,"nodeType":"Block","src":"3665:231:79","statements":[{"assignments":[15502],"declarations":[{"constant":false,"id":15502,"mutability":"mutable","name":"zInv","nameLocation":"3683:4:79","nodeType":"VariableDeclaration","scope":15540,"src":"3675:12:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15501,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15507,"initialValue":{"arguments":[{"id":15504,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15492,"src":"3697:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15505,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15494,"src":"3701:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15503,"name":"invMod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15626,"src":"3690:6:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":15506,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3690:15:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3675:30:79"},{"assignments":[15509],"declarations":[{"constant":false,"id":15509,"mutability":"mutable","name":"zInv2","nameLocation":"3723:5:79","nodeType":"VariableDeclaration","scope":15540,"src":"3715:13:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15508,"name":"uint256","nodeType":"ElementaryTypeName","src":"3715:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15515,"initialValue":{"arguments":[{"id":15511,"name":"zInv","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15502,"src":"3738:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15512,"name":"zInv","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15502,"src":"3744:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15513,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15494,"src":"3750:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15510,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3731:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15514,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3731:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3715:39:79"},{"assignments":[15517],"declarations":[{"constant":false,"id":15517,"mutability":"mutable","name":"x2","nameLocation":"3772:2:79","nodeType":"VariableDeclaration","scope":15540,"src":"3764:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15516,"name":"uint256","nodeType":"ElementaryTypeName","src":"3764:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15523,"initialValue":{"arguments":[{"id":15519,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15488,"src":"3784:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15520,"name":"zInv2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15509,"src":"3788:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15521,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15494,"src":"3795:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15518,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3777:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3777:22:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3764:35:79"},{"assignments":[15525],"declarations":[{"constant":false,"id":15525,"mutability":"mutable","name":"y2","nameLocation":"3817:2:79","nodeType":"VariableDeclaration","scope":15540,"src":"3809:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15524,"name":"uint256","nodeType":"ElementaryTypeName","src":"3809:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15535,"initialValue":{"arguments":[{"id":15527,"name":"_y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15490,"src":"3829:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15529,"name":"zInv","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15502,"src":"3840:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15530,"name":"zInv2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15509,"src":"3846:5:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15531,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15494,"src":"3853:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15528,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3833:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15532,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3833:24:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15533,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15494,"src":"3859:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15526,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"3822:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3822:41:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3809:54:79"},{"expression":{"components":[{"id":15536,"name":"x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15517,"src":"3882:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15537,"name":"y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15525,"src":"3886:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15538,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3881:8:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"functionReturnParameters":15500,"id":15539,"nodeType":"Return","src":"3874:15:79"}]},"documentation":{"id":15486,"nodeType":"StructuredDocumentation","src":"3239:272:79","text":"@dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\n @param _x coordinate x\n @param _y coordinate y\n @param _z coordinate z\n @param _pp the modulus\n @return (x', y') affine coordinates"},"id":15541,"implemented":true,"kind":"function","modifiers":[],"name":"toAffine","nameLocation":"3525:8:79","nodeType":"FunctionDefinition","parameters":{"id":15495,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15488,"mutability":"mutable","name":"_x","nameLocation":"3551:2:79","nodeType":"VariableDeclaration","scope":15541,"src":"3543:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15487,"name":"uint256","nodeType":"ElementaryTypeName","src":"3543:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15490,"mutability":"mutable","name":"_y","nameLocation":"3571:2:79","nodeType":"VariableDeclaration","scope":15541,"src":"3563:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15489,"name":"uint256","nodeType":"ElementaryTypeName","src":"3563:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15492,"mutability":"mutable","name":"_z","nameLocation":"3591:2:79","nodeType":"VariableDeclaration","scope":15541,"src":"3583:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15491,"name":"uint256","nodeType":"ElementaryTypeName","src":"3583:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15494,"mutability":"mutable","name":"_pp","nameLocation":"3611:3:79","nodeType":"VariableDeclaration","scope":15541,"src":"3603:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15493,"name":"uint256","nodeType":"ElementaryTypeName","src":"3603:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3533:82:79"},"returnParameters":{"id":15500,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15497,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15541,"src":"3643:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15496,"name":"uint256","nodeType":"ElementaryTypeName","src":"3643:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15499,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15541,"src":"3652:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15498,"name":"uint256","nodeType":"ElementaryTypeName","src":"3652:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3642:18:79"},"scope":15864,"src":"3516:380:79","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":15625,"nodeType":"Block","src":"4142:366:79","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":15562,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":15558,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15552,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4160:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":15553,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4166:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4160:7:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15555,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4171:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":15556,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4177:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4171:9:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4160:20:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15561,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15559,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4184:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":15560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4191:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4184:8:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4160:32:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e76616c6964206e756d626572","id":15563,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4194:16:79","typeDescriptions":{"typeIdentifier":"t_stringliteral_f10345bf174b7296e0343b593f8b22d6d65d2b16a2522b6b74d9848a96db003a","typeString":"literal_string \"Invalid number\""},"value":"Invalid number"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f10345bf174b7296e0343b593f8b22d6d65d2b16a2522b6b74d9848a96db003a","typeString":"literal_string \"Invalid number\""}],"id":15551,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4152:7:79","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":15564,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4152:59:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15565,"nodeType":"ExpressionStatement","src":"4152:59:79"},{"assignments":[15567],"declarations":[{"constant":false,"id":15567,"mutability":"mutable","name":"q","nameLocation":"4229:1:79","nodeType":"VariableDeclaration","scope":15625,"src":"4221:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15566,"name":"uint256","nodeType":"ElementaryTypeName","src":"4221:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15569,"initialValue":{"hexValue":"30","id":15568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4233:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4221:13:79"},{"assignments":[15571],"declarations":[{"constant":false,"id":15571,"mutability":"mutable","name":"newT","nameLocation":"4252:4:79","nodeType":"VariableDeclaration","scope":15625,"src":"4244:12:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15570,"name":"uint256","nodeType":"ElementaryTypeName","src":"4244:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15573,"initialValue":{"hexValue":"31","id":15572,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4259:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"4244:16:79"},{"assignments":[15575],"declarations":[{"constant":false,"id":15575,"mutability":"mutable","name":"r","nameLocation":"4278:1:79","nodeType":"VariableDeclaration","scope":15625,"src":"4270:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15574,"name":"uint256","nodeType":"ElementaryTypeName","src":"4270:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15577,"initialValue":{"id":15576,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4282:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4270:15:79"},{"assignments":[15579],"declarations":[{"constant":false,"id":15579,"mutability":"mutable","name":"t","nameLocation":"4303:1:79","nodeType":"VariableDeclaration","scope":15625,"src":"4295:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15578,"name":"uint256","nodeType":"ElementaryTypeName","src":"4295:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15580,"nodeType":"VariableDeclarationStatement","src":"4295:9:79"},{"body":{"id":15621,"nodeType":"Block","src":"4330:153:79","statements":[{"expression":{"id":15588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15584,"name":"t","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15579,"src":"4344:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15585,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15575,"src":"4348:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":15586,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4352:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4348:6:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4344:10:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15589,"nodeType":"ExpressionStatement","src":"4344:10:79"},{"expression":{"id":15607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15590,"name":"q","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15567,"src":"4369:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15591,"name":"newT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15571,"src":"4372:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15592,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"4368:9:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"id":15593,"name":"newT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15571,"src":"4381:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15595,"name":"q","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15567,"src":"4394:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15596,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4398:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"id":15598,"name":"t","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15579,"src":"4411:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15599,"name":"newT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15571,"src":"4414:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15600,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4420:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15597,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"4404:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15601,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4404:20:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4398:26:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15603,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4397:28:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15604,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"4427:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15594,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"4387:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4387:44:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15606,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4380:52:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"4368:64:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15608,"nodeType":"ExpressionStatement","src":"4368:64:79"},{"expression":{"id":15619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15609,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15575,"src":"4447:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15610,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4450:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15611,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"4446:7:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"id":15612,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4457:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15613,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15575,"src":"4461:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15614,"name":"t","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15579,"src":"4465:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":15615,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4469:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4465:6:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4461:10:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15618,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4456:16:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"4446:26:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15620,"nodeType":"ExpressionStatement","src":"4446:26:79"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15581,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15544,"src":"4321:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":15582,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4327:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4321:7:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15622,"nodeType":"WhileStatement","src":"4314:169:79"},{"expression":{"id":15623,"name":"q","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15567,"src":"4500:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":15550,"id":15624,"nodeType":"Return","src":"4493:8:79"}]},"documentation":{"id":15542,"nodeType":"StructuredDocumentation","src":"3903:161:79","text":"@dev Modular euclidean inverse of a number (mod p).\n @param _x The number\n @param _pp The modulus\n @return q such that x*q = 1 (mod _pp)"},"id":15626,"implemented":true,"kind":"function","modifiers":[],"name":"invMod","nameLocation":"4078:6:79","nodeType":"FunctionDefinition","parameters":{"id":15547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15544,"mutability":"mutable","name":"_x","nameLocation":"4093:2:79","nodeType":"VariableDeclaration","scope":15626,"src":"4085:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15543,"name":"uint256","nodeType":"ElementaryTypeName","src":"4085:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15546,"mutability":"mutable","name":"_pp","nameLocation":"4105:3:79","nodeType":"VariableDeclaration","scope":15626,"src":"4097:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15545,"name":"uint256","nodeType":"ElementaryTypeName","src":"4097:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4084:25:79"},"returnParameters":{"id":15550,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15549,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15626,"src":"4133:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15548,"name":"uint256","nodeType":"ElementaryTypeName","src":"4133:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4132:9:79"},"scope":15864,"src":"4069:439:79","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":15774,"nodeType":"Block","src":"4974:1176:79","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15646,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"4988:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15647,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4994:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4988:7:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15654,"nodeType":"IfStatement","src":"4984:44:79","trueBody":{"expression":{"components":[{"id":15649,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15629,"src":"5017:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15650,"name":"_y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15631,"src":"5021:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15651,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"5025:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15652,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5016:12:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"functionReturnParameters":15645,"id":15653,"nodeType":"Return","src":"5009:19:79"}},{"assignments":[15656],"declarations":[{"constant":false,"id":15656,"mutability":"mutable","name":"x","nameLocation":"5345:1:79","nodeType":"VariableDeclaration","scope":15774,"src":"5337:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15655,"name":"uint256","nodeType":"ElementaryTypeName","src":"5337:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15662,"initialValue":{"arguments":[{"id":15658,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15629,"src":"5356:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15659,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15629,"src":"5360:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15660,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5364:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15657,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5349:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5349:19:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5337:31:79"},{"assignments":[15664],"declarations":[{"constant":false,"id":15664,"mutability":"mutable","name":"y","nameLocation":"5393:1:79","nodeType":"VariableDeclaration","scope":15774,"src":"5385:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15663,"name":"uint256","nodeType":"ElementaryTypeName","src":"5385:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15670,"initialValue":{"arguments":[{"id":15666,"name":"_y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15631,"src":"5404:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15667,"name":"_y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15631,"src":"5408:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15668,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5412:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15665,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5397:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15669,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5397:19:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5385:31:79"},{"assignments":[15672],"declarations":[{"constant":false,"id":15672,"mutability":"mutable","name":"z","nameLocation":"5441:1:79","nodeType":"VariableDeclaration","scope":15774,"src":"5433:9:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15671,"name":"uint256","nodeType":"ElementaryTypeName","src":"5433:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15678,"initialValue":{"arguments":[{"id":15674,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"5452:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15675,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"5456:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15676,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5460:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15673,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5445:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5445:19:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5433:31:79"},{"assignments":[15680],"declarations":[{"constant":false,"id":15680,"mutability":"mutable","name":"s","nameLocation":"5500:1:79","nodeType":"VariableDeclaration","scope":15774,"src":"5495:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15679,"name":"uint","nodeType":"ElementaryTypeName","src":"5495:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15690,"initialValue":{"arguments":[{"hexValue":"34","id":15682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5511:1:79","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"arguments":[{"id":15684,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15629,"src":"5521:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15685,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15664,"src":"5525:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15686,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5528:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15683,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5514:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5514:18:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15688,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5534:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15681,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5504:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5504:34:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5495:43:79"},{"assignments":[15692],"declarations":[{"constant":false,"id":15692,"mutability":"mutable","name":"m","nameLocation":"5566:1:79","nodeType":"VariableDeclaration","scope":15774,"src":"5561:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15691,"name":"uint","nodeType":"ElementaryTypeName","src":"5561:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15710,"initialValue":{"arguments":[{"arguments":[{"hexValue":"33","id":15695,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5584:1:79","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},{"id":15696,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15656,"src":"5587:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15697,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5590:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15694,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5577:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15698,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5577:17:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15700,"name":"_aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15635,"src":"5603:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15702,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15672,"src":"5615:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15703,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15672,"src":"5618:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15704,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5621:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15701,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5608:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15705,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5608:17:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15706,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5627:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15699,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5596:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15707,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5596:35:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15708,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5633:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15693,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5570:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15709,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5570:67:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5561:76:79"},{"expression":{"id":15727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15711,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15656,"src":"5844:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":15714,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15692,"src":"5862:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15715,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15692,"src":"5865:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15716,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5868:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15713,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5855:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5855:17:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15724,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15718,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5874:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"id":15720,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15680,"src":"5887:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15721,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15680,"src":"5890:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15722,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5893:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15719,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5880:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15723,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5880:17:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5874:23:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15725,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5899:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15712,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5848:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15726,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5848:55:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5844:59:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15728,"nodeType":"ExpressionStatement","src":"5844:59:79"},{"expression":{"id":15755,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15729,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15664,"src":"5946:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":15732,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15692,"src":"5964:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":15734,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15680,"src":"5974:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15737,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15735,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5977:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":15736,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15656,"src":"5983:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5977:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15738,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5986:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15733,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5967:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5967:23:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15740,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5992:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15731,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5957:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15741,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5957:39:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15742,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"5998:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"hexValue":"38","id":15744,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6011:1:79","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},{"arguments":[{"id":15746,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15664,"src":"6021:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15747,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15664,"src":"6024:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15748,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"6027:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15745,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6014:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6014:17:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15750,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"6033:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15743,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6004:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6004:33:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5998:39:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15753,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"6039:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15730,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5950:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15754,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5950:93:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5946:97:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15756,"nodeType":"ExpressionStatement","src":"5946:97:79"},{"expression":{"id":15767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15757,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15672,"src":"6077:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"32","id":15759,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6088:1:79","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},{"arguments":[{"id":15761,"name":"_y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15631,"src":"6098:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15762,"name":"_z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"6102:2:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15763,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"6106:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15760,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6091:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6091:19:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15765,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15637,"src":"6112:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15758,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6081:6:79","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15766,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6081:35:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6077:39:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15768,"nodeType":"ExpressionStatement","src":"6077:39:79"},{"expression":{"components":[{"id":15769,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15656,"src":"6135:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15770,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15664,"src":"6138:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15771,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15672,"src":"6141:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15772,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6134:9:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"functionReturnParameters":15645,"id":15773,"nodeType":"Return","src":"6127:16:79"}]},"documentation":{"id":15627,"nodeType":"StructuredDocumentation","src":"4514:275:79","text":"@dev Doubles a point (x, y, z).\n @param _x coordinate x of P1\n @param _y coordinate y of P1\n @param _z coordinate z of P1\n @param _aa the a scalar in the curve equation\n @param _pp the modulus\n @return (qx, qy, qz) 2P in Jacobian"},"id":15775,"implemented":true,"kind":"function","modifiers":[],"name":"jacDouble","nameLocation":"4803:9:79","nodeType":"FunctionDefinition","parameters":{"id":15638,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15629,"mutability":"mutable","name":"_x","nameLocation":"4830:2:79","nodeType":"VariableDeclaration","scope":15775,"src":"4822:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15628,"name":"uint256","nodeType":"ElementaryTypeName","src":"4822:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15631,"mutability":"mutable","name":"_y","nameLocation":"4850:2:79","nodeType":"VariableDeclaration","scope":15775,"src":"4842:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15630,"name":"uint256","nodeType":"ElementaryTypeName","src":"4842:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15633,"mutability":"mutable","name":"_z","nameLocation":"4870:2:79","nodeType":"VariableDeclaration","scope":15775,"src":"4862:10:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15632,"name":"uint256","nodeType":"ElementaryTypeName","src":"4862:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15635,"mutability":"mutable","name":"_aa","nameLocation":"4890:3:79","nodeType":"VariableDeclaration","scope":15775,"src":"4882:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15634,"name":"uint256","nodeType":"ElementaryTypeName","src":"4882:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15637,"mutability":"mutable","name":"_pp","nameLocation":"4911:3:79","nodeType":"VariableDeclaration","scope":15775,"src":"4903:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15636,"name":"uint256","nodeType":"ElementaryTypeName","src":"4903:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4812:103:79"},"returnParameters":{"id":15645,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15640,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15775,"src":"4943:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15639,"name":"uint256","nodeType":"ElementaryTypeName","src":"4943:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15642,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15775,"src":"4952:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15641,"name":"uint256","nodeType":"ElementaryTypeName","src":"4952:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15644,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15775,"src":"4961:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15643,"name":"uint256","nodeType":"ElementaryTypeName","src":"4961:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4942:27:79"},"scope":15864,"src":"4794:1356:79","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":15862,"nodeType":"Block","src":"6699:784:79","statements":[{"assignments":[15796],"declarations":[{"constant":false,"id":15796,"mutability":"mutable","name":"x","nameLocation":"6714:1:79","nodeType":"VariableDeclaration","scope":15862,"src":"6709:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15795,"name":"uint","nodeType":"ElementaryTypeName","src":"6709:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15798,"initialValue":{"hexValue":"30","id":15797,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6718:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6709:10:79"},{"assignments":[15800],"declarations":[{"constant":false,"id":15800,"mutability":"mutable","name":"y","nameLocation":"6734:1:79","nodeType":"VariableDeclaration","scope":15862,"src":"6729:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15799,"name":"uint","nodeType":"ElementaryTypeName","src":"6729:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15802,"initialValue":{"hexValue":"30","id":15801,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6738:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6729:10:79"},{"assignments":[15804],"declarations":[{"constant":false,"id":15804,"mutability":"mutable","name":"z","nameLocation":"6754:1:79","nodeType":"VariableDeclaration","scope":15862,"src":"6749:6:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15803,"name":"uint","nodeType":"ElementaryTypeName","src":"6749:4:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15806,"initialValue":{"hexValue":"30","id":15805,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6758:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6749:10:79"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15807,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15778,"src":"6811:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":15808,"name":"_x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15782,"src":"6818:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6811:10:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":15853,"nodeType":"Block","src":"7172:187:79","statements":[{"expression":{"id":15851,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15838,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15796,"src":"7187:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15839,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15800,"src":"7190:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15840,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15804,"src":"7193:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15841,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"7186:9:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15843,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15778,"src":"7222:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15844,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15780,"src":"7243:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":15845,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7264:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":15846,"name":"_x2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15782,"src":"7283:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15847,"name":"_y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15784,"src":"7304:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":15848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7325:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":15849,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15788,"src":"7344:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15842,"name":"jacAdd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15485,"src":"7198:6:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256,uint256,uint256,uint256,uint256,uint256) pure returns (uint256,uint256,uint256)"}},"id":15850,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7198:150:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"src":"7186:162:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15852,"nodeType":"ExpressionStatement","src":"7186:162:79"}]},"id":15854,"nodeType":"IfStatement","src":"6807:552:79","trueBody":{"id":15837,"nodeType":"Block","src":"6823:343:79","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":15811,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15780,"src":"6878:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15812,"name":"_y2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15784,"src":"6883:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15813,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15788,"src":"6888:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15810,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"6871:6:79","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":15814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6871:21:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":15815,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6896:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6871:26:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":15835,"nodeType":"Block","src":"6951:205:79","statements":[{"expression":{"id":15833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":15822,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15796,"src":"6997:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15823,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15800,"src":"7000:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15824,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15804,"src":"7003:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":15825,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"6996:9:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15827,"name":"_x1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15778,"src":"7039:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15828,"name":"_y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15780,"src":"7064:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":15829,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7089:1:79","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":15830,"name":"_aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15786,"src":"7112:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15831,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15788,"src":"7137:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15826,"name":"jacDouble","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15775,"src":"7008:9:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256,uint256,uint256,uint256) pure returns (uint256,uint256,uint256)"}},"id":15832,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7008:133:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256,uint256)"}},"src":"6996:145:79","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15834,"nodeType":"ExpressionStatement","src":"6996:145:79"}]},"id":15836,"nodeType":"IfStatement","src":"6867:289:79","trueBody":{"id":15821,"nodeType":"Block","src":"6899:46:79","statements":[{"expression":{"components":[{"hexValue":"30","id":15817,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6925:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":15818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6928:1:79","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":15819,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6924:6:79","typeDescriptions":{"typeIdentifier":"t_tuple$_t_rational_0_by_1_$_t_rational_0_by_1_$","typeString":"tuple(int_const 0,int_const 0)"}},"functionReturnParameters":15794,"id":15820,"nodeType":"Return","src":"6917:13:79"}]}}]}},{"expression":{"arguments":[{"id":15856,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15796,"src":"7427:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15857,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15800,"src":"7442:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15858,"name":"z","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15804,"src":"7457:1:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15859,"name":"_pp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15788,"src":"7472:3:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15855,"name":"toAffine","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15541,"src":"7405:8:79","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256,uint256,uint256) pure returns (uint256,uint256)"}},"id":15860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7405:71:79","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"functionReturnParameters":15794,"id":15861,"nodeType":"Return","src":"7398:78:79"}]},"documentation":{"id":15776,"nodeType":"StructuredDocumentation","src":"6156:347:79","text":"@dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\n @param _x1 coordinate x of P1\n @param _y1 coordinate y of P1\n @param _x2 coordinate x of P2\n @param _y2 coordinate y of P2\n @param _aa constant of the curve\n @param _pp the modulus\n @return (qx, qy) = P1+P2 in affine coordinates"},"id":15863,"implemented":true,"kind":"function","modifiers":[],"name":"ecAdd","nameLocation":"6517:5:79","nodeType":"FunctionDefinition","parameters":{"id":15789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15778,"mutability":"mutable","name":"_x1","nameLocation":"6540:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6532:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15777,"name":"uint256","nodeType":"ElementaryTypeName","src":"6532:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15780,"mutability":"mutable","name":"_y1","nameLocation":"6561:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6553:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15779,"name":"uint256","nodeType":"ElementaryTypeName","src":"6553:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15782,"mutability":"mutable","name":"_x2","nameLocation":"6582:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6574:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15781,"name":"uint256","nodeType":"ElementaryTypeName","src":"6574:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15784,"mutability":"mutable","name":"_y2","nameLocation":"6603:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6595:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15783,"name":"uint256","nodeType":"ElementaryTypeName","src":"6595:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15786,"mutability":"mutable","name":"_aa","nameLocation":"6624:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6616:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15785,"name":"uint256","nodeType":"ElementaryTypeName","src":"6616:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15788,"mutability":"mutable","name":"_pp","nameLocation":"6645:3:79","nodeType":"VariableDeclaration","scope":15863,"src":"6637:11:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15787,"name":"uint256","nodeType":"ElementaryTypeName","src":"6637:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6522:127:79"},"returnParameters":{"id":15794,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15791,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15863,"src":"6677:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15790,"name":"uint256","nodeType":"ElementaryTypeName","src":"6677:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15793,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15863,"src":"6686:7:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15792,"name":"uint256","nodeType":"ElementaryTypeName","src":"6686:7:79","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6676:18:79"},"scope":15864,"src":"6508:975:79","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":15865,"src":"245:7241:79","usedErrors":[]}],"src":"36:7451:79"},"id":79},"contracts/samples/bls/BLSSignatureAggregator.sol":{"ast":{"absolutePath":"contracts/samples/bls/BLSSignatureAggregator.sol","exportedSymbols":{"BLSHelper":[15864],"BLSOpen":[16599],"BLSSignatureAggregator":[16402],"IAccount":[10569],"IAggregator":[10603],"IBLSAccount":[16427],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":16403,"license":"Unlicense","nodeType":"SourceUnit","nodes":[{"id":15866,"literals":["solidity",">=","0.8",".4","<","0.9",".0"],"nodeType":"PragmaDirective","src":"37:31:80"},{"id":15867,"literals":["abicoder","v2"],"nodeType":"PragmaDirective","src":"69:19:80"},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"../../interfaces/IAggregator.sol","id":15868,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16403,"sourceUnit":10604,"src":"90:42:80","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../../interfaces/IEntryPoint.sol","id":15869,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16403,"sourceUnit":10808,"src":"133:42:80","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/bls/lib/BLSOpen.sol","file":"./lib/BLSOpen.sol","id":15871,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16403,"sourceUnit":16600,"src":"176:43:80","symbolAliases":[{"foreign":{"id":15870,"name":"BLSOpen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16599,"src":"184:7:80","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/samples/bls/IBLSAccount.sol","file":"./IBLSAccount.sol","id":15872,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16403,"sourceUnit":16428,"src":"220:27:80","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/bls/BLSHelper.sol","file":"./BLSHelper.sol","id":15873,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16403,"sourceUnit":15865,"src":"248:25:80","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15875,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":10603,"src":"422:11:80"},"id":15876,"nodeType":"InheritanceSpecifier","src":"422:11:80"}],"canonicalName":"BLSSignatureAggregator","contractDependencies":[],"contractKind":"contract","documentation":{"id":15874,"nodeType":"StructuredDocumentation","src":"275:111:80","text":" A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount"},"fullyImplemented":true,"id":16402,"linearizedBaseContracts":[16402,10603],"name":"BLSSignatureAggregator","nameLocation":"396:22:80","nodeType":"ContractDefinition","nodes":[{"global":false,"id":15880,"libraryName":{"id":15877,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"446:16:80"},"nodeType":"UsingForDirective","src":"440:41:80","typeName":{"id":15879,"nodeType":"UserDefinedTypeName","pathNode":{"id":15878,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"467:13:80"},"referencedDeclaration":10993,"src":"467:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"constant":true,"functionSelector":"009d9250","id":15885,"mutability":"constant","name":"BLS_DOMAIN","nameLocation":"511:10:80","nodeType":"VariableDeclaration","scope":16402,"src":"487:68:80","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":15881,"name":"bytes32","nodeType":"ElementaryTypeName","src":"487:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"hexValue":"656970343333372e626c732e646f6d61696e","id":15883,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"534:20:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_d84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b","typeString":"literal_string \"eip4337.bls.domain\""},"value":"eip4337.bls.domain"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b","typeString":"literal_string \"eip4337.bls.domain\""}],"id":15882,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"524:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":15884,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"524:31:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"constant":true,"functionSelector":"c9e525df","id":15888,"mutability":"constant","name":"N","nameLocation":"614:1:80","nodeType":"VariableDeclaration","scope":16402,"src":"589:106:80","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15886,"name":"uint256","nodeType":"ElementaryTypeName","src":"589:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3231383838323432383731383339323735323232323436343035373435323537323735303838363936333131313537323937383233363632363839303337383934363435323236323038353833","id":15887,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"618:77:80","typeDescriptions":{"typeIdentifier":"t_rational_21888242871839275222246405745257275088696311157297823662689037894645226208583_by_1","typeString":"int_const 2188...(69 digits omitted)...8583"},"value":"21888242871839275222246405745257275088696311157297823662689037894645226208583"},"visibility":"public"},{"body":{"id":15926,"nodeType":"Block","src":"1120:252:80","statements":[{"assignments":[15900],"declarations":[{"constant":false,"id":15900,"mutability":"mutable","name":"initCode","nameLocation":"1143:8:80","nodeType":"VariableDeclaration","scope":15926,"src":"1130:21:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15899,"name":"bytes","nodeType":"ElementaryTypeName","src":"1130:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":15903,"initialValue":{"expression":{"id":15901,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15892,"src":"1154:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":15902,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"1154:15:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1130:39:80"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":15904,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15900,"src":"1183:8:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":15905,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1183:15:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":15906,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1201:1:80","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1183:19:80","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":15924,"nodeType":"Block","src":"1277:89:80","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":15916,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15892,"src":"1310:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":15917,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"1310:13:80","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":15915,"name":"IBLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16427,"src":"1298:11:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IBLSAccount_$16427_$","typeString":"type(contract IBLSAccount)"}},"id":15918,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1298:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IBLSAccount_$16427","typeString":"contract IBLSAccount"}},"id":15919,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getBlsPublicKey","nodeType":"MemberAccess","referencedDeclaration":16426,"src":"1298:42:80","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function () view external returns (uint256[4] memory)"}},"id":15921,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"hexValue":"3530303030","id":15920,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1347:5:80","typeDescriptions":{"typeIdentifier":"t_rational_50000_by_1","typeString":"int_const 50000"},"value":"50000"}],"src":"1298:55:80","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_array$_t_uint256_$4_memory_ptr_$gas","typeString":"function () view external returns (uint256[4] memory)"}},"id":15922,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1298:57:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"functionReturnParameters":15898,"id":15923,"nodeType":"Return","src":"1291:64:80"}]},"id":15925,"nodeType":"IfStatement","src":"1179:187:80","trueBody":{"id":15914,"nodeType":"Block","src":"1204:67:80","statements":[{"expression":{"id":15912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15908,"name":"publicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15897,"src":"1218:9:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15910,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15900,"src":"1251:8:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":15909,"name":"getTrailingPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15953,"src":"1230:20:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function (bytes memory) pure returns (uint256[4] memory)"}},"id":15911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1230:30:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"src":"1218:42:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":15913,"nodeType":"ExpressionStatement","src":"1218:42:80"}]}}]},"documentation":{"id":15889,"nodeType":"StructuredDocumentation","src":"702:306:80","text":" @return publicKey - the public key from a BLS keypair the Aggregator will use to verify this UserOp;\n normally public key will be queried from the deployed BLSAccount itself;\n the public key will be read from the 'initCode' if the account is not deployed yet;"},"functionSelector":"57f09b72","id":15927,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpPublicKey","nameLocation":"1022:18:80","nodeType":"FunctionDefinition","parameters":{"id":15893,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15892,"mutability":"mutable","name":"userOp","nameLocation":"1062:6:80","nodeType":"VariableDeclaration","scope":15927,"src":"1041:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":15891,"nodeType":"UserDefinedTypeName","pathNode":{"id":15890,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1041:13:80"},"referencedDeclaration":10993,"src":"1041:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1040:29:80"},"returnParameters":{"id":15898,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15897,"mutability":"mutable","name":"publicKey","nameLocation":"1109:9:80","nodeType":"VariableDeclaration","scope":15927,"src":"1091:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":15894,"name":"uint256","nodeType":"ElementaryTypeName","src":"1091:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15896,"length":{"hexValue":"34","id":15895,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1099:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1091:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1090:29:80"},"scope":16402,"src":"1013:359:80","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":15952,"nodeType":"Block","src":"1542:555:80","statements":[{"assignments":[15938],"declarations":[{"constant":false,"id":15938,"mutability":"mutable","name":"len","nameLocation":"1557:3:80","nodeType":"VariableDeclaration","scope":15952,"src":"1552:8:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15937,"name":"uint","nodeType":"ElementaryTypeName","src":"1552:4:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15941,"initialValue":{"expression":{"id":15939,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15930,"src":"1563:4:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":15940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1563:11:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1552:22:80"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15947,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15943,"name":"len","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15938,"src":"1592:3:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"id":15946,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3332","id":15944,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1598:2:80","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"34","id":15945,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1603:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"1598:6:80","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"}},"src":"1592:12:80","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6461746120746f6f2073686f727420666f7220736967","id":15948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1606:24:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_2def5c28206cb0e6164070fcb51feafff201d12ca54bd3e0a3892357496d8fff","typeString":"literal_string \"data too short for sig\""},"value":"data too short for sig"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2def5c28206cb0e6164070fcb51feafff201d12ca54bd3e0a3892357496d8fff","typeString":"literal_string \"data too short for sig\""}],"id":15942,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1584:7:80","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":15949,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1584:47:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15950,"nodeType":"ExpressionStatement","src":"1584:47:80"},{"AST":{"nodeType":"YulBlock","src":"1710:381:80","statements":[{"nodeType":"YulVariableDeclaration","src":"1825:34:80","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1844:4:80"},{"name":"len","nodeType":"YulIdentifier","src":"1850:3:80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1840:3:80"},"nodeType":"YulFunctionCall","src":"1840:14:80"},{"kind":"number","nodeType":"YulLiteral","src":"1856:2:80","type":"","value":"96"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1836:3:80"},"nodeType":"YulFunctionCall","src":"1836:23:80"},"variables":[{"name":"ofs","nodeType":"YulTypedName","src":"1829:3:80","type":""}]},{"expression":{"arguments":[{"name":"publicKey","nodeType":"YulIdentifier","src":"1879:9:80"},{"arguments":[{"name":"ofs","nodeType":"YulIdentifier","src":"1896:3:80"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1890:5:80"},"nodeType":"YulFunctionCall","src":"1890:10:80"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1872:6:80"},"nodeType":"YulFunctionCall","src":"1872:29:80"},"nodeType":"YulExpressionStatement","src":"1872:29:80"},{"expression":{"arguments":[{"arguments":[{"name":"publicKey","nodeType":"YulIdentifier","src":"1925:9:80"},{"kind":"number","nodeType":"YulLiteral","src":"1936:2:80","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1921:3:80"},"nodeType":"YulFunctionCall","src":"1921:18:80"},{"arguments":[{"arguments":[{"name":"ofs","nodeType":"YulIdentifier","src":"1951:3:80"},{"kind":"number","nodeType":"YulLiteral","src":"1956:2:80","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1947:3:80"},"nodeType":"YulFunctionCall","src":"1947:12:80"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1941:5:80"},"nodeType":"YulFunctionCall","src":"1941:19:80"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1914:6:80"},"nodeType":"YulFunctionCall","src":"1914:47:80"},"nodeType":"YulExpressionStatement","src":"1914:47:80"},{"expression":{"arguments":[{"arguments":[{"name":"publicKey","nodeType":"YulIdentifier","src":"1985:9:80"},{"kind":"number","nodeType":"YulLiteral","src":"1996:2:80","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1981:3:80"},"nodeType":"YulFunctionCall","src":"1981:18:80"},{"arguments":[{"arguments":[{"name":"ofs","nodeType":"YulIdentifier","src":"2011:3:80"},{"kind":"number","nodeType":"YulLiteral","src":"2016:2:80","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2007:3:80"},"nodeType":"YulFunctionCall","src":"2007:12:80"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2001:5:80"},"nodeType":"YulFunctionCall","src":"2001:19:80"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1974:6:80"},"nodeType":"YulFunctionCall","src":"1974:47:80"},"nodeType":"YulExpressionStatement","src":"1974:47:80"},{"expression":{"arguments":[{"arguments":[{"name":"publicKey","nodeType":"YulIdentifier","src":"2045:9:80"},{"kind":"number","nodeType":"YulLiteral","src":"2056:2:80","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2041:3:80"},"nodeType":"YulFunctionCall","src":"2041:18:80"},{"arguments":[{"arguments":[{"name":"ofs","nodeType":"YulIdentifier","src":"2071:3:80"},{"kind":"number","nodeType":"YulLiteral","src":"2076:2:80","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2067:3:80"},"nodeType":"YulFunctionCall","src":"2067:12:80"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2061:5:80"},"nodeType":"YulFunctionCall","src":"2061:19:80"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2034:6:80"},"nodeType":"YulFunctionCall","src":"2034:47:80"},"nodeType":"YulExpressionStatement","src":"2034:47:80"}]},"evmVersion":"london","externalReferences":[{"declaration":15930,"isOffset":false,"isSlot":false,"src":"1844:4:80","valueSize":1},{"declaration":15938,"isOffset":false,"isSlot":false,"src":"1850:3:80","valueSize":1},{"declaration":15935,"isOffset":false,"isSlot":false,"src":"1879:9:80","valueSize":1},{"declaration":15935,"isOffset":false,"isSlot":false,"src":"1925:9:80","valueSize":1},{"declaration":15935,"isOffset":false,"isSlot":false,"src":"1985:9:80","valueSize":1},{"declaration":15935,"isOffset":false,"isSlot":false,"src":"2045:9:80","valueSize":1}],"id":15951,"nodeType":"InlineAssembly","src":"1701:390:80"}]},"documentation":{"id":15928,"nodeType":"StructuredDocumentation","src":"1378:60:80","text":" return the trailing 4 words of input data"},"functionSelector":"b7620eb4","id":15953,"implemented":true,"kind":"function","modifiers":[],"name":"getTrailingPublicKey","nameLocation":"1452:20:80","nodeType":"FunctionDefinition","parameters":{"id":15931,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15930,"mutability":"mutable","name":"data","nameLocation":"1486:4:80","nodeType":"VariableDeclaration","scope":15953,"src":"1473:17:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15929,"name":"bytes","nodeType":"ElementaryTypeName","src":"1473:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1472:19:80"},"returnParameters":{"id":15936,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15935,"mutability":"mutable","name":"publicKey","nameLocation":"1531:9:80","nodeType":"VariableDeclaration","scope":15953,"src":"1513:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":15932,"name":"uint256","nodeType":"ElementaryTypeName","src":"1513:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15934,"length":{"hexValue":"34","id":15933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1521:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1513:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1512:29:80"},"scope":16402,"src":"1443:654:80","stateMutability":"pure","virtual":false,"visibility":"public"},{"baseFunctions":[10583],"body":{"id":16073,"nodeType":"Block","src":"2250:719:80","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15968,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":15965,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15960,"src":"2268:9:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":15966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2268:16:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3634","id":15967,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2288:2:80","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"2268:22:80","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a20696e76616c6964207369676e6174757265","id":15969,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2292:24:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_be923b909b7eb750f013b66ddb441626fcead463bfc2bef068b4a957ee0dca0c","typeString":"literal_string \"BLS: invalid signature\""},"value":"BLS: invalid signature"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_be923b909b7eb750f013b66ddb441626fcead463bfc2bef068b4a957ee0dca0c","typeString":"literal_string \"BLS: invalid signature\""}],"id":15964,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2260:7:80","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":15970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2260:57:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15971,"nodeType":"ExpressionStatement","src":"2260:57:80"},{"assignments":[15977],"declarations":[{"constant":false,"id":15977,"mutability":"mutable","name":"blsSignature","nameLocation":"2346:12:80","nodeType":"VariableDeclaration","scope":16073,"src":"2328:30:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":15975,"name":"uint256","nodeType":"ElementaryTypeName","src":"2328:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15976,"length":{"hexValue":"32","id":15974,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2336:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"2328:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":15987,"initialValue":{"arguments":[{"id":15980,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15960,"src":"2373:9:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"baseExpression":{"id":15982,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2385:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15981,"name":"uint256","nodeType":"ElementaryTypeName","src":"2385:7:80","typeDescriptions":{}}},"id":15984,"indexExpression":{"hexValue":"32","id":15983,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2393:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"2385:10:80","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}}],"id":15985,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2384:12:80","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}],"expression":{"id":15978,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2362:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15979,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"2362:10:80","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15986,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2362:35:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"2327:70:80"},{"assignments":[15989],"declarations":[{"constant":false,"id":15989,"mutability":"mutable","name":"userOpsLen","nameLocation":"2413:10:80","nodeType":"VariableDeclaration","scope":16073,"src":"2408:15:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15988,"name":"uint","nodeType":"ElementaryTypeName","src":"2408:4:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":15992,"initialValue":{"expression":{"id":15990,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15958,"src":"2426:7:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":15991,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2426:14:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2408:32:80"},{"assignments":[15999],"declarations":[{"constant":false,"id":15999,"mutability":"mutable","name":"blsPublicKeys","nameLocation":"2470:13:80","nodeType":"VariableDeclaration","scope":16073,"src":"2450:33:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4][]"},"typeName":{"baseType":{"baseType":{"id":15996,"name":"uint256","nodeType":"ElementaryTypeName","src":"2450:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15997,"length":{"hexValue":"34","id":15995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2458:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2450:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":15998,"nodeType":"ArrayTypeName","src":"2450:12:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}},"visibility":"internal"}],"id":16007,"initialValue":{"arguments":[{"id":16005,"name":"userOpsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15989,"src":"2503:10:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16004,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"2486:16:80","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[4] memory[] memory)"},"typeName":{"baseType":{"baseType":{"id":16000,"name":"uint256","nodeType":"ElementaryTypeName","src":"2490:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16002,"length":{"hexValue":"34","id":16001,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2498:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2490:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":16003,"nodeType":"ArrayTypeName","src":"2490:12:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}}},"id":16006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2486:28:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"2450:64:80"},{"assignments":[16014],"declarations":[{"constant":false,"id":16014,"mutability":"mutable","name":"messages","nameLocation":"2544:8:80","nodeType":"VariableDeclaration","scope":16073,"src":"2524:28:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2][]"},"typeName":{"baseType":{"baseType":{"id":16011,"name":"uint256","nodeType":"ElementaryTypeName","src":"2524:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16012,"length":{"hexValue":"32","id":16010,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2532:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"2524:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16013,"nodeType":"ArrayTypeName","src":"2524:12:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}},"visibility":"internal"}],"id":16022,"initialValue":{"arguments":[{"id":16020,"name":"userOpsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15989,"src":"2572:10:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"2555:16:80","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[2] memory[] memory)"},"typeName":{"baseType":{"baseType":{"id":16015,"name":"uint256","nodeType":"ElementaryTypeName","src":"2559:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16017,"length":{"hexValue":"32","id":16016,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2567:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"2559:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16018,"nodeType":"ArrayTypeName","src":"2559:12:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}}},"id":16021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2555:28:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"2524:59:80"},{"body":{"id":16061,"nodeType":"Block","src":"2634:215:80","statements":[{"assignments":[16035],"declarations":[{"constant":false,"id":16035,"mutability":"mutable","name":"userOp","nameLocation":"2670:6:80","nodeType":"VariableDeclaration","scope":16061,"src":"2649:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16034,"nodeType":"UserDefinedTypeName","pathNode":{"id":16033,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2649:13:80"},"referencedDeclaration":10993,"src":"2649:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"id":16039,"initialValue":{"baseExpression":{"id":16036,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15958,"src":"2679:7:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":16038,"indexExpression":{"id":16037,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2687:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2679:10:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"nodeType":"VariableDeclarationStatement","src":"2649:40:80"},{"expression":{"id":16046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16040,"name":"blsPublicKeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15999,"src":"2703:13:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16042,"indexExpression":{"id":16041,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2717:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2703:16:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":16044,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16035,"src":"2741:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}],"id":16043,"name":"getUserOpPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15927,"src":"2722:18:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function (struct UserOperation memory) view returns (uint256[4] memory)"}},"id":16045,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2722:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"src":"2703:45:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16047,"nodeType":"ExpressionStatement","src":"2703:45:80"},{"expression":{"id":16059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16048,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16014,"src":"2763:8:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"id":16050,"indexExpression":{"id":16049,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2772:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2763:11:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":16052,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16035,"src":"2794:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},{"arguments":[{"baseExpression":{"id":16054,"name":"blsPublicKeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15999,"src":"2820:13:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16056,"indexExpression":{"id":16055,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2834:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2820:16:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":16053,"name":"_getPublicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16236,"src":"2802:17:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_bytes32_$","typeString":"function (uint256[4] memory) pure returns (bytes32)"}},"id":16057,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2802:35:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":16051,"name":"_userOpToMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16170,"src":"2777:16:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (struct UserOperation memory,bytes32) view returns (uint256[2] memory)"}},"id":16058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2777:61:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"src":"2763:75:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16060,"nodeType":"ExpressionStatement","src":"2763:75:80"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16029,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16027,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2613:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":16028,"name":"userOpsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15989,"src":"2617:10:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2613:14:80","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16062,"initializationExpression":{"assignments":[16024],"declarations":[{"constant":false,"id":16024,"mutability":"mutable","name":"i","nameLocation":"2606:1:80","nodeType":"VariableDeclaration","scope":16062,"src":"2598:9:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16023,"name":"uint256","nodeType":"ElementaryTypeName","src":"2598:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16026,"initialValue":{"hexValue":"30","id":16025,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2610:1:80","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2598:13:80"},"loopExpression":{"expression":{"id":16031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2629:3:80","subExpression":{"id":16030,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16024,"src":"2629:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16032,"nodeType":"ExpressionStatement","src":"2629:3:80"},"nodeType":"ForStatement","src":"2593:256:80"},{"expression":{"arguments":[{"arguments":[{"id":16066,"name":"blsSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15977,"src":"2889:12:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"id":16067,"name":"blsPublicKeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15999,"src":"2903:13:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},{"id":16068,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16014,"src":"2918:8:80","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}],"expression":{"id":16064,"name":"BLSOpen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16599,"src":"2866:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSOpen_$16599_$","typeString":"type(library BLSOpen)"}},"id":16065,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifyMultiple","nodeType":"MemberAccess","referencedDeclaration":16541,"src":"2866:22:80","typeDescriptions":{"typeIdentifier":"t_function_delegatecall_view$_t_array$_t_uint256_$2_memory_ptr_$_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_$_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$","typeString":"function (uint256[2] memory,uint256[4] memory[] memory,uint256[2] memory[] memory) view returns (bool)"}},"id":16069,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2866:61:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a2076616c69646174655369676e617475726573206661696c6564","id":16070,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2929:32:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_23023282b0f59631a4352146b09b85b58fd6d0cc04d93c3b2f62d5ff0f501f0b","typeString":"literal_string \"BLS: validateSignatures failed\""},"value":"BLS: validateSignatures failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_23023282b0f59631a4352146b09b85b58fd6d0cc04d93c3b2f62d5ff0f501f0b","typeString":"literal_string \"BLS: validateSignatures failed\""}],"id":16063,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2858:7:80","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":16071,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2858:104:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16072,"nodeType":"ExpressionStatement","src":"2858:104:80"}]},"documentation":{"id":15954,"nodeType":"StructuredDocumentation","src":"2103:27:80","text":"@inheritdoc IAggregator"},"functionSelector":"e3563a4f","id":16074,"implemented":true,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"2144:18:80","nodeType":"FunctionDefinition","overrides":{"id":15962,"nodeType":"OverrideSpecifier","overrides":[],"src":"2241:8:80"},"parameters":{"id":15961,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15958,"mutability":"mutable","name":"userOps","nameLocation":"2188:7:80","nodeType":"VariableDeclaration","scope":16074,"src":"2163:32:80","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":15956,"nodeType":"UserDefinedTypeName","pathNode":{"id":15955,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"2163:13:80"},"referencedDeclaration":10993,"src":"2163:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":15957,"nodeType":"ArrayTypeName","src":"2163:15:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":15960,"mutability":"mutable","name":"signature","nameLocation":"2212:9:80","nodeType":"VariableDeclaration","scope":16074,"src":"2197:24:80","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15959,"name":"bytes","nodeType":"ElementaryTypeName","src":"2197:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2162:60:80"},"returnParameters":{"id":15963,"nodeType":"ParameterList","parameters":[],"src":"2250:0:80"},"scope":16402,"src":"2135:834:80","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":16115,"nodeType":"Block","src":"3234:467:80","statements":[{"expression":{"arguments":[{"arguments":[{"expression":{"id":16086,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3289:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16087,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":10972,"src":"3289:13:80","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":16088,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3320:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16089,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"3320:12:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"expression":{"id":16091,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3360:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16092,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":10976,"src":"3360:15:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16090,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3350:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16093,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3350:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"expression":{"id":16095,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3404:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16096,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":10978,"src":"3404:15:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16094,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3394:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16097,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3394:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":16098,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3438:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16099,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":10980,"src":"3438:19:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":16100,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3475:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16101,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"3475:27:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":16102,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3520:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16103,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":10984,"src":"3520:25:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":16104,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3563:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16105,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10986,"src":"3563:19:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":16106,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3600:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16107,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"3600:27:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"expression":{"id":16109,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"3655:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":16110,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"3655:23:80","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16108,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3645:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16111,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3645:34:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":16084,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3261:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16085,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"3261:10:80","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":16112,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3261:432:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16083,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3251:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16113,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3251:443:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":16082,"id":16114,"nodeType":"Return","src":"3244:450:80"}]},"documentation":{"id":16075,"nodeType":"StructuredDocumentation","src":"2975:165:80","text":" get a hash of userOp\n NOTE: this hash is not the same as UserOperation.hash()\n (slightly less efficient, since it uses memory userOp)"},"id":16116,"implemented":true,"kind":"function","modifiers":[],"name":"internalUserOpHash","nameLocation":"3154:18:80","nodeType":"FunctionDefinition","parameters":{"id":16079,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16078,"mutability":"mutable","name":"userOp","nameLocation":"3194:6:80","nodeType":"VariableDeclaration","scope":16116,"src":"3173:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16077,"nodeType":"UserDefinedTypeName","pathNode":{"id":16076,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3173:13:80"},"referencedDeclaration":10993,"src":"3173:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3172:29:80"},"returnParameters":{"id":16082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16081,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16116,"src":"3225:7:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16080,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3225:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3224:9:80"},"scope":16402,"src":"3145:556:80","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":16140,"nodeType":"Block","src":"3948:142:80","statements":[{"assignments":[16128],"declarations":[{"constant":false,"id":16128,"mutability":"mutable","name":"publicKeyHash","nameLocation":"3966:13:80","nodeType":"VariableDeclaration","scope":16140,"src":"3958:21:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16127,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3958:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":16134,"initialValue":{"arguments":[{"arguments":[{"id":16131,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16120,"src":"4019:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}],"id":16130,"name":"getUserOpPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15927,"src":"4000:18:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function (struct UserOperation memory) view returns (uint256[4] memory)"}},"id":16132,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4000:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":16129,"name":"_getPublicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16236,"src":"3982:17:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_bytes32_$","typeString":"function (uint256[4] memory) pure returns (bytes32)"}},"id":16133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3982:45:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3958:69:80"},{"expression":{"arguments":[{"id":16136,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16120,"src":"4061:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},{"id":16137,"name":"publicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16128,"src":"4069:13:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":16135,"name":"_userOpToMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16170,"src":"4044:16:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (struct UserOperation memory,bytes32) view returns (uint256[2] memory)"}},"id":16138,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4044:39:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":16126,"id":16139,"nodeType":"Return","src":"4037:46:80"}]},"documentation":{"id":16117,"nodeType":"StructuredDocumentation","src":"3707:142:80","text":" return the BLS \"message\" for the given UserOp.\n the account checks the signature over this value using its public key"},"functionSelector":"40864431","id":16141,"implemented":true,"kind":"function","modifiers":[],"name":"userOpToMessage","nameLocation":"3863:15:80","nodeType":"FunctionDefinition","parameters":{"id":16121,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16120,"mutability":"mutable","name":"userOp","nameLocation":"3900:6:80","nodeType":"VariableDeclaration","scope":16141,"src":"3879:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16119,"nodeType":"UserDefinedTypeName","pathNode":{"id":16118,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"3879:13:80"},"referencedDeclaration":10993,"src":"3879:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3878:29:80"},"returnParameters":{"id":16126,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16125,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16141,"src":"3929:17:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16122,"name":"uint256","nodeType":"ElementaryTypeName","src":"3929:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16124,"length":{"hexValue":"32","id":16123,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3937:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3929:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"3928:19:80"},"scope":16402,"src":"3854:236:80","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":16169,"nodeType":"Block","src":"4216:153:80","statements":[{"assignments":[16154],"declarations":[{"constant":false,"id":16154,"mutability":"mutable","name":"userOpHash","nameLocation":"4234:10:80","nodeType":"VariableDeclaration","scope":16169,"src":"4226:18:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16153,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4226:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":16159,"initialValue":{"arguments":[{"id":16156,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16144,"src":"4262:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},{"id":16157,"name":"publicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16146,"src":"4270:13:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":16155,"name":"_getUserOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16219,"src":"4247:14:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (struct UserOperation memory,bytes32) view returns (bytes32)"}},"id":16158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4247:37:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4226:58:80"},{"expression":{"arguments":[{"id":16162,"name":"BLS_DOMAIN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15885,"src":"4321:10:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":16165,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16154,"src":"4350:10:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":16163,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4333:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16164,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"4333:16:80","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":16166,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4333:28:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":16160,"name":"BLSOpen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16599,"src":"4301:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSOpen_$16599_$","typeString":"type(library BLSOpen)"}},"id":16161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashToPoint","nodeType":"MemberAccess","referencedDeclaration":16559,"src":"4301:19:80","typeDescriptions":{"typeIdentifier":"t_function_delegatecall_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (bytes32,bytes memory) view returns (uint256[2] memory)"}},"id":16167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4301:61:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":16152,"id":16168,"nodeType":"Return","src":"4294:68:80"}]},"id":16170,"implemented":true,"kind":"function","modifiers":[],"name":"_userOpToMessage","nameLocation":"4105:16:80","nodeType":"FunctionDefinition","parameters":{"id":16147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16144,"mutability":"mutable","name":"userOp","nameLocation":"4143:6:80","nodeType":"VariableDeclaration","scope":16170,"src":"4122:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16143,"nodeType":"UserDefinedTypeName","pathNode":{"id":16142,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4122:13:80"},"referencedDeclaration":10993,"src":"4122:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":16146,"mutability":"mutable","name":"publicKeyHash","nameLocation":"4159:13:80","nodeType":"VariableDeclaration","scope":16170,"src":"4151:21:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16145,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4151:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4121:52:80"},"returnParameters":{"id":16152,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16151,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16170,"src":"4197:17:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16148,"name":"uint256","nodeType":"ElementaryTypeName","src":"4197:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16150,"length":{"hexValue":"32","id":16149,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4205:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"4197:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"4196:19:80"},"scope":16402,"src":"4096:273:80","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":16191,"nodeType":"Block","src":"4480:140:80","statements":[{"assignments":[16179],"declarations":[{"constant":false,"id":16179,"mutability":"mutable","name":"publicKeyHash","nameLocation":"4498:13:80","nodeType":"VariableDeclaration","scope":16191,"src":"4490:21:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16178,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4490:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":16185,"initialValue":{"arguments":[{"arguments":[{"id":16182,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16173,"src":"4551:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}],"id":16181,"name":"getUserOpPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15927,"src":"4532:18:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function (struct UserOperation memory) view returns (uint256[4] memory)"}},"id":16183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4532:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":16180,"name":"_getPublicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16236,"src":"4514:17:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_bytes32_$","typeString":"function (uint256[4] memory) pure returns (bytes32)"}},"id":16184,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4514:45:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4490:69:80"},{"expression":{"arguments":[{"id":16187,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16173,"src":"4591:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},{"id":16188,"name":"publicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16179,"src":"4599:13:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":16186,"name":"_getUserOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16219,"src":"4576:14:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (struct UserOperation memory,bytes32) view returns (bytes32)"}},"id":16189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4576:37:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":16177,"id":16190,"nodeType":"Return","src":"4569:44:80"}]},"functionSelector":"a6193531","id":16192,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"4407:13:80","nodeType":"FunctionDefinition","parameters":{"id":16174,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16173,"mutability":"mutable","name":"userOp","nameLocation":"4442:6:80","nodeType":"VariableDeclaration","scope":16192,"src":"4421:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16172,"nodeType":"UserDefinedTypeName","pathNode":{"id":16171,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4421:13:80"},"referencedDeclaration":10993,"src":"4421:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"4420:29:80"},"returnParameters":{"id":16177,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16176,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16192,"src":"4471:7:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16175,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4471:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4470:9:80"},"scope":16402,"src":"4398:222:80","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":16218,"nodeType":"Block","src":"4734:118:80","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":16206,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16195,"src":"4791:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}],"id":16205,"name":"internalUserOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16116,"src":"4772:18:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct UserOperation memory) pure returns (bytes32)"}},"id":16207,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4772:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":16208,"name":"publicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16197,"src":"4800:13:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":16211,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4823:4:80","typeDescriptions":{"typeIdentifier":"t_contract$_BLSSignatureAggregator_$16402","typeString":"contract BLSSignatureAggregator"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BLSSignatureAggregator_$16402","typeString":"contract BLSSignatureAggregator"}],"id":16210,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4815:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":16209,"name":"address","nodeType":"ElementaryTypeName","src":"4815:7:80","typeDescriptions":{}}},"id":16212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4815:13:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":16213,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4830:5:80","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":16214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"4830:13:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":16203,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4761:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16204,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"4761:10:80","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":16215,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4761:83:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16202,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4751:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4751:94:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":16201,"id":16217,"nodeType":"Return","src":"4744:101:80"}]},"id":16219,"implemented":true,"kind":"function","modifiers":[],"name":"_getUserOpHash","nameLocation":"4635:14:80","nodeType":"FunctionDefinition","parameters":{"id":16198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16195,"mutability":"mutable","name":"userOp","nameLocation":"4671:6:80","nodeType":"VariableDeclaration","scope":16219,"src":"4650:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":16194,"nodeType":"UserDefinedTypeName","pathNode":{"id":16193,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"4650:13:80"},"referencedDeclaration":10993,"src":"4650:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":16197,"mutability":"mutable","name":"publicKeyHash","nameLocation":"4687:13:80","nodeType":"VariableDeclaration","scope":16219,"src":"4679:21:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16196,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4679:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4649:52:80"},"returnParameters":{"id":16201,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16200,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16219,"src":"4725:7:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16199,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4725:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4724:9:80"},"scope":16402,"src":"4626:226:80","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":16235,"nodeType":"Block","src":"4945:56:80","statements":[{"expression":{"arguments":[{"arguments":[{"id":16231,"name":"publicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16223,"src":"4983:9:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"expression":{"id":16229,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4972:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16230,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"4972:10:80","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":16232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4972:21:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16228,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4962:9:80","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":16233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4962:32:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":16227,"id":16234,"nodeType":"Return","src":"4955:39:80"}]},"id":16236,"implemented":true,"kind":"function","modifiers":[],"name":"_getPublicKeyHash","nameLocation":"4867:17:80","nodeType":"FunctionDefinition","parameters":{"id":16224,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16223,"mutability":"mutable","name":"publicKey","nameLocation":"4903:9:80","nodeType":"VariableDeclaration","scope":16236,"src":"4885:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16220,"name":"uint256","nodeType":"ElementaryTypeName","src":"4885:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16222,"length":{"hexValue":"34","id":16221,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4893:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"4885:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"4884:29:80"},"returnParameters":{"id":16227,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16226,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16236,"src":"4936:7:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16225,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4936:7:80","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4935:9:80"},"scope":16402,"src":"4858:143:80","stateMutability":"pure","virtual":false,"visibility":"internal"},{"baseFunctions":[10592],"body":{"id":16297,"nodeType":"Block","src":"5651:346:80","statements":[{"assignments":[16250],"declarations":[{"constant":false,"id":16250,"mutability":"mutable","name":"signature","nameLocation":"5679:9:80","nodeType":"VariableDeclaration","scope":16297,"src":"5661:27:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16248,"name":"uint256","nodeType":"ElementaryTypeName","src":"5661:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16249,"length":{"hexValue":"32","id":16247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5669:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5661:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":16261,"initialValue":{"arguments":[{"expression":{"id":16253,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16240,"src":"5702:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":16254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"5702:16:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"baseExpression":{"id":16256,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5721:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":16255,"name":"uint256","nodeType":"ElementaryTypeName","src":"5721:7:80","typeDescriptions":{}}},"id":16258,"indexExpression":{"hexValue":"32","id":16257,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5729:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"5721:10:80","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}}],"id":16259,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5720:12:80","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"type(uint256[2] memory)"}],"expression":{"id":16251,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5691:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16252,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5691:10:80","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":16260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5691:42:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"5661:72:80"},{"assignments":[16267],"declarations":[{"constant":false,"id":16267,"mutability":"mutable","name":"pubkey","nameLocation":"5761:6:80","nodeType":"VariableDeclaration","scope":16297,"src":"5743:24:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16265,"name":"uint256","nodeType":"ElementaryTypeName","src":"5743:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16266,"length":{"hexValue":"34","id":16264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5751:1:80","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"5743:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":16271,"initialValue":{"arguments":[{"id":16269,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16240,"src":"5789:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":16268,"name":"getUserOpPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15927,"src":"5770:18:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$returns$_t_array$_t_uint256_$4_memory_ptr_$","typeString":"function (struct UserOperation memory) view returns (uint256[4] memory)"}},"id":16270,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5770:26:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"nodeType":"VariableDeclarationStatement","src":"5743:53:80"},{"assignments":[16277],"declarations":[{"constant":false,"id":16277,"mutability":"mutable","name":"message","nameLocation":"5824:7:80","nodeType":"VariableDeclaration","scope":16297,"src":"5806:25:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16275,"name":"uint256","nodeType":"ElementaryTypeName","src":"5806:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16276,"length":{"hexValue":"32","id":16274,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5814:1:80","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5806:10:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":16284,"initialValue":{"arguments":[{"id":16279,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16240,"src":"5851:6:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"arguments":[{"id":16281,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16267,"src":"5877:6:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":16280,"name":"_getPublicKeyHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16236,"src":"5859:17:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_bytes32_$","typeString":"function (uint256[4] memory) pure returns (bytes32)"}},"id":16282,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5859:25:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":16278,"name":"_userOpToMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16170,"src":"5834:16:80","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_UserOperation_$10993_memory_ptr_$_t_bytes32_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (struct UserOperation memory,bytes32) view returns (uint256[2] memory)"}},"id":16283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5834:51:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"5806:79:80"},{"expression":{"arguments":[{"arguments":[{"id":16288,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16250,"src":"5925:9:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"id":16289,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16267,"src":"5936:6:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},{"id":16290,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16277,"src":"5944:7:80","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"},{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}],"expression":{"id":16286,"name":"BLSOpen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16599,"src":"5904:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSOpen_$16599_$","typeString":"type(library BLSOpen)"}},"id":16287,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifySingle","nodeType":"MemberAccess","referencedDeclaration":16506,"src":"5904:20:80","typeDescriptions":{"typeIdentifier":"t_function_delegatecall_view$_t_array$_t_uint256_$2_memory_ptr_$_t_array$_t_uint256_$4_memory_ptr_$_t_array$_t_uint256_$2_memory_ptr_$returns$_t_bool_$","typeString":"function (uint256[2] memory,uint256[4] memory,uint256[2] memory) view returns (bool)"}},"id":16291,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5904:48:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a2077726f6e6720736967","id":16292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5954:16:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_4145b59d57ae2f5f0851e5de83c7fb2657aa25911319fc4a072ca80b43f5bde8","typeString":"literal_string \"BLS: wrong sig\""},"value":"BLS: wrong sig"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4145b59d57ae2f5f0851e5de83c7fb2657aa25911319fc4a072ca80b43f5bde8","typeString":"literal_string \"BLS: wrong sig\""}],"id":16285,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5896:7:80","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":16293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5896:75:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16294,"nodeType":"ExpressionStatement","src":"5896:75:80"},{"expression":{"hexValue":"","id":16295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5988:2:80","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"functionReturnParameters":16244,"id":16296,"nodeType":"Return","src":"5981:9:80"}]},"documentation":{"id":16237,"nodeType":"StructuredDocumentation","src":"5006:522:80","text":" validate signature of a single userOp\n This method is called after EntryPoint.simulateValidation() returns an aggregator.\n First it validates the signature over the userOp. then it return data to be used when creating the handleOps:\n @param userOp the userOperation received from the user.\n @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n (usually empty, unless account and aggregator support some kind of \"multisig\""},"functionSelector":"64c530cd","id":16298,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"5542:23:80","nodeType":"FunctionDefinition","parameters":{"id":16241,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16240,"mutability":"mutable","name":"userOp","nameLocation":"5589:6:80","nodeType":"VariableDeclaration","scope":16298,"src":"5566:29:80","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":16239,"nodeType":"UserDefinedTypeName","pathNode":{"id":16238,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"5566:13:80"},"referencedDeclaration":10993,"src":"5566:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"5565:31:80"},"returnParameters":{"id":16244,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16243,"mutability":"mutable","name":"sigForUserOp","nameLocation":"5637:12:80","nodeType":"VariableDeclaration","scope":16298,"src":"5624:25:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16242,"name":"bytes","nodeType":"ElementaryTypeName","src":"5624:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5623:27:80"},"scope":16402,"src":"5533:464:80","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[10602],"body":{"id":16381,"nodeType":"Block","src":"6497:379:80","statements":[{"assignments":[16313],"declarations":[{"constant":false,"id":16313,"mutability":"mutable","name":"points","nameLocation":"6529:6:80","nodeType":"VariableDeclaration","scope":16381,"src":"6507:28:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY[]"},"typeName":{"baseType":{"id":16311,"nodeType":"UserDefinedTypeName","pathNode":{"id":16310,"name":"BLSHelper.XY","nodeType":"IdentifierPath","referencedDeclaration":15073,"src":"6507:12:80"},"referencedDeclaration":15073,"src":"6507:12:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_storage_ptr","typeString":"struct BLSHelper.XY"}},"id":16312,"nodeType":"ArrayTypeName","src":"6507:14:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_storage_$dyn_storage_ptr","typeString":"struct BLSHelper.XY[]"}},"visibility":"internal"}],"id":16321,"initialValue":{"arguments":[{"expression":{"id":16318,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16303,"src":"6557:7:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":16319,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6557:14:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16317,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"6538:18:80","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct BLSHelper.XY memory[] memory)"},"typeName":{"baseType":{"id":16315,"nodeType":"UserDefinedTypeName","pathNode":{"id":16314,"name":"BLSHelper.XY","nodeType":"IdentifierPath","referencedDeclaration":15073,"src":"6542:12:80"},"referencedDeclaration":15073,"src":"6542:12:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_storage_ptr","typeString":"struct BLSHelper.XY"}},"id":16316,"nodeType":"ArrayTypeName","src":"6542:14:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_storage_$dyn_storage_ptr","typeString":"struct BLSHelper.XY[]"}}},"id":16320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6538:34:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"6507:65:80"},{"body":{"id":16360,"nodeType":"Block","src":"6623:146:80","statements":[{"assignments":[16334,16336],"declarations":[{"constant":false,"id":16334,"mutability":"mutable","name":"x","nameLocation":"6646:1:80","nodeType":"VariableDeclaration","scope":16360,"src":"6638:9:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16333,"name":"uint256","nodeType":"ElementaryTypeName","src":"6638:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16336,"mutability":"mutable","name":"y","nameLocation":"6657:1:80","nodeType":"VariableDeclaration","scope":16360,"src":"6649:9:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16335,"name":"uint256","nodeType":"ElementaryTypeName","src":"6649:7:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16349,"initialValue":{"arguments":[{"expression":{"baseExpression":{"id":16339,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16303,"src":"6673:7:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":16341,"indexExpression":{"id":16340,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16323,"src":"6681:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6673:10:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":16342,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"6673:20:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":16344,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6696:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":16343,"name":"uint256","nodeType":"ElementaryTypeName","src":"6696:7:80","typeDescriptions":{}}},{"id":16346,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6705:7:80","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":16345,"name":"uint256","nodeType":"ElementaryTypeName","src":"6705:7:80","typeDescriptions":{}}}],"id":16347,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6695:18:80","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(uint256),type(uint256))"}],"expression":{"id":16337,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6662:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"6662:10:80","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":16348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6662:52:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6637:77:80"},{"expression":{"id":16358,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16350,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16313,"src":"6728:6:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":16352,"indexExpression":{"id":16351,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16323,"src":"6735:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6728:9:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":16355,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16334,"src":"6753:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16356,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16336,"src":"6756:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":16353,"name":"BLSHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15864,"src":"6740:9:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSHelper_$15864_$","typeString":"type(library BLSHelper)"}},"id":16354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"XY","nodeType":"MemberAccess","referencedDeclaration":15073,"src":"6740:12:80","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_XY_$15073_storage_ptr_$","typeString":"type(struct BLSHelper.XY storage pointer)"}},"id":16357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6740:18:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"src":"6728:30:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":16359,"nodeType":"ExpressionStatement","src":"6728:30:80"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16326,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16323,"src":"6599:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":16327,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16313,"src":"6603:6:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},"id":16328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6603:13:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6599:17:80","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16361,"initializationExpression":{"assignments":[16323],"declarations":[{"constant":false,"id":16323,"mutability":"mutable","name":"i","nameLocation":"6592:1:80","nodeType":"VariableDeclaration","scope":16361,"src":"6587:6:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16322,"name":"uint","nodeType":"ElementaryTypeName","src":"6587:4:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16325,"initialValue":{"hexValue":"30","id":16324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6596:1:80","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6587:10:80"},"loopExpression":{"expression":{"id":16331,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6618:3:80","subExpression":{"id":16330,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16323,"src":"6618:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16332,"nodeType":"ExpressionStatement","src":"6618:3:80"},"nodeType":"ForStatement","src":"6582:187:80"},{"assignments":[16366],"declarations":[{"constant":false,"id":16366,"mutability":"mutable","name":"sum","nameLocation":"6798:3:80","nodeType":"VariableDeclaration","scope":16381,"src":"6778:23:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY"},"typeName":{"id":16365,"nodeType":"UserDefinedTypeName","pathNode":{"id":16364,"name":"BLSHelper.XY","nodeType":"IdentifierPath","referencedDeclaration":15073,"src":"6778:12:80"},"referencedDeclaration":15073,"src":"6778:12:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_storage_ptr","typeString":"struct BLSHelper.XY"}},"visibility":"internal"}],"id":16372,"initialValue":{"arguments":[{"id":16369,"name":"points","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16313,"src":"6818:6:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"}},{"id":16370,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15888,"src":"6826:1:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr","typeString":"struct BLSHelper.XY memory[] memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":16367,"name":"BLSHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15864,"src":"6804:9:80","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLSHelper_$15864_$","typeString":"type(library BLSHelper)"}},"id":16368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sum","nodeType":"MemberAccess","referencedDeclaration":15162,"src":"6804:13:80","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_struct$_XY_$15073_memory_ptr_$dyn_memory_ptr_$_t_uint256_$returns$_t_struct$_XY_$15073_memory_ptr_$","typeString":"function (struct BLSHelper.XY memory[] memory,uint256) pure returns (struct BLSHelper.XY memory)"}},"id":16371,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6804:24:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"nodeType":"VariableDeclarationStatement","src":"6778:50:80"},{"expression":{"arguments":[{"expression":{"id":16375,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16366,"src":"6856:3:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":16376,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"x","nodeType":"MemberAccess","referencedDeclaration":15070,"src":"6856:5:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":16377,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16366,"src":"6863:3:80","typeDescriptions":{"typeIdentifier":"t_struct$_XY_$15073_memory_ptr","typeString":"struct BLSHelper.XY memory"}},"id":16378,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"y","nodeType":"MemberAccess","referencedDeclaration":15072,"src":"6863:5:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":16373,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6845:3:80","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":16374,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"6845:10:80","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":16379,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6845:24:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":16307,"id":16380,"nodeType":"Return","src":"6838:31:80"}]},"documentation":{"id":16299,"nodeType":"StructuredDocumentation","src":"6004:368:80","text":" aggregate multiple signatures into a single value.\n This method is called off-chain to calculate the signature to pass with handleOps()\n bundler MAY use optimized custom code perform this aggregation\n @param userOps array of UserOperations to collect the signatures from.\n @return aggregatedSignature the aggregated signature"},"functionSelector":"275e2d79","id":16382,"implemented":true,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"6386:19:80","nodeType":"FunctionDefinition","parameters":{"id":16304,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16303,"mutability":"mutable","name":"userOps","nameLocation":"6431:7:80","nodeType":"VariableDeclaration","scope":16382,"src":"6406:32:80","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":16301,"nodeType":"UserDefinedTypeName","pathNode":{"id":16300,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"6406:13:80"},"referencedDeclaration":10993,"src":"6406:13:80","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":16302,"nodeType":"ArrayTypeName","src":"6406:15:80","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"6405:34:80"},"returnParameters":{"id":16307,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16306,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"6476:19:80","nodeType":"VariableDeclaration","scope":16382,"src":"6463:32:80","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16305,"name":"bytes","nodeType":"ElementaryTypeName","src":"6463:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6462:34:80"},"scope":16402,"src":"6377:499:80","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":16400,"nodeType":"Block","src":"7172:62:80","statements":[{"expression":{"arguments":[{"id":16397,"name":"delay","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16388,"src":"7221:5:80","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":16391,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16386,"src":"7182:10:80","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":16393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addStake","nodeType":"MemberAccess","referencedDeclaration":10947,"src":"7182:19:80","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$","typeString":"function (uint32) payable external"}},"id":16396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":16394,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7210:3:80","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":16395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"7210:9:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"7182:38:80","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$value","typeString":"function (uint32) payable external"}},"id":16398,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7182:45:80","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16399,"nodeType":"ExpressionStatement","src":"7182:45:80"}]},"documentation":{"id":16383,"nodeType":"StructuredDocumentation","src":"6882:212:80","text":" allow staking for this aggregator\n there is no limit on stake or delay, but it is not a problem, since it is a permissionless\n signature aggregator, which doesn't support unstaking."},"functionSelector":"45171159","id":16401,"implemented":true,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"7108:8:80","nodeType":"FunctionDefinition","parameters":{"id":16389,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16386,"mutability":"mutable","name":"entryPoint","nameLocation":"7129:10:80","nodeType":"VariableDeclaration","scope":16401,"src":"7117:22:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":16385,"nodeType":"UserDefinedTypeName","pathNode":{"id":16384,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"7117:11:80"},"referencedDeclaration":10807,"src":"7117:11:80","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":16388,"mutability":"mutable","name":"delay","nameLocation":"7148:5:80","nodeType":"VariableDeclaration","scope":16401,"src":"7141:12:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":16387,"name":"uint32","nodeType":"ElementaryTypeName","src":"7141:6:80","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"7116:38:80"},"returnParameters":{"id":16390,"nodeType":"ParameterList","parameters":[],"src":"7172:0:80"},"scope":16402,"src":"7099:135:80","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":16403,"src":"387:6849:80","usedErrors":[]}],"src":"37:7200:80"},"id":80},"contracts/samples/bls/IBLSAccount.sol":{"ast":{"absolutePath":"contracts/samples/bls/IBLSAccount.sol","exportedSymbols":{"IAccount":[10569],"IBLSAccount":[16427],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":16428,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":16404,"literals":["solidity",">=","0.7",".6"],"nodeType":"PragmaDirective","src":"41:24:81"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../../interfaces/IAccount.sol","id":16405,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16428,"sourceUnit":10570,"src":"67:39:81","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16407,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"192:8:81"},"id":16408,"nodeType":"InheritanceSpecifier","src":"192:8:81"}],"canonicalName":"IBLSAccount","contractDependencies":[],"contractKind":"interface","documentation":{"id":16406,"nodeType":"StructuredDocumentation","src":"108:58:81","text":" a BLS account should expose its own public key."},"fullyImplemented":false,"id":16427,"linearizedBaseContracts":[16427,10569],"name":"IBLSAccount","nameLocation":"177:11:81","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"42e4c4ce1432650f17e41c4ea77ed12c0ab20b229d3ffd84a2ebc9f8abb25a83","id":16418,"name":"PublicKeyChanged","nameLocation":"213:16:81","nodeType":"EventDefinition","parameters":{"id":16417,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16412,"indexed":false,"mutability":"mutable","name":"oldPublicKey","nameLocation":"241:12:81","nodeType":"VariableDeclaration","scope":16418,"src":"230:23:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16409,"name":"uint256","nodeType":"ElementaryTypeName","src":"230:7:81","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16411,"length":{"hexValue":"34","id":16410,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"238:1:81","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"230:10:81","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"},{"constant":false,"id":16416,"indexed":false,"mutability":"mutable","name":"newPublicKey","nameLocation":"266:12:81","nodeType":"VariableDeclaration","scope":16418,"src":"255:23:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16413,"name":"uint256","nodeType":"ElementaryTypeName","src":"255:7:81","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16415,"length":{"hexValue":"34","id":16414,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"263:1:81","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"255:10:81","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"229:50:81"},"src":"207:73:81"},{"documentation":{"id":16419,"nodeType":"StructuredDocumentation","src":"286:130:81","text":" @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated."},"functionSelector":"e02afbae","id":16426,"implemented":false,"kind":"function","modifiers":[],"name":"getBlsPublicKey","nameLocation":"430:15:81","nodeType":"FunctionDefinition","parameters":{"id":16420,"nodeType":"ParameterList","parameters":[],"src":"445:2:81"},"returnParameters":{"id":16425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16424,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16426,"src":"471:17:81","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16421,"name":"uint256","nodeType":"ElementaryTypeName","src":"471:7:81","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16423,"length":{"hexValue":"34","id":16422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"479:1:81","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"471:10:81","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"470:19:81"},"scope":16427,"src":"421:69:81","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16428,"src":"167:325:81","usedErrors":[]}],"src":"41:452:81"},"id":81},"contracts/samples/bls/lib/BLSOpen.sol":{"ast":{"absolutePath":"contracts/samples/bls/lib/BLSOpen.sol","exportedSymbols":{"BLS":[17557],"BLSOpen":[16599]},"id":16600,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16429,"literals":["solidity",">=","0.6",".12"],"nodeType":"PragmaDirective","src":"32:26:82"},{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol","file":"./hubble-contracts/contracts/libs/BLS.sol","id":16431,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16600,"sourceUnit":17558,"src":"60:64:82","symbolAliases":[{"foreign":{"id":16430,"name":"BLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17557,"src":"69:3:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"BLSOpen","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":16599,"linearizedBaseContracts":[16599],"name":"BLSOpen","nameLocation":"134:7:82","nodeType":"ContractDefinition","nodes":[{"body":{"id":16505,"nodeType":"Block","src":"311:648:82","statements":[{"assignments":[16454],"declarations":[{"constant":false,"id":16454,"mutability":"mutable","name":"pubkeys","nameLocation":"341:7:82","nodeType":"VariableDeclaration","scope":16505,"src":"321:27:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4][]"},"typeName":{"baseType":{"baseType":{"id":16451,"name":"uint256","nodeType":"ElementaryTypeName","src":"321:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16452,"length":{"hexValue":"34","id":16450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"329:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"321:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":16453,"nodeType":"ArrayTypeName","src":"321:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}},"visibility":"internal"}],"id":16462,"initialValue":{"arguments":[{"hexValue":"31","id":16460,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"368:1:82","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":16459,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"351:16:82","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[4] memory[] memory)"},"typeName":{"baseType":{"baseType":{"id":16455,"name":"uint256","nodeType":"ElementaryTypeName","src":"355:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16457,"length":{"hexValue":"34","id":16456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"363:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"355:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":16458,"nodeType":"ArrayTypeName","src":"355:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}}},"id":16461,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"351:19:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"321:49:82"},{"assignments":[16469],"declarations":[{"constant":false,"id":16469,"mutability":"mutable","name":"messages","nameLocation":"400:8:82","nodeType":"VariableDeclaration","scope":16505,"src":"380:28:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2][]"},"typeName":{"baseType":{"baseType":{"id":16466,"name":"uint256","nodeType":"ElementaryTypeName","src":"380:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16467,"length":{"hexValue":"32","id":16465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"388:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"380:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16468,"nodeType":"ArrayTypeName","src":"380:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}},"visibility":"internal"}],"id":16477,"initialValue":{"arguments":[{"hexValue":"31","id":16475,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"428:1:82","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":16474,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"411:16:82","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[2] memory[] memory)"},"typeName":{"baseType":{"baseType":{"id":16470,"name":"uint256","nodeType":"ElementaryTypeName","src":"415:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16472,"length":{"hexValue":"32","id":16471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"423:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"415:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16473,"nodeType":"ArrayTypeName","src":"415:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}}},"id":16476,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"411:19:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"380:50:82"},{"expression":{"id":16482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16478,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16454,"src":"440:7:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16480,"indexExpression":{"hexValue":"30","id":16479,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"448:1:82","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"440:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16481,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16439,"src":"453:6:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"src":"440:19:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16483,"nodeType":"ExpressionStatement","src":"440:19:82"},{"expression":{"id":16488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16484,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16469,"src":"469:8:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"id":16486,"indexExpression":{"hexValue":"30","id":16485,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"478:1:82","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"469:11:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16487,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16443,"src":"483:7:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"src":"469:21:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16489,"nodeType":"ExpressionStatement","src":"469:21:82"},{"assignments":[16491,16493],"declarations":[{"constant":false,"id":16491,"mutability":"mutable","name":"verified","nameLocation":"507:8:82","nodeType":"VariableDeclaration","scope":16505,"src":"502:13:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16490,"name":"bool","nodeType":"ElementaryTypeName","src":"502:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16493,"mutability":"mutable","name":"callSuccess","nameLocation":"522:11:82","nodeType":"VariableDeclaration","scope":16505,"src":"517:16:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16492,"name":"bool","nodeType":"ElementaryTypeName","src":"517:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":16500,"initialValue":{"arguments":[{"id":16496,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16435,"src":"570:9:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"id":16497,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16454,"src":"593:7:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},{"id":16498,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16469,"src":"614:8:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}],"expression":{"id":16494,"name":"BLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17557,"src":"538:3:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLS_$17557_$","typeString":"type(library BLS)"}},"id":16495,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifyMultiple","nodeType":"MemberAccess","referencedDeclaration":16949,"src":"538:18:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_uint256_$2_memory_ptr_$_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_$_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$_t_bool_$","typeString":"function (uint256[2] memory,uint256[4] memory[] memory,uint256[2] memory[] memory) view returns (bool,bool)"}},"id":16499,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"538:94:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"nodeType":"VariableDeclarationStatement","src":"501:131:82"},{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":16503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16501,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16493,"src":"649:11:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":16502,"name":"verified","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16491,"src":"664:8:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"649:23:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":16447,"id":16504,"nodeType":"Return","src":"642:30:82"}]},"functionSelector":"ebbdac91","id":16506,"implemented":true,"kind":"function","modifiers":[],"name":"verifySingle","nameLocation":"157:12:82","nodeType":"FunctionDefinition","parameters":{"id":16444,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16435,"mutability":"mutable","name":"signature","nameLocation":"197:9:82","nodeType":"VariableDeclaration","scope":16506,"src":"179:27:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16432,"name":"uint256","nodeType":"ElementaryTypeName","src":"179:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16434,"length":{"hexValue":"32","id":16433,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"187:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"179:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":16439,"mutability":"mutable","name":"pubkey","nameLocation":"234:6:82","nodeType":"VariableDeclaration","scope":16506,"src":"216:24:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16436,"name":"uint256","nodeType":"ElementaryTypeName","src":"216:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16438,"length":{"hexValue":"34","id":16437,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"224:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"216:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"},{"constant":false,"id":16443,"mutability":"mutable","name":"message","nameLocation":"268:7:82","nodeType":"VariableDeclaration","scope":16506,"src":"250:25:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16440,"name":"uint256","nodeType":"ElementaryTypeName","src":"250:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16442,"length":{"hexValue":"32","id":16441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"258:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"250:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"169:112:82"},"returnParameters":{"id":16447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16446,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16506,"src":"305:4:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16445,"name":"bool","nodeType":"ElementaryTypeName","src":"305:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"304:6:82"},"scope":16599,"src":"148:811:82","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":16540,"nodeType":"Block","src":"1136:188:82","statements":[{"assignments":[16526,16528],"declarations":[{"constant":false,"id":16526,"mutability":"mutable","name":"verified","nameLocation":"1152:8:82","nodeType":"VariableDeclaration","scope":16540,"src":"1147:13:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16525,"name":"bool","nodeType":"ElementaryTypeName","src":"1147:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16528,"mutability":"mutable","name":"callSuccess","nameLocation":"1167:11:82","nodeType":"VariableDeclaration","scope":16540,"src":"1162:16:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16527,"name":"bool","nodeType":"ElementaryTypeName","src":"1162:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":16535,"initialValue":{"arguments":[{"id":16531,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16510,"src":"1215:9:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"id":16532,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16515,"src":"1238:7:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},{"id":16533,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16520,"src":"1259:8:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"},{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}],"expression":{"id":16529,"name":"BLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17557,"src":"1183:3:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLS_$17557_$","typeString":"type(library BLS)"}},"id":16530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifyMultiple","nodeType":"MemberAccess","referencedDeclaration":16949,"src":"1183:18:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_uint256_$2_memory_ptr_$_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_$_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$_t_bool_$","typeString":"function (uint256[2] memory,uint256[4] memory[] memory,uint256[2] memory[] memory) view returns (bool,bool)"}},"id":16534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1183:94:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"nodeType":"VariableDeclarationStatement","src":"1146:131:82"},{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":16538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16536,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16528,"src":"1294:11:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":16537,"name":"verified","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16526,"src":"1309:8:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1294:23:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":16524,"id":16539,"nodeType":"Return","src":"1287:30:82"}]},"functionSelector":"91413763","id":16541,"implemented":true,"kind":"function","modifiers":[],"name":"verifyMultiple","nameLocation":"974:14:82","nodeType":"FunctionDefinition","parameters":{"id":16521,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16510,"mutability":"mutable","name":"signature","nameLocation":"1016:9:82","nodeType":"VariableDeclaration","scope":16541,"src":"998:27:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16507,"name":"uint256","nodeType":"ElementaryTypeName","src":"998:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16509,"length":{"hexValue":"32","id":16508,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1006:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"998:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":16515,"mutability":"mutable","name":"pubkeys","nameLocation":"1055:7:82","nodeType":"VariableDeclaration","scope":16541,"src":"1035:27:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4][]"},"typeName":{"baseType":{"baseType":{"id":16511,"name":"uint256","nodeType":"ElementaryTypeName","src":"1035:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16513,"length":{"hexValue":"34","id":16512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1043:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1035:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":16514,"nodeType":"ArrayTypeName","src":"1035:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}},"visibility":"internal"},{"constant":false,"id":16520,"mutability":"mutable","name":"messages","nameLocation":"1092:8:82","nodeType":"VariableDeclaration","scope":16541,"src":"1072:28:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2][]"},"typeName":{"baseType":{"baseType":{"id":16516,"name":"uint256","nodeType":"ElementaryTypeName","src":"1072:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16518,"length":{"hexValue":"32","id":16517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1080:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"1072:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16519,"nodeType":"ArrayTypeName","src":"1072:12:82","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}},"visibility":"internal"}],"src":"988:118:82"},"returnParameters":{"id":16524,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16523,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16541,"src":"1130:4:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16522,"name":"bool","nodeType":"ElementaryTypeName","src":"1130:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1129:6:82"},"scope":16599,"src":"965:359:82","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":16558,"nodeType":"Block","src":"1453:90:82","statements":[{"expression":{"arguments":[{"id":16554,"name":"domain","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16543,"src":"1499:6:82","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":16555,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16545,"src":"1519:7:82","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":16552,"name":"BLS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17557,"src":"1470:3:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BLS_$17557_$","typeString":"type(library BLS)"}},"id":16553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashToPoint","nodeType":"MemberAccess","referencedDeclaration":17047,"src":"1470:15:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (bytes32,bytes memory) view returns (uint256[2] memory)"}},"id":16556,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1470:66:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":16551,"id":16557,"nodeType":"Return","src":"1463:73:82"}]},"functionSelector":"a850a909","id":16559,"implemented":true,"kind":"function","modifiers":[],"name":"hashToPoint","nameLocation":"1339:11:82","nodeType":"FunctionDefinition","parameters":{"id":16546,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16543,"mutability":"mutable","name":"domain","nameLocation":"1368:6:82","nodeType":"VariableDeclaration","scope":16559,"src":"1360:14:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16542,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1360:7:82","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":16545,"mutability":"mutable","name":"message","nameLocation":"1397:7:82","nodeType":"VariableDeclaration","scope":16559,"src":"1384:20:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16544,"name":"bytes","nodeType":"ElementaryTypeName","src":"1384:5:82","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1350:60:82"},"returnParameters":{"id":16551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16550,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16559,"src":"1434:17:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16547,"name":"uint256","nodeType":"ElementaryTypeName","src":"1434:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16549,"length":{"hexValue":"32","id":16548,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1442:1:82","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"1434:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"1433:19:82"},"scope":16599,"src":"1330:213:82","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":16597,"nodeType":"Block","src":"1624:155:82","statements":[{"assignments":[16569],"declarations":[{"constant":false,"id":16569,"mutability":"mutable","name":"isZero","nameLocation":"1639:6:82","nodeType":"VariableDeclaration","scope":16597,"src":"1634:11:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16568,"name":"bool","nodeType":"ElementaryTypeName","src":"1634:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":16571,"initialValue":{"hexValue":"74727565","id":16570,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1648:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"nodeType":"VariableDeclarationStatement","src":"1634:18:82"},{"body":{"id":16593,"nodeType":"Block","src":"1700:50:82","statements":[{"expression":{"id":16591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":16584,"name":"isZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16569,"src":"1714:6:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":16585,"name":"blsKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16563,"src":"1724:6:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16587,"indexExpression":{"id":16586,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16573,"src":"1731:1:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1724:9:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":16588,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1737:1:82","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1724:14:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":16590,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1723:16:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1714:25:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16592,"nodeType":"ExpressionStatement","src":"1714:25:82"}]},"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":16580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16576,"name":"isZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16569,"src":"1680:6:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16579,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16577,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16573,"src":"1690:1:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"34","id":16578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1692:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"1690:3:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1680:13:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16594,"initializationExpression":{"assignments":[16573],"declarations":[{"constant":false,"id":16573,"mutability":"mutable","name":"i","nameLocation":"1675:1:82","nodeType":"VariableDeclaration","scope":16594,"src":"1667:9:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16572,"name":"uint256","nodeType":"ElementaryTypeName","src":"1667:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16575,"initialValue":{"hexValue":"30","id":16574,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1677:1:82","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"1667:11:82"},"loopExpression":{"expression":{"id":16582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"1695:3:82","subExpression":{"id":16581,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16573,"src":"1695:1:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16583,"nodeType":"ExpressionStatement","src":"1695:3:82"},"nodeType":"ForStatement","src":"1662:88:82"},{"expression":{"id":16595,"name":"isZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16569,"src":"1766:6:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":16567,"id":16596,"nodeType":"Return","src":"1759:13:82"}]},"functionSelector":"c2ad5b98","id":16598,"implemented":true,"kind":"function","modifiers":[],"name":"isZeroBLSKey","nameLocation":"1558:12:82","nodeType":"FunctionDefinition","parameters":{"id":16564,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16563,"mutability":"mutable","name":"blsKey","nameLocation":"1589:6:82","nodeType":"VariableDeclaration","scope":16598,"src":"1571:24:82","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16560,"name":"uint256","nodeType":"ElementaryTypeName","src":"1571:7:82","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16562,"length":{"hexValue":"34","id":16561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1579:1:82","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1571:10:82","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1570:26:82"},"returnParameters":{"id":16567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16566,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16598,"src":"1618:4:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16565,"name":"bool","nodeType":"ElementaryTypeName","src":"1618:4:82","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1617:6:82"},"scope":16599,"src":"1549:230:82","stateMutability":"pure","virtual":false,"visibility":"public"}],"scope":16600,"src":"126:1656:82","usedErrors":[]}],"src":"32:1751:82"},"id":82},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol":{"ast":{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol","exportedSymbols":{"BLS":[17557],"BNPairingPrecompileCostEstimator":[17789],"ModexpInverse":[17802],"ModexpSqrt":[17813]},"id":17558,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16601,"literals":["solidity",">=","0.6",".12"],"nodeType":"PragmaDirective","src":"32:26:83"},{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol","file":"./ModExp.sol","id":16604,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17558,"sourceUnit":17814,"src":"60:57:83","symbolAliases":[{"foreign":{"id":16602,"name":"ModexpInverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17802,"src":"69:13:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":16603,"name":"ModexpSqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17813,"src":"84:10:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol","file":"./BNPairingPrecompileCostEstimator.sol","id":16606,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17558,"sourceUnit":17790,"src":"118:94:83","symbolAliases":[{"foreign":{"id":16605,"name":"BNPairingPrecompileCostEstimator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17789,"src":"131:32:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"BLS","contractDependencies":[],"contractKind":"library","documentation":{"id":16607,"nodeType":"StructuredDocumentation","src":"214:293:83","text":"@title Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\n@notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\n@dev We use G1 points for signatures and messages, and G2 points for public keys"},"fullyImplemented":true,"id":17557,"linearizedBaseContracts":[17557],"name":"BLS","nameLocation":"516:3:83","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":16610,"mutability":"constant","name":"N","nameLocation":"593:1:83","nodeType":"VariableDeclaration","scope":17557,"src":"568:106:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16608,"name":"uint256","nodeType":"ElementaryTypeName","src":"568:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3231383838323432383731383339323735323232323436343035373435323537323735303838363936333131313537323937383233363632363839303337383934363435323236323038353833","id":16609,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"597:77:83","typeDescriptions":{"typeIdentifier":"t_rational_21888242871839275222246405745257275088696311157297823662689037894645226208583_by_1","typeString":"int_const 2188...(69 digits omitted)...8583"},"value":"21888242871839275222246405745257275088696311157297823662689037894645226208583"},"visibility":"private"},{"constant":true,"id":16613,"mutability":"constant","name":"N_G2_X1","nameLocation":"760:7:83","nodeType":"VariableDeclaration","scope":17557,"src":"735:112:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16611,"name":"uint256","nodeType":"ElementaryTypeName","src":"735:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3131353539373332303332393836333837313037393931303034303231333932323835373833393235383132383631383231313932353330393137343033313531343532333931383035363334","id":16612,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"770:77:83","typeDescriptions":{"typeIdentifier":"t_rational_11559732032986387107991004021392285783925812861821192530917403151452391805634_by_1","typeString":"int_const 1155...(69 digits omitted)...5634"},"value":"11559732032986387107991004021392285783925812861821192530917403151452391805634"},"visibility":"private"},{"constant":true,"id":16616,"mutability":"constant","name":"N_G2_X0","nameLocation":"901:7:83","nodeType":"VariableDeclaration","scope":17557,"src":"876:112:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16614,"name":"uint256","nodeType":"ElementaryTypeName","src":"876:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3130383537303436393939303233303537313335393434353730373632323332383239343831333730373536333539353738353138303836393930353139393933323835363535383532373831","id":16615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"911:77:83","typeDescriptions":{"typeIdentifier":"t_rational_10857046999023057135944570762232829481370756359578518086990519993285655852781_by_1","typeString":"int_const 1085...(69 digits omitted)...2781"},"value":"10857046999023057135944570762232829481370756359578518086990519993285655852781"},"visibility":"private"},{"constant":true,"id":16619,"mutability":"constant","name":"N_G2_Y1","nameLocation":"1042:7:83","nodeType":"VariableDeclaration","scope":17557,"src":"1017:112:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16617,"name":"uint256","nodeType":"ElementaryTypeName","src":"1017:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3137383035383734393935393735383431353430393134323032333432313131383339353230333739343539383239373034343232343534353833323936383138343331313036313135303532","id":16618,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1052:77:83","typeDescriptions":{"typeIdentifier":"t_rational_17805874995975841540914202342111839520379459829704422454583296818431106115052_by_1","typeString":"int_const 1780...(69 digits omitted)...5052"},"value":"17805874995975841540914202342111839520379459829704422454583296818431106115052"},"visibility":"private"},{"constant":true,"id":16622,"mutability":"constant","name":"N_G2_Y0","nameLocation":"1183:7:83","nodeType":"VariableDeclaration","scope":17557,"src":"1158:112:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16620,"name":"uint256","nodeType":"ElementaryTypeName","src":"1158:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3133333932353838393438373135383433383034363431343332343937373638303032363530323738313230353730303334323233353133393138373537323435333338323638313036363533","id":16621,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1193:77:83","typeDescriptions":{"typeIdentifier":"t_rational_13392588948715843804641432497768002650278120570034223513918757245338268106653_by_1","typeString":"int_const 1339...(69 digits omitted)...6653"},"value":"13392588948715843804641432497768002650278120570034223513918757245338268106653"},"visibility":"private"},{"constant":true,"id":16625,"mutability":"constant","name":"Z0","nameLocation":"1341:2:83","nodeType":"VariableDeclaration","scope":17557,"src":"1316:96:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16623,"name":"uint256","nodeType":"ElementaryTypeName","src":"1316:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"307830303030303030303030303030303030623363346437396434316139313735396139653463376533353962366238396561656336386536326566666666666664","id":16624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1346:66:83","typeDescriptions":{"typeIdentifier":"t_rational_4407920970296243842837207485651524041948558517760411303933_by_1","typeString":"int_const 4407...(50 digits omitted)...3933"},"value":"0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd"},"visibility":"private"},{"constant":true,"id":16628,"mutability":"constant","name":"Z1","nameLocation":"1493:2:83","nodeType":"VariableDeclaration","scope":17557,"src":"1468:96:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16626,"name":"uint256","nodeType":"ElementaryTypeName","src":"1468:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"307830303030303030303030303030303030353965323662636561306434386261636434663236336631616364623563346635373633343733313737666666666665","id":16627,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1498:66:83","typeDescriptions":{"typeIdentifier":"t_rational_2203960485148121921418603742825762020974279258880205651966_by_1","typeString":"int_const 2203...(50 digits omitted)...1966"},"value":"0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe"},"visibility":"private"},{"constant":true,"id":16631,"mutability":"constant","name":"T24","nameLocation":"1619:3:83","nodeType":"VariableDeclaration","scope":17557,"src":"1594:82:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16629,"name":"uint256","nodeType":"ElementaryTypeName","src":"1594:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"307831303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030","id":16630,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1625:51:83","typeDescriptions":{"typeIdentifier":"t_rational_6277101735386680763835789423207666416102355444464034512896_by_1","typeString":"int_const 6277...(50 digits omitted)...2896"},"value":"0x1000000000000000000000000000000000000000000000000"},"visibility":"private"},{"constant":true,"id":16634,"mutability":"constant","name":"MASK24","nameLocation":"1730:6:83","nodeType":"VariableDeclaration","scope":17557,"src":"1705:84:83","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16632,"name":"uint256","nodeType":"ElementaryTypeName","src":"1705:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3078666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666","id":16633,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1739:50:83","typeDescriptions":{"typeIdentifier":"t_rational_6277101735386680763835789423207666416102355444464034512895_by_1","typeString":"int_const 6277...(50 digits omitted)...2895"},"value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"},"visibility":"private"},{"body":{"id":16721,"nodeType":"Block","src":"2096:1013:83","statements":[{"assignments":[16658],"declarations":[{"constant":false,"id":16658,"mutability":"mutable","name":"input","nameLocation":"2125:5:83","nodeType":"VariableDeclaration","scope":16721,"src":"2106:24:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_memory_ptr","typeString":"uint256[12]"},"typeName":{"baseType":{"id":16656,"name":"uint256","nodeType":"ElementaryTypeName","src":"2106:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16657,"length":{"hexValue":"3132","id":16655,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2114:2:83","typeDescriptions":{"typeIdentifier":"t_rational_12_by_1","typeString":"int_const 12"},"value":"12"},"nodeType":"ArrayTypeName","src":"2106:11:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_storage_ptr","typeString":"uint256[12]"}},"visibility":"internal"}],"id":16688,"initialValue":{"components":[{"baseExpression":{"id":16659,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16638,"src":"2163:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16661,"indexExpression":{"hexValue":"30","id":16660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2173:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2163:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16662,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16638,"src":"2193:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16664,"indexExpression":{"hexValue":"31","id":16663,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2203:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2193:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16665,"name":"N_G2_X1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16613,"src":"2223:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16666,"name":"N_G2_X0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16616,"src":"2248:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16667,"name":"N_G2_Y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16619,"src":"2273:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16668,"name":"N_G2_Y0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16622,"src":"2298:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16669,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16646,"src":"2323:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16671,"indexExpression":{"hexValue":"30","id":16670,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2331:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2323:10:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16672,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16646,"src":"2351:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16674,"indexExpression":{"hexValue":"31","id":16673,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2359:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2351:10:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16675,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16642,"src":"2379:6:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16677,"indexExpression":{"hexValue":"31","id":16676,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2386:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2379:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16678,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16642,"src":"2406:6:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16680,"indexExpression":{"hexValue":"30","id":16679,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2413:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2406:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16681,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16642,"src":"2433:6:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16683,"indexExpression":{"hexValue":"33","id":16682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2440:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2433:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":16684,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16642,"src":"2460:6:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16686,"indexExpression":{"hexValue":"32","id":16685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2467:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2460:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":16687,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2145:338:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_memory_ptr","typeString":"uint256[12] memory"}},"nodeType":"VariableDeclarationStatement","src":"2106:377:83"},{"assignments":[16694],"declarations":[{"constant":false,"id":16694,"mutability":"mutable","name":"out","nameLocation":"2511:3:83","nodeType":"VariableDeclaration","scope":16721,"src":"2493:21:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1]"},"typeName":{"baseType":{"id":16692,"name":"uint256","nodeType":"ElementaryTypeName","src":"2493:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16693,"length":{"hexValue":"31","id":16691,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2501:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"ArrayTypeName","src":"2493:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_storage_ptr","typeString":"uint256[1]"}},"visibility":"internal"}],"id":16695,"nodeType":"VariableDeclarationStatement","src":"2493:21:83"},{"assignments":[16697],"declarations":[{"constant":false,"id":16697,"mutability":"mutable","name":"precompileGasCost","nameLocation":"2532:17:83","nodeType":"VariableDeclaration","scope":16721,"src":"2524:25:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16696,"name":"uint256","nodeType":"ElementaryTypeName","src":"2524:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16700,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":16698,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"2552:7:83","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":16699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2552:9:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2524:37:83"},{"assignments":[16702],"declarations":[{"constant":false,"id":16702,"mutability":"mutable","name":"callSuccess","nameLocation":"2696:11:83","nodeType":"VariableDeclaration","scope":16721,"src":"2691:16:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16701,"name":"bool","nodeType":"ElementaryTypeName","src":"2691:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":16703,"nodeType":"VariableDeclarationStatement","src":"2691:16:83"},{"AST":{"nodeType":"YulBlock","src":"2790:204:83","statements":[{"nodeType":"YulAssignment","src":"2804:180:83","value":{"arguments":[{"name":"precompileGasCost","nodeType":"YulIdentifier","src":"2847:17:83"},{"kind":"number","nodeType":"YulLiteral","src":"2882:1:83","type":"","value":"8"},{"name":"input","nodeType":"YulIdentifier","src":"2901:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"2924:3:83","type":"","value":"384"},{"name":"out","nodeType":"YulIdentifier","src":"2945:3:83"},{"kind":"number","nodeType":"YulLiteral","src":"2966:4:83","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"2819:10:83"},"nodeType":"YulFunctionCall","src":"2819:165:83"},"variableNames":[{"name":"callSuccess","nodeType":"YulIdentifier","src":"2804:11:83"}]}]},"evmVersion":"london","externalReferences":[{"declaration":16702,"isOffset":false,"isSlot":false,"src":"2804:11:83","valueSize":1},{"declaration":16658,"isOffset":false,"isSlot":false,"src":"2901:5:83","valueSize":1},{"declaration":16694,"isOffset":false,"isSlot":false,"src":"2945:3:83","valueSize":1},{"declaration":16697,"isOffset":false,"isSlot":false,"src":"2847:17:83","valueSize":1}],"id":16704,"nodeType":"InlineAssembly","src":"2781:213:83"},{"condition":{"id":16706,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3007:12:83","subExpression":{"id":16705,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16702,"src":"3008:11:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16712,"nodeType":"IfStatement","src":"3003:64:83","trueBody":{"id":16711,"nodeType":"Block","src":"3021:46:83","statements":[{"expression":{"components":[{"hexValue":"66616c7365","id":16707,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3043:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"66616c7365","id":16708,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3050:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"id":16709,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3042:14:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"functionReturnParameters":16652,"id":16710,"nodeType":"Return","src":"3035:21:83"}]}},{"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":16713,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16694,"src":"3084:3:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1] memory"}},"id":16715,"indexExpression":{"hexValue":"30","id":16714,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3088:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3084:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":16716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3094:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3084:11:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74727565","id":16718,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3097:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"id":16719,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3083:19:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"functionReturnParameters":16652,"id":16720,"nodeType":"Return","src":"3076:26:83"}]},"id":16722,"implemented":true,"kind":"function","modifiers":[],"name":"verifySingle","nameLocation":"1936:12:83","nodeType":"FunctionDefinition","parameters":{"id":16647,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16638,"mutability":"mutable","name":"signature","nameLocation":"1976:9:83","nodeType":"VariableDeclaration","scope":16722,"src":"1958:27:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16635,"name":"uint256","nodeType":"ElementaryTypeName","src":"1958:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16637,"length":{"hexValue":"32","id":16636,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1966:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"1958:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":16642,"mutability":"mutable","name":"pubkey","nameLocation":"2013:6:83","nodeType":"VariableDeclaration","scope":16722,"src":"1995:24:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16639,"name":"uint256","nodeType":"ElementaryTypeName","src":"1995:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16641,"length":{"hexValue":"34","id":16640,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2003:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1995:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"},{"constant":false,"id":16646,"mutability":"mutable","name":"message","nameLocation":"2047:7:83","nodeType":"VariableDeclaration","scope":16722,"src":"2029:25:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16643,"name":"uint256","nodeType":"ElementaryTypeName","src":"2029:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16645,"length":{"hexValue":"32","id":16644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2037:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"2029:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"1948:112:83"},"returnParameters":{"id":16652,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16649,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16722,"src":"2084:4:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16648,"name":"bool","nodeType":"ElementaryTypeName","src":"2084:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16651,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16722,"src":"2090:4:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16650,"name":"bool","nodeType":"ElementaryTypeName","src":"2090:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2083:12:83"},"scope":17557,"src":"1927:1182:83","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":16948,"nodeType":"Block","src":"3316:1505:83","statements":[{"assignments":[16744],"declarations":[{"constant":false,"id":16744,"mutability":"mutable","name":"size","nameLocation":"3334:4:83","nodeType":"VariableDeclaration","scope":16948,"src":"3326:12:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16743,"name":"uint256","nodeType":"ElementaryTypeName","src":"3326:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16747,"initialValue":{"expression":{"id":16745,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16731,"src":"3341:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3341:14:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3326:29:83"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16749,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16744,"src":"3373:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":16750,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3380:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3373:8:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a206e756d626572206f66207075626c6963206b6579206973207a65726f","id":16752,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3383:35:83","typeDescriptions":{"typeIdentifier":"t_stringliteral_b64840d8fee4a4d8e73f11a1832d903c97054a269232c7fd6575ba945ecd93a2","typeString":"literal_string \"BLS: number of public key is zero\""},"value":"BLS: number of public key is zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b64840d8fee4a4d8e73f11a1832d903c97054a269232c7fd6575ba945ecd93a2","typeString":"literal_string \"BLS: number of public key is zero\""}],"id":16748,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3365:7:83","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":16753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3365:54:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16754,"nodeType":"ExpressionStatement","src":"3365:54:83"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16756,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16744,"src":"3450:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":16757,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16736,"src":"3458:8:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"id":16758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3458:15:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3450:23:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a206e756d626572206f66207075626c6963206b65797320616e64206d65737361676573206d75737420626520657175616c","id":16760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3487:55:83","typeDescriptions":{"typeIdentifier":"t_stringliteral_67b14574dbd62d49c28d2ab08487d247114d1becd207a824f77bce3bb38e9721","typeString":"literal_string \"BLS: number of public keys and messages must be equal\""},"value":"BLS: number of public keys and messages must be equal"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_67b14574dbd62d49c28d2ab08487d247114d1becd207a824f77bce3bb38e9721","typeString":"literal_string \"BLS: number of public keys and messages must be equal\""}],"id":16755,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3429:7:83","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":16761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3429:123:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16762,"nodeType":"ExpressionStatement","src":"3429:123:83"},{"assignments":[16764],"declarations":[{"constant":false,"id":16764,"mutability":"mutable","name":"inputSize","nameLocation":"3570:9:83","nodeType":"VariableDeclaration","scope":16948,"src":"3562:17:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16763,"name":"uint256","nodeType":"ElementaryTypeName","src":"3562:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16771,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16765,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16744,"src":"3583:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":16766,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3590:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3583:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":16768,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3582:10:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16769,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3595:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"3582:14:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3562:34:83"},{"assignments":[16776],"declarations":[{"constant":false,"id":16776,"mutability":"mutable","name":"input","nameLocation":"3623:5:83","nodeType":"VariableDeclaration","scope":16948,"src":"3606:22:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16774,"name":"uint256","nodeType":"ElementaryTypeName","src":"3606:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16775,"nodeType":"ArrayTypeName","src":"3606:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":16782,"initialValue":{"arguments":[{"id":16780,"name":"inputSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16764,"src":"3645:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16779,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"3631:13:83","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[] memory)"},"typeName":{"baseType":{"id":16777,"name":"uint256","nodeType":"ElementaryTypeName","src":"3635:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16778,"nodeType":"ArrayTypeName","src":"3635:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"id":16781,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3631:24:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3606:49:83"},{"expression":{"id":16789,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16783,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3665:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16785,"indexExpression":{"hexValue":"30","id":16784,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3671:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3665:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":16786,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16726,"src":"3676:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16788,"indexExpression":{"hexValue":"30","id":16787,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3686:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3676:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3665:23:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16790,"nodeType":"ExpressionStatement","src":"3665:23:83"},{"expression":{"id":16797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16791,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3698:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16793,"indexExpression":{"hexValue":"31","id":16792,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3704:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3698:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":16794,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16726,"src":"3709:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16796,"indexExpression":{"hexValue":"31","id":16795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3719:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3709:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3698:23:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16798,"nodeType":"ExpressionStatement","src":"3698:23:83"},{"expression":{"id":16803,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16799,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3731:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16801,"indexExpression":{"hexValue":"32","id":16800,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3737:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3731:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16802,"name":"N_G2_X1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16613,"src":"3742:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3731:18:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16804,"nodeType":"ExpressionStatement","src":"3731:18:83"},{"expression":{"id":16809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16805,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3759:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16807,"indexExpression":{"hexValue":"33","id":16806,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3765:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3759:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16808,"name":"N_G2_X0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16616,"src":"3770:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3759:18:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16810,"nodeType":"ExpressionStatement","src":"3759:18:83"},{"expression":{"id":16815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16811,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3787:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16813,"indexExpression":{"hexValue":"34","id":16812,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3793:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3787:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16814,"name":"N_G2_Y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16619,"src":"3798:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3787:18:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16816,"nodeType":"ExpressionStatement","src":"3787:18:83"},{"expression":{"id":16821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16817,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3815:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16819,"indexExpression":{"hexValue":"35","id":16818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3821:1:83","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3815:8:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16820,"name":"N_G2_Y0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16622,"src":"3826:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3815:18:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16822,"nodeType":"ExpressionStatement","src":"3815:18:83"},{"body":{"id":16917,"nodeType":"Block","src":"3878:291:83","statements":[{"expression":{"id":16845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16833,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3892:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16839,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16838,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16836,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16834,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3898:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16835,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3902:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"3898:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"36","id":16837,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3906:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"3898:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3892:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16840,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16736,"src":"3911:8:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"id":16842,"indexExpression":{"id":16841,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3920:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3911:11:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16844,"indexExpression":{"hexValue":"30","id":16843,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3923:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3911:14:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3892:33:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16846,"nodeType":"ExpressionStatement","src":"3892:33:83"},{"expression":{"id":16859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16847,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3939:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16853,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16852,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16848,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3945:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16849,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3949:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"3945:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"37","id":16851,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3953:1:83","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"3945:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3939:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16854,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16736,"src":"3958:8:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2] memory[] memory"}},"id":16856,"indexExpression":{"id":16855,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3967:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3958:11:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16858,"indexExpression":{"hexValue":"31","id":16857,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3970:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3958:14:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3939:33:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16860,"nodeType":"ExpressionStatement","src":"3939:33:83"},{"expression":{"id":16873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16861,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"3986:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16867,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16866,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16864,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16862,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3992:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16863,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3996:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"3992:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"38","id":16865,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4000:1:83","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"3992:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3986:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16868,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16731,"src":"4005:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16870,"indexExpression":{"id":16869,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4013:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4005:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16872,"indexExpression":{"hexValue":"31","id":16871,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4016:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4005:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3986:32:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16874,"nodeType":"ExpressionStatement","src":"3986:32:83"},{"expression":{"id":16887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16875,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"4032:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16881,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16878,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16876,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4038:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16877,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4042:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"4038:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"39","id":16879,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4046:1:83","typeDescriptions":{"typeIdentifier":"t_rational_9_by_1","typeString":"int_const 9"},"value":"9"},"src":"4038:9:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4032:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16882,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16731,"src":"4051:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16884,"indexExpression":{"id":16883,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4059:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4051:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16886,"indexExpression":{"hexValue":"30","id":16885,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4062:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4051:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4032:32:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16888,"nodeType":"ExpressionStatement","src":"4032:32:83"},{"expression":{"id":16901,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16889,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"4078:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16895,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16890,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4084:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16891,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4088:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"4084:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3130","id":16893,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4092:2:83","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"src":"4084:10:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4078:17:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16896,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16731,"src":"4098:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16898,"indexExpression":{"id":16897,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4106:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4098:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16900,"indexExpression":{"hexValue":"33","id":16899,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4109:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4098:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4078:33:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16902,"nodeType":"ExpressionStatement","src":"4078:33:83"},{"expression":{"id":16915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":16903,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"4125:5:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":16909,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16908,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16904,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4131:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":16905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4135:1:83","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"4131:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3131","id":16907,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4139:2:83","typeDescriptions":{"typeIdentifier":"t_rational_11_by_1","typeString":"int_const 11"},"value":"11"},"src":"4131:10:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4125:17:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"baseExpression":{"id":16910,"name":"pubkeys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16731,"src":"4145:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4] memory[] memory"}},"id":16912,"indexExpression":{"id":16911,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"4153:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4145:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":16914,"indexExpression":{"hexValue":"32","id":16913,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4156:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4145:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4125:33:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16916,"nodeType":"ExpressionStatement","src":"4125:33:83"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":16827,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3863:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":16828,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16744,"src":"3867:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3863:8:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16918,"initializationExpression":{"assignments":[16824],"declarations":[{"constant":false,"id":16824,"mutability":"mutable","name":"i","nameLocation":"3856:1:83","nodeType":"VariableDeclaration","scope":16918,"src":"3848:9:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16823,"name":"uint256","nodeType":"ElementaryTypeName","src":"3848:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16826,"initialValue":{"hexValue":"30","id":16825,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3860:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"3848:13:83"},"loopExpression":{"expression":{"id":16831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"3873:3:83","subExpression":{"id":16830,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16824,"src":"3873:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16832,"nodeType":"ExpressionStatement","src":"3873:3:83"},"nodeType":"ForStatement","src":"3843:326:83"},{"assignments":[16924],"declarations":[{"constant":false,"id":16924,"mutability":"mutable","name":"out","nameLocation":"4196:3:83","nodeType":"VariableDeclaration","scope":16948,"src":"4178:21:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1]"},"typeName":{"baseType":{"id":16922,"name":"uint256","nodeType":"ElementaryTypeName","src":"4178:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16923,"length":{"hexValue":"31","id":16921,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4186:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"ArrayTypeName","src":"4178:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_storage_ptr","typeString":"uint256[1]"}},"visibility":"internal"}],"id":16925,"nodeType":"VariableDeclarationStatement","src":"4178:21:83"},{"assignments":[16927],"declarations":[{"constant":false,"id":16927,"mutability":"mutable","name":"precompileGasCost","nameLocation":"4245:17:83","nodeType":"VariableDeclaration","scope":16948,"src":"4237:25:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16926,"name":"uint256","nodeType":"ElementaryTypeName","src":"4237:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":16930,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":16928,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"4265:7:83","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":16929,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4265:9:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4237:37:83"},{"AST":{"nodeType":"YulBlock","src":"4474:232:83","statements":[{"nodeType":"YulAssignment","src":"4488:208:83","value":{"arguments":[{"name":"precompileGasCost","nodeType":"YulIdentifier","src":"4531:17:83"},{"kind":"number","nodeType":"YulLiteral","src":"4566:1:83","type":"","value":"8"},{"arguments":[{"name":"input","nodeType":"YulIdentifier","src":"4589:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"4596:4:83","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4585:3:83"},"nodeType":"YulFunctionCall","src":"4585:16:83"},{"arguments":[{"name":"inputSize","nodeType":"YulIdentifier","src":"4623:9:83"},{"kind":"number","nodeType":"YulLiteral","src":"4634:4:83","type":"","value":"0x20"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"4619:3:83"},"nodeType":"YulFunctionCall","src":"4619:20:83"},{"name":"out","nodeType":"YulIdentifier","src":"4657:3:83"},{"kind":"number","nodeType":"YulLiteral","src":"4678:4:83","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"4503:10:83"},"nodeType":"YulFunctionCall","src":"4503:193:83"},"variableNames":[{"name":"callSuccess","nodeType":"YulIdentifier","src":"4488:11:83"}]}]},"evmVersion":"london","externalReferences":[{"declaration":16741,"isOffset":false,"isSlot":false,"src":"4488:11:83","valueSize":1},{"declaration":16776,"isOffset":false,"isSlot":false,"src":"4589:5:83","valueSize":1},{"declaration":16764,"isOffset":false,"isSlot":false,"src":"4623:9:83","valueSize":1},{"declaration":16924,"isOffset":false,"isSlot":false,"src":"4657:3:83","valueSize":1},{"declaration":16927,"isOffset":false,"isSlot":false,"src":"4531:17:83","valueSize":1}],"id":16931,"nodeType":"InlineAssembly","src":"4465:241:83"},{"condition":{"id":16933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4719:12:83","subExpression":{"id":16932,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16741,"src":"4720:11:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16939,"nodeType":"IfStatement","src":"4715:64:83","trueBody":{"id":16938,"nodeType":"Block","src":"4733:46:83","statements":[{"expression":{"components":[{"hexValue":"66616c7365","id":16934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4755:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"66616c7365","id":16935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4762:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"id":16936,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4754:14:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"functionReturnParameters":16742,"id":16937,"nodeType":"Return","src":"4747:21:83"}]}},{"expression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":16944,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":16940,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16924,"src":"4796:3:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1] memory"}},"id":16942,"indexExpression":{"hexValue":"30","id":16941,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4800:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4796:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":16943,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4806:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4796:11:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74727565","id":16945,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4809:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"id":16946,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4795:19:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bool_$","typeString":"tuple(bool,bool)"}},"functionReturnParameters":16742,"id":16947,"nodeType":"Return","src":"4788:26:83"}]},"id":16949,"implemented":true,"kind":"function","modifiers":[],"name":"verifyMultiple","nameLocation":"3124:14:83","nodeType":"FunctionDefinition","parameters":{"id":16737,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16726,"mutability":"mutable","name":"signature","nameLocation":"3166:9:83","nodeType":"VariableDeclaration","scope":16949,"src":"3148:27:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16723,"name":"uint256","nodeType":"ElementaryTypeName","src":"3148:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16725,"length":{"hexValue":"32","id":16724,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3156:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3148:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":16731,"mutability":"mutable","name":"pubkeys","nameLocation":"3205:7:83","nodeType":"VariableDeclaration","scope":16949,"src":"3185:27:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr","typeString":"uint256[4][]"},"typeName":{"baseType":{"baseType":{"id":16727,"name":"uint256","nodeType":"ElementaryTypeName","src":"3185:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16729,"length":{"hexValue":"34","id":16728,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3193:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"3185:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"id":16730,"nodeType":"ArrayTypeName","src":"3185:12:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$4_storage_$dyn_storage_ptr","typeString":"uint256[4][]"}},"visibility":"internal"},{"constant":false,"id":16736,"mutability":"mutable","name":"messages","nameLocation":"3242:8:83","nodeType":"VariableDeclaration","scope":16949,"src":"3222:28:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","typeString":"uint256[2][]"},"typeName":{"baseType":{"baseType":{"id":16732,"name":"uint256","nodeType":"ElementaryTypeName","src":"3222:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16734,"length":{"hexValue":"32","id":16733,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3230:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3222:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":16735,"nodeType":"ArrayTypeName","src":"3222:12:83","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$dyn_storage_ptr","typeString":"uint256[2][]"}},"visibility":"internal"}],"src":"3138:118:83"},"returnParameters":{"id":16742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16739,"mutability":"mutable","name":"checkResult","nameLocation":"3285:11:83","nodeType":"VariableDeclaration","scope":16949,"src":"3280:16:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16738,"name":"bool","nodeType":"ElementaryTypeName","src":"3280:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16741,"mutability":"mutable","name":"callSuccess","nameLocation":"3303:11:83","nodeType":"VariableDeclaration","scope":16949,"src":"3298:16:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16740,"name":"bool","nodeType":"ElementaryTypeName","src":"3298:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3279:36:83"},"scope":17557,"src":"3115:1706:83","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":17046,"nodeType":"Block","src":"5014:694:83","statements":[{"assignments":[16966],"declarations":[{"constant":false,"id":16966,"mutability":"mutable","name":"u","nameLocation":"5042:1:83","nodeType":"VariableDeclaration","scope":17046,"src":"5024:19:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16964,"name":"uint256","nodeType":"ElementaryTypeName","src":"5024:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16965,"length":{"hexValue":"32","id":16963,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5032:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5024:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":16971,"initialValue":{"arguments":[{"id":16968,"name":"domain","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16952,"src":"5058:6:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":16969,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16954,"src":"5066:7:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16967,"name":"hashToField","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17478,"src":"5046:11:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (bytes32,bytes memory) pure returns (uint256[2] memory)"}},"id":16970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5046:28:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"5024:50:83"},{"assignments":[16977],"declarations":[{"constant":false,"id":16977,"mutability":"mutable","name":"p0","nameLocation":"5102:2:83","nodeType":"VariableDeclaration","scope":17046,"src":"5084:20:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16975,"name":"uint256","nodeType":"ElementaryTypeName","src":"5084:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16976,"length":{"hexValue":"32","id":16974,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5092:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5084:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":16983,"initialValue":{"arguments":[{"baseExpression":{"id":16979,"name":"u","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16966,"src":"5118:1:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16981,"indexExpression":{"hexValue":"30","id":16980,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5120:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5118:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16978,"name":"mapToPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17348,"src":"5107:10:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[2] memory)"}},"id":16982,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5107:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"5084:39:83"},{"assignments":[16989],"declarations":[{"constant":false,"id":16989,"mutability":"mutable","name":"p1","nameLocation":"5151:2:83","nodeType":"VariableDeclaration","scope":17046,"src":"5133:20:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16987,"name":"uint256","nodeType":"ElementaryTypeName","src":"5133:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16988,"length":{"hexValue":"32","id":16986,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5141:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5133:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"id":16995,"initialValue":{"arguments":[{"baseExpression":{"id":16991,"name":"u","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16966,"src":"5167:1:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":16993,"indexExpression":{"hexValue":"31","id":16992,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5169:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5167:4:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":16990,"name":"mapToPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17348,"src":"5156:10:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_array$_t_uint256_$2_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[2] memory)"}},"id":16994,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5156:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"nodeType":"VariableDeclarationStatement","src":"5133:39:83"},{"assignments":[17001],"declarations":[{"constant":false,"id":17001,"mutability":"mutable","name":"bnAddInput","nameLocation":"5200:10:83","nodeType":"VariableDeclaration","scope":17046,"src":"5182:28:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":16999,"name":"uint256","nodeType":"ElementaryTypeName","src":"5182:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17000,"length":{"hexValue":"34","id":16998,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5190:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"5182:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":17002,"nodeType":"VariableDeclarationStatement","src":"5182:28:83"},{"expression":{"id":17009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":17003,"name":"bnAddInput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17001,"src":"5220:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":17005,"indexExpression":{"hexValue":"30","id":17004,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5231:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5220:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":17006,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16977,"src":"5236:2:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17008,"indexExpression":{"hexValue":"30","id":17007,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5239:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5236:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5220:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17010,"nodeType":"ExpressionStatement","src":"5220:21:83"},{"expression":{"id":17017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":17011,"name":"bnAddInput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17001,"src":"5251:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":17013,"indexExpression":{"hexValue":"31","id":17012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5262:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5251:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":17014,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16977,"src":"5267:2:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17016,"indexExpression":{"hexValue":"31","id":17015,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5270:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5267:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5251:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17018,"nodeType":"ExpressionStatement","src":"5251:21:83"},{"expression":{"id":17025,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":17019,"name":"bnAddInput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17001,"src":"5282:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":17021,"indexExpression":{"hexValue":"32","id":17020,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5293:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5282:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":17022,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16989,"src":"5298:2:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17024,"indexExpression":{"hexValue":"30","id":17023,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5301:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5298:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5282:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17026,"nodeType":"ExpressionStatement","src":"5282:21:83"},{"expression":{"id":17033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":17027,"name":"bnAddInput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17001,"src":"5313:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":17029,"indexExpression":{"hexValue":"33","id":17028,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5324:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5313:13:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":17030,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16989,"src":"5329:2:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17032,"indexExpression":{"hexValue":"31","id":17031,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5332:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5329:5:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5313:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17034,"nodeType":"ExpressionStatement","src":"5313:21:83"},{"assignments":[17036],"declarations":[{"constant":false,"id":17036,"mutability":"mutable","name":"success","nameLocation":"5349:7:83","nodeType":"VariableDeclaration","scope":17046,"src":"5344:12:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17035,"name":"bool","nodeType":"ElementaryTypeName","src":"5344:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":17037,"nodeType":"VariableDeclarationStatement","src":"5344:12:83"},{"AST":{"nodeType":"YulBlock","src":"5439:191:83","statements":[{"nodeType":"YulAssignment","src":"5453:67:83","value":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"5479:3:83"},"nodeType":"YulFunctionCall","src":"5479:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"5486:4:83","type":"","value":"2000"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5475:3:83"},"nodeType":"YulFunctionCall","src":"5475:16:83"},{"kind":"number","nodeType":"YulLiteral","src":"5493:1:83","type":"","value":"6"},{"name":"bnAddInput","nodeType":"YulIdentifier","src":"5496:10:83"},{"kind":"number","nodeType":"YulLiteral","src":"5508:3:83","type":"","value":"128"},{"name":"p0","nodeType":"YulIdentifier","src":"5513:2:83"},{"kind":"number","nodeType":"YulLiteral","src":"5517:2:83","type":"","value":"64"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"5464:10:83"},"nodeType":"YulFunctionCall","src":"5464:56:83"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"5453:7:83"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"5571:49:83","statements":[{"expression":{"arguments":[],"functionName":{"name":"invalid","nodeType":"YulIdentifier","src":"5593:7:83"},"nodeType":"YulFunctionCall","src":"5593:9:83"},"nodeType":"YulExpressionStatement","src":"5593:9:83"}]},"nodeType":"YulCase","src":"5564:56:83","value":{"kind":"number","nodeType":"YulLiteral","src":"5569:1:83","type":"","value":"0"}}],"expression":{"name":"success","nodeType":"YulIdentifier","src":"5540:7:83"},"nodeType":"YulSwitch","src":"5533:87:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17001,"isOffset":false,"isSlot":false,"src":"5496:10:83","valueSize":1},{"declaration":16977,"isOffset":false,"isSlot":false,"src":"5513:2:83","valueSize":1},{"declaration":17036,"isOffset":false,"isSlot":false,"src":"5453:7:83","valueSize":1},{"declaration":17036,"isOffset":false,"isSlot":false,"src":"5540:7:83","valueSize":1}],"id":17038,"nodeType":"InlineAssembly","src":"5430:200:83"},{"expression":{"arguments":[{"id":17040,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17036,"src":"5647:7:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a20626e206164642063616c6c206661696c6564","id":17041,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5656:25:83","typeDescriptions":{"typeIdentifier":"t_stringliteral_160e77d9d43f27ba4855f2f7c2336a727c5fa8b0ae181ac44e8903a5ea7313f0","typeString":"literal_string \"BLS: bn add call failed\""},"value":"BLS: bn add call failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_160e77d9d43f27ba4855f2f7c2336a727c5fa8b0ae181ac44e8903a5ea7313f0","typeString":"literal_string \"BLS: bn add call failed\""}],"id":17039,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5639:7:83","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5639:43:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17043,"nodeType":"ExpressionStatement","src":"5639:43:83"},{"expression":{"id":17044,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16977,"src":"5699:2:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":16960,"id":17045,"nodeType":"Return","src":"5692:9:83"}]},"documentation":{"id":16950,"nodeType":"StructuredDocumentation","src":"4827:53:83","text":"@notice Fouque-Tibouchi Hash to Curve"},"id":17047,"implemented":true,"kind":"function","modifiers":[],"name":"hashToPoint","nameLocation":"4894:11:83","nodeType":"FunctionDefinition","parameters":{"id":16955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16952,"mutability":"mutable","name":"domain","nameLocation":"4914:6:83","nodeType":"VariableDeclaration","scope":17047,"src":"4906:14:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":16951,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4906:7:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":16954,"mutability":"mutable","name":"message","nameLocation":"4935:7:83","nodeType":"VariableDeclaration","scope":17047,"src":"4922:20:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16953,"name":"bytes","nodeType":"ElementaryTypeName","src":"4922:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4905:38:83"},"returnParameters":{"id":16960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16959,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17047,"src":"4991:17:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":16956,"name":"uint256","nodeType":"ElementaryTypeName","src":"4991:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16958,"length":{"hexValue":"32","id":16957,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4999:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"4991:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"4990:19:83"},"scope":17557,"src":"4885:823:83","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":17347,"nodeType":"Block","src":"5818:1539:83","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17057,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17049,"src":"5836:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":17058,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"5841:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5836:6:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d656e74","id":17060,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5844:37:83","typeDescriptions":{"typeIdentifier":"t_stringliteral_c4ff544e35d7a77a229ecca4398c96e4a8d1d092fe0881ee463baa3e09732d7d","typeString":"literal_string \"mapToPointFT: invalid field element\""},"value":"mapToPointFT: invalid field element"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c4ff544e35d7a77a229ecca4398c96e4a8d1d092fe0881ee463baa3e09732d7d","typeString":"literal_string \"mapToPointFT: invalid field element\""}],"id":17056,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5828:7:83","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17061,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5828:54:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17062,"nodeType":"ExpressionStatement","src":"5828:54:83"},{"assignments":[17064],"declarations":[{"constant":false,"id":17064,"mutability":"mutable","name":"x","nameLocation":"5900:1:83","nodeType":"VariableDeclaration","scope":17347,"src":"5892:9:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17063,"name":"uint256","nodeType":"ElementaryTypeName","src":"5892:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17066,"initialValue":{"id":17065,"name":"_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17049,"src":"5904:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5892:14:83"},{"assignments":[null,17068],"declarations":[null,{"constant":false,"id":17068,"mutability":"mutable","name":"decision","nameLocation":"5925:8:83","nodeType":"VariableDeclaration","scope":17347,"src":"5920:13:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17067,"name":"bool","nodeType":"ElementaryTypeName","src":"5920:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":17072,"initialValue":{"arguments":[{"id":17070,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"5942:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17069,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17429,"src":"5937:4:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bool_$","typeString":"function (uint256) pure returns (uint256,bool)"}},"id":17071,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5937:7:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"nodeType":"VariableDeclarationStatement","src":"5917:27:83"},{"assignments":[17074],"declarations":[{"constant":false,"id":17074,"mutability":"mutable","name":"a0","nameLocation":"5963:2:83","nodeType":"VariableDeclaration","scope":17347,"src":"5955:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17073,"name":"uint256","nodeType":"ElementaryTypeName","src":"5955:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17080,"initialValue":{"arguments":[{"id":17076,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"5975:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17077,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"5978:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17078,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"5981:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17075,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"5968:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5968:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5955:28:83"},{"expression":{"id":17087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17081,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17074,"src":"5993:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17083,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17074,"src":"6005:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"34","id":17084,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6009:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"id":17085,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6012:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17082,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"5998:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17086,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5998:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5993:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17088,"nodeType":"ExpressionStatement","src":"5993:21:83"},{"assignments":[17090],"declarations":[{"constant":false,"id":17090,"mutability":"mutable","name":"a1","nameLocation":"6032:2:83","nodeType":"VariableDeclaration","scope":17347,"src":"6024:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17089,"name":"uint256","nodeType":"ElementaryTypeName","src":"6024:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17096,"initialValue":{"arguments":[{"id":17092,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6044:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17093,"name":"Z0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16625,"src":"6047:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17094,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6051:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17091,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6037:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6037:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6024:29:83"},{"assignments":[17098],"declarations":[{"constant":false,"id":17098,"mutability":"mutable","name":"a2","nameLocation":"6071:2:83","nodeType":"VariableDeclaration","scope":17347,"src":"6063:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17097,"name":"uint256","nodeType":"ElementaryTypeName","src":"6063:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17104,"initialValue":{"arguments":[{"id":17100,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6083:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17101,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17074,"src":"6087:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17102,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6091:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17099,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6076:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6076:17:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6063:30:83"},{"expression":{"id":17109,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17105,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17098,"src":"6103:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17107,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17098,"src":"6116:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17106,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17442,"src":"6108:7:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":17108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6108:11:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6103:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17110,"nodeType":"ExpressionStatement","src":"6103:16:83"},{"expression":{"id":17117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17111,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6129:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17113,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6141:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17114,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6145:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17115,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6149:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17112,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6134:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6134:17:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6129:22:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17118,"nodeType":"ExpressionStatement","src":"6129:22:83"},{"expression":{"id":17125,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17119,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6161:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17121,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6173:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17122,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17098,"src":"6177:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17123,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6181:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17120,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6166:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6166:17:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6161:22:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17126,"nodeType":"ExpressionStatement","src":"6161:22:83"},{"expression":{"id":17133,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17127,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6208:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17129,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6220:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17130,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6223:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17131,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6227:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17128,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6213:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17132,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6213:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6208:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17134,"nodeType":"ExpressionStatement","src":"6208:21:83"},{"expression":{"id":17143,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17135,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6239:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17137,"name":"Z1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16628,"src":"6250:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17138,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6254:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17139,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6258:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6254:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17141,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6262:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17136,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"6243:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6243:21:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6239:25:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17144,"nodeType":"ExpressionStatement","src":"6239:25:83"},{"expression":{"id":17151,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17145,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6297:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17147,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6309:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17148,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6312:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17149,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6315:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17146,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6302:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17150,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6302:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6297:20:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17152,"nodeType":"ExpressionStatement","src":"6297:20:83"},{"expression":{"id":17159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17153,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6327:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17155,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6339:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17156,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6343:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17157,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6346:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17154,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6332:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6332:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6327:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17160,"nodeType":"ExpressionStatement","src":"6327:21:83"},{"expression":{"id":17167,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17161,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6358:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17163,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6370:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"33","id":17164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6374:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},{"id":17165,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6377:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17162,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"6363:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17166,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6363:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6358:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17168,"nodeType":"ExpressionStatement","src":"6358:21:83"},{"assignments":[17170],"declarations":[{"constant":false,"id":17170,"mutability":"mutable","name":"found","nameLocation":"6394:5:83","nodeType":"VariableDeclaration","scope":17347,"src":"6389:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17169,"name":"bool","nodeType":"ElementaryTypeName","src":"6389:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":17171,"nodeType":"VariableDeclarationStatement","src":"6389:10:83"},{"expression":{"id":17178,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":17172,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6410:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17173,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"6414:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":17174,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"6409:11:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17176,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6428:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17175,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17429,"src":"6423:4:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bool_$","typeString":"function (uint256) pure returns (uint256,bool)"}},"id":17177,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6423:8:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"src":"6409:22:83","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17179,"nodeType":"ExpressionStatement","src":"6409:22:83"},{"condition":{"id":17180,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"6445:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17196,"nodeType":"IfStatement","src":"6441:122:83","trueBody":{"id":17195,"nodeType":"Block","src":"6452:111:83","statements":[{"condition":{"id":17182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6470:9:83","subExpression":{"id":17181,"name":"decision","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17068,"src":"6471:8:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17190,"nodeType":"IfStatement","src":"6466:59:83","trueBody":{"id":17189,"nodeType":"Block","src":"6481:44:83","statements":[{"expression":{"id":17187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17183,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6499:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17184,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6504:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17185,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6508:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6504:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6499:11:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17188,"nodeType":"ExpressionStatement","src":"6499:11:83"}]}},{"expression":{"components":[{"id":17191,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6546:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17192,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6549:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17193,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6545:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":17055,"id":17194,"nodeType":"Return","src":"6538:14:83"}]}},{"expression":{"id":17205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17197,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6587:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17198,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6591:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"id":17200,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6602:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":17201,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6605:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":17202,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6608:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17199,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"6595:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17203,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6595:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6591:19:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6587:23:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17206,"nodeType":"ExpressionStatement","src":"6587:23:83"},{"expression":{"id":17213,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17207,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6643:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17209,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6655:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17210,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6658:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17211,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6661:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17208,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6648:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6648:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6643:20:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17214,"nodeType":"ExpressionStatement","src":"6643:20:83"},{"expression":{"id":17221,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17215,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6673:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17217,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6685:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17218,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6689:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17219,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6692:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17216,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6678:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6678:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6673:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17222,"nodeType":"ExpressionStatement","src":"6673:21:83"},{"expression":{"id":17229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17223,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6704:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17225,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6716:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"33","id":17226,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6720:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},{"id":17227,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6723:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17224,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"6709:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17228,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6709:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6704:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17230,"nodeType":"ExpressionStatement","src":"6704:21:83"},{"expression":{"id":17237,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":17231,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6736:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17232,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"6740:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":17233,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"6735:11:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17235,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6754:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17234,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17429,"src":"6749:4:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bool_$","typeString":"function (uint256) pure returns (uint256,bool)"}},"id":17236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6749:8:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"src":"6735:22:83","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17238,"nodeType":"ExpressionStatement","src":"6735:22:83"},{"condition":{"id":17239,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"6771:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17255,"nodeType":"IfStatement","src":"6767:122:83","trueBody":{"id":17254,"nodeType":"Block","src":"6778:111:83","statements":[{"condition":{"id":17241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6796:9:83","subExpression":{"id":17240,"name":"decision","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17068,"src":"6797:8:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17249,"nodeType":"IfStatement","src":"6792:59:83","trueBody":{"id":17248,"nodeType":"Block","src":"6807:44:83","statements":[{"expression":{"id":17246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17242,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6825:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17243,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6830:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17244,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6834:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6830:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6825:11:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17247,"nodeType":"ExpressionStatement","src":"6825:11:83"}]}},{"expression":{"components":[{"id":17250,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6872:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17251,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"6875:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17252,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6871:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":17055,"id":17253,"nodeType":"Return","src":"6864:14:83"}]}},{"expression":{"id":17262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17256,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6913:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17258,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17074,"src":"6924:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17259,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17074,"src":"6928:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17260,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6932:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17257,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6917:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17261,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6917:17:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6913:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17263,"nodeType":"ExpressionStatement","src":"6913:21:83"},{"expression":{"id":17270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17264,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6944:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17266,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6955:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17267,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6958:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17268,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6961:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17265,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6948:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6948:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6944:19:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17271,"nodeType":"ExpressionStatement","src":"6944:19:83"},{"expression":{"id":17278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17272,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6973:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17274,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"6984:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17275,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17098,"src":"6987:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17276,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"6991:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17273,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"6977:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17277,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6977:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6973:20:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17279,"nodeType":"ExpressionStatement","src":"6973:20:83"},{"expression":{"id":17286,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17280,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7003:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17282,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7014:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17283,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17098,"src":"7017:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17284,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7021:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17281,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"7007:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17285,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7007:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7003:20:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17287,"nodeType":"ExpressionStatement","src":"7003:20:83"},{"expression":{"id":17294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17288,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7033:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17290,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7044:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"31","id":17291,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7047:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"id":17292,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7050:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17289,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"7037:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7037:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7033:19:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17295,"nodeType":"ExpressionStatement","src":"7033:19:83"},{"expression":{"id":17302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17296,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7090:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17298,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7102:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17299,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7105:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17300,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7108:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17297,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"7095:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7095:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7090:20:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17303,"nodeType":"ExpressionStatement","src":"7090:20:83"},{"expression":{"id":17310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17304,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7120:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17306,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7132:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17307,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7136:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17308,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7139:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17305,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"7125:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17309,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7125:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7120:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17311,"nodeType":"ExpressionStatement","src":"7120:21:83"},{"expression":{"id":17318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17312,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7151:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17314,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7163:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"33","id":17315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7167:1:83","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},{"id":17316,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7170:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17313,"name":"addmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-2,"src":"7156:6:83","typeDescriptions":{"typeIdentifier":"t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7156:16:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7151:21:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17319,"nodeType":"ExpressionStatement","src":"7151:21:83"},{"expression":{"id":17326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":17320,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7183:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17321,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"7187:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":17322,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"7182:11:83","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17324,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7201:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17323,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17429,"src":"7196:4:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bool_$","typeString":"function (uint256) pure returns (uint256,bool)"}},"id":17325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7196:8:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bool_$","typeString":"tuple(uint256,bool)"}},"src":"7182:22:83","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17327,"nodeType":"ExpressionStatement","src":"7182:22:83"},{"expression":{"arguments":[{"id":17329,"name":"found","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17170,"src":"7222:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424c533a20626164206674206d617070696e6720696d706c656d656e746174696f6e","id":17330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7229:36:83","typeDescriptions":{"typeIdentifier":"t_stringliteral_ddcbd77f85b2981c914f755affedaeff2c538c54d90d3355ae3f12bc89e3a549","typeString":"literal_string \"BLS: bad ft mapping implementation\""},"value":"BLS: bad ft mapping implementation"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ddcbd77f85b2981c914f755affedaeff2c538c54d90d3355ae3f12bc89e3a549","typeString":"literal_string \"BLS: bad ft mapping implementation\""}],"id":17328,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7214:7:83","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7214:52:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17332,"nodeType":"ExpressionStatement","src":"7214:52:83"},{"condition":{"id":17334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"7280:9:83","subExpression":{"id":17333,"name":"decision","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17068,"src":"7281:8:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17342,"nodeType":"IfStatement","src":"7276:51:83","trueBody":{"id":17341,"nodeType":"Block","src":"7291:36:83","statements":[{"expression":{"id":17339,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17335,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7305:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17338,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17336,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7310:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17337,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7314:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7310:6:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7305:11:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17340,"nodeType":"ExpressionStatement","src":"7305:11:83"}]}},{"expression":{"components":[{"id":17343,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17064,"src":"7344:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17344,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17090,"src":"7347:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17345,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7343:7:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":17055,"id":17346,"nodeType":"Return","src":"7336:14:83"}]},"id":17348,"implemented":true,"kind":"function","modifiers":[],"name":"mapToPoint","nameLocation":"5723:10:83","nodeType":"FunctionDefinition","parameters":{"id":17050,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17049,"mutability":"mutable","name":"_x","nameLocation":"5742:2:83","nodeType":"VariableDeclaration","scope":17348,"src":"5734:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17048,"name":"uint256","nodeType":"ElementaryTypeName","src":"5734:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5733:12:83"},"returnParameters":{"id":17055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17054,"mutability":"mutable","name":"p","nameLocation":"5811:1:83","nodeType":"VariableDeclaration","scope":17348,"src":"5793:19:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":17051,"name":"uint256","nodeType":"ElementaryTypeName","src":"5793:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17053,"length":{"hexValue":"32","id":17052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5801:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"5793:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"5792:21:83"},"scope":17557,"src":"5714:1643:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17379,"nodeType":"Block","src":"7475:161:83","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":17369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17361,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":17357,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17352,"src":"7490:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17359,"indexExpression":{"hexValue":"30","id":17358,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7500:1:83","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7490:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":17360,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7506:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7490:17:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":17362,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7489:19:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":17363,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17352,"src":"7513:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":17365,"indexExpression":{"hexValue":"31","id":17364,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7523:1:83","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7513:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":17366,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"7529:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7513:17:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":17368,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7512:19:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"7489:42:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":17377,"nodeType":"Block","src":"7576:54:83","statements":[{"expression":{"arguments":[{"id":17374,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17352,"src":"7609:9:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}],"id":17373,"name":"isOnCurveG1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17391,"src":"7597:11:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_uint256_$2_memory_ptr_$returns$_t_bool_$","typeString":"function (uint256[2] memory) pure returns (bool)"}},"id":17375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7597:22:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":17356,"id":17376,"nodeType":"Return","src":"7590:29:83"}]},"id":17378,"nodeType":"IfStatement","src":"7485:145:83","trueBody":{"id":17372,"nodeType":"Block","src":"7533:37:83","statements":[{"expression":{"hexValue":"66616c7365","id":17370,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7554:5:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":17356,"id":17371,"nodeType":"Return","src":"7547:12:83"}]}}]},"id":17380,"implemented":true,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"7372:16:83","nodeType":"FunctionDefinition","parameters":{"id":17353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17352,"mutability":"mutable","name":"signature","nameLocation":"7407:9:83","nodeType":"VariableDeclaration","scope":17380,"src":"7389:27:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":17349,"name":"uint256","nodeType":"ElementaryTypeName","src":"7389:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17351,"length":{"hexValue":"32","id":17350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7397:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"7389:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"7388:29:83"},"returnParameters":{"id":17356,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17355,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17380,"src":"7465:4:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17354,"name":"bool","nodeType":"ElementaryTypeName","src":"7465:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7464:6:83"},"scope":17557,"src":"7363:273:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17390,"nodeType":"Block","src":"7756:363:83","statements":[{"AST":{"nodeType":"YulBlock","src":"7839:274:83","statements":[{"nodeType":"YulVariableDeclaration","src":"7853:22:83","value":{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"7869:5:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7863:5:83"},"nodeType":"YulFunctionCall","src":"7863:12:83"},"variables":[{"name":"t0","nodeType":"YulTypedName","src":"7857:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7888:31:83","value":{"arguments":[{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"7908:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"7915:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7904:3:83"},"nodeType":"YulFunctionCall","src":"7904:14:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7898:5:83"},"nodeType":"YulFunctionCall","src":"7898:21:83"},"variables":[{"name":"t1","nodeType":"YulTypedName","src":"7892:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7932:27:83","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7949:2:83"},{"name":"t0","nodeType":"YulIdentifier","src":"7953:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"7957:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7942:6:83"},"nodeType":"YulFunctionCall","src":"7942:17:83"},"variables":[{"name":"t2","nodeType":"YulTypedName","src":"7936:2:83","type":""}]},{"nodeType":"YulAssignment","src":"7972:23:83","value":{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"7985:2:83"},{"name":"t0","nodeType":"YulIdentifier","src":"7989:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"7993:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7978:6:83"},"nodeType":"YulFunctionCall","src":"7978:17:83"},"variableNames":[{"name":"t2","nodeType":"YulIdentifier","src":"7972:2:83"}]},{"nodeType":"YulAssignment","src":"8008:22:83","value":{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"8021:2:83"},{"kind":"number","nodeType":"YulLiteral","src":"8025:1:83","type":"","value":"3"},{"name":"N","nodeType":"YulIdentifier","src":"8028:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"8014:6:83"},"nodeType":"YulFunctionCall","src":"8014:16:83"},"variableNames":[{"name":"t2","nodeType":"YulIdentifier","src":"8008:2:83"}]},{"nodeType":"YulAssignment","src":"8043:23:83","value":{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"8056:2:83"},{"name":"t1","nodeType":"YulIdentifier","src":"8060:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8064:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8049:6:83"},"nodeType":"YulFunctionCall","src":"8049:17:83"},"variableNames":[{"name":"t1","nodeType":"YulIdentifier","src":"8043:2:83"}]},{"nodeType":"YulAssignment","src":"8079:24:83","value":{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"8096:2:83"},{"name":"t2","nodeType":"YulIdentifier","src":"8100:2:83"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"8093:2:83"},"nodeType":"YulFunctionCall","src":"8093:10:83"},"variableNames":[{"name":"_isOnCurve","nodeType":"YulIdentifier","src":"8079:10:83"}]}]},"evmVersion":"london","externalReferences":[{"declaration":16610,"isOffset":false,"isSlot":false,"src":"7957:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"7993:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8028:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8064:1:83","valueSize":1},{"declaration":17387,"isOffset":false,"isSlot":false,"src":"8079:10:83","valueSize":1},{"declaration":17384,"isOffset":false,"isSlot":false,"src":"7869:5:83","valueSize":1},{"declaration":17384,"isOffset":false,"isSlot":false,"src":"7908:5:83","valueSize":1}],"id":17389,"nodeType":"InlineAssembly","src":"7830:283:83"}]},"id":17391,"implemented":true,"kind":"function","modifiers":[],"name":"isOnCurveG1","nameLocation":"7651:11:83","nodeType":"FunctionDefinition","parameters":{"id":17385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17384,"mutability":"mutable","name":"point","nameLocation":"7681:5:83","nodeType":"VariableDeclaration","scope":17391,"src":"7663:23:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":17381,"name":"uint256","nodeType":"ElementaryTypeName","src":"7663:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17383,"length":{"hexValue":"32","id":17382,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7671:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"7663:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"7662:25:83"},"returnParameters":{"id":17388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17387,"mutability":"mutable","name":"_isOnCurve","nameLocation":"7740:10:83","nodeType":"VariableDeclaration","scope":17391,"src":"7735:15:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17386,"name":"bool","nodeType":"ElementaryTypeName","src":"7735:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7734:17:83"},"scope":17557,"src":"7642:477:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17401,"nodeType":"Block","src":"8239:1340:83","statements":[{"AST":{"nodeType":"YulBlock","src":"8322:1251:83","statements":[{"nodeType":"YulVariableDeclaration","src":"8358:22:83","value":{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"8374:5:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8368:5:83"},"nodeType":"YulFunctionCall","src":"8368:12:83"},"variables":[{"name":"t0","nodeType":"YulTypedName","src":"8362:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8393:31:83","value":{"arguments":[{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"8413:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"8420:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8409:3:83"},"nodeType":"YulFunctionCall","src":"8409:14:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8403:5:83"},"nodeType":"YulFunctionCall","src":"8403:21:83"},"variables":[{"name":"t1","nodeType":"YulTypedName","src":"8397:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8459:27:83","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8476:2:83"},{"name":"t0","nodeType":"YulIdentifier","src":"8480:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8484:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8469:6:83"},"nodeType":"YulFunctionCall","src":"8469:17:83"},"variables":[{"name":"t2","nodeType":"YulTypedName","src":"8463:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8521:27:83","value":{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"8538:2:83"},{"name":"t1","nodeType":"YulIdentifier","src":"8542:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8546:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8531:6:83"},"nodeType":"YulFunctionCall","src":"8531:17:83"},"variables":[{"name":"t3","nodeType":"YulTypedName","src":"8525:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8587:30:83","value":{"arguments":[{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"8605:2:83"},{"name":"t2","nodeType":"YulIdentifier","src":"8609:2:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8601:3:83"},"nodeType":"YulFunctionCall","src":"8601:11:83"},{"name":"t2","nodeType":"YulIdentifier","src":"8614:2:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8597:3:83"},"nodeType":"YulFunctionCall","src":"8597:20:83"},"variables":[{"name":"t4","nodeType":"YulTypedName","src":"8591:2:83","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8656:36:83","value":{"arguments":[{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"8677:2:83"},{"name":"t3","nodeType":"YulIdentifier","src":"8681:2:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8673:3:83"},"nodeType":"YulFunctionCall","src":"8673:11:83"},{"name":"t3","nodeType":"YulIdentifier","src":"8686:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8690:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"8666:6:83"},"nodeType":"YulFunctionCall","src":"8666:26:83"},"variables":[{"name":"t5","nodeType":"YulTypedName","src":"8660:2:83","type":""}]},{"nodeType":"YulAssignment","src":"8747:40:83","value":{"arguments":[{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"8764:2:83"},{"arguments":[{"name":"N","nodeType":"YulIdentifier","src":"8772:1:83"},{"name":"t5","nodeType":"YulIdentifier","src":"8775:2:83"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8768:3:83"},"nodeType":"YulFunctionCall","src":"8768:10:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8760:3:83"},"nodeType":"YulFunctionCall","src":"8760:19:83"},{"name":"t0","nodeType":"YulIdentifier","src":"8781:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8785:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8753:6:83"},"nodeType":"YulFunctionCall","src":"8753:34:83"},"variableNames":[{"name":"t2","nodeType":"YulIdentifier","src":"8747:2:83"}]},{"nodeType":"YulAssignment","src":"8842:40:83","value":{"arguments":[{"arguments":[{"name":"t4","nodeType":"YulIdentifier","src":"8859:2:83"},{"arguments":[{"name":"N","nodeType":"YulIdentifier","src":"8867:1:83"},{"name":"t3","nodeType":"YulIdentifier","src":"8870:2:83"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8863:3:83"},"nodeType":"YulFunctionCall","src":"8863:10:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8855:3:83"},"nodeType":"YulFunctionCall","src":"8855:19:83"},{"name":"t1","nodeType":"YulIdentifier","src":"8876:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"8880:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8848:6:83"},"nodeType":"YulFunctionCall","src":"8848:34:83"},"variableNames":[{"name":"t3","nodeType":"YulIdentifier","src":"8842:2:83"}]},{"nodeType":"YulAssignment","src":"8921:149:83","value":{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"8951:2:83"},{"kind":"number","nodeType":"YulLiteral","src":"8971:66:83","type":"","value":"0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5"},{"name":"N","nodeType":"YulIdentifier","src":"9055:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"8927:6:83"},"nodeType":"YulFunctionCall","src":"8927:143:83"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8921:2:83"}]},{"nodeType":"YulAssignment","src":"9083:149:83","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"9113:2:83"},{"kind":"number","nodeType":"YulLiteral","src":"9133:66:83","type":"","value":"0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2"},{"name":"N","nodeType":"YulIdentifier","src":"9217:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"9089:6:83"},"nodeType":"YulFunctionCall","src":"9089:143:83"},"variableNames":[{"name":"t1","nodeType":"YulIdentifier","src":"9083:2:83"}]},{"nodeType":"YulAssignment","src":"9268:27:83","value":{"arguments":[{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"9284:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"9291:2:83","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9280:3:83"},"nodeType":"YulFunctionCall","src":"9280:14:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9274:5:83"},"nodeType":"YulFunctionCall","src":"9274:21:83"},"variableNames":[{"name":"t2","nodeType":"YulIdentifier","src":"9268:2:83"}]},{"nodeType":"YulAssignment","src":"9308:27:83","value":{"arguments":[{"arguments":[{"name":"point","nodeType":"YulIdentifier","src":"9324:5:83"},{"kind":"number","nodeType":"YulLiteral","src":"9331:2:83","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9320:3:83"},"nodeType":"YulFunctionCall","src":"9320:14:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9314:5:83"},"nodeType":"YulFunctionCall","src":"9314:21:83"},"variableNames":[{"name":"t3","nodeType":"YulIdentifier","src":"9308:2:83"}]},{"nodeType":"YulAssignment","src":"9369:61:83","value":{"arguments":[{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"9389:2:83"},{"name":"t3","nodeType":"YulIdentifier","src":"9393:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"9397:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"9382:6:83"},"nodeType":"YulFunctionCall","src":"9382:17:83"},{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"9408:2:83"},{"arguments":[{"name":"N","nodeType":"YulIdentifier","src":"9416:1:83"},{"name":"t3","nodeType":"YulIdentifier","src":"9419:2:83"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9412:3:83"},"nodeType":"YulFunctionCall","src":"9412:10:83"},{"name":"N","nodeType":"YulIdentifier","src":"9424:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"9401:6:83"},"nodeType":"YulFunctionCall","src":"9401:25:83"},{"name":"N","nodeType":"YulIdentifier","src":"9428:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9375:6:83"},"nodeType":"YulFunctionCall","src":"9375:55:83"},"variableNames":[{"name":"t4","nodeType":"YulIdentifier","src":"9369:2:83"}]},{"nodeType":"YulAssignment","src":"9443:31:83","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9460:1:83","type":"","value":"1"},{"name":"t2","nodeType":"YulIdentifier","src":"9463:2:83"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"9456:3:83"},"nodeType":"YulFunctionCall","src":"9456:10:83"},{"name":"t3","nodeType":"YulIdentifier","src":"9468:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"9472:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9449:6:83"},"nodeType":"YulFunctionCall","src":"9449:25:83"},"variableNames":[{"name":"t3","nodeType":"YulIdentifier","src":"9443:2:83"}]},{"nodeType":"YulAssignment","src":"9522:41:83","value":{"arguments":[{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9543:2:83"},{"name":"t4","nodeType":"YulIdentifier","src":"9547:2:83"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"9540:2:83"},"nodeType":"YulFunctionCall","src":"9540:10:83"},{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"9555:2:83"},{"name":"t3","nodeType":"YulIdentifier","src":"9559:2:83"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"9552:2:83"},"nodeType":"YulFunctionCall","src":"9552:10:83"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9536:3:83"},"nodeType":"YulFunctionCall","src":"9536:27:83"},"variableNames":[{"name":"_isOnCurve","nodeType":"YulIdentifier","src":"9522:10:83"}]}]},"evmVersion":"london","externalReferences":[{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8484:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8546:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8690:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8772:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8785:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8867:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"8880:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9055:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9217:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9397:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9416:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9424:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9428:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"9472:1:83","valueSize":1},{"declaration":17398,"isOffset":false,"isSlot":false,"src":"9522:10:83","valueSize":1},{"declaration":17395,"isOffset":false,"isSlot":false,"src":"8374:5:83","valueSize":1},{"declaration":17395,"isOffset":false,"isSlot":false,"src":"8413:5:83","valueSize":1},{"declaration":17395,"isOffset":false,"isSlot":false,"src":"9284:5:83","valueSize":1},{"declaration":17395,"isOffset":false,"isSlot":false,"src":"9324:5:83","valueSize":1}],"id":17400,"nodeType":"InlineAssembly","src":"8313:1260:83"}]},"id":17402,"implemented":true,"kind":"function","modifiers":[],"name":"isOnCurveG2","nameLocation":"8134:11:83","nodeType":"FunctionDefinition","parameters":{"id":17396,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17395,"mutability":"mutable","name":"point","nameLocation":"8164:5:83","nodeType":"VariableDeclaration","scope":17402,"src":"8146:23:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":17392,"name":"uint256","nodeType":"ElementaryTypeName","src":"8146:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17394,"length":{"hexValue":"34","id":17393,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8154:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"8146:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"8145:25:83"},"returnParameters":{"id":17399,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17398,"mutability":"mutable","name":"_isOnCurve","nameLocation":"8223:10:83","nodeType":"VariableDeclaration","scope":17402,"src":"8218:15:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17397,"name":"bool","nodeType":"ElementaryTypeName","src":"8218:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"8217:17:83"},"scope":17557,"src":"8125:1454:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17428,"nodeType":"Block","src":"9659:80:83","statements":[{"expression":{"id":17416,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17411,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17407,"src":"9669:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17414,"name":"xx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17404,"src":"9688:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":17412,"name":"ModexpSqrt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17813,"src":"9673:10:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ModexpSqrt_$17813_$","typeString":"type(library ModexpSqrt)"}},"id":17413,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"run","nodeType":"MemberAccess","referencedDeclaration":17812,"src":"9673:14:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":17415,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9673:18:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9669:22:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17417,"nodeType":"ExpressionStatement","src":"9669:22:83"},{"expression":{"id":17426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17418,"name":"hasRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17409,"src":"9701:7:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":17420,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17407,"src":"9718:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17421,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17407,"src":"9721:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17422,"name":"N","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16610,"src":"9724:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17419,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"9711:6:83","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":17423,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9711:15:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":17424,"name":"xx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17404,"src":"9730:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9711:21:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9701:31:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17427,"nodeType":"ExpressionStatement","src":"9701:31:83"}]},"id":17429,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"9594:4:83","nodeType":"FunctionDefinition","parameters":{"id":17405,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17404,"mutability":"mutable","name":"xx","nameLocation":"9607:2:83","nodeType":"VariableDeclaration","scope":17429,"src":"9599:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17403,"name":"uint256","nodeType":"ElementaryTypeName","src":"9599:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9598:12:83"},"returnParameters":{"id":17410,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17407,"mutability":"mutable","name":"x","nameLocation":"9642:1:83","nodeType":"VariableDeclaration","scope":17429,"src":"9634:9:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17406,"name":"uint256","nodeType":"ElementaryTypeName","src":"9634:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17409,"mutability":"mutable","name":"hasRoot","nameLocation":"9650:7:83","nodeType":"VariableDeclaration","scope":17429,"src":"9645:12:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17408,"name":"bool","nodeType":"ElementaryTypeName","src":"9645:4:83","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"9633:25:83"},"scope":17557,"src":"9585:154:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17441,"nodeType":"Block","src":"9805:44:83","statements":[{"expression":{"arguments":[{"id":17438,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17431,"src":"9840:1:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":17436,"name":"ModexpInverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17802,"src":"9822:13:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ModexpInverse_$17802_$","typeString":"type(library ModexpInverse)"}},"id":17437,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"run","nodeType":"MemberAccess","referencedDeclaration":17801,"src":"9822:17:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":17439,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9822:20:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":17435,"id":17440,"nodeType":"Return","src":"9815:27:83"}]},"id":17442,"implemented":true,"kind":"function","modifiers":[],"name":"inverse","nameLocation":"9754:7:83","nodeType":"FunctionDefinition","parameters":{"id":17432,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17431,"mutability":"mutable","name":"a","nameLocation":"9770:1:83","nodeType":"VariableDeclaration","scope":17442,"src":"9762:9:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17430,"name":"uint256","nodeType":"ElementaryTypeName","src":"9762:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9761:11:83"},"returnParameters":{"id":17435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17434,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17442,"src":"9796:7:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17433,"name":"uint256","nodeType":"ElementaryTypeName","src":"9796:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9795:9:83"},"scope":17557,"src":"9745:104:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17477,"nodeType":"Block","src":"9985:658:83","statements":[{"assignments":[17454],"declarations":[{"constant":false,"id":17454,"mutability":"mutable","name":"_msg","nameLocation":"10008:4:83","nodeType":"VariableDeclaration","scope":17477,"src":"9995:17:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17453,"name":"bytes","nodeType":"ElementaryTypeName","src":"9995:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":17459,"initialValue":{"arguments":[{"id":17456,"name":"domain","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17444,"src":"10029:6:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":17457,"name":"messages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17446,"src":"10037:8:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17455,"name":"expandMsgTo96","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17556,"src":"10015:13:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes32,bytes memory) pure returns (bytes memory)"}},"id":17458,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10015:31:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9995:51:83"},{"assignments":[17461],"declarations":[{"constant":false,"id":17461,"mutability":"mutable","name":"u0","nameLocation":"10064:2:83","nodeType":"VariableDeclaration","scope":17477,"src":"10056:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17460,"name":"uint256","nodeType":"ElementaryTypeName","src":"10056:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17462,"nodeType":"VariableDeclarationStatement","src":"10056:10:83"},{"assignments":[17464],"declarations":[{"constant":false,"id":17464,"mutability":"mutable","name":"u1","nameLocation":"10084:2:83","nodeType":"VariableDeclaration","scope":17477,"src":"10076:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17463,"name":"uint256","nodeType":"ElementaryTypeName","src":"10076:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17465,"nodeType":"VariableDeclarationStatement","src":"10076:10:83"},{"assignments":[17467],"declarations":[{"constant":false,"id":17467,"mutability":"mutable","name":"a0","nameLocation":"10104:2:83","nodeType":"VariableDeclaration","scope":17477,"src":"10096:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17466,"name":"uint256","nodeType":"ElementaryTypeName","src":"10096:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17468,"nodeType":"VariableDeclarationStatement","src":"10096:10:83"},{"assignments":[17470],"declarations":[{"constant":false,"id":17470,"mutability":"mutable","name":"a1","nameLocation":"10124:2:83","nodeType":"VariableDeclaration","scope":17477,"src":"10116:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17469,"name":"uint256","nodeType":"ElementaryTypeName","src":"10116:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17471,"nodeType":"VariableDeclarationStatement","src":"10116:10:83"},{"AST":{"nodeType":"YulBlock","src":"10209:403:83","statements":[{"nodeType":"YulVariableDeclaration","src":"10223:22:83","value":{"arguments":[{"name":"_msg","nodeType":"YulIdentifier","src":"10236:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"10242:2:83","type":"","value":"24"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10232:3:83"},"nodeType":"YulFunctionCall","src":"10232:13:83"},"variables":[{"name":"p","nodeType":"YulTypedName","src":"10227:1:83","type":""}]},{"nodeType":"YulAssignment","src":"10258:27:83","value":{"arguments":[{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"10274:1:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10268:5:83"},"nodeType":"YulFunctionCall","src":"10268:8:83"},{"name":"MASK24","nodeType":"YulIdentifier","src":"10278:6:83"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10264:3:83"},"nodeType":"YulFunctionCall","src":"10264:21:83"},"variableNames":[{"name":"u1","nodeType":"YulIdentifier","src":"10258:2:83"}]},{"nodeType":"YulAssignment","src":"10298:18:83","value":{"arguments":[{"name":"_msg","nodeType":"YulIdentifier","src":"10307:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"10313:2:83","type":"","value":"48"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10303:3:83"},"nodeType":"YulFunctionCall","src":"10303:13:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"10298:1:83"}]},{"nodeType":"YulAssignment","src":"10329:27:83","value":{"arguments":[{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"10345:1:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10339:5:83"},"nodeType":"YulFunctionCall","src":"10339:8:83"},{"name":"MASK24","nodeType":"YulIdentifier","src":"10349:6:83"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10335:3:83"},"nodeType":"YulFunctionCall","src":"10335:21:83"},"variableNames":[{"name":"u0","nodeType":"YulIdentifier","src":"10329:2:83"}]},{"nodeType":"YulAssignment","src":"10369:39:83","value":{"arguments":[{"arguments":[{"name":"u1","nodeType":"YulIdentifier","src":"10389:2:83"},{"name":"T24","nodeType":"YulIdentifier","src":"10393:3:83"},{"name":"N","nodeType":"YulIdentifier","src":"10398:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10382:6:83"},"nodeType":"YulFunctionCall","src":"10382:18:83"},{"name":"u0","nodeType":"YulIdentifier","src":"10402:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"10406:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"10375:6:83"},"nodeType":"YulFunctionCall","src":"10375:33:83"},"variableNames":[{"name":"a0","nodeType":"YulIdentifier","src":"10369:2:83"}]},{"nodeType":"YulAssignment","src":"10421:18:83","value":{"arguments":[{"name":"_msg","nodeType":"YulIdentifier","src":"10430:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"10436:2:83","type":"","value":"72"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10426:3:83"},"nodeType":"YulFunctionCall","src":"10426:13:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"10421:1:83"}]},{"nodeType":"YulAssignment","src":"10452:27:83","value":{"arguments":[{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"10468:1:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10462:5:83"},"nodeType":"YulFunctionCall","src":"10462:8:83"},{"name":"MASK24","nodeType":"YulIdentifier","src":"10472:6:83"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10458:3:83"},"nodeType":"YulFunctionCall","src":"10458:21:83"},"variableNames":[{"name":"u1","nodeType":"YulIdentifier","src":"10452:2:83"}]},{"nodeType":"YulAssignment","src":"10492:18:83","value":{"arguments":[{"name":"_msg","nodeType":"YulIdentifier","src":"10501:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"10507:2:83","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10497:3:83"},"nodeType":"YulFunctionCall","src":"10497:13:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"10492:1:83"}]},{"nodeType":"YulAssignment","src":"10523:27:83","value":{"arguments":[{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"10539:1:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10533:5:83"},"nodeType":"YulFunctionCall","src":"10533:8:83"},{"name":"MASK24","nodeType":"YulIdentifier","src":"10543:6:83"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10529:3:83"},"nodeType":"YulFunctionCall","src":"10529:21:83"},"variableNames":[{"name":"u0","nodeType":"YulIdentifier","src":"10523:2:83"}]},{"nodeType":"YulAssignment","src":"10563:39:83","value":{"arguments":[{"arguments":[{"name":"u1","nodeType":"YulIdentifier","src":"10583:2:83"},{"name":"T24","nodeType":"YulIdentifier","src":"10587:3:83"},{"name":"N","nodeType":"YulIdentifier","src":"10592:1:83"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10576:6:83"},"nodeType":"YulFunctionCall","src":"10576:18:83"},{"name":"u0","nodeType":"YulIdentifier","src":"10596:2:83"},{"name":"N","nodeType":"YulIdentifier","src":"10600:1:83"}],"functionName":{"name":"addmod","nodeType":"YulIdentifier","src":"10569:6:83"},"nodeType":"YulFunctionCall","src":"10569:33:83"},"variableNames":[{"name":"a1","nodeType":"YulIdentifier","src":"10563:2:83"}]}]},"evmVersion":"london","externalReferences":[{"declaration":16634,"isOffset":false,"isSlot":false,"src":"10278:6:83","valueSize":1},{"declaration":16634,"isOffset":false,"isSlot":false,"src":"10349:6:83","valueSize":1},{"declaration":16634,"isOffset":false,"isSlot":false,"src":"10472:6:83","valueSize":1},{"declaration":16634,"isOffset":false,"isSlot":false,"src":"10543:6:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"10398:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"10406:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"10592:1:83","valueSize":1},{"declaration":16610,"isOffset":false,"isSlot":false,"src":"10600:1:83","valueSize":1},{"declaration":16631,"isOffset":false,"isSlot":false,"src":"10393:3:83","valueSize":1},{"declaration":16631,"isOffset":false,"isSlot":false,"src":"10587:3:83","valueSize":1},{"declaration":17454,"isOffset":false,"isSlot":false,"src":"10236:4:83","valueSize":1},{"declaration":17454,"isOffset":false,"isSlot":false,"src":"10307:4:83","valueSize":1},{"declaration":17454,"isOffset":false,"isSlot":false,"src":"10430:4:83","valueSize":1},{"declaration":17454,"isOffset":false,"isSlot":false,"src":"10501:4:83","valueSize":1},{"declaration":17467,"isOffset":false,"isSlot":false,"src":"10369:2:83","valueSize":1},{"declaration":17470,"isOffset":false,"isSlot":false,"src":"10563:2:83","valueSize":1},{"declaration":17461,"isOffset":false,"isSlot":false,"src":"10329:2:83","valueSize":1},{"declaration":17461,"isOffset":false,"isSlot":false,"src":"10402:2:83","valueSize":1},{"declaration":17461,"isOffset":false,"isSlot":false,"src":"10523:2:83","valueSize":1},{"declaration":17461,"isOffset":false,"isSlot":false,"src":"10596:2:83","valueSize":1},{"declaration":17464,"isOffset":false,"isSlot":false,"src":"10258:2:83","valueSize":1},{"declaration":17464,"isOffset":false,"isSlot":false,"src":"10389:2:83","valueSize":1},{"declaration":17464,"isOffset":false,"isSlot":false,"src":"10452:2:83","valueSize":1},{"declaration":17464,"isOffset":false,"isSlot":false,"src":"10583:2:83","valueSize":1}],"id":17472,"nodeType":"InlineAssembly","src":"10200:412:83"},{"expression":{"components":[{"id":17473,"name":"a0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17467,"src":"10629:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17474,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17470,"src":"10633:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17475,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"10628:8:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"functionReturnParameters":17452,"id":17476,"nodeType":"Return","src":"10621:15:83"}]},"id":17478,"implemented":true,"kind":"function","modifiers":[],"name":"hashToField","nameLocation":"9864:11:83","nodeType":"FunctionDefinition","parameters":{"id":17447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17444,"mutability":"mutable","name":"domain","nameLocation":"9884:6:83","nodeType":"VariableDeclaration","scope":17478,"src":"9876:14:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":17443,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9876:7:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":17446,"mutability":"mutable","name":"messages","nameLocation":"9905:8:83","nodeType":"VariableDeclaration","scope":17478,"src":"9892:21:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17445,"name":"bytes","nodeType":"ElementaryTypeName","src":"9892:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9875:39:83"},"returnParameters":{"id":17452,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17451,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17478,"src":"9962:17:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":17448,"name":"uint256","nodeType":"ElementaryTypeName","src":"9962:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17450,"length":{"hexValue":"32","id":17449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9970:1:83","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"9962:10:83","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"src":"9961:19:83"},"scope":17557,"src":"9855:788:83","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":17555,"nodeType":"Block","src":"10775:2461:83","statements":[{"assignments":[17488],"declarations":[{"constant":false,"id":17488,"mutability":"mutable","name":"t0","nameLocation":"10868:2:83","nodeType":"VariableDeclaration","scope":17555,"src":"10860:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17487,"name":"uint256","nodeType":"ElementaryTypeName","src":"10860:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17491,"initialValue":{"expression":{"id":17489,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17482,"src":"10873:7:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":17490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"10873:14:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10860:27:83"},{"assignments":[17493],"declarations":[{"constant":false,"id":17493,"mutability":"mutable","name":"msg0","nameLocation":"10910:4:83","nodeType":"VariableDeclaration","scope":17555,"src":"10897:17:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17492,"name":"bytes","nodeType":"ElementaryTypeName","src":"10897:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":17504,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3332","id":17496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10927:2:83","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":17497,"name":"t0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17488,"src":"10932:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10927:7:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3634","id":17499,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10937:2:83","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"10927:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"34","id":17501,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10942:1:83","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"10927:16:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":17495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"10917:9:83","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":17494,"name":"bytes","nodeType":"ElementaryTypeName","src":"10921:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":17503,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10917:27:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"10897:47:83"},{"assignments":[17506],"declarations":[{"constant":false,"id":17506,"mutability":"mutable","name":"out","nameLocation":"10967:3:83","nodeType":"VariableDeclaration","scope":17555,"src":"10954:16:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17505,"name":"bytes","nodeType":"ElementaryTypeName","src":"10954:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":17511,"initialValue":{"arguments":[{"hexValue":"3936","id":17509,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10983:2:83","typeDescriptions":{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},"value":"96"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"}],"id":17508,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"10973:9:83","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":17507,"name":"bytes","nodeType":"ElementaryTypeName","src":"10977:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":17510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10973:13:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"10954:32:83"},{"AST":{"nodeType":"YulBlock","src":"11083:521:83","statements":[{"nodeType":"YulVariableDeclaration","src":"11097:22:83","value":{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"11110:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"11116:2:83","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11106:3:83"},"nodeType":"YulFunctionCall","src":"11106:13:83"},"variables":[{"name":"p","nodeType":"YulTypedName","src":"11101:1:83","type":""}]},{"body":{"nodeType":"YulBlock","src":"11237:82:83","statements":[{"expression":{"arguments":[{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11266:1:83"},{"name":"z","nodeType":"YulIdentifier","src":"11269:1:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11262:3:83"},"nodeType":"YulFunctionCall","src":"11262:9:83"},{"arguments":[{"arguments":[{"name":"message","nodeType":"YulIdentifier","src":"11283:7:83"},{"arguments":[{"name":"z","nodeType":"YulIdentifier","src":"11296:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11299:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11292:3:83"},"nodeType":"YulFunctionCall","src":"11292:10:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11279:3:83"},"nodeType":"YulFunctionCall","src":"11279:24:83"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11273:5:83"},"nodeType":"YulFunctionCall","src":"11273:31:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11255:6:83"},"nodeType":"YulFunctionCall","src":"11255:50:83"},"nodeType":"YulExpressionStatement","src":"11255:50:83"}]},"condition":{"arguments":[{"name":"z","nodeType":"YulIdentifier","src":"11182:1:83"},{"name":"t0","nodeType":"YulIdentifier","src":"11185:2:83"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11179:2:83"},"nodeType":"YulFunctionCall","src":"11179:9:83"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"11189:47:83","statements":[{"nodeType":"YulAssignment","src":"11207:15:83","value":{"arguments":[{"name":"z","nodeType":"YulIdentifier","src":"11216:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11219:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11212:3:83"},"nodeType":"YulFunctionCall","src":"11212:10:83"},"variableNames":[{"name":"z","nodeType":"YulIdentifier","src":"11207:1:83"}]}]},"pre":{"nodeType":"YulBlock","src":"11136:42:83","statements":[{"nodeType":"YulVariableDeclaration","src":"11154:10:83","value":{"kind":"number","nodeType":"YulLiteral","src":"11163:1:83","type":"","value":"0"},"variables":[{"name":"z","nodeType":"YulTypedName","src":"11158:1:83","type":""}]}]},"src":"11132:187:83"},{"nodeType":"YulAssignment","src":"11332:15:83","value":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11341:1:83"},{"name":"t0","nodeType":"YulIdentifier","src":"11344:2:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11337:3:83"},"nodeType":"YulFunctionCall","src":"11337:10:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"11332:1:83"}]},{"expression":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11369:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11372:1:83","type":"","value":"0"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"11361:7:83"},"nodeType":"YulFunctionCall","src":"11361:13:83"},"nodeType":"YulExpressionStatement","src":"11361:13:83"},{"nodeType":"YulAssignment","src":"11387:14:83","value":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11396:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11399:1:83","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11392:3:83"},"nodeType":"YulFunctionCall","src":"11392:9:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"11387:1:83"}]},{"expression":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11422:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11425:2:83","type":"","value":"96"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"11414:7:83"},"nodeType":"YulFunctionCall","src":"11414:14:83"},"nodeType":"YulExpressionStatement","src":"11414:14:83"},{"nodeType":"YulAssignment","src":"11441:14:83","value":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11450:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11453:1:83","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11446:3:83"},"nodeType":"YulFunctionCall","src":"11446:9:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"11441:1:83"}]},{"expression":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11476:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11479:1:83","type":"","value":"0"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"11468:7:83"},"nodeType":"YulFunctionCall","src":"11468:13:83"},"nodeType":"YulExpressionStatement","src":"11468:13:83"},{"nodeType":"YulAssignment","src":"11494:14:83","value":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11503:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11506:1:83","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11499:3:83"},"nodeType":"YulFunctionCall","src":"11499:9:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"11494:1:83"}]},{"expression":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11529:1:83"},{"name":"domain","nodeType":"YulIdentifier","src":"11532:6:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11522:6:83"},"nodeType":"YulFunctionCall","src":"11522:17:83"},"nodeType":"YulExpressionStatement","src":"11522:17:83"},{"nodeType":"YulAssignment","src":"11552:15:83","value":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11561:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11564:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11557:3:83"},"nodeType":"YulFunctionCall","src":"11557:10:83"},"variableNames":[{"name":"p","nodeType":"YulIdentifier","src":"11552:1:83"}]},{"expression":{"arguments":[{"name":"p","nodeType":"YulIdentifier","src":"11588:1:83"},{"kind":"number","nodeType":"YulLiteral","src":"11591:2:83","type":"","value":"32"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"11580:7:83"},"nodeType":"YulFunctionCall","src":"11580:14:83"},"nodeType":"YulExpressionStatement","src":"11580:14:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17480,"isOffset":false,"isSlot":false,"src":"11532:6:83","valueSize":1},{"declaration":17482,"isOffset":false,"isSlot":false,"src":"11283:7:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"11110:4:83","valueSize":1},{"declaration":17488,"isOffset":false,"isSlot":false,"src":"11185:2:83","valueSize":1},{"declaration":17488,"isOffset":false,"isSlot":false,"src":"11344:2:83","valueSize":1}],"id":17512,"nodeType":"InlineAssembly","src":"11074:530:83"},{"assignments":[17514],"declarations":[{"constant":false,"id":17514,"mutability":"mutable","name":"b0","nameLocation":"11621:2:83","nodeType":"VariableDeclaration","scope":17555,"src":"11613:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":17513,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11613:7:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":17518,"initialValue":{"arguments":[{"id":17516,"name":"msg0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17493,"src":"11633:4:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17515,"name":"sha256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-22,"src":"11626:6:83","typeDescriptions":{"typeIdentifier":"t_function_sha256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":17517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11626:12:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"11613:25:83"},{"assignments":[17520],"declarations":[{"constant":false,"id":17520,"mutability":"mutable","name":"bi","nameLocation":"11656:2:83","nodeType":"VariableDeclaration","scope":17555,"src":"11648:10:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":17519,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11648:7:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":17521,"nodeType":"VariableDeclarationStatement","src":"11648:10:83"},{"expression":{"id":17526,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17522,"name":"t0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17488,"src":"11668:2:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"},"id":17525,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3332","id":17523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11673:2:83","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3334","id":17524,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11678:2:83","typeDescriptions":{"typeIdentifier":"t_rational_34_by_1","typeString":"int_const 34"},"value":"34"},"src":"11673:7:83","typeDescriptions":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"}},"src":"11668:12:83","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17527,"nodeType":"ExpressionStatement","src":"11668:12:83"},{"AST":{"nodeType":"YulBlock","src":"11803:40:83","statements":[{"expression":{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"11824:4:83"},{"name":"t0","nodeType":"YulIdentifier","src":"11830:2:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11817:6:83"},"nodeType":"YulFunctionCall","src":"11817:16:83"},"nodeType":"YulExpressionStatement","src":"11817:16:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17493,"isOffset":false,"isSlot":false,"src":"11824:4:83","valueSize":1},{"declaration":17488,"isOffset":false,"isSlot":false,"src":"11830:2:83","valueSize":1}],"id":17528,"nodeType":"InlineAssembly","src":"11794:49:83"},{"AST":{"nodeType":"YulBlock","src":"11941:177:83","statements":[{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"11966:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"11972:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11962:3:83"},"nodeType":"YulFunctionCall","src":"11962:13:83"},{"name":"b0","nodeType":"YulIdentifier","src":"11977:2:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11955:6:83"},"nodeType":"YulFunctionCall","src":"11955:25:83"},"nodeType":"YulExpressionStatement","src":"11955:25:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12005:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12011:2:83","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12001:3:83"},"nodeType":"YulFunctionCall","src":"12001:13:83"},{"kind":"number","nodeType":"YulLiteral","src":"12016:1:83","type":"","value":"1"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"11993:7:83"},"nodeType":"YulFunctionCall","src":"11993:25:83"},"nodeType":"YulExpressionStatement","src":"11993:25:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12042:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12048:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12038:3:83"},"nodeType":"YulFunctionCall","src":"12038:13:83"},{"name":"domain","nodeType":"YulIdentifier","src":"12053:6:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12031:6:83"},"nodeType":"YulFunctionCall","src":"12031:29:83"},"nodeType":"YulExpressionStatement","src":"12031:29:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12085:4:83"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12095:2:83","type":"","value":"32"},{"kind":"number","nodeType":"YulLiteral","src":"12099:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12091:3:83"},"nodeType":"YulFunctionCall","src":"12091:11:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12081:3:83"},"nodeType":"YulFunctionCall","src":"12081:22:83"},{"kind":"number","nodeType":"YulLiteral","src":"12105:2:83","type":"","value":"32"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"12073:7:83"},"nodeType":"YulFunctionCall","src":"12073:35:83"},"nodeType":"YulExpressionStatement","src":"12073:35:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17514,"isOffset":false,"isSlot":false,"src":"11977:2:83","valueSize":1},{"declaration":17480,"isOffset":false,"isSlot":false,"src":"12053:6:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"11966:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12005:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12042:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12085:4:83","valueSize":1}],"id":17529,"nodeType":"InlineAssembly","src":"11932:186:83"},{"expression":{"id":17534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17530,"name":"bi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17520,"src":"12128:2:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17532,"name":"msg0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17493,"src":"12140:4:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17531,"name":"sha256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-22,"src":"12133:6:83","typeDescriptions":{"typeIdentifier":"t_function_sha256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":17533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12133:12:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"12128:17:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":17535,"nodeType":"ExpressionStatement","src":"12128:17:83"},{"AST":{"nodeType":"YulBlock","src":"12229:48:83","statements":[{"expression":{"arguments":[{"arguments":[{"name":"out","nodeType":"YulIdentifier","src":"12254:3:83"},{"kind":"number","nodeType":"YulLiteral","src":"12259:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12250:3:83"},"nodeType":"YulFunctionCall","src":"12250:12:83"},{"name":"bi","nodeType":"YulIdentifier","src":"12264:2:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12243:6:83"},"nodeType":"YulFunctionCall","src":"12243:24:83"},"nodeType":"YulExpressionStatement","src":"12243:24:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17520,"isOffset":false,"isSlot":false,"src":"12264:2:83","valueSize":1},{"declaration":17506,"isOffset":false,"isSlot":false,"src":"12254:3:83","valueSize":1}],"id":17536,"nodeType":"InlineAssembly","src":"12220:57:83"},{"AST":{"nodeType":"YulBlock","src":"12375:209:83","statements":[{"nodeType":"YulVariableDeclaration","src":"12389:20:83","value":{"arguments":[{"name":"b0","nodeType":"YulIdentifier","src":"12402:2:83"},{"name":"bi","nodeType":"YulIdentifier","src":"12406:2:83"}],"functionName":{"name":"xor","nodeType":"YulIdentifier","src":"12398:3:83"},"nodeType":"YulFunctionCall","src":"12398:11:83"},"variables":[{"name":"t","nodeType":"YulTypedName","src":"12393:1:83","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12433:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12439:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12429:3:83"},"nodeType":"YulFunctionCall","src":"12429:13:83"},{"name":"t","nodeType":"YulIdentifier","src":"12444:1:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12422:6:83"},"nodeType":"YulFunctionCall","src":"12422:24:83"},"nodeType":"YulExpressionStatement","src":"12422:24:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12471:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12477:2:83","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12467:3:83"},"nodeType":"YulFunctionCall","src":"12467:13:83"},{"kind":"number","nodeType":"YulLiteral","src":"12482:1:83","type":"","value":"2"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"12459:7:83"},"nodeType":"YulFunctionCall","src":"12459:25:83"},"nodeType":"YulExpressionStatement","src":"12459:25:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12508:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12514:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12504:3:83"},"nodeType":"YulFunctionCall","src":"12504:13:83"},{"name":"domain","nodeType":"YulIdentifier","src":"12519:6:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12497:6:83"},"nodeType":"YulFunctionCall","src":"12497:29:83"},"nodeType":"YulExpressionStatement","src":"12497:29:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12551:4:83"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12561:2:83","type":"","value":"32"},{"kind":"number","nodeType":"YulLiteral","src":"12565:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12557:3:83"},"nodeType":"YulFunctionCall","src":"12557:11:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12547:3:83"},"nodeType":"YulFunctionCall","src":"12547:22:83"},{"kind":"number","nodeType":"YulLiteral","src":"12571:2:83","type":"","value":"32"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"12539:7:83"},"nodeType":"YulFunctionCall","src":"12539:35:83"},"nodeType":"YulExpressionStatement","src":"12539:35:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17514,"isOffset":false,"isSlot":false,"src":"12402:2:83","valueSize":1},{"declaration":17520,"isOffset":false,"isSlot":false,"src":"12406:2:83","valueSize":1},{"declaration":17480,"isOffset":false,"isSlot":false,"src":"12519:6:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12433:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12471:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12508:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12551:4:83","valueSize":1}],"id":17537,"nodeType":"InlineAssembly","src":"12366:218:83"},{"expression":{"id":17542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17538,"name":"bi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17520,"src":"12594:2:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17540,"name":"msg0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17493,"src":"12606:4:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17539,"name":"sha256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-22,"src":"12599:6:83","typeDescriptions":{"typeIdentifier":"t_function_sha256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":17541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12599:12:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"12594:17:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":17543,"nodeType":"ExpressionStatement","src":"12594:17:83"},{"AST":{"nodeType":"YulBlock","src":"12695:48:83","statements":[{"expression":{"arguments":[{"arguments":[{"name":"out","nodeType":"YulIdentifier","src":"12720:3:83"},{"kind":"number","nodeType":"YulLiteral","src":"12725:2:83","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12716:3:83"},"nodeType":"YulFunctionCall","src":"12716:12:83"},{"name":"bi","nodeType":"YulIdentifier","src":"12730:2:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12709:6:83"},"nodeType":"YulFunctionCall","src":"12709:24:83"},"nodeType":"YulExpressionStatement","src":"12709:24:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17520,"isOffset":false,"isSlot":false,"src":"12730:2:83","valueSize":1},{"declaration":17506,"isOffset":false,"isSlot":false,"src":"12720:3:83","valueSize":1}],"id":17544,"nodeType":"InlineAssembly","src":"12686:57:83"},{"AST":{"nodeType":"YulBlock","src":"12841:209:83","statements":[{"nodeType":"YulVariableDeclaration","src":"12855:20:83","value":{"arguments":[{"name":"b0","nodeType":"YulIdentifier","src":"12868:2:83"},{"name":"bi","nodeType":"YulIdentifier","src":"12872:2:83"}],"functionName":{"name":"xor","nodeType":"YulIdentifier","src":"12864:3:83"},"nodeType":"YulFunctionCall","src":"12864:11:83"},"variables":[{"name":"t","nodeType":"YulTypedName","src":"12859:1:83","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12899:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12905:2:83","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12895:3:83"},"nodeType":"YulFunctionCall","src":"12895:13:83"},{"name":"t","nodeType":"YulIdentifier","src":"12910:1:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12888:6:83"},"nodeType":"YulFunctionCall","src":"12888:24:83"},"nodeType":"YulExpressionStatement","src":"12888:24:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12937:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12943:2:83","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12933:3:83"},"nodeType":"YulFunctionCall","src":"12933:13:83"},{"kind":"number","nodeType":"YulLiteral","src":"12948:1:83","type":"","value":"3"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"12925:7:83"},"nodeType":"YulFunctionCall","src":"12925:25:83"},"nodeType":"YulExpressionStatement","src":"12925:25:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"12974:4:83"},{"kind":"number","nodeType":"YulLiteral","src":"12980:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12970:3:83"},"nodeType":"YulFunctionCall","src":"12970:13:83"},{"name":"domain","nodeType":"YulIdentifier","src":"12985:6:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12963:6:83"},"nodeType":"YulFunctionCall","src":"12963:29:83"},"nodeType":"YulExpressionStatement","src":"12963:29:83"},{"expression":{"arguments":[{"arguments":[{"name":"msg0","nodeType":"YulIdentifier","src":"13017:4:83"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13027:2:83","type":"","value":"32"},{"kind":"number","nodeType":"YulLiteral","src":"13031:2:83","type":"","value":"65"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13023:3:83"},"nodeType":"YulFunctionCall","src":"13023:11:83"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13013:3:83"},"nodeType":"YulFunctionCall","src":"13013:22:83"},{"kind":"number","nodeType":"YulLiteral","src":"13037:2:83","type":"","value":"32"}],"functionName":{"name":"mstore8","nodeType":"YulIdentifier","src":"13005:7:83"},"nodeType":"YulFunctionCall","src":"13005:35:83"},"nodeType":"YulExpressionStatement","src":"13005:35:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17514,"isOffset":false,"isSlot":false,"src":"12868:2:83","valueSize":1},{"declaration":17520,"isOffset":false,"isSlot":false,"src":"12872:2:83","valueSize":1},{"declaration":17480,"isOffset":false,"isSlot":false,"src":"12985:6:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12899:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12937:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"12974:4:83","valueSize":1},{"declaration":17493,"isOffset":false,"isSlot":false,"src":"13017:4:83","valueSize":1}],"id":17545,"nodeType":"InlineAssembly","src":"12832:218:83"},{"expression":{"id":17550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17546,"name":"bi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17520,"src":"13060:2:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":17548,"name":"msg0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17493,"src":"13072:4:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17547,"name":"sha256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-22,"src":"13065:6:83","typeDescriptions":{"typeIdentifier":"t_function_sha256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":17549,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13065:12:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"13060:17:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":17551,"nodeType":"ExpressionStatement","src":"13060:17:83"},{"AST":{"nodeType":"YulBlock","src":"13161:48:83","statements":[{"expression":{"arguments":[{"arguments":[{"name":"out","nodeType":"YulIdentifier","src":"13186:3:83"},{"kind":"number","nodeType":"YulLiteral","src":"13191:2:83","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13182:3:83"},"nodeType":"YulFunctionCall","src":"13182:12:83"},{"name":"bi","nodeType":"YulIdentifier","src":"13196:2:83"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13175:6:83"},"nodeType":"YulFunctionCall","src":"13175:24:83"},"nodeType":"YulExpressionStatement","src":"13175:24:83"}]},"evmVersion":"london","externalReferences":[{"declaration":17520,"isOffset":false,"isSlot":false,"src":"13196:2:83","valueSize":1},{"declaration":17506,"isOffset":false,"isSlot":false,"src":"13186:3:83","valueSize":1}],"id":17552,"nodeType":"InlineAssembly","src":"13152:57:83"},{"expression":{"id":17553,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17506,"src":"13226:3:83","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":17486,"id":17554,"nodeType":"Return","src":"13219:10:83"}]},"id":17556,"implemented":true,"kind":"function","modifiers":[],"name":"expandMsgTo96","nameLocation":"10658:13:83","nodeType":"FunctionDefinition","parameters":{"id":17483,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17480,"mutability":"mutable","name":"domain","nameLocation":"10680:6:83","nodeType":"VariableDeclaration","scope":17556,"src":"10672:14:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":17479,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10672:7:83","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":17482,"mutability":"mutable","name":"message","nameLocation":"10701:7:83","nodeType":"VariableDeclaration","scope":17556,"src":"10688:20:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17481,"name":"bytes","nodeType":"ElementaryTypeName","src":"10688:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10671:38:83"},"returnParameters":{"id":17486,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17485,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17556,"src":"10757:12:83","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17484,"name":"bytes","nodeType":"ElementaryTypeName","src":"10757:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10756:14:83"},"scope":17557,"src":"10649:2587:83","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":17558,"src":"508:12730:83","usedErrors":[]}],"src":"32:13207:83"},"id":83},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol":{"ast":{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol","exportedSymbols":{"BNPairingPrecompileCostEstimator":[17789]},"id":17790,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17559,"literals":["solidity",">=","0.6",".12"],"nodeType":"PragmaDirective","src":"32:25:84"},{"abstract":false,"baseContracts":[],"canonicalName":"BNPairingPrecompileCostEstimator","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17789,"linearizedBaseContracts":[17789],"name":"BNPairingPrecompileCostEstimator","nameLocation":"68:32:84","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"93822557","id":17561,"mutability":"mutable","name":"baseCost","nameLocation":"122:8:84","nodeType":"VariableDeclaration","scope":17789,"src":"107:23:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17560,"name":"uint256","nodeType":"ElementaryTypeName","src":"107:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"ebfd94b2","id":17563,"mutability":"mutable","name":"perPairCost","nameLocation":"151:11:84","nodeType":"VariableDeclaration","scope":17789,"src":"136:26:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17562,"name":"uint256","nodeType":"ElementaryTypeName","src":"136:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":true,"id":17566,"mutability":"constant","name":"G1_X","nameLocation":"214:4:84","nodeType":"VariableDeclaration","scope":17789,"src":"189:33:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17564,"name":"uint256","nodeType":"ElementaryTypeName","src":"189:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":17565,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"221:1:84","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"private"},{"constant":true,"id":17569,"mutability":"constant","name":"G1_Y","nameLocation":"253:4:84","nodeType":"VariableDeclaration","scope":17789,"src":"228:33:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17567,"name":"uint256","nodeType":"ElementaryTypeName","src":"228:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32","id":17568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"260:1:84","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"visibility":"private"},{"constant":true,"id":17572,"mutability":"constant","name":"G2_X0","nameLocation":"336:5:84","nodeType":"VariableDeclaration","scope":17789,"src":"311:110:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17570,"name":"uint256","nodeType":"ElementaryTypeName","src":"311:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3130383537303436393939303233303537313335393434353730373632323332383239343831333730373536333539353738353138303836393930353139393933323835363535383532373831","id":17571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"344:77:84","typeDescriptions":{"typeIdentifier":"t_rational_10857046999023057135944570762232829481370756359578518086990519993285655852781_by_1","typeString":"int_const 1085...(69 digits omitted)...2781"},"value":"10857046999023057135944570762232829481370756359578518086990519993285655852781"},"visibility":"private"},{"constant":true,"id":17575,"mutability":"constant","name":"G2_X1","nameLocation":"475:5:84","nodeType":"VariableDeclaration","scope":17789,"src":"450:110:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17573,"name":"uint256","nodeType":"ElementaryTypeName","src":"450:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3131353539373332303332393836333837313037393931303034303231333932323835373833393235383132383631383231313932353330393137343033313531343532333931383035363334","id":17574,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"483:77:84","typeDescriptions":{"typeIdentifier":"t_rational_11559732032986387107991004021392285783925812861821192530917403151452391805634_by_1","typeString":"int_const 1155...(69 digits omitted)...5634"},"value":"11559732032986387107991004021392285783925812861821192530917403151452391805634"},"visibility":"private"},{"constant":true,"id":17578,"mutability":"constant","name":"G2_Y0","nameLocation":"614:5:84","nodeType":"VariableDeclaration","scope":17789,"src":"589:109:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17576,"name":"uint256","nodeType":"ElementaryTypeName","src":"589:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"38343935363533393233313233343331343137363034393733323437343839323732343338343138313930353837323633363030313438373730323830363439333036393538313031393330","id":17577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"622:76:84","typeDescriptions":{"typeIdentifier":"t_rational_8495653923123431417604973247489272438418190587263600148770280649306958101930_by_1","typeString":"int_const 8495...(68 digits omitted)...1930"},"value":"8495653923123431417604973247489272438418190587263600148770280649306958101930"},"visibility":"private"},{"constant":true,"id":17581,"mutability":"constant","name":"G2_Y1","nameLocation":"752:5:84","nodeType":"VariableDeclaration","scope":17789,"src":"727:109:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17579,"name":"uint256","nodeType":"ElementaryTypeName","src":"727:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"34303832333637383735383633343333363831333332323033343033313435343335353638333136383531333237353933343031323038313035373431303736323134313230303933353331","id":17580,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"760:76:84","typeDescriptions":{"typeIdentifier":"t_rational_4082367875863433681332203403145435568316851327593401208105741076214120093531_by_1","typeString":"int_const 4082...(68 digits omitted)...3531"},"value":"4082367875863433681332203403145435568316851327593401208105741076214120093531"},"visibility":"private"},{"constant":true,"id":17584,"mutability":"constant","name":"N_G2_Y0","nameLocation":"933:7:84","nodeType":"VariableDeclaration","scope":17789,"src":"908:112:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17582,"name":"uint256","nodeType":"ElementaryTypeName","src":"908:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3133333932353838393438373135383433383034363431343332343937373638303032363530323738313230353730303334323233353133393138373537323435333338323638313036363533","id":17583,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"943:77:84","typeDescriptions":{"typeIdentifier":"t_rational_13392588948715843804641432497768002650278120570034223513918757245338268106653_by_1","typeString":"int_const 1339...(69 digits omitted)...6653"},"value":"13392588948715843804641432497768002650278120570034223513918757245338268106653"},"visibility":"private"},{"constant":true,"id":17587,"mutability":"constant","name":"N_G2_Y1","nameLocation":"1074:7:84","nodeType":"VariableDeclaration","scope":17789,"src":"1049:112:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17585,"name":"uint256","nodeType":"ElementaryTypeName","src":"1049:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3137383035383734393935393735383431353430393134323032333432313131383339353230333739343539383239373034343232343534353833323936383138343331313036313135303532","id":17586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1084:77:84","typeDescriptions":{"typeIdentifier":"t_rational_17805874995975841540914202342111839520379459829704422454583296818431106115052_by_1","typeString":"int_const 1780...(69 digits omitted)...5052"},"value":"17805874995975841540914202342111839520379459829704422454583296818431106115052"},"visibility":"private"},{"body":{"id":17593,"nodeType":"Block","src":"1192:23:84","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17590,"name":"_run","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17634,"src":"1202:4:84","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":17591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1202:6:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17592,"nodeType":"ExpressionStatement","src":"1202:6:84"}]},"functionSelector":"c0406226","id":17594,"implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"1177:3:84","nodeType":"FunctionDefinition","parameters":{"id":17588,"nodeType":"ParameterList","parameters":[],"src":"1180:2:84"},"returnParameters":{"id":17589,"nodeType":"ParameterList","parameters":[],"src":"1192:0:84"},"scope":17789,"src":"1168:47:84","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":17607,"nodeType":"Block","src":"1292:58:84","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17601,"name":"pairCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17596,"src":"1309:9:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":17602,"name":"perPairCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17563,"src":"1321:11:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1309:23:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":17604,"name":"baseCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17561,"src":"1335:8:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1309:34:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":17600,"id":17606,"nodeType":"Return","src":"1302:41:84"}]},"functionSelector":"4e79f8ca","id":17608,"implemented":true,"kind":"function","modifiers":[],"name":"getGasCost","nameLocation":"1230:10:84","nodeType":"FunctionDefinition","parameters":{"id":17597,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17596,"mutability":"mutable","name":"pairCount","nameLocation":"1249:9:84","nodeType":"VariableDeclaration","scope":17608,"src":"1241:17:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17595,"name":"uint256","nodeType":"ElementaryTypeName","src":"1241:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1240:19:84"},"returnParameters":{"id":17600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17599,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17608,"src":"1283:7:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17598,"name":"uint256","nodeType":"ElementaryTypeName","src":"1283:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1282:9:84"},"scope":17789,"src":"1221:129:84","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":17633,"nodeType":"Block","src":"1381:201:84","statements":[{"assignments":[17612],"declarations":[{"constant":false,"id":17612,"mutability":"mutable","name":"gasCost1Pair","nameLocation":"1399:12:84","nodeType":"VariableDeclaration","scope":17633,"src":"1391:20:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17611,"name":"uint256","nodeType":"ElementaryTypeName","src":"1391:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17615,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":17613,"name":"_gasCost1Pair","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17708,"src":"1414:13:84","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17614,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1414:15:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1391:38:84"},{"assignments":[17617],"declarations":[{"constant":false,"id":17617,"mutability":"mutable","name":"gasCost2Pair","nameLocation":"1447:12:84","nodeType":"VariableDeclaration","scope":17633,"src":"1439:20:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17616,"name":"uint256","nodeType":"ElementaryTypeName","src":"1439:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17620,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":17618,"name":"_gasCost2Pair","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17788,"src":"1462:13:84","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1462:15:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1439:38:84"},{"expression":{"id":17625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17621,"name":"perPairCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17563,"src":"1487:11:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17622,"name":"gasCost2Pair","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17617,"src":"1501:12:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17623,"name":"gasCost1Pair","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17612,"src":"1516:12:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1501:27:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1487:41:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17626,"nodeType":"ExpressionStatement","src":"1487:41:84"},{"expression":{"id":17631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17627,"name":"baseCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17561,"src":"1538:8:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17628,"name":"gasCost1Pair","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17612,"src":"1549:12:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":17629,"name":"perPairCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17563,"src":"1564:11:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1549:26:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1538:37:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17632,"nodeType":"ExpressionStatement","src":"1538:37:84"}]},"id":17634,"implemented":true,"kind":"function","modifiers":[],"name":"_run","nameLocation":"1365:4:84","nodeType":"FunctionDefinition","parameters":{"id":17609,"nodeType":"ParameterList","parameters":[],"src":"1369:2:84"},"returnParameters":{"id":17610,"nodeType":"ParameterList","parameters":[],"src":"1381:0:84"},"scope":17789,"src":"1356:226:84","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":17707,"nodeType":"Block","src":"1645:859:84","statements":[{"assignments":[17644],"declarations":[{"constant":false,"id":17644,"mutability":"mutable","name":"input","nameLocation":"1673:5:84","nodeType":"VariableDeclaration","scope":17707,"src":"1655:23:84","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$6_memory_ptr","typeString":"uint256[6]"},"typeName":{"baseType":{"id":17642,"name":"uint256","nodeType":"ElementaryTypeName","src":"1655:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17643,"length":{"hexValue":"36","id":17641,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1663:1:84","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"nodeType":"ArrayTypeName","src":"1655:10:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$6_storage_ptr","typeString":"uint256[6]"}},"visibility":"internal"}],"id":17652,"initialValue":{"components":[{"id":17645,"name":"G1_X","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17566,"src":"1682:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17646,"name":"G1_Y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17569,"src":"1688:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17647,"name":"G2_X1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17575,"src":"1694:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17648,"name":"G2_X0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17572,"src":"1701:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17649,"name":"G2_Y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17581,"src":"1708:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17650,"name":"G2_Y0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17578,"src":"1715:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17651,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1681:40:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$6_memory_ptr","typeString":"uint256[6] memory"}},"nodeType":"VariableDeclarationStatement","src":"1655:66:84"},{"assignments":[17658],"declarations":[{"constant":false,"id":17658,"mutability":"mutable","name":"out","nameLocation":"1749:3:84","nodeType":"VariableDeclaration","scope":17707,"src":"1731:21:84","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1]"},"typeName":{"baseType":{"id":17656,"name":"uint256","nodeType":"ElementaryTypeName","src":"1731:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17657,"length":{"hexValue":"31","id":17655,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1739:1:84","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"ArrayTypeName","src":"1731:10:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_storage_ptr","typeString":"uint256[1]"}},"visibility":"internal"}],"id":17659,"nodeType":"VariableDeclarationStatement","src":"1731:21:84"},{"assignments":[17661],"declarations":[{"constant":false,"id":17661,"mutability":"mutable","name":"callSuccess","nameLocation":"1767:11:84","nodeType":"VariableDeclaration","scope":17707,"src":"1762:16:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17660,"name":"bool","nodeType":"ElementaryTypeName","src":"1762:4:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":17662,"nodeType":"VariableDeclarationStatement","src":"1762:16:84"},{"assignments":[17664],"declarations":[{"constant":false,"id":17664,"mutability":"mutable","name":"suppliedGas","nameLocation":"1796:11:84","nodeType":"VariableDeclaration","scope":17707,"src":"1788:19:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17663,"name":"uint256","nodeType":"ElementaryTypeName","src":"1788:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17669,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17665,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1810:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1810:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"32303030","id":17667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1822:4:84","typeDescriptions":{"typeIdentifier":"t_rational_2000_by_1","typeString":"int_const 2000"},"value":"2000"},"src":"1810:16:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1788:38:84"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17671,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1857:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17672,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1857:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"32303030","id":17673,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1869:4:84","typeDescriptions":{"typeIdentifier":"t_rational_2000_by_1","typeString":"int_const 2000"},"value":"2000"},"src":"1857:16:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a206e6f7420656e6f756768206761732c2073696e676c652070616972","id":17675,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1887:63:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_2d256cff32a852cfe25dd7dbb2b7ebdbdd3f8e7955e24acebb45cde7de54594f","typeString":"literal_string \"BNPairingPrecompileCostEstimator: not enough gas, single pair\""},"value":"BNPairingPrecompileCostEstimator: not enough gas, single pair"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2d256cff32a852cfe25dd7dbb2b7ebdbdd3f8e7955e24acebb45cde7de54594f","typeString":"literal_string \"BNPairingPrecompileCostEstimator: not enough gas, single pair\""}],"id":17670,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1836:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1836:124:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17677,"nodeType":"ExpressionStatement","src":"1836:124:84"},{"assignments":[17679],"declarations":[{"constant":false,"id":17679,"mutability":"mutable","name":"gasT0","nameLocation":"1978:5:84","nodeType":"VariableDeclaration","scope":17707,"src":"1970:13:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17678,"name":"uint256","nodeType":"ElementaryTypeName","src":"1970:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17682,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":17680,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1986:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17681,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1986:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1970:25:84"},{"AST":{"nodeType":"YulBlock","src":"2078:88:84","statements":[{"nodeType":"YulAssignment","src":"2092:64:84","value":{"arguments":[{"name":"suppliedGas","nodeType":"YulIdentifier","src":"2118:11:84"},{"kind":"number","nodeType":"YulLiteral","src":"2131:1:84","type":"","value":"8"},{"name":"input","nodeType":"YulIdentifier","src":"2134:5:84"},{"kind":"number","nodeType":"YulLiteral","src":"2141:3:84","type":"","value":"192"},{"name":"out","nodeType":"YulIdentifier","src":"2146:3:84"},{"kind":"number","nodeType":"YulLiteral","src":"2151:4:84","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"2107:10:84"},"nodeType":"YulFunctionCall","src":"2107:49:84"},"variableNames":[{"name":"callSuccess","nodeType":"YulIdentifier","src":"2092:11:84"}]}]},"evmVersion":"london","externalReferences":[{"declaration":17661,"isOffset":false,"isSlot":false,"src":"2092:11:84","valueSize":1},{"declaration":17644,"isOffset":false,"isSlot":false,"src":"2134:5:84","valueSize":1},{"declaration":17658,"isOffset":false,"isSlot":false,"src":"2146:3:84","valueSize":1},{"declaration":17664,"isOffset":false,"isSlot":false,"src":"2118:11:84","valueSize":1}],"id":17683,"nodeType":"InlineAssembly","src":"2069:97:84"},{"assignments":[17685],"declarations":[{"constant":false,"id":17685,"mutability":"mutable","name":"gasCost","nameLocation":"2183:7:84","nodeType":"VariableDeclaration","scope":17707,"src":"2175:15:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17684,"name":"uint256","nodeType":"ElementaryTypeName","src":"2175:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17690,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17689,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17686,"name":"gasT0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17679,"src":"2193:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17687,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"2201:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2201:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2193:17:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2175:35:84"},{"expression":{"arguments":[{"id":17692,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17661,"src":"2241:11:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a2073696e676c6520706169722063616c6c206973206661696c6564","id":17693,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2266:62:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_8f05d73aed2f16f10dd0a982ea471304089f33ea44df029c2e424f8a5934dbe0","typeString":"literal_string \"BNPairingPrecompileCostEstimator: single pair call is failed\""},"value":"BNPairingPrecompileCostEstimator: single pair call is failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8f05d73aed2f16f10dd0a982ea471304089f33ea44df029c2e424f8a5934dbe0","typeString":"literal_string \"BNPairingPrecompileCostEstimator: single pair call is failed\""}],"id":17691,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2220:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17694,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2220:118:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17695,"nodeType":"ExpressionStatement","src":"2220:118:84"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17701,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":17697,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17658,"src":"2369:3:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1] memory"}},"id":17699,"indexExpression":{"hexValue":"30","id":17698,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2373:1:84","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2369:6:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":17700,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2379:1:84","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2369:11:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a2073696e676c6520706169722063616c6c20726573756c74206d7573742062652030","id":17702,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2394:69:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_1f3065863a8b9424beb3ec0b3ecd0a945047bc7e716d77385c40e3c20e33b381","typeString":"literal_string \"BNPairingPrecompileCostEstimator: single pair call result must be 0\""},"value":"BNPairingPrecompileCostEstimator: single pair call result must be 0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1f3065863a8b9424beb3ec0b3ecd0a945047bc7e716d77385c40e3c20e33b381","typeString":"literal_string \"BNPairingPrecompileCostEstimator: single pair call result must be 0\""}],"id":17696,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2348:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2348:125:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17704,"nodeType":"ExpressionStatement","src":"2348:125:84"},{"expression":{"id":17705,"name":"gasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17685,"src":"2490:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":17638,"id":17706,"nodeType":"Return","src":"2483:14:84"}]},"id":17708,"implemented":true,"kind":"function","modifiers":[],"name":"_gasCost1Pair","nameLocation":"1597:13:84","nodeType":"FunctionDefinition","parameters":{"id":17635,"nodeType":"ParameterList","parameters":[],"src":"1610:2:84"},"returnParameters":{"id":17638,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17637,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17708,"src":"1636:7:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17636,"name":"uint256","nodeType":"ElementaryTypeName","src":"1636:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1635:9:84"},"scope":17789,"src":"1588:916:84","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":17787,"nodeType":"Block","src":"2567:1122:84","statements":[{"assignments":[17718],"declarations":[{"constant":false,"id":17718,"mutability":"mutable","name":"input","nameLocation":"2596:5:84","nodeType":"VariableDeclaration","scope":17787,"src":"2577:24:84","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_memory_ptr","typeString":"uint256[12]"},"typeName":{"baseType":{"id":17716,"name":"uint256","nodeType":"ElementaryTypeName","src":"2577:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17717,"length":{"hexValue":"3132","id":17715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2585:2:84","typeDescriptions":{"typeIdentifier":"t_rational_12_by_1","typeString":"int_const 12"},"value":"12"},"nodeType":"ArrayTypeName","src":"2577:11:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_storage_ptr","typeString":"uint256[12]"}},"visibility":"internal"}],"id":17732,"initialValue":{"components":[{"id":17719,"name":"G1_X","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17566,"src":"2634:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17720,"name":"G1_Y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17569,"src":"2656:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17721,"name":"G2_X1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17575,"src":"2678:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17722,"name":"G2_X0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17572,"src":"2701:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17723,"name":"G2_Y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17581,"src":"2724:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17724,"name":"G2_Y0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17578,"src":"2747:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17725,"name":"G1_X","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17566,"src":"2770:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17726,"name":"G1_Y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17569,"src":"2792:4:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17727,"name":"G2_X1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17575,"src":"2814:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17728,"name":"G2_X0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17572,"src":"2837:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17729,"name":"N_G2_Y1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17587,"src":"2860:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17730,"name":"N_G2_Y0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17584,"src":"2885:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":17731,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2616:290:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$12_memory_ptr","typeString":"uint256[12] memory"}},"nodeType":"VariableDeclarationStatement","src":"2577:329:84"},{"assignments":[17738],"declarations":[{"constant":false,"id":17738,"mutability":"mutable","name":"out","nameLocation":"2934:3:84","nodeType":"VariableDeclaration","scope":17787,"src":"2916:21:84","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1]"},"typeName":{"baseType":{"id":17736,"name":"uint256","nodeType":"ElementaryTypeName","src":"2916:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17737,"length":{"hexValue":"31","id":17735,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2924:1:84","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"ArrayTypeName","src":"2916:10:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_storage_ptr","typeString":"uint256[1]"}},"visibility":"internal"}],"id":17739,"nodeType":"VariableDeclarationStatement","src":"2916:21:84"},{"assignments":[17741],"declarations":[{"constant":false,"id":17741,"mutability":"mutable","name":"callSuccess","nameLocation":"2952:11:84","nodeType":"VariableDeclaration","scope":17787,"src":"2947:16:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17740,"name":"bool","nodeType":"ElementaryTypeName","src":"2947:4:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":17742,"nodeType":"VariableDeclarationStatement","src":"2947:16:84"},{"assignments":[17744],"declarations":[{"constant":false,"id":17744,"mutability":"mutable","name":"suppliedGas","nameLocation":"2981:11:84","nodeType":"VariableDeclaration","scope":17787,"src":"2973:19:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17743,"name":"uint256","nodeType":"ElementaryTypeName","src":"2973:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17749,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17745,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"2995:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2995:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"32303030","id":17747,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3007:4:84","typeDescriptions":{"typeIdentifier":"t_rational_2000_by_1","typeString":"int_const 2000"},"value":"2000"},"src":"2995:16:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2973:38:84"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17751,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3042:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3042:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"32303030","id":17753,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3054:4:84","typeDescriptions":{"typeIdentifier":"t_rational_2000_by_1","typeString":"int_const 2000"},"value":"2000"},"src":"3042:16:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a206e6f7420656e6f756768206761732c20636f75706c652070616972","id":17755,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3072:63:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_173e5ca4c3200023e23041b88d19db27834ce9f8e0a7cd140922be2f2e54b12e","typeString":"literal_string \"BNPairingPrecompileCostEstimator: not enough gas, couple pair\""},"value":"BNPairingPrecompileCostEstimator: not enough gas, couple pair"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_173e5ca4c3200023e23041b88d19db27834ce9f8e0a7cd140922be2f2e54b12e","typeString":"literal_string \"BNPairingPrecompileCostEstimator: not enough gas, couple pair\""}],"id":17750,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3021:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17756,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3021:124:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17757,"nodeType":"ExpressionStatement","src":"3021:124:84"},{"assignments":[17759],"declarations":[{"constant":false,"id":17759,"mutability":"mutable","name":"gasT0","nameLocation":"3163:5:84","nodeType":"VariableDeclaration","scope":17787,"src":"3155:13:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17758,"name":"uint256","nodeType":"ElementaryTypeName","src":"3155:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17762,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":17760,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3171:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3171:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3155:25:84"},{"AST":{"nodeType":"YulBlock","src":"3263:88:84","statements":[{"nodeType":"YulAssignment","src":"3277:64:84","value":{"arguments":[{"name":"suppliedGas","nodeType":"YulIdentifier","src":"3303:11:84"},{"kind":"number","nodeType":"YulLiteral","src":"3316:1:84","type":"","value":"8"},{"name":"input","nodeType":"YulIdentifier","src":"3319:5:84"},{"kind":"number","nodeType":"YulLiteral","src":"3326:3:84","type":"","value":"384"},{"name":"out","nodeType":"YulIdentifier","src":"3331:3:84"},{"kind":"number","nodeType":"YulLiteral","src":"3336:4:84","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"3292:10:84"},"nodeType":"YulFunctionCall","src":"3292:49:84"},"variableNames":[{"name":"callSuccess","nodeType":"YulIdentifier","src":"3277:11:84"}]}]},"evmVersion":"london","externalReferences":[{"declaration":17741,"isOffset":false,"isSlot":false,"src":"3277:11:84","valueSize":1},{"declaration":17718,"isOffset":false,"isSlot":false,"src":"3319:5:84","valueSize":1},{"declaration":17738,"isOffset":false,"isSlot":false,"src":"3331:3:84","valueSize":1},{"declaration":17744,"isOffset":false,"isSlot":false,"src":"3303:11:84","valueSize":1}],"id":17763,"nodeType":"InlineAssembly","src":"3254:97:84"},{"assignments":[17765],"declarations":[{"constant":false,"id":17765,"mutability":"mutable","name":"gasCost","nameLocation":"3368:7:84","nodeType":"VariableDeclaration","scope":17787,"src":"3360:15:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17764,"name":"uint256","nodeType":"ElementaryTypeName","src":"3360:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":17770,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17769,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17766,"name":"gasT0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17759,"src":"3378:5:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":17767,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"3386:7:84","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":17768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3386:9:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3378:17:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3360:35:84"},{"expression":{"arguments":[{"id":17772,"name":"callSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17741,"src":"3426:11:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a20636f75706c6520706169722063616c6c206973206661696c6564","id":17773,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3451:62:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_e440e0b45627bd97e0b614d4dddcf7969a84f36912be7d05ccd79af72e647ba2","typeString":"literal_string \"BNPairingPrecompileCostEstimator: couple pair call is failed\""},"value":"BNPairingPrecompileCostEstimator: couple pair call is failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e440e0b45627bd97e0b614d4dddcf7969a84f36912be7d05ccd79af72e647ba2","typeString":"literal_string \"BNPairingPrecompileCostEstimator: couple pair call is failed\""}],"id":17771,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3405:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3405:118:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17775,"nodeType":"ExpressionStatement","src":"3405:118:84"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":17781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":17777,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17738,"src":"3554:3:84","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1] memory"}},"id":17779,"indexExpression":{"hexValue":"30","id":17778,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3558:1:84","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3554:6:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":17780,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3564:1:84","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3554:11:84","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f723a20636f75706c6520706169722063616c6c20726573756c74206d7573742062652031","id":17782,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3579:69:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_7b1ded31a4535154d540731bdd2b51818b26e334329c21e3847b411372fa6c31","typeString":"literal_string \"BNPairingPrecompileCostEstimator: couple pair call result must be 1\""},"value":"BNPairingPrecompileCostEstimator: couple pair call result must be 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7b1ded31a4535154d540731bdd2b51818b26e334329c21e3847b411372fa6c31","typeString":"literal_string \"BNPairingPrecompileCostEstimator: couple pair call result must be 1\""}],"id":17776,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3533:7:84","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":17783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3533:125:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17784,"nodeType":"ExpressionStatement","src":"3533:125:84"},{"expression":{"id":17785,"name":"gasCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17765,"src":"3675:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":17712,"id":17786,"nodeType":"Return","src":"3668:14:84"}]},"id":17788,"implemented":true,"kind":"function","modifiers":[],"name":"_gasCost2Pair","nameLocation":"2519:13:84","nodeType":"FunctionDefinition","parameters":{"id":17709,"nodeType":"ParameterList","parameters":[],"src":"2532:2:84"},"returnParameters":{"id":17712,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17711,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17788,"src":"2558:7:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17710,"name":"uint256","nodeType":"ElementaryTypeName","src":"2558:7:84","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2557:9:84"},"scope":17789,"src":"2510:1179:84","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":17790,"src":"59:3632:84","usedErrors":[]}],"src":"32:3660:84"},"id":84},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol":{"ast":{"absolutePath":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol","exportedSymbols":{"ModexpInverse":[17802],"ModexpSqrt":[17813]},"id":17814,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17791,"literals":["solidity",">=","0.6",".12"],"nodeType":"PragmaDirective","src":"32:26:85"},{"abstract":false,"baseContracts":[],"canonicalName":"ModexpInverse","contractDependencies":[],"contractKind":"library","documentation":{"id":17792,"nodeType":"StructuredDocumentation","src":"60:468:85","text":"@title Compute Inverse by Modular Exponentiation\n@notice Compute $input^(N - 2) mod N$ using Addition Chain method.\nWhere N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\nand N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\n@dev the function body is generated with the modified addchain script\nsee https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f"},"fullyImplemented":true,"id":17802,"linearizedBaseContracts":[17802],"name":"ModexpInverse","nameLocation":"537:13:85","nodeType":"ContractDefinition","nodes":[{"body":{"id":17800,"nodeType":"Block","src":"617:11332:85","statements":[{"AST":{"nodeType":"YulBlock","src":"700:11243:85","statements":[{"nodeType":"YulVariableDeclaration","src":"714:103:85","value":{"kind":"number","nodeType":"YulLiteral","src":"751:66:85","type":"","value":"0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"},"variables":[{"name":"n","nodeType":"YulTypedName","src":"734:1:85","type":""}]},{"nodeType":"YulAssignment","src":"830:23:85","value":{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"843:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"847:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"851:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"836:6:85"},"nodeType":"YulFunctionCall","src":"836:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"830:2:85"}]},{"nodeType":"YulVariableDeclaration","src":"866:27:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"883:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"887:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"891:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"876:6:85"},"nodeType":"YulFunctionCall","src":"876:17:85"},"variables":[{"name":"t5","nodeType":"YulTypedName","src":"870:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"906:27:85","value":{"arguments":[{"name":"t5","nodeType":"YulIdentifier","src":"923:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"927:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"931:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"916:6:85"},"nodeType":"YulFunctionCall","src":"916:17:85"},"variables":[{"name":"t1","nodeType":"YulTypedName","src":"910:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"946:27:85","value":{"arguments":[{"name":"t5","nodeType":"YulIdentifier","src":"963:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"967:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"971:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"956:6:85"},"nodeType":"YulFunctionCall","src":"956:17:85"},"variables":[{"name":"t3","nodeType":"YulTypedName","src":"950:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"986:27:85","value":{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"1003:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1007:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1011:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"996:6:85"},"nodeType":"YulFunctionCall","src":"996:17:85"},"variables":[{"name":"t8","nodeType":"YulTypedName","src":"990:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1026:27:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"1043:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"1047:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1051:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1036:6:85"},"nodeType":"YulFunctionCall","src":"1036:17:85"},"variables":[{"name":"t4","nodeType":"YulTypedName","src":"1030:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1066:27:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"1083:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"1087:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1091:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1076:6:85"},"nodeType":"YulFunctionCall","src":"1076:17:85"},"variables":[{"name":"t6","nodeType":"YulTypedName","src":"1070:2:85","type":""}]},{"nodeType":"YulAssignment","src":"1106:23:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"1119:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"1123:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1127:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1112:6:85"},"nodeType":"YulFunctionCall","src":"1112:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1106:2:85"}]},{"nodeType":"YulVariableDeclaration","src":"1142:27:85","value":{"arguments":[{"name":"t8","nodeType":"YulIdentifier","src":"1159:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"1163:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1167:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1152:6:85"},"nodeType":"YulFunctionCall","src":"1152:17:85"},"variables":[{"name":"t7","nodeType":"YulTypedName","src":"1146:2:85","type":""}]},{"nodeType":"YulAssignment","src":"1182:23:85","value":{"arguments":[{"name":"t4","nodeType":"YulIdentifier","src":"1195:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"1199:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1203:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1188:6:85"},"nodeType":"YulFunctionCall","src":"1188:17:85"},"variableNames":[{"name":"t3","nodeType":"YulIdentifier","src":"1182:2:85"}]},{"nodeType":"YulAssignment","src":"1218:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1231:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1235:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1239:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1224:6:85"},"nodeType":"YulFunctionCall","src":"1224:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1218:2:85"}]},{"nodeType":"YulAssignment","src":"1254:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1267:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1271:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1275:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1260:6:85"},"nodeType":"YulFunctionCall","src":"1260:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1254:2:85"}]},{"nodeType":"YulAssignment","src":"1290:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1303:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1307:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1311:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1296:6:85"},"nodeType":"YulFunctionCall","src":"1296:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1290:2:85"}]},{"nodeType":"YulAssignment","src":"1326:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1339:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1343:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1347:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1332:6:85"},"nodeType":"YulFunctionCall","src":"1332:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1326:2:85"}]},{"nodeType":"YulAssignment","src":"1362:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1375:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1379:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1383:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1368:6:85"},"nodeType":"YulFunctionCall","src":"1368:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1362:2:85"}]},{"nodeType":"YulAssignment","src":"1398:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1411:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"1415:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1419:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1404:6:85"},"nodeType":"YulFunctionCall","src":"1404:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1398:2:85"}]},{"nodeType":"YulAssignment","src":"1434:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1447:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1451:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1455:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1440:6:85"},"nodeType":"YulFunctionCall","src":"1440:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1434:2:85"}]},{"nodeType":"YulAssignment","src":"1470:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1483:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1487:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1491:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1476:6:85"},"nodeType":"YulFunctionCall","src":"1476:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1470:2:85"}]},{"nodeType":"YulAssignment","src":"1506:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1519:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1523:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1527:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1512:6:85"},"nodeType":"YulFunctionCall","src":"1512:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1506:2:85"}]},{"nodeType":"YulAssignment","src":"1542:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1555:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"1559:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1563:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1548:6:85"},"nodeType":"YulFunctionCall","src":"1548:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1542:2:85"}]},{"nodeType":"YulAssignment","src":"1578:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1591:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1595:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1599:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1584:6:85"},"nodeType":"YulFunctionCall","src":"1584:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1578:2:85"}]},{"nodeType":"YulAssignment","src":"1614:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1627:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1631:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1635:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1620:6:85"},"nodeType":"YulFunctionCall","src":"1620:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1614:2:85"}]},{"nodeType":"YulAssignment","src":"1650:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1663:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1667:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1671:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1656:6:85"},"nodeType":"YulFunctionCall","src":"1656:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1650:2:85"}]},{"nodeType":"YulAssignment","src":"1686:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1699:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1703:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1707:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1692:6:85"},"nodeType":"YulFunctionCall","src":"1692:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1686:2:85"}]},{"nodeType":"YulAssignment","src":"1722:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1735:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"1739:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1743:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1728:6:85"},"nodeType":"YulFunctionCall","src":"1728:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1722:2:85"}]},{"nodeType":"YulAssignment","src":"1758:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1771:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1775:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1779:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1764:6:85"},"nodeType":"YulFunctionCall","src":"1764:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1758:2:85"}]},{"nodeType":"YulAssignment","src":"1794:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1807:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1811:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1815:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1800:6:85"},"nodeType":"YulFunctionCall","src":"1800:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1794:2:85"}]},{"nodeType":"YulAssignment","src":"1830:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1843:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1847:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1851:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1836:6:85"},"nodeType":"YulFunctionCall","src":"1836:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1830:2:85"}]},{"nodeType":"YulAssignment","src":"1866:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1879:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1883:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1887:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1872:6:85"},"nodeType":"YulFunctionCall","src":"1872:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1866:2:85"}]},{"nodeType":"YulAssignment","src":"1902:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1915:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1919:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1923:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1908:6:85"},"nodeType":"YulFunctionCall","src":"1908:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1902:2:85"}]},{"nodeType":"YulAssignment","src":"1938:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1951:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"1955:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1959:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1944:6:85"},"nodeType":"YulFunctionCall","src":"1944:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1938:2:85"}]},{"nodeType":"YulAssignment","src":"1974:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"1987:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"1991:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"1995:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"1980:6:85"},"nodeType":"YulFunctionCall","src":"1980:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"1974:2:85"}]},{"nodeType":"YulAssignment","src":"2010:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2023:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2027:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2031:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2016:6:85"},"nodeType":"YulFunctionCall","src":"2016:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2010:2:85"}]},{"nodeType":"YulAssignment","src":"2046:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2059:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2063:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2067:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2052:6:85"},"nodeType":"YulFunctionCall","src":"2052:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2046:2:85"}]},{"nodeType":"YulAssignment","src":"2082:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2095:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2099:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2103:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2088:6:85"},"nodeType":"YulFunctionCall","src":"2088:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2082:2:85"}]},{"nodeType":"YulAssignment","src":"2118:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2131:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2135:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2139:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2124:6:85"},"nodeType":"YulFunctionCall","src":"2124:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2118:2:85"}]},{"nodeType":"YulAssignment","src":"2154:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2167:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"2171:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2175:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2160:6:85"},"nodeType":"YulFunctionCall","src":"2160:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2154:2:85"}]},{"nodeType":"YulAssignment","src":"2190:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2203:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2207:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2211:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2196:6:85"},"nodeType":"YulFunctionCall","src":"2196:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2190:2:85"}]},{"nodeType":"YulAssignment","src":"2226:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2239:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2243:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2247:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2232:6:85"},"nodeType":"YulFunctionCall","src":"2232:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2226:2:85"}]},{"nodeType":"YulAssignment","src":"2262:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2275:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2279:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2283:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2268:6:85"},"nodeType":"YulFunctionCall","src":"2268:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2262:2:85"}]},{"nodeType":"YulAssignment","src":"2298:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2311:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"2315:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2319:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2304:6:85"},"nodeType":"YulFunctionCall","src":"2304:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2298:2:85"}]},{"nodeType":"YulAssignment","src":"2334:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2347:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2351:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2355:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2340:6:85"},"nodeType":"YulFunctionCall","src":"2340:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2334:2:85"}]},{"nodeType":"YulAssignment","src":"2370:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2383:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2387:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2391:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2376:6:85"},"nodeType":"YulFunctionCall","src":"2376:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2370:2:85"}]},{"nodeType":"YulAssignment","src":"2406:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2419:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2423:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2427:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2412:6:85"},"nodeType":"YulFunctionCall","src":"2412:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2406:2:85"}]},{"nodeType":"YulAssignment","src":"2442:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2455:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2459:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2463:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2448:6:85"},"nodeType":"YulFunctionCall","src":"2448:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2442:2:85"}]},{"nodeType":"YulAssignment","src":"2478:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2491:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"2495:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2499:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2484:6:85"},"nodeType":"YulFunctionCall","src":"2484:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2478:2:85"}]},{"nodeType":"YulAssignment","src":"2514:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2527:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2531:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2535:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2520:6:85"},"nodeType":"YulFunctionCall","src":"2520:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2514:2:85"}]},{"nodeType":"YulAssignment","src":"2550:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2563:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2567:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2571:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2556:6:85"},"nodeType":"YulFunctionCall","src":"2556:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2550:2:85"}]},{"nodeType":"YulAssignment","src":"2586:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2599:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2603:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2607:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2592:6:85"},"nodeType":"YulFunctionCall","src":"2592:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2586:2:85"}]},{"nodeType":"YulAssignment","src":"2622:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2635:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2639:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2643:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2628:6:85"},"nodeType":"YulFunctionCall","src":"2628:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2622:2:85"}]},{"nodeType":"YulAssignment","src":"2658:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2671:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2675:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2679:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2664:6:85"},"nodeType":"YulFunctionCall","src":"2664:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2658:2:85"}]},{"nodeType":"YulAssignment","src":"2694:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2707:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"2711:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2715:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2700:6:85"},"nodeType":"YulFunctionCall","src":"2700:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2694:2:85"}]},{"nodeType":"YulAssignment","src":"2730:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2743:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2747:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2751:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2736:6:85"},"nodeType":"YulFunctionCall","src":"2736:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2730:2:85"}]},{"nodeType":"YulAssignment","src":"2766:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2779:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2783:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2787:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2772:6:85"},"nodeType":"YulFunctionCall","src":"2772:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2766:2:85"}]},{"nodeType":"YulAssignment","src":"2802:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2815:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2819:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2823:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2808:6:85"},"nodeType":"YulFunctionCall","src":"2808:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2802:2:85"}]},{"nodeType":"YulAssignment","src":"2838:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2851:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2855:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2859:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2844:6:85"},"nodeType":"YulFunctionCall","src":"2844:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2838:2:85"}]},{"nodeType":"YulAssignment","src":"2874:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2887:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"2891:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2895:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2880:6:85"},"nodeType":"YulFunctionCall","src":"2880:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2874:2:85"}]},{"nodeType":"YulAssignment","src":"2910:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2923:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2927:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2931:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2916:6:85"},"nodeType":"YulFunctionCall","src":"2916:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2910:2:85"}]},{"nodeType":"YulAssignment","src":"2946:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2959:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2963:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"2967:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2952:6:85"},"nodeType":"YulFunctionCall","src":"2952:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2946:2:85"}]},{"nodeType":"YulAssignment","src":"2982:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"2995:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"2999:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3003:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"2988:6:85"},"nodeType":"YulFunctionCall","src":"2988:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"2982:2:85"}]},{"nodeType":"YulAssignment","src":"3018:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3031:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3035:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3039:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3024:6:85"},"nodeType":"YulFunctionCall","src":"3024:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3018:2:85"}]},{"nodeType":"YulAssignment","src":"3054:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3067:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3071:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3075:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3060:6:85"},"nodeType":"YulFunctionCall","src":"3060:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3054:2:85"}]},{"nodeType":"YulAssignment","src":"3090:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3103:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3107:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3111:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3096:6:85"},"nodeType":"YulFunctionCall","src":"3096:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3090:2:85"}]},{"nodeType":"YulAssignment","src":"3126:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3139:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3143:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3147:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3132:6:85"},"nodeType":"YulFunctionCall","src":"3132:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3126:2:85"}]},{"nodeType":"YulAssignment","src":"3162:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3175:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"3179:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3183:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3168:6:85"},"nodeType":"YulFunctionCall","src":"3168:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3162:2:85"}]},{"nodeType":"YulAssignment","src":"3198:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3211:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3215:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3219:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3204:6:85"},"nodeType":"YulFunctionCall","src":"3204:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3198:2:85"}]},{"nodeType":"YulAssignment","src":"3234:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3247:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3251:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3255:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3240:6:85"},"nodeType":"YulFunctionCall","src":"3240:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3234:2:85"}]},{"nodeType":"YulAssignment","src":"3270:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3283:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3287:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3291:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3276:6:85"},"nodeType":"YulFunctionCall","src":"3276:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3270:2:85"}]},{"nodeType":"YulAssignment","src":"3306:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3319:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3323:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3327:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3312:6:85"},"nodeType":"YulFunctionCall","src":"3312:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3306:2:85"}]},{"nodeType":"YulAssignment","src":"3342:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3355:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3359:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3363:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3348:6:85"},"nodeType":"YulFunctionCall","src":"3348:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3342:2:85"}]},{"nodeType":"YulAssignment","src":"3378:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3391:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3395:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3399:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3384:6:85"},"nodeType":"YulFunctionCall","src":"3384:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3378:2:85"}]},{"nodeType":"YulAssignment","src":"3414:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3427:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3431:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3435:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3420:6:85"},"nodeType":"YulFunctionCall","src":"3420:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3414:2:85"}]},{"nodeType":"YulAssignment","src":"3450:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3463:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3467:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3471:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3456:6:85"},"nodeType":"YulFunctionCall","src":"3456:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3450:2:85"}]},{"nodeType":"YulAssignment","src":"3486:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3499:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3503:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3507:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3492:6:85"},"nodeType":"YulFunctionCall","src":"3492:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3486:2:85"}]},{"nodeType":"YulAssignment","src":"3522:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3535:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3539:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3543:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3528:6:85"},"nodeType":"YulFunctionCall","src":"3528:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3522:2:85"}]},{"nodeType":"YulAssignment","src":"3558:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3571:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"3575:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3579:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3564:6:85"},"nodeType":"YulFunctionCall","src":"3564:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3558:2:85"}]},{"nodeType":"YulAssignment","src":"3594:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3607:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3611:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3615:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3600:6:85"},"nodeType":"YulFunctionCall","src":"3600:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3594:2:85"}]},{"nodeType":"YulAssignment","src":"3630:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3643:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3647:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3651:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3636:6:85"},"nodeType":"YulFunctionCall","src":"3636:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3630:2:85"}]},{"nodeType":"YulAssignment","src":"3666:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3679:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3683:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3687:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3672:6:85"},"nodeType":"YulFunctionCall","src":"3672:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3666:2:85"}]},{"nodeType":"YulAssignment","src":"3702:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3715:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3719:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3723:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3708:6:85"},"nodeType":"YulFunctionCall","src":"3708:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3702:2:85"}]},{"nodeType":"YulAssignment","src":"3738:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3751:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"3755:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3759:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3744:6:85"},"nodeType":"YulFunctionCall","src":"3744:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3738:2:85"}]},{"nodeType":"YulAssignment","src":"3774:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3787:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3791:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3795:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3780:6:85"},"nodeType":"YulFunctionCall","src":"3780:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3774:2:85"}]},{"nodeType":"YulAssignment","src":"3810:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3823:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3827:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3831:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3816:6:85"},"nodeType":"YulFunctionCall","src":"3816:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3810:2:85"}]},{"nodeType":"YulAssignment","src":"3846:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3859:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3863:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3867:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3852:6:85"},"nodeType":"YulFunctionCall","src":"3852:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3846:2:85"}]},{"nodeType":"YulAssignment","src":"3882:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3895:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3899:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3903:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3888:6:85"},"nodeType":"YulFunctionCall","src":"3888:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3882:2:85"}]},{"nodeType":"YulAssignment","src":"3918:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3931:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"3935:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3939:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3924:6:85"},"nodeType":"YulFunctionCall","src":"3924:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3918:2:85"}]},{"nodeType":"YulAssignment","src":"3954:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"3967:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"3971:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"3975:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3960:6:85"},"nodeType":"YulFunctionCall","src":"3960:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3954:2:85"}]},{"nodeType":"YulAssignment","src":"3990:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4003:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4007:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4011:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"3996:6:85"},"nodeType":"YulFunctionCall","src":"3996:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"3990:2:85"}]},{"nodeType":"YulAssignment","src":"4026:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4039:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4043:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4047:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4032:6:85"},"nodeType":"YulFunctionCall","src":"4032:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4026:2:85"}]},{"nodeType":"YulAssignment","src":"4062:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4075:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4079:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4083:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4068:6:85"},"nodeType":"YulFunctionCall","src":"4068:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4062:2:85"}]},{"nodeType":"YulAssignment","src":"4098:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4111:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4115:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4119:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4104:6:85"},"nodeType":"YulFunctionCall","src":"4104:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4098:2:85"}]},{"nodeType":"YulAssignment","src":"4134:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4147:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4151:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4155:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4140:6:85"},"nodeType":"YulFunctionCall","src":"4140:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4134:2:85"}]},{"nodeType":"YulAssignment","src":"4170:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4183:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4187:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4191:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4176:6:85"},"nodeType":"YulFunctionCall","src":"4176:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4170:2:85"}]},{"nodeType":"YulAssignment","src":"4206:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4219:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"4223:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4227:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4212:6:85"},"nodeType":"YulFunctionCall","src":"4212:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4206:2:85"}]},{"nodeType":"YulAssignment","src":"4242:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4255:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4259:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4263:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4248:6:85"},"nodeType":"YulFunctionCall","src":"4248:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4242:2:85"}]},{"nodeType":"YulAssignment","src":"4278:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4291:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4295:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4299:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4284:6:85"},"nodeType":"YulFunctionCall","src":"4284:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4278:2:85"}]},{"nodeType":"YulAssignment","src":"4314:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4327:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4331:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4335:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4320:6:85"},"nodeType":"YulFunctionCall","src":"4320:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4314:2:85"}]},{"nodeType":"YulAssignment","src":"4350:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4363:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4367:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4371:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4356:6:85"},"nodeType":"YulFunctionCall","src":"4356:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4350:2:85"}]},{"nodeType":"YulAssignment","src":"4386:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4399:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4403:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4407:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4392:6:85"},"nodeType":"YulFunctionCall","src":"4392:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4386:2:85"}]},{"nodeType":"YulAssignment","src":"4422:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4435:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4439:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4443:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4428:6:85"},"nodeType":"YulFunctionCall","src":"4428:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4422:2:85"}]},{"nodeType":"YulAssignment","src":"4458:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4471:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"4475:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4479:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4464:6:85"},"nodeType":"YulFunctionCall","src":"4464:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4458:2:85"}]},{"nodeType":"YulAssignment","src":"4494:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4507:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4511:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4515:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4500:6:85"},"nodeType":"YulFunctionCall","src":"4500:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4494:2:85"}]},{"nodeType":"YulAssignment","src":"4530:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4543:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4547:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4551:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4536:6:85"},"nodeType":"YulFunctionCall","src":"4536:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4530:2:85"}]},{"nodeType":"YulAssignment","src":"4566:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4579:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4583:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4587:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4572:6:85"},"nodeType":"YulFunctionCall","src":"4572:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4566:2:85"}]},{"nodeType":"YulAssignment","src":"4602:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4615:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4619:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4623:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4608:6:85"},"nodeType":"YulFunctionCall","src":"4608:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4602:2:85"}]},{"nodeType":"YulAssignment","src":"4638:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4651:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4655:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4659:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4644:6:85"},"nodeType":"YulFunctionCall","src":"4644:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4638:2:85"}]},{"nodeType":"YulAssignment","src":"4674:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4687:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4691:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4695:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4680:6:85"},"nodeType":"YulFunctionCall","src":"4680:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4674:2:85"}]},{"nodeType":"YulAssignment","src":"4710:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4723:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4727:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4731:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4716:6:85"},"nodeType":"YulFunctionCall","src":"4716:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4710:2:85"}]},{"nodeType":"YulAssignment","src":"4746:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4759:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"4763:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4767:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4752:6:85"},"nodeType":"YulFunctionCall","src":"4752:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4746:2:85"}]},{"nodeType":"YulAssignment","src":"4782:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4795:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4799:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4803:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4788:6:85"},"nodeType":"YulFunctionCall","src":"4788:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4782:2:85"}]},{"nodeType":"YulAssignment","src":"4818:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4831:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4835:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4839:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4824:6:85"},"nodeType":"YulFunctionCall","src":"4824:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4818:2:85"}]},{"nodeType":"YulAssignment","src":"4854:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4867:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4871:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4875:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4860:6:85"},"nodeType":"YulFunctionCall","src":"4860:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4854:2:85"}]},{"nodeType":"YulAssignment","src":"4890:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4903:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4907:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4911:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4896:6:85"},"nodeType":"YulFunctionCall","src":"4896:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4890:2:85"}]},{"nodeType":"YulAssignment","src":"4926:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4939:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"4943:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4947:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4932:6:85"},"nodeType":"YulFunctionCall","src":"4932:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4926:2:85"}]},{"nodeType":"YulAssignment","src":"4962:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"4975:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"4979:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"4983:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"4968:6:85"},"nodeType":"YulFunctionCall","src":"4968:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4962:2:85"}]},{"nodeType":"YulAssignment","src":"4998:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5011:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5015:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5019:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5004:6:85"},"nodeType":"YulFunctionCall","src":"5004:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"4998:2:85"}]},{"nodeType":"YulAssignment","src":"5034:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5047:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5051:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5055:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5040:6:85"},"nodeType":"YulFunctionCall","src":"5040:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5034:2:85"}]},{"nodeType":"YulAssignment","src":"5070:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5083:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5087:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5091:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5076:6:85"},"nodeType":"YulFunctionCall","src":"5076:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5070:2:85"}]},{"nodeType":"YulAssignment","src":"5106:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5119:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"5123:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5127:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5112:6:85"},"nodeType":"YulFunctionCall","src":"5112:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5106:2:85"}]},{"nodeType":"YulAssignment","src":"5142:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5155:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5159:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5163:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5148:6:85"},"nodeType":"YulFunctionCall","src":"5148:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5142:2:85"}]},{"nodeType":"YulAssignment","src":"5178:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5191:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5195:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5199:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5184:6:85"},"nodeType":"YulFunctionCall","src":"5184:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5178:2:85"}]},{"nodeType":"YulAssignment","src":"5214:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5227:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5231:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5235:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5220:6:85"},"nodeType":"YulFunctionCall","src":"5220:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5214:2:85"}]},{"nodeType":"YulAssignment","src":"5250:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5263:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5267:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5271:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5256:6:85"},"nodeType":"YulFunctionCall","src":"5256:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5250:2:85"}]},{"nodeType":"YulAssignment","src":"5286:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5299:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5303:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5307:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5292:6:85"},"nodeType":"YulFunctionCall","src":"5292:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5286:2:85"}]},{"nodeType":"YulAssignment","src":"5322:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5335:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5339:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5343:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5328:6:85"},"nodeType":"YulFunctionCall","src":"5328:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5322:2:85"}]},{"nodeType":"YulAssignment","src":"5358:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5371:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5375:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5379:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5364:6:85"},"nodeType":"YulFunctionCall","src":"5364:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5358:2:85"}]},{"nodeType":"YulAssignment","src":"5394:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5407:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5411:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5415:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5400:6:85"},"nodeType":"YulFunctionCall","src":"5400:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5394:2:85"}]},{"nodeType":"YulAssignment","src":"5430:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5443:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"5447:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5451:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5436:6:85"},"nodeType":"YulFunctionCall","src":"5436:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5430:2:85"}]},{"nodeType":"YulAssignment","src":"5466:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5479:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5483:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5487:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5472:6:85"},"nodeType":"YulFunctionCall","src":"5472:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5466:2:85"}]},{"nodeType":"YulAssignment","src":"5502:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5515:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5519:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5523:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5508:6:85"},"nodeType":"YulFunctionCall","src":"5508:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5502:2:85"}]},{"nodeType":"YulAssignment","src":"5538:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5551:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5555:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5559:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5544:6:85"},"nodeType":"YulFunctionCall","src":"5544:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5538:2:85"}]},{"nodeType":"YulAssignment","src":"5574:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5587:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5591:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5595:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5580:6:85"},"nodeType":"YulFunctionCall","src":"5580:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5574:2:85"}]},{"nodeType":"YulAssignment","src":"5610:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5623:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5627:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5631:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5616:6:85"},"nodeType":"YulFunctionCall","src":"5616:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5610:2:85"}]},{"nodeType":"YulAssignment","src":"5646:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5659:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5663:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5667:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5652:6:85"},"nodeType":"YulFunctionCall","src":"5652:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5646:2:85"}]},{"nodeType":"YulAssignment","src":"5682:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5695:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5699:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5703:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5688:6:85"},"nodeType":"YulFunctionCall","src":"5688:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5682:2:85"}]},{"nodeType":"YulAssignment","src":"5718:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5731:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5735:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5739:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5724:6:85"},"nodeType":"YulFunctionCall","src":"5724:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5718:2:85"}]},{"nodeType":"YulAssignment","src":"5754:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5767:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5771:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5775:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5760:6:85"},"nodeType":"YulFunctionCall","src":"5760:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5754:2:85"}]},{"nodeType":"YulAssignment","src":"5790:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5803:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"5807:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5811:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5796:6:85"},"nodeType":"YulFunctionCall","src":"5796:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5790:2:85"}]},{"nodeType":"YulAssignment","src":"5826:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5839:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5843:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5847:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5832:6:85"},"nodeType":"YulFunctionCall","src":"5832:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5826:2:85"}]},{"nodeType":"YulAssignment","src":"5862:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5875:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5879:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5883:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5868:6:85"},"nodeType":"YulFunctionCall","src":"5868:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5862:2:85"}]},{"nodeType":"YulAssignment","src":"5898:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5911:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5915:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5919:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5904:6:85"},"nodeType":"YulFunctionCall","src":"5904:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5898:2:85"}]},{"nodeType":"YulAssignment","src":"5934:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5947:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"5951:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5955:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5940:6:85"},"nodeType":"YulFunctionCall","src":"5940:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5934:2:85"}]},{"nodeType":"YulAssignment","src":"5970:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"5983:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"5987:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"5991:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"5976:6:85"},"nodeType":"YulFunctionCall","src":"5976:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"5970:2:85"}]},{"nodeType":"YulAssignment","src":"6006:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6019:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6023:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6027:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6012:6:85"},"nodeType":"YulFunctionCall","src":"6012:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6006:2:85"}]},{"nodeType":"YulAssignment","src":"6042:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6055:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6059:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6063:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6048:6:85"},"nodeType":"YulFunctionCall","src":"6048:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6042:2:85"}]},{"nodeType":"YulAssignment","src":"6078:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6091:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6095:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6099:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6084:6:85"},"nodeType":"YulFunctionCall","src":"6084:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6078:2:85"}]},{"nodeType":"YulAssignment","src":"6114:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6127:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6131:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6135:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6120:6:85"},"nodeType":"YulFunctionCall","src":"6120:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6114:2:85"}]},{"nodeType":"YulAssignment","src":"6150:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6163:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6167:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6171:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6156:6:85"},"nodeType":"YulFunctionCall","src":"6156:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6150:2:85"}]},{"nodeType":"YulAssignment","src":"6186:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6199:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6203:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6207:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6192:6:85"},"nodeType":"YulFunctionCall","src":"6192:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6186:2:85"}]},{"nodeType":"YulAssignment","src":"6222:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6235:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6239:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6243:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6228:6:85"},"nodeType":"YulFunctionCall","src":"6228:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6222:2:85"}]},{"nodeType":"YulAssignment","src":"6258:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6271:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"6275:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6279:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6264:6:85"},"nodeType":"YulFunctionCall","src":"6264:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6258:2:85"}]},{"nodeType":"YulAssignment","src":"6294:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6307:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6311:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6315:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6300:6:85"},"nodeType":"YulFunctionCall","src":"6300:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6294:2:85"}]},{"nodeType":"YulAssignment","src":"6330:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6343:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6347:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6351:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6336:6:85"},"nodeType":"YulFunctionCall","src":"6336:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6330:2:85"}]},{"nodeType":"YulAssignment","src":"6366:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6379:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6383:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6387:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6372:6:85"},"nodeType":"YulFunctionCall","src":"6372:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6366:2:85"}]},{"nodeType":"YulAssignment","src":"6402:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6415:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6419:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6423:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6408:6:85"},"nodeType":"YulFunctionCall","src":"6408:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6402:2:85"}]},{"nodeType":"YulAssignment","src":"6438:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6451:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"6455:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6459:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6444:6:85"},"nodeType":"YulFunctionCall","src":"6444:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6438:2:85"}]},{"nodeType":"YulAssignment","src":"6474:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6487:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6491:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6495:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6480:6:85"},"nodeType":"YulFunctionCall","src":"6480:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6474:2:85"}]},{"nodeType":"YulAssignment","src":"6510:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6523:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6527:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6531:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6516:6:85"},"nodeType":"YulFunctionCall","src":"6516:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6510:2:85"}]},{"nodeType":"YulAssignment","src":"6546:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6559:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6563:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6567:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6552:6:85"},"nodeType":"YulFunctionCall","src":"6552:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6546:2:85"}]},{"nodeType":"YulAssignment","src":"6582:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6595:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6599:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6603:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6588:6:85"},"nodeType":"YulFunctionCall","src":"6588:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6582:2:85"}]},{"nodeType":"YulAssignment","src":"6618:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6631:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6635:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6639:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6624:6:85"},"nodeType":"YulFunctionCall","src":"6624:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6618:2:85"}]},{"nodeType":"YulAssignment","src":"6654:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6667:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"6671:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6675:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6660:6:85"},"nodeType":"YulFunctionCall","src":"6660:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6654:2:85"}]},{"nodeType":"YulAssignment","src":"6690:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6703:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6707:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6711:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6696:6:85"},"nodeType":"YulFunctionCall","src":"6696:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6690:2:85"}]},{"nodeType":"YulAssignment","src":"6726:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6739:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6743:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6747:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6732:6:85"},"nodeType":"YulFunctionCall","src":"6732:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6726:2:85"}]},{"nodeType":"YulAssignment","src":"6762:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6775:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6779:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6783:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6768:6:85"},"nodeType":"YulFunctionCall","src":"6768:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6762:2:85"}]},{"nodeType":"YulAssignment","src":"6798:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6811:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"6815:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6819:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6804:6:85"},"nodeType":"YulFunctionCall","src":"6804:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6798:2:85"}]},{"nodeType":"YulAssignment","src":"6834:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6847:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6851:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6855:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6840:6:85"},"nodeType":"YulFunctionCall","src":"6840:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6834:2:85"}]},{"nodeType":"YulAssignment","src":"6870:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6883:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6887:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6891:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6876:6:85"},"nodeType":"YulFunctionCall","src":"6876:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6870:2:85"}]},{"nodeType":"YulAssignment","src":"6906:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6919:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6923:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6927:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6912:6:85"},"nodeType":"YulFunctionCall","src":"6912:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6906:2:85"}]},{"nodeType":"YulAssignment","src":"6942:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6955:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6959:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6963:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6948:6:85"},"nodeType":"YulFunctionCall","src":"6948:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6942:2:85"}]},{"nodeType":"YulAssignment","src":"6978:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"6991:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"6995:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"6999:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"6984:6:85"},"nodeType":"YulFunctionCall","src":"6984:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"6978:2:85"}]},{"nodeType":"YulAssignment","src":"7014:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7027:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7031:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7035:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7020:6:85"},"nodeType":"YulFunctionCall","src":"7020:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7014:2:85"}]},{"nodeType":"YulAssignment","src":"7050:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7063:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7067:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7071:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7056:6:85"},"nodeType":"YulFunctionCall","src":"7056:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7050:2:85"}]},{"nodeType":"YulAssignment","src":"7086:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7099:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7103:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7107:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7092:6:85"},"nodeType":"YulFunctionCall","src":"7092:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7086:2:85"}]},{"nodeType":"YulAssignment","src":"7122:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7135:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7139:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7143:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7128:6:85"},"nodeType":"YulFunctionCall","src":"7128:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7122:2:85"}]},{"nodeType":"YulAssignment","src":"7158:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7171:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7175:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7179:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7164:6:85"},"nodeType":"YulFunctionCall","src":"7164:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7158:2:85"}]},{"nodeType":"YulAssignment","src":"7194:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7207:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"7211:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7215:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7200:6:85"},"nodeType":"YulFunctionCall","src":"7200:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7194:2:85"}]},{"nodeType":"YulAssignment","src":"7230:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7243:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7247:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7251:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7236:6:85"},"nodeType":"YulFunctionCall","src":"7236:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7230:2:85"}]},{"nodeType":"YulAssignment","src":"7266:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7279:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7283:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7287:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7272:6:85"},"nodeType":"YulFunctionCall","src":"7272:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7266:2:85"}]},{"nodeType":"YulAssignment","src":"7302:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7315:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7319:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7323:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7308:6:85"},"nodeType":"YulFunctionCall","src":"7308:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7302:2:85"}]},{"nodeType":"YulAssignment","src":"7338:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7351:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7355:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7359:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7344:6:85"},"nodeType":"YulFunctionCall","src":"7344:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7338:2:85"}]},{"nodeType":"YulAssignment","src":"7374:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7387:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"7391:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7395:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7380:6:85"},"nodeType":"YulFunctionCall","src":"7380:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7374:2:85"}]},{"nodeType":"YulAssignment","src":"7410:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7423:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7427:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7431:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7416:6:85"},"nodeType":"YulFunctionCall","src":"7416:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7410:2:85"}]},{"nodeType":"YulAssignment","src":"7446:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7459:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7463:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7467:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7452:6:85"},"nodeType":"YulFunctionCall","src":"7452:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7446:2:85"}]},{"nodeType":"YulAssignment","src":"7482:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7495:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7499:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7503:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7488:6:85"},"nodeType":"YulFunctionCall","src":"7488:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7482:2:85"}]},{"nodeType":"YulAssignment","src":"7518:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7531:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7535:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7539:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7524:6:85"},"nodeType":"YulFunctionCall","src":"7524:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7518:2:85"}]},{"nodeType":"YulAssignment","src":"7554:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7567:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7571:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7575:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7560:6:85"},"nodeType":"YulFunctionCall","src":"7560:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7554:2:85"}]},{"nodeType":"YulAssignment","src":"7590:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7603:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"7607:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7611:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7596:6:85"},"nodeType":"YulFunctionCall","src":"7596:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7590:2:85"}]},{"nodeType":"YulAssignment","src":"7626:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7639:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7643:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7647:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7632:6:85"},"nodeType":"YulFunctionCall","src":"7632:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7626:2:85"}]},{"nodeType":"YulAssignment","src":"7662:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7675:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7679:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7683:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7668:6:85"},"nodeType":"YulFunctionCall","src":"7668:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7662:2:85"}]},{"nodeType":"YulAssignment","src":"7698:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7711:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7715:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7719:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7704:6:85"},"nodeType":"YulFunctionCall","src":"7704:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7698:2:85"}]},{"nodeType":"YulAssignment","src":"7734:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7747:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7751:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7755:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7740:6:85"},"nodeType":"YulFunctionCall","src":"7740:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7734:2:85"}]},{"nodeType":"YulAssignment","src":"7770:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7783:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7787:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7791:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7776:6:85"},"nodeType":"YulFunctionCall","src":"7776:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7770:2:85"}]},{"nodeType":"YulAssignment","src":"7806:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7819:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7823:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7827:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7812:6:85"},"nodeType":"YulFunctionCall","src":"7812:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7806:2:85"}]},{"nodeType":"YulAssignment","src":"7842:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7855:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7859:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7863:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7848:6:85"},"nodeType":"YulFunctionCall","src":"7848:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7842:2:85"}]},{"nodeType":"YulAssignment","src":"7878:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7891:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"7895:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7899:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7884:6:85"},"nodeType":"YulFunctionCall","src":"7884:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7878:2:85"}]},{"nodeType":"YulAssignment","src":"7914:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7927:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7931:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7935:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7920:6:85"},"nodeType":"YulFunctionCall","src":"7920:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7914:2:85"}]},{"nodeType":"YulAssignment","src":"7950:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7963:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"7967:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"7971:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7956:6:85"},"nodeType":"YulFunctionCall","src":"7956:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7950:2:85"}]},{"nodeType":"YulAssignment","src":"7986:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"7999:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"8003:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8007:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"7992:6:85"},"nodeType":"YulFunctionCall","src":"7992:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"7986:2:85"}]},{"nodeType":"YulAssignment","src":"8022:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8035:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8039:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8043:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8028:6:85"},"nodeType":"YulFunctionCall","src":"8028:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8022:2:85"}]},{"nodeType":"YulAssignment","src":"8058:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8071:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8075:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8079:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8064:6:85"},"nodeType":"YulFunctionCall","src":"8064:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8058:2:85"}]},{"nodeType":"YulAssignment","src":"8094:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8107:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8111:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8115:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8100:6:85"},"nodeType":"YulFunctionCall","src":"8100:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8094:2:85"}]},{"nodeType":"YulAssignment","src":"8130:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8143:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8147:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8151:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8136:6:85"},"nodeType":"YulFunctionCall","src":"8136:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8130:2:85"}]},{"nodeType":"YulAssignment","src":"8166:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8179:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8183:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8187:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8172:6:85"},"nodeType":"YulFunctionCall","src":"8172:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8166:2:85"}]},{"nodeType":"YulAssignment","src":"8202:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8215:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8219:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8223:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8208:6:85"},"nodeType":"YulFunctionCall","src":"8208:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8202:2:85"}]},{"nodeType":"YulAssignment","src":"8238:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8251:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8255:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8259:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8244:6:85"},"nodeType":"YulFunctionCall","src":"8244:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8238:2:85"}]},{"nodeType":"YulAssignment","src":"8274:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8287:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"8291:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8295:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8280:6:85"},"nodeType":"YulFunctionCall","src":"8280:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8274:2:85"}]},{"nodeType":"YulAssignment","src":"8310:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8323:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8327:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8331:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8316:6:85"},"nodeType":"YulFunctionCall","src":"8316:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8310:2:85"}]},{"nodeType":"YulAssignment","src":"8346:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8359:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8363:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8367:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8352:6:85"},"nodeType":"YulFunctionCall","src":"8352:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8346:2:85"}]},{"nodeType":"YulAssignment","src":"8382:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8395:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8399:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8403:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8388:6:85"},"nodeType":"YulFunctionCall","src":"8388:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8382:2:85"}]},{"nodeType":"YulAssignment","src":"8418:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8431:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8435:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8439:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8424:6:85"},"nodeType":"YulFunctionCall","src":"8424:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8418:2:85"}]},{"nodeType":"YulAssignment","src":"8454:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8467:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8471:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8475:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8460:6:85"},"nodeType":"YulFunctionCall","src":"8460:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8454:2:85"}]},{"nodeType":"YulAssignment","src":"8490:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8503:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8507:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8511:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8496:6:85"},"nodeType":"YulFunctionCall","src":"8496:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8490:2:85"}]},{"nodeType":"YulAssignment","src":"8526:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8539:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"8543:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8547:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8532:6:85"},"nodeType":"YulFunctionCall","src":"8532:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8526:2:85"}]},{"nodeType":"YulAssignment","src":"8562:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8575:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8579:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8583:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8568:6:85"},"nodeType":"YulFunctionCall","src":"8568:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8562:2:85"}]},{"nodeType":"YulAssignment","src":"8598:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8611:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8615:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8619:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8604:6:85"},"nodeType":"YulFunctionCall","src":"8604:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8598:2:85"}]},{"nodeType":"YulAssignment","src":"8634:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8647:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8651:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8655:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8640:6:85"},"nodeType":"YulFunctionCall","src":"8640:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8634:2:85"}]},{"nodeType":"YulAssignment","src":"8670:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8683:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8687:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8691:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8676:6:85"},"nodeType":"YulFunctionCall","src":"8676:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8670:2:85"}]},{"nodeType":"YulAssignment","src":"8706:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8719:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8723:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8727:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8712:6:85"},"nodeType":"YulFunctionCall","src":"8712:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8706:2:85"}]},{"nodeType":"YulAssignment","src":"8742:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8755:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"8759:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8763:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8748:6:85"},"nodeType":"YulFunctionCall","src":"8748:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8742:2:85"}]},{"nodeType":"YulAssignment","src":"8778:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8791:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8795:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8799:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8784:6:85"},"nodeType":"YulFunctionCall","src":"8784:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8778:2:85"}]},{"nodeType":"YulAssignment","src":"8814:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8827:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8831:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8835:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8820:6:85"},"nodeType":"YulFunctionCall","src":"8820:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8814:2:85"}]},{"nodeType":"YulAssignment","src":"8850:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8863:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"8867:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8871:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8856:6:85"},"nodeType":"YulFunctionCall","src":"8856:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8850:2:85"}]},{"nodeType":"YulAssignment","src":"8886:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8899:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8903:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8907:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8892:6:85"},"nodeType":"YulFunctionCall","src":"8892:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8886:2:85"}]},{"nodeType":"YulAssignment","src":"8922:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8935:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8939:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8943:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8928:6:85"},"nodeType":"YulFunctionCall","src":"8928:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8922:2:85"}]},{"nodeType":"YulAssignment","src":"8958:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"8971:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"8975:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"8979:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"8964:6:85"},"nodeType":"YulFunctionCall","src":"8964:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8958:2:85"}]},{"nodeType":"YulAssignment","src":"8994:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9007:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9011:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9015:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9000:6:85"},"nodeType":"YulFunctionCall","src":"9000:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"8994:2:85"}]},{"nodeType":"YulAssignment","src":"9030:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9043:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9047:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9051:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9036:6:85"},"nodeType":"YulFunctionCall","src":"9036:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9030:2:85"}]},{"nodeType":"YulAssignment","src":"9066:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9079:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9083:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9087:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9072:6:85"},"nodeType":"YulFunctionCall","src":"9072:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9066:2:85"}]},{"nodeType":"YulAssignment","src":"9102:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9115:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9119:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9123:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9108:6:85"},"nodeType":"YulFunctionCall","src":"9108:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9102:2:85"}]},{"nodeType":"YulAssignment","src":"9138:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9151:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"9155:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9159:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9144:6:85"},"nodeType":"YulFunctionCall","src":"9144:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9138:2:85"}]},{"nodeType":"YulAssignment","src":"9174:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9187:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9191:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9195:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9180:6:85"},"nodeType":"YulFunctionCall","src":"9180:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9174:2:85"}]},{"nodeType":"YulAssignment","src":"9210:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9223:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9227:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9231:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9216:6:85"},"nodeType":"YulFunctionCall","src":"9216:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9210:2:85"}]},{"nodeType":"YulAssignment","src":"9246:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9259:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9263:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9267:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9252:6:85"},"nodeType":"YulFunctionCall","src":"9252:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9246:2:85"}]},{"nodeType":"YulAssignment","src":"9282:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9295:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9299:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9303:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9288:6:85"},"nodeType":"YulFunctionCall","src":"9288:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9282:2:85"}]},{"nodeType":"YulAssignment","src":"9318:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9331:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9335:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9339:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9324:6:85"},"nodeType":"YulFunctionCall","src":"9324:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9318:2:85"}]},{"nodeType":"YulAssignment","src":"9354:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9367:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9371:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9375:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9360:6:85"},"nodeType":"YulFunctionCall","src":"9360:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9354:2:85"}]},{"nodeType":"YulAssignment","src":"9390:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9403:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"9407:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9411:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9396:6:85"},"nodeType":"YulFunctionCall","src":"9396:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9390:2:85"}]},{"nodeType":"YulAssignment","src":"9426:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9439:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9443:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9447:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9432:6:85"},"nodeType":"YulFunctionCall","src":"9432:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9426:2:85"}]},{"nodeType":"YulAssignment","src":"9462:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9475:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9479:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9483:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9468:6:85"},"nodeType":"YulFunctionCall","src":"9468:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9462:2:85"}]},{"nodeType":"YulAssignment","src":"9498:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9511:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9515:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9519:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9504:6:85"},"nodeType":"YulFunctionCall","src":"9504:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9498:2:85"}]},{"nodeType":"YulAssignment","src":"9534:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9547:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9551:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9555:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9540:6:85"},"nodeType":"YulFunctionCall","src":"9540:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9534:2:85"}]},{"nodeType":"YulAssignment","src":"9570:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9583:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9587:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9591:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9576:6:85"},"nodeType":"YulFunctionCall","src":"9576:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9570:2:85"}]},{"nodeType":"YulAssignment","src":"9606:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9619:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"9623:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9627:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9612:6:85"},"nodeType":"YulFunctionCall","src":"9612:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9606:2:85"}]},{"nodeType":"YulAssignment","src":"9642:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9655:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9659:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9663:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9648:6:85"},"nodeType":"YulFunctionCall","src":"9648:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9642:2:85"}]},{"nodeType":"YulAssignment","src":"9678:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9691:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9695:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9699:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9684:6:85"},"nodeType":"YulFunctionCall","src":"9684:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9678:2:85"}]},{"nodeType":"YulAssignment","src":"9714:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9727:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9731:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9735:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9720:6:85"},"nodeType":"YulFunctionCall","src":"9720:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9714:2:85"}]},{"nodeType":"YulAssignment","src":"9750:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9763:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9767:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9771:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9756:6:85"},"nodeType":"YulFunctionCall","src":"9756:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9750:2:85"}]},{"nodeType":"YulAssignment","src":"9786:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9799:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9803:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9807:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9792:6:85"},"nodeType":"YulFunctionCall","src":"9792:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9786:2:85"}]},{"nodeType":"YulAssignment","src":"9822:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9835:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9839:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9843:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9828:6:85"},"nodeType":"YulFunctionCall","src":"9828:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9822:2:85"}]},{"nodeType":"YulAssignment","src":"9858:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9871:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"9875:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9879:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9864:6:85"},"nodeType":"YulFunctionCall","src":"9864:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9858:2:85"}]},{"nodeType":"YulAssignment","src":"9894:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9907:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9911:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9915:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9900:6:85"},"nodeType":"YulFunctionCall","src":"9900:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9894:2:85"}]},{"nodeType":"YulAssignment","src":"9930:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9943:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9947:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9951:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9936:6:85"},"nodeType":"YulFunctionCall","src":"9936:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9930:2:85"}]},{"nodeType":"YulAssignment","src":"9966:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"9979:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"9983:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"9987:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"9972:6:85"},"nodeType":"YulFunctionCall","src":"9972:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"9966:2:85"}]},{"nodeType":"YulAssignment","src":"10002:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10015:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10019:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10023:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10008:6:85"},"nodeType":"YulFunctionCall","src":"10008:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10002:2:85"}]},{"nodeType":"YulAssignment","src":"10038:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10051:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10055:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10059:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10044:6:85"},"nodeType":"YulFunctionCall","src":"10044:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10038:2:85"}]},{"nodeType":"YulAssignment","src":"10074:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10087:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"10091:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10095:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10080:6:85"},"nodeType":"YulFunctionCall","src":"10080:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10074:2:85"}]},{"nodeType":"YulAssignment","src":"10110:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10123:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10127:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10131:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10116:6:85"},"nodeType":"YulFunctionCall","src":"10116:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10110:2:85"}]},{"nodeType":"YulAssignment","src":"10146:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10159:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10163:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10167:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10152:6:85"},"nodeType":"YulFunctionCall","src":"10152:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10146:2:85"}]},{"nodeType":"YulAssignment","src":"10182:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10195:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10199:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10203:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10188:6:85"},"nodeType":"YulFunctionCall","src":"10188:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10182:2:85"}]},{"nodeType":"YulAssignment","src":"10218:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10231:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10235:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10239:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10224:6:85"},"nodeType":"YulFunctionCall","src":"10224:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10218:2:85"}]},{"nodeType":"YulAssignment","src":"10254:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10267:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10271:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10275:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10260:6:85"},"nodeType":"YulFunctionCall","src":"10260:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10254:2:85"}]},{"nodeType":"YulAssignment","src":"10290:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10303:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10307:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10311:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10296:6:85"},"nodeType":"YulFunctionCall","src":"10296:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10290:2:85"}]},{"nodeType":"YulAssignment","src":"10326:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10339:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10343:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10347:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10332:6:85"},"nodeType":"YulFunctionCall","src":"10332:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10326:2:85"}]},{"nodeType":"YulAssignment","src":"10362:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10375:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10379:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10383:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10368:6:85"},"nodeType":"YulFunctionCall","src":"10368:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10362:2:85"}]},{"nodeType":"YulAssignment","src":"10398:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10411:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10415:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10419:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10404:6:85"},"nodeType":"YulFunctionCall","src":"10404:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10398:2:85"}]},{"nodeType":"YulAssignment","src":"10434:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10447:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"10451:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10455:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10440:6:85"},"nodeType":"YulFunctionCall","src":"10440:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10434:2:85"}]},{"nodeType":"YulAssignment","src":"10470:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10483:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10487:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10491:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10476:6:85"},"nodeType":"YulFunctionCall","src":"10476:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10470:2:85"}]},{"nodeType":"YulAssignment","src":"10506:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10519:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10523:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10527:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10512:6:85"},"nodeType":"YulFunctionCall","src":"10512:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10506:2:85"}]},{"nodeType":"YulAssignment","src":"10542:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10555:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10559:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10563:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10548:6:85"},"nodeType":"YulFunctionCall","src":"10548:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10542:2:85"}]},{"nodeType":"YulAssignment","src":"10578:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10591:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"10595:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10599:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10584:6:85"},"nodeType":"YulFunctionCall","src":"10584:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10578:2:85"}]},{"nodeType":"YulAssignment","src":"10614:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10627:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10631:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10635:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10620:6:85"},"nodeType":"YulFunctionCall","src":"10620:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10614:2:85"}]},{"nodeType":"YulAssignment","src":"10650:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10663:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10667:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10671:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10656:6:85"},"nodeType":"YulFunctionCall","src":"10656:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10650:2:85"}]},{"nodeType":"YulAssignment","src":"10686:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10699:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10703:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10707:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10692:6:85"},"nodeType":"YulFunctionCall","src":"10692:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10686:2:85"}]},{"nodeType":"YulAssignment","src":"10722:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10735:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"10739:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10743:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10728:6:85"},"nodeType":"YulFunctionCall","src":"10728:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10722:2:85"}]},{"nodeType":"YulAssignment","src":"10758:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10771:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10775:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10779:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10764:6:85"},"nodeType":"YulFunctionCall","src":"10764:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10758:2:85"}]},{"nodeType":"YulAssignment","src":"10794:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10807:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10811:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10815:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10800:6:85"},"nodeType":"YulFunctionCall","src":"10800:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10794:2:85"}]},{"nodeType":"YulAssignment","src":"10830:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10843:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10847:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10851:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10836:6:85"},"nodeType":"YulFunctionCall","src":"10836:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10830:2:85"}]},{"nodeType":"YulAssignment","src":"10866:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10879:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10883:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10887:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10872:6:85"},"nodeType":"YulFunctionCall","src":"10872:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10866:2:85"}]},{"nodeType":"YulAssignment","src":"10902:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10915:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10919:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10923:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10908:6:85"},"nodeType":"YulFunctionCall","src":"10908:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10902:2:85"}]},{"nodeType":"YulAssignment","src":"10938:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10951:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10955:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10959:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10944:6:85"},"nodeType":"YulFunctionCall","src":"10944:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10938:2:85"}]},{"nodeType":"YulAssignment","src":"10974:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"10987:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"10991:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"10995:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"10980:6:85"},"nodeType":"YulFunctionCall","src":"10980:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"10974:2:85"}]},{"nodeType":"YulAssignment","src":"11010:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11023:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11027:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11031:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11016:6:85"},"nodeType":"YulFunctionCall","src":"11016:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11010:2:85"}]},{"nodeType":"YulAssignment","src":"11046:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11059:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"11063:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11067:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11052:6:85"},"nodeType":"YulFunctionCall","src":"11052:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11046:2:85"}]},{"nodeType":"YulAssignment","src":"11082:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11095:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11099:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11103:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11088:6:85"},"nodeType":"YulFunctionCall","src":"11088:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11082:2:85"}]},{"nodeType":"YulAssignment","src":"11118:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11131:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11135:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11139:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11124:6:85"},"nodeType":"YulFunctionCall","src":"11124:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11118:2:85"}]},{"nodeType":"YulAssignment","src":"11154:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11167:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11171:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11175:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11160:6:85"},"nodeType":"YulFunctionCall","src":"11160:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11154:2:85"}]},{"nodeType":"YulAssignment","src":"11190:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11203:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11207:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11211:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11196:6:85"},"nodeType":"YulFunctionCall","src":"11196:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11190:2:85"}]},{"nodeType":"YulAssignment","src":"11226:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11239:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"11243:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11247:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11232:6:85"},"nodeType":"YulFunctionCall","src":"11232:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11226:2:85"}]},{"nodeType":"YulAssignment","src":"11262:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11275:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11279:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11283:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11268:6:85"},"nodeType":"YulFunctionCall","src":"11268:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11262:2:85"}]},{"nodeType":"YulAssignment","src":"11298:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11311:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11315:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11319:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11304:6:85"},"nodeType":"YulFunctionCall","src":"11304:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11298:2:85"}]},{"nodeType":"YulAssignment","src":"11334:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11347:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11351:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11355:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11340:6:85"},"nodeType":"YulFunctionCall","src":"11340:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11334:2:85"}]},{"nodeType":"YulAssignment","src":"11370:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11383:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11387:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11391:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11376:6:85"},"nodeType":"YulFunctionCall","src":"11376:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11370:2:85"}]},{"nodeType":"YulAssignment","src":"11406:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11419:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"11423:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11427:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11412:6:85"},"nodeType":"YulFunctionCall","src":"11412:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11406:2:85"}]},{"nodeType":"YulAssignment","src":"11442:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11455:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11459:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11463:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11448:6:85"},"nodeType":"YulFunctionCall","src":"11448:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11442:2:85"}]},{"nodeType":"YulAssignment","src":"11478:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11491:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11495:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11499:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11484:6:85"},"nodeType":"YulFunctionCall","src":"11484:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11478:2:85"}]},{"nodeType":"YulAssignment","src":"11514:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11527:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11531:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11535:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11520:6:85"},"nodeType":"YulFunctionCall","src":"11520:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11514:2:85"}]},{"nodeType":"YulAssignment","src":"11550:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11563:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"11567:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11571:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11556:6:85"},"nodeType":"YulFunctionCall","src":"11556:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11550:2:85"}]},{"nodeType":"YulAssignment","src":"11586:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11599:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11603:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11607:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11592:6:85"},"nodeType":"YulFunctionCall","src":"11592:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11586:2:85"}]},{"nodeType":"YulAssignment","src":"11622:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11635:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11639:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11643:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11628:6:85"},"nodeType":"YulFunctionCall","src":"11628:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11622:2:85"}]},{"nodeType":"YulAssignment","src":"11658:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11671:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"11675:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11679:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11664:6:85"},"nodeType":"YulFunctionCall","src":"11664:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11658:2:85"}]},{"nodeType":"YulAssignment","src":"11694:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11707:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11711:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11715:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11700:6:85"},"nodeType":"YulFunctionCall","src":"11700:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11694:2:85"}]},{"nodeType":"YulAssignment","src":"11730:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11743:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11747:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11751:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11736:6:85"},"nodeType":"YulFunctionCall","src":"11736:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11730:2:85"}]},{"nodeType":"YulAssignment","src":"11766:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11779:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11783:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11787:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11772:6:85"},"nodeType":"YulFunctionCall","src":"11772:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11766:2:85"}]},{"nodeType":"YulAssignment","src":"11802:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11815:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11819:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11823:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11808:6:85"},"nodeType":"YulFunctionCall","src":"11808:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11802:2:85"}]},{"nodeType":"YulAssignment","src":"11838:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11851:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11855:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11859:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11844:6:85"},"nodeType":"YulFunctionCall","src":"11844:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11838:2:85"}]},{"nodeType":"YulAssignment","src":"11874:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11887:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"11891:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11895:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11880:6:85"},"nodeType":"YulFunctionCall","src":"11880:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11874:2:85"}]},{"nodeType":"YulAssignment","src":"11910:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"11923:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"11927:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"11931:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"11916:6:85"},"nodeType":"YulFunctionCall","src":"11916:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"11910:2:85"}]}]},"evmVersion":"london","externalReferences":[{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10002:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10015:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10019:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10038:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10051:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10055:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10074:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1007:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10087:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10110:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10123:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10127:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10146:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10159:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10163:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10182:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10195:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10199:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10218:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10231:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10235:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10254:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10267:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10271:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10290:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10303:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10307:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10326:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10339:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10343:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10362:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10375:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10379:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10398:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10411:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10415:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10434:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10447:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10470:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10483:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10487:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10506:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10519:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10523:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10542:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10555:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10559:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10578:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10591:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10614:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10627:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10631:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10650:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10663:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10667:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10686:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10699:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10703:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10722:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10735:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10758:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10771:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10775:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10794:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10807:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10811:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10830:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10843:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10847:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10866:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10879:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10883:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10902:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10915:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10919:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10938:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10951:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10955:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10974:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10987:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"10991:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11010:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11023:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11027:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11046:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11059:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1106:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11082:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11095:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11099:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11118:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11131:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11135:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11154:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11167:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11171:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11190:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11203:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11207:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11226:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11239:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11262:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11275:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11279:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11298:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11311:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11315:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11334:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11347:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11351:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11370:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11383:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11387:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11406:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11419:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11442:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11455:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11459:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11478:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11491:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11495:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11514:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11527:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11531:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11550:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11563:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11586:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11599:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11603:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11622:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11635:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11639:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11658:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11671:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11694:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11707:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11711:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11730:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11743:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11747:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11766:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11779:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11783:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11802:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11815:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11819:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11838:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11851:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11855:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11874:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11887:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11891:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11910:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"11923:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1218:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1231:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1235:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1254:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1267:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1271:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1290:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1303:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1307:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1326:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1339:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1343:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1362:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1375:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1379:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1398:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1411:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1434:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1447:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1451:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1470:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1483:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1487:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1506:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1519:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1523:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1542:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1555:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1578:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1591:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1595:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1614:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1627:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1631:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1650:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1663:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1667:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1686:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1699:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1703:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1722:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1735:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1758:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1771:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1775:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1794:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1807:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1811:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1830:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1843:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1847:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1866:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1879:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1883:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1902:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1915:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1919:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1938:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1951:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1974:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1987:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"1991:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2010:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2023:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2027:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2046:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2059:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2063:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2082:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2095:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2099:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2118:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2131:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2135:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2154:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2167:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2190:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2203:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2207:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2226:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2239:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2243:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2262:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2275:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2279:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2298:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2311:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2334:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2347:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2351:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2370:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2383:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2387:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2406:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2419:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2423:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2442:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2455:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2459:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2478:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2491:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2514:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2527:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2531:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2550:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2563:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2567:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2586:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2599:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2603:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2622:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2635:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2639:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2658:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2671:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2675:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2694:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2707:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2730:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2743:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2747:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2766:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2779:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2783:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2802:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2815:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2819:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2838:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2851:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2855:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2874:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2887:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2910:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2923:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2927:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2946:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2959:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2963:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2982:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2995:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"2999:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3018:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3031:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3035:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3054:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3067:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3071:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3090:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3103:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3107:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3126:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3139:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3143:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3162:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3175:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3198:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3211:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3215:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3234:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3247:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3251:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3270:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3283:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3287:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3306:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3319:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3323:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3342:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3355:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3359:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3378:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3391:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3395:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3414:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3427:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3431:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3450:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3463:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3467:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3486:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3499:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3503:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3522:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3535:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3539:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3558:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3571:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3594:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3607:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3611:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3630:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3643:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3647:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3666:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3679:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3683:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3702:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3715:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3719:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3738:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3751:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3774:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3787:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3791:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3810:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3823:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3827:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3846:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3859:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3863:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3882:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3895:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3899:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3918:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3931:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3954:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3967:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3971:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"3990:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4003:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4007:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4026:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4039:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4043:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4062:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4075:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4079:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4098:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4111:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4115:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4134:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4147:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4151:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4170:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4183:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4187:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4206:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4219:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4242:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4255:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4259:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4278:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4291:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4295:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4314:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4327:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4331:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4350:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4363:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4367:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4386:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4399:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4403:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4422:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4435:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4439:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4458:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4471:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4494:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4507:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4511:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4530:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4543:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4547:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4566:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4579:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4583:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4602:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4615:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4619:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4638:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4651:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4655:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4674:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4687:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4691:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4710:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4723:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4727:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4746:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4759:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4782:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4795:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4799:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4818:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4831:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4835:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4854:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4867:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4871:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4890:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4903:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4907:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4926:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4939:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4943:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4962:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4975:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"4998:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5011:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5015:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5034:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5047:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5051:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5070:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5083:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5087:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5106:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5119:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5142:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5155:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5159:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5178:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5191:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5195:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5214:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5227:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5231:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5250:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5263:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5267:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5286:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5299:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5303:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5322:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5335:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5339:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5358:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5371:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5375:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5394:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5407:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5411:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5430:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5443:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5466:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5479:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5483:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5502:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5515:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5519:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5538:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5551:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5555:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5574:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5587:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5591:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5610:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5623:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5627:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5646:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5659:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5663:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5682:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5695:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5699:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5718:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5731:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5735:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5754:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5767:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5771:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5790:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5803:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5826:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5839:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5843:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5862:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5875:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5879:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5898:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5911:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5915:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5934:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5947:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5970:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5983:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"5987:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6006:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6019:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6023:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6042:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6055:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6059:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6078:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6091:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6095:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6114:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6127:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6131:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6150:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6163:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6167:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6186:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6199:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6203:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6222:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6235:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6239:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6258:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6271:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6294:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6307:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6311:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6330:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6343:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6347:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6366:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6379:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6383:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6402:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6415:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6419:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6438:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6451:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6474:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6487:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6491:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6510:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6523:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6527:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6546:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6559:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6563:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6582:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6595:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6599:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6618:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6631:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6635:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6654:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6667:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6690:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6703:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6707:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6726:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6739:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6743:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6762:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6775:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6779:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6798:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6811:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6834:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6847:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6851:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6870:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6883:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6887:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6906:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6919:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6923:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6942:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6955:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6959:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6978:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6991:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"6995:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7014:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7027:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7031:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7050:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7063:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7067:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7086:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7099:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7103:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7122:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7135:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7139:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7158:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7171:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7175:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7194:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7207:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7230:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7243:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7247:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7266:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7279:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7283:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7302:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7315:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7319:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7338:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7351:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7355:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7374:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7387:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7410:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7423:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7427:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7446:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7459:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7463:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7482:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7495:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7499:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7518:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7531:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7535:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7554:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7567:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7571:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7590:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7603:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7626:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7639:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7643:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7662:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7675:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7679:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7698:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7711:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7715:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7734:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7747:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7751:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7770:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7783:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7787:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7806:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7819:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7823:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7842:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7855:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7859:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7878:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7891:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7914:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7927:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7931:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7950:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7963:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7967:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7986:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"7999:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8022:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8035:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8039:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8058:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8071:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8075:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8094:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8107:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8111:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8130:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8143:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8147:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8166:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8179:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8183:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8202:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8215:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8219:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8238:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8251:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8255:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8274:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8287:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"830:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8310:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8323:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8327:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8346:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8359:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8363:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8382:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8395:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8399:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8418:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8431:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8435:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8454:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8467:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8471:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8490:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8503:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8507:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8526:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8539:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8562:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8575:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8579:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8598:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8611:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8615:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8634:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8647:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8651:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8670:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8683:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8687:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8706:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8719:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8723:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8742:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8755:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8778:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8791:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8795:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8814:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8827:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8831:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"883:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8850:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8863:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8886:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8899:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8903:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8922:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8935:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8939:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8958:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8971:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8975:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"8994:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9007:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9011:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9030:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9043:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9047:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9066:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9079:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9083:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9102:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9115:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9119:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9138:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9151:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9174:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9187:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9191:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9210:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9223:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9227:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9246:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9259:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9263:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"927:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9282:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9295:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9299:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9318:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9331:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9335:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9354:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9367:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9371:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9390:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9403:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9426:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9439:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9443:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9462:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9475:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9479:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9498:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9511:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9515:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9534:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9547:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9551:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9570:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9583:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9587:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9606:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9619:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9642:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9655:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9659:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9678:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9691:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9695:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9714:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9727:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9731:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9750:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9763:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9767:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9786:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9799:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9803:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9822:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9835:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9839:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9858:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9871:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9894:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9907:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9911:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9930:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9943:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9947:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9966:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9979:2:85","valueSize":1},{"declaration":17797,"isOffset":false,"isSlot":false,"src":"9983:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"11675:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"1559:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"1739:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"2315:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"2711:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"4475:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"8003:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"843:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"847:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"8867:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"887:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"9623:2:85","valueSize":1},{"declaration":17794,"isOffset":false,"isSlot":false,"src":"9875:2:85","valueSize":1}],"id":17799,"nodeType":"InlineAssembly","src":"691:11252:85"}]},"id":17801,"implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"566:3:85","nodeType":"FunctionDefinition","parameters":{"id":17795,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17794,"mutability":"mutable","name":"t2","nameLocation":"578:2:85","nodeType":"VariableDeclaration","scope":17801,"src":"570:10:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17793,"name":"uint256","nodeType":"ElementaryTypeName","src":"570:7:85","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"569:12:85"},"returnParameters":{"id":17798,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17797,"mutability":"mutable","name":"t0","nameLocation":"613:2:85","nodeType":"VariableDeclaration","scope":17801,"src":"605:10:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17796,"name":"uint256","nodeType":"ElementaryTypeName","src":"605:7:85","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"604:12:85"},"scope":17802,"src":"557:11392:85","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":17814,"src":"529:11422:85","usedErrors":[]},{"abstract":false,"baseContracts":[],"canonicalName":"ModexpSqrt","contractDependencies":[],"contractKind":"library","documentation":{"id":17803,"nodeType":"StructuredDocumentation","src":"11953:321:85","text":"@title Compute Squre Root by Modular Exponentiation\n@notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\nWhere N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\nand (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52"},"fullyImplemented":true,"id":17813,"linearizedBaseContracts":[17813],"name":"ModexpSqrt","nameLocation":"12283:10:85","nodeType":"ContractDefinition","nodes":[{"body":{"id":17811,"nodeType":"Block","src":"12360:11225:85","statements":[{"AST":{"nodeType":"YulBlock","src":"12443:11136:85","statements":[{"nodeType":"YulVariableDeclaration","src":"12457:103:85","value":{"kind":"number","nodeType":"YulLiteral","src":"12494:66:85","type":"","value":"0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"},"variables":[{"name":"n","nodeType":"YulTypedName","src":"12477:1:85","type":""}]},{"nodeType":"YulAssignment","src":"12574:23:85","value":{"arguments":[{"name":"t6","nodeType":"YulIdentifier","src":"12587:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"12591:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12595:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12580:6:85"},"nodeType":"YulFunctionCall","src":"12580:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"12574:2:85"}]},{"nodeType":"YulVariableDeclaration","src":"12610:27:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"12627:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"12631:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12635:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12620:6:85"},"nodeType":"YulFunctionCall","src":"12620:17:85"},"variables":[{"name":"t4","nodeType":"YulTypedName","src":"12614:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12650:27:85","value":{"arguments":[{"name":"t4","nodeType":"YulIdentifier","src":"12667:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"12671:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12675:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12660:6:85"},"nodeType":"YulFunctionCall","src":"12660:17:85"},"variables":[{"name":"t2","nodeType":"YulTypedName","src":"12654:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12690:27:85","value":{"arguments":[{"name":"t4","nodeType":"YulIdentifier","src":"12707:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"12711:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12715:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12700:6:85"},"nodeType":"YulFunctionCall","src":"12700:17:85"},"variables":[{"name":"t3","nodeType":"YulTypedName","src":"12694:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12730:27:85","value":{"arguments":[{"name":"t2","nodeType":"YulIdentifier","src":"12747:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"12751:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12755:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12740:6:85"},"nodeType":"YulFunctionCall","src":"12740:17:85"},"variables":[{"name":"t8","nodeType":"YulTypedName","src":"12734:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12770:27:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"12787:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"12791:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12795:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12780:6:85"},"nodeType":"YulFunctionCall","src":"12780:17:85"},"variables":[{"name":"t1","nodeType":"YulTypedName","src":"12774:2:85","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12810:27:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"12827:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"12831:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12835:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12820:6:85"},"nodeType":"YulFunctionCall","src":"12820:17:85"},"variables":[{"name":"t5","nodeType":"YulTypedName","src":"12814:2:85","type":""}]},{"nodeType":"YulAssignment","src":"12850:23:85","value":{"arguments":[{"name":"t3","nodeType":"YulIdentifier","src":"12863:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"12867:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12871:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12856:6:85"},"nodeType":"YulFunctionCall","src":"12856:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"12850:2:85"}]},{"nodeType":"YulVariableDeclaration","src":"12886:27:85","value":{"arguments":[{"name":"t8","nodeType":"YulIdentifier","src":"12903:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"12907:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12911:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12896:6:85"},"nodeType":"YulFunctionCall","src":"12896:17:85"},"variables":[{"name":"t7","nodeType":"YulTypedName","src":"12890:2:85","type":""}]},{"nodeType":"YulAssignment","src":"12926:23:85","value":{"arguments":[{"name":"t1","nodeType":"YulIdentifier","src":"12939:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"12943:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12947:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12932:6:85"},"nodeType":"YulFunctionCall","src":"12932:17:85"},"variableNames":[{"name":"t3","nodeType":"YulIdentifier","src":"12926:2:85"}]},{"nodeType":"YulAssignment","src":"12962:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"12975:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"12979:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"12983:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"12968:6:85"},"nodeType":"YulFunctionCall","src":"12968:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"12962:2:85"}]},{"nodeType":"YulAssignment","src":"12998:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13011:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13015:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13019:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13004:6:85"},"nodeType":"YulFunctionCall","src":"13004:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"12998:2:85"}]},{"nodeType":"YulAssignment","src":"13034:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13047:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13051:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13055:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13040:6:85"},"nodeType":"YulFunctionCall","src":"13040:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13034:2:85"}]},{"nodeType":"YulAssignment","src":"13070:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13083:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13087:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13091:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13076:6:85"},"nodeType":"YulFunctionCall","src":"13076:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13070:2:85"}]},{"nodeType":"YulAssignment","src":"13106:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13119:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13123:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13127:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13112:6:85"},"nodeType":"YulFunctionCall","src":"13112:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13106:2:85"}]},{"nodeType":"YulAssignment","src":"13142:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13155:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"13159:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13163:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13148:6:85"},"nodeType":"YulFunctionCall","src":"13148:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13142:2:85"}]},{"nodeType":"YulAssignment","src":"13178:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13191:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13195:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13199:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13184:6:85"},"nodeType":"YulFunctionCall","src":"13184:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13178:2:85"}]},{"nodeType":"YulAssignment","src":"13214:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13227:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13231:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13235:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13220:6:85"},"nodeType":"YulFunctionCall","src":"13220:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13214:2:85"}]},{"nodeType":"YulAssignment","src":"13250:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13263:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13267:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13271:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13256:6:85"},"nodeType":"YulFunctionCall","src":"13256:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13250:2:85"}]},{"nodeType":"YulAssignment","src":"13286:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13299:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"13303:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13307:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13292:6:85"},"nodeType":"YulFunctionCall","src":"13292:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13286:2:85"}]},{"nodeType":"YulAssignment","src":"13322:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13335:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13339:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13343:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13328:6:85"},"nodeType":"YulFunctionCall","src":"13328:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13322:2:85"}]},{"nodeType":"YulAssignment","src":"13358:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13371:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13375:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13379:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13364:6:85"},"nodeType":"YulFunctionCall","src":"13364:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13358:2:85"}]},{"nodeType":"YulAssignment","src":"13394:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13407:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13411:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13415:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13400:6:85"},"nodeType":"YulFunctionCall","src":"13400:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13394:2:85"}]},{"nodeType":"YulAssignment","src":"13430:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13443:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13447:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13451:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13436:6:85"},"nodeType":"YulFunctionCall","src":"13436:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13430:2:85"}]},{"nodeType":"YulAssignment","src":"13466:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13479:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"13483:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13487:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13472:6:85"},"nodeType":"YulFunctionCall","src":"13472:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13466:2:85"}]},{"nodeType":"YulAssignment","src":"13502:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13515:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13519:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13523:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13508:6:85"},"nodeType":"YulFunctionCall","src":"13508:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13502:2:85"}]},{"nodeType":"YulAssignment","src":"13538:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13551:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13555:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13559:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13544:6:85"},"nodeType":"YulFunctionCall","src":"13544:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13538:2:85"}]},{"nodeType":"YulAssignment","src":"13574:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13587:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13591:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13595:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13580:6:85"},"nodeType":"YulFunctionCall","src":"13580:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13574:2:85"}]},{"nodeType":"YulAssignment","src":"13610:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13623:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13627:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13631:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13616:6:85"},"nodeType":"YulFunctionCall","src":"13616:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13610:2:85"}]},{"nodeType":"YulAssignment","src":"13646:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13659:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13663:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13667:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13652:6:85"},"nodeType":"YulFunctionCall","src":"13652:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13646:2:85"}]},{"nodeType":"YulAssignment","src":"13682:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13695:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"13699:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13703:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13688:6:85"},"nodeType":"YulFunctionCall","src":"13688:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13682:2:85"}]},{"nodeType":"YulAssignment","src":"13718:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13731:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13735:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13739:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13724:6:85"},"nodeType":"YulFunctionCall","src":"13724:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13718:2:85"}]},{"nodeType":"YulAssignment","src":"13754:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13767:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13771:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13775:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13760:6:85"},"nodeType":"YulFunctionCall","src":"13760:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13754:2:85"}]},{"nodeType":"YulAssignment","src":"13790:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13803:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13807:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13811:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13796:6:85"},"nodeType":"YulFunctionCall","src":"13796:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13790:2:85"}]},{"nodeType":"YulAssignment","src":"13826:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13839:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13843:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13847:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13832:6:85"},"nodeType":"YulFunctionCall","src":"13832:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13826:2:85"}]},{"nodeType":"YulAssignment","src":"13862:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13875:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13879:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13883:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13868:6:85"},"nodeType":"YulFunctionCall","src":"13868:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13862:2:85"}]},{"nodeType":"YulAssignment","src":"13898:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13911:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"13915:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13919:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13904:6:85"},"nodeType":"YulFunctionCall","src":"13904:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13898:2:85"}]},{"nodeType":"YulAssignment","src":"13934:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13947:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13951:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13955:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13940:6:85"},"nodeType":"YulFunctionCall","src":"13940:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13934:2:85"}]},{"nodeType":"YulAssignment","src":"13970:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"13983:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"13987:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"13991:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"13976:6:85"},"nodeType":"YulFunctionCall","src":"13976:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"13970:2:85"}]},{"nodeType":"YulAssignment","src":"14006:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14019:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14023:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14027:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14012:6:85"},"nodeType":"YulFunctionCall","src":"14012:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14006:2:85"}]},{"nodeType":"YulAssignment","src":"14042:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14055:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"14059:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14063:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14048:6:85"},"nodeType":"YulFunctionCall","src":"14048:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14042:2:85"}]},{"nodeType":"YulAssignment","src":"14078:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14091:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14095:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14099:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14084:6:85"},"nodeType":"YulFunctionCall","src":"14084:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14078:2:85"}]},{"nodeType":"YulAssignment","src":"14114:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14127:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14131:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14135:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14120:6:85"},"nodeType":"YulFunctionCall","src":"14120:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14114:2:85"}]},{"nodeType":"YulAssignment","src":"14150:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14163:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14167:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14171:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14156:6:85"},"nodeType":"YulFunctionCall","src":"14156:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14150:2:85"}]},{"nodeType":"YulAssignment","src":"14186:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14199:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14203:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14207:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14192:6:85"},"nodeType":"YulFunctionCall","src":"14192:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14186:2:85"}]},{"nodeType":"YulAssignment","src":"14222:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14235:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"14239:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14243:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14228:6:85"},"nodeType":"YulFunctionCall","src":"14228:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14222:2:85"}]},{"nodeType":"YulAssignment","src":"14258:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14271:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14275:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14279:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14264:6:85"},"nodeType":"YulFunctionCall","src":"14264:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14258:2:85"}]},{"nodeType":"YulAssignment","src":"14294:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14307:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14311:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14315:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14300:6:85"},"nodeType":"YulFunctionCall","src":"14300:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14294:2:85"}]},{"nodeType":"YulAssignment","src":"14330:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14343:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14347:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14351:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14336:6:85"},"nodeType":"YulFunctionCall","src":"14336:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14330:2:85"}]},{"nodeType":"YulAssignment","src":"14366:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14379:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14383:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14387:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14372:6:85"},"nodeType":"YulFunctionCall","src":"14372:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14366:2:85"}]},{"nodeType":"YulAssignment","src":"14402:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14415:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14419:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14423:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14408:6:85"},"nodeType":"YulFunctionCall","src":"14408:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14402:2:85"}]},{"nodeType":"YulAssignment","src":"14438:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14451:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"14455:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14459:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14444:6:85"},"nodeType":"YulFunctionCall","src":"14444:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14438:2:85"}]},{"nodeType":"YulAssignment","src":"14474:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14487:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14491:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14495:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14480:6:85"},"nodeType":"YulFunctionCall","src":"14480:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14474:2:85"}]},{"nodeType":"YulAssignment","src":"14510:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14523:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14527:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14531:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14516:6:85"},"nodeType":"YulFunctionCall","src":"14516:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14510:2:85"}]},{"nodeType":"YulAssignment","src":"14546:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14559:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14563:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14567:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14552:6:85"},"nodeType":"YulFunctionCall","src":"14552:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14546:2:85"}]},{"nodeType":"YulAssignment","src":"14582:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14595:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14599:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14603:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14588:6:85"},"nodeType":"YulFunctionCall","src":"14588:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14582:2:85"}]},{"nodeType":"YulAssignment","src":"14618:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14631:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"14635:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14639:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14624:6:85"},"nodeType":"YulFunctionCall","src":"14624:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14618:2:85"}]},{"nodeType":"YulAssignment","src":"14654:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14667:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14671:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14675:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14660:6:85"},"nodeType":"YulFunctionCall","src":"14660:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14654:2:85"}]},{"nodeType":"YulAssignment","src":"14690:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14703:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14707:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14711:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14696:6:85"},"nodeType":"YulFunctionCall","src":"14696:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14690:2:85"}]},{"nodeType":"YulAssignment","src":"14726:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14739:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14743:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14747:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14732:6:85"},"nodeType":"YulFunctionCall","src":"14732:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14726:2:85"}]},{"nodeType":"YulAssignment","src":"14762:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14775:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14779:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14783:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14768:6:85"},"nodeType":"YulFunctionCall","src":"14768:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14762:2:85"}]},{"nodeType":"YulAssignment","src":"14798:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14811:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14815:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14819:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14804:6:85"},"nodeType":"YulFunctionCall","src":"14804:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14798:2:85"}]},{"nodeType":"YulAssignment","src":"14834:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14847:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14851:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14855:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14840:6:85"},"nodeType":"YulFunctionCall","src":"14840:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14834:2:85"}]},{"nodeType":"YulAssignment","src":"14870:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14883:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14887:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14891:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14876:6:85"},"nodeType":"YulFunctionCall","src":"14876:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14870:2:85"}]},{"nodeType":"YulAssignment","src":"14906:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14919:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"14923:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14927:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14912:6:85"},"nodeType":"YulFunctionCall","src":"14912:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14906:2:85"}]},{"nodeType":"YulAssignment","src":"14942:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14955:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14959:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14963:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14948:6:85"},"nodeType":"YulFunctionCall","src":"14948:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14942:2:85"}]},{"nodeType":"YulAssignment","src":"14978:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"14991:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"14995:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"14999:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"14984:6:85"},"nodeType":"YulFunctionCall","src":"14984:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"14978:2:85"}]},{"nodeType":"YulAssignment","src":"15014:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15027:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15031:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15035:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15020:6:85"},"nodeType":"YulFunctionCall","src":"15020:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15014:2:85"}]},{"nodeType":"YulAssignment","src":"15050:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15063:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15067:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15071:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15056:6:85"},"nodeType":"YulFunctionCall","src":"15056:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15050:2:85"}]},{"nodeType":"YulAssignment","src":"15086:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15099:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15103:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15107:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15092:6:85"},"nodeType":"YulFunctionCall","src":"15092:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15086:2:85"}]},{"nodeType":"YulAssignment","src":"15122:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15135:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15139:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15143:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15128:6:85"},"nodeType":"YulFunctionCall","src":"15128:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15122:2:85"}]},{"nodeType":"YulAssignment","src":"15158:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15171:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15175:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15179:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15164:6:85"},"nodeType":"YulFunctionCall","src":"15164:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15158:2:85"}]},{"nodeType":"YulAssignment","src":"15194:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15207:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15211:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15215:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15200:6:85"},"nodeType":"YulFunctionCall","src":"15200:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15194:2:85"}]},{"nodeType":"YulAssignment","src":"15230:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15243:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15247:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15251:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15236:6:85"},"nodeType":"YulFunctionCall","src":"15236:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15230:2:85"}]},{"nodeType":"YulAssignment","src":"15266:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15279:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15283:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15287:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15272:6:85"},"nodeType":"YulFunctionCall","src":"15272:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15266:2:85"}]},{"nodeType":"YulAssignment","src":"15302:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15315:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"15319:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15323:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15308:6:85"},"nodeType":"YulFunctionCall","src":"15308:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15302:2:85"}]},{"nodeType":"YulAssignment","src":"15338:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15351:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15355:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15359:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15344:6:85"},"nodeType":"YulFunctionCall","src":"15344:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15338:2:85"}]},{"nodeType":"YulAssignment","src":"15374:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15387:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15391:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15395:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15380:6:85"},"nodeType":"YulFunctionCall","src":"15380:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15374:2:85"}]},{"nodeType":"YulAssignment","src":"15410:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15423:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15427:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15431:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15416:6:85"},"nodeType":"YulFunctionCall","src":"15416:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15410:2:85"}]},{"nodeType":"YulAssignment","src":"15446:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15459:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15463:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15467:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15452:6:85"},"nodeType":"YulFunctionCall","src":"15452:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15446:2:85"}]},{"nodeType":"YulAssignment","src":"15482:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15495:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"15499:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15503:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15488:6:85"},"nodeType":"YulFunctionCall","src":"15488:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15482:2:85"}]},{"nodeType":"YulAssignment","src":"15518:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15531:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15535:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15539:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15524:6:85"},"nodeType":"YulFunctionCall","src":"15524:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15518:2:85"}]},{"nodeType":"YulAssignment","src":"15554:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15567:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15571:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15575:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15560:6:85"},"nodeType":"YulFunctionCall","src":"15560:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15554:2:85"}]},{"nodeType":"YulAssignment","src":"15590:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15603:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15607:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15611:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15596:6:85"},"nodeType":"YulFunctionCall","src":"15596:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15590:2:85"}]},{"nodeType":"YulAssignment","src":"15626:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15639:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15643:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15647:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15632:6:85"},"nodeType":"YulFunctionCall","src":"15632:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15626:2:85"}]},{"nodeType":"YulAssignment","src":"15662:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15675:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"15679:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15683:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15668:6:85"},"nodeType":"YulFunctionCall","src":"15668:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15662:2:85"}]},{"nodeType":"YulAssignment","src":"15698:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15711:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15715:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15719:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15704:6:85"},"nodeType":"YulFunctionCall","src":"15704:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15698:2:85"}]},{"nodeType":"YulAssignment","src":"15734:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15747:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15751:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15755:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15740:6:85"},"nodeType":"YulFunctionCall","src":"15740:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15734:2:85"}]},{"nodeType":"YulAssignment","src":"15770:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15783:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15787:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15791:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15776:6:85"},"nodeType":"YulFunctionCall","src":"15776:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15770:2:85"}]},{"nodeType":"YulAssignment","src":"15806:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15819:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15823:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15827:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15812:6:85"},"nodeType":"YulFunctionCall","src":"15812:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15806:2:85"}]},{"nodeType":"YulAssignment","src":"15842:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15855:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15859:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15863:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15848:6:85"},"nodeType":"YulFunctionCall","src":"15848:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15842:2:85"}]},{"nodeType":"YulAssignment","src":"15878:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15891:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15895:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15899:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15884:6:85"},"nodeType":"YulFunctionCall","src":"15884:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15878:2:85"}]},{"nodeType":"YulAssignment","src":"15914:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15927:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"15931:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15935:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15920:6:85"},"nodeType":"YulFunctionCall","src":"15920:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15914:2:85"}]},{"nodeType":"YulAssignment","src":"15950:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15963:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"15967:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"15971:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15956:6:85"},"nodeType":"YulFunctionCall","src":"15956:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15950:2:85"}]},{"nodeType":"YulAssignment","src":"15986:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"15999:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16003:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16007:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"15992:6:85"},"nodeType":"YulFunctionCall","src":"15992:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"15986:2:85"}]},{"nodeType":"YulAssignment","src":"16022:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16035:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16039:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16043:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16028:6:85"},"nodeType":"YulFunctionCall","src":"16028:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16022:2:85"}]},{"nodeType":"YulAssignment","src":"16058:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16071:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16075:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16079:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16064:6:85"},"nodeType":"YulFunctionCall","src":"16064:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16058:2:85"}]},{"nodeType":"YulAssignment","src":"16094:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16107:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16111:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16115:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16100:6:85"},"nodeType":"YulFunctionCall","src":"16100:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16094:2:85"}]},{"nodeType":"YulAssignment","src":"16130:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16143:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16147:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16151:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16136:6:85"},"nodeType":"YulFunctionCall","src":"16136:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16130:2:85"}]},{"nodeType":"YulAssignment","src":"16166:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16179:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16183:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16187:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16172:6:85"},"nodeType":"YulFunctionCall","src":"16172:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16166:2:85"}]},{"nodeType":"YulAssignment","src":"16202:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16215:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"16219:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16223:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16208:6:85"},"nodeType":"YulFunctionCall","src":"16208:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16202:2:85"}]},{"nodeType":"YulAssignment","src":"16238:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16251:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16255:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16259:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16244:6:85"},"nodeType":"YulFunctionCall","src":"16244:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16238:2:85"}]},{"nodeType":"YulAssignment","src":"16274:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16287:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16291:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16295:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16280:6:85"},"nodeType":"YulFunctionCall","src":"16280:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16274:2:85"}]},{"nodeType":"YulAssignment","src":"16310:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16323:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16327:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16331:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16316:6:85"},"nodeType":"YulFunctionCall","src":"16316:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16310:2:85"}]},{"nodeType":"YulAssignment","src":"16346:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16359:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16363:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16367:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16352:6:85"},"nodeType":"YulFunctionCall","src":"16352:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16346:2:85"}]},{"nodeType":"YulAssignment","src":"16382:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16395:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16399:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16403:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16388:6:85"},"nodeType":"YulFunctionCall","src":"16388:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16382:2:85"}]},{"nodeType":"YulAssignment","src":"16418:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16431:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16435:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16439:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16424:6:85"},"nodeType":"YulFunctionCall","src":"16424:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16418:2:85"}]},{"nodeType":"YulAssignment","src":"16454:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16467:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16471:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16475:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16460:6:85"},"nodeType":"YulFunctionCall","src":"16460:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16454:2:85"}]},{"nodeType":"YulAssignment","src":"16490:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16503:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"16507:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16511:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16496:6:85"},"nodeType":"YulFunctionCall","src":"16496:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16490:2:85"}]},{"nodeType":"YulAssignment","src":"16526:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16539:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16543:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16547:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16532:6:85"},"nodeType":"YulFunctionCall","src":"16532:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16526:2:85"}]},{"nodeType":"YulAssignment","src":"16562:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16575:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16579:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16583:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16568:6:85"},"nodeType":"YulFunctionCall","src":"16568:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16562:2:85"}]},{"nodeType":"YulAssignment","src":"16598:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16611:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16615:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16619:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16604:6:85"},"nodeType":"YulFunctionCall","src":"16604:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16598:2:85"}]},{"nodeType":"YulAssignment","src":"16634:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16647:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16651:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16655:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16640:6:85"},"nodeType":"YulFunctionCall","src":"16640:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16634:2:85"}]},{"nodeType":"YulAssignment","src":"16670:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16683:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16687:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16691:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16676:6:85"},"nodeType":"YulFunctionCall","src":"16676:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16670:2:85"}]},{"nodeType":"YulAssignment","src":"16706:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16719:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"16723:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16727:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16712:6:85"},"nodeType":"YulFunctionCall","src":"16712:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16706:2:85"}]},{"nodeType":"YulAssignment","src":"16742:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16755:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16759:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16763:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16748:6:85"},"nodeType":"YulFunctionCall","src":"16748:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16742:2:85"}]},{"nodeType":"YulAssignment","src":"16778:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16791:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16795:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16799:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16784:6:85"},"nodeType":"YulFunctionCall","src":"16784:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16778:2:85"}]},{"nodeType":"YulAssignment","src":"16814:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16827:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16831:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16835:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16820:6:85"},"nodeType":"YulFunctionCall","src":"16820:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16814:2:85"}]},{"nodeType":"YulAssignment","src":"16850:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16863:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"16867:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16871:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16856:6:85"},"nodeType":"YulFunctionCall","src":"16856:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16850:2:85"}]},{"nodeType":"YulAssignment","src":"16886:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16899:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16903:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16907:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16892:6:85"},"nodeType":"YulFunctionCall","src":"16892:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16886:2:85"}]},{"nodeType":"YulAssignment","src":"16922:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16935:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16939:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16943:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16928:6:85"},"nodeType":"YulFunctionCall","src":"16928:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16922:2:85"}]},{"nodeType":"YulAssignment","src":"16958:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"16971:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"16975:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"16979:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"16964:6:85"},"nodeType":"YulFunctionCall","src":"16964:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16958:2:85"}]},{"nodeType":"YulAssignment","src":"16994:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17007:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17011:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17015:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17000:6:85"},"nodeType":"YulFunctionCall","src":"17000:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"16994:2:85"}]},{"nodeType":"YulAssignment","src":"17030:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17043:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17047:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17051:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17036:6:85"},"nodeType":"YulFunctionCall","src":"17036:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17030:2:85"}]},{"nodeType":"YulAssignment","src":"17066:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17079:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17083:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17087:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17072:6:85"},"nodeType":"YulFunctionCall","src":"17072:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17066:2:85"}]},{"nodeType":"YulAssignment","src":"17102:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17115:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17119:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17123:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17108:6:85"},"nodeType":"YulFunctionCall","src":"17108:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17102:2:85"}]},{"nodeType":"YulAssignment","src":"17138:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17151:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17155:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17159:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17144:6:85"},"nodeType":"YulFunctionCall","src":"17144:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17138:2:85"}]},{"nodeType":"YulAssignment","src":"17174:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17187:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"17191:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17195:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17180:6:85"},"nodeType":"YulFunctionCall","src":"17180:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17174:2:85"}]},{"nodeType":"YulAssignment","src":"17210:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17223:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17227:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17231:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17216:6:85"},"nodeType":"YulFunctionCall","src":"17216:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17210:2:85"}]},{"nodeType":"YulAssignment","src":"17246:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17259:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17263:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17267:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17252:6:85"},"nodeType":"YulFunctionCall","src":"17252:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17246:2:85"}]},{"nodeType":"YulAssignment","src":"17282:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17295:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17299:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17303:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17288:6:85"},"nodeType":"YulFunctionCall","src":"17288:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17282:2:85"}]},{"nodeType":"YulAssignment","src":"17318:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17331:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17335:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17339:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17324:6:85"},"nodeType":"YulFunctionCall","src":"17324:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17318:2:85"}]},{"nodeType":"YulAssignment","src":"17354:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17367:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17371:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17375:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17360:6:85"},"nodeType":"YulFunctionCall","src":"17360:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17354:2:85"}]},{"nodeType":"YulAssignment","src":"17390:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17403:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17407:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17411:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17396:6:85"},"nodeType":"YulFunctionCall","src":"17396:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17390:2:85"}]},{"nodeType":"YulAssignment","src":"17426:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17439:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17443:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17447:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17432:6:85"},"nodeType":"YulFunctionCall","src":"17432:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17426:2:85"}]},{"nodeType":"YulAssignment","src":"17462:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17475:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17479:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17483:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17468:6:85"},"nodeType":"YulFunctionCall","src":"17468:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17462:2:85"}]},{"nodeType":"YulAssignment","src":"17498:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17511:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17515:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17519:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17504:6:85"},"nodeType":"YulFunctionCall","src":"17504:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17498:2:85"}]},{"nodeType":"YulAssignment","src":"17534:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17547:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"17551:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17555:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17540:6:85"},"nodeType":"YulFunctionCall","src":"17540:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17534:2:85"}]},{"nodeType":"YulAssignment","src":"17570:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17583:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17587:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17591:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17576:6:85"},"nodeType":"YulFunctionCall","src":"17576:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17570:2:85"}]},{"nodeType":"YulAssignment","src":"17606:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17619:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17623:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17627:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17612:6:85"},"nodeType":"YulFunctionCall","src":"17612:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17606:2:85"}]},{"nodeType":"YulAssignment","src":"17642:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17655:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17659:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17663:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17648:6:85"},"nodeType":"YulFunctionCall","src":"17648:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17642:2:85"}]},{"nodeType":"YulAssignment","src":"17678:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17691:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"17695:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17699:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17684:6:85"},"nodeType":"YulFunctionCall","src":"17684:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17678:2:85"}]},{"nodeType":"YulAssignment","src":"17714:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17727:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17731:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17735:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17720:6:85"},"nodeType":"YulFunctionCall","src":"17720:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17714:2:85"}]},{"nodeType":"YulAssignment","src":"17750:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17763:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17767:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17771:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17756:6:85"},"nodeType":"YulFunctionCall","src":"17756:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17750:2:85"}]},{"nodeType":"YulAssignment","src":"17786:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17799:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17803:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17807:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17792:6:85"},"nodeType":"YulFunctionCall","src":"17792:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17786:2:85"}]},{"nodeType":"YulAssignment","src":"17822:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17835:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17839:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17843:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17828:6:85"},"nodeType":"YulFunctionCall","src":"17828:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17822:2:85"}]},{"nodeType":"YulAssignment","src":"17858:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17871:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17875:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17879:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17864:6:85"},"nodeType":"YulFunctionCall","src":"17864:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17858:2:85"}]},{"nodeType":"YulAssignment","src":"17894:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17907:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17911:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17915:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17900:6:85"},"nodeType":"YulFunctionCall","src":"17900:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17894:2:85"}]},{"nodeType":"YulAssignment","src":"17930:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17943:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17947:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17951:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17936:6:85"},"nodeType":"YulFunctionCall","src":"17936:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17930:2:85"}]},{"nodeType":"YulAssignment","src":"17966:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"17979:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"17983:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"17987:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"17972:6:85"},"nodeType":"YulFunctionCall","src":"17972:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"17966:2:85"}]},{"nodeType":"YulAssignment","src":"18002:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18015:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"18019:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18023:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18008:6:85"},"nodeType":"YulFunctionCall","src":"18008:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18002:2:85"}]},{"nodeType":"YulAssignment","src":"18038:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18051:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18055:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18059:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18044:6:85"},"nodeType":"YulFunctionCall","src":"18044:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18038:2:85"}]},{"nodeType":"YulAssignment","src":"18074:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18087:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18091:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18095:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18080:6:85"},"nodeType":"YulFunctionCall","src":"18080:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18074:2:85"}]},{"nodeType":"YulAssignment","src":"18110:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18123:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18127:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18131:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18116:6:85"},"nodeType":"YulFunctionCall","src":"18116:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18110:2:85"}]},{"nodeType":"YulAssignment","src":"18146:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18159:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18163:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18167:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18152:6:85"},"nodeType":"YulFunctionCall","src":"18152:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18146:2:85"}]},{"nodeType":"YulAssignment","src":"18182:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18195:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"18199:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18203:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18188:6:85"},"nodeType":"YulFunctionCall","src":"18188:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18182:2:85"}]},{"nodeType":"YulAssignment","src":"18218:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18231:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18235:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18239:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18224:6:85"},"nodeType":"YulFunctionCall","src":"18224:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18218:2:85"}]},{"nodeType":"YulAssignment","src":"18254:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18267:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18271:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18275:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18260:6:85"},"nodeType":"YulFunctionCall","src":"18260:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18254:2:85"}]},{"nodeType":"YulAssignment","src":"18290:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18303:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18307:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18311:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18296:6:85"},"nodeType":"YulFunctionCall","src":"18296:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18290:2:85"}]},{"nodeType":"YulAssignment","src":"18326:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18339:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18343:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18347:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18332:6:85"},"nodeType":"YulFunctionCall","src":"18332:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18326:2:85"}]},{"nodeType":"YulAssignment","src":"18362:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18375:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18379:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18383:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18368:6:85"},"nodeType":"YulFunctionCall","src":"18368:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18362:2:85"}]},{"nodeType":"YulAssignment","src":"18398:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18411:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"18415:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18419:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18404:6:85"},"nodeType":"YulFunctionCall","src":"18404:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18398:2:85"}]},{"nodeType":"YulAssignment","src":"18434:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18447:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18451:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18455:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18440:6:85"},"nodeType":"YulFunctionCall","src":"18440:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18434:2:85"}]},{"nodeType":"YulAssignment","src":"18470:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18483:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18487:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18491:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18476:6:85"},"nodeType":"YulFunctionCall","src":"18476:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18470:2:85"}]},{"nodeType":"YulAssignment","src":"18506:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18519:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18523:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18527:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18512:6:85"},"nodeType":"YulFunctionCall","src":"18512:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18506:2:85"}]},{"nodeType":"YulAssignment","src":"18542:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18555:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"18559:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18563:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18548:6:85"},"nodeType":"YulFunctionCall","src":"18548:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18542:2:85"}]},{"nodeType":"YulAssignment","src":"18578:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18591:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18595:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18599:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18584:6:85"},"nodeType":"YulFunctionCall","src":"18584:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18578:2:85"}]},{"nodeType":"YulAssignment","src":"18614:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18627:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18631:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18635:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18620:6:85"},"nodeType":"YulFunctionCall","src":"18620:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18614:2:85"}]},{"nodeType":"YulAssignment","src":"18650:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18663:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18667:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18671:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18656:6:85"},"nodeType":"YulFunctionCall","src":"18656:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18650:2:85"}]},{"nodeType":"YulAssignment","src":"18686:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18699:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18703:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18707:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18692:6:85"},"nodeType":"YulFunctionCall","src":"18692:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18686:2:85"}]},{"nodeType":"YulAssignment","src":"18722:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18735:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18739:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18743:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18728:6:85"},"nodeType":"YulFunctionCall","src":"18728:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18722:2:85"}]},{"nodeType":"YulAssignment","src":"18758:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18771:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18775:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18779:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18764:6:85"},"nodeType":"YulFunctionCall","src":"18764:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18758:2:85"}]},{"nodeType":"YulAssignment","src":"18794:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18807:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18811:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18815:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18800:6:85"},"nodeType":"YulFunctionCall","src":"18800:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18794:2:85"}]},{"nodeType":"YulAssignment","src":"18830:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18843:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18847:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18851:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18836:6:85"},"nodeType":"YulFunctionCall","src":"18836:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18830:2:85"}]},{"nodeType":"YulAssignment","src":"18866:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18879:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18883:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18887:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18872:6:85"},"nodeType":"YulFunctionCall","src":"18872:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18866:2:85"}]},{"nodeType":"YulAssignment","src":"18902:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18915:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18919:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18923:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18908:6:85"},"nodeType":"YulFunctionCall","src":"18908:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18902:2:85"}]},{"nodeType":"YulAssignment","src":"18938:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18951:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"18955:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18959:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18944:6:85"},"nodeType":"YulFunctionCall","src":"18944:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18938:2:85"}]},{"nodeType":"YulAssignment","src":"18974:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"18987:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"18991:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"18995:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"18980:6:85"},"nodeType":"YulFunctionCall","src":"18980:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"18974:2:85"}]},{"nodeType":"YulAssignment","src":"19010:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19023:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19027:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19031:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19016:6:85"},"nodeType":"YulFunctionCall","src":"19016:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19010:2:85"}]},{"nodeType":"YulAssignment","src":"19046:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19059:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19063:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19067:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19052:6:85"},"nodeType":"YulFunctionCall","src":"19052:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19046:2:85"}]},{"nodeType":"YulAssignment","src":"19082:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19095:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19099:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19103:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19088:6:85"},"nodeType":"YulFunctionCall","src":"19088:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19082:2:85"}]},{"nodeType":"YulAssignment","src":"19118:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19131:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"19135:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19139:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19124:6:85"},"nodeType":"YulFunctionCall","src":"19124:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19118:2:85"}]},{"nodeType":"YulAssignment","src":"19154:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19167:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19171:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19175:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19160:6:85"},"nodeType":"YulFunctionCall","src":"19160:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19154:2:85"}]},{"nodeType":"YulAssignment","src":"19190:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19203:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19207:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19211:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19196:6:85"},"nodeType":"YulFunctionCall","src":"19196:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19190:2:85"}]},{"nodeType":"YulAssignment","src":"19226:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19239:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19243:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19247:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19232:6:85"},"nodeType":"YulFunctionCall","src":"19232:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19226:2:85"}]},{"nodeType":"YulAssignment","src":"19262:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19275:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19279:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19283:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19268:6:85"},"nodeType":"YulFunctionCall","src":"19268:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19262:2:85"}]},{"nodeType":"YulAssignment","src":"19298:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19311:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19315:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19319:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19304:6:85"},"nodeType":"YulFunctionCall","src":"19304:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19298:2:85"}]},{"nodeType":"YulAssignment","src":"19334:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19347:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"19351:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19355:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19340:6:85"},"nodeType":"YulFunctionCall","src":"19340:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19334:2:85"}]},{"nodeType":"YulAssignment","src":"19370:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19383:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19387:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19391:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19376:6:85"},"nodeType":"YulFunctionCall","src":"19376:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19370:2:85"}]},{"nodeType":"YulAssignment","src":"19406:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19419:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19423:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19427:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19412:6:85"},"nodeType":"YulFunctionCall","src":"19412:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19406:2:85"}]},{"nodeType":"YulAssignment","src":"19442:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19455:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19459:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19463:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19448:6:85"},"nodeType":"YulFunctionCall","src":"19448:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19442:2:85"}]},{"nodeType":"YulAssignment","src":"19478:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19491:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19495:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19499:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19484:6:85"},"nodeType":"YulFunctionCall","src":"19484:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19478:2:85"}]},{"nodeType":"YulAssignment","src":"19514:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19527:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19531:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19535:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19520:6:85"},"nodeType":"YulFunctionCall","src":"19520:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19514:2:85"}]},{"nodeType":"YulAssignment","src":"19550:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19563:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19567:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19571:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19556:6:85"},"nodeType":"YulFunctionCall","src":"19556:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19550:2:85"}]},{"nodeType":"YulAssignment","src":"19586:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19599:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19603:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19607:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19592:6:85"},"nodeType":"YulFunctionCall","src":"19592:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19586:2:85"}]},{"nodeType":"YulAssignment","src":"19622:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19635:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"19639:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19643:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19628:6:85"},"nodeType":"YulFunctionCall","src":"19628:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19622:2:85"}]},{"nodeType":"YulAssignment","src":"19658:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19671:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19675:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19679:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19664:6:85"},"nodeType":"YulFunctionCall","src":"19664:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19658:2:85"}]},{"nodeType":"YulAssignment","src":"19694:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19707:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19711:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19715:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19700:6:85"},"nodeType":"YulFunctionCall","src":"19700:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19694:2:85"}]},{"nodeType":"YulAssignment","src":"19730:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19743:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"19747:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19751:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19736:6:85"},"nodeType":"YulFunctionCall","src":"19736:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19730:2:85"}]},{"nodeType":"YulAssignment","src":"19766:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19779:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19783:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19787:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19772:6:85"},"nodeType":"YulFunctionCall","src":"19772:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19766:2:85"}]},{"nodeType":"YulAssignment","src":"19802:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19815:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19819:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19823:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19808:6:85"},"nodeType":"YulFunctionCall","src":"19808:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19802:2:85"}]},{"nodeType":"YulAssignment","src":"19838:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19851:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19855:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19859:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19844:6:85"},"nodeType":"YulFunctionCall","src":"19844:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19838:2:85"}]},{"nodeType":"YulAssignment","src":"19874:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19887:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19891:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19895:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19880:6:85"},"nodeType":"YulFunctionCall","src":"19880:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19874:2:85"}]},{"nodeType":"YulAssignment","src":"19910:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19923:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19927:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19931:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19916:6:85"},"nodeType":"YulFunctionCall","src":"19916:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19910:2:85"}]},{"nodeType":"YulAssignment","src":"19946:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19959:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19963:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"19967:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19952:6:85"},"nodeType":"YulFunctionCall","src":"19952:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19946:2:85"}]},{"nodeType":"YulAssignment","src":"19982:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"19995:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"19999:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20003:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"19988:6:85"},"nodeType":"YulFunctionCall","src":"19988:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"19982:2:85"}]},{"nodeType":"YulAssignment","src":"20018:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20031:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"20035:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20039:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20024:6:85"},"nodeType":"YulFunctionCall","src":"20024:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20018:2:85"}]},{"nodeType":"YulAssignment","src":"20054:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20067:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20071:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20075:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20060:6:85"},"nodeType":"YulFunctionCall","src":"20060:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20054:2:85"}]},{"nodeType":"YulAssignment","src":"20090:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20103:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20107:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20111:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20096:6:85"},"nodeType":"YulFunctionCall","src":"20096:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20090:2:85"}]},{"nodeType":"YulAssignment","src":"20126:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20139:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20143:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20147:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20132:6:85"},"nodeType":"YulFunctionCall","src":"20132:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20126:2:85"}]},{"nodeType":"YulAssignment","src":"20162:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20175:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20179:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20183:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20168:6:85"},"nodeType":"YulFunctionCall","src":"20168:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20162:2:85"}]},{"nodeType":"YulAssignment","src":"20198:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20211:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20215:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20219:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20204:6:85"},"nodeType":"YulFunctionCall","src":"20204:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20198:2:85"}]},{"nodeType":"YulAssignment","src":"20234:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20247:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20251:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20255:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20240:6:85"},"nodeType":"YulFunctionCall","src":"20240:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20234:2:85"}]},{"nodeType":"YulAssignment","src":"20270:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20283:2:85"},{"name":"t8","nodeType":"YulIdentifier","src":"20287:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20291:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20276:6:85"},"nodeType":"YulFunctionCall","src":"20276:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20270:2:85"}]},{"nodeType":"YulAssignment","src":"20306:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20319:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20323:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20327:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20312:6:85"},"nodeType":"YulFunctionCall","src":"20312:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20306:2:85"}]},{"nodeType":"YulAssignment","src":"20342:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20355:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20359:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20363:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20348:6:85"},"nodeType":"YulFunctionCall","src":"20348:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20342:2:85"}]},{"nodeType":"YulAssignment","src":"20378:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20391:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20395:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20399:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20384:6:85"},"nodeType":"YulFunctionCall","src":"20384:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20378:2:85"}]},{"nodeType":"YulAssignment","src":"20414:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20427:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20431:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20435:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20420:6:85"},"nodeType":"YulFunctionCall","src":"20420:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20414:2:85"}]},{"nodeType":"YulAssignment","src":"20450:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20463:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20467:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20471:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20456:6:85"},"nodeType":"YulFunctionCall","src":"20456:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20450:2:85"}]},{"nodeType":"YulAssignment","src":"20486:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20499:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"20503:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20507:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20492:6:85"},"nodeType":"YulFunctionCall","src":"20492:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20486:2:85"}]},{"nodeType":"YulAssignment","src":"20522:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20535:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20539:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20543:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20528:6:85"},"nodeType":"YulFunctionCall","src":"20528:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20522:2:85"}]},{"nodeType":"YulAssignment","src":"20558:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20571:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20575:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20579:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20564:6:85"},"nodeType":"YulFunctionCall","src":"20564:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20558:2:85"}]},{"nodeType":"YulAssignment","src":"20594:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20607:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"20611:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20615:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20600:6:85"},"nodeType":"YulFunctionCall","src":"20600:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20594:2:85"}]},{"nodeType":"YulAssignment","src":"20630:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20643:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20647:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20651:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20636:6:85"},"nodeType":"YulFunctionCall","src":"20636:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20630:2:85"}]},{"nodeType":"YulAssignment","src":"20666:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20679:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20683:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20687:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20672:6:85"},"nodeType":"YulFunctionCall","src":"20672:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20666:2:85"}]},{"nodeType":"YulAssignment","src":"20702:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20715:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20719:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20723:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20708:6:85"},"nodeType":"YulFunctionCall","src":"20708:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20702:2:85"}]},{"nodeType":"YulAssignment","src":"20738:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20751:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20755:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20759:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20744:6:85"},"nodeType":"YulFunctionCall","src":"20744:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20738:2:85"}]},{"nodeType":"YulAssignment","src":"20774:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20787:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20791:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20795:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20780:6:85"},"nodeType":"YulFunctionCall","src":"20780:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20774:2:85"}]},{"nodeType":"YulAssignment","src":"20810:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20823:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20827:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20831:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20816:6:85"},"nodeType":"YulFunctionCall","src":"20816:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20810:2:85"}]},{"nodeType":"YulAssignment","src":"20846:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20859:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20863:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20867:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20852:6:85"},"nodeType":"YulFunctionCall","src":"20852:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20846:2:85"}]},{"nodeType":"YulAssignment","src":"20882:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20895:2:85"},{"name":"t7","nodeType":"YulIdentifier","src":"20899:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20903:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20888:6:85"},"nodeType":"YulFunctionCall","src":"20888:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20882:2:85"}]},{"nodeType":"YulAssignment","src":"20918:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20931:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20935:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20939:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20924:6:85"},"nodeType":"YulFunctionCall","src":"20924:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20918:2:85"}]},{"nodeType":"YulAssignment","src":"20954:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"20967:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"20971:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"20975:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20960:6:85"},"nodeType":"YulFunctionCall","src":"20960:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20954:2:85"}]},{"nodeType":"YulAssignment","src":"20990:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21003:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21007:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21011:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"20996:6:85"},"nodeType":"YulFunctionCall","src":"20996:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"20990:2:85"}]},{"nodeType":"YulAssignment","src":"21026:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21039:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21043:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21047:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21032:6:85"},"nodeType":"YulFunctionCall","src":"21032:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21026:2:85"}]},{"nodeType":"YulAssignment","src":"21062:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21075:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21079:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21083:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21068:6:85"},"nodeType":"YulFunctionCall","src":"21068:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21062:2:85"}]},{"nodeType":"YulAssignment","src":"21098:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21111:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21115:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21119:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21104:6:85"},"nodeType":"YulFunctionCall","src":"21104:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21098:2:85"}]},{"nodeType":"YulAssignment","src":"21134:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21147:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"21151:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21155:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21140:6:85"},"nodeType":"YulFunctionCall","src":"21140:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21134:2:85"}]},{"nodeType":"YulAssignment","src":"21170:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21183:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21187:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21191:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21176:6:85"},"nodeType":"YulFunctionCall","src":"21176:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21170:2:85"}]},{"nodeType":"YulAssignment","src":"21206:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21219:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21223:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21227:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21212:6:85"},"nodeType":"YulFunctionCall","src":"21212:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21206:2:85"}]},{"nodeType":"YulAssignment","src":"21242:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21255:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21259:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21263:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21248:6:85"},"nodeType":"YulFunctionCall","src":"21248:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21242:2:85"}]},{"nodeType":"YulAssignment","src":"21278:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21291:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21295:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21299:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21284:6:85"},"nodeType":"YulFunctionCall","src":"21284:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21278:2:85"}]},{"nodeType":"YulAssignment","src":"21314:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21327:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21331:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21335:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21320:6:85"},"nodeType":"YulFunctionCall","src":"21320:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21314:2:85"}]},{"nodeType":"YulAssignment","src":"21350:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21363:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"21367:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21371:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21356:6:85"},"nodeType":"YulFunctionCall","src":"21356:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21350:2:85"}]},{"nodeType":"YulAssignment","src":"21386:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21399:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21403:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21407:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21392:6:85"},"nodeType":"YulFunctionCall","src":"21392:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21386:2:85"}]},{"nodeType":"YulAssignment","src":"21422:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21435:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21439:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21443:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21428:6:85"},"nodeType":"YulFunctionCall","src":"21428:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21422:2:85"}]},{"nodeType":"YulAssignment","src":"21458:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21471:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21475:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21479:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21464:6:85"},"nodeType":"YulFunctionCall","src":"21464:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21458:2:85"}]},{"nodeType":"YulAssignment","src":"21494:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21507:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21511:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21515:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21500:6:85"},"nodeType":"YulFunctionCall","src":"21500:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21494:2:85"}]},{"nodeType":"YulAssignment","src":"21530:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21543:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21547:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21551:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21536:6:85"},"nodeType":"YulFunctionCall","src":"21536:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21530:2:85"}]},{"nodeType":"YulAssignment","src":"21566:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21579:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21583:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21587:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21572:6:85"},"nodeType":"YulFunctionCall","src":"21572:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21566:2:85"}]},{"nodeType":"YulAssignment","src":"21602:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21615:2:85"},{"name":"t6","nodeType":"YulIdentifier","src":"21619:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21623:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21608:6:85"},"nodeType":"YulFunctionCall","src":"21608:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21602:2:85"}]},{"nodeType":"YulAssignment","src":"21638:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21651:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21655:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21659:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21644:6:85"},"nodeType":"YulFunctionCall","src":"21644:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21638:2:85"}]},{"nodeType":"YulAssignment","src":"21674:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21687:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21691:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21695:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21680:6:85"},"nodeType":"YulFunctionCall","src":"21680:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21674:2:85"}]},{"nodeType":"YulAssignment","src":"21710:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21723:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21727:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21731:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21716:6:85"},"nodeType":"YulFunctionCall","src":"21716:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21710:2:85"}]},{"nodeType":"YulAssignment","src":"21746:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21759:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21763:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21767:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21752:6:85"},"nodeType":"YulFunctionCall","src":"21752:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21746:2:85"}]},{"nodeType":"YulAssignment","src":"21782:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21795:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21799:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21803:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21788:6:85"},"nodeType":"YulFunctionCall","src":"21788:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21782:2:85"}]},{"nodeType":"YulAssignment","src":"21818:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21831:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"21835:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21839:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21824:6:85"},"nodeType":"YulFunctionCall","src":"21824:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21818:2:85"}]},{"nodeType":"YulAssignment","src":"21854:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21867:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21871:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21875:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21860:6:85"},"nodeType":"YulFunctionCall","src":"21860:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21854:2:85"}]},{"nodeType":"YulAssignment","src":"21890:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21903:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21907:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21911:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21896:6:85"},"nodeType":"YulFunctionCall","src":"21896:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21890:2:85"}]},{"nodeType":"YulAssignment","src":"21926:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21939:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21943:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21947:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21932:6:85"},"nodeType":"YulFunctionCall","src":"21932:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21926:2:85"}]},{"nodeType":"YulAssignment","src":"21962:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"21975:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"21979:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"21983:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"21968:6:85"},"nodeType":"YulFunctionCall","src":"21968:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21962:2:85"}]},{"nodeType":"YulAssignment","src":"21998:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22011:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22015:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22019:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22004:6:85"},"nodeType":"YulFunctionCall","src":"22004:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"21998:2:85"}]},{"nodeType":"YulAssignment","src":"22034:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22047:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22051:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22055:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22040:6:85"},"nodeType":"YulFunctionCall","src":"22040:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22034:2:85"}]},{"nodeType":"YulAssignment","src":"22070:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22083:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22087:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22091:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22076:6:85"},"nodeType":"YulFunctionCall","src":"22076:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22070:2:85"}]},{"nodeType":"YulAssignment","src":"22106:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22119:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22123:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22127:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22112:6:85"},"nodeType":"YulFunctionCall","src":"22112:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22106:2:85"}]},{"nodeType":"YulAssignment","src":"22142:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22155:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22159:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22163:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22148:6:85"},"nodeType":"YulFunctionCall","src":"22148:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22142:2:85"}]},{"nodeType":"YulAssignment","src":"22178:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22191:2:85"},{"name":"t5","nodeType":"YulIdentifier","src":"22195:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22199:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22184:6:85"},"nodeType":"YulFunctionCall","src":"22184:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22178:2:85"}]},{"nodeType":"YulAssignment","src":"22214:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22227:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22231:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22235:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22220:6:85"},"nodeType":"YulFunctionCall","src":"22220:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22214:2:85"}]},{"nodeType":"YulAssignment","src":"22250:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22263:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22267:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22271:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22256:6:85"},"nodeType":"YulFunctionCall","src":"22256:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22250:2:85"}]},{"nodeType":"YulAssignment","src":"22286:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22299:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22303:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22307:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22292:6:85"},"nodeType":"YulFunctionCall","src":"22292:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22286:2:85"}]},{"nodeType":"YulAssignment","src":"22322:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22335:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"22339:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22343:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22328:6:85"},"nodeType":"YulFunctionCall","src":"22328:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22322:2:85"}]},{"nodeType":"YulAssignment","src":"22358:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22371:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22375:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22379:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22364:6:85"},"nodeType":"YulFunctionCall","src":"22364:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22358:2:85"}]},{"nodeType":"YulAssignment","src":"22394:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22407:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22411:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22415:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22400:6:85"},"nodeType":"YulFunctionCall","src":"22400:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22394:2:85"}]},{"nodeType":"YulAssignment","src":"22430:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22443:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22447:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22451:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22436:6:85"},"nodeType":"YulFunctionCall","src":"22436:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22430:2:85"}]},{"nodeType":"YulAssignment","src":"22466:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22479:2:85"},{"name":"t4","nodeType":"YulIdentifier","src":"22483:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22487:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22472:6:85"},"nodeType":"YulFunctionCall","src":"22472:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22466:2:85"}]},{"nodeType":"YulAssignment","src":"22502:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22515:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22519:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22523:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22508:6:85"},"nodeType":"YulFunctionCall","src":"22508:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22502:2:85"}]},{"nodeType":"YulAssignment","src":"22538:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22551:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22555:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22559:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22544:6:85"},"nodeType":"YulFunctionCall","src":"22544:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22538:2:85"}]},{"nodeType":"YulAssignment","src":"22574:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22587:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22591:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22595:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22580:6:85"},"nodeType":"YulFunctionCall","src":"22580:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22574:2:85"}]},{"nodeType":"YulAssignment","src":"22610:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22623:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22627:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22631:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22616:6:85"},"nodeType":"YulFunctionCall","src":"22616:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22610:2:85"}]},{"nodeType":"YulAssignment","src":"22646:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22659:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22663:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22667:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22652:6:85"},"nodeType":"YulFunctionCall","src":"22652:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22646:2:85"}]},{"nodeType":"YulAssignment","src":"22682:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22695:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22699:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22703:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22688:6:85"},"nodeType":"YulFunctionCall","src":"22688:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22682:2:85"}]},{"nodeType":"YulAssignment","src":"22718:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22731:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22735:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22739:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22724:6:85"},"nodeType":"YulFunctionCall","src":"22724:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22718:2:85"}]},{"nodeType":"YulAssignment","src":"22754:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22767:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22771:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22775:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22760:6:85"},"nodeType":"YulFunctionCall","src":"22760:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22754:2:85"}]},{"nodeType":"YulAssignment","src":"22790:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22803:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"22807:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22811:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22796:6:85"},"nodeType":"YulFunctionCall","src":"22796:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22790:2:85"}]},{"nodeType":"YulAssignment","src":"22826:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22839:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22843:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22847:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22832:6:85"},"nodeType":"YulFunctionCall","src":"22832:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22826:2:85"}]},{"nodeType":"YulAssignment","src":"22862:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22875:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22879:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22883:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22868:6:85"},"nodeType":"YulFunctionCall","src":"22868:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22862:2:85"}]},{"nodeType":"YulAssignment","src":"22898:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22911:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22915:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22919:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22904:6:85"},"nodeType":"YulFunctionCall","src":"22904:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22898:2:85"}]},{"nodeType":"YulAssignment","src":"22934:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22947:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"22951:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22955:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22940:6:85"},"nodeType":"YulFunctionCall","src":"22940:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22934:2:85"}]},{"nodeType":"YulAssignment","src":"22970:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"22983:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"22987:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"22991:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"22976:6:85"},"nodeType":"YulFunctionCall","src":"22976:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"22970:2:85"}]},{"nodeType":"YulAssignment","src":"23006:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23019:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23023:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23027:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23012:6:85"},"nodeType":"YulFunctionCall","src":"23012:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23006:2:85"}]},{"nodeType":"YulAssignment","src":"23042:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23055:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23059:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23063:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23048:6:85"},"nodeType":"YulFunctionCall","src":"23048:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23042:2:85"}]},{"nodeType":"YulAssignment","src":"23078:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23091:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23095:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23099:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23084:6:85"},"nodeType":"YulFunctionCall","src":"23084:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23078:2:85"}]},{"nodeType":"YulAssignment","src":"23114:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23127:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23131:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23135:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23120:6:85"},"nodeType":"YulFunctionCall","src":"23120:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23114:2:85"}]},{"nodeType":"YulAssignment","src":"23150:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23163:2:85"},{"name":"t3","nodeType":"YulIdentifier","src":"23167:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23171:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23156:6:85"},"nodeType":"YulFunctionCall","src":"23156:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23150:2:85"}]},{"nodeType":"YulAssignment","src":"23186:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23199:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23203:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23207:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23192:6:85"},"nodeType":"YulFunctionCall","src":"23192:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23186:2:85"}]},{"nodeType":"YulAssignment","src":"23222:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23235:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23239:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23243:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23228:6:85"},"nodeType":"YulFunctionCall","src":"23228:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23222:2:85"}]},{"nodeType":"YulAssignment","src":"23258:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23271:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23275:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23279:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23264:6:85"},"nodeType":"YulFunctionCall","src":"23264:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23258:2:85"}]},{"nodeType":"YulAssignment","src":"23294:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23307:2:85"},{"name":"t2","nodeType":"YulIdentifier","src":"23311:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23315:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23300:6:85"},"nodeType":"YulFunctionCall","src":"23300:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23294:2:85"}]},{"nodeType":"YulAssignment","src":"23330:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23343:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23347:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23351:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23336:6:85"},"nodeType":"YulFunctionCall","src":"23336:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23330:2:85"}]},{"nodeType":"YulAssignment","src":"23366:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23379:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23383:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23387:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23372:6:85"},"nodeType":"YulFunctionCall","src":"23372:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23366:2:85"}]},{"nodeType":"YulAssignment","src":"23402:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23415:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23419:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23423:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23408:6:85"},"nodeType":"YulFunctionCall","src":"23408:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23402:2:85"}]},{"nodeType":"YulAssignment","src":"23438:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23451:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23455:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23459:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23444:6:85"},"nodeType":"YulFunctionCall","src":"23444:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23438:2:85"}]},{"nodeType":"YulAssignment","src":"23474:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23487:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23491:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23495:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23480:6:85"},"nodeType":"YulFunctionCall","src":"23480:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23474:2:85"}]},{"nodeType":"YulAssignment","src":"23510:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23523:2:85"},{"name":"t1","nodeType":"YulIdentifier","src":"23527:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23531:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23516:6:85"},"nodeType":"YulFunctionCall","src":"23516:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23510:2:85"}]},{"nodeType":"YulAssignment","src":"23546:23:85","value":{"arguments":[{"name":"t0","nodeType":"YulIdentifier","src":"23559:2:85"},{"name":"t0","nodeType":"YulIdentifier","src":"23563:2:85"},{"name":"n","nodeType":"YulIdentifier","src":"23567:1:85"}],"functionName":{"name":"mulmod","nodeType":"YulIdentifier","src":"23552:6:85"},"nodeType":"YulFunctionCall","src":"23552:17:85"},"variableNames":[{"name":"t0","nodeType":"YulIdentifier","src":"23546:2:85"}]}]},"evmVersion":"london","externalReferences":[{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12574:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12627:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12671:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12751:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12850:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12962:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12975:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12979:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"12998:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13011:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13015:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13034:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13047:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13051:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13070:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13083:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13087:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13106:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13119:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13123:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13142:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13155:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13178:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13191:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13195:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13214:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13227:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13231:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13250:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13263:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13267:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13286:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13299:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13322:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13335:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13339:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13358:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13371:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13375:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13394:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13407:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13411:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13430:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13443:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13447:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13466:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13479:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13502:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13515:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13519:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13538:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13551:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13555:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13574:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13587:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13591:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13610:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13623:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13627:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13646:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13659:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13663:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13682:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13695:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13718:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13731:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13735:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13754:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13767:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13771:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13790:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13803:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13807:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13826:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13839:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13843:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13862:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13875:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13879:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13898:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13911:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13934:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13947:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13951:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13970:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13983:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"13987:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14006:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14019:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14023:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14042:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14055:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14078:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14091:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14095:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14114:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14127:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14131:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14150:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14163:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14167:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14186:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14199:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14203:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14222:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14235:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14258:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14271:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14275:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14294:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14307:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14311:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14330:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14343:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14347:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14366:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14379:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14383:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14402:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14415:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14419:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14438:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14451:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14474:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14487:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14491:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14510:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14523:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14527:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14546:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14559:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14563:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14582:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14595:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14599:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14618:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14631:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14654:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14667:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14671:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14690:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14703:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14707:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14726:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14739:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14743:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14762:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14775:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14779:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14798:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14811:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14815:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14834:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14847:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14851:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14870:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14883:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14887:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14906:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14919:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14942:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14955:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14959:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14978:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14991:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"14995:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15014:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15027:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15031:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15050:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15063:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15067:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15086:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15099:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15103:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15122:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15135:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15139:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15158:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15171:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15175:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15194:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15207:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15211:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15230:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15243:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15247:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15266:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15279:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15283:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15302:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15315:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15338:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15351:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15355:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15374:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15387:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15391:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15410:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15423:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15427:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15446:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15459:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15463:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15482:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15495:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15518:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15531:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15535:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15554:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15567:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15571:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15590:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15603:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15607:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15626:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15639:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15643:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15662:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15675:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15698:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15711:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15715:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15734:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15747:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15751:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15770:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15783:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15787:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15806:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15819:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15823:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15842:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15855:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15859:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15878:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15891:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15895:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15914:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15927:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15931:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15950:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15963:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15986:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"15999:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16003:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16022:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16035:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16039:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16058:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16071:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16075:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16094:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16107:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16111:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16130:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16143:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16147:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16166:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16179:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16183:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16202:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16215:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16238:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16251:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16255:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16274:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16287:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16291:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16310:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16323:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16327:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16346:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16359:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16363:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16382:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16395:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16399:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16418:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16431:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16435:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16454:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16467:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16471:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16490:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16503:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16526:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16539:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16543:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16562:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16575:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16579:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16598:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16611:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16615:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16634:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16647:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16651:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16670:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16683:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16687:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16706:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16719:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16742:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16755:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16759:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16778:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16791:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16795:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16814:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16827:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16831:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16850:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16863:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16886:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16899:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16903:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16922:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16935:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16939:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16958:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16971:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16975:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"16994:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17007:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17011:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17030:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17043:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17047:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17066:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17079:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17083:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17102:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17115:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17119:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17138:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17151:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17155:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17174:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17187:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17210:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17223:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17227:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17246:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17259:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17263:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17282:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17295:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17299:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17318:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17331:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17335:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17354:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17367:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17371:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17390:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17403:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17407:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17426:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17439:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17443:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17462:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17475:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17479:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17498:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17511:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17515:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17534:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17547:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17570:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17583:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17587:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17606:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17619:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17623:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17642:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17655:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17659:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17678:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17691:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17714:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17727:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17731:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17750:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17763:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17767:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17786:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17799:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17803:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17822:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17835:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17839:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17858:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17871:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17875:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17894:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17907:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17911:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17930:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17943:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17947:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17966:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17979:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"17983:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18002:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18015:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18038:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18051:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18055:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18074:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18087:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18091:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18110:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18123:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18127:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18146:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18159:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18163:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18182:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18195:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18218:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18231:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18235:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18254:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18267:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18271:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18290:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18303:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18307:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18326:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18339:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18343:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18362:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18375:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18379:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18398:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18411:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18434:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18447:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18451:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18470:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18483:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18487:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18506:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18519:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18523:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18542:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18555:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18578:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18591:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18595:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18614:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18627:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18631:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18650:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18663:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18667:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18686:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18699:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18703:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18722:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18735:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18739:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18758:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18771:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18775:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18794:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18807:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18811:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18830:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18843:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18847:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18866:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18879:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18883:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18902:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18915:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18919:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18938:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18951:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18974:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18987:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"18991:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19010:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19023:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19027:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19046:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19059:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19063:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19082:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19095:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19099:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19118:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19131:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19154:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19167:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19171:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19190:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19203:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19207:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19226:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19239:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19243:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19262:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19275:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19279:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19298:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19311:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19315:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19334:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19347:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19370:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19383:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19387:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19406:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19419:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19423:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19442:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19455:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19459:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19478:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19491:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19495:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19514:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19527:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19531:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19550:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19563:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19567:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19586:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19599:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19603:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19622:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19635:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19658:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19671:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19675:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19694:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19707:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19711:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19730:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19743:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19766:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19779:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19783:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19802:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19815:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19819:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19838:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19851:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19855:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19874:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19887:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19891:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19910:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19923:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19927:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19946:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19959:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19963:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19982:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19995:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"19999:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20018:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20031:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20054:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20067:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20071:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20090:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20103:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20107:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20126:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20139:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20143:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20162:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20175:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20179:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20198:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20211:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20215:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20234:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20247:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20251:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20270:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20283:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20306:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20319:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20323:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20342:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20355:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20359:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20378:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20391:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20395:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20414:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20427:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20431:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20450:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20463:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20467:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20486:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20499:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20522:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20535:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20539:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20558:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20571:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20575:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20594:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20607:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20630:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20643:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20647:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20666:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20679:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20683:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20702:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20715:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20719:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20738:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20751:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20755:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20774:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20787:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20791:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20810:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20823:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20827:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20846:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20859:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20863:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20882:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20895:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20918:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20931:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20935:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20954:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20967:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20971:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"20990:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21003:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21007:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21026:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21039:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21043:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21062:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21075:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21079:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21098:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21111:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21115:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21134:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21147:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21170:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21183:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21187:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21206:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21219:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21223:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21242:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21255:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21259:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21278:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21291:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21295:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21314:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21327:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21331:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21350:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21363:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21386:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21399:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21403:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21422:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21435:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21439:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21458:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21471:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21475:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21494:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21507:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21511:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21530:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21543:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21547:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21566:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21579:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21583:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21602:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21615:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21638:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21651:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21655:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21674:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21687:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21691:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21710:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21723:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21727:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21746:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21759:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21763:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21782:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21795:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21799:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21818:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21831:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21854:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21867:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21871:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21890:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21903:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21907:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21926:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21939:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21943:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21962:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21975:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21979:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"21998:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22011:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22015:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22034:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22047:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22051:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22070:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22083:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22087:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22106:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22119:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22123:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22142:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22155:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22159:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22178:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22191:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22214:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22227:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22231:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22250:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22263:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22267:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22286:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22299:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22303:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22322:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22335:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22358:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22371:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22375:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22394:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22407:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22411:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22430:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22443:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22447:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22466:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22479:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22502:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22515:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22519:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22538:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22551:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22555:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22574:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22587:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22591:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22610:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22623:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22627:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22646:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22659:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22663:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22682:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22695:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22699:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22718:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22731:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22735:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22754:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22767:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22771:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22790:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22803:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22826:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22839:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22843:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22862:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22875:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22879:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22898:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22911:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22915:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22934:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22947:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22951:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22970:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"22983:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23006:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23019:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23023:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23042:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23055:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23059:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23078:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23091:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23095:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23114:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23127:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23131:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23150:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23163:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23186:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23199:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23203:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23222:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23235:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23239:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23258:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23271:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23275:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23294:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23307:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23330:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23343:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23347:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23366:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23379:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23383:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23402:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23415:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23419:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23438:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23451:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23455:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23474:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23487:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23491:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23510:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23523:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23546:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23559:2:85","valueSize":1},{"declaration":17808,"isOffset":false,"isSlot":false,"src":"23563:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"12587:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"12591:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"12631:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"13303:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"13483:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"14059:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"14455:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"16219:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"19747:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"20611:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"21367:2:85","valueSize":1},{"declaration":17805,"isOffset":false,"isSlot":false,"src":"21619:2:85","valueSize":1}],"id":17810,"nodeType":"InlineAssembly","src":"12434:11145:85"}]},"id":17812,"implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"12309:3:85","nodeType":"FunctionDefinition","parameters":{"id":17806,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17805,"mutability":"mutable","name":"t6","nameLocation":"12321:2:85","nodeType":"VariableDeclaration","scope":17812,"src":"12313:10:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17804,"name":"uint256","nodeType":"ElementaryTypeName","src":"12313:7:85","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12312:12:85"},"returnParameters":{"id":17809,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17808,"mutability":"mutable","name":"t0","nameLocation":"12356:2:85","nodeType":"VariableDeclaration","scope":17812,"src":"12348:10:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17807,"name":"uint256","nodeType":"ElementaryTypeName","src":"12348:7:85","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12347:12:85"},"scope":17813,"src":"12300:11285:85","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":17814,"src":"12275:11312:85","usedErrors":[]}],"src":"32:23556:85"},"id":85},"contracts/samples/callback/TokenCallbackHandler.sol":{"ast":{"absolutePath":"contracts/samples/callback/TokenCallbackHandler.sol","exportedSymbols":{"IERC1155Receiver":[3754],"IERC165":[5840],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"TokenCallbackHandler":[17937]},"id":17938,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":17815,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:86"},{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","file":"@openzeppelin/contracts/utils/introspection/IERC165.sol","id":17816,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17938,"sourceUnit":5841,"src":"101:65:86","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","file":"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol","id":17817,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17938,"sourceUnit":4800,"src":"167:67:86","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","file":"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol","id":17818,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17938,"sourceUnit":4780,"src":"235:66:86","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","file":"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol","id":17819,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17938,"sourceUnit":3755,"src":"302:68:86","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17821,"name":"IERC777Recipient","nodeType":"IdentifierPath","referencedDeclaration":4799,"src":"523:16:86"},"id":17822,"nodeType":"InheritanceSpecifier","src":"523:16:86"},{"baseName":{"id":17823,"name":"IERC721Receiver","nodeType":"IdentifierPath","referencedDeclaration":4779,"src":"541:15:86"},"id":17824,"nodeType":"InheritanceSpecifier","src":"541:15:86"},{"baseName":{"id":17825,"name":"IERC1155Receiver","nodeType":"IdentifierPath","referencedDeclaration":3754,"src":"558:16:86"},"id":17826,"nodeType":"InheritanceSpecifier","src":"558:16:86"}],"canonicalName":"TokenCallbackHandler","contractDependencies":[],"contractKind":"contract","documentation":{"id":17820,"nodeType":"StructuredDocumentation","src":"372:117:86","text":" Token callback handler.\n Handles supported tokens' callbacks, allowing account receiving these tokens."},"fullyImplemented":true,"id":17937,"linearizedBaseContracts":[17937,3754,5840,4779,4799],"name":"TokenCallbackHandler","nameLocation":"499:20:86","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[4798],"body":{"id":17842,"nodeType":"Block","src":"750:7:86","statements":[]},"functionSelector":"0023de29","id":17843,"implemented":true,"kind":"function","modifiers":[],"name":"tokensReceived","nameLocation":"590:14:86","nodeType":"FunctionDefinition","overrides":{"id":17840,"nodeType":"OverrideSpecifier","overrides":[],"src":"741:8:86"},"parameters":{"id":17839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17828,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"614:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17827,"name":"address","nodeType":"ElementaryTypeName","src":"614:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17830,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"631:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17829,"name":"address","nodeType":"ElementaryTypeName","src":"631:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17832,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"648:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17831,"name":"address","nodeType":"ElementaryTypeName","src":"648:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17834,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"665:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17833,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17836,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"682:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17835,"name":"bytes","nodeType":"ElementaryTypeName","src":"682:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":17838,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17843,"src":"706:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17837,"name":"bytes","nodeType":"ElementaryTypeName","src":"706:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"604:122:86"},"returnParameters":{"id":17841,"nodeType":"ParameterList","parameters":[],"src":"750:0:86"},"scope":17937,"src":"581:176:86","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[4778],"body":{"id":17861,"nodeType":"Block","src":"910:65:86","statements":[{"expression":{"expression":{"expression":{"id":17857,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4779,"src":"927:15:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$4779_$","typeString":"type(contract IERC721Receiver)"}},"id":17858,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"onERC721Received","nodeType":"MemberAccess","referencedDeclaration":4778,"src":"927:32:86","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC721Receiver.onERC721Received(address,address,uint256,bytes calldata) returns (bytes4)"}},"id":17859,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"927:41:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":17856,"id":17860,"nodeType":"Return","src":"920:48:86"}]},"functionSelector":"150b7a02","id":17862,"implemented":true,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"772:16:86","nodeType":"FunctionDefinition","overrides":{"id":17853,"nodeType":"OverrideSpecifier","overrides":[],"src":"884:8:86"},"parameters":{"id":17852,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17845,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17862,"src":"798:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17844,"name":"address","nodeType":"ElementaryTypeName","src":"798:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17847,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17862,"src":"815:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17846,"name":"address","nodeType":"ElementaryTypeName","src":"815:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17849,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17862,"src":"832:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17848,"name":"uint256","nodeType":"ElementaryTypeName","src":"832:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17851,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17862,"src":"849:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17850,"name":"bytes","nodeType":"ElementaryTypeName","src":"849:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"788:81:86"},"returnParameters":{"id":17856,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17855,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17862,"src":"902:6:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17854,"name":"bytes4","nodeType":"ElementaryTypeName","src":"902:6:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"901:8:86"},"scope":17937,"src":"763:212:86","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[3735],"body":{"id":17882,"nodeType":"Block","src":"1146:67:86","statements":[{"expression":{"expression":{"expression":{"id":17878,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3754,"src":"1163:16:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$3754_$","typeString":"type(contract IERC1155Receiver)"}},"id":17879,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"onERC1155Received","nodeType":"MemberAccess","referencedDeclaration":3735,"src":"1163:34:86","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155Receiver.onERC1155Received(address,address,uint256,uint256,bytes calldata) returns (bytes4)"}},"id":17880,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"1163:43:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":17877,"id":17881,"nodeType":"Return","src":"1156:50:86"}]},"functionSelector":"f23a6e61","id":17883,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"990:17:86","nodeType":"FunctionDefinition","overrides":{"id":17874,"nodeType":"OverrideSpecifier","overrides":[],"src":"1120:8:86"},"parameters":{"id":17873,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17864,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1017:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17863,"name":"address","nodeType":"ElementaryTypeName","src":"1017:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17866,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1034:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17865,"name":"address","nodeType":"ElementaryTypeName","src":"1034:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17868,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1051:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17867,"name":"uint256","nodeType":"ElementaryTypeName","src":"1051:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17870,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1068:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17869,"name":"uint256","nodeType":"ElementaryTypeName","src":"1068:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17872,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1085:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17871,"name":"bytes","nodeType":"ElementaryTypeName","src":"1085:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1007:98:86"},"returnParameters":{"id":17877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17876,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17883,"src":"1138:6:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17875,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1138:6:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1137:8:86"},"scope":17937,"src":"981:232:86","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[3753],"body":{"id":17905,"nodeType":"Block","src":"1411:72:86","statements":[{"expression":{"expression":{"expression":{"id":17901,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3754,"src":"1428:16:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$3754_$","typeString":"type(contract IERC1155Receiver)"}},"id":17902,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"onERC1155BatchReceived","nodeType":"MemberAccess","referencedDeclaration":3753,"src":"1428:39:86","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155Receiver.onERC1155BatchReceived(address,address,uint256[] calldata,uint256[] calldata,bytes calldata) returns (bytes4)"}},"id":17903,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"1428:48:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":17900,"id":17904,"nodeType":"Return","src":"1421:55:86"}]},"functionSelector":"bc197c81","id":17906,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"1228:22:86","nodeType":"FunctionDefinition","overrides":{"id":17897,"nodeType":"OverrideSpecifier","overrides":[],"src":"1385:8:86"},"parameters":{"id":17896,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17885,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1260:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17884,"name":"address","nodeType":"ElementaryTypeName","src":"1260:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17887,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1277:7:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17886,"name":"address","nodeType":"ElementaryTypeName","src":"1277:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17890,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1294:18:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":17888,"name":"uint256","nodeType":"ElementaryTypeName","src":"1294:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17889,"nodeType":"ArrayTypeName","src":"1294:9:86","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":17893,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1322:18:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":17891,"name":"uint256","nodeType":"ElementaryTypeName","src":"1322:7:86","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17892,"nodeType":"ArrayTypeName","src":"1322:9:86","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":17895,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1350:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17894,"name":"bytes","nodeType":"ElementaryTypeName","src":"1350:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1250:120:86"},"returnParameters":{"id":17900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17899,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17906,"src":"1403:6:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17898,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1403:6:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1402:8:86"},"scope":17937,"src":"1219:264:86","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[5839],"body":{"id":17935,"nodeType":"Block","src":"1582:205:86","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":17933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":17926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":17919,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17914,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17908,"src":"1611:11:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":17916,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4779,"src":"1631:15:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$4779_$","typeString":"type(contract IERC721Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$4779_$","typeString":"type(contract IERC721Receiver)"}],"id":17915,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1626:4:86","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":17917,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1626:21:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Receiver_$4779","typeString":"type(contract IERC721Receiver)"}},"id":17918,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1626:33:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1611:48:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":17925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17920,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17908,"src":"1675:11:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":17922,"name":"IERC1155Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3754,"src":"1695:16:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$3754_$","typeString":"type(contract IERC1155Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155Receiver_$3754_$","typeString":"type(contract IERC1155Receiver)"}],"id":17921,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1690:4:86","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":17923,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1690:22:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155Receiver_$3754","typeString":"type(contract IERC1155Receiver)"}},"id":17924,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1690:34:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1675:49:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1611:113:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":17932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":17927,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17908,"src":"1740:11:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":17929,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5840,"src":"1760:7:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$5840_$","typeString":"type(contract IERC165)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC165_$5840_$","typeString":"type(contract IERC165)"}],"id":17928,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1755:4:86","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":17930,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1755:13:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC165_$5840","typeString":"type(contract IERC165)"}},"id":17931,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"1755:25:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1740:40:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1611:169:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":17913,"id":17934,"nodeType":"Return","src":"1592:188:86"}]},"functionSelector":"01ffc9a7","id":17936,"implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"1498:17:86","nodeType":"FunctionDefinition","overrides":{"id":17910,"nodeType":"OverrideSpecifier","overrides":[],"src":"1558:8:86"},"parameters":{"id":17909,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17908,"mutability":"mutable","name":"interfaceId","nameLocation":"1523:11:86","nodeType":"VariableDeclaration","scope":17936,"src":"1516:18:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17907,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1516:6:86","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1515:20:86"},"returnParameters":{"id":17913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17912,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17936,"src":"1576:4:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17911,"name":"bool","nodeType":"ElementaryTypeName","src":"1576:4:86","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1575:6:86"},"scope":17937,"src":"1489:298:86","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":17938,"src":"490:1299:86","usedErrors":[]}],"src":"36:1754:86"},"id":86},"contracts/samples/gnosis/EIP4337Fallback.sol":{"ast":{"absolutePath":"contracts/samples/gnosis/EIP4337Fallback.sol","exportedSymbols":{"DefaultCallbackHandler":[2412],"ECDSA":[5828],"EIP4337Fallback":[18128],"EIP4337Manager":[18804],"ERC1155TokenReceiver":[2450],"ERC721TokenReceiver":[2468],"ERC777TokensRecipient":[2486],"Enum":[1998],"EtherPaymentFallback":[2020],"Exec":[20709],"Executor":[984],"FallbackManager":[1035],"GnosisSafe":[952],"GnosisSafeMath":[2286],"GnosisSafeStorage":[2180],"Guard":[1073],"GuardManager":[1113],"IAccount":[10569],"IAggregator":[10603],"IERC1271":[2947],"IERC165":[2498],"IEntryPoint":[10807],"INonceManager":[10826],"ISignatureValidator":[2517],"ISignatureValidatorConstants":[2504],"IStakeManager":[10966],"Math":[6705],"ModuleManager":[1480],"OwnerManager":[1991],"SecuredTokenTransfer":[2047],"SelfAuthorized":[2073],"SignatureDecoder":[2093],"Singleton":[2099],"StorageAccessible":[2148],"Strings":[5467],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":18129,"license":"GPL","nodeType":"SourceUnit","nodes":[{"id":17939,"literals":["solidity","^","0.8",".7"],"nodeType":"PragmaDirective","src":"31:23:87"},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol","file":"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol","id":17940,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":2413,"src":"98:80:87","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol","file":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol","id":17941,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":953,"src":"179:60:87","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC1271.sol","file":"@openzeppelin/contracts/interfaces/IERC1271.sol","id":17942,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":2948,"src":"240:57:87","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":17943,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":5829,"src":"298:62:87","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../../interfaces/IAccount.sol","id":17944,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":10570,"src":"361:39:87","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/gnosis/EIP4337Manager.sol","file":"./EIP4337Manager.sol","id":17945,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18129,"sourceUnit":18805,"src":"401:30:87","symbolAliases":[],"unitAlias":""},{"global":false,"id":17948,"libraryName":{"id":17946,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"439:5:87"},"nodeType":"UsingForDirective","src":"433:24:87","typeName":{"id":17947,"name":"bytes32","nodeType":"ElementaryTypeName","src":"449:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"abstract":false,"baseContracts":[{"baseName":{"id":17950,"name":"DefaultCallbackHandler","nodeType":"IdentifierPath","referencedDeclaration":2412,"src":"907:22:87"},"id":17951,"nodeType":"InheritanceSpecifier","src":"907:22:87"},{"baseName":{"id":17952,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"931:8:87"},"id":17953,"nodeType":"InheritanceSpecifier","src":"931:8:87"},{"baseName":{"id":17954,"name":"IERC1271","nodeType":"IdentifierPath","referencedDeclaration":2947,"src":"941:8:87"},"id":17955,"nodeType":"InheritanceSpecifier","src":"941:8:87"}],"canonicalName":"EIP4337Fallback","contractDependencies":[],"contractKind":"contract","documentation":{"id":17949,"nodeType":"StructuredDocumentation","src":"459:419:87","text":" The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\n This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\n Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\n Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager."},"fullyImplemented":true,"id":18128,"linearizedBaseContracts":[18128,2947,10569,2412,2498,2468,2486,2450],"name":"EIP4337Fallback","nameLocation":"888:15:87","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":17958,"mutability":"constant","name":"ERC1271_MAGIC_VALUE","nameLocation":"981:19:87","nodeType":"VariableDeclaration","scope":18128,"src":"956:57:87","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17956,"name":"bytes4","nodeType":"ElementaryTypeName","src":"956:6:87","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"hexValue":"30783136323662613765","id":17957,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1003:10:87","typeDescriptions":{"typeIdentifier":"t_rational_371636862_by_1","typeString":"int_const 371636862"},"value":"0x1626ba7e"},"visibility":"internal"},{"constant":false,"functionSelector":"2bcadc24","id":17960,"mutability":"immutable","name":"eip4337manager","nameLocation":"1045:14:87","nodeType":"VariableDeclaration","scope":18128,"src":"1020:39:87","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17959,"name":"address","nodeType":"ElementaryTypeName","src":"1020:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"body":{"id":17969,"nodeType":"Block","src":"1102:49:87","statements":[{"expression":{"id":17967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17965,"name":"eip4337manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17960,"src":"1112:14:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":17966,"name":"_eip4337manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17962,"src":"1129:15:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1112:32:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":17968,"nodeType":"ExpressionStatement","src":"1112:32:87"}]},"id":17970,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17962,"mutability":"mutable","name":"_eip4337manager","nameLocation":"1085:15:87","nodeType":"VariableDeclaration","scope":17970,"src":"1077:23:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17961,"name":"address","nodeType":"ElementaryTypeName","src":"1077:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1076:25:87"},"returnParameters":{"id":17964,"nodeType":"ParameterList","parameters":[],"src":"1102:0:87"},"scope":18128,"src":"1065:86:87","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18009,"nodeType":"Block","src":"1290:496:87","statements":[{"assignments":[17978],"declarations":[{"constant":false,"id":17978,"mutability":"mutable","name":"safe","nameLocation":"1458:4:87","nodeType":"VariableDeclaration","scope":18009,"src":"1447:15:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":17977,"nodeType":"UserDefinedTypeName","pathNode":{"id":17976,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"1447:10:87"},"referencedDeclaration":952,"src":"1447:10:87","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"id":17986,"initialValue":{"arguments":[{"arguments":[{"expression":{"id":17982,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1484:3:87","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":17983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1484:10:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":17981,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1476:8:87","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":17980,"name":"address","nodeType":"ElementaryTypeName","src":"1476:8:87","stateMutability":"payable","typeDescriptions":{}}},"id":17984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1476:19:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":17979,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"1465:10:87","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":17985,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1465:31:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"nodeType":"VariableDeclarationStatement","src":"1447:49:87"},{"assignments":[17988,17990],"declarations":[{"constant":false,"id":17988,"mutability":"mutable","name":"success","nameLocation":"1512:7:87","nodeType":"VariableDeclaration","scope":18009,"src":"1507:12:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17987,"name":"bool","nodeType":"ElementaryTypeName","src":"1507:4:87","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":17990,"mutability":"mutable","name":"ret","nameLocation":"1534:3:87","nodeType":"VariableDeclaration","scope":18009,"src":"1521:16:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17989,"name":"bytes","nodeType":"ElementaryTypeName","src":"1521:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18001,"initialValue":{"arguments":[{"id":17993,"name":"eip4337manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17960,"src":"1582:14:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":17994,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1598:1:87","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"id":17995,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1601:3:87","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":17996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"1601:8:87","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"expression":{"expression":{"id":17997,"name":"Enum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1998,"src":"1611:4:87","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Enum_$1998_$","typeString":"type(contract Enum)"}},"id":17998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"Operation","nodeType":"MemberAccess","referencedDeclaration":1997,"src":"1611:14:87","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_Operation_$1997_$","typeString":"type(enum Enum.Operation)"}},"id":17999,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"DelegateCall","nodeType":"MemberAccess","referencedDeclaration":1996,"src":"1611:27:87","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}],"expression":{"id":17991,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17978,"src":"1541:4:87","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":17992,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"execTransactionFromModuleReturnData","nodeType":"MemberAccess","referencedDeclaration":1389,"src":"1541:40:87","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation) external returns (bool,bytes memory)"}},"id":18000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1541:98:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"1506:133:87"},{"condition":{"id":18003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1653:8:87","subExpression":{"id":18002,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17988,"src":"1654:7:87","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18006,"nodeType":"IfStatement","src":"1649:111:87","trueBody":{"id":18005,"nodeType":"Block","src":"1663:97:87","statements":[{"AST":{"nodeType":"YulBlock","src":"1686:64:87","statements":[{"expression":{"arguments":[{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"1715:3:87"},{"kind":"number","nodeType":"YulLiteral","src":"1720:2:87","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1711:3:87"},"nodeType":"YulFunctionCall","src":"1711:12:87"},{"arguments":[{"name":"ret","nodeType":"YulIdentifier","src":"1731:3:87"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1725:5:87"},"nodeType":"YulFunctionCall","src":"1725:10:87"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1704:6:87"},"nodeType":"YulFunctionCall","src":"1704:32:87"},"nodeType":"YulExpressionStatement","src":"1704:32:87"}]},"evmVersion":"london","externalReferences":[{"declaration":17990,"isOffset":false,"isSlot":false,"src":"1715:3:87","valueSize":1},{"declaration":17990,"isOffset":false,"isSlot":false,"src":"1731:3:87","valueSize":1}],"id":18004,"nodeType":"InlineAssembly","src":"1677:73:87"}]}},{"expression":{"id":18007,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17990,"src":"1776:3:87","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":17975,"id":18008,"nodeType":"Return","src":"1769:10:87"}]},"documentation":{"id":17971,"nodeType":"StructuredDocumentation","src":"1157:67:87","text":" delegate the contract call to the EIP4337Manager"},"id":18010,"implemented":true,"kind":"function","modifiers":[],"name":"delegateToManager","nameLocation":"1238:17:87","nodeType":"FunctionDefinition","parameters":{"id":17972,"nodeType":"ParameterList","parameters":[],"src":"1255:2:87"},"returnParameters":{"id":17975,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17974,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18010,"src":"1276:12:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17973,"name":"bytes","nodeType":"ElementaryTypeName","src":"1276:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1275:14:87"},"scope":18128,"src":"1229:557:87","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[10568],"body":{"id":18037,"nodeType":"Block","src":"1986:98:87","statements":[{"assignments":[18025],"declarations":[{"constant":false,"id":18025,"mutability":"mutable","name":"ret","nameLocation":"2009:3:87","nodeType":"VariableDeclaration","scope":18037,"src":"1996:16:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18024,"name":"bytes","nodeType":"ElementaryTypeName","src":"1996:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18028,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":18026,"name":"delegateToManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18010,"src":"2015:17:87","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$_t_bytes_memory_ptr_$","typeString":"function () returns (bytes memory)"}},"id":18027,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2015:19:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1996:38:87"},{"expression":{"arguments":[{"id":18031,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18025,"src":"2062:3:87","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":18033,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2068:7:87","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18032,"name":"uint256","nodeType":"ElementaryTypeName","src":"2068:7:87","typeDescriptions":{}}}],"id":18034,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2067:9:87","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":18029,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2051:3:87","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18030,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"2051:10:87","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":18035,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2051:26:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":18023,"id":18036,"nodeType":"Return","src":"2044:33:87"}]},"documentation":{"id":18011,"nodeType":"StructuredDocumentation","src":"1792:79:87","text":" called from the Safe. delegate actual work to EIP4337Manager"},"functionSelector":"3a871cdd","id":18038,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1885:14:87","nodeType":"FunctionDefinition","overrides":{"id":18020,"nodeType":"OverrideSpecifier","overrides":[],"src":"1942:8:87"},"parameters":{"id":18019,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18014,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18038,"src":"1900:22:87","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":18013,"nodeType":"UserDefinedTypeName","pathNode":{"id":18012,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1900:13:87"},"referencedDeclaration":10993,"src":"1900:13:87","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":18016,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18038,"src":"1924:7:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18015,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1924:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":18018,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18038,"src":"1933:7:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18017,"name":"uint256","nodeType":"ElementaryTypeName","src":"1933:7:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1899:42:87"},"returnParameters":{"id":18023,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18022,"mutability":"mutable","name":"deadline","nameLocation":"1977:8:87","nodeType":"VariableDeclaration","scope":18038,"src":"1969:16:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18021,"name":"uint256","nodeType":"ElementaryTypeName","src":"1969:7:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1968:18:87"},"scope":18128,"src":"1876:208:87","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18060,"nodeType":"Block","src":"2205:101:87","statements":[{"assignments":[18045],"declarations":[{"constant":false,"id":18045,"mutability":"mutable","name":"ret","nameLocation":"2228:3:87","nodeType":"VariableDeclaration","scope":18060,"src":"2215:16:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18044,"name":"bytes","nodeType":"ElementaryTypeName","src":"2215:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18048,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":18046,"name":"delegateToManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18010,"src":"2234:17:87","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$_t_bytes_memory_ptr_$","typeString":"function () returns (bytes memory)"}},"id":18047,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2234:19:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2215:38:87"},{"expression":{"id":18058,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":18049,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18042,"src":"2264:5:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":18050,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"2263:7:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":18053,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18045,"src":"2284:3:87","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":18055,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2290:7:87","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18054,"name":"uint256","nodeType":"ElementaryTypeName","src":"2290:7:87","typeDescriptions":{}}}],"id":18056,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2289:9:87","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":18051,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2273:3:87","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18052,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"2273:10:87","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":18057,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2273:26:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2263:36:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18059,"nodeType":"ExpressionStatement","src":"2263:36:87"}]},"documentation":{"id":18039,"nodeType":"StructuredDocumentation","src":"2090:59:87","text":" Helper for wallet to get the next nonce."},"functionSelector":"d087d288","id":18061,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"2163:8:87","nodeType":"FunctionDefinition","parameters":{"id":18040,"nodeType":"ParameterList","parameters":[],"src":"2171:2:87"},"returnParameters":{"id":18043,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18042,"mutability":"mutable","name":"nonce","nameLocation":"2198:5:87","nodeType":"VariableDeclaration","scope":18061,"src":"2190:13:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18041,"name":"uint256","nodeType":"ElementaryTypeName","src":"2190:7:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2189:15:87"},"scope":18128,"src":"2154:152:87","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18077,"nodeType":"Block","src":"2517:36:87","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":18074,"name":"delegateToManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18010,"src":"2527:17:87","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$_t_bytes_memory_ptr_$","typeString":"function () returns (bytes memory)"}},"id":18075,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2527:19:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18076,"nodeType":"ExpressionStatement","src":"2527:19:87"}]},"documentation":{"id":18062,"nodeType":"StructuredDocumentation","src":"2312:79:87","text":" called from the Safe. delegate actual work to EIP4337Manager"},"functionSelector":"940d3c60","id":18078,"implemented":true,"kind":"function","modifiers":[],"name":"executeAndRevert","nameLocation":"2405:16:87","nodeType":"FunctionDefinition","parameters":{"id":18072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18064,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18078,"src":"2431:7:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18063,"name":"address","nodeType":"ElementaryTypeName","src":"2431:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18066,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18078,"src":"2448:7:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18065,"name":"uint256","nodeType":"ElementaryTypeName","src":"2448:7:87","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":18068,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18078,"src":"2465:12:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18067,"name":"bytes","nodeType":"ElementaryTypeName","src":"2465:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18071,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18078,"src":"2487:14:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":18070,"nodeType":"UserDefinedTypeName","pathNode":{"id":18069,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"2487:14:87"},"referencedDeclaration":1997,"src":"2487:14:87","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"}],"src":"2421:86:87"},"returnParameters":{"id":18073,"nodeType":"ParameterList","parameters":[],"src":"2517:0:87"},"scope":18128,"src":"2396:157:87","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[2946],"body":{"id":18126,"nodeType":"Block","src":"2687:354:87","statements":[{"assignments":[18089],"declarations":[{"constant":false,"id":18089,"mutability":"mutable","name":"hash","nameLocation":"2705:4:87","nodeType":"VariableDeclaration","scope":18126,"src":"2697:12:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18088,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2697:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":18093,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18090,"name":"_hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18080,"src":"2712:5:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"2712:28:87","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":18092,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2712:30:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2697:45:87"},{"assignments":[18095],"declarations":[{"constant":false,"id":18095,"mutability":"mutable","name":"recovered","nameLocation":"2760:9:87","nodeType":"VariableDeclaration","scope":18126,"src":"2752:17:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18094,"name":"address","nodeType":"ElementaryTypeName","src":"2752:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18100,"initialValue":{"arguments":[{"id":18098,"name":"_signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18082,"src":"2785:10:87","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":18096,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18089,"src":"2772:4:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"2772:12:87","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":18099,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2772:24:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2752:44:87"},{"assignments":[18103],"declarations":[{"constant":false,"id":18103,"mutability":"mutable","name":"safe","nameLocation":"2818:4:87","nodeType":"VariableDeclaration","scope":18126,"src":"2807:15:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18102,"nodeType":"UserDefinedTypeName","pathNode":{"id":18101,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"2807:10:87"},"referencedDeclaration":952,"src":"2807:10:87","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"id":18114,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"expression":{"id":18109,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2852:3:87","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18110,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2852:10:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18108,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2844:7:87","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18107,"name":"address","nodeType":"ElementaryTypeName","src":"2844:7:87","typeDescriptions":{}}},"id":18111,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2844:19:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18106,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2836:8:87","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18105,"name":"address","nodeType":"ElementaryTypeName","src":"2836:8:87","stateMutability":"payable","typeDescriptions":{}}},"id":18112,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2836:28:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":18104,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"2825:10:87","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":18113,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2825:40:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"nodeType":"VariableDeclarationStatement","src":"2807:58:87"},{"condition":{"arguments":[{"id":18117,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18095,"src":"2924:9:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18115,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18103,"src":"2911:4:87","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isOwner","nodeType":"MemberAccess","referencedDeclaration":1939,"src":"2911:12:87","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view external returns (bool)"}},"id":18118,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2911:23:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":18124,"nodeType":"Block","src":"2993:42:87","statements":[{"expression":{"hexValue":"30786666666666666666","id":18122,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3014:10:87","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"functionReturnParameters":18087,"id":18123,"nodeType":"Return","src":"3007:17:87"}]},"id":18125,"nodeType":"IfStatement","src":"2907:128:87","trueBody":{"id":18121,"nodeType":"Block","src":"2936:51:87","statements":[{"expression":{"id":18119,"name":"ERC1271_MAGIC_VALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17958,"src":"2957:19:87","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":18087,"id":18120,"nodeType":"Return","src":"2950:26:87"}]}}]},"functionSelector":"1626ba7e","id":18127,"implemented":true,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"2568:16:87","nodeType":"FunctionDefinition","overrides":{"id":18084,"nodeType":"OverrideSpecifier","overrides":[],"src":"2656:8:87"},"parameters":{"id":18083,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18080,"mutability":"mutable","name":"_hash","nameLocation":"2602:5:87","nodeType":"VariableDeclaration","scope":18127,"src":"2594:13:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18079,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2594:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":18082,"mutability":"mutable","name":"_signature","nameLocation":"2630:10:87","nodeType":"VariableDeclaration","scope":18127,"src":"2617:23:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18081,"name":"bytes","nodeType":"ElementaryTypeName","src":"2617:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2584:62:87"},"returnParameters":{"id":18087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18086,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18127,"src":"2679:6:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":18085,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2679:6:87","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2678:8:87"},"scope":18128,"src":"2559:482:87","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":18129,"src":"879:2164:87","usedErrors":[]}],"src":"31:3013:87"},"id":87},"contracts/samples/gnosis/EIP4337Manager.sol":{"ast":{"absolutePath":"contracts/samples/gnosis/EIP4337Manager.sol","exportedSymbols":{"ECDSA":[5828],"EIP4337Fallback":[18128],"EIP4337Manager":[18804],"Enum":[1998],"EtherPaymentFallback":[2020],"Exec":[20709],"Executor":[984],"FallbackManager":[1035],"GnosisSafe":[952],"GnosisSafeMath":[2286],"GnosisSafeStorage":[2180],"Guard":[1073],"GuardManager":[1113],"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"ISignatureValidator":[2517],"ISignatureValidatorConstants":[2504],"IStakeManager":[10966],"Math":[6705],"ModuleManager":[1480],"OwnerManager":[1991],"SecuredTokenTransfer":[2047],"SelfAuthorized":[2073],"SignatureDecoder":[2093],"Singleton":[2099],"StorageAccessible":[2148],"Strings":[5467],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":18805,"license":"GPL","nodeType":"SourceUnit","nodes":[{"id":18130,"literals":["solidity","^","0.8",".7"],"nodeType":"PragmaDirective","src":"31:23:88"},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":18131,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":5829,"src":"178:62:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol","file":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol","id":18132,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":953,"src":"241:60:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/base/Executor.sol","file":"@gnosis.pm/safe-contracts/contracts/base/Executor.sol","id":18133,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":985,"src":"302:63:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol","file":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol","id":18134,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":2181,"src":"366:86:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/gnosis/EIP4337Fallback.sol","file":"./EIP4337Fallback.sol","id":18135,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":18129,"src":"453:31:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../../interfaces/IAccount.sol","id":18136,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":10570,"src":"485:39:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../../interfaces/IEntryPoint.sol","id":18137,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":10808,"src":"525:42:88","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/utils/Exec.sol","file":"../../utils/Exec.sol","id":18138,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18805,"sourceUnit":20710,"src":"568:30:88","symbolAliases":[],"unitAlias":""},{"global":false,"id":18141,"libraryName":{"id":18139,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"610:5:88"},"nodeType":"UsingForDirective","src":"604:24:88","typeName":{"id":18140,"name":"bytes32","nodeType":"ElementaryTypeName","src":"620:7:88","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"abstract":false,"baseContracts":[{"baseName":{"id":18143,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"937:8:88"},"id":18144,"nodeType":"InheritanceSpecifier","src":"937:8:88"},{"baseName":{"id":18145,"name":"GnosisSafeStorage","nodeType":"IdentifierPath","referencedDeclaration":2180,"src":"947:17:88"},"id":18146,"nodeType":"InheritanceSpecifier","src":"947:17:88"},{"baseName":{"id":18147,"name":"Executor","nodeType":"IdentifierPath","referencedDeclaration":984,"src":"966:8:88"},"id":18148,"nodeType":"InheritanceSpecifier","src":"966:8:88"}],"canonicalName":"EIP4337Manager","contractDependencies":[18128],"contractKind":"contract","documentation":{"id":18142,"nodeType":"StructuredDocumentation","src":"630:279:88","text":" Main EIP4337 module.\n Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n so must implement validateUserOp\n holds an immutable reference to the EntryPoint\n Inherits GnosisSafe so that it can reference the memory storage"},"fullyImplemented":true,"id":18804,"linearizedBaseContracts":[18804,984,2180,10569],"name":"EIP4337Manager","nameLocation":"919:14:88","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"70b8a01d","id":18150,"mutability":"immutable","name":"eip4337Fallback","nameLocation":"1007:15:88","nodeType":"VariableDeclaration","scope":18804,"src":"982:40:88","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18149,"name":"address","nodeType":"ElementaryTypeName","src":"982:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"functionSelector":"b0d691fe","id":18152,"mutability":"immutable","name":"entryPoint","nameLocation":"1053:10:88","nodeType":"VariableDeclaration","scope":18804,"src":"1028:35:88","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18151,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":true,"id":18155,"mutability":"constant","name":"SIG_VALIDATION_FAILED","nameLocation":"1218:21:88","nodeType":"VariableDeclaration","scope":18804,"src":"1192:51:88","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18153,"name":"uint256","nodeType":"ElementaryTypeName","src":"1192:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":18154,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1242:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"internal"},{"constant":true,"id":18161,"mutability":"constant","name":"SENTINEL_MODULES","nameLocation":"1276:16:88","nodeType":"VariableDeclaration","scope":18804,"src":"1250:57:88","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18156,"name":"address","nodeType":"ElementaryTypeName","src":"1250:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307831","id":18159,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1303:3:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"0x1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":18158,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1295:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18157,"name":"address","nodeType":"ElementaryTypeName","src":"1295:7:88","typeDescriptions":{}}},"id":18160,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1295:12:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"body":{"id":18184,"nodeType":"Block","src":"1348:113:88","statements":[{"expression":{"id":18168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18166,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18152,"src":"1358:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18167,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18163,"src":"1371:12:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1358:25:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18169,"nodeType":"ExpressionStatement","src":"1358:25:88"},{"expression":{"id":18182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18170,"name":"eip4337Fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18150,"src":"1393:15:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"id":18178,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1447:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18177,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1439:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18176,"name":"address","nodeType":"ElementaryTypeName","src":"1439:7:88","typeDescriptions":{}}},"id":18179,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1439:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18175,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"1419:19:88","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_address_$returns$_t_contract$_EIP4337Fallback_$18128_$","typeString":"function (address) returns (contract EIP4337Fallback)"},"typeName":{"id":18174,"nodeType":"UserDefinedTypeName","pathNode":{"id":18173,"name":"EIP4337Fallback","nodeType":"IdentifierPath","referencedDeclaration":18128,"src":"1423:15:88"},"referencedDeclaration":18128,"src":"1423:15:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Fallback_$18128","typeString":"contract EIP4337Fallback"}}},"id":18180,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1419:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Fallback_$18128","typeString":"contract EIP4337Fallback"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Fallback_$18128","typeString":"contract EIP4337Fallback"}],"id":18172,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1411:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18171,"name":"address","nodeType":"ElementaryTypeName","src":"1411:7:88","typeDescriptions":{}}},"id":18181,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1411:43:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1393:61:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18183,"nodeType":"ExpressionStatement","src":"1393:61:88"}]},"id":18185,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18163,"mutability":"mutable","name":"anEntryPoint","nameLocation":"1334:12:88","nodeType":"VariableDeclaration","scope":18185,"src":"1326:20:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18162,"name":"address","nodeType":"ElementaryTypeName","src":"1326:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1325:22:88"},"returnParameters":{"id":18165,"nodeType":"ParameterList","parameters":[],"src":"1348:0:88"},"scope":18804,"src":"1314:147:88","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[10568],"body":{"id":18300,"nodeType":"Block","src":"1760:986:88","statements":[{"assignments":[18200],"declarations":[{"constant":false,"id":18200,"mutability":"mutable","name":"msgSender","nameLocation":"1778:9:88","nodeType":"VariableDeclaration","scope":18300,"src":"1770:17:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18199,"name":"address","nodeType":"ElementaryTypeName","src":"1770:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18215,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":18205,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1806:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"1806:8:88","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":18212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"1806:32:88","startExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":18207,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1815:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"1815:8:88","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":18209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1815:15:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"3230","id":18210,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1833:2:88","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"1815:20:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":18204,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1798:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":18203,"name":"bytes20","nodeType":"ElementaryTypeName","src":"1798:7:88","typeDescriptions":{}}},"id":18213,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1798:41:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":18202,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1790:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18201,"name":"address","nodeType":"ElementaryTypeName","src":"1790:7:88","typeDescriptions":{}}},"id":18214,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1790:50:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1770:70:88"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":18219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18217,"name":"msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18200,"src":"1858:9:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":18218,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18152,"src":"1871:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1858:23:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f742066726f6d20656e747279706f696e74","id":18220,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1883:30:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54","typeString":"literal_string \"account: not from entrypoint\""},"value":"account: not from entrypoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54","typeString":"literal_string \"account: not from entrypoint\""}],"id":18216,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1850:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18221,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1850:64:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18222,"nodeType":"ExpressionStatement","src":"1850:64:88"},{"assignments":[18225],"declarations":[{"constant":false,"id":18225,"mutability":"mutable","name":"pThis","nameLocation":"1936:5:88","nodeType":"VariableDeclaration","scope":18300,"src":"1925:16:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18224,"nodeType":"UserDefinedTypeName","pathNode":{"id":18223,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"1925:10:88"},"referencedDeclaration":952,"src":"1925:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"id":18235,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":18231,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1971:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18230,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1963:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18229,"name":"address","nodeType":"ElementaryTypeName","src":"1963:7:88","typeDescriptions":{}}},"id":18232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1963:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18228,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1955:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18227,"name":"address","nodeType":"ElementaryTypeName","src":"1955:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1955:22:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":18226,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"1944:10:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":18234,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1944:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"nodeType":"VariableDeclarationStatement","src":"1925:53:88"},{"assignments":[18237],"declarations":[{"constant":false,"id":18237,"mutability":"mutable","name":"hash","nameLocation":"1996:4:88","nodeType":"VariableDeclaration","scope":18300,"src":"1988:12:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18236,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1988:7:88","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":18241,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18238,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18191,"src":"2003:10:88","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"2003:33:88","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":18240,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2003:35:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1988:50:88"},{"assignments":[18243],"declarations":[{"constant":false,"id":18243,"mutability":"mutable","name":"recovered","nameLocation":"2056:9:88","nodeType":"VariableDeclaration","scope":18300,"src":"2048:17:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18242,"name":"address","nodeType":"ElementaryTypeName","src":"2048:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18249,"initialValue":{"arguments":[{"expression":{"id":18246,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18189,"src":"2081:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":18247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"2081:16:88","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":18244,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18237,"src":"2068:4:88","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"2068:12:88","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":18248,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2068:30:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2048:50:88"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18251,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2165,"src":"2116:9:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":18252,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2129:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2116:14:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206f6e6c79207468726573686f6c642031","id":18254,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2132:27:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_b44df24be4dfac874ac766207425ed2b9dc7d961eda9cfb93c26bd63c0485c9c","typeString":"literal_string \"account: only threshold 1\""},"value":"account: only threshold 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b44df24be4dfac874ac766207425ed2b9dc7d961eda9cfb93c26bd63c0485c9c","typeString":"literal_string \"account: only threshold 1\""}],"id":18250,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2108:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2108:52:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18256,"nodeType":"ExpressionStatement","src":"2108:52:88"},{"condition":{"id":18261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"2174:25:88","subExpression":{"arguments":[{"id":18259,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18243,"src":"2189:9:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18257,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18225,"src":"2175:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18258,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isOwner","nodeType":"MemberAccess","referencedDeclaration":1939,"src":"2175:13:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view external returns (bool)"}},"id":18260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2175:24:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18267,"nodeType":"IfStatement","src":"2170:94:88","trueBody":{"id":18266,"nodeType":"Block","src":"2201:63:88","statements":[{"expression":{"id":18264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18262,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18197,"src":"2215:14:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18263,"name":"SIG_VALIDATION_FAILED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18155,"src":"2232:21:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2215:38:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18265,"nodeType":"ExpressionStatement","src":"2215:38:88"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":18269,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18189,"src":"2352:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":18270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"2352:12:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"arguments":[{"id":18273,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2372:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":18272,"name":"uint64","nodeType":"ElementaryTypeName","src":"2372:6:88","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"}],"id":18271,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2367:4:88","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":18274,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2367:12:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint64","typeString":"type(uint64)"}},"id":18275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"2367:16:88","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"2352:31:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f6e73657175656e7469616c206e6f6e6365","id":18277,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2385:30:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_0e54a4de33edc81c6cfc176f50c1bc9c390da62f9cd1bb325696426e5a0ee8db","typeString":"literal_string \"account: nonsequential nonce\""},"value":"account: nonsequential nonce"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0e54a4de33edc81c6cfc176f50c1bc9c390da62f9cd1bb325696426e5a0ee8db","typeString":"literal_string \"account: nonsequential nonce\""}],"id":18268,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2344:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2344:72:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18279,"nodeType":"ExpressionStatement","src":"2344:72:88"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18280,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18193,"src":"2431:19:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":18281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2453:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2431:23:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18299,"nodeType":"IfStatement","src":"2427:313:88","trueBody":{"id":18298,"nodeType":"Block","src":"2456:284:88","statements":[{"assignments":[18284,null],"declarations":[{"constant":false,"id":18284,"mutability":"mutable","name":"success","nameLocation":"2562:7:88","nodeType":"VariableDeclaration","scope":18298,"src":"2557:12:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18283,"name":"bool","nodeType":"ElementaryTypeName","src":"2557:4:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":18294,"initialValue":{"arguments":[{"hexValue":"","id":18292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2627:2:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"arguments":[{"id":18287,"name":"msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18200,"src":"2582:9:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18286,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2574:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18285,"name":"address","nodeType":"ElementaryTypeName","src":"2574:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18288,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2574:18:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":18289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"2574:23:88","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":18291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":18290,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18193,"src":"2606:19:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2574:52:88","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":18293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2574:56:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"2556:74:88"},{"expression":{"components":[{"id":18295,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18284,"src":"2645:7:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":18296,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2644:9:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18297,"nodeType":"ExpressionStatement","src":"2644:9:88"}]}}]},"documentation":{"id":18186,"nodeType":"StructuredDocumentation","src":"1467:129:88","text":" delegate-called (using execFromModule) through the fallback, so \"real\" msg.sender is attached as last 20 bytes"},"functionSelector":"3a871cdd","id":18301,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"1610:14:88","nodeType":"FunctionDefinition","overrides":{"id":18195,"nodeType":"OverrideSpecifier","overrides":[],"src":"1718:8:88"},"parameters":{"id":18194,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18189,"mutability":"mutable","name":"userOp","nameLocation":"1648:6:88","nodeType":"VariableDeclaration","scope":18301,"src":"1625:29:88","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":18188,"nodeType":"UserDefinedTypeName","pathNode":{"id":18187,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1625:13:88"},"referencedDeclaration":10993,"src":"1625:13:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":18191,"mutability":"mutable","name":"userOpHash","nameLocation":"1664:10:88","nodeType":"VariableDeclaration","scope":18301,"src":"1656:18:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18190,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1656:7:88","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":18193,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"1684:19:88","nodeType":"VariableDeclaration","scope":18301,"src":"1676:27:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18192,"name":"uint256","nodeType":"ElementaryTypeName","src":"1676:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1624:80:88"},"returnParameters":{"id":18198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18197,"mutability":"mutable","name":"validationData","nameLocation":"1744:14:88","nodeType":"VariableDeclaration","scope":18301,"src":"1736:22:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18196,"name":"uint256","nodeType":"ElementaryTypeName","src":"1736:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1735:24:88"},"scope":18804,"src":"1601:1145:88","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18394,"nodeType":"Block","src":"3279:893:88","statements":[{"assignments":[18315],"declarations":[{"constant":false,"id":18315,"mutability":"mutable","name":"msgSender","nameLocation":"3297:9:88","nodeType":"VariableDeclaration","scope":18394,"src":"3289:17:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18314,"name":"address","nodeType":"ElementaryTypeName","src":"3289:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18330,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":18320,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3325:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"3325:8:88","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":18327,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"3325:32:88","startExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":18322,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3334:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","src":"3334:8:88","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":18324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3334:15:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"3230","id":18325,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3352:2:88","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"3334:20:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":18319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3317:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":18318,"name":"bytes20","nodeType":"ElementaryTypeName","src":"3317:7:88","typeDescriptions":{}}},"id":18328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3317:41:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":18317,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3309:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18316,"name":"address","nodeType":"ElementaryTypeName","src":"3309:7:88","typeDescriptions":{}}},"id":18329,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3309:50:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"3289:70:88"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":18334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18332,"name":"msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18315,"src":"3377:9:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":18333,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18152,"src":"3390:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3377:23:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f742066726f6d20656e747279706f696e74","id":18335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3402:30:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54","typeString":"literal_string \"account: not from entrypoint\""},"value":"account: not from entrypoint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54","typeString":"literal_string \"account: not from entrypoint\""}],"id":18331,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3369:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3369:64:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18337,"nodeType":"ExpressionStatement","src":"3369:64:88"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":18342,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":18339,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3451:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3451:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":18341,"name":"eip4337Fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18150,"src":"3465:15:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3451:29:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6163636f756e743a206e6f742066726f6d204549503433333746616c6c6261636b","id":18343,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3482:35:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_91b96fb4968977caac8675b885caebd1ec06646e0677fdd46fda8bfdd5d1631b","typeString":"literal_string \"account: not from EIP4337Fallback\""},"value":"account: not from EIP4337Fallback"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_91b96fb4968977caac8675b885caebd1ec06646e0677fdd46fda8bfdd5d1631b","typeString":"literal_string \"account: not from EIP4337Fallback\""}],"id":18338,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3443:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18344,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3443:75:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18345,"nodeType":"ExpressionStatement","src":"3443:75:88"},{"assignments":[18347],"declarations":[{"constant":false,"id":18347,"mutability":"mutable","name":"success","nameLocation":"3534:7:88","nodeType":"VariableDeclaration","scope":18394,"src":"3529:12:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18346,"name":"bool","nodeType":"ElementaryTypeName","src":"3529:4:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":18359,"initialValue":{"arguments":[{"id":18349,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18304,"src":"3565:2:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18350,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18306,"src":"3581:5:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":18351,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18308,"src":"3600:4:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":18352,"name":"operation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18311,"src":"3618:9:88","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},{"expression":{"arguments":[{"id":18355,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3646:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18354,"name":"uint256","nodeType":"ElementaryTypeName","src":"3646:7:88","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":18353,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3641:4:88","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":18356,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3641:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":18357,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"3641:17:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18348,"name":"execute","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":983,"src":"3544:7:88","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_enum$_Operation_$1997_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,enum Enum.Operation,uint256) returns (bool)"}},"id":18358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3544:124:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"3529:139:88"},{"assignments":[18361],"declarations":[{"constant":false,"id":18361,"mutability":"mutable","name":"returnData","nameLocation":"3692:10:88","nodeType":"VariableDeclaration","scope":18394,"src":"3679:23:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18360,"name":"bytes","nodeType":"ElementaryTypeName","src":"3679:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18370,"initialValue":{"arguments":[{"expression":{"arguments":[{"id":18366,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3729:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18365,"name":"uint256","nodeType":"ElementaryTypeName","src":"3729:7:88","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":18364,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3724:4:88","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":18367,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3724:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":18368,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"3724:17:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":18362,"name":"Exec","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20709,"src":"3705:4:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Exec_$20709_$","typeString":"type(library Exec)"}},"id":18363,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getReturnData","nodeType":"MemberAccess","referencedDeclaration":20671,"src":"3705:18:88","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":18369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3705:37:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"3679:63:88"},{"condition":{"id":18372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3952:8:88","subExpression":{"id":18371,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18347,"src":"3953:7:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18393,"nodeType":"IfStatement","src":"3948:218:88","trueBody":{"id":18392,"nodeType":"Block","src":"3962:204:88","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":18373,"name":"returnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18361,"src":"3980:10:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"3980:17:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3638","id":18375,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4000:2:88","typeDescriptions":{"typeIdentifier":"t_rational_68_by_1","typeString":"int_const 68"},"value":"68"},"src":"3980:22:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18380,"nodeType":"IfStatement","src":"3976:36:88","trueBody":{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":18377,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"4004:6:88","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$__$returns$__$","typeString":"function () pure"}},"id":18378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4004:8:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18379,"nodeType":"ExpressionStatement","src":"4004:8:88"}},{"AST":{"nodeType":"YulBlock","src":"4035:67:88","statements":[{"nodeType":"YulAssignment","src":"4053:35:88","value":{"arguments":[{"name":"returnData","nodeType":"YulIdentifier","src":"4071:10:88"},{"kind":"number","nodeType":"YulLiteral","src":"4083:4:88","type":"","value":"0x04"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4067:3:88"},"nodeType":"YulFunctionCall","src":"4067:21:88"},"variableNames":[{"name":"returnData","nodeType":"YulIdentifier","src":"4053:10:88"}]}]},"evmVersion":"london","externalReferences":[{"declaration":18361,"isOffset":false,"isSlot":false,"src":"4053:10:88","valueSize":1},{"declaration":18361,"isOffset":false,"isSlot":false,"src":"4071:10:88","valueSize":1}],"id":18381,"nodeType":"InlineAssembly","src":"4026:76:88"},{"expression":{"arguments":[{"arguments":[{"id":18385,"name":"returnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18361,"src":"4133:10:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":18387,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4146:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":18386,"name":"string","nodeType":"ElementaryTypeName","src":"4146:6:88","typeDescriptions":{}}}],"id":18388,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4145:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"}],"expression":{"id":18383,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4122:3:88","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18384,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"4122:10:88","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":18389,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4122:32:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":18382,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"4115:6:88","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":18390,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4115:40:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18391,"nodeType":"ExpressionStatement","src":"4115:40:88"}]}}]},"documentation":{"id":18302,"nodeType":"StructuredDocumentation","src":"2752:377:88","text":" Execute a call but also revert if the execution fails.\n The default behavior of the Safe is to not revert if the call fails,\n which is challenging for integrating with ERC4337 because then the\n EntryPoint wouldn't know to emit the UserOperationRevertReason event,\n which the frontend/client uses to capture the reason for the failure."},"functionSelector":"940d3c60","id":18395,"implemented":true,"kind":"function","modifiers":[],"name":"executeAndRevert","nameLocation":"3143:16:88","nodeType":"FunctionDefinition","parameters":{"id":18312,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18304,"mutability":"mutable","name":"to","nameLocation":"3177:2:88","nodeType":"VariableDeclaration","scope":18395,"src":"3169:10:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18303,"name":"address","nodeType":"ElementaryTypeName","src":"3169:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18306,"mutability":"mutable","name":"value","nameLocation":"3197:5:88","nodeType":"VariableDeclaration","scope":18395,"src":"3189:13:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18305,"name":"uint256","nodeType":"ElementaryTypeName","src":"3189:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":18308,"mutability":"mutable","name":"data","nameLocation":"3225:4:88","nodeType":"VariableDeclaration","scope":18395,"src":"3212:17:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18307,"name":"bytes","nodeType":"ElementaryTypeName","src":"3212:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18311,"mutability":"mutable","name":"operation","nameLocation":"3254:9:88","nodeType":"VariableDeclaration","scope":18395,"src":"3239:24:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"},"typeName":{"id":18310,"nodeType":"UserDefinedTypeName","pathNode":{"id":18309,"name":"Enum.Operation","nodeType":"IdentifierPath","referencedDeclaration":1997,"src":"3239:14:88"},"referencedDeclaration":1997,"src":"3239:14:88","typeDescriptions":{"typeIdentifier":"t_enum$_Operation_$1997","typeString":"enum Enum.Operation"}},"visibility":"internal"}],"src":"3159:110:88"},"returnParameters":{"id":18313,"nodeType":"ParameterList","parameters":[],"src":"3279:0:88"},"scope":18804,"src":"3134:1038:88","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18412,"nodeType":"Block","src":"4292:74:88","statements":[{"expression":{"arguments":[{"arguments":[{"id":18407,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4350:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18406,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4342:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18405,"name":"address","nodeType":"ElementaryTypeName","src":"4342:7:88","typeDescriptions":{}}},"id":18408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4342:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":18409,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4357:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"expression":{"arguments":[{"id":18402,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18152,"src":"4321:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18401,"name":"IEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10807,"src":"4309:11:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IEntryPoint_$10807_$","typeString":"type(contract IEntryPoint)"}},"id":18403,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4309:23:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":18404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":10819,"src":"4309:32:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint192_$returns$_t_uint256_$","typeString":"function (address,uint192) view external returns (uint256)"}},"id":18410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4309:50:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":18400,"id":18411,"nodeType":"Return","src":"4302:57:88"}]},"documentation":{"id":18396,"nodeType":"StructuredDocumentation","src":"4178:59:88","text":" Helper for wallet to get the next nonce."},"functionSelector":"d087d288","id":18413,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"4251:8:88","nodeType":"FunctionDefinition","parameters":{"id":18397,"nodeType":"ParameterList","parameters":[],"src":"4259:2:88"},"returnParameters":{"id":18400,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18399,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18413,"src":"4283:7:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18398,"name":"uint256","nodeType":"ElementaryTypeName","src":"4283:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4282:9:88"},"scope":18804,"src":"4242:124:88","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18471,"nodeType":"Block","src":"4810:402:88","statements":[{"assignments":[18422],"declarations":[{"constant":false,"id":18422,"mutability":"mutable","name":"safe","nameLocation":"4831:4:88","nodeType":"VariableDeclaration","scope":18471,"src":"4820:15:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18421,"nodeType":"UserDefinedTypeName","pathNode":{"id":18420,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"4820:10:88"},"referencedDeclaration":952,"src":"4820:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"id":18432,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":18428,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4865:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18427,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4857:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18426,"name":"address","nodeType":"ElementaryTypeName","src":"4857:7:88","typeDescriptions":{}}},"id":18429,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4857:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18425,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4849:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18424,"name":"address","nodeType":"ElementaryTypeName","src":"4849:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18430,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4849:22:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":18423,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"4838:10:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":18431,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4838:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"nodeType":"VariableDeclarationStatement","src":"4820:52:88"},{"expression":{"arguments":[{"id":18440,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4890:43:88","subExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18436,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18417,"src":"4912:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18437,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"4912:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4912:20:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18434,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18422,"src":"4891:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18435,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isModuleEnabled","nodeType":"MemberAccess","referencedDeclaration":1411,"src":"4891:20:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view external returns (bool)"}},"id":18439,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4891:42:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"7365747570343333374d6f64756c65733a20656e747279706f696e7420616c726561647920656e61626c6564","id":18441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4935:46:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_9e918bedd8a27b0077880ecc360c6b22f80afc50dd4db23be600079310866e84","typeString":"literal_string \"setup4337Modules: entrypoint already enabled\""},"value":"setup4337Modules: entrypoint already enabled"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9e918bedd8a27b0077880ecc360c6b22f80afc50dd4db23be600079310866e84","typeString":"literal_string \"setup4337Modules: entrypoint already enabled\""}],"id":18433,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4882:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4882:100:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18443,"nodeType":"ExpressionStatement","src":"4882:100:88"},{"expression":{"arguments":[{"id":18451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5000:48:88","subExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18447,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18417,"src":"5022:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337Fallback","nodeType":"MemberAccess","referencedDeclaration":18150,"src":"5022:23:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5022:25:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18445,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18422,"src":"5001:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isModuleEnabled","nodeType":"MemberAccess","referencedDeclaration":1411,"src":"5001:20:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view external returns (bool)"}},"id":18450,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5001:47:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"7365747570343333374d6f64756c65733a206569703433333746616c6c6261636b20616c726561647920656e61626c6564","id":18452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5050:51:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_2fccd7f70c7ccdbee9c4b3940928cb4427d124e03dfa4ce849a9137fa8925758","typeString":"literal_string \"setup4337Modules: eip4337Fallback already enabled\""},"value":"setup4337Modules: eip4337Fallback already enabled"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2fccd7f70c7ccdbee9c4b3940928cb4427d124e03dfa4ce849a9137fa8925758","typeString":"literal_string \"setup4337Modules: eip4337Fallback already enabled\""}],"id":18444,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4992:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18453,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4992:110:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18454,"nodeType":"ExpressionStatement","src":"4992:110:88"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18458,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18417,"src":"5130:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"5130:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5130:20:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18455,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18422,"src":"5112:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"enableModule","nodeType":"MemberAccess","referencedDeclaration":1249,"src":"5112:17:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":18461,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5112:39:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18462,"nodeType":"ExpressionStatement","src":"5112:39:88"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18466,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18417,"src":"5179:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18467,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337Fallback","nodeType":"MemberAccess","referencedDeclaration":18150,"src":"5179:23:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18468,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5179:25:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18463,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18422,"src":"5161:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"enableModule","nodeType":"MemberAccess","referencedDeclaration":1249,"src":"5161:17:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":18469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5161:44:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18470,"nodeType":"ExpressionStatement","src":"5161:44:88"}]},"documentation":{"id":18414,"nodeType":"StructuredDocumentation","src":"4372:330:88","text":" set up a safe as EIP-4337 enabled.\n called from the GnosisSafeAccountFactory during construction time\n - enable 3 modules (this module, fallback and the entrypoint)\n - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \"this\" is the safe itself"},"functionSelector":"d041593b","id":18472,"implemented":true,"kind":"function","modifiers":[],"name":"setup4337Modules","nameLocation":"4716:16:88","nodeType":"FunctionDefinition","parameters":{"id":18418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18417,"mutability":"mutable","name":"manager","nameLocation":"4757:7:88","nodeType":"VariableDeclaration","scope":18472,"src":"4742:22:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18416,"nodeType":"UserDefinedTypeName","pathNode":{"id":18415,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"4742:14:88"},"referencedDeclaration":18804,"src":"4742:14:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"internal"}],"src":"4732:68:88"},"returnParameters":{"id":18419,"nodeType":"ParameterList","parameters":[],"src":"4810:0:88"},"scope":18804,"src":"4707:505:88","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18558,"nodeType":"Block","src":"5720:615:88","statements":[{"assignments":[18486],"declarations":[{"constant":false,"id":18486,"mutability":"mutable","name":"pThis","nameLocation":"5741:5:88","nodeType":"VariableDeclaration","scope":18558,"src":"5730:16:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18485,"nodeType":"UserDefinedTypeName","pathNode":{"id":18484,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"5730:10:88"},"referencedDeclaration":952,"src":"5730:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"id":18496,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":18492,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5776:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18491,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5768:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18490,"name":"address","nodeType":"ElementaryTypeName","src":"5768:7:88","typeDescriptions":{}}},"id":18493,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5768:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18489,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5760:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18488,"name":"address","nodeType":"ElementaryTypeName","src":"5760:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5760:22:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":18487,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"5749:10:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":18495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5749:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"nodeType":"VariableDeclarationStatement","src":"5730:53:88"},{"assignments":[18498],"declarations":[{"constant":false,"id":18498,"mutability":"mutable","name":"oldFallback","nameLocation":"5801:11:88","nodeType":"VariableDeclaration","scope":18558,"src":"5793:19:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18497,"name":"address","nodeType":"ElementaryTypeName","src":"5793:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18502,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18499,"name":"oldManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18478,"src":"5815:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337Fallback","nodeType":"MemberAccess","referencedDeclaration":18150,"src":"5815:26:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5815:28:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5793:50:88"},{"expression":{"arguments":[{"arguments":[{"id":18506,"name":"oldFallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18498,"src":"5883:11:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18504,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"5861:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"isModuleEnabled","nodeType":"MemberAccess","referencedDeclaration":1411,"src":"5861:21:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view external returns (bool)"}},"id":18507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5861:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"7265706c616365454950343333374d616e616765723a206f6c644d616e61676572206973206e6f7420616374697665","id":18508,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5897:49:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_9a48bcdd69650fd0c339a97722c7855940395dd3c8b95007c34b0b8a17d9f179","typeString":"literal_string \"replaceEIP4337Manager: oldManager is not active\""},"value":"replaceEIP4337Manager: oldManager is not active"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9a48bcdd69650fd0c339a97722c7855940395dd3c8b95007c34b0b8a17d9f179","typeString":"literal_string \"replaceEIP4337Manager: oldManager is not active\""}],"id":18503,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5853:7:88","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":18509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5853:94:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18510,"nodeType":"ExpressionStatement","src":"5853:94:88"},{"expression":{"arguments":[{"id":18514,"name":"oldFallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18498,"src":"5977:11:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18515,"name":"oldManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18478,"src":"5990:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18516,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"5990:21:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5990:23:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18511,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"5957:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"disableModule","nodeType":"MemberAccess","referencedDeclaration":1304,"src":"5957:19:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) external"}},"id":18518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5957:57:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18519,"nodeType":"ExpressionStatement","src":"5957:57:88"},{"expression":{"arguments":[{"id":18523,"name":"prevModule","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18475,"src":"6044:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18524,"name":"oldFallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18498,"src":"6056:11:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18520,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"6024:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18522,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"disableModule","nodeType":"MemberAccess","referencedDeclaration":1304,"src":"6024:19:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) external"}},"id":18525,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6024:44:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18526,"nodeType":"ExpressionStatement","src":"6024:44:88"},{"assignments":[18528],"declarations":[{"constant":false,"id":18528,"mutability":"mutable","name":"eip4337fallback","nameLocation":"6087:15:88","nodeType":"VariableDeclaration","scope":18558,"src":"6079:23:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18527,"name":"address","nodeType":"ElementaryTypeName","src":"6079:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18532,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18529,"name":"newManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18481,"src":"6105:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337Fallback","nodeType":"MemberAccess","referencedDeclaration":18150,"src":"6105:26:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6105:28:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6079:54:88"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18536,"name":"newManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18481,"src":"6163:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"6163:21:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18538,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6163:23:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18533,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"6144:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18535,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"enableModule","nodeType":"MemberAccess","referencedDeclaration":1249,"src":"6144:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":18539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6144:43:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18540,"nodeType":"ExpressionStatement","src":"6144:43:88"},{"expression":{"arguments":[{"id":18544,"name":"eip4337fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18528,"src":"6216:15:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18541,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"6197:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"enableModule","nodeType":"MemberAccess","referencedDeclaration":1249,"src":"6197:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":18545,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6197:35:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18546,"nodeType":"ExpressionStatement","src":"6197:35:88"},{"expression":{"arguments":[{"id":18550,"name":"eip4337fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18528,"src":"6267:15:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18547,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"6242:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18549,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setFallbackHandler","nodeType":"MemberAccess","referencedDeclaration":1025,"src":"6242:24:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":18551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6242:41:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18552,"nodeType":"ExpressionStatement","src":"6242:41:88"},{"expression":{"arguments":[{"id":18554,"name":"pThis","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18486,"src":"6310:5:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},{"id":18555,"name":"newManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18481,"src":"6317:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18553,"name":"validateEip4337","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18723,"src":"6294:15:88","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_GnosisSafe_$952_$_t_contract$_EIP4337Manager_$18804_$returns$__$","typeString":"function (contract GnosisSafe,contract EIP4337Manager)"}},"id":18556,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6294:34:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18557,"nodeType":"ExpressionStatement","src":"6294:34:88"}]},"documentation":{"id":18473,"nodeType":"StructuredDocumentation","src":"5218:385:88","text":" replace EIP4337 module, to support a new EntryPoint.\n must be called using execTransaction and Enum.Operation.DelegateCall\n @param prevModule returned by getCurrentEIP4337Manager\n @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\n @param newManager the new EIP4337Manager, usually with a new EntryPoint"},"functionSelector":"efae6e06","id":18559,"implemented":true,"kind":"function","modifiers":[],"name":"replaceEIP4337Manager","nameLocation":"5617:21:88","nodeType":"FunctionDefinition","parameters":{"id":18482,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18475,"mutability":"mutable","name":"prevModule","nameLocation":"5647:10:88","nodeType":"VariableDeclaration","scope":18559,"src":"5639:18:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18474,"name":"address","nodeType":"ElementaryTypeName","src":"5639:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18478,"mutability":"mutable","name":"oldManager","nameLocation":"5674:10:88","nodeType":"VariableDeclaration","scope":18559,"src":"5659:25:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18477,"nodeType":"UserDefinedTypeName","pathNode":{"id":18476,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"5659:14:88"},"referencedDeclaration":18804,"src":"5659:14:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"internal"},{"constant":false,"id":18481,"mutability":"mutable","name":"newManager","nameLocation":"5701:10:88","nodeType":"VariableDeclaration","scope":18559,"src":"5686:25:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18480,"nodeType":"UserDefinedTypeName","pathNode":{"id":18479,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"5686:14:88"},"referencedDeclaration":18804,"src":"5686:14:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"internal"}],"src":"5638:74:88"},"returnParameters":{"id":18483,"nodeType":"ParameterList","parameters":[],"src":"5720:0:88"},"scope":18804,"src":"5608:727:88","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18722,"nodeType":"Block","src":"6642:1034:88","statements":[{"assignments":[18570],"declarations":[{"constant":false,"id":18570,"mutability":"mutable","name":"sig","nameLocation":"6805:3:88","nodeType":"VariableDeclaration","scope":18722,"src":"6792:16:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18569,"name":"bytes","nodeType":"ElementaryTypeName","src":"6792:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18575,"initialValue":{"arguments":[{"hexValue":"3635","id":18573,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6821:2:88","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"}],"id":18572,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"6811:9:88","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":18571,"name":"bytes","nodeType":"ElementaryTypeName","src":"6815:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":18574,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6811:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"6792:32:88"},{"expression":{"id":18586,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18576,"name":"sig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18570,"src":"6834:3:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18578,"indexExpression":{"hexValue":"3634","id":18577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6838:2:88","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6834:7:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"hexValue":"3237","id":18583,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6857:2:88","typeDescriptions":{"typeIdentifier":"t_rational_27_by_1","typeString":"int_const 27"},"value":"27"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_27_by_1","typeString":"int_const 27"}],"id":18582,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6851:5:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":18581,"name":"uint8","nodeType":"ElementaryTypeName","src":"6851:5:88","typeDescriptions":{}}},"id":18584,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6851:9:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":18580,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6844:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":18579,"name":"bytes1","nodeType":"ElementaryTypeName","src":"6844:6:88","typeDescriptions":{}}},"id":18585,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6844:17:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"6834:27:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":18587,"nodeType":"ExpressionStatement","src":"6834:27:88"},{"expression":{"id":18598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18588,"name":"sig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18570,"src":"6871:3:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18590,"indexExpression":{"hexValue":"32","id":18589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6875:1:88","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6871:6:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"hexValue":"31","id":18595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6893:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":18594,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6887:5:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":18593,"name":"uint8","nodeType":"ElementaryTypeName","src":"6887:5:88","typeDescriptions":{}}},"id":18596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6887:8:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":18592,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6880:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":18591,"name":"bytes1","nodeType":"ElementaryTypeName","src":"6880:6:88","typeDescriptions":{}}},"id":18597,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6880:16:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"6871:25:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":18599,"nodeType":"ExpressionStatement","src":"6871:25:88"},{"expression":{"id":18610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18600,"name":"sig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18570,"src":"6906:3:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18602,"indexExpression":{"hexValue":"3335","id":18601,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6910:2:88","typeDescriptions":{"typeIdentifier":"t_rational_35_by_1","typeString":"int_const 35"},"value":"35"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6906:7:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"hexValue":"31","id":18607,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6929:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":18606,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6923:5:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":18605,"name":"uint8","nodeType":"ElementaryTypeName","src":"6923:5:88","typeDescriptions":{}}},"id":18608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6923:8:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":18604,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6916:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":18603,"name":"bytes1","nodeType":"ElementaryTypeName","src":"6916:6:88","typeDescriptions":{}}},"id":18609,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6916:16:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"6906:26:88","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":18611,"nodeType":"ExpressionStatement","src":"6906:26:88"},{"assignments":[18613],"declarations":[{"constant":false,"id":18613,"mutability":"mutable","name":"nonce","nameLocation":"6950:5:88","nodeType":"VariableDeclaration","scope":18722,"src":"6942:13:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18612,"name":"uint256","nodeType":"ElementaryTypeName","src":"6942:7:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18629,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":18624,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18563,"src":"7017:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}],"id":18623,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7009:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18622,"name":"address","nodeType":"ElementaryTypeName","src":"7009:7:88","typeDescriptions":{}}},"id":18625,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7009:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":18626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7024:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18617,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18566,"src":"6978:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"6978:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6978:20:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18616,"name":"IEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10807,"src":"6966:11:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IEntryPoint_$10807_$","typeString":"type(contract IEntryPoint)"}},"id":18620,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6966:33:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":18621,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":10819,"src":"6966:42:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint192_$returns$_t_uint256_$","typeString":"function (address,uint192) view external returns (uint256)"}},"id":18627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6966:60:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18615,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6958:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18614,"name":"uint256","nodeType":"ElementaryTypeName","src":"6958:7:88","typeDescriptions":{}}},"id":18628,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6958:69:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6942:85:88"},{"assignments":[18632],"declarations":[{"constant":false,"id":18632,"mutability":"mutable","name":"userOp","nameLocation":"7058:6:88","nodeType":"VariableDeclaration","scope":18722,"src":"7037:27:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation"},"typeName":{"id":18631,"nodeType":"UserDefinedTypeName","pathNode":{"id":18630,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7037:13:88"},"referencedDeclaration":10993,"src":"7037:13:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"id":18649,"initialValue":{"arguments":[{"arguments":[{"id":18636,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18563,"src":"7089:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}],"id":18635,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7081:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18634,"name":"address","nodeType":"ElementaryTypeName","src":"7081:7:88","typeDescriptions":{}}},"id":18637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7081:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18638,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18613,"src":"7096:5:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"","id":18639,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7103:2:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"hexValue":"","id":18640,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7107:2:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"hexValue":"30","id":18641,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7111:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"31303030303030","id":18642,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7114:7:88","typeDescriptions":{"typeIdentifier":"t_rational_1000000_by_1","typeString":"int_const 1000000"},"value":"1000000"},{"hexValue":"30","id":18643,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7123:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":18644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7126:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":18645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7129:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"","id":18646,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7132:2:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"id":18647,"name":"sig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18570,"src":"7136:3:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_1000000_by_1","typeString":"int_const 1000000"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18633,"name":"UserOperation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10993,"src":"7067:13:88","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_UserOperation_$10993_storage_ptr_$","typeString":"type(struct UserOperation storage pointer)"}},"id":18648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7067:73:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"nodeType":"VariableDeclarationStatement","src":"7037:103:88"},{"assignments":[18654],"declarations":[{"constant":false,"id":18654,"mutability":"mutable","name":"userOps","nameLocation":"7173:7:88","nodeType":"VariableDeclaration","scope":18722,"src":"7150:30:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":18652,"nodeType":"UserDefinedTypeName","pathNode":{"id":18651,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7150:13:88"},"referencedDeclaration":10993,"src":"7150:13:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":18653,"nodeType":"ArrayTypeName","src":"7150:15:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"id":18661,"initialValue":{"arguments":[{"hexValue":"31","id":18659,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7203:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":18658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"7183:19:88","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct UserOperation memory[] memory)"},"typeName":{"baseType":{"id":18656,"nodeType":"UserDefinedTypeName","pathNode":{"id":18655,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"7187:13:88"},"referencedDeclaration":10993,"src":"7187:13:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":18657,"nodeType":"ArrayTypeName","src":"7187:15:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}}},"id":18660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7183:22:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"7150:55:88"},{"expression":{"id":18666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18662,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18654,"src":"7215:7:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":18664,"indexExpression":{"hexValue":"30","id":18663,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7223:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7215:10:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18665,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18632,"src":"7228:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"src":"7215:19:88","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_memory_ptr","typeString":"struct UserOperation memory"}},"id":18667,"nodeType":"ExpressionStatement","src":"7215:19:88"},{"assignments":[18670],"declarations":[{"constant":false,"id":18670,"mutability":"mutable","name":"_entryPoint","nameLocation":"7256:11:88","nodeType":"VariableDeclaration","scope":18722,"src":"7244:23:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":18669,"nodeType":"UserDefinedTypeName","pathNode":{"id":18668,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"7244:11:88"},"referencedDeclaration":10807,"src":"7244:11:88","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"id":18679,"initialValue":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18674,"name":"manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18566,"src":"7290:7:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"entryPoint","nodeType":"MemberAccess","referencedDeclaration":18152,"src":"7290:18:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7290:20:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18673,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7282:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18672,"name":"address","nodeType":"ElementaryTypeName","src":"7282:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7282:29:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":18671,"name":"IEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10807,"src":"7270:11:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IEntryPoint_$10807_$","typeString":"type(contract IEntryPoint)"}},"id":18678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7270:42:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"VariableDeclarationStatement","src":"7244:68:88"},{"clauses":[{"block":{"id":18693,"nodeType":"Block","src":"7378:71:88","statements":[{"expression":{"arguments":[{"hexValue":"76616c6964617465456970343333373a2068616e646c654f7073206d757374206661696c","id":18690,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7399:38:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_9ce825e2c2b7409720f4b2301bf91998b153ff3e973776f09a0c87172eabe0bf","typeString":"literal_string \"validateEip4337: handleOps must fail\""},"value":"validateEip4337: handleOps must fail"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_9ce825e2c2b7409720f4b2301bf91998b153ff3e973776f09a0c87172eabe0bf","typeString":"literal_string \"validateEip4337: handleOps must fail\""}],"id":18689,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"7392:6:88","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":18691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7392:46:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18692,"nodeType":"ExpressionStatement","src":"7392:46:88"}]},"errorName":"","id":18694,"nodeType":"TryCatchClause","src":"7378:71:88"},{"block":{"id":18719,"nodeType":"Block","src":"7477:193:88","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":18709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":18699,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18696,"src":"7505:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18698,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7495:9:88","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18700,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7495:16:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"4661696c65644f702875696e743235362c737472696e6729","id":18704,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7549:26:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_220266b6eadfd2488e398d00abc1c765e1f119da6226c1b55ec9cc0186560475","typeString":"literal_string \"FailedOp(uint256,string)\""},"value":"FailedOp(uint256,string)"},{"hexValue":"30","id":18705,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7577:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"41413234207369676e6174757265206572726f72","id":18706,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7580:22:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""},"value":"AA24 signature error"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_220266b6eadfd2488e398d00abc1c765e1f119da6226c1b55ec9cc0186560475","typeString":"literal_string \"FailedOp(uint256,string)\""},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e","typeString":"literal_string \"AA24 signature error\""}],"expression":{"id":18702,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7525:3:88","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18703,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"7525:23:88","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":18707,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7525:78:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18701,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"7515:9:88","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18708,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7515:89:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7495:109:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18718,"nodeType":"IfStatement","src":"7491:169:88","trueBody":{"id":18717,"nodeType":"Block","src":"7606:54:88","statements":[{"expression":{"arguments":[{"arguments":[{"id":18713,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18696,"src":"7638:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18712,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7631:6:88","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":18711,"name":"string","nodeType":"ElementaryTypeName","src":"7631:6:88","typeDescriptions":{}}},"id":18714,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7631:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":18710,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"7624:6:88","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":18715,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7624:21:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18716,"nodeType":"ExpressionStatement","src":"7624:21:88"}]}}]},"errorName":"","id":18720,"nodeType":"TryCatchClause","parameters":{"id":18697,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18696,"mutability":"mutable","name":"error","nameLocation":"7470:5:88","nodeType":"VariableDeclaration","scope":18720,"src":"7457:18:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18695,"name":"bytes","nodeType":"ElementaryTypeName","src":"7457:5:88","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7456:20:88"},"src":"7450:220:88"}],"externalCall":{"arguments":[{"id":18682,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18654,"src":"7348:7:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},{"arguments":[{"expression":{"id":18685,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7365:3:88","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18686,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"7365:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18684,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7357:8:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18683,"name":"address","nodeType":"ElementaryTypeName","src":"7357:8:88","stateMutability":"payable","typeDescriptions":{}}},"id":18687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7357:19:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"},{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"id":18680,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18670,"src":"7326:11:88","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":18681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"handleOps","nodeType":"MemberAccess","referencedDeclaration":10744,"src":"7326:21:88","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_$_t_address_payable_$returns$__$","typeString":"function (struct UserOperation memory[] memory,address payable) external"}},"id":18688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7326:51:88","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18721,"nodeType":"TryStatement","src":"7322:348:88"}]},"documentation":{"id":18560,"nodeType":"StructuredDocumentation","src":"6341:223:88","text":" Validate this gnosisSafe is callable through the EntryPoint.\n the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\n we don't test full transaction"},"functionSelector":"45b1e0ca","id":18723,"implemented":true,"kind":"function","modifiers":[],"name":"validateEip4337","nameLocation":"6578:15:88","nodeType":"FunctionDefinition","parameters":{"id":18567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18563,"mutability":"mutable","name":"safe","nameLocation":"6605:4:88","nodeType":"VariableDeclaration","scope":18723,"src":"6594:15:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18562,"nodeType":"UserDefinedTypeName","pathNode":{"id":18561,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"6594:10:88"},"referencedDeclaration":952,"src":"6594:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"},{"constant":false,"id":18566,"mutability":"mutable","name":"manager","nameLocation":"6626:7:88","nodeType":"VariableDeclaration","scope":18723,"src":"6611:22:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18565,"nodeType":"UserDefinedTypeName","pathNode":{"id":18564,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"6611:14:88"},"referencedDeclaration":18804,"src":"6611:14:88","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"internal"}],"src":"6593:41:88"},"returnParameters":{"id":18568,"nodeType":"ParameterList","parameters":[],"src":"6642:0:88"},"scope":18804,"src":"6569:1107:88","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18802,"nodeType":"Block","src":"8016:526:88","statements":[{"expression":{"id":18739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18734,"name":"prev","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18730,"src":"8026:4:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":18737,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18161,"src":"8041:16:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18736,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8033:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18735,"name":"address","nodeType":"ElementaryTypeName","src":"8033:7:88","typeDescriptions":{}}},"id":18738,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8033:25:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8026:32:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18740,"nodeType":"ExpressionStatement","src":"8026:32:88"},{"assignments":[18745,null],"declarations":[{"constant":false,"id":18745,"mutability":"mutable","name":"modules","nameLocation":"8086:7:88","nodeType":"VariableDeclaration","scope":18802,"src":"8069:24:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":18743,"name":"address","nodeType":"ElementaryTypeName","src":"8069:7:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18744,"nodeType":"ArrayTypeName","src":"8069:9:88","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},null],"id":18751,"initialValue":{"arguments":[{"id":18748,"name":"SENTINEL_MODULES","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18161,"src":"8123:16:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"313030","id":18749,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8141:3:88","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"value":"100"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}],"expression":{"id":18746,"name":"safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18727,"src":"8098:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"id":18747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getModulesPaginated","nodeType":"MemberAccess","referencedDeclaration":1479,"src":"8098:24:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$_t_address_$","typeString":"function (address,uint256) view external returns (address[] memory,address)"}},"id":18750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8098:47:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_array$_t_address_$dyn_memory_ptr_$_t_address_$","typeString":"tuple(address[] memory,address)"}},"nodeType":"VariableDeclarationStatement","src":"8068:77:88"},{"body":{"id":18790,"nodeType":"Block","src":"8197:298:88","statements":[{"assignments":[18764],"declarations":[{"constant":false,"id":18764,"mutability":"mutable","name":"module","nameLocation":"8219:6:88","nodeType":"VariableDeclaration","scope":18790,"src":"8211:14:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18763,"name":"address","nodeType":"ElementaryTypeName","src":"8211:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18768,"initialValue":{"baseExpression":{"id":18765,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18745,"src":"8228:7:88","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":18767,"indexExpression":{"id":18766,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18753,"src":"8236:1:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8228:10:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"8211:27:88"},{"clauses":[{"block":{"id":18781,"nodeType":"Block","src":"8324:56:88","statements":[{"expression":{"components":[{"id":18777,"name":"prev","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18730,"src":"8350:4:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18778,"name":"_manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18775,"src":"8356:8:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":18779,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8349:16:88","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_address_$","typeString":"tuple(address,address)"}},"functionReturnParameters":18733,"id":18780,"nodeType":"Return","src":"8342:23:88"}]},"errorName":"","id":18782,"nodeType":"TryCatchClause","parameters":{"id":18776,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18775,"mutability":"mutable","name":"_manager","nameLocation":"8314:8:88","nodeType":"VariableDeclaration","scope":18782,"src":"8306:16:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18774,"name":"address","nodeType":"ElementaryTypeName","src":"8306:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"8305:18:88"},"src":"8297:83:88"},{"block":{"id":18783,"nodeType":"Block","src":"8456:2:88","statements":[]},"errorName":"","id":18784,"nodeType":"TryCatchClause","src":"8450:8:88"}],"externalCall":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":18770,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18764,"src":"8272:6:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18769,"name":"EIP4337Fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18128,"src":"8256:15:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_EIP4337Fallback_$18128_$","typeString":"type(contract EIP4337Fallback)"}},"id":18771,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8256:23:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Fallback_$18128","typeString":"contract EIP4337Fallback"}},"id":18772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337manager","nodeType":"MemberAccess","referencedDeclaration":17960,"src":"8256:38:88","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18773,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8256:40:88","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18785,"nodeType":"TryStatement","src":"8252:206:88"},{"expression":{"id":18788,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18786,"name":"prev","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18730,"src":"8471:4:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18787,"name":"module","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18764,"src":"8478:6:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8471:13:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18789,"nodeType":"ExpressionStatement","src":"8471:13:88"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18756,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18753,"src":"8172:1:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":18757,"name":"modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18745,"src":"8176:7:88","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":18758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8176:14:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8172:18:88","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18791,"initializationExpression":{"assignments":[18753],"declarations":[{"constant":false,"id":18753,"mutability":"mutable","name":"i","nameLocation":"8165:1:88","nodeType":"VariableDeclaration","scope":18791,"src":"8160:6:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18752,"name":"uint","nodeType":"ElementaryTypeName","src":"8160:4:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18755,"initialValue":{"hexValue":"30","id":18754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8169:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8160:10:88"},"loopExpression":{"expression":{"id":18761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"8192:3:88","subExpression":{"id":18760,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18753,"src":"8192:1:88","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18762,"nodeType":"ExpressionStatement","src":"8192:3:88"},"nodeType":"ForStatement","src":"8155:340:88"},{"expression":{"components":[{"arguments":[{"hexValue":"30","id":18794,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8520:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":18793,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8512:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18792,"name":"address","nodeType":"ElementaryTypeName","src":"8512:7:88","typeDescriptions":{}}},"id":18795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8512:10:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":18798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8532:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":18797,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8524:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18796,"name":"address","nodeType":"ElementaryTypeName","src":"8524:7:88","typeDescriptions":{}}},"id":18799,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8524:10:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":18800,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"8511:24:88","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_address_$","typeString":"tuple(address,address)"}},"functionReturnParameters":18733,"id":18801,"nodeType":"Return","src":"8504:31:88"}]},"documentation":{"id":18724,"nodeType":"StructuredDocumentation","src":"7681:227:88","text":" enumerate modules, and find the currently active EIP4337 manager (and previous module)\n @return prev prev module, needed by replaceEIP4337Manager\n @return manager the current active EIP4337Manager"},"functionSelector":"039b1728","id":18803,"implemented":true,"kind":"function","modifiers":[],"name":"getCurrentEIP4337Manager","nameLocation":"7922:24:88","nodeType":"FunctionDefinition","parameters":{"id":18728,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18727,"mutability":"mutable","name":"safe","nameLocation":"7958:4:88","nodeType":"VariableDeclaration","scope":18803,"src":"7947:15:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"},"typeName":{"id":18726,"nodeType":"UserDefinedTypeName","pathNode":{"id":18725,"name":"GnosisSafe","nodeType":"IdentifierPath","referencedDeclaration":952,"src":"7947:10:88"},"referencedDeclaration":952,"src":"7947:10:88","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafe_$952","typeString":"contract GnosisSafe"}},"visibility":"internal"}],"src":"7946:17:88"},"returnParameters":{"id":18733,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18730,"mutability":"mutable","name":"prev","nameLocation":"7993:4:88","nodeType":"VariableDeclaration","scope":18803,"src":"7985:12:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18729,"name":"address","nodeType":"ElementaryTypeName","src":"7985:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18732,"mutability":"mutable","name":"manager","nameLocation":"8007:7:88","nodeType":"VariableDeclaration","scope":18803,"src":"7999:15:88","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18731,"name":"address","nodeType":"ElementaryTypeName","src":"7999:7:88","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7984:31:88"},"scope":18804,"src":"7913:629:88","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":18805,"src":"910:7634:88","usedErrors":[]}],"src":"31:8514:88"},"id":88},"contracts/samples/gnosis/GnosisAccountFactory.sol":{"ast":{"absolutePath":"contracts/samples/gnosis/GnosisAccountFactory.sol","exportedSymbols":{"Create2":[5232],"ECDSA":[5828],"EIP4337Fallback":[18128],"EIP4337Manager":[18804],"Enum":[1998],"EtherPaymentFallback":[2020],"Exec":[20709],"Executor":[984],"FallbackManager":[1035],"GnosisSafe":[952],"GnosisSafeAccountFactory":[19014],"GnosisSafeMath":[2286],"GnosisSafeProxy":[2557],"GnosisSafeProxyFactory":[2804],"GnosisSafeStorage":[2180],"Guard":[1073],"GuardManager":[1113],"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IProxy":[2526],"IProxyCreationCallback":[2820],"ISignatureValidator":[2517],"ISignatureValidatorConstants":[2504],"IStakeManager":[10966],"Math":[6705],"ModuleManager":[1480],"OwnerManager":[1991],"SecuredTokenTransfer":[2047],"SelfAuthorized":[2073],"SignatureDecoder":[2093],"Singleton":[2099],"StorageAccessible":[2148],"Strings":[5467],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":19015,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":18806,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:89"},{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","file":"@openzeppelin/contracts/utils/Create2.sol","id":18807,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19015,"sourceUnit":5233,"src":"62:51:89","symbolAliases":[],"unitAlias":""},{"absolutePath":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol","file":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol","id":18808,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19015,"sourceUnit":2805,"src":"114:80:89","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/gnosis/EIP4337Manager.sol","file":"./EIP4337Manager.sol","id":18809,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19015,"sourceUnit":18805,"src":"195:30:89","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"GnosisSafeAccountFactory","contractDependencies":[],"contractKind":"contract","documentation":{"id":18810,"nodeType":"StructuredDocumentation","src":"227:91:89","text":" A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract."},"fullyImplemented":true,"id":19014,"linearizedBaseContracts":[19014],"name":"GnosisSafeAccountFactory","nameLocation":"328:24:89","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"c10f1a75","id":18813,"mutability":"immutable","name":"proxyFactory","nameLocation":"400:12:89","nodeType":"VariableDeclaration","scope":19014,"src":"360:52:89","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"},"typeName":{"id":18812,"nodeType":"UserDefinedTypeName","pathNode":{"id":18811,"name":"GnosisSafeProxyFactory","nodeType":"IdentifierPath","referencedDeclaration":2804,"src":"360:22:89"},"referencedDeclaration":2804,"src":"360:22:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"visibility":"public"},{"constant":false,"functionSelector":"ac7d146b","id":18815,"mutability":"immutable","name":"safeSingleton","nameLocation":"443:13:89","nodeType":"VariableDeclaration","scope":19014,"src":"418:38:89","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18814,"name":"address","nodeType":"ElementaryTypeName","src":"418:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"functionSelector":"0e8ac488","id":18818,"mutability":"immutable","name":"eip4337Manager","nameLocation":"494:14:89","nodeType":"VariableDeclaration","scope":19014,"src":"462:46:89","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18817,"nodeType":"UserDefinedTypeName","pathNode":{"id":18816,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"462:14:89"},"referencedDeclaration":18804,"src":"462:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"public"},{"body":{"id":18841,"nodeType":"Block","src":"621:127:89","statements":[{"expression":{"id":18831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18829,"name":"proxyFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18813,"src":"631:12:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18830,"name":"_proxyFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18821,"src":"646:13:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"src":"631:28:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"id":18832,"nodeType":"ExpressionStatement","src":"631:28:89"},{"expression":{"id":18835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18833,"name":"safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18815,"src":"669:13:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18834,"name":"_safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18823,"src":"685:14:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"669:30:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18836,"nodeType":"ExpressionStatement","src":"669:30:89"},{"expression":{"id":18839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18837,"name":"eip4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18818,"src":"709:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18838,"name":"_eip4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18826,"src":"726:15:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"src":"709:32:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18840,"nodeType":"ExpressionStatement","src":"709:32:89"}]},"id":18842,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18827,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18821,"mutability":"mutable","name":"_proxyFactory","nameLocation":"550:13:89","nodeType":"VariableDeclaration","scope":18842,"src":"527:36:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"},"typeName":{"id":18820,"nodeType":"UserDefinedTypeName","pathNode":{"id":18819,"name":"GnosisSafeProxyFactory","nodeType":"IdentifierPath","referencedDeclaration":2804,"src":"527:22:89"},"referencedDeclaration":2804,"src":"527:22:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"visibility":"internal"},{"constant":false,"id":18823,"mutability":"mutable","name":"_safeSingleton","nameLocation":"573:14:89","nodeType":"VariableDeclaration","scope":18842,"src":"565:22:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18822,"name":"address","nodeType":"ElementaryTypeName","src":"565:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18826,"mutability":"mutable","name":"_eip4337Manager","nameLocation":"604:15:89","nodeType":"VariableDeclaration","scope":18842,"src":"589:30:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"},"typeName":{"id":18825,"nodeType":"UserDefinedTypeName","pathNode":{"id":18824,"name":"EIP4337Manager","nodeType":"IdentifierPath","referencedDeclaration":18804,"src":"589:14:89"},"referencedDeclaration":18804,"src":"589:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"visibility":"internal"}],"src":"526:94:89"},"returnParameters":{"id":18828,"nodeType":"ParameterList","parameters":[],"src":"621:0:89"},"scope":19014,"src":"515:233:89","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18883,"nodeType":"Block","src":"830:280:89","statements":[{"assignments":[18852],"declarations":[{"constant":false,"id":18852,"mutability":"mutable","name":"addr","nameLocation":"848:4:89","nodeType":"VariableDeclaration","scope":18883,"src":"840:12:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18851,"name":"address","nodeType":"ElementaryTypeName","src":"840:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18857,"initialValue":{"arguments":[{"id":18854,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18844,"src":"866:5:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18855,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18846,"src":"873:4:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18853,"name":"getAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19013,"src":"855:10:89","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_uint256_$returns$_t_address_$","typeString":"function (address,uint256) view returns (address)"}},"id":18856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"855:23:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"840:38:89"},{"assignments":[18859],"declarations":[{"constant":false,"id":18859,"mutability":"mutable","name":"codeSize","nameLocation":"893:8:89","nodeType":"VariableDeclaration","scope":18883,"src":"888:13:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18858,"name":"uint","nodeType":"ElementaryTypeName","src":"888:4:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18863,"initialValue":{"expression":{"expression":{"id":18860,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18852,"src":"904:4:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"904:9:89","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":18862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"904:16:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"888:32:89"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18866,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18864,"name":"codeSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18859,"src":"934:8:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":18865,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"945:1:89","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"934:12:89","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18870,"nodeType":"IfStatement","src":"930:54:89","trueBody":{"id":18869,"nodeType":"Block","src":"948:36:89","statements":[{"expression":{"id":18867,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18852,"src":"969:4:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":18850,"id":18868,"nodeType":"Return","src":"962:11:89"}]}},{"expression":{"arguments":[{"arguments":[{"id":18875,"name":"safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18815,"src":"1059:13:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":18877,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18844,"src":"1089:5:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18876,"name":"getInitializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18953,"src":"1074:14:89","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bytes_memory_ptr_$","typeString":"function (address) view returns (bytes memory)"}},"id":18878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1074:21:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":18879,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18846,"src":"1097:4:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":18873,"name":"proxyFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18813,"src":"1008:12:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"id":18874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"createProxyWithNonce","nodeType":"MemberAccess","referencedDeclaration":2714,"src":"1008:33:89","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_contract$_GnosisSafeProxy_$2557_$","typeString":"function (address,bytes memory,uint256) external returns (contract GnosisSafeProxy)"}},"id":18880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1008:94:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxy_$2557","typeString":"contract GnosisSafeProxy"}],"id":18872,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1000:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18871,"name":"address","nodeType":"ElementaryTypeName","src":"1000:7:89","typeDescriptions":{}}},"id":18881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1000:103:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":18850,"id":18882,"nodeType":"Return","src":"993:110:89"}]},"functionSelector":"5fbfb9cf","id":18884,"implemented":true,"kind":"function","modifiers":[],"name":"createAccount","nameLocation":"763:13:89","nodeType":"FunctionDefinition","parameters":{"id":18847,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18844,"mutability":"mutable","name":"owner","nameLocation":"785:5:89","nodeType":"VariableDeclaration","scope":18884,"src":"777:13:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18843,"name":"address","nodeType":"ElementaryTypeName","src":"777:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18846,"mutability":"mutable","name":"salt","nameLocation":"799:4:89","nodeType":"VariableDeclaration","scope":18884,"src":"791:12:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18845,"name":"uint256","nodeType":"ElementaryTypeName","src":"791:7:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"776:28:89"},"returnParameters":{"id":18850,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18849,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18884,"src":"821:7:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18848,"name":"address","nodeType":"ElementaryTypeName","src":"821:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"820:9:89"},"scope":19014,"src":"754:356:89","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18952,"nodeType":"Block","src":"1192:546:89","statements":[{"assignments":[18895],"declarations":[{"constant":false,"id":18895,"mutability":"mutable","name":"owners","nameLocation":"1219:6:89","nodeType":"VariableDeclaration","scope":18952,"src":"1202:23:89","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":18893,"name":"address","nodeType":"ElementaryTypeName","src":"1202:7:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18894,"nodeType":"ArrayTypeName","src":"1202:9:89","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"id":18901,"initialValue":{"arguments":[{"hexValue":"31","id":18899,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1242:1:89","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":18898,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1228:13:89","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (address[] memory)"},"typeName":{"baseType":{"id":18896,"name":"address","nodeType":"ElementaryTypeName","src":"1232:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18897,"nodeType":"ArrayTypeName","src":"1232:9:89","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}}},"id":18900,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1228:16:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"nodeType":"VariableDeclarationStatement","src":"1202:42:89"},{"expression":{"id":18906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18902,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18895,"src":"1254:6:89","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":18904,"indexExpression":{"hexValue":"30","id":18903,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1261:1:89","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1254:9:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18905,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18886,"src":"1266:5:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1254:17:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18907,"nodeType":"ExpressionStatement","src":"1254:17:89"},{"assignments":[18909],"declarations":[{"constant":false,"id":18909,"mutability":"mutable","name":"threshold","nameLocation":"1286:9:89","nodeType":"VariableDeclaration","scope":18952,"src":"1281:14:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18908,"name":"uint","nodeType":"ElementaryTypeName","src":"1281:4:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18911,"initialValue":{"hexValue":"31","id":18910,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1298:1:89","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"1281:18:89"},{"assignments":[18913],"declarations":[{"constant":false,"id":18913,"mutability":"mutable","name":"eip4337fallback","nameLocation":"1317:15:89","nodeType":"VariableDeclaration","scope":18952,"src":"1309:23:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18912,"name":"address","nodeType":"ElementaryTypeName","src":"1309:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":18917,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18914,"name":"eip4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18818,"src":"1335:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}},"id":18915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eip4337Fallback","nodeType":"MemberAccess","referencedDeclaration":18150,"src":"1335:30:89","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":18916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1335:32:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1309:58:89"},{"assignments":[18919],"declarations":[{"constant":false,"id":18919,"mutability":"mutable","name":"setup4337Modules","nameLocation":"1391:16:89","nodeType":"VariableDeclaration","scope":18952,"src":"1378:29:89","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18918,"name":"bytes","nodeType":"ElementaryTypeName","src":"1378:5:89","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18927,"initialValue":{"arguments":[{"expression":{"id":18922,"name":"EIP4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18804,"src":"1438:14:89","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_EIP4337Manager_$18804_$","typeString":"type(contract EIP4337Manager)"}},"id":18923,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"setup4337Modules","nodeType":"MemberAccess","referencedDeclaration":18472,"src":"1438:31:89","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_contract$_EIP4337Manager_$18804_$returns$__$","typeString":"function EIP4337Manager.setup4337Modules(contract EIP4337Manager)"}},{"components":[{"id":18924,"name":"eip4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18818,"src":"1472:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"id":18925,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1471:16:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_contract$_EIP4337Manager_$18804_$returns$__$","typeString":"function EIP4337Manager.setup4337Modules(contract EIP4337Manager)"},{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"expression":{"id":18920,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1410:3:89","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18921,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1410:14:89","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":18926,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1410:78:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1378:110:89"},{"expression":{"arguments":[{"expression":{"id":18930,"name":"GnosisSafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":952,"src":"1521:10:89","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GnosisSafe_$952_$","typeString":"type(contract GnosisSafe)"}},"id":18931,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"setup","nodeType":"MemberAccess","referencedDeclaration":167,"src":"1521:16:89","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_uint256_$_t_address_$_t_bytes_calldata_ptr_$_t_address_$_t_address_$_t_uint256_$_t_address_payable_$returns$__$","typeString":"function GnosisSafe.setup(address[] calldata,uint256,address,bytes calldata,address,address,uint256,address payable)"}},{"components":[{"id":18932,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18895,"src":"1553:6:89","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},{"id":18933,"name":"threshold","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18909,"src":"1561:9:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":18936,"name":"eip4337Manager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18818,"src":"1593:14:89","typeDescriptions":{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_EIP4337Manager_$18804","typeString":"contract EIP4337Manager"}],"id":18935,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1584:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18934,"name":"address","nodeType":"ElementaryTypeName","src":"1584:7:89","typeDescriptions":{}}},"id":18937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1584:24:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18938,"name":"setup4337Modules","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18919,"src":"1610:16:89","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":18939,"name":"eip4337fallback","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18913,"src":"1640:15:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":18942,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1677:1:89","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":18941,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1669:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":18940,"name":"address","nodeType":"ElementaryTypeName","src":"1669:7:89","typeDescriptions":{}}},"id":18943,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1669:10:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":18944,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1681:1:89","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"arguments":[{"hexValue":"30","id":18947,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1692:1:89","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":18946,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1684:8:89","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":18945,"name":"address","nodeType":"ElementaryTypeName","src":"1684:8:89","stateMutability":"payable","typeDescriptions":{}}},"id":18948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1684:10:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"id":18949,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1539:191:89","typeDescriptions":{"typeIdentifier":"t_tuple$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$_t_address_$_t_bytes_memory_ptr_$_t_address_$_t_address_$_t_rational_0_by_1_$_t_address_payable_$","typeString":"tuple(address[] memory,uint256,address,bytes memory,address,address,int_const 0,address payable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_uint256_$_t_address_$_t_bytes_calldata_ptr_$_t_address_$_t_address_$_t_uint256_$_t_address_payable_$returns$__$","typeString":"function GnosisSafe.setup(address[] calldata,uint256,address,bytes calldata,address,address,uint256,address payable)"},{"typeIdentifier":"t_tuple$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$_t_address_$_t_bytes_memory_ptr_$_t_address_$_t_address_$_t_rational_0_by_1_$_t_address_payable_$","typeString":"tuple(address[] memory,uint256,address,bytes memory,address,address,int_const 0,address payable)"}],"expression":{"id":18928,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1506:3:89","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18929,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1506:14:89","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":18950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1506:225:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":18890,"id":18951,"nodeType":"Return","src":"1499:232:89"}]},"id":18953,"implemented":true,"kind":"function","modifiers":[],"name":"getInitializer","nameLocation":"1125:14:89","nodeType":"FunctionDefinition","parameters":{"id":18887,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18886,"mutability":"mutable","name":"owner","nameLocation":"1148:5:89","nodeType":"VariableDeclaration","scope":18953,"src":"1140:13:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18885,"name":"address","nodeType":"ElementaryTypeName","src":"1140:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1139:15:89"},"returnParameters":{"id":18890,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18889,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18953,"src":"1178:12:89","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18888,"name":"bytes","nodeType":"ElementaryTypeName","src":"1178:5:89","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1177:14:89"},"scope":19014,"src":"1116:622:89","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":19012,"nodeType":"Block","src":"2036:420:89","statements":[{"assignments":[18964],"declarations":[{"constant":false,"id":18964,"mutability":"mutable","name":"initializer","nameLocation":"2059:11:89","nodeType":"VariableDeclaration","scope":19012,"src":"2046:24:89","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18963,"name":"bytes","nodeType":"ElementaryTypeName","src":"2046:5:89","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18968,"initialValue":{"arguments":[{"id":18966,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18956,"src":"2088:5:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18965,"name":"getInitializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18953,"src":"2073:14:89","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bytes_memory_ptr_$","typeString":"function (address) view returns (bytes memory)"}},"id":18967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2073:21:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2046:48:89"},{"assignments":[18970],"declarations":[{"constant":false,"id":18970,"mutability":"mutable","name":"salt2","nameLocation":"2155:5:89","nodeType":"VariableDeclaration","scope":19012,"src":"2147:13:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18969,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2147:7:89","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":18980,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":18975,"name":"initializer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18964,"src":"2200:11:89","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18974,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2190:9:89","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18976,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2190:22:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":18977,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18958,"src":"2214:4:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":18972,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2173:3:89","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18973,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"2173:16:89","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":18978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2173:46:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18971,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2163:9:89","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2163:57:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2147:73:89"},{"assignments":[18982],"declarations":[{"constant":false,"id":18982,"mutability":"mutable","name":"deploymentData","nameLocation":"2243:14:89","nodeType":"VariableDeclaration","scope":19012,"src":"2230:27:89","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18981,"name":"bytes","nodeType":"ElementaryTypeName","src":"2230:5:89","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":18996,"initialValue":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18985,"name":"proxyFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18813,"src":"2277:12:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}},"id":18986,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"proxyCreationCode","nodeType":"MemberAccess","referencedDeclaration":2624,"src":"2277:30:89","typeDescriptions":{"typeIdentifier":"t_function_external_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure external returns (bytes memory)"}},"id":18987,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2277:32:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":18992,"name":"safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18815,"src":"2327:13:89","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18991,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2319:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":18990,"name":"uint160","nodeType":"ElementaryTypeName","src":"2319:7:89","typeDescriptions":{}}},"id":18993,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2319:22:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":18989,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2311:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18988,"name":"uint256","nodeType":"ElementaryTypeName","src":"2311:7:89","typeDescriptions":{}}},"id":18994,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2311:31:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":18983,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2260:3:89","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18984,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"2260:16:89","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":18995,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2260:83:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2230:113:89"},{"expression":{"arguments":[{"arguments":[{"id":19001,"name":"salt2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18970,"src":"2391:5:89","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":19000,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2383:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":18999,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2383:7:89","typeDescriptions":{}}},"id":19002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2383:14:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":19004,"name":"deploymentData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18982,"src":"2409:14:89","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":19003,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2399:9:89","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19005,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2399:25:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":19008,"name":"proxyFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18813,"src":"2435:12:89","typeDescriptions":{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_GnosisSafeProxyFactory_$2804","typeString":"contract GnosisSafeProxyFactory"}],"id":19007,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2426:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19006,"name":"address","nodeType":"ElementaryTypeName","src":"2426:7:89","typeDescriptions":{}}},"id":19009,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2426:22:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":18997,"name":"Create2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5232,"src":"2360:7:89","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Create2_$5232_$","typeString":"type(library Create2)"}},"id":18998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"computeAddress","nodeType":"MemberAccess","referencedDeclaration":5231,"src":"2360:22:89","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_address_$returns$_t_address_$","typeString":"function (bytes32,bytes32,address) pure returns (address)"}},"id":19010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2360:89:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":18962,"id":19011,"nodeType":"Return","src":"2353:96:89"}]},"documentation":{"id":18954,"nodeType":"StructuredDocumentation","src":"1744:209:89","text":" calculate the counterfactual address of this account as it would be returned by createAccount()\n (uses the same \"create2 signature\" used by GnosisSafeProxyFactory.createProxyWithNonce)"},"functionSelector":"8cb84e18","id":19013,"implemented":true,"kind":"function","modifiers":[],"name":"getAddress","nameLocation":"1967:10:89","nodeType":"FunctionDefinition","parameters":{"id":18959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18956,"mutability":"mutable","name":"owner","nameLocation":"1986:5:89","nodeType":"VariableDeclaration","scope":19013,"src":"1978:13:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18955,"name":"address","nodeType":"ElementaryTypeName","src":"1978:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18958,"mutability":"mutable","name":"salt","nameLocation":"2000:4:89","nodeType":"VariableDeclaration","scope":19013,"src":"1992:12:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18957,"name":"uint256","nodeType":"ElementaryTypeName","src":"1992:7:89","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1977:28:89"},"returnParameters":{"id":18962,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18961,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19013,"src":"2027:7:89","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18960,"name":"address","nodeType":"ElementaryTypeName","src":"2027:7:89","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2026:9:89"},"scope":19014,"src":"1958:498:89","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":19015,"src":"319:2139:89","usedErrors":[]}],"src":"36:2423:89"},"id":89},"contracts/test/BrokenBlsAccount.sol":{"ast":{"absolutePath":"contracts/test/BrokenBlsAccount.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"BrokenBLSAccount":[19108],"BrokenBLSAccountFactory":[19239],"Create2":[5232],"ECDSA":[5828],"ERC1967Proxy":[2994],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBLSAccount":[16427],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"Proxy":[3364],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19240,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19016,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:90"},{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","file":"@openzeppelin/contracts/utils/Create2.sol","id":19017,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19240,"sourceUnit":5233,"src":"62:51:90","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","file":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","id":19018,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19240,"sourceUnit":2995,"src":"114:64:90","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../samples/SimpleAccount.sol","id":19019,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19240,"sourceUnit":14142,"src":"180:38:90","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/bls/IBLSAccount.sol","file":"../samples/bls/IBLSAccount.sol","id":19020,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19240,"sourceUnit":16428,"src":"219:40:90","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19022,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"517:13:90"},"id":19023,"nodeType":"InheritanceSpecifier","src":"517:13:90"},{"baseName":{"id":19024,"name":"IBLSAccount","nodeType":"IdentifierPath","referencedDeclaration":16427,"src":"532:11:90"},"id":19025,"nodeType":"InheritanceSpecifier","src":"532:11:90"}],"canonicalName":"BrokenBLSAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":19021,"nodeType":"StructuredDocumentation","src":"261:226:90","text":" for testing: a BLS account that fails to return its public-key (completely ignores its publickey)\n this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with."},"fullyImplemented":true,"id":19108,"linearizedBaseContracts":[19108,16427,14141,3543,3659,3312,2957,17937,3754,5840,4779,4799,7308,10569],"name":"BrokenBLSAccount","nameLocation":"497:16:90","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"245a7bfc","id":19027,"mutability":"immutable","name":"aggregator","nameLocation":"575:10:90","nodeType":"VariableDeclaration","scope":19108,"src":"550:35:90","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19026,"name":"address","nodeType":"ElementaryTypeName","src":"550:7:90","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"body":{"id":19042,"nodeType":"Block","src":"859:42:90","statements":[{"expression":{"id":19040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19038,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19027,"src":"869:10:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19039,"name":"anAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19032,"src":"882:12:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"869:25:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19041,"nodeType":"ExpressionStatement","src":"869:25:90"}]},"id":19043,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19035,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19030,"src":"844:12:90","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":19036,"kind":"baseConstructorSpecifier","modifierName":{"id":19034,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"830:13:90"},"nodeType":"ModifierInvocation","src":"830:27:90"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19033,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19030,"mutability":"mutable","name":"anEntryPoint","nameLocation":"794:12:90","nodeType":"VariableDeclaration","scope":19043,"src":"782:24:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19029,"nodeType":"UserDefinedTypeName","pathNode":{"id":19028,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"782:11:90"},"referencedDeclaration":10807,"src":"782:11:90","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":19032,"mutability":"mutable","name":"anAggregator","nameLocation":"816:12:90","nodeType":"VariableDeclaration","scope":19043,"src":"808:20:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19031,"name":"address","nodeType":"ElementaryTypeName","src":"808:7:90","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"781:48:90"},"returnParameters":{"id":19037,"nodeType":"ParameterList","parameters":[],"src":"859:0:90"},"scope":19108,"src":"770:131:90","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19064,"nodeType":"Block","src":"984:68:90","statements":[{"expression":{"components":[{"id":19052,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19047,"src":"995:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"id":19053,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"994:12:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":19054,"nodeType":"ExpressionStatement","src":"994:12:90"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":19060,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1042:1:90","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19059,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1034:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19058,"name":"address","nodeType":"ElementaryTypeName","src":"1034:7:90","typeDescriptions":{}}},"id":19061,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1034:10:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19055,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"1016:5:90","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_BrokenBLSAccount_$19108_$","typeString":"type(contract super BrokenBLSAccount)"}},"id":19057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_initialize","nodeType":"MemberAccess","referencedDeclaration":13998,"src":"1016:17:90","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1016:29:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19063,"nodeType":"ExpressionStatement","src":"1016:29:90"}]},"functionSelector":"ee472f36","id":19065,"implemented":true,"kind":"function","modifiers":[{"id":19050,"kind":"modifierInvocation","modifierName":{"id":19049,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":3445,"src":"972:11:90"},"nodeType":"ModifierInvocation","src":"972:11:90"}],"name":"initialize","nameLocation":"916:10:90","nodeType":"FunctionDefinition","parameters":{"id":19048,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19047,"mutability":"mutable","name":"aPublicKey","nameLocation":"945:10:90","nodeType":"VariableDeclaration","scope":19065,"src":"927:28:90","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":19044,"name":"uint256","nodeType":"ElementaryTypeName","src":"927:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19046,"length":{"hexValue":"34","id":19045,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"935:1:90","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"927:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"926:30:90"},"returnParameters":{"id":19051,"nodeType":"ParameterList","parameters":[],"src":"984:0:90"},"scope":19108,"src":"907:145:90","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[14050],"body":{"id":19088,"nodeType":"Block","src":"1197:107:90","statements":[{"expression":{"components":[{"id":19076,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19068,"src":"1209:6:90","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":19077,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19070,"src":"1217:10:90","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":19078,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1208:20:90","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$","typeString":"tuple(struct UserOperation calldata,bytes32)"}},"id":19079,"nodeType":"ExpressionStatement","src":"1208:20:90"},{"expression":{"arguments":[{"arguments":[{"id":19082,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19027,"src":"1280:10:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":19083,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1292:1:90","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":19084,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1294:1:90","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19081,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9761,"src":"1265:14:90","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$9761_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":19085,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1265:31:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}],"id":19080,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9942,"src":"1245:19:90","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_ValidationData_$9761_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct ValidationData memory) pure returns (uint256)"}},"id":19086,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1245:52:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19075,"id":19087,"nodeType":"Return","src":"1238:59:90"}]},"id":19089,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"1067:18:90","nodeType":"FunctionDefinition","overrides":{"id":19072,"nodeType":"OverrideSpecifier","overrides":[],"src":"1150:8:90"},"parameters":{"id":19071,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19068,"mutability":"mutable","name":"userOp","nameLocation":"1109:6:90","nodeType":"VariableDeclaration","scope":19089,"src":"1086:29:90","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19067,"nodeType":"UserDefinedTypeName","pathNode":{"id":19066,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1086:13:90"},"referencedDeclaration":10993,"src":"1086:13:90","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19070,"mutability":"mutable","name":"userOpHash","nameLocation":"1125:10:90","nodeType":"VariableDeclaration","scope":19089,"src":"1117:18:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19069,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1117:7:90","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1085:51:90"},"returnParameters":{"id":19075,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19074,"mutability":"mutable","name":"validationData","nameLocation":"1181:14:90","nodeType":"VariableDeclaration","scope":19089,"src":"1173:22:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19073,"name":"uint256","nodeType":"ElementaryTypeName","src":"1173:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1172:24:90"},"scope":19108,"src":"1058:246:90","stateMutability":"view","virtual":false,"visibility":"internal"},{"baseFunctions":[16426],"body":{"id":19106,"nodeType":"Block","src":"1388:64:90","statements":[{"assignments":[19102],"declarations":[{"constant":false,"id":19102,"mutability":"mutable","name":"pubkey","nameLocation":"1416:6:90","nodeType":"VariableDeclaration","scope":19106,"src":"1398:24:90","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":19100,"name":"uint256","nodeType":"ElementaryTypeName","src":"1398:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19101,"length":{"hexValue":"34","id":19099,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1406:1:90","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1398:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":19103,"nodeType":"VariableDeclarationStatement","src":"1398:24:90"},{"expression":{"id":19104,"name":"pubkey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19102,"src":"1439:6:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"functionReturnParameters":19096,"id":19105,"nodeType":"Return","src":"1432:13:90"}]},"functionSelector":"e02afbae","id":19107,"implemented":true,"kind":"function","modifiers":[],"name":"getBlsPublicKey","nameLocation":"1319:15:90","nodeType":"FunctionDefinition","overrides":{"id":19091,"nodeType":"OverrideSpecifier","overrides":[],"src":"1346:8:90"},"parameters":{"id":19090,"nodeType":"ParameterList","parameters":[],"src":"1334:2:90"},"returnParameters":{"id":19096,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19095,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19107,"src":"1369:17:90","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":19092,"name":"uint256","nodeType":"ElementaryTypeName","src":"1369:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19094,"length":{"hexValue":"34","id":19093,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1377:1:90","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"1369:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"1368:19:90"},"scope":19108,"src":"1310:142:90","stateMutability":"pure","virtual":false,"visibility":"external"}],"scope":19240,"src":"488:966:90","usedErrors":[]},{"abstract":false,"baseContracts":[],"canonicalName":"BrokenBLSAccountFactory","contractDependencies":[2994,19108],"contractKind":"contract","documentation":{"id":19109,"nodeType":"StructuredDocumentation","src":"1457:172:90","text":" Based n SimpleAccountFactory\n can't be a subclass, since both constructor and createAccount depend on the\n actual wallet contract constructor and initializer"},"fullyImplemented":true,"id":19239,"linearizedBaseContracts":[19239],"name":"BrokenBLSAccountFactory","nameLocation":"1639:23:90","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"11464fbe","id":19112,"mutability":"immutable","name":"accountImplementation","nameLocation":"1703:21:90","nodeType":"VariableDeclaration","scope":19239,"src":"1669:55:90","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"},"typeName":{"id":19111,"nodeType":"UserDefinedTypeName","pathNode":{"id":19110,"name":"BrokenBLSAccount","nodeType":"IdentifierPath","referencedDeclaration":19108,"src":"1669:16:90"},"referencedDeclaration":19108,"src":"1669:16:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"visibility":"public"},{"body":{"id":19129,"nodeType":"Block","src":"1786:85:90","statements":[{"expression":{"id":19127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19120,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19112,"src":"1796:21:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":19124,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19115,"src":"1841:10:90","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":19125,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19117,"src":"1853:10:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},{"typeIdentifier":"t_address","typeString":"address"}],"id":19123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"1820:20:90","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_contract$_IEntryPoint_$10807_$_t_address_$returns$_t_contract$_BrokenBLSAccount_$19108_$","typeString":"function (contract IEntryPoint,address) returns (contract BrokenBLSAccount)"},"typeName":{"id":19122,"nodeType":"UserDefinedTypeName","pathNode":{"id":19121,"name":"BrokenBLSAccount","nodeType":"IdentifierPath","referencedDeclaration":19108,"src":"1824:16:90"},"referencedDeclaration":19108,"src":"1824:16:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}}},"id":19126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1820:44:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"src":"1796:68:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"id":19128,"nodeType":"ExpressionStatement","src":"1796:68:90"}]},"id":19130,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19115,"mutability":"mutable","name":"entryPoint","nameLocation":"1755:10:90","nodeType":"VariableDeclaration","scope":19130,"src":"1743:22:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19114,"nodeType":"UserDefinedTypeName","pathNode":{"id":19113,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1743:11:90"},"referencedDeclaration":10807,"src":"1743:11:90","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":19117,"mutability":"mutable","name":"aggregator","nameLocation":"1775:10:90","nodeType":"VariableDeclaration","scope":19130,"src":"1767:18:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19116,"name":"address","nodeType":"ElementaryTypeName","src":"1767:7:90","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1742:44:90"},"returnParameters":{"id":19119,"nodeType":"ParameterList","parameters":[],"src":"1786:0:90"},"scope":19239,"src":"1731:140:90","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19193,"nodeType":"Block","src":"2449:410:90","statements":[{"assignments":[19144],"declarations":[{"constant":false,"id":19144,"mutability":"mutable","name":"addr","nameLocation":"2468:4:90","nodeType":"VariableDeclaration","scope":19193,"src":"2460:12:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19143,"name":"address","nodeType":"ElementaryTypeName","src":"2460:7:90","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19149,"initialValue":{"arguments":[{"id":19146,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19133,"src":"2486:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":19147,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19137,"src":"2492:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"id":19145,"name":"getAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19238,"src":"2475:10:90","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_array$_t_uint256_$4_memory_ptr_$returns$_t_address_$","typeString":"function (uint256,uint256[4] memory) view returns (address)"}},"id":19148,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2475:28:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2460:43:90"},{"assignments":[19151],"declarations":[{"constant":false,"id":19151,"mutability":"mutable","name":"codeSize","nameLocation":"2518:8:90","nodeType":"VariableDeclaration","scope":19193,"src":"2513:13:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19150,"name":"uint","nodeType":"ElementaryTypeName","src":"2513:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19155,"initialValue":{"expression":{"expression":{"id":19152,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19144,"src":"2529:4:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"2529:9:90","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":19154,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2529:16:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2513:32:90"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19158,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19156,"name":"codeSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19151,"src":"2559:8:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":19157,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2570:1:90","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2559:12:90","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19167,"nodeType":"IfStatement","src":"2555:81:90","trueBody":{"id":19166,"nodeType":"Block","src":"2573:63:90","statements":[{"expression":{"arguments":[{"arguments":[{"id":19162,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19144,"src":"2619:4:90","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19161,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2611:8:90","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":19160,"name":"address","nodeType":"ElementaryTypeName","src":"2611:8:90","stateMutability":"payable","typeDescriptions":{}}},"id":19163,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2611:13:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":19159,"name":"BrokenBLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19108,"src":"2594:16:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BrokenBLSAccount_$19108_$","typeString":"type(contract BrokenBLSAccount)"}},"id":19164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2594:31:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"functionReturnParameters":19142,"id":19165,"nodeType":"Return","src":"2587:38:90"}]}},{"expression":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"id":19181,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19112,"src":"2741:21:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}],"id":19180,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2733:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19179,"name":"address","nodeType":"ElementaryTypeName","src":"2733:7:90","typeDescriptions":{}}},"id":19182,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2733:30:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":19185,"name":"BrokenBLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19108,"src":"2796:16:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BrokenBLSAccount_$19108_$","typeString":"type(contract BrokenBLSAccount)"}},"id":19186,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":19065,"src":"2796:27:90","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BrokenBLSAccount.initialize(uint256[4] memory)"}},{"id":19187,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19137,"src":"2825:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BrokenBLSAccount.initialize(uint256[4] memory)"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"expression":{"id":19183,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2781:3:90","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19184,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"2781:14:90","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2781:55:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":19173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"2677:16:90","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"},"typeName":{"id":19172,"nodeType":"UserDefinedTypeName","pathNode":{"id":19171,"name":"ERC1967Proxy","nodeType":"IdentifierPath","referencedDeclaration":2994,"src":"2681:12:90"},"referencedDeclaration":2994,"src":"2681:12:90","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}},"id":19178,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"id":19176,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19133,"src":"2709:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19175,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2701:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19174,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2701:7:90","typeDescriptions":{}}},"id":19177,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2701:13:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"2677:38:90","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$salt","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"}},"id":19189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2677:173:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}],"id":19170,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2669:8:90","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":19169,"name":"address","nodeType":"ElementaryTypeName","src":"2669:8:90","stateMutability":"payable","typeDescriptions":{}}},"id":19190,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2669:182:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":19168,"name":"BrokenBLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19108,"src":"2652:16:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BrokenBLSAccount_$19108_$","typeString":"type(contract BrokenBLSAccount)"}},"id":19191,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2652:200:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"functionReturnParameters":19142,"id":19192,"nodeType":"Return","src":"2645:207:90"}]},"documentation":{"id":19131,"nodeType":"StructuredDocumentation","src":"1877:469:90","text":" create an account, and return its address.\n returns the address even if the account is already deployed.\n Note that during UserOperation execution, this method is called only if the account is not deployed.\n This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n Also note that out BLSSignatureAggregator requires that the public-key is the last parameter"},"functionSelector":"19c2a1b2","id":19194,"implemented":true,"kind":"function","modifiers":[],"name":"createAccount","nameLocation":"2360:13:90","nodeType":"FunctionDefinition","parameters":{"id":19138,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19133,"mutability":"mutable","name":"salt","nameLocation":"2379:4:90","nodeType":"VariableDeclaration","scope":19194,"src":"2374:9:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19132,"name":"uint","nodeType":"ElementaryTypeName","src":"2374:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19137,"mutability":"mutable","name":"aPublicKey","nameLocation":"2403:10:90","nodeType":"VariableDeclaration","scope":19194,"src":"2385:28:90","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":19134,"name":"uint256","nodeType":"ElementaryTypeName","src":"2385:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19136,"length":{"hexValue":"34","id":19135,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2393:1:90","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"2385:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"2373:41:90"},"returnParameters":{"id":19142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19141,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19194,"src":"2431:16:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"},"typeName":{"id":19140,"nodeType":"UserDefinedTypeName","pathNode":{"id":19139,"name":"BrokenBLSAccount","nodeType":"IdentifierPath","referencedDeclaration":19108,"src":"2431:16:90"},"referencedDeclaration":19108,"src":"2431:16:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}},"visibility":"internal"}],"src":"2430:18:90"},"scope":19239,"src":"2351:508:90","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19237,"nodeType":"Block","src":"3075:330:90","statements":[{"expression":{"arguments":[{"arguments":[{"id":19210,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19197,"src":"3123:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19209,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3115:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19208,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3115:7:90","typeDescriptions":{}}},"id":19211,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3115:13:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"expression":{"arguments":[{"id":19216,"name":"ERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2994,"src":"3179:12:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}],"id":19215,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3174:4:90","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":19217,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3174:18:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC1967Proxy_$2994","typeString":"type(contract ERC1967Proxy)"}},"id":19218,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"3174:31:90","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":19223,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19112,"src":"3263:21:90","typeDescriptions":{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_BrokenBLSAccount_$19108","typeString":"contract BrokenBLSAccount"}],"id":19222,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3255:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19221,"name":"address","nodeType":"ElementaryTypeName","src":"3255:7:90","typeDescriptions":{}}},"id":19224,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3255:30:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":19227,"name":"BrokenBLSAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19108,"src":"3322:16:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BrokenBLSAccount_$19108_$","typeString":"type(contract BrokenBLSAccount)"}},"id":19228,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":19065,"src":"3322:27:90","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BrokenBLSAccount.initialize(uint256[4] memory)"}},{"components":[{"id":19229,"name":"aPublicKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19201,"src":"3352:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"id":19230,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3351:12:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_array$_t_uint256_$4_memory_ptr_$returns$__$","typeString":"function BrokenBLSAccount.initialize(uint256[4] memory)"},{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}],"expression":{"id":19225,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3307:3:90","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19226,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"3307:14:90","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19231,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3307:57:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":19219,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3223:3:90","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19220,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"3223:10:90","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3223:159:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":19213,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3140:3:90","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19214,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"3140:16:90","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3140:256:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":19212,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3130:9:90","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19234,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3130:267:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":19206,"name":"Create2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5232,"src":"3092:7:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Create2_$5232_$","typeString":"type(library Create2)"}},"id":19207,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"computeAddress","nodeType":"MemberAccess","referencedDeclaration":5217,"src":"3092:22:90","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,bytes32) view returns (address)"}},"id":19235,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3092:306:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19205,"id":19236,"nodeType":"Return","src":"3085:313:90"}]},"documentation":{"id":19195,"nodeType":"StructuredDocumentation","src":"2865:114:90","text":" calculate the counterfactual address of this account as it would be returned by createAccount()"},"functionSelector":"de3398dd","id":19238,"implemented":true,"kind":"function","modifiers":[],"name":"getAddress","nameLocation":"2993:10:90","nodeType":"FunctionDefinition","parameters":{"id":19202,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19197,"mutability":"mutable","name":"salt","nameLocation":"3009:4:90","nodeType":"VariableDeclaration","scope":19238,"src":"3004:9:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19196,"name":"uint","nodeType":"ElementaryTypeName","src":"3004:4:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19201,"mutability":"mutable","name":"aPublicKey","nameLocation":"3033:10:90","nodeType":"VariableDeclaration","scope":19238,"src":"3015:28:90","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":19198,"name":"uint256","nodeType":"ElementaryTypeName","src":"3015:7:90","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19200,"length":{"hexValue":"34","id":19199,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3023:1:90","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"3015:10:90","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"src":"3003:41:90"},"returnParameters":{"id":19205,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19204,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19238,"src":"3066:7:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19203,"name":"address","nodeType":"ElementaryTypeName","src":"3066:7:90","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3065:9:90"},"scope":19239,"src":"2984:421:90","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":19240,"src":"1630:1777:90","usedErrors":[]}],"src":"36:3372:90"},"id":90},"contracts/test/MaliciousAccount.sol":{"ast":{"absolutePath":"contracts/test/MaliciousAccount.sol","exportedSymbols":{"EntryPoint":[9752],"Exec":[20709],"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"MaliciousAccount":[19329],"NonceManager":[10080],"ReentrancyGuard":[3713],"SenderCreator":[10127],"StakeManager":[10552],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19330,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19241,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:91"},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":19242,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19330,"sourceUnit":10570,"src":"61:36:91","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":19243,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19330,"sourceUnit":10808,"src":"98:39:91","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/core/EntryPoint.sol","file":"../core/EntryPoint.sol","id":19244,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19330,"sourceUnit":9753,"src":"138:32:91","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19245,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"201:8:91"},"id":19246,"nodeType":"InheritanceSpecifier","src":"201:8:91"}],"canonicalName":"MaliciousAccount","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":19329,"linearizedBaseContracts":[19329,10569],"name":"MaliciousAccount","nameLocation":"181:16:91","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":19249,"mutability":"mutable","name":"ep","nameLocation":"236:2:91","nodeType":"VariableDeclaration","scope":19329,"src":"216:22:91","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19248,"nodeType":"UserDefinedTypeName","pathNode":{"id":19247,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"216:11:91"},"referencedDeclaration":10807,"src":"216:11:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"private"},{"body":{"id":19259,"nodeType":"Block","src":"281:25:91","statements":[{"expression":{"id":19257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19255,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19249,"src":"291:2:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19256,"name":"_ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19252,"src":"296:3:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"291:8:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":19258,"nodeType":"ExpressionStatement","src":"291:8:91"}]},"id":19260,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19253,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19252,"mutability":"mutable","name":"_ep","nameLocation":"268:3:91","nodeType":"VariableDeclaration","scope":19260,"src":"256:15:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19251,"nodeType":"UserDefinedTypeName","pathNode":{"id":19250,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"256:11:91"},"referencedDeclaration":10807,"src":"256:11:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"255:17:91"},"returnParameters":{"id":19254,"nodeType":"ParameterList","parameters":[],"src":"281:0:91"},"scope":19329,"src":"244:62:91","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[10568],"body":{"id":19327,"nodeType":"Block","src":"450:614:91","statements":[{"expression":{"arguments":[{"arguments":[{"id":19279,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"510:4:91","typeDescriptions":{"typeIdentifier":"t_contract$_MaliciousAccount_$19329","typeString":"contract MaliciousAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_MaliciousAccount_$19329","typeString":"contract MaliciousAccount"}],"id":19278,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"502:7:91","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19277,"name":"address","nodeType":"ElementaryTypeName","src":"502:7:91","typeDescriptions":{}}},"id":19280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"502:13:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19272,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19249,"src":"460:2:91","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":19274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":10941,"src":"460:12:91","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":19276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":19275,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19267,"src":"481:19:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"460:41:91","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":19281,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"460:56:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19282,"nodeType":"ExpressionStatement","src":"460:56:91"},{"assignments":[19284],"declarations":[{"constant":false,"id":19284,"mutability":"mutable","name":"externalBaseFee","nameLocation":"666:15:91","nodeType":"VariableDeclaration","scope":19327,"src":"658:23:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19283,"name":"uint256","nodeType":"ElementaryTypeName","src":"658:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19293,"initialValue":{"arguments":[{"expression":{"id":19287,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19263,"src":"695:6:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19288,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"695:16:91","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":19290,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"714:7:91","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":19289,"name":"uint256","nodeType":"ElementaryTypeName","src":"714:7:91","typeDescriptions":{}}}],"id":19291,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"713:9:91","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":19285,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"684:3:91","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19286,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"684:10:91","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":19292,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"684:39:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"658:65:91"},{"assignments":[19295],"declarations":[{"constant":false,"id":19295,"mutability":"mutable","name":"requiredGas","nameLocation":"741:11:91","nodeType":"VariableDeclaration","scope":19327,"src":"733:19:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19294,"name":"uint256","nodeType":"ElementaryTypeName","src":"733:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19304,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19303,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":19296,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19263,"src":"755:6:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19297,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":10980,"src":"755:19:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":19298,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19263,"src":"777:6:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":10982,"src":"777:27:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"755:49:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":19301,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19263,"src":"807:6:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":10984,"src":"807:25:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"755:77:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"733:99:91"},{"assignments":[19306],"declarations":[{"constant":false,"id":19306,"mutability":"mutable","name":"gasPrice","nameLocation":"850:8:91","nodeType":"VariableDeclaration","scope":19327,"src":"842:16:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19305,"name":"uint256","nodeType":"ElementaryTypeName","src":"842:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19310,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19307,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19267,"src":"861:19:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":19308,"name":"requiredGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19295,"src":"883:11:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"861:33:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"842:52:91"},{"assignments":[19312],"declarations":[{"constant":false,"id":19312,"mutability":"mutable","name":"basefee","nameLocation":"912:7:91","nodeType":"VariableDeclaration","scope":19327,"src":"904:15:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19311,"name":"uint256","nodeType":"ElementaryTypeName","src":"904:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19317,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19313,"name":"gasPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19306,"src":"922:8:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"id":19314,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19263,"src":"933:6:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19315,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":10988,"src":"933:27:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"922:38:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"904:56:91"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19319,"name":"basefee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19312,"src":"979:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":19320,"name":"externalBaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19284,"src":"990:15:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"979:26:91","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5265766572742061667465722066697273742076616c69646174696f6e","id":19322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1007:31:91","typeDescriptions":{"typeIdentifier":"t_stringliteral_c9a69fb9e86f6a594353e38515d336f45846548dd2f61998ba4ea3679ad627cf","typeString":"literal_string \"Revert after first validation\""},"value":"Revert after first validation"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c9a69fb9e86f6a594353e38515d336f45846548dd2f61998ba4ea3679ad627cf","typeString":"literal_string \"Revert after first validation\""}],"id":19318,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"970:7:91","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":19323,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"970:69:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19324,"nodeType":"ExpressionStatement","src":"970:69:91"},{"expression":{"hexValue":"30","id":19325,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1056:1:91","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":19271,"id":19326,"nodeType":"Return","src":"1049:8:91"}]},"functionSelector":"3a871cdd","id":19328,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"320:14:91","nodeType":"FunctionDefinition","parameters":{"id":19268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19263,"mutability":"mutable","name":"userOp","nameLocation":"358:6:91","nodeType":"VariableDeclaration","scope":19328,"src":"335:29:91","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19262,"nodeType":"UserDefinedTypeName","pathNode":{"id":19261,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"335:13:91"},"referencedDeclaration":10993,"src":"335:13:91","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19265,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19328,"src":"366:7:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19264,"name":"bytes32","nodeType":"ElementaryTypeName","src":"366:7:91","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":19267,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"383:19:91","nodeType":"VariableDeclaration","scope":19328,"src":"375:27:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19266,"name":"uint256","nodeType":"ElementaryTypeName","src":"375:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"334:69:91"},"returnParameters":{"id":19271,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19270,"mutability":"mutable","name":"validationData","nameLocation":"434:14:91","nodeType":"VariableDeclaration","scope":19328,"src":"426:22:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19269,"name":"uint256","nodeType":"ElementaryTypeName","src":"426:7:91","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"425:24:91"},"scope":19329,"src":"311:753:91","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":19330,"src":"172:894:91","usedErrors":[]}],"src":"36:1031:91"},"id":91},"contracts/test/TestAggregatedAccount.sol":{"ast":{"absolutePath":"contracts/test/TestAggregatedAccount.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TestAggregatedAccount":[19397],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19398,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19331,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:92"},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../samples/SimpleAccount.sol","id":19332,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19398,"sourceUnit":14142,"src":"62:38:92","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19334,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"367:13:92"},"id":19335,"nodeType":"InheritanceSpecifier","src":"367:13:92"}],"canonicalName":"TestAggregatedAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":19333,"nodeType":"StructuredDocumentation","src":"102:230:92","text":" test aggregated-signature account.\n works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum\n a true aggregated account should expose data (e.g. its public key) to the aggregator."},"fullyImplemented":true,"id":19397,"linearizedBaseContracts":[19397,14141,3543,3659,3312,2957,17937,3754,5840,4779,4799,7308,10569],"name":"TestAggregatedAccount","nameLocation":"342:21:92","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"245a7bfc","id":19337,"mutability":"immutable","name":"aggregator","nameLocation":"412:10:92","nodeType":"VariableDeclaration","scope":19397,"src":"387:35:92","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19336,"name":"address","nodeType":"ElementaryTypeName","src":"387:7:92","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"body":{"id":19352,"nodeType":"Block","src":"694:42:92","statements":[{"expression":{"id":19350,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19348,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19337,"src":"704:10:92","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19349,"name":"anAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19342,"src":"717:12:92","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"704:25:92","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19351,"nodeType":"ExpressionStatement","src":"704:25:92"}]},"id":19353,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19345,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19340,"src":"680:12:92","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":19346,"kind":"baseConstructorSpecifier","modifierName":{"id":19344,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"666:13:92"},"nodeType":"ModifierInvocation","src":"666:27:92"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19340,"mutability":"mutable","name":"anEntryPoint","nameLocation":"630:12:92","nodeType":"VariableDeclaration","scope":19353,"src":"618:24:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19339,"nodeType":"UserDefinedTypeName","pathNode":{"id":19338,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"618:11:92"},"referencedDeclaration":10807,"src":"618:11:92","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":19342,"mutability":"mutable","name":"anAggregator","nameLocation":"652:12:92","nodeType":"VariableDeclaration","scope":19353,"src":"644:20:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19341,"name":"address","nodeType":"ElementaryTypeName","src":"644:7:92","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"617:48:92"},"returnParameters":{"id":19347,"nodeType":"ParameterList","parameters":[],"src":"694:0:92"},"scope":19397,"src":"606:130:92","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[13983],"body":{"id":19371,"nodeType":"Block","src":"841:46:92","statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":19367,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"877:1:92","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19366,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"869:7:92","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19365,"name":"address","nodeType":"ElementaryTypeName","src":"869:7:92","typeDescriptions":{}}},"id":19368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"869:10:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19362,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"851:5:92","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_TestAggregatedAccount_$19397_$","typeString":"type(contract super TestAggregatedAccount)"}},"id":19364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_initialize","nodeType":"MemberAccess","referencedDeclaration":13998,"src":"851:17:92","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"851:29:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19370,"nodeType":"ExpressionStatement","src":"851:29:92"}]},"documentation":{"id":19354,"nodeType":"StructuredDocumentation","src":"742:29:92","text":"@inheritdoc SimpleAccount"},"functionSelector":"c4d66de8","id":19372,"implemented":true,"kind":"function","modifiers":[{"id":19360,"kind":"modifierInvocation","modifierName":{"id":19359,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":3445,"src":"829:11:92"},"nodeType":"ModifierInvocation","src":"829:11:92"}],"name":"initialize","nameLocation":"785:10:92","nodeType":"FunctionDefinition","overrides":{"id":19358,"nodeType":"OverrideSpecifier","overrides":[],"src":"820:8:92"},"parameters":{"id":19357,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19356,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19372,"src":"796:7:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19355,"name":"address","nodeType":"ElementaryTypeName","src":"796:7:92","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"795:9:92"},"returnParameters":{"id":19361,"nodeType":"ParameterList","parameters":[],"src":"841:0:92"},"scope":19397,"src":"776:111:92","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[14050],"body":{"id":19395,"nodeType":"Block","src":"1032:107:92","statements":[{"expression":{"components":[{"id":19383,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19375,"src":"1043:6:92","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":19384,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19377,"src":"1051:10:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":19385,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1042:20:92","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$","typeString":"tuple(struct UserOperation calldata,bytes32)"}},"id":19386,"nodeType":"ExpressionStatement","src":"1042:20:92"},{"expression":{"arguments":[{"arguments":[{"id":19389,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19337,"src":"1114:10:92","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":19390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1126:1:92","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":19391,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1129:1:92","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19388,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9761,"src":"1099:14:92","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$9761_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":19392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1099:32:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}],"id":19387,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9942,"src":"1079:19:92","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_ValidationData_$9761_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct ValidationData memory) pure returns (uint256)"}},"id":19393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1079:53:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19382,"id":19394,"nodeType":"Return","src":"1072:60:92"}]},"id":19396,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"902:18:92","nodeType":"FunctionDefinition","overrides":{"id":19379,"nodeType":"OverrideSpecifier","overrides":[],"src":"985:8:92"},"parameters":{"id":19378,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19375,"mutability":"mutable","name":"userOp","nameLocation":"944:6:92","nodeType":"VariableDeclaration","scope":19396,"src":"921:29:92","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19374,"nodeType":"UserDefinedTypeName","pathNode":{"id":19373,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"921:13:92"},"referencedDeclaration":10993,"src":"921:13:92","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19377,"mutability":"mutable","name":"userOpHash","nameLocation":"960:10:92","nodeType":"VariableDeclaration","scope":19396,"src":"952:18:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19376,"name":"bytes32","nodeType":"ElementaryTypeName","src":"952:7:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"920:51:92"},"returnParameters":{"id":19382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19381,"mutability":"mutable","name":"validationData","nameLocation":"1016:14:92","nodeType":"VariableDeclaration","scope":19396,"src":"1008:22:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19380,"name":"uint256","nodeType":"ElementaryTypeName","src":"1008:7:92","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1007:24:92"},"scope":19397,"src":"893:246:92","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":19398,"src":"333:808:92","usedErrors":[]}],"src":"36:1106:92"},"id":92},"contracts/test/TestAggregatedAccountFactory.sol":{"ast":{"absolutePath":"contracts/test/TestAggregatedAccountFactory.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"Create2":[5232],"ECDSA":[5828],"ERC1967Proxy":[2994],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"Proxy":[3364],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TestAggregatedAccount":[19397],"TestAggregatedAccountFactory":[19532],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19533,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19399,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:93"},{"absolutePath":"@openzeppelin/contracts/utils/Create2.sol","file":"@openzeppelin/contracts/utils/Create2.sol","id":19400,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19533,"sourceUnit":5233,"src":"62:51:93","symbolAliases":[],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","file":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","id":19401,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19533,"sourceUnit":2995,"src":"114:64:93","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/test/TestAggregatedAccount.sol","file":"./TestAggregatedAccount.sol","id":19402,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19533,"sourceUnit":19398,"src":"180:37:93","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"TestAggregatedAccountFactory","contractDependencies":[2994,19397],"contractKind":"contract","documentation":{"id":19403,"nodeType":"StructuredDocumentation","src":"219:183:93","text":" Based on SimpleAccountFactory.\n Cannot be a subclass since both constructor and createAccount depend on the\n constructor and initializer of the actual account contract."},"fullyImplemented":true,"id":19532,"linearizedBaseContracts":[19532],"name":"TestAggregatedAccountFactory","nameLocation":"412:28:93","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"11464fbe","id":19406,"mutability":"immutable","name":"accountImplementation","nameLocation":"486:21:93","nodeType":"VariableDeclaration","scope":19532,"src":"447:60:93","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"},"typeName":{"id":19405,"nodeType":"UserDefinedTypeName","pathNode":{"id":19404,"name":"TestAggregatedAccount","nodeType":"IdentifierPath","referencedDeclaration":19397,"src":"447:21:93"},"referencedDeclaration":19397,"src":"447:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"visibility":"public"},{"body":{"id":19423,"nodeType":"Block","src":"573:94:93","statements":[{"expression":{"id":19421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19414,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19406,"src":"583:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":19418,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19409,"src":"633:12:93","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":19419,"name":"anAggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19411,"src":"647:12:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},{"typeIdentifier":"t_address","typeString":"address"}],"id":19417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"607:25:93","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_contract$_IEntryPoint_$10807_$_t_address_$returns$_t_contract$_TestAggregatedAccount_$19397_$","typeString":"function (contract IEntryPoint,address) returns (contract TestAggregatedAccount)"},"typeName":{"id":19416,"nodeType":"UserDefinedTypeName","pathNode":{"id":19415,"name":"TestAggregatedAccount","nodeType":"IdentifierPath","referencedDeclaration":19397,"src":"611:21:93"},"referencedDeclaration":19397,"src":"611:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}}},"id":19420,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"607:53:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"src":"583:77:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"id":19422,"nodeType":"ExpressionStatement","src":"583:77:93"}]},"id":19424,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19412,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19409,"mutability":"mutable","name":"anEntryPoint","nameLocation":"538:12:93","nodeType":"VariableDeclaration","scope":19424,"src":"526:24:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19408,"nodeType":"UserDefinedTypeName","pathNode":{"id":19407,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"526:11:93"},"referencedDeclaration":10807,"src":"526:11:93","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":19411,"mutability":"mutable","name":"anAggregator","nameLocation":"560:12:93","nodeType":"VariableDeclaration","scope":19424,"src":"552:20:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19410,"name":"address","nodeType":"ElementaryTypeName","src":"552:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"525:48:93"},"returnParameters":{"id":19413,"nodeType":"ParameterList","parameters":[],"src":"573:0:93"},"scope":19532,"src":"514:153:93","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19488,"nodeType":"Block","src":"1141:415:93","statements":[{"assignments":[19436],"declarations":[{"constant":false,"id":19436,"mutability":"mutable","name":"addr","nameLocation":"1159:4:93","nodeType":"VariableDeclaration","scope":19488,"src":"1151:12:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19435,"name":"address","nodeType":"ElementaryTypeName","src":"1151:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19441,"initialValue":{"arguments":[{"id":19438,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19427,"src":"1177:5:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":19439,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19429,"src":"1184:4:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19437,"name":"getAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19531,"src":"1166:10:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_uint256_$returns$_t_address_$","typeString":"function (address,uint256) view returns (address)"}},"id":19440,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1166:23:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1151:38:93"},{"assignments":[19443],"declarations":[{"constant":false,"id":19443,"mutability":"mutable","name":"codeSize","nameLocation":"1204:8:93","nodeType":"VariableDeclaration","scope":19488,"src":"1199:13:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19442,"name":"uint","nodeType":"ElementaryTypeName","src":"1199:4:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19447,"initialValue":{"expression":{"expression":{"id":19444,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19436,"src":"1215:4:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"1215:9:93","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":19446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1215:16:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1199:32:93"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19448,"name":"codeSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19443,"src":"1245:8:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":19449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1256:1:93","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1245:12:93","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19459,"nodeType":"IfStatement","src":"1241:86:93","trueBody":{"id":19458,"nodeType":"Block","src":"1259:68:93","statements":[{"expression":{"arguments":[{"arguments":[{"id":19454,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19436,"src":"1310:4:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19453,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1302:8:93","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":19452,"name":"address","nodeType":"ElementaryTypeName","src":"1302:8:93","stateMutability":"payable","typeDescriptions":{}}},"id":19455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1302:13:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":19451,"name":"TestAggregatedAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"1280:21:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TestAggregatedAccount_$19397_$","typeString":"type(contract TestAggregatedAccount)"}},"id":19456,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1280:36:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"functionReturnParameters":19434,"id":19457,"nodeType":"Return","src":"1273:43:93"}]}},{"expression":{"id":19486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19460,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19433,"src":"1336:3:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"id":19474,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19406,"src":"1436:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}],"id":19473,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1428:7:93","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19472,"name":"address","nodeType":"ElementaryTypeName","src":"1428:7:93","typeDescriptions":{}}},"id":19475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1428:30:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":19478,"name":"TestAggregatedAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"1491:21:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TestAggregatedAccount_$19397_$","typeString":"type(contract TestAggregatedAccount)"}},"id":19479,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":19372,"src":"1491:32:93","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function TestAggregatedAccount.initialize(address)"}},{"components":[{"id":19480,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19427,"src":"1526:5:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":19481,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1525:7:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function TestAggregatedAccount.initialize(address)"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19476,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1476:3:93","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19477,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1476:14:93","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1476:57:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":19466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"1372:16:93","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"},"typeName":{"id":19465,"nodeType":"UserDefinedTypeName","pathNode":{"id":19464,"name":"ERC1967Proxy","nodeType":"IdentifierPath","referencedDeclaration":2994,"src":"1376:12:93"},"referencedDeclaration":2994,"src":"1376:12:93","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}},"id":19471,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"id":19469,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19429,"src":"1404:4:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19468,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1396:7:93","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19467,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1396:7:93","typeDescriptions":{}}},"id":19470,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1396:13:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"1372:38:93","typeDescriptions":{"typeIdentifier":"t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$2994_$salt","typeString":"function (address,bytes memory) payable returns (contract ERC1967Proxy)"}},"id":19483,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1372:175:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1967Proxy_$2994","typeString":"contract ERC1967Proxy"}],"id":19463,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1364:8:93","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":19462,"name":"address","nodeType":"ElementaryTypeName","src":"1364:8:93","stateMutability":"payable","typeDescriptions":{}}},"id":19484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1364:184:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":19461,"name":"TestAggregatedAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"1342:21:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TestAggregatedAccount_$19397_$","typeString":"type(contract TestAggregatedAccount)"}},"id":19485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1342:207:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"src":"1336:213:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"id":19487,"nodeType":"ExpressionStatement","src":"1336:213:93"}]},"documentation":{"id":19425,"nodeType":"StructuredDocumentation","src":"673:369:93","text":" create an account, and return its address.\n returns the address even if the account is already deployed.\n Note that during UserOperation execution, this method is called only if the account is not deployed.\n This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation"},"functionSelector":"5fbfb9cf","id":19489,"implemented":true,"kind":"function","modifiers":[],"name":"createAccount","nameLocation":"1056:13:93","nodeType":"FunctionDefinition","parameters":{"id":19430,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19427,"mutability":"mutable","name":"owner","nameLocation":"1078:5:93","nodeType":"VariableDeclaration","scope":19489,"src":"1070:13:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19426,"name":"address","nodeType":"ElementaryTypeName","src":"1070:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19429,"mutability":"mutable","name":"salt","nameLocation":"1092:4:93","nodeType":"VariableDeclaration","scope":19489,"src":"1084:12:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19428,"name":"uint256","nodeType":"ElementaryTypeName","src":"1084:7:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1069:28:93"},"returnParameters":{"id":19434,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19433,"mutability":"mutable","name":"ret","nameLocation":"1136:3:93","nodeType":"VariableDeclaration","scope":19489,"src":"1114:25:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"},"typeName":{"id":19432,"nodeType":"UserDefinedTypeName","pathNode":{"id":19431,"name":"TestAggregatedAccount","nodeType":"IdentifierPath","referencedDeclaration":19397,"src":"1114:21:93"},"referencedDeclaration":19397,"src":"1114:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}},"visibility":"internal"}],"src":"1113:27:93"},"scope":19532,"src":"1047:509:93","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19530,"nodeType":"Block","src":"1759:330:93","statements":[{"expression":{"arguments":[{"arguments":[{"id":19503,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19494,"src":"1807:4:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19502,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1799:7:93","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19501,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1799:7:93","typeDescriptions":{}}},"id":19504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1799:13:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"expression":{"arguments":[{"id":19509,"name":"ERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2994,"src":"1863:12:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ERC1967Proxy_$2994_$","typeString":"type(contract ERC1967Proxy)"}],"id":19508,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1858:4:93","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":19510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1858:18:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ERC1967Proxy_$2994","typeString":"type(contract ERC1967Proxy)"}},"id":19511,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"creationCode","nodeType":"MemberAccess","src":"1858:31:93","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[{"arguments":[{"id":19516,"name":"accountImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19406,"src":"1947:21:93","typeDescriptions":{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TestAggregatedAccount_$19397","typeString":"contract TestAggregatedAccount"}],"id":19515,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1939:7:93","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19514,"name":"address","nodeType":"ElementaryTypeName","src":"1939:7:93","typeDescriptions":{}}},"id":19517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1939:30:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":19520,"name":"TestAggregatedAccount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"2006:21:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TestAggregatedAccount_$19397_$","typeString":"type(contract TestAggregatedAccount)"}},"id":19521,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":19372,"src":"2006:32:93","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function TestAggregatedAccount.initialize(address)"}},{"components":[{"id":19522,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19492,"src":"2041:5:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":19523,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2040:7:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$returns$__$","typeString":"function TestAggregatedAccount.initialize(address)"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19518,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1991:3:93","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19519,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeCall","nodeType":"MemberAccess","src":"1991:14:93","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1991:57:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":19512,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1907:3:93","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19513,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"1907:10:93","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19525,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1907:159:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":19506,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1824:3:93","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19507,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"1824:16:93","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":19526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1824:256:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":19505,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1814:9:93","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1814:267:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":19499,"name":"Create2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5232,"src":"1776:7:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Create2_$5232_$","typeString":"type(library Create2)"}},"id":19500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"computeAddress","nodeType":"MemberAccess","referencedDeclaration":5217,"src":"1776:22:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,bytes32) view returns (address)"}},"id":19528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1776:306:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19498,"id":19529,"nodeType":"Return","src":"1769:313:93"}]},"documentation":{"id":19490,"nodeType":"StructuredDocumentation","src":"1562:114:93","text":" calculate the counterfactual address of this account as it would be returned by createAccount()"},"functionSelector":"8cb84e18","id":19531,"implemented":true,"kind":"function","modifiers":[],"name":"getAddress","nameLocation":"1690:10:93","nodeType":"FunctionDefinition","parameters":{"id":19495,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19492,"mutability":"mutable","name":"owner","nameLocation":"1709:5:93","nodeType":"VariableDeclaration","scope":19531,"src":"1701:13:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19491,"name":"address","nodeType":"ElementaryTypeName","src":"1701:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19494,"mutability":"mutable","name":"salt","nameLocation":"1723:4:93","nodeType":"VariableDeclaration","scope":19531,"src":"1715:12:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19493,"name":"uint256","nodeType":"ElementaryTypeName","src":"1715:7:93","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1700:28:93"},"returnParameters":{"id":19498,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19497,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19531,"src":"1750:7:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19496,"name":"address","nodeType":"ElementaryTypeName","src":"1750:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1749:9:93"},"scope":19532,"src":"1681:408:93","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":19533,"src":"403:1688:93","usedErrors":[]}],"src":"36:2056:93"},"id":93},"contracts/test/TestCounter.sol":{"ast":{"absolutePath":"contracts/test/TestCounter.sol","exportedSymbols":{"TestCounter":[19611]},"id":19612,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19534,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:94"},{"abstract":false,"baseContracts":[],"canonicalName":"TestCounter","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":19611,"linearizedBaseContracts":[19611],"name":"TestCounter","nameLocation":"134:11:94","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"be65ab8c","id":19538,"mutability":"mutable","name":"counters","nameLocation":"187:8:94","nodeType":"VariableDeclaration","scope":19611,"src":"152:43:94","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":19537,"keyType":{"id":19535,"name":"address","nodeType":"ElementaryTypeName","src":"160:7:94","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"152:27:94","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":19536,"name":"uint256","nodeType":"ElementaryTypeName","src":"171:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"body":{"id":19553,"nodeType":"Block","src":"226:64:94","statements":[{"expression":{"id":19551,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":19541,"name":"counters","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19538,"src":"236:8:94","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":19544,"indexExpression":{"expression":{"id":19542,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"245:3:94","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":19543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"245:10:94","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"236:20:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":19545,"name":"counters","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19538,"src":"259:8:94","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":19548,"indexExpression":{"expression":{"id":19546,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"268:3:94","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":19547,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"268:10:94","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"259:20:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":19549,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"282:1:94","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"259:24:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"236:47:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19552,"nodeType":"ExpressionStatement","src":"236:47:94"}]},"functionSelector":"06661abd","id":19554,"implemented":true,"kind":"function","modifiers":[],"name":"count","nameLocation":"211:5:94","nodeType":"FunctionDefinition","parameters":{"id":19539,"nodeType":"ParameterList","parameters":[],"src":"216:2:94"},"returnParameters":{"id":19540,"nodeType":"ParameterList","parameters":[],"src":"226:0:94"},"scope":19611,"src":"202:88:94","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19561,"nodeType":"Block","src":"329:39:94","statements":[{"expression":{"arguments":[{"hexValue":"636f756e74206661696c6564","id":19558,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"346:14:94","typeDescriptions":{"typeIdentifier":"t_stringliteral_685dd20c453e21fe824a921aca955abfb72a175353566c7111fa229082258e0f","typeString":"literal_string \"count failed\""},"value":"count failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_685dd20c453e21fe824a921aca955abfb72a175353566c7111fa229082258e0f","typeString":"literal_string \"count failed\""}],"id":19557,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"339:6:94","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":19559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"339:22:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19560,"nodeType":"ExpressionStatement","src":"339:22:94"}]},"functionSelector":"caece693","id":19562,"implemented":true,"kind":"function","modifiers":[],"name":"countFail","nameLocation":"305:9:94","nodeType":"FunctionDefinition","parameters":{"id":19555,"nodeType":"ParameterList","parameters":[],"src":"314:2:94"},"returnParameters":{"id":19556,"nodeType":"ParameterList","parameters":[],"src":"329:0:94"},"scope":19611,"src":"296:72:94","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":19570,"nodeType":"Block","src":"401:44:94","statements":[{"eventCall":{"arguments":[{"expression":{"id":19566,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"427:3:94","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":19567,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"427:10:94","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19565,"name":"CalledFrom","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19575,"src":"416:10:94","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19568,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"416:22:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19569,"nodeType":"EmitStatement","src":"411:27:94"}]},"functionSelector":"278ddd3c","id":19571,"implemented":true,"kind":"function","modifiers":[],"name":"justemit","nameLocation":"383:8:94","nodeType":"FunctionDefinition","parameters":{"id":19563,"nodeType":"ParameterList","parameters":[],"src":"391:2:94"},"returnParameters":{"id":19564,"nodeType":"ParameterList","parameters":[],"src":"401:0:94"},"scope":19611,"src":"374:71:94","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"anonymous":false,"eventSelector":"fb3b4d6258432a9a3d78dd9bffbcb6cfb1bd94f58da35fd530d08da7d1d05832","id":19575,"name":"CalledFrom","nameLocation":"457:10:94","nodeType":"EventDefinition","parameters":{"id":19574,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19573,"indexed":false,"mutability":"mutable","name":"sender","nameLocation":"476:6:94","nodeType":"VariableDeclaration","scope":19575,"src":"468:14:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19572,"name":"address","nodeType":"ElementaryTypeName","src":"468:7:94","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"467:16:94"},"src":"451:33:94"},{"constant":false,"functionSelector":"a5e9585f","id":19579,"mutability":"mutable","name":"xxx","nameLocation":"671:3:94","nodeType":"VariableDeclaration","scope":19611,"src":"636:38:94","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"},"typeName":{"id":19578,"keyType":{"id":19576,"name":"uint256","nodeType":"ElementaryTypeName","src":"644:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"636:27:94","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"},"valueType":{"id":19577,"name":"uint256","nodeType":"ElementaryTypeName","src":"655:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"d5556544","id":19581,"mutability":"mutable","name":"offset","nameLocation":"695:6:94","nodeType":"VariableDeclaration","scope":19611,"src":"680:21:94","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19580,"name":"uint256","nodeType":"ElementaryTypeName","src":"680:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"body":{"id":19609,"nodeType":"Block","src":"778:116:94","statements":[{"body":{"id":19607,"nodeType":"Block","src":"826:62:94","statements":[{"expression":{"id":19599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"840:8:94","subExpression":{"id":19598,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19581,"src":"840:6:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19600,"nodeType":"ExpressionStatement","src":"840:8:94"},{"expression":{"id":19605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":19601,"name":"xxx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19579,"src":"862:3:94","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":19603,"indexExpression":{"id":19602,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19581,"src":"866:6:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"862:11:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19604,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19589,"src":"876:1:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"862:15:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19606,"nodeType":"ExpressionStatement","src":"862:15:94"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19592,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19589,"src":"808:1:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":19593,"name":"repeat","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19583,"src":"813:6:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"808:11:94","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19608,"initializationExpression":{"assignments":[19589],"declarations":[{"constant":false,"id":19589,"mutability":"mutable","name":"i","nameLocation":"801:1:94","nodeType":"VariableDeclaration","scope":19608,"src":"793:9:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19588,"name":"uint256","nodeType":"ElementaryTypeName","src":"793:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19591,"initialValue":{"hexValue":"31","id":19590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"805:1:94","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"793:13:94"},"loopExpression":{"expression":{"id":19596,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"821:3:94","subExpression":{"id":19595,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19589,"src":"821:1:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19597,"nodeType":"ExpressionStatement","src":"821:3:94"},"nodeType":"ForStatement","src":"788:100:94"}]},"functionSelector":"a1b46890","id":19610,"implemented":true,"kind":"function","modifiers":[],"name":"gasWaster","nameLocation":"717:9:94","nodeType":"FunctionDefinition","parameters":{"id":19586,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19583,"mutability":"mutable","name":"repeat","nameLocation":"735:6:94","nodeType":"VariableDeclaration","scope":19610,"src":"727:14:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19582,"name":"uint256","nodeType":"ElementaryTypeName","src":"727:7:94","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19585,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19610,"src":"743:15:94","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":19584,"name":"string","nodeType":"ElementaryTypeName","src":"743:6:94","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"726:42:94"},"returnParameters":{"id":19587,"nodeType":"ParameterList","parameters":[],"src":"778:0:94"},"scope":19611,"src":"708:186:94","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":19612,"src":"125:771:94","usedErrors":[]}],"src":"36:861:94"},"id":94},"contracts/test/TestExpirePaymaster.sol":{"ast":{"absolutePath":"contracts/test/TestExpirePaymaster.sol","exportedSymbols":{"BasePaymaster":[7528],"Context":[5151],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"TestExpirePaymaster":[19678],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19679,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":19613,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:95"},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":19614,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19679,"sourceUnit":7529,"src":"67:35:95","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19616,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"231:13:95"},"id":19617,"nodeType":"InheritanceSpecifier","src":"231:13:95"}],"canonicalName":"TestExpirePaymaster","contractDependencies":[],"contractKind":"contract","documentation":{"id":19615,"nodeType":"StructuredDocumentation","src":"104:94:95","text":" test expiry mechanism: paymasterData encodes the \"validUntil\" and validAfter\" times"},"fullyImplemented":true,"id":19678,"linearizedBaseContracts":[19678,7528,2933,5151,10861],"name":"TestExpirePaymaster","nameLocation":"208:19:95","nodeType":"ContractDefinition","nodes":[{"body":{"id":19626,"nodeType":"Block","src":"358:2:95","statements":[]},"id":19627,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19623,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19620,"src":"341:11:95","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":19624,"kind":"baseConstructorSpecifier","modifierName":{"id":19622,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"327:13:95"},"nodeType":"ModifierInvocation","src":"327:26:95"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19620,"mutability":"mutable","name":"_entryPoint","nameLocation":"314:11:95","nodeType":"VariableDeclaration","scope":19627,"src":"302:23:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19619,"nodeType":"UserDefinedTypeName","pathNode":{"id":19618,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"302:11:95"},"referencedDeclaration":10807,"src":"302:11:95","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"301:25:95"},"returnParameters":{"id":19625,"nodeType":"ParameterList","parameters":[],"src":"358:0:95"},"scope":19678,"src":"290:70:95","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[7373],"body":{"id":19676,"nodeType":"Block","src":"562:255:95","statements":[{"expression":{"components":[{"id":19642,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19630,"src":"573:6:95","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":19643,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19632,"src":"581:10:95","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":19644,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19634,"src":"593:7:95","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":19645,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"572:29:95","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$_t_uint256_$","typeString":"tuple(struct UserOperation calldata,bytes32,uint256)"}},"id":19646,"nodeType":"ExpressionStatement","src":"572:29:95"},{"assignments":[19648,19650],"declarations":[{"constant":false,"id":19648,"mutability":"mutable","name":"validAfter","nameLocation":"619:10:95","nodeType":"VariableDeclaration","scope":19676,"src":"612:17:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19647,"name":"uint48","nodeType":"ElementaryTypeName","src":"612:6:95","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":19650,"mutability":"mutable","name":"validUntil","nameLocation":"638:10:95","nodeType":"VariableDeclaration","scope":19676,"src":"631:17:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19649,"name":"uint48","nodeType":"ElementaryTypeName","src":"631:6:95","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":19663,"initialValue":{"arguments":[{"baseExpression":{"expression":{"id":19653,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19630,"src":"663:6:95","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"663:23:95","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":19656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"663:29:95","startExpression":{"hexValue":"3230","id":19655,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"687:2:95","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},{"components":[{"id":19658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"695:6:95","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":19657,"name":"uint48","nodeType":"ElementaryTypeName","src":"695:6:95","typeDescriptions":{}}},{"id":19660,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"703:6:95","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":19659,"name":"uint48","nodeType":"ElementaryTypeName","src":"703:6:95","typeDescriptions":{}}}],"id":19661,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"694:16:95","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"},{"typeIdentifier":"t_tuple$_t_type$_t_uint48_$_$_t_type$_t_uint48_$_$","typeString":"tuple(type(uint48),type(uint48))"}],"expression":{"id":19651,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"652:3:95","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":19652,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"652:10:95","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":19662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"652:59:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint48_$_t_uint48_$","typeString":"tuple(uint48,uint48)"}},"nodeType":"VariableDeclarationStatement","src":"611:100:95"},{"expression":{"id":19670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19664,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19640,"src":"721:14:95","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"66616c7365","id":19666,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"758:5:95","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"id":19667,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19650,"src":"765:10:95","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":19668,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19648,"src":"777:10:95","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":19665,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"738:19:95","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":19669,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"738:50:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"721:67:95","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19671,"nodeType":"ExpressionStatement","src":"721:67:95"},{"expression":{"id":19674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19672,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19638,"src":"798:7:95","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"","id":19673,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"808:2:95","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"src":"798:12:95","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":19675,"nodeType":"ExpressionStatement","src":"798:12:95"}]},"id":19677,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"375:24:95","nodeType":"FunctionDefinition","overrides":{"id":19636,"nodeType":"OverrideSpecifier","overrides":[],"src":"489:8:95"},"parameters":{"id":19635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19630,"mutability":"mutable","name":"userOp","nameLocation":"423:6:95","nodeType":"VariableDeclaration","scope":19677,"src":"400:29:95","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19629,"nodeType":"UserDefinedTypeName","pathNode":{"id":19628,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"400:13:95"},"referencedDeclaration":10993,"src":"400:13:95","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19632,"mutability":"mutable","name":"userOpHash","nameLocation":"439:10:95","nodeType":"VariableDeclaration","scope":19677,"src":"431:18:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19631,"name":"bytes32","nodeType":"ElementaryTypeName","src":"431:7:95","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":19634,"mutability":"mutable","name":"maxCost","nameLocation":"459:7:95","nodeType":"VariableDeclaration","scope":19677,"src":"451:15:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19633,"name":"uint256","nodeType":"ElementaryTypeName","src":"451:7:95","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"399:68:95"},"returnParameters":{"id":19641,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19638,"mutability":"mutable","name":"context","nameLocation":"529:7:95","nodeType":"VariableDeclaration","scope":19677,"src":"516:20:95","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":19637,"name":"bytes","nodeType":"ElementaryTypeName","src":"516:5:95","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":19640,"mutability":"mutable","name":"validationData","nameLocation":"546:14:95","nodeType":"VariableDeclaration","scope":19677,"src":"538:22:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19639,"name":"uint256","nodeType":"ElementaryTypeName","src":"538:7:95","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"515:46:95"},"scope":19678,"src":"366:451:95","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":19679,"src":"199:620:95","usedErrors":[]}],"src":"41:779:95"},"id":95},"contracts/test/TestExpiryAccount.sol":{"ast":{"absolutePath":"contracts/test/TestExpiryAccount.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TestExpiryAccount":[19818],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19819,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":19680,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:96"},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../samples/SimpleAccount.sol","id":19681,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19819,"sourceUnit":14142,"src":"67:38:96","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19683,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"510:13:96"},"id":19684,"nodeType":"InheritanceSpecifier","src":"510:13:96"}],"canonicalName":"TestExpiryAccount","contractDependencies":[],"contractKind":"contract","documentation":{"id":19682,"nodeType":"StructuredDocumentation","src":"107:372:96","text":" A test account, for testing expiry.\n add \"temporary\" owners, each with a time range (since..till) times for each.\n NOTE: this is not a full \"session key\" implementation: a real session key should probably limit\n other things, like target contracts and methods to be called.\n also, the \"since\" value is not really useful, only for testing the entrypoint."},"fullyImplemented":true,"id":19818,"linearizedBaseContracts":[19818,14141,3543,3659,3312,2957,17937,3754,5840,4779,4799,7308,10569],"name":"TestExpiryAccount","nameLocation":"489:17:96","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19687,"libraryName":{"id":19685,"name":"ECDSA","nodeType":"IdentifierPath","referencedDeclaration":5828,"src":"536:5:96"},"nodeType":"UsingForDirective","src":"530:24:96","typeName":{"id":19686,"name":"bytes32","nodeType":"ElementaryTypeName","src":"546:7:96","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"constant":false,"functionSelector":"3fb5a7a1","id":19691,"mutability":"mutable","name":"ownerAfter","nameLocation":"594:10:96","nodeType":"VariableDeclaration","scope":19818,"src":"560:44:96","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"},"typeName":{"id":19690,"keyType":{"id":19688,"name":"address","nodeType":"ElementaryTypeName","src":"568:7:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"560:26:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"},"valueType":{"id":19689,"name":"uint48","nodeType":"ElementaryTypeName","src":"579:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}},"visibility":"public"},{"constant":false,"functionSelector":"3e476951","id":19695,"mutability":"mutable","name":"ownerUntil","nameLocation":"644:10:96","nodeType":"VariableDeclaration","scope":19818,"src":"610:44:96","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"},"typeName":{"id":19694,"keyType":{"id":19692,"name":"address","nodeType":"ElementaryTypeName","src":"618:7:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"610:26:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"},"valueType":{"id":19693,"name":"uint48","nodeType":"ElementaryTypeName","src":"629:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}},"visibility":"public"},{"body":{"id":19704,"nodeType":"Block","src":"776:2:96","statements":[]},"id":19705,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19701,"name":"anEntryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19698,"src":"762:12:96","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":19702,"kind":"baseConstructorSpecifier","modifierName":{"id":19700,"name":"SimpleAccount","nodeType":"IdentifierPath","referencedDeclaration":14141,"src":"748:13:96"},"nodeType":"ModifierInvocation","src":"748:27:96"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19699,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19698,"mutability":"mutable","name":"anEntryPoint","nameLocation":"734:12:96","nodeType":"VariableDeclaration","scope":19705,"src":"722:24:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19697,"nodeType":"UserDefinedTypeName","pathNode":{"id":19696,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"722:11:96"},"referencedDeclaration":10807,"src":"722:11:96","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"721:26:96"},"returnParameters":{"id":19703,"nodeType":"ParameterList","parameters":[],"src":"776:0:96"},"scope":19818,"src":"710:68:96","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[13983],"body":{"id":19729,"nodeType":"Block","src":"857:100:96","statements":[{"expression":{"arguments":[{"id":19716,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19707,"src":"885:7:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19713,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"867:5:96","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_TestExpiryAccount_$19818_$","typeString":"type(contract super TestExpiryAccount)"}},"id":19715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_initialize","nodeType":"MemberAccess","referencedDeclaration":13998,"src":"867:17:96","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"867:26:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19718,"nodeType":"ExpressionStatement","src":"867:26:96"},{"expression":{"arguments":[{"id":19720,"name":"anOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19707,"src":"921:7:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":19721,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"930:1:96","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":19724,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"938:6:96","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":19723,"name":"uint48","nodeType":"ElementaryTypeName","src":"938:6:96","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":19722,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"933:4:96","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":19725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"933:12:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":19726,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"933:16:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":19719,"name":"addTemporaryOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19766,"src":"903:17:96","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint48_$_t_uint48_$returns$__$","typeString":"function (address,uint48,uint48)"}},"id":19727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"903:47:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19728,"nodeType":"ExpressionStatement","src":"903:47:96"}]},"functionSelector":"c4d66de8","id":19730,"implemented":true,"kind":"function","modifiers":[{"id":19711,"kind":"modifierInvocation","modifierName":{"id":19710,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":3445,"src":"845:11:96"},"nodeType":"ModifierInvocation","src":"845:11:96"}],"name":"initialize","nameLocation":"793:10:96","nodeType":"FunctionDefinition","overrides":{"id":19709,"nodeType":"OverrideSpecifier","overrides":[],"src":"836:8:96"},"parameters":{"id":19708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19707,"mutability":"mutable","name":"anOwner","nameLocation":"812:7:96","nodeType":"VariableDeclaration","scope":19730,"src":"804:15:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19706,"name":"address","nodeType":"ElementaryTypeName","src":"804:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"803:17:96"},"returnParameters":{"id":19712,"nodeType":"ParameterList","parameters":[],"src":"857:0:96"},"scope":19818,"src":"784:173:96","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[3524],"body":{"id":19734,"nodeType":"Block","src":"1143:2:96","statements":[]},"id":19735,"implemented":true,"kind":"function","modifiers":[],"name":"_disableInitializers","nameLocation":"1102:20:96","nodeType":"FunctionDefinition","overrides":{"id":19732,"nodeType":"OverrideSpecifier","overrides":[],"src":"1134:8:96"},"parameters":{"id":19731,"nodeType":"ParameterList","parameters":[],"src":"1122:2:96"},"returnParameters":{"id":19733,"nodeType":"ParameterList","parameters":[],"src":"1143:0:96"},"scope":19818,"src":"1093:52:96","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19765,"nodeType":"Block","src":"1240:134:96","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":19749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19747,"name":"_until","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19741,"src":"1258:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":19748,"name":"_after","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19739,"src":"1267:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1258:15:96","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"77726f6e6720756e74696c2f6166746572","id":19750,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1275:19:96","typeDescriptions":{"typeIdentifier":"t_stringliteral_0f5da87c25127e98fa2fcf8c3ca4e4215d5764c8cefd7e9612ed845c63b116e0","typeString":"literal_string \"wrong until/after\""},"value":"wrong until/after"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0f5da87c25127e98fa2fcf8c3ca4e4215d5764c8cefd7e9612ed845c63b116e0","typeString":"literal_string \"wrong until/after\""}],"id":19746,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1250:7:96","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":19751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1250:45:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19752,"nodeType":"ExpressionStatement","src":"1250:45:96"},{"expression":{"id":19757,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":19753,"name":"ownerAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19691,"src":"1305:10:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"}},"id":19755,"indexExpression":{"id":19754,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19737,"src":"1316:5:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1305:17:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19756,"name":"_after","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19739,"src":"1325:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1305:26:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":19758,"nodeType":"ExpressionStatement","src":"1305:26:96"},{"expression":{"id":19763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":19759,"name":"ownerUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19695,"src":"1341:10:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"}},"id":19761,"indexExpression":{"id":19760,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19737,"src":"1352:5:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1341:17:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19762,"name":"_until","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19741,"src":"1361:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1341:26:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":19764,"nodeType":"ExpressionStatement","src":"1341:26:96"}]},"functionSelector":"cf6dca55","id":19766,"implemented":true,"kind":"function","modifiers":[{"id":19744,"kind":"modifierInvocation","modifierName":{"id":19743,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":13855,"src":"1230:9:96"},"nodeType":"ModifierInvocation","src":"1230:9:96"}],"name":"addTemporaryOwner","nameLocation":"1160:17:96","nodeType":"FunctionDefinition","parameters":{"id":19742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19737,"mutability":"mutable","name":"owner","nameLocation":"1186:5:96","nodeType":"VariableDeclaration","scope":19766,"src":"1178:13:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19736,"name":"address","nodeType":"ElementaryTypeName","src":"1178:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19739,"mutability":"mutable","name":"_after","nameLocation":"1200:6:96","nodeType":"VariableDeclaration","scope":19766,"src":"1193:13:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19738,"name":"uint48","nodeType":"ElementaryTypeName","src":"1193:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":19741,"mutability":"mutable","name":"_until","nameLocation":"1215:6:96","nodeType":"VariableDeclaration","scope":19766,"src":"1208:13:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19740,"name":"uint48","nodeType":"ElementaryTypeName","src":"1208:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"1177:45:96"},"returnParameters":{"id":19745,"nodeType":"ParameterList","parameters":[],"src":"1240:0:96"},"scope":19818,"src":"1151:223:96","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[14050],"body":{"id":19816,"nodeType":"Block","src":"1568:402:96","statements":[{"assignments":[19779],"declarations":[{"constant":false,"id":19779,"mutability":"mutable","name":"hash","nameLocation":"1586:4:96","nodeType":"VariableDeclaration","scope":19816,"src":"1578:12:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19778,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1578:7:96","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":19783,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19780,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19772,"src":"1593:10:96","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":19781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"toEthSignedMessageHash","nodeType":"MemberAccess","referencedDeclaration":5785,"src":"1593:33:96","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$","typeString":"function (bytes32) pure returns (bytes32)"}},"id":19782,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1593:35:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1578:50:96"},{"assignments":[19785],"declarations":[{"constant":false,"id":19785,"mutability":"mutable","name":"signer","nameLocation":"1646:6:96","nodeType":"VariableDeclaration","scope":19816,"src":"1638:14:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19784,"name":"address","nodeType":"ElementaryTypeName","src":"1638:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19791,"initialValue":{"arguments":[{"expression":{"id":19788,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19770,"src":"1668:6:96","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":19789,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"signature","nodeType":"MemberAccess","referencedDeclaration":10992,"src":"1668:16:96","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":19786,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19779,"src":"1655:4:96","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":19787,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":5594,"src":"1655:12:96","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":19790,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1655:30:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1638:47:96"},{"assignments":[19793],"declarations":[{"constant":false,"id":19793,"mutability":"mutable","name":"_until","nameLocation":"1702:6:96","nodeType":"VariableDeclaration","scope":19816,"src":"1695:13:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19792,"name":"uint48","nodeType":"ElementaryTypeName","src":"1695:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":19797,"initialValue":{"baseExpression":{"id":19794,"name":"ownerUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19695,"src":"1711:10:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"}},"id":19796,"indexExpression":{"id":19795,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19785,"src":"1722:6:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1711:18:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1695:34:96"},{"assignments":[19799],"declarations":[{"constant":false,"id":19799,"mutability":"mutable","name":"_after","nameLocation":"1746:6:96","nodeType":"VariableDeclaration","scope":19816,"src":"1739:13:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19798,"name":"uint48","nodeType":"ElementaryTypeName","src":"1739:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":19803,"initialValue":{"baseExpression":{"id":19800,"name":"ownerAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19691,"src":"1755:10:96","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint48_$","typeString":"mapping(address => uint48)"}},"id":19802,"indexExpression":{"id":19801,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19785,"src":"1766:6:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1755:18:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1739:34:96"},{"assignments":[19805],"declarations":[{"constant":false,"id":19805,"mutability":"mutable","name":"sigFailed","nameLocation":"1877:9:96","nodeType":"VariableDeclaration","scope":19816,"src":"1872:14:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":19804,"name":"bool","nodeType":"ElementaryTypeName","src":"1872:4:96","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":19809,"initialValue":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":19808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19806,"name":"_until","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19793,"src":"1889:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":19807,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1899:1:96","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1889:11:96","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"1872:28:96"},{"expression":{"arguments":[{"id":19811,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19805,"src":"1937:9:96","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":19812,"name":"_until","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19793,"src":"1948:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":19813,"name":"_after","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19799,"src":"1956:6:96","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":19810,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"1917:19:96","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":19814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1917:46:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19777,"id":19815,"nodeType":"Return","src":"1910:53:96"}]},"documentation":{"id":19767,"nodeType":"StructuredDocumentation","src":"1380:44:96","text":"implement template method of BaseAccount"},"id":19817,"implemented":true,"kind":"function","modifiers":[],"name":"_validateSignature","nameLocation":"1438:18:96","nodeType":"FunctionDefinition","overrides":{"id":19774,"nodeType":"OverrideSpecifier","overrides":[],"src":"1521:8:96"},"parameters":{"id":19773,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19770,"mutability":"mutable","name":"userOp","nameLocation":"1480:6:96","nodeType":"VariableDeclaration","scope":19817,"src":"1457:29:96","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19769,"nodeType":"UserDefinedTypeName","pathNode":{"id":19768,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1457:13:96"},"referencedDeclaration":10993,"src":"1457:13:96","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19772,"mutability":"mutable","name":"userOpHash","nameLocation":"1496:10:96","nodeType":"VariableDeclaration","scope":19817,"src":"1488:18:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19771,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1488:7:96","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1456:51:96"},"returnParameters":{"id":19777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19776,"mutability":"mutable","name":"validationData","nameLocation":"1552:14:96","nodeType":"VariableDeclaration","scope":19817,"src":"1544:22:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19775,"name":"uint256","nodeType":"ElementaryTypeName","src":"1544:7:96","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1543:24:96"},"scope":19818,"src":"1429:541:96","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":19819,"src":"480:1492:96","usedErrors":[]}],"src":"41:1932:96"},"id":96},"contracts/test/TestHelpers.sol":{"ast":{"absolutePath":"contracts/test/TestHelpers.sol","exportedSymbols":{"TestHelpers":[19882],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19883,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19820,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:97"},{"absolutePath":"contracts/core/Helpers.sol","file":"../core/Helpers.sol","id":19821,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19883,"sourceUnit":9991,"src":"62:29:97","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"TestHelpers","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":19882,"linearizedBaseContracts":[19882],"name":"TestHelpers","nameLocation":"102:11:97","nodeType":"ContractDefinition","nodes":[{"body":{"id":19833,"nodeType":"Block","src":"215:60:97","statements":[{"expression":{"arguments":[{"id":19830,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19823,"src":"253:14:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19829,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9820,"src":"232:20:97","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":19831,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"232:36:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":19828,"id":19832,"nodeType":"Return","src":"225:43:97"}]},"functionSelector":"a4b2282e","id":19834,"implemented":true,"kind":"function","modifiers":[],"name":"parseValidationData","nameLocation":"130:19:97","nodeType":"FunctionDefinition","parameters":{"id":19824,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19823,"mutability":"mutable","name":"validationData","nameLocation":"155:14:97","nodeType":"VariableDeclaration","scope":19834,"src":"150:19:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19822,"name":"uint","nodeType":"ElementaryTypeName","src":"150:4:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"149:21:97"},"returnParameters":{"id":19828,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19827,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19834,"src":"192:21:97","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":19826,"nodeType":"UserDefinedTypeName","pathNode":{"id":19825,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"192:14:97"},"referencedDeclaration":9761,"src":"192:14:97","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"191:23:97"},"scope":19882,"src":"121:154:97","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":19849,"nodeType":"Block","src":"410:84:97","statements":[{"expression":{"arguments":[{"id":19845,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19836,"src":"447:14:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":19846,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19838,"src":"463:23:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19844,"name":"_intersectTimeRange","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9905,"src":"427:19:97","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_struct$_ValidationData_$9761_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (struct ValidationData memory)"}},"id":19847,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"427:60:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":19843,"id":19848,"nodeType":"Return","src":"420:67:97"}]},"functionSelector":"4fe5f5cf","id":19850,"implemented":true,"kind":"function","modifiers":[],"name":"intersectTimeRange","nameLocation":"290:18:97","nodeType":"FunctionDefinition","parameters":{"id":19839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19836,"mutability":"mutable","name":"validationData","nameLocation":"317:14:97","nodeType":"VariableDeclaration","scope":19850,"src":"309:22:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19835,"name":"uint256","nodeType":"ElementaryTypeName","src":"309:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19838,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"341:23:97","nodeType":"VariableDeclaration","scope":19850,"src":"333:31:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19837,"name":"uint256","nodeType":"ElementaryTypeName","src":"333:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"308:57:97"},"returnParameters":{"id":19843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19842,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19850,"src":"387:21:97","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":19841,"nodeType":"UserDefinedTypeName","pathNode":{"id":19840,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"387:14:97"},"referencedDeclaration":9761,"src":"387:14:97","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"386:23:97"},"scope":19882,"src":"281:213:97","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":19862,"nodeType":"Block","src":"592:49:97","statements":[{"expression":{"arguments":[{"id":19859,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19853,"src":"629:4:97","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData memory"}],"id":19858,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9942,"src":"609:19:97","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_ValidationData_$9761_memory_ptr_$returns$_t_uint256_$","typeString":"function (struct ValidationData memory) pure returns (uint256)"}},"id":19860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"609:25:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19857,"id":19861,"nodeType":"Return","src":"602:32:97"}]},"functionSelector":"24d3cde6","id":19863,"implemented":true,"kind":"function","modifiers":[],"name":"packValidationDataStruct","nameLocation":"509:24:97","nodeType":"FunctionDefinition","parameters":{"id":19854,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19853,"mutability":"mutable","name":"data","nameLocation":"556:4:97","nodeType":"VariableDeclaration","scope":19863,"src":"534:26:97","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":19852,"nodeType":"UserDefinedTypeName","pathNode":{"id":19851,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":9761,"src":"534:14:97"},"referencedDeclaration":9761,"src":"534:14:97","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$9761_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"533:28:97"},"returnParameters":{"id":19857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19856,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19863,"src":"583:7:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19855,"name":"uint256","nodeType":"ElementaryTypeName","src":"583:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"582:9:97"},"scope":19882,"src":"500:141:97","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":19880,"nodeType":"Block","src":"759:78:97","statements":[{"expression":{"arguments":[{"id":19875,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19865,"src":"796:9:97","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":19876,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19867,"src":"807:10:97","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":19877,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19869,"src":"819:10:97","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":19874,"name":"_packValidationData","nodeType":"Identifier","overloadedDeclarations":[9942,9980],"referencedDeclaration":9980,"src":"776:19:97","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint48_$_t_uint48_$returns$_t_uint256_$","typeString":"function (bool,uint48,uint48) pure returns (uint256)"}},"id":19878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"776:54:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19873,"id":19879,"nodeType":"Return","src":"769:61:97"}]},"functionSelector":"b059e2fa","id":19881,"implemented":true,"kind":"function","modifiers":[],"name":"packValidationData","nameLocation":"656:18:97","nodeType":"FunctionDefinition","parameters":{"id":19870,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19865,"mutability":"mutable","name":"sigFailed","nameLocation":"680:9:97","nodeType":"VariableDeclaration","scope":19881,"src":"675:14:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":19864,"name":"bool","nodeType":"ElementaryTypeName","src":"675:4:97","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":19867,"mutability":"mutable","name":"validUntil","nameLocation":"698:10:97","nodeType":"VariableDeclaration","scope":19881,"src":"691:17:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19866,"name":"uint48","nodeType":"ElementaryTypeName","src":"691:6:97","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":19869,"mutability":"mutable","name":"validAfter","nameLocation":"717:10:97","nodeType":"VariableDeclaration","scope":19881,"src":"710:17:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":19868,"name":"uint48","nodeType":"ElementaryTypeName","src":"710:6:97","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"674:54:97"},"returnParameters":{"id":19873,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19872,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19881,"src":"750:7:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19871,"name":"uint256","nodeType":"ElementaryTypeName","src":"750:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"749:9:97"},"scope":19882,"src":"647:190:97","stateMutability":"pure","virtual":false,"visibility":"public"}],"scope":19883,"src":"93:746:97","usedErrors":[]}],"src":"36:804:97"},"id":97},"contracts/test/TestOracle.sol":{"ast":{"absolutePath":"contracts/test/TestOracle.sol","exportedSymbols":{"IOracle":[13149],"TestOracle":[19901]},"id":19902,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":19884,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:98"},{"absolutePath":"contracts/samples/IOracle.sol","file":"../samples/IOracle.sol","id":19885,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19902,"sourceUnit":13150,"src":"62:32:98","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19886,"name":"IOracle","nodeType":"IdentifierPath","referencedDeclaration":13149,"src":"119:7:98"},"id":19887,"nodeType":"InheritanceSpecifier","src":"119:7:98"}],"canonicalName":"TestOracle","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":19901,"linearizedBaseContracts":[19901,13149],"name":"TestOracle","nameLocation":"105:10:98","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[13148],"body":{"id":19899,"nodeType":"Block","src":"232:37:98","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19895,"name":"ethOutput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19889,"src":"249:9:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"32","id":19896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"261:1:98","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"249:13:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":19894,"id":19898,"nodeType":"Return","src":"242:20:98"}]},"functionSelector":"d1eca9cf","id":19900,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEth","nameLocation":"142:18:98","nodeType":"FunctionDefinition","overrides":{"id":19891,"nodeType":"OverrideSpecifier","overrides":[],"src":"194:8:98"},"parameters":{"id":19890,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19889,"mutability":"mutable","name":"ethOutput","nameLocation":"169:9:98","nodeType":"VariableDeclaration","scope":19900,"src":"161:17:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19888,"name":"uint256","nodeType":"ElementaryTypeName","src":"161:7:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"160:19:98"},"returnParameters":{"id":19894,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19893,"mutability":"mutable","name":"tokenInput","nameLocation":"220:10:98","nodeType":"VariableDeclaration","scope":19900,"src":"212:18:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19892,"name":"uint256","nodeType":"ElementaryTypeName","src":"212:7:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"211:20:98"},"scope":19901,"src":"133:136:98","stateMutability":"pure","virtual":false,"visibility":"external"}],"scope":19902,"src":"96:175:98","usedErrors":[]}],"src":"36:236:98"},"id":98},"contracts/test/TestPaymasterAcceptAll.sol":{"ast":{"absolutePath":"contracts/test/TestPaymasterAcceptAll.sol","exportedSymbols":{"BasePaymaster":[7528],"Context":[5151],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"TestPaymasterAcceptAll":[19960],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":19961,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":19903,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:99"},{"absolutePath":"contracts/core/BasePaymaster.sol","file":"../core/BasePaymaster.sol","id":19904,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19961,"sourceUnit":7529,"src":"67:35:99","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19906,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"211:13:99"},"id":19907,"nodeType":"InheritanceSpecifier","src":"211:13:99"}],"canonicalName":"TestPaymasterAcceptAll","contractDependencies":[],"contractKind":"contract","documentation":{"id":19905,"nodeType":"StructuredDocumentation","src":"104:71:99","text":" test paymaster, that pays for everything, without any check."},"fullyImplemented":true,"id":19960,"linearizedBaseContracts":[19960,7528,2933,5151,10861],"name":"TestPaymasterAcceptAll","nameLocation":"185:22:99","nodeType":"ContractDefinition","nodes":[{"body":{"id":19928,"nodeType":"Block","src":"296:196:99","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":19916,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"407:2:99","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":19917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"407:9:99","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":19918,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"420:3:99","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":19919,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"420:10:99","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"407:23:99","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19927,"nodeType":"IfStatement","src":"403:82:99","trueBody":{"id":19926,"nodeType":"Block","src":"432:53:99","statements":[{"expression":{"arguments":[{"expression":{"id":19922,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"464:2:99","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":19923,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"464:9:99","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19921,"name":"transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2912,"src":"446:17:99","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19924,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"446:28:99","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19925,"nodeType":"ExpressionStatement","src":"446:28:99"}]}}]},"id":19929,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19913,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19910,"src":"283:11:99","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":19914,"kind":"baseConstructorSpecifier","modifierName":{"id":19912,"name":"BasePaymaster","nodeType":"IdentifierPath","referencedDeclaration":7528,"src":"269:13:99"},"nodeType":"ModifierInvocation","src":"269:26:99"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19911,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19910,"mutability":"mutable","name":"_entryPoint","nameLocation":"256:11:99","nodeType":"VariableDeclaration","scope":19929,"src":"244:23:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19909,"nodeType":"UserDefinedTypeName","pathNode":{"id":19908,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"244:11:99"},"referencedDeclaration":10807,"src":"244:11:99","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"243:25:99"},"returnParameters":{"id":19915,"nodeType":"ParameterList","parameters":[],"src":"296:0:99"},"scope":19960,"src":"232:260:99","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[7373],"body":{"id":19958,"nodeType":"Block","src":"694:93:99","statements":[{"expression":{"components":[{"id":19944,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19932,"src":"705:6:99","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},{"id":19945,"name":"userOpHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19934,"src":"713:10:99","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":19946,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19936,"src":"725:7:99","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":19947,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"704:29:99","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_UserOperation_$10993_calldata_ptr_$_t_bytes32_$_t_uint256_$","typeString":"tuple(struct UserOperation calldata,bytes32,uint256)"}},"id":19948,"nodeType":"ExpressionStatement","src":"704:29:99"},{"expression":{"components":[{"hexValue":"","id":19949,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"751:2:99","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19950,"name":"maxCost","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19936,"src":"755:7:99","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3132333435","id":19951,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"766:5:99","typeDescriptions":{"typeIdentifier":"t_rational_12345_by_1","typeString":"int_const 12345"},"value":"12345"},"src":"755:16:99","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":19954,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"778:1:99","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":19955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"755:24:99","trueExpression":{"hexValue":"31","id":19953,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"774:1:99","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":19956,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"750:30:99","typeDescriptions":{"typeIdentifier":"t_tuple$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$_t_uint8_$","typeString":"tuple(literal_string \"\",uint8)"}},"functionReturnParameters":19943,"id":19957,"nodeType":"Return","src":"743:37:99"}]},"id":19959,"implemented":true,"kind":"function","modifiers":[],"name":"_validatePaymasterUserOp","nameLocation":"507:24:99","nodeType":"FunctionDefinition","overrides":{"id":19938,"nodeType":"OverrideSpecifier","overrides":[],"src":"621:8:99"},"parameters":{"id":19937,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19932,"mutability":"mutable","name":"userOp","nameLocation":"555:6:99","nodeType":"VariableDeclaration","scope":19959,"src":"532:29:99","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19931,"nodeType":"UserDefinedTypeName","pathNode":{"id":19930,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"532:13:99"},"referencedDeclaration":10993,"src":"532:13:99","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19934,"mutability":"mutable","name":"userOpHash","nameLocation":"571:10:99","nodeType":"VariableDeclaration","scope":19959,"src":"563:18:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19933,"name":"bytes32","nodeType":"ElementaryTypeName","src":"563:7:99","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":19936,"mutability":"mutable","name":"maxCost","nameLocation":"591:7:99","nodeType":"VariableDeclaration","scope":19959,"src":"583:15:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19935,"name":"uint256","nodeType":"ElementaryTypeName","src":"583:7:99","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"531:68:99"},"returnParameters":{"id":19943,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19940,"mutability":"mutable","name":"context","nameLocation":"661:7:99","nodeType":"VariableDeclaration","scope":19959,"src":"648:20:99","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":19939,"name":"bytes","nodeType":"ElementaryTypeName","src":"648:5:99","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":19942,"mutability":"mutable","name":"validationData","nameLocation":"678:14:99","nodeType":"VariableDeclaration","scope":19959,"src":"670:22:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19941,"name":"uint256","nodeType":"ElementaryTypeName","src":"670:7:99","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"647:46:99"},"scope":19960,"src":"498:289:99","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":19961,"src":"176:613:99","usedErrors":[]}],"src":"41:749:99"},"id":99},"contracts/test/TestRevertAccount.sol":{"ast":{"absolutePath":"contracts/test/TestRevertAccount.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TestRevertAccount":[20014],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":20015,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":19962,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:100"},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../samples/SimpleAccount.sol","id":19963,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20015,"sourceUnit":14142,"src":"108:38:100","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19964,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"177:8:100"},"id":19965,"nodeType":"InheritanceSpecifier","src":"177:8:100"}],"canonicalName":"TestRevertAccount","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20014,"linearizedBaseContracts":[20014,10569],"name":"TestRevertAccount","nameLocation":"156:17:100","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":19968,"mutability":"mutable","name":"ep","nameLocation":"212:2:100","nodeType":"VariableDeclaration","scope":20014,"src":"192:22:100","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19967,"nodeType":"UserDefinedTypeName","pathNode":{"id":19966,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"192:11:100"},"referencedDeclaration":10807,"src":"192:11:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"private"},{"body":{"id":19978,"nodeType":"Block","src":"257:25:100","statements":[{"expression":{"id":19976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":19974,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19968,"src":"267:2:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19975,"name":"_ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19971,"src":"272:3:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"267:8:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":19977,"nodeType":"ExpressionStatement","src":"267:8:100"}]},"id":19979,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19971,"mutability":"mutable","name":"_ep","nameLocation":"244:3:100","nodeType":"VariableDeclaration","scope":19979,"src":"232:15:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":19970,"nodeType":"UserDefinedTypeName","pathNode":{"id":19969,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"232:11:100"},"referencedDeclaration":10807,"src":"232:11:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"231:17:100"},"returnParameters":{"id":19973,"nodeType":"ParameterList","parameters":[],"src":"257:0:100"},"scope":20014,"src":"220:62:100","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[10568],"body":{"id":20005,"nodeType":"Block","src":"429:91:100","statements":[{"expression":{"arguments":[{"arguments":[{"id":19999,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"489:4:100","typeDescriptions":{"typeIdentifier":"t_contract$_TestRevertAccount_$20014","typeString":"contract TestRevertAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TestRevertAccount_$20014","typeString":"contract TestRevertAccount"}],"id":19998,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"481:7:100","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19997,"name":"address","nodeType":"ElementaryTypeName","src":"481:7:100","typeDescriptions":{}}},"id":20000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"481:13:100","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19992,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19968,"src":"439:2:100","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":19994,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":10941,"src":"439:12:100","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":19996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":19995,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19986,"src":"460:19:100","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"439:41:100","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":20001,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"439:56:100","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20002,"nodeType":"ExpressionStatement","src":"439:56:100"},{"expression":{"hexValue":"30","id":20003,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"512:1:100","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":19991,"id":20004,"nodeType":"Return","src":"505:8:100"}]},"functionSelector":"3a871cdd","id":20006,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"297:14:100","nodeType":"FunctionDefinition","overrides":{"id":19988,"nodeType":"OverrideSpecifier","overrides":[],"src":"387:8:100"},"parameters":{"id":19987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19982,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20006,"src":"312:22:100","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":19981,"nodeType":"UserDefinedTypeName","pathNode":{"id":19980,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"312:13:100"},"referencedDeclaration":10993,"src":"312:13:100","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":19984,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20006,"src":"336:7:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19983,"name":"bytes32","nodeType":"ElementaryTypeName","src":"336:7:100","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":19986,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"353:19:100","nodeType":"VariableDeclaration","scope":20006,"src":"345:27:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19985,"name":"uint256","nodeType":"ElementaryTypeName","src":"345:7:100","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"311:62:100"},"returnParameters":{"id":19991,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19990,"mutability":"mutable","name":"validationData","nameLocation":"413:14:100","nodeType":"VariableDeclaration","scope":20006,"src":"405:22:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19989,"name":"uint256","nodeType":"ElementaryTypeName","src":"405:7:100","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"404:24:100"},"scope":20014,"src":"288:232:100","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":20012,"nodeType":"Block","src":"573:66:100","statements":[{"AST":{"nodeType":"YulBlock","src":"592:41:100","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"613:1:100","type":"","value":"0"},{"name":"length","nodeType":"YulIdentifier","src":"616:6:100"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"606:6:100"},"nodeType":"YulFunctionCall","src":"606:17:100"},"nodeType":"YulExpressionStatement","src":"606:17:100"}]},"evmVersion":"london","externalReferences":[{"declaration":20008,"isOffset":false,"isSlot":false,"src":"616:6:100","valueSize":1}],"id":20011,"nodeType":"InlineAssembly","src":"583:50:100"}]},"functionSelector":"be76c6ef","id":20013,"implemented":true,"kind":"function","modifiers":[],"name":"revertLong","nameLocation":"535:10:100","nodeType":"FunctionDefinition","parameters":{"id":20009,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20008,"mutability":"mutable","name":"length","nameLocation":"554:6:100","nodeType":"VariableDeclaration","scope":20013,"src":"546:14:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20007,"name":"uint256","nodeType":"ElementaryTypeName","src":"546:7:100","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"545:16:100"},"returnParameters":{"id":20010,"nodeType":"ParameterList","parameters":[],"src":"573:0:100"},"scope":20014,"src":"526:113:100","stateMutability":"pure","virtual":false,"visibility":"public"}],"scope":20015,"src":"147:494:100","usedErrors":[]}],"src":"41:601:100"},"id":100},"contracts/test/TestSignatureAggregator.sol":{"ast":{"absolutePath":"contracts/test/TestSignatureAggregator.sol","exportedSymbols":{"Address":[5129],"BaseAccount":[7308],"ECDSA":[5828],"ERC1967Upgrade":[3312],"IAccount":[10569],"IAggregator":[10603],"IBeacon":[3374],"IERC1155Receiver":[3754],"IERC165":[5840],"IERC1822Proxiable":[2957],"IERC721Receiver":[4779],"IERC777Recipient":[4799],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"Initializable":[3543],"Math":[6705],"SimpleAccount":[14141],"StorageSlot":[5292],"Strings":[5467],"TestSignatureAggregator":[20159],"TokenCallbackHandler":[17937],"UUPSUpgradeable":[3659],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":20160,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20016,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:101"},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"../interfaces/IAggregator.sol","id":20017,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20160,"sourceUnit":10604,"src":"99:39:101","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":20018,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20160,"sourceUnit":10808,"src":"139:39:101","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/samples/SimpleAccount.sol","file":"../samples/SimpleAccount.sol","id":20019,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20160,"sourceUnit":14142,"src":"179:38:101","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20021,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":10603,"src":"354:11:101"},"id":20022,"nodeType":"InheritanceSpecifier","src":"354:11:101"}],"canonicalName":"TestSignatureAggregator","contractDependencies":[],"contractKind":"contract","documentation":{"id":20020,"nodeType":"StructuredDocumentation","src":"219:98:101","text":" test signature aggregator.\n the aggregated signature is the SUM of the nonce fields.."},"fullyImplemented":true,"id":20159,"linearizedBaseContracts":[20159,10603],"name":"TestSignatureAggregator","nameLocation":"327:23:101","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[10583],"body":{"id":20086,"nodeType":"Block","src":"516:395:101","statements":[{"assignments":[20034],"declarations":[{"constant":false,"id":20034,"mutability":"mutable","name":"sum","nameLocation":"531:3:101","nodeType":"VariableDeclaration","scope":20086,"src":"526:8:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20033,"name":"uint","nodeType":"ElementaryTypeName","src":"526:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20036,"initialValue":{"hexValue":"30","id":20035,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"537:1:101","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"526:12:101"},{"body":{"id":20059,"nodeType":"Block","src":"590:80:101","statements":[{"assignments":[20049],"declarations":[{"constant":false,"id":20049,"mutability":"mutable","name":"nonce","nameLocation":"609:5:101","nodeType":"VariableDeclaration","scope":20059,"src":"604:10:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20048,"name":"uint","nodeType":"ElementaryTypeName","src":"604:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20054,"initialValue":{"expression":{"baseExpression":{"id":20050,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20027,"src":"617:7:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":20052,"indexExpression":{"id":20051,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20038,"src":"625:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"617:10:101","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"617:16:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"604:29:101"},{"expression":{"id":20057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20055,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20034,"src":"647:3:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":20056,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20049,"src":"654:5:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"647:12:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20058,"nodeType":"ExpressionStatement","src":"647:12:101"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20041,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20038,"src":"565:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":20042,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20027,"src":"569:7:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":20043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"569:14:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"565:18:101","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20060,"initializationExpression":{"assignments":[20038],"declarations":[{"constant":false,"id":20038,"mutability":"mutable","name":"i","nameLocation":"558:1:101","nodeType":"VariableDeclaration","scope":20060,"src":"553:6:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20037,"name":"uint","nodeType":"ElementaryTypeName","src":"553:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20040,"initialValue":{"hexValue":"30","id":20039,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"562:1:101","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"553:10:101"},"loopExpression":{"expression":{"id":20046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"585:3:101","subExpression":{"id":20045,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20038,"src":"585:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20047,"nodeType":"ExpressionStatement","src":"585:3:101"},"nodeType":"ForStatement","src":"548:122:101"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20065,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20062,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20029,"src":"687:9:101","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":20063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"687:16:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3332","id":20064,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"707:2:101","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"687:22:101","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546573745369676e617475726556616c696461746f723a20736967206d7573742062652075696e74","id":20066,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"711:42:101","typeDescriptions":{"typeIdentifier":"t_stringliteral_99d9e6a25b1da7bdaea8c6d854d5639998d740d025b4bc7ada8394264a61b31c","typeString":"literal_string \"TestSignatureValidator: sig must be uint\""},"value":"TestSignatureValidator: sig must be uint"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_99d9e6a25b1da7bdaea8c6d854d5639998d740d025b4bc7ada8394264a61b31c","typeString":"literal_string \"TestSignatureValidator: sig must be uint\""}],"id":20061,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"679:7:101","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":20067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"679:75:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20068,"nodeType":"ExpressionStatement","src":"679:75:101"},{"assignments":[20070],"declarations":[{"constant":false,"id":20070,"mutability":"mutable","name":"sig","nameLocation":"770:3:101","nodeType":"VariableDeclaration","scope":20086,"src":"765:8:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20069,"name":"uint","nodeType":"ElementaryTypeName","src":"765:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20078,"initialValue":{"arguments":[{"id":20073,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20029,"src":"788:9:101","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":20075,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"800:4:101","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":20074,"name":"uint","nodeType":"ElementaryTypeName","src":"800:4:101","typeDescriptions":{}}}],"id":20076,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"799:6:101","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":20071,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"777:3:101","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":20072,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"777:10:101","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":20077,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"777:29:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"764:42:101"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20080,"name":"sig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20070,"src":"824:3:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":20081,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20034,"src":"831:3:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"824:10:101","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"546573745369676e617475726556616c696461746f723a2061676772656761746564207369676e6174757265206d69736d6174636820286e6f6e63652073756d29","id":20083,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"836:67:101","typeDescriptions":{"typeIdentifier":"t_stringliteral_8d9d685720b347b5074ab5a98aba04c9189b0f93128711db984ab9c1d90c4824","typeString":"literal_string \"TestSignatureValidator: aggregated signature mismatch (nonce sum)\""},"value":"TestSignatureValidator: aggregated signature mismatch (nonce sum)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8d9d685720b347b5074ab5a98aba04c9189b0f93128711db984ab9c1d90c4824","typeString":"literal_string \"TestSignatureValidator: aggregated signature mismatch (nonce sum)\""}],"id":20079,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"816:7:101","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":20084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"816:88:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20085,"nodeType":"ExpressionStatement","src":"816:88:101"}]},"documentation":{"id":20023,"nodeType":"StructuredDocumentation","src":"373:27:101","text":"@inheritdoc IAggregator"},"functionSelector":"e3563a4f","id":20087,"implemented":true,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"414:18:101","nodeType":"FunctionDefinition","overrides":{"id":20031,"nodeType":"OverrideSpecifier","overrides":[],"src":"507:8:101"},"parameters":{"id":20030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20027,"mutability":"mutable","name":"userOps","nameLocation":"458:7:101","nodeType":"VariableDeclaration","scope":20087,"src":"433:32:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":20025,"nodeType":"UserDefinedTypeName","pathNode":{"id":20024,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"433:13:101"},"referencedDeclaration":10993,"src":"433:13:101","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":20026,"nodeType":"ArrayTypeName","src":"433:15:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":20029,"mutability":"mutable","name":"signature","nameLocation":"482:9:101","nodeType":"VariableDeclaration","scope":20087,"src":"467:24:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20028,"name":"bytes","nodeType":"ElementaryTypeName","src":"467:5:101","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"432:60:101"},"returnParameters":{"id":20032,"nodeType":"ParameterList","parameters":[],"src":"516:0:101"},"scope":20159,"src":"405:506:101","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[10592],"body":{"id":20098,"nodeType":"Block","src":"1047:26:101","statements":[{"expression":{"hexValue":"","id":20096,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1064:2:101","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"functionReturnParameters":20095,"id":20097,"nodeType":"Return","src":"1057:9:101"}]},"documentation":{"id":20088,"nodeType":"StructuredDocumentation","src":"917:27:101","text":"@inheritdoc IAggregator"},"functionSelector":"64c530cd","id":20099,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"958:23:101","nodeType":"FunctionDefinition","parameters":{"id":20092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20091,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20099,"src":"982:22:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":20090,"nodeType":"UserDefinedTypeName","pathNode":{"id":20089,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"982:13:101"},"referencedDeclaration":10993,"src":"982:13:101","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"981:24:101"},"returnParameters":{"id":20095,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20094,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20099,"src":"1033:12:101","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20093,"name":"bytes","nodeType":"ElementaryTypeName","src":"1033:5:101","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1032:14:101"},"scope":20159,"src":"949:124:101","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[10602],"body":{"id":20138,"nodeType":"Block","src":"1278:160:101","statements":[{"assignments":[20110],"declarations":[{"constant":false,"id":20110,"mutability":"mutable","name":"sum","nameLocation":"1293:3:101","nodeType":"VariableDeclaration","scope":20138,"src":"1288:8:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20109,"name":"uint","nodeType":"ElementaryTypeName","src":"1288:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20112,"initialValue":{"hexValue":"30","id":20111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1299:1:101","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"1288:12:101"},{"body":{"id":20131,"nodeType":"Block","src":"1352:48:101","statements":[{"expression":{"id":20129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20124,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20110,"src":"1366:3:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"expression":{"baseExpression":{"id":20125,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20104,"src":"1373:7:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":20127,"indexExpression":{"id":20126,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20114,"src":"1381:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1373:10:101","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"1373:16:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1366:23:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20130,"nodeType":"ExpressionStatement","src":"1366:23:101"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20117,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20114,"src":"1327:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":20118,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20104,"src":"1331:7:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation calldata[] calldata"}},"id":20119,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1331:14:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1327:18:101","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20132,"initializationExpression":{"assignments":[20114],"declarations":[{"constant":false,"id":20114,"mutability":"mutable","name":"i","nameLocation":"1320:1:101","nodeType":"VariableDeclaration","scope":20132,"src":"1315:6:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20113,"name":"uint","nodeType":"ElementaryTypeName","src":"1315:4:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20116,"initialValue":{"hexValue":"30","id":20115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1324:1:101","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"1315:10:101"},"loopExpression":{"expression":{"id":20122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"1347:3:101","subExpression":{"id":20121,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20114,"src":"1347:1:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20123,"nodeType":"ExpressionStatement","src":"1347:3:101"},"nodeType":"ForStatement","src":"1310:90:101"},{"expression":{"arguments":[{"id":20135,"name":"sum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20110,"src":"1427:3:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20133,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1416:3:101","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":20134,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"1416:10:101","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":20136,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1416:15:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":20108,"id":20137,"nodeType":"Return","src":"1409:22:101"}]},"documentation":{"id":20100,"nodeType":"StructuredDocumentation","src":"1079:74:101","text":" dummy test aggregator: sum all nonce values of UserOps."},"functionSelector":"275e2d79","id":20139,"implemented":true,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"1167:19:101","nodeType":"FunctionDefinition","parameters":{"id":20105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20104,"mutability":"mutable","name":"userOps","nameLocation":"1212:7:101","nodeType":"VariableDeclaration","scope":20139,"src":"1187:32:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":20102,"nodeType":"UserDefinedTypeName","pathNode":{"id":20101,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"1187:13:101"},"referencedDeclaration":10993,"src":"1187:13:101","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"id":20103,"nodeType":"ArrayTypeName","src":"1187:15:101","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$10993_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"1186:34:101"},"returnParameters":{"id":20108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20107,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"1257:19:101","nodeType":"VariableDeclaration","scope":20139,"src":"1244:32:101","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20106,"name":"bytes","nodeType":"ElementaryTypeName","src":"1244:5:101","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1243:34:101"},"scope":20159,"src":"1158:280:101","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":20157,"nodeType":"Block","src":"1776:61:101","statements":[{"expression":{"arguments":[{"id":20154,"name":"delay","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20145,"src":"1824:5:101","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":20148,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20143,"src":"1786:10:101","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":20150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addStake","nodeType":"MemberAccess","referencedDeclaration":10947,"src":"1786:19:101","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$","typeString":"function (uint32) payable external"}},"id":20153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":20151,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1813:3:101","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":20152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"1813:9:101","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"1786:37:101","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_uint32_$returns$__$value","typeString":"function (uint32) payable external"}},"id":20155,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1786:44:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20156,"nodeType":"ExpressionStatement","src":"1786:44:101"}]},"documentation":{"id":20140,"nodeType":"StructuredDocumentation","src":"1444:254:101","text":" Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call.\n @param entryPoint - the EntryPoint to send the stake to.\n @param delay - the new lock duration before the deposit can be withdrawn."},"functionSelector":"45171159","id":20158,"implemented":true,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"1712:8:101","nodeType":"FunctionDefinition","parameters":{"id":20146,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20143,"mutability":"mutable","name":"entryPoint","nameLocation":"1733:10:101","nodeType":"VariableDeclaration","scope":20158,"src":"1721:22:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20142,"nodeType":"UserDefinedTypeName","pathNode":{"id":20141,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"1721:11:101"},"referencedDeclaration":10807,"src":"1721:11:101","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":20145,"mutability":"mutable","name":"delay","nameLocation":"1752:5:101","nodeType":"VariableDeclaration","scope":20158,"src":"1745:12:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":20144,"name":"uint32","nodeType":"ElementaryTypeName","src":"1745:6:101","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"1720:38:101"},"returnParameters":{"id":20147,"nodeType":"ParameterList","parameters":[],"src":"1776:0:101"},"scope":20159,"src":"1703:134:101","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":20160,"src":"318:1521:101","usedErrors":[]}],"src":"36:1804:101"},"id":101},"contracts/test/TestToken.sol":{"ast":{"absolutePath":"contracts/test/TestToken.sol","exportedSymbols":{"Context":[5151],"ERC20":[4341],"IERC20":[4419],"IERC20Metadata":[4444],"TestToken":[20208]},"id":20209,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20161,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:102"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/ERC20.sol","file":"@openzeppelin/contracts/token/ERC20/ERC20.sol","id":20162,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20209,"sourceUnit":4342,"src":"62:55:102","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20163,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":4341,"src":"141:5:102"},"id":20164,"nodeType":"InheritanceSpecifier","src":"141:5:102"}],"canonicalName":"TestToken","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20208,"linearizedBaseContracts":[20208,4341,4444,4419,5151],"name":"TestToken","nameLocation":"128:9:102","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"ccd12eee","id":20167,"mutability":"mutable","name":"decimalsOverride","nameLocation":"166:16:102","nodeType":"VariableDeclaration","scope":20208,"src":"153:34:102","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20165,"name":"uint8","nodeType":"ElementaryTypeName","src":"153:5:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"hexValue":"3138","id":20166,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"185:2:102","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"visibility":"public"},{"body":{"id":20174,"nodeType":"Block","src":"295:7:102","statements":[]},"id":20175,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"hexValue":"545354","id":20170,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"275:5:102","typeDescriptions":{"typeIdentifier":"t_stringliteral_20a94e575762ae205efd2d939940bb203cefdf1c455cc39ef343e287f43b70f4","typeString":"literal_string \"TST\""},"value":"TST"},{"hexValue":"54657374546f6b656e","id":20171,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"282:11:102","typeDescriptions":{"typeIdentifier":"t_stringliteral_98773c0a77836a29a7c5f4ab1a66bf2cd547cb12bf15ba74f84f027b91334da5","typeString":"literal_string \"TestToken\""},"value":"TestToken"}],"id":20172,"kind":"baseConstructorSpecifier","modifierName":{"id":20169,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":4341,"src":"269:5:102"},"nodeType":"ModifierInvocation","src":"269:25:102"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20168,"nodeType":"ParameterList","parameters":[],"src":"205:2:102"},"returnParameters":{"id":20173,"nodeType":"ParameterList","parameters":[],"src":"295:0:102"},"scope":20208,"src":"193:109:102","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":20187,"nodeType":"Block","src":"363:38:102","statements":[{"expression":{"arguments":[{"id":20183,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20177,"src":"379:6:102","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20184,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20179,"src":"387:6:102","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20182,"name":"_mint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4158,"src":"373:5:102","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":20185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"373:21:102","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20186,"nodeType":"ExpressionStatement","src":"373:21:102"}]},"functionSelector":"40c10f19","id":20188,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"317:4:102","nodeType":"FunctionDefinition","parameters":{"id":20180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20177,"mutability":"mutable","name":"sender","nameLocation":"330:6:102","nodeType":"VariableDeclaration","scope":20188,"src":"322:14:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20176,"name":"address","nodeType":"ElementaryTypeName","src":"322:7:102","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20179,"mutability":"mutable","name":"amount","nameLocation":"346:6:102","nodeType":"VariableDeclaration","scope":20188,"src":"338:14:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20178,"name":"uint256","nodeType":"ElementaryTypeName","src":"338:7:102","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"321:32:102"},"returnParameters":{"id":20181,"nodeType":"ParameterList","parameters":[],"src":"363:0:102"},"scope":20208,"src":"308:93:102","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[3829],"body":{"id":20196,"nodeType":"Block","src":"464:40:102","statements":[{"expression":{"id":20194,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20167,"src":"481:16:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":20193,"id":20195,"nodeType":"Return","src":"474:23:102"}]},"functionSelector":"313ce567","id":20197,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"416:8:102","nodeType":"FunctionDefinition","overrides":{"id":20190,"nodeType":"OverrideSpecifier","overrides":[],"src":"439:8:102"},"parameters":{"id":20189,"nodeType":"ParameterList","parameters":[],"src":"424:2:102"},"returnParameters":{"id":20193,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20192,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20197,"src":"457:5:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20191,"name":"uint8","nodeType":"ElementaryTypeName","src":"457:5:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"456:7:102"},"scope":20208,"src":"407:97:102","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":20206,"nodeType":"Block","src":"555:45:102","statements":[{"expression":{"id":20204,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20202,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20167,"src":"565:16:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20203,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20199,"src":"584:9:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"565:28:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":20205,"nodeType":"ExpressionStatement","src":"565:28:102"}]},"functionSelector":"7a1395aa","id":20207,"implemented":true,"kind":"function","modifiers":[],"name":"setDecimals","nameLocation":"519:11:102","nodeType":"FunctionDefinition","parameters":{"id":20200,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20199,"mutability":"mutable","name":"_decimals","nameLocation":"537:9:102","nodeType":"VariableDeclaration","scope":20207,"src":"531:15:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20198,"name":"uint8","nodeType":"ElementaryTypeName","src":"531:5:102","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"530:17:102"},"returnParameters":{"id":20201,"nodeType":"ParameterList","parameters":[],"src":"555:0:102"},"scope":20208,"src":"510:90:102","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":20209,"src":"119:483:102","usedErrors":[]}],"src":"36:567:102"},"id":102},"contracts/test/TestTokenValueBobaDepositPaymaster.sol":{"ast":{"absolutePath":"contracts/test/TestTokenValueBobaDepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"BobaDepositPaymaster":[11779],"Context":[5151],"IAggregator":[10603],"IBobaStraw":[13138],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"SafeERC20":[4761],"TestTokenValueBobaDepositPaymaster":[20245],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":20246,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20210,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:103"},{"absolutePath":"contracts/samples/BobaDepositPaymaster.sol","file":"../samples/BobaDepositPaymaster.sol","id":20211,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20246,"sourceUnit":11780,"src":"62:45:103","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20212,"name":"BobaDepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":11779,"src":"156:20:103"},"id":20213,"nodeType":"InheritanceSpecifier","src":"156:20:103"}],"canonicalName":"TestTokenValueBobaDepositPaymaster","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20245,"linearizedBaseContracts":[20245,11779,7528,2933,5151,10861],"name":"TestTokenValueBobaDepositPaymaster","nameLocation":"118:34:103","nodeType":"ContractDefinition","nodes":[{"body":{"id":20226,"nodeType":"Block","src":"298:7:103","statements":[]},"id":20227,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":20222,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20216,"src":"269:11:103","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":20223,"name":"ethPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20219,"src":"282:14:103","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}}],"id":20224,"kind":"baseConstructorSpecifier","modifierName":{"id":20221,"name":"BobaDepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":11779,"src":"248:20:103"},"nodeType":"ModifierInvocation","src":"248:49:103"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20220,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20216,"mutability":"mutable","name":"_entryPoint","nameLocation":"208:11:103","nodeType":"VariableDeclaration","scope":20227,"src":"196:23:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20215,"nodeType":"UserDefinedTypeName","pathNode":{"id":20214,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"196:11:103"},"referencedDeclaration":10807,"src":"196:11:103","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":20219,"mutability":"mutable","name":"ethPriceOracle","nameLocation":"232:14:103","nodeType":"VariableDeclaration","scope":20227,"src":"221:25:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"},"typeName":{"id":20218,"nodeType":"UserDefinedTypeName","pathNode":{"id":20217,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"221:10:103"},"referencedDeclaration":13138,"src":"221:10:103","typeDescriptions":{"typeIdentifier":"t_contract$_IBobaStraw_$13138","typeString":"contract IBobaStraw"}},"visibility":"internal"}],"src":"195:52:103"},"returnParameters":{"id":20225,"nodeType":"ParameterList","parameters":[],"src":"298:0:103"},"scope":20245,"src":"184:121:103","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":20243,"nodeType":"Block","src":"406:81:103","statements":[{"expression":{"arguments":[{"id":20239,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20230,"src":"463:5:103","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":20240,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20232,"src":"470:9:103","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20237,"name":"BobaDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11779,"src":"423:20:103","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_BobaDepositPaymaster_$11779_$","typeString":"type(contract BobaDepositPaymaster)"}},"id":20238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getTokenValueOfEth","nodeType":"MemberAccess","referencedDeclaration":11583,"src":"423:39:103","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_contract$_IERC20_$4419_$_t_uint256_$returns$_t_uint256_$","typeString":"function (contract IERC20,uint256) view returns (uint256)"}},"id":20241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"423:57:103","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20236,"id":20242,"nodeType":"Return","src":"416:64:103"}]},"functionSelector":"54fe0498","id":20244,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEthTest","nameLocation":"320:22:103","nodeType":"FunctionDefinition","parameters":{"id":20233,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20230,"mutability":"mutable","name":"token","nameLocation":"350:5:103","nodeType":"VariableDeclaration","scope":20244,"src":"343:12:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":20229,"nodeType":"UserDefinedTypeName","pathNode":{"id":20228,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"343:6:103"},"referencedDeclaration":4419,"src":"343:6:103","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":20232,"mutability":"mutable","name":"ethBought","nameLocation":"365:9:103","nodeType":"VariableDeclaration","scope":20244,"src":"357:17:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20231,"name":"uint256","nodeType":"ElementaryTypeName","src":"357:7:103","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"342:33:103"},"returnParameters":{"id":20236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20235,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20244,"src":"397:7:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20234,"name":"uint256","nodeType":"ElementaryTypeName","src":"397:7:103","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"396:9:103"},"scope":20245,"src":"311:176:103","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":20246,"src":"109:380:103","usedErrors":[]}],"src":"36:454:103"},"id":103},"contracts/test/TestTokenValueGPODepositPaymaster.sol":{"ast":{"absolutePath":"contracts/test/TestTokenValueGPODepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"Context":[5151],"GPODepositPaymaster":[13057],"IAggregator":[10603],"IBobaGasPriceOracle":[13071],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IPaymaster":[10861],"IStakeManager":[10966],"Ownable":[2933],"SafeERC20":[4761],"TestTokenValueGPODepositPaymaster":[20283],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":20284,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20247,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:104"},{"absolutePath":"contracts/samples/GPODepositPaymaster.sol","file":"../samples/GPODepositPaymaster.sol","id":20248,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20284,"sourceUnit":13058,"src":"62:44:104","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20249,"name":"GPODepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":13057,"src":"154:19:104"},"id":20250,"nodeType":"InheritanceSpecifier","src":"154:19:104"}],"canonicalName":"TestTokenValueGPODepositPaymaster","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20283,"linearizedBaseContracts":[20283,13057,7528,2933,5151,10861],"name":"TestTokenValueGPODepositPaymaster","nameLocation":"117:33:104","nodeType":"ContractDefinition","nodes":[{"body":{"id":20268,"nodeType":"Block","src":"391:7:104","statements":[]},"id":20269,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":20262,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20253,"src":"319:11:104","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},{"id":20263,"name":"_supportedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20255,"src":"332:15:104","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20264,"name":"_supportedTokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20257,"src":"349:23:104","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":20265,"name":"_gasPriceOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20259,"src":"374:15:104","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":20266,"kind":"baseConstructorSpecifier","modifierName":{"id":20261,"name":"GPODepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":13057,"src":"299:19:104"},"nodeType":"ModifierInvocation","src":"299:91:104"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20260,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20253,"mutability":"mutable","name":"_entryPoint","nameLocation":"205:11:104","nodeType":"VariableDeclaration","scope":20269,"src":"193:23:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20252,"nodeType":"UserDefinedTypeName","pathNode":{"id":20251,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"193:11:104"},"referencedDeclaration":10807,"src":"193:11:104","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":20255,"mutability":"mutable","name":"_supportedToken","nameLocation":"226:15:104","nodeType":"VariableDeclaration","scope":20269,"src":"218:23:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20254,"name":"address","nodeType":"ElementaryTypeName","src":"218:7:104","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20257,"mutability":"mutable","name":"_supportedTokenDecimals","nameLocation":"249:23:104","nodeType":"VariableDeclaration","scope":20269,"src":"243:29:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20256,"name":"uint8","nodeType":"ElementaryTypeName","src":"243:5:104","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":20259,"mutability":"mutable","name":"_gasPriceOracle","nameLocation":"282:15:104","nodeType":"VariableDeclaration","scope":20269,"src":"274:23:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20258,"name":"address","nodeType":"ElementaryTypeName","src":"274:7:104","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"192:106:104"},"returnParameters":{"id":20267,"nodeType":"ParameterList","parameters":[],"src":"391:0:104"},"scope":20283,"src":"181:217:104","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":20281,"nodeType":"Block","src":"485:73:104","statements":[{"expression":{"arguments":[{"id":20278,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20271,"src":"541:9:104","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20276,"name":"GPODepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13057,"src":"502:19:104","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_GPODepositPaymaster_$13057_$","typeString":"type(contract GPODepositPaymaster)"}},"id":20277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getTokenValueOfEth","nodeType":"MemberAccess","referencedDeclaration":12903,"src":"502:38:104","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":20279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"502:49:104","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20275,"id":20280,"nodeType":"Return","src":"495:56:104"}]},"functionSelector":"d4918378","id":20282,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEthTest","nameLocation":"413:22:104","nodeType":"FunctionDefinition","parameters":{"id":20272,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20271,"mutability":"mutable","name":"ethBought","nameLocation":"444:9:104","nodeType":"VariableDeclaration","scope":20282,"src":"436:17:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20270,"name":"uint256","nodeType":"ElementaryTypeName","src":"436:7:104","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"435:19:104"},"returnParameters":{"id":20275,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20274,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20282,"src":"476:7:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20273,"name":"uint256","nodeType":"ElementaryTypeName","src":"476:7:104","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"475:9:104"},"scope":20283,"src":"404:154:104","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":20284,"src":"108:452:104","usedErrors":[]}],"src":"36:525:104"},"id":104},"contracts/test/TestTokenValueManualDepositPaymaster.sol":{"ast":{"absolutePath":"contracts/test/TestTokenValueManualDepositPaymaster.sol","exportedSymbols":{"Address":[5129],"BasePaymaster":[7528],"Context":[5151],"IAggregator":[10603],"IERC20":[4419],"IERC20Permit":[4480],"IEntryPoint":[10807],"INonceManager":[10826],"IOracle":[13149],"IPaymaster":[10861],"IStakeManager":[10966],"ManualDepositPaymaster":[13817],"Ownable":[2933],"SafeERC20":[4761],"TestTokenValueManualDepositPaymaster":[20316],"UserOperation":[10993],"UserOperationLib":[11163],"ValidationData":[9761],"_intersectTimeRange":[9905],"_packValidationData":[9942,9980],"_parseValidationData":[9820],"calldataKeccak":[9990]},"id":20317,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20285,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:105"},{"absolutePath":"contracts/samples/ManualDepositPaymaster.sol","file":"../samples/ManualDepositPaymaster.sol","id":20286,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20317,"sourceUnit":13818,"src":"62:47:105","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20287,"name":"ManualDepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":13817,"src":"160:22:105"},"id":20288,"nodeType":"InheritanceSpecifier","src":"160:22:105"}],"canonicalName":"TestTokenValueManualDepositPaymaster","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20316,"linearizedBaseContracts":[20316,13817,7528,2933,5151,10861],"name":"TestTokenValueManualDepositPaymaster","nameLocation":"120:36:105","nodeType":"ContractDefinition","nodes":[{"body":{"id":20297,"nodeType":"Block","src":"263:7:105","statements":[]},"id":20298,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":20294,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20291,"src":"250:11:105","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}}],"id":20295,"kind":"baseConstructorSpecifier","modifierName":{"id":20293,"name":"ManualDepositPaymaster","nodeType":"IdentifierPath","referencedDeclaration":13817,"src":"227:22:105"},"nodeType":"ModifierInvocation","src":"227:35:105"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20292,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20291,"mutability":"mutable","name":"_entryPoint","nameLocation":"214:11:105","nodeType":"VariableDeclaration","scope":20298,"src":"202:23:105","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20290,"nodeType":"UserDefinedTypeName","pathNode":{"id":20289,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"202:11:105"},"referencedDeclaration":10807,"src":"202:11:105","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"201:25:105"},"returnParameters":{"id":20296,"nodeType":"ParameterList","parameters":[],"src":"263:0:105"},"scope":20316,"src":"190:80:105","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":20314,"nodeType":"Block","src":"371:83:105","statements":[{"expression":{"arguments":[{"id":20310,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20301,"src":"430:5:105","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},{"id":20311,"name":"ethBought","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20303,"src":"437:9:105","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20308,"name":"ManualDepositPaymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13817,"src":"388:22:105","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ManualDepositPaymaster_$13817_$","typeString":"type(contract ManualDepositPaymaster)"}},"id":20309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getTokenValueOfEth","nodeType":"MemberAccess","referencedDeclaration":13511,"src":"388:41:105","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_contract$_IERC20_$4419_$_t_uint256_$returns$_t_uint256_$","typeString":"function (contract IERC20,uint256) view returns (uint256)"}},"id":20312,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"388:59:105","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20307,"id":20313,"nodeType":"Return","src":"381:66:105"}]},"functionSelector":"54fe0498","id":20315,"implemented":true,"kind":"function","modifiers":[],"name":"getTokenValueOfEthTest","nameLocation":"285:22:105","nodeType":"FunctionDefinition","parameters":{"id":20304,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20301,"mutability":"mutable","name":"token","nameLocation":"315:5:105","nodeType":"VariableDeclaration","scope":20315,"src":"308:12:105","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"},"typeName":{"id":20300,"nodeType":"UserDefinedTypeName","pathNode":{"id":20299,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":4419,"src":"308:6:105"},"referencedDeclaration":4419,"src":"308:6:105","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$4419","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":20303,"mutability":"mutable","name":"ethBought","nameLocation":"330:9:105","nodeType":"VariableDeclaration","scope":20315,"src":"322:17:105","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20302,"name":"uint256","nodeType":"ElementaryTypeName","src":"322:7:105","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"307:33:105"},"returnParameters":{"id":20307,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20306,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20315,"src":"362:7:105","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20305,"name":"uint256","nodeType":"ElementaryTypeName","src":"362:7:105","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"361:9:105"},"scope":20316,"src":"276:178:105","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":20317,"src":"111:345:105","usedErrors":[]}],"src":"36:421:105"},"id":105},"contracts/test/TestUtil.sol":{"ast":{"absolutePath":"contracts/test/TestUtil.sol","exportedSymbols":{"TestUtil":[20337],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":20338,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":20318,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:106"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"../interfaces/UserOperation.sol","id":20319,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20338,"sourceUnit":11164,"src":"62:41:106","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"TestUtil","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20337,"linearizedBaseContracts":[20337],"name":"TestUtil","nameLocation":"114:8:106","nodeType":"ContractDefinition","nodes":[{"global":false,"id":20323,"libraryName":{"id":20320,"name":"UserOperationLib","nodeType":"IdentifierPath","referencedDeclaration":11163,"src":"135:16:106"},"nodeType":"UsingForDirective","src":"129:41:106","typeName":{"id":20322,"nodeType":"UserDefinedTypeName","pathNode":{"id":20321,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"156:13:106"},"referencedDeclaration":10993,"src":"156:13:106","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}}},{"body":{"id":20335,"nodeType":"Block","src":"259:33:106","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":20331,"name":"op","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20326,"src":"276:2:106","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"pack","nodeType":"MemberAccess","referencedDeclaration":11130,"src":"276:7:106","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$10993_calldata_ptr_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_UserOperation_$10993_calldata_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":20333,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"276:9:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":20330,"id":20334,"nodeType":"Return","src":"269:16:106"}]},"functionSelector":"3a24dea4","id":20336,"implemented":true,"kind":"function","modifiers":[],"name":"packUserOp","nameLocation":"185:10:106","nodeType":"FunctionDefinition","parameters":{"id":20327,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20326,"mutability":"mutable","name":"op","nameLocation":"219:2:106","nodeType":"VariableDeclaration","scope":20336,"src":"196:25:106","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":20325,"nodeType":"UserDefinedTypeName","pathNode":{"id":20324,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"196:13:106"},"referencedDeclaration":10993,"src":"196:13:106","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"195:27:106"},"returnParameters":{"id":20330,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20329,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20336,"src":"246:12:106","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20328,"name":"bytes","nodeType":"ElementaryTypeName","src":"246:5:106","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"245:14:106"},"scope":20337,"src":"176:116:106","stateMutability":"pure","virtual":false,"visibility":"external"}],"scope":20338,"src":"105:190:106","usedErrors":[]}],"src":"36:260:106"},"id":106},"contracts/test/TestWarmColdAccount.sol":{"ast":{"absolutePath":"contracts/test/TestWarmColdAccount.sol","exportedSymbols":{"IAccount":[10569],"IAggregator":[10603],"IEntryPoint":[10807],"INonceManager":[10826],"IStakeManager":[10966],"TestWarmColdAccount":[20448],"UserOperation":[10993],"UserOperationLib":[11163],"calldataKeccak":[9990]},"id":20449,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":20339,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:107"},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":20340,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20449,"sourceUnit":10808,"src":"108:39:107","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAccount.sol","file":"../interfaces/IAccount.sol","id":20341,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20449,"sourceUnit":10570,"src":"148:36:107","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20342,"name":"IAccount","nodeType":"IdentifierPath","referencedDeclaration":10569,"src":"439:8:107"},"id":20343,"nodeType":"InheritanceSpecifier","src":"439:8:107"}],"canonicalName":"TestWarmColdAccount","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20448,"linearizedBaseContracts":[20448,10569],"name":"TestWarmColdAccount","nameLocation":"416:19:107","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":20346,"mutability":"mutable","name":"ep","nameLocation":"474:2:107","nodeType":"VariableDeclaration","scope":20448,"src":"454:22:107","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20345,"nodeType":"UserDefinedTypeName","pathNode":{"id":20344,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"454:11:107"},"referencedDeclaration":10807,"src":"454:11:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"private"},{"constant":false,"functionSelector":"c19d93fb","id":20349,"mutability":"mutable","name":"state","nameLocation":"494:5:107","nodeType":"VariableDeclaration","scope":20448,"src":"482:21:107","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20347,"name":"uint","nodeType":"ElementaryTypeName","src":"482:4:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":20348,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"502:1:107","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"public"},{"body":{"id":20359,"nodeType":"Block","src":"546:25:107","statements":[{"expression":{"id":20357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20355,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20346,"src":"556:2:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20356,"name":"_ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20352,"src":"561:3:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"src":"556:8:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":20358,"nodeType":"ExpressionStatement","src":"556:8:107"}]},"id":20360,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20352,"mutability":"mutable","name":"_ep","nameLocation":"533:3:107","nodeType":"VariableDeclaration","scope":20360,"src":"521:15:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"},"typeName":{"id":20351,"nodeType":"UserDefinedTypeName","pathNode":{"id":20350,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":10807,"src":"521:11:107"},"referencedDeclaration":10807,"src":"521:11:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"520:17:107"},"returnParameters":{"id":20354,"nodeType":"ParameterList","parameters":[],"src":"546:0:107"},"scope":20448,"src":"509:62:107","stateMutability":"payable","virtual":false,"visibility":"public"},{"baseFunctions":[10568],"body":{"id":20426,"nodeType":"Block","src":"725:472:107","statements":[{"expression":{"arguments":[{"arguments":[{"id":20380,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"785:4:107","typeDescriptions":{"typeIdentifier":"t_contract$_TestWarmColdAccount_$20448","typeString":"contract TestWarmColdAccount"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TestWarmColdAccount_$20448","typeString":"contract TestWarmColdAccount"}],"id":20379,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"777:7:107","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20378,"name":"address","nodeType":"ElementaryTypeName","src":"777:7:107","typeDescriptions":{}}},"id":20381,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"777:13:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":20373,"name":"ep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20346,"src":"735:2:107","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$10807","typeString":"contract IEntryPoint"}},"id":20375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTo","nodeType":"MemberAccess","referencedDeclaration":10941,"src":"735:12:107","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$","typeString":"function (address) payable external"}},"id":20377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":20376,"name":"missingAccountFunds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20367,"src":"756:19:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"735:41:107","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$returns$__$value","typeString":"function (address) payable external"}},"id":20382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"735:56:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20383,"nodeType":"ExpressionStatement","src":"735:56:107"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20384,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20363,"src":"805:6:107","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20385,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"805:12:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":20386,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"821:1:107","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"805:17:107","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20399,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20396,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20363,"src":"948:6:107","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":10974,"src":"948:12:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"32","id":20398,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"964:1:107","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"948:17:107","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20422,"nodeType":"IfStatement","src":"944:229:107","trueBody":{"id":20421,"nodeType":"Block","src":"967:206:107","statements":[{"assignments":[20401],"declarations":[{"constant":false,"id":20401,"mutability":"mutable","name":"paymaster","nameLocation":"989:9:107","nodeType":"VariableDeclaration","scope":20421,"src":"981:17:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20400,"name":"address","nodeType":"ElementaryTypeName","src":"981:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":20412,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":20406,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20363,"src":"1017:6:107","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":20407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":10990,"src":"1017:23:107","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"hexValue":"3230","id":20408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1043:2:107","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"id":20409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"1017:29:107","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}],"id":20405,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1009:7:107","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":20404,"name":"bytes20","nodeType":"ElementaryTypeName","src":"1009:7:107","typeDescriptions":{}}},"id":20410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1009:38:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":20403,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1001:7:107","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20402,"name":"address","nodeType":"ElementaryTypeName","src":"1001:7:107","typeDescriptions":{}}},"id":20411,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1001:47:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"981:67:107"},{"expression":{"arguments":[{"id":20418,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20401,"src":"1152:9:107","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":20413,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1121:4:107","typeDescriptions":{"typeIdentifier":"t_contract$_TestWarmColdAccount_$20448","typeString":"contract TestWarmColdAccount"}},"id":20415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"touchPaymaster","nodeType":"MemberAccess","referencedDeclaration":20447,"src":"1121:19:107","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":20417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"hexValue":"31303030","id":20416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1146:4:107","typeDescriptions":{"typeIdentifier":"t_rational_1000_by_1","typeString":"int_const 1000"},"value":"1000"}],"src":"1121:30:107","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$gas","typeString":"function (address) view external returns (uint256)"}},"id":20419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1121:41:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20420,"nodeType":"ExpressionStatement","src":"1121:41:107"}]}},"id":20423,"nodeType":"IfStatement","src":"801:372:107","trueBody":{"id":20395,"nodeType":"Block","src":"824:114:107","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"argumentTypes":[],"expression":{"id":20388,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"897:4:107","typeDescriptions":{"typeIdentifier":"t_contract$_TestWarmColdAccount_$20448","typeString":"contract TestWarmColdAccount"}},"id":20390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"touchStorage","nodeType":"MemberAccess","referencedDeclaration":20435,"src":"897:17:107","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":20392,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["gas"],"nodeType":"FunctionCallOptions","options":[{"hexValue":"31303030","id":20391,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"920:4:107","typeDescriptions":{"typeIdentifier":"t_rational_1000_by_1","typeString":"int_const 1000"},"value":"1000"}],"src":"897:28:107","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$gas","typeString":"function () view external returns (uint256)"}},"id":20393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"897:30:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20394,"nodeType":"ExpressionStatement","src":"897:30:107"}]}},{"expression":{"hexValue":"30","id":20424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1189:1:107","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":20372,"id":20425,"nodeType":"Return","src":"1182:8:107"}]},"functionSelector":"3a871cdd","id":20427,"implemented":true,"kind":"function","modifiers":[],"name":"validateUserOp","nameLocation":"586:14:107","nodeType":"FunctionDefinition","overrides":{"id":20369,"nodeType":"OverrideSpecifier","overrides":[],"src":"683:8:107"},"parameters":{"id":20368,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20363,"mutability":"mutable","name":"userOp","nameLocation":"624:6:107","nodeType":"VariableDeclaration","scope":20427,"src":"601:29:107","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":20362,"nodeType":"UserDefinedTypeName","pathNode":{"id":20361,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":10993,"src":"601:13:107"},"referencedDeclaration":10993,"src":"601:13:107","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$10993_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":20365,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20427,"src":"632:7:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":20364,"name":"bytes32","nodeType":"ElementaryTypeName","src":"632:7:107","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":20367,"mutability":"mutable","name":"missingAccountFunds","nameLocation":"649:19:107","nodeType":"VariableDeclaration","scope":20427,"src":"641:27:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20366,"name":"uint256","nodeType":"ElementaryTypeName","src":"641:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"600:69:107"},"returnParameters":{"id":20372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20371,"mutability":"mutable","name":"validationData","nameLocation":"709:14:107","nodeType":"VariableDeclaration","scope":20427,"src":"701:22:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20370,"name":"uint256","nodeType":"ElementaryTypeName","src":"701:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"700:24:107"},"scope":20448,"src":"577:620:107","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":20434,"nodeType":"Block","src":"1257:29:107","statements":[{"expression":{"id":20432,"name":"state","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20349,"src":"1274:5:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20431,"id":20433,"nodeType":"Return","src":"1267:12:107"}]},"functionSelector":"fb0c2425","id":20435,"implemented":true,"kind":"function","modifiers":[],"name":"touchStorage","nameLocation":"1212:12:107","nodeType":"FunctionDefinition","parameters":{"id":20428,"nodeType":"ParameterList","parameters":[],"src":"1224:2:107"},"returnParameters":{"id":20431,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20430,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20435,"src":"1248:7:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20429,"name":"uint256","nodeType":"ElementaryTypeName","src":"1248:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1247:9:107"},"scope":20448,"src":"1203:83:107","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":20446,"nodeType":"Block","src":"1365:45:107","statements":[{"expression":{"expression":{"expression":{"id":20442,"name":"paymaster","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20437,"src":"1382:9:107","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":20443,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"code","nodeType":"MemberAccess","src":"1382:14:107","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":20444,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1382:21:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20441,"id":20445,"nodeType":"Return","src":"1375:28:107"}]},"functionSelector":"f115d40d","id":20447,"implemented":true,"kind":"function","modifiers":[],"name":"touchPaymaster","nameLocation":"1301:14:107","nodeType":"FunctionDefinition","parameters":{"id":20438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20437,"mutability":"mutable","name":"paymaster","nameLocation":"1324:9:107","nodeType":"VariableDeclaration","scope":20447,"src":"1316:17:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20436,"name":"address","nodeType":"ElementaryTypeName","src":"1316:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1315:19:107"},"returnParameters":{"id":20441,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20440,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20447,"src":"1356:7:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20439,"name":"uint256","nodeType":"ElementaryTypeName","src":"1356:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1355:9:107"},"scope":20448,"src":"1292:118:107","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":20449,"src":"407:1005:107","usedErrors":[]}],"src":"41:1372:107"},"id":107},"contracts/test/mocks/MockFeedRegistry.sol":{"ast":{"absolutePath":"contracts/test/mocks/MockFeedRegistry.sol","exportedSymbols":{"IBobaStraw":[13138],"MockFeedRegistry":[20569]},"id":20570,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":20450,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"32:24:108"},{"id":20451,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:108"},{"absolutePath":"contracts/samples/IBobaStraw.sol","file":"../../samples/IBobaStraw.sol","id":20452,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20570,"sourceUnit":13139,"src":"92:38:108","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20453,"name":"IBobaStraw","nodeType":"IdentifierPath","referencedDeclaration":13138,"src":"161:10:108"},"id":20454,"nodeType":"InheritanceSpecifier","src":"161:10:108"}],"canonicalName":"MockFeedRegistry","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20569,"linearizedBaseContracts":[20569,13138],"name":"MockFeedRegistry","nameLocation":"141:16:108","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"c91f1327","id":20457,"mutability":"mutable","name":"fixedReturnValue","nameLocation":"191:16:108","nodeType":"VariableDeclaration","scope":20569,"src":"177:35:108","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":20455,"name":"int256","nodeType":"ElementaryTypeName","src":"177:6:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"value":{"hexValue":"3435","id":20456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"210:2:108","typeDescriptions":{"typeIdentifier":"t_rational_45_by_1","typeString":"int_const 45"},"value":"45"},"visibility":"public"},{"constant":false,"functionSelector":"ccd12eee","id":20460,"mutability":"mutable","name":"decimalsOverride","nameLocation":"229:16:108","nodeType":"VariableDeclaration","scope":20569,"src":"216:33:108","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20458,"name":"uint8","nodeType":"ElementaryTypeName","src":"216:5:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"hexValue":"38","id":20459,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"248:1:108","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"visibility":"public"},{"baseFunctions":[13091],"body":{"id":20484,"nodeType":"Block","src":"484:33:108","statements":[{"expression":{"components":[{"hexValue":"30","id":20477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"500:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20478,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"502:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20479,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"504:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20480,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"506:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"508:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":20482,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"499:11:108","typeDescriptions":{"typeIdentifier":"t_tuple$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$","typeString":"tuple(int_const 0,int_const 0,int_const 0,int_const 0,int_const 0)"}},"functionReturnParameters":20476,"id":20483,"nodeType":"Return","src":"492:18:108"}]},"functionSelector":"bcfd032d","id":20485,"implemented":true,"kind":"function","modifiers":[],"name":"latestRoundData","nameLocation":"263:15:108","nodeType":"FunctionDefinition","parameters":{"id":20465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20462,"mutability":"mutable","name":"base","nameLocation":"292:4:108","nodeType":"VariableDeclaration","scope":20485,"src":"284:12:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20461,"name":"address","nodeType":"ElementaryTypeName","src":"284:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20464,"mutability":"mutable","name":"quote","nameLocation":"310:5:108","nodeType":"VariableDeclaration","scope":20485,"src":"302:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20463,"name":"address","nodeType":"ElementaryTypeName","src":"302:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"278:41:108"},"returnParameters":{"id":20476,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20467,"mutability":"mutable","name":"roundId","nameLocation":"369:7:108","nodeType":"VariableDeclaration","scope":20485,"src":"362:14:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":20466,"name":"uint80","nodeType":"ElementaryTypeName","src":"362:6:108","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"},{"constant":false,"id":20469,"mutability":"mutable","name":"answer","nameLocation":"391:6:108","nodeType":"VariableDeclaration","scope":20485,"src":"384:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":20468,"name":"int256","nodeType":"ElementaryTypeName","src":"384:6:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":20471,"mutability":"mutable","name":"startedAt","nameLocation":"413:9:108","nodeType":"VariableDeclaration","scope":20485,"src":"405:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20470,"name":"uint256","nodeType":"ElementaryTypeName","src":"405:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20473,"mutability":"mutable","name":"updatedAt","nameLocation":"438:9:108","nodeType":"VariableDeclaration","scope":20485,"src":"430:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20472,"name":"uint256","nodeType":"ElementaryTypeName","src":"430:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20475,"mutability":"mutable","name":"answeredInRound","nameLocation":"462:15:108","nodeType":"VariableDeclaration","scope":20485,"src":"455:22:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":20474,"name":"uint80","nodeType":"ElementaryTypeName","src":"455:6:108","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"354:129:108"},"scope":20569,"src":"254:263:108","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13110],"body":{"id":20511,"nodeType":"Block","src":"769:33:108","statements":[{"expression":{"components":[{"hexValue":"30","id":20504,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"785:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20505,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"787:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20506,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"789:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20507,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"791:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":20508,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"793:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":20509,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"784:11:108","typeDescriptions":{"typeIdentifier":"t_tuple$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$_t_rational_0_by_1_$","typeString":"tuple(int_const 0,int_const 0,int_const 0,int_const 0,int_const 0)"}},"functionReturnParameters":20503,"id":20510,"nodeType":"Return","src":"777:18:108"}]},"functionSelector":"fc58749e","id":20512,"implemented":true,"kind":"function","modifiers":[],"name":"getRoundData","nameLocation":"530:12:108","nodeType":"FunctionDefinition","parameters":{"id":20492,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20487,"mutability":"mutable","name":"base","nameLocation":"556:4:108","nodeType":"VariableDeclaration","scope":20512,"src":"548:12:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20486,"name":"address","nodeType":"ElementaryTypeName","src":"548:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20489,"mutability":"mutable","name":"quote","nameLocation":"574:5:108","nodeType":"VariableDeclaration","scope":20512,"src":"566:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20488,"name":"address","nodeType":"ElementaryTypeName","src":"566:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20491,"mutability":"mutable","name":"_roundId","nameLocation":"592:8:108","nodeType":"VariableDeclaration","scope":20512,"src":"585:15:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":20490,"name":"uint80","nodeType":"ElementaryTypeName","src":"585:6:108","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"542:62:108"},"returnParameters":{"id":20503,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20494,"mutability":"mutable","name":"roundId","nameLocation":"654:7:108","nodeType":"VariableDeclaration","scope":20512,"src":"647:14:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":20493,"name":"uint80","nodeType":"ElementaryTypeName","src":"647:6:108","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"},{"constant":false,"id":20496,"mutability":"mutable","name":"answer","nameLocation":"676:6:108","nodeType":"VariableDeclaration","scope":20512,"src":"669:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":20495,"name":"int256","nodeType":"ElementaryTypeName","src":"669:6:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":20498,"mutability":"mutable","name":"startedAt","nameLocation":"698:9:108","nodeType":"VariableDeclaration","scope":20512,"src":"690:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20497,"name":"uint256","nodeType":"ElementaryTypeName","src":"690:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20500,"mutability":"mutable","name":"updatedAt","nameLocation":"723:9:108","nodeType":"VariableDeclaration","scope":20512,"src":"715:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20499,"name":"uint256","nodeType":"ElementaryTypeName","src":"715:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20502,"mutability":"mutable","name":"answeredInRound","nameLocation":"747:15:108","nodeType":"VariableDeclaration","scope":20512,"src":"740:22:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":20501,"name":"uint80","nodeType":"ElementaryTypeName","src":"740:6:108","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"639:129:108"},"scope":20569,"src":"521:281:108","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13119],"body":{"id":20523,"nodeType":"Block","src":"960:40:108","statements":[{"expression":{"id":20521,"name":"fixedReturnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20457,"src":"977:16:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":20520,"id":20522,"nodeType":"Return","src":"970:23:108"}]},"functionSelector":"d4c282a3","id":20524,"implemented":true,"kind":"function","modifiers":[],"name":"latestAnswer","nameLocation":"844:12:108","nodeType":"FunctionDefinition","parameters":{"id":20517,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20514,"mutability":"mutable","name":"base","nameLocation":"870:4:108","nodeType":"VariableDeclaration","scope":20524,"src":"862:12:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20513,"name":"address","nodeType":"ElementaryTypeName","src":"862:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20516,"mutability":"mutable","name":"quote","nameLocation":"888:5:108","nodeType":"VariableDeclaration","scope":20524,"src":"880:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20515,"name":"address","nodeType":"ElementaryTypeName","src":"880:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"856:41:108"},"returnParameters":{"id":20520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20519,"mutability":"mutable","name":"answer","nameLocation":"947:6:108","nodeType":"VariableDeclaration","scope":20524,"src":"940:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":20518,"name":"int256","nodeType":"ElementaryTypeName","src":"940:6:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"932:27:108"},"scope":20569,"src":"835:165:108","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13128],"body":{"id":20535,"nodeType":"Block","src":"1136:23:108","statements":[{"expression":{"hexValue":"30","id":20533,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1151:1:108","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":20532,"id":20534,"nodeType":"Return","src":"1144:8:108"}]},"functionSelector":"672ff44f","id":20536,"implemented":true,"kind":"function","modifiers":[],"name":"latestTimestamp","nameLocation":"1013:15:108","nodeType":"FunctionDefinition","parameters":{"id":20529,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20526,"mutability":"mutable","name":"base","nameLocation":"1042:4:108","nodeType":"VariableDeclaration","scope":20536,"src":"1034:12:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20525,"name":"address","nodeType":"ElementaryTypeName","src":"1034:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20528,"mutability":"mutable","name":"quote","nameLocation":"1060:5:108","nodeType":"VariableDeclaration","scope":20536,"src":"1052:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20527,"name":"address","nodeType":"ElementaryTypeName","src":"1052:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1028:41:108"},"returnParameters":{"id":20532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20531,"mutability":"mutable","name":"timestamp","nameLocation":"1120:9:108","nodeType":"VariableDeclaration","scope":20536,"src":"1112:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20530,"name":"uint256","nodeType":"ElementaryTypeName","src":"1112:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1104:31:108"},"scope":20569,"src":"1004:155:108","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13137],"body":{"id":20547,"nodeType":"Block","src":"1276:38:108","statements":[{"expression":{"id":20545,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20460,"src":"1291:16:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":20544,"id":20546,"nodeType":"Return","src":"1284:23:108"}]},"functionSelector":"58e2d3a8","id":20548,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"1172:8:108","nodeType":"FunctionDefinition","parameters":{"id":20541,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20538,"mutability":"mutable","name":"base","nameLocation":"1194:4:108","nodeType":"VariableDeclaration","scope":20548,"src":"1186:12:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20537,"name":"address","nodeType":"ElementaryTypeName","src":"1186:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20540,"mutability":"mutable","name":"quote","nameLocation":"1212:5:108","nodeType":"VariableDeclaration","scope":20548,"src":"1204:13:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20539,"name":"address","nodeType":"ElementaryTypeName","src":"1204:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1180:41:108"},"returnParameters":{"id":20544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20543,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20548,"src":"1264:5:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20542,"name":"uint8","nodeType":"ElementaryTypeName","src":"1264:5:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1256:19:108"},"scope":20569,"src":"1163:151:108","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":20557,"nodeType":"Block","src":"1398:44:108","statements":[{"expression":{"id":20555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20553,"name":"fixedReturnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20457,"src":"1408:16:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20554,"name":"newValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20550,"src":"1427:8:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1408:27:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"id":20556,"nodeType":"ExpressionStatement","src":"1408:27:108"}]},"functionSelector":"71963dad","id":20558,"implemented":true,"kind":"function","modifiers":[],"name":"updateFixedRetunValue","nameLocation":"1329:21:108","nodeType":"FunctionDefinition","parameters":{"id":20551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20550,"mutability":"mutable","name":"newValue","nameLocation":"1365:8:108","nodeType":"VariableDeclaration","scope":20558,"src":"1358:15:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":20549,"name":"int256","nodeType":"ElementaryTypeName","src":"1358:6:108","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1350:29:108"},"returnParameters":{"id":20552,"nodeType":"ParameterList","parameters":[],"src":"1398:0:108"},"scope":20569,"src":"1320:122:108","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":20567,"nodeType":"Block","src":"1521:47:108","statements":[{"expression":{"id":20565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20563,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20460,"src":"1531:16:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20564,"name":"newDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20560,"src":"1550:11:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"1531:30:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":20566,"nodeType":"ExpressionStatement","src":"1531:30:108"}]},"functionSelector":"0ce83a61","id":20568,"implemented":true,"kind":"function","modifiers":[],"name":"updateDecimals","nameLocation":"1457:14:108","nodeType":"FunctionDefinition","parameters":{"id":20561,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20560,"mutability":"mutable","name":"newDecimals","nameLocation":"1485:11:108","nodeType":"VariableDeclaration","scope":20568,"src":"1479:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20559,"name":"uint8","nodeType":"ElementaryTypeName","src":"1479:5:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1471:31:108"},"returnParameters":{"id":20562,"nodeType":"ParameterList","parameters":[],"src":"1521:0:108"},"scope":20569,"src":"1448:120:108","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":20570,"src":"132:1438:108","usedErrors":[]}],"src":"32:1539:108"},"id":108},"contracts/test/mocks/MockGasPriceOracle.sol":{"ast":{"absolutePath":"contracts/test/mocks/MockGasPriceOracle.sol","exportedSymbols":{"IBobaGasPriceOracle":[13071],"MockGasPriceOracle":[20618]},"id":20619,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":20571,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"32:24:109"},{"id":20572,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:109"},{"absolutePath":"contracts/samples/IBobaGasPriceOracle.sol","file":"../../samples/IBobaGasPriceOracle.sol","id":20573,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20619,"sourceUnit":13072,"src":"92:47:109","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":20574,"name":"IBobaGasPriceOracle","nodeType":"IdentifierPath","referencedDeclaration":13071,"src":"172:19:109"},"id":20575,"nodeType":"InheritanceSpecifier","src":"172:19:109"}],"canonicalName":"MockGasPriceOracle","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":20618,"linearizedBaseContracts":[20618,13071],"name":"MockGasPriceOracle","nameLocation":"150:18:109","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"c91f1327","id":20578,"mutability":"mutable","name":"fixedReturnValue","nameLocation":"211:16:109","nodeType":"VariableDeclaration","scope":20618,"src":"196:36:109","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20576,"name":"uint256","nodeType":"ElementaryTypeName","src":"196:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3435","id":20577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"230:2:109","typeDescriptions":{"typeIdentifier":"t_rational_45_by_1","typeString":"int_const 45"},"value":"45"},"visibility":"public"},{"constant":false,"functionSelector":"ccd12eee","id":20581,"mutability":"mutable","name":"decimalsOverride","nameLocation":"251:16:109","nodeType":"VariableDeclaration","scope":20618,"src":"236:35:109","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20579,"name":"uint256","nodeType":"ElementaryTypeName","src":"236:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"38","id":20580,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"270:1:109","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"visibility":"public"},{"baseFunctions":[13065],"body":{"id":20588,"nodeType":"Block","src":"328:34:109","statements":[{"expression":{"id":20586,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20581,"src":"341:16:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20585,"id":20587,"nodeType":"Return","src":"334:23:109"}]},"functionSelector":"313ce567","id":20589,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"285:8:109","nodeType":"FunctionDefinition","parameters":{"id":20582,"nodeType":"ParameterList","parameters":[],"src":"293:2:109"},"returnParameters":{"id":20585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20584,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20589,"src":"319:7:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20583,"name":"uint256","nodeType":"ElementaryTypeName","src":"319:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"318:9:109"},"scope":20618,"src":"276:86:109","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13070],"body":{"id":20596,"nodeType":"Block","src":"420:34:109","statements":[{"expression":{"id":20594,"name":"fixedReturnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20578,"src":"433:16:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20593,"id":20595,"nodeType":"Return","src":"426:23:109"}]},"functionSelector":"0aa2f420","id":20597,"implemented":true,"kind":"function","modifiers":[],"name":"priceRatio","nameLocation":"375:10:109","nodeType":"FunctionDefinition","parameters":{"id":20590,"nodeType":"ParameterList","parameters":[],"src":"385:2:109"},"returnParameters":{"id":20593,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20592,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20597,"src":"411:7:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20591,"name":"uint256","nodeType":"ElementaryTypeName","src":"411:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"410:9:109"},"scope":20618,"src":"366:88:109","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":20606,"nodeType":"Block","src":"516:44:109","statements":[{"expression":{"id":20604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20602,"name":"fixedReturnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20578,"src":"526:16:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20603,"name":"newValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20599,"src":"545:8:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"526:27:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20605,"nodeType":"ExpressionStatement","src":"526:27:109"}]},"functionSelector":"19dd3a34","id":20607,"implemented":true,"kind":"function","modifiers":[],"name":"updateFixedRetunValue","nameLocation":"467:21:109","nodeType":"FunctionDefinition","parameters":{"id":20600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20599,"mutability":"mutable","name":"newValue","nameLocation":"497:8:109","nodeType":"VariableDeclaration","scope":20607,"src":"489:16:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20598,"name":"uint256","nodeType":"ElementaryTypeName","src":"489:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"488:18:109"},"returnParameters":{"id":20601,"nodeType":"ParameterList","parameters":[],"src":"516:0:109"},"scope":20618,"src":"458:102:109","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":20616,"nodeType":"Block","src":"618:47:109","statements":[{"expression":{"id":20614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20612,"name":"decimalsOverride","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20581,"src":"628:16:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20613,"name":"newDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20609,"src":"647:11:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"628:30:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20615,"nodeType":"ExpressionStatement","src":"628:30:109"}]},"functionSelector":"66675c57","id":20617,"implemented":true,"kind":"function","modifiers":[],"name":"updateDecimals","nameLocation":"573:14:109","nodeType":"FunctionDefinition","parameters":{"id":20610,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20609,"mutability":"mutable","name":"newDecimals","nameLocation":"596:11:109","nodeType":"VariableDeclaration","scope":20617,"src":"588:19:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20608,"name":"uint256","nodeType":"ElementaryTypeName","src":"588:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"587:21:109"},"returnParameters":{"id":20611,"nodeType":"ParameterList","parameters":[],"src":"618:0:109"},"scope":20618,"src":"564:101:109","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":20619,"src":"141:526:109","usedErrors":[]}],"src":"32:635:109"},"id":109},"contracts/utils/Exec.sol":{"ast":{"absolutePath":"contracts/utils/Exec.sol","exportedSymbols":{"Exec":[20709]},"id":20710,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":20620,"literals":["solidity",">=","0.7",".5","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:110"},{"abstract":false,"baseContracts":[],"canonicalName":"Exec","contractDependencies":[],"contractKind":"library","documentation":{"id":20621,"nodeType":"StructuredDocumentation","src":"114:95:110","text":" Utility functions helpful when making different kinds of contract calls in Solidity."},"fullyImplemented":true,"id":20709,"linearizedBaseContracts":[20709],"name":"Exec","nameLocation":"218:4:110","nodeType":"ContractDefinition","nodes":[{"body":{"id":20635,"nodeType":"Block","src":"375:118:110","statements":[{"AST":{"nodeType":"YulBlock","src":"394:93:110","statements":[{"nodeType":"YulAssignment","src":"408:69:110","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"424:5:110"},{"name":"to","nodeType":"YulIdentifier","src":"431:2:110"},{"name":"value","nodeType":"YulIdentifier","src":"435:5:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"446:4:110"},{"kind":"number","nodeType":"YulLiteral","src":"452:4:110","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"442:3:110"},"nodeType":"YulFunctionCall","src":"442:15:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"465:4:110"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"459:5:110"},"nodeType":"YulFunctionCall","src":"459:11:110"},{"kind":"number","nodeType":"YulLiteral","src":"472:1:110","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"475:1:110","type":"","value":"0"}],"functionName":{"name":"call","nodeType":"YulIdentifier","src":"419:4:110"},"nodeType":"YulFunctionCall","src":"419:58:110"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"408:7:110"}]}]},"evmVersion":"london","externalReferences":[{"declaration":20627,"isOffset":false,"isSlot":false,"src":"446:4:110","valueSize":1},{"declaration":20627,"isOffset":false,"isSlot":false,"src":"465:4:110","valueSize":1},{"declaration":20632,"isOffset":false,"isSlot":false,"src":"408:7:110","valueSize":1},{"declaration":20623,"isOffset":false,"isSlot":false,"src":"431:2:110","valueSize":1},{"declaration":20629,"isOffset":false,"isSlot":false,"src":"424:5:110","valueSize":1},{"declaration":20625,"isOffset":false,"isSlot":false,"src":"435:5:110","valueSize":1}],"id":20634,"nodeType":"InlineAssembly","src":"385:102:110"}]},"id":20636,"implemented":true,"kind":"function","modifiers":[],"name":"call","nameLocation":"239:4:110","nodeType":"FunctionDefinition","parameters":{"id":20630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20623,"mutability":"mutable","name":"to","nameLocation":"261:2:110","nodeType":"VariableDeclaration","scope":20636,"src":"253:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20622,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20625,"mutability":"mutable","name":"value","nameLocation":"281:5:110","nodeType":"VariableDeclaration","scope":20636,"src":"273:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20624,"name":"uint256","nodeType":"ElementaryTypeName","src":"273:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20627,"mutability":"mutable","name":"data","nameLocation":"309:4:110","nodeType":"VariableDeclaration","scope":20636,"src":"296:17:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20626,"name":"bytes","nodeType":"ElementaryTypeName","src":"296:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20629,"mutability":"mutable","name":"txGas","nameLocation":"331:5:110","nodeType":"VariableDeclaration","scope":20636,"src":"323:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20628,"name":"uint256","nodeType":"ElementaryTypeName","src":"323:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"243:99:110"},"returnParameters":{"id":20633,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20632,"mutability":"mutable","name":"success","nameLocation":"366:7:110","nodeType":"VariableDeclaration","scope":20636,"src":"361:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20631,"name":"bool","nodeType":"ElementaryTypeName","src":"361:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"360:14:110"},"scope":20709,"src":"230:263:110","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20648,"nodeType":"Block","src":"632:117:110","statements":[{"AST":{"nodeType":"YulBlock","src":"651:92:110","statements":[{"nodeType":"YulAssignment","src":"665:68:110","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"687:5:110"},{"name":"to","nodeType":"YulIdentifier","src":"694:2:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"702:4:110"},{"kind":"number","nodeType":"YulLiteral","src":"708:4:110","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"698:3:110"},"nodeType":"YulFunctionCall","src":"698:15:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"721:4:110"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"715:5:110"},"nodeType":"YulFunctionCall","src":"715:11:110"},{"kind":"number","nodeType":"YulLiteral","src":"728:1:110","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"731:1:110","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"676:10:110"},"nodeType":"YulFunctionCall","src":"676:57:110"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"665:7:110"}]}]},"evmVersion":"london","externalReferences":[{"declaration":20640,"isOffset":false,"isSlot":false,"src":"702:4:110","valueSize":1},{"declaration":20640,"isOffset":false,"isSlot":false,"src":"721:4:110","valueSize":1},{"declaration":20645,"isOffset":false,"isSlot":false,"src":"665:7:110","valueSize":1},{"declaration":20638,"isOffset":false,"isSlot":false,"src":"694:2:110","valueSize":1},{"declaration":20642,"isOffset":false,"isSlot":false,"src":"687:5:110","valueSize":1}],"id":20647,"nodeType":"InlineAssembly","src":"642:101:110"}]},"id":20649,"implemented":true,"kind":"function","modifiers":[],"name":"staticcall","nameLocation":"508:10:110","nodeType":"FunctionDefinition","parameters":{"id":20643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20638,"mutability":"mutable","name":"to","nameLocation":"536:2:110","nodeType":"VariableDeclaration","scope":20649,"src":"528:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20637,"name":"address","nodeType":"ElementaryTypeName","src":"528:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20640,"mutability":"mutable","name":"data","nameLocation":"561:4:110","nodeType":"VariableDeclaration","scope":20649,"src":"548:17:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20639,"name":"bytes","nodeType":"ElementaryTypeName","src":"548:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20642,"mutability":"mutable","name":"txGas","nameLocation":"583:5:110","nodeType":"VariableDeclaration","scope":20649,"src":"575:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20641,"name":"uint256","nodeType":"ElementaryTypeName","src":"575:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"518:76:110"},"returnParameters":{"id":20646,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20645,"mutability":"mutable","name":"success","nameLocation":"623:7:110","nodeType":"VariableDeclaration","scope":20649,"src":"618:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20644,"name":"bool","nodeType":"ElementaryTypeName","src":"618:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"617:14:110"},"scope":20709,"src":"499:250:110","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":20661,"nodeType":"Block","src":"885:119:110","statements":[{"AST":{"nodeType":"YulBlock","src":"904:94:110","statements":[{"nodeType":"YulAssignment","src":"918:70:110","value":{"arguments":[{"name":"txGas","nodeType":"YulIdentifier","src":"942:5:110"},{"name":"to","nodeType":"YulIdentifier","src":"949:2:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"957:4:110"},{"kind":"number","nodeType":"YulLiteral","src":"963:4:110","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"953:3:110"},"nodeType":"YulFunctionCall","src":"953:15:110"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"976:4:110"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"970:5:110"},"nodeType":"YulFunctionCall","src":"970:11:110"},{"kind":"number","nodeType":"YulLiteral","src":"983:1:110","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"986:1:110","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"929:12:110"},"nodeType":"YulFunctionCall","src":"929:59:110"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"918:7:110"}]}]},"evmVersion":"london","externalReferences":[{"declaration":20653,"isOffset":false,"isSlot":false,"src":"957:4:110","valueSize":1},{"declaration":20653,"isOffset":false,"isSlot":false,"src":"976:4:110","valueSize":1},{"declaration":20658,"isOffset":false,"isSlot":false,"src":"918:7:110","valueSize":1},{"declaration":20651,"isOffset":false,"isSlot":false,"src":"949:2:110","valueSize":1},{"declaration":20655,"isOffset":false,"isSlot":false,"src":"942:5:110","valueSize":1}],"id":20660,"nodeType":"InlineAssembly","src":"895:103:110"}]},"id":20662,"implemented":true,"kind":"function","modifiers":[],"name":"delegateCall","nameLocation":"764:12:110","nodeType":"FunctionDefinition","parameters":{"id":20656,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20651,"mutability":"mutable","name":"to","nameLocation":"794:2:110","nodeType":"VariableDeclaration","scope":20662,"src":"786:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20650,"name":"address","nodeType":"ElementaryTypeName","src":"786:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20653,"mutability":"mutable","name":"data","nameLocation":"819:4:110","nodeType":"VariableDeclaration","scope":20662,"src":"806:17:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20652,"name":"bytes","nodeType":"ElementaryTypeName","src":"806:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20655,"mutability":"mutable","name":"txGas","nameLocation":"841:5:110","nodeType":"VariableDeclaration","scope":20662,"src":"833:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20654,"name":"uint256","nodeType":"ElementaryTypeName","src":"833:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"776:76:110"},"returnParameters":{"id":20659,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20658,"mutability":"mutable","name":"success","nameLocation":"876:7:110","nodeType":"VariableDeclaration","scope":20662,"src":"871:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20657,"name":"bool","nodeType":"ElementaryTypeName","src":"871:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"870:14:110"},"scope":20709,"src":"755:249:110","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20670,"nodeType":"Block","src":"1153:349:110","statements":[{"AST":{"nodeType":"YulBlock","src":"1172:324:110","statements":[{"nodeType":"YulVariableDeclaration","src":"1186:27:110","value":{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"1197:14:110"},"nodeType":"YulFunctionCall","src":"1197:16:110"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"1190:3:110","type":""}]},{"body":{"nodeType":"YulBlock","src":"1245:45:110","statements":[{"nodeType":"YulAssignment","src":"1263:13:110","value":{"name":"maxLen","nodeType":"YulIdentifier","src":"1270:6:110"},"variableNames":[{"name":"len","nodeType":"YulIdentifier","src":"1263:3:110"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1232:3:110"},{"name":"maxLen","nodeType":"YulIdentifier","src":"1237:6:110"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1229:2:110"},"nodeType":"YulFunctionCall","src":"1229:15:110"},"nodeType":"YulIf","src":"1226:64:110"},{"nodeType":"YulVariableDeclaration","src":"1303:22:110","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1320:4:110","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1314:5:110"},"nodeType":"YulFunctionCall","src":"1314:11:110"},"variables":[{"name":"ptr","nodeType":"YulTypedName","src":"1307:3:110","type":""}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1345:4:110","type":"","value":"0x40"},{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1355:3:110"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1364:3:110"},{"kind":"number","nodeType":"YulLiteral","src":"1369:4:110","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1360:3:110"},"nodeType":"YulFunctionCall","src":"1360:14:110"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1351:3:110"},"nodeType":"YulFunctionCall","src":"1351:24:110"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1338:6:110"},"nodeType":"YulFunctionCall","src":"1338:38:110"},"nodeType":"YulExpressionStatement","src":"1338:38:110"},{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1396:3:110"},{"name":"len","nodeType":"YulIdentifier","src":"1401:3:110"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1389:6:110"},"nodeType":"YulFunctionCall","src":"1389:16:110"},"nodeType":"YulExpressionStatement","src":"1389:16:110"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1437:3:110"},{"kind":"number","nodeType":"YulLiteral","src":"1442:4:110","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1433:3:110"},"nodeType":"YulFunctionCall","src":"1433:14:110"},{"kind":"number","nodeType":"YulLiteral","src":"1449:1:110","type":"","value":"0"},{"name":"len","nodeType":"YulIdentifier","src":"1452:3:110"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"1418:14:110"},"nodeType":"YulFunctionCall","src":"1418:38:110"},"nodeType":"YulExpressionStatement","src":"1418:38:110"},{"nodeType":"YulAssignment","src":"1469:17:110","value":{"name":"ptr","nodeType":"YulIdentifier","src":"1483:3:110"},"variableNames":[{"name":"returnData","nodeType":"YulIdentifier","src":"1469:10:110"}]}]},"evmVersion":"london","externalReferences":[{"declaration":20664,"isOffset":false,"isSlot":false,"src":"1237:6:110","valueSize":1},{"declaration":20664,"isOffset":false,"isSlot":false,"src":"1270:6:110","valueSize":1},{"declaration":20667,"isOffset":false,"isSlot":false,"src":"1469:10:110","valueSize":1}],"id":20669,"nodeType":"InlineAssembly","src":"1163:333:110"}]},"id":20671,"implemented":true,"kind":"function","modifiers":[],"name":"getReturnData","nameLocation":"1075:13:110","nodeType":"FunctionDefinition","parameters":{"id":20665,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20664,"mutability":"mutable","name":"maxLen","nameLocation":"1097:6:110","nodeType":"VariableDeclaration","scope":20671,"src":"1089:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20663,"name":"uint256","nodeType":"ElementaryTypeName","src":"1089:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1088:16:110"},"returnParameters":{"id":20668,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20667,"mutability":"mutable","name":"returnData","nameLocation":"1141:10:110","nodeType":"VariableDeclaration","scope":20671,"src":"1128:23:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20666,"name":"bytes","nodeType":"ElementaryTypeName","src":"1128:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1127:25:110"},"scope":20709,"src":"1066:436:110","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":20677,"nodeType":"Block","src":"1645:95:110","statements":[{"AST":{"nodeType":"YulBlock","src":"1664:70:110","statements":[{"expression":{"arguments":[{"arguments":[{"name":"returnData","nodeType":"YulIdentifier","src":"1689:10:110"},{"kind":"number","nodeType":"YulLiteral","src":"1701:2:110","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1685:3:110"},"nodeType":"YulFunctionCall","src":"1685:19:110"},{"arguments":[{"name":"returnData","nodeType":"YulIdentifier","src":"1712:10:110"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1706:5:110"},"nodeType":"YulFunctionCall","src":"1706:17:110"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1678:6:110"},"nodeType":"YulFunctionCall","src":"1678:46:110"},"nodeType":"YulExpressionStatement","src":"1678:46:110"}]},"evmVersion":"london","externalReferences":[{"declaration":20673,"isOffset":false,"isSlot":false,"src":"1689:10:110","valueSize":1},{"declaration":20673,"isOffset":false,"isSlot":false,"src":"1712:10:110","valueSize":1}],"id":20676,"nodeType":"InlineAssembly","src":"1655:79:110"}]},"id":20678,"implemented":true,"kind":"function","modifiers":[],"name":"revertWithData","nameLocation":"1591:14:110","nodeType":"FunctionDefinition","parameters":{"id":20674,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20673,"mutability":"mutable","name":"returnData","nameLocation":"1619:10:110","nodeType":"VariableDeclaration","scope":20678,"src":"1606:23:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20672,"name":"bytes","nodeType":"ElementaryTypeName","src":"1606:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1605:25:110"},"returnParameters":{"id":20675,"nodeType":"ParameterList","parameters":[],"src":"1645:0:110"},"scope":20709,"src":"1582:158:110","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":20707,"nodeType":"Block","src":"1825:142:110","statements":[{"assignments":[20688],"declarations":[{"constant":false,"id":20688,"mutability":"mutable","name":"success","nameLocation":"1840:7:110","nodeType":"VariableDeclaration","scope":20707,"src":"1835:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20687,"name":"bool","nodeType":"ElementaryTypeName","src":"1835:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":20696,"initialValue":{"arguments":[{"id":20690,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20680,"src":"1855:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":20691,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1858:1:110","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":20692,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20682,"src":"1860:4:110","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20693,"name":"gasleft","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-7,"src":"1865:7:110","typeDescriptions":{"typeIdentifier":"t_function_gasleft_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":20694,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:9:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20689,"name":"call","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20636,"src":"1850:4:110","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory,uint256) returns (bool)"}},"id":20695,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1850:25:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"1835:40:110"},{"condition":{"id":20698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1889:8:110","subExpression":{"id":20697,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20688,"src":"1890:7:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20706,"nodeType":"IfStatement","src":"1885:76:110","trueBody":{"id":20705,"nodeType":"Block","src":"1899:62:110","statements":[{"expression":{"arguments":[{"arguments":[{"id":20701,"name":"maxLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20684,"src":"1942:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20700,"name":"getReturnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20671,"src":"1928:13:110","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"}},"id":20702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1928:21:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":20699,"name":"revertWithData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20678,"src":"1913:14:110","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":20703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1913:37:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20704,"nodeType":"ExpressionStatement","src":"1913:37:110"}]}}]},"id":20708,"implemented":true,"kind":"function","modifiers":[],"name":"callAndRevert","nameLocation":"1755:13:110","nodeType":"FunctionDefinition","parameters":{"id":20685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20680,"mutability":"mutable","name":"to","nameLocation":"1777:2:110","nodeType":"VariableDeclaration","scope":20708,"src":"1769:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20679,"name":"address","nodeType":"ElementaryTypeName","src":"1769:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20682,"mutability":"mutable","name":"data","nameLocation":"1794:4:110","nodeType":"VariableDeclaration","scope":20708,"src":"1781:17:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20681,"name":"bytes","nodeType":"ElementaryTypeName","src":"1781:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20684,"mutability":"mutable","name":"maxLen","nameLocation":"1808:6:110","nodeType":"VariableDeclaration","scope":20708,"src":"1800:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20683,"name":"uint256","nodeType":"ElementaryTypeName","src":"1800:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1768:47:110"},"returnParameters":{"id":20686,"nodeType":"ParameterList","parameters":[],"src":"1825:0:110"},"scope":20709,"src":"1746:221:110","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":20710,"src":"210:1759:110","usedErrors":[]}],"src":"42:1928:110"},"id":110}},"contracts":{"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol":{"GnosisSafe":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AddedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvedHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ApproveHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"handler","type":"address"}],"name":"ChangedFallbackHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"guard","type":"address"}],"name":"ChangedGuard","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"ChangedThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"DisabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"EnabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"RemovedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"initializer","type":"address"},{"indexed":false,"internalType":"address","name":"fallbackHandler","type":"address"}],"name":"SafeSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"}],"name":"SignMsg","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addOwnerWithThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hashToApprove","type":"bytes32"}],"name":"approveHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"approvedHashes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"changeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"uint256","name":"requiredSignatures","type":"uint256"}],"name":"checkNSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"checkSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevModule","type":"address"},{"internalType":"address","name":"module","type":"address"}],"name":"disableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"enableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"encodeTransactionData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address payable","name":"refundReceiver","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"execTransaction","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModule","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModuleReturnData","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"start","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getModulesPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"getStorageAt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"isModuleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"requiredTxGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"}],"name":"setFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guard","type":"address"}],"name":"setGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"fallbackHandler","type":"address"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"payment","type":"uint256"},{"internalType":"address payable","name":"paymentReceiver","type":"address"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"signedMessages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes","name":"calldataPayload","type":"bytes"}],"name":"simulateAndRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"swapOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"author":"Stefan George - Richard Meissner - ","kind":"dev","methods":{"addOwnerWithThreshold(address,uint256)":{"details":"Allows to add a new owner to the Safe and update the threshold at the same time. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold.","owner":"New owner address."}},"approveHash(bytes32)":{"details":"Marks a hash as approved. This can be used to validate a hash that is used by a signature.","params":{"hashToApprove":"The hash that should be marked as approved for signatures that are verified by this contract."}},"changeThreshold(uint256)":{"details":"Allows to update the number of required confirmations by Safe owners. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold."}},"checkNSignatures(bytes32,bytes,bytes,uint256)":{"details":"Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.","params":{"data":"That should be signed (this is passed to an external validator contract)","dataHash":"Hash of the data (could be either a message hash or transaction hash)","requiredSignatures":"Amount of required valid signatures.","signatures":"Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash."}},"checkSignatures(bytes32,bytes,bytes)":{"details":"Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.","params":{"data":"That should be signed (this is passed to an external validator contract)","dataHash":"Hash of the data (could be either a message hash or transaction hash)","signatures":"Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash."}},"disableModule(address,address)":{"details":"Allows to remove a module from the whitelist. This can only be done via a Safe transaction.","params":{"module":"Module to be removed.","prevModule":"Module that pointed to the module to be removed in the linked list"}},"enableModule(address)":{"details":"Allows to add a module to the whitelist. This can only be done via a Safe transaction.","params":{"module":"Module to be whitelisted."}},"encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":{"details":"Returns the bytes that are hashed to be signed by owners.","params":{"_nonce":"Transaction nonce.","baseGas":"Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)","data":"Data payload.","gasPrice":"Maximum gas price that should be used for this transaction.","gasToken":"Token address (or 0 if ETH) that is used for the payment.","operation":"Operation type.","refundReceiver":"Address of receiver of gas payment (or 0 if tx.origin).","safeTxGas":"Gas that should be used for the safe transaction.","to":"Destination address.","value":"Ether value."},"returns":{"_0":"Transaction hash bytes."}},"execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)":{"details":"Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction. Note: The fees are always transferred, even if the user transaction fails.","params":{"baseGas":"Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)","data":"Data payload of Safe transaction.","gasPrice":"Gas price that should be used for the payment calculation.","gasToken":"Token address (or 0 if ETH) that is used for the payment.","operation":"Operation type of Safe transaction.","refundReceiver":"Address of receiver of gas payment (or 0 if tx.origin).","safeTxGas":"Gas that should be used for the Safe transaction.","signatures":"Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})","to":"Destination address of Safe transaction.","value":"Ether value of Safe transaction."}},"execTransactionFromModule(address,uint256,bytes,uint8)":{"details":"Allows a Module to execute a Safe transaction without any further confirmations.","params":{"data":"Data payload of module transaction.","operation":"Operation type of module transaction.","to":"Destination address of module transaction.","value":"Ether value of module transaction."}},"execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":{"details":"Allows a Module to execute a Safe transaction without any further confirmations and return data","params":{"data":"Data payload of module transaction.","operation":"Operation type of module transaction.","to":"Destination address of module transaction.","value":"Ether value of module transaction."}},"getChainId()":{"details":"Returns the chain id used by this contract."},"getModulesPaginated(address,uint256)":{"details":"Returns array of modules.","params":{"pageSize":"Maximum number of modules that should be returned.","start":"Start of the page."},"returns":{"array":"Array of modules.","next":"Start of the next page."}},"getOwners()":{"details":"Returns array of owners.","returns":{"_0":"Array of Safe owners."}},"getStorageAt(uint256,uint256)":{"details":"Reads `length` bytes of storage in the currents contract","params":{"length":"- the number of words (32 bytes) of data to read","offset":"- the offset in the current contract's storage in words to start reading from"},"returns":{"_0":"the bytes that were read."}},"getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":{"details":"Returns hash to be signed by owners.","params":{"_nonce":"Transaction nonce.","baseGas":"Gas costs for data used to trigger the safe transaction.","data":"Data payload.","gasPrice":"Maximum gas price that should be used for this transaction.","gasToken":"Token address (or 0 if ETH) that is used for the payment.","operation":"Operation type.","refundReceiver":"Address of receiver of gas payment (or 0 if tx.origin).","safeTxGas":"Fas that should be used for the safe transaction.","to":"Destination address.","value":"Ether value."},"returns":{"_0":"Transaction hash."}},"isModuleEnabled(address)":{"details":"Returns if an module is enabled","returns":{"_0":"True if the module is enabled"}},"removeOwner(address,address,uint256)":{"details":"Allows to remove an owner from the Safe and update the threshold at the same time. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold.","owner":"Owner address to be removed.","prevOwner":"Owner that pointed to the owner to be removed in the linked list"}},"requiredTxGas(address,uint256,bytes,uint8)":{"details":"Allows to estimate a Safe transaction. This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data. Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`","params":{"data":"Data payload of Safe transaction.","operation":"Operation type of Safe transaction.","to":"Destination address of Safe transaction.","value":"Ether value of Safe transaction."},"returns":{"_0":"Estimate without refunds and overhead fees (base transaction and payload data gas costs)."}},"setFallbackHandler(address)":{"details":"Allows to add a contract to handle fallback calls. Only fallback calls without value and with data will be forwarded. This can only be done via a Safe transaction.","params":{"handler":"contract to handle fallbacks calls."}},"setGuard(address)":{"details":"Set a guard that checks transactions before execution","params":{"guard":"The address of the guard to be used or the 0 address to disable the guard"}},"setup(address[],uint256,address,bytes,address,address,uint256,address)":{"details":"Setup function sets initial storage of contract.","params":{"_owners":"List of Safe owners.","_threshold":"Number of required confirmations for a Safe transaction.","data":"Data payload for optional delegate call.","fallbackHandler":"Handler for fallback calls to this contract","payment":"Value that should be paid","paymentReceiver":"Adddress that should receive the payment (or 0 if tx.origin)","paymentToken":"Token that should be used for the payment (0 is ETH)","to":"Contract address for optional delegate call."}},"simulateAndRevert(address,bytes)":{"details":"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). This method reverts with data equal to `abi.encode(bool(success), bytes(response))`. Specifically, the `returndata` after a call to this method will be: `success:bool || response.length:uint256 || response:bytes`.","params":{"calldataPayload":"Calldata that should be sent to the target contract (encoded method name and arguments).","targetContract":"Address of the contract containing the code to execute."}},"swapOwner(address,address,address)":{"details":"Allows to swap/replace an owner from the Safe with another address. This can only be done via a Safe transaction.","params":{"newOwner":"New owner address.","oldOwner":"Owner address to be replaced.","prevOwner":"Owner that pointed to the owner to be replaced in the linked list"}}},"title":"Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.","version":1},"evm":{"bytecode":{"functionDebugData":{"@_102":{"entryPoint":null,"id":102,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b5060016004556137e6806100256000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd9146106a7578063ffa1ad74146106c757610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e610299366004612b4a565b610710565b005b3480156102ac57600080fd5b5061029e6102bb366004612c50565b6108e4565b3480156102cc57600080fd5b506102e06102db366004612cc5565b610e28565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e0610310366004612cc5565b610e63565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d366004612cf1565b610e9b565b34801561035e57600080fd5b5061037261036d366004612cf1565b610f8a565b6040516102ec929190612dc6565b34801561038c57600080fd5b506103a061039b366004612de1565b610fc0565b6040516102ec9190612e03565b3480156103b957600080fd5b506103246103c8366004612e16565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f5366004612cc5565b611046565b34801561040657600080fd5b5061029e610415366004612e16565b6111d0565b6102e0610428366004612e78565b6112b0565b34801561043957600080fd5b50610324610448366004612b4a565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e610480366004612f51565b611642565b34801561049157600080fd5b5061049a6116a4565b6040516102ec9190613002565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d8366004613015565b611795565b3480156104e957600080fd5b5061029e6104f8366004613065565b6117b8565b34801561050957600080fd5b5061032461051836600461315a565b6118d9565b34801561052957600080fd5b5061053d610538366004612b4a565b611991565b6040516102ec9291906131cb565b34801561055757600080fd5b5061029e610566366004612e16565b611a8b565b34801561057757600080fd5b506103246105863660046131f6565b611b38565b34801561059757600080fd5b5061029e6105a63660046132b7565b611b65565b3480156105b757600080fd5b5061029e6105c6366004612cc5565b611cdc565b3480156105d757600080fd5b5061029e6105e63660046132f0565b611d41565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b3660046131f6565b611ff0565b34801561062c57600080fd5b5061029e61063b366004612cc5565b612189565b34801561064c57600080fd5b5061032460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b3480156106b357600080fd5b5061029e6106c236600461333b565b6121f2565b3480156106d357600080fd5b506103a06040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b6107186123f5565b6001600160a01b0382161580159061073a57506001600160a01b038216600114155b801561074f57506001600160a01b0382163014155b6107a05760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382811660009081526002602052604090205416156108085760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b038481166000818152604081208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560018352835490911617909155600380549161088d836133ab565b90915550506040516001600160a01b03831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146108e0576108e0816111d0565b5050565b6108ef816041612446565b8251101561093f5760405162461bcd60e51b815260206004820152600560248201527f47533032300000000000000000000000000000000000000000000000000000006044820152606401610797565b6000808060008060005b86811015610e1c576041818102890160208101516040820151919092015160ff16955090935091506000849003610bab57919350839161098a876041612446565b8210156109d95760405162461bcd60e51b815260206004820152600560248201527f47533032310000000000000000000000000000000000000000000000000000006044820152606401610797565b87516109e6836020612482565b1115610a345760405162461bcd60e51b815260206004820152600560248201527f47533032320000000000000000000000000000000000000000000000000000006044820152606401610797565b602082890181015189519091610a57908390610a51908790612482565b90612482565b1115610aa55760405162461bcd60e51b815260206004820152600560248201527f47533032330000000000000000000000000000000000000000000000000000006044820152606401610797565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a8501602001916001600160a01b038916906320c13b0b90610af4908f9086906004016133e3565b602060405180830381865afa158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b359190613408565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ba45760405162461bcd60e51b815260206004820152600560248201527f47533032340000000000000000000000000000000000000000000000000000006044820152606401610797565b5050610d6a565b8360ff16600103610c45579193508391336001600160a01b0384161480610bf457506001600160a01b03851660009081526008602090815260408083208d845290915290205415155b610c405760405162461bcd60e51b815260206004820152600560248201527f47533032350000000000000000000000000000000000000000000000000000006044820152606401610797565b610d6a565b601e8460ff161115610d0a576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610caa919061344a565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cf9573d6000803e3d6000fd5b505050602060405103519450610d6a565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610d5d573d6000803e3d6000fd5b5050506020604051035194505b856001600160a01b0316856001600160a01b0316118015610da457506001600160a01b038581166000908152600260205260409020541615155b8015610dba57506001600160a01b038516600114155b610e065760405162461bcd60e51b815260206004820152600560248201527f47533032360000000000000000000000000000000000000000000000000000006044820152606401610797565b8495508080610e14906133ab565b915050610949565b50505050505050505050565b600060016001600160a01b03831614801590610e5d57506001600160a01b038281166000908152600160205260409020541615155b92915050565b60006001600160a01b038216600114801590610e5d5750506001600160a01b0390811660009081526002602052604090205416151590565b600033600114801590610ec55750336000908152600160205260409020546001600160a01b031615155b610f115760405162461bcd60e51b815260206004820152600560248201527f47533130340000000000000000000000000000000000000000000000000000006044820152606401610797565b610f1e858585855a61249e565b90508015610f565760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610f82565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b60006060610f9a86868686610e9b565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000610fcf83602061346d565b67ffffffffffffffff811115610fe757610fe7612b76565b6040519080825280601f01601f191660200182016040528015611011576020820181803683370190505b50905060005b8381101561103e578481015460208083028401015280611036816133ab565b915050611017565b509392505050565b61104e6123f5565b6001600160a01b0381161580159061107057506001600160a01b038116600114155b6110bc5760405162461bcd60e51b815260206004820152600560248201527f47533130310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b0381811660009081526001602052604090205416156111245760405162461bcd60e51b815260206004820152600560248201527f47533130320000000000000000000000000000000000000000000000000000006044820152606401610797565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03858116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b6111d86123f5565b60035481111561122a5760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b600181101561127b5760405162461bcd60e51b815260206004820152600560248201527f47533230320000000000000000000000000000000000000000000000000000006044820152606401610797565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93906020016111c5565b60008060006112ca8e8e8e8e8e8e8e8e8e8e600554611ff0565b6005805491925060006112dc836133ab565b90915550508051602082012091506112f5828286611642565b5060006113207f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b90506001600160a01b038116156113a657806001600160a01b03166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016113739c9b9a99989796959493929190613514565b600060405180830381600087803b15801561138d57600080fd5b505af11580156113a1573d6000803e3d6000fd5b505050505b6113d26113b58a6109c46135f6565b603f6113c28c604061346d565b6113cc919061360e565b906124e5565b6113de906101f46135f6565b5a101561142d5760405162461bcd60e51b815260206004820152600560248201527f47533031300000000000000000000000000000000000000000000000000000006044820152606401610797565b60005a905061149e8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c60001461148b578e61249e565b6109c45a6114999190613649565b61249e565b93506114ab5a82906124fc565b905083806114b857508915155b806114c257508715155b61150e5760405162461bcd60e51b815260206004820152600560248201527f47533031330000000000000000000000000000000000000000000000000000006044820152606401610797565b6000881561152657611523828b8b8b8b612517565b90505b841561156a5760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a16115a4565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b50506001600160a01b03811615611631576040517f932713680000000000000000000000000000000000000000000000000000000081526004810183905283151560248201526001600160a01b03821690639327136890604401600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806116925760405162461bcd60e51b815260206004820152600560248201527f47533030310000000000000000000000000000000000000000000000000000006044820152606401610797565b61169e848484846108e4565b50505050565b6060600060035467ffffffffffffffff8111156116c3576116c3612b76565b6040519080825280602002602001820160405280156116ec578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054919250906001600160a01b03165b6001600160a01b03811660011461178d578083838151811061174d5761174d613660565b6001600160a01b03928316602091820292909201810191909152918116600090815260029092526040909120541681611785816133ab565b925050611729565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6117f68a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061264d915050565b6001600160a01b0384161561182d5761182d847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b61186d8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061292392505050565b81156118845761188282600060018685612517565b505b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b896040516118c595949392919061368f565b60405180910390a250505050505050505050565b6000805a9050611922878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a61249e565b61192b57600080fd5b60005a6119389083613649565b90508060405160200161194d91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b825261079791600401612e03565b606060008267ffffffffffffffff8111156119ae576119ae612b76565b6040519080825280602002602001820160405280156119d7578160200160208202803683370190505b506001600160a01b0380861660009081526001602052604081205492945091165b6001600160a01b03811615801590611a1a57506001600160a01b038116600114155b8015611a2557508482105b15611a7d5780848381518110611a3d57611a3d613660565b6001600160a01b03928316602091820292909201810191909152918116600090815260019092526040909120541681611a75816133ab565b9250506119f8565b908352919491935090915050565b336000908152600260205260409020546001600160a01b0316611af05760405162461bcd60e51b815260206004820152600560248201527f47533033300000000000000000000000000000000000000000000000000000006044820152606401610797565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611b4d8c8c8c8c8c8c8c8c8c8c8c611ff0565b8051906020012090509b9a5050505050505050505050565b611b6d6123f5565b6001600160a01b03811615801590611b8f57506001600160a01b038116600114155b611bdb5760405162461bcd60e51b815260206004820152600560248201527f47533130310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03828116600090815260016020526040902054811690821614611c475760405162461bcd60e51b815260206004820152600560248201527f47533130330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038181166000818152600160209081526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b611ce46123f5565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c88181556040516001600160a01b03831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290602001611cd0565b611d496123f5565b6001600160a01b03811615801590611d6b57506001600160a01b038116600114155b8015611d8057506001600160a01b0381163014155b611dcc5760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038181166000908152600260205260409020541615611e345760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03821615801590611e5657506001600160a01b038216600114155b611ea25760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03838116600090815260026020526040902054811690831614611f0e5760405162461bcd60e51b815260206004820152600560248201527f47533230350000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038281166000818152600260209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a16040516001600160a01b03821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405161202a9291906136fb565b604051908190038120612050949392918e908e908e908e908e908e908e9060200161370b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f010000000000000000000000000000000000000000000000000000000000000061212460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b6121916123f5565b6121b9817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6040516001600160a01b03821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0906020016111c5565b6121fa6123f5565b80600160035461220a9190613649565b10156122585760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b0382161580159061227a57506001600160a01b038216600114155b6122c65760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038381166000908152600260205260409020548116908316146123325760405162461bcd60e51b815260206004820152600560248201527f47533230350000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179094559181528254909116909155600380549161239d8361377b565b90915550506040516001600160a01b03831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a180600454146123f0576123f0816111d0565b505050565b3330146124445760405162461bcd60e51b815260206004820152600560248201527f47533033310000000000000000000000000000000000000000000000000000006044820152606401610797565b565b60008260000361245857506000610e5d565b6000612464838561346d565b905082612471858361360e565b1461247b57600080fd5b9392505050565b60008061248f83856135f6565b90508381101561247b57600080fd5b600060018360018111156124b4576124b46134aa565b036124cc576000808551602087018986f490506124dc565b600080855160208701888a87f190505b95945050505050565b6000818310156124f5578161247b565b5090919050565b60008282111561250b57600080fd5b6000610f828385613649565b6000806001600160a01b0383161561252f5782612531565b325b90506001600160a01b0384166125dc576125633a8610612551573a612553565b855b61255d8989612482565b90612446565b6040519092506001600160a01b0382169083156108fc029084906000818181858888f193505050506125d75760405162461bcd60e51b815260206004820152600560248201527f47533031310000000000000000000000000000000000000000000000000000006044820152606401610797565b612643565b6125ea8561255d8989612482565b91506125f7848284612a65565b6126435760405162461bcd60e51b815260206004820152600560248201527f47533031320000000000000000000000000000000000000000000000000000006044820152606401610797565b5095945050505050565b6004541561269d5760405162461bcd60e51b815260206004820152600560248201527f47533230300000000000000000000000000000000000000000000000000000006044820152606401610797565b81518111156126ee5760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b600181101561273f5760405162461bcd60e51b815260206004820152600560248201527f47533230320000000000000000000000000000000000000000000000000000006044820152606401610797565b600160005b83518110156128d857600084828151811061276157612761613660565b6020026020010151905060006001600160a01b0316816001600160a01b03161415801561279857506001600160a01b038116600114155b80156127ad57506001600160a01b0381163014155b80156127cb5750806001600160a01b0316836001600160a01b031614155b6128175760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03818116600090815260026020526040902054161561287f5760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03928316600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001693821693909317909255806128d0816133ab565b915050612744565b506001600160a01b0316600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f546001600160a01b0316156129a55760405162461bcd60e51b815260206004820152600560248201527f47533130300000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790556001600160a01b038216156108e057612a198260008360015a61249e565b6108e05760405162461bcd60e51b815260206004820152600560248201527f47533030300000000000000000000000000000000000000000000000000000006044820152606401610797565b604080516001600160a01b03841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015612b055760208114612b0d5760009350612b18565b819350612b18565b600051158215171593505b5050509392505050565b6001600160a01b0381168114612b3757600080fd5b50565b8035612b4581612b22565b919050565b60008060408385031215612b5d57600080fd5b8235612b6881612b22565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612bb657600080fd5b813567ffffffffffffffff80821115612bd157612bd1612b76565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c1757612c17612b76565b81604052838152866020858801011115612c3057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215612c6657600080fd5b84359350602085013567ffffffffffffffff80821115612c8557600080fd5b612c9188838901612ba5565b94506040870135915080821115612ca757600080fd5b50612cb487828801612ba5565b949793965093946060013593505050565b600060208284031215612cd757600080fd5b813561247b81612b22565b803560028110612b4557600080fd5b60008060008060808587031215612d0757600080fd5b8435612d1281612b22565b935060208501359250604085013567ffffffffffffffff811115612d3557600080fd5b612d4187828801612ba5565b925050612d5060608601612ce2565b905092959194509250565b6000815180845260005b81811015612d8157602081850181015186830182015201612d65565b81811115612d93576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610f826040830184612d5b565b60008060408385031215612df457600080fd5b50508035926020909101359150565b60208152600061247b6020830184612d5b565b600060208284031215612e2857600080fd5b5035919050565b60008083601f840112612e4157600080fd5b50813567ffffffffffffffff811115612e5957600080fd5b602083019150836020828501011115612e7157600080fd5b9250929050565b60008060008060008060008060008060006101408c8e031215612e9a57600080fd5b612ea38c612b3a565b9a5060208c0135995067ffffffffffffffff8060408e01351115612ec657600080fd5b612ed68e60408f01358f01612e2f565b909a509850612ee760608e01612ce2565b975060808d0135965060a08d0135955060c08d01359450612f0a60e08e01612b3a565b9350612f196101008e01612b3a565b9250806101208e01351115612f2d57600080fd5b50612f3f8d6101208e01358e01612ba5565b90509295989b509295989b9093969950565b600080600060608486031215612f6657600080fd5b83359250602084013567ffffffffffffffff80821115612f8557600080fd5b612f9187838801612ba5565b93506040860135915080821115612fa757600080fd5b50612fb486828701612ba5565b9150509250925092565b600081518084526020808501945080840160005b83811015612ff75781516001600160a01b031687529582019590820190600101612fd2565b509495945050505050565b60208152600061247b6020830184612fbe565b6000806040838503121561302857600080fd5b823561303381612b22565b9150602083013567ffffffffffffffff81111561304f57600080fd5b61305b85828601612ba5565b9150509250929050565b6000806000806000806000806000806101008b8d03121561308557600080fd5b8a3567ffffffffffffffff8082111561309d57600080fd5b818d0191508d601f8301126130b157600080fd5b8135818111156130c057600080fd5b8e60208260051b85010111156130d557600080fd5b60208381019d50909b508d013599506130f060408e01612b3a565b985060608d013591508082111561310657600080fd5b506131138d828e01612e2f565b9097509550613126905060808c01612b3a565b935061313460a08c01612b3a565b925060c08b0135915061314960e08c01612b3a565b90509295989b9194979a5092959850565b60008060008060006080868803121561317257600080fd5b853561317d81612b22565b945060208601359350604086013567ffffffffffffffff8111156131a057600080fd5b6131ac88828901612e2f565b90945092506131bf905060608701612ce2565b90509295509295909350565b6040815260006131de6040830185612fbe565b90506001600160a01b03831660208301529392505050565b60008060008060008060008060008060006101408c8e03121561321857600080fd5b8b3561322381612b22565b9a5060208c0135995060408c013567ffffffffffffffff81111561324657600080fd5b6132528e828f01612e2f565b909a509850613265905060608d01612ce2565b965060808c0135955060a08c0135945060c08c0135935060e08c013561328a81612b22565b92506101008c013561329b81612b22565b809250506101208c013590509295989b509295989b9093969950565b600080604083850312156132ca57600080fd5b82356132d581612b22565b915060208301356132e581612b22565b809150509250929050565b60008060006060848603121561330557600080fd5b833561331081612b22565b9250602084013561332081612b22565b9150604084013561333081612b22565b809150509250925092565b60008060006060848603121561335057600080fd5b833561335b81612b22565b9250602084013561336b81612b22565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133dc576133dc61337c565b5060010190565b6040815260006133f66040830185612d5b565b82810360208401526124dc8185612d5b565b60006020828403121561341a57600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461247b57600080fd5b600060ff821660ff8416808210156134645761346461337c565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134a5576134a561337c565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613510577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60006101606001600160a01b038f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d0116830161357d606085018d6134d9565b8a60808501528960a08501528860c08501526135a460e08501896001600160a01b03169052565b6001600160a01b03871661010085015281848203016101208501526135cb82820187612d5b565b925050506135e56101408301846001600160a01b03169052565b9d9c50505050505050505050505050565b600082198211156136095761360961337c565b500190565b600082613644577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561365b5761365b61337c565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156136d25782356136b581612b22565b6001600160a01b03168252602092830192909101906001016136a2565b50602084019690965250506001600160a01b039283166040820152911660609091015292915050565b8183823760009101908152919050565b6000610160820190508c82526001600160a01b03808d1660208401528b60408401528a6060840152613740608084018b6134d9565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b60008161378a5761378a61337c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e736ca6775bbc663810797384920e08a95b764aacfe5cf8012ac679fd7c3629564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x4 SSTORE PUSH2 0x37E6 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xAFFED0E0 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xE19A9DD9 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF08A0323 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF08A0323 EQ PUSH2 0x620 JUMPI DUP1 PUSH4 0xF698DA25 EQ PUSH2 0x640 JUMPI DUP1 PUSH4 0xF8DC5DD9 EQ PUSH2 0x6A7 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x6C7 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xE19A9DD9 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0xE318B52B EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0xE75235B8 EQ PUSH2 0x5EB JUMPI DUP1 PUSH4 0xE86637DB EQ PUSH2 0x600 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xCC2F8452 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0xCC2F8452 EQ PUSH2 0x51D JUMPI DUP1 PUSH4 0xD4D9BDCD EQ PUSH2 0x54B JUMPI DUP1 PUSH4 0xD8D11F78 EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0xE009CFDE EQ PUSH2 0x58B JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0xB4FABA09 EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0xB63E800D EQ PUSH2 0x4DD JUMPI DUP1 PUSH4 0xC4CA3A9C EQ PUSH2 0x4FD JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x5624B25B GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x6A761202 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x6A761202 EQ PUSH2 0x41A JUMPI DUP1 PUSH4 0x7D832974 EQ PUSH2 0x42D JUMPI DUP1 PUSH4 0x934F3A11 EQ PUSH2 0x465 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x485 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x5624B25B EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0x5AE6BD37 EQ PUSH2 0x3AD JUMPI DUP1 PUSH4 0x610B5925 EQ PUSH2 0x3DA JUMPI DUP1 PUSH4 0x694E80C3 EQ PUSH2 0x3FA JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x2F54BF6E GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x2F5 JUMPI DUP1 PUSH4 0x3408E470 EQ PUSH2 0x315 JUMPI DUP1 PUSH4 0x468721A7 EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x5229073F EQ PUSH2 0x352 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xD582F13 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x12FB68E0 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x2D9AD53D EQ PUSH2 0x2C0 JUMPI PUSH2 0x218 JUMP JUMPDEST CALLDATASIZE PUSH2 0x218 JUMPI PUSH1 0x40 MLOAD CALLVALUE DUP2 MSTORE CALLER SWAP1 PUSH32 0x3D0CE9BFC3ED7D6862DBB28B2DEA94561FE714A1B4D019AA8AF39730D1AD7C3D SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 DUP1 SLOAD DUP1 PUSH2 0x24F JUMPI STOP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY CALLER PUSH1 0x60 SHL CALLDATASIZE MSTORE PUSH1 0x0 DUP1 PUSH1 0x14 CALLDATASIZE ADD PUSH1 0x0 DUP1 DUP6 GAS CALL SWAP1 POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x278 JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x299 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH2 0x710 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x2BB CALLDATASIZE PUSH1 0x4 PUSH2 0x2C50 JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x2DB CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0xE28 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x310 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0xE63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x321 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CHAINID JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2EC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF1 JUMP JUMPDEST PUSH2 0xE9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x372 PUSH2 0x36D CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF1 JUMP JUMPDEST PUSH2 0xF8A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP3 SWAP2 SWAP1 PUSH2 0x2DC6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH2 0x39B CALLDATASIZE PUSH1 0x4 PUSH2 0x2DE1 JUMP JUMPDEST PUSH2 0xFC0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP2 SWAP1 PUSH2 0x2E03 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x3C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x3F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x1046 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x415 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH2 0x11D0 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x428 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E78 JUMP JUMPDEST PUSH2 0x12B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x448 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x480 CALLDATASIZE PUSH1 0x4 PUSH2 0x2F51 JUMP JUMPDEST PUSH2 0x1642 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x491 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x49A PUSH2 0x16A4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP2 SWAP1 PUSH2 0x3002 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x4D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3015 JUMP JUMPDEST PUSH2 0x1795 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x4F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3065 JUMP JUMPDEST PUSH2 0x17B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x509 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x518 CALLDATASIZE PUSH1 0x4 PUSH2 0x315A JUMP JUMPDEST PUSH2 0x18D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53D PUSH2 0x538 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH2 0x1991 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP3 SWAP2 SWAP1 PUSH2 0x31CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x557 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH2 0x1A8B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x31F6 JUMP JUMPDEST PUSH2 0x1B38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x32B7 JUMP JUMPDEST PUSH2 0x1B65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x1CDC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x32F0 JUMP JUMPDEST PUSH2 0x1D41 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH2 0x61B CALLDATASIZE PUSH1 0x4 PUSH2 0x31F6 JUMP JUMPDEST PUSH2 0x1FF0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x62C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x63B CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x2189 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x64C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 CHAINID PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 ADD MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x6C2 CALLDATASIZE PUSH1 0x4 PUSH2 0x333B JUMP JUMPDEST PUSH2 0x21F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E332E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH2 0x718 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x73A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x74F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x7A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH32 0xE90B7BCEB6E7DF5418FB78D8EE546E97C83A08BBCCC01A0644D599CCD2A7C2E0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SWAP4 SSTORE PUSH1 0x1 DUP4 MSTORE DUP4 SLOAD SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 PUSH2 0x88D DUP4 PUSH2 0x33AB JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x4 SLOAD EQ PUSH2 0x8E0 JUMPI PUSH2 0x8E0 DUP2 PUSH2 0x11D0 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x8EF DUP2 PUSH1 0x41 PUSH2 0x2446 JUMP JUMPDEST DUP3 MLOAD LT ISZERO PUSH2 0x93F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303230000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xE1C JUMPI PUSH1 0x41 DUP2 DUP2 MUL DUP10 ADD PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD SWAP2 SWAP1 SWAP3 ADD MLOAD PUSH1 0xFF AND SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP PUSH1 0x0 DUP5 SWAP1 SUB PUSH2 0xBAB JUMPI SWAP2 SWAP4 POP DUP4 SWAP2 PUSH2 0x98A DUP8 PUSH1 0x41 PUSH2 0x2446 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303231000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP8 MLOAD PUSH2 0x9E6 DUP4 PUSH1 0x20 PUSH2 0x2482 JUMP JUMPDEST GT ISZERO PUSH2 0xA34 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303232000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP10 ADD DUP2 ADD MLOAD DUP10 MLOAD SWAP1 SWAP2 PUSH2 0xA57 SWAP1 DUP4 SWAP1 PUSH2 0xA51 SWAP1 DUP8 SWAP1 PUSH2 0x2482 JUMP JUMPDEST SWAP1 PUSH2 0x2482 JUMP JUMPDEST GT ISZERO PUSH2 0xAA5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303233000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE DUP11 DUP6 ADD PUSH1 0x20 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0x20C13B0B SWAP1 PUSH2 0xAF4 SWAP1 DUP16 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x33E3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB35 SWAP2 SWAP1 PUSH2 0x3408 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND EQ PUSH2 0xBA4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303234000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST POP POP PUSH2 0xD6A JUMP JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1 SUB PUSH2 0xC45 JUMPI SWAP2 SWAP4 POP DUP4 SWAP2 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND EQ DUP1 PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP14 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD ISZERO ISZERO JUMPDEST PUSH2 0xC40 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303235000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0xD6A JUMP JUMPDEST PUSH1 0x1E DUP5 PUSH1 0xFF AND GT ISZERO PUSH2 0xD0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x4 DUP7 PUSH2 0xCAA SWAP2 SWAP1 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCF9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0xD6A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP13 SWAP1 MSTORE PUSH1 0xFF DUP7 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD5D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND GT DUP1 ISZERO PUSH2 0xDA4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0xDBA JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0xE06 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303236000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP5 SWAP6 POP DUP1 DUP1 PUSH2 0xE14 SWAP1 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x949 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND EQ DUP1 ISZERO SWAP1 PUSH2 0xE5D JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0xE5D JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0xEC5 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST PUSH2 0xF11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0xF1E DUP6 DUP6 DUP6 DUP6 GAS PUSH2 0x249E JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0xF56 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0x6895C13664AA4F67288B25D7A21D7AAA34916E355FB9B6FAE0A139A9085BECB8 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xF82 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0xACD2C8702804128FDB0DB2BB49F6D127DD0181C13FD45DBFE16DE0930E2BD375 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0xF9A DUP7 DUP7 DUP7 DUP7 PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP PUSH1 0x40 MLOAD PUSH1 0x20 RETURNDATASIZE ADD DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY DUP1 SWAP2 POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xFCF DUP4 PUSH1 0x20 PUSH2 0x346D JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFE7 JUMPI PUSH2 0xFE7 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1011 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x103E JUMPI DUP5 DUP2 ADD SLOAD PUSH1 0x20 DUP1 DUP4 MUL DUP5 ADD ADD MSTORE DUP1 PUSH2 0x1036 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1017 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x104E PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1070 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x10BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1124 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP5 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP5 DUP6 AND OR SWAP1 SWAP5 SSTORE SWAP6 SWAP1 SWAP6 MSTORE DUP3 SLOAD AND DUP5 OR SWAP1 SWAP2 SSTORE MLOAD SWAP2 DUP3 MSTORE PUSH32 0xECDF3A3EFFEA5783A3C4C2140E677577666428D44ED9D474A0B3A4C9943F8440 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x11D8 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 GT ISZERO PUSH2 0x122A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x127B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x610F7FF2B304AE8903C3DE74C60C6AB1F7D6226B3F52C5161905BB5AD4039C93 SWAP1 PUSH1 0x20 ADD PUSH2 0x11C5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x12CA DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 PUSH1 0x5 SLOAD PUSH2 0x1FF0 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD SWAP2 SWAP3 POP PUSH1 0x0 PUSH2 0x12DC DUP4 PUSH2 0x33AB JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD KECCAK256 SWAP2 POP PUSH2 0x12F5 DUP3 DUP3 DUP7 PUSH2 0x1642 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1320 PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 SLOAD SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x13A6 JUMPI DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x75F0BB52 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 CALLER PUSH1 0x40 MLOAD DUP14 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1373 SWAP13 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3514 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x13D2 PUSH2 0x13B5 DUP11 PUSH2 0x9C4 PUSH2 0x35F6 JUMP JUMPDEST PUSH1 0x3F PUSH2 0x13C2 DUP13 PUSH1 0x40 PUSH2 0x346D JUMP JUMPDEST PUSH2 0x13CC SWAP2 SWAP1 PUSH2 0x360E JUMP JUMPDEST SWAP1 PUSH2 0x24E5 JUMP JUMPDEST PUSH2 0x13DE SWAP1 PUSH2 0x1F4 PUSH2 0x35F6 JUMP JUMPDEST GAS LT ISZERO PUSH2 0x142D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303130000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH2 0x149E DUP16 DUP16 DUP16 DUP16 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP DUP15 DUP13 PUSH1 0x0 EQ PUSH2 0x148B JUMPI DUP15 PUSH2 0x249E JUMP JUMPDEST PUSH2 0x9C4 GAS PUSH2 0x1499 SWAP2 SWAP1 PUSH2 0x3649 JUMP JUMPDEST PUSH2 0x249E JUMP JUMPDEST SWAP4 POP PUSH2 0x14AB GAS DUP3 SWAP1 PUSH2 0x24FC JUMP JUMPDEST SWAP1 POP DUP4 DUP1 PUSH2 0x14B8 JUMPI POP DUP10 ISZERO ISZERO JUMPDEST DUP1 PUSH2 0x14C2 JUMPI POP DUP8 ISZERO ISZERO JUMPDEST PUSH2 0x150E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303133000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 DUP9 ISZERO PUSH2 0x1526 JUMPI PUSH2 0x1523 DUP3 DUP12 DUP12 DUP12 DUP12 PUSH2 0x2517 JUMP JUMPDEST SWAP1 POP JUMPDEST DUP5 ISZERO PUSH2 0x156A JUMPI PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE PUSH32 0x442E715F626346E8C54381002DA614F62BEE8D27386535B2521EC8540898556E SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x15A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE PUSH32 0x23428B18ACFB3EA64B08DC0C1D296EA9C09702C09083CA5272E64D115B687D23 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1631 JUMPI PUSH1 0x40 MLOAD PUSH32 0x9327136800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE DUP4 ISZERO ISZERO PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x93271368 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1618 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x162C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD DUP1 PUSH2 0x1692 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0x169E DUP5 DUP5 DUP5 DUP5 PUSH2 0x8E4 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x3 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16C3 JUMPI PUSH2 0x16C3 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x16EC JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH32 0xE90B7BCEB6E7DF5418FB78D8EE546E97C83A08BBCCC01A0644D599CCD2A7C2E0 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ PUSH2 0x178D JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x174D JUMPI PUSH2 0x174D PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x1785 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP3 POP POP PUSH2 0x1729 JUMP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL DUP1 PUSH1 0x0 MSTORE POP RETURNDATASIZE PUSH1 0x20 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x40 RETURNDATACOPY PUSH1 0x40 RETURNDATASIZE ADD PUSH1 0x0 REVERT JUMPDEST PUSH2 0x17F6 DUP11 DUP11 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP13 SWAP3 POP PUSH2 0x264D SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x182D JUMPI PUSH2 0x182D DUP5 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH2 0x186D DUP8 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2923 SWAP3 POP POP POP JUMP JUMPDEST DUP2 ISZERO PUSH2 0x1884 JUMPI PUSH2 0x1882 DUP3 PUSH1 0x0 PUSH1 0x1 DUP7 DUP6 PUSH2 0x2517 JUMP JUMPDEST POP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x141DF868A6331AF528E38C83B7AA03EDC19BE66E37AE67F9285BF4F8E3C6A1A8 DUP12 DUP12 DUP12 DUP12 DUP10 PUSH1 0x40 MLOAD PUSH2 0x18C5 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x368F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH2 0x1922 DUP8 DUP8 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP10 SWAP3 POP POP POP GAS PUSH2 0x249E JUMP JUMPDEST PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 GAS PUSH2 0x1938 SWAP1 DUP4 PUSH2 0x3649 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x194D SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH3 0x461BCD PUSH1 0xE5 SHL DUP3 MSTORE PUSH2 0x797 SWAP2 PUSH1 0x4 ADD PUSH2 0x2E03 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19AE JUMPI PUSH2 0x19AE PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x19D7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP5 POP SWAP2 AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1A1A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1A25 JUMPI POP DUP5 DUP3 LT JUMPDEST ISZERO PUSH2 0x1A7D JUMPI DUP1 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1A3D JUMPI PUSH2 0x1A3D PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x1A75 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP3 POP POP PUSH2 0x19F8 JUMP JUMPDEST SWAP1 DUP4 MSTORE SWAP2 SWAP5 SWAP2 SWAP4 POP SWAP1 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1AF0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303330000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 PUSH1 0x1 SWAP1 SSTORE MLOAD DUP4 SWAP2 PUSH32 0xF2A0EB156472D1440255B0D7C1E19CC07115D1051FE605B0DCE69ACFEC884D9C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B4D DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 PUSH2 0x1FF0 JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1B6D PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1B8F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x1BDB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x1C47 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 DUP8 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD SWAP2 SWAP1 SWAP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xAAB4FA2B463F581B2B32CB3B7E3B704B9CE37CC209B5FB4D77E593ACE4054276 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0x1CE4 PUSH2 0x23F5 JUMP JUMPDEST PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0x1151116914515BC0891FF9047A6CB32CF902546F83066499BCF8BA33D2353FA2 SWAP1 PUSH1 0x20 ADD PUSH2 0x1CD0 JUMP JUMPDEST PUSH2 0x1D49 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1D6B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1D80 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x1DCC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E34 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1E56 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x1EA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x1F0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 DUP8 AND DUP1 DUP7 MSTORE DUP4 DUP7 KECCAK256 DUP1 SLOAD SWAP3 DUP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SSTORE SWAP7 DUP11 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD DUP3 AND SWAP1 SWAP8 OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH32 0xBB8310D486368DB6BD6F849402FDD73AD53D316B5A4B2644AD6EFE0F941286D8 PUSH1 0x0 SHL DUP14 DUP14 DUP14 DUP14 PUSH1 0x40 MLOAD PUSH2 0x202A SWAP3 SWAP2 SWAP1 PUSH2 0x36FB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x2050 SWAP5 SWAP4 SWAP3 SWAP2 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x20 ADD PUSH2 0x370B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP1 POP PUSH32 0x1900000000000000000000000000000000000000000000000000000000000000 PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 PUSH2 0x2124 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 CHAINID PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 ADD MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP4 DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x21 DUP4 ADD MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x62 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2191 PUSH2 0x23F5 JUMP JUMPDEST PUSH2 0x21B9 DUP2 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP2 MSTORE PUSH32 0x5AC6C46C93C8D0E53714BA3B53DB3E7C046DA994313D7ED0D192028BC7C228B0 SWAP1 PUSH1 0x20 ADD PUSH2 0x11C5 JUMP JUMPDEST PUSH2 0x21FA PUSH2 0x23F5 JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x3 SLOAD PUSH2 0x220A SWAP2 SWAP1 PUSH2 0x3649 JUMP JUMPDEST LT ISZERO PUSH2 0x2258 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x227A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x22C6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x2332 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP9 DUP7 AND DUP5 MSTORE SWAP2 DUP4 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE DUP3 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 PUSH2 0x239D DUP4 PUSH2 0x377B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x4 SLOAD EQ PUSH2 0x23F0 JUMPI PUSH2 0x23F0 DUP2 PUSH2 0x11D0 JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x2444 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x2458 JUMPI POP PUSH1 0x0 PUSH2 0xE5D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2464 DUP4 DUP6 PUSH2 0x346D JUMP JUMPDEST SWAP1 POP DUP3 PUSH2 0x2471 DUP6 DUP4 PUSH2 0x360E JUMP JUMPDEST EQ PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x248F DUP4 DUP6 PUSH2 0x35F6 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x24B4 JUMPI PUSH2 0x24B4 PUSH2 0x34AA JUMP JUMPDEST SUB PUSH2 0x24CC JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x24DC JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT ISZERO PUSH2 0x24F5 JUMPI DUP2 PUSH2 0x247B JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x250B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF82 DUP4 DUP6 PUSH2 0x3649 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO PUSH2 0x252F JUMPI DUP3 PUSH2 0x2531 JUMP JUMPDEST ORIGIN JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x25DC JUMPI PUSH2 0x2563 GASPRICE DUP7 LT PUSH2 0x2551 JUMPI GASPRICE PUSH2 0x2553 JUMP JUMPDEST DUP6 JUMPDEST PUSH2 0x255D DUP10 DUP10 PUSH2 0x2482 JUMP JUMPDEST SWAP1 PUSH2 0x2446 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP PUSH2 0x25D7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303131000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x25EA DUP6 PUSH2 0x255D DUP10 DUP10 PUSH2 0x2482 JUMP JUMPDEST SWAP2 POP PUSH2 0x25F7 DUP5 DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH2 0x2643 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303132000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD ISZERO PUSH2 0x269D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP2 MLOAD DUP2 GT ISZERO PUSH2 0x26EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x273F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x28D8 JUMPI PUSH1 0x0 DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2761 JUMPI PUSH2 0x2761 PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO DUP1 ISZERO PUSH2 0x2798 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x27AD JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x27CB JUMPI POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST PUSH2 0x2817 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x287F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP3 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE DUP1 PUSH2 0x28D0 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2744 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD PUSH1 0x3 SSTORE PUSH1 0x4 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 SWAP1 MSTORE PUSH1 0x20 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x29A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 SWAP1 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH2 0x8E0 JUMPI PUSH2 0x2A19 DUP3 PUSH1 0x0 DUP4 PUSH1 0x1 GAS PUSH2 0x249E JUMP JUMPDEST PUSH2 0x8E0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 OR DUP2 MSTORE DUP3 MLOAD PUSH1 0x0 SWAP4 SWAP3 SWAP2 DUP5 SWAP2 SWAP1 DUP3 DUP10 PUSH2 0x2710 GAS SUB CALL RETURNDATASIZE DUP1 ISZERO PUSH2 0x2B05 JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0x2B0D JUMPI PUSH1 0x0 SWAP4 POP PUSH2 0x2B18 JUMP JUMPDEST DUP2 SWAP4 POP PUSH2 0x2B18 JUMP JUMPDEST PUSH1 0x0 MLOAD ISZERO DUP3 ISZERO OR ISZERO SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x2B37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x2B45 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2B5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2B68 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2BB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2BD1 JUMPI PUSH2 0x2BD1 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x2C17 JUMPI PUSH2 0x2C17 PUSH2 0x2B76 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x2C30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2C66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2C85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C91 DUP9 DUP4 DUP10 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2CA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CB4 DUP8 DUP3 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2CD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x247B DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x2B45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2D07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2D12 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D41 DUP8 DUP3 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP3 POP POP PUSH2 0x2D50 PUSH1 0x60 DUP7 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2D81 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x2D65 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x2D93 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0xF82 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2DF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x247B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2E41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2E59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2E71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x140 DUP13 DUP15 SUB SLT ISZERO PUSH2 0x2E9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2EA3 DUP13 PUSH2 0x2B3A JUMP JUMPDEST SWAP11 POP PUSH1 0x20 DUP13 ADD CALLDATALOAD SWAP10 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP1 PUSH1 0x40 DUP15 ADD CALLDATALOAD GT ISZERO PUSH2 0x2EC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2ED6 DUP15 PUSH1 0x40 DUP16 ADD CALLDATALOAD DUP16 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH2 0x2EE7 PUSH1 0x60 DUP15 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP8 POP PUSH1 0x80 DUP14 ADD CALLDATALOAD SWAP7 POP PUSH1 0xA0 DUP14 ADD CALLDATALOAD SWAP6 POP PUSH1 0xC0 DUP14 ADD CALLDATALOAD SWAP5 POP PUSH2 0x2F0A PUSH1 0xE0 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP4 POP PUSH2 0x2F19 PUSH2 0x100 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP3 POP DUP1 PUSH2 0x120 DUP15 ADD CALLDATALOAD GT ISZERO PUSH2 0x2F2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F3F DUP14 PUSH2 0x120 DUP15 ADD CALLDATALOAD DUP15 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP1 SWAP4 SWAP7 SWAP10 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2F66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2F85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2F91 DUP8 DUP4 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2FA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FB4 DUP7 DUP3 DUP8 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2FF7 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2FD2 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x247B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2FBE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3028 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3033 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x304F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x305B DUP6 DUP3 DUP7 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP12 DUP14 SUB SLT ISZERO PUSH2 0x3085 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP11 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x309D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP14 ADD SWAP2 POP DUP14 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x30B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x30C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP15 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x30D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD SWAP14 POP SWAP1 SWAP12 POP DUP14 ADD CALLDATALOAD SWAP10 POP PUSH2 0x30F0 PUSH1 0x40 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP9 POP PUSH1 0x60 DUP14 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3113 DUP14 DUP3 DUP15 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH2 0x3126 SWAP1 POP PUSH1 0x80 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP4 POP PUSH2 0x3134 PUSH1 0xA0 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP12 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3149 PUSH1 0xE0 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP2 SWAP5 SWAP8 SWAP11 POP SWAP3 SWAP6 SWAP9 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x317D DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x31A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x31AC DUP9 DUP3 DUP10 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x31BF SWAP1 POP PUSH1 0x60 DUP8 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x31DE PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2FBE JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x140 DUP13 DUP15 SUB SLT ISZERO PUSH2 0x3218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP12 CALLDATALOAD PUSH2 0x3223 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP11 POP PUSH1 0x20 DUP13 ADD CALLDATALOAD SWAP10 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3246 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3252 DUP15 DUP3 DUP16 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH2 0x3265 SWAP1 POP PUSH1 0x60 DUP14 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP7 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP6 POP PUSH1 0xA0 DUP13 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 DUP13 ADD CALLDATALOAD SWAP4 POP PUSH1 0xE0 DUP13 ADD CALLDATALOAD PUSH2 0x328A DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 DUP13 ADD CALLDATALOAD PUSH2 0x329B DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH2 0x120 DUP13 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP1 SWAP4 SWAP7 SWAP10 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x32CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x32D5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x32E5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3310 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x3320 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x3330 DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x335B DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x336B DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x33DC JUMPI PUSH2 0x33DC PUSH2 0x337C JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x33F6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D5B JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x24DC DUP2 DUP6 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x341A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x3464 JUMPI PUSH2 0x3464 PUSH2 0x337C JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x34A5 JUMPI PUSH2 0x34A5 PUSH2 0x337C JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x3510 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP16 AND DUP4 MSTORE DUP14 PUSH1 0x20 DUP5 ADD MSTORE DUP1 PUSH1 0x40 DUP5 ADD MSTORE DUP12 DUP2 DUP5 ADD MSTORE POP PUSH2 0x180 DUP12 DUP14 DUP3 DUP6 ADD CALLDATACOPY PUSH1 0x0 DUP2 DUP14 DUP6 ADD ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP14 ADD AND DUP4 ADD PUSH2 0x357D PUSH1 0x60 DUP6 ADD DUP14 PUSH2 0x34D9 JUMP JUMPDEST DUP11 PUSH1 0x80 DUP6 ADD MSTORE DUP10 PUSH1 0xA0 DUP6 ADD MSTORE DUP9 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x35A4 PUSH1 0xE0 DUP6 ADD DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x100 DUP6 ADD MSTORE DUP2 DUP5 DUP3 SUB ADD PUSH2 0x120 DUP6 ADD MSTORE PUSH2 0x35CB DUP3 DUP3 ADD DUP8 PUSH2 0x2D5B JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x35E5 PUSH2 0x140 DUP4 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST SWAP14 SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x3609 JUMPI PUSH2 0x3609 PUSH2 0x337C JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3644 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x365B JUMPI PUSH2 0x365B PUSH2 0x337C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x0 DUP7 PUSH1 0xA0 DUP4 ADD DUP3 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0x36D2 JUMPI DUP3 CALLDATALOAD PUSH2 0x36B5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x36A2 JUMP JUMPDEST POP PUSH1 0x20 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 ADD SWAP1 POP DUP13 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3740 PUSH1 0x80 DUP5 ADD DUP12 PUSH2 0x34D9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD SWAP9 SWAP1 SWAP9 MSTORE PUSH1 0xC0 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0xE0 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP2 DUP6 AND PUSH2 0x100 DUP5 ADD MSTORE SWAP1 SWAP4 AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x378A JUMPI PUSH2 0x378A PUSH2 0x337C JUMP JUMPDEST POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE7 CALLDATASIZE 0xCA PUSH8 0x75BBC66381079738 0x49 KECCAK256 0xE0 DUP11 SWAP6 0xB7 PUSH5 0xAACFE5CF80 SLT 0xAC PUSH8 0x9FD7C3629564736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"722:19528:0:-:0;;;2490:247;;;;;;;;;-1:-1:-1;2729:1:0;2717:9;:13;722:19528;;;;;;"},"deployedBytecode":{"functionDebugData":{"@VERSION_39":{"entryPoint":null,"id":39,"parameterSlots":0,"returnSlots":0},"@_1034":{"entryPoint":null,"id":1034,"parameterSlots":0,"returnSlots":0},"@_2019":{"entryPoint":null,"id":2019,"parameterSlots":0,"returnSlots":0},"@addOwnerWithThreshold_1702":{"entryPoint":1808,"id":1702,"parameterSlots":2,"returnSlots":0},"@add_2267":{"entryPoint":9346,"id":2267,"parameterSlots":2,"returnSlots":1},"@approveHash_815":{"entryPoint":6795,"id":815,"parameterSlots":1,"returnSlots":0},"@approvedHashes_94":{"entryPoint":null,"id":94,"parameterSlots":0,"returnSlots":0},"@changeThreshold_1910":{"entryPoint":4560,"id":1910,"parameterSlots":1,"returnSlots":0},"@checkNSignatures_731":{"entryPoint":2276,"id":731,"parameterSlots":4,"returnSlots":0},"@checkSignatures_490":{"entryPoint":5698,"id":490,"parameterSlots":3,"returnSlots":0},"@disableModule_1304":{"entryPoint":7013,"id":1304,"parameterSlots":2,"returnSlots":0},"@domainSeparator_844":{"entryPoint":null,"id":844,"parameterSlots":0,"returnSlots":1},"@enableModule_1249":{"entryPoint":4166,"id":1249,"parameterSlots":1,"returnSlots":0},"@encodeTransactionData_908":{"entryPoint":8176,"id":908,"parameterSlots":11,"returnSlots":1},"@execTransactionFromModuleReturnData_1389":{"entryPoint":3978,"id":1389,"parameterSlots":4,"returnSlots":2},"@execTransactionFromModule_1361":{"entryPoint":3739,"id":1361,"parameterSlots":4,"returnSlots":1},"@execTransaction_376":{"entryPoint":4784,"id":376,"parameterSlots":11,"returnSlots":1},"@execute_983":{"entryPoint":9374,"id":983,"parameterSlots":5,"returnSlots":1},"@getChainId_828":{"entryPoint":null,"id":828,"parameterSlots":0,"returnSlots":1},"@getGuard_1112":{"entryPoint":null,"id":1112,"parameterSlots":0,"returnSlots":1},"@getModulesPaginated_1479":{"entryPoint":6545,"id":1479,"parameterSlots":2,"returnSlots":2},"@getOwners_1990":{"entryPoint":5796,"id":1990,"parameterSlots":0,"returnSlots":1},"@getStorageAt_2137":{"entryPoint":4032,"id":2137,"parameterSlots":2,"returnSlots":1},"@getThreshold_1918":{"entryPoint":null,"id":1918,"parameterSlots":0,"returnSlots":1},"@getTransactionHash_951":{"entryPoint":6968,"id":951,"parameterSlots":11,"returnSlots":1},"@handlePayment_461":{"entryPoint":9495,"id":461,"parameterSlots":5,"returnSlots":1},"@internalSetFallbackHandler_1008":{"entryPoint":null,"id":1008,"parameterSlots":1,"returnSlots":0},"@isModuleEnabled_1411":{"entryPoint":3624,"id":1411,"parameterSlots":1,"returnSlots":1},"@isOwner_1939":{"entryPoint":3683,"id":1939,"parameterSlots":1,"returnSlots":1},"@max_2285":{"entryPoint":9445,"id":2285,"parameterSlots":2,"returnSlots":1},"@mul_2217":{"entryPoint":9286,"id":2217,"parameterSlots":2,"returnSlots":1},"@nonce_82":{"entryPoint":null,"id":82,"parameterSlots":0,"returnSlots":0},"@removeOwner_1779":{"entryPoint":8690,"id":1779,"parameterSlots":3,"returnSlots":0},"@requireSelfCall_2065":{"entryPoint":9205,"id":2065,"parameterSlots":0,"returnSlots":0},"@requiredTxGas_780":{"entryPoint":6361,"id":780,"parameterSlots":5,"returnSlots":1},"@setFallbackHandler_1025":{"entryPoint":8585,"id":1025,"parameterSlots":1,"returnSlots":0},"@setGuard_1101":{"entryPoint":7388,"id":1101,"parameterSlots":1,"returnSlots":0},"@setupModules_1196":{"entryPoint":10531,"id":1196,"parameterSlots":2,"returnSlots":0},"@setupOwners_1629":{"entryPoint":9805,"id":1629,"parameterSlots":2,"returnSlots":0},"@setup_167":{"entryPoint":6072,"id":167,"parameterSlots":10,"returnSlots":0},"@signatureSplit_2092":{"entryPoint":null,"id":2092,"parameterSlots":2,"returnSlots":3},"@signedMessages_88":{"entryPoint":null,"id":88,"parameterSlots":0,"returnSlots":0},"@simulateAndRevert_2147":{"entryPoint":6037,"id":2147,"parameterSlots":2,"returnSlots":0},"@sub_2242":{"entryPoint":9468,"id":2242,"parameterSlots":2,"returnSlots":1},"@swapOwner_1879":{"entryPoint":7489,"id":1879,"parameterSlots":3,"returnSlots":0},"@transferToken_2046":{"entryPoint":10853,"id":2046,"parameterSlots":3,"returnSlots":1},"abi_decode_address":{"entryPoint":11066,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_bytes":{"entryPoint":11173,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11823,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_enum_Operation":{"entryPoint":11490,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":11461,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_address":{"entryPoint":12983,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_address":{"entryPoint":13040,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_addresst_uint256":{"entryPoint":13115,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_bytes32":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":12309,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":11082,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997":{"entryPoint":12634,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_address_payablet_bytes_memory_ptr":{"entryPoint":11896,"id":null,"parameterSlots":2,"returnSlots":11},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_addresst_uint256":{"entryPoint":12790,"id":null,"parameterSlots":2,"returnSlots":11},"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997":{"entryPoint":11505,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_uint256t_addresst_bytes_calldata_ptrt_addresst_addresst_uint256t_address_payable":{"entryPoint":12389,"id":null,"parameterSlots":2,"returnSlots":10},"abi_decode_tuple_t_bytes32":{"entryPoint":11798,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptr":{"entryPoint":12113,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptrt_uint256":{"entryPoint":11344,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bytes4_fromMemory":{"entryPoint":13320,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_uint256":{"entryPoint":11745,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_array_address_dyn":{"entryPoint":12222,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":11611,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_enum_Operation":{"entryPoint":13529,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_tuple_packed_t_bytes1_t_bytes1_t_bytes32_t_bytes32__to_t_bytes1_t_bytes1_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":14075,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_uint256__to_t_uint256__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__fromStack_reversed":{"entryPoint":13588,"id":null,"parameterSlots":13,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_calldata_ptr_t_uint256_t_address_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_address__fromStack_reversed":{"entryPoint":13967,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed":{"entryPoint":12290,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed":{"entryPoint":12747,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":11718,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_address_t_uint256_t_bytes32_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__to_t_bytes32_t_address_t_uint256_t_bytes32_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":14091,"id":null,"parameterSlots":12,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_bool__to_t_bytes32_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint256_t_contract$_GnosisSafe_$952__to_t_bytes32_t_uint256_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":11779,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":13283,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00aecc0fa22d38afc0f465808a9fee188ba139fb53b2ca550ea01d91d6ecf29f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_14032cc06a7a2043c1b961d6b7d6cbfaea1511224ce5ca723af49fa68e55c159__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1d9dfad0f7e80ccb3a898324566cbd9ed8451678d229622c4c1b5f1f19330139__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26b7fa7d947085035b53de5c25693e568c405e1e894ad22389a1528045f35ba8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_372498b513e17609439d064ce0277017b054c808f722c83ff57cee4e06a9e457__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3a328c389014707497c45ecba7527a678d30fabfd6868fe8bade352062f7774b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3fdb21530a98d914fa570cd548d7a3608c11195b5a11ec44ecd149309d9dcced__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4353e9bcd8ea99b4d56990ac4b8777f1ab67cada8356790f30e482f2408a44b0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_74edef16877c9a34a97f281dbea2805f9198008e7df330ab6416449a66143b07__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8c9c6f726a0896ef73f47c5bcc7192641db350a8b0b2e1f61e0f0c694ec59426__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_93293a4a2e4cde533ea81b8912d8934c2d7892ceb975e9ad2c25f4abf449a730__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_99333b4627cde46d9c53d7148b33b8b1f4f065f5dceb2cb210893e67e551978e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9d970fd9adbe3047cd5b7a20406b6bf2e613338cfe3a19aca4ca1810b67fad10__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bc2491dc7fc5c71a630e01bcb9c3e39f61f559ab54f6528d2adb67d65ed9ff6b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_d153a9d5a0d4e2c2b7d4e887f02c1da6287d6d54f20f4d8ce40382a23140787a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f27dba96666375fe844b71e8ea4f388db2ce9f87fa9882d36a17036a7478b232__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":13814,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":13838,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":13421,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":13897,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint8":{"entryPoint":13386,"id":null,"parameterSlots":2,"returnSlots":1},"decrement_t_uint256":{"entryPoint":14203,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":13227,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":13180,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":13482,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":13920,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":11126,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":11042,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:33047:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"115:76:111","statements":[{"nodeType":"YulAssignment","src":"125:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"125:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"167:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:25:111"},"nodeType":"YulExpressionStatement","src":"160:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"84:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"95:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"106:4:111","type":""}],"src":"14:177:111"},{"body":{"nodeType":"YulBlock","src":"241:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"264:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"275:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"282:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"271:3:111"},"nodeType":"YulFunctionCall","src":"271:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"261:2:111"},"nodeType":"YulFunctionCall","src":"261:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"254:6:111"},"nodeType":"YulFunctionCall","src":"254:73:111"},"nodeType":"YulIf","src":"251:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"230:5:111","type":""}],"src":"196:154:111"},{"body":{"nodeType":"YulBlock","src":"404:85:111","statements":[{"nodeType":"YulAssignment","src":"414:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"436:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"423:12:111"},"nodeType":"YulFunctionCall","src":"423:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"414:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"477:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"452:24:111"},"nodeType":"YulFunctionCall","src":"452:31:111"},"nodeType":"YulExpressionStatement","src":"452:31:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"383:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"394:5:111","type":""}],"src":"355:134:111"},{"body":{"nodeType":"YulBlock","src":"581:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"627:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"636:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"639:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"629:6:111"},"nodeType":"YulFunctionCall","src":"629:12:111"},"nodeType":"YulExpressionStatement","src":"629:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"602:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"611:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"598:3:111"},"nodeType":"YulFunctionCall","src":"598:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"623:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"594:3:111"},"nodeType":"YulFunctionCall","src":"594:32:111"},"nodeType":"YulIf","src":"591:52:111"},{"nodeType":"YulVariableDeclaration","src":"652:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"678:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"665:12:111"},"nodeType":"YulFunctionCall","src":"665:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"656:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"722:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"697:24:111"},"nodeType":"YulFunctionCall","src":"697:31:111"},"nodeType":"YulExpressionStatement","src":"697:31:111"},{"nodeType":"YulAssignment","src":"737:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"747:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"737:6:111"}]},{"nodeType":"YulAssignment","src":"761:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"788:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"799:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"784:3:111"},"nodeType":"YulFunctionCall","src":"784:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"771:12:111"},"nodeType":"YulFunctionCall","src":"771:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"761:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"539:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"550:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"562:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"570:6:111","type":""}],"src":"494:315:111"},{"body":{"nodeType":"YulBlock","src":"846:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"863:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"866:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"856:6:111"},"nodeType":"YulFunctionCall","src":"856:88:111"},"nodeType":"YulExpressionStatement","src":"856:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"960:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"963:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"953:6:111"},"nodeType":"YulFunctionCall","src":"953:15:111"},"nodeType":"YulExpressionStatement","src":"953:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"984:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"987:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"977:6:111"},"nodeType":"YulFunctionCall","src":"977:15:111"},"nodeType":"YulExpressionStatement","src":"977:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"814:184:111"},{"body":{"nodeType":"YulBlock","src":"1055:725:111","statements":[{"body":{"nodeType":"YulBlock","src":"1104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1106:6:111"},"nodeType":"YulFunctionCall","src":"1106:12:111"},"nodeType":"YulExpressionStatement","src":"1106:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1083:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1091:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1079:3:111"},"nodeType":"YulFunctionCall","src":"1079:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"1098:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1075:3:111"},"nodeType":"YulFunctionCall","src":"1075:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1068:6:111"},"nodeType":"YulFunctionCall","src":"1068:35:111"},"nodeType":"YulIf","src":"1065:55:111"},{"nodeType":"YulVariableDeclaration","src":"1129:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1152:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1139:12:111"},"nodeType":"YulFunctionCall","src":"1139:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1133:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1168:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1178:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1172:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1219:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1221:16:111"},"nodeType":"YulFunctionCall","src":"1221:18:111"},"nodeType":"YulExpressionStatement","src":"1221:18:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"1211:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1215:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1208:2:111"},"nodeType":"YulFunctionCall","src":"1208:10:111"},"nodeType":"YulIf","src":"1205:36:111"},{"nodeType":"YulVariableDeclaration","src":"1250:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1260:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"1254:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1335:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1355:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1349:5:111"},"nodeType":"YulFunctionCall","src":"1349:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1339:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1367:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1389:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"1413:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1417:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1409:3:111"},"nodeType":"YulFunctionCall","src":"1409:13:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1424:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1405:3:111"},"nodeType":"YulFunctionCall","src":"1405:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1429:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1401:3:111"},"nodeType":"YulFunctionCall","src":"1401:31:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1434:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1397:3:111"},"nodeType":"YulFunctionCall","src":"1397:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1385:3:111"},"nodeType":"YulFunctionCall","src":"1385:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1371:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1497:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1499:16:111"},"nodeType":"YulFunctionCall","src":"1499:18:111"},"nodeType":"YulExpressionStatement","src":"1499:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1456:10:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1468:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1453:2:111"},"nodeType":"YulFunctionCall","src":"1453:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1476:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1488:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1473:2:111"},"nodeType":"YulFunctionCall","src":"1473:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1450:2:111"},"nodeType":"YulFunctionCall","src":"1450:46:111"},"nodeType":"YulIf","src":"1447:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1535:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1539:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1528:6:111"},"nodeType":"YulFunctionCall","src":"1528:22:111"},"nodeType":"YulExpressionStatement","src":"1528:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1566:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1574:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1559:6:111"},"nodeType":"YulFunctionCall","src":"1559:18:111"},"nodeType":"YulExpressionStatement","src":"1559:18:111"},{"body":{"nodeType":"YulBlock","src":"1625:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1634:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1637:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1627:6:111"},"nodeType":"YulFunctionCall","src":"1627:12:111"},"nodeType":"YulExpressionStatement","src":"1627:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1600:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1608:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1596:3:111"},"nodeType":"YulFunctionCall","src":"1596:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1613:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1592:3:111"},"nodeType":"YulFunctionCall","src":"1592:26:111"},{"name":"end","nodeType":"YulIdentifier","src":"1620:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1589:2:111"},"nodeType":"YulFunctionCall","src":"1589:35:111"},"nodeType":"YulIf","src":"1586:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1667:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1675:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1663:3:111"},"nodeType":"YulFunctionCall","src":"1663:17:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1686:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1694:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1682:3:111"},"nodeType":"YulFunctionCall","src":"1682:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1701:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1650:12:111"},"nodeType":"YulFunctionCall","src":"1650:54:111"},"nodeType":"YulExpressionStatement","src":"1650:54:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1728:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1736:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1724:3:111"},"nodeType":"YulFunctionCall","src":"1724:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1741:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1720:3:111"},"nodeType":"YulFunctionCall","src":"1720:26:111"},{"kind":"number","nodeType":"YulLiteral","src":"1748:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1713:6:111"},"nodeType":"YulFunctionCall","src":"1713:37:111"},"nodeType":"YulExpressionStatement","src":"1713:37:111"},{"nodeType":"YulAssignment","src":"1759:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1768:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"1759:5:111"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1029:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"1037:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"1045:5:111","type":""}],"src":"1003:777:111"},{"body":{"nodeType":"YulBlock","src":"1924:537:111","statements":[{"body":{"nodeType":"YulBlock","src":"1971:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1980:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1983:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1973:6:111"},"nodeType":"YulFunctionCall","src":"1973:12:111"},"nodeType":"YulExpressionStatement","src":"1973:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1945:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1954:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1941:3:111"},"nodeType":"YulFunctionCall","src":"1941:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1966:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1937:3:111"},"nodeType":"YulFunctionCall","src":"1937:33:111"},"nodeType":"YulIf","src":"1934:53:111"},{"nodeType":"YulAssignment","src":"1996:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2019:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2006:12:111"},"nodeType":"YulFunctionCall","src":"2006:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1996:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2038:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2069:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2080:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2065:3:111"},"nodeType":"YulFunctionCall","src":"2065:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2052:12:111"},"nodeType":"YulFunctionCall","src":"2052:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2042:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2093:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2103:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2097:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2148:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2157:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2160:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2150:6:111"},"nodeType":"YulFunctionCall","src":"2150:12:111"},"nodeType":"YulExpressionStatement","src":"2150:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2136:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2144:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2133:2:111"},"nodeType":"YulFunctionCall","src":"2133:14:111"},"nodeType":"YulIf","src":"2130:34:111"},{"nodeType":"YulAssignment","src":"2173:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2204:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2215:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2200:3:111"},"nodeType":"YulFunctionCall","src":"2200:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2224:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"2183:16:111"},"nodeType":"YulFunctionCall","src":"2183:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2173:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2241:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2285:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2270:3:111"},"nodeType":"YulFunctionCall","src":"2270:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2257:12:111"},"nodeType":"YulFunctionCall","src":"2257:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"2245:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2318:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2327:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2330:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2320:6:111"},"nodeType":"YulFunctionCall","src":"2320:12:111"},"nodeType":"YulExpressionStatement","src":"2320:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"2304:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2314:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2301:2:111"},"nodeType":"YulFunctionCall","src":"2301:16:111"},"nodeType":"YulIf","src":"2298:36:111"},{"nodeType":"YulAssignment","src":"2343:61:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2374:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"2385:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2370:3:111"},"nodeType":"YulFunctionCall","src":"2370:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2396:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"2353:16:111"},"nodeType":"YulFunctionCall","src":"2353:51:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2343:6:111"}]},{"nodeType":"YulAssignment","src":"2413:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2451:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2436:3:111"},"nodeType":"YulFunctionCall","src":"2436:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2423:12:111"},"nodeType":"YulFunctionCall","src":"2423:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2413:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1866:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1877:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1889:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1897:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1905:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1913:6:111","type":""}],"src":"1785:676:111"},{"body":{"nodeType":"YulBlock","src":"2536:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"2582:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2591:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2594:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2584:6:111"},"nodeType":"YulFunctionCall","src":"2584:12:111"},"nodeType":"YulExpressionStatement","src":"2584:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2557:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2566:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2553:3:111"},"nodeType":"YulFunctionCall","src":"2553:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2578:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2549:3:111"},"nodeType":"YulFunctionCall","src":"2549:32:111"},"nodeType":"YulIf","src":"2546:52:111"},{"nodeType":"YulVariableDeclaration","src":"2607:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2633:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2620:12:111"},"nodeType":"YulFunctionCall","src":"2620:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2611:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2677:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2652:24:111"},"nodeType":"YulFunctionCall","src":"2652:31:111"},"nodeType":"YulExpressionStatement","src":"2652:31:111"},{"nodeType":"YulAssignment","src":"2692:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2702:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2692:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2502:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2513:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2525:6:111","type":""}],"src":"2466:247:111"},{"body":{"nodeType":"YulBlock","src":"2813:92:111","statements":[{"nodeType":"YulAssignment","src":"2823:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2835:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2846:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2831:3:111"},"nodeType":"YulFunctionCall","src":"2831:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2823:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2865:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2890:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2883:6:111"},"nodeType":"YulFunctionCall","src":"2883:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2876:6:111"},"nodeType":"YulFunctionCall","src":"2876:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2858:6:111"},"nodeType":"YulFunctionCall","src":"2858:41:111"},"nodeType":"YulExpressionStatement","src":"2858:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2782:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2793:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2804:4:111","type":""}],"src":"2718:187:111"},{"body":{"nodeType":"YulBlock","src":"2966:94:111","statements":[{"nodeType":"YulAssignment","src":"2976:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2998:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2985:12:111"},"nodeType":"YulFunctionCall","src":"2985:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2976:5:111"}]},{"body":{"nodeType":"YulBlock","src":"3038:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3047:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3050:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3040:6:111"},"nodeType":"YulFunctionCall","src":"3040:12:111"},"nodeType":"YulExpressionStatement","src":"3040:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3027:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3034:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3024:2:111"},"nodeType":"YulFunctionCall","src":"3024:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3017:6:111"},"nodeType":"YulFunctionCall","src":"3017:20:111"},"nodeType":"YulIf","src":"3014:40:111"}]},"name":"abi_decode_enum_Operation","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2945:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2956:5:111","type":""}],"src":"2910:150:111"},{"body":{"nodeType":"YulBlock","src":"3209:475:111","statements":[{"body":{"nodeType":"YulBlock","src":"3256:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3265:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3268:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3258:6:111"},"nodeType":"YulFunctionCall","src":"3258:12:111"},"nodeType":"YulExpressionStatement","src":"3258:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3230:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3239:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3226:3:111"},"nodeType":"YulFunctionCall","src":"3226:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3251:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3222:3:111"},"nodeType":"YulFunctionCall","src":"3222:33:111"},"nodeType":"YulIf","src":"3219:53:111"},{"nodeType":"YulVariableDeclaration","src":"3281:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3307:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3294:12:111"},"nodeType":"YulFunctionCall","src":"3294:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3285:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3351:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"3326:24:111"},"nodeType":"YulFunctionCall","src":"3326:31:111"},"nodeType":"YulExpressionStatement","src":"3326:31:111"},{"nodeType":"YulAssignment","src":"3366:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3376:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3366:6:111"}]},{"nodeType":"YulAssignment","src":"3390:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3417:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3428:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3413:3:111"},"nodeType":"YulFunctionCall","src":"3413:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3400:12:111"},"nodeType":"YulFunctionCall","src":"3400:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3390:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3441:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3483:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3468:3:111"},"nodeType":"YulFunctionCall","src":"3468:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3455:12:111"},"nodeType":"YulFunctionCall","src":"3455:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3445:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3530:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3539:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3542:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3532:6:111"},"nodeType":"YulFunctionCall","src":"3532:12:111"},"nodeType":"YulExpressionStatement","src":"3532:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3502:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3510:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3499:2:111"},"nodeType":"YulFunctionCall","src":"3499:30:111"},"nodeType":"YulIf","src":"3496:50:111"},{"nodeType":"YulAssignment","src":"3555:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3586:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3597:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3582:3:111"},"nodeType":"YulFunctionCall","src":"3582:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3606:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"3565:16:111"},"nodeType":"YulFunctionCall","src":"3565:49:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3555:6:111"}]},{"nodeType":"YulAssignment","src":"3623:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3663:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3674:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3659:3:111"},"nodeType":"YulFunctionCall","src":"3659:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"3633:25:111"},"nodeType":"YulFunctionCall","src":"3633:45:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"3623:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3151:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3162:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3174:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3182:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3190:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3198:6:111","type":""}],"src":"3065:619:111"},{"body":{"nodeType":"YulBlock","src":"3738:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3748:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3768:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3762:5:111"},"nodeType":"YulFunctionCall","src":"3762:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3752:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3790:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"3795:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3783:6:111"},"nodeType":"YulFunctionCall","src":"3783:19:111"},"nodeType":"YulExpressionStatement","src":"3783:19:111"},{"nodeType":"YulVariableDeclaration","src":"3811:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3820:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3815:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3882:110:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3896:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3906:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3900:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3938:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"3943:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3934:3:111"},"nodeType":"YulFunctionCall","src":"3934:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3947:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3930:3:111"},"nodeType":"YulFunctionCall","src":"3930:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3966:5:111"},{"name":"i","nodeType":"YulIdentifier","src":"3973:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3962:3:111"},"nodeType":"YulFunctionCall","src":"3962:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3977:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3958:3:111"},"nodeType":"YulFunctionCall","src":"3958:22:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3952:5:111"},"nodeType":"YulFunctionCall","src":"3952:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3923:6:111"},"nodeType":"YulFunctionCall","src":"3923:59:111"},"nodeType":"YulExpressionStatement","src":"3923:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3841:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3844:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3838:2:111"},"nodeType":"YulFunctionCall","src":"3838:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3852:21:111","statements":[{"nodeType":"YulAssignment","src":"3854:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3863:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3866:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3859:3:111"},"nodeType":"YulFunctionCall","src":"3859:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3854:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3834:3:111","statements":[]},"src":"3830:162:111"},{"body":{"nodeType":"YulBlock","src":"4026:62:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4055:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4060:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4051:3:111"},"nodeType":"YulFunctionCall","src":"4051:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"4069:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4047:3:111"},"nodeType":"YulFunctionCall","src":"4047:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"4076:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4040:6:111"},"nodeType":"YulFunctionCall","src":"4040:38:111"},"nodeType":"YulExpressionStatement","src":"4040:38:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4007:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"4010:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4004:2:111"},"nodeType":"YulFunctionCall","src":"4004:13:111"},"nodeType":"YulIf","src":"4001:87:111"},{"nodeType":"YulAssignment","src":"4097:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4112:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"4125:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4133:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4121:3:111"},"nodeType":"YulFunctionCall","src":"4121:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"4138:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4117:3:111"},"nodeType":"YulFunctionCall","src":"4117:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4108:3:111"},"nodeType":"YulFunctionCall","src":"4108:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"4208:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4104:3:111"},"nodeType":"YulFunctionCall","src":"4104:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"4097:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"3715:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"3722:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"3730:3:111","type":""}],"src":"3689:530:111"},{"body":{"nodeType":"YulBlock","src":"4365:157:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4382:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4407:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4400:6:111"},"nodeType":"YulFunctionCall","src":"4400:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4393:6:111"},"nodeType":"YulFunctionCall","src":"4393:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4375:6:111"},"nodeType":"YulFunctionCall","src":"4375:41:111"},"nodeType":"YulExpressionStatement","src":"4375:41:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4436:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4447:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4432:3:111"},"nodeType":"YulFunctionCall","src":"4432:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4452:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4425:6:111"},"nodeType":"YulFunctionCall","src":"4425:30:111"},"nodeType":"YulExpressionStatement","src":"4425:30:111"},{"nodeType":"YulAssignment","src":"4464:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"4489:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4501:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4512:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4497:3:111"},"nodeType":"YulFunctionCall","src":"4497:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"4472:16:111"},"nodeType":"YulFunctionCall","src":"4472:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4464:4:111"}]}]},"name":"abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4326:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4337:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4345:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4356:4:111","type":""}],"src":"4224:298:111"},{"body":{"nodeType":"YulBlock","src":"4614:161:111","statements":[{"body":{"nodeType":"YulBlock","src":"4660:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4669:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4672:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4662:6:111"},"nodeType":"YulFunctionCall","src":"4662:12:111"},"nodeType":"YulExpressionStatement","src":"4662:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4635:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4644:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4631:3:111"},"nodeType":"YulFunctionCall","src":"4631:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4656:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4627:3:111"},"nodeType":"YulFunctionCall","src":"4627:32:111"},"nodeType":"YulIf","src":"4624:52:111"},{"nodeType":"YulAssignment","src":"4685:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4708:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4695:12:111"},"nodeType":"YulFunctionCall","src":"4695:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4685:6:111"}]},{"nodeType":"YulAssignment","src":"4727:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4754:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4765:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4750:3:111"},"nodeType":"YulFunctionCall","src":"4750:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4737:12:111"},"nodeType":"YulFunctionCall","src":"4737:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4727:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4572:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4583:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4595:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4603:6:111","type":""}],"src":"4527:248:111"},{"body":{"nodeType":"YulBlock","src":"4899:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4916:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4927:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4909:6:111"},"nodeType":"YulFunctionCall","src":"4909:21:111"},"nodeType":"YulExpressionStatement","src":"4909:21:111"},{"nodeType":"YulAssignment","src":"4939:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4964:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4976:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4987:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4972:3:111"},"nodeType":"YulFunctionCall","src":"4972:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"4947:16:111"},"nodeType":"YulFunctionCall","src":"4947:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4939:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4868:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4879:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4890:4:111","type":""}],"src":"4780:217:111"},{"body":{"nodeType":"YulBlock","src":"5072:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"5118:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5127:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5130:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5120:6:111"},"nodeType":"YulFunctionCall","src":"5120:12:111"},"nodeType":"YulExpressionStatement","src":"5120:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5093:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5102:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5089:3:111"},"nodeType":"YulFunctionCall","src":"5089:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5114:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5085:3:111"},"nodeType":"YulFunctionCall","src":"5085:32:111"},"nodeType":"YulIf","src":"5082:52:111"},{"nodeType":"YulAssignment","src":"5143:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5166:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5153:12:111"},"nodeType":"YulFunctionCall","src":"5153:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5143:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5038:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5049:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5061:6:111","type":""}],"src":"5002:180:111"},{"body":{"nodeType":"YulBlock","src":"5257:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"5303:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5312:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5315:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5305:6:111"},"nodeType":"YulFunctionCall","src":"5305:12:111"},"nodeType":"YulExpressionStatement","src":"5305:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5278:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5287:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5274:3:111"},"nodeType":"YulFunctionCall","src":"5274:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5299:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5270:3:111"},"nodeType":"YulFunctionCall","src":"5270:32:111"},"nodeType":"YulIf","src":"5267:52:111"},{"nodeType":"YulAssignment","src":"5328:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5351:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5338:12:111"},"nodeType":"YulFunctionCall","src":"5338:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5328:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5223:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5234:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5246:6:111","type":""}],"src":"5187:180:111"},{"body":{"nodeType":"YulBlock","src":"5444:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"5493:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5502:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5505:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5495:6:111"},"nodeType":"YulFunctionCall","src":"5495:12:111"},"nodeType":"YulExpressionStatement","src":"5495:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5472:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5480:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5468:3:111"},"nodeType":"YulFunctionCall","src":"5468:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"5487:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5464:3:111"},"nodeType":"YulFunctionCall","src":"5464:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5457:6:111"},"nodeType":"YulFunctionCall","src":"5457:35:111"},"nodeType":"YulIf","src":"5454:55:111"},{"nodeType":"YulAssignment","src":"5518:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5541:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5528:12:111"},"nodeType":"YulFunctionCall","src":"5528:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"5518:6:111"}]},{"body":{"nodeType":"YulBlock","src":"5591:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5600:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5603:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5593:6:111"},"nodeType":"YulFunctionCall","src":"5593:12:111"},"nodeType":"YulExpressionStatement","src":"5593:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5563:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5571:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5560:2:111"},"nodeType":"YulFunctionCall","src":"5560:30:111"},"nodeType":"YulIf","src":"5557:50:111"},{"nodeType":"YulAssignment","src":"5616:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5632:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5640:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5628:3:111"},"nodeType":"YulFunctionCall","src":"5628:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"5616:8:111"}]},{"body":{"nodeType":"YulBlock","src":"5697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5699:6:111"},"nodeType":"YulFunctionCall","src":"5699:12:111"},"nodeType":"YulExpressionStatement","src":"5699:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5668:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"5676:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5664:3:111"},"nodeType":"YulFunctionCall","src":"5664:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"5685:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5660:3:111"},"nodeType":"YulFunctionCall","src":"5660:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"5692:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5657:2:111"},"nodeType":"YulFunctionCall","src":"5657:39:111"},"nodeType":"YulIf","src":"5654:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"5407:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"5415:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"5423:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"5433:6:111","type":""}],"src":"5372:347:111"},{"body":{"nodeType":"YulBlock","src":"5998:949:111","statements":[{"body":{"nodeType":"YulBlock","src":"6045:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6054:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6057:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6047:6:111"},"nodeType":"YulFunctionCall","src":"6047:12:111"},"nodeType":"YulExpressionStatement","src":"6047:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6019:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6028:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6015:3:111"},"nodeType":"YulFunctionCall","src":"6015:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6040:3:111","type":"","value":"320"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6011:3:111"},"nodeType":"YulFunctionCall","src":"6011:33:111"},"nodeType":"YulIf","src":"6008:53:111"},{"nodeType":"YulAssignment","src":"6070:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6099:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"6080:18:111"},"nodeType":"YulFunctionCall","src":"6080:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6070:6:111"}]},{"nodeType":"YulAssignment","src":"6118:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6145:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6156:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6141:3:111"},"nodeType":"YulFunctionCall","src":"6141:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6128:12:111"},"nodeType":"YulFunctionCall","src":"6128:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6118:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6169:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6179:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6173:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6250:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6259:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6262:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6252:6:111"},"nodeType":"YulFunctionCall","src":"6252:12:111"},"nodeType":"YulExpressionStatement","src":"6252:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6240:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6225:3:111"},"nodeType":"YulFunctionCall","src":"6225:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6212:12:111"},"nodeType":"YulFunctionCall","src":"6212:32:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6246:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6209:2:111"},"nodeType":"YulFunctionCall","src":"6209:40:111"},"nodeType":"YulIf","src":"6206:60:111"},{"nodeType":"YulVariableDeclaration","src":"6275:110:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6331:9:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6370:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6355:3:111"},"nodeType":"YulFunctionCall","src":"6355:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6342:12:111"},"nodeType":"YulFunctionCall","src":"6342:32:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6327:3:111"},"nodeType":"YulFunctionCall","src":"6327:48:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6377:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"6301:25:111"},"nodeType":"YulFunctionCall","src":"6301:84:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"6279:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"6289:8:111","type":""}]},{"nodeType":"YulAssignment","src":"6394:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"6404:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6394:6:111"}]},{"nodeType":"YulAssignment","src":"6421:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"6431:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"6421:6:111"}]},{"nodeType":"YulAssignment","src":"6448:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6488:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6499:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6484:3:111"},"nodeType":"YulFunctionCall","src":"6484:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"6458:25:111"},"nodeType":"YulFunctionCall","src":"6458:45:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"6448:6:111"}]},{"nodeType":"YulAssignment","src":"6512:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6539:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6550:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6535:3:111"},"nodeType":"YulFunctionCall","src":"6535:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6522:12:111"},"nodeType":"YulFunctionCall","src":"6522:33:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"6512:6:111"}]},{"nodeType":"YulAssignment","src":"6564:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6591:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6602:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6587:3:111"},"nodeType":"YulFunctionCall","src":"6587:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6574:12:111"},"nodeType":"YulFunctionCall","src":"6574:33:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"6564:6:111"}]},{"nodeType":"YulAssignment","src":"6616:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6643:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6654:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6639:3:111"},"nodeType":"YulFunctionCall","src":"6639:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6626:12:111"},"nodeType":"YulFunctionCall","src":"6626:33:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"6616:6:111"}]},{"nodeType":"YulAssignment","src":"6668:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6701:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6712:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6697:3:111"},"nodeType":"YulFunctionCall","src":"6697:19:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"6678:18:111"},"nodeType":"YulFunctionCall","src":"6678:39:111"},"variableNames":[{"name":"value8","nodeType":"YulIdentifier","src":"6668:6:111"}]},{"nodeType":"YulAssignment","src":"6726:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6770:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6755:3:111"},"nodeType":"YulFunctionCall","src":"6755:19:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"6736:18:111"},"nodeType":"YulFunctionCall","src":"6736:39:111"},"variableNames":[{"name":"value9","nodeType":"YulIdentifier","src":"6726:6:111"}]},{"body":{"nodeType":"YulBlock","src":"6829:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6838:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6841:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6831:6:111"},"nodeType":"YulFunctionCall","src":"6831:12:111"},"nodeType":"YulExpressionStatement","src":"6831:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6818:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6803:3:111"},"nodeType":"YulFunctionCall","src":"6803:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6790:12:111"},"nodeType":"YulFunctionCall","src":"6790:33:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6825:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6787:2:111"},"nodeType":"YulFunctionCall","src":"6787:41:111"},"nodeType":"YulIf","src":"6784:61:111"},{"nodeType":"YulAssignment","src":"6854:87:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6886:9:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6914:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6925:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6910:3:111"},"nodeType":"YulFunctionCall","src":"6910:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6897:12:111"},"nodeType":"YulFunctionCall","src":"6897:33:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6882:3:111"},"nodeType":"YulFunctionCall","src":"6882:49:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6933:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"6865:16:111"},"nodeType":"YulFunctionCall","src":"6865:76:111"},"variableNames":[{"name":"value10","nodeType":"YulIdentifier","src":"6854:7:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_address_payablet_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5883:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5894:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5906:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5914:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5922:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"5930:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"5938:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"5946:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"5954:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"5962:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"5970:6:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"5978:6:111","type":""},{"name":"value10","nodeType":"YulTypedName","src":"5986:7:111","type":""}],"src":"5724:1223:111"},{"body":{"nodeType":"YulBlock","src":"7039:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"7085:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7094:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7097:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7087:6:111"},"nodeType":"YulFunctionCall","src":"7087:12:111"},"nodeType":"YulExpressionStatement","src":"7087:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7060:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7069:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7056:3:111"},"nodeType":"YulFunctionCall","src":"7056:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7081:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7052:3:111"},"nodeType":"YulFunctionCall","src":"7052:32:111"},"nodeType":"YulIf","src":"7049:52:111"},{"nodeType":"YulVariableDeclaration","src":"7110:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7136:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7123:12:111"},"nodeType":"YulFunctionCall","src":"7123:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7114:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7180:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7155:24:111"},"nodeType":"YulFunctionCall","src":"7155:31:111"},"nodeType":"YulExpressionStatement","src":"7155:31:111"},{"nodeType":"YulAssignment","src":"7195:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7205:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7195:6:111"}]},{"nodeType":"YulAssignment","src":"7219:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7257:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7242:3:111"},"nodeType":"YulFunctionCall","src":"7242:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7229:12:111"},"nodeType":"YulFunctionCall","src":"7229:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7219:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6997:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7008:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7020:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7028:6:111","type":""}],"src":"6952:315:111"},{"body":{"nodeType":"YulBlock","src":"7394:485:111","statements":[{"body":{"nodeType":"YulBlock","src":"7440:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7449:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7452:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7442:6:111"},"nodeType":"YulFunctionCall","src":"7442:12:111"},"nodeType":"YulExpressionStatement","src":"7442:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7415:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7424:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7411:3:111"},"nodeType":"YulFunctionCall","src":"7411:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7436:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7407:3:111"},"nodeType":"YulFunctionCall","src":"7407:32:111"},"nodeType":"YulIf","src":"7404:52:111"},{"nodeType":"YulAssignment","src":"7465:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7488:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7475:12:111"},"nodeType":"YulFunctionCall","src":"7475:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7465:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7507:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7538:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7549:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7534:3:111"},"nodeType":"YulFunctionCall","src":"7534:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7521:12:111"},"nodeType":"YulFunctionCall","src":"7521:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7511:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7562:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7572:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7566:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7617:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7626:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7629:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7619:6:111"},"nodeType":"YulFunctionCall","src":"7619:12:111"},"nodeType":"YulExpressionStatement","src":"7619:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7605:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7613:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7602:2:111"},"nodeType":"YulFunctionCall","src":"7602:14:111"},"nodeType":"YulIf","src":"7599:34:111"},{"nodeType":"YulAssignment","src":"7642:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7673:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7684:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7669:3:111"},"nodeType":"YulFunctionCall","src":"7669:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7693:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"7652:16:111"},"nodeType":"YulFunctionCall","src":"7652:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7642:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7710:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7743:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7754:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7739:3:111"},"nodeType":"YulFunctionCall","src":"7739:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7726:12:111"},"nodeType":"YulFunctionCall","src":"7726:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"7714:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7787:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7796:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7799:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7789:6:111"},"nodeType":"YulFunctionCall","src":"7789:12:111"},"nodeType":"YulExpressionStatement","src":"7789:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"7773:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7783:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7770:2:111"},"nodeType":"YulFunctionCall","src":"7770:16:111"},"nodeType":"YulIf","src":"7767:36:111"},{"nodeType":"YulAssignment","src":"7812:61:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7843:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"7854:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7839:3:111"},"nodeType":"YulFunctionCall","src":"7839:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7865:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"7822:16:111"},"nodeType":"YulFunctionCall","src":"7822:51:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"7812:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7344:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7355:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7367:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7375:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7383:6:111","type":""}],"src":"7272:607:111"},{"body":{"nodeType":"YulBlock","src":"7928:83:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7945:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7954:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7961:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7950:3:111"},"nodeType":"YulFunctionCall","src":"7950:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7938:6:111"},"nodeType":"YulFunctionCall","src":"7938:67:111"},"nodeType":"YulExpressionStatement","src":"7938:67:111"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"7912:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"7919:3:111","type":""}],"src":"7884:127:111"},{"body":{"nodeType":"YulBlock","src":"8077:423:111","statements":[{"nodeType":"YulVariableDeclaration","src":"8087:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8107:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8101:5:111"},"nodeType":"YulFunctionCall","src":"8101:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"8091:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8129:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"8134:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8122:6:111"},"nodeType":"YulFunctionCall","src":"8122:19:111"},"nodeType":"YulExpressionStatement","src":"8122:19:111"},{"nodeType":"YulVariableDeclaration","src":"8150:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8160:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8154:2:111","type":""}]},{"nodeType":"YulAssignment","src":"8173:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8184:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8189:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8180:3:111"},"nodeType":"YulFunctionCall","src":"8180:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"8173:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"8201:28:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8219:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8226:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8215:3:111"},"nodeType":"YulFunctionCall","src":"8215:14:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"8205:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8238:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8247:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"8242:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8306:169:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8327:3:111"},{"arguments":[{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"8342:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8336:5:111"},"nodeType":"YulFunctionCall","src":"8336:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"8351:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8332:3:111"},"nodeType":"YulFunctionCall","src":"8332:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8320:6:111"},"nodeType":"YulFunctionCall","src":"8320:75:111"},"nodeType":"YulExpressionStatement","src":"8320:75:111"},{"nodeType":"YulAssignment","src":"8408:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8419:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8424:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8415:3:111"},"nodeType":"YulFunctionCall","src":"8415:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"8408:3:111"}]},{"nodeType":"YulAssignment","src":"8440:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"8454:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8462:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8450:3:111"},"nodeType":"YulFunctionCall","src":"8450:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"8440:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"8268:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"8271:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"8265:2:111"},"nodeType":"YulFunctionCall","src":"8265:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"8279:18:111","statements":[{"nodeType":"YulAssignment","src":"8281:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"8290:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"8293:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8286:3:111"},"nodeType":"YulFunctionCall","src":"8286:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"8281:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"8261:3:111","statements":[]},"src":"8257:218:111"},{"nodeType":"YulAssignment","src":"8484:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"8491:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"8484:3:111"}]}]},"name":"abi_encode_array_address_dyn","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8054:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8061:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"8069:3:111","type":""}],"src":"8016:484:111"},{"body":{"nodeType":"YulBlock","src":"8656:110:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8673:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8684:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8666:6:111"},"nodeType":"YulFunctionCall","src":"8666:21:111"},"nodeType":"YulExpressionStatement","src":"8666:21:111"},{"nodeType":"YulAssignment","src":"8696:64:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8733:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8745:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8756:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8741:3:111"},"nodeType":"YulFunctionCall","src":"8741:18:111"}],"functionName":{"name":"abi_encode_array_address_dyn","nodeType":"YulIdentifier","src":"8704:28:111"},"nodeType":"YulFunctionCall","src":"8704:56:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8696:4:111"}]}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8625:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8636:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8647:4:111","type":""}],"src":"8505:261:111"},{"body":{"nodeType":"YulBlock","src":"8867:359:111","statements":[{"body":{"nodeType":"YulBlock","src":"8913:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8922:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8925:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8915:6:111"},"nodeType":"YulFunctionCall","src":"8915:12:111"},"nodeType":"YulExpressionStatement","src":"8915:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8888:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8897:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8884:3:111"},"nodeType":"YulFunctionCall","src":"8884:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8909:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8880:3:111"},"nodeType":"YulFunctionCall","src":"8880:32:111"},"nodeType":"YulIf","src":"8877:52:111"},{"nodeType":"YulVariableDeclaration","src":"8938:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8964:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8951:12:111"},"nodeType":"YulFunctionCall","src":"8951:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8942:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9008:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8983:24:111"},"nodeType":"YulFunctionCall","src":"8983:31:111"},"nodeType":"YulExpressionStatement","src":"8983:31:111"},{"nodeType":"YulAssignment","src":"9023:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9033:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9023:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9047:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9078:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9089:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9074:3:111"},"nodeType":"YulFunctionCall","src":"9074:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9061:12:111"},"nodeType":"YulFunctionCall","src":"9061:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9051:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9138:6:111"},"nodeType":"YulFunctionCall","src":"9138:12:111"},"nodeType":"YulExpressionStatement","src":"9138:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9108:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9116:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9105:2:111"},"nodeType":"YulFunctionCall","src":"9105:30:111"},"nodeType":"YulIf","src":"9102:50:111"},{"nodeType":"YulAssignment","src":"9161:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9192:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9203:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9188:3:111"},"nodeType":"YulFunctionCall","src":"9188:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9212:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"9171:16:111"},"nodeType":"YulFunctionCall","src":"9171:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9161:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8825:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8836:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8848:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8856:6:111","type":""}],"src":"8771:455:111"},{"body":{"nodeType":"YulBlock","src":"9482:1102:111","statements":[{"body":{"nodeType":"YulBlock","src":"9529:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9538:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9541:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9531:6:111"},"nodeType":"YulFunctionCall","src":"9531:12:111"},"nodeType":"YulExpressionStatement","src":"9531:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9503:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9512:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9499:3:111"},"nodeType":"YulFunctionCall","src":"9499:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9524:3:111","type":"","value":"256"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9495:3:111"},"nodeType":"YulFunctionCall","src":"9495:33:111"},"nodeType":"YulIf","src":"9492:53:111"},{"nodeType":"YulVariableDeclaration","src":"9554:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9581:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9568:12:111"},"nodeType":"YulFunctionCall","src":"9568:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9558:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9600:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9610:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9604:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9655:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9664:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9667:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9657:6:111"},"nodeType":"YulFunctionCall","src":"9657:12:111"},"nodeType":"YulExpressionStatement","src":"9657:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9643:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9651:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9640:2:111"},"nodeType":"YulFunctionCall","src":"9640:14:111"},"nodeType":"YulIf","src":"9637:34:111"},{"nodeType":"YulVariableDeclaration","src":"9680:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9694:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9705:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9690:3:111"},"nodeType":"YulFunctionCall","src":"9690:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"9684:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9760:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9769:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9772:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9762:6:111"},"nodeType":"YulFunctionCall","src":"9762:12:111"},"nodeType":"YulExpressionStatement","src":"9762:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"9739:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"9743:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9735:3:111"},"nodeType":"YulFunctionCall","src":"9735:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9750:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9731:3:111"},"nodeType":"YulFunctionCall","src":"9731:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9724:6:111"},"nodeType":"YulFunctionCall","src":"9724:35:111"},"nodeType":"YulIf","src":"9721:55:111"},{"nodeType":"YulVariableDeclaration","src":"9785:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"9812:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9799:12:111"},"nodeType":"YulFunctionCall","src":"9799:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"9789:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9842:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9851:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9854:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9844:6:111"},"nodeType":"YulFunctionCall","src":"9844:12:111"},"nodeType":"YulExpressionStatement","src":"9844:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"9830:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9838:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9827:2:111"},"nodeType":"YulFunctionCall","src":"9827:14:111"},"nodeType":"YulIf","src":"9824:34:111"},{"body":{"nodeType":"YulBlock","src":"9918:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9927:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9930:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9920:6:111"},"nodeType":"YulFunctionCall","src":"9920:12:111"},"nodeType":"YulExpressionStatement","src":"9920:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"9881:2:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9889:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"9892:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"9885:3:111"},"nodeType":"YulFunctionCall","src":"9885:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9877:3:111"},"nodeType":"YulFunctionCall","src":"9877:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9902:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9873:3:111"},"nodeType":"YulFunctionCall","src":"9873:34:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9909:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9870:2:111"},"nodeType":"YulFunctionCall","src":"9870:47:111"},"nodeType":"YulIf","src":"9867:67:111"},{"nodeType":"YulAssignment","src":"9943:23:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"9957:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"9961:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9953:3:111"},"nodeType":"YulFunctionCall","src":"9953:13:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9943:6:111"}]},{"nodeType":"YulAssignment","src":"9975:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"9985:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9975:6:111"}]},{"nodeType":"YulAssignment","src":"10000:44:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10027:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10038:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10023:3:111"},"nodeType":"YulFunctionCall","src":"10023:20:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10010:12:111"},"nodeType":"YulFunctionCall","src":"10010:34:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10000:6:111"}]},{"nodeType":"YulAssignment","src":"10053:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10086:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10097:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10082:3:111"},"nodeType":"YulFunctionCall","src":"10082:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"10063:18:111"},"nodeType":"YulFunctionCall","src":"10063:38:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10053:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10110:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10143:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10154:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10139:3:111"},"nodeType":"YulFunctionCall","src":"10139:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10126:12:111"},"nodeType":"YulFunctionCall","src":"10126:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"10114:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10187:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10196:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10199:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10189:6:111"},"nodeType":"YulFunctionCall","src":"10189:12:111"},"nodeType":"YulExpressionStatement","src":"10189:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"10173:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10183:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10170:2:111"},"nodeType":"YulFunctionCall","src":"10170:16:111"},"nodeType":"YulIf","src":"10167:36:111"},{"nodeType":"YulVariableDeclaration","src":"10212:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10268:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"10279:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10264:3:111"},"nodeType":"YulFunctionCall","src":"10264:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10290:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"10238:25:111"},"nodeType":"YulFunctionCall","src":"10238:60:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"10216:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"10226:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10307:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"10317:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"10307:6:111"}]},{"nodeType":"YulAssignment","src":"10334:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"10344:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"10334:6:111"}]},{"nodeType":"YulAssignment","src":"10361:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10394:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10405:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10390:3:111"},"nodeType":"YulFunctionCall","src":"10390:19:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"10371:18:111"},"nodeType":"YulFunctionCall","src":"10371:39:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"10361:6:111"}]},{"nodeType":"YulAssignment","src":"10419:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10452:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10463:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10448:3:111"},"nodeType":"YulFunctionCall","src":"10448:19:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"10429:18:111"},"nodeType":"YulFunctionCall","src":"10429:39:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"10419:6:111"}]},{"nodeType":"YulAssignment","src":"10477:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10504:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10515:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10500:3:111"},"nodeType":"YulFunctionCall","src":"10500:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10487:12:111"},"nodeType":"YulFunctionCall","src":"10487:33:111"},"variableNames":[{"name":"value8","nodeType":"YulIdentifier","src":"10477:6:111"}]},{"nodeType":"YulAssignment","src":"10529:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10562:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10573:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10558:3:111"},"nodeType":"YulFunctionCall","src":"10558:19:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"10539:18:111"},"nodeType":"YulFunctionCall","src":"10539:39:111"},"variableNames":[{"name":"value9","nodeType":"YulIdentifier","src":"10529:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_uint256t_addresst_bytes_calldata_ptrt_addresst_addresst_uint256t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9376:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9387:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9399:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9407:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9415:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"9423:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"9431:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"9439:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"9447:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"9455:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"9463:6:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"9471:6:111","type":""}],"src":"9231:1353:111"},{"body":{"nodeType":"YulBlock","src":"10743:554:111","statements":[{"body":{"nodeType":"YulBlock","src":"10790:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10799:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10802:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10792:6:111"},"nodeType":"YulFunctionCall","src":"10792:12:111"},"nodeType":"YulExpressionStatement","src":"10792:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10764:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10773:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10760:3:111"},"nodeType":"YulFunctionCall","src":"10760:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10785:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10756:3:111"},"nodeType":"YulFunctionCall","src":"10756:33:111"},"nodeType":"YulIf","src":"10753:53:111"},{"nodeType":"YulVariableDeclaration","src":"10815:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10841:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10828:12:111"},"nodeType":"YulFunctionCall","src":"10828:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"10819:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10885:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10860:24:111"},"nodeType":"YulFunctionCall","src":"10860:31:111"},"nodeType":"YulExpressionStatement","src":"10860:31:111"},{"nodeType":"YulAssignment","src":"10900:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10910:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10900:6:111"}]},{"nodeType":"YulAssignment","src":"10924:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10951:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10962:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10947:3:111"},"nodeType":"YulFunctionCall","src":"10947:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10934:12:111"},"nodeType":"YulFunctionCall","src":"10934:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10924:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10975:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11006:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11017:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11002:3:111"},"nodeType":"YulFunctionCall","src":"11002:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10989:12:111"},"nodeType":"YulFunctionCall","src":"10989:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"10979:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11064:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11073:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11076:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11066:6:111"},"nodeType":"YulFunctionCall","src":"11066:12:111"},"nodeType":"YulExpressionStatement","src":"11066:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"11036:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11044:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11033:2:111"},"nodeType":"YulFunctionCall","src":"11033:30:111"},"nodeType":"YulIf","src":"11030:50:111"},{"nodeType":"YulVariableDeclaration","src":"11089:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11145:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11156:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11141:3:111"},"nodeType":"YulFunctionCall","src":"11141:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11165:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"11115:25:111"},"nodeType":"YulFunctionCall","src":"11115:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"11093:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"11103:8:111","type":""}]},{"nodeType":"YulAssignment","src":"11182:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"11192:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"11182:6:111"}]},{"nodeType":"YulAssignment","src":"11209:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"11219:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"11209:6:111"}]},{"nodeType":"YulAssignment","src":"11236:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11276:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11287:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11272:3:111"},"nodeType":"YulFunctionCall","src":"11272:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"11246:25:111"},"nodeType":"YulFunctionCall","src":"11246:45:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"11236:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10677:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10688:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10700:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10708:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10716:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"10724:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"10732:6:111","type":""}],"src":"10589:708:111"},{"body":{"nodeType":"YulBlock","src":"11481:202:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11498:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11509:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11491:6:111"},"nodeType":"YulFunctionCall","src":"11491:21:111"},"nodeType":"YulExpressionStatement","src":"11491:21:111"},{"nodeType":"YulAssignment","src":"11521:64:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11558:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11570:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11581:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11566:3:111"},"nodeType":"YulFunctionCall","src":"11566:18:111"}],"functionName":{"name":"abi_encode_array_address_dyn","nodeType":"YulIdentifier","src":"11529:28:111"},"nodeType":"YulFunctionCall","src":"11529:56:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11521:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11605:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11616:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11601:3:111"},"nodeType":"YulFunctionCall","src":"11601:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11625:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11633:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11621:3:111"},"nodeType":"YulFunctionCall","src":"11621:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11594:6:111"},"nodeType":"YulFunctionCall","src":"11594:83:111"},"nodeType":"YulExpressionStatement","src":"11594:83:111"}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11442:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11453:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11461:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11472:4:111","type":""}],"src":"11302:381:111"},{"body":{"nodeType":"YulBlock","src":"11945:1013:111","statements":[{"body":{"nodeType":"YulBlock","src":"11992:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12001:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12004:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11994:6:111"},"nodeType":"YulFunctionCall","src":"11994:12:111"},"nodeType":"YulExpressionStatement","src":"11994:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11966:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11975:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11962:3:111"},"nodeType":"YulFunctionCall","src":"11962:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11987:3:111","type":"","value":"320"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11958:3:111"},"nodeType":"YulFunctionCall","src":"11958:33:111"},"nodeType":"YulIf","src":"11955:53:111"},{"nodeType":"YulVariableDeclaration","src":"12017:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12043:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12030:12:111"},"nodeType":"YulFunctionCall","src":"12030:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"12021:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12087:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"12062:24:111"},"nodeType":"YulFunctionCall","src":"12062:31:111"},"nodeType":"YulExpressionStatement","src":"12062:31:111"},{"nodeType":"YulAssignment","src":"12102:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"12112:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"12102:6:111"}]},{"nodeType":"YulAssignment","src":"12126:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12153:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12164:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12149:3:111"},"nodeType":"YulFunctionCall","src":"12149:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12136:12:111"},"nodeType":"YulFunctionCall","src":"12136:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"12126:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"12177:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12208:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12219:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12204:3:111"},"nodeType":"YulFunctionCall","src":"12204:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12191:12:111"},"nodeType":"YulFunctionCall","src":"12191:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"12181:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12266:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12275:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12278:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12268:6:111"},"nodeType":"YulFunctionCall","src":"12268:12:111"},"nodeType":"YulExpressionStatement","src":"12268:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"12238:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12246:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12235:2:111"},"nodeType":"YulFunctionCall","src":"12235:30:111"},"nodeType":"YulIf","src":"12232:50:111"},{"nodeType":"YulVariableDeclaration","src":"12291:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12347:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"12358:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12343:3:111"},"nodeType":"YulFunctionCall","src":"12343:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"12367:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"12317:25:111"},"nodeType":"YulFunctionCall","src":"12317:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"12295:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"12305:8:111","type":""}]},{"nodeType":"YulAssignment","src":"12384:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"12394:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"12384:6:111"}]},{"nodeType":"YulAssignment","src":"12411:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"12421:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"12411:6:111"}]},{"nodeType":"YulAssignment","src":"12438:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12478:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12489:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12474:3:111"},"nodeType":"YulFunctionCall","src":"12474:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"12448:25:111"},"nodeType":"YulFunctionCall","src":"12448:45:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"12438:6:111"}]},{"nodeType":"YulAssignment","src":"12502:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12540:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12525:3:111"},"nodeType":"YulFunctionCall","src":"12525:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12512:12:111"},"nodeType":"YulFunctionCall","src":"12512:33:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"12502:6:111"}]},{"nodeType":"YulAssignment","src":"12554:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12581:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12592:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12577:3:111"},"nodeType":"YulFunctionCall","src":"12577:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12564:12:111"},"nodeType":"YulFunctionCall","src":"12564:33:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"12554:6:111"}]},{"nodeType":"YulAssignment","src":"12606:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12633:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12644:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12629:3:111"},"nodeType":"YulFunctionCall","src":"12629:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12616:12:111"},"nodeType":"YulFunctionCall","src":"12616:33:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"12606:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"12658:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12690:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12701:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12686:3:111"},"nodeType":"YulFunctionCall","src":"12686:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12673:12:111"},"nodeType":"YulFunctionCall","src":"12673:33:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"12662:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"12740:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"12715:24:111"},"nodeType":"YulFunctionCall","src":"12715:33:111"},"nodeType":"YulExpressionStatement","src":"12715:33:111"},{"nodeType":"YulAssignment","src":"12757:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"12767:7:111"},"variableNames":[{"name":"value8","nodeType":"YulIdentifier","src":"12757:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"12783:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12815:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12826:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12811:3:111"},"nodeType":"YulFunctionCall","src":"12811:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12798:12:111"},"nodeType":"YulFunctionCall","src":"12798:33:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"12787:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"12865:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"12840:24:111"},"nodeType":"YulFunctionCall","src":"12840:33:111"},"nodeType":"YulExpressionStatement","src":"12840:33:111"},{"nodeType":"YulAssignment","src":"12882:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"12892:7:111"},"variableNames":[{"name":"value9","nodeType":"YulIdentifier","src":"12882:6:111"}]},{"nodeType":"YulAssignment","src":"12908:44:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12947:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12932:3:111"},"nodeType":"YulFunctionCall","src":"12932:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12919:12:111"},"nodeType":"YulFunctionCall","src":"12919:33:111"},"variableNames":[{"name":"value10","nodeType":"YulIdentifier","src":"12908:7:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11830:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11841:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11853:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11861:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11869:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11877:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"11885:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"11893:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"11901:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"11909:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"11917:6:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"11925:6:111","type":""},{"name":"value10","nodeType":"YulTypedName","src":"11933:7:111","type":""}],"src":"11688:1270:111"},{"body":{"nodeType":"YulBlock","src":"13064:76:111","statements":[{"nodeType":"YulAssignment","src":"13074:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13086:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13097:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13082:3:111"},"nodeType":"YulFunctionCall","src":"13082:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13074:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13116:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"13127:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13109:6:111"},"nodeType":"YulFunctionCall","src":"13109:25:111"},"nodeType":"YulExpressionStatement","src":"13109:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13033:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13044:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13055:4:111","type":""}],"src":"12963:177:111"},{"body":{"nodeType":"YulBlock","src":"13232:301:111","statements":[{"body":{"nodeType":"YulBlock","src":"13278:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13287:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13290:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13280:6:111"},"nodeType":"YulFunctionCall","src":"13280:12:111"},"nodeType":"YulExpressionStatement","src":"13280:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13253:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13262:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13249:3:111"},"nodeType":"YulFunctionCall","src":"13249:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13274:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13245:3:111"},"nodeType":"YulFunctionCall","src":"13245:32:111"},"nodeType":"YulIf","src":"13242:52:111"},{"nodeType":"YulVariableDeclaration","src":"13303:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13329:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13316:12:111"},"nodeType":"YulFunctionCall","src":"13316:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"13307:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13373:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"13348:24:111"},"nodeType":"YulFunctionCall","src":"13348:31:111"},"nodeType":"YulExpressionStatement","src":"13348:31:111"},{"nodeType":"YulAssignment","src":"13388:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13398:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13388:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"13412:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13444:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13455:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13440:3:111"},"nodeType":"YulFunctionCall","src":"13440:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13427:12:111"},"nodeType":"YulFunctionCall","src":"13427:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"13416:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13493:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"13468:24:111"},"nodeType":"YulFunctionCall","src":"13468:33:111"},"nodeType":"YulExpressionStatement","src":"13468:33:111"},{"nodeType":"YulAssignment","src":"13510:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"13520:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"13510:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13190:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13201:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13213:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13221:6:111","type":""}],"src":"13145:388:111"},{"body":{"nodeType":"YulBlock","src":"13642:425:111","statements":[{"body":{"nodeType":"YulBlock","src":"13688:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13697:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13700:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13690:6:111"},"nodeType":"YulFunctionCall","src":"13690:12:111"},"nodeType":"YulExpressionStatement","src":"13690:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13663:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13672:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13659:3:111"},"nodeType":"YulFunctionCall","src":"13659:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13684:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13655:3:111"},"nodeType":"YulFunctionCall","src":"13655:32:111"},"nodeType":"YulIf","src":"13652:52:111"},{"nodeType":"YulVariableDeclaration","src":"13713:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13739:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13726:12:111"},"nodeType":"YulFunctionCall","src":"13726:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"13717:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13783:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"13758:24:111"},"nodeType":"YulFunctionCall","src":"13758:31:111"},"nodeType":"YulExpressionStatement","src":"13758:31:111"},{"nodeType":"YulAssignment","src":"13798:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13808:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13798:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"13822:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13865:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13850:3:111"},"nodeType":"YulFunctionCall","src":"13850:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13837:12:111"},"nodeType":"YulFunctionCall","src":"13837:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"13826:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13903:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"13878:24:111"},"nodeType":"YulFunctionCall","src":"13878:33:111"},"nodeType":"YulExpressionStatement","src":"13878:33:111"},{"nodeType":"YulAssignment","src":"13920:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"13930:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"13920:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"13946:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13978:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13989:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13974:3:111"},"nodeType":"YulFunctionCall","src":"13974:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13961:12:111"},"nodeType":"YulFunctionCall","src":"13961:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"13950:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"14027:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"14002:24:111"},"nodeType":"YulFunctionCall","src":"14002:33:111"},"nodeType":"YulExpressionStatement","src":"14002:33:111"},{"nodeType":"YulAssignment","src":"14044:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"14054:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"14044:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13592:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13603:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13615:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13623:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13631:6:111","type":""}],"src":"13538:529:111"},{"body":{"nodeType":"YulBlock","src":"14176:352:111","statements":[{"body":{"nodeType":"YulBlock","src":"14222:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14231:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14234:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14224:6:111"},"nodeType":"YulFunctionCall","src":"14224:12:111"},"nodeType":"YulExpressionStatement","src":"14224:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"14197:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"14206:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14193:3:111"},"nodeType":"YulFunctionCall","src":"14193:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"14218:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"14189:3:111"},"nodeType":"YulFunctionCall","src":"14189:32:111"},"nodeType":"YulIf","src":"14186:52:111"},{"nodeType":"YulVariableDeclaration","src":"14247:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14273:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14260:12:111"},"nodeType":"YulFunctionCall","src":"14260:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"14251:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14317:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"14292:24:111"},"nodeType":"YulFunctionCall","src":"14292:31:111"},"nodeType":"YulExpressionStatement","src":"14292:31:111"},{"nodeType":"YulAssignment","src":"14332:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"14342:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"14332:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"14356:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14388:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14399:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14384:3:111"},"nodeType":"YulFunctionCall","src":"14384:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14371:12:111"},"nodeType":"YulFunctionCall","src":"14371:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"14360:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"14437:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"14412:24:111"},"nodeType":"YulFunctionCall","src":"14412:33:111"},"nodeType":"YulExpressionStatement","src":"14412:33:111"},{"nodeType":"YulAssignment","src":"14454:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"14464:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"14454:6:111"}]},{"nodeType":"YulAssignment","src":"14480:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14507:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14518:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14503:3:111"},"nodeType":"YulFunctionCall","src":"14503:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14490:12:111"},"nodeType":"YulFunctionCall","src":"14490:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"14480:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14126:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"14137:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"14149:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14157:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"14165:6:111","type":""}],"src":"14072:456:111"},{"body":{"nodeType":"YulBlock","src":"14654:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14671:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14682:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14664:6:111"},"nodeType":"YulFunctionCall","src":"14664:21:111"},"nodeType":"YulExpressionStatement","src":"14664:21:111"},{"nodeType":"YulAssignment","src":"14694:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14719:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14731:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14742:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14727:3:111"},"nodeType":"YulFunctionCall","src":"14727:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"14702:16:111"},"nodeType":"YulFunctionCall","src":"14702:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14694:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14623:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14634:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14645:4:111","type":""}],"src":"14533:219:111"},{"body":{"nodeType":"YulBlock","src":"14931:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14948:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14959:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14941:6:111"},"nodeType":"YulFunctionCall","src":"14941:21:111"},"nodeType":"YulExpressionStatement","src":"14941:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14982:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14993:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14978:3:111"},"nodeType":"YulFunctionCall","src":"14978:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14998:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14971:6:111"},"nodeType":"YulFunctionCall","src":"14971:29:111"},"nodeType":"YulExpressionStatement","src":"14971:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15020:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15031:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15016:3:111"},"nodeType":"YulFunctionCall","src":"15016:18:111"},{"hexValue":"4753323033","kind":"string","nodeType":"YulLiteral","src":"15036:7:111","type":"","value":"GS203"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15009:6:111"},"nodeType":"YulFunctionCall","src":"15009:35:111"},"nodeType":"YulExpressionStatement","src":"15009:35:111"},{"nodeType":"YulAssignment","src":"15053:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15076:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15061:3:111"},"nodeType":"YulFunctionCall","src":"15061:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15053:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14908:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14922:4:111","type":""}],"src":"14757:328:111"},{"body":{"nodeType":"YulBlock","src":"15264:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15281:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15292:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15274:6:111"},"nodeType":"YulFunctionCall","src":"15274:21:111"},"nodeType":"YulExpressionStatement","src":"15274:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15315:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15326:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15311:3:111"},"nodeType":"YulFunctionCall","src":"15311:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15331:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15304:6:111"},"nodeType":"YulFunctionCall","src":"15304:29:111"},"nodeType":"YulExpressionStatement","src":"15304:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15353:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15364:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15349:3:111"},"nodeType":"YulFunctionCall","src":"15349:18:111"},{"hexValue":"4753323034","kind":"string","nodeType":"YulLiteral","src":"15369:7:111","type":"","value":"GS204"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15342:6:111"},"nodeType":"YulFunctionCall","src":"15342:35:111"},"nodeType":"YulExpressionStatement","src":"15342:35:111"},{"nodeType":"YulAssignment","src":"15386:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15398:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15409:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15394:3:111"},"nodeType":"YulFunctionCall","src":"15394:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15386:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15241:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15255:4:111","type":""}],"src":"15090:328:111"},{"body":{"nodeType":"YulBlock","src":"15455:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15472:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15475:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15465:6:111"},"nodeType":"YulFunctionCall","src":"15465:88:111"},"nodeType":"YulExpressionStatement","src":"15465:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15569:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"15572:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15562:6:111"},"nodeType":"YulFunctionCall","src":"15562:15:111"},"nodeType":"YulExpressionStatement","src":"15562:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15593:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15596:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15586:6:111"},"nodeType":"YulFunctionCall","src":"15586:15:111"},"nodeType":"YulExpressionStatement","src":"15586:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"15423:184:111"},{"body":{"nodeType":"YulBlock","src":"15659:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"15750:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"15752:16:111"},"nodeType":"YulFunctionCall","src":"15752:18:111"},"nodeType":"YulExpressionStatement","src":"15752:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15675:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"15682:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"15672:2:111"},"nodeType":"YulFunctionCall","src":"15672:77:111"},"nodeType":"YulIf","src":"15669:103:111"},{"nodeType":"YulAssignment","src":"15781:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15792:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"15799:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15788:3:111"},"nodeType":"YulFunctionCall","src":"15788:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"15781:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"15641:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"15651:3:111","type":""}],"src":"15612:195:111"},{"body":{"nodeType":"YulBlock","src":"15913:125:111","statements":[{"nodeType":"YulAssignment","src":"15923:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15935:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15946:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15931:3:111"},"nodeType":"YulFunctionCall","src":"15931:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15923:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15965:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15980:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15988:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15976:3:111"},"nodeType":"YulFunctionCall","src":"15976:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15958:6:111"},"nodeType":"YulFunctionCall","src":"15958:74:111"},"nodeType":"YulExpressionStatement","src":"15958:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15882:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15893:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15904:4:111","type":""}],"src":"15812:226:111"},{"body":{"nodeType":"YulBlock","src":"16217:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16234:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16245:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16227:6:111"},"nodeType":"YulFunctionCall","src":"16227:21:111"},"nodeType":"YulExpressionStatement","src":"16227:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16268:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16279:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16264:3:111"},"nodeType":"YulFunctionCall","src":"16264:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16284:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16257:6:111"},"nodeType":"YulFunctionCall","src":"16257:29:111"},"nodeType":"YulExpressionStatement","src":"16257:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16306:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16317:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16302:3:111"},"nodeType":"YulFunctionCall","src":"16302:18:111"},{"hexValue":"4753303230","kind":"string","nodeType":"YulLiteral","src":"16322:7:111","type":"","value":"GS020"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16295:6:111"},"nodeType":"YulFunctionCall","src":"16295:35:111"},"nodeType":"YulExpressionStatement","src":"16295:35:111"},{"nodeType":"YulAssignment","src":"16339:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16362:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16347:3:111"},"nodeType":"YulFunctionCall","src":"16347:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16339:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f27dba96666375fe844b71e8ea4f388db2ce9f87fa9882d36a17036a7478b232__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16194:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16208:4:111","type":""}],"src":"16043:328:111"},{"body":{"nodeType":"YulBlock","src":"16550:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16567:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16578:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16560:6:111"},"nodeType":"YulFunctionCall","src":"16560:21:111"},"nodeType":"YulExpressionStatement","src":"16560:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16601:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16612:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16597:3:111"},"nodeType":"YulFunctionCall","src":"16597:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16617:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16590:6:111"},"nodeType":"YulFunctionCall","src":"16590:29:111"},"nodeType":"YulExpressionStatement","src":"16590:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16650:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16635:3:111"},"nodeType":"YulFunctionCall","src":"16635:18:111"},{"hexValue":"4753303231","kind":"string","nodeType":"YulLiteral","src":"16655:7:111","type":"","value":"GS021"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16628:6:111"},"nodeType":"YulFunctionCall","src":"16628:35:111"},"nodeType":"YulExpressionStatement","src":"16628:35:111"},{"nodeType":"YulAssignment","src":"16672:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16684:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16695:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16680:3:111"},"nodeType":"YulFunctionCall","src":"16680:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16672:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_d153a9d5a0d4e2c2b7d4e887f02c1da6287d6d54f20f4d8ce40382a23140787a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16527:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16541:4:111","type":""}],"src":"16376:328:111"},{"body":{"nodeType":"YulBlock","src":"16883:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16900:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16911:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16893:6:111"},"nodeType":"YulFunctionCall","src":"16893:21:111"},"nodeType":"YulExpressionStatement","src":"16893:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16934:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16945:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16930:3:111"},"nodeType":"YulFunctionCall","src":"16930:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16950:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16923:6:111"},"nodeType":"YulFunctionCall","src":"16923:29:111"},"nodeType":"YulExpressionStatement","src":"16923:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16972:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16983:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16968:3:111"},"nodeType":"YulFunctionCall","src":"16968:18:111"},{"hexValue":"4753303232","kind":"string","nodeType":"YulLiteral","src":"16988:7:111","type":"","value":"GS022"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16961:6:111"},"nodeType":"YulFunctionCall","src":"16961:35:111"},"nodeType":"YulExpressionStatement","src":"16961:35:111"},{"nodeType":"YulAssignment","src":"17005:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17017:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17028:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17013:3:111"},"nodeType":"YulFunctionCall","src":"17013:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17005:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_372498b513e17609439d064ce0277017b054c808f722c83ff57cee4e06a9e457__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16860:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16874:4:111","type":""}],"src":"16709:328:111"},{"body":{"nodeType":"YulBlock","src":"17216:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17233:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17244:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17226:6:111"},"nodeType":"YulFunctionCall","src":"17226:21:111"},"nodeType":"YulExpressionStatement","src":"17226:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17267:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17278:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17263:3:111"},"nodeType":"YulFunctionCall","src":"17263:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17283:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17256:6:111"},"nodeType":"YulFunctionCall","src":"17256:29:111"},"nodeType":"YulExpressionStatement","src":"17256:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17305:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17316:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17301:3:111"},"nodeType":"YulFunctionCall","src":"17301:18:111"},{"hexValue":"4753303233","kind":"string","nodeType":"YulLiteral","src":"17321:7:111","type":"","value":"GS023"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17294:6:111"},"nodeType":"YulFunctionCall","src":"17294:35:111"},"nodeType":"YulExpressionStatement","src":"17294:35:111"},{"nodeType":"YulAssignment","src":"17338:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17361:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17346:3:111"},"nodeType":"YulFunctionCall","src":"17346:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17338:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00aecc0fa22d38afc0f465808a9fee188ba139fb53b2ca550ea01d91d6ecf29f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17193:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17207:4:111","type":""}],"src":"17042:328:111"},{"body":{"nodeType":"YulBlock","src":"17540:212:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17557:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17568:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17550:6:111"},"nodeType":"YulFunctionCall","src":"17550:21:111"},"nodeType":"YulExpressionStatement","src":"17550:21:111"},{"nodeType":"YulVariableDeclaration","src":"17580:58:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17611:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17623:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17634:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17619:3:111"},"nodeType":"YulFunctionCall","src":"17619:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"17594:16:111"},"nodeType":"YulFunctionCall","src":"17594:44:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"17584:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17669:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17654:3:111"},"nodeType":"YulFunctionCall","src":"17654:18:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"17678:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17686:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17674:3:111"},"nodeType":"YulFunctionCall","src":"17674:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17647:6:111"},"nodeType":"YulFunctionCall","src":"17647:50:111"},"nodeType":"YulExpressionStatement","src":"17647:50:111"},{"nodeType":"YulAssignment","src":"17706:40:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"17731:6:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"17739:6:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"17714:16:111"},"nodeType":"YulFunctionCall","src":"17714:32:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17706:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17501:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"17512:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17520:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17531:4:111","type":""}],"src":"17375:377:111"},{"body":{"nodeType":"YulBlock","src":"17837:256:111","statements":[{"body":{"nodeType":"YulBlock","src":"17883:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17892:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17895:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17885:6:111"},"nodeType":"YulFunctionCall","src":"17885:12:111"},"nodeType":"YulExpressionStatement","src":"17885:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"17858:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17867:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17854:3:111"},"nodeType":"YulFunctionCall","src":"17854:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"17879:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17850:3:111"},"nodeType":"YulFunctionCall","src":"17850:32:111"},"nodeType":"YulIf","src":"17847:52:111"},{"nodeType":"YulVariableDeclaration","src":"17908:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17927:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17921:5:111"},"nodeType":"YulFunctionCall","src":"17921:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"17912:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18047:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18056:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18059:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18049:6:111"},"nodeType":"YulFunctionCall","src":"18049:12:111"},"nodeType":"YulExpressionStatement","src":"18049:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17959:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17970:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17977:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17966:3:111"},"nodeType":"YulFunctionCall","src":"17966:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"17956:2:111"},"nodeType":"YulFunctionCall","src":"17956:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17949:6:111"},"nodeType":"YulFunctionCall","src":"17949:97:111"},"nodeType":"YulIf","src":"17946:117:111"},{"nodeType":"YulAssignment","src":"18072:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"18082:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18072:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17803:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"17814:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"17826:6:111","type":""}],"src":"17757:336:111"},{"body":{"nodeType":"YulBlock","src":"18272:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18289:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18300:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18282:6:111"},"nodeType":"YulFunctionCall","src":"18282:21:111"},"nodeType":"YulExpressionStatement","src":"18282:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18323:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18334:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18319:3:111"},"nodeType":"YulFunctionCall","src":"18319:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18339:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18312:6:111"},"nodeType":"YulFunctionCall","src":"18312:29:111"},"nodeType":"YulExpressionStatement","src":"18312:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18372:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18357:3:111"},"nodeType":"YulFunctionCall","src":"18357:18:111"},{"hexValue":"4753303234","kind":"string","nodeType":"YulLiteral","src":"18377:7:111","type":"","value":"GS024"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18350:6:111"},"nodeType":"YulFunctionCall","src":"18350:35:111"},"nodeType":"YulExpressionStatement","src":"18350:35:111"},{"nodeType":"YulAssignment","src":"18394:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18406:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18417:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18402:3:111"},"nodeType":"YulFunctionCall","src":"18402:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18394:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1d9dfad0f7e80ccb3a898324566cbd9ed8451678d229622c4c1b5f1f19330139__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18249:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18263:4:111","type":""}],"src":"18098:328:111"},{"body":{"nodeType":"YulBlock","src":"18605:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18622:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18633:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18615:6:111"},"nodeType":"YulFunctionCall","src":"18615:21:111"},"nodeType":"YulExpressionStatement","src":"18615:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18656:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18667:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18652:3:111"},"nodeType":"YulFunctionCall","src":"18652:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18672:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18645:6:111"},"nodeType":"YulFunctionCall","src":"18645:29:111"},"nodeType":"YulExpressionStatement","src":"18645:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18694:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18705:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18690:3:111"},"nodeType":"YulFunctionCall","src":"18690:18:111"},{"hexValue":"4753303235","kind":"string","nodeType":"YulLiteral","src":"18710:7:111","type":"","value":"GS025"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18683:6:111"},"nodeType":"YulFunctionCall","src":"18683:35:111"},"nodeType":"YulExpressionStatement","src":"18683:35:111"},{"nodeType":"YulAssignment","src":"18727:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18739:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18750:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18735:3:111"},"nodeType":"YulFunctionCall","src":"18735:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18727:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bc2491dc7fc5c71a630e01bcb9c3e39f61f559ab54f6528d2adb67d65ed9ff6b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18582:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18596:4:111","type":""}],"src":"18431:328:111"},{"body":{"nodeType":"YulBlock","src":"18984:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19001:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19006:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18994:6:111"},"nodeType":"YulFunctionCall","src":"18994:79:111"},"nodeType":"YulExpressionStatement","src":"18994:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19093:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19098:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19089:3:111"},"nodeType":"YulFunctionCall","src":"19089:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"19103:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19082:6:111"},"nodeType":"YulFunctionCall","src":"19082:28:111"},"nodeType":"YulExpressionStatement","src":"19082:28:111"},{"nodeType":"YulAssignment","src":"19119:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19130:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19135:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19126:3:111"},"nodeType":"YulFunctionCall","src":"19126:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"19119:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"18960:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18965:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"18976:3:111","type":""}],"src":"18764:380:111"},{"body":{"nodeType":"YulBlock","src":"19196:148:111","statements":[{"nodeType":"YulVariableDeclaration","src":"19206:23:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"19221:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"19224:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19217:3:111"},"nodeType":"YulFunctionCall","src":"19217:12:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"19210:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"19238:23:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"19253:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"19256:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19249:3:111"},"nodeType":"YulFunctionCall","src":"19249:12:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"19242:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19286:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"19288:16:111"},"nodeType":"YulFunctionCall","src":"19288:18:111"},"nodeType":"YulExpressionStatement","src":"19288:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"19276:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"19281:3:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"19273:2:111"},"nodeType":"YulFunctionCall","src":"19273:12:111"},"nodeType":"YulIf","src":"19270:38:111"},{"nodeType":"YulAssignment","src":"19317:21:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"19329:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"19334:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19325:3:111"},"nodeType":"YulFunctionCall","src":"19325:13:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"19317:4:111"}]}]},"name":"checked_sub_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"19178:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"19181:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"19187:4:111","type":""}],"src":"19149:195:111"},{"body":{"nodeType":"YulBlock","src":"19530:217:111","statements":[{"nodeType":"YulAssignment","src":"19540:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19563:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19548:3:111"},"nodeType":"YulFunctionCall","src":"19548:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19540:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19583:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"19594:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19576:6:111"},"nodeType":"YulFunctionCall","src":"19576:25:111"},"nodeType":"YulExpressionStatement","src":"19576:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19621:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19632:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19617:3:111"},"nodeType":"YulFunctionCall","src":"19617:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"19641:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19649:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19637:3:111"},"nodeType":"YulFunctionCall","src":"19637:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19610:6:111"},"nodeType":"YulFunctionCall","src":"19610:45:111"},"nodeType":"YulExpressionStatement","src":"19610:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19675:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19686:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19671:3:111"},"nodeType":"YulFunctionCall","src":"19671:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"19691:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19664:6:111"},"nodeType":"YulFunctionCall","src":"19664:34:111"},"nodeType":"YulExpressionStatement","src":"19664:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19718:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19729:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19714:3:111"},"nodeType":"YulFunctionCall","src":"19714:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"19734:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19707:6:111"},"nodeType":"YulFunctionCall","src":"19707:34:111"},"nodeType":"YulExpressionStatement","src":"19707:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19475:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"19486:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"19494:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"19502:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19510:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19521:4:111","type":""}],"src":"19349:398:111"},{"body":{"nodeType":"YulBlock","src":"19926:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19954:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19936:6:111"},"nodeType":"YulFunctionCall","src":"19936:21:111"},"nodeType":"YulExpressionStatement","src":"19936:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19977:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19988:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19973:3:111"},"nodeType":"YulFunctionCall","src":"19973:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19993:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19966:6:111"},"nodeType":"YulFunctionCall","src":"19966:29:111"},"nodeType":"YulExpressionStatement","src":"19966:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20015:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20026:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20011:3:111"},"nodeType":"YulFunctionCall","src":"20011:18:111"},{"hexValue":"4753303236","kind":"string","nodeType":"YulLiteral","src":"20031:7:111","type":"","value":"GS026"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20004:6:111"},"nodeType":"YulFunctionCall","src":"20004:35:111"},"nodeType":"YulExpressionStatement","src":"20004:35:111"},{"nodeType":"YulAssignment","src":"20048:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20060:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20071:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20056:3:111"},"nodeType":"YulFunctionCall","src":"20056:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20048:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_14032cc06a7a2043c1b961d6b7d6cbfaea1511224ce5ca723af49fa68e55c159__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19903:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19917:4:111","type":""}],"src":"19752:328:111"},{"body":{"nodeType":"YulBlock","src":"20259:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20276:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20287:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20269:6:111"},"nodeType":"YulFunctionCall","src":"20269:21:111"},"nodeType":"YulExpressionStatement","src":"20269:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20310:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20321:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20306:3:111"},"nodeType":"YulFunctionCall","src":"20306:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20326:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20299:6:111"},"nodeType":"YulFunctionCall","src":"20299:29:111"},"nodeType":"YulExpressionStatement","src":"20299:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20359:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20344:3:111"},"nodeType":"YulFunctionCall","src":"20344:18:111"},{"hexValue":"4753313034","kind":"string","nodeType":"YulLiteral","src":"20364:7:111","type":"","value":"GS104"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20337:6:111"},"nodeType":"YulFunctionCall","src":"20337:35:111"},"nodeType":"YulExpressionStatement","src":"20337:35:111"},{"nodeType":"YulAssignment","src":"20381:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20393:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20404:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20389:3:111"},"nodeType":"YulFunctionCall","src":"20389:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20381:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20236:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20250:4:111","type":""}],"src":"20085:328:111"},{"body":{"nodeType":"YulBlock","src":"20470:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"20589:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"20591:16:111"},"nodeType":"YulFunctionCall","src":"20591:18:111"},"nodeType":"YulExpressionStatement","src":"20591:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"20501:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20494:6:111"},"nodeType":"YulFunctionCall","src":"20494:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20487:6:111"},"nodeType":"YulFunctionCall","src":"20487:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"20509:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20516:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"20584:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"20512:3:111"},"nodeType":"YulFunctionCall","src":"20512:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20506:2:111"},"nodeType":"YulFunctionCall","src":"20506:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20483:3:111"},"nodeType":"YulFunctionCall","src":"20483:105:111"},"nodeType":"YulIf","src":"20480:131:111"},{"nodeType":"YulAssignment","src":"20620:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"20635:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"20638:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"20631:3:111"},"nodeType":"YulFunctionCall","src":"20631:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"20620:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"20449:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"20452:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"20458:7:111","type":""}],"src":"20418:228:111"},{"body":{"nodeType":"YulBlock","src":"20825:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20842:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20853:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20835:6:111"},"nodeType":"YulFunctionCall","src":"20835:21:111"},"nodeType":"YulExpressionStatement","src":"20835:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20876:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20887:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20872:3:111"},"nodeType":"YulFunctionCall","src":"20872:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20892:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20865:6:111"},"nodeType":"YulFunctionCall","src":"20865:29:111"},"nodeType":"YulExpressionStatement","src":"20865:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20914:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20925:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20910:3:111"},"nodeType":"YulFunctionCall","src":"20910:18:111"},{"hexValue":"4753313031","kind":"string","nodeType":"YulLiteral","src":"20930:7:111","type":"","value":"GS101"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20903:6:111"},"nodeType":"YulFunctionCall","src":"20903:35:111"},"nodeType":"YulExpressionStatement","src":"20903:35:111"},{"nodeType":"YulAssignment","src":"20947:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20959:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20970:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20955:3:111"},"nodeType":"YulFunctionCall","src":"20955:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20947:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20802:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20816:4:111","type":""}],"src":"20651:328:111"},{"body":{"nodeType":"YulBlock","src":"21158:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21175:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21186:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21168:6:111"},"nodeType":"YulFunctionCall","src":"21168:21:111"},"nodeType":"YulExpressionStatement","src":"21168:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21209:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21220:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21205:3:111"},"nodeType":"YulFunctionCall","src":"21205:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21225:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21198:6:111"},"nodeType":"YulFunctionCall","src":"21198:29:111"},"nodeType":"YulExpressionStatement","src":"21198:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21247:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21258:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21243:3:111"},"nodeType":"YulFunctionCall","src":"21243:18:111"},{"hexValue":"4753313032","kind":"string","nodeType":"YulLiteral","src":"21263:7:111","type":"","value":"GS102"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21236:6:111"},"nodeType":"YulFunctionCall","src":"21236:35:111"},"nodeType":"YulExpressionStatement","src":"21236:35:111"},{"nodeType":"YulAssignment","src":"21280:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21292:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21303:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21288:3:111"},"nodeType":"YulFunctionCall","src":"21288:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21280:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21135:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21149:4:111","type":""}],"src":"20984:328:111"},{"body":{"nodeType":"YulBlock","src":"21491:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21508:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21519:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21501:6:111"},"nodeType":"YulFunctionCall","src":"21501:21:111"},"nodeType":"YulExpressionStatement","src":"21501:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21542:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21553:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21538:3:111"},"nodeType":"YulFunctionCall","src":"21538:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21558:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21531:6:111"},"nodeType":"YulFunctionCall","src":"21531:29:111"},"nodeType":"YulExpressionStatement","src":"21531:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21580:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21591:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21576:3:111"},"nodeType":"YulFunctionCall","src":"21576:18:111"},{"hexValue":"4753323031","kind":"string","nodeType":"YulLiteral","src":"21596:7:111","type":"","value":"GS201"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21569:6:111"},"nodeType":"YulFunctionCall","src":"21569:35:111"},"nodeType":"YulExpressionStatement","src":"21569:35:111"},{"nodeType":"YulAssignment","src":"21613:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21625:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21636:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21621:3:111"},"nodeType":"YulFunctionCall","src":"21621:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21613:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21468:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21482:4:111","type":""}],"src":"21317:328:111"},{"body":{"nodeType":"YulBlock","src":"21824:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21852:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21834:6:111"},"nodeType":"YulFunctionCall","src":"21834:21:111"},"nodeType":"YulExpressionStatement","src":"21834:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21875:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21886:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21871:3:111"},"nodeType":"YulFunctionCall","src":"21871:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21891:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21864:6:111"},"nodeType":"YulFunctionCall","src":"21864:29:111"},"nodeType":"YulExpressionStatement","src":"21864:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21924:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21909:3:111"},"nodeType":"YulFunctionCall","src":"21909:18:111"},{"hexValue":"4753323032","kind":"string","nodeType":"YulLiteral","src":"21929:7:111","type":"","value":"GS202"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21902:6:111"},"nodeType":"YulFunctionCall","src":"21902:35:111"},"nodeType":"YulExpressionStatement","src":"21902:35:111"},{"nodeType":"YulAssignment","src":"21946:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21958:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21969:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21954:3:111"},"nodeType":"YulFunctionCall","src":"21954:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21946:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21801:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21815:4:111","type":""}],"src":"21650:328:111"},{"body":{"nodeType":"YulBlock","src":"22015:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22032:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22035:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22025:6:111"},"nodeType":"YulFunctionCall","src":"22025:88:111"},"nodeType":"YulExpressionStatement","src":"22025:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22129:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"22132:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22122:6:111"},"nodeType":"YulFunctionCall","src":"22122:15:111"},"nodeType":"YulExpressionStatement","src":"22122:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22153:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22156:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22146:6:111"},"nodeType":"YulFunctionCall","src":"22146:15:111"},"nodeType":"YulExpressionStatement","src":"22146:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"21983:184:111"},{"body":{"nodeType":"YulBlock","src":"22223:243:111","statements":[{"body":{"nodeType":"YulBlock","src":"22265:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22286:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22289:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22279:6:111"},"nodeType":"YulFunctionCall","src":"22279:88:111"},"nodeType":"YulExpressionStatement","src":"22279:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22387:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"22390:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22380:6:111"},"nodeType":"YulFunctionCall","src":"22380:15:111"},"nodeType":"YulExpressionStatement","src":"22380:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22415:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22418:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22408:6:111"},"nodeType":"YulFunctionCall","src":"22408:15:111"},"nodeType":"YulExpressionStatement","src":"22408:15:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22246:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"22253:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"22243:2:111"},"nodeType":"YulFunctionCall","src":"22243:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"22236:6:111"},"nodeType":"YulFunctionCall","src":"22236:20:111"},"nodeType":"YulIf","src":"22233:200:111"},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"22449:3:111"},{"name":"value","nodeType":"YulIdentifier","src":"22454:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22442:6:111"},"nodeType":"YulFunctionCall","src":"22442:18:111"},"nodeType":"YulExpressionStatement","src":"22442:18:111"}]},"name":"abi_encode_enum_Operation","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"22207:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"22214:3:111","type":""}],"src":"22172:294:111"},{"body":{"nodeType":"YulBlock","src":"22928:973:111","statements":[{"nodeType":"YulVariableDeclaration","src":"22938:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"22948:3:111","type":"","value":"352"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"22942:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22967:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"22982:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"22990:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"22978:3:111"},"nodeType":"YulFunctionCall","src":"22978:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22960:6:111"},"nodeType":"YulFunctionCall","src":"22960:74:111"},"nodeType":"YulExpressionStatement","src":"22960:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23054:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23065:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23050:3:111"},"nodeType":"YulFunctionCall","src":"23050:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"23070:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23043:6:111"},"nodeType":"YulFunctionCall","src":"23043:34:111"},"nodeType":"YulExpressionStatement","src":"23043:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23097:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23108:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23093:3:111"},"nodeType":"YulFunctionCall","src":"23093:18:111"},{"name":"_1","nodeType":"YulIdentifier","src":"23113:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23086:6:111"},"nodeType":"YulFunctionCall","src":"23086:30:111"},"nodeType":"YulExpressionStatement","src":"23086:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23136:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"23147:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23132:3:111"},"nodeType":"YulFunctionCall","src":"23132:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"23152:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23125:6:111"},"nodeType":"YulFunctionCall","src":"23125:34:111"},"nodeType":"YulExpressionStatement","src":"23125:34:111"},{"nodeType":"YulVariableDeclaration","src":"23168:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"23178:3:111","type":"","value":"384"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"23172:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23207:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"23218:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23203:3:111"},"nodeType":"YulFunctionCall","src":"23203:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"23223:6:111"},{"name":"value3","nodeType":"YulIdentifier","src":"23231:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"23190:12:111"},"nodeType":"YulFunctionCall","src":"23190:48:111"},"nodeType":"YulExpressionStatement","src":"23190:48:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23262:9:111"},{"name":"value3","nodeType":"YulIdentifier","src":"23273:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23258:3:111"},"nodeType":"YulFunctionCall","src":"23258:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"23282:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23254:3:111"},"nodeType":"YulFunctionCall","src":"23254:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"23287:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23247:6:111"},"nodeType":"YulFunctionCall","src":"23247:42:111"},"nodeType":"YulExpressionStatement","src":"23247:42:111"},{"nodeType":"YulVariableDeclaration","src":"23298:114:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23312:9:111"},{"arguments":[{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"23331:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"23339:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23327:3:111"},"nodeType":"YulFunctionCall","src":"23327:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"23344:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"23323:3:111"},"nodeType":"YulFunctionCall","src":"23323:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23308:3:111"},"nodeType":"YulFunctionCall","src":"23308:104:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"23302:2:111","type":""}]},{"expression":{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"23447:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23459:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23470:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23455:3:111"},"nodeType":"YulFunctionCall","src":"23455:18:111"}],"functionName":{"name":"abi_encode_enum_Operation","nodeType":"YulIdentifier","src":"23421:25:111"},"nodeType":"YulFunctionCall","src":"23421:53:111"},"nodeType":"YulExpressionStatement","src":"23421:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23494:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23505:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23490:3:111"},"nodeType":"YulFunctionCall","src":"23490:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"23511:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23483:6:111"},"nodeType":"YulFunctionCall","src":"23483:35:111"},"nodeType":"YulExpressionStatement","src":"23483:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23538:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23549:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23534:3:111"},"nodeType":"YulFunctionCall","src":"23534:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"23555:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23527:6:111"},"nodeType":"YulFunctionCall","src":"23527:35:111"},"nodeType":"YulExpressionStatement","src":"23527:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23582:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23593:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23578:3:111"},"nodeType":"YulFunctionCall","src":"23578:19:111"},{"name":"value7","nodeType":"YulIdentifier","src":"23599:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23571:6:111"},"nodeType":"YulFunctionCall","src":"23571:35:111"},"nodeType":"YulExpressionStatement","src":"23571:35:111"},{"expression":{"arguments":[{"name":"value8","nodeType":"YulIdentifier","src":"23634:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23646:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23657:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23642:3:111"},"nodeType":"YulFunctionCall","src":"23642:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"23615:18:111"},"nodeType":"YulFunctionCall","src":"23615:47:111"},"nodeType":"YulExpressionStatement","src":"23615:47:111"},{"expression":{"arguments":[{"name":"value9","nodeType":"YulIdentifier","src":"23690:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23702:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23713:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23698:3:111"},"nodeType":"YulFunctionCall","src":"23698:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"23671:18:111"},"nodeType":"YulFunctionCall","src":"23671:47:111"},"nodeType":"YulExpressionStatement","src":"23671:47:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23738:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23749:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23734:3:111"},"nodeType":"YulFunctionCall","src":"23734:19:111"},{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"23763:2:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"23767:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"23759:3:111"},"nodeType":"YulFunctionCall","src":"23759:18:111"},{"name":"_2","nodeType":"YulIdentifier","src":"23779:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23755:3:111"},"nodeType":"YulFunctionCall","src":"23755:27:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23727:6:111"},"nodeType":"YulFunctionCall","src":"23727:56:111"},"nodeType":"YulExpressionStatement","src":"23727:56:111"},{"nodeType":"YulAssignment","src":"23792:46:111","value":{"arguments":[{"name":"value10","nodeType":"YulIdentifier","src":"23817:7:111"},{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"23830:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"23834:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23826:3:111"},"nodeType":"YulFunctionCall","src":"23826:11:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"23800:16:111"},"nodeType":"YulFunctionCall","src":"23800:38:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"23792:4:111"}]},{"expression":{"arguments":[{"name":"value11","nodeType":"YulIdentifier","src":"23866:7:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23879:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23890:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23875:3:111"},"nodeType":"YulFunctionCall","src":"23875:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"23847:18:111"},"nodeType":"YulFunctionCall","src":"23847:48:111"},"nodeType":"YulExpressionStatement","src":"23847:48:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22807:9:111","type":""},{"name":"value11","nodeType":"YulTypedName","src":"22818:7:111","type":""},{"name":"value10","nodeType":"YulTypedName","src":"22827:7:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"22836:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"22844:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"22852:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"22860:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"22868:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"22876:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"22884:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"22892:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"22900:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"22908:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22919:4:111","type":""}],"src":"22471:1430:111"},{"body":{"nodeType":"YulBlock","src":"23954:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"23981:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"23983:16:111"},"nodeType":"YulFunctionCall","src":"23983:18:111"},"nodeType":"YulExpressionStatement","src":"23983:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"23970:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"23977:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"23973:3:111"},"nodeType":"YulFunctionCall","src":"23973:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"23967:2:111"},"nodeType":"YulFunctionCall","src":"23967:13:111"},"nodeType":"YulIf","src":"23964:39:111"},{"nodeType":"YulAssignment","src":"24012:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"24023:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"24026:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24019:3:111"},"nodeType":"YulFunctionCall","src":"24019:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"24012:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"23937:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"23940:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"23946:3:111","type":""}],"src":"23906:128:111"},{"body":{"nodeType":"YulBlock","src":"24085:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"24116:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"24137:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"24140:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24130:6:111"},"nodeType":"YulFunctionCall","src":"24130:88:111"},"nodeType":"YulExpressionStatement","src":"24130:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"24238:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"24241:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24231:6:111"},"nodeType":"YulFunctionCall","src":"24231:15:111"},"nodeType":"YulExpressionStatement","src":"24231:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"24266:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"24269:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"24259:6:111"},"nodeType":"YulFunctionCall","src":"24259:15:111"},"nodeType":"YulExpressionStatement","src":"24259:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"24105:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"24098:6:111"},"nodeType":"YulFunctionCall","src":"24098:9:111"},"nodeType":"YulIf","src":"24095:189:111"},{"nodeType":"YulAssignment","src":"24293:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"24302:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"24305:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"24298:3:111"},"nodeType":"YulFunctionCall","src":"24298:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"24293:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"24070:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"24073:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"24079:1:111","type":""}],"src":"24039:274:111"},{"body":{"nodeType":"YulBlock","src":"24492:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24520:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24502:6:111"},"nodeType":"YulFunctionCall","src":"24502:21:111"},"nodeType":"YulExpressionStatement","src":"24502:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24543:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24554:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24539:3:111"},"nodeType":"YulFunctionCall","src":"24539:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"24559:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24532:6:111"},"nodeType":"YulFunctionCall","src":"24532:29:111"},"nodeType":"YulExpressionStatement","src":"24532:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24581:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24592:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24577:3:111"},"nodeType":"YulFunctionCall","src":"24577:18:111"},{"hexValue":"4753303130","kind":"string","nodeType":"YulLiteral","src":"24597:7:111","type":"","value":"GS010"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24570:6:111"},"nodeType":"YulFunctionCall","src":"24570:35:111"},"nodeType":"YulExpressionStatement","src":"24570:35:111"},{"nodeType":"YulAssignment","src":"24614:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24626:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24637:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24622:3:111"},"nodeType":"YulFunctionCall","src":"24622:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"24614:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9d970fd9adbe3047cd5b7a20406b6bf2e613338cfe3a19aca4ca1810b67fad10__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"24469:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"24483:4:111","type":""}],"src":"24318:328:111"},{"body":{"nodeType":"YulBlock","src":"24700:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"24722:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"24724:16:111"},"nodeType":"YulFunctionCall","src":"24724:18:111"},"nodeType":"YulExpressionStatement","src":"24724:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"24716:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"24719:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"24713:2:111"},"nodeType":"YulFunctionCall","src":"24713:8:111"},"nodeType":"YulIf","src":"24710:34:111"},{"nodeType":"YulAssignment","src":"24753:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"24765:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"24768:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"24761:3:111"},"nodeType":"YulFunctionCall","src":"24761:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"24753:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"24682:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"24685:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"24691:4:111","type":""}],"src":"24651:125:111"},{"body":{"nodeType":"YulBlock","src":"24955:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24972:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24983:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24965:6:111"},"nodeType":"YulFunctionCall","src":"24965:21:111"},"nodeType":"YulExpressionStatement","src":"24965:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25006:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25017:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25002:3:111"},"nodeType":"YulFunctionCall","src":"25002:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"25022:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24995:6:111"},"nodeType":"YulFunctionCall","src":"24995:29:111"},"nodeType":"YulExpressionStatement","src":"24995:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25044:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25055:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25040:3:111"},"nodeType":"YulFunctionCall","src":"25040:18:111"},{"hexValue":"4753303133","kind":"string","nodeType":"YulLiteral","src":"25060:7:111","type":"","value":"GS013"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25033:6:111"},"nodeType":"YulFunctionCall","src":"25033:35:111"},"nodeType":"YulExpressionStatement","src":"25033:35:111"},{"nodeType":"YulAssignment","src":"25077:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25089:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25100:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25085:3:111"},"nodeType":"YulFunctionCall","src":"25085:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25077:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_99333b4627cde46d9c53d7148b33b8b1f4f065f5dceb2cb210893e67e551978e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"24932:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"24946:4:111","type":""}],"src":"24781:328:111"},{"body":{"nodeType":"YulBlock","src":"25243:119:111","statements":[{"nodeType":"YulAssignment","src":"25253:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25276:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25261:3:111"},"nodeType":"YulFunctionCall","src":"25261:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25253:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25295:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"25306:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25288:6:111"},"nodeType":"YulFunctionCall","src":"25288:25:111"},"nodeType":"YulExpressionStatement","src":"25288:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25333:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25344:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25329:3:111"},"nodeType":"YulFunctionCall","src":"25329:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"25349:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25322:6:111"},"nodeType":"YulFunctionCall","src":"25322:34:111"},"nodeType":"YulExpressionStatement","src":"25322:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25204:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"25215:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"25223:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25234:4:111","type":""}],"src":"25114:248:111"},{"body":{"nodeType":"YulBlock","src":"25490:135:111","statements":[{"nodeType":"YulAssignment","src":"25500:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25512:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25523:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25508:3:111"},"nodeType":"YulFunctionCall","src":"25508:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25500:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25542:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"25553:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25535:6:111"},"nodeType":"YulFunctionCall","src":"25535:25:111"},"nodeType":"YulExpressionStatement","src":"25535:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25580:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25591:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25576:3:111"},"nodeType":"YulFunctionCall","src":"25576:18:111"},{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"25610:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"25603:6:111"},"nodeType":"YulFunctionCall","src":"25603:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"25596:6:111"},"nodeType":"YulFunctionCall","src":"25596:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25569:6:111"},"nodeType":"YulFunctionCall","src":"25569:50:111"},"nodeType":"YulExpressionStatement","src":"25569:50:111"}]},"name":"abi_encode_tuple_t_bytes32_t_bool__to_t_bytes32_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25451:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"25462:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"25470:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25481:4:111","type":""}],"src":"25367:258:111"},{"body":{"nodeType":"YulBlock","src":"25804:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25821:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25832:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25814:6:111"},"nodeType":"YulFunctionCall","src":"25814:21:111"},"nodeType":"YulExpressionStatement","src":"25814:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25855:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25866:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25851:3:111"},"nodeType":"YulFunctionCall","src":"25851:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"25871:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25844:6:111"},"nodeType":"YulFunctionCall","src":"25844:29:111"},"nodeType":"YulExpressionStatement","src":"25844:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25893:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25904:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25889:3:111"},"nodeType":"YulFunctionCall","src":"25889:18:111"},{"hexValue":"4753303031","kind":"string","nodeType":"YulLiteral","src":"25909:7:111","type":"","value":"GS001"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25882:6:111"},"nodeType":"YulFunctionCall","src":"25882:35:111"},"nodeType":"YulExpressionStatement","src":"25882:35:111"},{"nodeType":"YulAssignment","src":"25926:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25938:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25949:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25934:3:111"},"nodeType":"YulFunctionCall","src":"25934:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25926:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_93293a4a2e4cde533ea81b8912d8934c2d7892ceb975e9ad2c25f4abf449a730__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25781:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25795:4:111","type":""}],"src":"25630:328:111"},{"body":{"nodeType":"YulBlock","src":"25995:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"26012:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"26015:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26005:6:111"},"nodeType":"YulFunctionCall","src":"26005:88:111"},"nodeType":"YulExpressionStatement","src":"26005:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"26109:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"26112:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26102:6:111"},"nodeType":"YulFunctionCall","src":"26102:15:111"},"nodeType":"YulExpressionStatement","src":"26102:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"26133:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"26136:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"26126:6:111"},"nodeType":"YulFunctionCall","src":"26126:15:111"},"nodeType":"YulExpressionStatement","src":"26126:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"25963:184:111"},{"body":{"nodeType":"YulBlock","src":"26397:786:111","statements":[{"nodeType":"YulVariableDeclaration","src":"26407:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26425:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26436:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26421:3:111"},"nodeType":"YulFunctionCall","src":"26421:19:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"26411:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26456:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26467:3:111","type":"","value":"128"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26449:6:111"},"nodeType":"YulFunctionCall","src":"26449:22:111"},"nodeType":"YulExpressionStatement","src":"26449:22:111"},{"nodeType":"YulVariableDeclaration","src":"26480:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"26491:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"26484:3:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"26513:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"26521:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26506:6:111"},"nodeType":"YulFunctionCall","src":"26506:22:111"},"nodeType":"YulExpressionStatement","src":"26506:22:111"},{"nodeType":"YulAssignment","src":"26537:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26548:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26559:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26544:3:111"},"nodeType":"YulFunctionCall","src":"26544:19:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"26537:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"26572:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"26586:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"26576:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"26601:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"26610:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"26605:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"26669:278:111","statements":[{"nodeType":"YulVariableDeclaration","src":"26683:33:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"26709:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"26696:12:111"},"nodeType":"YulFunctionCall","src":"26696:20:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"26687:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"26754:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"26729:24:111"},"nodeType":"YulFunctionCall","src":"26729:31:111"},"nodeType":"YulExpressionStatement","src":"26729:31:111"},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"26780:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"26789:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"26796:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"26785:3:111"},"nodeType":"YulFunctionCall","src":"26785:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26773:6:111"},"nodeType":"YulFunctionCall","src":"26773:67:111"},"nodeType":"YulExpressionStatement","src":"26773:67:111"},{"nodeType":"YulVariableDeclaration","src":"26853:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"26863:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"26857:2:111","type":""}]},{"nodeType":"YulAssignment","src":"26880:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"26891:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"26896:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26887:3:111"},"nodeType":"YulFunctionCall","src":"26887:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"26880:3:111"}]},{"nodeType":"YulAssignment","src":"26912:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"26926:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"26934:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26922:3:111"},"nodeType":"YulFunctionCall","src":"26922:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"26912:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"26631:1:111"},{"name":"value1","nodeType":"YulIdentifier","src":"26634:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"26628:2:111"},"nodeType":"YulFunctionCall","src":"26628:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"26642:18:111","statements":[{"nodeType":"YulAssignment","src":"26644:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"26653:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"26656:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26649:3:111"},"nodeType":"YulFunctionCall","src":"26649:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"26644:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"26624:3:111","statements":[]},"src":"26620:327:111"},{"nodeType":"YulAssignment","src":"26956:11:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"26964:3:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"26956:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26987:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26998:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26983:3:111"},"nodeType":"YulFunctionCall","src":"26983:20:111"},{"name":"value2","nodeType":"YulIdentifier","src":"27005:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26976:6:111"},"nodeType":"YulFunctionCall","src":"26976:36:111"},"nodeType":"YulExpressionStatement","src":"26976:36:111"},{"nodeType":"YulVariableDeclaration","src":"27021:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"27031:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"27025:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27104:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27089:3:111"},"nodeType":"YulFunctionCall","src":"27089:18:111"},{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"27113:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"27121:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"27109:3:111"},"nodeType":"YulFunctionCall","src":"27109:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27082:6:111"},"nodeType":"YulFunctionCall","src":"27082:43:111"},"nodeType":"YulExpressionStatement","src":"27082:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27145:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27156:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27141:3:111"},"nodeType":"YulFunctionCall","src":"27141:18:111"},{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"27165:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"27173:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"27161:3:111"},"nodeType":"YulFunctionCall","src":"27161:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27134:6:111"},"nodeType":"YulFunctionCall","src":"27134:43:111"},"nodeType":"YulExpressionStatement","src":"27134:43:111"}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_calldata_ptr_t_uint256_t_address_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"26334:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"26345:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"26353:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"26361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"26369:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"26377:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"26388:4:111","type":""}],"src":"26152:1031:111"},{"body":{"nodeType":"YulBlock","src":"27307:63:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"27324:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"27329:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27317:6:111"},"nodeType":"YulFunctionCall","src":"27317:19:111"},"nodeType":"YulExpressionStatement","src":"27317:19:111"},{"nodeType":"YulAssignment","src":"27345:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"27356:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"27361:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27352:3:111"},"nodeType":"YulFunctionCall","src":"27352:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"27345:3:111"}]}]},"name":"abi_encode_tuple_packed_t_uint256__to_t_uint256__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"27283:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"27288:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"27299:3:111","type":""}],"src":"27188:182:111"},{"body":{"nodeType":"YulBlock","src":"27549:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27577:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27559:6:111"},"nodeType":"YulFunctionCall","src":"27559:21:111"},"nodeType":"YulExpressionStatement","src":"27559:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27611:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27596:3:111"},"nodeType":"YulFunctionCall","src":"27596:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"27616:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27589:6:111"},"nodeType":"YulFunctionCall","src":"27589:29:111"},"nodeType":"YulExpressionStatement","src":"27589:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27638:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27649:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27634:3:111"},"nodeType":"YulFunctionCall","src":"27634:18:111"},{"hexValue":"4753303330","kind":"string","nodeType":"YulLiteral","src":"27654:7:111","type":"","value":"GS030"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27627:6:111"},"nodeType":"YulFunctionCall","src":"27627:35:111"},"nodeType":"YulExpressionStatement","src":"27627:35:111"},{"nodeType":"YulAssignment","src":"27671:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27683:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27694:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27679:3:111"},"nodeType":"YulFunctionCall","src":"27679:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"27671:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26b7fa7d947085035b53de5c25693e568c405e1e894ad22389a1528045f35ba8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"27526:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"27540:4:111","type":""}],"src":"27375:328:111"},{"body":{"nodeType":"YulBlock","src":"27882:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27899:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27910:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27892:6:111"},"nodeType":"YulFunctionCall","src":"27892:21:111"},"nodeType":"YulExpressionStatement","src":"27892:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27933:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27944:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27929:3:111"},"nodeType":"YulFunctionCall","src":"27929:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"27949:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27922:6:111"},"nodeType":"YulFunctionCall","src":"27922:29:111"},"nodeType":"YulExpressionStatement","src":"27922:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27971:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27982:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27967:3:111"},"nodeType":"YulFunctionCall","src":"27967:18:111"},{"hexValue":"4753313033","kind":"string","nodeType":"YulLiteral","src":"27987:7:111","type":"","value":"GS103"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27960:6:111"},"nodeType":"YulFunctionCall","src":"27960:35:111"},"nodeType":"YulExpressionStatement","src":"27960:35:111"},{"nodeType":"YulAssignment","src":"28004:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28016:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28027:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28012:3:111"},"nodeType":"YulFunctionCall","src":"28012:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"28004:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"27859:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"27873:4:111","type":""}],"src":"27708:328:111"},{"body":{"nodeType":"YulBlock","src":"28215:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28232:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28243:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28225:6:111"},"nodeType":"YulFunctionCall","src":"28225:21:111"},"nodeType":"YulExpressionStatement","src":"28225:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28266:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28277:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28262:3:111"},"nodeType":"YulFunctionCall","src":"28262:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"28282:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28255:6:111"},"nodeType":"YulFunctionCall","src":"28255:29:111"},"nodeType":"YulExpressionStatement","src":"28255:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28304:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28315:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28300:3:111"},"nodeType":"YulFunctionCall","src":"28300:18:111"},{"hexValue":"4753323035","kind":"string","nodeType":"YulLiteral","src":"28320:7:111","type":"","value":"GS205"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28293:6:111"},"nodeType":"YulFunctionCall","src":"28293:35:111"},"nodeType":"YulExpressionStatement","src":"28293:35:111"},{"nodeType":"YulAssignment","src":"28337:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28349:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28360:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28345:3:111"},"nodeType":"YulFunctionCall","src":"28345:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"28337:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"28192:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"28206:4:111","type":""}],"src":"28041:328:111"},{"body":{"nodeType":"YulBlock","src":"28521:124:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"28544:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"28549:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"28557:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"28531:12:111"},"nodeType":"YulFunctionCall","src":"28531:33:111"},"nodeType":"YulExpressionStatement","src":"28531:33:111"},{"nodeType":"YulVariableDeclaration","src":"28573:26:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"28587:3:111"},{"name":"value1","nodeType":"YulIdentifier","src":"28592:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28583:3:111"},"nodeType":"YulFunctionCall","src":"28583:16:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"28577:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"28615:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"28619:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28608:6:111"},"nodeType":"YulFunctionCall","src":"28608:13:111"},"nodeType":"YulExpressionStatement","src":"28608:13:111"},{"nodeType":"YulAssignment","src":"28630:9:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"28637:2:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"28630:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"28489:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"28494:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"28502:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"28513:3:111","type":""}],"src":"28374:271:111"},{"body":{"nodeType":"YulBlock","src":"29044:622:111","statements":[{"nodeType":"YulAssignment","src":"29054:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29077:3:111","type":"","value":"352"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29062:3:111"},"nodeType":"YulFunctionCall","src":"29062:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"29054:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29097:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"29108:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29090:6:111"},"nodeType":"YulFunctionCall","src":"29090:25:111"},"nodeType":"YulExpressionStatement","src":"29090:25:111"},{"nodeType":"YulVariableDeclaration","src":"29124:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"29134:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"29128:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29196:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29207:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29192:3:111"},"nodeType":"YulFunctionCall","src":"29192:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"29216:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29224:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29212:3:111"},"nodeType":"YulFunctionCall","src":"29212:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29185:6:111"},"nodeType":"YulFunctionCall","src":"29185:43:111"},"nodeType":"YulExpressionStatement","src":"29185:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29248:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29259:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29244:3:111"},"nodeType":"YulFunctionCall","src":"29244:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"29264:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29237:6:111"},"nodeType":"YulFunctionCall","src":"29237:34:111"},"nodeType":"YulExpressionStatement","src":"29237:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29302:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29287:3:111"},"nodeType":"YulFunctionCall","src":"29287:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"29307:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29280:6:111"},"nodeType":"YulFunctionCall","src":"29280:34:111"},"nodeType":"YulExpressionStatement","src":"29280:34:111"},{"expression":{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"29349:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29372:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29357:3:111"},"nodeType":"YulFunctionCall","src":"29357:19:111"}],"functionName":{"name":"abi_encode_enum_Operation","nodeType":"YulIdentifier","src":"29323:25:111"},"nodeType":"YulFunctionCall","src":"29323:54:111"},"nodeType":"YulExpressionStatement","src":"29323:54:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29408:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29393:3:111"},"nodeType":"YulFunctionCall","src":"29393:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"29414:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29386:6:111"},"nodeType":"YulFunctionCall","src":"29386:35:111"},"nodeType":"YulExpressionStatement","src":"29386:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29441:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29452:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29437:3:111"},"nodeType":"YulFunctionCall","src":"29437:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"29458:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29430:6:111"},"nodeType":"YulFunctionCall","src":"29430:35:111"},"nodeType":"YulExpressionStatement","src":"29430:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29485:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29496:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29481:3:111"},"nodeType":"YulFunctionCall","src":"29481:19:111"},{"name":"value7","nodeType":"YulIdentifier","src":"29502:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29474:6:111"},"nodeType":"YulFunctionCall","src":"29474:35:111"},"nodeType":"YulExpressionStatement","src":"29474:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29540:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29525:3:111"},"nodeType":"YulFunctionCall","src":"29525:19:111"},{"arguments":[{"name":"value8","nodeType":"YulIdentifier","src":"29550:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29558:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29546:3:111"},"nodeType":"YulFunctionCall","src":"29546:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29518:6:111"},"nodeType":"YulFunctionCall","src":"29518:44:111"},"nodeType":"YulExpressionStatement","src":"29518:44:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29582:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29593:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29578:3:111"},"nodeType":"YulFunctionCall","src":"29578:19:111"},{"arguments":[{"name":"value9","nodeType":"YulIdentifier","src":"29603:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29611:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29599:3:111"},"nodeType":"YulFunctionCall","src":"29599:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29571:6:111"},"nodeType":"YulFunctionCall","src":"29571:44:111"},"nodeType":"YulExpressionStatement","src":"29571:44:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29635:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29646:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29631:3:111"},"nodeType":"YulFunctionCall","src":"29631:19:111"},{"name":"value10","nodeType":"YulIdentifier","src":"29652:7:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29624:6:111"},"nodeType":"YulFunctionCall","src":"29624:36:111"},"nodeType":"YulExpressionStatement","src":"29624:36:111"}]},"name":"abi_encode_tuple_t_bytes32_t_address_t_uint256_t_bytes32_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__to_t_bytes32_t_address_t_uint256_t_bytes32_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"28932:9:111","type":""},{"name":"value10","nodeType":"YulTypedName","src":"28943:7:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"28952:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"28960:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"28968:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"28976:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"28984:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"28992:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"29000:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"29008:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"29016:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"29024:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"29035:4:111","type":""}],"src":"28650:1016:111"},{"body":{"nodeType":"YulBlock","src":"29870:275:111","statements":[{"nodeType":"YulVariableDeclaration","src":"29880:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"29890:66:111","type":"","value":"0xff00000000000000000000000000000000000000000000000000000000000000"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"29884:2:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"29972:3:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"29981:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29989:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29977:3:111"},"nodeType":"YulFunctionCall","src":"29977:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29965:6:111"},"nodeType":"YulFunctionCall","src":"29965:28:111"},"nodeType":"YulExpressionStatement","src":"29965:28:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30013:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30018:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30009:3:111"},"nodeType":"YulFunctionCall","src":"30009:11:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"30026:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"30034:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"30022:3:111"},"nodeType":"YulFunctionCall","src":"30022:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30002:6:111"},"nodeType":"YulFunctionCall","src":"30002:36:111"},"nodeType":"YulExpressionStatement","src":"30002:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30058:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30063:1:111","type":"","value":"2"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30054:3:111"},"nodeType":"YulFunctionCall","src":"30054:11:111"},{"name":"value2","nodeType":"YulIdentifier","src":"30067:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30047:6:111"},"nodeType":"YulFunctionCall","src":"30047:27:111"},"nodeType":"YulExpressionStatement","src":"30047:27:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30094:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30099:2:111","type":"","value":"34"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30090:3:111"},"nodeType":"YulFunctionCall","src":"30090:12:111"},{"name":"value3","nodeType":"YulIdentifier","src":"30104:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30083:6:111"},"nodeType":"YulFunctionCall","src":"30083:28:111"},"nodeType":"YulExpressionStatement","src":"30083:28:111"},{"nodeType":"YulAssignment","src":"30120:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30131:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30136:2:111","type":"","value":"66"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30127:3:111"},"nodeType":"YulFunctionCall","src":"30127:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"30120:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes1_t_bytes1_t_bytes32_t_bytes32__to_t_bytes1_t_bytes1_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"29822:3:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"29827:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"29835:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"29843:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"29851:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"29862:3:111","type":""}],"src":"29671:474:111"},{"body":{"nodeType":"YulBlock","src":"30333:211:111","statements":[{"nodeType":"YulAssignment","src":"30343:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30355:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30366:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30351:3:111"},"nodeType":"YulFunctionCall","src":"30351:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"30343:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30385:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"30396:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30378:6:111"},"nodeType":"YulFunctionCall","src":"30378:25:111"},"nodeType":"YulExpressionStatement","src":"30378:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30423:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30434:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30419:3:111"},"nodeType":"YulFunctionCall","src":"30419:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"30439:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30412:6:111"},"nodeType":"YulFunctionCall","src":"30412:34:111"},"nodeType":"YulExpressionStatement","src":"30412:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30466:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30477:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30462:3:111"},"nodeType":"YulFunctionCall","src":"30462:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"30486:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"30494:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"30482:3:111"},"nodeType":"YulFunctionCall","src":"30482:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30455:6:111"},"nodeType":"YulFunctionCall","src":"30455:83:111"},"nodeType":"YulExpressionStatement","src":"30455:83:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint256_t_contract$_GnosisSafe_$952__to_t_bytes32_t_uint256_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"30286:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"30297:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"30305:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"30313:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"30324:4:111","type":""}],"src":"30150:394:111"},{"body":{"nodeType":"YulBlock","src":"30596:149:111","statements":[{"body":{"nodeType":"YulBlock","src":"30623:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"30625:16:111"},"nodeType":"YulFunctionCall","src":"30625:18:111"},"nodeType":"YulExpressionStatement","src":"30625:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30616:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"30609:6:111"},"nodeType":"YulFunctionCall","src":"30609:13:111"},"nodeType":"YulIf","src":"30606:39:111"},{"nodeType":"YulAssignment","src":"30654:85:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30665:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30672:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30661:3:111"},"nodeType":"YulFunctionCall","src":"30661:78:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"30654:3:111"}]}]},"name":"decrement_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"30578:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"30588:3:111","type":""}],"src":"30549:196:111"},{"body":{"nodeType":"YulBlock","src":"30924:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30941:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30952:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30934:6:111"},"nodeType":"YulFunctionCall","src":"30934:21:111"},"nodeType":"YulExpressionStatement","src":"30934:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30975:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30986:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30971:3:111"},"nodeType":"YulFunctionCall","src":"30971:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"30991:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30964:6:111"},"nodeType":"YulFunctionCall","src":"30964:29:111"},"nodeType":"YulExpressionStatement","src":"30964:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31013:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31024:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31009:3:111"},"nodeType":"YulFunctionCall","src":"31009:18:111"},{"hexValue":"4753303331","kind":"string","nodeType":"YulLiteral","src":"31029:7:111","type":"","value":"GS031"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31002:6:111"},"nodeType":"YulFunctionCall","src":"31002:35:111"},"nodeType":"YulExpressionStatement","src":"31002:35:111"},{"nodeType":"YulAssignment","src":"31046:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31058:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31069:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31054:3:111"},"nodeType":"YulFunctionCall","src":"31054:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"31046:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"30901:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"30915:4:111","type":""}],"src":"30750:328:111"},{"body":{"nodeType":"YulBlock","src":"31257:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31285:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31267:6:111"},"nodeType":"YulFunctionCall","src":"31267:21:111"},"nodeType":"YulExpressionStatement","src":"31267:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31308:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31319:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31304:3:111"},"nodeType":"YulFunctionCall","src":"31304:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"31324:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31297:6:111"},"nodeType":"YulFunctionCall","src":"31297:29:111"},"nodeType":"YulExpressionStatement","src":"31297:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31346:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31357:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31342:3:111"},"nodeType":"YulFunctionCall","src":"31342:18:111"},{"hexValue":"4753303131","kind":"string","nodeType":"YulLiteral","src":"31362:7:111","type":"","value":"GS011"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31335:6:111"},"nodeType":"YulFunctionCall","src":"31335:35:111"},"nodeType":"YulExpressionStatement","src":"31335:35:111"},{"nodeType":"YulAssignment","src":"31379:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31391:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31402:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31387:3:111"},"nodeType":"YulFunctionCall","src":"31387:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"31379:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4353e9bcd8ea99b4d56990ac4b8777f1ab67cada8356790f30e482f2408a44b0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"31234:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"31248:4:111","type":""}],"src":"31083:328:111"},{"body":{"nodeType":"YulBlock","src":"31590:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31618:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31600:6:111"},"nodeType":"YulFunctionCall","src":"31600:21:111"},"nodeType":"YulExpressionStatement","src":"31600:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31652:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31637:3:111"},"nodeType":"YulFunctionCall","src":"31637:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"31657:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31630:6:111"},"nodeType":"YulFunctionCall","src":"31630:29:111"},"nodeType":"YulExpressionStatement","src":"31630:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31679:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31690:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31675:3:111"},"nodeType":"YulFunctionCall","src":"31675:18:111"},{"hexValue":"4753303132","kind":"string","nodeType":"YulLiteral","src":"31695:7:111","type":"","value":"GS012"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31668:6:111"},"nodeType":"YulFunctionCall","src":"31668:35:111"},"nodeType":"YulExpressionStatement","src":"31668:35:111"},{"nodeType":"YulAssignment","src":"31712:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31724:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31735:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31720:3:111"},"nodeType":"YulFunctionCall","src":"31720:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"31712:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_74edef16877c9a34a97f281dbea2805f9198008e7df330ab6416449a66143b07__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"31567:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"31581:4:111","type":""}],"src":"31416:328:111"},{"body":{"nodeType":"YulBlock","src":"31923:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31940:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31951:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31933:6:111"},"nodeType":"YulFunctionCall","src":"31933:21:111"},"nodeType":"YulExpressionStatement","src":"31933:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31974:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31985:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31970:3:111"},"nodeType":"YulFunctionCall","src":"31970:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"31990:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31963:6:111"},"nodeType":"YulFunctionCall","src":"31963:29:111"},"nodeType":"YulExpressionStatement","src":"31963:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32012:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32023:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32008:3:111"},"nodeType":"YulFunctionCall","src":"32008:18:111"},{"hexValue":"4753323030","kind":"string","nodeType":"YulLiteral","src":"32028:7:111","type":"","value":"GS200"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32001:6:111"},"nodeType":"YulFunctionCall","src":"32001:35:111"},"nodeType":"YulExpressionStatement","src":"32001:35:111"},{"nodeType":"YulAssignment","src":"32045:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32057:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32068:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32053:3:111"},"nodeType":"YulFunctionCall","src":"32053:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32045:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3a328c389014707497c45ecba7527a678d30fabfd6868fe8bade352062f7774b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"31900:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"31914:4:111","type":""}],"src":"31749:328:111"},{"body":{"nodeType":"YulBlock","src":"32256:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32273:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32284:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32266:6:111"},"nodeType":"YulFunctionCall","src":"32266:21:111"},"nodeType":"YulExpressionStatement","src":"32266:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32318:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32303:3:111"},"nodeType":"YulFunctionCall","src":"32303:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"32323:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32296:6:111"},"nodeType":"YulFunctionCall","src":"32296:29:111"},"nodeType":"YulExpressionStatement","src":"32296:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32345:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32356:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32341:3:111"},"nodeType":"YulFunctionCall","src":"32341:18:111"},{"hexValue":"4753313030","kind":"string","nodeType":"YulLiteral","src":"32361:7:111","type":"","value":"GS100"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32334:6:111"},"nodeType":"YulFunctionCall","src":"32334:35:111"},"nodeType":"YulExpressionStatement","src":"32334:35:111"},{"nodeType":"YulAssignment","src":"32378:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32390:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32401:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32386:3:111"},"nodeType":"YulFunctionCall","src":"32386:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32378:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8c9c6f726a0896ef73f47c5bcc7192641db350a8b0b2e1f61e0f0c694ec59426__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"32233:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"32247:4:111","type":""}],"src":"32082:328:111"},{"body":{"nodeType":"YulBlock","src":"32589:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32606:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32617:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32599:6:111"},"nodeType":"YulFunctionCall","src":"32599:21:111"},"nodeType":"YulExpressionStatement","src":"32599:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32640:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32651:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32636:3:111"},"nodeType":"YulFunctionCall","src":"32636:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"32656:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32629:6:111"},"nodeType":"YulFunctionCall","src":"32629:29:111"},"nodeType":"YulExpressionStatement","src":"32629:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32678:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32689:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32674:3:111"},"nodeType":"YulFunctionCall","src":"32674:18:111"},{"hexValue":"4753303030","kind":"string","nodeType":"YulLiteral","src":"32694:7:111","type":"","value":"GS000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32667:6:111"},"nodeType":"YulFunctionCall","src":"32667:35:111"},"nodeType":"YulExpressionStatement","src":"32667:35:111"},{"nodeType":"YulAssignment","src":"32711:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32734:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32719:3:111"},"nodeType":"YulFunctionCall","src":"32719:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32711:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3fdb21530a98d914fa570cd548d7a3608c11195b5a11ec44ecd149309d9dcced__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"32566:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"32580:4:111","type":""}],"src":"32415:328:111"},{"body":{"nodeType":"YulBlock","src":"32877:168:111","statements":[{"nodeType":"YulAssignment","src":"32887:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32899:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32910:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32895:3:111"},"nodeType":"YulFunctionCall","src":"32895:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32887:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32929:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"32944:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"32952:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"32940:3:111"},"nodeType":"YulFunctionCall","src":"32940:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32922:6:111"},"nodeType":"YulFunctionCall","src":"32922:74:111"},"nodeType":"YulExpressionStatement","src":"32922:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"33016:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"33027:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"33012:3:111"},"nodeType":"YulFunctionCall","src":"33012:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"33032:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33005:6:111"},"nodeType":"YulFunctionCall","src":"33005:34:111"},"nodeType":"YulExpressionStatement","src":"33005:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"32838:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"32849:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"32857:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"32868:4:111","type":""}],"src":"32748:297:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_address(value)\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let _2 := 0xffffffffffffffff\n if gt(_1, _2) { panic_error_0x41() }\n let _3 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_1, 0x1f), _3), 63), _3))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(memPtr, 0x20), add(offset, 0x20), _1)\n mstore(add(add(memPtr, _1), 0x20), 0)\n array := memPtr\n }\n function abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n value2 := abi_decode_bytes(add(headStart, offset_1), dataEnd)\n value3 := calldataload(add(headStart, 96))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_enum_Operation(offset) -> value\n {\n value := calldataload(offset)\n if iszero(lt(value, 2)) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value2 := abi_decode_bytes(add(headStart, offset), dataEnd)\n value3 := abi_decode_enum_Operation(add(headStart, 96))\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(pos, length), 0x20), 0)\n }\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, iszero(iszero(value0)))\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_address_payablet_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10\n {\n if slt(sub(dataEnd, headStart), 320) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(calldataload(add(headStart, 64)), _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, calldataload(add(headStart, 64))), dataEnd)\n value2 := value2_1\n value3 := value3_1\n value4 := abi_decode_enum_Operation(add(headStart, 96))\n value5 := calldataload(add(headStart, 128))\n value6 := calldataload(add(headStart, 160))\n value7 := calldataload(add(headStart, 192))\n value8 := abi_decode_address(add(headStart, 224))\n value9 := abi_decode_address(add(headStart, 256))\n if gt(calldataload(add(headStart, 288)), _1) { revert(0, 0) }\n value10 := abi_decode_bytes(add(headStart, calldataload(add(headStart, 288))), dataEnd)\n }\n function abi_decode_tuple_t_addresst_bytes32(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_bytes32t_bytes_memory_ptrt_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n value2 := abi_decode_bytes(add(headStart, offset_1), dataEnd)\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_array_address_dyn(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let _1 := 0x20\n pos := add(pos, _1)\n let srcPtr := add(value, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffffffffffffffffffffffffffffffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n end := pos\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_array_address_dyn(value0, add(headStart, 32))\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_uint256t_addresst_bytes_calldata_ptrt_addresst_addresst_uint256t_address_payable(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7, value8, value9\n {\n if slt(sub(dataEnd, headStart), 256) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, shl(5, length)), 0x20), dataEnd) { revert(0, 0) }\n value0 := add(_2, 0x20)\n value1 := length\n value2 := calldataload(add(headStart, 0x20))\n value3 := abi_decode_address(add(headStart, 64))\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n value6 := abi_decode_address(add(headStart, 128))\n value7 := abi_decode_address(add(headStart, 160))\n value8 := calldataload(add(headStart, 192))\n value9 := abi_decode_address(add(headStart, 224))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n value4 := abi_decode_enum_Operation(add(headStart, 96))\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_array_address_dyn(value0, add(headStart, 64))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptrt_enum$_Operation_$1997t_uint256t_uint256t_uint256t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10\n {\n if slt(sub(dataEnd, headStart), 320) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n value4 := abi_decode_enum_Operation(add(headStart, 96))\n value5 := calldataload(add(headStart, 128))\n value6 := calldataload(add(headStart, 160))\n value7 := calldataload(add(headStart, 192))\n let value_1 := calldataload(add(headStart, 224))\n validator_revert_address(value_1)\n value8 := value_1\n let value_2 := calldataload(add(headStart, 256))\n validator_revert_address(value_2)\n value9 := value_2\n value10 := calldataload(add(headStart, 288))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n }\n function abi_decode_tuple_t_addresst_addresst_address(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS203\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS204\")\n tail := add(headStart, 96)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_f27dba96666375fe844b71e8ea4f388db2ce9f87fa9882d36a17036a7478b232__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS020\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_d153a9d5a0d4e2c2b7d4e887f02c1da6287d6d54f20f4d8ce40382a23140787a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS021\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_372498b513e17609439d064ce0277017b054c808f722c83ff57cee4e06a9e457__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS022\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_00aecc0fa22d38afc0f465808a9fee188ba139fb53b2ca550ea01d91d6ecf29f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS023\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n let tail_1 := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), sub(tail_1, headStart))\n tail := abi_encode_bytes(value1, tail_1)\n }\n function abi_decode_tuple_t_bytes4_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_1d9dfad0f7e80ccb3a898324566cbd9ed8451678d229622c4c1b5f1f19330139__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS024\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_bc2491dc7fc5c71a630e01bcb9c3e39f61f559ab54f6528d2adb67d65ed9ff6b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS025\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n let x_1 := and(x, 0xff)\n let y_1 := and(y, 0xff)\n if lt(x_1, y_1) { panic_error_0x11() }\n diff := sub(x_1, y_1)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_stringliteral_14032cc06a7a2043c1b961d6b7d6cbfaea1511224ce5ca723af49fa68e55c159__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS026\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS104\")\n tail := add(headStart, 96)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS101\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS102\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS201\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS202\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_enum_Operation(value, pos)\n {\n if iszero(lt(value, 2))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n mstore(pos, value)\n }\n function abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_payable_t_bytes_memory_ptr_t_address__fromStack_reversed(headStart, value11, value10, value9, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n let _1 := 352\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), _1)\n mstore(add(headStart, _1), value3)\n let _2 := 384\n calldatacopy(add(headStart, _2), value2, value3)\n mstore(add(add(headStart, value3), _2), 0)\n let _3 := add(headStart, and(add(value3, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n abi_encode_enum_Operation(value4, add(headStart, 96))\n mstore(add(headStart, 128), value5)\n mstore(add(headStart, 160), value6)\n mstore(add(headStart, 192), value7)\n abi_encode_address(value8, add(headStart, 224))\n abi_encode_address(value9, add(headStart, 256))\n mstore(add(headStart, 288), add(sub(_3, headStart), _2))\n tail := abi_encode_bytes(value10, add(_3, _2))\n abi_encode_address(value11, add(headStart, 320))\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function abi_encode_tuple_t_stringliteral_9d970fd9adbe3047cd5b7a20406b6bf2e613338cfe3a19aca4ca1810b67fad10__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS010\")\n tail := add(headStart, 96)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_99333b4627cde46d9c53d7148b33b8b1f4f065f5dceb2cb210893e67e551978e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS013\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_bytes32_t_bool__to_t_bytes32_t_bool__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), iszero(iszero(value1)))\n }\n function abi_encode_tuple_t_stringliteral_93293a4a2e4cde533ea81b8912d8934c2d7892ceb975e9ad2c25f4abf449a730__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS001\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_calldata_ptr_t_uint256_t_address_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_address__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n let tail_1 := add(headStart, 128)\n mstore(headStart, 128)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 160)\n let srcPtr := value0\n let i := 0\n for { } lt(i, value1) { i := add(i, 1) }\n {\n let value := calldataload(srcPtr)\n validator_revert_address(value)\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n mstore(add(headStart, 0x20), value2)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(add(headStart, 64), and(value3, _2))\n mstore(add(headStart, 96), and(value4, _2))\n }\n function abi_encode_tuple_packed_t_uint256__to_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, value0)\n end := add(pos, 32)\n }\n function abi_encode_tuple_t_stringliteral_26b7fa7d947085035b53de5c25693e568c405e1e894ad22389a1528045f35ba8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS030\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS103\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS205\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n end := _1\n }\n function abi_encode_tuple_t_bytes32_t_address_t_uint256_t_bytes32_t_enum$_Operation_$1997_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__to_t_bytes32_t_address_t_uint256_t_bytes32_t_uint8_t_uint256_t_uint256_t_uint256_t_address_t_address_t_uint256__fromStack_reversed(headStart, value10, value9, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 352)\n mstore(headStart, value0)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n abi_encode_enum_Operation(value4, add(headStart, 128))\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), value6)\n mstore(add(headStart, 224), value7)\n mstore(add(headStart, 256), and(value8, _1))\n mstore(add(headStart, 288), and(value9, _1))\n mstore(add(headStart, 320), value10)\n }\n function abi_encode_tuple_packed_t_bytes1_t_bytes1_t_bytes32_t_bytes32__to_t_bytes1_t_bytes1_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value3, value2, value1, value0) -> end\n {\n let _1 := 0xff00000000000000000000000000000000000000000000000000000000000000\n mstore(pos, and(value0, _1))\n mstore(add(pos, 1), and(value1, _1))\n mstore(add(pos, 2), value2)\n mstore(add(pos, 34), value3)\n end := add(pos, 66)\n }\n function abi_encode_tuple_t_bytes32_t_uint256_t_contract$_GnosisSafe_$952__to_t_bytes32_t_uint256_t_address_payable__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function decrement_t_uint256(value) -> ret\n {\n if iszero(value) { panic_error_0x11() }\n ret := add(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n }\n function abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS031\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_4353e9bcd8ea99b4d56990ac4b8777f1ab67cada8356790f30e482f2408a44b0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS011\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_74edef16877c9a34a97f281dbea2805f9198008e7df330ab6416449a66143b07__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS012\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_3a328c389014707497c45ecba7527a678d30fabfd6868fe8bade352062f7774b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS200\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_8c9c6f726a0896ef73f47c5bcc7192641db350a8b0b2e1f61e0f0c694ec59426__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS100\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_3fdb21530a98d914fa570cd548d7a3608c11195b5a11ec44ecd149309d9dcced__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS000\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd9146106a7578063ffa1ad74146106c757610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e610299366004612b4a565b610710565b005b3480156102ac57600080fd5b5061029e6102bb366004612c50565b6108e4565b3480156102cc57600080fd5b506102e06102db366004612cc5565b610e28565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e0610310366004612cc5565b610e63565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d366004612cf1565b610e9b565b34801561035e57600080fd5b5061037261036d366004612cf1565b610f8a565b6040516102ec929190612dc6565b34801561038c57600080fd5b506103a061039b366004612de1565b610fc0565b6040516102ec9190612e03565b3480156103b957600080fd5b506103246103c8366004612e16565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f5366004612cc5565b611046565b34801561040657600080fd5b5061029e610415366004612e16565b6111d0565b6102e0610428366004612e78565b6112b0565b34801561043957600080fd5b50610324610448366004612b4a565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e610480366004612f51565b611642565b34801561049157600080fd5b5061049a6116a4565b6040516102ec9190613002565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d8366004613015565b611795565b3480156104e957600080fd5b5061029e6104f8366004613065565b6117b8565b34801561050957600080fd5b5061032461051836600461315a565b6118d9565b34801561052957600080fd5b5061053d610538366004612b4a565b611991565b6040516102ec9291906131cb565b34801561055757600080fd5b5061029e610566366004612e16565b611a8b565b34801561057757600080fd5b506103246105863660046131f6565b611b38565b34801561059757600080fd5b5061029e6105a63660046132b7565b611b65565b3480156105b757600080fd5b5061029e6105c6366004612cc5565b611cdc565b3480156105d757600080fd5b5061029e6105e63660046132f0565b611d41565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b3660046131f6565b611ff0565b34801561062c57600080fd5b5061029e61063b366004612cc5565b612189565b34801561064c57600080fd5b5061032460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b3480156106b357600080fd5b5061029e6106c236600461333b565b6121f2565b3480156106d357600080fd5b506103a06040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b6107186123f5565b6001600160a01b0382161580159061073a57506001600160a01b038216600114155b801561074f57506001600160a01b0382163014155b6107a05760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382811660009081526002602052604090205416156108085760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b038481166000818152604081208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560018352835490911617909155600380549161088d836133ab565b90915550506040516001600160a01b03831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146108e0576108e0816111d0565b5050565b6108ef816041612446565b8251101561093f5760405162461bcd60e51b815260206004820152600560248201527f47533032300000000000000000000000000000000000000000000000000000006044820152606401610797565b6000808060008060005b86811015610e1c576041818102890160208101516040820151919092015160ff16955090935091506000849003610bab57919350839161098a876041612446565b8210156109d95760405162461bcd60e51b815260206004820152600560248201527f47533032310000000000000000000000000000000000000000000000000000006044820152606401610797565b87516109e6836020612482565b1115610a345760405162461bcd60e51b815260206004820152600560248201527f47533032320000000000000000000000000000000000000000000000000000006044820152606401610797565b602082890181015189519091610a57908390610a51908790612482565b90612482565b1115610aa55760405162461bcd60e51b815260206004820152600560248201527f47533032330000000000000000000000000000000000000000000000000000006044820152606401610797565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a8501602001916001600160a01b038916906320c13b0b90610af4908f9086906004016133e3565b602060405180830381865afa158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b359190613408565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ba45760405162461bcd60e51b815260206004820152600560248201527f47533032340000000000000000000000000000000000000000000000000000006044820152606401610797565b5050610d6a565b8360ff16600103610c45579193508391336001600160a01b0384161480610bf457506001600160a01b03851660009081526008602090815260408083208d845290915290205415155b610c405760405162461bcd60e51b815260206004820152600560248201527f47533032350000000000000000000000000000000000000000000000000000006044820152606401610797565b610d6a565b601e8460ff161115610d0a576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610caa919061344a565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cf9573d6000803e3d6000fd5b505050602060405103519450610d6a565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610d5d573d6000803e3d6000fd5b5050506020604051035194505b856001600160a01b0316856001600160a01b0316118015610da457506001600160a01b038581166000908152600260205260409020541615155b8015610dba57506001600160a01b038516600114155b610e065760405162461bcd60e51b815260206004820152600560248201527f47533032360000000000000000000000000000000000000000000000000000006044820152606401610797565b8495508080610e14906133ab565b915050610949565b50505050505050505050565b600060016001600160a01b03831614801590610e5d57506001600160a01b038281166000908152600160205260409020541615155b92915050565b60006001600160a01b038216600114801590610e5d5750506001600160a01b0390811660009081526002602052604090205416151590565b600033600114801590610ec55750336000908152600160205260409020546001600160a01b031615155b610f115760405162461bcd60e51b815260206004820152600560248201527f47533130340000000000000000000000000000000000000000000000000000006044820152606401610797565b610f1e858585855a61249e565b90508015610f565760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610f82565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b60006060610f9a86868686610e9b565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000610fcf83602061346d565b67ffffffffffffffff811115610fe757610fe7612b76565b6040519080825280601f01601f191660200182016040528015611011576020820181803683370190505b50905060005b8381101561103e578481015460208083028401015280611036816133ab565b915050611017565b509392505050565b61104e6123f5565b6001600160a01b0381161580159061107057506001600160a01b038116600114155b6110bc5760405162461bcd60e51b815260206004820152600560248201527f47533130310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b0381811660009081526001602052604090205416156111245760405162461bcd60e51b815260206004820152600560248201527f47533130320000000000000000000000000000000000000000000000000000006044820152606401610797565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03858116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b6111d86123f5565b60035481111561122a5760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b600181101561127b5760405162461bcd60e51b815260206004820152600560248201527f47533230320000000000000000000000000000000000000000000000000000006044820152606401610797565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93906020016111c5565b60008060006112ca8e8e8e8e8e8e8e8e8e8e600554611ff0565b6005805491925060006112dc836133ab565b90915550508051602082012091506112f5828286611642565b5060006113207f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b90506001600160a01b038116156113a657806001600160a01b03166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016113739c9b9a99989796959493929190613514565b600060405180830381600087803b15801561138d57600080fd5b505af11580156113a1573d6000803e3d6000fd5b505050505b6113d26113b58a6109c46135f6565b603f6113c28c604061346d565b6113cc919061360e565b906124e5565b6113de906101f46135f6565b5a101561142d5760405162461bcd60e51b815260206004820152600560248201527f47533031300000000000000000000000000000000000000000000000000000006044820152606401610797565b60005a905061149e8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c60001461148b578e61249e565b6109c45a6114999190613649565b61249e565b93506114ab5a82906124fc565b905083806114b857508915155b806114c257508715155b61150e5760405162461bcd60e51b815260206004820152600560248201527f47533031330000000000000000000000000000000000000000000000000000006044820152606401610797565b6000881561152657611523828b8b8b8b612517565b90505b841561156a5760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a16115a4565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b50506001600160a01b03811615611631576040517f932713680000000000000000000000000000000000000000000000000000000081526004810183905283151560248201526001600160a01b03821690639327136890604401600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806116925760405162461bcd60e51b815260206004820152600560248201527f47533030310000000000000000000000000000000000000000000000000000006044820152606401610797565b61169e848484846108e4565b50505050565b6060600060035467ffffffffffffffff8111156116c3576116c3612b76565b6040519080825280602002602001820160405280156116ec578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054919250906001600160a01b03165b6001600160a01b03811660011461178d578083838151811061174d5761174d613660565b6001600160a01b03928316602091820292909201810191909152918116600090815260029092526040909120541681611785816133ab565b925050611729565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6117f68a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061264d915050565b6001600160a01b0384161561182d5761182d847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b61186d8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061292392505050565b81156118845761188282600060018685612517565b505b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b896040516118c595949392919061368f565b60405180910390a250505050505050505050565b6000805a9050611922878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a61249e565b61192b57600080fd5b60005a6119389083613649565b90508060405160200161194d91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b825261079791600401612e03565b606060008267ffffffffffffffff8111156119ae576119ae612b76565b6040519080825280602002602001820160405280156119d7578160200160208202803683370190505b506001600160a01b0380861660009081526001602052604081205492945091165b6001600160a01b03811615801590611a1a57506001600160a01b038116600114155b8015611a2557508482105b15611a7d5780848381518110611a3d57611a3d613660565b6001600160a01b03928316602091820292909201810191909152918116600090815260019092526040909120541681611a75816133ab565b9250506119f8565b908352919491935090915050565b336000908152600260205260409020546001600160a01b0316611af05760405162461bcd60e51b815260206004820152600560248201527f47533033300000000000000000000000000000000000000000000000000000006044820152606401610797565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611b4d8c8c8c8c8c8c8c8c8c8c8c611ff0565b8051906020012090509b9a5050505050505050505050565b611b6d6123f5565b6001600160a01b03811615801590611b8f57506001600160a01b038116600114155b611bdb5760405162461bcd60e51b815260206004820152600560248201527f47533130310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03828116600090815260016020526040902054811690821614611c475760405162461bcd60e51b815260206004820152600560248201527f47533130330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038181166000818152600160209081526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b611ce46123f5565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c88181556040516001600160a01b03831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290602001611cd0565b611d496123f5565b6001600160a01b03811615801590611d6b57506001600160a01b038116600114155b8015611d8057506001600160a01b0381163014155b611dcc5760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038181166000908152600260205260409020541615611e345760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03821615801590611e5657506001600160a01b038216600114155b611ea25760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03838116600090815260026020526040902054811690831614611f0e5760405162461bcd60e51b815260206004820152600560248201527f47533230350000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038281166000818152600260209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a16040516001600160a01b03821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405161202a9291906136fb565b604051908190038120612050949392918e908e908e908e908e908e908e9060200161370b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f010000000000000000000000000000000000000000000000000000000000000061212460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b6121916123f5565b6121b9817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6040516001600160a01b03821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0906020016111c5565b6121fa6123f5565b80600160035461220a9190613649565b10156122585760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b0382161580159061227a57506001600160a01b038216600114155b6122c65760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b038381166000908152600260205260409020548116908316146123325760405162461bcd60e51b815260206004820152600560248201527f47533230350000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179094559181528254909116909155600380549161239d8361377b565b90915550506040516001600160a01b03831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a180600454146123f0576123f0816111d0565b505050565b3330146124445760405162461bcd60e51b815260206004820152600560248201527f47533033310000000000000000000000000000000000000000000000000000006044820152606401610797565b565b60008260000361245857506000610e5d565b6000612464838561346d565b905082612471858361360e565b1461247b57600080fd5b9392505050565b60008061248f83856135f6565b90508381101561247b57600080fd5b600060018360018111156124b4576124b46134aa565b036124cc576000808551602087018986f490506124dc565b600080855160208701888a87f190505b95945050505050565b6000818310156124f5578161247b565b5090919050565b60008282111561250b57600080fd5b6000610f828385613649565b6000806001600160a01b0383161561252f5782612531565b325b90506001600160a01b0384166125dc576125633a8610612551573a612553565b855b61255d8989612482565b90612446565b6040519092506001600160a01b0382169083156108fc029084906000818181858888f193505050506125d75760405162461bcd60e51b815260206004820152600560248201527f47533031310000000000000000000000000000000000000000000000000000006044820152606401610797565b612643565b6125ea8561255d8989612482565b91506125f7848284612a65565b6126435760405162461bcd60e51b815260206004820152600560248201527f47533031320000000000000000000000000000000000000000000000000000006044820152606401610797565b5095945050505050565b6004541561269d5760405162461bcd60e51b815260206004820152600560248201527f47533230300000000000000000000000000000000000000000000000000000006044820152606401610797565b81518111156126ee5760405162461bcd60e51b815260206004820152600560248201527f47533230310000000000000000000000000000000000000000000000000000006044820152606401610797565b600181101561273f5760405162461bcd60e51b815260206004820152600560248201527f47533230320000000000000000000000000000000000000000000000000000006044820152606401610797565b600160005b83518110156128d857600084828151811061276157612761613660565b6020026020010151905060006001600160a01b0316816001600160a01b03161415801561279857506001600160a01b038116600114155b80156127ad57506001600160a01b0381163014155b80156127cb5750806001600160a01b0316836001600160a01b031614155b6128175760405162461bcd60e51b815260206004820152600560248201527f47533230330000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03818116600090815260026020526040902054161561287f5760405162461bcd60e51b815260206004820152600560248201527f47533230340000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600160a01b03928316600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001693821693909317909255806128d0816133ab565b915050612744565b506001600160a01b0316600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f546001600160a01b0316156129a55760405162461bcd60e51b815260206004820152600560248201527f47533130300000000000000000000000000000000000000000000000000000006044820152606401610797565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790556001600160a01b038216156108e057612a198260008360015a61249e565b6108e05760405162461bcd60e51b815260206004820152600560248201527f47533030300000000000000000000000000000000000000000000000000000006044820152606401610797565b604080516001600160a01b03841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015612b055760208114612b0d5760009350612b18565b819350612b18565b600051158215171593505b5050509392505050565b6001600160a01b0381168114612b3757600080fd5b50565b8035612b4581612b22565b919050565b60008060408385031215612b5d57600080fd5b8235612b6881612b22565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612bb657600080fd5b813567ffffffffffffffff80821115612bd157612bd1612b76565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c1757612c17612b76565b81604052838152866020858801011115612c3057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215612c6657600080fd5b84359350602085013567ffffffffffffffff80821115612c8557600080fd5b612c9188838901612ba5565b94506040870135915080821115612ca757600080fd5b50612cb487828801612ba5565b949793965093946060013593505050565b600060208284031215612cd757600080fd5b813561247b81612b22565b803560028110612b4557600080fd5b60008060008060808587031215612d0757600080fd5b8435612d1281612b22565b935060208501359250604085013567ffffffffffffffff811115612d3557600080fd5b612d4187828801612ba5565b925050612d5060608601612ce2565b905092959194509250565b6000815180845260005b81811015612d8157602081850181015186830182015201612d65565b81811115612d93576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610f826040830184612d5b565b60008060408385031215612df457600080fd5b50508035926020909101359150565b60208152600061247b6020830184612d5b565b600060208284031215612e2857600080fd5b5035919050565b60008083601f840112612e4157600080fd5b50813567ffffffffffffffff811115612e5957600080fd5b602083019150836020828501011115612e7157600080fd5b9250929050565b60008060008060008060008060008060006101408c8e031215612e9a57600080fd5b612ea38c612b3a565b9a5060208c0135995067ffffffffffffffff8060408e01351115612ec657600080fd5b612ed68e60408f01358f01612e2f565b909a509850612ee760608e01612ce2565b975060808d0135965060a08d0135955060c08d01359450612f0a60e08e01612b3a565b9350612f196101008e01612b3a565b9250806101208e01351115612f2d57600080fd5b50612f3f8d6101208e01358e01612ba5565b90509295989b509295989b9093969950565b600080600060608486031215612f6657600080fd5b83359250602084013567ffffffffffffffff80821115612f8557600080fd5b612f9187838801612ba5565b93506040860135915080821115612fa757600080fd5b50612fb486828701612ba5565b9150509250925092565b600081518084526020808501945080840160005b83811015612ff75781516001600160a01b031687529582019590820190600101612fd2565b509495945050505050565b60208152600061247b6020830184612fbe565b6000806040838503121561302857600080fd5b823561303381612b22565b9150602083013567ffffffffffffffff81111561304f57600080fd5b61305b85828601612ba5565b9150509250929050565b6000806000806000806000806000806101008b8d03121561308557600080fd5b8a3567ffffffffffffffff8082111561309d57600080fd5b818d0191508d601f8301126130b157600080fd5b8135818111156130c057600080fd5b8e60208260051b85010111156130d557600080fd5b60208381019d50909b508d013599506130f060408e01612b3a565b985060608d013591508082111561310657600080fd5b506131138d828e01612e2f565b9097509550613126905060808c01612b3a565b935061313460a08c01612b3a565b925060c08b0135915061314960e08c01612b3a565b90509295989b9194979a5092959850565b60008060008060006080868803121561317257600080fd5b853561317d81612b22565b945060208601359350604086013567ffffffffffffffff8111156131a057600080fd5b6131ac88828901612e2f565b90945092506131bf905060608701612ce2565b90509295509295909350565b6040815260006131de6040830185612fbe565b90506001600160a01b03831660208301529392505050565b60008060008060008060008060008060006101408c8e03121561321857600080fd5b8b3561322381612b22565b9a5060208c0135995060408c013567ffffffffffffffff81111561324657600080fd5b6132528e828f01612e2f565b909a509850613265905060608d01612ce2565b965060808c0135955060a08c0135945060c08c0135935060e08c013561328a81612b22565b92506101008c013561329b81612b22565b809250506101208c013590509295989b509295989b9093969950565b600080604083850312156132ca57600080fd5b82356132d581612b22565b915060208301356132e581612b22565b809150509250929050565b60008060006060848603121561330557600080fd5b833561331081612b22565b9250602084013561332081612b22565b9150604084013561333081612b22565b809150509250925092565b60008060006060848603121561335057600080fd5b833561335b81612b22565b9250602084013561336b81612b22565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133dc576133dc61337c565b5060010190565b6040815260006133f66040830185612d5b565b82810360208401526124dc8185612d5b565b60006020828403121561341a57600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461247b57600080fd5b600060ff821660ff8416808210156134645761346461337c565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134a5576134a561337c565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613510577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60006101606001600160a01b038f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d0116830161357d606085018d6134d9565b8a60808501528960a08501528860c08501526135a460e08501896001600160a01b03169052565b6001600160a01b03871661010085015281848203016101208501526135cb82820187612d5b565b925050506135e56101408301846001600160a01b03169052565b9d9c50505050505050505050505050565b600082198211156136095761360961337c565b500190565b600082613644577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561365b5761365b61337c565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156136d25782356136b581612b22565b6001600160a01b03168252602092830192909101906001016136a2565b50602084019690965250506001600160a01b039283166040820152911660609091015292915050565b8183823760009101908152919050565b6000610160820190508c82526001600160a01b03808d1660208401528b60408401528a6060840152613740608084018b6134d9565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b60008161378a5761378a61337c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e736ca6775bbc663810797384920e08a95b764aacfe5cf8012ac679fd7c3629564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xAFFED0E0 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xE19A9DD9 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF08A0323 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF08A0323 EQ PUSH2 0x620 JUMPI DUP1 PUSH4 0xF698DA25 EQ PUSH2 0x640 JUMPI DUP1 PUSH4 0xF8DC5DD9 EQ PUSH2 0x6A7 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x6C7 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xE19A9DD9 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0xE318B52B EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0xE75235B8 EQ PUSH2 0x5EB JUMPI DUP1 PUSH4 0xE86637DB EQ PUSH2 0x600 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xCC2F8452 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0xCC2F8452 EQ PUSH2 0x51D JUMPI DUP1 PUSH4 0xD4D9BDCD EQ PUSH2 0x54B JUMPI DUP1 PUSH4 0xD8D11F78 EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0xE009CFDE EQ PUSH2 0x58B JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0xB4FABA09 EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0xB63E800D EQ PUSH2 0x4DD JUMPI DUP1 PUSH4 0xC4CA3A9C EQ PUSH2 0x4FD JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x5624B25B GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x6A761202 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x6A761202 EQ PUSH2 0x41A JUMPI DUP1 PUSH4 0x7D832974 EQ PUSH2 0x42D JUMPI DUP1 PUSH4 0x934F3A11 EQ PUSH2 0x465 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x485 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x5624B25B EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0x5AE6BD37 EQ PUSH2 0x3AD JUMPI DUP1 PUSH4 0x610B5925 EQ PUSH2 0x3DA JUMPI DUP1 PUSH4 0x694E80C3 EQ PUSH2 0x3FA JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0x2F54BF6E GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x2F5 JUMPI DUP1 PUSH4 0x3408E470 EQ PUSH2 0x315 JUMPI DUP1 PUSH4 0x468721A7 EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x5229073F EQ PUSH2 0x352 JUMPI PUSH2 0x218 JUMP JUMPDEST DUP1 PUSH4 0xD582F13 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x12FB68E0 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x2D9AD53D EQ PUSH2 0x2C0 JUMPI PUSH2 0x218 JUMP JUMPDEST CALLDATASIZE PUSH2 0x218 JUMPI PUSH1 0x40 MLOAD CALLVALUE DUP2 MSTORE CALLER SWAP1 PUSH32 0x3D0CE9BFC3ED7D6862DBB28B2DEA94561FE714A1B4D019AA8AF39730D1AD7C3D SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 DUP1 SLOAD DUP1 PUSH2 0x24F JUMPI STOP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY CALLER PUSH1 0x60 SHL CALLDATASIZE MSTORE PUSH1 0x0 DUP1 PUSH1 0x14 CALLDATASIZE ADD PUSH1 0x0 DUP1 DUP6 GAS CALL SWAP1 POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x278 JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x299 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH2 0x710 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x2BB CALLDATASIZE PUSH1 0x4 PUSH2 0x2C50 JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x2DB CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0xE28 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x310 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0xE63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x321 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CHAINID JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2EC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF1 JUMP JUMPDEST PUSH2 0xE9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x372 PUSH2 0x36D CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF1 JUMP JUMPDEST PUSH2 0xF8A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP3 SWAP2 SWAP1 PUSH2 0x2DC6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH2 0x39B CALLDATASIZE PUSH1 0x4 PUSH2 0x2DE1 JUMP JUMPDEST PUSH2 0xFC0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP2 SWAP1 PUSH2 0x2E03 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x3C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x3F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x1046 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x415 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH2 0x11D0 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x428 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E78 JUMP JUMPDEST PUSH2 0x12B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x448 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x480 CALLDATASIZE PUSH1 0x4 PUSH2 0x2F51 JUMP JUMPDEST PUSH2 0x1642 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x491 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x49A PUSH2 0x16A4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP2 SWAP1 PUSH2 0x3002 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x4D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3015 JUMP JUMPDEST PUSH2 0x1795 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x4F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3065 JUMP JUMPDEST PUSH2 0x17B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x509 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x518 CALLDATASIZE PUSH1 0x4 PUSH2 0x315A JUMP JUMPDEST PUSH2 0x18D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53D PUSH2 0x538 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B4A JUMP JUMPDEST PUSH2 0x1991 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2EC SWAP3 SWAP2 SWAP1 PUSH2 0x31CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x557 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E16 JUMP JUMPDEST PUSH2 0x1A8B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x31F6 JUMP JUMPDEST PUSH2 0x1B38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x32B7 JUMP JUMPDEST PUSH2 0x1B65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x1CDC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x5E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x32F0 JUMP JUMPDEST PUSH2 0x1D41 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH2 0x61B CALLDATASIZE PUSH1 0x4 PUSH2 0x31F6 JUMP JUMPDEST PUSH2 0x1FF0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x62C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x63B CALLDATASIZE PUSH1 0x4 PUSH2 0x2CC5 JUMP JUMPDEST PUSH2 0x2189 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x64C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 CHAINID PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 ADD MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29E PUSH2 0x6C2 CALLDATASIZE PUSH1 0x4 PUSH2 0x333B JUMP JUMPDEST PUSH2 0x21F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E332E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH2 0x718 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x73A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x74F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x7A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH32 0xE90B7BCEB6E7DF5418FB78D8EE546E97C83A08BBCCC01A0644D599CCD2A7C2E0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SWAP4 SSTORE PUSH1 0x1 DUP4 MSTORE DUP4 SLOAD SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 PUSH2 0x88D DUP4 PUSH2 0x33AB JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x4 SLOAD EQ PUSH2 0x8E0 JUMPI PUSH2 0x8E0 DUP2 PUSH2 0x11D0 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x8EF DUP2 PUSH1 0x41 PUSH2 0x2446 JUMP JUMPDEST DUP3 MLOAD LT ISZERO PUSH2 0x93F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303230000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xE1C JUMPI PUSH1 0x41 DUP2 DUP2 MUL DUP10 ADD PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD SWAP2 SWAP1 SWAP3 ADD MLOAD PUSH1 0xFF AND SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP PUSH1 0x0 DUP5 SWAP1 SUB PUSH2 0xBAB JUMPI SWAP2 SWAP4 POP DUP4 SWAP2 PUSH2 0x98A DUP8 PUSH1 0x41 PUSH2 0x2446 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303231000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP8 MLOAD PUSH2 0x9E6 DUP4 PUSH1 0x20 PUSH2 0x2482 JUMP JUMPDEST GT ISZERO PUSH2 0xA34 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303232000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP10 ADD DUP2 ADD MLOAD DUP10 MLOAD SWAP1 SWAP2 PUSH2 0xA57 SWAP1 DUP4 SWAP1 PUSH2 0xA51 SWAP1 DUP8 SWAP1 PUSH2 0x2482 JUMP JUMPDEST SWAP1 PUSH2 0x2482 JUMP JUMPDEST GT ISZERO PUSH2 0xAA5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303233000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE DUP11 DUP6 ADD PUSH1 0x20 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0x20C13B0B SWAP1 PUSH2 0xAF4 SWAP1 DUP16 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x33E3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB35 SWAP2 SWAP1 PUSH2 0x3408 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND EQ PUSH2 0xBA4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303234000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST POP POP PUSH2 0xD6A JUMP JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1 SUB PUSH2 0xC45 JUMPI SWAP2 SWAP4 POP DUP4 SWAP2 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND EQ DUP1 PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP14 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD ISZERO ISZERO JUMPDEST PUSH2 0xC40 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303235000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0xD6A JUMP JUMPDEST PUSH1 0x1E DUP5 PUSH1 0xFF AND GT ISZERO PUSH2 0xD0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x4 DUP7 PUSH2 0xCAA SWAP2 SWAP1 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCF9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0xD6A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP13 SWAP1 MSTORE PUSH1 0xFF DUP7 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD5D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND GT DUP1 ISZERO PUSH2 0xDA4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0xDBA JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0xE06 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303236000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP5 SWAP6 POP DUP1 DUP1 PUSH2 0xE14 SWAP1 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x949 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND EQ DUP1 ISZERO SWAP1 PUSH2 0xE5D JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0xE5D JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0xEC5 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST PUSH2 0xF11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0xF1E DUP6 DUP6 DUP6 DUP6 GAS PUSH2 0x249E JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0xF56 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0x6895C13664AA4F67288B25D7A21D7AAA34916E355FB9B6FAE0A139A9085BECB8 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xF82 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0xACD2C8702804128FDB0DB2BB49F6D127DD0181C13FD45DBFE16DE0930E2BD375 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0xF9A DUP7 DUP7 DUP7 DUP7 PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP PUSH1 0x40 MLOAD PUSH1 0x20 RETURNDATASIZE ADD DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY DUP1 SWAP2 POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xFCF DUP4 PUSH1 0x20 PUSH2 0x346D JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFE7 JUMPI PUSH2 0xFE7 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1011 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x103E JUMPI DUP5 DUP2 ADD SLOAD PUSH1 0x20 DUP1 DUP4 MUL DUP5 ADD ADD MSTORE DUP1 PUSH2 0x1036 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1017 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x104E PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1070 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x10BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1124 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP5 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP5 DUP6 AND OR SWAP1 SWAP5 SSTORE SWAP6 SWAP1 SWAP6 MSTORE DUP3 SLOAD AND DUP5 OR SWAP1 SWAP2 SSTORE MLOAD SWAP2 DUP3 MSTORE PUSH32 0xECDF3A3EFFEA5783A3C4C2140E677577666428D44ED9D474A0B3A4C9943F8440 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x11D8 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 GT ISZERO PUSH2 0x122A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x127B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x610F7FF2B304AE8903C3DE74C60C6AB1F7D6226B3F52C5161905BB5AD4039C93 SWAP1 PUSH1 0x20 ADD PUSH2 0x11C5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x12CA DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 DUP15 PUSH1 0x5 SLOAD PUSH2 0x1FF0 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD SWAP2 SWAP3 POP PUSH1 0x0 PUSH2 0x12DC DUP4 PUSH2 0x33AB JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD KECCAK256 SWAP2 POP PUSH2 0x12F5 DUP3 DUP3 DUP7 PUSH2 0x1642 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1320 PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 SLOAD SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x13A6 JUMPI DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x75F0BB52 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 DUP16 CALLER PUSH1 0x40 MLOAD DUP14 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1373 SWAP13 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3514 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x13D2 PUSH2 0x13B5 DUP11 PUSH2 0x9C4 PUSH2 0x35F6 JUMP JUMPDEST PUSH1 0x3F PUSH2 0x13C2 DUP13 PUSH1 0x40 PUSH2 0x346D JUMP JUMPDEST PUSH2 0x13CC SWAP2 SWAP1 PUSH2 0x360E JUMP JUMPDEST SWAP1 PUSH2 0x24E5 JUMP JUMPDEST PUSH2 0x13DE SWAP1 PUSH2 0x1F4 PUSH2 0x35F6 JUMP JUMPDEST GAS LT ISZERO PUSH2 0x142D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303130000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH2 0x149E DUP16 DUP16 DUP16 DUP16 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP DUP15 DUP13 PUSH1 0x0 EQ PUSH2 0x148B JUMPI DUP15 PUSH2 0x249E JUMP JUMPDEST PUSH2 0x9C4 GAS PUSH2 0x1499 SWAP2 SWAP1 PUSH2 0x3649 JUMP JUMPDEST PUSH2 0x249E JUMP JUMPDEST SWAP4 POP PUSH2 0x14AB GAS DUP3 SWAP1 PUSH2 0x24FC JUMP JUMPDEST SWAP1 POP DUP4 DUP1 PUSH2 0x14B8 JUMPI POP DUP10 ISZERO ISZERO JUMPDEST DUP1 PUSH2 0x14C2 JUMPI POP DUP8 ISZERO ISZERO JUMPDEST PUSH2 0x150E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303133000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x0 DUP9 ISZERO PUSH2 0x1526 JUMPI PUSH2 0x1523 DUP3 DUP12 DUP12 DUP12 DUP12 PUSH2 0x2517 JUMP JUMPDEST SWAP1 POP JUMPDEST DUP5 ISZERO PUSH2 0x156A JUMPI PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE PUSH32 0x442E715F626346E8C54381002DA614F62BEE8D27386535B2521EC8540898556E SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x15A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE PUSH32 0x23428B18ACFB3EA64B08DC0C1D296EA9C09702C09083CA5272E64D115B687D23 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1631 JUMPI PUSH1 0x40 MLOAD PUSH32 0x9327136800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE DUP4 ISZERO ISZERO PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x93271368 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1618 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x162C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD DUP1 PUSH2 0x1692 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0x169E DUP5 DUP5 DUP5 DUP5 PUSH2 0x8E4 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x3 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16C3 JUMPI PUSH2 0x16C3 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x16EC JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH32 0xE90B7BCEB6E7DF5418FB78D8EE546E97C83A08BBCCC01A0644D599CCD2A7C2E0 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ PUSH2 0x178D JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x174D JUMPI PUSH2 0x174D PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x1785 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP3 POP POP PUSH2 0x1729 JUMP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL DUP1 PUSH1 0x0 MSTORE POP RETURNDATASIZE PUSH1 0x20 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x40 RETURNDATACOPY PUSH1 0x40 RETURNDATASIZE ADD PUSH1 0x0 REVERT JUMPDEST PUSH2 0x17F6 DUP11 DUP11 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP13 SWAP3 POP PUSH2 0x264D SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x182D JUMPI PUSH2 0x182D DUP5 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH2 0x186D DUP8 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2923 SWAP3 POP POP POP JUMP JUMPDEST DUP2 ISZERO PUSH2 0x1884 JUMPI PUSH2 0x1882 DUP3 PUSH1 0x0 PUSH1 0x1 DUP7 DUP6 PUSH2 0x2517 JUMP JUMPDEST POP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x141DF868A6331AF528E38C83B7AA03EDC19BE66E37AE67F9285BF4F8E3C6A1A8 DUP12 DUP12 DUP12 DUP12 DUP10 PUSH1 0x40 MLOAD PUSH2 0x18C5 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x368F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH2 0x1922 DUP8 DUP8 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP10 SWAP3 POP POP POP GAS PUSH2 0x249E JUMP JUMPDEST PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 GAS PUSH2 0x1938 SWAP1 DUP4 PUSH2 0x3649 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x194D SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH3 0x461BCD PUSH1 0xE5 SHL DUP3 MSTORE PUSH2 0x797 SWAP2 PUSH1 0x4 ADD PUSH2 0x2E03 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19AE JUMPI PUSH2 0x19AE PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x19D7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP5 POP SWAP2 AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1A1A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1A25 JUMPI POP DUP5 DUP3 LT JUMPDEST ISZERO PUSH2 0x1A7D JUMPI DUP1 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1A3D JUMPI PUSH2 0x1A3D PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x1A75 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP3 POP POP PUSH2 0x19F8 JUMP JUMPDEST SWAP1 DUP4 MSTORE SWAP2 SWAP5 SWAP2 SWAP4 POP SWAP1 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1AF0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303330000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 PUSH1 0x1 SWAP1 SSTORE MLOAD DUP4 SWAP2 PUSH32 0xF2A0EB156472D1440255B0D7C1E19CC07115D1051FE605B0DCE69ACFEC884D9C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B4D DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 DUP13 PUSH2 0x1FF0 JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1B6D PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1B8F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x1BDB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x1C47 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 DUP8 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD SWAP2 SWAP1 SWAP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xAAB4FA2B463F581B2B32CB3B7E3B704B9CE37CC209B5FB4D77E593ACE4054276 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0x1CE4 PUSH2 0x23F5 JUMP JUMPDEST PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0x1151116914515BC0891FF9047A6CB32CF902546F83066499BCF8BA33D2353FA2 SWAP1 PUSH1 0x20 ADD PUSH2 0x1CD0 JUMP JUMPDEST PUSH2 0x1D49 PUSH2 0x23F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1D6B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1D80 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x1DCC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E34 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1E56 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x1EA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x1F0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 DUP8 AND DUP1 DUP7 MSTORE DUP4 DUP7 KECCAK256 DUP1 SLOAD SWAP3 DUP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SSTORE SWAP7 DUP11 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD DUP3 AND SWAP1 SWAP8 OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH32 0xBB8310D486368DB6BD6F849402FDD73AD53D316B5A4B2644AD6EFE0F941286D8 PUSH1 0x0 SHL DUP14 DUP14 DUP14 DUP14 PUSH1 0x40 MLOAD PUSH2 0x202A SWAP3 SWAP2 SWAP1 PUSH2 0x36FB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x2050 SWAP5 SWAP4 SWAP3 SWAP2 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x20 ADD PUSH2 0x370B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP1 POP PUSH32 0x1900000000000000000000000000000000000000000000000000000000000000 PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 PUSH2 0x2124 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 CHAINID PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 ADD MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP4 DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x21 DUP4 ADD MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x62 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2191 PUSH2 0x23F5 JUMP JUMPDEST PUSH2 0x21B9 DUP2 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP2 MSTORE PUSH32 0x5AC6C46C93C8D0E53714BA3B53DB3E7C046DA994313D7ED0D192028BC7C228B0 SWAP1 PUSH1 0x20 ADD PUSH2 0x11C5 JUMP JUMPDEST PUSH2 0x21FA PUSH2 0x23F5 JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x3 SLOAD PUSH2 0x220A SWAP2 SWAP1 PUSH2 0x3649 JUMP JUMPDEST LT ISZERO PUSH2 0x2258 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x227A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x22C6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x2332 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP9 DUP7 AND DUP5 MSTORE SWAP2 DUP4 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE DUP3 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 PUSH2 0x239D DUP4 PUSH2 0x377B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x4 SLOAD EQ PUSH2 0x23F0 JUMPI PUSH2 0x23F0 DUP2 PUSH2 0x11D0 JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x2444 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x2458 JUMPI POP PUSH1 0x0 PUSH2 0xE5D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2464 DUP4 DUP6 PUSH2 0x346D JUMP JUMPDEST SWAP1 POP DUP3 PUSH2 0x2471 DUP6 DUP4 PUSH2 0x360E JUMP JUMPDEST EQ PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x248F DUP4 DUP6 PUSH2 0x35F6 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x24B4 JUMPI PUSH2 0x24B4 PUSH2 0x34AA JUMP JUMPDEST SUB PUSH2 0x24CC JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x24DC JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT ISZERO PUSH2 0x24F5 JUMPI DUP2 PUSH2 0x247B JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x250B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF82 DUP4 DUP6 PUSH2 0x3649 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO PUSH2 0x252F JUMPI DUP3 PUSH2 0x2531 JUMP JUMPDEST ORIGIN JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x25DC JUMPI PUSH2 0x2563 GASPRICE DUP7 LT PUSH2 0x2551 JUMPI GASPRICE PUSH2 0x2553 JUMP JUMPDEST DUP6 JUMPDEST PUSH2 0x255D DUP10 DUP10 PUSH2 0x2482 JUMP JUMPDEST SWAP1 PUSH2 0x2446 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP PUSH2 0x25D7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303131000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x25EA DUP6 PUSH2 0x255D DUP10 DUP10 PUSH2 0x2482 JUMP JUMPDEST SWAP2 POP PUSH2 0x25F7 DUP5 DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH2 0x2643 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303132000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD ISZERO PUSH2 0x269D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST DUP2 MLOAD DUP2 GT ISZERO PUSH2 0x26EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x273F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x28D8 JUMPI PUSH1 0x0 DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2761 JUMPI PUSH2 0x2761 PUSH2 0x3660 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO DUP1 ISZERO PUSH2 0x2798 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x27AD JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x27CB JUMPI POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST PUSH2 0x2817 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x287F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP3 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE DUP1 PUSH2 0x28D0 DUP2 PUSH2 0x33AB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2744 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD PUSH1 0x3 SSTORE PUSH1 0x4 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 SWAP1 MSTORE PUSH1 0x20 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x29A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 SWAP1 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xCC69885FDA6BCC1A4ACE058B4A62BF5E179EA78FD58A1CCD71C22CC9B688792F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH2 0x8E0 JUMPI PUSH2 0x2A19 DUP3 PUSH1 0x0 DUP4 PUSH1 0x1 GAS PUSH2 0x249E JUMP JUMPDEST PUSH2 0x8E0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303030000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x797 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 OR DUP2 MSTORE DUP3 MLOAD PUSH1 0x0 SWAP4 SWAP3 SWAP2 DUP5 SWAP2 SWAP1 DUP3 DUP10 PUSH2 0x2710 GAS SUB CALL RETURNDATASIZE DUP1 ISZERO PUSH2 0x2B05 JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0x2B0D JUMPI PUSH1 0x0 SWAP4 POP PUSH2 0x2B18 JUMP JUMPDEST DUP2 SWAP4 POP PUSH2 0x2B18 JUMP JUMPDEST PUSH1 0x0 MLOAD ISZERO DUP3 ISZERO OR ISZERO SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x2B37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x2B45 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2B5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2B68 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2BB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2BD1 JUMPI PUSH2 0x2BD1 PUSH2 0x2B76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x2C17 JUMPI PUSH2 0x2C17 PUSH2 0x2B76 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x2C30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2C66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2C85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C91 DUP9 DUP4 DUP10 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2CA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CB4 DUP8 DUP3 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2CD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x247B DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x2B45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2D07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2D12 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D41 DUP8 DUP3 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP3 POP POP PUSH2 0x2D50 PUSH1 0x60 DUP7 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2D81 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x2D65 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x2D93 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0xF82 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2DF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x247B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2E41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2E59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2E71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x140 DUP13 DUP15 SUB SLT ISZERO PUSH2 0x2E9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2EA3 DUP13 PUSH2 0x2B3A JUMP JUMPDEST SWAP11 POP PUSH1 0x20 DUP13 ADD CALLDATALOAD SWAP10 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP1 PUSH1 0x40 DUP15 ADD CALLDATALOAD GT ISZERO PUSH2 0x2EC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2ED6 DUP15 PUSH1 0x40 DUP16 ADD CALLDATALOAD DUP16 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH2 0x2EE7 PUSH1 0x60 DUP15 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP8 POP PUSH1 0x80 DUP14 ADD CALLDATALOAD SWAP7 POP PUSH1 0xA0 DUP14 ADD CALLDATALOAD SWAP6 POP PUSH1 0xC0 DUP14 ADD CALLDATALOAD SWAP5 POP PUSH2 0x2F0A PUSH1 0xE0 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP4 POP PUSH2 0x2F19 PUSH2 0x100 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP3 POP DUP1 PUSH2 0x120 DUP15 ADD CALLDATALOAD GT ISZERO PUSH2 0x2F2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F3F DUP14 PUSH2 0x120 DUP15 ADD CALLDATALOAD DUP15 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP1 SWAP4 SWAP7 SWAP10 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2F66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2F85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2F91 DUP8 DUP4 DUP9 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2FA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FB4 DUP7 DUP3 DUP8 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2FF7 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2FD2 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x247B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2FBE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3028 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3033 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x304F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x305B DUP6 DUP3 DUP7 ADD PUSH2 0x2BA5 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP12 DUP14 SUB SLT ISZERO PUSH2 0x3085 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP11 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x309D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP14 ADD SWAP2 POP DUP14 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x30B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x30C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP15 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x30D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD SWAP14 POP SWAP1 SWAP12 POP DUP14 ADD CALLDATALOAD SWAP10 POP PUSH2 0x30F0 PUSH1 0x40 DUP15 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP9 POP PUSH1 0x60 DUP14 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3113 DUP14 DUP3 DUP15 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH2 0x3126 SWAP1 POP PUSH1 0x80 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP4 POP PUSH2 0x3134 PUSH1 0xA0 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP12 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3149 PUSH1 0xE0 DUP13 ADD PUSH2 0x2B3A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP2 SWAP5 SWAP8 SWAP11 POP SWAP3 SWAP6 SWAP9 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x317D DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x31A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x31AC DUP9 DUP3 DUP10 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x31BF SWAP1 POP PUSH1 0x60 DUP8 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x31DE PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2FBE JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x140 DUP13 DUP15 SUB SLT ISZERO PUSH2 0x3218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP12 CALLDATALOAD PUSH2 0x3223 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP11 POP PUSH1 0x20 DUP13 ADD CALLDATALOAD SWAP10 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3246 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3252 DUP15 DUP3 DUP16 ADD PUSH2 0x2E2F JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH2 0x3265 SWAP1 POP PUSH1 0x60 DUP14 ADD PUSH2 0x2CE2 JUMP JUMPDEST SWAP7 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP6 POP PUSH1 0xA0 DUP13 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 DUP13 ADD CALLDATALOAD SWAP4 POP PUSH1 0xE0 DUP13 ADD CALLDATALOAD PUSH2 0x328A DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 DUP13 ADD CALLDATALOAD PUSH2 0x329B DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH2 0x120 DUP13 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP12 POP SWAP3 SWAP6 SWAP9 SWAP12 SWAP1 SWAP4 SWAP7 SWAP10 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x32CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x32D5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x32E5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3310 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x3320 DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x3330 DUP2 PUSH2 0x2B22 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x335B DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x336B DUP2 PUSH2 0x2B22 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x33DC JUMPI PUSH2 0x33DC PUSH2 0x337C JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x33F6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D5B JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x24DC DUP2 DUP6 PUSH2 0x2D5B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x341A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x247B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x3464 JUMPI PUSH2 0x3464 PUSH2 0x337C JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x34A5 JUMPI PUSH2 0x34A5 PUSH2 0x337C JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x3510 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP16 AND DUP4 MSTORE DUP14 PUSH1 0x20 DUP5 ADD MSTORE DUP1 PUSH1 0x40 DUP5 ADD MSTORE DUP12 DUP2 DUP5 ADD MSTORE POP PUSH2 0x180 DUP12 DUP14 DUP3 DUP6 ADD CALLDATACOPY PUSH1 0x0 DUP2 DUP14 DUP6 ADD ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP14 ADD AND DUP4 ADD PUSH2 0x357D PUSH1 0x60 DUP6 ADD DUP14 PUSH2 0x34D9 JUMP JUMPDEST DUP11 PUSH1 0x80 DUP6 ADD MSTORE DUP10 PUSH1 0xA0 DUP6 ADD MSTORE DUP9 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x35A4 PUSH1 0xE0 DUP6 ADD DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x100 DUP6 ADD MSTORE DUP2 DUP5 DUP3 SUB ADD PUSH2 0x120 DUP6 ADD MSTORE PUSH2 0x35CB DUP3 DUP3 ADD DUP8 PUSH2 0x2D5B JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x35E5 PUSH2 0x140 DUP4 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST SWAP14 SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x3609 JUMPI PUSH2 0x3609 PUSH2 0x337C JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3644 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x365B JUMPI PUSH2 0x365B PUSH2 0x337C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x0 DUP7 PUSH1 0xA0 DUP4 ADD DUP3 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0x36D2 JUMPI DUP3 CALLDATALOAD PUSH2 0x36B5 DUP2 PUSH2 0x2B22 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x36A2 JUMP JUMPDEST POP PUSH1 0x20 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 ADD SWAP1 POP DUP13 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3740 PUSH1 0x80 DUP5 ADD DUP12 PUSH2 0x34D9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD SWAP9 SWAP1 SWAP9 MSTORE PUSH1 0xC0 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0xE0 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP2 DUP6 AND PUSH2 0x100 DUP5 ADD MSTORE SWAP1 SWAP4 AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x378A JUMPI PUSH2 0x378A PUSH2 0x337C JUMP JUMPDEST POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE7 CALLDATASIZE 0xCA PUSH8 0x75BBC66381079738 0x49 KECCAK256 0xE0 DUP11 SWAP6 0xB7 PUSH5 0xAACFE5CF80 SLT 0xAC PUSH8 0x9FD7C3629564736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"722:19528:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;417:35:7;;442:9;160:25:111;;430:10:7;;417:35;;148:2:111;133:18;417:35:7;;;;;;;722:19528:0;;;;;;;;;;;-1:-1:-1;469:66:2;1467:11;;;1491:63;;1528:12;1491:63;1586:14;1583:1;1580;1567:34;1823:8;1819:2;1815:17;1799:14;1792:41;1981:1;1978;1973:2;1957:14;1953:23;1950:1;1947;1938:7;1931:5;1926:57;1911:72;;2017:16;2014:1;2011;1996:38;2057:7;2047:78;;2094:16;2091:1;2084:27;2047:78;;2148:16;2145:1;2138:27;2305:625:5;;;;;;;;;;-1:-1:-1;2305:625:5;;;;;:::i;:::-;;:::i;:::-;;11349:3812:0;;;;;;;;;;-1:-1:-1;11349:3812:0;;;;;:::i;:::-;;:::i;4861:151:4:-;;;;;;;;;;-1:-1:-1;4861:151:4;;;;;:::i;:::-;;:::i;:::-;;;2883:14:111;;2876:22;2858:41;;2846:2;2831:18;4861:151:4;;;;;;;;6048:138:5;;;;;;;;;;-1:-1:-1;6048:138:5;;;;;:::i;:::-;;:::i;17041:211:0:-;;;;;;;;;;-1:-1:-1;17208:9:0;17041:211;;;160:25:111;;;148:2;133:18;17041:211:0;14:177:111;2868:586:4;;;;;;;;;;-1:-1:-1;2868:586:4;;;;;:::i;:::-;;:::i;3805:959::-;;;;;;;;;;-1:-1:-1;3805:959:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;643:464:12:-;;;;;;;;;;-1:-1:-1;643:464:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2149:49:0:-;;;;;;;;;;-1:-1:-1;2149:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;1363:426:4;;;;;;;;;;-1:-1:-1;1363:426:4;;;;;:::i;:::-;;:::i;5589:360:5:-;;;;;;;;;;-1:-1:-1;5589:360:5;;;;;:::i;:::-;;:::i;5531:3628:0:-;;;;;;:::i;:::-;;:::i;2309:69::-;;;;;;;;;;-1:-1:-1;2309:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;10441:383;;;;;;;;;;-1:-1:-1;10441:383:0;;;;;:::i;:::-;;:::i;6268:437:5:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1978:20:0:-;;;;;;;;;;;;;;;;1740:486:12;;;;;;;;;;-1:-1:-1;1740:486:12;;;;;:::i;:::-;;:::i;3353:1151:0:-;;;;;;;;;;-1:-1:-1;3353:1151:0;;;;;:::i;:::-;;:::i;15970:533::-;;;;;;;;;;-1:-1:-1;15970:533:0;;;;;:::i;:::-;;:::i;5257:775:4:-;;;;;;;;;;-1:-1:-1;5257:775:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;16750:228:0:-;;;;;;;;;;-1:-1:-1;16750:228:0;;;;;:::i;:::-;;:::i;19770:478::-;;;;;;;;;;-1:-1:-1;19770:478:0;;;;;:::i;:::-;;:::i;2109:423:4:-;;;;;;;;;;-1:-1:-1;2109:423:4;;;;;:::i;:::-;;:::i;1150:254:3:-;;;;;;;;;;-1:-1:-1;1150:254:3;;;;;:::i;:::-;;:::i;4507:826:5:-;;;;;;;;;;-1:-1:-1;4507:826:5;;;;;:::i;:::-;;:::i;5955:87::-;;;;;;;;;;-1:-1:-1;6026:9:5;;5955:87;;18194:890:0;;;;;;;;;;-1:-1:-1;18194:890:0;;;;;:::i;:::-;;:::i;1052:161:2:-;;;;;;;;;;-1:-1:-1;1052:161:2;;;;;:::i;:::-;;:::i;17258:149:0:-;;;;;;;;;;;;17306:7;1208:66;17208:9;17342:57;;;;;;30378:25:111;;;;30419:18;;30412:34;17394:4:0;30462:18:111;;;30455:83;30351:18;;17342:57:0;;;;;;;;;;;;17332:68;;;;;;17325:75;;17258:149;;3371:727:5;;;;;;;;;;-1:-1:-1;3371:727:5;;;;;:::i;:::-;;:::i;1011:40:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2305:625:5;440:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;2481:19:5;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;;;;;;2504:24:5;::::1;520:3;2504:24;;2481:47;:73;;;;-1:-1:-1::0;;;;;;2532:22:5;::::1;2549:4;2532:22;;2481:73;2473:91;;;::::0;-1:-1:-1;;;2473:91:5;;14959:2:111;2473:91:5::1;::::0;::::1;14941:21:111::0;14998:1;14978:18;;;14971:29;15036:7;15016:18;;;15009:35;15061:18;;2473:91:5::1;;;;;;;;;-1:-1:-1::0;;;;;2622:13:5;;::::1;2647:1;2622:13:::0;;;:6:::1;:13;::::0;;;;;::::1;:27:::0;2614:45:::1;;;::::0;-1:-1:-1;;;2614:45:5;;15292:2:111;2614:45:5::1;::::0;::::1;15274:21:111::0;15331:1;15311:18;;;15304:29;15369:7;15349:18;;;15342:35;15394:18;;2614:45:5::1;15090:328:111::0;2614:45:5::1;2685:6;:23;::::0;;;;-1:-1:-1;;;;;2669:13:5;;::::1;2685:23;2669:13:::0;;;2685:23;2669:13;;:39;;2685:23;;;::::1;2669:39:::0;;;::::1;;::::0;;;-1:-1:-1;2718:23:5;;:31;;;;::::1;;::::0;;;2759:10:::1;:12:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;2786:17:5::1;::::0;-1:-1:-1;;;;;15976:55:111;;15958:74;;2786:17:5::1;::::0;15946:2:111;15931:18;2786:17:5::1;;;;;;;2884:10;2871:9;;:23;2867:56;;2896:27;2912:10;2896:15;:27::i;:::-;2305:625:::0;;:::o;11349:3812:0:-;11621:26;:18;11644:2;11621:22;:26::i;:::-;11600:10;:17;:47;;11592:65;;;;-1:-1:-1;;;11592:65:0;;16245:2:111;11592:65:0;;;16227:21:111;16284:1;16264:18;;;16257:29;16322:7;16302:18;;;16295:35;16347:18;;11592:65:0;16043:328:111;11592:65:0;11719:17;11759:20;11789:7;11806:9;11825;11844;11863:3292;11879:18;11875:1;:22;11863:3292;;;1073:4:10;1069:14;;;1107:40;;1141:4;1107:40;;1101:47;1206:4;1172:40;;1166:47;1507:40;;;;1501:47;1550:4;1497:58;;-1:-1:-1;1101:47:10;;-1:-1:-1;1166:47:10;-1:-1:-1;11982:1:0;11977:6;;;11973:3005;;12202:1;;-1:-1:-1;12202:1:0;;12607:26;:18;12630:2;12607:22;:26::i;:::-;12593:40;;;12585:58;;;;-1:-1:-1;;;12585:58:0;;16578:2:111;12585:58:0;;;16560:21:111;16617:1;16597:18;;;16590:29;16655:7;16635:18;;;16628:35;16680:18;;12585:58:0;16376:328:111;12585:58:0;12805:17;;12783:18;12791:1;12798:2;12783:14;:18::i;:::-;:39;;12775:57;;;;-1:-1:-1;;;12775:57:0;;16911:2:111;12775:57:0;;;16893:21:111;16950:1;16930:18;;;16923:29;16988:7;16968:18;;;16961:35;17013:18;;12775:57:0;16709:328:111;12775:57:0;13171:4;13151:18;;;13147:29;;13141:36;13268:17;;13141:36;;13220:44;;13141:36;;13220:18;;13151;;13220:14;:18::i;:::-;:22;;:44::i;:::-;:65;;13212:83;;;;-1:-1:-1;;;13212:83:0;;17244:2:111;13212:83:0;;;17226:21:111;17283:1;17263:18;;;17256:29;17321:7;17301:18;;;17294:35;17346:18;;13212:83:0;17042:328:111;13212:83:0;13724:75;;13803:19;13724:75;;;13656:18;;;13676:4;13652:29;;-1:-1:-1;;;;;13724:50:0;;;223:10:20;;13724:75:0;;13775:4;;13652:29;;13724:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:98;;;13716:116;;;;-1:-1:-1;;;13716:116:0;;18300:2:111;13716:116:0;;;18282:21:111;18339:1;18319:18;;;18312:29;18377:7;18357:18;;;18350:35;18402:18;;13716:116:0;18098:328:111;13716:116:0;11985:1862;;11973:3005;;;13857:1;:6;;13862:1;13857:6;13853:1125;;14074:1;;-1:-1:-1;14074:1:0;;14249:10;-1:-1:-1;;;;;14249:26:0;;;;:73;;-1:-1:-1;;;;;;14279:28:0;;;;;;:14;:28;;;;;;;;:38;;;;;;;;;:43;;14249:73;14241:91;;;;-1:-1:-1;;;14241:91:0;;18633:2:111;14241:91:0;;;18615:21:111;18672:1;18652:18;;;18645:29;18710:7;18690:18;;;18683:35;18735:18;;14241:91:0;18431:328:111;14241:91:0;13853:1125;;;14361:2;14357:1;:6;;;14353:625;;;14654:62;;19006:66:111;14654:62:0;;;18994:79:111;19089:12;;;19082:28;;;14634:97:0;;19126:12:111;;14654:62:0;;;;;;;;;;;;14644:73;;;;;;14723:1;14719;:5;;;;:::i;:::-;14634:97;;;;;;;;;;;;19576:25:111;;;;19649:4;19637:17;;;19617:18;;;19610:45;19671:18;;;19664:34;;;19714:18;;;19707:34;;;19548:19;;14634:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14619:112;;14353:625;;;14935:28;;;;;;;;;;;;19576:25:111;;;19649:4;19637:17;;19617:18;;;19610:45;;;;19671:18;;;19664:34;;;19714:18;;;19707:34;;;14935:28:0;;19548:19:111;;14935:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14920:43;;14353:625;15014:9;-1:-1:-1;;;;;14999:24:0;:12;-1:-1:-1;;;;;14999:24:0;;:62;;;;-1:-1:-1;;;;;;15027:20:0;;;15059:1;15027:20;;;:6;:20;;;;;;;:34;;14999:62;:97;;;;-1:-1:-1;;;;;;15065:31:0;;520:3:5;15065:31:0;;14999:97;14991:115;;;;-1:-1:-1;;;14991:115:0;;19954:2:111;14991:115:0;;;19936:21:111;19993:1;19973:18;;;19966:29;20031:7;20011:18;;;20004:35;20056:18;;14991:115:0;19752:328:111;14991:115:0;15132:12;15120:24;;11899:3;;;;;:::i;:::-;;;;11863:3292;;;11515:3646;;;;;;11349:3812;;;;:::o;4861:151:4:-;4923:4;692:3;-1:-1:-1;;;;;4946:26:4;;;;;;:59;;-1:-1:-1;;;;;;4976:15:4;;;5003:1;4976:15;;;:7;:15;;;;;;;:29;;4946:59;4939:66;4861:151;-1:-1:-1;;4861:151:4:o;6048:138:5:-;6101:4;-1:-1:-1;;;;;6124:24:5;;520:3;6124:24;;;;:55;;-1:-1:-1;;;;;;;6152:13:5;;;6177:1;6152:13;;;:6;:13;;;;;;;:27;;;6048:138::o;2868:586:4:-;3037:12;3118:10;692:3;3118:30;;;;:67;;-1:-1:-1;3160:10:4;3183:1;3152:19;;;:7;:19;;;;;;-1:-1:-1;;;;;3152:19:4;:33;;3118:67;3110:85;;;;-1:-1:-1;;;3110:85:4;;20287:2:111;3110:85:4;;;20269:21:111;20326:1;20306:18;;;20299:29;20364:7;20344:18;;;20337:35;20389:18;;3110:85:4;20085:328:111;3110:85:4;3277:46;3285:2;3289:5;3296:4;3302:9;3313;3277:7;:46::i;:::-;3267:56;;3337:7;3333:114;;;3351:38;;3378:10;;3351:38;;;;;3333:114;;;3409:38;;3436:10;;3409:38;;;;;3333:114;2868:586;;;;;;:::o;3805:959::-;3976:12;3990:23;4035:53;4061:2;4065:5;4072:4;4078:9;4035:25;:53::i;:::-;4025:63;;4235:4;4229:11;4477:4;4459:16;4455:27;4450:3;4446:37;4440:4;4433:51;4539:16;4534:3;4527:29;4633:16;4630:1;4623:4;4618:3;4614:14;4599:51;4745:3;4731:17;;;3805:959;;;;;;;:::o;643:464:12:-;718:12;742:19;774:11;:6;783:2;774:11;:::i;:::-;764:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:22:12;;742:44;;801:13;796:282;828:6;820:5;:14;796:282;;;964:18;;;958:25;1041:4;1030:16;;;1007:40;;;1000:54;976:5;836:7;976:5;836:7;:::i;:::-;;;;796:282;;;-1:-1:-1;1094:6:12;643:464;-1:-1:-1;;;643:464:12:o;1363:426:4:-;440:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;1491:20:4;::::1;::::0;;::::1;::::0;:50:::1;;-1:-1:-1::0;;;;;;1515:26:4;::::1;692:3;1515:26;;1491:50;1483:68;;;::::0;-1:-1:-1;;;1483:68:4;;20853:2:111;1483:68:4::1;::::0;::::1;20835:21:111::0;20892:1;20872:18;;;20865:29;20930:7;20910:18;;;20903:35;20955:18;;1483:68:4::1;20651:328:111::0;1483:68:4::1;-1:-1:-1::0;;;;;1610:15:4;;::::1;1637:1;1610:15:::0;;;:7:::1;:15;::::0;;;;;::::1;:29:::0;1602:47:::1;;;::::0;-1:-1:-1;;;1602:47:4;;21186:2:111;1602:47:4::1;::::0;::::1;21168:21:111::0;21225:1;21205:18;;;21198:29;21263:7;21243:18;;;21236:35;21288:18;;1602:47:4::1;20984:328:111::0;1602:47:4::1;1677:7;:25;::::0;;;;;;-1:-1:-1;;;;;1659:15:4;;::::1;1677:25;1659:15:::0;;;1677:25;1659:15;;;:43;;1677:25;;;::::1;1659:43:::0;;;::::1;;::::0;;;1712:25;;;;:34;;::::1;::::0;::::1;::::0;;;1761:21;15958:74:111;;;1761:21:4::1;::::0;15931:18:111;1761:21:4::1;;;;;;;;1363:426:::0;:::o;5589:360:5:-;440:17:9;:15;:17::i;:::-;5753:10:5::1;;5739;:24;;5731:42;;;::::0;-1:-1:-1;;;5731:42:5;;21519:2:111;5731:42:5::1;::::0;::::1;21501:21:111::0;21558:1;21538:18;;;21531:29;21596:7;21576:18;;;21569:35;21621:18;;5731:42:5::1;21317:328:111::0;5731:42:5::1;5857:1;5843:10;:15;;5835:33;;;::::0;-1:-1:-1;;;5835:33:5;;21852:2:111;5835:33:5::1;::::0;::::1;21834:21:111::0;21891:1;21871:18;;;21864:29;21929:7;21909:18;;;21902:35;21954:18;;5835:33:5::1;21650:328:111::0;5835:33:5::1;5878:9;:22:::0;;;5915:27:::1;::::0;160:25:111;;;5915:27:5::1;::::0;148:2:111;133:18;5915:27:5::1;14:177:111::0;5531:3628:0;5877:12;5901:14;6028:23;6070:444;6153:2;6177:5;6204:4;;6230:9;6261;6328:7;6357:8;6387;6417:14;6491:5;;6070:21;:444::i;:::-;6583:5;:7;;6028:486;;-1:-1:-1;6583:5:0;:7;;;:::i;:::-;;;;-1:-1:-1;;6613:21:0;;;;;;;-1:-1:-1;6648:47:0;6613:21;6623:10;6684;6648:15;:47::i;:::-;6014:692;6715:13;6731:10;915:66:3;1609:11;;1410:226;6731:10:0;6715:26;-1:-1:-1;;;;;;6769:19:0;;;6765:547;;6814:5;-1:-1:-1;;;;;6808:29:0;;6899:2;6923:5;6950:4;;6976:9;7007;7074:7;7103:8;7133;7163:14;7237:10;7269;6808:489;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6765:547;7626:45;7654:16;:9;7666:4;7654:16;:::i;:::-;7646:2;7628:14;:9;7640:2;7628:14;:::i;:::-;7627:21;;;;:::i;:::-;7626:27;;:45::i;:::-;:51;;7674:3;7626:51;:::i;:::-;7613:9;:64;;7605:82;;;;-1:-1:-1;;;7605:82:0;;24520:2:111;7605:82:0;;;24502:21:111;24559:1;24539:18;;;24532:29;24597:7;24577:18;;;24570:35;24622:18;;7605:82:0;24318:328:111;7605:82:0;7800:15;7818:9;7800:27;;8106:83;8114:2;8118:5;8125:4;;8106:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8131:9;8142:8;8154:1;8142:13;:46;;8179:9;8106:7;:83::i;8142:46::-;8171:4;8159:9;:16;;;;:::i;:::-;8106:7;:83::i;:::-;8096:93;;8213:22;8225:9;8213:7;;:11;:22::i;:::-;8203:32;;8519:7;:25;;;-1:-1:-1;8530:14:0;;;8519:25;:42;;;-1:-1:-1;8548:13:0;;;8519:42;8511:60;;;;-1:-1:-1;;;8511:60:0;;24983:2:111;8511:60:0;;;24965:21:111;25022:1;25002:18;;;24995:29;25060:7;25040:18;;;25033:35;25085:18;;8511:60:0;24781:328:111;8511:60:0;8720:15;8757:12;;8753:128;;8799:67;8813:7;8822;8831:8;8841;8851:14;8799:13;:67::i;:::-;8789:77;;8753:128;8898:7;8894:108;;;8912:33;;;25288:25:111;;;25344:2;25329:18;;25322:34;;;8912:33:0;;25261:18:111;8912:33:0;;;;;;;8894:108;;;8969:33;;;25288:25:111;;;25344:2;25329:18;;25322:34;;;8969:33:0;;25261:18:111;8969:33:0;;;;;;;8894:108;-1:-1:-1;;;;;;;9040:19:0;;;9036:107;;9079:49;;;;;;;;25535:25:111;;;25603:14;;25596:22;25576:18;;;25569:50;-1:-1:-1;;;;;9079:32:0;;;;;25508:18:111;;9079:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9036:107;5891:3268;;5531:3628;;;;;;;;;;;;;:::o;10441:383::-;10659:9;;10727:14;10719:32;;;;-1:-1:-1;;;10719:32:0;;25832:2:111;10719:32:0;;;25814:21:111;25871:1;25851:18;;;25844:29;25909:7;25889:18;;;25882:35;25934:18;;10719:32:0;25630:328:111;10719:32:0;10761:56;10778:8;10788:4;10794:10;10806;10761:16;:56::i;:::-;10570:254;10441:383;;;:::o;6268:437:5:-;6310:16;6338:22;6377:10;;6363:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6363:25:5;-1:-1:-1;520:3:5;6432:13;6482:23;;;:6;:23;;;;6338:50;;-1:-1:-1;6432:13:5;-1:-1:-1;;;;;6482:23:5;6515:162;-1:-1:-1;;;;;6522:31:5;;520:3;6522:31;6515:162;;6584:12;6569:5;6575;6569:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6569:27:5;;;:12;;;;;;;;;;:27;;;;6625:20;;;;;;;:6;:20;;;;;;;;;6659:7;;;;:::i;:::-;;;;6515:162;;;-1:-1:-1;6693:5:5;;6268:437;-1:-1:-1;;6268:437:5:o;1740:486:12:-;2025:1;2022;2004:15;1998:22;1991:4;1974:15;1970:26;1954:14;1947:5;1934:93;2054:7;2048:4;2041:21;;2088:16;2082:4;2075:30;2142:16;2139:1;2133:4;2118:41;2204:4;2186:16;2182:27;2179:1;2172:38;3353:1151:0;3752:32;3764:7;;3752:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3773:10:0;;-1:-1:-1;3752:11:0;;-1:-1:-1;;3752:32:0:i;:::-;-1:-1:-1;;;;;3798:29:0;;;3794:78;;3829:43;3856:15;469:66:2;747:21;542:242;3829:43:0;4007:22;4020:2;4024:4;;4007:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4007:12:0;;-1:-1:-1;;;4007:22:0:i;:::-;4044:11;;4040:380;;4350:59;4364:7;4373:1;4376;4379:12;4393:15;4350:13;:59::i;:::-;;4040:380;4444:10;-1:-1:-1;;;;;4434:63:0;;4456:7;;4465:10;4477:2;4481:15;4434:63;;;;;;;;;;:::i;:::-;;;;;;;;3353:1151;;;;;;;;;;:::o;15970:533::-;16123:7;16142:16;16161:9;16142:28;;16275:46;16283:2;16287:5;16294:4;;16275:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16300:9:0;;-1:-1:-1;;;16311:9:0;16275:7;:46::i;:::-;16267:55;;;;;;16332:19;16365:9;16354:20;;:8;:20;:::i;:::-;16332:42;;16482:11;16465:29;;;;;;27317:19:111;;27361:2;27352:12;;27188:182;16465:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;16451:45:0;;;;;;;:::i;5257:775:4:-;5342:22;5366:12;5453:8;5439:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5439:23:4;-1:-1:-1;;;;;;5563:14:4;;;5506:19;5563:14;;;:7;:14;;;;;;5431:31;;-1:-1:-1;5506:19:4;5563:14;5587:239;-1:-1:-1;;;;;5594:29:4;;;;;;:66;;-1:-1:-1;;;;;;5627:33:4;;692:3;5627:33;;5594:66;:92;;;;;5678:8;5664:11;:22;5594:92;5587:239;;;5723:13;5702:5;5708:11;5702:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5702:34:4;;;:18;;;;;;;;;;:34;;;;5766:22;;;;;;;:7;:22;;;;;;;;;5802:13;;;;:::i;:::-;;;;5587:239;;;5990:26;;;5997:5;;5842:13;;-1:-1:-1;5257:775:4;;-1:-1:-1;;5257:775:4:o;16750:228:0:-;16828:10;16851:1;16821:18;;;:6;:18;;;;;;-1:-1:-1;;;;;16821:18:0;16813:50;;;;-1:-1:-1;;;16813:50:0;;27577:2:111;16813:50:0;;;27559:21:111;27616:1;27596:18;;;27589:29;27654:7;27634:18;;;27627:35;27679:18;;16813:50:0;27375:328:111;16813:50:0;16888:10;16873:26;;;;:14;:26;;;;;;;;:41;;;;;;;;;16917:1;16873:45;;16933:38;16900:13;;16933:38;;;16750:228;:::o;19770:478::-;20091:7;20127:113;20149:2;20153:5;20160:4;;20166:9;20177;20188:7;20197:8;20207;20217:14;20233:6;20127:21;:113::i;:::-;20117:124;;;;;;20110:131;;19770:478;;;;;;;;;;;;;:::o;2109:423:4:-;440:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;2286:20:4;::::1;::::0;;::::1;::::0;:50:::1;;-1:-1:-1::0;;;;;;2310:26:4;::::1;692:3;2310:26;;2286:50;2278:68;;;::::0;-1:-1:-1;;;2278:68:4;;20853:2:111;2278:68:4::1;::::0;::::1;20835:21:111::0;20892:1;20872:18;;;20865:29;20930:7;20910:18;;;20903:35;20955:18;;2278:68:4::1;20651:328:111::0;2278:68:4::1;-1:-1:-1::0;;;;;2364:19:4;;::::1;;::::0;;;:7:::1;:19;::::0;;;;;;::::1;:29:::0;;::::1;;2356:47;;;::::0;-1:-1:-1;;;2356:47:4;;27910:2:111;2356:47:4::1;::::0;::::1;27892:21:111::0;27949:1;27929:18;;;27922:29;27987:7;27967:18;;;27960:35;28012:18;;2356:47:4::1;27708:328:111::0;2356:47:4::1;-1:-1:-1::0;;;;;2435:15:4;;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;;2413:19;;::::1;::::0;;;;;:37;;2435:15;;;::::1;2413:37:::0;;;::::1;;::::0;;;2460:15;;;;:28;;;;::::1;::::0;;;2503:22;;15958:74:111;;;2503:22:4::1;::::0;15931:18:111;2503:22:4::1;;;;;;;;2109:423:::0;;:::o;1150:254:3:-;440:17:9;:15;:17::i;:::-;915:66:3::1;1335:19:::0;;;1378::::1;::::0;-1:-1:-1;;;;;15976:55:111;;15958:74;;1378:19:3::1;::::0;15946:2:111;15931:18;1378:19:3::1;15812:226:111::0;4507:826:5;440:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;4721:22:5;::::1;::::0;;::::1;::::0;:53:::1;;-1:-1:-1::0;;;;;;4747:27:5;::::1;520:3;4747:27;;4721:53;:82;;;;-1:-1:-1::0;;;;;;4778:25:5;::::1;4798:4;4778:25;;4721:82;4713:100;;;::::0;-1:-1:-1;;;4713:100:5;;14959:2:111;4713:100:5::1;::::0;::::1;14941:21:111::0;14998:1;14978:18;;;14971:29;15036:7;15016:18;;;15009:35;15061:18;;4713:100:5::1;14757:328:111::0;4713:100:5::1;-1:-1:-1::0;;;;;4871:16:5;;::::1;4899:1;4871:16:::0;;;:6:::1;:16;::::0;;;;;::::1;:30:::0;4863:48:::1;;;::::0;-1:-1:-1;;;4863:48:5;;15292:2:111;4863:48:5::1;::::0;::::1;15274:21:111::0;15331:1;15311:18;;;15304:29;15369:7;15349:18;;;15342:35;15394:18;;4863:48:5::1;15090:328:111::0;4863:48:5::1;-1:-1:-1::0;;;;;5012:22:5;::::1;::::0;;::::1;::::0;:53:::1;;-1:-1:-1::0;;;;;;5038:27:5;::::1;520:3;5038:27;;5012:53;5004:71;;;::::0;-1:-1:-1;;;5004:71:5;;14959:2:111;5004:71:5::1;::::0;::::1;14941:21:111::0;14998:1;14978:18;;;14971:29;15036:7;15016:18;;;15009:35;15061:18;;5004:71:5::1;14757:328:111::0;5004:71:5::1;-1:-1:-1::0;;;;;5093:17:5;;::::1;;::::0;;;:6:::1;:17;::::0;;;;;;::::1;:29:::0;;::::1;;5085:47;;;::::0;-1:-1:-1;;;5085:47:5;;28243:2:111;5085:47:5::1;::::0;::::1;28225:21:111::0;28282:1;28262:18;;;28255:29;28320:7;28300:18;;;28293:35;28345:18;;5085:47:5::1;28041:328:111::0;5085:47:5::1;-1:-1:-1::0;;;;;5161:16:5;;::::1;;::::0;;;:6:::1;:16;::::0;;;;;;;;;5142;;::::1;::::0;;;;;;:35;;5161:16;;::::1;5142:35:::0;;;::::1;;::::0;;5187:17;;::::1;::::0;;;;;:28;;;::::1;::::0;;::::1;::::0;;;5225:16;;;;:29;;;;::::1;::::0;;;5269:22;;15958:74:111;;;5269:22:5::1;::::0;15931:18:111;5269:22:5::1;;;;;;;5306:20;::::0;-1:-1:-1;;;;;15976:55:111;;15958:74;;5306:20:5::1;::::0;15946:2:111;15931:18;5306:20:5::1;;;;;;;4507:826:::0;;;:::o;18194:890:0:-;18518:12;18542:18;1531:66;18634:16;;18672:2;18696:5;18733:4;;18723:15;;;;;;;:::i;:::-;;;;;;;;;18602:369;;;;;18760:9;;18791;;18822:7;;18851:8;;18881;;18911:14;;18947:6;;18602:369;;;:::i;:::-;;;;;;;;;;;;;;18575:410;;18602:369;18575:410;;;;;-1:-1:-1;19019:12:0;19033;19047:17;17306:7;1208:66;17208:9;17342:57;;;;;;30378:25:111;;;;30419:18;;30412:34;17394:4:0;30462:18:111;;;30455:83;30351:18;;17342:57:0;;;;;;;;;;;;17332:68;;;;;;17325:75;;17258:149;;19047:17;19002:75;;29890:66:111;29977:15;;;19002:75:0;;;29965:28:111;30022:15;;;;30009:11;;;30002:36;30054:11;;;30047:27;30090:12;;;30083:28;;;30127:12;;19002:75:0;;;;;;;;;;;;18995:82;;;18194:890;;;;;;;;;;;;;:::o;1052:161:2:-;440:17:9;:15;:17::i;:::-;1125:35:2::1;1152:7;469:66:::0;747:21;542:242;1125:35:::1;1175:31;::::0;-1:-1:-1;;;;;15976:55:111;;15958:74;;1175:31:2::1;::::0;15946:2:111;15931:18;1175:31:2::1;15812:226:111::0;3371:727:5;440:17:9;:15;:17::i;:::-;3607:10:5::1;3602:1;3589:10;;:14;;;;:::i;:::-;:28;;3581:46;;;::::0;-1:-1:-1;;;3581:46:5;;21519:2:111;3581:46:5::1;::::0;::::1;21501:21:111::0;21558:1;21538:18;;;21531:29;21596:7;21576:18;;;21569:35;21621:18;;3581:46:5::1;21317:328:111::0;3581:46:5::1;-1:-1:-1::0;;;;;3725:19:5;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;;;;;;3748:24:5;::::1;520:3;3748:24;;3725:47;3717:65;;;::::0;-1:-1:-1;;;3717:65:5;;14959:2:111;3717:65:5::1;::::0;::::1;14941:21:111::0;14998:1;14978:18;;;14971:29;15036:7;15016:18;;;15009:35;15061:18;;3717:65:5::1;14757:328:111::0;3717:65:5::1;-1:-1:-1::0;;;;;3800:17:5;;::::1;;::::0;;;:6:::1;:17;::::0;;;;;;::::1;:26:::0;;::::1;;3792:44;;;::::0;-1:-1:-1;;;3792:44:5;;28243:2:111;3792:44:5::1;::::0;::::1;28225:21:111::0;28282:1;28262:18;;;28255:29;28320:7;28300:18;;;28293:35;28345:18;;3792:44:5::1;28041:328:111::0;3792:44:5::1;-1:-1:-1::0;;;;;3866:13:5;;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;3846:17;;::::1;::::0;;;;;:33;;3866:13;;;::::1;3846:33:::0;;;::::1;;::::0;;;3889:13;;;:26;;;;::::1;::::0;;;3925:10:::1;:12:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;3952:19:5::1;::::0;-1:-1:-1;;;;;15976:55:111;;15958:74;;3952:19:5::1;::::0;15946:2:111;15931:18;3952:19:5::1;;;;;;;4052:10;4039:9;;:23;4035:56;;4064:27;4080:10;4064:15;:27::i;:::-;3371:727:::0;;;:::o;231:102:9:-;289:10;311:4;289:27;281:45;;;;-1:-1:-1;;;281:45:9;;30952:2:111;281:45:9;;;30934:21:111;30991:1;30971:18;;;30964:29;31029:7;31009:18;;;31002:35;31054:18;;281:45:9;30750:328:111;281:45:9;231:102::o;392:421:14:-;450:7;690:1;695;690:6;686:45;;-1:-1:-1;719:1:14;712:8;;686:45;741:9;753:5;757:1;753;:5;:::i;:::-;741:17;-1:-1:-1;785:1:14;776:5;780:1;741:17;776:5;:::i;:::-;:10;768:19;;;;;;805:1;392:421;-1:-1:-1;;;392:421:14:o;1154:145::-;1212:7;;1243:5;1247:1;1243;:5;:::i;:::-;1231:17;;1271:1;1266;:6;;1258:15;;;;;242:639:1;410:12;451:27;438:9;:40;;;;;;;;:::i;:::-;;434:441;;649:1;646;639:4;633:11;626:4;620;616:15;612:2;605:5;592:59;581:70;;434:441;;;849:1;846;839:4;833:11;826:4;820;816:15;809:5;805:2;798:5;793:58;782:69;;434:441;242:639;;;;;;;:::o;1369:105:14:-;1427:7;1458:1;1453;:6;;:14;;1466:1;1453:14;;;-1:-1:-1;1462:1:14;;1446:21;-1:-1:-1;1369:105:14:o;936:145::-;994:7;1026:1;1021;:6;;1013:15;;;;;;1038:9;1050:5;1054:1;1050;:5;:::i;9165:821:0:-;9353:15;;-1:-1:-1;;;;;9460:28:0;;;:66;;9512:14;9460:66;;;9499:9;9460:66;9433:93;-1:-1:-1;;;;;;9540:22:0;;9536:444;;9693:73;9729:11;9718:8;:22;:47;;9754:11;9718:47;;;9743:8;9718:47;9693:20;:7;9705;9693:11;:20::i;:::-;:24;;:73::i;:::-;9788:22;;9683:83;;-1:-1:-1;;;;;;9788:13:0;;;:22;;;;;9683:83;;9788:22;;;;9683:83;9788:13;:22;;;;;;;9780:40;;;;-1:-1:-1;;;9780:40:0;;31285:2:111;9780:40:0;;;31267:21:111;31324:1;31304:18;;;31297:29;31362:7;31342:18;;;31335:35;31387:18;;9780:40:0;31083:328:111;9780:40:0;9536:444;;;9861:34;9886:8;9861:20;:7;9873;9861:11;:20::i;:34::-;9851:44;;9917:42;9931:8;9941;9951:7;9917:13;:42::i;:::-;9909:60;;;;-1:-1:-1;;;9909:60:0;;31618:2:111;9909:60:0;;;31600:21:111;31657:1;31637:18;;;31630:29;31695:7;31675:18;;;31668:35;31720:18;;9909:60:0;31416:328:111;9909:60:0;9370:616;9165:821;;;;;;;:::o;835:1136:5:-;1053:9;;:14;1045:32;;;;-1:-1:-1;;;1045:32:5;;31951:2:111;1045:32:5;;;31933:21:111;31990:1;31970:18;;;31963:29;32028:7;32008:18;;;32001:35;32053:18;;1045:32:5;31749:328:111;1045:32:5;1184:7;:14;1170:10;:28;;1162:46;;;;-1:-1:-1;;;1162:46:5;;21519:2:111;1162:46:5;;;21501:21:111;21558:1;21538:18;;;21531:29;21596:7;21576:18;;;21569:35;21621:18;;1162:46:5;21317:328:111;1162:46:5;1292:1;1278:10;:15;;1270:33;;;;-1:-1:-1;;;1270:33:5;;21852:2:111;1270:33:5;;;21834:21:111;21891:1;21871:18;;;21864:29;21929:7;21909:18;;;21902:35;21954:18;;1270:33:5;21650:328:111;1270:33:5;520:3;1350:20;1398:450;1422:7;:14;1418:1;:18;1398:450;;;1502:13;1518:7;1526:1;1518:10;;;;;;;;:::i;:::-;;;;;;;1502:26;;1567:1;-1:-1:-1;;;;;1550:19:5;:5;-1:-1:-1;;;;;1550:19:5;;;:47;;;;-1:-1:-1;;;;;;1573:24:5;;520:3;1573:24;;1550:47;:73;;;;-1:-1:-1;;;;;;1601:22:5;;1618:4;1601:22;;1550:73;:98;;;;;1643:5;-1:-1:-1;;;;;1627:21:5;:12;-1:-1:-1;;;;;1627:21:5;;;1550:98;1542:116;;;;-1:-1:-1;;;1542:116:5;;14959:2:111;1542:116:5;;;14941:21:111;14998:1;14978:18;;;14971:29;15036:7;15016:18;;;15009:35;15061:18;;1542:116:5;14757:328:111;1542:116:5;-1:-1:-1;;;;;1724:13:5;;;1749:1;1724:13;;;:6;:13;;;;;;;:27;1716:45;;;;-1:-1:-1;;;1716:45:5;;15292:2:111;1716:45:5;;;15274:21:111;15331:1;15311:18;;;15304:29;15369:7;15349:18;;;15342:35;15394:18;;1716:45:5;15090:328:111;1716:45:5;-1:-1:-1;;;;;1775:20:5;;;;;;;:6;:20;;;;;:28;;;;;;;;;;;;;;1438:3;;;;:::i;:::-;;;;1398:450;;;-1:-1:-1;;;;;;1857:20:5;;;;;:6;:20;;;;;:38;;;;520:3;1857:38;;;1918:14;;1905:10;:27;1942:9;:22;835:1136::o;754:384:4:-;834:7;871:1;834:25;;;;;;;-1:-1:-1;;;;;834:25:4;:39;826:57;;;;-1:-1:-1;;;826:57:4;;32284:2:111;826:57:4;;;32266:21:111;32323:1;32303:18;;;32296:29;32361:7;32341:18;;;32334:35;32386:18;;826:57:4;32082:328:111;826:57:4;692:3;893:25;;;;;;;;;:44;;;;;;;;;-1:-1:-1;;;;;951:16:4;;;947:184;;1061:60;1069:2;1073:1;1076:4;1082:27;1111:9;1061:7;:60::i;:::-;1053:78;;;;-1:-1:-1;;;1053:78:4;;32617:2:111;1053:78:4;;;32599:21:111;32656:1;32636:18;;;32629:29;32694:7;32674:18;;;32667:35;32719:18;;1053:78:4;32415:328:111;478:970:8;707:52;;;-1:-1:-1;;;;;32940:55:111;;707:52:8;;;32922:74:111;33012:18;;;;33005:34;;;707:52:8;;;;;;;;;;32895:18:111;;;;707:52:8;;;;;;;;;;;;;;;1081:11;;-1:-1:-1;;707:52:8;;-1:-1:-1;;1081:11:8;-1:-1:-1;1054:5:8;1046;1039;1035:17;1030:72;1122:16;1155:69;;;;1246:4;1241:110;;;;1413:1;1398:16;;1115:317;;1155:69;1199:7;1184:22;;1155:69;;1241:110;1328:1;1322:8;1315:16;1305:7;1298:15;1295:37;1288:45;1273:60;;1115:317;;;834:608;478:970;;;;;:::o;196:154:111:-;-1:-1:-1;;;;;275:5:111;271:54;264:5;261:65;251:93;;340:1;337;330:12;251:93;196:154;:::o;355:134::-;423:20;;452:31;423:20;452:31;:::i;:::-;355:134;;;:::o;494:315::-;562:6;570;623:2;611:9;602:7;598:23;594:32;591:52;;;639:1;636;629:12;591:52;678:9;665:23;697:31;722:5;697:31;:::i;:::-;747:5;799:2;784:18;;;;771:32;;-1:-1:-1;;;494:315:111:o;814:184::-;866:77;863:1;856:88;963:4;960:1;953:15;987:4;984:1;977:15;1003:777;1045:5;1098:3;1091:4;1083:6;1079:17;1075:27;1065:55;;1116:1;1113;1106:12;1065:55;1152:6;1139:20;1178:18;1215:2;1211;1208:10;1205:36;;;1221:18;;:::i;:::-;1355:2;1349:9;1417:4;1409:13;;1260:66;1405:22;;;1429:2;1401:31;1397:40;1385:53;;;1453:18;;;1473:22;;;1450:46;1447:72;;;1499:18;;:::i;:::-;1539:10;1535:2;1528:22;1574:2;1566:6;1559:18;1620:3;1613:4;1608:2;1600:6;1596:15;1592:26;1589:35;1586:55;;;1637:1;1634;1627:12;1586:55;1701:2;1694:4;1686:6;1682:17;1675:4;1667:6;1663:17;1650:54;1748:1;1741:4;1736:2;1728:6;1724:15;1720:26;1713:37;1768:6;1759:15;;;;;;1003:777;;;;:::o;1785:676::-;1889:6;1897;1905;1913;1966:3;1954:9;1945:7;1941:23;1937:33;1934:53;;;1983:1;1980;1973:12;1934:53;2019:9;2006:23;1996:33;;2080:2;2069:9;2065:18;2052:32;2103:18;2144:2;2136:6;2133:14;2130:34;;;2160:1;2157;2150:12;2130:34;2183:49;2224:7;2215:6;2204:9;2200:22;2183:49;:::i;:::-;2173:59;;2285:2;2274:9;2270:18;2257:32;2241:48;;2314:2;2304:8;2301:16;2298:36;;;2330:1;2327;2320:12;2298:36;;2353:51;2396:7;2385:8;2374:9;2370:24;2353:51;:::i;:::-;1785:676;;;;-1:-1:-1;2343:61:111;;2451:2;2436:18;2423:32;;-1:-1:-1;;;1785:676:111:o;2466:247::-;2525:6;2578:2;2566:9;2557:7;2553:23;2549:32;2546:52;;;2594:1;2591;2584:12;2546:52;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;2910:150::-;2985:20;;3034:1;3024:12;;3014:40;;3050:1;3047;3040:12;3065:619;3174:6;3182;3190;3198;3251:3;3239:9;3230:7;3226:23;3222:33;3219:53;;;3268:1;3265;3258:12;3219:53;3307:9;3294:23;3326:31;3351:5;3326:31;:::i;:::-;3376:5;-1:-1:-1;3428:2:111;3413:18;;3400:32;;-1:-1:-1;3483:2:111;3468:18;;3455:32;3510:18;3499:30;;3496:50;;;3542:1;3539;3532:12;3496:50;3565:49;3606:7;3597:6;3586:9;3582:22;3565:49;:::i;:::-;3555:59;;;3633:45;3674:2;3663:9;3659:18;3633:45;:::i;:::-;3623:55;;3065:619;;;;;;;:::o;3689:530::-;3730:3;3768:5;3762:12;3795:6;3790:3;3783:19;3820:1;3830:162;3844:6;3841:1;3838:13;3830:162;;;3906:4;3962:13;;;3958:22;;3952:29;3934:11;;;3930:20;;3923:59;3859:12;3830:162;;;4010:6;4007:1;4004:13;4001:87;;;4076:1;4069:4;4060:6;4055:3;4051:16;4047:27;4040:38;4001:87;-1:-1:-1;4133:2:111;4121:15;4138:66;4117:88;4108:98;;;;4208:4;4104:109;;3689:530;-1:-1:-1;;3689:530:111:o;4224:298::-;4407:6;4400:14;4393:22;4382:9;4375:41;4452:2;4447;4436:9;4432:18;4425:30;4356:4;4472:44;4512:2;4501:9;4497:18;4489:6;4472:44;:::i;4527:248::-;4595:6;4603;4656:2;4644:9;4635:7;4631:23;4627:32;4624:52;;;4672:1;4669;4662:12;4624:52;-1:-1:-1;;4695:23:111;;;4765:2;4750:18;;;4737:32;;-1:-1:-1;4527:248:111:o;4780:217::-;4927:2;4916:9;4909:21;4890:4;4947:44;4987:2;4976:9;4972:18;4964:6;4947:44;:::i;5002:180::-;5061:6;5114:2;5102:9;5093:7;5089:23;5085:32;5082:52;;;5130:1;5127;5120:12;5082:52;-1:-1:-1;5153:23:111;;5002:180;-1:-1:-1;5002:180:111:o;5372:347::-;5423:8;5433:6;5487:3;5480:4;5472:6;5468:17;5464:27;5454:55;;5505:1;5502;5495:12;5454:55;-1:-1:-1;5528:20:111;;5571:18;5560:30;;5557:50;;;5603:1;5600;5593:12;5557:50;5640:4;5632:6;5628:17;5616:29;;5692:3;5685:4;5676:6;5668;5664:19;5660:30;5657:39;5654:59;;;5709:1;5706;5699:12;5654:59;5372:347;;;;;:::o;5724:1223::-;5906:6;5914;5922;5930;5938;5946;5954;5962;5970;5978;5986:7;6040:3;6028:9;6019:7;6015:23;6011:33;6008:53;;;6057:1;6054;6047:12;6008:53;6080:29;6099:9;6080:29;:::i;:::-;6070:39;;6156:2;6145:9;6141:18;6128:32;6118:42;;6179:18;6246:2;6240;6229:9;6225:18;6212:32;6209:40;6206:60;;;6262:1;6259;6252:12;6206:60;6301:84;6377:7;6370:2;6359:9;6355:18;6342:32;6331:9;6327:48;6301:84;:::i;:::-;6404:8;;-1:-1:-1;6431:8:111;-1:-1:-1;6458:45:111;6499:2;6484:18;;6458:45;:::i;:::-;6448:55;;6550:3;6539:9;6535:19;6522:33;6512:43;;6602:3;6591:9;6587:19;6574:33;6564:43;;6654:3;6643:9;6639:19;6626:33;6616:43;;6678:39;6712:3;6701:9;6697:19;6678:39;:::i;:::-;6668:49;;6736:39;6770:3;6759:9;6755:19;6736:39;:::i;:::-;6726:49;;6825:2;6818:3;6807:9;6803:19;6790:33;6787:41;6784:61;;;6841:1;6838;6831:12;6784:61;;6865:76;6933:7;6925:3;6914:9;6910:19;6897:33;6886:9;6882:49;6865:76;:::i;:::-;6854:87;;5724:1223;;;;;;;;;;;;;;:::o;7272:607::-;7367:6;7375;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7488:9;7475:23;7465:33;;7549:2;7538:9;7534:18;7521:32;7572:18;7613:2;7605:6;7602:14;7599:34;;;7629:1;7626;7619:12;7599:34;7652:49;7693:7;7684:6;7673:9;7669:22;7652:49;:::i;:::-;7642:59;;7754:2;7743:9;7739:18;7726:32;7710:48;;7783:2;7773:8;7770:16;7767:36;;;7799:1;7796;7789:12;7767:36;;7822:51;7865:7;7854:8;7843:9;7839:24;7822:51;:::i;:::-;7812:61;;;7272:607;;;;;:::o;8016:484::-;8069:3;8107:5;8101:12;8134:6;8129:3;8122:19;8160:4;8189:2;8184:3;8180:12;8173:19;;8226:2;8219:5;8215:14;8247:1;8257:218;8271:6;8268:1;8265:13;8257:218;;;8336:13;;-1:-1:-1;;;;;8332:62:111;8320:75;;8415:12;;;;8450:15;;;;8293:1;8286:9;8257:218;;;-1:-1:-1;8491:3:111;;8016:484;-1:-1:-1;;;;;8016:484:111:o;8505:261::-;8684:2;8673:9;8666:21;8647:4;8704:56;8756:2;8745:9;8741:18;8733:6;8704:56;:::i;8771:455::-;8848:6;8856;8909:2;8897:9;8888:7;8884:23;8880:32;8877:52;;;8925:1;8922;8915:12;8877:52;8964:9;8951:23;8983:31;9008:5;8983:31;:::i;:::-;9033:5;-1:-1:-1;9089:2:111;9074:18;;9061:32;9116:18;9105:30;;9102:50;;;9148:1;9145;9138:12;9102:50;9171:49;9212:7;9203:6;9192:9;9188:22;9171:49;:::i;:::-;9161:59;;;8771:455;;;;;:::o;9231:1353::-;9399:6;9407;9415;9423;9431;9439;9447;9455;9463;9471;9524:3;9512:9;9503:7;9499:23;9495:33;9492:53;;;9541:1;9538;9531:12;9492:53;9581:9;9568:23;9610:18;9651:2;9643:6;9640:14;9637:34;;;9667:1;9664;9657:12;9637:34;9705:6;9694:9;9690:22;9680:32;;9750:7;9743:4;9739:2;9735:13;9731:27;9721:55;;9772:1;9769;9762:12;9721:55;9812:2;9799:16;9838:2;9830:6;9827:14;9824:34;;;9854:1;9851;9844:12;9824:34;9909:7;9902:4;9892:6;9889:1;9885:14;9881:2;9877:23;9873:34;9870:47;9867:67;;;9930:1;9927;9920:12;9867:67;9961:4;9953:13;;;;-1:-1:-1;9985:6:111;;-1:-1:-1;10023:20:111;;10010:34;;-1:-1:-1;10063:38:111;10097:2;10082:18;;10063:38;:::i;:::-;10053:48;;10154:2;10143:9;10139:18;10126:32;10110:48;;10183:2;10173:8;10170:16;10167:36;;;10199:1;10196;10189:12;10167:36;;10238:60;10290:7;10279:8;10268:9;10264:24;10238:60;:::i;:::-;10317:8;;-1:-1:-1;10212:86:111;-1:-1:-1;10371:39:111;;-1:-1:-1;10405:3:111;10390:19;;10371:39;:::i;:::-;10361:49;;10429:39;10463:3;10452:9;10448:19;10429:39;:::i;:::-;10419:49;;10515:3;10504:9;10500:19;10487:33;10477:43;;10539:39;10573:3;10562:9;10558:19;10539:39;:::i;:::-;10529:49;;9231:1353;;;;;;;;;;;;;:::o;10589:708::-;10700:6;10708;10716;10724;10732;10785:3;10773:9;10764:7;10760:23;10756:33;10753:53;;;10802:1;10799;10792:12;10753:53;10841:9;10828:23;10860:31;10885:5;10860:31;:::i;:::-;10910:5;-1:-1:-1;10962:2:111;10947:18;;10934:32;;-1:-1:-1;11017:2:111;11002:18;;10989:32;11044:18;11033:30;;11030:50;;;11076:1;11073;11066:12;11030:50;11115:58;11165:7;11156:6;11145:9;11141:22;11115:58;:::i;:::-;11192:8;;-1:-1:-1;11089:84:111;-1:-1:-1;11246:45:111;;-1:-1:-1;11287:2:111;11272:18;;11246:45;:::i;:::-;11236:55;;10589:708;;;;;;;;:::o;11302:381::-;11509:2;11498:9;11491:21;11472:4;11529:56;11581:2;11570:9;11566:18;11558:6;11529:56;:::i;:::-;11521:64;;-1:-1:-1;;;;;11625:6:111;11621:55;11616:2;11605:9;11601:18;11594:83;11302:381;;;;;:::o;11688:1270::-;11853:6;11861;11869;11877;11885;11893;11901;11909;11917;11925;11933:7;11987:3;11975:9;11966:7;11962:23;11958:33;11955:53;;;12004:1;12001;11994:12;11955:53;12043:9;12030:23;12062:31;12087:5;12062:31;:::i;:::-;12112:5;-1:-1:-1;12164:2:111;12149:18;;12136:32;;-1:-1:-1;12219:2:111;12204:18;;12191:32;12246:18;12235:30;;12232:50;;;12278:1;12275;12268:12;12232:50;12317:58;12367:7;12358:6;12347:9;12343:22;12317:58;:::i;:::-;12394:8;;-1:-1:-1;12291:84:111;-1:-1:-1;12448:45:111;;-1:-1:-1;12489:2:111;12474:18;;12448:45;:::i;:::-;12438:55;;12540:3;12529:9;12525:19;12512:33;12502:43;;12592:3;12581:9;12577:19;12564:33;12554:43;;12644:3;12633:9;12629:19;12616:33;12606:43;;12701:3;12690:9;12686:19;12673:33;12715;12740:7;12715:33;:::i;:::-;12767:7;-1:-1:-1;12826:3:111;12811:19;;12798:33;12840;12798;12840;:::i;:::-;12892:7;12882:17;;;12947:3;12936:9;12932:19;12919:33;12908:44;;11688:1270;;;;;;;;;;;;;;:::o;13145:388::-;13213:6;13221;13274:2;13262:9;13253:7;13249:23;13245:32;13242:52;;;13290:1;13287;13280:12;13242:52;13329:9;13316:23;13348:31;13373:5;13348:31;:::i;:::-;13398:5;-1:-1:-1;13455:2:111;13440:18;;13427:32;13468:33;13427:32;13468:33;:::i;:::-;13520:7;13510:17;;;13145:388;;;;;:::o;13538:529::-;13615:6;13623;13631;13684:2;13672:9;13663:7;13659:23;13655:32;13652:52;;;13700:1;13697;13690:12;13652:52;13739:9;13726:23;13758:31;13783:5;13758:31;:::i;:::-;13808:5;-1:-1:-1;13865:2:111;13850:18;;13837:32;13878:33;13837:32;13878:33;:::i;:::-;13930:7;-1:-1:-1;13989:2:111;13974:18;;13961:32;14002:33;13961:32;14002:33;:::i;:::-;14054:7;14044:17;;;13538:529;;;;;:::o;14072:456::-;14149:6;14157;14165;14218:2;14206:9;14197:7;14193:23;14189:32;14186:52;;;14234:1;14231;14224:12;14186:52;14273:9;14260:23;14292:31;14317:5;14292:31;:::i;:::-;14342:5;-1:-1:-1;14399:2:111;14384:18;;14371:32;14412:33;14371:32;14412:33;:::i;:::-;14072:456;;14464:7;;-1:-1:-1;;;14518:2:111;14503:18;;;;14490:32;;14072:456::o;15423:184::-;15475:77;15472:1;15465:88;15572:4;15569:1;15562:15;15596:4;15593:1;15586:15;15612:195;15651:3;15682:66;15675:5;15672:77;15669:103;;15752:18;;:::i;:::-;-1:-1:-1;15799:1:111;15788:13;;15612:195::o;17375:377::-;17568:2;17557:9;17550:21;17531:4;17594:44;17634:2;17623:9;17619:18;17611:6;17594:44;:::i;:::-;17686:9;17678:6;17674:22;17669:2;17658:9;17654:18;17647:50;17714:32;17739:6;17731;17714:32;:::i;17757:336::-;17826:6;17879:2;17867:9;17858:7;17854:23;17850:32;17847:52;;;17895:1;17892;17885:12;17847:52;17927:9;17921:16;17977:66;17970:5;17966:78;17959:5;17956:89;17946:117;;18059:1;18056;18049:12;19149:195;19187:4;19224;19221:1;19217:12;19256:4;19253:1;19249:12;19281:3;19276;19273:12;19270:38;;;19288:18;;:::i;:::-;19325:13;;;19149:195;-1:-1:-1;;;19149:195:111:o;20418:228::-;20458:7;20584:1;20516:66;20512:74;20509:1;20506:81;20501:1;20494:9;20487:17;20483:105;20480:131;;;20591:18;;:::i;:::-;-1:-1:-1;20631:9:111;;20418:228::o;21983:184::-;22035:77;22032:1;22025:88;22132:4;22129:1;22122:15;22156:4;22153:1;22146:15;22172:294;22253:1;22246:5;22243:12;22233:200;;22289:77;22286:1;22279:88;22390:4;22387:1;22380:15;22418:4;22415:1;22408:15;22233:200;22442:18;;22172:294::o;22471:1430::-;22919:4;22948:3;-1:-1:-1;;;;;22982:6:111;22978:55;22967:9;22960:74;23070:6;23065:2;23054:9;23050:18;23043:34;23113:2;23108;23097:9;23093:18;23086:30;23152:6;23147:2;23136:9;23132:18;23125:34;;23178:3;23231:6;23223;23218:2;23207:9;23203:18;23190:48;23287:1;23282:2;23273:6;23262:9;23258:22;23254:31;23247:42;23344:66;23339:2;23331:6;23327:15;23323:88;23312:9;23308:104;23421:53;23470:2;23459:9;23455:18;23447:6;23421:53;:::i;:::-;23511:6;23505:3;23494:9;23490:19;23483:35;23555:6;23549:3;23538:9;23534:19;23527:35;23599:6;23593:3;23582:9;23578:19;23571:35;23615:47;23657:3;23646:9;23642:19;23634:6;-1:-1:-1;;;;;7950:54:111;7938:67;;7884:127;23615:47;-1:-1:-1;;;;;7950:54:111;;23713:3;23698:19;;7938:67;23779:2;23767:9;23763:2;23759:18;23755:27;23749:3;23738:9;23734:19;23727:56;23800:38;23834:2;23830;23826:11;23817:7;23800:38;:::i;:::-;23792:46;;;;23847:48;23890:3;23879:9;23875:19;23866:7;-1:-1:-1;;;;;7950:54:111;7938:67;;7884:127;23847:48;22471:1430;;;;;;;;;;;;;;;:::o;23906:128::-;23946:3;23977:1;23973:6;23970:1;23967:13;23964:39;;;23983:18;;:::i;:::-;-1:-1:-1;24019:9:111;;23906:128::o;24039:274::-;24079:1;24105;24095:189;;24140:77;24137:1;24130:88;24241:4;24238:1;24231:15;24269:4;24266:1;24259:15;24095:189;-1:-1:-1;24298:9:111;;24039:274::o;24651:125::-;24691:4;24719:1;24716;24713:8;24710:34;;;24724:18;;:::i;:::-;-1:-1:-1;24761:9:111;;24651:125::o;25963:184::-;26015:77;26012:1;26005:88;26112:4;26109:1;26102:15;26136:4;26133:1;26126:15;26152:1031;26436:3;26449:22;;;26421:19;;26506:22;;;26388:4;26586:6;26559:3;26544:19;;26388:4;26620:327;26634:6;26631:1;26628:13;26620:327;;;26709:6;26696:20;26729:31;26754:5;26729:31;:::i;:::-;-1:-1:-1;;;;;26785:54:111;26773:67;;26863:4;26922:15;;;;26887:12;;;;26656:1;26649:9;26620:327;;;-1:-1:-1;26998:4:111;26983:20;;26976:36;;;;-1:-1:-1;;;;;;;27109:15:111;;;27104:2;27089:18;;27082:43;27161:15;;27156:2;27141:18;;;27134:43;26964:3;26152:1031;-1:-1:-1;;26152:1031:111:o;28374:271::-;28557:6;28549;28544:3;28531:33;28513:3;28583:16;;28608:13;;;28583:16;28374:271;-1:-1:-1;28374:271:111:o;28650:1016::-;29035:4;29077:3;29066:9;29062:19;29054:27;;29108:6;29097:9;29090:25;-1:-1:-1;;;;;29224:2:111;29216:6;29212:15;29207:2;29196:9;29192:18;29185:43;29264:6;29259:2;29248:9;29244:18;29237:34;29307:6;29302:2;29291:9;29287:18;29280:34;29323:54;29372:3;29361:9;29357:19;29349:6;29323:54;:::i;:::-;29408:3;29393:19;;29386:35;;;;29452:3;29437:19;;29430:35;;;;29496:3;29481:19;;29474:35;;;;29546:15;;;29540:3;29525:19;;29518:44;29599:15;;;29593:3;29578:19;;29571:44;29646:3;29631:19;29624:36;;;;28650:1016;;-1:-1:-1;;;;;28650:1016:111:o;30549:196::-;30588:3;30616:5;30606:39;;30625:18;;:::i;:::-;-1:-1:-1;30672:66:111;30661:78;;30549:196::o"},"gasEstimates":{"creation":{"codeDepositCost":"2862000","executionCost":"25237","totalCost":"2887237"},"external":{"":"infinite","VERSION()":"infinite","addOwnerWithThreshold(address,uint256)":"infinite","approveHash(bytes32)":"26260","approvedHashes(address,bytes32)":"2673","changeThreshold(uint256)":"25710","checkNSignatures(bytes32,bytes,bytes,uint256)":"infinite","checkSignatures(bytes32,bytes,bytes)":"infinite","disableModule(address,address)":"infinite","domainSeparator()":"441","enableModule(address)":"54465","encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":"infinite","execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)":"infinite","execTransactionFromModule(address,uint256,bytes,uint8)":"infinite","execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":"infinite","getChainId()":"248","getModulesPaginated(address,uint256)":"infinite","getOwners()":"infinite","getStorageAt(uint256,uint256)":"infinite","getThreshold()":"2381","getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":"infinite","isModuleEnabled(address)":"2706","isOwner(address)":"2655","nonce()":"2341","removeOwner(address,address,uint256)":"infinite","requiredTxGas(address,uint256,bytes,uint8)":"infinite","setFallbackHandler(address)":"23592","setGuard(address)":"23586","setup(address[],uint256,address,bytes,address,address,uint256,address)":"infinite","signedMessages(bytes32)":"2506","simulateAndRevert(address,bytes)":"infinite","swapOwner(address,address,address)":"infinite"},"internal":{"handlePayment(uint256,uint256,uint256,address,address payable)":"infinite"}},"methodIdentifiers":{"VERSION()":"ffa1ad74","addOwnerWithThreshold(address,uint256)":"0d582f13","approveHash(bytes32)":"d4d9bdcd","approvedHashes(address,bytes32)":"7d832974","changeThreshold(uint256)":"694e80c3","checkNSignatures(bytes32,bytes,bytes,uint256)":"12fb68e0","checkSignatures(bytes32,bytes,bytes)":"934f3a11","disableModule(address,address)":"e009cfde","domainSeparator()":"f698da25","enableModule(address)":"610b5925","encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":"e86637db","execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)":"6a761202","execTransactionFromModule(address,uint256,bytes,uint8)":"468721a7","execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":"5229073f","getChainId()":"3408e470","getModulesPaginated(address,uint256)":"cc2f8452","getOwners()":"a0e67e2b","getStorageAt(uint256,uint256)":"5624b25b","getThreshold()":"e75235b8","getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)":"d8d11f78","isModuleEnabled(address)":"2d9ad53d","isOwner(address)":"2f54bf6e","nonce()":"affed0e0","removeOwner(address,address,uint256)":"f8dc5dd9","requiredTxGas(address,uint256,bytes,uint8)":"c4ca3a9c","setFallbackHandler(address)":"f08a0323","setGuard(address)":"e19a9dd9","setup(address[],uint256,address,bytes,address,address,uint256,address)":"b63e800d","signedMessages(bytes32)":"5ae6bd37","simulateAndRevert(address,bytes)":"b4faba09","swapOwner(address,address,address)":"e318b52b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"approvedHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ApproveHash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"ChangedFallbackHandler\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"ChangedGuard\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"initializer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"}],\"name\":\"SafeSetup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"SignMsg\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashToApprove\",\"type\":\"bytes32\"}],\"name\":\"approveHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"approvedHashes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredSignatures\",\"type\":\"uint256\"}],\"name\":\"checkNSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"checkSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"encodeTransactionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"execTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"getStorageAt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"requiredTxGas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"setGuard\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymentToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"paymentReceiver\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"signedMessages\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"Stefan George - Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"addOwnerWithThreshold(address,uint256)\":{\"details\":\"Allows to add a new owner to the Safe and update the threshold at the same time. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"New owner address.\"}},\"approveHash(bytes32)\":{\"details\":\"Marks a hash as approved. This can be used to validate a hash that is used by a signature.\",\"params\":{\"hashToApprove\":\"The hash that should be marked as approved for signatures that are verified by this contract.\"}},\"changeThreshold(uint256)\":{\"details\":\"Allows to update the number of required confirmations by Safe owners. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\"}},\"checkNSignatures(bytes32,bytes,bytes,uint256)\":{\"details\":\"Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\",\"params\":{\"data\":\"That should be signed (this is passed to an external validator contract)\",\"dataHash\":\"Hash of the data (could be either a message hash or transaction hash)\",\"requiredSignatures\":\"Amount of required valid signatures.\",\"signatures\":\"Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\"}},\"checkSignatures(bytes32,bytes,bytes)\":{\"details\":\"Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\",\"params\":{\"data\":\"That should be signed (this is passed to an external validator contract)\",\"dataHash\":\"Hash of the data (could be either a message hash or transaction hash)\",\"signatures\":\"Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\"}},\"disableModule(address,address)\":{\"details\":\"Allows to remove a module from the whitelist. This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be removed.\",\"prevModule\":\"Module that pointed to the module to be removed in the linked list\"}},\"enableModule(address)\":{\"details\":\"Allows to add a module to the whitelist. This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be whitelisted.\"}},\"encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)\":{\"details\":\"Returns the bytes that are hashed to be signed by owners.\",\"params\":{\"_nonce\":\"Transaction nonce.\",\"baseGas\":\"Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\",\"data\":\"Data payload.\",\"gasPrice\":\"Maximum gas price that should be used for this transaction.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Gas that should be used for the safe transaction.\",\"to\":\"Destination address.\",\"value\":\"Ether value.\"},\"returns\":{\"_0\":\"Transaction hash bytes.\"}},\"execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)\":{\"details\":\"Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction. Note: The fees are always transferred, even if the user transaction fails.\",\"params\":{\"baseGas\":\"Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\",\"data\":\"Data payload of Safe transaction.\",\"gasPrice\":\"Gas price that should be used for the payment calculation.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type of Safe transaction.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Gas that should be used for the Safe transaction.\",\"signatures\":\"Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\",\"to\":\"Destination address of Safe transaction.\",\"value\":\"Ether value of Safe transaction.\"}},\"execTransactionFromModule(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations.\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"execTransactionFromModuleReturnData(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations and return data\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"getChainId()\":{\"details\":\"Returns the chain id used by this contract.\"},\"getModulesPaginated(address,uint256)\":{\"details\":\"Returns array of modules.\",\"params\":{\"pageSize\":\"Maximum number of modules that should be returned.\",\"start\":\"Start of the page.\"},\"returns\":{\"array\":\"Array of modules.\",\"next\":\"Start of the next page.\"}},\"getOwners()\":{\"details\":\"Returns array of owners.\",\"returns\":{\"_0\":\"Array of Safe owners.\"}},\"getStorageAt(uint256,uint256)\":{\"details\":\"Reads `length` bytes of storage in the currents contract\",\"params\":{\"length\":\"- the number of words (32 bytes) of data to read\",\"offset\":\"- the offset in the current contract's storage in words to start reading from\"},\"returns\":{\"_0\":\"the bytes that were read.\"}},\"getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)\":{\"details\":\"Returns hash to be signed by owners.\",\"params\":{\"_nonce\":\"Transaction nonce.\",\"baseGas\":\"Gas costs for data used to trigger the safe transaction.\",\"data\":\"Data payload.\",\"gasPrice\":\"Maximum gas price that should be used for this transaction.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Fas that should be used for the safe transaction.\",\"to\":\"Destination address.\",\"value\":\"Ether value.\"},\"returns\":{\"_0\":\"Transaction hash.\"}},\"isModuleEnabled(address)\":{\"details\":\"Returns if an module is enabled\",\"returns\":{\"_0\":\"True if the module is enabled\"}},\"removeOwner(address,address,uint256)\":{\"details\":\"Allows to remove an owner from the Safe and update the threshold at the same time. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"Owner address to be removed.\",\"prevOwner\":\"Owner that pointed to the owner to be removed in the linked list\"}},\"requiredTxGas(address,uint256,bytes,uint8)\":{\"details\":\"Allows to estimate a Safe transaction. This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data. Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\",\"params\":{\"data\":\"Data payload of Safe transaction.\",\"operation\":\"Operation type of Safe transaction.\",\"to\":\"Destination address of Safe transaction.\",\"value\":\"Ether value of Safe transaction.\"},\"returns\":{\"_0\":\"Estimate without refunds and overhead fees (base transaction and payload data gas costs).\"}},\"setFallbackHandler(address)\":{\"details\":\"Allows to add a contract to handle fallback calls. Only fallback calls without value and with data will be forwarded. This can only be done via a Safe transaction.\",\"params\":{\"handler\":\"contract to handle fallbacks calls.\"}},\"setGuard(address)\":{\"details\":\"Set a guard that checks transactions before execution\",\"params\":{\"guard\":\"The address of the guard to be used or the 0 address to disable the guard\"}},\"setup(address[],uint256,address,bytes,address,address,uint256,address)\":{\"details\":\"Setup function sets initial storage of contract.\",\"params\":{\"_owners\":\"List of Safe owners.\",\"_threshold\":\"Number of required confirmations for a Safe transaction.\",\"data\":\"Data payload for optional delegate call.\",\"fallbackHandler\":\"Handler for fallback calls to this contract\",\"payment\":\"Value that should be paid\",\"paymentReceiver\":\"Adddress that should receive the payment (or 0 if tx.origin)\",\"paymentToken\":\"Token that should be used for the payment (0 is ETH)\",\"to\":\"Contract address for optional delegate call.\"}},\"simulateAndRevert(address,bytes)\":{\"details\":\"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). This method reverts with data equal to `abi.encode(bool(success), bytes(response))`. Specifically, the `returndata` after a call to this method will be: `success:bool || response.length:uint256 || response:bytes`.\",\"params\":{\"calldataPayload\":\"Calldata that should be sent to the target contract (encoded method name and arguments).\",\"targetContract\":\"Address of the contract containing the code to execute.\"}},\"swapOwner(address,address,address)\":{\"details\":\"Allows to swap/replace an owner from the Safe with another address. This can only be done via a Safe transaction.\",\"params\":{\"newOwner\":\"New owner address.\",\"oldOwner\":\"Owner address to be replaced.\",\"prevOwner\":\"Owner that pointed to the owner to be replaced in the linked list\"}}},\"title\":\"Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addOwnerWithThreshold(address,uint256)\":{\"notice\":\"Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\"},\"changeThreshold(uint256)\":{\"notice\":\"Changes the threshold of the Safe to `_threshold`.\"},\"disableModule(address,address)\":{\"notice\":\"Disables the module `module` for the Safe.\"},\"enableModule(address)\":{\"notice\":\"Enables the module `module` for the Safe.\"},\"removeOwner(address,address,uint256)\":{\"notice\":\"Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\"},\"requiredTxGas(address,uint256,bytes,uint8)\":{\"notice\":\"Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\"},\"swapOwner(address,address,address)\":{\"notice\":\"Replaces the owner `oldOwner` in the Safe with `newOwner`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\":\"GnosisSafe\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./base/ModuleManager.sol\\\";\\nimport \\\"./base/OwnerManager.sol\\\";\\nimport \\\"./base/FallbackManager.sol\\\";\\nimport \\\"./base/GuardManager.sol\\\";\\nimport \\\"./common/EtherPaymentFallback.sol\\\";\\nimport \\\"./common/Singleton.sol\\\";\\nimport \\\"./common/SignatureDecoder.sol\\\";\\nimport \\\"./common/SecuredTokenTransfer.sol\\\";\\nimport \\\"./common/StorageAccessible.sol\\\";\\nimport \\\"./interfaces/ISignatureValidator.sol\\\";\\nimport \\\"./external/GnosisSafeMath.sol\\\";\\n\\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafe is\\n EtherPaymentFallback,\\n Singleton,\\n ModuleManager,\\n OwnerManager,\\n SignatureDecoder,\\n SecuredTokenTransfer,\\n ISignatureValidatorConstants,\\n FallbackManager,\\n StorageAccessible,\\n GuardManager\\n{\\n using GnosisSafeMath for uint256;\\n\\n string public constant VERSION = \\\"1.3.0\\\";\\n\\n // keccak256(\\n // \\\"EIP712Domain(uint256 chainId,address verifyingContract)\\\"\\n // );\\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\\n\\n // keccak256(\\n // \\\"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\\\"\\n // );\\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\\n\\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\\n event SignMsg(bytes32 indexed msgHash);\\n event ExecutionFailure(bytes32 txHash, uint256 payment);\\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\\n\\n uint256 public nonce;\\n bytes32 private _deprecatedDomainSeparator;\\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\\n mapping(bytes32 => uint256) public signedMessages;\\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\\n\\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\\n constructor() {\\n // By setting the threshold it is not possible to call setup anymore,\\n // so we create a Safe with 0 owners and threshold 1.\\n // This is an unusable Safe, perfect for the singleton\\n threshold = 1;\\n }\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n /// @param to Contract address for optional delegate call.\\n /// @param data Data payload for optional delegate call.\\n /// @param fallbackHandler Handler for fallback calls to this contract\\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\\n /// @param payment Value that should be paid\\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\\n function setup(\\n address[] calldata _owners,\\n uint256 _threshold,\\n address to,\\n bytes calldata data,\\n address fallbackHandler,\\n address paymentToken,\\n uint256 payment,\\n address payable paymentReceiver\\n ) external {\\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\\n setupOwners(_owners, _threshold);\\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\\n setupModules(to, data);\\n\\n if (payment > 0) {\\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\\n }\\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\\n }\\n\\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\\n /// Note: The fees are always transferred, even if the user transaction fails.\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @param safeTxGas Gas that should be used for the Safe transaction.\\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Gas price that should be used for the payment calculation.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\\n function execTransaction(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures\\n ) public payable virtual returns (bool success) {\\n bytes32 txHash;\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n bytes memory txHashData =\\n encodeTransactionData(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n nonce\\n );\\n // Increase nonce and execute transaction.\\n nonce++;\\n txHash = keccak256(txHashData);\\n checkSignatures(txHash, txHashData, signatures);\\n }\\n address guard = getGuard();\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkTransaction(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n signatures,\\n msg.sender\\n );\\n }\\n }\\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \\\"GS010\\\");\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n uint256 gasUsed = gasleft();\\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\\n gasUsed = gasUsed.sub(gasleft());\\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\\n require(success || safeTxGas != 0 || gasPrice != 0, \\\"GS013\\\");\\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\\n uint256 payment = 0;\\n if (gasPrice > 0) {\\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\\n }\\n if (success) emit ExecutionSuccess(txHash, payment);\\n else emit ExecutionFailure(txHash, payment);\\n }\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkAfterExecution(txHash, success);\\n }\\n }\\n }\\n\\n function handlePayment(\\n uint256 gasUsed,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver\\n ) private returns (uint256 payment) {\\n // solhint-disable-next-line avoid-tx-origin\\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\\n if (gasToken == address(0)) {\\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\\n require(receiver.send(payment), \\\"GS011\\\");\\n } else {\\n payment = gasUsed.add(baseGas).mul(gasPrice);\\n require(transferToken(gasToken, receiver, payment), \\\"GS012\\\");\\n }\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n */\\n function checkSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures\\n ) public view {\\n // Load threshold to avoid multiple storage loads\\n uint256 _threshold = threshold;\\n // Check that a threshold is set\\n require(_threshold > 0, \\\"GS001\\\");\\n checkNSignatures(dataHash, data, signatures, _threshold);\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n * @param requiredSignatures Amount of required valid signatures.\\n */\\n function checkNSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures,\\n uint256 requiredSignatures\\n ) public view {\\n // Check that the provided signature data is not too short\\n require(signatures.length >= requiredSignatures.mul(65), \\\"GS020\\\");\\n // There cannot be an owner with address 0.\\n address lastOwner = address(0);\\n address currentOwner;\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n uint256 i;\\n for (i = 0; i < requiredSignatures; i++) {\\n (v, r, s) = signatureSplit(signatures, i);\\n if (v == 0) {\\n // If v is 0 then it is a contract signature\\n // When handling contract signatures the address of the contract is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n\\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\\n // Here we only check that the pointer is not pointing inside the part that is being processed\\n require(uint256(s) >= requiredSignatures.mul(65), \\\"GS021\\\");\\n\\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\\n require(uint256(s).add(32) <= signatures.length, \\\"GS022\\\");\\n\\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\\n uint256 contractSignatureLen;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\\n }\\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \\\"GS023\\\");\\n\\n // Check signature\\n bytes memory contractSignature;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\\n contractSignature := add(add(signatures, s), 0x20)\\n }\\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \\\"GS024\\\");\\n } else if (v == 1) {\\n // If v is 1 then it is an approved hash\\n // When handling approved hashes the address of the approver is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \\\"GS025\\\");\\n } else if (v > 30) {\\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\\n currentOwner = ecrecover(keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", dataHash)), v - 4, r, s);\\n } else {\\n // Default is the ecrecover flow with the provided data hash\\n // Use ecrecover with the messageHash for EOA signatures\\n currentOwner = ecrecover(dataHash, v, r, s);\\n }\\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \\\"GS026\\\");\\n lastOwner = currentOwner;\\n }\\n }\\n\\n /// @dev Allows to estimate a Safe transaction.\\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\\n function requiredTxGas(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation\\n ) external returns (uint256) {\\n uint256 startGas = gasleft();\\n // We don't provide an error message here, as we use it to return the estimate\\n require(execute(to, value, data, operation, gasleft()));\\n uint256 requiredGas = startGas - gasleft();\\n // Convert response to string and return via error message\\n revert(string(abi.encodePacked(requiredGas)));\\n }\\n\\n /**\\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\\n */\\n function approveHash(bytes32 hashToApprove) external {\\n require(owners[msg.sender] != address(0), \\\"GS030\\\");\\n approvedHashes[msg.sender][hashToApprove] = 1;\\n emit ApproveHash(hashToApprove, msg.sender);\\n }\\n\\n /// @dev Returns the chain id used by this contract.\\n function getChainId() public view returns (uint256) {\\n uint256 id;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n id := chainid()\\n }\\n return id;\\n }\\n\\n function domainSeparator() public view returns (bytes32) {\\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\\n }\\n\\n /// @dev Returns the bytes that are hashed to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Gas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash bytes.\\n function encodeTransactionData(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes memory) {\\n bytes32 safeTxHash =\\n keccak256(\\n abi.encode(\\n SAFE_TX_TYPEHASH,\\n to,\\n value,\\n keccak256(data),\\n operation,\\n safeTxGas,\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n _nonce\\n )\\n );\\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\\n }\\n\\n /// @dev Returns hash to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Fas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash.\\n function getTransactionHash(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes32) {\\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\\n }\\n}\\n\",\"keccak256\":\"0x2ca9e3e053c969b9364f62c50c2c25b92525db7fd0bad3ae1fb0c20dd575367c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract FallbackManager is SelfAuthorized {\\n event ChangedFallbackHandler(address handler);\\n\\n // keccak256(\\\"fallback_manager.handler.address\\\")\\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\\n\\n function internalSetFallbackHandler(address handler) internal {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, handler)\\n }\\n }\\n\\n /// @dev Allows to add a contract to handle fallback calls.\\n /// Only fallback calls without value and with data will be forwarded.\\n /// This can only be done via a Safe transaction.\\n /// @param handler contract to handle fallbacks calls.\\n function setFallbackHandler(address handler) public authorized {\\n internalSetFallbackHandler(handler);\\n emit ChangedFallbackHandler(handler);\\n }\\n\\n // solhint-disable-next-line payable-fallback,no-complex-fallback\\n fallback() external {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let handler := sload(slot)\\n if iszero(handler) {\\n return(0, 0)\\n }\\n calldatacopy(0, 0, calldatasize())\\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\\n // Then the address without padding is stored right after the calldata\\n mstore(calldatasize(), shl(96, caller()))\\n // Add 20 bytes for the address appended add the end\\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if iszero(success) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1be9f0f3e80a78134c2e3a026c6a14759785bd35d135e87a4a025aeb6742791f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\nimport \\\"./Executor.sol\\\";\\n\\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract ModuleManager is SelfAuthorized, Executor {\\n event EnabledModule(address module);\\n event DisabledModule(address module);\\n event ExecutionFromModuleSuccess(address indexed module);\\n event ExecutionFromModuleFailure(address indexed module);\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n mapping(address => address) internal modules;\\n\\n function setupModules(address to, bytes memory data) internal {\\n require(modules[SENTINEL_MODULES] == address(0), \\\"GS100\\\");\\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\\n if (to != address(0))\\n // Setup has to complete successfully or transaction fails.\\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \\\"GS000\\\");\\n }\\n\\n /// @dev Allows to add a module to the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Enables the module `module` for the Safe.\\n /// @param module Module to be whitelisted.\\n function enableModule(address module) public authorized {\\n // Module address cannot be null or sentinel.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n // Module cannot be added twice.\\n require(modules[module] == address(0), \\\"GS102\\\");\\n modules[module] = modules[SENTINEL_MODULES];\\n modules[SENTINEL_MODULES] = module;\\n emit EnabledModule(module);\\n }\\n\\n /// @dev Allows to remove a module from the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Disables the module `module` for the Safe.\\n /// @param prevModule Module that pointed to the module to be removed in the linked list\\n /// @param module Module to be removed.\\n function disableModule(address prevModule, address module) public authorized {\\n // Validate module address and check that it corresponds to module index.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n require(modules[prevModule] == module, \\\"GS103\\\");\\n modules[prevModule] = modules[module];\\n modules[module] = address(0);\\n emit DisabledModule(module);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public virtual returns (bool success) {\\n // Only whitelisted modules are allowed.\\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \\\"GS104\\\");\\n // Execute transaction without further confirmations.\\n success = execute(to, value, data, operation, gasleft());\\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\\n else emit ExecutionFromModuleFailure(msg.sender);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModuleReturnData(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public returns (bool success, bytes memory returnData) {\\n success = execTransactionFromModule(to, value, data, operation);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // Load free memory location\\n let ptr := mload(0x40)\\n // We allocate memory for the return data by setting the free memory location to\\n // current free memory location + data size + 32 bytes for data size value\\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\\n // Store the size\\n mstore(ptr, returndatasize())\\n // Store the data\\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\\n // Point the return data to the correct memory location\\n returnData := ptr\\n }\\n }\\n\\n /// @dev Returns if an module is enabled\\n /// @return True if the module is enabled\\n function isModuleEnabled(address module) public view returns (bool) {\\n return SENTINEL_MODULES != module && modules[module] != address(0);\\n }\\n\\n /// @dev Returns array of modules.\\n /// @param start Start of the page.\\n /// @param pageSize Maximum number of modules that should be returned.\\n /// @return array Array of modules.\\n /// @return next Start of the next page.\\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\\n // Init array with max page size\\n array = new address[](pageSize);\\n\\n // Populate return array\\n uint256 moduleCount = 0;\\n address currentModule = modules[start];\\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\\n array[moduleCount] = currentModule;\\n currentModule = modules[currentModule];\\n moduleCount++;\\n }\\n next = currentModule;\\n // Set correct size of returned array\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n mstore(array, moduleCount)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5512760a0328309f82a71cbe2ac14e0942501b9d44d5fb417bd02174546672e5\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract OwnerManager is SelfAuthorized {\\n event AddedOwner(address owner);\\n event RemovedOwner(address owner);\\n event ChangedThreshold(uint256 threshold);\\n\\n address internal constant SENTINEL_OWNERS = address(0x1);\\n\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\\n // Threshold can only be 0 at initialization.\\n // Check ensures that setup function can only be called once.\\n require(threshold == 0, \\\"GS200\\\");\\n // Validate that threshold is smaller than number of added owners.\\n require(_threshold <= _owners.length, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n // Initializing Safe owners.\\n address currentOwner = SENTINEL_OWNERS;\\n for (uint256 i = 0; i < _owners.length; i++) {\\n // Owner address cannot be null.\\n address owner = _owners[i];\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[currentOwner] = owner;\\n currentOwner = owner;\\n }\\n owners[currentOwner] = SENTINEL_OWNERS;\\n ownerCount = _owners.length;\\n threshold = _threshold;\\n }\\n\\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\\n /// @param owner New owner address.\\n /// @param _threshold New threshold.\\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[owner] = owners[SENTINEL_OWNERS];\\n owners[SENTINEL_OWNERS] = owner;\\n ownerCount++;\\n emit AddedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\\n /// @param owner Owner address to be removed.\\n /// @param _threshold New threshold.\\n function removeOwner(\\n address prevOwner,\\n address owner,\\n uint256 _threshold\\n ) public authorized {\\n // Only allow to remove an owner, if threshold can still be reached.\\n require(ownerCount - 1 >= _threshold, \\\"GS201\\\");\\n // Validate owner address and check that it corresponds to owner index.\\n require(owner != address(0) && owner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == owner, \\\"GS205\\\");\\n owners[prevOwner] = owners[owner];\\n owners[owner] = address(0);\\n ownerCount--;\\n emit RemovedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to swap/replace an owner from the Safe with another address.\\n /// This can only be done via a Safe transaction.\\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\\n /// @param oldOwner Owner address to be replaced.\\n /// @param newOwner New owner address.\\n function swapOwner(\\n address prevOwner,\\n address oldOwner,\\n address newOwner\\n ) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[newOwner] == address(0), \\\"GS204\\\");\\n // Validate oldOwner address and check that it corresponds to owner index.\\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == oldOwner, \\\"GS205\\\");\\n owners[newOwner] = owners[oldOwner];\\n owners[prevOwner] = newOwner;\\n owners[oldOwner] = address(0);\\n emit RemovedOwner(oldOwner);\\n emit AddedOwner(newOwner);\\n }\\n\\n /// @dev Allows to update the number of required confirmations by Safe owners.\\n /// This can only be done via a Safe transaction.\\n /// @notice Changes the threshold of the Safe to `_threshold`.\\n /// @param _threshold New threshold.\\n function changeThreshold(uint256 _threshold) public authorized {\\n // Validate that threshold is smaller than number of owners.\\n require(_threshold <= ownerCount, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n threshold = _threshold;\\n emit ChangedThreshold(threshold);\\n }\\n\\n function getThreshold() public view returns (uint256) {\\n return threshold;\\n }\\n\\n function isOwner(address owner) public view returns (bool) {\\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\\n }\\n\\n /// @dev Returns array of owners.\\n /// @return Array of Safe owners.\\n function getOwners() public view returns (address[] memory) {\\n address[] memory array = new address[](ownerCount);\\n\\n // populate return array\\n uint256 index = 0;\\n address currentOwner = owners[SENTINEL_OWNERS];\\n while (currentOwner != SENTINEL_OWNERS) {\\n array[index] = currentOwner;\\n currentOwner = owners[currentOwner];\\n index++;\\n }\\n return array;\\n }\\n}\\n\",\"keccak256\":\"0x01a3d64cc0967f42ae63802409f5404d18352516ea2a6335005003d919ffcf12\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\\n/// @author Richard Meissner - \\ncontract EtherPaymentFallback {\\n event SafeReceived(address indexed sender, uint256 value);\\n\\n /// @dev Fallback function accepts Ether transactions.\\n receive() external payable {\\n emit SafeReceived(msg.sender, msg.value);\\n }\\n}\\n\",\"keccak256\":\"0x1a7928d29877da84a3d0df846d5cd933d48ee095c1bde0aa044e249b12e27a72\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SecuredTokenTransfer - Secure token transfer\\n/// @author Richard Meissner - \\ncontract SecuredTokenTransfer {\\n /// @dev Transfers a token and returns if it was a success\\n /// @param token Token that should be transferred\\n /// @param receiver Receiver to whom the token should be transferred\\n /// @param amount The amount of tokens that should be transferred\\n function transferToken(\\n address token,\\n address receiver,\\n uint256 amount\\n ) internal returns (bool transferred) {\\n // 0xa9059cbb - keccack(\\\"transfer(address,uint256)\\\")\\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // We write the return value to scratch space.\\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n switch returndatasize()\\n case 0 {\\n transferred := success\\n }\\n case 0x20 {\\n transferred := iszero(or(iszero(success), iszero(mload(0))))\\n }\\n default {\\n transferred := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x178682d8477da42936c7e8e24d39094c4ac08ecd8623794b9535d77001b665f1\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\\n/// @author Richard Meissner - \\ncontract SignatureDecoder {\\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\\n /// @param signatures concatenated rsv signatures\\n function signatureSplit(bytes memory signatures, uint256 pos)\\n internal\\n pure\\n returns (\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n )\\n {\\n // The signature format is a compact form of:\\n // {bytes32 r}{bytes32 s}{uint8 v}\\n // Compact means, uint8 is not padded to 32 bytes.\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let signaturePos := mul(0x41, pos)\\n r := mload(add(signatures, add(signaturePos, 0x20)))\\n s := mload(add(signatures, add(signaturePos, 0x40)))\\n // Here we are loading the last 32 bytes, including 31 bytes\\n // of 's'. There is no 'mload8' to do this.\\n //\\n // 'byte' is not working due to the Solidity parser, so lets\\n // use the second best option, 'and'\\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d37be182472ccfee62a33e9939f9b3d509be4c32e9fdebc2c1746c573655987\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\\n/// @author Richard Meissner - \\ncontract Singleton {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\\n // It should also always be ensured that the address is stored alone (uses a full word)\\n address private singleton;\\n}\\n\",\"keccak256\":\"0x6e02c18998de8834dd7d69890cb6ede996b6f635d2337081a596d91e35e2c648\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\\ncontract StorageAccessible {\\n /**\\n * @dev Reads `length` bytes of storage in the currents contract\\n * @param offset - the offset in the current contract's storage in words to start reading from\\n * @param length - the number of words (32 bytes) of data to read\\n * @return the bytes that were read.\\n */\\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\\n bytes memory result = new bytes(length * 32);\\n for (uint256 index = 0; index < length; index++) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let word := sload(add(offset, index))\\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Performs a delegetecall on a targetContract in the context of self.\\n * Internally reverts execution to avoid side effects (making it static).\\n *\\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\\n * Specifically, the `returndata` after a call to this method will be:\\n * `success:bool || response.length:uint256 || response:bytes`.\\n *\\n * @param targetContract Address of the contract containing the code to execute.\\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\\n */\\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\\n\\n mstore(0x00, success)\\n mstore(0x20, returndatasize())\\n returndatacopy(0x40, 0, returndatasize())\\n revert(0, add(returndatasize(), 0x40))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36853adb266c2ab7d3c612aca799441a86bd15d9e1d24fc6c70d63f5c2df3aaf\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title GnosisSafeMath\\n * @dev Math operations with safety checks that revert on error\\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\\n * TODO: remove once open zeppelin update to solc 0.5.0\\n */\\nlibrary GnosisSafeMath {\\n /**\\n * @dev Multiplies two numbers, reverts on overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Adds two numbers, reverts on overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x2a2b4d74f5834a9437be0cd3254d7a676698fc78aa47941c2009470196998d98\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2098,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"singleton","offset":0,"slot":"0","type":"t_address"},{"astId":1149,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"modules","offset":0,"slot":"1","type":"t_mapping(t_address,t_address)"},{"astId":1508,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"owners","offset":0,"slot":"2","type":"t_mapping(t_address,t_address)"},{"astId":1510,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"ownerCount","offset":0,"slot":"3","type":"t_uint256"},{"astId":1512,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"threshold","offset":0,"slot":"4","type":"t_uint256"},{"astId":82,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"nonce","offset":0,"slot":"5","type":"t_uint256"},{"astId":84,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"_deprecatedDomainSeparator","offset":0,"slot":"6","type":"t_bytes32"},{"astId":88,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"signedMessages","offset":0,"slot":"7","type":"t_mapping(t_bytes32,t_uint256)"},{"astId":94,"contract":"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol:GnosisSafe","label":"approvedHashes","offset":0,"slot":"8","type":"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(bytes32 => uint256))","numberOfBytes":"32","value":"t_mapping(t_bytes32,t_uint256)"},"t_mapping(t_bytes32,t_uint256)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addOwnerWithThreshold(address,uint256)":{"notice":"Adds the owner `owner` to the Safe and updates the threshold to `_threshold`."},"changeThreshold(uint256)":{"notice":"Changes the threshold of the Safe to `_threshold`."},"disableModule(address,address)":{"notice":"Disables the module `module` for the Safe."},"enableModule(address)":{"notice":"Enables the module `module` for the Safe."},"removeOwner(address,address,uint256)":{"notice":"Removes the owner `owner` from the Safe and updates the threshold to `_threshold`."},"requiredTxGas(address,uint256,bytes,uint8)":{"notice":"Deprecated in favor of common/StorageAccessible.sol and will be removed in next version."},"swapOwner(address,address,address)":{"notice":"Replaces the owner `oldOwner` in the Safe with `newOwner`."}},"version":1}}},"@gnosis.pm/safe-contracts/contracts/base/Executor.sol":{"Executor":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"Executor - A contract that can execute transactions","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122053479013c92ff7eb735364672df91ff0e289f101c0004958024e2d384786b78864736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 SELFBALANCE SWAP1 SGT 0xC9 0x2F 0xF7 0xEB PUSH20 0x5364672DF91FF0E289F101C0004958024E2D3847 DUP7 0xB7 DUP9 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"218:665:1:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea264697066735822122053479013c92ff7eb735364672df91ff0e289f101c0004958024e2d384786b78864736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 SELFBALANCE SWAP1 SGT 0xC9 0x2F 0xF7 0xEB PUSH20 0x5364672DF91FF0E289F101C0004958024E2D3847 DUP7 0xB7 DUP9 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"218:665:1:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"},"internal":{"execute(address,uint256,bytes memory,enum Enum.Operation,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"Executor - A contract that can execute transactions\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":\"Executor\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol":{"FallbackManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"handler","type":"address"}],"name":"ChangedFallbackHandler","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address","name":"handler","type":"address"}],"name":"setFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{"setFallbackHandler(address)":{"details":"Allows to add a contract to handle fallback calls. Only fallback calls without value and with data will be forwarded. This can only be done via a Safe transaction.","params":{"handler":"contract to handle fallbacks calls."}}},"title":"Fallback Manager - A contract that manages fallback calls made to this contract","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506101f7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f08a032314610084575b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061005557005b36600080373360601b365260008060143601600080855af190503d6000803e8061007e573d6000fd5b503d6000f35b610097610092366004610184565b610099565b005b6100a1610115565b6100c9817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b09060200160405180910390a150565b333014610182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640160405180910390fd5b565b60006020828403121561019657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146101ba57600080fd5b939250505056fea2646970667358221220e62baf8587b3ad1e8514b4309b4b715dea6ebc1a244d111a0d7c0fc60688e20764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F7 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF08A0323 EQ PUSH2 0x84 JUMPI JUMPDEST PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 DUP1 SLOAD DUP1 PUSH2 0x55 JUMPI STOP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY CALLER PUSH1 0x60 SHL CALLDATASIZE MSTORE PUSH1 0x0 DUP1 PUSH1 0x14 CALLDATASIZE ADD PUSH1 0x0 DUP1 DUP6 GAS CALL SWAP1 POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x7E JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST PUSH2 0x97 PUSH2 0x92 CALLDATASIZE PUSH1 0x4 PUSH2 0x184 JUMP JUMPDEST PUSH2 0x99 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xA1 PUSH2 0x115 JUMP JUMPDEST PUSH2 0xC9 DUP2 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0x5AC6C46C93C8D0E53714BA3B53DB3E7C046DA994313D7ED0D192028BC7C228B0 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x182 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE6 0x2B 0xAF DUP6 DUP8 0xB3 0xAD 0x1E DUP6 EQ 0xB4 ADDRESS SWAP12 0x4B PUSH18 0x5DEA6EBC1A244D111A0D7C0FC60688E20764 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"257:1926:2:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_1034":{"entryPoint":null,"id":1034,"parameterSlots":0,"returnSlots":0},"@internalSetFallbackHandler_1008":{"entryPoint":null,"id":1008,"parameterSlots":1,"returnSlots":0},"@requireSelfCall_2065":{"entryPoint":277,"id":2065,"parameterSlots":0,"returnSlots":0},"@setFallbackHandler_1025":{"entryPoint":153,"id":1025,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":388,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:889:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"84:239:111","statements":[{"body":{"nodeType":"YulBlock","src":"130:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"139:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"142:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"132:6:111"},"nodeType":"YulFunctionCall","src":"132:12:111"},"nodeType":"YulExpressionStatement","src":"132:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"105:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"114:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"101:3:111"},"nodeType":"YulFunctionCall","src":"101:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"126:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"97:3:111"},"nodeType":"YulFunctionCall","src":"97:32:111"},"nodeType":"YulIf","src":"94:52:111"},{"nodeType":"YulVariableDeclaration","src":"155:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"181:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"168:12:111"},"nodeType":"YulFunctionCall","src":"168:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"159:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"277:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"286:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"289:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"279:6:111"},"nodeType":"YulFunctionCall","src":"279:12:111"},"nodeType":"YulExpressionStatement","src":"279:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"213:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"224:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"231:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"220:3:111"},"nodeType":"YulFunctionCall","src":"220:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"210:2:111"},"nodeType":"YulFunctionCall","src":"210:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"203:6:111"},"nodeType":"YulFunctionCall","src":"203:73:111"},"nodeType":"YulIf","src":"200:93:111"},{"nodeType":"YulAssignment","src":"302:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"312:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"302:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"61:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"73:6:111","type":""}],"src":"14:309:111"},{"body":{"nodeType":"YulBlock","src":"429:125:111","statements":[{"nodeType":"YulAssignment","src":"439:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"462:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"447:3:111"},"nodeType":"YulFunctionCall","src":"447:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"439:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"481:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"496:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"492:3:111"},"nodeType":"YulFunctionCall","src":"492:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"474:6:111"},"nodeType":"YulFunctionCall","src":"474:74:111"},"nodeType":"YulExpressionStatement","src":"474:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"398:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"409:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"420:4:111","type":""}],"src":"328:226:111"},{"body":{"nodeType":"YulBlock","src":"733:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"750:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"761:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"743:6:111"},"nodeType":"YulFunctionCall","src":"743:21:111"},"nodeType":"YulExpressionStatement","src":"743:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"784:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"795:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"780:3:111"},"nodeType":"YulFunctionCall","src":"780:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"800:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"773:6:111"},"nodeType":"YulFunctionCall","src":"773:29:111"},"nodeType":"YulExpressionStatement","src":"773:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"822:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"833:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"818:3:111"},"nodeType":"YulFunctionCall","src":"818:18:111"},{"hexValue":"4753303331","kind":"string","nodeType":"YulLiteral","src":"838:7:111","type":"","value":"GS031"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"811:6:111"},"nodeType":"YulFunctionCall","src":"811:35:111"},"nodeType":"YulExpressionStatement","src":"811:35:111"},{"nodeType":"YulAssignment","src":"855:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"878:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"863:3:111"},"nodeType":"YulFunctionCall","src":"863:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"855:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"710:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"724:4:111","type":""}],"src":"559:328:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS031\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f08a032314610084575b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061005557005b36600080373360601b365260008060143601600080855af190503d6000803e8061007e573d6000fd5b503d6000f35b610097610092366004610184565b610099565b005b6100a1610115565b6100c9817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b09060200160405180910390a150565b333014610182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640160405180910390fd5b565b60006020828403121561019657600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146101ba57600080fd5b939250505056fea2646970667358221220e62baf8587b3ad1e8514b4309b4b715dea6ebc1a244d111a0d7c0fc60688e20764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF08A0323 EQ PUSH2 0x84 JUMPI JUMPDEST PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 DUP1 SLOAD DUP1 PUSH2 0x55 JUMPI STOP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY CALLER PUSH1 0x60 SHL CALLDATASIZE MSTORE PUSH1 0x0 DUP1 PUSH1 0x14 CALLDATASIZE ADD PUSH1 0x0 DUP1 DUP6 GAS CALL SWAP1 POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x7E JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST PUSH2 0x97 PUSH2 0x92 CALLDATASIZE PUSH1 0x4 PUSH2 0x184 JUMP JUMPDEST PUSH2 0x99 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xA1 PUSH2 0x115 JUMP JUMPDEST PUSH2 0xC9 DUP2 PUSH32 0x6C9A6C4A39284E37ED1CF53D337577D14212A4870FB976A4366C693B939918D5 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0x5AC6C46C93C8D0E53714BA3B53DB3E7C046DA994313D7ED0D192028BC7C228B0 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x182 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE6 0x2B 0xAF DUP6 DUP8 0xB3 0xAD 0x1E DUP6 EQ 0xB4 ADDRESS SWAP12 0x4B PUSH18 0x5DEA6EBC1A244D111A0D7C0FC60688E20764 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"257:1926:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;469:66;1467:11;;;1491:63;;1528:12;1491:63;1586:14;1583:1;1580;1567:34;1823:8;1819:2;1815:17;1799:14;1792:41;1981:1;1978;1973:2;1957:14;1953:23;1950:1;1947;1938:7;1931:5;1926:57;1911:72;;2017:16;2014:1;2011;1996:38;2057:7;2047:78;;2094:16;2091:1;2084:27;2047:78;;2148:16;2145:1;2138:27;1052:161;;;;;;:::i;:::-;;:::i;:::-;;;440:17:9;:15;:17::i;:::-;1125:35:2::1;1152:7;469:66:::0;747:21;542:242;1125:35:::1;1175:31;::::0;504:42:111;492:55;;474:74;;1175:31:2::1;::::0;462:2:111;447:18;1175:31:2::1;;;;;;;1052:161:::0;:::o;231:102:9:-;289:10;311:4;289:27;281:45;;;;;;;761:2:111;281:45:9;;;743:21:111;800:1;780:18;;;773:29;838:7;818:18;;;811:35;863:18;;281:45:9;;;;;;;;231:102::o;14:309:111:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;231:42;224:5;220:54;213:5;210:65;200:93;;289:1;286;279:12;200:93;312:5;14:309;-1:-1:-1;;;14:309:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"100600","executionCost":"147","totalCost":"100747"},"external":{"":"infinite","setFallbackHandler(address)":"23461"},"internal":{"internalSetFallbackHandler(address)":"infinite"}},"methodIdentifiers":{"setFallbackHandler(address)":"f08a0323"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"ChangedFallbackHandler\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"setFallbackHandler(address)\":{\"details\":\"Allows to add a contract to handle fallback calls. Only fallback calls without value and with data will be forwarded. This can only be done via a Safe transaction.\",\"params\":{\"handler\":\"contract to handle fallbacks calls.\"}}},\"title\":\"Fallback Manager - A contract that manages fallback calls made to this contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":\"FallbackManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract FallbackManager is SelfAuthorized {\\n event ChangedFallbackHandler(address handler);\\n\\n // keccak256(\\\"fallback_manager.handler.address\\\")\\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\\n\\n function internalSetFallbackHandler(address handler) internal {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, handler)\\n }\\n }\\n\\n /// @dev Allows to add a contract to handle fallback calls.\\n /// Only fallback calls without value and with data will be forwarded.\\n /// This can only be done via a Safe transaction.\\n /// @param handler contract to handle fallbacks calls.\\n function setFallbackHandler(address handler) public authorized {\\n internalSetFallbackHandler(handler);\\n emit ChangedFallbackHandler(handler);\\n }\\n\\n // solhint-disable-next-line payable-fallback,no-complex-fallback\\n fallback() external {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let handler := sload(slot)\\n if iszero(handler) {\\n return(0, 0)\\n }\\n calldatacopy(0, 0, calldatasize())\\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\\n // Then the address without padding is stored right after the calldata\\n mstore(calldatasize(), shl(96, caller()))\\n // Add 20 bytes for the address appended add the end\\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if iszero(success) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1be9f0f3e80a78134c2e3a026c6a14759785bd35d135e87a4a025aeb6742791f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol":{"Guard":{"abi":[{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"bool","name":"success","type":"bool"}],"name":"checkAfterExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address payable","name":"refundReceiver","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"address","name":"msgSender","type":"address"}],"name":"checkTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"checkAfterExecution(bytes32,bool)":"93271368","checkTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes,address)":"75f0bb52"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"checkAfterExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"}],\"name\":\"checkTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":\"Guard\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}},"GuardManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"guard","type":"address"}],"name":"ChangedGuard","type":"event"},{"inputs":[{"internalType":"address","name":"guard","type":"address"}],"name":"setGuard","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{"setGuard(address)":{"details":"Set a guard that checks transactions before execution","params":{"guard":"The address of the guard to be used or the 0 address to disable the guard"}}},"title":"Fallback Manager - A contract that manages fallback calls made to this contract","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506101a0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e19a9dd914610030575b600080fd5b61004361003e36600461012d565b610045565b005b61004d6100be565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa29060200160405180910390a15050565b33301461012b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640160405180910390fd5b565b60006020828403121561013f57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461016357600080fd5b939250505056fea26469706673582212205fac3fe065af82bb54d360f80095b2a0233dc285d766b767e8d3a4d7012242c264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A0 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xE19A9DD9 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x12D JUMP JUMPDEST PUSH2 0x45 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x4D PUSH2 0xBE JUMP JUMPDEST PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0x1151116914515BC0891FF9047A6CB32CF902546F83066499BCF8BA33D2353FA2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x12B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x163 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F 0xAC EXTCODEHASH 0xE0 PUSH6 0xAF82BB54D360 0xF8 STOP SWAP6 0xB2 LOG0 0x23 RETURNDATASIZE 0xC2 DUP6 0xD7 PUSH7 0xB767E8D3A4D701 0x22 TIMESTAMP 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"735:903:3:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@requireSelfCall_2065":{"entryPoint":190,"id":2065,"parameterSlots":0,"returnSlots":0},"@setGuard_1101":{"entryPoint":69,"id":1101,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":301,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:889:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"84:239:111","statements":[{"body":{"nodeType":"YulBlock","src":"130:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"139:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"142:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"132:6:111"},"nodeType":"YulFunctionCall","src":"132:12:111"},"nodeType":"YulExpressionStatement","src":"132:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"105:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"114:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"101:3:111"},"nodeType":"YulFunctionCall","src":"101:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"126:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"97:3:111"},"nodeType":"YulFunctionCall","src":"97:32:111"},"nodeType":"YulIf","src":"94:52:111"},{"nodeType":"YulVariableDeclaration","src":"155:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"181:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"168:12:111"},"nodeType":"YulFunctionCall","src":"168:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"159:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"277:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"286:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"289:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"279:6:111"},"nodeType":"YulFunctionCall","src":"279:12:111"},"nodeType":"YulExpressionStatement","src":"279:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"213:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"224:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"231:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"220:3:111"},"nodeType":"YulFunctionCall","src":"220:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"210:2:111"},"nodeType":"YulFunctionCall","src":"210:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"203:6:111"},"nodeType":"YulFunctionCall","src":"203:73:111"},"nodeType":"YulIf","src":"200:93:111"},{"nodeType":"YulAssignment","src":"302:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"312:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"302:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"61:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"73:6:111","type":""}],"src":"14:309:111"},{"body":{"nodeType":"YulBlock","src":"429:125:111","statements":[{"nodeType":"YulAssignment","src":"439:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"462:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"447:3:111"},"nodeType":"YulFunctionCall","src":"447:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"439:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"481:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"496:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"492:3:111"},"nodeType":"YulFunctionCall","src":"492:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"474:6:111"},"nodeType":"YulFunctionCall","src":"474:74:111"},"nodeType":"YulExpressionStatement","src":"474:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"398:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"409:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"420:4:111","type":""}],"src":"328:226:111"},{"body":{"nodeType":"YulBlock","src":"733:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"750:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"761:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"743:6:111"},"nodeType":"YulFunctionCall","src":"743:21:111"},"nodeType":"YulExpressionStatement","src":"743:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"784:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"795:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"780:3:111"},"nodeType":"YulFunctionCall","src":"780:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"800:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"773:6:111"},"nodeType":"YulFunctionCall","src":"773:29:111"},"nodeType":"YulExpressionStatement","src":"773:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"822:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"833:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"818:3:111"},"nodeType":"YulFunctionCall","src":"818:18:111"},{"hexValue":"4753303331","kind":"string","nodeType":"YulLiteral","src":"838:7:111","type":"","value":"GS031"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"811:6:111"},"nodeType":"YulFunctionCall","src":"811:35:111"},"nodeType":"YulExpressionStatement","src":"811:35:111"},{"nodeType":"YulAssignment","src":"855:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"878:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"863:3:111"},"nodeType":"YulFunctionCall","src":"863:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"855:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"710:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"724:4:111","type":""}],"src":"559:328:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS031\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e19a9dd914610030575b600080fd5b61004361003e36600461012d565b610045565b005b61004d6100be565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa29060200160405180910390a15050565b33301461012b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640160405180910390fd5b565b60006020828403121561013f57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461016357600080fd5b939250505056fea26469706673582212205fac3fe065af82bb54d360f80095b2a0233dc285d766b767e8d3a4d7012242c264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xE19A9DD9 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x12D JUMP JUMPDEST PUSH2 0x45 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x4D PUSH2 0xBE JUMP JUMPDEST PUSH32 0x4A204F620C8C5CCDCA3FD54D003BADD85BA500436A431F0CBDA4F558C93C34C8 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0x1151116914515BC0891FF9047A6CB32CF902546F83066499BCF8BA33D2353FA2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x12B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x163 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F 0xAC EXTCODEHASH 0xE0 PUSH6 0xAF82BB54D360 0xF8 STOP SWAP6 0xB2 LOG0 0x23 RETURNDATASIZE 0xC2 DUP6 0xD7 PUSH7 0xB767E8D3A4D701 0x22 TIMESTAMP 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"735:903:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1150:254;;;;;;:::i;:::-;;:::i;:::-;;;440:17:9;:15;:17::i;:::-;915:66:3::1;1335:19:::0;;;1378::::1;::::0;504:42:111;492:55;;474:74;;1378:19:3::1;::::0;462:2:111;447:18;1378:19:3::1;;;;;;;1203:201;1150:254:::0;:::o;231:102:9:-;289:10;311:4;289:27;281:45;;;;;;;761:2:111;281:45:9;;;743:21:111;800:1;780:18;;;773:29;838:7;818:18;;;811:35;863:18;;281:45:9;;;;;;;;231:102::o;14:309:111:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;231:42;224:5;220:54;213:5;210:65;200:93;;289:1;286;279:12;200:93;312:5;14:309;-1:-1:-1;;;14:309:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"83200","executionCost":"129","totalCost":"83329"},"external":{"setGuard(address)":"23454"},"internal":{"getGuard()":"infinite"}},"methodIdentifiers":{"setGuard(address)":"e19a9dd9"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"ChangedGuard\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"setGuard\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"setGuard(address)\":{\"details\":\"Set a guard that checks transactions before execution\",\"params\":{\"guard\":\"The address of the guard to be used or the 0 address to disable the guard\"}}},\"title\":\"Fallback Manager - A contract that manages fallback calls made to this contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":\"GuardManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol":{"ModuleManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"DisabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"EnabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleSuccess","type":"event"},{"inputs":[{"internalType":"address","name":"prevModule","type":"address"},{"internalType":"address","name":"module","type":"address"}],"name":"disableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"enableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModule","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModuleReturnData","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"start","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getModulesPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"isModuleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"author":"Stefan George - Richard Meissner - ","kind":"dev","methods":{"disableModule(address,address)":{"details":"Allows to remove a module from the whitelist. This can only be done via a Safe transaction.","params":{"module":"Module to be removed.","prevModule":"Module that pointed to the module to be removed in the linked list"}},"enableModule(address)":{"details":"Allows to add a module to the whitelist. This can only be done via a Safe transaction.","params":{"module":"Module to be whitelisted."}},"execTransactionFromModule(address,uint256,bytes,uint8)":{"details":"Allows a Module to execute a Safe transaction without any further confirmations.","params":{"data":"Data payload of module transaction.","operation":"Operation type of module transaction.","to":"Destination address of module transaction.","value":"Ether value of module transaction."}},"execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":{"details":"Allows a Module to execute a Safe transaction without any further confirmations and return data","params":{"data":"Data payload of module transaction.","operation":"Operation type of module transaction.","to":"Destination address of module transaction.","value":"Ether value of module transaction."}},"getModulesPaginated(address,uint256)":{"details":"Returns array of modules.","params":{"pageSize":"Maximum number of modules that should be returned.","start":"Start of the page."},"returns":{"array":"Array of modules.","next":"Start of the next page."}},"isModuleEnabled(address)":{"details":"Returns if an module is enabled","returns":{"_0":"True if the module is enabled"}}},"title":"Module Manager - A contract that manages modules that can execute transactions via this contract","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610c34806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063610b592511610050578063610b5925146100d3578063cc2f8452146100e8578063e009cfde1461010957600080fd5b80632d9ad53d14610077578063468721a71461009f5780635229073f146100b2575b600080fd5b61008a610085366004610896565b61011c565b60405190151581526020015b60405180910390f35b61008a6100ad3660046108f6565b610171565b6100c56100c03660046108f6565b61028c565b6040516100969291906109f0565b6100e66100e1366004610896565b6102c2565b005b6100fb6100f6366004610a6d565b6104b2565b604051610096929190610a97565b6100e6610117366004610b0e565b6105df565b6000600173ffffffffffffffffffffffffffffffffffffffff83161480159061016b575073ffffffffffffffffffffffffffffffffffffffff8281166000908152602081905260409020541615155b92915050565b6000336001148015906101a857503360009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b610213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610220858585855a6107bb565b905080156102585760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610284565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b6000606061029c86868686610171565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b6102ca610802565b73ffffffffffffffffffffffffffffffffffffffff811615801590610306575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61036c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313031000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526020819052604090205416156103fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313032000000000000000000000000000000000000000000000000000000604482015260640161020a565b600060208181527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d805473ffffffffffffffffffffffffffffffffffffffff85811680865260408087208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560019095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440910160405180910390a150565b606060008267ffffffffffffffff8111156104cf576104cf6108b8565b6040519080825280602002602001820160405280156104f8578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff80861660009081526020819052604081205492945091165b73ffffffffffffffffffffffffffffffffffffffff811615801590610562575073ffffffffffffffffffffffffffffffffffffffff8116600114155b801561056d57508482105b156105d1578084838151811061058557610585610b41565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915291811660009081529182905260409091205416816105c981610b70565b925050610526565b908352919491935090915050565b6105e7610802565b73ffffffffffffffffffffffffffffffffffffffff811615801590610623575073ffffffffffffffffffffffffffffffffffffffff8116600114155b610689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313031000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526020819052604090205481169082161461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313033000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260208181526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276910160405180910390a15050565b600060018360018111156107d1576107d1610bcf565b036107e9576000808551602087018986f490506107f9565b600080855160208701888a87f190505b95945050505050565b33301461086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640161020a565b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461089157600080fd5b919050565b6000602082840312156108a857600080fd5b6108b18261086d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80356002811061089157600080fd5b6000806000806080858703121561090c57600080fd5b6109158561086d565b935060208501359250604085013567ffffffffffffffff8082111561093957600080fd5b818701915087601f83011261094d57600080fd5b81358181111561095f5761095f6108b8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109a5576109a56108b8565b816040528281528a60208487010111156109be57600080fd5b8260208601602083013760006020848301015280965050505050506109e5606086016108e7565b905092959194509250565b821515815260006020604081840152835180604085015260005b81811015610a2657858101830151858201606001528201610a0a565b81811115610a38576000606083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201606001949350505050565b60008060408385031215610a8057600080fd5b610a898361086d565b946020939093013593505050565b604080825283519082018190526000906020906060840190828701845b82811015610ae657815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610ab4565b50505073ffffffffffffffffffffffffffffffffffffffff9490941692019190915250919050565b60008060408385031215610b2157600080fd5b610b2a8361086d565b9150610b386020840161086d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea26469706673582212206a9606c982ca7c1966a7469c242e19fadbd8aaffde954170d36d585dccf6ca9864736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC34 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x72 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x610B5925 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x610B5925 EQ PUSH2 0xD3 JUMPI DUP1 PUSH4 0xCC2F8452 EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0xE009CFDE EQ PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2D9AD53D EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0x468721A7 EQ PUSH2 0x9F JUMPI DUP1 PUSH4 0x5229073F EQ PUSH2 0xB2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x896 JUMP JUMPDEST PUSH2 0x11C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x8F6 JUMP JUMPDEST PUSH2 0x171 JUMP JUMPDEST PUSH2 0xC5 PUSH2 0xC0 CALLDATASIZE PUSH1 0x4 PUSH2 0x8F6 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x96 SWAP3 SWAP2 SWAP1 PUSH2 0x9F0 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0xE1 CALLDATASIZE PUSH1 0x4 PUSH2 0x896 JUMP JUMPDEST PUSH2 0x2C2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH2 0xF6 CALLDATASIZE PUSH1 0x4 PUSH2 0xA6D JUMP JUMPDEST PUSH2 0x4B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x96 SWAP3 SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x117 CALLDATASIZE PUSH1 0x4 PUSH2 0xB0E JUMP JUMPDEST PUSH2 0x5DF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND EQ DUP1 ISZERO SWAP1 PUSH2 0x16B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x1A8 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO JUMPDEST PUSH2 0x213 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x220 DUP6 DUP6 DUP6 DUP6 GAS PUSH2 0x7BB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x258 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0x6895C13664AA4F67288B25D7A21D7AAA34916E355FB9B6FAE0A139A9085BECB8 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x284 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0xACD2C8702804128FDB0DB2BB49F6D127DD0181C13FD45DBFE16DE0930E2BD375 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x29C DUP7 DUP7 DUP7 DUP7 PUSH2 0x171 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 MLOAD PUSH1 0x20 RETURNDATASIZE ADD DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY DUP1 SWAP2 POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x2CA PUSH2 0x802 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x306 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x36C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x3FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND DUP1 DUP7 MSTORE PUSH1 0x40 DUP1 DUP8 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SWAP4 SSTORE PUSH1 0x1 SWAP1 SWAP6 MSTORE DUP3 SLOAD AND DUP5 OR SWAP1 SWAP2 SSTORE MLOAD SWAP2 DUP3 MSTORE PUSH32 0xECDF3A3EFFEA5783A3C4C2140E677577666428D44ED9D474A0B3A4C9943F8440 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4CF JUMPI PUSH2 0x4CF PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x4F8 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP5 POP SWAP2 AND JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x562 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x56D JUMPI POP DUP5 DUP3 LT JUMPDEST ISZERO PUSH2 0x5D1 JUMPI DUP1 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x585 JUMPI PUSH2 0x585 PUSH2 0xB41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x5C9 DUP2 PUSH2 0xB70 JUMP JUMPDEST SWAP3 POP POP PUSH2 0x526 JUMP JUMPDEST SWAP1 DUP4 MSTORE SWAP2 SWAP5 SWAP2 SWAP4 POP SWAP1 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5E7 PUSH2 0x802 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x623 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x689 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x71C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 DUP8 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD SWAP2 SWAP1 SWAP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xAAB4FA2B463F581B2B32CB3B7E3B704B9CE37CC209B5FB4D77E593ACE4054276 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x7D1 JUMPI PUSH2 0x7D1 PUSH2 0xBCF JUMP JUMPDEST SUB PUSH2 0x7E9 JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x7F9 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x86B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B1 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x915 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x939 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x94D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x95F JUMPI PUSH2 0x95F PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x9A5 JUMPI PUSH2 0x9A5 PUSH2 0x8B8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x9BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP7 POP POP POP POP POP POP PUSH2 0x9E5 PUSH1 0x60 DUP7 ADD PUSH2 0x8E7 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x40 DUP2 DUP5 ADD MSTORE DUP4 MLOAD DUP1 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA26 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x60 ADD MSTORE DUP3 ADD PUSH2 0xA0A JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xA38 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x60 ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA89 DUP4 PUSH2 0x86D JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xAE6 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xAB4 JUMP JUMPDEST POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB2A DUP4 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP PUSH2 0xB38 PUSH1 0x20 DUP5 ADD PUSH2 0x86D JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0xBC8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0x9606C982CA7C1966A7469C 0x24 0x2E NOT STATICCALL 0xDB 0xD8 0xAA SELFDESTRUCT 0xDE SWAP6 COINBASE PUSH17 0xD36D585DCCF6CA9864736F6C634300080F STOP CALLER ","sourceMap":"374:5660:4:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@disableModule_1304":{"entryPoint":1503,"id":1304,"parameterSlots":2,"returnSlots":0},"@enableModule_1249":{"entryPoint":706,"id":1249,"parameterSlots":1,"returnSlots":0},"@execTransactionFromModuleReturnData_1389":{"entryPoint":652,"id":1389,"parameterSlots":4,"returnSlots":2},"@execTransactionFromModule_1361":{"entryPoint":369,"id":1361,"parameterSlots":4,"returnSlots":1},"@execute_983":{"entryPoint":1979,"id":983,"parameterSlots":5,"returnSlots":1},"@getModulesPaginated_1479":{"entryPoint":1202,"id":1479,"parameterSlots":2,"returnSlots":2},"@isModuleEnabled_1411":{"entryPoint":284,"id":1411,"parameterSlots":1,"returnSlots":1},"@requireSelfCall_2065":{"entryPoint":2050,"id":2065,"parameterSlots":0,"returnSlots":0},"abi_decode_address":{"entryPoint":2157,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_enum_Operation":{"entryPoint":2279,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":2198,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_address":{"entryPoint":2830,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":2669,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997":{"entryPoint":2294,"id":null,"parameterSlots":2,"returnSlots":4},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed":{"entryPoint":2711,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":2544,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":2928,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x21":{"entryPoint":3023,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":2881,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":2232,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:6862:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:147:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"190:6:111"},"nodeType":"YulFunctionCall","src":"190:12:111"},"nodeType":"YulExpressionStatement","src":"190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:73:111"},"nodeType":"YulIf","src":"111:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:196:111"},{"body":{"nodeType":"YulBlock","src":"285:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"331:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"343:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"333:6:111"},"nodeType":"YulFunctionCall","src":"333:12:111"},"nodeType":"YulExpressionStatement","src":"333:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"306:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"315:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"302:3:111"},"nodeType":"YulFunctionCall","src":"302:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"327:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"298:3:111"},"nodeType":"YulFunctionCall","src":"298:32:111"},"nodeType":"YulIf","src":"295:52:111"},{"nodeType":"YulAssignment","src":"356:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"385:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"366:18:111"},"nodeType":"YulFunctionCall","src":"366:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"356:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"251:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"262:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"274:6:111","type":""}],"src":"215:186:111"},{"body":{"nodeType":"YulBlock","src":"501:92:111","statements":[{"nodeType":"YulAssignment","src":"511:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"523:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"534:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"519:3:111"},"nodeType":"YulFunctionCall","src":"519:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"511:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"553:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"578:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"571:6:111"},"nodeType":"YulFunctionCall","src":"571:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"564:6:111"},"nodeType":"YulFunctionCall","src":"564:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"546:6:111"},"nodeType":"YulFunctionCall","src":"546:41:111"},"nodeType":"YulExpressionStatement","src":"546:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"470:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"481:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"492:4:111","type":""}],"src":"406:187:111"},{"body":{"nodeType":"YulBlock","src":"630:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"647:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"650:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"640:6:111"},"nodeType":"YulFunctionCall","src":"640:88:111"},"nodeType":"YulExpressionStatement","src":"640:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"744:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"747:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"737:6:111"},"nodeType":"YulFunctionCall","src":"737:15:111"},"nodeType":"YulExpressionStatement","src":"737:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"768:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"771:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"761:6:111"},"nodeType":"YulFunctionCall","src":"761:15:111"},"nodeType":"YulExpressionStatement","src":"761:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"598:184:111"},{"body":{"nodeType":"YulBlock","src":"843:94:111","statements":[{"nodeType":"YulAssignment","src":"853:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"875:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"862:12:111"},"nodeType":"YulFunctionCall","src":"862:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"853:5:111"}]},{"body":{"nodeType":"YulBlock","src":"915:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"924:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"927:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"917:6:111"},"nodeType":"YulFunctionCall","src":"917:12:111"},"nodeType":"YulExpressionStatement","src":"917:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"904:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"911:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"901:2:111"},"nodeType":"YulFunctionCall","src":"901:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"894:6:111"},"nodeType":"YulFunctionCall","src":"894:20:111"},"nodeType":"YulIf","src":"891:40:111"}]},"name":"abi_decode_enum_Operation","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"822:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"833:5:111","type":""}],"src":"787:150:111"},{"body":{"nodeType":"YulBlock","src":"1086:1074:111","statements":[{"body":{"nodeType":"YulBlock","src":"1133:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1142:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1145:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1135:6:111"},"nodeType":"YulFunctionCall","src":"1135:12:111"},"nodeType":"YulExpressionStatement","src":"1135:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1107:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1116:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1103:3:111"},"nodeType":"YulFunctionCall","src":"1103:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1128:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1099:3:111"},"nodeType":"YulFunctionCall","src":"1099:33:111"},"nodeType":"YulIf","src":"1096:53:111"},{"nodeType":"YulAssignment","src":"1158:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1187:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1168:18:111"},"nodeType":"YulFunctionCall","src":"1168:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1158:6:111"}]},{"nodeType":"YulAssignment","src":"1206:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1233:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1244:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1229:3:111"},"nodeType":"YulFunctionCall","src":"1229:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1216:12:111"},"nodeType":"YulFunctionCall","src":"1216:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1206:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1257:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1288:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1299:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1284:3:111"},"nodeType":"YulFunctionCall","src":"1284:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1271:12:111"},"nodeType":"YulFunctionCall","src":"1271:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1261:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1312:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1322:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1316:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1367:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1376:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1379:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1369:6:111"},"nodeType":"YulFunctionCall","src":"1369:12:111"},"nodeType":"YulExpressionStatement","src":"1369:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1355:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1363:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1352:2:111"},"nodeType":"YulFunctionCall","src":"1352:14:111"},"nodeType":"YulIf","src":"1349:34:111"},{"nodeType":"YulVariableDeclaration","src":"1392:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1406:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1417:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1402:3:111"},"nodeType":"YulFunctionCall","src":"1402:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1396:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1472:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1481:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1484:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1474:6:111"},"nodeType":"YulFunctionCall","src":"1474:12:111"},"nodeType":"YulExpressionStatement","src":"1474:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1451:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1455:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1447:3:111"},"nodeType":"YulFunctionCall","src":"1447:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1462:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1443:3:111"},"nodeType":"YulFunctionCall","src":"1443:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1436:6:111"},"nodeType":"YulFunctionCall","src":"1436:35:111"},"nodeType":"YulIf","src":"1433:55:111"},{"nodeType":"YulVariableDeclaration","src":"1497:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1520:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1507:12:111"},"nodeType":"YulFunctionCall","src":"1507:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"1501:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1546:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1548:16:111"},"nodeType":"YulFunctionCall","src":"1548:18:111"},"nodeType":"YulExpressionStatement","src":"1548:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1538:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1542:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1535:2:111"},"nodeType":"YulFunctionCall","src":"1535:10:111"},"nodeType":"YulIf","src":"1532:36:111"},{"nodeType":"YulVariableDeclaration","src":"1577:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1587:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"1581:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1662:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1682:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1676:5:111"},"nodeType":"YulFunctionCall","src":"1676:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1666:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1694:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1716:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1740:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1744:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1736:3:111"},"nodeType":"YulFunctionCall","src":"1736:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1751:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1732:3:111"},"nodeType":"YulFunctionCall","src":"1732:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1756:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1728:3:111"},"nodeType":"YulFunctionCall","src":"1728:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1761:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1724:3:111"},"nodeType":"YulFunctionCall","src":"1724:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1712:3:111"},"nodeType":"YulFunctionCall","src":"1712:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1698:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1824:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1826:16:111"},"nodeType":"YulFunctionCall","src":"1826:18:111"},"nodeType":"YulExpressionStatement","src":"1826:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1783:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1795:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1780:2:111"},"nodeType":"YulFunctionCall","src":"1780:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1803:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1815:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1800:2:111"},"nodeType":"YulFunctionCall","src":"1800:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1777:2:111"},"nodeType":"YulFunctionCall","src":"1777:46:111"},"nodeType":"YulIf","src":"1774:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1862:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1866:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1855:6:111"},"nodeType":"YulFunctionCall","src":"1855:22:111"},"nodeType":"YulExpressionStatement","src":"1855:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1893:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1901:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1886:6:111"},"nodeType":"YulFunctionCall","src":"1886:18:111"},"nodeType":"YulExpressionStatement","src":"1886:18:111"},{"body":{"nodeType":"YulBlock","src":"1950:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1959:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1962:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1952:6:111"},"nodeType":"YulFunctionCall","src":"1952:12:111"},"nodeType":"YulExpressionStatement","src":"1952:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1927:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1931:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1923:3:111"},"nodeType":"YulFunctionCall","src":"1923:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"1936:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1919:3:111"},"nodeType":"YulFunctionCall","src":"1919:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1941:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1916:2:111"},"nodeType":"YulFunctionCall","src":"1916:33:111"},"nodeType":"YulIf","src":"1913:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1992:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2000:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1988:3:111"},"nodeType":"YulFunctionCall","src":"1988:15:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2009:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2013:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2005:3:111"},"nodeType":"YulFunctionCall","src":"2005:11:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2018:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1975:12:111"},"nodeType":"YulFunctionCall","src":"1975:46:111"},"nodeType":"YulExpressionStatement","src":"1975:46:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2045:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2053:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2041:3:111"},"nodeType":"YulFunctionCall","src":"2041:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2058:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2037:3:111"},"nodeType":"YulFunctionCall","src":"2037:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"2063:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2030:6:111"},"nodeType":"YulFunctionCall","src":"2030:35:111"},"nodeType":"YulExpressionStatement","src":"2030:35:111"},{"nodeType":"YulAssignment","src":"2074:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"2084:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2074:6:111"}]},{"nodeType":"YulAssignment","src":"2099:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2139:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2150:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2135:3:111"},"nodeType":"YulFunctionCall","src":"2135:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"2109:25:111"},"nodeType":"YulFunctionCall","src":"2109:45:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2099:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1028:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1039:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1051:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1059:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1067:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1075:6:111","type":""}],"src":"942:1218:111"},{"body":{"nodeType":"YulBlock","src":"2306:594:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2323:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2348:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2341:6:111"},"nodeType":"YulFunctionCall","src":"2341:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2334:6:111"},"nodeType":"YulFunctionCall","src":"2334:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2316:6:111"},"nodeType":"YulFunctionCall","src":"2316:41:111"},"nodeType":"YulExpressionStatement","src":"2316:41:111"},{"nodeType":"YulVariableDeclaration","src":"2366:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2376:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2370:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2398:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2409:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2394:3:111"},"nodeType":"YulFunctionCall","src":"2394:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2414:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2387:6:111"},"nodeType":"YulFunctionCall","src":"2387:30:111"},"nodeType":"YulExpressionStatement","src":"2387:30:111"},{"nodeType":"YulVariableDeclaration","src":"2426:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2446:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2440:5:111"},"nodeType":"YulFunctionCall","src":"2440:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"2430:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2473:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2484:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2469:3:111"},"nodeType":"YulFunctionCall","src":"2469:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"2489:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2462:6:111"},"nodeType":"YulFunctionCall","src":"2462:34:111"},"nodeType":"YulExpressionStatement","src":"2462:34:111"},{"nodeType":"YulVariableDeclaration","src":"2505:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2514:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"2509:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2574:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2603:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"2614:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2599:3:111"},"nodeType":"YulFunctionCall","src":"2599:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"2618:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2595:3:111"},"nodeType":"YulFunctionCall","src":"2595:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2637:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"2645:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2633:3:111"},"nodeType":"YulFunctionCall","src":"2633:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2649:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2629:3:111"},"nodeType":"YulFunctionCall","src":"2629:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2623:5:111"},"nodeType":"YulFunctionCall","src":"2623:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2588:6:111"},"nodeType":"YulFunctionCall","src":"2588:66:111"},"nodeType":"YulExpressionStatement","src":"2588:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2535:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2538:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2532:2:111"},"nodeType":"YulFunctionCall","src":"2532:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2546:19:111","statements":[{"nodeType":"YulAssignment","src":"2548:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2557:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2560:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2553:3:111"},"nodeType":"YulFunctionCall","src":"2553:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"2548:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2528:3:111","statements":[]},"src":"2524:140:111"},{"body":{"nodeType":"YulBlock","src":"2698:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2727:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"2738:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2723:3:111"},"nodeType":"YulFunctionCall","src":"2723:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2719:3:111"},"nodeType":"YulFunctionCall","src":"2719:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"2752:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2712:6:111"},"nodeType":"YulFunctionCall","src":"2712:42:111"},"nodeType":"YulExpressionStatement","src":"2712:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2679:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2682:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2676:2:111"},"nodeType":"YulFunctionCall","src":"2676:13:111"},"nodeType":"YulIf","src":"2673:91:111"},{"nodeType":"YulAssignment","src":"2773:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2789:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2808:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2816:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2804:3:111"},"nodeType":"YulFunctionCall","src":"2804:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2821:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2800:3:111"},"nodeType":"YulFunctionCall","src":"2800:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2785:3:111"},"nodeType":"YulFunctionCall","src":"2785:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"2891:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2781:3:111"},"nodeType":"YulFunctionCall","src":"2781:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2773:4:111"}]}]},"name":"abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2267:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2278:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2286:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2297:4:111","type":""}],"src":"2165:735:111"},{"body":{"nodeType":"YulBlock","src":"2992:167:111","statements":[{"body":{"nodeType":"YulBlock","src":"3038:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3047:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3050:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3040:6:111"},"nodeType":"YulFunctionCall","src":"3040:12:111"},"nodeType":"YulExpressionStatement","src":"3040:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3013:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3022:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3009:3:111"},"nodeType":"YulFunctionCall","src":"3009:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3034:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3005:3:111"},"nodeType":"YulFunctionCall","src":"3005:32:111"},"nodeType":"YulIf","src":"3002:52:111"},{"nodeType":"YulAssignment","src":"3063:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3092:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3073:18:111"},"nodeType":"YulFunctionCall","src":"3073:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3063:6:111"}]},{"nodeType":"YulAssignment","src":"3111:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3138:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3149:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3134:3:111"},"nodeType":"YulFunctionCall","src":"3134:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3121:12:111"},"nodeType":"YulFunctionCall","src":"3121:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3111:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2950:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2961:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2973:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2981:6:111","type":""}],"src":"2905:254:111"},{"body":{"nodeType":"YulBlock","src":"3343:624:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3353:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3371:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3382:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3367:3:111"},"nodeType":"YulFunctionCall","src":"3367:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"3357:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3412:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3394:6:111"},"nodeType":"YulFunctionCall","src":"3394:21:111"},"nodeType":"YulExpressionStatement","src":"3394:21:111"},{"nodeType":"YulVariableDeclaration","src":"3424:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"3435:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"3428:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3450:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3470:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3464:5:111"},"nodeType":"YulFunctionCall","src":"3464:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3454:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"3493:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"3501:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3486:6:111"},"nodeType":"YulFunctionCall","src":"3486:22:111"},"nodeType":"YulExpressionStatement","src":"3486:22:111"},{"nodeType":"YulAssignment","src":"3517:25:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3528:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3539:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3524:3:111"},"nodeType":"YulFunctionCall","src":"3524:18:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"3517:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"3551:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3561:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3555:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3574:29:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3592:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3600:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3588:3:111"},"nodeType":"YulFunctionCall","src":"3588:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"3578:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3612:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3621:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3616:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3680:169:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3701:3:111"},{"arguments":[{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"3716:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3710:5:111"},"nodeType":"YulFunctionCall","src":"3710:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"3725:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3706:3:111"},"nodeType":"YulFunctionCall","src":"3706:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3694:6:111"},"nodeType":"YulFunctionCall","src":"3694:75:111"},"nodeType":"YulExpressionStatement","src":"3694:75:111"},{"nodeType":"YulAssignment","src":"3782:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3793:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3798:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3789:3:111"},"nodeType":"YulFunctionCall","src":"3789:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"3782:3:111"}]},{"nodeType":"YulAssignment","src":"3814:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"3828:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3836:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3824:3:111"},"nodeType":"YulFunctionCall","src":"3824:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"3814:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3642:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3645:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3639:2:111"},"nodeType":"YulFunctionCall","src":"3639:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3653:18:111","statements":[{"nodeType":"YulAssignment","src":"3655:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3664:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3667:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3660:3:111"},"nodeType":"YulFunctionCall","src":"3660:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3655:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3635:3:111","statements":[]},"src":"3631:218:111"},{"nodeType":"YulAssignment","src":"3858:11:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"3866:3:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3858:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3889:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3900:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3885:3:111"},"nodeType":"YulFunctionCall","src":"3885:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"3909:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3917:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3905:3:111"},"nodeType":"YulFunctionCall","src":"3905:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3878:6:111"},"nodeType":"YulFunctionCall","src":"3878:83:111"},"nodeType":"YulExpressionStatement","src":"3878:83:111"}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3304:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3315:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3323:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3334:4:111","type":""}],"src":"3164:803:111"},{"body":{"nodeType":"YulBlock","src":"4059:173:111","statements":[{"body":{"nodeType":"YulBlock","src":"4105:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4114:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4117:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4107:6:111"},"nodeType":"YulFunctionCall","src":"4107:12:111"},"nodeType":"YulExpressionStatement","src":"4107:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4080:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4089:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4076:3:111"},"nodeType":"YulFunctionCall","src":"4076:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4101:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4072:3:111"},"nodeType":"YulFunctionCall","src":"4072:32:111"},"nodeType":"YulIf","src":"4069:52:111"},{"nodeType":"YulAssignment","src":"4130:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4159:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4140:18:111"},"nodeType":"YulFunctionCall","src":"4140:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4130:6:111"}]},{"nodeType":"YulAssignment","src":"4178:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4211:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4222:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4207:3:111"},"nodeType":"YulFunctionCall","src":"4207:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4188:18:111"},"nodeType":"YulFunctionCall","src":"4188:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4178:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4017:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4028:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4040:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4048:6:111","type":""}],"src":"3972:260:111"},{"body":{"nodeType":"YulBlock","src":"4411:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4428:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4439:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4421:6:111"},"nodeType":"YulFunctionCall","src":"4421:21:111"},"nodeType":"YulExpressionStatement","src":"4421:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4462:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4473:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4458:3:111"},"nodeType":"YulFunctionCall","src":"4458:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4478:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4451:6:111"},"nodeType":"YulFunctionCall","src":"4451:29:111"},"nodeType":"YulExpressionStatement","src":"4451:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4500:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4511:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4496:3:111"},"nodeType":"YulFunctionCall","src":"4496:18:111"},{"hexValue":"4753313034","kind":"string","nodeType":"YulLiteral","src":"4516:7:111","type":"","value":"GS104"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4489:6:111"},"nodeType":"YulFunctionCall","src":"4489:35:111"},"nodeType":"YulExpressionStatement","src":"4489:35:111"},{"nodeType":"YulAssignment","src":"4533:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4545:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4556:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4541:3:111"},"nodeType":"YulFunctionCall","src":"4541:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4533:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4388:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4402:4:111","type":""}],"src":"4237:328:111"},{"body":{"nodeType":"YulBlock","src":"4744:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4761:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4772:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4754:6:111"},"nodeType":"YulFunctionCall","src":"4754:21:111"},"nodeType":"YulExpressionStatement","src":"4754:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4795:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4806:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4791:3:111"},"nodeType":"YulFunctionCall","src":"4791:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4811:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4784:6:111"},"nodeType":"YulFunctionCall","src":"4784:29:111"},"nodeType":"YulExpressionStatement","src":"4784:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4833:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4844:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4829:3:111"},"nodeType":"YulFunctionCall","src":"4829:18:111"},{"hexValue":"4753313031","kind":"string","nodeType":"YulLiteral","src":"4849:7:111","type":"","value":"GS101"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4822:6:111"},"nodeType":"YulFunctionCall","src":"4822:35:111"},"nodeType":"YulExpressionStatement","src":"4822:35:111"},{"nodeType":"YulAssignment","src":"4866:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4878:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4889:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4874:3:111"},"nodeType":"YulFunctionCall","src":"4874:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4866:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4721:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4735:4:111","type":""}],"src":"4570:328:111"},{"body":{"nodeType":"YulBlock","src":"5077:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5094:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5105:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5087:6:111"},"nodeType":"YulFunctionCall","src":"5087:21:111"},"nodeType":"YulExpressionStatement","src":"5087:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5128:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5139:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5124:3:111"},"nodeType":"YulFunctionCall","src":"5124:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5144:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5117:6:111"},"nodeType":"YulFunctionCall","src":"5117:29:111"},"nodeType":"YulExpressionStatement","src":"5117:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5166:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5177:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5162:3:111"},"nodeType":"YulFunctionCall","src":"5162:18:111"},{"hexValue":"4753313032","kind":"string","nodeType":"YulLiteral","src":"5182:7:111","type":"","value":"GS102"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5155:6:111"},"nodeType":"YulFunctionCall","src":"5155:35:111"},"nodeType":"YulExpressionStatement","src":"5155:35:111"},{"nodeType":"YulAssignment","src":"5199:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5211:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5222:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5207:3:111"},"nodeType":"YulFunctionCall","src":"5207:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5199:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5054:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5068:4:111","type":""}],"src":"4903:328:111"},{"body":{"nodeType":"YulBlock","src":"5337:125:111","statements":[{"nodeType":"YulAssignment","src":"5347:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5370:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5355:3:111"},"nodeType":"YulFunctionCall","src":"5355:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5347:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5389:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5404:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5412:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5400:3:111"},"nodeType":"YulFunctionCall","src":"5400:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5382:6:111"},"nodeType":"YulFunctionCall","src":"5382:74:111"},"nodeType":"YulExpressionStatement","src":"5382:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5306:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5317:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5328:4:111","type":""}],"src":"5236:226:111"},{"body":{"nodeType":"YulBlock","src":"5499:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5519:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5509:6:111"},"nodeType":"YulFunctionCall","src":"5509:88:111"},"nodeType":"YulExpressionStatement","src":"5509:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5613:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"5616:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5606:6:111"},"nodeType":"YulFunctionCall","src":"5606:15:111"},"nodeType":"YulExpressionStatement","src":"5606:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5637:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5640:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5630:6:111"},"nodeType":"YulFunctionCall","src":"5630:15:111"},"nodeType":"YulExpressionStatement","src":"5630:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"5467:184:111"},{"body":{"nodeType":"YulBlock","src":"5703:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"5802:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5823:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5826:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5816:6:111"},"nodeType":"YulFunctionCall","src":"5816:88:111"},"nodeType":"YulExpressionStatement","src":"5816:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5924:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"5927:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5917:6:111"},"nodeType":"YulFunctionCall","src":"5917:15:111"},"nodeType":"YulExpressionStatement","src":"5917:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5952:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5955:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5945:6:111"},"nodeType":"YulFunctionCall","src":"5945:15:111"},"nodeType":"YulExpressionStatement","src":"5945:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5719:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5726:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"5716:2:111"},"nodeType":"YulFunctionCall","src":"5716:77:111"},"nodeType":"YulIf","src":"5713:257:111"},{"nodeType":"YulAssignment","src":"5979:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5990:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5997:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5986:3:111"},"nodeType":"YulFunctionCall","src":"5986:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"5979:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5685:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"5695:3:111","type":""}],"src":"5656:349:111"},{"body":{"nodeType":"YulBlock","src":"6184:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6201:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6212:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6194:6:111"},"nodeType":"YulFunctionCall","src":"6194:21:111"},"nodeType":"YulExpressionStatement","src":"6194:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6235:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6246:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6231:3:111"},"nodeType":"YulFunctionCall","src":"6231:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6251:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6224:6:111"},"nodeType":"YulFunctionCall","src":"6224:29:111"},"nodeType":"YulExpressionStatement","src":"6224:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6273:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6284:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6269:3:111"},"nodeType":"YulFunctionCall","src":"6269:18:111"},{"hexValue":"4753313033","kind":"string","nodeType":"YulLiteral","src":"6289:7:111","type":"","value":"GS103"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6262:6:111"},"nodeType":"YulFunctionCall","src":"6262:35:111"},"nodeType":"YulExpressionStatement","src":"6262:35:111"},{"nodeType":"YulAssignment","src":"6306:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6318:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6329:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6314:3:111"},"nodeType":"YulFunctionCall","src":"6314:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6306:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6161:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6175:4:111","type":""}],"src":"6010:328:111"},{"body":{"nodeType":"YulBlock","src":"6375:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6392:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6395:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6385:6:111"},"nodeType":"YulFunctionCall","src":"6385:88:111"},"nodeType":"YulExpressionStatement","src":"6385:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6489:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6492:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6482:6:111"},"nodeType":"YulFunctionCall","src":"6482:15:111"},"nodeType":"YulExpressionStatement","src":"6482:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6513:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6516:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6506:6:111"},"nodeType":"YulFunctionCall","src":"6506:15:111"},"nodeType":"YulExpressionStatement","src":"6506:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"6343:184:111"},{"body":{"nodeType":"YulBlock","src":"6706:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6734:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6716:6:111"},"nodeType":"YulFunctionCall","src":"6716:21:111"},"nodeType":"YulExpressionStatement","src":"6716:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6757:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6768:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6753:3:111"},"nodeType":"YulFunctionCall","src":"6753:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6773:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6746:6:111"},"nodeType":"YulFunctionCall","src":"6746:29:111"},"nodeType":"YulExpressionStatement","src":"6746:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6795:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6806:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6791:3:111"},"nodeType":"YulFunctionCall","src":"6791:18:111"},{"hexValue":"4753303331","kind":"string","nodeType":"YulLiteral","src":"6811:7:111","type":"","value":"GS031"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6784:6:111"},"nodeType":"YulFunctionCall","src":"6784:35:111"},"nodeType":"YulExpressionStatement","src":"6784:35:111"},{"nodeType":"YulAssignment","src":"6828:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6840:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6851:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6836:3:111"},"nodeType":"YulFunctionCall","src":"6836:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6828:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6683:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6697:4:111","type":""}],"src":"6532:328:111"}]},"contents":"{\n { }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_enum_Operation(offset) -> value\n {\n value := calldataload(offset)\n if iszero(lt(value, 2)) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value2 := memPtr\n value3 := abi_decode_enum_Operation(add(headStart, 96))\n }\n function abi_encode_tuple_t_bool_t_bytes_memory_ptr__to_t_bool_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, iszero(iszero(value0)))\n let _1 := 32\n mstore(add(headStart, _1), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 96), mload(add(add(value1, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 96), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_address__to_t_array$_t_address_$dyn_memory_ptr_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let tail_1 := add(headStart, 64)\n mstore(headStart, 64)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 96)\n let _1 := 0x20\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffffffffffffffffffffffffffffffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n mstore(add(headStart, _1), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n }\n function abi_encode_tuple_t_stringliteral_b44c13dad2cf265cdd10f957c112238232519dfdaff7245a6824a63db294cf23__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS104\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_eab5e6af6960e6bb32b59bfd1d877c9c1728e4c18fa7a83eb40baa1c0f05f61f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS101\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_bfe16ebc2bd5d2fdfe588255b31e648718f9ede037848519acb772cd4f042f12__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS102\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_7295c339622429fbd8194417b44c0a2c972675caa6bf424cf588d99024c608be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS103\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS031\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100725760003560e01c8063610b592511610050578063610b5925146100d3578063cc2f8452146100e8578063e009cfde1461010957600080fd5b80632d9ad53d14610077578063468721a71461009f5780635229073f146100b2575b600080fd5b61008a610085366004610896565b61011c565b60405190151581526020015b60405180910390f35b61008a6100ad3660046108f6565b610171565b6100c56100c03660046108f6565b61028c565b6040516100969291906109f0565b6100e66100e1366004610896565b6102c2565b005b6100fb6100f6366004610a6d565b6104b2565b604051610096929190610a97565b6100e6610117366004610b0e565b6105df565b6000600173ffffffffffffffffffffffffffffffffffffffff83161480159061016b575073ffffffffffffffffffffffffffffffffffffffff8281166000908152602081905260409020541615155b92915050565b6000336001148015906101a857503360009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b610213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610220858585855a6107bb565b905080156102585760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610284565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b6000606061029c86868686610171565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b6102ca610802565b73ffffffffffffffffffffffffffffffffffffffff811615801590610306575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61036c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313031000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526020819052604090205416156103fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313032000000000000000000000000000000000000000000000000000000604482015260640161020a565b600060208181527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d805473ffffffffffffffffffffffffffffffffffffffff85811680865260408087208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560019095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440910160405180910390a150565b606060008267ffffffffffffffff8111156104cf576104cf6108b8565b6040519080825280602002602001820160405280156104f8578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff80861660009081526020819052604081205492945091165b73ffffffffffffffffffffffffffffffffffffffff811615801590610562575073ffffffffffffffffffffffffffffffffffffffff8116600114155b801561056d57508482105b156105d1578084838151811061058557610585610b41565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915291811660009081529182905260409091205416816105c981610b70565b925050610526565b908352919491935090915050565b6105e7610802565b73ffffffffffffffffffffffffffffffffffffffff811615801590610623575073ffffffffffffffffffffffffffffffffffffffff8116600114155b610689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313031000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526020819052604090205481169082161461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753313033000000000000000000000000000000000000000000000000000000604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260208181526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276910160405180910390a15050565b600060018360018111156107d1576107d1610bcf565b036107e9576000808551602087018986f490506107f9565b600080855160208701888a87f190505b95945050505050565b33301461086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4753303331000000000000000000000000000000000000000000000000000000604482015260640161020a565b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461089157600080fd5b919050565b6000602082840312156108a857600080fd5b6108b18261086d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80356002811061089157600080fd5b6000806000806080858703121561090c57600080fd5b6109158561086d565b935060208501359250604085013567ffffffffffffffff8082111561093957600080fd5b818701915087601f83011261094d57600080fd5b81358181111561095f5761095f6108b8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109a5576109a56108b8565b816040528281528a60208487010111156109be57600080fd5b8260208601602083013760006020848301015280965050505050506109e5606086016108e7565b905092959194509250565b821515815260006020604081840152835180604085015260005b81811015610a2657858101830151858201606001528201610a0a565b81811115610a38576000606083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201606001949350505050565b60008060408385031215610a8057600080fd5b610a898361086d565b946020939093013593505050565b604080825283519082018190526000906020906060840190828701845b82811015610ae657815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610ab4565b50505073ffffffffffffffffffffffffffffffffffffffff9490941692019190915250919050565b60008060408385031215610b2157600080fd5b610b2a8361086d565b9150610b386020840161086d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea26469706673582212206a9606c982ca7c1966a7469c242e19fadbd8aaffde954170d36d585dccf6ca9864736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x72 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x610B5925 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x610B5925 EQ PUSH2 0xD3 JUMPI DUP1 PUSH4 0xCC2F8452 EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0xE009CFDE EQ PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2D9AD53D EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0x468721A7 EQ PUSH2 0x9F JUMPI DUP1 PUSH4 0x5229073F EQ PUSH2 0xB2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x896 JUMP JUMPDEST PUSH2 0x11C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x8F6 JUMP JUMPDEST PUSH2 0x171 JUMP JUMPDEST PUSH2 0xC5 PUSH2 0xC0 CALLDATASIZE PUSH1 0x4 PUSH2 0x8F6 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x96 SWAP3 SWAP2 SWAP1 PUSH2 0x9F0 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0xE1 CALLDATASIZE PUSH1 0x4 PUSH2 0x896 JUMP JUMPDEST PUSH2 0x2C2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH2 0xF6 CALLDATASIZE PUSH1 0x4 PUSH2 0xA6D JUMP JUMPDEST PUSH2 0x4B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x96 SWAP3 SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x117 CALLDATASIZE PUSH1 0x4 PUSH2 0xB0E JUMP JUMPDEST PUSH2 0x5DF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND EQ DUP1 ISZERO SWAP1 PUSH2 0x16B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x1A8 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO JUMPDEST PUSH2 0x213 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x220 DUP6 DUP6 DUP6 DUP6 GAS PUSH2 0x7BB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x258 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0x6895C13664AA4F67288B25D7A21D7AAA34916E355FB9B6FAE0A139A9085BECB8 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x284 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH32 0xACD2C8702804128FDB0DB2BB49F6D127DD0181C13FD45DBFE16DE0930E2BD375 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x29C DUP7 DUP7 DUP7 DUP7 PUSH2 0x171 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 MLOAD PUSH1 0x20 RETURNDATASIZE ADD DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY DUP1 SWAP2 POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x2CA PUSH2 0x802 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x306 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x36C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x3FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND DUP1 DUP7 MSTORE PUSH1 0x40 DUP1 DUP8 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SWAP4 SSTORE PUSH1 0x1 SWAP1 SWAP6 MSTORE DUP3 SLOAD AND DUP5 OR SWAP1 SWAP2 SSTORE MLOAD SWAP2 DUP3 MSTORE PUSH32 0xECDF3A3EFFEA5783A3C4C2140E677577666428D44ED9D474A0B3A4C9943F8440 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4CF JUMPI PUSH2 0x4CF PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x4F8 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP5 POP SWAP2 AND JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x562 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x56D JUMPI POP DUP5 DUP3 LT JUMPDEST ISZERO PUSH2 0x5D1 JUMPI DUP1 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x585 JUMPI PUSH2 0x585 PUSH2 0xB41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x5C9 DUP2 PUSH2 0xB70 JUMP JUMPDEST SWAP3 POP POP PUSH2 0x526 JUMP JUMPDEST SWAP1 DUP4 MSTORE SWAP2 SWAP5 SWAP2 SWAP4 POP SWAP1 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5E7 PUSH2 0x802 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x623 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x689 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x71C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753313033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 DUP8 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD SWAP2 SWAP1 SWAP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xAAB4FA2B463F581B2B32CB3B7E3B704B9CE37CC209B5FB4D77E593ACE4054276 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x7D1 JUMPI PUSH2 0x7D1 PUSH2 0xBCF JUMP JUMPDEST SUB PUSH2 0x7E9 JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x7F9 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x86B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x20A JUMP JUMPDEST JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B1 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x915 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x939 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x94D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x95F JUMPI PUSH2 0x95F PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x9A5 JUMPI PUSH2 0x9A5 PUSH2 0x8B8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x9BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP7 POP POP POP POP POP POP PUSH2 0x9E5 PUSH1 0x60 DUP7 ADD PUSH2 0x8E7 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x40 DUP2 DUP5 ADD MSTORE DUP4 MLOAD DUP1 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA26 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x60 ADD MSTORE DUP3 ADD PUSH2 0xA0A JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xA38 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x60 ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA89 DUP4 PUSH2 0x86D JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xAE6 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xAB4 JUMP JUMPDEST POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB2A DUP4 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP PUSH2 0xB38 PUSH1 0x20 DUP5 ADD PUSH2 0x86D JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0xBC8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0x9606C982CA7C1966A7469C 0x24 0x2E NOT STATICCALL 0xDB 0xD8 0xAA SELFDESTRUCT 0xDE SWAP6 COINBASE PUSH17 0xD36D585DCCF6CA9864736F6C634300080F STOP CALLER ","sourceMap":"374:5660:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4861:151;;;;;;:::i;:::-;;:::i;:::-;;;571:14:111;;564:22;546:41;;534:2;519:18;4861:151:4;;;;;;;;2868:586;;;;;;:::i;:::-;;:::i;3805:959::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1363:426::-;;;;;;:::i;:::-;;:::i;:::-;;5257:775;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2109:423::-;;;;;;:::i;:::-;;:::i;4861:151::-;4923:4;692:3;4946:26;;;;;;;:59;;-1:-1:-1;4976:29:4;:15;;;5003:1;4976:15;;;;;;;;;;;;:29;;4946:59;4939:66;4861:151;-1:-1:-1;;4861:151:4:o;2868:586::-;3037:12;3118:10;692:3;3118:30;;;;:67;;-1:-1:-1;3160:10:4;3183:1;3152:19;;;;;;;;;;;:33;:19;:33;;3118:67;3110:85;;;;;;;4439:2:111;3110:85:4;;;4421:21:111;4478:1;4458:18;;;4451:29;4516:7;4496:18;;;4489:35;4541:18;;3110:85:4;;;;;;;;;3277:46;3285:2;3289:5;3296:4;3302:9;3313;3277:7;:46::i;:::-;3267:56;;3337:7;3333:114;;;3351:38;;3378:10;;3351:38;;;;;3333:114;;;3409:38;;3436:10;;3409:38;;;;;3333:114;2868:586;;;;;;:::o;3805:959::-;3976:12;3990:23;4035:53;4061:2;4065:5;4072:4;4078:9;4035:25;:53::i;:::-;4025:63;;4235:4;4229:11;4477:4;4459:16;4455:27;4450:3;4446:37;4440:4;4433:51;4539:16;4534:3;4527:29;4633:16;4630:1;4623:4;4618:3;4614:14;4599:51;4745:3;4731:17;;;3805:959;;;;;;;:::o;1363:426::-;440:17:9;:15;:17::i;:::-;1491:20:4::1;::::0;::::1;::::0;;::::1;::::0;:50:::1;;-1:-1:-1::0;1515:26:4::1;::::0;::::1;692:3;1515:26;;1491:50;1483:68;;;::::0;::::1;::::0;;4772:2:111;1483:68:4::1;::::0;::::1;4754:21:111::0;4811:1;4791:18;;;4784:29;4849:7;4829:18;;;4822:35;4874:18;;1483:68:4::1;4570:328:111::0;1483:68:4::1;1610:29;:15:::0;;::::1;1637:1;1610:15:::0;;;::::1;::::0;;;;;;;::::1;:29:::0;1602:47:::1;;;::::0;::::1;::::0;;5105:2:111;1602:47:4::1;::::0;::::1;5087:21:111::0;5144:1;5124:18;;;5117:29;5182:7;5162:18;;;5155:35;5207:18;;1602:47:4::1;4903:328:111::0;1602:47:4::1;1677:7;:25;::::0;;;;;;::::1;1659:15:::0;;::::1;::::0;;;1677:25;1659:15;;;:43;;1677:25;;;::::1;1659:43:::0;;;::::1;;::::0;;;-1:-1:-1;1712:25:4;;;:34;;::::1;::::0;::::1;::::0;;;1761:21;5382:74:111;;;1761:21:4::1;::::0;5355:18:111;1761:21:4::1;;;;;;;1363:426:::0;:::o;5257:775::-;5342:22;5366:12;5453:8;5439:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5439:23:4;-1:-1:-1;5563:14:4;;;;5506:19;5563:14;;;;;;;;;;;5431:31;;-1:-1:-1;5506:19:4;5563:14;5587:239;5594:29;;;;;;;:66;;-1:-1:-1;5627:33:4;;;692:3;5627:33;;5594:66;:92;;;;;5678:8;5664:11;:22;5594:92;5587:239;;;5723:13;5702:5;5708:11;5702:18;;;;;;;;:::i;:::-;:34;;;;:18;;;;;;;;;;:34;;;;5766:22;;;:7;:22;;;;;;;;;;;;;5802:13;;;;:::i;:::-;;;;5587:239;;;5990:26;;;5997:5;;5842:13;;-1:-1:-1;5257:775:4;;-1:-1:-1;;5257:775:4:o;2109:423::-;440:17:9;:15;:17::i;:::-;2286:20:4::1;::::0;::::1;::::0;;::::1;::::0;:50:::1;;-1:-1:-1::0;2310:26:4::1;::::0;::::1;692:3;2310:26;;2286:50;2278:68;;;::::0;::::1;::::0;;4772:2:111;2278:68:4::1;::::0;::::1;4754:21:111::0;4811:1;4791:18;;;4784:29;4849:7;4829:18;;;4822:35;4874:18;;2278:68:4::1;4570:328:111::0;2278:68:4::1;2364:29;:19:::0;;::::1;:7;:19:::0;;;::::1;::::0;;;;;;;;::::1;:29:::0;;::::1;;2356:47;;;::::0;::::1;::::0;;6212:2:111;2356:47:4::1;::::0;::::1;6194:21:111::0;6251:1;6231:18;;;6224:29;6289:7;6269:18;;;6262:35;6314:18;;2356:47:4::1;6010:328:111::0;2356:47:4::1;2435:15;::::0;;::::1;:7;:15:::0;;;::::1;::::0;;;;;;;;;2413:19;;::::1;::::0;;;;;:37;;2435:15;;;::::1;2413:37:::0;;;::::1;;::::0;;;2460:15;;;;:28;;;;::::1;::::0;;;2503:22;;5382:74:111;;;2503:22:4::1;::::0;5355:18:111;2503:22:4::1;;;;;;;2109:423:::0;;:::o;242:639:1:-;410:12;451:27;438:9;:40;;;;;;;;:::i;:::-;;434:441;;649:1;646;639:4;633:11;626:4;620;616:15;612:2;605:5;592:59;581:70;;434:441;;;849:1;846;839:4;833:11;826:4;820;816:15;809:5;805:2;798:5;793:58;782:69;;434:441;242:639;;;;;;;:::o;231:102:9:-;289:10;311:4;289:27;281:45;;;;;;;6734:2:111;281:45:9;;;6716:21:111;6773:1;6753:18;;;6746:29;6811:7;6791:18;;;6784:35;6836:18;;281:45:9;6532:328:111;281:45:9;231:102::o;14:196:111:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;:::-;356:39;215:186;-1:-1:-1;;;215:186:111:o;598:184::-;650:77;647:1;640:88;747:4;744:1;737:15;771:4;768:1;761:15;787:150;862:20;;911:1;901:12;;891:40;;927:1;924;917:12;942:1218;1051:6;1059;1067;1075;1128:3;1116:9;1107:7;1103:23;1099:33;1096:53;;;1145:1;1142;1135:12;1096:53;1168:29;1187:9;1168:29;:::i;:::-;1158:39;;1244:2;1233:9;1229:18;1216:32;1206:42;;1299:2;1288:9;1284:18;1271:32;1322:18;1363:2;1355:6;1352:14;1349:34;;;1379:1;1376;1369:12;1349:34;1417:6;1406:9;1402:22;1392:32;;1462:7;1455:4;1451:2;1447:13;1443:27;1433:55;;1484:1;1481;1474:12;1433:55;1520:2;1507:16;1542:2;1538;1535:10;1532:36;;;1548:18;;:::i;:::-;1682:2;1676:9;1744:4;1736:13;;1587:66;1732:22;;;1756:2;1728:31;1724:40;1712:53;;;1780:18;;;1800:22;;;1777:46;1774:72;;;1826:18;;:::i;:::-;1866:10;1862:2;1855:22;1901:2;1893:6;1886:18;1941:7;1936:2;1931;1927;1923:11;1919:20;1916:33;1913:53;;;1962:1;1959;1952:12;1913:53;2018:2;2013;2009;2005:11;2000:2;1992:6;1988:15;1975:46;2063:1;2058:2;2053;2045:6;2041:15;2037:24;2030:35;2084:6;2074:16;;;;;;;2109:45;2150:2;2139:9;2135:18;2109:45;:::i;:::-;2099:55;;942:1218;;;;;;;:::o;2165:735::-;2348:6;2341:14;2334:22;2323:9;2316:41;2297:4;2376:2;2414;2409;2398:9;2394:18;2387:30;2446:6;2440:13;2489:6;2484:2;2473:9;2469:18;2462:34;2514:1;2524:140;2538:6;2535:1;2532:13;2524:140;;;2633:14;;;2629:23;;2623:30;2599:17;;;2618:2;2595:26;2588:66;2553:10;;2524:140;;;2682:6;2679:1;2676:13;2673:91;;;2752:1;2747:2;2738:6;2727:9;2723:22;2719:31;2712:42;2673:91;-1:-1:-1;2816:2:111;2804:15;2821:66;2800:88;2785:104;;;;2891:2;2781:113;;2165:735;-1:-1:-1;;;;2165:735:111:o;2905:254::-;2973:6;2981;3034:2;3022:9;3013:7;3009:23;3005:32;3002:52;;;3050:1;3047;3040:12;3002:52;3073:29;3092:9;3073:29;:::i;:::-;3063:39;3149:2;3134:18;;;;3121:32;;-1:-1:-1;;;2905:254:111:o;3164:803::-;3382:2;3394:21;;;3464:13;;3367:18;;;3486:22;;;3334:4;;3561;;3539:2;3524:18;;;3588:15;;;3334:4;3631:218;3645:6;3642:1;3639:13;3631:218;;;3710:13;;3725:42;3706:62;3694:75;;3789:12;;;;3824:15;;;;3667:1;3660:9;3631:218;;;-1:-1:-1;;;3917:42:111;3905:55;;;;3885:18;;3878:83;;;;-1:-1:-1;3866:3:111;3164:803;-1:-1:-1;3164:803:111:o;3972:260::-;4040:6;4048;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4140:29;4159:9;4140:29;:::i;:::-;4130:39;;4188:38;4222:2;4211:9;4207:18;4188:38;:::i;:::-;4178:48;;3972:260;;;;;:::o;5467:184::-;5519:77;5516:1;5509:88;5616:4;5613:1;5606:15;5640:4;5637:1;5630:15;5656:349;5695:3;5726:66;5719:5;5716:77;5713:257;;5826:77;5823:1;5816:88;5927:4;5924:1;5917:15;5955:4;5952:1;5945:15;5713:257;-1:-1:-1;5997:1:111;5986:13;;5656:349::o;6343:184::-;6395:77;6392:1;6385:88;6492:4;6489:1;6482:15;6516:4;6513:1;6506:15"},"gasEstimates":{"creation":{"codeDepositCost":"624800","executionCost":"657","totalCost":"625457"},"external":{"disableModule(address,address)":"infinite","enableModule(address)":"54320","execTransactionFromModule(address,uint256,bytes,uint8)":"infinite","execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":"infinite","getModulesPaginated(address,uint256)":"infinite","isModuleEnabled(address)":"2589"},"internal":{"setupModules(address,bytes memory)":"infinite"}},"methodIdentifiers":{"disableModule(address,address)":"e009cfde","enableModule(address)":"610b5925","execTransactionFromModule(address,uint256,bytes,uint8)":"468721a7","execTransactionFromModuleReturnData(address,uint256,bytes,uint8)":"5229073f","getModulesPaginated(address,uint256)":"cc2f8452","isModuleEnabled(address)":"2d9ad53d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Stefan George - Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"disableModule(address,address)\":{\"details\":\"Allows to remove a module from the whitelist. This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be removed.\",\"prevModule\":\"Module that pointed to the module to be removed in the linked list\"}},\"enableModule(address)\":{\"details\":\"Allows to add a module to the whitelist. This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be whitelisted.\"}},\"execTransactionFromModule(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations.\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"execTransactionFromModuleReturnData(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations and return data\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"getModulesPaginated(address,uint256)\":{\"details\":\"Returns array of modules.\",\"params\":{\"pageSize\":\"Maximum number of modules that should be returned.\",\"start\":\"Start of the page.\"},\"returns\":{\"array\":\"Array of modules.\",\"next\":\"Start of the next page.\"}},\"isModuleEnabled(address)\":{\"details\":\"Returns if an module is enabled\",\"returns\":{\"_0\":\"True if the module is enabled\"}}},\"title\":\"Module Manager - A contract that manages modules that can execute transactions via this contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"disableModule(address,address)\":{\"notice\":\"Disables the module `module` for the Safe.\"},\"enableModule(address)\":{\"notice\":\"Enables the module `module` for the Safe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":\"ModuleManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\nimport \\\"./Executor.sol\\\";\\n\\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract ModuleManager is SelfAuthorized, Executor {\\n event EnabledModule(address module);\\n event DisabledModule(address module);\\n event ExecutionFromModuleSuccess(address indexed module);\\n event ExecutionFromModuleFailure(address indexed module);\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n mapping(address => address) internal modules;\\n\\n function setupModules(address to, bytes memory data) internal {\\n require(modules[SENTINEL_MODULES] == address(0), \\\"GS100\\\");\\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\\n if (to != address(0))\\n // Setup has to complete successfully or transaction fails.\\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \\\"GS000\\\");\\n }\\n\\n /// @dev Allows to add a module to the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Enables the module `module` for the Safe.\\n /// @param module Module to be whitelisted.\\n function enableModule(address module) public authorized {\\n // Module address cannot be null or sentinel.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n // Module cannot be added twice.\\n require(modules[module] == address(0), \\\"GS102\\\");\\n modules[module] = modules[SENTINEL_MODULES];\\n modules[SENTINEL_MODULES] = module;\\n emit EnabledModule(module);\\n }\\n\\n /// @dev Allows to remove a module from the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Disables the module `module` for the Safe.\\n /// @param prevModule Module that pointed to the module to be removed in the linked list\\n /// @param module Module to be removed.\\n function disableModule(address prevModule, address module) public authorized {\\n // Validate module address and check that it corresponds to module index.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n require(modules[prevModule] == module, \\\"GS103\\\");\\n modules[prevModule] = modules[module];\\n modules[module] = address(0);\\n emit DisabledModule(module);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public virtual returns (bool success) {\\n // Only whitelisted modules are allowed.\\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \\\"GS104\\\");\\n // Execute transaction without further confirmations.\\n success = execute(to, value, data, operation, gasleft());\\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\\n else emit ExecutionFromModuleFailure(msg.sender);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModuleReturnData(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public returns (bool success, bytes memory returnData) {\\n success = execTransactionFromModule(to, value, data, operation);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // Load free memory location\\n let ptr := mload(0x40)\\n // We allocate memory for the return data by setting the free memory location to\\n // current free memory location + data size + 32 bytes for data size value\\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\\n // Store the size\\n mstore(ptr, returndatasize())\\n // Store the data\\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\\n // Point the return data to the correct memory location\\n returnData := ptr\\n }\\n }\\n\\n /// @dev Returns if an module is enabled\\n /// @return True if the module is enabled\\n function isModuleEnabled(address module) public view returns (bool) {\\n return SENTINEL_MODULES != module && modules[module] != address(0);\\n }\\n\\n /// @dev Returns array of modules.\\n /// @param start Start of the page.\\n /// @param pageSize Maximum number of modules that should be returned.\\n /// @return array Array of modules.\\n /// @return next Start of the next page.\\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\\n // Init array with max page size\\n array = new address[](pageSize);\\n\\n // Populate return array\\n uint256 moduleCount = 0;\\n address currentModule = modules[start];\\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\\n array[moduleCount] = currentModule;\\n currentModule = modules[currentModule];\\n moduleCount++;\\n }\\n next = currentModule;\\n // Set correct size of returned array\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n mstore(array, moduleCount)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5512760a0328309f82a71cbe2ac14e0942501b9d44d5fb417bd02174546672e5\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1149,"contract":"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol:ModuleManager","label":"modules","offset":0,"slot":"0","type":"t_mapping(t_address,t_address)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"}}},"userdoc":{"kind":"user","methods":{"disableModule(address,address)":{"notice":"Disables the module `module` for the Safe."},"enableModule(address)":{"notice":"Enables the module `module` for the Safe."}},"version":1}}},"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol":{"OwnerManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AddedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"ChangedThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"RemovedOwner","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addOwnerWithThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"changeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"swapOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Stefan George - Richard Meissner - ","kind":"dev","methods":{"addOwnerWithThreshold(address,uint256)":{"details":"Allows to add a new owner to the Safe and update the threshold at the same time. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold.","owner":"New owner address."}},"changeThreshold(uint256)":{"details":"Allows to update the number of required confirmations by Safe owners. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold."}},"getOwners()":{"details":"Returns array of owners.","returns":{"_0":"Array of Safe owners."}},"removeOwner(address,address,uint256)":{"details":"Allows to remove an owner from the Safe and update the threshold at the same time. This can only be done via a Safe transaction.","params":{"_threshold":"New threshold.","owner":"Owner address to be removed.","prevOwner":"Owner that pointed to the owner to be removed in the linked list"}},"swapOwner(address,address,address)":{"details":"Allows to swap/replace an owner from the Safe with another address. This can only be done via a Safe transaction.","params":{"newOwner":"New owner address.","oldOwner":"Owner address to be replaced.","prevOwner":"Owner that pointed to the owner to be replaced in the linked list"}}},"title":"OwnerManager - Manages a set of owners and a threshold to perform actions.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610df7806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0e67e2b1161005b578063a0e67e2b146100d2578063e318b52b146100e7578063e75235b8146100fa578063f8dc5dd91461010b57600080fd5b80630d582f13146100825780632f54bf6e14610097578063694e80c3146100bf575b600080fd5b610095610090366004610b72565b61011e565b005b6100aa6100a5366004610b9c565b610341565b60405190151581526020015b60405180910390f35b6100956100cd366004610bbe565b610396565b6100da61047c565b6040516100b69190610bd7565b6100956100f5366004610c31565b610593565b6002546040519081526020016100b6565b610095610119366004610c74565b6108b5565b610126610af8565b73ffffffffffffffffffffffffffffffffffffffff821615801590610162575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015610184575073ffffffffffffffffffffffffffffffffffffffff82163014155b6101d55760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260208190526040902054161561024a5760405162461bcd60e51b815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016101cc565b600060208190527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d805473ffffffffffffffffffffffffffffffffffffffff858116808552604085208054929093167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600180855283549091169091179091558054916102dd83610cdf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1806002541461033d5761033d81610396565b5050565b600073ffffffffffffffffffffffffffffffffffffffff8216600114801590610390575073ffffffffffffffffffffffffffffffffffffffff8281166000908152602081905260409020541615155b92915050565b61039e610af8565b6001548111156103f05760405162461bcd60e51b815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016101cc565b60018110156104415760405162461bcd60e51b815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016101cc565b60028190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b6060600060015467ffffffffffffffff81111561049b5761049b610d17565b6040519080825280602002602001820160405280156104c4578160200160208202803683370190505b506001600090815260208190527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff811660011461058b578083838151811061053f5761053f610d46565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815291829052604090912054168161058381610cdf565b92505061050e565b509092915050565b61059b610af8565b73ffffffffffffffffffffffffffffffffffffffff8116158015906105d7575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156105f9575073ffffffffffffffffffffffffffffffffffffffff81163014155b6106455760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526020819052604090205416156106ba5760405162461bcd60e51b815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff8216158015906106f6575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6107425760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152602081905260409020548116908316146107bb5760405162461bcd60e51b815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260208181526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b6108bd610af8565b80600180546108cc9190610d75565b101561091a5760405162461bcd60e51b815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff821615801590610956575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6109a25760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260208190526040902054811690831614610a1b5760405162461bcd60e51b815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260208190526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556001805491610a9383610d8c565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a18060025414610af357610af381610396565b505050565b333014610b475760405162461bcd60e51b815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016101cc565b565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b6d57600080fd5b919050565b60008060408385031215610b8557600080fd5b610b8e83610b49565b946020939093013593505050565b600060208284031215610bae57600080fd5b610bb782610b49565b9392505050565b600060208284031215610bd057600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015610c2557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610bf3565b50909695505050505050565b600080600060608486031215610c4657600080fd5b610c4f84610b49565b9250610c5d60208501610b49565b9150610c6b60408501610b49565b90509250925092565b600080600060608486031215610c8957600080fd5b610c9284610b49565b9250610ca060208501610b49565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610d1057610d10610cb0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015610d8757610d87610cb0565b500390565b600081610d9b57610d9b610cb0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212208b625f5944d34b877d556641c685018572b2c981e96d2db8a2391caf47d8b9a064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF7 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA0E67E2B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0xD2 JUMPI DUP1 PUSH4 0xE318B52B EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0xE75235B8 EQ PUSH2 0xFA JUMPI DUP1 PUSH4 0xF8DC5DD9 EQ PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xD582F13 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x694E80C3 EQ PUSH2 0xBF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0xB72 JUMP JUMPDEST PUSH2 0x11E JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAA PUSH2 0xA5 CALLDATASIZE PUSH1 0x4 PUSH2 0xB9C JUMP JUMPDEST PUSH2 0x341 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x95 PUSH2 0xCD CALLDATASIZE PUSH1 0x4 PUSH2 0xBBE JUMP JUMPDEST PUSH2 0x396 JUMP JUMPDEST PUSH2 0xDA PUSH2 0x47C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB6 SWAP2 SWAP1 PUSH2 0xBD7 JUMP JUMPDEST PUSH2 0x95 PUSH2 0xF5 CALLDATASIZE PUSH1 0x4 PUSH2 0xC31 JUMP JUMPDEST PUSH2 0x593 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xB6 JUMP JUMPDEST PUSH2 0x95 PUSH2 0x119 CALLDATASIZE PUSH1 0x4 PUSH2 0xC74 JUMP JUMPDEST PUSH2 0x8B5 JUMP JUMPDEST PUSH2 0x126 PUSH2 0xAF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x162 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x184 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x1D5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x24A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND DUP1 DUP6 MSTORE PUSH1 0x40 DUP6 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x1 DUP1 DUP6 MSTORE DUP4 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP1 SLOAD SWAP2 PUSH2 0x2DD DUP4 PUSH2 0xCDF JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x2 SLOAD EQ PUSH2 0x33D JUMPI PUSH2 0x33D DUP2 PUSH2 0x396 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x390 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x39E PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 GT ISZERO PUSH2 0x3F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x441 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x610F7FF2B304AE8903C3DE74C60C6AB1F7D6226B3F52C5161905BB5AD4039C93 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x49B JUMPI PUSH2 0x49B PUSH2 0xD17 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x4C4 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D SLOAD SWAP2 SWAP3 POP SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ PUSH2 0x58B JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x53F JUMPI PUSH2 0x53F PUSH2 0xD46 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x583 DUP2 PUSH2 0xCDF JUMP JUMPDEST SWAP3 POP POP PUSH2 0x50E JUMP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x59B PUSH2 0xAF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x5D7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x5F9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x645 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x6BA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x6F6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x7BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 DUP8 AND DUP1 DUP7 MSTORE DUP4 DUP7 KECCAK256 DUP1 SLOAD SWAP3 DUP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SSTORE SWAP7 DUP11 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD DUP3 AND SWAP1 SWAP8 OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH2 0x8BD PUSH2 0xAF8 JUMP JUMPDEST DUP1 PUSH1 0x1 DUP1 SLOAD PUSH2 0x8CC SWAP2 SWAP1 PUSH2 0xD75 JUMP JUMPDEST LT ISZERO PUSH2 0x91A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x956 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x9A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0xA1B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP9 DUP7 AND DUP5 MSTORE SWAP2 DUP4 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE DUP3 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP2 PUSH2 0xA93 DUP4 PUSH2 0xD8C JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x2 SLOAD EQ PUSH2 0xAF3 JUMPI PUSH2 0xAF3 DUP2 PUSH2 0x396 JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xB47 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xB6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB8E DUP4 PUSH2 0xB49 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB7 DUP3 PUSH2 0xB49 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xC25 JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xBF3 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC4F DUP5 PUSH2 0xB49 JUMP JUMPDEST SWAP3 POP PUSH2 0xC5D PUSH1 0x20 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP2 POP PUSH2 0xC6B PUSH1 0x40 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC92 DUP5 PUSH2 0xB49 JUMP JUMPDEST SWAP3 POP PUSH2 0xCA0 PUSH1 0x20 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0xD10 JUMPI PUSH2 0xD10 PUSH2 0xCB0 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0xD87 JUMPI PUSH2 0xD87 PUSH2 0xCB0 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0xD9B JUMPI PUSH2 0xD9B PUSH2 0xCB0 JUMP JUMPDEST POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP12 PUSH3 0x5F5944 0xD3 0x4B DUP8 PUSH30 0x556641C685018572B2C981E96D2DB8A2391CAF47D8B9A064736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"298:6409:5:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@addOwnerWithThreshold_1702":{"entryPoint":286,"id":1702,"parameterSlots":2,"returnSlots":0},"@changeThreshold_1910":{"entryPoint":918,"id":1910,"parameterSlots":1,"returnSlots":0},"@getOwners_1990":{"entryPoint":1148,"id":1990,"parameterSlots":0,"returnSlots":1},"@getThreshold_1918":{"entryPoint":null,"id":1918,"parameterSlots":0,"returnSlots":1},"@isOwner_1939":{"entryPoint":833,"id":1939,"parameterSlots":1,"returnSlots":1},"@removeOwner_1779":{"entryPoint":2229,"id":1779,"parameterSlots":3,"returnSlots":0},"@requireSelfCall_2065":{"entryPoint":2808,"id":2065,"parameterSlots":0,"returnSlots":0},"@swapOwner_1879":{"entryPoint":1427,"id":1879,"parameterSlots":3,"returnSlots":0},"abi_decode_address":{"entryPoint":2889,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":2972,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_addresst_address":{"entryPoint":3121,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_addresst_uint256":{"entryPoint":3188,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":2930,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_uint256":{"entryPoint":3006,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed":{"entryPoint":3031,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":3445,"id":null,"parameterSlots":2,"returnSlots":1},"decrement_t_uint256":{"entryPoint":3468,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":3295,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":3248,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":3398,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":3351,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:5906:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:147:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"190:6:111"},"nodeType":"YulFunctionCall","src":"190:12:111"},"nodeType":"YulExpressionStatement","src":"190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:73:111"},"nodeType":"YulIf","src":"111:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:196:111"},{"body":{"nodeType":"YulBlock","src":"302:167:111","statements":[{"body":{"nodeType":"YulBlock","src":"348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"350:6:111"},"nodeType":"YulFunctionCall","src":"350:12:111"},"nodeType":"YulExpressionStatement","src":"350:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"323:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"332:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"319:3:111"},"nodeType":"YulFunctionCall","src":"319:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"344:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"315:3:111"},"nodeType":"YulFunctionCall","src":"315:32:111"},"nodeType":"YulIf","src":"312:52:111"},{"nodeType":"YulAssignment","src":"373:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"402:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"383:18:111"},"nodeType":"YulFunctionCall","src":"383:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"373:6:111"}]},{"nodeType":"YulAssignment","src":"421:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"448:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"459:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"444:3:111"},"nodeType":"YulFunctionCall","src":"444:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"431:12:111"},"nodeType":"YulFunctionCall","src":"431:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"421:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"260:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"271:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"283:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"291:6:111","type":""}],"src":"215:254:111"},{"body":{"nodeType":"YulBlock","src":"544:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"590:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"599:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"602:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"592:6:111"},"nodeType":"YulFunctionCall","src":"592:12:111"},"nodeType":"YulExpressionStatement","src":"592:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"565:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"574:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"561:3:111"},"nodeType":"YulFunctionCall","src":"561:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"586:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"557:3:111"},"nodeType":"YulFunctionCall","src":"557:32:111"},"nodeType":"YulIf","src":"554:52:111"},{"nodeType":"YulAssignment","src":"615:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"644:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"625:18:111"},"nodeType":"YulFunctionCall","src":"625:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"615:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"510:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"521:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"533:6:111","type":""}],"src":"474:186:111"},{"body":{"nodeType":"YulBlock","src":"760:92:111","statements":[{"nodeType":"YulAssignment","src":"770:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"782:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"793:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"778:3:111"},"nodeType":"YulFunctionCall","src":"778:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"770:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"812:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"837:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"830:6:111"},"nodeType":"YulFunctionCall","src":"830:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"823:6:111"},"nodeType":"YulFunctionCall","src":"823:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"805:6:111"},"nodeType":"YulFunctionCall","src":"805:41:111"},"nodeType":"YulExpressionStatement","src":"805:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"729:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"740:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"751:4:111","type":""}],"src":"665:187:111"},{"body":{"nodeType":"YulBlock","src":"927:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"973:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"982:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"985:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"975:6:111"},"nodeType":"YulFunctionCall","src":"975:12:111"},"nodeType":"YulExpressionStatement","src":"975:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"948:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"957:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"944:3:111"},"nodeType":"YulFunctionCall","src":"944:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"969:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"940:3:111"},"nodeType":"YulFunctionCall","src":"940:32:111"},"nodeType":"YulIf","src":"937:52:111"},{"nodeType":"YulAssignment","src":"998:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1021:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1008:12:111"},"nodeType":"YulFunctionCall","src":"1008:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"998:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"893:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"904:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"916:6:111","type":""}],"src":"857:180:111"},{"body":{"nodeType":"YulBlock","src":"1193:530:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1203:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1213:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1207:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1224:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1242:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1253:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1238:3:111"},"nodeType":"YulFunctionCall","src":"1238:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"1228:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1272:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1283:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1265:6:111"},"nodeType":"YulFunctionCall","src":"1265:21:111"},"nodeType":"YulExpressionStatement","src":"1265:21:111"},{"nodeType":"YulVariableDeclaration","src":"1295:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"1306:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"1299:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1321:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1341:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1335:5:111"},"nodeType":"YulFunctionCall","src":"1335:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1325:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"1364:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"1372:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1357:6:111"},"nodeType":"YulFunctionCall","src":"1357:22:111"},"nodeType":"YulExpressionStatement","src":"1357:22:111"},{"nodeType":"YulAssignment","src":"1388:25:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1399:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1410:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1395:3:111"},"nodeType":"YulFunctionCall","src":"1395:18:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"1388:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"1422:29:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1440:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1448:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1436:3:111"},"nodeType":"YulFunctionCall","src":"1436:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"1426:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1460:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1469:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1464:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1528:169:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1549:3:111"},{"arguments":[{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"1564:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1558:5:111"},"nodeType":"YulFunctionCall","src":"1558:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"1573:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1554:3:111"},"nodeType":"YulFunctionCall","src":"1554:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1542:6:111"},"nodeType":"YulFunctionCall","src":"1542:75:111"},"nodeType":"YulExpressionStatement","src":"1542:75:111"},{"nodeType":"YulAssignment","src":"1630:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1641:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1646:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1637:3:111"},"nodeType":"YulFunctionCall","src":"1637:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"1630:3:111"}]},{"nodeType":"YulAssignment","src":"1662:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"1676:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1684:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1672:3:111"},"nodeType":"YulFunctionCall","src":"1672:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"1662:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1490:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1493:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1487:2:111"},"nodeType":"YulFunctionCall","src":"1487:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1501:18:111","statements":[{"nodeType":"YulAssignment","src":"1503:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1512:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1515:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1508:3:111"},"nodeType":"YulFunctionCall","src":"1508:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1503:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1483:3:111","statements":[]},"src":"1479:218:111"},{"nodeType":"YulAssignment","src":"1706:11:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"1714:3:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1706:4:111"}]}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1162:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1173:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1184:4:111","type":""}],"src":"1042:681:111"},{"body":{"nodeType":"YulBlock","src":"1832:230:111","statements":[{"body":{"nodeType":"YulBlock","src":"1878:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1887:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1890:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1880:6:111"},"nodeType":"YulFunctionCall","src":"1880:12:111"},"nodeType":"YulExpressionStatement","src":"1880:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1853:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1862:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1849:3:111"},"nodeType":"YulFunctionCall","src":"1849:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1874:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1845:3:111"},"nodeType":"YulFunctionCall","src":"1845:32:111"},"nodeType":"YulIf","src":"1842:52:111"},{"nodeType":"YulAssignment","src":"1903:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1932:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1913:18:111"},"nodeType":"YulFunctionCall","src":"1913:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1903:6:111"}]},{"nodeType":"YulAssignment","src":"1951:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1984:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1995:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1980:3:111"},"nodeType":"YulFunctionCall","src":"1980:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1961:18:111"},"nodeType":"YulFunctionCall","src":"1961:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1951:6:111"}]},{"nodeType":"YulAssignment","src":"2008:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2041:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2052:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2037:3:111"},"nodeType":"YulFunctionCall","src":"2037:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2018:18:111"},"nodeType":"YulFunctionCall","src":"2018:38:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2008:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1782:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1793:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1805:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1813:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1821:6:111","type":""}],"src":"1728:334:111"},{"body":{"nodeType":"YulBlock","src":"2168:76:111","statements":[{"nodeType":"YulAssignment","src":"2178:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2190:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2201:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2186:3:111"},"nodeType":"YulFunctionCall","src":"2186:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2178:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2220:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2231:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2213:6:111"},"nodeType":"YulFunctionCall","src":"2213:25:111"},"nodeType":"YulExpressionStatement","src":"2213:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2137:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2148:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2159:4:111","type":""}],"src":"2067:177:111"},{"body":{"nodeType":"YulBlock","src":"2353:224:111","statements":[{"body":{"nodeType":"YulBlock","src":"2399:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2408:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2411:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2401:6:111"},"nodeType":"YulFunctionCall","src":"2401:12:111"},"nodeType":"YulExpressionStatement","src":"2401:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2374:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2383:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2370:3:111"},"nodeType":"YulFunctionCall","src":"2370:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2395:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2366:3:111"},"nodeType":"YulFunctionCall","src":"2366:32:111"},"nodeType":"YulIf","src":"2363:52:111"},{"nodeType":"YulAssignment","src":"2424:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2453:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2434:18:111"},"nodeType":"YulFunctionCall","src":"2434:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2424:6:111"}]},{"nodeType":"YulAssignment","src":"2472:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2505:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2516:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2501:3:111"},"nodeType":"YulFunctionCall","src":"2501:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2482:18:111"},"nodeType":"YulFunctionCall","src":"2482:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2472:6:111"}]},{"nodeType":"YulAssignment","src":"2529:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2556:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2567:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2552:3:111"},"nodeType":"YulFunctionCall","src":"2552:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2539:12:111"},"nodeType":"YulFunctionCall","src":"2539:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2529:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2303:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2314:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2326:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2334:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2342:6:111","type":""}],"src":"2249:328:111"},{"body":{"nodeType":"YulBlock","src":"2756:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2773:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2784:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2766:6:111"},"nodeType":"YulFunctionCall","src":"2766:21:111"},"nodeType":"YulExpressionStatement","src":"2766:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2818:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2803:3:111"},"nodeType":"YulFunctionCall","src":"2803:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2823:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2796:6:111"},"nodeType":"YulFunctionCall","src":"2796:29:111"},"nodeType":"YulExpressionStatement","src":"2796:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2856:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2841:3:111"},"nodeType":"YulFunctionCall","src":"2841:18:111"},{"hexValue":"4753323033","kind":"string","nodeType":"YulLiteral","src":"2861:7:111","type":"","value":"GS203"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2834:6:111"},"nodeType":"YulFunctionCall","src":"2834:35:111"},"nodeType":"YulExpressionStatement","src":"2834:35:111"},{"nodeType":"YulAssignment","src":"2878:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2890:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2901:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2886:3:111"},"nodeType":"YulFunctionCall","src":"2886:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2878:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2733:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2747:4:111","type":""}],"src":"2582:328:111"},{"body":{"nodeType":"YulBlock","src":"3089:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3106:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3117:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3099:6:111"},"nodeType":"YulFunctionCall","src":"3099:21:111"},"nodeType":"YulExpressionStatement","src":"3099:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3140:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3151:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3136:3:111"},"nodeType":"YulFunctionCall","src":"3136:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3156:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3129:6:111"},"nodeType":"YulFunctionCall","src":"3129:29:111"},"nodeType":"YulExpressionStatement","src":"3129:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3178:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3189:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3174:3:111"},"nodeType":"YulFunctionCall","src":"3174:18:111"},{"hexValue":"4753323034","kind":"string","nodeType":"YulLiteral","src":"3194:7:111","type":"","value":"GS204"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:35:111"},"nodeType":"YulExpressionStatement","src":"3167:35:111"},{"nodeType":"YulAssignment","src":"3211:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3234:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3219:3:111"},"nodeType":"YulFunctionCall","src":"3219:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3211:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3066:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3080:4:111","type":""}],"src":"2915:328:111"},{"body":{"nodeType":"YulBlock","src":"3280:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3297:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3300:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3290:6:111"},"nodeType":"YulFunctionCall","src":"3290:88:111"},"nodeType":"YulExpressionStatement","src":"3290:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3394:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3397:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3387:6:111"},"nodeType":"YulFunctionCall","src":"3387:15:111"},"nodeType":"YulExpressionStatement","src":"3387:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:15:111"},"nodeType":"YulExpressionStatement","src":"3411:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"3248:184:111"},{"body":{"nodeType":"YulBlock","src":"3484:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"3575:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"3577:16:111"},"nodeType":"YulFunctionCall","src":"3577:18:111"},"nodeType":"YulExpressionStatement","src":"3577:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3500:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3507:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"3497:2:111"},"nodeType":"YulFunctionCall","src":"3497:77:111"},"nodeType":"YulIf","src":"3494:103:111"},{"nodeType":"YulAssignment","src":"3606:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3617:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3624:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3613:3:111"},"nodeType":"YulFunctionCall","src":"3613:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"3606:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"3466:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"3476:3:111","type":""}],"src":"3437:195:111"},{"body":{"nodeType":"YulBlock","src":"3738:125:111","statements":[{"nodeType":"YulAssignment","src":"3748:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3771:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3756:3:111"},"nodeType":"YulFunctionCall","src":"3756:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3748:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3790:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3805:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3813:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3801:3:111"},"nodeType":"YulFunctionCall","src":"3801:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3783:6:111"},"nodeType":"YulFunctionCall","src":"3783:74:111"},"nodeType":"YulExpressionStatement","src":"3783:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3707:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3718:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3729:4:111","type":""}],"src":"3637:226:111"},{"body":{"nodeType":"YulBlock","src":"4042:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4059:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4070:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4052:6:111"},"nodeType":"YulFunctionCall","src":"4052:21:111"},"nodeType":"YulExpressionStatement","src":"4052:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4104:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4089:3:111"},"nodeType":"YulFunctionCall","src":"4089:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4109:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4082:6:111"},"nodeType":"YulFunctionCall","src":"4082:29:111"},"nodeType":"YulExpressionStatement","src":"4082:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4131:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4142:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4127:3:111"},"nodeType":"YulFunctionCall","src":"4127:18:111"},{"hexValue":"4753323031","kind":"string","nodeType":"YulLiteral","src":"4147:7:111","type":"","value":"GS201"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4120:6:111"},"nodeType":"YulFunctionCall","src":"4120:35:111"},"nodeType":"YulExpressionStatement","src":"4120:35:111"},{"nodeType":"YulAssignment","src":"4164:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4176:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4187:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4172:3:111"},"nodeType":"YulFunctionCall","src":"4172:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4164:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4019:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4033:4:111","type":""}],"src":"3868:328:111"},{"body":{"nodeType":"YulBlock","src":"4375:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4392:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4403:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4385:6:111"},"nodeType":"YulFunctionCall","src":"4385:21:111"},"nodeType":"YulExpressionStatement","src":"4385:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4426:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4437:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4422:3:111"},"nodeType":"YulFunctionCall","src":"4422:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4442:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4415:6:111"},"nodeType":"YulFunctionCall","src":"4415:29:111"},"nodeType":"YulExpressionStatement","src":"4415:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4475:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4460:3:111"},"nodeType":"YulFunctionCall","src":"4460:18:111"},{"hexValue":"4753323032","kind":"string","nodeType":"YulLiteral","src":"4480:7:111","type":"","value":"GS202"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4453:6:111"},"nodeType":"YulFunctionCall","src":"4453:35:111"},"nodeType":"YulExpressionStatement","src":"4453:35:111"},{"nodeType":"YulAssignment","src":"4497:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4520:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4505:3:111"},"nodeType":"YulFunctionCall","src":"4505:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4497:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4352:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4366:4:111","type":""}],"src":"4201:328:111"},{"body":{"nodeType":"YulBlock","src":"4566:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4583:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4586:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4576:6:111"},"nodeType":"YulFunctionCall","src":"4576:88:111"},"nodeType":"YulExpressionStatement","src":"4576:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4680:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4683:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4673:6:111"},"nodeType":"YulFunctionCall","src":"4673:15:111"},"nodeType":"YulExpressionStatement","src":"4673:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4704:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4707:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4697:6:111"},"nodeType":"YulFunctionCall","src":"4697:15:111"},"nodeType":"YulExpressionStatement","src":"4697:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"4534:184:111"},{"body":{"nodeType":"YulBlock","src":"4755:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4772:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4775:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4765:6:111"},"nodeType":"YulFunctionCall","src":"4765:88:111"},"nodeType":"YulExpressionStatement","src":"4765:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4869:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4872:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4862:6:111"},"nodeType":"YulFunctionCall","src":"4862:15:111"},"nodeType":"YulExpressionStatement","src":"4862:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4893:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4896:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4886:6:111"},"nodeType":"YulFunctionCall","src":"4886:15:111"},"nodeType":"YulExpressionStatement","src":"4886:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"4723:184:111"},{"body":{"nodeType":"YulBlock","src":"5086:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5103:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5114:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5096:6:111"},"nodeType":"YulFunctionCall","src":"5096:21:111"},"nodeType":"YulExpressionStatement","src":"5096:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5133:3:111"},"nodeType":"YulFunctionCall","src":"5133:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5153:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5126:6:111"},"nodeType":"YulFunctionCall","src":"5126:29:111"},"nodeType":"YulExpressionStatement","src":"5126:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5175:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5186:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5171:3:111"},"nodeType":"YulFunctionCall","src":"5171:18:111"},{"hexValue":"4753323035","kind":"string","nodeType":"YulLiteral","src":"5191:7:111","type":"","value":"GS205"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5164:6:111"},"nodeType":"YulFunctionCall","src":"5164:35:111"},"nodeType":"YulExpressionStatement","src":"5164:35:111"},{"nodeType":"YulAssignment","src":"5208:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5231:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5216:3:111"},"nodeType":"YulFunctionCall","src":"5216:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5208:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5063:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5077:4:111","type":""}],"src":"4912:328:111"},{"body":{"nodeType":"YulBlock","src":"5294:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"5316:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"5318:16:111"},"nodeType":"YulFunctionCall","src":"5318:18:111"},"nodeType":"YulExpressionStatement","src":"5318:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"5310:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"5313:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5307:2:111"},"nodeType":"YulFunctionCall","src":"5307:8:111"},"nodeType":"YulIf","src":"5304:34:111"},{"nodeType":"YulAssignment","src":"5347:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"5359:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"5362:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5355:3:111"},"nodeType":"YulFunctionCall","src":"5355:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"5347:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"5276:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"5279:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"5285:4:111","type":""}],"src":"5245:125:111"},{"body":{"nodeType":"YulBlock","src":"5422:149:111","statements":[{"body":{"nodeType":"YulBlock","src":"5449:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"5451:16:111"},"nodeType":"YulFunctionCall","src":"5451:18:111"},"nodeType":"YulExpressionStatement","src":"5451:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5442:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5435:6:111"},"nodeType":"YulFunctionCall","src":"5435:13:111"},"nodeType":"YulIf","src":"5432:39:111"},{"nodeType":"YulAssignment","src":"5480:85:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5491:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5498:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5487:3:111"},"nodeType":"YulFunctionCall","src":"5487:78:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"5480:3:111"}]}]},"name":"decrement_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5404:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"5414:3:111","type":""}],"src":"5375:196:111"},{"body":{"nodeType":"YulBlock","src":"5750:154:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5767:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5778:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5760:6:111"},"nodeType":"YulFunctionCall","src":"5760:21:111"},"nodeType":"YulExpressionStatement","src":"5760:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5801:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5812:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5797:3:111"},"nodeType":"YulFunctionCall","src":"5797:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5817:1:111","type":"","value":"5"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5790:6:111"},"nodeType":"YulFunctionCall","src":"5790:29:111"},"nodeType":"YulExpressionStatement","src":"5790:29:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5839:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5850:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5835:3:111"},"nodeType":"YulFunctionCall","src":"5835:18:111"},{"hexValue":"4753303331","kind":"string","nodeType":"YulLiteral","src":"5855:7:111","type":"","value":"GS031"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5828:6:111"},"nodeType":"YulFunctionCall","src":"5828:35:111"},"nodeType":"YulExpressionStatement","src":"5828:35:111"},{"nodeType":"YulAssignment","src":"5872:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5895:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5880:3:111"},"nodeType":"YulFunctionCall","src":"5880:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5872:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5727:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5741:4:111","type":""}],"src":"5576:328:111"}]},"contents":"{\n { }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr__to_t_array$_t_address_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffffffffffffffffffffffffffffffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_addresst_addresst_address(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := abi_decode_address(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_stringliteral_3d415fb64f163720f719509288c33af2675ad2c80f86a95800d94f19c802a300__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS203\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_bd322b68614692ef7b503763b6ccedf066a7ae3f91196a908df3c549d078f597__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS204\")\n tail := add(headStart, 96)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_2ed3cfd606bc0ca63de16ac40539251d9539eb77db0a0d075dd487d4cf1c74c7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS201\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_a5f8340ff5526fa73c9197322cd5a1c742b87b5fdfeb41a9c278b80dab01159b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS202\")\n tail := add(headStart, 96)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_f86d3c4b40d399421f213105cf28bb5b688028c0e3d9bd9eb6f879f0bebe6c39__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS205\")\n tail := add(headStart, 96)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function decrement_t_uint256(value) -> ret\n {\n if iszero(value) { panic_error_0x11() }\n ret := add(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n }\n function abi_encode_tuple_t_stringliteral_b7248be3e8887f14d79f63d350787adcdb5e12b47898ebd6ef2aacf660fc9f17__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 5)\n mstore(add(headStart, 64), \"GS031\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0e67e2b1161005b578063a0e67e2b146100d2578063e318b52b146100e7578063e75235b8146100fa578063f8dc5dd91461010b57600080fd5b80630d582f13146100825780632f54bf6e14610097578063694e80c3146100bf575b600080fd5b610095610090366004610b72565b61011e565b005b6100aa6100a5366004610b9c565b610341565b60405190151581526020015b60405180910390f35b6100956100cd366004610bbe565b610396565b6100da61047c565b6040516100b69190610bd7565b6100956100f5366004610c31565b610593565b6002546040519081526020016100b6565b610095610119366004610c74565b6108b5565b610126610af8565b73ffffffffffffffffffffffffffffffffffffffff821615801590610162575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015610184575073ffffffffffffffffffffffffffffffffffffffff82163014155b6101d55760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260208190526040902054161561024a5760405162461bcd60e51b815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016101cc565b600060208190527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d805473ffffffffffffffffffffffffffffffffffffffff858116808552604085208054929093167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600180855283549091169091179091558054916102dd83610cdf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1806002541461033d5761033d81610396565b5050565b600073ffffffffffffffffffffffffffffffffffffffff8216600114801590610390575073ffffffffffffffffffffffffffffffffffffffff8281166000908152602081905260409020541615155b92915050565b61039e610af8565b6001548111156103f05760405162461bcd60e51b815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016101cc565b60018110156104415760405162461bcd60e51b815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016101cc565b60028190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b6060600060015467ffffffffffffffff81111561049b5761049b610d17565b6040519080825280602002602001820160405280156104c4578160200160208202803683370190505b506001600090815260208190527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff811660011461058b578083838151811061053f5761053f610d46565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815291829052604090912054168161058381610cdf565b92505061050e565b509092915050565b61059b610af8565b73ffffffffffffffffffffffffffffffffffffffff8116158015906105d7575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156105f9575073ffffffffffffffffffffffffffffffffffffffff81163014155b6106455760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526020819052604090205416156106ba5760405162461bcd60e51b815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff8216158015906106f6575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6107425760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152602081905260409020548116908316146107bb5760405162461bcd60e51b815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260208181526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b6108bd610af8565b80600180546108cc9190610d75565b101561091a5760405162461bcd60e51b815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff821615801590610956575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6109a25760405162461bcd60e51b815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260208190526040902054811690831614610a1b5760405162461bcd60e51b815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016101cc565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260208190526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556001805491610a9383610d8c565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a18060025414610af357610af381610396565b505050565b333014610b475760405162461bcd60e51b815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016101cc565b565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b6d57600080fd5b919050565b60008060408385031215610b8557600080fd5b610b8e83610b49565b946020939093013593505050565b600060208284031215610bae57600080fd5b610bb782610b49565b9392505050565b600060208284031215610bd057600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015610c2557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610bf3565b50909695505050505050565b600080600060608486031215610c4657600080fd5b610c4f84610b49565b9250610c5d60208501610b49565b9150610c6b60408501610b49565b90509250925092565b600080600060608486031215610c8957600080fd5b610c9284610b49565b9250610ca060208501610b49565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610d1057610d10610cb0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015610d8757610d87610cb0565b500390565b600081610d9b57610d9b610cb0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212208b625f5944d34b877d556641c685018572b2c981e96d2db8a2391caf47d8b9a064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA0E67E2B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0xD2 JUMPI DUP1 PUSH4 0xE318B52B EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0xE75235B8 EQ PUSH2 0xFA JUMPI DUP1 PUSH4 0xF8DC5DD9 EQ PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xD582F13 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x694E80C3 EQ PUSH2 0xBF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0xB72 JUMP JUMPDEST PUSH2 0x11E JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAA PUSH2 0xA5 CALLDATASIZE PUSH1 0x4 PUSH2 0xB9C JUMP JUMPDEST PUSH2 0x341 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x95 PUSH2 0xCD CALLDATASIZE PUSH1 0x4 PUSH2 0xBBE JUMP JUMPDEST PUSH2 0x396 JUMP JUMPDEST PUSH2 0xDA PUSH2 0x47C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB6 SWAP2 SWAP1 PUSH2 0xBD7 JUMP JUMPDEST PUSH2 0x95 PUSH2 0xF5 CALLDATASIZE PUSH1 0x4 PUSH2 0xC31 JUMP JUMPDEST PUSH2 0x593 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xB6 JUMP JUMPDEST PUSH2 0x95 PUSH2 0x119 CALLDATASIZE PUSH1 0x4 PUSH2 0xC74 JUMP JUMPDEST PUSH2 0x8B5 JUMP JUMPDEST PUSH2 0x126 PUSH2 0xAF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x162 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x184 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x1D5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x24A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND DUP1 DUP6 MSTORE PUSH1 0x40 DUP6 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x1 DUP1 DUP6 MSTORE DUP4 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP1 SLOAD SWAP2 PUSH2 0x2DD DUP4 PUSH2 0xCDF JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x2 SLOAD EQ PUSH2 0x33D JUMPI PUSH2 0x33D DUP2 PUSH2 0x396 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x390 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x39E PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 GT ISZERO PUSH2 0x3F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x441 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323032000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x610F7FF2B304AE8903C3DE74C60C6AB1F7D6226B3F52C5161905BB5AD4039C93 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x49B JUMPI PUSH2 0x49B PUSH2 0xD17 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x4C4 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xADA5013122D395BA3C54772283FB069B10426056EF8CA54750CB9BB552A59E7D SLOAD SWAP2 SWAP3 POP SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ PUSH2 0x58B JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x53F JUMPI PUSH2 0x53F PUSH2 0xD46 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND DUP2 PUSH2 0x583 DUP2 PUSH2 0xCDF JUMP JUMPDEST SWAP3 POP POP PUSH2 0x50E JUMP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x59B PUSH2 0xAF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x5D7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x5F9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x645 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x6BA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323034000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x6F6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x7BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 DUP8 AND DUP1 DUP7 MSTORE DUP4 DUP7 KECCAK256 DUP1 SLOAD SWAP3 DUP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP4 DUP5 AND OR SWAP1 SSTORE SWAP7 DUP11 AND DUP6 MSTORE DUP3 DUP6 KECCAK256 DUP1 SLOAD DUP3 AND SWAP1 SWAP8 OR SWAP1 SWAP7 SSTORE SWAP3 DUP5 SWAP1 MSTORE DUP3 SLOAD SWAP1 SWAP5 AND SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0x9465FA0C962CC76958E6373A993326400C1C94F8BE2FE3A952ADFA7F60B2EA26 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH2 0x8BD PUSH2 0xAF8 JUMP JUMPDEST DUP1 PUSH1 0x1 DUP1 SLOAD PUSH2 0x8CC SWAP2 SWAP1 PUSH2 0xD75 JUMP JUMPDEST LT ISZERO PUSH2 0x91A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323031000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x956 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x1 EQ ISZERO JUMPDEST PUSH2 0x9A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323033000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0xA1B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753323035000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP9 DUP7 AND DUP5 MSTORE SWAP2 DUP4 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE DUP3 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP2 PUSH2 0xA93 DUP4 PUSH2 0xD8C JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH32 0xF8D49FC529812E9A7C5C50E69C20F0DCCC0DB8FA95C98BC58CC9A4F1C1299EAF SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 PUSH1 0x2 SLOAD EQ PUSH2 0xAF3 JUMPI PUSH2 0xAF3 DUP2 PUSH2 0x396 JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xB47 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x5 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4753303331000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x1CC JUMP JUMPDEST JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xB6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB8E DUP4 PUSH2 0xB49 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB7 DUP3 PUSH2 0xB49 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xC25 JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xBF3 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC4F DUP5 PUSH2 0xB49 JUMP JUMPDEST SWAP3 POP PUSH2 0xC5D PUSH1 0x20 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP2 POP PUSH2 0xC6B PUSH1 0x40 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC92 DUP5 PUSH2 0xB49 JUMP JUMPDEST SWAP3 POP PUSH2 0xCA0 PUSH1 0x20 DUP6 ADD PUSH2 0xB49 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0xD10 JUMPI PUSH2 0xD10 PUSH2 0xCB0 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0xD87 JUMPI PUSH2 0xD87 PUSH2 0xCB0 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0xD9B JUMPI PUSH2 0xD9B PUSH2 0xCB0 JUMP JUMPDEST POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP12 PUSH3 0x5F5944 0xD3 0x4B DUP8 PUSH30 0x556641C685018572B2C981E96D2DB8A2391CAF47D8B9A064736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"298:6409:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2305:625;;;;;;:::i;:::-;;:::i;:::-;;6048:138;;;;;;:::i;:::-;;:::i;:::-;;;830:14:111;;823:22;805:41;;793:2;778:18;6048:138:5;;;;;;;;5589:360;;;;;;:::i;:::-;;:::i;6268:437::-;;;:::i;:::-;;;;;;;:::i;4507:826::-;;;;;;:::i;:::-;;:::i;5955:87::-;6026:9;;5955:87;;2213:25:111;;;2201:2;2186:18;5955:87:5;2067:177:111;3371:727:5;;;;;;:::i;:::-;;:::i;2305:625::-;440:17:9;:15;:17::i;:::-;2481:19:5::1;::::0;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;2504:24:5::1;::::0;::::1;520:3;2504:24;;2481:47;:73;;;;-1:-1:-1::0;2532:22:5::1;::::0;::::1;2549:4;2532:22;;2481:73;2473:91;;;::::0;-1:-1:-1;;;2473:91:5;;2784:2:111;2473:91:5::1;::::0;::::1;2766:21:111::0;2823:1;2803:18;;;2796:29;2861:7;2841:18;;;2834:35;2886:18;;2473:91:5::1;;;;;;;;;2622:27;:13:::0;;::::1;2647:1;2622:13:::0;;;::::1;::::0;;;;;;;::::1;:27:::0;2614:45:::1;;;::::0;-1:-1:-1;;;2614:45:5;;3117:2:111;2614:45:5::1;::::0;::::1;3099:21:111::0;3156:1;3136:18;;;3129:29;3194:7;3174:18;;;3167:35;3219:18;;2614:45:5::1;2915:328:111::0;2614:45:5::1;2685:6;:23;::::0;;;;;;::::1;2669:13:::0;;::::1;::::0;;;2685:23;2669:13;;:39;;2685:23;;;::::1;2669:39:::0;;;::::1;;::::0;;;-1:-1:-1;2718:23:5;;;:31;;;;::::1;::::0;;::::1;::::0;;;2759:12;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;2786:17:5::1;::::0;3813:42:111;3801:55;;3783:74;;2786:17:5::1;::::0;3771:2:111;3756:18;2786:17:5::1;;;;;;;2884:10;2871:9;;:23;2867:56;;2896:27;2912:10;2896:15;:27::i;:::-;2305:625:::0;;:::o;6048:138::-;6101:4;6124:24;;;520:3;6124:24;;;;:55;;-1:-1:-1;6152:27:5;:13;;;6177:1;6152:13;;;;;;;;;;;;:27;;6124:55;6117:62;6048:138;-1:-1:-1;;6048:138:5:o;5589:360::-;440:17:9;:15;:17::i;:::-;5753:10:5::1;;5739;:24;;5731:42;;;::::0;-1:-1:-1;;;5731:42:5;;4070:2:111;5731:42:5::1;::::0;::::1;4052:21:111::0;4109:1;4089:18;;;4082:29;4147:7;4127:18;;;4120:35;4172:18;;5731:42:5::1;3868:328:111::0;5731:42:5::1;5857:1;5843:10;:15;;5835:33;;;::::0;-1:-1:-1;;;5835:33:5;;4403:2:111;5835:33:5::1;::::0;::::1;4385:21:111::0;4442:1;4422:18;;;4415:29;4480:7;4460:18;;;4453:35;4505:18;;5835:33:5::1;4201:328:111::0;5835:33:5::1;5878:9;:22:::0;;;5915:27:::1;::::0;2213:25:111;;;5915:27:5::1;::::0;2201:2:111;2186:18;5915:27:5::1;;;;;;;5589:360:::0;:::o;6268:437::-;6310:16;6338:22;6377:10;;6363:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6363:25:5;-1:-1:-1;520:3:5;6432:13;6482:23;;;;;;;;;6338:50;;-1:-1:-1;6432:13:5;6482:23;;6515:162;6522:31;;;520:3;6522:31;6515:162;;6584:12;6569:5;6575;6569:12;;;;;;;;:::i;:::-;:27;;;;:12;;;;;;;;;;:27;;;;6625:20;;;:6;:20;;;;;;;;;;;;;6659:7;;;;:::i;:::-;;;;6515:162;;;-1:-1:-1;6693:5:5;;6268:437;-1:-1:-1;;6268:437:5:o;4507:826::-;440:17:9;:15;:17::i;:::-;4721:22:5::1;::::0;::::1;::::0;;::::1;::::0;:53:::1;;-1:-1:-1::0;4747:27:5::1;::::0;::::1;520:3;4747:27;;4721:53;:82;;;;-1:-1:-1::0;4778:25:5::1;::::0;::::1;4798:4;4778:25;;4721:82;4713:100;;;::::0;-1:-1:-1;;;4713:100:5;;2784:2:111;4713:100:5::1;::::0;::::1;2766:21:111::0;2823:1;2803:18;;;2796:29;2861:7;2841:18;;;2834:35;2886:18;;4713:100:5::1;2582:328:111::0;4713:100:5::1;4871:30;:16:::0;;::::1;4899:1;4871:16:::0;;;::::1;::::0;;;;;;;::::1;:30:::0;4863:48:::1;;;::::0;-1:-1:-1;;;4863:48:5;;3117:2:111;4863:48:5::1;::::0;::::1;3099:21:111::0;3156:1;3136:18;;;3129:29;3194:7;3174:18;;;3167:35;3219:18;;4863:48:5::1;2915:328:111::0;4863:48:5::1;5012:22;::::0;::::1;::::0;;::::1;::::0;:53:::1;;-1:-1:-1::0;5038:27:5::1;::::0;::::1;520:3;5038:27;;5012:53;5004:71;;;::::0;-1:-1:-1;;;5004:71:5;;2784:2:111;5004:71:5::1;::::0;::::1;2766:21:111::0;2823:1;2803:18;;;2796:29;2861:7;2841:18;;;2834:35;2886:18;;5004:71:5::1;2582:328:111::0;5004:71:5::1;5093:29;:17:::0;;::::1;:6;:17:::0;;;::::1;::::0;;;;;;;;::::1;:29:::0;;::::1;;5085:47;;;::::0;-1:-1:-1;;;5085:47:5;;5114:2:111;5085:47:5::1;::::0;::::1;5096:21:111::0;5153:1;5133:18;;;5126:29;5191:7;5171:18;;;5164:35;5216:18;;5085:47:5::1;4912:328:111::0;5085:47:5::1;5161:16;::::0;;::::1;:6;:16:::0;;;::::1;::::0;;;;;;;;;5142;;::::1;::::0;;;;;;:35;;5161:16;;::::1;5142:35:::0;;;::::1;;::::0;;5187:17;;::::1;::::0;;;;;:28;;;::::1;::::0;;::::1;::::0;;;5225:16;;;;:29;;;;::::1;::::0;;;5269:22;;3783:74:111;;;5269:22:5::1;::::0;3756:18:111;5269:22:5::1;;;;;;;5306:20;::::0;3813:42:111;3801:55;;3783:74;;5306:20:5::1;::::0;3771:2:111;3756:18;5306:20:5::1;;;;;;;4507:826:::0;;;:::o;3371:727::-;440:17:9;:15;:17::i;:::-;3607:10:5::1;3602:1;3589:10:::0;::::1;:14;;;;:::i;:::-;:28;;3581:46;;;::::0;-1:-1:-1;;;3581:46:5;;4070:2:111;3581:46:5::1;::::0;::::1;4052:21:111::0;4109:1;4089:18;;;4082:29;4147:7;4127:18;;;4120:35;4172:18;;3581:46:5::1;3868:328:111::0;3581:46:5::1;3725:19;::::0;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;3748:24:5::1;::::0;::::1;520:3;3748:24;;3725:47;3717:65;;;::::0;-1:-1:-1;;;3717:65:5;;2784:2:111;3717:65:5::1;::::0;::::1;2766:21:111::0;2823:1;2803:18;;;2796:29;2861:7;2841:18;;;2834:35;2886:18;;3717:65:5::1;2582:328:111::0;3717:65:5::1;3800:26;:17:::0;;::::1;:6;:17:::0;;;::::1;::::0;;;;;;;;::::1;:26:::0;;::::1;;3792:44;;;::::0;-1:-1:-1;;;3792:44:5;;5114:2:111;3792:44:5::1;::::0;::::1;5096:21:111::0;5153:1;5133:18;;;5126:29;5191:7;5171:18;;;5164:35;5216:18;;3792:44:5::1;4912:328:111::0;3792:44:5::1;3866:13;::::0;;::::1;:6;:13:::0;;;::::1;::::0;;;;;;;;;3846:17;;::::1;::::0;;;;;:33;;3866:13;;;::::1;3846:33:::0;;;::::1;;::::0;;;3889:13;;;:26;;;;::::1;::::0;;;-1:-1:-1;3925:12:5;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;3952:19:5::1;::::0;3813:42:111;3801:55;;3783:74;;3952:19:5::1;::::0;3771:2:111;3756:18;3952:19:5::1;;;;;;;4052:10;4039:9;;:23;4035:56;;4064:27;4080:10;4064:15;:27::i;:::-;3371:727:::0;;;:::o;231:102:9:-;289:10;311:4;289:27;281:45;;;;-1:-1:-1;;;281:45:9;;5778:2:111;281:45:9;;;5760:21:111;5817:1;5797:18;;;5790:29;5855:7;5835:18;;;5828:35;5880:18;;281:45:9;5576:328:111;281:45:9;231:102::o;14:196:111:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:111:o;474:186::-;533:6;586:2;574:9;565:7;561:23;557:32;554:52;;;602:1;599;592:12;554:52;625:29;644:9;625:29;:::i;:::-;615:39;474:186;-1:-1:-1;;;474:186:111:o;857:180::-;916:6;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;-1:-1:-1;1008:23:111;;857:180;-1:-1:-1;857:180:111:o;1042:681::-;1213:2;1265:21;;;1335:13;;1238:18;;;1357:22;;;1184:4;;1213:2;1436:15;;;;1410:2;1395:18;;;1184:4;1479:218;1493:6;1490:1;1487:13;1479:218;;;1558:13;;1573:42;1554:62;1542:75;;1672:15;;;;1637:12;;;;1515:1;1508:9;1479:218;;;-1:-1:-1;1714:3:111;;1042:681;-1:-1:-1;;;;;;1042:681:111:o;1728:334::-;1805:6;1813;1821;1874:2;1862:9;1853:7;1849:23;1845:32;1842:52;;;1890:1;1887;1880:12;1842:52;1913:29;1932:9;1913:29;:::i;:::-;1903:39;;1961:38;1995:2;1984:9;1980:18;1961:38;:::i;:::-;1951:48;;2018:38;2052:2;2041:9;2037:18;2018:38;:::i;:::-;2008:48;;1728:334;;;;;:::o;2249:328::-;2326:6;2334;2342;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;2434:29;2453:9;2434:29;:::i;:::-;2424:39;;2482:38;2516:2;2505:9;2501:18;2482:38;:::i;:::-;2472:48;;2567:2;2556:9;2552:18;2539:32;2529:42;;2249:328;;;;;:::o;3248:184::-;3300:77;3297:1;3290:88;3397:4;3394:1;3387:15;3421:4;3418:1;3411:15;3437:195;3476:3;3507:66;3500:5;3497:77;3494:103;;3577:18;;:::i;:::-;-1:-1:-1;3624:1:111;3613:13;;3437:195::o;4534:184::-;4586:77;4583:1;4576:88;4683:4;4680:1;4673:15;4707:4;4704:1;4697:15;4723:184;4775:77;4772:1;4765:88;4872:4;4869:1;4862:15;4896:4;4893:1;4886:15;5245:125;5285:4;5313:1;5310;5307:8;5304:34;;;5318:18;;:::i;:::-;-1:-1:-1;5355:9:111;;5245:125::o;5375:196::-;5414:3;5442:5;5432:39;;5451:18;;:::i;:::-;-1:-1:-1;5498:66:111;5487:78;;5375:196::o"},"gasEstimates":{"creation":{"codeDepositCost":"715000","executionCost":"747","totalCost":"715747"},"external":{"addOwnerWithThreshold(address,uint256)":"infinite","changeThreshold(uint256)":"25631","getOwners()":"infinite","getThreshold()":"2324","isOwner(address)":"2611","removeOwner(address,address,uint256)":"infinite","swapOwner(address,address,address)":"infinite"},"internal":{"setupOwners(address[] memory,uint256)":"infinite"}},"methodIdentifiers":{"addOwnerWithThreshold(address,uint256)":"0d582f13","changeThreshold(uint256)":"694e80c3","getOwners()":"a0e67e2b","getThreshold()":"e75235b8","isOwner(address)":"2f54bf6e","removeOwner(address,address,uint256)":"f8dc5dd9","swapOwner(address,address,address)":"e318b52b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Stefan George - Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"addOwnerWithThreshold(address,uint256)\":{\"details\":\"Allows to add a new owner to the Safe and update the threshold at the same time. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"New owner address.\"}},\"changeThreshold(uint256)\":{\"details\":\"Allows to update the number of required confirmations by Safe owners. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\"}},\"getOwners()\":{\"details\":\"Returns array of owners.\",\"returns\":{\"_0\":\"Array of Safe owners.\"}},\"removeOwner(address,address,uint256)\":{\"details\":\"Allows to remove an owner from the Safe and update the threshold at the same time. This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"Owner address to be removed.\",\"prevOwner\":\"Owner that pointed to the owner to be removed in the linked list\"}},\"swapOwner(address,address,address)\":{\"details\":\"Allows to swap/replace an owner from the Safe with another address. This can only be done via a Safe transaction.\",\"params\":{\"newOwner\":\"New owner address.\",\"oldOwner\":\"Owner address to be replaced.\",\"prevOwner\":\"Owner that pointed to the owner to be replaced in the linked list\"}}},\"title\":\"OwnerManager - Manages a set of owners and a threshold to perform actions.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addOwnerWithThreshold(address,uint256)\":{\"notice\":\"Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\"},\"changeThreshold(uint256)\":{\"notice\":\"Changes the threshold of the Safe to `_threshold`.\"},\"removeOwner(address,address,uint256)\":{\"notice\":\"Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\"},\"swapOwner(address,address,address)\":{\"notice\":\"Replaces the owner `oldOwner` in the Safe with `newOwner`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":\"OwnerManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract OwnerManager is SelfAuthorized {\\n event AddedOwner(address owner);\\n event RemovedOwner(address owner);\\n event ChangedThreshold(uint256 threshold);\\n\\n address internal constant SENTINEL_OWNERS = address(0x1);\\n\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\\n // Threshold can only be 0 at initialization.\\n // Check ensures that setup function can only be called once.\\n require(threshold == 0, \\\"GS200\\\");\\n // Validate that threshold is smaller than number of added owners.\\n require(_threshold <= _owners.length, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n // Initializing Safe owners.\\n address currentOwner = SENTINEL_OWNERS;\\n for (uint256 i = 0; i < _owners.length; i++) {\\n // Owner address cannot be null.\\n address owner = _owners[i];\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[currentOwner] = owner;\\n currentOwner = owner;\\n }\\n owners[currentOwner] = SENTINEL_OWNERS;\\n ownerCount = _owners.length;\\n threshold = _threshold;\\n }\\n\\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\\n /// @param owner New owner address.\\n /// @param _threshold New threshold.\\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[owner] = owners[SENTINEL_OWNERS];\\n owners[SENTINEL_OWNERS] = owner;\\n ownerCount++;\\n emit AddedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\\n /// @param owner Owner address to be removed.\\n /// @param _threshold New threshold.\\n function removeOwner(\\n address prevOwner,\\n address owner,\\n uint256 _threshold\\n ) public authorized {\\n // Only allow to remove an owner, if threshold can still be reached.\\n require(ownerCount - 1 >= _threshold, \\\"GS201\\\");\\n // Validate owner address and check that it corresponds to owner index.\\n require(owner != address(0) && owner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == owner, \\\"GS205\\\");\\n owners[prevOwner] = owners[owner];\\n owners[owner] = address(0);\\n ownerCount--;\\n emit RemovedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to swap/replace an owner from the Safe with another address.\\n /// This can only be done via a Safe transaction.\\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\\n /// @param oldOwner Owner address to be replaced.\\n /// @param newOwner New owner address.\\n function swapOwner(\\n address prevOwner,\\n address oldOwner,\\n address newOwner\\n ) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[newOwner] == address(0), \\\"GS204\\\");\\n // Validate oldOwner address and check that it corresponds to owner index.\\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == oldOwner, \\\"GS205\\\");\\n owners[newOwner] = owners[oldOwner];\\n owners[prevOwner] = newOwner;\\n owners[oldOwner] = address(0);\\n emit RemovedOwner(oldOwner);\\n emit AddedOwner(newOwner);\\n }\\n\\n /// @dev Allows to update the number of required confirmations by Safe owners.\\n /// This can only be done via a Safe transaction.\\n /// @notice Changes the threshold of the Safe to `_threshold`.\\n /// @param _threshold New threshold.\\n function changeThreshold(uint256 _threshold) public authorized {\\n // Validate that threshold is smaller than number of owners.\\n require(_threshold <= ownerCount, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n threshold = _threshold;\\n emit ChangedThreshold(threshold);\\n }\\n\\n function getThreshold() public view returns (uint256) {\\n return threshold;\\n }\\n\\n function isOwner(address owner) public view returns (bool) {\\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\\n }\\n\\n /// @dev Returns array of owners.\\n /// @return Array of Safe owners.\\n function getOwners() public view returns (address[] memory) {\\n address[] memory array = new address[](ownerCount);\\n\\n // populate return array\\n uint256 index = 0;\\n address currentOwner = owners[SENTINEL_OWNERS];\\n while (currentOwner != SENTINEL_OWNERS) {\\n array[index] = currentOwner;\\n currentOwner = owners[currentOwner];\\n index++;\\n }\\n return array;\\n }\\n}\\n\",\"keccak256\":\"0x01a3d64cc0967f42ae63802409f5404d18352516ea2a6335005003d919ffcf12\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1508,"contract":"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol:OwnerManager","label":"owners","offset":0,"slot":"0","type":"t_mapping(t_address,t_address)"},{"astId":1510,"contract":"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol:OwnerManager","label":"ownerCount","offset":0,"slot":"1","type":"t_uint256"},{"astId":1512,"contract":"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol:OwnerManager","label":"threshold","offset":0,"slot":"2","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addOwnerWithThreshold(address,uint256)":{"notice":"Adds the owner `owner` to the Safe and updates the threshold to `_threshold`."},"changeThreshold(uint256)":{"notice":"Changes the threshold of the Safe to `_threshold`."},"removeOwner(address,address,uint256)":{"notice":"Removes the owner `owner` from the Safe and updates the threshold to `_threshold`."},"swapOwner(address,address,address)":{"notice":"Replaces the owner `oldOwner` in the Safe with `newOwner`."}},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/Enum.sol":{"Enum":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"Enum - Collection of enums","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220ff1daed384ddd4c1b0e97b3f57fd3630fa741a9d8400beb82f186de3cc53c95764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT SAR 0xAE 0xD3 DUP5 0xDD 0xD4 0xC1 0xB0 0xE9 PUSH28 0x3F57FD3630FA741A9D8400BEB82F186DE3CC53C95764736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"164:57:6:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea2646970667358221220ff1daed384ddd4c1b0e97b3f57fd3630fa741a9d8400beb82f186de3cc53c95764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT SAR 0xAE 0xD3 DUP5 0xDD 0xD4 0xC1 0xB0 0xE9 PUSH28 0x3F57FD3630FA741A9D8400BEB82F186DE3CC53C95764736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"164:57:6:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"Enum - Collection of enums\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":\"Enum\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol":{"EtherPaymentFallback":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeReceived","type":"event"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"EtherPaymentFallback - A contract that has a fallback to accept ether payments","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50607a8061001e6000396000f3fe608060405236603f5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b600080fdfea2646970667358221220eb2993243c68faa3f5afdc6dcae35502c4450d97f8c7a67a44216fa93c20eb1a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x7A DUP1 PUSH2 0x1E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH1 0x3F JUMPI PUSH1 0x40 MLOAD CALLVALUE DUP2 MSTORE CALLER SWAP1 PUSH32 0x3D0CE9BFC3ED7D6862DBB28B2DEA94561FE714A1B4D019AA8AF39730D1AD7C3D SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEB 0x29 SWAP4 0x24 EXTCODECOPY PUSH9 0xFAA3F5AFDC6DCAE355 MUL 0xC4 GASLIMIT 0xD SWAP8 0xF8 0xC7 0xA6 PUSH27 0x44216FA93C20EB1A64736F6C634300080F00330000000000000000 ","sourceMap":"216:245:7:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_2019":{"entryPoint":null,"id":2019,"parameterSlots":0,"returnSlots":0},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:193:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"115:76:111","statements":[{"nodeType":"YulAssignment","src":"125:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"125:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"167:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:25:111"},"nodeType":"YulExpressionStatement","src":"160:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"84:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"95:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"106:4:111","type":""}],"src":"14:177:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405236603f5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b600080fdfea2646970667358221220eb2993243c68faa3f5afdc6dcae35502c4450d97f8c7a67a44216fa93c20eb1a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH1 0x3F JUMPI PUSH1 0x40 MLOAD CALLVALUE DUP2 MSTORE CALLER SWAP1 PUSH32 0x3D0CE9BFC3ED7D6862DBB28B2DEA94561FE714A1B4D019AA8AF39730D1AD7C3D SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEB 0x29 SWAP4 0x24 EXTCODECOPY PUSH9 0xFAA3F5AFDC6DCAE355 MUL 0xC4 GASLIMIT 0xD SWAP8 0xF8 0xC7 0xA6 PUSH27 0x44216FA93C20EB1A64736F6C634300080F00330000000000000000 ","sourceMap":"216:245:7:-:0;;;;;;417:35;;442:9;160:25:111;;430:10:7;;417:35;;148:2:111;133:18;417:35:7;;;;;;;216:245;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"24400","executionCost":"75","totalCost":"24475"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeReceived\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"EtherPaymentFallback - A contract that has a fallback to accept ether payments\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":\"EtherPaymentFallback\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\\n/// @author Richard Meissner - \\ncontract EtherPaymentFallback {\\n event SafeReceived(address indexed sender, uint256 value);\\n\\n /// @dev Fallback function accepts Ether transactions.\\n receive() external payable {\\n emit SafeReceived(msg.sender, msg.value);\\n }\\n}\\n\",\"keccak256\":\"0x1a7928d29877da84a3d0df846d5cd933d48ee095c1bde0aa044e249b12e27a72\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol":{"SecuredTokenTransfer":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"SecuredTokenTransfer - Secure token transfer","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220c5a1ce89b51128a16638eb01399ef421410dfc5bc010624864be85cfd350404a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 LOG1 0xCE DUP10 0xB5 GT 0x28 LOG1 PUSH7 0x38EB01399EF421 COINBASE 0xD 0xFC JUMPDEST 0xC0 LT PUSH3 0x4864BE DUP6 0xCF 0xD3 POP BLOCKHASH 0x4A PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"182:1268:8:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea2646970667358221220c5a1ce89b51128a16638eb01399ef421410dfc5bc010624864be85cfd350404a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 LOG1 0xCE DUP10 0xB5 GT 0x28 LOG1 PUSH7 0x38EB01399EF421 COINBASE 0xD 0xFC JUMPDEST 0xC0 LT PUSH3 0x4864BE DUP6 0xCF 0xD3 POP BLOCKHASH 0x4A PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"182:1268:8:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"},"internal":{"transferToken(address,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"SecuredTokenTransfer - Secure token transfer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":\"SecuredTokenTransfer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SecuredTokenTransfer - Secure token transfer\\n/// @author Richard Meissner - \\ncontract SecuredTokenTransfer {\\n /// @dev Transfers a token and returns if it was a success\\n /// @param token Token that should be transferred\\n /// @param receiver Receiver to whom the token should be transferred\\n /// @param amount The amount of tokens that should be transferred\\n function transferToken(\\n address token,\\n address receiver,\\n uint256 amount\\n ) internal returns (bool transferred) {\\n // 0xa9059cbb - keccack(\\\"transfer(address,uint256)\\\")\\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // We write the return value to scratch space.\\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n switch returndatasize()\\n case 0 {\\n transferred := success\\n }\\n case 0x20 {\\n transferred := iszero(or(iszero(success), iszero(mload(0))))\\n }\\n default {\\n transferred := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x178682d8477da42936c7e8e24d39094c4ac08ecd8623794b9535d77001b665f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol":{"SelfAuthorized":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"SelfAuthorized - authorizes current contract to perform actions","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212201cb655855a8b46eb5fd15494d76b6a917828792259fc8a113362b60d63aaa8b364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR 0xB6 SSTORE DUP6 GAS DUP12 CHAINID 0xEB 0x5F 0xD1 SLOAD SWAP5 0xD7 PUSH12 0x6A917828792259FC8A113362 0xB6 0xD PUSH4 0xAAA8B364 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"201:276:9:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea26469706673582212201cb655855a8b46eb5fd15494d76b6a917828792259fc8a113362b60d63aaa8b364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR 0xB6 SSTORE DUP6 GAS DUP12 CHAINID 0xEB 0x5F 0xD1 SLOAD SWAP5 0xD7 PUSH12 0x6A917828792259FC8A113362 0xB6 0xD PUSH4 0xAAA8B364 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"201:276:9:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"},"internal":{"requireSelfCall()":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"SelfAuthorized - authorizes current contract to perform actions\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":\"SelfAuthorized\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol":{"SignatureDecoder":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"SignatureDecoder - Decodes signatures that a encoded as bytes","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220d38d8e5af7831affbbd8d9724da58c77c04766fa43920cf15a68388c33e4c3b664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD3 DUP14 DUP15 GAS 0xF7 DUP4 BYTE SELFDESTRUCT 0xBB 0xD8 0xD9 PUSH19 0x4DA58C77C04766FA43920CF15A68388C33E4C3 0xB6 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"199:1374:10:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea2646970667358221220d38d8e5af7831affbbd8d9724da58c77c04766fa43920cf15a68388c33e4c3b664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD3 DUP14 DUP15 GAS 0xF7 DUP4 BYTE SELFDESTRUCT 0xBB 0xD8 0xD9 PUSH19 0x4DA58C77C04766FA43920CF15A68388C33E4C3 0xB6 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"199:1374:10:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"},"internal":{"signatureSplit(bytes memory,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"SignatureDecoder - Decodes signatures that a encoded as bytes\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":\"SignatureDecoder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\\n/// @author Richard Meissner - \\ncontract SignatureDecoder {\\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\\n /// @param signatures concatenated rsv signatures\\n function signatureSplit(bytes memory signatures, uint256 pos)\\n internal\\n pure\\n returns (\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n )\\n {\\n // The signature format is a compact form of:\\n // {bytes32 r}{bytes32 s}{uint8 v}\\n // Compact means, uint8 is not padded to 32 bytes.\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let signaturePos := mul(0x41, pos)\\n r := mload(add(signatures, add(signaturePos, 0x20)))\\n s := mload(add(signatures, add(signaturePos, 0x40)))\\n // Here we are loading the last 32 bytes, including 31 bytes\\n // of 's'. There is no 'mload8' to do this.\\n //\\n // 'byte' is not working due to the Solidity parser, so lets\\n // use the second best option, 'and'\\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d37be182472ccfee62a33e9939f9b3d509be4c32e9fdebc2c1746c573655987\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol":{"Singleton":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"Singleton - Base for singleton contracts (should always be first super contract) This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220ae1deec5ddd0151205b486a1be8f016257b30fafbdc7fb9db0203338b4ea6dd364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAE SAR 0xEE 0xC5 0xDD 0xD0 ISZERO SLT SDIV 0xB4 DUP7 LOG1 0xBE DUP16 ADD PUSH3 0x57B30F 0xAF 0xBD 0xC7 0xFB SWAP14 0xB0 KECCAK256 CALLER CODESIZE 0xB4 0xEA PUSH14 0xD364736F6C634300080F00330000 ","sourceMap":"321:274:11:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea2646970667358221220ae1deec5ddd0151205b486a1be8f016257b30fafbdc7fb9db0203338b4ea6dd364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAE SAR 0xEE 0xC5 0xDD 0xD0 ISZERO SLT SDIV 0xB4 DUP7 LOG1 0xBE DUP16 ADD PUSH3 0x57B30F 0xAF 0xBD 0xC7 0xFB SWAP14 0xB0 KECCAK256 CALLER CODESIZE 0xB4 0xEA PUSH14 0xD364736F6C634300080F00330000 ","sourceMap":"321:274:11:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"Singleton - Base for singleton contracts (should always be first super contract) This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":\"Singleton\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\\n/// @author Richard Meissner - \\ncontract Singleton {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\\n // It should also always be ensured that the address is stored alone (uses a full word)\\n address private singleton;\\n}\\n\",\"keccak256\":\"0x6e02c18998de8834dd7d69890cb6ede996b6f635d2337081a596d91e35e2c648\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2098,"contract":"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol:Singleton","label":"singleton","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol":{"StorageAccessible":{"abi":[{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"getStorageAt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes","name":"calldataPayload","type":"bytes"}],"name":"simulateAndRevert","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"getStorageAt(uint256,uint256)":{"details":"Reads `length` bytes of storage in the currents contract","params":{"length":"- the number of words (32 bytes) of data to read","offset":"- the offset in the current contract's storage in words to start reading from"},"returns":{"_0":"the bytes that were read."}},"simulateAndRevert(address,bytes)":{"details":"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). This method reverts with data equal to `abi.encode(bool(success), bytes(response))`. Specifically, the `returndata` after a call to this method will be: `success:bool || response.length:uint256 || response:bytes`.","params":{"calldataPayload":"Calldata that should be sent to the target contract (encoded method name and arguments).","targetContract":"Address of the contract containing the code to execute."}}},"title":"StorageAccessible - generic base contract that allows callers to access all internal storage.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506103bb806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80635624b25b1461003b578063b4faba0914610064575b600080fd5b61004e610049366004610122565b610079565b60405161005b9190610144565b60405180910390f35b6100776100723660046101e6565b6100ff565b005b60606000610088836020610310565b67ffffffffffffffff8111156100a0576100a06101b7565b6040519080825280601f01601f1916602001820160405280156100ca576020820181803683370190505b50905060005b838110156100f75784810154602080830284010152806100ef8161034d565b9150506100d0565b509392505050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6000806040838503121561013557600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561017157858101830151858201604001528201610155565b81811115610183576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156101f957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461021d57600080fd5b9150602083013567ffffffffffffffff8082111561023a57600080fd5b818501915085601f83011261024e57600080fd5b813581811115610260576102606101b7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102a6576102a66101b7565b816040528281528860208487010111156102bf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610348576103486102e1565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361037e5761037e6102e1565b506001019056fea2646970667358221220bc5b4e60fe9ca8648c5c03313f956f1b5356beb12a24bbee843e7a5820a6a09564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BB DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5624B25B EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xB4FABA09 EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x122 JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x144 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6 JUMP JUMPDEST PUSH2 0xFF JUMP JUMPDEST STOP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88 DUP4 PUSH1 0x20 PUSH2 0x310 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA0 JUMPI PUSH2 0xA0 PUSH2 0x1B7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP5 DUP2 ADD SLOAD PUSH1 0x20 DUP1 DUP4 MUL DUP5 ADD ADD MSTORE DUP1 PUSH2 0xEF DUP2 PUSH2 0x34D JUMP JUMPDEST SWAP2 POP POP PUSH2 0xD0 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL DUP1 PUSH1 0x0 MSTORE POP RETURNDATASIZE PUSH1 0x20 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x40 RETURNDATACOPY PUSH1 0x40 RETURNDATASIZE ADD PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x135 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x171 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x155 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x24E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x260 JUMPI PUSH2 0x260 PUSH2 0x1B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x2A6 JUMPI PUSH2 0x2A6 PUSH2 0x1B7 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x348 JUMPI PUSH2 0x348 PUSH2 0x2E1 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x37E JUMPI PUSH2 0x37E PUSH2 0x2E1 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC JUMPDEST 0x4E PUSH1 0xFE SWAP13 0xA8 PUSH5 0x8C5C03313F SWAP6 PUSH16 0x1B5356BEB12A24BBEE843E7A5820A6A0 SWAP6 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"315:1913:12:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@getStorageAt_2137":{"entryPoint":121,"id":2137,"parameterSlots":2,"returnSlots":1},"@simulateAndRevert_2147":{"entryPoint":255,"id":2147,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":486,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_uint256t_uint256":{"entryPoint":290,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":324,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":784,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":845,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":737,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":439,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2916:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"101:161:111","statements":[{"body":{"nodeType":"YulBlock","src":"147:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"156:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"159:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"149:6:111"},"nodeType":"YulFunctionCall","src":"149:12:111"},"nodeType":"YulExpressionStatement","src":"149:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"122:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"131:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"118:3:111"},"nodeType":"YulFunctionCall","src":"118:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"143:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"114:3:111"},"nodeType":"YulFunctionCall","src":"114:32:111"},"nodeType":"YulIf","src":"111:52:111"},{"nodeType":"YulAssignment","src":"172:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"195:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"182:12:111"},"nodeType":"YulFunctionCall","src":"182:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"172:6:111"}]},{"nodeType":"YulAssignment","src":"214:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"252:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"237:3:111"},"nodeType":"YulFunctionCall","src":"237:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"224:12:111"},"nodeType":"YulFunctionCall","src":"224:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"214:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"59:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"70:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"82:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"90:6:111","type":""}],"src":"14:248:111"},{"body":{"nodeType":"YulBlock","src":"386:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"396:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"406:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"400:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"424:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"435:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"417:6:111"},"nodeType":"YulFunctionCall","src":"417:21:111"},"nodeType":"YulExpressionStatement","src":"417:21:111"},{"nodeType":"YulVariableDeclaration","src":"447:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"467:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"461:5:111"},"nodeType":"YulFunctionCall","src":"461:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"451:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"494:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"505:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"490:3:111"},"nodeType":"YulFunctionCall","src":"490:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"510:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"483:6:111"},"nodeType":"YulFunctionCall","src":"483:34:111"},"nodeType":"YulExpressionStatement","src":"483:34:111"},{"nodeType":"YulVariableDeclaration","src":"526:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"535:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"530:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"595:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"624:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"635:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"620:3:111"},"nodeType":"YulFunctionCall","src":"620:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"639:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"616:3:111"},"nodeType":"YulFunctionCall","src":"616:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"658:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"666:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"654:3:111"},"nodeType":"YulFunctionCall","src":"654:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"670:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"650:3:111"},"nodeType":"YulFunctionCall","src":"650:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"644:5:111"},"nodeType":"YulFunctionCall","src":"644:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"609:6:111"},"nodeType":"YulFunctionCall","src":"609:66:111"},"nodeType":"YulExpressionStatement","src":"609:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"556:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"559:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"553:2:111"},"nodeType":"YulFunctionCall","src":"553:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"567:19:111","statements":[{"nodeType":"YulAssignment","src":"569:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"578:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"581:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"569:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"549:3:111","statements":[]},"src":"545:140:111"},{"body":{"nodeType":"YulBlock","src":"719:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"759:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"744:3:111"},"nodeType":"YulFunctionCall","src":"744:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"768:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"740:3:111"},"nodeType":"YulFunctionCall","src":"740:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"773:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"733:6:111"},"nodeType":"YulFunctionCall","src":"733:42:111"},"nodeType":"YulExpressionStatement","src":"733:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"700:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"703:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"697:2:111"},"nodeType":"YulFunctionCall","src":"697:13:111"},"nodeType":"YulIf","src":"694:91:111"},{"nodeType":"YulAssignment","src":"794:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"810:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"829:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"837:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"825:3:111"},"nodeType":"YulFunctionCall","src":"825:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"842:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"821:3:111"},"nodeType":"YulFunctionCall","src":"821:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"806:3:111"},"nodeType":"YulFunctionCall","src":"806:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"912:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"802:3:111"},"nodeType":"YulFunctionCall","src":"802:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"794:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"355:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"366:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"377:4:111","type":""}],"src":"267:654:111"},{"body":{"nodeType":"YulBlock","src":"958:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"975:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"978:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"968:6:111"},"nodeType":"YulFunctionCall","src":"968:88:111"},"nodeType":"YulExpressionStatement","src":"968:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1072:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1075:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1065:6:111"},"nodeType":"YulFunctionCall","src":"1065:15:111"},"nodeType":"YulExpressionStatement","src":"1065:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1096:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1099:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1089:6:111"},"nodeType":"YulFunctionCall","src":"1089:15:111"},"nodeType":"YulExpressionStatement","src":"1089:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"926:184:111"},{"body":{"nodeType":"YulBlock","src":"1211:1081:111","statements":[{"body":{"nodeType":"YulBlock","src":"1257:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1266:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1269:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1259:6:111"},"nodeType":"YulFunctionCall","src":"1259:12:111"},"nodeType":"YulExpressionStatement","src":"1259:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1232:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1241:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1228:3:111"},"nodeType":"YulFunctionCall","src":"1228:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1253:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1224:3:111"},"nodeType":"YulFunctionCall","src":"1224:32:111"},"nodeType":"YulIf","src":"1221:52:111"},{"nodeType":"YulVariableDeclaration","src":"1282:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1308:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1295:12:111"},"nodeType":"YulFunctionCall","src":"1295:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1286:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1404:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1413:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1416:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1406:6:111"},"nodeType":"YulFunctionCall","src":"1406:12:111"},"nodeType":"YulExpressionStatement","src":"1406:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1340:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1351:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1358:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1347:3:111"},"nodeType":"YulFunctionCall","src":"1347:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1337:2:111"},"nodeType":"YulFunctionCall","src":"1337:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1330:6:111"},"nodeType":"YulFunctionCall","src":"1330:73:111"},"nodeType":"YulIf","src":"1327:93:111"},{"nodeType":"YulAssignment","src":"1429:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1439:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1429:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1453:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1484:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1495:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1480:3:111"},"nodeType":"YulFunctionCall","src":"1480:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1467:12:111"},"nodeType":"YulFunctionCall","src":"1467:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1457:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1508:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1518:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1512:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1563:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1572:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1575:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1565:6:111"},"nodeType":"YulFunctionCall","src":"1565:12:111"},"nodeType":"YulExpressionStatement","src":"1565:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1551:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1559:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1548:2:111"},"nodeType":"YulFunctionCall","src":"1548:14:111"},"nodeType":"YulIf","src":"1545:34:111"},{"nodeType":"YulVariableDeclaration","src":"1588:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1602:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1613:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1598:3:111"},"nodeType":"YulFunctionCall","src":"1598:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1592:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1668:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1677:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1680:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1670:6:111"},"nodeType":"YulFunctionCall","src":"1670:12:111"},"nodeType":"YulExpressionStatement","src":"1670:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1647:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1651:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1643:3:111"},"nodeType":"YulFunctionCall","src":"1643:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1658:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1639:3:111"},"nodeType":"YulFunctionCall","src":"1639:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1632:6:111"},"nodeType":"YulFunctionCall","src":"1632:35:111"},"nodeType":"YulIf","src":"1629:55:111"},{"nodeType":"YulVariableDeclaration","src":"1693:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1716:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1703:12:111"},"nodeType":"YulFunctionCall","src":"1703:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"1697:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1742:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1744:16:111"},"nodeType":"YulFunctionCall","src":"1744:18:111"},"nodeType":"YulExpressionStatement","src":"1744:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1734:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1738:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1731:2:111"},"nodeType":"YulFunctionCall","src":"1731:10:111"},"nodeType":"YulIf","src":"1728:36:111"},{"nodeType":"YulVariableDeclaration","src":"1773:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1783:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"1777:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1858:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1878:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1872:5:111"},"nodeType":"YulFunctionCall","src":"1872:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1862:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1890:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1912:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1936:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1940:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1932:3:111"},"nodeType":"YulFunctionCall","src":"1932:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1947:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1928:3:111"},"nodeType":"YulFunctionCall","src":"1928:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1952:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1924:3:111"},"nodeType":"YulFunctionCall","src":"1924:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1957:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1920:3:111"},"nodeType":"YulFunctionCall","src":"1920:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1908:3:111"},"nodeType":"YulFunctionCall","src":"1908:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1894:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2020:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2022:16:111"},"nodeType":"YulFunctionCall","src":"2022:18:111"},"nodeType":"YulExpressionStatement","src":"2022:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1979:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1991:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1976:2:111"},"nodeType":"YulFunctionCall","src":"1976:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1999:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2011:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1996:2:111"},"nodeType":"YulFunctionCall","src":"1996:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1973:2:111"},"nodeType":"YulFunctionCall","src":"1973:46:111"},"nodeType":"YulIf","src":"1970:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2058:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2062:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2051:6:111"},"nodeType":"YulFunctionCall","src":"2051:22:111"},"nodeType":"YulExpressionStatement","src":"2051:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2089:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2097:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2082:6:111"},"nodeType":"YulFunctionCall","src":"2082:18:111"},"nodeType":"YulExpressionStatement","src":"2082:18:111"},{"body":{"nodeType":"YulBlock","src":"2146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2148:6:111"},"nodeType":"YulFunctionCall","src":"2148:12:111"},"nodeType":"YulExpressionStatement","src":"2148:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2123:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2127:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2119:3:111"},"nodeType":"YulFunctionCall","src":"2119:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"2132:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2115:3:111"},"nodeType":"YulFunctionCall","src":"2115:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2137:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2112:2:111"},"nodeType":"YulFunctionCall","src":"2112:33:111"},"nodeType":"YulIf","src":"2109:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2188:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2196:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2184:3:111"},"nodeType":"YulFunctionCall","src":"2184:15:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2205:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2209:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2201:3:111"},"nodeType":"YulFunctionCall","src":"2201:11:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2214:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2171:12:111"},"nodeType":"YulFunctionCall","src":"2171:46:111"},"nodeType":"YulExpressionStatement","src":"2171:46:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2241:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"2249:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2237:3:111"},"nodeType":"YulFunctionCall","src":"2237:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2254:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2233:3:111"},"nodeType":"YulFunctionCall","src":"2233:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"2259:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2226:6:111"},"nodeType":"YulFunctionCall","src":"2226:35:111"},"nodeType":"YulExpressionStatement","src":"2226:35:111"},{"nodeType":"YulAssignment","src":"2270:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"2280:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2270:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1169:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1180:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1192:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1200:6:111","type":""}],"src":"1115:1177:111"},{"body":{"nodeType":"YulBlock","src":"2329:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2346:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2349:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2339:6:111"},"nodeType":"YulFunctionCall","src":"2339:88:111"},"nodeType":"YulExpressionStatement","src":"2339:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2443:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2446:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2436:6:111"},"nodeType":"YulFunctionCall","src":"2436:15:111"},"nodeType":"YulExpressionStatement","src":"2436:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2467:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2470:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2460:6:111"},"nodeType":"YulFunctionCall","src":"2460:15:111"},"nodeType":"YulExpressionStatement","src":"2460:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"2297:184:111"},{"body":{"nodeType":"YulBlock","src":"2538:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"2657:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"2659:16:111"},"nodeType":"YulFunctionCall","src":"2659:18:111"},"nodeType":"YulExpressionStatement","src":"2659:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2569:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2562:6:111"},"nodeType":"YulFunctionCall","src":"2562:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2555:6:111"},"nodeType":"YulFunctionCall","src":"2555:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"2577:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2584:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"2652:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"2580:3:111"},"nodeType":"YulFunctionCall","src":"2580:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2574:2:111"},"nodeType":"YulFunctionCall","src":"2574:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2551:3:111"},"nodeType":"YulFunctionCall","src":"2551:105:111"},"nodeType":"YulIf","src":"2548:131:111"},{"nodeType":"YulAssignment","src":"2688:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2703:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2706:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"2699:3:111"},"nodeType":"YulFunctionCall","src":"2699:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"2688:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"2517:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"2520:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"2526:7:111","type":""}],"src":"2486:228:111"},{"body":{"nodeType":"YulBlock","src":"2766:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"2857:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"2859:16:111"},"nodeType":"YulFunctionCall","src":"2859:18:111"},"nodeType":"YulExpressionStatement","src":"2859:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2782:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2789:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2779:2:111"},"nodeType":"YulFunctionCall","src":"2779:77:111"},"nodeType":"YulIf","src":"2776:103:111"},{"nodeType":"YulAssignment","src":"2888:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2899:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2906:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2895:3:111"},"nodeType":"YulFunctionCall","src":"2895:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"2888:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"2748:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"2758:3:111","type":""}],"src":"2719:195:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value1 := memPtr\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100365760003560e01c80635624b25b1461003b578063b4faba0914610064575b600080fd5b61004e610049366004610122565b610079565b60405161005b9190610144565b60405180910390f35b6100776100723660046101e6565b6100ff565b005b60606000610088836020610310565b67ffffffffffffffff8111156100a0576100a06101b7565b6040519080825280601f01601f1916602001820160405280156100ca576020820181803683370190505b50905060005b838110156100f75784810154602080830284010152806100ef8161034d565b9150506100d0565b509392505050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6000806040838503121561013557600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561017157858101830151858201604001528201610155565b81811115610183576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156101f957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461021d57600080fd5b9150602083013567ffffffffffffffff8082111561023a57600080fd5b818501915085601f83011261024e57600080fd5b813581811115610260576102606101b7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102a6576102a66101b7565b816040528281528860208487010111156102bf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610348576103486102e1565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361037e5761037e6102e1565b506001019056fea2646970667358221220bc5b4e60fe9ca8648c5c03313f956f1b5356beb12a24bbee843e7a5820a6a09564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5624B25B EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xB4FABA09 EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x122 JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x144 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6 JUMP JUMPDEST PUSH2 0xFF JUMP JUMPDEST STOP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88 DUP4 PUSH1 0x20 PUSH2 0x310 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA0 JUMPI PUSH2 0xA0 PUSH2 0x1B7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP5 DUP2 ADD SLOAD PUSH1 0x20 DUP1 DUP4 MUL DUP5 ADD ADD MSTORE DUP1 PUSH2 0xEF DUP2 PUSH2 0x34D JUMP JUMPDEST SWAP2 POP POP PUSH2 0xD0 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL DUP1 PUSH1 0x0 MSTORE POP RETURNDATASIZE PUSH1 0x20 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x40 RETURNDATACOPY PUSH1 0x40 RETURNDATASIZE ADD PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x135 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x171 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x155 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x24E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x260 JUMPI PUSH2 0x260 PUSH2 0x1B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x2A6 JUMPI PUSH2 0x2A6 PUSH2 0x1B7 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x348 JUMPI PUSH2 0x348 PUSH2 0x2E1 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x37E JUMPI PUSH2 0x37E PUSH2 0x2E1 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC JUMPDEST 0x4E PUSH1 0xFE SWAP13 0xA8 PUSH5 0x8C5C03313F SWAP6 PUSH16 0x1B5356BEB12A24BBEE843E7A5820A6A0 SWAP6 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"315:1913:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;643:464;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1740:486;;;;;;:::i;:::-;;:::i;:::-;;643:464;718:12;742:19;774:11;:6;783:2;774:11;:::i;:::-;764:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:22:12;;742:44;;801:13;796:282;828:6;820:5;:14;796:282;;;964:18;;;958:25;1041:4;1030:16;;;1007:40;;;1000:54;976:5;836:7;976:5;836:7;:::i;:::-;;;;796:282;;;-1:-1:-1;1094:6:12;643:464;-1:-1:-1;;;643:464:12:o;1740:486::-;2025:1;2022;2004:15;1998:22;1991:4;1974:15;1970:26;1954:14;1947:5;1934:93;2054:7;2048:4;2041:21;;2088:16;2082:4;2075:30;2142:16;2139:1;2133:4;2118:41;2204:4;2186:16;2182:27;2179:1;2172:38;14:248:111;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:111;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:111:o;267:654::-;377:4;406:2;435;424:9;417:21;467:6;461:13;510:6;505:2;494:9;490:18;483:34;535:1;545:140;559:6;556:1;553:13;545:140;;;654:14;;;650:23;;644:30;620:17;;;639:2;616:26;609:66;574:10;;545:140;;;703:6;700:1;697:13;694:91;;;773:1;768:2;759:6;748:9;744:22;740:31;733:42;694:91;-1:-1:-1;837:2:111;825:15;842:66;821:88;806:104;;;;912:2;802:113;;267:654;-1:-1:-1;;;267:654:111:o;926:184::-;978:77;975:1;968:88;1075:4;1072:1;1065:15;1099:4;1096:1;1089:15;1115:1177;1192:6;1200;1253:2;1241:9;1232:7;1228:23;1224:32;1221:52;;;1269:1;1266;1259:12;1221:52;1308:9;1295:23;1358:42;1351:5;1347:54;1340:5;1337:65;1327:93;;1416:1;1413;1406:12;1327:93;1439:5;-1:-1:-1;1495:2:111;1480:18;;1467:32;1518:18;1548:14;;;1545:34;;;1575:1;1572;1565:12;1545:34;1613:6;1602:9;1598:22;1588:32;;1658:7;1651:4;1647:2;1643:13;1639:27;1629:55;;1680:1;1677;1670:12;1629:55;1716:2;1703:16;1738:2;1734;1731:10;1728:36;;;1744:18;;:::i;:::-;1878:2;1872:9;1940:4;1932:13;;1783:66;1928:22;;;1952:2;1924:31;1920:40;1908:53;;;1976:18;;;1996:22;;;1973:46;1970:72;;;2022:18;;:::i;:::-;2062:10;2058:2;2051:22;2097:2;2089:6;2082:18;2137:7;2132:2;2127;2123;2119:11;2115:20;2112:33;2109:53;;;2158:1;2155;2148:12;2109:53;2214:2;2209;2205;2201:11;2196:2;2188:6;2184:15;2171:46;2259:1;2254:2;2249;2241:6;2237:15;2233:24;2226:35;2280:6;2270:16;;;;;;;1115:1177;;;;;:::o;2297:184::-;2349:77;2346:1;2339:88;2446:4;2443:1;2436:15;2470:4;2467:1;2460:15;2486:228;2526:7;2652:1;2584:66;2580:74;2577:1;2574:81;2569:1;2562:9;2555:17;2551:105;2548:131;;;2659:18;;:::i;:::-;-1:-1:-1;2699:9:111;;2486:228::o;2719:195::-;2758:3;2789:66;2782:5;2779:77;2776:103;;2859:18;;:::i;:::-;-1:-1:-1;2906:1:111;2895:13;;2719:195::o"},"gasEstimates":{"creation":{"codeDepositCost":"191000","executionCost":"232","totalCost":"191232"},"external":{"getStorageAt(uint256,uint256)":"infinite","simulateAndRevert(address,bytes)":"infinite"}},"methodIdentifiers":{"getStorageAt(uint256,uint256)":"5624b25b","simulateAndRevert(address,bytes)":"b4faba09"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"getStorageAt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getStorageAt(uint256,uint256)\":{\"details\":\"Reads `length` bytes of storage in the currents contract\",\"params\":{\"length\":\"- the number of words (32 bytes) of data to read\",\"offset\":\"- the offset in the current contract's storage in words to start reading from\"},\"returns\":{\"_0\":\"the bytes that were read.\"}},\"simulateAndRevert(address,bytes)\":{\"details\":\"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). This method reverts with data equal to `abi.encode(bool(success), bytes(response))`. Specifically, the `returndata` after a call to this method will be: `success:bool || response.length:uint256 || response:bytes`.\",\"params\":{\"calldataPayload\":\"Calldata that should be sent to the target contract (encoded method name and arguments).\",\"targetContract\":\"Address of the contract containing the code to execute.\"}}},\"title\":\"StorageAccessible - generic base contract that allows callers to access all internal storage.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":\"StorageAccessible\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\\ncontract StorageAccessible {\\n /**\\n * @dev Reads `length` bytes of storage in the currents contract\\n * @param offset - the offset in the current contract's storage in words to start reading from\\n * @param length - the number of words (32 bytes) of data to read\\n * @return the bytes that were read.\\n */\\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\\n bytes memory result = new bytes(length * 32);\\n for (uint256 index = 0; index < length; index++) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let word := sload(add(offset, index))\\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Performs a delegetecall on a targetContract in the context of self.\\n * Internally reverts execution to avoid side effects (making it static).\\n *\\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\\n * Specifically, the `returndata` after a call to this method will be:\\n * `success:bool || response.length:uint256 || response:bytes`.\\n *\\n * @param targetContract Address of the contract containing the code to execute.\\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\\n */\\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\\n\\n mstore(0x00, success)\\n mstore(0x20, returndatasize())\\n returndatacopy(0x40, 0, returndatasize())\\n revert(0, add(returndatasize(), 0x40))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36853adb266c2ab7d3c612aca799441a86bd15d9e1d24fc6c70d63f5c2df3aaf\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol","version":1}}},"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol":{"GnosisSafeStorage":{"abi":[],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212209028966ebe42993ea3ecc912fbd238089b47f5e3b636851554a9efc100a6433564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 0x28 SWAP7 PUSH15 0xBE42993EA3ECC912FBD238089B47F5 0xE3 0xB6 CALLDATASIZE DUP6 ISZERO SLOAD 0xA9 0xEF 0xC1 STOP 0xA6 NUMBER CALLDATALOAD PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"218:564:13:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea26469706673582212209028966ebe42993ea3ecc912fbd238089b47f5e3b636851554a9efc100a6433564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 0x28 SWAP7 PUSH15 0xBE42993EA3ECC912FBD238089B47F5 0xE3 0xB6 CALLDATASIZE DUP6 ISZERO SLOAD 0xA9 0xEF 0xC1 STOP 0xA6 NUMBER CALLDATALOAD PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"218:564:13:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\":\"GnosisSafeStorage\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\\n/// @author Richard Meissner - \\ncontract GnosisSafeStorage {\\n // From /common/Singleton.sol\\n address internal singleton;\\n // From /common/ModuleManager.sol\\n mapping(address => address) internal modules;\\n // From /common/OwnerManager.sol\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n // From /GnosisSafe.sol\\n bytes32 internal nonce;\\n bytes32 internal domainSeparator;\\n mapping(bytes32 => uint256) internal signedMessages;\\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xecfd0d8a43d859ef1fb8161cb21ce5d38461603383378a5b1c4c7d5d4a3bfbf3\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2153,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"singleton","offset":0,"slot":"0","type":"t_address"},{"astId":2157,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"modules","offset":0,"slot":"1","type":"t_mapping(t_address,t_address)"},{"astId":2161,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"owners","offset":0,"slot":"2","type":"t_mapping(t_address,t_address)"},{"astId":2163,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"ownerCount","offset":0,"slot":"3","type":"t_uint256"},{"astId":2165,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"threshold","offset":0,"slot":"4","type":"t_uint256"},{"astId":2167,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"nonce","offset":0,"slot":"5","type":"t_bytes32"},{"astId":2169,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"domainSeparator","offset":0,"slot":"6","type":"t_bytes32"},{"astId":2173,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"signedMessages","offset":0,"slot":"7","type":"t_mapping(t_bytes32,t_uint256)"},{"astId":2179,"contract":"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol:GnosisSafeStorage","label":"approvedHashes","offset":0,"slot":"8","type":"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(bytes32 => uint256))","numberOfBytes":"32","value":"t_mapping(t_bytes32,t_uint256)"},"t_mapping(t_bytes32,t_uint256)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol":{"GnosisSafeMath":{"abi":[],"devdoc":{"details":"Math operations with safety checks that revert on error Renamed from SafeMath to GnosisSafeMath to avoid conflicts TODO: remove once open zeppelin update to solc 0.5.0","kind":"dev","methods":{},"title":"GnosisSafeMath","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071ef03908b7913fa0c6795f758b8c292fa0d5014f3f2a4d5295c70072726eb6764736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEF03908B7913FA0C6795F758B8C292FA0D50 EQ RETURN CALLCODE LOG4 0xD5 0x29 0x5C PUSH17 0x72726EB6764736F6C634300080F003300 ","sourceMap":"290:1186:14:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;290:1186:14;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071ef03908b7913fa0c6795f758b8c292fa0d5014f3f2a4d5295c70072726eb6764736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEF03908B7913FA0C6795F758B8C292FA0D50 EQ RETURN CALLCODE LOG4 0xD5 0x29 0x5C PUSH17 0x72726EB6764736F6C634300080F003300 ","sourceMap":"290:1186:14:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"add(uint256,uint256)":"infinite","max(uint256,uint256)":"infinite","mul(uint256,uint256)":"infinite","sub(uint256,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Math operations with safety checks that revert on error Renamed from SafeMath to GnosisSafeMath to avoid conflicts TODO: remove once open zeppelin update to solc 0.5.0\",\"kind\":\"dev\",\"methods\":{},\"title\":\"GnosisSafeMath\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":\"GnosisSafeMath\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title GnosisSafeMath\\n * @dev Math operations with safety checks that revert on error\\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\\n * TODO: remove once open zeppelin update to solc 0.5.0\\n */\\nlibrary GnosisSafeMath {\\n /**\\n * @dev Multiplies two numbers, reverts on overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Adds two numbers, reverts on overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x2a2b4d74f5834a9437be0cd3254d7a676698fc78aa47941c2009470196998d98\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol":{"DefaultCallbackHandler":{"abi":[{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"}],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"title":"Default Callback Handler - returns true for known token callbacks","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506106df806100206000396000f3fe608060405234801561001057600080fd5b506004361061007c5760003560e01c8063a3f4df7e1161005b578063a3f4df7e1461012c578063bc197c8114610175578063f23a6e61146101b0578063ffa1ad74146101e957600080fd5b806223de291461008157806301ffc9a71461009b578063150b7a02146100c3575b600080fd5b61009961008f36600461037c565b5050505050505050565b005b6100ae6100a9366004610427565b610225565b60405190151581526020015b60405180910390f35b6100fb6100d1366004610470565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ba565b6101686040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516100ba91906104df565b6100fb610183366004610597565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6100fb6101be366004610631565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101686040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806102b857507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061030457507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461032e57600080fd5b919050565b60008083601f84011261034557600080fd5b50813567ffffffffffffffff81111561035d57600080fd5b60208301915083602082850101111561037557600080fd5b9250929050565b60008060008060008060008060c0898b03121561039857600080fd5b6103a18961030a565b97506103af60208a0161030a565b96506103bd60408a0161030a565b955060608901359450608089013567ffffffffffffffff808211156103e157600080fd5b6103ed8c838d01610333565b909650945060a08b013591508082111561040657600080fd5b506104138b828c01610333565b999c989b5096995094979396929594505050565b60006020828403121561043957600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461046957600080fd5b9392505050565b60008060008060006080868803121561048857600080fd5b6104918661030a565b945061049f6020870161030a565b935060408601359250606086013567ffffffffffffffff8111156104c257600080fd5b6104ce88828901610333565b969995985093965092949392505050565b600060208083528351808285015260005b8181101561050c578581018301518582016040015282016104f0565b8181111561051e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261056457600080fd5b50813567ffffffffffffffff81111561057c57600080fd5b6020830191508360208260051b850101111561037557600080fd5b60008060008060008060008060a0898b0312156105b357600080fd5b6105bc8961030a565b97506105ca60208a0161030a565b9650604089013567ffffffffffffffff808211156105e757600080fd5b6105f38c838d01610552565b909850965060608b013591508082111561060c57600080fd5b6106188c838d01610552565b909650945060808b013591508082111561040657600080fd5b60008060008060008060a0878903121561064a57600080fd5b6106538761030a565b95506106616020880161030a565b94506040870135935060608701359250608087013567ffffffffffffffff81111561068b57600080fd5b61069789828a01610333565b979a969950949750929593949250505056fea264697066735822122084f072ac3f566982b0cd1e3eeaf41b2c3146e5ff3a84b9d217ee5b498a696e5364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6DF DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA3F4DF7E GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA3F4DF7E EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x81 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0xC3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x99 PUSH2 0x8F CALLDATASIZE PUSH1 0x4 PUSH2 0x37C JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAE PUSH2 0xA9 CALLDATASIZE PUSH1 0x4 PUSH2 0x427 JUMP JUMPDEST PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xFB PUSH2 0xD1 CALLDATASIZE PUSH1 0x4 PUSH2 0x470 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xBA JUMP JUMPDEST PUSH2 0x168 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x44656661756C742043616C6C6261636B2048616E646C65720000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBA SWAP2 SWAP1 PUSH2 0x4DF JUMP JUMPDEST PUSH2 0xFB PUSH2 0x183 CALLDATASIZE PUSH1 0x4 PUSH2 0x597 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xFB PUSH2 0x1BE CALLDATASIZE PUSH1 0x4 PUSH2 0x631 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x168 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x2B8 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x304 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x32E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x345 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A1 DUP10 PUSH2 0x30A JUMP JUMPDEST SWAP8 POP PUSH2 0x3AF PUSH1 0x20 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP7 POP PUSH2 0x3BD PUSH1 0x40 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ED DUP13 DUP4 DUP14 ADD PUSH2 0x333 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x413 DUP12 DUP3 DUP13 ADD PUSH2 0x333 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x488 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x491 DUP7 PUSH2 0x30A JUMP JUMPDEST SWAP5 POP PUSH2 0x49F PUSH1 0x20 DUP8 ADD PUSH2 0x30A JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4CE DUP9 DUP3 DUP10 ADD PUSH2 0x333 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x50C JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x4F0 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x51E JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x564 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x5B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BC DUP10 PUSH2 0x30A JUMP JUMPDEST SWAP8 POP PUSH2 0x5CA PUSH1 0x20 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5F3 DUP13 DUP4 DUP14 ADD PUSH2 0x552 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x618 DUP13 DUP4 DUP14 ADD PUSH2 0x552 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x64A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x653 DUP8 PUSH2 0x30A JUMP JUMPDEST SWAP6 POP PUSH2 0x661 PUSH1 0x20 DUP9 ADD PUSH2 0x30A JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x68B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x697 DUP10 DUP3 DUP11 ADD PUSH2 0x333 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP5 CREATE PUSH19 0xAC3F566982B0CD1E3EEAF41B2C3146E5FF3A84 0xB9 0xD2 OR 0xEE JUMPDEST 0x49 DUP11 PUSH10 0x6E5364736F6C63430008 0xF STOP CALLER ","sourceMap":"387:1415:15:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@NAME_2304":{"entryPoint":null,"id":2304,"parameterSlots":0,"returnSlots":0},"@VERSION_2307":{"entryPoint":null,"id":2307,"parameterSlots":0,"returnSlots":0},"@onERC1155BatchReceived_2347":{"entryPoint":null,"id":2347,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_2326":{"entryPoint":null,"id":2326,"parameterSlots":6,"returnSlots":1},"@onERC721Received_2364":{"entryPoint":null,"id":2364,"parameterSlots":5,"returnSlots":1},"@supportsInterface_2411":{"entryPoint":549,"id":2411,"parameterSlots":1,"returnSlots":1},"@tokensReceived_2381":{"entryPoint":null,"id":2381,"parameterSlots":8,"returnSlots":0},"abi_decode_address":{"entryPoint":778,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":1362,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":819,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":892,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":1431,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":1136,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":1585,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_bytes4":{"entryPoint":1063,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":1247,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:5940:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:147:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"190:6:111"},"nodeType":"YulFunctionCall","src":"190:12:111"},"nodeType":"YulExpressionStatement","src":"190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:73:111"},"nodeType":"YulIf","src":"111:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:196:111"},{"body":{"nodeType":"YulBlock","src":"287:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"338:6:111"},"nodeType":"YulFunctionCall","src":"338:12:111"},"nodeType":"YulExpressionStatement","src":"338:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"315:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"323:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"311:3:111"},"nodeType":"YulFunctionCall","src":"311:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"330:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"307:3:111"},"nodeType":"YulFunctionCall","src":"307:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"300:6:111"},"nodeType":"YulFunctionCall","src":"300:35:111"},"nodeType":"YulIf","src":"297:55:111"},{"nodeType":"YulAssignment","src":"361:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"384:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"371:12:111"},"nodeType":"YulFunctionCall","src":"371:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"361:6:111"}]},{"body":{"nodeType":"YulBlock","src":"434:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"443:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"446:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"436:6:111"},"nodeType":"YulFunctionCall","src":"436:12:111"},"nodeType":"YulExpressionStatement","src":"436:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"406:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"414:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"403:2:111"},"nodeType":"YulFunctionCall","src":"403:30:111"},"nodeType":"YulIf","src":"400:50:111"},{"nodeType":"YulAssignment","src":"459:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"475:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"471:3:111"},"nodeType":"YulFunctionCall","src":"471:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"459:8:111"}]},{"body":{"nodeType":"YulBlock","src":"540:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"549:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"552:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"542:6:111"},"nodeType":"YulFunctionCall","src":"542:12:111"},"nodeType":"YulExpressionStatement","src":"542:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"511:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"519:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"507:3:111"},"nodeType":"YulFunctionCall","src":"507:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"528:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"503:3:111"},"nodeType":"YulFunctionCall","src":"503:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"535:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"500:2:111"},"nodeType":"YulFunctionCall","src":"500:39:111"},"nodeType":"YulIf","src":"497:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"250:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"258:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"266:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"276:6:111","type":""}],"src":"215:347:111"},{"body":{"nodeType":"YulBlock","src":"760:817:111","statements":[{"body":{"nodeType":"YulBlock","src":"807:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"816:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"819:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"809:6:111"},"nodeType":"YulFunctionCall","src":"809:12:111"},"nodeType":"YulExpressionStatement","src":"809:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"781:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"790:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"777:3:111"},"nodeType":"YulFunctionCall","src":"777:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"773:3:111"},"nodeType":"YulFunctionCall","src":"773:33:111"},"nodeType":"YulIf","src":"770:53:111"},{"nodeType":"YulAssignment","src":"832:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"861:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"842:18:111"},"nodeType":"YulFunctionCall","src":"842:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"832:6:111"}]},{"nodeType":"YulAssignment","src":"880:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"924:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"909:3:111"},"nodeType":"YulFunctionCall","src":"909:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"890:18:111"},"nodeType":"YulFunctionCall","src":"890:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"880:6:111"}]},{"nodeType":"YulAssignment","src":"937:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"970:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"981:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"966:3:111"},"nodeType":"YulFunctionCall","src":"966:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"947:18:111"},"nodeType":"YulFunctionCall","src":"947:38:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"937:6:111"}]},{"nodeType":"YulAssignment","src":"994:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1021:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1032:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1017:3:111"},"nodeType":"YulFunctionCall","src":"1017:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1004:12:111"},"nodeType":"YulFunctionCall","src":"1004:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"994:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1045:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1076:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1087:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1072:3:111"},"nodeType":"YulFunctionCall","src":"1072:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1059:12:111"},"nodeType":"YulFunctionCall","src":"1059:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1049:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1101:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1111:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1105:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1156:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1168:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1158:6:111"},"nodeType":"YulFunctionCall","src":"1158:12:111"},"nodeType":"YulExpressionStatement","src":"1158:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1144:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1152:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1141:2:111"},"nodeType":"YulFunctionCall","src":"1141:14:111"},"nodeType":"YulIf","src":"1138:34:111"},{"nodeType":"YulVariableDeclaration","src":"1181:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1237:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1248:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1233:3:111"},"nodeType":"YulFunctionCall","src":"1233:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1257:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1207:25:111"},"nodeType":"YulFunctionCall","src":"1207:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1185:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1195:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1274:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1284:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1274:6:111"}]},{"nodeType":"YulAssignment","src":"1301:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1311:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1301:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1328:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1372:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1357:3:111"},"nodeType":"YulFunctionCall","src":"1357:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1344:12:111"},"nodeType":"YulFunctionCall","src":"1344:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1332:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1406:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1415:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1418:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1408:6:111"},"nodeType":"YulFunctionCall","src":"1408:12:111"},"nodeType":"YulExpressionStatement","src":"1408:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1392:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1402:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1389:2:111"},"nodeType":"YulFunctionCall","src":"1389:16:111"},"nodeType":"YulIf","src":"1386:36:111"},{"nodeType":"YulVariableDeclaration","src":"1431:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1487:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1498:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1483:3:111"},"nodeType":"YulFunctionCall","src":"1483:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1509:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1457:25:111"},"nodeType":"YulFunctionCall","src":"1457:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1435:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1445:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1526:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1536:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1526:6:111"}]},{"nodeType":"YulAssignment","src":"1553:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1563:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1553:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"670:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"681:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"693:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"701:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"709:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"717:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"725:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"733:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"741:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"749:6:111","type":""}],"src":"567:1010:111"},{"body":{"nodeType":"YulBlock","src":"1651:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1699:6:111"},"nodeType":"YulFunctionCall","src":"1699:12:111"},"nodeType":"YulExpressionStatement","src":"1699:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1672:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1681:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1668:3:111"},"nodeType":"YulFunctionCall","src":"1668:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1693:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1664:3:111"},"nodeType":"YulFunctionCall","src":"1664:32:111"},"nodeType":"YulIf","src":"1661:52:111"},{"nodeType":"YulVariableDeclaration","src":"1722:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1748:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1735:12:111"},"nodeType":"YulFunctionCall","src":"1735:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1726:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1868:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1877:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1880:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1870:6:111"},"nodeType":"YulFunctionCall","src":"1870:12:111"},"nodeType":"YulExpressionStatement","src":"1870:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1780:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1791:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1798:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1787:3:111"},"nodeType":"YulFunctionCall","src":"1787:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1777:2:111"},"nodeType":"YulFunctionCall","src":"1777:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1770:6:111"},"nodeType":"YulFunctionCall","src":"1770:97:111"},"nodeType":"YulIf","src":"1767:117:111"},{"nodeType":"YulAssignment","src":"1893:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1903:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1893:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1617:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1628:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1640:6:111","type":""}],"src":"1582:332:111"},{"body":{"nodeType":"YulBlock","src":"2014:92:111","statements":[{"nodeType":"YulAssignment","src":"2024:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2047:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2032:3:111"},"nodeType":"YulFunctionCall","src":"2032:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2024:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2066:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2091:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2084:6:111"},"nodeType":"YulFunctionCall","src":"2084:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2077:6:111"},"nodeType":"YulFunctionCall","src":"2077:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2059:6:111"},"nodeType":"YulFunctionCall","src":"2059:41:111"},"nodeType":"YulExpressionStatement","src":"2059:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1983:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1994:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2005:4:111","type":""}],"src":"1919:187:111"},{"body":{"nodeType":"YulBlock","src":"2251:486:111","statements":[{"body":{"nodeType":"YulBlock","src":"2298:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2307:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2310:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2300:6:111"},"nodeType":"YulFunctionCall","src":"2300:12:111"},"nodeType":"YulExpressionStatement","src":"2300:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2272:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2281:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2268:3:111"},"nodeType":"YulFunctionCall","src":"2268:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2293:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2264:3:111"},"nodeType":"YulFunctionCall","src":"2264:33:111"},"nodeType":"YulIf","src":"2261:53:111"},{"nodeType":"YulAssignment","src":"2323:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2352:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2333:18:111"},"nodeType":"YulFunctionCall","src":"2333:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2323:6:111"}]},{"nodeType":"YulAssignment","src":"2371:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2404:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2415:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2400:3:111"},"nodeType":"YulFunctionCall","src":"2400:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2381:18:111"},"nodeType":"YulFunctionCall","src":"2381:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2371:6:111"}]},{"nodeType":"YulAssignment","src":"2428:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2455:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2466:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2451:3:111"},"nodeType":"YulFunctionCall","src":"2451:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2438:12:111"},"nodeType":"YulFunctionCall","src":"2438:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2428:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2479:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2510:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2521:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2506:3:111"},"nodeType":"YulFunctionCall","src":"2506:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2493:12:111"},"nodeType":"YulFunctionCall","src":"2493:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2483:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2568:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2577:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2580:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2570:6:111"},"nodeType":"YulFunctionCall","src":"2570:12:111"},"nodeType":"YulExpressionStatement","src":"2570:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2540:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2548:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2537:2:111"},"nodeType":"YulFunctionCall","src":"2537:30:111"},"nodeType":"YulIf","src":"2534:50:111"},{"nodeType":"YulVariableDeclaration","src":"2593:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2649:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2660:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2645:3:111"},"nodeType":"YulFunctionCall","src":"2645:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2669:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2619:25:111"},"nodeType":"YulFunctionCall","src":"2619:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2597:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2607:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2686:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2696:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2686:6:111"}]},{"nodeType":"YulAssignment","src":"2713:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"2723:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2713:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2185:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2196:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2208:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2216:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2224:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2232:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2240:6:111","type":""}],"src":"2111:626:111"},{"body":{"nodeType":"YulBlock","src":"2841:149:111","statements":[{"nodeType":"YulAssignment","src":"2851:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2874:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2859:3:111"},"nodeType":"YulFunctionCall","src":"2859:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2851:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2893:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2908:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2916:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2904:3:111"},"nodeType":"YulFunctionCall","src":"2904:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2886:6:111"},"nodeType":"YulFunctionCall","src":"2886:98:111"},"nodeType":"YulExpressionStatement","src":"2886:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2810:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2821:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2832:4:111","type":""}],"src":"2742:248:111"},{"body":{"nodeType":"YulBlock","src":"3116:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3126:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3136:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3130:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3154:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3165:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3147:6:111"},"nodeType":"YulFunctionCall","src":"3147:21:111"},"nodeType":"YulExpressionStatement","src":"3147:21:111"},{"nodeType":"YulVariableDeclaration","src":"3177:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3197:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3191:5:111"},"nodeType":"YulFunctionCall","src":"3191:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3181:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3224:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3235:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3220:3:111"},"nodeType":"YulFunctionCall","src":"3220:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"3240:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3213:6:111"},"nodeType":"YulFunctionCall","src":"3213:34:111"},"nodeType":"YulExpressionStatement","src":"3213:34:111"},{"nodeType":"YulVariableDeclaration","src":"3256:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3265:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3260:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3325:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3354:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"3365:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3350:3:111"},"nodeType":"YulFunctionCall","src":"3350:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"3369:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3346:3:111"},"nodeType":"YulFunctionCall","src":"3346:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3388:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"3396:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3400:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3374:5:111"},"nodeType":"YulFunctionCall","src":"3374:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3339:6:111"},"nodeType":"YulFunctionCall","src":"3339:66:111"},"nodeType":"YulExpressionStatement","src":"3339:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3286:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3289:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3283:2:111"},"nodeType":"YulFunctionCall","src":"3283:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3297:19:111","statements":[{"nodeType":"YulAssignment","src":"3299:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3308:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3311:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3304:3:111"},"nodeType":"YulFunctionCall","src":"3304:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3299:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3279:3:111","statements":[]},"src":"3275:140:111"},{"body":{"nodeType":"YulBlock","src":"3449:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3478:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"3489:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3474:3:111"},"nodeType":"YulFunctionCall","src":"3474:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"3498:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3470:3:111"},"nodeType":"YulFunctionCall","src":"3470:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"3503:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3463:6:111"},"nodeType":"YulFunctionCall","src":"3463:42:111"},"nodeType":"YulExpressionStatement","src":"3463:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3430:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3433:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3427:2:111"},"nodeType":"YulFunctionCall","src":"3427:13:111"},"nodeType":"YulIf","src":"3424:91:111"},{"nodeType":"YulAssignment","src":"3524:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3540:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3559:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3567:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3555:3:111"},"nodeType":"YulFunctionCall","src":"3555:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3572:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3551:3:111"},"nodeType":"YulFunctionCall","src":"3551:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3536:3:111"},"nodeType":"YulFunctionCall","src":"3536:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"3642:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3532:3:111"},"nodeType":"YulFunctionCall","src":"3532:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3524:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3085:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3096:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3107:4:111","type":""}],"src":"2995:656:111"},{"body":{"nodeType":"YulBlock","src":"3740:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3789:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3798:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3801:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3791:6:111"},"nodeType":"YulFunctionCall","src":"3791:12:111"},"nodeType":"YulExpressionStatement","src":"3791:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3768:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3776:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3764:3:111"},"nodeType":"YulFunctionCall","src":"3764:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3783:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3760:3:111"},"nodeType":"YulFunctionCall","src":"3760:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3753:6:111"},"nodeType":"YulFunctionCall","src":"3753:35:111"},"nodeType":"YulIf","src":"3750:55:111"},{"nodeType":"YulAssignment","src":"3814:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3837:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3824:12:111"},"nodeType":"YulFunctionCall","src":"3824:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3814:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3887:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3896:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3899:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3889:6:111"},"nodeType":"YulFunctionCall","src":"3889:12:111"},"nodeType":"YulExpressionStatement","src":"3889:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3859:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3867:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3856:2:111"},"nodeType":"YulFunctionCall","src":"3856:30:111"},"nodeType":"YulIf","src":"3853:50:111"},{"nodeType":"YulAssignment","src":"3912:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3928:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3936:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3924:3:111"},"nodeType":"YulFunctionCall","src":"3924:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3912:8:111"}]},{"body":{"nodeType":"YulBlock","src":"4001:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4010:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4013:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4003:6:111"},"nodeType":"YulFunctionCall","src":"4003:12:111"},"nodeType":"YulExpressionStatement","src":"4003:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3964:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3976:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3979:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3972:3:111"},"nodeType":"YulFunctionCall","src":"3972:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3960:3:111"},"nodeType":"YulFunctionCall","src":"3960:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3989:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3956:3:111"},"nodeType":"YulFunctionCall","src":"3956:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3996:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3953:2:111"},"nodeType":"YulFunctionCall","src":"3953:47:111"},"nodeType":"YulIf","src":"3950:67:111"}]},"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3703:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3711:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3719:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3729:6:111","type":""}],"src":"3656:367:111"},{"body":{"nodeType":"YulBlock","src":"4255:983:111","statements":[{"body":{"nodeType":"YulBlock","src":"4302:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4311:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4314:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4304:6:111"},"nodeType":"YulFunctionCall","src":"4304:12:111"},"nodeType":"YulExpressionStatement","src":"4304:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4276:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4285:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4272:3:111"},"nodeType":"YulFunctionCall","src":"4272:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4297:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4268:3:111"},"nodeType":"YulFunctionCall","src":"4268:33:111"},"nodeType":"YulIf","src":"4265:53:111"},{"nodeType":"YulAssignment","src":"4327:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4356:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4337:18:111"},"nodeType":"YulFunctionCall","src":"4337:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4327:6:111"}]},{"nodeType":"YulAssignment","src":"4375:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4408:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4419:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4404:3:111"},"nodeType":"YulFunctionCall","src":"4404:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4385:18:111"},"nodeType":"YulFunctionCall","src":"4385:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4375:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4432:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4463:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4474:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4459:3:111"},"nodeType":"YulFunctionCall","src":"4459:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4446:12:111"},"nodeType":"YulFunctionCall","src":"4446:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4436:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4487:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4497:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4491:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4542:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4551:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4554:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4544:6:111"},"nodeType":"YulFunctionCall","src":"4544:12:111"},"nodeType":"YulExpressionStatement","src":"4544:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4530:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4538:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4527:2:111"},"nodeType":"YulFunctionCall","src":"4527:14:111"},"nodeType":"YulIf","src":"4524:34:111"},{"nodeType":"YulVariableDeclaration","src":"4567:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4635:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4646:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4631:3:111"},"nodeType":"YulFunctionCall","src":"4631:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4655:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"4593:37:111"},"nodeType":"YulFunctionCall","src":"4593:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4571:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4581:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4672:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4682:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4672:6:111"}]},{"nodeType":"YulAssignment","src":"4699:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4709:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4699:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4726:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4770:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4755:3:111"},"nodeType":"YulFunctionCall","src":"4755:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4742:12:111"},"nodeType":"YulFunctionCall","src":"4742:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4730:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4803:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4812:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4815:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4805:6:111"},"nodeType":"YulFunctionCall","src":"4805:12:111"},"nodeType":"YulExpressionStatement","src":"4805:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4789:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4799:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4786:2:111"},"nodeType":"YulFunctionCall","src":"4786:16:111"},"nodeType":"YulIf","src":"4783:36:111"},{"nodeType":"YulVariableDeclaration","src":"4828:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4896:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4907:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4892:3:111"},"nodeType":"YulFunctionCall","src":"4892:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4918:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"4854:37:111"},"nodeType":"YulFunctionCall","src":"4854:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"4832:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"4842:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4935:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"4945:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"4935:6:111"}]},{"nodeType":"YulAssignment","src":"4962:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"4972:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"4962:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4989:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5022:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5033:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5018:3:111"},"nodeType":"YulFunctionCall","src":"5018:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5005:12:111"},"nodeType":"YulFunctionCall","src":"5005:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"4993:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5067:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5076:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5079:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5069:6:111"},"nodeType":"YulFunctionCall","src":"5069:12:111"},"nodeType":"YulExpressionStatement","src":"5069:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"5053:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5063:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5050:2:111"},"nodeType":"YulFunctionCall","src":"5050:16:111"},"nodeType":"YulIf","src":"5047:36:111"},{"nodeType":"YulVariableDeclaration","src":"5092:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5148:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"5159:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5144:3:111"},"nodeType":"YulFunctionCall","src":"5144:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5170:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"5118:25:111"},"nodeType":"YulFunctionCall","src":"5118:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"5096:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"5106:8:111","type":""}]},{"nodeType":"YulAssignment","src":"5187:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"5197:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"5187:6:111"}]},{"nodeType":"YulAssignment","src":"5214:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"5224:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"5214:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4165:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4176:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4188:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4196:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4204:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4212:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"4220:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"4228:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"4236:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"4244:6:111","type":""}],"src":"4028:1210:111"},{"body":{"nodeType":"YulBlock","src":"5400:538:111","statements":[{"body":{"nodeType":"YulBlock","src":"5447:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5456:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5459:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5449:6:111"},"nodeType":"YulFunctionCall","src":"5449:12:111"},"nodeType":"YulExpressionStatement","src":"5449:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5421:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5430:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5417:3:111"},"nodeType":"YulFunctionCall","src":"5417:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5442:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5413:3:111"},"nodeType":"YulFunctionCall","src":"5413:33:111"},"nodeType":"YulIf","src":"5410:53:111"},{"nodeType":"YulAssignment","src":"5472:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5501:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"5482:18:111"},"nodeType":"YulFunctionCall","src":"5482:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5472:6:111"}]},{"nodeType":"YulAssignment","src":"5520:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5564:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5549:3:111"},"nodeType":"YulFunctionCall","src":"5549:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"5530:18:111"},"nodeType":"YulFunctionCall","src":"5530:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5520:6:111"}]},{"nodeType":"YulAssignment","src":"5577:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5604:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5615:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5600:3:111"},"nodeType":"YulFunctionCall","src":"5600:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5587:12:111"},"nodeType":"YulFunctionCall","src":"5587:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5577:6:111"}]},{"nodeType":"YulAssignment","src":"5628:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5655:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5666:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5651:3:111"},"nodeType":"YulFunctionCall","src":"5651:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5638:12:111"},"nodeType":"YulFunctionCall","src":"5638:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"5628:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"5679:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5721:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5706:3:111"},"nodeType":"YulFunctionCall","src":"5706:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5693:12:111"},"nodeType":"YulFunctionCall","src":"5693:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5683:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5769:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5778:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5781:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5771:6:111"},"nodeType":"YulFunctionCall","src":"5771:12:111"},"nodeType":"YulExpressionStatement","src":"5771:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5741:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5749:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5738:2:111"},"nodeType":"YulFunctionCall","src":"5738:30:111"},"nodeType":"YulIf","src":"5735:50:111"},{"nodeType":"YulVariableDeclaration","src":"5794:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5850:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5861:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5846:3:111"},"nodeType":"YulFunctionCall","src":"5846:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5870:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"5820:25:111"},"nodeType":"YulFunctionCall","src":"5820:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"5798:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"5808:8:111","type":""}]},{"nodeType":"YulAssignment","src":"5887:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"5897:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"5887:6:111"}]},{"nodeType":"YulAssignment","src":"5914:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"5924:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"5914:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5326:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5337:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5349:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5357:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5365:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"5373:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"5381:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"5389:6:111","type":""}],"src":"5243:695:111"}]},"contents":"{\n { }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := abi_decode_address(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function abi_decode_array_uint256_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061007c5760003560e01c8063a3f4df7e1161005b578063a3f4df7e1461012c578063bc197c8114610175578063f23a6e61146101b0578063ffa1ad74146101e957600080fd5b806223de291461008157806301ffc9a71461009b578063150b7a02146100c3575b600080fd5b61009961008f36600461037c565b5050505050505050565b005b6100ae6100a9366004610427565b610225565b60405190151581526020015b60405180910390f35b6100fb6100d1366004610470565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ba565b6101686040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516100ba91906104df565b6100fb610183366004610597565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6100fb6101be366004610631565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101686040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806102b857507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061030457507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461032e57600080fd5b919050565b60008083601f84011261034557600080fd5b50813567ffffffffffffffff81111561035d57600080fd5b60208301915083602082850101111561037557600080fd5b9250929050565b60008060008060008060008060c0898b03121561039857600080fd5b6103a18961030a565b97506103af60208a0161030a565b96506103bd60408a0161030a565b955060608901359450608089013567ffffffffffffffff808211156103e157600080fd5b6103ed8c838d01610333565b909650945060a08b013591508082111561040657600080fd5b506104138b828c01610333565b999c989b5096995094979396929594505050565b60006020828403121561043957600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461046957600080fd5b9392505050565b60008060008060006080868803121561048857600080fd5b6104918661030a565b945061049f6020870161030a565b935060408601359250606086013567ffffffffffffffff8111156104c257600080fd5b6104ce88828901610333565b969995985093965092949392505050565b600060208083528351808285015260005b8181101561050c578581018301518582016040015282016104f0565b8181111561051e576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261056457600080fd5b50813567ffffffffffffffff81111561057c57600080fd5b6020830191508360208260051b850101111561037557600080fd5b60008060008060008060008060a0898b0312156105b357600080fd5b6105bc8961030a565b97506105ca60208a0161030a565b9650604089013567ffffffffffffffff808211156105e757600080fd5b6105f38c838d01610552565b909850965060608b013591508082111561060c57600080fd5b6106188c838d01610552565b909650945060808b013591508082111561040657600080fd5b60008060008060008060a0878903121561064a57600080fd5b6106538761030a565b95506106616020880161030a565b94506040870135935060608701359250608087013567ffffffffffffffff81111561068b57600080fd5b61069789828a01610333565b979a969950949750929593949250505056fea264697066735822122084f072ac3f566982b0cd1e3eeaf41b2c3146e5ff3a84b9d217ee5b498a696e5364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA3F4DF7E GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA3F4DF7E EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x81 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0xC3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x99 PUSH2 0x8F CALLDATASIZE PUSH1 0x4 PUSH2 0x37C JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAE PUSH2 0xA9 CALLDATASIZE PUSH1 0x4 PUSH2 0x427 JUMP JUMPDEST PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xFB PUSH2 0xD1 CALLDATASIZE PUSH1 0x4 PUSH2 0x470 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xBA JUMP JUMPDEST PUSH2 0x168 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x44656661756C742043616C6C6261636B2048616E646C65720000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBA SWAP2 SWAP1 PUSH2 0x4DF JUMP JUMPDEST PUSH2 0xFB PUSH2 0x183 CALLDATASIZE PUSH1 0x4 PUSH2 0x597 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xFB PUSH2 0x1BE CALLDATASIZE PUSH1 0x4 PUSH2 0x631 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x168 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x2B8 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x304 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x32E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x345 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A1 DUP10 PUSH2 0x30A JUMP JUMPDEST SWAP8 POP PUSH2 0x3AF PUSH1 0x20 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP7 POP PUSH2 0x3BD PUSH1 0x40 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ED DUP13 DUP4 DUP14 ADD PUSH2 0x333 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x413 DUP12 DUP3 DUP13 ADD PUSH2 0x333 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x488 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x491 DUP7 PUSH2 0x30A JUMP JUMPDEST SWAP5 POP PUSH2 0x49F PUSH1 0x20 DUP8 ADD PUSH2 0x30A JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4CE DUP9 DUP3 DUP10 ADD PUSH2 0x333 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x50C JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x4F0 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x51E JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x564 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x5B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BC DUP10 PUSH2 0x30A JUMP JUMPDEST SWAP8 POP PUSH2 0x5CA PUSH1 0x20 DUP11 ADD PUSH2 0x30A JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5F3 DUP13 DUP4 DUP14 ADD PUSH2 0x552 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x618 DUP13 DUP4 DUP14 ADD PUSH2 0x552 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x64A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x653 DUP8 PUSH2 0x30A JUMP JUMPDEST SWAP6 POP PUSH2 0x661 PUSH1 0x20 DUP9 ADD PUSH2 0x30A JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x68B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x697 DUP10 DUP3 DUP11 ADD PUSH2 0x333 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP5 CREATE PUSH19 0xAC3F566982B0CD1E3EEAF41B2C3146E5FF3A84 0xB9 0xD2 OR 0xEE JUMPDEST 0x49 DUP11 PUSH10 0x6E5364736F6C63430008 0xF STOP CALLER ","sourceMap":"387:1415:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1235:253;;;;;;:::i;:::-;;;;;;;;;;;;1494:306;;;;;;:::i;:::-;;:::i;:::-;;;2084:14:111;;2077:22;2059:41;;2047:2;2032:18;1494:306:15;;;;;;;;1048:181;;;;;;:::i;:::-;1205:17;1048:181;;;;;;;;;;;2916:66:111;2904:79;;;2886:98;;2874:2;2859:18;1048:181:15;2742:248:111;502:56:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;816:226::-;;;;;;:::i;:::-;1018:17;816:226;;;;;;;;;;;611:199;;;;;;:::i;:::-;786:17;611:199;;;;;;;;;564:40;;;;;;;;;;;;;;;;;;;;;1494:306;1581:4;1616:53;;;1631:38;1616:53;;:121;;-1:-1:-1;1685:52:15;;;1700:37;1685:52;1616:121;:177;;;-1:-1:-1;1753:40:15;;;1768:25;1753:40;1616:177;1597:196;1494:306;-1:-1:-1;;1494:306:15:o;14:196:111:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:347::-;266:8;276:6;330:3;323:4;315:6;311:17;307:27;297:55;;348:1;345;338:12;297:55;-1:-1:-1;371:20:111;;414:18;403:30;;400:50;;;446:1;443;436:12;400:50;483:4;475:6;471:17;459:29;;535:3;528:4;519:6;511;507:19;503:30;500:39;497:59;;;552:1;549;542:12;497:59;215:347;;;;;:::o;567:1010::-;693:6;701;709;717;725;733;741;749;802:3;790:9;781:7;777:23;773:33;770:53;;;819:1;816;809:12;770:53;842:29;861:9;842:29;:::i;:::-;832:39;;890:38;924:2;913:9;909:18;890:38;:::i;:::-;880:48;;947:38;981:2;970:9;966:18;947:38;:::i;:::-;937:48;;1032:2;1021:9;1017:18;1004:32;994:42;;1087:3;1076:9;1072:19;1059:33;1111:18;1152:2;1144:6;1141:14;1138:34;;;1168:1;1165;1158:12;1138:34;1207:58;1257:7;1248:6;1237:9;1233:22;1207:58;:::i;:::-;1284:8;;-1:-1:-1;1181:84:111;-1:-1:-1;1372:3:111;1357:19;;1344:33;;-1:-1:-1;1389:16:111;;;1386:36;;;1418:1;1415;1408:12;1386:36;;1457:60;1509:7;1498:8;1487:9;1483:24;1457:60;:::i;:::-;567:1010;;;;-1:-1:-1;567:1010:111;;-1:-1:-1;567:1010:111;;;;;;1536:8;-1:-1:-1;;;567:1010:111:o;1582:332::-;1640:6;1693:2;1681:9;1672:7;1668:23;1664:32;1661:52;;;1709:1;1706;1699:12;1661:52;1748:9;1735:23;1798:66;1791:5;1787:78;1780:5;1777:89;1767:117;;1880:1;1877;1870:12;1767:117;1903:5;1582:332;-1:-1:-1;;;1582:332:111:o;2111:626::-;2208:6;2216;2224;2232;2240;2293:3;2281:9;2272:7;2268:23;2264:33;2261:53;;;2310:1;2307;2300:12;2261:53;2333:29;2352:9;2333:29;:::i;:::-;2323:39;;2381:38;2415:2;2404:9;2400:18;2381:38;:::i;:::-;2371:48;;2466:2;2455:9;2451:18;2438:32;2428:42;;2521:2;2510:9;2506:18;2493:32;2548:18;2540:6;2537:30;2534:50;;;2580:1;2577;2570:12;2534:50;2619:58;2669:7;2660:6;2649:9;2645:22;2619:58;:::i;:::-;2111:626;;;;-1:-1:-1;2111:626:111;;-1:-1:-1;2696:8:111;;2593:84;2111:626;-1:-1:-1;;;2111:626:111:o;2995:656::-;3107:4;3136:2;3165;3154:9;3147:21;3197:6;3191:13;3240:6;3235:2;3224:9;3220:18;3213:34;3265:1;3275:140;3289:6;3286:1;3283:13;3275:140;;;3384:14;;;3380:23;;3374:30;3350:17;;;3369:2;3346:26;3339:66;3304:10;;3275:140;;;3433:6;3430:1;3427:13;3424:91;;;3503:1;3498:2;3489:6;3478:9;3474:22;3470:31;3463:42;3424:91;-1:-1:-1;3567:2:111;3555:15;3572:66;3551:88;3536:104;;;;3642:2;3532:113;;2995:656;-1:-1:-1;;;2995:656:111:o;3656:367::-;3719:8;3729:6;3783:3;3776:4;3768:6;3764:17;3760:27;3750:55;;3801:1;3798;3791:12;3750:55;-1:-1:-1;3824:20:111;;3867:18;3856:30;;3853:50;;;3899:1;3896;3889:12;3853:50;3936:4;3928:6;3924:17;3912:29;;3996:3;3989:4;3979:6;3976:1;3972:14;3964:6;3960:27;3956:38;3953:47;3950:67;;;4013:1;4010;4003:12;4028:1210;4188:6;4196;4204;4212;4220;4228;4236;4244;4297:3;4285:9;4276:7;4272:23;4268:33;4265:53;;;4314:1;4311;4304:12;4265:53;4337:29;4356:9;4337:29;:::i;:::-;4327:39;;4385:38;4419:2;4408:9;4404:18;4385:38;:::i;:::-;4375:48;;4474:2;4463:9;4459:18;4446:32;4497:18;4538:2;4530:6;4527:14;4524:34;;;4554:1;4551;4544:12;4524:34;4593:70;4655:7;4646:6;4635:9;4631:22;4593:70;:::i;:::-;4682:8;;-1:-1:-1;4567:96:111;-1:-1:-1;4770:2:111;4755:18;;4742:32;;-1:-1:-1;4786:16:111;;;4783:36;;;4815:1;4812;4805:12;4783:36;4854:72;4918:7;4907:8;4896:9;4892:24;4854:72;:::i;:::-;4945:8;;-1:-1:-1;4828:98:111;-1:-1:-1;5033:3:111;5018:19;;5005:33;;-1:-1:-1;5050:16:111;;;5047:36;;;5079:1;5076;5069:12;5243:695;5349:6;5357;5365;5373;5381;5389;5442:3;5430:9;5421:7;5417:23;5413:33;5410:53;;;5459:1;5456;5449:12;5410:53;5482:29;5501:9;5482:29;:::i;:::-;5472:39;;5530:38;5564:2;5553:9;5549:18;5530:38;:::i;:::-;5520:48;;5615:2;5604:9;5600:18;5587:32;5577:42;;5666:2;5655:9;5651:18;5638:32;5628:42;;5721:3;5710:9;5706:19;5693:33;5749:18;5741:6;5738:30;5735:50;;;5781:1;5778;5771:12;5735:50;5820:58;5870:7;5861:6;5850:9;5846:22;5820:58;:::i;:::-;5243:695;;;;-1:-1:-1;5243:695:111;;-1:-1:-1;5243:695:111;;5897:8;;5243:695;-1:-1:-1;;;5243:695:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"351800","executionCost":"386","totalCost":"352186"},"external":{"NAME()":"infinite","VERSION()":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","supportsInterface(bytes4)":"426","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite"}},"methodIdentifiers":{"NAME()":"a3f4df7e","VERSION()":"ffa1ad74","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"title\":\"Default Callback Handler - returns true for known token callbacks\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\":\"DefaultCallbackHandler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../interfaces/ERC1155TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC721TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC777TokensRecipient.sol\\\";\\nimport \\\"../interfaces/IERC165.sol\\\";\\n\\n/// @title Default Callback Handler - returns true for known token callbacks\\n/// @author Richard Meissner - \\ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\\n string public constant NAME = \\\"Default Callback Handler\\\";\\n string public constant VERSION = \\\"1.0.0\\\";\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xf23a6e61;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xbc197c81;\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0x150b7a02;\\n }\\n\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n // We implement this for completeness, doesn't really have any value\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x1cdc184c3504176383b7f94f9ce06c96ce1c123e1878258fe6dc03cce4a29ff7\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\n*/\\ninterface ERC1155TokenReceiver {\\n /**\\n @notice Handle the receipt of a single ERC1155 token type.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\\n This function MUST revert if it rejects the transfer.\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _id The ID of the token being transferred\\n @param _value The amount of tokens being transferred\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n */\\n function onERC1155Received(\\n address _operator,\\n address _from,\\n uint256 _id,\\n uint256 _value,\\n bytes calldata _data\\n ) external returns (bytes4);\\n\\n /**\\n @notice Handle the receipt of multiple ERC1155 token types.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\\n This function MUST revert if it rejects the transfer(s).\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n */\\n function onERC1155BatchReceived(\\n address _operator,\\n address _from,\\n uint256[] calldata _ids,\\n uint256[] calldata _values,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7894ef55ee3334f6388e5e1d749bbabd85fc03d5a2ab949f284bce830f8aa398\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\\ninterface ERC721TokenReceiver {\\n /// @notice Handle the receipt of an NFT\\n /// @dev The ERC721 smart contract calls this function on the recipient\\n /// after a `transfer`. This function MAY throw to revert and reject the\\n /// transfer. Return of other than the magic value MUST result in the\\n /// transaction being reverted.\\n /// Note: the contract address is always the message sender.\\n /// @param _operator The address which called `safeTransferFrom` function\\n /// @param _from The address which previously owned the token\\n /// @param _tokenId The NFT identifier which is being transferred\\n /// @param _data Additional data with no specified format\\n /// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n /// unless throwing\\n function onERC721Received(\\n address _operator,\\n address _from,\\n uint256 _tokenId,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x8a3dd41df3a49d9ae2d45dd4087ca595946ed3c6051b8aa304727017b5eabaa4\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ninterface ERC777TokensRecipient {\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata data,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1cfbdb95761067c5bc35599fcae6c11e487f2879d7fa2c6f47e7b94506b4039c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c64c2e071245db8fe3ea8b94f73c5a8de236933858ae240348d502433a9d178\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol":{"ERC1155TokenReceiver":{"abi":[{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. This function MUST return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81) if it accepts the transfer(s). This function MUST revert if it rejects the transfer(s). Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.","params":{"_data":"Additional data with no specified format","_from":"The address which previously owned the token","_ids":"An array containing ids of each token being transferred (order and length must match _values array)","_operator":"The address which initiated the batch transfer (i.e. msg.sender)","_values":"An array containing amounts of each token being transferred (order and length must match _ids array)"},"returns":{"_0":"`bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`"}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. This function MUST return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61) if it accepts the transfer. This function MUST revert if it rejects the transfer. Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.","params":{"_data":"Additional data with no specified format","_from":"The address which previously owned the token","_id":"The ID of the token being transferred","_operator":"The address which initiated the transfer (i.e. msg.sender)","_value":"The amount of tokens being transferred"},"returns":{"_0":"`bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s). This function MUST revert if it rejects the transfer(s). Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\",\"params\":{\"_data\":\"Additional data with no specified format\",\"_from\":\"The address which previously owned the token\",\"_ids\":\"An array containing ids of each token being transferred (order and length must match _values array)\",\"_operator\":\"The address which initiated the batch transfer (i.e. msg.sender)\",\"_values\":\"An array containing amounts of each token being transferred (order and length must match _ids array)\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer. This function MUST revert if it rejects the transfer. Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\",\"params\":{\"_data\":\"Additional data with no specified format\",\"_from\":\"The address which previously owned the token\",\"_id\":\"The ID of the token being transferred\",\"_operator\":\"The address which initiated the transfer (i.e. msg.sender)\",\"_value\":\"The amount of tokens being transferred\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Handle the receipt of multiple ERC1155 token types.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Handle the receipt of a single ERC1155 token type.\"}},\"notice\":\"Note: The ERC-165 identifier for this interface is 0x4e2312e0.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":\"ERC1155TokenReceiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\n*/\\ninterface ERC1155TokenReceiver {\\n /**\\n @notice Handle the receipt of a single ERC1155 token type.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\\n This function MUST revert if it rejects the transfer.\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _id The ID of the token being transferred\\n @param _value The amount of tokens being transferred\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n */\\n function onERC1155Received(\\n address _operator,\\n address _from,\\n uint256 _id,\\n uint256 _value,\\n bytes calldata _data\\n ) external returns (bytes4);\\n\\n /**\\n @notice Handle the receipt of multiple ERC1155 token types.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\\n This function MUST revert if it rejects the transfer(s).\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n */\\n function onERC1155BatchReceived(\\n address _operator,\\n address _from,\\n uint256[] calldata _ids,\\n uint256[] calldata _values,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7894ef55ee3334f6388e5e1d749bbabd85fc03d5a2ab949f284bce830f8aa398\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Handle the receipt of multiple ERC1155 token types."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Handle the receipt of a single ERC1155 token type."}},"notice":"Note: The ERC-165 identifier for this interface is 0x4e2312e0.","version":1}}},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol":{"ERC721TokenReceiver":{"abi":[{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Note: the ERC-165 identifier for this interface is 0x150b7a02.","kind":"dev","methods":{"onERC721Received(address,address,uint256,bytes)":{"details":"The ERC721 smart contract calls this function on the recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted. Note: the contract address is always the message sender.","params":{"_data":"Additional data with no specified format","_from":"The address which previously owned the token","_operator":"The address which called `safeTransferFrom` function","_tokenId":"The NFT identifier which is being transferred"},"returns":{"_0":"`bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` unless throwing"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Note: the ERC-165 identifier for this interface is 0x150b7a02.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"The ERC721 smart contract calls this function on the recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted. Note: the contract address is always the message sender.\",\"params\":{\"_data\":\"Additional data with no specified format\",\"_from\":\"The address which previously owned the token\",\"_operator\":\"The address which called `safeTransferFrom` function\",\"_tokenId\":\"The NFT identifier which is being transferred\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` unless throwing\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Handle the receipt of an NFT\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":\"ERC721TokenReceiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\\ninterface ERC721TokenReceiver {\\n /// @notice Handle the receipt of an NFT\\n /// @dev The ERC721 smart contract calls this function on the recipient\\n /// after a `transfer`. This function MAY throw to revert and reject the\\n /// transfer. Return of other than the magic value MUST result in the\\n /// transaction being reverted.\\n /// Note: the contract address is always the message sender.\\n /// @param _operator The address which called `safeTransferFrom` function\\n /// @param _from The address which previously owned the token\\n /// @param _tokenId The NFT identifier which is being transferred\\n /// @param _data Additional data with no specified format\\n /// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n /// unless throwing\\n function onERC721Received(\\n address _operator,\\n address _from,\\n uint256 _tokenId,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x8a3dd41df3a49d9ae2d45dd4087ca595946ed3c6051b8aa304727017b5eabaa4\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"onERC721Received(address,address,uint256,bytes)":{"notice":"Handle the receipt of an NFT"}},"version":1}}},"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol":{"ERC777TokensRecipient":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":\"ERC777TokensRecipient\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ninterface ERC777TokensRecipient {\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata data,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1cfbdb95761067c5bc35599fcae6c11e487f2879d7fa2c6f47e7b94506b4039c\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol":{"IERC165":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c64c2e071245db8fe3ea8b94f73c5a8de236933858ae240348d502433a9d178\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol","version":1}}},"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol":{"ISignatureValidator":{"abi":[{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"isValidSignature(bytes,bytes)":{"details":"Should return whether the signature provided is valid for the provided data","params":{"_data":"Arbitrary length data signed on the behalf of address(this)","_signature":"Signature byte array associated with _data MUST return the bytes4 magic value 0x20c13b0b when function passes. MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) MUST allow external calls"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isValidSignature(bytes,bytes)":"20c13b0b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes,bytes)\":{\"details\":\"Should return whether the signature provided is valid for the provided data\",\"params\":{\"_data\":\"Arbitrary length data signed on the behalf of address(this)\",\"_signature\":\"Signature byte array associated with _data MUST return the bytes4 magic value 0x20c13b0b when function passes. MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) MUST allow external calls\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":\"ISignatureValidator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}},"ISignatureValidatorConstants":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220f56181cb21b3fb80ba9f419f1986c086388934ac677fb4e5e61a7f888d6ce66164736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 PUSH2 0x81CB 0x21 0xB3 0xFB DUP1 0xBA SWAP16 COINBASE SWAP16 NOT DUP7 0xC0 DUP7 CODESIZE DUP10 CALLVALUE 0xAC PUSH8 0x7FB4E5E61A7F888D PUSH13 0xE66164736F6C634300080F0033 ","sourceMap":"75:161:20:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea2646970667358221220f56181cb21b3fb80ba9f419f1986c086388934ac677fb4e5e61a7f888d6ce66164736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 PUSH2 0x81CB 0x21 0xB3 0xFB DUP1 0xBA SWAP16 COINBASE SWAP16 NOT DUP7 0xC0 DUP7 CODESIZE DUP10 CALLVALUE 0xAC PUSH8 0x7FB4E5E61A7F888D PUSH13 0xE66164736F6C634300080F0033 ","sourceMap":"75:161:20:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":\"ISignatureValidatorConstants\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol":{"GnosisSafeProxy":{"abi":[{"inputs":[{"internalType":"address","name":"_singleton","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"}],"devdoc":{"author":"Stefan George - Richard Meissner - ","kind":"dev","methods":{"constructor":{"details":"Constructor function sets address of singleton contract.","params":{"_singleton":"Singleton address."}}},"title":"GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.","version":1},"evm":{"bytecode":{"functionDebugData":{"@_2550":{"entryPoint":null,"id":2550,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":185,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f4a46125d24bcf992f3a005546c0f3eafebe1847b2ccd7a103878ded65e88250__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:709:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"95:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"141:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"150:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"153:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"143:6:111"},"nodeType":"YulFunctionCall","src":"143:12:111"},"nodeType":"YulExpressionStatement","src":"143:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"116:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"125:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"112:3:111"},"nodeType":"YulFunctionCall","src":"112:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"137:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"108:3:111"},"nodeType":"YulFunctionCall","src":"108:32:111"},"nodeType":"YulIf","src":"105:52:111"},{"nodeType":"YulVariableDeclaration","src":"166:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"185:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"179:5:111"},"nodeType":"YulFunctionCall","src":"179:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"170:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"258:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"267:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"270:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"260:6:111"},"nodeType":"YulFunctionCall","src":"260:12:111"},"nodeType":"YulExpressionStatement","src":"260:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"217:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"228:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"243:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"248:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"239:3:111"},"nodeType":"YulFunctionCall","src":"239:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"252:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"235:3:111"},"nodeType":"YulFunctionCall","src":"235:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"224:3:111"},"nodeType":"YulFunctionCall","src":"224:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"214:2:111"},"nodeType":"YulFunctionCall","src":"214:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"207:6:111"},"nodeType":"YulFunctionCall","src":"207:50:111"},"nodeType":"YulIf","src":"204:70:111"},{"nodeType":"YulAssignment","src":"283:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"293:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"283:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"61:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"72:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"84:6:111","type":""}],"src":"14:290:111"},{"body":{"nodeType":"YulBlock","src":"483:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"500:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"511:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"493:6:111"},"nodeType":"YulFunctionCall","src":"493:21:111"},"nodeType":"YulExpressionStatement","src":"493:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"534:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"545:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"530:3:111"},"nodeType":"YulFunctionCall","src":"530:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"550:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"523:6:111"},"nodeType":"YulFunctionCall","src":"523:30:111"},"nodeType":"YulExpressionStatement","src":"523:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"573:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"584:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"569:3:111"},"nodeType":"YulFunctionCall","src":"569:18:111"},{"hexValue":"496e76616c69642073696e676c65746f6e20616464726573732070726f766964","kind":"string","nodeType":"YulLiteral","src":"589:34:111","type":"","value":"Invalid singleton address provid"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"562:6:111"},"nodeType":"YulFunctionCall","src":"562:62:111"},"nodeType":"YulExpressionStatement","src":"562:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"644:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"655:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"640:3:111"},"nodeType":"YulFunctionCall","src":"640:18:111"},{"hexValue":"6564","kind":"string","nodeType":"YulLiteral","src":"660:4:111","type":"","value":"ed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"633:6:111"},"nodeType":"YulFunctionCall","src":"633:32:111"},"nodeType":"YulExpressionStatement","src":"633:32:111"},{"nodeType":"YulAssignment","src":"674:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"686:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"697:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"682:3:111"},"nodeType":"YulFunctionCall","src":"682:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"674:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f4a46125d24bcf992f3a005546c0f3eafebe1847b2ccd7a103878ded65e88250__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"460:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"474:4:111","type":""}],"src":"309:398:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_f4a46125d24bcf992f3a005546c0f3eafebe1847b2ccd7a103878ded65e88250__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"Invalid singleton address provid\")\n mstore(add(headStart, 96), \"ed\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"608060405234801561001057600080fd5b5060405161019838038061019883398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b60a1806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x198 CODESIZE SUB DUP1 PUSH2 0x198 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x94 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642073696E676C65746F6E20616464726573732070726F766964 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x1959 PUSH1 0xF2 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0xE9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 DUP1 PUSH2 0xF7 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F00330000000000 ","sourceMap":"512:1497:21:-:0;;;946:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;996:24:21;;988:71;;;;-1:-1:-1;;;988:71:21;;511:2:111;988:71:21;;;493:21:111;550:2;530:18;;;523:30;589:34;569:18;;;562:62;-1:-1:-1;;;640:18:111;;;633:32;682:19;;988:71:21;;;;;;;;1069:9;:22;;-1:-1:-1;;;;;;1069:22:21;-1:-1:-1;;;;;1069:22:21;;;;;;;;;;512:1497;;14:290:111;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:111;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:111:o;309:398::-;512:1497:21;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_2556":{"entryPoint":null,"id":2556,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F00330000000000 ","sourceMap":"512:1497:21:-:0;;;1344:1;1348:42;1344:1;1338:8;1334:57;1526:66;1344:1;1509:15;1506:87;1503:176;;1622:10;1344:1;1612:21;1660:4;1344:1;1650:15;1503:176;1711:14;1344:1;;1692:34;1344:1;;1711:14;1344:1;1774:10;1767:5;1754:56;1739:71;;1844:16;1344:1;;1823:38;1880:7;1874:77;;1920:16;1344:1;1910:27;1874:77;;1974:16;1344:1;1964:27"},"gasEstimates":{"creation":{"codeDepositCost":"32200","executionCost":"infinite","totalCost":"infinite"},"external":{"":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"author\":\"Stefan George - Richard Meissner - \",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Constructor function sets address of singleton contract.\",\"params\":{\"_singleton\":\"Singleton address.\"}}},\"title\":\"GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":\"GnosisSafeProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\\n/// @author Richard Meissner - \\ninterface IProxy {\\n function masterCopy() external view returns (address);\\n}\\n\\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafeProxy {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\\n address internal singleton;\\n\\n /// @dev Constructor function sets address of singleton contract.\\n /// @param _singleton Singleton address.\\n constructor(address _singleton) {\\n require(_singleton != address(0), \\\"Invalid singleton address provided\\\");\\n singleton = _singleton;\\n }\\n\\n /// @dev Fallback function forwards all transactions and returns all received return data.\\n fallback() external payable {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\\n // 0xa619486e == keccak(\\\"masterCopy()\\\"). The value is right padded to 32-bytes with 0s\\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\\n mstore(0, _singleton)\\n return(0, 0x20)\\n }\\n calldatacopy(0, 0, calldatasize())\\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if eq(success, 0) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3bfdd453d9f896f7029d15bcafd11886957b320ad1764309d9f74fa059715249\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2529,"contract":"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol:GnosisSafeProxy","label":"singleton","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}},"IProxy":{"abi":[{"inputs":[],"name":"masterCopy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"author":"Richard Meissner - ","kind":"dev","methods":{},"title":"IProxy - Helper interface to access masterCopy of the Proxy on-chain","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"masterCopy()":"a619486e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"masterCopy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Richard Meissner - \",\"kind\":\"dev\",\"methods\":{},\"title\":\"IProxy - Helper interface to access masterCopy of the Proxy on-chain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":\"IProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\\n/// @author Richard Meissner - \\ninterface IProxy {\\n function masterCopy() external view returns (address);\\n}\\n\\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafeProxy {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\\n address internal singleton;\\n\\n /// @dev Constructor function sets address of singleton contract.\\n /// @param _singleton Singleton address.\\n constructor(address _singleton) {\\n require(_singleton != address(0), \\\"Invalid singleton address provided\\\");\\n singleton = _singleton;\\n }\\n\\n /// @dev Fallback function forwards all transactions and returns all received return data.\\n fallback() external payable {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\\n // 0xa619486e == keccak(\\\"masterCopy()\\\"). The value is right padded to 32-bytes with 0s\\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\\n mstore(0, _singleton)\\n return(0, 0x20)\\n }\\n calldatacopy(0, 0, calldatasize())\\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if eq(success, 0) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3bfdd453d9f896f7029d15bcafd11886957b320ad1764309d9f74fa059715249\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol":{"GnosisSafeProxyFactory":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"singleton","type":"address"}],"name":"ProxyCreation","type":"event"},{"inputs":[{"internalType":"address","name":"_singleton","type":"address"},{"internalType":"bytes","name":"initializer","type":"bytes"},{"internalType":"uint256","name":"saltNonce","type":"uint256"}],"name":"calculateCreateProxyWithNonceAddress","outputs":[{"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"singleton","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createProxy","outputs":[{"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_singleton","type":"address"},{"internalType":"bytes","name":"initializer","type":"bytes"},{"internalType":"uint256","name":"saltNonce","type":"uint256"},{"internalType":"contract IProxyCreationCallback","name":"callback","type":"address"}],"name":"createProxyWithCallback","outputs":[{"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_singleton","type":"address"},{"internalType":"bytes","name":"initializer","type":"bytes"},{"internalType":"uint256","name":"saltNonce","type":"uint256"}],"name":"createProxyWithNonce","outputs":[{"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyCreationCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"proxyRuntimeCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}],"devdoc":{"author":"Stefan George - ","kind":"dev","methods":{"calculateCreateProxyWithNonceAddress(address,bytes,uint256)":{"details":"Allows to get the address for a new proxy contact created via `createProxyWithNonce` This method is only meant for address calculation purpose when you use an initializer that would revert, therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.","params":{"_singleton":"Address of singleton contract.","initializer":"Payload for message call sent to new proxy contract.","saltNonce":"Nonce that will be used to generate the salt to calculate the address of the new proxy contract."}},"createProxy(address,bytes)":{"details":"Allows to create new proxy contact and execute a message call to the new proxy within one transaction.","params":{"data":"Payload for message call sent to new proxy contract.","singleton":"Address of singleton contract."}},"createProxyWithCallback(address,bytes,uint256,address)":{"details":"Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction","params":{"_singleton":"Address of singleton contract.","callback":"Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.","initializer":"Payload for message call sent to new proxy contract.","saltNonce":"Nonce that will be used to generate the salt to calculate the address of the new proxy contract."}},"createProxyWithNonce(address,bytes,uint256)":{"details":"Allows to create new proxy contact and execute a message call to the new proxy within one transaction.","params":{"_singleton":"Address of singleton contract.","initializer":"Payload for message call sent to new proxy contract.","saltNonce":"Nonce that will be used to generate the salt to calculate the address of the new proxy contract."}},"proxyCreationCode()":{"details":"Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address."},"proxyRuntimeCode()":{"details":"Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed."}},"title":"Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610c1d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806361b69abd1161005057806361b69abd146100dc578063addacc0f146100ef578063d18af54d146100f757600080fd5b80631688f0b9146100775780632500510e146100b457806353e5d935146100c7575b600080fd5b61008a61008536600461070e565b61010a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a6100c2366004610767565b610192565b6100cf610272565b6040516100ab919061086c565b61008a6100ea366004610886565b6102ba565b6100cf61037d565b61008a6101053660046108d6565b61038f565b60006101178484846104ab565b83519091501561013b5760008060008551602087016000865af10361013b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252861660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a19392505050565b60006101d68585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506104ab915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152909150603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526102699160040161086c565b60405180910390fd5b606060405180602001610284906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b6000826040516102c9906105f6565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f080158015610302573d6000803e3d6000fd5b508251909150156103275760008060008451602086016000865af10361032757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a192915050565b60606040518060200161028490610603565b60008083836040516020016103d392919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506103f986868361010a565b915073ffffffffffffffffffffffffffffffffffffffff8316156104a2576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b5189061046f9085908a908a908a90600401610942565b600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020016104d1929190918252602082015260400190565b6040516020818303038152906040528051906020012090506000604051806020016104fb906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610553919073ffffffffffffffffffffffffffffffffffffffff89169060200161098c565b6040516020818303038152906040529050818151826020016000f5925073ffffffffffffffffffffffffffffffffffffffff83166105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610269565b50509392505050565b610198806109af83390190565b60a180610b4783390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461063157600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261067457600080fd5b813567ffffffffffffffff8082111561068f5761068f610634565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156106d5576106d5610634565b816040528381528660208588010111156106ee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561072357600080fd5b833561072e8161060f565b9250602084013567ffffffffffffffff81111561074a57600080fd5b61075686828701610663565b925050604084013590509250925092565b6000806000806060858703121561077d57600080fd5b84356107888161060f565b9350602085013567ffffffffffffffff808211156107a557600080fd5b818701915087601f8301126107b957600080fd5b8135818111156107c857600080fd5b8860208285010111156107da57600080fd5b95986020929092019750949560400135945092505050565b60005b8381101561080d5781810151838201526020016107f5565b8381111561081c576000848401525b50505050565b6000815180845261083a8160208601602086016107f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061087f6020830184610822565b9392505050565b6000806040838503121561089957600080fd5b82356108a48161060f565b9150602083013567ffffffffffffffff8111156108c057600080fd5b6108cc85828601610663565b9150509250929050565b600080600080608085870312156108ec57600080fd5b84356108f78161060f565b9350602085013567ffffffffffffffff81111561091357600080fd5b61091f87828801610663565b9350506040850135915060608501356109378161060f565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261097b6080830185610822565b905082606083015295945050505050565b6000835161099e8184602088016107f2565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161019838038061019883398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b60a1806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f00336080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f0033a2646970667358221220219ecee2bf286fdcea4541652c84c19a873c9d9a8a36a51caa100a3629bb073364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC1D DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x72 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61B69ABD GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x61B69ABD EQ PUSH2 0xDC JUMPI DUP1 PUSH4 0xADDACC0F EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xD18AF54D EQ PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1688F0B9 EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0x2500510E EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x53E5D935 EQ PUSH2 0xC7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x10A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0xC2 CALLDATASIZE PUSH1 0x4 PUSH2 0x767 JUMP JUMPDEST PUSH2 0x192 JUMP JUMPDEST PUSH2 0xCF PUSH2 0x272 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x86C JUMP JUMPDEST PUSH2 0x8A PUSH2 0xEA CALLDATASIZE PUSH1 0x4 PUSH2 0x886 JUMP JUMPDEST PUSH2 0x2BA JUMP JUMPDEST PUSH2 0xCF PUSH2 0x37D JUMP JUMPDEST PUSH2 0x8A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D6 JUMP JUMPDEST PUSH2 0x38F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x117 DUP5 DUP5 DUP5 PUSH2 0x4AB JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD PUSH1 0x20 DUP8 ADD PUSH1 0x0 DUP7 GAS CALL SUB PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND DUP3 MSTORE DUP7 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4F51FAF6C4561FF95F067657E43439F0F856D97C04D9EC9070A6199AD418E235 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D6 DUP6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP8 SWAP3 POP PUSH2 0x4AB SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 PUSH1 0x60 DUP4 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x34 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH2 0x269 SWAP2 PUSH1 0x4 ADD PUSH2 0x86C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x284 SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2C9 SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x302 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP DUP3 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 MLOAD PUSH1 0x20 DUP7 ADD PUSH1 0x0 DUP7 GAS CALL SUB PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND DUP3 MSTORE DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4F51FAF6C4561FF95F067657E43439F0F856D97C04D9EC9070A6199AD418E235 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x284 SWAP1 PUSH2 0x603 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3D3 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x60 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x34 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x0 SHR SWAP1 POP PUSH2 0x3F9 DUP7 DUP7 DUP4 PUSH2 0x10A JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1E52B51800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x1E52B518 SWAP1 PUSH2 0x46F SWAP1 DUP6 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x942 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x49D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x4D1 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x4FB SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x553 SWAP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH1 0x20 ADD PUSH2 0x98C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP DUP2 DUP2 MLOAD DUP3 PUSH1 0x20 ADD PUSH1 0x0 CREATE2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x5ED JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x437265617465322063616C6C206661696C656400000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x269 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x198 DUP1 PUSH2 0x9AF DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0xA1 DUP1 PUSH2 0xB47 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x631 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x674 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x68F JUMPI PUSH2 0x68F PUSH2 0x634 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x6D5 JUMPI PUSH2 0x6D5 PUSH2 0x634 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x723 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x72E DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x756 DUP7 DUP3 DUP8 ADD PUSH2 0x663 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x77D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x788 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x7A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x7B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x7DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x80D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x7F5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x83A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x7F2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x87F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x822 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x899 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x8A4 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8CC DUP6 DUP3 DUP7 ADD PUSH2 0x663 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x8EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x8F7 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x91F DUP8 DUP3 DUP9 ADD PUSH2 0x663 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x937 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x97B PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x822 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x99E DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x7F2 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x198 CODESIZE SUB DUP1 PUSH2 0x198 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x94 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642073696E676C65746F6E20616464726573732070726F766964 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x1959 PUSH1 0xF2 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0xE9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 DUP1 PUSH2 0xF7 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F00336080604052 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F0033A264697066 PUSH20 0x58221220219ECEE2BF286FDCEA4541652C84C19A DUP8 EXTCODECOPY SWAP14 SWAP11 DUP11 CALLDATASIZE 0xA5 SHR 0xAA LT EXP CALLDATASIZE 0x29 0xBB SMOD CALLER PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"324:5502:22:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@calculateCreateProxyWithNonceAddress_2803":{"entryPoint":402,"id":2803,"parameterSlots":4,"returnSlots":1},"@createProxyWithCallback_2771":{"entryPoint":911,"id":2771,"parameterSlots":4,"returnSlots":1},"@createProxyWithNonce_2714":{"entryPoint":266,"id":2714,"parameterSlots":3,"returnSlots":1},"@createProxy_2600":{"entryPoint":698,"id":2600,"parameterSlots":2,"returnSlots":1},"@deployProxyWithNonce_2681":{"entryPoint":1195,"id":2681,"parameterSlots":3,"returnSlots":1},"@proxyCreationCode_2624":{"entryPoint":626,"id":2624,"parameterSlots":0,"returnSlots":1},"@proxyRuntimeCode_2612":{"entryPoint":893,"id":2612,"parameterSlots":0,"returnSlots":1},"abi_decode_bytes":{"entryPoint":1635,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_bytes_calldata_ptrt_uint256":{"entryPoint":1895,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":2182,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256":{"entryPoint":1806,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256t_contract$_IProxyCreationCallback_$2820":{"entryPoint":2262,"id":null,"parameterSlots":2,"returnSlots":4},"abi_encode_bytes":{"entryPoint":2082,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed":{"entryPoint":2444,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_uint256_t_contract$_IProxyCreationCallback_$2820__to_t_uint256_t_address__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":2156,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address__to_t_address_payable_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_payable_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":2370,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_d7c71a0bdd2eb2834ad042153c811dd478e4ee2324e3003b9522e03e7b3735dc__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":2034,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x41":{"entryPoint":1588,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":1551,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:7706:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"205:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"222:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"225:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"215:6:111"},"nodeType":"YulFunctionCall","src":"215:88:111"},"nodeType":"YulExpressionStatement","src":"215:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"319:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"322:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"312:6:111"},"nodeType":"YulFunctionCall","src":"312:15:111"},"nodeType":"YulExpressionStatement","src":"312:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"343:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"346:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"336:6:111"},"nodeType":"YulFunctionCall","src":"336:15:111"},"nodeType":"YulExpressionStatement","src":"336:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"173:184:111"},{"body":{"nodeType":"YulBlock","src":"414:725:111","statements":[{"body":{"nodeType":"YulBlock","src":"463:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"472:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"475:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"465:6:111"},"nodeType":"YulFunctionCall","src":"465:12:111"},"nodeType":"YulExpressionStatement","src":"465:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"442:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"450:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"438:3:111"},"nodeType":"YulFunctionCall","src":"438:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"457:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"434:3:111"},"nodeType":"YulFunctionCall","src":"434:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"427:6:111"},"nodeType":"YulFunctionCall","src":"427:35:111"},"nodeType":"YulIf","src":"424:55:111"},{"nodeType":"YulVariableDeclaration","src":"488:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"511:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"498:12:111"},"nodeType":"YulFunctionCall","src":"498:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"492:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"527:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"537:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"531:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"578:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"580:16:111"},"nodeType":"YulFunctionCall","src":"580:18:111"},"nodeType":"YulExpressionStatement","src":"580:18:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"570:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"574:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"567:2:111"},"nodeType":"YulFunctionCall","src":"567:10:111"},"nodeType":"YulIf","src":"564:36:111"},{"nodeType":"YulVariableDeclaration","src":"609:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"619:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"613:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"694:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"714:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"708:5:111"},"nodeType":"YulFunctionCall","src":"708:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"698:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"726:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"748:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"772:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"776:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:13:111"},{"name":"_3","nodeType":"YulIdentifier","src":"783:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"764:3:111"},"nodeType":"YulFunctionCall","src":"764:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"788:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"760:3:111"},"nodeType":"YulFunctionCall","src":"760:31:111"},{"name":"_3","nodeType":"YulIdentifier","src":"793:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"756:3:111"},"nodeType":"YulFunctionCall","src":"756:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"744:3:111"},"nodeType":"YulFunctionCall","src":"744:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"730:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"856:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"858:16:111"},"nodeType":"YulFunctionCall","src":"858:18:111"},"nodeType":"YulExpressionStatement","src":"858:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"815:10:111"},{"name":"_2","nodeType":"YulIdentifier","src":"827:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"812:2:111"},"nodeType":"YulFunctionCall","src":"812:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"835:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"847:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"832:2:111"},"nodeType":"YulFunctionCall","src":"832:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"809:2:111"},"nodeType":"YulFunctionCall","src":"809:46:111"},"nodeType":"YulIf","src":"806:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"894:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"898:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"887:6:111"},"nodeType":"YulFunctionCall","src":"887:22:111"},"nodeType":"YulExpressionStatement","src":"887:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"925:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"933:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"918:6:111"},"nodeType":"YulFunctionCall","src":"918:18:111"},"nodeType":"YulExpressionStatement","src":"918:18:111"},{"body":{"nodeType":"YulBlock","src":"984:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"993:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"996:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"986:6:111"},"nodeType":"YulFunctionCall","src":"986:12:111"},"nodeType":"YulExpressionStatement","src":"986:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"959:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"967:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"955:3:111"},"nodeType":"YulFunctionCall","src":"955:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"972:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"951:3:111"},"nodeType":"YulFunctionCall","src":"951:26:111"},{"name":"end","nodeType":"YulIdentifier","src":"979:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"948:2:111"},"nodeType":"YulFunctionCall","src":"948:35:111"},"nodeType":"YulIf","src":"945:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1026:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1034:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1022:3:111"},"nodeType":"YulFunctionCall","src":"1022:17:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1045:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1053:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1041:3:111"},"nodeType":"YulFunctionCall","src":"1041:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1060:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"1009:12:111"},"nodeType":"YulFunctionCall","src":"1009:54:111"},"nodeType":"YulExpressionStatement","src":"1009:54:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1087:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1095:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1083:3:111"},"nodeType":"YulFunctionCall","src":"1083:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1100:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1079:3:111"},"nodeType":"YulFunctionCall","src":"1079:26:111"},{"kind":"number","nodeType":"YulLiteral","src":"1107:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1072:6:111"},"nodeType":"YulFunctionCall","src":"1072:37:111"},"nodeType":"YulExpressionStatement","src":"1072:37:111"},{"nodeType":"YulAssignment","src":"1118:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1127:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"1118:5:111"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"388:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"396:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"404:5:111","type":""}],"src":"362:777:111"},{"body":{"nodeType":"YulBlock","src":"1257:410:111","statements":[{"body":{"nodeType":"YulBlock","src":"1303:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1312:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1315:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1305:6:111"},"nodeType":"YulFunctionCall","src":"1305:12:111"},"nodeType":"YulExpressionStatement","src":"1305:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1278:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1287:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1274:3:111"},"nodeType":"YulFunctionCall","src":"1274:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1299:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1270:3:111"},"nodeType":"YulFunctionCall","src":"1270:32:111"},"nodeType":"YulIf","src":"1267:52:111"},{"nodeType":"YulVariableDeclaration","src":"1328:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1354:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1341:12:111"},"nodeType":"YulFunctionCall","src":"1341:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1332:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1398:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1373:24:111"},"nodeType":"YulFunctionCall","src":"1373:31:111"},"nodeType":"YulExpressionStatement","src":"1373:31:111"},{"nodeType":"YulAssignment","src":"1413:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1423:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1413:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1437:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1468:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1479:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1464:3:111"},"nodeType":"YulFunctionCall","src":"1464:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1451:12:111"},"nodeType":"YulFunctionCall","src":"1451:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1441:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1526:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1535:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1538:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1528:6:111"},"nodeType":"YulFunctionCall","src":"1528:12:111"},"nodeType":"YulExpressionStatement","src":"1528:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1498:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1506:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1495:2:111"},"nodeType":"YulFunctionCall","src":"1495:30:111"},"nodeType":"YulIf","src":"1492:50:111"},{"nodeType":"YulAssignment","src":"1551:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1582:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1593:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1578:3:111"},"nodeType":"YulFunctionCall","src":"1578:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1602:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"1561:16:111"},"nodeType":"YulFunctionCall","src":"1561:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1551:6:111"}]},{"nodeType":"YulAssignment","src":"1619:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1646:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1657:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1642:3:111"},"nodeType":"YulFunctionCall","src":"1642:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1629:12:111"},"nodeType":"YulFunctionCall","src":"1629:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1619:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1207:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1218:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1230:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1238:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1246:6:111","type":""}],"src":"1144:523:111"},{"body":{"nodeType":"YulBlock","src":"1805:125:111","statements":[{"nodeType":"YulAssignment","src":"1815:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1838:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1823:3:111"},"nodeType":"YulFunctionCall","src":"1823:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1815:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1857:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1872:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1880:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1868:3:111"},"nodeType":"YulFunctionCall","src":"1868:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1850:6:111"},"nodeType":"YulFunctionCall","src":"1850:74:111"},"nodeType":"YulExpressionStatement","src":"1850:74:111"}]},"name":"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1774:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1785:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1796:4:111","type":""}],"src":"1672:258:111"},{"body":{"nodeType":"YulBlock","src":"2058:671:111","statements":[{"body":{"nodeType":"YulBlock","src":"2104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2106:6:111"},"nodeType":"YulFunctionCall","src":"2106:12:111"},"nodeType":"YulExpressionStatement","src":"2106:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2079:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2088:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2075:3:111"},"nodeType":"YulFunctionCall","src":"2075:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2100:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2071:3:111"},"nodeType":"YulFunctionCall","src":"2071:32:111"},"nodeType":"YulIf","src":"2068:52:111"},{"nodeType":"YulVariableDeclaration","src":"2129:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2155:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2142:12:111"},"nodeType":"YulFunctionCall","src":"2142:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2133:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2199:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2174:24:111"},"nodeType":"YulFunctionCall","src":"2174:31:111"},"nodeType":"YulExpressionStatement","src":"2174:31:111"},{"nodeType":"YulAssignment","src":"2214:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2224:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2214:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2238:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2269:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2280:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2265:3:111"},"nodeType":"YulFunctionCall","src":"2265:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2252:12:111"},"nodeType":"YulFunctionCall","src":"2252:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2242:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2293:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2303:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2297:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2350:6:111"},"nodeType":"YulFunctionCall","src":"2350:12:111"},"nodeType":"YulExpressionStatement","src":"2350:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2336:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2344:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2333:2:111"},"nodeType":"YulFunctionCall","src":"2333:14:111"},"nodeType":"YulIf","src":"2330:34:111"},{"nodeType":"YulVariableDeclaration","src":"2373:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2387:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2398:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2383:3:111"},"nodeType":"YulFunctionCall","src":"2383:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2377:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2453:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2462:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2465:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2455:6:111"},"nodeType":"YulFunctionCall","src":"2455:12:111"},"nodeType":"YulExpressionStatement","src":"2455:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2432:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2436:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2428:3:111"},"nodeType":"YulFunctionCall","src":"2428:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2443:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2424:3:111"},"nodeType":"YulFunctionCall","src":"2424:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2417:6:111"},"nodeType":"YulFunctionCall","src":"2417:35:111"},"nodeType":"YulIf","src":"2414:55:111"},{"nodeType":"YulVariableDeclaration","src":"2478:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2505:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2492:12:111"},"nodeType":"YulFunctionCall","src":"2492:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"2482:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2535:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2544:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2547:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2537:6:111"},"nodeType":"YulFunctionCall","src":"2537:12:111"},"nodeType":"YulExpressionStatement","src":"2537:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2523:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2531:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2520:2:111"},"nodeType":"YulFunctionCall","src":"2520:14:111"},"nodeType":"YulIf","src":"2517:34:111"},{"body":{"nodeType":"YulBlock","src":"2601:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2610:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2613:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2603:6:111"},"nodeType":"YulFunctionCall","src":"2603:12:111"},"nodeType":"YulExpressionStatement","src":"2603:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2574:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"2578:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2570:3:111"},"nodeType":"YulFunctionCall","src":"2570:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2587:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2566:3:111"},"nodeType":"YulFunctionCall","src":"2566:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2592:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2563:2:111"},"nodeType":"YulFunctionCall","src":"2563:37:111"},"nodeType":"YulIf","src":"2560:57:111"},{"nodeType":"YulAssignment","src":"2626:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"2640:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2644:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2636:3:111"},"nodeType":"YulFunctionCall","src":"2636:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2626:6:111"}]},{"nodeType":"YulAssignment","src":"2656:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"2666:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2656:6:111"}]},{"nodeType":"YulAssignment","src":"2681:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2708:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2719:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2704:3:111"},"nodeType":"YulFunctionCall","src":"2704:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2691:12:111"},"nodeType":"YulFunctionCall","src":"2691:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2681:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2000:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2011:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2023:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2031:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2039:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2047:6:111","type":""}],"src":"1935:794:111"},{"body":{"nodeType":"YulBlock","src":"2787:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2797:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2806:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"2801:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2866:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2891:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2896:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2887:3:111"},"nodeType":"YulFunctionCall","src":"2887:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2910:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2915:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2906:3:111"},"nodeType":"YulFunctionCall","src":"2906:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2900:5:111"},"nodeType":"YulFunctionCall","src":"2900:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2880:6:111"},"nodeType":"YulFunctionCall","src":"2880:39:111"},"nodeType":"YulExpressionStatement","src":"2880:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2827:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2830:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2824:2:111"},"nodeType":"YulFunctionCall","src":"2824:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2838:19:111","statements":[{"nodeType":"YulAssignment","src":"2840:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2849:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"2852:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2845:3:111"},"nodeType":"YulFunctionCall","src":"2845:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"2840:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2820:3:111","statements":[]},"src":"2816:113:111"},{"body":{"nodeType":"YulBlock","src":"2955:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2968:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2973:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2964:3:111"},"nodeType":"YulFunctionCall","src":"2964:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2982:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2957:6:111"},"nodeType":"YulFunctionCall","src":"2957:27:111"},"nodeType":"YulExpressionStatement","src":"2957:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2944:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2947:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2941:2:111"},"nodeType":"YulFunctionCall","src":"2941:13:111"},"nodeType":"YulIf","src":"2938:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"2765:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"2770:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"2775:6:111","type":""}],"src":"2734:258:111"},{"body":{"nodeType":"YulBlock","src":"3046:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3056:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3076:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3070:5:111"},"nodeType":"YulFunctionCall","src":"3070:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3060:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3098:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"3103:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3091:6:111"},"nodeType":"YulFunctionCall","src":"3091:19:111"},"nodeType":"YulExpressionStatement","src":"3091:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3145:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3152:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3141:3:111"},"nodeType":"YulFunctionCall","src":"3141:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3163:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"3168:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3159:3:111"},"nodeType":"YulFunctionCall","src":"3159:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"3175:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"3119:21:111"},"nodeType":"YulFunctionCall","src":"3119:63:111"},"nodeType":"YulExpressionStatement","src":"3119:63:111"},{"nodeType":"YulAssignment","src":"3191:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3206:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3219:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3227:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3215:3:111"},"nodeType":"YulFunctionCall","src":"3215:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3232:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3211:3:111"},"nodeType":"YulFunctionCall","src":"3211:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3202:3:111"},"nodeType":"YulFunctionCall","src":"3202:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"3302:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3198:3:111"},"nodeType":"YulFunctionCall","src":"3198:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"3191:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"3023:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"3030:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"3038:3:111","type":""}],"src":"2997:316:111"},{"body":{"nodeType":"YulBlock","src":"3437:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3454:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3465:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3447:6:111"},"nodeType":"YulFunctionCall","src":"3447:21:111"},"nodeType":"YulExpressionStatement","src":"3447:21:111"},{"nodeType":"YulAssignment","src":"3477:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3502:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3525:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3510:3:111"},"nodeType":"YulFunctionCall","src":"3510:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"3485:16:111"},"nodeType":"YulFunctionCall","src":"3485:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3477:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3406:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3417:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3428:4:111","type":""}],"src":"3318:217:111"},{"body":{"nodeType":"YulBlock","src":"3636:359:111","statements":[{"body":{"nodeType":"YulBlock","src":"3682:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3691:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3694:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3684:6:111"},"nodeType":"YulFunctionCall","src":"3684:12:111"},"nodeType":"YulExpressionStatement","src":"3684:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3657:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3666:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3653:3:111"},"nodeType":"YulFunctionCall","src":"3653:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3678:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3649:3:111"},"nodeType":"YulFunctionCall","src":"3649:32:111"},"nodeType":"YulIf","src":"3646:52:111"},{"nodeType":"YulVariableDeclaration","src":"3707:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3733:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3720:12:111"},"nodeType":"YulFunctionCall","src":"3720:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3711:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3777:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"3752:24:111"},"nodeType":"YulFunctionCall","src":"3752:31:111"},"nodeType":"YulExpressionStatement","src":"3752:31:111"},{"nodeType":"YulAssignment","src":"3792:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3802:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3792:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3816:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3843:3:111"},"nodeType":"YulFunctionCall","src":"3843:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3830:12:111"},"nodeType":"YulFunctionCall","src":"3830:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3820:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3905:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3914:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3917:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3907:6:111"},"nodeType":"YulFunctionCall","src":"3907:12:111"},"nodeType":"YulExpressionStatement","src":"3907:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3877:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3885:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3874:2:111"},"nodeType":"YulFunctionCall","src":"3874:30:111"},"nodeType":"YulIf","src":"3871:50:111"},{"nodeType":"YulAssignment","src":"3930:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3961:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3972:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3957:3:111"},"nodeType":"YulFunctionCall","src":"3957:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3981:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"3940:16:111"},"nodeType":"YulFunctionCall","src":"3940:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3930:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3594:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3605:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3617:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3625:6:111","type":""}],"src":"3540:455:111"},{"body":{"nodeType":"YulBlock","src":"4161:535:111","statements":[{"body":{"nodeType":"YulBlock","src":"4208:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4217:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4220:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4210:6:111"},"nodeType":"YulFunctionCall","src":"4210:12:111"},"nodeType":"YulExpressionStatement","src":"4210:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4182:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4191:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4178:3:111"},"nodeType":"YulFunctionCall","src":"4178:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4203:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4174:3:111"},"nodeType":"YulFunctionCall","src":"4174:33:111"},"nodeType":"YulIf","src":"4171:53:111"},{"nodeType":"YulVariableDeclaration","src":"4233:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4259:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4246:12:111"},"nodeType":"YulFunctionCall","src":"4246:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4237:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4303:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4278:24:111"},"nodeType":"YulFunctionCall","src":"4278:31:111"},"nodeType":"YulExpressionStatement","src":"4278:31:111"},{"nodeType":"YulAssignment","src":"4318:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4328:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4318:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4342:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4373:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4384:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4369:3:111"},"nodeType":"YulFunctionCall","src":"4369:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4356:12:111"},"nodeType":"YulFunctionCall","src":"4356:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4346:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4431:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4440:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4443:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4433:6:111"},"nodeType":"YulFunctionCall","src":"4433:12:111"},"nodeType":"YulExpressionStatement","src":"4433:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4403:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4411:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4400:2:111"},"nodeType":"YulFunctionCall","src":"4400:30:111"},"nodeType":"YulIf","src":"4397:50:111"},{"nodeType":"YulAssignment","src":"4456:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4487:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4498:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4483:3:111"},"nodeType":"YulFunctionCall","src":"4483:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4507:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4466:16:111"},"nodeType":"YulFunctionCall","src":"4466:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4456:6:111"}]},{"nodeType":"YulAssignment","src":"4524:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4551:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4562:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4547:3:111"},"nodeType":"YulFunctionCall","src":"4547:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4534:12:111"},"nodeType":"YulFunctionCall","src":"4534:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4524:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4575:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4618:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4603:3:111"},"nodeType":"YulFunctionCall","src":"4603:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4590:12:111"},"nodeType":"YulFunctionCall","src":"4590:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"4579:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4656:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4631:24:111"},"nodeType":"YulFunctionCall","src":"4631:33:111"},"nodeType":"YulExpressionStatement","src":"4631:33:111"},{"nodeType":"YulAssignment","src":"4673:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"4683:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4673:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256t_contract$_IProxyCreationCallback_$2820","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4103:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4114:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4126:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4134:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4142:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4150:6:111","type":""}],"src":"4000:696:111"},{"body":{"nodeType":"YulBlock","src":"4862:198:111","statements":[{"nodeType":"YulAssignment","src":"4872:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4895:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4880:3:111"},"nodeType":"YulFunctionCall","src":"4880:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4872:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"4907:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4917:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4911:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4975:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4990:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4998:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4986:3:111"},"nodeType":"YulFunctionCall","src":"4986:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4968:6:111"},"nodeType":"YulFunctionCall","src":"4968:34:111"},"nodeType":"YulExpressionStatement","src":"4968:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5022:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5033:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5018:3:111"},"nodeType":"YulFunctionCall","src":"5018:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"5042:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5050:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5038:3:111"},"nodeType":"YulFunctionCall","src":"5038:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5011:6:111"},"nodeType":"YulFunctionCall","src":"5011:43:111"},"nodeType":"YulExpressionStatement","src":"5011:43:111"}]},"name":"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address__to_t_address_payable_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4823:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4834:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4842:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4853:4:111","type":""}],"src":"4701:359:111"},{"body":{"nodeType":"YulBlock","src":"5216:145:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5233:3:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5246:2:111","type":"","value":"96"},{"name":"value0","nodeType":"YulIdentifier","src":"5250:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"5242:3:111"},"nodeType":"YulFunctionCall","src":"5242:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5259:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5238:3:111"},"nodeType":"YulFunctionCall","src":"5238:88:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5226:6:111"},"nodeType":"YulFunctionCall","src":"5226:101:111"},"nodeType":"YulExpressionStatement","src":"5226:101:111"},{"nodeType":"YulAssignment","src":"5336:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5347:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5352:2:111","type":"","value":"20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5343:3:111"},"nodeType":"YulFunctionCall","src":"5343:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"5336:3:111"}]}]},"name":"abi_encode_tuple_packed_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"5192:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5197:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5208:3:111","type":""}],"src":"5065:296:111"},{"body":{"nodeType":"YulBlock","src":"5487:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5504:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5515:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5497:6:111"},"nodeType":"YulFunctionCall","src":"5497:21:111"},"nodeType":"YulExpressionStatement","src":"5497:21:111"},{"nodeType":"YulAssignment","src":"5527:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5552:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5564:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5575:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5560:3:111"},"nodeType":"YulFunctionCall","src":"5560:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"5535:16:111"},"nodeType":"YulFunctionCall","src":"5535:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5527:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5456:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5467:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5478:4:111","type":""}],"src":"5366:219:111"},{"body":{"nodeType":"YulBlock","src":"5691:125:111","statements":[{"nodeType":"YulAssignment","src":"5701:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5724:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5709:3:111"},"nodeType":"YulFunctionCall","src":"5709:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5701:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5743:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5758:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5766:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5754:3:111"},"nodeType":"YulFunctionCall","src":"5754:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5736:6:111"},"nodeType":"YulFunctionCall","src":"5736:74:111"},"nodeType":"YulExpressionStatement","src":"5736:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5660:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5671:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5682:4:111","type":""}],"src":"5590:226:111"},{"body":{"nodeType":"YulBlock","src":"5999:182:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6016:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"6021:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6009:6:111"},"nodeType":"YulFunctionCall","src":"6009:19:111"},"nodeType":"YulExpressionStatement","src":"6009:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6048:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"6053:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6044:3:111"},"nodeType":"YulFunctionCall","src":"6044:12:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6066:2:111","type":"","value":"96"},{"name":"value1","nodeType":"YulIdentifier","src":"6070:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"6062:3:111"},"nodeType":"YulFunctionCall","src":"6062:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"6079:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6058:3:111"},"nodeType":"YulFunctionCall","src":"6058:88:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6037:6:111"},"nodeType":"YulFunctionCall","src":"6037:110:111"},"nodeType":"YulExpressionStatement","src":"6037:110:111"},{"nodeType":"YulAssignment","src":"6156:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6167:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"6172:2:111","type":"","value":"52"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6163:3:111"},"nodeType":"YulFunctionCall","src":"6163:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"6156:3:111"}]}]},"name":"abi_encode_tuple_packed_t_uint256_t_contract$_IProxyCreationCallback_$2820__to_t_uint256_t_address__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"5967:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5972:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5980:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5991:3:111","type":""}],"src":"5821:360:111"},{"body":{"nodeType":"YulBlock","src":"6421:308:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6431:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6441:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6435:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6499:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6514:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6522:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6510:3:111"},"nodeType":"YulFunctionCall","src":"6510:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6492:6:111"},"nodeType":"YulFunctionCall","src":"6492:34:111"},"nodeType":"YulExpressionStatement","src":"6492:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6546:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6557:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6542:3:111"},"nodeType":"YulFunctionCall","src":"6542:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"6566:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6574:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6562:3:111"},"nodeType":"YulFunctionCall","src":"6562:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6535:6:111"},"nodeType":"YulFunctionCall","src":"6535:43:111"},"nodeType":"YulExpressionStatement","src":"6535:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6598:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6609:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6594:3:111"},"nodeType":"YulFunctionCall","src":"6594:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6614:3:111","type":"","value":"128"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6587:6:111"},"nodeType":"YulFunctionCall","src":"6587:31:111"},"nodeType":"YulExpressionStatement","src":"6587:31:111"},{"nodeType":"YulAssignment","src":"6627:53:111","value":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"6652:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6664:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6675:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6660:3:111"},"nodeType":"YulFunctionCall","src":"6660:19:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"6635:16:111"},"nodeType":"YulFunctionCall","src":"6635:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6627:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6700:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6711:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6696:3:111"},"nodeType":"YulFunctionCall","src":"6696:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"6716:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6689:6:111"},"nodeType":"YulFunctionCall","src":"6689:34:111"},"nodeType":"YulExpressionStatement","src":"6689:34:111"}]},"name":"abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_payable_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6366:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"6377:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6385:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6393:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6401:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6412:4:111","type":""}],"src":"6186:543:111"},{"body":{"nodeType":"YulBlock","src":"6881:100:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6898:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"6903:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6891:6:111"},"nodeType":"YulFunctionCall","src":"6891:19:111"},"nodeType":"YulExpressionStatement","src":"6891:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6930:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"6935:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6926:3:111"},"nodeType":"YulFunctionCall","src":"6926:12:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6940:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6919:6:111"},"nodeType":"YulFunctionCall","src":"6919:28:111"},"nodeType":"YulExpressionStatement","src":"6919:28:111"},{"nodeType":"YulAssignment","src":"6956:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6967:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"6972:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6963:3:111"},"nodeType":"YulFunctionCall","src":"6963:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"6956:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"6849:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6854:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6862:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"6873:3:111","type":""}],"src":"6734:247:111"},{"body":{"nodeType":"YulBlock","src":"7151:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7161:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7181:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7175:5:111"},"nodeType":"YulFunctionCall","src":"7175:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"7165:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7223:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7231:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7219:3:111"},"nodeType":"YulFunctionCall","src":"7219:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"7238:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7243:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"7197:21:111"},"nodeType":"YulFunctionCall","src":"7197:53:111"},"nodeType":"YulExpressionStatement","src":"7197:53:111"},{"nodeType":"YulVariableDeclaration","src":"7259:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7276:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7281:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7272:3:111"},"nodeType":"YulFunctionCall","src":"7272:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"7263:5:111","type":""}]},{"expression":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"7304:5:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7311:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7297:6:111"},"nodeType":"YulFunctionCall","src":"7297:21:111"},"nodeType":"YulExpressionStatement","src":"7297:21:111"},{"nodeType":"YulAssignment","src":"7327:23:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"7338:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7345:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7334:3:111"},"nodeType":"YulFunctionCall","src":"7334:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"7327:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"7119:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7124:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7132:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"7143:3:111","type":""}],"src":"6986:370:111"},{"body":{"nodeType":"YulBlock","src":"7535:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7563:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7545:6:111"},"nodeType":"YulFunctionCall","src":"7545:21:111"},"nodeType":"YulExpressionStatement","src":"7545:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7586:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7597:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7582:3:111"},"nodeType":"YulFunctionCall","src":"7582:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7602:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7575:6:111"},"nodeType":"YulFunctionCall","src":"7575:30:111"},"nodeType":"YulExpressionStatement","src":"7575:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7625:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7636:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7621:3:111"},"nodeType":"YulFunctionCall","src":"7621:18:111"},{"hexValue":"437265617465322063616c6c206661696c6564","kind":"string","nodeType":"YulLiteral","src":"7641:21:111","type":"","value":"Create2 call failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7614:6:111"},"nodeType":"YulFunctionCall","src":"7614:49:111"},"nodeType":"YulExpressionStatement","src":"7614:49:111"},{"nodeType":"YulAssignment","src":"7672:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7684:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7695:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7680:3:111"},"nodeType":"YulFunctionCall","src":"7680:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7672:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_d7c71a0bdd2eb2834ad042153c811dd478e4ee2324e3003b9522e03e7b3735dc__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7512:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7526:4:111","type":""}],"src":"7361:343:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let _2 := 0xffffffffffffffff\n if gt(_1, _2) { panic_error_0x41() }\n let _3 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_1, 0x1f), _3), 63), _3))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(memPtr, 0x20), add(offset, 0x20), _1)\n mstore(add(add(memPtr, _1), 0x20), 0)\n array := memPtr\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptrt_uint256t_contract$_IProxyCreationCallback_$2820(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n value2 := calldataload(add(headStart, 64))\n let value_1 := calldataload(add(headStart, 96))\n validator_revert_address(value_1)\n value3 := value_1\n }\n function abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address__to_t_address_payable_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_encode_tuple_packed_t_contract$_GnosisSafeProxy_$2557__to_t_address_payable__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, and(shl(96, value0), 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000))\n end := add(pos, 20)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_packed_t_uint256_t_contract$_IProxyCreationCallback_$2820__to_t_uint256_t_address__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, value0)\n mstore(add(pos, 32), and(shl(96, value1), 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000))\n end := add(pos, 52)\n }\n function abi_encode_tuple_t_contract$_GnosisSafeProxy_$2557_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_payable_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), 128)\n tail := abi_encode_bytes(value2, add(headStart, 128))\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, value0)\n mstore(add(pos, 32), value1)\n end := add(pos, 64)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n mstore(end_1, value1)\n end := add(end_1, 0x20)\n }\n function abi_encode_tuple_t_stringliteral_d7c71a0bdd2eb2834ad042153c811dd478e4ee2324e3003b9522e03e7b3735dc__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Create2 call failed\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100725760003560e01c806361b69abd1161005057806361b69abd146100dc578063addacc0f146100ef578063d18af54d146100f757600080fd5b80631688f0b9146100775780632500510e146100b457806353e5d935146100c7575b600080fd5b61008a61008536600461070e565b61010a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a6100c2366004610767565b610192565b6100cf610272565b6040516100ab919061086c565b61008a6100ea366004610886565b6102ba565b6100cf61037d565b61008a6101053660046108d6565b61038f565b60006101178484846104ab565b83519091501561013b5760008060008551602087016000865af10361013b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252861660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a19392505050565b60006101d68585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506104ab915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152909150603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526102699160040161086c565b60405180910390fd5b606060405180602001610284906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b6000826040516102c9906105f6565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f080158015610302573d6000803e3d6000fd5b508251909150156103275760008060008451602086016000865af10361032757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a192915050565b60606040518060200161028490610603565b60008083836040516020016103d392919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506103f986868361010a565b915073ffffffffffffffffffffffffffffffffffffffff8316156104a2576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b5189061046f9085908a908a908a90600401610942565b600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020016104d1929190918252602082015260400190565b6040516020818303038152906040528051906020012090506000604051806020016104fb906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610553919073ffffffffffffffffffffffffffffffffffffffff89169060200161098c565b6040516020818303038152906040529050818151826020016000f5925073ffffffffffffffffffffffffffffffffffffffff83166105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610269565b50509392505050565b610198806109af83390190565b60a180610b4783390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461063157600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261067457600080fd5b813567ffffffffffffffff8082111561068f5761068f610634565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156106d5576106d5610634565b816040528381528660208588010111156106ee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561072357600080fd5b833561072e8161060f565b9250602084013567ffffffffffffffff81111561074a57600080fd5b61075686828701610663565b925050604084013590509250925092565b6000806000806060858703121561077d57600080fd5b84356107888161060f565b9350602085013567ffffffffffffffff808211156107a557600080fd5b818701915087601f8301126107b957600080fd5b8135818111156107c857600080fd5b8860208285010111156107da57600080fd5b95986020929092019750949560400135945092505050565b60005b8381101561080d5781810151838201526020016107f5565b8381111561081c576000848401525b50505050565b6000815180845261083a8160208601602086016107f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061087f6020830184610822565b9392505050565b6000806040838503121561089957600080fd5b82356108a48161060f565b9150602083013567ffffffffffffffff8111156108c057600080fd5b6108cc85828601610663565b9150509250929050565b600080600080608085870312156108ec57600080fd5b84356108f78161060f565b9350602085013567ffffffffffffffff81111561091357600080fd5b61091f87828801610663565b9350506040850135915060608501356109378161060f565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261097b6080830185610822565b905082606083015295945050505050565b6000835161099e8184602088016107f2565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161019838038061019883398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b60a1806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f00336080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea2646970667358221220ff83f8f4ba4dbabd0fd283f4fe654c7916f6681583b0f82976b6c4f4ce2a551664736f6c634300080f0033a2646970667358221220219ecee2bf286fdcea4541652c84c19a873c9d9a8a36a51caa100a3629bb073364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x72 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61B69ABD GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x61B69ABD EQ PUSH2 0xDC JUMPI DUP1 PUSH4 0xADDACC0F EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xD18AF54D EQ PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1688F0B9 EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0x2500510E EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x53E5D935 EQ PUSH2 0xC7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x10A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0xC2 CALLDATASIZE PUSH1 0x4 PUSH2 0x767 JUMP JUMPDEST PUSH2 0x192 JUMP JUMPDEST PUSH2 0xCF PUSH2 0x272 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x86C JUMP JUMPDEST PUSH2 0x8A PUSH2 0xEA CALLDATASIZE PUSH1 0x4 PUSH2 0x886 JUMP JUMPDEST PUSH2 0x2BA JUMP JUMPDEST PUSH2 0xCF PUSH2 0x37D JUMP JUMPDEST PUSH2 0x8A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D6 JUMP JUMPDEST PUSH2 0x38F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x117 DUP5 DUP5 DUP5 PUSH2 0x4AB JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD PUSH1 0x20 DUP8 ADD PUSH1 0x0 DUP7 GAS CALL SUB PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND DUP3 MSTORE DUP7 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4F51FAF6C4561FF95F067657E43439F0F856D97C04D9EC9070A6199AD418E235 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D6 DUP6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP8 SWAP3 POP PUSH2 0x4AB SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 PUSH1 0x60 DUP4 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x34 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH2 0x269 SWAP2 PUSH1 0x4 ADD PUSH2 0x86C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x284 SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2C9 SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x302 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP DUP3 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 MLOAD PUSH1 0x20 DUP7 ADD PUSH1 0x0 DUP7 GAS CALL SUB PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND DUP3 MSTORE DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4F51FAF6C4561FF95F067657E43439F0F856D97C04D9EC9070A6199AD418E235 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x284 SWAP1 PUSH2 0x603 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3D3 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x60 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x34 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x0 SHR SWAP1 POP PUSH2 0x3F9 DUP7 DUP7 DUP4 PUSH2 0x10A JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1E52B51800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x1E52B518 SWAP1 PUSH2 0x46F SWAP1 DUP6 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x942 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x49D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x4D1 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x4FB SWAP1 PUSH2 0x5F6 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x553 SWAP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH1 0x20 ADD PUSH2 0x98C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP DUP2 DUP2 MLOAD DUP3 PUSH1 0x20 ADD PUSH1 0x0 CREATE2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x5ED JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x437265617465322063616C6C206661696C656400000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x269 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x198 DUP1 PUSH2 0x9AF DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0xA1 DUP1 PUSH2 0xB47 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x631 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x674 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x68F JUMPI PUSH2 0x68F PUSH2 0x634 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x6D5 JUMPI PUSH2 0x6D5 PUSH2 0x634 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x723 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x72E DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x756 DUP7 DUP3 DUP8 ADD PUSH2 0x663 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x77D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x788 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x7A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x7B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x7DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x80D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x7F5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x83A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x7F2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x87F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x822 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x899 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x8A4 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8CC DUP6 DUP3 DUP7 ADD PUSH2 0x663 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x8EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x8F7 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x91F DUP8 DUP3 DUP9 ADD PUSH2 0x663 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x937 DUP2 PUSH2 0x60F JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x97B PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x822 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x99E DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x7F2 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x198 CODESIZE SUB DUP1 PUSH2 0x198 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x94 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642073696E676C65746F6E20616464726573732070726F766964 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x1959 PUSH1 0xF2 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0xE9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 DUP1 PUSH2 0xF7 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F00336080604052 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD AND PUSH32 0xA619486E00000000000000000000000000000000000000000000000000000000 DUP3 CALLDATALOAD SUB PUSH1 0x4D JUMPI DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 RETURN JUMPDEST CALLDATASIZE DUP3 DUP4 CALLDATACOPY DUP2 DUP3 CALLDATASIZE DUP5 DUP5 GAS DELEGATECALL SWAP1 POP RETURNDATASIZE DUP3 DUP4 RETURNDATACOPY DUP1 PUSH1 0x66 JUMPI RETURNDATASIZE DUP3 REVERT JUMPDEST POP RETURNDATASIZE DUP2 RETURN INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT DUP4 0xF8 DELEGATECALL 0xBA 0x4D 0xBA 0xBD 0xF 0xD2 DUP4 DELEGATECALL INVALID PUSH6 0x4C7916F66815 DUP4 0xB0 0xF8 0x29 PUSH23 0xB6C4F4CE2A551664736F6C634300080F0033A264697066 PUSH20 0x58221220219ECEE2BF286FDCEA4541652C84C19A DUP8 EXTCODECOPY SWAP14 SWAP11 DUP11 CALLDATASIZE 0xA5 SHR 0xAA LT EXP CALLDATASIZE 0x29 0xBB SMOD CALLER PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"324:5502:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3268:576;;;;;;:::i;:::-;;:::i;:::-;;;1880:42:111;1868:55;;;1850:74;;1838:2;1823:18;3268:576:22;;;;;;;;5510:314;;;;;;:::i;:::-;;:::i;1548:122::-;;;:::i;:::-;;;;;;;:::i;675:462::-;;;;;;:::i;:::-;;:::i;1277:120::-;;;:::i;4382:511::-;;;;;;:::i;:::-;;:::i;3268:576::-;3409:21;3450:56;3471:10;3483:11;3496:9;3450:20;:56::i;:::-;3520:18;;3442:64;;-1:-1:-1;3520:22:22;3516:275;;3722:1;3718;3715;3701:11;3695:18;3688:4;3675:11;3671:22;3668:1;3661:5;3654;3649:71;3646:78;3643:134;;3757:1;3754;3747:12;3643:134;3805:32;;;4917:42:111;4986:15;;;4968:34;;5038:15;;5033:2;5018:18;;5011:43;3805:32:22;;4880:18:111;3805:32:22;;;;;;;3268:576;;;;;:::o;5510:314::-;5671:21;5712:56;5733:10;5745:11;;5712:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5758:9:22;;-1:-1:-1;5712:20:22;;-1:-1:-1;;5712:56:22:i;:::-;5792:23;;5259:66:111;5246:2;5242:15;;;5238:88;5792:23:22;;;5226:101:111;5704:64:22;;-1:-1:-1;5343:12:111;;5792:23:22;;;;;;;;;;;;;;5778:39;;;;;;;;:::i;:::-;;;;;;;;1548:122;1598:12;1629:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1548:122;-1:-1:-1;1548:122:22:o;675:462::-;750:21;811:9;791:30;;;;;:::i;:::-;1880:42:111;1868:55;;;1850:74;;1838:2;1823:18;791:30:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;835:11:22;;783:38;;-1:-1:-1;835:15:22;831:254;;1016:1;1012;1009;1002:4;996:11;989:4;983;979:15;976:1;969:5;962;957:57;954:64;951:120;;1051:1;1048;1041:12;951:120;1099:31;;;4917:42:111;4986:15;;;4968:34;;5038:15;;5033:2;5018:18;;5011:43;1099:31:22;;4880:18:111;1099:31:22;;;;;;;675:462;;;;:::o;1277:120::-;1326:12;1357:33;;;;;;;;:::i;4382:511::-;4567:21;4600:29;4667:9;4678:8;4650:37;;;;;;;;6009:19:111;;;6066:2;6062:15;6079:66;6058:88;6053:2;6044:12;;6037:110;6172:2;6163:12;;5821:360;4650:37:22;;;;;;;;;;;;;4640:48;;;;;;4632:57;;4600:89;;4707:68;4728:10;4740:11;4753:21;4707:20;:68::i;:::-;4699:76;-1:-1:-1;4789:31:22;;;;4785:101;;4822:64;;;;;:21;;;;;;:64;;4844:5;;4851:10;;4863:11;;4876:9;;4822:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4785:101;4590:303;4382:511;;;;;;:::o;2118:769::-;2261:21;2436:12;2488:11;2478:22;;;;;;2502:9;2461:51;;;;;;;;6891:19:111;;;6935:2;6926:12;;6919:28;6972:2;6963:12;;6734:247;2461:51:22;;;;;;;;;;;;;2451:62;;;;;;2436:77;;2523:27;2570:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2553:82;;2570:34;2606:28;;;;2570:34;2553:82;;:::i;:::-;;;;;;;;;;;;;2523:112;;2796:4;2779:14;2773:21;2756:14;2750:4;2746:25;2741:3;2733:68;2724:77;-1:-1:-1;2828:28:22;;;2820:60;;;;;;;7563:2:111;2820:60:22;;;7545:21:111;7602:2;7582:18;;;7575:30;7641:21;7621:18;;;7614:49;7680:18;;2820:60:22;7361:343:111;2820:60:22;2284:603;;2118:769;;;;;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:154:111:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:184::-;225:77;222:1;215:88;322:4;319:1;312:15;346:4;343:1;336:15;362:777;404:5;457:3;450:4;442:6;438:17;434:27;424:55;;475:1;472;465:12;424:55;511:6;498:20;537:18;574:2;570;567:10;564:36;;;580:18;;:::i;:::-;714:2;708:9;776:4;768:13;;619:66;764:22;;;788:2;760:31;756:40;744:53;;;812:18;;;832:22;;;809:46;806:72;;;858:18;;:::i;:::-;898:10;894:2;887:22;933:2;925:6;918:18;979:3;972:4;967:2;959:6;955:15;951:26;948:35;945:55;;;996:1;993;986:12;945:55;1060:2;1053:4;1045:6;1041:17;1034:4;1026:6;1022:17;1009:54;1107:1;1100:4;1095:2;1087:6;1083:15;1079:26;1072:37;1127:6;1118:15;;;;;;362:777;;;;:::o;1144:523::-;1230:6;1238;1246;1299:2;1287:9;1278:7;1274:23;1270:32;1267:52;;;1315:1;1312;1305:12;1267:52;1354:9;1341:23;1373:31;1398:5;1373:31;:::i;:::-;1423:5;-1:-1:-1;1479:2:111;1464:18;;1451:32;1506:18;1495:30;;1492:50;;;1538:1;1535;1528:12;1492:50;1561:49;1602:7;1593:6;1582:9;1578:22;1561:49;:::i;:::-;1551:59;;;1657:2;1646:9;1642:18;1629:32;1619:42;;1144:523;;;;;:::o;1935:794::-;2023:6;2031;2039;2047;2100:2;2088:9;2079:7;2075:23;2071:32;2068:52;;;2116:1;2113;2106:12;2068:52;2155:9;2142:23;2174:31;2199:5;2174:31;:::i;:::-;2224:5;-1:-1:-1;2280:2:111;2265:18;;2252:32;2303:18;2333:14;;;2330:34;;;2360:1;2357;2350:12;2330:34;2398:6;2387:9;2383:22;2373:32;;2443:7;2436:4;2432:2;2428:13;2424:27;2414:55;;2465:1;2462;2455:12;2414:55;2505:2;2492:16;2531:2;2523:6;2520:14;2517:34;;;2547:1;2544;2537:12;2517:34;2592:7;2587:2;2578:6;2574:2;2570:15;2566:24;2563:37;2560:57;;;2613:1;2610;2603:12;2560:57;1935:794;;2644:2;2636:11;;;;;-1:-1:-1;2666:6:111;;2719:2;2704:18;2691:32;;-1:-1:-1;1935:794:111;-1:-1:-1;;;1935:794:111:o;2734:258::-;2806:1;2816:113;2830:6;2827:1;2824:13;2816:113;;;2906:11;;;2900:18;2887:11;;;2880:39;2852:2;2845:10;2816:113;;;2947:6;2944:1;2941:13;2938:48;;;2982:1;2973:6;2968:3;2964:16;2957:27;2938:48;;2734:258;;;:::o;2997:316::-;3038:3;3076:5;3070:12;3103:6;3098:3;3091:19;3119:63;3175:6;3168:4;3163:3;3159:14;3152:4;3145:5;3141:16;3119:63;:::i;:::-;3227:2;3215:15;3232:66;3211:88;3202:98;;;;3302:4;3198:109;;2997:316;-1:-1:-1;;2997:316:111:o;3318:217::-;3465:2;3454:9;3447:21;3428:4;3485:44;3525:2;3514:9;3510:18;3502:6;3485:44;:::i;:::-;3477:52;3318:217;-1:-1:-1;;;3318:217:111:o;3540:455::-;3617:6;3625;3678:2;3666:9;3657:7;3653:23;3649:32;3646:52;;;3694:1;3691;3684:12;3646:52;3733:9;3720:23;3752:31;3777:5;3752:31;:::i;:::-;3802:5;-1:-1:-1;3858:2:111;3843:18;;3830:32;3885:18;3874:30;;3871:50;;;3917:1;3914;3907:12;3871:50;3940:49;3981:7;3972:6;3961:9;3957:22;3940:49;:::i;:::-;3930:59;;;3540:455;;;;;:::o;4000:696::-;4126:6;4134;4142;4150;4203:3;4191:9;4182:7;4178:23;4174:33;4171:53;;;4220:1;4217;4210:12;4171:53;4259:9;4246:23;4278:31;4303:5;4278:31;:::i;:::-;4328:5;-1:-1:-1;4384:2:111;4369:18;;4356:32;4411:18;4400:30;;4397:50;;;4443:1;4440;4433:12;4397:50;4466:49;4507:7;4498:6;4487:9;4483:22;4466:49;:::i;:::-;4456:59;;;4562:2;4551:9;4547:18;4534:32;4524:42;;4618:2;4607:9;4603:18;4590:32;4631:33;4656:7;4631:33;:::i;:::-;4000:696;;;;-1:-1:-1;4000:696:111;;-1:-1:-1;;4000:696:111:o;6186:543::-;6412:4;6441:42;6522:2;6514:6;6510:15;6499:9;6492:34;6574:2;6566:6;6562:15;6557:2;6546:9;6542:18;6535:43;;6614:3;6609:2;6598:9;6594:18;6587:31;6635:45;6675:3;6664:9;6660:19;6652:6;6635:45;:::i;:::-;6627:53;;6716:6;6711:2;6700:9;6696:18;6689:34;6186:543;;;;;;;:::o;6986:370::-;7143:3;7181:6;7175:13;7197:53;7243:6;7238:3;7231:4;7223:6;7219:17;7197:53;:::i;:::-;7272:16;;;;7297:21;;;-1:-1:-1;7345:4:111;7334:16;;6986:370;-1:-1:-1;6986:370:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"620200","executionCost":"651","totalCost":"620851"},"external":{"calculateCreateProxyWithNonceAddress(address,bytes,uint256)":"infinite","createProxy(address,bytes)":"infinite","createProxyWithCallback(address,bytes,uint256,address)":"infinite","createProxyWithNonce(address,bytes,uint256)":"infinite","proxyCreationCode()":"infinite","proxyRuntimeCode()":"infinite"},"internal":{"deployProxyWithNonce(address,bytes memory,uint256)":"infinite"}},"methodIdentifiers":{"calculateCreateProxyWithNonceAddress(address,bytes,uint256)":"2500510e","createProxy(address,bytes)":"61b69abd","createProxyWithCallback(address,bytes,uint256,address)":"d18af54d","createProxyWithNonce(address,bytes,uint256)":"1688f0b9","proxyCreationCode()":"53e5d935","proxyRuntimeCode()":"addacc0f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"singleton\",\"type\":\"address\"}],\"name\":\"ProxyCreation\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"}],\"name\":\"calculateCreateProxyWithNonceAddress\",\"outputs\":[{\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"createProxy\",\"outputs\":[{\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"},{\"internalType\":\"contract IProxyCreationCallback\",\"name\":\"callback\",\"type\":\"address\"}],\"name\":\"createProxyWithCallback\",\"outputs\":[{\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"}],\"name\":\"createProxyWithNonce\",\"outputs\":[{\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyCreationCode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyRuntimeCode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Stefan George - \",\"kind\":\"dev\",\"methods\":{\"calculateCreateProxyWithNonceAddress(address,bytes,uint256)\":{\"details\":\"Allows to get the address for a new proxy contact created via `createProxyWithNonce` This method is only meant for address calculation purpose when you use an initializer that would revert, therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\",\"params\":{\"_singleton\":\"Address of singleton contract.\",\"initializer\":\"Payload for message call sent to new proxy contract.\",\"saltNonce\":\"Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\"}},\"createProxy(address,bytes)\":{\"details\":\"Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\",\"params\":{\"data\":\"Payload for message call sent to new proxy contract.\",\"singleton\":\"Address of singleton contract.\"}},\"createProxyWithCallback(address,bytes,uint256,address)\":{\"details\":\"Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\",\"params\":{\"_singleton\":\"Address of singleton contract.\",\"callback\":\"Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.\",\"initializer\":\"Payload for message call sent to new proxy contract.\",\"saltNonce\":\"Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\"}},\"createProxyWithNonce(address,bytes,uint256)\":{\"details\":\"Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\",\"params\":{\"_singleton\":\"Address of singleton contract.\",\"initializer\":\"Payload for message call sent to new proxy contract.\",\"saltNonce\":\"Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\"}},\"proxyCreationCode()\":{\"details\":\"Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.\"},\"proxyRuntimeCode()\":{\"details\":\"Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.\"}},\"title\":\"Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\":\"GnosisSafeProxyFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\\n/// @author Richard Meissner - \\ninterface IProxy {\\n function masterCopy() external view returns (address);\\n}\\n\\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafeProxy {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\\n address internal singleton;\\n\\n /// @dev Constructor function sets address of singleton contract.\\n /// @param _singleton Singleton address.\\n constructor(address _singleton) {\\n require(_singleton != address(0), \\\"Invalid singleton address provided\\\");\\n singleton = _singleton;\\n }\\n\\n /// @dev Fallback function forwards all transactions and returns all received return data.\\n fallback() external payable {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\\n // 0xa619486e == keccak(\\\"masterCopy()\\\"). The value is right padded to 32-bytes with 0s\\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\\n mstore(0, _singleton)\\n return(0, 0x20)\\n }\\n calldatacopy(0, 0, calldatasize())\\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if eq(success, 0) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3bfdd453d9f896f7029d15bcafd11886957b320ad1764309d9f74fa059715249\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./GnosisSafeProxy.sol\\\";\\nimport \\\"./IProxyCreationCallback.sol\\\";\\n\\n/// @title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n/// @author Stefan George - \\ncontract GnosisSafeProxyFactory {\\n event ProxyCreation(GnosisSafeProxy proxy, address singleton);\\n\\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n /// @param singleton Address of singleton contract.\\n /// @param data Payload for message call sent to new proxy contract.\\n function createProxy(address singleton, bytes memory data) public returns (GnosisSafeProxy proxy) {\\n proxy = new GnosisSafeProxy(singleton);\\n if (data.length > 0)\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n if eq(call(gas(), proxy, 0, add(data, 0x20), mload(data), 0, 0), 0) {\\n revert(0, 0)\\n }\\n }\\n emit ProxyCreation(proxy, singleton);\\n }\\n\\n /// @dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.\\n function proxyRuntimeCode() public pure returns (bytes memory) {\\n return type(GnosisSafeProxy).runtimeCode;\\n }\\n\\n /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.\\n function proxyCreationCode() public pure returns (bytes memory) {\\n return type(GnosisSafeProxy).creationCode;\\n }\\n\\n /// @dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.\\n /// This method is only meant as an utility to be called from other methods\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function deployProxyWithNonce(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce\\n ) internal returns (GnosisSafeProxy proxy) {\\n // If the initializer changes the proxy address should change too. Hashing the initializer data is cheaper than just concatinating it\\n bytes32 salt = keccak256(abi.encodePacked(keccak256(initializer), saltNonce));\\n bytes memory deploymentData = abi.encodePacked(type(GnosisSafeProxy).creationCode, uint256(uint160(_singleton)));\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)\\n }\\n require(address(proxy) != address(0), \\\"Create2 call failed\\\");\\n }\\n\\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function createProxyWithNonce(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce\\n ) public returns (GnosisSafeProxy proxy) {\\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\\n if (initializer.length > 0)\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n if eq(call(gas(), proxy, 0, add(initializer, 0x20), mload(initializer), 0, 0), 0) {\\n revert(0, 0)\\n }\\n }\\n emit ProxyCreation(proxy, _singleton);\\n }\\n\\n /// @dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n /// @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.\\n function createProxyWithCallback(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce,\\n IProxyCreationCallback callback\\n ) public returns (GnosisSafeProxy proxy) {\\n uint256 saltNonceWithCallback = uint256(keccak256(abi.encodePacked(saltNonce, callback)));\\n proxy = createProxyWithNonce(_singleton, initializer, saltNonceWithCallback);\\n if (address(callback) != address(0)) callback.proxyCreated(proxy, _singleton, initializer, saltNonce);\\n }\\n\\n /// @dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`\\n /// This method is only meant for address calculation purpose when you use an initializer that would revert,\\n /// therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function calculateCreateProxyWithNonceAddress(\\n address _singleton,\\n bytes calldata initializer,\\n uint256 saltNonce\\n ) external returns (GnosisSafeProxy proxy) {\\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\\n revert(string(abi.encodePacked(proxy)));\\n }\\n}\\n\",\"keccak256\":\"0x187c6f84c71b432da6721c1b81cebfbb9c37c0cc15ebd8de5a14ff7ec6db2d9e\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"./GnosisSafeProxy.sol\\\";\\n\\ninterface IProxyCreationCallback {\\n function proxyCreated(\\n GnosisSafeProxy proxy,\\n address _singleton,\\n bytes calldata initializer,\\n uint256 saltNonce\\n ) external;\\n}\\n\",\"keccak256\":\"0x51a9ce914a6a943651c803541e44218a7ed0a2f98a94d55df66b173b5a11e365\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol":{"IProxyCreationCallback":{"abi":[{"inputs":[{"internalType":"contract GnosisSafeProxy","name":"proxy","type":"address"},{"internalType":"address","name":"_singleton","type":"address"},{"internalType":"bytes","name":"initializer","type":"bytes"},{"internalType":"uint256","name":"saltNonce","type":"uint256"}],"name":"proxyCreated","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"proxyCreated(address,address,bytes,uint256)":"1e52b518"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract GnosisSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"}],\"name\":\"proxyCreated\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol\":\"IProxyCreationCallback\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\\n/// @author Richard Meissner - \\ninterface IProxy {\\n function masterCopy() external view returns (address);\\n}\\n\\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafeProxy {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\\n address internal singleton;\\n\\n /// @dev Constructor function sets address of singleton contract.\\n /// @param _singleton Singleton address.\\n constructor(address _singleton) {\\n require(_singleton != address(0), \\\"Invalid singleton address provided\\\");\\n singleton = _singleton;\\n }\\n\\n /// @dev Fallback function forwards all transactions and returns all received return data.\\n fallback() external payable {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\\n // 0xa619486e == keccak(\\\"masterCopy()\\\"). The value is right padded to 32-bytes with 0s\\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\\n mstore(0, _singleton)\\n return(0, 0x20)\\n }\\n calldatacopy(0, 0, calldatasize())\\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if eq(success, 0) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3bfdd453d9f896f7029d15bcafd11886957b320ad1764309d9f74fa059715249\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"./GnosisSafeProxy.sol\\\";\\n\\ninterface IProxyCreationCallback {\\n function proxyCreated(\\n GnosisSafeProxy proxy,\\n address _singleton,\\n bytes calldata initializer,\\n uint256 saltNonce\\n ) external;\\n}\\n\",\"keccak256\":\"0x51a9ce914a6a943651c803541e44218a7ed0a2f98a94d55df66b173b5a11e365\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/access/Ownable.sol":{"Ownable":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.","kind":"dev","methods":{"constructor":{"details":"Initializes the contract setting the deployer as the initial owner."},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the contract setting the deployer as the initial owner.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/access/Ownable.sol\":\"Ownable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"@openzeppelin/contracts/access/Ownable.sol:Ownable","label":"_owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/interfaces/IERC1271.sol":{"IERC1271":{"abi":[{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Interface of the ERC1271 standard signature validation method for contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. _Available since v4.1._","kind":"dev","methods":{"isValidSignature(bytes32,bytes)":{"details":"Should return whether the signature provided is valid for the provided data","params":{"hash":"Hash of the data to be signed","signature":"Signature byte array associated with _data"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isValidSignature(bytes32,bytes)":"1626ba7e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC1271 standard signature validation method for contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. _Available since v4.1._\",\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes32,bytes)\":{\"details\":\"Should return whether the signature provided is valid for the provided data\",\"params\":{\"hash\":\"Hash of the data to be signed\",\"signature\":\"Signature byte array associated with _data\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/interfaces/IERC1271.sol\":\"IERC1271\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"IERC1822Proxiable":{"abi":[{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.","kind":"dev","methods":{"proxiableUUID()":{"details":"Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"proxiableUUID()":"52d1902d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.\",\"kind\":\"dev\",\"methods\":{\"proxiableUUID()\":{\"details\":\"Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":\"IERC1822Proxiable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"ERC1967Proxy":{"abi":[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.","kind":"dev","methods":{"constructor":{"details":"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity constructor."}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_2981":{"entryPoint":null,"id":2981,"parameterSlots":2,"returnSlots":0},"@_revert_5128":{"entryPoint":693,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":215,"id":3050,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":53,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":107,"id":3065,"parameterSlots":1,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":171,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":425,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":561,"id":5258,"parameterSlots":1,"returnSlots":1},"@isContract_4817":{"entryPoint":546,"id":4817,"parameterSlots":1,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":564,"id":5084,"parameterSlots":4,"returnSlots":1},"abi_decode_tuple_t_addresst_bytes_memory_ptr_fromMemory":{"entryPoint":801,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":1007,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":1035,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":757,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x41":{"entryPoint":735,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2900:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:95:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"70:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"75:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"66:3:111"},"nodeType":"YulFunctionCall","src":"66:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:111"},"nodeType":"YulFunctionCall","src":"56:31:111"},"nodeType":"YulExpressionStatement","src":"56:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"103:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"106:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"96:6:111"},"nodeType":"YulFunctionCall","src":"96:15:111"},"nodeType":"YulExpressionStatement","src":"96:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"127:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"130:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"120:6:111"},"nodeType":"YulFunctionCall","src":"120:15:111"},"nodeType":"YulExpressionStatement","src":"120:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:127:111"},{"body":{"nodeType":"YulBlock","src":"199:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"209:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"218:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"213:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"278:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"303:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"308:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"322:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"327:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"318:3:111"},"nodeType":"YulFunctionCall","src":"318:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"312:5:111"},"nodeType":"YulFunctionCall","src":"312:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"292:6:111"},"nodeType":"YulFunctionCall","src":"292:39:111"},"nodeType":"YulExpressionStatement","src":"292:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"239:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"242:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"236:2:111"},"nodeType":"YulFunctionCall","src":"236:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"250:19:111","statements":[{"nodeType":"YulAssignment","src":"252:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"261:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"264:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"257:3:111"},"nodeType":"YulFunctionCall","src":"257:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"252:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"232:3:111","statements":[]},"src":"228:113:111"},{"body":{"nodeType":"YulBlock","src":"367:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"380:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"385:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"376:3:111"},"nodeType":"YulFunctionCall","src":"376:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"394:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"369:6:111"},"nodeType":"YulFunctionCall","src":"369:27:111"},"nodeType":"YulExpressionStatement","src":"369:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"356:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"359:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"353:2:111"},"nodeType":"YulFunctionCall","src":"353:13:111"},"nodeType":"YulIf","src":"350:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"177:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"182:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"187:6:111","type":""}],"src":"146:258:111"},{"body":{"nodeType":"YulBlock","src":"516:943:111","statements":[{"body":{"nodeType":"YulBlock","src":"562:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"571:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"574:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"564:6:111"},"nodeType":"YulFunctionCall","src":"564:12:111"},"nodeType":"YulExpressionStatement","src":"564:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"537:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"546:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"533:3:111"},"nodeType":"YulFunctionCall","src":"533:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"558:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"529:3:111"},"nodeType":"YulFunctionCall","src":"529:32:111"},"nodeType":"YulIf","src":"526:52:111"},{"nodeType":"YulVariableDeclaration","src":"587:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"606:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"600:5:111"},"nodeType":"YulFunctionCall","src":"600:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"591:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"679:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"688:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"691:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"681:6:111"},"nodeType":"YulFunctionCall","src":"681:12:111"},"nodeType":"YulExpressionStatement","src":"681:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"638:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"649:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"664:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"669:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"660:3:111"},"nodeType":"YulFunctionCall","src":"660:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"673:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"656:3:111"},"nodeType":"YulFunctionCall","src":"656:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"645:3:111"},"nodeType":"YulFunctionCall","src":"645:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"635:2:111"},"nodeType":"YulFunctionCall","src":"635:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"628:6:111"},"nodeType":"YulFunctionCall","src":"628:50:111"},"nodeType":"YulIf","src":"625:70:111"},{"nodeType":"YulAssignment","src":"704:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"714:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"704:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"728:39:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"752:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"763:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"748:3:111"},"nodeType":"YulFunctionCall","src":"748:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"742:5:111"},"nodeType":"YulFunctionCall","src":"742:25:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"732:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"776:28:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"794:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"798:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"790:3:111"},"nodeType":"YulFunctionCall","src":"790:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"786:3:111"},"nodeType":"YulFunctionCall","src":"786:18:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"780:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"831:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"840:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"843:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"833:6:111"},"nodeType":"YulFunctionCall","src":"833:12:111"},"nodeType":"YulExpressionStatement","src":"833:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"819:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"827:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"816:2:111"},"nodeType":"YulFunctionCall","src":"816:14:111"},"nodeType":"YulIf","src":"813:34:111"},{"nodeType":"YulVariableDeclaration","src":"856:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"870:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"881:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"866:3:111"},"nodeType":"YulFunctionCall","src":"866:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"860:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"936:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"945:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"948:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"938:6:111"},"nodeType":"YulFunctionCall","src":"938:12:111"},"nodeType":"YulExpressionStatement","src":"938:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"915:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"919:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"911:3:111"},"nodeType":"YulFunctionCall","src":"911:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"926:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"907:3:111"},"nodeType":"YulFunctionCall","src":"907:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"900:6:111"},"nodeType":"YulFunctionCall","src":"900:35:111"},"nodeType":"YulIf","src":"897:55:111"},{"nodeType":"YulVariableDeclaration","src":"961:19:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"977:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"971:5:111"},"nodeType":"YulFunctionCall","src":"971:9:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"965:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1003:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1005:16:111"},"nodeType":"YulFunctionCall","src":"1005:18:111"},"nodeType":"YulExpressionStatement","src":"1005:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"995:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"999:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"992:2:111"},"nodeType":"YulFunctionCall","src":"992:10:111"},"nodeType":"YulIf","src":"989:36:111"},{"nodeType":"YulVariableDeclaration","src":"1034:17:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1048:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1044:3:111"},"nodeType":"YulFunctionCall","src":"1044:7:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"1038:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1060:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1080:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1074:5:111"},"nodeType":"YulFunctionCall","src":"1074:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1064:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1092:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1114:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1138:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1142:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1134:3:111"},"nodeType":"YulFunctionCall","src":"1134:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1149:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1130:3:111"},"nodeType":"YulFunctionCall","src":"1130:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1154:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1126:3:111"},"nodeType":"YulFunctionCall","src":"1126:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1159:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1122:3:111"},"nodeType":"YulFunctionCall","src":"1122:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1110:3:111"},"nodeType":"YulFunctionCall","src":"1110:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1096:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1222:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1224:16:111"},"nodeType":"YulFunctionCall","src":"1224:18:111"},"nodeType":"YulExpressionStatement","src":"1224:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1181:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1193:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1178:2:111"},"nodeType":"YulFunctionCall","src":"1178:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1201:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1213:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1198:2:111"},"nodeType":"YulFunctionCall","src":"1198:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1175:2:111"},"nodeType":"YulFunctionCall","src":"1175:46:111"},"nodeType":"YulIf","src":"1172:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1260:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1264:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1253:6:111"},"nodeType":"YulFunctionCall","src":"1253:22:111"},"nodeType":"YulExpressionStatement","src":"1253:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1291:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1299:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1284:6:111"},"nodeType":"YulFunctionCall","src":"1284:18:111"},"nodeType":"YulExpressionStatement","src":"1284:18:111"},{"body":{"nodeType":"YulBlock","src":"1348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1350:6:111"},"nodeType":"YulFunctionCall","src":"1350:12:111"},"nodeType":"YulExpressionStatement","src":"1350:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1325:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1329:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1321:3:111"},"nodeType":"YulFunctionCall","src":"1321:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"1334:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1317:3:111"},"nodeType":"YulFunctionCall","src":"1317:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1339:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1314:2:111"},"nodeType":"YulFunctionCall","src":"1314:33:111"},"nodeType":"YulIf","src":"1311:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1399:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1403:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1395:3:111"},"nodeType":"YulFunctionCall","src":"1395:11:111"},{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1412:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1420:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1408:3:111"},"nodeType":"YulFunctionCall","src":"1408:15:111"},{"name":"_3","nodeType":"YulIdentifier","src":"1425:2:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1373:21:111"},"nodeType":"YulFunctionCall","src":"1373:55:111"},"nodeType":"YulExpressionStatement","src":"1373:55:111"},{"nodeType":"YulAssignment","src":"1437:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1447:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1437:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"474:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"485:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"497:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"505:6:111","type":""}],"src":"409:1050:111"},{"body":{"nodeType":"YulBlock","src":"1638:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1655:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1666:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1648:6:111"},"nodeType":"YulFunctionCall","src":"1648:21:111"},"nodeType":"YulExpressionStatement","src":"1648:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1689:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1700:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1685:3:111"},"nodeType":"YulFunctionCall","src":"1685:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"1705:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1678:6:111"},"nodeType":"YulFunctionCall","src":"1678:30:111"},"nodeType":"YulExpressionStatement","src":"1678:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1728:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1739:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1724:3:111"},"nodeType":"YulFunctionCall","src":"1724:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"1744:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1717:6:111"},"nodeType":"YulFunctionCall","src":"1717:62:111"},"nodeType":"YulExpressionStatement","src":"1717:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1799:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1810:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1795:3:111"},"nodeType":"YulFunctionCall","src":"1795:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"1815:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1788:6:111"},"nodeType":"YulFunctionCall","src":"1788:43:111"},"nodeType":"YulExpressionStatement","src":"1788:43:111"},{"nodeType":"YulAssignment","src":"1840:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1852:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1863:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1848:3:111"},"nodeType":"YulFunctionCall","src":"1848:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1840:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1615:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1629:4:111","type":""}],"src":"1464:409:111"},{"body":{"nodeType":"YulBlock","src":"2015:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2025:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2045:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2039:5:111"},"nodeType":"YulFunctionCall","src":"2039:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"2029:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2087:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2095:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2083:3:111"},"nodeType":"YulFunctionCall","src":"2083:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"2102:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2107:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"2061:21:111"},"nodeType":"YulFunctionCall","src":"2061:53:111"},"nodeType":"YulExpressionStatement","src":"2061:53:111"},{"nodeType":"YulAssignment","src":"2123:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2134:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2139:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2130:3:111"},"nodeType":"YulFunctionCall","src":"2130:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"2123:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"1991:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1996:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"2007:3:111","type":""}],"src":"1878:274:111"},{"body":{"nodeType":"YulBlock","src":"2331:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2359:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2341:6:111"},"nodeType":"YulFunctionCall","src":"2341:21:111"},"nodeType":"YulExpressionStatement","src":"2341:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2393:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2378:3:111"},"nodeType":"YulFunctionCall","src":"2378:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2398:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2371:6:111"},"nodeType":"YulFunctionCall","src":"2371:30:111"},"nodeType":"YulExpressionStatement","src":"2371:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2421:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2432:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"2437:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2410:6:111"},"nodeType":"YulFunctionCall","src":"2410:59:111"},"nodeType":"YulExpressionStatement","src":"2410:59:111"},{"nodeType":"YulAssignment","src":"2478:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2490:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2501:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2486:3:111"},"nodeType":"YulFunctionCall","src":"2486:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2478:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2308:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2322:4:111","type":""}],"src":"2157:353:111"},{"body":{"nodeType":"YulBlock","src":"2636:262:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2653:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2664:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2646:6:111"},"nodeType":"YulFunctionCall","src":"2646:21:111"},"nodeType":"YulExpressionStatement","src":"2646:21:111"},{"nodeType":"YulVariableDeclaration","src":"2676:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2696:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2690:5:111"},"nodeType":"YulFunctionCall","src":"2690:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"2680:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2734:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2719:3:111"},"nodeType":"YulFunctionCall","src":"2719:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"2739:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2712:6:111"},"nodeType":"YulFunctionCall","src":"2712:34:111"},"nodeType":"YulExpressionStatement","src":"2712:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2781:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2789:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2777:3:111"},"nodeType":"YulFunctionCall","src":"2777:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2809:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2794:3:111"},"nodeType":"YulFunctionCall","src":"2794:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"2814:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"2755:21:111"},"nodeType":"YulFunctionCall","src":"2755:66:111"},"nodeType":"YulExpressionStatement","src":"2755:66:111"},{"nodeType":"YulAssignment","src":"2830:62:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2846:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2865:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2873:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2861:3:111"},"nodeType":"YulFunctionCall","src":"2861:15:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2882:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2878:3:111"},"nodeType":"YulFunctionCall","src":"2878:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2857:3:111"},"nodeType":"YulFunctionCall","src":"2857:29:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2842:3:111"},"nodeType":"YulFunctionCall","src":"2842:45:111"},{"kind":"number","nodeType":"YulLiteral","src":"2889:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2838:3:111"},"nodeType":"YulFunctionCall","src":"2838:54:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2830:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2605:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2616:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2627:4:111","type":""}],"src":"2515:383:111"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n let offset := mload(add(headStart, 32))\n let _1 := sub(shl(64, 1), 1)\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := not(31)\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n copy_memory_to_memory(add(_2, 32), add(memPtr, 32), _3)\n value1 := memPtr\n }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C65640000 ","sourceMap":"567:723:27:-:0;;;958:112;;;;;;;;;;;;;;;;;;:::i;:::-;1024:39;1042:6;1050:5;1057;1024:17;:39::i;:::-;958:112;;567:723;;2183:295:28;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;;;;;:53;;:::i;:::-;;2360:112;2183:295;;;:::o;1897:152::-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;-1:-1:-1;;;;;2015:27:28;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6576:84;6469:198;-1:-1:-1;;;6469:198:42:o;1532:259:28:-;1613:37;1632:17;1613:18;;;;;:37;;:::i;:::-;1605:95;;;;-1:-1:-1;;;1605:95:28;;1666:2:111;1605:95:28;;;1648:21:111;1705:2;1685:18;;;1678:30;1744:34;1724:18;;;1717:62;-1:-1:-1;;;1795:18:111;;;1788:43;1848:19;;1605:95:28;;;;;;;;;1767:17;1710:48;1030:66;1737:20;;1710:26;;;;;:48;;:::i;:::-;:74;;-1:-1:-1;;;;;;1710:74:28;-1:-1:-1;;;;;1710:74:28;;;;;;;;;;-1:-1:-1;1532:259:28:o;6853:325:42:-;6994:12;7019;7033:23;7060:6;-1:-1:-1;;;;;7060:19:42;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7018:67:42;;-1:-1:-1;7018:67:42;-1:-1:-1;7102:69:42;7129:6;7018:67;;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;1175:320::-;-1:-1:-1;;;;;1465:19:42;;:23;;;1175:320::o;1614:190:45:-;1784:4;1614:190::o;7466:628:42:-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:42;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;2359:2:111;7908:60:42;;;2341:21:111;2398:2;2378:18;;;2371:30;2437:31;2417:18;;;2410:59;2486:18;;7908:60:42;2157:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:127:111:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:258;218:1;228:113;242:6;239:1;236:13;228:113;;;318:11;;;312:18;299:11;;;292:39;264:2;257:10;228:113;;;359:6;356:1;353:13;350:48;;;-1:-1:-1;;394:1:111;376:16;;369:27;146:258::o;409:1050::-;497:6;505;558:2;546:9;537:7;533:23;529:32;526:52;;;574:1;571;564:12;526:52;600:16;;-1:-1:-1;;;;;645:31:111;;635:42;;625:70;;691:1;688;681:12;625:70;763:2;748:18;;742:25;714:5;;-1:-1:-1;;;;;;816:14:111;;;813:34;;;843:1;840;833:12;813:34;881:6;870:9;866:22;856:32;;926:7;919:4;915:2;911:13;907:27;897:55;;948:1;945;938:12;897:55;977:2;971:9;999:2;995;992:10;989:36;;;1005:18;;:::i;:::-;1080:2;1074:9;1048:2;1134:13;;-1:-1:-1;;1130:22:111;;;1154:2;1126:31;1122:40;1110:53;;;1178:18;;;1198:22;;;1175:46;1172:72;;;1224:18;;:::i;:::-;1264:10;1260:2;1253:22;1299:2;1291:6;1284:18;1339:7;1334:2;1329;1325;1321:11;1317:20;1314:33;1311:53;;;1360:1;1357;1350:12;1311:53;1373:55;1425:2;1420;1412:6;1408:15;1403:2;1399;1395:11;1373:55;:::i;:::-;1447:6;1437:16;;;;;;;409:1050;;;;;:::o;1878:274::-;2007:3;2045:6;2039:13;2061:53;2107:6;2102:3;2095:4;2087:6;2083:17;2061:53;:::i;:::-;2130:16;;;;;1878:274;-1:-1:-1;;1878:274:111:o;2515:383::-;2664:2;2653:9;2646:21;2627:4;2696:6;2690:13;2739:6;2734:2;2723:9;2719:18;2712:34;2755:66;2814:6;2809:2;2798:9;2794:18;2789:2;2781:6;2777:15;2755:66;:::i;:::-;2882:2;2861:15;-1:-1:-1;;2857:29:111;2842:45;;;;2889:2;2838:54;;2515:383;-1:-1:-1;;2515:383:111:o;:::-;567:723:27;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_3350":{"entryPoint":null,"id":3350,"parameterSlots":0,"returnSlots":0},"@_3358":{"entryPoint":null,"id":3358,"parameterSlots":0,"returnSlots":0},"@_beforeFallback_3363":{"entryPoint":null,"id":3363,"parameterSlots":0,"returnSlots":0},"@_delegate_3323":{"entryPoint":185,"id":3323,"parameterSlots":1,"returnSlots":0},"@_fallback_3342":{"entryPoint":23,"id":3342,"parameterSlots":0,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_implementation_2993":{"entryPoint":116,"id":2993,"parameterSlots":0,"returnSlots":1},"@_revert_5128":{"entryPoint":527,"id":5128,"parameterSlots":2,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":41,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":221,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":113,"id":5258,"parameterSlots":1,"returnSlots":1},"@isContract_4817":{"entryPoint":85,"id":4817,"parameterSlots":1,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":354,"id":5084,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":643,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":671,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":595,"id":null,"parameterSlots":3,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1358:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"67:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"77:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"86:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"81:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"146:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"171:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"176:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"167:3:111"},"nodeType":"YulFunctionCall","src":"167:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"190:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"195:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"186:3:111"},"nodeType":"YulFunctionCall","src":"186:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"180:5:111"},"nodeType":"YulFunctionCall","src":"180:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:39:111"},"nodeType":"YulExpressionStatement","src":"160:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"107:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"110:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"104:2:111"},"nodeType":"YulFunctionCall","src":"104:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"118:19:111","statements":[{"nodeType":"YulAssignment","src":"120:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"129:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"132:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"125:3:111"},"nodeType":"YulFunctionCall","src":"125:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"120:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"100:3:111","statements":[]},"src":"96:113:111"},{"body":{"nodeType":"YulBlock","src":"235:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"248:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"253:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"244:3:111"},"nodeType":"YulFunctionCall","src":"244:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"262:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"237:6:111"},"nodeType":"YulFunctionCall","src":"237:27:111"},"nodeType":"YulExpressionStatement","src":"237:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"224:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"227:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"221:2:111"},"nodeType":"YulFunctionCall","src":"221:13:111"},"nodeType":"YulIf","src":"218:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"45:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"50:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"55:6:111","type":""}],"src":"14:258:111"},{"body":{"nodeType":"YulBlock","src":"414:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"424:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"438:5:111"},"nodeType":"YulFunctionCall","src":"438:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"428:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"486:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"494:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"482:3:111"},"nodeType":"YulFunctionCall","src":"482:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"501:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"506:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"460:21:111"},"nodeType":"YulFunctionCall","src":"460:53:111"},"nodeType":"YulExpressionStatement","src":"460:53:111"},{"nodeType":"YulAssignment","src":"522:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"533:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"538:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"529:3:111"},"nodeType":"YulFunctionCall","src":"529:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"522:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"390:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"395:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"406:3:111","type":""}],"src":"277:274:111"},{"body":{"nodeType":"YulBlock","src":"730:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"747:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"758:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"740:6:111"},"nodeType":"YulFunctionCall","src":"740:21:111"},"nodeType":"YulExpressionStatement","src":"740:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"781:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"792:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"777:3:111"},"nodeType":"YulFunctionCall","src":"777:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"797:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"770:6:111"},"nodeType":"YulFunctionCall","src":"770:30:111"},"nodeType":"YulExpressionStatement","src":"770:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"820:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"831:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"816:3:111"},"nodeType":"YulFunctionCall","src":"816:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"836:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"809:6:111"},"nodeType":"YulFunctionCall","src":"809:59:111"},"nodeType":"YulExpressionStatement","src":"809:59:111"},{"nodeType":"YulAssignment","src":"877:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"889:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"900:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"885:3:111"},"nodeType":"YulFunctionCall","src":"885:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"877:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"707:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"721:4:111","type":""}],"src":"556:353:111"},{"body":{"nodeType":"YulBlock","src":"1035:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1052:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1063:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1045:6:111"},"nodeType":"YulFunctionCall","src":"1045:21:111"},"nodeType":"YulExpressionStatement","src":"1045:21:111"},{"nodeType":"YulVariableDeclaration","src":"1075:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1095:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1089:5:111"},"nodeType":"YulFunctionCall","src":"1089:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1079:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1122:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1133:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1118:3:111"},"nodeType":"YulFunctionCall","src":"1118:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1138:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1111:6:111"},"nodeType":"YulFunctionCall","src":"1111:34:111"},"nodeType":"YulExpressionStatement","src":"1111:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1180:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1188:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1176:3:111"},"nodeType":"YulFunctionCall","src":"1176:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1197:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1208:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1193:3:111"},"nodeType":"YulFunctionCall","src":"1193:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1213:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1154:21:111"},"nodeType":"YulFunctionCall","src":"1154:66:111"},"nodeType":"YulExpressionStatement","src":"1154:66:111"},{"nodeType":"YulAssignment","src":"1229:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1245:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1264:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1272:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1260:3:111"},"nodeType":"YulFunctionCall","src":"1260:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1277:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1256:3:111"},"nodeType":"YulFunctionCall","src":"1256:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1241:3:111"},"nodeType":"YulFunctionCall","src":"1241:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"1347:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1237:3:111"},"nodeType":"YulFunctionCall","src":"1237:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1229:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1004:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1015:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1026:4:111","type":""}],"src":"914:442:111"}]},"contents":"{\n { }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"567:723:27:-:0;;;;;;2898:11:29;:9;:11::i;:::-;567:723:27;;2675:11:29;2322:110;2397:28;2407:17;:15;:17::i;:::-;2397:9;:28::i;:::-;2322:110::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6576:84;6469:198;-1:-1:-1;;;6469:198:42:o;1175:320::-;1465:19;;;:23;;;1175:320::o;1614:190:45:-;1784:4;1614:190::o;1148:140:27:-;1215:12;1246:35;1030:66:28;1380:54;;;;1301:140;1246:35:27;1239:42;;1148:140;:::o;948:895:29:-;1286:14;1283:1;1280;1267:34;1500:1;1497;1481:14;1478:1;1462:14;1455:5;1442:60;1576:16;1573:1;1570;1555:38;1614:6;1681:66;;;;1796:16;1793:1;1786:27;1681:66;1716:16;1713:1;1706:27;6853:325:42;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;;;;758:2:111;7908:60:42;;;740:21:111;797:2;777:18;;;770:30;836:31;816:18;;;809:59;885:18;;7908:60:42;;;;;;;;;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;14:258:111:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;262:1;253:6;248:3;244:16;237:27;218:48;;14:258;;;:::o;277:274::-;406:3;444:6;438:13;460:53;506:6;501:3;494:4;486:6;482:17;460:53;:::i;:::-;529:16;;;;;277:274;-1:-1:-1;;277:274:111:o;914:442::-;1063:2;1052:9;1045:21;1026:4;1095:6;1089:13;1138:6;1133:2;1122:9;1118:18;1111:34;1154:66;1213:6;1208:2;1197:9;1193:18;1188:2;1180:6;1176:15;1154:66;:::i;:::-;1272:2;1260:15;1277:66;1256:88;1241:104;;;;1347:2;1237:113;;914:442;-1:-1:-1;;914:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"169000","executionCost":"infinite","totalCost":"infinite"},"external":{"":"infinite"},"internal":{"_implementation()":"2144"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"ERC1967Upgrade":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}],"devdoc":{"custom:oz-upgrades-unsafe-allow":"delegatecall","details":"This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._","events":{"AdminChanged(address,address)":{"details":"Emitted when the admin account has changed."},"BeaconUpgraded(address)":{"details":"Emitted when the beacon is upgraded."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{},"stateVariables":{"_ADMIN_SLOT":{"details":"Storage slot with the admin of the contract. This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is validated in the constructor."},"_BEACON_SLOT":{"details":"The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor."},"_IMPLEMENTATION_SLOT":{"details":"Storage slot with the address of the current implementation. This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is validated in the constructor."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"}],\"devdoc\":{\"custom:oz-upgrades-unsafe-allow\":\"delegatecall\",\"details\":\"This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_ADMIN_SLOT\":{\"details\":\"Storage slot with the admin of the contract. This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is validated in the constructor.\"},\"_BEACON_SLOT\":{\"details\":\"The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\"},\"_IMPLEMENTATION_SLOT\":{\"details\":\"Storage slot with the address of the current implementation. This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is validated in the constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":\"ERC1967Upgrade\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/Proxy.sol":{"Proxy":{"abi":[{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"IBeacon":{"abi":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This is the interface that {BeaconProxy} expects of its beacon.","kind":"dev","methods":{"implementation()":{"details":"Must return an address that can be used as a delegate call target. {BeaconProxy} will check that this address is a contract."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"implementation()":"5c60da1b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the interface that {BeaconProxy} expects of its beacon.\",\"kind\":\"dev\",\"methods\":{\"implementation()\":{\"details\":\"Must return an address that can be used as a delegate call target. {BeaconProxy} will check that this address is a contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":\"IBeacon\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"Initializable":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"}],"devdoc":{"custom:oz-upgrades-unsafe-allow":"constructor constructor() { _disableInitializers(); } ``` ====","details":"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. The initialization functions use a version number. Once a version number is used, it is consumed and cannot be reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in case an upgrade adds a module that needs to be initialized. For example: [.hljs-theme-light.nopadding] ``` contract MyToken is ERC20Upgradeable { function initialize() initializer public { __ERC20_init(\"MyToken\", \"MTK\"); } } contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { function initializeV2() reinitializer(2) public { __ERC20Permit_init(\"MyToken\"); } } ``` TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. [CAUTION] ==== Avoid leaving a contract uninitialized. An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: [.hljs-theme-light.nopadding] ```","events":{"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{},"stateVariables":{"_initialized":{"custom:oz-retyped-from":"bool","details":"Indicates that the contract has been initialized."},"_initializing":{"details":"Indicates that the contract is in the process of being initialized."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"}],\"devdoc\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor constructor() { _disableInitializers(); } ``` ====\",\"details\":\"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. The initialization functions use a version number. Once a version number is used, it is consumed and cannot be reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in case an upgrade adds a module that needs to be initialized. For example: [.hljs-theme-light.nopadding] ``` contract MyToken is ERC20Upgradeable { function initialize() initializer public { __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\"); } } contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { function initializeV2() reinitializer(2) public { __ERC20Permit_init(\\\"MyToken\\\"); } } ``` TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. [CAUTION] ==== Avoid leaving a contract uninitialized. An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: [.hljs-theme-light.nopadding] ```\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_initialized\":{\"custom:oz-retyped-from\":\"bool\",\"details\":\"Indicates that the contract has been initialized.\"},\"_initializing\":{\"details\":\"Indicates that the contract is in the process of being initialized.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":\"Initializable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"@openzeppelin/contracts/proxy/utils/Initializable.sol:Initializable","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"@openzeppelin/contracts/proxy/utils/Initializable.sol:Initializable","label":"_initializing","offset":1,"slot":"0","type":"t_bool"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"UUPSUpgradeable":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing `UUPSUpgradeable` with a custom implementation of upgrades. The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. _Available since v4.1._","kind":"dev","methods":{"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"stateVariables":{"__self":{"custom:oz-upgrades-unsafe-allow":"state-variable-immutable state-variable-assignment"}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"proxiableUUID()":"52d1902d","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing `UUPSUpgradeable` with a custom implementation of upgrades. The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. _Available since v4.1._\",\"kind\":\"dev\",\"methods\":{\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"__self\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable state-variable-assignment\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":\"UUPSUpgradeable\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"ReentrancyGuard":{"abi":[],"devdoc":{"details":"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3670,"contract":"@openzeppelin/contracts/security/ReentrancyGuard.sol:ReentrancyGuard","label":"_status","offset":0,"slot":"0","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol":{"IERC1155Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"_Available since v3.1._","kind":"dev","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81, or its own function selector).","params":{"data":"Additional data with no specified format","from":"The address which previously owned the token","ids":"An array containing ids of each token being transferred (order and length must match values array)","operator":"The address which initiated the batch transfer (i.e. msg.sender)","values":"An array containing amounts of each token being transferred (order and length must match ids array)"},"returns":{"_0":"`bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed"}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61, or its own function selector).","params":{"data":"Additional data with no specified format","from":"The address which previously owned the token","id":"The ID of the token being transferred","operator":"The address which initiated the transfer (i.e. msg.sender)","value":"The amount of tokens being transferred"},"returns":{"_0":"`bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed"}},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"_Available since v3.1._\",\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"ids\":\"An array containing ids of each token being transferred (order and length must match values array)\",\"operator\":\"The address which initiated the batch transfer (i.e. msg.sender)\",\"values\":\"An array containing amounts of each token being transferred (order and length must match ids array)\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"id\":\"The ID of the token being transferred\",\"operator\":\"The address which initiated the transfer (i.e. msg.sender)\",\"value\":\"The amount of tokens being transferred\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":\"IERC1155Receiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"ERC20":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.","kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"constructor":{"details":"Sets the values for {name} and {symbol}. The default value of {decimals} is 18. To select a different value for {decimals} you should overload it. All two of these values are immutable: they can only be set once during construction."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_3799":{"entryPoint":null,"id":3799,"parameterSlots":2,"returnSlots":0},"abi_decode_string_fromMemory":{"entryPoint":112,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory":{"entryPoint":295,"id":null,"parameterSlots":2,"returnSlots":2},"array_dataslot_string_storage":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"clean_up_bytearray_end_slots_string_storage":{"entryPoint":461,"id":null,"parameterSlots":3,"returnSlots":0},"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage":{"entryPoint":544,"id":null,"parameterSlots":2,"returnSlots":0},"extract_byte_array_length":{"entryPoint":401,"id":null,"parameterSlots":1,"returnSlots":1},"extract_used_part_and_set_length_of_short_byte_array":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":90,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:4189:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:95:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"70:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"75:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"66:3:111"},"nodeType":"YulFunctionCall","src":"66:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:111"},"nodeType":"YulFunctionCall","src":"56:31:111"},"nodeType":"YulExpressionStatement","src":"56:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"103:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"106:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"96:6:111"},"nodeType":"YulFunctionCall","src":"96:15:111"},"nodeType":"YulExpressionStatement","src":"96:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"127:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"130:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"120:6:111"},"nodeType":"YulFunctionCall","src":"120:15:111"},"nodeType":"YulExpressionStatement","src":"120:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:127:111"},{"body":{"nodeType":"YulBlock","src":"210:821:111","statements":[{"body":{"nodeType":"YulBlock","src":"259:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"268:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"271:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"261:6:111"},"nodeType":"YulFunctionCall","src":"261:12:111"},"nodeType":"YulExpressionStatement","src":"261:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"238:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"246:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"234:3:111"},"nodeType":"YulFunctionCall","src":"234:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"253:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"230:3:111"},"nodeType":"YulFunctionCall","src":"230:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"223:6:111"},"nodeType":"YulFunctionCall","src":"223:35:111"},"nodeType":"YulIf","src":"220:55:111"},{"nodeType":"YulVariableDeclaration","src":"284:23:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"300:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"294:5:111"},"nodeType":"YulFunctionCall","src":"294:13:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"288:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"316:28:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"334:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"338:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"330:3:111"},"nodeType":"YulFunctionCall","src":"330:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"342:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"326:3:111"},"nodeType":"YulFunctionCall","src":"326:18:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"320:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"367:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"369:16:111"},"nodeType":"YulFunctionCall","src":"369:18:111"},"nodeType":"YulExpressionStatement","src":"369:18:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"359:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"363:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"356:2:111"},"nodeType":"YulFunctionCall","src":"356:10:111"},"nodeType":"YulIf","src":"353:36:111"},{"nodeType":"YulVariableDeclaration","src":"398:17:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"412:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"408:3:111"},"nodeType":"YulFunctionCall","src":"408:7:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"402:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"424:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"438:5:111"},"nodeType":"YulFunctionCall","src":"438:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"428:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"456:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"478:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"502:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"506:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"498:3:111"},"nodeType":"YulFunctionCall","src":"498:13:111"},{"name":"_3","nodeType":"YulIdentifier","src":"513:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"494:3:111"},"nodeType":"YulFunctionCall","src":"494:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"518:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"490:3:111"},"nodeType":"YulFunctionCall","src":"490:31:111"},{"name":"_3","nodeType":"YulIdentifier","src":"523:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"486:3:111"},"nodeType":"YulFunctionCall","src":"486:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"474:3:111"},"nodeType":"YulFunctionCall","src":"474:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"460:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"586:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"588:16:111"},"nodeType":"YulFunctionCall","src":"588:18:111"},"nodeType":"YulExpressionStatement","src":"588:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"545:10:111"},{"name":"_2","nodeType":"YulIdentifier","src":"557:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"542:2:111"},"nodeType":"YulFunctionCall","src":"542:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"565:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"577:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"562:2:111"},"nodeType":"YulFunctionCall","src":"562:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"539:2:111"},"nodeType":"YulFunctionCall","src":"539:46:111"},"nodeType":"YulIf","src":"536:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"624:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"628:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"617:6:111"},"nodeType":"YulFunctionCall","src":"617:22:111"},"nodeType":"YulExpressionStatement","src":"617:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"655:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"663:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"648:6:111"},"nodeType":"YulFunctionCall","src":"648:18:111"},"nodeType":"YulExpressionStatement","src":"648:18:111"},{"nodeType":"YulVariableDeclaration","src":"675:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"685:4:111","type":"","value":"0x20"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"679:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"735:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"744:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"747:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"737:6:111"},"nodeType":"YulFunctionCall","src":"737:12:111"},"nodeType":"YulExpressionStatement","src":"737:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"712:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"720:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"708:3:111"},"nodeType":"YulFunctionCall","src":"708:15:111"},{"name":"_4","nodeType":"YulIdentifier","src":"725:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"704:3:111"},"nodeType":"YulFunctionCall","src":"704:24:111"},{"name":"end","nodeType":"YulIdentifier","src":"730:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"701:2:111"},"nodeType":"YulFunctionCall","src":"701:33:111"},"nodeType":"YulIf","src":"698:53:111"},{"nodeType":"YulVariableDeclaration","src":"760:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"769:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"764:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"825:87:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"854:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"862:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"850:3:111"},"nodeType":"YulFunctionCall","src":"850:14:111"},{"name":"_4","nodeType":"YulIdentifier","src":"866:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"846:3:111"},"nodeType":"YulFunctionCall","src":"846:23:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"885:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"893:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"881:3:111"},"nodeType":"YulFunctionCall","src":"881:14:111"},{"name":"_4","nodeType":"YulIdentifier","src":"897:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"877:3:111"},"nodeType":"YulFunctionCall","src":"877:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"871:5:111"},"nodeType":"YulFunctionCall","src":"871:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"839:6:111"},"nodeType":"YulFunctionCall","src":"839:63:111"},"nodeType":"YulExpressionStatement","src":"839:63:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"790:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"793:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"787:2:111"},"nodeType":"YulFunctionCall","src":"787:9:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"797:19:111","statements":[{"nodeType":"YulAssignment","src":"799:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"808:1:111"},{"name":"_4","nodeType":"YulIdentifier","src":"811:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"804:3:111"},"nodeType":"YulFunctionCall","src":"804:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"799:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"783:3:111","statements":[]},"src":"779:133:111"},{"body":{"nodeType":"YulBlock","src":"942:59:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"971:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"979:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"967:3:111"},"nodeType":"YulFunctionCall","src":"967:15:111"},{"name":"_4","nodeType":"YulIdentifier","src":"984:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"963:3:111"},"nodeType":"YulFunctionCall","src":"963:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"989:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"956:6:111"},"nodeType":"YulFunctionCall","src":"956:35:111"},"nodeType":"YulExpressionStatement","src":"956:35:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"927:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"930:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"924:2:111"},"nodeType":"YulFunctionCall","src":"924:9:111"},"nodeType":"YulIf","src":"921:80:111"},{"nodeType":"YulAssignment","src":"1010:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1019:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"1010:5:111"}]}]},"name":"abi_decode_string_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"184:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"192:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"200:5:111","type":""}],"src":"146:885:111"},{"body":{"nodeType":"YulBlock","src":"1154:444:111","statements":[{"body":{"nodeType":"YulBlock","src":"1200:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1209:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1212:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1202:6:111"},"nodeType":"YulFunctionCall","src":"1202:12:111"},"nodeType":"YulExpressionStatement","src":"1202:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1175:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1184:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1171:3:111"},"nodeType":"YulFunctionCall","src":"1171:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1196:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1167:3:111"},"nodeType":"YulFunctionCall","src":"1167:32:111"},"nodeType":"YulIf","src":"1164:52:111"},{"nodeType":"YulVariableDeclaration","src":"1225:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1245:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1239:5:111"},"nodeType":"YulFunctionCall","src":"1239:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1229:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1264:28:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1282:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"1286:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1278:3:111"},"nodeType":"YulFunctionCall","src":"1278:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1290:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1274:3:111"},"nodeType":"YulFunctionCall","src":"1274:18:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1268:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1319:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1328:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1331:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1321:6:111"},"nodeType":"YulFunctionCall","src":"1321:12:111"},"nodeType":"YulExpressionStatement","src":"1321:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1307:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1315:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1304:2:111"},"nodeType":"YulFunctionCall","src":"1304:14:111"},"nodeType":"YulIf","src":"1301:34:111"},{"nodeType":"YulAssignment","src":"1344:71:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1387:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1398:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1383:3:111"},"nodeType":"YulFunctionCall","src":"1383:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1407:7:111"}],"functionName":{"name":"abi_decode_string_fromMemory","nodeType":"YulIdentifier","src":"1354:28:111"},"nodeType":"YulFunctionCall","src":"1354:61:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1344:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1424:41:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1450:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1461:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1446:3:111"},"nodeType":"YulFunctionCall","src":"1446:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1440:5:111"},"nodeType":"YulFunctionCall","src":"1440:25:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1428:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1494:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1503:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1506:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1496:6:111"},"nodeType":"YulFunctionCall","src":"1496:12:111"},"nodeType":"YulExpressionStatement","src":"1496:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1480:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1490:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1477:2:111"},"nodeType":"YulFunctionCall","src":"1477:16:111"},"nodeType":"YulIf","src":"1474:36:111"},{"nodeType":"YulAssignment","src":"1519:73:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1562:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1573:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1558:3:111"},"nodeType":"YulFunctionCall","src":"1558:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1584:7:111"}],"functionName":{"name":"abi_decode_string_fromMemory","nodeType":"YulIdentifier","src":"1529:28:111"},"nodeType":"YulFunctionCall","src":"1529:63:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1519:6:111"}]}]},"name":"abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1112:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1123:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1135:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1143:6:111","type":""}],"src":"1036:562:111"},{"body":{"nodeType":"YulBlock","src":"1658:325:111","statements":[{"nodeType":"YulAssignment","src":"1668:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1682:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"1685:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1678:3:111"},"nodeType":"YulFunctionCall","src":"1678:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1668:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1699:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1729:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"1735:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1725:3:111"},"nodeType":"YulFunctionCall","src":"1725:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"1703:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1776:31:111","statements":[{"nodeType":"YulAssignment","src":"1778:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1792:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1800:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1788:3:111"},"nodeType":"YulFunctionCall","src":"1788:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1778:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"1756:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1749:6:111"},"nodeType":"YulFunctionCall","src":"1749:26:111"},"nodeType":"YulIf","src":"1746:61:111"},{"body":{"nodeType":"YulBlock","src":"1866:111:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1887:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1894:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"1899:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1890:3:111"},"nodeType":"YulFunctionCall","src":"1890:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1880:6:111"},"nodeType":"YulFunctionCall","src":"1880:31:111"},"nodeType":"YulExpressionStatement","src":"1880:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1931:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1934:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1924:6:111"},"nodeType":"YulFunctionCall","src":"1924:15:111"},"nodeType":"YulExpressionStatement","src":"1924:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1959:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1962:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1952:6:111"},"nodeType":"YulFunctionCall","src":"1952:15:111"},"nodeType":"YulExpressionStatement","src":"1952:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"1822:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1845:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1853:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1842:2:111"},"nodeType":"YulFunctionCall","src":"1842:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1819:2:111"},"nodeType":"YulFunctionCall","src":"1819:38:111"},"nodeType":"YulIf","src":"1816:161:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"1638:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"1647:6:111","type":""}],"src":"1603:380:111"},{"body":{"nodeType":"YulBlock","src":"2044:65:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2061:1:111","type":"","value":"0"},{"name":"ptr","nodeType":"YulIdentifier","src":"2064:3:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2054:6:111"},"nodeType":"YulFunctionCall","src":"2054:14:111"},"nodeType":"YulExpressionStatement","src":"2054:14:111"},{"nodeType":"YulAssignment","src":"2077:26:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2095:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2098:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"2085:9:111"},"nodeType":"YulFunctionCall","src":"2085:18:111"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"2077:4:111"}]}]},"name":"array_dataslot_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"ptr","nodeType":"YulTypedName","src":"2027:3:111","type":""}],"returnVariables":[{"name":"data","nodeType":"YulTypedName","src":"2035:4:111","type":""}],"src":"1988:121:111"},{"body":{"nodeType":"YulBlock","src":"2195:464:111","statements":[{"body":{"nodeType":"YulBlock","src":"2228:425:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2242:11:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2252:1:111","type":"","value":"0"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2246:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2273:2:111"},{"name":"array","nodeType":"YulIdentifier","src":"2277:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2266:6:111"},"nodeType":"YulFunctionCall","src":"2266:17:111"},"nodeType":"YulExpressionStatement","src":"2266:17:111"},{"nodeType":"YulVariableDeclaration","src":"2296:31:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2318:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2322:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"2308:9:111"},"nodeType":"YulFunctionCall","src":"2308:19:111"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"2300:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2340:57:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2363:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2373:1:111","type":"","value":"5"},{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"2380:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2392:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2376:3:111"},"nodeType":"YulFunctionCall","src":"2376:19:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2369:3:111"},"nodeType":"YulFunctionCall","src":"2369:27:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2359:3:111"},"nodeType":"YulFunctionCall","src":"2359:38:111"},"variables":[{"name":"deleteStart","nodeType":"YulTypedName","src":"2344:11:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2434:23:111","statements":[{"nodeType":"YulAssignment","src":"2436:19:111","value":{"name":"data","nodeType":"YulIdentifier","src":"2451:4:111"},"variableNames":[{"name":"deleteStart","nodeType":"YulIdentifier","src":"2436:11:111"}]}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"2416:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2428:4:111","type":"","value":"0x20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2413:2:111"},"nodeType":"YulFunctionCall","src":"2413:20:111"},"nodeType":"YulIf","src":"2410:47:111"},{"nodeType":"YulVariableDeclaration","src":"2470:41:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2484:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2494:1:111","type":"","value":"5"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2501:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2506:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2497:3:111"},"nodeType":"YulFunctionCall","src":"2497:12:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2490:3:111"},"nodeType":"YulFunctionCall","src":"2490:20:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2480:3:111"},"nodeType":"YulFunctionCall","src":"2480:31:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2474:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2524:24:111","value":{"name":"deleteStart","nodeType":"YulIdentifier","src":"2537:11:111"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"2528:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2622:21:111","statements":[{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2631:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2638:2:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2624:6:111"},"nodeType":"YulFunctionCall","src":"2624:17:111"},"nodeType":"YulExpressionStatement","src":"2624:17:111"}]},"condition":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2572:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2579:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2569:2:111"},"nodeType":"YulFunctionCall","src":"2569:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2583:26:111","statements":[{"nodeType":"YulAssignment","src":"2585:22:111","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2598:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2605:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2594:3:111"},"nodeType":"YulFunctionCall","src":"2594:13:111"},"variableNames":[{"name":"start","nodeType":"YulIdentifier","src":"2585:5:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2565:3:111","statements":[]},"src":"2561:82:111"}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2211:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2216:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2208:2:111"},"nodeType":"YulFunctionCall","src":"2208:11:111"},"nodeType":"YulIf","src":"2205:448:111"}]},"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"2167:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"2174:3:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"2179:10:111","type":""}],"src":"2114:545:111"},{"body":{"nodeType":"YulBlock","src":"2749:81:111","statements":[{"nodeType":"YulAssignment","src":"2759:65:111","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2774:4:111"},{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2792:1:111","type":"","value":"3"},{"name":"len","nodeType":"YulIdentifier","src":"2795:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2788:3:111"},"nodeType":"YulFunctionCall","src":"2788:11:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2805:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2801:3:111"},"nodeType":"YulFunctionCall","src":"2801:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2784:3:111"},"nodeType":"YulFunctionCall","src":"2784:24:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2780:3:111"},"nodeType":"YulFunctionCall","src":"2780:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2770:3:111"},"nodeType":"YulFunctionCall","src":"2770:40:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2816:1:111","type":"","value":"1"},{"name":"len","nodeType":"YulIdentifier","src":"2819:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2812:3:111"},"nodeType":"YulFunctionCall","src":"2812:11:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2767:2:111"},"nodeType":"YulFunctionCall","src":"2767:57:111"},"variableNames":[{"name":"used","nodeType":"YulIdentifier","src":"2759:4:111"}]}]},"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"2726:4:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"2732:3:111","type":""}],"returnVariables":[{"name":"used","nodeType":"YulTypedName","src":"2740:4:111","type":""}],"src":"2664:166:111"},{"body":{"nodeType":"YulBlock","src":"2931:1256:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2941:24:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2961:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2955:5:111"},"nodeType":"YulFunctionCall","src":"2955:10:111"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"2945:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3008:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3010:16:111"},"nodeType":"YulFunctionCall","src":"3010:18:111"},"nodeType":"YulExpressionStatement","src":"3010:18:111"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"2980:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2996:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"3000:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2992:3:111"},"nodeType":"YulFunctionCall","src":"2992:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"3004:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2988:3:111"},"nodeType":"YulFunctionCall","src":"2988:18:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2977:2:111"},"nodeType":"YulFunctionCall","src":"2977:30:111"},"nodeType":"YulIf","src":"2974:56:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3083:4:111"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3121:4:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"3115:5:111"},"nodeType":"YulFunctionCall","src":"3115:11:111"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"3089:25:111"},"nodeType":"YulFunctionCall","src":"3089:38:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3129:6:111"}],"functionName":{"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulIdentifier","src":"3039:43:111"},"nodeType":"YulFunctionCall","src":"3039:97:111"},"nodeType":"YulExpressionStatement","src":"3039:97:111"},{"nodeType":"YulVariableDeclaration","src":"3145:18:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3162:1:111","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"3149:9:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3172:23:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3191:4:111","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"3176:11:111","type":""}]},{"nodeType":"YulAssignment","src":"3204:24:111","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3217:11:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3204:9:111"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"3274:656:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3288:35:111","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3307:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3319:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3315:3:111"},"nodeType":"YulFunctionCall","src":"3315:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3303:3:111"},"nodeType":"YulFunctionCall","src":"3303:20:111"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"3292:7:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3336:49:111","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3380:4:111"}],"functionName":{"name":"array_dataslot_string_storage","nodeType":"YulIdentifier","src":"3350:29:111"},"nodeType":"YulFunctionCall","src":"3350:35:111"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"3340:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3398:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3407:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3402:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3485:172:111","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3510:6:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3528:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3533:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3524:3:111"},"nodeType":"YulFunctionCall","src":"3524:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3518:5:111"},"nodeType":"YulFunctionCall","src":"3518:26:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3503:6:111"},"nodeType":"YulFunctionCall","src":"3503:42:111"},"nodeType":"YulExpressionStatement","src":"3503:42:111"},{"nodeType":"YulAssignment","src":"3562:24:111","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3576:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3584:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3572:3:111"},"nodeType":"YulFunctionCall","src":"3572:14:111"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3562:6:111"}]},{"nodeType":"YulAssignment","src":"3603:40:111","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3620:9:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3631:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3616:3:111"},"nodeType":"YulFunctionCall","src":"3616:27:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3603:9:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3432:1:111"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"3435:7:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3429:2:111"},"nodeType":"YulFunctionCall","src":"3429:14:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3444:28:111","statements":[{"nodeType":"YulAssignment","src":"3446:24:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3455:1:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3458:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3451:3:111"},"nodeType":"YulFunctionCall","src":"3451:19:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3446:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3425:3:111","statements":[]},"src":"3421:236:111"},{"body":{"nodeType":"YulBlock","src":"3705:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3723:43:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3750:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3755:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3746:3:111"},"nodeType":"YulFunctionCall","src":"3746:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3740:5:111"},"nodeType":"YulFunctionCall","src":"3740:26:111"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"3727:9:111","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3790:6:111"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"3802:9:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3829:1:111","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"3832:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3825:3:111"},"nodeType":"YulFunctionCall","src":"3825:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3841:3:111","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3821:3:111"},"nodeType":"YulFunctionCall","src":"3821:24:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3851:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3847:3:111"},"nodeType":"YulFunctionCall","src":"3847:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"3817:3:111"},"nodeType":"YulFunctionCall","src":"3817:37:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3813:3:111"},"nodeType":"YulFunctionCall","src":"3813:42:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3798:3:111"},"nodeType":"YulFunctionCall","src":"3798:58:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3783:6:111"},"nodeType":"YulFunctionCall","src":"3783:74:111"},"nodeType":"YulExpressionStatement","src":"3783:74:111"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"3676:7:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3685:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3673:2:111"},"nodeType":"YulFunctionCall","src":"3673:19:111"},"nodeType":"YulIf","src":"3670:201:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3891:4:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3905:1:111","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"3908:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3901:3:111"},"nodeType":"YulFunctionCall","src":"3901:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3917:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3897:3:111"},"nodeType":"YulFunctionCall","src":"3897:22:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3884:6:111"},"nodeType":"YulFunctionCall","src":"3884:36:111"},"nodeType":"YulExpressionStatement","src":"3884:36:111"}]},"nodeType":"YulCase","src":"3267:663:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3272:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"3947:234:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3961:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3974:1:111","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3965:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4010:67:111","statements":[{"nodeType":"YulAssignment","src":"4028:35:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"4047:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"4052:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4043:3:111"},"nodeType":"YulFunctionCall","src":"4043:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4037:5:111"},"nodeType":"YulFunctionCall","src":"4037:26:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"4028:5:111"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"3991:6:111"},"nodeType":"YulIf","src":"3988:89:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"4097:4:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4156:5:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"4163:6:111"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"4103:52:111"},"nodeType":"YulFunctionCall","src":"4103:67:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4090:6:111"},"nodeType":"YulFunctionCall","src":"4090:81:111"},"nodeType":"YulExpressionStatement","src":"4090:81:111"}]},"nodeType":"YulCase","src":"3939:242:111","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3247:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3255:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3244:2:111"},"nodeType":"YulFunctionCall","src":"3244:14:111"},"nodeType":"YulSwitch","src":"3237:944:111"}]},"name":"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"2916:4:111","type":""},{"name":"src","nodeType":"YulTypedName","src":"2922:3:111","type":""}],"src":"2835:1352:111"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_string_fromMemory(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := mload(offset)\n let _2 := sub(shl(64, 1), 1)\n if gt(_1, _2) { panic_error_0x41() }\n let _3 := not(31)\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_1, 0x1f), _3), 63), _3))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _1)\n let _4 := 0x20\n if gt(add(add(offset, _1), _4), end) { revert(0, 0) }\n let i := 0\n for { } lt(i, _1) { i := add(i, _4) }\n {\n mstore(add(add(memPtr, i), _4), mload(add(add(offset, i), _4)))\n }\n if gt(i, _1)\n {\n mstore(add(add(memPtr, _1), _4), 0)\n }\n array := memPtr\n }\n function abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := mload(headStart)\n let _1 := sub(shl(64, 1), 1)\n if gt(offset, _1) { revert(0, 0) }\n value0 := abi_decode_string_fromMemory(add(headStart, offset), dataEnd)\n let offset_1 := mload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n value1 := abi_decode_string_fromMemory(add(headStart, offset_1), dataEnd)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_string_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_string_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n let _1 := 0\n mstore(_1, array)\n let data := keccak256(_1, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _2 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _2) { start := add(start, 1) }\n { sstore(start, _1) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_string_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_string_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60806040523480156200001157600080fd5b5060405162000e2138038062000e21833981016040819052620000349162000127565b600362000042838262000220565b50600462000051828262000220565b505050620002ec565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b81604052838152602092508683858801011115620000e757600080fd5b600091505b838210156200010b5785820183015181830184015290820190620000ec565b838211156200011d5760008385830101525b9695505050505050565b600080604083850312156200013b57600080fd5b82516001600160401b03808211156200015357600080fd5b620001618683870162000070565b935060208501519150808211156200017857600080fd5b50620001878582860162000070565b9150509250929050565b600181811c90821680620001a657607f821691505b602082108103620001c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021b57600081815260208120601f850160051c81016020861015620001f65750805b601f850160051c820191505b81811015620002175782815560010162000202565b5050505b505050565b81516001600160401b038111156200023c576200023c6200005a565b62000254816200024d845462000191565b84620001cd565b602080601f8311600181146200028c5760008415620002735750858301515b600019600386901b1c1916600185901b17855562000217565b600085815260208120601f198616915b82811015620002bd578886015182559484019460019091019084016200029c565b5085821015620002dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610b2580620002fc6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e39190610906565b60405180910390f35b6100ff6100fa3660046109a2565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f3660046109cc565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109a2565b6102ce565b610113610164366004610a08565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109a2565b610329565b6100ff6101b53660046109a2565b6103ff565b6101136101c8366004610a2a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610a5d565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610a5d565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610ab0565b61040d565b60606004805461020f90610a5d565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610691565b600060208083528351808285015260005b8181101561093357858101830151858201604001528201610917565b81811115610945576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d57600080fd5b919050565b600080604083850312156109b557600080fd5b6109be83610979565b946020939093013593505050565b6000806000606084860312156109e157600080fd5b6109ea84610979565b92506109f860208501610979565b9150604084013590509250925092565b600060208284031215610a1a57600080fd5b610a2382610979565b9392505050565b60008060408385031215610a3d57600080fd5b610a4683610979565b9150610a5460208401610979565b90509250929050565b600181811c90821680610a7157607f821691505b602082108103610aaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610aea577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea26469706673582212208e15e443c92bf8e5a152c9e7e5ac9cdcf426aca514d5aafad2d06ea8dc901bd664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0xE21 CODESIZE SUB DUP1 PUSH3 0xE21 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x127 JUMP JUMPDEST PUSH1 0x3 PUSH3 0x42 DUP4 DUP3 PUSH3 0x220 JUMP JUMPDEST POP PUSH1 0x4 PUSH3 0x51 DUP3 DUP3 PUSH3 0x220 JUMP JUMPDEST POP POP POP PUSH3 0x2EC JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x9F JUMPI PUSH3 0x9F PUSH3 0x5A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH3 0xCA JUMPI PUSH3 0xCA PUSH3 0x5A JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 SWAP3 POP DUP7 DUP4 DUP6 DUP9 ADD ADD GT ISZERO PUSH3 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP4 DUP3 LT ISZERO PUSH3 0x10B JUMPI DUP6 DUP3 ADD DUP4 ADD MLOAD DUP2 DUP4 ADD DUP5 ADD MSTORE SWAP1 DUP3 ADD SWAP1 PUSH3 0xEC JUMP JUMPDEST DUP4 DUP3 GT ISZERO PUSH3 0x11D JUMPI PUSH1 0x0 DUP4 DUP6 DUP4 ADD ADD MSTORE JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x161 DUP7 DUP4 DUP8 ADD PUSH3 0x70 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH3 0x178 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x187 DUP6 DUP3 DUP7 ADD PUSH3 0x70 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x1A6 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH3 0x1C7 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH3 0x21B JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP7 LT ISZERO PUSH3 0x1F6 JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x217 JUMPI DUP3 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x202 JUMP JUMPDEST POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH3 0x23C JUMPI PUSH3 0x23C PUSH3 0x5A JUMP JUMPDEST PUSH3 0x254 DUP2 PUSH3 0x24D DUP5 SLOAD PUSH3 0x191 JUMP JUMPDEST DUP5 PUSH3 0x1CD JUMP JUMPDEST PUSH1 0x20 DUP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 DUP2 EQ PUSH3 0x28C JUMPI PUSH1 0x0 DUP5 ISZERO PUSH3 0x273 JUMPI POP DUP6 DUP4 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP7 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP6 SWAP1 SHL OR DUP6 SSTORE PUSH3 0x217 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP7 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x2BD JUMPI DUP9 DUP7 ADD MLOAD DUP3 SSTORE SWAP5 DUP5 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 DUP5 ADD PUSH3 0x29C JUMP JUMPDEST POP DUP6 DUP3 LT ISZERO PUSH3 0x2DC JUMPI DUP8 DUP6 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP9 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH2 0xB25 DUP1 PUSH3 0x2FC PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x39509351 EQ PUSH2 0x143 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x10F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x121 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x134 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xEC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD6 PUSH2 0x200 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE3 SWAP2 SWAP1 PUSH2 0x906 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xFF PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x292 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x12F CALLDATASIZE PUSH1 0x4 PUSH2 0x9CC JUMP JUMPDEST PUSH2 0x2AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x2CE JUMP JUMPDEST PUSH2 0x113 PUSH2 0x164 CALLDATASIZE PUSH1 0x4 PUSH2 0xA08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0xD6 PUSH2 0x31A JUMP JUMPDEST PUSH2 0xFF PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x329 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x3FF JUMP JUMPDEST PUSH2 0x113 PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0xA2A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x20F SWAP1 PUSH2 0xA5D JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x23B SWAP1 PUSH2 0xA5D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x288 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x288 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x26B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2A0 DUP2 DUP6 DUP6 PUSH2 0x40D JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2B8 DUP6 DUP3 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x2C3 DUP6 DUP6 DUP6 PUSH2 0x697 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x2A0 SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x315 SWAP1 DUP8 SWAP1 PUSH2 0xAB0 JUMP JUMPDEST PUSH2 0x40D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x20F SWAP1 PUSH2 0xA5D JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2C3 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0x40D JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2A0 DUP2 DUP6 DUP6 PUSH2 0x697 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x4AF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x552 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x691 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x684 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH2 0x691 DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0x40D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x73A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x7DD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x893 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP8 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP3 MLOAD DUP6 DUP2 MSTORE SWAP1 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x691 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x933 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x917 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x945 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x99D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x9B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9BE DUP4 PUSH2 0x979 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x9E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9EA DUP5 PUSH2 0x979 JUMP JUMPDEST SWAP3 POP PUSH2 0x9F8 PUSH1 0x20 DUP6 ADD PUSH2 0x979 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA23 DUP3 PUSH2 0x979 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA46 DUP4 PUSH2 0x979 JUMP JUMPDEST SWAP2 POP PUSH2 0xA54 PUSH1 0x20 DUP5 ADD PUSH2 0x979 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0xA71 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0xAAA JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0xAEA JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 ISZERO 0xE4 NUMBER 0xC9 0x2B 0xF8 0xE5 LOG1 MSTORE 0xC9 0xE7 0xE5 0xAC SWAP13 0xDC DELEGATECALL 0x26 0xAC 0xA5 EQ 0xD5 0xAA STATICCALL 0xD2 0xD0 PUSH15 0xA8DC901BD664736F6C634300080F00 CALLER ","sourceMap":"1401:11610:35:-:0;;;1976:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2042:5;:13;2050:5;2042;:13;:::i;:::-;-1:-1:-1;2065:7:35;:17;2075:7;2065;:17;:::i;:::-;;1976:113;;1401:11610;;14:127:111;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:885;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:111;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:111;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;730:3;725:2;720;712:6;708:15;704:24;701:33;698:53;;;747:1;744;737:12;698:53;769:1;760:10;;779:133;793:2;790:1;787:9;779:133;;;881:14;;;877:23;;871:30;850:14;;;846:23;;839:63;804:10;;;;779:133;;;930:2;927:1;924:9;921:80;;;989:1;984:2;979;971:6;967:15;963:24;956:35;921:80;1019:6;146:885;-1:-1:-1;;;;;;146:885:111:o;1036:562::-;1135:6;1143;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;1239:16;;-1:-1:-1;;;;;1304:14:111;;;1301:34;;;1331:1;1328;1321:12;1301:34;1354:61;1407:7;1398:6;1387:9;1383:22;1354:61;:::i;:::-;1344:71;;1461:2;1450:9;1446:18;1440:25;1424:41;;1490:2;1480:8;1477:16;1474:36;;;1506:1;1503;1496:12;1474:36;;1529:63;1584:7;1573:8;1562:9;1558:24;1529:63;:::i;:::-;1519:73;;;1036:562;;;;;:::o;1603:380::-;1682:1;1678:12;;;;1725;;;1746:61;;1800:4;1792:6;1788:17;1778:27;;1746:61;1853:2;1845:6;1842:14;1822:18;1819:38;1816:161;;1899:10;1894:3;1890:20;1887:1;1880:31;1934:4;1931:1;1924:15;1962:4;1959:1;1952:15;1816:161;;1603:380;;;:::o;2114:545::-;2216:2;2211:3;2208:11;2205:448;;;2252:1;2277:5;2273:2;2266:17;2322:4;2318:2;2308:19;2392:2;2380:10;2376:19;2373:1;2369:27;2363:4;2359:38;2428:4;2416:10;2413:20;2410:47;;;-1:-1:-1;2451:4:111;2410:47;2506:2;2501:3;2497:12;2494:1;2490:20;2484:4;2480:31;2470:41;;2561:82;2579:2;2572:5;2569:13;2561:82;;;2624:17;;;2605:1;2594:13;2561:82;;;2565:3;;;2205:448;2114:545;;;:::o;2835:1352::-;2955:10;;-1:-1:-1;;;;;2977:30:111;;2974:56;;;3010:18;;:::i;:::-;3039:97;3129:6;3089:38;3121:4;3115:11;3089:38;:::i;:::-;3083:4;3039:97;:::i;:::-;3191:4;;3255:2;3244:14;;3272:1;3267:663;;;;3974:1;3991:6;3988:89;;;-1:-1:-1;4043:19:111;;;4037:26;3988:89;-1:-1:-1;;2792:1:111;2788:11;;;2784:24;2780:29;2770:40;2816:1;2812:11;;;2767:57;4090:81;;3237:944;;3267:663;2061:1;2054:14;;;2098:4;2085:18;;-1:-1:-1;;3303:20:111;;;3421:236;3435:7;3432:1;3429:14;3421:236;;;3524:19;;;3518:26;3503:42;;3616:27;;;;3584:1;3572:14;;;;3451:19;;3421:236;;;3425:3;3685:6;3676:7;3673:19;3670:201;;;3746:19;;;3740:26;-1:-1:-1;;3829:1:111;3825:14;;;3841:3;3821:24;3817:37;3813:42;3798:58;3783:74;;3670:201;-1:-1:-1;;;;;3917:1:111;3901:14;;;3897:22;3884:36;;-1:-1:-1;2835:1352:111:o;:::-;1401:11610:35;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_afterTokenTransfer_4340":{"entryPoint":null,"id":4340,"parameterSlots":3,"returnSlots":0},"@_approve_4275":{"entryPoint":1037,"id":4275,"parameterSlots":3,"returnSlots":0},"@_beforeTokenTransfer_4329":{"entryPoint":null,"id":4329,"parameterSlots":3,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_spendAllowance_4318":{"entryPoint":1472,"id":4318,"parameterSlots":3,"returnSlots":0},"@_transfer_4101":{"entryPoint":1687,"id":4101,"parameterSlots":3,"returnSlots":0},"@allowance_3896":{"entryPoint":null,"id":3896,"parameterSlots":2,"returnSlots":1},"@approve_3921":{"entryPoint":658,"id":3921,"parameterSlots":2,"returnSlots":1},"@balanceOf_3853":{"entryPoint":null,"id":3853,"parameterSlots":1,"returnSlots":1},"@decimals_3829":{"entryPoint":null,"id":3829,"parameterSlots":0,"returnSlots":1},"@decreaseAllowance_4024":{"entryPoint":809,"id":4024,"parameterSlots":2,"returnSlots":1},"@increaseAllowance_3983":{"entryPoint":718,"id":3983,"parameterSlots":2,"returnSlots":1},"@name_3809":{"entryPoint":512,"id":3809,"parameterSlots":0,"returnSlots":1},"@symbol_3819":{"entryPoint":794,"id":3819,"parameterSlots":0,"returnSlots":1},"@totalSupply_3839":{"entryPoint":null,"id":3839,"parameterSlots":0,"returnSlots":1},"@transferFrom_3954":{"entryPoint":682,"id":3954,"parameterSlots":3,"returnSlots":1},"@transfer_3878":{"entryPoint":1023,"id":3878,"parameterSlots":2,"returnSlots":1},"abi_decode_address":{"entryPoint":2425,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":2568,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_address":{"entryPoint":2602,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_uint256":{"entryPoint":2508,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":2466,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":2310,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":2736,"id":null,"parameterSlots":2,"returnSlots":1},"extract_byte_array_length":{"entryPoint":2653,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:6002:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"135:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"145:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"155:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"149:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"173:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"184:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"166:6:111"},"nodeType":"YulFunctionCall","src":"166:21:111"},"nodeType":"YulExpressionStatement","src":"166:21:111"},{"nodeType":"YulVariableDeclaration","src":"196:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"216:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"210:5:111"},"nodeType":"YulFunctionCall","src":"210:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"200:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"243:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"254:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"239:3:111"},"nodeType":"YulFunctionCall","src":"239:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"259:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"232:6:111"},"nodeType":"YulFunctionCall","src":"232:34:111"},"nodeType":"YulExpressionStatement","src":"232:34:111"},{"nodeType":"YulVariableDeclaration","src":"275:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"284:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"279:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"344:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"373:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"384:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"369:3:111"},"nodeType":"YulFunctionCall","src":"369:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"388:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"365:3:111"},"nodeType":"YulFunctionCall","src":"365:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"407:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"415:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"403:3:111"},"nodeType":"YulFunctionCall","src":"403:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"419:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"399:3:111"},"nodeType":"YulFunctionCall","src":"399:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"393:5:111"},"nodeType":"YulFunctionCall","src":"393:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"358:6:111"},"nodeType":"YulFunctionCall","src":"358:66:111"},"nodeType":"YulExpressionStatement","src":"358:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"305:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"308:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"302:2:111"},"nodeType":"YulFunctionCall","src":"302:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"316:19:111","statements":[{"nodeType":"YulAssignment","src":"318:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"327:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"330:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"323:3:111"},"nodeType":"YulFunctionCall","src":"323:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"318:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"298:3:111","statements":[]},"src":"294:140:111"},{"body":{"nodeType":"YulBlock","src":"468:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"497:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"508:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"493:3:111"},"nodeType":"YulFunctionCall","src":"493:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"517:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"522:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"482:6:111"},"nodeType":"YulFunctionCall","src":"482:42:111"},"nodeType":"YulExpressionStatement","src":"482:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"449:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"452:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"446:2:111"},"nodeType":"YulFunctionCall","src":"446:13:111"},"nodeType":"YulIf","src":"443:91:111"},{"nodeType":"YulAssignment","src":"543:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"559:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"578:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"586:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"591:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"555:3:111"},"nodeType":"YulFunctionCall","src":"555:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"661:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"551:3:111"},"nodeType":"YulFunctionCall","src":"551:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"543:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"104:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"115:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"126:4:111","type":""}],"src":"14:656:111"},{"body":{"nodeType":"YulBlock","src":"724:147:111","statements":[{"nodeType":"YulAssignment","src":"734:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"756:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"743:12:111"},"nodeType":"YulFunctionCall","src":"743:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"734:5:111"}]},{"body":{"nodeType":"YulBlock","src":"849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"851:6:111"},"nodeType":"YulFunctionCall","src":"851:12:111"},"nodeType":"YulExpressionStatement","src":"851:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"785:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"796:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"803:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"792:3:111"},"nodeType":"YulFunctionCall","src":"792:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"782:2:111"},"nodeType":"YulFunctionCall","src":"782:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"775:6:111"},"nodeType":"YulFunctionCall","src":"775:73:111"},"nodeType":"YulIf","src":"772:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"703:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"714:5:111","type":""}],"src":"675:196:111"},{"body":{"nodeType":"YulBlock","src":"963:167:111","statements":[{"body":{"nodeType":"YulBlock","src":"1009:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1018:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1021:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1011:6:111"},"nodeType":"YulFunctionCall","src":"1011:12:111"},"nodeType":"YulExpressionStatement","src":"1011:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"984:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"993:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"980:3:111"},"nodeType":"YulFunctionCall","src":"980:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1005:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"976:3:111"},"nodeType":"YulFunctionCall","src":"976:32:111"},"nodeType":"YulIf","src":"973:52:111"},{"nodeType":"YulAssignment","src":"1034:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1063:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1044:18:111"},"nodeType":"YulFunctionCall","src":"1044:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1034:6:111"}]},{"nodeType":"YulAssignment","src":"1082:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1109:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1120:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1105:3:111"},"nodeType":"YulFunctionCall","src":"1105:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1092:12:111"},"nodeType":"YulFunctionCall","src":"1092:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1082:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"921:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"932:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"944:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"952:6:111","type":""}],"src":"876:254:111"},{"body":{"nodeType":"YulBlock","src":"1230:92:111","statements":[{"nodeType":"YulAssignment","src":"1240:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1252:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1263:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1248:3:111"},"nodeType":"YulFunctionCall","src":"1248:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1240:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1282:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1307:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1300:6:111"},"nodeType":"YulFunctionCall","src":"1300:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1293:6:111"},"nodeType":"YulFunctionCall","src":"1293:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1275:6:111"},"nodeType":"YulFunctionCall","src":"1275:41:111"},"nodeType":"YulExpressionStatement","src":"1275:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1199:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1210:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1221:4:111","type":""}],"src":"1135:187:111"},{"body":{"nodeType":"YulBlock","src":"1428:76:111","statements":[{"nodeType":"YulAssignment","src":"1438:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1450:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1461:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1446:3:111"},"nodeType":"YulFunctionCall","src":"1446:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1438:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1480:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1491:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1473:6:111"},"nodeType":"YulFunctionCall","src":"1473:25:111"},"nodeType":"YulExpressionStatement","src":"1473:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1397:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1408:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1419:4:111","type":""}],"src":"1327:177:111"},{"body":{"nodeType":"YulBlock","src":"1613:224:111","statements":[{"body":{"nodeType":"YulBlock","src":"1659:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1668:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1671:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1661:6:111"},"nodeType":"YulFunctionCall","src":"1661:12:111"},"nodeType":"YulExpressionStatement","src":"1661:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1634:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1643:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1630:3:111"},"nodeType":"YulFunctionCall","src":"1630:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1655:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1626:3:111"},"nodeType":"YulFunctionCall","src":"1626:32:111"},"nodeType":"YulIf","src":"1623:52:111"},{"nodeType":"YulAssignment","src":"1684:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1713:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1694:18:111"},"nodeType":"YulFunctionCall","src":"1694:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1684:6:111"}]},{"nodeType":"YulAssignment","src":"1732:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1765:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1776:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1761:3:111"},"nodeType":"YulFunctionCall","src":"1761:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1742:18:111"},"nodeType":"YulFunctionCall","src":"1742:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1732:6:111"}]},{"nodeType":"YulAssignment","src":"1789:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1816:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1827:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1812:3:111"},"nodeType":"YulFunctionCall","src":"1812:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1799:12:111"},"nodeType":"YulFunctionCall","src":"1799:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1789:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1563:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1574:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1586:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1594:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1602:6:111","type":""}],"src":"1509:328:111"},{"body":{"nodeType":"YulBlock","src":"1939:87:111","statements":[{"nodeType":"YulAssignment","src":"1949:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1961:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1972:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1957:3:111"},"nodeType":"YulFunctionCall","src":"1957:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1949:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1991:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2006:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2014:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2002:3:111"},"nodeType":"YulFunctionCall","src":"2002:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1984:6:111"},"nodeType":"YulFunctionCall","src":"1984:36:111"},"nodeType":"YulExpressionStatement","src":"1984:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1908:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1919:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1930:4:111","type":""}],"src":"1842:184:111"},{"body":{"nodeType":"YulBlock","src":"2101:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"2147:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2156:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2159:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2149:6:111"},"nodeType":"YulFunctionCall","src":"2149:12:111"},"nodeType":"YulExpressionStatement","src":"2149:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2122:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2131:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2118:3:111"},"nodeType":"YulFunctionCall","src":"2118:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2143:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2114:3:111"},"nodeType":"YulFunctionCall","src":"2114:32:111"},"nodeType":"YulIf","src":"2111:52:111"},{"nodeType":"YulAssignment","src":"2172:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2201:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2182:18:111"},"nodeType":"YulFunctionCall","src":"2182:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2172:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2067:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2078:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2090:6:111","type":""}],"src":"2031:186:111"},{"body":{"nodeType":"YulBlock","src":"2309:173:111","statements":[{"body":{"nodeType":"YulBlock","src":"2355:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2364:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2367:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2357:6:111"},"nodeType":"YulFunctionCall","src":"2357:12:111"},"nodeType":"YulExpressionStatement","src":"2357:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2330:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2339:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2326:3:111"},"nodeType":"YulFunctionCall","src":"2326:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2351:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2322:3:111"},"nodeType":"YulFunctionCall","src":"2322:32:111"},"nodeType":"YulIf","src":"2319:52:111"},{"nodeType":"YulAssignment","src":"2380:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2409:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2390:18:111"},"nodeType":"YulFunctionCall","src":"2390:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2380:6:111"}]},{"nodeType":"YulAssignment","src":"2428:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2461:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2472:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2457:3:111"},"nodeType":"YulFunctionCall","src":"2457:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2438:18:111"},"nodeType":"YulFunctionCall","src":"2438:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2428:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2267:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2278:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2290:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2298:6:111","type":""}],"src":"2222:260:111"},{"body":{"nodeType":"YulBlock","src":"2542:382:111","statements":[{"nodeType":"YulAssignment","src":"2552:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2566:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"2569:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2562:3:111"},"nodeType":"YulFunctionCall","src":"2562:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"2552:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2583:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2613:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"2619:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2609:3:111"},"nodeType":"YulFunctionCall","src":"2609:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"2587:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2660:31:111","statements":[{"nodeType":"YulAssignment","src":"2662:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2676:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2684:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2672:3:111"},"nodeType":"YulFunctionCall","src":"2672:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"2662:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"2640:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2633:6:111"},"nodeType":"YulFunctionCall","src":"2633:26:111"},"nodeType":"YulIf","src":"2630:61:111"},{"body":{"nodeType":"YulBlock","src":"2750:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2771:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2774:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2764:6:111"},"nodeType":"YulFunctionCall","src":"2764:88:111"},"nodeType":"YulExpressionStatement","src":"2764:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2872:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2875:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2865:6:111"},"nodeType":"YulFunctionCall","src":"2865:15:111"},"nodeType":"YulExpressionStatement","src":"2865:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2900:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2903:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2893:6:111"},"nodeType":"YulFunctionCall","src":"2893:15:111"},"nodeType":"YulExpressionStatement","src":"2893:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"2706:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2729:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2737:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2726:2:111"},"nodeType":"YulFunctionCall","src":"2726:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2703:2:111"},"nodeType":"YulFunctionCall","src":"2703:38:111"},"nodeType":"YulIf","src":"2700:218:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"2522:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"2531:6:111","type":""}],"src":"2487:437:111"},{"body":{"nodeType":"YulBlock","src":"2977:234:111","statements":[{"body":{"nodeType":"YulBlock","src":"3012:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3033:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3036:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3026:6:111"},"nodeType":"YulFunctionCall","src":"3026:88:111"},"nodeType":"YulExpressionStatement","src":"3026:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3134:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3137:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3127:6:111"},"nodeType":"YulFunctionCall","src":"3127:15:111"},"nodeType":"YulExpressionStatement","src":"3127:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3162:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3165:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3155:6:111"},"nodeType":"YulFunctionCall","src":"3155:15:111"},"nodeType":"YulExpressionStatement","src":"3155:15:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2993:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"3000:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2996:3:111"},"nodeType":"YulFunctionCall","src":"2996:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2990:2:111"},"nodeType":"YulFunctionCall","src":"2990:13:111"},"nodeType":"YulIf","src":"2987:193:111"},{"nodeType":"YulAssignment","src":"3189:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"3200:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"3203:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3196:3:111"},"nodeType":"YulFunctionCall","src":"3196:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"3189:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"2960:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"2963:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"2969:3:111","type":""}],"src":"2929:282:111"},{"body":{"nodeType":"YulBlock","src":"3390:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3407:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3418:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3400:6:111"},"nodeType":"YulFunctionCall","src":"3400:21:111"},"nodeType":"YulExpressionStatement","src":"3400:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3441:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3452:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3437:3:111"},"nodeType":"YulFunctionCall","src":"3437:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3457:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3430:6:111"},"nodeType":"YulFunctionCall","src":"3430:30:111"},"nodeType":"YulExpressionStatement","src":"3430:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3480:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3491:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3476:3:111"},"nodeType":"YulFunctionCall","src":"3476:18:111"},{"hexValue":"45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77","kind":"string","nodeType":"YulLiteral","src":"3496:34:111","type":"","value":"ERC20: decreased allowance below"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3469:6:111"},"nodeType":"YulFunctionCall","src":"3469:62:111"},"nodeType":"YulExpressionStatement","src":"3469:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3551:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3562:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3547:3:111"},"nodeType":"YulFunctionCall","src":"3547:18:111"},{"hexValue":"207a65726f","kind":"string","nodeType":"YulLiteral","src":"3567:7:111","type":"","value":" zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3540:6:111"},"nodeType":"YulFunctionCall","src":"3540:35:111"},"nodeType":"YulExpressionStatement","src":"3540:35:111"},{"nodeType":"YulAssignment","src":"3584:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3596:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3607:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3584:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3367:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3381:4:111","type":""}],"src":"3216:401:111"},{"body":{"nodeType":"YulBlock","src":"3796:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3813:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3824:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3806:6:111"},"nodeType":"YulFunctionCall","src":"3806:21:111"},"nodeType":"YulExpressionStatement","src":"3806:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3843:3:111"},"nodeType":"YulFunctionCall","src":"3843:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3863:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3836:6:111"},"nodeType":"YulFunctionCall","src":"3836:30:111"},"nodeType":"YulExpressionStatement","src":"3836:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3886:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3897:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3882:3:111"},"nodeType":"YulFunctionCall","src":"3882:18:111"},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f20616464","kind":"string","nodeType":"YulLiteral","src":"3902:34:111","type":"","value":"ERC20: approve from the zero add"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3875:6:111"},"nodeType":"YulFunctionCall","src":"3875:62:111"},"nodeType":"YulExpressionStatement","src":"3875:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3957:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3968:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3953:3:111"},"nodeType":"YulFunctionCall","src":"3953:18:111"},{"hexValue":"72657373","kind":"string","nodeType":"YulLiteral","src":"3973:6:111","type":"","value":"ress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3946:6:111"},"nodeType":"YulFunctionCall","src":"3946:34:111"},"nodeType":"YulExpressionStatement","src":"3946:34:111"},{"nodeType":"YulAssignment","src":"3989:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4012:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3997:3:111"},"nodeType":"YulFunctionCall","src":"3997:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3989:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3773:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3787:4:111","type":""}],"src":"3622:400:111"},{"body":{"nodeType":"YulBlock","src":"4201:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4218:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4229:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4211:6:111"},"nodeType":"YulFunctionCall","src":"4211:21:111"},"nodeType":"YulExpressionStatement","src":"4211:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4252:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4263:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4248:3:111"},"nodeType":"YulFunctionCall","src":"4248:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4268:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4241:6:111"},"nodeType":"YulFunctionCall","src":"4241:30:111"},"nodeType":"YulExpressionStatement","src":"4241:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4302:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4287:3:111"},"nodeType":"YulFunctionCall","src":"4287:18:111"},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f206164647265","kind":"string","nodeType":"YulLiteral","src":"4307:34:111","type":"","value":"ERC20: approve to the zero addre"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4280:6:111"},"nodeType":"YulFunctionCall","src":"4280:62:111"},"nodeType":"YulExpressionStatement","src":"4280:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4362:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4373:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4358:3:111"},"nodeType":"YulFunctionCall","src":"4358:18:111"},{"hexValue":"7373","kind":"string","nodeType":"YulLiteral","src":"4378:4:111","type":"","value":"ss"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4351:6:111"},"nodeType":"YulFunctionCall","src":"4351:32:111"},"nodeType":"YulExpressionStatement","src":"4351:32:111"},{"nodeType":"YulAssignment","src":"4392:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4404:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4415:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4400:3:111"},"nodeType":"YulFunctionCall","src":"4400:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4392:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4178:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4192:4:111","type":""}],"src":"4027:398:111"},{"body":{"nodeType":"YulBlock","src":"4604:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4621:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4632:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4614:6:111"},"nodeType":"YulFunctionCall","src":"4614:21:111"},"nodeType":"YulExpressionStatement","src":"4614:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4655:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4666:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4651:3:111"},"nodeType":"YulFunctionCall","src":"4651:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4671:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4644:6:111"},"nodeType":"YulFunctionCall","src":"4644:30:111"},"nodeType":"YulExpressionStatement","src":"4644:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4694:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4705:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4690:3:111"},"nodeType":"YulFunctionCall","src":"4690:18:111"},{"hexValue":"45524332303a20696e73756666696369656e7420616c6c6f77616e6365","kind":"string","nodeType":"YulLiteral","src":"4710:31:111","type":"","value":"ERC20: insufficient allowance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4683:6:111"},"nodeType":"YulFunctionCall","src":"4683:59:111"},"nodeType":"YulExpressionStatement","src":"4683:59:111"},{"nodeType":"YulAssignment","src":"4751:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4774:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4759:3:111"},"nodeType":"YulFunctionCall","src":"4759:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4751:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4581:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4595:4:111","type":""}],"src":"4430:353:111"},{"body":{"nodeType":"YulBlock","src":"4962:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4979:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4990:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4972:6:111"},"nodeType":"YulFunctionCall","src":"4972:21:111"},"nodeType":"YulExpressionStatement","src":"4972:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5013:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5024:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5009:3:111"},"nodeType":"YulFunctionCall","src":"5009:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5029:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5002:6:111"},"nodeType":"YulFunctionCall","src":"5002:30:111"},"nodeType":"YulExpressionStatement","src":"5002:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5052:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5063:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5048:3:111"},"nodeType":"YulFunctionCall","src":"5048:18:111"},{"hexValue":"45524332303a207472616e736665722066726f6d20746865207a65726f206164","kind":"string","nodeType":"YulLiteral","src":"5068:34:111","type":"","value":"ERC20: transfer from the zero ad"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5041:6:111"},"nodeType":"YulFunctionCall","src":"5041:62:111"},"nodeType":"YulExpressionStatement","src":"5041:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5123:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5134:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5119:3:111"},"nodeType":"YulFunctionCall","src":"5119:18:111"},{"hexValue":"6472657373","kind":"string","nodeType":"YulLiteral","src":"5139:7:111","type":"","value":"dress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5112:6:111"},"nodeType":"YulFunctionCall","src":"5112:35:111"},"nodeType":"YulExpressionStatement","src":"5112:35:111"},{"nodeType":"YulAssignment","src":"5156:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5179:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5164:3:111"},"nodeType":"YulFunctionCall","src":"5164:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5156:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4939:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4953:4:111","type":""}],"src":"4788:401:111"},{"body":{"nodeType":"YulBlock","src":"5368:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5385:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5396:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5378:6:111"},"nodeType":"YulFunctionCall","src":"5378:21:111"},"nodeType":"YulExpressionStatement","src":"5378:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5419:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5430:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5415:3:111"},"nodeType":"YulFunctionCall","src":"5415:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5435:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5408:6:111"},"nodeType":"YulFunctionCall","src":"5408:30:111"},"nodeType":"YulExpressionStatement","src":"5408:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5458:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5469:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5454:3:111"},"nodeType":"YulFunctionCall","src":"5454:18:111"},{"hexValue":"45524332303a207472616e7366657220746f20746865207a65726f2061646472","kind":"string","nodeType":"YulLiteral","src":"5474:34:111","type":"","value":"ERC20: transfer to the zero addr"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5447:6:111"},"nodeType":"YulFunctionCall","src":"5447:62:111"},"nodeType":"YulExpressionStatement","src":"5447:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5540:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5525:3:111"},"nodeType":"YulFunctionCall","src":"5525:18:111"},{"hexValue":"657373","kind":"string","nodeType":"YulLiteral","src":"5545:5:111","type":"","value":"ess"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5518:6:111"},"nodeType":"YulFunctionCall","src":"5518:33:111"},"nodeType":"YulExpressionStatement","src":"5518:33:111"},{"nodeType":"YulAssignment","src":"5560:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5572:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5583:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5568:3:111"},"nodeType":"YulFunctionCall","src":"5568:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5560:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5345:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5359:4:111","type":""}],"src":"5194:399:111"},{"body":{"nodeType":"YulBlock","src":"5772:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5789:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5800:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5782:6:111"},"nodeType":"YulFunctionCall","src":"5782:21:111"},"nodeType":"YulExpressionStatement","src":"5782:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5823:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5834:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5819:3:111"},"nodeType":"YulFunctionCall","src":"5819:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5839:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5812:6:111"},"nodeType":"YulFunctionCall","src":"5812:30:111"},"nodeType":"YulExpressionStatement","src":"5812:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5862:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5873:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5858:3:111"},"nodeType":"YulFunctionCall","src":"5858:18:111"},{"hexValue":"45524332303a207472616e7366657220616d6f756e7420657863656564732062","kind":"string","nodeType":"YulLiteral","src":"5878:34:111","type":"","value":"ERC20: transfer amount exceeds b"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5851:6:111"},"nodeType":"YulFunctionCall","src":"5851:62:111"},"nodeType":"YulExpressionStatement","src":"5851:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5933:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5944:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5929:3:111"},"nodeType":"YulFunctionCall","src":"5929:18:111"},{"hexValue":"616c616e6365","kind":"string","nodeType":"YulLiteral","src":"5949:8:111","type":"","value":"alance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5922:6:111"},"nodeType":"YulFunctionCall","src":"5922:36:111"},"nodeType":"YulExpressionStatement","src":"5922:36:111"},{"nodeType":"YulAssignment","src":"5967:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5979:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5990:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5975:3:111"},"nodeType":"YulFunctionCall","src":"5975:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5967:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5749:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5763:4:111","type":""}],"src":"5598:402:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: decreased allowance below\")\n mstore(add(headStart, 96), \" zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"ERC20: insufficient allowance\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: transfer from the zero ad\")\n mstore(add(headStart, 96), \"dress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"ERC20: transfer to the zero addr\")\n mstore(add(headStart, 96), \"ess\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"ERC20: transfer amount exceeds b\")\n mstore(add(headStart, 96), \"alance\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e39190610906565b60405180910390f35b6100ff6100fa3660046109a2565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f3660046109cc565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109a2565b6102ce565b610113610164366004610a08565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109a2565b610329565b6100ff6101b53660046109a2565b6103ff565b6101136101c8366004610a2a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610a5d565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610a5d565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610ab0565b61040d565b60606004805461020f90610a5d565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610691565b600060208083528351808285015260005b8181101561093357858101830151858201604001528201610917565b81811115610945576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d57600080fd5b919050565b600080604083850312156109b557600080fd5b6109be83610979565b946020939093013593505050565b6000806000606084860312156109e157600080fd5b6109ea84610979565b92506109f860208501610979565b9150604084013590509250925092565b600060208284031215610a1a57600080fd5b610a2382610979565b9392505050565b60008060408385031215610a3d57600080fd5b610a4683610979565b9150610a5460208401610979565b90509250929050565b600181811c90821680610a7157607f821691505b602082108103610aaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610aea577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea26469706673582212208e15e443c92bf8e5a152c9e7e5ac9cdcf426aca514d5aafad2d06ea8dc901bd664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x39509351 EQ PUSH2 0x143 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x10F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x121 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x134 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xEC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD6 PUSH2 0x200 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE3 SWAP2 SWAP1 PUSH2 0x906 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xFF PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x292 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x12F CALLDATASIZE PUSH1 0x4 PUSH2 0x9CC JUMP JUMPDEST PUSH2 0x2AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x2CE JUMP JUMPDEST PUSH2 0x113 PUSH2 0x164 CALLDATASIZE PUSH1 0x4 PUSH2 0xA08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0xD6 PUSH2 0x31A JUMP JUMPDEST PUSH2 0xFF PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x329 JUMP JUMPDEST PUSH2 0xFF PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x9A2 JUMP JUMPDEST PUSH2 0x3FF JUMP JUMPDEST PUSH2 0x113 PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0xA2A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x20F SWAP1 PUSH2 0xA5D JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x23B SWAP1 PUSH2 0xA5D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x288 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x288 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x26B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2A0 DUP2 DUP6 DUP6 PUSH2 0x40D JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2B8 DUP6 DUP3 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x2C3 DUP6 DUP6 DUP6 PUSH2 0x697 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x2A0 SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x315 SWAP1 DUP8 SWAP1 PUSH2 0xAB0 JUMP JUMPDEST PUSH2 0x40D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x20F SWAP1 PUSH2 0xA5D JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2C3 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0x40D JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x2A0 DUP2 DUP6 DUP6 PUSH2 0x697 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x4AF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x552 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x691 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x684 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH2 0x691 DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0x40D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x73A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x7DD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x893 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP8 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP3 MLOAD DUP6 DUP2 MSTORE SWAP1 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x691 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x933 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x917 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x945 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x99D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x9B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9BE DUP4 PUSH2 0x979 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x9E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9EA DUP5 PUSH2 0x979 JUMP JUMPDEST SWAP3 POP PUSH2 0x9F8 PUSH1 0x20 DUP6 ADD PUSH2 0x979 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA23 DUP3 PUSH2 0x979 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA46 DUP4 PUSH2 0x979 JUMP JUMPDEST SWAP2 POP PUSH2 0xA54 PUSH1 0x20 DUP5 ADD PUSH2 0x979 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0xA71 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0xAAA JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0xAEA JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 ISZERO 0xE4 NUMBER 0xC9 0x2B 0xF8 0xE5 LOG1 MSTORE 0xC9 0xE7 0xE5 0xAC SWAP13 0xDC DELEGATECALL 0x26 0xAC 0xA5 EQ 0xD5 0xAA STATICCALL 0xD2 0xD0 PUSH15 0xA8DC901BD664736F6C634300080F00 CALLER ","sourceMap":"1401:11610:35:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4431:197;;;;;;:::i;:::-;;:::i;:::-;;;1300:14:111;;1293:22;1275:41;;1263:2;1248:18;4431:197:35;1135:187:111;3242:106:35;3329:12;;3242:106;;;1473:25:111;;;1461:2;1446:18;3242:106:35;1327:177:111;5190:286:35;;;;;;:::i;:::-;;:::i;3091:91::-;;;3173:2;1984:36:111;;1972:2;1957:18;3091:91:35;1842:184:111;5871:234:35;;;;;;:::i;:::-;;:::i;3406:125::-;;;;;;:::i;:::-;3506:18;;3480:7;3506:18;;;;;;;;;;;;3406:125;2365:102;;;:::i;6592:427::-;;;;;;:::i;:::-;;:::i;3727:189::-;;;;;;:::i;:::-;;:::i;3974:149::-;;;;;;:::i;:::-;4089:18;;;;4063:7;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3974:149;2154:98;2208:13;2240:5;2233:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98;:::o;4431:197::-;4514:4;719:10:43;4568:32:35;719:10:43;4584:7:35;4593:6;4568:8;:32::i;:::-;-1:-1:-1;4617:4:35;;4431:197;-1:-1:-1;;;4431:197:35:o;5190:286::-;5317:4;719:10:43;5373:38:35;5389:4;719:10:43;5404:6:35;5373:15;:38::i;:::-;5421:27;5431:4;5437:2;5441:6;5421:9;:27::i;:::-;-1:-1:-1;5465:4:35;;5190:286;-1:-1:-1;;;;5190:286:35:o;5871:234::-;719:10:43;5959:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5959:4;;719:10:43;6013:64:35;;719:10:43;;4089:27:35;;6038:38;;6066:10;;6038:38;:::i;:::-;6013:8;:64::i;2365:102::-;2421:13;2453:7;2446:14;;;;;:::i;6592:427::-;719:10:43;6685:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6685:4;;719:10:43;6829:15:35;6809:16;:35;;6801:85;;;;;;;3418:2:111;6801:85:35;;;3400:21:111;3457:2;3437:18;;;3430:30;3496:34;3476:18;;;3469:62;3567:7;3547:18;;;3540:35;3592:19;;6801:85:35;;;;;;;;;6920:60;6929:5;6936:7;6964:15;6945:16;:34;6920:8;:60::i;3727:189::-;3806:4;719:10:43;3860:28:35;719:10:43;3877:2:35;3881:6;3860:9;:28::i;10504:370::-;10635:19;;;10627:68;;;;;;;3824:2:111;10627:68:35;;;3806:21:111;3863:2;3843:18;;;3836:30;3902:34;3882:18;;;3875:62;3973:6;3953:18;;;3946:34;3997:19;;10627:68:35;3622:400:111;10627:68:35;10713:21;;;10705:68;;;;;;;4229:2:111;10705:68:35;;;4211:21:111;4268:2;4248:18;;;4241:30;4307:34;4287:18;;;4280:62;4378:4;4358:18;;;4351:32;4400:19;;10705:68:35;4027:398:111;10705:68:35;10784:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10835:32;;1473:25:111;;;10835:32:35;;1446:18:111;10835:32:35;;;;;;;10504:370;;;:::o;11155:441::-;4089:18;;;;11285:24;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;11371:17;11351:37;;11347:243;;11432:6;11412:16;:26;;11404:68;;;;;;;4632:2:111;11404:68:35;;;4614:21:111;4671:2;4651:18;;;4644:30;4710:31;4690:18;;;4683:59;4759:18;;11404:68:35;4430:353:111;11404:68:35;11514:51;11523:5;11530:7;11558:6;11539:16;:25;11514:8;:51::i;:::-;11275:321;11155:441;;;:::o;7473:818::-;7599:18;;;7591:68;;;;;;;4990:2:111;7591:68:35;;;4972:21:111;5029:2;5009:18;;;5002:30;5068:34;5048:18;;;5041:62;5139:7;5119:18;;;5112:35;5164:19;;7591:68:35;4788:401:111;7591:68:35;7677:16;;;7669:64;;;;;;;5396:2:111;7669:64:35;;;5378:21:111;5435:2;5415:18;;;5408:30;5474:34;5454:18;;;5447:62;5545:5;5525:18;;;5518:33;5568:19;;7669:64:35;5194:399:111;7669:64:35;7815:15;;;7793:19;7815:15;;;;;;;;;;;7848:21;;;;7840:72;;;;;;;5800:2:111;7840:72:35;;;5782:21:111;5839:2;5819:18;;;5812:30;5878:34;5858:18;;;5851:62;5949:8;5929:18;;;5922:36;5975:19;;7840:72:35;5598:402:111;7840:72:35;7946:15;;;;:9;:15;;;;;;;;;;;7964:20;;;7946:38;;8161:13;;;;;;;;;;:23;;;;;;8210:26;;1473:25:111;;;8161:13:35;;8210:26;;1446:18:111;8210:26:35;;;;;;;8247:37;12180:121;14:656:111;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:111;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:111:o;675:196::-;743:20;;803:42;792:54;;782:65;;772:93;;861:1;858;851:12;772:93;675:196;;;:::o;876:254::-;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1044:29;1063:9;1044:29;:::i;:::-;1034:39;1120:2;1105:18;;;;1092:32;;-1:-1:-1;;;876:254:111:o;1509:328::-;1586:6;1594;1602;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;1694:29;1713:9;1694:29;:::i;:::-;1684:39;;1742:38;1776:2;1765:9;1761:18;1742:38;:::i;:::-;1732:48;;1827:2;1816:9;1812:18;1799:32;1789:42;;1509:328;;;;;:::o;2031:186::-;2090:6;2143:2;2131:9;2122:7;2118:23;2114:32;2111:52;;;2159:1;2156;2149:12;2111:52;2182:29;2201:9;2182:29;:::i;:::-;2172:39;2031:186;-1:-1:-1;;;2031:186:111:o;2222:260::-;2290:6;2298;2351:2;2339:9;2330:7;2326:23;2322:32;2319:52;;;2367:1;2364;2357:12;2319:52;2390:29;2409:9;2390:29;:::i;:::-;2380:39;;2438:38;2472:2;2461:9;2457:18;2438:38;:::i;:::-;2428:48;;2222:260;;;;;:::o;2487:437::-;2566:1;2562:12;;;;2609;;;2630:61;;2684:4;2676:6;2672:17;2662:27;;2630:61;2737:2;2729:6;2726:14;2706:18;2703:38;2700:218;;2774:77;2771:1;2764:88;2875:4;2872:1;2865:15;2903:4;2900:1;2893:15;2700:218;;2487:437;;;:::o;2929:282::-;2969:3;3000:1;2996:6;2993:1;2990:13;2987:193;;;3036:77;3033:1;3026:88;3137:4;3134:1;3127:15;3165:4;3162:1;3155:15;2987:193;-1:-1:-1;3196:9:111;;2929:282::o"},"gasEstimates":{"creation":{"codeDepositCost":"570600","executionCost":"infinite","totalCost":"infinite"},"external":{"allowance(address,address)":"infinite","approve(address,uint256)":"24599","balanceOf(address)":"2561","decimals()":"244","decreaseAllowance(address,uint256)":"26862","increaseAllowance(address,uint256)":"26908","name()":"infinite","symbol()":"infinite","totalSupply()":"2304","transfer(address,uint256)":"51030","transferFrom(address,address,uint256)":"infinite"},"internal":{"_afterTokenTransfer(address,address,uint256)":"infinite","_approve(address,address,uint256)":"infinite","_beforeTokenTransfer(address,address,uint256)":"infinite","_burn(address,uint256)":"infinite","_mint(address,uint256)":"infinite","_spendAllowance(address,address,uint256)":"infinite","_transfer(address,address,uint256)":"infinite"}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"constructor\":{\"details\":\"Sets the values for {name} and {symbol}. The default value of {decimals} is 18. To select a different value for {decimals} you should overload it. All two of these values are immutable: they can only be set once during construction.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3770,"contract":"@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20","label":"_balances","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"},{"astId":3776,"contract":"@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20","label":"_allowances","offset":0,"slot":"1","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":3778,"contract":"@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20","label":"_totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":3780,"contract":"@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20","label":"_name","offset":0,"slot":"3","type":"t_string_storage"},{"astId":3782,"contract":"@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20","label":"_symbol","offset":0,"slot":"4","type":"t_string_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"IERC20":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC20 standard as defined in the EIP.","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the amount of tokens owned by `account`."},"totalSupply()":{"details":"Returns the amount of tokens in existence."},"transfer(address,uint256)":{"details":"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"IERC20Metadata":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface for the optional metadata functions from the ERC20 standard. _Available since v4.1._","kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the amount of tokens owned by `account`."},"decimals()":{"details":"Returns the decimals places of the token."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token."},"totalSupply()":{"details":"Returns the amount of tokens in existence."},"transfer(address,uint256)":{"details":"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for the optional metadata functions from the ERC20 standard. _Available since v4.1._\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":\"IERC20Metadata\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"IERC20Permit":{"abi":[{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.","kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section].\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":\"IERC20Permit\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"SafeERC20":{"abi":[],"devdoc":{"details":"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.","kind":"dev","methods":{},"title":"SafeERC20","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ed873c0ee64a832dbed9a4a0060e810b8c68718d085775384dc3e1c121da2ebf64736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED DUP8 EXTCODECOPY 0xE 0xE6 0x4A DUP4 0x2D 0xBE 0xD9 LOG4 LOG0 MOD 0xE DUP2 SIGNEXTEND DUP13 PUSH9 0x718D085775384DC3E1 0xC1 0x21 0xDA 0x2E 0xBF PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"707:3748:39:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;707:3748:39;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ed873c0ee64a832dbed9a4a0060e810b8c68718d085775384dc3e1c121da2ebf64736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED DUP8 EXTCODECOPY 0xE 0xE6 0x4A DUP4 0x2D 0xBE 0xD9 LOG4 LOG0 MOD 0xE DUP2 SIGNEXTEND DUP13 PUSH9 0x718D085775384DC3E1 0xC1 0x21 0xDA 0x2E 0xBF PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"707:3748:39:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"_callOptionalReturn(contract IERC20,bytes memory)":"infinite","safeApprove(contract IERC20,address,uint256)":"infinite","safeDecreaseAllowance(contract IERC20,address,uint256)":"infinite","safeIncreaseAllowance(contract IERC20,address,uint256)":"infinite","safePermit(contract IERC20Permit,address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","safeTransfer(contract IERC20,address,uint256)":"infinite","safeTransferFrom(contract IERC20,address,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SafeERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":\"SafeERC20\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"IERC721Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.","kind":"dev","methods":{"onERC721Received(address,address,uint256,bytes)":{"details":"Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`."}},"title":"ERC721 token receiver interface","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\"}},\"title\":\"ERC721 token receiver interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":\"IERC721Receiver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol":{"IERC777Recipient":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC777TokensRecipient standard as defined in the EIP. Accounts can be notified of {IERC777} tokens being sent to them by having a contract implement this interface (contract holders can be their own implementer) and registering it on the https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. See {IERC1820Registry} and {ERC1820Implementer}.","kind":"dev","methods":{"tokensReceived(address,address,address,uint256,bytes,bytes)":{"details":"Called by an {IERC777} token contract whenever tokens are being moved or created into a registered account (`to`). The type of operation is conveyed by `from` being the zero address or not. This call occurs _after_ the token contract's state is updated, so {IERC777-balanceOf}, etc., can be used to query the post-operation state. This function may revert to prevent the operation from being executed."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"userData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC777TokensRecipient standard as defined in the EIP. Accounts can be notified of {IERC777} tokens being sent to them by having a contract implement this interface (contract holders can be their own implementer) and registering it on the https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. See {IERC1820Registry} and {ERC1820Implementer}.\",\"kind\":\"dev\",\"methods\":{\"tokensReceived(address,address,address,uint256,bytes,bytes)\":{\"details\":\"Called by an {IERC777} token contract whenever tokens are being moved or created into a registered account (`to`). The type of operation is conveyed by `from` being the zero address or not. This call occurs _after_ the token contract's state is updated, so {IERC777-balanceOf}, etc., can be used to query the post-operation state. This function may revert to prevent the operation from being executed.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":\"IERC777Recipient\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Address.sol":{"Address":{"abi":[],"devdoc":{"details":"Collection of functions related to the address type","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122049c19920df658f812d380c26f5c2099a18cfc1648de9efed3af51894a43d330564736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x49 0xC1 SWAP10 KECCAK256 0xDF PUSH6 0x8F812D380C26 CREATE2 0xC2 MULMOD SWAP11 XOR 0xCF 0xC1 PUSH5 0x8DE9EFED3A CREATE2 XOR SWAP5 LOG4 RETURNDATASIZE CALLER SDIV PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"194:8964:42:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;194:8964:42;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122049c19920df658f812d380c26f5c2099a18cfc1648de9efed3af51894a43d330564736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x49 0xC1 SWAP10 KECCAK256 0xDF PUSH6 0x8F812D380C26 CREATE2 0xC2 MULMOD SWAP11 XOR 0xCF 0xC1 PUSH5 0x8DE9EFED3A CREATE2 XOR SWAP5 LOG4 RETURNDATASIZE CALLER SDIV PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"194:8964:42:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"_revert(bytes memory,string memory)":"infinite","functionCall(address,bytes memory)":"infinite","functionCall(address,bytes memory,string memory)":"infinite","functionCallWithValue(address,bytes memory,uint256)":"infinite","functionCallWithValue(address,bytes memory,uint256,string memory)":"infinite","functionDelegateCall(address,bytes memory)":"infinite","functionDelegateCall(address,bytes memory,string memory)":"infinite","functionStaticCall(address,bytes memory)":"infinite","functionStaticCall(address,bytes memory,string memory)":"infinite","isContract(address)":"infinite","sendValue(address payable,uint256)":"infinite","verifyCallResult(bool,bytes memory,string memory)":"infinite","verifyCallResultFromTarget(address,bool,bytes memory,string memory)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Context.sol":{"Context":{"abi":[],"devdoc":{"details":"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Create2.sol":{"Create2":{"abi":[],"devdoc":{"details":"Helper to make usage of the `CREATE2` EVM opcode easier and safer. `CREATE2` can be used to compute in advance the address where a smart contract will be deployed, which allows for interesting new mechanisms known as 'counterfactual interactions'. See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more information.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205f53d50ec63b794c4c680d16e27024a5fd6399723cf3406dde2477905c79c8b664736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F MSTORE8 0xD5 0xE 0xC6 EXTCODESIZE PUSH26 0x4C4C680D16E27024A5FD6399723CF3406DDE2477905C79C8B664 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"494:3517:44:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;494:3517:44;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205f53d50ec63b794c4c680d16e27024a5fd6399723cf3406dde2477905c79c8b664736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F MSTORE8 0xD5 0xE 0xC6 EXTCODESIZE PUSH26 0x4C4C680D16E27024A5FD6399723CF3406DDE2477905C79C8B664 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"494:3517:44:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"computeAddress(bytes32,bytes32)":"infinite","computeAddress(bytes32,bytes32,address)":"infinite","deploy(uint256,bytes32,bytes memory)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Helper to make usage of the `CREATE2` EVM opcode easier and safer. `CREATE2` can be used to compute in advance the address where a smart contract will be deployed, which allows for interesting new mechanisms known as 'counterfactual interactions'. See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more information.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Create2.sol\":\"Create2\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/StorageSlot.sol":{"StorageSlot":{"abi":[],"devdoc":{"details":"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ``` contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205dbf388e5425e50617f9eb8d56fda3701de4f62712991ea53cdbed332745671c64736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D 0xBF CODESIZE DUP15 SLOAD 0x25 0xE5 MOD OR 0xF9 0xEB DUP14 JUMP REVERT LOG3 PUSH17 0x1DE4F62712991EA53CDBED332745671C64 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"1279:1391:45:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;1279:1391:45;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205dbf388e5425e50617f9eb8d56fda3701de4f62712991ea53cdbed332745671c64736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D 0xBF CODESIZE DUP15 SLOAD 0x25 0xE5 MOD OR 0xF9 0xEB DUP14 JUMP REVERT LOG3 PUSH17 0x1DE4F62712991EA53CDBED332745671C64 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"1279:1391:45:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"getAddressSlot(bytes32)":"infinite","getBooleanSlot(bytes32)":"infinite","getBytes32Slot(bytes32)":"infinite","getUint256Slot(bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ``` contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Strings.sol":{"Strings":{"abi":[],"devdoc":{"details":"String operations.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220769b28cb1b11ab01cdf1a004dadd4fe195b2ebd51e0bc050146948ee34e0d7cb64736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH23 0x9B28CB1B11AB01CDF1A004DADD4FE195B2EBD51E0BC050 EQ PUSH10 0x48EE34E0D7CB64736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"188:2065:46:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;188:2065:46;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220769b28cb1b11ab01cdf1a004dadd4fe195b2ebd51e0bc050146948ee34e0d7cb64736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH23 0x9B28CB1B11AB01CDF1A004DADD4FE195B2EBD51E0BC050 EQ PUSH10 0x48EE34E0D7CB64736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"188:2065:46:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"toHexString(address)":"infinite","toHexString(uint256)":"infinite","toHexString(uint256,uint256)":"infinite","toString(uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"String operations.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Strings.sol\":\"Strings\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ECDSA":{"abi":[],"devdoc":{"details":"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209fb2f578b6ab2a17197ffe01967067bca18250b608e4dfc474aa9dd077363ba564736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP16 0xB2 CREATE2 PUSH25 0xB6AB2A17197FFE01967067BCA18250B608E4DFC474AA9DD077 CALLDATASIZE EXTCODESIZE 0xA5 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"369:8168:47:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;369:8168:47;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209fb2f578b6ab2a17197ffe01967067bca18250b608e4dfc474aa9dd077363ba564736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP16 0xB2 CREATE2 PUSH25 0xB6AB2A17197FFE01967067BCA18250B608E4DFC474AA9DD077 CALLDATASIZE EXTCODESIZE 0xA5 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"369:8168:47:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"_throwError(enum ECDSA.RecoverError)":"infinite","recover(bytes32,bytes memory)":"infinite","recover(bytes32,bytes32,bytes32)":"infinite","recover(bytes32,uint8,bytes32,bytes32)":"infinite","toEthSignedMessageHash(bytes memory)":"infinite","toEthSignedMessageHash(bytes32)":"infinite","toTypedDataHash(bytes32,bytes32)":"infinite","tryRecover(bytes32,bytes memory)":"infinite","tryRecover(bytes32,bytes32,bytes32)":"infinite","tryRecover(bytes32,uint8,bytes32,bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":\"ECDSA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"IERC165":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/math/Math.sol":{"Math":{"abi":[],"devdoc":{"details":"Standard math utilities missing in the Solidity language.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b0e6f45d73560f5963992e3f9efa46fc0396aca7b674f341ac69ea59b85d870064736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xE6 DELEGATECALL 0x5D PUSH20 0x560F5963992E3F9EFA46FC0396ACA7B674F341AC PUSH10 0xEA59B85D870064736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"202:12302:49:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;202:12302:49;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b0e6f45d73560f5963992e3f9efa46fc0396aca7b674f341ac69ea59b85d870064736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xE6 DELEGATECALL 0x5D PUSH20 0x560F5963992E3F9EFA46FC0396ACA7B674F341AC PUSH10 0xEA59B85D870064736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"202:12302:49:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"average(uint256,uint256)":"infinite","ceilDiv(uint256,uint256)":"infinite","log10(uint256)":"infinite","log10(uint256,enum Math.Rounding)":"infinite","log2(uint256)":"infinite","log2(uint256,enum Math.Rounding)":"infinite","log256(uint256)":"infinite","log256(uint256,enum Math.Rounding)":"infinite","max(uint256,uint256)":"infinite","min(uint256,uint256)":"infinite","mulDiv(uint256,uint256,uint256)":"infinite","mulDiv(uint256,uint256,uint256,enum Math.Rounding)":"infinite","sqrt(uint256)":"infinite","sqrt(uint256,enum Math.Rounding)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/Math.sol\":\"Math\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/bundler/EntryPointWrapper.sol":{"EntryPointWrapper":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"getCodeHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"getUserOpHashes","outputs":[{"internalType":"bytes32[]","name":"ret","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[{"components":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"internalType":"struct EntryPointWrapper.FailedOpStatus","name":"","type":"tuple"},{"components":[{"internalType":"string","name":"selectorType","type":"string"},{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.Response","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedOp(uint256,string)":[{"params":{"opIndex":"- index into the array of ops to the failed one (in simulateValidation, this is always zero)","reason":"- revert reason The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."}}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"params":{"factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"params":{"aggregatorInfo":"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation","factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_6861":{"entryPoint":null,"id":6861,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":1393,"id":null,"parameterSlots":2,"returnSlots":1},"array_dataslot_bytes_storage":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"clean_up_bytearray_end_slots_bytes_storage":{"entryPoint":1106,"id":null,"parameterSlots":3,"returnSlots":0},"copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage":{"entryPoint":1189,"id":null,"parameterSlots":2,"returnSlots":0},"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"extract_byte_array_length":{"entryPoint":1046,"id":null,"parameterSlots":1,"returnSlots":1},"extract_used_part_and_set_length_of_short_byte_array":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":1024,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:4397:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:95:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"70:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"75:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"66:3:111"},"nodeType":"YulFunctionCall","src":"66:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:111"},"nodeType":"YulFunctionCall","src":"56:31:111"},"nodeType":"YulExpressionStatement","src":"56:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"103:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"106:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"96:6:111"},"nodeType":"YulFunctionCall","src":"96:15:111"},"nodeType":"YulExpressionStatement","src":"96:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"127:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"130:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"120:6:111"},"nodeType":"YulFunctionCall","src":"120:15:111"},"nodeType":"YulExpressionStatement","src":"120:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:127:111"},{"body":{"nodeType":"YulBlock","src":"201:325:111","statements":[{"nodeType":"YulAssignment","src":"211:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"225:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"228:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"221:3:111"},"nodeType":"YulFunctionCall","src":"221:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"211:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"242:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"272:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"278:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"268:3:111"},"nodeType":"YulFunctionCall","src":"268:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"246:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"319:31:111","statements":[{"nodeType":"YulAssignment","src":"321:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"335:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"343:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"331:3:111"},"nodeType":"YulFunctionCall","src":"331:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"321:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"299:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"292:6:111"},"nodeType":"YulFunctionCall","src":"292:26:111"},"nodeType":"YulIf","src":"289:61:111"},{"body":{"nodeType":"YulBlock","src":"409:111:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"430:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"437:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"442:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"433:3:111"},"nodeType":"YulFunctionCall","src":"433:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"423:6:111"},"nodeType":"YulFunctionCall","src":"423:31:111"},"nodeType":"YulExpressionStatement","src":"423:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"474:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"477:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"467:6:111"},"nodeType":"YulFunctionCall","src":"467:15:111"},"nodeType":"YulExpressionStatement","src":"467:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"502:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"505:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"495:6:111"},"nodeType":"YulFunctionCall","src":"495:15:111"},"nodeType":"YulExpressionStatement","src":"495:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"365:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"396:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"385:2:111"},"nodeType":"YulFunctionCall","src":"385:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"362:2:111"},"nodeType":"YulFunctionCall","src":"362:38:111"},"nodeType":"YulIf","src":"359:161:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"181:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"190:6:111","type":""}],"src":"146:380:111"},{"body":{"nodeType":"YulBlock","src":"586:65:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"603:1:111","type":"","value":"0"},{"name":"ptr","nodeType":"YulIdentifier","src":"606:3:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"596:6:111"},"nodeType":"YulFunctionCall","src":"596:14:111"},"nodeType":"YulExpressionStatement","src":"596:14:111"},{"nodeType":"YulAssignment","src":"619:26:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"637:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"640:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"627:9:111"},"nodeType":"YulFunctionCall","src":"627:18:111"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"619:4:111"}]}]},"name":"array_dataslot_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"ptr","nodeType":"YulTypedName","src":"569:3:111","type":""}],"returnVariables":[{"name":"data","nodeType":"YulTypedName","src":"577:4:111","type":""}],"src":"531:120:111"},{"body":{"nodeType":"YulBlock","src":"736:464:111","statements":[{"body":{"nodeType":"YulBlock","src":"769:425:111","statements":[{"nodeType":"YulVariableDeclaration","src":"783:11:111","value":{"kind":"number","nodeType":"YulLiteral","src":"793:1:111","type":"","value":"0"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"787:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"814:2:111"},{"name":"array","nodeType":"YulIdentifier","src":"818:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"807:6:111"},"nodeType":"YulFunctionCall","src":"807:17:111"},"nodeType":"YulExpressionStatement","src":"807:17:111"},{"nodeType":"YulVariableDeclaration","src":"837:31:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"859:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"863:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"849:9:111"},"nodeType":"YulFunctionCall","src":"849:19:111"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"841:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"881:57:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"904:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"914:1:111","type":"","value":"5"},{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"921:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"933:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:19:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"910:3:111"},"nodeType":"YulFunctionCall","src":"910:27:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"900:3:111"},"nodeType":"YulFunctionCall","src":"900:38:111"},"variables":[{"name":"deleteStart","nodeType":"YulTypedName","src":"885:11:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"975:23:111","statements":[{"nodeType":"YulAssignment","src":"977:19:111","value":{"name":"data","nodeType":"YulIdentifier","src":"992:4:111"},"variableNames":[{"name":"deleteStart","nodeType":"YulIdentifier","src":"977:11:111"}]}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"957:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"969:4:111","type":"","value":"0x20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"954:2:111"},"nodeType":"YulFunctionCall","src":"954:20:111"},"nodeType":"YulIf","src":"951:47:111"},{"nodeType":"YulVariableDeclaration","src":"1011:41:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1025:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1035:1:111","type":"","value":"5"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1042:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1047:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1038:3:111"},"nodeType":"YulFunctionCall","src":"1038:12:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1031:3:111"},"nodeType":"YulFunctionCall","src":"1031:20:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1021:3:111"},"nodeType":"YulFunctionCall","src":"1021:31:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1015:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1065:24:111","value":{"name":"deleteStart","nodeType":"YulIdentifier","src":"1078:11:111"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"1069:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1163:21:111","statements":[{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1172:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1179:2:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"1165:6:111"},"nodeType":"YulFunctionCall","src":"1165:17:111"},"nodeType":"YulExpressionStatement","src":"1165:17:111"}]},"condition":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1113:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1120:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1110:2:111"},"nodeType":"YulFunctionCall","src":"1110:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1124:26:111","statements":[{"nodeType":"YulAssignment","src":"1126:22:111","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1139:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1146:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1135:3:111"},"nodeType":"YulFunctionCall","src":"1135:13:111"},"variableNames":[{"name":"start","nodeType":"YulIdentifier","src":"1126:5:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1106:3:111","statements":[]},"src":"1102:82:111"}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"752:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"757:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"749:2:111"},"nodeType":"YulFunctionCall","src":"749:11:111"},"nodeType":"YulIf","src":"746:448:111"}]},"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"708:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"715:3:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"720:10:111","type":""}],"src":"656:544:111"},{"body":{"nodeType":"YulBlock","src":"1290:81:111","statements":[{"nodeType":"YulAssignment","src":"1300:65:111","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1315:4:111"},{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1333:1:111","type":"","value":"3"},{"name":"len","nodeType":"YulIdentifier","src":"1336:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1329:3:111"},"nodeType":"YulFunctionCall","src":"1329:11:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1346:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1342:3:111"},"nodeType":"YulFunctionCall","src":"1342:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1325:3:111"},"nodeType":"YulFunctionCall","src":"1325:24:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1321:3:111"},"nodeType":"YulFunctionCall","src":"1321:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1311:3:111"},"nodeType":"YulFunctionCall","src":"1311:40:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1357:1:111","type":"","value":"1"},{"name":"len","nodeType":"YulIdentifier","src":"1360:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1353:3:111"},"nodeType":"YulFunctionCall","src":"1353:11:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1308:2:111"},"nodeType":"YulFunctionCall","src":"1308:57:111"},"variableNames":[{"name":"used","nodeType":"YulIdentifier","src":"1300:4:111"}]}]},"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"1267:4:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"1273:3:111","type":""}],"returnVariables":[{"name":"used","nodeType":"YulTypedName","src":"1281:4:111","type":""}],"src":"1205:166:111"},{"body":{"nodeType":"YulBlock","src":"1470:1254:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1480:24:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1500:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1494:5:111"},"nodeType":"YulFunctionCall","src":"1494:10:111"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"1484:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1547:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1549:16:111"},"nodeType":"YulFunctionCall","src":"1549:18:111"},"nodeType":"YulExpressionStatement","src":"1549:18:111"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1519:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1535:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"1539:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1531:3:111"},"nodeType":"YulFunctionCall","src":"1531:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1543:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1527:3:111"},"nodeType":"YulFunctionCall","src":"1527:18:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1516:2:111"},"nodeType":"YulFunctionCall","src":"1516:30:111"},"nodeType":"YulIf","src":"1513:56:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1621:4:111"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1659:4:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1653:5:111"},"nodeType":"YulFunctionCall","src":"1653:11:111"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"1627:25:111"},"nodeType":"YulFunctionCall","src":"1627:38:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"1667:6:111"}],"functionName":{"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulIdentifier","src":"1578:42:111"},"nodeType":"YulFunctionCall","src":"1578:96:111"},"nodeType":"YulExpressionStatement","src":"1578:96:111"},{"nodeType":"YulVariableDeclaration","src":"1683:18:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1700:1:111","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"1687:9:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1710:23:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1729:4:111","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"1714:11:111","type":""}]},{"nodeType":"YulAssignment","src":"1742:24:111","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"1755:11:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"1742:9:111"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"1812:655:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1826:35:111","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1845:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1857:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1853:3:111"},"nodeType":"YulFunctionCall","src":"1853:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1841:3:111"},"nodeType":"YulFunctionCall","src":"1841:20:111"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"1830:7:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1874:48:111","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1917:4:111"}],"functionName":{"name":"array_dataslot_bytes_storage","nodeType":"YulIdentifier","src":"1888:28:111"},"nodeType":"YulFunctionCall","src":"1888:34:111"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"1878:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1935:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1944:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1939:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2022:172:111","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2047:6:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2065:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2070:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2061:3:111"},"nodeType":"YulFunctionCall","src":"2061:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2055:5:111"},"nodeType":"YulFunctionCall","src":"2055:26:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2040:6:111"},"nodeType":"YulFunctionCall","src":"2040:42:111"},"nodeType":"YulExpressionStatement","src":"2040:42:111"},{"nodeType":"YulAssignment","src":"2099:24:111","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2113:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2121:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2109:3:111"},"nodeType":"YulFunctionCall","src":"2109:14:111"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2099:6:111"}]},{"nodeType":"YulAssignment","src":"2140:40:111","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2157:9:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"2168:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2153:3:111"},"nodeType":"YulFunctionCall","src":"2153:27:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2140:9:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1969:1:111"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"1972:7:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1966:2:111"},"nodeType":"YulFunctionCall","src":"1966:14:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1981:28:111","statements":[{"nodeType":"YulAssignment","src":"1983:24:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1992:1:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"1995:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1988:3:111"},"nodeType":"YulFunctionCall","src":"1988:19:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1983:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1962:3:111","statements":[]},"src":"1958:236:111"},{"body":{"nodeType":"YulBlock","src":"2242:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2260:43:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2287:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2292:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2283:3:111"},"nodeType":"YulFunctionCall","src":"2283:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2277:5:111"},"nodeType":"YulFunctionCall","src":"2277:26:111"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"2264:9:111","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2327:6:111"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"2339:9:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2366:1:111","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"2369:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2362:3:111"},"nodeType":"YulFunctionCall","src":"2362:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"2378:3:111","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2358:3:111"},"nodeType":"YulFunctionCall","src":"2358:24:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2388:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2384:3:111"},"nodeType":"YulFunctionCall","src":"2384:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2354:3:111"},"nodeType":"YulFunctionCall","src":"2354:37:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2350:3:111"},"nodeType":"YulFunctionCall","src":"2350:42:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2335:3:111"},"nodeType":"YulFunctionCall","src":"2335:58:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2320:6:111"},"nodeType":"YulFunctionCall","src":"2320:74:111"},"nodeType":"YulExpressionStatement","src":"2320:74:111"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"2213:7:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"2222:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2210:2:111"},"nodeType":"YulFunctionCall","src":"2210:19:111"},"nodeType":"YulIf","src":"2207:201:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2428:4:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2442:1:111","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"2445:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2438:3:111"},"nodeType":"YulFunctionCall","src":"2438:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"2454:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2434:3:111"},"nodeType":"YulFunctionCall","src":"2434:22:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2421:6:111"},"nodeType":"YulFunctionCall","src":"2421:36:111"},"nodeType":"YulExpressionStatement","src":"2421:36:111"}]},"nodeType":"YulCase","src":"1805:662:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1810:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"2484:234:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2498:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2511:1:111","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2502:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2547:67:111","statements":[{"nodeType":"YulAssignment","src":"2565:35:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2584:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2589:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2580:3:111"},"nodeType":"YulFunctionCall","src":"2580:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2574:5:111"},"nodeType":"YulFunctionCall","src":"2574:26:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2565:5:111"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"2528:6:111"},"nodeType":"YulIf","src":"2525:89:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2634:4:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2693:5:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"2700:6:111"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"2640:52:111"},"nodeType":"YulFunctionCall","src":"2640:67:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2627:6:111"},"nodeType":"YulFunctionCall","src":"2627:81:111"},"nodeType":"YulExpressionStatement","src":"2627:81:111"}]},"nodeType":"YulCase","src":"2476:242:111","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1785:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1793:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1782:2:111"},"nodeType":"YulFunctionCall","src":"1782:14:111"},"nodeType":"YulSwitch","src":"1775:943:111"}]},"name":"copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"1455:4:111","type":""},{"name":"src","nodeType":"YulTypedName","src":"1461:3:111","type":""}],"src":"1376:1348:111"},{"body":{"nodeType":"YulBlock","src":"2825:1254:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2835:24:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2855:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2849:5:111"},"nodeType":"YulFunctionCall","src":"2849:10:111"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"2839:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2902:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2904:16:111"},"nodeType":"YulFunctionCall","src":"2904:18:111"},"nodeType":"YulExpressionStatement","src":"2904:18:111"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"2874:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2890:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"2894:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2886:3:111"},"nodeType":"YulFunctionCall","src":"2886:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2898:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2882:3:111"},"nodeType":"YulFunctionCall","src":"2882:18:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2871:2:111"},"nodeType":"YulFunctionCall","src":"2871:30:111"},"nodeType":"YulIf","src":"2868:56:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2976:4:111"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3014:4:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"3008:5:111"},"nodeType":"YulFunctionCall","src":"3008:11:111"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"2982:25:111"},"nodeType":"YulFunctionCall","src":"2982:38:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3022:6:111"}],"functionName":{"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulIdentifier","src":"2933:42:111"},"nodeType":"YulFunctionCall","src":"2933:96:111"},"nodeType":"YulExpressionStatement","src":"2933:96:111"},{"nodeType":"YulVariableDeclaration","src":"3038:18:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3055:1:111","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"3042:9:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3065:23:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3084:4:111","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"3069:11:111","type":""}]},{"nodeType":"YulAssignment","src":"3097:24:111","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3110:11:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3097:9:111"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"3167:655:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3181:35:111","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3200:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3212:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3208:3:111"},"nodeType":"YulFunctionCall","src":"3208:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3196:3:111"},"nodeType":"YulFunctionCall","src":"3196:20:111"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"3185:7:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3229:48:111","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3272:4:111"}],"functionName":{"name":"array_dataslot_bytes_storage","nodeType":"YulIdentifier","src":"3243:28:111"},"nodeType":"YulFunctionCall","src":"3243:34:111"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"3233:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3290:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3299:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3294:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3377:172:111","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3402:6:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3420:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3425:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3416:3:111"},"nodeType":"YulFunctionCall","src":"3416:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3410:5:111"},"nodeType":"YulFunctionCall","src":"3410:26:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3395:6:111"},"nodeType":"YulFunctionCall","src":"3395:42:111"},"nodeType":"YulExpressionStatement","src":"3395:42:111"},{"nodeType":"YulAssignment","src":"3454:24:111","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3468:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3476:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3464:3:111"},"nodeType":"YulFunctionCall","src":"3464:14:111"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3454:6:111"}]},{"nodeType":"YulAssignment","src":"3495:40:111","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3512:9:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3523:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3508:3:111"},"nodeType":"YulFunctionCall","src":"3508:27:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3495:9:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3324:1:111"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"3327:7:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3321:2:111"},"nodeType":"YulFunctionCall","src":"3321:14:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3336:28:111","statements":[{"nodeType":"YulAssignment","src":"3338:24:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3347:1:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3350:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3343:3:111"},"nodeType":"YulFunctionCall","src":"3343:19:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3338:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3317:3:111","statements":[]},"src":"3313:236:111"},{"body":{"nodeType":"YulBlock","src":"3597:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3615:43:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3642:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3647:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3638:3:111"},"nodeType":"YulFunctionCall","src":"3638:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3632:5:111"},"nodeType":"YulFunctionCall","src":"3632:26:111"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"3619:9:111","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3682:6:111"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"3694:9:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3721:1:111","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"3724:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3717:3:111"},"nodeType":"YulFunctionCall","src":"3717:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3733:3:111","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3713:3:111"},"nodeType":"YulFunctionCall","src":"3713:24:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3743:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3739:3:111"},"nodeType":"YulFunctionCall","src":"3739:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"3709:3:111"},"nodeType":"YulFunctionCall","src":"3709:37:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3705:3:111"},"nodeType":"YulFunctionCall","src":"3705:42:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3690:3:111"},"nodeType":"YulFunctionCall","src":"3690:58:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3675:6:111"},"nodeType":"YulFunctionCall","src":"3675:74:111"},"nodeType":"YulExpressionStatement","src":"3675:74:111"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"3568:7:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3577:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3565:2:111"},"nodeType":"YulFunctionCall","src":"3565:19:111"},"nodeType":"YulIf","src":"3562:201:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3783:4:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3797:1:111","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"3800:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3793:3:111"},"nodeType":"YulFunctionCall","src":"3793:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3809:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3789:3:111"},"nodeType":"YulFunctionCall","src":"3789:22:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3776:6:111"},"nodeType":"YulFunctionCall","src":"3776:36:111"},"nodeType":"YulExpressionStatement","src":"3776:36:111"}]},"nodeType":"YulCase","src":"3160:662:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3165:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"3839:234:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3853:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3866:1:111","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3857:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3902:67:111","statements":[{"nodeType":"YulAssignment","src":"3920:35:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3939:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3944:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3935:3:111"},"nodeType":"YulFunctionCall","src":"3935:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3929:5:111"},"nodeType":"YulFunctionCall","src":"3929:26:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"3920:5:111"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"3883:6:111"},"nodeType":"YulIf","src":"3880:89:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3989:4:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4048:5:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"4055:6:111"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"3995:52:111"},"nodeType":"YulFunctionCall","src":"3995:67:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3982:6:111"},"nodeType":"YulFunctionCall","src":"3982:81:111"},"nodeType":"YulExpressionStatement","src":"3982:81:111"}]},"nodeType":"YulCase","src":"3831:242:111","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3140:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3148:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3137:2:111"},"nodeType":"YulFunctionCall","src":"3137:14:111"},"nodeType":"YulSwitch","src":"3130:943:111"}]},"name":"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"2810:4:111","type":""},{"name":"src","nodeType":"YulTypedName","src":"2816:3:111","type":""}],"src":"2729:1350:111"},{"body":{"nodeType":"YulBlock","src":"4186:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"4232:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4241:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4244:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4234:6:111"},"nodeType":"YulFunctionCall","src":"4234:12:111"},"nodeType":"YulExpressionStatement","src":"4234:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4207:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4216:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4203:3:111"},"nodeType":"YulFunctionCall","src":"4203:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4228:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4199:3:111"},"nodeType":"YulFunctionCall","src":"4199:32:111"},"nodeType":"YulIf","src":"4196:52:111"},{"nodeType":"YulVariableDeclaration","src":"4257:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4276:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4270:5:111"},"nodeType":"YulFunctionCall","src":"4270:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4261:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4349:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4358:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4361:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4351:6:111"},"nodeType":"YulFunctionCall","src":"4351:12:111"},"nodeType":"YulExpressionStatement","src":"4351:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4308:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4319:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4334:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"4339:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"4330:3:111"},"nodeType":"YulFunctionCall","src":"4330:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"4343:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4326:3:111"},"nodeType":"YulFunctionCall","src":"4326:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4315:3:111"},"nodeType":"YulFunctionCall","src":"4315:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"4305:2:111"},"nodeType":"YulFunctionCall","src":"4305:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4298:6:111"},"nodeType":"YulFunctionCall","src":"4298:50:111"},"nodeType":"YulIf","src":"4295:70:111"},{"nodeType":"YulAssignment","src":"4374:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4384:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4374:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4152:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4163:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4175:6:111","type":""}],"src":"4084:311:111"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_bytes_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_bytes_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n let _1 := 0\n mstore(_1, array)\n let data := keccak256(_1, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _2 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _2) { start := add(start, 1) }\n { sstore(start, _1) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_bytes_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_bytes_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_bytes_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_bytes_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"6000608081905260a08190526001819055600281905560c081905261010081815261012082905260e052600380546001600160a01b0319169055600481905560058190556101408181526101608290526101808290526101a08290526101c08290526102008281526102206040526101e08190526006838155600793909355600880546001600160681b0319169055909190600990620000a09082620004a5565b50506040805160e081018252600060c08083019182529082528251908101835260068054825260075460208381019190915260085460ff811615159584019590955265ffffffffffff610100860481166060850152670100000000000000909504909416608083015260098054939550938501939192909160a0840191620001289062000416565b80601f0160208091040260200160405190810160405280929190818152602001828054620001569062000416565b8015620001a75780601f106200017b57610100808354040283529160200191620001a7565b820191906000526020600020905b8154815290600101906020018083116200018957829003601f168201915b505050919092525050508152604080518082018252600154808252600254602083810182905280860193909352835180850185528281528084018290528486015283518085018552918252818301526060840152815180830183526003546001600160a01b031681528251808401909352600454835260055483830152908101919091526080909101528051600a908190620002449082620004a5565b5060208281015180516001840190815591810151600284015560408101516003840180546060840151608085015166ffffffffffffff1990921693151566ffffffffffff0019169390931761010065ffffffffffff948516021765ffffffffffff60381b1916670100000000000000939091169290920291909117905560a08101519091906004840190620002da9082620004a5565b505050604082810151805160058401556020908101516006840155606080850151805160078601558201516008850155608085015180516009860155820151600a85015560a0909401518051600b850180546001600160a01b0319166001600160a01b039092169190911790558101518051600c850155810151600d909301929092558051928301815260008084528383018181528251938401835290835290830182905282516018805460ff1916911515919091178155905160195590601a90620003a79082620004a5565b505050348015620003b757600080fd5b5060405162001fb738038062001fb7833981016040819052620003da9162000571565b600080546001600160a01b0319166001600160a01b0392909216919091179055620005a3565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200042b57607f821691505b6020821081036200044c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004a057600081815260208120601f850160051c810160208610156200047b5750805b601f850160051c820191505b818110156200049c5782815560010162000487565b5050505b505050565b81516001600160401b03811115620004c157620004c162000400565b620004d981620004d2845462000416565b8462000452565b602080601f831160018114620005115760008415620004f85750858301515b600019600386901b1c1916600185901b1785556200049c565b600085815260208120601f198616915b82811015620005425788860151825594840194600190910190840162000521565b5085821015620005615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200058457600080fd5b81516001600160a01b03811681146200059c57600080fd5b9392505050565b611a0480620005b36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633024e00c146100515780637b34b6211461007a578063b0d691fe1461009b578063ee219423146100e0575b600080fd5b61006461005f366004610e68565b610101565b6040516100719190611027565b60405180910390f35b61008d61008836600461106b565b61021e565b604051908152602001610071565b6000546100bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610071565b6100f36100ee366004611105565b610307565b60405161007192919061119d565b6060815167ffffffffffffffff81111561011d5761011d610ce6565b604051908082528060200260200182016040528015610146578160200160208202803683370190505b50905060005b8251811015610217578373ffffffffffffffffffffffffffffffffffffffff1663a6193531848381518110610183576101836112e7565b60200260200101516040518263ffffffff1660e01b81526004016101a79190611316565b602060405180830381865afa1580156101c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e89190611404565b8282815181106101fa576101fa6112e7565b60209081029190910101528061020f8161144c565b91505061014c565b5092915050565b600080825167ffffffffffffffff81111561023b5761023b610ce6565b604051908082528060200260200182016040528015610264578160200160208202803683370190505b50905060005b83518110156102d357838181518110610285576102856112e7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102b6576102b66112e7565b6020908102919091010152806102cb8161144c565b91505061026a565b506000816040516020016102e79190611027565b60408051601f198184030181529190528051602090910120949350505050565b6040805160608082018352600080835260208301529181019190915261032b610bc5565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061038190869060040161151a565b600060405180830381600087803b15801561039b57600080fd5b505af19250505080156103ac575060015b610a5d573d8080156103da576040519150601f19603f3d011682016040523d82523d6000602084013e6103df565b606091505b5060006103eb8261162c565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016105d05760008060008061045486600480895161044f919061167c565b610a62565b80602001905181019061046791906117bf565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161053d90611831565b80601f016020809104026020016040519081016040528092919081815260200182805461056990611831565b80156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161077c576000806000806000610634876004808a5161044f919061167c565b8060200190518101906106479190611884565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916106e890611831565b80601f016020809104026020016040519081016040528092919081815260200182805461071490611831565b80156107615780601f1061073657610100808354040283529160200191610761565b820191906000526020600020905b81548152906001019060200180831161074457829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610a5a576000806107db84600480875161044f919061167c565b8060200190518101906107ee919061195b565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c001604052908160008201805461082e90611831565b80601f016020809104026020016040519081016040528092919081815260200182805461085a90611831565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a084019161092590611831565b80601f016020809104026020016040519081016040528092919081815260200182805461095190611831565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610a7081601f6119b6565b1015610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b610ae782846119b6565b84511015610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ad4565b606082158015610b705760405191506000825260208201604052610bba565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610ba9578051835260209283019201610b91565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610c26604051806040016040528060008152602001600081525090565b8152602001610c48604051806040016040528060008152602001600081525090565b8152602001610c6a604051806040016040528060008152602001600081525090565b8152602001610c77610c7c565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610c77604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce357600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610d3957610d39610ce6565b60405290565b60405160c0810167ffffffffffffffff81118282101715610d3957610d39610ce6565b6040805190810167ffffffffffffffff81118282101715610d3957610d39610ce6565b604051601f8201601f1916810167ffffffffffffffff81118282101715610dae57610dae610ce6565b604052919050565b600067ffffffffffffffff821115610dd057610dd0610ce6565b5060051b60200190565b8035610de581610cc1565b919050565b600067ffffffffffffffff821115610e0457610e04610ce6565b50601f01601f191660200190565b600082601f830112610e2357600080fd5b8135610e36610e3182610dea565b610d85565b818152846020838601011115610e4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610e7b57600080fd5b8235610e8681610cc1565b915060208381013567ffffffffffffffff80821115610ea457600080fd5b818601915086601f830112610eb857600080fd5b8135610ec6610e3182610db6565b81815260059190911b83018401908481019089831115610ee557600080fd5b8585015b8381101561101657803585811115610f0057600080fd5b8601610160818d03601f19011215610f1757600080fd5b610f1f610d15565b610f2a898301610dda565b8152604082013589820152606082013587811115610f4757600080fd5b610f558e8b83860101610e12565b604083015250608082013587811115610f6d57600080fd5b610f7b8e8b83860101610e12565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408083013588811115610fca57600080fd5b610fd88f8c83870101610e12565b6101208401525061016083013588811115610ff257600080fd5b6110008f8c83870101610e12565b9183019190915250845250918601918601610ee9565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561105f57835183529284019291840191600101611043565b50909695505050505050565b6000602080838503121561107e57600080fd5b823567ffffffffffffffff81111561109557600080fd5b8301601f810185136110a657600080fd5b80356110b4610e3182610db6565b81815260059190911b820183019083810190878311156110d357600080fd5b928401925b828410156110fa5783356110eb81610cc1565b825292840192908401906110d8565b979650505050505050565b60006020828403121561111757600080fd5b813567ffffffffffffffff81111561112e57600080fd5b82016101608185031215610bbe57600080fd5b60005b8381101561115c578181015183820152602001611144565b8381111561116b576000848401525b50505050565b60008151808452611189816020860160208601611141565b601f01601f19169290920160200192915050565b600060408083528451151581840152602080860151606085015281860151606060808601526111cf60a0860182611171565b90508481038286015261016086518183526111ec82840182611171565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261124f60c0820184611171565b9250508286015161126c8483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a086015192506112dd610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261133d60208201835173ffffffffffffffffffffffffffffffffffffffff169052565b6020820151604082015260006040830151610160806060850152611365610180850183611171565b91506060850151601f19808685030160808701526113838483611171565b9350608087015160a087015260a087015160c087015260c087015160e087015260e087015191506101008281880152808801519250506101208281880152808801519250506101408187860301818801526113de8584611171565b9088015187820390920184880152935090506113fa8382611171565b9695505050505050565b60006020828403121561141657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361147d5761147d61141d565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114b957600080fd5b830160208101925035905067ffffffffffffffff8111156114d957600080fd5b8036038213156114e857600080fd5b9250929050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b602081526115486020820161152e84610dda565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006115616040840184611484565b610160806060860152611579610180860183856114ef565b92506115886060870187611484565b9250601f19808786030160808801526115a28585846114ef565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526115e982890189611484565b945091506101408188870301818901526116048686856114ef565b9550611612818a018a611484565b9550925050808786030183880152506110fa8484836114ef565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156116745780818460040360031b1b83161693505b505050919050565b60008282101561168e5761168e61141d565b500390565b805165ffffffffffff81168114610de557600080fd5b60006116b7610e3184610dea565b90508281528383830111156116cb57600080fd5b610bbe836020830184611141565b600082601f8301126116ea57600080fd5b610bbe838351602085016116a9565b600060c0828403121561170b57600080fd5b611713610d3f565b905081518152602082015160208201526040820151801515811461173657600080fd5b604082015261174760608301611693565b606082015261175860808301611693565b608082015260a082015167ffffffffffffffff81111561177757600080fd5b611783848285016116d9565b60a08301525092915050565b6000604082840312156117a157600080fd5b6117a9610d62565b9050815181526020820151602082015292915050565b60008060008060e085870312156117d557600080fd5b845167ffffffffffffffff8111156117ec57600080fd5b6117f8878288016116f9565b945050611808866020870161178f565b9250611817866060870161178f565b91506118268660a0870161178f565b905092959194509250565b600181811c9082168061184557607f821691505b60208210810361187e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600080600080600085870361014081121561189e57600080fd5b865167ffffffffffffffff8111156118b557600080fd5b6118c189828a016116f9565b9650506118d1886020890161178f565b94506118e0886060890161178f565b93506118ef8860a0890161178f565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff208201121561192157600080fd5b5061192a610d62565b60e087015161193881610cc1565b815261194888610100890161178f565b6020820152809150509295509295909350565b6000806040838503121561196e57600080fd5b82519150602083015167ffffffffffffffff81111561198c57600080fd5b8301601f8101851361199d57600080fd5b6119ac858251602084016116a9565b9150509250929050565b600082198211156119c9576119c961141d565b50019056fea2646970667358221220e8ba5bb4b5e13ff96f7485fae52ca1d36b02d4fdfa3a7240912686c3e45b00bc64736f6c634300080f0033","opcodes":"PUSH1 0x0 PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0xC0 DUP2 SWAP1 MSTORE PUSH2 0x100 DUP2 DUP2 MSTORE PUSH2 0x120 DUP3 SWAP1 MSTORE PUSH1 0xE0 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x5 DUP2 SWAP1 SSTORE PUSH2 0x140 DUP2 DUP2 MSTORE PUSH2 0x160 DUP3 SWAP1 MSTORE PUSH2 0x180 DUP3 SWAP1 MSTORE PUSH2 0x1A0 DUP3 SWAP1 MSTORE PUSH2 0x1C0 DUP3 SWAP1 MSTORE PUSH2 0x200 DUP3 DUP2 MSTORE PUSH2 0x220 PUSH1 0x40 MSTORE PUSH2 0x1E0 DUP2 SWAP1 MSTORE PUSH1 0x6 DUP4 DUP2 SSTORE PUSH1 0x7 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x68 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 SWAP1 PUSH1 0x9 SWAP1 PUSH3 0xA0 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xE0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 PUSH1 0xC0 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE SWAP1 DUP3 MSTORE DUP3 MLOAD SWAP1 DUP2 ADD DUP4 MSTORE PUSH1 0x6 DUP1 SLOAD DUP3 MSTORE PUSH1 0x7 SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x8 SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP6 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP7 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP6 DIV SWAP1 SWAP5 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x9 DUP1 SLOAD SWAP4 SWAP6 POP SWAP4 DUP6 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH3 0x128 SWAP1 PUSH3 0x416 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH3 0x156 SWAP1 PUSH3 0x416 JUMP JUMPDEST DUP1 ISZERO PUSH3 0x1A7 JUMPI DUP1 PUSH1 0x1F LT PUSH3 0x17B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH3 0x1A7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH3 0x189 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 SLOAD DUP1 DUP3 MSTORE PUSH1 0x2 SLOAD PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE DUP1 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE DUP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP5 DUP7 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE SWAP2 DUP3 MSTORE DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x4 SLOAD DUP4 MSTORE PUSH1 0x5 SLOAD DUP4 DUP4 ADD MSTORE SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 SWAP1 SWAP2 ADD MSTORE DUP1 MLOAD PUSH1 0xA SWAP1 DUP2 SWAP1 PUSH3 0x244 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0x1 DUP5 ADD SWAP1 DUP2 SSTORE SWAP2 DUP2 ADD MLOAD PUSH1 0x2 DUP5 ADD SSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x80 DUP6 ADD MLOAD PUSH7 0xFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND SWAP4 ISZERO ISZERO PUSH7 0xFFFFFFFFFFFF00 NOT AND SWAP4 SWAP1 SWAP4 OR PUSH2 0x100 PUSH6 0xFFFFFFFFFFFF SWAP5 DUP6 AND MUL OR PUSH6 0xFFFFFFFFFFFF PUSH1 0x38 SHL NOT AND PUSH8 0x100000000000000 SWAP4 SWAP1 SWAP2 AND SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0xA0 DUP2 ADD MLOAD SWAP1 SWAP2 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH3 0x2DA SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP POP PUSH1 0x40 DUP3 DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0x5 DUP5 ADD SSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD PUSH1 0x6 DUP5 ADD SSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD DUP1 MLOAD PUSH1 0x7 DUP7 ADD SSTORE DUP3 ADD MLOAD PUSH1 0x8 DUP6 ADD SSTORE PUSH1 0x80 DUP6 ADD MLOAD DUP1 MLOAD PUSH1 0x9 DUP7 ADD SSTORE DUP3 ADD MLOAD PUSH1 0xA DUP6 ADD SSTORE PUSH1 0xA0 SWAP1 SWAP5 ADD MLOAD DUP1 MLOAD PUSH1 0xB DUP6 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0xC DUP6 ADD SSTORE DUP2 ADD MLOAD PUSH1 0xD SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP1 MLOAD SWAP3 DUP4 ADD DUP2 MSTORE PUSH1 0x0 DUP1 DUP5 MSTORE DUP4 DUP4 ADD DUP2 DUP2 MSTORE DUP3 MLOAD SWAP4 DUP5 ADD DUP4 MSTORE SWAP1 DUP4 MSTORE SWAP1 DUP4 ADD DUP3 SWAP1 MSTORE DUP3 MLOAD PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR DUP2 SSTORE SWAP1 MLOAD PUSH1 0x19 SSTORE SWAP1 PUSH1 0x1A SWAP1 PUSH3 0x3A7 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP POP CALLVALUE DUP1 ISZERO PUSH3 0x3B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1FB7 CODESIZE SUB DUP1 PUSH3 0x1FB7 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x3DA SWAP2 PUSH3 0x571 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH3 0x5A3 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x42B JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH3 0x44C JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH3 0x4A0 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP7 LT ISZERO PUSH3 0x47B JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x49C JUMPI DUP3 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x487 JUMP JUMPDEST POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH3 0x4C1 JUMPI PUSH3 0x4C1 PUSH3 0x400 JUMP JUMPDEST PUSH3 0x4D9 DUP2 PUSH3 0x4D2 DUP5 SLOAD PUSH3 0x416 JUMP JUMPDEST DUP5 PUSH3 0x452 JUMP JUMPDEST PUSH1 0x20 DUP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 DUP2 EQ PUSH3 0x511 JUMPI PUSH1 0x0 DUP5 ISZERO PUSH3 0x4F8 JUMPI POP DUP6 DUP4 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP7 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP6 SWAP1 SHL OR DUP6 SSTORE PUSH3 0x49C JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP7 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x542 JUMPI DUP9 DUP7 ADD MLOAD DUP3 SSTORE SWAP5 DUP5 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 DUP5 ADD PUSH3 0x521 JUMP JUMPDEST POP DUP6 DUP3 LT ISZERO PUSH3 0x561 JUMPI DUP8 DUP6 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP9 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x584 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x59C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A04 DUP1 PUSH3 0x5B3 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3024E00C EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x7B34B621 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0xE0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0xE68 JUMP JUMPDEST PUSH2 0x101 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x1027 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0x106B JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x71 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xBB SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x71 JUMP JUMPDEST PUSH2 0xF3 PUSH2 0xEE CALLDATASIZE PUSH1 0x4 PUSH2 0x1105 JUMP JUMPDEST PUSH2 0x307 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11D JUMPI PUSH2 0x11D PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x146 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x217 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA6193531 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x183 JUMPI PUSH2 0x183 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1A7 SWAP2 SWAP1 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x1404 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1FA JUMPI PUSH2 0x1FA PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x20F DUP2 PUSH2 0x144C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x14C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x23B JUMPI PUSH2 0x23B PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x264 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x2D3 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x285 JUMPI PUSH2 0x285 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODEHASH DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2B6 JUMPI PUSH2 0x2B6 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x2CB DUP2 PUSH2 0x144C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x26A JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E7 SWAP2 SWAP1 PUSH2 0x1027 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x32B PUSH2 0xBC5 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xEE21942300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xEE219423 SWAP1 PUSH2 0x381 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x151A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x39B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3AC JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xA5D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3DA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x3EB DUP3 PUSH2 0x162C JUMP JUMPDEST SWAP1 POP PUSH32 0x1F300FA100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5D0 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x454 DUP7 PUSH1 0x4 DUP1 DUP10 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST PUSH2 0xA62 JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x467 SWAP2 SWAP1 PUSH2 0x17BF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x10 PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C7400000000000000000000000000000000 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP2 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP5 MLOAD DUP1 DUP7 ADD DUP7 MSTORE PUSH1 0x4 SLOAD DUP2 MSTORE PUSH1 0x5 SLOAD DUP2 DUP6 ADD MSTORE DUP2 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP9 SWAP13 POP SWAP7 SWAP11 POP SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP2 SWAP5 SWAP2 SWAP4 DUP6 SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH2 0x53D SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x569 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5B6 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x58B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5B6 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x599 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP8 POP SWAP8 POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0x5134B1C00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x634 DUP8 PUSH1 0x4 DUP1 DUP11 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x647 SWAP2 SWAP1 PUSH2 0x1884 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x1F PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C74576974684167677265676174696F6E00 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP10 SWAP15 POP SWAP8 SWAP13 POP SWAP6 SWAP11 POP SWAP4 SWAP9 POP SWAP2 SWAP7 POP SWAP2 SWAP5 SWAP1 SWAP4 DUP6 SWAP3 DUP5 ADD SWAP2 PUSH2 0x6E8 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x714 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x761 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x736 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x761 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x744 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0xDDFD994A00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0xA5A JUMPI PUSH1 0x0 DUP1 PUSH2 0x7DB DUP5 PUSH1 0x4 DUP1 DUP8 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x7EE SWAP2 SWAP1 PUSH2 0x195B JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP PUSH1 0xA DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD DUP1 SLOAD PUSH2 0x82E SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x85A SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8A7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x87C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x8A7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x88A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 DUP5 ADD DUP1 SLOAD DUP3 MSTORE PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP7 ADD SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP6 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP5 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x4 DUP6 ADD DUP1 SLOAD SWAP4 SWAP1 SWAP5 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH2 0x925 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x951 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x99E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x973 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x99E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x981 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP5 ADD SLOAD DUP2 MSTORE PUSH1 0x6 DUP5 ADD SLOAD PUSH1 0x20 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x7 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0x8 DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE DUP3 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x9 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0xA DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0xB DUP6 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0xC DUP6 ADD SLOAD DUP4 MSTORE PUSH1 0xD SWAP1 SWAP5 ADD SLOAD DUP3 DUP3 ADD MSTORE DUP4 ADD MSTORE PUSH1 0x80 ADD MSTORE SWAP2 SWAP10 SWAP2 SWAP9 POP SWAP1 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST POP POP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xA70 DUP2 PUSH1 0x1F PUSH2 0x19B6 JUMP JUMPDEST LT ISZERO PUSH2 0xADD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAE7 DUP3 DUP5 PUSH2 0x19B6 JUMP JUMPDEST DUP5 MLOAD LT ISZERO PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F75744F66426F756E6473000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xAD4 JUMP JUMPDEST PUSH1 0x60 DUP3 ISZERO DUP1 ISZERO PUSH2 0xB70 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0xBBA JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F DUP5 AND DUP1 ISZERO PUSH1 0x20 MUL DUP2 DUP5 ADD ADD DUP6 DUP2 ADD DUP8 DUP4 ISZERO PUSH1 0x20 MUL DUP5 DUP12 ADD ADD ADD JUMPDEST DUP2 DUP4 LT ISZERO PUSH2 0xBA9 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xB91 JUMP JUMPDEST POP POP DUP6 DUP5 MSTORE PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x40 MSTORE POP JUMPDEST POP SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x60 DUP1 DUP4 MSTORE DUP4 MLOAD SWAP2 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE SWAP5 DUP4 ADD DUP2 SWAP1 MSTORE DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE SWAP1 SWAP2 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC26 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC48 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC6A PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC77 PUSH2 0xC7C JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC77 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xCE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xDAE JUMPI PUSH2 0xDAE PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD0 JUMPI PUSH2 0xDD0 PUSH2 0xCE6 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xDE5 DUP2 PUSH2 0xCC1 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xE04 JUMPI PUSH2 0xE04 PUSH2 0xCE6 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xE23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE36 PUSH2 0xE31 DUP3 PUSH2 0xDEA JUMP JUMPDEST PUSH2 0xD85 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xE4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0xE86 DUP2 PUSH2 0xCC1 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xEA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xEB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEC6 PUSH2 0xE31 DUP3 PUSH2 0xDB6 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP4 ADD DUP5 ADD SWAP1 DUP5 DUP2 ADD SWAP1 DUP10 DUP4 GT ISZERO PUSH2 0xEE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 DUP6 ADD JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1016 JUMPI DUP1 CALLDATALOAD DUP6 DUP2 GT ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 ADD PUSH2 0x160 DUP2 DUP14 SUB PUSH1 0x1F NOT ADD SLT ISZERO PUSH2 0xF17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF1F PUSH2 0xD15 JUMP JUMPDEST PUSH2 0xF2A DUP10 DUP4 ADD PUSH2 0xDDA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP10 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0xF47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF55 DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7B DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x100 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x120 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0xFCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFD8 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH2 0x120 DUP5 ADD MSTORE POP PUSH2 0x160 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0xFF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1000 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xE12 JUMP JUMPDEST SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP5 MSTORE POP SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0xEE9 JUMP JUMPDEST POP DUP1 SWAP7 POP POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x105F JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1043 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x107E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1095 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x10A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x10B4 PUSH2 0xE31 DUP3 PUSH2 0xDB6 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP3 ADD DUP4 ADD SWAP1 DUP4 DUP2 ADD SWAP1 DUP8 DUP4 GT ISZERO PUSH2 0x10D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 DUP5 ADD SWAP3 JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x10FA JUMPI DUP4 CALLDATALOAD PUSH2 0x10EB DUP2 PUSH2 0xCC1 JUMP JUMPDEST DUP3 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH2 0x10D8 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0xBBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x115C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1144 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x116B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1189 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1141 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 MSTORE DUP5 MLOAD ISZERO ISZERO DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE DUP2 DUP7 ADD MLOAD PUSH1 0x60 PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x11CF PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 SUB DUP3 DUP7 ADD MSTORE PUSH2 0x160 DUP7 MLOAD DUP2 DUP4 MSTORE PUSH2 0x11EC DUP3 DUP5 ADD DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP8 ADD MLOAD DUP3 DUP3 SUB DUP5 DUP5 ADD MSTORE DUP1 MLOAD DUP3 MSTORE DUP4 DUP2 ADD MLOAD DUP5 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD ISZERO ISZERO DUP6 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD SWAP4 POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE DUP1 PUSH1 0x80 DUP4 ADD MLOAD AND PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xA0 DUP2 ADD MLOAD SWAP4 POP POP PUSH1 0xC0 PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x124F PUSH1 0xC0 DUP3 ADD DUP5 PUSH2 0x1171 JUMP JUMPDEST SWAP3 POP POP DUP3 DUP7 ADD MLOAD PUSH2 0x126C DUP5 DUP4 ADD DUP3 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0x80 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0xA0 DUP7 ADD MLOAD SWAP3 POP PUSH2 0x12DD PUSH2 0x100 DUP3 ADD DUP5 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP1 MLOAD DUP3 DUP5 ADD MSTORE ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x133D PUSH1 0x20 DUP3 ADD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x160 DUP1 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x1365 PUSH2 0x180 DUP6 ADD DUP4 PUSH2 0x1171 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x1F NOT DUP1 DUP7 DUP6 SUB ADD PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x1383 DUP5 DUP4 PUSH2 0x1171 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0xC0 DUP8 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH1 0xE0 DUP8 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD SWAP2 POP PUSH2 0x100 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x120 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x140 DUP2 DUP8 DUP7 SUB ADD DUP2 DUP9 ADD MSTORE PUSH2 0x13DE DUP6 DUP5 PUSH2 0x1171 JUMP JUMPDEST SWAP1 DUP9 ADD MLOAD DUP8 DUP3 SUB SWAP1 SWAP3 ADD DUP5 DUP9 ADD MSTORE SWAP4 POP SWAP1 POP PUSH2 0x13FA DUP4 DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x147D JUMPI PUSH2 0x147D PUSH2 0x141D JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x14B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x14E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x1548 PUSH1 0x20 DUP3 ADD PUSH2 0x152E DUP5 PUSH2 0xDDA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x1561 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x1484 JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x1579 PUSH2 0x180 DUP7 ADD DUP4 DUP6 PUSH2 0x14EF JUMP JUMPDEST SWAP3 POP PUSH2 0x1588 PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x1484 JUMP JUMPDEST SWAP3 POP PUSH1 0x1F NOT DUP1 DUP8 DUP7 SUB ADD PUSH1 0x80 DUP9 ADD MSTORE PUSH2 0x15A2 DUP6 DUP6 DUP5 PUSH2 0x14EF JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 SWAP4 POP PUSH1 0xE0 DUP9 ADD CALLDATALOAD DUP5 DUP9 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP4 DUP9 ADD CALLDATALOAD DUP3 DUP9 ADD MSTORE PUSH2 0x15E9 DUP3 DUP10 ADD DUP10 PUSH2 0x1484 JUMP JUMPDEST SWAP5 POP SWAP2 POP PUSH2 0x140 DUP2 DUP9 DUP8 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x1604 DUP7 DUP7 DUP6 PUSH2 0x14EF JUMP JUMPDEST SWAP6 POP PUSH2 0x1612 DUP2 DUP11 ADD DUP11 PUSH2 0x1484 JUMP JUMPDEST SWAP6 POP SWAP3 POP POP DUP1 DUP8 DUP7 SUB ADD DUP4 DUP9 ADD MSTORE POP PUSH2 0x10FA DUP5 DUP5 DUP4 PUSH2 0x14EF JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 AND SWAP4 POP PUSH1 0x4 DUP4 LT ISZERO PUSH2 0x1674 JUMPI DUP1 DUP2 DUP5 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP4 POP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x168E JUMPI PUSH2 0x168E PUSH2 0x141D JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xDE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x16B7 PUSH2 0xE31 DUP5 PUSH2 0xDEA JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE DUP4 DUP4 DUP4 ADD GT ISZERO PUSH2 0x16CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBBE DUP4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1141 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x16EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBBE DUP4 DUP4 MLOAD PUSH1 0x20 DUP6 ADD PUSH2 0x16A9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x170B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1713 PUSH2 0xD3F JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1747 PUSH1 0x60 DUP4 ADD PUSH2 0x1693 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x1758 PUSH1 0x80 DUP4 ADD PUSH2 0x1693 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1777 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1783 DUP5 DUP3 DUP6 ADD PUSH2 0x16D9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17A9 PUSH2 0xD62 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17F8 DUP8 DUP3 DUP9 ADD PUSH2 0x16F9 JUMP JUMPDEST SWAP5 POP POP PUSH2 0x1808 DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP3 POP PUSH2 0x1817 DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP2 POP PUSH2 0x1826 DUP7 PUSH1 0xA0 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x1845 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x187E JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 DUP8 SUB PUSH2 0x140 DUP2 SLT ISZERO PUSH2 0x189E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18C1 DUP10 DUP3 DUP11 ADD PUSH2 0x16F9 JUMP JUMPDEST SWAP7 POP POP PUSH2 0x18D1 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP5 POP PUSH2 0x18E0 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP4 POP PUSH2 0x18EF DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP3 POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 DUP3 ADD SLT ISZERO PUSH2 0x1921 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x192A PUSH2 0xD62 JUMP JUMPDEST PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1938 DUP2 PUSH2 0xCC1 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1948 DUP9 PUSH2 0x100 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x196E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x198C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x199D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19AC DUP6 DUP3 MLOAD PUSH1 0x20 DUP5 ADD PUSH2 0x16A9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x19C9 JUMPI PUSH2 0x19C9 PUSH2 0x141D JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE8 0xBA JUMPDEST 0xB4 0xB5 0xE1 EXTCODEHASH 0xF9 PUSH16 0x7485FAE52CA1D36B02D4FDFA3A724091 0x26 DUP7 0xC3 0xE4 JUMPDEST STOP 0xBC PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":":::-:0;189:9137:50;3754:15;;;;;;;3719:50;;;;;;;;3754:15;3825:47;;;;;;;;;;;;;3775:97;;;-1:-1:-1;;;;;;3775:97:50;;;;;;;;;;;3825:47;3915:43;;;;;;;;;;;;;;;;;;;;3945:12;;;;-1:-1:-1;3945:12:50;3915:43;;;;3878:80;;;;;;;;;;;;-1:-1:-1;;;;;;3878:80:50;;;3825:47;;3878:80;;;;;;;:::i;:::-;-1:-1:-1;;3997:98:50;;;;;;;;-1:-1:-1;3997:98:50;;;;;;;;;;;;;;;;;4010:15;3997:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3997:98:50;;;;;;;;-1:-1:-1;3997:98:50;;;;;;4010:15;;3997:98;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3997:98:50;;;;-1:-1:-1;;;3997:98:50;;;;;;;;;;4027:14;3997:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4075:19;3997:98;-1:-1:-1;;;;;3997:98:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3964:131;;;;;;;;;;:::i;:::-;-1:-1:-1;3964:131:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3964:131:50;;;;;;-1:-1:-1;;3964:131:50;;;;;;;;;;;;-1:-1:-1;;;;3964:131:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;3964:131:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3964:131:50;-1:-1:-1;;;;;3964:131:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4140:28;;;;;;;-1:-1:-1;4140:28:50;;;;;;;;;;;;;;;;;;;;;;;;;4101:67;;;;;-1:-1:-1;;4101:67:50;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4175:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4222:10;:24;;-1:-1:-1;;;;;;4222:24:50;-1:-1:-1;;;;;4222:24:50;;;;;;;;;;189:9137;;14:127:111;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:380;225:1;221:12;;;;268;;;289:61;;343:4;335:6;331:17;321:27;;289:61;396:2;388:6;385:14;365:18;362:38;359:161;;442:10;437:3;433:20;430:1;423:31;477:4;474:1;467:15;505:4;502:1;495:15;359:161;;146:380;;;:::o;656:544::-;757:2;752:3;749:11;746:448;;;793:1;818:5;814:2;807:17;863:4;859:2;849:19;933:2;921:10;917:19;914:1;910:27;904:4;900:38;969:4;957:10;954:20;951:47;;;-1:-1:-1;992:4:111;951:47;1047:2;1042:3;1038:12;1035:1;1031:20;1025:4;1021:31;1011:41;;1102:82;1120:2;1113:5;1110:13;1102:82;;;1165:17;;;1146:1;1135:13;1102:82;;;1106:3;;;746:448;656:544;;;:::o;1376:1348::-;1494:10;;-1:-1:-1;;;;;1516:30:111;;1513:56;;;1549:18;;:::i;:::-;1578:96;1667:6;1627:38;1659:4;1653:11;1627:38;:::i;:::-;1621:4;1578:96;:::i;:::-;1729:4;;1793:2;1782:14;;1810:1;1805:662;;;;2511:1;2528:6;2525:89;;;-1:-1:-1;2580:19:111;;;2574:26;2525:89;-1:-1:-1;;1333:1:111;1329:11;;;1325:24;1321:29;1311:40;1357:1;1353:11;;;1308:57;2627:81;;1775:943;;1805:662;603:1;596:14;;;640:4;627:18;;-1:-1:-1;;1841:20:111;;;1958:236;1972:7;1969:1;1966:14;1958:236;;;2061:19;;;2055:26;2040:42;;2153:27;;;;2121:1;2109:14;;;;1988:19;;1958:236;;;1962:3;2222:6;2213:7;2210:19;2207:201;;;2283:19;;;2277:26;-1:-1:-1;;2366:1:111;2362:14;;;2378:3;2358:24;2354:37;2350:42;2335:58;2320:74;;2207:201;-1:-1:-1;;;;;2454:1:111;2438:14;;;2434:22;2421:36;;-1:-1:-1;1376:1348:111:o;4084:311::-;4175:6;4228:2;4216:9;4207:7;4203:23;4199:32;4196:52;;;4244:1;4241;4234:12;4196:52;4270:16;;-1:-1:-1;;;;;4315:31:111;;4305:42;;4295:70;;4361:1;4358;4351:12;4295:70;4384:5;4084:311;-1:-1:-1;;;4084:311:111:o;:::-;189:9137:50;;;;;;"},"deployedBytecode":{"functionDebugData":{"@entryPoint_6800":{"entryPoint":null,"id":6800,"parameterSlots":0,"returnSlots":0},"@getCodeHashes_7165":{"entryPoint":542,"id":7165,"parameterSlots":1,"returnSlots":1},"@getUserOpHashes_7110":{"entryPoint":257,"id":7110,"parameterSlots":2,"returnSlots":1},"@simulateValidation_7024":{"entryPoint":775,"id":7024,"parameterSlots":1,"returnSlots":2},"@slice_7061":{"entryPoint":2658,"id":7061,"parameterSlots":3,"returnSlots":1},"abi_decode_address":{"entryPoint":3546,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_available_length_bytes_fromMemory":{"entryPoint":5801,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes":{"entryPoint":3602,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_fromMemory":{"entryPoint":5849,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_ReturnInfo_fromMemory":{"entryPoint":5881,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_StakeInfo_fromMemory":{"entryPoint":6031,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr":{"entryPoint":4203,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":5124,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr":{"entryPoint":3688,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptr_fromMemory":{"entryPoint":6079,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_AggregatorStakeInfo_$6732_memory_ptr_fromMemory":{"entryPoint":6276,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":4357,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory":{"entryPoint":6491,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48_fromMemory":{"entryPoint":5779,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes_calldata":{"entryPoint":5359,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":4465,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_AggregatorStakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_struct_StakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed":{"entryPoint":4135,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__to_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__fromStack_reversed":{"entryPoint":4509,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed":{"entryPoint":5402,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_struct$_UserOperation_$10993_memory_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed":{"entryPoint":4886,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":3461,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_3193":{"entryPoint":3349,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_3194":{"entryPoint":3391,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_3195":{"entryPoint":3426,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_UserOperation_dyn":{"entryPoint":3510,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":3562,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_access_bytes_calldata":{"entryPoint":5252,"id":null,"parameterSlots":2,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":6582,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":5756,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4":{"entryPoint":5676,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":4417,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":6193,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":5196,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":5149,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":4839,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":3302,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_contract_IEntryPoint":{"entryPoint":3265,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:22213:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"159:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"168:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"161:6:111"},"nodeType":"YulFunctionCall","src":"161:12:111"},"nodeType":"YulExpressionStatement","src":"161:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"113:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:73:111"},"nodeType":"YulIf","src":"82:93:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:167:111"},{"body":{"nodeType":"YulBlock","src":"218:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"235:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"238:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:88:111"},"nodeType":"YulExpressionStatement","src":"228:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"332:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"335:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"325:6:111"},"nodeType":"YulFunctionCall","src":"325:15:111"},"nodeType":"YulExpressionStatement","src":"325:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"356:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"359:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"349:6:111"},"nodeType":"YulFunctionCall","src":"349:15:111"},"nodeType":"YulExpressionStatement","src":"349:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"186:184:111"},{"body":{"nodeType":"YulBlock","src":"421:209:111","statements":[{"nodeType":"YulAssignment","src":"431:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"447:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"441:5:111"},"nodeType":"YulFunctionCall","src":"441:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"431:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"459:37:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"481:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"489:6:111","type":"","value":"0x0160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"477:3:111"},"nodeType":"YulFunctionCall","src":"477:19:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"463:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"571:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"573:16:111"},"nodeType":"YulFunctionCall","src":"573:18:111"},"nodeType":"YulExpressionStatement","src":"573:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"514:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"526:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"511:2:111"},"nodeType":"YulFunctionCall","src":"511:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"550:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"562:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"547:2:111"},"nodeType":"YulFunctionCall","src":"547:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"508:2:111"},"nodeType":"YulFunctionCall","src":"508:62:111"},"nodeType":"YulIf","src":"505:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"609:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"613:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"602:6:111"},"nodeType":"YulFunctionCall","src":"602:22:111"},"nodeType":"YulExpressionStatement","src":"602:22:111"}]},"name":"allocate_memory_3193","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"410:6:111","type":""}],"src":"375:255:111"},{"body":{"nodeType":"YulBlock","src":"681:207:111","statements":[{"nodeType":"YulAssignment","src":"691:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"707:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"701:5:111"},"nodeType":"YulFunctionCall","src":"701:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"691:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"719:35:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"741:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"749:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"737:3:111"},"nodeType":"YulFunctionCall","src":"737:17:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"723:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"829:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"831:16:111"},"nodeType":"YulFunctionCall","src":"831:18:111"},"nodeType":"YulExpressionStatement","src":"831:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"772:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"784:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"769:2:111"},"nodeType":"YulFunctionCall","src":"769:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"808:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"820:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"805:2:111"},"nodeType":"YulFunctionCall","src":"805:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"766:2:111"},"nodeType":"YulFunctionCall","src":"766:62:111"},"nodeType":"YulIf","src":"763:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"867:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"871:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"860:6:111"},"nodeType":"YulFunctionCall","src":"860:22:111"},"nodeType":"YulExpressionStatement","src":"860:22:111"}]},"name":"allocate_memory_3194","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"670:6:111","type":""}],"src":"635:253:111"},{"body":{"nodeType":"YulBlock","src":"939:211:111","statements":[{"nodeType":"YulAssignment","src":"949:21:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"965:4:111","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"959:5:111"},"nodeType":"YulFunctionCall","src":"959:11:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"949:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"979:35:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1001:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1009:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"997:3:111"},"nodeType":"YulFunctionCall","src":"997:17:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"983:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1089:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1091:16:111"},"nodeType":"YulFunctionCall","src":"1091:18:111"},"nodeType":"YulExpressionStatement","src":"1091:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1032:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1044:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1029:2:111"},"nodeType":"YulFunctionCall","src":"1029:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1068:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1080:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1065:2:111"},"nodeType":"YulFunctionCall","src":"1065:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1026:2:111"},"nodeType":"YulFunctionCall","src":"1026:62:111"},"nodeType":"YulIf","src":"1023:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1127:4:111","type":"","value":"0x40"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1133:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1120:6:111"},"nodeType":"YulFunctionCall","src":"1120:24:111"},"nodeType":"YulExpressionStatement","src":"1120:24:111"}]},"name":"allocate_memory_3195","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"928:6:111","type":""}],"src":"893:257:111"},{"body":{"nodeType":"YulBlock","src":"1200:289:111","statements":[{"nodeType":"YulAssignment","src":"1210:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1226:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1220:5:111"},"nodeType":"YulFunctionCall","src":"1220:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1210:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1238:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1260:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"1276:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"1282:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1272:3:111"},"nodeType":"YulFunctionCall","src":"1272:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"1287:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1268:3:111"},"nodeType":"YulFunctionCall","src":"1268:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1256:3:111"},"nodeType":"YulFunctionCall","src":"1256:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1242:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1430:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1432:16:111"},"nodeType":"YulFunctionCall","src":"1432:18:111"},"nodeType":"YulExpressionStatement","src":"1432:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1373:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1385:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1370:2:111"},"nodeType":"YulFunctionCall","src":"1370:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1409:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1421:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1406:2:111"},"nodeType":"YulFunctionCall","src":"1406:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1367:2:111"},"nodeType":"YulFunctionCall","src":"1367:62:111"},"nodeType":"YulIf","src":"1364:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1468:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1472:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1461:6:111"},"nodeType":"YulFunctionCall","src":"1461:22:111"},"nodeType":"YulExpressionStatement","src":"1461:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"1180:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1189:6:111","type":""}],"src":"1155:334:111"},{"body":{"nodeType":"YulBlock","src":"1576:114:111","statements":[{"body":{"nodeType":"YulBlock","src":"1620:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1622:16:111"},"nodeType":"YulFunctionCall","src":"1622:18:111"},"nodeType":"YulExpressionStatement","src":"1622:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1592:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1600:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1589:2:111"},"nodeType":"YulFunctionCall","src":"1589:30:111"},"nodeType":"YulIf","src":"1586:56:111"},{"nodeType":"YulAssignment","src":"1651:33:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1667:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"1670:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1663:3:111"},"nodeType":"YulFunctionCall","src":"1663:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"1679:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1659:3:111"},"nodeType":"YulFunctionCall","src":"1659:25:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"1651:4:111"}]}]},"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"1556:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"1567:4:111","type":""}],"src":"1494:196:111"},{"body":{"nodeType":"YulBlock","src":"1744:98:111","statements":[{"nodeType":"YulAssignment","src":"1754:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1776:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1763:12:111"},"nodeType":"YulFunctionCall","src":"1763:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"1754:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1830:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"1792:37:111"},"nodeType":"YulFunctionCall","src":"1792:44:111"},"nodeType":"YulExpressionStatement","src":"1792:44:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1723:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"1734:5:111","type":""}],"src":"1695:147:111"},{"body":{"nodeType":"YulBlock","src":"1904:188:111","statements":[{"body":{"nodeType":"YulBlock","src":"1948:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1950:16:111"},"nodeType":"YulFunctionCall","src":"1950:18:111"},"nodeType":"YulExpressionStatement","src":"1950:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1920:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1928:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1917:2:111"},"nodeType":"YulFunctionCall","src":"1917:30:111"},"nodeType":"YulIf","src":"1914:56:111"},{"nodeType":"YulAssignment","src":"1979:107:111","value":{"arguments":[{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1999:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2007:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1995:3:111"},"nodeType":"YulFunctionCall","src":"1995:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2012:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1991:3:111"},"nodeType":"YulFunctionCall","src":"1991:88:111"},{"kind":"number","nodeType":"YulLiteral","src":"2081:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1987:3:111"},"nodeType":"YulFunctionCall","src":"1987:99:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"1979:4:111"}]}]},"name":"array_allocation_size_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"1884:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"1895:4:111","type":""}],"src":"1847:245:111"},{"body":{"nodeType":"YulBlock","src":"2149:410:111","statements":[{"body":{"nodeType":"YulBlock","src":"2198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2200:6:111"},"nodeType":"YulFunctionCall","src":"2200:12:111"},"nodeType":"YulExpressionStatement","src":"2200:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2177:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2185:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2173:3:111"},"nodeType":"YulFunctionCall","src":"2173:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"2192:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2169:3:111"},"nodeType":"YulFunctionCall","src":"2169:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2162:6:111"},"nodeType":"YulFunctionCall","src":"2162:35:111"},"nodeType":"YulIf","src":"2159:55:111"},{"nodeType":"YulVariableDeclaration","src":"2223:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2246:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2233:12:111"},"nodeType":"YulFunctionCall","src":"2233:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2227:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2262:63:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2321:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"2293:27:111"},"nodeType":"YulFunctionCall","src":"2293:31:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"2277:15:111"},"nodeType":"YulFunctionCall","src":"2277:48:111"},"variables":[{"name":"array_1","nodeType":"YulTypedName","src":"2266:7:111","type":""}]},{"expression":{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2341:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2350:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2334:6:111"},"nodeType":"YulFunctionCall","src":"2334:19:111"},"nodeType":"YulExpressionStatement","src":"2334:19:111"},{"body":{"nodeType":"YulBlock","src":"2401:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2410:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2413:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2403:6:111"},"nodeType":"YulFunctionCall","src":"2403:12:111"},"nodeType":"YulExpressionStatement","src":"2403:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2376:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2384:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2372:3:111"},"nodeType":"YulFunctionCall","src":"2372:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2389:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2368:3:111"},"nodeType":"YulFunctionCall","src":"2368:26:111"},{"name":"end","nodeType":"YulIdentifier","src":"2396:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2365:2:111"},"nodeType":"YulFunctionCall","src":"2365:35:111"},"nodeType":"YulIf","src":"2362:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2443:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"2452:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2439:3:111"},"nodeType":"YulFunctionCall","src":"2439:18:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2463:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2471:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2459:3:111"},"nodeType":"YulFunctionCall","src":"2459:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2478:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2426:12:111"},"nodeType":"YulFunctionCall","src":"2426:55:111"},"nodeType":"YulExpressionStatement","src":"2426:55:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2505:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2514:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2501:3:111"},"nodeType":"YulFunctionCall","src":"2501:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2519:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2497:3:111"},"nodeType":"YulFunctionCall","src":"2497:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"2526:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2490:6:111"},"nodeType":"YulFunctionCall","src":"2490:38:111"},"nodeType":"YulExpressionStatement","src":"2490:38:111"},{"nodeType":"YulAssignment","src":"2537:16:111","value":{"name":"array_1","nodeType":"YulIdentifier","src":"2546:7:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"2537:5:111"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2123:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2131:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"2139:5:111","type":""}],"src":"2097:462:111"},{"body":{"nodeType":"YulBlock","src":"2729:2547:111","statements":[{"body":{"nodeType":"YulBlock","src":"2775:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2784:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2787:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2777:6:111"},"nodeType":"YulFunctionCall","src":"2777:12:111"},"nodeType":"YulExpressionStatement","src":"2777:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2750:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2759:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2746:3:111"},"nodeType":"YulFunctionCall","src":"2746:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2771:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2742:3:111"},"nodeType":"YulFunctionCall","src":"2742:32:111"},"nodeType":"YulIf","src":"2739:52:111"},{"nodeType":"YulVariableDeclaration","src":"2800:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2826:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2813:12:111"},"nodeType":"YulFunctionCall","src":"2813:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2804:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2883:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"2845:37:111"},"nodeType":"YulFunctionCall","src":"2845:44:111"},"nodeType":"YulExpressionStatement","src":"2845:44:111"},{"nodeType":"YulAssignment","src":"2898:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2908:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2898:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2922:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2932:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2926:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2943:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2974:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2985:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2970:3:111"},"nodeType":"YulFunctionCall","src":"2970:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2957:12:111"},"nodeType":"YulFunctionCall","src":"2957:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2947:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2998:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3008:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3002:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3053:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3062:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3065:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3055:6:111"},"nodeType":"YulFunctionCall","src":"3055:12:111"},"nodeType":"YulExpressionStatement","src":"3055:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3041:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3049:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3038:2:111"},"nodeType":"YulFunctionCall","src":"3038:14:111"},"nodeType":"YulIf","src":"3035:34:111"},{"nodeType":"YulVariableDeclaration","src":"3078:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3092:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3103:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3088:3:111"},"nodeType":"YulFunctionCall","src":"3088:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"3082:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3158:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3167:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3170:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3160:6:111"},"nodeType":"YulFunctionCall","src":"3160:12:111"},"nodeType":"YulExpressionStatement","src":"3160:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3137:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3141:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3133:3:111"},"nodeType":"YulFunctionCall","src":"3133:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3148:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3129:3:111"},"nodeType":"YulFunctionCall","src":"3129:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3122:6:111"},"nodeType":"YulFunctionCall","src":"3122:35:111"},"nodeType":"YulIf","src":"3119:55:111"},{"nodeType":"YulVariableDeclaration","src":"3183:26:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3206:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3193:12:111"},"nodeType":"YulFunctionCall","src":"3193:16:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"3187:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3218:84:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"3298:2:111"}],"functionName":{"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulIdentifier","src":"3245:52:111"},"nodeType":"YulFunctionCall","src":"3245:56:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"3229:15:111"},"nodeType":"YulFunctionCall","src":"3229:73:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"3222:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3311:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"3324:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"3315:5:111","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3343:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"3348:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3336:6:111"},"nodeType":"YulFunctionCall","src":"3336:15:111"},"nodeType":"YulExpressionStatement","src":"3336:15:111"},{"nodeType":"YulAssignment","src":"3360:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3371:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3376:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3367:3:111"},"nodeType":"YulFunctionCall","src":"3367:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"3360:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"3388:42:111","value":{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3410:2:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"5"},{"name":"_4","nodeType":"YulIdentifier","src":"3421:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3414:3:111"},"nodeType":"YulFunctionCall","src":"3414:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3406:3:111"},"nodeType":"YulFunctionCall","src":"3406:19:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3427:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3402:3:111"},"nodeType":"YulFunctionCall","src":"3402:28:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"3392:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3462:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3471:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3474:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3464:6:111"},"nodeType":"YulFunctionCall","src":"3464:12:111"},"nodeType":"YulExpressionStatement","src":"3464:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"3445:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3453:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3442:2:111"},"nodeType":"YulFunctionCall","src":"3442:19:111"},"nodeType":"YulIf","src":"3439:39:111"},{"nodeType":"YulVariableDeclaration","src":"3487:22:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3502:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3506:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3498:3:111"},"nodeType":"YulFunctionCall","src":"3498:11:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"3491:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3574:1672:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3588:36:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3620:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3607:12:111"},"nodeType":"YulFunctionCall","src":"3607:17:111"},"variables":[{"name":"innerOffset","nodeType":"YulTypedName","src":"3592:11:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3660:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3669:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3672:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3662:6:111"},"nodeType":"YulFunctionCall","src":"3662:12:111"},"nodeType":"YulExpressionStatement","src":"3662:12:111"}]},"condition":{"arguments":[{"name":"innerOffset","nodeType":"YulIdentifier","src":"3643:11:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3656:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3640:2:111"},"nodeType":"YulFunctionCall","src":"3640:19:111"},"nodeType":"YulIf","src":"3637:39:111"},{"nodeType":"YulVariableDeclaration","src":"3689:30:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3703:2:111"},{"name":"innerOffset","nodeType":"YulIdentifier","src":"3707:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3699:3:111"},"nodeType":"YulFunctionCall","src":"3699:20:111"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"3693:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3838:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3847:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3850:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3840:6:111"},"nodeType":"YulFunctionCall","src":"3840:12:111"},"nodeType":"YulExpressionStatement","src":"3840:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3747:7:111"},{"name":"_5","nodeType":"YulIdentifier","src":"3756:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3743:3:111"},"nodeType":"YulFunctionCall","src":"3743:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"3761:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3739:3:111"},"nodeType":"YulFunctionCall","src":"3739:89:111"},{"kind":"number","nodeType":"YulLiteral","src":"3830:6:111","type":"","value":"0x0160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3735:3:111"},"nodeType":"YulFunctionCall","src":"3735:102:111"},"nodeType":"YulIf","src":"3732:122:111"},{"nodeType":"YulVariableDeclaration","src":"3867:37:111","value":{"arguments":[],"functionName":{"name":"allocate_memory_3193","nodeType":"YulIdentifier","src":"3882:20:111"},"nodeType":"YulFunctionCall","src":"3882:22:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"3871:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"3924:7:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"3956:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3960:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3952:3:111"},"nodeType":"YulFunctionCall","src":"3952:11:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3933:18:111"},"nodeType":"YulFunctionCall","src":"3933:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3917:6:111"},"nodeType":"YulFunctionCall","src":"3917:48:111"},"nodeType":"YulExpressionStatement","src":"3917:48:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"3989:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3998:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3985:3:111"},"nodeType":"YulFunctionCall","src":"3985:16:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4020:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4024:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4016:3:111"},"nodeType":"YulFunctionCall","src":"4016:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4003:12:111"},"nodeType":"YulFunctionCall","src":"4003:25:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3978:6:111"},"nodeType":"YulFunctionCall","src":"3978:51:111"},"nodeType":"YulExpressionStatement","src":"3978:51:111"},{"nodeType":"YulVariableDeclaration","src":"4042:41:111","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4075:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4079:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4071:3:111"},"nodeType":"YulFunctionCall","src":"4071:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4058:12:111"},"nodeType":"YulFunctionCall","src":"4058:25:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4046:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4116:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4125:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4128:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4118:6:111"},"nodeType":"YulFunctionCall","src":"4118:12:111"},"nodeType":"YulExpressionStatement","src":"4118:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4102:8:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4112:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4099:2:111"},"nodeType":"YulFunctionCall","src":"4099:16:111"},"nodeType":"YulIf","src":"4096:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4156:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4165:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4152:3:111"},"nodeType":"YulFunctionCall","src":"4152:16:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4195:2:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4199:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4191:3:111"},"nodeType":"YulFunctionCall","src":"4191:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4210:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4187:3:111"},"nodeType":"YulFunctionCall","src":"4187:26:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4215:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4170:16:111"},"nodeType":"YulFunctionCall","src":"4170:53:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4145:6:111"},"nodeType":"YulFunctionCall","src":"4145:79:111"},"nodeType":"YulExpressionStatement","src":"4145:79:111"},{"nodeType":"YulVariableDeclaration","src":"4237:42:111","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4270:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4274:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4266:3:111"},"nodeType":"YulFunctionCall","src":"4266:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4253:12:111"},"nodeType":"YulFunctionCall","src":"4253:26:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"4241:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4312:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4321:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4324:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4314:6:111"},"nodeType":"YulFunctionCall","src":"4314:12:111"},"nodeType":"YulExpressionStatement","src":"4314:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"4298:8:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4308:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4295:2:111"},"nodeType":"YulFunctionCall","src":"4295:16:111"},"nodeType":"YulIf","src":"4292:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4352:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4361:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4348:3:111"},"nodeType":"YulFunctionCall","src":"4348:16:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4391:2:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"4395:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4387:3:111"},"nodeType":"YulFunctionCall","src":"4387:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4406:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4383:3:111"},"nodeType":"YulFunctionCall","src":"4383:26:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4411:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4366:16:111"},"nodeType":"YulFunctionCall","src":"4366:53:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4341:6:111"},"nodeType":"YulFunctionCall","src":"4341:79:111"},"nodeType":"YulExpressionStatement","src":"4341:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4444:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4453:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4440:3:111"},"nodeType":"YulFunctionCall","src":"4440:17:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4476:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4480:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4472:3:111"},"nodeType":"YulFunctionCall","src":"4472:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4459:12:111"},"nodeType":"YulFunctionCall","src":"4459:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4433:6:111"},"nodeType":"YulFunctionCall","src":"4433:53:111"},"nodeType":"YulExpressionStatement","src":"4433:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4510:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4519:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4506:3:111"},"nodeType":"YulFunctionCall","src":"4506:17:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4542:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4546:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4538:3:111"},"nodeType":"YulFunctionCall","src":"4538:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4525:12:111"},"nodeType":"YulFunctionCall","src":"4525:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4499:6:111"},"nodeType":"YulFunctionCall","src":"4499:53:111"},"nodeType":"YulExpressionStatement","src":"4499:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4576:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4585:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4572:3:111"},"nodeType":"YulFunctionCall","src":"4572:17:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4608:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4612:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4604:3:111"},"nodeType":"YulFunctionCall","src":"4604:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4591:12:111"},"nodeType":"YulFunctionCall","src":"4591:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4565:6:111"},"nodeType":"YulFunctionCall","src":"4565:53:111"},"nodeType":"YulExpressionStatement","src":"4565:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4642:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4651:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4638:3:111"},"nodeType":"YulFunctionCall","src":"4638:17:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4674:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4678:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4670:3:111"},"nodeType":"YulFunctionCall","src":"4670:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4657:12:111"},"nodeType":"YulFunctionCall","src":"4657:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4631:6:111"},"nodeType":"YulFunctionCall","src":"4631:53:111"},"nodeType":"YulExpressionStatement","src":"4631:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4708:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4717:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4704:3:111"},"nodeType":"YulFunctionCall","src":"4704:17:111"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4740:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4744:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4736:3:111"},"nodeType":"YulFunctionCall","src":"4736:12:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4723:12:111"},"nodeType":"YulFunctionCall","src":"4723:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4697:6:111"},"nodeType":"YulFunctionCall","src":"4697:53:111"},"nodeType":"YulExpressionStatement","src":"4697:53:111"},{"nodeType":"YulVariableDeclaration","src":"4763:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4773:3:111","type":"","value":"320"},"variables":[{"name":"_6","nodeType":"YulTypedName","src":"4767:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4789:41:111","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4822:2:111"},{"name":"_6","nodeType":"YulIdentifier","src":"4826:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4818:3:111"},"nodeType":"YulFunctionCall","src":"4818:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4805:12:111"},"nodeType":"YulFunctionCall","src":"4805:25:111"},"variables":[{"name":"offset_3","nodeType":"YulTypedName","src":"4793:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4863:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4872:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4875:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4865:6:111"},"nodeType":"YulFunctionCall","src":"4865:12:111"},"nodeType":"YulExpressionStatement","src":"4865:12:111"}]},"condition":{"arguments":[{"name":"offset_3","nodeType":"YulIdentifier","src":"4849:8:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4859:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4846:2:111"},"nodeType":"YulFunctionCall","src":"4846:16:111"},"nodeType":"YulIf","src":"4843:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4903:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4912:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4899:3:111"},"nodeType":"YulFunctionCall","src":"4899:17:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4943:2:111"},{"name":"offset_3","nodeType":"YulIdentifier","src":"4947:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4939:3:111"},"nodeType":"YulFunctionCall","src":"4939:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4958:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4935:3:111"},"nodeType":"YulFunctionCall","src":"4935:26:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4963:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4918:16:111"},"nodeType":"YulFunctionCall","src":"4918:53:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4892:6:111"},"nodeType":"YulFunctionCall","src":"4892:80:111"},"nodeType":"YulExpressionStatement","src":"4892:80:111"},{"nodeType":"YulVariableDeclaration","src":"4985:45:111","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"5018:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5022:6:111","type":"","value":"0x0160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5014:3:111"},"nodeType":"YulFunctionCall","src":"5014:15:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5001:12:111"},"nodeType":"YulFunctionCall","src":"5001:29:111"},"variables":[{"name":"offset_4","nodeType":"YulTypedName","src":"4989:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5063:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5072:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5075:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5065:6:111"},"nodeType":"YulFunctionCall","src":"5065:12:111"},"nodeType":"YulExpressionStatement","src":"5065:12:111"}]},"condition":{"arguments":[{"name":"offset_4","nodeType":"YulIdentifier","src":"5049:8:111"},{"name":"_2","nodeType":"YulIdentifier","src":"5059:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5046:2:111"},"nodeType":"YulFunctionCall","src":"5046:16:111"},"nodeType":"YulIf","src":"5043:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"5103:7:111"},{"name":"_6","nodeType":"YulIdentifier","src":"5112:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5099:3:111"},"nodeType":"YulFunctionCall","src":"5099:16:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"5142:2:111"},{"name":"offset_4","nodeType":"YulIdentifier","src":"5146:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5138:3:111"},"nodeType":"YulFunctionCall","src":"5138:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5157:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5134:3:111"},"nodeType":"YulFunctionCall","src":"5134:26:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5162:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"5117:16:111"},"nodeType":"YulFunctionCall","src":"5117:53:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5092:6:111"},"nodeType":"YulFunctionCall","src":"5092:79:111"},"nodeType":"YulExpressionStatement","src":"5092:79:111"},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5191:3:111"},{"name":"value_1","nodeType":"YulIdentifier","src":"5196:7:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5184:6:111"},"nodeType":"YulFunctionCall","src":"5184:20:111"},"nodeType":"YulExpressionStatement","src":"5184:20:111"},{"nodeType":"YulAssignment","src":"5217:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5228:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5233:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5224:3:111"},"nodeType":"YulFunctionCall","src":"5224:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"5217:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3529:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"3534:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3526:2:111"},"nodeType":"YulFunctionCall","src":"3526:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3542:23:111","statements":[{"nodeType":"YulAssignment","src":"3544:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3555:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3560:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3551:3:111"},"nodeType":"YulFunctionCall","src":"3551:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"3544:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3522:3:111","statements":[]},"src":"3518:1728:111"},{"nodeType":"YulAssignment","src":"5255:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"5265:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5255:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2687:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2698:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2710:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2718:6:111","type":""}],"src":"2564:2712:111"},{"body":{"nodeType":"YulBlock","src":"5432:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5442:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5452:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5446:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5463:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5481:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5492:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5477:3:111"},"nodeType":"YulFunctionCall","src":"5477:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"5467:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5511:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5522:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5504:6:111"},"nodeType":"YulFunctionCall","src":"5504:21:111"},"nodeType":"YulExpressionStatement","src":"5504:21:111"},{"nodeType":"YulVariableDeclaration","src":"5534:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"5545:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"5538:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5560:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5580:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5574:5:111"},"nodeType":"YulFunctionCall","src":"5574:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5564:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"5603:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"5611:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5596:6:111"},"nodeType":"YulFunctionCall","src":"5596:22:111"},"nodeType":"YulExpressionStatement","src":"5596:22:111"},{"nodeType":"YulAssignment","src":"5627:25:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5638:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5649:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5634:3:111"},"nodeType":"YulFunctionCall","src":"5634:18:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5627:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"5661:29:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5679:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5687:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5675:3:111"},"nodeType":"YulFunctionCall","src":"5675:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"5665:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5699:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5708:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5703:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5767:120:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5788:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5799:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5793:5:111"},"nodeType":"YulFunctionCall","src":"5793:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5781:6:111"},"nodeType":"YulFunctionCall","src":"5781:26:111"},"nodeType":"YulExpressionStatement","src":"5781:26:111"},{"nodeType":"YulAssignment","src":"5820:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5831:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5836:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5827:3:111"},"nodeType":"YulFunctionCall","src":"5827:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5820:3:111"}]},{"nodeType":"YulAssignment","src":"5852:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5866:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5874:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5862:3:111"},"nodeType":"YulFunctionCall","src":"5862:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5852:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5729:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5732:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5726:2:111"},"nodeType":"YulFunctionCall","src":"5726:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5740:18:111","statements":[{"nodeType":"YulAssignment","src":"5742:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5751:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5754:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5747:3:111"},"nodeType":"YulFunctionCall","src":"5747:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5742:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5722:3:111","statements":[]},"src":"5718:169:111"},{"nodeType":"YulAssignment","src":"5896:11:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"5904:3:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5896:4:111"}]}]},"name":"abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5401:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5412:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5423:4:111","type":""}],"src":"5281:632:111"},{"body":{"nodeType":"YulBlock","src":"6013:897:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6023:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6033:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6027:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6080:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6089:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6092:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6082:6:111"},"nodeType":"YulFunctionCall","src":"6082:12:111"},"nodeType":"YulExpressionStatement","src":"6082:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6055:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6064:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6051:3:111"},"nodeType":"YulFunctionCall","src":"6051:23:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6076:2:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6047:3:111"},"nodeType":"YulFunctionCall","src":"6047:32:111"},"nodeType":"YulIf","src":"6044:52:111"},{"nodeType":"YulVariableDeclaration","src":"6105:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6132:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6119:12:111"},"nodeType":"YulFunctionCall","src":"6119:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6109:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6185:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6194:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6197:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6187:6:111"},"nodeType":"YulFunctionCall","src":"6187:12:111"},"nodeType":"YulExpressionStatement","src":"6187:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6157:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6165:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6154:2:111"},"nodeType":"YulFunctionCall","src":"6154:30:111"},"nodeType":"YulIf","src":"6151:50:111"},{"nodeType":"YulVariableDeclaration","src":"6210:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6224:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6235:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6220:3:111"},"nodeType":"YulFunctionCall","src":"6220:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6214:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6292:6:111"},"nodeType":"YulFunctionCall","src":"6292:12:111"},"nodeType":"YulExpressionStatement","src":"6292:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6269:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6273:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6265:3:111"},"nodeType":"YulFunctionCall","src":"6265:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6280:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6261:3:111"},"nodeType":"YulFunctionCall","src":"6261:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6254:6:111"},"nodeType":"YulFunctionCall","src":"6254:35:111"},"nodeType":"YulIf","src":"6251:55:111"},{"nodeType":"YulVariableDeclaration","src":"6315:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6338:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6325:12:111"},"nodeType":"YulFunctionCall","src":"6325:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6319:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6350:84:111","value":{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6430:2:111"}],"functionName":{"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulIdentifier","src":"6377:52:111"},"nodeType":"YulFunctionCall","src":"6377:56:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"6361:15:111"},"nodeType":"YulFunctionCall","src":"6361:73:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"6354:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6443:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"6456:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"6447:5:111","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6475:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6480:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6468:6:111"},"nodeType":"YulFunctionCall","src":"6468:15:111"},"nodeType":"YulExpressionStatement","src":"6468:15:111"},{"nodeType":"YulAssignment","src":"6492:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6503:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6508:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6499:3:111"},"nodeType":"YulFunctionCall","src":"6499:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6492:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"6520:42:111","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6542:2:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6550:1:111","type":"","value":"5"},{"name":"_3","nodeType":"YulIdentifier","src":"6553:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"6546:3:111"},"nodeType":"YulFunctionCall","src":"6546:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6538:3:111"},"nodeType":"YulFunctionCall","src":"6538:19:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6559:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6534:3:111"},"nodeType":"YulFunctionCall","src":"6534:28:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"6524:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6594:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6603:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6606:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6596:6:111"},"nodeType":"YulFunctionCall","src":"6596:12:111"},"nodeType":"YulExpressionStatement","src":"6596:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"6577:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6585:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6574:2:111"},"nodeType":"YulFunctionCall","src":"6574:19:111"},"nodeType":"YulIf","src":"6571:39:111"},{"nodeType":"YulVariableDeclaration","src":"6619:22:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6634:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6638:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6630:3:111"},"nodeType":"YulFunctionCall","src":"6630:11:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"6623:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6706:174:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6720:30:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6746:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6733:12:111"},"nodeType":"YulFunctionCall","src":"6733:17:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6724:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6801:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"6763:37:111"},"nodeType":"YulFunctionCall","src":"6763:44:111"},"nodeType":"YulExpressionStatement","src":"6763:44:111"},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6827:3:111"},{"name":"value","nodeType":"YulIdentifier","src":"6832:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6820:6:111"},"nodeType":"YulFunctionCall","src":"6820:18:111"},"nodeType":"YulExpressionStatement","src":"6820:18:111"},{"nodeType":"YulAssignment","src":"6851:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6862:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6867:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6858:3:111"},"nodeType":"YulFunctionCall","src":"6858:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6851:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6661:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"6666:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6658:2:111"},"nodeType":"YulFunctionCall","src":"6658:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6674:23:111","statements":[{"nodeType":"YulAssignment","src":"6676:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6687:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6692:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6683:3:111"},"nodeType":"YulFunctionCall","src":"6683:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"6676:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6654:3:111","statements":[]},"src":"6650:230:111"},{"nodeType":"YulAssignment","src":"6889:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"6899:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6889:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5979:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5990:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6002:6:111","type":""}],"src":"5918:992:111"},{"body":{"nodeType":"YulBlock","src":"7016:76:111","statements":[{"nodeType":"YulAssignment","src":"7026:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7038:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7049:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7034:3:111"},"nodeType":"YulFunctionCall","src":"7034:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7026:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7068:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7079:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7061:6:111"},"nodeType":"YulFunctionCall","src":"7061:25:111"},"nodeType":"YulExpressionStatement","src":"7061:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6985:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6996:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7007:4:111","type":""}],"src":"6915:177:111"},{"body":{"nodeType":"YulBlock","src":"7219:125:111","statements":[{"nodeType":"YulAssignment","src":"7229:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7252:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7237:3:111"},"nodeType":"YulFunctionCall","src":"7237:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7229:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7271:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7286:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7294:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7282:3:111"},"nodeType":"YulFunctionCall","src":"7282:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7264:6:111"},"nodeType":"YulFunctionCall","src":"7264:74:111"},"nodeType":"YulExpressionStatement","src":"7264:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7188:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7199:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7210:4:111","type":""}],"src":"7097:247:111"},{"body":{"nodeType":"YulBlock","src":"7453:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"7499:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7508:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7511:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7501:6:111"},"nodeType":"YulFunctionCall","src":"7501:12:111"},"nodeType":"YulExpressionStatement","src":"7501:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7474:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7483:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7470:3:111"},"nodeType":"YulFunctionCall","src":"7470:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7495:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7466:3:111"},"nodeType":"YulFunctionCall","src":"7466:32:111"},"nodeType":"YulIf","src":"7463:52:111"},{"nodeType":"YulVariableDeclaration","src":"7524:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7551:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7538:12:111"},"nodeType":"YulFunctionCall","src":"7538:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7528:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7604:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7613:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7616:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7606:6:111"},"nodeType":"YulFunctionCall","src":"7606:12:111"},"nodeType":"YulExpressionStatement","src":"7606:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7576:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7584:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7573:2:111"},"nodeType":"YulFunctionCall","src":"7573:30:111"},"nodeType":"YulIf","src":"7570:50:111"},{"nodeType":"YulVariableDeclaration","src":"7629:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7643:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7654:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7639:3:111"},"nodeType":"YulFunctionCall","src":"7639:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7633:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7700:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7709:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7712:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7702:6:111"},"nodeType":"YulFunctionCall","src":"7702:12:111"},"nodeType":"YulExpressionStatement","src":"7702:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7681:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7690:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7677:3:111"},"nodeType":"YulFunctionCall","src":"7677:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"7695:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7673:3:111"},"nodeType":"YulFunctionCall","src":"7673:26:111"},"nodeType":"YulIf","src":"7670:46:111"},{"nodeType":"YulAssignment","src":"7725:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"7735:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7725:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7419:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7430:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7442:6:111","type":""}],"src":"7349:394:111"},{"body":{"nodeType":"YulBlock","src":"7801:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7811:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7820:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"7815:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7880:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7905:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7910:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7901:3:111"},"nodeType":"YulFunctionCall","src":"7901:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"7924:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7929:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7920:3:111"},"nodeType":"YulFunctionCall","src":"7920:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7914:5:111"},"nodeType":"YulFunctionCall","src":"7914:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7894:6:111"},"nodeType":"YulFunctionCall","src":"7894:39:111"},"nodeType":"YulExpressionStatement","src":"7894:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7841:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7844:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7838:2:111"},"nodeType":"YulFunctionCall","src":"7838:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"7852:19:111","statements":[{"nodeType":"YulAssignment","src":"7854:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7863:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"7866:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7859:3:111"},"nodeType":"YulFunctionCall","src":"7859:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"7854:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"7834:3:111","statements":[]},"src":"7830:113:111"},{"body":{"nodeType":"YulBlock","src":"7969:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7982:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7987:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7978:3:111"},"nodeType":"YulFunctionCall","src":"7978:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"7996:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7971:6:111"},"nodeType":"YulFunctionCall","src":"7971:27:111"},"nodeType":"YulExpressionStatement","src":"7971:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7958:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7961:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7955:2:111"},"nodeType":"YulFunctionCall","src":"7955:13:111"},"nodeType":"YulIf","src":"7952:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"7779:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"7784:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"7789:6:111","type":""}],"src":"7748:258:111"},{"body":{"nodeType":"YulBlock","src":"8061:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"8071:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8091:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8085:5:111"},"nodeType":"YulFunctionCall","src":"8085:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"8075:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8113:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"8118:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8106:6:111"},"nodeType":"YulFunctionCall","src":"8106:19:111"},"nodeType":"YulExpressionStatement","src":"8106:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8160:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"8167:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8156:3:111"},"nodeType":"YulFunctionCall","src":"8156:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8178:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"8183:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8174:3:111"},"nodeType":"YulFunctionCall","src":"8174:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"8190:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"8134:21:111"},"nodeType":"YulFunctionCall","src":"8134:63:111"},"nodeType":"YulExpressionStatement","src":"8134:63:111"},{"nodeType":"YulAssignment","src":"8206:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8221:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"8234:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8242:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8230:3:111"},"nodeType":"YulFunctionCall","src":"8230:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"8247:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8226:3:111"},"nodeType":"YulFunctionCall","src":"8226:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8217:3:111"},"nodeType":"YulFunctionCall","src":"8217:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"8317:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8213:3:111"},"nodeType":"YulFunctionCall","src":"8213:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"8206:3:111"}]}]},"name":"abi_encode_string","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8038:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8045:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"8053:3:111","type":""}],"src":"8011:317:111"},{"body":{"nodeType":"YulBlock","src":"8386:97:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8403:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8414:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8408:5:111"},"nodeType":"YulFunctionCall","src":"8408:12:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8396:6:111"},"nodeType":"YulFunctionCall","src":"8396:25:111"},"nodeType":"YulExpressionStatement","src":"8396:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8441:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"8446:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8437:3:111"},"nodeType":"YulFunctionCall","src":"8437:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8463:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"8470:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8459:3:111"},"nodeType":"YulFunctionCall","src":"8459:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8453:5:111"},"nodeType":"YulFunctionCall","src":"8453:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8430:6:111"},"nodeType":"YulFunctionCall","src":"8430:47:111"},"nodeType":"YulExpressionStatement","src":"8430:47:111"}]},"name":"abi_encode_struct_StakeInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8370:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8377:3:111","type":""}],"src":"8333:150:111"},{"body":{"nodeType":"YulBlock","src":"8532:83:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8549:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8558:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"8565:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8554:3:111"},"nodeType":"YulFunctionCall","src":"8554:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8542:6:111"},"nodeType":"YulFunctionCall","src":"8542:67:111"},"nodeType":"YulExpressionStatement","src":"8542:67:111"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8516:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8523:3:111","type":""}],"src":"8488:127:111"},{"body":{"nodeType":"YulBlock","src":"8683:208:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8700:3:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8715:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8709:5:111"},"nodeType":"YulFunctionCall","src":"8709:12:111"},{"kind":"number","nodeType":"YulLiteral","src":"8723:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8705:3:111"},"nodeType":"YulFunctionCall","src":"8705:61:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8693:6:111"},"nodeType":"YulFunctionCall","src":"8693:74:111"},"nodeType":"YulExpressionStatement","src":"8693:74:111"},{"nodeType":"YulVariableDeclaration","src":"8776:43:111","value":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8806:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"8813:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8802:3:111"},"nodeType":"YulFunctionCall","src":"8802:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8796:5:111"},"nodeType":"YulFunctionCall","src":"8796:23:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"8780:12:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"8856:12:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"8874:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"8879:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8870:3:111"},"nodeType":"YulFunctionCall","src":"8870:14:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"8828:27:111"},"nodeType":"YulFunctionCall","src":"8828:57:111"},"nodeType":"YulExpressionStatement","src":"8828:57:111"}]},"name":"abi_encode_struct_AggregatorStakeInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8667:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8674:3:111","type":""}],"src":"8620:271:111"},{"body":{"nodeType":"YulBlock","src":"9141:1806:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9151:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9161:2:111","type":"","value":"64"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9155:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9179:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9190:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9172:6:111"},"nodeType":"YulFunctionCall","src":"9172:21:111"},"nodeType":"YulExpressionStatement","src":"9172:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9213:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9224:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9209:3:111"},"nodeType":"YulFunctionCall","src":"9209:18:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9249:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9243:5:111"},"nodeType":"YulFunctionCall","src":"9243:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9236:6:111"},"nodeType":"YulFunctionCall","src":"9236:21:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9229:6:111"},"nodeType":"YulFunctionCall","src":"9229:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9202:6:111"},"nodeType":"YulFunctionCall","src":"9202:57:111"},"nodeType":"YulExpressionStatement","src":"9202:57:111"},{"nodeType":"YulVariableDeclaration","src":"9268:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9278:4:111","type":"","value":"0x20"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"9272:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9302:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9313:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9298:3:111"},"nodeType":"YulFunctionCall","src":"9298:20:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9330:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9338:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9326:3:111"},"nodeType":"YulFunctionCall","src":"9326:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9320:5:111"},"nodeType":"YulFunctionCall","src":"9320:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9291:6:111"},"nodeType":"YulFunctionCall","src":"9291:52:111"},"nodeType":"YulExpressionStatement","src":"9291:52:111"},{"nodeType":"YulVariableDeclaration","src":"9352:42:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9382:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9390:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9378:3:111"},"nodeType":"YulFunctionCall","src":"9378:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9372:5:111"},"nodeType":"YulFunctionCall","src":"9372:22:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"9356:12:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9414:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9425:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9410:3:111"},"nodeType":"YulFunctionCall","src":"9410:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"9431:4:111","type":"","value":"0x60"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9403:6:111"},"nodeType":"YulFunctionCall","src":"9403:33:111"},"nodeType":"YulExpressionStatement","src":"9403:33:111"},{"nodeType":"YulVariableDeclaration","src":"9445:63:111","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"9474:12:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9492:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9503:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9488:3:111"},"nodeType":"YulFunctionCall","src":"9488:19:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"9456:17:111"},"nodeType":"YulFunctionCall","src":"9456:52:111"},"variables":[{"name":"end","nodeType":"YulTypedName","src":"9449:3:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9528:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9539:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9524:3:111"},"nodeType":"YulFunctionCall","src":"9524:18:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"9548:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9553:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9544:3:111"},"nodeType":"YulFunctionCall","src":"9544:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9517:6:111"},"nodeType":"YulFunctionCall","src":"9517:47:111"},"nodeType":"YulExpressionStatement","src":"9517:47:111"},{"nodeType":"YulVariableDeclaration","src":"9573:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9583:6:111","type":"","value":"0x0160"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"9577:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9598:35:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"9626:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9620:5:111"},"nodeType":"YulFunctionCall","src":"9620:13:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"9602:14:111","type":""}]},{"expression":{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"9649:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"9654:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9642:6:111"},"nodeType":"YulFunctionCall","src":"9642:15:111"},"nodeType":"YulExpressionStatement","src":"9642:15:111"},{"nodeType":"YulVariableDeclaration","src":"9666:61:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"9698:14:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"9718:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"9723:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9714:3:111"},"nodeType":"YulFunctionCall","src":"9714:12:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"9680:17:111"},"nodeType":"YulFunctionCall","src":"9680:47:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"9670:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9736:44:111","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"9768:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9776:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9764:3:111"},"nodeType":"YulFunctionCall","src":"9764:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9758:5:111"},"nodeType":"YulFunctionCall","src":"9758:22:111"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"9740:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"9800:3:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9805:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9796:3:111"},"nodeType":"YulFunctionCall","src":"9796:12:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"9814:6:111"},{"name":"end","nodeType":"YulIdentifier","src":"9822:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9810:3:111"},"nodeType":"YulFunctionCall","src":"9810:16:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9789:6:111"},"nodeType":"YulFunctionCall","src":"9789:38:111"},"nodeType":"YulExpressionStatement","src":"9789:38:111"},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"9843:6:111"},{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"9857:14:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9851:5:111"},"nodeType":"YulFunctionCall","src":"9851:21:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9836:6:111"},"nodeType":"YulFunctionCall","src":"9836:37:111"},"nodeType":"YulExpressionStatement","src":"9836:37:111"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"9893:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9901:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9889:3:111"},"nodeType":"YulFunctionCall","src":"9889:15:111"},{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"9916:14:111"},{"name":"_2","nodeType":"YulIdentifier","src":"9932:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9912:3:111"},"nodeType":"YulFunctionCall","src":"9912:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9906:5:111"},"nodeType":"YulFunctionCall","src":"9906:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9882:6:111"},"nodeType":"YulFunctionCall","src":"9882:55:111"},"nodeType":"YulExpressionStatement","src":"9882:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"9957:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9965:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9953:3:111"},"nodeType":"YulFunctionCall","src":"9953:15:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"9994:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10010:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9990:3:111"},"nodeType":"YulFunctionCall","src":"9990:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9984:5:111"},"nodeType":"YulFunctionCall","src":"9984:30:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9977:6:111"},"nodeType":"YulFunctionCall","src":"9977:38:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9970:6:111"},"nodeType":"YulFunctionCall","src":"9970:46:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9946:6:111"},"nodeType":"YulFunctionCall","src":"9946:71:111"},"nodeType":"YulExpressionStatement","src":"9946:71:111"},{"nodeType":"YulVariableDeclaration","src":"10026:54:111","value":{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10058:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"10074:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10054:3:111"},"nodeType":"YulFunctionCall","src":"10054:25:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10048:5:111"},"nodeType":"YulFunctionCall","src":"10048:32:111"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"10030:14:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10089:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10099:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"10093:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10133:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10141:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10129:3:111"},"nodeType":"YulFunctionCall","src":"10129:17:111"},{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"10152:14:111"},{"name":"_4","nodeType":"YulIdentifier","src":"10168:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10148:3:111"},"nodeType":"YulFunctionCall","src":"10148:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10122:6:111"},"nodeType":"YulFunctionCall","src":"10122:50:111"},"nodeType":"YulExpressionStatement","src":"10122:50:111"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10192:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10200:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10188:3:111"},"nodeType":"YulFunctionCall","src":"10188:16:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10220:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"10236:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10216:3:111"},"nodeType":"YulFunctionCall","src":"10216:24:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10210:5:111"},"nodeType":"YulFunctionCall","src":"10210:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"10243:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10206:3:111"},"nodeType":"YulFunctionCall","src":"10206:40:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10181:6:111"},"nodeType":"YulFunctionCall","src":"10181:66:111"},"nodeType":"YulExpressionStatement","src":"10181:66:111"},{"nodeType":"YulVariableDeclaration","src":"10256:53:111","value":{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10288:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"10304:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10284:3:111"},"nodeType":"YulFunctionCall","src":"10284:24:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10278:5:111"},"nodeType":"YulFunctionCall","src":"10278:31:111"},"variables":[{"name":"memberValue0_4","nodeType":"YulTypedName","src":"10260:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10329:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10337:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10325:3:111"},"nodeType":"YulFunctionCall","src":"10325:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"10343:4:111","type":"","value":"0xc0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10318:6:111"},"nodeType":"YulFunctionCall","src":"10318:30:111"},"nodeType":"YulExpressionStatement","src":"10318:30:111"},{"nodeType":"YulVariableDeclaration","src":"10357:65:111","value":{"arguments":[{"name":"memberValue0_4","nodeType":"YulIdentifier","src":"10388:14:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10408:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10416:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10404:3:111"},"nodeType":"YulFunctionCall","src":"10404:17:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"10370:17:111"},"nodeType":"YulFunctionCall","src":"10370:52:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"10361:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10431:44:111","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10463:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10471:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10459:3:111"},"nodeType":"YulFunctionCall","src":"10459:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10453:5:111"},"nodeType":"YulFunctionCall","src":"10453:22:111"},"variables":[{"name":"memberValue0_5","nodeType":"YulTypedName","src":"10435:14:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_5","nodeType":"YulIdentifier","src":"10512:14:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10532:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10537:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10528:3:111"},"nodeType":"YulFunctionCall","src":"10528:12:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"10484:27:111"},"nodeType":"YulFunctionCall","src":"10484:57:111"},"nodeType":"YulExpressionStatement","src":"10484:57:111"},{"nodeType":"YulVariableDeclaration","src":"10550:46:111","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10582:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10590:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10578:3:111"},"nodeType":"YulFunctionCall","src":"10578:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10572:5:111"},"nodeType":"YulFunctionCall","src":"10572:24:111"},"variables":[{"name":"memberValue0_6","nodeType":"YulTypedName","src":"10554:14:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_6","nodeType":"YulIdentifier","src":"10633:14:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10653:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10658:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10649:3:111"},"nodeType":"YulFunctionCall","src":"10649:13:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"10605:27:111"},"nodeType":"YulFunctionCall","src":"10605:58:111"},"nodeType":"YulExpressionStatement","src":"10605:58:111"},{"nodeType":"YulVariableDeclaration","src":"10672:45:111","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10704:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10712:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10700:3:111"},"nodeType":"YulFunctionCall","src":"10700:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10694:5:111"},"nodeType":"YulFunctionCall","src":"10694:23:111"},"variables":[{"name":"memberValue0_7","nodeType":"YulTypedName","src":"10676:14:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_7","nodeType":"YulIdentifier","src":"10754:14:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10774:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10779:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10770:3:111"},"nodeType":"YulFunctionCall","src":"10770:14:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"10726:27:111"},"nodeType":"YulFunctionCall","src":"10726:59:111"},"nodeType":"YulExpressionStatement","src":"10726:59:111"},{"nodeType":"YulVariableDeclaration","src":"10794:45:111","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10826:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10834:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10822:3:111"},"nodeType":"YulFunctionCall","src":"10822:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10816:5:111"},"nodeType":"YulFunctionCall","src":"10816:23:111"},"variables":[{"name":"memberValue0_8","nodeType":"YulTypedName","src":"10798:14:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_8","nodeType":"YulIdentifier","src":"10886:14:111"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10906:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10911:6:111","type":"","value":"0x0100"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10902:3:111"},"nodeType":"YulFunctionCall","src":"10902:16:111"}],"functionName":{"name":"abi_encode_struct_AggregatorStakeInfo","nodeType":"YulIdentifier","src":"10848:37:111"},"nodeType":"YulFunctionCall","src":"10848:71:111"},"nodeType":"YulExpressionStatement","src":"10848:71:111"},{"nodeType":"YulAssignment","src":"10928:13:111","value":{"name":"end_1","nodeType":"YulIdentifier","src":"10936:5:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10928:4:111"}]}]},"name":"abi_encode_tuple_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__to_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9102:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9113:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9121:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9132:4:111","type":""}],"src":"8896:2051:111"},{"body":{"nodeType":"YulBlock","src":"10984:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11001:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11004:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10994:6:111"},"nodeType":"YulFunctionCall","src":"10994:88:111"},"nodeType":"YulExpressionStatement","src":"10994:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11098:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11101:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11091:6:111"},"nodeType":"YulFunctionCall","src":"11091:15:111"},"nodeType":"YulExpressionStatement","src":"11091:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11122:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11125:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11115:6:111"},"nodeType":"YulFunctionCall","src":"11115:15:111"},"nodeType":"YulExpressionStatement","src":"11115:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"10952:184:111"},{"body":{"nodeType":"YulBlock","src":"11306:1393:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11323:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11334:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11316:6:111"},"nodeType":"YulFunctionCall","src":"11316:21:111"},"nodeType":"YulExpressionStatement","src":"11316:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11371:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11365:5:111"},"nodeType":"YulFunctionCall","src":"11365:13:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11384:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11395:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11380:3:111"},"nodeType":"YulFunctionCall","src":"11380:18:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"11346:18:111"},"nodeType":"YulFunctionCall","src":"11346:53:111"},"nodeType":"YulExpressionStatement","src":"11346:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11419:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11430:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11415:3:111"},"nodeType":"YulFunctionCall","src":"11415:18:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11445:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11453:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11441:3:111"},"nodeType":"YulFunctionCall","src":"11441:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11435:5:111"},"nodeType":"YulFunctionCall","src":"11435:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11408:6:111"},"nodeType":"YulFunctionCall","src":"11408:50:111"},"nodeType":"YulExpressionStatement","src":"11408:50:111"},{"nodeType":"YulVariableDeclaration","src":"11467:42:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11497:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11505:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11493:3:111"},"nodeType":"YulFunctionCall","src":"11493:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11487:5:111"},"nodeType":"YulFunctionCall","src":"11487:22:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"11471:12:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11518:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11528:6:111","type":"","value":"0x0160"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11522:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11554:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11565:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11550:3:111"},"nodeType":"YulFunctionCall","src":"11550:18:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11570:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11543:6:111"},"nodeType":"YulFunctionCall","src":"11543:30:111"},"nodeType":"YulExpressionStatement","src":"11543:30:111"},{"nodeType":"YulVariableDeclaration","src":"11582:66:111","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"11614:12:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11632:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11643:3:111","type":"","value":"384"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11628:3:111"},"nodeType":"YulFunctionCall","src":"11628:19:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"11596:17:111"},"nodeType":"YulFunctionCall","src":"11596:52:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"11586:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11657:44:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11689:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11697:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11685:3:111"},"nodeType":"YulFunctionCall","src":"11685:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11679:5:111"},"nodeType":"YulFunctionCall","src":"11679:22:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"11661:14:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11710:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11720:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"11714:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11806:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11817:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11802:3:111"},"nodeType":"YulFunctionCall","src":"11802:19:111"},{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"11831:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11839:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11827:3:111"},"nodeType":"YulFunctionCall","src":"11827:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"11851:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11823:3:111"},"nodeType":"YulFunctionCall","src":"11823:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11795:6:111"},"nodeType":"YulFunctionCall","src":"11795:60:111"},"nodeType":"YulExpressionStatement","src":"11795:60:111"},{"nodeType":"YulVariableDeclaration","src":"11864:55:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"11896:14:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"11912:6:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"11878:17:111"},"nodeType":"YulFunctionCall","src":"11878:41:111"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"11868:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11939:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11950:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11935:3:111"},"nodeType":"YulFunctionCall","src":"11935:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11974:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11962:3:111"},"nodeType":"YulFunctionCall","src":"11962:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11956:5:111"},"nodeType":"YulFunctionCall","src":"11956:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11928:6:111"},"nodeType":"YulFunctionCall","src":"11928:52:111"},"nodeType":"YulExpressionStatement","src":"11928:52:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12000:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12011:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11996:3:111"},"nodeType":"YulFunctionCall","src":"11996:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12027:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12035:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12023:3:111"},"nodeType":"YulFunctionCall","src":"12023:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12017:5:111"},"nodeType":"YulFunctionCall","src":"12017:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11989:6:111"},"nodeType":"YulFunctionCall","src":"11989:52:111"},"nodeType":"YulExpressionStatement","src":"11989:52:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12061:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12072:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12057:3:111"},"nodeType":"YulFunctionCall","src":"12057:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12088:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12096:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12084:3:111"},"nodeType":"YulFunctionCall","src":"12084:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12078:5:111"},"nodeType":"YulFunctionCall","src":"12078:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12050:6:111"},"nodeType":"YulFunctionCall","src":"12050:52:111"},"nodeType":"YulExpressionStatement","src":"12050:52:111"},{"nodeType":"YulVariableDeclaration","src":"12111:33:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12131:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12139:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12127:3:111"},"nodeType":"YulFunctionCall","src":"12127:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12121:5:111"},"nodeType":"YulFunctionCall","src":"12121:23:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"12115:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12153:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12163:3:111","type":"","value":"256"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"12157:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12186:9:111"},{"name":"_4","nodeType":"YulIdentifier","src":"12197:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12182:3:111"},"nodeType":"YulFunctionCall","src":"12182:18:111"},{"name":"_3","nodeType":"YulIdentifier","src":"12202:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12175:6:111"},"nodeType":"YulFunctionCall","src":"12175:30:111"},"nodeType":"YulExpressionStatement","src":"12175:30:111"},{"nodeType":"YulVariableDeclaration","src":"12214:32:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12234:6:111"},{"name":"_4","nodeType":"YulIdentifier","src":"12242:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12230:3:111"},"nodeType":"YulFunctionCall","src":"12230:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12224:5:111"},"nodeType":"YulFunctionCall","src":"12224:22:111"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"12218:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12255:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12265:3:111","type":"","value":"288"},"variables":[{"name":"_6","nodeType":"YulTypedName","src":"12259:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12288:9:111"},{"name":"_6","nodeType":"YulIdentifier","src":"12299:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12284:3:111"},"nodeType":"YulFunctionCall","src":"12284:18:111"},{"name":"_5","nodeType":"YulIdentifier","src":"12304:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12277:6:111"},"nodeType":"YulFunctionCall","src":"12277:30:111"},"nodeType":"YulExpressionStatement","src":"12277:30:111"},{"nodeType":"YulVariableDeclaration","src":"12316:44:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12348:6:111"},{"name":"_6","nodeType":"YulIdentifier","src":"12356:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12344:3:111"},"nodeType":"YulFunctionCall","src":"12344:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12338:5:111"},"nodeType":"YulFunctionCall","src":"12338:22:111"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"12320:14:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12369:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12379:3:111","type":"","value":"320"},"variables":[{"name":"_7","nodeType":"YulTypedName","src":"12373:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12402:9:111"},{"name":"_7","nodeType":"YulIdentifier","src":"12413:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12398:3:111"},"nodeType":"YulFunctionCall","src":"12398:18:111"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12426:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"12434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12422:3:111"},"nodeType":"YulFunctionCall","src":"12422:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12446:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12418:3:111"},"nodeType":"YulFunctionCall","src":"12418:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12391:6:111"},"nodeType":"YulFunctionCall","src":"12391:59:111"},"nodeType":"YulExpressionStatement","src":"12391:59:111"},{"nodeType":"YulVariableDeclaration","src":"12459:55:111","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"12491:14:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"12507:6:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"12473:17:111"},"nodeType":"YulFunctionCall","src":"12473:41:111"},"variables":[{"name":"tail_3","nodeType":"YulTypedName","src":"12463:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12523:44:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12555:6:111"},{"name":"_7","nodeType":"YulIdentifier","src":"12563:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12551:3:111"},"nodeType":"YulFunctionCall","src":"12551:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12545:5:111"},"nodeType":"YulFunctionCall","src":"12545:22:111"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"12527:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12587:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12598:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12583:3:111"},"nodeType":"YulFunctionCall","src":"12583:18:111"},{"arguments":[{"arguments":[{"name":"tail_3","nodeType":"YulIdentifier","src":"12611:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"12619:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12607:3:111"},"nodeType":"YulFunctionCall","src":"12607:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12631:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12603:3:111"},"nodeType":"YulFunctionCall","src":"12603:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12576:6:111"},"nodeType":"YulFunctionCall","src":"12576:59:111"},"nodeType":"YulExpressionStatement","src":"12576:59:111"},{"nodeType":"YulAssignment","src":"12644:49:111","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"12670:14:111"},{"name":"tail_3","nodeType":"YulIdentifier","src":"12686:6:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"12652:17:111"},"nodeType":"YulFunctionCall","src":"12652:41:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12644:4:111"}]}]},"name":"abi_encode_tuple_t_struct$_UserOperation_$10993_memory_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11275:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11286:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11297:4:111","type":""}],"src":"11141:1558:111"},{"body":{"nodeType":"YulBlock","src":"12785:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"12831:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12840:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12843:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12833:6:111"},"nodeType":"YulFunctionCall","src":"12833:12:111"},"nodeType":"YulExpressionStatement","src":"12833:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"12806:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"12815:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12802:3:111"},"nodeType":"YulFunctionCall","src":"12802:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"12827:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12798:3:111"},"nodeType":"YulFunctionCall","src":"12798:32:111"},"nodeType":"YulIf","src":"12795:52:111"},{"nodeType":"YulAssignment","src":"12856:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12872:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12866:5:111"},"nodeType":"YulFunctionCall","src":"12866:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"12856:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12751:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"12762:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"12774:6:111","type":""}],"src":"12704:184:111"},{"body":{"nodeType":"YulBlock","src":"12925:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12942:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12945:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12935:6:111"},"nodeType":"YulFunctionCall","src":"12935:88:111"},"nodeType":"YulExpressionStatement","src":"12935:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13039:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13042:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13032:6:111"},"nodeType":"YulFunctionCall","src":"13032:15:111"},"nodeType":"YulExpressionStatement","src":"13032:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13063:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13066:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13056:6:111"},"nodeType":"YulFunctionCall","src":"13056:15:111"},"nodeType":"YulExpressionStatement","src":"13056:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"12893:184:111"},{"body":{"nodeType":"YulBlock","src":"13129:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"13220:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13222:16:111"},"nodeType":"YulFunctionCall","src":"13222:18:111"},"nodeType":"YulExpressionStatement","src":"13222:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13145:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13152:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"13142:2:111"},"nodeType":"YulFunctionCall","src":"13142:77:111"},"nodeType":"YulIf","src":"13139:103:111"},{"nodeType":"YulAssignment","src":"13251:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13262:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13269:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13258:3:111"},"nodeType":"YulFunctionCall","src":"13258:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"13251:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"13111:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"13121:3:111","type":""}],"src":"13082:195:111"},{"body":{"nodeType":"YulBlock","src":"13358:483:111","statements":[{"nodeType":"YulVariableDeclaration","src":"13368:43:111","value":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"13407:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13394:12:111"},"nodeType":"YulFunctionCall","src":"13394:17:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"13372:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"13559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13561:6:111"},"nodeType":"YulFunctionCall","src":"13561:12:111"},"nodeType":"YulExpressionStatement","src":"13561:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"13434:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13462:12:111"},"nodeType":"YulFunctionCall","src":"13462:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"13478:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13458:3:111"},"nodeType":"YulFunctionCall","src":"13458:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"13489:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13454:3:111"},"nodeType":"YulFunctionCall","src":"13454:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13430:3:111"},"nodeType":"YulFunctionCall","src":"13430:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13423:6:111"},"nodeType":"YulFunctionCall","src":"13423:135:111"},"nodeType":"YulIf","src":"13420:155:111"},{"nodeType":"YulVariableDeclaration","src":"13584:48:111","value":{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"13603:18:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"13623:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13599:3:111"},"nodeType":"YulFunctionCall","src":"13599:33:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"13588:7:111","type":""}]},{"nodeType":"YulAssignment","src":"13641:31:111","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13664:7:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13651:12:111"},"nodeType":"YulFunctionCall","src":"13651:21:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"13641:6:111"}]},{"nodeType":"YulAssignment","src":"13681:27:111","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13694:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"13703:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13690:3:111"},"nodeType":"YulFunctionCall","src":"13690:18:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"13681:5:111"}]},{"body":{"nodeType":"YulBlock","src":"13751:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13760:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13763:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13753:6:111"},"nodeType":"YulFunctionCall","src":"13753:12:111"},"nodeType":"YulExpressionStatement","src":"13753:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"13723:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13731:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13720:2:111"},"nodeType":"YulFunctionCall","src":"13720:30:111"},"nodeType":"YulIf","src":"13717:50:111"},{"body":{"nodeType":"YulBlock","src":"13819:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13828:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13831:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13821:6:111"},"nodeType":"YulFunctionCall","src":"13821:12:111"},"nodeType":"YulExpressionStatement","src":"13821:12:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13783:5:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13794:12:111"},"nodeType":"YulFunctionCall","src":"13794:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"13810:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13790:3:111"},"nodeType":"YulFunctionCall","src":"13790:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"13779:3:111"},"nodeType":"YulFunctionCall","src":"13779:39:111"},"nodeType":"YulIf","src":"13776:59:111"}]},"name":"calldata_access_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"13322:8:111","type":""},{"name":"ptr","nodeType":"YulTypedName","src":"13332:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"13340:5:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"13347:6:111","type":""}],"src":"13282:559:111"},{"body":{"nodeType":"YulBlock","src":"13912:259:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"13929:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"13934:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13922:6:111"},"nodeType":"YulFunctionCall","src":"13922:19:111"},"nodeType":"YulExpressionStatement","src":"13922:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"13967:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"13972:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13963:3:111"},"nodeType":"YulFunctionCall","src":"13963:14:111"},{"name":"start","nodeType":"YulIdentifier","src":"13979:5:111"},{"name":"length","nodeType":"YulIdentifier","src":"13986:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"13950:12:111"},"nodeType":"YulFunctionCall","src":"13950:43:111"},"nodeType":"YulExpressionStatement","src":"13950:43:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14017:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"14022:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14013:3:111"},"nodeType":"YulFunctionCall","src":"14013:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"14031:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14009:3:111"},"nodeType":"YulFunctionCall","src":"14009:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"14038:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14002:6:111"},"nodeType":"YulFunctionCall","src":"14002:38:111"},"nodeType":"YulExpressionStatement","src":"14002:38:111"},{"nodeType":"YulAssignment","src":"14049:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14064:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"14077:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14085:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14073:3:111"},"nodeType":"YulFunctionCall","src":"14073:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"14090:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14069:3:111"},"nodeType":"YulFunctionCall","src":"14069:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14060:3:111"},"nodeType":"YulFunctionCall","src":"14060:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"14160:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14056:3:111"},"nodeType":"YulFunctionCall","src":"14056:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"14049:3:111"}]}]},"name":"abi_encode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"start","nodeType":"YulTypedName","src":"13881:5:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"13888:6:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"13896:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"13904:3:111","type":""}],"src":"13846:325:111"},{"body":{"nodeType":"YulBlock","src":"14343:1694:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14360:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14371:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14353:6:111"},"nodeType":"YulFunctionCall","src":"14353:21:111"},"nodeType":"YulExpressionStatement","src":"14353:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14421:6:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"14402:18:111"},"nodeType":"YulFunctionCall","src":"14402:26:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14434:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14445:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14430:3:111"},"nodeType":"YulFunctionCall","src":"14430:18:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"14383:18:111"},"nodeType":"YulFunctionCall","src":"14383:66:111"},"nodeType":"YulExpressionStatement","src":"14383:66:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14469:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14480:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14465:3:111"},"nodeType":"YulFunctionCall","src":"14465:18:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14502:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14510:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14498:3:111"},"nodeType":"YulFunctionCall","src":"14498:15:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14485:12:111"},"nodeType":"YulFunctionCall","src":"14485:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14458:6:111"},"nodeType":"YulFunctionCall","src":"14458:57:111"},"nodeType":"YulExpressionStatement","src":"14458:57:111"},{"nodeType":"YulVariableDeclaration","src":"14524:89:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14589:6:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14601:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14609:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14597:3:111"},"nodeType":"YulFunctionCall","src":"14597:15:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"14558:30:111"},"nodeType":"YulFunctionCall","src":"14558:55:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"14528:12:111","type":""},{"name":"memberValue1","nodeType":"YulTypedName","src":"14542:12:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14622:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"14632:6:111","type":"","value":"0x0160"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"14626:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14669:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14654:3:111"},"nodeType":"YulFunctionCall","src":"14654:18:111"},{"name":"_1","nodeType":"YulIdentifier","src":"14674:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14647:6:111"},"nodeType":"YulFunctionCall","src":"14647:30:111"},"nodeType":"YulExpressionStatement","src":"14647:30:111"},{"nodeType":"YulVariableDeclaration","src":"14686:88:111","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"14726:12:111"},{"name":"memberValue1","nodeType":"YulIdentifier","src":"14740:12:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14758:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14769:3:111","type":"","value":"384"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14754:3:111"},"nodeType":"YulFunctionCall","src":"14754:19:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"14700:25:111"},"nodeType":"YulFunctionCall","src":"14700:74:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"14690:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14783:93:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14852:6:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14864:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14872:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14860:3:111"},"nodeType":"YulFunctionCall","src":"14860:15:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"14821:30:111"},"nodeType":"YulFunctionCall","src":"14821:55:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"14787:14:111","type":""},{"name":"memberValue1_1","nodeType":"YulTypedName","src":"14803:14:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14885:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"14895:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"14889:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14981:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14992:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14977:3:111"},"nodeType":"YulFunctionCall","src":"14977:19:111"},{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"15006:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15014:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15002:3:111"},"nodeType":"YulFunctionCall","src":"15002:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15026:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14998:3:111"},"nodeType":"YulFunctionCall","src":"14998:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14970:6:111"},"nodeType":"YulFunctionCall","src":"14970:60:111"},"nodeType":"YulExpressionStatement","src":"14970:60:111"},{"nodeType":"YulVariableDeclaration","src":"15039:79:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"15079:14:111"},{"name":"memberValue1_1","nodeType":"YulIdentifier","src":"15095:14:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"15111:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"15053:25:111"},"nodeType":"YulFunctionCall","src":"15053:65:111"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"15043:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15138:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15149:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15134:3:111"},"nodeType":"YulFunctionCall","src":"15134:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15172:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15180:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15168:3:111"},"nodeType":"YulFunctionCall","src":"15168:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15155:12:111"},"nodeType":"YulFunctionCall","src":"15155:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15127:6:111"},"nodeType":"YulFunctionCall","src":"15127:59:111"},"nodeType":"YulExpressionStatement","src":"15127:59:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15206:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15217:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15202:3:111"},"nodeType":"YulFunctionCall","src":"15202:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15240:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15248:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15236:3:111"},"nodeType":"YulFunctionCall","src":"15236:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15223:12:111"},"nodeType":"YulFunctionCall","src":"15223:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15195:6:111"},"nodeType":"YulFunctionCall","src":"15195:59:111"},"nodeType":"YulExpressionStatement","src":"15195:59:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15285:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15270:3:111"},"nodeType":"YulFunctionCall","src":"15270:19:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15308:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15316:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15304:3:111"},"nodeType":"YulFunctionCall","src":"15304:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15291:12:111"},"nodeType":"YulFunctionCall","src":"15291:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15263:6:111"},"nodeType":"YulFunctionCall","src":"15263:59:111"},"nodeType":"YulExpressionStatement","src":"15263:59:111"},{"nodeType":"YulVariableDeclaration","src":"15331:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15341:3:111","type":"","value":"256"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"15335:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15364:9:111"},{"name":"_3","nodeType":"YulIdentifier","src":"15375:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15360:3:111"},"nodeType":"YulFunctionCall","src":"15360:18:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15397:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15405:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15393:3:111"},"nodeType":"YulFunctionCall","src":"15393:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15380:12:111"},"nodeType":"YulFunctionCall","src":"15380:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15353:6:111"},"nodeType":"YulFunctionCall","src":"15353:58:111"},"nodeType":"YulExpressionStatement","src":"15353:58:111"},{"nodeType":"YulVariableDeclaration","src":"15420:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15430:3:111","type":"","value":"288"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"15424:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15453:9:111"},{"name":"_4","nodeType":"YulIdentifier","src":"15464:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15449:3:111"},"nodeType":"YulFunctionCall","src":"15449:18:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15486:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"15494:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15482:3:111"},"nodeType":"YulFunctionCall","src":"15482:15:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15469:12:111"},"nodeType":"YulFunctionCall","src":"15469:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15442:6:111"},"nodeType":"YulFunctionCall","src":"15442:57:111"},"nodeType":"YulExpressionStatement","src":"15442:57:111"},{"nodeType":"YulVariableDeclaration","src":"15508:93:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15577:6:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15589:6:111"},{"name":"_4","nodeType":"YulIdentifier","src":"15597:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15585:3:111"},"nodeType":"YulFunctionCall","src":"15585:15:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"15546:30:111"},"nodeType":"YulFunctionCall","src":"15546:55:111"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"15512:14:111","type":""},{"name":"memberValue1_2","nodeType":"YulTypedName","src":"15528:14:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15610:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15620:3:111","type":"","value":"320"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"15614:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15643:9:111"},{"name":"_5","nodeType":"YulIdentifier","src":"15654:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15639:3:111"},"nodeType":"YulFunctionCall","src":"15639:18:111"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"15667:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15675:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15663:3:111"},"nodeType":"YulFunctionCall","src":"15663:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15687:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15659:3:111"},"nodeType":"YulFunctionCall","src":"15659:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15632:6:111"},"nodeType":"YulFunctionCall","src":"15632:59:111"},"nodeType":"YulExpressionStatement","src":"15632:59:111"},{"nodeType":"YulVariableDeclaration","src":"15700:79:111","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"15740:14:111"},{"name":"memberValue1_2","nodeType":"YulIdentifier","src":"15756:14:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"15772:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"15714:25:111"},"nodeType":"YulFunctionCall","src":"15714:65:111"},"variables":[{"name":"tail_3","nodeType":"YulTypedName","src":"15704:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15788:93:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15857:6:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15869:6:111"},{"name":"_5","nodeType":"YulIdentifier","src":"15877:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15865:3:111"},"nodeType":"YulFunctionCall","src":"15865:15:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"15826:30:111"},"nodeType":"YulFunctionCall","src":"15826:55:111"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"15792:14:111","type":""},{"name":"memberValue1_3","nodeType":"YulTypedName","src":"15808:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15901:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"15912:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15897:3:111"},"nodeType":"YulFunctionCall","src":"15897:18:111"},{"arguments":[{"arguments":[{"name":"tail_3","nodeType":"YulIdentifier","src":"15925:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15933:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15921:3:111"},"nodeType":"YulFunctionCall","src":"15921:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15945:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15917:3:111"},"nodeType":"YulFunctionCall","src":"15917:31:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15890:6:111"},"nodeType":"YulFunctionCall","src":"15890:59:111"},"nodeType":"YulExpressionStatement","src":"15890:59:111"},{"nodeType":"YulAssignment","src":"15958:73:111","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"15992:14:111"},{"name":"memberValue1_3","nodeType":"YulIdentifier","src":"16008:14:111"},{"name":"tail_3","nodeType":"YulIdentifier","src":"16024:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"15966:25:111"},"nodeType":"YulFunctionCall","src":"15966:65:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15958:4:111"}]}]},"name":"abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14312:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14323:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14334:4:111","type":""}],"src":"14176:1861:111"},{"body":{"nodeType":"YulBlock","src":"16135:314:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16145:26:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"16165:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16159:5:111"},"nodeType":"YulFunctionCall","src":"16159:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"16149:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16180:33:111","value":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"16200:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"16207:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16196:3:111"},"nodeType":"YulFunctionCall","src":"16196:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16190:5:111"},"nodeType":"YulFunctionCall","src":"16190:23:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"16184:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16222:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16232:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"16226:2:111","type":""}]},{"nodeType":"YulAssignment","src":"16307:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"16320:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16324:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16316:3:111"},"nodeType":"YulFunctionCall","src":"16316:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"16307:5:111"}]},{"body":{"nodeType":"YulBlock","src":"16361:82:111","statements":[{"nodeType":"YulAssignment","src":"16375:58:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"16392:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16404:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16411:1:111","type":"","value":"4"},{"name":"length","nodeType":"YulIdentifier","src":"16414:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16407:3:111"},"nodeType":"YulFunctionCall","src":"16407:14:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"16400:3:111"},"nodeType":"YulFunctionCall","src":"16400:22:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16424:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"16396:3:111"},"nodeType":"YulFunctionCall","src":"16396:31:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16388:3:111"},"nodeType":"YulFunctionCall","src":"16388:40:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16430:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16384:3:111"},"nodeType":"YulFunctionCall","src":"16384:49:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"16375:5:111"}]}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"16342:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16350:1:111","type":"","value":"4"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16339:2:111"},"nodeType":"YulFunctionCall","src":"16339:13:111"},"nodeType":"YulIf","src":"16336:107:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"16115:5:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"16125:5:111","type":""}],"src":"16042:407:111"},{"body":{"nodeType":"YulBlock","src":"16503:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"16525:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"16527:16:111"},"nodeType":"YulFunctionCall","src":"16527:18:111"},"nodeType":"YulExpressionStatement","src":"16527:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"16519:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"16522:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16516:2:111"},"nodeType":"YulFunctionCall","src":"16516:8:111"},"nodeType":"YulIf","src":"16513:34:111"},{"nodeType":"YulAssignment","src":"16556:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"16568:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"16571:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16564:3:111"},"nodeType":"YulFunctionCall","src":"16564:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"16556:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"16485:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"16488:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"16494:4:111","type":""}],"src":"16454:125:111"},{"body":{"nodeType":"YulBlock","src":"16643:112:111","statements":[{"nodeType":"YulAssignment","src":"16653:22:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"16668:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16662:5:111"},"nodeType":"YulFunctionCall","src":"16662:13:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"16653:5:111"}]},{"body":{"nodeType":"YulBlock","src":"16733:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16742:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16745:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16735:6:111"},"nodeType":"YulFunctionCall","src":"16735:12:111"},"nodeType":"YulExpressionStatement","src":"16735:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16697:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16708:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"16715:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16704:3:111"},"nodeType":"YulFunctionCall","src":"16704:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"16694:2:111"},"nodeType":"YulFunctionCall","src":"16694:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16687:6:111"},"nodeType":"YulFunctionCall","src":"16687:45:111"},"nodeType":"YulIf","src":"16684:65:111"}]},"name":"abi_decode_uint48_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"16622:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"16633:5:111","type":""}],"src":"16584:171:111"},{"body":{"nodeType":"YulBlock","src":"16845:222:111","statements":[{"nodeType":"YulAssignment","src":"16855:61:111","value":{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"16908:6:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"16880:27:111"},"nodeType":"YulFunctionCall","src":"16880:35:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"16864:15:111"},"nodeType":"YulFunctionCall","src":"16864:52:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"16855:5:111"}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"16932:5:111"},{"name":"length","nodeType":"YulIdentifier","src":"16939:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16925:6:111"},"nodeType":"YulFunctionCall","src":"16925:21:111"},"nodeType":"YulExpressionStatement","src":"16925:21:111"},{"body":{"nodeType":"YulBlock","src":"16984:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16993:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16996:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16986:6:111"},"nodeType":"YulFunctionCall","src":"16986:12:111"},"nodeType":"YulExpressionStatement","src":"16986:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"16965:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16970:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16961:3:111"},"nodeType":"YulFunctionCall","src":"16961:16:111"},{"name":"end","nodeType":"YulIdentifier","src":"16979:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16958:2:111"},"nodeType":"YulFunctionCall","src":"16958:25:111"},"nodeType":"YulIf","src":"16955:45:111"},{"expression":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"17031:3:111"},{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"17040:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17047:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17036:3:111"},"nodeType":"YulFunctionCall","src":"17036:16:111"},{"name":"length","nodeType":"YulIdentifier","src":"17054:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"17009:21:111"},"nodeType":"YulFunctionCall","src":"17009:52:111"},"nodeType":"YulExpressionStatement","src":"17009:52:111"}]},"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"16814:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16819:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"16827:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"16835:5:111","type":""}],"src":"16760:307:111"},{"body":{"nodeType":"YulBlock","src":"17135:172:111","statements":[{"body":{"nodeType":"YulBlock","src":"17184:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17193:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17196:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17186:6:111"},"nodeType":"YulFunctionCall","src":"17186:12:111"},"nodeType":"YulExpressionStatement","src":"17186:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"17163:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17171:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17159:3:111"},"nodeType":"YulFunctionCall","src":"17159:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"17178:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17155:3:111"},"nodeType":"YulFunctionCall","src":"17155:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17148:6:111"},"nodeType":"YulFunctionCall","src":"17148:35:111"},"nodeType":"YulIf","src":"17145:55:111"},{"nodeType":"YulAssignment","src":"17209:92:111","value":{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"17267:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17275:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17263:3:111"},"nodeType":"YulFunctionCall","src":"17263:17:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"17288:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17282:5:111"},"nodeType":"YulFunctionCall","src":"17282:13:111"},{"name":"end","nodeType":"YulIdentifier","src":"17297:3:111"}],"functionName":{"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulIdentifier","src":"17218:44:111"},"nodeType":"YulFunctionCall","src":"17218:83:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"17209:5:111"}]}]},"name":"abi_decode_bytes_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"17109:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"17117:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"17125:5:111","type":""}],"src":"17072:235:111"},{"body":{"nodeType":"YulBlock","src":"17390:728:111","statements":[{"body":{"nodeType":"YulBlock","src":"17434:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17443:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17446:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17436:6:111"},"nodeType":"YulFunctionCall","src":"17436:12:111"},"nodeType":"YulExpressionStatement","src":"17436:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"17411:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17416:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17407:3:111"},"nodeType":"YulFunctionCall","src":"17407:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"17428:4:111","type":"","value":"0xc0"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17403:3:111"},"nodeType":"YulFunctionCall","src":"17403:30:111"},"nodeType":"YulIf","src":"17400:50:111"},{"nodeType":"YulAssignment","src":"17459:31:111","value":{"arguments":[],"functionName":{"name":"allocate_memory_3194","nodeType":"YulIdentifier","src":"17468:20:111"},"nodeType":"YulFunctionCall","src":"17468:22:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"17459:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17506:5:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17519:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17513:5:111"},"nodeType":"YulFunctionCall","src":"17513:16:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17499:6:111"},"nodeType":"YulFunctionCall","src":"17499:31:111"},"nodeType":"YulExpressionStatement","src":"17499:31:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17550:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17557:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17546:3:111"},"nodeType":"YulFunctionCall","src":"17546:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17572:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17583:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17568:3:111"},"nodeType":"YulFunctionCall","src":"17568:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17562:5:111"},"nodeType":"YulFunctionCall","src":"17562:25:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17539:6:111"},"nodeType":"YulFunctionCall","src":"17539:49:111"},"nodeType":"YulExpressionStatement","src":"17539:49:111"},{"nodeType":"YulVariableDeclaration","src":"17597:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17622:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17633:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17618:3:111"},"nodeType":"YulFunctionCall","src":"17618:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17612:5:111"},"nodeType":"YulFunctionCall","src":"17612:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"17601:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"17694:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17703:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17706:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17696:6:111"},"nodeType":"YulFunctionCall","src":"17696:12:111"},"nodeType":"YulExpressionStatement","src":"17696:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"17659:7:111"},{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"17682:7:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17675:6:111"},"nodeType":"YulFunctionCall","src":"17675:15:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17668:6:111"},"nodeType":"YulFunctionCall","src":"17668:23:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"17656:2:111"},"nodeType":"YulFunctionCall","src":"17656:36:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17649:6:111"},"nodeType":"YulFunctionCall","src":"17649:44:111"},"nodeType":"YulIf","src":"17646:64:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17730:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17737:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17726:3:111"},"nodeType":"YulFunctionCall","src":"17726:14:111"},{"name":"value_1","nodeType":"YulIdentifier","src":"17742:7:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17719:6:111"},"nodeType":"YulFunctionCall","src":"17719:31:111"},"nodeType":"YulExpressionStatement","src":"17719:31:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17770:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17777:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17766:3:111"},"nodeType":"YulFunctionCall","src":"17766:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17815:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17826:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17811:3:111"},"nodeType":"YulFunctionCall","src":"17811:18:111"}],"functionName":{"name":"abi_decode_uint48_fromMemory","nodeType":"YulIdentifier","src":"17782:28:111"},"nodeType":"YulFunctionCall","src":"17782:48:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17759:6:111"},"nodeType":"YulFunctionCall","src":"17759:72:111"},"nodeType":"YulExpressionStatement","src":"17759:72:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17851:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"17858:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17847:3:111"},"nodeType":"YulFunctionCall","src":"17847:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17897:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17908:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17893:3:111"},"nodeType":"YulFunctionCall","src":"17893:19:111"}],"functionName":{"name":"abi_decode_uint48_fromMemory","nodeType":"YulIdentifier","src":"17864:28:111"},"nodeType":"YulFunctionCall","src":"17864:49:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17840:6:111"},"nodeType":"YulFunctionCall","src":"17840:74:111"},"nodeType":"YulExpressionStatement","src":"17840:74:111"},{"nodeType":"YulVariableDeclaration","src":"17923:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17947:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17958:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17943:3:111"},"nodeType":"YulFunctionCall","src":"17943:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17937:5:111"},"nodeType":"YulFunctionCall","src":"17937:26:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"17927:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18006:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18015:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18018:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18008:6:111"},"nodeType":"YulFunctionCall","src":"18008:12:111"},"nodeType":"YulExpressionStatement","src":"18008:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"17978:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17986:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"17975:2:111"},"nodeType":"YulFunctionCall","src":"17975:30:111"},"nodeType":"YulIf","src":"17972:50:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18042:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"18049:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18038:3:111"},"nodeType":"YulFunctionCall","src":"18038:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18087:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"18098:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18083:3:111"},"nodeType":"YulFunctionCall","src":"18083:22:111"},{"name":"end","nodeType":"YulIdentifier","src":"18107:3:111"}],"functionName":{"name":"abi_decode_bytes_fromMemory","nodeType":"YulIdentifier","src":"18055:27:111"},"nodeType":"YulFunctionCall","src":"18055:56:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18031:6:111"},"nodeType":"YulFunctionCall","src":"18031:81:111"},"nodeType":"YulExpressionStatement","src":"18031:81:111"}]},"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17361:9:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"17372:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"17380:5:111","type":""}],"src":"17312:806:111"},{"body":{"nodeType":"YulBlock","src":"18200:204:111","statements":[{"body":{"nodeType":"YulBlock","src":"18244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18246:6:111"},"nodeType":"YulFunctionCall","src":"18246:12:111"},"nodeType":"YulExpressionStatement","src":"18246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"18221:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"18226:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18217:3:111"},"nodeType":"YulFunctionCall","src":"18217:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"18238:4:111","type":"","value":"0x40"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18213:3:111"},"nodeType":"YulFunctionCall","src":"18213:30:111"},"nodeType":"YulIf","src":"18210:50:111"},{"nodeType":"YulAssignment","src":"18269:31:111","value":{"arguments":[],"functionName":{"name":"allocate_memory_3195","nodeType":"YulIdentifier","src":"18278:20:111"},"nodeType":"YulFunctionCall","src":"18278:22:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"18269:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18316:5:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18329:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18323:5:111"},"nodeType":"YulFunctionCall","src":"18323:16:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18309:6:111"},"nodeType":"YulFunctionCall","src":"18309:31:111"},"nodeType":"YulExpressionStatement","src":"18309:31:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18360:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"18367:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18356:3:111"},"nodeType":"YulFunctionCall","src":"18356:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18393:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18378:3:111"},"nodeType":"YulFunctionCall","src":"18378:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18372:5:111"},"nodeType":"YulFunctionCall","src":"18372:25:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18349:6:111"},"nodeType":"YulFunctionCall","src":"18349:49:111"},"nodeType":"YulExpressionStatement","src":"18349:49:111"}]},"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18171:9:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"18182:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"18190:5:111","type":""}],"src":"18123:281:111"},{"body":{"nodeType":"YulBlock","src":"18650:517:111","statements":[{"body":{"nodeType":"YulBlock","src":"18697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18699:6:111"},"nodeType":"YulFunctionCall","src":"18699:12:111"},"nodeType":"YulExpressionStatement","src":"18699:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"18671:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"18680:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18667:3:111"},"nodeType":"YulFunctionCall","src":"18667:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"18692:3:111","type":"","value":"224"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18663:3:111"},"nodeType":"YulFunctionCall","src":"18663:33:111"},"nodeType":"YulIf","src":"18660:53:111"},{"nodeType":"YulVariableDeclaration","src":"18722:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18742:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18736:5:111"},"nodeType":"YulFunctionCall","src":"18736:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"18726:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18795:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18804:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18807:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18797:6:111"},"nodeType":"YulFunctionCall","src":"18797:12:111"},"nodeType":"YulExpressionStatement","src":"18797:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18767:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18775:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18764:2:111"},"nodeType":"YulFunctionCall","src":"18764:30:111"},"nodeType":"YulIf","src":"18761:50:111"},{"nodeType":"YulAssignment","src":"18820:82:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18874:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"18885:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18870:3:111"},"nodeType":"YulFunctionCall","src":"18870:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"18894:7:111"}],"functionName":{"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulIdentifier","src":"18830:39:111"},"nodeType":"YulFunctionCall","src":"18830:72:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18820:6:111"}]},{"nodeType":"YulAssignment","src":"18911:77:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18975:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18960:3:111"},"nodeType":"YulFunctionCall","src":"18960:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"18980:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"18921:38:111"},"nodeType":"YulFunctionCall","src":"18921:67:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"18911:6:111"}]},{"nodeType":"YulAssignment","src":"18997:77:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19050:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19061:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19046:3:111"},"nodeType":"YulFunctionCall","src":"19046:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"19066:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"19007:38:111"},"nodeType":"YulFunctionCall","src":"19007:67:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"18997:6:111"}]},{"nodeType":"YulAssignment","src":"19083:78:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19136:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19147:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19132:3:111"},"nodeType":"YulFunctionCall","src":"19132:19:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"19153:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"19093:38:111"},"nodeType":"YulFunctionCall","src":"19093:68:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"19083:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18592:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"18603:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"18615:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"18623:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"18631:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"18639:6:111","type":""}],"src":"18409:758:111"},{"body":{"nodeType":"YulBlock","src":"19227:382:111","statements":[{"nodeType":"YulAssignment","src":"19237:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19251:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"19254:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"19247:3:111"},"nodeType":"YulFunctionCall","src":"19247:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"19237:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"19268:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"19298:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"19304:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19294:3:111"},"nodeType":"YulFunctionCall","src":"19294:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"19272:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19345:31:111","statements":[{"nodeType":"YulAssignment","src":"19347:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"19361:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19369:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19357:3:111"},"nodeType":"YulFunctionCall","src":"19357:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"19347:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"19325:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19318:6:111"},"nodeType":"YulFunctionCall","src":"19318:26:111"},"nodeType":"YulIf","src":"19315:61:111"},{"body":{"nodeType":"YulBlock","src":"19435:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19456:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19459:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19449:6:111"},"nodeType":"YulFunctionCall","src":"19449:88:111"},"nodeType":"YulExpressionStatement","src":"19449:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19557:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"19560:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19550:6:111"},"nodeType":"YulFunctionCall","src":"19550:15:111"},"nodeType":"YulExpressionStatement","src":"19550:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19585:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19588:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19578:6:111"},"nodeType":"YulFunctionCall","src":"19578:15:111"},"nodeType":"YulExpressionStatement","src":"19578:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"19391:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"19414:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19422:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"19411:2:111"},"nodeType":"YulFunctionCall","src":"19411:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"19388:2:111"},"nodeType":"YulFunctionCall","src":"19388:38:111"},"nodeType":"YulIf","src":"19385:218:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"19207:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"19216:6:111","type":""}],"src":"19172:437:111"},{"body":{"nodeType":"YulBlock","src":"19909:956:111","statements":[{"nodeType":"YulVariableDeclaration","src":"19919:33:111","value":{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"19933:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"19942:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19929:3:111"},"nodeType":"YulFunctionCall","src":"19929:23:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"19923:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19977:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19986:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19989:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19979:6:111"},"nodeType":"YulFunctionCall","src":"19979:12:111"},"nodeType":"YulExpressionStatement","src":"19979:12:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"19968:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"19972:3:111","type":"","value":"320"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"19964:3:111"},"nodeType":"YulFunctionCall","src":"19964:12:111"},"nodeType":"YulIf","src":"19961:32:111"},{"nodeType":"YulVariableDeclaration","src":"20002:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20022:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20016:5:111"},"nodeType":"YulFunctionCall","src":"20016:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"20006:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"20075:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20084:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20087:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20077:6:111"},"nodeType":"YulFunctionCall","src":"20077:12:111"},"nodeType":"YulExpressionStatement","src":"20077:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"20047:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20055:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20044:2:111"},"nodeType":"YulFunctionCall","src":"20044:30:111"},"nodeType":"YulIf","src":"20041:50:111"},{"nodeType":"YulAssignment","src":"20100:82:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20154:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"20165:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20150:3:111"},"nodeType":"YulFunctionCall","src":"20150:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20174:7:111"}],"functionName":{"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulIdentifier","src":"20110:39:111"},"nodeType":"YulFunctionCall","src":"20110:72:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"20100:6:111"}]},{"nodeType":"YulAssignment","src":"20191:77:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20244:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20255:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20240:3:111"},"nodeType":"YulFunctionCall","src":"20240:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20260:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20201:38:111"},"nodeType":"YulFunctionCall","src":"20201:67:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"20191:6:111"}]},{"nodeType":"YulAssignment","src":"20277:77:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20330:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20341:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20326:3:111"},"nodeType":"YulFunctionCall","src":"20326:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20346:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20287:38:111"},"nodeType":"YulFunctionCall","src":"20287:67:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"20277:6:111"}]},{"nodeType":"YulAssignment","src":"20363:78:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20416:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20427:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20412:3:111"},"nodeType":"YulFunctionCall","src":"20412:19:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20433:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20373:38:111"},"nodeType":"YulFunctionCall","src":"20373:68:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"20363:6:111"}]},{"body":{"nodeType":"YulBlock","src":"20538:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20547:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20550:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20540:6:111"},"nodeType":"YulFunctionCall","src":"20540:12:111"},"nodeType":"YulExpressionStatement","src":"20540:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"20461:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"20465:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20457:3:111"},"nodeType":"YulFunctionCall","src":"20457:75:111"},{"kind":"number","nodeType":"YulLiteral","src":"20534:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"20453:3:111"},"nodeType":"YulFunctionCall","src":"20453:84:111"},"nodeType":"YulIf","src":"20450:104:111"},{"nodeType":"YulVariableDeclaration","src":"20563:35:111","value":{"arguments":[],"functionName":{"name":"allocate_memory_3195","nodeType":"YulIdentifier","src":"20576:20:111"},"nodeType":"YulFunctionCall","src":"20576:22:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"20567:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"20607:41:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20632:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20643:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20628:3:111"},"nodeType":"YulFunctionCall","src":"20628:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20622:5:111"},"nodeType":"YulFunctionCall","src":"20622:26:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"20611:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"20695:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"20657:37:111"},"nodeType":"YulFunctionCall","src":"20657:46:111"},"nodeType":"YulExpressionStatement","src":"20657:46:111"},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20719:5:111"},{"name":"value_1","nodeType":"YulIdentifier","src":"20726:7:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20712:6:111"},"nodeType":"YulFunctionCall","src":"20712:22:111"},"nodeType":"YulExpressionStatement","src":"20712:22:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20754:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"20761:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20750:3:111"},"nodeType":"YulFunctionCall","src":"20750:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20809:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20820:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20805:3:111"},"nodeType":"YulFunctionCall","src":"20805:19:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20826:7:111"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20766:38:111"},"nodeType":"YulFunctionCall","src":"20766:68:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20743:6:111"},"nodeType":"YulFunctionCall","src":"20743:92:111"},"nodeType":"YulExpressionStatement","src":"20743:92:111"},{"nodeType":"YulAssignment","src":"20844:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"20854:5:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"20844:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_AggregatorStakeInfo_$6732_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19843:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"19854:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"19866:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"19874:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"19882:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"19890:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"19898:6:111","type":""}],"src":"19614:1251:111"},{"body":{"nodeType":"YulBlock","src":"20978:411:111","statements":[{"body":{"nodeType":"YulBlock","src":"21024:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21033:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21036:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21026:6:111"},"nodeType":"YulFunctionCall","src":"21026:12:111"},"nodeType":"YulExpressionStatement","src":"21026:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"20999:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"21008:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"20995:3:111"},"nodeType":"YulFunctionCall","src":"20995:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"21020:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"20991:3:111"},"nodeType":"YulFunctionCall","src":"20991:32:111"},"nodeType":"YulIf","src":"20988:52:111"},{"nodeType":"YulAssignment","src":"21049:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21065:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21059:5:111"},"nodeType":"YulFunctionCall","src":"21059:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"21049:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"21084:39:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21108:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21119:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21104:3:111"},"nodeType":"YulFunctionCall","src":"21104:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21098:5:111"},"nodeType":"YulFunctionCall","src":"21098:25:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"21088:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"21166:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21175:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21178:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21168:6:111"},"nodeType":"YulFunctionCall","src":"21168:12:111"},"nodeType":"YulExpressionStatement","src":"21168:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"21138:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21146:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"21135:2:111"},"nodeType":"YulFunctionCall","src":"21135:30:111"},"nodeType":"YulIf","src":"21132:50:111"},{"nodeType":"YulVariableDeclaration","src":"21191:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21205:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"21216:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21201:3:111"},"nodeType":"YulFunctionCall","src":"21201:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"21195:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"21271:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21280:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21283:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21273:6:111"},"nodeType":"YulFunctionCall","src":"21273:12:111"},"nodeType":"YulExpressionStatement","src":"21273:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"21250:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"21254:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21246:3:111"},"nodeType":"YulFunctionCall","src":"21246:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"21261:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"21242:3:111"},"nodeType":"YulFunctionCall","src":"21242:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"21235:6:111"},"nodeType":"YulFunctionCall","src":"21235:35:111"},"nodeType":"YulIf","src":"21232:55:111"},{"nodeType":"YulAssignment","src":"21296:87:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"21355:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"21359:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21351:3:111"},"nodeType":"YulFunctionCall","src":"21351:11:111"},{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"21370:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21364:5:111"},"nodeType":"YulFunctionCall","src":"21364:9:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"21375:7:111"}],"functionName":{"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulIdentifier","src":"21306:44:111"},"nodeType":"YulFunctionCall","src":"21306:77:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"21296:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20936:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"20947:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"20959:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"20967:6:111","type":""}],"src":"20870:519:111"},{"body":{"nodeType":"YulBlock","src":"21442:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"21469:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"21471:16:111"},"nodeType":"YulFunctionCall","src":"21471:18:111"},"nodeType":"YulExpressionStatement","src":"21471:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"21458:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"21465:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"21461:3:111"},"nodeType":"YulFunctionCall","src":"21461:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"21455:2:111"},"nodeType":"YulFunctionCall","src":"21455:13:111"},"nodeType":"YulIf","src":"21452:39:111"},{"nodeType":"YulAssignment","src":"21500:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"21511:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"21514:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21507:3:111"},"nodeType":"YulFunctionCall","src":"21507:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"21500:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"21425:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"21428:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"21434:3:111","type":""}],"src":"21394:128:111"},{"body":{"nodeType":"YulBlock","src":"21701:164:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21718:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21729:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21711:6:111"},"nodeType":"YulFunctionCall","src":"21711:21:111"},"nodeType":"YulExpressionStatement","src":"21711:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21752:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21763:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21748:3:111"},"nodeType":"YulFunctionCall","src":"21748:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21768:2:111","type":"","value":"14"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21741:6:111"},"nodeType":"YulFunctionCall","src":"21741:30:111"},"nodeType":"YulExpressionStatement","src":"21741:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21802:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21787:3:111"},"nodeType":"YulFunctionCall","src":"21787:18:111"},{"hexValue":"736c6963655f6f766572666c6f77","kind":"string","nodeType":"YulLiteral","src":"21807:16:111","type":"","value":"slice_overflow"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21780:6:111"},"nodeType":"YulFunctionCall","src":"21780:44:111"},"nodeType":"YulExpressionStatement","src":"21780:44:111"},{"nodeType":"YulAssignment","src":"21833:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21856:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21841:3:111"},"nodeType":"YulFunctionCall","src":"21841:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21833:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21678:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21692:4:111","type":""}],"src":"21527:338:111"},{"body":{"nodeType":"YulBlock","src":"22044:167:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22061:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22072:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22054:6:111"},"nodeType":"YulFunctionCall","src":"22054:21:111"},"nodeType":"YulExpressionStatement","src":"22054:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22095:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22106:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22091:3:111"},"nodeType":"YulFunctionCall","src":"22091:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"22111:2:111","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22084:6:111"},"nodeType":"YulFunctionCall","src":"22084:30:111"},"nodeType":"YulExpressionStatement","src":"22084:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22134:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22145:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22130:3:111"},"nodeType":"YulFunctionCall","src":"22130:18:111"},{"hexValue":"736c6963655f6f75744f66426f756e6473","kind":"string","nodeType":"YulLiteral","src":"22150:19:111","type":"","value":"slice_outOfBounds"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22123:6:111"},"nodeType":"YulFunctionCall","src":"22123:47:111"},"nodeType":"YulExpressionStatement","src":"22123:47:111"},{"nodeType":"YulAssignment","src":"22179:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22191:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22202:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22187:3:111"},"nodeType":"YulFunctionCall","src":"22187:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"22179:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22021:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22035:4:111","type":""}],"src":"21870:341:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory_3193() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0x0160)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory_3194() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0xc0)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory_3195() -> memPtr\n {\n memPtr := mload(0x40)\n let newFreePtr := add(memPtr, 0x40)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(0x40, newFreePtr)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_array_struct_UserOperation_dyn(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(shl(5, length), 0x20)\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_contract_IEntryPoint(value)\n }\n function array_allocation_size_bytes(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x20)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let array_1 := allocate_memory(array_allocation_size_bytes(_1))\n mstore(array_1, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(array_1, 0x20), add(offset, 0x20), _1)\n mstore(add(add(array_1, _1), 0x20), 0)\n array := array_1\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n let dst := allocate_memory(array_allocation_size_array_struct_UserOperation_dyn(_4))\n let dst_1 := dst\n mstore(dst, _4)\n dst := add(dst, _1)\n let srcEnd := add(add(_3, shl(5, _4)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_3, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let innerOffset := calldataload(src)\n if gt(innerOffset, _2) { revert(0, 0) }\n let _5 := add(_3, innerOffset)\n if slt(add(sub(dataEnd, _5), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x0160) { revert(0, 0) }\n let value_1 := allocate_memory_3193()\n mstore(value_1, abi_decode_address(add(_5, _1)))\n mstore(add(value_1, _1), calldataload(add(_5, 64)))\n let offset_1 := calldataload(add(_5, 96))\n if gt(offset_1, _2) { revert(0, 0) }\n mstore(add(value_1, 64), abi_decode_bytes(add(add(_5, offset_1), _1), dataEnd))\n let offset_2 := calldataload(add(_5, 128))\n if gt(offset_2, _2) { revert(0, 0) }\n mstore(add(value_1, 96), abi_decode_bytes(add(add(_5, offset_2), _1), dataEnd))\n mstore(add(value_1, 128), calldataload(add(_5, 160)))\n mstore(add(value_1, 160), calldataload(add(_5, 192)))\n mstore(add(value_1, 192), calldataload(add(_5, 224)))\n mstore(add(value_1, 224), calldataload(add(_5, 256)))\n mstore(add(value_1, 256), calldataload(add(_5, 288)))\n let _6 := 320\n let offset_3 := calldataload(add(_5, _6))\n if gt(offset_3, _2) { revert(0, 0) }\n mstore(add(value_1, 288), abi_decode_bytes(add(add(_5, offset_3), _1), dataEnd))\n let offset_4 := calldataload(add(_5, 0x0160))\n if gt(offset_4, _2) { revert(0, 0) }\n mstore(add(value_1, _6), abi_decode_bytes(add(add(_5, offset_4), _1), dataEnd))\n mstore(dst, value_1)\n dst := add(dst, _1)\n }\n value1 := dst_1\n }\n function abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n let dst := allocate_memory(array_allocation_size_array_struct_UserOperation_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := calldataload(src)\n validator_revert_contract_IEntryPoint(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_string(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_struct_StakeInfo(value, pos)\n {\n mstore(pos, mload(value))\n mstore(add(pos, 0x20), mload(add(value, 0x20)))\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_struct_AggregatorStakeInfo(value, pos)\n {\n mstore(pos, and(mload(value), 0xffffffffffffffffffffffffffffffffffffffff))\n let memberValue0 := mload(add(value, 0x20))\n abi_encode_struct_StakeInfo(memberValue0, add(pos, 0x20))\n }\n function abi_encode_tuple_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__to_t_struct$_FailedOpStatus_$6739_memory_ptr_t_struct$_Response_$6757_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 64\n mstore(headStart, _1)\n mstore(add(headStart, _1), iszero(iszero(mload(value0))))\n let _2 := 0x20\n mstore(add(headStart, 0x60), mload(add(value0, _2)))\n let memberValue0 := mload(add(value0, _1))\n mstore(add(headStart, 128), 0x60)\n let end := abi_encode_string(memberValue0, add(headStart, 160))\n mstore(add(headStart, _2), sub(end, headStart))\n let _3 := 0x0160\n let memberValue0_1 := mload(value1)\n mstore(end, _3)\n let tail_1 := abi_encode_string(memberValue0_1, add(end, _3))\n let memberValue0_2 := mload(add(value1, _2))\n mstore(add(end, _2), sub(tail_1, end))\n mstore(tail_1, mload(memberValue0_2))\n mstore(add(tail_1, _2), mload(add(memberValue0_2, _2)))\n mstore(add(tail_1, _1), iszero(iszero(mload(add(memberValue0_2, _1)))))\n let memberValue0_3 := mload(add(memberValue0_2, 0x60))\n let _4 := 0xffffffffffff\n mstore(add(tail_1, 0x60), and(memberValue0_3, _4))\n mstore(add(tail_1, 128), and(mload(add(memberValue0_2, 128)), _4))\n let memberValue0_4 := mload(add(memberValue0_2, 160))\n mstore(add(tail_1, 160), 0xc0)\n let end_1 := abi_encode_string(memberValue0_4, add(tail_1, 0xc0))\n let memberValue0_5 := mload(add(value1, _1))\n abi_encode_struct_StakeInfo(memberValue0_5, add(end, _1))\n let memberValue0_6 := mload(add(value1, 0x60))\n abi_encode_struct_StakeInfo(memberValue0_6, add(end, 128))\n let memberValue0_7 := mload(add(value1, 128))\n abi_encode_struct_StakeInfo(memberValue0_7, add(end, 0xc0))\n let memberValue0_8 := mload(add(value1, 160))\n abi_encode_struct_AggregatorStakeInfo(memberValue0_8, add(end, 0x0100))\n tail := end_1\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_struct$_UserOperation_$10993_memory_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n abi_encode_address(mload(value0), add(headStart, 32))\n mstore(add(headStart, 64), mload(add(value0, 32)))\n let memberValue0 := mload(add(value0, 64))\n let _1 := 0x0160\n mstore(add(headStart, 96), _1)\n let tail_1 := abi_encode_string(memberValue0, add(headStart, 384))\n let memberValue0_1 := mload(add(value0, 96))\n let _2 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n mstore(add(headStart, 128), add(sub(tail_1, headStart), _2))\n let tail_2 := abi_encode_string(memberValue0_1, tail_1)\n mstore(add(headStart, 160), mload(add(value0, 128)))\n mstore(add(headStart, 192), mload(add(value0, 160)))\n mstore(add(headStart, 224), mload(add(value0, 192)))\n let _3 := mload(add(value0, 224))\n let _4 := 256\n mstore(add(headStart, _4), _3)\n let _5 := mload(add(value0, _4))\n let _6 := 288\n mstore(add(headStart, _6), _5)\n let memberValue0_2 := mload(add(value0, _6))\n let _7 := 320\n mstore(add(headStart, _7), add(sub(tail_2, headStart), _2))\n let tail_3 := abi_encode_string(memberValue0_2, tail_2)\n let memberValue0_3 := mload(add(value0, _7))\n mstore(add(headStart, _1), add(sub(tail_3, headStart), _2))\n tail := abi_encode_string(memberValue0_3, tail_3)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function calldata_access_bytes_calldata(base_ref, ptr) -> value, length\n {\n let rel_offset_of_tail := calldataload(ptr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let value_1 := add(rel_offset_of_tail, base_ref)\n length := calldataload(value_1)\n value := add(value_1, 0x20)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n if sgt(value, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr__to_t_struct$_UserOperation_$10993_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n abi_encode_address(abi_decode_address(value0), add(headStart, 32))\n mstore(add(headStart, 64), calldataload(add(value0, 32)))\n let memberValue0, memberValue1 := calldata_access_bytes_calldata(value0, add(value0, 64))\n let _1 := 0x0160\n mstore(add(headStart, 96), _1)\n let tail_1 := abi_encode_bytes_calldata(memberValue0, memberValue1, add(headStart, 384))\n let memberValue0_1, memberValue1_1 := calldata_access_bytes_calldata(value0, add(value0, 96))\n let _2 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n mstore(add(headStart, 128), add(sub(tail_1, headStart), _2))\n let tail_2 := abi_encode_bytes_calldata(memberValue0_1, memberValue1_1, tail_1)\n mstore(add(headStart, 160), calldataload(add(value0, 128)))\n mstore(add(headStart, 192), calldataload(add(value0, 160)))\n mstore(add(headStart, 224), calldataload(add(value0, 192)))\n let _3 := 256\n mstore(add(headStart, _3), calldataload(add(value0, 224)))\n let _4 := 288\n mstore(add(headStart, _4), calldataload(add(value0, _3)))\n let memberValue0_2, memberValue1_2 := calldata_access_bytes_calldata(value0, add(value0, _4))\n let _5 := 320\n mstore(add(headStart, _5), add(sub(tail_2, headStart), _2))\n let tail_3 := abi_encode_bytes_calldata(memberValue0_2, memberValue1_2, tail_2)\n let memberValue0_3, memberValue1_3 := calldata_access_bytes_calldata(value0, add(value0, _5))\n mstore(add(headStart, _1), add(sub(tail_3, headStart), _2))\n tail := abi_encode_bytes_calldata(memberValue0_3, memberValue1_3, tail_3)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4(array) -> value\n {\n let length := mload(array)\n let _1 := mload(add(array, 0x20))\n let _2 := 0xffffffff00000000000000000000000000000000000000000000000000000000\n value := and(_1, _2)\n if lt(length, 4)\n {\n value := and(and(_1, shl(shl(3, sub(4, length)), _2)), _2)\n }\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_decode_uint48_fromMemory(offset) -> value\n {\n value := mload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_available_length_bytes_fromMemory(src, length, end) -> array\n {\n array := allocate_memory(array_allocation_size_bytes(length))\n mstore(array, length)\n if gt(add(src, length), end) { revert(0, 0) }\n copy_memory_to_memory(src, add(array, 0x20), length)\n }\n function abi_decode_bytes_fromMemory(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n array := abi_decode_available_length_bytes_fromMemory(add(offset, 0x20), mload(offset), end)\n }\n function abi_decode_struct_ReturnInfo_fromMemory(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0xc0) { revert(0, 0) }\n value := allocate_memory_3194()\n mstore(value, mload(headStart))\n mstore(add(value, 32), mload(add(headStart, 32)))\n let value_1 := mload(add(headStart, 64))\n if iszero(eq(value_1, iszero(iszero(value_1)))) { revert(0, 0) }\n mstore(add(value, 64), value_1)\n mstore(add(value, 96), abi_decode_uint48_fromMemory(add(headStart, 96)))\n mstore(add(value, 128), abi_decode_uint48_fromMemory(add(headStart, 128)))\n let offset := mload(add(headStart, 160))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n mstore(add(value, 160), abi_decode_bytes_fromMemory(add(headStart, offset), end))\n }\n function abi_decode_struct_StakeInfo_fromMemory(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0x40) { revert(0, 0) }\n value := allocate_memory_3195()\n mstore(value, mload(headStart))\n mstore(add(value, 32), mload(add(headStart, 32)))\n }\n function abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 224) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_ReturnInfo_fromMemory(add(headStart, offset), dataEnd)\n value1 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 32), dataEnd)\n value2 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 96), dataEnd)\n value3 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 160), dataEnd)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function abi_decode_tuple_t_struct$_ReturnInfo_$6721_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_StakeInfo_$6726_memory_ptrt_struct$_AggregatorStakeInfo_$6732_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n let _1 := sub(dataEnd, headStart)\n if slt(_1, 320) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_ReturnInfo_fromMemory(add(headStart, offset), dataEnd)\n value1 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 32), dataEnd)\n value2 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 96), dataEnd)\n value3 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 160), dataEnd)\n if slt(add(_1, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20), 96) { revert(0, 0) }\n let value := allocate_memory_3195()\n let value_1 := mload(add(headStart, 224))\n validator_revert_contract_IEntryPoint(value_1)\n mstore(value, value_1)\n mstore(add(value, 32), abi_decode_struct_StakeInfo_fromMemory(add(headStart, 256), dataEnd))\n value4 := value\n }\n function abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := mload(headStart)\n let offset := mload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n value1 := abi_decode_available_length_bytes_fromMemory(add(_1, 32), mload(_1), dataEnd)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 14)\n mstore(add(headStart, 64), \"slice_overflow\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"slice_outOfBounds\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061004c5760003560e01c80633024e00c146100515780637b34b6211461007a578063b0d691fe1461009b578063ee219423146100e0575b600080fd5b61006461005f366004610e68565b610101565b6040516100719190611027565b60405180910390f35b61008d61008836600461106b565b61021e565b604051908152602001610071565b6000546100bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610071565b6100f36100ee366004611105565b610307565b60405161007192919061119d565b6060815167ffffffffffffffff81111561011d5761011d610ce6565b604051908082528060200260200182016040528015610146578160200160208202803683370190505b50905060005b8251811015610217578373ffffffffffffffffffffffffffffffffffffffff1663a6193531848381518110610183576101836112e7565b60200260200101516040518263ffffffff1660e01b81526004016101a79190611316565b602060405180830381865afa1580156101c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e89190611404565b8282815181106101fa576101fa6112e7565b60209081029190910101528061020f8161144c565b91505061014c565b5092915050565b600080825167ffffffffffffffff81111561023b5761023b610ce6565b604051908082528060200260200182016040528015610264578160200160208202803683370190505b50905060005b83518110156102d357838181518110610285576102856112e7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102b6576102b66112e7565b6020908102919091010152806102cb8161144c565b91505061026a565b506000816040516020016102e79190611027565b60408051601f198184030181529190528051602090910120949350505050565b6040805160608082018352600080835260208301529181019190915261032b610bc5565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061038190869060040161151a565b600060405180830381600087803b15801561039b57600080fd5b505af19250505080156103ac575060015b610a5d573d8080156103da576040519150601f19603f3d011682016040523d82523d6000602084013e6103df565b606091505b5060006103eb8261162c565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016105d05760008060008061045486600480895161044f919061167c565b610a62565b80602001905181019061046791906117bf565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161053d90611831565b80601f016020809104026020016040519081016040528092919081815260200182805461056990611831565b80156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161077c576000806000806000610634876004808a5161044f919061167c565b8060200190518101906106479190611884565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916106e890611831565b80601f016020809104026020016040519081016040528092919081815260200182805461071490611831565b80156107615780601f1061073657610100808354040283529160200191610761565b820191906000526020600020905b81548152906001019060200180831161074457829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610a5a576000806107db84600480875161044f919061167c565b8060200190518101906107ee919061195b565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c001604052908160008201805461082e90611831565b80601f016020809104026020016040519081016040528092919081815260200182805461085a90611831565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a084019161092590611831565b80601f016020809104026020016040519081016040528092919081815260200182805461095190611831565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610a7081601f6119b6565b1015610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b610ae782846119b6565b84511015610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ad4565b606082158015610b705760405191506000825260208201604052610bba565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610ba9578051835260209283019201610b91565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610c26604051806040016040528060008152602001600081525090565b8152602001610c48604051806040016040528060008152602001600081525090565b8152602001610c6a604051806040016040528060008152602001600081525090565b8152602001610c77610c7c565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610c77604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce357600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610d3957610d39610ce6565b60405290565b60405160c0810167ffffffffffffffff81118282101715610d3957610d39610ce6565b6040805190810167ffffffffffffffff81118282101715610d3957610d39610ce6565b604051601f8201601f1916810167ffffffffffffffff81118282101715610dae57610dae610ce6565b604052919050565b600067ffffffffffffffff821115610dd057610dd0610ce6565b5060051b60200190565b8035610de581610cc1565b919050565b600067ffffffffffffffff821115610e0457610e04610ce6565b50601f01601f191660200190565b600082601f830112610e2357600080fd5b8135610e36610e3182610dea565b610d85565b818152846020838601011115610e4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610e7b57600080fd5b8235610e8681610cc1565b915060208381013567ffffffffffffffff80821115610ea457600080fd5b818601915086601f830112610eb857600080fd5b8135610ec6610e3182610db6565b81815260059190911b83018401908481019089831115610ee557600080fd5b8585015b8381101561101657803585811115610f0057600080fd5b8601610160818d03601f19011215610f1757600080fd5b610f1f610d15565b610f2a898301610dda565b8152604082013589820152606082013587811115610f4757600080fd5b610f558e8b83860101610e12565b604083015250608082013587811115610f6d57600080fd5b610f7b8e8b83860101610e12565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408083013588811115610fca57600080fd5b610fd88f8c83870101610e12565b6101208401525061016083013588811115610ff257600080fd5b6110008f8c83870101610e12565b9183019190915250845250918601918601610ee9565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561105f57835183529284019291840191600101611043565b50909695505050505050565b6000602080838503121561107e57600080fd5b823567ffffffffffffffff81111561109557600080fd5b8301601f810185136110a657600080fd5b80356110b4610e3182610db6565b81815260059190911b820183019083810190878311156110d357600080fd5b928401925b828410156110fa5783356110eb81610cc1565b825292840192908401906110d8565b979650505050505050565b60006020828403121561111757600080fd5b813567ffffffffffffffff81111561112e57600080fd5b82016101608185031215610bbe57600080fd5b60005b8381101561115c578181015183820152602001611144565b8381111561116b576000848401525b50505050565b60008151808452611189816020860160208601611141565b601f01601f19169290920160200192915050565b600060408083528451151581840152602080860151606085015281860151606060808601526111cf60a0860182611171565b90508481038286015261016086518183526111ec82840182611171565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261124f60c0820184611171565b9250508286015161126c8483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a086015192506112dd610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261133d60208201835173ffffffffffffffffffffffffffffffffffffffff169052565b6020820151604082015260006040830151610160806060850152611365610180850183611171565b91506060850151601f19808685030160808701526113838483611171565b9350608087015160a087015260a087015160c087015260c087015160e087015260e087015191506101008281880152808801519250506101208281880152808801519250506101408187860301818801526113de8584611171565b9088015187820390920184880152935090506113fa8382611171565b9695505050505050565b60006020828403121561141657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361147d5761147d61141d565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114b957600080fd5b830160208101925035905067ffffffffffffffff8111156114d957600080fd5b8036038213156114e857600080fd5b9250929050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b602081526115486020820161152e84610dda565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006115616040840184611484565b610160806060860152611579610180860183856114ef565b92506115886060870187611484565b9250601f19808786030160808801526115a28585846114ef565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526115e982890189611484565b945091506101408188870301818901526116048686856114ef565b9550611612818a018a611484565b9550925050808786030183880152506110fa8484836114ef565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156116745780818460040360031b1b83161693505b505050919050565b60008282101561168e5761168e61141d565b500390565b805165ffffffffffff81168114610de557600080fd5b60006116b7610e3184610dea565b90508281528383830111156116cb57600080fd5b610bbe836020830184611141565b600082601f8301126116ea57600080fd5b610bbe838351602085016116a9565b600060c0828403121561170b57600080fd5b611713610d3f565b905081518152602082015160208201526040820151801515811461173657600080fd5b604082015261174760608301611693565b606082015261175860808301611693565b608082015260a082015167ffffffffffffffff81111561177757600080fd5b611783848285016116d9565b60a08301525092915050565b6000604082840312156117a157600080fd5b6117a9610d62565b9050815181526020820151602082015292915050565b60008060008060e085870312156117d557600080fd5b845167ffffffffffffffff8111156117ec57600080fd5b6117f8878288016116f9565b945050611808866020870161178f565b9250611817866060870161178f565b91506118268660a0870161178f565b905092959194509250565b600181811c9082168061184557607f821691505b60208210810361187e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600080600080600085870361014081121561189e57600080fd5b865167ffffffffffffffff8111156118b557600080fd5b6118c189828a016116f9565b9650506118d1886020890161178f565b94506118e0886060890161178f565b93506118ef8860a0890161178f565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff208201121561192157600080fd5b5061192a610d62565b60e087015161193881610cc1565b815261194888610100890161178f565b6020820152809150509295509295909350565b6000806040838503121561196e57600080fd5b82519150602083015167ffffffffffffffff81111561198c57600080fd5b8301601f8101851361199d57600080fd5b6119ac858251602084016116a9565b9150509250929050565b600082198211156119c9576119c961141d565b50019056fea2646970667358221220e8ba5bb4b5e13ff96f7485fae52ca1d36b02d4fdfa3a7240912686c3e45b00bc64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3024E00C EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x7B34B621 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0xE0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0xE68 JUMP JUMPDEST PUSH2 0x101 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x1027 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0x106B JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x71 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xBB SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x71 JUMP JUMPDEST PUSH2 0xF3 PUSH2 0xEE CALLDATASIZE PUSH1 0x4 PUSH2 0x1105 JUMP JUMPDEST PUSH2 0x307 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11D JUMPI PUSH2 0x11D PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x146 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x217 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA6193531 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x183 JUMPI PUSH2 0x183 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1A7 SWAP2 SWAP1 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x1404 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1FA JUMPI PUSH2 0x1FA PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x20F DUP2 PUSH2 0x144C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x14C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x23B JUMPI PUSH2 0x23B PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x264 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x2D3 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x285 JUMPI PUSH2 0x285 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODEHASH DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2B6 JUMPI PUSH2 0x2B6 PUSH2 0x12E7 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x2CB DUP2 PUSH2 0x144C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x26A JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E7 SWAP2 SWAP1 PUSH2 0x1027 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x32B PUSH2 0xBC5 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xEE21942300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xEE219423 SWAP1 PUSH2 0x381 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x151A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x39B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3AC JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xA5D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3DA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x3EB DUP3 PUSH2 0x162C JUMP JUMPDEST SWAP1 POP PUSH32 0x1F300FA100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5D0 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x454 DUP7 PUSH1 0x4 DUP1 DUP10 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST PUSH2 0xA62 JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x467 SWAP2 SWAP1 PUSH2 0x17BF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x10 PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C7400000000000000000000000000000000 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP2 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP5 MLOAD DUP1 DUP7 ADD DUP7 MSTORE PUSH1 0x4 SLOAD DUP2 MSTORE PUSH1 0x5 SLOAD DUP2 DUP6 ADD MSTORE DUP2 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP9 SWAP13 POP SWAP7 SWAP11 POP SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP2 SWAP5 SWAP2 SWAP4 DUP6 SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH2 0x53D SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x569 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5B6 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x58B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5B6 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x599 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP8 POP SWAP8 POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0x5134B1C00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x634 DUP8 PUSH1 0x4 DUP1 DUP11 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x647 SWAP2 SWAP1 PUSH2 0x1884 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x1F PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C74576974684167677265676174696F6E00 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP10 SWAP15 POP SWAP8 SWAP13 POP SWAP6 SWAP11 POP SWAP4 SWAP9 POP SWAP2 SWAP7 POP SWAP2 SWAP5 SWAP1 SWAP4 DUP6 SWAP3 DUP5 ADD SWAP2 PUSH2 0x6E8 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x714 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x761 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x736 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x761 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x744 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0xDDFD994A00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0xA5A JUMPI PUSH1 0x0 DUP1 PUSH2 0x7DB DUP5 PUSH1 0x4 DUP1 DUP8 MLOAD PUSH2 0x44F SWAP2 SWAP1 PUSH2 0x167C JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x7EE SWAP2 SWAP1 PUSH2 0x195B JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP PUSH1 0xA DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD DUP1 SLOAD PUSH2 0x82E SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x85A SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8A7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x87C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x8A7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x88A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 DUP5 ADD DUP1 SLOAD DUP3 MSTORE PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP7 ADD SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP6 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP5 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x4 DUP6 ADD DUP1 SLOAD SWAP4 SWAP1 SWAP5 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH2 0x925 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x951 SWAP1 PUSH2 0x1831 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x99E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x973 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x99E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x981 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP5 ADD SLOAD DUP2 MSTORE PUSH1 0x6 DUP5 ADD SLOAD PUSH1 0x20 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x7 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0x8 DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE DUP3 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x9 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0xA DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0xB DUP6 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0xC DUP6 ADD SLOAD DUP4 MSTORE PUSH1 0xD SWAP1 SWAP5 ADD SLOAD DUP3 DUP3 ADD MSTORE DUP4 ADD MSTORE PUSH1 0x80 ADD MSTORE SWAP2 SWAP10 SWAP2 SWAP9 POP SWAP1 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST POP POP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xA70 DUP2 PUSH1 0x1F PUSH2 0x19B6 JUMP JUMPDEST LT ISZERO PUSH2 0xADD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAE7 DUP3 DUP5 PUSH2 0x19B6 JUMP JUMPDEST DUP5 MLOAD LT ISZERO PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F75744F66426F756E6473000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xAD4 JUMP JUMPDEST PUSH1 0x60 DUP3 ISZERO DUP1 ISZERO PUSH2 0xB70 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0xBBA JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F DUP5 AND DUP1 ISZERO PUSH1 0x20 MUL DUP2 DUP5 ADD ADD DUP6 DUP2 ADD DUP8 DUP4 ISZERO PUSH1 0x20 MUL DUP5 DUP12 ADD ADD ADD JUMPDEST DUP2 DUP4 LT ISZERO PUSH2 0xBA9 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xB91 JUMP JUMPDEST POP POP DUP6 DUP5 MSTORE PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x40 MSTORE POP JUMPDEST POP SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x60 DUP1 DUP4 MSTORE DUP4 MLOAD SWAP2 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE SWAP5 DUP4 ADD DUP2 SWAP1 MSTORE DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE SWAP1 SWAP2 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC26 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC48 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC6A PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC77 PUSH2 0xC7C JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC77 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xCE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xD39 JUMPI PUSH2 0xD39 PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xDAE JUMPI PUSH2 0xDAE PUSH2 0xCE6 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD0 JUMPI PUSH2 0xDD0 PUSH2 0xCE6 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xDE5 DUP2 PUSH2 0xCC1 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xE04 JUMPI PUSH2 0xE04 PUSH2 0xCE6 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xE23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE36 PUSH2 0xE31 DUP3 PUSH2 0xDEA JUMP JUMPDEST PUSH2 0xD85 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xE4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0xE86 DUP2 PUSH2 0xCC1 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xEA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xEB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEC6 PUSH2 0xE31 DUP3 PUSH2 0xDB6 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP4 ADD DUP5 ADD SWAP1 DUP5 DUP2 ADD SWAP1 DUP10 DUP4 GT ISZERO PUSH2 0xEE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 DUP6 ADD JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1016 JUMPI DUP1 CALLDATALOAD DUP6 DUP2 GT ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 ADD PUSH2 0x160 DUP2 DUP14 SUB PUSH1 0x1F NOT ADD SLT ISZERO PUSH2 0xF17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF1F PUSH2 0xD15 JUMP JUMPDEST PUSH2 0xF2A DUP10 DUP4 ADD PUSH2 0xDDA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP10 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0xF47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF55 DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7B DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x100 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x120 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0xFCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFD8 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xE12 JUMP JUMPDEST PUSH2 0x120 DUP5 ADD MSTORE POP PUSH2 0x160 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0xFF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1000 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xE12 JUMP JUMPDEST SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP5 MSTORE POP SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0xEE9 JUMP JUMPDEST POP DUP1 SWAP7 POP POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x105F JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1043 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x107E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1095 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x10A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x10B4 PUSH2 0xE31 DUP3 PUSH2 0xDB6 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP3 ADD DUP4 ADD SWAP1 DUP4 DUP2 ADD SWAP1 DUP8 DUP4 GT ISZERO PUSH2 0x10D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 DUP5 ADD SWAP3 JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x10FA JUMPI DUP4 CALLDATALOAD PUSH2 0x10EB DUP2 PUSH2 0xCC1 JUMP JUMPDEST DUP3 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH2 0x10D8 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0xBBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x115C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1144 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x116B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1189 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1141 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 MSTORE DUP5 MLOAD ISZERO ISZERO DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE DUP2 DUP7 ADD MLOAD PUSH1 0x60 PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x11CF PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 SUB DUP3 DUP7 ADD MSTORE PUSH2 0x160 DUP7 MLOAD DUP2 DUP4 MSTORE PUSH2 0x11EC DUP3 DUP5 ADD DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP8 ADD MLOAD DUP3 DUP3 SUB DUP5 DUP5 ADD MSTORE DUP1 MLOAD DUP3 MSTORE DUP4 DUP2 ADD MLOAD DUP5 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD ISZERO ISZERO DUP6 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD SWAP4 POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE DUP1 PUSH1 0x80 DUP4 ADD MLOAD AND PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xA0 DUP2 ADD MLOAD SWAP4 POP POP PUSH1 0xC0 PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x124F PUSH1 0xC0 DUP3 ADD DUP5 PUSH2 0x1171 JUMP JUMPDEST SWAP3 POP POP DUP3 DUP7 ADD MLOAD PUSH2 0x126C DUP5 DUP4 ADD DUP3 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0x80 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0xA0 DUP7 ADD MLOAD SWAP3 POP PUSH2 0x12DD PUSH2 0x100 DUP3 ADD DUP5 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP1 MLOAD DUP3 DUP5 ADD MSTORE ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x133D PUSH1 0x20 DUP3 ADD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x160 DUP1 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x1365 PUSH2 0x180 DUP6 ADD DUP4 PUSH2 0x1171 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x1F NOT DUP1 DUP7 DUP6 SUB ADD PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x1383 DUP5 DUP4 PUSH2 0x1171 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0xC0 DUP8 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH1 0xE0 DUP8 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD SWAP2 POP PUSH2 0x100 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x120 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x140 DUP2 DUP8 DUP7 SUB ADD DUP2 DUP9 ADD MSTORE PUSH2 0x13DE DUP6 DUP5 PUSH2 0x1171 JUMP JUMPDEST SWAP1 DUP9 ADD MLOAD DUP8 DUP3 SUB SWAP1 SWAP3 ADD DUP5 DUP9 ADD MSTORE SWAP4 POP SWAP1 POP PUSH2 0x13FA DUP4 DUP3 PUSH2 0x1171 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x147D JUMPI PUSH2 0x147D PUSH2 0x141D JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x14B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x14E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x1548 PUSH1 0x20 DUP3 ADD PUSH2 0x152E DUP5 PUSH2 0xDDA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x1561 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x1484 JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x1579 PUSH2 0x180 DUP7 ADD DUP4 DUP6 PUSH2 0x14EF JUMP JUMPDEST SWAP3 POP PUSH2 0x1588 PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x1484 JUMP JUMPDEST SWAP3 POP PUSH1 0x1F NOT DUP1 DUP8 DUP7 SUB ADD PUSH1 0x80 DUP9 ADD MSTORE PUSH2 0x15A2 DUP6 DUP6 DUP5 PUSH2 0x14EF JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 SWAP4 POP PUSH1 0xE0 DUP9 ADD CALLDATALOAD DUP5 DUP9 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP4 DUP9 ADD CALLDATALOAD DUP3 DUP9 ADD MSTORE PUSH2 0x15E9 DUP3 DUP10 ADD DUP10 PUSH2 0x1484 JUMP JUMPDEST SWAP5 POP SWAP2 POP PUSH2 0x140 DUP2 DUP9 DUP8 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x1604 DUP7 DUP7 DUP6 PUSH2 0x14EF JUMP JUMPDEST SWAP6 POP PUSH2 0x1612 DUP2 DUP11 ADD DUP11 PUSH2 0x1484 JUMP JUMPDEST SWAP6 POP SWAP3 POP POP DUP1 DUP8 DUP7 SUB ADD DUP4 DUP9 ADD MSTORE POP PUSH2 0x10FA DUP5 DUP5 DUP4 PUSH2 0x14EF JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 AND SWAP4 POP PUSH1 0x4 DUP4 LT ISZERO PUSH2 0x1674 JUMPI DUP1 DUP2 DUP5 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP4 POP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x168E JUMPI PUSH2 0x168E PUSH2 0x141D JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xDE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x16B7 PUSH2 0xE31 DUP5 PUSH2 0xDEA JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE DUP4 DUP4 DUP4 ADD GT ISZERO PUSH2 0x16CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBBE DUP4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1141 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x16EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBBE DUP4 DUP4 MLOAD PUSH1 0x20 DUP6 ADD PUSH2 0x16A9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x170B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1713 PUSH2 0xD3F JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1747 PUSH1 0x60 DUP4 ADD PUSH2 0x1693 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x1758 PUSH1 0x80 DUP4 ADD PUSH2 0x1693 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1777 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1783 DUP5 DUP3 DUP6 ADD PUSH2 0x16D9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17A9 PUSH2 0xD62 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17F8 DUP8 DUP3 DUP9 ADD PUSH2 0x16F9 JUMP JUMPDEST SWAP5 POP POP PUSH2 0x1808 DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP3 POP PUSH2 0x1817 DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP2 POP PUSH2 0x1826 DUP7 PUSH1 0xA0 DUP8 ADD PUSH2 0x178F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x1845 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x187E JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 DUP8 SUB PUSH2 0x140 DUP2 SLT ISZERO PUSH2 0x189E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18C1 DUP10 DUP3 DUP11 ADD PUSH2 0x16F9 JUMP JUMPDEST SWAP7 POP POP PUSH2 0x18D1 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP5 POP PUSH2 0x18E0 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP4 POP PUSH2 0x18EF DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST SWAP3 POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 DUP3 ADD SLT ISZERO PUSH2 0x1921 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x192A PUSH2 0xD62 JUMP JUMPDEST PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1938 DUP2 PUSH2 0xCC1 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1948 DUP9 PUSH2 0x100 DUP10 ADD PUSH2 0x178F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x196E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x198C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x199D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19AC DUP6 DUP3 MLOAD PUSH1 0x20 DUP5 ADD PUSH2 0x16A9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x19C9 JUMPI PUSH2 0x19C9 PUSH2 0x141D JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE8 0xBA JUMPDEST 0xB4 0xB5 0xE1 EXTCODEHASH 0xF9 PUSH16 0x7485FAE52CA1D36B02D4FDFA3A724091 0x26 DUP7 0xC3 0xE4 JUMPDEST STOP 0xBC PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"189:9137:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8653:317;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8976:348;;;;;;:::i;:::-;;:::i;:::-;;;7061:25:111;;;7049:2;7034:18;8976:348:50;6915:177:111;3683:29:50;;;;;;;;;;;;7294:42:111;7282:55;;;7264:74;;7252:2;7237:18;3683:29:50;7097:247:111;4259:1578:50;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8653:317::-;8755:20;8807:7;:14;8793:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8793:29:50;;8787:35;;8837:6;8832:112;8853:7;:14;8849:1;:18;8832:112;;;8897:10;:24;;;8922:7;8930:1;8922:10;;;;;;;;:::i;:::-;;;;;;;8897:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8888:3;8892:1;8888:6;;;;;;;;:::i;:::-;;;;;;;;;;:45;8869:3;;;;:::i;:::-;;;;8832:112;;;;8653:317;;;;:::o;8976:348::-;9048:7;9067:23;9107:9;:16;9093:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9093:31:50;;9067:57;;9139:6;9134:102;9155:9;:16;9151:1;:20;9134:102;;;9204:9;9214:1;9204:12;;;;;;;;:::i;:::-;;;;;;;:21;;;9192:6;9199:1;9192:9;;;;;;;;:::i;:::-;;;;;;;;;;:33;9173:3;;;;:::i;:::-;;;;9134:102;;;;9245:17;9276:6;9265:18;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9265:18:50;;;;;;;;;9301:15;;9265:18;9301:15;;;;;8976:348;-1:-1:-1;;;;8976:348:50:o;4259:1578::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;4359:15:50;;:::i;:::-;4390:10;;:37;;;;;:10;;;;;:29;;:37;;4420:6;;4390:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4386:1445;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4485:23:50;4511:18;4518:10;4511:18;:::i;:::-;4485:44;-1:-1:-1;4548:45:50;;;;;4544:1277;;4614:28;4644:27;4673:28;4703:30;4748:43;4754:10;4766:1;4789;4769:10;:17;:21;;;;:::i;:::-;4748:5;:43::i;:::-;4737:102;;;;;;;;;;;;:::i;:::-;4880:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4880:101:50;;;;;;;;;;;;4961:19;4880:101;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4880:101:50;;;4857:125;;;;;;;4865:13;4857:125;;;;;;;;;;;;;;;;;;;;4613:226;;-1:-1:-1;4613:226:50;;-1:-1:-1;4613:226:50;;-1:-1:-1;4613:226:50;;-1:-1:-1;4865:13:50;;4880:101;;4865:13;;4857:125;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4259:1578;;;:::o;4544:1277::-;5007:60;;;;;5003:818;;5088:28;5118:27;5147:28;5177:30;5209:41;5265:43;5271:10;5283:1;5306;5286:10;:17;:21;;;;:::i;5265:43::-;5254:123;;;;;;;;;;;;:::i;:::-;5418:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5418:111:50;;;;;-1:-1:-1;5418:111:50;;;;;5395:135;;;;;;;5403:13;5395:135;;;;;;;;;;;;;;;;;;;;5087:290;;-1:-1:-1;5087:290:50;;-1:-1:-1;5087:290:50;;-1:-1:-1;5087:290:50;;-1:-1:-1;5087:290:50;;-1:-1:-1;5403:13:50;;5418:111;;5403:13;;5395:135;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4259:1578;;;:::o;5003:818::-;5555:37;;;;;5551:270;;5612:15;5629:20;5664:43;5670:10;5682:1;5705;5685:10;:17;:21;;;;:::i;5664:43::-;5653:74;;;;;;;;;;;;:::i;:::-;5611:116;;;;5753:37;;;;;;;;5768:4;5753:37;;;;;;5774:7;5753:37;;;;5783:6;5753:37;;;5792:13;5745:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5745:61:50;;;-1:-1:-1;;5745:61:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5745:61:50;;;;-1:-1:-1;;;5745:61:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4259:1578:50;;-1:-1:-1;;;;;;;4259:1578:50:o;5551:270::-;4471:1360;4439:1392;4386:1445;4259:1578;;;:::o;5843:2804::-;5989:12;6041:7;6025:12;6041:7;6035:2;6025:12;:::i;:::-;:23;;6017:50;;;;;;;21729:2:111;6017:50:50;;;21711:21:111;21768:2;21748:18;;;21741:30;21807:16;21787:18;;;21780:44;21841:18;;6017:50:50;;;;;;;;;6102:16;6111:7;6102:6;:16;:::i;:::-;6085:6;:13;:33;;6077:63;;;;;;;22072:2:111;6077:63:50;;;22054:21:111;22111:2;22091:18;;;22084:30;22150:19;22130:18;;;22123:47;22187:18;;6077:63:50;21870:341:111;6077:63:50;6151:22;6214:15;;6242:1967;;;;8350:4;8344:11;8331:24;;8536:1;8525:9;8518:20;8584:4;8573:9;8569:20;8563:4;8556:34;6207:2397;;6242:1967;6424:4;6418:11;6405:24;;7083:2;7074:7;7070:16;7465:9;7458:17;7452:4;7448:28;7436:9;7425;7421:25;7417:60;7513:7;7509:2;7505:16;7765:6;7751:9;7744:17;7738:4;7734:28;7722:9;7714:6;7710:22;7706:57;7702:70;7539:425;7798:3;7794:2;7791:11;7539:425;;;7936:9;;7925:21;;7839:4;7831:13;;;;7871;7539:425;;;-1:-1:-1;;7982:26:50;;;8190:2;8173:11;-1:-1:-1;;8169:25:50;8163:4;8156:39;-1:-1:-1;6207:2397:50;-1:-1:-1;8631:9:50;-1:-1:-1;5843:2804:50;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:167:111;113:42;106:5;102:54;95:5;92:65;82:93;;171:1;168;161:12;82:93;14:167;:::o;186:184::-;238:77;235:1;228:88;335:4;332:1;325:15;359:4;356:1;349:15;375:255;447:2;441:9;489:6;477:19;;526:18;511:34;;547:22;;;508:62;505:88;;;573:18;;:::i;:::-;609:2;602:22;375:255;:::o;635:253::-;707:2;701:9;749:4;737:17;;784:18;769:34;;805:22;;;766:62;763:88;;;831:18;;:::i;893:257::-;965:4;959:11;;;997:17;;1044:18;1029:34;;1065:22;;;1026:62;1023:88;;;1091:18;;:::i;1155:334::-;1226:2;1220:9;1282:2;1272:13;;-1:-1:-1;;1268:86:111;1256:99;;1385:18;1370:34;;1406:22;;;1367:62;1364:88;;;1432:18;;:::i;:::-;1468:2;1461:22;1155:334;;-1:-1:-1;1155:334:111:o;1494:196::-;1567:4;1600:18;1592:6;1589:30;1586:56;;;1622:18;;:::i;:::-;-1:-1:-1;1667:1:111;1663:14;1679:4;1659:25;;1494:196::o;1695:147::-;1763:20;;1792:44;1763:20;1792:44;:::i;:::-;1695:147;;;:::o;1847:245::-;1895:4;1928:18;1920:6;1917:30;1914:56;;;1950:18;;:::i;:::-;-1:-1:-1;2007:2:111;1995:15;-1:-1:-1;;1991:88:111;2081:4;1987:99;;1847:245::o;2097:462::-;2139:5;2192:3;2185:4;2177:6;2173:17;2169:27;2159:55;;2210:1;2207;2200:12;2159:55;2246:6;2233:20;2277:48;2293:31;2321:2;2293:31;:::i;:::-;2277:48;:::i;:::-;2350:2;2341:7;2334:19;2396:3;2389:4;2384:2;2376:6;2372:15;2368:26;2365:35;2362:55;;;2413:1;2410;2403:12;2362:55;2478:2;2471:4;2463:6;2459:17;2452:4;2443:7;2439:18;2426:55;2526:1;2501:16;;;2519:4;2497:27;2490:38;;;;2505:7;2097:462;-1:-1:-1;;;2097:462:111:o;2564:2712::-;2710:6;2718;2771:2;2759:9;2750:7;2746:23;2742:32;2739:52;;;2787:1;2784;2777:12;2739:52;2826:9;2813:23;2845:44;2883:5;2845:44;:::i;:::-;2908:5;-1:-1:-1;2932:2:111;2970:18;;;2957:32;3008:18;3038:14;;;3035:34;;;3065:1;3062;3055:12;3035:34;3103:6;3092:9;3088:22;3078:32;;3148:7;3141:4;3137:2;3133:13;3129:27;3119:55;;3170:1;3167;3160:12;3119:55;3206:2;3193:16;3229:73;3245:56;3298:2;3245:56;:::i;3229:73::-;3336:15;;;3418:1;3414:10;;;;3406:19;;3402:28;;;3367:12;;;;3442:19;;;3439:39;;;3474:1;3471;3464:12;3439:39;3506:2;3502;3498:11;3518:1728;3534:6;3529:3;3526:15;3518:1728;;;3620:3;3607:17;3656:2;3643:11;3640:19;3637:39;;;3672:1;3669;3662:12;3637:39;3699:20;;3830:6;3743:16;;;-1:-1:-1;;3739:89:111;3735:102;3732:122;;;3850:1;3847;3840:12;3732:122;3882:22;;:::i;:::-;3933:31;3960:2;3956;3952:11;3933:31;:::i;:::-;3924:7;3917:48;4024:2;4020;4016:11;4003:25;3998:2;3989:7;3985:16;3978:51;4079:2;4075;4071:11;4058:25;4112:2;4102:8;4099:16;4096:36;;;4128:1;4125;4118:12;4096:36;4170:53;4215:7;4210:2;4199:8;4195:2;4191:17;4187:26;4170:53;:::i;:::-;4165:2;4156:7;4152:16;4145:79;;4274:3;4270:2;4266:12;4253:26;4308:2;4298:8;4295:16;4292:36;;;4324:1;4321;4314:12;4292:36;4366:53;4411:7;4406:2;4395:8;4391:2;4387:17;4383:26;4366:53;:::i;:::-;4361:2;4352:7;4348:16;4341:79;;4480:3;4476:2;4472:12;4459:26;4453:3;4444:7;4440:17;4433:53;4546:3;4542:2;4538:12;4525:26;4519:3;4510:7;4506:17;4499:53;4612:3;4608:2;4604:12;4591:26;4585:3;4576:7;4572:17;4565:53;4678:3;4674:2;4670:12;4657:26;4651:3;4642:7;4638:17;4631:53;4744:3;4740:2;4736:12;4723:26;4717:3;4708:7;4704:17;4697:53;4773:3;4826:2;4822;4818:11;4805:25;4859:2;4849:8;4846:16;4843:36;;;4875:1;4872;4865:12;4843:36;4918:53;4963:7;4958:2;4947:8;4943:2;4939:17;4935:26;4918:53;:::i;:::-;4912:3;4903:7;4899:17;4892:80;;5022:6;5018:2;5014:15;5001:29;5059:2;5049:8;5046:16;5043:36;;;5075:1;5072;5065:12;5043:36;5117:53;5162:7;5157:2;5146:8;5142:2;5138:17;5134:26;5117:53;:::i;:::-;5099:16;;;5092:79;;;;-1:-1:-1;5184:20:111;;-1:-1:-1;5224:12:111;;;;3551;;3518:1728;;;3522:3;5265:5;5255:15;;;;;;;;2564:2712;;;;;:::o;5281:632::-;5452:2;5504:21;;;5574:13;;5477:18;;;5596:22;;;5423:4;;5452:2;5675:15;;;;5649:2;5634:18;;;5423:4;5718:169;5732:6;5729:1;5726:13;5718:169;;;5793:13;;5781:26;;5862:15;;;;5827:12;;;;5754:1;5747:9;5718:169;;;-1:-1:-1;5904:3:111;;5281:632;-1:-1:-1;;;;;;5281:632:111:o;5918:992::-;6002:6;6033:2;6076;6064:9;6055:7;6051:23;6047:32;6044:52;;;6092:1;6089;6082:12;6044:52;6132:9;6119:23;6165:18;6157:6;6154:30;6151:50;;;6197:1;6194;6187:12;6151:50;6220:22;;6273:4;6265:13;;6261:27;-1:-1:-1;6251:55:111;;6302:1;6299;6292:12;6251:55;6338:2;6325:16;6361:73;6377:56;6430:2;6377:56;:::i;6361:73::-;6468:15;;;6550:1;6546:10;;;;6538:19;;6534:28;;;6499:12;;;;6574:19;;;6571:39;;;6606:1;6603;6596:12;6571:39;6630:11;;;;6650:230;6666:6;6661:3;6658:15;6650:230;;;6746:3;6733:17;6763:44;6801:5;6763:44;:::i;:::-;6820:18;;6683:12;;;;6858;;;;6650:230;;;6899:5;5918:992;-1:-1:-1;;;;;;;5918:992:111:o;7349:394::-;7442:6;7495:2;7483:9;7474:7;7470:23;7466:32;7463:52;;;7511:1;7508;7501:12;7463:52;7551:9;7538:23;7584:18;7576:6;7573:30;7570:50;;;7616:1;7613;7606:12;7570:50;7639:22;;7695:3;7677:16;;;7673:26;7670:46;;;7712:1;7709;7702:12;7748:258;7820:1;7830:113;7844:6;7841:1;7838:13;7830:113;;;7920:11;;;7914:18;7901:11;;;7894:39;7866:2;7859:10;7830:113;;;7961:6;7958:1;7955:13;7952:48;;;7996:1;7987:6;7982:3;7978:16;7971:27;7952:48;;7748:258;;;:::o;8011:317::-;8053:3;8091:5;8085:12;8118:6;8113:3;8106:19;8134:63;8190:6;8183:4;8178:3;8174:14;8167:4;8160:5;8156:16;8134:63;:::i;:::-;8242:2;8230:15;-1:-1:-1;;8226:88:111;8217:98;;;;8317:4;8213:109;;8011:317;-1:-1:-1;;8011:317:111:o;8896:2051::-;9132:4;9161:2;9190;9179:9;9172:21;9249:6;9243:13;9236:21;9229:29;9224:2;9213:9;9209:18;9202:57;9278:4;9338:2;9330:6;9326:15;9320:22;9313:4;9302:9;9298:20;9291:52;9390:2;9382:6;9378:15;9372:22;9431:4;9425:3;9414:9;9410:19;9403:33;9456:52;9503:3;9492:9;9488:19;9474:12;9456:52;:::i;:::-;9445:63;;9553:9;9548:3;9544:19;9539:2;9528:9;9524:18;9517:47;9583:6;9626;9620:13;9654:2;9649:3;9642:15;9680:47;9723:2;9718:3;9714:12;9698:14;9680:47;:::i;:::-;9666:61;;;9776:2;9768:6;9764:15;9758:22;9822:3;9814:6;9810:16;9805:2;9800:3;9796:12;9789:38;9857:14;9851:21;9843:6;9836:37;9932:2;9916:14;9912:23;9906:30;9901:2;9893:6;9889:15;9882:55;10010:2;9994:14;9990:23;9984:30;9977:38;9970:46;9965:2;9957:6;9953:15;9946:71;10074:4;10058:14;10054:25;10048:32;10026:54;;10099:14;10168:2;10152:14;10148:23;10141:4;10133:6;10129:17;10122:50;10243:2;10236:3;10220:14;10216:24;10210:31;10206:40;10200:3;10192:6;10188:16;10181:66;;10304:3;10288:14;10284:24;10278:31;10256:53;;;10343:4;10337:3;10329:6;10325:16;10318:30;10370:52;10416:4;10408:6;10404:17;10388:14;10370:52;:::i;:::-;10357:65;;;10471:2;10463:6;10459:15;10453:22;10484:57;10537:2;10532:3;10528:12;10512:14;8408:12;;8396:25;;8470:4;8459:16;;;8453:23;8437:14;;8430:47;8333:150;10484:57;-1:-1:-1;10590:4:111;10578:17;;10572:24;8408:12;;10658:3;10649:13;;8396:25;8470:4;8459:16;;8453:23;8437:14;;;8430:47;10572:24;-1:-1:-1;10712:3:111;10700:16;;10694:23;8408:12;;10779:4;10770:14;;8396:25;8470:4;8459:16;;8453:23;8437:14;;;8430:47;10694:23;-1:-1:-1;10834:3:111;10826:6;10822:16;10816:23;10794:45;;10848:71;10911:6;10906:3;10902:16;10886:14;8709:12;;8723:42;8705:61;8693:74;;8813:4;8802:16;;;8796:23;8408:12;;8870:14;;;8396:25;8459:16;8453:23;8437:14;;;;8430:47;8620:271;10848:71;-1:-1:-1;10936:5:111;8896:2051;-1:-1:-1;;;;;8896:2051:111:o;10952:184::-;11004:77;11001:1;10994:88;11101:4;11098:1;11091:15;11125:4;11122:1;11115:15;11141:1558;11334:2;11323:9;11316:21;11346:53;11395:2;11384:9;11380:18;11371:6;11365:13;8565:42;8554:54;8542:67;;8488:127;11346:53;11453:2;11445:6;11441:15;11435:22;11430:2;11419:9;11415:18;11408:50;11297:4;11505:2;11497:6;11493:15;11487:22;11528:6;11570:2;11565;11554:9;11550:18;11543:30;11596:52;11643:3;11632:9;11628:19;11614:12;11596:52;:::i;:::-;11582:66;;11697:2;11689:6;11685:15;11679:22;-1:-1:-1;;11851:2:111;11839:9;11831:6;11827:22;11823:31;11817:3;11806:9;11802:19;11795:60;11878:41;11912:6;11896:14;11878:41;:::i;:::-;11864:55;;11974:3;11966:6;11962:16;11956:23;11950:3;11939:9;11935:19;11928:52;12035:3;12027:6;12023:16;12017:23;12011:3;12000:9;11996:19;11989:52;12096:3;12088:6;12084:16;12078:23;12072:3;12061:9;12057:19;12050:52;12139:3;12131:6;12127:16;12121:23;12111:33;;12163:3;12202:2;12197;12186:9;12182:18;12175:30;12242:2;12234:6;12230:15;12224:22;12214:32;;;12265:3;12304:2;12299;12288:9;12284:18;12277:30;12356:2;12348:6;12344:15;12338:22;12316:44;;;12379:3;12446:2;12434:9;12426:6;12422:22;12418:31;12413:2;12402:9;12398:18;12391:59;12473:41;12507:6;12491:14;12473:41;:::i;:::-;12551:15;;;12545:22;12607;;;12603:31;;;12583:18;;;12576:59;12459:55;-1:-1:-1;12545:22:111;-1:-1:-1;12652:41:111;12459:55;12545:22;12652:41;:::i;:::-;12644:49;11141:1558;-1:-1:-1;;;;;;11141:1558:111:o;12704:184::-;12774:6;12827:2;12815:9;12806:7;12802:23;12798:32;12795:52;;;12843:1;12840;12833:12;12795:52;-1:-1:-1;12866:16:111;;12704:184;-1:-1:-1;12704:184:111:o;12893:::-;12945:77;12942:1;12935:88;13042:4;13039:1;13032:15;13066:4;13063:1;13056:15;13082:195;13121:3;13152:66;13145:5;13142:77;13139:103;;13222:18;;:::i;:::-;-1:-1:-1;13269:1:111;13258:13;;13082:195::o;13282:559::-;13340:5;13347:6;13407:3;13394:17;13489:66;13478:8;13462:14;13458:29;13454:102;13434:18;13430:127;13420:155;;13571:1;13568;13561:12;13420:155;13599:33;;13703:4;13690:18;;;-1:-1:-1;13651:21:111;;-1:-1:-1;13731:18:111;13720:30;;13717:50;;;13763:1;13760;13753:12;13717:50;13810:6;13794:14;13790:27;13783:5;13779:39;13776:59;;;13831:1;13828;13821:12;13776:59;13282:559;;;;;:::o;13846:325::-;13934:6;13929:3;13922:19;13986:6;13979:5;13972:4;13967:3;13963:14;13950:43;;14038:1;14031:4;14022:6;14017:3;14013:16;14009:27;14002:38;13904:3;14160:4;-1:-1:-1;;14085:2:111;14077:6;14073:15;14069:88;14064:3;14060:98;14056:109;14049:116;;13846:325;;;;:::o;14176:1861::-;14371:2;14360:9;14353:21;14383:66;14445:2;14434:9;14430:18;14402:26;14421:6;14402:26;:::i;:::-;8565:42;8554:54;8542:67;;8488:127;14383:66;14510:2;14502:6;14498:15;14485:29;14480:2;14469:9;14465:18;14458:57;14334:4;14558:55;14609:2;14601:6;14597:15;14589:6;14558:55;:::i;:::-;14632:6;14674:2;14669;14658:9;14654:18;14647:30;14700:74;14769:3;14758:9;14754:19;14740:12;14726;14700:74;:::i;:::-;14686:88;;14821:55;14872:2;14864:6;14860:15;14852:6;14821:55;:::i;:::-;14783:93;;-1:-1:-1;;15026:2:111;15014:9;15006:6;15002:22;14998:31;14992:3;14981:9;14977:19;14970:60;15053:65;15111:6;15095:14;15079;15053:65;:::i;:::-;15039:79;;15180:3;15172:6;15168:16;15155:30;15149:3;15138:9;15134:19;15127:59;15248:3;15240:6;15236:16;15223:30;15217:3;15206:9;15202:19;15195:59;15316:3;15308:6;15304:16;15291:30;15285:3;15274:9;15270:19;15263:59;15341:3;15331:13;;15405:3;15397:6;15393:16;15380:30;15375:2;15364:9;15360:18;15353:58;15430:3;15420:13;;15494:2;15486:6;15482:15;15469:29;15464:2;15453:9;15449:18;15442:57;15546:55;15597:2;15589:6;15585:15;15577:6;15546:55;:::i;:::-;15508:93;;;;15620:3;15687:2;15675:9;15667:6;15663:22;15659:31;15654:2;15643:9;15639:18;15632:59;15714:65;15772:6;15756:14;15740;15714:65;:::i;:::-;15700:79;;15826:55;15877:2;15869:6;15865:15;15857:6;15826:55;:::i;:::-;15788:93;;;;;15945:2;15933:9;15925:6;15921:22;15917:31;15912:2;15901:9;15897:18;15890:59;;15966:65;16024:6;16008:14;15992;15966:65;:::i;16042:407::-;16125:5;16165;16159:12;16207:4;16200:5;16196:16;16190:23;16232:66;16324:2;16320;16316:11;16307:20;;16350:1;16342:6;16339:13;16336:107;;;16430:2;16424;16414:6;16411:1;16407:14;16404:1;16400:22;16396:31;16392:2;16388:40;16384:49;16375:58;;16336:107;;;;16042:407;;;:::o;16454:125::-;16494:4;16522:1;16519;16516:8;16513:34;;;16527:18;;:::i;:::-;-1:-1:-1;16564:9:111;;16454:125::o;16584:171::-;16662:13;;16715:14;16704:26;;16694:37;;16684:65;;16745:1;16742;16735:12;16760:307;16835:5;16864:52;16880:35;16908:6;16880:35;:::i;16864:52::-;16855:61;;16939:6;16932:5;16925:21;16979:3;16970:6;16965:3;16961:16;16958:25;16955:45;;;16996:1;16993;16986:12;16955:45;17009:52;17054:6;17047:4;17040:5;17036:16;17031:3;17009:52;:::i;17072:235::-;17125:5;17178:3;17171:4;17163:6;17159:17;17155:27;17145:55;;17196:1;17193;17186:12;17145:55;17218:83;17297:3;17288:6;17282:13;17275:4;17267:6;17263:17;17218:83;:::i;17312:806::-;17380:5;17428:4;17416:9;17411:3;17407:19;17403:30;17400:50;;;17446:1;17443;17436:12;17400:50;17468:22;;:::i;:::-;17459:31;;17519:9;17513:16;17506:5;17499:31;17583:2;17572:9;17568:18;17562:25;17557:2;17550:5;17546:14;17539:49;17633:2;17622:9;17618:18;17612:25;17682:7;17675:15;17668:23;17659:7;17656:36;17646:64;;17706:1;17703;17696:12;17646:64;17737:2;17726:14;;17719:31;17782:48;17826:2;17811:18;;17782:48;:::i;:::-;17777:2;17770:5;17766:14;17759:72;17864:49;17908:3;17897:9;17893:19;17864:49;:::i;:::-;17858:3;17851:5;17847:15;17840:74;17958:3;17947:9;17943:19;17937:26;17986:18;17978:6;17975:30;17972:50;;;18018:1;18015;18008:12;17972:50;18055:56;18107:3;18098:6;18087:9;18083:22;18055:56;:::i;:::-;18049:3;18042:5;18038:15;18031:81;;17312:806;;;;:::o;18123:281::-;18190:5;18238:4;18226:9;18221:3;18217:19;18213:30;18210:50;;;18256:1;18253;18246:12;18210:50;18278:22;;:::i;:::-;18269:31;;18329:9;18323:16;18316:5;18309:31;18393:2;18382:9;18378:18;18372:25;18367:2;18360:5;18356:14;18349:49;18123:281;;;;:::o;18409:758::-;18615:6;18623;18631;18639;18692:3;18680:9;18671:7;18667:23;18663:33;18660:53;;;18709:1;18706;18699:12;18660:53;18742:9;18736:16;18775:18;18767:6;18764:30;18761:50;;;18807:1;18804;18797:12;18761:50;18830:72;18894:7;18885:6;18874:9;18870:22;18830:72;:::i;:::-;18820:82;;;18921:67;18980:7;18975:2;18964:9;18960:18;18921:67;:::i;:::-;18911:77;;19007:67;19066:7;19061:2;19050:9;19046:18;19007:67;:::i;:::-;18997:77;;19093:68;19153:7;19147:3;19136:9;19132:19;19093:68;:::i;:::-;19083:78;;18409:758;;;;;;;:::o;19172:437::-;19251:1;19247:12;;;;19294;;;19315:61;;19369:4;19361:6;19357:17;19347:27;;19315:61;19422:2;19414:6;19411:14;19391:18;19388:38;19385:218;;19459:77;19456:1;19449:88;19560:4;19557:1;19550:15;19588:4;19585:1;19578:15;19385:218;;19172:437;;;:::o;19614:1251::-;19866:6;19874;19882;19890;19898;19942:9;19933:7;19929:23;19972:3;19968:2;19964:12;19961:32;;;19989:1;19986;19979:12;19961:32;20022:9;20016:16;20055:18;20047:6;20044:30;20041:50;;;20087:1;20084;20077:12;20041:50;20110:72;20174:7;20165:6;20154:9;20150:22;20110:72;:::i;:::-;20100:82;;;20201:67;20260:7;20255:2;20244:9;20240:18;20201:67;:::i;:::-;20191:77;;20287:67;20346:7;20341:2;20330:9;20326:18;20287:67;:::i;:::-;20277:77;;20373:68;20433:7;20427:3;20416:9;20412:19;20373:68;:::i;:::-;20363:78;;20534:2;20465:66;20461:2;20457:75;20453:84;20450:104;;;20550:1;20547;20540:12;20450:104;;20576:22;;:::i;:::-;20643:3;20632:9;20628:19;20622:26;20657:46;20695:7;20657:46;:::i;:::-;20712:22;;20766:68;20826:7;20820:3;20805:19;;20766:68;:::i;:::-;20761:2;20754:5;20750:14;20743:92;20854:5;20844:15;;;19614:1251;;;;;;;;:::o;20870:519::-;20959:6;20967;21020:2;21008:9;20999:7;20995:23;20991:32;20988:52;;;21036:1;21033;21026:12;20988:52;21065:9;21059:16;21049:26;;21119:2;21108:9;21104:18;21098:25;21146:18;21138:6;21135:30;21132:50;;;21178:1;21175;21168:12;21132:50;21201:22;;21254:4;21246:13;;21242:27;-1:-1:-1;21232:55:111;;21283:1;21280;21273:12;21232:55;21306:77;21375:7;21370:2;21364:9;21359:2;21355;21351:11;21306:77;:::i;:::-;21296:87;;;20870:519;;;;;:::o;21394:128::-;21434:3;21465:1;21461:6;21458:1;21455:13;21452:39;;;21471:18;;:::i;:::-;-1:-1:-1;21507:9:111;;21394:128::o"},"gasEstimates":{"creation":{"codeDepositCost":"1332000","executionCost":"infinite","totalCost":"infinite"},"external":{"entryPoint()":"2335","getCodeHashes(address[])":"infinite","getUserOpHashes(address,(address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"infinite","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite"},"internal":{"slice(bytes memory,uint256,uint256)":"infinite"}},"methodIdentifiers":{"entryPoint()":"b0d691fe","getCodeHashes(address[])":"7b34b621","getUserOpHashes(address,(address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"3024e00c","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"getCodeHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"getUserOpHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"ret\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"internalType\":\"struct EntryPointWrapper.FailedOpStatus\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"selectorType\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.Response\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bundler/EntryPointWrapper.sol\":\"EntryPointWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/bundler/EntryPointWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\ncontract EntryPointWrapper {\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n struct FailedOpStatus {\\n bool status;\\n uint256 opIndex;\\n string reason;\\n }\\n\\n struct Response {\\n string selectorType;\\n ReturnInfo returnInfo;\\n StakeInfo senderInfo;\\n StakeInfo factoryInfo;\\n StakeInfo paymasterInfo;\\n AggregatorStakeInfo aggregatorInfo;\\n }\\n\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n IEntryPoint public entryPoint;\\n\\n StakeInfo private emptyStakeInfo = StakeInfo(0, 0);\\n AggregatorStakeInfo private emptyAggregatorInfo = AggregatorStakeInfo(address(0), emptyStakeInfo);\\n ReturnInfo private emptyReturnInfo = ReturnInfo(0, 0, false, 0, 0, new bytes(0));\\n Response private emptyResponse = Response(\\\"\\\", emptyReturnInfo, emptyStakeInfo, emptyStakeInfo, emptyStakeInfo, emptyAggregatorInfo);\\n FailedOpStatus private emptyFailedOp = FailedOpStatus(false, 0, \\\"\\\");\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\\n try entryPoint.simulateValidation(userOp) {}\\n catch (bytes memory revertData) {\\n bytes4 receivedSelector = bytes4(revertData);\\n\\n if (receivedSelector == ValidationResult.selector) {\\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo));\\n return (emptyFailedOp, Response('ValidationResult', returnInfo, senderInfo, factoryInfo, paymasterInfo, emptyAggregatorInfo));\\n } else if (receivedSelector == ValidationResultWithAggregation.selector) {\\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo, AggregatorStakeInfo memory aggregatorInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo, AggregatorStakeInfo));\\n return (emptyFailedOp, Response('ValidationResultWithAggregation', returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo));\\n } else if (receivedSelector == FailedOp.selector){\\n (uint256 opIndex, string memory reason) = abi.decode(slice(revertData, 4, revertData.length - 4), (uint256, string));\\n return (FailedOpStatus(true, opIndex, reason), emptyResponse);\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\\n ret = new bytes32[](userOps.length);\\n for (uint i = 0; i < userOps.length; i++) {\\n ret[i] = entryPoint.getUserOpHash(userOps[i]);\\n }\\n return ret;\\n }\\n\\n function getCodeHashes(address[] memory addresses) public view returns (bytes32) {\\n bytes32[] memory hashes = new bytes32[](addresses.length);\\n for (uint i = 0; i < addresses.length; i++) {\\n hashes[i] = addresses[i].codehash;\\n }\\n bytes memory data = abi.encode(hashes);\\n return (keccak256(data));\\n }\\n}\\n\",\"keccak256\":\"0x2d73af244f0944b8d7c7db2ad90da3834755f993050fcd81837ebc64db68d7d0\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":6800,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"entryPoint","offset":0,"slot":"0","type":"t_contract(IEntryPoint)10807"},{"astId":6807,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyStakeInfo","offset":0,"slot":"1","type":"t_struct(StakeInfo)6726_storage"},{"astId":6817,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyAggregatorInfo","offset":0,"slot":"3","type":"t_struct(AggregatorStakeInfo)6732_storage"},{"astId":6831,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyReturnInfo","offset":0,"slot":"6","type":"t_struct(ReturnInfo)6721_storage"},{"astId":6842,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyResponse","offset":0,"slot":"10","type":"t_struct(Response)6757_storage"},{"astId":6850,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyFailedOp","offset":0,"slot":"24","type":"t_struct(FailedOpStatus)6739_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes_storage":{"encoding":"bytes","label":"bytes","numberOfBytes":"32"},"t_contract(IEntryPoint)10807":{"encoding":"inplace","label":"contract IEntryPoint","numberOfBytes":"20"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_struct(AggregatorStakeInfo)6732_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.AggregatorStakeInfo","members":[{"astId":6728,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"aggregator","offset":0,"slot":"0","type":"t_address"},{"astId":6731,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"stakeInfo","offset":0,"slot":"1","type":"t_struct(StakeInfo)6726_storage"}],"numberOfBytes":"96"},"t_struct(FailedOpStatus)6739_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.FailedOpStatus","members":[{"astId":6734,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"status","offset":0,"slot":"0","type":"t_bool"},{"astId":6736,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"opIndex","offset":0,"slot":"1","type":"t_uint256"},{"astId":6738,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"reason","offset":0,"slot":"2","type":"t_string_storage"}],"numberOfBytes":"96"},"t_struct(Response)6757_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.Response","members":[{"astId":6741,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"selectorType","offset":0,"slot":"0","type":"t_string_storage"},{"astId":6744,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"returnInfo","offset":0,"slot":"1","type":"t_struct(ReturnInfo)6721_storage"},{"astId":6747,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"senderInfo","offset":0,"slot":"5","type":"t_struct(StakeInfo)6726_storage"},{"astId":6750,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"factoryInfo","offset":0,"slot":"7","type":"t_struct(StakeInfo)6726_storage"},{"astId":6753,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"paymasterInfo","offset":0,"slot":"9","type":"t_struct(StakeInfo)6726_storage"},{"astId":6756,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"aggregatorInfo","offset":0,"slot":"11","type":"t_struct(AggregatorStakeInfo)6732_storage"}],"numberOfBytes":"448"},"t_struct(ReturnInfo)6721_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.ReturnInfo","members":[{"astId":6710,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"preOpGas","offset":0,"slot":"0","type":"t_uint256"},{"astId":6712,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"prefund","offset":0,"slot":"1","type":"t_uint256"},{"astId":6714,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"sigFailed","offset":0,"slot":"2","type":"t_bool"},{"astId":6716,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"validAfter","offset":1,"slot":"2","type":"t_uint48"},{"astId":6718,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"validUntil","offset":7,"slot":"2","type":"t_uint48"},{"astId":6720,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"paymasterContext","offset":0,"slot":"3","type":"t_bytes_storage"}],"numberOfBytes":"128"},"t_struct(StakeInfo)6726_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.StakeInfo","members":[{"astId":6723,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"stake","offset":0,"slot":"0","type":"t_uint256"},{"astId":6725,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"unstakeDelaySec","offset":0,"slot":"1","type":"t_uint256"}],"numberOfBytes":"64"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint48":{"encoding":"inplace","label":"uint48","numberOfBytes":"6"}}},"userdoc":{"errors":{"FailedOp(uint256,string)":[{"notice":"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it."}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"notice":"Successful result from simulateValidation."}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"notice":"Successful result from simulateValidation, if the account returns a signature aggregator"}]},"kind":"user","methods":{},"version":1}}},"contracts/core/BaseAccount.sol":{"BaseAccount":{"abi":[{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"entryPoint()":"b0d691fe","getNonce()":"d087d288","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"}},\"notice\":\"Basic account implementation. this contract provides the basic logic for implementing the IAccount interface - validateUserOp specific account implementation should inherit it and provide the account-specific logic\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/BaseAccount.sol\":\"BaseAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."}},"notice":"Basic account implementation. this contract provides the basic logic for implementing the IAccount interface - validateUserOp specific account implementation should inherit it and provide the account-specific logic","version":1}}},"contracts/core/BasePaymaster.sol":{"BasePaymaster":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"Helper class for creating a paymaster. provides helper methods for staking. validates that the postOp is called only by the entryPoint\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/BasePaymaster.sol\":\"BasePaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/core/BasePaymaster.sol:BasePaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"Helper class for creating a paymaster. provides helper methods for staking. validates that the postOp is called only by the entryPoint","version":1}}},"contracts/core/EntryPoint.sol":{"EntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"SIG_VALIDATION_FAILED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"}],"name":"_validateSenderAndPaymaster","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"callData","type":"bytes"},{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"address","name":"paymaster","type":"address"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"}],"internalType":"struct EntryPoint.MemoryUserOp","name":"mUserOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"uint256","name":"contextOffset","type":"uint256"},{"internalType":"uint256","name":"preOpGas","type":"uint256"}],"internalType":"struct EntryPoint.UserOpInfo","name":"opInfo","type":"tuple"},{"internalType":"bytes","name":"context","type":"bytes"}],"name":"innerHandleOp","outputs":[{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint192","name":"","type":"uint192"}],"name":"nonceSequenceNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"FailedOp(uint256,string)":[{"params":{"opIndex":"- index into the array of ops to the failed one (in simulateValidation, this is always zero)","reason":"- revert reason The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."}}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"params":{"factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"params":{"aggregatorInfo":"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation","factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}]},"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}},"getSenderAddress(bytes)":{"params":{"initCode":"the constructor code to be passed into the UserOperation."}},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","opsPerAggregator":"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)"}},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","ops":"the operations to execute"}},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"params":{"op":"the UserOperation to simulate","target":"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.","targetCallData":"callData to pass to target address"}},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"details":"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.","params":{"userOp":"the user operation to validate."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_3678":{"entryPoint":null,"id":3678,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"linkReferences":{},"object":"60a0604052604051620000129062000055565b604051809103906000f0801580156200002f573d6000803e3d6000fd5b506001600160a01b03166080523480156200004957600080fd5b50600160025562000063565b610233806200471583390190565b60805161468f620000866000396000818161149401526132ed015261468f6000f3fe6080604052600436106101635760003560e01c80638f41ec5a116100c0578063bb9fe6bf11610074578063d6383f9411610059578063d6383f9414610541578063ee21942314610561578063fc7e286d1461058157600080fd5b8063bb9fe6bf1461050c578063c23a5cea1461052157600080fd5b80639b249f69116100a55780639b249f69146104b9578063a6193531146104d9578063b760faf9146104f957600080fd5b80638f41ec5a14610484578063957122ab1461049957600080fd5b8063205c2878116101175780634b1d7cf5116100fc5780634b1d7cf5146102dc5780635287ce12146102fc57806370a082311461043e57600080fd5b8063205c28781461023657806335567e1a1461025657600080fd5b80631b2e01b8116101485780631b2e01b8146101ab5780631d732756146101f65780631fad948c1461021657600080fd5b80630396cb60146101785780630bd28e3b1461018b57600080fd5b36610173576101713361065b565b005b600080fd5b6101716101863660046135c0565b6106c9565b34801561019757600080fd5b506101716101a6366004613613565b6109e4565b3480156101b757600080fd5b506101e36101c636600461364e565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561020257600080fd5b506101e3610211366004613866565b610a2c565b34801561022257600080fd5b50610171610231366004613971565b610bb8565b34801561024257600080fd5b506101716102513660046139c8565b610d35565b34801561026257600080fd5b506101e361027136600461364e565b6001600160a01b0391909116600090815260016020908152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff85168452909152908190205491901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000161790565b3480156102e857600080fd5b506101716102f7366004613971565b610ee9565b34801561030857600080fd5b506103df6103173660046139f4565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b031660009081526020818152604091829020825160a08101845281546dffffffffffffffffffffffffffff80821683526e010000000000000000000000000000820460ff161515948301949094526f0100000000000000000000000000000090049092169282019290925260019091015463ffffffff81166060830152640100000000900465ffffffffffff16608082015290565b6040805182516dffffffffffffffffffffffffffff908116825260208085015115159083015283830151169181019190915260608083015163ffffffff169082015260809182015165ffffffffffff169181019190915260a0016101ed565b34801561044a57600080fd5b506101e36104593660046139f4565b6001600160a01b03166000908152602081905260409020546dffffffffffffffffffffffffffff1690565b34801561049057600080fd5b506101e3600181565b3480156104a557600080fd5b506101716104b4366004613a11565b611364565b3480156104c557600080fd5b506101716104d4366004613a96565b611461565b3480156104e557600080fd5b506101e36104f4366004613af1565b61154e565b6101716105073660046139f4565b61065b565b34801561051857600080fd5b50610171611590565b34801561052d57600080fd5b5061017161053c3660046139f4565b611713565b34801561054d57600080fd5b5061017161055c366004613b26565b611991565b34801561056d57600080fd5b5061017161057c366004613af1565b611aa5565b34801561058d57600080fd5b5061060e61059c3660046139f4565b600060208190529081526040902080546001909101546dffffffffffffffffffffffffffff808316926e010000000000000000000000000000810460ff16926f010000000000000000000000000000009091049091169063ffffffff811690640100000000900465ffffffffffff1685565b604080516dffffffffffffffffffffffffffff96871681529415156020860152929094169183019190915263ffffffff16606082015265ffffffffffff909116608082015260a0016101ed565b6106658134611db2565b6001600160a01b03811660008181526020818152604091829020805492516dffffffffffffffffffffffffffff909316835292917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c491015b60405180910390a25050565b33600090815260208190526040902063ffffffff82166107305760405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c617900000000000060448201526064015b60405180910390fd5b600181015463ffffffff908116908316101561078e5760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152606401610727565b80546000906107c19034906f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16613bb7565b9050600081116108135760405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152606401610727565b6dffffffffffffffffffffffffffff8111156108715760405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152606401610727565b6040805160a08101825283546dffffffffffffffffffffffffffff90811682526001602080840182815286841685870190815263ffffffff808b16606088019081526000608089018181523380835296829052908a9020985189549551945189166f01000000000000000000000000000000027fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff9515156e010000000000000000000000000000027fffffffffffffffffffffffffffffffffff0000000000000000000000000000009097169190991617949094179290921695909517865551949092018054925165ffffffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000909316949093169390931717905590517fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01906109d7908490879091825263ffffffff16602082015260400190565b60405180910390a2505050565b33600090815260016020908152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff851684529091528120805491610a2483613bcf565b919050555050565b6000805a9050333014610a815760405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152606401610727565b8451604081015160608201518101611388015a1015610ac4577fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b875160009015610b58576000610ae1846000015160008c86611e88565b905080610b56576000610af5610800611ea0565b805190915015610b505784600001516001600160a01b03168a602001517f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201876020015184604051610b47929190613c5f565b60405180910390a35b60019250505b505b600088608001515a8603019050610baa6000838b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250611ecc915050565b9a9950505050505050505050565b610bc0612200565b8160008167ffffffffffffffff811115610bdc57610bdc613683565b604051908082528060200260200182016040528015610c1557816020015b610c02613536565b815260200190600190039081610bfa5790505b50905060005b82811015610c8e576000828281518110610c3757610c37613c78565b60200260200101519050600080610c72848a8a87818110610c5a57610c5a613c78565b9050602002810190610c6c9190613ca7565b85612257565b91509150610c838483836000612442565b505050600101610c1b565b506040516000907fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972908290a160005b83811015610d1857610d0c81888884818110610cdb57610cdb613c78565b9050602002810190610ced9190613ca7565b858481518110610cff57610cff613c78565b602002602001015161260c565b90910190600101610cbd565b50610d23848261275a565b505050610d306001600255565b505050565b33600090815260208190526040902080546dffffffffffffffffffffffffffff16821115610da55760405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152606401610727565b8054610dc29083906dffffffffffffffffffffffffffff16613ce5565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff91909116178155604080516001600160a01b03851681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a26000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114610e8d576040519150601f19603f3d011682016040523d82523d6000602084013e610e92565b606091505b5050905080610ee35760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610727565b50505050565b610ef1612200565b816000805b8281101561109c5736868683818110610f1157610f11613c78565b9050602002810190610f239190613cfc565b9050366000610f328380613d30565b90925090506000610f4960408501602086016139f4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03821601610fc35760405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152606401610727565b6001600160a01b03811615611079576001600160a01b03811663e3563a4f8484610ff06040890189613d98565b6040518563ffffffff1660e01b815260040161100f9493929190613f83565b60006040518083038186803b15801561102757600080fd5b505afa925050508015611038575060015b611079576040517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610727565b6110838287613bb7565b955050505050808061109490613bcf565b915050610ef6565b5060008167ffffffffffffffff8111156110b8576110b8613683565b6040519080825280602002602001820160405280156110f157816020015b6110de613536565b8152602001906001900390816110d65790505b506040519091507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f97290600090a16000805b84811015611206573688888381811061113d5761113d613c78565b905060200281019061114f9190613cfc565b905036600061115e8380613d30565b9092509050600061117560408501602086016139f4565b90508160005b818110156111ed57600089898151811061119757611197613c78565b602002602001015190506000806111ba8b898987818110610c5a57610c5a613c78565b915091506111ca84838389612442565b8a6111d481613bcf565b9b505050505080806111e590613bcf565b91505061117b565b50505050505080806111fe90613bcf565b915050611122565b50600080915060005b8581101561131f573689898381811061122a5761122a613c78565b905060200281019061123c9190613cfc565b905061124e60408201602083016139f4565b6001600160a01b03167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d60405160405180910390a23660006112908380613d30565b90925090508060005b81811015611307576112db888585848181106112b7576112b7613c78565b90506020028101906112c99190613ca7565b8b8b81518110610cff57610cff613c78565b6112e59088613bb7565b9650876112f181613bcf565b98505080806112ff90613bcf565b915050611299565b5050505050808061131790613bcf565b91505061120f565b506040516000907f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d908290a2611355868261275a565b5050505050610d306001600255565b8315801561137a57506001600160a01b0383163b155b156113c75760405162461bcd60e51b815260206004820152601960248201527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006044820152606401610727565b6014811061143f5760006113de601482848661403a565b6113e791614064565b60601c9050803b60000361143d5760405162461bcd60e51b815260206004820152601b60248201527f41413330207061796d6173746572206e6f74206465706c6f79656400000000006044820152606401610727565b505b60405162461bcd60e51b81526020600482015260006024820152604401610727565b6040517f570e1a360000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063570e1a36906114cb90869086906004016140ac565b6020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e91906140c0565b6040517f6ca7b8060000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152909150602401610727565b600061155982612853565b6040805160208101929092523090820152466060820152608001604051602081830303815290604052805190602001209050919050565b3360009081526020819052604081206001810154909163ffffffff90911690036115fc5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152606401610727565b80546e010000000000000000000000000000900460ff1661165f5760405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152606401610727565b60018101546000906116779063ffffffff16426140dd565b6001830180547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff1664010000000065ffffffffffff84169081029190911790915583547fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff16845560405190815290915033907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a906020016106bd565b33600090815260208190526040902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16806117945760405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152606401610727565b6001820154640100000000900465ffffffffffff166117f55760405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152606401610727565b60018201544264010000000090910465ffffffffffff16111561185a5760405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152606401610727565b6001820180547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000016905581547fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff168255604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461193b576040519150601f19603f3d011682016040523d82523d6000602084013e611940565b606091505b5050905080610ee35760405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152606401610727565b611999613536565b6119a28561286c565b6000806119b160008885612257565b9150915060006119c18383612946565b90506119cc43600052565b60006119da60008a8761260c565b90506119e543600052565b600060606001600160a01b038a1615611a5b57896001600160a01b03168989604051611a12929190614107565b6000604051808303816000865af19150503d8060008114611a4f576040519150601f19603f3d011682016040523d82523d6000602084013e611a54565b606091505b5090925090505b8660800151838560200151866040015185856040517f8b7ac98000000000000000000000000000000000000000000000000000000000815260040161072796959493929190614117565b611aad613536565b611ab68261286c565b600080611ac560008585612257565b845160a00151604080518082018252600080825260208083018281526001600160a01b03958616835282825284832080546dffffffffffffffffffffffffffff6f01000000000000000000000000000000918290048116875260019283015463ffffffff9081169094528d51518851808a018a5287815280870188815291909a16875286865288872080549390930490911689529101549091169052835180850190945281845283015293955091935090366000611b8660408a018a613d98565b909250905060006014821015611b9d576000611bb8565b611bab60146000848661403a565b611bb491614064565b60601c5b604080518082018252600080825260208083018281526001600160a01b03861683529082905292902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1682526001015463ffffffff1690915290915093505050506000611c298686612946565b9050600081600001519050600060016001600160a01b0316826001600160a01b031614905060006040518060c001604052808b6080015181526020018b6040015181526020018315158152602001856020015165ffffffffffff168152602001856040015165ffffffffffff168152602001611ca68c6060015190565b905290506001600160a01b03831615801590611ccc57506001600160a01b038316600114155b15611d78576040805180820182526001600160a01b03851680825282518084018452600080825260208083018281529382528181529085902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1683526001015463ffffffff169092529082015290517ffaecb4e4000000000000000000000000000000000000000000000000000000008152610727908390899089908c9086906004016141b9565b808686896040517fe0cff05f0000000000000000000000000000000000000000000000000000000081526004016107279493929190614239565b6001600160a01b03821660009081526020819052604081208054909190611dea9084906dffffffffffffffffffffffffffff16613bb7565b90506dffffffffffffffffffffffffffff811115611e4a5760405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152606401610727565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161790555050565b6000806000845160208601878987f195945050505050565b60603d82811115611eae5750815b604051602082018101604052818152816000602083013e9392505050565b6000805a855190915060009081611ee282612a12565b60a08301519091506001600160a01b038116611f0157825193506120e5565b8093506000885111156120e557868202955060028a6002811115611f2757611f27614290565b14611fb25760608301516040517fa9a234090000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163a9a2340991611f7a908e908d908c906004016142bf565b600060405180830381600088803b158015611f9457600080fd5b5087f1158015611fa8573d6000803e3d6000fd5b50505050506120e5565b60608301516040517fa9a234090000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163a9a2340991612000908e908d908c906004016142bf565b600060405180830381600088803b15801561201a57600080fd5b5087f19350505050801561202c575060015b6120e55761203861431f565b806308c379a003612091575061204c61433b565b806120575750612093565b8b8160405160200161206991906143e3565b60408051601f1981840301815290829052631101335b60e11b82526107279291600401613c5f565b505b8a604051631101335b60e11b81526004016107279181526040602082018190526012908201527f4141353020706f73744f70207265766572740000000000000000000000000000606082015260800190565b5a8503870196508187029550858960400151101561214e578a604051631101335b60e11b815260040161072791815260406020808301829052908201527f414135312070726566756e642062656c6f772061637475616c476173436f7374606082015260800190565b60408901518690036121608582611db2565b6000808c600281111561217557612175614290565b1490508460a001516001600160a01b031685600001516001600160a01b03168c602001517f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f8860200151858d8f6040516121e8949392919093845291151560208401526040830152606082015260800190565b60405180910390a45050505050505095945050505050565b60028054036122515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610727565b60028055565b60008060005a845190915061226c8682612a42565b6122758661154e565b6020860152604081015160608201516080830151171760e087013517610100870135176effffffffffffffffffffffffffffff8111156122f75760405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152606401610727565b60008061230384612b3b565b90506123118a8a8a84612b88565b855160208701519199509193506123289190612e0d565b61237e5789604051631101335b60e11b8152600401610727918152604060208201819052601a908201527f4141323520696e76616c6964206163636f756e74206e6f6e6365000000000000606082015260800190565b61238743600052565b60a08401516060906001600160a01b0316156123af576123aa8b8b8b8587612e5b565b975090505b60005a87039050808b60a001351015612414578b604051631101335b60e11b8152600401610727918152604060208201819052601e908201527f41413430206f76657220766572696669636174696f6e4761734c696d69740000606082015260800190565b60408a018390528160608b015260c08b01355a8803018a608001818152505050505050505050935093915050565b60008061244e8561309a565b91509150816001600160a01b0316836001600160a01b0316146124bd5785604051631101335b60e11b81526004016107279181526040602082018190526014908201527f41413234207369676e6174757265206572726f72000000000000000000000000606082015260800190565b80156125155785604051631101335b60e11b81526004016107279181526040602082018190526017908201527f414132322065787069726564206f72206e6f7420647565000000000000000000606082015260800190565b60006125208561309a565b925090506001600160a01b038116156125855786604051631101335b60e11b81526004016107279181526040602082018190526014908201527f41413334207369676e6174757265206572726f72000000000000000000000000606082015260800190565b81156126035786604051631101335b60e11b81526004016107279181526040602082018190526021908201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560608201527f6500000000000000000000000000000000000000000000000000000000000000608082015260a00190565b50505050505050565b6000805a9050600061261f846060015190565b905030631d7327566126346060880188613d98565b87856040518563ffffffff1660e01b81526004016126559493929190614428565b6020604051808303816000875af1925050508015612690575060408051601f3d908101601f1916820190925261268d918101906144dc565b60015b61274e57600060206000803e506000517f215221530000000000000000000000000000000000000000000000000000000081016127195786604051631101335b60e11b8152600401610727918152604060208201819052600f908201527f41413935206f7574206f66206761730000000000000000000000000000000000606082015260800190565b600085608001515a61272b9086613ce5565b6127359190613bb7565b9050612745886002888685611ecc565b94505050612751565b92505b50509392505050565b6001600160a01b0382166127b05760405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152606401610727565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127fd576040519150601f19603f3d011682016040523d82523d6000602084013e612802565b606091505b5050905080610d305760405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152606401610727565b600061285e826130ed565b805190602001209050919050565b3063957122ab61287f6040840184613d98565b61288c60208601866139f4565b61289a610120870187613d98565b6040518663ffffffff1660e01b81526004016128ba9594939291906144f5565b60006040518083038186803b1580156128d257600080fd5b505afa9250505080156128e3575060015b612943576128ef61431f565b806308c379a003612937575061290361433b565b8061290e5750612939565b80511561293357600081604051631101335b60e11b8152600401610727929190613c5f565b5050565b505b3d6000803e3d6000fd5b50565b604080516060810182526000808252602082018190529181018290529061296c846131c0565b90506000612979846131c0565b82519091506001600160a01b038116612990575080515b602080840151604080860151928501519085015191929165ffffffffffff80831690851610156129be578193505b8065ffffffffffff168365ffffffffffff1611156129da578092505b5050604080516060810182526001600160a01b03909416845265ffffffffffff92831660208501529116908201529250505092915050565b60c081015160e082015160009190808203612a2e575092915050565b612a3a82488301613231565b949350505050565b612a4f60208301836139f4565b6001600160a01b0316815260208083013590820152608080830135604083015260a0830135606083015260c0808401359183019190915260e0808401359183019190915261010083013590820152366000612aae610120850185613d98565b90925090508015612b2e576014811015612b0a5760405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152606401610727565b612b1860146000838561403a565b612b2191614064565b60601c60a0840152610ee3565b600060a084015250505050565b60a081015160009081906001600160a01b0316612b59576001612b5c565b60035b60ff16905060008360800151828560600151028560400151010190508360c00151810292505050919050565b60008060005a8551805191925090612bad8988612ba860408c018c613d98565b613249565b60a0820151612bbb43600052565b60006001600160a01b038216612c0a576001600160a01b0383166000908152602081905260409020546dffffffffffffffffffffffffffff16888111612c0357808903612c06565b60005b9150505b606084015160208a01516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081526001600160a01b03861692633a871cdd929091612c5d918f91879060040161452b565b60206040518083038160008887f193505050508015612c99575060408051601f3d908101601f19168201909252612c96918101906144dc565b60015b612d2a57612ca561431f565b806308c379a003612cd65750612cb961433b565b80612cc45750612cd8565b8b816040516020016120699190614550565b505b8a604051631101335b60e11b81526004016107279181526040602082018190526016908201527f4141323320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b95506001600160a01b038216612dfa576001600160a01b038316600090815260208190526040902080546dffffffffffffffffffffffffffff16808a1115612dbe578c604051631101335b60e11b81526004016107279181526040602082018190526017908201527f41413231206469646e2774207061792070726566756e64000000000000000000606082015260800190565b81547fffffffffffffffffffffffffffffffffffff000000000000000000000000000016908a90036dffffffffffffffffffffffffffff161790555b5a85039650505050505094509492505050565b6001600160a01b038216600090815260016020908152604080832084821c808552925282208054849167ffffffffffffffff8316919085612e4d83613bcf565b909155501495945050505050565b82516060818101519091600091848111612eb75760405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152606401610727565b60a08201516001600160a01b038116600090815260208190526040902080548784039291906dffffffffffffffffffffffffffff1689811015612f46578c604051631101335b60e11b8152600401610727918152604060208201819052601e908201527f41413331207061796d6173746572206465706f73697420746f6f206c6f770000606082015260800190565b8981038260000160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550826001600160a01b031663f465c77e858e8e602001518e6040518563ffffffff1660e01b8152600401612fb49392919061452b565b60006040518083038160008887f193505050508015612ff557506040513d6000823e601f3d908101601f19168201604052612ff29190810190614595565b60015b6130865761300161431f565b806308c379a003613032575061301561433b565b806130205750613034565b8d816040516020016120699190614621565b505b8c604051631101335b60e11b81526004016107279181526040602082018190526016908201527f4141333320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b909e909d509b505050505050505050505050565b600080826000036130b057506000928392509050565b60006130bb846131c0565b9050806040015165ffffffffffff164211806130e25750806020015165ffffffffffff1642105b905194909350915050565b606081356020830135600061310d6131086040870187613d98565b613523565b905060006131216131086060880188613d98565b9050608086013560a087013560c088013560e08901356101008a013560006131506131086101208e018e613d98565b604080516001600160a01b039c909c1660208d01528b81019a909a5260608b019890985250608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408084019190915281518084039091018152610160909201905292915050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff81166000036131fc575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60008183106132405781613242565b825b9392505050565b8015610ee3578251516001600160a01b0381163b156132b45784604051631101335b60e11b8152600401610727918152604060208201819052601f908201527f414131302073656e64657220616c726561647920636f6e737472756374656400606082015260800190565b8351606001516040517f570e1a360000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163570e1a36919061332590889088906004016140ac565b60206040518083038160008887f1158015613344573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061336991906140c0565b90506001600160a01b0381166133cb5785604051631101335b60e11b8152600401610727918152604060208201819052601b908201527f4141313320696e6974436f6465206661696c6564206f72204f4f470000000000606082015260800190565b816001600160a01b0316816001600160a01b0316146134355785604051631101335b60e11b815260040161072791815260406020808301829052908201527f4141313420696e6974436f6465206d7573742072657475726e2073656e646572606082015260800190565b806001600160a01b03163b6000036134985785604051631101335b60e11b815260040161072791815260406020808301829052908201527f4141313520696e6974436f6465206d757374206372656174652073656e646572606082015260800190565b60006134a7601482868861403a565b6134b091614064565b60601c9050826001600160a01b031686602001517fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d83896000015160a001516040516135129291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050505050565b6000604051828085833790209392505050565b6040518060a0016040528061359b60405180610100016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001600080191681526020016000815260200160008152602001600081525090565b6000602082840312156135d257600080fd5b813563ffffffff8116811461324257600080fd5b803577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461360e57600080fd5b919050565b60006020828403121561362557600080fd5b613242826135e6565b6001600160a01b038116811461294357600080fd5b803561360e8161362e565b6000806040838503121561366157600080fd5b823561366c8161362e565b915061367a602084016135e6565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810181811067ffffffffffffffff821117156136d2576136d2613683565b60405250565b610100810181811067ffffffffffffffff821117156136d2576136d2613683565b601f19601f830116810181811067ffffffffffffffff8211171561371f5761371f613683565b6040525050565b600067ffffffffffffffff82111561374057613740613683565b50601f01601f191660200190565b600081830361018081121561376257600080fd5b60405161376e816136b2565b8092506101008083121561378157600080fd5b604051925061378f836136d8565b61379885613643565b8352602085013560208401526040850135604084015260608501356060840152608085013560808401526137ce60a08601613643565b60a084015260c085013560c084015260e085013560e084015282825280850135602083015250610120840135604082015261014084013560608201526101608401356080820152505092915050565b60008083601f84011261382f57600080fd5b50813567ffffffffffffffff81111561384757600080fd5b60208301915083602082850101111561385f57600080fd5b9250929050565b6000806000806101c0858703121561387d57600080fd5b843567ffffffffffffffff8082111561389557600080fd5b818701915087601f8301126138a957600080fd5b81356138b481613726565b6040516138c182826136f9565b8281528a60208487010111156138d657600080fd5b826020860160208301376000602084830101528098505050506138fc886020890161374e565b94506101a087013591508082111561391357600080fd5b506139208782880161381d565b95989497509550505050565b60008083601f84011261393e57600080fd5b50813567ffffffffffffffff81111561395657600080fd5b6020830191508360208260051b850101111561385f57600080fd5b60008060006040848603121561398657600080fd5b833567ffffffffffffffff81111561399d57600080fd5b6139a98682870161392c565b90945092505060208401356139bd8161362e565b809150509250925092565b600080604083850312156139db57600080fd5b82356139e68161362e565b946020939093013593505050565b600060208284031215613a0657600080fd5b81356132428161362e565b600080600080600060608688031215613a2957600080fd5b853567ffffffffffffffff80821115613a4157600080fd5b613a4d89838a0161381d565b909750955060208801359150613a628261362e565b90935060408701359080821115613a7857600080fd5b50613a858882890161381d565b969995985093965092949392505050565b60008060208385031215613aa957600080fd5b823567ffffffffffffffff811115613ac057600080fd5b613acc8582860161381d565b90969095509350505050565b60006101608284031215613aeb57600080fd5b50919050565b600060208284031215613b0357600080fd5b813567ffffffffffffffff811115613b1a57600080fd5b612a3a84828501613ad8565b60008060008060608587031215613b3c57600080fd5b843567ffffffffffffffff80821115613b5457600080fd5b613b6088838901613ad8565b955060208701359150613b728261362e565b9093506040860135908082111561391357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613bca57613bca613b88565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c0057613c00613b88565b5060010190565b60005b83811015613c22578181015183820152602001613c0a565b83811115610ee35750506000910152565b60008151808452613c4b816020860160208601613c07565b601f01601f19169290920160200192915050565b828152604060208201526000612a3a6040830184613c33565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1833603018112613cdb57600080fd5b9190910192915050565b600082821015613cf757613cf7613b88565b500390565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613cdb57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d6557600080fd5b83018035915067ffffffffffffffff821115613d8057600080fd5b6020019150600581901b360382131561385f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613dcd57600080fd5b83018035915067ffffffffffffffff821115613de857600080fd5b60200191503681900382131561385f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e3257600080fd5b830160208101925035905067ffffffffffffffff811115613e5257600080fd5b80360382131561385f57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6000610160613eab84613e9e85613643565b6001600160a01b03169052565b60208301356020850152613ec26040840184613dfd565b826040870152613ed58387018284613e61565b92505050613ee66060840184613dfd565b8583036060870152613ef9838284613e61565b925050506080830135608085015260a083013560a085015260c083013560c085015260e083013560e0850152610100808401358186015250610120613f4081850185613dfd565b86840383880152613f52848284613e61565b9350505050610140613f6681850185613dfd565b86840383880152613f78848284613e61565b979650505050505050565b6040808252810184905260006060600586901b830181019083018783805b89811015614023577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa087860301845282357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18c3603018112614001578283fd5b61400d868d8301613e8c565b9550506020938401939290920191600101613fa1565b505050508281036020840152613f78818587613e61565b6000808585111561404a57600080fd5b8386111561405757600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156140a45780818660140360031b1b83161692505b505092915050565b602081526000612a3a602083018486613e61565b6000602082840312156140d257600080fd5b81516132428161362e565b600065ffffffffffff8083168185168083038211156140fe576140fe613b88565b01949350505050565b8183823760009101908152919050565b868152856020820152600065ffffffffffff8087166040840152808616606084015250831515608083015260c060a083015261415660c0830184613c33565b98975050505050505050565b80518252602081015160208301526040810151151560408301526000606082015165ffffffffffff8082166060860152806080850151166080860152505060a082015160c060a0850152612a3a60c0850182613c33565b60006101408083526141cd81840189614162565b9150506141e7602083018780518252602090810151910152565b845160608301526020948501516080830152835160a08301529284015160c082015281516001600160a01b031660e0820152908301518051610100830152909201516101209092019190915292915050565b60e08152600061424c60e0830187614162565b9050614265602083018680518252602090810151910152565b8351606083015260208401516080830152825160a0830152602083015160c083015295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000600385106142f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8482526060602083015261430f6060830185613c33565b9050826040830152949350505050565b600060033d11156143385760046000803e5060005160e01c5b90565b600060443d10156143495790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561439757505050505090565b82850191508151818111156143af5750505050505090565b843d87010160208285010111156143c95750505050505090565b6143d8602082860101876136f9565b509095945050505050565b7f4141353020706f73744f702072657665727465643a200000000000000000000081526000825161441b816016850160208701613c07565b9190910160160192915050565b60006101c080835261443d8184018789613e61565b905084516001600160a01b03808251166020860152602082015160408601526040820151606086015260608201516080860152608082015160a08601528060a08301511660c08601525060c081015160e085015260e08101516101008501525060208501516101208401526040850151610140840152606085015161016084015260808501516101808401528281036101a0840152613f788185613c33565b6000602082840312156144ee57600080fd5b5051919050565b606081526000614509606083018789613e61565b6001600160a01b03861660208401528281036040840152614156818587613e61565b60608152600061453e6060830186613e8c565b60208301949094525060400152919050565b7f414132332072657665727465643a20000000000000000000000000000000000081526000825161458881600f850160208701613c07565b91909101600f0192915050565b600080604083850312156145a857600080fd5b825167ffffffffffffffff8111156145bf57600080fd5b8301601f810185136145d057600080fd5b80516145db81613726565b6040516145e882826136f9565b8281528760208486010111156145fd57600080fd5b61460e836020830160208701613c07565b6020969096015195979596505050505050565b7f414133332072657665727465643a20000000000000000000000000000000000081526000825161458881600f850160208701613c0756fea2646970667358221220f0f232a571a80f7eeb9a2c966c30f3f757b335b20d8ceedcfc0d9ef65f14020364736f6c634300080f0033608060405234801561001057600080fd5b50610213806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100f9565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008061007c601482858761016b565b61008591610195565b60601c90506000610099846014818861016b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100f057600093505b50505092915050565b6000806020838503121561010c57600080fd5b823567ffffffffffffffff8082111561012457600080fd5b818501915085601f83011261013857600080fd5b81358181111561014757600080fd5b86602082850101111561015957600080fd5b60209290920196919550909350505050565b6000808585111561017b57600080fd5b8386111561018857600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156101d55780818660140360031b1b83161692505b50509291505056fea26469706673582212200ed1f0caa67c2e9edd3ae1b316811250be87bec82d2c9561d197ea5e2b813b0964736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH3 0x12 SWAP1 PUSH3 0x55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x2F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x2 SSTORE PUSH3 0x63 JUMP JUMPDEST PUSH2 0x233 DUP1 PUSH3 0x4715 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x468F PUSH3 0x86 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x1494 ADD MSTORE PUSH2 0x32ED ADD MSTORE PUSH2 0x468F PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x163 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8F41EC5A GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD6383F94 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD6383F94 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0xFC7E286D EQ PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x50C JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9B249F69 GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0x4B9 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0xB760FAF9 EQ PUSH2 0x4F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8F41EC5A EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0x957122AB EQ PUSH2 0x499 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x4B1D7CF5 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x4B1D7CF5 EQ PUSH2 0x2DC JUMPI DUP1 PUSH4 0x5287CE12 EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 EQ PUSH2 0x236 JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1B2E01B8 GT PUSH2 0x148 JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x1AB JUMPI DUP1 PUSH4 0x1D732756 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0x1FAD948C EQ PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x173 JUMPI PUSH2 0x171 CALLER PUSH2 0x65B JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x171 PUSH2 0x186 CALLDATASIZE PUSH1 0x4 PUSH2 0x35C0 JUMP JUMPDEST PUSH2 0x6C9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x1A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3613 JUMP JUMPDEST PUSH2 0x9E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x364E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0x3866 JUMP JUMPDEST PUSH2 0xA2C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x222 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x231 CALLDATASIZE PUSH1 0x4 PUSH2 0x3971 JUMP JUMPDEST PUSH2 0xBB8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x251 CALLDATASIZE PUSH1 0x4 PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0xD35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x364E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 AND OR SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x2F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x3971 JUMP JUMPDEST PUSH2 0xEE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3DF PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH15 0x10000000000000000000000000000 DUP3 DIV PUSH1 0xFF AND ISZERO ISZERO SWAP5 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH16 0x1000000000000000000000000000000 SWAP1 DIV SWAP1 SWAP3 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD ISZERO ISZERO SWAP1 DUP4 ADD MSTORE DUP4 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP2 DUP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD PUSH2 0x1ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x459 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH1 0x1 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x4B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A11 JUMP JUMPDEST PUSH2 0x1364 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x4D4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A96 JUMP JUMPDEST PUSH2 0x1461 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x4F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AF1 JUMP JUMPDEST PUSH2 0x154E JUMP JUMPDEST PUSH2 0x171 PUSH2 0x507 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x65B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x1590 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x1713 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x3B26 JUMP JUMPDEST PUSH2 0x1991 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x57C CALLDATASIZE PUSH1 0x4 PUSH2 0x3AF1 JUMP JUMPDEST PUSH2 0x1AA5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x60E PUSH2 0x59C CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH15 0x10000000000000000000000000000 DUP2 DIV PUSH1 0xFF AND SWAP3 PUSH16 0x1000000000000000000000000000000 SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH4 0xFFFFFFFF DUP2 AND SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND DUP6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE SWAP5 ISZERO ISZERO PUSH1 0x20 DUP7 ADD MSTORE SWAP3 SWAP1 SWAP5 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x1ED JUMP JUMPDEST PUSH2 0x665 DUP2 CALLVALUE PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP3 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP4 MSTORE SWAP3 SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH4 0xFFFFFFFF DUP3 AND PUSH2 0x730 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374207370656369667920756E7374616B652064656C6179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP1 DUP4 AND LT ISZERO PUSH2 0x78E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F7420646563726561736520756E7374616B652074696D6500000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x7C1 SWAP1 CALLVALUE SWAP1 PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT PUSH2 0x813 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207374616B65207370656369666965640000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x871 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7374616B65206F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE DUP4 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 DUP1 DUP5 ADD DUP3 DUP2 MSTORE DUP7 DUP5 AND DUP6 DUP8 ADD SWAP1 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP12 AND PUSH1 0x60 DUP9 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x80 DUP10 ADD DUP2 DUP2 MSTORE CALLER DUP1 DUP4 MSTORE SWAP7 DUP3 SWAP1 MSTORE SWAP1 DUP11 SWAP1 KECCAK256 SWAP9 MLOAD DUP10 SLOAD SWAP6 MLOAD SWAP5 MLOAD DUP10 AND PUSH16 0x1000000000000000000000000000000 MUL PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 ISZERO ISZERO PUSH15 0x10000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 SWAP1 SWAP8 AND SWAP2 SWAP1 SWAP10 AND OR SWAP5 SWAP1 SWAP5 OR SWAP3 SWAP1 SWAP3 AND SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE MLOAD SWAP5 SWAP1 SWAP3 ADD DUP1 SLOAD SWAP3 MLOAD PUSH6 0xFFFFFFFFFFFF AND PUSH5 0x100000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR OR SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xA5AE833D0BB1DCD632D98A8B70973E8516812898E19BF27B70071EBC8DC52C01 SWAP1 PUSH2 0x9D7 SWAP1 DUP5 SWAP1 DUP8 SWAP1 SWAP2 DUP3 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP2 PUSH2 0xA24 DUP4 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP CALLER ADDRESS EQ PUSH2 0xA81 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393220696E7465726E616C2063616C6C206F6E6C79000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x60 DUP3 ADD MLOAD DUP2 ADD PUSH2 0x1388 ADD GAS LT ISZERO PUSH2 0xAC4 JUMPI PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 REVERT JUMPDEST DUP8 MLOAD PUSH1 0x0 SWAP1 ISZERO PUSH2 0xB58 JUMPI PUSH1 0x0 PUSH2 0xAE1 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP13 DUP7 PUSH2 0x1E88 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xB56 JUMPI PUSH1 0x0 PUSH2 0xAF5 PUSH2 0x800 PUSH2 0x1EA0 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB50 JUMPI DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x20 ADD MLOAD PUSH32 0x1C4FADA7374C0A9EE8841FC38AFE82932DC0F8E69012E927F061A8BAE611A201 DUP8 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x40 MLOAD PUSH2 0xB47 SWAP3 SWAP2 SWAP1 PUSH2 0x3C5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST PUSH1 0x1 SWAP3 POP POP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP9 PUSH1 0x80 ADD MLOAD GAS DUP7 SUB ADD SWAP1 POP PUSH2 0xBAA PUSH1 0x0 DUP4 DUP12 DUP12 DUP12 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP9 SWAP3 POP PUSH2 0x1ECC SWAP2 POP POP JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xBC0 PUSH2 0x2200 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBDC JUMPI PUSH2 0xBDC PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xC15 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xC02 PUSH2 0x3536 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xBFA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xC8E JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xC37 JUMPI PUSH2 0xC37 PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0xC72 DUP5 DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0xC5A JUMPI PUSH2 0xC5A PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xC6C SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP6 PUSH2 0x2257 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xC83 DUP5 DUP4 DUP4 PUSH1 0x0 PUSH2 0x2442 JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xC1B JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 SWAP1 DUP3 SWAP1 LOG1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI PUSH2 0xD0C DUP2 DUP9 DUP9 DUP5 DUP2 DUP2 LT PUSH2 0xCDB JUMPI PUSH2 0xCDB PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xCED SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xCFF JUMPI PUSH2 0xCFF PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x260C JUMP JUMPDEST SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xCBD JUMP JUMPDEST POP PUSH2 0xD23 DUP5 DUP3 PUSH2 0x275A JUMP JUMPDEST POP POP POP PUSH2 0xD30 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xDA5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x576974686472617720616D6F756E7420746F6F206C6172676500000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH2 0xDC2 SWAP1 DUP4 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3CE5 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND OR DUP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xD1C19FBCD4551A5EDFB66D43D2E337C04837AFDA3482B42BDF569A8FCCDAE5FB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xE8D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xE92 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xEE3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F2077697468647261770000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x2200 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP1 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x109C JUMPI CALLDATASIZE DUP7 DUP7 DUP4 DUP2 DUP2 LT PUSH2 0xF11 JUMPI PUSH2 0xF11 PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xF23 SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0xF32 DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0xF49 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x39F4 JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ADD PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393620696E76616C69642061676772656761746F72000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1079 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xE3563A4F DUP5 DUP5 PUSH2 0xFF0 PUSH1 0x40 DUP10 ADD DUP10 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x100F SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3F83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1027 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1038 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x1079 JUMPI PUSH1 0x40 MLOAD PUSH32 0x86A9F75000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x1083 DUP3 DUP8 PUSH2 0x3BB7 JUMP JUMPDEST SWAP6 POP POP POP POP POP DUP1 DUP1 PUSH2 0x1094 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0xEF6 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10B8 JUMPI PUSH2 0x10B8 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10F1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x10DE PUSH2 0x3536 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x10D6 JUMPI SWAP1 POP JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1206 JUMPI CALLDATASIZE DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0x113D JUMPI PUSH2 0x113D PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x114F SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0x115E DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0x1175 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x39F4 JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11ED JUMPI PUSH1 0x0 DUP10 DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x1197 JUMPI PUSH2 0x1197 PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x11BA DUP12 DUP10 DUP10 DUP8 DUP2 DUP2 LT PUSH2 0xC5A JUMPI PUSH2 0xC5A PUSH2 0x3C78 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x11CA DUP5 DUP4 DUP4 DUP10 PUSH2 0x2442 JUMP JUMPDEST DUP11 PUSH2 0x11D4 DUP2 PUSH2 0x3BCF JUMP JUMPDEST SWAP12 POP POP POP POP POP DUP1 DUP1 PUSH2 0x11E5 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x117B JUMP JUMPDEST POP POP POP POP POP POP DUP1 DUP1 PUSH2 0x11FE SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1122 JUMP JUMPDEST POP PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x131F JUMPI CALLDATASIZE DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x122A JUMPI PUSH2 0x122A PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x123C SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP PUSH2 0x124E PUSH1 0x40 DUP3 ADD PUSH1 0x20 DUP4 ADD PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 CALLDATASIZE PUSH1 0x0 PUSH2 0x1290 DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1307 JUMPI PUSH2 0x12DB DUP9 DUP6 DUP6 DUP5 DUP2 DUP2 LT PUSH2 0x12B7 JUMPI PUSH2 0x12B7 PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x12C9 SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP12 DUP12 DUP2 MLOAD DUP2 LT PUSH2 0xCFF JUMPI PUSH2 0xCFF PUSH2 0x3C78 JUMP JUMPDEST PUSH2 0x12E5 SWAP1 DUP9 PUSH2 0x3BB7 JUMP JUMPDEST SWAP7 POP DUP8 PUSH2 0x12F1 DUP2 PUSH2 0x3BCF JUMP JUMPDEST SWAP9 POP POP DUP1 DUP1 PUSH2 0x12FF SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1299 JUMP JUMPDEST POP POP POP POP POP DUP1 DUP1 PUSH2 0x1317 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x120F JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D SWAP1 DUP3 SWAP1 LOG2 PUSH2 0x1355 DUP7 DUP3 PUSH2 0x275A JUMP JUMPDEST POP POP POP POP POP PUSH2 0xD30 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x137A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND EXTCODESIZE ISZERO JUMPDEST ISZERO PUSH2 0x13C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413230206163636F756E74206E6F74206465706C6F79656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x14 DUP2 LT PUSH2 0x143F JUMPI PUSH1 0x0 PUSH2 0x13DE PUSH1 0x14 DUP3 DUP5 DUP7 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x13E7 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP1 EXTCODESIZE PUSH1 0x0 SUB PUSH2 0x143D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413330207061796D6173746572206E6F74206465706C6F7965640000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x570E1A36 SWAP1 PUSH2 0x14CB SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x40AC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x14EA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x150E SWAP2 SWAP1 PUSH2 0x40C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6CA7B80600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x24 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1559 DUP3 PUSH2 0x2853 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ADDRESS SWAP1 DUP3 ADD MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x1 DUP2 ADD SLOAD SWAP1 SWAP2 PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND SWAP1 SUB PUSH2 0x15FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F74207374616B656400000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH15 0x10000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH2 0x165F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x616C726561647920756E7374616B696E67000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1677 SWAP1 PUSH4 0xFFFFFFFF AND TIMESTAMP PUSH2 0x40DD JUMP JUMPDEST PUSH1 0x1 DUP4 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF AND PUSH5 0x100000000 PUSH6 0xFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP4 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 SWAP2 POP CALLER SWAP1 PUSH32 0xFA9B3C14CC825C412C9ED81B3BA365A5B459439403F18829E572ED53A4180F0A SWAP1 PUSH1 0x20 ADD PUSH2 0x6BD JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x1794 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207374616B6520746F207769746864726177000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH2 0x17F5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742063616C6C20756E6C6F636B5374616B652829206669727374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD TIMESTAMP PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x185A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5374616B65207769746864726177616C206973206E6F74206475650000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 AND SWAP1 SSTORE DUP2 SLOAD PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xB7C918E0E249F999E965CAFEB6C664271B3F4317D296461500E71DA39F0CBDA3 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x193B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1940 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xEE3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F207769746864726177207374616B650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x1999 PUSH2 0x3536 JUMP JUMPDEST PUSH2 0x19A2 DUP6 PUSH2 0x286C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19B1 PUSH1 0x0 DUP9 DUP6 PUSH2 0x2257 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH2 0x19C1 DUP4 DUP4 PUSH2 0x2946 JUMP JUMPDEST SWAP1 POP PUSH2 0x19CC NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19DA PUSH1 0x0 DUP11 DUP8 PUSH2 0x260C JUMP JUMPDEST SWAP1 POP PUSH2 0x19E5 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND ISZERO PUSH2 0x1A5B JUMPI DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0x1A12 SWAP3 SWAP2 SWAP1 PUSH2 0x4107 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A4F JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A54 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP JUMPDEST DUP7 PUSH1 0x80 ADD MLOAD DUP4 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 DUP6 PUSH1 0x40 MLOAD PUSH32 0x8B7AC98000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4117 JUMP JUMPDEST PUSH2 0x1AAD PUSH2 0x3536 JUMP JUMPDEST PUSH2 0x1AB6 DUP3 PUSH2 0x286C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1AC5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x2257 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP4 MSTORE DUP3 DUP3 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH16 0x1000000000000000000000000000000 SWAP2 DUP3 SWAP1 DIV DUP2 AND DUP8 MSTORE PUSH1 0x1 SWAP3 DUP4 ADD SLOAD PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP1 SWAP5 MSTORE DUP14 MLOAD MLOAD DUP9 MLOAD DUP1 DUP11 ADD DUP11 MSTORE DUP8 DUP2 MSTORE DUP1 DUP8 ADD DUP9 DUP2 MSTORE SWAP2 SWAP1 SWAP11 AND DUP8 MSTORE DUP7 DUP7 MSTORE DUP9 DUP8 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP4 DIV SWAP1 SWAP2 AND DUP10 MSTORE SWAP2 ADD SLOAD SWAP1 SWAP2 AND SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD SWAP1 SWAP5 MSTORE DUP2 DUP5 MSTORE DUP4 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 CALLDATASIZE PUSH1 0x0 PUSH2 0x1B86 PUSH1 0x40 DUP11 ADD DUP11 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH1 0x14 DUP3 LT ISZERO PUSH2 0x1B9D JUMPI PUSH1 0x0 PUSH2 0x1BB8 JUMP JUMPDEST PUSH2 0x1BAB PUSH1 0x14 PUSH1 0x0 DUP5 DUP7 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x1BB4 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP4 MSTORE SWAP1 DUP3 SWAP1 MSTORE SWAP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x1 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 SWAP2 MSTORE SWAP1 SWAP2 POP SWAP4 POP POP POP POP PUSH1 0x0 PUSH2 0x1C29 DUP7 DUP7 PUSH2 0x2946 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ SWAP1 POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH1 0x80 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CA6 DUP13 PUSH1 0x60 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 MSTORE SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1CCC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x1D78 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP1 DUP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE SWAP4 DUP3 MSTORE DUP2 DUP2 MSTORE SWAP1 DUP6 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x1 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 SWAP3 MSTORE SWAP1 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0xFAECB4E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x727 SWAP1 DUP4 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP13 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x41B9 JUMP JUMPDEST DUP1 DUP7 DUP7 DUP10 PUSH1 0x40 MLOAD PUSH32 0xE0CFF05F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4239 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x1DEA SWAP1 DUP5 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E4A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6465706F736974206F766572666C6F7700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 MLOAD PUSH1 0x20 DUP7 ADD DUP8 DUP10 DUP8 CALL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE DUP3 DUP2 GT ISZERO PUSH2 0x1EAE JUMPI POP DUP2 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP3 ADD DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP2 PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS DUP6 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 DUP2 PUSH2 0x1EE2 DUP3 PUSH2 0x2A12 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1F01 JUMPI DUP3 MLOAD SWAP4 POP PUSH2 0x20E5 JUMP JUMPDEST DUP1 SWAP4 POP PUSH1 0x0 DUP9 MLOAD GT ISZERO PUSH2 0x20E5 JUMPI DUP7 DUP3 MUL SWAP6 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1F27 JUMPI PUSH2 0x1F27 PUSH2 0x4290 JUMP JUMPDEST EQ PUSH2 0x1FB2 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0xA9A23409 SWAP2 PUSH2 0x1F7A SWAP1 DUP15 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x42BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x1FA8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x20E5 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0xA9A23409 SWAP2 PUSH2 0x2000 SWAP1 DUP15 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x42BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x202C JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x20E5 JUMPI PUSH2 0x2038 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2091 JUMPI POP PUSH2 0x204C PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x2057 JUMPI POP PUSH2 0x2093 JUMP JUMPDEST DUP12 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x43E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH4 0x1101335B PUSH1 0xE1 SHL DUP3 MSTORE PUSH2 0x727 SWAP3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3C5F JUMP JUMPDEST POP JUMPDEST DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x12 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST GAS DUP6 SUB DUP8 ADD SWAP7 POP DUP2 DUP8 MUL SWAP6 POP DUP6 DUP10 PUSH1 0x40 ADD MLOAD LT ISZERO PUSH2 0x214E JUMPI DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD DUP7 SWAP1 SUB PUSH2 0x2160 DUP6 DUP3 PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP13 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2175 JUMPI PUSH2 0x2175 PUSH2 0x4290 JUMP JUMPDEST EQ SWAP1 POP DUP5 PUSH1 0xA0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP13 PUSH1 0x20 ADD MLOAD PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F DUP9 PUSH1 0x20 ADD MLOAD DUP6 DUP14 DUP16 PUSH1 0x40 MLOAD PUSH2 0x21E8 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 SWAP4 DUP5 MSTORE SWAP2 ISZERO ISZERO PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD SUB PUSH2 0x2251 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x2 DUP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 GAS DUP5 MLOAD SWAP1 SWAP2 POP PUSH2 0x226C DUP7 DUP3 PUSH2 0x2A42 JUMP JUMPDEST PUSH2 0x2275 DUP7 PUSH2 0x154E JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP4 ADD MLOAD OR OR PUSH1 0xE0 DUP8 ADD CALLDATALOAD OR PUSH2 0x100 DUP8 ADD CALLDATALOAD OR PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x22F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413934206761732076616C756573206F766572666C6F770000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2303 DUP5 PUSH2 0x2B3B JUMP JUMPDEST SWAP1 POP PUSH2 0x2311 DUP11 DUP11 DUP11 DUP5 PUSH2 0x2B88 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x20 DUP8 ADD MLOAD SWAP2 SWAP10 POP SWAP2 SWAP4 POP PUSH2 0x2328 SWAP2 SWAP1 PUSH2 0x2E0D JUMP JUMPDEST PUSH2 0x237E JUMPI DUP10 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH2 0x2387 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0x60 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x23AF JUMPI PUSH2 0x23AA DUP12 DUP12 DUP12 DUP6 DUP8 PUSH2 0x2E5B JUMP JUMPDEST SWAP8 POP SWAP1 POP JUMPDEST PUSH1 0x0 GAS DUP8 SUB SWAP1 POP DUP1 DUP12 PUSH1 0xA0 ADD CALLDATALOAD LT ISZERO PUSH2 0x2414 JUMPI DUP12 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP11 ADD DUP4 SWAP1 MSTORE DUP2 PUSH1 0x60 DUP12 ADD MSTORE PUSH1 0xC0 DUP12 ADD CALLDATALOAD GAS DUP9 SUB ADD DUP11 PUSH1 0x80 ADD DUP2 DUP2 MSTORE POP POP POP POP POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x244E DUP6 PUSH2 0x309A JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24BD JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2515 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x414132322065787069726564206F72206E6F7420647565000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2520 DUP6 PUSH2 0x309A JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x2585 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413334207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2603 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413332207061796D61737465722065787069726564206F72206E6F74206475 PUSH1 0x60 DUP3 ADD MSTORE PUSH32 0x6500000000000000000000000000000000000000000000000000000000000000 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH1 0x0 PUSH2 0x261F DUP5 PUSH1 0x60 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 POP ADDRESS PUSH4 0x1D732756 PUSH2 0x2634 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x3D98 JUMP JUMPDEST DUP8 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2655 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4428 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x2690 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x268D SWAP2 DUP2 ADD SWAP1 PUSH2 0x44DC JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x274E JUMPI PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD PUSH32 0x2152215300000000000000000000000000000000000000000000000000000000 DUP2 ADD PUSH2 0x2719 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x80 ADD MLOAD GAS PUSH2 0x272B SWAP1 DUP7 PUSH2 0x3CE5 JUMP JUMPDEST PUSH2 0x2735 SWAP2 SWAP1 PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH2 0x2745 DUP9 PUSH1 0x2 DUP9 DUP7 DUP6 PUSH2 0x1ECC JUMP JUMPDEST SWAP5 POP POP POP PUSH2 0x2751 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x27B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393020696E76616C69642062656E65666963696172790000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x27FD JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2802 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xD30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413931206661696C65642073656E6420746F2062656E656669636961727900 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x285E DUP3 PUSH2 0x30ED JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH4 0x957122AB PUSH2 0x287F PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x288C PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x289A PUSH2 0x120 DUP8 ADD DUP8 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x28BA SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x44F5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x28E3 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x2943 JUMPI PUSH2 0x28EF PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2937 JUMPI POP PUSH2 0x2903 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x290E JUMPI POP PUSH2 0x2939 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2933 JUMPI PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP3 SWAP2 SWAP1 PUSH2 0x3C5F JUMP JUMPDEST POP POP JUMP JUMPDEST POP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x296C DUP5 PUSH2 0x31C0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2979 DUP5 PUSH2 0x31C0 JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2990 JUMPI POP DUP1 MLOAD JUMPDEST PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP3 DUP6 ADD MLOAD SWAP1 DUP6 ADD MLOAD SWAP2 SWAP3 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP6 AND LT ISZERO PUSH2 0x29BE JUMPI DUP2 SWAP4 POP JUMPDEST DUP1 PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x29DA JUMPI DUP1 SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP5 AND DUP5 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 AND SWAP1 DUP3 ADD MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xC0 DUP2 ADD MLOAD PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x0 SWAP2 SWAP1 DUP1 DUP3 SUB PUSH2 0x2A2E JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2A3A DUP3 BASEFEE DUP4 ADD PUSH2 0x3231 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x2A4F PUSH1 0x20 DUP4 ADD DUP4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0xA0 DUP4 ADD CALLDATALOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xC0 DUP1 DUP5 ADD CALLDATALOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP1 DUP5 ADD CALLDATALOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x100 DUP4 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE CALLDATASIZE PUSH1 0x0 PUSH2 0x2AAE PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0x2B2E JUMPI PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x2B0A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393320696E76616C6964207061796D6173746572416E6444617461000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x2B18 PUSH1 0x14 PUSH1 0x0 DUP4 DUP6 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x2B21 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR PUSH1 0xA0 DUP5 ADD MSTORE PUSH2 0xEE3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP5 ADD MSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2B59 JUMPI PUSH1 0x1 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x3 JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x80 ADD MLOAD DUP3 DUP6 PUSH1 0x60 ADD MLOAD MUL DUP6 PUSH1 0x40 ADD MLOAD ADD ADD SWAP1 POP DUP4 PUSH1 0xC0 ADD MLOAD DUP2 MUL SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 GAS DUP6 MLOAD DUP1 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x2BAD DUP10 DUP9 PUSH2 0x2BA8 PUSH1 0x40 DUP13 ADD DUP13 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x3249 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH2 0x2BBB NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2C0A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 DUP2 GT PUSH2 0x2C03 JUMPI DUP1 DUP10 SUB PUSH2 0x2C06 JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP2 POP POP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x20 DUP11 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x3A871CDD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 PUSH4 0x3A871CDD SWAP3 SWAP1 SWAP2 PUSH2 0x2C5D SWAP2 DUP16 SWAP2 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x452B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x2C99 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x2C96 SWAP2 DUP2 ADD SWAP1 PUSH2 0x44DC JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x2D2A JUMPI PUSH2 0x2CA5 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2CD6 JUMPI POP PUSH2 0x2CB9 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x2CC4 JUMPI POP PUSH2 0x2CD8 JUMP JUMPDEST DUP12 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x4550 JUMP JUMPDEST POP JUMPDEST DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2DFA JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 DUP11 GT ISZERO PUSH2 0x2DBE JUMPI DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND SWAP1 DUP11 SWAP1 SUB PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR SWAP1 SSTORE JUMPDEST GAS DUP6 SUB SWAP7 POP POP POP POP POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP3 SHR DUP1 DUP6 MSTORE SWAP3 MSTORE DUP3 KECCAK256 DUP1 SLOAD DUP5 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 AND SWAP2 SWAP1 DUP6 PUSH2 0x2E4D DUP4 PUSH2 0x3BCF JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP EQ SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP3 MLOAD PUSH1 0x60 DUP2 DUP2 ADD MLOAD SWAP1 SWAP2 PUSH1 0x0 SWAP2 DUP5 DUP2 GT PUSH2 0x2EB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141343120746F6F206C6974746C6520766572696669636174696F6E47617300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP8 DUP5 SUB SWAP3 SWAP2 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 DUP2 LT ISZERO PUSH2 0x2F46 JUMPI DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP10 DUP2 SUB DUP3 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF465C77E DUP6 DUP15 DUP15 PUSH1 0x20 ADD MLOAD DUP15 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2FB4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x452B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x2FF5 JUMPI POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x2FF2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4595 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x3086 JUMPI PUSH2 0x3001 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x3032 JUMPI POP PUSH2 0x3015 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x3020 JUMPI POP PUSH2 0x3034 JUMP JUMPDEST DUP14 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x4621 JUMP JUMPDEST POP JUMPDEST DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP15 SWAP1 SWAP14 POP SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH1 0x0 SUB PUSH2 0x30B0 JUMPI POP PUSH1 0x0 SWAP3 DUP4 SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30BB DUP5 PUSH2 0x31C0 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND TIMESTAMP GT DUP1 PUSH2 0x30E2 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND TIMESTAMP LT JUMPDEST SWAP1 MLOAD SWAP5 SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x310D PUSH2 0x3108 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x3523 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3121 PUSH2 0x3108 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP10 ADD CALLDATALOAD PUSH2 0x100 DUP11 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x3150 PUSH2 0x3108 PUSH2 0x120 DUP15 ADD DUP15 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP13 SWAP1 SWAP13 AND PUSH1 0x20 DUP14 ADD MSTORE DUP12 DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE PUSH1 0x60 DUP12 ADD SWAP9 SWAP1 SWAP9 MSTORE POP PUSH1 0x80 DUP10 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xA0 DUP9 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xC0 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH2 0x160 SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 PUSH1 0xA0 DUP2 SWAP1 SHR PUSH6 0xFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SUB PUSH2 0x31FC JUMPI POP PUSH6 0xFFFFFFFFFFFF JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xD0 SWAP5 SWAP1 SWAP5 SHR PUSH1 0x20 DUP4 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x3240 JUMPI DUP2 PUSH2 0x3242 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEE3 JUMPI DUP3 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND EXTCODESIZE ISZERO PUSH2 0x32B4 JUMPI DUP5 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0x570E1A36 SWAP2 SWAP1 PUSH2 0x3325 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x40AC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x3344 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3369 SWAP2 SWAP1 PUSH2 0x40C0 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x33CB JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3435 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE PUSH1 0x0 SUB PUSH2 0x3498 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34A7 PUSH1 0x14 DUP3 DUP7 DUP9 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x34B0 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D DUP4 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3512 SWAP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP1 DUP6 DUP4 CALLDATACOPY SWAP1 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x359B PUSH1 0x40 MLOAD DUP1 PUSH2 0x100 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x35D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x360E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3625 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3242 DUP3 PUSH2 0x35E6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x2943 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x360E DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3661 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x366C DUP2 PUSH2 0x362E JUMP JUMPDEST SWAP2 POP PUSH2 0x367A PUSH1 0x20 DUP5 ADD PUSH2 0x35E6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA0 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x36D2 JUMPI PUSH2 0x36D2 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MSTORE POP JUMP JUMPDEST PUSH2 0x100 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x36D2 JUMPI PUSH2 0x36D2 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x371F JUMPI PUSH2 0x371F PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3740 JUMPI PUSH2 0x3740 PUSH2 0x3683 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SUB PUSH2 0x180 DUP2 SLT ISZERO PUSH2 0x3762 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x376E DUP2 PUSH2 0x36B2 JUMP JUMPDEST DUP1 SWAP3 POP PUSH2 0x100 DUP1 DUP4 SLT ISZERO PUSH2 0x3781 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP3 POP PUSH2 0x378F DUP4 PUSH2 0x36D8 JUMP JUMPDEST PUSH2 0x3798 DUP6 PUSH2 0x3643 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP6 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x37CE PUSH1 0xA0 DUP7 ADD PUSH2 0x3643 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP6 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE DUP3 DUP3 MSTORE DUP1 DUP6 ADD CALLDATALOAD PUSH1 0x20 DUP4 ADD MSTORE POP PUSH2 0x120 DUP5 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x140 DUP5 ADD CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x160 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x382F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3847 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1C0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x387D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x38A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38B4 DUP2 PUSH2 0x3726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x38C1 DUP3 DUP3 PUSH2 0x36F9 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x38D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP9 POP POP POP POP PUSH2 0x38FC DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x374E JUMP JUMPDEST SWAP5 POP PUSH2 0x1A0 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3920 DUP8 DUP3 DUP9 ADD PUSH2 0x381D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x393E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3986 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x399D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39A9 DUP7 DUP3 DUP8 ADD PUSH2 0x392C JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x39BD DUP2 PUSH2 0x362E JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x39DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x39E6 DUP2 PUSH2 0x362E JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3242 DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3A29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3A41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A4D DUP10 DUP4 DUP11 ADD PUSH2 0x381D JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3A62 DUP3 PUSH2 0x362E JUMP JUMPDEST SWAP1 SWAP4 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x3A78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A85 DUP9 DUP3 DUP10 ADD PUSH2 0x381D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3AA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ACC DUP6 DUP3 DUP7 ADD PUSH2 0x381D JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3B03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A3A DUP5 DUP3 DUP6 ADD PUSH2 0x3AD8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3B3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3B54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B60 DUP9 DUP4 DUP10 ADD PUSH2 0x3AD8 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3B72 DUP3 PUSH2 0x362E JUMP JUMPDEST SWAP1 SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x3913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x3BCA JUMPI PUSH2 0x3BCA PUSH2 0x3B88 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x3C00 JUMPI PUSH2 0x3C00 PUSH2 0x3B88 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C22 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C0A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xEE3 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3C4B DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2A3A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3C33 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3CDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x3CF7 JUMPI PUSH2 0x3CF7 PUSH2 0x3B88 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3CDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3D65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3DCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3DE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3E32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH2 0x3EAB DUP5 PUSH2 0x3E9E DUP6 PUSH2 0x3643 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x3EC2 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x3DFD JUMP JUMPDEST DUP3 PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x3ED5 DUP4 DUP8 ADD DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x3EE6 PUSH1 0x60 DUP5 ADD DUP5 PUSH2 0x3DFD JUMP JUMPDEST DUP6 DUP4 SUB PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x3EF9 DUP4 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x80 DUP4 ADD CALLDATALOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD CALLDATALOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD CALLDATALOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD CALLDATALOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD CALLDATALOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3F40 DUP2 DUP6 ADD DUP6 PUSH2 0x3DFD JUMP JUMPDEST DUP7 DUP5 SUB DUP4 DUP9 ADD MSTORE PUSH2 0x3F52 DUP5 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x140 PUSH2 0x3F66 DUP2 DUP6 ADD DUP6 PUSH2 0x3DFD JUMP JUMPDEST DUP7 DUP5 SUB DUP4 DUP9 ADD MSTORE PUSH2 0x3F78 DUP5 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 PUSH1 0x5 DUP7 SWAP1 SHL DUP4 ADD DUP2 ADD SWAP1 DUP4 ADD DUP8 DUP4 DUP1 JUMPDEST DUP10 DUP2 LT ISZERO PUSH2 0x4023 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP8 DUP7 SUB ADD DUP5 MSTORE DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP13 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4001 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x400D DUP7 DUP14 DUP4 ADD PUSH2 0x3E8C JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x3FA1 JUMP JUMPDEST POP POP POP POP DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x3F78 DUP2 DUP6 DUP8 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x404A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x4057 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x40A4 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2A3A PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3242 DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND DUP2 DUP6 AND DUP1 DUP4 SUB DUP3 GT ISZERO PUSH2 0x40FE JUMPI PUSH2 0x40FE PUSH2 0x3B88 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP7 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x60 DUP5 ADD MSTORE POP DUP4 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x4156 PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x3C33 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD ISZERO ISZERO PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x60 DUP7 ADD MSTORE DUP1 PUSH1 0x80 DUP6 ADD MLOAD AND PUSH1 0x80 DUP7 ADD MSTORE POP POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xC0 PUSH1 0xA0 DUP6 ADD MSTORE PUSH2 0x2A3A PUSH1 0xC0 DUP6 ADD DUP3 PUSH2 0x3C33 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP1 DUP4 MSTORE PUSH2 0x41CD DUP2 DUP5 ADD DUP10 PUSH2 0x4162 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x41E7 PUSH1 0x20 DUP4 ADD DUP8 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP5 MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE DUP4 MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 DUP5 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xE0 DUP3 ADD MSTORE SWAP1 DUP4 ADD MLOAD DUP1 MLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP1 SWAP3 ADD MLOAD PUSH2 0x120 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xE0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x424C PUSH1 0xE0 DUP4 ADD DUP8 PUSH2 0x4162 JUMP JUMPDEST SWAP1 POP PUSH2 0x4265 PUSH1 0x20 DUP4 ADD DUP7 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP4 MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP6 LT PUSH2 0x42F8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x430F PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x3C33 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 RETURNDATASIZE GT ISZERO PUSH2 0x4338 JUMPI PUSH1 0x4 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD PUSH1 0xE0 SHR JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x44 RETURNDATASIZE LT ISZERO PUSH2 0x4349 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP1 RETURNDATASIZE ADD PUSH1 0x4 DUP4 RETURNDATACOPY DUP2 MLOAD RETURNDATASIZE PUSH8 0xFFFFFFFFFFFFFFFF DUP2 PUSH1 0x24 DUP5 ADD GT DUP2 DUP5 GT OR ISZERO PUSH2 0x4397 JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP3 DUP6 ADD SWAP2 POP DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x43AF JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP5 RETURNDATASIZE DUP8 ADD ADD PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x43C9 JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH2 0x43D8 PUSH1 0x20 DUP3 DUP7 ADD ADD DUP8 PUSH2 0x36F9 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4141353020706F73744F702072657665727465643A2000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x441B DUP2 PUSH1 0x16 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD PUSH1 0x16 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 MSTORE PUSH2 0x443D DUP2 DUP5 ADD DUP8 DUP10 PUSH2 0x3E61 JUMP JUMPDEST SWAP1 POP DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 MLOAD AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0xA0 DUP7 ADD MSTORE DUP1 PUSH1 0xA0 DUP4 ADD MLOAD AND PUSH1 0xC0 DUP7 ADD MSTORE POP PUSH1 0xC0 DUP2 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH1 0xE0 DUP2 ADD MLOAD PUSH2 0x100 DUP6 ADD MSTORE POP PUSH1 0x20 DUP6 ADD MLOAD PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x140 DUP5 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD PUSH2 0x160 DUP5 ADD MSTORE PUSH1 0x80 DUP6 ADD MLOAD PUSH2 0x180 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH2 0x1A0 DUP5 ADD MSTORE PUSH2 0x3F78 DUP2 DUP6 PUSH2 0x3C33 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x4509 PUSH1 0x60 DUP4 ADD DUP8 DUP10 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4156 DUP2 DUP6 DUP8 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x453E PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x3E8C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x414132332072657665727465643A200000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x4588 DUP2 PUSH1 0xF DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD PUSH1 0xF ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x45BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x45D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x45DB DUP2 PUSH2 0x3726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45E8 DUP3 DUP3 PUSH2 0x36F9 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP7 ADD ADD GT ISZERO PUSH2 0x45FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x460E DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD MLOAD SWAP6 SWAP8 SWAP6 SWAP7 POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x414133332072657665727465643A200000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x4588 DUP2 PUSH1 0xF DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE CALLCODE ORIGIN 0xA5 PUSH18 0xA80F7EEB9A2C966C30F3F757B335B20D8CEE 0xDC 0xFC 0xD SWAP15 0xF6 0x5F EQ MUL SUB PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x570E1A36 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0xF9 JUMP JUMPDEST PUSH2 0x6C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7C PUSH1 0x14 DUP3 DUP6 DUP8 PUSH2 0x16B JUMP JUMPDEST PUSH2 0x85 SWAP2 PUSH2 0x195 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x99 DUP5 PUSH1 0x14 DUP2 DUP9 PUSH2 0x16B JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH1 0x20 SWAP4 POP DUP5 SWAP3 POP SWAP1 POP DUP3 DUP6 ADD DUP3 DUP8 GAS CALL SWAP1 POP PUSH1 0x0 MLOAD SWAP4 POP DUP1 PUSH2 0xF0 JUMPI PUSH1 0x0 SWAP4 POP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x138 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x17B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1D5 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE 0xD1 CREATE 0xCA 0xA6 PUSH29 0x2E9EDD3AE1B316811250BE87BEC82D2C9561D197EA5E2B813B0964736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"596:27500:53:-:0;;;778:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;730:67:53;;;596:27500;;;;;;;;;-1:-1:-1;1716:1:33;1821:7;:22;596:27500:53;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@SIG_VALIDATION_FAILED_7574":{"entryPoint":null,"id":7574,"parameterSlots":0,"returnSlots":0},"@_10206":{"entryPoint":null,"id":10206,"parameterSlots":0,"returnSlots":0},"@_compensate_7607":{"entryPoint":10074,"id":7607,"parameterSlots":2,"returnSlots":0},"@_copyUserOpToMemory_8464":{"entryPoint":10818,"id":8464,"parameterSlots":2,"returnSlots":0},"@_createSenderIfNeeded_8770":{"entryPoint":12873,"id":8770,"parameterSlots":4,"returnSlots":0},"@_executeUserOp_7689":{"entryPoint":9740,"id":7689,"parameterSlots":3,"returnSlots":1},"@_getRequiredPrefund_8670":{"entryPoint":11067,"id":8670,"parameterSlots":1,"returnSlots":1},"@_getStakeInfo_10183":{"entryPoint":null,"id":10183,"parameterSlots":1,"returnSlots":1},"@_getValidationData_9311":{"entryPoint":12442,"id":9311,"parameterSlots":1,"returnSlots":2},"@_handlePostOp_9675":{"entryPoint":7884,"id":9675,"parameterSlots":5,"returnSlots":1},"@_incrementDeposit_10248":{"entryPoint":7602,"id":10248,"parameterSlots":2,"returnSlots":0},"@_intersectTimeRange_9905":{"entryPoint":10566,"id":9905,"parameterSlots":2,"returnSlots":1},"@_nonReentrantAfter_3712":{"entryPoint":null,"id":3712,"parameterSlots":0,"returnSlots":0},"@_nonReentrantBefore_3704":{"entryPoint":8704,"id":3704,"parameterSlots":0,"returnSlots":0},"@_parseValidationData_9820":{"entryPoint":12736,"id":9820,"parameterSlots":1,"returnSlots":1},"@_simulationOnlyValidations_8826":{"entryPoint":10348,"id":8826,"parameterSlots":1,"returnSlots":0},"@_validateAccountAndPaymasterValidationData_9263":{"entryPoint":9282,"id":9263,"parameterSlots":4,"returnSlots":0},"@_validateAccountPrepayment_9059":{"entryPoint":11144,"id":9059,"parameterSlots":4,"returnSlots":2},"@_validateAndUpdateNonce_10079":{"entryPoint":11789,"id":10079,"parameterSlots":2,"returnSlots":1},"@_validatePaymasterPrepayment_9192":{"entryPoint":11867,"id":9192,"parameterSlots":5,"returnSlots":2},"@_validatePrepayment_9486":{"entryPoint":8791,"id":9486,"parameterSlots":3,"returnSlots":2},"@_validateSenderAndPaymaster_8887":{"entryPoint":4964,"id":8887,"parameterSlots":5,"returnSlots":0},"@addStake_10354":{"entryPoint":1737,"id":10354,"parameterSlots":1,"returnSlots":0},"@balanceOf_10197":{"entryPoint":null,"id":10197,"parameterSlots":1,"returnSlots":1},"@call_20636":{"entryPoint":7816,"id":20636,"parameterSlots":4,"returnSlots":1},"@calldataKeccak_9990":{"entryPoint":13603,"id":9990,"parameterSlots":2,"returnSlots":1},"@depositTo_10274":{"entryPoint":1627,"id":10274,"parameterSlots":1,"returnSlots":0},"@deposits_10139":{"entryPoint":null,"id":10139,"parameterSlots":0,"returnSlots":0},"@getDepositInfo_10153":{"entryPoint":null,"id":10153,"parameterSlots":1,"returnSlots":1},"@getMemoryBytesFromOffset_9746":{"entryPoint":null,"id":9746,"parameterSlots":1,"returnSlots":1},"@getNonce_10028":{"entryPoint":null,"id":10028,"parameterSlots":2,"returnSlots":1},"@getOffsetOfMemoryBytes_9737":{"entryPoint":null,"id":9737,"parameterSlots":1,"returnSlots":1},"@getReturnData_20671":{"entryPoint":7840,"id":20671,"parameterSlots":1,"returnSlots":1},"@getSenderAddress_8788":{"entryPoint":5217,"id":8788,"parameterSlots":2,"returnSlots":0},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getUserOpGasPrice_9711":{"entryPoint":10770,"id":9711,"parameterSlots":1,"returnSlots":1},"@getUserOpHash_8361":{"entryPoint":5454,"id":8361,"parameterSlots":1,"returnSlots":1},"@handleAggregatedOps_8087":{"entryPoint":3817,"id":8087,"parameterSlots":3,"returnSlots":0},"@handleOps_7797":{"entryPoint":3000,"id":7797,"parameterSlots":3,"returnSlots":0},"@hash_11145":{"entryPoint":10323,"id":11145,"parameterSlots":1,"returnSlots":1},"@incrementNonce_10043":{"entryPoint":2532,"id":10043,"parameterSlots":1,"returnSlots":0},"@innerHandleOp_8336":{"entryPoint":2604,"id":8336,"parameterSlots":4,"returnSlots":1},"@min_9728":{"entryPoint":12849,"id":9728,"parameterSlots":2,"returnSlots":1},"@nonceSequenceNumber_10003":{"entryPoint":null,"id":10003,"parameterSlots":0,"returnSlots":0},"@numberMarker_9751":{"entryPoint":null,"id":9751,"parameterSlots":0,"returnSlots":0},"@pack_11130":{"entryPoint":12525,"id":11130,"parameterSlots":1,"returnSlots":1},"@simulateHandleOp_8175":{"entryPoint":6545,"id":8175,"parameterSlots":4,"returnSlots":0},"@simulateValidation_8627":{"entryPoint":6821,"id":8627,"parameterSlots":1,"returnSlots":0},"@unlockStake_10410":{"entryPoint":5520,"id":10410,"parameterSlots":0,"returnSlots":0},"@withdrawStake_10493":{"entryPoint":5907,"id":10493,"parameterSlots":1,"returnSlots":0},"@withdrawTo_10551":{"entryPoint":3381,"id":10551,"parameterSlots":2,"returnSlots":0},"abi_decode_address":{"entryPoint":13891,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_struct_UserOperation_calldata_dyn_calldata":{"entryPoint":14636,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":14365,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_struct_UserOpInfo":{"entryPoint":14158,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_UserOperation_calldata":{"entryPoint":15064,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":14836,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":16576,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":14792,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint192":{"entryPoint":13902,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_address_payable":{"entryPoint":14705,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptrt_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_bytes_calldata_ptr":{"entryPoint":14998,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes_calldata_ptrt_addresst_bytes_calldata_ptr":{"entryPoint":14865,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_bytes_memory_ptrt_struct$_UserOpInfo_$8204_memory_ptrt_bytes_calldata_ptr":{"entryPoint":14438,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bytes_memory_ptrt_uint256_fromMemory":{"entryPoint":17813,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IAggregator_$10603":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":15089,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_addresst_bytes_calldata_ptr":{"entryPoint":15142,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_uint192":{"entryPoint":13843,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":17628,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":13760,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_uint192":{"entryPoint":13798,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes":{"entryPoint":15411,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":15969,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_struct_ReturnInfo":{"entryPoint":16738,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_StakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_struct_UserOperation_calldata":{"entryPoint":16012,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":16647,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":17744,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023_t_string_memory_ptr__to_t_bytes22_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":17379,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":17953,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":11,"returnSlots":1},"abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr_t_bytes_calldata_ptr__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":16259,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_address_t_uint256__to_t_bytes32_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":16556,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_calldata_ptr_t_address_t_bytes_calldata_ptr__to_t_bytes_memory_ptr_t_address_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":17653,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_bytes_calldata_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":17448,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_enum$_PostOpMode_$10834_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":17087,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_rational_0_by_1_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_struct$_DepositInfo_$10913_memory_ptr__to_t_struct$_DepositInfo_$10913_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__fromStack_reversed":{"entryPoint":16953,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__fromStack_reversed":{"entryPoint":16825,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr_t_bytes32_t_uint256__to_t_struct$_UserOperation_$10993_memory_ptr_t_bytes32_t_uint256__fromStack_reversed":{"entryPoint":17707,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_uint112__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__to_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_bool_t_uint256_t_uint256__to_t_uint256_t_bool_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":15455,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint256_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980__to_t_uint256_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__to_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":16663,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint32__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint48__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":15664,"id":null,"parameterSlots":2,"returnSlots":2},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":15768,"id":null,"parameterSlots":2,"returnSlots":2},"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":15527,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr":{"entryPoint":15612,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":14118,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_access_bytes_calldata":{"entryPoint":15869,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":16442,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":15287,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint48":{"entryPoint":16605,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":15589,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":16484,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":15367,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":14073,"id":null,"parameterSlots":2,"returnSlots":0},"finalize_allocation_5939":{"entryPoint":14002,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_5940":{"entryPoint":14040,"id":null,"parameterSlots":1,"returnSlots":0},"increment_t_uint256":{"entryPoint":15311,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":15240,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":17040,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":15480,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":13955,"id":null,"parameterSlots":0,"returnSlots":0},"return_data_selector":{"entryPoint":17183,"id":null,"parameterSlots":0,"returnSlots":1},"try_decode_error_message":{"entryPoint":17211,"id":null,"parameterSlots":0,"returnSlots":1},"validator_revert_address":{"entryPoint":13870,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:50803:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"344:155:111","statements":[{"nodeType":"YulAssignment","src":"354:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"376:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"363:12:111"},"nodeType":"YulFunctionCall","src":"363:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"354:5:111"}]},{"body":{"nodeType":"YulBlock","src":"477:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"486:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"489:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"479:6:111"},"nodeType":"YulFunctionCall","src":"479:12:111"},"nodeType":"YulExpressionStatement","src":"479:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"405:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"416:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"423:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"412:3:111"},"nodeType":"YulFunctionCall","src":"412:62:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"402:2:111"},"nodeType":"YulFunctionCall","src":"402:73:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"395:6:111"},"nodeType":"YulFunctionCall","src":"395:81:111"},"nodeType":"YulIf","src":"392:101:111"}]},"name":"abi_decode_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"323:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"334:5:111","type":""}],"src":"295:204:111"},{"body":{"nodeType":"YulBlock","src":"574:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"620:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"629:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"632:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"622:6:111"},"nodeType":"YulFunctionCall","src":"622:12:111"},"nodeType":"YulExpressionStatement","src":"622:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"595:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"604:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"591:3:111"},"nodeType":"YulFunctionCall","src":"591:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"616:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"587:3:111"},"nodeType":"YulFunctionCall","src":"587:32:111"},"nodeType":"YulIf","src":"584:52:111"},{"nodeType":"YulAssignment","src":"645:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"674:9:111"}],"functionName":{"name":"abi_decode_uint192","nodeType":"YulIdentifier","src":"655:18:111"},"nodeType":"YulFunctionCall","src":"655:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"645:6:111"}]}]},"name":"abi_decode_tuple_t_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"540:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"551:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"563:6:111","type":""}],"src":"504:186:111"},{"body":{"nodeType":"YulBlock","src":"740:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"827:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"836:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"839:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"829:6:111"},"nodeType":"YulFunctionCall","src":"829:12:111"},"nodeType":"YulExpressionStatement","src":"829:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"763:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"774:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"781:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"770:3:111"},"nodeType":"YulFunctionCall","src":"770:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"760:2:111"},"nodeType":"YulFunctionCall","src":"760:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"753:6:111"},"nodeType":"YulFunctionCall","src":"753:73:111"},"nodeType":"YulIf","src":"750:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"729:5:111","type":""}],"src":"695:154:111"},{"body":{"nodeType":"YulBlock","src":"903:85:111","statements":[{"nodeType":"YulAssignment","src":"913:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"935:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"922:12:111"},"nodeType":"YulFunctionCall","src":"922:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"913:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"976:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"951:24:111"},"nodeType":"YulFunctionCall","src":"951:31:111"},"nodeType":"YulExpressionStatement","src":"951:31:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"882:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"893:5:111","type":""}],"src":"854:134:111"},{"body":{"nodeType":"YulBlock","src":"1080:234:111","statements":[{"body":{"nodeType":"YulBlock","src":"1126:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1135:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1138:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1128:6:111"},"nodeType":"YulFunctionCall","src":"1128:12:111"},"nodeType":"YulExpressionStatement","src":"1128:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1101:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1110:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1097:3:111"},"nodeType":"YulFunctionCall","src":"1097:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1122:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1093:3:111"},"nodeType":"YulFunctionCall","src":"1093:32:111"},"nodeType":"YulIf","src":"1090:52:111"},{"nodeType":"YulVariableDeclaration","src":"1151:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1177:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1164:12:111"},"nodeType":"YulFunctionCall","src":"1164:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1155:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1221:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1196:24:111"},"nodeType":"YulFunctionCall","src":"1196:31:111"},"nodeType":"YulExpressionStatement","src":"1196:31:111"},{"nodeType":"YulAssignment","src":"1236:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1246:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1236:6:111"}]},{"nodeType":"YulAssignment","src":"1260:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1293:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1304:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1289:3:111"},"nodeType":"YulFunctionCall","src":"1289:18:111"}],"functionName":{"name":"abi_decode_uint192","nodeType":"YulIdentifier","src":"1270:18:111"},"nodeType":"YulFunctionCall","src":"1270:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1260:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1038:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1049:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1061:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1069:6:111","type":""}],"src":"993:321:111"},{"body":{"nodeType":"YulBlock","src":"1420:76:111","statements":[{"nodeType":"YulAssignment","src":"1430:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1442:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1453:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1438:3:111"},"nodeType":"YulFunctionCall","src":"1438:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1430:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1472:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1483:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1465:6:111"},"nodeType":"YulFunctionCall","src":"1465:25:111"},"nodeType":"YulExpressionStatement","src":"1465:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1389:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1400:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1411:4:111","type":""}],"src":"1319:177:111"},{"body":{"nodeType":"YulBlock","src":"1533:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1550:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1553:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1543:6:111"},"nodeType":"YulFunctionCall","src":"1543:88:111"},"nodeType":"YulExpressionStatement","src":"1543:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1647:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1650:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1640:6:111"},"nodeType":"YulFunctionCall","src":"1640:15:111"},"nodeType":"YulExpressionStatement","src":"1640:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1671:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1674:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1664:6:111"},"nodeType":"YulFunctionCall","src":"1664:15:111"},"nodeType":"YulExpressionStatement","src":"1664:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"1501:184:111"},{"body":{"nodeType":"YulBlock","src":"1736:179:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1746:35:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1768:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1776:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1764:3:111"},"nodeType":"YulFunctionCall","src":"1764:17:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1750:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1856:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1858:16:111"},"nodeType":"YulFunctionCall","src":"1858:18:111"},"nodeType":"YulExpressionStatement","src":"1858:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1799:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1811:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1796:2:111"},"nodeType":"YulFunctionCall","src":"1796:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1835:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1847:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1832:2:111"},"nodeType":"YulFunctionCall","src":"1832:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1793:2:111"},"nodeType":"YulFunctionCall","src":"1793:62:111"},"nodeType":"YulIf","src":"1790:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1894:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1898:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1887:6:111"},"nodeType":"YulFunctionCall","src":"1887:22:111"},"nodeType":"YulExpressionStatement","src":"1887:22:111"}]},"name":"finalize_allocation_5939","nodeType":"YulFunctionDefinition","parameters":[{"name":"memPtr","nodeType":"YulTypedName","src":"1724:6:111","type":""}],"src":"1690:225:111"},{"body":{"nodeType":"YulBlock","src":"1966:181:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1976:37:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1998:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2006:6:111","type":"","value":"0x0100"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1994:3:111"},"nodeType":"YulFunctionCall","src":"1994:19:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1980:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2088:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2090:16:111"},"nodeType":"YulFunctionCall","src":"2090:18:111"},"nodeType":"YulExpressionStatement","src":"2090:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2031:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2043:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2028:2:111"},"nodeType":"YulFunctionCall","src":"2028:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2067:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2079:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2064:2:111"},"nodeType":"YulFunctionCall","src":"2064:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2025:2:111"},"nodeType":"YulFunctionCall","src":"2025:62:111"},"nodeType":"YulIf","src":"2022:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2126:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2130:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2119:6:111"},"nodeType":"YulFunctionCall","src":"2119:22:111"},"nodeType":"YulExpressionStatement","src":"2119:22:111"}]},"name":"finalize_allocation_5940","nodeType":"YulFunctionDefinition","parameters":[{"name":"memPtr","nodeType":"YulTypedName","src":"1954:6:111","type":""}],"src":"1920:227:111"},{"body":{"nodeType":"YulBlock","src":"2199:261:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2209:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2231:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"2247:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"2253:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2243:3:111"},"nodeType":"YulFunctionCall","src":"2243:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"2258:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2239:3:111"},"nodeType":"YulFunctionCall","src":"2239:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2227:3:111"},"nodeType":"YulFunctionCall","src":"2227:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"2213:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2401:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2403:16:111"},"nodeType":"YulFunctionCall","src":"2403:18:111"},"nodeType":"YulExpressionStatement","src":"2403:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2344:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2356:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2341:2:111"},"nodeType":"YulFunctionCall","src":"2341:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2380:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2392:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2377:2:111"},"nodeType":"YulFunctionCall","src":"2377:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2338:2:111"},"nodeType":"YulFunctionCall","src":"2338:62:111"},"nodeType":"YulIf","src":"2335:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2439:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2443:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2432:6:111"},"nodeType":"YulFunctionCall","src":"2432:22:111"},"nodeType":"YulExpressionStatement","src":"2432:22:111"}]},"name":"finalize_allocation","nodeType":"YulFunctionDefinition","parameters":[{"name":"memPtr","nodeType":"YulTypedName","src":"2181:6:111","type":""},{"name":"size","nodeType":"YulTypedName","src":"2189:4:111","type":""}],"src":"2152:308:111"},{"body":{"nodeType":"YulBlock","src":"2522:188:111","statements":[{"body":{"nodeType":"YulBlock","src":"2566:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2568:16:111"},"nodeType":"YulFunctionCall","src":"2568:18:111"},"nodeType":"YulExpressionStatement","src":"2568:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2538:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2546:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2535:2:111"},"nodeType":"YulFunctionCall","src":"2535:30:111"},"nodeType":"YulIf","src":"2532:56:111"},{"nodeType":"YulAssignment","src":"2597:107:111","value":{"arguments":[{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2617:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2625:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2630:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2609:3:111"},"nodeType":"YulFunctionCall","src":"2609:88:111"},{"kind":"number","nodeType":"YulLiteral","src":"2699:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2605:3:111"},"nodeType":"YulFunctionCall","src":"2605:99:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"2597:4:111"}]}]},"name":"array_allocation_size_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"2502:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"2513:4:111","type":""}],"src":"2465:245:111"},{"body":{"nodeType":"YulBlock","src":"2782:1177:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2792:29:111","value":{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"2806:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2811:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2802:3:111"},"nodeType":"YulFunctionCall","src":"2802:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2796:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2837:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2841:6:111","type":"","value":"0x0180"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2833:3:111"},"nodeType":"YulFunctionCall","src":"2833:15:111"},"nodeType":"YulIf","src":"2830:35:111"},{"nodeType":"YulVariableDeclaration","src":"2874:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2894:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2888:5:111"},"nodeType":"YulFunctionCall","src":"2888:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"2878:6:111","type":""}]},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2931:6:111"}],"functionName":{"name":"finalize_allocation_5939","nodeType":"YulIdentifier","src":"2906:24:111"},"nodeType":"YulFunctionCall","src":"2906:32:111"},"nodeType":"YulExpressionStatement","src":"2906:32:111"},{"nodeType":"YulAssignment","src":"2947:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"2956:6:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2947:5:111"}]},{"nodeType":"YulVariableDeclaration","src":"2971:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2981:6:111","type":"","value":"0x0100"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2975:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3011:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3020:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3023:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3013:6:111"},"nodeType":"YulFunctionCall","src":"3013:12:111"},"nodeType":"YulExpressionStatement","src":"3013:12:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3003:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3007:2:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2999:3:111"},"nodeType":"YulFunctionCall","src":"2999:11:111"},"nodeType":"YulIf","src":"2996:31:111"},{"nodeType":"YulVariableDeclaration","src":"3036:25:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3058:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3052:5:111"},"nodeType":"YulFunctionCall","src":"3052:9:111"},"variables":[{"name":"memPtr_1","nodeType":"YulTypedName","src":"3040:8:111","type":""}]},{"expression":{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3095:8:111"}],"functionName":{"name":"finalize_allocation_5940","nodeType":"YulIdentifier","src":"3070:24:111"},"nodeType":"YulFunctionCall","src":"3070:34:111"},"nodeType":"YulExpressionStatement","src":"3070:34:111"},{"expression":{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3120:8:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3149:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3130:18:111"},"nodeType":"YulFunctionCall","src":"3130:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3113:6:111"},"nodeType":"YulFunctionCall","src":"3113:47:111"},"nodeType":"YulExpressionStatement","src":"3113:47:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3180:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3190:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3176:3:111"},"nodeType":"YulFunctionCall","src":"3176:17:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3212:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3223:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3208:3:111"},"nodeType":"YulFunctionCall","src":"3208:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3195:12:111"},"nodeType":"YulFunctionCall","src":"3195:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3169:6:111"},"nodeType":"YulFunctionCall","src":"3169:59:111"},"nodeType":"YulExpressionStatement","src":"3169:59:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3248:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3258:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3244:3:111"},"nodeType":"YulFunctionCall","src":"3244:17:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3291:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3276:3:111"},"nodeType":"YulFunctionCall","src":"3276:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3263:12:111"},"nodeType":"YulFunctionCall","src":"3263:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3237:6:111"},"nodeType":"YulFunctionCall","src":"3237:59:111"},"nodeType":"YulExpressionStatement","src":"3237:59:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3316:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3326:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3312:3:111"},"nodeType":"YulFunctionCall","src":"3312:17:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3359:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3344:3:111"},"nodeType":"YulFunctionCall","src":"3344:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3331:12:111"},"nodeType":"YulFunctionCall","src":"3331:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3305:6:111"},"nodeType":"YulFunctionCall","src":"3305:59:111"},"nodeType":"YulExpressionStatement","src":"3305:59:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3384:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3394:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:18:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3417:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3428:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3413:3:111"},"nodeType":"YulFunctionCall","src":"3413:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3400:12:111"},"nodeType":"YulFunctionCall","src":"3400:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:61:111"},"nodeType":"YulExpressionStatement","src":"3373:61:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3454:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3464:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3450:3:111"},"nodeType":"YulFunctionCall","src":"3450:19:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3494:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3505:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3490:3:111"},"nodeType":"YulFunctionCall","src":"3490:20:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3471:18:111"},"nodeType":"YulFunctionCall","src":"3471:40:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3443:6:111"},"nodeType":"YulFunctionCall","src":"3443:69:111"},"nodeType":"YulExpressionStatement","src":"3443:69:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3532:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3542:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3528:3:111"},"nodeType":"YulFunctionCall","src":"3528:18:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3565:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3576:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3561:3:111"},"nodeType":"YulFunctionCall","src":"3561:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3548:12:111"},"nodeType":"YulFunctionCall","src":"3548:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3521:6:111"},"nodeType":"YulFunctionCall","src":"3521:61:111"},"nodeType":"YulExpressionStatement","src":"3521:61:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3602:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"3612:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3598:3:111"},"nodeType":"YulFunctionCall","src":"3598:18:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3635:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3646:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3631:3:111"},"nodeType":"YulFunctionCall","src":"3631:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3618:12:111"},"nodeType":"YulFunctionCall","src":"3618:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3591:6:111"},"nodeType":"YulFunctionCall","src":"3591:61:111"},"nodeType":"YulExpressionStatement","src":"3591:61:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3668:6:111"},{"name":"memPtr_1","nodeType":"YulIdentifier","src":"3676:8:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3661:6:111"},"nodeType":"YulFunctionCall","src":"3661:24:111"},"nodeType":"YulExpressionStatement","src":"3661:24:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3705:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3713:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3701:3:111"},"nodeType":"YulFunctionCall","src":"3701:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3735:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3746:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3731:3:111"},"nodeType":"YulFunctionCall","src":"3731:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3718:12:111"},"nodeType":"YulFunctionCall","src":"3718:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3694:6:111"},"nodeType":"YulFunctionCall","src":"3694:57:111"},"nodeType":"YulExpressionStatement","src":"3694:57:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3771:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3779:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3767:3:111"},"nodeType":"YulFunctionCall","src":"3767:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3801:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3812:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3797:3:111"},"nodeType":"YulFunctionCall","src":"3797:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3784:12:111"},"nodeType":"YulFunctionCall","src":"3784:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3760:6:111"},"nodeType":"YulFunctionCall","src":"3760:58:111"},"nodeType":"YulExpressionStatement","src":"3760:58:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3838:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3846:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3834:3:111"},"nodeType":"YulFunctionCall","src":"3834:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3868:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3879:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3864:3:111"},"nodeType":"YulFunctionCall","src":"3864:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3851:12:111"},"nodeType":"YulFunctionCall","src":"3851:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3827:6:111"},"nodeType":"YulFunctionCall","src":"3827:58:111"},"nodeType":"YulExpressionStatement","src":"3827:58:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3905:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3913:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3901:3:111"},"nodeType":"YulFunctionCall","src":"3901:16:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3947:3:111","type":"","value":"352"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3932:3:111"},"nodeType":"YulFunctionCall","src":"3932:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3919:12:111"},"nodeType":"YulFunctionCall","src":"3919:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3894:6:111"},"nodeType":"YulFunctionCall","src":"3894:59:111"},"nodeType":"YulExpressionStatement","src":"3894:59:111"}]},"name":"abi_decode_struct_UserOpInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2753:9:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2764:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2772:5:111","type":""}],"src":"2715:1244:111"},{"body":{"nodeType":"YulBlock","src":"4036:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"4085:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4094:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4097:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4087:6:111"},"nodeType":"YulFunctionCall","src":"4087:12:111"},"nodeType":"YulExpressionStatement","src":"4087:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4064:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4072:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4060:3:111"},"nodeType":"YulFunctionCall","src":"4060:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"4079:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4056:3:111"},"nodeType":"YulFunctionCall","src":"4056:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4049:6:111"},"nodeType":"YulFunctionCall","src":"4049:35:111"},"nodeType":"YulIf","src":"4046:55:111"},{"nodeType":"YulAssignment","src":"4110:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4133:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4120:12:111"},"nodeType":"YulFunctionCall","src":"4120:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"4110:6:111"}]},{"body":{"nodeType":"YulBlock","src":"4183:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4192:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4195:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4185:6:111"},"nodeType":"YulFunctionCall","src":"4185:12:111"},"nodeType":"YulExpressionStatement","src":"4185:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"4155:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4163:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4152:2:111"},"nodeType":"YulFunctionCall","src":"4152:30:111"},"nodeType":"YulIf","src":"4149:50:111"},{"nodeType":"YulAssignment","src":"4208:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4224:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4232:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4220:3:111"},"nodeType":"YulFunctionCall","src":"4220:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"4208:8:111"}]},{"body":{"nodeType":"YulBlock","src":"4289:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4298:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4301:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4291:6:111"},"nodeType":"YulFunctionCall","src":"4291:12:111"},"nodeType":"YulExpressionStatement","src":"4291:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4260:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"4268:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4256:3:111"},"nodeType":"YulFunctionCall","src":"4256:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"4277:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4252:3:111"},"nodeType":"YulFunctionCall","src":"4252:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"4284:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4249:2:111"},"nodeType":"YulFunctionCall","src":"4249:39:111"},"nodeType":"YulIf","src":"4246:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3999:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"4007:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"4015:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"4025:6:111","type":""}],"src":"3964:347:111"},{"body":{"nodeType":"YulBlock","src":"4476:1008:111","statements":[{"body":{"nodeType":"YulBlock","src":"4523:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4532:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4535:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4525:6:111"},"nodeType":"YulFunctionCall","src":"4525:12:111"},"nodeType":"YulExpressionStatement","src":"4525:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4497:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4506:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4493:3:111"},"nodeType":"YulFunctionCall","src":"4493:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4518:3:111","type":"","value":"448"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4489:3:111"},"nodeType":"YulFunctionCall","src":"4489:33:111"},"nodeType":"YulIf","src":"4486:53:111"},{"nodeType":"YulVariableDeclaration","src":"4548:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4575:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4562:12:111"},"nodeType":"YulFunctionCall","src":"4562:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4552:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4594:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4604:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4598:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4649:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4658:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4661:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4651:6:111"},"nodeType":"YulFunctionCall","src":"4651:12:111"},"nodeType":"YulExpressionStatement","src":"4651:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4637:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4645:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4634:2:111"},"nodeType":"YulFunctionCall","src":"4634:14:111"},"nodeType":"YulIf","src":"4631:34:111"},{"nodeType":"YulVariableDeclaration","src":"4674:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4688:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4699:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4684:3:111"},"nodeType":"YulFunctionCall","src":"4684:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"4678:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4754:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4763:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4766:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4756:6:111"},"nodeType":"YulFunctionCall","src":"4756:12:111"},"nodeType":"YulExpressionStatement","src":"4756:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4733:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4737:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4729:3:111"},"nodeType":"YulFunctionCall","src":"4729:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4744:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4725:3:111"},"nodeType":"YulFunctionCall","src":"4725:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4718:6:111"},"nodeType":"YulFunctionCall","src":"4718:35:111"},"nodeType":"YulIf","src":"4715:55:111"},{"nodeType":"YulVariableDeclaration","src":"4779:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4802:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4789:12:111"},"nodeType":"YulFunctionCall","src":"4789:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"4783:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4814:41:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"4852:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"4824:27:111"},"nodeType":"YulFunctionCall","src":"4824:31:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"4818:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4864:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4884:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4878:5:111"},"nodeType":"YulFunctionCall","src":"4878:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"4868:6:111","type":""}]},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"4916:6:111"},{"name":"_4","nodeType":"YulIdentifier","src":"4924:2:111"}],"functionName":{"name":"finalize_allocation","nodeType":"YulIdentifier","src":"4896:19:111"},"nodeType":"YulFunctionCall","src":"4896:31:111"},"nodeType":"YulExpressionStatement","src":"4896:31:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"4943:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"4951:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4936:6:111"},"nodeType":"YulFunctionCall","src":"4936:18:111"},"nodeType":"YulExpressionStatement","src":"4936:18:111"},{"body":{"nodeType":"YulBlock","src":"5002:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5011:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5014:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5004:6:111"},"nodeType":"YulFunctionCall","src":"5004:12:111"},"nodeType":"YulExpressionStatement","src":"5004:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4977:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"4981:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4973:3:111"},"nodeType":"YulFunctionCall","src":"4973:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"4986:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4969:3:111"},"nodeType":"YulFunctionCall","src":"4969:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4993:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4966:2:111"},"nodeType":"YulFunctionCall","src":"4966:35:111"},"nodeType":"YulIf","src":"4963:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"5044:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5052:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5040:3:111"},"nodeType":"YulFunctionCall","src":"5040:17:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5063:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5067:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5059:3:111"},"nodeType":"YulFunctionCall","src":"5059:13:111"},{"name":"_3","nodeType":"YulIdentifier","src":"5074:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"5027:12:111"},"nodeType":"YulFunctionCall","src":"5027:50:111"},"nodeType":"YulExpressionStatement","src":"5027:50:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"5101:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"5109:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5097:3:111"},"nodeType":"YulFunctionCall","src":"5097:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5114:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5093:3:111"},"nodeType":"YulFunctionCall","src":"5093:26:111"},{"kind":"number","nodeType":"YulLiteral","src":"5121:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5086:6:111"},"nodeType":"YulFunctionCall","src":"5086:37:111"},"nodeType":"YulExpressionStatement","src":"5086:37:111"},{"nodeType":"YulAssignment","src":"5132:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"5142:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5132:6:111"}]},{"nodeType":"YulAssignment","src":"5157:69:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5200:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5211:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5196:3:111"},"nodeType":"YulFunctionCall","src":"5196:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5218:7:111"}],"functionName":{"name":"abi_decode_struct_UserOpInfo","nodeType":"YulIdentifier","src":"5167:28:111"},"nodeType":"YulFunctionCall","src":"5167:59:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5157:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"5235:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5268:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5279:3:111","type":"","value":"416"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5264:3:111"},"nodeType":"YulFunctionCall","src":"5264:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5251:12:111"},"nodeType":"YulFunctionCall","src":"5251:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"5239:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5313:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5322:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5325:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5315:6:111"},"nodeType":"YulFunctionCall","src":"5315:12:111"},"nodeType":"YulExpressionStatement","src":"5315:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"5299:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5309:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5296:2:111"},"nodeType":"YulFunctionCall","src":"5296:16:111"},"nodeType":"YulIf","src":"5293:36:111"},{"nodeType":"YulVariableDeclaration","src":"5338:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5394:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"5405:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5390:3:111"},"nodeType":"YulFunctionCall","src":"5390:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5416:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"5364:25:111"},"nodeType":"YulFunctionCall","src":"5364:60:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"5342:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"5352:8:111","type":""}]},{"nodeType":"YulAssignment","src":"5433:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"5443:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5433:6:111"}]},{"nodeType":"YulAssignment","src":"5460:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"5470:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"5460:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_memory_ptrt_struct$_UserOpInfo_$8204_memory_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4418:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4429:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4441:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4449:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4457:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4465:6:111","type":""}],"src":"4316:1168:111"},{"body":{"nodeType":"YulBlock","src":"5595:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"5644:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5653:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5656:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5646:6:111"},"nodeType":"YulFunctionCall","src":"5646:12:111"},"nodeType":"YulExpressionStatement","src":"5646:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5623:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5631:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5619:3:111"},"nodeType":"YulFunctionCall","src":"5619:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"5638:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5615:3:111"},"nodeType":"YulFunctionCall","src":"5615:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5608:6:111"},"nodeType":"YulFunctionCall","src":"5608:35:111"},"nodeType":"YulIf","src":"5605:55:111"},{"nodeType":"YulAssignment","src":"5669:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5692:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5679:12:111"},"nodeType":"YulFunctionCall","src":"5679:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"5669:6:111"}]},{"body":{"nodeType":"YulBlock","src":"5742:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5751:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5754:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5744:6:111"},"nodeType":"YulFunctionCall","src":"5744:12:111"},"nodeType":"YulExpressionStatement","src":"5744:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5714:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5722:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5711:2:111"},"nodeType":"YulFunctionCall","src":"5711:30:111"},"nodeType":"YulIf","src":"5708:50:111"},{"nodeType":"YulAssignment","src":"5767:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5783:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5791:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5779:3:111"},"nodeType":"YulFunctionCall","src":"5779:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"5767:8:111"}]},{"body":{"nodeType":"YulBlock","src":"5856:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5865:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5868:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5858:6:111"},"nodeType":"YulFunctionCall","src":"5858:12:111"},"nodeType":"YulExpressionStatement","src":"5858:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5819:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5831:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"5834:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"5827:3:111"},"nodeType":"YulFunctionCall","src":"5827:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5815:3:111"},"nodeType":"YulFunctionCall","src":"5815:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"5844:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5811:3:111"},"nodeType":"YulFunctionCall","src":"5811:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"5851:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5808:2:111"},"nodeType":"YulFunctionCall","src":"5808:47:111"},"nodeType":"YulIf","src":"5805:67:111"}]},"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"5558:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"5566:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"5574:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"5584:6:111","type":""}],"src":"5489:389:111"},{"body":{"nodeType":"YulBlock","src":"6047:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"6093:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6102:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6105:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6095:6:111"},"nodeType":"YulFunctionCall","src":"6095:12:111"},"nodeType":"YulExpressionStatement","src":"6095:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6068:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6077:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6064:3:111"},"nodeType":"YulFunctionCall","src":"6064:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6089:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6060:3:111"},"nodeType":"YulFunctionCall","src":"6060:32:111"},"nodeType":"YulIf","src":"6057:52:111"},{"nodeType":"YulVariableDeclaration","src":"6118:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6145:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6132:12:111"},"nodeType":"YulFunctionCall","src":"6132:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6122:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6200:6:111"},"nodeType":"YulFunctionCall","src":"6200:12:111"},"nodeType":"YulExpressionStatement","src":"6200:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6170:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6178:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6167:2:111"},"nodeType":"YulFunctionCall","src":"6167:30:111"},"nodeType":"YulIf","src":"6164:50:111"},{"nodeType":"YulVariableDeclaration","src":"6223:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6313:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6324:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6309:3:111"},"nodeType":"YulFunctionCall","src":"6309:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6333:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"6249:59:111"},"nodeType":"YulFunctionCall","src":"6249:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"6227:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"6237:8:111","type":""}]},{"nodeType":"YulAssignment","src":"6350:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"6360:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6350:6:111"}]},{"nodeType":"YulAssignment","src":"6377:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"6387:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6377:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6404:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6434:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6445:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6430:3:111"},"nodeType":"YulFunctionCall","src":"6430:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6417:12:111"},"nodeType":"YulFunctionCall","src":"6417:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6408:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6483:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6458:24:111"},"nodeType":"YulFunctionCall","src":"6458:31:111"},"nodeType":"YulExpressionStatement","src":"6458:31:111"},{"nodeType":"YulAssignment","src":"6498:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6508:5:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6498:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5997:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6008:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6020:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6028:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6036:6:111","type":""}],"src":"5883:636:111"},{"body":{"nodeType":"YulBlock","src":"6619:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"6665:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6674:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6677:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6667:6:111"},"nodeType":"YulFunctionCall","src":"6667:12:111"},"nodeType":"YulExpressionStatement","src":"6667:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6640:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6649:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6636:3:111"},"nodeType":"YulFunctionCall","src":"6636:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6661:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6632:3:111"},"nodeType":"YulFunctionCall","src":"6632:32:111"},"nodeType":"YulIf","src":"6629:52:111"},{"nodeType":"YulVariableDeclaration","src":"6690:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6716:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6703:12:111"},"nodeType":"YulFunctionCall","src":"6703:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6694:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6760:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6735:24:111"},"nodeType":"YulFunctionCall","src":"6735:31:111"},"nodeType":"YulExpressionStatement","src":"6735:31:111"},{"nodeType":"YulAssignment","src":"6775:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6785:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6775:6:111"}]},{"nodeType":"YulAssignment","src":"6799:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6826:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6837:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6822:3:111"},"nodeType":"YulFunctionCall","src":"6822:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6809:12:111"},"nodeType":"YulFunctionCall","src":"6809:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6799:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6577:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6588:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6600:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6608:6:111","type":""}],"src":"6524:323:111"},{"body":{"nodeType":"YulBlock","src":"7023:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"7069:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7078:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7081:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7071:6:111"},"nodeType":"YulFunctionCall","src":"7071:12:111"},"nodeType":"YulExpressionStatement","src":"7071:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7044:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7053:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7040:3:111"},"nodeType":"YulFunctionCall","src":"7040:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7065:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7036:3:111"},"nodeType":"YulFunctionCall","src":"7036:32:111"},"nodeType":"YulIf","src":"7033:52:111"},{"nodeType":"YulVariableDeclaration","src":"7094:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7121:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7108:12:111"},"nodeType":"YulFunctionCall","src":"7108:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7098:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7174:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7183:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7186:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7176:6:111"},"nodeType":"YulFunctionCall","src":"7176:12:111"},"nodeType":"YulExpressionStatement","src":"7176:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7146:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7154:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7143:2:111"},"nodeType":"YulFunctionCall","src":"7143:30:111"},"nodeType":"YulIf","src":"7140:50:111"},{"nodeType":"YulVariableDeclaration","src":"7199:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7289:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7300:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7285:3:111"},"nodeType":"YulFunctionCall","src":"7285:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7309:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"7225:59:111"},"nodeType":"YulFunctionCall","src":"7225:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"7203:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"7213:8:111","type":""}]},{"nodeType":"YulAssignment","src":"7326:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"7336:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7326:6:111"}]},{"nodeType":"YulAssignment","src":"7353:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"7363:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7353:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7380:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7410:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7421:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7406:3:111"},"nodeType":"YulFunctionCall","src":"7406:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7393:12:111"},"nodeType":"YulFunctionCall","src":"7393:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7384:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7459:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7434:24:111"},"nodeType":"YulFunctionCall","src":"7434:31:111"},"nodeType":"YulExpressionStatement","src":"7434:31:111"},{"nodeType":"YulAssignment","src":"7474:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7484:5:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"7474:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptrt_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6973:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6984:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6996:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7004:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7012:6:111","type":""}],"src":"6852:643:111"},{"body":{"nodeType":"YulBlock","src":"7570:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"7616:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7625:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7628:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7618:6:111"},"nodeType":"YulFunctionCall","src":"7618:12:111"},"nodeType":"YulExpressionStatement","src":"7618:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7591:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7600:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7587:3:111"},"nodeType":"YulFunctionCall","src":"7587:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7612:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7583:3:111"},"nodeType":"YulFunctionCall","src":"7583:32:111"},"nodeType":"YulIf","src":"7580:52:111"},{"nodeType":"YulVariableDeclaration","src":"7641:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7667:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7654:12:111"},"nodeType":"YulFunctionCall","src":"7654:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7645:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7711:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7686:24:111"},"nodeType":"YulFunctionCall","src":"7686:31:111"},"nodeType":"YulExpressionStatement","src":"7686:31:111"},{"nodeType":"YulAssignment","src":"7726:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7736:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7726:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7536:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7547:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7559:6:111","type":""}],"src":"7500:247:111"},{"body":{"nodeType":"YulBlock","src":"7913:457:111","statements":[{"nodeType":"YulAssignment","src":"7923:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7935:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7946:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7931:3:111"},"nodeType":"YulFunctionCall","src":"7931:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7923:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"7959:40:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7969:30:111","type":"","value":"0xffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7963:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8015:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8036:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8030:5:111"},"nodeType":"YulFunctionCall","src":"8030:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8045:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8026:3:111"},"nodeType":"YulFunctionCall","src":"8026:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8008:6:111"},"nodeType":"YulFunctionCall","src":"8008:41:111"},"nodeType":"YulExpressionStatement","src":"8008:41:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8069:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8080:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8065:3:111"},"nodeType":"YulFunctionCall","src":"8065:20:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8111:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8119:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8107:3:111"},"nodeType":"YulFunctionCall","src":"8107:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8101:5:111"},"nodeType":"YulFunctionCall","src":"8101:24:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8094:6:111"},"nodeType":"YulFunctionCall","src":"8094:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8087:6:111"},"nodeType":"YulFunctionCall","src":"8087:40:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8058:6:111"},"nodeType":"YulFunctionCall","src":"8058:70:111"},"nodeType":"YulExpressionStatement","src":"8058:70:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8148:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8159:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8144:3:111"},"nodeType":"YulFunctionCall","src":"8144:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8180:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8188:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8176:3:111"},"nodeType":"YulFunctionCall","src":"8176:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8170:5:111"},"nodeType":"YulFunctionCall","src":"8170:24:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8196:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8166:3:111"},"nodeType":"YulFunctionCall","src":"8166:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8137:6:111"},"nodeType":"YulFunctionCall","src":"8137:63:111"},"nodeType":"YulExpressionStatement","src":"8137:63:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8231:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8216:3:111"},"nodeType":"YulFunctionCall","src":"8216:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8252:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8260:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8248:3:111"},"nodeType":"YulFunctionCall","src":"8248:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8242:5:111"},"nodeType":"YulFunctionCall","src":"8242:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"8268:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8238:3:111"},"nodeType":"YulFunctionCall","src":"8238:41:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8209:6:111"},"nodeType":"YulFunctionCall","src":"8209:71:111"},"nodeType":"YulExpressionStatement","src":"8209:71:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8300:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8311:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8296:3:111"},"nodeType":"YulFunctionCall","src":"8296:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8332:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8340:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8328:3:111"},"nodeType":"YulFunctionCall","src":"8328:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8322:5:111"},"nodeType":"YulFunctionCall","src":"8322:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"8348:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8318:3:111"},"nodeType":"YulFunctionCall","src":"8318:45:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8289:6:111"},"nodeType":"YulFunctionCall","src":"8289:75:111"},"nodeType":"YulExpressionStatement","src":"8289:75:111"}]},"name":"abi_encode_tuple_t_struct$_DepositInfo_$10913_memory_ptr__to_t_struct$_DepositInfo_$10913_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7882:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7893:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7904:4:111","type":""}],"src":"7752:618:111"},{"body":{"nodeType":"YulBlock","src":"8517:710:111","statements":[{"body":{"nodeType":"YulBlock","src":"8563:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8572:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8575:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8565:6:111"},"nodeType":"YulFunctionCall","src":"8565:12:111"},"nodeType":"YulExpressionStatement","src":"8565:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8538:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8547:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8534:3:111"},"nodeType":"YulFunctionCall","src":"8534:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8559:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8530:3:111"},"nodeType":"YulFunctionCall","src":"8530:32:111"},"nodeType":"YulIf","src":"8527:52:111"},{"nodeType":"YulVariableDeclaration","src":"8588:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8615:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8602:12:111"},"nodeType":"YulFunctionCall","src":"8602:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8592:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8634:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8644:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8638:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8689:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8698:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8701:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8691:6:111"},"nodeType":"YulFunctionCall","src":"8691:12:111"},"nodeType":"YulExpressionStatement","src":"8691:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8677:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8685:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8674:2:111"},"nodeType":"YulFunctionCall","src":"8674:14:111"},"nodeType":"YulIf","src":"8671:34:111"},{"nodeType":"YulVariableDeclaration","src":"8714:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8770:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8781:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8766:3:111"},"nodeType":"YulFunctionCall","src":"8766:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8790:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8740:25:111"},"nodeType":"YulFunctionCall","src":"8740:58:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"8718:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"8728:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8807:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"8817:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8807:6:111"}]},{"nodeType":"YulAssignment","src":"8834:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"8844:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8834:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8861:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8902:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8887:3:111"},"nodeType":"YulFunctionCall","src":"8887:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8874:12:111"},"nodeType":"YulFunctionCall","src":"8874:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8865:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8940:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8915:24:111"},"nodeType":"YulFunctionCall","src":"8915:31:111"},"nodeType":"YulExpressionStatement","src":"8915:31:111"},{"nodeType":"YulAssignment","src":"8955:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8965:5:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8955:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8979:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9012:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9023:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9008:3:111"},"nodeType":"YulFunctionCall","src":"9008:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8995:12:111"},"nodeType":"YulFunctionCall","src":"8995:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"8983:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9056:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9065:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9068:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9058:6:111"},"nodeType":"YulFunctionCall","src":"9058:12:111"},"nodeType":"YulExpressionStatement","src":"9058:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"9042:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9052:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9039:2:111"},"nodeType":"YulFunctionCall","src":"9039:16:111"},"nodeType":"YulIf","src":"9036:36:111"},{"nodeType":"YulVariableDeclaration","src":"9081:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9137:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"9148:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9133:3:111"},"nodeType":"YulFunctionCall","src":"9133:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9159:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9107:25:111"},"nodeType":"YulFunctionCall","src":"9107:60:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"9085:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"9095:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9176:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9186:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9176:6:111"}]},{"nodeType":"YulAssignment","src":"9203:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9213:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9203:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptrt_addresst_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8451:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8462:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8474:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8482:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8490:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8498:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8506:6:111","type":""}],"src":"8375:852:111"},{"body":{"nodeType":"YulBlock","src":"9321:320:111","statements":[{"body":{"nodeType":"YulBlock","src":"9367:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9376:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9379:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9369:6:111"},"nodeType":"YulFunctionCall","src":"9369:12:111"},"nodeType":"YulExpressionStatement","src":"9369:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9342:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9351:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9338:3:111"},"nodeType":"YulFunctionCall","src":"9338:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9363:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9334:3:111"},"nodeType":"YulFunctionCall","src":"9334:32:111"},"nodeType":"YulIf","src":"9331:52:111"},{"nodeType":"YulVariableDeclaration","src":"9392:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9419:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9406:12:111"},"nodeType":"YulFunctionCall","src":"9406:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9396:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9472:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9481:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9484:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9474:6:111"},"nodeType":"YulFunctionCall","src":"9474:12:111"},"nodeType":"YulExpressionStatement","src":"9474:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9444:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9452:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9441:2:111"},"nodeType":"YulFunctionCall","src":"9441:30:111"},"nodeType":"YulIf","src":"9438:50:111"},{"nodeType":"YulVariableDeclaration","src":"9497:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9553:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9564:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9549:3:111"},"nodeType":"YulFunctionCall","src":"9549:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9573:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9523:25:111"},"nodeType":"YulFunctionCall","src":"9523:58:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"9501:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"9511:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9590:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"9600:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9590:6:111"}]},{"nodeType":"YulAssignment","src":"9617:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"9627:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9617:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9279:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9290:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9302:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9310:6:111","type":""}],"src":"9232:409:111"},{"body":{"nodeType":"YulBlock","src":"9722:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"9762:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9771:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9774:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9764:6:111"},"nodeType":"YulFunctionCall","src":"9764:12:111"},"nodeType":"YulExpressionStatement","src":"9764:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"9743:3:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9748:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9739:3:111"},"nodeType":"YulFunctionCall","src":"9739:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"9757:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9735:3:111"},"nodeType":"YulFunctionCall","src":"9735:26:111"},"nodeType":"YulIf","src":"9732:46:111"},{"nodeType":"YulAssignment","src":"9787:15:111","value":{"name":"offset","nodeType":"YulIdentifier","src":"9796:6:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"9787:5:111"}]}]},"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"9696:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"9704:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"9712:5:111","type":""}],"src":"9646:162:111"},{"body":{"nodeType":"YulBlock","src":"9917:265:111","statements":[{"body":{"nodeType":"YulBlock","src":"9963:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9972:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9975:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9965:6:111"},"nodeType":"YulFunctionCall","src":"9965:12:111"},"nodeType":"YulExpressionStatement","src":"9965:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9938:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9947:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9934:3:111"},"nodeType":"YulFunctionCall","src":"9934:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9959:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9930:3:111"},"nodeType":"YulFunctionCall","src":"9930:32:111"},"nodeType":"YulIf","src":"9927:52:111"},{"nodeType":"YulVariableDeclaration","src":"9988:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10015:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10002:12:111"},"nodeType":"YulFunctionCall","src":"10002:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9992:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10068:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10077:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10080:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10070:6:111"},"nodeType":"YulFunctionCall","src":"10070:12:111"},"nodeType":"YulExpressionStatement","src":"10070:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"10040:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10048:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10037:2:111"},"nodeType":"YulFunctionCall","src":"10037:30:111"},"nodeType":"YulIf","src":"10034:50:111"},{"nodeType":"YulAssignment","src":"10093:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10148:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"10159:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10144:3:111"},"nodeType":"YulFunctionCall","src":"10144:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10168:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"10103:40:111"},"nodeType":"YulFunctionCall","src":"10103:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10093:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9883:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9894:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9906:6:111","type":""}],"src":"9813:369:111"},{"body":{"nodeType":"YulBlock","src":"10288:76:111","statements":[{"nodeType":"YulAssignment","src":"10298:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10310:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10321:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10306:3:111"},"nodeType":"YulFunctionCall","src":"10306:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10298:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10340:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"10351:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10333:6:111"},"nodeType":"YulFunctionCall","src":"10333:25:111"},"nodeType":"YulExpressionStatement","src":"10333:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10257:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10268:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10279:4:111","type":""}],"src":"10187:177:111"},{"body":{"nodeType":"YulBlock","src":"10447:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"10493:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10502:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10505:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10495:6:111"},"nodeType":"YulFunctionCall","src":"10495:12:111"},"nodeType":"YulExpressionStatement","src":"10495:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10468:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10477:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10464:3:111"},"nodeType":"YulFunctionCall","src":"10464:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10489:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10460:3:111"},"nodeType":"YulFunctionCall","src":"10460:32:111"},"nodeType":"YulIf","src":"10457:52:111"},{"nodeType":"YulVariableDeclaration","src":"10518:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10544:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10531:12:111"},"nodeType":"YulFunctionCall","src":"10531:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"10522:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10588:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10563:24:111"},"nodeType":"YulFunctionCall","src":"10563:31:111"},"nodeType":"YulExpressionStatement","src":"10563:31:111"},{"nodeType":"YulAssignment","src":"10603:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10613:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10603:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10413:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10424:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10436:6:111","type":""}],"src":"10369:255:111"},{"body":{"nodeType":"YulBlock","src":"10786:655:111","statements":[{"body":{"nodeType":"YulBlock","src":"10832:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10841:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10844:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10834:6:111"},"nodeType":"YulFunctionCall","src":"10834:12:111"},"nodeType":"YulExpressionStatement","src":"10834:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10807:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10816:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10803:3:111"},"nodeType":"YulFunctionCall","src":"10803:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10828:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10799:3:111"},"nodeType":"YulFunctionCall","src":"10799:32:111"},"nodeType":"YulIf","src":"10796:52:111"},{"nodeType":"YulVariableDeclaration","src":"10857:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10884:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10871:12:111"},"nodeType":"YulFunctionCall","src":"10871:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"10861:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10903:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10913:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"10907:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10958:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10967:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10970:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10960:6:111"},"nodeType":"YulFunctionCall","src":"10960:12:111"},"nodeType":"YulExpressionStatement","src":"10960:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"10946:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10954:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10943:2:111"},"nodeType":"YulFunctionCall","src":"10943:14:111"},"nodeType":"YulIf","src":"10940:34:111"},{"nodeType":"YulAssignment","src":"10983:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11038:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11049:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11034:3:111"},"nodeType":"YulFunctionCall","src":"11034:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11058:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"10993:40:111"},"nodeType":"YulFunctionCall","src":"10993:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10983:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11075:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11105:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11116:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11101:3:111"},"nodeType":"YulFunctionCall","src":"11101:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11088:12:111"},"nodeType":"YulFunctionCall","src":"11088:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"11079:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11154:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"11129:24:111"},"nodeType":"YulFunctionCall","src":"11129:31:111"},"nodeType":"YulExpressionStatement","src":"11129:31:111"},{"nodeType":"YulAssignment","src":"11169:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"11179:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"11169:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11193:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11226:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11237:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11222:3:111"},"nodeType":"YulFunctionCall","src":"11222:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11209:12:111"},"nodeType":"YulFunctionCall","src":"11209:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"11197:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11270:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11279:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11282:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11272:6:111"},"nodeType":"YulFunctionCall","src":"11272:12:111"},"nodeType":"YulExpressionStatement","src":"11272:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"11256:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11266:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11253:2:111"},"nodeType":"YulFunctionCall","src":"11253:16:111"},"nodeType":"YulIf","src":"11250:36:111"},{"nodeType":"YulVariableDeclaration","src":"11295:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11351:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"11362:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11347:3:111"},"nodeType":"YulFunctionCall","src":"11347:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11373:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"11321:25:111"},"nodeType":"YulFunctionCall","src":"11321:60:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"11299:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"11309:8:111","type":""}]},{"nodeType":"YulAssignment","src":"11390:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"11400:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"11390:6:111"}]},{"nodeType":"YulAssignment","src":"11417:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"11427:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"11417:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_addresst_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10728:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10739:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10751:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10759:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10767:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"10775:6:111","type":""}],"src":"10629:812:111"},{"body":{"nodeType":"YulBlock","src":"11649:371:111","statements":[{"nodeType":"YulAssignment","src":"11659:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11671:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11682:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11667:3:111"},"nodeType":"YulFunctionCall","src":"11667:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11659:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"11695:40:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11705:30:111","type":"","value":"0xffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11699:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11751:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11766:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11774:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11762:3:111"},"nodeType":"YulFunctionCall","src":"11762:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11744:6:111"},"nodeType":"YulFunctionCall","src":"11744:34:111"},"nodeType":"YulExpressionStatement","src":"11744:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11809:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11794:3:111"},"nodeType":"YulFunctionCall","src":"11794:18:111"},{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11828:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11821:6:111"},"nodeType":"YulFunctionCall","src":"11821:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11814:6:111"},"nodeType":"YulFunctionCall","src":"11814:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11787:6:111"},"nodeType":"YulFunctionCall","src":"11787:50:111"},"nodeType":"YulExpressionStatement","src":"11787:50:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11857:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11868:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11853:3:111"},"nodeType":"YulFunctionCall","src":"11853:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"11877:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11885:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11873:3:111"},"nodeType":"YulFunctionCall","src":"11873:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11846:6:111"},"nodeType":"YulFunctionCall","src":"11846:43:111"},"nodeType":"YulExpressionStatement","src":"11846:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11909:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11920:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11905:3:111"},"nodeType":"YulFunctionCall","src":"11905:18:111"},{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"11929:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11937:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11925:3:111"},"nodeType":"YulFunctionCall","src":"11925:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11898:6:111"},"nodeType":"YulFunctionCall","src":"11898:51:111"},"nodeType":"YulExpressionStatement","src":"11898:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11969:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11980:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11965:3:111"},"nodeType":"YulFunctionCall","src":"11965:19:111"},{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"11990:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11998:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11986:3:111"},"nodeType":"YulFunctionCall","src":"11986:27:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11958:6:111"},"nodeType":"YulFunctionCall","src":"11958:56:111"},"nodeType":"YulExpressionStatement","src":"11958:56:111"}]},"name":"abi_encode_tuple_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__to_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11586:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"11597:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11605:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11613:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11621:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11629:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11640:4:111","type":""}],"src":"11446:574:111"},{"body":{"nodeType":"YulBlock","src":"12126:113:111","statements":[{"nodeType":"YulAssignment","src":"12136:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12148:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12159:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12144:3:111"},"nodeType":"YulFunctionCall","src":"12144:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12136:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12178:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12193:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12201:30:111","type":"","value":"0xffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12189:3:111"},"nodeType":"YulFunctionCall","src":"12189:43:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12171:6:111"},"nodeType":"YulFunctionCall","src":"12171:62:111"},"nodeType":"YulExpressionStatement","src":"12171:62:111"}]},"name":"abi_encode_tuple_t_uint112__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12095:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12106:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12117:4:111","type":""}],"src":"12025:214:111"},{"body":{"nodeType":"YulBlock","src":"12418:176:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12435:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12446:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12428:6:111"},"nodeType":"YulFunctionCall","src":"12428:21:111"},"nodeType":"YulExpressionStatement","src":"12428:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12469:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12480:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12465:3:111"},"nodeType":"YulFunctionCall","src":"12465:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12485:2:111","type":"","value":"26"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12458:6:111"},"nodeType":"YulFunctionCall","src":"12458:30:111"},"nodeType":"YulExpressionStatement","src":"12458:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12508:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12519:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12504:3:111"},"nodeType":"YulFunctionCall","src":"12504:18:111"},{"hexValue":"6d757374207370656369667920756e7374616b652064656c6179","kind":"string","nodeType":"YulLiteral","src":"12524:28:111","type":"","value":"must specify unstake delay"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12497:6:111"},"nodeType":"YulFunctionCall","src":"12497:56:111"},"nodeType":"YulExpressionStatement","src":"12497:56:111"},{"nodeType":"YulAssignment","src":"12562:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12574:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12585:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12570:3:111"},"nodeType":"YulFunctionCall","src":"12570:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12562:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12395:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12409:4:111","type":""}],"src":"12244:350:111"},{"body":{"nodeType":"YulBlock","src":"12773:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12790:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12801:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12783:6:111"},"nodeType":"YulFunctionCall","src":"12783:21:111"},"nodeType":"YulExpressionStatement","src":"12783:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12824:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12835:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12820:3:111"},"nodeType":"YulFunctionCall","src":"12820:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12840:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12813:6:111"},"nodeType":"YulFunctionCall","src":"12813:30:111"},"nodeType":"YulExpressionStatement","src":"12813:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12874:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12859:3:111"},"nodeType":"YulFunctionCall","src":"12859:18:111"},{"hexValue":"63616e6e6f7420646563726561736520756e7374616b652074696d65","kind":"string","nodeType":"YulLiteral","src":"12879:30:111","type":"","value":"cannot decrease unstake time"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12852:6:111"},"nodeType":"YulFunctionCall","src":"12852:58:111"},"nodeType":"YulExpressionStatement","src":"12852:58:111"},{"nodeType":"YulAssignment","src":"12919:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12942:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12927:3:111"},"nodeType":"YulFunctionCall","src":"12927:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12919:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12750:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12764:4:111","type":""}],"src":"12599:352:111"},{"body":{"nodeType":"YulBlock","src":"12988:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13005:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13008:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12998:6:111"},"nodeType":"YulFunctionCall","src":"12998:88:111"},"nodeType":"YulExpressionStatement","src":"12998:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13102:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13105:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13095:6:111"},"nodeType":"YulFunctionCall","src":"13095:15:111"},"nodeType":"YulExpressionStatement","src":"13095:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13126:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13129:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13119:6:111"},"nodeType":"YulFunctionCall","src":"13119:15:111"},"nodeType":"YulExpressionStatement","src":"13119:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"12956:184:111"},{"body":{"nodeType":"YulBlock","src":"13193:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"13220:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13222:16:111"},"nodeType":"YulFunctionCall","src":"13222:18:111"},"nodeType":"YulExpressionStatement","src":"13222:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"13209:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"13216:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"13212:3:111"},"nodeType":"YulFunctionCall","src":"13212:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13206:2:111"},"nodeType":"YulFunctionCall","src":"13206:13:111"},"nodeType":"YulIf","src":"13203:39:111"},{"nodeType":"YulAssignment","src":"13251:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"13262:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"13265:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13258:3:111"},"nodeType":"YulFunctionCall","src":"13258:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"13251:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"13176:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"13179:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"13185:3:111","type":""}],"src":"13145:128:111"},{"body":{"nodeType":"YulBlock","src":"13452:168:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13469:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13480:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13462:6:111"},"nodeType":"YulFunctionCall","src":"13462:21:111"},"nodeType":"YulExpressionStatement","src":"13462:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13503:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13514:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13499:3:111"},"nodeType":"YulFunctionCall","src":"13499:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13519:2:111","type":"","value":"18"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13492:6:111"},"nodeType":"YulFunctionCall","src":"13492:30:111"},"nodeType":"YulExpressionStatement","src":"13492:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13542:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13553:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13538:3:111"},"nodeType":"YulFunctionCall","src":"13538:18:111"},{"hexValue":"6e6f207374616b6520737065636966696564","kind":"string","nodeType":"YulLiteral","src":"13558:20:111","type":"","value":"no stake specified"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13531:6:111"},"nodeType":"YulFunctionCall","src":"13531:48:111"},"nodeType":"YulExpressionStatement","src":"13531:48:111"},{"nodeType":"YulAssignment","src":"13588:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13611:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13596:3:111"},"nodeType":"YulFunctionCall","src":"13596:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13588:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13429:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13443:4:111","type":""}],"src":"13278:342:111"},{"body":{"nodeType":"YulBlock","src":"13799:164:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13816:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13827:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13809:6:111"},"nodeType":"YulFunctionCall","src":"13809:21:111"},"nodeType":"YulExpressionStatement","src":"13809:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13850:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13861:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13846:3:111"},"nodeType":"YulFunctionCall","src":"13846:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13866:2:111","type":"","value":"14"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13839:6:111"},"nodeType":"YulFunctionCall","src":"13839:30:111"},"nodeType":"YulExpressionStatement","src":"13839:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13889:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13900:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13885:3:111"},"nodeType":"YulFunctionCall","src":"13885:18:111"},{"hexValue":"7374616b65206f766572666c6f77","kind":"string","nodeType":"YulLiteral","src":"13905:16:111","type":"","value":"stake overflow"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13878:6:111"},"nodeType":"YulFunctionCall","src":"13878:44:111"},"nodeType":"YulExpressionStatement","src":"13878:44:111"},{"nodeType":"YulAssignment","src":"13931:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13954:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13939:3:111"},"nodeType":"YulFunctionCall","src":"13939:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13931:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13776:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13790:4:111","type":""}],"src":"13625:338:111"},{"body":{"nodeType":"YulBlock","src":"14096:136:111","statements":[{"nodeType":"YulAssignment","src":"14106:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14118:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14129:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14114:3:111"},"nodeType":"YulFunctionCall","src":"14114:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14106:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14148:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"14159:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14141:6:111"},"nodeType":"YulFunctionCall","src":"14141:25:111"},"nodeType":"YulExpressionStatement","src":"14141:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14186:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14197:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14182:3:111"},"nodeType":"YulFunctionCall","src":"14182:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"14206:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14214:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14202:3:111"},"nodeType":"YulFunctionCall","src":"14202:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14175:6:111"},"nodeType":"YulFunctionCall","src":"14175:51:111"},"nodeType":"YulExpressionStatement","src":"14175:51:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint32__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14057:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14068:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14076:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14087:4:111","type":""}],"src":"13968:264:111"},{"body":{"nodeType":"YulBlock","src":"14284:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"14375:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14377:16:111"},"nodeType":"YulFunctionCall","src":"14377:18:111"},"nodeType":"YulExpressionStatement","src":"14377:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14300:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"14307:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"14297:2:111"},"nodeType":"YulFunctionCall","src":"14297:77:111"},"nodeType":"YulIf","src":"14294:103:111"},{"nodeType":"YulAssignment","src":"14406:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14417:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"14424:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14413:3:111"},"nodeType":"YulFunctionCall","src":"14413:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"14406:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"14266:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"14276:3:111","type":""}],"src":"14237:195:111"},{"body":{"nodeType":"YulBlock","src":"14611:173:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14628:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14639:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14621:6:111"},"nodeType":"YulFunctionCall","src":"14621:21:111"},"nodeType":"YulExpressionStatement","src":"14621:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14662:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14673:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14658:3:111"},"nodeType":"YulFunctionCall","src":"14658:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14678:2:111","type":"","value":"23"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14651:6:111"},"nodeType":"YulFunctionCall","src":"14651:30:111"},"nodeType":"YulExpressionStatement","src":"14651:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14701:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14712:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14697:3:111"},"nodeType":"YulFunctionCall","src":"14697:18:111"},{"hexValue":"4141393220696e7465726e616c2063616c6c206f6e6c79","kind":"string","nodeType":"YulLiteral","src":"14717:25:111","type":"","value":"AA92 internal call only"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14690:6:111"},"nodeType":"YulFunctionCall","src":"14690:53:111"},"nodeType":"YulExpressionStatement","src":"14690:53:111"},{"nodeType":"YulAssignment","src":"14752:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14764:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14775:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14760:3:111"},"nodeType":"YulFunctionCall","src":"14760:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14752:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14588:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14602:4:111","type":""}],"src":"14437:347:111"},{"body":{"nodeType":"YulBlock","src":"14842:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"14852:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"14861:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"14856:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"14921:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"14946:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"14951:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14942:3:111"},"nodeType":"YulFunctionCall","src":"14942:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"14965:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"14970:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14961:3:111"},"nodeType":"YulFunctionCall","src":"14961:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14955:5:111"},"nodeType":"YulFunctionCall","src":"14955:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14935:6:111"},"nodeType":"YulFunctionCall","src":"14935:39:111"},"nodeType":"YulExpressionStatement","src":"14935:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"14882:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"14885:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14879:2:111"},"nodeType":"YulFunctionCall","src":"14879:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"14893:19:111","statements":[{"nodeType":"YulAssignment","src":"14895:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"14904:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"14907:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14900:3:111"},"nodeType":"YulFunctionCall","src":"14900:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"14895:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"14875:3:111","statements":[]},"src":"14871:113:111"},{"body":{"nodeType":"YulBlock","src":"15010:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"15023:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15028:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15019:3:111"},"nodeType":"YulFunctionCall","src":"15019:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"15037:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15012:6:111"},"nodeType":"YulFunctionCall","src":"15012:27:111"},"nodeType":"YulExpressionStatement","src":"15012:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"14999:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"15002:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14996:2:111"},"nodeType":"YulFunctionCall","src":"14996:13:111"},"nodeType":"YulIf","src":"14993:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"14820:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"14825:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"14830:6:111","type":""}],"src":"14789:258:111"},{"body":{"nodeType":"YulBlock","src":"15101:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15111:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15131:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15125:5:111"},"nodeType":"YulFunctionCall","src":"15125:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15115:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15153:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15158:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15146:6:111"},"nodeType":"YulFunctionCall","src":"15146:19:111"},"nodeType":"YulExpressionStatement","src":"15146:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15200:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"15207:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15196:3:111"},"nodeType":"YulFunctionCall","src":"15196:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15218:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"15223:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15214:3:111"},"nodeType":"YulFunctionCall","src":"15214:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"15230:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"15174:21:111"},"nodeType":"YulFunctionCall","src":"15174:63:111"},"nodeType":"YulExpressionStatement","src":"15174:63:111"},{"nodeType":"YulAssignment","src":"15246:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15261:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"15274:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15282:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15270:3:111"},"nodeType":"YulFunctionCall","src":"15270:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"15287:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15266:3:111"},"nodeType":"YulFunctionCall","src":"15266:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15257:3:111"},"nodeType":"YulFunctionCall","src":"15257:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"15357:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15253:3:111"},"nodeType":"YulFunctionCall","src":"15253:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"15246:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"15078:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"15085:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"15093:3:111","type":""}],"src":"15052:316:111"},{"body":{"nodeType":"YulBlock","src":"15520:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15537:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"15548:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15530:6:111"},"nodeType":"YulFunctionCall","src":"15530:25:111"},"nodeType":"YulExpressionStatement","src":"15530:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15575:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15586:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15571:3:111"},"nodeType":"YulFunctionCall","src":"15571:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15591:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15564:6:111"},"nodeType":"YulFunctionCall","src":"15564:30:111"},"nodeType":"YulExpressionStatement","src":"15564:30:111"},{"nodeType":"YulAssignment","src":"15603:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15628:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15640:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15651:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15636:3:111"},"nodeType":"YulFunctionCall","src":"15636:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"15611:16:111"},"nodeType":"YulFunctionCall","src":"15611:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15603:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15481:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15492:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15500:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15511:4:111","type":""}],"src":"15373:288:111"},{"body":{"nodeType":"YulBlock","src":"15698:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15715:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15718:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15708:6:111"},"nodeType":"YulFunctionCall","src":"15708:88:111"},"nodeType":"YulExpressionStatement","src":"15708:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15812:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"15815:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15805:6:111"},"nodeType":"YulFunctionCall","src":"15805:15:111"},"nodeType":"YulExpressionStatement","src":"15805:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15836:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15839:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15829:6:111"},"nodeType":"YulFunctionCall","src":"15829:15:111"},"nodeType":"YulExpressionStatement","src":"15829:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"15666:184:111"},{"body":{"nodeType":"YulBlock","src":"15964:281:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15974:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"16013:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16000:12:111"},"nodeType":"YulFunctionCall","src":"16000:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"15978:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16173:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16182:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16185:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16175:6:111"},"nodeType":"YulFunctionCall","src":"16175:12:111"},"nodeType":"YulExpressionStatement","src":"16175:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"16048:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16076:12:111"},"nodeType":"YulFunctionCall","src":"16076:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"16092:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16072:3:111"},"nodeType":"YulFunctionCall","src":"16072:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"16103:66:111","type":"","value":"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16068:3:111"},"nodeType":"YulFunctionCall","src":"16068:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"16044:3:111"},"nodeType":"YulFunctionCall","src":"16044:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16037:6:111"},"nodeType":"YulFunctionCall","src":"16037:135:111"},"nodeType":"YulIf","src":"16034:155:111"},{"nodeType":"YulAssignment","src":"16198:41:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"16210:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"16220:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16206:3:111"},"nodeType":"YulFunctionCall","src":"16206:33:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"16198:4:111"}]}]},"name":"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"15929:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"15939:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"15955:4:111","type":""}],"src":"15855:390:111"},{"body":{"nodeType":"YulBlock","src":"16424:175:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16441:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16452:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16434:6:111"},"nodeType":"YulFunctionCall","src":"16434:21:111"},"nodeType":"YulExpressionStatement","src":"16434:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16475:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16486:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16471:3:111"},"nodeType":"YulFunctionCall","src":"16471:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16491:2:111","type":"","value":"25"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16464:6:111"},"nodeType":"YulFunctionCall","src":"16464:30:111"},"nodeType":"YulExpressionStatement","src":"16464:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16525:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16510:3:111"},"nodeType":"YulFunctionCall","src":"16510:18:111"},{"hexValue":"576974686472617720616d6f756e7420746f6f206c61726765","kind":"string","nodeType":"YulLiteral","src":"16530:27:111","type":"","value":"Withdraw amount too large"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16503:6:111"},"nodeType":"YulFunctionCall","src":"16503:55:111"},"nodeType":"YulExpressionStatement","src":"16503:55:111"},{"nodeType":"YulAssignment","src":"16567:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16579:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16590:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16575:3:111"},"nodeType":"YulFunctionCall","src":"16575:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16567:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16401:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16415:4:111","type":""}],"src":"16250:349:111"},{"body":{"nodeType":"YulBlock","src":"16653:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"16675:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"16677:16:111"},"nodeType":"YulFunctionCall","src":"16677:18:111"},"nodeType":"YulExpressionStatement","src":"16677:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"16669:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"16672:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16666:2:111"},"nodeType":"YulFunctionCall","src":"16666:8:111"},"nodeType":"YulIf","src":"16663:34:111"},{"nodeType":"YulAssignment","src":"16706:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"16718:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"16721:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16714:3:111"},"nodeType":"YulFunctionCall","src":"16714:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"16706:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"16635:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"16638:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"16644:4:111","type":""}],"src":"16604:125:111"},{"body":{"nodeType":"YulBlock","src":"16871:168:111","statements":[{"nodeType":"YulAssignment","src":"16881:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16893:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16904:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16889:3:111"},"nodeType":"YulFunctionCall","src":"16889:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16881:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16923:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16938:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16946:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16934:3:111"},"nodeType":"YulFunctionCall","src":"16934:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16916:6:111"},"nodeType":"YulFunctionCall","src":"16916:74:111"},"nodeType":"YulExpressionStatement","src":"16916:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17010:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17021:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17006:3:111"},"nodeType":"YulFunctionCall","src":"17006:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"17026:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16999:6:111"},"nodeType":"YulFunctionCall","src":"16999:34:111"},"nodeType":"YulExpressionStatement","src":"16999:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16832:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"16843:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16851:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16862:4:111","type":""}],"src":"16734:305:111"},{"body":{"nodeType":"YulBlock","src":"17235:14:111","statements":[{"nodeType":"YulAssignment","src":"17237:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"17244:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17237:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17219:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17227:3:111","type":""}],"src":"17044:205:111"},{"body":{"nodeType":"YulBlock","src":"17428:168:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17445:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17456:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17438:6:111"},"nodeType":"YulFunctionCall","src":"17438:21:111"},"nodeType":"YulExpressionStatement","src":"17438:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17479:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17490:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17475:3:111"},"nodeType":"YulFunctionCall","src":"17475:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17495:2:111","type":"","value":"18"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17468:6:111"},"nodeType":"YulFunctionCall","src":"17468:30:111"},"nodeType":"YulExpressionStatement","src":"17468:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17518:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17529:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17514:3:111"},"nodeType":"YulFunctionCall","src":"17514:18:111"},{"hexValue":"6661696c656420746f207769746864726177","kind":"string","nodeType":"YulLiteral","src":"17534:20:111","type":"","value":"failed to withdraw"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17507:6:111"},"nodeType":"YulFunctionCall","src":"17507:48:111"},"nodeType":"YulExpressionStatement","src":"17507:48:111"},{"nodeType":"YulAssignment","src":"17564:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17587:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17572:3:111"},"nodeType":"YulFunctionCall","src":"17572:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17564:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17405:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17419:4:111","type":""}],"src":"17254:342:111"},{"body":{"nodeType":"YulBlock","src":"17717:281:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17727:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"17766:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17753:12:111"},"nodeType":"YulFunctionCall","src":"17753:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"17731:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"17926:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17935:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17938:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17928:6:111"},"nodeType":"YulFunctionCall","src":"17928:12:111"},"nodeType":"YulExpressionStatement","src":"17928:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"17801:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"17829:12:111"},"nodeType":"YulFunctionCall","src":"17829:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"17845:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17825:3:111"},"nodeType":"YulFunctionCall","src":"17825:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"17856:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17821:3:111"},"nodeType":"YulFunctionCall","src":"17821:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17797:3:111"},"nodeType":"YulFunctionCall","src":"17797:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17790:6:111"},"nodeType":"YulFunctionCall","src":"17790:135:111"},"nodeType":"YulIf","src":"17787:155:111"},{"nodeType":"YulAssignment","src":"17951:41:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"17963:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"17973:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17959:3:111"},"nodeType":"YulFunctionCall","src":"17959:33:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"17951:4:111"}]}]},"name":"access_calldata_tail_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"17682:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"17692:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"17708:4:111","type":""}],"src":"17601:397:111"},{"body":{"nodeType":"YulBlock","src":"18147:494:111","statements":[{"nodeType":"YulVariableDeclaration","src":"18157:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"18196:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"18183:12:111"},"nodeType":"YulFunctionCall","src":"18183:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"18161:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18356:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18365:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18368:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18358:6:111"},"nodeType":"YulFunctionCall","src":"18358:12:111"},"nodeType":"YulExpressionStatement","src":"18358:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"18231:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"18259:12:111"},"nodeType":"YulFunctionCall","src":"18259:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"18275:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18255:3:111"},"nodeType":"YulFunctionCall","src":"18255:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"18286:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18251:3:111"},"nodeType":"YulFunctionCall","src":"18251:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18227:3:111"},"nodeType":"YulFunctionCall","src":"18227:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18220:6:111"},"nodeType":"YulFunctionCall","src":"18220:135:111"},"nodeType":"YulIf","src":"18217:155:111"},{"nodeType":"YulVariableDeclaration","src":"18381:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"18399:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"18409:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18395:3:111"},"nodeType":"YulFunctionCall","src":"18395:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"18385:6:111","type":""}]},{"nodeType":"YulAssignment","src":"18437:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"18460:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"18447:12:111"},"nodeType":"YulFunctionCall","src":"18447:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"18437:6:111"}]},{"body":{"nodeType":"YulBlock","src":"18510:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18519:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18522:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18512:6:111"},"nodeType":"YulFunctionCall","src":"18512:12:111"},"nodeType":"YulExpressionStatement","src":"18512:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"18482:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18490:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18479:2:111"},"nodeType":"YulFunctionCall","src":"18479:30:111"},"nodeType":"YulIf","src":"18476:50:111"},{"nodeType":"YulAssignment","src":"18535:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"18547:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18555:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18543:3:111"},"nodeType":"YulFunctionCall","src":"18543:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"18535:4:111"}]},{"body":{"nodeType":"YulBlock","src":"18619:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18628:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18631:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18621:6:111"},"nodeType":"YulFunctionCall","src":"18621:12:111"},"nodeType":"YulExpressionStatement","src":"18621:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"18576:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"18586:12:111"},"nodeType":"YulFunctionCall","src":"18586:14:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18606:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"18609:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"18602:3:111"},"nodeType":"YulFunctionCall","src":"18602:14:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18582:3:111"},"nodeType":"YulFunctionCall","src":"18582:35:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"18572:3:111"},"nodeType":"YulFunctionCall","src":"18572:46:111"},"nodeType":"YulIf","src":"18569:66:111"}]},"name":"access_calldata_tail_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"18104:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"18114:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"18130:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"18136:6:111","type":""}],"src":"18003:638:111"},{"body":{"nodeType":"YulBlock","src":"18737:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"18783:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18792:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18795:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18785:6:111"},"nodeType":"YulFunctionCall","src":"18785:12:111"},"nodeType":"YulExpressionStatement","src":"18785:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"18758:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"18767:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18754:3:111"},"nodeType":"YulFunctionCall","src":"18754:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"18779:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18750:3:111"},"nodeType":"YulFunctionCall","src":"18750:32:111"},"nodeType":"YulIf","src":"18747:52:111"},{"nodeType":"YulVariableDeclaration","src":"18808:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18834:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"18821:12:111"},"nodeType":"YulFunctionCall","src":"18821:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"18812:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18878:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"18853:24:111"},"nodeType":"YulFunctionCall","src":"18853:31:111"},"nodeType":"YulExpressionStatement","src":"18853:31:111"},{"nodeType":"YulAssignment","src":"18893:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"18903:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18893:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IAggregator_$10603","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18703:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"18714:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"18726:6:111","type":""}],"src":"18646:268:111"},{"body":{"nodeType":"YulBlock","src":"19093:173:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19110:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19121:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19103:6:111"},"nodeType":"YulFunctionCall","src":"19103:21:111"},"nodeType":"YulExpressionStatement","src":"19103:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19140:3:111"},"nodeType":"YulFunctionCall","src":"19140:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19160:2:111","type":"","value":"23"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19133:6:111"},"nodeType":"YulFunctionCall","src":"19133:30:111"},"nodeType":"YulExpressionStatement","src":"19133:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19183:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19194:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19179:3:111"},"nodeType":"YulFunctionCall","src":"19179:18:111"},{"hexValue":"4141393620696e76616c69642061676772656761746f72","kind":"string","nodeType":"YulLiteral","src":"19199:25:111","type":"","value":"AA96 invalid aggregator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19172:6:111"},"nodeType":"YulFunctionCall","src":"19172:53:111"},"nodeType":"YulExpressionStatement","src":"19172:53:111"},{"nodeType":"YulAssignment","src":"19234:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19257:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19242:3:111"},"nodeType":"YulFunctionCall","src":"19242:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19234:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19070:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19084:4:111","type":""}],"src":"18919:347:111"},{"body":{"nodeType":"YulBlock","src":"19365:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"19375:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"19414:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"19401:12:111"},"nodeType":"YulFunctionCall","src":"19401:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"19379:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19574:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19583:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19586:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19576:6:111"},"nodeType":"YulFunctionCall","src":"19576:12:111"},"nodeType":"YulExpressionStatement","src":"19576:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"19449:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"19477:12:111"},"nodeType":"YulFunctionCall","src":"19477:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"19493:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19473:3:111"},"nodeType":"YulFunctionCall","src":"19473:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"19504:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19469:3:111"},"nodeType":"YulFunctionCall","src":"19469:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"19445:3:111"},"nodeType":"YulFunctionCall","src":"19445:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19438:6:111"},"nodeType":"YulFunctionCall","src":"19438:135:111"},"nodeType":"YulIf","src":"19435:155:111"},{"nodeType":"YulVariableDeclaration","src":"19599:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"19617:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"19627:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19613:3:111"},"nodeType":"YulFunctionCall","src":"19613:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"19603:6:111","type":""}]},{"nodeType":"YulAssignment","src":"19655:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"19678:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"19665:12:111"},"nodeType":"YulFunctionCall","src":"19665:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"19655:6:111"}]},{"body":{"nodeType":"YulBlock","src":"19728:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19737:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19740:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19730:6:111"},"nodeType":"YulFunctionCall","src":"19730:12:111"},"nodeType":"YulExpressionStatement","src":"19730:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"19700:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19708:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19697:2:111"},"nodeType":"YulFunctionCall","src":"19697:30:111"},"nodeType":"YulIf","src":"19694:50:111"},{"nodeType":"YulAssignment","src":"19753:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"19765:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19773:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19761:3:111"},"nodeType":"YulFunctionCall","src":"19761:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"19753:4:111"}]},{"body":{"nodeType":"YulBlock","src":"19829:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19838:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19841:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19831:6:111"},"nodeType":"YulFunctionCall","src":"19831:12:111"},"nodeType":"YulExpressionStatement","src":"19831:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"19794:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"19804:12:111"},"nodeType":"YulFunctionCall","src":"19804:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"19820:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19800:3:111"},"nodeType":"YulFunctionCall","src":"19800:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"19790:3:111"},"nodeType":"YulFunctionCall","src":"19790:38:111"},"nodeType":"YulIf","src":"19787:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"19322:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"19332:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"19348:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"19354:6:111","type":""}],"src":"19271:580:111"},{"body":{"nodeType":"YulBlock","src":"19900:83:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19917:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19926:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"19933:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19922:3:111"},"nodeType":"YulFunctionCall","src":"19922:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19910:6:111"},"nodeType":"YulFunctionCall","src":"19910:67:111"},"nodeType":"YulExpressionStatement","src":"19910:67:111"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"19884:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"19891:3:111","type":""}],"src":"19856:127:111"},{"body":{"nodeType":"YulBlock","src":"20064:483:111","statements":[{"nodeType":"YulVariableDeclaration","src":"20074:43:111","value":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"20113:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"20100:12:111"},"nodeType":"YulFunctionCall","src":"20100:17:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"20078:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"20265:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20274:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20277:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20267:6:111"},"nodeType":"YulFunctionCall","src":"20267:12:111"},"nodeType":"YulExpressionStatement","src":"20267:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"20140:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"20168:12:111"},"nodeType":"YulFunctionCall","src":"20168:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"20184:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"20164:3:111"},"nodeType":"YulFunctionCall","src":"20164:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"20195:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20160:3:111"},"nodeType":"YulFunctionCall","src":"20160:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"20136:3:111"},"nodeType":"YulFunctionCall","src":"20136:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20129:6:111"},"nodeType":"YulFunctionCall","src":"20129:135:111"},"nodeType":"YulIf","src":"20126:155:111"},{"nodeType":"YulVariableDeclaration","src":"20290:48:111","value":{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"20309:18:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"20329:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20305:3:111"},"nodeType":"YulFunctionCall","src":"20305:33:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"20294:7:111","type":""}]},{"nodeType":"YulAssignment","src":"20347:31:111","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"20370:7:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"20357:12:111"},"nodeType":"YulFunctionCall","src":"20357:21:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"20347:6:111"}]},{"nodeType":"YulAssignment","src":"20387:27:111","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"20400:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"20409:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20396:3:111"},"nodeType":"YulFunctionCall","src":"20396:18:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"20387:5:111"}]},{"body":{"nodeType":"YulBlock","src":"20457:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20466:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20469:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20459:6:111"},"nodeType":"YulFunctionCall","src":"20459:12:111"},"nodeType":"YulExpressionStatement","src":"20459:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"20429:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20437:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20426:2:111"},"nodeType":"YulFunctionCall","src":"20426:30:111"},"nodeType":"YulIf","src":"20423:50:111"},{"body":{"nodeType":"YulBlock","src":"20525:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20534:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20537:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20527:6:111"},"nodeType":"YulFunctionCall","src":"20527:12:111"},"nodeType":"YulExpressionStatement","src":"20527:12:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20489:5:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"20500:12:111"},"nodeType":"YulFunctionCall","src":"20500:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"20516:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"20496:3:111"},"nodeType":"YulFunctionCall","src":"20496:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"20485:3:111"},"nodeType":"YulFunctionCall","src":"20485:39:111"},"nodeType":"YulIf","src":"20482:59:111"}]},"name":"calldata_access_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"20028:8:111","type":""},{"name":"ptr","nodeType":"YulTypedName","src":"20038:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"20046:5:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"20053:6:111","type":""}],"src":"19988:559:111"},{"body":{"nodeType":"YulBlock","src":"20618:259:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20635:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20640:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20628:6:111"},"nodeType":"YulFunctionCall","src":"20628:19:111"},"nodeType":"YulExpressionStatement","src":"20628:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20673:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"20678:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20669:3:111"},"nodeType":"YulFunctionCall","src":"20669:14:111"},{"name":"start","nodeType":"YulIdentifier","src":"20685:5:111"},{"name":"length","nodeType":"YulIdentifier","src":"20692:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"20656:12:111"},"nodeType":"YulFunctionCall","src":"20656:43:111"},"nodeType":"YulExpressionStatement","src":"20656:43:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20723:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20728:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20719:3:111"},"nodeType":"YulFunctionCall","src":"20719:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"20737:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20715:3:111"},"nodeType":"YulFunctionCall","src":"20715:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"20744:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20708:6:111"},"nodeType":"YulFunctionCall","src":"20708:38:111"},"nodeType":"YulExpressionStatement","src":"20708:38:111"},{"nodeType":"YulAssignment","src":"20755:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20770:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"20783:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20791:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20779:3:111"},"nodeType":"YulFunctionCall","src":"20779:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"20796:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20775:3:111"},"nodeType":"YulFunctionCall","src":"20775:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20766:3:111"},"nodeType":"YulFunctionCall","src":"20766:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"20866:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20762:3:111"},"nodeType":"YulFunctionCall","src":"20762:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"20755:3:111"}]}]},"name":"abi_encode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"start","nodeType":"YulTypedName","src":"20587:5:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"20594:6:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"20602:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20610:3:111","type":""}],"src":"20552:325:111"},{"body":{"nodeType":"YulBlock","src":"20955:1459:111","statements":[{"nodeType":"YulVariableDeclaration","src":"20965:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20975:6:111","type":"","value":"0x0160"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"20969:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21028:5:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"21009:18:111"},"nodeType":"YulFunctionCall","src":"21009:25:111"},{"name":"pos","nodeType":"YulIdentifier","src":"21036:3:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"20990:18:111"},"nodeType":"YulFunctionCall","src":"20990:50:111"},"nodeType":"YulExpressionStatement","src":"20990:50:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21060:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21065:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21056:3:111"},"nodeType":"YulFunctionCall","src":"21056:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21089:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21096:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21085:3:111"},"nodeType":"YulFunctionCall","src":"21085:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21072:12:111"},"nodeType":"YulFunctionCall","src":"21072:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21049:6:111"},"nodeType":"YulFunctionCall","src":"21049:54:111"},"nodeType":"YulExpressionStatement","src":"21049:54:111"},{"nodeType":"YulVariableDeclaration","src":"21112:89:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21177:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21188:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21195:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21184:3:111"},"nodeType":"YulFunctionCall","src":"21184:16:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"21146:30:111"},"nodeType":"YulFunctionCall","src":"21146:55:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"21116:12:111","type":""},{"name":"memberValue1","nodeType":"YulTypedName","src":"21130:12:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21221:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21226:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21217:3:111"},"nodeType":"YulFunctionCall","src":"21217:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"21233:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21210:6:111"},"nodeType":"YulFunctionCall","src":"21210:26:111"},"nodeType":"YulExpressionStatement","src":"21210:26:111"},{"nodeType":"YulVariableDeclaration","src":"21245:79:111","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"21283:12:111"},{"name":"memberValue1","nodeType":"YulIdentifier","src":"21297:12:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21315:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"21320:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21311:3:111"},"nodeType":"YulFunctionCall","src":"21311:12:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"21257:25:111"},"nodeType":"YulFunctionCall","src":"21257:67:111"},"variables":[{"name":"tail","nodeType":"YulTypedName","src":"21249:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"21333:93:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21402:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21413:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21420:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21409:3:111"},"nodeType":"YulFunctionCall","src":"21409:16:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"21371:30:111"},"nodeType":"YulFunctionCall","src":"21371:55:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"21337:14:111","type":""},{"name":"memberValue1_1","nodeType":"YulTypedName","src":"21353:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21446:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21451:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21442:3:111"},"nodeType":"YulFunctionCall","src":"21442:14:111"},{"arguments":[{"name":"tail","nodeType":"YulIdentifier","src":"21462:4:111"},{"name":"pos","nodeType":"YulIdentifier","src":"21468:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"21458:3:111"},"nodeType":"YulFunctionCall","src":"21458:14:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21435:6:111"},"nodeType":"YulFunctionCall","src":"21435:38:111"},"nodeType":"YulExpressionStatement","src":"21435:38:111"},{"nodeType":"YulVariableDeclaration","src":"21482:77:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"21522:14:111"},{"name":"memberValue1_1","nodeType":"YulIdentifier","src":"21538:14:111"},{"name":"tail","nodeType":"YulIdentifier","src":"21554:4:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"21496:25:111"},"nodeType":"YulFunctionCall","src":"21496:63:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"21486:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21579:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21584:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21575:3:111"},"nodeType":"YulFunctionCall","src":"21575:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21608:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21615:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21604:3:111"},"nodeType":"YulFunctionCall","src":"21604:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21591:12:111"},"nodeType":"YulFunctionCall","src":"21591:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21568:6:111"},"nodeType":"YulFunctionCall","src":"21568:54:111"},"nodeType":"YulExpressionStatement","src":"21568:54:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21642:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21647:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21638:3:111"},"nodeType":"YulFunctionCall","src":"21638:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21671:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21678:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21667:3:111"},"nodeType":"YulFunctionCall","src":"21667:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21654:12:111"},"nodeType":"YulFunctionCall","src":"21654:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21631:6:111"},"nodeType":"YulFunctionCall","src":"21631:54:111"},"nodeType":"YulExpressionStatement","src":"21631:54:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21705:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21710:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21701:3:111"},"nodeType":"YulFunctionCall","src":"21701:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21734:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21741:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21730:3:111"},"nodeType":"YulFunctionCall","src":"21730:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21717:12:111"},"nodeType":"YulFunctionCall","src":"21717:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21694:6:111"},"nodeType":"YulFunctionCall","src":"21694:54:111"},"nodeType":"YulExpressionStatement","src":"21694:54:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21768:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"21773:4:111","type":"","value":"0xe0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21764:3:111"},"nodeType":"YulFunctionCall","src":"21764:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21797:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"21804:4:111","type":"","value":"0xe0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21793:3:111"},"nodeType":"YulFunctionCall","src":"21793:16:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21780:12:111"},"nodeType":"YulFunctionCall","src":"21780:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21757:6:111"},"nodeType":"YulFunctionCall","src":"21757:54:111"},"nodeType":"YulExpressionStatement","src":"21757:54:111"},{"nodeType":"YulVariableDeclaration","src":"21820:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"21830:6:111","type":"","value":"0x0100"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"21824:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21856:3:111"},{"name":"_2","nodeType":"YulIdentifier","src":"21861:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21852:3:111"},"nodeType":"YulFunctionCall","src":"21852:12:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21883:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"21890:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21879:3:111"},"nodeType":"YulFunctionCall","src":"21879:14:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"21866:12:111"},"nodeType":"YulFunctionCall","src":"21866:28:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21845:6:111"},"nodeType":"YulFunctionCall","src":"21845:50:111"},"nodeType":"YulExpressionStatement","src":"21845:50:111"},{"nodeType":"YulVariableDeclaration","src":"21904:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"21914:6:111","type":"","value":"0x0120"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"21908:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"21929:91:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"21998:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22009:5:111"},{"name":"_3","nodeType":"YulIdentifier","src":"22016:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22005:3:111"},"nodeType":"YulFunctionCall","src":"22005:14:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"21967:30:111"},"nodeType":"YulFunctionCall","src":"21967:53:111"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"21933:14:111","type":""},{"name":"memberValue1_2","nodeType":"YulTypedName","src":"21949:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"22040:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"22045:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22036:3:111"},"nodeType":"YulFunctionCall","src":"22036:12:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"22054:6:111"},{"name":"pos","nodeType":"YulIdentifier","src":"22062:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"22050:3:111"},"nodeType":"YulFunctionCall","src":"22050:16:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22029:6:111"},"nodeType":"YulFunctionCall","src":"22029:38:111"},"nodeType":"YulExpressionStatement","src":"22029:38:111"},{"nodeType":"YulVariableDeclaration","src":"22076:79:111","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"22116:14:111"},{"name":"memberValue1_2","nodeType":"YulIdentifier","src":"22132:14:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"22148:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"22090:25:111"},"nodeType":"YulFunctionCall","src":"22090:65:111"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"22080:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22164:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"22174:6:111","type":"","value":"0x0140"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"22168:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22189:91:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22258:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22269:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"22276:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22265:3:111"},"nodeType":"YulFunctionCall","src":"22265:14:111"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"22227:30:111"},"nodeType":"YulFunctionCall","src":"22227:53:111"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"22193:14:111","type":""},{"name":"memberValue1_3","nodeType":"YulTypedName","src":"22209:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"22300:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"22305:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22296:3:111"},"nodeType":"YulFunctionCall","src":"22296:12:111"},{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"22314:6:111"},{"name":"pos","nodeType":"YulIdentifier","src":"22322:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"22310:3:111"},"nodeType":"YulFunctionCall","src":"22310:16:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22289:6:111"},"nodeType":"YulFunctionCall","src":"22289:38:111"},"nodeType":"YulExpressionStatement","src":"22289:38:111"},{"nodeType":"YulAssignment","src":"22336:72:111","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"22369:14:111"},{"name":"memberValue1_3","nodeType":"YulIdentifier","src":"22385:14:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"22401:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"22343:25:111"},"nodeType":"YulFunctionCall","src":"22343:65:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"22336:3:111"}]}]},"name":"abi_encode_struct_UserOperation_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"20932:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"20939:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20947:3:111","type":""}],"src":"20882:1532:111"},{"body":{"nodeType":"YulBlock","src":"22702:1049:111","statements":[{"nodeType":"YulVariableDeclaration","src":"22712:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22730:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22741:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22726:3:111"},"nodeType":"YulFunctionCall","src":"22726:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"22716:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22771:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22753:6:111"},"nodeType":"YulFunctionCall","src":"22753:21:111"},"nodeType":"YulExpressionStatement","src":"22753:21:111"},{"nodeType":"YulVariableDeclaration","src":"22783:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"22794:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"22787:3:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"22816:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"22824:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22809:6:111"},"nodeType":"YulFunctionCall","src":"22809:22:111"},"nodeType":"YulExpressionStatement","src":"22809:22:111"},{"nodeType":"YulAssignment","src":"22840:25:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22851:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22862:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22847:3:111"},"nodeType":"YulFunctionCall","src":"22847:18:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"22840:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"22874:53:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22896:9:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22911:1:111","type":"","value":"5"},{"name":"value1","nodeType":"YulIdentifier","src":"22914:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"22907:3:111"},"nodeType":"YulFunctionCall","src":"22907:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22892:3:111"},"nodeType":"YulFunctionCall","src":"22892:30:111"},{"kind":"number","nodeType":"YulLiteral","src":"22924:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22888:3:111"},"nodeType":"YulFunctionCall","src":"22888:39:111"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"22878:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22936:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"22950:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"22940:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22965:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"22974:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"22969:1:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22984:12:111","value":{"name":"i","nodeType":"YulIdentifier","src":"22995:1:111"},"variables":[{"name":"i_1","nodeType":"YulTypedName","src":"22988:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"23060:558:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"23081:3:111"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"23094:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"23102:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"23090:3:111"},"nodeType":"YulFunctionCall","src":"23090:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"23114:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23086:3:111"},"nodeType":"YulFunctionCall","src":"23086:95:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23074:6:111"},"nodeType":"YulFunctionCall","src":"23074:108:111"},"nodeType":"YulExpressionStatement","src":"23074:108:111"},{"nodeType":"YulVariableDeclaration","src":"23195:46:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"23234:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"23221:12:111"},"nodeType":"YulFunctionCall","src":"23221:20:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"23199:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"23391:16:111","statements":[{"expression":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"23400:1:111"},{"name":"i","nodeType":"YulIdentifier","src":"23403:1:111"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"23393:6:111"},"nodeType":"YulFunctionCall","src":"23393:12:111"},"nodeType":"YulExpressionStatement","src":"23393:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"23268:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"23296:12:111"},"nodeType":"YulFunctionCall","src":"23296:14:111"},{"name":"value0","nodeType":"YulIdentifier","src":"23312:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"23292:3:111"},"nodeType":"YulFunctionCall","src":"23292:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"23321:66:111","type":"","value":"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23288:3:111"},"nodeType":"YulFunctionCall","src":"23288:100:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"23264:3:111"},"nodeType":"YulFunctionCall","src":"23264:125:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"23257:6:111"},"nodeType":"YulFunctionCall","src":"23257:133:111"},"nodeType":"YulIf","src":"23254:153:111"},{"nodeType":"YulAssignment","src":"23420:91:111","value":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"23475:18:111"},{"name":"value0","nodeType":"YulIdentifier","src":"23495:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23471:3:111"},"nodeType":"YulFunctionCall","src":"23471:31:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"23504:6:111"}],"functionName":{"name":"abi_encode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"23430:40:111"},"nodeType":"YulFunctionCall","src":"23430:81:111"},"variableNames":[{"name":"tail_2","nodeType":"YulIdentifier","src":"23420:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"23524:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"23534:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"23528:2:111","type":""}]},{"nodeType":"YulAssignment","src":"23551:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"23565:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"23573:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23561:3:111"},"nodeType":"YulFunctionCall","src":"23561:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"23551:6:111"}]},{"nodeType":"YulAssignment","src":"23589:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"23600:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"23605:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23596:3:111"},"nodeType":"YulFunctionCall","src":"23596:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"23589:3:111"}]}]},"condition":{"arguments":[{"name":"i_1","nodeType":"YulIdentifier","src":"23016:3:111"},{"name":"value1","nodeType":"YulIdentifier","src":"23021:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"23013:2:111"},"nodeType":"YulFunctionCall","src":"23013:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"23029:22:111","statements":[{"nodeType":"YulAssignment","src":"23031:18:111","value":{"arguments":[{"name":"i_1","nodeType":"YulIdentifier","src":"23042:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"23047:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23038:3:111"},"nodeType":"YulFunctionCall","src":"23038:11:111"},"variableNames":[{"name":"i_1","nodeType":"YulIdentifier","src":"23031:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"23009:3:111","statements":[]},"src":"23005:613:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23638:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23649:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23634:3:111"},"nodeType":"YulFunctionCall","src":"23634:20:111"},{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"23660:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"23668:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"23656:3:111"},"nodeType":"YulFunctionCall","src":"23656:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23627:6:111"},"nodeType":"YulFunctionCall","src":"23627:52:111"},"nodeType":"YulExpressionStatement","src":"23627:52:111"},{"nodeType":"YulAssignment","src":"23688:57:111","value":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"23722:6:111"},{"name":"value3","nodeType":"YulIdentifier","src":"23730:6:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"23738:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"23696:25:111"},"nodeType":"YulFunctionCall","src":"23696:49:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"23688:4:111"}]}]},"name":"abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr_t_bytes_calldata_ptr__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22647:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"22658:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"22666:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"22674:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"22682:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22693:4:111","type":""}],"src":"22419:1332:111"},{"body":{"nodeType":"YulBlock","src":"23857:125:111","statements":[{"nodeType":"YulAssignment","src":"23867:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23879:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"23890:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23875:3:111"},"nodeType":"YulFunctionCall","src":"23875:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"23867:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23909:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"23924:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"23932:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"23920:3:111"},"nodeType":"YulFunctionCall","src":"23920:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23902:6:111"},"nodeType":"YulFunctionCall","src":"23902:74:111"},"nodeType":"YulExpressionStatement","src":"23902:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"23826:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"23837:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"23848:4:111","type":""}],"src":"23756:226:111"},{"body":{"nodeType":"YulBlock","src":"24161:175:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24178:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24189:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24171:6:111"},"nodeType":"YulFunctionCall","src":"24171:21:111"},"nodeType":"YulExpressionStatement","src":"24171:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24212:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24223:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24208:3:111"},"nodeType":"YulFunctionCall","src":"24208:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"24228:2:111","type":"","value":"25"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24201:6:111"},"nodeType":"YulFunctionCall","src":"24201:30:111"},"nodeType":"YulExpressionStatement","src":"24201:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24251:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24262:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24247:3:111"},"nodeType":"YulFunctionCall","src":"24247:18:111"},{"hexValue":"41413230206163636f756e74206e6f74206465706c6f796564","kind":"string","nodeType":"YulLiteral","src":"24267:27:111","type":"","value":"AA20 account not deployed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"24240:6:111"},"nodeType":"YulFunctionCall","src":"24240:55:111"},"nodeType":"YulExpressionStatement","src":"24240:55:111"},{"nodeType":"YulAssignment","src":"24304:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"24316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"24327:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24312:3:111"},"nodeType":"YulFunctionCall","src":"24312:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"24304:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"24138:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"24152:4:111","type":""}],"src":"23987:349:111"},{"body":{"nodeType":"YulBlock","src":"24471:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"24509:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"24518:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"24521:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"24511:6:111"},"nodeType":"YulFunctionCall","src":"24511:12:111"},"nodeType":"YulExpressionStatement","src":"24511:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"24487:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"24499:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"24484:2:111"},"nodeType":"YulFunctionCall","src":"24484:24:111"},"nodeType":"YulIf","src":"24481:44:111"},{"body":{"nodeType":"YulBlock","src":"24558:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"24567:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"24570:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"24560:6:111"},"nodeType":"YulFunctionCall","src":"24560:12:111"},"nodeType":"YulExpressionStatement","src":"24560:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"24540:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"24550:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"24537:2:111"},"nodeType":"YulFunctionCall","src":"24537:20:111"},"nodeType":"YulIf","src":"24534:40:111"},{"nodeType":"YulAssignment","src":"24583:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"24600:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"24608:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"24596:3:111"},"nodeType":"YulFunctionCall","src":"24596:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"24583:9:111"}]},{"nodeType":"YulAssignment","src":"24628:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"24645:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"24655:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"24641:3:111"},"nodeType":"YulFunctionCall","src":"24641:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"24628:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"24405:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"24413:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"24421:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"24433:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"24446:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"24457:9:111","type":""}],"src":"24341:331:111"},{"body":{"nodeType":"YulBlock","src":"24778:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"24788:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"24811:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"24798:12:111"},"nodeType":"YulFunctionCall","src":"24798:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"24792:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"24826:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"24836:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"24830:2:111","type":""}]},{"nodeType":"YulAssignment","src":"24911:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"24924:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"24928:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"24920:3:111"},"nodeType":"YulFunctionCall","src":"24920:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"24911:5:111"}]},{"body":{"nodeType":"YulBlock","src":"24963:80:111","statements":[{"nodeType":"YulAssignment","src":"24977:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"24994:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"25006:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"25013:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"25017:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"25009:3:111"},"nodeType":"YulFunctionCall","src":"25009:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"25002:3:111"},"nodeType":"YulFunctionCall","src":"25002:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"25024:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"24998:3:111"},"nodeType":"YulFunctionCall","src":"24998:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"24990:3:111"},"nodeType":"YulFunctionCall","src":"24990:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"25030:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"24986:3:111"},"nodeType":"YulFunctionCall","src":"24986:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"24977:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"24946:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"24951:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"24943:2:111"},"nodeType":"YulFunctionCall","src":"24943:11:111"},"nodeType":"YulIf","src":"24940:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"24753:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"24760:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"24768:5:111","type":""}],"src":"24677:372:111"},{"body":{"nodeType":"YulBlock","src":"25228:177:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25245:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25256:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25238:6:111"},"nodeType":"YulFunctionCall","src":"25238:21:111"},"nodeType":"YulExpressionStatement","src":"25238:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25279:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25290:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25275:3:111"},"nodeType":"YulFunctionCall","src":"25275:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"25295:2:111","type":"","value":"27"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25268:6:111"},"nodeType":"YulFunctionCall","src":"25268:30:111"},"nodeType":"YulExpressionStatement","src":"25268:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25318:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25329:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25314:3:111"},"nodeType":"YulFunctionCall","src":"25314:18:111"},{"hexValue":"41413330207061796d6173746572206e6f74206465706c6f796564","kind":"string","nodeType":"YulLiteral","src":"25334:29:111","type":"","value":"AA30 paymaster not deployed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25307:6:111"},"nodeType":"YulFunctionCall","src":"25307:57:111"},"nodeType":"YulExpressionStatement","src":"25307:57:111"},{"nodeType":"YulAssignment","src":"25373:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25385:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25396:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25381:3:111"},"nodeType":"YulFunctionCall","src":"25381:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25373:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25205:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25219:4:111","type":""}],"src":"25054:351:111"},{"body":{"nodeType":"YulBlock","src":"25584:110:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25601:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25612:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25594:6:111"},"nodeType":"YulFunctionCall","src":"25594:21:111"},"nodeType":"YulExpressionStatement","src":"25594:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25635:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25646:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25631:3:111"},"nodeType":"YulFunctionCall","src":"25631:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"25651:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25624:6:111"},"nodeType":"YulFunctionCall","src":"25624:29:111"},"nodeType":"YulExpressionStatement","src":"25624:29:111"},{"nodeType":"YulAssignment","src":"25662:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25674:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25685:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25670:3:111"},"nodeType":"YulFunctionCall","src":"25670:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25662:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25561:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25575:4:111","type":""}],"src":"25410:284:111"},{"body":{"nodeType":"YulBlock","src":"25828:115:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25856:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"25838:6:111"},"nodeType":"YulFunctionCall","src":"25838:21:111"},"nodeType":"YulExpressionStatement","src":"25838:21:111"},{"nodeType":"YulAssignment","src":"25868:69:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"25902:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"25910:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"25922:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"25933:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"25918:3:111"},"nodeType":"YulFunctionCall","src":"25918:18:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"25876:25:111"},"nodeType":"YulFunctionCall","src":"25876:61:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"25868:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25789:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"25800:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"25808:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"25819:4:111","type":""}],"src":"25699:244:111"},{"body":{"nodeType":"YulBlock","src":"26029:170:111","statements":[{"body":{"nodeType":"YulBlock","src":"26075:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"26084:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"26087:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"26077:6:111"},"nodeType":"YulFunctionCall","src":"26077:12:111"},"nodeType":"YulExpressionStatement","src":"26077:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"26050:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"26059:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"26046:3:111"},"nodeType":"YulFunctionCall","src":"26046:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"26071:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"26042:3:111"},"nodeType":"YulFunctionCall","src":"26042:32:111"},"nodeType":"YulIf","src":"26039:52:111"},{"nodeType":"YulVariableDeclaration","src":"26100:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26119:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"26113:5:111"},"nodeType":"YulFunctionCall","src":"26113:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"26104:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"26163:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"26138:24:111"},"nodeType":"YulFunctionCall","src":"26138:31:111"},"nodeType":"YulExpressionStatement","src":"26138:31:111"},{"nodeType":"YulAssignment","src":"26178:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"26188:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"26178:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"25995:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"26006:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"26018:6:111","type":""}],"src":"25948:251:111"},{"body":{"nodeType":"YulBlock","src":"26361:211:111","statements":[{"nodeType":"YulAssignment","src":"26371:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26383:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26394:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26379:3:111"},"nodeType":"YulFunctionCall","src":"26379:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"26371:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26413:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"26424:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26406:6:111"},"nodeType":"YulFunctionCall","src":"26406:25:111"},"nodeType":"YulExpressionStatement","src":"26406:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26462:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26447:3:111"},"nodeType":"YulFunctionCall","src":"26447:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"26471:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"26479:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"26467:3:111"},"nodeType":"YulFunctionCall","src":"26467:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26440:6:111"},"nodeType":"YulFunctionCall","src":"26440:83:111"},"nodeType":"YulExpressionStatement","src":"26440:83:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26543:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26554:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26539:3:111"},"nodeType":"YulFunctionCall","src":"26539:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"26559:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26532:6:111"},"nodeType":"YulFunctionCall","src":"26532:34:111"},"nodeType":"YulExpressionStatement","src":"26532:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_address_t_uint256__to_t_bytes32_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"26314:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"26325:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"26333:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"26341:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"26352:4:111","type":""}],"src":"26204:368:111"},{"body":{"nodeType":"YulBlock","src":"26751:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26768:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26779:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26761:6:111"},"nodeType":"YulFunctionCall","src":"26761:21:111"},"nodeType":"YulExpressionStatement","src":"26761:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26802:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26813:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26798:3:111"},"nodeType":"YulFunctionCall","src":"26798:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"26818:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26791:6:111"},"nodeType":"YulFunctionCall","src":"26791:30:111"},"nodeType":"YulExpressionStatement","src":"26791:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26852:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26837:3:111"},"nodeType":"YulFunctionCall","src":"26837:18:111"},{"hexValue":"6e6f74207374616b6564","kind":"string","nodeType":"YulLiteral","src":"26857:12:111","type":"","value":"not staked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"26830:6:111"},"nodeType":"YulFunctionCall","src":"26830:40:111"},"nodeType":"YulExpressionStatement","src":"26830:40:111"},{"nodeType":"YulAssignment","src":"26879:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"26891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"26902:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"26887:3:111"},"nodeType":"YulFunctionCall","src":"26887:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"26879:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"26728:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"26742:4:111","type":""}],"src":"26577:334:111"},{"body":{"nodeType":"YulBlock","src":"27090:167:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27107:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27118:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27100:6:111"},"nodeType":"YulFunctionCall","src":"27100:21:111"},"nodeType":"YulExpressionStatement","src":"27100:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27141:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27152:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27137:3:111"},"nodeType":"YulFunctionCall","src":"27137:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"27157:2:111","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27130:6:111"},"nodeType":"YulFunctionCall","src":"27130:30:111"},"nodeType":"YulExpressionStatement","src":"27130:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27180:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27191:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27176:3:111"},"nodeType":"YulFunctionCall","src":"27176:18:111"},{"hexValue":"616c726561647920756e7374616b696e67","kind":"string","nodeType":"YulLiteral","src":"27196:19:111","type":"","value":"already unstaking"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27169:6:111"},"nodeType":"YulFunctionCall","src":"27169:47:111"},"nodeType":"YulExpressionStatement","src":"27169:47:111"},{"nodeType":"YulAssignment","src":"27225:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27237:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27248:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27233:3:111"},"nodeType":"YulFunctionCall","src":"27233:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"27225:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"27067:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"27081:4:111","type":""}],"src":"26916:341:111"},{"body":{"nodeType":"YulBlock","src":"27309:185:111","statements":[{"nodeType":"YulVariableDeclaration","src":"27319:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"27329:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"27323:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"27352:21:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"27367:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"27370:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"27363:3:111"},"nodeType":"YulFunctionCall","src":"27363:10:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"27356:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"27382:21:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"27397:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"27400:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"27393:3:111"},"nodeType":"YulFunctionCall","src":"27393:10:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"27386:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"27437:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"27439:16:111"},"nodeType":"YulFunctionCall","src":"27439:18:111"},"nodeType":"YulExpressionStatement","src":"27439:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"27418:3:111"},{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"27427:2:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"27431:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"27423:3:111"},"nodeType":"YulFunctionCall","src":"27423:12:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"27415:2:111"},"nodeType":"YulFunctionCall","src":"27415:21:111"},"nodeType":"YulIf","src":"27412:47:111"},{"nodeType":"YulAssignment","src":"27468:20:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"27479:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"27484:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27475:3:111"},"nodeType":"YulFunctionCall","src":"27475:13:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"27468:3:111"}]}]},"name":"checked_add_t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"27292:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"27295:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"27301:3:111","type":""}],"src":"27262:232:111"},{"body":{"nodeType":"YulBlock","src":"27599:97:111","statements":[{"nodeType":"YulAssignment","src":"27609:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27621:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27632:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27617:3:111"},"nodeType":"YulFunctionCall","src":"27617:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"27609:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27651:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"27666:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"27674:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"27662:3:111"},"nodeType":"YulFunctionCall","src":"27662:27:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27644:6:111"},"nodeType":"YulFunctionCall","src":"27644:46:111"},"nodeType":"YulExpressionStatement","src":"27644:46:111"}]},"name":"abi_encode_tuple_t_uint48__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"27568:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"27579:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"27590:4:111","type":""}],"src":"27499:197:111"},{"body":{"nodeType":"YulBlock","src":"27875:170:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27892:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27903:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27885:6:111"},"nodeType":"YulFunctionCall","src":"27885:21:111"},"nodeType":"YulExpressionStatement","src":"27885:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27926:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27937:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27922:3:111"},"nodeType":"YulFunctionCall","src":"27922:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"27942:2:111","type":"","value":"20"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27915:6:111"},"nodeType":"YulFunctionCall","src":"27915:30:111"},"nodeType":"YulExpressionStatement","src":"27915:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"27965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"27976:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"27961:3:111"},"nodeType":"YulFunctionCall","src":"27961:18:111"},{"hexValue":"4e6f207374616b6520746f207769746864726177","kind":"string","nodeType":"YulLiteral","src":"27981:22:111","type":"","value":"No stake to withdraw"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"27954:6:111"},"nodeType":"YulFunctionCall","src":"27954:50:111"},"nodeType":"YulExpressionStatement","src":"27954:50:111"},{"nodeType":"YulAssignment","src":"28013:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28025:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28036:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28021:3:111"},"nodeType":"YulFunctionCall","src":"28021:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"28013:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"27852:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"27866:4:111","type":""}],"src":"27701:344:111"},{"body":{"nodeType":"YulBlock","src":"28224:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28252:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28234:6:111"},"nodeType":"YulFunctionCall","src":"28234:21:111"},"nodeType":"YulExpressionStatement","src":"28234:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28275:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28286:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28271:3:111"},"nodeType":"YulFunctionCall","src":"28271:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"28291:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28264:6:111"},"nodeType":"YulFunctionCall","src":"28264:30:111"},"nodeType":"YulExpressionStatement","src":"28264:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28314:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28325:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28310:3:111"},"nodeType":"YulFunctionCall","src":"28310:18:111"},{"hexValue":"6d7573742063616c6c20756e6c6f636b5374616b652829206669727374","kind":"string","nodeType":"YulLiteral","src":"28330:31:111","type":"","value":"must call unlockStake() first"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28303:6:111"},"nodeType":"YulFunctionCall","src":"28303:59:111"},"nodeType":"YulExpressionStatement","src":"28303:59:111"},{"nodeType":"YulAssignment","src":"28371:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28383:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28394:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28379:3:111"},"nodeType":"YulFunctionCall","src":"28379:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"28371:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"28201:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"28215:4:111","type":""}],"src":"28050:353:111"},{"body":{"nodeType":"YulBlock","src":"28582:177:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28599:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28610:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28592:6:111"},"nodeType":"YulFunctionCall","src":"28592:21:111"},"nodeType":"YulExpressionStatement","src":"28592:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28633:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28644:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28629:3:111"},"nodeType":"YulFunctionCall","src":"28629:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"28649:2:111","type":"","value":"27"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28622:6:111"},"nodeType":"YulFunctionCall","src":"28622:30:111"},"nodeType":"YulExpressionStatement","src":"28622:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28683:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28668:3:111"},"nodeType":"YulFunctionCall","src":"28668:18:111"},{"hexValue":"5374616b65207769746864726177616c206973206e6f7420647565","kind":"string","nodeType":"YulLiteral","src":"28688:29:111","type":"","value":"Stake withdrawal is not due"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28661:6:111"},"nodeType":"YulFunctionCall","src":"28661:57:111"},"nodeType":"YulExpressionStatement","src":"28661:57:111"},{"nodeType":"YulAssignment","src":"28727:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28739:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28750:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28735:3:111"},"nodeType":"YulFunctionCall","src":"28735:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"28727:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"28559:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"28573:4:111","type":""}],"src":"28408:351:111"},{"body":{"nodeType":"YulBlock","src":"28938:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"28966:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28948:6:111"},"nodeType":"YulFunctionCall","src":"28948:21:111"},"nodeType":"YulExpressionStatement","src":"28948:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"28989:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29000:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"28985:3:111"},"nodeType":"YulFunctionCall","src":"28985:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"29005:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"28978:6:111"},"nodeType":"YulFunctionCall","src":"28978:30:111"},"nodeType":"YulExpressionStatement","src":"28978:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29028:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29039:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29024:3:111"},"nodeType":"YulFunctionCall","src":"29024:18:111"},{"hexValue":"6661696c656420746f207769746864726177207374616b65","kind":"string","nodeType":"YulLiteral","src":"29044:26:111","type":"","value":"failed to withdraw stake"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29017:6:111"},"nodeType":"YulFunctionCall","src":"29017:54:111"},"nodeType":"YulExpressionStatement","src":"29017:54:111"},{"nodeType":"YulAssignment","src":"29080:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29092:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29103:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29088:3:111"},"nodeType":"YulFunctionCall","src":"29088:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"29080:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"28915:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"28929:4:111","type":""}],"src":"28764:348:111"},{"body":{"nodeType":"YulBlock","src":"29264:124:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"29287:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"29292:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"29300:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"29274:12:111"},"nodeType":"YulFunctionCall","src":"29274:33:111"},"nodeType":"YulExpressionStatement","src":"29274:33:111"},{"nodeType":"YulVariableDeclaration","src":"29316:26:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"29330:3:111"},{"name":"value1","nodeType":"YulIdentifier","src":"29335:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29326:3:111"},"nodeType":"YulFunctionCall","src":"29326:16:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"29320:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"29358:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"29362:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29351:6:111"},"nodeType":"YulFunctionCall","src":"29351:13:111"},"nodeType":"YulExpressionStatement","src":"29351:13:111"},{"nodeType":"YulAssignment","src":"29373:9:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"29380:2:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"29373:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"29232:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"29237:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"29245:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"29256:3:111","type":""}],"src":"29117:271:111"},{"body":{"nodeType":"YulBlock","src":"29642:384:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29659:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"29670:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29652:6:111"},"nodeType":"YulFunctionCall","src":"29652:25:111"},"nodeType":"YulExpressionStatement","src":"29652:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29697:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29708:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29693:3:111"},"nodeType":"YulFunctionCall","src":"29693:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"29713:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29686:6:111"},"nodeType":"YulFunctionCall","src":"29686:34:111"},"nodeType":"YulExpressionStatement","src":"29686:34:111"},{"nodeType":"YulVariableDeclaration","src":"29729:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"29739:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"29733:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29773:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29784:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29769:3:111"},"nodeType":"YulFunctionCall","src":"29769:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"29793:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29801:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29789:3:111"},"nodeType":"YulFunctionCall","src":"29789:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29762:6:111"},"nodeType":"YulFunctionCall","src":"29762:43:111"},"nodeType":"YulExpressionStatement","src":"29762:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29836:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29821:3:111"},"nodeType":"YulFunctionCall","src":"29821:18:111"},{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"29845:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"29853:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"29841:3:111"},"nodeType":"YulFunctionCall","src":"29841:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29814:6:111"},"nodeType":"YulFunctionCall","src":"29814:43:111"},"nodeType":"YulExpressionStatement","src":"29814:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29877:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29888:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29873:3:111"},"nodeType":"YulFunctionCall","src":"29873:19:111"},{"arguments":[{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"29908:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"29901:6:111"},"nodeType":"YulFunctionCall","src":"29901:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"29894:6:111"},"nodeType":"YulFunctionCall","src":"29894:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29866:6:111"},"nodeType":"YulFunctionCall","src":"29866:51:111"},"nodeType":"YulExpressionStatement","src":"29866:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"29937:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"29948:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"29933:3:111"},"nodeType":"YulFunctionCall","src":"29933:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"29954:3:111","type":"","value":"192"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"29926:6:111"},"nodeType":"YulFunctionCall","src":"29926:32:111"},"nodeType":"YulExpressionStatement","src":"29926:32:111"},{"nodeType":"YulAssignment","src":"29967:53:111","value":{"arguments":[{"name":"value5","nodeType":"YulIdentifier","src":"29992:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"30004:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"30015:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30000:3:111"},"nodeType":"YulFunctionCall","src":"30000:19:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"29975:16:111"},"nodeType":"YulFunctionCall","src":"29975:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"29967:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__to_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"29571:9:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"29582:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"29590:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"29598:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"29606:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"29614:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"29622:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"29633:4:111","type":""}],"src":"29393:633:111"},{"body":{"nodeType":"YulBlock","src":"30092:528:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30109:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30120:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30114:5:111"},"nodeType":"YulFunctionCall","src":"30114:12:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30102:6:111"},"nodeType":"YulFunctionCall","src":"30102:25:111"},"nodeType":"YulExpressionStatement","src":"30102:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30147:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30152:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30143:3:111"},"nodeType":"YulFunctionCall","src":"30143:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30169:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30176:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30165:3:111"},"nodeType":"YulFunctionCall","src":"30165:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30159:5:111"},"nodeType":"YulFunctionCall","src":"30159:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30136:6:111"},"nodeType":"YulFunctionCall","src":"30136:47:111"},"nodeType":"YulExpressionStatement","src":"30136:47:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30203:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30208:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30199:3:111"},"nodeType":"YulFunctionCall","src":"30199:14:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30239:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30246:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30235:3:111"},"nodeType":"YulFunctionCall","src":"30235:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30229:5:111"},"nodeType":"YulFunctionCall","src":"30229:23:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"30222:6:111"},"nodeType":"YulFunctionCall","src":"30222:31:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"30215:6:111"},"nodeType":"YulFunctionCall","src":"30215:39:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30192:6:111"},"nodeType":"YulFunctionCall","src":"30192:63:111"},"nodeType":"YulExpressionStatement","src":"30192:63:111"},{"nodeType":"YulVariableDeclaration","src":"30264:43:111","value":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30294:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30301:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30290:3:111"},"nodeType":"YulFunctionCall","src":"30290:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30284:5:111"},"nodeType":"YulFunctionCall","src":"30284:23:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"30268:12:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"30316:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"30326:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"30320:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30360:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30365:4:111","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30356:3:111"},"nodeType":"YulFunctionCall","src":"30356:14:111"},{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"30376:12:111"},{"name":"_1","nodeType":"YulIdentifier","src":"30390:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"30372:3:111"},"nodeType":"YulFunctionCall","src":"30372:21:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30349:6:111"},"nodeType":"YulFunctionCall","src":"30349:45:111"},"nodeType":"YulExpressionStatement","src":"30349:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30414:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30419:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30410:3:111"},"nodeType":"YulFunctionCall","src":"30410:14:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30440:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30447:4:111","type":"","value":"0x80"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30436:3:111"},"nodeType":"YulFunctionCall","src":"30436:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30430:5:111"},"nodeType":"YulFunctionCall","src":"30430:23:111"},{"name":"_1","nodeType":"YulIdentifier","src":"30455:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"30426:3:111"},"nodeType":"YulFunctionCall","src":"30426:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30403:6:111"},"nodeType":"YulFunctionCall","src":"30403:56:111"},"nodeType":"YulExpressionStatement","src":"30403:56:111"},{"nodeType":"YulVariableDeclaration","src":"30468:45:111","value":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30500:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30507:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30496:3:111"},"nodeType":"YulFunctionCall","src":"30496:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30490:5:111"},"nodeType":"YulFunctionCall","src":"30490:23:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"30472:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30533:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30538:4:111","type":"","value":"0xa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30529:3:111"},"nodeType":"YulFunctionCall","src":"30529:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"30545:4:111","type":"","value":"0xc0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30522:6:111"},"nodeType":"YulFunctionCall","src":"30522:28:111"},"nodeType":"YulExpressionStatement","src":"30522:28:111"},{"nodeType":"YulAssignment","src":"30559:55:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"30583:14:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30603:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30608:4:111","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30599:3:111"},"nodeType":"YulFunctionCall","src":"30599:14:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"30566:16:111"},"nodeType":"YulFunctionCall","src":"30566:48:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"30559:3:111"}]}]},"name":"abi_encode_struct_ReturnInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"30069:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"30076:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"30084:3:111","type":""}],"src":"30031:589:111"},{"body":{"nodeType":"YulBlock","src":"30678:97:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30695:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30706:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30700:5:111"},"nodeType":"YulFunctionCall","src":"30700:12:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30688:6:111"},"nodeType":"YulFunctionCall","src":"30688:25:111"},"nodeType":"YulExpressionStatement","src":"30688:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"30733:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"30738:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30729:3:111"},"nodeType":"YulFunctionCall","src":"30729:14:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"30755:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"30762:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"30751:3:111"},"nodeType":"YulFunctionCall","src":"30751:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"30745:5:111"},"nodeType":"YulFunctionCall","src":"30745:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"30722:6:111"},"nodeType":"YulFunctionCall","src":"30722:47:111"},"nodeType":"YulExpressionStatement","src":"30722:47:111"}]},"name":"abi_encode_struct_StakeInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"30662:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"30669:3:111","type":""}],"src":"30625:150:111"},{"body":{"nodeType":"YulBlock","src":"31295:547:111","statements":[{"nodeType":"YulVariableDeclaration","src":"31305:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"31315:3:111","type":"","value":"320"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"31309:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31334:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"31345:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31327:6:111"},"nodeType":"YulFunctionCall","src":"31327:21:111"},"nodeType":"YulExpressionStatement","src":"31327:21:111"},{"nodeType":"YulAssignment","src":"31357:64:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"31394:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31406:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"31417:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31402:3:111"},"nodeType":"YulFunctionCall","src":"31402:18:111"}],"functionName":{"name":"abi_encode_struct_ReturnInfo","nodeType":"YulIdentifier","src":"31365:28:111"},"nodeType":"YulFunctionCall","src":"31365:56:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"31357:4:111"}]},{"expression":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"31458:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31481:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31466:3:111"},"nodeType":"YulFunctionCall","src":"31466:18:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"31430:27:111"},"nodeType":"YulFunctionCall","src":"31430:55:111"},"nodeType":"YulExpressionStatement","src":"31430:55:111"},{"expression":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"31522:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31534:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31545:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31530:3:111"},"nodeType":"YulFunctionCall","src":"31530:18:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"31494:27:111"},"nodeType":"YulFunctionCall","src":"31494:55:111"},"nodeType":"YulExpressionStatement","src":"31494:55:111"},{"expression":{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"31586:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31598:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31609:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31594:3:111"},"nodeType":"YulFunctionCall","src":"31594:19:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"31558:27:111"},"nodeType":"YulFunctionCall","src":"31558:56:111"},"nodeType":"YulExpressionStatement","src":"31558:56:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31634:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31645:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31630:3:111"},"nodeType":"YulFunctionCall","src":"31630:19:111"},{"arguments":[{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"31661:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"31655:5:111"},"nodeType":"YulFunctionCall","src":"31655:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"31670:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"31651:3:111"},"nodeType":"YulFunctionCall","src":"31651:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"31623:6:111"},"nodeType":"YulFunctionCall","src":"31623:91:111"},"nodeType":"YulExpressionStatement","src":"31623:91:111"},{"nodeType":"YulVariableDeclaration","src":"31723:42:111","value":{"arguments":[{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"31753:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"31761:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31749:3:111"},"nodeType":"YulFunctionCall","src":"31749:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"31743:5:111"},"nodeType":"YulFunctionCall","src":"31743:22:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"31727:12:111","type":""}]},{"expression":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"31802:12:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"31820:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"31831:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"31816:3:111"},"nodeType":"YulFunctionCall","src":"31816:19:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"31774:27:111"},"nodeType":"YulFunctionCall","src":"31774:62:111"},"nodeType":"YulExpressionStatement","src":"31774:62:111"}]},"name":"abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"31232:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"31243:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"31251:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"31259:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"31267:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"31275:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"31286:4:111","type":""}],"src":"30780:1062:111"},{"body":{"nodeType":"YulBlock","src":"32258:305:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32275:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32286:3:111","type":"","value":"224"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32268:6:111"},"nodeType":"YulFunctionCall","src":"32268:22:111"},"nodeType":"YulExpressionStatement","src":"32268:22:111"},{"nodeType":"YulAssignment","src":"32299:65:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"32336:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32359:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32344:3:111"},"nodeType":"YulFunctionCall","src":"32344:19:111"}],"functionName":{"name":"abi_encode_struct_ReturnInfo","nodeType":"YulIdentifier","src":"32307:28:111"},"nodeType":"YulFunctionCall","src":"32307:57:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32299:4:111"}]},{"expression":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"32401:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32413:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32424:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32409:3:111"},"nodeType":"YulFunctionCall","src":"32409:18:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"32373:27:111"},"nodeType":"YulFunctionCall","src":"32373:55:111"},"nodeType":"YulExpressionStatement","src":"32373:55:111"},{"expression":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"32465:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32477:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32488:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32473:3:111"},"nodeType":"YulFunctionCall","src":"32473:18:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"32437:27:111"},"nodeType":"YulFunctionCall","src":"32437:55:111"},"nodeType":"YulExpressionStatement","src":"32437:55:111"},{"expression":{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"32529:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32541:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32552:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32537:3:111"},"nodeType":"YulFunctionCall","src":"32537:19:111"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"32501:27:111"},"nodeType":"YulFunctionCall","src":"32501:56:111"},"nodeType":"YulExpressionStatement","src":"32501:56:111"}]},"name":"abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"32203:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"32214:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"32222:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"32230:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"32238:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"32249:4:111","type":""}],"src":"31847:716:111"},{"body":{"nodeType":"YulBlock","src":"32742:166:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32770:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32752:6:111"},"nodeType":"YulFunctionCall","src":"32752:21:111"},"nodeType":"YulExpressionStatement","src":"32752:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32793:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32804:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32789:3:111"},"nodeType":"YulFunctionCall","src":"32789:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"32809:2:111","type":"","value":"16"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32782:6:111"},"nodeType":"YulFunctionCall","src":"32782:30:111"},"nodeType":"YulExpressionStatement","src":"32782:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32832:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32843:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32828:3:111"},"nodeType":"YulFunctionCall","src":"32828:18:111"},{"hexValue":"6465706f736974206f766572666c6f77","kind":"string","nodeType":"YulLiteral","src":"32848:18:111","type":"","value":"deposit overflow"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32821:6:111"},"nodeType":"YulFunctionCall","src":"32821:46:111"},"nodeType":"YulExpressionStatement","src":"32821:46:111"},{"nodeType":"YulAssignment","src":"32876:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"32888:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"32899:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"32884:3:111"},"nodeType":"YulFunctionCall","src":"32884:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"32876:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"32719:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"32733:4:111","type":""}],"src":"32568:340:111"},{"body":{"nodeType":"YulBlock","src":"32945:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"32962:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"32965:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"32955:6:111"},"nodeType":"YulFunctionCall","src":"32955:88:111"},"nodeType":"YulExpressionStatement","src":"32955:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33059:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"33062:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33052:6:111"},"nodeType":"YulFunctionCall","src":"33052:15:111"},"nodeType":"YulExpressionStatement","src":"33052:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33083:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"33086:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"33076:6:111"},"nodeType":"YulFunctionCall","src":"33076:15:111"},"nodeType":"YulExpressionStatement","src":"33076:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"32913:184:111"},{"body":{"nodeType":"YulBlock","src":"33291:394:111","statements":[{"body":{"nodeType":"YulBlock","src":"33334:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33355:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"33358:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33348:6:111"},"nodeType":"YulFunctionCall","src":"33348:88:111"},"nodeType":"YulExpressionStatement","src":"33348:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33456:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"33459:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33449:6:111"},"nodeType":"YulFunctionCall","src":"33449:15:111"},"nodeType":"YulExpressionStatement","src":"33449:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33484:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"33487:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"33477:6:111"},"nodeType":"YulFunctionCall","src":"33477:15:111"},"nodeType":"YulExpressionStatement","src":"33477:15:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"33314:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"33322:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"33311:2:111"},"nodeType":"YulFunctionCall","src":"33311:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"33304:6:111"},"nodeType":"YulFunctionCall","src":"33304:21:111"},"nodeType":"YulIf","src":"33301:201:111"},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"33518:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"33529:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33511:6:111"},"nodeType":"YulFunctionCall","src":"33511:25:111"},"nodeType":"YulExpressionStatement","src":"33511:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"33556:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"33567:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"33552:3:111"},"nodeType":"YulFunctionCall","src":"33552:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"33572:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33545:6:111"},"nodeType":"YulFunctionCall","src":"33545:30:111"},"nodeType":"YulExpressionStatement","src":"33545:30:111"},{"nodeType":"YulAssignment","src":"33584:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"33609:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"33621:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"33632:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"33617:3:111"},"nodeType":"YulFunctionCall","src":"33617:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"33592:16:111"},"nodeType":"YulFunctionCall","src":"33592:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"33584:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"33656:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"33667:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"33652:3:111"},"nodeType":"YulFunctionCall","src":"33652:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"33672:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"33645:6:111"},"nodeType":"YulFunctionCall","src":"33645:34:111"},"nodeType":"YulExpressionStatement","src":"33645:34:111"}]},"name":"abi_encode_tuple_t_enum$_PostOpMode_$10834_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"33244:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"33255:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"33263:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"33271:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"33282:4:111","type":""}],"src":"33102:583:111"},{"body":{"nodeType":"YulBlock","src":"33733:136:111","statements":[{"body":{"nodeType":"YulBlock","src":"33778:85:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33807:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"33810:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"33813:1:111","type":"","value":"4"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"33792:14:111"},"nodeType":"YulFunctionCall","src":"33792:23:111"},"nodeType":"YulExpressionStatement","src":"33792:23:111"},{"nodeType":"YulAssignment","src":"33828:25:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33839:3:111","type":"","value":"224"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33850:1:111","type":"","value":"0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"33844:5:111"},"nodeType":"YulFunctionCall","src":"33844:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"33835:3:111"},"nodeType":"YulFunctionCall","src":"33835:18:111"},"variableNames":[{"name":"sig","nodeType":"YulIdentifier","src":"33828:3:111"}]}]},"condition":{"arguments":[{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"33749:14:111"},"nodeType":"YulFunctionCall","src":"33749:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"33767:1:111","type":"","value":"3"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"33746:2:111"},"nodeType":"YulFunctionCall","src":"33746:23:111"},"nodeType":"YulIf","src":"33743:120:111"}]},"name":"return_data_selector","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"sig","nodeType":"YulTypedName","src":"33725:3:111","type":""}],"src":"33690:179:111"},{"body":{"nodeType":"YulBlock","src":"33921:684:111","statements":[{"body":{"nodeType":"YulBlock","src":"33961:9:111","statements":[{"nodeType":"YulLeave","src":"33963:5:111"}]},"condition":{"arguments":[{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"33937:14:111"},"nodeType":"YulFunctionCall","src":"33937:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"33955:4:111","type":"","value":"0x44"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"33934:2:111"},"nodeType":"YulFunctionCall","src":"33934:26:111"},"nodeType":"YulIf","src":"33931:39:111"},{"nodeType":"YulVariableDeclaration","src":"33979:21:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"33997:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"33991:5:111"},"nodeType":"YulFunctionCall","src":"33991:9:111"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"33983:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"34009:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"34019:66:111","type":"","value":"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"34013:2:111","type":""}]},{"expression":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"34109:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"34115:1:111","type":"","value":"4"},{"arguments":[{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"34122:14:111"},"nodeType":"YulFunctionCall","src":"34122:16:111"},{"name":"_1","nodeType":"YulIdentifier","src":"34140:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34118:3:111"},"nodeType":"YulFunctionCall","src":"34118:25:111"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"34094:14:111"},"nodeType":"YulFunctionCall","src":"34094:50:111"},"nodeType":"YulExpressionStatement","src":"34094:50:111"},{"nodeType":"YulVariableDeclaration","src":"34153:25:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"34173:4:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"34167:5:111"},"nodeType":"YulFunctionCall","src":"34167:11:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"34157:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"34187:26:111","value":{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"34197:14:111"},"nodeType":"YulFunctionCall","src":"34197:16:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"34191:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"34222:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"34232:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"34226:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"34308:9:111","statements":[{"nodeType":"YulLeave","src":"34310:5:111"}]},"condition":{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"34268:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"34276:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"34265:2:111"},"nodeType":"YulFunctionCall","src":"34265:14:111"},{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"34288:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"34296:4:111","type":"","value":"0x24"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34284:3:111"},"nodeType":"YulFunctionCall","src":"34284:17:111"},{"name":"_2","nodeType":"YulIdentifier","src":"34303:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"34281:2:111"},"nodeType":"YulFunctionCall","src":"34281:25:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"34262:2:111"},"nodeType":"YulFunctionCall","src":"34262:45:111"},"nodeType":"YulIf","src":"34259:58:111"},{"nodeType":"YulVariableDeclaration","src":"34326:28:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"34341:4:111"},{"name":"offset","nodeType":"YulIdentifier","src":"34347:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34337:3:111"},"nodeType":"YulFunctionCall","src":"34337:17:111"},"variables":[{"name":"msg","nodeType":"YulTypedName","src":"34330:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"34363:24:111","value":{"arguments":[{"name":"msg","nodeType":"YulIdentifier","src":"34383:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"34377:5:111"},"nodeType":"YulFunctionCall","src":"34377:10:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"34367:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"34414:9:111","statements":[{"nodeType":"YulLeave","src":"34416:5:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"34402:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"34410:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"34399:2:111"},"nodeType":"YulFunctionCall","src":"34399:14:111"},"nodeType":"YulIf","src":"34396:27:111"},{"body":{"nodeType":"YulBlock","src":"34505:9:111","statements":[{"nodeType":"YulLeave","src":"34507:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"msg","nodeType":"YulIdentifier","src":"34446:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"34451:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34442:3:111"},"nodeType":"YulFunctionCall","src":"34442:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"34460:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34438:3:111"},"nodeType":"YulFunctionCall","src":"34438:27:111"},{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"34475:4:111"},{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"34481:14:111"},"nodeType":"YulFunctionCall","src":"34481:16:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34471:3:111"},"nodeType":"YulFunctionCall","src":"34471:27:111"},{"name":"_1","nodeType":"YulIdentifier","src":"34500:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34467:3:111"},"nodeType":"YulFunctionCall","src":"34467:36:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"34435:2:111"},"nodeType":"YulFunctionCall","src":"34435:69:111"},"nodeType":"YulIf","src":"34432:82:111"},{"expression":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"34543:4:111"},{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"34557:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"34565:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34553:3:111"},"nodeType":"YulFunctionCall","src":"34553:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"34574:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34549:3:111"},"nodeType":"YulFunctionCall","src":"34549:30:111"}],"functionName":{"name":"finalize_allocation","nodeType":"YulIdentifier","src":"34523:19:111"},"nodeType":"YulFunctionCall","src":"34523:57:111"},"nodeType":"YulExpressionStatement","src":"34523:57:111"},{"nodeType":"YulAssignment","src":"34589:10:111","value":{"name":"msg","nodeType":"YulIdentifier","src":"34596:3:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"34589:3:111"}]}]},"name":"try_decode_error_message","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"33913:3:111","type":""}],"src":"33874:731:111"},{"body":{"nodeType":"YulBlock","src":"34840:201:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"34857:3:111"},{"hexValue":"4141353020706f73744f702072657665727465643a20","kind":"string","nodeType":"YulLiteral","src":"34862:24:111","type":"","value":"AA50 postOp reverted: "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"34850:6:111"},"nodeType":"YulFunctionCall","src":"34850:37:111"},"nodeType":"YulExpressionStatement","src":"34850:37:111"},{"nodeType":"YulVariableDeclaration","src":"34896:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"34916:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"34910:5:111"},"nodeType":"YulFunctionCall","src":"34910:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"34900:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"34958:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"34966:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34954:3:111"},"nodeType":"YulFunctionCall","src":"34954:17:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"34977:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"34982:2:111","type":"","value":"22"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"34973:3:111"},"nodeType":"YulFunctionCall","src":"34973:12:111"},{"name":"length","nodeType":"YulIdentifier","src":"34987:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"34932:21:111"},"nodeType":"YulFunctionCall","src":"34932:62:111"},"nodeType":"YulExpressionStatement","src":"34932:62:111"},{"nodeType":"YulAssignment","src":"35003:32:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"35018:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"35023:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35014:3:111"},"nodeType":"YulFunctionCall","src":"35014:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"35032:2:111","type":"","value":"22"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35010:3:111"},"nodeType":"YulFunctionCall","src":"35010:25:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"35003:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023_t_string_memory_ptr__to_t_bytes22_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"34816:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"34821:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"34832:3:111","type":""}],"src":"34610:431:111"},{"body":{"nodeType":"YulBlock","src":"35195:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35212:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"35223:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35205:6:111"},"nodeType":"YulFunctionCall","src":"35205:25:111"},"nodeType":"YulExpressionStatement","src":"35205:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35250:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35261:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35246:3:111"},"nodeType":"YulFunctionCall","src":"35246:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"35266:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35239:6:111"},"nodeType":"YulFunctionCall","src":"35239:30:111"},"nodeType":"YulExpressionStatement","src":"35239:30:111"},{"nodeType":"YulAssignment","src":"35278:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"35303:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35315:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35326:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35311:3:111"},"nodeType":"YulFunctionCall","src":"35311:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"35286:16:111"},"nodeType":"YulFunctionCall","src":"35286:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"35278:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"35156:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"35167:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"35175:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"35186:4:111","type":""}],"src":"35046:290:111"},{"body":{"nodeType":"YulBlock","src":"35543:212:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35560:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"35571:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35553:6:111"},"nodeType":"YulFunctionCall","src":"35553:25:111"},"nodeType":"YulExpressionStatement","src":"35553:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35598:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35609:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35594:3:111"},"nodeType":"YulFunctionCall","src":"35594:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"35614:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35587:6:111"},"nodeType":"YulFunctionCall","src":"35587:30:111"},"nodeType":"YulExpressionStatement","src":"35587:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35637:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35648:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35633:3:111"},"nodeType":"YulFunctionCall","src":"35633:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"35653:2:111","type":"","value":"18"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35626:6:111"},"nodeType":"YulFunctionCall","src":"35626:30:111"},"nodeType":"YulExpressionStatement","src":"35626:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35676:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35687:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35672:3:111"},"nodeType":"YulFunctionCall","src":"35672:18:111"},{"hexValue":"4141353020706f73744f7020726576657274","kind":"string","nodeType":"YulLiteral","src":"35692:20:111","type":"","value":"AA50 postOp revert"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35665:6:111"},"nodeType":"YulFunctionCall","src":"35665:48:111"},"nodeType":"YulExpressionStatement","src":"35665:48:111"},{"nodeType":"YulAssignment","src":"35722:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"35745:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"35730:3:111"},"nodeType":"YulFunctionCall","src":"35730:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"35722:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"35512:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"35523:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"35534:4:111","type":""}],"src":"35341:414:111"},{"body":{"nodeType":"YulBlock","src":"35962:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"35979:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"35990:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"35972:6:111"},"nodeType":"YulFunctionCall","src":"35972:25:111"},"nodeType":"YulExpressionStatement","src":"35972:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36017:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36028:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36013:3:111"},"nodeType":"YulFunctionCall","src":"36013:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"36033:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36006:6:111"},"nodeType":"YulFunctionCall","src":"36006:30:111"},"nodeType":"YulExpressionStatement","src":"36006:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36056:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36067:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36052:3:111"},"nodeType":"YulFunctionCall","src":"36052:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"36072:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36045:6:111"},"nodeType":"YulFunctionCall","src":"36045:30:111"},"nodeType":"YulExpressionStatement","src":"36045:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36095:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36106:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36091:3:111"},"nodeType":"YulFunctionCall","src":"36091:18:111"},{"hexValue":"414135312070726566756e642062656c6f772061637475616c476173436f7374","kind":"string","nodeType":"YulLiteral","src":"36111:34:111","type":"","value":"AA51 prefund below actualGasCost"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36084:6:111"},"nodeType":"YulFunctionCall","src":"36084:62:111"},"nodeType":"YulExpressionStatement","src":"36084:62:111"},{"nodeType":"YulAssignment","src":"36155:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36167:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36178:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36163:3:111"},"nodeType":"YulFunctionCall","src":"36163:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"36155:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"35931:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"35942:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"35953:4:111","type":""}],"src":"35760:428:111"},{"body":{"nodeType":"YulBlock","src":"36372:222:111","statements":[{"nodeType":"YulAssignment","src":"36382:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36394:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36405:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36390:3:111"},"nodeType":"YulFunctionCall","src":"36390:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"36382:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36425:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"36436:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36418:6:111"},"nodeType":"YulFunctionCall","src":"36418:25:111"},"nodeType":"YulExpressionStatement","src":"36418:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36463:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36474:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36459:3:111"},"nodeType":"YulFunctionCall","src":"36459:18:111"},{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"36493:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"36486:6:111"},"nodeType":"YulFunctionCall","src":"36486:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"36479:6:111"},"nodeType":"YulFunctionCall","src":"36479:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36452:6:111"},"nodeType":"YulFunctionCall","src":"36452:50:111"},"nodeType":"YulExpressionStatement","src":"36452:50:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36522:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36533:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36518:3:111"},"nodeType":"YulFunctionCall","src":"36518:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"36538:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36511:6:111"},"nodeType":"YulFunctionCall","src":"36511:34:111"},"nodeType":"YulExpressionStatement","src":"36511:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36565:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36576:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36561:3:111"},"nodeType":"YulFunctionCall","src":"36561:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"36581:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36554:6:111"},"nodeType":"YulFunctionCall","src":"36554:34:111"},"nodeType":"YulExpressionStatement","src":"36554:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_bool_t_uint256_t_uint256__to_t_uint256_t_bool_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"36317:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"36328:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"36336:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"36344:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"36352:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"36363:4:111","type":""}],"src":"36193:401:111"},{"body":{"nodeType":"YulBlock","src":"36773:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36790:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36801:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36783:6:111"},"nodeType":"YulFunctionCall","src":"36783:21:111"},"nodeType":"YulExpressionStatement","src":"36783:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36824:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36835:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36820:3:111"},"nodeType":"YulFunctionCall","src":"36820:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"36840:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36813:6:111"},"nodeType":"YulFunctionCall","src":"36813:30:111"},"nodeType":"YulExpressionStatement","src":"36813:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36874:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36859:3:111"},"nodeType":"YulFunctionCall","src":"36859:18:111"},{"hexValue":"5265656e7472616e637947756172643a207265656e7472616e742063616c6c","kind":"string","nodeType":"YulLiteral","src":"36879:33:111","type":"","value":"ReentrancyGuard: reentrant call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"36852:6:111"},"nodeType":"YulFunctionCall","src":"36852:61:111"},"nodeType":"YulExpressionStatement","src":"36852:61:111"},{"nodeType":"YulAssignment","src":"36922:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"36934:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"36945:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"36930:3:111"},"nodeType":"YulFunctionCall","src":"36930:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"36922:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"36750:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"36764:4:111","type":""}],"src":"36599:355:111"},{"body":{"nodeType":"YulBlock","src":"37133:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37150:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37161:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37143:6:111"},"nodeType":"YulFunctionCall","src":"37143:21:111"},"nodeType":"YulExpressionStatement","src":"37143:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37195:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37180:3:111"},"nodeType":"YulFunctionCall","src":"37180:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"37200:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37173:6:111"},"nodeType":"YulFunctionCall","src":"37173:30:111"},"nodeType":"YulExpressionStatement","src":"37173:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37234:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37219:3:111"},"nodeType":"YulFunctionCall","src":"37219:18:111"},{"hexValue":"41413934206761732076616c756573206f766572666c6f77","kind":"string","nodeType":"YulLiteral","src":"37239:26:111","type":"","value":"AA94 gas values overflow"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37212:6:111"},"nodeType":"YulFunctionCall","src":"37212:54:111"},"nodeType":"YulExpressionStatement","src":"37212:54:111"},{"nodeType":"YulAssignment","src":"37275:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37287:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37298:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37283:3:111"},"nodeType":"YulFunctionCall","src":"37283:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"37275:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"37110:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"37124:4:111","type":""}],"src":"36959:348:111"},{"body":{"nodeType":"YulBlock","src":"37514:220:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37531:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"37542:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37524:6:111"},"nodeType":"YulFunctionCall","src":"37524:25:111"},"nodeType":"YulExpressionStatement","src":"37524:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37569:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37580:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37565:3:111"},"nodeType":"YulFunctionCall","src":"37565:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"37585:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37558:6:111"},"nodeType":"YulFunctionCall","src":"37558:30:111"},"nodeType":"YulExpressionStatement","src":"37558:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37608:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37619:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37604:3:111"},"nodeType":"YulFunctionCall","src":"37604:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"37624:2:111","type":"","value":"26"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37597:6:111"},"nodeType":"YulFunctionCall","src":"37597:30:111"},"nodeType":"YulExpressionStatement","src":"37597:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37647:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37658:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37643:3:111"},"nodeType":"YulFunctionCall","src":"37643:18:111"},{"hexValue":"4141323520696e76616c6964206163636f756e74206e6f6e6365","kind":"string","nodeType":"YulLiteral","src":"37663:28:111","type":"","value":"AA25 invalid account nonce"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37636:6:111"},"nodeType":"YulFunctionCall","src":"37636:56:111"},"nodeType":"YulExpressionStatement","src":"37636:56:111"},{"nodeType":"YulAssignment","src":"37701:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"37724:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37709:3:111"},"nodeType":"YulFunctionCall","src":"37709:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"37701:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"37483:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"37494:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"37505:4:111","type":""}],"src":"37312:422:111"},{"body":{"nodeType":"YulBlock","src":"37941:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37958:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"37969:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37951:6:111"},"nodeType":"YulFunctionCall","src":"37951:25:111"},"nodeType":"YulExpressionStatement","src":"37951:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"37996:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38007:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"37992:3:111"},"nodeType":"YulFunctionCall","src":"37992:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38012:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"37985:6:111"},"nodeType":"YulFunctionCall","src":"37985:30:111"},"nodeType":"YulExpressionStatement","src":"37985:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38035:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38046:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38031:3:111"},"nodeType":"YulFunctionCall","src":"38031:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38051:2:111","type":"","value":"30"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38024:6:111"},"nodeType":"YulFunctionCall","src":"38024:30:111"},"nodeType":"YulExpressionStatement","src":"38024:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38074:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38085:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38070:3:111"},"nodeType":"YulFunctionCall","src":"38070:18:111"},{"hexValue":"41413430206f76657220766572696669636174696f6e4761734c696d6974","kind":"string","nodeType":"YulLiteral","src":"38090:32:111","type":"","value":"AA40 over verificationGasLimit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38063:6:111"},"nodeType":"YulFunctionCall","src":"38063:60:111"},"nodeType":"YulExpressionStatement","src":"38063:60:111"},{"nodeType":"YulAssignment","src":"38132:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38155:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38140:3:111"},"nodeType":"YulFunctionCall","src":"38140:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"38132:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"37910:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"37921:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"37932:4:111","type":""}],"src":"37739:426:111"},{"body":{"nodeType":"YulBlock","src":"38372:214:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38389:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"38400:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38382:6:111"},"nodeType":"YulFunctionCall","src":"38382:25:111"},"nodeType":"YulExpressionStatement","src":"38382:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38427:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38438:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38423:3:111"},"nodeType":"YulFunctionCall","src":"38423:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38443:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38416:6:111"},"nodeType":"YulFunctionCall","src":"38416:30:111"},"nodeType":"YulExpressionStatement","src":"38416:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38466:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38477:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38462:3:111"},"nodeType":"YulFunctionCall","src":"38462:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38482:2:111","type":"","value":"20"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38455:6:111"},"nodeType":"YulFunctionCall","src":"38455:30:111"},"nodeType":"YulExpressionStatement","src":"38455:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38505:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38516:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38501:3:111"},"nodeType":"YulFunctionCall","src":"38501:18:111"},{"hexValue":"41413234207369676e6174757265206572726f72","kind":"string","nodeType":"YulLiteral","src":"38521:22:111","type":"","value":"AA24 signature error"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38494:6:111"},"nodeType":"YulFunctionCall","src":"38494:50:111"},"nodeType":"YulExpressionStatement","src":"38494:50:111"},{"nodeType":"YulAssignment","src":"38553:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38565:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38576:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38561:3:111"},"nodeType":"YulFunctionCall","src":"38561:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"38553:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"38341:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"38352:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"38363:4:111","type":""}],"src":"38170:416:111"},{"body":{"nodeType":"YulBlock","src":"38793:217:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38810:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"38821:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38803:6:111"},"nodeType":"YulFunctionCall","src":"38803:25:111"},"nodeType":"YulExpressionStatement","src":"38803:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38848:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38859:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38844:3:111"},"nodeType":"YulFunctionCall","src":"38844:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38864:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38837:6:111"},"nodeType":"YulFunctionCall","src":"38837:30:111"},"nodeType":"YulExpressionStatement","src":"38837:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38887:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38898:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38883:3:111"},"nodeType":"YulFunctionCall","src":"38883:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"38903:2:111","type":"","value":"23"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38876:6:111"},"nodeType":"YulFunctionCall","src":"38876:30:111"},"nodeType":"YulExpressionStatement","src":"38876:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38926:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"38937:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38922:3:111"},"nodeType":"YulFunctionCall","src":"38922:18:111"},{"hexValue":"414132322065787069726564206f72206e6f7420647565","kind":"string","nodeType":"YulLiteral","src":"38942:25:111","type":"","value":"AA22 expired or not due"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"38915:6:111"},"nodeType":"YulFunctionCall","src":"38915:53:111"},"nodeType":"YulExpressionStatement","src":"38915:53:111"},{"nodeType":"YulAssignment","src":"38977:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"38989:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39000:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"38985:3:111"},"nodeType":"YulFunctionCall","src":"38985:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"38977:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"38762:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"38773:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"38784:4:111","type":""}],"src":"38591:419:111"},{"body":{"nodeType":"YulBlock","src":"39217:214:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39234:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"39245:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39227:6:111"},"nodeType":"YulFunctionCall","src":"39227:25:111"},"nodeType":"YulExpressionStatement","src":"39227:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39272:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39283:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39268:3:111"},"nodeType":"YulFunctionCall","src":"39268:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"39288:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39261:6:111"},"nodeType":"YulFunctionCall","src":"39261:30:111"},"nodeType":"YulExpressionStatement","src":"39261:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39311:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39322:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39307:3:111"},"nodeType":"YulFunctionCall","src":"39307:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"39327:2:111","type":"","value":"20"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39300:6:111"},"nodeType":"YulFunctionCall","src":"39300:30:111"},"nodeType":"YulExpressionStatement","src":"39300:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39361:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39346:3:111"},"nodeType":"YulFunctionCall","src":"39346:18:111"},{"hexValue":"41413334207369676e6174757265206572726f72","kind":"string","nodeType":"YulLiteral","src":"39366:22:111","type":"","value":"AA34 signature error"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39339:6:111"},"nodeType":"YulFunctionCall","src":"39339:50:111"},"nodeType":"YulExpressionStatement","src":"39339:50:111"},{"nodeType":"YulAssignment","src":"39398:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39410:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39421:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39406:3:111"},"nodeType":"YulFunctionCall","src":"39406:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"39398:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"39186:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"39197:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"39208:4:111","type":""}],"src":"39015:416:111"},{"body":{"nodeType":"YulBlock","src":"39638:267:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39655:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"39666:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39648:6:111"},"nodeType":"YulFunctionCall","src":"39648:25:111"},"nodeType":"YulExpressionStatement","src":"39648:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39693:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39704:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39689:3:111"},"nodeType":"YulFunctionCall","src":"39689:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"39709:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39682:6:111"},"nodeType":"YulFunctionCall","src":"39682:30:111"},"nodeType":"YulExpressionStatement","src":"39682:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39732:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39743:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39728:3:111"},"nodeType":"YulFunctionCall","src":"39728:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"39748:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39721:6:111"},"nodeType":"YulFunctionCall","src":"39721:30:111"},"nodeType":"YulExpressionStatement","src":"39721:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39771:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39782:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39767:3:111"},"nodeType":"YulFunctionCall","src":"39767:18:111"},{"hexValue":"41413332207061796d61737465722065787069726564206f72206e6f74206475","kind":"string","nodeType":"YulLiteral","src":"39787:34:111","type":"","value":"AA32 paymaster expired or not du"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39760:6:111"},"nodeType":"YulFunctionCall","src":"39760:62:111"},"nodeType":"YulExpressionStatement","src":"39760:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39842:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39853:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39838:3:111"},"nodeType":"YulFunctionCall","src":"39838:19:111"},{"hexValue":"65","kind":"string","nodeType":"YulLiteral","src":"39859:3:111","type":"","value":"e"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"39831:6:111"},"nodeType":"YulFunctionCall","src":"39831:32:111"},"nodeType":"YulExpressionStatement","src":"39831:32:111"},{"nodeType":"YulAssignment","src":"39872:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"39884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"39895:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"39880:3:111"},"nodeType":"YulFunctionCall","src":"39880:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"39872:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"39607:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"39618:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"39629:4:111","type":""}],"src":"39436:469:111"},{"body":{"nodeType":"YulBlock","src":"40169:1044:111","statements":[{"nodeType":"YulVariableDeclaration","src":"40179:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"40189:3:111","type":"","value":"448"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"40183:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40208:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"40219:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40201:6:111"},"nodeType":"YulFunctionCall","src":"40201:21:111"},"nodeType":"YulExpressionStatement","src":"40201:21:111"},{"nodeType":"YulVariableDeclaration","src":"40231:75:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"40271:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"40279:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40291:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"40302:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40287:3:111"},"nodeType":"YulFunctionCall","src":"40287:18:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"40245:25:111"},"nodeType":"YulFunctionCall","src":"40245:61:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"40235:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"40315:23:111","value":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"40331:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40325:5:111"},"nodeType":"YulFunctionCall","src":"40325:13:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"40319:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"40347:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"40357:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"40351:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40419:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40430:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40415:3:111"},"nodeType":"YulFunctionCall","src":"40415:18:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40445:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40439:5:111"},"nodeType":"YulFunctionCall","src":"40439:9:111"},{"name":"_3","nodeType":"YulIdentifier","src":"40450:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"40435:3:111"},"nodeType":"YulFunctionCall","src":"40435:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40408:6:111"},"nodeType":"YulFunctionCall","src":"40408:46:111"},"nodeType":"YulExpressionStatement","src":"40408:46:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40474:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40485:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40470:3:111"},"nodeType":"YulFunctionCall","src":"40470:18:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40500:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40496:3:111"},"nodeType":"YulFunctionCall","src":"40496:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40490:5:111"},"nodeType":"YulFunctionCall","src":"40490:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40463:6:111"},"nodeType":"YulFunctionCall","src":"40463:46:111"},"nodeType":"YulExpressionStatement","src":"40463:46:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40540:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40525:3:111"},"nodeType":"YulFunctionCall","src":"40525:18:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40555:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40559:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40551:3:111"},"nodeType":"YulFunctionCall","src":"40551:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40545:5:111"},"nodeType":"YulFunctionCall","src":"40545:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40518:6:111"},"nodeType":"YulFunctionCall","src":"40518:46:111"},"nodeType":"YulExpressionStatement","src":"40518:46:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40584:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40595:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40580:3:111"},"nodeType":"YulFunctionCall","src":"40580:19:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40611:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40615:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40607:3:111"},"nodeType":"YulFunctionCall","src":"40607:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40601:5:111"},"nodeType":"YulFunctionCall","src":"40601:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40573:6:111"},"nodeType":"YulFunctionCall","src":"40573:47:111"},"nodeType":"YulExpressionStatement","src":"40573:47:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40640:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40651:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40636:3:111"},"nodeType":"YulFunctionCall","src":"40636:19:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40667:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40671:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40663:3:111"},"nodeType":"YulFunctionCall","src":"40663:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40657:5:111"},"nodeType":"YulFunctionCall","src":"40657:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40629:6:111"},"nodeType":"YulFunctionCall","src":"40629:48:111"},"nodeType":"YulExpressionStatement","src":"40629:48:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40697:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40708:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40693:3:111"},"nodeType":"YulFunctionCall","src":"40693:19:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40728:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40732:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40724:3:111"},"nodeType":"YulFunctionCall","src":"40724:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40718:5:111"},"nodeType":"YulFunctionCall","src":"40718:19:111"},{"name":"_3","nodeType":"YulIdentifier","src":"40739:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"40714:3:111"},"nodeType":"YulFunctionCall","src":"40714:28:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40686:6:111"},"nodeType":"YulFunctionCall","src":"40686:57:111"},"nodeType":"YulExpressionStatement","src":"40686:57:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40774:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40759:3:111"},"nodeType":"YulFunctionCall","src":"40759:19:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40790:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40794:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40786:3:111"},"nodeType":"YulFunctionCall","src":"40786:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40780:5:111"},"nodeType":"YulFunctionCall","src":"40780:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40752:6:111"},"nodeType":"YulFunctionCall","src":"40752:48:111"},"nodeType":"YulExpressionStatement","src":"40752:48:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40820:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40831:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40816:3:111"},"nodeType":"YulFunctionCall","src":"40816:19:111"},{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"40847:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"40851:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40843:3:111"},"nodeType":"YulFunctionCall","src":"40843:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40837:5:111"},"nodeType":"YulFunctionCall","src":"40837:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40809:6:111"},"nodeType":"YulFunctionCall","src":"40809:48:111"},"nodeType":"YulExpressionStatement","src":"40809:48:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40877:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40888:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40873:3:111"},"nodeType":"YulFunctionCall","src":"40873:19:111"},{"arguments":[{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"40904:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"40912:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40900:3:111"},"nodeType":"YulFunctionCall","src":"40900:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40894:5:111"},"nodeType":"YulFunctionCall","src":"40894:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40866:6:111"},"nodeType":"YulFunctionCall","src":"40866:51:111"},"nodeType":"YulExpressionStatement","src":"40866:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40937:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"40948:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40933:3:111"},"nodeType":"YulFunctionCall","src":"40933:19:111"},{"arguments":[{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"40964:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"40972:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40960:3:111"},"nodeType":"YulFunctionCall","src":"40960:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"40954:5:111"},"nodeType":"YulFunctionCall","src":"40954:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40926:6:111"},"nodeType":"YulFunctionCall","src":"40926:51:111"},"nodeType":"YulExpressionStatement","src":"40926:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"40997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41008:3:111","type":"","value":"352"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"40993:3:111"},"nodeType":"YulFunctionCall","src":"40993:19:111"},{"arguments":[{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"41024:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"41032:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41020:3:111"},"nodeType":"YulFunctionCall","src":"41020:15:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"41014:5:111"},"nodeType":"YulFunctionCall","src":"41014:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"40986:6:111"},"nodeType":"YulFunctionCall","src":"40986:51:111"},"nodeType":"YulExpressionStatement","src":"40986:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41057:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41068:3:111","type":"","value":"384"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41053:3:111"},"nodeType":"YulFunctionCall","src":"41053:19:111"},{"arguments":[{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"41084:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"41092:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41080:3:111"},"nodeType":"YulFunctionCall","src":"41080:16:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"41074:5:111"},"nodeType":"YulFunctionCall","src":"41074:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41046:6:111"},"nodeType":"YulFunctionCall","src":"41046:52:111"},"nodeType":"YulExpressionStatement","src":"41046:52:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41118:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41129:3:111","type":"","value":"416"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41114:3:111"},"nodeType":"YulFunctionCall","src":"41114:19:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"41139:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"41147:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"41135:3:111"},"nodeType":"YulFunctionCall","src":"41135:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41107:6:111"},"nodeType":"YulFunctionCall","src":"41107:51:111"},"nodeType":"YulExpressionStatement","src":"41107:51:111"},{"nodeType":"YulAssignment","src":"41167:40:111","value":{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"41192:6:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"41200:6:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"41175:16:111"},"nodeType":"YulFunctionCall","src":"41175:32:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"41167:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_calldata_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"40114:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"40125:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"40133:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"40141:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"40149:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"40160:4:111","type":""}],"src":"39910:1303:111"},{"body":{"nodeType":"YulBlock","src":"41299:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"41345:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"41354:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"41357:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"41347:6:111"},"nodeType":"YulFunctionCall","src":"41347:12:111"},"nodeType":"YulExpressionStatement","src":"41347:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"41320:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"41329:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"41316:3:111"},"nodeType":"YulFunctionCall","src":"41316:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"41341:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"41312:3:111"},"nodeType":"YulFunctionCall","src":"41312:32:111"},"nodeType":"YulIf","src":"41309:52:111"},{"nodeType":"YulAssignment","src":"41370:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41386:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"41380:5:111"},"nodeType":"YulFunctionCall","src":"41380:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"41370:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"41265:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"41276:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"41288:6:111","type":""}],"src":"41218:184:111"},{"body":{"nodeType":"YulBlock","src":"41609:209:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41626:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"41637:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41619:6:111"},"nodeType":"YulFunctionCall","src":"41619:25:111"},"nodeType":"YulExpressionStatement","src":"41619:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41664:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41675:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41660:3:111"},"nodeType":"YulFunctionCall","src":"41660:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"41680:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41653:6:111"},"nodeType":"YulFunctionCall","src":"41653:30:111"},"nodeType":"YulExpressionStatement","src":"41653:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41703:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41714:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41699:3:111"},"nodeType":"YulFunctionCall","src":"41699:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"41719:2:111","type":"","value":"15"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41692:6:111"},"nodeType":"YulFunctionCall","src":"41692:30:111"},"nodeType":"YulExpressionStatement","src":"41692:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41742:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41753:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41738:3:111"},"nodeType":"YulFunctionCall","src":"41738:18:111"},{"hexValue":"41413935206f7574206f6620676173","kind":"string","nodeType":"YulLiteral","src":"41758:17:111","type":"","value":"AA95 out of gas"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"41731:6:111"},"nodeType":"YulFunctionCall","src":"41731:45:111"},"nodeType":"YulExpressionStatement","src":"41731:45:111"},{"nodeType":"YulAssignment","src":"41785:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"41797:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"41808:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"41793:3:111"},"nodeType":"YulFunctionCall","src":"41793:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"41785:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"41578:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"41589:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"41600:4:111","type":""}],"src":"41407:411:111"},{"body":{"nodeType":"YulBlock","src":"41997:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42014:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42025:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42007:6:111"},"nodeType":"YulFunctionCall","src":"42007:21:111"},"nodeType":"YulExpressionStatement","src":"42007:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42048:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42059:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42044:3:111"},"nodeType":"YulFunctionCall","src":"42044:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"42064:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42037:6:111"},"nodeType":"YulFunctionCall","src":"42037:30:111"},"nodeType":"YulExpressionStatement","src":"42037:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42087:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42098:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42083:3:111"},"nodeType":"YulFunctionCall","src":"42083:18:111"},{"hexValue":"4141393020696e76616c69642062656e6566696369617279","kind":"string","nodeType":"YulLiteral","src":"42103:26:111","type":"","value":"AA90 invalid beneficiary"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42076:6:111"},"nodeType":"YulFunctionCall","src":"42076:54:111"},"nodeType":"YulExpressionStatement","src":"42076:54:111"},{"nodeType":"YulAssignment","src":"42139:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42151:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42162:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42147:3:111"},"nodeType":"YulFunctionCall","src":"42147:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"42139:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"41974:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"41988:4:111","type":""}],"src":"41823:348:111"},{"body":{"nodeType":"YulBlock","src":"42350:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42367:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42378:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42360:6:111"},"nodeType":"YulFunctionCall","src":"42360:21:111"},"nodeType":"YulExpressionStatement","src":"42360:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42412:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42397:3:111"},"nodeType":"YulFunctionCall","src":"42397:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"42417:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42390:6:111"},"nodeType":"YulFunctionCall","src":"42390:30:111"},"nodeType":"YulExpressionStatement","src":"42390:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42451:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42436:3:111"},"nodeType":"YulFunctionCall","src":"42436:18:111"},{"hexValue":"41413931206661696c65642073656e6420746f2062656e6566696369617279","kind":"string","nodeType":"YulLiteral","src":"42456:33:111","type":"","value":"AA91 failed send to beneficiary"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42429:6:111"},"nodeType":"YulFunctionCall","src":"42429:61:111"},"nodeType":"YulExpressionStatement","src":"42429:61:111"},{"nodeType":"YulAssignment","src":"42499:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42511:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42522:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42507:3:111"},"nodeType":"YulFunctionCall","src":"42507:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"42499:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"42327:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"42341:4:111","type":""}],"src":"42176:355:111"},{"body":{"nodeType":"YulBlock","src":"42749:338:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42766:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42777:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42759:6:111"},"nodeType":"YulFunctionCall","src":"42759:21:111"},"nodeType":"YulExpressionStatement","src":"42759:21:111"},{"nodeType":"YulVariableDeclaration","src":"42789:75:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"42829:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"42837:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42849:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42860:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42845:3:111"},"nodeType":"YulFunctionCall","src":"42845:18:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"42803:25:111"},"nodeType":"YulFunctionCall","src":"42803:61:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"42793:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42895:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42880:3:111"},"nodeType":"YulFunctionCall","src":"42880:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"42904:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"42912:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"42900:3:111"},"nodeType":"YulFunctionCall","src":"42900:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42873:6:111"},"nodeType":"YulFunctionCall","src":"42873:83:111"},"nodeType":"YulExpressionStatement","src":"42873:83:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"42976:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"42987:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"42972:3:111"},"nodeType":"YulFunctionCall","src":"42972:18:111"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"42996:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"43004:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"42992:3:111"},"nodeType":"YulFunctionCall","src":"42992:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"42965:6:111"},"nodeType":"YulFunctionCall","src":"42965:50:111"},"nodeType":"YulExpressionStatement","src":"42965:50:111"},{"nodeType":"YulAssignment","src":"43024:57:111","value":{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"43058:6:111"},{"name":"value4","nodeType":"YulIdentifier","src":"43066:6:111"},{"name":"tail_1","nodeType":"YulIdentifier","src":"43074:6:111"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"43032:25:111"},"nodeType":"YulFunctionCall","src":"43032:49:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"43024:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_calldata_ptr_t_address_t_bytes_calldata_ptr__to_t_bytes_memory_ptr_t_address_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"42686:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"42697:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"42705:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"42713:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"42721:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"42729:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"42740:4:111","type":""}],"src":"42536:551:111"},{"body":{"nodeType":"YulBlock","src":"43249:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43266:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"43277:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43259:6:111"},"nodeType":"YulFunctionCall","src":"43259:25:111"},"nodeType":"YulExpressionStatement","src":"43259:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43304:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43315:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"43300:3:111"},"nodeType":"YulFunctionCall","src":"43300:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"43320:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43293:6:111"},"nodeType":"YulFunctionCall","src":"43293:30:111"},"nodeType":"YulExpressionStatement","src":"43293:30:111"},{"nodeType":"YulAssignment","src":"43332:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"43357:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43369:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43380:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"43365:3:111"},"nodeType":"YulFunctionCall","src":"43365:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"43340:16:111"},"nodeType":"YulFunctionCall","src":"43340:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"43332:4:111"}]}]},"name":"abi_encode_tuple_t_rational_0_by_1_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"43210:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"43221:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"43229:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"43240:4:111","type":""}],"src":"43092:298:111"},{"body":{"nodeType":"YulBlock","src":"43569:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43586:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43597:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43579:6:111"},"nodeType":"YulFunctionCall","src":"43579:21:111"},"nodeType":"YulExpressionStatement","src":"43579:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43620:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43631:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"43616:3:111"},"nodeType":"YulFunctionCall","src":"43616:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"43636:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43609:6:111"},"nodeType":"YulFunctionCall","src":"43609:30:111"},"nodeType":"YulExpressionStatement","src":"43609:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43659:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43670:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"43655:3:111"},"nodeType":"YulFunctionCall","src":"43655:18:111"},{"hexValue":"4141393320696e76616c6964207061796d6173746572416e6444617461","kind":"string","nodeType":"YulLiteral","src":"43675:31:111","type":"","value":"AA93 invalid paymasterAndData"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43648:6:111"},"nodeType":"YulFunctionCall","src":"43648:59:111"},"nodeType":"YulExpressionStatement","src":"43648:59:111"},{"nodeType":"YulAssignment","src":"43716:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43728:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"43739:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"43724:3:111"},"nodeType":"YulFunctionCall","src":"43724:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"43716:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"43546:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"43560:4:111","type":""}],"src":"43395:353:111"},{"body":{"nodeType":"YulBlock","src":"43976:208:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"43993:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44004:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"43986:6:111"},"nodeType":"YulFunctionCall","src":"43986:21:111"},"nodeType":"YulExpressionStatement","src":"43986:21:111"},{"nodeType":"YulAssignment","src":"44016:76:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"44065:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44077:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44088:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44073:3:111"},"nodeType":"YulFunctionCall","src":"44073:18:111"}],"functionName":{"name":"abi_encode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"44024:40:111"},"nodeType":"YulFunctionCall","src":"44024:68:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"44016:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44112:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44123:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44108:3:111"},"nodeType":"YulFunctionCall","src":"44108:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"44128:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44101:6:111"},"nodeType":"YulFunctionCall","src":"44101:34:111"},"nodeType":"YulExpressionStatement","src":"44101:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44155:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44166:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44151:3:111"},"nodeType":"YulFunctionCall","src":"44151:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"44171:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44144:6:111"},"nodeType":"YulFunctionCall","src":"44144:34:111"},"nodeType":"YulExpressionStatement","src":"44144:34:111"}]},"name":"abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr_t_bytes32_t_uint256__to_t_struct$_UserOperation_$10993_memory_ptr_t_bytes32_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"43929:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"43940:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"43948:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"43956:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"43967:4:111","type":""}],"src":"43753:431:111"},{"body":{"nodeType":"YulBlock","src":"44419:194:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"44436:3:111"},{"hexValue":"414132332072657665727465643a20","kind":"string","nodeType":"YulLiteral","src":"44441:17:111","type":"","value":"AA23 reverted: "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44429:6:111"},"nodeType":"YulFunctionCall","src":"44429:30:111"},"nodeType":"YulExpressionStatement","src":"44429:30:111"},{"nodeType":"YulVariableDeclaration","src":"44468:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"44488:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"44482:5:111"},"nodeType":"YulFunctionCall","src":"44482:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"44472:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"44530:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"44538:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44526:3:111"},"nodeType":"YulFunctionCall","src":"44526:17:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"44549:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"44554:2:111","type":"","value":"15"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44545:3:111"},"nodeType":"YulFunctionCall","src":"44545:12:111"},{"name":"length","nodeType":"YulIdentifier","src":"44559:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"44504:21:111"},"nodeType":"YulFunctionCall","src":"44504:62:111"},"nodeType":"YulExpressionStatement","src":"44504:62:111"},{"nodeType":"YulAssignment","src":"44575:32:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"44590:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"44595:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44586:3:111"},"nodeType":"YulFunctionCall","src":"44586:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"44604:2:111","type":"","value":"15"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44582:3:111"},"nodeType":"YulFunctionCall","src":"44582:25:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"44575:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"44395:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"44400:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"44411:3:111","type":""}],"src":"44189:424:111"},{"body":{"nodeType":"YulBlock","src":"44820:216:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44837:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"44848:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44830:6:111"},"nodeType":"YulFunctionCall","src":"44830:25:111"},"nodeType":"YulExpressionStatement","src":"44830:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44875:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44886:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44871:3:111"},"nodeType":"YulFunctionCall","src":"44871:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"44891:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44864:6:111"},"nodeType":"YulFunctionCall","src":"44864:30:111"},"nodeType":"YulExpressionStatement","src":"44864:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44914:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44925:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44910:3:111"},"nodeType":"YulFunctionCall","src":"44910:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"44930:2:111","type":"","value":"22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44903:6:111"},"nodeType":"YulFunctionCall","src":"44903:30:111"},"nodeType":"YulExpressionStatement","src":"44903:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"44953:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"44964:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"44949:3:111"},"nodeType":"YulFunctionCall","src":"44949:18:111"},{"hexValue":"4141323320726576657274656420286f72204f4f4729","kind":"string","nodeType":"YulLiteral","src":"44969:24:111","type":"","value":"AA23 reverted (or OOG)"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"44942:6:111"},"nodeType":"YulFunctionCall","src":"44942:52:111"},"nodeType":"YulExpressionStatement","src":"44942:52:111"},{"nodeType":"YulAssignment","src":"45003:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45015:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45026:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45011:3:111"},"nodeType":"YulFunctionCall","src":"45011:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"45003:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"44789:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"44800:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"44811:4:111","type":""}],"src":"44618:418:111"},{"body":{"nodeType":"YulBlock","src":"45243:217:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45260:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"45271:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45253:6:111"},"nodeType":"YulFunctionCall","src":"45253:25:111"},"nodeType":"YulExpressionStatement","src":"45253:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45298:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45309:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45294:3:111"},"nodeType":"YulFunctionCall","src":"45294:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"45314:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45287:6:111"},"nodeType":"YulFunctionCall","src":"45287:30:111"},"nodeType":"YulExpressionStatement","src":"45287:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45337:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45348:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45333:3:111"},"nodeType":"YulFunctionCall","src":"45333:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"45353:2:111","type":"","value":"23"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45326:6:111"},"nodeType":"YulFunctionCall","src":"45326:30:111"},"nodeType":"YulExpressionStatement","src":"45326:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45376:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45387:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45372:3:111"},"nodeType":"YulFunctionCall","src":"45372:18:111"},{"hexValue":"41413231206469646e2774207061792070726566756e64","kind":"string","nodeType":"YulLiteral","src":"45392:25:111","type":"","value":"AA21 didn't pay prefund"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45365:6:111"},"nodeType":"YulFunctionCall","src":"45365:53:111"},"nodeType":"YulExpressionStatement","src":"45365:53:111"},{"nodeType":"YulAssignment","src":"45427:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45439:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45450:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45435:3:111"},"nodeType":"YulFunctionCall","src":"45435:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"45427:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"45212:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"45223:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"45234:4:111","type":""}],"src":"45041:419:111"},{"body":{"nodeType":"YulBlock","src":"45639:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45656:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45667:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45649:6:111"},"nodeType":"YulFunctionCall","src":"45649:21:111"},"nodeType":"YulExpressionStatement","src":"45649:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45690:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45701:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45686:3:111"},"nodeType":"YulFunctionCall","src":"45686:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"45706:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45679:6:111"},"nodeType":"YulFunctionCall","src":"45679:30:111"},"nodeType":"YulExpressionStatement","src":"45679:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45729:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45740:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45725:3:111"},"nodeType":"YulFunctionCall","src":"45725:18:111"},{"hexValue":"4141343120746f6f206c6974746c6520766572696669636174696f6e476173","kind":"string","nodeType":"YulLiteral","src":"45745:33:111","type":"","value":"AA41 too little verificationGas"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"45718:6:111"},"nodeType":"YulFunctionCall","src":"45718:61:111"},"nodeType":"YulExpressionStatement","src":"45718:61:111"},{"nodeType":"YulAssignment","src":"45788:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"45800:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"45811:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"45796:3:111"},"nodeType":"YulFunctionCall","src":"45796:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"45788:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"45616:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"45630:4:111","type":""}],"src":"45465:355:111"},{"body":{"nodeType":"YulBlock","src":"46027:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46044:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"46055:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"46037:6:111"},"nodeType":"YulFunctionCall","src":"46037:25:111"},"nodeType":"YulExpressionStatement","src":"46037:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46082:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"46093:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46078:3:111"},"nodeType":"YulFunctionCall","src":"46078:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"46098:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"46071:6:111"},"nodeType":"YulFunctionCall","src":"46071:30:111"},"nodeType":"YulExpressionStatement","src":"46071:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46121:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"46132:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46117:3:111"},"nodeType":"YulFunctionCall","src":"46117:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"46137:2:111","type":"","value":"30"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"46110:6:111"},"nodeType":"YulFunctionCall","src":"46110:30:111"},"nodeType":"YulExpressionStatement","src":"46110:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46160:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"46171:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46156:3:111"},"nodeType":"YulFunctionCall","src":"46156:18:111"},{"hexValue":"41413331207061796d6173746572206465706f73697420746f6f206c6f77","kind":"string","nodeType":"YulLiteral","src":"46176:32:111","type":"","value":"AA31 paymaster deposit too low"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"46149:6:111"},"nodeType":"YulFunctionCall","src":"46149:60:111"},"nodeType":"YulExpressionStatement","src":"46149:60:111"},{"nodeType":"YulAssignment","src":"46218:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46230:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"46241:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46226:3:111"},"nodeType":"YulFunctionCall","src":"46226:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"46218:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"45996:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"46007:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"46018:4:111","type":""}],"src":"45825:426:111"},{"body":{"nodeType":"YulBlock","src":"46363:651:111","statements":[{"body":{"nodeType":"YulBlock","src":"46409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"46418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"46421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"46411:6:111"},"nodeType":"YulFunctionCall","src":"46411:12:111"},"nodeType":"YulExpressionStatement","src":"46411:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"46384:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"46393:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"46380:3:111"},"nodeType":"YulFunctionCall","src":"46380:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"46405:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"46376:3:111"},"nodeType":"YulFunctionCall","src":"46376:32:111"},"nodeType":"YulIf","src":"46373:52:111"},{"nodeType":"YulVariableDeclaration","src":"46434:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46454:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"46448:5:111"},"nodeType":"YulFunctionCall","src":"46448:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"46438:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"46507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"46516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"46519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"46509:6:111"},"nodeType":"YulFunctionCall","src":"46509:12:111"},"nodeType":"YulExpressionStatement","src":"46509:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"46479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"46487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"46476:2:111"},"nodeType":"YulFunctionCall","src":"46476:30:111"},"nodeType":"YulIf","src":"46473:50:111"},{"nodeType":"YulVariableDeclaration","src":"46532:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46546:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"46557:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46542:3:111"},"nodeType":"YulFunctionCall","src":"46542:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"46536:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"46612:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"46621:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"46624:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"46614:6:111"},"nodeType":"YulFunctionCall","src":"46614:12:111"},"nodeType":"YulExpressionStatement","src":"46614:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"46591:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"46595:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46587:3:111"},"nodeType":"YulFunctionCall","src":"46587:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"46602:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"46583:3:111"},"nodeType":"YulFunctionCall","src":"46583:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"46576:6:111"},"nodeType":"YulFunctionCall","src":"46576:35:111"},"nodeType":"YulIf","src":"46573:55:111"},{"nodeType":"YulVariableDeclaration","src":"46637:19:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"46653:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"46647:5:111"},"nodeType":"YulFunctionCall","src":"46647:9:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"46641:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"46665:41:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"46703:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"46675:27:111"},"nodeType":"YulFunctionCall","src":"46675:31:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"46669:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"46715:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"46735:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"46729:5:111"},"nodeType":"YulFunctionCall","src":"46729:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"46719:6:111","type":""}]},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"46767:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"46775:2:111"}],"functionName":{"name":"finalize_allocation","nodeType":"YulIdentifier","src":"46747:19:111"},"nodeType":"YulFunctionCall","src":"46747:31:111"},"nodeType":"YulExpressionStatement","src":"46747:31:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"46794:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"46802:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"46787:6:111"},"nodeType":"YulFunctionCall","src":"46787:18:111"},"nodeType":"YulExpressionStatement","src":"46787:18:111"},{"body":{"nodeType":"YulBlock","src":"46853:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"46862:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"46865:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"46855:6:111"},"nodeType":"YulFunctionCall","src":"46855:12:111"},"nodeType":"YulExpressionStatement","src":"46855:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"46828:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"46832:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46824:3:111"},"nodeType":"YulFunctionCall","src":"46824:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"46837:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46820:3:111"},"nodeType":"YulFunctionCall","src":"46820:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"46844:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"46817:2:111"},"nodeType":"YulFunctionCall","src":"46817:35:111"},"nodeType":"YulIf","src":"46814:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"46904:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"46908:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46900:3:111"},"nodeType":"YulFunctionCall","src":"46900:13:111"},{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"46919:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"46927:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46915:3:111"},"nodeType":"YulFunctionCall","src":"46915:17:111"},{"name":"_2","nodeType":"YulIdentifier","src":"46934:2:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"46878:21:111"},"nodeType":"YulFunctionCall","src":"46878:59:111"},"nodeType":"YulExpressionStatement","src":"46878:59:111"},{"nodeType":"YulAssignment","src":"46946:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"46956:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"46946:6:111"}]},{"nodeType":"YulAssignment","src":"46971:37:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"46991:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"47002:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"46987:3:111"},"nodeType":"YulFunctionCall","src":"46987:20:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"46981:5:111"},"nodeType":"YulFunctionCall","src":"46981:27:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"46971:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_memory_ptrt_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"46321:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"46332:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"46344:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"46352:6:111","type":""}],"src":"46256:758:111"},{"body":{"nodeType":"YulBlock","src":"47249:194:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"47266:3:111"},{"hexValue":"414133332072657665727465643a20","kind":"string","nodeType":"YulLiteral","src":"47271:17:111","type":"","value":"AA33 reverted: "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"47259:6:111"},"nodeType":"YulFunctionCall","src":"47259:30:111"},"nodeType":"YulExpressionStatement","src":"47259:30:111"},{"nodeType":"YulVariableDeclaration","src":"47298:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"47318:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"47312:5:111"},"nodeType":"YulFunctionCall","src":"47312:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"47302:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"47360:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"47368:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47356:3:111"},"nodeType":"YulFunctionCall","src":"47356:17:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"47379:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"47384:2:111","type":"","value":"15"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47375:3:111"},"nodeType":"YulFunctionCall","src":"47375:12:111"},{"name":"length","nodeType":"YulIdentifier","src":"47389:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"47334:21:111"},"nodeType":"YulFunctionCall","src":"47334:62:111"},"nodeType":"YulExpressionStatement","src":"47334:62:111"},{"nodeType":"YulAssignment","src":"47405:32:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"47420:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"47425:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47416:3:111"},"nodeType":"YulFunctionCall","src":"47416:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"47434:2:111","type":"","value":"15"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47412:3:111"},"nodeType":"YulFunctionCall","src":"47412:25:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"47405:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"47225:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"47230:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"47241:3:111","type":""}],"src":"47019:424:111"},{"body":{"nodeType":"YulBlock","src":"47650:216:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"47667:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"47678:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"47660:6:111"},"nodeType":"YulFunctionCall","src":"47660:25:111"},"nodeType":"YulExpressionStatement","src":"47660:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"47705:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"47716:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47701:3:111"},"nodeType":"YulFunctionCall","src":"47701:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"47721:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"47694:6:111"},"nodeType":"YulFunctionCall","src":"47694:30:111"},"nodeType":"YulExpressionStatement","src":"47694:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"47744:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"47755:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47740:3:111"},"nodeType":"YulFunctionCall","src":"47740:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"47760:2:111","type":"","value":"22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"47733:6:111"},"nodeType":"YulFunctionCall","src":"47733:30:111"},"nodeType":"YulExpressionStatement","src":"47733:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"47783:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"47794:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47779:3:111"},"nodeType":"YulFunctionCall","src":"47779:18:111"},{"hexValue":"4141333320726576657274656420286f72204f4f4729","kind":"string","nodeType":"YulLiteral","src":"47799:24:111","type":"","value":"AA33 reverted (or OOG)"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"47772:6:111"},"nodeType":"YulFunctionCall","src":"47772:52:111"},"nodeType":"YulExpressionStatement","src":"47772:52:111"},{"nodeType":"YulAssignment","src":"47833:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"47845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"47856:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"47841:3:111"},"nodeType":"YulFunctionCall","src":"47841:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"47833:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"47619:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"47630:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"47641:4:111","type":""}],"src":"47448:418:111"},{"body":{"nodeType":"YulBlock","src":"48224:519:111","statements":[{"nodeType":"YulAssignment","src":"48234:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48257:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48242:3:111"},"nodeType":"YulFunctionCall","src":"48242:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"48234:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48277:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"48292:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"48300:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"48288:3:111"},"nodeType":"YulFunctionCall","src":"48288:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48270:6:111"},"nodeType":"YulFunctionCall","src":"48270:74:111"},"nodeType":"YulExpressionStatement","src":"48270:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48364:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48375:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48360:3:111"},"nodeType":"YulFunctionCall","src":"48360:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"48380:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48353:6:111"},"nodeType":"YulFunctionCall","src":"48353:34:111"},"nodeType":"YulExpressionStatement","src":"48353:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48407:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48418:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48403:3:111"},"nodeType":"YulFunctionCall","src":"48403:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"48423:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48396:6:111"},"nodeType":"YulFunctionCall","src":"48396:34:111"},"nodeType":"YulExpressionStatement","src":"48396:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48450:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48461:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48446:3:111"},"nodeType":"YulFunctionCall","src":"48446:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"48466:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48439:6:111"},"nodeType":"YulFunctionCall","src":"48439:34:111"},"nodeType":"YulExpressionStatement","src":"48439:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48504:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48489:3:111"},"nodeType":"YulFunctionCall","src":"48489:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"48510:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48482:6:111"},"nodeType":"YulFunctionCall","src":"48482:35:111"},"nodeType":"YulExpressionStatement","src":"48482:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48537:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48548:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48533:3:111"},"nodeType":"YulFunctionCall","src":"48533:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"48554:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48526:6:111"},"nodeType":"YulFunctionCall","src":"48526:35:111"},"nodeType":"YulExpressionStatement","src":"48526:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48581:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48592:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48577:3:111"},"nodeType":"YulFunctionCall","src":"48577:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"48598:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48570:6:111"},"nodeType":"YulFunctionCall","src":"48570:35:111"},"nodeType":"YulExpressionStatement","src":"48570:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48625:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48636:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48621:3:111"},"nodeType":"YulFunctionCall","src":"48621:19:111"},{"name":"value7","nodeType":"YulIdentifier","src":"48642:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48614:6:111"},"nodeType":"YulFunctionCall","src":"48614:35:111"},"nodeType":"YulExpressionStatement","src":"48614:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48669:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48680:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48665:3:111"},"nodeType":"YulFunctionCall","src":"48665:19:111"},{"name":"value8","nodeType":"YulIdentifier","src":"48686:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48658:6:111"},"nodeType":"YulFunctionCall","src":"48658:35:111"},"nodeType":"YulExpressionStatement","src":"48658:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"48724:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"48709:3:111"},"nodeType":"YulFunctionCall","src":"48709:19:111"},{"name":"value9","nodeType":"YulIdentifier","src":"48730:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48702:6:111"},"nodeType":"YulFunctionCall","src":"48702:35:111"},"nodeType":"YulExpressionStatement","src":"48702:35:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"48121:9:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"48132:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"48140:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"48148:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"48156:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"48164:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"48172:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"48180:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"48188:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"48196:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"48204:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"48215:4:111","type":""}],"src":"47871:872:111"},{"body":{"nodeType":"YulBlock","src":"48950:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"48967:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"48978:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48960:6:111"},"nodeType":"YulFunctionCall","src":"48960:25:111"},"nodeType":"YulExpressionStatement","src":"48960:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49005:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49016:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49001:3:111"},"nodeType":"YulFunctionCall","src":"49001:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49021:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"48994:6:111"},"nodeType":"YulFunctionCall","src":"48994:30:111"},"nodeType":"YulExpressionStatement","src":"48994:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49044:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49055:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49040:3:111"},"nodeType":"YulFunctionCall","src":"49040:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49060:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49033:6:111"},"nodeType":"YulFunctionCall","src":"49033:30:111"},"nodeType":"YulExpressionStatement","src":"49033:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49083:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49094:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49079:3:111"},"nodeType":"YulFunctionCall","src":"49079:18:111"},{"hexValue":"414131302073656e64657220616c726561647920636f6e7374727563746564","kind":"string","nodeType":"YulLiteral","src":"49099:33:111","type":"","value":"AA10 sender already constructed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49072:6:111"},"nodeType":"YulFunctionCall","src":"49072:61:111"},"nodeType":"YulExpressionStatement","src":"49072:61:111"},{"nodeType":"YulAssignment","src":"49142:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49154:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49165:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49150:3:111"},"nodeType":"YulFunctionCall","src":"49150:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"49142:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"48919:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"48930:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"48941:4:111","type":""}],"src":"48748:427:111"},{"body":{"nodeType":"YulBlock","src":"49382:221:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49399:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"49410:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49392:6:111"},"nodeType":"YulFunctionCall","src":"49392:25:111"},"nodeType":"YulExpressionStatement","src":"49392:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49437:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49448:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49433:3:111"},"nodeType":"YulFunctionCall","src":"49433:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49453:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49426:6:111"},"nodeType":"YulFunctionCall","src":"49426:30:111"},"nodeType":"YulExpressionStatement","src":"49426:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49476:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49487:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49472:3:111"},"nodeType":"YulFunctionCall","src":"49472:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49492:2:111","type":"","value":"27"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49465:6:111"},"nodeType":"YulFunctionCall","src":"49465:30:111"},"nodeType":"YulExpressionStatement","src":"49465:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49526:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49511:3:111"},"nodeType":"YulFunctionCall","src":"49511:18:111"},{"hexValue":"4141313320696e6974436f6465206661696c6564206f72204f4f47","kind":"string","nodeType":"YulLiteral","src":"49531:29:111","type":"","value":"AA13 initCode failed or OOG"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49504:6:111"},"nodeType":"YulFunctionCall","src":"49504:57:111"},"nodeType":"YulExpressionStatement","src":"49504:57:111"},{"nodeType":"YulAssignment","src":"49570:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49582:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49593:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49578:3:111"},"nodeType":"YulFunctionCall","src":"49578:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"49570:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49351:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"49362:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"49373:4:111","type":""}],"src":"49180:423:111"},{"body":{"nodeType":"YulBlock","src":"49810:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49827:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"49838:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49820:6:111"},"nodeType":"YulFunctionCall","src":"49820:25:111"},"nodeType":"YulExpressionStatement","src":"49820:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49865:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49876:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49861:3:111"},"nodeType":"YulFunctionCall","src":"49861:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49881:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49854:6:111"},"nodeType":"YulFunctionCall","src":"49854:30:111"},"nodeType":"YulExpressionStatement","src":"49854:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49904:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49915:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49900:3:111"},"nodeType":"YulFunctionCall","src":"49900:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"49920:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49893:6:111"},"nodeType":"YulFunctionCall","src":"49893:30:111"},"nodeType":"YulExpressionStatement","src":"49893:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"49943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"49954:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"49939:3:111"},"nodeType":"YulFunctionCall","src":"49939:18:111"},{"hexValue":"4141313420696e6974436f6465206d7573742072657475726e2073656e646572","kind":"string","nodeType":"YulLiteral","src":"49959:34:111","type":"","value":"AA14 initCode must return sender"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"49932:6:111"},"nodeType":"YulFunctionCall","src":"49932:62:111"},"nodeType":"YulExpressionStatement","src":"49932:62:111"},{"nodeType":"YulAssignment","src":"50003:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50015:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50026:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50011:3:111"},"nodeType":"YulFunctionCall","src":"50011:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"50003:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49779:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"49790:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"49801:4:111","type":""}],"src":"49608:428:111"},{"body":{"nodeType":"YulBlock","src":"50243:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50260:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"50271:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50253:6:111"},"nodeType":"YulFunctionCall","src":"50253:25:111"},"nodeType":"YulExpressionStatement","src":"50253:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50298:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50309:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50294:3:111"},"nodeType":"YulFunctionCall","src":"50294:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"50314:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50287:6:111"},"nodeType":"YulFunctionCall","src":"50287:30:111"},"nodeType":"YulExpressionStatement","src":"50287:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50337:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50348:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50333:3:111"},"nodeType":"YulFunctionCall","src":"50333:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"50353:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50326:6:111"},"nodeType":"YulFunctionCall","src":"50326:30:111"},"nodeType":"YulExpressionStatement","src":"50326:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50376:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50387:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50372:3:111"},"nodeType":"YulFunctionCall","src":"50372:18:111"},{"hexValue":"4141313520696e6974436f6465206d757374206372656174652073656e646572","kind":"string","nodeType":"YulLiteral","src":"50392:34:111","type":"","value":"AA15 initCode must create sender"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50365:6:111"},"nodeType":"YulFunctionCall","src":"50365:62:111"},"nodeType":"YulExpressionStatement","src":"50365:62:111"},{"nodeType":"YulAssignment","src":"50436:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50448:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50459:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50444:3:111"},"nodeType":"YulFunctionCall","src":"50444:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"50436:4:111"}]}]},"name":"abi_encode_tuple_t_uint256_t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6__to_t_uint256_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50212:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"50223:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"50234:4:111","type":""}],"src":"50041:428:111"},{"body":{"nodeType":"YulBlock","src":"50603:198:111","statements":[{"nodeType":"YulAssignment","src":"50613:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50625:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50636:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50621:3:111"},"nodeType":"YulFunctionCall","src":"50621:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"50613:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"50648:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"50658:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"50652:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50716:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"50731:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"50739:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"50727:3:111"},"nodeType":"YulFunctionCall","src":"50727:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50709:6:111"},"nodeType":"YulFunctionCall","src":"50709:34:111"},"nodeType":"YulExpressionStatement","src":"50709:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"50763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"50774:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"50759:3:111"},"nodeType":"YulFunctionCall","src":"50759:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"50783:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"50791:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"50779:3:111"},"nodeType":"YulFunctionCall","src":"50779:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"50752:6:111"},"nodeType":"YulFunctionCall","src":"50752:43:111"},"nodeType":"YulExpressionStatement","src":"50752:43:111"}]},"name":"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50564:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"50575:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"50583:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"50594:4:111","type":""}],"src":"50474:327:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_decode_uint192(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint192(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint192(headStart)\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_address(value)\n }\n function abi_decode_tuple_t_addresst_uint192(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := abi_decode_uint192(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function finalize_allocation_5939(memPtr)\n {\n let newFreePtr := add(memPtr, 0xa0)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function finalize_allocation_5940(memPtr)\n {\n let newFreePtr := add(memPtr, 0x0100)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function finalize_allocation(memPtr, size)\n {\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_bytes(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x20)\n }\n function abi_decode_struct_UserOpInfo(headStart, end) -> value\n {\n let _1 := sub(end, headStart)\n if slt(_1, 0x0180) { revert(0, 0) }\n let memPtr := mload(64)\n finalize_allocation_5939(memPtr)\n value := memPtr\n let _2 := 0x0100\n if slt(_1, _2) { revert(0, 0) }\n let memPtr_1 := mload(64)\n finalize_allocation_5940(memPtr_1)\n mstore(memPtr_1, abi_decode_address(headStart))\n mstore(add(memPtr_1, 32), calldataload(add(headStart, 32)))\n mstore(add(memPtr_1, 64), calldataload(add(headStart, 64)))\n mstore(add(memPtr_1, 96), calldataload(add(headStart, 96)))\n mstore(add(memPtr_1, 128), calldataload(add(headStart, 128)))\n mstore(add(memPtr_1, 0xa0), abi_decode_address(add(headStart, 0xa0)))\n mstore(add(memPtr_1, 192), calldataload(add(headStart, 192)))\n mstore(add(memPtr_1, 224), calldataload(add(headStart, 224)))\n mstore(memPtr, memPtr_1)\n mstore(add(memPtr, 32), calldataload(add(headStart, _2)))\n mstore(add(memPtr, 64), calldataload(add(headStart, 288)))\n mstore(add(memPtr, 96), calldataload(add(headStart, 320)))\n mstore(add(memPtr, 128), calldataload(add(headStart, 352)))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes_memory_ptrt_struct$_UserOpInfo_$8204_memory_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 448) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n let _4 := array_allocation_size_bytes(_3)\n let memPtr := mload(64)\n finalize_allocation(memPtr, _4)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 0x20), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 0x20), add(_2, 0x20), _3)\n mstore(add(add(memPtr, _3), 0x20), 0)\n value0 := memPtr\n value1 := abi_decode_struct_UserOpInfo(add(headStart, 0x20), dataEnd)\n let offset_1 := calldataload(add(headStart, 416))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_array_struct_UserOperation_calldata_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_address_payable(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let value := calldataload(add(headStart, 32))\n validator_revert_address(value)\n value2 := value\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr_$dyn_calldata_ptrt_address_payable(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let value := calldataload(add(headStart, 32))\n validator_revert_address(value)\n value2 := value\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_struct$_DepositInfo_$10913_memory_ptr__to_t_struct$_DepositInfo_$10913_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffff\n mstore(headStart, and(mload(value0), _1))\n mstore(add(headStart, 0x20), iszero(iszero(mload(add(value0, 0x20)))))\n mstore(add(headStart, 0x40), and(mload(add(value0, 0x40)), _1))\n mstore(add(headStart, 0x60), and(mload(add(value0, 0x60)), 0xffffffff))\n mstore(add(headStart, 0x80), and(mload(add(value0, 0x80)), 0xffffffffffff))\n }\n function abi_decode_tuple_t_bytes_calldata_ptrt_addresst_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let value := calldataload(add(headStart, 32))\n validator_revert_address(value)\n value2 := value\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_decode_struct_UserOperation_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 352) { revert(0, 0) }\n value := offset\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_addresst_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n let value := calldataload(add(headStart, 32))\n validator_revert_address(value)\n value1 := value\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_encode_tuple_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__to_t_uint112_t_bool_t_uint112_t_uint32_t_uint48__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), iszero(iszero(value1)))\n mstore(add(headStart, 64), and(value2, _1))\n mstore(add(headStart, 96), and(value3, 0xffffffff))\n mstore(add(headStart, 128), and(value4, 0xffffffffffff))\n }\n function abi_encode_tuple_t_uint112__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_b778ed14a7f7833f15cec15447ba73902b7f27cdd540d47113a5b9c3947e6b2b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 26)\n mstore(add(headStart, 64), \"must specify unstake delay\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_be41a8e875b0d08b577c32bcab0ac88c472e62be6c60e218189d78d10808d9e7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"cannot decrease unstake time\")\n tail := add(headStart, 96)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_163fbe38f6e79bbafe8ef1c6ecbcd609e161120dfcf32c1dc0ae2ace28e56cf8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 18)\n mstore(add(headStart, 64), \"no stake specified\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_6a64644aeeb545618f93fda0e8ccacb2c407cdffe2b26245fdfa446117fd12f8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 14)\n mstore(add(headStart, 64), \"stake overflow\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_uint256_t_uint32__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xffffffff))\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_bf4e5bbea2250480ca8cf3cc338d236d16fd3805a9bc8205224406394a71fe66__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 23)\n mstore(add(headStart, 64), \"AA92 internal call only\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function abi_encode_tuple_t_stringliteral_0c1f958f466ebe53086ccef34937001c8a0d9f200320ab480bde36d46a3c6178__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 25)\n mstore(add(headStart, 64), \"Withdraw amount too large\")\n tail := add(headStart, 96)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_a34ed1abbfa8a2aea109afd35a4e04f6c52ffb62d3a545e3e3e4f2d894ca1e41__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 18)\n mstore(add(headStart, 64), \"failed to withdraw\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_struct$_UserOpsPerAggregator_$10734_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function access_calldata_tail_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IAggregator_$10603(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_c7b85d163e4e98261caeed8e321f4ec192af622f53fd084234a04b236b40e883__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 23)\n mstore(add(headStart, 64), \"AA96 invalid aggregator\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function calldata_access_bytes_calldata(base_ref, ptr) -> value, length\n {\n let rel_offset_of_tail := calldataload(ptr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let value_1 := add(rel_offset_of_tail, base_ref)\n length := calldataload(value_1)\n value := add(value_1, 0x20)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n if sgt(value, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_struct_UserOperation_calldata(value, pos) -> end\n {\n let _1 := 0x0160\n abi_encode_address(abi_decode_address(value), pos)\n mstore(add(pos, 0x20), calldataload(add(value, 0x20)))\n let memberValue0, memberValue1 := calldata_access_bytes_calldata(value, add(value, 0x40))\n mstore(add(pos, 0x40), _1)\n let tail := abi_encode_bytes_calldata(memberValue0, memberValue1, add(pos, _1))\n let memberValue0_1, memberValue1_1 := calldata_access_bytes_calldata(value, add(value, 0x60))\n mstore(add(pos, 0x60), sub(tail, pos))\n let tail_1 := abi_encode_bytes_calldata(memberValue0_1, memberValue1_1, tail)\n mstore(add(pos, 0x80), calldataload(add(value, 0x80)))\n mstore(add(pos, 0xa0), calldataload(add(value, 0xa0)))\n mstore(add(pos, 0xc0), calldataload(add(value, 0xc0)))\n mstore(add(pos, 0xe0), calldataload(add(value, 0xe0)))\n let _2 := 0x0100\n mstore(add(pos, _2), calldataload(add(value, _2)))\n let _3 := 0x0120\n let memberValue0_2, memberValue1_2 := calldata_access_bytes_calldata(value, add(value, _3))\n mstore(add(pos, _3), sub(tail_1, pos))\n let tail_2 := abi_encode_bytes_calldata(memberValue0_2, memberValue1_2, tail_1)\n let _4 := 0x0140\n let memberValue0_3, memberValue1_3 := calldata_access_bytes_calldata(value, add(value, _4))\n mstore(add(pos, _4), sub(tail_2, pos))\n end := abi_encode_bytes_calldata(memberValue0_3, memberValue1_3, tail_2)\n }\n function abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr_t_bytes_calldata_ptr__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n let tail_1 := add(headStart, 64)\n mstore(headStart, 64)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 96)\n let tail_2 := add(add(headStart, shl(5, value1)), 96)\n let srcPtr := value0\n let i := 0\n let i_1 := i\n for { } lt(i_1, value1) { i_1 := add(i_1, 1) }\n {\n mstore(pos, add(sub(tail_2, headStart), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0))\n let rel_offset_of_tail := calldataload(srcPtr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), value0), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1))) { revert(i, i) }\n tail_2 := abi_encode_struct_UserOperation_calldata(add(rel_offset_of_tail, value0), tail_2)\n let _1 := 0x20\n srcPtr := add(srcPtr, _1)\n pos := add(pos, _1)\n }\n mstore(add(headStart, 0x20), sub(tail_2, headStart))\n tail := abi_encode_bytes_calldata(value2, value3, tail_2)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_71b8c59e134d62690a752e786c07dbe8b7f35be51e386ddf501ff1ee93b9f00e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 25)\n mstore(add(headStart, 64), \"AA20 account not deployed\")\n tail := add(headStart, 96)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_d82b4d418151273a79eb9148ccd7dd21ef8c139f3cb080a13113b33d0ca4ba60__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"AA30 paymaster not deployed\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 0)\n tail := add(headStart, 64)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 32))\n }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_bytes32_t_address_t_uint256__to_t_bytes32_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_8d1fe892c4e34e50852d9473d3c9854eedeef3b324fbe99dc34a39c1c505db12__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"not staked\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_eabab2b938baa7d6708bc792cd1d2d9d9bd3627968a46b23824d4b6af2b0f7a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"already unstaking\")\n tail := add(headStart, 96)\n }\n function checked_add_t_uint48(x, y) -> sum\n {\n let _1 := 0xffffffffffff\n let x_1 := and(x, _1)\n let y_1 := and(y, _1)\n if gt(x_1, sub(_1, y_1)) { panic_error_0x11() }\n sum := add(x_1, y_1)\n }\n function abi_encode_tuple_t_uint48__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_2157ff27c581d0c09d0fefae4820572f0bccc198ee5e28633f039d06e0011705__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 20)\n mstore(add(headStart, 64), \"No stake to withdraw\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_9973ef36bc8342d488dae231c130b6ed95bb2a62fca313f7c859e3c78149cec5__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"must call unlockStake() first\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_5cd6155e73f61bccbf344f4197f14538012904bd24fa05bb30427c7f1fe55d45__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"Stake withdrawal is not due\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1dfdcaaacbfb01ed2a280d66b545f88db6fa18ccf502cb079b76e190a3a0227b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"failed to withdraw stake\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n end := _1\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__to_t_uint256_t_uint256_t_uint48_t_uint48_t_bool_t_bytes_memory_ptr__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n let _1 := 0xffffffffffff\n mstore(add(headStart, 64), and(value2, _1))\n mstore(add(headStart, 96), and(value3, _1))\n mstore(add(headStart, 128), iszero(iszero(value4)))\n mstore(add(headStart, 160), 192)\n tail := abi_encode_bytes(value5, add(headStart, 192))\n }\n function abi_encode_struct_ReturnInfo(value, pos) -> end\n {\n mstore(pos, mload(value))\n mstore(add(pos, 0x20), mload(add(value, 0x20)))\n mstore(add(pos, 0x40), iszero(iszero(mload(add(value, 0x40)))))\n let memberValue0 := mload(add(value, 0x60))\n let _1 := 0xffffffffffff\n mstore(add(pos, 0x60), and(memberValue0, _1))\n mstore(add(pos, 0x80), and(mload(add(value, 0x80)), _1))\n let memberValue0_1 := mload(add(value, 0xa0))\n mstore(add(pos, 0xa0), 0xc0)\n end := abi_encode_bytes(memberValue0_1, add(pos, 0xc0))\n }\n function abi_encode_struct_StakeInfo(value, pos)\n {\n mstore(pos, mload(value))\n mstore(add(pos, 0x20), mload(add(value, 0x20)))\n }\n function abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_AggregatorStakeInfo_$10789_memory_ptr__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n let _1 := 320\n mstore(headStart, _1)\n tail := abi_encode_struct_ReturnInfo(value0, add(headStart, _1))\n abi_encode_struct_StakeInfo(value1, add(headStart, 32))\n abi_encode_struct_StakeInfo(value2, add(headStart, 96))\n abi_encode_struct_StakeInfo(value3, add(headStart, 160))\n mstore(add(headStart, 224), and(mload(value4), 0xffffffffffffffffffffffffffffffffffffffff))\n let memberValue0 := mload(add(value4, 32))\n abi_encode_struct_StakeInfo(memberValue0, add(headStart, 256))\n }\n function abi_encode_tuple_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__to_t_struct$_ReturnInfo_$10783_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr_t_struct$_StakeInfo_$10918_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 224)\n tail := abi_encode_struct_ReturnInfo(value0, add(headStart, 224))\n abi_encode_struct_StakeInfo(value1, add(headStart, 32))\n abi_encode_struct_StakeInfo(value2, add(headStart, 96))\n abi_encode_struct_StakeInfo(value3, add(headStart, 160))\n }\n function abi_encode_tuple_t_stringliteral_2df876f4a1443545618e673329ffafd9bcd8ac55000274188f0ae7458d7624fa__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 16)\n mstore(add(headStart, 64), \"deposit overflow\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_enum$_PostOpMode_$10834_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n if iszero(lt(value0, 3))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n mstore(headStart, value0)\n mstore(add(headStart, 32), 96)\n tail := abi_encode_bytes(value1, add(headStart, 96))\n mstore(add(headStart, 64), value2)\n }\n function return_data_selector() -> sig\n {\n if gt(returndatasize(), 3)\n {\n returndatacopy(0, 0, 4)\n sig := shr(224, mload(0))\n }\n }\n function try_decode_error_message() -> ret\n {\n if lt(returndatasize(), 0x44) { leave }\n let data := mload(64)\n let _1 := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc\n returndatacopy(data, 4, add(returndatasize(), _1))\n let offset := mload(data)\n let _2 := returndatasize()\n let _3 := 0xffffffffffffffff\n if or(gt(offset, _3), gt(add(offset, 0x24), _2)) { leave }\n let msg := add(data, offset)\n let length := mload(msg)\n if gt(length, _3) { leave }\n if gt(add(add(msg, length), 0x20), add(add(data, returndatasize()), _1)) { leave }\n finalize_allocation(data, add(add(offset, length), 0x20))\n ret := msg\n }\n function abi_encode_tuple_packed_t_stringliteral_89cfa8476c9240f64d7d0db687b79e8eeea1ecc4f5bfab4622523f588b7a9023_t_string_memory_ptr__to_t_bytes22_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, \"AA50 postOp reverted: \")\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), add(pos, 22), length)\n end := add(add(pos, length), 22)\n }\n function abi_encode_tuple_t_uint256_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_90de5d306df3292f820b93f6e4dc87adc3236924e1c3376b59e166ff929d9706__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 18)\n mstore(add(headStart, 96), \"AA50 postOp revert\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_6d9dc9889ad1c5031a22e90fdbb1ca90f7e3143417446c3f113ca547893317fb__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 32)\n mstore(add(headStart, 96), \"AA51 prefund below actualGasCost\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_bool_t_uint256_t_uint256__to_t_uint256_t_bool_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), iszero(iszero(value1)))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ReentrancyGuard: reentrant call\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_2454d602dd1245dd701375973b2bac347a9e27dc7542cb5ffbdc114cb2232f69__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"AA94 gas values overflow\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_1a6d2773a48550bbfcfd396dd79645bef61ab18efc53f13933af43bfa63cc5b5__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 26)\n mstore(add(headStart, 96), \"AA25 invalid account nonce\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_7d1dd4a09dc6414e69300598bfd3bd697585d57a99ffc262a56c7dd3f91bdcaf__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 30)\n mstore(add(headStart, 96), \"AA40 over verificationGasLimit\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 20)\n mstore(add(headStart, 96), \"AA24 signature error\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_4f6af422606d6fab6224761f4f503b9674de8994d20a0052616d3524b670e766__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 23)\n mstore(add(headStart, 96), \"AA22 expired or not due\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_b49ba4e4826dc300b471d06b2a8612d53c4c2eb033cbfd2061c54c636bb00871__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 20)\n mstore(add(headStart, 96), \"AA34 signature error\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_15a824f4c22cc564e6215a3b0d10da3af06bea6cdb58dc3760d85748fcd6036b__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 33)\n mstore(add(headStart, 96), \"AA32 paymaster expired or not du\")\n mstore(add(headStart, 128), \"e\")\n tail := add(headStart, 160)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_struct$_UserOpInfo_$8204_memory_ptr_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n let _1 := 448\n mstore(headStart, _1)\n let tail_1 := abi_encode_bytes_calldata(value0, value1, add(headStart, _1))\n let _2 := mload(value2)\n let _3 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(add(headStart, 32), and(mload(_2), _3))\n mstore(add(headStart, 64), mload(add(_2, 32)))\n mstore(add(headStart, 96), mload(add(_2, 64)))\n mstore(add(headStart, 128), mload(add(_2, 96)))\n mstore(add(headStart, 160), mload(add(_2, 128)))\n mstore(add(headStart, 192), and(mload(add(_2, 160)), _3))\n mstore(add(headStart, 224), mload(add(_2, 192)))\n mstore(add(headStart, 256), mload(add(_2, 224)))\n mstore(add(headStart, 288), mload(add(value2, 32)))\n mstore(add(headStart, 320), mload(add(value2, 64)))\n mstore(add(headStart, 352), mload(add(value2, 96)))\n mstore(add(headStart, 384), mload(add(value2, 128)))\n mstore(add(headStart, 416), sub(tail_1, headStart))\n tail := abi_encode_bytes(value3, tail_1)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_eb8aae105b33b8e3029845f6a1359760a9480648cd982f4e1c37f01a5ceaf980__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 15)\n mstore(add(headStart, 96), \"AA95 out of gas\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_920f437a2d912d818562bb2b3dd9587067a8482ed696134ce94fa5e8d2567814__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"AA90 invalid beneficiary\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_321532189629d29421359a6160b174523b9558104989fb537a4f9d684a0aa1ea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"AA91 failed send to beneficiary\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_address_t_bytes_calldata_ptr__to_t_bytes_memory_ptr_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n let tail_1 := abi_encode_bytes_calldata(value0, value1, add(headStart, 96))\n mstore(add(headStart, 32), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 64), sub(tail_1, headStart))\n tail := abi_encode_bytes_calldata(value3, value4, tail_1)\n }\n function abi_encode_tuple_t_rational_0_by_1_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_encode_tuple_t_stringliteral_bed5bf2586bcf71963468f5a6e4def651dfab48dcb520989dbad3d1cd3cd8bdd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"AA93 invalid paymasterAndData\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_struct$_UserOperation_$10993_calldata_ptr_t_bytes32_t_uint256__to_t_struct$_UserOperation_$10993_memory_ptr_t_bytes32_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n tail := abi_encode_struct_UserOperation_calldata(value0, add(headStart, 96))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_packed_t_stringliteral_64c32ef8d2e99d9125e89faefd194cdf39408ea487a6e93e9008b5c390f307f5_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, \"AA23 reverted: \")\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), add(pos, 15), length)\n end := add(add(pos, length), 15)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_d8c5b4f1a3cbc05d00982c170cbf8bc904c4339a4c7a07644651f9fa6baa122d__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 22)\n mstore(add(headStart, 96), \"AA23 reverted (or OOG)\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_af9d5dc558e78f4dcea94657e51b2cc454e4ce4aecf26fcc28fc02e10982eb3d__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 23)\n mstore(add(headStart, 96), \"AA21 didn't pay prefund\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_845e7a5bae687c41d5c517dad2fcb3470ce8c1ba5192471348c2a4a402b500f5__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"AA41 too little verificationGas\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_423a165b7dbbda2ae3873c5d3fae3c0ad56dda63b0eb4d372683317213e4df0f__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 30)\n mstore(add(headStart, 96), \"AA31 paymaster deposit too low\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_bytes_memory_ptrt_uint256_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n let _2 := mload(_1)\n let _3 := array_allocation_size_bytes(_2)\n let memPtr := mload(64)\n finalize_allocation(memPtr, _3)\n mstore(memPtr, _2)\n if gt(add(add(_1, _2), 0x20), dataEnd) { revert(0, 0) }\n copy_memory_to_memory(add(_1, 0x20), add(memPtr, 0x20), _2)\n value0 := memPtr\n value1 := mload(add(headStart, 0x20))\n }\n function abi_encode_tuple_packed_t_stringliteral_d5055b4e51389a9724dff5ba1d52dcc7fe941798fcbecc4026c62f349f2c064e_t_string_memory_ptr__to_t_bytes15_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, \"AA33 reverted: \")\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), add(pos, 15), length)\n end := add(add(pos, length), 15)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_b1ed1567fa5d3a521ab390827d63ed8b5fd475a7cdb2315873e7127995800f2c__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 22)\n mstore(add(headStart, 96), \"AA33 reverted (or OOG)\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed(headStart, value9, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 320)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), value6)\n mstore(add(headStart, 224), value7)\n mstore(add(headStart, 256), value8)\n mstore(add(headStart, 288), value9)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_267485e0b239ff7726cfbcfb111a14e388e8253ef89a57c2a12abc410bbc1a79__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 31)\n mstore(add(headStart, 96), \"AA10 sender already constructed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_a46d515f685002bbb631614d07729b129ca01335d4ee63cf10853491e47dee73__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 27)\n mstore(add(headStart, 96), \"AA13 initCode failed or OOG\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_cf8e5f91822a9ca4de44f9559ff5db3083e7cb35e25710632c57dc900da04602__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 32)\n mstore(add(headStart, 96), \"AA14 initCode must return sender\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint256_t_stringliteral_bb1e067ee25aabe05bbdddb7ea9a4490fa96ed7d10c6207acd0a3c723a9b7ed6__to_t_uint256_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 32)\n mstore(add(headStart, 96), \"AA15 initCode must create sender\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7558":[{"length":32,"start":5268},{"length":32,"start":13037}]},"linkReferences":{},"object":"6080604052600436106101635760003560e01c80638f41ec5a116100c0578063bb9fe6bf11610074578063d6383f9411610059578063d6383f9414610541578063ee21942314610561578063fc7e286d1461058157600080fd5b8063bb9fe6bf1461050c578063c23a5cea1461052157600080fd5b80639b249f69116100a55780639b249f69146104b9578063a6193531146104d9578063b760faf9146104f957600080fd5b80638f41ec5a14610484578063957122ab1461049957600080fd5b8063205c2878116101175780634b1d7cf5116100fc5780634b1d7cf5146102dc5780635287ce12146102fc57806370a082311461043e57600080fd5b8063205c28781461023657806335567e1a1461025657600080fd5b80631b2e01b8116101485780631b2e01b8146101ab5780631d732756146101f65780631fad948c1461021657600080fd5b80630396cb60146101785780630bd28e3b1461018b57600080fd5b36610173576101713361065b565b005b600080fd5b6101716101863660046135c0565b6106c9565b34801561019757600080fd5b506101716101a6366004613613565b6109e4565b3480156101b757600080fd5b506101e36101c636600461364e565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561020257600080fd5b506101e3610211366004613866565b610a2c565b34801561022257600080fd5b50610171610231366004613971565b610bb8565b34801561024257600080fd5b506101716102513660046139c8565b610d35565b34801561026257600080fd5b506101e361027136600461364e565b6001600160a01b0391909116600090815260016020908152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff85168452909152908190205491901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000161790565b3480156102e857600080fd5b506101716102f7366004613971565b610ee9565b34801561030857600080fd5b506103df6103173660046139f4565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b031660009081526020818152604091829020825160a08101845281546dffffffffffffffffffffffffffff80821683526e010000000000000000000000000000820460ff161515948301949094526f0100000000000000000000000000000090049092169282019290925260019091015463ffffffff81166060830152640100000000900465ffffffffffff16608082015290565b6040805182516dffffffffffffffffffffffffffff908116825260208085015115159083015283830151169181019190915260608083015163ffffffff169082015260809182015165ffffffffffff169181019190915260a0016101ed565b34801561044a57600080fd5b506101e36104593660046139f4565b6001600160a01b03166000908152602081905260409020546dffffffffffffffffffffffffffff1690565b34801561049057600080fd5b506101e3600181565b3480156104a557600080fd5b506101716104b4366004613a11565b611364565b3480156104c557600080fd5b506101716104d4366004613a96565b611461565b3480156104e557600080fd5b506101e36104f4366004613af1565b61154e565b6101716105073660046139f4565b61065b565b34801561051857600080fd5b50610171611590565b34801561052d57600080fd5b5061017161053c3660046139f4565b611713565b34801561054d57600080fd5b5061017161055c366004613b26565b611991565b34801561056d57600080fd5b5061017161057c366004613af1565b611aa5565b34801561058d57600080fd5b5061060e61059c3660046139f4565b600060208190529081526040902080546001909101546dffffffffffffffffffffffffffff808316926e010000000000000000000000000000810460ff16926f010000000000000000000000000000009091049091169063ffffffff811690640100000000900465ffffffffffff1685565b604080516dffffffffffffffffffffffffffff96871681529415156020860152929094169183019190915263ffffffff16606082015265ffffffffffff909116608082015260a0016101ed565b6106658134611db2565b6001600160a01b03811660008181526020818152604091829020805492516dffffffffffffffffffffffffffff909316835292917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c491015b60405180910390a25050565b33600090815260208190526040902063ffffffff82166107305760405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c617900000000000060448201526064015b60405180910390fd5b600181015463ffffffff908116908316101561078e5760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152606401610727565b80546000906107c19034906f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16613bb7565b9050600081116108135760405162461bcd60e51b815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152606401610727565b6dffffffffffffffffffffffffffff8111156108715760405162461bcd60e51b815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152606401610727565b6040805160a08101825283546dffffffffffffffffffffffffffff90811682526001602080840182815286841685870190815263ffffffff808b16606088019081526000608089018181523380835296829052908a9020985189549551945189166f01000000000000000000000000000000027fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff9515156e010000000000000000000000000000027fffffffffffffffffffffffffffffffffff0000000000000000000000000000009097169190991617949094179290921695909517865551949092018054925165ffffffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000909316949093169390931717905590517fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01906109d7908490879091825263ffffffff16602082015260400190565b60405180910390a2505050565b33600090815260016020908152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff851684529091528120805491610a2483613bcf565b919050555050565b6000805a9050333014610a815760405162461bcd60e51b815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152606401610727565b8451604081015160608201518101611388015a1015610ac4577fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b875160009015610b58576000610ae1846000015160008c86611e88565b905080610b56576000610af5610800611ea0565b805190915015610b505784600001516001600160a01b03168a602001517f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201876020015184604051610b47929190613c5f565b60405180910390a35b60019250505b505b600088608001515a8603019050610baa6000838b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250611ecc915050565b9a9950505050505050505050565b610bc0612200565b8160008167ffffffffffffffff811115610bdc57610bdc613683565b604051908082528060200260200182016040528015610c1557816020015b610c02613536565b815260200190600190039081610bfa5790505b50905060005b82811015610c8e576000828281518110610c3757610c37613c78565b60200260200101519050600080610c72848a8a87818110610c5a57610c5a613c78565b9050602002810190610c6c9190613ca7565b85612257565b91509150610c838483836000612442565b505050600101610c1b565b506040516000907fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972908290a160005b83811015610d1857610d0c81888884818110610cdb57610cdb613c78565b9050602002810190610ced9190613ca7565b858481518110610cff57610cff613c78565b602002602001015161260c565b90910190600101610cbd565b50610d23848261275a565b505050610d306001600255565b505050565b33600090815260208190526040902080546dffffffffffffffffffffffffffff16821115610da55760405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152606401610727565b8054610dc29083906dffffffffffffffffffffffffffff16613ce5565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff91909116178155604080516001600160a01b03851681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a26000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114610e8d576040519150601f19603f3d011682016040523d82523d6000602084013e610e92565b606091505b5050905080610ee35760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610727565b50505050565b610ef1612200565b816000805b8281101561109c5736868683818110610f1157610f11613c78565b9050602002810190610f239190613cfc565b9050366000610f328380613d30565b90925090506000610f4960408501602086016139f4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03821601610fc35760405162461bcd60e51b815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152606401610727565b6001600160a01b03811615611079576001600160a01b03811663e3563a4f8484610ff06040890189613d98565b6040518563ffffffff1660e01b815260040161100f9493929190613f83565b60006040518083038186803b15801561102757600080fd5b505afa925050508015611038575060015b611079576040517f86a9f7500000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610727565b6110838287613bb7565b955050505050808061109490613bcf565b915050610ef6565b5060008167ffffffffffffffff8111156110b8576110b8613683565b6040519080825280602002602001820160405280156110f157816020015b6110de613536565b8152602001906001900390816110d65790505b506040519091507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f97290600090a16000805b84811015611206573688888381811061113d5761113d613c78565b905060200281019061114f9190613cfc565b905036600061115e8380613d30565b9092509050600061117560408501602086016139f4565b90508160005b818110156111ed57600089898151811061119757611197613c78565b602002602001015190506000806111ba8b898987818110610c5a57610c5a613c78565b915091506111ca84838389612442565b8a6111d481613bcf565b9b505050505080806111e590613bcf565b91505061117b565b50505050505080806111fe90613bcf565b915050611122565b50600080915060005b8581101561131f573689898381811061122a5761122a613c78565b905060200281019061123c9190613cfc565b905061124e60408201602083016139f4565b6001600160a01b03167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d60405160405180910390a23660006112908380613d30565b90925090508060005b81811015611307576112db888585848181106112b7576112b7613c78565b90506020028101906112c99190613ca7565b8b8b81518110610cff57610cff613c78565b6112e59088613bb7565b9650876112f181613bcf565b98505080806112ff90613bcf565b915050611299565b5050505050808061131790613bcf565b91505061120f565b506040516000907f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d908290a2611355868261275a565b5050505050610d306001600255565b8315801561137a57506001600160a01b0383163b155b156113c75760405162461bcd60e51b815260206004820152601960248201527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006044820152606401610727565b6014811061143f5760006113de601482848661403a565b6113e791614064565b60601c9050803b60000361143d5760405162461bcd60e51b815260206004820152601b60248201527f41413330207061796d6173746572206e6f74206465706c6f79656400000000006044820152606401610727565b505b60405162461bcd60e51b81526020600482015260006024820152604401610727565b6040517f570e1a360000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063570e1a36906114cb90869086906004016140ac565b6020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e91906140c0565b6040517f6ca7b8060000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152909150602401610727565b600061155982612853565b6040805160208101929092523090820152466060820152608001604051602081830303815290604052805190602001209050919050565b3360009081526020819052604081206001810154909163ffffffff90911690036115fc5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152606401610727565b80546e010000000000000000000000000000900460ff1661165f5760405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152606401610727565b60018101546000906116779063ffffffff16426140dd565b6001830180547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff1664010000000065ffffffffffff84169081029190911790915583547fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff16845560405190815290915033907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a906020016106bd565b33600090815260208190526040902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16806117945760405162461bcd60e51b815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152606401610727565b6001820154640100000000900465ffffffffffff166117f55760405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152606401610727565b60018201544264010000000090910465ffffffffffff16111561185a5760405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152606401610727565b6001820180547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000016905581547fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff168255604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461193b576040519150601f19603f3d011682016040523d82523d6000602084013e611940565b606091505b5050905080610ee35760405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152606401610727565b611999613536565b6119a28561286c565b6000806119b160008885612257565b9150915060006119c18383612946565b90506119cc43600052565b60006119da60008a8761260c565b90506119e543600052565b600060606001600160a01b038a1615611a5b57896001600160a01b03168989604051611a12929190614107565b6000604051808303816000865af19150503d8060008114611a4f576040519150601f19603f3d011682016040523d82523d6000602084013e611a54565b606091505b5090925090505b8660800151838560200151866040015185856040517f8b7ac98000000000000000000000000000000000000000000000000000000000815260040161072796959493929190614117565b611aad613536565b611ab68261286c565b600080611ac560008585612257565b845160a00151604080518082018252600080825260208083018281526001600160a01b03958616835282825284832080546dffffffffffffffffffffffffffff6f01000000000000000000000000000000918290048116875260019283015463ffffffff9081169094528d51518851808a018a5287815280870188815291909a16875286865288872080549390930490911689529101549091169052835180850190945281845283015293955091935090366000611b8660408a018a613d98565b909250905060006014821015611b9d576000611bb8565b611bab60146000848661403a565b611bb491614064565b60601c5b604080518082018252600080825260208083018281526001600160a01b03861683529082905292902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1682526001015463ffffffff1690915290915093505050506000611c298686612946565b9050600081600001519050600060016001600160a01b0316826001600160a01b031614905060006040518060c001604052808b6080015181526020018b6040015181526020018315158152602001856020015165ffffffffffff168152602001856040015165ffffffffffff168152602001611ca68c6060015190565b905290506001600160a01b03831615801590611ccc57506001600160a01b038316600114155b15611d78576040805180820182526001600160a01b03851680825282518084018452600080825260208083018281529382528181529085902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1683526001015463ffffffff169092529082015290517ffaecb4e4000000000000000000000000000000000000000000000000000000008152610727908390899089908c9086906004016141b9565b808686896040517fe0cff05f0000000000000000000000000000000000000000000000000000000081526004016107279493929190614239565b6001600160a01b03821660009081526020819052604081208054909190611dea9084906dffffffffffffffffffffffffffff16613bb7565b90506dffffffffffffffffffffffffffff811115611e4a5760405162461bcd60e51b815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152606401610727565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161790555050565b6000806000845160208601878987f195945050505050565b60603d82811115611eae5750815b604051602082018101604052818152816000602083013e9392505050565b6000805a855190915060009081611ee282612a12565b60a08301519091506001600160a01b038116611f0157825193506120e5565b8093506000885111156120e557868202955060028a6002811115611f2757611f27614290565b14611fb25760608301516040517fa9a234090000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163a9a2340991611f7a908e908d908c906004016142bf565b600060405180830381600088803b158015611f9457600080fd5b5087f1158015611fa8573d6000803e3d6000fd5b50505050506120e5565b60608301516040517fa9a234090000000000000000000000000000000000000000000000000000000081526001600160a01b0383169163a9a2340991612000908e908d908c906004016142bf565b600060405180830381600088803b15801561201a57600080fd5b5087f19350505050801561202c575060015b6120e55761203861431f565b806308c379a003612091575061204c61433b565b806120575750612093565b8b8160405160200161206991906143e3565b60408051601f1981840301815290829052631101335b60e11b82526107279291600401613c5f565b505b8a604051631101335b60e11b81526004016107279181526040602082018190526012908201527f4141353020706f73744f70207265766572740000000000000000000000000000606082015260800190565b5a8503870196508187029550858960400151101561214e578a604051631101335b60e11b815260040161072791815260406020808301829052908201527f414135312070726566756e642062656c6f772061637475616c476173436f7374606082015260800190565b60408901518690036121608582611db2565b6000808c600281111561217557612175614290565b1490508460a001516001600160a01b031685600001516001600160a01b03168c602001517f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f8860200151858d8f6040516121e8949392919093845291151560208401526040830152606082015260800190565b60405180910390a45050505050505095945050505050565b60028054036122515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610727565b60028055565b60008060005a845190915061226c8682612a42565b6122758661154e565b6020860152604081015160608201516080830151171760e087013517610100870135176effffffffffffffffffffffffffffff8111156122f75760405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152606401610727565b60008061230384612b3b565b90506123118a8a8a84612b88565b855160208701519199509193506123289190612e0d565b61237e5789604051631101335b60e11b8152600401610727918152604060208201819052601a908201527f4141323520696e76616c6964206163636f756e74206e6f6e6365000000000000606082015260800190565b61238743600052565b60a08401516060906001600160a01b0316156123af576123aa8b8b8b8587612e5b565b975090505b60005a87039050808b60a001351015612414578b604051631101335b60e11b8152600401610727918152604060208201819052601e908201527f41413430206f76657220766572696669636174696f6e4761734c696d69740000606082015260800190565b60408a018390528160608b015260c08b01355a8803018a608001818152505050505050505050935093915050565b60008061244e8561309a565b91509150816001600160a01b0316836001600160a01b0316146124bd5785604051631101335b60e11b81526004016107279181526040602082018190526014908201527f41413234207369676e6174757265206572726f72000000000000000000000000606082015260800190565b80156125155785604051631101335b60e11b81526004016107279181526040602082018190526017908201527f414132322065787069726564206f72206e6f7420647565000000000000000000606082015260800190565b60006125208561309a565b925090506001600160a01b038116156125855786604051631101335b60e11b81526004016107279181526040602082018190526014908201527f41413334207369676e6174757265206572726f72000000000000000000000000606082015260800190565b81156126035786604051631101335b60e11b81526004016107279181526040602082018190526021908201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560608201527f6500000000000000000000000000000000000000000000000000000000000000608082015260a00190565b50505050505050565b6000805a9050600061261f846060015190565b905030631d7327566126346060880188613d98565b87856040518563ffffffff1660e01b81526004016126559493929190614428565b6020604051808303816000875af1925050508015612690575060408051601f3d908101601f1916820190925261268d918101906144dc565b60015b61274e57600060206000803e506000517f215221530000000000000000000000000000000000000000000000000000000081016127195786604051631101335b60e11b8152600401610727918152604060208201819052600f908201527f41413935206f7574206f66206761730000000000000000000000000000000000606082015260800190565b600085608001515a61272b9086613ce5565b6127359190613bb7565b9050612745886002888685611ecc565b94505050612751565b92505b50509392505050565b6001600160a01b0382166127b05760405162461bcd60e51b815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152606401610727565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127fd576040519150601f19603f3d011682016040523d82523d6000602084013e612802565b606091505b5050905080610d305760405162461bcd60e51b815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152606401610727565b600061285e826130ed565b805190602001209050919050565b3063957122ab61287f6040840184613d98565b61288c60208601866139f4565b61289a610120870187613d98565b6040518663ffffffff1660e01b81526004016128ba9594939291906144f5565b60006040518083038186803b1580156128d257600080fd5b505afa9250505080156128e3575060015b612943576128ef61431f565b806308c379a003612937575061290361433b565b8061290e5750612939565b80511561293357600081604051631101335b60e11b8152600401610727929190613c5f565b5050565b505b3d6000803e3d6000fd5b50565b604080516060810182526000808252602082018190529181018290529061296c846131c0565b90506000612979846131c0565b82519091506001600160a01b038116612990575080515b602080840151604080860151928501519085015191929165ffffffffffff80831690851610156129be578193505b8065ffffffffffff168365ffffffffffff1611156129da578092505b5050604080516060810182526001600160a01b03909416845265ffffffffffff92831660208501529116908201529250505092915050565b60c081015160e082015160009190808203612a2e575092915050565b612a3a82488301613231565b949350505050565b612a4f60208301836139f4565b6001600160a01b0316815260208083013590820152608080830135604083015260a0830135606083015260c0808401359183019190915260e0808401359183019190915261010083013590820152366000612aae610120850185613d98565b90925090508015612b2e576014811015612b0a5760405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152606401610727565b612b1860146000838561403a565b612b2191614064565b60601c60a0840152610ee3565b600060a084015250505050565b60a081015160009081906001600160a01b0316612b59576001612b5c565b60035b60ff16905060008360800151828560600151028560400151010190508360c00151810292505050919050565b60008060005a8551805191925090612bad8988612ba860408c018c613d98565b613249565b60a0820151612bbb43600052565b60006001600160a01b038216612c0a576001600160a01b0383166000908152602081905260409020546dffffffffffffffffffffffffffff16888111612c0357808903612c06565b60005b9150505b606084015160208a01516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081526001600160a01b03861692633a871cdd929091612c5d918f91879060040161452b565b60206040518083038160008887f193505050508015612c99575060408051601f3d908101601f19168201909252612c96918101906144dc565b60015b612d2a57612ca561431f565b806308c379a003612cd65750612cb961433b565b80612cc45750612cd8565b8b816040516020016120699190614550565b505b8a604051631101335b60e11b81526004016107279181526040602082018190526016908201527f4141323320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b95506001600160a01b038216612dfa576001600160a01b038316600090815260208190526040902080546dffffffffffffffffffffffffffff16808a1115612dbe578c604051631101335b60e11b81526004016107279181526040602082018190526017908201527f41413231206469646e2774207061792070726566756e64000000000000000000606082015260800190565b81547fffffffffffffffffffffffffffffffffffff000000000000000000000000000016908a90036dffffffffffffffffffffffffffff161790555b5a85039650505050505094509492505050565b6001600160a01b038216600090815260016020908152604080832084821c808552925282208054849167ffffffffffffffff8316919085612e4d83613bcf565b909155501495945050505050565b82516060818101519091600091848111612eb75760405162461bcd60e51b815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152606401610727565b60a08201516001600160a01b038116600090815260208190526040902080548784039291906dffffffffffffffffffffffffffff1689811015612f46578c604051631101335b60e11b8152600401610727918152604060208201819052601e908201527f41413331207061796d6173746572206465706f73697420746f6f206c6f770000606082015260800190565b8981038260000160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550826001600160a01b031663f465c77e858e8e602001518e6040518563ffffffff1660e01b8152600401612fb49392919061452b565b60006040518083038160008887f193505050508015612ff557506040513d6000823e601f3d908101601f19168201604052612ff29190810190614595565b60015b6130865761300161431f565b806308c379a003613032575061301561433b565b806130205750613034565b8d816040516020016120699190614621565b505b8c604051631101335b60e11b81526004016107279181526040602082018190526016908201527f4141333320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b909e909d509b505050505050505050505050565b600080826000036130b057506000928392509050565b60006130bb846131c0565b9050806040015165ffffffffffff164211806130e25750806020015165ffffffffffff1642105b905194909350915050565b606081356020830135600061310d6131086040870187613d98565b613523565b905060006131216131086060880188613d98565b9050608086013560a087013560c088013560e08901356101008a013560006131506131086101208e018e613d98565b604080516001600160a01b039c909c1660208d01528b81019a909a5260608b019890985250608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408084019190915281518084039091018152610160909201905292915050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff81166000036131fc575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60008183106132405781613242565b825b9392505050565b8015610ee3578251516001600160a01b0381163b156132b45784604051631101335b60e11b8152600401610727918152604060208201819052601f908201527f414131302073656e64657220616c726561647920636f6e737472756374656400606082015260800190565b8351606001516040517f570e1a360000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163570e1a36919061332590889088906004016140ac565b60206040518083038160008887f1158015613344573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061336991906140c0565b90506001600160a01b0381166133cb5785604051631101335b60e11b8152600401610727918152604060208201819052601b908201527f4141313320696e6974436f6465206661696c6564206f72204f4f470000000000606082015260800190565b816001600160a01b0316816001600160a01b0316146134355785604051631101335b60e11b815260040161072791815260406020808301829052908201527f4141313420696e6974436f6465206d7573742072657475726e2073656e646572606082015260800190565b806001600160a01b03163b6000036134985785604051631101335b60e11b815260040161072791815260406020808301829052908201527f4141313520696e6974436f6465206d757374206372656174652073656e646572606082015260800190565b60006134a7601482868861403a565b6134b091614064565b60601c9050826001600160a01b031686602001517fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d83896000015160a001516040516135129291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050505050565b6000604051828085833790209392505050565b6040518060a0016040528061359b60405180610100016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001600080191681526020016000815260200160008152602001600081525090565b6000602082840312156135d257600080fd5b813563ffffffff8116811461324257600080fd5b803577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461360e57600080fd5b919050565b60006020828403121561362557600080fd5b613242826135e6565b6001600160a01b038116811461294357600080fd5b803561360e8161362e565b6000806040838503121561366157600080fd5b823561366c8161362e565b915061367a602084016135e6565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810181811067ffffffffffffffff821117156136d2576136d2613683565b60405250565b610100810181811067ffffffffffffffff821117156136d2576136d2613683565b601f19601f830116810181811067ffffffffffffffff8211171561371f5761371f613683565b6040525050565b600067ffffffffffffffff82111561374057613740613683565b50601f01601f191660200190565b600081830361018081121561376257600080fd5b60405161376e816136b2565b8092506101008083121561378157600080fd5b604051925061378f836136d8565b61379885613643565b8352602085013560208401526040850135604084015260608501356060840152608085013560808401526137ce60a08601613643565b60a084015260c085013560c084015260e085013560e084015282825280850135602083015250610120840135604082015261014084013560608201526101608401356080820152505092915050565b60008083601f84011261382f57600080fd5b50813567ffffffffffffffff81111561384757600080fd5b60208301915083602082850101111561385f57600080fd5b9250929050565b6000806000806101c0858703121561387d57600080fd5b843567ffffffffffffffff8082111561389557600080fd5b818701915087601f8301126138a957600080fd5b81356138b481613726565b6040516138c182826136f9565b8281528a60208487010111156138d657600080fd5b826020860160208301376000602084830101528098505050506138fc886020890161374e565b94506101a087013591508082111561391357600080fd5b506139208782880161381d565b95989497509550505050565b60008083601f84011261393e57600080fd5b50813567ffffffffffffffff81111561395657600080fd5b6020830191508360208260051b850101111561385f57600080fd5b60008060006040848603121561398657600080fd5b833567ffffffffffffffff81111561399d57600080fd5b6139a98682870161392c565b90945092505060208401356139bd8161362e565b809150509250925092565b600080604083850312156139db57600080fd5b82356139e68161362e565b946020939093013593505050565b600060208284031215613a0657600080fd5b81356132428161362e565b600080600080600060608688031215613a2957600080fd5b853567ffffffffffffffff80821115613a4157600080fd5b613a4d89838a0161381d565b909750955060208801359150613a628261362e565b90935060408701359080821115613a7857600080fd5b50613a858882890161381d565b969995985093965092949392505050565b60008060208385031215613aa957600080fd5b823567ffffffffffffffff811115613ac057600080fd5b613acc8582860161381d565b90969095509350505050565b60006101608284031215613aeb57600080fd5b50919050565b600060208284031215613b0357600080fd5b813567ffffffffffffffff811115613b1a57600080fd5b612a3a84828501613ad8565b60008060008060608587031215613b3c57600080fd5b843567ffffffffffffffff80821115613b5457600080fd5b613b6088838901613ad8565b955060208701359150613b728261362e565b9093506040860135908082111561391357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613bca57613bca613b88565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c0057613c00613b88565b5060010190565b60005b83811015613c22578181015183820152602001613c0a565b83811115610ee35750506000910152565b60008151808452613c4b816020860160208601613c07565b601f01601f19169290920160200192915050565b828152604060208201526000612a3a6040830184613c33565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1833603018112613cdb57600080fd5b9190910192915050565b600082821015613cf757613cf7613b88565b500390565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613cdb57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d6557600080fd5b83018035915067ffffffffffffffff821115613d8057600080fd5b6020019150600581901b360382131561385f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613dcd57600080fd5b83018035915067ffffffffffffffff821115613de857600080fd5b60200191503681900382131561385f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e3257600080fd5b830160208101925035905067ffffffffffffffff811115613e5257600080fd5b80360382131561385f57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6000610160613eab84613e9e85613643565b6001600160a01b03169052565b60208301356020850152613ec26040840184613dfd565b826040870152613ed58387018284613e61565b92505050613ee66060840184613dfd565b8583036060870152613ef9838284613e61565b925050506080830135608085015260a083013560a085015260c083013560c085015260e083013560e0850152610100808401358186015250610120613f4081850185613dfd565b86840383880152613f52848284613e61565b9350505050610140613f6681850185613dfd565b86840383880152613f78848284613e61565b979650505050505050565b6040808252810184905260006060600586901b830181019083018783805b89811015614023577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa087860301845282357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18c3603018112614001578283fd5b61400d868d8301613e8c565b9550506020938401939290920191600101613fa1565b505050508281036020840152613f78818587613e61565b6000808585111561404a57600080fd5b8386111561405757600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156140a45780818660140360031b1b83161692505b505092915050565b602081526000612a3a602083018486613e61565b6000602082840312156140d257600080fd5b81516132428161362e565b600065ffffffffffff8083168185168083038211156140fe576140fe613b88565b01949350505050565b8183823760009101908152919050565b868152856020820152600065ffffffffffff8087166040840152808616606084015250831515608083015260c060a083015261415660c0830184613c33565b98975050505050505050565b80518252602081015160208301526040810151151560408301526000606082015165ffffffffffff8082166060860152806080850151166080860152505060a082015160c060a0850152612a3a60c0850182613c33565b60006101408083526141cd81840189614162565b9150506141e7602083018780518252602090810151910152565b845160608301526020948501516080830152835160a08301529284015160c082015281516001600160a01b031660e0820152908301518051610100830152909201516101209092019190915292915050565b60e08152600061424c60e0830187614162565b9050614265602083018680518252602090810151910152565b8351606083015260208401516080830152825160a0830152602083015160c083015295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000600385106142f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8482526060602083015261430f6060830185613c33565b9050826040830152949350505050565b600060033d11156143385760046000803e5060005160e01c5b90565b600060443d10156143495790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561439757505050505090565b82850191508151818111156143af5750505050505090565b843d87010160208285010111156143c95750505050505090565b6143d8602082860101876136f9565b509095945050505050565b7f4141353020706f73744f702072657665727465643a200000000000000000000081526000825161441b816016850160208701613c07565b9190910160160192915050565b60006101c080835261443d8184018789613e61565b905084516001600160a01b03808251166020860152602082015160408601526040820151606086015260608201516080860152608082015160a08601528060a08301511660c08601525060c081015160e085015260e08101516101008501525060208501516101208401526040850151610140840152606085015161016084015260808501516101808401528281036101a0840152613f788185613c33565b6000602082840312156144ee57600080fd5b5051919050565b606081526000614509606083018789613e61565b6001600160a01b03861660208401528281036040840152614156818587613e61565b60608152600061453e6060830186613e8c565b60208301949094525060400152919050565b7f414132332072657665727465643a20000000000000000000000000000000000081526000825161458881600f850160208701613c07565b91909101600f0192915050565b600080604083850312156145a857600080fd5b825167ffffffffffffffff8111156145bf57600080fd5b8301601f810185136145d057600080fd5b80516145db81613726565b6040516145e882826136f9565b8281528760208486010111156145fd57600080fd5b61460e836020830160208701613c07565b6020969096015195979596505050505050565b7f414133332072657665727465643a20000000000000000000000000000000000081526000825161458881600f850160208701613c0756fea2646970667358221220f0f232a571a80f7eeb9a2c966c30f3f757b335b20d8ceedcfc0d9ef65f14020364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x163 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8F41EC5A GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD6383F94 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD6383F94 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0xFC7E286D EQ PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x50C JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9B249F69 GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0x4B9 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0xB760FAF9 EQ PUSH2 0x4F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8F41EC5A EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0x957122AB EQ PUSH2 0x499 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x4B1D7CF5 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x4B1D7CF5 EQ PUSH2 0x2DC JUMPI DUP1 PUSH4 0x5287CE12 EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 EQ PUSH2 0x236 JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1B2E01B8 GT PUSH2 0x148 JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x1AB JUMPI DUP1 PUSH4 0x1D732756 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0x1FAD948C EQ PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x173 JUMPI PUSH2 0x171 CALLER PUSH2 0x65B JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x171 PUSH2 0x186 CALLDATASIZE PUSH1 0x4 PUSH2 0x35C0 JUMP JUMPDEST PUSH2 0x6C9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x1A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3613 JUMP JUMPDEST PUSH2 0x9E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x364E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0x3866 JUMP JUMPDEST PUSH2 0xA2C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x222 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x231 CALLDATASIZE PUSH1 0x4 PUSH2 0x3971 JUMP JUMPDEST PUSH2 0xBB8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x251 CALLDATASIZE PUSH1 0x4 PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0xD35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x364E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 AND OR SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x2F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x3971 JUMP JUMPDEST PUSH2 0xEE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3DF PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH15 0x10000000000000000000000000000 DUP3 DIV PUSH1 0xFF AND ISZERO ISZERO SWAP5 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH16 0x1000000000000000000000000000000 SWAP1 DIV SWAP1 SWAP3 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD PUSH4 0xFFFFFFFF DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD ISZERO ISZERO SWAP1 DUP4 ADD MSTORE DUP4 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP2 DUP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD PUSH2 0x1ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x459 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH1 0x1 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x4B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A11 JUMP JUMPDEST PUSH2 0x1364 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x4D4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A96 JUMP JUMPDEST PUSH2 0x1461 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E3 PUSH2 0x4F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AF1 JUMP JUMPDEST PUSH2 0x154E JUMP JUMPDEST PUSH2 0x171 PUSH2 0x507 CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x65B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x1590 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x1713 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x3B26 JUMP JUMPDEST PUSH2 0x1991 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x171 PUSH2 0x57C CALLDATASIZE PUSH1 0x4 PUSH2 0x3AF1 JUMP JUMPDEST PUSH2 0x1AA5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x60E PUSH2 0x59C CALLDATASIZE PUSH1 0x4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH15 0x10000000000000000000000000000 DUP2 DIV PUSH1 0xFF AND SWAP3 PUSH16 0x1000000000000000000000000000000 SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH4 0xFFFFFFFF DUP2 AND SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND DUP6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE SWAP5 ISZERO ISZERO PUSH1 0x20 DUP7 ADD MSTORE SWAP3 SWAP1 SWAP5 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x1ED JUMP JUMPDEST PUSH2 0x665 DUP2 CALLVALUE PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP3 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP4 MSTORE SWAP3 SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH4 0xFFFFFFFF DUP3 AND PUSH2 0x730 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374207370656369667920756E7374616B652064656C6179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP1 DUP4 AND LT ISZERO PUSH2 0x78E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F7420646563726561736520756E7374616B652074696D6500000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x7C1 SWAP1 CALLVALUE SWAP1 PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT PUSH2 0x813 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207374616B65207370656369666965640000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x871 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7374616B65206F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE DUP4 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 DUP1 DUP5 ADD DUP3 DUP2 MSTORE DUP7 DUP5 AND DUP6 DUP8 ADD SWAP1 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP12 AND PUSH1 0x60 DUP9 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x80 DUP10 ADD DUP2 DUP2 MSTORE CALLER DUP1 DUP4 MSTORE SWAP7 DUP3 SWAP1 MSTORE SWAP1 DUP11 SWAP1 KECCAK256 SWAP9 MLOAD DUP10 SLOAD SWAP6 MLOAD SWAP5 MLOAD DUP10 AND PUSH16 0x1000000000000000000000000000000 MUL PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 ISZERO ISZERO PUSH15 0x10000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 SWAP1 SWAP8 AND SWAP2 SWAP1 SWAP10 AND OR SWAP5 SWAP1 SWAP5 OR SWAP3 SWAP1 SWAP3 AND SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE MLOAD SWAP5 SWAP1 SWAP3 ADD DUP1 SLOAD SWAP3 MLOAD PUSH6 0xFFFFFFFFFFFF AND PUSH5 0x100000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR OR SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xA5AE833D0BB1DCD632D98A8B70973E8516812898E19BF27B70071EBC8DC52C01 SWAP1 PUSH2 0x9D7 SWAP1 DUP5 SWAP1 DUP8 SWAP1 SWAP2 DUP3 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP2 PUSH2 0xA24 DUP4 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP CALLER ADDRESS EQ PUSH2 0xA81 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393220696E7465726E616C2063616C6C206F6E6C79000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x60 DUP3 ADD MLOAD DUP2 ADD PUSH2 0x1388 ADD GAS LT ISZERO PUSH2 0xAC4 JUMPI PUSH32 0xDEADDEAD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 REVERT JUMPDEST DUP8 MLOAD PUSH1 0x0 SWAP1 ISZERO PUSH2 0xB58 JUMPI PUSH1 0x0 PUSH2 0xAE1 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP13 DUP7 PUSH2 0x1E88 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xB56 JUMPI PUSH1 0x0 PUSH2 0xAF5 PUSH2 0x800 PUSH2 0x1EA0 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB50 JUMPI DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x20 ADD MLOAD PUSH32 0x1C4FADA7374C0A9EE8841FC38AFE82932DC0F8E69012E927F061A8BAE611A201 DUP8 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x40 MLOAD PUSH2 0xB47 SWAP3 SWAP2 SWAP1 PUSH2 0x3C5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST PUSH1 0x1 SWAP3 POP POP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP9 PUSH1 0x80 ADD MLOAD GAS DUP7 SUB ADD SWAP1 POP PUSH2 0xBAA PUSH1 0x0 DUP4 DUP12 DUP12 DUP12 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP9 SWAP3 POP PUSH2 0x1ECC SWAP2 POP POP JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xBC0 PUSH2 0x2200 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBDC JUMPI PUSH2 0xBDC PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xC15 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xC02 PUSH2 0x3536 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xBFA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xC8E JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xC37 JUMPI PUSH2 0xC37 PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0xC72 DUP5 DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0xC5A JUMPI PUSH2 0xC5A PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xC6C SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP6 PUSH2 0x2257 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xC83 DUP5 DUP4 DUP4 PUSH1 0x0 PUSH2 0x2442 JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xC1B JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 SWAP1 DUP3 SWAP1 LOG1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI PUSH2 0xD0C DUP2 DUP9 DUP9 DUP5 DUP2 DUP2 LT PUSH2 0xCDB JUMPI PUSH2 0xCDB PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xCED SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xCFF JUMPI PUSH2 0xCFF PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x260C JUMP JUMPDEST SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xCBD JUMP JUMPDEST POP PUSH2 0xD23 DUP5 DUP3 PUSH2 0x275A JUMP JUMPDEST POP POP POP PUSH2 0xD30 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xDA5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x576974686472617720616D6F756E7420746F6F206C6172676500000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH2 0xDC2 SWAP1 DUP4 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3CE5 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND OR DUP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xD1C19FBCD4551A5EDFB66D43D2E337C04837AFDA3482B42BDF569A8FCCDAE5FB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xE8D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xE92 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xEE3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F2077697468647261770000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x2200 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP1 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x109C JUMPI CALLDATASIZE DUP7 DUP7 DUP4 DUP2 DUP2 LT PUSH2 0xF11 JUMPI PUSH2 0xF11 PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0xF23 SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0xF32 DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0xF49 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x39F4 JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ADD PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393620696E76616C69642061676772656761746F72000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1079 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xE3563A4F DUP5 DUP5 PUSH2 0xFF0 PUSH1 0x40 DUP10 ADD DUP10 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x100F SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3F83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1027 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1038 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x1079 JUMPI PUSH1 0x40 MLOAD PUSH32 0x86A9F75000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x1083 DUP3 DUP8 PUSH2 0x3BB7 JUMP JUMPDEST SWAP6 POP POP POP POP POP DUP1 DUP1 PUSH2 0x1094 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0xEF6 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10B8 JUMPI PUSH2 0x10B8 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10F1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x10DE PUSH2 0x3536 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x10D6 JUMPI SWAP1 POP JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH32 0xBB47EE3E183A558B1A2FF0874B079F3FC5478B7454EACF2BFC5AF2FF5878F972 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1206 JUMPI CALLDATASIZE DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0x113D JUMPI PUSH2 0x113D PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x114F SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0x115E DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0x1175 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x39F4 JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11ED JUMPI PUSH1 0x0 DUP10 DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x1197 JUMPI PUSH2 0x1197 PUSH2 0x3C78 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x11BA DUP12 DUP10 DUP10 DUP8 DUP2 DUP2 LT PUSH2 0xC5A JUMPI PUSH2 0xC5A PUSH2 0x3C78 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x11CA DUP5 DUP4 DUP4 DUP10 PUSH2 0x2442 JUMP JUMPDEST DUP11 PUSH2 0x11D4 DUP2 PUSH2 0x3BCF JUMP JUMPDEST SWAP12 POP POP POP POP POP DUP1 DUP1 PUSH2 0x11E5 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x117B JUMP JUMPDEST POP POP POP POP POP POP DUP1 DUP1 PUSH2 0x11FE SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1122 JUMP JUMPDEST POP PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x131F JUMPI CALLDATASIZE DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x122A JUMPI PUSH2 0x122A PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x123C SWAP2 SWAP1 PUSH2 0x3CFC JUMP JUMPDEST SWAP1 POP PUSH2 0x124E PUSH1 0x40 DUP3 ADD PUSH1 0x20 DUP4 ADD PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 CALLDATASIZE PUSH1 0x0 PUSH2 0x1290 DUP4 DUP1 PUSH2 0x3D30 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1307 JUMPI PUSH2 0x12DB DUP9 DUP6 DUP6 DUP5 DUP2 DUP2 LT PUSH2 0x12B7 JUMPI PUSH2 0x12B7 PUSH2 0x3C78 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x12C9 SWAP2 SWAP1 PUSH2 0x3CA7 JUMP JUMPDEST DUP12 DUP12 DUP2 MLOAD DUP2 LT PUSH2 0xCFF JUMPI PUSH2 0xCFF PUSH2 0x3C78 JUMP JUMPDEST PUSH2 0x12E5 SWAP1 DUP9 PUSH2 0x3BB7 JUMP JUMPDEST SWAP7 POP DUP8 PUSH2 0x12F1 DUP2 PUSH2 0x3BCF JUMP JUMPDEST SWAP9 POP POP DUP1 DUP1 PUSH2 0x12FF SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1299 JUMP JUMPDEST POP POP POP POP POP DUP1 DUP1 PUSH2 0x1317 SWAP1 PUSH2 0x3BCF JUMP JUMPDEST SWAP2 POP POP PUSH2 0x120F JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x575FF3ACADD5AB348FE1855E217E0F3678F8D767D7494C9F9FEFBEE2E17CCA4D SWAP1 DUP3 SWAP1 LOG2 PUSH2 0x1355 DUP7 DUP3 PUSH2 0x275A JUMP JUMPDEST POP POP POP POP POP PUSH2 0xD30 PUSH1 0x1 PUSH1 0x2 SSTORE JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x137A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND EXTCODESIZE ISZERO JUMPDEST ISZERO PUSH2 0x13C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413230206163636F756E74206E6F74206465706C6F79656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x14 DUP2 LT PUSH2 0x143F JUMPI PUSH1 0x0 PUSH2 0x13DE PUSH1 0x14 DUP3 DUP5 DUP7 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x13E7 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP1 EXTCODESIZE PUSH1 0x0 SUB PUSH2 0x143D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413330207061796D6173746572206E6F74206465706C6F7965640000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x570E1A36 SWAP1 PUSH2 0x14CB SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x40AC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x14EA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x150E SWAP2 SWAP1 PUSH2 0x40C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6CA7B80600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x24 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1559 DUP3 PUSH2 0x2853 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ADDRESS SWAP1 DUP3 ADD MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x1 DUP2 ADD SLOAD SWAP1 SWAP2 PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND SWAP1 SUB PUSH2 0x15FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F74207374616B656400000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP1 SLOAD PUSH15 0x10000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH2 0x165F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x616C726561647920756E7374616B696E67000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1677 SWAP1 PUSH4 0xFFFFFFFF AND TIMESTAMP PUSH2 0x40DD JUMP JUMPDEST PUSH1 0x1 DUP4 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFF AND PUSH5 0x100000000 PUSH6 0xFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP4 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE SWAP1 SWAP2 POP CALLER SWAP1 PUSH32 0xFA9B3C14CC825C412C9ED81B3BA365A5B459439403F18829E572ED53A4180F0A SWAP1 PUSH1 0x20 ADD PUSH2 0x6BD JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x1794 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207374616B6520746F207769746864726177000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH2 0x17F5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742063616C6C20756E6C6F636B5374616B652829206669727374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD TIMESTAMP PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x185A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5374616B65207769746864726177616C206973206E6F74206475650000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 AND SWAP1 SSTORE DUP2 SLOAD PUSH32 0xFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE CALLER SWAP2 PUSH32 0xB7C918E0E249F999E965CAFEB6C664271B3F4317D296461500E71DA39F0CBDA3 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x193B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1940 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xEE3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6661696C656420746F207769746864726177207374616B650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x1999 PUSH2 0x3536 JUMP JUMPDEST PUSH2 0x19A2 DUP6 PUSH2 0x286C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19B1 PUSH1 0x0 DUP9 DUP6 PUSH2 0x2257 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH2 0x19C1 DUP4 DUP4 PUSH2 0x2946 JUMP JUMPDEST SWAP1 POP PUSH2 0x19CC NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19DA PUSH1 0x0 DUP11 DUP8 PUSH2 0x260C JUMP JUMPDEST SWAP1 POP PUSH2 0x19E5 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND ISZERO PUSH2 0x1A5B JUMPI DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0x1A12 SWAP3 SWAP2 SWAP1 PUSH2 0x4107 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A4F JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A54 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP JUMPDEST DUP7 PUSH1 0x80 ADD MLOAD DUP4 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 DUP6 PUSH1 0x40 MLOAD PUSH32 0x8B7AC98000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4117 JUMP JUMPDEST PUSH2 0x1AAD PUSH2 0x3536 JUMP JUMPDEST PUSH2 0x1AB6 DUP3 PUSH2 0x286C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1AC5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x2257 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP4 MSTORE DUP3 DUP3 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH16 0x1000000000000000000000000000000 SWAP2 DUP3 SWAP1 DIV DUP2 AND DUP8 MSTORE PUSH1 0x1 SWAP3 DUP4 ADD SLOAD PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP1 SWAP5 MSTORE DUP14 MLOAD MLOAD DUP9 MLOAD DUP1 DUP11 ADD DUP11 MSTORE DUP8 DUP2 MSTORE DUP1 DUP8 ADD DUP9 DUP2 MSTORE SWAP2 SWAP1 SWAP11 AND DUP8 MSTORE DUP7 DUP7 MSTORE DUP9 DUP8 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SWAP4 DIV SWAP1 SWAP2 AND DUP10 MSTORE SWAP2 ADD SLOAD SWAP1 SWAP2 AND SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD SWAP1 SWAP5 MSTORE DUP2 DUP5 MSTORE DUP4 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 CALLDATASIZE PUSH1 0x0 PUSH2 0x1B86 PUSH1 0x40 DUP11 ADD DUP11 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH1 0x14 DUP3 LT ISZERO PUSH2 0x1B9D JUMPI PUSH1 0x0 PUSH2 0x1BB8 JUMP JUMPDEST PUSH2 0x1BAB PUSH1 0x14 PUSH1 0x0 DUP5 DUP7 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x1BB4 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP4 MSTORE SWAP1 DUP3 SWAP1 MSTORE SWAP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x1 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 SWAP2 MSTORE SWAP1 SWAP2 POP SWAP4 POP POP POP POP PUSH1 0x0 PUSH2 0x1C29 DUP7 DUP7 PUSH2 0x2946 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ SWAP1 POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH1 0x80 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CA6 DUP13 PUSH1 0x60 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 MSTORE SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1CCC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x1D78 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP1 DUP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE SWAP4 DUP3 MSTORE DUP2 DUP2 MSTORE SWAP1 DUP6 SWAP1 KECCAK256 DUP1 SLOAD PUSH16 0x1000000000000000000000000000000 SWAP1 DIV PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x1 ADD SLOAD PUSH4 0xFFFFFFFF AND SWAP1 SWAP3 MSTORE SWAP1 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0xFAECB4E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x727 SWAP1 DUP4 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP13 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x41B9 JUMP JUMPDEST DUP1 DUP7 DUP7 DUP10 PUSH1 0x40 MLOAD PUSH32 0xE0CFF05F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4239 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x1DEA SWAP1 DUP5 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E4A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6465706F736974206F766572666C6F7700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 MLOAD PUSH1 0x20 DUP7 ADD DUP8 DUP10 DUP8 CALL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE DUP3 DUP2 GT ISZERO PUSH2 0x1EAE JUMPI POP DUP2 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP3 ADD DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP2 PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS DUP6 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 DUP2 PUSH2 0x1EE2 DUP3 PUSH2 0x2A12 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1F01 JUMPI DUP3 MLOAD SWAP4 POP PUSH2 0x20E5 JUMP JUMPDEST DUP1 SWAP4 POP PUSH1 0x0 DUP9 MLOAD GT ISZERO PUSH2 0x20E5 JUMPI DUP7 DUP3 MUL SWAP6 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1F27 JUMPI PUSH2 0x1F27 PUSH2 0x4290 JUMP JUMPDEST EQ PUSH2 0x1FB2 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0xA9A23409 SWAP2 PUSH2 0x1F7A SWAP1 DUP15 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x42BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x1FA8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x20E5 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9A2340900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0xA9A23409 SWAP2 PUSH2 0x2000 SWAP1 DUP15 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x42BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x202C JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x20E5 JUMPI PUSH2 0x2038 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2091 JUMPI POP PUSH2 0x204C PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x2057 JUMPI POP PUSH2 0x2093 JUMP JUMPDEST DUP12 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x43E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH4 0x1101335B PUSH1 0xE1 SHL DUP3 MSTORE PUSH2 0x727 SWAP3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3C5F JUMP JUMPDEST POP JUMPDEST DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x12 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141353020706F73744F70207265766572740000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST GAS DUP6 SUB DUP8 ADD SWAP7 POP DUP2 DUP8 MUL SWAP6 POP DUP6 DUP10 PUSH1 0x40 ADD MLOAD LT ISZERO PUSH2 0x214E JUMPI DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x414135312070726566756E642062656C6F772061637475616C476173436F7374 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD DUP7 SWAP1 SUB PUSH2 0x2160 DUP6 DUP3 PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP13 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2175 JUMPI PUSH2 0x2175 PUSH2 0x4290 JUMP JUMPDEST EQ SWAP1 POP DUP5 PUSH1 0xA0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP13 PUSH1 0x20 ADD MLOAD PUSH32 0x49628FD1471006C1482DA88028E9CE4DBB080B815C9B0344D39E5A8E6EC1419F DUP9 PUSH1 0x20 ADD MLOAD DUP6 DUP14 DUP16 PUSH1 0x40 MLOAD PUSH2 0x21E8 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 SWAP4 DUP5 MSTORE SWAP2 ISZERO ISZERO PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD SUB PUSH2 0x2251 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x2 DUP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 GAS DUP5 MLOAD SWAP1 SWAP2 POP PUSH2 0x226C DUP7 DUP3 PUSH2 0x2A42 JUMP JUMPDEST PUSH2 0x2275 DUP7 PUSH2 0x154E JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP4 ADD MLOAD OR OR PUSH1 0xE0 DUP8 ADD CALLDATALOAD OR PUSH2 0x100 DUP8 ADD CALLDATALOAD OR PUSH15 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x22F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413934206761732076616C756573206F766572666C6F770000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2303 DUP5 PUSH2 0x2B3B JUMP JUMPDEST SWAP1 POP PUSH2 0x2311 DUP11 DUP11 DUP11 DUP5 PUSH2 0x2B88 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x20 DUP8 ADD MLOAD SWAP2 SWAP10 POP SWAP2 SWAP4 POP PUSH2 0x2328 SWAP2 SWAP1 PUSH2 0x2E0D JUMP JUMPDEST PUSH2 0x237E JUMPI DUP10 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4141323520696E76616C6964206163636F756E74206E6F6E6365000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH2 0x2387 NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0x60 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x23AF JUMPI PUSH2 0x23AA DUP12 DUP12 DUP12 DUP6 DUP8 PUSH2 0x2E5B JUMP JUMPDEST SWAP8 POP SWAP1 POP JUMPDEST PUSH1 0x0 GAS DUP8 SUB SWAP1 POP DUP1 DUP12 PUSH1 0xA0 ADD CALLDATALOAD LT ISZERO PUSH2 0x2414 JUMPI DUP12 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x41413430206F76657220766572696669636174696F6E4761734C696D69740000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP11 ADD DUP4 SWAP1 MSTORE DUP2 PUSH1 0x60 DUP12 ADD MSTORE PUSH1 0xC0 DUP12 ADD CALLDATALOAD GAS DUP9 SUB ADD DUP11 PUSH1 0x80 ADD DUP2 DUP2 MSTORE POP POP POP POP POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x244E DUP6 PUSH2 0x309A JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24BD JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2515 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x414132322065787069726564206F72206E6F7420647565000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2520 DUP6 PUSH2 0x309A JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x2585 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413334207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2603 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413332207061796D61737465722065787069726564206F72206E6F74206475 PUSH1 0x60 DUP3 ADD MSTORE PUSH32 0x6500000000000000000000000000000000000000000000000000000000000000 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH1 0x0 PUSH2 0x261F DUP5 PUSH1 0x60 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP1 POP ADDRESS PUSH4 0x1D732756 PUSH2 0x2634 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x3D98 JUMP JUMPDEST DUP8 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2655 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4428 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x2690 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x268D SWAP2 DUP2 ADD SWAP1 PUSH2 0x44DC JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x274E JUMPI PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD PUSH32 0x2152215300000000000000000000000000000000000000000000000000000000 DUP2 ADD PUSH2 0x2719 JUMPI DUP7 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH32 0x41413935206F7574206F66206761730000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x80 ADD MLOAD GAS PUSH2 0x272B SWAP1 DUP7 PUSH2 0x3CE5 JUMP JUMPDEST PUSH2 0x2735 SWAP2 SWAP1 PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP PUSH2 0x2745 DUP9 PUSH1 0x2 DUP9 DUP7 DUP6 PUSH2 0x1ECC JUMP JUMPDEST SWAP5 POP POP POP PUSH2 0x2751 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x27B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393020696E76616C69642062656E65666963696172790000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x27FD JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2802 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xD30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41413931206661696C65642073656E6420746F2062656E656669636961727900 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x285E DUP3 PUSH2 0x30ED JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH4 0x957122AB PUSH2 0x287F PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x288C PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x39F4 JUMP JUMPDEST PUSH2 0x289A PUSH2 0x120 DUP8 ADD DUP8 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x28BA SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x44F5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x28E3 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x2943 JUMPI PUSH2 0x28EF PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2937 JUMPI POP PUSH2 0x2903 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x290E JUMPI POP PUSH2 0x2939 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2933 JUMPI PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP3 SWAP2 SWAP1 PUSH2 0x3C5F JUMP JUMPDEST POP POP JUMP JUMPDEST POP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x296C DUP5 PUSH2 0x31C0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2979 DUP5 PUSH2 0x31C0 JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2990 JUMPI POP DUP1 MLOAD JUMPDEST PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP3 DUP6 ADD MLOAD SWAP1 DUP6 ADD MLOAD SWAP2 SWAP3 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP6 AND LT ISZERO PUSH2 0x29BE JUMPI DUP2 SWAP4 POP JUMPDEST DUP1 PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x29DA JUMPI DUP1 SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP5 AND DUP5 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 AND SWAP1 DUP3 ADD MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xC0 DUP2 ADD MLOAD PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x0 SWAP2 SWAP1 DUP1 DUP3 SUB PUSH2 0x2A2E JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2A3A DUP3 BASEFEE DUP4 ADD PUSH2 0x3231 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x2A4F PUSH1 0x20 DUP4 ADD DUP4 PUSH2 0x39F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0xA0 DUP4 ADD CALLDATALOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xC0 DUP1 DUP5 ADD CALLDATALOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP1 DUP5 ADD CALLDATALOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x100 DUP4 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE CALLDATASIZE PUSH1 0x0 PUSH2 0x2AAE PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0x2B2E JUMPI PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x2B0A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141393320696E76616C6964207061796D6173746572416E6444617461000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH2 0x2B18 PUSH1 0x14 PUSH1 0x0 DUP4 DUP6 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x2B21 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR PUSH1 0xA0 DUP5 ADD MSTORE PUSH2 0xEE3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP5 ADD MSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2B59 JUMPI PUSH1 0x1 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x3 JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x80 ADD MLOAD DUP3 DUP6 PUSH1 0x60 ADD MLOAD MUL DUP6 PUSH1 0x40 ADD MLOAD ADD ADD SWAP1 POP DUP4 PUSH1 0xC0 ADD MLOAD DUP2 MUL SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 GAS DUP6 MLOAD DUP1 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x2BAD DUP10 DUP9 PUSH2 0x2BA8 PUSH1 0x40 DUP13 ADD DUP13 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x3249 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH2 0x2BBB NUMBER PUSH1 0x0 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2C0A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 DUP2 GT PUSH2 0x2C03 JUMPI DUP1 DUP10 SUB PUSH2 0x2C06 JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP2 POP POP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x20 DUP11 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x3A871CDD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 PUSH4 0x3A871CDD SWAP3 SWAP1 SWAP2 PUSH2 0x2C5D SWAP2 DUP16 SWAP2 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x452B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x2C99 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x2C96 SWAP2 DUP2 ADD SWAP1 PUSH2 0x44DC JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x2D2A JUMPI PUSH2 0x2CA5 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x2CD6 JUMPI POP PUSH2 0x2CB9 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x2CC4 JUMPI POP PUSH2 0x2CD8 JUMP JUMPDEST DUP12 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x4550 JUMP JUMPDEST POP JUMPDEST DUP11 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141323320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2DFA JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 DUP11 GT ISZERO PUSH2 0x2DBE JUMPI DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x41413231206469646E2774207061792070726566756E64000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 AND SWAP1 DUP11 SWAP1 SUB PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR SWAP1 SSTORE JUMPDEST GAS DUP6 SUB SWAP7 POP POP POP POP POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP3 SHR DUP1 DUP6 MSTORE SWAP3 MSTORE DUP3 KECCAK256 DUP1 SLOAD DUP5 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 AND SWAP2 SWAP1 DUP6 PUSH2 0x2E4D DUP4 PUSH2 0x3BCF JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP EQ SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP3 MLOAD PUSH1 0x60 DUP2 DUP2 ADD MLOAD SWAP1 SWAP2 PUSH1 0x0 SWAP2 DUP5 DUP2 GT PUSH2 0x2EB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4141343120746F6F206C6974746C6520766572696669636174696F6E47617300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x727 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP8 DUP5 SUB SWAP3 SWAP2 SWAP1 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 DUP2 LT ISZERO PUSH2 0x2F46 JUMPI DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x41413331207061796D6173746572206465706F73697420746F6F206C6F770000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP10 DUP2 SUB DUP3 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF465C77E DUP6 DUP15 DUP15 PUSH1 0x20 ADD MLOAD DUP15 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2FB4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x452B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL SWAP4 POP POP POP POP DUP1 ISZERO PUSH2 0x2FF5 JUMPI POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x2FF2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4595 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x3086 JUMPI PUSH2 0x3001 PUSH2 0x431F JUMP JUMPDEST DUP1 PUSH4 0x8C379A0 SUB PUSH2 0x3032 JUMPI POP PUSH2 0x3015 PUSH2 0x433B JUMP JUMPDEST DUP1 PUSH2 0x3020 JUMPI POP PUSH2 0x3034 JUMP JUMPDEST DUP14 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2069 SWAP2 SWAP1 PUSH2 0x4621 JUMP JUMPDEST POP JUMPDEST DUP13 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x4141333320726576657274656420286F72204F4F472900000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP15 SWAP1 SWAP14 POP SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH1 0x0 SUB PUSH2 0x30B0 JUMPI POP PUSH1 0x0 SWAP3 DUP4 SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30BB DUP5 PUSH2 0x31C0 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND TIMESTAMP GT DUP1 PUSH2 0x30E2 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND TIMESTAMP LT JUMPDEST SWAP1 MLOAD SWAP5 SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x310D PUSH2 0x3108 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x3D98 JUMP JUMPDEST PUSH2 0x3523 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3121 PUSH2 0x3108 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x3D98 JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP10 ADD CALLDATALOAD PUSH2 0x100 DUP11 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x3150 PUSH2 0x3108 PUSH2 0x120 DUP15 ADD DUP15 PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP13 SWAP1 SWAP13 AND PUSH1 0x20 DUP14 ADD MSTORE DUP12 DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE PUSH1 0x60 DUP12 ADD SWAP9 SWAP1 SWAP9 MSTORE POP PUSH1 0x80 DUP10 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xA0 DUP9 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xC0 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH2 0x160 SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 PUSH1 0xA0 DUP2 SWAP1 SHR PUSH6 0xFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SUB PUSH2 0x31FC JUMPI POP PUSH6 0xFFFFFFFFFFFF JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xD0 SWAP5 SWAP1 SWAP5 SHR PUSH1 0x20 DUP4 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x3240 JUMPI DUP2 PUSH2 0x3242 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEE3 JUMPI DUP3 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND EXTCODESIZE ISZERO PUSH2 0x32B4 JUMPI DUP5 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x414131302073656E64657220616C726561647920636F6E737472756374656400 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x570E1A3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0x570E1A36 SWAP2 SWAP1 PUSH2 0x3325 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x40AC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x3344 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3369 SWAP2 SWAP1 PUSH2 0x40C0 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x33CB JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313320696E6974436F6465206661696C6564206F72204F4F470000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3435 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313420696E6974436F6465206D7573742072657475726E2073656E646572 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE PUSH1 0x0 SUB PUSH2 0x3498 JUMPI DUP6 PUSH1 0x40 MLOAD PUSH4 0x1101335B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x727 SWAP2 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE SWAP1 DUP3 ADD MSTORE PUSH32 0x4141313520696E6974436F6465206D757374206372656174652073656E646572 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34A7 PUSH1 0x14 DUP3 DUP7 DUP9 PUSH2 0x403A JUMP JUMPDEST PUSH2 0x34B0 SWAP2 PUSH2 0x4064 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH32 0xD51A9C61267AA6196961883ECF5FF2DA6619C37DAC0FA92122513FB32C032D2D DUP4 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3512 SWAP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP1 DUP6 DUP4 CALLDATACOPY SWAP1 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x359B PUSH1 0x40 MLOAD DUP1 PUSH2 0x100 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x35D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x360E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3625 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3242 DUP3 PUSH2 0x35E6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x2943 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x360E DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3661 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x366C DUP2 PUSH2 0x362E JUMP JUMPDEST SWAP2 POP PUSH2 0x367A PUSH1 0x20 DUP5 ADD PUSH2 0x35E6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA0 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x36D2 JUMPI PUSH2 0x36D2 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MSTORE POP JUMP JUMPDEST PUSH2 0x100 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x36D2 JUMPI PUSH2 0x36D2 PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x371F JUMPI PUSH2 0x371F PUSH2 0x3683 JUMP JUMPDEST PUSH1 0x40 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3740 JUMPI PUSH2 0x3740 PUSH2 0x3683 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SUB PUSH2 0x180 DUP2 SLT ISZERO PUSH2 0x3762 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x376E DUP2 PUSH2 0x36B2 JUMP JUMPDEST DUP1 SWAP3 POP PUSH2 0x100 DUP1 DUP4 SLT ISZERO PUSH2 0x3781 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP3 POP PUSH2 0x378F DUP4 PUSH2 0x36D8 JUMP JUMPDEST PUSH2 0x3798 DUP6 PUSH2 0x3643 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP6 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x37CE PUSH1 0xA0 DUP7 ADD PUSH2 0x3643 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP6 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE DUP3 DUP3 MSTORE DUP1 DUP6 ADD CALLDATALOAD PUSH1 0x20 DUP4 ADD MSTORE POP PUSH2 0x120 DUP5 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x140 DUP5 ADD CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x160 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x382F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3847 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1C0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x387D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x38A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38B4 DUP2 PUSH2 0x3726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x38C1 DUP3 DUP3 PUSH2 0x36F9 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x38D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP9 POP POP POP POP PUSH2 0x38FC DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x374E JUMP JUMPDEST SWAP5 POP PUSH2 0x1A0 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3920 DUP8 DUP3 DUP9 ADD PUSH2 0x381D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x393E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3986 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x399D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39A9 DUP7 DUP3 DUP8 ADD PUSH2 0x392C JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x39BD DUP2 PUSH2 0x362E JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x39DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x39E6 DUP2 PUSH2 0x362E JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3242 DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3A29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3A41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A4D DUP10 DUP4 DUP11 ADD PUSH2 0x381D JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3A62 DUP3 PUSH2 0x362E JUMP JUMPDEST SWAP1 SWAP4 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x3A78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A85 DUP9 DUP3 DUP10 ADD PUSH2 0x381D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3AA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ACC DUP6 DUP3 DUP7 ADD PUSH2 0x381D JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3B03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A3A DUP5 DUP3 DUP6 ADD PUSH2 0x3AD8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3B3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x3B54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B60 DUP9 DUP4 DUP10 ADD PUSH2 0x3AD8 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH2 0x3B72 DUP3 PUSH2 0x362E JUMP JUMPDEST SWAP1 SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x3913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x3BCA JUMPI PUSH2 0x3BCA PUSH2 0x3B88 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x3C00 JUMPI PUSH2 0x3C00 PUSH2 0x3B88 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C22 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C0A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xEE3 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3C4B DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2A3A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3C33 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3CDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x3CF7 JUMPI PUSH2 0x3CF7 PUSH2 0x3B88 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3CDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3D65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3DCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3DE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x3E32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x385F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH2 0x3EAB DUP5 PUSH2 0x3E9E DUP6 PUSH2 0x3643 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x3EC2 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x3DFD JUMP JUMPDEST DUP3 PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x3ED5 DUP4 DUP8 ADD DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x3EE6 PUSH1 0x60 DUP5 ADD DUP5 PUSH2 0x3DFD JUMP JUMPDEST DUP6 DUP4 SUB PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x3EF9 DUP4 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x80 DUP4 ADD CALLDATALOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD CALLDATALOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD CALLDATALOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD CALLDATALOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD CALLDATALOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3F40 DUP2 DUP6 ADD DUP6 PUSH2 0x3DFD JUMP JUMPDEST DUP7 DUP5 SUB DUP4 DUP9 ADD MSTORE PUSH2 0x3F52 DUP5 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x140 PUSH2 0x3F66 DUP2 DUP6 ADD DUP6 PUSH2 0x3DFD JUMP JUMPDEST DUP7 DUP5 SUB DUP4 DUP9 ADD MSTORE PUSH2 0x3F78 DUP5 DUP3 DUP5 PUSH2 0x3E61 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 PUSH1 0x5 DUP7 SWAP1 SHL DUP4 ADD DUP2 ADD SWAP1 DUP4 ADD DUP8 DUP4 DUP1 JUMPDEST DUP10 DUP2 LT ISZERO PUSH2 0x4023 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP8 DUP7 SUB ADD DUP5 MSTORE DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP13 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4001 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x400D DUP7 DUP14 DUP4 ADD PUSH2 0x3E8C JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x3FA1 JUMP JUMPDEST POP POP POP POP DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x3F78 DUP2 DUP6 DUP8 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x404A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x4057 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x40A4 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2A3A PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3242 DUP2 PUSH2 0x362E JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND DUP2 DUP6 AND DUP1 DUP4 SUB DUP3 GT ISZERO PUSH2 0x40FE JUMPI PUSH2 0x40FE PUSH2 0x3B88 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP7 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x60 DUP5 ADD MSTORE POP DUP4 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x4156 PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x3C33 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD ISZERO ISZERO PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x60 DUP7 ADD MSTORE DUP1 PUSH1 0x80 DUP6 ADD MLOAD AND PUSH1 0x80 DUP7 ADD MSTORE POP POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xC0 PUSH1 0xA0 DUP6 ADD MSTORE PUSH2 0x2A3A PUSH1 0xC0 DUP6 ADD DUP3 PUSH2 0x3C33 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP1 DUP4 MSTORE PUSH2 0x41CD DUP2 DUP5 ADD DUP10 PUSH2 0x4162 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x41E7 PUSH1 0x20 DUP4 ADD DUP8 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP5 MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE DUP4 MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 DUP5 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xE0 DUP3 ADD MSTORE SWAP1 DUP4 ADD MLOAD DUP1 MLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP1 SWAP3 ADD MLOAD PUSH2 0x120 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xE0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x424C PUSH1 0xE0 DUP4 ADD DUP8 PUSH2 0x4162 JUMP JUMPDEST SWAP1 POP PUSH2 0x4265 PUSH1 0x20 DUP4 ADD DUP7 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST DUP4 MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP6 LT PUSH2 0x42F8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x430F PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x3C33 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 RETURNDATASIZE GT ISZERO PUSH2 0x4338 JUMPI PUSH1 0x4 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD PUSH1 0xE0 SHR JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x44 RETURNDATASIZE LT ISZERO PUSH2 0x4349 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP1 RETURNDATASIZE ADD PUSH1 0x4 DUP4 RETURNDATACOPY DUP2 MLOAD RETURNDATASIZE PUSH8 0xFFFFFFFFFFFFFFFF DUP2 PUSH1 0x24 DUP5 ADD GT DUP2 DUP5 GT OR ISZERO PUSH2 0x4397 JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP3 DUP6 ADD SWAP2 POP DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x43AF JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP5 RETURNDATASIZE DUP8 ADD ADD PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x43C9 JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH2 0x43D8 PUSH1 0x20 DUP3 DUP7 ADD ADD DUP8 PUSH2 0x36F9 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4141353020706F73744F702072657665727465643A2000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x441B DUP2 PUSH1 0x16 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD PUSH1 0x16 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 MSTORE PUSH2 0x443D DUP2 DUP5 ADD DUP8 DUP10 PUSH2 0x3E61 JUMP JUMPDEST SWAP1 POP DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 MLOAD AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0xA0 DUP7 ADD MSTORE DUP1 PUSH1 0xA0 DUP4 ADD MLOAD AND PUSH1 0xC0 DUP7 ADD MSTORE POP PUSH1 0xC0 DUP2 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH1 0xE0 DUP2 ADD MLOAD PUSH2 0x100 DUP6 ADD MSTORE POP PUSH1 0x20 DUP6 ADD MLOAD PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x140 DUP5 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD PUSH2 0x160 DUP5 ADD MSTORE PUSH1 0x80 DUP6 ADD MLOAD PUSH2 0x180 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH2 0x1A0 DUP5 ADD MSTORE PUSH2 0x3F78 DUP2 DUP6 PUSH2 0x3C33 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x4509 PUSH1 0x60 DUP4 ADD DUP8 DUP10 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4156 DUP2 DUP6 DUP8 PUSH2 0x3E61 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x453E PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x3E8C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x414132332072657665727465643A200000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x4588 DUP2 PUSH1 0xF DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD PUSH1 0xF ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x45BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x45D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x45DB DUP2 PUSH2 0x3726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45E8 DUP3 DUP3 PUSH2 0x36F9 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP7 ADD ADD GT ISZERO PUSH2 0x45FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x460E DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD MLOAD SWAP6 SWAP8 SWAP6 SWAP7 POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x414133332072657665727465643A200000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD PUSH2 0x4588 DUP2 PUSH1 0xF DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3C07 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE CALLCODE ORIGIN 0xA5 PUSH18 0xA80F7EEB9A2C966C30F3F757B335B20D8CEE 0xDC 0xFC 0xD SWAP15 0xF6 0x5F EQ MUL SUB PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"596:27500:53:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1253:21:57;1263:10;1253:9;:21::i;:::-;596:27500:53;;;;;2066:672:57;;;;;;:::i;:::-;;:::i;785:108:55:-;;;;;;;;;;-1:-1:-1;785:108:55;;;;;:::i;:::-;;:::i;268:74::-;;;;;;;;;;-1:-1:-1;268:74:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1465:25:111;;;1453:2;1438:18;268:74:55;;;;;;;;8697:1484:53;;;;;;;;;;-1:-1:-1;8697:1484:53;;;;;:::i;:::-;;:::i;3628:792::-;;;;;;;;;;-1:-1:-1;3628:792:53;;;;;:::i;:::-;;:::i;4318:484:57:-;;;;;;;;;;-1:-1:-1;4318:484:57;;;;;:::i;:::-;;:::i;349:175:55:-;;;;;;;;;;-1:-1:-1;349:175:55;;;;;:::i;:::-;-1:-1:-1;;;;;462:27:55;;;;430:13;462:27;;;:19;:27;;;;514:2;462:27;;;498:12;;;462:32;;;;;;;;;;498:18;;;;;462:55;;349:175;4680:2406:53;;;;;;;;;;-1:-1:-1;4680:2406:53;;;;;:::i;:::-;;:::i;594:128:57:-;;;;;;;;;;-1:-1:-1;594:128:57;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;698:17:57;:8;:17;;;;;;;;;;;;691:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;594:128;;;;;8030:13:111;;7969:30;8026:22;;;8008:41;;8119:4;8107:17;;;8101:24;8094:32;8087:40;8065:20;;;8058:70;8176:17;;;8170:24;8166:33;8144:20;;;8137:63;;;;8260:4;8248:17;;;8242:24;8268:10;8238:41;8216:20;;;8209:71;8340:4;8328:17;;;8322:24;8348:14;8318:45;8296:20;;;8289:75;;;;7946:3;7931:19;594:128:57;7752:618:111;1095:115:57;;;;;;;;;;-1:-1:-1;1095:115:57;;;;;:::i;:::-;-1:-1:-1;;;;;1178:17:57;1152:7;1178:17;;;;;;;;;;:25;;;;1095:115;1291:49:53;;;;;;;;;;;;1339:1;1291:49;;16001:687;;;;;;;;;;-1:-1:-1;16001:687:53;;;;;:::i;:::-;;:::i;15236:172::-;;;;;;;;;;-1:-1:-1;15236:172:53;;;;;:::i;:::-;;:::i;10389:174::-;;;;;;;;;;-1:-1:-1;10389:174:53;;;;;:::i;:::-;;:::i;1649:206:57:-;;;;;;:::i;:::-;;:::i;2877:408::-;;;;;;;;;;;;;:::i;3491:651::-;;;;;;;;;;-1:-1:-1;3491:651:57;;;;;:::i;:::-;;:::i;7124:806:53:-;;;;;;;;;;-1:-1:-1;7124:806:53;;;;;:::i;:::-;;:::i;11899:1494::-;;;;;;;;;;-1:-1:-1;11899:1494:53;;;;;:::i;:::-;;:::i;506:47:57:-;;;;;;;;;;-1:-1:-1;506:47:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11705:30:111;11762:15;;;11744:34;;11821:14;;11814:22;11809:2;11794:18;;11787:50;11873:15;;;;11853:18;;;11846:43;;;;11937:10;11925:23;11920:2;11905:18;;11898:51;11998:14;11986:27;;;11980:3;11965:19;;11958:56;11682:3;11667:19;506:47:57;11446:574:111;1649:206:57;1710:37;1728:7;1737:9;1710:17;:37::i;:::-;-1:-1:-1;;;;;1784:17:57;;1757:24;1784:17;;;;;;;;;;;;1835:12;;1816:32;;1835:12;;;;12171:62:111;;1784:17:57;;1816:32;;12144:18:111;1816:32:57;;;;;;;;1700:155;1649:206;:::o;2066:672::-;2169:10;2133:24;2160:20;;;;;;;;;;2198:19;;;2190:58;;;;-1:-1:-1;;;2190:58:57;;12446:2:111;2190:58:57;;;12428:21:111;12485:2;12465:18;;;12458:30;12524:28;12504:18;;;12497:56;12570:18;;2190:58:57;;;;;;;;;2285:20;;;;;;;;2266:39;;;;;2258:80;;;;-1:-1:-1;;;2258:80:57;;12801:2:111;2258:80:57;;;12783:21:111;12840:2;12820:18;;;12813:30;12879;12859:18;;;12852:58;12927:18;;2258:80:57;12599:352:111;2258:80:57;2364:10;;2348:13;;2364:22;;2377:9;;2364:10;;;;;:22;:::i;:::-;2348:38;;2412:1;2404:5;:9;2396:40;;;;-1:-1:-1;;;2396:40:57;;13480:2:111;2396:40:57;;;13462:21:111;13519:2;13499:18;;;13492:30;13558:20;13538:18;;;13531:48;13596:18;;2396:40:57;13278:342:111;2396:40:57;2463:17;2454:26;;;2446:53;;;;-1:-1:-1;;;2446:53:57;;13827:2:111;2446:53:57;;;13809:21:111;13866:2;13846:18;;;13839:30;13905:16;13885:18;;;13878:44;13939:18;;2446:53:57;13625:338:111;2446:53:57;2532:137;;;;;;;;2557:12;;;;;;2532:137;;2557:12;2532:137;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2532:137:57;;;;;;2518:10;2509:20;;;;;;;;;;;:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2532:137;2509:160;;;;;;;;;;;;;;;;;;2684:47;;;;;;2609:5;;2629:15;;14141:25:111;;;14214:10;14202:23;14197:2;14182:18;;14175:51;14129:2;14114:18;;13968:264;2684:47:57;;;;;;;;2123:615;;2066:672;:::o;785:108:55:-;868:10;848:31;;;;:19;:31;;;;;;;;:36;;;;;;;;;;:38;;;;;;:::i;:::-;;;;;;785:108;:::o;8697:1484:53:-;8811:21;8844:14;8861:9;8844:26;-1:-1:-1;8888:10:53;8910:4;8888:27;8880:63;;;;-1:-1:-1;;;8880:63:53;;14639:2:111;8880:63:53;;;14621:21:111;14678:2;14658:18;;;14651:30;14717:25;14697:18;;;14690:53;14760:18;;8880:63:53;14437:347:111;8880:63:53;8983:14;;9028:20;;;;9182:28;;;;9167:43;;9213:4;9167:50;9155:9;:62;9151:190;;;9270:16;9267:1;9260:27;9314:2;9311:1;9304:13;9151:190;9433:15;;9357:26;;9433:19;9429:466;;9468:12;9483:52;9493:7;:14;;;9509:1;9512:8;9522:12;9483:9;:52::i;:::-;9468:67;;9554:7;9549:336;;9581:19;9603:41;1108:4;9603:18;:41::i;:::-;9666:13;;9581:63;;-1:-1:-1;9666:17:53;9662:152;;9757:7;:14;;;-1:-1:-1;;;;;9712:83:53;9738:6;:17;;;9712:83;9773:7;:13;;;9788:6;9712:83;;;;;;;:::i;:::-;;;;;;;;9662:152;9838:32;9831:39;;9563:322;9549:336;9454:441;9429:466;9921:17;9962:6;:15;;;9950:9;9941:6;:18;:36;9921:56;;10118:50;10132:1;10135:4;10141:6;10149:7;;10118:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10158:9:53;;-1:-1:-1;10118:13:53;;-1:-1:-1;;10118:50:53:i;:::-;10111:57;8697:1484;-1:-1:-1;;;;;;;;;;8697:1484:53:o;3628:792::-;2261:21:33;:19;:21::i;:::-;3754:3:53;3737:14:::1;3754:3:::0;3804:24:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3774:54;;3860:9;3855:309;3879:6;3875:1;:10;3855:309;;;3906:24;3933:7;3941:1;3933:10;;;;;;;;:::i;:::-;;;;;;;3906:37;;3958:22;3982:24:::0;4010:38:::1;4030:1;4033:3;;4037:1;4033:6;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4041;4010:19;:38::i;:::-;3957:91;;;;4062;4105:1;4108:14;4124:16;4150:1;4062:42;:91::i;:::-;-1:-1:-1::0;;;3887:3:53::1;;3855:309;;;-1:-1:-1::0;4210:17:53::1;::::0;4174::::1;::::0;4210::::1;::::0;4174;;4210::::1;4243:9;4238:112;4262:6;4258:1;:10;4238:112;;;4302:37;4317:1;4320:3;;4324:1;4320:6;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4328:7;4336:1;4328:10;;;;;;;;:::i;:::-;;;;;;;4302:14;:37::i;:::-;4289:50:::0;;::::1;::::0;4270:3:::1;;4238:112;;;;4360:35;4372:11;4385:9;4360:11;:35::i;:::-;3835:567;3726:694;;2303:20:33::0;1716:1;2809:7;:22;2629:209;2303:20;3628:792:53;;;:::o;4318:484:57:-;4450:10;4414:24;4441:20;;;;;;;;;;4497:12;;;;4479:30;;;4471:68;;;;-1:-1:-1;;;4471:68:57;;16452:2:111;4471:68:57;;;16434:21:111;16491:2;16471:18;;;16464:30;16530:27;16510:18;;;16503:55;16575:18;;4471:68:57;16250:349:111;4471:68:57;4572:12;;:29;;4587:14;;4572:12;;:29;:::i;:::-;4549:53;;;;;;;;;;;;4617:54;;;-1:-1:-1;;;;;16934:55:111;;16916:74;;17021:2;17006:18;;16999:34;;;4627:10:57;;4617:54;;16889:18:111;4617:54:57;;;;;;;4682:12;4699:15;-1:-1:-1;;;;;4699:20:57;4728:14;4699:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4681:66;;;4765:7;4757:38;;;;-1:-1:-1;;;4757:38:57;;17456:2:111;4757:38:57;;;17438:21:111;17495:2;17475:18;;;17468:30;17534:20;17514:18;;;17507:48;17572:18;;4757:38:57;17254:342:111;4757:38:57;4404:398;;4318:484;;:::o;4680:2406:53:-;2261:21:33;:19;:21::i;:::-;4859:16:53;4841:15:::1;::::0;4922:731:::1;4946:7;4942:1;:11;4922:731;;;4974:33;5010:16;;5027:1;5010:19;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4974:55:::0;-1:-1:-1;5043:28:53::1;;5074:11;4974:55:::0;;5074:11:::1;:::i;:::-;5043:42:::0;;-1:-1:-1;5043:42:53;-1:-1:-1;5099:22:53::1;5124:14;::::0;;;::::1;::::0;::::1;;:::i;:::-;5099:39:::0;-1:-1:-1;5225:33:53;-1:-1:-1;;;;;5225:33:53;::::1;::::0;5217:69:::1;;;::::0;-1:-1:-1;;;5217:69:53;;19121:2:111;5217:69:53::1;::::0;::::1;19103:21:111::0;19160:2;19140:18;;;19133:30;19199:25;19179:18;;;19172:53;19242:18;;5217:69:53::1;18919:347:111::0;5217:69:53::1;-1:-1:-1::0;;;;;5305:33:53;::::1;::::0;5301:305:::1;;-1:-1:-1::0;;;;;5423:29:53;::::1;;5453:3:::0;;5458:13:::1;;::::0;::::1;:3:::0;:13:::1;:::i;:::-;5423:49;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;5419:173;;5527:46;::::0;::::1;::::0;;-1:-1:-1;;;;;23920:55:111;;5527:46:53::1;::::0;::::1;23902:74:111::0;23875:18;;5527:46:53::1;23756:226:111::0;5419:173:53::1;5620:22;5632:3:::0;5620:22;::::1;:::i;:::-;;;4960:693;;;;4955:3;;;;;:::i;:::-;;;;4922:731;;;;5663:27;5710:8;5693:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;5735:17:53::1;::::0;5663:56;;-1:-1:-1;5735:17:53::1;::::0;;;::::1;5763:15;5797:9:::0;5792:669:::1;5816:7;5812:1;:11;5792:669;;;5844:33;5880:16;;5897:1;5880:19;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;5844:55:::0;-1:-1:-1;5913:28:53::1;;5944:11;5844:55:::0;;5944:11:::1;:::i;:::-;5913:42:::0;;-1:-1:-1;5913:42:53;-1:-1:-1;5969:22:53::1;5994:14;::::0;;;::::1;::::0;::::1;;:::i;:::-;5969:39:::0;-1:-1:-1;6040:3:53;6023:14:::1;6064:387;6088:6;6084:1;:10;6064:387;;;6119:24;6146:7;6154;6146:16;;;;;;;;:::i;:::-;;;;;;;6119:43;;6181:22;6205:31:::0;6240:44:::1;6260:7;6269:3;;6273:1;6269:6;;;;;;;:::i;6240:44::-;6180:104;;;;6302:107;6345:1;6348:14;6364:23;6397:10;6302:42;:107::i;:::-;6427:9:::0;::::1;::::0;::::1;:::i;:::-;;;;6101:350;;;6096:3;;;;;:::i;:::-;;;;6064:387;;;;5830:631;;;;;5825:3;;;;;:::i;:::-;;;;5792:669;;;;6471:17;6512:1:::0;6502:11:::1;;6528:9;6523:458;6547:7;6543:1;:11;6523:458;;;6575:33;6611:16;;6628:1;6611:19;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;6575:55:::0;-1:-1:-1;6684:14:53::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;6649:51:53::1;;;;;;;;;;;6714:28;;6745:11;:3:::0;;:11:::1;:::i;:::-;6714:42:::0;;-1:-1:-1;6714:42:53;-1:-1:-1;6714:42:53;6770:14:::1;6812:159;6836:6;6832:1;:10;6812:159;;;6880:49;6895:7;6904:3;;6908:1;6904:6;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;6912:7;6920;6912:16;;;;;;;;:::i;6880:49::-;6867:62;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;6947:9:53;::::1;::::0;::::1;:::i;:::-;;;;6844:3;;;;;:::i;:::-;;;;6812:159;;;;6561:420;;;;6556:3;;;;;:::i;:::-;;;;6523:458;;;-1:-1:-1::0;6995:38:53::1;::::0;7030:1:::1;::::0;6995:38:::1;::::0;7030:1;;6995:38:::1;7044:35;7056:11;7069:9;7044:11;:35::i;:::-;4830:2256;;;;;2303:20:33::0;1716:1;2809:7;:22;2629:209;16001:687:53;16140:20;;:47;;;;-1:-1:-1;;;;;;16164:18:53;;;:23;16140:47;16136:182;;;16272:35;;-1:-1:-1;;;16272:35:53;;24189:2:111;16272:35:53;;;24171:21:111;24228:2;24208:18;;;24201:30;24267:27;24247:18;;;24240:55;24312:18;;16272:35:53;23987:349:111;16136:182:53;16358:2;16331:29;;16327:310;;16376:17;16412:24;16433:2;16376:17;16412:16;;:24;:::i;:::-;16404:33;;;:::i;:::-;16396:42;;;-1:-1:-1;16456:21:53;;16481:1;16456:26;16452:175;;16575:37;;-1:-1:-1;;;16575:37:53;;25256:2:111;16575:37:53;;;25238:21:111;25295:2;25275:18;;;25268:30;25334:29;25314:18;;;25307:57;25381:18;;16575:37:53;25054:351:111;16452:175:53;16362:275;16327:310;16671:10;;-1:-1:-1;;;16671:10:53;;25612:2:111;16671:10:53;;;25594:21:111;-1:-1:-1;25631:18:111;;;25624:29;25670:18;;16671:10:53;25410:284:111;15236:172:53;15321:36;;;;;15304:14;;-1:-1:-1;;;;;15321:13:53;:26;;;;:36;;15348:8;;;;15321:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15374:27;;;;;-1:-1:-1;;;;;23920:55:111;;15374:27:53;;;23902:74:111;15304:53:53;;-1:-1:-1;23875:18:111;;15374:27:53;23756:226:111;10389:174:53;10464:7;10511:13;:6;:11;:13::i;:::-;10500:55;;;;;;26406:25:111;;;;10534:4:53;26447:18:111;;;26440:83;10541:13:53;26539:18:111;;;26532:34;26379:18;;10500:55:53;;;;;;;;;;;;10490:66;;;;;;10483:73;;10389:174;;;:::o;2877:408:57:-;2955:10;2919:24;2946:20;;;;;;;;;;2984;;;;2946;;2984;;;;:25;;2976:48;;;;-1:-1:-1;;;2976:48:57;;26779:2:111;2976:48:57;;;26761:21:111;26818:2;26798:18;;;26791:30;26857:12;26837:18;;;26830:40;26887:18;;2976:48:57;26577:334:111;2976:48:57;3042:11;;;;;;;3034:41;;;;-1:-1:-1;;;3034:41:57;;27118:2:111;3034:41:57;;;27100:21:111;27157:2;27137:18;;;27130:30;27196:19;27176:18;;;27169:47;27233:18;;3034:41:57;26916:341:111;3034:41:57;3133:20;;;;3085:19;;3107:46;;3133:20;;3114:15;3107:46;:::i;:::-;3163:17;;;:32;;;;;;;;;;;;;;;;;;3205:19;;;;;;3239:39;;27644:46:111;;;3163:32:57;;-1:-1:-1;3253:10:57;;3239:39;;27632:2:111;27617:18;3239:39:57;27499:197:111;3491:651:57;3602:10;3566:24;3593:20;;;;;;;;;;3639:10;;;;;;;;3659:42;;;;-1:-1:-1;;;3659:42:57;;27903:2:111;3659:42:57;;;27885:21:111;27942:2;27922:18;;;27915:30;27981:22;27961:18;;;27954:50;28021:18;;3659:42:57;27701:344:111;3659:42:57;3719:17;;;;;;;;;3711:63;;;;-1:-1:-1;;;3711:63:57;;28252:2:111;3711:63:57;;;28234:21:111;28291:2;28271:18;;;28264:30;28330:31;28310:18;;;28303:59;28379:18;;3711:63:57;28050:353:111;3711:63:57;3792:17;;;;3813:15;3792:17;;;;;;:36;;3784:76;;;;-1:-1:-1;;;3784:76:57;;28610:2:111;3784:76:57;;;28592:21:111;28649:2;28629:18;;;28622:30;28688:29;28668:18;;;28661:57;28735:18;;3784:76:57;28408:351:111;3784:76:57;3870:20;;;:24;;3904:21;;;;3935:14;;;;;;3964:50;;;-1:-1:-1;;;;;16934:55:111;;16916:74;;17021:2;17006:18;;16999:34;;;3979:10:57;;3964:50;;16889:18:111;3964:50:57;;;;;;;4025:12;4042:15;-1:-1:-1;;;;;4042:20:57;4071:5;4042:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4024:57;;;4099:7;4091:44;;;;-1:-1:-1;;;4091:44:57;;28966:2:111;4091:44:57;;;28948:21:111;29005:2;28985:18;;;28978:30;29044:26;29024:18;;;29017:54;29088:18;;4091:44:57;28764:348:111;7124:806:53;7253:24;;:::i;:::-;7287:30;7314:2;7287:26;:30::i;:::-;7328:22;7352:31;7387:34;7407:1;7410:2;7414:6;7387:19;:34::i;:::-;7327:94;;;;7431:26;7460:60;7480:14;7496:23;7460:19;:60::i;:::-;7431:89;;7531:14;28078:8;28075:1;28068:19;28010:84;7531:14;7555:12;7570:29;7585:1;7588:2;7592:6;7570:14;:29::i;:::-;7555:44;;7609:14;28078:8;28075:1;28068:19;28010:84;7609:14;7633:18;7661:25;-1:-1:-1;;;;;7700:20:53;;;7696:110;;7768:6;-1:-1:-1;;;;;7768:11:53;7780:14;;7768:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7736:59:53;;-1:-1:-1;7736:59:53;-1:-1:-1;7696:110:53;7838:6;:15;;;7855:4;7861;:15;;;7878:4;:15;;;7895:13;7910:12;7822:101;;;;;;;;;;;;;;;;:::i;11899:1494::-;11977:27;;:::i;:::-;12015:34;12042:6;12015:26;:34::i;:::-;12060:22;12084:31;12119:41;12139:1;12142:6;12150:9;12119:19;:41::i;:::-;12217:17;;:27;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;908:14:57;;;;;;;;;;;945:17;;;;;;;;;;932:30;;995:27;;;;;;;;;972:50;;;12299:17:53;;:24;-1:-1:-1;;;;;;;;;;;;;;;;908:14:57;;;;;;;;;;;;945:17;;;;;;;;;932:30;;995:27;;;;;;972:50;;-1:-1:-1;;;;;;;;;;;;;;12059:101:53;;-1:-1:-1;12059:101:53;;-1:-1:-1;;12386:23:53;;12412:15;;;;:6;:15;:::i;:::-;12386:41;;-1:-1:-1;12386:41:53;-1:-1:-1;12441:15:53;12478:2;12459:21;;;:71;;12528:1;12459:71;;;12499:16;12512:2;12508:1;12499:8;;:16;:::i;:::-;12491:25;;;:::i;:::-;12483:34;;12459:71;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;908:14:57;;;;;;;;;;;945:17;;;;;;;932:30;;995:27;;;;;972:50;;;908:14;;-1:-1:-1;12544:36:53;;12372:219;;;12601:26;12630:60;12650:14;12666:23;12630:19;:60::i;:::-;12601:89;;12700:18;12721:4;:15;;;12700:36;;12746:14;12785:1;-1:-1:-1;;;;;12763:24:53;:10;-1:-1:-1;;;;;12763:24:53;;12746:41;;12797:28;12828:157;;;;;;;;12839:9;:18;;;12828:157;;;;12859:9;:17;;;12828:157;;;;12890:9;12828:157;;;;;;12901:4;:15;;;12828:157;;;;;;12918:4;:15;;;12828:157;;;;;;12935:49;12960:9;:23;;;27804:6;27684:133;12935:49;12828:157;;12797:188;-1:-1:-1;;;;;;13000:24:53;;;;;;:52;;-1:-1:-1;;;;;;13028:24:53;;13050:1;13028:24;;13000:52;12996:305;;;13112:58;;;;;;;;-1:-1:-1;;;;;13112:58:53;;;;;-1:-1:-1;;;;;;;;;;;13112:58:53;-1:-1:-1;;;;;;908:14:57;;;;;;;;;;945:17;;;;;;;932:30;;995:27;;;;;972:50;;;13112:58:53;;;;13191:99;;;;;;;13223:10;;13235;;13247:11;;13260:13;;13112:58;;13191:99;;;:::i;12996:305::-;13334:10;13346;13358:11;13371:13;13317:68;;;;;;;;;;;;;;:::i;1287:293:57:-;-1:-1:-1;;;;;1393:17:57;;1366:24;1393:17;;;;;;;;;;1440:12;;1393:17;;1366:24;1440:21;;1455:6;;1440:12;;:21;:::i;:::-;1420:41;-1:-1:-1;1492:17:57;1479:30;;;1471:59;;;;-1:-1:-1;;;1471:59:57;;32770:2:111;1471:59:57;;;32752:21:111;32809:2;32789:18;;;32782:30;32848:18;32828;;;32821:46;32884:18;;1471:59:57;32568:340:111;1471:59:57;1540:33;;;;;;;;;;;;-1:-1:-1;;1287:293:57:o;230:263:110:-;361:12;475:1;472;465:4;459:11;452:4;446;442:15;435:5;431:2;424:5;419:58;408:69;230:263;-1:-1:-1;;;;;230:263:110:o;1066:436::-;1128:23;1197:16;1237:6;1232:3;1229:15;1226:64;;;-1:-1:-1;1270:6:110;1226:64;1320:4;1314:11;1369:4;1364:3;1360:14;1355:3;1351:24;1345:4;1338:38;1401:3;1396;1389:16;1452:3;1449:1;1442:4;1437:3;1433:14;1418:38;1483:3;1066:436;-1:-1:-1;;;1066:436:110:o;24846:1936:53:-;24998:21;25031:14;25048:9;25144:14;;25031:26;;-1:-1:-1;25083:21:53;;;25187:26;25144:14;25187:17;:26::i;:::-;25244:17;;;;25168:45;;-1:-1:-1;;;;;;25275:23:53;;25271:959;;25330:14;;;-1:-1:-1;25271:959:53;;;25391:9;25375:25;;25435:1;25418:7;:14;:18;25414:806;;;25472:20;;;;-1:-1:-1;25522:36:53;25514:4;:44;;;;;;;;:::i;:::-;;25510:696;;25617:28;;;;25582:94;;;;;-1:-1:-1;;;;;25582:28:53;;;;;:94;;25647:4;;25653:7;;25662:13;;25582:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25510:696;;;25827:28;;;;25792:94;;;;;-1:-1:-1;;;;;25792:28:53;;;;;:94;;25857:4;;25863:7;;25872:13;;25792:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25788:400;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25986:7;26035:6;25995:47;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25995:47:53;;;;;;;;;;-1:-1:-1;;;25977:66:53;;;;;;;;:::i;25788:400::-;;;26135:7;26126:39;;-1:-1:-1;;;26126:39:53;;;;;;35553:25:111;;35614:2;35609;35594:18;;35587:30;;;35653:2;35633:18;;;35626:30;35692:20;35687:2;35672:18;;35665:48;35745:3;35730:19;;35341:414;25788:400:53;26261:9;26252:6;:18;26239:31;;;;26308:8;26296:9;:20;26280:36;;26347:13;26330:6;:14;;;:30;26326:121;;;26392:7;26383:53;;-1:-1:-1;;;26383:53:53;;;;;;35972:25:111;;36033:2;36028;36013:18;;;36006:30;;;36052:18;;;36045:30;36111:34;36106:2;36091:18;;36084:62;36178:3;36163:19;;35760:428;26326:121:53;26473:14;;;;:30;;;26513:40;26531:13;26473:30;26513:17;:40::i;:::-;26563:12;;26578:4;:41;;;;;;;;:::i;:::-;;26563:56;;26688:7;:17;;;-1:-1:-1;;;;;26634:122:53;26672:7;:14;;;-1:-1:-1;;;;;26634:122:53;26653:6;:17;;;26634:122;26707:7;:13;;;26722:7;26731:13;26746:9;26634:122;;;;;;;;36418:25:111;;;36486:14;;36479:22;36474:2;36459:18;;36452:50;36533:2;36518:18;;36511:34;36576:2;36561:18;;36554:34;36405:3;36390:19;;36193:401;26634:122:53;;;;;;;;25063:1700;;;;;;25021:1761;24846:1936;;;;;;;:::o;2336:287:33:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:33;;36801:2:111;2460:63:33;;;36783:21:111;36840:2;36820:18;;;36813:30;36879:33;36859:18;;;36852:61;36930:18;;2460:63:33;36599:355:111;2460:63:33;1759:1;2598:18;;2336:287::o;22174:2028:53:-;22301:22;22325:31;22369:14;22386:9;22435:17;;22369:26;;-1:-1:-1;22462:36:53;22482:6;22435:17;22462:19;:36::i;:::-;22531:21;22545:6;22531:13;:21::i;:::-;22508:20;;;:44;22798:20;;;;22767:28;;;;22738:26;;;;:57;:80;22829:19;;;;22738:110;22851:27;;;;22738:140;22912:17;22896:33;;;22888:70;;;;-1:-1:-1;;;22888:70:53;;37161:2:111;22888:70:53;;;37143:21:111;37200:2;37180:18;;;37173:30;37239:26;37219:18;;;37212:54;37283:18;;22888:70:53;36959:348:111;22888:70:53;22969:42;23022:23;23049:28;23069:7;23049:19;:28::i;:::-;23021:56;;23142:71;23169:7;23178:6;23186:9;23197:15;23142:26;:71::i;:::-;23253:14;;23269:13;;;;23087:126;;-1:-1:-1;23087:126:53;;-1:-1:-1;23229:54:53;;23253:14;23229:23;:54::i;:::-;23224:140;;23315:7;23306:47;;-1:-1:-1;;;23306:47:53;;;;;;37524:25:111;;37585:2;37580;37565:18;;37558:30;;;37624:2;37604:18;;;37597:30;37663:28;37658:2;37643:18;;37636:56;37724:3;37709:19;;37312:422;23224:140:53;23540:14;28078:8;28075:1;28068:19;28010:84;23540:14;23599:17;;;;23565:20;;-1:-1:-1;;;;;23599:31:53;;23595:208;;23683:109;23712:7;23721:6;23729:9;23740:15;23757:34;23683:28;:109::i;:::-;23646:146;-1:-1:-1;23646:146:53;-1:-1:-1;23595:208:53;23828:15;23855:9;23846:6;:18;23828:36;;23909:7;23879:6;:27;;;:37;23875:126;;;23948:7;23939:51;;-1:-1:-1;;;23939:51:53;;;;;;37951:25:111;;38012:2;38007;37992:18;;37985:30;;;38051:2;38031:18;;;38024:30;38090:32;38085:2;38070:18;;38063:60;38155:3;38140:19;;37739:426;23875:126:53;24010:17;;;:35;;;24104:7;24055:23;;;:57;24164:25;;;;24152:9;24143:6;:18;:46;24122:9;:18;;:67;;;;;23808:388;22358:1844;;;;;;22174:2028;;;;;;:::o;20278:1061::-;20457:18;20477:19;20500:34;20519:14;20500:18;:34::i;:::-;20456:78;;;;20570:10;-1:-1:-1;;;;;20548:32:53;:18;-1:-1:-1;;;;;20548:32:53;;20544:111;;20612:7;20603:41;;-1:-1:-1;;;20603:41:53;;;;;;38382:25:111;;38443:2;38438;38423:18;;38416:30;;;38482:2;38462:18;;;38455:30;38521:22;38516:2;38501:18;;38494:50;38576:3;38561:19;;38170:416;20544:111:53;20668:14;20664:96;;;20714:7;20705:44;;-1:-1:-1;;;20705:44:53;;;;;;38803:25:111;;38864:2;38859;38844:18;;38837:30;;;38903:2;38883:18;;;38876:30;38942:25;38937:2;38922:18;;38915:53;39000:3;38985:19;;38591:419;20664:96:53;20997:20;21060:43;21079:23;21060:18;:43::i;:::-;21027:76;-1:-1:-1;21027:76:53;-1:-1:-1;;;;;;21117:26:53;;;21113:105;;21175:7;21166:41;;-1:-1:-1;;;21166:41:53;;;;;;39227:25:111;;39288:2;39283;39268:18;;39261:30;;;39327:2;39307:18;;;39300:30;39366:22;39361:2;39346:18;;39339:50;39421:3;39406:19;;39015:416;21113:105:53;21231:14;21227:106;;;21277:7;21268:54;;-1:-1:-1;;;21268:54:53;;;;;;39648:25:111;;39709:2;39704;39689:18;;39682:30;;;39748:2;39728:18;;;39721:30;39787:34;39782:2;39767:18;;39760:62;39859:3;39853;39838:19;;39831:32;39895:3;39880:19;;39436:469;21227:106:53;20446:893;;;20278:1061;;;;:::o;2117:1131::-;2232:17;2261:14;2278:9;2261:26;;2297:20;2320:46;2345:6;:20;;;27804:6;27684:133;2320:46;2297:69;-1:-1:-1;2381:4:53;:18;2400:15;;;;:6;:15;:::i;:::-;2417:6;2425:7;2381:52;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2381:52:53;;;;;;;;-1:-1:-1;;2381:52:53;;;;;;;;;;;;:::i;:::-;;;2377:865;;2539:23;2624:2;2621:1;2618;2603:24;-1:-1:-1;2669:1:53;2663:8;2783:35;;;2779:268;;3005:7;2996:36;;-1:-1:-1;;;2996:36:53;;;;;;41619:25:111;;41680:2;41675;41660:18;;41653:30;;;41719:2;41699:18;;;41692:30;41758:17;41753:2;41738:18;;41731:45;41808:3;41793:19;;41407:411;2779:268:53;3061:17;3102:6;:15;;;3090:9;3081:18;;:6;:18;:::i;:::-;:36;;;;:::i;:::-;3061:56;;3143:88;3157:7;3166:36;3204:6;3212:7;3221:9;3143:13;:88::i;:::-;3131:100;;2525:717;;2377:865;;;2493:14;-1:-1:-1;2377:865:53;2251:997;;2117:1131;;;;;:::o;1560:279::-;-1:-1:-1;;;;;1653:25:53;;1645:62;;;;-1:-1:-1;;;1645:62:53;;42025:2:111;1645:62:53;;;42007:21:111;42064:2;42044:18;;;42037:30;42103:26;42083:18;;;42076:54;42147:18;;1645:62:53;41823:348:111;1645:62:53;1718:12;1735:11;-1:-1:-1;;;;;1735:16:53;1760:6;1735:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1717:54;;;1789:7;1781:51;;;;-1:-1:-1;;;1781:51:53;;42378:2:111;1781:51:53;;;42360:21:111;42417:2;42397:18;;;42390:30;42456:33;42436:18;;;42429:61;42507:18;;1781:51:53;42176:355:111;3521:124:64;3589:7;3625:12;3630:6;3625:4;:12::i;:::-;3615:23;;;;;;3608:30;;3521:124;;;:::o;15414:421:53:-;15562:4;:32;15595:15;;;;:6;:15;:::i;:::-;15612:13;;;;:6;:13;:::i;:::-;15627:23;;;;:6;:23;:::i;:::-;15562:89;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15558:271;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15721:26;;:31;15717:102;;15788:1;15791:12;15779:25;;-1:-1:-1;;;15779:25:53;;;;;;;;;:::i;15717:102::-;15663:166;15414:421;:::o;15558:271::-;;;;;;;;;;;15414:421;:::o;1392:927:54:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;1571:36:54;1592:14;1571:20;:36::i;:::-;1525:82;;1617:38;1658:45;1679:23;1658:20;:45::i;:::-;1734:32;;1617:86;;-1:-1:-1;;;;;;1780:24:54;;1776:95;;-1:-1:-1;1833:27:54;;1776:95;1900:32;;;;;1962;;;;;2026:27;;;;2085;;;;1900:32;;1962;2127:25;;;;;;;;2123:56;;;2167:12;2154:25;;2123:56;2206:12;2193:25;;:10;:25;;;2189:56;;;2233:12;2220:25;;2189:56;-1:-1:-1;;2262:50:54;;;;;;;;-1:-1:-1;;;;;2262:50:54;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1392:927:54;;;;:::o;26950:481:53:-;27087:20;;;;27148:28;;;;27029:7;;27087:20;27190:36;;;27186:161;;-1:-1:-1;27324:12:53;26950:481;-1:-1:-1;;26950:481:53:o;27186:161::-;27363:55;27367:12;27404:13;27381:20;:36;27363:3;:55::i;:::-;27356:62;26950:481;-1:-1:-1;;;;26950:481:53:o;10658:832::-;10788:13;;;;:6;:13;:::i;:::-;-1:-1:-1;;;;;10771:30:53;;;10827:12;;;;;10811:13;;;:28;10872:19;;;;;10849:20;;;:42;10932:27;;;;10901:28;;;:58;10998:25;;;;;10969:26;;;:54;;;;11056:19;;;;;11033:20;;;:42;;;;11116:27;;;;11085:28;;;:58;11153:31;10771:14;11187:23;;;;10827:6;11187:23;:::i;:::-;11153:57;;-1:-1:-1;11153:57:53;-1:-1:-1;11224:27:53;;11220:264;;11302:2;11275:29;;;11267:71;;;;-1:-1:-1;;;11267:71:53;;43597:2:111;11267:71:53;;;43579:21:111;43636:2;43616:18;;;43609:30;43675:31;43655:18;;;43648:59;43724:18;;11267:71:53;43395:353:111;11267:71:53;11388:22;11407:2;11388:22;:16;;:22;:::i;:::-;11380:31;;;:::i;:::-;11372:40;;11352:17;;;:60;11220:264;;;11471:1;11443:17;;;:30;10761:729;;10658:832;;:::o;13399:551::-;13717:17;;;;13480:23;;;;-1:-1:-1;;;;;13717:31:53;:39;;13755:1;13717:39;;;13751:1;13717:39;13703:53;;;;13766:19;13848:7;:26;;;13842:3;13811:7;:28;;;:34;13788:7;:20;;;:57;:86;13766:108;;13917:7;:20;;;13903:11;:34;13885:52;;13511:433;;13399:551;;;:::o;16894:1601::-;17047:42;17091:22;17141:14;17158:9;17207:14;;17248;;17141:26;;-1:-1:-1;17207:14:53;17272:51;17294:7;17207:6;17311:11;;;;:2;:11;:::i;:::-;17272:21;:51::i;:::-;17353:17;;;;17380:14;28078:8;28075:1;28068:19;28010:84;17380:14;17404:27;-1:-1:-1;;;;;17449:23:53;;17445:170;;-1:-1:-1;;;;;1178:17:57;;17488:11:53;1178:17:57;;;;;;;;;;:25;;;17555:21:53;;;:49;;17601:3;17583:15;:21;17555:49;;;17579:1;17555:49;17533:71;;17474:141;17445:170;17666:28;;;;17700:17;;;;17628:111;;;;;-1:-1:-1;;;;;17628:31:53;;;;;17666:28;;17628:111;;17696:2;;17719:19;;17628:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17628:111:53;;;;;;;;-1:-1:-1;;17628:111:53;;;;;;;;;;;;:::i;:::-;;;17624:435;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;17910:7;17952:12;17919:46;;;;;;;;:::i;17624:435::-;;;18014:7;18005:43;;-1:-1:-1;;;18005:43:53;;;;;;44830:25:111;;44891:2;44886;44871:18;;44864:30;;;44930:2;44910:18;;;44903:30;44969:24;44964:2;44949:18;;44942:52;45026:3;45011:19;;44618:418;17624:435:53;17813:15;-1:-1:-1;;;;;;18072:23:53;;18068:350;;-1:-1:-1;;;;;18144:16:53;;18111:30;18144:16;;;;;;;;;;18192:18;;;;18228:25;;;18224:115;;;18289:7;18280:44;;-1:-1:-1;;;18280:44:53;;;;;;45253:25:111;;45314:2;45309;45294:18;;45287:30;;;45353:2;45333:18;;;45326:30;45392:25;45387:2;45372:18;;45365:53;45450:3;45435:19;;45041:419;18224:115:53;18352:55;;;;18381:25;;;;18352:55;;;;;18068:350;18473:9;18464:6;:18;18427:55;;17121:1368;;;;;16894:1601;;;;;;;:::o;1008:234:55:-;-1:-1:-1;;;;;1194:27:55;;1090:4;1194:27;;;:19;:27;;;;1138:2;1194:27;;;1129:11;;;1194:32;;;;;;;:34;;1129:5;;1194:41;;;;:34;1090:4;1194:34;;;:::i;:::-;;;;-1:-1:-1;1194:41:55;;1008:234;-1:-1:-1;;;;;1008:234:55:o;18753:1417:53:-;19054:14;;18952:20;19109:28;;;;18952:20;;18974:22;;19155:57;;;19147:101;;;;-1:-1:-1;;;19147:101:53;;45667:2:111;19147:101:53;;;45649:21:111;45706:2;45686:18;;;45679:30;45745:33;45725:18;;;45718:61;45796:18;;19147:101:53;45465:355:111;19147:101:53;19360:17;;;;-1:-1:-1;;;;;19423:19:53;;19258:11;19423:19;;;;;;;;;;19470:21;;19272:57;;;;19360:17;19423:19;19470:21;;19505:25;;;19501:114;;;19562:7;19553:51;;-1:-1:-1;;;19553:51:53;;;;;;46037:25:111;;46098:2;46093;46078:18;;46071:30;;;46137:2;46117:18;;;46110:30;46176:32;46171:2;46156:18;;46149:60;46241:3;46226:19;;45825:426;19501:114:53;19666:15;19656:7;:25;19624:13;:21;;;:58;;;;;;;;;;;;;;;;;;19707:9;-1:-1:-1;;;;;19696:45:53;;19748:3;19753:2;19757:6;:17;;;19776:15;19696:96;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19696:96:53;;;;;;;;;;;;:::i;:::-;;;19692:466;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20009:7;20051:12;20018:46;;;;;;;;:::i;19692:466::-;;;20113:7;20104:43;;-1:-1:-1;;;20104:43:53;;;;;;47660:25:111;;47721:2;47716;47701:18;;47694:30;;;47760:2;47740:18;;;47733:30;47799:24;47794:2;47779:18;;47772:52;47856:3;47841:19;;47448:418;19692:466:53;19873:8;;;;-1:-1:-1;18753:1417:53;-1:-1:-1;;;;;;;;;;;;18753:1417:53:o;21345:472::-;21420:18;21440:19;21475:14;21493:1;21475:19;21471:76;;-1:-1:-1;21526:1:53;;;;-1:-1:-1;21345:472:53;-1:-1:-1;21345:472:53:o;21471:76::-;21556:26;21585:36;21606:14;21585:20;:36::i;:::-;21556:65;;21720:4;:15;;;21702:33;;:15;:33;:70;;;;21757:4;:15;;;21739:33;;:15;:33;21702:70;21795:15;;;21685:87;;-1:-1:-1;21345:472:53;-1:-1:-1;;21345:472:53:o;2573:942:64:-;2641:16;1889:20;;2729:12;;;;2669:14;2774:31;2789:15;;;;1889:20;2789:15;:::i;:::-;2774:14;:31::i;:::-;2751:54;-1:-1:-1;2815:20:64;2838:31;2853:15;;;;:6;:15;:::i;2838:31::-;2815:54;-1:-1:-1;2902:19:64;;;;2962:27;;;;3028:25;;;;3086:19;;;;3146:27;;;;2879:20;3214:39;3229:23;;;;2902:6;3229:23;:::i;3214:39::-;3271:237;;;-1:-1:-1;;;;;48288:55:111;;;;3271:237:64;;;48270:74:111;48360:18;;;48353:34;;;;48403:18;;;48396:34;;;;-1:-1:-1;48446:18:111;;;48439:34;;;;48489:19;;;48482:35;;;;48533:19;;;48526:35;;;;48577:19;;;48570:35;48621:19;;;48614:35;48665:19;;;48658:35;48709:19;;;;48702:35;;;;3271:237:64;;;;;;;;;;48242:19:111;;;;3271:237:64;;;2573:942;-1:-1:-1;;2573:942:64:o;904:439:54:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;1044:14:54;1115:3;1097:21;;;1133:15;;;1007:18;1133:15;1129:75;;-1:-1:-1;1177:16:54;1129:75;1286:50;;;;;;;;-1:-1:-1;;;;;1286:50:54;;;;;1259:8;1240:28;;;;1286:50;;;;;;;;;;;;;-1:-1:-1;1286:50:54;904:439::o;27437:104:53:-;27495:7;27525:1;27521;:5;:13;;27533:1;27521:13;;;27529:1;27521:13;27514:20;27437:104;-1:-1:-1;;;27437:104:53:o;14003:885::-;14125:20;;14121:761;;14178:14;;:21;-1:-1:-1;;;;;14217:18:53;;;:23;14213:88;;14258:7;14249:52;;-1:-1:-1;;;14249:52:53;;;;;;48960:25:111;;49021:2;49016;49001:18;;48994:30;;;49060:2;49040:18;;;49033:30;49099:33;49094:2;49079:18;;49072:61;49165:3;49150:19;;48748:427;14213:88:53;14366:14;;:35;;;14333:79;;;;;14315:15;;-1:-1:-1;;;;;14333:13:53;:26;;;;14366:35;14333:79;;14403:8;;;;14333:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14315:97;-1:-1:-1;;;;;;14430:21:53;;14426:82;;14469:7;14460:48;;-1:-1:-1;;;14460:48:53;;;;;;49392:25:111;;49453:2;49448;49433:18;;49426:30;;;49492:2;49472:18;;;49465:30;49531:29;49526:2;49511:18;;49504:57;49593:3;49578:19;;49180:423;14426:82:53;14537:6;-1:-1:-1;;;;;14526:17:53;:7;-1:-1:-1;;;;;14526:17:53;;14522:83;;14561:7;14552:53;;-1:-1:-1;;;14552:53:53;;;;;;49820:25:111;;49881:2;49876;49861:18;;;49854:30;;;49900:18;;;49893:30;49959:34;49954:2;49939:18;;49932:62;50026:3;50011:19;;49608:428;14522:83:53;14623:7;-1:-1:-1;;;;;14623:19:53;;14646:1;14623:24;14619:90;;14665:7;14656:53;;-1:-1:-1;;;14656:53:53;;;;;;50253:25:111;;50314:2;50309;50294:18;;;50287:30;;;50333:18;;;50326:30;50392:34;50387:2;50372:18;;50365:62;50459:3;50444:19;;50041:428;14619:90:53;14723:15;14757:16;14770:2;14723:15;14757:8;;:16;:::i;:::-;14749:25;;;:::i;:::-;14741:34;;14723:52;;14829:6;-1:-1:-1;;;;;14794:77:53;14810:6;:17;;;14794:77;14837:7;14846:6;:14;;;:24;;;14794:77;;;;;;-1:-1:-1;;;;;50727:15:111;;;50709:34;;50779:15;;50774:2;50759:18;;50752:43;50636:2;50621:18;;50474:327;14794:77:53;;;;;;;;14147:735;;;14003:885;;;;:::o;3357:265:54:-;3416:11;3479:4;3473:11;3508;3563:3;3550:11;3545:3;3532:35;3587:19;;;3357:265;-1:-1:-1;;;3357:265:54:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;295:204;363:20;;423:50;412:62;;402:73;;392:101;;489:1;486;479:12;392:101;295:204;;;:::o;504:186::-;563:6;616:2;604:9;595:7;591:23;587:32;584:52;;;632:1;629;622:12;584:52;655:29;674:9;655:29;:::i;695:154::-;-1:-1:-1;;;;;774:5:111;770:54;763:5;760:65;750:93;;839:1;836;829:12;854:134;922:20;;951:31;922:20;951:31;:::i;993:321::-;1061:6;1069;1122:2;1110:9;1101:7;1097:23;1093:32;1090:52;;;1138:1;1135;1128:12;1090:52;1177:9;1164:23;1196:31;1221:5;1196:31;:::i;:::-;1246:5;-1:-1:-1;1270:38:111;1304:2;1289:18;;1270:38;:::i;:::-;1260:48;;993:321;;;;;:::o;1501:184::-;1553:77;1550:1;1543:88;1650:4;1647:1;1640:15;1674:4;1671:1;1664:15;1690:225;1776:4;1768:6;1764:17;1847:6;1835:10;1832:22;1811:18;1799:10;1796:34;1793:62;1790:88;;;1858:18;;:::i;:::-;1894:2;1887:22;-1:-1:-1;1690:225:111:o;1920:227::-;2006:6;1998;1994:19;2079:6;2067:10;2064:22;2043:18;2031:10;2028:34;2025:62;2022:88;;;2090:18;;:::i;2152:308::-;-1:-1:-1;;2253:2:111;2247:4;2243:13;2239:86;2231:6;2227:99;2392:6;2380:10;2377:22;2356:18;2344:10;2341:34;2338:62;2335:88;;;2403:18;;:::i;:::-;2439:2;2432:22;-1:-1:-1;;2152:308:111:o;2465:245::-;2513:4;2546:18;2538:6;2535:30;2532:56;;;2568:18;;:::i;:::-;-1:-1:-1;2625:2:111;2613:15;-1:-1:-1;;2609:88:111;2699:4;2605:99;;2465:245::o;2715:1244::-;2772:5;2811:9;2806:3;2802:19;2841:6;2837:2;2833:15;2830:35;;;2861:1;2858;2851:12;2830:35;2894:2;2888:9;2906:32;2931:6;2906:32;:::i;:::-;2956:6;2947:15;;2981:6;3007:2;3003;2999:11;2996:31;;;3023:1;3020;3013:12;2996:31;3058:2;3052:9;3036:25;;3070:34;3095:8;3070:34;:::i;:::-;3130:29;3149:9;3130:29;:::i;:::-;3120:8;3113:47;3223:2;3212:9;3208:18;3195:32;3190:2;3180:8;3176:17;3169:59;3291:2;3280:9;3276:18;3263:32;3258:2;3248:8;3244:17;3237:59;3359:2;3348:9;3344:18;3331:32;3326:2;3316:8;3312:17;3305:59;3428:3;3417:9;3413:19;3400:33;3394:3;3384:8;3380:18;3373:61;3471:40;3505:4;3494:9;3490:20;3471:40;:::i;:::-;3464:4;3454:8;3450:19;3443:69;3576:3;3565:9;3561:19;3548:33;3542:3;3532:8;3528:18;3521:61;3646:3;3635:9;3631:19;3618:33;3612:3;3602:8;3598:18;3591:61;3676:8;3668:6;3661:24;3746:2;3735:9;3731:18;3718:32;3713:2;3705:6;3701:15;3694:57;;3812:3;3801:9;3797:19;3784:33;3779:2;3771:6;3767:15;3760:58;3879:3;3868:9;3864:19;3851:33;3846:2;3838:6;3834:15;3827:58;3947:3;3936:9;3932:19;3919:33;3913:3;3905:6;3901:16;3894:59;;;2715:1244;;;;:::o;3964:347::-;4015:8;4025:6;4079:3;4072:4;4064:6;4060:17;4056:27;4046:55;;4097:1;4094;4087:12;4046:55;-1:-1:-1;4120:20:111;;4163:18;4152:30;;4149:50;;;4195:1;4192;4185:12;4149:50;4232:4;4224:6;4220:17;4208:29;;4284:3;4277:4;4268:6;4260;4256:19;4252:30;4249:39;4246:59;;;4301:1;4298;4291:12;4246:59;3964:347;;;;;:::o;4316:1168::-;4441:6;4449;4457;4465;4518:3;4506:9;4497:7;4493:23;4489:33;4486:53;;;4535:1;4532;4525:12;4486:53;4575:9;4562:23;4604:18;4645:2;4637:6;4634:14;4631:34;;;4661:1;4658;4651:12;4631:34;4699:6;4688:9;4684:22;4674:32;;4744:7;4737:4;4733:2;4729:13;4725:27;4715:55;;4766:1;4763;4756:12;4715:55;4802:2;4789:16;4824:31;4852:2;4824:31;:::i;:::-;4884:2;4878:9;4896:31;4924:2;4916:6;4896:31;:::i;:::-;4951:2;4943:6;4936:18;4993:7;4986:4;4981:2;4977;4973:11;4969:22;4966:35;4963:55;;;5014:1;5011;5004:12;4963:55;5074:2;5067:4;5063:2;5059:13;5052:4;5044:6;5040:17;5027:50;5121:1;5114:4;5109:2;5101:6;5097:15;5093:26;5086:37;5142:6;5132:16;;;;;5167:59;5218:7;5211:4;5200:9;5196:20;5167:59;:::i;:::-;5157:69;;5279:3;5268:9;5264:19;5251:33;5235:49;;5309:2;5299:8;5296:16;5293:36;;;5325:1;5322;5315:12;5293:36;;5364:60;5416:7;5405:8;5394:9;5390:24;5364:60;:::i;:::-;4316:1168;;;;-1:-1:-1;5443:8:111;-1:-1:-1;;;;4316:1168:111:o;5489:389::-;5574:8;5584:6;5638:3;5631:4;5623:6;5619:17;5615:27;5605:55;;5656:1;5653;5646:12;5605:55;-1:-1:-1;5679:20:111;;5722:18;5711:30;;5708:50;;;5754:1;5751;5744:12;5708:50;5791:4;5783:6;5779:17;5767:29;;5851:3;5844:4;5834:6;5831:1;5827:14;5819:6;5815:27;5811:38;5808:47;5805:67;;;5868:1;5865;5858:12;5883:636;6020:6;6028;6036;6089:2;6077:9;6068:7;6064:23;6060:32;6057:52;;;6105:1;6102;6095:12;6057:52;6145:9;6132:23;6178:18;6170:6;6167:30;6164:50;;;6210:1;6207;6200:12;6164:50;6249:92;6333:7;6324:6;6313:9;6309:22;6249:92;:::i;:::-;6360:8;;-1:-1:-1;6223:118:111;-1:-1:-1;;6445:2:111;6430:18;;6417:32;6458:31;6417:32;6458:31;:::i;:::-;6508:5;6498:15;;;5883:636;;;;;:::o;6524:323::-;6600:6;6608;6661:2;6649:9;6640:7;6636:23;6632:32;6629:52;;;6677:1;6674;6667:12;6629:52;6716:9;6703:23;6735:31;6760:5;6735:31;:::i;:::-;6785:5;6837:2;6822:18;;;;6809:32;;-1:-1:-1;;;6524:323:111:o;7500:247::-;7559:6;7612:2;7600:9;7591:7;7587:23;7583:32;7580:52;;;7628:1;7625;7618:12;7580:52;7667:9;7654:23;7686:31;7711:5;7686:31;:::i;8375:852::-;8474:6;8482;8490;8498;8506;8559:2;8547:9;8538:7;8534:23;8530:32;8527:52;;;8575:1;8572;8565:12;8527:52;8615:9;8602:23;8644:18;8685:2;8677:6;8674:14;8671:34;;;8701:1;8698;8691:12;8671:34;8740:58;8790:7;8781:6;8770:9;8766:22;8740:58;:::i;:::-;8817:8;;-1:-1:-1;8714:84:111;-1:-1:-1;8902:2:111;8887:18;;8874:32;;-1:-1:-1;8915:31:111;8874:32;8915:31;:::i;:::-;8965:5;;-1:-1:-1;9023:2:111;9008:18;;8995:32;;9039:16;;;9036:36;;;9068:1;9065;9058:12;9036:36;;9107:60;9159:7;9148:8;9137:9;9133:24;9107:60;:::i;:::-;8375:852;;;;-1:-1:-1;8375:852:111;;-1:-1:-1;9186:8:111;;9081:86;8375:852;-1:-1:-1;;;8375:852:111:o;9232:409::-;9302:6;9310;9363:2;9351:9;9342:7;9338:23;9334:32;9331:52;;;9379:1;9376;9369:12;9331:52;9419:9;9406:23;9452:18;9444:6;9441:30;9438:50;;;9484:1;9481;9474:12;9438:50;9523:58;9573:7;9564:6;9553:9;9549:22;9523:58;:::i;:::-;9600:8;;9497:84;;-1:-1:-1;9232:409:111;-1:-1:-1;;;;9232:409:111:o;9646:162::-;9712:5;9757:3;9748:6;9743:3;9739:16;9735:26;9732:46;;;9774:1;9771;9764:12;9732:46;-1:-1:-1;9796:6:111;9646:162;-1:-1:-1;9646:162:111:o;9813:369::-;9906:6;9959:2;9947:9;9938:7;9934:23;9930:32;9927:52;;;9975:1;9972;9965:12;9927:52;10015:9;10002:23;10048:18;10040:6;10037:30;10034:50;;;10080:1;10077;10070:12;10034:50;10103:73;10168:7;10159:6;10148:9;10144:22;10103:73;:::i;10629:812::-;10751:6;10759;10767;10775;10828:2;10816:9;10807:7;10803:23;10799:32;10796:52;;;10844:1;10841;10834:12;10796:52;10884:9;10871:23;10913:18;10954:2;10946:6;10943:14;10940:34;;;10970:1;10967;10960:12;10940:34;10993:73;11058:7;11049:6;11038:9;11034:22;10993:73;:::i;:::-;10983:83;;11116:2;11105:9;11101:18;11088:32;11075:45;;11129:31;11154:5;11129:31;:::i;:::-;11179:5;;-1:-1:-1;11237:2:111;11222:18;;11209:32;;11253:16;;;11250:36;;;11282:1;11279;11272:12;12956:184;13008:77;13005:1;12998:88;13105:4;13102:1;13095:15;13129:4;13126:1;13119:15;13145:128;13185:3;13216:1;13212:6;13209:1;13206:13;13203:39;;;13222:18;;:::i;:::-;-1:-1:-1;13258:9:111;;13145:128::o;14237:195::-;14276:3;14307:66;14300:5;14297:77;14294:103;;14377:18;;:::i;:::-;-1:-1:-1;14424:1:111;14413:13;;14237:195::o;14789:258::-;14861:1;14871:113;14885:6;14882:1;14879:13;14871:113;;;14961:11;;;14955:18;14942:11;;;14935:39;14907:2;14900:10;14871:113;;;15002:6;14999:1;14996:13;14993:48;;;-1:-1:-1;;15037:1:111;15019:16;;15012:27;14789:258::o;15052:316::-;15093:3;15131:5;15125:12;15158:6;15153:3;15146:19;15174:63;15230:6;15223:4;15218:3;15214:14;15207:4;15200:5;15196:16;15174:63;:::i;:::-;15282:2;15270:15;-1:-1:-1;;15266:88:111;15257:98;;;;15357:4;15253:109;;15052:316;-1:-1:-1;;15052:316:111:o;15373:288::-;15548:6;15537:9;15530:25;15591:2;15586;15575:9;15571:18;15564:30;15511:4;15611:44;15651:2;15640:9;15636:18;15628:6;15611:44;:::i;15666:184::-;15718:77;15715:1;15708:88;15815:4;15812:1;15805:15;15839:4;15836:1;15829:15;15855:390;15955:4;16013:11;16000:25;16103:66;16092:8;16076:14;16072:29;16068:102;16048:18;16044:127;16034:155;;16185:1;16182;16175:12;16034:155;16206:33;;;;;15855:390;-1:-1:-1;;15855:390:111:o;16604:125::-;16644:4;16672:1;16669;16666:8;16663:34;;;16677:18;;:::i;:::-;-1:-1:-1;16714:9:111;;16604:125::o;17601:397::-;17708:4;17766:11;17753:25;17856:66;17845:8;17829:14;17825:29;17821:102;17801:18;17797:127;17787:155;;17938:1;17935;17928:12;18003:638;18130:4;18136:6;18196:11;18183:25;18286:66;18275:8;18259:14;18255:29;18251:102;18231:18;18227:127;18217:155;;18368:1;18365;18358:12;18217:155;18395:33;;18447:20;;;-1:-1:-1;18490:18:111;18479:30;;18476:50;;;18522:1;18519;18512:12;18476:50;18555:4;18543:17;;-1:-1:-1;18606:1:111;18602:14;;;18586;18582:35;18572:46;;18569:66;;;18631:1;18628;18621:12;19271:580;19348:4;19354:6;19414:11;19401:25;19504:66;19493:8;19477:14;19473:29;19469:102;19449:18;19445:127;19435:155;;19586:1;19583;19576:12;19435:155;19613:33;;19665:20;;;-1:-1:-1;19708:18:111;19697:30;;19694:50;;;19740:1;19737;19730:12;19694:50;19773:4;19761:17;;-1:-1:-1;19804:14:111;19800:27;;;19790:38;;19787:58;;;19841:1;19838;19831:12;19988:559;20046:5;20053:6;20113:3;20100:17;20195:66;20184:8;20168:14;20164:29;20160:102;20140:18;20136:127;20126:155;;20277:1;20274;20267:12;20126:155;20305:33;;20409:4;20396:18;;;-1:-1:-1;20357:21:111;;-1:-1:-1;20437:18:111;20426:30;;20423:50;;;20469:1;20466;20459:12;20423:50;20516:6;20500:14;20496:27;20489:5;20485:39;20482:59;;;20537:1;20534;20527:12;20552:325;20640:6;20635:3;20628:19;20692:6;20685:5;20678:4;20673:3;20669:14;20656:43;;20744:1;20737:4;20728:6;20723:3;20719:16;20715:27;20708:38;20610:3;20866:4;-1:-1:-1;;20791:2:111;20783:6;20779:15;20775:88;20770:3;20766:98;20762:109;20755:116;;20552:325;;;;:::o;20882:1532::-;20947:3;20975:6;20990:50;21036:3;21009:25;21028:5;21009:25;:::i;:::-;-1:-1:-1;;;;;19922:54:111;19910:67;;19856:127;20990:50;21096:4;21089:5;21085:16;21072:30;21065:4;21060:3;21056:14;21049:54;21146:55;21195:4;21188:5;21184:16;21177:5;21146:55;:::i;:::-;21233:2;21226:4;21221:3;21217:14;21210:26;21257:67;21320:2;21315:3;21311:12;21297;21283;21257:67;:::i;:::-;21245:79;;;;21371:55;21420:4;21413:5;21409:16;21402:5;21371:55;:::i;:::-;21468:3;21462:4;21458:14;21451:4;21446:3;21442:14;21435:38;21496:63;21554:4;21538:14;21522;21496:63;:::i;:::-;21482:77;;;;21615:4;21608:5;21604:16;21591:30;21584:4;21579:3;21575:14;21568:54;21678:4;21671:5;21667:16;21654:30;21647:4;21642:3;21638:14;21631:54;21741:4;21734:5;21730:16;21717:30;21710:4;21705:3;21701:14;21694:54;21804:4;21797:5;21793:16;21780:30;21773:4;21768:3;21764:14;21757:54;21830:6;21890:2;21883:5;21879:14;21866:28;21861:2;21856:3;21852:12;21845:50;;21914:6;21967:53;22016:2;22009:5;22005:14;21998:5;21967:53;:::i;:::-;22062:3;22054:6;22050:16;22045:2;22040:3;22036:12;22029:38;22090:65;22148:6;22132:14;22116;22090:65;:::i;:::-;22076:79;;;;;22174:6;22227:53;22276:2;22269:5;22265:14;22258:5;22227:53;:::i;:::-;22322:3;22314:6;22310:16;22305:2;22300:3;22296:12;22289:38;22343:65;22401:6;22385:14;22369;22343:65;:::i;:::-;22336:72;20882:1532;-1:-1:-1;;;;;;;20882:1532:111:o;22419:1332::-;22741:2;22753:21;;;22726:18;;22809:22;;;-1:-1:-1;22862:2:111;22911:1;22907:14;;;22892:30;;22888:39;;;22847:18;;22950:6;-1:-1:-1;;23005:613:111;23021:6;23016:3;23013:15;23005:613;;;23114:66;23102:9;23094:6;23090:22;23086:95;23081:3;23074:108;23234:6;23221:20;23321:66;23312:6;23296:14;23292:27;23288:100;23268:18;23264:125;23254:153;;23403:1;23400;23393:12;23254:153;23430:81;23504:6;23495;23475:18;23471:31;23430:81;:::i;:::-;23420:91;-1:-1:-1;;23534:4:111;23596:12;;;;23561:15;;;;;23047:1;23038:11;23005:613;;;23009:3;;;;23668:9;23660:6;23656:22;23649:4;23638:9;23634:20;23627:52;23696:49;23738:6;23730;23722;23696:49;:::i;24341:331::-;24446:9;24457;24499:8;24487:10;24484:24;24481:44;;;24521:1;24518;24511:12;24481:44;24550:6;24540:8;24537:20;24534:40;;;24570:1;24567;24560:12;24534:40;-1:-1:-1;;24596:23:111;;;24641:25;;;;;-1:-1:-1;24341:331:111:o;24677:372::-;24836:66;24798:19;;24920:11;;;;24951:2;24943:11;;24940:103;;;25030:2;25024;25017:3;25013:2;25009:12;25006:1;25002:20;24998:29;24994:2;24990:38;24986:47;24977:56;;24940:103;;;24677:372;;;;:::o;25699:244::-;25856:2;25845:9;25838:21;25819:4;25876:61;25933:2;25922:9;25918:18;25910:6;25902;25876:61;:::i;25948:251::-;26018:6;26071:2;26059:9;26050:7;26046:23;26042:32;26039:52;;;26087:1;26084;26077:12;26039:52;26119:9;26113:16;26138:31;26163:5;26138:31;:::i;27262:232::-;27301:3;27329:14;27370:2;27367:1;27363:10;27400:2;27397:1;27393:10;27431:3;27427:2;27423:12;27418:3;27415:21;27412:47;;;27439:18;;:::i;:::-;27475:13;;27262:232;-1:-1:-1;;;;27262:232:111:o;29117:271::-;29300:6;29292;29287:3;29274:33;29256:3;29326:16;;29351:13;;;29326:16;29117:271;-1:-1:-1;29117:271:111:o;29393:633::-;29670:6;29659:9;29652:25;29713:6;29708:2;29697:9;29693:18;29686:34;29633:4;29739:14;29801:2;29793:6;29789:15;29784:2;29773:9;29769:18;29762:43;29853:2;29845:6;29841:15;29836:2;29825:9;29821:18;29814:43;;29908:6;29901:14;29894:22;29888:3;29877:9;29873:19;29866:51;29954:3;29948;29937:9;29933:19;29926:32;29975:45;30015:3;30004:9;30000:19;29992:6;29975:45;:::i;:::-;29967:53;29393:633;-1:-1:-1;;;;;;;;29393:633:111:o;30031:589::-;30120:5;30114:12;30109:3;30102:25;30176:4;30169:5;30165:16;30159:23;30152:4;30147:3;30143:14;30136:47;30246:4;30239:5;30235:16;30229:23;30222:31;30215:39;30208:4;30203:3;30199:14;30192:63;30084:3;30301:4;30294:5;30290:16;30284:23;30326:14;30390:2;30376:12;30372:21;30365:4;30360:3;30356:14;30349:45;30455:2;30447:4;30440:5;30436:16;30430:23;30426:32;30419:4;30414:3;30410:14;30403:56;;;30507:4;30500:5;30496:16;30490:23;30545:4;30538;30533:3;30529:14;30522:28;30566:48;30608:4;30603:3;30599:14;30583;30566:48;:::i;30780:1062::-;31286:4;31315:3;31345:2;31334:9;31327:21;31365:56;31417:2;31406:9;31402:18;31394:6;31365:56;:::i;:::-;31357:64;;;31430:55;31481:2;31470:9;31466:18;31458:6;30700:12;;30688:25;;30762:4;30751:16;;;30745:23;30729:14;;30722:47;30625:150;31430:55;30700:12;;31545:2;31530:18;;30688:25;30762:4;30751:16;;;30745:23;30729:14;;;30722:47;30700:12;;31609:3;31594:19;;30688:25;30751:16;;;30745:23;30729:14;;;30722:47;31655:13;;-1:-1:-1;;;;;31651:62:111;31645:3;31630:19;;31623:91;31749:15;;;31743:22;30700:12;;31831:3;31816:19;;30688:25;30751:16;;;30745:23;30729:14;;;;30722:47;;;;30780:1062;;-1:-1:-1;;30780:1062:111:o;31847:716::-;32286:3;32275:9;32268:22;32249:4;32307:57;32359:3;32348:9;32344:19;32336:6;32307:57;:::i;:::-;32299:65;;32373:55;32424:2;32413:9;32409:18;32401:6;30700:12;;30688:25;;30762:4;30751:16;;;30745:23;30729:14;;30722:47;30625:150;32373:55;30700:12;;32488:2;32473:18;;30688:25;30762:4;30751:16;;30745:23;30729:14;;;30722:47;30700:12;;32552:3;32537:19;;30688:25;30762:4;30751:16;;30745:23;30729:14;;;30722:47;31847:716;;;;;;;:::o;32913:184::-;32965:77;32962:1;32955:88;33062:4;33059:1;33052:15;33086:4;33083:1;33076:15;33102:583;33282:4;33322:1;33314:6;33311:13;33301:201;;33358:77;33355:1;33348:88;33459:4;33456:1;33449:15;33487:4;33484:1;33477:15;33301:201;33529:6;33518:9;33511:25;33572:2;33567;33556:9;33552:18;33545:30;33592:44;33632:2;33621:9;33617:18;33609:6;33592:44;:::i;:::-;33584:52;;33672:6;33667:2;33656:9;33652:18;33645:34;33102:583;;;;;;:::o;33690:179::-;33725:3;33767:1;33749:16;33746:23;33743:120;;;33813:1;33810;33807;33792:23;-1:-1:-1;33850:1:111;33844:8;33839:3;33835:18;33743:120;33690:179;:::o;33874:731::-;33913:3;33955:4;33937:16;33934:26;33931:39;;;33874:731;:::o;33931:39::-;33997:2;33991:9;34019:66;34140:2;34122:16;34118:25;34115:1;34109:4;34094:50;34173:4;34167:11;34197:16;34232:18;34303:2;34296:4;34288:6;34284:17;34281:25;34276:2;34268:6;34265:14;34262:45;34259:58;;;34310:5;;;;;33874:731;:::o;34259:58::-;34347:6;34341:4;34337:17;34326:28;;34383:3;34377:10;34410:2;34402:6;34399:14;34396:27;;;34416:5;;;;;;33874:731;:::o;34396:27::-;34500:2;34481:16;34475:4;34471:27;34467:36;34460:4;34451:6;34446:3;34442:16;34438:27;34435:69;34432:82;;;34507:5;;;;;;33874:731;:::o;34432:82::-;34523:57;34574:4;34565:6;34557;34553:19;34549:30;34543:4;34523:57;:::i;:::-;-1:-1:-1;34596:3:111;;33874:731;-1:-1:-1;;;;;33874:731:111:o;34610:431::-;34862:24;34857:3;34850:37;34832:3;34916:6;34910:13;34932:62;34987:6;34982:2;34977:3;34973:12;34966:4;34958:6;34954:17;34932:62;:::i;:::-;35014:16;;;;35032:2;35010:25;;34610:431;-1:-1:-1;;34610:431:111:o;39910:1303::-;40160:4;40189:3;40219:2;40208:9;40201:21;40245:61;40302:2;40291:9;40287:18;40279:6;40271;40245:61;:::i;:::-;40231:75;;40331:6;40325:13;-1:-1:-1;;;;;40450:2:111;40445;40439:9;40435:18;40430:2;40419:9;40415:18;40408:46;40504:2;40500;40496:11;40490:18;40485:2;40474:9;40470:18;40463:46;40559:2;40555;40551:11;40545:18;40540:2;40529:9;40525:18;40518:46;40615:2;40611;40607:11;40601:18;40595:3;40584:9;40580:19;40573:47;40671:3;40667:2;40663:12;40657:19;40651:3;40640:9;40636:19;40629:48;40739:2;40732:3;40728:2;40724:12;40718:19;40714:28;40708:3;40697:9;40693:19;40686:57;;40794:3;40790:2;40786:12;40780:19;40774:3;40763:9;40759:19;40752:48;40851:3;40847:2;40843:12;40837:19;40831:3;40820:9;40816:19;40809:48;;40912:2;40904:6;40900:15;40894:22;40888:3;40877:9;40873:19;40866:51;40972:2;40964:6;40960:15;40954:22;40948:3;40937:9;40933:19;40926:51;41032:2;41024:6;41020:15;41014:22;41008:3;40997:9;40993:19;40986:51;41092:3;41084:6;41080:16;41074:23;41068:3;41057:9;41053:19;41046:52;41147:9;41139:6;41135:22;41129:3;41118:9;41114:19;41107:51;41175:32;41200:6;41192;41175:32;:::i;41218:184::-;41288:6;41341:2;41329:9;41320:7;41316:23;41312:32;41309:52;;;41357:1;41354;41347:12;41309:52;-1:-1:-1;41380:16:111;;41218:184;-1:-1:-1;41218:184:111:o;42536:551::-;42777:2;42766:9;42759:21;42740:4;42803:61;42860:2;42849:9;42845:18;42837:6;42829;42803:61;:::i;:::-;-1:-1:-1;;;;;42904:6:111;42900:55;42895:2;42884:9;42880:18;42873:83;43004:9;42996:6;42992:22;42987:2;42976:9;42972:18;42965:50;43032:49;43074:6;43066;43058;43032:49;:::i;43753:431::-;44004:2;43993:9;43986:21;43967:4;44024:68;44088:2;44077:9;44073:18;44065:6;44024:68;:::i;:::-;44123:2;44108:18;;44101:34;;;;-1:-1:-1;44166:2:111;44151:18;44144:34;44016:76;43753:431;-1:-1:-1;43753:431:111:o;44189:424::-;44441:17;44436:3;44429:30;44411:3;44488:6;44482:13;44504:62;44559:6;44554:2;44549:3;44545:12;44538:4;44530:6;44526:17;44504:62;:::i;:::-;44586:16;;;;44604:2;44582:25;;44189:424;-1:-1:-1;;44189:424:111:o;46256:758::-;46344:6;46352;46405:2;46393:9;46384:7;46380:23;46376:32;46373:52;;;46421:1;46418;46411:12;46373:52;46454:9;46448:16;46487:18;46479:6;46476:30;46473:50;;;46519:1;46516;46509:12;46473:50;46542:22;;46595:4;46587:13;;46583:27;-1:-1:-1;46573:55:111;;46624:1;46621;46614:12;46573:55;46653:2;46647:9;46675:31;46703:2;46675:31;:::i;:::-;46735:2;46729:9;46747:31;46775:2;46767:6;46747:31;:::i;:::-;46802:2;46794:6;46787:18;46844:7;46837:4;46832:2;46828;46824:11;46820:22;46817:35;46814:55;;;46865:1;46862;46855:12;46814:55;46878:59;46934:2;46927:4;46919:6;46915:17;46908:4;46904:2;46900:13;46878:59;:::i;:::-;47002:4;46987:20;;;;46981:27;46956:6;;46981:27;;-1:-1:-1;;;;;;46256:758:111:o;47019:424::-;47271:17;47266:3;47259:30;47241:3;47318:6;47312:13;47334:62;47389:6;47384:2;47379:3;47375:12;47368:4;47360:6;47356:17;47334:62;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"3612600","executionCost":"infinite","totalCost":"infinite"},"external":{"SIG_VALIDATION_FAILED()":"230","_validateSenderAndPaymaster(bytes,address,bytes)":"infinite","addStake(uint32)":"57459","balanceOf(address)":"2618","depositTo(address)":"30590","deposits(address)":"4929","getDepositInfo(address)":"5213","getNonce(address,uint192)":"2789","getSenderAddress(bytes)":"infinite","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"infinite","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"infinite","incrementNonce(uint192)":"24790","innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)":"infinite","nonceSequenceNumber(address,uint192)":"2710","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"infinite","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite","unlockStake()":"56699","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_compensate(address payable,uint256)":"infinite","_copyUserOpToMemory(struct UserOperation calldata,struct EntryPoint.MemoryUserOp memory)":"infinite","_createSenderIfNeeded(uint256,struct EntryPoint.UserOpInfo memory,bytes calldata)":"infinite","_executeUserOp(uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory)":"infinite","_getRequiredPrefund(struct EntryPoint.MemoryUserOp memory)":"infinite","_getValidationData(uint256)":"infinite","_handlePostOp(uint256,enum IPaymaster.PostOpMode,struct EntryPoint.UserOpInfo memory,bytes memory,uint256)":"infinite","_simulationOnlyValidations(struct UserOperation calldata)":"infinite","_validateAccountAndPaymasterValidationData(uint256,uint256,uint256,address)":"infinite","_validateAccountPrepayment(uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256)":"infinite","_validatePaymasterPrepayment(uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory,uint256,uint256)":"infinite","_validatePrepayment(uint256,struct UserOperation calldata,struct EntryPoint.UserOpInfo memory)":"infinite","getMemoryBytesFromOffset(uint256)":"infinite","getOffsetOfMemoryBytes(bytes memory)":"infinite","getUserOpGasPrice(struct EntryPoint.MemoryUserOp memory)":"infinite","min(uint256,uint256)":"61","numberMarker()":"infinite"}},"methodIdentifiers":{"SIG_VALIDATION_FAILED()":"8f41ec5a","_validateSenderAndPaymaster(bytes,address,bytes)":"957122ab","addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","deposits(address)":"fc7e286d","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)":"1d732756","nonceSequenceNumber(address,uint192)":"1b2e01b8","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"contracts/core/EntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\nimport \\\"../utils/Exec.sol\\\";\\nimport \\\"./StakeManager.sol\\\";\\nimport \\\"./SenderCreator.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\nimport \\\"./NonceManager.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\\n * @param beneficiary the address to receive the fees\\n * @param amount amount to transfer.\\n */\\n function _compensate(address payable beneficiary, uint256 amount) internal {\\n require(beneficiary != address(0), \\\"AA90 invalid beneficiary\\\");\\n (bool success,) = beneficiary.call{value : amount}(\\\"\\\");\\n require(success, \\\"AA91 failed send to beneficiary\\\");\\n }\\n\\n /**\\n * execute a user op\\n * @param opIndex index into the opInfo array\\n * @param userOp the userOp to execute\\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\\n * @return collected the total amount this userOp paid.\\n */\\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\n }\\n\\n /**\\n * Execute a batch of UserOperations.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\n uint256 opslen = ops.length;\\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\\n\\n unchecked {\\n for (uint256 i = 0; i < opslen; i++) {\\n UserOpInfo memory opInfo = opInfos[i];\\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\\n }\\n\\n uint256 collected = 0;\\n emit BeforeExecution();\\n\\n for (uint256 i = 0; i < opslen; i++) {\\n collected += _executeUserOp(i, ops[i], opInfos[i]);\\n }\\n\\n _compensate(beneficiary, collected);\\n } //unchecked\\n }\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) public nonReentrant {\\n\\n uint256 opasLen = opsPerAggregator.length;\\n uint256 totalOps = 0;\\n for (uint256 i = 0; i < opasLen; i++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\\n UserOperation[] calldata ops = opa.userOps;\\n IAggregator aggregator = opa.aggregator;\\n\\n //address(1) is special marker of \\\"signature error\\\"\\n require(address(aggregator) != address(1), \\\"AA96 invalid aggregator\\\");\\n\\n if (address(aggregator) != address(0)) {\\n // solhint-disable-next-line no-empty-blocks\\n try aggregator.validateSignatures(ops, opa.signature) {}\\n catch {\\n revert SignatureValidationFailed(address(aggregator));\\n }\\n }\\n\\n totalOps += ops.length;\\n }\\n\\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\\n\\n emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] calldata ops = opa.userOps;\\n IAggregator aggregator = opa.aggregator;\\n\\n uint256 opslen = ops.length;\\n for (uint256 i = 0; i < opslen; i++) {\\n UserOpInfo memory opInfo = opInfos[opIndex];\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\n\\n uint256 collected = 0;\\n opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n emit SignatureAggregatorChanged(address(opa.aggregator));\\n UserOperation[] calldata ops = opa.userOps;\\n uint256 opslen = ops.length;\\n\\n for (uint256 i = 0; i < opslen; i++) {\\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\\n opIndex++;\\n }\\n }\\n emit SignatureAggregatorChanged(address(0));\\n\\n _compensate(beneficiary, collected);\\n }\\n\\n /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n address paymaster;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n }\\n\\n struct UserOpInfo {\\n MemoryUserOp mUserOp;\\n bytes32 userOpHash;\\n uint256 prefund;\\n uint256 contextOffset;\\n uint256 preOpGas;\\n }\\n\\n /**\\n * inner function to handle a UserOperation.\\n * Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\\n */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\n mstore(0, INNER_OUT_OF_GAS)\\n revert(0, 32)\\n }\\n }\\n }\\n\\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\\n if (callData.length > 0) {\\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\n if (!success) {\\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\\n if (result.length > 0) {\\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\\n }\\n mode = IPaymaster.PostOpMode.opReverted;\\n }\\n }\\n\\n unchecked {\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\\n }\\n\\n /**\\n * copy general fields from userOp into the memory opInfo structure.\\n */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\\n StakeInfo memory factoryInfo;\\n {\\n bytes calldata initCode = userOp.initCode;\\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\\n if (initCode.length != 0) {\\n address sender = opInfo.mUserOp.sender;\\n if (sender.code.length != 0) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\n catch Error(string memory revertReason) {\\n if (bytes(revertReason).length != 0) {\\n revert FailedOp(0, revertReason);\\n }\\n }\\n }\\n\\n /**\\n * Called only during simulation.\\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\\n */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\\n if (initCode.length == 0 && sender.code.length == 0) {\\n // it would revert anyway. but give a meaningful message\\n revert(\\\"AA20 account not deployed\\\");\\n }\\n if (paymasterAndData.length >= 20) {\\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\\n if (paymaster.code.length == 0) {\\n // it would revert anyway. but give a meaningful message\\n revert(\\\"AA30 paymaster not deployed\\\");\\n }\\n }\\n // always revert\\n revert(\\\"\\\");\\n }\\n\\n /**\\n * call account.validateUserOp.\\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\\n * decrement account's deposit if needed\\n */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\n }\\n if (paymaster == address(0)) {\\n DepositInfo storage senderInfo = deposits[sender];\\n uint256 deposit = senderInfo.deposit;\\n if (requiredPrefund > deposit) {\\n revert FailedOp(opIndex, \\\"AA21 didn't pay prefund\\\");\\n }\\n senderInfo.deposit = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\n }\\n }\\n\\n /**\\n * In case the request has a paymaster:\\n * Validate paymaster has enough deposit.\\n * Call paymaster.validatePaymasterUserOp.\\n * Revert with proper FailedOp in case paymaster reverts.\\n * Decrement paymaster's deposit\\n */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\n address paymaster = mUserOp.paymaster;\\n DepositInfo storage paymasterInfo = deposits[paymaster];\\n uint256 deposit = paymasterInfo.deposit;\\n if (deposit < requiredPreFund) {\\n revert FailedOp(opIndex, \\\"AA31 paymaster deposit too low\\\");\\n }\\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\\n if (expectedAggregator != aggregator) {\\n revert FailedOp(opIndex, \\\"AA24 signature error\\\");\\n }\\n if (outOfTimeRange) {\\n revert FailedOp(opIndex, \\\"AA22 expired or not due\\\");\\n }\\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\\n address pmAggregator;\\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\\n if (pmAggregator != address(0)) {\\n revert FailedOp(opIndex, \\\"AA34 signature error\\\");\\n }\\n if (outOfTimeRange) {\\n revert FailedOp(opIndex, \\\"AA32 paymaster expired or not due\\\");\\n }\\n }\\n\\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\n if (validationData == 0) {\\n return (address(0), false);\\n }\\n ValidationData memory data = _parseValidationData(validationData);\\n // solhint-disable-next-line not-rely-on-time\\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\\n aggregator = data.aggregator;\\n }\\n\\n /**\\n * validate account and paymaster (if defined).\\n * also make sure total validation doesn't exceed verificationGasLimit\\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\\n * @param opIndex the index of this userOp into the \\\"opInfos\\\" array\\n * @param userOp the userOp to validate\\n */\\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private returns (uint256 validationData, uint256 paymasterValidationData) {\\n\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\\n _copyUserOpToMemory(userOp, mUserOp);\\n outOpInfo.userOpHash = getUserOpHash(userOp);\\n\\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\\n // and multiplied without causing overflow\\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * called just after the callData is executed.\\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\\n * @param opIndex index in the batch\\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\\n * @param opInfo userOp fields and info collected during validation\\n * @param context the context returned in validatePaymasterUserOp\\n * @param actualGas the gas used so far by this user operation\\n */\\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n unchecked {\\n address refundAddress;\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\\n\\n address paymaster = mUserOp.paymaster;\\n if (paymaster == address(0)) {\\n refundAddress = mUserOp.sender;\\n } else {\\n refundAddress = paymaster;\\n if (context.length > 0) {\\n actualGasCost = actualGas * gasPrice;\\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\n } // unchecked\\n }\\n\\n /**\\n * the gas price this UserOp agrees to pay.\\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n */\\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract NonceManager is INonceManager {\\n\\n /**\\n * The next valid sequence number for a given nonce key.\\n */\\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\\n\\n function getNonce(address sender, uint192 key)\\n public view override returns (uint256 nonce) {\\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\\n }\\n\\n // allow an account to manually increment its own nonce.\\n // (mainly so that during construction nonce can be made non-zero,\\n // to \\\"absorb\\\" the gas cost of first nonce increment to 1st transaction (construction),\\n // not to 2nd transaction)\\n function incrementNonce(uint192 key) public override {\\n nonceSequenceNumber[msg.sender][key]++;\\n }\\n\\n /**\\n * validate nonce uniqueness for this account.\\n * called just after validateUserOp()\\n */\\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\\n\\n uint192 key = uint192(nonce >> 64);\\n uint64 seq = uint64(nonce);\\n return nonceSequenceNumber[sender][key]++ == seq;\\n }\\n\\n}\\n\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/**\\n * helper contract for EntryPoint, to call userOp.initCode from a \\\"neutral\\\" address,\\n * which is explicitly not the entryPoint itself.\\n */\\ncontract SenderCreator {\\n\\n /**\\n * call the \\\"initCode\\\" factory to create and return the sender account address\\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) external returns (address sender) {\\n address factory = address(bytes20(initCode[0 : 20]));\\n bytes memory initCallData = initCode[20 :];\\n bool success;\\n /* solhint-disable no-inline-assembly */\\n assembly {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by a paymaster.\\n */\\nabstract contract StakeManager is IStakeManager {\\n\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\\n DepositInfo storage depositInfo = deposits[addr];\\n info.stake = depositInfo.stake;\\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\\n }\\n\\n /// return the deposit (for gas payment) of the account\\n function balanceOf(address account) public view returns (uint256) {\\n return deposits[account].deposit;\\n }\\n\\n receive() external payable {\\n depositTo(msg.sender);\\n }\\n\\n function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\n }\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 unstakeDelaySec) public payable {\\n DepositInfo storage info = deposits[msg.sender];\\n require(unstakeDelaySec > 0, \\\"must specify unstake delay\\\");\\n require(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\n uint256 stake = info.stake + msg.value;\\n require(stake > 0, \\\"no stake specified\\\");\\n require(stake <= type(uint112).max, \\\"stake overflow\\\");\\n deposits[msg.sender] = DepositInfo(\\n info.deposit,\\n true,\\n uint112(stake),\\n unstakeDelaySec,\\n 0\\n );\\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\\n }\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(info.unstakeDelaySec != 0, \\\"not staked\\\");\\n require(info.staked, \\\"already unstaking\\\");\\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\\n info.withdrawTime = withdrawTime;\\n info.staked = false;\\n emit StakeUnlocked(msg.sender, withdrawTime);\\n }\\n\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external {\\n DepositInfo storage info = deposits[msg.sender];\\n uint256 stake = info.stake;\\n require(stake > 0, \\\"No stake to withdraw\\\");\\n require(info.withdrawTime > 0, \\\"must call unlockStake() first\\\");\\n require(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\n info.unstakeDelaySec = 0;\\n info.withdrawTime = 0;\\n info.stake = 0;\\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\\n (bool success,) = withdrawAddress.call{value : stake}(\\\"\\\");\\n require(success, \\\"failed to withdraw stake\\\");\\n }\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(info.deposit - withdrawAmount);\\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\\\"\\\");\\n require(success, \\\"failed to withdraw\\\");\\n }\\n}\\n\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":10139,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"deposits","offset":0,"slot":"0","type":"t_mapping(t_address,t_struct(DepositInfo)10913_storage)"},{"astId":10003,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"nonceSequenceNumber","offset":0,"slot":"1","type":"t_mapping(t_address,t_mapping(t_uint192,t_uint256))"},{"astId":3670,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"_status","offset":0,"slot":"2","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_mapping(t_address,t_mapping(t_uint192,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint192 => uint256))","numberOfBytes":"32","value":"t_mapping(t_uint192,t_uint256)"},"t_mapping(t_address,t_struct(DepositInfo)10913_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => struct IStakeManager.DepositInfo)","numberOfBytes":"32","value":"t_struct(DepositInfo)10913_storage"},"t_mapping(t_uint192,t_uint256)":{"encoding":"mapping","key":"t_uint192","label":"mapping(uint192 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_struct(DepositInfo)10913_storage":{"encoding":"inplace","label":"struct IStakeManager.DepositInfo","members":[{"astId":10904,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"deposit","offset":0,"slot":"0","type":"t_uint112"},{"astId":10906,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"staked","offset":14,"slot":"0","type":"t_bool"},{"astId":10908,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"stake","offset":15,"slot":"0","type":"t_uint112"},{"astId":10910,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"unstakeDelaySec","offset":0,"slot":"1","type":"t_uint32"},{"astId":10912,"contract":"contracts/core/EntryPoint.sol:EntryPoint","label":"withdrawTime","offset":4,"slot":"1","type":"t_uint48"}],"numberOfBytes":"64"},"t_uint112":{"encoding":"inplace","label":"uint112","numberOfBytes":"14"},"t_uint192":{"encoding":"inplace","label":"uint192","numberOfBytes":"24"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint32":{"encoding":"inplace","label":"uint32","numberOfBytes":"4"},"t_uint48":{"encoding":"inplace","label":"uint48","numberOfBytes":"6"}}},"userdoc":{"errors":{"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)":[{"notice":"return value of simulateHandleOp"}],"FailedOp(uint256,string)":[{"notice":"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it."}],"SenderAddressResult(address)":[{"notice":"return value of getSenderAddress"}],"SignatureValidationFailed(address)":[{"notice":"error case when a signature aggregator fails to verify the aggregated signature it had created."}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"notice":"Successful result from simulateValidation."}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"notice":"Successful result from simulateValidation, if the account returns a signature aggregator"}]},"events":{"AccountDeployed(bytes32,address,address,address)":{"notice":"account \"sender\" was deployed."},"BeforeExecution()":{"notice":"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation."},"SignatureAggregatorChanged(address)":{"notice":"signature aggregator used by the following UserOperationEvents within this bundle."},"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"},"UserOperationRevertReason(bytes32,address,uint256,bytes)":{"notice":"An event emitted if the UserOperation \"callData\" reverted with non-zero length"}},"kind":"user","methods":{"SIG_VALIDATION_FAILED()":{"notice":"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert."},"_validateSenderAndPaymaster(bytes,address,bytes)":{"notice":"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution."},"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"balanceOf(address)":{"notice":"return the deposit (for gas payment) of the account"},"depositTo(address)":{"notice":"add to the deposit of the given account"},"deposits(address)":{"notice":"maps paymaster to their deposits and stakes"},"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"getSenderAddress(bytes)":{"notice":"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error"},"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"notice":"Execute a batch of UserOperation with Aggregators"},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"notice":"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."},"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)":{"notice":"inner function to handle a UserOperation. Must be declared \"external\" to open a call context, but it can only be called by handleOps."},"nonceSequenceNumber(address,uint192)":{"notice":"The next valid sequence number for a given nonce key."},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"notice":"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \"ExecutionResult\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events."},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp."},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"version":1}}},"contracts/core/NonceManager.sol":{"NonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint192","name":"","type":"uint192"}],"name":"nonceSequenceNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610291806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630bd28e3b146100465780631b2e01b81461005b57806335567e1a14610095575b600080fd5b61005961005436600461018c565b610119565b005b6100836100693660046101ae565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100836100a33660046101ae565b73ffffffffffffffffffffffffffffffffffffffff9190911660009081526020818152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff85168452909152908190205491901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000161790565b3360009081526020818152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff851684529091528120805491610157836101fc565b919050555050565b803577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461018757600080fd5b919050565b60006020828403121561019e57600080fd5b6101a78261015f565b9392505050565b600080604083850312156101c157600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146101e557600080fd5b91506101f36020840161015f565b90509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610254577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212208f746ae03cbfffaa918dd655e47c7dda610663910e42a681652f502c26d3262664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x291 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0x18C JUMP JUMPDEST PUSH2 0x119 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x83 PUSH2 0x69 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x83 PUSH2 0xA3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 AND OR SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP2 PUSH2 0x157 DUP4 PUSH2 0x1FC JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7 DUP3 PUSH2 0x15F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH2 0x1F3 PUSH1 0x20 DUP5 ADD PUSH2 0x15F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x254 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 PUSH21 0x6AE03CBFFFAA918DD655E47C7DDA610663910E42A6 DUP2 PUSH6 0x2F502C26D326 0x26 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"145:1100:55:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@getNonce_10028":{"entryPoint":null,"id":10028,"parameterSlots":2,"returnSlots":1},"@incrementNonce_10043":{"entryPoint":281,"id":10043,"parameterSlots":1,"returnSlots":0},"@nonceSequenceNumber_10003":{"entryPoint":null,"id":10003,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_addresst_uint192":{"entryPoint":430,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_uint192":{"entryPoint":396,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_uint192":{"entryPoint":351,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":508,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1335:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:155:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"196:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"205:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"208:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"198:6:111"},"nodeType":"YulFunctionCall","src":"198:12:111"},"nodeType":"YulExpressionStatement","src":"198:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:62:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:73:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:81:111"},"nodeType":"YulIf","src":"111:101:111"}]},"name":"abi_decode_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:204:111"},{"body":{"nodeType":"YulBlock","src":"293:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"339:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"348:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"351:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"341:6:111"},"nodeType":"YulFunctionCall","src":"341:12:111"},"nodeType":"YulExpressionStatement","src":"341:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"314:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"323:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"310:3:111"},"nodeType":"YulFunctionCall","src":"310:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"335:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"306:3:111"},"nodeType":"YulFunctionCall","src":"306:32:111"},"nodeType":"YulIf","src":"303:52:111"},{"nodeType":"YulAssignment","src":"364:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"393:9:111"}],"functionName":{"name":"abi_decode_uint192","nodeType":"YulIdentifier","src":"374:18:111"},"nodeType":"YulFunctionCall","src":"374:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"364:6:111"}]}]},"name":"abi_decode_tuple_t_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"259:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"270:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"282:6:111","type":""}],"src":"223:186:111"},{"body":{"nodeType":"YulBlock","src":"501:296:111","statements":[{"body":{"nodeType":"YulBlock","src":"547:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"556:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"559:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"549:6:111"},"nodeType":"YulFunctionCall","src":"549:12:111"},"nodeType":"YulExpressionStatement","src":"549:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"522:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"531:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"518:3:111"},"nodeType":"YulFunctionCall","src":"518:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"543:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"514:3:111"},"nodeType":"YulFunctionCall","src":"514:32:111"},"nodeType":"YulIf","src":"511:52:111"},{"nodeType":"YulVariableDeclaration","src":"572:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"598:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"585:12:111"},"nodeType":"YulFunctionCall","src":"585:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"576:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"694:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"703:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"706:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"696:6:111"},"nodeType":"YulFunctionCall","src":"696:12:111"},"nodeType":"YulExpressionStatement","src":"696:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"630:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"641:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"648:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"637:3:111"},"nodeType":"YulFunctionCall","src":"637:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"627:2:111"},"nodeType":"YulFunctionCall","src":"627:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"620:6:111"},"nodeType":"YulFunctionCall","src":"620:73:111"},"nodeType":"YulIf","src":"617:93:111"},{"nodeType":"YulAssignment","src":"719:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"729:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"719:6:111"}]},{"nodeType":"YulAssignment","src":"743:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"776:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"787:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"772:3:111"},"nodeType":"YulFunctionCall","src":"772:18:111"}],"functionName":{"name":"abi_decode_uint192","nodeType":"YulIdentifier","src":"753:18:111"},"nodeType":"YulFunctionCall","src":"753:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"743:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint192","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"459:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"470:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"482:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"490:6:111","type":""}],"src":"414:383:111"},{"body":{"nodeType":"YulBlock","src":"903:76:111","statements":[{"nodeType":"YulAssignment","src":"913:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"925:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"936:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"921:3:111"},"nodeType":"YulFunctionCall","src":"921:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"913:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"955:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"966:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"948:6:111"},"nodeType":"YulFunctionCall","src":"948:25:111"},"nodeType":"YulExpressionStatement","src":"948:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"872:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"883:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"894:4:111","type":""}],"src":"802:177:111"},{"body":{"nodeType":"YulBlock","src":"1031:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"1130:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1151:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1154:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1144:6:111"},"nodeType":"YulFunctionCall","src":"1144:88:111"},"nodeType":"YulExpressionStatement","src":"1144:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1252:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1255:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1245:6:111"},"nodeType":"YulFunctionCall","src":"1245:15:111"},"nodeType":"YulExpressionStatement","src":"1245:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1280:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1283:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1273:6:111"},"nodeType":"YulFunctionCall","src":"1273:15:111"},"nodeType":"YulExpressionStatement","src":"1273:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1047:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1054:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1044:2:111"},"nodeType":"YulFunctionCall","src":"1044:77:111"},"nodeType":"YulIf","src":"1041:257:111"},{"nodeType":"YulAssignment","src":"1307:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1318:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1325:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1314:3:111"},"nodeType":"YulFunctionCall","src":"1314:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"1307:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"1013:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"1023:3:111","type":""}],"src":"984:349:111"}]},"contents":"{\n { }\n function abi_decode_uint192(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint192(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint192(headStart)\n }\n function abi_decode_tuple_t_addresst_uint192(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n value1 := abi_decode_uint192(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100415760003560e01c80630bd28e3b146100465780631b2e01b81461005b57806335567e1a14610095575b600080fd5b61005961005436600461018c565b610119565b005b6100836100693660046101ae565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100836100a33660046101ae565b73ffffffffffffffffffffffffffffffffffffffff9190911660009081526020818152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff85168452909152908190205491901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000161790565b3360009081526020818152604080832077ffffffffffffffffffffffffffffffffffffffffffffffff851684529091528120805491610157836101fc565b919050555050565b803577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461018757600080fd5b919050565b60006020828403121561019e57600080fd5b6101a78261015f565b9392505050565b600080604083850312156101c157600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146101e557600080fd5b91506101f36020840161015f565b90509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610254577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212208f746ae03cbfffaa918dd655e47c7dda610663910e42a681652f502c26d3262664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBD28E3B EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x1B2E01B8 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x35567E1A EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0x18C JUMP JUMPDEST PUSH2 0x119 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x83 PUSH2 0x69 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x83 PUSH2 0xA3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 AND OR SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP2 PUSH2 0x157 DUP4 PUSH2 0x1FC JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7 DUP3 PUSH2 0x15F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH2 0x1F3 PUSH1 0x20 DUP5 ADD PUSH2 0x15F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x254 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 PUSH21 0x6AE03CBFFFAA918DD655E47C7DDA610663910E42A6 DUP2 PUSH6 0x2F502C26D326 0x26 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"145:1100:55:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;785:108;;;;;;:::i;:::-;;:::i;:::-;;268:74;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;948:25:111;;;936:2;921:18;268:74:55;;;;;;;349:175;;;;;;:::i;:::-;462:27;;;;;430:13;462:27;;;;;;;514:2;462:27;;;498:12;;;462:32;;;;;;;;;;498:18;;;;;462:55;;349:175;785:108;868:10;848:19;:31;;;;;;;;;;;:36;;;;;;;;;;:38;;;;;;:::i;:::-;;;;;;785:108;:::o;14:204:111:-;82:20;;142:50;131:62;;121:73;;111:101;;208:1;205;198:12;111:101;14:204;;;:::o;223:186::-;282:6;335:2;323:9;314:7;310:23;306:32;303:52;;;351:1;348;341:12;303:52;374:29;393:9;374:29;:::i;:::-;364:39;223:186;-1:-1:-1;;;223:186:111:o;414:383::-;482:6;490;543:2;531:9;522:7;518:23;514:32;511:52;;;559:1;556;549:12;511:52;598:9;585:23;648:42;641:5;637:54;630:5;627:65;617:93;;706:1;703;696:12;617:93;729:5;-1:-1:-1;753:38:111;787:2;772:18;;753:38;:::i;:::-;743:48;;414:383;;;;;:::o;984:349::-;1023:3;1054:66;1047:5;1044:77;1041:257;;1154:77;1151:1;1144:88;1255:4;1252:1;1245:15;1283:4;1280:1;1273:15;1041:257;-1:-1:-1;1325:1:111;1314:13;;984:349::o"},"gasEstimates":{"creation":{"codeDepositCost":"131400","executionCost":"177","totalCost":"131577"},"external":{"getNonce(address,uint192)":"2686","incrementNonce(uint192)":"24696","nonceSequenceNumber(address,uint192)":"2616"},"internal":{"_validateAndUpdateNonce(address,uint256)":"infinite"}},"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b","nonceSequenceNumber(address,uint192)":"1b2e01b8"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"}},\"notice\":\"nonce management functionality\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/NonceManager.sol\":\"NonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract NonceManager is INonceManager {\\n\\n /**\\n * The next valid sequence number for a given nonce key.\\n */\\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\\n\\n function getNonce(address sender, uint192 key)\\n public view override returns (uint256 nonce) {\\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\\n }\\n\\n // allow an account to manually increment its own nonce.\\n // (mainly so that during construction nonce can be made non-zero,\\n // to \\\"absorb\\\" the gas cost of first nonce increment to 1st transaction (construction),\\n // not to 2nd transaction)\\n function incrementNonce(uint192 key) public override {\\n nonceSequenceNumber[msg.sender][key]++;\\n }\\n\\n /**\\n * validate nonce uniqueness for this account.\\n * called just after validateUserOp()\\n */\\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\\n\\n uint192 key = uint192(nonce >> 64);\\n uint64 seq = uint64(nonce);\\n return nonceSequenceNumber[sender][key]++ == seq;\\n }\\n\\n}\\n\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":10003,"contract":"contracts/core/NonceManager.sol:NonceManager","label":"nonceSequenceNumber","offset":0,"slot":"0","type":"t_mapping(t_address,t_mapping(t_uint192,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_uint192,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint192 => uint256))","numberOfBytes":"32","value":"t_mapping(t_uint192,t_uint256)"},"t_mapping(t_uint192,t_uint256)":{"encoding":"mapping","key":"t_uint192","label":"mapping(uint192 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint192":{"encoding":"inplace","label":"uint192","numberOfBytes":"24"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."},"nonceSequenceNumber(address,uint192)":{"notice":"The next valid sequence number for a given nonce key."}},"notice":"nonce management functionality","version":1}}},"contracts/core/SenderCreator.sol":{"SenderCreator":{"abi":[{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"createSender","outputs":[{"internalType":"address","name":"sender","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"createSender(bytes)":{"params":{"initCode":"the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata"},"returns":{"sender":"the returned address of the created account, or zero address on failure."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610213806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100f9565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008061007c601482858761016b565b61008591610195565b60601c90506000610099846014818861016b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100f057600093505b50505092915050565b6000806020838503121561010c57600080fd5b823567ffffffffffffffff8082111561012457600080fd5b818501915085601f83011261013857600080fd5b81358181111561014757600080fd5b86602082850101111561015957600080fd5b60209290920196919550909350505050565b6000808585111561017b57600080fd5b8386111561018857600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156101d55780818660140360031b1b83161692505b50509291505056fea26469706673582212200ed1f0caa67c2e9edd3ae1b316811250be87bec82d2c9561d197ea5e2b813b0964736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x570E1A36 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0xF9 JUMP JUMPDEST PUSH2 0x6C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7C PUSH1 0x14 DUP3 DUP6 DUP8 PUSH2 0x16B JUMP JUMPDEST PUSH2 0x85 SWAP2 PUSH2 0x195 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x99 DUP5 PUSH1 0x14 DUP2 DUP9 PUSH2 0x16B JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH1 0x20 SWAP4 POP DUP5 SWAP3 POP SWAP1 POP DUP3 DUP6 ADD DUP3 DUP8 GAS CALL SWAP1 POP PUSH1 0x0 MLOAD SWAP4 POP DUP1 PUSH2 0xF0 JUMPI PUSH1 0x0 SWAP4 POP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x138 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x17B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1D5 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE 0xD1 CREATE 0xCA 0xA6 PUSH29 0x2E9EDD3AE1B316811250BE87BEC82D2C9561D197EA5E2B813B0964736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"205:842:56:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@createSender_10126":{"entryPoint":108,"id":10126,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes_calldata_ptr":{"entryPoint":249,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":363,"id":null,"parameterSlots":4,"returnSlots":2},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":405,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1551:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"103:502:111","statements":[{"body":{"nodeType":"YulBlock","src":"149:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"161:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"151:6:111"},"nodeType":"YulFunctionCall","src":"151:12:111"},"nodeType":"YulExpressionStatement","src":"151:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"124:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"133:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"120:3:111"},"nodeType":"YulFunctionCall","src":"120:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"145:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"116:3:111"},"nodeType":"YulFunctionCall","src":"116:32:111"},"nodeType":"YulIf","src":"113:52:111"},{"nodeType":"YulVariableDeclaration","src":"174:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"201:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"188:12:111"},"nodeType":"YulFunctionCall","src":"188:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"178:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"220:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"230:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"224:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"275:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"284:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"287:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"277:6:111"},"nodeType":"YulFunctionCall","src":"277:12:111"},"nodeType":"YulExpressionStatement","src":"277:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"263:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"271:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"260:2:111"},"nodeType":"YulFunctionCall","src":"260:14:111"},"nodeType":"YulIf","src":"257:34:111"},{"nodeType":"YulVariableDeclaration","src":"300:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"314:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"325:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"310:3:111"},"nodeType":"YulFunctionCall","src":"310:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"304:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"380:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"389:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"392:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"382:6:111"},"nodeType":"YulFunctionCall","src":"382:12:111"},"nodeType":"YulExpressionStatement","src":"382:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"359:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"363:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"355:3:111"},"nodeType":"YulFunctionCall","src":"355:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"370:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"351:3:111"},"nodeType":"YulFunctionCall","src":"351:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"344:6:111"},"nodeType":"YulFunctionCall","src":"344:35:111"},"nodeType":"YulIf","src":"341:55:111"},{"nodeType":"YulVariableDeclaration","src":"405:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"432:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"419:12:111"},"nodeType":"YulFunctionCall","src":"419:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"409:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"462:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"471:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"474:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"464:6:111"},"nodeType":"YulFunctionCall","src":"464:12:111"},"nodeType":"YulExpressionStatement","src":"464:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"450:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"458:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"447:2:111"},"nodeType":"YulFunctionCall","src":"447:14:111"},"nodeType":"YulIf","src":"444:34:111"},{"body":{"nodeType":"YulBlock","src":"528:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"537:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"540:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"530:6:111"},"nodeType":"YulFunctionCall","src":"530:12:111"},"nodeType":"YulExpressionStatement","src":"530:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"501:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"505:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"497:3:111"},"nodeType":"YulFunctionCall","src":"497:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"514:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"493:3:111"},"nodeType":"YulFunctionCall","src":"493:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"519:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"490:2:111"},"nodeType":"YulFunctionCall","src":"490:37:111"},"nodeType":"YulIf","src":"487:57:111"},{"nodeType":"YulAssignment","src":"553:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"567:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"571:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"563:3:111"},"nodeType":"YulFunctionCall","src":"563:11:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"553:6:111"}]},{"nodeType":"YulAssignment","src":"583:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"593:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"583:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"61:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"72:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"84:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"92:6:111","type":""}],"src":"14:591:111"},{"body":{"nodeType":"YulBlock","src":"711:125:111","statements":[{"nodeType":"YulAssignment","src":"721:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"733:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"744:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"729:3:111"},"nodeType":"YulFunctionCall","src":"729:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"721:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"763:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"778:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"786:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"774:3:111"},"nodeType":"YulFunctionCall","src":"774:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"756:6:111"},"nodeType":"YulFunctionCall","src":"756:74:111"},"nodeType":"YulExpressionStatement","src":"756:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"680:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"691:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"702:4:111","type":""}],"src":"610:226:111"},{"body":{"nodeType":"YulBlock","src":"971:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"1009:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1018:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1021:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1011:6:111"},"nodeType":"YulFunctionCall","src":"1011:12:111"},"nodeType":"YulExpressionStatement","src":"1011:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"987:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"999:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"984:2:111"},"nodeType":"YulFunctionCall","src":"984:24:111"},"nodeType":"YulIf","src":"981:44:111"},{"body":{"nodeType":"YulBlock","src":"1058:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1067:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1070:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1060:6:111"},"nodeType":"YulFunctionCall","src":"1060:12:111"},"nodeType":"YulExpressionStatement","src":"1060:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"1040:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"1050:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1037:2:111"},"nodeType":"YulFunctionCall","src":"1037:20:111"},"nodeType":"YulIf","src":"1034:40:111"},{"nodeType":"YulAssignment","src":"1083:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1100:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"1108:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1096:3:111"},"nodeType":"YulFunctionCall","src":"1096:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"1083:9:111"}]},{"nodeType":"YulAssignment","src":"1128:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"1145:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"1155:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1141:3:111"},"nodeType":"YulFunctionCall","src":"1141:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"1128:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"905:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"913:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"921:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"933:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"946:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"957:9:111","type":""}],"src":"841:331:111"},{"body":{"nodeType":"YulBlock","src":"1278:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1288:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"1311:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1298:12:111"},"nodeType":"YulFunctionCall","src":"1298:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1292:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1326:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1336:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1330:2:111","type":""}]},{"nodeType":"YulAssignment","src":"1411:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"1424:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1428:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1420:3:111"},"nodeType":"YulFunctionCall","src":"1420:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"1411:5:111"}]},{"body":{"nodeType":"YulBlock","src":"1463:80:111","statements":[{"nodeType":"YulAssignment","src":"1477:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"1494:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1506:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1513:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"1517:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1509:3:111"},"nodeType":"YulFunctionCall","src":"1509:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1502:3:111"},"nodeType":"YulFunctionCall","src":"1502:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1524:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1498:3:111"},"nodeType":"YulFunctionCall","src":"1498:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1490:3:111"},"nodeType":"YulFunctionCall","src":"1490:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1530:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1486:3:111"},"nodeType":"YulFunctionCall","src":"1486:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"1477:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1446:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1451:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1443:2:111"},"nodeType":"YulFunctionCall","src":"1443:11:111"},"nodeType":"YulIf","src":"1440:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"1253:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"1260:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"1268:5:111","type":""}],"src":"1177:372:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value0 := add(_2, 32)\n value1 := length\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100f9565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008061007c601482858761016b565b61008591610195565b60601c90506000610099846014818861016b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100f057600093505b50505092915050565b6000806020838503121561010c57600080fd5b823567ffffffffffffffff8082111561012457600080fd5b818501915085601f83011261013857600080fd5b81358181111561014757600080fd5b86602082850101111561015957600080fd5b60209290920196919550909350505050565b6000808585111561017b57600080fd5b8386111561018857600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156101d55780818660140360031b1b83161692505b50509291505056fea26469706673582212200ed1f0caa67c2e9edd3ae1b316811250be87bec82d2c9561d197ea5e2b813b0964736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x570E1A36 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0xF9 JUMP JUMPDEST PUSH2 0x6C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7C PUSH1 0x14 DUP3 DUP6 DUP8 PUSH2 0x16B JUMP JUMPDEST PUSH2 0x85 SWAP2 PUSH2 0x195 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x99 DUP5 PUSH1 0x14 DUP2 DUP9 PUSH2 0x16B JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH1 0x20 SWAP4 POP DUP5 SWAP3 POP SWAP1 POP DUP3 DUP6 ADD DUP3 DUP8 GAS CALL SWAP1 POP PUSH1 0x0 MLOAD SWAP4 POP DUP1 PUSH2 0xF0 JUMPI PUSH1 0x0 SWAP4 POP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x138 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x17B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1D5 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE 0xD1 CREATE 0xCA 0xA6 PUSH29 0x2E9EDD3AE1B316811250BE87BEC82D2C9561D197EA5E2B813B0964736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"205:842:56:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;545:500;;;;;;:::i;:::-;;:::i;:::-;;;786:42:111;774:55;;;756:74;;744:2;729:18;545:500:56;;;;;;;;610:14;;670:16;683:2;610:14;670:8;;:16;:::i;:::-;662:25;;;:::i;:::-;654:34;;;-1:-1:-1;698:25:56;726:14;:8;735:2;726:8;;:14;:::i;:::-;698:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;904:19:56;;698:42;;-1:-1:-1;698:42:56;928:2;;-1:-1:-1;698:42:56;;-1:-1:-1;904:19:56;-1:-1:-1;879:23:56;;;698:42;867:7;860:5;855:76;844:87;;960:1;954:8;944:18;;986:7;981:58;;1026:1;1009:19;;981:58;626:419;;;545:500;;;;:::o;14:591:111:-;84:6;92;145:2;133:9;124:7;120:23;116:32;113:52;;;161:1;158;151:12;113:52;201:9;188:23;230:18;271:2;263:6;260:14;257:34;;;287:1;284;277:12;257:34;325:6;314:9;310:22;300:32;;370:7;363:4;359:2;355:13;351:27;341:55;;392:1;389;382:12;341:55;432:2;419:16;458:2;450:6;447:14;444:34;;;474:1;471;464:12;444:34;519:7;514:2;505:6;501:2;497:15;493:24;490:37;487:57;;;540:1;537;530:12;487:57;571:2;563:11;;;;;593:6;;-1:-1:-1;14:591:111;;-1:-1:-1;;;;14:591:111:o;841:331::-;946:9;957;999:8;987:10;984:24;981:44;;;1021:1;1018;1011:12;981:44;1050:6;1040:8;1037:20;1034:40;;;1070:1;1067;1060:12;1034:40;-1:-1:-1;;1096:23:111;;;1141:25;;;;;-1:-1:-1;841:331:111:o;1177:372::-;1336:66;1298:19;;1420:11;;;;1451:2;1443:11;;1440:103;;;1530:2;1524;1517:3;1513:2;1509:12;1506:1;1502:20;1498:29;1494:2;1490:38;1486:47;1477:56;;1440:103;;;1177:372;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"106200","executionCost":"153","totalCost":"106353"},"external":{"createSender(bytes)":"infinite"}},"methodIdentifiers":{"createSender(bytes)":"570e1a36"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"createSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createSender(bytes)\":{\"params\":{\"initCode\":\"the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\"},\"returns\":{\"sender\":\"the returned address of the created account, or zero address on failure.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createSender(bytes)\":{\"notice\":\"call the \\\"initCode\\\" factory to create and return the sender account address\"}},\"notice\":\"helper contract for EntryPoint, to call userOp.initCode from a \\\"neutral\\\" address, which is explicitly not the entryPoint itself.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/SenderCreator.sol\":\"SenderCreator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/**\\n * helper contract for EntryPoint, to call userOp.initCode from a \\\"neutral\\\" address,\\n * which is explicitly not the entryPoint itself.\\n */\\ncontract SenderCreator {\\n\\n /**\\n * call the \\\"initCode\\\" factory to create and return the sender account address\\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) external returns (address sender) {\\n address factory = address(bytes20(initCode[0 : 20]));\\n bytes memory initCallData = initCode[20 :];\\n bool success;\\n /* solhint-disable no-inline-assembly */\\n assembly {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"createSender(bytes)":{"notice":"call the \"initCode\" factory to create and return the sender account address"}},"notice":"helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address, which is explicitly not the entryPoint itself.","version":1}}},"contracts/core/StakeManager.sol":{"StakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","deposits(address)":"fc7e286d","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by a paymaster.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/StakeManager.sol\":\"StakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by a paymaster.\\n */\\nabstract contract StakeManager is IStakeManager {\\n\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\\n DepositInfo storage depositInfo = deposits[addr];\\n info.stake = depositInfo.stake;\\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\\n }\\n\\n /// return the deposit (for gas payment) of the account\\n function balanceOf(address account) public view returns (uint256) {\\n return deposits[account].deposit;\\n }\\n\\n receive() external payable {\\n depositTo(msg.sender);\\n }\\n\\n function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\n }\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 unstakeDelaySec) public payable {\\n DepositInfo storage info = deposits[msg.sender];\\n require(unstakeDelaySec > 0, \\\"must specify unstake delay\\\");\\n require(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\n uint256 stake = info.stake + msg.value;\\n require(stake > 0, \\\"no stake specified\\\");\\n require(stake <= type(uint112).max, \\\"stake overflow\\\");\\n deposits[msg.sender] = DepositInfo(\\n info.deposit,\\n true,\\n uint112(stake),\\n unstakeDelaySec,\\n 0\\n );\\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\\n }\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(info.unstakeDelaySec != 0, \\\"not staked\\\");\\n require(info.staked, \\\"already unstaking\\\");\\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\\n info.withdrawTime = withdrawTime;\\n info.staked = false;\\n emit StakeUnlocked(msg.sender, withdrawTime);\\n }\\n\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external {\\n DepositInfo storage info = deposits[msg.sender];\\n uint256 stake = info.stake;\\n require(stake > 0, \\\"No stake to withdraw\\\");\\n require(info.withdrawTime > 0, \\\"must call unlockStake() first\\\");\\n require(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\n info.unstakeDelaySec = 0;\\n info.withdrawTime = 0;\\n info.stake = 0;\\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\\n (bool success,) = withdrawAddress.call{value : stake}(\\\"\\\");\\n require(success, \\\"failed to withdraw stake\\\");\\n }\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(info.deposit - withdrawAmount);\\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\\\"\\\");\\n require(success, \\\"failed to withdraw\\\");\\n }\\n}\\n\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":10139,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"deposits","offset":0,"slot":"0","type":"t_mapping(t_address,t_struct(DepositInfo)10913_storage)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_mapping(t_address,t_struct(DepositInfo)10913_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => struct IStakeManager.DepositInfo)","numberOfBytes":"32","value":"t_struct(DepositInfo)10913_storage"},"t_struct(DepositInfo)10913_storage":{"encoding":"inplace","label":"struct IStakeManager.DepositInfo","members":[{"astId":10904,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"deposit","offset":0,"slot":"0","type":"t_uint112"},{"astId":10906,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"staked","offset":14,"slot":"0","type":"t_bool"},{"astId":10908,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"stake","offset":15,"slot":"0","type":"t_uint112"},{"astId":10910,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"unstakeDelaySec","offset":0,"slot":"1","type":"t_uint32"},{"astId":10912,"contract":"contracts/core/StakeManager.sol:StakeManager","label":"withdrawTime","offset":4,"slot":"1","type":"t_uint48"}],"numberOfBytes":"64"},"t_uint112":{"encoding":"inplace","label":"uint112","numberOfBytes":"14"},"t_uint32":{"encoding":"inplace","label":"uint32","numberOfBytes":"4"},"t_uint48":{"encoding":"inplace","label":"uint48","numberOfBytes":"6"}}},"userdoc":{"events":{"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"}},"kind":"user","methods":{"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"balanceOf(address)":{"notice":"return the deposit (for gas payment) of the account"},"depositTo(address)":{"notice":"add to the deposit of the given account"},"deposits(address)":{"notice":"maps paymaster to their deposits and stakes"},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"notice":"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \"unstakeDelay\" by a paymaster.","version":1}}},"contracts/interfaces/IAccount.sol":{"IAccount":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"details":"Must validate caller is the entryPoint. Must validate the signature and nonce","params":{"missingAccountFunds":"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \"entryPoint.withdrawTo()\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.","userOp":"the operation that is about to be executed.","userOpHash":"hash of the user's request data. can be used as the basis for signature."},"returns":{"validationData":"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"details\":\"Must validate caller is the entryPoint. Must validate the signature and nonce\",\"params\":{\"missingAccountFunds\":\"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\",\"userOp\":\"the operation that is about to be executed.\",\"userOpHash\":\"hash of the user's request data. can be used as the basis for signature.\"},\"returns\":{\"validationData\":\"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \\\"simulation call\\\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAccount.sol\":\"IAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \"simulation call\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure."}},"version":1}}},"contracts/interfaces/IAggregator.sol":{"IAggregator":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"sigForUserOp","type":"bytes"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"params":{"userOps":"array of UserOperations to collect the signatures from."},"returns":{"aggregatedSignature":"the aggregated signature"}},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"params":{"userOp":"the userOperation received from the user."},"returns":{"sigForUserOp":"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \"multisig\""}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"sigForUserOp\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"params\":{\"userOps\":\"array of UserOperations to collect the signatures from.\"},\"returns\":{\"aggregatedSignature\":\"the aggregated signature\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"sigForUserOp\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\"}},\"notice\":\"Aggregated Signatures validator.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAggregator.sol\":\"IAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"notice":"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation"},"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":{"notice":"validate aggregated signature. revert if the aggregated signature does not match the given list of operations."},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps."}},"notice":"Aggregated Signatures validator.","version":1}}},"contracts/interfaces/IEntryPoint.sol":{"IEntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedOp(uint256,string)":[{"params":{"opIndex":"- index into the array of ops to the failed one (in simulateValidation, this is always zero)","reason":"- revert reason The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."}}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"params":{"factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"params":{"aggregatorInfo":"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation","factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}]},"events":{"AccountDeployed(bytes32,address,address,address)":{"params":{"factory":"the factory used to deploy this account (in the initCode)","paymaster":"the paymaster used by this UserOp","sender":"the account that is deployed","userOpHash":"the userOp that deployed this account. UserOperationEvent will follow."}},"UserOperationRevertReason(bytes32,address,uint256,bytes)":{"params":{"nonce":"the nonce used in the request","revertReason":"- the return bytes from the (reverted) call to \"callData\".","sender":"the sender of this request","userOpHash":"the request unique identifier."}}},"kind":"dev","methods":{"addStake(uint32)":{"params":{"_unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"balanceOf(address)":{"returns":{"_0":"the deposit (for gas payment) of the account"}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}},"getSenderAddress(bytes)":{"params":{"initCode":"the constructor code to be passed into the UserOperation."}},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","opsPerAggregator":"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)"}},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","ops":"the operations to execute"}},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"params":{"op":"the UserOperation to simulate","target":"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.","targetCallData":"callData to pass to target address"}},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"details":"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.","params":{"userOp":"the user operation to validate."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"params\":{\"factory\":\"the factory used to deploy this account (in the initCode)\",\"paymaster\":\"the paymaster used by this UserOp\",\"sender\":\"the account that is deployed\",\"userOpHash\":\"the userOp that deployed this account. UserOperationEvent will follow.\"}},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"params\":{\"nonce\":\"the nonce used in the request\",\"revertReason\":\"- the return bytes from the (reverted) call to \\\"callData\\\".\",\"sender\":\"the sender of this request\",\"userOpHash\":\"the request unique identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IEntryPoint.sol\":\"IEntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)":[{"notice":"return value of simulateHandleOp"}],"FailedOp(uint256,string)":[{"notice":"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it."}],"SenderAddressResult(address)":[{"notice":"return value of getSenderAddress"}],"SignatureValidationFailed(address)":[{"notice":"error case when a signature aggregator fails to verify the aggregated signature it had created."}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"notice":"Successful result from simulateValidation."}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"notice":"Successful result from simulateValidation, if the account returns a signature aggregator"}]},"events":{"AccountDeployed(bytes32,address,address,address)":{"notice":"account \"sender\" was deployed."},"BeforeExecution()":{"notice":"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation."},"SignatureAggregatorChanged(address)":{"notice":"signature aggregator used by the following UserOperationEvents within this bundle."},"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"},"UserOperationRevertReason(bytes32,address,uint256,bytes)":{"notice":"An event emitted if the UserOperation \"callData\" reverted with non-zero length"}},"kind":"user","methods":{"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"depositTo(address)":{"notice":"add to the deposit of the given account"},"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"getSenderAddress(bytes)":{"notice":"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error"},"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"notice":"Execute a batch of UserOperation with Aggregators"},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"notice":"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"notice":"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \"ExecutionResult\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events."},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp."},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"version":1}}},"contracts/interfaces/INonceManager.sol":{"INonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/INonceManager.sol\":\"INonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."}},"version":1}}},"contracts/interfaces/IPaymaster.sol":{"IPaymaster":{"abi":[{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"postOp(uint8,bytes,uint256)":"a9a23409","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"}},\"notice\":\"the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations. a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IPaymaster.sol\":\"IPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."}},"notice":"the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations. a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.","version":1}}},"contracts/interfaces/IStakeManager.sol":{"IStakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"_unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"balanceOf(address)":{"returns":{"_0":"the deposit (for gas payment) of the account"}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IStakeManager.sol\":\"IStakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"events":{"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"}},"kind":"user","methods":{"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"depositTo(address)":{"notice":"add to the deposit of the given account"},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"notice":"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \"unstakeDelay\" by the staked entity.","version":1}}},"contracts/interfaces/UserOperation.sol":{"UserOperationLib":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122008ede85b51f24773a2dd2b0edf24b0e09a5175eda2b1ed78902ad573776ccf1264736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD 0xED 0xE8 JUMPDEST MLOAD CALLCODE SELFBALANCE PUSH20 0xA2DD2B0EDF24B0E09A5175EDA2B1ED78902AD573 PUSH24 0x6CCF1264736F6C634300080F003300000000000000000000 ","sourceMap":"1642:2115:64:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;1642:2115:64;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122008ede85b51f24773a2dd2b0edf24b0e09a5175eda2b1ed78902ad573776ccf1264736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD 0xED 0xE8 JUMPDEST MLOAD CALLCODE SELFBALANCE PUSH20 0xA2DD2B0EDF24B0E09A5175EDA2B1ED78902AD573 PUSH24 0x6CCF1264736F6C634300080F003300000000000000000000 ","sourceMap":"1642:2115:64:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"gasPrice(struct UserOperation calldata)":"infinite","getSender(struct UserOperation calldata)":"infinite","hash(struct UserOperation calldata)":"infinite","min(uint256,uint256)":"infinite","pack(struct UserOperation calldata)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when working with UserOperation structs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/UserOperation.sol\":\"UserOperationLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Utility functions helpful when working with UserOperation structs.","version":1}}},"contracts/samples/BobaDepositPaymaster.sol":{"BobaDepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"contract IBobaStraw","name":"ethPriceOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_ETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_USD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"contract IBobaStraw","name":"tokenPriceOracle","type":"address"},{"internalType":"address","name":"base","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"contract IBobaStraw","name":"feedRegistry","type":"address"},{"internalType":"address","name":"tokenBase","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit.","token":"the token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address,address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to","token":"the token deposit to withdraw"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_11262":{"entryPoint":null,"id":11262,"parameterSlots":2,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":402,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_11397":{"entryPoint":null,"id":11397,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory":{"entryPoint":507,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":482,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1024:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"302:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"350:6:111"},"nodeType":"YulFunctionCall","src":"350:12:111"},"nodeType":"YulExpressionStatement","src":"350:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"323:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"332:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"319:3:111"},"nodeType":"YulFunctionCall","src":"319:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"344:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"315:3:111"},"nodeType":"YulFunctionCall","src":"315:32:111"},"nodeType":"YulIf","src":"312:52:111"},{"nodeType":"YulVariableDeclaration","src":"373:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"392:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"386:5:111"},"nodeType":"YulFunctionCall","src":"386:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"377:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"449:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"411:37:111"},"nodeType":"YulFunctionCall","src":"411:44:111"},"nodeType":"YulExpressionStatement","src":"411:44:111"},{"nodeType":"YulAssignment","src":"464:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"474:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"464:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"488:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"513:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"524:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"509:3:111"},"nodeType":"YulFunctionCall","src":"509:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"503:5:111"},"nodeType":"YulFunctionCall","src":"503:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"492:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"575:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"537:37:111"},"nodeType":"YulFunctionCall","src":"537:46:111"},"nodeType":"YulExpressionStatement","src":"537:46:111"},{"nodeType":"YulAssignment","src":"592:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"602:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"592:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"260:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"271:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"283:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"291:6:111","type":""}],"src":"163:452:111"},{"body":{"nodeType":"YulBlock","src":"794:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"811:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"822:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"804:6:111"},"nodeType":"YulFunctionCall","src":"804:21:111"},"nodeType":"YulExpressionStatement","src":"804:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"856:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"841:3:111"},"nodeType":"YulFunctionCall","src":"841:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"861:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"834:6:111"},"nodeType":"YulFunctionCall","src":"834:30:111"},"nodeType":"YulExpressionStatement","src":"834:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"895:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"880:3:111"},"nodeType":"YulFunctionCall","src":"880:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e636f72726563742065746820","kind":"string","nodeType":"YulLiteral","src":"900:34:111","type":"","value":"DepositPaymaster: Incorrect eth "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"873:6:111"},"nodeType":"YulFunctionCall","src":"873:62:111"},"nodeType":"YulExpressionStatement","src":"873:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"966:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"951:3:111"},"nodeType":"YulFunctionCall","src":"951:18:111"},{"hexValue":"6f7261636c65","kind":"string","nodeType":"YulLiteral","src":"971:8:111","type":"","value":"oracle"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:36:111"},"nodeType":"YulExpressionStatement","src":"944:36:111"},{"nodeType":"YulAssignment","src":"989:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1012:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"997:3:111"},"nodeType":"YulFunctionCall","src":"997:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"989:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"771:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"785:4:111","type":""}],"src":"620:402:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"DepositPaymaster: Incorrect eth \")\n mstore(add(headStart, 96), \"oracle\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b50604051620026b7380380620026b78339810160408190526200003491620001fb565b81620000403362000192565b6001600160a01b039081166080528116620000b05760405162461bcd60e51b815260206004820152602660248201527f4465706f7369745061796d61737465723a20496e636f727265637420657468206044820152656f7261636c6560d01b606482015260840160405180910390fd5b620000c8336000908152600360205260409020439055565b604080516060810182526001600160a01b039283168152734200000000000000000000000000000000000006602080830182815260129484019485526000929092526001905290517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731880549185166001600160a01b0319909216919091179055517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d173198054925160ff16600160a01b026001600160a81b03199093169190931617179055506200023a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001f857600080fd5b50565b600080604083850312156200020f57600080fd5b82516200021c81620001e2565b60208401519092506200022f81620001e2565b809150509250929050565b6080516124306200028760003960008181610474015281816105ec0152818161084a01528181610a0201528181610ac901528181610b5901528181610d110152610ffb01526124306000f3fe6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610538578063d0e30db01461055a578063f2fde38b14610562578063f465c77e1461058257600080fd5b8063c23f001f146104cb578063c399ec8814610503578063cc9c837c1461051857600080fd5b8063b0d691fe116100bb578063b0d691fe14610462578063bb9fe6bf14610496578063c23a5cea146104ab57600080fd5b80639ed0fb681461037d578063a9a23409146103a1578063addd5099146103c157600080fd5b8063493b017011610143578063796d43711161011d578063796d43711461033c5780637b775d4d146102305780638da5cb5b1461035257600080fd5b8063493b0170146102785780634a6f84cf146102ec578063715018a61461032757600080fd5b80632f3e96a7116101745780632f3e96a7146101f057806333032ec414610230578063382edd9e1461025857600080fd5b80630396cb601461019b5780631a02ef76146101b0578063205c2878146101d0575b600080fd5b6101ae6101a9366004611d13565b6105b0565b005b3480156101bc57600080fd5b506101ae6101cb366004611d6a565b610662565b3480156101dc57600080fd5b506101ae6101eb366004611dc6565b6107f6565b3480156101fc57600080fd5b5061020661034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023c57600080fd5b5061020673420000000000000000000000000000000000000681565b34801561026457600080fd5b506101ae610273366004611df2565b61088e565b34801561028457600080fd5b506102d7610293366004611e33565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610227565b3480156102f857600080fd5b50610319610307366004611e6c565b60036020526000908152604090205481565b604051908152602001610227565b34801561033357600080fd5b506101ae6109ca565b34801561034857600080fd5b506103196188b881565b34801561035e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610206565b34801561038957600080fd5b506101ae336000908152600360205260409020439055565b3480156103ad57600080fd5b506101ae6103bc366004611e89565b6109de565b3480156103cd57600080fd5b5061042c6103dc366004611e6c565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610227565b34801561046e57600080fd5b506102067f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a257600080fd5b506101ae6109f8565b3480156104b757600080fd5b506101ae6104c6366004611e6c565b610a7c565b3480156104d757600080fd5b506103196104e6366004611e33565b600260209081526000928352604080842090915290825290205481565b34801561050f57600080fd5b50610319610b28565b34801561052457600080fd5b506101ae610533366004611df2565b610bde565b34801561054457600080fd5b506101ae33600090815260036020526040812055565b6101ae610ce3565b34801561056e57600080fd5b506101ae61057d366004611e6c565b610d6b565b34801561058e57600080fd5b506105a261059d366004611f18565b610e08565b604051610227929190611fe2565b6105b8610e2b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b505050505050565b61066a610e2b565b73ffffffffffffffffffffffffffffffffffffffff83166106f85760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561072a57600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b6107fe610e2b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561064657600080fd5b6108b073ffffffffffffffffffffffffffffffffffffffff8416333084610e92565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160205260409020541661094a5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526002602090815260408083209386168352929052908120805483929061098e908490612033565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109c5576109c533600090815260036020526040812055565b505050565b6109d2610e2b565b6109dc6000610f6e565b565b6109e6610fe3565b6109f284848484611068565b50505050565b610a00610e2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a6857600080fd5b505af11580156109f2573d6000803e3d6000fd5b610a84610e2b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd9919061204b565b905090565b3360009081526003602052604090205415801590610c0a57503360009081526003602052604090205443115b610c7c5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cbc908490612064565b909155506109c5905073ffffffffffffffffffffffffffffffffffffffff841683836111e0565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b0d57600080fd5b610d73610e2b565b73ffffffffffffffffffffffffffffffffffffffff8116610dfc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ef565b610e0581610f6e565b50565b60606000610e14610fe3565b610e1f858585611236565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ef565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109f29085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611517565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109dc5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106ef565b60008080808061107a8789018961207b565b9450945094509450945060008183856188b861109691906120cc565b6110a0908a612033565b6110aa91906120cc565b6110b49190612109565b905060028a60028111156110ca576110ca612144565b146110f6576110f173ffffffffffffffffffffffffffffffffffffffff8616873084610e92565b611140565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a168352929052908120805483929061113a908490612064565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260408120829161118660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111cf9190612033565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109c59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610eec565b606060006188b88560a00135116112b55760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106ef565b3660006112c6610120880188612173565b9092509050602881146113415760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106ef565b600061135082601481866121df565b61135991612209565b60601c90508735600061136c8389611609565b905060006113798b611b13565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150156114145760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156114bc5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611579826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b429092919063ffffffff16565b8051909150156109c557808060200190518101906115979190612251565b6109c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff169382019390935290916116e75760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb919061204b565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c919061204b565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612273565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190612273565b60ff1690506000611a4483600a6123b0565b611a4e90856120cc565b611a5983600a6123b0565b611a63878c6120cc565b611a6d91906120cc565b611a779190612109565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731954909150611adf9074010000000000000000000000000000000000000000900460ff16600a6123bc565b6040880151611aef90600a6123bc565b611af990836120cc565b611b039190612109565b9750505050505050505b92915050565b600060e0820135610100830135808203611b2e575092915050565b611b3a82488301611b51565b949350505050565b6060611b3a8484600085611b69565b6000818310611b605781611b62565b825b9392505050565b606082471015611be15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106ef565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c0a91906123cb565b60006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b5091509150611c5d87838387611c68565b979650505050505050565b60608315611ce4578251600003611cdd5773ffffffffffffffffffffffffffffffffffffffff85163b611cdd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ef565b5081611b3a565b611b3a8383815115611cf95781518083602001fd5b8060405162461bcd60e51b81526004016106ef91906123e7565b600060208284031215611d2557600080fd5b813563ffffffff81168114611b6257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610e0557600080fd5b60ff81168114610e0557600080fd5b60008060008060808587031215611d8057600080fd5b8435611d8b81611d39565b93506020850135611d9b81611d39565b92506040850135611dab81611d39565b91506060850135611dbb81611d5b565b939692955090935050565b60008060408385031215611dd957600080fd5b8235611de481611d39565b946020939093013593505050565b600080600060608486031215611e0757600080fd5b8335611e1281611d39565b92506020840135611e2281611d39565b929592945050506040919091013590565b60008060408385031215611e4657600080fd5b8235611e5181611d39565b91506020830135611e6181611d39565b809150509250929050565b600060208284031215611e7e57600080fd5b8135611b6281611d39565b60008060008060608587031215611e9f57600080fd5b843560038110611eae57600080fd5b9350602085013567ffffffffffffffff80821115611ecb57600080fd5b818701915087601f830112611edf57600080fd5b813581811115611eee57600080fd5b886020828501011115611f0057600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f2d57600080fd5b833567ffffffffffffffff811115611f4457600080fd5b84016101608187031215611f5757600080fd5b95602085013595506040909401359392505050565b60005b83811015611f87578181015183820152602001611f6f565b838111156109f25750506000910152565b60008151808452611fb0816020860160208601611f6c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611ff56040830185611f98565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561204657612046612004565b500190565b60006020828403121561205d57600080fd5b5051919050565b60008282101561207657612076612004565b500390565b600080600080600060a0868803121561209357600080fd5b853561209e81611d39565b945060208601356120ae81611d39565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210457612104612004565b500290565b60008261213f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121a857600080fd5b83018035915067ffffffffffffffff8211156121c357600080fd5b6020019150368190038213156121d857600080fd5b9250929050565b600080858511156121ef57600080fd5b838611156121fc57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122495780818660140360031b1b83161692505b505092915050565b60006020828403121561226357600080fd5b81518015158114611b6257600080fd5b60006020828403121561228557600080fd5b8151611b6281611d5b565b600181815b808511156122e957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156122cf576122cf612004565b808516156122dc57918102915b93841c9390800290612295565b509250929050565b60008261230057506001611b0d565b8161230d57506000611b0d565b8160018114612323576002811461232d57612349565b6001915050611b0d565b60ff84111561233e5761233e612004565b50506001821b611b0d565b5060208310610133831016604e8410600b841016171561236c575081810a611b0d565b6123768383612290565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156123a8576123a8612004565b029392505050565b6000611b6283836122f1565b6000611b6260ff8416836122f1565b600082516123dd818460208701611f6c565b9190910192915050565b602081526000611b626020830184611f9856fea26469706673582212208a9cab613294aeef7047a8205015d7b3471fa40b68142b67434d61f70707bbe764736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x26B7 CODESIZE SUB DUP1 PUSH3 0x26B7 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x1FB JUMP JUMPDEST DUP2 PUSH3 0x40 CALLER PUSH3 0x192 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE DUP2 AND PUSH3 0xB0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F72726563742065746820 PUSH1 0x44 DUP3 ADD MSTORE PUSH6 0x6F7261636C65 PUSH1 0xD0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0xC8 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x12 SWAP5 DUP5 ADD SWAP5 DUP6 MSTORE PUSH1 0x0 SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 SWAP1 MSTORE SWAP1 MLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 DUP1 SLOAD SWAP2 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE MLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 DUP1 SLOAD SWAP3 MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP4 AND OR OR SWAP1 SSTORE POP PUSH3 0x23A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x1F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x20F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x21C DUP2 PUSH3 0x1E2 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x22F DUP2 PUSH3 0x1E2 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x2430 PUSH3 0x287 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x474 ADD MSTORE DUP2 DUP2 PUSH2 0x5EC ADD MSTORE DUP2 DUP2 PUSH2 0x84A ADD MSTORE DUP2 DUP2 PUSH2 0xA02 ADD MSTORE DUP2 DUP2 PUSH2 0xAC9 ADD MSTORE DUP2 DUP2 PUSH2 0xB59 ADD MSTORE DUP2 DUP2 PUSH2 0xD11 ADD MSTORE PUSH2 0xFFB ADD MSTORE PUSH2 0x2430 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x196 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23F001F GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x55A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x582 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4CB JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x503 JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x4AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x37D JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3A1 JUMPI DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x3C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 GT PUSH2 0x143 JUMPI DUP1 PUSH4 0x796D4371 GT PUSH2 0x11D JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0x7B775D4D EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x2EC JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2F3E96A7 GT PUSH2 0x174 JUMPI DUP1 PUSH4 0x2F3E96A7 EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0x33032EC4 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x19B JUMPI DUP1 PUSH4 0x1A02EF76 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1D0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE PUSH2 0x1A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D13 JUMP JUMPDEST PUSH2 0x5B0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1D6A JUMP JUMPDEST PUSH2 0x662 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1DC6 JUMP JUMPDEST PUSH2 0x7F6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x348 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH20 0x4200000000000000000000000000000000000006 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x273 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF2 JUMP JUMPDEST PUSH2 0x88E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x284 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D7 PUSH2 0x293 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E33 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x307 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x9CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x206 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x3BC CALLDATASIZE PUSH1 0x4 PUSH2 0x1E89 JUMP JUMPDEST PUSH2 0x9DE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x42C PUSH2 0x3DC CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 DUP2 AND SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x9F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x4C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH2 0xA7C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x4E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E33 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0xB28 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x524 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x533 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF2 JUMP JUMPDEST PUSH2 0xBDE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1AE PUSH2 0xCE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x57D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A2 PUSH2 0x59D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F18 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x227 SWAP3 SWAP2 SWAP1 PUSH2 0x1FE2 JUMP JUMPDEST PUSH2 0x5B8 PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x65A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x66A PUSH2 0xE2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x6F8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F727265637420746F6B65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E206F7261636C65000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x72A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0xFF SWAP4 DUP5 AND DUP6 DUP5 ADD SWAP1 DUP2 MSTORE SWAP7 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP3 KECCAK256 SWAP4 MLOAD DUP5 SLOAD SWAP1 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR DUP5 SSTORE MLOAD SWAP3 ADD DUP1 SLOAD SWAP5 MLOAD SWAP1 SWAP2 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP3 AND OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x7FE PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xE92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x98E SWAP1 DUP5 SWAP1 PUSH2 0x2033 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x9C5 JUMPI PUSH2 0x9C5 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x9D2 PUSH2 0xE2B JUMP JUMPDEST PUSH2 0x9DC PUSH1 0x0 PUSH2 0xF6E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x9E6 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0x9F2 DUP5 DUP5 DUP5 DUP5 PUSH2 0x1068 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xA00 PUSH2 0xE2B JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9F2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xA84 PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB21 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xBD9 SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xC0A JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xC7C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xCBC SWAP1 DUP5 SWAP1 PUSH2 0x2064 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x9C5 SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x11E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD73 PUSH2 0xE2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xDFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH2 0xE05 DUP2 PUSH2 0xF6E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xE14 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0xE1F DUP6 DUP6 DUP6 PUSH2 0x1236 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x9DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9F2 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1517 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x9DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x107A DUP8 DUP10 ADD DUP10 PUSH2 0x207B JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x1096 SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x10A0 SWAP1 DUP11 PUSH2 0x2033 JUMP JUMPDEST PUSH2 0x10AA SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x10B4 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x10CA JUMPI PUSH2 0x10CA PUSH2 0x2144 JUMP JUMPDEST EQ PUSH2 0x10F6 JUMPI PUSH2 0x10F1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xE92 JUMP JUMPDEST PUSH2 0x1140 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x113A SWAP1 DUP5 SWAP1 PUSH2 0x2064 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x1186 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x11CF SWAP2 SWAP1 PUSH2 0x2033 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9C5 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xEEC JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x12B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x12C6 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x2173 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1341 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1350 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x21DF JUMP JUMPDEST PUSH2 0x1359 SWAP2 PUSH2 0x2209 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x136C DUP4 DUP10 PUSH2 0x1609 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1379 DUP12 PUSH2 0x1B13 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1414 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x14BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1579 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1B42 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x9C5 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1597 SWAP2 SWAP1 PUSH2 0x2251 JUMP JUMPDEST PUSH2 0x9C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE DUP2 SLOAD DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP5 ADD SLOAD SWAP6 DUP7 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP5 DIV PUSH1 0xFF AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 SWAP2 PUSH2 0x16E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 ADD MLOAD PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP4 SWAP3 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17C7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17EB SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1868 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x188C SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1968 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x198C SWAP2 SWAP1 PUSH2 0x2273 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1A0E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1A32 SWAP2 SWAP1 PUSH2 0x2273 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x1A44 DUP4 PUSH1 0xA PUSH2 0x23B0 JUMP JUMPDEST PUSH2 0x1A4E SWAP1 DUP6 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A59 DUP4 PUSH1 0xA PUSH2 0x23B0 JUMP JUMPDEST PUSH2 0x1A63 DUP8 DUP13 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A6D SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A77 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD SWAP1 SWAP2 POP PUSH2 0x1ADF SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x23BC JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH2 0x1AEF SWAP1 PUSH1 0xA PUSH2 0x23BC JUMP JUMPDEST PUSH2 0x1AF9 SWAP1 DUP4 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1B03 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST SWAP8 POP POP POP POP POP POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1B2E JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1B3A DUP3 BASEFEE DUP4 ADD PUSH2 0x1B51 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1B3A DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B60 JUMPI DUP2 PUSH2 0x1B62 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1BE1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1C0A SWAP2 SWAP1 PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C47 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C4C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1C5D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1C68 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1CE4 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1CDD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1CDD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST POP DUP2 PUSH2 0x1B3A JUMP JUMPDEST PUSH2 0x1B3A DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1CF9 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6EF SWAP2 SWAP1 PUSH2 0x23E7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1B62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xE05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D8B DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x1D9B DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x1DAB DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x1DBB DUP2 PUSH2 0x1D5B JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1DD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1DE4 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1E07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1E12 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1E22 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E51 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1E61 DUP2 PUSH2 0x1D39 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B62 DUP2 PUSH2 0x1D39 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1E9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1EAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1ECB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1EDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1F00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F87 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F6F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x9F2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1FB0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F6C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1FF5 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1F98 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2046 JUMPI PUSH2 0x2046 PUSH2 0x2004 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x205D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x2076 JUMPI PUSH2 0x2076 PUSH2 0x2004 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x209E DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x20AE DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x2104 JUMPI PUSH2 0x2104 PUSH2 0x2004 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x213F JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x21A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x21C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x21D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x21EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x21FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x2249 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1B62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1B62 DUP2 PUSH2 0x1D5B JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x22E9 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x22CF JUMPI PUSH2 0x22CF PUSH2 0x2004 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x22DC JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x2295 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2300 JUMPI POP PUSH1 0x1 PUSH2 0x1B0D JUMP JUMPDEST DUP2 PUSH2 0x230D JUMPI POP PUSH1 0x0 PUSH2 0x1B0D JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x2323 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x232D JUMPI PUSH2 0x2349 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x1B0D JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x233E JUMPI PUSH2 0x233E PUSH2 0x2004 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x1B0D JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x236C JUMPI POP DUP2 DUP2 EXP PUSH2 0x1B0D JUMP JUMPDEST PUSH2 0x2376 DUP4 DUP4 PUSH2 0x2290 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x23A8 JUMPI PUSH2 0x23A8 PUSH2 0x2004 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B62 DUP4 DUP4 PUSH2 0x22F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B62 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x22F1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x23DD DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1F6C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1B62 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1F98 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 SWAP13 0xAB PUSH2 0x3294 0xAE 0xEF PUSH17 0x47A8205015D7B3471FA40B68142B67434D PUSH2 0xF707 SMOD 0xBB 0xE7 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"1483:8121:65:-:0;;;2341:393;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2419:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;2450:29:65;::::1;2442:80;;;::::0;-1:-1:-1;;;2442:80:65;;822:2:111;2442:80:65::1;::::0;::::1;804:21:111::0;861:2;841:18;;;834:30;900:34;880:18;;;873:62;-1:-1:-1;;;951:18:111;;;944:36;997:19;;2442:80:65::1;;;;;;;;2604:20;4751:10:::0;4739:23;;;;:11;:23;;;;;4765:12;4739:38;;4692:92;2604:20:::1;2685:42;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;2685:42:65;;::::1;::::0;;1994::::1;2685;::::0;;::::1;::::0;;;2724:2:::1;2685:42:::0;;;;;;-1:-1:-1;2667:15:65;;;;:7:::1;:15:::0;;:60;;:15;:60;;;;::::1;-1:-1:-1::0;;;;;;2667:60:65;;::::1;::::0;;;::::1;::::0;;;;;;;;2685:42:::1;2667:60;-1:-1:-1::0;;;2667:60:65::1;-1:-1:-1::0;;;;;;2667:60:65;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;1483:8121:65;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:452::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;392:9;386:16;411:44;449:5;411:44;:::i;:::-;524:2;509:18;;503:25;474:5;;-1:-1:-1;537:46:111;503:25;537:46;:::i;:::-;602:7;592:17;;;163:452;;;;;:::o;620:402::-;1483:8121:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_11191":{"entryPoint":null,"id":11191,"parameterSlots":0,"returnSlots":0},"@L2_ETH_11203":{"entryPoint":null,"id":11203,"parameterSlots":0,"returnSlots":0},"@L2_ETH_ADDRESS_11197":{"entryPoint":null,"id":11197,"parameterSlots":0,"returnSlots":0},"@QUOTE_USD_11194":{"entryPoint":null,"id":11194,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":5399,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":3627,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_11778":{"entryPoint":4200,"id":11778,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":4067,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":3950,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_11691":{"entryPoint":4662,"id":11691,"parameterSlots":3,"returnSlots":2},"@addDepositFor_11356":{"entryPoint":2190,"id":11356,"parameterSlots":3,"returnSlots":0},"@addStake_7469":{"entryPoint":1456,"id":7469,"parameterSlots":1,"returnSlots":0},"@addToken_11305":{"entryPoint":1634,"id":11305,"parameterSlots":4,"returnSlots":0},"@balances_11225":{"entryPoint":null,"id":11225,"parameterSlots":0,"returnSlots":0},"@depositInfo_11384":{"entryPoint":null,"id":11384,"parameterSlots":2,"returnSlots":2},"@deposit_7433":{"entryPoint":3299,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":7017,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":6978,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPrice_11050":{"entryPoint":6931,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":2856,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEth_11583":{"entryPoint":5641,"id":11583,"parameterSlots":2,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_11409":{"entryPoint":null,"id":11409,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":6993,"id":11162,"parameterSlots":2,"returnSlots":1},"@oracles_11218":{"entryPoint":null,"id":11218,"parameterSlots":0,"returnSlots":0},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":2526,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":2506,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":3730,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":4576,"id":4512,"parameterSlots":3,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":3435,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_11229":{"entryPoint":null,"id":11229,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":2552,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_11397":{"entryPoint":null,"id":11397,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":3592,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":7272,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":2684,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":2038,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_11455":{"entryPoint":3038,"id":11455,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":7788,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":8315,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7622,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":8785,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419t_address":{"entryPoint":7731,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256":{"entryPoint":7666,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8":{"entryPoint":7530,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":7817,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_int256_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7960,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8267,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":7443,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint8_fromMemory":{"entryPoint":8819,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":8088,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":9163,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":8162,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":9191,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8563,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":8671,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":8243,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":8457,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":8848,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":9136,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":9148,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":8945,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":8396,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":8292,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":8713,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":8044,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":8196,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":8516,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_contract_IERC20":{"entryPoint":7481,"id":null,"parameterSlots":1,"returnSlots":0},"validator_revert_uint8":{"entryPoint":7515,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:20852:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_contract_IERC20","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"505:71:111","statements":[{"body":{"nodeType":"YulBlock","src":"554:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"563:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"566:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"556:6:111"},"nodeType":"YulFunctionCall","src":"556:12:111"},"nodeType":"YulExpressionStatement","src":"556:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"528:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"539:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"546:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"535:3:111"},"nodeType":"YulFunctionCall","src":"535:16:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"525:2:111"},"nodeType":"YulFunctionCall","src":"525:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"518:6:111"},"nodeType":"YulFunctionCall","src":"518:35:111"},"nodeType":"YulIf","src":"515:55:111"}]},"name":"validator_revert_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"494:5:111","type":""}],"src":"462:114:111"},{"body":{"nodeType":"YulBlock","src":"735:572:111","statements":[{"body":{"nodeType":"YulBlock","src":"782:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"791:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"794:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"784:6:111"},"nodeType":"YulFunctionCall","src":"784:12:111"},"nodeType":"YulExpressionStatement","src":"784:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"756:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"765:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"752:3:111"},"nodeType":"YulFunctionCall","src":"752:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"777:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"748:3:111"},"nodeType":"YulFunctionCall","src":"748:33:111"},"nodeType":"YulIf","src":"745:53:111"},{"nodeType":"YulVariableDeclaration","src":"807:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"833:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"820:12:111"},"nodeType":"YulFunctionCall","src":"820:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"811:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"852:32:111"},"nodeType":"YulFunctionCall","src":"852:39:111"},"nodeType":"YulExpressionStatement","src":"852:39:111"},{"nodeType":"YulAssignment","src":"900:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"910:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"900:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"924:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"956:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"967:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"952:3:111"},"nodeType":"YulFunctionCall","src":"952:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"939:12:111"},"nodeType":"YulFunctionCall","src":"939:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"928:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1013:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"980:32:111"},"nodeType":"YulFunctionCall","src":"980:41:111"},"nodeType":"YulExpressionStatement","src":"980:41:111"},{"nodeType":"YulAssignment","src":"1030:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1040:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1030:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1056:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1088:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1099:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1084:3:111"},"nodeType":"YulFunctionCall","src":"1084:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1071:12:111"},"nodeType":"YulFunctionCall","src":"1071:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1060:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1145:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"1112:32:111"},"nodeType":"YulFunctionCall","src":"1112:41:111"},"nodeType":"YulExpressionStatement","src":"1112:41:111"},{"nodeType":"YulAssignment","src":"1162:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1172:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1162:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1188:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1231:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1216:3:111"},"nodeType":"YulFunctionCall","src":"1216:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1203:12:111"},"nodeType":"YulFunctionCall","src":"1203:32:111"},"variables":[{"name":"value_3","nodeType":"YulTypedName","src":"1192:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_3","nodeType":"YulIdentifier","src":"1267:7:111"}],"functionName":{"name":"validator_revert_uint8","nodeType":"YulIdentifier","src":"1244:22:111"},"nodeType":"YulFunctionCall","src":"1244:31:111"},"nodeType":"YulExpressionStatement","src":"1244:31:111"},{"nodeType":"YulAssignment","src":"1284:17:111","value":{"name":"value_3","nodeType":"YulIdentifier","src":"1294:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1284:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"677:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"688:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"700:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"708:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"716:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"724:6:111","type":""}],"src":"581:726:111"},{"body":{"nodeType":"YulBlock","src":"1407:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"1453:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1462:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1465:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1455:6:111"},"nodeType":"YulFunctionCall","src":"1455:12:111"},"nodeType":"YulExpressionStatement","src":"1455:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1428:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1437:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1424:3:111"},"nodeType":"YulFunctionCall","src":"1424:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1449:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1420:3:111"},"nodeType":"YulFunctionCall","src":"1420:32:111"},"nodeType":"YulIf","src":"1417:52:111"},{"nodeType":"YulVariableDeclaration","src":"1478:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1504:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1491:12:111"},"nodeType":"YulFunctionCall","src":"1491:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1482:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1556:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"1523:32:111"},"nodeType":"YulFunctionCall","src":"1523:39:111"},"nodeType":"YulExpressionStatement","src":"1523:39:111"},{"nodeType":"YulAssignment","src":"1571:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1581:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1571:6:111"}]},{"nodeType":"YulAssignment","src":"1595:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1622:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1633:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1618:3:111"},"nodeType":"YulFunctionCall","src":"1618:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1605:12:111"},"nodeType":"YulFunctionCall","src":"1605:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1595:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1365:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1376:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1388:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1396:6:111","type":""}],"src":"1312:331:111"},{"body":{"nodeType":"YulBlock","src":"1749:125:111","statements":[{"nodeType":"YulAssignment","src":"1759:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1771:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1782:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1767:3:111"},"nodeType":"YulFunctionCall","src":"1767:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1759:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1801:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1816:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1824:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1812:3:111"},"nodeType":"YulFunctionCall","src":"1812:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1794:6:111"},"nodeType":"YulFunctionCall","src":"1794:74:111"},"nodeType":"YulExpressionStatement","src":"1794:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1718:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1729:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1740:4:111","type":""}],"src":"1648:226:111"},{"body":{"nodeType":"YulBlock","src":"1995:125:111","statements":[{"nodeType":"YulAssignment","src":"2005:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2017:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2028:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2013:3:111"},"nodeType":"YulFunctionCall","src":"2013:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2005:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2047:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2062:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2070:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2058:3:111"},"nodeType":"YulFunctionCall","src":"2058:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2040:6:111"},"nodeType":"YulFunctionCall","src":"2040:74:111"},"nodeType":"YulExpressionStatement","src":"2040:74:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1964:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1975:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1986:4:111","type":""}],"src":"1879:241:111"},{"body":{"nodeType":"YulBlock","src":"2244:368:111","statements":[{"body":{"nodeType":"YulBlock","src":"2290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2292:6:111"},"nodeType":"YulFunctionCall","src":"2292:12:111"},"nodeType":"YulExpressionStatement","src":"2292:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2265:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2274:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2261:3:111"},"nodeType":"YulFunctionCall","src":"2261:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2286:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2257:3:111"},"nodeType":"YulFunctionCall","src":"2257:32:111"},"nodeType":"YulIf","src":"2254:52:111"},{"nodeType":"YulVariableDeclaration","src":"2315:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2341:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2328:12:111"},"nodeType":"YulFunctionCall","src":"2328:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2319:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2393:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2360:32:111"},"nodeType":"YulFunctionCall","src":"2360:39:111"},"nodeType":"YulExpressionStatement","src":"2360:39:111"},{"nodeType":"YulAssignment","src":"2408:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2418:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2408:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2432:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2475:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2460:3:111"},"nodeType":"YulFunctionCall","src":"2460:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2447:12:111"},"nodeType":"YulFunctionCall","src":"2447:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2436:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2521:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2488:32:111"},"nodeType":"YulFunctionCall","src":"2488:41:111"},"nodeType":"YulExpressionStatement","src":"2488:41:111"},{"nodeType":"YulAssignment","src":"2538:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2548:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2538:6:111"}]},{"nodeType":"YulAssignment","src":"2564:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2591:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2602:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2587:3:111"},"nodeType":"YulFunctionCall","src":"2587:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2574:12:111"},"nodeType":"YulFunctionCall","src":"2574:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2564:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2194:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2205:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2217:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2225:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2233:6:111","type":""}],"src":"2125:487:111"},{"body":{"nodeType":"YulBlock","src":"2719:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"2765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2767:6:111"},"nodeType":"YulFunctionCall","src":"2767:12:111"},"nodeType":"YulExpressionStatement","src":"2767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2740:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2749:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2736:3:111"},"nodeType":"YulFunctionCall","src":"2736:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2761:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:32:111"},"nodeType":"YulIf","src":"2729:52:111"},{"nodeType":"YulVariableDeclaration","src":"2790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2803:12:111"},"nodeType":"YulFunctionCall","src":"2803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2868:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2835:32:111"},"nodeType":"YulFunctionCall","src":"2835:39:111"},"nodeType":"YulExpressionStatement","src":"2835:39:111"},{"nodeType":"YulAssignment","src":"2883:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2893:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2883:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2907:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2939:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2950:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2935:3:111"},"nodeType":"YulFunctionCall","src":"2935:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2922:12:111"},"nodeType":"YulFunctionCall","src":"2922:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2911:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2996:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2963:32:111"},"nodeType":"YulFunctionCall","src":"2963:41:111"},"nodeType":"YulExpressionStatement","src":"2963:41:111"},{"nodeType":"YulAssignment","src":"3013:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"3023:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3013:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2677:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2688:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2700:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2708:6:111","type":""}],"src":"2617:419:111"},{"body":{"nodeType":"YulBlock","src":"3170:119:111","statements":[{"nodeType":"YulAssignment","src":"3180:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3192:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3203:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3188:3:111"},"nodeType":"YulFunctionCall","src":"3188:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3180:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3222:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3233:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3215:6:111"},"nodeType":"YulFunctionCall","src":"3215:25:111"},"nodeType":"YulExpressionStatement","src":"3215:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3260:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3271:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3256:3:111"},"nodeType":"YulFunctionCall","src":"3256:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"3276:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3249:6:111"},"nodeType":"YulFunctionCall","src":"3249:34:111"},"nodeType":"YulExpressionStatement","src":"3249:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3131:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3142:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3150:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3161:4:111","type":""}],"src":"3041:248:111"},{"body":{"nodeType":"YulBlock","src":"3364:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3410:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3419:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3422:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3412:6:111"},"nodeType":"YulFunctionCall","src":"3412:12:111"},"nodeType":"YulExpressionStatement","src":"3412:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3385:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3394:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3381:3:111"},"nodeType":"YulFunctionCall","src":"3381:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3406:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3377:3:111"},"nodeType":"YulFunctionCall","src":"3377:32:111"},"nodeType":"YulIf","src":"3374:52:111"},{"nodeType":"YulVariableDeclaration","src":"3435:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3461:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3448:12:111"},"nodeType":"YulFunctionCall","src":"3448:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3439:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3513:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"3480:32:111"},"nodeType":"YulFunctionCall","src":"3480:39:111"},"nodeType":"YulExpressionStatement","src":"3480:39:111"},{"nodeType":"YulAssignment","src":"3528:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3538:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3528:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3330:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3341:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3353:6:111","type":""}],"src":"3294:255:111"},{"body":{"nodeType":"YulBlock","src":"3655:76:111","statements":[{"nodeType":"YulAssignment","src":"3665:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3677:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3688:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3673:3:111"},"nodeType":"YulFunctionCall","src":"3673:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3665:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3707:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3718:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3700:6:111"},"nodeType":"YulFunctionCall","src":"3700:25:111"},"nodeType":"YulExpressionStatement","src":"3700:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3624:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3635:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3646:4:111","type":""}],"src":"3554:177:111"},{"body":{"nodeType":"YulBlock","src":"3875:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"3921:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3930:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3933:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3923:6:111"},"nodeType":"YulFunctionCall","src":"3923:12:111"},"nodeType":"YulExpressionStatement","src":"3923:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3896:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3905:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3892:3:111"},"nodeType":"YulFunctionCall","src":"3892:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3917:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3888:3:111"},"nodeType":"YulFunctionCall","src":"3888:32:111"},"nodeType":"YulIf","src":"3885:52:111"},{"nodeType":"YulVariableDeclaration","src":"3946:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3972:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3959:12:111"},"nodeType":"YulFunctionCall","src":"3959:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3950:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4015:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4024:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4027:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4017:6:111"},"nodeType":"YulFunctionCall","src":"4017:12:111"},"nodeType":"YulExpressionStatement","src":"4017:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4004:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4011:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4001:2:111"},"nodeType":"YulFunctionCall","src":"4001:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3994:6:111"},"nodeType":"YulFunctionCall","src":"3994:20:111"},"nodeType":"YulIf","src":"3991:40:111"},{"nodeType":"YulAssignment","src":"4040:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4050:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4040:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4064:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4095:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4106:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4091:3:111"},"nodeType":"YulFunctionCall","src":"4091:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4078:12:111"},"nodeType":"YulFunctionCall","src":"4078:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4068:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4119:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4129:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4123:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4174:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4183:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4186:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4176:6:111"},"nodeType":"YulFunctionCall","src":"4176:12:111"},"nodeType":"YulExpressionStatement","src":"4176:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4162:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4170:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4159:2:111"},"nodeType":"YulFunctionCall","src":"4159:14:111"},"nodeType":"YulIf","src":"4156:34:111"},{"nodeType":"YulVariableDeclaration","src":"4199:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4213:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4224:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4209:3:111"},"nodeType":"YulFunctionCall","src":"4209:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"4203:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4281:6:111"},"nodeType":"YulFunctionCall","src":"4281:12:111"},"nodeType":"YulExpressionStatement","src":"4281:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4258:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4262:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4254:3:111"},"nodeType":"YulFunctionCall","src":"4254:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4269:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4250:3:111"},"nodeType":"YulFunctionCall","src":"4250:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4243:6:111"},"nodeType":"YulFunctionCall","src":"4243:35:111"},"nodeType":"YulIf","src":"4240:55:111"},{"nodeType":"YulVariableDeclaration","src":"4304:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4331:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4318:12:111"},"nodeType":"YulFunctionCall","src":"4318:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"4308:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4361:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4370:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4373:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4363:6:111"},"nodeType":"YulFunctionCall","src":"4363:12:111"},"nodeType":"YulExpressionStatement","src":"4363:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"4349:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4357:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4346:2:111"},"nodeType":"YulFunctionCall","src":"4346:14:111"},"nodeType":"YulIf","src":"4343:34:111"},{"body":{"nodeType":"YulBlock","src":"4427:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4436:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4439:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4429:6:111"},"nodeType":"YulFunctionCall","src":"4429:12:111"},"nodeType":"YulExpressionStatement","src":"4429:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4400:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"4404:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4396:3:111"},"nodeType":"YulFunctionCall","src":"4396:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"4413:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4392:3:111"},"nodeType":"YulFunctionCall","src":"4392:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4418:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4389:2:111"},"nodeType":"YulFunctionCall","src":"4389:37:111"},"nodeType":"YulIf","src":"4386:57:111"},{"nodeType":"YulAssignment","src":"4452:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4466:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4470:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4462:3:111"},"nodeType":"YulFunctionCall","src":"4462:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4452:6:111"}]},{"nodeType":"YulAssignment","src":"4482:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"4492:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4482:6:111"}]},{"nodeType":"YulAssignment","src":"4507:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4534:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4545:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4530:3:111"},"nodeType":"YulFunctionCall","src":"4530:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4517:12:111"},"nodeType":"YulFunctionCall","src":"4517:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4507:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3817:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3828:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3840:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3848:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3856:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3864:6:111","type":""}],"src":"3736:819:111"},{"body":{"nodeType":"YulBlock","src":"4645:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"4691:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4700:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4703:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4693:6:111"},"nodeType":"YulFunctionCall","src":"4693:12:111"},"nodeType":"YulExpressionStatement","src":"4693:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4666:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4675:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4662:3:111"},"nodeType":"YulFunctionCall","src":"4662:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4687:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4658:3:111"},"nodeType":"YulFunctionCall","src":"4658:32:111"},"nodeType":"YulIf","src":"4655:52:111"},{"nodeType":"YulVariableDeclaration","src":"4716:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4742:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4729:12:111"},"nodeType":"YulFunctionCall","src":"4729:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4720:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4794:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"4761:32:111"},"nodeType":"YulFunctionCall","src":"4761:39:111"},"nodeType":"YulExpressionStatement","src":"4761:39:111"},{"nodeType":"YulAssignment","src":"4809:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4819:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4809:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4611:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4622:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4634:6:111","type":""}],"src":"4560:270:111"},{"body":{"nodeType":"YulBlock","src":"5008:252:111","statements":[{"nodeType":"YulAssignment","src":"5018:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5030:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5041:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5026:3:111"},"nodeType":"YulFunctionCall","src":"5026:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5018:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"5053:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5063:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5057:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5121:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5136:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5144:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5132:3:111"},"nodeType":"YulFunctionCall","src":"5132:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5114:6:111"},"nodeType":"YulFunctionCall","src":"5114:34:111"},"nodeType":"YulExpressionStatement","src":"5114:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5179:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5164:3:111"},"nodeType":"YulFunctionCall","src":"5164:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"5188:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5196:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5184:3:111"},"nodeType":"YulFunctionCall","src":"5184:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5157:6:111"},"nodeType":"YulFunctionCall","src":"5157:43:111"},"nodeType":"YulExpressionStatement","src":"5157:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5231:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5216:3:111"},"nodeType":"YulFunctionCall","src":"5216:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"5240:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5248:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5236:3:111"},"nodeType":"YulFunctionCall","src":"5236:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5209:6:111"},"nodeType":"YulFunctionCall","src":"5209:45:111"},"nodeType":"YulExpressionStatement","src":"5209:45:111"}]},"name":"abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4961:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4972:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4980:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4988:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4999:4:111","type":""}],"src":"4835:425:111"},{"body":{"nodeType":"YulBlock","src":"5387:125:111","statements":[{"nodeType":"YulAssignment","src":"5397:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5409:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5420:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5405:3:111"},"nodeType":"YulFunctionCall","src":"5405:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5397:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5439:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5454:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5462:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5450:3:111"},"nodeType":"YulFunctionCall","src":"5450:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5432:6:111"},"nodeType":"YulFunctionCall","src":"5432:74:111"},"nodeType":"YulExpressionStatement","src":"5432:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5356:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5367:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5378:4:111","type":""}],"src":"5265:247:111"},{"body":{"nodeType":"YulBlock","src":"5595:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5641:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5650:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5653:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5643:6:111"},"nodeType":"YulFunctionCall","src":"5643:12:111"},"nodeType":"YulExpressionStatement","src":"5643:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5616:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5625:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5612:3:111"},"nodeType":"YulFunctionCall","src":"5612:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5637:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5608:3:111"},"nodeType":"YulFunctionCall","src":"5608:32:111"},"nodeType":"YulIf","src":"5605:52:111"},{"nodeType":"YulVariableDeclaration","src":"5666:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5692:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5679:12:111"},"nodeType":"YulFunctionCall","src":"5679:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5670:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5744:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"5711:32:111"},"nodeType":"YulFunctionCall","src":"5711:39:111"},"nodeType":"YulExpressionStatement","src":"5711:39:111"},{"nodeType":"YulAssignment","src":"5759:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5769:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5759:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5561:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5572:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5584:6:111","type":""}],"src":"5517:263:111"},{"body":{"nodeType":"YulBlock","src":"5923:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5969:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5978:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5981:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5971:6:111"},"nodeType":"YulFunctionCall","src":"5971:12:111"},"nodeType":"YulExpressionStatement","src":"5971:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5944:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5953:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5940:3:111"},"nodeType":"YulFunctionCall","src":"5940:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5965:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5936:3:111"},"nodeType":"YulFunctionCall","src":"5936:32:111"},"nodeType":"YulIf","src":"5933:52:111"},{"nodeType":"YulVariableDeclaration","src":"5994:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6021:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6008:12:111"},"nodeType":"YulFunctionCall","src":"6008:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5998:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6074:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6083:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6086:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6076:6:111"},"nodeType":"YulFunctionCall","src":"6076:12:111"},"nodeType":"YulExpressionStatement","src":"6076:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6046:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6054:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6043:2:111"},"nodeType":"YulFunctionCall","src":"6043:30:111"},"nodeType":"YulIf","src":"6040:50:111"},{"nodeType":"YulVariableDeclaration","src":"6099:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6113:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6124:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6109:3:111"},"nodeType":"YulFunctionCall","src":"6109:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6103:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6170:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6179:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6182:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6172:6:111"},"nodeType":"YulFunctionCall","src":"6172:12:111"},"nodeType":"YulExpressionStatement","src":"6172:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6151:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6160:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6147:3:111"},"nodeType":"YulFunctionCall","src":"6147:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6165:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6143:3:111"},"nodeType":"YulFunctionCall","src":"6143:26:111"},"nodeType":"YulIf","src":"6140:46:111"},{"nodeType":"YulAssignment","src":"6195:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"6205:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6195:6:111"}]},{"nodeType":"YulAssignment","src":"6216:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6243:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6254:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6239:3:111"},"nodeType":"YulFunctionCall","src":"6239:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6226:12:111"},"nodeType":"YulFunctionCall","src":"6226:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6216:6:111"}]},{"nodeType":"YulAssignment","src":"6267:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6294:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6305:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6290:3:111"},"nodeType":"YulFunctionCall","src":"6290:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6277:12:111"},"nodeType":"YulFunctionCall","src":"6277:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6267:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5873:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5884:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5896:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5904:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5912:6:111","type":""}],"src":"5785:530:111"},{"body":{"nodeType":"YulBlock","src":"6373:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6383:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6392:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"6387:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6452:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6477:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6482:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6473:3:111"},"nodeType":"YulFunctionCall","src":"6473:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6496:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6501:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6492:3:111"},"nodeType":"YulFunctionCall","src":"6492:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6486:5:111"},"nodeType":"YulFunctionCall","src":"6486:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6466:6:111"},"nodeType":"YulFunctionCall","src":"6466:39:111"},"nodeType":"YulExpressionStatement","src":"6466:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6413:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6416:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6410:2:111"},"nodeType":"YulFunctionCall","src":"6410:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6424:19:111","statements":[{"nodeType":"YulAssignment","src":"6426:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6435:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6438:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6431:3:111"},"nodeType":"YulFunctionCall","src":"6431:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"6426:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6406:3:111","statements":[]},"src":"6402:113:111"},{"body":{"nodeType":"YulBlock","src":"6541:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6554:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"6559:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6550:3:111"},"nodeType":"YulFunctionCall","src":"6550:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6568:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6543:6:111"},"nodeType":"YulFunctionCall","src":"6543:27:111"},"nodeType":"YulExpressionStatement","src":"6543:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6530:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6533:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6527:2:111"},"nodeType":"YulFunctionCall","src":"6527:13:111"},"nodeType":"YulIf","src":"6524:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"6351:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"6356:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6361:6:111","type":""}],"src":"6320:258:111"},{"body":{"nodeType":"YulBlock","src":"6632:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6642:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6662:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6656:5:111"},"nodeType":"YulFunctionCall","src":"6656:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"6646:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6684:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"6689:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6677:6:111"},"nodeType":"YulFunctionCall","src":"6677:19:111"},"nodeType":"YulExpressionStatement","src":"6677:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6731:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"6738:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6727:3:111"},"nodeType":"YulFunctionCall","src":"6727:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6749:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"6754:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6745:3:111"},"nodeType":"YulFunctionCall","src":"6745:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"6761:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"6705:21:111"},"nodeType":"YulFunctionCall","src":"6705:63:111"},"nodeType":"YulExpressionStatement","src":"6705:63:111"},{"nodeType":"YulAssignment","src":"6777:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6792:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6805:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6813:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6801:3:111"},"nodeType":"YulFunctionCall","src":"6801:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"6818:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6797:3:111"},"nodeType":"YulFunctionCall","src":"6797:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6788:3:111"},"nodeType":"YulFunctionCall","src":"6788:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"6888:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6784:3:111"},"nodeType":"YulFunctionCall","src":"6784:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"6777:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"6609:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"6616:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"6624:3:111","type":""}],"src":"6583:316:111"},{"body":{"nodeType":"YulBlock","src":"7051:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7068:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7079:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7061:6:111"},"nodeType":"YulFunctionCall","src":"7061:21:111"},"nodeType":"YulExpressionStatement","src":"7061:21:111"},{"nodeType":"YulAssignment","src":"7091:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7116:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7128:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7139:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7124:3:111"},"nodeType":"YulFunctionCall","src":"7124:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"7099:16:111"},"nodeType":"YulFunctionCall","src":"7099:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7091:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7163:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7174:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7159:3:111"},"nodeType":"YulFunctionCall","src":"7159:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7179:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7152:6:111"},"nodeType":"YulFunctionCall","src":"7152:34:111"},"nodeType":"YulExpressionStatement","src":"7152:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7012:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7023:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7031:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7042:4:111","type":""}],"src":"6904:288:111"},{"body":{"nodeType":"YulBlock","src":"7296:93:111","statements":[{"nodeType":"YulAssignment","src":"7306:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7318:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7329:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7314:3:111"},"nodeType":"YulFunctionCall","src":"7314:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7306:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7348:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7363:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7371:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7359:3:111"},"nodeType":"YulFunctionCall","src":"7359:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7341:6:111"},"nodeType":"YulFunctionCall","src":"7341:42:111"},"nodeType":"YulExpressionStatement","src":"7341:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7265:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7276:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7287:4:111","type":""}],"src":"7197:192:111"},{"body":{"nodeType":"YulBlock","src":"7568:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7585:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7596:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7578:6:111"},"nodeType":"YulFunctionCall","src":"7578:21:111"},"nodeType":"YulExpressionStatement","src":"7578:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7619:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7630:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7615:3:111"},"nodeType":"YulFunctionCall","src":"7615:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7635:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7608:6:111"},"nodeType":"YulFunctionCall","src":"7608:30:111"},"nodeType":"YulExpressionStatement","src":"7608:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7669:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7654:3:111"},"nodeType":"YulFunctionCall","src":"7654:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e636f727265637420746f6b65","kind":"string","nodeType":"YulLiteral","src":"7674:34:111","type":"","value":"DepositPaymaster: Incorrect toke"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7647:6:111"},"nodeType":"YulFunctionCall","src":"7647:62:111"},"nodeType":"YulExpressionStatement","src":"7647:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7729:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7740:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7725:3:111"},"nodeType":"YulFunctionCall","src":"7725:18:111"},{"hexValue":"6e206f7261636c65","kind":"string","nodeType":"YulLiteral","src":"7745:10:111","type":"","value":"n oracle"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7718:6:111"},"nodeType":"YulFunctionCall","src":"7718:38:111"},"nodeType":"YulExpressionStatement","src":"7718:38:111"},{"nodeType":"YulAssignment","src":"7765:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7777:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7788:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7773:3:111"},"nodeType":"YulFunctionCall","src":"7773:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7765:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7545:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7559:4:111","type":""}],"src":"7394:404:111"},{"body":{"nodeType":"YulBlock","src":"7948:168:111","statements":[{"nodeType":"YulAssignment","src":"7958:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7970:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7981:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7966:3:111"},"nodeType":"YulFunctionCall","src":"7966:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7958:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8000:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8015:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8023:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8011:3:111"},"nodeType":"YulFunctionCall","src":"8011:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7993:6:111"},"nodeType":"YulFunctionCall","src":"7993:74:111"},"nodeType":"YulExpressionStatement","src":"7993:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8087:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8098:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8083:3:111"},"nodeType":"YulFunctionCall","src":"8083:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"8103:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8076:6:111"},"nodeType":"YulFunctionCall","src":"8076:34:111"},"nodeType":"YulExpressionStatement","src":"8076:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7909:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7920:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7928:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7939:4:111","type":""}],"src":"7803:313:111"},{"body":{"nodeType":"YulBlock","src":"8295:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8312:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8323:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8305:6:111"},"nodeType":"YulFunctionCall","src":"8305:21:111"},"nodeType":"YulExpressionStatement","src":"8305:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8346:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8357:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8342:3:111"},"nodeType":"YulFunctionCall","src":"8342:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8362:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8335:6:111"},"nodeType":"YulFunctionCall","src":"8335:30:111"},"nodeType":"YulExpressionStatement","src":"8335:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8385:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8396:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8381:3:111"},"nodeType":"YulFunctionCall","src":"8381:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f","kind":"string","nodeType":"YulLiteral","src":"8401:34:111","type":"","value":"DepositPaymaster: unsupported to"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8374:6:111"},"nodeType":"YulFunctionCall","src":"8374:62:111"},"nodeType":"YulExpressionStatement","src":"8374:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8456:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8467:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8452:3:111"},"nodeType":"YulFunctionCall","src":"8452:18:111"},{"hexValue":"6b656e","kind":"string","nodeType":"YulLiteral","src":"8472:5:111","type":"","value":"ken"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8445:6:111"},"nodeType":"YulFunctionCall","src":"8445:33:111"},"nodeType":"YulExpressionStatement","src":"8445:33:111"},{"nodeType":"YulAssignment","src":"8487:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8499:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8510:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8495:3:111"},"nodeType":"YulFunctionCall","src":"8495:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8487:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8272:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8286:4:111","type":""}],"src":"8121:399:111"},{"body":{"nodeType":"YulBlock","src":"8557:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8574:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8577:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8567:6:111"},"nodeType":"YulFunctionCall","src":"8567:88:111"},"nodeType":"YulExpressionStatement","src":"8567:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8671:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"8674:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8664:6:111"},"nodeType":"YulFunctionCall","src":"8664:15:111"},"nodeType":"YulExpressionStatement","src":"8664:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8695:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8698:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8688:6:111"},"nodeType":"YulFunctionCall","src":"8688:15:111"},"nodeType":"YulExpressionStatement","src":"8688:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"8525:184:111"},{"body":{"nodeType":"YulBlock","src":"8762:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"8789:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"8791:16:111"},"nodeType":"YulFunctionCall","src":"8791:18:111"},"nodeType":"YulExpressionStatement","src":"8791:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8778:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"8785:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"8781:3:111"},"nodeType":"YulFunctionCall","src":"8781:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8775:2:111"},"nodeType":"YulFunctionCall","src":"8775:13:111"},"nodeType":"YulIf","src":"8772:39:111"},{"nodeType":"YulAssignment","src":"8820:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8831:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"8834:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8827:3:111"},"nodeType":"YulFunctionCall","src":"8827:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"8820:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"8745:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"8748:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"8754:3:111","type":""}],"src":"8714:128:111"},{"body":{"nodeType":"YulBlock","src":"8964:125:111","statements":[{"nodeType":"YulAssignment","src":"8974:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8986:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8997:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8982:3:111"},"nodeType":"YulFunctionCall","src":"8982:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8974:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9016:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9031:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9039:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9027:3:111"},"nodeType":"YulFunctionCall","src":"9027:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9009:6:111"},"nodeType":"YulFunctionCall","src":"9009:74:111"},"nodeType":"YulExpressionStatement","src":"9009:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8933:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8944:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8955:4:111","type":""}],"src":"8847:242:111"},{"body":{"nodeType":"YulBlock","src":"9175:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"9221:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9230:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9233:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9223:6:111"},"nodeType":"YulFunctionCall","src":"9223:12:111"},"nodeType":"YulExpressionStatement","src":"9223:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9196:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9205:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9192:3:111"},"nodeType":"YulFunctionCall","src":"9192:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9217:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9188:3:111"},"nodeType":"YulFunctionCall","src":"9188:32:111"},"nodeType":"YulIf","src":"9185:52:111"},{"nodeType":"YulAssignment","src":"9246:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9262:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9256:5:111"},"nodeType":"YulFunctionCall","src":"9256:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9246:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9141:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9152:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9164:6:111","type":""}],"src":"9094:184:111"},{"body":{"nodeType":"YulBlock","src":"9457:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9474:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9485:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9467:6:111"},"nodeType":"YulFunctionCall","src":"9467:21:111"},"nodeType":"YulExpressionStatement","src":"9467:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9508:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9519:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9504:3:111"},"nodeType":"YulFunctionCall","src":"9504:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9524:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9497:6:111"},"nodeType":"YulFunctionCall","src":"9497:30:111"},"nodeType":"YulExpressionStatement","src":"9497:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9547:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9558:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9543:3:111"},"nodeType":"YulFunctionCall","src":"9543:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"9563:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9536:6:111"},"nodeType":"YulFunctionCall","src":"9536:62:111"},"nodeType":"YulExpressionStatement","src":"9536:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9618:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9629:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9614:3:111"},"nodeType":"YulFunctionCall","src":"9614:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"9634:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9607:6:111"},"nodeType":"YulFunctionCall","src":"9607:39:111"},"nodeType":"YulExpressionStatement","src":"9607:39:111"},{"nodeType":"YulAssignment","src":"9655:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9667:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9678:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9663:3:111"},"nodeType":"YulFunctionCall","src":"9663:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9655:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9434:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9448:4:111","type":""}],"src":"9283:405:111"},{"body":{"nodeType":"YulBlock","src":"9742:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"9764:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9766:16:111"},"nodeType":"YulFunctionCall","src":"9766:18:111"},"nodeType":"YulExpressionStatement","src":"9766:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9758:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9761:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"9755:2:111"},"nodeType":"YulFunctionCall","src":"9755:8:111"},"nodeType":"YulIf","src":"9752:34:111"},{"nodeType":"YulAssignment","src":"9795:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9807:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9810:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9803:3:111"},"nodeType":"YulFunctionCall","src":"9803:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"9795:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9724:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9727:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"9733:4:111","type":""}],"src":"9693:125:111"},{"body":{"nodeType":"YulBlock","src":"9997:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10014:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10025:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10007:6:111"},"nodeType":"YulFunctionCall","src":"10007:21:111"},"nodeType":"YulExpressionStatement","src":"10007:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10048:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10059:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10044:3:111"},"nodeType":"YulFunctionCall","src":"10044:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10064:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10037:6:111"},"nodeType":"YulFunctionCall","src":"10037:30:111"},"nodeType":"YulExpressionStatement","src":"10037:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10087:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10098:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10083:3:111"},"nodeType":"YulFunctionCall","src":"10083:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"10103:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10076:6:111"},"nodeType":"YulFunctionCall","src":"10076:62:111"},"nodeType":"YulExpressionStatement","src":"10076:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10158:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10169:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10154:3:111"},"nodeType":"YulFunctionCall","src":"10154:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"10174:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10147:6:111"},"nodeType":"YulFunctionCall","src":"10147:36:111"},"nodeType":"YulExpressionStatement","src":"10147:36:111"},{"nodeType":"YulAssignment","src":"10192:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10204:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10215:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10200:3:111"},"nodeType":"YulFunctionCall","src":"10200:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10192:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9974:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9988:4:111","type":""}],"src":"9823:402:111"},{"body":{"nodeType":"YulBlock","src":"10404:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10421:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10432:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10414:6:111"},"nodeType":"YulFunctionCall","src":"10414:21:111"},"nodeType":"YulExpressionStatement","src":"10414:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10455:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10466:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10451:3:111"},"nodeType":"YulFunctionCall","src":"10451:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10471:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10444:6:111"},"nodeType":"YulFunctionCall","src":"10444:30:111"},"nodeType":"YulExpressionStatement","src":"10444:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10494:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10505:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10490:3:111"},"nodeType":"YulFunctionCall","src":"10490:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"10510:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10483:6:111"},"nodeType":"YulFunctionCall","src":"10483:62:111"},"nodeType":"YulExpressionStatement","src":"10483:62:111"},{"nodeType":"YulAssignment","src":"10554:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10577:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10562:3:111"},"nodeType":"YulFunctionCall","src":"10562:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10554:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10381:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10395:4:111","type":""}],"src":"10230:356:111"},{"body":{"nodeType":"YulBlock","src":"10748:241:111","statements":[{"nodeType":"YulAssignment","src":"10758:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10770:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10781:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10766:3:111"},"nodeType":"YulFunctionCall","src":"10766:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10758:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"10793:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10803:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"10797:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10861:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10876:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10884:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10872:3:111"},"nodeType":"YulFunctionCall","src":"10872:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10854:6:111"},"nodeType":"YulFunctionCall","src":"10854:34:111"},"nodeType":"YulExpressionStatement","src":"10854:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10908:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10919:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10904:3:111"},"nodeType":"YulFunctionCall","src":"10904:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10928:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10936:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10924:3:111"},"nodeType":"YulFunctionCall","src":"10924:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10897:6:111"},"nodeType":"YulFunctionCall","src":"10897:43:111"},"nodeType":"YulExpressionStatement","src":"10897:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10960:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10971:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10956:3:111"},"nodeType":"YulFunctionCall","src":"10956:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"10976:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10949:6:111"},"nodeType":"YulFunctionCall","src":"10949:34:111"},"nodeType":"YulExpressionStatement","src":"10949:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10701:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10712:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10720:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10728:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10739:4:111","type":""}],"src":"10591:398:111"},{"body":{"nodeType":"YulBlock","src":"11168:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11185:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11196:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11178:6:111"},"nodeType":"YulFunctionCall","src":"11178:21:111"},"nodeType":"YulExpressionStatement","src":"11178:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11219:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11230:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11215:3:111"},"nodeType":"YulFunctionCall","src":"11215:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11235:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11208:6:111"},"nodeType":"YulFunctionCall","src":"11208:30:111"},"nodeType":"YulExpressionStatement","src":"11208:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11258:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11269:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11254:3:111"},"nodeType":"YulFunctionCall","src":"11254:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"11274:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11247:6:111"},"nodeType":"YulFunctionCall","src":"11247:51:111"},"nodeType":"YulExpressionStatement","src":"11247:51:111"},{"nodeType":"YulAssignment","src":"11307:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11319:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11330:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11315:3:111"},"nodeType":"YulFunctionCall","src":"11315:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11307:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11145:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11159:4:111","type":""}],"src":"10994:345:111"},{"body":{"nodeType":"YulBlock","src":"11505:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"11552:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11561:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11564:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11554:6:111"},"nodeType":"YulFunctionCall","src":"11554:12:111"},"nodeType":"YulExpressionStatement","src":"11554:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11526:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11535:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11522:3:111"},"nodeType":"YulFunctionCall","src":"11522:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11547:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11518:3:111"},"nodeType":"YulFunctionCall","src":"11518:33:111"},"nodeType":"YulIf","src":"11515:53:111"},{"nodeType":"YulVariableDeclaration","src":"11577:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11603:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11590:12:111"},"nodeType":"YulFunctionCall","src":"11590:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"11581:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11655:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"11622:32:111"},"nodeType":"YulFunctionCall","src":"11622:39:111"},"nodeType":"YulExpressionStatement","src":"11622:39:111"},{"nodeType":"YulAssignment","src":"11670:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"11680:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11670:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11694:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11726:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11737:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11722:3:111"},"nodeType":"YulFunctionCall","src":"11722:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11709:12:111"},"nodeType":"YulFunctionCall","src":"11709:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"11698:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"11783:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"11750:32:111"},"nodeType":"YulFunctionCall","src":"11750:41:111"},"nodeType":"YulExpressionStatement","src":"11750:41:111"},{"nodeType":"YulAssignment","src":"11800:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"11810:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"11800:6:111"}]},{"nodeType":"YulAssignment","src":"11826:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11853:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11864:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11849:3:111"},"nodeType":"YulFunctionCall","src":"11849:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11836:12:111"},"nodeType":"YulFunctionCall","src":"11836:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"11826:6:111"}]},{"nodeType":"YulAssignment","src":"11877:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11904:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11915:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11900:3:111"},"nodeType":"YulFunctionCall","src":"11900:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11887:12:111"},"nodeType":"YulFunctionCall","src":"11887:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"11877:6:111"}]},{"nodeType":"YulAssignment","src":"11928:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11966:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11951:3:111"},"nodeType":"YulFunctionCall","src":"11951:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11938:12:111"},"nodeType":"YulFunctionCall","src":"11938:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"11928:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11439:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11450:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11462:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11470:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11478:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11486:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"11494:6:111","type":""}],"src":"11344:633:111"},{"body":{"nodeType":"YulBlock","src":"12034:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"12153:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"12155:16:111"},"nodeType":"YulFunctionCall","src":"12155:18:111"},"nodeType":"YulExpressionStatement","src":"12155:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"12065:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12058:6:111"},"nodeType":"YulFunctionCall","src":"12058:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12051:6:111"},"nodeType":"YulFunctionCall","src":"12051:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"12073:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12080:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"12148:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"12076:3:111"},"nodeType":"YulFunctionCall","src":"12076:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12070:2:111"},"nodeType":"YulFunctionCall","src":"12070:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12047:3:111"},"nodeType":"YulFunctionCall","src":"12047:105:111"},"nodeType":"YulIf","src":"12044:131:111"},{"nodeType":"YulAssignment","src":"12184:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"12199:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"12202:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"12195:3:111"},"nodeType":"YulFunctionCall","src":"12195:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"12184:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"12013:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"12016:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"12022:7:111","type":""}],"src":"11982:228:111"},{"body":{"nodeType":"YulBlock","src":"12261:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"12292:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12313:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12316:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12306:6:111"},"nodeType":"YulFunctionCall","src":"12306:88:111"},"nodeType":"YulExpressionStatement","src":"12306:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12414:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12417:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12407:6:111"},"nodeType":"YulFunctionCall","src":"12407:15:111"},"nodeType":"YulExpressionStatement","src":"12407:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12442:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12445:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12435:6:111"},"nodeType":"YulFunctionCall","src":"12435:15:111"},"nodeType":"YulExpressionStatement","src":"12435:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"12281:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12274:6:111"},"nodeType":"YulFunctionCall","src":"12274:9:111"},"nodeType":"YulIf","src":"12271:189:111"},{"nodeType":"YulAssignment","src":"12469:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"12478:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"12481:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"12474:3:111"},"nodeType":"YulFunctionCall","src":"12474:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"12469:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"12246:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"12249:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"12255:1:111","type":""}],"src":"12215:274:111"},{"body":{"nodeType":"YulBlock","src":"12526:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12543:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12546:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12536:6:111"},"nodeType":"YulFunctionCall","src":"12536:88:111"},"nodeType":"YulExpressionStatement","src":"12536:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12640:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12643:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12633:6:111"},"nodeType":"YulFunctionCall","src":"12633:15:111"},"nodeType":"YulExpressionStatement","src":"12633:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12664:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12667:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12657:6:111"},"nodeType":"YulFunctionCall","src":"12657:15:111"},"nodeType":"YulExpressionStatement","src":"12657:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"12494:184:111"},{"body":{"nodeType":"YulBlock","src":"12812:168:111","statements":[{"nodeType":"YulAssignment","src":"12822:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12834:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12845:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12830:3:111"},"nodeType":"YulFunctionCall","src":"12830:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12822:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12864:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12879:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12887:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12875:3:111"},"nodeType":"YulFunctionCall","src":"12875:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12857:6:111"},"nodeType":"YulFunctionCall","src":"12857:74:111"},"nodeType":"YulExpressionStatement","src":"12857:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12951:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12962:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12947:3:111"},"nodeType":"YulFunctionCall","src":"12947:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"12967:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12940:6:111"},"nodeType":"YulFunctionCall","src":"12940:34:111"},"nodeType":"YulExpressionStatement","src":"12940:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12773:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12784:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12792:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12803:4:111","type":""}],"src":"12683:297:111"},{"body":{"nodeType":"YulBlock","src":"13159:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13176:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13187:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13169:6:111"},"nodeType":"YulFunctionCall","src":"13169:21:111"},"nodeType":"YulExpressionStatement","src":"13169:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13210:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13221:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13206:3:111"},"nodeType":"YulFunctionCall","src":"13206:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13226:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13199:6:111"},"nodeType":"YulFunctionCall","src":"13199:30:111"},"nodeType":"YulExpressionStatement","src":"13199:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13249:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13260:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13245:3:111"},"nodeType":"YulFunctionCall","src":"13245:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"13265:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13238:6:111"},"nodeType":"YulFunctionCall","src":"13238:62:111"},"nodeType":"YulExpressionStatement","src":"13238:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13320:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13331:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13316:3:111"},"nodeType":"YulFunctionCall","src":"13316:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"13336:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13309:6:111"},"nodeType":"YulFunctionCall","src":"13309:38:111"},"nodeType":"YulExpressionStatement","src":"13309:38:111"},{"nodeType":"YulAssignment","src":"13356:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13368:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13379:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13364:3:111"},"nodeType":"YulFunctionCall","src":"13364:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13356:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13136:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13150:4:111","type":""}],"src":"12985:404:111"},{"body":{"nodeType":"YulBlock","src":"13488:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"13498:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"13537:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13524:12:111"},"nodeType":"YulFunctionCall","src":"13524:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"13502:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"13697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13699:6:111"},"nodeType":"YulFunctionCall","src":"13699:12:111"},"nodeType":"YulExpressionStatement","src":"13699:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"13572:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13600:12:111"},"nodeType":"YulFunctionCall","src":"13600:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"13616:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13596:3:111"},"nodeType":"YulFunctionCall","src":"13596:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"13627:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13592:3:111"},"nodeType":"YulFunctionCall","src":"13592:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13568:3:111"},"nodeType":"YulFunctionCall","src":"13568:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13561:6:111"},"nodeType":"YulFunctionCall","src":"13561:135:111"},"nodeType":"YulIf","src":"13558:155:111"},{"nodeType":"YulVariableDeclaration","src":"13722:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"13740:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"13750:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13736:3:111"},"nodeType":"YulFunctionCall","src":"13736:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"13726:6:111","type":""}]},{"nodeType":"YulAssignment","src":"13778:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"13801:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13788:12:111"},"nodeType":"YulFunctionCall","src":"13788:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"13778:6:111"}]},{"body":{"nodeType":"YulBlock","src":"13851:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13860:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13863:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13853:6:111"},"nodeType":"YulFunctionCall","src":"13853:12:111"},"nodeType":"YulExpressionStatement","src":"13853:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"13823:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13831:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13820:2:111"},"nodeType":"YulFunctionCall","src":"13820:30:111"},"nodeType":"YulIf","src":"13817:50:111"},{"nodeType":"YulAssignment","src":"13876:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"13888:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13896:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13884:3:111"},"nodeType":"YulFunctionCall","src":"13884:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"13876:4:111"}]},{"body":{"nodeType":"YulBlock","src":"13952:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13961:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13964:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13954:6:111"},"nodeType":"YulFunctionCall","src":"13954:12:111"},"nodeType":"YulExpressionStatement","src":"13954:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"13917:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13927:12:111"},"nodeType":"YulFunctionCall","src":"13927:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"13943:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13923:3:111"},"nodeType":"YulFunctionCall","src":"13923:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"13913:3:111"},"nodeType":"YulFunctionCall","src":"13913:38:111"},"nodeType":"YulIf","src":"13910:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"13445:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"13455:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"13471:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"13477:6:111","type":""}],"src":"13394:580:111"},{"body":{"nodeType":"YulBlock","src":"14153:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14170:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14181:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14163:6:111"},"nodeType":"YulFunctionCall","src":"14163:21:111"},"nodeType":"YulExpressionStatement","src":"14163:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14204:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14215:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14200:3:111"},"nodeType":"YulFunctionCall","src":"14200:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14220:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14193:6:111"},"nodeType":"YulFunctionCall","src":"14193:30:111"},"nodeType":"YulExpressionStatement","src":"14193:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14243:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14254:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14239:3:111"},"nodeType":"YulFunctionCall","src":"14239:18:111"},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e644461","kind":"string","nodeType":"YulLiteral","src":"14259:34:111","type":"","value":"DepositPaymaster: paymasterAndDa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14232:6:111"},"nodeType":"YulFunctionCall","src":"14232:62:111"},"nodeType":"YulExpressionStatement","src":"14232:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14314:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14325:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14310:3:111"},"nodeType":"YulFunctionCall","src":"14310:18:111"},{"hexValue":"7461206d757374207370656369667920746f6b656e","kind":"string","nodeType":"YulLiteral","src":"14330:23:111","type":"","value":"ta must specify token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14303:6:111"},"nodeType":"YulFunctionCall","src":"14303:51:111"},"nodeType":"YulExpressionStatement","src":"14303:51:111"},{"nodeType":"YulAssignment","src":"14363:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14375:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14386:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14371:3:111"},"nodeType":"YulFunctionCall","src":"14371:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14363:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14130:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14144:4:111","type":""}],"src":"13979:417:111"},{"body":{"nodeType":"YulBlock","src":"14531:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"14569:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14578:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14581:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14571:6:111"},"nodeType":"YulFunctionCall","src":"14571:12:111"},"nodeType":"YulExpressionStatement","src":"14571:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"14547:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"14559:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14544:2:111"},"nodeType":"YulFunctionCall","src":"14544:24:111"},"nodeType":"YulIf","src":"14541:44:111"},{"body":{"nodeType":"YulBlock","src":"14618:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14627:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14630:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14620:6:111"},"nodeType":"YulFunctionCall","src":"14620:12:111"},"nodeType":"YulExpressionStatement","src":"14620:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"14600:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"14610:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14597:2:111"},"nodeType":"YulFunctionCall","src":"14597:20:111"},"nodeType":"YulIf","src":"14594:40:111"},{"nodeType":"YulAssignment","src":"14643:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"14660:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"14668:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14656:3:111"},"nodeType":"YulFunctionCall","src":"14656:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"14643:9:111"}]},{"nodeType":"YulAssignment","src":"14688:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"14705:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"14715:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14701:3:111"},"nodeType":"YulFunctionCall","src":"14701:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"14688:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"14465:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"14473:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"14481:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"14493:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"14506:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"14517:9:111","type":""}],"src":"14401:331:111"},{"body":{"nodeType":"YulBlock","src":"14838:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"14848:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"14871:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14858:12:111"},"nodeType":"YulFunctionCall","src":"14858:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"14852:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14886:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"14896:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"14890:2:111","type":""}]},{"nodeType":"YulAssignment","src":"14971:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14984:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14988:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14980:3:111"},"nodeType":"YulFunctionCall","src":"14980:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14971:5:111"}]},{"body":{"nodeType":"YulBlock","src":"15023:80:111","statements":[{"nodeType":"YulAssignment","src":"15037:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"15054:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15066:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15073:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"15077:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15069:3:111"},"nodeType":"YulFunctionCall","src":"15069:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"15062:3:111"},"nodeType":"YulFunctionCall","src":"15062:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15084:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"15058:3:111"},"nodeType":"YulFunctionCall","src":"15058:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15050:3:111"},"nodeType":"YulFunctionCall","src":"15050:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15090:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15046:3:111"},"nodeType":"YulFunctionCall","src":"15046:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"15037:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"15006:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"15011:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"15003:2:111"},"nodeType":"YulFunctionCall","src":"15003:11:111"},"nodeType":"YulIf","src":"15000:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"14813:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"14820:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"14828:5:111","type":""}],"src":"14737:372:111"},{"body":{"nodeType":"YulBlock","src":"15288:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15305:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15316:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15298:6:111"},"nodeType":"YulFunctionCall","src":"15298:21:111"},"nodeType":"YulExpressionStatement","src":"15298:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15339:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15350:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15335:3:111"},"nodeType":"YulFunctionCall","src":"15335:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15355:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15328:6:111"},"nodeType":"YulFunctionCall","src":"15328:30:111"},"nodeType":"YulExpressionStatement","src":"15328:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15378:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15389:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15374:3:111"},"nodeType":"YulFunctionCall","src":"15374:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"15394:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15367:6:111"},"nodeType":"YulFunctionCall","src":"15367:62:111"},"nodeType":"YulExpressionStatement","src":"15367:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15449:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15460:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15445:3:111"},"nodeType":"YulFunctionCall","src":"15445:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"15465:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15438:6:111"},"nodeType":"YulFunctionCall","src":"15438:34:111"},"nodeType":"YulExpressionStatement","src":"15438:34:111"},{"nodeType":"YulAssignment","src":"15481:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15504:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15489:3:111"},"nodeType":"YulFunctionCall","src":"15489:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15481:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15265:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15279:4:111","type":""}],"src":"15114:400:111"},{"body":{"nodeType":"YulBlock","src":"15693:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15721:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15703:6:111"},"nodeType":"YulFunctionCall","src":"15703:21:111"},"nodeType":"YulExpressionStatement","src":"15703:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15744:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15755:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15740:3:111"},"nodeType":"YulFunctionCall","src":"15740:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15760:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15733:6:111"},"nodeType":"YulFunctionCall","src":"15733:30:111"},"nodeType":"YulExpressionStatement","src":"15733:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15783:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15794:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15779:3:111"},"nodeType":"YulFunctionCall","src":"15779:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"15799:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15772:6:111"},"nodeType":"YulFunctionCall","src":"15772:62:111"},"nodeType":"YulExpressionStatement","src":"15772:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15865:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15850:3:111"},"nodeType":"YulFunctionCall","src":"15850:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"15870:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15843:6:111"},"nodeType":"YulFunctionCall","src":"15843:31:111"},"nodeType":"YulExpressionStatement","src":"15843:31:111"},{"nodeType":"YulAssignment","src":"15883:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15895:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15906:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15891:3:111"},"nodeType":"YulFunctionCall","src":"15891:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15883:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15670:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15684:4:111","type":""}],"src":"15519:397:111"},{"body":{"nodeType":"YulBlock","src":"16149:329:111","statements":[{"nodeType":"YulAssignment","src":"16159:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16171:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16182:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16167:3:111"},"nodeType":"YulFunctionCall","src":"16167:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16159:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"16195:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16205:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"16199:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16263:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16278:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"16286:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16274:3:111"},"nodeType":"YulFunctionCall","src":"16274:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16256:6:111"},"nodeType":"YulFunctionCall","src":"16256:34:111"},"nodeType":"YulExpressionStatement","src":"16256:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16310:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16321:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16306:3:111"},"nodeType":"YulFunctionCall","src":"16306:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"16330:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"16338:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16326:3:111"},"nodeType":"YulFunctionCall","src":"16326:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16299:6:111"},"nodeType":"YulFunctionCall","src":"16299:43:111"},"nodeType":"YulExpressionStatement","src":"16299:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16362:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16373:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16358:3:111"},"nodeType":"YulFunctionCall","src":"16358:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"16378:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16351:6:111"},"nodeType":"YulFunctionCall","src":"16351:34:111"},"nodeType":"YulExpressionStatement","src":"16351:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16405:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16416:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16401:3:111"},"nodeType":"YulFunctionCall","src":"16401:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"16421:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16394:6:111"},"nodeType":"YulFunctionCall","src":"16394:34:111"},"nodeType":"YulExpressionStatement","src":"16394:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16448:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16459:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16444:3:111"},"nodeType":"YulFunctionCall","src":"16444:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"16465:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16437:6:111"},"nodeType":"YulFunctionCall","src":"16437:35:111"},"nodeType":"YulExpressionStatement","src":"16437:35:111"}]},"name":"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16086:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"16097:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"16105:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"16113:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"16121:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16129:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16140:4:111","type":""}],"src":"15921:557:111"},{"body":{"nodeType":"YulBlock","src":"16561:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"16607:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16616:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16619:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16609:6:111"},"nodeType":"YulFunctionCall","src":"16609:12:111"},"nodeType":"YulExpressionStatement","src":"16609:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"16582:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"16591:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16578:3:111"},"nodeType":"YulFunctionCall","src":"16578:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"16603:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"16574:3:111"},"nodeType":"YulFunctionCall","src":"16574:32:111"},"nodeType":"YulIf","src":"16571:52:111"},{"nodeType":"YulVariableDeclaration","src":"16632:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16651:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16645:5:111"},"nodeType":"YulFunctionCall","src":"16645:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"16636:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16714:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16723:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16726:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16716:6:111"},"nodeType":"YulFunctionCall","src":"16716:12:111"},"nodeType":"YulExpressionStatement","src":"16716:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16683:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16704:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16697:6:111"},"nodeType":"YulFunctionCall","src":"16697:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16690:6:111"},"nodeType":"YulFunctionCall","src":"16690:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"16680:2:111"},"nodeType":"YulFunctionCall","src":"16680:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16673:6:111"},"nodeType":"YulFunctionCall","src":"16673:40:111"},"nodeType":"YulIf","src":"16670:60:111"},{"nodeType":"YulAssignment","src":"16739:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"16749:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"16739:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16527:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"16538:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"16550:6:111","type":""}],"src":"16483:277:111"},{"body":{"nodeType":"YulBlock","src":"16939:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16956:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16967:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16949:6:111"},"nodeType":"YulFunctionCall","src":"16949:21:111"},"nodeType":"YulExpressionStatement","src":"16949:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16990:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17001:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16986:3:111"},"nodeType":"YulFunctionCall","src":"16986:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17006:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16979:6:111"},"nodeType":"YulFunctionCall","src":"16979:30:111"},"nodeType":"YulExpressionStatement","src":"16979:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17029:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17040:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17025:3:111"},"nodeType":"YulFunctionCall","src":"17025:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"17045:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17018:6:111"},"nodeType":"YulFunctionCall","src":"17018:62:111"},"nodeType":"YulExpressionStatement","src":"17018:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17100:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17111:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17096:3:111"},"nodeType":"YulFunctionCall","src":"17096:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"17116:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17089:6:111"},"nodeType":"YulFunctionCall","src":"17089:40:111"},"nodeType":"YulExpressionStatement","src":"17089:40:111"},{"nodeType":"YulAssignment","src":"17138:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17150:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17161:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17146:3:111"},"nodeType":"YulFunctionCall","src":"17146:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17138:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16916:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16930:4:111","type":""}],"src":"16765:406:111"},{"body":{"nodeType":"YulBlock","src":"17305:198:111","statements":[{"nodeType":"YulAssignment","src":"17315:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17327:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17338:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17323:3:111"},"nodeType":"YulFunctionCall","src":"17323:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17315:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"17350:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"17360:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"17354:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17418:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17433:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"17441:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17429:3:111"},"nodeType":"YulFunctionCall","src":"17429:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17411:6:111"},"nodeType":"YulFunctionCall","src":"17411:34:111"},"nodeType":"YulExpressionStatement","src":"17411:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17465:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17476:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17461:3:111"},"nodeType":"YulFunctionCall","src":"17461:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"17485:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"17493:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17481:3:111"},"nodeType":"YulFunctionCall","src":"17481:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17454:6:111"},"nodeType":"YulFunctionCall","src":"17454:43:111"},"nodeType":"YulExpressionStatement","src":"17454:43:111"}]},"name":"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17266:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"17277:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17285:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17296:4:111","type":""}],"src":"17176:327:111"},{"body":{"nodeType":"YulBlock","src":"17588:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"17634:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17643:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17646:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17636:6:111"},"nodeType":"YulFunctionCall","src":"17636:12:111"},"nodeType":"YulExpressionStatement","src":"17636:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"17609:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17618:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17605:3:111"},"nodeType":"YulFunctionCall","src":"17605:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"17630:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17601:3:111"},"nodeType":"YulFunctionCall","src":"17601:32:111"},"nodeType":"YulIf","src":"17598:52:111"},{"nodeType":"YulAssignment","src":"17659:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17675:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17669:5:111"},"nodeType":"YulFunctionCall","src":"17669:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"17659:6:111"}]}]},"name":"abi_decode_tuple_t_int256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17554:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"17565:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"17577:6:111","type":""}],"src":"17508:183:111"},{"body":{"nodeType":"YulBlock","src":"17775:168:111","statements":[{"body":{"nodeType":"YulBlock","src":"17821:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17830:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17833:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17823:6:111"},"nodeType":"YulFunctionCall","src":"17823:12:111"},"nodeType":"YulExpressionStatement","src":"17823:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"17796:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17805:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17792:3:111"},"nodeType":"YulFunctionCall","src":"17792:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"17817:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17788:3:111"},"nodeType":"YulFunctionCall","src":"17788:32:111"},"nodeType":"YulIf","src":"17785:52:111"},{"nodeType":"YulVariableDeclaration","src":"17846:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17865:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17859:5:111"},"nodeType":"YulFunctionCall","src":"17859:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"17850:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"17907:5:111"}],"functionName":{"name":"validator_revert_uint8","nodeType":"YulIdentifier","src":"17884:22:111"},"nodeType":"YulFunctionCall","src":"17884:29:111"},"nodeType":"YulExpressionStatement","src":"17884:29:111"},{"nodeType":"YulAssignment","src":"17922:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"17932:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"17922:6:111"}]}]},"name":"abi_decode_tuple_t_uint8_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17741:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"17752:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"17764:6:111","type":""}],"src":"17696:247:111"},{"body":{"nodeType":"YulBlock","src":"18012:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"18022:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18037:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"18026:7:111","type":""}]},{"nodeType":"YulAssignment","src":"18047:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"18056:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18047:5:111"}]},{"nodeType":"YulAssignment","src":"18072:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"18080:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"18072:4:111"}]},{"body":{"nodeType":"YulBlock","src":"18136:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"18241:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"18243:16:111"},"nodeType":"YulFunctionCall","src":"18243:18:111"},"nodeType":"YulExpressionStatement","src":"18243:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"18156:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18166:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"18234:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"18162:3:111"},"nodeType":"YulFunctionCall","src":"18162:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18153:2:111"},"nodeType":"YulFunctionCall","src":"18153:87:111"},"nodeType":"YulIf","src":"18150:113:111"},{"body":{"nodeType":"YulBlock","src":"18302:29:111","statements":[{"nodeType":"YulAssignment","src":"18304:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"18317:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"18324:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"18313:3:111"},"nodeType":"YulFunctionCall","src":"18313:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18304:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18283:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"18293:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18279:3:111"},"nodeType":"YulFunctionCall","src":"18279:22:111"},"nodeType":"YulIf","src":"18276:55:111"},{"nodeType":"YulAssignment","src":"18344:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"18356:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"18362:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"18352:3:111"},"nodeType":"YulFunctionCall","src":"18352:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"18344:4:111"}]},{"nodeType":"YulAssignment","src":"18380:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"18396:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"18405:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"18392:3:111"},"nodeType":"YulFunctionCall","src":"18392:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"18380:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18105:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"18115:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18102:2:111"},"nodeType":"YulFunctionCall","src":"18102:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"18124:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"18098:3:111","statements":[]},"src":"18094:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"17976:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"17983:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"17996:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"18003:4:111","type":""}],"src":"17948:482:111"},{"body":{"nodeType":"YulBlock","src":"18494:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"18532:52:111","statements":[{"nodeType":"YulAssignment","src":"18546:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18555:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18546:5:111"}]},{"nodeType":"YulLeave","src":"18569:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18514:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18507:6:111"},"nodeType":"YulFunctionCall","src":"18507:16:111"},"nodeType":"YulIf","src":"18504:80:111"},{"body":{"nodeType":"YulBlock","src":"18617:52:111","statements":[{"nodeType":"YulAssignment","src":"18631:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18640:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18631:5:111"}]},{"nodeType":"YulLeave","src":"18654:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"18603:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18596:6:111"},"nodeType":"YulFunctionCall","src":"18596:12:111"},"nodeType":"YulIf","src":"18593:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"18705:52:111","statements":[{"nodeType":"YulAssignment","src":"18719:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18728:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18719:5:111"}]},{"nodeType":"YulLeave","src":"18742:5:111"}]},"nodeType":"YulCase","src":"18698:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18703:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"18773:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"18808:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"18810:16:111"},"nodeType":"YulFunctionCall","src":"18810:18:111"},"nodeType":"YulExpressionStatement","src":"18810:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18793:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"18803:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18790:2:111"},"nodeType":"YulFunctionCall","src":"18790:17:111"},"nodeType":"YulIf","src":"18787:43:111"},{"nodeType":"YulAssignment","src":"18843:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18856:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"18866:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"18852:3:111"},"nodeType":"YulFunctionCall","src":"18852:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"18843:5:111"}]},{"nodeType":"YulLeave","src":"18881:5:111"}]},"nodeType":"YulCase","src":"18766:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18771:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"18685:4:111"},"nodeType":"YulSwitch","src":"18678:218:111"},{"body":{"nodeType":"YulBlock","src":"18994:70:111","statements":[{"nodeType":"YulAssignment","src":"19008:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19021:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"19027:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"19017:3:111"},"nodeType":"YulFunctionCall","src":"19017:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19008:5:111"}]},{"nodeType":"YulLeave","src":"19049:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"18918:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"18924:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18915:2:111"},"nodeType":"YulFunctionCall","src":"18915:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18932:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"18942:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18929:2:111"},"nodeType":"YulFunctionCall","src":"18929:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18911:3:111"},"nodeType":"YulFunctionCall","src":"18911:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"18955:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"18961:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18952:2:111"},"nodeType":"YulFunctionCall","src":"18952:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"18970:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"18980:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18967:2:111"},"nodeType":"YulFunctionCall","src":"18967:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18948:3:111"},"nodeType":"YulFunctionCall","src":"18948:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"18908:2:111"},"nodeType":"YulFunctionCall","src":"18908:77:111"},"nodeType":"YulIf","src":"18905:159:111"},{"nodeType":"YulVariableDeclaration","src":"19073:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19115:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"19121:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"19096:18:111"},"nodeType":"YulFunctionCall","src":"19096:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"19077:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"19086:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19235:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"19237:16:111"},"nodeType":"YulFunctionCall","src":"19237:18:111"},"nodeType":"YulExpressionStatement","src":"19237:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"19145:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19158:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"19226:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"19154:3:111"},"nodeType":"YulFunctionCall","src":"19154:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19142:2:111"},"nodeType":"YulFunctionCall","src":"19142:92:111"},"nodeType":"YulIf","src":"19139:118:111"},{"nodeType":"YulAssignment","src":"19266:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"19279:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"19288:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"19275:3:111"},"nodeType":"YulFunctionCall","src":"19275:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19266:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"18465:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"18471:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"18484:5:111","type":""}],"src":"18435:866:111"},{"body":{"nodeType":"YulBlock","src":"19376:61:111","statements":[{"nodeType":"YulAssignment","src":"19386:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19416:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"19422:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"19395:20:111"},"nodeType":"YulFunctionCall","src":"19395:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19386:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"19347:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"19353:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"19366:5:111","type":""}],"src":"19306:131:111"},{"body":{"nodeType":"YulBlock","src":"19510:72:111","statements":[{"nodeType":"YulAssignment","src":"19520:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19550:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"19560:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"19570:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19556:3:111"},"nodeType":"YulFunctionCall","src":"19556:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"19529:20:111"},"nodeType":"YulFunctionCall","src":"19529:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19520:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"19481:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"19487:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"19500:5:111","type":""}],"src":"19442:140:111"},{"body":{"nodeType":"YulBlock","src":"19761:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19778:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19789:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19771:6:111"},"nodeType":"YulFunctionCall","src":"19771:21:111"},"nodeType":"YulExpressionStatement","src":"19771:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19812:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19823:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19808:3:111"},"nodeType":"YulFunctionCall","src":"19808:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19828:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19801:6:111"},"nodeType":"YulFunctionCall","src":"19801:30:111"},"nodeType":"YulExpressionStatement","src":"19801:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19851:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19862:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19847:3:111"},"nodeType":"YulFunctionCall","src":"19847:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"19867:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19840:6:111"},"nodeType":"YulFunctionCall","src":"19840:62:111"},"nodeType":"YulExpressionStatement","src":"19840:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19922:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19933:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19918:3:111"},"nodeType":"YulFunctionCall","src":"19918:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"19938:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19911:6:111"},"nodeType":"YulFunctionCall","src":"19911:36:111"},"nodeType":"YulExpressionStatement","src":"19911:36:111"},{"nodeType":"YulAssignment","src":"19956:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19968:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19979:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19964:3:111"},"nodeType":"YulFunctionCall","src":"19964:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19956:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19738:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19752:4:111","type":""}],"src":"19587:402:111"},{"body":{"nodeType":"YulBlock","src":"20131:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"20141:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20161:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20155:5:111"},"nodeType":"YulFunctionCall","src":"20155:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"20145:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20203:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20211:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20199:3:111"},"nodeType":"YulFunctionCall","src":"20199:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"20218:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20223:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"20177:21:111"},"nodeType":"YulFunctionCall","src":"20177:53:111"},"nodeType":"YulExpressionStatement","src":"20177:53:111"},{"nodeType":"YulAssignment","src":"20239:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20250:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20255:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20246:3:111"},"nodeType":"YulFunctionCall","src":"20246:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"20239:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"20107:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20112:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20123:3:111","type":""}],"src":"19994:274:111"},{"body":{"nodeType":"YulBlock","src":"20447:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20475:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20457:6:111"},"nodeType":"YulFunctionCall","src":"20457:21:111"},"nodeType":"YulExpressionStatement","src":"20457:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20498:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20509:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20494:3:111"},"nodeType":"YulFunctionCall","src":"20494:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20514:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20487:6:111"},"nodeType":"YulFunctionCall","src":"20487:30:111"},"nodeType":"YulExpressionStatement","src":"20487:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20537:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20548:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20533:3:111"},"nodeType":"YulFunctionCall","src":"20533:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"20553:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20526:6:111"},"nodeType":"YulFunctionCall","src":"20526:59:111"},"nodeType":"YulExpressionStatement","src":"20526:59:111"},{"nodeType":"YulAssignment","src":"20594:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20606:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20617:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20602:3:111"},"nodeType":"YulFunctionCall","src":"20602:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20594:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20424:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20438:4:111","type":""}],"src":"20273:353:111"},{"body":{"nodeType":"YulBlock","src":"20752:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20769:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20780:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20762:6:111"},"nodeType":"YulFunctionCall","src":"20762:21:111"},"nodeType":"YulExpressionStatement","src":"20762:21:111"},{"nodeType":"YulAssignment","src":"20792:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20817:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20829:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20840:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20825:3:111"},"nodeType":"YulFunctionCall","src":"20825:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"20800:16:111"},"nodeType":"YulFunctionCall","src":"20800:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20792:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20721:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20732:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20743:4:111","type":""}],"src":"20631:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_contract_IERC20(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function validator_revert_uint8(value)\n {\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_contract_IERC20(value_2)\n value2 := value_2\n let value_3 := calldataload(add(headStart, 96))\n validator_revert_uint8(value_3)\n value3 := value_3\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), and(value2, 0xff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: Incorrect toke\")\n mstore(add(headStart, 96), \"n oracle\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"DepositPaymaster: unsupported to\")\n mstore(add(headStart, 96), \"ken\")\n tail := add(headStart, 128)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"DepositPaymaster: paymasterAndDa\")\n mstore(add(headStart, 96), \"ta must specify token\")\n tail := add(headStart, 128)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_decode_tuple_t_int256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_decode_tuple_t_uint8_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_uint8(value)\n value0 := value\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1140},{"length":32,"start":1516},{"length":32,"start":2122},{"length":32,"start":2562},{"length":32,"start":2761},{"length":32,"start":2905},{"length":32,"start":3345},{"length":32,"start":4091}]},"linkReferences":{},"object":"6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610538578063d0e30db01461055a578063f2fde38b14610562578063f465c77e1461058257600080fd5b8063c23f001f146104cb578063c399ec8814610503578063cc9c837c1461051857600080fd5b8063b0d691fe116100bb578063b0d691fe14610462578063bb9fe6bf14610496578063c23a5cea146104ab57600080fd5b80639ed0fb681461037d578063a9a23409146103a1578063addd5099146103c157600080fd5b8063493b017011610143578063796d43711161011d578063796d43711461033c5780637b775d4d146102305780638da5cb5b1461035257600080fd5b8063493b0170146102785780634a6f84cf146102ec578063715018a61461032757600080fd5b80632f3e96a7116101745780632f3e96a7146101f057806333032ec414610230578063382edd9e1461025857600080fd5b80630396cb601461019b5780631a02ef76146101b0578063205c2878146101d0575b600080fd5b6101ae6101a9366004611d13565b6105b0565b005b3480156101bc57600080fd5b506101ae6101cb366004611d6a565b610662565b3480156101dc57600080fd5b506101ae6101eb366004611dc6565b6107f6565b3480156101fc57600080fd5b5061020661034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023c57600080fd5b5061020673420000000000000000000000000000000000000681565b34801561026457600080fd5b506101ae610273366004611df2565b61088e565b34801561028457600080fd5b506102d7610293366004611e33565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610227565b3480156102f857600080fd5b50610319610307366004611e6c565b60036020526000908152604090205481565b604051908152602001610227565b34801561033357600080fd5b506101ae6109ca565b34801561034857600080fd5b506103196188b881565b34801561035e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610206565b34801561038957600080fd5b506101ae336000908152600360205260409020439055565b3480156103ad57600080fd5b506101ae6103bc366004611e89565b6109de565b3480156103cd57600080fd5b5061042c6103dc366004611e6c565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610227565b34801561046e57600080fd5b506102067f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a257600080fd5b506101ae6109f8565b3480156104b757600080fd5b506101ae6104c6366004611e6c565b610a7c565b3480156104d757600080fd5b506103196104e6366004611e33565b600260209081526000928352604080842090915290825290205481565b34801561050f57600080fd5b50610319610b28565b34801561052457600080fd5b506101ae610533366004611df2565b610bde565b34801561054457600080fd5b506101ae33600090815260036020526040812055565b6101ae610ce3565b34801561056e57600080fd5b506101ae61057d366004611e6c565b610d6b565b34801561058e57600080fd5b506105a261059d366004611f18565b610e08565b604051610227929190611fe2565b6105b8610e2b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561064657600080fd5b505af115801561065a573d6000803e3d6000fd5b505050505050565b61066a610e2b565b73ffffffffffffffffffffffffffffffffffffffff83166106f85760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561072a57600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b6107fe610e2b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561064657600080fd5b6108b073ffffffffffffffffffffffffffffffffffffffff8416333084610e92565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160205260409020541661094a5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526002602090815260408083209386168352929052908120805483929061098e908490612033565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109c5576109c533600090815260036020526040812055565b505050565b6109d2610e2b565b6109dc6000610f6e565b565b6109e6610fe3565b6109f284848484611068565b50505050565b610a00610e2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a6857600080fd5b505af11580156109f2573d6000803e3d6000fd5b610a84610e2b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd9919061204b565b905090565b3360009081526003602052604090205415801590610c0a57503360009081526003602052604090205443115b610c7c5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cbc908490612064565b909155506109c5905073ffffffffffffffffffffffffffffffffffffffff841683836111e0565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b0d57600080fd5b610d73610e2b565b73ffffffffffffffffffffffffffffffffffffffff8116610dfc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ef565b610e0581610f6e565b50565b60606000610e14610fe3565b610e1f858585611236565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ef565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109f29085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611517565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109dc5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106ef565b60008080808061107a8789018961207b565b9450945094509450945060008183856188b861109691906120cc565b6110a0908a612033565b6110aa91906120cc565b6110b49190612109565b905060028a60028111156110ca576110ca612144565b146110f6576110f173ffffffffffffffffffffffffffffffffffffffff8616873084610e92565b611140565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a168352929052908120805483929061113a908490612064565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260408120829161118660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111cf9190612033565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109c59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610eec565b606060006188b88560a00135116112b55760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106ef565b3660006112c6610120880188612173565b9092509050602881146113415760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106ef565b600061135082601481866121df565b61135991612209565b60601c90508735600061136c8389611609565b905060006113798b611b13565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150156114145760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156114bc5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611579826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b429092919063ffffffff16565b8051909150156109c557808060200190518101906115979190612251565b6109c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ef565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff169382019390935290916116e75760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106ef565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb919061204b565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c919061204b565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612273565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190612273565b60ff1690506000611a4483600a6123b0565b611a4e90856120cc565b611a5983600a6123b0565b611a63878c6120cc565b611a6d91906120cc565b611a779190612109565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731954909150611adf9074010000000000000000000000000000000000000000900460ff16600a6123bc565b6040880151611aef90600a6123bc565b611af990836120cc565b611b039190612109565b9750505050505050505b92915050565b600060e0820135610100830135808203611b2e575092915050565b611b3a82488301611b51565b949350505050565b6060611b3a8484600085611b69565b6000818310611b605781611b62565b825b9392505050565b606082471015611be15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106ef565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c0a91906123cb565b60006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b5091509150611c5d87838387611c68565b979650505050505050565b60608315611ce4578251600003611cdd5773ffffffffffffffffffffffffffffffffffffffff85163b611cdd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ef565b5081611b3a565b611b3a8383815115611cf95781518083602001fd5b8060405162461bcd60e51b81526004016106ef91906123e7565b600060208284031215611d2557600080fd5b813563ffffffff81168114611b6257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610e0557600080fd5b60ff81168114610e0557600080fd5b60008060008060808587031215611d8057600080fd5b8435611d8b81611d39565b93506020850135611d9b81611d39565b92506040850135611dab81611d39565b91506060850135611dbb81611d5b565b939692955090935050565b60008060408385031215611dd957600080fd5b8235611de481611d39565b946020939093013593505050565b600080600060608486031215611e0757600080fd5b8335611e1281611d39565b92506020840135611e2281611d39565b929592945050506040919091013590565b60008060408385031215611e4657600080fd5b8235611e5181611d39565b91506020830135611e6181611d39565b809150509250929050565b600060208284031215611e7e57600080fd5b8135611b6281611d39565b60008060008060608587031215611e9f57600080fd5b843560038110611eae57600080fd5b9350602085013567ffffffffffffffff80821115611ecb57600080fd5b818701915087601f830112611edf57600080fd5b813581811115611eee57600080fd5b886020828501011115611f0057600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f2d57600080fd5b833567ffffffffffffffff811115611f4457600080fd5b84016101608187031215611f5757600080fd5b95602085013595506040909401359392505050565b60005b83811015611f87578181015183820152602001611f6f565b838111156109f25750506000910152565b60008151808452611fb0816020860160208601611f6c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611ff56040830185611f98565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561204657612046612004565b500190565b60006020828403121561205d57600080fd5b5051919050565b60008282101561207657612076612004565b500390565b600080600080600060a0868803121561209357600080fd5b853561209e81611d39565b945060208601356120ae81611d39565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561210457612104612004565b500290565b60008261213f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121a857600080fd5b83018035915067ffffffffffffffff8211156121c357600080fd5b6020019150368190038213156121d857600080fd5b9250929050565b600080858511156121ef57600080fd5b838611156121fc57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122495780818660140360031b1b83161692505b505092915050565b60006020828403121561226357600080fd5b81518015158114611b6257600080fd5b60006020828403121561228557600080fd5b8151611b6281611d5b565b600181815b808511156122e957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156122cf576122cf612004565b808516156122dc57918102915b93841c9390800290612295565b509250929050565b60008261230057506001611b0d565b8161230d57506000611b0d565b8160018114612323576002811461232d57612349565b6001915050611b0d565b60ff84111561233e5761233e612004565b50506001821b611b0d565b5060208310610133831016604e8410600b841016171561236c575081810a611b0d565b6123768383612290565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156123a8576123a8612004565b029392505050565b6000611b6283836122f1565b6000611b6260ff8416836122f1565b600082516123dd818460208701611f6c565b9190910192915050565b602081526000611b626020830184611f9856fea26469706673582212208a9cab613294aeef7047a8205015d7b3471fa40b68142b67434d61f70707bbe764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x196 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23F001F GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x55A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x582 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4CB JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x503 JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x4AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x37D JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3A1 JUMPI DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x3C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 GT PUSH2 0x143 JUMPI DUP1 PUSH4 0x796D4371 GT PUSH2 0x11D JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0x7B775D4D EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x2EC JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2F3E96A7 GT PUSH2 0x174 JUMPI DUP1 PUSH4 0x2F3E96A7 EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0x33032EC4 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x19B JUMPI DUP1 PUSH4 0x1A02EF76 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1D0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE PUSH2 0x1A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D13 JUMP JUMPDEST PUSH2 0x5B0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1D6A JUMP JUMPDEST PUSH2 0x662 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1DC6 JUMP JUMPDEST PUSH2 0x7F6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x348 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH20 0x4200000000000000000000000000000000000006 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x273 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF2 JUMP JUMPDEST PUSH2 0x88E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x284 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D7 PUSH2 0x293 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E33 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x307 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x9CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x206 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x3BC CALLDATASIZE PUSH1 0x4 PUSH2 0x1E89 JUMP JUMPDEST PUSH2 0x9DE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x42C PUSH2 0x3DC CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 DUP2 AND SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x227 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x9F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x4C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH2 0xA7C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x4E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E33 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0xB28 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x524 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x533 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF2 JUMP JUMPDEST PUSH2 0xBDE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1AE PUSH2 0xCE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x57D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E6C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A2 PUSH2 0x59D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F18 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x227 SWAP3 SWAP2 SWAP1 PUSH2 0x1FE2 JUMP JUMPDEST PUSH2 0x5B8 PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x65A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x66A PUSH2 0xE2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x6F8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F727265637420746F6B65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E206F7261636C65000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x72A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0xFF SWAP4 DUP5 AND DUP6 DUP5 ADD SWAP1 DUP2 MSTORE SWAP7 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP3 KECCAK256 SWAP4 MLOAD DUP5 SLOAD SWAP1 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR DUP5 SSTORE MLOAD SWAP3 ADD DUP1 SLOAD SWAP5 MLOAD SWAP1 SWAP2 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP3 AND OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x7FE PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xE92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x98E SWAP1 DUP5 SWAP1 PUSH2 0x2033 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x9C5 JUMPI PUSH2 0x9C5 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x9D2 PUSH2 0xE2B JUMP JUMPDEST PUSH2 0x9DC PUSH1 0x0 PUSH2 0xF6E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x9E6 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0x9F2 DUP5 DUP5 DUP5 DUP5 PUSH2 0x1068 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xA00 PUSH2 0xE2B JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9F2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xA84 PUSH2 0xE2B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB21 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xBD9 SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xC0A JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xC7C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xCBC SWAP1 DUP5 SWAP1 PUSH2 0x2064 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x9C5 SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x11E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD73 PUSH2 0xE2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xDFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH2 0xE05 DUP2 PUSH2 0xF6E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xE14 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0xE1F DUP6 DUP6 DUP6 PUSH2 0x1236 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x9DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9F2 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1517 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x9DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x107A DUP8 DUP10 ADD DUP10 PUSH2 0x207B JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x1096 SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x10A0 SWAP1 DUP11 PUSH2 0x2033 JUMP JUMPDEST PUSH2 0x10AA SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x10B4 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x10CA JUMPI PUSH2 0x10CA PUSH2 0x2144 JUMP JUMPDEST EQ PUSH2 0x10F6 JUMPI PUSH2 0x10F1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xE92 JUMP JUMPDEST PUSH2 0x1140 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x113A SWAP1 DUP5 SWAP1 PUSH2 0x2064 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x1186 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x11CF SWAP2 SWAP1 PUSH2 0x2033 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9C5 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xEEC JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x12B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x12C6 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x2173 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1341 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1350 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x21DF JUMP JUMPDEST PUSH2 0x1359 SWAP2 PUSH2 0x2209 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x136C DUP4 DUP10 PUSH2 0x1609 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1379 DUP12 PUSH2 0x1B13 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1414 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x14BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1579 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1B42 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x9C5 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1597 SWAP2 SWAP1 PUSH2 0x2251 JUMP JUMPDEST PUSH2 0x9C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE DUP2 SLOAD DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP5 ADD SLOAD SWAP6 DUP7 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP5 DIV PUSH1 0xFF AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 SWAP2 PUSH2 0x16E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 ADD MLOAD PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP4 SWAP3 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17C7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17EB SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1868 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x188C SWAP2 SWAP1 PUSH2 0x204B JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1968 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x198C SWAP2 SWAP1 PUSH2 0x2273 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1A0E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1A32 SWAP2 SWAP1 PUSH2 0x2273 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x1A44 DUP4 PUSH1 0xA PUSH2 0x23B0 JUMP JUMPDEST PUSH2 0x1A4E SWAP1 DUP6 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A59 DUP4 PUSH1 0xA PUSH2 0x23B0 JUMP JUMPDEST PUSH2 0x1A63 DUP8 DUP13 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A6D SWAP2 SWAP1 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1A77 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD SWAP1 SWAP2 POP PUSH2 0x1ADF SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x23BC JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH2 0x1AEF SWAP1 PUSH1 0xA PUSH2 0x23BC JUMP JUMPDEST PUSH2 0x1AF9 SWAP1 DUP4 PUSH2 0x20CC JUMP JUMPDEST PUSH2 0x1B03 SWAP2 SWAP1 PUSH2 0x2109 JUMP JUMPDEST SWAP8 POP POP POP POP POP POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1B2E JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1B3A DUP3 BASEFEE DUP4 ADD PUSH2 0x1B51 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1B3A DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B60 JUMPI DUP2 PUSH2 0x1B62 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1BE1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6EF JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1C0A SWAP2 SWAP1 PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C47 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C4C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1C5D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1C68 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1CE4 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1CDD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1CDD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6EF JUMP JUMPDEST POP DUP2 PUSH2 0x1B3A JUMP JUMPDEST PUSH2 0x1B3A DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1CF9 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6EF SWAP2 SWAP1 PUSH2 0x23E7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1B62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xE05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D8B DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x1D9B DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x1DAB DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x1DBB DUP2 PUSH2 0x1D5B JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1DD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1DE4 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1E07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1E12 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1E22 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E51 DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1E61 DUP2 PUSH2 0x1D39 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B62 DUP2 PUSH2 0x1D39 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1E9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1EAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1ECB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1EDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1F00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F87 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F6F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x9F2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1FB0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F6C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1FF5 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1F98 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2046 JUMPI PUSH2 0x2046 PUSH2 0x2004 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x205D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x2076 JUMPI PUSH2 0x2076 PUSH2 0x2004 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x209E DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x20AE DUP2 PUSH2 0x1D39 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x2104 JUMPI PUSH2 0x2104 PUSH2 0x2004 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x213F JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x21A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x21C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x21D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x21EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x21FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x2249 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1B62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1B62 DUP2 PUSH2 0x1D5B JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x22E9 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x22CF JUMPI PUSH2 0x22CF PUSH2 0x2004 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x22DC JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x2295 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2300 JUMPI POP PUSH1 0x1 PUSH2 0x1B0D JUMP JUMPDEST DUP2 PUSH2 0x230D JUMPI POP PUSH1 0x0 PUSH2 0x1B0D JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x2323 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x232D JUMPI PUSH2 0x2349 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x1B0D JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x233E JUMPI PUSH2 0x233E PUSH2 0x2004 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x1B0D JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x236C JUMPI POP DUP2 DUP2 EXP PUSH2 0x1B0D JUMP JUMPDEST PUSH2 0x2376 DUP4 DUP4 PUSH2 0x2290 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x23A8 JUMPI PUSH2 0x23A8 PUSH2 0x2004 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B62 DUP4 DUP4 PUSH2 0x22F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B62 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x22F1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x23DD DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1F6C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1B62 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1F98 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 SWAP13 0xAB PUSH2 0x3294 0xAE 0xEF PUSH17 0x47A8205015D7B3471FA40B68142B67434D PUSH2 0xF707 SMOD 0xBB 0xE7 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"1483:8121:65:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2814:349:65;;;;;;;;;;-1:-1:-1;2814:349:65;;;;;:::i;:::-;;:::i;2721:149:52:-;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;1818:78:65:-;;;;;;;;;;;;1854:42;1818:78;;;;;1824:42:111;1812:55;;;1794:74;;1782:2;1767:18;1818:78:65;;;;;;;;2042:54;;;;;;;;;;;;1994:42;2042:54;;3697:472;;;;;;;;;;-1:-1:-1;3697:472:65;;;;;:::i;:::-;;:::i;4355:206::-;;;;;;;;;;-1:-1:-1;4355:206:65;;;;;:::i;:::-;4485:15;;;;4428:14;4485:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;4534:11;:20;;;;;;;;4485:24;;4355:206;;;;;3215:25:111;;;3271:2;3256:18;;3249:34;;;;3188:18;4355:206:65;3041:248:111;2288:46:65;;;;;;;;;;-1:-1:-1;2288:46:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3700:25:111;;;3688:2;3673:18;2288:46:65;3554:177:111;1831:101:24;;;;;;;;;;;;;:::i;1768:44:65:-;;;;;;;;;;;;1807:5;1768:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;4692:92:65;;;;;;;;;;;;4751:10;4739:23;;;;:11;:23;;;;;4765:12;4739:38;;4692:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;2174:40:65:-;;;;;;;;;;-1:-1:-1;2174:40:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5063:42:111;5132:15;;;5114:34;;5184:15;;;;5179:2;5164:18;;5157:43;5248:4;5236:17;5216:18;;;5209:45;5041:2;5026:18;2174:40:65;4835:425:111;471:39:52;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;2220:62:65:-;;;;;;;;;;-1:-1:-1;2220:62:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3318:111:52;;;;;;;;;;;;;:::i;5328:311:65:-;;;;;;;;;;-1:-1:-1;5328:311:65;;;;;:::i;:::-;;:::i;5001:79::-;;;;;;;;;;;;5058:10;5072:1;5046:23;;;:11;:23;;;;;:27;5001:79;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;7371:10:111;7359:23;;3173:55:52::1;::::0;::::1;7341:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;7314:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2814:349:65:-;1094:13:24;:11;:13::i;:::-;2947:31:65::1;::::0;::::1;2939:84;;;::::0;-1:-1:-1;;;2939:84:65;;7596:2:111;2939:84:65::1;::::0;::::1;7578:21:111::0;7635:2;7615:18;;;7608:30;7674:34;7654:18;;;7647:62;7745:10;7725:18;;;7718:38;7773:19;;2939:84:65::1;;;;;;;;;3041:42;:14:::0;;::::1;2164:1;3041:14:::0;;;:7:::1;:14;::::0;;;;:27;::::1;:42:::0;3033:51:::1;;;::::0;::::1;;3111:45;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;3094:14;;::::1;-1:-1:-1::0;3094:14:65;;;:7:::1;:14:::0;;;;;;;;:62;;;;;;::::1;::::0;;;::::1;;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;2814:349::o;2721:149:52:-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;8011:55:111::0;;;2817:46:52::1;::::0;::::1;7993:74:111::0;8083:18;;;8076:34;;;2817:10:52::1;:21;::::0;::::1;::::0;7966:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;3697:472:65::0;3882:57;:22;;;3905:10;3925:4;3932:6;3882:22;:57::i;:::-;3957:42;:14;;;2164:1;3957:14;;;:7;:14;;;;;:27;;3949:90;;;;-1:-1:-1;;;3949:90:65;;8323:2:111;3949:90:65;;;8305:21:111;8362:2;8342:18;;;8335:30;8401:34;8381:18;;;8374:62;8472:5;8452:18;;;8445:33;8495:19;;3949:90:65;8121:399:111;3949:90:65;4049:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:34;;4077:6;;4049:15;:34;;4077:6;;4049:34;:::i;:::-;;;;-1:-1:-1;;4097:21:65;;;:10;:21;4093:70;;4134:18;5058:10;5072:1;5046:23;;;:11;:23;;;;;:27;5001:79;4134:18;3697:472;;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;1812:55:111::0;;;3975:41:52::1;::::0;::::1;1794:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;1767:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;1794:74:111;3361:7:52;;3387:10;:20;;;;;1767:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;5328:311:65:-;5437:10;5425:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;5484:10:65;5472:23;;;;:11;:23;;;;;;5457:12;:38;5425:70;5417:124;;;;-1:-1:-1;;;5417:124:65;;9485:2:111;5417:124:65;;;9467:21:111;9524:2;9504:18;;;9497:30;9563:34;9543:18;;;9536:62;9634:11;9614:18;;;9607:39;9663:19;;5417:124:65;9283:405:111;5417:124:65;5551:15;;;;;;;:8;:15;;;;;;;;5567:10;5551:27;;;;;;;:37;;5582:6;;5551:15;:37;;5582:6;;5551:37;:::i;:::-;;;;-1:-1:-1;5598:34:65;;-1:-1:-1;5598:18:65;;;5617:6;5625;5598:18;:34::i;2474:105:52:-;2518:54;;;;;2566:4;2518:54;;;1794:74:111;2518:10:52;:20;;;;;2547:9;;1767:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;10025:2:111;2161:73:24::1;::::0;::::1;10007:21:111::0;10064:2;10044:18;;;10037:30;10103:34;10083:18;;;10076:62;10174:8;10154:18;;;10147:36;10200:19;;2161:73:24::1;9823:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;10432:2:111;1414:68:24;;;10414:21:111;;;10451:18;;;10444:30;10510:34;10490:18;;;10483:62;10562:18;;1414:68:24;10230:356:111;974:241:39;1139:68;;10803:42:111;10872:15;;;1139:68:39;;;10854:34:111;10924:15;;10904:18;;;10897:43;10956:18;;;10949:34;;;1112:96:39;;1132:5;;1162:27;;10766:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;2433:187:24:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;11196:2:111;4148:67:52;;;11178:21:111;11235:2;11215:18;;;11208:30;11274:23;11254:18;;;11247:51;11315:18;;4148:67:52;10994:345:111;8783:819:65;8894:15;;;;;8990:65;;;;9001:7;8990:65;:::i;:::-;8893:162;;;;;;;;;;9124:23;9215:7;9200:12;9182:14;1807:5;9167:29;;;;:::i;:::-;9151:45;;:13;:45;:::i;:::-;9150:62;;;;:::i;:::-;:72;;;;:::i;:::-;9124:98;-1:-1:-1;9244:25:65;9236:4;:33;;;;;;;;:::i;:::-;;9232:311;;9328:63;:22;;;9351:7;9368:4;9375:15;9328:22;:63::i;:::-;9232:311;;;9489:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:43;;9517:15;;9489;:43;;9517:15;;9489:43;:::i;:::-;;;;-1:-1:-1;;9232:311:65;9552:15;;;;;;;:8;:15;;;;;9580;;9568:7;1247::24;1273:6;;;;1201:85;9568:7:65;9552:24;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;8783:819:65:o;763:205:39:-;902:58;;8023:42:111;8011:55;;902:58:39;;;7993:74:111;8083:18;;;8076:34;;;875:86:39;;895:5;;925:23;;7966:18:111;;902:58:39;7803:313:111;7271:1101:65;7409:20;7431:22;1807:5;7599:6;:27;;;:42;7591:95;;;;-1:-1:-1;;;7591:95:65;;13187:2:111;7591:95:65;;;13169:21:111;13226:2;13206:18;;;13199:30;13265:34;13245:18;;;13238:62;13336:10;13316:18;;;13309:38;13364:19;;7591:95:65;12985:404:111;7591:95:65;7697:31;;7731:23;;;;:6;:23;:::i;:::-;7697:57;;-1:-1:-1;7697:57:65;-1:-1:-1;7799:5:65;7772:32;;7764:98;;;;-1:-1:-1;;;7764:98:65;;14181:2:111;7764:98:65;;;14163:21:111;14220:2;14200:18;;;14193:30;14259:34;14239:18;;;14232:62;14330:23;14310:18;;;14303:51;14371:19;;7764:98:65;13979:417:111;7764:98:65;7872:12;7910:21;:16;7927:2;7910:16;;:21;:::i;:::-;7902:30;;;:::i;:::-;7894:39;;;-1:-1:-1;1889:20:64;;7944:15:65;8013:34;7894:39;8039:7;8013:18;:34::i;:::-;7990:57;;8057:22;8082:17;:6;:15;:17::i;:::-;8117:20;;;;;;;:11;:20;;;;;;8057:42;;-1:-1:-1;8117:25:65;8109:74;;;;-1:-1:-1;;;8109:74:65;;15316:2:111;8109:74:65;;;15298:21:111;15355:2;15335:18;;;15328:30;15394:34;15374:18;;;15367:62;15465:6;15445:18;;;15438:34;15489:19;;8109:74:65;15114:400:111;8109:74:65;8201:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;:40;-1:-1:-1;8201:40:65;8193:86;;;;-1:-1:-1;;;8193:86:65;;15721:2:111;8193:86:65;;;15703:21:111;15760:2;15740:18;;;15733:30;15799:34;15779:18;;;15772:62;15870:3;15850:18;;;15843:31;15891:19;;8193:86:65;15519:397:111;8193:86:65;8297:65;;;16205:42:111;16274:15;;;8297:65:65;;;16256:34:111;16326:15;;;;16306:18;;;16299:43;16358:18;;;16351:34;16401:18;;;16394:34;16444:19;;;;16437:35;;;;8297:65:65;;;;;;;;;;16167:19:111;;;;8297:65:65;;-1:-1:-1;8297:65:65;;-1:-1:-1;;;8297:65:65;-1:-1:-1;;;;7271:1101:65:o;3747:706:39:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:39;;16967:2:111;4351:85:39;;;16949:21:111;17006:2;16986:18;;;16979:30;17045:34;17025:18;;;17018:62;17116:12;17096:18;;;17089:40;17146:19;;4351:85:39;16765:406:111;5901:1071:65;6054:14;;;;5993:22;6054:14;;;:7;:14;;;;;;;;6027:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5993:22;;6078:86;;;;-1:-1:-1;;;6078:86:65;;8323:2:111;6078:86:65;;;8305:21:111;8362:2;8342:18;;;8335:30;8401:34;8381:18;;;8374:62;8472:5;8452:18;;;8445:33;8495:19;;6078:86:65;8121:399:111;6078:86:65;6189:20;;;;;1994:42;6174:12;6246:15;;;:7;:15;;;;:28;6288:25;;6246:15;:79;;;;:15;6288:25;;;6246:79;;;17411:34:111;1854:42:65;17461:18:111;;;17454:43;6189:20:65;;6174:12;6246:28;;;:41;;17323:18:111;;6246:79:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6365:23;;:53;;;;;:36;17429:15:111;;;6365:53:65;;;17411:34:111;1854:42:65;17461:18:111;;;17454:43;6219:107:65;;-1:-1:-1;6336:18:65;;6365:36;;;;;;17323:18:111;;6365:53:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1994:42;6429:24;6464:15;;;:7;:15;;;:28;6502:25;;6464:15;:75;;;;:15;6502:25;;;6464:75;;;17411:34:111;1854:42:65;17461:18:111;;;17454:43;6336:83:65;;-1:-1:-1;6429:24:65;;6464:28;;;:37;;17323:18:111;;6464:75:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6587:23;;:49;;;;;:32;17429:15:111;;;6587:49:65;;;17411:34:111;1854:42:65;17461:18:111;;;17454:43;6456:84:65;;;;;;-1:-1:-1;6550:26:65;;6587:32;;;;;;17323:18:111;;6587:49:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6579:58;;;-1:-1:-1;6647:22:65;6739:20;6743:16;6739:2;:20;:::i;:::-;6725:35;;:10;:35;:::i;:::-;6697:22;6701:18;6697:2;:22;:::i;:::-;6673:20;6685:8;6673:9;:20;:::i;:::-;:47;;;;:::i;:::-;6672:89;;;;:::i;:::-;1994:42;6934:15;;:7;:15;;:29;;6647:114;;-1:-1:-1;6930:33:65;;6934:29;;;;;6930:2;:33;:::i;:::-;6900:24;;;;6896:28;;:2;:28;:::i;:::-;6878:47;;:14;:47;:::i;:::-;6877:87;;;;:::i;:::-;6869:96;;;;;;;;;5901:1071;;;;;:::o;2095:472:64:-;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;:::-;2492:62;2095:472;-1:-1:-1;;;;2095:472:64:o;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;3743:1;3735:13;3728:20;3651:104;-1:-1:-1;;;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:42;;19789:2:111;5149:81:42;;;19771:21:111;19828:2;19808:18;;;19801:30;19867:34;19847:18;;;19840:62;19938:8;19918:18;;;19911:36;19964:19;;5149:81:42;19587:402:111;5149:81:42;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;20475:2:111;7908:60:42;;;20457:21:111;20514:2;20494:18;;;20487:30;20553:31;20533:18;;;20526:59;20602:18;;7908:60:42;20273:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;295:162;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:114;546:4;539:5;535:16;528:5;525:27;515:55;;566:1;563;556:12;581:726;700:6;708;716;724;777:3;765:9;756:7;752:23;748:33;745:53;;;794:1;791;784:12;745:53;833:9;820:23;852:39;885:5;852:39;:::i;:::-;910:5;-1:-1:-1;967:2:111;952:18;;939:32;980:41;939:32;980:41;:::i;:::-;1040:7;-1:-1:-1;1099:2:111;1084:18;;1071:32;1112:41;1071:32;1112:41;:::i;:::-;1172:7;-1:-1:-1;1231:2:111;1216:18;;1203:32;1244:31;1203:32;1244:31;:::i;:::-;581:726;;;;-1:-1:-1;581:726:111;;-1:-1:-1;;581:726:111:o;1312:331::-;1388:6;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:52;;;1465:1;1462;1455:12;1417:52;1504:9;1491:23;1523:39;1556:5;1523:39;:::i;:::-;1581:5;1633:2;1618:18;;;;1605:32;;-1:-1:-1;;;1312:331:111:o;2125:487::-;2217:6;2225;2233;2286:2;2274:9;2265:7;2261:23;2257:32;2254:52;;;2302:1;2299;2292:12;2254:52;2341:9;2328:23;2360:39;2393:5;2360:39;:::i;:::-;2418:5;-1:-1:-1;2475:2:111;2460:18;;2447:32;2488:41;2447:32;2488:41;:::i;:::-;2125:487;;2548:7;;-1:-1:-1;;;2602:2:111;2587:18;;;;2574:32;;2125:487::o;2617:419::-;2700:6;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2816:9;2803:23;2835:39;2868:5;2835:39;:::i;:::-;2893:5;-1:-1:-1;2950:2:111;2935:18;;2922:32;2963:41;2922:32;2963:41;:::i;:::-;3023:7;3013:17;;;2617:419;;;;;:::o;3294:255::-;3353:6;3406:2;3394:9;3385:7;3381:23;3377:32;3374:52;;;3422:1;3419;3412:12;3374:52;3461:9;3448:23;3480:39;3513:5;3480:39;:::i;3736:819::-;3840:6;3848;3856;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:52;;;3933:1;3930;3923:12;3885:52;3972:9;3959:23;4011:1;4004:5;4001:12;3991:40;;4027:1;4024;4017:12;3991:40;4050:5;-1:-1:-1;4106:2:111;4091:18;;4078:32;4129:18;4159:14;;;4156:34;;;4186:1;4183;4176:12;4156:34;4224:6;4213:9;4209:22;4199:32;;4269:7;4262:4;4258:2;4254:13;4250:27;4240:55;;4291:1;4288;4281:12;4240:55;4331:2;4318:16;4357:2;4349:6;4346:14;4343:34;;;4373:1;4370;4363:12;4343:34;4418:7;4413:2;4404:6;4400:2;4396:15;4392:24;4389:37;4386:57;;;4439:1;4436;4429:12;4386:57;3736:819;;4470:2;4462:11;;;;;-1:-1:-1;4492:6:111;;4545:2;4530:18;4517:32;;-1:-1:-1;3736:819:111;-1:-1:-1;;;3736:819:111:o;5785:530::-;5896:6;5904;5912;5965:2;5953:9;5944:7;5940:23;5936:32;5933:52;;;5981:1;5978;5971:12;5933:52;6021:9;6008:23;6054:18;6046:6;6043:30;6040:50;;;6086:1;6083;6076:12;6040:50;6109:22;;6165:3;6147:16;;;6143:26;6140:46;;;6182:1;6179;6172:12;6140:46;6205:2;6254;6239:18;;6226:32;;-1:-1:-1;6305:2:111;6290:18;;;6277:32;;5785:530;-1:-1:-1;;;5785:530:111:o;6320:258::-;6392:1;6402:113;6416:6;6413:1;6410:13;6402:113;;;6492:11;;;6486:18;6473:11;;;6466:39;6438:2;6431:10;6402:113;;;6533:6;6530:1;6527:13;6524:48;;;-1:-1:-1;;6568:1:111;6550:16;;6543:27;6320:258::o;6583:316::-;6624:3;6662:5;6656:12;6689:6;6684:3;6677:19;6705:63;6761:6;6754:4;6749:3;6745:14;6738:4;6731:5;6727:16;6705:63;:::i;:::-;6813:2;6801:15;6818:66;6797:88;6788:98;;;;6888:4;6784:109;;6583:316;-1:-1:-1;;6583:316:111:o;6904:288::-;7079:2;7068:9;7061:21;7042:4;7099:44;7139:2;7128:9;7124:18;7116:6;7099:44;:::i;:::-;7091:52;;7179:6;7174:2;7163:9;7159:18;7152:34;6904:288;;;;;:::o;8525:184::-;8577:77;8574:1;8567:88;8674:4;8671:1;8664:15;8698:4;8695:1;8688:15;8714:128;8754:3;8785:1;8781:6;8778:1;8775:13;8772:39;;;8791:18;;:::i;:::-;-1:-1:-1;8827:9:111;;8714:128::o;9094:184::-;9164:6;9217:2;9205:9;9196:7;9192:23;9188:32;9185:52;;;9233:1;9230;9223:12;9185:52;-1:-1:-1;9256:16:111;;9094:184;-1:-1:-1;9094:184:111:o;9693:125::-;9733:4;9761:1;9758;9755:8;9752:34;;;9766:18;;:::i;:::-;-1:-1:-1;9803:9:111;;9693:125::o;11344:633::-;11462:6;11470;11478;11486;11494;11547:3;11535:9;11526:7;11522:23;11518:33;11515:53;;;11564:1;11561;11554:12;11515:53;11603:9;11590:23;11622:39;11655:5;11622:39;:::i;:::-;11680:5;-1:-1:-1;11737:2:111;11722:18;;11709:32;11750:41;11709:32;11750:41;:::i;:::-;11344:633;;11810:7;;-1:-1:-1;;;;11864:2:111;11849:18;;11836:32;;11915:2;11900:18;;11887:32;;11966:3;11951:19;;;11938:33;;-1:-1:-1;11344:633:111:o;11982:228::-;12022:7;12148:1;12080:66;12076:74;12073:1;12070:81;12065:1;12058:9;12051:17;12047:105;12044:131;;;12155:18;;:::i;:::-;-1:-1:-1;12195:9:111;;11982:228::o;12215:274::-;12255:1;12281;12271:189;;12316:77;12313:1;12306:88;12417:4;12414:1;12407:15;12445:4;12442:1;12435:15;12271:189;-1:-1:-1;12474:9:111;;12215:274::o;12494:184::-;12546:77;12543:1;12536:88;12643:4;12640:1;12633:15;12667:4;12664:1;12657:15;13394:580;13471:4;13477:6;13537:11;13524:25;13627:66;13616:8;13600:14;13596:29;13592:102;13572:18;13568:127;13558:155;;13709:1;13706;13699:12;13558:155;13736:33;;13788:20;;;-1:-1:-1;13831:18:111;13820:30;;13817:50;;;13863:1;13860;13853:12;13817:50;13896:4;13884:17;;-1:-1:-1;13927:14:111;13923:27;;;13913:38;;13910:58;;;13964:1;13961;13954:12;13910:58;13394:580;;;;;:::o;14401:331::-;14506:9;14517;14559:8;14547:10;14544:24;14541:44;;;14581:1;14578;14571:12;14541:44;14610:6;14600:8;14597:20;14594:40;;;14630:1;14627;14620:12;14594:40;-1:-1:-1;;14656:23:111;;;14701:25;;;;;-1:-1:-1;14401:331:111:o;14737:372::-;14896:66;14858:19;;14980:11;;;;15011:2;15003:11;;15000:103;;;15090:2;15084;15077:3;15073:2;15069:12;15066:1;15062:20;15058:29;15054:2;15050:38;15046:47;15037:56;;15000:103;;;14737:372;;;;:::o;16483:277::-;16550:6;16603:2;16591:9;16582:7;16578:23;16574:32;16571:52;;;16619:1;16616;16609:12;16571:52;16651:9;16645:16;16704:5;16697:13;16690:21;16683:5;16680:32;16670:60;;16726:1;16723;16716:12;17696:247;17764:6;17817:2;17805:9;17796:7;17792:23;17788:32;17785:52;;;17833:1;17830;17823:12;17785:52;17865:9;17859:16;17884:29;17907:5;17884:29;:::i;17948:482::-;18037:1;18080:5;18037:1;18094:330;18115:7;18105:8;18102:21;18094:330;;;18234:4;18166:66;18162:77;18156:4;18153:87;18150:113;;;18243:18;;:::i;:::-;18293:7;18283:8;18279:22;18276:55;;;18313:16;;;;18276:55;18392:22;;;;18352:15;;;;18094:330;;;18098:3;17948:482;;;;;:::o;18435:866::-;18484:5;18514:8;18504:80;;-1:-1:-1;18555:1:111;18569:5;;18504:80;18603:4;18593:76;;-1:-1:-1;18640:1:111;18654:5;;18593:76;18685:4;18703:1;18698:59;;;;18771:1;18766:130;;;;18678:218;;18698:59;18728:1;18719:10;;18742:5;;;18766:130;18803:3;18793:8;18790:17;18787:43;;;18810:18;;:::i;:::-;-1:-1:-1;;18866:1:111;18852:16;;18881:5;;18678:218;;18980:2;18970:8;18967:16;18961:3;18955:4;18952:13;18948:36;18942:2;18932:8;18929:16;18924:2;18918:4;18915:12;18911:35;18908:77;18905:159;;;-1:-1:-1;19017:19:111;;;19049:5;;18905:159;19096:34;19121:8;19115:4;19096:34;:::i;:::-;19226:6;19158:66;19154:79;19145:7;19142:92;19139:118;;;19237:18;;:::i;:::-;19275:20;;18435:866;-1:-1:-1;;;18435:866:111:o;19306:131::-;19366:5;19395:36;19422:8;19416:4;19395:36;:::i;19442:140::-;19500:5;19529:47;19570:4;19560:8;19556:19;19550:4;19529:47;:::i;19994:274::-;20123:3;20161:6;20155:13;20177:53;20223:6;20218:3;20211:4;20203:6;20199:17;20177:53;:::i;:::-;20246:16;;;;;19994:274;-1:-1:-1;;19994:274:111:o;20631:219::-;20780:2;20769:9;20762:21;20743:4;20800:44;20840:2;20829:9;20825:18;20817:6;20800:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1852800","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"240","L2_ETH()":"261","L2_ETH_ADDRESS()":"260","QUOTE_USD()":"239","addDepositFor(address,address,uint256)":"infinite","addStake(uint32)":"infinite","addToken(address,address,address,uint8)":"infinite","balances(address,address)":"infinite","deposit()":"infinite","depositInfo(address,address)":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","lockTokenDeposit()":"5247","oracles(address)":"4810","owner()":"2385","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockBlock(address)":"2569","unlockStake()":"infinite","unlockTokenDeposit()":"22354","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,address,uint256)":"infinite"},"internal":{"_postOp(enum IPaymaster.PostOpMode,bytes calldata,uint256)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","getTokenValueOfEth(contract IERC20,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","L2_ETH()":"33032ec4","L2_ETH_ADDRESS()":"7b775d4d","QUOTE_USD()":"2f3e96a7","addDepositFor(address,address,uint256)":"382edd9e","addStake(uint32)":"0396cb60","addToken(address,address,address,uint8)":"1a02ef76","balances(address,address)":"c23f001f","deposit()":"d0e30db0","depositInfo(address,address)":"493b0170","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","lockTokenDeposit()":"cd8f80c2","oracles(address)":"addd5099","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,address,uint256)":"cc9c837c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"contract IBobaStraw\",\"name\":\"ethPriceOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ETH\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ETH_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QUOTE_USD\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IBobaStraw\",\"name\":\"tokenPriceOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"addToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"oracles\",\"outputs\":[{\"internalType\":\"contract IBobaStraw\",\"name\":\"feedRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenBase\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\",\"token\":\"the token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address,address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\",\"token\":\"the token deposit to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"addToken(address,address,address,uint8)\":{\"notice\":\"owner of the paymaster should add supported tokens\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"notice\":\"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \\\"whitelisted\\\" by the bundler. (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage) If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value on validation and asynchronously update the ratio\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/BobaDepositPaymaster.sol\":\"BobaDepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/BobaDepositPaymaster.sol\":{\"content\":\"/**\\n * Credit - DepositPaymaster.sol from https://github.com/eth-infinitism/account-abstraction\\n */\\n\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IBobaStraw.sol\\\";\\n\\n/**\\n * A token-based paymaster that accepts token deposits\\n * The deposit is only a safeguard: the user pays with his token balance.\\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\\n * thus the required deposit is to cover just one method call.\\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\\n * (but can't use the deposit for this or further operations)\\n *\\n * paymasterAndData holds the paymaster address followed by the token address to use.\\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\\n * (the standard rules ban accessing data of an external contract)\\n * It can only be used if it is \\\"whitelisted\\\" by the bundler.\\n * (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\\n * If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value\\n * on validation and asynchronously update the ratio\\n */\\ncontract BobaDepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n struct Oracle {\\n IBobaStraw feedRegistry;\\n address tokenBase;\\n uint8 tokenDecimals;\\n }\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n address public constant QUOTE_USD = 0x0000000000000000000000000000000000000348;\\n\\n // for alt-l1, treat this as the native token\\n address public constant L2_ETH_ADDRESS = 0x4200000000000000000000000000000000000006;\\n IERC20 public constant L2_ETH = IERC20(L2_ETH_ADDRESS);\\n\\n IBobaStraw private constant NULL_ORACLE = IBobaStraw(address(0));\\n\\n mapping(IERC20 => Oracle) public oracles;\\n mapping(IERC20 => mapping(address => uint256)) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n constructor(IEntryPoint _entryPoint, IBobaStraw ethPriceOracle) BasePaymaster(_entryPoint) {\\n require(ethPriceOracle != NULL_ORACLE, \\\"DepositPaymaster: Incorrect eth oracle\\\");\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n // set native token base\\n oracles[L2_ETH] = Oracle(ethPriceOracle, L2_ETH_ADDRESS, 18);\\n }\\n\\n /**\\n * owner of the paymaster should add supported tokens\\n */\\n function addToken(IERC20 token, IBobaStraw tokenPriceOracle, address base, uint8 tokenDecimals) external onlyOwner {\\n require(tokenPriceOracle != NULL_ORACLE, \\\"DepositPaymaster: Incorrect token oracle\\\");\\n require(oracles[token].feedRegistry == NULL_ORACLE);\\n oracles[token] = Oracle(tokenPriceOracle, base, tokenDecimals);\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param token the token to deposit.\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n // native tokens will fail here\\n token.safeTransferFrom(msg.sender, address(this), amount);\\n require(oracles[token].feedRegistry != NULL_ORACLE, \\\"DepositPaymaster: unsupported token\\\");\\n balances[token][account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[token][account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param token the token deposit to withdraw\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[token][msg.sender] -= amount;\\n token.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param token the token to use\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n Oracle memory oracleInfo = oracles[token];\\n require(oracleInfo.feedRegistry != NULL_ORACLE, \\\"DepositPaymaster: unsupported token\\\");\\n address base = oracleInfo.tokenBase;\\n uint256 ethPrice = uint256(oracles[L2_ETH].feedRegistry.latestAnswer(oracles[L2_ETH].tokenBase, QUOTE_USD));\\n uint256 tokenPrice = uint256(oracleInfo.feedRegistry.latestAnswer(base, QUOTE_USD));\\n uint256 ethPriceDecimals = uint256(oracles[L2_ETH].feedRegistry.decimals(oracles[L2_ETH].tokenBase, QUOTE_USD));\\n uint256 tokenPriceDecimals = uint256(oracleInfo.feedRegistry.decimals(base, QUOTE_USD));\\n uint256 requiredAmount = (ethBought * ethPrice * (10**tokenPriceDecimals)) / (tokenPrice * (10**ethPriceDecimals));\\n // there is no requiredAmount = 0 check, priceRatio from oracle shouldnt exceed ethBought\\n return ((requiredAmount * (10**oracleInfo.tokenDecimals)) / (10**oracles[L2_ETH].tokenDecimals));\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n require(paymasterAndData.length == 20+20, \\\"DepositPaymaster: paymasterAndData must specify token\\\");\\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[token][account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n token.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[token][account] -= actualTokenCost;\\n }\\n balances[token][owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x417a4e51b9cedcafc17fac6f05c39f28b70e30746a5073cadb77839c30447986\",\"license\":\"GPL-3.0\"},\"contracts/samples/IBobaStraw.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaStraw {\\n function latestRoundData(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n function getRoundData(\\n address base,\\n address quote,\\n uint80 _roundId\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n // V2 AggregatorInterface\\n\\n function latestAnswer(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n int256 answer\\n );\\n\\n function latestTimestamp(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint256 timestamp\\n );\\n\\n function decimals(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint8\\n );\\n}\\n\",\"keccak256\":\"0x9983613a78d9398928dae53c2701b419811ba055fd716dadf638a78d6b52577e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":11218,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"oracles","offset":0,"slot":"1","type":"t_mapping(t_contract(IERC20)4419,t_struct(Oracle)11188_storage)"},{"astId":11225,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"balances","offset":0,"slot":"2","type":"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))"},{"astId":11229,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"unlockBlock","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IBobaStraw)13138":{"encoding":"inplace","label":"contract IBobaStraw","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_contract(IERC20)4419,t_struct(Oracle)11188_storage)":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle)","numberOfBytes":"32","value":"t_struct(Oracle)11188_storage"},"t_struct(Oracle)11188_storage":{"encoding":"inplace","label":"struct BobaDepositPaymaster.Oracle","members":[{"astId":11183,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"feedRegistry","offset":0,"slot":"0","type":"t_contract(IBobaStraw)13138"},{"astId":11185,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"tokenBase","offset":0,"slot":"1","type":"t_address"},{"astId":11187,"contract":"contracts/samples/BobaDepositPaymaster.sol:BobaDepositPaymaster","label":"tokenDecimals","offset":20,"slot":"1","type":"t_uint8"}],"numberOfBytes":"64"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"addToken(address,address,address,uint8)":{"notice":"owner of the paymaster should add supported tokens"},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"notice":"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \"whitelisted\" by the bundler. (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage) If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value on validation and asynchronously update the ratio","version":1}}},"contracts/samples/BobaVerifyingPaymaster.sol":{"BobaVerifyingPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"address","name":"_verifyingSigner","type":"address"},{"internalType":"address","name":"_bobaDepositPaymaster","type":"address"},{"internalType":"address","name":"_approvedToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"APPROVE_FUNCTION_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_FOR_FUNCTION_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"approvedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bobaDepositPaymaster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"uint48","name":"validAfter","type":"uint48"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"paymasterAndData","type":"bytes"}],"name":"parsePaymasterAndData","outputs":[{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"senderNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyingSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_11849":{"entryPoint":null,"id":11849,"parameterSlots":4,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":126,"id":2932,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_addresst_address_fromMemory":{"entryPoint":231,"id":null,"parameterSlots":2,"returnSlots":4},"validator_revert_contract_IEntryPoint":{"entryPoint":206,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:892:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"316:574:111","statements":[{"body":{"nodeType":"YulBlock","src":"363:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"372:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"375:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"365:6:111"},"nodeType":"YulFunctionCall","src":"365:12:111"},"nodeType":"YulExpressionStatement","src":"365:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"337:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"346:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"333:3:111"},"nodeType":"YulFunctionCall","src":"333:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"358:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"329:3:111"},"nodeType":"YulFunctionCall","src":"329:33:111"},"nodeType":"YulIf","src":"326:53:111"},{"nodeType":"YulVariableDeclaration","src":"388:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"407:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"401:5:111"},"nodeType":"YulFunctionCall","src":"401:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"392:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"464:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"426:37:111"},"nodeType":"YulFunctionCall","src":"426:44:111"},"nodeType":"YulExpressionStatement","src":"426:44:111"},{"nodeType":"YulAssignment","src":"479:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"489:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"479:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"503:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"528:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"539:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"524:3:111"},"nodeType":"YulFunctionCall","src":"524:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"518:5:111"},"nodeType":"YulFunctionCall","src":"518:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"507:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"590:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"552:37:111"},"nodeType":"YulFunctionCall","src":"552:46:111"},"nodeType":"YulExpressionStatement","src":"552:46:111"},{"nodeType":"YulAssignment","src":"607:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"617:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"607:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"633:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"669:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"654:3:111"},"nodeType":"YulFunctionCall","src":"654:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"648:5:111"},"nodeType":"YulFunctionCall","src":"648:25:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"637:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"720:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"682:37:111"},"nodeType":"YulFunctionCall","src":"682:46:111"},"nodeType":"YulExpressionStatement","src":"682:46:111"},{"nodeType":"YulAssignment","src":"737:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"747:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"737:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"763:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"788:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"799:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"784:3:111"},"nodeType":"YulFunctionCall","src":"784:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"778:5:111"},"nodeType":"YulFunctionCall","src":"778:25:111"},"variables":[{"name":"value_3","nodeType":"YulTypedName","src":"767:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_3","nodeType":"YulIdentifier","src":"850:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"812:37:111"},"nodeType":"YulFunctionCall","src":"812:46:111"},"nodeType":"YulExpressionStatement","src":"812:46:111"},{"nodeType":"YulAssignment","src":"867:17:111","value":{"name":"value_3","nodeType":"YulIdentifier","src":"877:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"867:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_addresst_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"258:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"269:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"281:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"289:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"297:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"305:6:111","type":""}],"src":"163:727:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_addresst_address_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n let value_2 := mload(add(headStart, 64))\n validator_revert_contract_IEntryPoint(value_2)\n value2 := value_2\n let value_3 := mload(add(headStart, 96))\n validator_revert_contract_IEntryPoint(value_3)\n value3 := value_3\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c06040523480156200001157600080fd5b5060405162001d1b38038062001d1b8339810160408190526200003491620000e7565b8362000040336200007e565b6001600160a01b0390811660805292831660a052600180549284166001600160a01b031993841617905560028054919093169116179055506200014f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000e457600080fd5b50565b60008060008060808587031215620000fe57600080fd5b84516200010b81620000ce565b60208601519094506200011e81620000ce565b60408601519093506200013181620000ce565b60608601519092506200014481620000ce565b939692955090935050565b60805160a051611b6e620001ad600039600081816101ab0152610e010152600081816103ba015281816104e5015281816105af015281816106d20152818161079901528181610829015281816108dc0152610b630152611b6e6000f3fe60806040526004361061015f5760003560e01c8063a9a23409116100c0578063c23a5cea11610074578063d0e30db011610059578063d0e30db014610453578063f2fde38b1461045b578063f465c77e1461047b57600080fd5b8063c23a5cea1461041e578063c399ec881461043e57600080fd5b8063b0d691fe116100a5578063b0d691fe146103a8578063bab46259146103dc578063bb9fe6bf1461040957600080fd5b8063a9a2340914610354578063b02f786e1461037457600080fd5b80637d3c11621161011757806394d4ad60116100fc57806394d4ad60146102c957806394e1fc19146102f95780639c90b4431461032757600080fd5b80637d3c1162146102715780638da5cb5b1461029e57600080fd5b806323d9ac9b1161014857806323d9ac9b1461019957806356fd76da146101f7578063715018a61461025c57600080fd5b80630396cb6014610164578063205c287814610179575b600080fd5b610177610172366004611566565b6104a9565b005b34801561018557600080fd5b506101776101943660046115b5565b61055b565b3480156101a557600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020357600080fd5b5061022b7f382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf81565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101ee565b34801561026857600080fd5b506101776105f3565b34801561027d57600080fd5b506001546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101cd565b3480156102d557600080fd5b506102e96102e4366004611623565b610607565b6040516101ee9493929190611665565b34801561030557600080fd5b50610319610314366004611703565b610644565b6040519081526020016101ee565b34801561033357600080fd5b50610319610342366004611761565b60036020526000908152604090205481565b34801561036057600080fd5b5061017761036f36600461177e565b6106ae565b34801561038057600080fd5b5061022b7f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba81565b3480156103b457600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e857600080fd5b506002546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b506101776106c8565b34801561042a57600080fd5b50610177610439366004611761565b61074c565b34801561044a57600080fd5b506103196107f8565b6101776108ae565b34801561046757600080fd5b50610177610476366004611761565b610936565b34801561048757600080fd5b5061049b6104963660046117de565b6109f2565b6040516101ee929190611897565b6104b1610a16565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050505050565b610563610a16565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561053f57600080fd5b6105fb610a16565b6106056000610a97565b565b600080368161061a6054601487896118b9565b81019061062791906118e3565b909450925061063985605481896118b9565b949793965094505050565b600061064f84610b0c565b73ffffffffffffffffffffffffffffffffffffffff85351660009081526003602090815260409182902054915161068f9392469230928991899101611916565b6040516020818303038152906040528051906020012090509392505050565b6106b6610b4b565b6106c284848484610bea565b50505050565b6106d0610a16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073857600080fd5b505af11580156106c2573d6000803e3d6000fd5b610754610a16565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156107dd57600080fd5b505af11580156107f1573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a99190611973565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156107dd57600080fd5b61093e610a16565b73ffffffffffffffffffffffffffffffffffffffff81166109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109ef81610a97565b50565b606060006109fe610b4b565b610a09858585610c4c565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109dd565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060366000610b1f61012085018561198c565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016109dd565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016109dd565b6060600080803681610c656102e46101208b018b61198c565b929650909450925090506040811480610c7e5750604181145b610d0c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016109dd565b6000610d6f610d1c8b8787610644565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600360205260408120805492935090610da4836119f1565b9190505550610de98184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f4d92505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4760018686610f73565b6040518060200160405280600081525090965096505050505050610a0e565b610e7b610e7660608c018c61198c565b610fab565b80610e965750610e96610e9160608c018c61198c565b61111c565b610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f566572696679696e675061796d61737465723a20696e76616c6964206f70657260448201527f6174696f6e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b610f2e60008686610f73565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610f5c858561127f565b91509150610f69816112c4565b5090505b92915050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610f9b576000610f9e565b60015b60ff161717949350505050565b600060e48214610fbd57506000610f6d565b6000610fcd6088608485876118b9565b610fd691611a50565b9050366000610fe96024600487896118b9565b90925090506000610ffc83830184611761565b60025490915073ffffffffffffffffffffffffffffffffffffffff80831691161461102e576000945050505050610f6d565b600061103e60c86088898b6118b9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509361108b935085016020908101925085019050611a98565b5090507fffffffff0000000000000000000000000000000000000000000000000000000086167f095ea7b3000000000000000000000000000000000000000000000000000000001480156110f9575060015473ffffffffffffffffffffffffffffffffffffffff8281169116145b1561110d5760019650505050505050610f6d565b50600098975050505050505050565b6000610104821461112f57506000610f6d565b600061113f6088608485876118b9565b61114891611a50565b905036600061115b6024600487896118b9565b9092509050600061116e83830184611761565b60015490915073ffffffffffffffffffffffffffffffffffffffff8083169116146111a0576000945050505050610f6d565b60006111b060e86088898b6118b9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949550936111fd935085016020908101925085019050611ac6565b50909150507fffffffff0000000000000000000000000000000000000000000000000000000086167f382edd9e000000000000000000000000000000000000000000000000000000001480156110f9575060025473ffffffffffffffffffffffffffffffffffffffff82811691160361110d5760019650505050505050610f6d565b60008082516041036112b55760208301516040840151606085015160001a6112a987828585611477565b945094505050506112bd565b506000905060025b9250929050565b60008160048111156112d8576112d8611b09565b036112e05750565b60018160048111156112f4576112f4611b09565b0361135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109dd565b600281600481111561136f5761136f611b09565b036113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109dd565b60038160048111156113ea576113ea611b09565b036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114ae575060009050600361155d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611502573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115565760006001925092505061155d565b9150600090505b94509492505050565b60006020828403121561157857600080fd5b813563ffffffff8116811461158c57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ef57600080fd5b600080604083850312156115c857600080fd5b82356115d381611593565b946020939093013593505050565b60008083601f8401126115f357600080fd5b50813567ffffffffffffffff81111561160b57600080fd5b6020830191508360208285010111156112bd57600080fd5b6000806020838503121561163657600080fd5b823567ffffffffffffffff81111561164d57600080fd5b611659858286016115e1565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156116e257600080fd5b50919050565b803565ffffffffffff811681146116fe57600080fd5b919050565b60008060006060848603121561171857600080fd5b833567ffffffffffffffff81111561172f57600080fd5b61173b868287016116cf565b93505061174a602085016116e8565b9150611758604085016116e8565b90509250925092565b60006020828403121561177357600080fd5b813561158c81611593565b6000806000806060858703121561179457600080fd5b8435600381106117a357600080fd5b9350602085013567ffffffffffffffff8111156117bf57600080fd5b6117cb878288016115e1565b9598909750949560400135949350505050565b6000806000606084860312156117f357600080fd5b833567ffffffffffffffff81111561180a57600080fd5b611816868287016116cf565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561185257602081850181015186830182015201611836565b81811115611864576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006118aa604083018561182c565b90508260208301529392505050565b600080858511156118c957600080fd5b838611156118d657600080fd5b5050820193919092039150565b600080604083850312156118f657600080fd5b6118ff836116e8565b915061190d602084016116e8565b90509250929050565b60c08152600061192960c083018961182c565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561198557600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126119c157600080fd5b83018035915067ffffffffffffffff8211156119dc57600080fd5b6020019150368190038213156112bd57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a49577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a905780818660040360031b1b83161692505b505092915050565b60008060408385031215611aab57600080fd5b8251611ab681611593565b6020939093015192949293505050565b600080600060608486031215611adb57600080fd5b8351611ae681611593565b6020850151909350611af781611593565b80925050604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220008fcb302fb6ec149df4a9d2191ed74ed9cf53f9fcae24ea6f33f25f9d3975ba64736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1D1B CODESIZE SUB DUP1 PUSH3 0x1D1B DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xE7 JUMP JUMPDEST DUP4 PUSH3 0x40 CALLER PUSH3 0x7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE SWAP3 DUP4 AND PUSH1 0xA0 MSTORE PUSH1 0x1 DUP1 SLOAD SWAP3 DUP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP2 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE POP PUSH3 0x14F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH3 0xFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH3 0x10B DUP2 PUSH3 0xCE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x11E DUP2 PUSH3 0xCE JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD SWAP1 SWAP4 POP PUSH3 0x131 DUP2 PUSH3 0xCE JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x144 DUP2 PUSH3 0xCE JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x1B6E PUSH3 0x1AD PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x1AB ADD MSTORE PUSH2 0xE01 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x3BA ADD MSTORE DUP2 DUP2 PUSH2 0x4E5 ADD MSTORE DUP2 DUP2 PUSH2 0x5AF ADD MSTORE DUP2 DUP2 PUSH2 0x6D2 ADD MSTORE DUP2 DUP2 PUSH2 0x799 ADD MSTORE DUP2 DUP2 PUSH2 0x829 ADD MSTORE DUP2 DUP2 PUSH2 0x8DC ADD MSTORE PUSH2 0xB63 ADD MSTORE PUSH2 0x1B6E PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15F JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xC23A5CEA GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x41E JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xBAB46259 EQ PUSH2 0x3DC JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x409 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x354 JUMPI DUP1 PUSH4 0xB02F786E EQ PUSH2 0x374 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7D3C1162 GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x94D4AD60 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x94D4AD60 EQ PUSH2 0x2C9 JUMPI DUP1 PUSH4 0x94E1FC19 EQ PUSH2 0x2F9 JUMPI DUP1 PUSH4 0x9C90B443 EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7D3C1162 EQ PUSH2 0x271 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23D9AC9B GT PUSH2 0x148 JUMPI DUP1 PUSH4 0x23D9AC9B EQ PUSH2 0x199 JUMPI DUP1 PUSH4 0x56FD76DA EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x164 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x179 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x177 PUSH2 0x172 CALLDATASIZE PUSH1 0x4 PUSH2 0x1566 JUMP JUMPDEST PUSH2 0x4A9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x15B5 JUMP JUMPDEST PUSH2 0x55B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CD PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH32 0x382EDD9E648C4175CDA8ACDB1EB9C5D40F12D588410C9B3779D25B1AEA56ABBF DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x268 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x5F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 SLOAD PUSH2 0x1CD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E9 PUSH2 0x2E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1623 JUMP JUMPDEST PUSH2 0x607 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1665 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x314 CALLDATASIZE PUSH1 0x4 PUSH2 0x1703 JUMP JUMPDEST PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x360 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x36F CALLDATASIZE PUSH1 0x4 PUSH2 0x177E JUMP JUMPDEST PUSH2 0x6AE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x380 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH32 0x95EA7B334AE44009AA867BFB386F5C3B4B443AC6F0EE573FA91C4608FBADFBA DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CD PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x2 SLOAD PUSH2 0x1CD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x6C8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH2 0x74C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x177 PUSH2 0x8AE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH2 0x936 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x49B PUSH2 0x496 CALLDATASIZE PUSH1 0x4 PUSH2 0x17DE JUMP JUMPDEST PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP3 SWAP2 SWAP1 PUSH2 0x1897 JUMP JUMPDEST PUSH2 0x4B1 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x563 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5FB PUSH2 0xA16 JUMP JUMPDEST PUSH2 0x605 PUSH1 0x0 PUSH2 0xA97 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE DUP2 PUSH2 0x61A PUSH1 0x54 PUSH1 0x14 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x627 SWAP2 SWAP1 PUSH2 0x18E3 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x639 DUP6 PUSH1 0x54 DUP2 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64F DUP5 PUSH2 0xB0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD SWAP2 MLOAD PUSH2 0x68F SWAP4 SWAP3 CHAINID SWAP3 ADDRESS SWAP3 DUP10 SWAP2 DUP10 SWAP2 ADD PUSH2 0x1916 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6B6 PUSH2 0xB4B JUMP JUMPDEST PUSH2 0x6C2 DUP5 DUP5 DUP5 DUP5 PUSH2 0xBEA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6D0 PUSH2 0xA16 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x738 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x754 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x885 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8A9 SWAP2 SWAP1 PUSH2 0x1973 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x93E PUSH2 0xA16 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x9E6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x9EF DUP2 PUSH2 0xA97 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x9FE PUSH2 0xB4B JUMP JUMPDEST PUSH2 0xA09 DUP6 DUP6 DUP6 PUSH2 0xC4C JUMP JUMPDEST SWAP2 POP SWAP2 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x605 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x60 CALLDATASIZE PUSH1 0x0 PUSH2 0xB1F PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x198C JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP4 PUSH1 0x20 DUP2 DUP5 SUB SUB PUSH1 0x40 MLOAD SWAP5 POP PUSH1 0x20 DUP2 ADD DUP6 ADD PUSH1 0x40 MSTORE DUP1 DUP6 MSTORE DUP1 DUP3 PUSH1 0x20 DUP8 ADD CALLDATACOPY POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x605 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 CALLDATASIZE DUP2 PUSH2 0xC65 PUSH2 0x2E4 PUSH2 0x120 DUP12 ADD DUP12 PUSH2 0x198C JUMP JUMPDEST SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x40 DUP2 EQ DUP1 PUSH2 0xC7E JUMPI POP PUSH1 0x41 DUP2 EQ JUMPDEST PUSH2 0xD0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964207369676E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174757265206C656E67746820696E207061796D6173746572416E6444617461 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD6F PUSH2 0xD1C DUP12 DUP8 DUP8 PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 PUSH2 0xDA4 DUP4 PUSH2 0x19F1 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP PUSH2 0xDE9 DUP2 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xF4D SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE66 JUMPI PUSH2 0xE47 PUSH1 0x1 DUP7 DUP7 PUSH2 0xF73 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0xA0E JUMP JUMPDEST PUSH2 0xE7B PUSH2 0xE76 PUSH1 0x60 DUP13 ADD DUP13 PUSH2 0x198C JUMP JUMPDEST PUSH2 0xFAB JUMP JUMPDEST DUP1 PUSH2 0xE96 JUMPI POP PUSH2 0xE96 PUSH2 0xE91 PUSH1 0x60 DUP13 ADD DUP13 PUSH2 0x198C JUMP JUMPDEST PUSH2 0x111C JUMP JUMPDEST PUSH2 0xF22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964206F706572 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174696F6E000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH2 0xF2E PUSH1 0x0 DUP7 DUP7 PUSH2 0xF73 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP12 SWAP1 SWAP11 POP SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xF5C DUP6 DUP6 PUSH2 0x127F JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xF69 DUP2 PUSH2 0x12C4 JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0xF9B JUMPI PUSH1 0x0 PUSH2 0xF9E JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE4 DUP3 EQ PUSH2 0xFBD JUMPI POP PUSH1 0x0 PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFCD PUSH1 0x88 PUSH1 0x84 DUP6 DUP8 PUSH2 0x18B9 JUMP JUMPDEST PUSH2 0xFD6 SWAP2 PUSH2 0x1A50 JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0xFE9 PUSH1 0x24 PUSH1 0x4 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0xFFC DUP4 DUP4 ADD DUP5 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x102E JUMPI PUSH1 0x0 SWAP5 POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x103E PUSH1 0xC8 PUSH1 0x88 DUP10 DUP12 PUSH2 0x18B9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH2 0x108B SWAP4 POP DUP6 ADD PUSH1 0x20 SWAP1 DUP2 ADD SWAP3 POP DUP6 ADD SWAP1 POP PUSH2 0x1A98 JUMP JUMPDEST POP SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 EQ DUP1 ISZERO PUSH2 0x10F9 JUMPI POP PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO PUSH2 0x110D JUMPI PUSH1 0x1 SWAP7 POP POP POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST POP PUSH1 0x0 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x104 DUP3 EQ PUSH2 0x112F JUMPI POP PUSH1 0x0 PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x113F PUSH1 0x88 PUSH1 0x84 DUP6 DUP8 PUSH2 0x18B9 JUMP JUMPDEST PUSH2 0x1148 SWAP2 PUSH2 0x1A50 JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0x115B PUSH1 0x24 PUSH1 0x4 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0x116E DUP4 DUP4 ADD DUP5 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x1 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x11A0 JUMPI PUSH1 0x0 SWAP5 POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11B0 PUSH1 0xE8 PUSH1 0x88 DUP10 DUP12 PUSH2 0x18B9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH2 0x11FD SWAP4 POP DUP6 ADD PUSH1 0x20 SWAP1 DUP2 ADD SWAP3 POP DUP6 ADD SWAP1 POP PUSH2 0x1AC6 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH32 0x382EDD9E00000000000000000000000000000000000000000000000000000000 EQ DUP1 ISZERO PUSH2 0x10F9 JUMPI POP PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND SUB PUSH2 0x110D JUMPI PUSH1 0x1 SWAP7 POP POP POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x12B5 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x12A9 DUP8 DUP3 DUP6 DUP6 PUSH2 0x1477 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x12BD JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x12D8 JUMPI PUSH2 0x12D8 PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x12E0 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x12F4 JUMPI PUSH2 0x12F4 PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x135B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x136F JUMPI PUSH2 0x136F PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x13D6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x13EA JUMPI PUSH2 0x13EA PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x9EF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x14AE JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1502 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1556 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x155D JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x158C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x9EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x15D3 DUP2 PUSH2 0x1593 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x15F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x160B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x12BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1636 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x164D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1659 DUP6 DUP3 DUP7 ADD PUSH2 0x15E1 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE DUP3 PUSH1 0x60 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x80 DUP5 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x80 DUP5 DUP5 ADD ADD MSTORE PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP4 ADD ADD SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x16FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x172F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x173B DUP7 DUP3 DUP8 ADD PUSH2 0x16CF JUMP JUMPDEST SWAP4 POP POP PUSH2 0x174A PUSH1 0x20 DUP6 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1758 PUSH1 0x40 DUP6 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x158C DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1794 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17CB DUP8 DUP3 DUP9 ADD PUSH2 0x15E1 JUMP JUMPDEST SWAP6 SWAP9 SWAP1 SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x17F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x180A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1816 DUP7 DUP3 DUP8 ADD PUSH2 0x16CF JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 SWAP1 SWAP6 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1852 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1836 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1864 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x18AA PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x182C JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x18C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x18D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x18F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18FF DUP4 PUSH2 0x16E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x190D PUSH1 0x20 DUP5 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0xC0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1929 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x182C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x19C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x19DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x12BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1A49 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x4 DUP6 LT ISZERO PUSH2 0x1A90 JUMPI DUP1 DUP2 DUP7 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x1AB6 DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1ADB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x1AE6 DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x1AF7 DUP2 PUSH2 0x1593 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP DUP16 0xCB ADDRESS 0x2F 0xB6 0xEC EQ SWAP14 DELEGATECALL 0xA9 0xD2 NOT 0x1E 0xD7 0x4E 0xD9 0xCF MSTORE8 0xF9 0xFC 0xAE 0x24 0xEA PUSH16 0x33F25F9D3975BA64736F6C634300080F STOP CALLER ","sourceMap":"879:5955:66:-:0;;;1468:290;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1600:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;1623:34:66;;::::1;;::::0;1667:20:::1;:44:::0;;;;::::1;-1:-1:-1::0;;;;;;1667:44:66;;::::1;;::::0;;1721:13:::1;:30:::0;;;;;::::1;::::0;::::1;;::::0;;-1:-1:-1;879:5955:66;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:727::-;281:6;289;297;305;358:3;346:9;337:7;333:23;329:33;326:53;;;375:1;372;365:12;326:53;407:9;401:16;426:44;464:5;426:44;:::i;:::-;539:2;524:18;;518:25;489:5;;-1:-1:-1;552:46:111;518:25;552:46;:::i;:::-;669:2;654:18;;648:25;617:7;;-1:-1:-1;682:46:111;648:25;682:46;:::i;:::-;799:2;784:18;;778:25;747:7;;-1:-1:-1;812:46:111;778:25;812:46;:::i;:::-;163:727;;;;-1:-1:-1;163:727:111;;-1:-1:-1;;163:727:111:o;:::-;879:5955:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@APPROVE_FUNCTION_SELECTOR_11813":{"entryPoint":null,"id":11813,"parameterSlots":0,"returnSlots":0},"@DEPOSIT_FOR_FUNCTION_SELECTOR_11821":{"entryPoint":null,"id":11821,"parameterSlots":0,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":2582,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_packValidationData_9980":{"entryPoint":3955,"id":9980,"parameterSlots":3,"returnSlots":1},"@_postOp_7416":{"entryPoint":3050,"id":7416,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":2891,"id":7527,"parameterSlots":0,"returnSlots":0},"@_throwError_5521":{"entryPoint":4804,"id":5521,"parameterSlots":1,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":2711,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validateCallDataApprove_12118":{"entryPoint":4011,"id":12118,"parameterSlots":2,"returnSlots":1},"@_validateCallDataDeposit_12199":{"entryPoint":4380,"id":12199,"parameterSlots":2,"returnSlots":1},"@_validatePaymasterUserOp_12004":{"entryPoint":3148,"id":12004,"parameterSlots":3,"returnSlots":2},"@addStake_7469":{"entryPoint":1193,"id":7469,"parameterSlots":1,"returnSlots":0},"@approvedToken_11805":{"entryPoint":null,"id":11805,"parameterSlots":0,"returnSlots":0},"@bobaDepositPaymaster_11803":{"entryPoint":null,"id":11803,"parameterSlots":0,"returnSlots":0},"@deposit_7433":{"entryPoint":2222,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@getDeposit_7484":{"entryPoint":2040,"id":7484,"parameterSlots":0,"returnSlots":1},"@getHash_11904":{"entryPoint":1604,"id":11904,"parameterSlots":3,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@pack_11868":{"entryPoint":2828,"id":11868,"parameterSlots":1,"returnSlots":1},"@parsePaymasterAndData_12039":{"entryPoint":1543,"id":12039,"parameterSlots":2,"returnSlots":4},"@postOp_7395":{"entryPoint":1710,"id":7395,"parameterSlots":4,"returnSlots":0},"@recover_5594":{"entryPoint":3917,"id":5594,"parameterSlots":2,"returnSlots":1},"@renounceOwnership_2889":{"entryPoint":1523,"id":2889,"parameterSlots":0,"returnSlots":0},"@senderNonce_11853":{"entryPoint":null,"id":11853,"parameterSlots":0,"returnSlots":0},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@transferOwnership_2912":{"entryPoint":2358,"id":2912,"parameterSlots":1,"returnSlots":0},"@tryRecover_5567":{"entryPoint":4735,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":5239,"id":5735,"parameterSlots":4,"returnSlots":2},"@unlockStake_7496":{"entryPoint":1736,"id":7496,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":2546,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyingSigner_11801":{"entryPoint":null,"id":11801,"parameterSlots":0,"returnSlots":0},"@withdrawStake_7511":{"entryPoint":1868,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1371,"id":7451,"parameterSlots":2,"returnSlots":0},"abi_decode_bytes_calldata":{"entryPoint":5601,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_struct_UserOperation_calldata":{"entryPoint":5839,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":5985,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_address_payablet_uint256_fromMemory":{"entryPoint":6854,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":5557,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address_payablet_uint256_fromMemory":{"entryPoint":6808,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes_calldata_ptr":{"entryPoint":5667,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":6014,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6110,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48":{"entryPoint":5891,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":6515,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":5478,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint48t_uint48":{"entryPoint":6371,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48":{"entryPoint":5864,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_bytes":{"entryPoint":6188,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":6295,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed":{"entryPoint":6422,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_d26e0daa1e3de06cf3b41f98f2e7efd5b683a0ee78ec78511a62dcf2146f778c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":5733,"id":null,"parameterSlots":5,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":6540,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":6329,"id":null,"parameterSlots":4,"returnSlots":2},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes4":{"entryPoint":6736,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":6641,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x21":{"entryPoint":6921,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":5523,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:15416:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"899:125:111","statements":[{"nodeType":"YulAssignment","src":"909:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"932:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"909:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"951:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"974:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"962:3:111"},"nodeType":"YulFunctionCall","src":"962:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:74:111"},"nodeType":"YulExpressionStatement","src":"944:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"868:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"879:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"890:4:111","type":""}],"src":"798:226:111"},{"body":{"nodeType":"YulBlock","src":"1128:149:111","statements":[{"nodeType":"YulAssignment","src":"1138:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1150:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1161:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1146:3:111"},"nodeType":"YulFunctionCall","src":"1146:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1138:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1180:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1195:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1203:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1191:3:111"},"nodeType":"YulFunctionCall","src":"1191:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1173:6:111"},"nodeType":"YulFunctionCall","src":"1173:98:111"},"nodeType":"YulExpressionStatement","src":"1173:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1097:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1108:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1119:4:111","type":""}],"src":"1029:248:111"},{"body":{"nodeType":"YulBlock","src":"1354:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"1403:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1412:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1415:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1405:6:111"},"nodeType":"YulFunctionCall","src":"1405:12:111"},"nodeType":"YulExpressionStatement","src":"1405:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1382:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1390:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1378:3:111"},"nodeType":"YulFunctionCall","src":"1378:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"1397:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1374:3:111"},"nodeType":"YulFunctionCall","src":"1374:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1367:6:111"},"nodeType":"YulFunctionCall","src":"1367:35:111"},"nodeType":"YulIf","src":"1364:55:111"},{"nodeType":"YulAssignment","src":"1428:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1451:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1438:12:111"},"nodeType":"YulFunctionCall","src":"1438:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1428:6:111"}]},{"body":{"nodeType":"YulBlock","src":"1501:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1510:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1513:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1503:6:111"},"nodeType":"YulFunctionCall","src":"1503:12:111"},"nodeType":"YulExpressionStatement","src":"1503:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1473:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1481:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1470:2:111"},"nodeType":"YulFunctionCall","src":"1470:30:111"},"nodeType":"YulIf","src":"1467:50:111"},{"nodeType":"YulAssignment","src":"1526:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1542:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1550:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1538:3:111"},"nodeType":"YulFunctionCall","src":"1538:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"1526:8:111"}]},{"body":{"nodeType":"YulBlock","src":"1607:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1616:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1619:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1609:6:111"},"nodeType":"YulFunctionCall","src":"1609:12:111"},"nodeType":"YulExpressionStatement","src":"1609:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1578:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"1586:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1574:3:111"},"nodeType":"YulFunctionCall","src":"1574:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"1595:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1570:3:111"},"nodeType":"YulFunctionCall","src":"1570:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"1602:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1567:2:111"},"nodeType":"YulFunctionCall","src":"1567:39:111"},"nodeType":"YulIf","src":"1564:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1317:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"1325:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"1333:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1343:6:111","type":""}],"src":"1282:347:111"},{"body":{"nodeType":"YulBlock","src":"1723:320:111","statements":[{"body":{"nodeType":"YulBlock","src":"1769:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1778:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1781:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1771:6:111"},"nodeType":"YulFunctionCall","src":"1771:12:111"},"nodeType":"YulExpressionStatement","src":"1771:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1744:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1753:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1740:3:111"},"nodeType":"YulFunctionCall","src":"1740:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1765:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1736:3:111"},"nodeType":"YulFunctionCall","src":"1736:32:111"},"nodeType":"YulIf","src":"1733:52:111"},{"nodeType":"YulVariableDeclaration","src":"1794:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1821:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1808:12:111"},"nodeType":"YulFunctionCall","src":"1808:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1798:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1874:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1883:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1886:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1876:6:111"},"nodeType":"YulFunctionCall","src":"1876:12:111"},"nodeType":"YulExpressionStatement","src":"1876:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1846:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1854:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1843:2:111"},"nodeType":"YulFunctionCall","src":"1843:30:111"},"nodeType":"YulIf","src":"1840:50:111"},{"nodeType":"YulVariableDeclaration","src":"1899:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1955:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1966:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1951:3:111"},"nodeType":"YulFunctionCall","src":"1951:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1975:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1925:25:111"},"nodeType":"YulFunctionCall","src":"1925:58:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"1903:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"1913:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1992:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"2002:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1992:6:111"}]},{"nodeType":"YulAssignment","src":"2019:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"2029:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2019:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1681:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1692:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1704:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1712:6:111","type":""}],"src":"1634:409:111"},{"body":{"nodeType":"YulBlock","src":"2229:458:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2239:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2249:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2243:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2279:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2294:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2302:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2290:3:111"},"nodeType":"YulFunctionCall","src":"2290:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2272:6:111"},"nodeType":"YulFunctionCall","src":"2272:34:111"},"nodeType":"YulExpressionStatement","src":"2272:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2326:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2337:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2322:3:111"},"nodeType":"YulFunctionCall","src":"2322:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2346:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2354:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2342:3:111"},"nodeType":"YulFunctionCall","src":"2342:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2315:6:111"},"nodeType":"YulFunctionCall","src":"2315:43:111"},"nodeType":"YulExpressionStatement","src":"2315:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2378:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2389:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2374:3:111"},"nodeType":"YulFunctionCall","src":"2374:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2394:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2367:6:111"},"nodeType":"YulFunctionCall","src":"2367:30:111"},"nodeType":"YulExpressionStatement","src":"2367:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2417:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2428:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2413:3:111"},"nodeType":"YulFunctionCall","src":"2413:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2433:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2406:6:111"},"nodeType":"YulFunctionCall","src":"2406:34:111"},"nodeType":"YulExpressionStatement","src":"2406:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2466:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2477:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2462:3:111"},"nodeType":"YulFunctionCall","src":"2462:19:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2483:6:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2491:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2449:12:111"},"nodeType":"YulFunctionCall","src":"2449:49:111"},"nodeType":"YulExpressionStatement","src":"2449:49:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2522:9:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2533:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2518:3:111"},"nodeType":"YulFunctionCall","src":"2518:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"2542:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2514:3:111"},"nodeType":"YulFunctionCall","src":"2514:32:111"},{"kind":"number","nodeType":"YulLiteral","src":"2548:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2507:6:111"},"nodeType":"YulFunctionCall","src":"2507:43:111"},"nodeType":"YulExpressionStatement","src":"2507:43:111"},{"nodeType":"YulAssignment","src":"2559:122:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2575:9:111"},{"arguments":[{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"2594:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2602:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2590:3:111"},"nodeType":"YulFunctionCall","src":"2590:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2607:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2586:3:111"},"nodeType":"YulFunctionCall","src":"2586:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2571:3:111"},"nodeType":"YulFunctionCall","src":"2571:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"2677:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2567:3:111"},"nodeType":"YulFunctionCall","src":"2567:114:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2559:4:111"}]}]},"name":"abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2174:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2185:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2193:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2201:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2209:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2220:4:111","type":""}],"src":"2048:639:111"},{"body":{"nodeType":"YulBlock","src":"2768:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"2808:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2817:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2820:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2810:6:111"},"nodeType":"YulFunctionCall","src":"2810:12:111"},"nodeType":"YulExpressionStatement","src":"2810:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"2789:3:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2794:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2785:3:111"},"nodeType":"YulFunctionCall","src":"2785:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2803:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2781:3:111"},"nodeType":"YulFunctionCall","src":"2781:26:111"},"nodeType":"YulIf","src":"2778:46:111"},{"nodeType":"YulAssignment","src":"2833:15:111","value":{"name":"offset","nodeType":"YulIdentifier","src":"2842:6:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2833:5:111"}]}]},"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2742:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2750:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2758:5:111","type":""}],"src":"2692:162:111"},{"body":{"nodeType":"YulBlock","src":"2907:119:111","statements":[{"nodeType":"YulAssignment","src":"2917:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2939:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2926:12:111"},"nodeType":"YulFunctionCall","src":"2926:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2917:5:111"}]},{"body":{"nodeType":"YulBlock","src":"3004:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3013:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3016:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3006:6:111"},"nodeType":"YulFunctionCall","src":"3006:12:111"},"nodeType":"YulExpressionStatement","src":"3006:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2968:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2979:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2986:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2975:3:111"},"nodeType":"YulFunctionCall","src":"2975:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2965:2:111"},"nodeType":"YulFunctionCall","src":"2965:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2958:6:111"},"nodeType":"YulFunctionCall","src":"2958:45:111"},"nodeType":"YulIf","src":"2955:65:111"}]},"name":"abi_decode_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2886:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2897:5:111","type":""}],"src":"2859:167:111"},{"body":{"nodeType":"YulBlock","src":"3167:377:111","statements":[{"body":{"nodeType":"YulBlock","src":"3213:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3222:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3225:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3215:6:111"},"nodeType":"YulFunctionCall","src":"3215:12:111"},"nodeType":"YulExpressionStatement","src":"3215:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3188:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3197:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3184:3:111"},"nodeType":"YulFunctionCall","src":"3184:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3209:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3180:3:111"},"nodeType":"YulFunctionCall","src":"3180:32:111"},"nodeType":"YulIf","src":"3177:52:111"},{"nodeType":"YulVariableDeclaration","src":"3238:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3265:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3252:12:111"},"nodeType":"YulFunctionCall","src":"3252:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3242:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3318:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3327:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3330:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3320:6:111"},"nodeType":"YulFunctionCall","src":"3320:12:111"},"nodeType":"YulExpressionStatement","src":"3320:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3290:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3298:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3287:2:111"},"nodeType":"YulFunctionCall","src":"3287:30:111"},"nodeType":"YulIf","src":"3284:50:111"},{"nodeType":"YulAssignment","src":"3343:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3398:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3409:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3394:3:111"},"nodeType":"YulFunctionCall","src":"3394:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3418:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"3353:40:111"},"nodeType":"YulFunctionCall","src":"3353:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3343:6:111"}]},{"nodeType":"YulAssignment","src":"3435:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3467:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3478:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3463:3:111"},"nodeType":"YulFunctionCall","src":"3463:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"3445:17:111"},"nodeType":"YulFunctionCall","src":"3445:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3435:6:111"}]},{"nodeType":"YulAssignment","src":"3491:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3523:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3534:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3519:3:111"},"nodeType":"YulFunctionCall","src":"3519:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"3501:17:111"},"nodeType":"YulFunctionCall","src":"3501:37:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3491:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3117:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3128:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3140:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3148:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3156:6:111","type":""}],"src":"3031:513:111"},{"body":{"nodeType":"YulBlock","src":"3650:76:111","statements":[{"nodeType":"YulAssignment","src":"3660:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3683:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3668:3:111"},"nodeType":"YulFunctionCall","src":"3668:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3660:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3702:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3713:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3695:6:111"},"nodeType":"YulFunctionCall","src":"3695:25:111"},"nodeType":"YulExpressionStatement","src":"3695:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3619:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3630:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3641:4:111","type":""}],"src":"3549:177:111"},{"body":{"nodeType":"YulBlock","src":"3801:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3847:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3856:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3859:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3849:6:111"},"nodeType":"YulFunctionCall","src":"3849:12:111"},"nodeType":"YulExpressionStatement","src":"3849:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3822:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3831:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3818:3:111"},"nodeType":"YulFunctionCall","src":"3818:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3843:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3814:3:111"},"nodeType":"YulFunctionCall","src":"3814:32:111"},"nodeType":"YulIf","src":"3811:52:111"},{"nodeType":"YulVariableDeclaration","src":"3872:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3898:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3885:12:111"},"nodeType":"YulFunctionCall","src":"3885:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3876:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3950:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3917:32:111"},"nodeType":"YulFunctionCall","src":"3917:39:111"},"nodeType":"YulExpressionStatement","src":"3917:39:111"},{"nodeType":"YulAssignment","src":"3965:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3975:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3965:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3767:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3778:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3790:6:111","type":""}],"src":"3731:255:111"},{"body":{"nodeType":"YulBlock","src":"4092:76:111","statements":[{"nodeType":"YulAssignment","src":"4102:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4114:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4125:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4110:3:111"},"nodeType":"YulFunctionCall","src":"4110:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4102:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4144:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"4155:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4137:6:111"},"nodeType":"YulFunctionCall","src":"4137:25:111"},"nodeType":"YulExpressionStatement","src":"4137:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4061:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4072:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4083:4:111","type":""}],"src":"3991:177:111"},{"body":{"nodeType":"YulBlock","src":"4312:498:111","statements":[{"body":{"nodeType":"YulBlock","src":"4358:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4367:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4370:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4360:6:111"},"nodeType":"YulFunctionCall","src":"4360:12:111"},"nodeType":"YulExpressionStatement","src":"4360:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4333:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4329:3:111"},"nodeType":"YulFunctionCall","src":"4329:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4354:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4325:3:111"},"nodeType":"YulFunctionCall","src":"4325:32:111"},"nodeType":"YulIf","src":"4322:52:111"},{"nodeType":"YulVariableDeclaration","src":"4383:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4409:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4396:12:111"},"nodeType":"YulFunctionCall","src":"4396:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4387:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4452:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4461:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4464:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4454:6:111"},"nodeType":"YulFunctionCall","src":"4454:12:111"},"nodeType":"YulExpressionStatement","src":"4454:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4441:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4448:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4438:2:111"},"nodeType":"YulFunctionCall","src":"4438:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4431:6:111"},"nodeType":"YulFunctionCall","src":"4431:20:111"},"nodeType":"YulIf","src":"4428:40:111"},{"nodeType":"YulAssignment","src":"4477:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4487:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4477:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4501:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4532:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4543:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4528:3:111"},"nodeType":"YulFunctionCall","src":"4528:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4515:12:111"},"nodeType":"YulFunctionCall","src":"4515:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4505:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4590:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4599:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4602:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4592:6:111"},"nodeType":"YulFunctionCall","src":"4592:12:111"},"nodeType":"YulExpressionStatement","src":"4592:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4562:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4570:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4559:2:111"},"nodeType":"YulFunctionCall","src":"4559:30:111"},"nodeType":"YulIf","src":"4556:50:111"},{"nodeType":"YulVariableDeclaration","src":"4615:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4671:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4682:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4667:3:111"},"nodeType":"YulFunctionCall","src":"4667:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4691:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"4641:25:111"},"nodeType":"YulFunctionCall","src":"4641:58:111"},"variables":[{"name":"value1_1","nodeType":"YulTypedName","src":"4619:8:111","type":""},{"name":"value2_1","nodeType":"YulTypedName","src":"4629:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4708:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4718:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4708:6:111"}]},{"nodeType":"YulAssignment","src":"4735:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4745:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4735:6:111"}]},{"nodeType":"YulAssignment","src":"4762:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4789:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4800:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4785:3:111"},"nodeType":"YulFunctionCall","src":"4785:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4772:12:111"},"nodeType":"YulFunctionCall","src":"4772:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4762:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4254:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4265:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4277:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4285:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4293:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4301:6:111","type":""}],"src":"4173:637:111"},{"body":{"nodeType":"YulBlock","src":"4937:125:111","statements":[{"nodeType":"YulAssignment","src":"4947:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4959:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4970:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4955:3:111"},"nodeType":"YulFunctionCall","src":"4955:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4947:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4989:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5004:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5012:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5000:3:111"},"nodeType":"YulFunctionCall","src":"5000:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4982:6:111"},"nodeType":"YulFunctionCall","src":"4982:74:111"},"nodeType":"YulExpressionStatement","src":"4982:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4906:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4917:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4928:4:111","type":""}],"src":"4815:247:111"},{"body":{"nodeType":"YulBlock","src":"5145:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5191:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5200:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5203:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5193:6:111"},"nodeType":"YulFunctionCall","src":"5193:12:111"},"nodeType":"YulExpressionStatement","src":"5193:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5166:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5175:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5162:3:111"},"nodeType":"YulFunctionCall","src":"5162:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5187:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5158:3:111"},"nodeType":"YulFunctionCall","src":"5158:32:111"},"nodeType":"YulIf","src":"5155:52:111"},{"nodeType":"YulVariableDeclaration","src":"5216:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5242:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5229:12:111"},"nodeType":"YulFunctionCall","src":"5229:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5220:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5294:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"5261:32:111"},"nodeType":"YulFunctionCall","src":"5261:39:111"},"nodeType":"YulExpressionStatement","src":"5261:39:111"},{"nodeType":"YulAssignment","src":"5309:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5319:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5309:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5111:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5122:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5134:6:111","type":""}],"src":"5067:263:111"},{"body":{"nodeType":"YulBlock","src":"5473:367:111","statements":[{"body":{"nodeType":"YulBlock","src":"5519:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5528:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5531:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5521:6:111"},"nodeType":"YulFunctionCall","src":"5521:12:111"},"nodeType":"YulExpressionStatement","src":"5521:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5494:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5503:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5490:3:111"},"nodeType":"YulFunctionCall","src":"5490:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5515:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5486:3:111"},"nodeType":"YulFunctionCall","src":"5486:32:111"},"nodeType":"YulIf","src":"5483:52:111"},{"nodeType":"YulVariableDeclaration","src":"5544:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5571:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5558:12:111"},"nodeType":"YulFunctionCall","src":"5558:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5548:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5624:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5633:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5636:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5626:6:111"},"nodeType":"YulFunctionCall","src":"5626:12:111"},"nodeType":"YulExpressionStatement","src":"5626:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5596:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5604:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5593:2:111"},"nodeType":"YulFunctionCall","src":"5593:30:111"},"nodeType":"YulIf","src":"5590:50:111"},{"nodeType":"YulAssignment","src":"5649:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5704:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5715:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5700:3:111"},"nodeType":"YulFunctionCall","src":"5700:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5724:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"5659:40:111"},"nodeType":"YulFunctionCall","src":"5659:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5649:6:111"}]},{"nodeType":"YulAssignment","src":"5741:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5768:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5779:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5764:3:111"},"nodeType":"YulFunctionCall","src":"5764:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5751:12:111"},"nodeType":"YulFunctionCall","src":"5751:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5741:6:111"}]},{"nodeType":"YulAssignment","src":"5792:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5830:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5815:3:111"},"nodeType":"YulFunctionCall","src":"5815:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5802:12:111"},"nodeType":"YulFunctionCall","src":"5802:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5792:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5423:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5434:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5446:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5454:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5462:6:111","type":""}],"src":"5335:505:111"},{"body":{"nodeType":"YulBlock","src":"5894:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5904:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5924:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5918:5:111"},"nodeType":"YulFunctionCall","src":"5918:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5908:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5946:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5951:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5939:6:111"},"nodeType":"YulFunctionCall","src":"5939:19:111"},"nodeType":"YulExpressionStatement","src":"5939:19:111"},{"nodeType":"YulVariableDeclaration","src":"5967:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5976:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5971:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6038:110:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6052:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6062:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6056:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6094:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6099:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6090:3:111"},"nodeType":"YulFunctionCall","src":"6090:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6103:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6086:3:111"},"nodeType":"YulFunctionCall","src":"6086:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6122:5:111"},{"name":"i","nodeType":"YulIdentifier","src":"6129:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6118:3:111"},"nodeType":"YulFunctionCall","src":"6118:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6133:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6114:3:111"},"nodeType":"YulFunctionCall","src":"6114:22:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6108:5:111"},"nodeType":"YulFunctionCall","src":"6108:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6079:6:111"},"nodeType":"YulFunctionCall","src":"6079:59:111"},"nodeType":"YulExpressionStatement","src":"6079:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5997:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6000:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5994:2:111"},"nodeType":"YulFunctionCall","src":"5994:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6008:21:111","statements":[{"nodeType":"YulAssignment","src":"6010:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6019:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6022:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6015:3:111"},"nodeType":"YulFunctionCall","src":"6015:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"6010:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5990:3:111","statements":[]},"src":"5986:162:111"},{"body":{"nodeType":"YulBlock","src":"6182:62:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6211:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"6216:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6207:3:111"},"nodeType":"YulFunctionCall","src":"6207:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6225:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6203:3:111"},"nodeType":"YulFunctionCall","src":"6203:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"6232:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6196:6:111"},"nodeType":"YulFunctionCall","src":"6196:38:111"},"nodeType":"YulExpressionStatement","src":"6196:38:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6163:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6166:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6160:2:111"},"nodeType":"YulFunctionCall","src":"6160:13:111"},"nodeType":"YulIf","src":"6157:87:111"},{"nodeType":"YulAssignment","src":"6253:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6268:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6281:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6289:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6277:3:111"},"nodeType":"YulFunctionCall","src":"6277:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"6294:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6273:3:111"},"nodeType":"YulFunctionCall","src":"6273:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6264:3:111"},"nodeType":"YulFunctionCall","src":"6264:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"6364:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6260:3:111"},"nodeType":"YulFunctionCall","src":"6260:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"6253:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5871:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"5878:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5886:3:111","type":""}],"src":"5845:530:111"},{"body":{"nodeType":"YulBlock","src":"6527:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6544:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6555:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6537:6:111"},"nodeType":"YulFunctionCall","src":"6537:21:111"},"nodeType":"YulExpressionStatement","src":"6537:21:111"},{"nodeType":"YulAssignment","src":"6567:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6592:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6604:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6615:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6600:3:111"},"nodeType":"YulFunctionCall","src":"6600:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"6575:16:111"},"nodeType":"YulFunctionCall","src":"6575:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6567:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6650:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6635:3:111"},"nodeType":"YulFunctionCall","src":"6635:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6655:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6628:6:111"},"nodeType":"YulFunctionCall","src":"6628:34:111"},"nodeType":"YulExpressionStatement","src":"6628:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6488:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6499:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6507:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6518:4:111","type":""}],"src":"6380:288:111"},{"body":{"nodeType":"YulBlock","src":"6772:93:111","statements":[{"nodeType":"YulAssignment","src":"6782:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6794:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6805:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6790:3:111"},"nodeType":"YulFunctionCall","src":"6790:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6782:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6824:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6839:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6847:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6835:3:111"},"nodeType":"YulFunctionCall","src":"6835:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6817:6:111"},"nodeType":"YulFunctionCall","src":"6817:42:111"},"nodeType":"YulExpressionStatement","src":"6817:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6741:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6752:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6763:4:111","type":""}],"src":"6673:192:111"},{"body":{"nodeType":"YulBlock","src":"7015:168:111","statements":[{"nodeType":"YulAssignment","src":"7025:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7037:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7048:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7033:3:111"},"nodeType":"YulFunctionCall","src":"7033:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7025:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7067:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7082:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7090:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7078:3:111"},"nodeType":"YulFunctionCall","src":"7078:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7060:6:111"},"nodeType":"YulFunctionCall","src":"7060:74:111"},"nodeType":"YulExpressionStatement","src":"7060:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7154:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7165:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7150:3:111"},"nodeType":"YulFunctionCall","src":"7150:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7170:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7143:6:111"},"nodeType":"YulFunctionCall","src":"7143:34:111"},"nodeType":"YulExpressionStatement","src":"7143:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6976:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6987:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6995:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7006:4:111","type":""}],"src":"6870:313:111"},{"body":{"nodeType":"YulBlock","src":"7318:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"7356:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7365:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7368:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7358:6:111"},"nodeType":"YulFunctionCall","src":"7358:12:111"},"nodeType":"YulExpressionStatement","src":"7358:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"7334:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"7346:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7331:2:111"},"nodeType":"YulFunctionCall","src":"7331:24:111"},"nodeType":"YulIf","src":"7328:44:111"},{"body":{"nodeType":"YulBlock","src":"7405:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7414:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7417:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7407:6:111"},"nodeType":"YulFunctionCall","src":"7407:12:111"},"nodeType":"YulExpressionStatement","src":"7407:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7387:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"7397:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7384:2:111"},"nodeType":"YulFunctionCall","src":"7384:20:111"},"nodeType":"YulIf","src":"7381:40:111"},{"nodeType":"YulAssignment","src":"7430:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7447:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7455:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7443:3:111"},"nodeType":"YulFunctionCall","src":"7443:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"7430:9:111"}]},{"nodeType":"YulAssignment","src":"7475:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7492:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7502:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7488:3:111"},"nodeType":"YulFunctionCall","src":"7488:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"7475:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"7252:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"7260:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"7268:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"7280:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"7293:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"7304:9:111","type":""}],"src":"7188:331:111"},{"body":{"nodeType":"YulBlock","src":"7609:171:111","statements":[{"body":{"nodeType":"YulBlock","src":"7655:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7664:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7667:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7657:6:111"},"nodeType":"YulFunctionCall","src":"7657:12:111"},"nodeType":"YulExpressionStatement","src":"7657:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7630:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7639:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7626:3:111"},"nodeType":"YulFunctionCall","src":"7626:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7651:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7622:3:111"},"nodeType":"YulFunctionCall","src":"7622:32:111"},"nodeType":"YulIf","src":"7619:52:111"},{"nodeType":"YulAssignment","src":"7680:38:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7708:9:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7690:17:111"},"nodeType":"YulFunctionCall","src":"7690:28:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7680:6:111"}]},{"nodeType":"YulAssignment","src":"7727:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7770:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7755:3:111"},"nodeType":"YulFunctionCall","src":"7755:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7737:17:111"},"nodeType":"YulFunctionCall","src":"7737:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7727:6:111"}]}]},"name":"abi_decode_tuple_t_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7567:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7578:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7590:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7598:6:111","type":""}],"src":"7524:256:111"},{"body":{"nodeType":"YulBlock","src":"8040:417:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8057:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8068:3:111","type":"","value":"192"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8050:6:111"},"nodeType":"YulFunctionCall","src":"8050:22:111"},"nodeType":"YulExpressionStatement","src":"8050:22:111"},{"nodeType":"YulAssignment","src":"8081:53:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8106:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8118:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8129:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8114:3:111"},"nodeType":"YulFunctionCall","src":"8114:19:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"8089:16:111"},"nodeType":"YulFunctionCall","src":"8089:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8081:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8154:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8165:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8150:3:111"},"nodeType":"YulFunctionCall","src":"8150:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"8170:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8143:6:111"},"nodeType":"YulFunctionCall","src":"8143:34:111"},"nodeType":"YulExpressionStatement","src":"8143:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8197:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8208:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8193:3:111"},"nodeType":"YulFunctionCall","src":"8193:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"8217:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8225:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8213:3:111"},"nodeType":"YulFunctionCall","src":"8213:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8186:6:111"},"nodeType":"YulFunctionCall","src":"8186:83:111"},"nodeType":"YulExpressionStatement","src":"8186:83:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8289:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8300:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8285:3:111"},"nodeType":"YulFunctionCall","src":"8285:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"8305:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8278:6:111"},"nodeType":"YulFunctionCall","src":"8278:34:111"},"nodeType":"YulExpressionStatement","src":"8278:34:111"},{"nodeType":"YulVariableDeclaration","src":"8321:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8331:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8325:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8365:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8376:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8361:3:111"},"nodeType":"YulFunctionCall","src":"8361:19:111"},{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"8386:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8394:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8382:3:111"},"nodeType":"YulFunctionCall","src":"8382:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8354:6:111"},"nodeType":"YulFunctionCall","src":"8354:44:111"},"nodeType":"YulExpressionStatement","src":"8354:44:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8418:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8429:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8414:3:111"},"nodeType":"YulFunctionCall","src":"8414:19:111"},{"arguments":[{"name":"value5","nodeType":"YulIdentifier","src":"8439:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8447:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8435:3:111"},"nodeType":"YulFunctionCall","src":"8435:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8407:6:111"},"nodeType":"YulFunctionCall","src":"8407:44:111"},"nodeType":"YulExpressionStatement","src":"8407:44:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7969:9:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"7980:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"7988:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7996:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8004:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8012:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8020:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8031:4:111","type":""}],"src":"7785:672:111"},{"body":{"nodeType":"YulBlock","src":"8579:125:111","statements":[{"nodeType":"YulAssignment","src":"8589:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8601:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8612:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8597:3:111"},"nodeType":"YulFunctionCall","src":"8597:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8589:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8631:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8646:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8654:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8642:3:111"},"nodeType":"YulFunctionCall","src":"8642:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8624:6:111"},"nodeType":"YulFunctionCall","src":"8624:74:111"},"nodeType":"YulExpressionStatement","src":"8624:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8548:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8559:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8570:4:111","type":""}],"src":"8462:242:111"},{"body":{"nodeType":"YulBlock","src":"8790:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"8836:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8845:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8848:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8838:6:111"},"nodeType":"YulFunctionCall","src":"8838:12:111"},"nodeType":"YulExpressionStatement","src":"8838:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8811:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8820:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8807:3:111"},"nodeType":"YulFunctionCall","src":"8807:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8832:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8803:3:111"},"nodeType":"YulFunctionCall","src":"8803:32:111"},"nodeType":"YulIf","src":"8800:52:111"},{"nodeType":"YulAssignment","src":"8861:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8877:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8871:5:111"},"nodeType":"YulFunctionCall","src":"8871:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8861:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8756:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8767:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8779:6:111","type":""}],"src":"8709:184:111"},{"body":{"nodeType":"YulBlock","src":"9072:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9089:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9100:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9082:6:111"},"nodeType":"YulFunctionCall","src":"9082:21:111"},"nodeType":"YulExpressionStatement","src":"9082:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9123:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9134:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9119:3:111"},"nodeType":"YulFunctionCall","src":"9119:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9139:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9112:6:111"},"nodeType":"YulFunctionCall","src":"9112:30:111"},"nodeType":"YulExpressionStatement","src":"9112:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9162:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9173:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9158:3:111"},"nodeType":"YulFunctionCall","src":"9158:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"9178:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9151:6:111"},"nodeType":"YulFunctionCall","src":"9151:62:111"},"nodeType":"YulExpressionStatement","src":"9151:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9233:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9244:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9229:3:111"},"nodeType":"YulFunctionCall","src":"9229:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"9249:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9222:6:111"},"nodeType":"YulFunctionCall","src":"9222:36:111"},"nodeType":"YulExpressionStatement","src":"9222:36:111"},{"nodeType":"YulAssignment","src":"9267:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9279:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9290:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9275:3:111"},"nodeType":"YulFunctionCall","src":"9275:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9267:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9049:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9063:4:111","type":""}],"src":"8898:402:111"},{"body":{"nodeType":"YulBlock","src":"9479:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9496:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9507:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9489:6:111"},"nodeType":"YulFunctionCall","src":"9489:21:111"},"nodeType":"YulExpressionStatement","src":"9489:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9530:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9541:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9526:3:111"},"nodeType":"YulFunctionCall","src":"9526:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9546:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9519:6:111"},"nodeType":"YulFunctionCall","src":"9519:30:111"},"nodeType":"YulExpressionStatement","src":"9519:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9569:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9580:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9565:3:111"},"nodeType":"YulFunctionCall","src":"9565:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"9585:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9558:6:111"},"nodeType":"YulFunctionCall","src":"9558:62:111"},"nodeType":"YulExpressionStatement","src":"9558:62:111"},{"nodeType":"YulAssignment","src":"9629:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9652:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9637:3:111"},"nodeType":"YulFunctionCall","src":"9637:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9629:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9456:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9470:4:111","type":""}],"src":"9305:356:111"},{"body":{"nodeType":"YulBlock","src":"9760:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9770:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"9809:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9796:12:111"},"nodeType":"YulFunctionCall","src":"9796:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"9774:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9969:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9978:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9981:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9971:6:111"},"nodeType":"YulFunctionCall","src":"9971:12:111"},"nodeType":"YulExpressionStatement","src":"9971:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9844:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9872:12:111"},"nodeType":"YulFunctionCall","src":"9872:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"9888:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9868:3:111"},"nodeType":"YulFunctionCall","src":"9868:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"9899:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9864:3:111"},"nodeType":"YulFunctionCall","src":"9864:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9840:3:111"},"nodeType":"YulFunctionCall","src":"9840:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9833:6:111"},"nodeType":"YulFunctionCall","src":"9833:135:111"},"nodeType":"YulIf","src":"9830:155:111"},{"nodeType":"YulVariableDeclaration","src":"9994:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"10012:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"10022:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10008:3:111"},"nodeType":"YulFunctionCall","src":"10008:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"9998:6:111","type":""}]},{"nodeType":"YulAssignment","src":"10050:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"10073:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10060:12:111"},"nodeType":"YulFunctionCall","src":"10060:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"10050:6:111"}]},{"body":{"nodeType":"YulBlock","src":"10123:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10132:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10135:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10125:6:111"},"nodeType":"YulFunctionCall","src":"10125:12:111"},"nodeType":"YulExpressionStatement","src":"10125:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"10095:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10103:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10092:2:111"},"nodeType":"YulFunctionCall","src":"10092:30:111"},"nodeType":"YulIf","src":"10089:50:111"},{"nodeType":"YulAssignment","src":"10148:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"10160:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10168:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10156:3:111"},"nodeType":"YulFunctionCall","src":"10156:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"10148:4:111"}]},{"body":{"nodeType":"YulBlock","src":"10224:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10233:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10236:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10226:6:111"},"nodeType":"YulFunctionCall","src":"10226:12:111"},"nodeType":"YulExpressionStatement","src":"10226:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"10189:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"10199:12:111"},"nodeType":"YulFunctionCall","src":"10199:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"10215:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10195:3:111"},"nodeType":"YulFunctionCall","src":"10195:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"10185:3:111"},"nodeType":"YulFunctionCall","src":"10185:38:111"},"nodeType":"YulIf","src":"10182:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"9717:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"9727:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"9743:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"9749:6:111","type":""}],"src":"9666:580:111"},{"body":{"nodeType":"YulBlock","src":"10425:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10442:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10453:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10435:6:111"},"nodeType":"YulFunctionCall","src":"10435:21:111"},"nodeType":"YulExpressionStatement","src":"10435:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10476:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10487:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10472:3:111"},"nodeType":"YulFunctionCall","src":"10472:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10492:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10465:6:111"},"nodeType":"YulFunctionCall","src":"10465:30:111"},"nodeType":"YulExpressionStatement","src":"10465:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10526:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10511:3:111"},"nodeType":"YulFunctionCall","src":"10511:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"10531:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10504:6:111"},"nodeType":"YulFunctionCall","src":"10504:51:111"},"nodeType":"YulExpressionStatement","src":"10504:51:111"},{"nodeType":"YulAssignment","src":"10564:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10587:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10572:3:111"},"nodeType":"YulFunctionCall","src":"10572:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10564:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10402:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10416:4:111","type":""}],"src":"10251:345:111"},{"body":{"nodeType":"YulBlock","src":"10775:163:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10792:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10803:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10785:6:111"},"nodeType":"YulFunctionCall","src":"10785:21:111"},"nodeType":"YulExpressionStatement","src":"10785:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10826:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10837:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10822:3:111"},"nodeType":"YulFunctionCall","src":"10822:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10842:2:111","type":"","value":"13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10815:6:111"},"nodeType":"YulFunctionCall","src":"10815:30:111"},"nodeType":"YulExpressionStatement","src":"10815:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10865:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10876:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10861:3:111"},"nodeType":"YulFunctionCall","src":"10861:18:111"},{"hexValue":"6d757374206f76657272696465","kind":"string","nodeType":"YulLiteral","src":"10881:15:111","type":"","value":"must override"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10854:6:111"},"nodeType":"YulFunctionCall","src":"10854:43:111"},"nodeType":"YulExpressionStatement","src":"10854:43:111"},{"nodeType":"YulAssignment","src":"10906:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10918:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10929:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10914:3:111"},"nodeType":"YulFunctionCall","src":"10914:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10906:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10752:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10766:4:111","type":""}],"src":"10601:337:111"},{"body":{"nodeType":"YulBlock","src":"11117:254:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11134:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11145:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11127:6:111"},"nodeType":"YulFunctionCall","src":"11127:21:111"},"nodeType":"YulExpressionStatement","src":"11127:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11179:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11164:3:111"},"nodeType":"YulFunctionCall","src":"11164:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11184:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11157:6:111"},"nodeType":"YulFunctionCall","src":"11157:30:111"},"nodeType":"YulExpressionStatement","src":"11157:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11218:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11203:3:111"},"nodeType":"YulFunctionCall","src":"11203:18:111"},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964207369676e","kind":"string","nodeType":"YulLiteral","src":"11223:34:111","type":"","value":"VerifyingPaymaster: invalid sign"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11196:6:111"},"nodeType":"YulFunctionCall","src":"11196:62:111"},"nodeType":"YulExpressionStatement","src":"11196:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11278:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11289:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11274:3:111"},"nodeType":"YulFunctionCall","src":"11274:18:111"},{"hexValue":"6174757265206c656e67746820696e207061796d6173746572416e6444617461","kind":"string","nodeType":"YulLiteral","src":"11294:34:111","type":"","value":"ature length in paymasterAndData"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11267:6:111"},"nodeType":"YulFunctionCall","src":"11267:62:111"},"nodeType":"YulExpressionStatement","src":"11267:62:111"},{"nodeType":"YulAssignment","src":"11338:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11361:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11346:3:111"},"nodeType":"YulFunctionCall","src":"11346:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11338:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11094:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11108:4:111","type":""}],"src":"10943:428:111"},{"body":{"nodeType":"YulBlock","src":"11423:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"11522:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11543:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11546:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11536:6:111"},"nodeType":"YulFunctionCall","src":"11536:88:111"},"nodeType":"YulExpressionStatement","src":"11536:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11644:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11647:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11637:6:111"},"nodeType":"YulFunctionCall","src":"11637:15:111"},"nodeType":"YulExpressionStatement","src":"11637:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11672:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11675:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11665:6:111"},"nodeType":"YulFunctionCall","src":"11665:15:111"},"nodeType":"YulExpressionStatement","src":"11665:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11439:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11446:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"11436:2:111"},"nodeType":"YulFunctionCall","src":"11436:77:111"},"nodeType":"YulIf","src":"11433:257:111"},{"nodeType":"YulAssignment","src":"11699:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11710:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11717:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11706:3:111"},"nodeType":"YulFunctionCall","src":"11706:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"11699:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"11405:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"11415:3:111","type":""}],"src":"11376:349:111"},{"body":{"nodeType":"YulBlock","src":"11904:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11932:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11914:6:111"},"nodeType":"YulFunctionCall","src":"11914:21:111"},"nodeType":"YulExpressionStatement","src":"11914:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11966:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11951:3:111"},"nodeType":"YulFunctionCall","src":"11951:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11971:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11944:6:111"},"nodeType":"YulFunctionCall","src":"11944:30:111"},"nodeType":"YulExpressionStatement","src":"11944:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12005:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11990:3:111"},"nodeType":"YulFunctionCall","src":"11990:18:111"},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964206f706572","kind":"string","nodeType":"YulLiteral","src":"12010:34:111","type":"","value":"VerifyingPaymaster: invalid oper"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11983:6:111"},"nodeType":"YulFunctionCall","src":"11983:62:111"},"nodeType":"YulExpressionStatement","src":"11983:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12076:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12061:3:111"},"nodeType":"YulFunctionCall","src":"12061:18:111"},{"hexValue":"6174696f6e","kind":"string","nodeType":"YulLiteral","src":"12081:7:111","type":"","value":"ation"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12054:6:111"},"nodeType":"YulFunctionCall","src":"12054:35:111"},"nodeType":"YulExpressionStatement","src":"12054:35:111"},{"nodeType":"YulAssignment","src":"12098:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12110:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12121:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12106:3:111"},"nodeType":"YulFunctionCall","src":"12106:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12098:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_d26e0daa1e3de06cf3b41f98f2e7efd5b683a0ee78ec78511a62dcf2146f778c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11881:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11895:4:111","type":""}],"src":"11730:401:111"},{"body":{"nodeType":"YulBlock","src":"12356:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12373:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12378:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12366:6:111"},"nodeType":"YulFunctionCall","src":"12366:79:111"},"nodeType":"YulExpressionStatement","src":"12366:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12465:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12470:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12461:3:111"},"nodeType":"YulFunctionCall","src":"12461:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"12475:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12454:6:111"},"nodeType":"YulFunctionCall","src":"12454:28:111"},"nodeType":"YulExpressionStatement","src":"12454:28:111"},{"nodeType":"YulAssignment","src":"12491:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12502:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12507:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12498:3:111"},"nodeType":"YulFunctionCall","src":"12498:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"12491:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"12332:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12337:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"12348:3:111","type":""}],"src":"12136:380:111"},{"body":{"nodeType":"YulBlock","src":"12621:269:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12631:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"12654:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12641:12:111"},"nodeType":"YulFunctionCall","src":"12641:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"12635:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12669:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12679:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"12673:2:111","type":""}]},{"nodeType":"YulAssignment","src":"12754:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"12767:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12771:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12763:3:111"},"nodeType":"YulFunctionCall","src":"12763:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"12754:5:111"}]},{"body":{"nodeType":"YulBlock","src":"12805:79:111","statements":[{"nodeType":"YulAssignment","src":"12819:55:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"12836:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12848:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12855:1:111","type":"","value":"4"},{"name":"len","nodeType":"YulIdentifier","src":"12858:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12851:3:111"},"nodeType":"YulFunctionCall","src":"12851:11:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"12844:3:111"},"nodeType":"YulFunctionCall","src":"12844:19:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12865:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"12840:3:111"},"nodeType":"YulFunctionCall","src":"12840:28:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12832:3:111"},"nodeType":"YulFunctionCall","src":"12832:37:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12871:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12828:3:111"},"nodeType":"YulFunctionCall","src":"12828:46:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"12819:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"12789:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12794:1:111","type":"","value":"4"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"12786:2:111"},"nodeType":"YulFunctionCall","src":"12786:10:111"},"nodeType":"YulIf","src":"12783:101:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"12596:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"12603:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"12611:5:111","type":""}],"src":"12521:369:111"},{"body":{"nodeType":"YulBlock","src":"13001:222:111","statements":[{"body":{"nodeType":"YulBlock","src":"13047:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13056:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13059:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13049:6:111"},"nodeType":"YulFunctionCall","src":"13049:12:111"},"nodeType":"YulExpressionStatement","src":"13049:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13022:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13031:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13018:3:111"},"nodeType":"YulFunctionCall","src":"13018:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13043:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13014:3:111"},"nodeType":"YulFunctionCall","src":"13014:32:111"},"nodeType":"YulIf","src":"13011:52:111"},{"nodeType":"YulVariableDeclaration","src":"13072:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13091:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13085:5:111"},"nodeType":"YulFunctionCall","src":"13085:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"13076:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13143:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"13110:32:111"},"nodeType":"YulFunctionCall","src":"13110:39:111"},"nodeType":"YulExpressionStatement","src":"13110:39:111"},{"nodeType":"YulAssignment","src":"13158:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13168:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13158:6:111"}]},{"nodeType":"YulAssignment","src":"13182:35:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13202:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13213:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13198:3:111"},"nodeType":"YulFunctionCall","src":"13198:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13192:5:111"},"nodeType":"YulFunctionCall","src":"13192:25:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"13182:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12959:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"12970:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"12982:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12990:6:111","type":""}],"src":"12895:328:111"},{"body":{"nodeType":"YulBlock","src":"13359:347:111","statements":[{"body":{"nodeType":"YulBlock","src":"13405:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13414:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13417:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13407:6:111"},"nodeType":"YulFunctionCall","src":"13407:12:111"},"nodeType":"YulExpressionStatement","src":"13407:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13380:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13389:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13376:3:111"},"nodeType":"YulFunctionCall","src":"13376:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13401:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13372:3:111"},"nodeType":"YulFunctionCall","src":"13372:32:111"},"nodeType":"YulIf","src":"13369:52:111"},{"nodeType":"YulVariableDeclaration","src":"13430:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13449:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13443:5:111"},"nodeType":"YulFunctionCall","src":"13443:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"13434:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13501:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"13468:32:111"},"nodeType":"YulFunctionCall","src":"13468:39:111"},"nodeType":"YulExpressionStatement","src":"13468:39:111"},{"nodeType":"YulAssignment","src":"13516:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13526:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13516:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"13540:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13565:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13576:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13561:3:111"},"nodeType":"YulFunctionCall","src":"13561:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13555:5:111"},"nodeType":"YulFunctionCall","src":"13555:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"13544:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13622:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"13589:32:111"},"nodeType":"YulFunctionCall","src":"13589:41:111"},"nodeType":"YulExpressionStatement","src":"13589:41:111"},{"nodeType":"YulAssignment","src":"13639:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"13649:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"13639:6:111"}]},{"nodeType":"YulAssignment","src":"13665:35:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13685:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13696:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13681:3:111"},"nodeType":"YulFunctionCall","src":"13681:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13675:5:111"},"nodeType":"YulFunctionCall","src":"13675:25:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"13665:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_address_payablet_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13309:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13320:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13332:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13340:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13348:6:111","type":""}],"src":"13228:478:111"},{"body":{"nodeType":"YulBlock","src":"13743:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13760:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13763:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13753:6:111"},"nodeType":"YulFunctionCall","src":"13753:88:111"},"nodeType":"YulExpressionStatement","src":"13753:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13857:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13860:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13850:6:111"},"nodeType":"YulFunctionCall","src":"13850:15:111"},"nodeType":"YulExpressionStatement","src":"13850:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13881:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13884:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13874:6:111"},"nodeType":"YulFunctionCall","src":"13874:15:111"},"nodeType":"YulExpressionStatement","src":"13874:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"13711:184:111"},{"body":{"nodeType":"YulBlock","src":"14074:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14091:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14102:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14084:6:111"},"nodeType":"YulFunctionCall","src":"14084:21:111"},"nodeType":"YulExpressionStatement","src":"14084:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14125:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14136:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14121:3:111"},"nodeType":"YulFunctionCall","src":"14121:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14141:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14114:6:111"},"nodeType":"YulFunctionCall","src":"14114:30:111"},"nodeType":"YulExpressionStatement","src":"14114:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14164:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14175:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14160:3:111"},"nodeType":"YulFunctionCall","src":"14160:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"14180:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14153:6:111"},"nodeType":"YulFunctionCall","src":"14153:54:111"},"nodeType":"YulExpressionStatement","src":"14153:54:111"},{"nodeType":"YulAssignment","src":"14216:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14228:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14239:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14224:3:111"},"nodeType":"YulFunctionCall","src":"14224:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14216:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14051:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14065:4:111","type":""}],"src":"13900:348:111"},{"body":{"nodeType":"YulBlock","src":"14427:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14444:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14455:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14437:6:111"},"nodeType":"YulFunctionCall","src":"14437:21:111"},"nodeType":"YulExpressionStatement","src":"14437:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14478:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14489:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14474:3:111"},"nodeType":"YulFunctionCall","src":"14474:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14494:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14467:6:111"},"nodeType":"YulFunctionCall","src":"14467:30:111"},"nodeType":"YulExpressionStatement","src":"14467:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14517:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14528:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14513:3:111"},"nodeType":"YulFunctionCall","src":"14513:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"14533:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14506:6:111"},"nodeType":"YulFunctionCall","src":"14506:61:111"},"nodeType":"YulExpressionStatement","src":"14506:61:111"},{"nodeType":"YulAssignment","src":"14576:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14588:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14599:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14584:3:111"},"nodeType":"YulFunctionCall","src":"14584:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14576:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14404:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14418:4:111","type":""}],"src":"14253:355:111"},{"body":{"nodeType":"YulBlock","src":"14787:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14804:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14815:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14797:6:111"},"nodeType":"YulFunctionCall","src":"14797:21:111"},"nodeType":"YulExpressionStatement","src":"14797:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14838:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14849:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14834:3:111"},"nodeType":"YulFunctionCall","src":"14834:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14854:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14827:6:111"},"nodeType":"YulFunctionCall","src":"14827:30:111"},"nodeType":"YulExpressionStatement","src":"14827:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14877:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14888:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14873:3:111"},"nodeType":"YulFunctionCall","src":"14873:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"14893:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14866:6:111"},"nodeType":"YulFunctionCall","src":"14866:62:111"},"nodeType":"YulExpressionStatement","src":"14866:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14948:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14959:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14944:3:111"},"nodeType":"YulFunctionCall","src":"14944:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"14964:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14937:6:111"},"nodeType":"YulFunctionCall","src":"14937:32:111"},"nodeType":"YulExpressionStatement","src":"14937:32:111"},{"nodeType":"YulAssignment","src":"14978:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14990:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15001:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14986:3:111"},"nodeType":"YulFunctionCall","src":"14986:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14978:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14764:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14778:4:111","type":""}],"src":"14613:398:111"},{"body":{"nodeType":"YulBlock","src":"15197:217:111","statements":[{"nodeType":"YulAssignment","src":"15207:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15219:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15230:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15215:3:111"},"nodeType":"YulFunctionCall","src":"15215:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15207:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15250:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"15261:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15243:6:111"},"nodeType":"YulFunctionCall","src":"15243:25:111"},"nodeType":"YulExpressionStatement","src":"15243:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15288:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15299:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15284:3:111"},"nodeType":"YulFunctionCall","src":"15284:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15308:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15316:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15304:3:111"},"nodeType":"YulFunctionCall","src":"15304:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15277:6:111"},"nodeType":"YulFunctionCall","src":"15277:45:111"},"nodeType":"YulExpressionStatement","src":"15277:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15342:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15353:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15338:3:111"},"nodeType":"YulFunctionCall","src":"15338:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"15358:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15331:6:111"},"nodeType":"YulFunctionCall","src":"15331:34:111"},"nodeType":"YulExpressionStatement","src":"15331:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15385:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15396:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15381:3:111"},"nodeType":"YulFunctionCall","src":"15381:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"15401:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15374:6:111"},"nodeType":"YulFunctionCall","src":"15374:34:111"},"nodeType":"YulExpressionStatement","src":"15374:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15142:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"15153:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"15161:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15169:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15177:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15188:4:111","type":""}],"src":"15016:398:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n let _1 := 0xffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), 96)\n mstore(add(headStart, 96), value3)\n calldatacopy(add(headStart, 128), value2, value3)\n mstore(add(add(headStart, value3), 128), 0)\n tail := add(add(headStart, and(add(value3, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 128)\n }\n function abi_decode_struct_UserOperation_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 352) { revert(0, 0) }\n value := offset\n }\n function abi_decode_uint48(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n value1 := abi_decode_uint48(add(headStart, 32))\n value2 := abi_decode_uint48(add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value1_1, value2_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value1 := value1_1\n value2 := value2_1\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(pos, length), 0x20), 0)\n }\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function abi_decode_tuple_t_uint48t_uint48(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_uint48(headStart)\n value1 := abi_decode_uint48(add(headStart, 32))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 192)\n tail := abi_encode_bytes(value0, add(headStart, 192))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 96), value3)\n let _1 := 0xffffffffffff\n mstore(add(headStart, 128), and(value4, _1))\n mstore(add(headStart, 160), and(value5, _1))\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 13)\n mstore(add(headStart, 64), \"must override\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), \"VerifyingPaymaster: invalid sign\")\n mstore(add(headStart, 96), \"ature length in paymasterAndData\")\n tail := add(headStart, 128)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_d26e0daa1e3de06cf3b41f98f2e7efd5b683a0ee78ec78511a62dcf2146f778c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"VerifyingPaymaster: invalid oper\")\n mstore(add(headStart, 96), \"ation\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes4(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffff00000000000000000000000000000000000000000000000000000000\n value := and(_1, _2)\n if lt(len, 4)\n {\n value := and(and(_1, shl(shl(3, sub(4, len)), _2)), _2)\n }\n }\n function abi_decode_tuple_t_address_payablet_uint256_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := mload(add(headStart, 32))\n }\n function abi_decode_tuple_t_address_payablet_address_payablet_uint256_fromMemory(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := mload(add(headStart, 64))\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":954},{"length":32,"start":1253},{"length":32,"start":1455},{"length":32,"start":1746},{"length":32,"start":1945},{"length":32,"start":2089},{"length":32,"start":2268},{"length":32,"start":2915}],"11801":[{"length":32,"start":427},{"length":32,"start":3585}]},"linkReferences":{},"object":"60806040526004361061015f5760003560e01c8063a9a23409116100c0578063c23a5cea11610074578063d0e30db011610059578063d0e30db014610453578063f2fde38b1461045b578063f465c77e1461047b57600080fd5b8063c23a5cea1461041e578063c399ec881461043e57600080fd5b8063b0d691fe116100a5578063b0d691fe146103a8578063bab46259146103dc578063bb9fe6bf1461040957600080fd5b8063a9a2340914610354578063b02f786e1461037457600080fd5b80637d3c11621161011757806394d4ad60116100fc57806394d4ad60146102c957806394e1fc19146102f95780639c90b4431461032757600080fd5b80637d3c1162146102715780638da5cb5b1461029e57600080fd5b806323d9ac9b1161014857806323d9ac9b1461019957806356fd76da146101f7578063715018a61461025c57600080fd5b80630396cb6014610164578063205c287814610179575b600080fd5b610177610172366004611566565b6104a9565b005b34801561018557600080fd5b506101776101943660046115b5565b61055b565b3480156101a557600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020357600080fd5b5061022b7f382edd9e648c4175cda8acdb1eb9c5d40f12d588410c9b3779d25b1aea56abbf81565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101ee565b34801561026857600080fd5b506101776105f3565b34801561027d57600080fd5b506001546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101cd565b3480156102d557600080fd5b506102e96102e4366004611623565b610607565b6040516101ee9493929190611665565b34801561030557600080fd5b50610319610314366004611703565b610644565b6040519081526020016101ee565b34801561033357600080fd5b50610319610342366004611761565b60036020526000908152604090205481565b34801561036057600080fd5b5061017761036f36600461177e565b6106ae565b34801561038057600080fd5b5061022b7f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba81565b3480156103b457600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e857600080fd5b506002546101cd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b506101776106c8565b34801561042a57600080fd5b50610177610439366004611761565b61074c565b34801561044a57600080fd5b506103196107f8565b6101776108ae565b34801561046757600080fd5b50610177610476366004611761565b610936565b34801561048757600080fd5b5061049b6104963660046117de565b6109f2565b6040516101ee929190611897565b6104b1610a16565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050505050565b610563610a16565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561053f57600080fd5b6105fb610a16565b6106056000610a97565b565b600080368161061a6054601487896118b9565b81019061062791906118e3565b909450925061063985605481896118b9565b949793965094505050565b600061064f84610b0c565b73ffffffffffffffffffffffffffffffffffffffff85351660009081526003602090815260409182902054915161068f9392469230928991899101611916565b6040516020818303038152906040528051906020012090509392505050565b6106b6610b4b565b6106c284848484610bea565b50505050565b6106d0610a16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073857600080fd5b505af11580156106c2573d6000803e3d6000fd5b610754610a16565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156107dd57600080fd5b505af11580156107f1573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a99190611973565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156107dd57600080fd5b61093e610a16565b73ffffffffffffffffffffffffffffffffffffffff81166109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109ef81610a97565b50565b606060006109fe610b4b565b610a09858585610c4c565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109dd565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060366000610b1f61012085018561198c565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016109dd565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016109dd565b6060600080803681610c656102e46101208b018b61198c565b929650909450925090506040811480610c7e5750604181145b610d0c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016109dd565b6000610d6f610d1c8b8787610644565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600360205260408120805492935090610da4836119f1565b9190505550610de98184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f4d92505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4760018686610f73565b6040518060200160405280600081525090965096505050505050610a0e565b610e7b610e7660608c018c61198c565b610fab565b80610e965750610e96610e9160608c018c61198c565b61111c565b610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f566572696679696e675061796d61737465723a20696e76616c6964206f70657260448201527f6174696f6e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b610f2e60008686610f73565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610f5c858561127f565b91509150610f69816112c4565b5090505b92915050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610f9b576000610f9e565b60015b60ff161717949350505050565b600060e48214610fbd57506000610f6d565b6000610fcd6088608485876118b9565b610fd691611a50565b9050366000610fe96024600487896118b9565b90925090506000610ffc83830184611761565b60025490915073ffffffffffffffffffffffffffffffffffffffff80831691161461102e576000945050505050610f6d565b600061103e60c86088898b6118b9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509361108b935085016020908101925085019050611a98565b5090507fffffffff0000000000000000000000000000000000000000000000000000000086167f095ea7b3000000000000000000000000000000000000000000000000000000001480156110f9575060015473ffffffffffffffffffffffffffffffffffffffff8281169116145b1561110d5760019650505050505050610f6d565b50600098975050505050505050565b6000610104821461112f57506000610f6d565b600061113f6088608485876118b9565b61114891611a50565b905036600061115b6024600487896118b9565b9092509050600061116e83830184611761565b60015490915073ffffffffffffffffffffffffffffffffffffffff8083169116146111a0576000945050505050610f6d565b60006111b060e86088898b6118b9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949550936111fd935085016020908101925085019050611ac6565b50909150507fffffffff0000000000000000000000000000000000000000000000000000000086167f382edd9e000000000000000000000000000000000000000000000000000000001480156110f9575060025473ffffffffffffffffffffffffffffffffffffffff82811691160361110d5760019650505050505050610f6d565b60008082516041036112b55760208301516040840151606085015160001a6112a987828585611477565b945094505050506112bd565b506000905060025b9250929050565b60008160048111156112d8576112d8611b09565b036112e05750565b60018160048111156112f4576112f4611b09565b0361135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109dd565b600281600481111561136f5761136f611b09565b036113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109dd565b60038160048111156113ea576113ea611b09565b036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114ae575060009050600361155d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611502573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115565760006001925092505061155d565b9150600090505b94509492505050565b60006020828403121561157857600080fd5b813563ffffffff8116811461158c57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ef57600080fd5b600080604083850312156115c857600080fd5b82356115d381611593565b946020939093013593505050565b60008083601f8401126115f357600080fd5b50813567ffffffffffffffff81111561160b57600080fd5b6020830191508360208285010111156112bd57600080fd5b6000806020838503121561163657600080fd5b823567ffffffffffffffff81111561164d57600080fd5b611659858286016115e1565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156116e257600080fd5b50919050565b803565ffffffffffff811681146116fe57600080fd5b919050565b60008060006060848603121561171857600080fd5b833567ffffffffffffffff81111561172f57600080fd5b61173b868287016116cf565b93505061174a602085016116e8565b9150611758604085016116e8565b90509250925092565b60006020828403121561177357600080fd5b813561158c81611593565b6000806000806060858703121561179457600080fd5b8435600381106117a357600080fd5b9350602085013567ffffffffffffffff8111156117bf57600080fd5b6117cb878288016115e1565b9598909750949560400135949350505050565b6000806000606084860312156117f357600080fd5b833567ffffffffffffffff81111561180a57600080fd5b611816868287016116cf565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561185257602081850181015186830182015201611836565b81811115611864576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006118aa604083018561182c565b90508260208301529392505050565b600080858511156118c957600080fd5b838611156118d657600080fd5b5050820193919092039150565b600080604083850312156118f657600080fd5b6118ff836116e8565b915061190d602084016116e8565b90509250929050565b60c08152600061192960c083018961182c565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561198557600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126119c157600080fd5b83018035915067ffffffffffffffff8211156119dc57600080fd5b6020019150368190038213156112bd57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a49577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a905780818660040360031b1b83161692505b505092915050565b60008060408385031215611aab57600080fd5b8251611ab681611593565b6020939093015192949293505050565b600080600060608486031215611adb57600080fd5b8351611ae681611593565b6020850151909350611af781611593565b80925050604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220008fcb302fb6ec149df4a9d2191ed74ed9cf53f9fcae24ea6f33f25f9d3975ba64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15F JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xC23A5CEA GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x41E JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xBAB46259 EQ PUSH2 0x3DC JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x409 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x354 JUMPI DUP1 PUSH4 0xB02F786E EQ PUSH2 0x374 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7D3C1162 GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x94D4AD60 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x94D4AD60 EQ PUSH2 0x2C9 JUMPI DUP1 PUSH4 0x94E1FC19 EQ PUSH2 0x2F9 JUMPI DUP1 PUSH4 0x9C90B443 EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7D3C1162 EQ PUSH2 0x271 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23D9AC9B GT PUSH2 0x148 JUMPI DUP1 PUSH4 0x23D9AC9B EQ PUSH2 0x199 JUMPI DUP1 PUSH4 0x56FD76DA EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x164 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x179 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x177 PUSH2 0x172 CALLDATASIZE PUSH1 0x4 PUSH2 0x1566 JUMP JUMPDEST PUSH2 0x4A9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x15B5 JUMP JUMPDEST PUSH2 0x55B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CD PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH32 0x382EDD9E648C4175CDA8ACDB1EB9C5D40F12D588410C9B3779D25B1AEA56ABBF DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x268 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x5F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 SLOAD PUSH2 0x1CD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E9 PUSH2 0x2E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1623 JUMP JUMPDEST PUSH2 0x607 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1665 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x314 CALLDATASIZE PUSH1 0x4 PUSH2 0x1703 JUMP JUMPDEST PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x360 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x36F CALLDATASIZE PUSH1 0x4 PUSH2 0x177E JUMP JUMPDEST PUSH2 0x6AE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x380 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH32 0x95EA7B334AE44009AA867BFB386F5C3B4B443AC6F0EE573FA91C4608FBADFBA DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CD PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x2 SLOAD PUSH2 0x1CD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x6C8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH2 0x74C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x177 PUSH2 0x8AE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x177 PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x1761 JUMP JUMPDEST PUSH2 0x936 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x49B PUSH2 0x496 CALLDATASIZE PUSH1 0x4 PUSH2 0x17DE JUMP JUMPDEST PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP3 SWAP2 SWAP1 PUSH2 0x1897 JUMP JUMPDEST PUSH2 0x4B1 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x563 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5FB PUSH2 0xA16 JUMP JUMPDEST PUSH2 0x605 PUSH1 0x0 PUSH2 0xA97 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE DUP2 PUSH2 0x61A PUSH1 0x54 PUSH1 0x14 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x627 SWAP2 SWAP1 PUSH2 0x18E3 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x639 DUP6 PUSH1 0x54 DUP2 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64F DUP5 PUSH2 0xB0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD SWAP2 MLOAD PUSH2 0x68F SWAP4 SWAP3 CHAINID SWAP3 ADDRESS SWAP3 DUP10 SWAP2 DUP10 SWAP2 ADD PUSH2 0x1916 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6B6 PUSH2 0xB4B JUMP JUMPDEST PUSH2 0x6C2 DUP5 DUP5 DUP5 DUP5 PUSH2 0xBEA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6D0 PUSH2 0xA16 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x738 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x754 PUSH2 0xA16 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x885 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8A9 SWAP2 SWAP1 PUSH2 0x1973 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x93E PUSH2 0xA16 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x9E6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x9EF DUP2 PUSH2 0xA97 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x9FE PUSH2 0xB4B JUMP JUMPDEST PUSH2 0xA09 DUP6 DUP6 DUP6 PUSH2 0xC4C JUMP JUMPDEST SWAP2 POP SWAP2 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x605 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x60 CALLDATASIZE PUSH1 0x0 PUSH2 0xB1F PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x198C JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP4 PUSH1 0x20 DUP2 DUP5 SUB SUB PUSH1 0x40 MLOAD SWAP5 POP PUSH1 0x20 DUP2 ADD DUP6 ADD PUSH1 0x40 MSTORE DUP1 DUP6 MSTORE DUP1 DUP3 PUSH1 0x20 DUP8 ADD CALLDATACOPY POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x605 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 CALLDATASIZE DUP2 PUSH2 0xC65 PUSH2 0x2E4 PUSH2 0x120 DUP12 ADD DUP12 PUSH2 0x198C JUMP JUMPDEST SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x40 DUP2 EQ DUP1 PUSH2 0xC7E JUMPI POP PUSH1 0x41 DUP2 EQ JUMPDEST PUSH2 0xD0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964207369676E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174757265206C656E67746820696E207061796D6173746572416E6444617461 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD6F PUSH2 0xD1C DUP12 DUP8 DUP8 PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 PUSH2 0xDA4 DUP4 PUSH2 0x19F1 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP PUSH2 0xDE9 DUP2 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xF4D SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE66 JUMPI PUSH2 0xE47 PUSH1 0x1 DUP7 DUP7 PUSH2 0xF73 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0xA0E JUMP JUMPDEST PUSH2 0xE7B PUSH2 0xE76 PUSH1 0x60 DUP13 ADD DUP13 PUSH2 0x198C JUMP JUMPDEST PUSH2 0xFAB JUMP JUMPDEST DUP1 PUSH2 0xE96 JUMPI POP PUSH2 0xE96 PUSH2 0xE91 PUSH1 0x60 DUP13 ADD DUP13 PUSH2 0x198C JUMP JUMPDEST PUSH2 0x111C JUMP JUMPDEST PUSH2 0xF22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964206F706572 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174696F6E000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH2 0xF2E PUSH1 0x0 DUP7 DUP7 PUSH2 0xF73 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP12 SWAP1 SWAP11 POP SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xF5C DUP6 DUP6 PUSH2 0x127F JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xF69 DUP2 PUSH2 0x12C4 JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0xF9B JUMPI PUSH1 0x0 PUSH2 0xF9E JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE4 DUP3 EQ PUSH2 0xFBD JUMPI POP PUSH1 0x0 PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFCD PUSH1 0x88 PUSH1 0x84 DUP6 DUP8 PUSH2 0x18B9 JUMP JUMPDEST PUSH2 0xFD6 SWAP2 PUSH2 0x1A50 JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0xFE9 PUSH1 0x24 PUSH1 0x4 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0xFFC DUP4 DUP4 ADD DUP5 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x102E JUMPI PUSH1 0x0 SWAP5 POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x103E PUSH1 0xC8 PUSH1 0x88 DUP10 DUP12 PUSH2 0x18B9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH2 0x108B SWAP4 POP DUP6 ADD PUSH1 0x20 SWAP1 DUP2 ADD SWAP3 POP DUP6 ADD SWAP1 POP PUSH2 0x1A98 JUMP JUMPDEST POP SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 EQ DUP1 ISZERO PUSH2 0x10F9 JUMPI POP PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO PUSH2 0x110D JUMPI PUSH1 0x1 SWAP7 POP POP POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST POP PUSH1 0x0 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x104 DUP3 EQ PUSH2 0x112F JUMPI POP PUSH1 0x0 PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x113F PUSH1 0x88 PUSH1 0x84 DUP6 DUP8 PUSH2 0x18B9 JUMP JUMPDEST PUSH2 0x1148 SWAP2 PUSH2 0x1A50 JUMP JUMPDEST SWAP1 POP CALLDATASIZE PUSH1 0x0 PUSH2 0x115B PUSH1 0x24 PUSH1 0x4 DUP8 DUP10 PUSH2 0x18B9 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 PUSH2 0x116E DUP4 DUP4 ADD DUP5 PUSH2 0x1761 JUMP JUMPDEST PUSH1 0x1 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x11A0 JUMPI PUSH1 0x0 SWAP5 POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11B0 PUSH1 0xE8 PUSH1 0x88 DUP10 DUP12 PUSH2 0x18B9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP DUP5 MLOAD SWAP5 SWAP6 POP SWAP4 PUSH2 0x11FD SWAP4 POP DUP6 ADD PUSH1 0x20 SWAP1 DUP2 ADD SWAP3 POP DUP6 ADD SWAP1 POP PUSH2 0x1AC6 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH32 0x382EDD9E00000000000000000000000000000000000000000000000000000000 EQ DUP1 ISZERO PUSH2 0x10F9 JUMPI POP PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND SUB PUSH2 0x110D JUMPI PUSH1 0x1 SWAP7 POP POP POP POP POP POP POP PUSH2 0xF6D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x12B5 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x12A9 DUP8 DUP3 DUP6 DUP6 PUSH2 0x1477 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x12BD JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x12D8 JUMPI PUSH2 0x12D8 PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x12E0 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x12F4 JUMPI PUSH2 0x12F4 PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x135B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x136F JUMPI PUSH2 0x136F PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x13D6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x13EA JUMPI PUSH2 0x13EA PUSH2 0x1B09 JUMP JUMPDEST SUB PUSH2 0x9EF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x9DD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x14AE JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1502 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1556 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x155D JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x158C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x9EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x15D3 DUP2 PUSH2 0x1593 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x15F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x160B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x12BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1636 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x164D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1659 DUP6 DUP3 DUP7 ADD PUSH2 0x15E1 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE DUP3 PUSH1 0x60 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x80 DUP5 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x80 DUP5 DUP5 ADD ADD MSTORE PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP4 ADD ADD SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x16FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x172F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x173B DUP7 DUP3 DUP8 ADD PUSH2 0x16CF JUMP JUMPDEST SWAP4 POP POP PUSH2 0x174A PUSH1 0x20 DUP6 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1758 PUSH1 0x40 DUP6 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x158C DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1794 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17CB DUP8 DUP3 DUP9 ADD PUSH2 0x15E1 JUMP JUMPDEST SWAP6 SWAP9 SWAP1 SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x17F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x180A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1816 DUP7 DUP3 DUP8 ADD PUSH2 0x16CF JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 SWAP1 SWAP6 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1852 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1836 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1864 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x18AA PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x182C JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x18C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x18D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x18F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18FF DUP4 PUSH2 0x16E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x190D PUSH1 0x20 DUP5 ADD PUSH2 0x16E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0xC0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1929 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x182C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x19C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x19DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x12BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1A49 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x4 DUP6 LT ISZERO PUSH2 0x1A90 JUMPI DUP1 DUP2 DUP7 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x1AB6 DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1ADB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x1AE6 DUP2 PUSH2 0x1593 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x1AF7 DUP2 PUSH2 0x1593 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP DUP16 0xCB ADDRESS 0x2F 0xB6 0xEC EQ SWAP14 DELEGATECALL 0xA9 0xD2 NOT 0x1E 0xD7 0x4E 0xD9 0xCF MSTORE8 0xF9 0xFC 0xAE 0x24 0xEA PUSH16 0x33F25F9D3975BA64736F6C634300080F STOP CALLER ","sourceMap":"879:5955:66:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;1123:40:66:-;;;;;;;;;;;;;;;;;;974:42:111;962:55;;;944:74;;932:2;917:18;1123:40:66;;;;;;;;1347:114;;;;;;;;;;;;1409:51;1347:114;;;;;1203:66:111;1191:79;;;1173:98;;1161:2;1146:18;1347:114:66;1029:248:111;1831:101:24;;;;;;;;;;;;;:::i;1169:35:66:-;;;;;;;;;;-1:-1:-1;1169:35:66;;;;;;;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;5179:335:66;;;;;;;;;;-1:-1:-1;5179:335:66;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2961:464::-;;;;;;;;;;-1:-1:-1;2961:464:66;;;;;:::i;:::-;;:::i;:::-;;;3695:25:111;;;3683:2;3668:18;2961:464:66;3549:177:111;1764:46:66;;;;;;;;;;-1:-1:-1;1764:46:66;;;;;:::i;:::-;;;;;;;;;;;;;;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;1245:96:66:-;;;;;;;;;;;;1303:37;1245:96;;471:39:52;;;;;;;;;;;;;;;1210:28:66;;;;;;;;;;-1:-1:-1;1210:28:66;;;;;;;;3588:83:52;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;2474:105::-;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;6847:10:111;6835:23;;3173:55:52::1;::::0;::::1;6817:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;6790:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;7078:55:111::0;;;2817:46:52::1;::::0;::::1;7060:74:111::0;7150:18;;;7143:34;;;2817:10:52::1;:21;::::0;::::1;::::0;7033:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1831:101:24::0;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5179:335:66:-;5263:17;;5301:24;5263:17;5375:57;1114:2;1061;5375:16;;:57;:::i;:::-;5364:86;;;;;;;:::i;:::-;5337:113;;-1:-1:-1;5337:113:66;-1:-1:-1;5472:35:66;:16;1114:2;5472:16;;:35;:::i;:::-;5179:335;;;;-1:-1:-1;5460:47:66;-1:-1:-1;;;5179:335:66:o;2961:464::-;3072:7;3224:12;3229:6;3224:4;:12::i;:::-;3316:31;1889:20:64;;3316:31:66;;;;;:11;:31;;;;;;;;;;3196:221;;;;;3254:13;;3293:4;;3365:10;;3393;;3196:221;;:::i;:::-;;;;;;;;;;;;;3186:232;;;;;;3179:239;;2961:464;;;;;:::o;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;962:55:111::0;;;3975:41:52::1;::::0;::::1;944:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;917:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;944:74:111;3361:7:52;;3387:10;:20;;;;;917:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;944:74:111;2518:10:52;:20;;;;;2547:9;;917:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;9100:2:111;2161:73:24::1;::::0;::::1;9082:21:111::0;9139:2;9119:18;;;9112:30;9178:34;9158:18;;;9151:62;9249:8;9229:18;;;9222:36;9275:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;9507:2:111;1414:68:24;;;9489:21:111;;;9526:18;;;9519:30;9585:34;9565:18;;;9558:62;9637:18;;1414:68:24;9305:356:111;2433:187:24;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;1817:729:66:-;1885:16;1982:18;;2003:23;;;;:6;:23;:::i;:::-;1982:44;;;;2313:6;2369:2;2363:3;2351:10;2347:20;2343:29;2398:4;2392:11;2385:18;;2447:2;2442:3;2438:12;2433:3;2429:22;2423:4;2416:36;2477:3;2472;2465:16;2526:3;2521;2516:2;2511:3;2507:12;2494:36;;;2288:252;;1817:729;;;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;10453:2:111;4148:67:52;;;10435:21:111;10492:2;10472:18;;;10465:30;10531:23;10511:18;;;10504:51;10572:18;;4148:67:52;10251:345:111;2089:285:52;2344:23;;;;;10803:2:111;2344:23:52;;;10785:21:111;10842:2;10822:18;;;10815:30;10881:15;10861:18;;;10854:43;10914:18;;2344:23:52;10601:337:111;3765:1408:66;3910:20;3932:22;;;4033:24;3932:22;4061:46;4083:23;;;;:6;:23;:::i;4061:46::-;3994:113;;-1:-1:-1;3994:113:66;;-1:-1:-1;3994:113:66;-1:-1:-1;3994:113:66;-1:-1:-1;4348:2:66;4328:22;;;:48;;-1:-1:-1;4374:2:66;4354:22;;4328:48;4320:125;;;;;;;;11145:2:111;4320:125:66;;;11127:21:111;11164:18;;;11157:30;;;;11223:34;11203:18;;;11196:62;11294:34;11274:18;;;11267:62;11346:19;;4320:125:66;10943:428:111;4320:125:66;4455:12;4470:69;4499:39;4507:6;4515:10;4527;4499:7;:39::i;:::-;7455:58:47;;12378:66:111;7455:58:47;;;12366:79:111;12461:12;;;12454:28;;;7325:7:47;;12498:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;4470:69:66;4549:31;1889:20:64;;4549:31:66;;;;;:11;:31;;;;;:33;;4455:84;;-1:-1:-1;4549:31:66;:33;;;:::i;:::-;;;;;;4690:30;4704:4;4710:9;;4690:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4690:13:66;;-1:-1:-1;;;4690:30:66:i;:::-;4671:49;;:15;:49;;;4667:139;;4747:47;4767:4;4772:10;4783;4747:19;:47::i;:::-;4736:59;;;;;;;;;;;;;;;;;;;;;;;;4667:139;4824:41;4849:15;;;;:6;:15;:::i;:::-;4824:24;:41::i;:::-;:86;;;-1:-1:-1;4869:41:66;4894:15;;;;:6;:15;:::i;:::-;4869:24;:41::i;:::-;4816:136;;;;;;;11932:2:111;4816:136:66;;;11914:21:111;11971:2;11951:18;;;11944:30;12010:34;11990:18;;;11983:62;12081:7;12061:18;;;12054:35;12106:19;;4816:136:66;11730:401:111;4816:136:66;5117:48;5137:5;5143:10;5154;5117:19;:48::i;:::-;5106:60;;;;;;;;;-1:-1:-1;5106:60:66;;;;;-1:-1:-1;3765:1408:66;-1:-1:-1;;;;;;;;;3765:1408:66:o;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;-1:-1:-1;3661:227:47;;;;;:::o;2956:218:54:-;3053:7;3157:8;3141:10;3133:19;;:33;;3125:3;3110:10;3102:19;;:26;;3080:9;:17;;3096:1;3080:17;;;3092:1;3080:17;3079:50;;;:88;;2956:218;-1:-1:-1;;;;2956:218:54:o;5520:647:66:-;5603:4;5669:3;5648:24;;5644:42;;-1:-1:-1;5681:5:66;5674:12;;5644:42;5696:19;5725;5740:3;5736;5725:10;;:19;:::i;:::-;5718:27;;;:::i;:::-;5696:49;-1:-1:-1;5755:23:66;;5781:16;5794:2;5792:1;5781:10;;:16;:::i;:::-;5755:42;;-1:-1:-1;5755:42:66;-1:-1:-1;5807:12:66;5822:31;;;;5755:42;5822:31;:::i;:::-;5875:13;;5807:46;;-1:-1:-1;5875:13:66;5867:21;;;5875:13;;5867:21;5863:39;;5897:5;5890:12;;;;;;;;5863:39;5912:25;5940:19;5955:3;5951;5940:10;;:19;:::i;:::-;5912:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5991:44:66;;5912:47;;-1:-1:-1;5912:47:66;5991:44;;-1:-1:-1;5991:44:66;;;;;;;-1:-1:-1;5991:44:66;;;-1:-1:-1;5991:44:66;:::i;:::-;-1:-1:-1;5969:66:66;-1:-1:-1;6049:41:66;;;;;:76;;;;-1:-1:-1;6105:20:66;;;6094:31;;;6105:20;;6094:31;6049:76;6045:93;;;6134:4;6127:11;;;;;;;;;;6045:93;-1:-1:-1;6155:5:66;;5520:647;-1:-1:-1;;;;;;;;5520:647:66:o;6173:658::-;6256:4;6322:3;6301:24;;6297:42;;-1:-1:-1;6334:5:66;6327:12;;6297:42;6349:19;6378;6393:3;6389;6378:10;;:19;:::i;:::-;6371:27;;;:::i;:::-;6349:49;-1:-1:-1;6408:23:66;;6434:16;6447:2;6445:1;6434:10;;:16;:::i;:::-;6408:42;;-1:-1:-1;6408:42:66;-1:-1:-1;6460:12:66;6475:31;;;;6408:42;6475:31;:::i;:::-;6528:20;;6460:46;;-1:-1:-1;6528:20:66;6520:28;;;6528:20;;6520:28;6516:46;;6557:5;6550:12;;;;;;;;6516:46;6572:25;6600:19;6615:3;6611;6600:10;;:19;:::i;:::-;6572:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6651:53:66;;6572:47;;-1:-1:-1;6572:47:66;6651:53;;-1:-1:-1;6651:53:66;;;;;;;-1:-1:-1;6651:53:66;;;-1:-1:-1;6651:53:66;:::i;:::-;-1:-1:-1;6629:75:66;;-1:-1:-1;;6718:45:66;;;;;:71;;;;-1:-1:-1;6776:13:66;;;6767:22;;;6776:13;;6767:22;6714:88;;6798:4;6791:11;;;;;;;;;;2145:730:47;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;;;;14102:2:111;788:34:47;;;14084:21:111;14141:2;14121:18;;;14114:30;14180:26;14160:18;;;14153:54;14224:18;;788:34:47;13900:348:111;730:345:47;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;;;;14455:2:111;903:41:47;;;14437:21:111;14494:2;14474:18;;;14467:30;14533:33;14513:18;;;14506:61;14584:18;;903:41:47;14253:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;;;;14815:2:111;1020:44:47;;;14797:21:111;14854:2;14834:18;;;14827:30;14893:34;14873:18;;;14866:62;14964:4;14944:18;;;14937:32;14986:19;;1020:44:47;14613:398:111;5069:1494:47;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;15243:25:111;;;15316:4;15304:17;;15284:18;;;15277:45;;;;15338:18;;;15331:34;;;15381:18;;;15374:34;;;6374:24:47;;15215:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;;;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1282:347::-;1333:8;1343:6;1397:3;1390:4;1382:6;1378:17;1374:27;1364:55;;1415:1;1412;1405:12;1364:55;-1:-1:-1;1438:20:111;;1481:18;1470:30;;1467:50;;;1513:1;1510;1503:12;1467:50;1550:4;1542:6;1538:17;1526:29;;1602:3;1595:4;1586:6;1578;1574:19;1570:30;1567:39;1564:59;;;1619:1;1616;1609:12;1634:409;1704:6;1712;1765:2;1753:9;1744:7;1740:23;1736:32;1733:52;;;1781:1;1778;1771:12;1733:52;1821:9;1808:23;1854:18;1846:6;1843:30;1840:50;;;1886:1;1883;1876:12;1840:50;1925:58;1975:7;1966:6;1955:9;1951:22;1925:58;:::i;:::-;2002:8;;1899:84;;-1:-1:-1;1634:409:111;-1:-1:-1;;;;1634:409:111:o;2048:639::-;2220:4;2249:14;2302:2;2294:6;2290:15;2279:9;2272:34;2354:2;2346:6;2342:15;2337:2;2326:9;2322:18;2315:43;;2394:2;2389;2378:9;2374:18;2367:30;2433:6;2428:2;2417:9;2413:18;2406:34;2491:6;2483;2477:3;2466:9;2462:19;2449:49;2548:1;2542:3;2533:6;2522:9;2518:22;2514:32;2507:43;2677:3;2607:66;2602:2;2594:6;2590:15;2586:88;2575:9;2571:104;2567:114;2559:122;;2048:639;;;;;;;:::o;2692:162::-;2758:5;2803:3;2794:6;2789:3;2785:16;2781:26;2778:46;;;2820:1;2817;2810:12;2778:46;-1:-1:-1;2842:6:111;2692:162;-1:-1:-1;2692:162:111:o;2859:167::-;2926:20;;2986:14;2975:26;;2965:37;;2955:65;;3016:1;3013;3006:12;2955:65;2859:167;;;:::o;3031:513::-;3140:6;3148;3156;3209:2;3197:9;3188:7;3184:23;3180:32;3177:52;;;3225:1;3222;3215:12;3177:52;3265:9;3252:23;3298:18;3290:6;3287:30;3284:50;;;3330:1;3327;3320:12;3284:50;3353:73;3418:7;3409:6;3398:9;3394:22;3353:73;:::i;:::-;3343:83;;;3445:37;3478:2;3467:9;3463:18;3445:37;:::i;:::-;3435:47;;3501:37;3534:2;3523:9;3519:18;3501:37;:::i;:::-;3491:47;;3031:513;;;;;:::o;3731:255::-;3790:6;3843:2;3831:9;3822:7;3818:23;3814:32;3811:52;;;3859:1;3856;3849:12;3811:52;3898:9;3885:23;3917:39;3950:5;3917:39;:::i;4173:637::-;4277:6;4285;4293;4301;4354:2;4342:9;4333:7;4329:23;4325:32;4322:52;;;4370:1;4367;4360:12;4322:52;4409:9;4396:23;4448:1;4441:5;4438:12;4428:40;;4464:1;4461;4454:12;4428:40;4487:5;-1:-1:-1;4543:2:111;4528:18;;4515:32;4570:18;4559:30;;4556:50;;;4602:1;4599;4592:12;4556:50;4641:58;4691:7;4682:6;4671:9;4667:22;4641:58;:::i;:::-;4173:637;;4718:8;;-1:-1:-1;4615:84:111;;4800:2;4785:18;4772:32;;4173:637;-1:-1:-1;;;;4173:637:111:o;5335:505::-;5446:6;5454;5462;5515:2;5503:9;5494:7;5490:23;5486:32;5483:52;;;5531:1;5528;5521:12;5483:52;5571:9;5558:23;5604:18;5596:6;5593:30;5590:50;;;5636:1;5633;5626:12;5590:50;5659:73;5724:7;5715:6;5704:9;5700:22;5659:73;:::i;:::-;5649:83;5779:2;5764:18;;5751:32;;-1:-1:-1;5830:2:111;5815:18;;;5802:32;;5335:505;-1:-1:-1;;;;5335:505:111:o;5845:530::-;5886:3;5924:5;5918:12;5951:6;5946:3;5939:19;5976:1;5986:162;6000:6;5997:1;5994:13;5986:162;;;6062:4;6118:13;;;6114:22;;6108:29;6090:11;;;6086:20;;6079:59;6015:12;5986:162;;;6166:6;6163:1;6160:13;6157:87;;;6232:1;6225:4;6216:6;6211:3;6207:16;6203:27;6196:38;6157:87;-1:-1:-1;6289:2:111;6277:15;6294:66;6273:88;6264:98;;;;6364:4;6260:109;;5845:530;-1:-1:-1;;5845:530:111:o;6380:288::-;6555:2;6544:9;6537:21;6518:4;6575:44;6615:2;6604:9;6600:18;6592:6;6575:44;:::i;:::-;6567:52;;6655:6;6650:2;6639:9;6635:18;6628:34;6380:288;;;;;:::o;7188:331::-;7293:9;7304;7346:8;7334:10;7331:24;7328:44;;;7368:1;7365;7358:12;7328:44;7397:6;7387:8;7384:20;7381:40;;;7417:1;7414;7407:12;7381:40;-1:-1:-1;;7443:23:111;;;7488:25;;;;;-1:-1:-1;7188:331:111:o;7524:256::-;7590:6;7598;7651:2;7639:9;7630:7;7626:23;7622:32;7619:52;;;7667:1;7664;7657:12;7619:52;7690:28;7708:9;7690:28;:::i;:::-;7680:38;;7737:37;7770:2;7759:9;7755:18;7737:37;:::i;:::-;7727:47;;7524:256;;;;;:::o;7785:672::-;8068:3;8057:9;8050:22;8031:4;8089:45;8129:3;8118:9;8114:19;8106:6;8089:45;:::i;:::-;8165:2;8150:18;;8143:34;;;;-1:-1:-1;8225:42:111;8213:55;;;;8208:2;8193:18;;8186:83;8300:2;8285:18;;8278:34;;;;8331:14;8382:15;;;8376:3;8361:19;;8354:44;8435:15;8429:3;8414:19;;;8407:44;8081:53;7785:672;-1:-1:-1;7785:672:111:o;8709:184::-;8779:6;8832:2;8820:9;8811:7;8807:23;8803:32;8800:52;;;8848:1;8845;8838:12;8800:52;-1:-1:-1;8871:16:111;;8709:184;-1:-1:-1;8709:184:111:o;9666:580::-;9743:4;9749:6;9809:11;9796:25;9899:66;9888:8;9872:14;9868:29;9864:102;9844:18;9840:127;9830:155;;9981:1;9978;9971:12;9830:155;10008:33;;10060:20;;;-1:-1:-1;10103:18:111;10092:30;;10089:50;;;10135:1;10132;10125:12;10089:50;10168:4;10156:17;;-1:-1:-1;10199:14:111;10195:27;;;10185:38;;10182:58;;;10236:1;10233;10226:12;11376:349;11415:3;11446:66;11439:5;11436:77;11433:257;;11546:77;11543:1;11536:88;11647:4;11644:1;11637:15;11675:4;11672:1;11665:15;11433:257;-1:-1:-1;11717:1:111;11706:13;;11376:349::o;12521:369::-;12679:66;12641:19;;12763:11;;;;12794:1;12786:10;;12783:101;;;12871:2;12865;12858:3;12855:1;12851:11;12848:1;12844:19;12840:28;12836:2;12832:37;12828:46;12819:55;;12783:101;;;12521:369;;;;:::o;12895:328::-;12982:6;12990;13043:2;13031:9;13022:7;13018:23;13014:32;13011:52;;;13059:1;13056;13049:12;13011:52;13091:9;13085:16;13110:39;13143:5;13110:39;:::i;:::-;13213:2;13198:18;;;;13192:25;13168:5;;13192:25;;-1:-1:-1;;;12895:328:111:o;13228:478::-;13332:6;13340;13348;13401:2;13389:9;13380:7;13376:23;13372:32;13369:52;;;13417:1;13414;13407:12;13369:52;13449:9;13443:16;13468:39;13501:5;13468:39;:::i;:::-;13576:2;13561:18;;13555:25;13526:5;;-1:-1:-1;13589:41:111;13555:25;13589:41;:::i;:::-;13649:7;13639:17;;;13696:2;13685:9;13681:18;13675:25;13665:35;;13228:478;;;;;:::o;13711:184::-;13763:77;13760:1;13753:88;13860:4;13857:1;13850:15;13884:4;13881:1;13874:15"},"gasEstimates":{"creation":{"codeDepositCost":"1404400","executionCost":"infinite","totalCost":"infinite"},"external":{"APPROVE_FUNCTION_SELECTOR()":"272","DEPOSIT_FOR_FUNCTION_SELECTOR()":"272","addStake(uint32)":"infinite","approvedToken()":"2369","bobaDepositPaymaster()":"2348","deposit()":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":"infinite","owner()":"2364","parsePaymasterAndData(bytes)":"infinite","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","senderNonce(address)":"2590","transferOwnership(address)":"infinite","unlockStake()":"infinite","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","verifyingSigner()":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_validateCallDataApprove(bytes calldata)":"infinite","_validateCallDataDeposit(bytes calldata)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","pack(struct UserOperation calldata)":"infinite"}},"methodIdentifiers":{"APPROVE_FUNCTION_SELECTOR()":"b02f786e","DEPOSIT_FOR_FUNCTION_SELECTOR()":"56fd76da","addStake(uint32)":"0396cb60","approvedToken()":"bab46259","bobaDepositPaymaster()":"7d3c1162","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":"94e1fc19","owner()":"8da5cb5b","parsePaymasterAndData(bytes)":"94d4ad60","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","senderNonce(address)":"9c90b443","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","verifyingSigner()":"23d9ac9b","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifyingSigner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bobaDepositPaymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_approvedToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"APPROVE_FUNCTION_SELECTOR\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSIT_FOR_FUNCTION_SELECTOR\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"approvedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bobaDepositPaymaster\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"}],\"name\":\"getHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"parsePaymasterAndData\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"senderNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyingSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)\":{\"notice\":\"return the hash we're going to sign off-chain (and validate on-chain) this method is called by the off-chain service, to sign the request. it is called on-chain from the validatePaymasterUserOp, to validate the signature. note that this signature covers all fields of the UserOperation, except the \\\"paymasterAndData\\\", which will carry the signature itself.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"A sample paymaster that uses external service to decide whether to pay for the UserOp. The paymaster trusts an external signer to sign the transaction. The calling user must pass the UserOp to that external signer first, which performs whatever off-chain verification before signing the UserOp. Note that this signature is NOT a replacement for account-specific signature: - the paymaster checks a signature to agree to PAY for GAS. - the account checks a signature to prove identity and account ownership.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/BobaVerifyingPaymaster.sol\":\"BobaVerifyingPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/BobaVerifyingPaymaster.sol\":{\"content\":\"/**\\n * Credit - VerifyingPaymaster.sol from https://github.com/eth-infinitism/account-abstraction\\n */\\n\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\\n * The paymaster trusts an external signer to sign the transaction.\\n * The calling user must pass the UserOp to that external signer first, which performs\\n * whatever off-chain verification before signing the UserOp.\\n * Note that this signature is NOT a replacement for account-specific signature:\\n * - the paymaster checks a signature to agree to PAY for GAS.\\n * - the account checks a signature to prove identity and account ownership.\\n */\\ncontract BobaVerifyingPaymaster is BasePaymaster {\\n\\n using ECDSA for bytes32;\\n using UserOperationLib for UserOperation;\\n\\n uint256 private constant VALID_TIMESTAMP_OFFSET = 20;\\n\\n uint256 private constant SIGNATURE_OFFSET = 84;\\n\\n address public immutable verifyingSigner;\\n address public bobaDepositPaymaster;\\n address public approvedToken;\\n\\n bytes4 public constant APPROVE_FUNCTION_SELECTOR = bytes4(keccak256(\\\"approve(address,uint256)\\\"));\\n bytes4 public constant DEPOSIT_FOR_FUNCTION_SELECTOR = bytes4(keccak256(\\\"addDepositFor(address,address,uint256)\\\"));\\n\\n constructor(IEntryPoint _entryPoint, address _verifyingSigner, address _bobaDepositPaymaster, address _approvedToken) BasePaymaster(_entryPoint) {\\n verifyingSigner = _verifyingSigner;\\n bobaDepositPaymaster = _bobaDepositPaymaster;\\n approvedToken = _approvedToken;\\n }\\n\\n mapping(address => uint256) public senderNonce;\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n // lighter signature scheme. must match UserOp.ts#packUserOp\\n bytes calldata pnd = userOp.paymasterAndData;\\n // copy directly the userOp from calldata up to (but not including) the paymasterAndData.\\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\\n // than referencing each field separately.\\n assembly {\\n let ofs := userOp\\n let len := sub(sub(pnd.offset, ofs), 32)\\n ret := mload(0x40)\\n mstore(0x40, add(ret, add(len, 32)))\\n mstore(ret, len)\\n calldatacopy(add(ret, 32), ofs, len)\\n }\\n }\\n\\n\\n /**\\n * return the hash we're going to sign off-chain (and validate on-chain)\\n * this method is called by the off-chain service, to sign the request.\\n * it is called on-chain from the validatePaymasterUserOp, to validate the signature.\\n * note that this signature covers all fields of the UserOperation, except the \\\"paymasterAndData\\\",\\n * which will carry the signature itself.\\n */\\n function getHash(UserOperation calldata userOp, uint48 validUntil, uint48 validAfter)\\n public view returns (bytes32) {\\n //can't use userOp.hash(), since it contains also the paymasterAndData itself.\\n\\n return keccak256(abi.encode(\\n pack(userOp),\\n block.chainid,\\n address(this),\\n senderNonce[userOp.getSender()],\\n validUntil,\\n validAfter\\n ));\\n }\\n\\n /**\\n * verify our external signer signed this request.\\n * the \\\"paymasterAndData\\\" is expected to be the paymaster and a signature over the entire request params\\n * paymasterAndData[:20] : address(this)\\n * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\\n * paymasterAndData[84:] : signature\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\\n internal override returns (bytes memory context, uint256 validationData) {\\n (requiredPreFund);\\n\\n (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);\\n //ECDSA library supports both 64 and 65-byte long signatures.\\n // we only \\\"require\\\" it here so that the revert reason on invalid signature will be of \\\"VerifyingPaymaster\\\", and not \\\"ECDSA\\\"\\n require(signature.length == 64 || signature.length == 65, \\\"VerifyingPaymaster: invalid signature length in paymasterAndData\\\");\\n bytes32 hash = ECDSA.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));\\n senderNonce[userOp.getSender()]++;\\n\\n //don't revert on signature failure: return SIG_VALIDATION_FAILED\\n if (verifyingSigner != ECDSA.recover(hash, signature)) {\\n return (\\\"\\\",_packValidationData(true,validUntil,validAfter));\\n }\\n\\n require(_validateCallDataApprove(userOp.callData) || _validateCallDataDeposit(userOp.callData), \\\"VerifyingPaymaster: invalid operation\\\");\\n //no need for other on-chain validation: entire UserOp should have been checked\\n // by the external service prior to signing it.\\n return (\\\"\\\",_packValidationData(false,validUntil,validAfter));\\n }\\n\\n function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns(uint48 validUntil, uint48 validAfter, bytes calldata signature) {\\n (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET:SIGNATURE_OFFSET],(uint48, uint48));\\n signature = paymasterAndData[SIGNATURE_OFFSET:];\\n }\\n\\n function _validateCallDataApprove(bytes calldata opCallData) internal view returns(bool) {\\n // check approve\\n if (opCallData.length != 228) return false;\\n bytes4 funcSelector = bytes4(opCallData[132:136]);\\n bytes calldata destData = opCallData[4:36];\\n address dest = abi.decode(destData, (address));\\n if (dest != approvedToken) return false;\\n bytes memory approveParam = opCallData[136:200];\\n (address spender, ) = abi.decode(approveParam, (address, uint256));\\n if (funcSelector == APPROVE_FUNCTION_SELECTOR && spender == bobaDepositPaymaster) return true;\\n return false;\\n }\\n\\n function _validateCallDataDeposit(bytes calldata opCallData) internal view returns(bool) {\\n // check approve\\n if (opCallData.length != 260) return false;\\n bytes4 funcSelector = bytes4(opCallData[132:136]);\\n bytes calldata destData = opCallData[4:36];\\n address dest = abi.decode(destData, (address));\\n if (dest != bobaDepositPaymaster) return false;\\n bytes memory depositParam = opCallData[136:232];\\n (address token, , ) = abi.decode(depositParam, (address, address, uint256));\\n if (funcSelector == DEPOSIT_FOR_FUNCTION_SELECTOR && token == approvedToken) return true;\\n return false;\\n }\\n\\n}\\n\",\"keccak256\":\"0x8f5b381a7ab0572c141b42c33bb21651258ff256326503c964750a96b9d044e7\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/BobaVerifyingPaymaster.sol:BobaVerifyingPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":11803,"contract":"contracts/samples/BobaVerifyingPaymaster.sol:BobaVerifyingPaymaster","label":"bobaDepositPaymaster","offset":0,"slot":"1","type":"t_address"},{"astId":11805,"contract":"contracts/samples/BobaVerifyingPaymaster.sol:BobaVerifyingPaymaster","label":"approvedToken","offset":0,"slot":"2","type":"t_address"},{"astId":11853,"contract":"contracts/samples/BobaVerifyingPaymaster.sol:BobaVerifyingPaymaster","label":"senderNonce","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":{"notice":"return the hash we're going to sign off-chain (and validate on-chain) this method is called by the off-chain service, to sign the request. it is called on-chain from the validatePaymasterUserOp, to validate the signature. note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\", which will carry the signature itself."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"A sample paymaster that uses external service to decide whether to pay for the UserOp. The paymaster trusts an external signer to sign the transaction. The calling user must pass the UserOp to that external signer first, which performs whatever off-chain verification before signing the UserOp. Note that this signature is NOT a replacement for account-specific signature: - the paymaster checks a signature to agree to PAY for GAS. - the account checks a signature to prove identity and account ownership.","version":1}}},"contracts/samples/DepositPaymaster.sol":{"DepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"contract IOracle","name":"tokenPriceOracle","type":"address"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit.","token":"the token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address,address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to","token":"the token deposit to withdraw"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_12259":{"entryPoint":null,"id":12259,"parameterSlots":1,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":107,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_12378":{"entryPoint":null,"id":12378,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":187,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b5060405162001e2338038062001e238339810160408190526200003491620000bb565b8062000040336200006b565b6001600160a01b031660805262000064336000908152600360205260409020439055565b50620000ed565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000ce57600080fd5b81516001600160a01b0381168114620000e657600080fd5b9392505050565b608051611ce96200013a600039600081816103b30152818161052b015281816105f50152818161085c01528181610923015281816109b301528181610b6b0152610e550152611ce96000f3fe6080604052600436106101755760003560e01c8063addd5099116100cb578063c399ec881161007f578063d0e30db011610059578063d0e30db014610499578063f2fde38b146104a1578063f465c77e146104c157600080fd5b8063c399ec8814610442578063cc9c837c14610457578063cd8f80c21461047757600080fd5b8063bb9fe6bf116100b0578063bb9fe6bf146103d5578063c23a5cea146103ea578063c23f001f1461040a57600080fd5b8063addd50991461035e578063b0d691fe146103a157600080fd5b80635476bd721161012d5780638da5cb5b116101075780638da5cb5b146102ce5780639ed0fb681461031a578063a9a234091461033e57600080fd5b80635476bd7214610283578063715018a6146102a3578063796d4371146102b857600080fd5b8063382edd9e1161015e578063382edd9e146101af578063493b0170146101cf5780634a6f84cf1461024857600080fd5b80630396cb601461017a578063205c28781461018f575b600080fd5b61018d61018836600461178f565b6104ef565b005b34801561019b57600080fd5b5061018d6101aa3660046117d7565b6105a1565b3480156101bb57600080fd5b5061018d6101ca366004611803565b610639565b3480156101db57600080fd5b5061022e6101ea366004611844565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152015b60405180910390f35b34801561025457600080fd5b5061027561026336600461187d565b60036020526000908152604090205481565b60405190815260200161023f565b34801561028f57600080fd5b5061018d61029e366004611844565b610754565b3480156102af57600080fd5b5061018d610824565b3480156102c457600080fd5b506102756188b881565b3480156102da57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023f565b34801561032657600080fd5b5061018d336000908152600360205260409020439055565b34801561034a57600080fd5b5061018d61035936600461189a565b610838565b34801561036a57600080fd5b506102f561037936600461187d565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ad57600080fd5b506102f57f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e157600080fd5b5061018d610852565b3480156103f657600080fd5b5061018d61040536600461187d565b6108d6565b34801561041657600080fd5b50610275610425366004611844565b600260209081526000928352604080842090915290825290205481565b34801561044e57600080fd5b50610275610982565b34801561046357600080fd5b5061018d610472366004611803565b610a38565b34801561048357600080fd5b5061018d33600090815260036020526040812055565b61018d610b3d565b3480156104ad57600080fd5b5061018d6104bc36600461187d565b610bc5565b3480156104cd57600080fd5b506104e16104dc366004611929565b610c62565b60405161023f9291906119f3565b6104f7610c85565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561058557600080fd5b505af1158015610599573d6000803e3d6000fd5b505050505050565b6105a9610c85565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561058557600080fd5b61065b73ffffffffffffffffffffffffffffffffffffffff8416333084610cec565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054166106d45760405162461bcd60e51b815260206004820152601160248201527f756e737570706f7274656420746f6b656e00000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260026020908152604080832093861683529290529081208054839290610718908490611a44565b909155505073ffffffffffffffffffffffffffffffffffffffff8216330361074f5761074f33600090815260036020526040812055565b505050565b61075c610c85565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205416156107d15760405162461bcd60e51b815260206004820152601160248201527f546f6b656e20616c72656164792073657400000000000000000000000000000060448201526064016106cb565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b61082c610c85565b6108366000610dc8565b565b610840610e3d565b61084c84848484610ec2565b50505050565b61085a610c85565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108c257600080fd5b505af115801561084c573d6000803e3d6000fd5b6108de610c85565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190611a5c565b905090565b3360009081526003602052604090205415801590610a6457503360009081526003602052604090205443115b610ad65760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610b16908490611a75565b9091555061074f905073ffffffffffffffffffffffffffffffffffffffff8416838361103a565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561096757600080fd5b610bcd610c85565b73ffffffffffffffffffffffffffffffffffffffff8116610c565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106cb565b610c5f81610dc8565b50565b60606000610c6e610e3d565b610c79858585611090565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106cb565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261084c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611371565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108365760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106cb565b600080808080610ed487890189611a8c565b9450945094509450945060008183856188b8610ef09190611add565b610efa908a611a44565b610f049190611add565b610f0e9190611b1a565b905060028a6002811115610f2457610f24611b55565b14610f5057610f4b73ffffffffffffffffffffffffffffffffffffffff8616873084610cec565b610f9a565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a1683529290529081208054839290610f94908490611a75565b90915550505b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604081208291610fe060005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110299190611a44565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261074f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610d46565b606060006188b88560a001351161110f5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106cb565b366000611120610120880188611b84565b90925090506028811461119b5760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106cb565b60006111aa8260148186611bf0565b6111b391611c1a565b60601c9050873560006111c68389611463565b905060006111d38b611597565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260409020549091501561126e5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156113165760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106cb565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b60006113d3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115be9092919063ffffffff16565b80519091501561074f57808060200190518101906113f19190611c62565b61074f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260016020526040812054909116806115005760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106cb565b6040517fd1eca9cf0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff82169063d1eca9cf90602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f9190611a5c565b949350505050565b600060e08201356101008301358082036115b2575092915050565b61158f824883016115cd565b606061158f84846000856115e5565b60008183106115dc57816115de565b825b9392505050565b60608247101561165d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106cb565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516116869190611c84565b60006040518083038185875af1925050503d80600081146116c3576040519150601f19603f3d011682016040523d82523d6000602084013e6116c8565b606091505b50915091506116d9878383876116e4565b979650505050505050565b606083156117605782516000036117595773ffffffffffffffffffffffffffffffffffffffff85163b6117595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106cb565b508161158f565b61158f83838151156117755781518083602001fd5b8060405162461bcd60e51b81526004016106cb9190611ca0565b6000602082840312156117a157600080fd5b813563ffffffff811681146115de57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5f57600080fd5b600080604083850312156117ea57600080fd5b82356117f5816117b5565b946020939093013593505050565b60008060006060848603121561181857600080fd5b8335611823816117b5565b92506020840135611833816117b5565b929592945050506040919091013590565b6000806040838503121561185757600080fd5b8235611862816117b5565b91506020830135611872816117b5565b809150509250929050565b60006020828403121561188f57600080fd5b81356115de816117b5565b600080600080606085870312156118b057600080fd5b8435600381106118bf57600080fd5b9350602085013567ffffffffffffffff808211156118dc57600080fd5b818701915087601f8301126118f057600080fd5b8135818111156118ff57600080fd5b88602082850101111561191157600080fd5b95986020929092019750949560400135945092505050565b60008060006060848603121561193e57600080fd5b833567ffffffffffffffff81111561195557600080fd5b8401610160818703121561196857600080fd5b95602085013595506040909401359392505050565b60005b83811015611998578181015183820152602001611980565b8381111561084c5750506000910152565b600081518084526119c181602086016020860161197d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a0660408301856119a9565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611a5757611a57611a15565b500190565b600060208284031215611a6e57600080fd5b5051919050565b600082821015611a8757611a87611a15565b500390565b600080600080600060a08688031215611aa457600080fd5b8535611aaf816117b5565b94506020860135611abf816117b5565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b1557611b15611a15565b500290565b600082611b50577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb957600080fd5b83018035915067ffffffffffffffff821115611bd457600080fd5b602001915036819003821315611be957600080fd5b9250929050565b60008085851115611c0057600080fd5b83861115611c0d57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015611c5a5780818660140360031b1b83161692505b505092915050565b600060208284031215611c7457600080fd5b815180151581146115de57600080fd5b60008251611c9681846020870161197d565b9190910192915050565b6020815260006115de60208301846119a956fea2646970667358221220bce0210806b65e666ebffcf0e14a8b1521ac8ccddd70bb8a8dbefdf801fed37164736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1E23 CODESIZE SUB DUP1 PUSH3 0x1E23 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xBB JUMP JUMPDEST DUP1 PUSH3 0x40 CALLER PUSH3 0x6B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH3 0x64 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST POP PUSH3 0xED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x1CE9 PUSH3 0x13A PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x3B3 ADD MSTORE DUP2 DUP2 PUSH2 0x52B ADD MSTORE DUP2 DUP2 PUSH2 0x5F5 ADD MSTORE DUP2 DUP2 PUSH2 0x85C ADD MSTORE DUP2 DUP2 PUSH2 0x923 ADD MSTORE DUP2 DUP2 PUSH2 0x9B3 ADD MSTORE DUP2 DUP2 PUSH2 0xB6B ADD MSTORE PUSH2 0xE55 ADD MSTORE PUSH2 0x1CE9 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x175 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xADDD5099 GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x457 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x477 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x3D5 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x3EA JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x5476BD72 GT PUSH2 0x12D JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x5476BD72 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x2B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x15E JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x17A JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x18F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18D PUSH2 0x188 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x4EF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x17D7 JUMP JUMPDEST PUSH2 0x5A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x1CA CALLDATASIZE PUSH1 0x4 PUSH2 0x1803 JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22E PUSH2 0x1EA CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x263 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x29E CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH2 0x754 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x824 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x359 CALLDATASIZE PUSH1 0x4 PUSH2 0x189A JUMP JUMPDEST PUSH2 0x838 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F5 PUSH2 0x379 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F5 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x852 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x405 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH2 0x8D6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x425 CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x982 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x472 CALLDATASIZE PUSH1 0x4 PUSH2 0x1803 JUMP JUMPDEST PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x18D PUSH2 0xB3D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x4BC CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH2 0xBC5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E1 PUSH2 0x4DC CALLDATASIZE PUSH1 0x4 PUSH2 0x1929 JUMP JUMPDEST PUSH2 0xC62 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x23F SWAP3 SWAP2 SWAP1 PUSH2 0x19F3 JUMP JUMPDEST PUSH2 0x4F7 PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x599 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5A9 PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x65B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x6D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E737570706F7274656420746F6B656E000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x718 SWAP1 DUP5 SWAP1 PUSH2 0x1A44 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x74F JUMPI PUSH2 0x74F CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x75C PUSH2 0xC85 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E20616C726561647920736574000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x82C PUSH2 0xC85 JUMP JUMPDEST PUSH2 0x836 PUSH1 0x0 PUSH2 0xDC8 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x840 PUSH2 0xE3D JUMP JUMPDEST PUSH2 0x84C DUP5 DUP5 DUP5 DUP5 PUSH2 0xEC2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x85A PUSH2 0xC85 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x84C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x8DE PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x97B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA33 SWAP2 SWAP1 PUSH2 0x1A5C JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xA64 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xAD6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB16 SWAP1 DUP5 SWAP1 PUSH2 0x1A75 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x74F SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x103A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBCD PUSH2 0xC85 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xC56 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH2 0xC5F DUP2 PUSH2 0xDC8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC6E PUSH2 0xE3D JUMP JUMPDEST PUSH2 0xC79 DUP6 DUP6 DUP6 PUSH2 0x1090 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x836 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x84C SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1371 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x836 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0xED4 DUP8 DUP10 ADD DUP10 PUSH2 0x1A8C JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xEF0 SWAP2 SWAP1 PUSH2 0x1ADD JUMP JUMPDEST PUSH2 0xEFA SWAP1 DUP11 PUSH2 0x1A44 JUMP JUMPDEST PUSH2 0xF04 SWAP2 SWAP1 PUSH2 0x1ADD JUMP JUMPDEST PUSH2 0xF0E SWAP2 SWAP1 PUSH2 0x1B1A JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xF24 JUMPI PUSH2 0xF24 PUSH2 0x1B55 JUMP JUMPDEST EQ PUSH2 0xF50 JUMPI PUSH2 0xF4B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH2 0xF9A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xF94 SWAP1 DUP5 SWAP1 PUSH2 0x1A75 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0xFE0 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1029 SWAP2 SWAP1 PUSH2 0x1A44 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x74F SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xD46 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x110F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x1120 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x1B84 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x119B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11AA DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x1BF0 JUMP JUMPDEST PUSH2 0x11B3 SWAP2 PUSH2 0x1C1A JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x11C6 DUP4 DUP10 PUSH2 0x1463 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11D3 DUP12 PUSH2 0x1597 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x126E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x1316 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13D3 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x15BE SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x74F JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x13F1 SWAP2 SWAP1 PUSH2 0x1C62 JUMP JUMPDEST PUSH2 0x74F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND DUP1 PUSH2 0x1500 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD1ECA9CF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xD1ECA9CF SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x158F SWAP2 SWAP1 PUSH2 0x1A5C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x15B2 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x158F DUP3 BASEFEE DUP4 ADD PUSH2 0x15CD JUMP JUMPDEST PUSH1 0x60 PUSH2 0x158F DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x15DC JUMPI DUP2 PUSH2 0x15DE JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x165D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1686 SWAP2 SWAP1 PUSH2 0x1C84 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x16C3 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16C8 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16D9 DUP8 DUP4 DUP4 DUP8 PUSH2 0x16E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1760 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1759 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1759 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST POP DUP2 PUSH2 0x158F JUMP JUMPDEST PUSH2 0x158F DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1775 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6CB SWAP2 SWAP1 PUSH2 0x1CA0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x15DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xC5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x17EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x17F5 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1818 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1823 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1833 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1862 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1872 DUP2 PUSH2 0x17B5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x188F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x15DE DUP2 PUSH2 0x17B5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x18B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x18BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x18DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x18F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x18FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x193E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1955 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1968 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1998 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1980 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x84C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x19C1 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x197D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1A06 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x19A9 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1A57 JUMPI PUSH2 0x1A57 PUSH2 0x1A15 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1A87 JUMPI PUSH2 0x1A87 PUSH2 0x1A15 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1AA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1AAF DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1ABF DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1B15 JUMPI PUSH2 0x1B15 PUSH2 0x1A15 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B50 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1BD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1BE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x1C0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1C5A JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x15DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C96 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x197D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x15DE PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x19A9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC 0xE0 0x21 ADDMOD MOD 0xB6 0x5E PUSH7 0x6EBFFCF0E14A8B ISZERO 0x21 0xAC DUP13 0xCD 0xDD PUSH17 0xBB8A8DBEFDF801FED37164736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"1215:6492:67:-:0;;;1663:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1714:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;1809:20:67::1;3629:10:::0;3617:23;;;;:11;:23;;;;;3643:12;3617:38;;3570:92;1809:20:::1;1663:173:::0;1215:6492;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;1215:6492:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_12220":{"entryPoint":null,"id":12220,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":4977,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":3205,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_12662":{"entryPoint":3778,"id":12662,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":3645,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":3528,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_12575":{"entryPoint":4240,"id":12575,"parameterSlots":3,"returnSlots":2},"@addDepositFor_12337":{"entryPoint":1593,"id":12337,"parameterSlots":3,"returnSlots":0},"@addStake_7469":{"entryPoint":1263,"id":7469,"parameterSlots":1,"returnSlots":0},"@addToken_12287":{"entryPoint":1876,"id":12287,"parameterSlots":2,"returnSlots":0},"@balances_12242":{"entryPoint":null,"id":12242,"parameterSlots":0,"returnSlots":0},"@depositInfo_12365":{"entryPoint":null,"id":12365,"parameterSlots":2,"returnSlots":2},"@deposit_7433":{"entryPoint":2877,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":5605,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":5566,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPrice_11050":{"entryPoint":5527,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":2434,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEth_12467":{"entryPoint":5219,"id":12467,"parameterSlots":2,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_12390":{"entryPoint":null,"id":12390,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":5581,"id":11162,"parameterSlots":2,"returnSlots":1},"@oracles_12235":{"entryPoint":null,"id":12235,"parameterSlots":0,"returnSlots":0},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":2104,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":2084,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":3308,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":4154,"id":4512,"parameterSlots":3,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":3013,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_12246":{"entryPoint":null,"id":12246,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":2130,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_12378":{"entryPoint":null,"id":12378,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":3170,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":5860,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":2262,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1441,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_12436":{"entryPoint":2616,"id":12436,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":6269,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":6796,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":6103,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":7266,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419t_address":{"entryPoint":6212,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256":{"entryPoint":6147,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IOracle_$13149":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":6298,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6441,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":6748,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":6031,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":6569,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":7300,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":6643,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IOracle_$13149__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":7328,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3f1933bd5ead9cc60725798c84c3187e65fc3fa59401c57f2eee69bc2353d104__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_507d798c5ad4be89d4f3da658d37b2094b23f09aca616c68bd08d2df2115802a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":7044,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":7152,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":6724,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":6938,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":6877,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":6773,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":7194,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":6525,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":6677,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":6997,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":6069,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:17887:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"917:368:111","statements":[{"body":{"nodeType":"YulBlock","src":"963:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"972:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"975:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"965:6:111"},"nodeType":"YulFunctionCall","src":"965:12:111"},"nodeType":"YulExpressionStatement","src":"965:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"938:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"947:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"934:3:111"},"nodeType":"YulFunctionCall","src":"934:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"959:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"930:3:111"},"nodeType":"YulFunctionCall","src":"930:32:111"},"nodeType":"YulIf","src":"927:52:111"},{"nodeType":"YulVariableDeclaration","src":"988:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1014:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1001:12:111"},"nodeType":"YulFunctionCall","src":"1001:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"992:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1066:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1033:32:111"},"nodeType":"YulFunctionCall","src":"1033:39:111"},"nodeType":"YulExpressionStatement","src":"1033:39:111"},{"nodeType":"YulAssignment","src":"1081:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1091:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1081:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1105:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1133:3:111"},"nodeType":"YulFunctionCall","src":"1133:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1120:12:111"},"nodeType":"YulFunctionCall","src":"1120:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1109:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1194:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1161:32:111"},"nodeType":"YulFunctionCall","src":"1161:41:111"},"nodeType":"YulExpressionStatement","src":"1161:41:111"},{"nodeType":"YulAssignment","src":"1211:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1221:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1211:6:111"}]},{"nodeType":"YulAssignment","src":"1237:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1264:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1275:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1260:3:111"},"nodeType":"YulFunctionCall","src":"1260:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1247:12:111"},"nodeType":"YulFunctionCall","src":"1247:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1237:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"867:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"878:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"890:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"898:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"906:6:111","type":""}],"src":"798:487:111"},{"body":{"nodeType":"YulBlock","src":"1392:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"1438:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1447:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1450:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1440:6:111"},"nodeType":"YulFunctionCall","src":"1440:12:111"},"nodeType":"YulExpressionStatement","src":"1440:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1413:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1422:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1409:3:111"},"nodeType":"YulFunctionCall","src":"1409:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1434:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1405:3:111"},"nodeType":"YulFunctionCall","src":"1405:32:111"},"nodeType":"YulIf","src":"1402:52:111"},{"nodeType":"YulVariableDeclaration","src":"1463:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1489:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1476:12:111"},"nodeType":"YulFunctionCall","src":"1476:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1467:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1541:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1508:32:111"},"nodeType":"YulFunctionCall","src":"1508:39:111"},"nodeType":"YulExpressionStatement","src":"1508:39:111"},{"nodeType":"YulAssignment","src":"1556:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1566:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1556:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1580:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1612:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1623:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1608:3:111"},"nodeType":"YulFunctionCall","src":"1608:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1595:12:111"},"nodeType":"YulFunctionCall","src":"1595:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1584:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1669:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1636:32:111"},"nodeType":"YulFunctionCall","src":"1636:41:111"},"nodeType":"YulExpressionStatement","src":"1636:41:111"},{"nodeType":"YulAssignment","src":"1686:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1696:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1686:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1350:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1361:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1373:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1381:6:111","type":""}],"src":"1290:419:111"},{"body":{"nodeType":"YulBlock","src":"1843:119:111","statements":[{"nodeType":"YulAssignment","src":"1853:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1865:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1876:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1861:3:111"},"nodeType":"YulFunctionCall","src":"1861:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1853:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1895:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1906:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1888:6:111"},"nodeType":"YulFunctionCall","src":"1888:25:111"},"nodeType":"YulExpressionStatement","src":"1888:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1933:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1944:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1929:3:111"},"nodeType":"YulFunctionCall","src":"1929:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"1949:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1922:6:111"},"nodeType":"YulFunctionCall","src":"1922:34:111"},"nodeType":"YulExpressionStatement","src":"1922:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1804:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1815:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1823:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1834:4:111","type":""}],"src":"1714:248:111"},{"body":{"nodeType":"YulBlock","src":"2037:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"2083:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2092:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2095:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2085:6:111"},"nodeType":"YulFunctionCall","src":"2085:12:111"},"nodeType":"YulExpressionStatement","src":"2085:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2058:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2067:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2054:3:111"},"nodeType":"YulFunctionCall","src":"2054:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2079:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2050:3:111"},"nodeType":"YulFunctionCall","src":"2050:32:111"},"nodeType":"YulIf","src":"2047:52:111"},{"nodeType":"YulVariableDeclaration","src":"2108:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2134:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2121:12:111"},"nodeType":"YulFunctionCall","src":"2121:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2112:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2186:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2153:32:111"},"nodeType":"YulFunctionCall","src":"2153:39:111"},"nodeType":"YulExpressionStatement","src":"2153:39:111"},{"nodeType":"YulAssignment","src":"2201:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2211:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2201:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2003:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2014:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2026:6:111","type":""}],"src":"1967:255:111"},{"body":{"nodeType":"YulBlock","src":"2328:76:111","statements":[{"nodeType":"YulAssignment","src":"2338:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2361:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2346:3:111"},"nodeType":"YulFunctionCall","src":"2346:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2338:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2380:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2391:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2373:6:111"},"nodeType":"YulFunctionCall","src":"2373:25:111"},"nodeType":"YulExpressionStatement","src":"2373:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2297:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2308:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2319:4:111","type":""}],"src":"2227:177:111"},{"body":{"nodeType":"YulBlock","src":"2528:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"2574:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2583:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2586:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2576:6:111"},"nodeType":"YulFunctionCall","src":"2576:12:111"},"nodeType":"YulExpressionStatement","src":"2576:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2549:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2558:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2545:3:111"},"nodeType":"YulFunctionCall","src":"2545:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2570:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2541:3:111"},"nodeType":"YulFunctionCall","src":"2541:32:111"},"nodeType":"YulIf","src":"2538:52:111"},{"nodeType":"YulVariableDeclaration","src":"2599:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2625:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2612:12:111"},"nodeType":"YulFunctionCall","src":"2612:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2603:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2677:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2644:32:111"},"nodeType":"YulFunctionCall","src":"2644:39:111"},"nodeType":"YulExpressionStatement","src":"2644:39:111"},{"nodeType":"YulAssignment","src":"2692:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2702:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2692:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2716:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2748:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2759:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2744:3:111"},"nodeType":"YulFunctionCall","src":"2744:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2731:12:111"},"nodeType":"YulFunctionCall","src":"2731:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2720:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2805:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2772:32:111"},"nodeType":"YulFunctionCall","src":"2772:41:111"},"nodeType":"YulExpressionStatement","src":"2772:41:111"},{"nodeType":"YulAssignment","src":"2822:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2832:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2822:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IOracle_$13149","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2486:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2497:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2509:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2517:6:111","type":""}],"src":"2409:436:111"},{"body":{"nodeType":"YulBlock","src":"2951:125:111","statements":[{"nodeType":"YulAssignment","src":"2961:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2973:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2984:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2969:3:111"},"nodeType":"YulFunctionCall","src":"2969:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2961:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3003:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3018:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3026:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3014:3:111"},"nodeType":"YulFunctionCall","src":"3014:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2996:6:111"},"nodeType":"YulFunctionCall","src":"2996:74:111"},"nodeType":"YulExpressionStatement","src":"2996:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2920:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2931:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2942:4:111","type":""}],"src":"2850:226:111"},{"body":{"nodeType":"YulBlock","src":"3220:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"3266:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3275:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3278:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3268:6:111"},"nodeType":"YulFunctionCall","src":"3268:12:111"},"nodeType":"YulExpressionStatement","src":"3268:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3241:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3250:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3237:3:111"},"nodeType":"YulFunctionCall","src":"3237:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3262:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3233:3:111"},"nodeType":"YulFunctionCall","src":"3233:32:111"},"nodeType":"YulIf","src":"3230:52:111"},{"nodeType":"YulVariableDeclaration","src":"3291:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3317:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3304:12:111"},"nodeType":"YulFunctionCall","src":"3304:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3295:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3360:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3369:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3372:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3362:6:111"},"nodeType":"YulFunctionCall","src":"3362:12:111"},"nodeType":"YulExpressionStatement","src":"3362:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3349:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3356:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3346:2:111"},"nodeType":"YulFunctionCall","src":"3346:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3339:6:111"},"nodeType":"YulFunctionCall","src":"3339:20:111"},"nodeType":"YulIf","src":"3336:40:111"},{"nodeType":"YulAssignment","src":"3385:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3395:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3385:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3409:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3451:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3436:3:111"},"nodeType":"YulFunctionCall","src":"3436:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3423:12:111"},"nodeType":"YulFunctionCall","src":"3423:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3413:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3464:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3474:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3468:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3519:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3528:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3531:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3521:6:111"},"nodeType":"YulFunctionCall","src":"3521:12:111"},"nodeType":"YulExpressionStatement","src":"3521:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3507:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3515:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3504:2:111"},"nodeType":"YulFunctionCall","src":"3504:14:111"},"nodeType":"YulIf","src":"3501:34:111"},{"nodeType":"YulVariableDeclaration","src":"3544:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3558:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3569:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3554:3:111"},"nodeType":"YulFunctionCall","src":"3554:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3548:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3624:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3636:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3626:6:111"},"nodeType":"YulFunctionCall","src":"3626:12:111"},"nodeType":"YulExpressionStatement","src":"3626:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3603:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3607:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3599:3:111"},"nodeType":"YulFunctionCall","src":"3599:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3614:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3595:3:111"},"nodeType":"YulFunctionCall","src":"3595:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3588:6:111"},"nodeType":"YulFunctionCall","src":"3588:35:111"},"nodeType":"YulIf","src":"3585:55:111"},{"nodeType":"YulVariableDeclaration","src":"3649:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3676:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3663:12:111"},"nodeType":"YulFunctionCall","src":"3663:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3653:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3706:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3715:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3718:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3708:6:111"},"nodeType":"YulFunctionCall","src":"3708:12:111"},"nodeType":"YulExpressionStatement","src":"3708:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3694:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3702:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3691:2:111"},"nodeType":"YulFunctionCall","src":"3691:14:111"},"nodeType":"YulIf","src":"3688:34:111"},{"body":{"nodeType":"YulBlock","src":"3772:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3781:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3784:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3774:6:111"},"nodeType":"YulFunctionCall","src":"3774:12:111"},"nodeType":"YulExpressionStatement","src":"3774:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3745:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"3749:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3741:3:111"},"nodeType":"YulFunctionCall","src":"3741:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3758:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3737:3:111"},"nodeType":"YulFunctionCall","src":"3737:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3763:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3734:2:111"},"nodeType":"YulFunctionCall","src":"3734:37:111"},"nodeType":"YulIf","src":"3731:57:111"},{"nodeType":"YulAssignment","src":"3797:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3811:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3815:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3807:3:111"},"nodeType":"YulFunctionCall","src":"3807:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3797:6:111"}]},{"nodeType":"YulAssignment","src":"3827:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"3837:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3827:6:111"}]},{"nodeType":"YulAssignment","src":"3852:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3879:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3890:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3875:3:111"},"nodeType":"YulFunctionCall","src":"3875:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3862:12:111"},"nodeType":"YulFunctionCall","src":"3862:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"3852:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3162:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3173:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3185:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3193:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3201:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3209:6:111","type":""}],"src":"3081:819:111"},{"body":{"nodeType":"YulBlock","src":"3990:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"4036:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4045:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4048:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4038:6:111"},"nodeType":"YulFunctionCall","src":"4038:12:111"},"nodeType":"YulExpressionStatement","src":"4038:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4011:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4020:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4007:3:111"},"nodeType":"YulFunctionCall","src":"4007:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4032:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4003:3:111"},"nodeType":"YulFunctionCall","src":"4003:32:111"},"nodeType":"YulIf","src":"4000:52:111"},{"nodeType":"YulVariableDeclaration","src":"4061:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4087:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4074:12:111"},"nodeType":"YulFunctionCall","src":"4074:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4065:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4139:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"4106:32:111"},"nodeType":"YulFunctionCall","src":"4106:39:111"},"nodeType":"YulExpressionStatement","src":"4106:39:111"},{"nodeType":"YulAssignment","src":"4154:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4164:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4154:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3956:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3967:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3979:6:111","type":""}],"src":"3905:270:111"},{"body":{"nodeType":"YulBlock","src":"4298:125:111","statements":[{"nodeType":"YulAssignment","src":"4308:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4320:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4331:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4316:3:111"},"nodeType":"YulFunctionCall","src":"4316:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4308:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4350:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4365:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4373:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4361:3:111"},"nodeType":"YulFunctionCall","src":"4361:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4343:6:111"},"nodeType":"YulFunctionCall","src":"4343:74:111"},"nodeType":"YulExpressionStatement","src":"4343:74:111"}]},"name":"abi_encode_tuple_t_contract$_IOracle_$13149__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4267:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4278:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4289:4:111","type":""}],"src":"4180:243:111"},{"body":{"nodeType":"YulBlock","src":"4550:125:111","statements":[{"nodeType":"YulAssignment","src":"4560:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4572:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4583:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4568:3:111"},"nodeType":"YulFunctionCall","src":"4568:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4560:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4602:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4617:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4625:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4613:3:111"},"nodeType":"YulFunctionCall","src":"4613:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4595:6:111"},"nodeType":"YulFunctionCall","src":"4595:74:111"},"nodeType":"YulExpressionStatement","src":"4595:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4519:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4530:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4541:4:111","type":""}],"src":"4428:247:111"},{"body":{"nodeType":"YulBlock","src":"4758:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"4804:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4813:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4816:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4806:6:111"},"nodeType":"YulFunctionCall","src":"4806:12:111"},"nodeType":"YulExpressionStatement","src":"4806:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4779:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4788:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4775:3:111"},"nodeType":"YulFunctionCall","src":"4775:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4800:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4771:3:111"},"nodeType":"YulFunctionCall","src":"4771:32:111"},"nodeType":"YulIf","src":"4768:52:111"},{"nodeType":"YulVariableDeclaration","src":"4829:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4855:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4842:12:111"},"nodeType":"YulFunctionCall","src":"4842:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4833:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4907:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"4874:32:111"},"nodeType":"YulFunctionCall","src":"4874:39:111"},"nodeType":"YulExpressionStatement","src":"4874:39:111"},{"nodeType":"YulAssignment","src":"4922:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4932:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4922:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4724:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4735:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4747:6:111","type":""}],"src":"4680:263:111"},{"body":{"nodeType":"YulBlock","src":"5086:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5132:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5141:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5144:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5134:6:111"},"nodeType":"YulFunctionCall","src":"5134:12:111"},"nodeType":"YulExpressionStatement","src":"5134:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5107:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5116:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5103:3:111"},"nodeType":"YulFunctionCall","src":"5103:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5128:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5099:3:111"},"nodeType":"YulFunctionCall","src":"5099:32:111"},"nodeType":"YulIf","src":"5096:52:111"},{"nodeType":"YulVariableDeclaration","src":"5157:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5184:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5171:12:111"},"nodeType":"YulFunctionCall","src":"5171:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5161:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5237:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5246:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5249:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5239:6:111"},"nodeType":"YulFunctionCall","src":"5239:12:111"},"nodeType":"YulExpressionStatement","src":"5239:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5209:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5217:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5206:2:111"},"nodeType":"YulFunctionCall","src":"5206:30:111"},"nodeType":"YulIf","src":"5203:50:111"},{"nodeType":"YulVariableDeclaration","src":"5262:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5276:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5287:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5272:3:111"},"nodeType":"YulFunctionCall","src":"5272:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5266:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5333:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5342:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5345:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5335:6:111"},"nodeType":"YulFunctionCall","src":"5335:12:111"},"nodeType":"YulExpressionStatement","src":"5335:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5314:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5323:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5310:3:111"},"nodeType":"YulFunctionCall","src":"5310:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5328:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5306:3:111"},"nodeType":"YulFunctionCall","src":"5306:26:111"},"nodeType":"YulIf","src":"5303:46:111"},{"nodeType":"YulAssignment","src":"5358:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5368:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5358:6:111"}]},{"nodeType":"YulAssignment","src":"5379:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5406:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5417:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5402:3:111"},"nodeType":"YulFunctionCall","src":"5402:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5389:12:111"},"nodeType":"YulFunctionCall","src":"5389:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5379:6:111"}]},{"nodeType":"YulAssignment","src":"5430:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5457:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5468:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5453:3:111"},"nodeType":"YulFunctionCall","src":"5453:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5440:12:111"},"nodeType":"YulFunctionCall","src":"5440:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5430:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5036:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5047:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5059:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5067:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5075:6:111","type":""}],"src":"4948:530:111"},{"body":{"nodeType":"YulBlock","src":"5536:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5546:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5555:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5550:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5615:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5640:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"5645:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5636:3:111"},"nodeType":"YulFunctionCall","src":"5636:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"5659:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"5664:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5655:3:111"},"nodeType":"YulFunctionCall","src":"5655:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5649:5:111"},"nodeType":"YulFunctionCall","src":"5649:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5629:6:111"},"nodeType":"YulFunctionCall","src":"5629:39:111"},"nodeType":"YulExpressionStatement","src":"5629:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5576:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5579:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5573:2:111"},"nodeType":"YulFunctionCall","src":"5573:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5587:19:111","statements":[{"nodeType":"YulAssignment","src":"5589:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5598:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5601:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5594:3:111"},"nodeType":"YulFunctionCall","src":"5594:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5589:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5569:3:111","statements":[]},"src":"5565:113:111"},{"body":{"nodeType":"YulBlock","src":"5704:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5717:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5722:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5713:3:111"},"nodeType":"YulFunctionCall","src":"5713:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5731:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5706:6:111"},"nodeType":"YulFunctionCall","src":"5706:27:111"},"nodeType":"YulExpressionStatement","src":"5706:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5693:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5696:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5690:2:111"},"nodeType":"YulFunctionCall","src":"5690:13:111"},"nodeType":"YulIf","src":"5687:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"5514:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"5519:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"5524:6:111","type":""}],"src":"5483:258:111"},{"body":{"nodeType":"YulBlock","src":"5795:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5805:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5825:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5819:5:111"},"nodeType":"YulFunctionCall","src":"5819:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5809:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5847:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5852:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5840:6:111"},"nodeType":"YulFunctionCall","src":"5840:19:111"},"nodeType":"YulExpressionStatement","src":"5840:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5894:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5901:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5890:3:111"},"nodeType":"YulFunctionCall","src":"5890:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5912:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5917:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5908:3:111"},"nodeType":"YulFunctionCall","src":"5908:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"5924:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"5868:21:111"},"nodeType":"YulFunctionCall","src":"5868:63:111"},"nodeType":"YulExpressionStatement","src":"5868:63:111"},{"nodeType":"YulAssignment","src":"5940:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5955:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5968:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5976:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5964:3:111"},"nodeType":"YulFunctionCall","src":"5964:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5981:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5960:3:111"},"nodeType":"YulFunctionCall","src":"5960:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5951:3:111"},"nodeType":"YulFunctionCall","src":"5951:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"6051:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5947:3:111"},"nodeType":"YulFunctionCall","src":"5947:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"5940:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5772:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"5779:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5787:3:111","type":""}],"src":"5746:316:111"},{"body":{"nodeType":"YulBlock","src":"6214:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6231:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6242:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6224:6:111"},"nodeType":"YulFunctionCall","src":"6224:21:111"},"nodeType":"YulExpressionStatement","src":"6224:21:111"},{"nodeType":"YulAssignment","src":"6254:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6279:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6302:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6287:3:111"},"nodeType":"YulFunctionCall","src":"6287:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"6262:16:111"},"nodeType":"YulFunctionCall","src":"6262:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6254:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6326:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6337:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6322:3:111"},"nodeType":"YulFunctionCall","src":"6322:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6342:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6315:6:111"},"nodeType":"YulFunctionCall","src":"6315:34:111"},"nodeType":"YulExpressionStatement","src":"6315:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6175:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6186:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6194:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6205:4:111","type":""}],"src":"6067:288:111"},{"body":{"nodeType":"YulBlock","src":"6459:93:111","statements":[{"nodeType":"YulAssignment","src":"6469:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6481:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6492:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6477:3:111"},"nodeType":"YulFunctionCall","src":"6477:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6469:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6511:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6526:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6534:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6522:3:111"},"nodeType":"YulFunctionCall","src":"6522:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6504:6:111"},"nodeType":"YulFunctionCall","src":"6504:42:111"},"nodeType":"YulExpressionStatement","src":"6504:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6428:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6439:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6450:4:111","type":""}],"src":"6360:192:111"},{"body":{"nodeType":"YulBlock","src":"6702:168:111","statements":[{"nodeType":"YulAssignment","src":"6712:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6724:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6735:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6720:3:111"},"nodeType":"YulFunctionCall","src":"6720:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6712:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6754:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6769:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6777:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6765:3:111"},"nodeType":"YulFunctionCall","src":"6765:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6747:6:111"},"nodeType":"YulFunctionCall","src":"6747:74:111"},"nodeType":"YulExpressionStatement","src":"6747:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6852:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6837:3:111"},"nodeType":"YulFunctionCall","src":"6837:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6857:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6830:6:111"},"nodeType":"YulFunctionCall","src":"6830:34:111"},"nodeType":"YulExpressionStatement","src":"6830:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6663:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6674:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6682:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6693:4:111","type":""}],"src":"6557:313:111"},{"body":{"nodeType":"YulBlock","src":"7049:167:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7077:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7059:6:111"},"nodeType":"YulFunctionCall","src":"7059:21:111"},"nodeType":"YulExpressionStatement","src":"7059:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7100:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7111:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7096:3:111"},"nodeType":"YulFunctionCall","src":"7096:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7116:2:111","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7089:6:111"},"nodeType":"YulFunctionCall","src":"7089:30:111"},"nodeType":"YulExpressionStatement","src":"7089:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7139:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7150:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7135:3:111"},"nodeType":"YulFunctionCall","src":"7135:18:111"},{"hexValue":"756e737570706f7274656420746f6b656e","kind":"string","nodeType":"YulLiteral","src":"7155:19:111","type":"","value":"unsupported token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7128:6:111"},"nodeType":"YulFunctionCall","src":"7128:47:111"},"nodeType":"YulExpressionStatement","src":"7128:47:111"},{"nodeType":"YulAssignment","src":"7184:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7196:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7207:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7192:3:111"},"nodeType":"YulFunctionCall","src":"7192:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7184:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_507d798c5ad4be89d4f3da658d37b2094b23f09aca616c68bd08d2df2115802a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7026:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7040:4:111","type":""}],"src":"6875:341:111"},{"body":{"nodeType":"YulBlock","src":"7253:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7270:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7273:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7263:6:111"},"nodeType":"YulFunctionCall","src":"7263:88:111"},"nodeType":"YulExpressionStatement","src":"7263:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7367:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"7370:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7360:6:111"},"nodeType":"YulFunctionCall","src":"7360:15:111"},"nodeType":"YulExpressionStatement","src":"7360:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7391:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7394:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7384:6:111"},"nodeType":"YulFunctionCall","src":"7384:15:111"},"nodeType":"YulExpressionStatement","src":"7384:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"7221:184:111"},{"body":{"nodeType":"YulBlock","src":"7458:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"7485:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7487:16:111"},"nodeType":"YulFunctionCall","src":"7487:18:111"},"nodeType":"YulExpressionStatement","src":"7487:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7474:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"7481:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"7477:3:111"},"nodeType":"YulFunctionCall","src":"7477:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7471:2:111"},"nodeType":"YulFunctionCall","src":"7471:13:111"},"nodeType":"YulIf","src":"7468:39:111"},{"nodeType":"YulAssignment","src":"7516:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7527:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7530:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7523:3:111"},"nodeType":"YulFunctionCall","src":"7523:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"7516:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"7441:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"7444:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"7450:3:111","type":""}],"src":"7410:128:111"},{"body":{"nodeType":"YulBlock","src":"7717:167:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7745:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7727:6:111"},"nodeType":"YulFunctionCall","src":"7727:21:111"},"nodeType":"YulExpressionStatement","src":"7727:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7768:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7779:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7764:3:111"},"nodeType":"YulFunctionCall","src":"7764:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7784:2:111","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7757:6:111"},"nodeType":"YulFunctionCall","src":"7757:30:111"},"nodeType":"YulExpressionStatement","src":"7757:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7818:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7803:3:111"},"nodeType":"YulFunctionCall","src":"7803:18:111"},{"hexValue":"546f6b656e20616c726561647920736574","kind":"string","nodeType":"YulLiteral","src":"7823:19:111","type":"","value":"Token already set"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7796:6:111"},"nodeType":"YulFunctionCall","src":"7796:47:111"},"nodeType":"YulExpressionStatement","src":"7796:47:111"},{"nodeType":"YulAssignment","src":"7852:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7864:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7875:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7860:3:111"},"nodeType":"YulFunctionCall","src":"7860:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7852:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3f1933bd5ead9cc60725798c84c3187e65fc3fa59401c57f2eee69bc2353d104__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7694:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7708:4:111","type":""}],"src":"7543:341:111"},{"body":{"nodeType":"YulBlock","src":"8006:125:111","statements":[{"nodeType":"YulAssignment","src":"8016:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8028:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8039:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8024:3:111"},"nodeType":"YulFunctionCall","src":"8024:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8016:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8058:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8073:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8081:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8069:3:111"},"nodeType":"YulFunctionCall","src":"8069:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8051:6:111"},"nodeType":"YulFunctionCall","src":"8051:74:111"},"nodeType":"YulExpressionStatement","src":"8051:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7975:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7986:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7997:4:111","type":""}],"src":"7889:242:111"},{"body":{"nodeType":"YulBlock","src":"8217:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"8263:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8272:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8275:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8265:6:111"},"nodeType":"YulFunctionCall","src":"8265:12:111"},"nodeType":"YulExpressionStatement","src":"8265:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8238:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8247:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8234:3:111"},"nodeType":"YulFunctionCall","src":"8234:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8259:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8230:3:111"},"nodeType":"YulFunctionCall","src":"8230:32:111"},"nodeType":"YulIf","src":"8227:52:111"},{"nodeType":"YulAssignment","src":"8288:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8304:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8298:5:111"},"nodeType":"YulFunctionCall","src":"8298:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8288:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8183:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8194:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8206:6:111","type":""}],"src":"8136:184:111"},{"body":{"nodeType":"YulBlock","src":"8499:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8516:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8527:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8509:6:111"},"nodeType":"YulFunctionCall","src":"8509:21:111"},"nodeType":"YulExpressionStatement","src":"8509:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8550:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8561:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8546:3:111"},"nodeType":"YulFunctionCall","src":"8546:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8566:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8539:6:111"},"nodeType":"YulFunctionCall","src":"8539:30:111"},"nodeType":"YulExpressionStatement","src":"8539:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8589:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8600:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8585:3:111"},"nodeType":"YulFunctionCall","src":"8585:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"8605:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8578:6:111"},"nodeType":"YulFunctionCall","src":"8578:62:111"},"nodeType":"YulExpressionStatement","src":"8578:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8660:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8671:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8656:3:111"},"nodeType":"YulFunctionCall","src":"8656:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"8676:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8649:6:111"},"nodeType":"YulFunctionCall","src":"8649:39:111"},"nodeType":"YulExpressionStatement","src":"8649:39:111"},{"nodeType":"YulAssignment","src":"8697:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8709:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8720:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8705:3:111"},"nodeType":"YulFunctionCall","src":"8705:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8697:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8476:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8490:4:111","type":""}],"src":"8325:405:111"},{"body":{"nodeType":"YulBlock","src":"8784:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"8806:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"8808:16:111"},"nodeType":"YulFunctionCall","src":"8808:18:111"},"nodeType":"YulExpressionStatement","src":"8808:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8800:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"8803:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"8797:2:111"},"nodeType":"YulFunctionCall","src":"8797:8:111"},"nodeType":"YulIf","src":"8794:34:111"},{"nodeType":"YulAssignment","src":"8837:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8849:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"8852:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8845:3:111"},"nodeType":"YulFunctionCall","src":"8845:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"8837:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"8766:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"8769:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"8775:4:111","type":""}],"src":"8735:125:111"},{"body":{"nodeType":"YulBlock","src":"9039:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9056:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9067:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9049:6:111"},"nodeType":"YulFunctionCall","src":"9049:21:111"},"nodeType":"YulExpressionStatement","src":"9049:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9090:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9101:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9086:3:111"},"nodeType":"YulFunctionCall","src":"9086:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9106:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9079:6:111"},"nodeType":"YulFunctionCall","src":"9079:30:111"},"nodeType":"YulExpressionStatement","src":"9079:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9129:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9140:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9125:3:111"},"nodeType":"YulFunctionCall","src":"9125:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"9145:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9118:6:111"},"nodeType":"YulFunctionCall","src":"9118:62:111"},"nodeType":"YulExpressionStatement","src":"9118:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9200:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9211:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9196:3:111"},"nodeType":"YulFunctionCall","src":"9196:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"9216:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9189:6:111"},"nodeType":"YulFunctionCall","src":"9189:36:111"},"nodeType":"YulExpressionStatement","src":"9189:36:111"},{"nodeType":"YulAssignment","src":"9234:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9257:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9242:3:111"},"nodeType":"YulFunctionCall","src":"9242:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9234:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9016:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9030:4:111","type":""}],"src":"8865:402:111"},{"body":{"nodeType":"YulBlock","src":"9446:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9463:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9474:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9456:6:111"},"nodeType":"YulFunctionCall","src":"9456:21:111"},"nodeType":"YulExpressionStatement","src":"9456:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9497:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9508:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9493:3:111"},"nodeType":"YulFunctionCall","src":"9493:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9513:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9486:6:111"},"nodeType":"YulFunctionCall","src":"9486:30:111"},"nodeType":"YulExpressionStatement","src":"9486:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9536:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9547:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9532:3:111"},"nodeType":"YulFunctionCall","src":"9532:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"9552:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9525:6:111"},"nodeType":"YulFunctionCall","src":"9525:62:111"},"nodeType":"YulExpressionStatement","src":"9525:62:111"},{"nodeType":"YulAssignment","src":"9596:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9608:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9619:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9604:3:111"},"nodeType":"YulFunctionCall","src":"9604:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9596:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9423:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9437:4:111","type":""}],"src":"9272:356:111"},{"body":{"nodeType":"YulBlock","src":"9790:241:111","statements":[{"nodeType":"YulAssignment","src":"9800:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9812:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9823:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9808:3:111"},"nodeType":"YulFunctionCall","src":"9808:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9800:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"9835:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9845:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9839:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9903:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9918:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9926:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9914:3:111"},"nodeType":"YulFunctionCall","src":"9914:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9896:6:111"},"nodeType":"YulFunctionCall","src":"9896:34:111"},"nodeType":"YulExpressionStatement","src":"9896:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9950:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9961:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9946:3:111"},"nodeType":"YulFunctionCall","src":"9946:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"9970:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9978:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9966:3:111"},"nodeType":"YulFunctionCall","src":"9966:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9939:6:111"},"nodeType":"YulFunctionCall","src":"9939:43:111"},"nodeType":"YulExpressionStatement","src":"9939:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10002:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10013:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9998:3:111"},"nodeType":"YulFunctionCall","src":"9998:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"10018:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9991:6:111"},"nodeType":"YulFunctionCall","src":"9991:34:111"},"nodeType":"YulExpressionStatement","src":"9991:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9743:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9754:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9762:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9770:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9781:4:111","type":""}],"src":"9633:398:111"},{"body":{"nodeType":"YulBlock","src":"10210:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10227:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10238:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10220:6:111"},"nodeType":"YulFunctionCall","src":"10220:21:111"},"nodeType":"YulExpressionStatement","src":"10220:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10261:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10272:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10257:3:111"},"nodeType":"YulFunctionCall","src":"10257:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10277:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10250:6:111"},"nodeType":"YulFunctionCall","src":"10250:30:111"},"nodeType":"YulExpressionStatement","src":"10250:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10300:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10311:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10296:3:111"},"nodeType":"YulFunctionCall","src":"10296:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"10316:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10289:6:111"},"nodeType":"YulFunctionCall","src":"10289:51:111"},"nodeType":"YulExpressionStatement","src":"10289:51:111"},{"nodeType":"YulAssignment","src":"10349:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10372:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10357:3:111"},"nodeType":"YulFunctionCall","src":"10357:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10349:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10187:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10201:4:111","type":""}],"src":"10036:345:111"},{"body":{"nodeType":"YulBlock","src":"10547:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"10594:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10603:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10606:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10596:6:111"},"nodeType":"YulFunctionCall","src":"10596:12:111"},"nodeType":"YulExpressionStatement","src":"10596:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10568:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10577:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10564:3:111"},"nodeType":"YulFunctionCall","src":"10564:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10589:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10560:3:111"},"nodeType":"YulFunctionCall","src":"10560:33:111"},"nodeType":"YulIf","src":"10557:53:111"},{"nodeType":"YulVariableDeclaration","src":"10619:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10645:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10632:12:111"},"nodeType":"YulFunctionCall","src":"10632:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"10623:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10697:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"10664:32:111"},"nodeType":"YulFunctionCall","src":"10664:39:111"},"nodeType":"YulExpressionStatement","src":"10664:39:111"},{"nodeType":"YulAssignment","src":"10712:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10722:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10712:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10736:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10768:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10779:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10764:3:111"},"nodeType":"YulFunctionCall","src":"10764:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10751:12:111"},"nodeType":"YulFunctionCall","src":"10751:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"10740:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"10825:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"10792:32:111"},"nodeType":"YulFunctionCall","src":"10792:41:111"},"nodeType":"YulExpressionStatement","src":"10792:41:111"},{"nodeType":"YulAssignment","src":"10842:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"10852:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10842:6:111"}]},{"nodeType":"YulAssignment","src":"10868:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10895:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10906:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10891:3:111"},"nodeType":"YulFunctionCall","src":"10891:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10878:12:111"},"nodeType":"YulFunctionCall","src":"10878:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10868:6:111"}]},{"nodeType":"YulAssignment","src":"10919:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10946:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10957:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10942:3:111"},"nodeType":"YulFunctionCall","src":"10942:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10929:12:111"},"nodeType":"YulFunctionCall","src":"10929:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10919:6:111"}]},{"nodeType":"YulAssignment","src":"10970:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11008:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10993:3:111"},"nodeType":"YulFunctionCall","src":"10993:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10980:12:111"},"nodeType":"YulFunctionCall","src":"10980:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"10970:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10481:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10492:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10504:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10512:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10520:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"10528:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"10536:6:111","type":""}],"src":"10386:633:111"},{"body":{"nodeType":"YulBlock","src":"11076:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"11195:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11197:16:111"},"nodeType":"YulFunctionCall","src":"11197:18:111"},"nodeType":"YulExpressionStatement","src":"11197:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11107:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11100:6:111"},"nodeType":"YulFunctionCall","src":"11100:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11093:6:111"},"nodeType":"YulFunctionCall","src":"11093:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"11115:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11122:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"11190:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"11118:3:111"},"nodeType":"YulFunctionCall","src":"11118:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11112:2:111"},"nodeType":"YulFunctionCall","src":"11112:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11089:3:111"},"nodeType":"YulFunctionCall","src":"11089:105:111"},"nodeType":"YulIf","src":"11086:131:111"},{"nodeType":"YulAssignment","src":"11226:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11241:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11244:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"11237:3:111"},"nodeType":"YulFunctionCall","src":"11237:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"11226:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"11055:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"11058:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"11064:7:111","type":""}],"src":"11024:228:111"},{"body":{"nodeType":"YulBlock","src":"11303:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"11334:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11355:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11358:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11348:6:111"},"nodeType":"YulFunctionCall","src":"11348:88:111"},"nodeType":"YulExpressionStatement","src":"11348:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11456:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11459:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11449:6:111"},"nodeType":"YulFunctionCall","src":"11449:15:111"},"nodeType":"YulExpressionStatement","src":"11449:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11484:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11487:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11477:6:111"},"nodeType":"YulFunctionCall","src":"11477:15:111"},"nodeType":"YulExpressionStatement","src":"11477:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"11323:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11316:6:111"},"nodeType":"YulFunctionCall","src":"11316:9:111"},"nodeType":"YulIf","src":"11313:189:111"},{"nodeType":"YulAssignment","src":"11511:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11520:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11523:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"11516:3:111"},"nodeType":"YulFunctionCall","src":"11516:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"11511:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"11288:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"11291:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"11297:1:111","type":""}],"src":"11257:274:111"},{"body":{"nodeType":"YulBlock","src":"11568:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11585:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11588:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11578:6:111"},"nodeType":"YulFunctionCall","src":"11578:88:111"},"nodeType":"YulExpressionStatement","src":"11578:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11682:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11685:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11675:6:111"},"nodeType":"YulFunctionCall","src":"11675:15:111"},"nodeType":"YulExpressionStatement","src":"11675:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11709:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11699:6:111"},"nodeType":"YulFunctionCall","src":"11699:15:111"},"nodeType":"YulExpressionStatement","src":"11699:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"11536:184:111"},{"body":{"nodeType":"YulBlock","src":"11854:168:111","statements":[{"nodeType":"YulAssignment","src":"11864:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11876:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11887:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11872:3:111"},"nodeType":"YulFunctionCall","src":"11872:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11864:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11906:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11921:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11929:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11917:3:111"},"nodeType":"YulFunctionCall","src":"11917:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11899:6:111"},"nodeType":"YulFunctionCall","src":"11899:74:111"},"nodeType":"YulExpressionStatement","src":"11899:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11993:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12004:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11989:3:111"},"nodeType":"YulFunctionCall","src":"11989:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"12009:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11982:6:111"},"nodeType":"YulFunctionCall","src":"11982:34:111"},"nodeType":"YulExpressionStatement","src":"11982:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11815:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11826:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11834:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11845:4:111","type":""}],"src":"11725:297:111"},{"body":{"nodeType":"YulBlock","src":"12201:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12218:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12229:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12211:6:111"},"nodeType":"YulFunctionCall","src":"12211:21:111"},"nodeType":"YulExpressionStatement","src":"12211:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12252:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12263:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12248:3:111"},"nodeType":"YulFunctionCall","src":"12248:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12268:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12241:6:111"},"nodeType":"YulFunctionCall","src":"12241:30:111"},"nodeType":"YulExpressionStatement","src":"12241:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12302:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12287:3:111"},"nodeType":"YulFunctionCall","src":"12287:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"12307:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12280:6:111"},"nodeType":"YulFunctionCall","src":"12280:62:111"},"nodeType":"YulExpressionStatement","src":"12280:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12362:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12373:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12358:3:111"},"nodeType":"YulFunctionCall","src":"12358:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"12378:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12351:6:111"},"nodeType":"YulFunctionCall","src":"12351:38:111"},"nodeType":"YulExpressionStatement","src":"12351:38:111"},{"nodeType":"YulAssignment","src":"12398:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12410:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12421:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12406:3:111"},"nodeType":"YulFunctionCall","src":"12406:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12398:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12178:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12192:4:111","type":""}],"src":"12027:404:111"},{"body":{"nodeType":"YulBlock","src":"12530:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12540:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"12579:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12566:12:111"},"nodeType":"YulFunctionCall","src":"12566:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"12544:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12739:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12748:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12751:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12741:6:111"},"nodeType":"YulFunctionCall","src":"12741:12:111"},"nodeType":"YulExpressionStatement","src":"12741:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12614:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12642:12:111"},"nodeType":"YulFunctionCall","src":"12642:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"12658:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12638:3:111"},"nodeType":"YulFunctionCall","src":"12638:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"12669:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12634:3:111"},"nodeType":"YulFunctionCall","src":"12634:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12610:3:111"},"nodeType":"YulFunctionCall","src":"12610:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12603:6:111"},"nodeType":"YulFunctionCall","src":"12603:135:111"},"nodeType":"YulIf","src":"12600:155:111"},{"nodeType":"YulVariableDeclaration","src":"12764:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"12782:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12792:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12778:3:111"},"nodeType":"YulFunctionCall","src":"12778:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"12768:6:111","type":""}]},{"nodeType":"YulAssignment","src":"12820:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12843:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12830:12:111"},"nodeType":"YulFunctionCall","src":"12830:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"12820:6:111"}]},{"body":{"nodeType":"YulBlock","src":"12893:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12902:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12905:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12895:6:111"},"nodeType":"YulFunctionCall","src":"12895:12:111"},"nodeType":"YulExpressionStatement","src":"12895:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"12865:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12873:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12862:2:111"},"nodeType":"YulFunctionCall","src":"12862:30:111"},"nodeType":"YulIf","src":"12859:50:111"},{"nodeType":"YulAssignment","src":"12918:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12930:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12938:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12926:3:111"},"nodeType":"YulFunctionCall","src":"12926:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"12918:4:111"}]},{"body":{"nodeType":"YulBlock","src":"12994:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13003:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13006:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12996:6:111"},"nodeType":"YulFunctionCall","src":"12996:12:111"},"nodeType":"YulExpressionStatement","src":"12996:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"12959:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12969:12:111"},"nodeType":"YulFunctionCall","src":"12969:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"12985:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12965:3:111"},"nodeType":"YulFunctionCall","src":"12965:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"12955:3:111"},"nodeType":"YulFunctionCall","src":"12955:38:111"},"nodeType":"YulIf","src":"12952:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"12487:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"12497:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"12513:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"12519:6:111","type":""}],"src":"12436:580:111"},{"body":{"nodeType":"YulBlock","src":"13195:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13212:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13223:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13205:6:111"},"nodeType":"YulFunctionCall","src":"13205:21:111"},"nodeType":"YulExpressionStatement","src":"13205:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13257:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13242:3:111"},"nodeType":"YulFunctionCall","src":"13242:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13262:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13235:6:111"},"nodeType":"YulFunctionCall","src":"13235:30:111"},"nodeType":"YulExpressionStatement","src":"13235:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13285:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13296:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13281:3:111"},"nodeType":"YulFunctionCall","src":"13281:18:111"},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e644461","kind":"string","nodeType":"YulLiteral","src":"13301:34:111","type":"","value":"DepositPaymaster: paymasterAndDa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13274:6:111"},"nodeType":"YulFunctionCall","src":"13274:62:111"},"nodeType":"YulExpressionStatement","src":"13274:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13356:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13367:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13352:3:111"},"nodeType":"YulFunctionCall","src":"13352:18:111"},{"hexValue":"7461206d757374207370656369667920746f6b656e","kind":"string","nodeType":"YulLiteral","src":"13372:23:111","type":"","value":"ta must specify token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13345:6:111"},"nodeType":"YulFunctionCall","src":"13345:51:111"},"nodeType":"YulExpressionStatement","src":"13345:51:111"},{"nodeType":"YulAssignment","src":"13405:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13417:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13428:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13413:3:111"},"nodeType":"YulFunctionCall","src":"13413:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13405:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13172:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13186:4:111","type":""}],"src":"13021:417:111"},{"body":{"nodeType":"YulBlock","src":"13573:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"13611:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13620:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13623:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13613:6:111"},"nodeType":"YulFunctionCall","src":"13613:12:111"},"nodeType":"YulExpressionStatement","src":"13613:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"13589:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"13601:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13586:2:111"},"nodeType":"YulFunctionCall","src":"13586:24:111"},"nodeType":"YulIf","src":"13583:44:111"},{"body":{"nodeType":"YulBlock","src":"13660:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13669:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13672:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13662:6:111"},"nodeType":"YulFunctionCall","src":"13662:12:111"},"nodeType":"YulExpressionStatement","src":"13662:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"13642:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"13652:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13639:2:111"},"nodeType":"YulFunctionCall","src":"13639:20:111"},"nodeType":"YulIf","src":"13636:40:111"},{"nodeType":"YulAssignment","src":"13685:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"13702:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"13710:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13698:3:111"},"nodeType":"YulFunctionCall","src":"13698:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"13685:9:111"}]},{"nodeType":"YulAssignment","src":"13730:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"13747:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"13757:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13743:3:111"},"nodeType":"YulFunctionCall","src":"13743:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"13730:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"13507:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"13515:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"13523:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"13535:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"13548:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"13559:9:111","type":""}],"src":"13443:331:111"},{"body":{"nodeType":"YulBlock","src":"13880:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"13890:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"13913:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13900:12:111"},"nodeType":"YulFunctionCall","src":"13900:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"13894:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13928:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13938:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"13932:2:111","type":""}]},{"nodeType":"YulAssignment","src":"14013:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14026:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14030:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14022:3:111"},"nodeType":"YulFunctionCall","src":"14022:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14013:5:111"}]},{"body":{"nodeType":"YulBlock","src":"14065:80:111","statements":[{"nodeType":"YulAssignment","src":"14079:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14096:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14108:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14115:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"14119:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14111:3:111"},"nodeType":"YulFunctionCall","src":"14111:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"14104:3:111"},"nodeType":"YulFunctionCall","src":"14104:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14126:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"14100:3:111"},"nodeType":"YulFunctionCall","src":"14100:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14092:3:111"},"nodeType":"YulFunctionCall","src":"14092:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14132:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14088:3:111"},"nodeType":"YulFunctionCall","src":"14088:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14079:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"14048:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"14053:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14045:2:111"},"nodeType":"YulFunctionCall","src":"14045:11:111"},"nodeType":"YulIf","src":"14042:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"13855:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"13862:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"13870:5:111","type":""}],"src":"13779:372:111"},{"body":{"nodeType":"YulBlock","src":"14330:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14347:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14358:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14340:6:111"},"nodeType":"YulFunctionCall","src":"14340:21:111"},"nodeType":"YulExpressionStatement","src":"14340:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14381:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14392:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14377:3:111"},"nodeType":"YulFunctionCall","src":"14377:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14397:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14370:6:111"},"nodeType":"YulFunctionCall","src":"14370:30:111"},"nodeType":"YulExpressionStatement","src":"14370:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14420:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14431:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14416:3:111"},"nodeType":"YulFunctionCall","src":"14416:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"14436:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14409:6:111"},"nodeType":"YulFunctionCall","src":"14409:62:111"},"nodeType":"YulExpressionStatement","src":"14409:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14491:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14502:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14487:3:111"},"nodeType":"YulFunctionCall","src":"14487:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"14507:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14480:6:111"},"nodeType":"YulFunctionCall","src":"14480:34:111"},"nodeType":"YulExpressionStatement","src":"14480:34:111"},{"nodeType":"YulAssignment","src":"14523:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14535:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14546:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14531:3:111"},"nodeType":"YulFunctionCall","src":"14531:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14523:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14307:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14321:4:111","type":""}],"src":"14156:400:111"},{"body":{"nodeType":"YulBlock","src":"14735:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14752:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14763:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14745:6:111"},"nodeType":"YulFunctionCall","src":"14745:21:111"},"nodeType":"YulExpressionStatement","src":"14745:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14786:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14797:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14782:3:111"},"nodeType":"YulFunctionCall","src":"14782:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14802:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14775:6:111"},"nodeType":"YulFunctionCall","src":"14775:30:111"},"nodeType":"YulExpressionStatement","src":"14775:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14836:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14821:3:111"},"nodeType":"YulFunctionCall","src":"14821:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"14841:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14814:6:111"},"nodeType":"YulFunctionCall","src":"14814:62:111"},"nodeType":"YulExpressionStatement","src":"14814:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14896:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14907:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14892:3:111"},"nodeType":"YulFunctionCall","src":"14892:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"14912:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14885:6:111"},"nodeType":"YulFunctionCall","src":"14885:31:111"},"nodeType":"YulExpressionStatement","src":"14885:31:111"},{"nodeType":"YulAssignment","src":"14925:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14937:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14948:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14933:3:111"},"nodeType":"YulFunctionCall","src":"14933:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14925:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14712:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14726:4:111","type":""}],"src":"14561:397:111"},{"body":{"nodeType":"YulBlock","src":"15191:329:111","statements":[{"nodeType":"YulAssignment","src":"15201:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15213:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15224:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15209:3:111"},"nodeType":"YulFunctionCall","src":"15209:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15201:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"15237:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15247:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"15241:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15305:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15320:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"15328:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15316:3:111"},"nodeType":"YulFunctionCall","src":"15316:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15298:6:111"},"nodeType":"YulFunctionCall","src":"15298:34:111"},"nodeType":"YulExpressionStatement","src":"15298:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15352:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15363:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15348:3:111"},"nodeType":"YulFunctionCall","src":"15348:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15372:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"15380:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15368:3:111"},"nodeType":"YulFunctionCall","src":"15368:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15341:6:111"},"nodeType":"YulFunctionCall","src":"15341:43:111"},"nodeType":"YulExpressionStatement","src":"15341:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15404:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15415:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15400:3:111"},"nodeType":"YulFunctionCall","src":"15400:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"15420:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15393:6:111"},"nodeType":"YulFunctionCall","src":"15393:34:111"},"nodeType":"YulExpressionStatement","src":"15393:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15458:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15443:3:111"},"nodeType":"YulFunctionCall","src":"15443:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"15463:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15436:6:111"},"nodeType":"YulFunctionCall","src":"15436:34:111"},"nodeType":"YulExpressionStatement","src":"15436:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15490:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15501:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15486:3:111"},"nodeType":"YulFunctionCall","src":"15486:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"15507:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15479:6:111"},"nodeType":"YulFunctionCall","src":"15479:35:111"},"nodeType":"YulExpressionStatement","src":"15479:35:111"}]},"name":"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15128:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"15139:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"15147:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"15155:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15163:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15171:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15182:4:111","type":""}],"src":"14963:557:111"},{"body":{"nodeType":"YulBlock","src":"15603:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"15649:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15658:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15661:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15651:6:111"},"nodeType":"YulFunctionCall","src":"15651:12:111"},"nodeType":"YulExpressionStatement","src":"15651:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15624:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15633:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15620:3:111"},"nodeType":"YulFunctionCall","src":"15620:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15645:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15616:3:111"},"nodeType":"YulFunctionCall","src":"15616:32:111"},"nodeType":"YulIf","src":"15613:52:111"},{"nodeType":"YulVariableDeclaration","src":"15674:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15693:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15687:5:111"},"nodeType":"YulFunctionCall","src":"15687:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"15678:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15756:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15765:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15768:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15758:6:111"},"nodeType":"YulFunctionCall","src":"15758:12:111"},"nodeType":"YulExpressionStatement","src":"15758:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15725:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15746:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15739:6:111"},"nodeType":"YulFunctionCall","src":"15739:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15732:6:111"},"nodeType":"YulFunctionCall","src":"15732:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"15722:2:111"},"nodeType":"YulFunctionCall","src":"15722:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15715:6:111"},"nodeType":"YulFunctionCall","src":"15715:40:111"},"nodeType":"YulIf","src":"15712:60:111"},{"nodeType":"YulAssignment","src":"15781:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"15791:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15781:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15569:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15580:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15592:6:111","type":""}],"src":"15525:277:111"},{"body":{"nodeType":"YulBlock","src":"15981:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15998:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16009:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15991:6:111"},"nodeType":"YulFunctionCall","src":"15991:21:111"},"nodeType":"YulExpressionStatement","src":"15991:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16032:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16043:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16028:3:111"},"nodeType":"YulFunctionCall","src":"16028:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16048:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16021:6:111"},"nodeType":"YulFunctionCall","src":"16021:30:111"},"nodeType":"YulExpressionStatement","src":"16021:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16071:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16082:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16067:3:111"},"nodeType":"YulFunctionCall","src":"16067:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"16087:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16060:6:111"},"nodeType":"YulFunctionCall","src":"16060:62:111"},"nodeType":"YulExpressionStatement","src":"16060:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16142:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16153:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16138:3:111"},"nodeType":"YulFunctionCall","src":"16138:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"16158:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16131:6:111"},"nodeType":"YulFunctionCall","src":"16131:40:111"},"nodeType":"YulExpressionStatement","src":"16131:40:111"},{"nodeType":"YulAssignment","src":"16180:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16192:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16203:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16188:3:111"},"nodeType":"YulFunctionCall","src":"16188:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16180:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15958:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15972:4:111","type":""}],"src":"15807:406:111"},{"body":{"nodeType":"YulBlock","src":"16392:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16409:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16420:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16402:6:111"},"nodeType":"YulFunctionCall","src":"16402:21:111"},"nodeType":"YulExpressionStatement","src":"16402:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16443:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16454:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16439:3:111"},"nodeType":"YulFunctionCall","src":"16439:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16459:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16432:6:111"},"nodeType":"YulFunctionCall","src":"16432:30:111"},"nodeType":"YulExpressionStatement","src":"16432:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16482:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16493:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16478:3:111"},"nodeType":"YulFunctionCall","src":"16478:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f","kind":"string","nodeType":"YulLiteral","src":"16498:34:111","type":"","value":"DepositPaymaster: unsupported to"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16471:6:111"},"nodeType":"YulFunctionCall","src":"16471:62:111"},"nodeType":"YulExpressionStatement","src":"16471:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16564:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16549:3:111"},"nodeType":"YulFunctionCall","src":"16549:18:111"},{"hexValue":"6b656e","kind":"string","nodeType":"YulLiteral","src":"16569:5:111","type":"","value":"ken"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16542:6:111"},"nodeType":"YulFunctionCall","src":"16542:33:111"},"nodeType":"YulExpressionStatement","src":"16542:33:111"},{"nodeType":"YulAssignment","src":"16584:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16596:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16607:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16592:3:111"},"nodeType":"YulFunctionCall","src":"16592:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16584:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16369:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16383:4:111","type":""}],"src":"16218:399:111"},{"body":{"nodeType":"YulBlock","src":"16796:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16813:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16824:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16806:6:111"},"nodeType":"YulFunctionCall","src":"16806:21:111"},"nodeType":"YulExpressionStatement","src":"16806:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16858:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16843:3:111"},"nodeType":"YulFunctionCall","src":"16843:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16863:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16836:6:111"},"nodeType":"YulFunctionCall","src":"16836:30:111"},"nodeType":"YulExpressionStatement","src":"16836:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16886:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16897:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16882:3:111"},"nodeType":"YulFunctionCall","src":"16882:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"16902:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16875:6:111"},"nodeType":"YulFunctionCall","src":"16875:62:111"},"nodeType":"YulExpressionStatement","src":"16875:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16957:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16968:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16953:3:111"},"nodeType":"YulFunctionCall","src":"16953:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"16973:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16946:6:111"},"nodeType":"YulFunctionCall","src":"16946:36:111"},"nodeType":"YulExpressionStatement","src":"16946:36:111"},{"nodeType":"YulAssignment","src":"16991:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17003:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17014:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16999:3:111"},"nodeType":"YulFunctionCall","src":"16999:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16991:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16773:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16787:4:111","type":""}],"src":"16622:402:111"},{"body":{"nodeType":"YulBlock","src":"17166:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17176:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17196:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17190:5:111"},"nodeType":"YulFunctionCall","src":"17190:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"17180:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17238:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17246:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17234:3:111"},"nodeType":"YulFunctionCall","src":"17234:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"17253:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17258:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"17212:21:111"},"nodeType":"YulFunctionCall","src":"17212:53:111"},"nodeType":"YulExpressionStatement","src":"17212:53:111"},{"nodeType":"YulAssignment","src":"17274:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17285:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17290:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17281:3:111"},"nodeType":"YulFunctionCall","src":"17281:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17274:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17142:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17147:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17158:3:111","type":""}],"src":"17029:274:111"},{"body":{"nodeType":"YulBlock","src":"17482:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17499:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17510:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17492:6:111"},"nodeType":"YulFunctionCall","src":"17492:21:111"},"nodeType":"YulExpressionStatement","src":"17492:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17533:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17544:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17529:3:111"},"nodeType":"YulFunctionCall","src":"17529:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17549:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17522:6:111"},"nodeType":"YulFunctionCall","src":"17522:30:111"},"nodeType":"YulExpressionStatement","src":"17522:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17572:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17583:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17568:3:111"},"nodeType":"YulFunctionCall","src":"17568:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"17588:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17561:6:111"},"nodeType":"YulFunctionCall","src":"17561:59:111"},"nodeType":"YulExpressionStatement","src":"17561:59:111"},{"nodeType":"YulAssignment","src":"17629:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17652:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17637:3:111"},"nodeType":"YulFunctionCall","src":"17637:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17629:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17459:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17473:4:111","type":""}],"src":"17308:353:111"},{"body":{"nodeType":"YulBlock","src":"17787:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17804:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17815:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17797:6:111"},"nodeType":"YulFunctionCall","src":"17797:21:111"},"nodeType":"YulExpressionStatement","src":"17797:21:111"},{"nodeType":"YulAssignment","src":"17827:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17852:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17864:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17875:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17860:3:111"},"nodeType":"YulFunctionCall","src":"17860:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"17835:16:111"},"nodeType":"YulFunctionCall","src":"17835:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17827:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17756:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17767:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17778:4:111","type":""}],"src":"17666:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IOracle_$13149(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IOracle_$13149__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_507d798c5ad4be89d4f3da658d37b2094b23f09aca616c68bd08d2df2115802a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"unsupported token\")\n tail := add(headStart, 96)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_3f1933bd5ead9cc60725798c84c3187e65fc3fa59401c57f2eee69bc2353d104__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"Token already set\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"DepositPaymaster: paymasterAndDa\")\n mstore(add(headStart, 96), \"ta must specify token\")\n tail := add(headStart, 128)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"DepositPaymaster: unsupported to\")\n mstore(add(headStart, 96), \"ken\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":947},{"length":32,"start":1323},{"length":32,"start":1525},{"length":32,"start":2140},{"length":32,"start":2339},{"length":32,"start":2483},{"length":32,"start":2923},{"length":32,"start":3669}]},"linkReferences":{},"object":"6080604052600436106101755760003560e01c8063addd5099116100cb578063c399ec881161007f578063d0e30db011610059578063d0e30db014610499578063f2fde38b146104a1578063f465c77e146104c157600080fd5b8063c399ec8814610442578063cc9c837c14610457578063cd8f80c21461047757600080fd5b8063bb9fe6bf116100b0578063bb9fe6bf146103d5578063c23a5cea146103ea578063c23f001f1461040a57600080fd5b8063addd50991461035e578063b0d691fe146103a157600080fd5b80635476bd721161012d5780638da5cb5b116101075780638da5cb5b146102ce5780639ed0fb681461031a578063a9a234091461033e57600080fd5b80635476bd7214610283578063715018a6146102a3578063796d4371146102b857600080fd5b8063382edd9e1161015e578063382edd9e146101af578063493b0170146101cf5780634a6f84cf1461024857600080fd5b80630396cb601461017a578063205c28781461018f575b600080fd5b61018d61018836600461178f565b6104ef565b005b34801561019b57600080fd5b5061018d6101aa3660046117d7565b6105a1565b3480156101bb57600080fd5b5061018d6101ca366004611803565b610639565b3480156101db57600080fd5b5061022e6101ea366004611844565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152015b60405180910390f35b34801561025457600080fd5b5061027561026336600461187d565b60036020526000908152604090205481565b60405190815260200161023f565b34801561028f57600080fd5b5061018d61029e366004611844565b610754565b3480156102af57600080fd5b5061018d610824565b3480156102c457600080fd5b506102756188b881565b3480156102da57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023f565b34801561032657600080fd5b5061018d336000908152600360205260409020439055565b34801561034a57600080fd5b5061018d61035936600461189a565b610838565b34801561036a57600080fd5b506102f561037936600461187d565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ad57600080fd5b506102f57f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e157600080fd5b5061018d610852565b3480156103f657600080fd5b5061018d61040536600461187d565b6108d6565b34801561041657600080fd5b50610275610425366004611844565b600260209081526000928352604080842090915290825290205481565b34801561044e57600080fd5b50610275610982565b34801561046357600080fd5b5061018d610472366004611803565b610a38565b34801561048357600080fd5b5061018d33600090815260036020526040812055565b61018d610b3d565b3480156104ad57600080fd5b5061018d6104bc36600461187d565b610bc5565b3480156104cd57600080fd5b506104e16104dc366004611929565b610c62565b60405161023f9291906119f3565b6104f7610c85565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561058557600080fd5b505af1158015610599573d6000803e3d6000fd5b505050505050565b6105a9610c85565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561058557600080fd5b61065b73ffffffffffffffffffffffffffffffffffffffff8416333084610cec565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054166106d45760405162461bcd60e51b815260206004820152601160248201527f756e737570706f7274656420746f6b656e00000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260026020908152604080832093861683529290529081208054839290610718908490611a44565b909155505073ffffffffffffffffffffffffffffffffffffffff8216330361074f5761074f33600090815260036020526040812055565b505050565b61075c610c85565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205416156107d15760405162461bcd60e51b815260206004820152601160248201527f546f6b656e20616c72656164792073657400000000000000000000000000000060448201526064016106cb565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b61082c610c85565b6108366000610dc8565b565b610840610e3d565b61084c84848484610ec2565b50505050565b61085a610c85565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108c257600080fd5b505af115801561084c573d6000803e3d6000fd5b6108de610c85565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190611a5c565b905090565b3360009081526003602052604090205415801590610a6457503360009081526003602052604090205443115b610ad65760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f736974000000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610b16908490611a75565b9091555061074f905073ffffffffffffffffffffffffffffffffffffffff8416838361103a565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561096757600080fd5b610bcd610c85565b73ffffffffffffffffffffffffffffffffffffffff8116610c565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106cb565b610c5f81610dc8565b50565b60606000610c6e610e3d565b610c79858585611090565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106cb565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261084c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611371565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108365760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106cb565b600080808080610ed487890189611a8c565b9450945094509450945060008183856188b8610ef09190611add565b610efa908a611a44565b610f049190611add565b610f0e9190611b1a565b905060028a6002811115610f2457610f24611b55565b14610f5057610f4b73ffffffffffffffffffffffffffffffffffffffff8616873084610cec565b610f9a565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a1683529290529081208054839290610f94908490611a75565b90915550505b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604081208291610fe060005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110299190611a44565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261074f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610d46565b606060006188b88560a001351161110f5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f7000000000000000000000000000000000000000000000000060648201526084016106cb565b366000611120610120880188611b84565b90925090506028811461119b5760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e000000000000000000000060648201526084016106cb565b60006111aa8260148186611bf0565b6111b391611c1a565b60601c9050873560006111c68389611463565b905060006111d38b611597565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260409020549091501561126e5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320938716835292905220548211156113165760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016106cb565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b60006113d3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115be9092919063ffffffff16565b80519091501561074f57808060200190518101906113f19190611c62565b61074f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106cb565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260016020526040812054909116806115005760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016106cb565b6040517fd1eca9cf0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff82169063d1eca9cf90602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f9190611a5c565b949350505050565b600060e08201356101008301358082036115b2575092915050565b61158f824883016115cd565b606061158f84846000856115e5565b60008183106115dc57816115de565b825b9392505050565b60608247101561165d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106cb565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516116869190611c84565b60006040518083038185875af1925050503d80600081146116c3576040519150601f19603f3d011682016040523d82523d6000602084013e6116c8565b606091505b50915091506116d9878383876116e4565b979650505050505050565b606083156117605782516000036117595773ffffffffffffffffffffffffffffffffffffffff85163b6117595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106cb565b508161158f565b61158f83838151156117755781518083602001fd5b8060405162461bcd60e51b81526004016106cb9190611ca0565b6000602082840312156117a157600080fd5b813563ffffffff811681146115de57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5f57600080fd5b600080604083850312156117ea57600080fd5b82356117f5816117b5565b946020939093013593505050565b60008060006060848603121561181857600080fd5b8335611823816117b5565b92506020840135611833816117b5565b929592945050506040919091013590565b6000806040838503121561185757600080fd5b8235611862816117b5565b91506020830135611872816117b5565b809150509250929050565b60006020828403121561188f57600080fd5b81356115de816117b5565b600080600080606085870312156118b057600080fd5b8435600381106118bf57600080fd5b9350602085013567ffffffffffffffff808211156118dc57600080fd5b818701915087601f8301126118f057600080fd5b8135818111156118ff57600080fd5b88602082850101111561191157600080fd5b95986020929092019750949560400135945092505050565b60008060006060848603121561193e57600080fd5b833567ffffffffffffffff81111561195557600080fd5b8401610160818703121561196857600080fd5b95602085013595506040909401359392505050565b60005b83811015611998578181015183820152602001611980565b8381111561084c5750506000910152565b600081518084526119c181602086016020860161197d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a0660408301856119a9565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611a5757611a57611a15565b500190565b600060208284031215611a6e57600080fd5b5051919050565b600082821015611a8757611a87611a15565b500390565b600080600080600060a08688031215611aa457600080fd5b8535611aaf816117b5565b94506020860135611abf816117b5565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b1557611b15611a15565b500290565b600082611b50577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb957600080fd5b83018035915067ffffffffffffffff821115611bd457600080fd5b602001915036819003821315611be957600080fd5b9250929050565b60008085851115611c0057600080fd5b83861115611c0d57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015611c5a5780818660140360031b1b83161692505b505092915050565b600060208284031215611c7457600080fd5b815180151581146115de57600080fd5b60008251611c9681846020870161197d565b9190910192915050565b6020815260006115de60208301846119a956fea2646970667358221220bce0210806b65e666ebffcf0e14a8b1521ac8ccddd70bb8a8dbefdf801fed37164736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x175 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xADDD5099 GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x457 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x477 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x3D5 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x3EA JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x5476BD72 GT PUSH2 0x12D JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x5476BD72 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x2B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x15E JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x17A JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x18F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18D PUSH2 0x188 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x4EF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x17D7 JUMP JUMPDEST PUSH2 0x5A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x1CA CALLDATASIZE PUSH1 0x4 PUSH2 0x1803 JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22E PUSH2 0x1EA CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x263 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x29E CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH2 0x754 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x824 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x359 CALLDATASIZE PUSH1 0x4 PUSH2 0x189A JUMP JUMPDEST PUSH2 0x838 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F5 PUSH2 0x379 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F5 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x852 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x405 CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH2 0x8D6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x425 CALLDATASIZE PUSH1 0x4 PUSH2 0x1844 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x275 PUSH2 0x982 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x472 CALLDATASIZE PUSH1 0x4 PUSH2 0x1803 JUMP JUMPDEST PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x18D PUSH2 0xB3D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18D PUSH2 0x4BC CALLDATASIZE PUSH1 0x4 PUSH2 0x187D JUMP JUMPDEST PUSH2 0xBC5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E1 PUSH2 0x4DC CALLDATASIZE PUSH1 0x4 PUSH2 0x1929 JUMP JUMPDEST PUSH2 0xC62 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x23F SWAP3 SWAP2 SWAP1 PUSH2 0x19F3 JUMP JUMPDEST PUSH2 0x4F7 PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x599 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5A9 PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x65B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x6D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E737570706F7274656420746F6B656E000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x718 SWAP1 DUP5 SWAP1 PUSH2 0x1A44 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x74F JUMPI PUSH2 0x74F CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x75C PUSH2 0xC85 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E20616C726561647920736574000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x82C PUSH2 0xC85 JUMP JUMPDEST PUSH2 0x836 PUSH1 0x0 PUSH2 0xDC8 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x840 PUSH2 0xE3D JUMP JUMPDEST PUSH2 0x84C DUP5 DUP5 DUP5 DUP5 PUSH2 0xEC2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x85A PUSH2 0xC85 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x84C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x8DE PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x97B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA33 SWAP2 SWAP1 PUSH2 0x1A5C JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xA64 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xAD6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB16 SWAP1 DUP5 SWAP1 PUSH2 0x1A75 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x74F SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x103A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBCD PUSH2 0xC85 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xC56 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH2 0xC5F DUP2 PUSH2 0xDC8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC6E PUSH2 0xE3D JUMP JUMPDEST PUSH2 0xC79 DUP6 DUP6 DUP6 PUSH2 0x1090 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x836 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x84C SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1371 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x836 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0xED4 DUP8 DUP10 ADD DUP10 PUSH2 0x1A8C JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xEF0 SWAP2 SWAP1 PUSH2 0x1ADD JUMP JUMPDEST PUSH2 0xEFA SWAP1 DUP11 PUSH2 0x1A44 JUMP JUMPDEST PUSH2 0xF04 SWAP2 SWAP1 PUSH2 0x1ADD JUMP JUMPDEST PUSH2 0xF0E SWAP2 SWAP1 PUSH2 0x1B1A JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xF24 JUMPI PUSH2 0xF24 PUSH2 0x1B55 JUMP JUMPDEST EQ PUSH2 0xF50 JUMPI PUSH2 0xF4B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH2 0xF9A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xF94 SWAP1 DUP5 SWAP1 PUSH2 0x1A75 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0xFE0 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1029 SWAP2 SWAP1 PUSH2 0x1A44 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x74F SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xD46 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x110F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x1120 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x1B84 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x119B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11AA DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x1BF0 JUMP JUMPDEST PUSH2 0x11B3 SWAP2 PUSH2 0x1C1A JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x11C6 DUP4 DUP10 PUSH2 0x1463 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11D3 DUP12 PUSH2 0x1597 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x126E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x1316 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13D3 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x15BE SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x74F JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x13F1 SWAP2 SWAP1 PUSH2 0x1C62 JUMP JUMPDEST PUSH2 0x74F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND DUP1 PUSH2 0x1500 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD1ECA9CF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xD1ECA9CF SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x158F SWAP2 SWAP1 PUSH2 0x1A5C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x15B2 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x158F DUP3 BASEFEE DUP4 ADD PUSH2 0x15CD JUMP JUMPDEST PUSH1 0x60 PUSH2 0x158F DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x15DC JUMPI DUP2 PUSH2 0x15DE JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x165D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1686 SWAP2 SWAP1 PUSH2 0x1C84 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x16C3 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16C8 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16D9 DUP8 DUP4 DUP4 DUP8 PUSH2 0x16E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1760 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1759 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1759 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6CB JUMP JUMPDEST POP DUP2 PUSH2 0x158F JUMP JUMPDEST PUSH2 0x158F DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1775 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6CB SWAP2 SWAP1 PUSH2 0x1CA0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x15DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xC5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x17EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x17F5 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1818 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1823 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1833 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1862 DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1872 DUP2 PUSH2 0x17B5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x188F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x15DE DUP2 PUSH2 0x17B5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x18B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x18BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x18DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x18F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x18FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x193E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1955 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1968 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1998 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1980 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x84C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x19C1 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x197D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1A06 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x19A9 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1A57 JUMPI PUSH2 0x1A57 PUSH2 0x1A15 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1A87 JUMPI PUSH2 0x1A87 PUSH2 0x1A15 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1AA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1AAF DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1ABF DUP2 PUSH2 0x17B5 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1B15 JUMPI PUSH2 0x1B15 PUSH2 0x1A15 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B50 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1BD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1BE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x1C0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1C5A JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x15DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C96 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x197D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x15DE PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x19A9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC 0xE0 0x21 ADDMOD MOD 0xB6 0x5E PUSH7 0x6EBFFCF0E14A8B ISZERO 0x21 0xAC DUP13 0xCD 0xDD PUSH17 0xBB8A8DBEFDF801FED37164736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"1215:6492:67:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;2646:401:67:-;;;;;;;;;;-1:-1:-1;2646:401:67;;;;;:::i;:::-;;:::i;3233:206::-;;;;;;;;;;-1:-1:-1;3233:206:67;;;;;:::i;:::-;3363:15;;;;3306:14;3363:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;3412:11;:20;;;;;;;;3363:24;;3233:206;;;;;1888:25:111;;;1944:2;1929:18;;1922:34;;;;1861:18;3233:206:67;;;;;;;;1610:46;;;;;;;;;;-1:-1:-1;1610:46:67;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2373:25:111;;;2361:2;2346:18;1610:46:67;2227:177:111;1916:196:67;;;;;;;;;;-1:-1:-1;1916:196:67;;;;;:::i;:::-;;:::i;1831:101:24:-;;;;;;;;;;;;;:::i;1380:44:67:-;;;;;;;;;;;;1419:5;1380:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;;3026:42:111;3014:55;;;2996:74;;2984:2;2969:18;1201:85:24;2850:226:111;3570:92:67;;;;;;;;;;;;3629:10;3617:23;;;;:11;:23;;;;;3643:12;3617:38;;3570:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;1495:41:67:-;;;;;;;;;;-1:-1:-1;1495:41:67;;;;;:::i;:::-;;;;;;;;;;;;;;;;471:39:52;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;1542:62:67:-;;;;;;;;;;-1:-1:-1;1542:62:67;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3318:111:52;;;;;;;;;;;;;:::i;4206:311:67:-;;;;;;;;;;-1:-1:-1;4206:311:67;;;;;:::i;:::-;;:::i;3879:79::-;;;;;;;;;;;;3936:10;3950:1;3924:23;;;:11;:23;;;;;:27;3879:79;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;6534:10:111;6522:23;;3173:55:52::1;::::0;::::1;6504:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;6477:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;6765:55:111::0;;;2817:46:52::1;::::0;::::1;6747:74:111::0;6837:18;;;6830:34;;;2817:10:52::1;:21;::::0;::::1;::::0;6720:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;2646:401:67::0;2791:57;:22;;;2814:10;2834:4;2841:6;2791:22;:57::i;:::-;2866:29;:14;;;1486:1;2866:14;;;:7;:14;;;;;;;2858:59;;;;-1:-1:-1;;;2858:59:67;;7077:2:111;2858:59:67;;;7059:21:111;7116:2;7096:18;;;7089:30;7155:19;7135:18;;;7128:47;7192:18;;2858:59:67;;;;;;;;;2927:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:34;;2955:6;;2927:15;:34;;2955:6;;2927:34;:::i;:::-;;;;-1:-1:-1;;2975:21:67;;;:10;:21;2971:70;;3012:18;3936:10;3950:1;3924:23;;;:11;:23;;;;;:27;3879:79;3012:18;2646:401;;;:::o;1916:196::-;1094:13:24;:11;:13::i;:::-;2011:29:67::1;:14:::0;;::::1;1486:1;2011:14:::0;;;:7:::1;:14;::::0;;;;;::::1;:29:::0;2003:59:::1;;;::::0;-1:-1:-1;;;2003:59:67;;7745:2:111;2003:59:67::1;::::0;::::1;7727:21:111::0;7784:2;7764:18;;;7757:30;7823:19;7803:18;;;7796:47;7860:18;;2003:59:67::1;7543:341:111::0;2003:59:67::1;2072:14;::::0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;:33;;;::::1;::::0;;;::::1;;::::0;;1916:196::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;3014:55:111::0;;;3975:41:52::1;::::0;::::1;2996:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;2969:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;2996:74:111;3361:7:52;;3387:10;:20;;;;;2969:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;4206:311:67:-;4315:10;4303:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;4362:10:67;4350:23;;;;:11;:23;;;;;;4335:12;:38;4303:70;4295:124;;;;-1:-1:-1;;;4295:124:67;;8527:2:111;4295:124:67;;;8509:21:111;8566:2;8546:18;;;8539:30;8605:34;8585:18;;;8578:62;8676:11;8656:18;;;8649:39;8705:19;;4295:124:67;8325:405:111;4295:124:67;4429:15;;;;;;;:8;:15;;;;;;;;4445:10;4429:27;;;;;;;:37;;4460:6;;4429:15;:37;;4460:6;;4429:37;:::i;:::-;;;;-1:-1:-1;4476:34:67;;-1:-1:-1;4476:18:67;;;4495:6;4503;4476:18;:34::i;2474:105:52:-;2518:54;;;;;2566:4;2518:54;;;2996:74:111;2518:10:52;:20;;;;;2547:9;;2969:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;9067:2:111;2161:73:24::1;::::0;::::1;9049:21:111::0;9106:2;9086:18;;;9079:30;9145:34;9125:18;;;9118:62;9216:8;9196:18;;;9189:36;9242:19;;2161:73:24::1;8865:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;9474:2:111;1414:68:24;;;9456:21:111;;;9493:18;;;9486:30;9552:34;9532:18;;;9525:62;9604:18;;1414:68:24;9272:356:111;974:241:39;1139:68;;9845:42:111;9914:15;;;1139:68:39;;;9896:34:111;9966:15;;9946:18;;;9939:43;9998:18;;;9991:34;;;1112:96:39;;1132:5;;1162:27;;9808:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;2433:187:24:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;10238:2:111;4148:67:52;;;10220:21:111;10277:2;10257:18;;;10250:30;10316:23;10296:18;;;10289:51;10357:18;;4148:67:52;10036:345:111;6886:819:67;6997:15;;;;;7093:65;;;;7104:7;7093:65;:::i;:::-;6996:162;;;;;;;;;;7227:23;7318:7;7303:12;7285:14;1419:5;7270:29;;;;:::i;:::-;7254:45;;:13;:45;:::i;:::-;7253:62;;;;:::i;:::-;:72;;;;:::i;:::-;7227:98;-1:-1:-1;7347:25:67;7339:4;:33;;;;;;;;:::i;:::-;;7335:311;;7431:63;:22;;;7454:7;7471:4;7478:15;7431:22;:63::i;:::-;7335:311;;;7592:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:43;;7620:15;;7592;:43;;7620:15;;7592:43;:::i;:::-;;;;-1:-1:-1;;7335:311:67;7655:15;;;;;;;:8;:15;;;;;7683;;7671:7;1247::24;1273:6;;;;1201:85;7671:7:67;7655:24;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;6886:819:67:o;763:205:39:-;902:58;;6777:42:111;6765:55;;902:58:39;;;6747:74:111;6837:18;;;6830:34;;;875:86:39;;895:5;;925:23;;6720:18:111;;902:58:39;6557:313:111;5374:1101:67;5512:20;5534:22;1419:5;5702:6;:27;;;:42;5694:95;;;;-1:-1:-1;;;5694:95:67;;12229:2:111;5694:95:67;;;12211:21:111;12268:2;12248:18;;;12241:30;12307:34;12287:18;;;12280:62;12378:10;12358:18;;;12351:38;12406:19;;5694:95:67;12027:404:111;5694:95:67;5800:31;;5834:23;;;;:6;:23;:::i;:::-;5800:57;;-1:-1:-1;5800:57:67;-1:-1:-1;5902:5:67;5875:32;;5867:98;;;;-1:-1:-1;;;5867:98:67;;13223:2:111;5867:98:67;;;13205:21:111;13262:2;13242:18;;;13235:30;13301:34;13281:18;;;13274:62;13372:23;13352:18;;;13345:51;13413:19;;5867:98:67;13021:417:111;5867:98:67;5975:12;6013:21;:16;6030:2;6013:16;;:21;:::i;:::-;6005:30;;;:::i;:::-;5997:39;;;-1:-1:-1;1889:20:64;;6047:15:67;6116:34;5997:39;6142:7;6116:18;:34::i;:::-;6093:57;;6160:22;6185:17;:6;:15;:17::i;:::-;6220:20;;;;;;;:11;:20;;;;;;6160:42;;-1:-1:-1;6220:25:67;6212:74;;;;-1:-1:-1;;;6212:74:67;;14358:2:111;6212:74:67;;;14340:21:111;14397:2;14377:18;;;14370:30;14436:34;14416:18;;;14409:62;14507:6;14487:18;;;14480:34;14531:19;;6212:74:67;14156:400:111;6212:74:67;6304:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;:40;-1:-1:-1;6304:40:67;6296:86;;;;-1:-1:-1;;;6296:86:67;;14763:2:111;6296:86:67;;;14745:21:111;14802:2;14782:18;;;14775:30;14841:34;14821:18;;;14814:62;14912:3;14892:18;;;14885:31;14933:19;;6296:86:67;14561:397:111;6296:86:67;6400:65;;;15247:42:111;15316:15;;;6400:65:67;;;15298:34:111;15368:15;;;;15348:18;;;15341:43;15400:18;;;15393:34;15443:18;;;15436:34;15486:19;;;;15479:35;;;;6400:65:67;;;;;;;;;;15209:19:111;;;;6400:65:67;;-1:-1:-1;6400:65:67;;-1:-1:-1;;;6400:65:67;-1:-1:-1;;;;5374:1101:67:o;3747:706:39:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:39;;16009:2:111;4351:85:39;;;15991:21:111;16048:2;16028:18;;;16021:30;16087:34;16067:18;;;16060:62;16158:12;16138:18;;;16131:40;16188:19;;4351:85:39;15807:406:111;4779:296:67;4922:14;;;;4871:22;4922:14;;;:7;:14;;;;;;4871:22;;4922:14;;4946:69;;;;-1:-1:-1;;;4946:69:67;;16420:2:111;4946:69:67;;;16402:21:111;16459:2;16439:18;;;16432:30;16498:34;16478:18;;;16471:62;16569:5;16549:18;;;16542:33;16592:19;;4946:69:67;16218:399:111;4946:69:67;5032:36;;;;;;;;2373:25:111;;;5032::67;;;;;;2346:18:111;;5032:36:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5025:43;4779:296;-1:-1:-1;;;;4779:296:67:o;2095:472:64:-;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;3743:1;3735:13;3728:20;3651:104;-1:-1:-1;;;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:42;;16824:2:111;5149:81:42;;;16806:21:111;16863:2;16843:18;;;16836:30;16902:34;16882:18;;;16875:62;16973:8;16953:18;;;16946:36;16999:19;;5149:81:42;16622:402:111;5149:81:42;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;17510:2:111;7908:60:42;;;17492:21:111;17549:2;17529:18;;;17522:30;17588:31;17568:18;;;17561:59;17637:18;;7908:60:42;17308:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;295:162;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;798:487::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;1014:9;1001:23;1033:39;1066:5;1033:39;:::i;:::-;1091:5;-1:-1:-1;1148:2:111;1133:18;;1120:32;1161:41;1120:32;1161:41;:::i;:::-;798:487;;1221:7;;-1:-1:-1;;;1275:2:111;1260:18;;;;1247:32;;798:487::o;1290:419::-;1373:6;1381;1434:2;1422:9;1413:7;1409:23;1405:32;1402:52;;;1450:1;1447;1440:12;1402:52;1489:9;1476:23;1508:39;1541:5;1508:39;:::i;:::-;1566:5;-1:-1:-1;1623:2:111;1608:18;;1595:32;1636:41;1595:32;1636:41;:::i;:::-;1696:7;1686:17;;;1290:419;;;;;:::o;1967:255::-;2026:6;2079:2;2067:9;2058:7;2054:23;2050:32;2047:52;;;2095:1;2092;2085:12;2047:52;2134:9;2121:23;2153:39;2186:5;2153:39;:::i;3081:819::-;3185:6;3193;3201;3209;3262:2;3250:9;3241:7;3237:23;3233:32;3230:52;;;3278:1;3275;3268:12;3230:52;3317:9;3304:23;3356:1;3349:5;3346:12;3336:40;;3372:1;3369;3362:12;3336:40;3395:5;-1:-1:-1;3451:2:111;3436:18;;3423:32;3474:18;3504:14;;;3501:34;;;3531:1;3528;3521:12;3501:34;3569:6;3558:9;3554:22;3544:32;;3614:7;3607:4;3603:2;3599:13;3595:27;3585:55;;3636:1;3633;3626:12;3585:55;3676:2;3663:16;3702:2;3694:6;3691:14;3688:34;;;3718:1;3715;3708:12;3688:34;3763:7;3758:2;3749:6;3745:2;3741:15;3737:24;3734:37;3731:57;;;3784:1;3781;3774:12;3731:57;3081:819;;3815:2;3807:11;;;;;-1:-1:-1;3837:6:111;;3890:2;3875:18;3862:32;;-1:-1:-1;3081:819:111;-1:-1:-1;;;3081:819:111:o;4948:530::-;5059:6;5067;5075;5128:2;5116:9;5107:7;5103:23;5099:32;5096:52;;;5144:1;5141;5134:12;5096:52;5184:9;5171:23;5217:18;5209:6;5206:30;5203:50;;;5249:1;5246;5239:12;5203:50;5272:22;;5328:3;5310:16;;;5306:26;5303:46;;;5345:1;5342;5335:12;5303:46;5368:2;5417;5402:18;;5389:32;;-1:-1:-1;5468:2:111;5453:18;;;5440:32;;4948:530;-1:-1:-1;;;4948:530:111:o;5483:258::-;5555:1;5565:113;5579:6;5576:1;5573:13;5565:113;;;5655:11;;;5649:18;5636:11;;;5629:39;5601:2;5594:10;5565:113;;;5696:6;5693:1;5690:13;5687:48;;;-1:-1:-1;;5731:1:111;5713:16;;5706:27;5483:258::o;5746:316::-;5787:3;5825:5;5819:12;5852:6;5847:3;5840:19;5868:63;5924:6;5917:4;5912:3;5908:14;5901:4;5894:5;5890:16;5868:63;:::i;:::-;5976:2;5964:15;5981:66;5960:88;5951:98;;;;6051:4;5947:109;;5746:316;-1:-1:-1;;5746:316:111:o;6067:288::-;6242:2;6231:9;6224:21;6205:4;6262:44;6302:2;6291:9;6287:18;6279:6;6262:44;:::i;:::-;6254:52;;6342:6;6337:2;6326:9;6322:18;6315:34;6067:288;;;;;:::o;7221:184::-;7273:77;7270:1;7263:88;7370:4;7367:1;7360:15;7394:4;7391:1;7384:15;7410:128;7450:3;7481:1;7477:6;7474:1;7471:13;7468:39;;;7487:18;;:::i;:::-;-1:-1:-1;7523:9:111;;7410:128::o;8136:184::-;8206:6;8259:2;8247:9;8238:7;8234:23;8230:32;8227:52;;;8275:1;8272;8265:12;8227:52;-1:-1:-1;8298:16:111;;8136:184;-1:-1:-1;8136:184:111:o;8735:125::-;8775:4;8803:1;8800;8797:8;8794:34;;;8808:18;;:::i;:::-;-1:-1:-1;8845:9:111;;8735:125::o;10386:633::-;10504:6;10512;10520;10528;10536;10589:3;10577:9;10568:7;10564:23;10560:33;10557:53;;;10606:1;10603;10596:12;10557:53;10645:9;10632:23;10664:39;10697:5;10664:39;:::i;:::-;10722:5;-1:-1:-1;10779:2:111;10764:18;;10751:32;10792:41;10751:32;10792:41;:::i;:::-;10386:633;;10852:7;;-1:-1:-1;;;;10906:2:111;10891:18;;10878:32;;10957:2;10942:18;;10929:32;;11008:3;10993:19;;;10980:33;;-1:-1:-1;10386:633:111:o;11024:228::-;11064:7;11190:1;11122:66;11118:74;11115:1;11112:81;11107:1;11100:9;11093:17;11089:105;11086:131;;;11197:18;;:::i;:::-;-1:-1:-1;11237:9:111;;11024:228::o;11257:274::-;11297:1;11323;11313:189;;11358:77;11355:1;11348:88;11459:4;11456:1;11449:15;11487:4;11484:1;11477:15;11313:189;-1:-1:-1;11516:9:111;;11257:274::o;11536:184::-;11588:77;11585:1;11578:88;11685:4;11682:1;11675:15;11709:4;11706:1;11699:15;12436:580;12513:4;12519:6;12579:11;12566:25;12669:66;12658:8;12642:14;12638:29;12634:102;12614:18;12610:127;12600:155;;12751:1;12748;12741:12;12600:155;12778:33;;12830:20;;;-1:-1:-1;12873:18:111;12862:30;;12859:50;;;12905:1;12902;12895:12;12859:50;12938:4;12926:17;;-1:-1:-1;12969:14:111;12965:27;;;12955:38;;12952:58;;;13006:1;13003;12996:12;12952:58;12436:580;;;;;:::o;13443:331::-;13548:9;13559;13601:8;13589:10;13586:24;13583:44;;;13623:1;13620;13613:12;13583:44;13652:6;13642:8;13639:20;13636:40;;;13672:1;13669;13662:12;13636:40;-1:-1:-1;;13698:23:111;;;13743:25;;;;;-1:-1:-1;13443:331:111:o;13779:372::-;13938:66;13900:19;;14022:11;;;;14053:2;14045:11;;14042:103;;;14132:2;14126;14119:3;14115:2;14111:12;14108:1;14104:20;14100:29;14096:2;14092:38;14088:47;14079:56;;14042:103;;;13779:372;;;;:::o;15525:277::-;15592:6;15645:2;15633:9;15624:7;15620:23;15616:32;15613:52;;;15661:1;15658;15651:12;15613:52;15693:9;15687:16;15746:5;15739:13;15732:21;15725:5;15722:32;15712:60;;15768:1;15765;15758:12;17029:274;17158:3;17196:6;17190:13;17212:53;17258:6;17253:3;17246:4;17238:6;17234:17;17212:53;:::i;:::-;17281:16;;;;;17029:274;-1:-1:-1;;17029:274:111:o;17666:219::-;17815:2;17804:9;17797:21;17778:4;17835:44;17875:2;17864:9;17860:18;17852:6;17835:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1480200","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"285","addDepositFor(address,address,uint256)":"infinite","addStake(uint32)":"infinite","addToken(address,address)":"infinite","balances(address,address)":"infinite","deposit()":"infinite","depositInfo(address,address)":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","lockTokenDeposit()":"5292","oracles(address)":"2562","owner()":"2341","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockBlock(address)":"2591","unlockStake()":"infinite","unlockTokenDeposit()":"22375","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,address,uint256)":"infinite"},"internal":{"_postOp(enum IPaymaster.PostOpMode,bytes calldata,uint256)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","getTokenValueOfEth(contract IERC20,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addDepositFor(address,address,uint256)":"382edd9e","addStake(uint32)":"0396cb60","addToken(address,address)":"5476bd72","balances(address,address)":"c23f001f","deposit()":"d0e30db0","depositInfo(address,address)":"493b0170","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","lockTokenDeposit()":"cd8f80c2","oracles(address)":"addd5099","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,address,uint256)":"cc9c837c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IOracle\",\"name\":\"tokenPriceOracle\",\"type\":\"address\"}],\"name\":\"addToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"oracles\",\"outputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\",\"token\":\"the token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address,address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\",\"token\":\"the token deposit to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"addToken(address,address)\":{\"notice\":\"owner of the paymaster should add supported tokens\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"notice\":\"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \\\"whitelisted\\\" by the bundler. (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/DepositPaymaster.sol\":\"DepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/DepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IOracle.sol\\\";\\n\\n/**\\n * A token-based paymaster that accepts token deposits\\n * The deposit is only a safeguard: the user pays with his token balance.\\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\\n * thus the required deposit is to cover just one method call.\\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\\n * (but can't use the deposit for this or further operations)\\n *\\n * paymasterAndData holds the paymaster address followed by the token address to use.\\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\\n * (the standard rules ban accessing data of an external contract)\\n * It can only be used if it is \\\"whitelisted\\\" by the bundler.\\n * (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\\n */\\ncontract DepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n\\n IOracle private constant NULL_ORACLE = IOracle(address(0));\\n mapping(IERC20 => IOracle) public oracles;\\n mapping(IERC20 => mapping(address => uint256)) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n }\\n\\n /**\\n * owner of the paymaster should add supported tokens\\n */\\n function addToken(IERC20 token, IOracle tokenPriceOracle) external onlyOwner {\\n require(oracles[token] == NULL_ORACLE, \\\"Token already set\\\");\\n oracles[token] = tokenPriceOracle;\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param token the token to deposit.\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n token.safeTransferFrom(msg.sender, address(this), amount);\\n require(oracles[token] != NULL_ORACLE, \\\"unsupported token\\\");\\n balances[token][account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[token][account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param token the token deposit to withdraw\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[token][msg.sender] -= amount;\\n token.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param token the token to use\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n IOracle oracle = oracles[token];\\n require(oracle != NULL_ORACLE, \\\"DepositPaymaster: unsupported token\\\");\\n return oracle.getTokenValueOfEth(ethBought);\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n require(paymasterAndData.length == 20+20, \\\"DepositPaymaster: paymasterAndData must specify token\\\");\\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[token][account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n token.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[token][account] -= actualTokenCost;\\n }\\n balances[token][owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0xfb5b9209fb12e32b02a1b97b4f4409db1d7e0ee78138bb08c79e877840f66878\",\"license\":\"GPL-3.0\"},\"contracts/samples/IOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface IOracle {\\n\\n /**\\n * return amount of tokens that are required to receive that much eth.\\n */\\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\\n}\\n\\n\",\"keccak256\":\"0xdefd2ec9c4e592ad68092e9e4c15d27c697fc08f90a885bcdb47542da88b42be\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/DepositPaymaster.sol:DepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":12235,"contract":"contracts/samples/DepositPaymaster.sol:DepositPaymaster","label":"oracles","offset":0,"slot":"1","type":"t_mapping(t_contract(IERC20)4419,t_contract(IOracle)13149)"},{"astId":12242,"contract":"contracts/samples/DepositPaymaster.sol:DepositPaymaster","label":"balances","offset":0,"slot":"2","type":"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))"},{"astId":12246,"contract":"contracts/samples/DepositPaymaster.sol:DepositPaymaster","label":"unlockBlock","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_contract(IOracle)13149":{"encoding":"inplace","label":"contract IOracle","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_contract(IERC20)4419,t_contract(IOracle)13149)":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => contract IOracle)","numberOfBytes":"32","value":"t_contract(IOracle)13149"},"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"addToken(address,address)":{"notice":"owner of the paymaster should add supported tokens"},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"notice":"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \"whitelisted\" by the bundler. (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)","version":1}}},"contracts/samples/GPODepositPaymaster.sol":{"GPODepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"address","name":"_supportedToken","type":"address"},{"internalType":"uint8","name":"_supportedTokenDecimals","type":"uint8"},{"internalType":"address","name":"_gasPriceOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasPriceOracle","outputs":[{"internalType":"contract IBobaGasPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supportedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportedTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_12734":{"entryPoint":null,"id":12734,"parameterSlots":4,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":168,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_12806":{"entryPoint":null,"id":12806,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory":{"entryPoint":273,"id":null,"parameterSlots":2,"returnSlots":4},"validator_revert_contract_IEntryPoint":{"entryPoint":248,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:903:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"314:587:111","statements":[{"body":{"nodeType":"YulBlock","src":"361:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"370:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"373:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"363:6:111"},"nodeType":"YulFunctionCall","src":"363:12:111"},"nodeType":"YulExpressionStatement","src":"363:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"335:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"344:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"331:3:111"},"nodeType":"YulFunctionCall","src":"331:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"356:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"327:3:111"},"nodeType":"YulFunctionCall","src":"327:33:111"},"nodeType":"YulIf","src":"324:53:111"},{"nodeType":"YulVariableDeclaration","src":"386:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"405:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"399:5:111"},"nodeType":"YulFunctionCall","src":"399:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"390:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"462:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"424:37:111"},"nodeType":"YulFunctionCall","src":"424:44:111"},"nodeType":"YulExpressionStatement","src":"424:44:111"},{"nodeType":"YulAssignment","src":"477:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"487:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"477:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"501:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"526:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"537:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"522:3:111"},"nodeType":"YulFunctionCall","src":"522:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"516:5:111"},"nodeType":"YulFunctionCall","src":"516:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"505:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"588:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"550:37:111"},"nodeType":"YulFunctionCall","src":"550:46:111"},"nodeType":"YulExpressionStatement","src":"550:46:111"},{"nodeType":"YulAssignment","src":"605:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"615:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"605:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"631:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"656:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"667:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"652:3:111"},"nodeType":"YulFunctionCall","src":"652:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"646:5:111"},"nodeType":"YulFunctionCall","src":"646:25:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"635:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"723:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"732:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"735:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"725:6:111"},"nodeType":"YulFunctionCall","src":"725:12:111"},"nodeType":"YulExpressionStatement","src":"725:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"693:7:111"},{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"706:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"715:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"702:3:111"},"nodeType":"YulFunctionCall","src":"702:18:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"690:2:111"},"nodeType":"YulFunctionCall","src":"690:31:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"683:6:111"},"nodeType":"YulFunctionCall","src":"683:39:111"},"nodeType":"YulIf","src":"680:59:111"},{"nodeType":"YulAssignment","src":"748:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"758:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"748:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"774:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"799:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"810:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"795:3:111"},"nodeType":"YulFunctionCall","src":"795:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"789:5:111"},"nodeType":"YulFunctionCall","src":"789:25:111"},"variables":[{"name":"value_3","nodeType":"YulTypedName","src":"778:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_3","nodeType":"YulIdentifier","src":"861:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"823:37:111"},"nodeType":"YulFunctionCall","src":"823:46:111"},"nodeType":"YulExpressionStatement","src":"823:46:111"},{"nodeType":"YulAssignment","src":"878:17:111","value":{"name":"value_3","nodeType":"YulIdentifier","src":"888:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"878:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"256:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"267:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"279:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"287:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"295:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"303:6:111","type":""}],"src":"163:738:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n let value_2 := mload(add(headStart, 64))\n if iszero(eq(value_2, and(value_2, 0xff))) { revert(0, 0) }\n value2 := value_2\n let value_3 := mload(add(headStart, 96))\n validator_revert_contract_IEntryPoint(value_3)\n value3 := value_3\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b5060405162001e2938038062001e29833981016040819052620000349162000111565b836200004033620000a8565b6001600160a01b03908116608052600380548583166001600160a81b031990911617600160a01b60ff861602179055600480546001600160a01b0319169183169190911790556200009e336000908152600260205260409020439055565b505050506200017e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200010e57600080fd5b50565b600080600080608085870312156200012857600080fd5b84516200013581620000f8565b60208601519094506200014881620000f8565b604086015190935060ff811681146200016057600080fd5b60608601519092506200017381620000f8565b939692955090935050565b608051611c5e620001cb6000396000818161041b0152818161055b0152818161062501528181610736015281816107fd0152818161088d015281816109400152610d630152611c5e6000f3fe6080604052600436106101805760003560e01c80638da5cb5b116100d6578063c399ec881161007f578063f2fde38b11610059578063f2fde38b146104b1578063f465c77e146104d1578063f5bf3fcf146104ff57600080fd5b8063c399ec8814610472578063cd8f80c214610487578063d0e30db0146104a957600080fd5b8063b0d691fe116100b0578063b0d691fe14610409578063bb9fe6bf1461043d578063c23a5cea1461045257600080fd5b80638da5cb5b1461039a5780639ed0fb68146103c5578063a9a23409146103e957600080fd5b80634a6f84cf116101385780636f6dc5ae116101125780636f6dc5ae14610342578063715018a61461036f578063796d43711461038457600080fd5b80634a6f84cf146102905780634f16bbf3146102bd57806363445989146102dd57600080fd5b8063205c287811610169578063205c2878146101f1578063230388941461021157806327e235e31461025557600080fd5b80630396cb60146101855780630ee0599c1461019a575b600080fd5b61019861019336600461170d565b61051f565b005b3480156101a657600080fd5b506003546101c79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101fd57600080fd5b5061019861020c36600461175c565b6105d1565b34801561021d57600080fd5b506003546102439074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101e8565b34801561026157600080fd5b50610282610270366004611788565b60016020526000908152604090205481565b6040519081526020016101e8565b34801561029c57600080fd5b506102826102ab366004611788565b60026020526000908152604090205481565b3480156102c957600080fd5b506101986102d836600461175c565b610669565b3480156102e957600080fd5b5061032d6102f8366004611788565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160209081526040808320546002909252909120549091565b604080519283526020830191909152016101e8565b34801561034e57600080fd5b506004546101c79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037b57600080fd5b506101986106fe565b34801561039057600080fd5b506102826188b881565b3480156103a657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101c7565b3480156103d157600080fd5b50610198336000908152600260205260409020439055565b3480156103f557600080fd5b506101986104043660046117a5565b610712565b34801561041557600080fd5b506101c77f000000000000000000000000000000000000000000000000000000000000000081565b34801561044957600080fd5b5061019861072c565b34801561045e57600080fd5b5061019861046d366004611788565b6107b0565b34801561047e57600080fd5b5061028261085c565b34801561049357600080fd5b5061019833600090815260026020526040812055565b610198610912565b3480156104bd57600080fd5b506101986104cc366004611788565b61099a565b3480156104dd57600080fd5b506104f16104ec366004611834565b610a56565b6040516101e89291906118fe565b34801561050b57600080fd5b5061019861051a36600461175c565b610a79565b610527610b79565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105b557600080fd5b505af11580156105c9573d6000803e3d6000fd5b505050505050565b6105d9610b79565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105b557600080fd5b60035461068e9073ffffffffffffffffffffffffffffffffffffffff16333084610bfa565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906106c390849061194f565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036106fa576106fa33600090815260026020526040812055565b5050565b610706610b79565b6107106000610cd6565b565b61071a610d4b565b61072684848484610dea565b50505050565b610734610b79565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561079c57600080fd5b505af1158015610726573d6000803e3d6000fd5b6107b8610b79565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561084157600080fd5b505af1158015610855573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090d9190611967565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561084157600080fd5b6109a2610b79565b73ffffffffffffffffffffffffffffffffffffffff8116610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610a5381610cd6565b50565b60606000610a62610d4b565b610a6d858585610f30565b91509150935093915050565b3360009081526002602052604090205415801590610aa557503360009081526002602052604090205443115b610b31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610a41565b3360009081526001602052604081208054839290610b50908490611980565b90915550506003546106fa9073ffffffffffffffffffffffffffffffffffffffff1683836111c1565b60005473ffffffffffffffffffffffffffffffffffffffff163314610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a41565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107269085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261121c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610a41565b6000808080610dfb86880188611997565b935093509350935060008183856188b8610e1591906119d2565b610e1f908961194f565b610e2991906119d2565b610e339190611a0f565b90506002896002811115610e4957610e49611a4a565b14610e7857600354610e739073ffffffffffffffffffffffffffffffffffffffff16863084610bfa565b610eb3565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054839290610ead908490611980565b90915550505b8060016000610ed760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f20919061194f565b9091555050505050505050505050565b606060006188b88560a0013511610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610a41565b84356000610fd685611328565b90506000610fe3886114bd565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205490915015611098576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610a41565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205482111561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a41565b6040805173ffffffffffffffffffffffffffffffffffffffff85166020820152908101829052606081018390526080810187905260a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298600098509650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112179084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610c54565b505050565b600061127e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114ec9092919063ffffffff16565b805190915015611217578080602001905181019061129c9190611a79565b611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a41565b60048054604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600093849373ffffffffffffffffffffffffffffffffffffffff169263313ce56792818301926020928290030181865afa158015611397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bb9190611967565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630aa2f4206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190611967565b9050600061145f83600a611bbb565b61146983876119d2565b6114739190611a0f565b60035490915061149f9074010000000000000000000000000000000000000000900460ff166012611bc7565b6114aa90600a611bea565b6114b49082611a0f565b95945050505050565b600060e08201356101008301358082036114d8575092915050565b6114e4824883016114fb565b949350505050565b60606114e48484600085611515565b600081831061150a578161150c565b825b90505b92915050565b6060824710156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a41565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115d09190611bf9565b60006040518083038185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b50915091506116238783838761162e565b979650505050505050565b606083156116c45782516000036116bd5773ffffffffffffffffffffffffffffffffffffffff85163b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a41565b50816114e4565b6114e483838151156116d95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a419190611c15565b60006020828403121561171f57600080fd5b813563ffffffff8116811461173357600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a5357600080fd5b6000806040838503121561176f57600080fd5b823561177a8161173a565b946020939093013593505050565b60006020828403121561179a57600080fd5b81356117338161173a565b600080600080606085870312156117bb57600080fd5b8435600381106117ca57600080fd5b9350602085013567ffffffffffffffff808211156117e757600080fd5b818701915087601f8301126117fb57600080fd5b81358181111561180a57600080fd5b88602082850101111561181c57600080fd5b95986020929092019750949560400135945092505050565b60008060006060848603121561184957600080fd5b833567ffffffffffffffff81111561186057600080fd5b8401610160818703121561187357600080fd5b95602085013595506040909401359392505050565b60005b838110156118a357818101518382015260200161188b565b838111156107265750506000910152565b600081518084526118cc816020860160208601611888565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061191160408301856118b4565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561196257611962611920565b500190565b60006020828403121561197957600080fd5b5051919050565b60008282101561199257611992611920565b500390565b600080600080608085870312156119ad57600080fd5b84356119b88161173a565b966020860135965060408601359560600135945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a0a57611a0a611920565b500290565b600082611a45577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215611a8b57600080fd5b8151801515811461173357600080fd5b600181815b80851115611af457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ada57611ada611920565b80851615611ae757918102915b93841c9390800290611aa0565b509250929050565b600082611b0b5750600161150f565b81611b185750600061150f565b8160018114611b2e5760028114611b3857611b54565b600191505061150f565b60ff841115611b4957611b49611920565b50506001821b61150f565b5060208310610133831016604e8410600b8410161715611b77575081810a61150f565b611b818383611a9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611bb357611bb3611920565b029392505050565b600061150c8383611afc565b600060ff821660ff841680821015611be157611be1611920565b90039392505050565b600061150c60ff841683611afc565b60008251611c0b818460208701611888565b9190910192915050565b60208152600061150c60208301846118b456fea2646970667358221220dd161eab57414807151bab12f7bdc160d7655015a2a5f235cd5c41e4c876dc7e64736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1E29 CODESIZE SUB DUP1 PUSH3 0x1E29 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x111 JUMP JUMPDEST DUP4 PUSH3 0x40 CALLER PUSH3 0xA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE PUSH1 0x3 DUP1 SLOAD DUP6 DUP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT SWAP1 SWAP2 AND OR PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0xFF DUP7 AND MUL OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 DUP4 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH3 0x9E CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST POP POP POP POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x10E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH3 0x128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH3 0x135 DUP2 PUSH3 0xF8 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x148 DUP2 PUSH3 0xF8 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0xFF DUP2 AND DUP2 EQ PUSH3 0x160 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0xF8 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x1C5E PUSH3 0x1CB PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x41B ADD MSTORE DUP2 DUP2 PUSH2 0x55B ADD MSTORE DUP2 DUP2 PUSH2 0x625 ADD MSTORE DUP2 DUP2 PUSH2 0x736 ADD MSTORE DUP2 DUP2 PUSH2 0x7FD ADD MSTORE DUP2 DUP2 PUSH2 0x88D ADD MSTORE DUP2 DUP2 PUSH2 0x940 ADD MSTORE PUSH2 0xD63 ADD MSTORE PUSH2 0x1C5E PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x180 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4D1 JUMPI DUP1 PUSH4 0xF5BF3FCF EQ PUSH2 0x4FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x43D JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x39A JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3C5 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x6F6DC5AE GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x6F6DC5AE EQ PUSH2 0x342 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x290 JUMPI DUP1 PUSH4 0x4F16BBF3 EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0x63445989 EQ PUSH2 0x2DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x23038894 EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0xEE0599C EQ PUSH2 0x19A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x198 PUSH2 0x193 CALLDATASIZE PUSH1 0x4 PUSH2 0x170D JUMP JUMPDEST PUSH2 0x51F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x1C7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x5D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x243 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x270 CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x2AB CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x2D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x669 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32D PUSH2 0x2F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x1C7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x6FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x17A5 JUMP JUMPDEST PUSH2 0x712 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C7 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x449 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x72C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x45E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x46D CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x7B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x85C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x198 PUSH2 0x912 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x4CC CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x99A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4F1 PUSH2 0x4EC CALLDATASIZE PUSH1 0x4 PUSH2 0x1834 JUMP JUMPDEST PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP3 SWAP2 SWAP1 PUSH2 0x18FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x51A CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x527 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5C9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5D9 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x68E SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER ADDRESS DUP5 PUSH2 0xBFA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x6C3 SWAP1 DUP5 SWAP1 PUSH2 0x194F JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x6FA JUMPI PUSH2 0x6FA CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x706 PUSH2 0xB79 JUMP JUMPDEST PUSH2 0x710 PUSH1 0x0 PUSH2 0xCD6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x71A PUSH2 0xD4B JUMP JUMPDEST PUSH2 0x726 DUP5 DUP5 DUP5 DUP5 PUSH2 0xDEA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x734 PUSH2 0xB79 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x79C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x726 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x7B8 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x841 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x855 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x90D SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x841 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9A2 PUSH2 0xB79 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xA4A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA53 DUP2 PUSH2 0xCD6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xA62 PUSH2 0xD4B JUMP JUMPDEST PUSH2 0xA6D DUP6 DUP6 DUP6 PUSH2 0xF30 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAA5 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xB31 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB50 SWAP1 DUP5 SWAP1 PUSH2 0x1980 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 SLOAD PUSH2 0x6FA SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH2 0x11C1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x710 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x726 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x121C JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x710 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xDFB DUP7 DUP9 ADD DUP9 PUSH2 0x1997 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xE15 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0xE1F SWAP1 DUP10 PUSH2 0x194F JUMP JUMPDEST PUSH2 0xE29 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0xE33 SWAP2 SWAP1 PUSH2 0x1A0F JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xE49 JUMPI PUSH2 0xE49 PUSH2 0x1A4A JUMP JUMPDEST EQ PUSH2 0xE78 JUMPI PUSH1 0x3 SLOAD PUSH2 0xE73 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 ADDRESS DUP5 PUSH2 0xBFA JUMP JUMPDEST PUSH2 0xEB3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xEAD SWAP1 DUP5 SWAP1 PUSH2 0x1980 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0xED7 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xF20 SWAP2 SWAP1 PUSH2 0x194F JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0xFC9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH1 0x0 PUSH2 0xFD6 DUP6 PUSH2 0x1328 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xFE3 DUP9 PUSH2 0x14BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1098 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x114D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP9 PUSH1 0x0 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x1217 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xC54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14EC SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1217 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x129C SWAP2 SWAP1 PUSH2 0x1A79 JUMP JUMPDEST PUSH2 0x1217 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 PUSH4 0x313CE567 SWAP3 DUP2 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1397 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13BB SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAA2F420 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x142C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1450 SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x145F DUP4 PUSH1 0xA PUSH2 0x1BBB JUMP JUMPDEST PUSH2 0x1469 DUP4 DUP8 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0x1473 SWAP2 SWAP1 PUSH2 0x1A0F JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 SWAP2 POP PUSH2 0x149F SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x1BC7 JUMP JUMPDEST PUSH2 0x14AA SWAP1 PUSH1 0xA PUSH2 0x1BEA JUMP JUMPDEST PUSH2 0x14B4 SWAP1 DUP3 PUSH2 0x1A0F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x14D8 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x14E4 DUP3 BASEFEE DUP4 ADD PUSH2 0x14FB JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x14E4 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1515 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x150A JUMPI DUP2 PUSH2 0x150C JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x15A7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x15D0 SWAP2 SWAP1 PUSH2 0x1BF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x160D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1612 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1623 DUP8 DUP4 DUP4 DUP8 PUSH2 0x162E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16C4 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x16BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x16BD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST POP DUP2 PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x14E4 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x16D9 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA41 SWAP2 SWAP1 PUSH2 0x1C15 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x171F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xA53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x176F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x177A DUP2 PUSH2 0x173A JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x179A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1733 DUP2 PUSH2 0x173A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x17FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x180A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x181C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1849 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1873 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x188B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x726 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x18CC DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1888 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1911 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x18B4 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1962 JUMPI PUSH2 0x1962 PUSH2 0x1920 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1979 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1992 JUMPI PUSH2 0x1992 PUSH2 0x1920 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x19B8 DUP2 PUSH2 0x173A JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1A0A JUMPI PUSH2 0x1A0A PUSH2 0x1920 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A45 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1AF4 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1ADA JUMPI PUSH2 0x1ADA PUSH2 0x1920 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1AE7 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1AA0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B0B JUMPI POP PUSH1 0x1 PUSH2 0x150F JUMP JUMPDEST DUP2 PUSH2 0x1B18 JUMPI POP PUSH1 0x0 PUSH2 0x150F JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1B2E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1B38 JUMPI PUSH2 0x1B54 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x150F JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1B49 JUMPI PUSH2 0x1B49 PUSH2 0x1920 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x150F JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1B77 JUMPI POP DUP2 DUP2 EXP PUSH2 0x150F JUMP JUMPDEST PUSH2 0x1B81 DUP4 DUP4 PUSH2 0x1A9B JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1BB3 JUMPI PUSH2 0x1BB3 PUSH2 0x1920 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x150C DUP4 DUP4 PUSH2 0x1AFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x1BE1 JUMPI PUSH2 0x1BE1 PUSH2 0x1920 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x150C PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1AFC JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C0B DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1888 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x150C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x18B4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD AND 0x1E 0xAB JUMPI COINBASE BASEFEE SMOD ISZERO SHL 0xAB SLT 0xF7 0xBD 0xC1 PUSH1 0xD7 PUSH6 0x5015A2A5F235 0xCD 0x5C COINBASE 0xE4 0xC8 PUSH23 0xDC7E64736F6C634300080F003300000000000000000000 ","sourceMap":"483:6018:68:-:0;;;927:425;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1059:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;1082:14:68::1;:40:::0;;;;::::1;-1:-1:-1::0;;;;;;1132:48:68;;;;-1:-1:-1;;;1132:48:68::1;::::0;::::1;;;::::0;;1190:14:::1;:53:::0;;-1:-1:-1;;;;;;1190:53:68::1;::::0;;::::1;::::0;;;::::1;::::0;;1325:20:::1;2725:10:::0;2713:23;;;;:11;:23;;;;;2739:12;2713:38;;2666:92;1325:20:::1;927:425:::0;;;;483:6018;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:738::-;279:6;287;295;303;356:3;344:9;335:7;331:23;327:33;324:53;;;373:1;370;363:12;324:53;405:9;399:16;424:44;462:5;424:44;:::i;:::-;537:2;522:18;;516:25;487:5;;-1:-1:-1;550:46:111;516:25;550:46;:::i;:::-;667:2;652:18;;646:25;615:7;;-1:-1:-1;715:4:111;702:18;;690:31;;680:59;;735:1;732;725:12;680:59;810:2;795:18;;789:25;758:7;;-1:-1:-1;823:46:111;789:25;823:46;:::i;:::-;163:738;;;;-1:-1:-1;163:738:111;;-1:-1:-1;;163:738:111:o;:::-;483:6018:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_12683":{"entryPoint":null,"id":12683,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":4636,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":2937,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_13056":{"entryPoint":3562,"id":13056,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":3403,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":3286,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_12977":{"entryPoint":3888,"id":12977,"parameterSlots":3,"returnSlots":2},"@addDepositFor_12770":{"entryPoint":1641,"id":12770,"parameterSlots":2,"returnSlots":0},"@addStake_7469":{"entryPoint":1311,"id":7469,"parameterSlots":1,"returnSlots":0},"@balances_12687":{"entryPoint":null,"id":12687,"parameterSlots":0,"returnSlots":0},"@depositInfo_12793":{"entryPoint":null,"id":12793,"parameterSlots":1,"returnSlots":2},"@deposit_7433":{"entryPoint":2322,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":5397,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":5356,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPriceOracle_12699":{"entryPoint":null,"id":12699,"parameterSlots":0,"returnSlots":0},"@gasPrice_11050":{"entryPoint":5309,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":2140,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEth_12903":{"entryPoint":4904,"id":12903,"parameterSlots":1,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_12818":{"entryPoint":null,"id":12818,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":5371,"id":11162,"parameterSlots":2,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":1810,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":1790,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":3066,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":4545,"id":4512,"parameterSlots":3,"returnSlots":0},"@supportedTokenDecimals_12696":{"entryPoint":null,"id":12696,"parameterSlots":0,"returnSlots":0},"@supportedToken_12694":{"entryPoint":null,"id":12694,"parameterSlots":0,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":2458,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_12691":{"entryPoint":null,"id":12691,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":1836,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_12806":{"entryPoint":null,"id":12806,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":2646,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":5678,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":1968,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1489,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_12859":{"entryPoint":2681,"id":12859,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":6024,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":5980,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256":{"entryPoint":6551,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":6777,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":6053,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6196,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":6503,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":5901,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":6324,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":7161,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":6398,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":7189,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":6479,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":6671,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":6811,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":7099,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":7146,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":6908,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":6610,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":6528,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint8":{"entryPoint":7111,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":6280,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":6432,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":6730,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":5946,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:15771:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"411:125:111","statements":[{"nodeType":"YulAssignment","src":"421:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"433:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"444:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"421:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"463:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"478:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"474:3:111"},"nodeType":"YulFunctionCall","src":"474:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"456:6:111"},"nodeType":"YulFunctionCall","src":"456:74:111"},"nodeType":"YulExpressionStatement","src":"456:74:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"380:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"391:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"402:4:111","type":""}],"src":"295:241:111"},{"body":{"nodeType":"YulBlock","src":"594:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"681:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"690:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"693:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"683:6:111"},"nodeType":"YulFunctionCall","src":"683:12:111"},"nodeType":"YulExpressionStatement","src":"683:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"617:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"628:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"635:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"624:3:111"},"nodeType":"YulFunctionCall","src":"624:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"614:2:111"},"nodeType":"YulFunctionCall","src":"614:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"607:6:111"},"nodeType":"YulFunctionCall","src":"607:73:111"},"nodeType":"YulIf","src":"604:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"583:5:111","type":""}],"src":"541:162:111"},{"body":{"nodeType":"YulBlock","src":"803:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"851:6:111"},"nodeType":"YulFunctionCall","src":"851:12:111"},"nodeType":"YulExpressionStatement","src":"851:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"824:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"833:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"820:3:111"},"nodeType":"YulFunctionCall","src":"820:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"845:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"816:3:111"},"nodeType":"YulFunctionCall","src":"816:32:111"},"nodeType":"YulIf","src":"813:52:111"},{"nodeType":"YulVariableDeclaration","src":"874:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"900:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"887:12:111"},"nodeType":"YulFunctionCall","src":"887:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"878:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"952:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"919:32:111"},"nodeType":"YulFunctionCall","src":"919:39:111"},"nodeType":"YulExpressionStatement","src":"919:39:111"},{"nodeType":"YulAssignment","src":"967:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"977:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"967:6:111"}]},{"nodeType":"YulAssignment","src":"991:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1018:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1029:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1014:3:111"},"nodeType":"YulFunctionCall","src":"1014:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1001:12:111"},"nodeType":"YulFunctionCall","src":"1001:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"991:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"761:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"772:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"784:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"792:6:111","type":""}],"src":"708:331:111"},{"body":{"nodeType":"YulBlock","src":"1141:87:111","statements":[{"nodeType":"YulAssignment","src":"1151:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1163:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1174:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1159:3:111"},"nodeType":"YulFunctionCall","src":"1159:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1151:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1193:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1208:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1216:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1204:3:111"},"nodeType":"YulFunctionCall","src":"1204:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1186:6:111"},"nodeType":"YulFunctionCall","src":"1186:36:111"},"nodeType":"YulExpressionStatement","src":"1186:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1110:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1121:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1132:4:111","type":""}],"src":"1044:184:111"},{"body":{"nodeType":"YulBlock","src":"1303:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"1349:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1358:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1361:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1351:6:111"},"nodeType":"YulFunctionCall","src":"1351:12:111"},"nodeType":"YulExpressionStatement","src":"1351:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1324:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1333:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1320:3:111"},"nodeType":"YulFunctionCall","src":"1320:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1345:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1316:3:111"},"nodeType":"YulFunctionCall","src":"1316:32:111"},"nodeType":"YulIf","src":"1313:52:111"},{"nodeType":"YulVariableDeclaration","src":"1374:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1400:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1387:12:111"},"nodeType":"YulFunctionCall","src":"1387:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1378:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1452:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1419:32:111"},"nodeType":"YulFunctionCall","src":"1419:39:111"},"nodeType":"YulExpressionStatement","src":"1419:39:111"},{"nodeType":"YulAssignment","src":"1467:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1477:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1467:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1269:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1280:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1292:6:111","type":""}],"src":"1233:255:111"},{"body":{"nodeType":"YulBlock","src":"1594:76:111","statements":[{"nodeType":"YulAssignment","src":"1604:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1616:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1627:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1612:3:111"},"nodeType":"YulFunctionCall","src":"1612:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1604:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1646:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1657:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1639:6:111"},"nodeType":"YulFunctionCall","src":"1639:25:111"},"nodeType":"YulExpressionStatement","src":"1639:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1563:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1574:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1585:4:111","type":""}],"src":"1493:177:111"},{"body":{"nodeType":"YulBlock","src":"1762:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"1808:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1817:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1820:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1810:6:111"},"nodeType":"YulFunctionCall","src":"1810:12:111"},"nodeType":"YulExpressionStatement","src":"1810:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1783:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1792:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1779:3:111"},"nodeType":"YulFunctionCall","src":"1779:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1804:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1775:3:111"},"nodeType":"YulFunctionCall","src":"1775:32:111"},"nodeType":"YulIf","src":"1772:52:111"},{"nodeType":"YulVariableDeclaration","src":"1833:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1859:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1846:12:111"},"nodeType":"YulFunctionCall","src":"1846:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1837:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1911:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1878:32:111"},"nodeType":"YulFunctionCall","src":"1878:39:111"},"nodeType":"YulExpressionStatement","src":"1878:39:111"},{"nodeType":"YulAssignment","src":"1926:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1936:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1926:6:111"}]},{"nodeType":"YulAssignment","src":"1950:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1977:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1988:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1973:3:111"},"nodeType":"YulFunctionCall","src":"1973:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1960:12:111"},"nodeType":"YulFunctionCall","src":"1960:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1950:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1720:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1731:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1743:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1751:6:111","type":""}],"src":"1675:323:111"},{"body":{"nodeType":"YulBlock","src":"2132:119:111","statements":[{"nodeType":"YulAssignment","src":"2142:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2154:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2165:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2150:3:111"},"nodeType":"YulFunctionCall","src":"2150:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2142:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2184:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2195:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2177:6:111"},"nodeType":"YulFunctionCall","src":"2177:25:111"},"nodeType":"YulExpressionStatement","src":"2177:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2222:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2233:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2218:3:111"},"nodeType":"YulFunctionCall","src":"2218:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"2238:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2211:6:111"},"nodeType":"YulFunctionCall","src":"2211:34:111"},"nodeType":"YulExpressionStatement","src":"2211:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2093:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2104:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2112:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2123:4:111","type":""}],"src":"2003:248:111"},{"body":{"nodeType":"YulBlock","src":"2386:125:111","statements":[{"nodeType":"YulAssignment","src":"2396:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2408:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2419:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2404:3:111"},"nodeType":"YulFunctionCall","src":"2404:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2396:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2438:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2453:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2461:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2449:3:111"},"nodeType":"YulFunctionCall","src":"2449:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2431:6:111"},"nodeType":"YulFunctionCall","src":"2431:74:111"},"nodeType":"YulExpressionStatement","src":"2431:74:111"}]},"name":"abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2355:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2366:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2377:4:111","type":""}],"src":"2256:255:111"},{"body":{"nodeType":"YulBlock","src":"2617:125:111","statements":[{"nodeType":"YulAssignment","src":"2627:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2650:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2635:3:111"},"nodeType":"YulFunctionCall","src":"2635:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2627:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2669:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2684:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2692:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2680:3:111"},"nodeType":"YulFunctionCall","src":"2680:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2662:6:111"},"nodeType":"YulFunctionCall","src":"2662:74:111"},"nodeType":"YulExpressionStatement","src":"2662:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2586:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2597:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2608:4:111","type":""}],"src":"2516:226:111"},{"body":{"nodeType":"YulBlock","src":"2886:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"2932:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2941:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2944:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2934:6:111"},"nodeType":"YulFunctionCall","src":"2934:12:111"},"nodeType":"YulExpressionStatement","src":"2934:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2907:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2916:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2903:3:111"},"nodeType":"YulFunctionCall","src":"2903:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2928:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2899:3:111"},"nodeType":"YulFunctionCall","src":"2899:32:111"},"nodeType":"YulIf","src":"2896:52:111"},{"nodeType":"YulVariableDeclaration","src":"2957:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2983:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2970:12:111"},"nodeType":"YulFunctionCall","src":"2970:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2961:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3026:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3035:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3038:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3028:6:111"},"nodeType":"YulFunctionCall","src":"3028:12:111"},"nodeType":"YulExpressionStatement","src":"3028:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3015:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3022:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3012:2:111"},"nodeType":"YulFunctionCall","src":"3012:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3005:6:111"},"nodeType":"YulFunctionCall","src":"3005:20:111"},"nodeType":"YulIf","src":"3002:40:111"},{"nodeType":"YulAssignment","src":"3051:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3061:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3051:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3075:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3106:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3117:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3102:3:111"},"nodeType":"YulFunctionCall","src":"3102:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3089:12:111"},"nodeType":"YulFunctionCall","src":"3089:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3079:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3130:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3140:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3134:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3185:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3194:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3197:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3187:6:111"},"nodeType":"YulFunctionCall","src":"3187:12:111"},"nodeType":"YulExpressionStatement","src":"3187:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3173:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3181:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3170:2:111"},"nodeType":"YulFunctionCall","src":"3170:14:111"},"nodeType":"YulIf","src":"3167:34:111"},{"nodeType":"YulVariableDeclaration","src":"3210:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3224:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3235:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3220:3:111"},"nodeType":"YulFunctionCall","src":"3220:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3214:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3292:6:111"},"nodeType":"YulFunctionCall","src":"3292:12:111"},"nodeType":"YulExpressionStatement","src":"3292:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3269:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3273:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3265:3:111"},"nodeType":"YulFunctionCall","src":"3265:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3280:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3261:3:111"},"nodeType":"YulFunctionCall","src":"3261:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3254:6:111"},"nodeType":"YulFunctionCall","src":"3254:35:111"},"nodeType":"YulIf","src":"3251:55:111"},{"nodeType":"YulVariableDeclaration","src":"3315:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3342:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3329:12:111"},"nodeType":"YulFunctionCall","src":"3329:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3319:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3372:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3381:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3384:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3374:6:111"},"nodeType":"YulFunctionCall","src":"3374:12:111"},"nodeType":"YulExpressionStatement","src":"3374:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3360:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3368:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3357:2:111"},"nodeType":"YulFunctionCall","src":"3357:14:111"},"nodeType":"YulIf","src":"3354:34:111"},{"body":{"nodeType":"YulBlock","src":"3438:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3447:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3450:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3440:6:111"},"nodeType":"YulFunctionCall","src":"3440:12:111"},"nodeType":"YulExpressionStatement","src":"3440:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3411:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"3415:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3407:3:111"},"nodeType":"YulFunctionCall","src":"3407:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3424:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3403:3:111"},"nodeType":"YulFunctionCall","src":"3403:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3429:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3400:2:111"},"nodeType":"YulFunctionCall","src":"3400:37:111"},"nodeType":"YulIf","src":"3397:57:111"},{"nodeType":"YulAssignment","src":"3463:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3477:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3481:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3473:3:111"},"nodeType":"YulFunctionCall","src":"3473:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3463:6:111"}]},{"nodeType":"YulAssignment","src":"3493:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"3503:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3493:6:111"}]},{"nodeType":"YulAssignment","src":"3518:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3545:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3541:3:111"},"nodeType":"YulFunctionCall","src":"3541:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3528:12:111"},"nodeType":"YulFunctionCall","src":"3528:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"3518:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2828:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2839:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2851:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2859:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2867:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2875:6:111","type":""}],"src":"2747:819:111"},{"body":{"nodeType":"YulBlock","src":"3693:125:111","statements":[{"nodeType":"YulAssignment","src":"3703:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3715:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3726:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3711:3:111"},"nodeType":"YulFunctionCall","src":"3711:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3703:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3745:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3760:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3768:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3756:3:111"},"nodeType":"YulFunctionCall","src":"3756:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3738:6:111"},"nodeType":"YulFunctionCall","src":"3738:74:111"},"nodeType":"YulExpressionStatement","src":"3738:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3662:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3673:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3684:4:111","type":""}],"src":"3571:247:111"},{"body":{"nodeType":"YulBlock","src":"3901:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3947:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3956:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3959:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3949:6:111"},"nodeType":"YulFunctionCall","src":"3949:12:111"},"nodeType":"YulExpressionStatement","src":"3949:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3922:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3931:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3918:3:111"},"nodeType":"YulFunctionCall","src":"3918:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3943:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3914:3:111"},"nodeType":"YulFunctionCall","src":"3914:32:111"},"nodeType":"YulIf","src":"3911:52:111"},{"nodeType":"YulVariableDeclaration","src":"3972:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3998:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3985:12:111"},"nodeType":"YulFunctionCall","src":"3985:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3976:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4050:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"4017:32:111"},"nodeType":"YulFunctionCall","src":"4017:39:111"},"nodeType":"YulExpressionStatement","src":"4017:39:111"},{"nodeType":"YulAssignment","src":"4065:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4075:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4065:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3867:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3878:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3890:6:111","type":""}],"src":"3823:263:111"},{"body":{"nodeType":"YulBlock","src":"4229:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"4275:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4284:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4287:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4277:6:111"},"nodeType":"YulFunctionCall","src":"4277:12:111"},"nodeType":"YulExpressionStatement","src":"4277:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4250:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4259:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4246:3:111"},"nodeType":"YulFunctionCall","src":"4246:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4271:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4242:3:111"},"nodeType":"YulFunctionCall","src":"4242:32:111"},"nodeType":"YulIf","src":"4239:52:111"},{"nodeType":"YulVariableDeclaration","src":"4300:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4327:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4314:12:111"},"nodeType":"YulFunctionCall","src":"4314:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4304:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4380:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4389:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4392:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4382:6:111"},"nodeType":"YulFunctionCall","src":"4382:12:111"},"nodeType":"YulExpressionStatement","src":"4382:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4352:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4360:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4349:2:111"},"nodeType":"YulFunctionCall","src":"4349:30:111"},"nodeType":"YulIf","src":"4346:50:111"},{"nodeType":"YulVariableDeclaration","src":"4405:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4419:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4430:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4415:3:111"},"nodeType":"YulFunctionCall","src":"4415:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4409:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4476:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4485:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4488:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4478:6:111"},"nodeType":"YulFunctionCall","src":"4478:12:111"},"nodeType":"YulExpressionStatement","src":"4478:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4457:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4466:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4453:3:111"},"nodeType":"YulFunctionCall","src":"4453:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"4471:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4449:3:111"},"nodeType":"YulFunctionCall","src":"4449:26:111"},"nodeType":"YulIf","src":"4446:46:111"},{"nodeType":"YulAssignment","src":"4501:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"4511:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4501:6:111"}]},{"nodeType":"YulAssignment","src":"4522:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4549:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4560:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4545:3:111"},"nodeType":"YulFunctionCall","src":"4545:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4532:12:111"},"nodeType":"YulFunctionCall","src":"4532:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4522:6:111"}]},{"nodeType":"YulAssignment","src":"4573:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4611:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4596:3:111"},"nodeType":"YulFunctionCall","src":"4596:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4583:12:111"},"nodeType":"YulFunctionCall","src":"4583:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4573:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4179:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4190:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4202:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4210:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4218:6:111","type":""}],"src":"4091:530:111"},{"body":{"nodeType":"YulBlock","src":"4679:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4689:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4698:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"4693:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4758:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"4783:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"4788:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4779:3:111"},"nodeType":"YulFunctionCall","src":"4779:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"4802:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"4807:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4798:3:111"},"nodeType":"YulFunctionCall","src":"4798:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4792:5:111"},"nodeType":"YulFunctionCall","src":"4792:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4772:6:111"},"nodeType":"YulFunctionCall","src":"4772:39:111"},"nodeType":"YulExpressionStatement","src":"4772:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4719:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"4722:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4716:2:111"},"nodeType":"YulFunctionCall","src":"4716:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"4730:19:111","statements":[{"nodeType":"YulAssignment","src":"4732:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4741:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"4744:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4737:3:111"},"nodeType":"YulFunctionCall","src":"4737:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"4732:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"4712:3:111","statements":[]},"src":"4708:113:111"},{"body":{"nodeType":"YulBlock","src":"4847:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"4860:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4865:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4856:3:111"},"nodeType":"YulFunctionCall","src":"4856:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"4874:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4849:6:111"},"nodeType":"YulFunctionCall","src":"4849:27:111"},"nodeType":"YulExpressionStatement","src":"4849:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4836:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"4839:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4833:2:111"},"nodeType":"YulFunctionCall","src":"4833:13:111"},"nodeType":"YulIf","src":"4830:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"4657:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"4662:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"4667:6:111","type":""}],"src":"4626:258:111"},{"body":{"nodeType":"YulBlock","src":"4938:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4948:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4968:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4962:5:111"},"nodeType":"YulFunctionCall","src":"4962:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"4952:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4990:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4995:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4983:6:111"},"nodeType":"YulFunctionCall","src":"4983:19:111"},"nodeType":"YulExpressionStatement","src":"4983:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5037:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5044:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5033:3:111"},"nodeType":"YulFunctionCall","src":"5033:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5055:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5060:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5051:3:111"},"nodeType":"YulFunctionCall","src":"5051:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"5067:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"5011:21:111"},"nodeType":"YulFunctionCall","src":"5011:63:111"},"nodeType":"YulExpressionStatement","src":"5011:63:111"},{"nodeType":"YulAssignment","src":"5083:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5098:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5111:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5119:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5107:3:111"},"nodeType":"YulFunctionCall","src":"5107:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5124:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5103:3:111"},"nodeType":"YulFunctionCall","src":"5103:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5094:3:111"},"nodeType":"YulFunctionCall","src":"5094:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"5194:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5090:3:111"},"nodeType":"YulFunctionCall","src":"5090:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"5083:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"4915:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"4922:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"4930:3:111","type":""}],"src":"4889:316:111"},{"body":{"nodeType":"YulBlock","src":"5357:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5374:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5385:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5367:6:111"},"nodeType":"YulFunctionCall","src":"5367:21:111"},"nodeType":"YulExpressionStatement","src":"5367:21:111"},{"nodeType":"YulAssignment","src":"5397:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5422:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5434:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5445:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5430:3:111"},"nodeType":"YulFunctionCall","src":"5430:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"5405:16:111"},"nodeType":"YulFunctionCall","src":"5405:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5397:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5469:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5480:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5465:3:111"},"nodeType":"YulFunctionCall","src":"5465:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"5485:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5458:6:111"},"nodeType":"YulFunctionCall","src":"5458:34:111"},"nodeType":"YulExpressionStatement","src":"5458:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5318:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5329:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5337:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5348:4:111","type":""}],"src":"5210:288:111"},{"body":{"nodeType":"YulBlock","src":"5602:93:111","statements":[{"nodeType":"YulAssignment","src":"5612:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5624:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5635:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5620:3:111"},"nodeType":"YulFunctionCall","src":"5620:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5612:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5654:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5669:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5677:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5665:3:111"},"nodeType":"YulFunctionCall","src":"5665:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5647:6:111"},"nodeType":"YulFunctionCall","src":"5647:42:111"},"nodeType":"YulExpressionStatement","src":"5647:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5571:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5582:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5593:4:111","type":""}],"src":"5503:192:111"},{"body":{"nodeType":"YulBlock","src":"5845:168:111","statements":[{"nodeType":"YulAssignment","src":"5855:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5878:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5863:3:111"},"nodeType":"YulFunctionCall","src":"5863:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5855:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5897:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5912:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5920:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5908:3:111"},"nodeType":"YulFunctionCall","src":"5908:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5890:6:111"},"nodeType":"YulFunctionCall","src":"5890:74:111"},"nodeType":"YulExpressionStatement","src":"5890:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5984:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5995:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5980:3:111"},"nodeType":"YulFunctionCall","src":"5980:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6000:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5973:6:111"},"nodeType":"YulFunctionCall","src":"5973:34:111"},"nodeType":"YulExpressionStatement","src":"5973:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5806:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5817:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5825:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5836:4:111","type":""}],"src":"5700:313:111"},{"body":{"nodeType":"YulBlock","src":"6050:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6067:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6070:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6060:6:111"},"nodeType":"YulFunctionCall","src":"6060:88:111"},"nodeType":"YulExpressionStatement","src":"6060:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6164:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6167:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6157:6:111"},"nodeType":"YulFunctionCall","src":"6157:15:111"},"nodeType":"YulExpressionStatement","src":"6157:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6188:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6191:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6181:6:111"},"nodeType":"YulFunctionCall","src":"6181:15:111"},"nodeType":"YulExpressionStatement","src":"6181:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"6018:184:111"},{"body":{"nodeType":"YulBlock","src":"6255:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"6282:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"6284:16:111"},"nodeType":"YulFunctionCall","src":"6284:18:111"},"nodeType":"YulExpressionStatement","src":"6284:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"6271:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"6278:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"6274:3:111"},"nodeType":"YulFunctionCall","src":"6274:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6268:2:111"},"nodeType":"YulFunctionCall","src":"6268:13:111"},"nodeType":"YulIf","src":"6265:39:111"},{"nodeType":"YulAssignment","src":"6313:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"6324:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"6327:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6320:3:111"},"nodeType":"YulFunctionCall","src":"6320:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"6313:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"6238:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"6241:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"6247:3:111","type":""}],"src":"6207:128:111"},{"body":{"nodeType":"YulBlock","src":"6457:125:111","statements":[{"nodeType":"YulAssignment","src":"6467:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6479:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6490:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6475:3:111"},"nodeType":"YulFunctionCall","src":"6475:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6467:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6509:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6524:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6532:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6520:3:111"},"nodeType":"YulFunctionCall","src":"6520:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6502:6:111"},"nodeType":"YulFunctionCall","src":"6502:74:111"},"nodeType":"YulExpressionStatement","src":"6502:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6426:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6437:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6448:4:111","type":""}],"src":"6340:242:111"},{"body":{"nodeType":"YulBlock","src":"6668:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"6714:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6723:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6726:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6716:6:111"},"nodeType":"YulFunctionCall","src":"6716:12:111"},"nodeType":"YulExpressionStatement","src":"6716:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6689:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6698:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6685:3:111"},"nodeType":"YulFunctionCall","src":"6685:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6710:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6681:3:111"},"nodeType":"YulFunctionCall","src":"6681:32:111"},"nodeType":"YulIf","src":"6678:52:111"},{"nodeType":"YulAssignment","src":"6739:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6755:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6749:5:111"},"nodeType":"YulFunctionCall","src":"6749:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6739:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6634:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6645:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6657:6:111","type":""}],"src":"6587:184:111"},{"body":{"nodeType":"YulBlock","src":"6950:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6967:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6978:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6960:6:111"},"nodeType":"YulFunctionCall","src":"6960:21:111"},"nodeType":"YulExpressionStatement","src":"6960:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7012:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6997:3:111"},"nodeType":"YulFunctionCall","src":"6997:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7017:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6990:6:111"},"nodeType":"YulFunctionCall","src":"6990:30:111"},"nodeType":"YulExpressionStatement","src":"6990:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7040:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7051:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7036:3:111"},"nodeType":"YulFunctionCall","src":"7036:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"7056:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7029:6:111"},"nodeType":"YulFunctionCall","src":"7029:62:111"},"nodeType":"YulExpressionStatement","src":"7029:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7111:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7122:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7107:3:111"},"nodeType":"YulFunctionCall","src":"7107:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"7127:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7100:6:111"},"nodeType":"YulFunctionCall","src":"7100:36:111"},"nodeType":"YulExpressionStatement","src":"7100:36:111"},{"nodeType":"YulAssignment","src":"7145:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7157:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7168:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7153:3:111"},"nodeType":"YulFunctionCall","src":"7153:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7145:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6927:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6941:4:111","type":""}],"src":"6776:402:111"},{"body":{"nodeType":"YulBlock","src":"7357:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7374:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7385:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7367:6:111"},"nodeType":"YulFunctionCall","src":"7367:21:111"},"nodeType":"YulExpressionStatement","src":"7367:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7408:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7419:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7404:3:111"},"nodeType":"YulFunctionCall","src":"7404:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7424:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7397:6:111"},"nodeType":"YulFunctionCall","src":"7397:30:111"},"nodeType":"YulExpressionStatement","src":"7397:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7458:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7443:3:111"},"nodeType":"YulFunctionCall","src":"7443:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"7463:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7436:6:111"},"nodeType":"YulFunctionCall","src":"7436:62:111"},"nodeType":"YulExpressionStatement","src":"7436:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7518:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7529:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7514:3:111"},"nodeType":"YulFunctionCall","src":"7514:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"7534:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7507:6:111"},"nodeType":"YulFunctionCall","src":"7507:39:111"},"nodeType":"YulExpressionStatement","src":"7507:39:111"},{"nodeType":"YulAssignment","src":"7555:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7567:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7578:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7563:3:111"},"nodeType":"YulFunctionCall","src":"7563:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7555:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7334:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7348:4:111","type":""}],"src":"7183:405:111"},{"body":{"nodeType":"YulBlock","src":"7642:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"7664:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7666:16:111"},"nodeType":"YulFunctionCall","src":"7666:18:111"},"nodeType":"YulExpressionStatement","src":"7666:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7658:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7661:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7655:2:111"},"nodeType":"YulFunctionCall","src":"7655:8:111"},"nodeType":"YulIf","src":"7652:34:111"},{"nodeType":"YulAssignment","src":"7695:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7707:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7710:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7703:3:111"},"nodeType":"YulFunctionCall","src":"7703:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"7695:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"7624:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"7627:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"7633:4:111","type":""}],"src":"7593:125:111"},{"body":{"nodeType":"YulBlock","src":"7897:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7914:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7925:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7907:6:111"},"nodeType":"YulFunctionCall","src":"7907:21:111"},"nodeType":"YulExpressionStatement","src":"7907:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7948:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7959:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7944:3:111"},"nodeType":"YulFunctionCall","src":"7944:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7964:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7937:6:111"},"nodeType":"YulFunctionCall","src":"7937:30:111"},"nodeType":"YulExpressionStatement","src":"7937:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7987:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7998:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7983:3:111"},"nodeType":"YulFunctionCall","src":"7983:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"8003:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7976:6:111"},"nodeType":"YulFunctionCall","src":"7976:62:111"},"nodeType":"YulExpressionStatement","src":"7976:62:111"},{"nodeType":"YulAssignment","src":"8047:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8059:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8070:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8055:3:111"},"nodeType":"YulFunctionCall","src":"8055:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8047:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7874:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7888:4:111","type":""}],"src":"7723:356:111"},{"body":{"nodeType":"YulBlock","src":"8241:241:111","statements":[{"nodeType":"YulAssignment","src":"8251:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8263:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8274:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8259:3:111"},"nodeType":"YulFunctionCall","src":"8259:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8251:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"8286:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8296:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8290:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8354:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8369:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8377:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8365:3:111"},"nodeType":"YulFunctionCall","src":"8365:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8347:6:111"},"nodeType":"YulFunctionCall","src":"8347:34:111"},"nodeType":"YulExpressionStatement","src":"8347:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8412:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8397:3:111"},"nodeType":"YulFunctionCall","src":"8397:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"8421:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8429:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8417:3:111"},"nodeType":"YulFunctionCall","src":"8417:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8390:6:111"},"nodeType":"YulFunctionCall","src":"8390:43:111"},"nodeType":"YulExpressionStatement","src":"8390:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8453:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8464:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8449:3:111"},"nodeType":"YulFunctionCall","src":"8449:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"8469:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8442:6:111"},"nodeType":"YulFunctionCall","src":"8442:34:111"},"nodeType":"YulExpressionStatement","src":"8442:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8194:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8205:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8213:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8221:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8232:4:111","type":""}],"src":"8084:398:111"},{"body":{"nodeType":"YulBlock","src":"8661:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8678:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8689:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8671:6:111"},"nodeType":"YulFunctionCall","src":"8671:21:111"},"nodeType":"YulExpressionStatement","src":"8671:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8712:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8723:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8708:3:111"},"nodeType":"YulFunctionCall","src":"8708:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8728:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8701:6:111"},"nodeType":"YulFunctionCall","src":"8701:30:111"},"nodeType":"YulExpressionStatement","src":"8701:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8751:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8762:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8747:3:111"},"nodeType":"YulFunctionCall","src":"8747:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"8767:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8740:6:111"},"nodeType":"YulFunctionCall","src":"8740:51:111"},"nodeType":"YulExpressionStatement","src":"8740:51:111"},{"nodeType":"YulAssignment","src":"8800:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8812:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8823:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8808:3:111"},"nodeType":"YulFunctionCall","src":"8808:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8800:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8638:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8652:4:111","type":""}],"src":"8487:345:111"},{"body":{"nodeType":"YulBlock","src":"8966:339:111","statements":[{"body":{"nodeType":"YulBlock","src":"9013:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9022:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9025:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9015:6:111"},"nodeType":"YulFunctionCall","src":"9015:12:111"},"nodeType":"YulExpressionStatement","src":"9015:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8987:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8996:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8983:3:111"},"nodeType":"YulFunctionCall","src":"8983:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9008:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8979:3:111"},"nodeType":"YulFunctionCall","src":"8979:33:111"},"nodeType":"YulIf","src":"8976:53:111"},{"nodeType":"YulVariableDeclaration","src":"9038:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9064:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9051:12:111"},"nodeType":"YulFunctionCall","src":"9051:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9042:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9116:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"9083:32:111"},"nodeType":"YulFunctionCall","src":"9083:39:111"},"nodeType":"YulExpressionStatement","src":"9083:39:111"},{"nodeType":"YulAssignment","src":"9131:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9141:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9131:6:111"}]},{"nodeType":"YulAssignment","src":"9155:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9182:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9193:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9178:3:111"},"nodeType":"YulFunctionCall","src":"9178:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9165:12:111"},"nodeType":"YulFunctionCall","src":"9165:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9155:6:111"}]},{"nodeType":"YulAssignment","src":"9206:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9233:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9244:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9229:3:111"},"nodeType":"YulFunctionCall","src":"9229:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9216:12:111"},"nodeType":"YulFunctionCall","src":"9216:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9206:6:111"}]},{"nodeType":"YulAssignment","src":"9257:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9284:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9295:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9280:3:111"},"nodeType":"YulFunctionCall","src":"9280:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9267:12:111"},"nodeType":"YulFunctionCall","src":"9267:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9257:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8908:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8919:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8931:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8939:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8947:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8955:6:111","type":""}],"src":"8837:468:111"},{"body":{"nodeType":"YulBlock","src":"9362:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"9481:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9483:16:111"},"nodeType":"YulFunctionCall","src":"9483:18:111"},"nodeType":"YulExpressionStatement","src":"9483:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9393:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9386:6:111"},"nodeType":"YulFunctionCall","src":"9386:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9379:6:111"},"nodeType":"YulFunctionCall","src":"9379:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9401:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9408:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"9476:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"9404:3:111"},"nodeType":"YulFunctionCall","src":"9404:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9398:2:111"},"nodeType":"YulFunctionCall","src":"9398:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9375:3:111"},"nodeType":"YulFunctionCall","src":"9375:105:111"},"nodeType":"YulIf","src":"9372:131:111"},{"nodeType":"YulAssignment","src":"9512:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9527:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9530:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"9523:3:111"},"nodeType":"YulFunctionCall","src":"9523:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"9512:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9341:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9344:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"9350:7:111","type":""}],"src":"9310:228:111"},{"body":{"nodeType":"YulBlock","src":"9589:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"9620:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9641:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9644:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9634:6:111"},"nodeType":"YulFunctionCall","src":"9634:88:111"},"nodeType":"YulExpressionStatement","src":"9634:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9742:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9745:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9735:6:111"},"nodeType":"YulFunctionCall","src":"9735:15:111"},"nodeType":"YulExpressionStatement","src":"9735:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9770:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9773:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9763:6:111"},"nodeType":"YulFunctionCall","src":"9763:15:111"},"nodeType":"YulExpressionStatement","src":"9763:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9609:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9602:6:111"},"nodeType":"YulFunctionCall","src":"9602:9:111"},"nodeType":"YulIf","src":"9599:189:111"},{"nodeType":"YulAssignment","src":"9797:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9806:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9809:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"9802:3:111"},"nodeType":"YulFunctionCall","src":"9802:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"9797:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9574:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9577:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"9583:1:111","type":""}],"src":"9543:274:111"},{"body":{"nodeType":"YulBlock","src":"9854:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9874:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9864:6:111"},"nodeType":"YulFunctionCall","src":"9864:88:111"},"nodeType":"YulExpressionStatement","src":"9864:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9968:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9971:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9961:6:111"},"nodeType":"YulFunctionCall","src":"9961:15:111"},"nodeType":"YulExpressionStatement","src":"9961:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9992:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9995:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9985:6:111"},"nodeType":"YulFunctionCall","src":"9985:15:111"},"nodeType":"YulExpressionStatement","src":"9985:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"9822:184:111"},{"body":{"nodeType":"YulBlock","src":"10185:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10202:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10213:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10195:6:111"},"nodeType":"YulFunctionCall","src":"10195:21:111"},"nodeType":"YulExpressionStatement","src":"10195:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10236:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10247:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10232:3:111"},"nodeType":"YulFunctionCall","src":"10232:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10252:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10225:6:111"},"nodeType":"YulFunctionCall","src":"10225:30:111"},"nodeType":"YulExpressionStatement","src":"10225:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10275:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10286:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10271:3:111"},"nodeType":"YulFunctionCall","src":"10271:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"10291:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10264:6:111"},"nodeType":"YulFunctionCall","src":"10264:62:111"},"nodeType":"YulExpressionStatement","src":"10264:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10346:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10357:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10342:3:111"},"nodeType":"YulFunctionCall","src":"10342:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"10362:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10335:6:111"},"nodeType":"YulFunctionCall","src":"10335:38:111"},"nodeType":"YulExpressionStatement","src":"10335:38:111"},{"nodeType":"YulAssignment","src":"10382:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10394:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10405:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10390:3:111"},"nodeType":"YulFunctionCall","src":"10390:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10382:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10162:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10176:4:111","type":""}],"src":"10011:404:111"},{"body":{"nodeType":"YulBlock","src":"10594:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10611:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10622:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10604:6:111"},"nodeType":"YulFunctionCall","src":"10604:21:111"},"nodeType":"YulExpressionStatement","src":"10604:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10645:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10656:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10641:3:111"},"nodeType":"YulFunctionCall","src":"10641:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10661:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10634:6:111"},"nodeType":"YulFunctionCall","src":"10634:30:111"},"nodeType":"YulExpressionStatement","src":"10634:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10684:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10695:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10680:3:111"},"nodeType":"YulFunctionCall","src":"10680:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"10700:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10673:6:111"},"nodeType":"YulFunctionCall","src":"10673:62:111"},"nodeType":"YulExpressionStatement","src":"10673:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10755:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10766:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10751:3:111"},"nodeType":"YulFunctionCall","src":"10751:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"10771:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10744:6:111"},"nodeType":"YulFunctionCall","src":"10744:34:111"},"nodeType":"YulExpressionStatement","src":"10744:34:111"},{"nodeType":"YulAssignment","src":"10787:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10799:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10810:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10795:3:111"},"nodeType":"YulFunctionCall","src":"10795:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10787:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10571:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10585:4:111","type":""}],"src":"10420:400:111"},{"body":{"nodeType":"YulBlock","src":"10999:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11016:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11027:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11009:6:111"},"nodeType":"YulFunctionCall","src":"11009:21:111"},"nodeType":"YulExpressionStatement","src":"11009:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11050:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11061:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11046:3:111"},"nodeType":"YulFunctionCall","src":"11046:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11066:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11039:6:111"},"nodeType":"YulFunctionCall","src":"11039:30:111"},"nodeType":"YulExpressionStatement","src":"11039:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11089:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11100:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11085:3:111"},"nodeType":"YulFunctionCall","src":"11085:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"11105:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11078:6:111"},"nodeType":"YulFunctionCall","src":"11078:62:111"},"nodeType":"YulExpressionStatement","src":"11078:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11160:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11171:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11156:3:111"},"nodeType":"YulFunctionCall","src":"11156:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"11176:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11149:6:111"},"nodeType":"YulFunctionCall","src":"11149:31:111"},"nodeType":"YulExpressionStatement","src":"11149:31:111"},{"nodeType":"YulAssignment","src":"11189:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11201:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11212:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11197:3:111"},"nodeType":"YulFunctionCall","src":"11197:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11189:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10976:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10990:4:111","type":""}],"src":"10825:397:111"},{"body":{"nodeType":"YulBlock","src":"11412:255:111","statements":[{"nodeType":"YulAssignment","src":"11422:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11434:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11445:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11430:3:111"},"nodeType":"YulFunctionCall","src":"11430:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11422:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11465:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11480:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11488:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11476:3:111"},"nodeType":"YulFunctionCall","src":"11476:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11458:6:111"},"nodeType":"YulFunctionCall","src":"11458:74:111"},"nodeType":"YulExpressionStatement","src":"11458:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11563:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11548:3:111"},"nodeType":"YulFunctionCall","src":"11548:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"11568:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11541:6:111"},"nodeType":"YulFunctionCall","src":"11541:34:111"},"nodeType":"YulExpressionStatement","src":"11541:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11595:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11606:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11591:3:111"},"nodeType":"YulFunctionCall","src":"11591:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"11611:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11584:6:111"},"nodeType":"YulFunctionCall","src":"11584:34:111"},"nodeType":"YulExpressionStatement","src":"11584:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11638:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11649:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11634:3:111"},"nodeType":"YulFunctionCall","src":"11634:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"11654:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11627:6:111"},"nodeType":"YulFunctionCall","src":"11627:34:111"},"nodeType":"YulExpressionStatement","src":"11627:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11357:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11368:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11376:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11384:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11392:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11403:4:111","type":""}],"src":"11227:440:111"},{"body":{"nodeType":"YulBlock","src":"11801:168:111","statements":[{"nodeType":"YulAssignment","src":"11811:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11823:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11834:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11819:3:111"},"nodeType":"YulFunctionCall","src":"11819:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11811:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11853:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11868:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11876:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11864:3:111"},"nodeType":"YulFunctionCall","src":"11864:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11846:6:111"},"nodeType":"YulFunctionCall","src":"11846:74:111"},"nodeType":"YulExpressionStatement","src":"11846:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11940:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11951:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11936:3:111"},"nodeType":"YulFunctionCall","src":"11936:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"11956:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11929:6:111"},"nodeType":"YulFunctionCall","src":"11929:34:111"},"nodeType":"YulExpressionStatement","src":"11929:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11762:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11773:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11781:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11792:4:111","type":""}],"src":"11672:297:111"},{"body":{"nodeType":"YulBlock","src":"12052:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"12098:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12107:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12110:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12100:6:111"},"nodeType":"YulFunctionCall","src":"12100:12:111"},"nodeType":"YulExpressionStatement","src":"12100:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"12073:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"12082:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12069:3:111"},"nodeType":"YulFunctionCall","src":"12069:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"12094:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12065:3:111"},"nodeType":"YulFunctionCall","src":"12065:32:111"},"nodeType":"YulIf","src":"12062:52:111"},{"nodeType":"YulVariableDeclaration","src":"12123:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12142:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12136:5:111"},"nodeType":"YulFunctionCall","src":"12136:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"12127:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12205:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12214:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12217:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12207:6:111"},"nodeType":"YulFunctionCall","src":"12207:12:111"},"nodeType":"YulExpressionStatement","src":"12207:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12174:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12195:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12188:6:111"},"nodeType":"YulFunctionCall","src":"12188:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12181:6:111"},"nodeType":"YulFunctionCall","src":"12181:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"12171:2:111"},"nodeType":"YulFunctionCall","src":"12171:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12164:6:111"},"nodeType":"YulFunctionCall","src":"12164:40:111"},"nodeType":"YulIf","src":"12161:60:111"},{"nodeType":"YulAssignment","src":"12230:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"12240:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"12230:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12018:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"12029:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"12041:6:111","type":""}],"src":"11974:277:111"},{"body":{"nodeType":"YulBlock","src":"12430:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12458:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12440:6:111"},"nodeType":"YulFunctionCall","src":"12440:21:111"},"nodeType":"YulExpressionStatement","src":"12440:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12481:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12492:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12477:3:111"},"nodeType":"YulFunctionCall","src":"12477:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12497:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12470:6:111"},"nodeType":"YulFunctionCall","src":"12470:30:111"},"nodeType":"YulExpressionStatement","src":"12470:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12520:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12531:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12516:3:111"},"nodeType":"YulFunctionCall","src":"12516:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"12536:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12509:6:111"},"nodeType":"YulFunctionCall","src":"12509:62:111"},"nodeType":"YulExpressionStatement","src":"12509:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12591:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12602:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12587:3:111"},"nodeType":"YulFunctionCall","src":"12587:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"12607:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12580:6:111"},"nodeType":"YulFunctionCall","src":"12580:40:111"},"nodeType":"YulExpressionStatement","src":"12580:40:111"},{"nodeType":"YulAssignment","src":"12629:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12652:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12637:3:111"},"nodeType":"YulFunctionCall","src":"12637:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12629:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12407:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12421:4:111","type":""}],"src":"12256:406:111"},{"body":{"nodeType":"YulBlock","src":"12731:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12741:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12756:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"12745:7:111","type":""}]},{"nodeType":"YulAssignment","src":"12766:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"12775:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12766:5:111"}]},{"nodeType":"YulAssignment","src":"12791:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"12799:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"12791:4:111"}]},{"body":{"nodeType":"YulBlock","src":"12855:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"12960:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"12962:16:111"},"nodeType":"YulFunctionCall","src":"12962:18:111"},"nodeType":"YulExpressionStatement","src":"12962:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"12875:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12885:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"12953:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"12881:3:111"},"nodeType":"YulFunctionCall","src":"12881:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12872:2:111"},"nodeType":"YulFunctionCall","src":"12872:87:111"},"nodeType":"YulIf","src":"12869:113:111"},{"body":{"nodeType":"YulBlock","src":"13021:29:111","statements":[{"nodeType":"YulAssignment","src":"13023:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"13036:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"13043:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13032:3:111"},"nodeType":"YulFunctionCall","src":"13032:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13023:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13002:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"13012:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12998:3:111"},"nodeType":"YulFunctionCall","src":"12998:22:111"},"nodeType":"YulIf","src":"12995:55:111"},{"nodeType":"YulAssignment","src":"13063:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13075:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"13081:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13071:3:111"},"nodeType":"YulFunctionCall","src":"13071:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"13063:4:111"}]},{"nodeType":"YulAssignment","src":"13099:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13115:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13124:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"13111:3:111"},"nodeType":"YulFunctionCall","src":"13111:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"13099:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12824:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"12834:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12821:2:111"},"nodeType":"YulFunctionCall","src":"12821:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"12843:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"12817:3:111","statements":[]},"src":"12813:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"12695:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"12702:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"12715:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"12722:4:111","type":""}],"src":"12667:482:111"},{"body":{"nodeType":"YulBlock","src":"13213:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"13251:52:111","statements":[{"nodeType":"YulAssignment","src":"13265:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13274:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13265:5:111"}]},{"nodeType":"YulLeave","src":"13288:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13233:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13226:6:111"},"nodeType":"YulFunctionCall","src":"13226:16:111"},"nodeType":"YulIf","src":"13223:80:111"},{"body":{"nodeType":"YulBlock","src":"13336:52:111","statements":[{"nodeType":"YulAssignment","src":"13350:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13359:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13350:5:111"}]},{"nodeType":"YulLeave","src":"13373:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13322:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13315:6:111"},"nodeType":"YulFunctionCall","src":"13315:12:111"},"nodeType":"YulIf","src":"13312:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"13424:52:111","statements":[{"nodeType":"YulAssignment","src":"13438:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13447:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13438:5:111"}]},{"nodeType":"YulLeave","src":"13461:5:111"}]},"nodeType":"YulCase","src":"13417:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13422:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"13492:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"13527:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13529:16:111"},"nodeType":"YulFunctionCall","src":"13529:18:111"},"nodeType":"YulExpressionStatement","src":"13529:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13512:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13522:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13509:2:111"},"nodeType":"YulFunctionCall","src":"13509:17:111"},"nodeType":"YulIf","src":"13506:43:111"},{"nodeType":"YulAssignment","src":"13562:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13575:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13585:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"13571:3:111"},"nodeType":"YulFunctionCall","src":"13571:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13562:5:111"}]},{"nodeType":"YulLeave","src":"13600:5:111"}]},"nodeType":"YulCase","src":"13485:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13490:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"13404:4:111"},"nodeType":"YulSwitch","src":"13397:218:111"},{"body":{"nodeType":"YulBlock","src":"13713:70:111","statements":[{"nodeType":"YulAssignment","src":"13727:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13740:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13746:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"13736:3:111"},"nodeType":"YulFunctionCall","src":"13736:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13727:5:111"}]},{"nodeType":"YulLeave","src":"13768:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13637:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"13643:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13634:2:111"},"nodeType":"YulFunctionCall","src":"13634:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13651:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13661:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13648:2:111"},"nodeType":"YulFunctionCall","src":"13648:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13630:3:111"},"nodeType":"YulFunctionCall","src":"13630:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13674:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"13680:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13671:2:111"},"nodeType":"YulFunctionCall","src":"13671:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13689:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13699:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13686:2:111"},"nodeType":"YulFunctionCall","src":"13686:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13667:3:111"},"nodeType":"YulFunctionCall","src":"13667:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"13627:2:111"},"nodeType":"YulFunctionCall","src":"13627:77:111"},"nodeType":"YulIf","src":"13624:159:111"},{"nodeType":"YulVariableDeclaration","src":"13792:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13834:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13840:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"13815:18:111"},"nodeType":"YulFunctionCall","src":"13815:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"13796:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"13805:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"13954:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13956:16:111"},"nodeType":"YulFunctionCall","src":"13956:18:111"},"nodeType":"YulExpressionStatement","src":"13956:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13864:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13877:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"13945:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"13873:3:111"},"nodeType":"YulFunctionCall","src":"13873:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13861:2:111"},"nodeType":"YulFunctionCall","src":"13861:92:111"},"nodeType":"YulIf","src":"13858:118:111"},{"nodeType":"YulAssignment","src":"13985:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13998:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"14007:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13994:3:111"},"nodeType":"YulFunctionCall","src":"13994:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13985:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"13184:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"13190:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"13203:5:111","type":""}],"src":"13154:866:111"},{"body":{"nodeType":"YulBlock","src":"14095:61:111","statements":[{"nodeType":"YulAssignment","src":"14105:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14135:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"14141:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"14114:20:111"},"nodeType":"YulFunctionCall","src":"14114:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14105:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"14066:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"14072:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"14085:5:111","type":""}],"src":"14025:131:111"},{"body":{"nodeType":"YulBlock","src":"14208:148:111","statements":[{"nodeType":"YulVariableDeclaration","src":"14218:23:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14233:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"14236:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14229:3:111"},"nodeType":"YulFunctionCall","src":"14229:12:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"14222:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14250:23:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"14265:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"14268:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14261:3:111"},"nodeType":"YulFunctionCall","src":"14261:12:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"14254:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"14298:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14300:16:111"},"nodeType":"YulFunctionCall","src":"14300:18:111"},"nodeType":"YulExpressionStatement","src":"14300:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"14288:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"14293:3:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14285:2:111"},"nodeType":"YulFunctionCall","src":"14285:12:111"},"nodeType":"YulIf","src":"14282:38:111"},{"nodeType":"YulAssignment","src":"14329:21:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"14341:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"14346:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14337:3:111"},"nodeType":"YulFunctionCall","src":"14337:13:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"14329:4:111"}]}]},"name":"checked_sub_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"14190:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"14193:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"14199:4:111","type":""}],"src":"14161:195:111"},{"body":{"nodeType":"YulBlock","src":"14429:72:111","statements":[{"nodeType":"YulAssignment","src":"14439:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14469:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"14479:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14489:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14475:3:111"},"nodeType":"YulFunctionCall","src":"14475:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"14448:20:111"},"nodeType":"YulFunctionCall","src":"14448:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14439:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"14400:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"14406:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"14419:5:111","type":""}],"src":"14361:140:111"},{"body":{"nodeType":"YulBlock","src":"14680:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14697:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14708:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14690:6:111"},"nodeType":"YulFunctionCall","src":"14690:21:111"},"nodeType":"YulExpressionStatement","src":"14690:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14731:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14742:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14727:3:111"},"nodeType":"YulFunctionCall","src":"14727:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14747:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14720:6:111"},"nodeType":"YulFunctionCall","src":"14720:30:111"},"nodeType":"YulExpressionStatement","src":"14720:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14770:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14781:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14766:3:111"},"nodeType":"YulFunctionCall","src":"14766:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"14786:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14759:6:111"},"nodeType":"YulFunctionCall","src":"14759:62:111"},"nodeType":"YulExpressionStatement","src":"14759:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14852:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14837:3:111"},"nodeType":"YulFunctionCall","src":"14837:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"14857:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14830:6:111"},"nodeType":"YulFunctionCall","src":"14830:36:111"},"nodeType":"YulExpressionStatement","src":"14830:36:111"},{"nodeType":"YulAssignment","src":"14875:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14887:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14898:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14883:3:111"},"nodeType":"YulFunctionCall","src":"14883:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14875:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14657:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14671:4:111","type":""}],"src":"14506:402:111"},{"body":{"nodeType":"YulBlock","src":"15050:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15060:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15080:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15074:5:111"},"nodeType":"YulFunctionCall","src":"15074:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15064:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15122:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15130:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15118:3:111"},"nodeType":"YulFunctionCall","src":"15118:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"15137:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15142:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"15096:21:111"},"nodeType":"YulFunctionCall","src":"15096:53:111"},"nodeType":"YulExpressionStatement","src":"15096:53:111"},{"nodeType":"YulAssignment","src":"15158:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15169:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15174:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15165:3:111"},"nodeType":"YulFunctionCall","src":"15165:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"15158:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"15026:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15031:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"15042:3:111","type":""}],"src":"14913:274:111"},{"body":{"nodeType":"YulBlock","src":"15366:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15383:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15394:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15376:6:111"},"nodeType":"YulFunctionCall","src":"15376:21:111"},"nodeType":"YulExpressionStatement","src":"15376:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15417:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15428:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15413:3:111"},"nodeType":"YulFunctionCall","src":"15413:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15433:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15406:6:111"},"nodeType":"YulFunctionCall","src":"15406:30:111"},"nodeType":"YulExpressionStatement","src":"15406:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15456:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15467:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15452:3:111"},"nodeType":"YulFunctionCall","src":"15452:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"15472:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15445:6:111"},"nodeType":"YulFunctionCall","src":"15445:59:111"},"nodeType":"YulExpressionStatement","src":"15445:59:111"},{"nodeType":"YulAssignment","src":"15513:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15525:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15536:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15521:3:111"},"nodeType":"YulFunctionCall","src":"15521:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15513:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15343:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15357:4:111","type":""}],"src":"15192:353:111"},{"body":{"nodeType":"YulBlock","src":"15671:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15688:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15699:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15681:6:111"},"nodeType":"YulFunctionCall","src":"15681:21:111"},"nodeType":"YulExpressionStatement","src":"15681:21:111"},{"nodeType":"YulAssignment","src":"15711:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15736:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15748:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15759:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15744:3:111"},"nodeType":"YulFunctionCall","src":"15744:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"15719:16:111"},"nodeType":"YulFunctionCall","src":"15719:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15711:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15640:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15651:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15662:4:111","type":""}],"src":"15550:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n let x_1 := and(x, 0xff)\n let y_1 := and(y, 0xff)\n if lt(x_1, y_1) { panic_error_0x11() }\n diff := sub(x_1, y_1)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1051},{"length":32,"start":1371},{"length":32,"start":1573},{"length":32,"start":1846},{"length":32,"start":2045},{"length":32,"start":2189},{"length":32,"start":2368},{"length":32,"start":3427}]},"linkReferences":{},"object":"6080604052600436106101805760003560e01c80638da5cb5b116100d6578063c399ec881161007f578063f2fde38b11610059578063f2fde38b146104b1578063f465c77e146104d1578063f5bf3fcf146104ff57600080fd5b8063c399ec8814610472578063cd8f80c214610487578063d0e30db0146104a957600080fd5b8063b0d691fe116100b0578063b0d691fe14610409578063bb9fe6bf1461043d578063c23a5cea1461045257600080fd5b80638da5cb5b1461039a5780639ed0fb68146103c5578063a9a23409146103e957600080fd5b80634a6f84cf116101385780636f6dc5ae116101125780636f6dc5ae14610342578063715018a61461036f578063796d43711461038457600080fd5b80634a6f84cf146102905780634f16bbf3146102bd57806363445989146102dd57600080fd5b8063205c287811610169578063205c2878146101f1578063230388941461021157806327e235e31461025557600080fd5b80630396cb60146101855780630ee0599c1461019a575b600080fd5b61019861019336600461170d565b61051f565b005b3480156101a657600080fd5b506003546101c79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101fd57600080fd5b5061019861020c36600461175c565b6105d1565b34801561021d57600080fd5b506003546102439074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101e8565b34801561026157600080fd5b50610282610270366004611788565b60016020526000908152604090205481565b6040519081526020016101e8565b34801561029c57600080fd5b506102826102ab366004611788565b60026020526000908152604090205481565b3480156102c957600080fd5b506101986102d836600461175c565b610669565b3480156102e957600080fd5b5061032d6102f8366004611788565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160209081526040808320546002909252909120549091565b604080519283526020830191909152016101e8565b34801561034e57600080fd5b506004546101c79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037b57600080fd5b506101986106fe565b34801561039057600080fd5b506102826188b881565b3480156103a657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101c7565b3480156103d157600080fd5b50610198336000908152600260205260409020439055565b3480156103f557600080fd5b506101986104043660046117a5565b610712565b34801561041557600080fd5b506101c77f000000000000000000000000000000000000000000000000000000000000000081565b34801561044957600080fd5b5061019861072c565b34801561045e57600080fd5b5061019861046d366004611788565b6107b0565b34801561047e57600080fd5b5061028261085c565b34801561049357600080fd5b5061019833600090815260026020526040812055565b610198610912565b3480156104bd57600080fd5b506101986104cc366004611788565b61099a565b3480156104dd57600080fd5b506104f16104ec366004611834565b610a56565b6040516101e89291906118fe565b34801561050b57600080fd5b5061019861051a36600461175c565b610a79565b610527610b79565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105b557600080fd5b505af11580156105c9573d6000803e3d6000fd5b505050505050565b6105d9610b79565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105b557600080fd5b60035461068e9073ffffffffffffffffffffffffffffffffffffffff16333084610bfa565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906106c390849061194f565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036106fa576106fa33600090815260026020526040812055565b5050565b610706610b79565b6107106000610cd6565b565b61071a610d4b565b61072684848484610dea565b50505050565b610734610b79565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561079c57600080fd5b505af1158015610726573d6000803e3d6000fd5b6107b8610b79565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561084157600080fd5b505af1158015610855573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090d9190611967565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561084157600080fd5b6109a2610b79565b73ffffffffffffffffffffffffffffffffffffffff8116610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610a5381610cd6565b50565b60606000610a62610d4b565b610a6d858585610f30565b91509150935093915050565b3360009081526002602052604090205415801590610aa557503360009081526002602052604090205443115b610b31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610a41565b3360009081526001602052604081208054839290610b50908490611980565b90915550506003546106fa9073ffffffffffffffffffffffffffffffffffffffff1683836111c1565b60005473ffffffffffffffffffffffffffffffffffffffff163314610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a41565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107269085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261121c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610a41565b6000808080610dfb86880188611997565b935093509350935060008183856188b8610e1591906119d2565b610e1f908961194f565b610e2991906119d2565b610e339190611a0f565b90506002896002811115610e4957610e49611a4a565b14610e7857600354610e739073ffffffffffffffffffffffffffffffffffffffff16863084610bfa565b610eb3565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054839290610ead908490611980565b90915550505b8060016000610ed760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f20919061194f565b9091555050505050505050505050565b606060006188b88560a0013511610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610a41565b84356000610fd685611328565b90506000610fe3886114bd565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205490915015611098576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610a41565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205482111561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a41565b6040805173ffffffffffffffffffffffffffffffffffffffff85166020820152908101829052606081018390526080810187905260a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298600098509650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112179084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610c54565b505050565b600061127e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114ec9092919063ffffffff16565b805190915015611217578080602001905181019061129c9190611a79565b611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a41565b60048054604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600093849373ffffffffffffffffffffffffffffffffffffffff169263313ce56792818301926020928290030181865afa158015611397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bb9190611967565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630aa2f4206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190611967565b9050600061145f83600a611bbb565b61146983876119d2565b6114739190611a0f565b60035490915061149f9074010000000000000000000000000000000000000000900460ff166012611bc7565b6114aa90600a611bea565b6114b49082611a0f565b95945050505050565b600060e08201356101008301358082036114d8575092915050565b6114e4824883016114fb565b949350505050565b60606114e48484600085611515565b600081831061150a578161150c565b825b90505b92915050565b6060824710156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a41565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115d09190611bf9565b60006040518083038185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b50915091506116238783838761162e565b979650505050505050565b606083156116c45782516000036116bd5773ffffffffffffffffffffffffffffffffffffffff85163b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a41565b50816114e4565b6114e483838151156116d95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a419190611c15565b60006020828403121561171f57600080fd5b813563ffffffff8116811461173357600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a5357600080fd5b6000806040838503121561176f57600080fd5b823561177a8161173a565b946020939093013593505050565b60006020828403121561179a57600080fd5b81356117338161173a565b600080600080606085870312156117bb57600080fd5b8435600381106117ca57600080fd5b9350602085013567ffffffffffffffff808211156117e757600080fd5b818701915087601f8301126117fb57600080fd5b81358181111561180a57600080fd5b88602082850101111561181c57600080fd5b95986020929092019750949560400135945092505050565b60008060006060848603121561184957600080fd5b833567ffffffffffffffff81111561186057600080fd5b8401610160818703121561187357600080fd5b95602085013595506040909401359392505050565b60005b838110156118a357818101518382015260200161188b565b838111156107265750506000910152565b600081518084526118cc816020860160208601611888565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061191160408301856118b4565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561196257611962611920565b500190565b60006020828403121561197957600080fd5b5051919050565b60008282101561199257611992611920565b500390565b600080600080608085870312156119ad57600080fd5b84356119b88161173a565b966020860135965060408601359560600135945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a0a57611a0a611920565b500290565b600082611a45577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215611a8b57600080fd5b8151801515811461173357600080fd5b600181815b80851115611af457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ada57611ada611920565b80851615611ae757918102915b93841c9390800290611aa0565b509250929050565b600082611b0b5750600161150f565b81611b185750600061150f565b8160018114611b2e5760028114611b3857611b54565b600191505061150f565b60ff841115611b4957611b49611920565b50506001821b61150f565b5060208310610133831016604e8410600b8410161715611b77575081810a61150f565b611b818383611a9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611bb357611bb3611920565b029392505050565b600061150c8383611afc565b600060ff821660ff841680821015611be157611be1611920565b90039392505050565b600061150c60ff841683611afc565b60008251611c0b818460208701611888565b9190910192915050565b60208152600061150c60208301846118b456fea2646970667358221220dd161eab57414807151bab12f7bdc160d7655015a2a5f235cd5c41e4c876dc7e64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x180 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4D1 JUMPI DUP1 PUSH4 0xF5BF3FCF EQ PUSH2 0x4FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x43D JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x39A JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3C5 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x6F6DC5AE GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x6F6DC5AE EQ PUSH2 0x342 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x290 JUMPI DUP1 PUSH4 0x4F16BBF3 EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0x63445989 EQ PUSH2 0x2DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x23038894 EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0xEE0599C EQ PUSH2 0x19A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x198 PUSH2 0x193 CALLDATASIZE PUSH1 0x4 PUSH2 0x170D JUMP JUMPDEST PUSH2 0x51F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x1C7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x5D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x243 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x270 CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x2AB CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x2D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x669 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32D PUSH2 0x2F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x1C7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x6FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x17A5 JUMP JUMPDEST PUSH2 0x712 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C7 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x449 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x72C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x45E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x46D CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x7B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x282 PUSH2 0x85C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x198 PUSH2 0x912 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x4CC CALLDATASIZE PUSH1 0x4 PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x99A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4F1 PUSH2 0x4EC CALLDATASIZE PUSH1 0x4 PUSH2 0x1834 JUMP JUMPDEST PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP3 SWAP2 SWAP1 PUSH2 0x18FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x198 PUSH2 0x51A CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x527 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5C9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5D9 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x68E SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER ADDRESS DUP5 PUSH2 0xBFA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x6C3 SWAP1 DUP5 SWAP1 PUSH2 0x194F JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x6FA JUMPI PUSH2 0x6FA CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x706 PUSH2 0xB79 JUMP JUMPDEST PUSH2 0x710 PUSH1 0x0 PUSH2 0xCD6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x71A PUSH2 0xD4B JUMP JUMPDEST PUSH2 0x726 DUP5 DUP5 DUP5 DUP5 PUSH2 0xDEA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x734 PUSH2 0xB79 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x79C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x726 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x7B8 PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x841 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x855 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x90D SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x841 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9A2 PUSH2 0xB79 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xA4A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA53 DUP2 PUSH2 0xCD6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xA62 PUSH2 0xD4B JUMP JUMPDEST PUSH2 0xA6D DUP6 DUP6 DUP6 PUSH2 0xF30 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAA5 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xB31 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB50 SWAP1 DUP5 SWAP1 PUSH2 0x1980 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 SLOAD PUSH2 0x6FA SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH2 0x11C1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x710 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x726 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x121C JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x710 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xDFB DUP7 DUP9 ADD DUP9 PUSH2 0x1997 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xE15 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0xE1F SWAP1 DUP10 PUSH2 0x194F JUMP JUMPDEST PUSH2 0xE29 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0xE33 SWAP2 SWAP1 PUSH2 0x1A0F JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xE49 JUMPI PUSH2 0xE49 PUSH2 0x1A4A JUMP JUMPDEST EQ PUSH2 0xE78 JUMPI PUSH1 0x3 SLOAD PUSH2 0xE73 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 ADDRESS DUP5 PUSH2 0xBFA JUMP JUMPDEST PUSH2 0xEB3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xEAD SWAP1 DUP5 SWAP1 PUSH2 0x1980 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0xED7 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xF20 SWAP2 SWAP1 PUSH2 0x194F JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0xFC9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH1 0x0 PUSH2 0xFD6 DUP6 PUSH2 0x1328 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xFE3 DUP9 PUSH2 0x14BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1098 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x114D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP9 PUSH1 0x0 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x1217 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xC54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14EC SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1217 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x129C SWAP2 SWAP1 PUSH2 0x1A79 JUMP JUMPDEST PUSH2 0x1217 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 PUSH4 0x313CE567 SWAP3 DUP2 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1397 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13BB SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAA2F420 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x142C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1450 SWAP2 SWAP1 PUSH2 0x1967 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x145F DUP4 PUSH1 0xA PUSH2 0x1BBB JUMP JUMPDEST PUSH2 0x1469 DUP4 DUP8 PUSH2 0x19D2 JUMP JUMPDEST PUSH2 0x1473 SWAP2 SWAP1 PUSH2 0x1A0F JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 SWAP2 POP PUSH2 0x149F SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x1BC7 JUMP JUMPDEST PUSH2 0x14AA SWAP1 PUSH1 0xA PUSH2 0x1BEA JUMP JUMPDEST PUSH2 0x14B4 SWAP1 DUP3 PUSH2 0x1A0F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x14D8 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x14E4 DUP3 BASEFEE DUP4 ADD PUSH2 0x14FB JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x14E4 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1515 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x150A JUMPI DUP2 PUSH2 0x150C JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x15A7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA41 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x15D0 SWAP2 SWAP1 PUSH2 0x1BF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x160D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1612 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1623 DUP8 DUP4 DUP4 DUP8 PUSH2 0x162E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16C4 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x16BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x16BD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA41 JUMP JUMPDEST POP DUP2 PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x14E4 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x16D9 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA41 SWAP2 SWAP1 PUSH2 0x1C15 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x171F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xA53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x176F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x177A DUP2 PUSH2 0x173A JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x179A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1733 DUP2 PUSH2 0x173A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x17FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x180A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x181C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1849 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1873 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x188B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x726 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x18CC DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1888 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1911 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x18B4 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1962 JUMPI PUSH2 0x1962 PUSH2 0x1920 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1979 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1992 JUMPI PUSH2 0x1992 PUSH2 0x1920 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x19B8 DUP2 PUSH2 0x173A JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1A0A JUMPI PUSH2 0x1A0A PUSH2 0x1920 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A45 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1AF4 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1ADA JUMPI PUSH2 0x1ADA PUSH2 0x1920 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1AE7 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1AA0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B0B JUMPI POP PUSH1 0x1 PUSH2 0x150F JUMP JUMPDEST DUP2 PUSH2 0x1B18 JUMPI POP PUSH1 0x0 PUSH2 0x150F JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1B2E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1B38 JUMPI PUSH2 0x1B54 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x150F JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1B49 JUMPI PUSH2 0x1B49 PUSH2 0x1920 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x150F JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1B77 JUMPI POP DUP2 DUP2 EXP PUSH2 0x150F JUMP JUMPDEST PUSH2 0x1B81 DUP4 DUP4 PUSH2 0x1A9B JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1BB3 JUMPI PUSH2 0x1BB3 PUSH2 0x1920 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x150C DUP4 DUP4 PUSH2 0x1AFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x1BE1 JUMPI PUSH2 0x1BE1 PUSH2 0x1920 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x150C PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1AFC JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C0B DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1888 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x150C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x18B4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD AND 0x1E 0xAB JUMPI COINBASE BASEFEE SMOD ISZERO SHL 0xAB SLT 0xF7 0xBD 0xC1 PUSH1 0xD7 PUSH6 0x5015A2A5F235 0xCD 0x5C COINBASE 0xE4 0xC8 PUSH23 0xDC7E64736F6C634300080F003300000000000000000000 ","sourceMap":"483:6018:68:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;804:28:68;;;;;;;;;;-1:-1:-1;804:28:68;;;;;;;;;;;486:42:111;474:55;;;456:74;;444:2;429:18;804:28:68;;;;;;;;2721:149:52;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;838:35:68:-;;;;;;;;;;-1:-1:-1;838:35:68;;;;;;;;;;;;;;1216:4:111;1204:17;;;1186:36;;1174:2;1159:18;838:35:68;1044:184:111;702:43:68;;;;;;;;;;-1:-1:-1;702:43:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1639:25:111;;;1627:2;1612:18;702:43:68;1493:177:111;751:46:68;;;;;;;;;;-1:-1:-1;751:46:68;;;;;:::i;:::-;;;;;;;;;;;;;;1844:320;;;;;;;;;;-1:-1:-1;1844:320:68;;;;;:::i;:::-;;:::i;2350:185::-;;;;;;;;;;-1:-1:-1;2350:185:68;;;;;:::i;:::-;2466:17;;2409:14;2466:17;;;:8;:17;;;;;;;;;2508:11;:20;;;;;;;2466:17;;2350:185;;;;;2177:25:111;;;2233:2;2218:18;;2211:34;;;;2150:18;2350:185:68;2003:248:111;879:41:68;;;;;;;;;;-1:-1:-1;879:41:68;;;;;;;;1831:101:24;;;;;;;;;;;;;:::i;651:44:68:-;;;;;;;;;;;;690:5;651:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;2666:92:68;;;;;;;;;;;;2725:10;2713:23;;;;:11;:23;;;;;2739:12;2713:38;;2666:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;2975:79:68:-;;;;;;;;;;;;3032:10;3046:1;3020:23;;;:11;:23;;;;;:27;2975:79;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3252:299:68:-;;;;;;;;;;-1:-1:-1;3252:299:68;;;;;:::i;:::-;;:::i;3094:141:52:-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;5677:10:111;5665:23;;3173:55:52::1;::::0;::::1;5647:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;5620:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;5908:55:111::0;;;2817:46:52::1;::::0;::::1;5890:74:111::0;5980:18;;;5973:34;;;2817:10:52::1;:21;::::0;::::1;::::0;5863:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1844:320:68::0;1975:14;;:66;;:14;;2007:10;2027:4;2034:6;1975:31;:66::i;:::-;2051:17;;;;;;;:8;:17;;;;;:27;;2072:6;;2051:17;:27;;2072:6;;2051:27;:::i;:::-;;;;-1:-1:-1;;2092:21:68;;;:10;:21;2088:70;;2129:18;3032:10;3046:1;3020:23;;;:11;:23;;;;;:27;2975:79;2129:18;1844:320;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;474:55:111::0;;;3975:41:52::1;::::0;::::1;456:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;429:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;456:74:111;3361:7:52;;3387:10;:20;;;;;429:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;456:74:111;2518:10:52;:20;;;;;2547:9;;429:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;6978:2:111;2161:73:24::1;::::0;::::1;6960:21:111::0;7017:2;6997:18;;;6990:30;7056:34;7036:18;;;7029:62;7127:8;7107:18;;;7100:36;7153:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;3252:299:68:-;3347:10;3335:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;3394:10:68;3382:23;;;;:11;:23;;;;;;3367:12;:38;3335:70;3327:124;;;;;;;7385:2:111;3327:124:68;;;7367:21:111;7424:2;7404:18;;;7397:30;7463:34;7443:18;;;7436:62;7534:11;7514:18;;;7507:39;7563:19;;3327:124:68;7183:405:111;3327:124:68;3470:10;3461:20;;;;:8;:20;;;;;:30;;3485:6;;3461:20;:30;;3485:6;;3461:30;:::i;:::-;;;;-1:-1:-1;;3501:14:68;;:43;;:14;;3529:6;3537;3501:27;:43::i;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;7925:2:111;1414:68:24;;;7907:21:111;;;7944:18;;;7937:30;8003:34;7983:18;;;7976:62;8055:18;;1414:68:24;7723:356:111;974:241:39;1139:68;;8296:42:111;8365:15;;;1139:68:39;;;8347:34:111;8417:15;;8397:18;;;8390:43;8449:18;;;8442:34;;;1112:96:39;;1132:5;;1162:27;;8259:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;2433:187:24:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;8689:2:111;4148:67:52;;;8671:21:111;8728:2;8708:18;;;8701:30;8767:23;8747:18;;;8740:51;8808:18;;4148:67:52;8487:345:111;5707:792:68;5818:15;;;;5900:57;;;;5911:7;5900:57;:::i;:::-;5817:140;;;;;;;;6026:23;6117:7;6102:12;6084:14;690:5;6069:29;;;;:::i;:::-;6053:45;;:13;:45;:::i;:::-;6052:62;;;;:::i;:::-;:72;;;;:::i;:::-;6026:98;-1:-1:-1;6146:25:68;6138:4;:33;;;;;;;;:::i;:::-;;6134:313;;6230:14;;:72;;:14;;6262:7;6279:4;6286:15;6230:31;:72::i;:::-;6134:313;;;6400:17;;;;;;;:8;:17;;;;;:36;;6421:15;;6400:17;:36;;6421:15;;6400:36;:::i;:::-;;;;-1:-1:-1;;6134:313:68;6477:15;6456:8;:17;6465:7;1247::24;1273:6;;;;1201:85;6465:7:68;6456:17;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;5707:792:68:o;4463:833::-;4601:20;4623:22;690:5;4791:6;:27;;;:42;4783:95;;;;;;;10213:2:111;4783:95:68;;;10195:21:111;10252:2;10232:18;;;10225:30;10291:34;10271:18;;;10264:62;10362:10;10342:18;;;10335:38;10390:19;;4783:95:68;10011:404:111;4783:95:68;1889:20:64;;4889:15:68;4958:27;4977:7;4958:18;:27::i;:::-;4935:50;;4995:22;5020:17;:6;:15;:17::i;:::-;5055:20;;;;;;;:11;:20;;;;;;4995:42;;-1:-1:-1;5055:25:68;5047:74;;;;;;;10622:2:111;5047:74:68;;;10604:21:111;10661:2;10641:18;;;10634:30;10700:34;10680:18;;;10673:62;10771:6;10751:18;;;10744:34;10795:19;;5047:74:68;10420:400:111;5047:74:68;5139:17;;;;;;;:8;:17;;;;;;:33;-1:-1:-1;5139:33:68;5131:79;;;;;;;11027:2:111;5131:79:68;;;11009:21:111;11066:2;11046:18;;;11039:30;11105:34;11085:18;;;11078:62;11176:3;11156:18;;;11149:31;11197:19;;5131:79:68;10825:397:111;5131:79:68;5228:58;;;11488:42:111;11476:55;;5228:58:68;;;11458:74:111;11548:18;;;11541:34;;;11591:18;;;11584:34;;;11634:18;;;11627:34;;;11430:19;;5228:58:68;;;;;;;;;;;;;;5287:1;;-1:-1:-1;4463:833:68;-1:-1:-1;;;;;;;4463:833:68:o;763:205:39:-;902:58;;5920:42:111;5908:55;;902:58:39;;;5890:74:111;5980:18;;;5973:34;;;875:86:39;;895:5;;925:23;;5863:18:111;;902:58:39;5700:313:111;875:86:39;763:205;;;:::o;3747:706::-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;12458:2:111;4351:85:39;;;12440:21:111;12497:2;12477:18;;;12470:30;12536:34;12516:18;;;12509:62;12607:12;12587:18;;;12580:40;12637:19;;4351:85:39;12256:406:111;3776:388:68;3917:14;;;:25;;;;;;;;3854:22;;;;3917:14;;;:23;;:25;;;;;;;;;;;:14;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3888:54;;3952:18;3973:14;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3952:48;-1:-1:-1;4010:22:68;4063;4067:18;4063:2;:22;:::i;:::-;4036;4048:10;4036:9;:22;:::i;:::-;4035:51;;;;:::i;:::-;4132:22;;4010:76;;-1:-1:-1;4127:27:68;;4132:22;;;;;4127:2;:27;:::i;:::-;4122:33;;:2;:33;:::i;:::-;4104:52;;:14;:52;:::i;:::-;4096:61;3776:388;-1:-1:-1;;;;;3776:388:68:o;2095:472:64:-;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;:::-;2492:62;2095:472;-1:-1:-1;;;;2095:472:64:o;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;3743:1;3735:13;3728:20;;3651:104;;;;;:::o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;;;;14708:2:111;5149:81:42;;;14690:21:111;14747:2;14727:18;;;14720:30;14786:34;14766:18;;;14759:62;14857:8;14837:18;;;14830:36;14883:19;;5149:81:42;14506:402:111;5149:81:42;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;;;;15394:2:111;7908:60:42;;;15376:21:111;15433:2;15413:18;;;15406:30;15472:31;15452:18;;;15445:59;15521:18;;7908:60:42;15192:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;541:162::-;635:42;628:5;624:54;617:5;614:65;604:93;;693:1;690;683:12;708:331;784:6;792;845:2;833:9;824:7;820:23;816:32;813:52;;;861:1;858;851:12;813:52;900:9;887:23;919:39;952:5;919:39;:::i;:::-;977:5;1029:2;1014:18;;;;1001:32;;-1:-1:-1;;;708:331:111:o;1233:255::-;1292:6;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:39;1452:5;1419:39;:::i;2747:819::-;2851:6;2859;2867;2875;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2983:9;2970:23;3022:1;3015:5;3012:12;3002:40;;3038:1;3035;3028:12;3002:40;3061:5;-1:-1:-1;3117:2:111;3102:18;;3089:32;3140:18;3170:14;;;3167:34;;;3197:1;3194;3187:12;3167:34;3235:6;3224:9;3220:22;3210:32;;3280:7;3273:4;3269:2;3265:13;3261:27;3251:55;;3302:1;3299;3292:12;3251:55;3342:2;3329:16;3368:2;3360:6;3357:14;3354:34;;;3384:1;3381;3374:12;3354:34;3429:7;3424:2;3415:6;3411:2;3407:15;3403:24;3400:37;3397:57;;;3450:1;3447;3440:12;3397:57;2747:819;;3481:2;3473:11;;;;;-1:-1:-1;3503:6:111;;3556:2;3541:18;3528:32;;-1:-1:-1;2747:819:111;-1:-1:-1;;;2747:819:111:o;4091:530::-;4202:6;4210;4218;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4327:9;4314:23;4360:18;4352:6;4349:30;4346:50;;;4392:1;4389;4382:12;4346:50;4415:22;;4471:3;4453:16;;;4449:26;4446:46;;;4488:1;4485;4478:12;4446:46;4511:2;4560;4545:18;;4532:32;;-1:-1:-1;4611:2:111;4596:18;;;4583:32;;4091:530;-1:-1:-1;;;4091:530:111:o;4626:258::-;4698:1;4708:113;4722:6;4719:1;4716:13;4708:113;;;4798:11;;;4792:18;4779:11;;;4772:39;4744:2;4737:10;4708:113;;;4839:6;4836:1;4833:13;4830:48;;;-1:-1:-1;;4874:1:111;4856:16;;4849:27;4626:258::o;4889:316::-;4930:3;4968:5;4962:12;4995:6;4990:3;4983:19;5011:63;5067:6;5060:4;5055:3;5051:14;5044:4;5037:5;5033:16;5011:63;:::i;:::-;5119:2;5107:15;5124:66;5103:88;5094:98;;;;5194:4;5090:109;;4889:316;-1:-1:-1;;4889:316:111:o;5210:288::-;5385:2;5374:9;5367:21;5348:4;5405:44;5445:2;5434:9;5430:18;5422:6;5405:44;:::i;:::-;5397:52;;5485:6;5480:2;5469:9;5465:18;5458:34;5210:288;;;;;:::o;6018:184::-;6070:77;6067:1;6060:88;6167:4;6164:1;6157:15;6191:4;6188:1;6181:15;6207:128;6247:3;6278:1;6274:6;6271:1;6268:13;6265:39;;;6284:18;;:::i;:::-;-1:-1:-1;6320:9:111;;6207:128::o;6587:184::-;6657:6;6710:2;6698:9;6689:7;6685:23;6681:32;6678:52;;;6726:1;6723;6716:12;6678:52;-1:-1:-1;6749:16:111;;6587:184;-1:-1:-1;6587:184:111:o;7593:125::-;7633:4;7661:1;7658;7655:8;7652:34;;;7666:18;;:::i;:::-;-1:-1:-1;7703:9:111;;7593:125::o;8837:468::-;8931:6;8939;8947;8955;9008:3;8996:9;8987:7;8983:23;8979:33;8976:53;;;9025:1;9022;9015:12;8976:53;9064:9;9051:23;9083:39;9116:5;9083:39;:::i;:::-;9141:5;9193:2;9178:18;;9165:32;;-1:-1:-1;9244:2:111;9229:18;;9216:32;;9295:2;9280:18;9267:32;;-1:-1:-1;8837:468:111;-1:-1:-1;;;8837:468:111:o;9310:228::-;9350:7;9476:1;9408:66;9404:74;9401:1;9398:81;9393:1;9386:9;9379:17;9375:105;9372:131;;;9483:18;;:::i;:::-;-1:-1:-1;9523:9:111;;9310:228::o;9543:274::-;9583:1;9609;9599:189;;9644:77;9641:1;9634:88;9745:4;9742:1;9735:15;9773:4;9770:1;9763:15;9599:189;-1:-1:-1;9802:9:111;;9543:274::o;9822:184::-;9874:77;9871:1;9864:88;9971:4;9968:1;9961:15;9995:4;9992:1;9985:15;11974:277;12041:6;12094:2;12082:9;12073:7;12069:23;12065:32;12062:52;;;12110:1;12107;12100:12;12062:52;12142:9;12136:16;12195:5;12188:13;12181:21;12174:5;12171:32;12161:60;;12217:1;12214;12207:12;12667:482;12756:1;12799:5;12756:1;12813:330;12834:7;12824:8;12821:21;12813:330;;;12953:4;12885:66;12881:77;12875:4;12872:87;12869:113;;;12962:18;;:::i;:::-;13012:7;13002:8;12998:22;12995:55;;;13032:16;;;;12995:55;13111:22;;;;13071:15;;;;12813:330;;;12817:3;12667:482;;;;;:::o;13154:866::-;13203:5;13233:8;13223:80;;-1:-1:-1;13274:1:111;13288:5;;13223:80;13322:4;13312:76;;-1:-1:-1;13359:1:111;13373:5;;13312:76;13404:4;13422:1;13417:59;;;;13490:1;13485:130;;;;13397:218;;13417:59;13447:1;13438:10;;13461:5;;;13485:130;13522:3;13512:8;13509:17;13506:43;;;13529:18;;:::i;:::-;-1:-1:-1;;13585:1:111;13571:16;;13600:5;;13397:218;;13699:2;13689:8;13686:16;13680:3;13674:4;13671:13;13667:36;13661:2;13651:8;13648:16;13643:2;13637:4;13634:12;13630:35;13627:77;13624:159;;;-1:-1:-1;13736:19:111;;;13768:5;;13624:159;13815:34;13840:8;13834:4;13815:34;:::i;:::-;13945:6;13877:66;13873:79;13864:7;13861:92;13858:118;;;13956:18;;:::i;:::-;13994:20;;13154:866;-1:-1:-1;;;13154:866:111:o;14025:131::-;14085:5;14114:36;14141:8;14135:4;14114:36;:::i;14161:195::-;14199:4;14236;14233:1;14229:12;14268:4;14265:1;14261:12;14293:3;14288;14285:12;14282:38;;;14300:18;;:::i;:::-;14337:13;;;14161:195;-1:-1:-1;;;14161:195:111:o;14361:140::-;14419:5;14448:47;14489:4;14479:8;14475:19;14469:4;14448:47;:::i;14913:274::-;15042:3;15080:6;15074:13;15096:53;15142:6;15137:3;15130:4;15122:6;15118:17;15096:53;:::i;:::-;15165:16;;;;;14913:274;-1:-1:-1;;14913:274:111:o;15550:219::-;15699:2;15688:9;15681:21;15662:4;15719:44;15759:2;15748:9;15744:18;15736:6;15719:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1452400","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"284","addDepositFor(address,uint256)":"infinite","addStake(uint32)":"infinite","balances(address)":"2591","deposit()":"infinite","depositInfo(address)":"4793","entryPoint()":"infinite","gasPriceOracle()":"2347","getDeposit()":"infinite","lockTokenDeposit()":"5270","owner()":"2342","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","supportedToken()":"2371","supportedTokenDecimals()":"2392","transferOwnership(address)":"infinite","unlockBlock(address)":"2547","unlockStake()":"infinite","unlockTokenDeposit()":"22376","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,uint256)":"infinite"},"internal":{"_postOp(enum IPaymaster.PostOpMode,bytes calldata,uint256)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","getTokenValueOfEth(uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addDepositFor(address,uint256)":"4f16bbf3","addStake(uint32)":"0396cb60","balances(address)":"27e235e3","deposit()":"d0e30db0","depositInfo(address)":"63445989","entryPoint()":"b0d691fe","gasPriceOracle()":"6f6dc5ae","getDeposit()":"c399ec88","lockTokenDeposit()":"cd8f80c2","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","supportedToken()":"0ee0599c","supportedTokenDecimals()":"23038894","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,uint256)":"f5bf3fcf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_supportedToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_supportedTokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"_gasPriceOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPriceOracle\",\"outputs\":[{\"internalType\":\"contract IBobaGasPriceOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supportedToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supportedTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"notice\":\"Intended to be used for Boba Alt-L1 deployments This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the secondary (or native token)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/GPODepositPaymaster.sol\":\"GPODepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/GPODepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IBobaGasPriceOracle.sol\\\";\\n\\n/**\\n * Intended to be used for Boba Alt-L1 deployments\\n * This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the\\n * secondary (or native token)\\n */\\ncontract GPODepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n\\n mapping(address => uint256) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n IERC20 public supportedToken;\\n uint8 public supportedTokenDecimals;\\n IBobaGasPriceOracle public gasPriceOracle;\\n\\n constructor(IEntryPoint _entryPoint, address _supportedToken, uint8 _supportedTokenDecimals, address _gasPriceOracle) BasePaymaster(_entryPoint) {\\n supportedToken = IERC20(_supportedToken);\\n supportedTokenDecimals = _supportedTokenDecimals;\\n gasPriceOracle = IBobaGasPriceOracle(_gasPriceOracle);\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n supportedToken.safeTransferFrom(msg.sender, address(this), amount);\\n balances[account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[msg.sender] -= amount;\\n supportedToken.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n uint256 priceRatioDecimals = gasPriceOracle.decimals();\\n uint256 priceRatio = gasPriceOracle.priceRatio();\\n uint256 requiredAmount = (ethBought * priceRatio) / (10**priceRatioDecimals);\\n return (requiredAmount / (10**(18 - supportedTokenDecimals)));\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n supportedToken.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[account] -= actualTokenCost;\\n }\\n balances[owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x917f79b0177dd77c3f4e53e67d134abdfbbf48d7a36ab2905cf1847928c16bb2\",\"license\":\"GPL-3.0\"},\"contracts/samples/IBobaGasPriceOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaGasPriceOracle {\\n function decimals() external view returns (uint256);\\n\\n function priceRatio() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe27046c185bf441cde5a28fe070bf0957322bd882aab30a9646994e0346bbaf8\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":12687,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"balances","offset":0,"slot":"1","type":"t_mapping(t_address,t_uint256)"},{"astId":12691,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"unlockBlock","offset":0,"slot":"2","type":"t_mapping(t_address,t_uint256)"},{"astId":12694,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"supportedToken","offset":0,"slot":"3","type":"t_contract(IERC20)4419"},{"astId":12696,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"supportedTokenDecimals","offset":20,"slot":"3","type":"t_uint8"},{"astId":12699,"contract":"contracts/samples/GPODepositPaymaster.sol:GPODepositPaymaster","label":"gasPriceOracle","offset":0,"slot":"4","type":"t_contract(IBobaGasPriceOracle)13071"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IBobaGasPriceOracle)13071":{"encoding":"inplace","label":"contract IBobaGasPriceOracle","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"notice":"Intended to be used for Boba Alt-L1 deployments This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the secondary (or native token)","version":1}}},"contracts/samples/IBobaGasPriceOracle.sol":{"IBobaGasPriceOracle":{"abi":[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decimals()":"313ce567","priceRatio()":"0aa2f420"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/IBobaGasPriceOracle.sol\":\"IBobaGasPriceOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IBobaGasPriceOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaGasPriceOracle {\\n function decimals() external view returns (uint256);\\n\\n function priceRatio() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe27046c185bf441cde5a28fe070bf0957322bd882aab30a9646994e0346bbaf8\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/samples/IBobaStraw.sol":{"IBobaStraw":{"abi":[{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decimals(address,address)":"58e2d3a8","getRoundData(address,address,uint80)":"fc58749e","latestAnswer(address,address)":"d4c282a3","latestRoundData(address,address)":"bcfd032d","latestTimestamp(address,address)":"672ff44f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"},{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/IBobaStraw.sol\":\"IBobaStraw\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IBobaStraw.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaStraw {\\n function latestRoundData(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n function getRoundData(\\n address base,\\n address quote,\\n uint80 _roundId\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n // V2 AggregatorInterface\\n\\n function latestAnswer(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n int256 answer\\n );\\n\\n function latestTimestamp(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint256 timestamp\\n );\\n\\n function decimals(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint8\\n );\\n}\\n\",\"keccak256\":\"0x9983613a78d9398928dae53c2701b419811ba055fd716dadf638a78d6b52577e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/samples/IOracle.sol":{"IOracle":{"abi":[{"inputs":[{"internalType":"uint256","name":"ethOutput","type":"uint256"}],"name":"getTokenValueOfEth","outputs":[{"internalType":"uint256","name":"tokenInput","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"getTokenValueOfEth(uint256)":"d1eca9cf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ethOutput\",\"type\":\"uint256\"}],\"name\":\"getTokenValueOfEth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenInput\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getTokenValueOfEth(uint256)\":{\"notice\":\"return amount of tokens that are required to receive that much eth.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/IOracle.sol\":\"IOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface IOracle {\\n\\n /**\\n * return amount of tokens that are required to receive that much eth.\\n */\\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\\n}\\n\\n\",\"keccak256\":\"0xdefd2ec9c4e592ad68092e9e4c15d27c697fc08f90a885bcdb47542da88b42be\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"getTokenValueOfEth(uint256)":{"notice":"return amount of tokens that are required to receive that much eth."}},"version":1}}},"contracts/samples/ManualDepositPaymaster.sol":{"ManualDepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"uint256","name":"priceRatio","type":"uint256"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"priceRatioInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"uint256","name":"priceRatio","type":"uint256"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"priceRatio","type":"uint256"}],"name":"updatePriceRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"name":"updateTokenParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit.","token":"the token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address,address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to","token":"the token deposit to withdraw"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13213":{"entryPoint":null,"id":13213,"parameterSlots":1,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":107,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_13394":{"entryPoint":null,"id":13394,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":187,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b50604051620023a5380380620023a58339810160408190526200003491620000bb565b8062000040336200006b565b6001600160a01b031660805262000064336000908152600360205260409020439055565b50620000ed565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000ce57600080fd5b81516001600160a01b0381168114620000e657600080fd5b9392505050565b60805161226b6200013a60003960008181610425015281816105bd0152818161066d01528181610c1301528181610cc001528181610d5001528181610ee1015261128e015261226b6000f3fe60806040526004361061018b5760003560e01c8063a9a23409116100d6578063cc9c837c1161007f578063e29db4dc11610059578063e29db4dc14610513578063f2fde38b14610533578063f465c77e1461055357600080fd5b8063cc9c837c146104c9578063cd8f80c2146104e9578063d0e30db01461050b57600080fd5b8063c23a5cea116100b0578063c23a5cea1461045c578063c23f001f1461047c578063c399ec88146104b457600080fd5b8063a9a23409146103f3578063b0d691fe14610413578063bb9fe6bf1461044757600080fd5b80634a6f84cf11610138578063796d437111610112578063796d4371146103875780638da5cb5b1461039d5780639ed0fb68146103cf57600080fd5b80634a6f84cf14610317578063715018a614610352578063763d9c791461036757600080fd5b8063382edd9e11610169578063382edd9e146101e5578063439a70b214610205578063493b0170146102b057600080fd5b80630396cb6014610190578063205c2878146101a557806324ee2999146101c5575b600080fd5b6101a361019e366004611b26565b610581565b005b3480156101b157600080fd5b506101a36101c0366004611b61565b610626565b3480156101d157600080fd5b506101a36101e0366004611b61565b6106b1565b3480156101f157600080fd5b506101a3610200366004611b8d565b610823565b34801561021157600080fd5b50610272610220366004611bce565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0385169474010000000000000000000000000000000000000000900460ff16939086565b604080516001600160a01b03909716875260ff9095166020870152938501929092526060840152608083015260a082015260c0015b60405180910390f35b3480156102bc57600080fd5b506103026102cb366004611beb565b6001600160a01b03918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152016102a7565b34801561032357600080fd5b50610344610332366004611bce565b60036020526000908152604090205481565b6040519081526020016102a7565b34801561035e57600080fd5b506101a361092b565b34801561037357600080fd5b506101a3610382366004611c24565b61093f565b34801561039357600080fd5b506103446188b881565b3480156103a957600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102a7565b3480156103db57600080fd5b506101a3336000908152600360205260409020439055565b3480156103ff57600080fd5b506101a361040e366004611c83565b610bef565b34801561041f57600080fd5b506103b77f000000000000000000000000000000000000000000000000000000000000000081565b34801561045357600080fd5b506101a3610c09565b34801561046857600080fd5b506101a3610477366004611bce565b610c80565b34801561048857600080fd5b50610344610497366004611beb565b600260209081526000928352604080842090915290825290205481565b3480156104c057600080fd5b50610344610d1f565b3480156104d557600080fd5b506101a36104e4366004611b8d565b610dc8565b3480156104f557600080fd5b506101a333600090815260036020526040812055565b6101a3610eb3565b34801561051f57600080fd5b506101a361052e366004611d12565b610f2e565b34801561053f57600080fd5b506101a361054e366004611bce565b61103f565b34801561055f57600080fd5b5061057361056e366004611d4d565b6110cf565b6040516102a7929190611e17565b6105896110f2565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561060a57600080fd5b505af115801561061e573d6000803e3d6000fd5b505050505050565b61062e6110f2565b6040517f205c28780000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561060a57600080fd5b6106b96110f2565b6001600160a01b038281166000908152600160205260409020541661074b5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260016020526040902060030154811080159061079157506001600160a01b0382166000908152600160205260409020600401548111155b6108035760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f0000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b0390911660009081526001602081905260409091200155565b6108386001600160a01b03841633308461114c565b6001600160a01b03838116600090815260016020526040902054166108c55760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038084166000908152600260209081526040808320938616835292905290812080548392906108fc908490611e68565b90915550506001600160a01b03821633036109265761092633600090815260036020526040812055565b505050565b6109336110f2565b61093d600061121b565b565b6109476110f2565b6001600160a01b03868116600090815260016020526040902054161561096c57600080fd5b836000036109e25760405162461bcd60e51b815260206004820152602c60248201527f4465706f7369745061796d61737465723a20707269636520726174696f20636160448201527f6e6e6f74206265207a65726f00000000000000000000000000000000000000006064820152608401610742565b81600003610a585760405162461bcd60e51b815260206004820152602a60248201527f4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e60448201527f6f74206265207a65726f000000000000000000000000000000000000000000006064820152608401610742565b818410158015610a685750808411155b610ada5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f0000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038616610b305760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369745061796d61737465723a20496e76616c696420746f6b656e006044820152606401610742565b6040805160c0810182526001600160a01b0397881680825260ff9788166020808401918252838501988952606084019788526080840196875260a0840195865260009283526001908190529390912091518254915199167fffffffffffffffffffffff000000000000000000000000000000000000000000909116177401000000000000000000000000000000000000000098909716979097029590951786559251938501939093555160028401559051600383015551600490910155565b610bf7611283565b610c03848484846112fb565b50505050565b610c116110f2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6c57600080fd5b505af1158015610c03573d6000803e3d6000fd5b610c886110f2565b6040517fc23a5cea0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190611e80565b905090565b3360009081526003602052604090205415801590610df457503360009081526003602052604090205443115b610e665760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038316600090815260026020908152604080832033845290915281208054839290610e99908490611e99565b9091555061092690506001600160a01b0384168383611425565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d0457600080fd5b610f366110f2565b6001600160a01b0384811660009081526001602052604090205416610fc35760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b816000036110135760405162461bcd60e51b815260206004820152601860248201527f6d696e20726174696f2063616e6e6f74206265207a65726f00000000000000006044820152606401610742565b6001600160a01b0390931660009081526001602052604090206002810192909255600382015560040155565b6110476110f2565b6001600160a01b0381166110c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610742565b6110cc8161121b565b50565b606060006110db611283565b6110e685858561146e565b91509150935093915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610742565b6040516001600160a01b0380851660248301528316604482015260648101829052610c039085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611728565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461093d5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610742565b60008080808061130d87890189611eb0565b9450945094509450945060008183856188b86113299190611f01565b611333908a611e68565b61133d9190611f01565b6113479190611f3e565b905060028a600281111561135d5761135d611f79565b1461137c576113776001600160a01b03861687308461114c565b6113b9565b6001600160a01b038086166000908152600260209081526040808320938a16835292905290812080548392906113b3908490611e99565b90915550505b6001600160a01b038516600090815260026020526040812082916113e56000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546114149190611e68565b909155505050505050505050505050565b6040516001600160a01b0383166024820152604481018290526109269084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611199565b606060006188b88560a00135116114ed5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610742565b3660006114fe610120880188611fa8565b9092509050602881146115795760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e00000000000000000000006064820152608401610742565b60006115888260148186612014565b6115919161203e565b60601c9050873560006115a4838961180d565b905060006115b18b611940565b6001600160a01b0384166000908152600360205260409020549091501561163f5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038085166000908152600260209081526040808320938716835292905220548211156116da5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610742565b604080516001600160a01b03948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b600061177d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661196f9092919063ffffffff16565b805190915015610926578080602001905181019061179b9190612086565b6109265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b0382811660009081526001602052604081205490911661189c5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b03831660009081526001602081905260408220908101546002909101546118cb90600a6121c8565b6118d59085611f01565b6118df9190611f3e565b6001600160a01b0385166000908152600160205260409020549091506119219074010000000000000000000000000000000000000000900460ff1660126121d4565b61192c90600a6121f7565b6119369082611f3e565b9150505b92915050565b600060e082013561010083013580820361195b575092915050565b6119678248830161197e565b949350505050565b60606119678484600085611996565b600081831061198d578161198f565b825b9392505050565b606082471015611a0e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610742565b600080866001600160a01b03168587604051611a2a9190612206565b60006040518083038185875af1925050503d8060008114611a67576040519150601f19603f3d011682016040523d82523d6000602084013e611a6c565b606091505b5091509150611a7d87838387611a88565b979650505050505050565b60608315611af7578251600003611af0576001600160a01b0385163b611af05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610742565b5081611967565b6119678383815115611b0c5781518083602001fd5b8060405162461bcd60e51b81526004016107429190612222565b600060208284031215611b3857600080fd5b813563ffffffff8116811461198f57600080fd5b6001600160a01b03811681146110cc57600080fd5b60008060408385031215611b7457600080fd5b8235611b7f81611b4c565b946020939093013593505050565b600080600060608486031215611ba257600080fd5b8335611bad81611b4c565b92506020840135611bbd81611b4c565b929592945050506040919091013590565b600060208284031215611be057600080fd5b813561198f81611b4c565b60008060408385031215611bfe57600080fd5b8235611c0981611b4c565b91506020830135611c1981611b4c565b809150509250929050565b60008060008060008060c08789031215611c3d57600080fd5b8635611c4881611b4c565b9550602087013560ff81168114611c5e57600080fd5b95989597505050506040840135936060810135936080820135935060a0909101359150565b60008060008060608587031215611c9957600080fd5b843560038110611ca857600080fd5b9350602085013567ffffffffffffffff80821115611cc557600080fd5b818701915087601f830112611cd957600080fd5b813581811115611ce857600080fd5b886020828501011115611cfa57600080fd5b95986020929092019750949560400135945092505050565b60008060008060808587031215611d2857600080fd5b8435611d3381611b4c565b966020860135965060408601359560600135945092505050565b600080600060608486031215611d6257600080fd5b833567ffffffffffffffff811115611d7957600080fd5b84016101608187031215611d8c57600080fd5b95602085013595506040909401359392505050565b60005b83811015611dbc578181015183820152602001611da4565b83811115610c035750506000910152565b60008151808452611de5816020860160208601611da1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611e2a6040830185611dcd565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611e7b57611e7b611e39565b500190565b600060208284031215611e9257600080fd5b5051919050565b600082821015611eab57611eab611e39565b500390565b600080600080600060a08688031215611ec857600080fd5b8535611ed381611b4c565b94506020860135611ee381611b4c565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f3957611f39611e39565b500290565b600082611f74577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fdd57600080fd5b83018035915067ffffffffffffffff821115611ff857600080fd5b60200191503681900382131561200d57600080fd5b9250929050565b6000808585111561202457600080fd5b8386111561203157600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561207e5780818660140360031b1b83161692505b505092915050565b60006020828403121561209857600080fd5b8151801515811461198f57600080fd5b600181815b8085111561210157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156120e7576120e7611e39565b808516156120f457918102915b93841c93908002906120ad565b509250929050565b6000826121185750600161193a565b816121255750600061193a565b816001811461213b576002811461214557612161565b600191505061193a565b60ff84111561215657612156611e39565b50506001821b61193a565b5060208310610133831016604e8410600b8410161715612184575081810a61193a565b61218e83836120a8565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156121c0576121c0611e39565b029392505050565b600061198f8383612109565b600060ff821660ff8416808210156121ee576121ee611e39565b90039392505050565b600061198f60ff841683612109565b60008251612218818460208701611da1565b9190910192915050565b60208152600061198f6020830184611dcd56fea264697066735822122025c4923ee775600d836609ca799d047a8fbdce37843bfb903a4c8b927a4b424464736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x23A5 CODESIZE SUB DUP1 PUSH3 0x23A5 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xBB JUMP JUMPDEST DUP1 PUSH3 0x40 CALLER PUSH3 0x6B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH3 0x64 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST POP PUSH3 0xED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x226B PUSH3 0x13A PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x425 ADD MSTORE DUP2 DUP2 PUSH2 0x5BD ADD MSTORE DUP2 DUP2 PUSH2 0x66D ADD MSTORE DUP2 DUP2 PUSH2 0xC13 ADD MSTORE DUP2 DUP2 PUSH2 0xCC0 ADD MSTORE DUP2 DUP2 PUSH2 0xD50 ADD MSTORE DUP2 DUP2 PUSH2 0xEE1 ADD MSTORE PUSH2 0x128E ADD MSTORE PUSH2 0x226B PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xCC9C837C GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE29DB4DC GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE29DB4DC EQ PUSH2 0x513 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x553 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x4C9 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x4E9 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45C JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x47C JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x413 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x796D4371 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x387 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x763D9C79 EQ PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x439A70B2 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x24EE2999 EQ PUSH2 0x1C5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x1B26 JUMP JUMPDEST PUSH2 0x581 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x1C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x626 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x6B1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x200 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B8D JUMP JUMPDEST PUSH2 0x823 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x272 PUSH2 0x220 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP5 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP4 SWAP1 DUP7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP8 AND DUP8 MSTORE PUSH1 0xFF SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x2CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1BEB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x332 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x92B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C24 JUMP JUMPDEST PUSH2 0x93F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x40E CALLDATASIZE PUSH1 0x4 PUSH2 0x1C83 JUMP JUMPDEST PUSH2 0xBEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B7 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0xC09 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x477 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0xC80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x488 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x497 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BEB JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0xD1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x4E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B8D JUMP JUMPDEST PUSH2 0xDC8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0xEB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x52E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D12 JUMP JUMPDEST PUSH2 0xF2E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x54E CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0x103F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x573 PUSH2 0x56E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4D JUMP JUMPDEST PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2A7 SWAP3 SWAP2 SWAP1 PUSH2 0x1E17 JUMP JUMPDEST PUSH2 0x589 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x61E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x62E PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6B9 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x74B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP2 LT DUP1 ISZERO SWAP1 PUSH2 0x791 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD DUP2 GT ISZERO JUMPDEST PUSH2 0x803 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH2 0x838 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND CALLER ADDRESS DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x8C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x8FC SWAP1 DUP5 SWAP1 PUSH2 0x1E68 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND CALLER SUB PUSH2 0x926 JUMPI PUSH2 0x926 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x933 PUSH2 0x10F2 JUMP JUMPDEST PUSH2 0x93D PUSH1 0x0 PUSH2 0x121B JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x947 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 SUB PUSH2 0x9E2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20707269636520726174696F206361 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E6E6F74206265207A65726F0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0xA58 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D696E20726174696F2063616E6E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206265207A65726F00000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0xA68 JUMPI POP DUP1 DUP5 GT ISZERO JUMPDEST PUSH2 0xADA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420746F6B656E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP1 DUP3 MSTORE PUSH1 0xFF SWAP8 DUP9 AND PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE DUP4 DUP6 ADD SWAP9 DUP10 MSTORE PUSH1 0x60 DUP5 ADD SWAP8 DUP9 MSTORE PUSH1 0x80 DUP5 ADD SWAP7 DUP8 MSTORE PUSH1 0xA0 DUP5 ADD SWAP6 DUP7 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 SWAP1 DUP2 SWAP1 MSTORE SWAP4 SWAP1 SWAP2 KECCAK256 SWAP2 MLOAD DUP3 SLOAD SWAP2 MLOAD SWAP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR PUSH21 0x10000000000000000000000000000000000000000 SWAP9 SWAP1 SWAP8 AND SWAP8 SWAP1 SWAP8 MUL SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE SWAP3 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 SSTORE MLOAD PUSH1 0x2 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x3 DUP4 ADD SSTORE MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH2 0xBF7 PUSH2 0x1283 JUMP JUMPDEST PUSH2 0xC03 DUP5 DUP5 DUP5 DUP5 PUSH2 0x12FB JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC11 PUSH2 0x10F2 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC88 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD18 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDC3 SWAP2 SWAP1 PUSH2 0x1E80 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xDF4 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xE66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xE99 SWAP1 DUP5 SWAP1 PUSH2 0x1E99 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x926 SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP4 DUP4 PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF36 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x1013 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D696E20726174696F2063616E6E6F74206265207A65726F0000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x3 DUP3 ADD SSTORE PUSH1 0x4 ADD SSTORE JUMP JUMPDEST PUSH2 0x1047 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x10C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH2 0x10CC DUP2 PUSH2 0x121B JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x10DB PUSH2 0x1283 JUMP JUMPDEST PUSH2 0x10E6 DUP6 DUP6 DUP6 PUSH2 0x146E JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x93D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xC03 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1728 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x93D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x130D DUP8 DUP10 ADD DUP10 PUSH2 0x1EB0 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x1329 SWAP2 SWAP1 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x1333 SWAP1 DUP11 PUSH2 0x1E68 JUMP JUMPDEST PUSH2 0x133D SWAP2 SWAP1 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x1347 SWAP2 SWAP1 PUSH2 0x1F3E JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x135D JUMPI PUSH2 0x135D PUSH2 0x1F79 JUMP JUMPDEST EQ PUSH2 0x137C JUMPI PUSH2 0x1377 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH2 0x13B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x13B3 SWAP1 DUP5 SWAP1 PUSH2 0x1E99 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x13E5 PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1414 SWAP2 SWAP1 PUSH2 0x1E68 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x926 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x14ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x14FE PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x1FA8 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1579 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1588 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x2014 JUMP JUMPDEST PUSH2 0x1591 SWAP2 PUSH2 0x203E JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x15A4 DUP4 DUP10 PUSH2 0x180D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x15B1 DUP12 PUSH2 0x1940 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x163F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x16DA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x177D DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x196F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x926 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x179B SWAP2 SWAP1 PUSH2 0x2086 JUMP JUMPDEST PUSH2 0x926 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND PUSH2 0x189C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 ADD SLOAD PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD PUSH2 0x18CB SWAP1 PUSH1 0xA PUSH2 0x21C8 JUMP JUMPDEST PUSH2 0x18D5 SWAP1 DUP6 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x18DF SWAP2 SWAP1 PUSH2 0x1F3E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x1921 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x21D4 JUMP JUMPDEST PUSH2 0x192C SWAP1 PUSH1 0xA PUSH2 0x21F7 JUMP JUMPDEST PUSH2 0x1936 SWAP1 DUP3 PUSH2 0x1F3E JUMP JUMPDEST SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x195B JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1967 DUP3 BASEFEE DUP4 ADD PUSH2 0x197E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1967 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1996 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x198D JUMPI DUP2 PUSH2 0x198F JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1A0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1A2A SWAP2 SWAP1 PUSH2 0x2206 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A67 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1A7D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1A88 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1AF7 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1AF0 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x1AF0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST POP DUP2 PUSH2 0x1967 JUMP JUMPDEST PUSH2 0x1967 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1B0C JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x742 SWAP2 SWAP1 PUSH2 0x2222 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x198F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x10CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1B7F DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1BAD DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1BBD DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x198F DUP2 PUSH2 0x1B4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C09 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1C19 DUP2 PUSH2 0x1B4C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1C3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1C48 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1C5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP6 SWAP8 POP POP POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP4 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1CA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1CD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D33 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DBC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DA4 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC03 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1DE5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1DA1 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1E2A PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1DCD JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1E7B JUMPI PUSH2 0x1E7B PUSH2 0x1E39 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1EAB JUMPI PUSH2 0x1EAB PUSH2 0x1E39 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1EC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1ED3 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1EE3 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1F39 JUMPI PUSH2 0x1F39 PUSH2 0x1E39 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F74 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1FDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1FF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x200D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x2024 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2031 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x207E JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2098 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x198F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x2101 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x20E7 JUMPI PUSH2 0x20E7 PUSH2 0x1E39 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x20F4 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x20AD JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2118 JUMPI POP PUSH1 0x1 PUSH2 0x193A JUMP JUMPDEST DUP2 PUSH2 0x2125 JUMPI POP PUSH1 0x0 PUSH2 0x193A JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x213B JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x2145 JUMPI PUSH2 0x2161 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x193A JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x2156 JUMPI PUSH2 0x2156 PUSH2 0x1E39 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x193A JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x2184 JUMPI POP DUP2 DUP2 EXP PUSH2 0x193A JUMP JUMPDEST PUSH2 0x218E DUP4 DUP4 PUSH2 0x20A8 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x21C0 JUMPI PUSH2 0x21C0 PUSH2 0x1E39 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x198F DUP4 DUP4 PUSH2 0x2109 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x21EE JUMPI PUSH2 0x21EE PUSH2 0x1E39 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x198F PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x2109 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2218 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1DA1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x198F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1DCD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 0xC4 SWAP3 RETURNDATACOPY 0xE7 PUSH22 0x600D836609CA799D047A8FBDCE37843BFB903A4C8B92 PUSH27 0x4B424464736F6C634300080F003300000000000000000000000000 ","sourceMap":"1215:8566:72:-:0;;;1855:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1906:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;2001:20:72::1;4369:10:::0;4357:23;;;;:11;:23;;;;;4383:12;4357:38;;4310:92;2001:20:::1;1855:173:::0;1215:8566;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;1215:8566:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_13183":{"entryPoint":null,"id":13183,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":5928,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":4338,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_13816":{"entryPoint":4859,"id":13816,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":4739,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":4635,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_13729":{"entryPoint":5230,"id":13729,"parameterSlots":3,"returnSlots":2},"@addDepositFor_13353":{"entryPoint":2083,"id":13353,"parameterSlots":3,"returnSlots":0},"@addStake_7469":{"entryPoint":1409,"id":7469,"parameterSlots":1,"returnSlots":0},"@addToken_13297":{"entryPoint":2367,"id":13297,"parameterSlots":6,"returnSlots":0},"@balances_13196":{"entryPoint":null,"id":13196,"parameterSlots":0,"returnSlots":0},"@depositInfo_13381":{"entryPoint":null,"id":13381,"parameterSlots":2,"returnSlots":2},"@deposit_7433":{"entryPoint":3763,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":6550,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":6511,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPrice_11050":{"entryPoint":6464,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":3359,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEth_13511":{"entryPoint":6157,"id":13511,"parameterSlots":2,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_13406":{"entryPoint":null,"id":13406,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":6526,"id":11162,"parameterSlots":2,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":3055,"id":7395,"parameterSlots":4,"returnSlots":0},"@priceRatioInfo_13189":{"entryPoint":null,"id":13189,"parameterSlots":0,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":2347,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":4428,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":5157,"id":4512,"parameterSlots":3,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":4159,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_13200":{"entryPoint":null,"id":13200,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":3081,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_13394":{"entryPoint":null,"id":13394,"parameterSlots":0,"returnSlots":0},"@updatePriceRatio_13621":{"entryPoint":1713,"id":13621,"parameterSlots":2,"returnSlots":0},"@updateTokenParams_13570":{"entryPoint":3886,"id":13570,"parameterSlots":4,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":4303,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":6792,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":3200,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1574,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_13452":{"entryPoint":3528,"id":13452,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":7856,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7009,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":8326,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419":{"entryPoint":7118,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419t_address":{"entryPoint":7147,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256":{"entryPoint":7053,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":7442,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256":{"entryPoint":7204,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":7299,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7501,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":7808,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":6950,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":7629,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":8710,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":7703,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":8738,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8104,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":8212,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":7784,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":7998,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":8360,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":8648,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":8695,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":8457,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":7937,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":7833,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint8":{"entryPoint":8660,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":8254,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":7585,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":7737,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":8057,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":6988,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:22437:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"900:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"946:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"955:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"958:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"948:6:111"},"nodeType":"YulFunctionCall","src":"948:12:111"},"nodeType":"YulExpressionStatement","src":"948:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"921:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"930:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"913:3:111"},"nodeType":"YulFunctionCall","src":"913:32:111"},"nodeType":"YulIf","src":"910:52:111"},{"nodeType":"YulVariableDeclaration","src":"971:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"997:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"984:12:111"},"nodeType":"YulFunctionCall","src":"984:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"975:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1049:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1016:32:111"},"nodeType":"YulFunctionCall","src":"1016:39:111"},"nodeType":"YulExpressionStatement","src":"1016:39:111"},{"nodeType":"YulAssignment","src":"1064:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1074:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1064:6:111"}]},{"nodeType":"YulAssignment","src":"1088:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1115:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1126:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1111:3:111"},"nodeType":"YulFunctionCall","src":"1111:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1098:12:111"},"nodeType":"YulFunctionCall","src":"1098:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1088:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"858:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"869:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"881:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"889:6:111","type":""}],"src":"798:338:111"},{"body":{"nodeType":"YulBlock","src":"1260:368:111","statements":[{"body":{"nodeType":"YulBlock","src":"1306:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1315:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1308:6:111"},"nodeType":"YulFunctionCall","src":"1308:12:111"},"nodeType":"YulExpressionStatement","src":"1308:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1281:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1290:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1277:3:111"},"nodeType":"YulFunctionCall","src":"1277:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1302:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1273:3:111"},"nodeType":"YulFunctionCall","src":"1273:32:111"},"nodeType":"YulIf","src":"1270:52:111"},{"nodeType":"YulVariableDeclaration","src":"1331:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1357:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1344:12:111"},"nodeType":"YulFunctionCall","src":"1344:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1335:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1409:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1376:32:111"},"nodeType":"YulFunctionCall","src":"1376:39:111"},"nodeType":"YulExpressionStatement","src":"1376:39:111"},{"nodeType":"YulAssignment","src":"1424:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1434:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1424:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1448:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1480:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1491:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1476:3:111"},"nodeType":"YulFunctionCall","src":"1476:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1463:12:111"},"nodeType":"YulFunctionCall","src":"1463:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1452:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1537:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1504:32:111"},"nodeType":"YulFunctionCall","src":"1504:41:111"},"nodeType":"YulExpressionStatement","src":"1504:41:111"},{"nodeType":"YulAssignment","src":"1554:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1564:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1554:6:111"}]},{"nodeType":"YulAssignment","src":"1580:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1618:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1603:3:111"},"nodeType":"YulFunctionCall","src":"1603:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1590:12:111"},"nodeType":"YulFunctionCall","src":"1590:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1580:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1210:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1221:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1233:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1241:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1249:6:111","type":""}],"src":"1141:487:111"},{"body":{"nodeType":"YulBlock","src":"1718:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"1764:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1773:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1776:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1766:6:111"},"nodeType":"YulFunctionCall","src":"1766:12:111"},"nodeType":"YulExpressionStatement","src":"1766:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1735:3:111"},"nodeType":"YulFunctionCall","src":"1735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1760:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1731:3:111"},"nodeType":"YulFunctionCall","src":"1731:32:111"},"nodeType":"YulIf","src":"1728:52:111"},{"nodeType":"YulVariableDeclaration","src":"1789:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1815:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1802:12:111"},"nodeType":"YulFunctionCall","src":"1802:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1793:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1867:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1834:32:111"},"nodeType":"YulFunctionCall","src":"1834:39:111"},"nodeType":"YulExpressionStatement","src":"1834:39:111"},{"nodeType":"YulAssignment","src":"1882:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1892:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1882:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1684:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1695:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1707:6:111","type":""}],"src":"1633:270:111"},{"body":{"nodeType":"YulBlock","src":"2160:354:111","statements":[{"nodeType":"YulAssignment","src":"2170:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2182:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2193:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2178:3:111"},"nodeType":"YulFunctionCall","src":"2178:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2170:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2228:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2236:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2224:3:111"},"nodeType":"YulFunctionCall","src":"2224:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2206:6:111"},"nodeType":"YulFunctionCall","src":"2206:74:111"},"nodeType":"YulExpressionStatement","src":"2206:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2300:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2311:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2296:3:111"},"nodeType":"YulFunctionCall","src":"2296:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2320:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2328:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2316:3:111"},"nodeType":"YulFunctionCall","src":"2316:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2289:6:111"},"nodeType":"YulFunctionCall","src":"2289:45:111"},"nodeType":"YulExpressionStatement","src":"2289:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2354:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2365:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2350:3:111"},"nodeType":"YulFunctionCall","src":"2350:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2370:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2343:6:111"},"nodeType":"YulFunctionCall","src":"2343:34:111"},"nodeType":"YulExpressionStatement","src":"2343:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2408:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2393:3:111"},"nodeType":"YulFunctionCall","src":"2393:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2413:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2386:6:111"},"nodeType":"YulFunctionCall","src":"2386:34:111"},"nodeType":"YulExpressionStatement","src":"2386:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2451:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2436:3:111"},"nodeType":"YulFunctionCall","src":"2436:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"2457:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2429:6:111"},"nodeType":"YulFunctionCall","src":"2429:35:111"},"nodeType":"YulExpressionStatement","src":"2429:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2484:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2495:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2480:3:111"},"nodeType":"YulFunctionCall","src":"2480:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"2501:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2473:6:111"},"nodeType":"YulFunctionCall","src":"2473:35:111"},"nodeType":"YulExpressionStatement","src":"2473:35:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2089:9:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"2100:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2108:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2116:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2124:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2132:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2140:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2151:4:111","type":""}],"src":"1908:606:111"},{"body":{"nodeType":"YulBlock","src":"2621:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"2667:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2676:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2679:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2669:6:111"},"nodeType":"YulFunctionCall","src":"2669:12:111"},"nodeType":"YulExpressionStatement","src":"2669:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2642:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2651:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2638:3:111"},"nodeType":"YulFunctionCall","src":"2638:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2663:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2634:3:111"},"nodeType":"YulFunctionCall","src":"2634:32:111"},"nodeType":"YulIf","src":"2631:52:111"},{"nodeType":"YulVariableDeclaration","src":"2692:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2718:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2705:12:111"},"nodeType":"YulFunctionCall","src":"2705:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2696:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2770:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2737:32:111"},"nodeType":"YulFunctionCall","src":"2737:39:111"},"nodeType":"YulExpressionStatement","src":"2737:39:111"},{"nodeType":"YulAssignment","src":"2785:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2795:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2785:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2809:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2852:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2837:3:111"},"nodeType":"YulFunctionCall","src":"2837:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2824:12:111"},"nodeType":"YulFunctionCall","src":"2824:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2813:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2898:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2865:32:111"},"nodeType":"YulFunctionCall","src":"2865:41:111"},"nodeType":"YulExpressionStatement","src":"2865:41:111"},{"nodeType":"YulAssignment","src":"2915:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2925:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2915:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2579:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2590:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2602:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2610:6:111","type":""}],"src":"2519:419:111"},{"body":{"nodeType":"YulBlock","src":"3072:119:111","statements":[{"nodeType":"YulAssignment","src":"3082:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3094:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3105:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3090:3:111"},"nodeType":"YulFunctionCall","src":"3090:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3082:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3124:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3135:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3117:6:111"},"nodeType":"YulFunctionCall","src":"3117:25:111"},"nodeType":"YulExpressionStatement","src":"3117:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3162:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3173:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3158:3:111"},"nodeType":"YulFunctionCall","src":"3158:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"3178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3151:6:111"},"nodeType":"YulFunctionCall","src":"3151:34:111"},"nodeType":"YulExpressionStatement","src":"3151:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3033:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3044:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3052:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3063:4:111","type":""}],"src":"2943:248:111"},{"body":{"nodeType":"YulBlock","src":"3266:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3312:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3321:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3324:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3314:6:111"},"nodeType":"YulFunctionCall","src":"3314:12:111"},"nodeType":"YulExpressionStatement","src":"3314:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3287:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3296:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3283:3:111"},"nodeType":"YulFunctionCall","src":"3283:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3308:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3279:3:111"},"nodeType":"YulFunctionCall","src":"3279:32:111"},"nodeType":"YulIf","src":"3276:52:111"},{"nodeType":"YulVariableDeclaration","src":"3337:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3363:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3350:12:111"},"nodeType":"YulFunctionCall","src":"3350:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3341:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3415:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3382:32:111"},"nodeType":"YulFunctionCall","src":"3382:39:111"},"nodeType":"YulExpressionStatement","src":"3382:39:111"},{"nodeType":"YulAssignment","src":"3430:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3440:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3430:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3232:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3243:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3255:6:111","type":""}],"src":"3196:255:111"},{"body":{"nodeType":"YulBlock","src":"3557:76:111","statements":[{"nodeType":"YulAssignment","src":"3567:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3579:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3590:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3575:3:111"},"nodeType":"YulFunctionCall","src":"3575:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3567:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3609:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3620:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3602:6:111"},"nodeType":"YulFunctionCall","src":"3602:25:111"},"nodeType":"YulExpressionStatement","src":"3602:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3526:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3537:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3548:4:111","type":""}],"src":"3456:177:111"},{"body":{"nodeType":"YulBlock","src":"3806:542:111","statements":[{"body":{"nodeType":"YulBlock","src":"3853:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3862:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3865:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3855:6:111"},"nodeType":"YulFunctionCall","src":"3855:12:111"},"nodeType":"YulExpressionStatement","src":"3855:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3827:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3836:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3823:3:111"},"nodeType":"YulFunctionCall","src":"3823:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3848:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3819:3:111"},"nodeType":"YulFunctionCall","src":"3819:33:111"},"nodeType":"YulIf","src":"3816:53:111"},{"nodeType":"YulVariableDeclaration","src":"3878:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3904:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3891:12:111"},"nodeType":"YulFunctionCall","src":"3891:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3882:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3956:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3923:32:111"},"nodeType":"YulFunctionCall","src":"3923:39:111"},"nodeType":"YulExpressionStatement","src":"3923:39:111"},{"nodeType":"YulAssignment","src":"3971:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3981:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3971:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3995:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4027:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4038:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4023:3:111"},"nodeType":"YulFunctionCall","src":"4023:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4010:12:111"},"nodeType":"YulFunctionCall","src":"4010:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"3999:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4094:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4103:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4106:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4096:6:111"},"nodeType":"YulFunctionCall","src":"4096:12:111"},"nodeType":"YulExpressionStatement","src":"4096:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4064:7:111"},{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4077:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4086:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4073:3:111"},"nodeType":"YulFunctionCall","src":"4073:18:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"4061:2:111"},"nodeType":"YulFunctionCall","src":"4061:31:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4054:6:111"},"nodeType":"YulFunctionCall","src":"4054:39:111"},"nodeType":"YulIf","src":"4051:59:111"},{"nodeType":"YulAssignment","src":"4119:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"4129:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4119:6:111"}]},{"nodeType":"YulAssignment","src":"4145:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4183:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4168:3:111"},"nodeType":"YulFunctionCall","src":"4168:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4155:12:111"},"nodeType":"YulFunctionCall","src":"4155:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulAssignment","src":"4196:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4234:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4219:3:111"},"nodeType":"YulFunctionCall","src":"4219:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4206:12:111"},"nodeType":"YulFunctionCall","src":"4206:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4196:6:111"}]},{"nodeType":"YulAssignment","src":"4247:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4285:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4270:3:111"},"nodeType":"YulFunctionCall","src":"4270:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4257:12:111"},"nodeType":"YulFunctionCall","src":"4257:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"4247:6:111"}]},{"nodeType":"YulAssignment","src":"4299:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4326:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4337:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4322:3:111"},"nodeType":"YulFunctionCall","src":"4322:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4309:12:111"},"nodeType":"YulFunctionCall","src":"4309:33:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"4299:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3732:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3743:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3755:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3763:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3771:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3779:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"3787:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"3795:6:111","type":""}],"src":"3638:710:111"},{"body":{"nodeType":"YulBlock","src":"4454:125:111","statements":[{"nodeType":"YulAssignment","src":"4464:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4476:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4487:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4472:3:111"},"nodeType":"YulFunctionCall","src":"4472:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4464:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4506:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4521:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4529:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4517:3:111"},"nodeType":"YulFunctionCall","src":"4517:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4499:6:111"},"nodeType":"YulFunctionCall","src":"4499:74:111"},"nodeType":"YulExpressionStatement","src":"4499:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4423:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4434:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4445:4:111","type":""}],"src":"4353:226:111"},{"body":{"nodeType":"YulBlock","src":"4723:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"4769:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4778:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4781:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4771:6:111"},"nodeType":"YulFunctionCall","src":"4771:12:111"},"nodeType":"YulExpressionStatement","src":"4771:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4744:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4753:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4740:3:111"},"nodeType":"YulFunctionCall","src":"4740:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4765:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4736:3:111"},"nodeType":"YulFunctionCall","src":"4736:32:111"},"nodeType":"YulIf","src":"4733:52:111"},{"nodeType":"YulVariableDeclaration","src":"4794:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4820:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4807:12:111"},"nodeType":"YulFunctionCall","src":"4807:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4798:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4863:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4872:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4875:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4865:6:111"},"nodeType":"YulFunctionCall","src":"4865:12:111"},"nodeType":"YulExpressionStatement","src":"4865:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4852:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4859:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4849:2:111"},"nodeType":"YulFunctionCall","src":"4849:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4842:6:111"},"nodeType":"YulFunctionCall","src":"4842:20:111"},"nodeType":"YulIf","src":"4839:40:111"},{"nodeType":"YulAssignment","src":"4888:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4898:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4888:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4912:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4954:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4939:3:111"},"nodeType":"YulFunctionCall","src":"4939:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4926:12:111"},"nodeType":"YulFunctionCall","src":"4926:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4916:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4967:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4977:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4971:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5022:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5031:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5034:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5024:6:111"},"nodeType":"YulFunctionCall","src":"5024:12:111"},"nodeType":"YulExpressionStatement","src":"5024:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5010:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5018:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5007:2:111"},"nodeType":"YulFunctionCall","src":"5007:14:111"},"nodeType":"YulIf","src":"5004:34:111"},{"nodeType":"YulVariableDeclaration","src":"5047:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5061:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5072:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5057:3:111"},"nodeType":"YulFunctionCall","src":"5057:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"5051:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5127:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5136:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5139:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5129:6:111"},"nodeType":"YulFunctionCall","src":"5129:12:111"},"nodeType":"YulExpressionStatement","src":"5129:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5106:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5110:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5102:3:111"},"nodeType":"YulFunctionCall","src":"5102:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5117:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5098:3:111"},"nodeType":"YulFunctionCall","src":"5098:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5091:6:111"},"nodeType":"YulFunctionCall","src":"5091:35:111"},"nodeType":"YulIf","src":"5088:55:111"},{"nodeType":"YulVariableDeclaration","src":"5152:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5179:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5166:12:111"},"nodeType":"YulFunctionCall","src":"5166:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5156:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5209:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5218:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5221:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5211:6:111"},"nodeType":"YulFunctionCall","src":"5211:12:111"},"nodeType":"YulExpressionStatement","src":"5211:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5197:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5205:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5194:2:111"},"nodeType":"YulFunctionCall","src":"5194:14:111"},"nodeType":"YulIf","src":"5191:34:111"},{"body":{"nodeType":"YulBlock","src":"5275:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5284:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5287:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5277:6:111"},"nodeType":"YulFunctionCall","src":"5277:12:111"},"nodeType":"YulExpressionStatement","src":"5277:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5248:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"5252:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5244:3:111"},"nodeType":"YulFunctionCall","src":"5244:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5261:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5240:3:111"},"nodeType":"YulFunctionCall","src":"5240:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5266:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5237:2:111"},"nodeType":"YulFunctionCall","src":"5237:37:111"},"nodeType":"YulIf","src":"5234:57:111"},{"nodeType":"YulAssignment","src":"5300:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5314:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5318:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5310:3:111"},"nodeType":"YulFunctionCall","src":"5310:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5300:6:111"}]},{"nodeType":"YulAssignment","src":"5330:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"5340:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5330:6:111"}]},{"nodeType":"YulAssignment","src":"5355:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5393:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5378:3:111"},"nodeType":"YulFunctionCall","src":"5378:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5365:12:111"},"nodeType":"YulFunctionCall","src":"5365:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"5355:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4665:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4676:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4688:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4696:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4704:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4712:6:111","type":""}],"src":"4584:819:111"},{"body":{"nodeType":"YulBlock","src":"5530:125:111","statements":[{"nodeType":"YulAssignment","src":"5540:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5563:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5548:3:111"},"nodeType":"YulFunctionCall","src":"5548:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5540:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5582:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5597:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5605:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5593:3:111"},"nodeType":"YulFunctionCall","src":"5593:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5575:6:111"},"nodeType":"YulFunctionCall","src":"5575:74:111"},"nodeType":"YulExpressionStatement","src":"5575:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5499:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5510:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5521:4:111","type":""}],"src":"5408:247:111"},{"body":{"nodeType":"YulBlock","src":"5738:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5784:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5793:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5796:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5786:6:111"},"nodeType":"YulFunctionCall","src":"5786:12:111"},"nodeType":"YulExpressionStatement","src":"5786:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5759:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5768:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5755:3:111"},"nodeType":"YulFunctionCall","src":"5755:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5780:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5751:3:111"},"nodeType":"YulFunctionCall","src":"5751:32:111"},"nodeType":"YulIf","src":"5748:52:111"},{"nodeType":"YulVariableDeclaration","src":"5809:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5835:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5822:12:111"},"nodeType":"YulFunctionCall","src":"5822:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5813:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5887:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"5854:32:111"},"nodeType":"YulFunctionCall","src":"5854:39:111"},"nodeType":"YulExpressionStatement","src":"5854:39:111"},{"nodeType":"YulAssignment","src":"5902:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5912:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5902:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5704:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5715:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5727:6:111","type":""}],"src":"5660:263:111"},{"body":{"nodeType":"YulBlock","src":"6064:339:111","statements":[{"body":{"nodeType":"YulBlock","src":"6111:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6120:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6123:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6113:6:111"},"nodeType":"YulFunctionCall","src":"6113:12:111"},"nodeType":"YulExpressionStatement","src":"6113:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6085:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6094:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6081:3:111"},"nodeType":"YulFunctionCall","src":"6081:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6106:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6077:3:111"},"nodeType":"YulFunctionCall","src":"6077:33:111"},"nodeType":"YulIf","src":"6074:53:111"},{"nodeType":"YulVariableDeclaration","src":"6136:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6162:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6149:12:111"},"nodeType":"YulFunctionCall","src":"6149:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6140:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6214:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"6181:32:111"},"nodeType":"YulFunctionCall","src":"6181:39:111"},"nodeType":"YulExpressionStatement","src":"6181:39:111"},{"nodeType":"YulAssignment","src":"6229:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6239:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6229:6:111"}]},{"nodeType":"YulAssignment","src":"6253:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6291:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6276:3:111"},"nodeType":"YulFunctionCall","src":"6276:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6263:12:111"},"nodeType":"YulFunctionCall","src":"6263:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6253:6:111"}]},{"nodeType":"YulAssignment","src":"6304:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6331:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6342:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6327:3:111"},"nodeType":"YulFunctionCall","src":"6327:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6314:12:111"},"nodeType":"YulFunctionCall","src":"6314:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6304:6:111"}]},{"nodeType":"YulAssignment","src":"6355:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6393:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6378:3:111"},"nodeType":"YulFunctionCall","src":"6378:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6365:12:111"},"nodeType":"YulFunctionCall","src":"6365:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"6355:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6006:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6017:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6029:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6037:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6045:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"6053:6:111","type":""}],"src":"5928:475:111"},{"body":{"nodeType":"YulBlock","src":"6546:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"6592:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6601:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6604:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6594:6:111"},"nodeType":"YulFunctionCall","src":"6594:12:111"},"nodeType":"YulExpressionStatement","src":"6594:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6567:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6576:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6563:3:111"},"nodeType":"YulFunctionCall","src":"6563:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6588:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6559:3:111"},"nodeType":"YulFunctionCall","src":"6559:32:111"},"nodeType":"YulIf","src":"6556:52:111"},{"nodeType":"YulVariableDeclaration","src":"6617:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6644:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6631:12:111"},"nodeType":"YulFunctionCall","src":"6631:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6621:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6699:6:111"},"nodeType":"YulFunctionCall","src":"6699:12:111"},"nodeType":"YulExpressionStatement","src":"6699:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6669:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6677:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6666:2:111"},"nodeType":"YulFunctionCall","src":"6666:30:111"},"nodeType":"YulIf","src":"6663:50:111"},{"nodeType":"YulVariableDeclaration","src":"6722:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6736:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6747:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6732:3:111"},"nodeType":"YulFunctionCall","src":"6732:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6726:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6793:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6802:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6805:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6795:6:111"},"nodeType":"YulFunctionCall","src":"6795:12:111"},"nodeType":"YulExpressionStatement","src":"6795:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6774:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6783:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6770:3:111"},"nodeType":"YulFunctionCall","src":"6770:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6788:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6766:3:111"},"nodeType":"YulFunctionCall","src":"6766:26:111"},"nodeType":"YulIf","src":"6763:46:111"},{"nodeType":"YulAssignment","src":"6818:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"6828:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6818:6:111"}]},{"nodeType":"YulAssignment","src":"6839:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6866:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6877:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6862:3:111"},"nodeType":"YulFunctionCall","src":"6862:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6849:12:111"},"nodeType":"YulFunctionCall","src":"6849:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6839:6:111"}]},{"nodeType":"YulAssignment","src":"6890:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6917:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6928:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6913:3:111"},"nodeType":"YulFunctionCall","src":"6913:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6900:12:111"},"nodeType":"YulFunctionCall","src":"6900:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6890:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6496:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6507:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6519:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6527:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6535:6:111","type":""}],"src":"6408:530:111"},{"body":{"nodeType":"YulBlock","src":"6996:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7006:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7015:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"7010:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7075:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7100:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7105:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7096:3:111"},"nodeType":"YulFunctionCall","src":"7096:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"7119:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7124:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7115:3:111"},"nodeType":"YulFunctionCall","src":"7115:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7109:5:111"},"nodeType":"YulFunctionCall","src":"7109:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7089:6:111"},"nodeType":"YulFunctionCall","src":"7089:39:111"},"nodeType":"YulExpressionStatement","src":"7089:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7036:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7039:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7033:2:111"},"nodeType":"YulFunctionCall","src":"7033:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"7047:19:111","statements":[{"nodeType":"YulAssignment","src":"7049:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7058:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"7061:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7054:3:111"},"nodeType":"YulFunctionCall","src":"7054:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"7049:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"7029:3:111","statements":[]},"src":"7025:113:111"},{"body":{"nodeType":"YulBlock","src":"7164:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7177:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7182:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7173:3:111"},"nodeType":"YulFunctionCall","src":"7173:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"7191:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7166:6:111"},"nodeType":"YulFunctionCall","src":"7166:27:111"},"nodeType":"YulExpressionStatement","src":"7166:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7153:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7156:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7150:2:111"},"nodeType":"YulFunctionCall","src":"7150:13:111"},"nodeType":"YulIf","src":"7147:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"6974:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"6979:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6984:6:111","type":""}],"src":"6943:258:111"},{"body":{"nodeType":"YulBlock","src":"7255:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7265:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7285:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7279:5:111"},"nodeType":"YulFunctionCall","src":"7279:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"7269:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7307:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7312:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7300:6:111"},"nodeType":"YulFunctionCall","src":"7300:19:111"},"nodeType":"YulExpressionStatement","src":"7300:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7354:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7361:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7350:3:111"},"nodeType":"YulFunctionCall","src":"7350:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7372:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"7377:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7368:3:111"},"nodeType":"YulFunctionCall","src":"7368:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"7384:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"7328:21:111"},"nodeType":"YulFunctionCall","src":"7328:63:111"},"nodeType":"YulExpressionStatement","src":"7328:63:111"},{"nodeType":"YulAssignment","src":"7400:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7415:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"7428:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7436:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7424:3:111"},"nodeType":"YulFunctionCall","src":"7424:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7441:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7420:3:111"},"nodeType":"YulFunctionCall","src":"7420:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7411:3:111"},"nodeType":"YulFunctionCall","src":"7411:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"7511:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7407:3:111"},"nodeType":"YulFunctionCall","src":"7407:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"7400:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"7232:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"7239:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"7247:3:111","type":""}],"src":"7206:316:111"},{"body":{"nodeType":"YulBlock","src":"7674:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7691:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7702:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7684:6:111"},"nodeType":"YulFunctionCall","src":"7684:21:111"},"nodeType":"YulExpressionStatement","src":"7684:21:111"},{"nodeType":"YulAssignment","src":"7714:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7739:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7751:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7762:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7747:3:111"},"nodeType":"YulFunctionCall","src":"7747:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"7722:16:111"},"nodeType":"YulFunctionCall","src":"7722:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7714:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7786:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7797:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7782:3:111"},"nodeType":"YulFunctionCall","src":"7782:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7802:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7775:6:111"},"nodeType":"YulFunctionCall","src":"7775:34:111"},"nodeType":"YulExpressionStatement","src":"7775:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7635:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7646:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7654:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7665:4:111","type":""}],"src":"7527:288:111"},{"body":{"nodeType":"YulBlock","src":"7919:93:111","statements":[{"nodeType":"YulAssignment","src":"7929:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7941:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7952:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7937:3:111"},"nodeType":"YulFunctionCall","src":"7937:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7929:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7971:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7986:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7994:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7982:3:111"},"nodeType":"YulFunctionCall","src":"7982:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7964:6:111"},"nodeType":"YulFunctionCall","src":"7964:42:111"},"nodeType":"YulExpressionStatement","src":"7964:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7888:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7899:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7910:4:111","type":""}],"src":"7820:192:111"},{"body":{"nodeType":"YulBlock","src":"8162:168:111","statements":[{"nodeType":"YulAssignment","src":"8172:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8195:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8180:3:111"},"nodeType":"YulFunctionCall","src":"8180:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8172:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8214:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8229:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8237:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8225:3:111"},"nodeType":"YulFunctionCall","src":"8225:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8207:6:111"},"nodeType":"YulFunctionCall","src":"8207:74:111"},"nodeType":"YulExpressionStatement","src":"8207:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8301:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8312:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8297:3:111"},"nodeType":"YulFunctionCall","src":"8297:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"8317:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8290:6:111"},"nodeType":"YulFunctionCall","src":"8290:34:111"},"nodeType":"YulExpressionStatement","src":"8290:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8123:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8134:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8142:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8153:4:111","type":""}],"src":"8017:313:111"},{"body":{"nodeType":"YulBlock","src":"8509:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8526:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8537:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8519:6:111"},"nodeType":"YulFunctionCall","src":"8519:21:111"},"nodeType":"YulExpressionStatement","src":"8519:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8560:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8571:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8556:3:111"},"nodeType":"YulFunctionCall","src":"8556:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8576:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8549:6:111"},"nodeType":"YulFunctionCall","src":"8549:30:111"},"nodeType":"YulExpressionStatement","src":"8549:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8599:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8610:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8595:3:111"},"nodeType":"YulFunctionCall","src":"8595:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f","kind":"string","nodeType":"YulLiteral","src":"8615:34:111","type":"","value":"DepositPaymaster: unsupported to"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8588:6:111"},"nodeType":"YulFunctionCall","src":"8588:62:111"},"nodeType":"YulExpressionStatement","src":"8588:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8670:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8681:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8666:3:111"},"nodeType":"YulFunctionCall","src":"8666:18:111"},{"hexValue":"6b656e","kind":"string","nodeType":"YulLiteral","src":"8686:5:111","type":"","value":"ken"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8659:6:111"},"nodeType":"YulFunctionCall","src":"8659:33:111"},"nodeType":"YulExpressionStatement","src":"8659:33:111"},{"nodeType":"YulAssignment","src":"8701:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8724:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8709:3:111"},"nodeType":"YulFunctionCall","src":"8709:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8701:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8486:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8500:4:111","type":""}],"src":"8335:399:111"},{"body":{"nodeType":"YulBlock","src":"8913:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8930:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8941:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8923:6:111"},"nodeType":"YulFunctionCall","src":"8923:21:111"},"nodeType":"YulExpressionStatement","src":"8923:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8975:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8960:3:111"},"nodeType":"YulFunctionCall","src":"8960:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8980:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8953:6:111"},"nodeType":"YulFunctionCall","src":"8953:30:111"},"nodeType":"YulExpressionStatement","src":"8953:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9003:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9014:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8999:3:111"},"nodeType":"YulFunctionCall","src":"8999:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420707269636520","kind":"string","nodeType":"YulLiteral","src":"9019:34:111","type":"","value":"DepositPaymaster: Invalid price "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8992:6:111"},"nodeType":"YulFunctionCall","src":"8992:62:111"},"nodeType":"YulExpressionStatement","src":"8992:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9074:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9085:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9070:3:111"},"nodeType":"YulFunctionCall","src":"9070:18:111"},{"hexValue":"726174696f","kind":"string","nodeType":"YulLiteral","src":"9090:7:111","type":"","value":"ratio"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9063:6:111"},"nodeType":"YulFunctionCall","src":"9063:35:111"},"nodeType":"YulExpressionStatement","src":"9063:35:111"},{"nodeType":"YulAssignment","src":"9107:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9119:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9130:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9115:3:111"},"nodeType":"YulFunctionCall","src":"9115:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9107:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8890:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8904:4:111","type":""}],"src":"8739:401:111"},{"body":{"nodeType":"YulBlock","src":"9177:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9194:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9197:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9187:6:111"},"nodeType":"YulFunctionCall","src":"9187:88:111"},"nodeType":"YulExpressionStatement","src":"9187:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9291:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9294:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9284:6:111"},"nodeType":"YulFunctionCall","src":"9284:15:111"},"nodeType":"YulExpressionStatement","src":"9284:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9315:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9318:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9308:6:111"},"nodeType":"YulFunctionCall","src":"9308:15:111"},"nodeType":"YulExpressionStatement","src":"9308:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"9145:184:111"},{"body":{"nodeType":"YulBlock","src":"9382:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"9409:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9411:16:111"},"nodeType":"YulFunctionCall","src":"9411:18:111"},"nodeType":"YulExpressionStatement","src":"9411:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9398:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9405:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"9401:3:111"},"nodeType":"YulFunctionCall","src":"9401:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9395:2:111"},"nodeType":"YulFunctionCall","src":"9395:13:111"},"nodeType":"YulIf","src":"9392:39:111"},{"nodeType":"YulAssignment","src":"9440:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9451:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9454:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9447:3:111"},"nodeType":"YulFunctionCall","src":"9447:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"9440:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9365:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9368:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"9374:3:111","type":""}],"src":"9334:128:111"},{"body":{"nodeType":"YulBlock","src":"9641:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9669:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9651:6:111"},"nodeType":"YulFunctionCall","src":"9651:21:111"},"nodeType":"YulExpressionStatement","src":"9651:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9692:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9703:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9688:3:111"},"nodeType":"YulFunctionCall","src":"9688:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9708:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9681:6:111"},"nodeType":"YulFunctionCall","src":"9681:30:111"},"nodeType":"YulExpressionStatement","src":"9681:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9731:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9742:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9727:3:111"},"nodeType":"YulFunctionCall","src":"9727:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20707269636520726174696f206361","kind":"string","nodeType":"YulLiteral","src":"9747:34:111","type":"","value":"DepositPaymaster: price ratio ca"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9720:6:111"},"nodeType":"YulFunctionCall","src":"9720:62:111"},"nodeType":"YulExpressionStatement","src":"9720:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9802:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9813:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9798:3:111"},"nodeType":"YulFunctionCall","src":"9798:18:111"},{"hexValue":"6e6e6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"9818:14:111","type":"","value":"nnot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9791:6:111"},"nodeType":"YulFunctionCall","src":"9791:42:111"},"nodeType":"YulExpressionStatement","src":"9791:42:111"},{"nodeType":"YulAssignment","src":"9842:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9865:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9850:3:111"},"nodeType":"YulFunctionCall","src":"9850:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9842:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9618:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9632:4:111","type":""}],"src":"9467:408:111"},{"body":{"nodeType":"YulBlock","src":"10054:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10071:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10082:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10064:6:111"},"nodeType":"YulFunctionCall","src":"10064:21:111"},"nodeType":"YulExpressionStatement","src":"10064:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10105:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10116:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10101:3:111"},"nodeType":"YulFunctionCall","src":"10101:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10121:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10094:6:111"},"nodeType":"YulFunctionCall","src":"10094:30:111"},"nodeType":"YulExpressionStatement","src":"10094:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10155:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10140:3:111"},"nodeType":"YulFunctionCall","src":"10140:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e","kind":"string","nodeType":"YulLiteral","src":"10160:34:111","type":"","value":"DepositPaymaster: min ratio cann"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10133:6:111"},"nodeType":"YulFunctionCall","src":"10133:62:111"},"nodeType":"YulExpressionStatement","src":"10133:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10215:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10226:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10211:3:111"},"nodeType":"YulFunctionCall","src":"10211:18:111"},{"hexValue":"6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"10231:12:111","type":"","value":"ot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10204:6:111"},"nodeType":"YulFunctionCall","src":"10204:40:111"},"nodeType":"YulExpressionStatement","src":"10204:40:111"},{"nodeType":"YulAssignment","src":"10253:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10276:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10261:3:111"},"nodeType":"YulFunctionCall","src":"10261:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10253:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10031:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10045:4:111","type":""}],"src":"9880:406:111"},{"body":{"nodeType":"YulBlock","src":"10465:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10482:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10493:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10475:6:111"},"nodeType":"YulFunctionCall","src":"10475:21:111"},"nodeType":"YulExpressionStatement","src":"10475:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10516:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10527:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10512:3:111"},"nodeType":"YulFunctionCall","src":"10512:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10532:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10505:6:111"},"nodeType":"YulFunctionCall","src":"10505:30:111"},"nodeType":"YulExpressionStatement","src":"10505:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10555:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10566:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10551:3:111"},"nodeType":"YulFunctionCall","src":"10551:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420746f6b656e","kind":"string","nodeType":"YulLiteral","src":"10571:33:111","type":"","value":"DepositPaymaster: Invalid token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10544:6:111"},"nodeType":"YulFunctionCall","src":"10544:61:111"},"nodeType":"YulExpressionStatement","src":"10544:61:111"},{"nodeType":"YulAssignment","src":"10614:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10626:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10637:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10622:3:111"},"nodeType":"YulFunctionCall","src":"10622:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10614:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10442:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10456:4:111","type":""}],"src":"10291:355:111"},{"body":{"nodeType":"YulBlock","src":"10768:125:111","statements":[{"nodeType":"YulAssignment","src":"10778:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10790:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10801:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10786:3:111"},"nodeType":"YulFunctionCall","src":"10786:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10778:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10820:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10835:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10843:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10831:3:111"},"nodeType":"YulFunctionCall","src":"10831:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10813:6:111"},"nodeType":"YulFunctionCall","src":"10813:74:111"},"nodeType":"YulExpressionStatement","src":"10813:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10737:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10748:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10759:4:111","type":""}],"src":"10651:242:111"},{"body":{"nodeType":"YulBlock","src":"10979:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"11025:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11034:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11037:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11027:6:111"},"nodeType":"YulFunctionCall","src":"11027:12:111"},"nodeType":"YulExpressionStatement","src":"11027:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11000:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11009:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10996:3:111"},"nodeType":"YulFunctionCall","src":"10996:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11021:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10992:3:111"},"nodeType":"YulFunctionCall","src":"10992:32:111"},"nodeType":"YulIf","src":"10989:52:111"},{"nodeType":"YulAssignment","src":"11050:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11066:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11060:5:111"},"nodeType":"YulFunctionCall","src":"11060:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11050:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10945:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10956:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10968:6:111","type":""}],"src":"10898:184:111"},{"body":{"nodeType":"YulBlock","src":"11261:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11278:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11289:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11271:6:111"},"nodeType":"YulFunctionCall","src":"11271:21:111"},"nodeType":"YulExpressionStatement","src":"11271:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11312:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11323:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11308:3:111"},"nodeType":"YulFunctionCall","src":"11308:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11328:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11301:6:111"},"nodeType":"YulFunctionCall","src":"11301:30:111"},"nodeType":"YulExpressionStatement","src":"11301:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11362:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11347:3:111"},"nodeType":"YulFunctionCall","src":"11347:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"11367:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11340:6:111"},"nodeType":"YulFunctionCall","src":"11340:62:111"},"nodeType":"YulExpressionStatement","src":"11340:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11422:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11433:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11418:3:111"},"nodeType":"YulFunctionCall","src":"11418:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"11438:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11411:6:111"},"nodeType":"YulFunctionCall","src":"11411:39:111"},"nodeType":"YulExpressionStatement","src":"11411:39:111"},{"nodeType":"YulAssignment","src":"11459:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11471:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11482:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11467:3:111"},"nodeType":"YulFunctionCall","src":"11467:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11459:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11238:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11252:4:111","type":""}],"src":"11087:405:111"},{"body":{"nodeType":"YulBlock","src":"11546:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"11568:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11570:16:111"},"nodeType":"YulFunctionCall","src":"11570:18:111"},"nodeType":"YulExpressionStatement","src":"11570:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11562:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11565:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11559:2:111"},"nodeType":"YulFunctionCall","src":"11559:8:111"},"nodeType":"YulIf","src":"11556:34:111"},{"nodeType":"YulAssignment","src":"11599:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11611:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11614:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11607:3:111"},"nodeType":"YulFunctionCall","src":"11607:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"11599:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"11528:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"11531:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"11537:4:111","type":""}],"src":"11497:125:111"},{"body":{"nodeType":"YulBlock","src":"11801:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11818:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11829:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11811:6:111"},"nodeType":"YulFunctionCall","src":"11811:21:111"},"nodeType":"YulExpressionStatement","src":"11811:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11852:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11863:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11848:3:111"},"nodeType":"YulFunctionCall","src":"11848:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11868:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11841:6:111"},"nodeType":"YulFunctionCall","src":"11841:30:111"},"nodeType":"YulExpressionStatement","src":"11841:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11902:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11887:3:111"},"nodeType":"YulFunctionCall","src":"11887:18:111"},{"hexValue":"6d696e20726174696f2063616e6e6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"11907:26:111","type":"","value":"min ratio cannot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11880:6:111"},"nodeType":"YulFunctionCall","src":"11880:54:111"},"nodeType":"YulExpressionStatement","src":"11880:54:111"},{"nodeType":"YulAssignment","src":"11943:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11966:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11951:3:111"},"nodeType":"YulFunctionCall","src":"11951:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11943:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11778:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11792:4:111","type":""}],"src":"11627:348:111"},{"body":{"nodeType":"YulBlock","src":"12154:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12171:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12182:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12164:6:111"},"nodeType":"YulFunctionCall","src":"12164:21:111"},"nodeType":"YulExpressionStatement","src":"12164:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12201:3:111"},"nodeType":"YulFunctionCall","src":"12201:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12221:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12194:6:111"},"nodeType":"YulFunctionCall","src":"12194:30:111"},"nodeType":"YulExpressionStatement","src":"12194:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12244:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12255:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12240:3:111"},"nodeType":"YulFunctionCall","src":"12240:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"12260:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12233:6:111"},"nodeType":"YulFunctionCall","src":"12233:62:111"},"nodeType":"YulExpressionStatement","src":"12233:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12315:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12326:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12311:3:111"},"nodeType":"YulFunctionCall","src":"12311:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"12331:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12304:6:111"},"nodeType":"YulFunctionCall","src":"12304:36:111"},"nodeType":"YulExpressionStatement","src":"12304:36:111"},{"nodeType":"YulAssignment","src":"12349:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12372:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12357:3:111"},"nodeType":"YulFunctionCall","src":"12357:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12349:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12131:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12145:4:111","type":""}],"src":"11980:402:111"},{"body":{"nodeType":"YulBlock","src":"12561:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12578:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12589:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12571:6:111"},"nodeType":"YulFunctionCall","src":"12571:21:111"},"nodeType":"YulExpressionStatement","src":"12571:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12612:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12623:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12608:3:111"},"nodeType":"YulFunctionCall","src":"12608:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12628:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12601:6:111"},"nodeType":"YulFunctionCall","src":"12601:30:111"},"nodeType":"YulExpressionStatement","src":"12601:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12651:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12662:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12647:3:111"},"nodeType":"YulFunctionCall","src":"12647:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"12667:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12640:6:111"},"nodeType":"YulFunctionCall","src":"12640:62:111"},"nodeType":"YulExpressionStatement","src":"12640:62:111"},{"nodeType":"YulAssignment","src":"12711:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12734:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12719:3:111"},"nodeType":"YulFunctionCall","src":"12719:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12711:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12538:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12552:4:111","type":""}],"src":"12387:356:111"},{"body":{"nodeType":"YulBlock","src":"12905:241:111","statements":[{"nodeType":"YulAssignment","src":"12915:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12927:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12938:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12923:3:111"},"nodeType":"YulFunctionCall","src":"12923:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12915:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"12950:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12960:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"12954:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13018:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13033:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13041:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13029:3:111"},"nodeType":"YulFunctionCall","src":"13029:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13011:6:111"},"nodeType":"YulFunctionCall","src":"13011:34:111"},"nodeType":"YulExpressionStatement","src":"13011:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13076:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13061:3:111"},"nodeType":"YulFunctionCall","src":"13061:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"13085:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13093:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13081:3:111"},"nodeType":"YulFunctionCall","src":"13081:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13054:6:111"},"nodeType":"YulFunctionCall","src":"13054:43:111"},"nodeType":"YulExpressionStatement","src":"13054:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13117:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13128:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13113:3:111"},"nodeType":"YulFunctionCall","src":"13113:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"13133:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13106:6:111"},"nodeType":"YulFunctionCall","src":"13106:34:111"},"nodeType":"YulExpressionStatement","src":"13106:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12858:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"12869:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12877:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12885:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12896:4:111","type":""}],"src":"12748:398:111"},{"body":{"nodeType":"YulBlock","src":"13325:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13342:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13353:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13335:6:111"},"nodeType":"YulFunctionCall","src":"13335:21:111"},"nodeType":"YulExpressionStatement","src":"13335:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13376:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13387:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13372:3:111"},"nodeType":"YulFunctionCall","src":"13372:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13392:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13365:6:111"},"nodeType":"YulFunctionCall","src":"13365:30:111"},"nodeType":"YulExpressionStatement","src":"13365:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13415:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13426:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13411:3:111"},"nodeType":"YulFunctionCall","src":"13411:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"13431:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13404:6:111"},"nodeType":"YulFunctionCall","src":"13404:51:111"},"nodeType":"YulExpressionStatement","src":"13404:51:111"},{"nodeType":"YulAssignment","src":"13464:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13476:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13487:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13472:3:111"},"nodeType":"YulFunctionCall","src":"13472:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13464:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13302:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13316:4:111","type":""}],"src":"13151:345:111"},{"body":{"nodeType":"YulBlock","src":"13662:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"13709:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13718:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13721:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13711:6:111"},"nodeType":"YulFunctionCall","src":"13711:12:111"},"nodeType":"YulExpressionStatement","src":"13711:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13683:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13692:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13679:3:111"},"nodeType":"YulFunctionCall","src":"13679:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13704:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13675:3:111"},"nodeType":"YulFunctionCall","src":"13675:33:111"},"nodeType":"YulIf","src":"13672:53:111"},{"nodeType":"YulVariableDeclaration","src":"13734:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13760:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13747:12:111"},"nodeType":"YulFunctionCall","src":"13747:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"13738:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13812:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"13779:32:111"},"nodeType":"YulFunctionCall","src":"13779:39:111"},"nodeType":"YulExpressionStatement","src":"13779:39:111"},{"nodeType":"YulAssignment","src":"13827:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13837:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13827:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"13851:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13883:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13894:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13879:3:111"},"nodeType":"YulFunctionCall","src":"13879:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13866:12:111"},"nodeType":"YulFunctionCall","src":"13866:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"13855:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"13940:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"13907:32:111"},"nodeType":"YulFunctionCall","src":"13907:41:111"},"nodeType":"YulExpressionStatement","src":"13907:41:111"},{"nodeType":"YulAssignment","src":"13957:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"13967:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"13957:6:111"}]},{"nodeType":"YulAssignment","src":"13983:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14010:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14021:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14006:3:111"},"nodeType":"YulFunctionCall","src":"14006:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"13993:12:111"},"nodeType":"YulFunctionCall","src":"13993:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"13983:6:111"}]},{"nodeType":"YulAssignment","src":"14034:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14061:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14072:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14057:3:111"},"nodeType":"YulFunctionCall","src":"14057:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14044:12:111"},"nodeType":"YulFunctionCall","src":"14044:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"14034:6:111"}]},{"nodeType":"YulAssignment","src":"14085:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14112:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14123:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14108:3:111"},"nodeType":"YulFunctionCall","src":"14108:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14095:12:111"},"nodeType":"YulFunctionCall","src":"14095:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"14085:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13596:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13607:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13619:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13627:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13635:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"13643:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"13651:6:111","type":""}],"src":"13501:633:111"},{"body":{"nodeType":"YulBlock","src":"14191:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"14310:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14312:16:111"},"nodeType":"YulFunctionCall","src":"14312:18:111"},"nodeType":"YulExpressionStatement","src":"14312:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14222:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14215:6:111"},"nodeType":"YulFunctionCall","src":"14215:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14208:6:111"},"nodeType":"YulFunctionCall","src":"14208:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"14230:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14237:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"14305:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"14233:3:111"},"nodeType":"YulFunctionCall","src":"14233:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14227:2:111"},"nodeType":"YulFunctionCall","src":"14227:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14204:3:111"},"nodeType":"YulFunctionCall","src":"14204:105:111"},"nodeType":"YulIf","src":"14201:131:111"},{"nodeType":"YulAssignment","src":"14341:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14356:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"14359:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"14352:3:111"},"nodeType":"YulFunctionCall","src":"14352:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"14341:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"14170:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"14173:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"14179:7:111","type":""}],"src":"14139:228:111"},{"body":{"nodeType":"YulBlock","src":"14418:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"14449:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14470:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14473:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14463:6:111"},"nodeType":"YulFunctionCall","src":"14463:88:111"},"nodeType":"YulExpressionStatement","src":"14463:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14571:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"14574:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14564:6:111"},"nodeType":"YulFunctionCall","src":"14564:15:111"},"nodeType":"YulExpressionStatement","src":"14564:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14599:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14602:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14592:6:111"},"nodeType":"YulFunctionCall","src":"14592:15:111"},"nodeType":"YulExpressionStatement","src":"14592:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"14438:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14431:6:111"},"nodeType":"YulFunctionCall","src":"14431:9:111"},"nodeType":"YulIf","src":"14428:189:111"},{"nodeType":"YulAssignment","src":"14626:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14635:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"14638:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"14631:3:111"},"nodeType":"YulFunctionCall","src":"14631:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"14626:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"14403:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"14406:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"14412:1:111","type":""}],"src":"14372:274:111"},{"body":{"nodeType":"YulBlock","src":"14683:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14700:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14703:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14693:6:111"},"nodeType":"YulFunctionCall","src":"14693:88:111"},"nodeType":"YulExpressionStatement","src":"14693:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14797:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"14800:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14790:6:111"},"nodeType":"YulFunctionCall","src":"14790:15:111"},"nodeType":"YulExpressionStatement","src":"14790:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14821:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14824:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14814:6:111"},"nodeType":"YulFunctionCall","src":"14814:15:111"},"nodeType":"YulExpressionStatement","src":"14814:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"14651:184:111"},{"body":{"nodeType":"YulBlock","src":"14969:168:111","statements":[{"nodeType":"YulAssignment","src":"14979:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14991:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15002:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14987:3:111"},"nodeType":"YulFunctionCall","src":"14987:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14979:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15021:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15036:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15044:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15032:3:111"},"nodeType":"YulFunctionCall","src":"15032:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15014:6:111"},"nodeType":"YulFunctionCall","src":"15014:74:111"},"nodeType":"YulExpressionStatement","src":"15014:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15108:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15119:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15104:3:111"},"nodeType":"YulFunctionCall","src":"15104:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"15124:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15097:6:111"},"nodeType":"YulFunctionCall","src":"15097:34:111"},"nodeType":"YulExpressionStatement","src":"15097:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14930:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14941:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14949:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14960:4:111","type":""}],"src":"14840:297:111"},{"body":{"nodeType":"YulBlock","src":"15316:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15333:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15344:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15326:6:111"},"nodeType":"YulFunctionCall","src":"15326:21:111"},"nodeType":"YulExpressionStatement","src":"15326:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15367:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15378:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15363:3:111"},"nodeType":"YulFunctionCall","src":"15363:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15383:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15356:6:111"},"nodeType":"YulFunctionCall","src":"15356:30:111"},"nodeType":"YulExpressionStatement","src":"15356:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15406:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15417:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15402:3:111"},"nodeType":"YulFunctionCall","src":"15402:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"15422:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15395:6:111"},"nodeType":"YulFunctionCall","src":"15395:62:111"},"nodeType":"YulExpressionStatement","src":"15395:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15477:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15488:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15473:3:111"},"nodeType":"YulFunctionCall","src":"15473:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"15493:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15466:6:111"},"nodeType":"YulFunctionCall","src":"15466:38:111"},"nodeType":"YulExpressionStatement","src":"15466:38:111"},{"nodeType":"YulAssignment","src":"15513:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15525:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15536:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15521:3:111"},"nodeType":"YulFunctionCall","src":"15521:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15513:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15293:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15307:4:111","type":""}],"src":"15142:404:111"},{"body":{"nodeType":"YulBlock","src":"15645:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15655:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"15694:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15681:12:111"},"nodeType":"YulFunctionCall","src":"15681:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"15659:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15854:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15863:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15866:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15856:6:111"},"nodeType":"YulFunctionCall","src":"15856:12:111"},"nodeType":"YulExpressionStatement","src":"15856:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"15729:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"15757:12:111"},"nodeType":"YulFunctionCall","src":"15757:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"15773:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15753:3:111"},"nodeType":"YulFunctionCall","src":"15753:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"15784:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15749:3:111"},"nodeType":"YulFunctionCall","src":"15749:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15725:3:111"},"nodeType":"YulFunctionCall","src":"15725:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15718:6:111"},"nodeType":"YulFunctionCall","src":"15718:135:111"},"nodeType":"YulIf","src":"15715:155:111"},{"nodeType":"YulVariableDeclaration","src":"15879:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"15897:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"15907:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15893:3:111"},"nodeType":"YulFunctionCall","src":"15893:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"15883:6:111","type":""}]},{"nodeType":"YulAssignment","src":"15935:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"15958:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15945:12:111"},"nodeType":"YulFunctionCall","src":"15945:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"15935:6:111"}]},{"body":{"nodeType":"YulBlock","src":"16008:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16017:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16020:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16010:6:111"},"nodeType":"YulFunctionCall","src":"16010:12:111"},"nodeType":"YulExpressionStatement","src":"16010:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"15980:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15988:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"15977:2:111"},"nodeType":"YulFunctionCall","src":"15977:30:111"},"nodeType":"YulIf","src":"15974:50:111"},{"nodeType":"YulAssignment","src":"16033:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"16045:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16053:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16041:3:111"},"nodeType":"YulFunctionCall","src":"16041:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"16033:4:111"}]},{"body":{"nodeType":"YulBlock","src":"16109:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16118:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16121:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16111:6:111"},"nodeType":"YulFunctionCall","src":"16111:12:111"},"nodeType":"YulExpressionStatement","src":"16111:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"16074:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16084:12:111"},"nodeType":"YulFunctionCall","src":"16084:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"16100:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16080:3:111"},"nodeType":"YulFunctionCall","src":"16080:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"16070:3:111"},"nodeType":"YulFunctionCall","src":"16070:38:111"},"nodeType":"YulIf","src":"16067:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"15602:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"15612:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"15628:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"15634:6:111","type":""}],"src":"15551:580:111"},{"body":{"nodeType":"YulBlock","src":"16310:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16327:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16338:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16320:6:111"},"nodeType":"YulFunctionCall","src":"16320:21:111"},"nodeType":"YulExpressionStatement","src":"16320:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16372:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16357:3:111"},"nodeType":"YulFunctionCall","src":"16357:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16377:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16350:6:111"},"nodeType":"YulFunctionCall","src":"16350:30:111"},"nodeType":"YulExpressionStatement","src":"16350:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16400:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16411:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16396:3:111"},"nodeType":"YulFunctionCall","src":"16396:18:111"},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e644461","kind":"string","nodeType":"YulLiteral","src":"16416:34:111","type":"","value":"DepositPaymaster: paymasterAndDa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16389:6:111"},"nodeType":"YulFunctionCall","src":"16389:62:111"},"nodeType":"YulExpressionStatement","src":"16389:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16471:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16482:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16467:3:111"},"nodeType":"YulFunctionCall","src":"16467:18:111"},{"hexValue":"7461206d757374207370656369667920746f6b656e","kind":"string","nodeType":"YulLiteral","src":"16487:23:111","type":"","value":"ta must specify token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16460:6:111"},"nodeType":"YulFunctionCall","src":"16460:51:111"},"nodeType":"YulExpressionStatement","src":"16460:51:111"},{"nodeType":"YulAssignment","src":"16520:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16532:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16543:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16528:3:111"},"nodeType":"YulFunctionCall","src":"16528:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16520:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16287:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16301:4:111","type":""}],"src":"16136:417:111"},{"body":{"nodeType":"YulBlock","src":"16688:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"16726:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16735:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16738:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16728:6:111"},"nodeType":"YulFunctionCall","src":"16728:12:111"},"nodeType":"YulExpressionStatement","src":"16728:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"16704:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"16716:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16701:2:111"},"nodeType":"YulFunctionCall","src":"16701:24:111"},"nodeType":"YulIf","src":"16698:44:111"},{"body":{"nodeType":"YulBlock","src":"16775:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16784:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16787:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16777:6:111"},"nodeType":"YulFunctionCall","src":"16777:12:111"},"nodeType":"YulExpressionStatement","src":"16777:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"16757:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"16767:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16754:2:111"},"nodeType":"YulFunctionCall","src":"16754:20:111"},"nodeType":"YulIf","src":"16751:40:111"},{"nodeType":"YulAssignment","src":"16800:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"16817:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"16825:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16813:3:111"},"nodeType":"YulFunctionCall","src":"16813:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"16800:9:111"}]},{"nodeType":"YulAssignment","src":"16845:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"16862:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"16872:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16858:3:111"},"nodeType":"YulFunctionCall","src":"16858:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"16845:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"16622:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16630:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"16638:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"16650:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"16663:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"16674:9:111","type":""}],"src":"16558:331:111"},{"body":{"nodeType":"YulBlock","src":"16995:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17005:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"17028:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17015:12:111"},"nodeType":"YulFunctionCall","src":"17015:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"17009:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17043:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"17053:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"17047:2:111","type":""}]},{"nodeType":"YulAssignment","src":"17128:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"17141:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17145:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17137:3:111"},"nodeType":"YulFunctionCall","src":"17137:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"17128:5:111"}]},{"body":{"nodeType":"YulBlock","src":"17180:80:111","statements":[{"nodeType":"YulAssignment","src":"17194:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"17211:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17223:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17230:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"17234:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17226:3:111"},"nodeType":"YulFunctionCall","src":"17226:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"17219:3:111"},"nodeType":"YulFunctionCall","src":"17219:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17241:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"17215:3:111"},"nodeType":"YulFunctionCall","src":"17215:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17207:3:111"},"nodeType":"YulFunctionCall","src":"17207:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17247:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17203:3:111"},"nodeType":"YulFunctionCall","src":"17203:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"17194:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"17163:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17168:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"17160:2:111"},"nodeType":"YulFunctionCall","src":"17160:11:111"},"nodeType":"YulIf","src":"17157:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"16970:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"16977:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"16985:5:111","type":""}],"src":"16894:372:111"},{"body":{"nodeType":"YulBlock","src":"17445:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17462:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17473:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17455:6:111"},"nodeType":"YulFunctionCall","src":"17455:21:111"},"nodeType":"YulExpressionStatement","src":"17455:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17496:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17507:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17492:3:111"},"nodeType":"YulFunctionCall","src":"17492:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17512:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17485:6:111"},"nodeType":"YulFunctionCall","src":"17485:30:111"},"nodeType":"YulExpressionStatement","src":"17485:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17535:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17546:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17531:3:111"},"nodeType":"YulFunctionCall","src":"17531:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"17551:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17524:6:111"},"nodeType":"YulFunctionCall","src":"17524:62:111"},"nodeType":"YulExpressionStatement","src":"17524:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17606:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17617:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17602:3:111"},"nodeType":"YulFunctionCall","src":"17602:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"17622:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17595:6:111"},"nodeType":"YulFunctionCall","src":"17595:34:111"},"nodeType":"YulExpressionStatement","src":"17595:34:111"},{"nodeType":"YulAssignment","src":"17638:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17650:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17661:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17646:3:111"},"nodeType":"YulFunctionCall","src":"17646:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17638:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17422:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17436:4:111","type":""}],"src":"17271:400:111"},{"body":{"nodeType":"YulBlock","src":"17850:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17878:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17860:6:111"},"nodeType":"YulFunctionCall","src":"17860:21:111"},"nodeType":"YulExpressionStatement","src":"17860:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17901:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17912:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17897:3:111"},"nodeType":"YulFunctionCall","src":"17897:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17917:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17890:6:111"},"nodeType":"YulFunctionCall","src":"17890:30:111"},"nodeType":"YulExpressionStatement","src":"17890:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17940:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17951:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17936:3:111"},"nodeType":"YulFunctionCall","src":"17936:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"17956:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17929:6:111"},"nodeType":"YulFunctionCall","src":"17929:62:111"},"nodeType":"YulExpressionStatement","src":"17929:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18011:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18022:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18007:3:111"},"nodeType":"YulFunctionCall","src":"18007:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"18027:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18000:6:111"},"nodeType":"YulFunctionCall","src":"18000:31:111"},"nodeType":"YulExpressionStatement","src":"18000:31:111"},{"nodeType":"YulAssignment","src":"18040:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18052:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18063:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18048:3:111"},"nodeType":"YulFunctionCall","src":"18048:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18040:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17827:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17841:4:111","type":""}],"src":"17676:397:111"},{"body":{"nodeType":"YulBlock","src":"18306:329:111","statements":[{"nodeType":"YulAssignment","src":"18316:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18328:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18339:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18324:3:111"},"nodeType":"YulFunctionCall","src":"18324:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18316:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"18352:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18362:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"18356:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18420:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"18435:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"18443:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18431:3:111"},"nodeType":"YulFunctionCall","src":"18431:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18413:6:111"},"nodeType":"YulFunctionCall","src":"18413:34:111"},"nodeType":"YulExpressionStatement","src":"18413:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18467:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18478:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18463:3:111"},"nodeType":"YulFunctionCall","src":"18463:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"18487:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"18495:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18483:3:111"},"nodeType":"YulFunctionCall","src":"18483:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18456:6:111"},"nodeType":"YulFunctionCall","src":"18456:43:111"},"nodeType":"YulExpressionStatement","src":"18456:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18519:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18530:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18515:3:111"},"nodeType":"YulFunctionCall","src":"18515:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"18535:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18508:6:111"},"nodeType":"YulFunctionCall","src":"18508:34:111"},"nodeType":"YulExpressionStatement","src":"18508:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18562:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18573:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18558:3:111"},"nodeType":"YulFunctionCall","src":"18558:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"18578:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18551:6:111"},"nodeType":"YulFunctionCall","src":"18551:34:111"},"nodeType":"YulExpressionStatement","src":"18551:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18605:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18616:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18601:3:111"},"nodeType":"YulFunctionCall","src":"18601:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"18622:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18594:6:111"},"nodeType":"YulFunctionCall","src":"18594:35:111"},"nodeType":"YulExpressionStatement","src":"18594:35:111"}]},"name":"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18243:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"18254:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"18262:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"18270:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"18278:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18286:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18297:4:111","type":""}],"src":"18078:557:111"},{"body":{"nodeType":"YulBlock","src":"18718:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"18764:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18773:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18776:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18766:6:111"},"nodeType":"YulFunctionCall","src":"18766:12:111"},"nodeType":"YulExpressionStatement","src":"18766:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"18739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"18748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18735:3:111"},"nodeType":"YulFunctionCall","src":"18735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"18760:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18731:3:111"},"nodeType":"YulFunctionCall","src":"18731:32:111"},"nodeType":"YulIf","src":"18728:52:111"},{"nodeType":"YulVariableDeclaration","src":"18789:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18808:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18802:5:111"},"nodeType":"YulFunctionCall","src":"18802:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"18793:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18871:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18880:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18883:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18873:6:111"},"nodeType":"YulFunctionCall","src":"18873:12:111"},"nodeType":"YulExpressionStatement","src":"18873:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18840:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18861:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18854:6:111"},"nodeType":"YulFunctionCall","src":"18854:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18847:6:111"},"nodeType":"YulFunctionCall","src":"18847:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"18837:2:111"},"nodeType":"YulFunctionCall","src":"18837:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18830:6:111"},"nodeType":"YulFunctionCall","src":"18830:40:111"},"nodeType":"YulIf","src":"18827:60:111"},{"nodeType":"YulAssignment","src":"18896:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"18906:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18896:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18684:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"18695:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"18707:6:111","type":""}],"src":"18640:277:111"},{"body":{"nodeType":"YulBlock","src":"19096:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19113:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19124:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19106:6:111"},"nodeType":"YulFunctionCall","src":"19106:21:111"},"nodeType":"YulExpressionStatement","src":"19106:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19147:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19158:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19143:3:111"},"nodeType":"YulFunctionCall","src":"19143:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19163:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19136:6:111"},"nodeType":"YulFunctionCall","src":"19136:30:111"},"nodeType":"YulExpressionStatement","src":"19136:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19186:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19197:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19182:3:111"},"nodeType":"YulFunctionCall","src":"19182:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"19202:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19175:6:111"},"nodeType":"YulFunctionCall","src":"19175:62:111"},"nodeType":"YulExpressionStatement","src":"19175:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19257:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19268:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19253:3:111"},"nodeType":"YulFunctionCall","src":"19253:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"19273:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19246:6:111"},"nodeType":"YulFunctionCall","src":"19246:40:111"},"nodeType":"YulExpressionStatement","src":"19246:40:111"},{"nodeType":"YulAssignment","src":"19295:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19318:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19303:3:111"},"nodeType":"YulFunctionCall","src":"19303:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19295:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19073:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19087:4:111","type":""}],"src":"18922:406:111"},{"body":{"nodeType":"YulBlock","src":"19397:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"19407:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"19422:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"19411:7:111","type":""}]},{"nodeType":"YulAssignment","src":"19432:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"19441:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19432:5:111"}]},{"nodeType":"YulAssignment","src":"19457:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"19465:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"19457:4:111"}]},{"body":{"nodeType":"YulBlock","src":"19521:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"19626:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"19628:16:111"},"nodeType":"YulFunctionCall","src":"19628:18:111"},"nodeType":"YulExpressionStatement","src":"19628:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19541:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19551:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"19619:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"19547:3:111"},"nodeType":"YulFunctionCall","src":"19547:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19538:2:111"},"nodeType":"YulFunctionCall","src":"19538:87:111"},"nodeType":"YulIf","src":"19535:113:111"},{"body":{"nodeType":"YulBlock","src":"19687:29:111","statements":[{"nodeType":"YulAssignment","src":"19689:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"19702:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"19709:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"19698:3:111"},"nodeType":"YulFunctionCall","src":"19698:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19689:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"19668:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"19678:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19664:3:111"},"nodeType":"YulFunctionCall","src":"19664:22:111"},"nodeType":"YulIf","src":"19661:55:111"},{"nodeType":"YulAssignment","src":"19729:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19741:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"19747:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"19737:3:111"},"nodeType":"YulFunctionCall","src":"19737:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"19729:4:111"}]},{"nodeType":"YulAssignment","src":"19765:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"19781:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"19790:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"19777:3:111"},"nodeType":"YulFunctionCall","src":"19777:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"19765:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"19490:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"19500:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19487:2:111"},"nodeType":"YulFunctionCall","src":"19487:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"19509:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"19483:3:111","statements":[]},"src":"19479:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"19361:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"19368:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"19381:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"19388:4:111","type":""}],"src":"19333:482:111"},{"body":{"nodeType":"YulBlock","src":"19879:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"19917:52:111","statements":[{"nodeType":"YulAssignment","src":"19931:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"19940:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"19931:5:111"}]},{"nodeType":"YulLeave","src":"19954:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"19899:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19892:6:111"},"nodeType":"YulFunctionCall","src":"19892:16:111"},"nodeType":"YulIf","src":"19889:80:111"},{"body":{"nodeType":"YulBlock","src":"20002:52:111","statements":[{"nodeType":"YulAssignment","src":"20016:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20025:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20016:5:111"}]},{"nodeType":"YulLeave","src":"20039:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"19988:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19981:6:111"},"nodeType":"YulFunctionCall","src":"19981:12:111"},"nodeType":"YulIf","src":"19978:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"20090:52:111","statements":[{"nodeType":"YulAssignment","src":"20104:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20113:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20104:5:111"}]},{"nodeType":"YulLeave","src":"20127:5:111"}]},"nodeType":"YulCase","src":"20083:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20088:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"20158:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"20193:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"20195:16:111"},"nodeType":"YulFunctionCall","src":"20195:18:111"},"nodeType":"YulExpressionStatement","src":"20195:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"20178:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"20188:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20175:2:111"},"nodeType":"YulFunctionCall","src":"20175:17:111"},"nodeType":"YulIf","src":"20172:43:111"},{"nodeType":"YulAssignment","src":"20228:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"20241:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"20251:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"20237:3:111"},"nodeType":"YulFunctionCall","src":"20237:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20228:5:111"}]},{"nodeType":"YulLeave","src":"20266:5:111"}]},"nodeType":"YulCase","src":"20151:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20156:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"20070:4:111"},"nodeType":"YulSwitch","src":"20063:218:111"},{"body":{"nodeType":"YulBlock","src":"20379:70:111","statements":[{"nodeType":"YulAssignment","src":"20393:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"20406:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"20412:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"20402:3:111"},"nodeType":"YulFunctionCall","src":"20402:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20393:5:111"}]},{"nodeType":"YulLeave","src":"20434:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"20303:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"20309:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"20300:2:111"},"nodeType":"YulFunctionCall","src":"20300:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"20317:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"20327:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"20314:2:111"},"nodeType":"YulFunctionCall","src":"20314:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20296:3:111"},"nodeType":"YulFunctionCall","src":"20296:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"20340:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"20346:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"20337:2:111"},"nodeType":"YulFunctionCall","src":"20337:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"20355:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"20365:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"20352:2:111"},"nodeType":"YulFunctionCall","src":"20352:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20333:3:111"},"nodeType":"YulFunctionCall","src":"20333:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"20293:2:111"},"nodeType":"YulFunctionCall","src":"20293:77:111"},"nodeType":"YulIf","src":"20290:159:111"},{"nodeType":"YulVariableDeclaration","src":"20458:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"20500:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"20506:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"20481:18:111"},"nodeType":"YulFunctionCall","src":"20481:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"20462:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"20471:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"20620:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"20622:16:111"},"nodeType":"YulFunctionCall","src":"20622:18:111"},"nodeType":"YulExpressionStatement","src":"20622:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"20530:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20543:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"20611:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"20539:3:111"},"nodeType":"YulFunctionCall","src":"20539:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20527:2:111"},"nodeType":"YulFunctionCall","src":"20527:92:111"},"nodeType":"YulIf","src":"20524:118:111"},{"nodeType":"YulAssignment","src":"20651:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"20664:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"20673:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"20660:3:111"},"nodeType":"YulFunctionCall","src":"20660:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20651:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"19850:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"19856:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"19869:5:111","type":""}],"src":"19820:866:111"},{"body":{"nodeType":"YulBlock","src":"20761:61:111","statements":[{"nodeType":"YulAssignment","src":"20771:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"20801:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"20807:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"20780:20:111"},"nodeType":"YulFunctionCall","src":"20780:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"20771:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"20732:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"20738:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"20751:5:111","type":""}],"src":"20691:131:111"},{"body":{"nodeType":"YulBlock","src":"20874:148:111","statements":[{"nodeType":"YulVariableDeclaration","src":"20884:23:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"20899:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"20902:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20895:3:111"},"nodeType":"YulFunctionCall","src":"20895:12:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"20888:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"20916:23:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"20931:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"20934:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20927:3:111"},"nodeType":"YulFunctionCall","src":"20927:12:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"20920:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"20964:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"20966:16:111"},"nodeType":"YulFunctionCall","src":"20966:18:111"},"nodeType":"YulExpressionStatement","src":"20966:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"20954:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"20959:3:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"20951:2:111"},"nodeType":"YulFunctionCall","src":"20951:12:111"},"nodeType":"YulIf","src":"20948:38:111"},{"nodeType":"YulAssignment","src":"20995:21:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"21007:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"21012:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"21003:3:111"},"nodeType":"YulFunctionCall","src":"21003:13:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"20995:4:111"}]}]},"name":"checked_sub_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"20856:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"20859:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"20865:4:111","type":""}],"src":"20827:195:111"},{"body":{"nodeType":"YulBlock","src":"21095:72:111","statements":[{"nodeType":"YulAssignment","src":"21105:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"21135:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"21145:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"21155:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"21141:3:111"},"nodeType":"YulFunctionCall","src":"21141:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"21114:20:111"},"nodeType":"YulFunctionCall","src":"21114:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"21105:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"21066:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"21072:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"21085:5:111","type":""}],"src":"21027:140:111"},{"body":{"nodeType":"YulBlock","src":"21346:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21363:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21374:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21356:6:111"},"nodeType":"YulFunctionCall","src":"21356:21:111"},"nodeType":"YulExpressionStatement","src":"21356:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21408:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21393:3:111"},"nodeType":"YulFunctionCall","src":"21393:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21413:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21386:6:111"},"nodeType":"YulFunctionCall","src":"21386:30:111"},"nodeType":"YulExpressionStatement","src":"21386:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21436:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21447:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21432:3:111"},"nodeType":"YulFunctionCall","src":"21432:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"21452:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21425:6:111"},"nodeType":"YulFunctionCall","src":"21425:62:111"},"nodeType":"YulExpressionStatement","src":"21425:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21507:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21518:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21503:3:111"},"nodeType":"YulFunctionCall","src":"21503:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"21523:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21496:6:111"},"nodeType":"YulFunctionCall","src":"21496:36:111"},"nodeType":"YulExpressionStatement","src":"21496:36:111"},{"nodeType":"YulAssignment","src":"21541:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21564:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21549:3:111"},"nodeType":"YulFunctionCall","src":"21549:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21541:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21323:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21337:4:111","type":""}],"src":"21172:402:111"},{"body":{"nodeType":"YulBlock","src":"21716:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"21726:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21746:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21740:5:111"},"nodeType":"YulFunctionCall","src":"21740:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"21730:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21788:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21796:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21784:3:111"},"nodeType":"YulFunctionCall","src":"21784:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"21803:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"21808:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"21762:21:111"},"nodeType":"YulFunctionCall","src":"21762:53:111"},"nodeType":"YulExpressionStatement","src":"21762:53:111"},{"nodeType":"YulAssignment","src":"21824:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21835:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"21840:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21831:3:111"},"nodeType":"YulFunctionCall","src":"21831:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"21824:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"21692:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"21697:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"21708:3:111","type":""}],"src":"21579:274:111"},{"body":{"nodeType":"YulBlock","src":"22032:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22049:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22060:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22042:6:111"},"nodeType":"YulFunctionCall","src":"22042:21:111"},"nodeType":"YulExpressionStatement","src":"22042:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22083:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22094:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22079:3:111"},"nodeType":"YulFunctionCall","src":"22079:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"22099:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22072:6:111"},"nodeType":"YulFunctionCall","src":"22072:30:111"},"nodeType":"YulExpressionStatement","src":"22072:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22122:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22133:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22118:3:111"},"nodeType":"YulFunctionCall","src":"22118:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"22138:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22111:6:111"},"nodeType":"YulFunctionCall","src":"22111:59:111"},"nodeType":"YulExpressionStatement","src":"22111:59:111"},{"nodeType":"YulAssignment","src":"22179:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22191:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22202:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22187:3:111"},"nodeType":"YulFunctionCall","src":"22187:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"22179:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22009:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22023:4:111","type":""}],"src":"21858:353:111"},{"body":{"nodeType":"YulBlock","src":"22337:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22354:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22365:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22347:6:111"},"nodeType":"YulFunctionCall","src":"22347:21:111"},"nodeType":"YulExpressionStatement","src":"22347:21:111"},{"nodeType":"YulAssignment","src":"22377:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"22402:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22414:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22425:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22410:3:111"},"nodeType":"YulFunctionCall","src":"22410:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"22385:16:111"},"nodeType":"YulFunctionCall","src":"22385:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"22377:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22306:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"22317:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22328:4:111","type":""}],"src":"22216:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n if iszero(eq(value_1, and(value_1, 0xff))) { revert(0, 0) }\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n value5 := calldataload(add(headStart, 160))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"DepositPaymaster: unsupported to\")\n mstore(add(headStart, 96), \"ken\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"DepositPaymaster: Invalid price \")\n mstore(add(headStart, 96), \"ratio\")\n tail := add(headStart, 128)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"DepositPaymaster: price ratio ca\")\n mstore(add(headStart, 96), \"nnot be zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"DepositPaymaster: min ratio cann\")\n mstore(add(headStart, 96), \"ot be zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"DepositPaymaster: Invalid token\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"min ratio cannot be zero\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"DepositPaymaster: paymasterAndDa\")\n mstore(add(headStart, 96), \"ta must specify token\")\n tail := add(headStart, 128)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n let x_1 := and(x, 0xff)\n let y_1 := and(y, 0xff)\n if lt(x_1, y_1) { panic_error_0x11() }\n diff := sub(x_1, y_1)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1061},{"length":32,"start":1469},{"length":32,"start":1645},{"length":32,"start":3091},{"length":32,"start":3264},{"length":32,"start":3408},{"length":32,"start":3809},{"length":32,"start":4750}]},"linkReferences":{},"object":"60806040526004361061018b5760003560e01c8063a9a23409116100d6578063cc9c837c1161007f578063e29db4dc11610059578063e29db4dc14610513578063f2fde38b14610533578063f465c77e1461055357600080fd5b8063cc9c837c146104c9578063cd8f80c2146104e9578063d0e30db01461050b57600080fd5b8063c23a5cea116100b0578063c23a5cea1461045c578063c23f001f1461047c578063c399ec88146104b457600080fd5b8063a9a23409146103f3578063b0d691fe14610413578063bb9fe6bf1461044757600080fd5b80634a6f84cf11610138578063796d437111610112578063796d4371146103875780638da5cb5b1461039d5780639ed0fb68146103cf57600080fd5b80634a6f84cf14610317578063715018a614610352578063763d9c791461036757600080fd5b8063382edd9e11610169578063382edd9e146101e5578063439a70b214610205578063493b0170146102b057600080fd5b80630396cb6014610190578063205c2878146101a557806324ee2999146101c5575b600080fd5b6101a361019e366004611b26565b610581565b005b3480156101b157600080fd5b506101a36101c0366004611b61565b610626565b3480156101d157600080fd5b506101a36101e0366004611b61565b6106b1565b3480156101f157600080fd5b506101a3610200366004611b8d565b610823565b34801561021157600080fd5b50610272610220366004611bce565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0385169474010000000000000000000000000000000000000000900460ff16939086565b604080516001600160a01b03909716875260ff9095166020870152938501929092526060840152608083015260a082015260c0015b60405180910390f35b3480156102bc57600080fd5b506103026102cb366004611beb565b6001600160a01b03918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152016102a7565b34801561032357600080fd5b50610344610332366004611bce565b60036020526000908152604090205481565b6040519081526020016102a7565b34801561035e57600080fd5b506101a361092b565b34801561037357600080fd5b506101a3610382366004611c24565b61093f565b34801561039357600080fd5b506103446188b881565b3480156103a957600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102a7565b3480156103db57600080fd5b506101a3336000908152600360205260409020439055565b3480156103ff57600080fd5b506101a361040e366004611c83565b610bef565b34801561041f57600080fd5b506103b77f000000000000000000000000000000000000000000000000000000000000000081565b34801561045357600080fd5b506101a3610c09565b34801561046857600080fd5b506101a3610477366004611bce565b610c80565b34801561048857600080fd5b50610344610497366004611beb565b600260209081526000928352604080842090915290825290205481565b3480156104c057600080fd5b50610344610d1f565b3480156104d557600080fd5b506101a36104e4366004611b8d565b610dc8565b3480156104f557600080fd5b506101a333600090815260036020526040812055565b6101a3610eb3565b34801561051f57600080fd5b506101a361052e366004611d12565b610f2e565b34801561053f57600080fd5b506101a361054e366004611bce565b61103f565b34801561055f57600080fd5b5061057361056e366004611d4d565b6110cf565b6040516102a7929190611e17565b6105896110f2565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561060a57600080fd5b505af115801561061e573d6000803e3d6000fd5b505050505050565b61062e6110f2565b6040517f205c28780000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561060a57600080fd5b6106b96110f2565b6001600160a01b038281166000908152600160205260409020541661074b5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260016020526040902060030154811080159061079157506001600160a01b0382166000908152600160205260409020600401548111155b6108035760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f0000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b0390911660009081526001602081905260409091200155565b6108386001600160a01b03841633308461114c565b6001600160a01b03838116600090815260016020526040902054166108c55760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038084166000908152600260209081526040808320938616835292905290812080548392906108fc908490611e68565b90915550506001600160a01b03821633036109265761092633600090815260036020526040812055565b505050565b6109336110f2565b61093d600061121b565b565b6109476110f2565b6001600160a01b03868116600090815260016020526040902054161561096c57600080fd5b836000036109e25760405162461bcd60e51b815260206004820152602c60248201527f4465706f7369745061796d61737465723a20707269636520726174696f20636160448201527f6e6e6f74206265207a65726f00000000000000000000000000000000000000006064820152608401610742565b81600003610a585760405162461bcd60e51b815260206004820152602a60248201527f4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e60448201527f6f74206265207a65726f000000000000000000000000000000000000000000006064820152608401610742565b818410158015610a685750808411155b610ada5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f0000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038616610b305760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369745061796d61737465723a20496e76616c696420746f6b656e006044820152606401610742565b6040805160c0810182526001600160a01b0397881680825260ff9788166020808401918252838501988952606084019788526080840196875260a0840195865260009283526001908190529390912091518254915199167fffffffffffffffffffffff000000000000000000000000000000000000000000909116177401000000000000000000000000000000000000000098909716979097029590951786559251938501939093555160028401559051600383015551600490910155565b610bf7611283565b610c03848484846112fb565b50505050565b610c116110f2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6c57600080fd5b505af1158015610c03573d6000803e3d6000fd5b610c886110f2565b6040517fc23a5cea0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190611e80565b905090565b3360009081526003602052604090205415801590610df457503360009081526003602052604090205443115b610e665760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038316600090815260026020908152604080832033845290915281208054839290610e99908490611e99565b9091555061092690506001600160a01b0384168383611425565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d0457600080fd5b610f366110f2565b6001600160a01b0384811660009081526001602052604090205416610fc35760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b816000036110135760405162461bcd60e51b815260206004820152601860248201527f6d696e20726174696f2063616e6e6f74206265207a65726f00000000000000006044820152606401610742565b6001600160a01b0390931660009081526001602052604090206002810192909255600382015560040155565b6110476110f2565b6001600160a01b0381166110c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610742565b6110cc8161121b565b50565b606060006110db611283565b6110e685858561146e565b91509150935093915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610742565b6040516001600160a01b0380851660248301528316604482015260648101829052610c039085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611728565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461093d5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610742565b60008080808061130d87890189611eb0565b9450945094509450945060008183856188b86113299190611f01565b611333908a611e68565b61133d9190611f01565b6113479190611f3e565b905060028a600281111561135d5761135d611f79565b1461137c576113776001600160a01b03861687308461114c565b6113b9565b6001600160a01b038086166000908152600260209081526040808320938a16835292905290812080548392906113b3908490611e99565b90915550505b6001600160a01b038516600090815260026020526040812082916113e56000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546114149190611e68565b909155505050505050505050505050565b6040516001600160a01b0383166024820152604481018290526109269084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611199565b606060006188b88560a00135116114ed5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610742565b3660006114fe610120880188611fa8565b9092509050602881146115795760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e00000000000000000000006064820152608401610742565b60006115888260148186612014565b6115919161203e565b60601c9050873560006115a4838961180d565b905060006115b18b611940565b6001600160a01b0384166000908152600360205260409020549091501561163f5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b038085166000908152600260209081526040808320938716835292905220548211156116da5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610742565b604080516001600160a01b03948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b600061177d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661196f9092919063ffffffff16565b805190915015610926578080602001905181019061179b9190612086565b6109265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b0382811660009081526001602052604081205490911661189c5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610742565b6001600160a01b03831660009081526001602081905260408220908101546002909101546118cb90600a6121c8565b6118d59085611f01565b6118df9190611f3e565b6001600160a01b0385166000908152600160205260409020549091506119219074010000000000000000000000000000000000000000900460ff1660126121d4565b61192c90600a6121f7565b6119369082611f3e565b9150505b92915050565b600060e082013561010083013580820361195b575092915050565b6119678248830161197e565b949350505050565b60606119678484600085611996565b600081831061198d578161198f565b825b9392505050565b606082471015611a0e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610742565b600080866001600160a01b03168587604051611a2a9190612206565b60006040518083038185875af1925050503d8060008114611a67576040519150601f19603f3d011682016040523d82523d6000602084013e611a6c565b606091505b5091509150611a7d87838387611a88565b979650505050505050565b60608315611af7578251600003611af0576001600160a01b0385163b611af05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610742565b5081611967565b6119678383815115611b0c5781518083602001fd5b8060405162461bcd60e51b81526004016107429190612222565b600060208284031215611b3857600080fd5b813563ffffffff8116811461198f57600080fd5b6001600160a01b03811681146110cc57600080fd5b60008060408385031215611b7457600080fd5b8235611b7f81611b4c565b946020939093013593505050565b600080600060608486031215611ba257600080fd5b8335611bad81611b4c565b92506020840135611bbd81611b4c565b929592945050506040919091013590565b600060208284031215611be057600080fd5b813561198f81611b4c565b60008060408385031215611bfe57600080fd5b8235611c0981611b4c565b91506020830135611c1981611b4c565b809150509250929050565b60008060008060008060c08789031215611c3d57600080fd5b8635611c4881611b4c565b9550602087013560ff81168114611c5e57600080fd5b95989597505050506040840135936060810135936080820135935060a0909101359150565b60008060008060608587031215611c9957600080fd5b843560038110611ca857600080fd5b9350602085013567ffffffffffffffff80821115611cc557600080fd5b818701915087601f830112611cd957600080fd5b813581811115611ce857600080fd5b886020828501011115611cfa57600080fd5b95986020929092019750949560400135945092505050565b60008060008060808587031215611d2857600080fd5b8435611d3381611b4c565b966020860135965060408601359560600135945092505050565b600080600060608486031215611d6257600080fd5b833567ffffffffffffffff811115611d7957600080fd5b84016101608187031215611d8c57600080fd5b95602085013595506040909401359392505050565b60005b83811015611dbc578181015183820152602001611da4565b83811115610c035750506000910152565b60008151808452611de5816020860160208601611da1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611e2a6040830185611dcd565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611e7b57611e7b611e39565b500190565b600060208284031215611e9257600080fd5b5051919050565b600082821015611eab57611eab611e39565b500390565b600080600080600060a08688031215611ec857600080fd5b8535611ed381611b4c565b94506020860135611ee381611b4c565b94979496505050506040830135926060810135926080909101359150565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f3957611f39611e39565b500290565b600082611f74577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fdd57600080fd5b83018035915067ffffffffffffffff821115611ff857600080fd5b60200191503681900382131561200d57600080fd5b9250929050565b6000808585111561202457600080fd5b8386111561203157600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561207e5780818660140360031b1b83161692505b505092915050565b60006020828403121561209857600080fd5b8151801515811461198f57600080fd5b600181815b8085111561210157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156120e7576120e7611e39565b808516156120f457918102915b93841c93908002906120ad565b509250929050565b6000826121185750600161193a565b816121255750600061193a565b816001811461213b576002811461214557612161565b600191505061193a565b60ff84111561215657612156611e39565b50506001821b61193a565b5060208310610133831016604e8410600b8410161715612184575081810a61193a565b61218e83836120a8565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156121c0576121c0611e39565b029392505050565b600061198f8383612109565b600060ff821660ff8416808210156121ee576121ee611e39565b90039392505050565b600061198f60ff841683612109565b60008251612218818460208701611da1565b9190910192915050565b60208152600061198f6020830184611dcd56fea264697066735822122025c4923ee775600d836609ca799d047a8fbdce37843bfb903a4c8b927a4b424464736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xCC9C837C GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE29DB4DC GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE29DB4DC EQ PUSH2 0x513 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x553 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x4C9 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x4E9 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45C JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x47C JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x413 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x796D4371 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x387 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x763D9C79 EQ PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x439A70B2 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x24EE2999 EQ PUSH2 0x1C5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x1B26 JUMP JUMPDEST PUSH2 0x581 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x1C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x626 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x6B1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x200 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B8D JUMP JUMPDEST PUSH2 0x823 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x272 PUSH2 0x220 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP5 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP4 SWAP1 DUP7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP8 AND DUP8 MSTORE PUSH1 0xFF SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x2CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1BEB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x332 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x92B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C24 JUMP JUMPDEST PUSH2 0x93F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x40E CALLDATASIZE PUSH1 0x4 PUSH2 0x1C83 JUMP JUMPDEST PUSH2 0xBEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B7 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0xC09 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x477 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0xC80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x488 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0x497 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BEB JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x344 PUSH2 0xD1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x4E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B8D JUMP JUMPDEST PUSH2 0xDC8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0xEB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x52E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D12 JUMP JUMPDEST PUSH2 0xF2E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x54E CALLDATASIZE PUSH1 0x4 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0x103F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x573 PUSH2 0x56E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4D JUMP JUMPDEST PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2A7 SWAP3 SWAP2 SWAP1 PUSH2 0x1E17 JUMP JUMPDEST PUSH2 0x589 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x61E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x62E PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6B9 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x74B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP2 LT DUP1 ISZERO SWAP1 PUSH2 0x791 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD DUP2 GT ISZERO JUMPDEST PUSH2 0x803 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH2 0x838 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND CALLER ADDRESS DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x8C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x8FC SWAP1 DUP5 SWAP1 PUSH2 0x1E68 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND CALLER SUB PUSH2 0x926 JUMPI PUSH2 0x926 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x933 PUSH2 0x10F2 JUMP JUMPDEST PUSH2 0x93D PUSH1 0x0 PUSH2 0x121B JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x947 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 SUB PUSH2 0x9E2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20707269636520726174696F206361 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E6E6F74206265207A65726F0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0xA58 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D696E20726174696F2063616E6E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206265207A65726F00000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0xA68 JUMPI POP DUP1 DUP5 GT ISZERO JUMPDEST PUSH2 0xADA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420746F6B656E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP1 DUP3 MSTORE PUSH1 0xFF SWAP8 DUP9 AND PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE DUP4 DUP6 ADD SWAP9 DUP10 MSTORE PUSH1 0x60 DUP5 ADD SWAP8 DUP9 MSTORE PUSH1 0x80 DUP5 ADD SWAP7 DUP8 MSTORE PUSH1 0xA0 DUP5 ADD SWAP6 DUP7 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 SWAP1 DUP2 SWAP1 MSTORE SWAP4 SWAP1 SWAP2 KECCAK256 SWAP2 MLOAD DUP3 SLOAD SWAP2 MLOAD SWAP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR PUSH21 0x10000000000000000000000000000000000000000 SWAP9 SWAP1 SWAP8 AND SWAP8 SWAP1 SWAP8 MUL SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE SWAP3 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 SSTORE MLOAD PUSH1 0x2 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x3 DUP4 ADD SSTORE MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH2 0xBF7 PUSH2 0x1283 JUMP JUMPDEST PUSH2 0xC03 DUP5 DUP5 DUP5 DUP5 PUSH2 0x12FB JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC11 PUSH2 0x10F2 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC88 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD18 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDC3 SWAP2 SWAP1 PUSH2 0x1E80 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xDF4 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xE66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xE99 SWAP1 DUP5 SWAP1 PUSH2 0x1E99 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x926 SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP4 DUP4 PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF36 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x1013 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D696E20726174696F2063616E6E6F74206265207A65726F0000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x3 DUP3 ADD SSTORE PUSH1 0x4 ADD SSTORE JUMP JUMPDEST PUSH2 0x1047 PUSH2 0x10F2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x10C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH2 0x10CC DUP2 PUSH2 0x121B JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x10DB PUSH2 0x1283 JUMP JUMPDEST PUSH2 0x10E6 DUP6 DUP6 DUP6 PUSH2 0x146E JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x93D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xC03 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1728 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x93D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x130D DUP8 DUP10 ADD DUP10 PUSH2 0x1EB0 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x1329 SWAP2 SWAP1 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x1333 SWAP1 DUP11 PUSH2 0x1E68 JUMP JUMPDEST PUSH2 0x133D SWAP2 SWAP1 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x1347 SWAP2 SWAP1 PUSH2 0x1F3E JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x135D JUMPI PUSH2 0x135D PUSH2 0x1F79 JUMP JUMPDEST EQ PUSH2 0x137C JUMPI PUSH2 0x1377 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH2 0x13B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x13B3 SWAP1 DUP5 SWAP1 PUSH2 0x1E99 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x13E5 PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1414 SWAP2 SWAP1 PUSH2 0x1E68 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x926 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x14ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x14FE PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x1FA8 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1579 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1588 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x2014 JUMP JUMPDEST PUSH2 0x1591 SWAP2 PUSH2 0x203E JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x15A4 DUP4 DUP10 PUSH2 0x180D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x15B1 DUP12 PUSH2 0x1940 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x163F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x16DA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x177D DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x196F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x926 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x179B SWAP2 SWAP1 PUSH2 0x2086 JUMP JUMPDEST PUSH2 0x926 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND PUSH2 0x189C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 ADD SLOAD PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD PUSH2 0x18CB SWAP1 PUSH1 0xA PUSH2 0x21C8 JUMP JUMPDEST PUSH2 0x18D5 SWAP1 DUP6 PUSH2 0x1F01 JUMP JUMPDEST PUSH2 0x18DF SWAP2 SWAP1 PUSH2 0x1F3E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x1921 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x21D4 JUMP JUMPDEST PUSH2 0x192C SWAP1 PUSH1 0xA PUSH2 0x21F7 JUMP JUMPDEST PUSH2 0x1936 SWAP1 DUP3 PUSH2 0x1F3E JUMP JUMPDEST SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x195B JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1967 DUP3 BASEFEE DUP4 ADD PUSH2 0x197E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1967 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1996 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x198D JUMPI DUP2 PUSH2 0x198F JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1A0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x742 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1A2A SWAP2 SWAP1 PUSH2 0x2206 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A67 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1A7D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1A88 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1AF7 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1AF0 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x1AF0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x742 JUMP JUMPDEST POP DUP2 PUSH2 0x1967 JUMP JUMPDEST PUSH2 0x1967 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1B0C JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x742 SWAP2 SWAP1 PUSH2 0x2222 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x198F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x10CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1B7F DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1BAD DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1BBD DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x198F DUP2 PUSH2 0x1B4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C09 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1C19 DUP2 PUSH2 0x1B4C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1C3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1C48 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1C5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP6 SWAP8 POP POP POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP4 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1CA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1CD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D33 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DBC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DA4 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC03 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1DE5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1DA1 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1E2A PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1DCD JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1E7B JUMPI PUSH2 0x1E7B PUSH2 0x1E39 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1EAB JUMPI PUSH2 0x1EAB PUSH2 0x1E39 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1EC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1ED3 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1EE3 DUP2 PUSH2 0x1B4C JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1F39 JUMPI PUSH2 0x1F39 PUSH2 0x1E39 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F74 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1FDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1FF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x200D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x2024 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2031 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x207E JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2098 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x198F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x2101 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x20E7 JUMPI PUSH2 0x20E7 PUSH2 0x1E39 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x20F4 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x20AD JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2118 JUMPI POP PUSH1 0x1 PUSH2 0x193A JUMP JUMPDEST DUP2 PUSH2 0x2125 JUMPI POP PUSH1 0x0 PUSH2 0x193A JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x213B JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x2145 JUMPI PUSH2 0x2161 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x193A JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x2156 JUMPI PUSH2 0x2156 PUSH2 0x1E39 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x193A JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x2184 JUMPI POP DUP2 DUP2 EXP PUSH2 0x193A JUMP JUMPDEST PUSH2 0x218E DUP4 DUP4 PUSH2 0x20A8 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x21C0 JUMPI PUSH2 0x21C0 PUSH2 0x1E39 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x198F DUP4 DUP4 PUSH2 0x2109 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x21EE JUMPI PUSH2 0x21EE PUSH2 0x1E39 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x198F PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x2109 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2218 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1DA1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x198F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1DCD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 0xC4 SWAP3 RETURNDATACOPY 0xE7 PUSH22 0x600D836609CA799D047A8FBDCE37843BFB903A4C8B92 PUSH27 0x4B424464736F6C634300080F003300000000000000000000000000 ","sourceMap":"1215:8566:72:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;6749:400:72:-;;;;;;;;;;-1:-1:-1;6749:400:72;;;;;:::i;:::-;;:::i;3348:439::-;;;;;;;;;;-1:-1:-1;3348:439:72;;;;;:::i;:::-;;:::i;1669:59::-;;;;;;;;;;-1:-1:-1;1669:59:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1669:59:72;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2224:55:111;;;2206:74;;2328:4;2316:17;;;2311:2;2296:18;;2289:45;2350:18;;;2343:34;;;;2408:2;2393:18;;2386:34;2451:3;2436:19;;2429:35;2495:3;2480:19;;2473:35;2193:3;2178:19;1669:59:72;;;;;;;;3973:206;;;;;;;;;;-1:-1:-1;3973:206:72;;;;;:::i;:::-;-1:-1:-1;;;;;4103:15:72;;;4046:14;4103:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;4152:11;:20;;;;;;;;4103:24;;3973:206;;;;;3117:25:111;;;3173:2;3158:18;;3151:34;;;;3090:18;3973:206:72;2943:248:111;1802:46:72;;;;;;;;;;-1:-1:-1;1802:46:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3602:25:111;;;3590:2;3575:18;1802:46:72;3456:177:111;1831:101:24;;;;;;;;;;;;;:::i;2108:706:72:-;;;;;;;;;;-1:-1:-1;2108:706:72;;;;;:::i;:::-;;:::i;1618:44::-;;;;;;;;;;;;1657:5;1618:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;-1:-1:-1;;;;;1273:6:24;1201:85;;;-1:-1:-1;;;;;4517:55:111;;;4499:74;;4487:2;4472:18;1201:85:24;4353:226:111;4310:92:72;;;;;;;;;;;;4369:10;4357:23;;;;:11;:23;;;;;4383:12;4357:38;;4310:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;1734:62:72:-;;;;;;;;;;-1:-1:-1;1734:62:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3318:111:52;;;;;;;;;;;;;:::i;4946:311:72:-;;;;;;;;;;-1:-1:-1;4946:311:72;;;;;:::i;:::-;;:::i;4619:79::-;;;;;;;;;;;;4676:10;4690:1;4664:23;;;:11;:23;;;;;:27;4619:79;2474:105:52;;;:::i;6140:471:72:-;;;;;;;;;;-1:-1:-1;6140:471:72;;;;;:::i;:::-;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;7994:10:111;7982:23;;3173:55:52::1;::::0;::::1;7964:42:111::0;3173:10:52::1;-1:-1:-1::0;;;;;3173:19:52::1;::::0;::::1;::::0;3201:9:::1;::::0;7937:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;-1:-1:-1;;;;;8225:55:111;;;2817:46:52::1;::::0;::::1;8207:74:111::0;8297:18;;;8290:34;;;2817:10:52::1;:21;::::0;::::1;::::0;8180:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;6749:400:72::0;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;6846:21:72;;::::1;6892:1;6846:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;6838:97;;;::::0;-1:-1:-1;;;6838:97:72;;8537:2:111;6838:97:72::1;::::0;::::1;8519:21:111::0;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;6838:97:72::1;;;;;;;;;-1:-1:-1::0;;;;;6967:21:72;::::1;;::::0;;;:14:::1;:21;::::0;;;;:30:::1;;::::0;6953:44;::::1;::::0;::::1;::::0;:92:::1;;-1:-1:-1::0;;;;;;7015:21:72;::::1;;::::0;;;:14:::1;:21;::::0;;;;:30:::1;;::::0;7001:44;::::1;;6953:92;6945:142;;;::::0;-1:-1:-1;;;6945:142:72;;8941:2:111;6945:142:72::1;::::0;::::1;8923:21:111::0;8980:2;8960:18;;;8953:30;9019:34;8999:18;;;8992:62;9090:7;9070:18;;;9063:35;9115:19;;6945:142:72::1;8739:401:111::0;6945:142:72::1;-1:-1:-1::0;;;;;7097:21:72;;::::1;;::::0;;;:14:::1;:21;::::0;;;;;;;:32:::1;:45:::0;6749:400::o;3348:439::-;3493:57;-1:-1:-1;;;;;3493:22:72;;3516:10;3536:4;3543:6;3493:22;:57::i;:::-;-1:-1:-1;;;;;3568:21:72;;;3614:1;3568:21;;;:14;:21;;;;;:27;;3560:97;;;;-1:-1:-1;;;3560:97:72;;8537:2:111;3560:97:72;;;8519:21:111;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;3560:97:72;8335:399:111;3560:97:72;-1:-1:-1;;;;;3667:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:34;;3695:6;;3667:15;:34;;3695:6;;3667:34;:::i;:::-;;;;-1:-1:-1;;;;;;;3715:21:72;;:10;:21;3711:70;;3752:18;4676:10;4690:1;4664:23;;;:11;:23;;;;;:27;4619:79;3752:18;3348:439;;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2108:706:72:-;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;2282:21:72;;::::1;2328:1;2282:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;:49:::0;2274:58:::1;;;::::0;::::1;;2350:10;2364:1;2350:15:::0;2342:72:::1;;;::::0;-1:-1:-1;;;2342:72:72;;9669:2:111;2342:72:72::1;::::0;::::1;9651:21:111::0;9708:2;9688:18;;;9681:30;9747:34;9727:18;;;9720:62;9818:14;9798:18;;;9791:42;9850:19;;2342:72:72::1;9467:408:111::0;2342:72:72::1;2432:8;2444:1;2432:13:::0;2424:68:::1;;;::::0;-1:-1:-1;;;2424:68:72;;10082:2:111;2424:68:72::1;::::0;::::1;10064:21:111::0;10121:2;10101:18;;;10094:30;10160:34;10140:18;;;10133:62;10231:12;10211:18;;;10204:40;10261:19;;2424:68:72::1;9880:406:111::0;2424:68:72::1;2524:8;2510:10;:22;;:48;;;;;2550:8;2536:10;:22;;2510:48;2502:98;;;::::0;-1:-1:-1;;;2502:98:72;;8941:2:111;2502:98:72::1;::::0;::::1;8923:21:111::0;8980:2;8960:18;;;8953:30;9019:34;8999:18;;;8992:62;9090:7;9070:18;;;9063:35;9115:19;;2502:98:72::1;8739:401:111::0;2502:98:72::1;-1:-1:-1::0;;;;;2618:27:72;::::1;2610:71;;;::::0;-1:-1:-1;;;2610:71:72;;10493:2:111;2610:71:72::1;::::0;::::1;10475:21:111::0;10532:2;10512:18;;;10505:30;10571:33;10551:18;;;10544:61;10622:18;;2610:71:72::1;10291:355:111::0;2610:71:72::1;2715:92;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;2715:92:72;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2691:21:72;;;:14:::1;:21:::0;;;;;;;;:116;;;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;2108:706::o;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;-1:-1:-1::0;;;;;3640:22:52::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;-1:-1:-1;;;;;4517:55:111;;;3975:41:52::1;::::0;::::1;4499:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;4472:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;4499:74:111;3361:7:52;;3387:10;-1:-1:-1;;;;;3387:20:52;;;;4472:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;4946:311:72:-;5055:10;5043:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;5102:10:72;5090:23;;;;:11;:23;;;;;;5075:12;:38;5043:70;5035:124;;;;-1:-1:-1;;;5035:124:72;;11289:2:111;5035:124:72;;;11271:21:111;11328:2;11308:18;;;11301:30;11367:34;11347:18;;;11340:62;11438:11;11418:18;;;11411:39;11467:19;;5035:124:72;11087:405:111;5035:124:72;-1:-1:-1;;;;;5169:15:72;;;;;;:8;:15;;;;;;;;5185:10;5169:27;;;;;;;:37;;5200:6;;5169:15;:37;;5200:6;;5169:37;:::i;:::-;;;;-1:-1:-1;5216:34:72;;-1:-1:-1;;;;;;5216:18:72;;5235:6;5243;5216:18;:34::i;2474:105:52:-;2518:54;;;;;2566:4;2518:54;;;4499:74:111;2518:10:52;-1:-1:-1;;;;;2518:20:52;;;;2547:9;;4472:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;6140:471:72;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;6282:21:72;;::::1;6328:1;6282:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;6274:97;;;::::0;-1:-1:-1;;;6274:97:72;;8537:2:111;6274:97:72::1;::::0;::::1;8519:21:111::0;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;6274:97:72::1;8335:399:111::0;6274:97:72::1;6389:8;6401:1;6389:13:::0;6381:50:::1;;;::::0;-1:-1:-1;;;6381:50:72;;11829:2:111;6381:50:72::1;::::0;::::1;11811:21:111::0;11868:2;11848:18;;;11841:30;11907:26;11887:18;;;11880:54;11951:18;;6381:50:72::1;11627:348:111::0;6381:50:72::1;-1:-1:-1::0;;;;;6441:21:72;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:40:::1;::::0;::::1;:61:::0;;;;6512:30:::1;::::0;::::1;:41:::0;6563:30:::1;;:41:::0;6140:471::o;2081:198:24:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:24;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;12182:2:111;2161:73:24::1;::::0;::::1;12164:21:111::0;12221:2;12201:18;;;12194:30;12260:34;12240:18;;;12233:62;12331:8;12311:18;;;12304:36;12357:19;;2161:73:24::1;11980:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:24;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;12589:2:111;1414:68:24;;;12571:21:111;;;12608:18;;;12601:30;12667:34;12647:18;;;12640:62;12719:18;;1414:68:24;12387:356:111;974:241:39;1139:68;;-1:-1:-1;;;;;13029:15:111;;;1139:68:39;;;13011:34:111;13081:15;;13061:18;;;13054:43;13113:18;;;13106:34;;;1112:96:39;;1132:5;;1162:27;;12923:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;2433:187:24:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;-1:-1:-1;;;;;4178:10:52;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;13353:2:111;4148:67:52;;;13335:21:111;13392:2;13372:18;;;13365:30;13431:23;13411:18;;;13404:51;13472:18;;4148:67:52;13151:345:111;8960:819:72;9071:15;;;;;9167:65;;;;9178:7;9167:65;:::i;:::-;9070:162;;;;;;;;;;9301:23;9392:7;9377:12;9359:14;1657:5;9344:29;;;;:::i;:::-;9328:45;;:13;:45;:::i;:::-;9327:62;;;;:::i;:::-;:72;;;;:::i;:::-;9301:98;-1:-1:-1;9421:25:72;9413:4;:33;;;;;;;;:::i;:::-;;9409:311;;9505:63;-1:-1:-1;;;;;9505:22:72;;9528:7;9545:4;9552:15;9505:22;:63::i;:::-;9409:311;;;-1:-1:-1;;;;;9666:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:43;;9694:15;;9666;:43;;9694:15;;9666:43;:::i;:::-;;;;-1:-1:-1;;9409:311:72;-1:-1:-1;;;;;9729:15:72;;;;;;:8;:15;;;;;9757;;9745:7;1247::24;1273:6;-1:-1:-1;;;;;1273:6:24;;1201:85;9745:7:72;-1:-1:-1;;;;;9729:24:72;-1:-1:-1;;;;;9729:24:72;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;8960:819:72:o;763:205:39:-;902:58;;-1:-1:-1;;;;;8225:55:111;;902:58:39;;;8207:74:111;8297:18;;;8290:34;;;875:86:39;;895:5;;925:23;;8180:18:111;;902:58:39;8017:313:111;7448:1101:72;7586:20;7608:22;1657:5;7776:6;:27;;;:42;7768:95;;;;-1:-1:-1;;;7768:95:72;;15344:2:111;7768:95:72;;;15326:21:111;15383:2;15363:18;;;15356:30;15422:34;15402:18;;;15395:62;15493:10;15473:18;;;15466:38;15521:19;;7768:95:72;15142:404:111;7768:95:72;7874:31;;7908:23;;;;:6;:23;:::i;:::-;7874:57;;-1:-1:-1;7874:57:72;-1:-1:-1;7976:5:72;7949:32;;7941:98;;;;-1:-1:-1;;;7941:98:72;;16338:2:111;7941:98:72;;;16320:21:111;16377:2;16357:18;;;16350:30;16416:34;16396:18;;;16389:62;16487:23;16467:18;;;16460:51;16528:19;;7941:98:72;16136:417:111;7941:98:72;8049:12;8087:21;:16;8104:2;8087:16;;:21;:::i;:::-;8079:30;;;:::i;:::-;8071:39;;;-1:-1:-1;1889:20:64;;8121:15:72;8190:34;8071:39;8216:7;8190:18;:34::i;:::-;8167:57;;8234:22;8259:17;:6;:15;:17::i;:::-;-1:-1:-1;;;;;8294:20:72;;;;;;:11;:20;;;;;;8234:42;;-1:-1:-1;8294:25:72;8286:74;;;;-1:-1:-1;;;8286:74:72;;17473:2:111;8286:74:72;;;17455:21:111;17512:2;17492:18;;;17485:30;17551:34;17531:18;;;17524:62;17622:6;17602:18;;;17595:34;17646:19;;8286:74:72;17271:400:111;8286:74:72;-1:-1:-1;;;;;8378:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;:40;-1:-1:-1;8378:40:72;8370:86;;;;-1:-1:-1;;;8370:86:72;;17878:2:111;8370:86:72;;;17860:21:111;17917:2;17897:18;;;17890:30;17956:34;17936:18;;;17929:62;18027:3;18007:18;;;18000:31;18048:19;;8370:86:72;17676:397:111;8370:86:72;8474:65;;;-1:-1:-1;;;;;18431:15:111;;;8474:65:72;;;18413:34:111;18483:15;;;;18463:18;;;18456:43;18515:18;;;18508:34;18558:18;;;18551:34;18601:19;;;;18594:35;;;;8474:65:72;;;;;;;;;;18324:19:111;;;;8474:65:72;;-1:-1:-1;8474:65:72;;-1:-1:-1;;;8474:65:72;-1:-1:-1;;;;7448:1101:72:o;3747:706:39:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:39;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:39;;19124:2:111;4351:85:39;;;19106:21:111;19163:2;19143:18;;;19136:30;19202:34;19182:18;;;19175:62;19273:12;19253:18;;;19246:40;19303:19;;4351:85:39;18922:406:111;5519:548:72;-1:-1:-1;;;;;5653:21:72;;;5611:22;5653:21;;;:14;:21;;;;;:27;5611:22;;5653:27;5645:97;;;;-1:-1:-1;;;5645:97:72;;8537:2:111;5645:97:72;;;8519:21:111;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;5645:97:72;8335:399:111;5645:97:72;-1:-1:-1;;;;;5840:21:72;;5752:22;5840:21;;;:14;:21;;;;;;;:32;;;;5795:40;;;;;5791:44;;:2;:44;:::i;:::-;5778:58;;:9;:58;:::i;:::-;5777:95;;;;:::i;:::-;-1:-1:-1;;;;;6022:21:72;;;;;;:14;:21;;;;;:35;5752:120;;-1:-1:-1;6017:40:72;;6022:35;;;;;6017:2;:40;:::i;:::-;6012:46;;:2;:46;:::i;:::-;5994:65;;:14;:65;:::i;:::-;5986:74;;;5519:548;;;;;:::o;2095:472:64:-;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;:::-;2492:62;2095:472;-1:-1:-1;;;;2095:472:64:o;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;3743:1;3735:13;3728:20;3651:104;-1:-1:-1;;;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:42;;21374:2:111;5149:81:42;;;21356:21:111;21413:2;21393:18;;;21386:30;21452:34;21432:18;;;21425:62;21523:8;21503:18;;;21496:36;21549:19;;5149:81:42;21172:402:111;5149:81:42;5241:12;5255:23;5282:6;-1:-1:-1;;;;;5282:11:42;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:42;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;22060:2:111;7908:60:42;;;22042:21:111;22099:2;22079:18;;;22072:30;22138:31;22118:18;;;22111:59;22187:18;;7908:60:42;21858:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;295:162;-1:-1:-1;;;;;382:5:111;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1141:487::-;1233:6;1241;1249;1302:2;1290:9;1281:7;1277:23;1273:32;1270:52;;;1318:1;1315;1308:12;1270:52;1357:9;1344:23;1376:39;1409:5;1376:39;:::i;:::-;1434:5;-1:-1:-1;1491:2:111;1476:18;;1463:32;1504:41;1463:32;1504:41;:::i;:::-;1141:487;;1564:7;;-1:-1:-1;;;1618:2:111;1603:18;;;;1590:32;;1141:487::o;1633:270::-;1707:6;1760:2;1748:9;1739:7;1735:23;1731:32;1728:52;;;1776:1;1773;1766:12;1728:52;1815:9;1802:23;1834:39;1867:5;1834:39;:::i;2519:419::-;2602:6;2610;2663:2;2651:9;2642:7;2638:23;2634:32;2631:52;;;2679:1;2676;2669:12;2631:52;2718:9;2705:23;2737:39;2770:5;2737:39;:::i;:::-;2795:5;-1:-1:-1;2852:2:111;2837:18;;2824:32;2865:41;2824:32;2865:41;:::i;:::-;2925:7;2915:17;;;2519:419;;;;;:::o;3638:710::-;3755:6;3763;3771;3779;3787;3795;3848:3;3836:9;3827:7;3823:23;3819:33;3816:53;;;3865:1;3862;3855:12;3816:53;3904:9;3891:23;3923:39;3956:5;3923:39;:::i;:::-;3981:5;-1:-1:-1;4038:2:111;4023:18;;4010:32;4086:4;4073:18;;4061:31;;4051:59;;4106:1;4103;4096:12;4051:59;3638:710;;4129:7;;-1:-1:-1;;;;4183:2:111;4168:18;;4155:32;;4234:2;4219:18;;4206:32;;4285:3;4270:19;;4257:33;;-1:-1:-1;4337:3:111;4322:19;;;4309:33;;-1:-1:-1;3638:710:111:o;4584:819::-;4688:6;4696;4704;4712;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;4820:9;4807:23;4859:1;4852:5;4849:12;4839:40;;4875:1;4872;4865:12;4839:40;4898:5;-1:-1:-1;4954:2:111;4939:18;;4926:32;4977:18;5007:14;;;5004:34;;;5034:1;5031;5024:12;5004:34;5072:6;5061:9;5057:22;5047:32;;5117:7;5110:4;5106:2;5102:13;5098:27;5088:55;;5139:1;5136;5129:12;5088:55;5179:2;5166:16;5205:2;5197:6;5194:14;5191:34;;;5221:1;5218;5211:12;5191:34;5266:7;5261:2;5252:6;5248:2;5244:15;5240:24;5237:37;5234:57;;;5287:1;5284;5277:12;5234:57;4584:819;;5318:2;5310:11;;;;;-1:-1:-1;5340:6:111;;5393:2;5378:18;5365:32;;-1:-1:-1;4584:819:111;-1:-1:-1;;;4584:819:111:o;5928:475::-;6029:6;6037;6045;6053;6106:3;6094:9;6085:7;6081:23;6077:33;6074:53;;;6123:1;6120;6113:12;6074:53;6162:9;6149:23;6181:39;6214:5;6181:39;:::i;:::-;6239:5;6291:2;6276:18;;6263:32;;-1:-1:-1;6342:2:111;6327:18;;6314:32;;6393:2;6378:18;6365:32;;-1:-1:-1;5928:475:111;-1:-1:-1;;;5928:475:111:o;6408:530::-;6519:6;6527;6535;6588:2;6576:9;6567:7;6563:23;6559:32;6556:52;;;6604:1;6601;6594:12;6556:52;6644:9;6631:23;6677:18;6669:6;6666:30;6663:50;;;6709:1;6706;6699:12;6663:50;6732:22;;6788:3;6770:16;;;6766:26;6763:46;;;6805:1;6802;6795:12;6763:46;6828:2;6877;6862:18;;6849:32;;-1:-1:-1;6928:2:111;6913:18;;;6900:32;;6408:530;-1:-1:-1;;;6408:530:111:o;6943:258::-;7015:1;7025:113;7039:6;7036:1;7033:13;7025:113;;;7115:11;;;7109:18;7096:11;;;7089:39;7061:2;7054:10;7025:113;;;7156:6;7153:1;7150:13;7147:48;;;-1:-1:-1;;7191:1:111;7173:16;;7166:27;6943:258::o;7206:316::-;7247:3;7285:5;7279:12;7312:6;7307:3;7300:19;7328:63;7384:6;7377:4;7372:3;7368:14;7361:4;7354:5;7350:16;7328:63;:::i;:::-;7436:2;7424:15;7441:66;7420:88;7411:98;;;;7511:4;7407:109;;7206:316;-1:-1:-1;;7206:316:111:o;7527:288::-;7702:2;7691:9;7684:21;7665:4;7722:44;7762:2;7751:9;7747:18;7739:6;7722:44;:::i;:::-;7714:52;;7802:6;7797:2;7786:9;7782:18;7775:34;7527:288;;;;;:::o;9145:184::-;9197:77;9194:1;9187:88;9294:4;9291:1;9284:15;9318:4;9315:1;9308:15;9334:128;9374:3;9405:1;9401:6;9398:1;9395:13;9392:39;;;9411:18;;:::i;:::-;-1:-1:-1;9447:9:111;;9334:128::o;10898:184::-;10968:6;11021:2;11009:9;11000:7;10996:23;10992:32;10989:52;;;11037:1;11034;11027:12;10989:52;-1:-1:-1;11060:16:111;;10898:184;-1:-1:-1;10898:184:111:o;11497:125::-;11537:4;11565:1;11562;11559:8;11556:34;;;11570:18;;:::i;:::-;-1:-1:-1;11607:9:111;;11497:125::o;13501:633::-;13619:6;13627;13635;13643;13651;13704:3;13692:9;13683:7;13679:23;13675:33;13672:53;;;13721:1;13718;13711:12;13672:53;13760:9;13747:23;13779:39;13812:5;13779:39;:::i;:::-;13837:5;-1:-1:-1;13894:2:111;13879:18;;13866:32;13907:41;13866:32;13907:41;:::i;:::-;13501:633;;13967:7;;-1:-1:-1;;;;14021:2:111;14006:18;;13993:32;;14072:2;14057:18;;14044:32;;14123:3;14108:19;;;14095:33;;-1:-1:-1;13501:633:111:o;14139:228::-;14179:7;14305:1;14237:66;14233:74;14230:1;14227:81;14222:1;14215:9;14208:17;14204:105;14201:131;;;14312:18;;:::i;:::-;-1:-1:-1;14352:9:111;;14139:228::o;14372:274::-;14412:1;14438;14428:189;;14473:77;14470:1;14463:88;14574:4;14571:1;14564:15;14602:4;14599:1;14592:15;14428:189;-1:-1:-1;14631:9:111;;14372:274::o;14651:184::-;14703:77;14700:1;14693:88;14800:4;14797:1;14790:15;14824:4;14821:1;14814:15;15551:580;15628:4;15634:6;15694:11;15681:25;15784:66;15773:8;15757:14;15753:29;15749:102;15729:18;15725:127;15715:155;;15866:1;15863;15856:12;15715:155;15893:33;;15945:20;;;-1:-1:-1;15988:18:111;15977:30;;15974:50;;;16020:1;16017;16010:12;15974:50;16053:4;16041:17;;-1:-1:-1;16084:14:111;16080:27;;;16070:38;;16067:58;;;16121:1;16118;16111:12;16067:58;15551:580;;;;;:::o;16558:331::-;16663:9;16674;16716:8;16704:10;16701:24;16698:44;;;16738:1;16735;16728:12;16698:44;16767:6;16757:8;16754:20;16751:40;;;16787:1;16784;16777:12;16751:40;-1:-1:-1;;16813:23:111;;;16858:25;;;;;-1:-1:-1;16558:331:111:o;16894:372::-;17053:66;17015:19;;17137:11;;;;17168:2;17160:11;;17157:103;;;17247:2;17241;17234:3;17230:2;17226:12;17223:1;17219:20;17215:29;17211:2;17207:38;17203:47;17194:56;;17157:103;;;16894:372;;;;:::o;18640:277::-;18707:6;18760:2;18748:9;18739:7;18735:23;18731:32;18728:52;;;18776:1;18773;18766:12;18728:52;18808:9;18802:16;18861:5;18854:13;18847:21;18840:5;18837:32;18827:60;;18883:1;18880;18873:12;19333:482;19422:1;19465:5;19422:1;19479:330;19500:7;19490:8;19487:21;19479:330;;;19619:4;19551:66;19547:77;19541:4;19538:87;19535:113;;;19628:18;;:::i;:::-;19678:7;19668:8;19664:22;19661:55;;;19698:16;;;;19661:55;19777:22;;;;19737:15;;;;19479:330;;;19483:3;19333:482;;;;;:::o;19820:866::-;19869:5;19899:8;19889:80;;-1:-1:-1;19940:1:111;19954:5;;19889:80;19988:4;19978:76;;-1:-1:-1;20025:1:111;20039:5;;19978:76;20070:4;20088:1;20083:59;;;;20156:1;20151:130;;;;20063:218;;20083:59;20113:1;20104:10;;20127:5;;;20151:130;20188:3;20178:8;20175:17;20172:43;;;20195:18;;:::i;:::-;-1:-1:-1;;20251:1:111;20237:16;;20266:5;;20063:218;;20365:2;20355:8;20352:16;20346:3;20340:4;20337:13;20333:36;20327:2;20317:8;20314:16;20309:2;20303:4;20300:12;20296:35;20293:77;20290:159;;;-1:-1:-1;20402:19:111;;;20434:5;;20290:159;20481:34;20506:8;20500:4;20481:34;:::i;:::-;20611:6;20543:66;20539:79;20530:7;20527:92;20524:118;;;20622:18;;:::i;:::-;20660:20;;19820:866;-1:-1:-1;;;19820:866:111:o;20691:131::-;20751:5;20780:36;20807:8;20801:4;20780:36;:::i;20827:195::-;20865:4;20902;20899:1;20895:12;20934:4;20931:1;20927:12;20959:3;20954;20951:12;20948:38;;;20966:18;;:::i;:::-;21003:13;;;20827:195;-1:-1:-1;;;20827:195:111:o;21027:140::-;21085:5;21114:47;21155:4;21145:8;21141:19;21135:4;21114:47;:::i;21579:274::-;21708:3;21746:6;21740:13;21762:53;21808:6;21803:3;21796:4;21788:6;21784:17;21762:53;:::i;:::-;21831:16;;;;;21579:274;-1:-1:-1;;21579:274:111:o;22216:219::-;22365:2;22354:9;22347:21;22328:4;22385:44;22425:2;22414:9;22410:18;22402:6;22385:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1762200","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"240","addDepositFor(address,address,uint256)":"infinite","addStake(uint32)":"infinite","addToken(address,uint8,uint256,uint256,uint256,uint256)":"118047","balances(address,address)":"infinite","deposit()":"infinite","depositInfo(address,address)":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","lockTokenDeposit()":"5270","owner()":"2387","postOp(uint8,bytes,uint256)":"infinite","priceRatioInfo(address)":"11188","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockBlock(address)":"2559","unlockStake()":"infinite","unlockTokenDeposit()":"22397","updatePriceRatio(address,uint256)":"31433","updateTokenParams(address,uint256,uint256,uint256)":"71218","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,address,uint256)":"infinite"},"internal":{"_postOp(enum IPaymaster.PostOpMode,bytes calldata,uint256)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","getTokenValueOfEth(contract IERC20,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addDepositFor(address,address,uint256)":"382edd9e","addStake(uint32)":"0396cb60","addToken(address,uint8,uint256,uint256,uint256,uint256)":"763d9c79","balances(address,address)":"c23f001f","deposit()":"d0e30db0","depositInfo(address,address)":"493b0170","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","lockTokenDeposit()":"cd8f80c2","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","priceRatioInfo(address)":"439a70b2","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","updatePriceRatio(address,uint256)":"24ee2999","updateTokenParams(address,uint256,uint256,uint256)":"e29db4dc","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,address,uint256)":"cc9c837c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"name\":\"addToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"priceRatioInfo\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"}],\"name\":\"updatePriceRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"name\":\"updateTokenParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\",\"token\":\"the token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address,address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\",\"token\":\"the token deposit to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"addToken(address,uint8,uint256,uint256,uint256,uint256)\":{\"notice\":\"owner of the paymaster should add supported tokens\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"updatePriceRatio(address,uint256)\":{\"notice\":\"allows the owner to update the price Ratio of a token can be called as per precision desired by owner\"},\"updateTokenParams(address,uint256,uint256,uint256)\":{\"notice\":\"allows the owner to update the token params\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"notice\":\"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \\\"whitelisted\\\" by the bundler. (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/ManualDepositPaymaster.sol\":\"ManualDepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/IOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface IOracle {\\n\\n /**\\n * return amount of tokens that are required to receive that much eth.\\n */\\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\\n}\\n\\n\",\"keccak256\":\"0xdefd2ec9c4e592ad68092e9e4c15d27c697fc08f90a885bcdb47542da88b42be\",\"license\":\"GPL-3.0\"},\"contracts/samples/ManualDepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IOracle.sol\\\";\\n\\n/**\\n * A token-based paymaster that accepts token deposits\\n * The deposit is only a safeguard: the user pays with his token balance.\\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\\n * thus the required deposit is to cover just one method call.\\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\\n * (but can't use the deposit for this or further operations)\\n *\\n * paymasterAndData holds the paymaster address followed by the token address to use.\\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\\n * (the standard rules ban accessing data of an external contract)\\n * It can only be used if it is \\\"whitelisted\\\" by the bundler.\\n * (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\\n */\\ncontract ManualDepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n struct SupportedTokenInfo {\\n IERC20 token;\\n uint8 tokenDecimals;\\n uint256 priceRatio; // ratio = token : native\\n uint256 priceRatioDecimals;\\n uint256 minRatio;\\n uint256 maxRatio;\\n }\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n\\n mapping(IERC20 => SupportedTokenInfo) public priceRatioInfo;\\n mapping(IERC20 => mapping(address => uint256)) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n }\\n\\n /**\\n * owner of the paymaster should add supported tokens\\n */\\n function addToken(IERC20 token, uint8 tokenDecimals, uint256 priceRatio, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\\n require(priceRatioInfo[token].token == IERC20(address(0)));\\n require(priceRatio != 0, \\\"DepositPaymaster: price ratio cannot be zero\\\");\\n require(minRatio != 0, \\\"DepositPaymaster: min ratio cannot be zero\\\");\\n require(priceRatio >= minRatio && priceRatio <= maxRatio, \\\"DepositPaymaster: Invalid price ratio\\\");\\n require(token != IERC20(address(0)), \\\"DepositPaymaster: Invalid token\\\");\\n priceRatioInfo[token] = SupportedTokenInfo(token, tokenDecimals, priceRatio, priceRatioDecimals, minRatio, maxRatio);\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param token the token to deposit.\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n token.safeTransferFrom(msg.sender, address(this), amount);\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n balances[token][account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[token][account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param token the token deposit to withdraw\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[token][msg.sender] -= amount;\\n token.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param token the token to use\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n uint256 requiredAmount = (ethBought * (10**priceRatioInfo[token].priceRatioDecimals)) / priceRatioInfo[token].priceRatio;\\n // there is no requiredAmount = 0 check, priceRatio set by owner and shouldn't exceed ethBought\\n return (requiredAmount / (10**(18 - priceRatioInfo[token].tokenDecimals)));\\n }\\n\\n /**\\n * allows the owner to update the token params\\n */\\n function updateTokenParams(IERC20 token, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n require(minRatio != 0, \\\"min ratio cannot be zero\\\");\\n priceRatioInfo[token].priceRatioDecimals = priceRatioDecimals;\\n priceRatioInfo[token].minRatio = minRatio;\\n priceRatioInfo[token].maxRatio = maxRatio;\\n }\\n\\n /**\\n * allows the owner to update the price Ratio of a token\\n * can be called as per precision desired by owner\\n */\\n function updatePriceRatio(IERC20 token, uint256 priceRatio) external onlyOwner {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n require(priceRatio >= priceRatioInfo[token].minRatio && priceRatio <= priceRatioInfo[token].maxRatio, \\\"DepositPaymaster: Invalid price ratio\\\");\\n priceRatioInfo[token].priceRatio = priceRatio;\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n require(paymasterAndData.length == 20+20, \\\"DepositPaymaster: paymasterAndData must specify token\\\");\\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[token][account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, IERC20 token, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n token.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[token][account] -= actualTokenCost;\\n }\\n balances[token][owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x49d96a1b001a5be26cde0c4b388144e9b12d5c4a330aa81fd921b5e310bb1115\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":13189,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"priceRatioInfo","offset":0,"slot":"1","type":"t_mapping(t_contract(IERC20)4419,t_struct(SupportedTokenInfo)13180_storage)"},{"astId":13196,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"balances","offset":0,"slot":"2","type":"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))"},{"astId":13200,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"unlockBlock","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_contract(IERC20)4419,t_struct(SupportedTokenInfo)13180_storage)":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo)","numberOfBytes":"32","value":"t_struct(SupportedTokenInfo)13180_storage"},"t_struct(SupportedTokenInfo)13180_storage":{"encoding":"inplace","label":"struct ManualDepositPaymaster.SupportedTokenInfo","members":[{"astId":13169,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"token","offset":0,"slot":"0","type":"t_contract(IERC20)4419"},{"astId":13171,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"tokenDecimals","offset":20,"slot":"0","type":"t_uint8"},{"astId":13173,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"priceRatio","offset":0,"slot":"1","type":"t_uint256"},{"astId":13175,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"priceRatioDecimals","offset":0,"slot":"2","type":"t_uint256"},{"astId":13177,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"minRatio","offset":0,"slot":"3","type":"t_uint256"},{"astId":13179,"contract":"contracts/samples/ManualDepositPaymaster.sol:ManualDepositPaymaster","label":"maxRatio","offset":0,"slot":"4","type":"t_uint256"}],"numberOfBytes":"160"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"addToken(address,uint8,uint256,uint256,uint256,uint256)":{"notice":"owner of the paymaster should add supported tokens"},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"updatePriceRatio(address,uint256)":{"notice":"allows the owner to update the price Ratio of a token can be called as per precision desired by owner"},"updateTokenParams(address,uint256,uint256,uint256)":{"notice":"allows the owner to update the token params"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"notice":"A token-based paymaster that accepts token deposits The deposit is only a safeguard: the user pays with his token balance. only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used. thus the required deposit is to cover just one method call. The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw (but can't use the deposit for this or further operations) paymasterAndData holds the paymaster address followed by the token address to use.This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle. (the standard rules ban accessing data of an external contract) It can only be used if it is \"whitelisted\" by the bundler. (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)","version":1}}},"contracts/samples/SimpleAccount.sol":{"SimpleAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"anOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"initialize(address)":{"details":"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`"},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"withdrawDepositTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13884":{"entryPoint":null,"id":13884,"parameterSlots":1,"returnSlots":0},"@_disableInitializers_3524":{"entryPoint":86,"id":3524,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":280,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:924:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"},{"body":{"nodeType":"YulBlock","src":"504:229:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"521:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"532:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"514:6:111"},"nodeType":"YulFunctionCall","src":"514:21:111"},"nodeType":"YulExpressionStatement","src":"514:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"555:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"566:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"551:3:111"},"nodeType":"YulFunctionCall","src":"551:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"571:2:111","type":"","value":"39"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"544:6:111"},"nodeType":"YulFunctionCall","src":"544:30:111"},"nodeType":"YulExpressionStatement","src":"544:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"594:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"605:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"590:3:111"},"nodeType":"YulFunctionCall","src":"590:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469","kind":"string","nodeType":"YulLiteral","src":"610:34:111","type":"","value":"Initializable: contract is initi"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"583:6:111"},"nodeType":"YulFunctionCall","src":"583:62:111"},"nodeType":"YulExpressionStatement","src":"583:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"665:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"676:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"661:3:111"},"nodeType":"YulFunctionCall","src":"661:18:111"},{"hexValue":"616c697a696e67","kind":"string","nodeType":"YulLiteral","src":"681:9:111","type":"","value":"alizing"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"654:6:111"},"nodeType":"YulFunctionCall","src":"654:37:111"},"nodeType":"YulExpressionStatement","src":"654:37:111"},{"nodeType":"YulAssignment","src":"700:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"712:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"723:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"708:3:111"},"nodeType":"YulFunctionCall","src":"708:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"700:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"481:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"495:4:111","type":""}],"src":"330:403:111"},{"body":{"nodeType":"YulBlock","src":"835:87:111","statements":[{"nodeType":"YulAssignment","src":"845:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"857:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"868:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"853:3:111"},"nodeType":"YulFunctionCall","src":"853:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"845:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"887:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"902:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"910:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"898:3:111"},"nodeType":"YulFunctionCall","src":"898:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"880:6:111"},"nodeType":"YulFunctionCall","src":"880:36:111"},"nodeType":"YulExpressionStatement","src":"880:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"804:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"815:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"826:4:111","type":""}],"src":"738:184:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 39)\n mstore(add(headStart, 64), \"Initializable: contract is initi\")\n mstore(add(headStart, 96), \"alizing\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c0604052306080523480156200001557600080fd5b506040516200240838038062002408833981016040819052620000389162000118565b6001600160a01b03811660a0526200004f62000056565b506200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161224b620001bd6000396000818161032f01528181610833015281816108da01528181610cb001528181610ee701528181610f2e0152818161123201526114bd015260008181610651015281816106e70152818161099e01528181610a340152610b63015261224b6000f3fe60806040526004361061012c5760003560e01c806352d1902d116100a5578063bc197c8111610074578063c4d66de811610059578063c4d66de8146103d0578063d087d288146103f0578063f23a6e611461040557600080fd5b8063bc197c8114610373578063c399ec88146103bb57600080fd5b806352d1902d146102b35780638da5cb5b146102c8578063b0d691fe14610320578063b61d27f61461035357600080fd5b80633659cfe6116100fc5780634a58db19116100e15780634a58db19146102785780634d44560d146102805780634f1ef286146102a057600080fd5b80633659cfe61461022a5780633a871cdd1461024a57600080fd5b806223de291461013857806301ffc9a71461015f578063150b7a021461019457806318dfb3c71461020a57600080fd5b3661013357005b600080fd5b34801561014457600080fd5b5061015d610153366004611aeb565b5050505050505050565b005b34801561016b57600080fd5b5061017f61017a366004611b9c565b61044b565b60405190151581526020015b60405180910390f35b3480156101a057600080fd5b506101d96101af366004611bde565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161018b565b34801561021657600080fd5b5061015d610225366004611c96565b610530565b34801561023657600080fd5b5061015d610245366004611d02565b61063a565b34801561025657600080fd5b5061026a610265366004611d1f565b61080b565b60405190815260200161018b565b61015d610831565b34801561028c57600080fd5b5061015d61029b366004611d73565b6108d0565b61015d6102ae366004611dce565b610987565b3480156102bf57600080fd5b5061026a610b49565b3480156102d457600080fd5b506000546102fb9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018b565b34801561032c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102fb565b34801561035f57600080fd5b5061015d61036e366004611eb0565b610c1b565b34801561037f57600080fd5b506101d961038e366004611f00565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156103c757600080fd5b5061026a610c6a565b3480156103dc57600080fd5b5061015d6103eb366004611d02565b610d21565b3480156103fc57600080fd5b5061026a610e9a565b34801561041157600080fd5b506101d9610420366004611f9e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061052a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610538610f16565b82811461058c5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610633576106218585838181106105ac576105ac61201a565b90506020020160208101906105c19190611d02565b60008585858181106105d5576105d561201a565b90506020028101906105e79190612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b8061062b816120ae565b91505061058f565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106e55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661075a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146107e35760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b6107ec81611042565b604080516000808252602082019092526108089183919061104a565b50565b600061081561121a565b61081f848461129f565b905061082a82611385565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156108bc57600080fd5b505af1158015610633573d6000803e3d6000fd5b6108d86113f0565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610a325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610aa77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b610b3982611042565b610b458282600161104a565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bf65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610583565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610c23610f16565b610c64848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c919061210d565b905090565b600054610100900460ff1615808015610d415750600054600160ff909116105b80610d5b5750303b158015610d5b575060005460ff166001145b610dcd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610583565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e2b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e3482611467565b8015610b4557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610cdb565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480610f77575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b610fc35760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610583565b565b6000808473ffffffffffffffffffffffffffffffffffffffff168484604051610fee9190612152565b60006040518083038185875af1925050503d806000811461102b576040519150601f19603f3d011682016040523d82523d6000602084013e611030565b606091505b50915091508161063357805160208201fd5b6108086113f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156110825761107d83611506565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611107575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111049181019061210d565b60015b6111795760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461120e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610583565b5061107d8383836115f6565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610fc35760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610583565b6000806112f9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905061134961130c610140860186612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859392505061161b9050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461137b57600191505061052a565b5060009392505050565b80156108085760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610633576040519150601f19603f3d011682016040523d82523d6000602084013e610633565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061141b57503330145b610fc35760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610583565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115905760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115ff8361163f565b60008251118061160c5750805b1561107d57610c64838361168c565b600080600061162a85856116b1565b91509150611637816116f6565b509392505050565b61164881611506565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061082a83836040518060600160405280602781526020016121ef6027913961185b565b60008082516041036116e75760208301516040840151606085015160001a6116db878285856118e0565b945094505050506116ef565b506000905060025b9250929050565b600081600481111561170a5761170a61216e565b036117125750565b60018160048111156117265761172661216e565b036117735760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610583565b60028160048111156117875761178761216e565b036117d45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610583565b60038160048111156117e8576117e861216e565b036108085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610583565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516118859190612152565b600060405180830381855af49150503d80600081146118c0576040519150601f19603f3d011682016040523d82523d6000602084013e6118c5565b606091505b50915091506118d6868383876119cf565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561191757506000905060036119c6565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561196b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119bf576000600192509250506119c6565b9150600090505b94509492505050565b60608315611a4b578251600003611a445773ffffffffffffffffffffffffffffffffffffffff85163b611a445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610583565b5081611a55565b611a558383611a5d565b949350505050565b815115611a6d5781518083602001fd5b8060405162461bcd60e51b8152600401610583919061219d565b73ffffffffffffffffffffffffffffffffffffffff8116811461080857600080fd5b60008083601f840112611abb57600080fd5b50813567ffffffffffffffff811115611ad357600080fd5b6020830191508360208285010111156116ef57600080fd5b60008060008060008060008060c0898b031215611b0757600080fd5b8835611b1281611a87565b97506020890135611b2281611a87565b96506040890135611b3281611a87565b955060608901359450608089013567ffffffffffffffff80821115611b5657600080fd5b611b628c838d01611aa9565b909650945060a08b0135915080821115611b7b57600080fd5b50611b888b828c01611aa9565b999c989b5096995094979396929594505050565b600060208284031215611bae57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461082a57600080fd5b600080600080600060808688031215611bf657600080fd5b8535611c0181611a87565b94506020860135611c1181611a87565b935060408601359250606086013567ffffffffffffffff811115611c3457600080fd5b611c4088828901611aa9565b969995985093965092949392505050565b60008083601f840112611c6357600080fd5b50813567ffffffffffffffff811115611c7b57600080fd5b6020830191508360208260051b85010111156116ef57600080fd5b60008060008060408587031215611cac57600080fd5b843567ffffffffffffffff80821115611cc457600080fd5b611cd088838901611c51565b90965094506020870135915080821115611ce957600080fd5b50611cf687828801611c51565b95989497509550505050565b600060208284031215611d1457600080fd5b813561082a81611a87565b600080600060608486031215611d3457600080fd5b833567ffffffffffffffff811115611d4b57600080fd5b84016101608187031215611d5e57600080fd5b95602085013595506040909401359392505050565b60008060408385031215611d8657600080fd5b8235611d9181611a87565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611de157600080fd5b8235611dec81611a87565b9150602083013567ffffffffffffffff80821115611e0957600080fd5b818501915085601f830112611e1d57600080fd5b813581811115611e2f57611e2f611d9f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611e7557611e75611d9f565b81604052828152886020848701011115611e8e57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611ec657600080fd5b8435611ed181611a87565b935060208501359250604085013567ffffffffffffffff811115611ef457600080fd5b611cf687828801611aa9565b60008060008060008060008060a0898b031215611f1c57600080fd5b8835611f2781611a87565b97506020890135611f3781611a87565b9650604089013567ffffffffffffffff80821115611f5457600080fd5b611f608c838d01611c51565b909850965060608b0135915080821115611f7957600080fd5b611f858c838d01611c51565b909650945060808b0135915080821115611b7b57600080fd5b60008060008060008060a08789031215611fb757600080fd5b8635611fc281611a87565b95506020870135611fd281611a87565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ffc57600080fd5b61200889828a01611aa9565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261207e57600080fd5b83018035915067ffffffffffffffff82111561209957600080fd5b6020019150368190038213156116ef57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612106577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561211f57600080fd5b5051919050565b60005b83811015612141578181015183820152602001612129565b83811115610c645750506000910152565b60008251612164818460208701612126565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526121bc816040850160208701612126565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fe270ff8e4072df8d4acd6383803b1e259c9c59c3f3a7c1d73e5cdf4d869ca8064736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2408 CODESIZE SUB DUP1 PUSH3 0x2408 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x118 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0xA0 MSTORE PUSH3 0x4F PUSH3 0x56 JUMP JUMPDEST POP PUSH3 0x14A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x116 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x143 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x224B PUSH3 0x1BD PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x32F ADD MSTORE DUP2 DUP2 PUSH2 0x833 ADD MSTORE DUP2 DUP2 PUSH2 0x8DA ADD MSTORE DUP2 DUP2 PUSH2 0xCB0 ADD MSTORE DUP2 DUP2 PUSH2 0xEE7 ADD MSTORE DUP2 DUP2 PUSH2 0xF2E ADD MSTORE DUP2 DUP2 PUSH2 0x1232 ADD MSTORE PUSH2 0x14BD ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x651 ADD MSTORE DUP2 DUP2 PUSH2 0x6E7 ADD MSTORE DUP2 DUP2 PUSH2 0x99E ADD MSTORE DUP2 DUP2 PUSH2 0xA34 ADD MSTORE PUSH2 0xB63 ADD MSTORE PUSH2 0x224B PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x12C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x373 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x2A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x15F JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x133 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x153 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AEB JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17F PUSH2 0x17A CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x44B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x1AF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BDE JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C96 JUMP JUMPDEST PUSH2 0x530 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0x63A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D1F JUMP JUMPDEST PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x15D PUSH2 0x831 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x29B CALLDATASIZE PUSH1 0x4 PUSH2 0x1D73 JUMP JUMPDEST PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x15D PUSH2 0x2AE CALLDATASIZE PUSH1 0x4 PUSH2 0x1DCE JUMP JUMPDEST PUSH2 0x987 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xB49 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2FB SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x36E CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB0 JUMP JUMPDEST PUSH2 0xC1B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x38E CALLDATASIZE PUSH1 0x4 PUSH2 0x1F00 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xC6A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0xD21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xE9A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x420 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F9E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x52A JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x538 PUSH2 0xF16 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x58C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x633 JUMPI PUSH2 0x621 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5AC JUMPI PUSH2 0x5AC PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x5C1 SWAP2 SWAP1 PUSH2 0x1D02 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x5D5 JUMPI PUSH2 0x5D5 PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x5E7 SWAP2 SWAP1 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x62B DUP2 PUSH2 0x20AE JUMP JUMPDEST SWAP2 POP POP PUSH2 0x58F JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x6E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x75A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x7E3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0x7EC DUP2 PUSH2 0x1042 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x808 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x104A JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x815 PUSH2 0x121A JUMP JUMPDEST PUSH2 0x81F DUP5 DUP5 PUSH2 0x129F JUMP JUMPDEST SWAP1 POP PUSH2 0x82A DUP3 PUSH2 0x1385 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x633 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x8D8 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x96B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x97F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xA32 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xAA7 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0xB39 DUP3 PUSH2 0x1042 JUMP JUMPDEST PUSH2 0xB45 DUP3 DUP3 PUSH1 0x1 PUSH2 0x104A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xBF6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xC23 PUSH2 0xF16 JUMP JUMPDEST PUSH2 0xC64 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCF8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xD1C SWAP2 SWAP1 PUSH2 0x210D JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xD41 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xD5B JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xDCD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xE2B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xE34 DUP3 PUSH2 0x1467 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB45 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xCDB JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0xF77 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0xFEE SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x102B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1030 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x633 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x808 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1082 JUMPI PUSH2 0x107D DUP4 PUSH2 0x1506 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1107 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x1104 SWAP2 DUP2 ADD SWAP1 PUSH2 0x210D JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1179 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH2 0x107D DUP4 DUP4 DUP4 PUSH2 0x15F6 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12F9 DUP4 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH2 0x1349 PUSH2 0x130C PUSH2 0x140 DUP7 ADD DUP7 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP6 SWAP4 SWAP3 POP POP PUSH2 0x161B SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x137B JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0x52A JUMP JUMPDEST POP PUSH1 0x0 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x633 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x633 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x141B JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1590 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15FF DUP4 PUSH2 0x163F JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x160C JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x107D JUMPI PUSH2 0xC64 DUP4 DUP4 PUSH2 0x168C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x162A DUP6 DUP6 PUSH2 0x16B1 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1637 DUP2 PUSH2 0x16F6 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1648 DUP2 PUSH2 0x1506 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x82A DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x21EF PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x185B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x16E7 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x16DB DUP8 DUP3 DUP6 DUP6 PUSH2 0x18E0 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x16EF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x170A JUMPI PUSH2 0x170A PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1712 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1726 JUMPI PUSH2 0x1726 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1773 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1787 JUMPI PUSH2 0x1787 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x17D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x17E8 JUMPI PUSH2 0x17E8 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1885 SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x18C0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x18C5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x18D6 DUP7 DUP4 DUP4 DUP8 PUSH2 0x19CF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1917 JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x196B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x19BF JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A4B JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A44 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST POP DUP2 PUSH2 0x1A55 JUMP JUMPDEST PUSH2 0x1A55 DUP4 DUP4 PUSH2 0x1A5D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A6D JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x583 SWAP2 SWAP1 PUSH2 0x219D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x808 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1ABB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1B12 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1B22 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1B32 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP13 DUP4 DUP14 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B88 DUP12 DUP3 DUP13 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1BF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C01 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1C11 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C40 DUP9 DUP3 DUP10 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1CAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CD0 DUP9 DUP4 DUP10 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1CE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x82A DUP2 PUSH2 0x1A87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1D91 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1DE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1DEC DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1E2F JUMPI PUSH2 0x1E2F PUSH2 0x1D9F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1E75 JUMPI PUSH2 0x1E75 PUSH2 0x1D9F JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1E8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1EC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1ED1 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1AA9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1F1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1F27 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1F37 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F60 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F85 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1FC2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1FD2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1FFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2008 DUP10 DUP3 DUP11 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x207E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2099 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2106 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x211F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2141 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2129 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2164 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x21BC DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FE270F 0xF8 0xE4 SMOD 0x2D 0xF8 0xD4 0xAC 0xD6 CODESIZE CODESIZE SUB 0xB1 0xE2 MSIZE 0xC9 0xC5 SWAP13 EXTCODEHASH GASPRICE PUSH29 0x1D73E5CDF4D869CA8064736F6C634300080F0033000000000000000000 ","sourceMap":"637:3852:73:-:0;;;1088:4:32;1045:48;;1230:113:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1278:26:73;;;;1314:22;:20;:22::i;:::-;1230:113;637:3852;;5906:279:31;5974:13;;;;;;;5973:14;5965:66;;;;-1:-1:-1;;;5965:66:31;;532:2:111;5965:66:31;;;514:21:111;571:2;551:18;;;544:30;610:34;590:18;;;583:62;-1:-1:-1;;;661:18:111;;;654:37;708:19;;5965:66:31;;;;;;;;6045:12;;6060:15;6045:12;;;:30;6041:138;;;6091:12;:30;;-1:-1:-1;;6091:30:31;6106:15;6091:30;;;;;;6140:28;;880:36:111;;;6140:28:31;;868:2:111;853:18;6140:28:31;;;;;;;6041:138;5906:279::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;738:184::-;637:3852:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_13870":{"entryPoint":null,"id":13870,"parameterSlots":0,"returnSlots":0},"@_authorizeUpgrade_14140":{"entryPoint":4162,"id":14140,"parameterSlots":1,"returnSlots":0},"@_call_14076":{"entryPoint":4037,"id":14076,"parameterSlots":3,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_initialize_13998":{"entryPoint":5223,"id":13998,"parameterSlots":1,"returnSlots":0},"@_onlyOwner_13904":{"entryPoint":5104,"id":13904,"parameterSlots":0,"returnSlots":0},"@_payPrefund_7307":{"entryPoint":4997,"id":7307,"parameterSlots":1,"returnSlots":0},"@_requireFromEntryPointOrOwner_14019":{"entryPoint":3862,"id":14019,"parameterSlots":0,"returnSlots":0},"@_requireFromEntryPoint_7256":{"entryPoint":4634,"id":7256,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":6749,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":5382,"id":3050,"parameterSlots":1,"returnSlots":0},"@_throwError_5521":{"entryPoint":5878,"id":5521,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCallUUPS_3148":{"entryPoint":4170,"id":3148,"parameterSlots":3,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":5622,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":5695,"id":3065,"parameterSlots":1,"returnSlots":0},"@_validateNonce_7274":{"entryPoint":null,"id":7274,"parameterSlots":1,"returnSlots":0},"@_validateSignature_14050":{"entryPoint":4767,"id":14050,"parameterSlots":2,"returnSlots":1},"@addDeposit_14109":{"entryPoint":2097,"id":14109,"parameterSlots":0,"returnSlots":0},"@entryPoint_13866":{"entryPoint":null,"id":13866,"parameterSlots":0,"returnSlots":1},"@executeBatch_13970":{"entryPoint":1328,"id":13970,"parameterSlots":4,"returnSlots":0},"@execute_13924":{"entryPoint":3099,"id":13924,"parameterSlots":4,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":5772,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":6235,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":null,"id":5258,"parameterSlots":1,"returnSlots":1},"@getBooleanSlot_5269":{"entryPoint":null,"id":5269,"parameterSlots":1,"returnSlots":1},"@getDeposit_14092":{"entryPoint":3178,"id":14092,"parameterSlots":0,"returnSlots":1},"@getNonce_7198":{"entryPoint":3738,"id":7198,"parameterSlots":0,"returnSlots":1},"@initialize_13983":{"entryPoint":3361,"id":13983,"parameterSlots":1,"returnSlots":0},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@owner_13838":{"entryPoint":null,"id":13838,"parameterSlots":0,"returnSlots":0},"@proxiableUUID_3609":{"entryPoint":2889,"id":3609,"parameterSlots":0,"returnSlots":1},"@recover_5594":{"entryPoint":5659,"id":5594,"parameterSlots":2,"returnSlots":1},"@supportsInterface_17936":{"entryPoint":1099,"id":17936,"parameterSlots":1,"returnSlots":1},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"@tryRecover_5567":{"entryPoint":5809,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":6368,"id":5735,"parameterSlots":4,"returnSlots":2},"@upgradeToAndCall_3652":{"entryPoint":2439,"id":3652,"parameterSlots":2,"returnSlots":0},"@upgradeTo_3631":{"entryPoint":1594,"id":3631,"parameterSlots":1,"returnSlots":0},"@validateUserOp_7239":{"entryPoint":2059,"id":7239,"parameterSlots":3,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":6607,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawDepositTo_14127":{"entryPoint":2256,"id":14127,"parameterSlots":2,"returnSlots":0},"abi_decode_array_address_dyn_calldata":{"entryPoint":7249,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":6825,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address":{"entryPoint":7426,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7539,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":6891,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":7936,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7134,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":8094,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":7630,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7856,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":7318,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes4":{"entryPoint":7068,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7455,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8461,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":8530,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":8605,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8265,"id":null,"parameterSlots":2,"returnSlots":2},"copy_memory_to_memory":{"entryPoint":8486,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":8366,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x21":{"entryPoint":8558,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":8218,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":7583,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":6791,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:20843:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"245:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"294:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"303:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"306:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"296:6:111"},"nodeType":"YulFunctionCall","src":"296:12:111"},"nodeType":"YulExpressionStatement","src":"296:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"273:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"281:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"269:3:111"},"nodeType":"YulFunctionCall","src":"269:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"288:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"265:3:111"},"nodeType":"YulFunctionCall","src":"265:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"258:6:111"},"nodeType":"YulFunctionCall","src":"258:35:111"},"nodeType":"YulIf","src":"255:55:111"},{"nodeType":"YulAssignment","src":"319:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"342:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"329:12:111"},"nodeType":"YulFunctionCall","src":"329:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"319:6:111"}]},{"body":{"nodeType":"YulBlock","src":"392:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"401:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"404:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"394:6:111"},"nodeType":"YulFunctionCall","src":"394:12:111"},"nodeType":"YulExpressionStatement","src":"394:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"364:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"372:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"361:2:111"},"nodeType":"YulFunctionCall","src":"361:30:111"},"nodeType":"YulIf","src":"358:50:111"},{"nodeType":"YulAssignment","src":"417:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"433:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"441:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"417:8:111"}]},{"body":{"nodeType":"YulBlock","src":"498:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"507:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"510:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"500:6:111"},"nodeType":"YulFunctionCall","src":"500:12:111"},"nodeType":"YulExpressionStatement","src":"500:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"469:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"477:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"465:3:111"},"nodeType":"YulFunctionCall","src":"465:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"461:3:111"},"nodeType":"YulFunctionCall","src":"461:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"493:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"458:2:111"},"nodeType":"YulFunctionCall","src":"458:39:111"},"nodeType":"YulIf","src":"455:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"208:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"216:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"224:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"234:6:111","type":""}],"src":"173:347:111"},{"body":{"nodeType":"YulBlock","src":"718:1012:111","statements":[{"body":{"nodeType":"YulBlock","src":"765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"767:6:111"},"nodeType":"YulFunctionCall","src":"767:12:111"},"nodeType":"YulExpressionStatement","src":"767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"735:3:111"},"nodeType":"YulFunctionCall","src":"735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"760:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"731:3:111"},"nodeType":"YulFunctionCall","src":"731:33:111"},"nodeType":"YulIf","src":"728:53:111"},{"nodeType":"YulVariableDeclaration","src":"790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"803:12:111"},"nodeType":"YulFunctionCall","src":"803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"860:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"835:24:111"},"nodeType":"YulFunctionCall","src":"835:31:111"},"nodeType":"YulExpressionStatement","src":"835:31:111"},{"nodeType":"YulAssignment","src":"875:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"875:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"899:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"927:3:111"},"nodeType":"YulFunctionCall","src":"927:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"914:12:111"},"nodeType":"YulFunctionCall","src":"914:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"903:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"980:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"955:24:111"},"nodeType":"YulFunctionCall","src":"955:33:111"},"nodeType":"YulExpressionStatement","src":"955:33:111"},{"nodeType":"YulAssignment","src":"997:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1007:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1023:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1066:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1051:3:111"},"nodeType":"YulFunctionCall","src":"1051:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1038:12:111"},"nodeType":"YulFunctionCall","src":"1038:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1027:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1104:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1079:24:111"},"nodeType":"YulFunctionCall","src":"1079:33:111"},"nodeType":"YulExpressionStatement","src":"1079:33:111"},{"nodeType":"YulAssignment","src":"1121:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1131:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1121:6:111"}]},{"nodeType":"YulAssignment","src":"1147:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1170:3:111"},"nodeType":"YulFunctionCall","src":"1170:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1157:12:111"},"nodeType":"YulFunctionCall","src":"1157:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1147:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1198:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1240:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1225:3:111"},"nodeType":"YulFunctionCall","src":"1225:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1212:12:111"},"nodeType":"YulFunctionCall","src":"1212:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1202:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:14:111"},"nodeType":"YulIf","src":"1291:34:111"},{"nodeType":"YulVariableDeclaration","src":"1334:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1390:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1401:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1386:3:111"},"nodeType":"YulFunctionCall","src":"1386:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1410:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1360:25:111"},"nodeType":"YulFunctionCall","src":"1360:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1338:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1348:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1427:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1437:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1427:6:111"}]},{"nodeType":"YulAssignment","src":"1454:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1464:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1454:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1481:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1525:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1510:3:111"},"nodeType":"YulFunctionCall","src":"1510:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1497:12:111"},"nodeType":"YulFunctionCall","src":"1497:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1485:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1561:6:111"},"nodeType":"YulFunctionCall","src":"1561:12:111"},"nodeType":"YulExpressionStatement","src":"1561:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1545:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1555:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1542:2:111"},"nodeType":"YulFunctionCall","src":"1542:16:111"},"nodeType":"YulIf","src":"1539:36:111"},{"nodeType":"YulVariableDeclaration","src":"1584:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1640:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1651:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1636:3:111"},"nodeType":"YulFunctionCall","src":"1636:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1662:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1610:25:111"},"nodeType":"YulFunctionCall","src":"1610:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1588:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1598:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1679:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1689:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1679:6:111"}]},{"nodeType":"YulAssignment","src":"1706:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1716:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1706:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"628:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"639:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"651:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"659:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"667:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"675:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"683:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"691:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"699:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"707:6:111","type":""}],"src":"525:1205:111"},{"body":{"nodeType":"YulBlock","src":"1804:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1850:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1859:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1862:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1852:6:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"nodeType":"YulExpressionStatement","src":"1852:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1825:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1834:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1821:3:111"},"nodeType":"YulFunctionCall","src":"1821:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1846:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1817:3:111"},"nodeType":"YulFunctionCall","src":"1817:32:111"},"nodeType":"YulIf","src":"1814:52:111"},{"nodeType":"YulVariableDeclaration","src":"1875:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1901:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1888:12:111"},"nodeType":"YulFunctionCall","src":"1888:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1879:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2021:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2030:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2033:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2023:6:111"},"nodeType":"YulFunctionCall","src":"2023:12:111"},"nodeType":"YulExpressionStatement","src":"2023:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1933:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1944:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1951:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1940:3:111"},"nodeType":"YulFunctionCall","src":"1940:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:97:111"},"nodeType":"YulIf","src":"1920:117:111"},{"nodeType":"YulAssignment","src":"2046:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2056:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2046:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1770:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1781:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1793:6:111","type":""}],"src":"1735:332:111"},{"body":{"nodeType":"YulBlock","src":"2167:92:111","statements":[{"nodeType":"YulAssignment","src":"2177:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2200:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2185:3:111"},"nodeType":"YulFunctionCall","src":"2185:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2177:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2219:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2244:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2237:6:111"},"nodeType":"YulFunctionCall","src":"2237:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2230:6:111"},"nodeType":"YulFunctionCall","src":"2230:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2212:6:111"},"nodeType":"YulFunctionCall","src":"2212:41:111"},"nodeType":"YulExpressionStatement","src":"2212:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2136:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2147:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2158:4:111","type":""}],"src":"2072:187:111"},{"body":{"nodeType":"YulBlock","src":"2404:614:111","statements":[{"body":{"nodeType":"YulBlock","src":"2451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2453:6:111"},"nodeType":"YulFunctionCall","src":"2453:12:111"},"nodeType":"YulExpressionStatement","src":"2453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2425:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2421:3:111"},"nodeType":"YulFunctionCall","src":"2421:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2446:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:33:111"},"nodeType":"YulIf","src":"2414:53:111"},{"nodeType":"YulVariableDeclaration","src":"2476:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2502:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2489:12:111"},"nodeType":"YulFunctionCall","src":"2489:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2480:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2546:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2521:24:111"},"nodeType":"YulFunctionCall","src":"2521:31:111"},"nodeType":"YulExpressionStatement","src":"2521:31:111"},{"nodeType":"YulAssignment","src":"2561:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2561:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2585:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2617:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2628:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2600:12:111"},"nodeType":"YulFunctionCall","src":"2600:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2589:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2666:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2641:24:111"},"nodeType":"YulFunctionCall","src":"2641:33:111"},"nodeType":"YulExpressionStatement","src":"2641:33:111"},{"nodeType":"YulAssignment","src":"2683:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2693:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2683:6:111"}]},{"nodeType":"YulAssignment","src":"2709:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2736:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2719:12:111"},"nodeType":"YulFunctionCall","src":"2719:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2760:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2802:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2787:3:111"},"nodeType":"YulFunctionCall","src":"2787:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2774:12:111"},"nodeType":"YulFunctionCall","src":"2774:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2764:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2821:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2829:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2818:2:111"},"nodeType":"YulFunctionCall","src":"2818:30:111"},"nodeType":"YulIf","src":"2815:50:111"},{"nodeType":"YulVariableDeclaration","src":"2874:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2930:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2941:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2926:3:111"},"nodeType":"YulFunctionCall","src":"2926:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2950:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2900:25:111"},"nodeType":"YulFunctionCall","src":"2900:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2878:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2888:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2967:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2977:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2967:6:111"}]},{"nodeType":"YulAssignment","src":"2994:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"3004:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2994:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2338:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2349:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2369:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2377:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2385:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2393:6:111","type":""}],"src":"2264:754:111"},{"body":{"nodeType":"YulBlock","src":"3122:149:111","statements":[{"nodeType":"YulAssignment","src":"3132:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3140:3:111"},"nodeType":"YulFunctionCall","src":"3140:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3132:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3174:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3197:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3185:3:111"},"nodeType":"YulFunctionCall","src":"3185:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:98:111"},"nodeType":"YulExpressionStatement","src":"3167:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3091:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3102:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3113:4:111","type":""}],"src":"3023:248:111"},{"body":{"nodeType":"YulBlock","src":"3360:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:12:111"},"nodeType":"YulExpressionStatement","src":"3411:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3396:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3403:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:35:111"},"nodeType":"YulIf","src":"3370:55:111"},{"nodeType":"YulAssignment","src":"3434:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3457:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3444:12:111"},"nodeType":"YulFunctionCall","src":"3444:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3434:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3509:6:111"},"nodeType":"YulFunctionCall","src":"3509:12:111"},"nodeType":"YulExpressionStatement","src":"3509:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3476:2:111"},"nodeType":"YulFunctionCall","src":"3476:30:111"},"nodeType":"YulIf","src":"3473:50:111"},{"nodeType":"YulAssignment","src":"3532:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3544:3:111"},"nodeType":"YulFunctionCall","src":"3544:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3532:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3623:6:111"},"nodeType":"YulFunctionCall","src":"3623:12:111"},"nodeType":"YulExpressionStatement","src":"3623:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3584:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3596:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3599:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3609:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3576:3:111"},"nodeType":"YulFunctionCall","src":"3576:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3616:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3573:2:111"},"nodeType":"YulFunctionCall","src":"3573:47:111"},"nodeType":"YulIf","src":"3570:67:111"}]},"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3323:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3331:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3339:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3349:6:111","type":""}],"src":"3276:367:111"},{"body":{"nodeType":"YulBlock","src":"3816:616:111","statements":[{"body":{"nodeType":"YulBlock","src":"3862:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3874:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3864:6:111"},"nodeType":"YulFunctionCall","src":"3864:12:111"},"nodeType":"YulExpressionStatement","src":"3864:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3837:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3846:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3833:3:111"},"nodeType":"YulFunctionCall","src":"3833:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3829:3:111"},"nodeType":"YulFunctionCall","src":"3829:32:111"},"nodeType":"YulIf","src":"3826:52:111"},{"nodeType":"YulVariableDeclaration","src":"3887:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3914:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3901:12:111"},"nodeType":"YulFunctionCall","src":"3901:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3891:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3933:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3943:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3937:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3988:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3997:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4000:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3990:6:111"},"nodeType":"YulFunctionCall","src":"3990:12:111"},"nodeType":"YulExpressionStatement","src":"3990:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3976:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3984:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3973:2:111"},"nodeType":"YulFunctionCall","src":"3973:14:111"},"nodeType":"YulIf","src":"3970:34:111"},{"nodeType":"YulVariableDeclaration","src":"4013:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4081:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4092:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4077:3:111"},"nodeType":"YulFunctionCall","src":"4077:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4101:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4039:37:111"},"nodeType":"YulFunctionCall","src":"4039:70:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"4017:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"4027:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4118:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"4128:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4118:6:111"}]},{"nodeType":"YulAssignment","src":"4145:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4155:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4172:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4201:3:111"},"nodeType":"YulFunctionCall","src":"4201:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4188:12:111"},"nodeType":"YulFunctionCall","src":"4188:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4176:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4251:6:111"},"nodeType":"YulFunctionCall","src":"4251:12:111"},"nodeType":"YulExpressionStatement","src":"4251:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4235:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4245:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4232:2:111"},"nodeType":"YulFunctionCall","src":"4232:16:111"},"nodeType":"YulIf","src":"4229:36:111"},{"nodeType":"YulVariableDeclaration","src":"4274:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4353:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4338:3:111"},"nodeType":"YulFunctionCall","src":"4338:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4364:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4300:37:111"},"nodeType":"YulFunctionCall","src":"4300:72:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4278:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4288:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4381:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4391:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4381:6:111"}]},{"nodeType":"YulAssignment","src":"4408:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4418:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4408:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3758:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3769:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3781:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3789:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3797:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3805:6:111","type":""}],"src":"3648:784:111"},{"body":{"nodeType":"YulBlock","src":"4507:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4553:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4562:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4565:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4555:6:111"},"nodeType":"YulFunctionCall","src":"4555:12:111"},"nodeType":"YulExpressionStatement","src":"4555:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4528:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4537:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4524:3:111"},"nodeType":"YulFunctionCall","src":"4524:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4549:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4520:3:111"},"nodeType":"YulFunctionCall","src":"4520:32:111"},"nodeType":"YulIf","src":"4517:52:111"},{"nodeType":"YulVariableDeclaration","src":"4578:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4604:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4591:12:111"},"nodeType":"YulFunctionCall","src":"4591:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4582:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4648:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4623:24:111"},"nodeType":"YulFunctionCall","src":"4623:31:111"},"nodeType":"YulExpressionStatement","src":"4623:31:111"},{"nodeType":"YulAssignment","src":"4663:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4673:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4663:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4473:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4484:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4496:6:111","type":""}],"src":"4437:247:111"},{"body":{"nodeType":"YulBlock","src":"4827:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"4873:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4882:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4885:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4875:6:111"},"nodeType":"YulFunctionCall","src":"4875:12:111"},"nodeType":"YulExpressionStatement","src":"4875:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4848:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4857:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4844:3:111"},"nodeType":"YulFunctionCall","src":"4844:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4869:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4840:3:111"},"nodeType":"YulFunctionCall","src":"4840:32:111"},"nodeType":"YulIf","src":"4837:52:111"},{"nodeType":"YulVariableDeclaration","src":"4898:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4925:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4912:12:111"},"nodeType":"YulFunctionCall","src":"4912:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4902:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4978:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4987:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4990:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4980:6:111"},"nodeType":"YulFunctionCall","src":"4980:12:111"},"nodeType":"YulExpressionStatement","src":"4980:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4950:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4958:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4947:2:111"},"nodeType":"YulFunctionCall","src":"4947:30:111"},"nodeType":"YulIf","src":"4944:50:111"},{"nodeType":"YulVariableDeclaration","src":"5003:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5017:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5028:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5013:3:111"},"nodeType":"YulFunctionCall","src":"5013:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5007:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5074:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5083:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5086:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5076:6:111"},"nodeType":"YulFunctionCall","src":"5076:12:111"},"nodeType":"YulExpressionStatement","src":"5076:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5055:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5064:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5051:3:111"},"nodeType":"YulFunctionCall","src":"5051:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5069:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5047:3:111"},"nodeType":"YulFunctionCall","src":"5047:26:111"},"nodeType":"YulIf","src":"5044:46:111"},{"nodeType":"YulAssignment","src":"5099:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5109:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5099:6:111"}]},{"nodeType":"YulAssignment","src":"5120:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5147:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5158:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5143:3:111"},"nodeType":"YulFunctionCall","src":"5143:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5130:12:111"},"nodeType":"YulFunctionCall","src":"5130:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5120:6:111"}]},{"nodeType":"YulAssignment","src":"5171:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5198:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5209:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5194:3:111"},"nodeType":"YulFunctionCall","src":"5194:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5181:12:111"},"nodeType":"YulFunctionCall","src":"5181:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5171:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4777:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4788:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4800:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4808:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4816:6:111","type":""}],"src":"4689:530:111"},{"body":{"nodeType":"YulBlock","src":"5325:76:111","statements":[{"nodeType":"YulAssignment","src":"5335:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5347:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5358:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5343:3:111"},"nodeType":"YulFunctionCall","src":"5343:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5335:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5377:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5388:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5370:6:111"},"nodeType":"YulFunctionCall","src":"5370:25:111"},"nodeType":"YulExpressionStatement","src":"5370:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5294:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5305:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5316:4:111","type":""}],"src":"5224:177:111"},{"body":{"nodeType":"YulBlock","src":"5501:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"5547:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5556:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5559:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5549:6:111"},"nodeType":"YulFunctionCall","src":"5549:12:111"},"nodeType":"YulExpressionStatement","src":"5549:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5522:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5531:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5518:3:111"},"nodeType":"YulFunctionCall","src":"5518:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5543:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5514:3:111"},"nodeType":"YulFunctionCall","src":"5514:32:111"},"nodeType":"YulIf","src":"5511:52:111"},{"nodeType":"YulVariableDeclaration","src":"5572:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5598:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5585:12:111"},"nodeType":"YulFunctionCall","src":"5585:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5576:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5642:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"5617:24:111"},"nodeType":"YulFunctionCall","src":"5617:31:111"},"nodeType":"YulExpressionStatement","src":"5617:31:111"},{"nodeType":"YulAssignment","src":"5657:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5667:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5657:6:111"}]},{"nodeType":"YulAssignment","src":"5681:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5708:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5719:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5704:3:111"},"nodeType":"YulFunctionCall","src":"5704:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5691:12:111"},"nodeType":"YulFunctionCall","src":"5691:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5681:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5459:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5470:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5482:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5490:6:111","type":""}],"src":"5406:323:111"},{"body":{"nodeType":"YulBlock","src":"5766:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5783:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5786:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5776:6:111"},"nodeType":"YulFunctionCall","src":"5776:88:111"},"nodeType":"YulExpressionStatement","src":"5776:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5880:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"5883:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5873:6:111"},"nodeType":"YulFunctionCall","src":"5873:15:111"},"nodeType":"YulExpressionStatement","src":"5873:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5904:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5907:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5897:6:111"},"nodeType":"YulFunctionCall","src":"5897:15:111"},"nodeType":"YulExpressionStatement","src":"5897:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"5734:184:111"},{"body":{"nodeType":"YulBlock","src":"6019:1019:111","statements":[{"body":{"nodeType":"YulBlock","src":"6065:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6074:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6077:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6067:6:111"},"nodeType":"YulFunctionCall","src":"6067:12:111"},"nodeType":"YulExpressionStatement","src":"6067:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6040:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6049:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6036:3:111"},"nodeType":"YulFunctionCall","src":"6036:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6061:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6032:3:111"},"nodeType":"YulFunctionCall","src":"6032:32:111"},"nodeType":"YulIf","src":"6029:52:111"},{"nodeType":"YulVariableDeclaration","src":"6090:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6116:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6103:12:111"},"nodeType":"YulFunctionCall","src":"6103:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6094:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6160:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6135:24:111"},"nodeType":"YulFunctionCall","src":"6135:31:111"},"nodeType":"YulExpressionStatement","src":"6135:31:111"},{"nodeType":"YulAssignment","src":"6175:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6185:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6175:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6199:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6230:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6241:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6226:3:111"},"nodeType":"YulFunctionCall","src":"6226:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6213:12:111"},"nodeType":"YulFunctionCall","src":"6213:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6203:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6311:6:111"},"nodeType":"YulFunctionCall","src":"6311:12:111"},"nodeType":"YulExpressionStatement","src":"6311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6294:2:111"},"nodeType":"YulFunctionCall","src":"6294:14:111"},"nodeType":"YulIf","src":"6291:34:111"},{"nodeType":"YulVariableDeclaration","src":"6334:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6348:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6359:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6344:3:111"},"nodeType":"YulFunctionCall","src":"6344:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6338:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6414:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6423:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6426:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6416:6:111"},"nodeType":"YulFunctionCall","src":"6416:12:111"},"nodeType":"YulExpressionStatement","src":"6416:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6393:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6397:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6389:3:111"},"nodeType":"YulFunctionCall","src":"6389:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6404:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6385:3:111"},"nodeType":"YulFunctionCall","src":"6385:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6378:6:111"},"nodeType":"YulFunctionCall","src":"6378:35:111"},"nodeType":"YulIf","src":"6375:55:111"},{"nodeType":"YulVariableDeclaration","src":"6439:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6462:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6449:12:111"},"nodeType":"YulFunctionCall","src":"6449:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6443:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6488:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6490:16:111"},"nodeType":"YulFunctionCall","src":"6490:18:111"},"nodeType":"YulExpressionStatement","src":"6490:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6480:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6484:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6477:2:111"},"nodeType":"YulFunctionCall","src":"6477:10:111"},"nodeType":"YulIf","src":"6474:36:111"},{"nodeType":"YulVariableDeclaration","src":"6519:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6529:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"6523:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6604:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6624:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6618:5:111"},"nodeType":"YulFunctionCall","src":"6618:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"6608:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6636:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6658:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6682:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6686:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6678:3:111"},"nodeType":"YulFunctionCall","src":"6678:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6693:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6674:3:111"},"nodeType":"YulFunctionCall","src":"6674:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"6698:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6670:3:111"},"nodeType":"YulFunctionCall","src":"6670:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6703:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6666:3:111"},"nodeType":"YulFunctionCall","src":"6666:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6654:3:111"},"nodeType":"YulFunctionCall","src":"6654:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"6640:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6766:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6768:16:111"},"nodeType":"YulFunctionCall","src":"6768:18:111"},"nodeType":"YulExpressionStatement","src":"6768:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6725:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6737:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6722:2:111"},"nodeType":"YulFunctionCall","src":"6722:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6745:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"6757:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6742:2:111"},"nodeType":"YulFunctionCall","src":"6742:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"6719:2:111"},"nodeType":"YulFunctionCall","src":"6719:46:111"},"nodeType":"YulIf","src":"6716:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6804:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6808:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6797:6:111"},"nodeType":"YulFunctionCall","src":"6797:22:111"},"nodeType":"YulExpressionStatement","src":"6797:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6835:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6843:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6828:6:111"},"nodeType":"YulFunctionCall","src":"6828:18:111"},"nodeType":"YulExpressionStatement","src":"6828:18:111"},{"body":{"nodeType":"YulBlock","src":"6892:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6901:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6904:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6894:6:111"},"nodeType":"YulFunctionCall","src":"6894:12:111"},"nodeType":"YulExpressionStatement","src":"6894:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6869:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6873:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6865:3:111"},"nodeType":"YulFunctionCall","src":"6865:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"6878:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6861:3:111"},"nodeType":"YulFunctionCall","src":"6861:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6883:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6858:2:111"},"nodeType":"YulFunctionCall","src":"6858:33:111"},"nodeType":"YulIf","src":"6855:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6934:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6930:3:111"},"nodeType":"YulFunctionCall","src":"6930:15:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6951:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6955:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6947:3:111"},"nodeType":"YulFunctionCall","src":"6947:11:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6960:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"6917:12:111"},"nodeType":"YulFunctionCall","src":"6917:46:111"},"nodeType":"YulExpressionStatement","src":"6917:46:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6987:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6995:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6983:3:111"},"nodeType":"YulFunctionCall","src":"6983:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7000:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6979:3:111"},"nodeType":"YulFunctionCall","src":"6979:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"7005:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6972:6:111"},"nodeType":"YulFunctionCall","src":"6972:35:111"},"nodeType":"YulExpressionStatement","src":"6972:35:111"},{"nodeType":"YulAssignment","src":"7016:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"7026:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7016:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5977:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5988:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6000:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6008:6:111","type":""}],"src":"5923:1115:111"},{"body":{"nodeType":"YulBlock","src":"7144:76:111","statements":[{"nodeType":"YulAssignment","src":"7154:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7166:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7177:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7162:3:111"},"nodeType":"YulFunctionCall","src":"7162:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7154:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7196:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7207:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7189:6:111"},"nodeType":"YulFunctionCall","src":"7189:25:111"},"nodeType":"YulExpressionStatement","src":"7189:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7113:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7124:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7135:4:111","type":""}],"src":"7043:177:111"},{"body":{"nodeType":"YulBlock","src":"7326:125:111","statements":[{"nodeType":"YulAssignment","src":"7336:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7359:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7344:3:111"},"nodeType":"YulFunctionCall","src":"7344:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7336:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7378:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7393:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7401:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7389:3:111"},"nodeType":"YulFunctionCall","src":"7389:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7371:6:111"},"nodeType":"YulFunctionCall","src":"7371:74:111"},"nodeType":"YulExpressionStatement","src":"7371:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7295:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7306:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7317:4:111","type":""}],"src":"7225:226:111"},{"body":{"nodeType":"YulBlock","src":"7578:125:111","statements":[{"nodeType":"YulAssignment","src":"7588:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7611:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7596:3:111"},"nodeType":"YulFunctionCall","src":"7596:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7588:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7630:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7645:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7653:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7641:3:111"},"nodeType":"YulFunctionCall","src":"7641:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7623:6:111"},"nodeType":"YulFunctionCall","src":"7623:74:111"},"nodeType":"YulExpressionStatement","src":"7623:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7547:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7558:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7569:4:111","type":""}],"src":"7456:247:111"},{"body":{"nodeType":"YulBlock","src":"7831:489:111","statements":[{"body":{"nodeType":"YulBlock","src":"7877:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7886:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7889:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7879:6:111"},"nodeType":"YulFunctionCall","src":"7879:12:111"},"nodeType":"YulExpressionStatement","src":"7879:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7852:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7861:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7848:3:111"},"nodeType":"YulFunctionCall","src":"7848:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7873:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7844:3:111"},"nodeType":"YulFunctionCall","src":"7844:32:111"},"nodeType":"YulIf","src":"7841:52:111"},{"nodeType":"YulVariableDeclaration","src":"7902:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7928:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7915:12:111"},"nodeType":"YulFunctionCall","src":"7915:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7906:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7972:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7947:24:111"},"nodeType":"YulFunctionCall","src":"7947:31:111"},"nodeType":"YulExpressionStatement","src":"7947:31:111"},{"nodeType":"YulAssignment","src":"7987:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7997:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7987:6:111"}]},{"nodeType":"YulAssignment","src":"8011:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8038:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8049:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8034:3:111"},"nodeType":"YulFunctionCall","src":"8034:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8021:12:111"},"nodeType":"YulFunctionCall","src":"8021:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8011:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8062:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8104:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8089:3:111"},"nodeType":"YulFunctionCall","src":"8089:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8076:12:111"},"nodeType":"YulFunctionCall","src":"8076:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8066:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8151:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8160:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8163:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8153:6:111"},"nodeType":"YulFunctionCall","src":"8153:12:111"},"nodeType":"YulExpressionStatement","src":"8153:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8123:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8131:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8120:2:111"},"nodeType":"YulFunctionCall","src":"8120:30:111"},"nodeType":"YulIf","src":"8117:50:111"},{"nodeType":"YulVariableDeclaration","src":"8176:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8232:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8243:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8228:3:111"},"nodeType":"YulFunctionCall","src":"8228:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8252:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8202:25:111"},"nodeType":"YulFunctionCall","src":"8202:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8180:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"8190:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8269:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"8279:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8269:6:111"}]},{"nodeType":"YulAssignment","src":"8296:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"8306:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8296:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7773:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7784:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7796:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7804:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7812:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7820:6:111","type":""}],"src":"7708:612:111"},{"body":{"nodeType":"YulBlock","src":"8552:1111:111","statements":[{"body":{"nodeType":"YulBlock","src":"8599:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8608:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8611:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8601:6:111"},"nodeType":"YulFunctionCall","src":"8601:12:111"},"nodeType":"YulExpressionStatement","src":"8601:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8573:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8582:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8569:3:111"},"nodeType":"YulFunctionCall","src":"8569:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8594:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8565:3:111"},"nodeType":"YulFunctionCall","src":"8565:33:111"},"nodeType":"YulIf","src":"8562:53:111"},{"nodeType":"YulVariableDeclaration","src":"8624:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8650:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8637:12:111"},"nodeType":"YulFunctionCall","src":"8637:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8628:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8694:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8669:24:111"},"nodeType":"YulFunctionCall","src":"8669:31:111"},"nodeType":"YulExpressionStatement","src":"8669:31:111"},{"nodeType":"YulAssignment","src":"8709:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8719:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8733:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8765:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8776:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8761:3:111"},"nodeType":"YulFunctionCall","src":"8761:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8748:12:111"},"nodeType":"YulFunctionCall","src":"8748:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"8737:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"8814:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8789:24:111"},"nodeType":"YulFunctionCall","src":"8789:33:111"},"nodeType":"YulExpressionStatement","src":"8789:33:111"},{"nodeType":"YulAssignment","src":"8831:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"8841:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8831:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8857:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8888:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8899:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8884:3:111"},"nodeType":"YulFunctionCall","src":"8884:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8871:12:111"},"nodeType":"YulFunctionCall","src":"8871:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8861:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8912:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8922:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8916:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8967:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8976:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8979:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8969:6:111"},"nodeType":"YulFunctionCall","src":"8969:12:111"},"nodeType":"YulExpressionStatement","src":"8969:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8955:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8963:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8952:2:111"},"nodeType":"YulFunctionCall","src":"8952:14:111"},"nodeType":"YulIf","src":"8949:34:111"},{"nodeType":"YulVariableDeclaration","src":"8992:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9060:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9071:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9056:3:111"},"nodeType":"YulFunctionCall","src":"9056:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9080:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9018:37:111"},"nodeType":"YulFunctionCall","src":"9018:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8996:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9006:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9097:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"9107:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9097:6:111"}]},{"nodeType":"YulAssignment","src":"9124:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9134:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9124:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9151:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9195:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9180:3:111"},"nodeType":"YulFunctionCall","src":"9180:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9167:12:111"},"nodeType":"YulFunctionCall","src":"9167:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"9155:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9228:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9237:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9240:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9230:6:111"},"nodeType":"YulFunctionCall","src":"9230:12:111"},"nodeType":"YulExpressionStatement","src":"9230:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"9214:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9224:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9211:2:111"},"nodeType":"YulFunctionCall","src":"9211:16:111"},"nodeType":"YulIf","src":"9208:36:111"},{"nodeType":"YulVariableDeclaration","src":"9253:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9321:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"9332:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9317:3:111"},"nodeType":"YulFunctionCall","src":"9317:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9343:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9279:37:111"},"nodeType":"YulFunctionCall","src":"9279:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"9257:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"9267:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9360:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9370:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9360:6:111"}]},{"nodeType":"YulAssignment","src":"9387:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"9397:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"9387:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9414:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9458:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9443:3:111"},"nodeType":"YulFunctionCall","src":"9443:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9430:12:111"},"nodeType":"YulFunctionCall","src":"9430:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"9418:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9492:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9501:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9504:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9494:6:111"},"nodeType":"YulFunctionCall","src":"9494:12:111"},"nodeType":"YulExpressionStatement","src":"9494:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"9478:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9488:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9475:2:111"},"nodeType":"YulFunctionCall","src":"9475:16:111"},"nodeType":"YulIf","src":"9472:36:111"},{"nodeType":"YulVariableDeclaration","src":"9517:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9573:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"9584:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9569:3:111"},"nodeType":"YulFunctionCall","src":"9569:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9595:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9543:25:111"},"nodeType":"YulFunctionCall","src":"9543:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"9521:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"9531:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9612:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"9622:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"9612:6:111"}]},{"nodeType":"YulAssignment","src":"9639:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"9649:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"9639:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8462:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8473:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8485:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8493:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8501:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8509:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8517:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"8525:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"8533:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"8541:6:111","type":""}],"src":"8325:1338:111"},{"body":{"nodeType":"YulBlock","src":"9825:666:111","statements":[{"body":{"nodeType":"YulBlock","src":"9872:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9881:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9884:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9874:6:111"},"nodeType":"YulFunctionCall","src":"9874:12:111"},"nodeType":"YulExpressionStatement","src":"9874:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9846:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9855:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9842:3:111"},"nodeType":"YulFunctionCall","src":"9842:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9867:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9838:3:111"},"nodeType":"YulFunctionCall","src":"9838:33:111"},"nodeType":"YulIf","src":"9835:53:111"},{"nodeType":"YulVariableDeclaration","src":"9897:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9923:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9910:12:111"},"nodeType":"YulFunctionCall","src":"9910:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9901:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9967:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"9942:24:111"},"nodeType":"YulFunctionCall","src":"9942:31:111"},"nodeType":"YulExpressionStatement","src":"9942:31:111"},{"nodeType":"YulAssignment","src":"9982:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9992:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9982:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10006:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10038:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10049:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10034:3:111"},"nodeType":"YulFunctionCall","src":"10034:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10021:12:111"},"nodeType":"YulFunctionCall","src":"10021:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"10010:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"10087:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10062:24:111"},"nodeType":"YulFunctionCall","src":"10062:33:111"},"nodeType":"YulExpressionStatement","src":"10062:33:111"},{"nodeType":"YulAssignment","src":"10104:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"10114:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10104:6:111"}]},{"nodeType":"YulAssignment","src":"10130:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10157:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10168:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10153:3:111"},"nodeType":"YulFunctionCall","src":"10153:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10140:12:111"},"nodeType":"YulFunctionCall","src":"10140:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10130:6:111"}]},{"nodeType":"YulAssignment","src":"10181:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10208:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10219:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10204:3:111"},"nodeType":"YulFunctionCall","src":"10204:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10191:12:111"},"nodeType":"YulFunctionCall","src":"10191:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10181:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10232:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10263:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10274:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10259:3:111"},"nodeType":"YulFunctionCall","src":"10259:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10246:12:111"},"nodeType":"YulFunctionCall","src":"10246:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"10236:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10322:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10331:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10334:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10324:6:111"},"nodeType":"YulFunctionCall","src":"10324:12:111"},"nodeType":"YulExpressionStatement","src":"10324:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"10294:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10302:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10291:2:111"},"nodeType":"YulFunctionCall","src":"10291:30:111"},"nodeType":"YulIf","src":"10288:50:111"},{"nodeType":"YulVariableDeclaration","src":"10347:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10403:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"10414:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10399:3:111"},"nodeType":"YulFunctionCall","src":"10399:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10423:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"10373:25:111"},"nodeType":"YulFunctionCall","src":"10373:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"10351:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"10361:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10440:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"10450:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"10440:6:111"}]},{"nodeType":"YulAssignment","src":"10467:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"10477:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"10467:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9751:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9762:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9774:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9782:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9790:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"9798:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"9806:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"9814:6:111","type":""}],"src":"9668:823:111"},{"body":{"nodeType":"YulBlock","src":"10670:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10687:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10698:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10680:6:111"},"nodeType":"YulFunctionCall","src":"10680:21:111"},"nodeType":"YulExpressionStatement","src":"10680:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10721:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10732:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10717:3:111"},"nodeType":"YulFunctionCall","src":"10717:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10737:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10710:6:111"},"nodeType":"YulFunctionCall","src":"10710:30:111"},"nodeType":"YulExpressionStatement","src":"10710:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10771:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10756:3:111"},"nodeType":"YulFunctionCall","src":"10756:18:111"},{"hexValue":"77726f6e67206172726179206c656e67746873","kind":"string","nodeType":"YulLiteral","src":"10776:21:111","type":"","value":"wrong array lengths"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10749:6:111"},"nodeType":"YulFunctionCall","src":"10749:49:111"},"nodeType":"YulExpressionStatement","src":"10749:49:111"},{"nodeType":"YulAssignment","src":"10807:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10830:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10815:3:111"},"nodeType":"YulFunctionCall","src":"10815:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10807:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10647:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10661:4:111","type":""}],"src":"10496:343:111"},{"body":{"nodeType":"YulBlock","src":"10876:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10893:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10896:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10886:6:111"},"nodeType":"YulFunctionCall","src":"10886:88:111"},"nodeType":"YulExpressionStatement","src":"10886:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10990:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"10993:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10983:6:111"},"nodeType":"YulFunctionCall","src":"10983:15:111"},"nodeType":"YulExpressionStatement","src":"10983:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11017:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11007:6:111"},"nodeType":"YulFunctionCall","src":"11007:15:111"},"nodeType":"YulExpressionStatement","src":"11007:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"10844:184:111"},{"body":{"nodeType":"YulBlock","src":"11127:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11137:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"11176:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11163:12:111"},"nodeType":"YulFunctionCall","src":"11163:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"11141:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11338:6:111"},"nodeType":"YulFunctionCall","src":"11338:12:111"},"nodeType":"YulExpressionStatement","src":"11338:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"11211:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"11239:12:111"},"nodeType":"YulFunctionCall","src":"11239:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"11255:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11235:3:111"},"nodeType":"YulFunctionCall","src":"11235:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"11266:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11231:3:111"},"nodeType":"YulFunctionCall","src":"11231:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11207:3:111"},"nodeType":"YulFunctionCall","src":"11207:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11200:6:111"},"nodeType":"YulFunctionCall","src":"11200:135:111"},"nodeType":"YulIf","src":"11197:155:111"},{"nodeType":"YulVariableDeclaration","src":"11361:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"11379:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"11389:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11375:3:111"},"nodeType":"YulFunctionCall","src":"11375:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"11365:6:111","type":""}]},{"nodeType":"YulAssignment","src":"11417:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"11440:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11427:12:111"},"nodeType":"YulFunctionCall","src":"11427:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"11417:6:111"}]},{"body":{"nodeType":"YulBlock","src":"11490:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11499:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11502:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11492:6:111"},"nodeType":"YulFunctionCall","src":"11492:12:111"},"nodeType":"YulExpressionStatement","src":"11492:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"11462:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11470:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11459:2:111"},"nodeType":"YulFunctionCall","src":"11459:30:111"},"nodeType":"YulIf","src":"11456:50:111"},{"nodeType":"YulAssignment","src":"11515:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"11527:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11535:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11523:3:111"},"nodeType":"YulFunctionCall","src":"11523:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"11515:4:111"}]},{"body":{"nodeType":"YulBlock","src":"11591:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11600:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11603:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11593:6:111"},"nodeType":"YulFunctionCall","src":"11593:12:111"},"nodeType":"YulExpressionStatement","src":"11593:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"11556:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"11566:12:111"},"nodeType":"YulFunctionCall","src":"11566:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"11582:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11562:3:111"},"nodeType":"YulFunctionCall","src":"11562:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"11552:3:111"},"nodeType":"YulFunctionCall","src":"11552:38:111"},"nodeType":"YulIf","src":"11549:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"11084:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"11094:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"11110:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"11116:6:111","type":""}],"src":"11033:580:111"},{"body":{"nodeType":"YulBlock","src":"11665:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"11764:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11785:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11788:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11778:6:111"},"nodeType":"YulFunctionCall","src":"11778:88:111"},"nodeType":"YulExpressionStatement","src":"11778:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11886:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11889:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11879:6:111"},"nodeType":"YulFunctionCall","src":"11879:15:111"},"nodeType":"YulExpressionStatement","src":"11879:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11914:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11917:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11907:6:111"},"nodeType":"YulFunctionCall","src":"11907:15:111"},"nodeType":"YulExpressionStatement","src":"11907:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11681:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11688:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"11678:2:111"},"nodeType":"YulFunctionCall","src":"11678:77:111"},"nodeType":"YulIf","src":"11675:257:111"},{"nodeType":"YulAssignment","src":"11941:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11952:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11959:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11948:3:111"},"nodeType":"YulFunctionCall","src":"11948:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"11941:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"11647:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"11657:3:111","type":""}],"src":"11618:349:111"},{"body":{"nodeType":"YulBlock","src":"12146:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12163:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12174:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12156:6:111"},"nodeType":"YulFunctionCall","src":"12156:21:111"},"nodeType":"YulExpressionStatement","src":"12156:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12197:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12208:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12193:3:111"},"nodeType":"YulFunctionCall","src":"12193:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12213:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12186:6:111"},"nodeType":"YulFunctionCall","src":"12186:30:111"},"nodeType":"YulExpressionStatement","src":"12186:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12236:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12247:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12232:3:111"},"nodeType":"YulFunctionCall","src":"12232:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"12252:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12225:6:111"},"nodeType":"YulFunctionCall","src":"12225:62:111"},"nodeType":"YulExpressionStatement","src":"12225:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12318:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12303:3:111"},"nodeType":"YulFunctionCall","src":"12303:18:111"},{"hexValue":"64656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"12323:14:111","type":"","value":"delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12296:6:111"},"nodeType":"YulFunctionCall","src":"12296:42:111"},"nodeType":"YulExpressionStatement","src":"12296:42:111"},{"nodeType":"YulAssignment","src":"12347:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12370:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12355:3:111"},"nodeType":"YulFunctionCall","src":"12355:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12347:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12123:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12137:4:111","type":""}],"src":"11972:408:111"},{"body":{"nodeType":"YulBlock","src":"12559:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12587:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12569:6:111"},"nodeType":"YulFunctionCall","src":"12569:21:111"},"nodeType":"YulExpressionStatement","src":"12569:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12610:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12621:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12606:3:111"},"nodeType":"YulFunctionCall","src":"12606:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12626:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12599:6:111"},"nodeType":"YulFunctionCall","src":"12599:30:111"},"nodeType":"YulExpressionStatement","src":"12599:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12649:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12660:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12645:3:111"},"nodeType":"YulFunctionCall","src":"12645:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"12665:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12638:6:111"},"nodeType":"YulFunctionCall","src":"12638:62:111"},"nodeType":"YulExpressionStatement","src":"12638:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12720:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12731:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12716:3:111"},"nodeType":"YulFunctionCall","src":"12716:18:111"},{"hexValue":"6163746976652070726f7879","kind":"string","nodeType":"YulLiteral","src":"12736:14:111","type":"","value":"active proxy"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12709:6:111"},"nodeType":"YulFunctionCall","src":"12709:42:111"},"nodeType":"YulExpressionStatement","src":"12709:42:111"},{"nodeType":"YulAssignment","src":"12760:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12783:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12768:3:111"},"nodeType":"YulFunctionCall","src":"12768:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12760:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12536:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12550:4:111","type":""}],"src":"12385:408:111"},{"body":{"nodeType":"YulBlock","src":"12943:168:111","statements":[{"nodeType":"YulAssignment","src":"12953:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12976:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12961:3:111"},"nodeType":"YulFunctionCall","src":"12961:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12953:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12995:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13010:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13018:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13006:3:111"},"nodeType":"YulFunctionCall","src":"13006:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12988:6:111"},"nodeType":"YulFunctionCall","src":"12988:74:111"},"nodeType":"YulExpressionStatement","src":"12988:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13082:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13093:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13078:3:111"},"nodeType":"YulFunctionCall","src":"13078:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"13098:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13071:6:111"},"nodeType":"YulFunctionCall","src":"13071:34:111"},"nodeType":"YulExpressionStatement","src":"13071:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12904:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12915:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12923:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12934:4:111","type":""}],"src":"12798:313:111"},{"body":{"nodeType":"YulBlock","src":"13290:246:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13318:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13300:6:111"},"nodeType":"YulFunctionCall","src":"13300:21:111"},"nodeType":"YulExpressionStatement","src":"13300:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13341:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13352:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13337:3:111"},"nodeType":"YulFunctionCall","src":"13337:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13357:2:111","type":"","value":"56"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13330:6:111"},"nodeType":"YulFunctionCall","src":"13330:30:111"},"nodeType":"YulExpressionStatement","src":"13330:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13380:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13391:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13376:3:111"},"nodeType":"YulFunctionCall","src":"13376:18:111"},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c","kind":"string","nodeType":"YulLiteral","src":"13396:34:111","type":"","value":"UUPSUpgradeable: must not be cal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13369:6:111"},"nodeType":"YulFunctionCall","src":"13369:62:111"},"nodeType":"YulExpressionStatement","src":"13369:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13462:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13447:3:111"},"nodeType":"YulFunctionCall","src":"13447:18:111"},{"hexValue":"6c6564207468726f7567682064656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"13467:26:111","type":"","value":"led through delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13440:6:111"},"nodeType":"YulFunctionCall","src":"13440:54:111"},"nodeType":"YulExpressionStatement","src":"13440:54:111"},{"nodeType":"YulAssignment","src":"13503:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13526:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13511:3:111"},"nodeType":"YulFunctionCall","src":"13511:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13503:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13267:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13281:4:111","type":""}],"src":"13116:420:111"},{"body":{"nodeType":"YulBlock","src":"13622:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"13668:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13677:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13680:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13670:6:111"},"nodeType":"YulFunctionCall","src":"13670:12:111"},"nodeType":"YulExpressionStatement","src":"13670:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13643:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13652:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13639:3:111"},"nodeType":"YulFunctionCall","src":"13639:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13664:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13635:3:111"},"nodeType":"YulFunctionCall","src":"13635:32:111"},"nodeType":"YulIf","src":"13632:52:111"},{"nodeType":"YulAssignment","src":"13693:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13709:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13703:5:111"},"nodeType":"YulFunctionCall","src":"13703:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13693:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13588:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13599:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13611:6:111","type":""}],"src":"13541:184:111"},{"body":{"nodeType":"YulBlock","src":"13904:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13932:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13914:6:111"},"nodeType":"YulFunctionCall","src":"13914:21:111"},"nodeType":"YulExpressionStatement","src":"13914:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13966:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13951:3:111"},"nodeType":"YulFunctionCall","src":"13951:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13971:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13944:6:111"},"nodeType":"YulFunctionCall","src":"13944:30:111"},"nodeType":"YulExpressionStatement","src":"13944:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14005:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13990:3:111"},"nodeType":"YulFunctionCall","src":"13990:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561","kind":"string","nodeType":"YulLiteral","src":"14010:34:111","type":"","value":"Initializable: contract is alrea"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13983:6:111"},"nodeType":"YulFunctionCall","src":"13983:62:111"},"nodeType":"YulExpressionStatement","src":"13983:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14076:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14061:3:111"},"nodeType":"YulFunctionCall","src":"14061:18:111"},{"hexValue":"647920696e697469616c697a6564","kind":"string","nodeType":"YulLiteral","src":"14081:16:111","type":"","value":"dy initialized"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14054:6:111"},"nodeType":"YulFunctionCall","src":"14054:44:111"},"nodeType":"YulExpressionStatement","src":"14054:44:111"},{"nodeType":"YulAssignment","src":"14107:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14119:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14130:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14115:3:111"},"nodeType":"YulFunctionCall","src":"14115:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14107:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13881:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13895:4:111","type":""}],"src":"13730:410:111"},{"body":{"nodeType":"YulBlock","src":"14252:87:111","statements":[{"nodeType":"YulAssignment","src":"14262:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14285:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14270:3:111"},"nodeType":"YulFunctionCall","src":"14270:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14262:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14304:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14319:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14327:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14315:3:111"},"nodeType":"YulFunctionCall","src":"14315:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14297:6:111"},"nodeType":"YulFunctionCall","src":"14297:36:111"},"nodeType":"YulExpressionStatement","src":"14297:36:111"}]},"name":"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14221:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14232:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14243:4:111","type":""}],"src":"14145:194:111"},{"body":{"nodeType":"YulBlock","src":"14481:225:111","statements":[{"nodeType":"YulAssignment","src":"14491:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14503:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14514:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14499:3:111"},"nodeType":"YulFunctionCall","src":"14499:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14491:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14533:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14556:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14544:3:111"},"nodeType":"YulFunctionCall","src":"14544:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14526:6:111"},"nodeType":"YulFunctionCall","src":"14526:74:111"},"nodeType":"YulExpressionStatement","src":"14526:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14620:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14631:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14616:3:111"},"nodeType":"YulFunctionCall","src":"14616:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"14640:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14648:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14636:3:111"},"nodeType":"YulFunctionCall","src":"14636:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14609:6:111"},"nodeType":"YulFunctionCall","src":"14609:91:111"},"nodeType":"YulExpressionStatement","src":"14609:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14442:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14453:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14461:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14472:4:111","type":""}],"src":"14344:362:111"},{"body":{"nodeType":"YulBlock","src":"14885:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14902:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14913:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14895:6:111"},"nodeType":"YulFunctionCall","src":"14895:21:111"},"nodeType":"YulExpressionStatement","src":"14895:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14947:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14932:3:111"},"nodeType":"YulFunctionCall","src":"14932:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14952:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14925:6:111"},"nodeType":"YulFunctionCall","src":"14925:30:111"},"nodeType":"YulExpressionStatement","src":"14925:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14975:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14986:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14971:3:111"},"nodeType":"YulFunctionCall","src":"14971:18:111"},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"14991:34:111","type":"","value":"account: not Owner or EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14964:6:111"},"nodeType":"YulFunctionCall","src":"14964:62:111"},"nodeType":"YulExpressionStatement","src":"14964:62:111"},{"nodeType":"YulAssignment","src":"15035:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15047:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15058:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15043:3:111"},"nodeType":"YulFunctionCall","src":"15043:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15035:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14862:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14876:4:111","type":""}],"src":"14711:356:111"},{"body":{"nodeType":"YulBlock","src":"15125:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15135:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15144:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"15139:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15204:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"15229:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"15234:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15225:3:111"},"nodeType":"YulFunctionCall","src":"15225:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"15248:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"15253:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15244:3:111"},"nodeType":"YulFunctionCall","src":"15244:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15238:5:111"},"nodeType":"YulFunctionCall","src":"15238:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15218:6:111"},"nodeType":"YulFunctionCall","src":"15218:39:111"},"nodeType":"YulExpressionStatement","src":"15218:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15165:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"15168:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"15162:2:111"},"nodeType":"YulFunctionCall","src":"15162:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"15176:19:111","statements":[{"nodeType":"YulAssignment","src":"15178:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15187:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"15190:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15183:3:111"},"nodeType":"YulFunctionCall","src":"15183:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"15178:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"15158:3:111","statements":[]},"src":"15154:113:111"},{"body":{"nodeType":"YulBlock","src":"15293:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"15306:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15311:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15302:3:111"},"nodeType":"YulFunctionCall","src":"15302:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"15320:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15295:6:111"},"nodeType":"YulFunctionCall","src":"15295:27:111"},"nodeType":"YulExpressionStatement","src":"15295:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15282:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"15285:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"15279:2:111"},"nodeType":"YulFunctionCall","src":"15279:13:111"},"nodeType":"YulIf","src":"15276:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"15103:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"15108:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"15113:6:111","type":""}],"src":"15072:258:111"},{"body":{"nodeType":"YulBlock","src":"15472:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15482:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15502:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15496:5:111"},"nodeType":"YulFunctionCall","src":"15496:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15486:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15544:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15552:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15540:3:111"},"nodeType":"YulFunctionCall","src":"15540:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"15559:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15564:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"15518:21:111"},"nodeType":"YulFunctionCall","src":"15518:53:111"},"nodeType":"YulExpressionStatement","src":"15518:53:111"},{"nodeType":"YulAssignment","src":"15580:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15591:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15596:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15587:3:111"},"nodeType":"YulFunctionCall","src":"15587:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"15580:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"15448:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15453:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"15464:3:111","type":""}],"src":"15335:274:111"},{"body":{"nodeType":"YulBlock","src":"15695:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"15741:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15750:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15753:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15743:6:111"},"nodeType":"YulFunctionCall","src":"15743:12:111"},"nodeType":"YulExpressionStatement","src":"15743:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15716:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15725:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15712:3:111"},"nodeType":"YulFunctionCall","src":"15712:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15737:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15708:3:111"},"nodeType":"YulFunctionCall","src":"15708:32:111"},"nodeType":"YulIf","src":"15705:52:111"},{"nodeType":"YulAssignment","src":"15766:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15782:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15776:5:111"},"nodeType":"YulFunctionCall","src":"15776:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15766:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15661:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15672:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15684:6:111","type":""}],"src":"15614:184:111"},{"body":{"nodeType":"YulBlock","src":"15977:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16005:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15987:6:111"},"nodeType":"YulFunctionCall","src":"15987:21:111"},"nodeType":"YulExpressionStatement","src":"15987:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16028:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16039:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16024:3:111"},"nodeType":"YulFunctionCall","src":"16024:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16044:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16017:6:111"},"nodeType":"YulFunctionCall","src":"16017:30:111"},"nodeType":"YulExpressionStatement","src":"16017:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16067:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16078:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16063:3:111"},"nodeType":"YulFunctionCall","src":"16063:18:111"},{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"16083:34:111","type":"","value":"ERC1967Upgrade: new implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16056:6:111"},"nodeType":"YulFunctionCall","src":"16056:62:111"},"nodeType":"YulExpressionStatement","src":"16056:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16138:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16149:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16134:3:111"},"nodeType":"YulFunctionCall","src":"16134:18:111"},{"hexValue":"6f6e206973206e6f742055555053","kind":"string","nodeType":"YulLiteral","src":"16154:16:111","type":"","value":"on is not UUPS"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16127:6:111"},"nodeType":"YulFunctionCall","src":"16127:44:111"},"nodeType":"YulExpressionStatement","src":"16127:44:111"},{"nodeType":"YulAssignment","src":"16180:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16192:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16203:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16188:3:111"},"nodeType":"YulFunctionCall","src":"16188:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16180:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15954:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15968:4:111","type":""}],"src":"15803:410:111"},{"body":{"nodeType":"YulBlock","src":"16392:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16409:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16420:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16402:6:111"},"nodeType":"YulFunctionCall","src":"16402:21:111"},"nodeType":"YulExpressionStatement","src":"16402:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16443:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16454:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16439:3:111"},"nodeType":"YulFunctionCall","src":"16439:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16459:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16432:6:111"},"nodeType":"YulFunctionCall","src":"16432:30:111"},"nodeType":"YulExpressionStatement","src":"16432:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16482:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16493:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16478:3:111"},"nodeType":"YulFunctionCall","src":"16478:18:111"},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f78","kind":"string","nodeType":"YulLiteral","src":"16498:34:111","type":"","value":"ERC1967Upgrade: unsupported prox"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16471:6:111"},"nodeType":"YulFunctionCall","src":"16471:62:111"},"nodeType":"YulExpressionStatement","src":"16471:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16564:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16549:3:111"},"nodeType":"YulFunctionCall","src":"16549:18:111"},{"hexValue":"6961626c6555554944","kind":"string","nodeType":"YulLiteral","src":"16569:11:111","type":"","value":"iableUUID"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16542:6:111"},"nodeType":"YulFunctionCall","src":"16542:39:111"},"nodeType":"YulExpressionStatement","src":"16542:39:111"},{"nodeType":"YulAssignment","src":"16590:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16602:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16613:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16598:3:111"},"nodeType":"YulFunctionCall","src":"16598:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16590:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16369:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16383:4:111","type":""}],"src":"16218:405:111"},{"body":{"nodeType":"YulBlock","src":"16802:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16830:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16812:6:111"},"nodeType":"YulFunctionCall","src":"16812:21:111"},"nodeType":"YulExpressionStatement","src":"16812:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16853:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16864:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16849:3:111"},"nodeType":"YulFunctionCall","src":"16849:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16869:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16842:6:111"},"nodeType":"YulFunctionCall","src":"16842:30:111"},"nodeType":"YulExpressionStatement","src":"16842:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16892:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16903:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16888:3:111"},"nodeType":"YulFunctionCall","src":"16888:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"16908:30:111","type":"","value":"account: not from EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16881:6:111"},"nodeType":"YulFunctionCall","src":"16881:58:111"},"nodeType":"YulExpressionStatement","src":"16881:58:111"},{"nodeType":"YulAssignment","src":"16948:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16960:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16971:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16956:3:111"},"nodeType":"YulFunctionCall","src":"16956:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16948:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16779:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16793:4:111","type":""}],"src":"16628:352:111"},{"body":{"nodeType":"YulBlock","src":"17176:14:111","statements":[{"nodeType":"YulAssignment","src":"17178:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"17185:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17178:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17160:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17168:3:111","type":""}],"src":"16985:205:111"},{"body":{"nodeType":"YulBlock","src":"17369:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17386:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17397:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17379:6:111"},"nodeType":"YulFunctionCall","src":"17379:21:111"},"nodeType":"YulExpressionStatement","src":"17379:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17420:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17431:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17416:3:111"},"nodeType":"YulFunctionCall","src":"17416:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17436:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17409:6:111"},"nodeType":"YulFunctionCall","src":"17409:30:111"},"nodeType":"YulExpressionStatement","src":"17409:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17459:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17470:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17455:3:111"},"nodeType":"YulFunctionCall","src":"17455:18:111"},{"hexValue":"6f6e6c79206f776e6572","kind":"string","nodeType":"YulLiteral","src":"17475:12:111","type":"","value":"only owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17448:6:111"},"nodeType":"YulFunctionCall","src":"17448:40:111"},"nodeType":"YulExpressionStatement","src":"17448:40:111"},{"nodeType":"YulAssignment","src":"17497:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17520:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17505:3:111"},"nodeType":"YulFunctionCall","src":"17505:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17497:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17346:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17360:4:111","type":""}],"src":"17195:334:111"},{"body":{"nodeType":"YulBlock","src":"17708:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17725:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17736:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17718:6:111"},"nodeType":"YulFunctionCall","src":"17718:21:111"},"nodeType":"YulExpressionStatement","src":"17718:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17770:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17755:3:111"},"nodeType":"YulFunctionCall","src":"17755:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17775:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17748:6:111"},"nodeType":"YulFunctionCall","src":"17748:30:111"},"nodeType":"YulExpressionStatement","src":"17748:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17809:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17794:3:111"},"nodeType":"YulFunctionCall","src":"17794:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"17814:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17787:6:111"},"nodeType":"YulFunctionCall","src":"17787:62:111"},"nodeType":"YulExpressionStatement","src":"17787:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17869:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17880:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17865:3:111"},"nodeType":"YulFunctionCall","src":"17865:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"17885:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17858:6:111"},"nodeType":"YulFunctionCall","src":"17858:43:111"},"nodeType":"YulExpressionStatement","src":"17858:43:111"},{"nodeType":"YulAssignment","src":"17910:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17922:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17933:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17918:3:111"},"nodeType":"YulFunctionCall","src":"17918:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17910:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17685:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17699:4:111","type":""}],"src":"17534:409:111"},{"body":{"nodeType":"YulBlock","src":"18168:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"18185:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"18190:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18178:6:111"},"nodeType":"YulFunctionCall","src":"18178:79:111"},"nodeType":"YulExpressionStatement","src":"18178:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"18277:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"18282:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18273:3:111"},"nodeType":"YulFunctionCall","src":"18273:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"18287:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18266:6:111"},"nodeType":"YulFunctionCall","src":"18266:28:111"},"nodeType":"YulExpressionStatement","src":"18266:28:111"},{"nodeType":"YulAssignment","src":"18303:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"18314:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"18319:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18310:3:111"},"nodeType":"YulFunctionCall","src":"18310:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"18303:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"18144:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18149:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"18160:3:111","type":""}],"src":"17948:380:111"},{"body":{"nodeType":"YulBlock","src":"18365:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18382:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18385:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18375:6:111"},"nodeType":"YulFunctionCall","src":"18375:88:111"},"nodeType":"YulExpressionStatement","src":"18375:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18479:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"18482:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18472:6:111"},"nodeType":"YulFunctionCall","src":"18472:15:111"},"nodeType":"YulExpressionStatement","src":"18472:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18503:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18506:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18496:6:111"},"nodeType":"YulFunctionCall","src":"18496:15:111"},"nodeType":"YulExpressionStatement","src":"18496:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"18333:184:111"},{"body":{"nodeType":"YulBlock","src":"18696:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18724:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18706:6:111"},"nodeType":"YulFunctionCall","src":"18706:21:111"},"nodeType":"YulExpressionStatement","src":"18706:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18747:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18758:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18743:3:111"},"nodeType":"YulFunctionCall","src":"18743:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18763:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18736:6:111"},"nodeType":"YulFunctionCall","src":"18736:30:111"},"nodeType":"YulExpressionStatement","src":"18736:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18786:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18797:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18782:3:111"},"nodeType":"YulFunctionCall","src":"18782:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"18802:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18775:6:111"},"nodeType":"YulFunctionCall","src":"18775:54:111"},"nodeType":"YulExpressionStatement","src":"18775:54:111"},{"nodeType":"YulAssignment","src":"18838:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18850:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18861:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18846:3:111"},"nodeType":"YulFunctionCall","src":"18846:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18838:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18673:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18687:4:111","type":""}],"src":"18522:348:111"},{"body":{"nodeType":"YulBlock","src":"19049:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19077:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19059:6:111"},"nodeType":"YulFunctionCall","src":"19059:21:111"},"nodeType":"YulExpressionStatement","src":"19059:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19100:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19111:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19096:3:111"},"nodeType":"YulFunctionCall","src":"19096:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19116:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19089:6:111"},"nodeType":"YulFunctionCall","src":"19089:30:111"},"nodeType":"YulExpressionStatement","src":"19089:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19139:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19150:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19135:3:111"},"nodeType":"YulFunctionCall","src":"19135:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"19155:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19128:6:111"},"nodeType":"YulFunctionCall","src":"19128:61:111"},"nodeType":"YulExpressionStatement","src":"19128:61:111"},{"nodeType":"YulAssignment","src":"19198:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19210:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19221:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19206:3:111"},"nodeType":"YulFunctionCall","src":"19206:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19198:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19026:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19040:4:111","type":""}],"src":"18875:355:111"},{"body":{"nodeType":"YulBlock","src":"19409:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19426:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19437:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19419:6:111"},"nodeType":"YulFunctionCall","src":"19419:21:111"},"nodeType":"YulExpressionStatement","src":"19419:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19460:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19471:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19456:3:111"},"nodeType":"YulFunctionCall","src":"19456:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19476:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19449:6:111"},"nodeType":"YulFunctionCall","src":"19449:30:111"},"nodeType":"YulExpressionStatement","src":"19449:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19499:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19510:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19495:3:111"},"nodeType":"YulFunctionCall","src":"19495:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"19515:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19488:6:111"},"nodeType":"YulFunctionCall","src":"19488:62:111"},"nodeType":"YulExpressionStatement","src":"19488:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19570:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19581:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19566:3:111"},"nodeType":"YulFunctionCall","src":"19566:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"19586:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19559:6:111"},"nodeType":"YulFunctionCall","src":"19559:32:111"},"nodeType":"YulExpressionStatement","src":"19559:32:111"},{"nodeType":"YulAssignment","src":"19600:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19612:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19623:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19608:3:111"},"nodeType":"YulFunctionCall","src":"19608:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19600:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19386:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19400:4:111","type":""}],"src":"19235:398:111"},{"body":{"nodeType":"YulBlock","src":"19819:217:111","statements":[{"nodeType":"YulAssignment","src":"19829:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19852:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19837:3:111"},"nodeType":"YulFunctionCall","src":"19837:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19829:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19872:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"19883:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19865:6:111"},"nodeType":"YulFunctionCall","src":"19865:25:111"},"nodeType":"YulExpressionStatement","src":"19865:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19910:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19921:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19906:3:111"},"nodeType":"YulFunctionCall","src":"19906:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"19930:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19938:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19926:3:111"},"nodeType":"YulFunctionCall","src":"19926:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19899:6:111"},"nodeType":"YulFunctionCall","src":"19899:45:111"},"nodeType":"YulExpressionStatement","src":"19899:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19975:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19960:3:111"},"nodeType":"YulFunctionCall","src":"19960:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"19980:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19953:6:111"},"nodeType":"YulFunctionCall","src":"19953:34:111"},"nodeType":"YulExpressionStatement","src":"19953:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20007:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20018:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20003:3:111"},"nodeType":"YulFunctionCall","src":"20003:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"20023:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19996:6:111"},"nodeType":"YulFunctionCall","src":"19996:34:111"},"nodeType":"YulExpressionStatement","src":"19996:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19764:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"19775:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"19783:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"19791:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19799:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19810:4:111","type":""}],"src":"19638:398:111"},{"body":{"nodeType":"YulBlock","src":"20215:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20232:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20243:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20225:6:111"},"nodeType":"YulFunctionCall","src":"20225:21:111"},"nodeType":"YulExpressionStatement","src":"20225:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20266:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20277:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20262:3:111"},"nodeType":"YulFunctionCall","src":"20262:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20282:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20255:6:111"},"nodeType":"YulFunctionCall","src":"20255:30:111"},"nodeType":"YulExpressionStatement","src":"20255:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20305:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20316:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20301:3:111"},"nodeType":"YulFunctionCall","src":"20301:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"20321:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20294:6:111"},"nodeType":"YulFunctionCall","src":"20294:59:111"},"nodeType":"YulExpressionStatement","src":"20294:59:111"},{"nodeType":"YulAssignment","src":"20362:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20374:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20385:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20370:3:111"},"nodeType":"YulFunctionCall","src":"20370:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20362:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20192:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20206:4:111","type":""}],"src":"20041:353:111"},{"body":{"nodeType":"YulBlock","src":"20520:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20537:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20548:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20530:6:111"},"nodeType":"YulFunctionCall","src":"20530:21:111"},"nodeType":"YulExpressionStatement","src":"20530:21:111"},{"nodeType":"YulVariableDeclaration","src":"20560:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20580:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20574:5:111"},"nodeType":"YulFunctionCall","src":"20574:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"20564:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20618:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20603:3:111"},"nodeType":"YulFunctionCall","src":"20603:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"20623:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20596:6:111"},"nodeType":"YulFunctionCall","src":"20596:34:111"},"nodeType":"YulExpressionStatement","src":"20596:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20665:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20673:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20661:3:111"},"nodeType":"YulFunctionCall","src":"20661:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20682:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20693:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20678:3:111"},"nodeType":"YulFunctionCall","src":"20678:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"20698:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"20639:21:111"},"nodeType":"YulFunctionCall","src":"20639:66:111"},"nodeType":"YulExpressionStatement","src":"20639:66:111"},{"nodeType":"YulAssignment","src":"20714:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20730:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"20749:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20757:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20745:3:111"},"nodeType":"YulFunctionCall","src":"20745:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"20762:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20741:3:111"},"nodeType":"YulFunctionCall","src":"20741:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20726:3:111"},"nodeType":"YulFunctionCall","src":"20726:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"20832:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20722:3:111"},"nodeType":"YulFunctionCall","src":"20722:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20714:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20489:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20500:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20511:4:111","type":""}],"src":"20399:442:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_address_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value1 := memPtr\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong array lengths\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"active proxy\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 56)\n mstore(add(headStart, 64), \"UUPSUpgradeable: must not be cal\")\n mstore(add(headStart, 96), \"led through delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"Initializable: contract is alrea\")\n mstore(add(headStart, 96), \"dy initialized\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"account: not Owner or EntryPoint\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"ERC1967Upgrade: new implementati\")\n mstore(add(headStart, 96), \"on is not UUPS\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"ERC1967Upgrade: unsupported prox\")\n mstore(add(headStart, 96), \"iableUUID\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"only owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"3559":[{"length":32,"start":1617},{"length":32,"start":1767},{"length":32,"start":2462},{"length":32,"start":2612},{"length":32,"start":2915}],"13841":[{"length":32,"start":815},{"length":32,"start":2099},{"length":32,"start":2266},{"length":32,"start":3248},{"length":32,"start":3815},{"length":32,"start":3886},{"length":32,"start":4658},{"length":32,"start":5309}]},"linkReferences":{},"object":"60806040526004361061012c5760003560e01c806352d1902d116100a5578063bc197c8111610074578063c4d66de811610059578063c4d66de8146103d0578063d087d288146103f0578063f23a6e611461040557600080fd5b8063bc197c8114610373578063c399ec88146103bb57600080fd5b806352d1902d146102b35780638da5cb5b146102c8578063b0d691fe14610320578063b61d27f61461035357600080fd5b80633659cfe6116100fc5780634a58db19116100e15780634a58db19146102785780634d44560d146102805780634f1ef286146102a057600080fd5b80633659cfe61461022a5780633a871cdd1461024a57600080fd5b806223de291461013857806301ffc9a71461015f578063150b7a021461019457806318dfb3c71461020a57600080fd5b3661013357005b600080fd5b34801561014457600080fd5b5061015d610153366004611aeb565b5050505050505050565b005b34801561016b57600080fd5b5061017f61017a366004611b9c565b61044b565b60405190151581526020015b60405180910390f35b3480156101a057600080fd5b506101d96101af366004611bde565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161018b565b34801561021657600080fd5b5061015d610225366004611c96565b610530565b34801561023657600080fd5b5061015d610245366004611d02565b61063a565b34801561025657600080fd5b5061026a610265366004611d1f565b61080b565b60405190815260200161018b565b61015d610831565b34801561028c57600080fd5b5061015d61029b366004611d73565b6108d0565b61015d6102ae366004611dce565b610987565b3480156102bf57600080fd5b5061026a610b49565b3480156102d457600080fd5b506000546102fb9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018b565b34801561032c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102fb565b34801561035f57600080fd5b5061015d61036e366004611eb0565b610c1b565b34801561037f57600080fd5b506101d961038e366004611f00565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156103c757600080fd5b5061026a610c6a565b3480156103dc57600080fd5b5061015d6103eb366004611d02565b610d21565b3480156103fc57600080fd5b5061026a610e9a565b34801561041157600080fd5b506101d9610420366004611f9e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061052a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610538610f16565b82811461058c5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610633576106218585838181106105ac576105ac61201a565b90506020020160208101906105c19190611d02565b60008585858181106105d5576105d561201a565b90506020028101906105e79190612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b8061062b816120ae565b91505061058f565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106e55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661075a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146107e35760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b6107ec81611042565b604080516000808252602082019092526108089183919061104a565b50565b600061081561121a565b61081f848461129f565b905061082a82611385565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156108bc57600080fd5b505af1158015610633573d6000803e3d6000fd5b6108d86113f0565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610a325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610aa77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b610b3982611042565b610b458282600161104a565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bf65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610583565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610c23610f16565b610c64848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c919061210d565b905090565b600054610100900460ff1615808015610d415750600054600160ff909116105b80610d5b5750303b158015610d5b575060005460ff166001145b610dcd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610583565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e2b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e3482611467565b8015610b4557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610cdb565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480610f77575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b610fc35760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610583565b565b6000808473ffffffffffffffffffffffffffffffffffffffff168484604051610fee9190612152565b60006040518083038185875af1925050503d806000811461102b576040519150601f19603f3d011682016040523d82523d6000602084013e611030565b606091505b50915091508161063357805160208201fd5b6108086113f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156110825761107d83611506565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611107575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111049181019061210d565b60015b6111795760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461120e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610583565b5061107d8383836115f6565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610fc35760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610583565b6000806112f9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905061134961130c610140860186612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859392505061161b9050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461137b57600191505061052a565b5060009392505050565b80156108085760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610633576040519150601f19603f3d011682016040523d82523d6000602084013e610633565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061141b57503330145b610fc35760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610583565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115905760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115ff8361163f565b60008251118061160c5750805b1561107d57610c64838361168c565b600080600061162a85856116b1565b91509150611637816116f6565b509392505050565b61164881611506565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061082a83836040518060600160405280602781526020016121ef6027913961185b565b60008082516041036116e75760208301516040840151606085015160001a6116db878285856118e0565b945094505050506116ef565b506000905060025b9250929050565b600081600481111561170a5761170a61216e565b036117125750565b60018160048111156117265761172661216e565b036117735760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610583565b60028160048111156117875761178761216e565b036117d45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610583565b60038160048111156117e8576117e861216e565b036108085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610583565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516118859190612152565b600060405180830381855af49150503d80600081146118c0576040519150601f19603f3d011682016040523d82523d6000602084013e6118c5565b606091505b50915091506118d6868383876119cf565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561191757506000905060036119c6565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561196b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119bf576000600192509250506119c6565b9150600090505b94509492505050565b60608315611a4b578251600003611a445773ffffffffffffffffffffffffffffffffffffffff85163b611a445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610583565b5081611a55565b611a558383611a5d565b949350505050565b815115611a6d5781518083602001fd5b8060405162461bcd60e51b8152600401610583919061219d565b73ffffffffffffffffffffffffffffffffffffffff8116811461080857600080fd5b60008083601f840112611abb57600080fd5b50813567ffffffffffffffff811115611ad357600080fd5b6020830191508360208285010111156116ef57600080fd5b60008060008060008060008060c0898b031215611b0757600080fd5b8835611b1281611a87565b97506020890135611b2281611a87565b96506040890135611b3281611a87565b955060608901359450608089013567ffffffffffffffff80821115611b5657600080fd5b611b628c838d01611aa9565b909650945060a08b0135915080821115611b7b57600080fd5b50611b888b828c01611aa9565b999c989b5096995094979396929594505050565b600060208284031215611bae57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461082a57600080fd5b600080600080600060808688031215611bf657600080fd5b8535611c0181611a87565b94506020860135611c1181611a87565b935060408601359250606086013567ffffffffffffffff811115611c3457600080fd5b611c4088828901611aa9565b969995985093965092949392505050565b60008083601f840112611c6357600080fd5b50813567ffffffffffffffff811115611c7b57600080fd5b6020830191508360208260051b85010111156116ef57600080fd5b60008060008060408587031215611cac57600080fd5b843567ffffffffffffffff80821115611cc457600080fd5b611cd088838901611c51565b90965094506020870135915080821115611ce957600080fd5b50611cf687828801611c51565b95989497509550505050565b600060208284031215611d1457600080fd5b813561082a81611a87565b600080600060608486031215611d3457600080fd5b833567ffffffffffffffff811115611d4b57600080fd5b84016101608187031215611d5e57600080fd5b95602085013595506040909401359392505050565b60008060408385031215611d8657600080fd5b8235611d9181611a87565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611de157600080fd5b8235611dec81611a87565b9150602083013567ffffffffffffffff80821115611e0957600080fd5b818501915085601f830112611e1d57600080fd5b813581811115611e2f57611e2f611d9f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611e7557611e75611d9f565b81604052828152886020848701011115611e8e57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611ec657600080fd5b8435611ed181611a87565b935060208501359250604085013567ffffffffffffffff811115611ef457600080fd5b611cf687828801611aa9565b60008060008060008060008060a0898b031215611f1c57600080fd5b8835611f2781611a87565b97506020890135611f3781611a87565b9650604089013567ffffffffffffffff80821115611f5457600080fd5b611f608c838d01611c51565b909850965060608b0135915080821115611f7957600080fd5b611f858c838d01611c51565b909650945060808b0135915080821115611b7b57600080fd5b60008060008060008060a08789031215611fb757600080fd5b8635611fc281611a87565b95506020870135611fd281611a87565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ffc57600080fd5b61200889828a01611aa9565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261207e57600080fd5b83018035915067ffffffffffffffff82111561209957600080fd5b6020019150368190038213156116ef57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612106577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561211f57600080fd5b5051919050565b60005b83811015612141578181015183820152602001612129565b83811115610c645750506000910152565b60008251612164818460208701612126565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526121bc816040850160208701612126565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fe270ff8e4072df8d4acd6383803b1e259c9c59c3f3a7c1d73e5cdf4d869ca8064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x12C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x373 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x2A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x15F JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x133 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x153 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AEB JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17F PUSH2 0x17A CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x44B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x1AF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BDE JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C96 JUMP JUMPDEST PUSH2 0x530 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0x63A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D1F JUMP JUMPDEST PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x15D PUSH2 0x831 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x29B CALLDATASIZE PUSH1 0x4 PUSH2 0x1D73 JUMP JUMPDEST PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x15D PUSH2 0x2AE CALLDATASIZE PUSH1 0x4 PUSH2 0x1DCE JUMP JUMPDEST PUSH2 0x987 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xB49 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2FB SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x36E CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB0 JUMP JUMPDEST PUSH2 0xC1B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x38E CALLDATASIZE PUSH1 0x4 PUSH2 0x1F00 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xC6A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0xD21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xE9A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x420 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F9E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x52A JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x538 PUSH2 0xF16 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x58C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x633 JUMPI PUSH2 0x621 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5AC JUMPI PUSH2 0x5AC PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x5C1 SWAP2 SWAP1 PUSH2 0x1D02 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x5D5 JUMPI PUSH2 0x5D5 PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x5E7 SWAP2 SWAP1 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x62B DUP2 PUSH2 0x20AE JUMP JUMPDEST SWAP2 POP POP PUSH2 0x58F JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x6E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x75A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x7E3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0x7EC DUP2 PUSH2 0x1042 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x808 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x104A JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x815 PUSH2 0x121A JUMP JUMPDEST PUSH2 0x81F DUP5 DUP5 PUSH2 0x129F JUMP JUMPDEST SWAP1 POP PUSH2 0x82A DUP3 PUSH2 0x1385 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x633 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x8D8 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x96B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x97F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xA32 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xAA7 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0xB39 DUP3 PUSH2 0x1042 JUMP JUMPDEST PUSH2 0xB45 DUP3 DUP3 PUSH1 0x1 PUSH2 0x104A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xBF6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xC23 PUSH2 0xF16 JUMP JUMPDEST PUSH2 0xC64 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCF8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xD1C SWAP2 SWAP1 PUSH2 0x210D JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xD41 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xD5B JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xDCD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xE2B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xE34 DUP3 PUSH2 0x1467 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB45 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xCDB JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0xF77 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0xFEE SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x102B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1030 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x633 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x808 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1082 JUMPI PUSH2 0x107D DUP4 PUSH2 0x1506 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1107 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x1104 SWAP2 DUP2 ADD SWAP1 PUSH2 0x210D JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1179 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH2 0x107D DUP4 DUP4 DUP4 PUSH2 0x15F6 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12F9 DUP4 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH2 0x1349 PUSH2 0x130C PUSH2 0x140 DUP7 ADD DUP7 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP6 SWAP4 SWAP3 POP POP PUSH2 0x161B SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x137B JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0x52A JUMP JUMPDEST POP PUSH1 0x0 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x633 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x633 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x141B JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1590 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15FF DUP4 PUSH2 0x163F JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x160C JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x107D JUMPI PUSH2 0xC64 DUP4 DUP4 PUSH2 0x168C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x162A DUP6 DUP6 PUSH2 0x16B1 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1637 DUP2 PUSH2 0x16F6 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1648 DUP2 PUSH2 0x1506 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x82A DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x21EF PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x185B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x16E7 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x16DB DUP8 DUP3 DUP6 DUP6 PUSH2 0x18E0 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x16EF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x170A JUMPI PUSH2 0x170A PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1712 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1726 JUMPI PUSH2 0x1726 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1773 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1787 JUMPI PUSH2 0x1787 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x17D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x17E8 JUMPI PUSH2 0x17E8 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1885 SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x18C0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x18C5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x18D6 DUP7 DUP4 DUP4 DUP8 PUSH2 0x19CF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1917 JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x196B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x19BF JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A4B JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A44 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST POP DUP2 PUSH2 0x1A55 JUMP JUMPDEST PUSH2 0x1A55 DUP4 DUP4 PUSH2 0x1A5D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A6D JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x583 SWAP2 SWAP1 PUSH2 0x219D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x808 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1ABB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1B12 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1B22 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1B32 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP13 DUP4 DUP14 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B88 DUP12 DUP3 DUP13 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1BF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C01 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1C11 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C40 DUP9 DUP3 DUP10 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1CAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CD0 DUP9 DUP4 DUP10 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1CE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x82A DUP2 PUSH2 0x1A87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1D91 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1DE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1DEC DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1E2F JUMPI PUSH2 0x1E2F PUSH2 0x1D9F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1E75 JUMPI PUSH2 0x1E75 PUSH2 0x1D9F JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1E8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1EC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1ED1 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1AA9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1F1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1F27 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1F37 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F60 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F85 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1FC2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1FD2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1FFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2008 DUP10 DUP3 DUP11 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x207E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2099 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2106 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x211F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2141 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2129 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2164 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x21BC DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FE270F 0xF8 0xE4 SMOD 0x2D 0xF8 0xD4 0xAC 0xD6 CODESIZE CODESIZE SUB 0xB1 0xE2 MSIZE 0xC9 0xC5 SWAP13 EXTCODEHASH GASPRICE PUSH29 0x1D73E5CDF4D869CA8064736F6C634300080F0033000000000000000000 ","sourceMap":"637:3852:73:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176:86;;;;;;;;;;-1:-1:-1;581:176:86;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;;;;;-1:-1:-1;1489:298:86;;;;;:::i;:::-;;:::i;:::-;;;2237:14:111;;2230:22;2212:41;;2200:2;2185:18;1489:298:86;;;;;;;;763:212;;;;;;;;;;-1:-1:-1;763:212:86;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;3197:66:111;3185:79;;;3167:98;;3155:2;3140:18;763:212:86;3023:248:111;1902:297:73;;;;;;;;;;-1:-1:-1;1902:297:73;;;;;:::i;:::-;;:::i;3073:197:32:-;;;;;;;;;;-1:-1:-1;3073:197:32;;;;;:::i;:::-;;:::i;1458:353:51:-;;;;;;;;;;-1:-1:-1;1458:353:51;;;;;:::i;:::-;;:::i;:::-;;;5370:25:111;;;5358:2;5343:18;1458:353:51;5224:177:111;3926:110:73;;;:::i;4188:158::-;;;;;;;;;;-1:-1:-1;4188:158:73;;;;;:::i;:::-;;:::i;3519:222:32:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;765:20:73:-;;;;;;;;;;-1:-1:-1;765:20:73;;;;;;;;;;;;;;7401:42:111;7389:55;;;7371:74;;7359:2;7344:18;765:20:73;7225:226:111;1031:108:73;;;;;;;;;;-1:-1:-1;1121:11:73;1031:108;;1680:158;;;;;;;;;;-1:-1:-1;1680:158:73;;;;;:::i;:::-;;:::i;1219:264:86:-;;;;;;;;;;-1:-1:-1;1219:264:86;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;3730:113:73;;;;;;;;;;;;;:::i;2483:101::-;;;;;;;;;;-1:-1:-1;2483:101:73;;;;;:::i;:::-;;:::i;935:121:51:-;;;;;;;;;;;;;:::i;981:232:86:-;;;;;;;;;;-1:-1:-1;981:232:86;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;1902:297:73:-;1991:31;:29;:31::i;:::-;2040:26;;;2032:58;;;;-1:-1:-1;;;2032:58:73;;10698:2:111;2032:58:73;;;10680:21:111;10737:2;10717:18;;;10710:30;10776:21;10756:18;;;10749:49;10815:18;;2032:58:73;;;;;;;;;2105:9;2100:93;2120:15;;;2100:93;;;2156:26;2162:4;;2167:1;2162:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2171:1;2174:4;;2179:1;2174:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2156:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2156:5:73;;-1:-1:-1;;;2156:26:73:i;:::-;2137:3;;;;:::i;:::-;;;;2100:93;;;;1902:297;;;;:::o;3073:197:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12174:2:111;1629:80:32;;;12156:21:111;12213:2;12193:18;;;12186:30;12252:34;12232:18;;;12225:62;12323:14;12303:18;;;12296:42;12355:19;;1629:80:32;11972:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;12587:2:111;1719:87:32;;;12569:21:111;12626:2;12606:18;;;12599:30;12665:34;12645:18;;;12638:62;12736:14;12716:18;;;12709:42;12768:19;;1719:87:32;12385:408:111;1719:87:32;3156:36:::1;3174:17;3156;:36::i;:::-;3243:12;::::0;;3253:1:::1;3243:12:::0;;;::::1;::::0;::::1;::::0;;;3202:61:::1;::::0;3224:17;;3243:12;3202:21:::1;:61::i;:::-;3073:197:::0;:::o;1458:353:51:-;1601:22;1635:24;:22;:24::i;:::-;1686:38;1705:6;1713:10;1686:18;:38::i;:::-;1669:55;;1772:32;1784:19;1772:11;:32::i;:::-;1458:353;;;;;:::o;3926:110:73:-;1121:11;3973:56;;;;;4023:4;3973:56;;;7371:74:111;3973:22:73;;;;;;;;4004:9;;7344:18:111;;3973:56:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:158;963:12;:10;:12::i;:::-;1121:11;4291:48:::1;::::0;;;;:23:::1;13006:55:111::0;;;4291:48:73::1;::::0;::::1;12988:74:111::0;13078:18;;;13071:34;;;4291:23:73;;;::::1;::::0;::::1;::::0;12961:18:111;;4291:48:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4188:158:::0;;:::o;3519:222:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12174:2:111;1629:80:32;;;12156:21:111;12213:2;12193:18;;;12186:30;12252:34;12232:18;;;12225:62;12323:14;12303:18;;;12296:42;12355:19;;1629:80:32;11972:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;12587:2:111;1719:87:32;;;12569:21:111;12626:2;12606:18;;;12599:30;12665:34;12645:18;;;12638:62;12736:14;12716:18;;;12709:42;12768:19;;1719:87:32;12385:408:111;1719:87:32;3636:36:::1;3654:17;3636;:36::i;:::-;3682:52;3704:17;3723:4;3729;3682:21;:52::i;:::-;3519:222:::0;;:::o;2762:131::-;2840:7;2080:4;2072:23;2089:6;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:32;;13318:2:111;2064:92:32;;;13300:21:111;13357:2;13337:18;;;13330:30;13396:34;13376:18;;;13369:62;13467:26;13447:18;;;13440:54;13511:19;;2064:92:32;13116:420:111;2064:92:32;-1:-1:-1;1030:66:28::1;2762:131:32::0;:::o;1680:158:73:-;1766:31;:29;:31::i;:::-;1807:24;1813:4;1819:5;1826:4;;1807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1807:5:73;;-1:-1:-1;;;1807:24:73:i;:::-;1680:158;;;;:::o;3730:113::-;3799:37;;;;;3830:4;3799:37;;;7371:74:111;3773:7:73;;3799:22;1121:11;3799:22;;;;7344:18:111;;3799:37:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3792:44;;3730:113;:::o;2483:101::-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;13932:2:111;3303:190:31;;;13914:21:111;13971:2;13951:18;;;13944:30;14010:34;13990:18;;;13983:62;14081:16;14061:18;;;14054:44;14115:19;;3303:190:31;13730:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;2557:20:73::1;2569:7;2557:11;:20::i;:::-;3618:14:31::0;3614:99;;;3664:5;3648:21;;;;;;3688:14;;-1:-1:-1;14297:36:111;;3688:14:31;;14285:2:111;14270:18;3688:14:31;;;;;;;3247:472;2483:101:73;:::o;935:121:51:-;1010:39;;;;;1040:4;1010:39;;;14526:74:111;984:7:51;14616:18:111;;;14609:91;;;984:7:51;1010:21;1121:11:73;1010:21:51;;;;14499:18:111;;1010:39:51;14344:362:111;2808:175:73;2881:10;:35;1121:11;2881:35;;;:58;;-1:-1:-1;2934:5:73;;;;;;;2920:10;:19;2881:58;2873:103;;;;-1:-1:-1;;;2873:103:73;;14913:2:111;2873:103:73;;;14895:21:111;;;14932:18;;;14925:30;14991:34;14971:18;;;14964:62;15043:18;;2873:103:73;14711:356:111;2873:103:73;2808:175::o;3366:287::-;3451:12;3465:19;3488:6;:11;;3508:5;3515:4;3488:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3450:70;;;;3535:7;3530:117;;3615:6;3609:13;3604:2;3596:6;3592:15;3585:38;4352:135;4468:12;:10;:12::i;2650:952:28:-;689:66;3096:48;;;3092:504;;;3160:37;3179:17;3160:18;:37::i;:::-;2650:952;;;:::o;3092:504::-;3250:17;3232:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3232:52:28;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3228:291;;3448:56;;-1:-1:-1;;;3448:56:28;;16005:2:111;3448:56:28;;;15987:21:111;16044:2;16024:18;;;16017:30;16083:34;16063:18;;;16056:62;16154:16;16134:18;;;16127:44;16188:19;;3448:56:28;15803:410:111;3228:291:28;1030:66;3334:28;;3326:82;;;;-1:-1:-1;;;3326:82:28;;16420:2:111;3326:82:28;;;16402:21:111;16459:2;16439:18;;;16432:30;16498:34;16478:18;;;16471:62;16569:11;16549:18;;;16542:39;16598:19;;3326:82:28;16218:405:111;3326:82:28;3285:138;3532:53;3550:17;3569:4;3575:9;3532:17;:53::i;1892:149:51:-;1966:10;:35;1121:11:73;1966:35:51;;1958:76;;;;-1:-1:-1;;;1958:76:51;;16830:2:111;1958:76:51;;;16812:21:111;16869:2;16849:18;;;16842:30;16908;16888:18;;;16881:58;16956:18;;1958:76:51;16628:352:111;3038:322:73;3156:22;3190:12;3205:35;:10;7455:58:47;;18190:66:111;7455:58:47;;;18178:79:111;18273:12;;;18266:28;;;7325:7:47;;18310:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;3205:35:73;3190:50;-1:-1:-1;3263:30:73;3276:16;;;;:6;:16;:::i;:::-;3263:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3263:4:73;;:30;-1:-1:-1;;3263:12:73;:30;-1:-1:-1;3263:30:73:i;:::-;3254:5;;;;;:39;:5;;;:39;;;3250:85;;746:1:51;3307:28:73;;;;;3250:85;-1:-1:-1;3352:1:73;;3038:322;-1:-1:-1;;;3038:322:73:o;4316:337:51:-;4397:24;;4393:254;;4455:82;;4438:12;;4463:10;;4515:17;;4488:19;;4438:12;4455:82;4438:12;4455:82;4488:19;4463:10;4515:17;4455:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:233:73;1524:5;;;;;;;1510:10;:19;;:50;;-1:-1:-1;1533:10:73;1555:4;1533:27;1510:50;1502:73;;;;-1:-1:-1;;;1502:73:73;;17397:2:111;1502:73:73;;;17379:21:111;17436:2;17416:18;;;17409:30;17475:12;17455:18;;;17448:40;17505:18;;1502:73:73;17195:334:111;2590:146:73;2655:5;:15;;;;;;;;;;;;;;;;;;2685:44;;2723:5;;;;;;2710:11;2685:44;;;;;;;2590:146;:::o;1532:259:28:-;1465:19:42;;;;1605:95:28;;;;-1:-1:-1;;;1605:95:28;;17736:2:111;1605:95:28;;;17718:21:111;17775:2;17755:18;;;17748:30;17814:34;17794:18;;;17787:62;17885:15;17865:18;;;17858:43;17918:19;;1605:95:28;17534:409:111;1605:95:28;1030:66;1710:74;;;;;;;;;;;;;;;1532:259::o;2183:295::-;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;:53::i;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;3661:227;-1:-1:-1;;;3661:227:47:o;1897:152:28:-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;;;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;:20;:77::i;2145:730:47:-;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;-1:-1:-1;;;788:34:47;;18724:2:111;788:34:47;;;18706:21:111;18763:2;18743:18;;;18736:30;18802:26;18782:18;;;18775:54;18846:18;;788:34:47;18522:348:111;730:345:47;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;-1:-1:-1;;;903:41:47;;19077:2:111;903:41:47;;;19059:21:111;19116:2;19096:18;;;19089:30;19155:33;19135:18;;;19128:61;19206:18;;903:41:47;18875:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;-1:-1:-1;;;1020:44:47;;19437:2:111;1020:44:47;;;19419:21:111;19476:2;19456:18;;;19449:30;19515:34;19495:18;;;19488:62;19586:4;19566:18;;;19559:32;19608:19;;1020:44:47;19235:398:111;6853:325:42;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;5069:1494:47:-;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;19865:25:111;;;19938:4;19926:17;;19906:18;;;19899:45;;;;19960:18;;;19953:34;;;20003:18;;;19996:34;;;6374:24:47;;19837:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;;;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;7466:628:42:-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;20243:2:111;7908:60:42;;;20225:21:111;20282:2;20262:18;;;20255:30;20321:31;20301:18;;;20294:59;20370:18;;7908:60:42;20041:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:154:111:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:347;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:111;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;525:1205;651:6;659;667;675;683;691;699;707;760:3;748:9;739:7;735:23;731:33;728:53;;;777:1;774;767:12;728:53;816:9;803:23;835:31;860:5;835:31;:::i;:::-;885:5;-1:-1:-1;942:2:111;927:18;;914:32;955:33;914:32;955:33;:::i;:::-;1007:7;-1:-1:-1;1066:2:111;1051:18;;1038:32;1079:33;1038:32;1079:33;:::i;:::-;1131:7;-1:-1:-1;1185:2:111;1170:18;;1157:32;;-1:-1:-1;1240:3:111;1225:19;;1212:33;1264:18;1294:14;;;1291:34;;;1321:1;1318;1311:12;1291:34;1360:58;1410:7;1401:6;1390:9;1386:22;1360:58;:::i;:::-;1437:8;;-1:-1:-1;1334:84:111;-1:-1:-1;1525:3:111;1510:19;;1497:33;;-1:-1:-1;1542:16:111;;;1539:36;;;1571:1;1568;1561:12;1539:36;;1610:60;1662:7;1651:8;1640:9;1636:24;1610:60;:::i;:::-;525:1205;;;;-1:-1:-1;525:1205:111;;-1:-1:-1;525:1205:111;;;;;;1689:8;-1:-1:-1;;;525:1205:111:o;1735:332::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;1901:9;1888:23;1951:66;1944:5;1940:78;1933:5;1930:89;1920:117;;2033:1;2030;2023:12;2264:754;2361:6;2369;2377;2385;2393;2446:3;2434:9;2425:7;2421:23;2417:33;2414:53;;;2463:1;2460;2453:12;2414:53;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:111;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2693:7;-1:-1:-1;2747:2:111;2732:18;;2719:32;;-1:-1:-1;2802:2:111;2787:18;;2774:32;2829:18;2818:30;;2815:50;;;2861:1;2858;2851:12;2815:50;2900:58;2950:7;2941:6;2930:9;2926:22;2900:58;:::i;:::-;2264:754;;;;-1:-1:-1;2264:754:111;;-1:-1:-1;2977:8:111;;2874:84;2264:754;-1:-1:-1;;;2264:754:111:o;3276:367::-;3339:8;3349:6;3403:3;3396:4;3388:6;3384:17;3380:27;3370:55;;3421:1;3418;3411:12;3370:55;-1:-1:-1;3444:20:111;;3487:18;3476:30;;3473:50;;;3519:1;3516;3509:12;3473:50;3556:4;3548:6;3544:17;3532:29;;3616:3;3609:4;3599:6;3596:1;3592:14;3584:6;3580:27;3576:38;3573:47;3570:67;;;3633:1;3630;3623:12;3648:784;3781:6;3789;3797;3805;3858:2;3846:9;3837:7;3833:23;3829:32;3826:52;;;3874:1;3871;3864:12;3826:52;3914:9;3901:23;3943:18;3984:2;3976:6;3973:14;3970:34;;;4000:1;3997;3990:12;3970:34;4039:70;4101:7;4092:6;4081:9;4077:22;4039:70;:::i;:::-;4128:8;;-1:-1:-1;4013:96:111;-1:-1:-1;4216:2:111;4201:18;;4188:32;;-1:-1:-1;4232:16:111;;;4229:36;;;4261:1;4258;4251:12;4229:36;;4300:72;4364:7;4353:8;4342:9;4338:24;4300:72;:::i;:::-;3648:784;;;;-1:-1:-1;4391:8:111;-1:-1:-1;;;;3648:784:111:o;4437:247::-;4496:6;4549:2;4537:9;4528:7;4524:23;4520:32;4517:52;;;4565:1;4562;4555:12;4517:52;4604:9;4591:23;4623:31;4648:5;4623:31;:::i;4689:530::-;4800:6;4808;4816;4869:2;4857:9;4848:7;4844:23;4840:32;4837:52;;;4885:1;4882;4875:12;4837:52;4925:9;4912:23;4958:18;4950:6;4947:30;4944:50;;;4990:1;4987;4980:12;4944:50;5013:22;;5069:3;5051:16;;;5047:26;5044:46;;;5086:1;5083;5076:12;5044:46;5109:2;5158;5143:18;;5130:32;;-1:-1:-1;5209:2:111;5194:18;;;5181:32;;4689:530;-1:-1:-1;;;4689:530:111:o;5406:323::-;5482:6;5490;5543:2;5531:9;5522:7;5518:23;5514:32;5511:52;;;5559:1;5556;5549:12;5511:52;5598:9;5585:23;5617:31;5642:5;5617:31;:::i;:::-;5667:5;5719:2;5704:18;;;;5691:32;;-1:-1:-1;;;5406:323:111:o;5734:184::-;5786:77;5783:1;5776:88;5883:4;5880:1;5873:15;5907:4;5904:1;5897:15;5923:1115;6000:6;6008;6061:2;6049:9;6040:7;6036:23;6032:32;6029:52;;;6077:1;6074;6067:12;6029:52;6116:9;6103:23;6135:31;6160:5;6135:31;:::i;:::-;6185:5;-1:-1:-1;6241:2:111;6226:18;;6213:32;6264:18;6294:14;;;6291:34;;;6321:1;6318;6311:12;6291:34;6359:6;6348:9;6344:22;6334:32;;6404:7;6397:4;6393:2;6389:13;6385:27;6375:55;;6426:1;6423;6416:12;6375:55;6462:2;6449:16;6484:2;6480;6477:10;6474:36;;;6490:18;;:::i;:::-;6624:2;6618:9;6686:4;6678:13;;6529:66;6674:22;;;6698:2;6670:31;6666:40;6654:53;;;6722:18;;;6742:22;;;6719:46;6716:72;;;6768:18;;:::i;:::-;6808:10;6804:2;6797:22;6843:2;6835:6;6828:18;6883:7;6878:2;6873;6869;6865:11;6861:20;6858:33;6855:53;;;6904:1;6901;6894:12;6855:53;6960:2;6955;6951;6947:11;6942:2;6934:6;6930:15;6917:46;7005:1;7000:2;6995;6987:6;6983:15;6979:24;6972:35;7026:6;7016:16;;;;;;;5923:1115;;;;;:::o;7708:612::-;7796:6;7804;7812;7820;7873:2;7861:9;7852:7;7848:23;7844:32;7841:52;;;7889:1;7886;7879:12;7841:52;7928:9;7915:23;7947:31;7972:5;7947:31;:::i;:::-;7997:5;-1:-1:-1;8049:2:111;8034:18;;8021:32;;-1:-1:-1;8104:2:111;8089:18;;8076:32;8131:18;8120:30;;8117:50;;;8163:1;8160;8153:12;8117:50;8202:58;8252:7;8243:6;8232:9;8228:22;8202:58;:::i;8325:1338::-;8485:6;8493;8501;8509;8517;8525;8533;8541;8594:3;8582:9;8573:7;8569:23;8565:33;8562:53;;;8611:1;8608;8601:12;8562:53;8650:9;8637:23;8669:31;8694:5;8669:31;:::i;:::-;8719:5;-1:-1:-1;8776:2:111;8761:18;;8748:32;8789:33;8748:32;8789:33;:::i;:::-;8841:7;-1:-1:-1;8899:2:111;8884:18;;8871:32;8922:18;8952:14;;;8949:34;;;8979:1;8976;8969:12;8949:34;9018:70;9080:7;9071:6;9060:9;9056:22;9018:70;:::i;:::-;9107:8;;-1:-1:-1;8992:96:111;-1:-1:-1;9195:2:111;9180:18;;9167:32;;-1:-1:-1;9211:16:111;;;9208:36;;;9240:1;9237;9230:12;9208:36;9279:72;9343:7;9332:8;9321:9;9317:24;9279:72;:::i;:::-;9370:8;;-1:-1:-1;9253:98:111;-1:-1:-1;9458:3:111;9443:19;;9430:33;;-1:-1:-1;9475:16:111;;;9472:36;;;9504:1;9501;9494:12;9668:823;9774:6;9782;9790;9798;9806;9814;9867:3;9855:9;9846:7;9842:23;9838:33;9835:53;;;9884:1;9881;9874:12;9835:53;9923:9;9910:23;9942:31;9967:5;9942:31;:::i;:::-;9992:5;-1:-1:-1;10049:2:111;10034:18;;10021:32;10062:33;10021:32;10062:33;:::i;:::-;10114:7;-1:-1:-1;10168:2:111;10153:18;;10140:32;;-1:-1:-1;10219:2:111;10204:18;;10191:32;;-1:-1:-1;10274:3:111;10259:19;;10246:33;10302:18;10291:30;;10288:50;;;10334:1;10331;10324:12;10288:50;10373:58;10423:7;10414:6;10403:9;10399:22;10373:58;:::i;:::-;9668:823;;;;-1:-1:-1;9668:823:111;;-1:-1:-1;9668:823:111;;10450:8;;9668:823;-1:-1:-1;;;9668:823:111:o;10844:184::-;10896:77;10893:1;10886:88;10993:4;10990:1;10983:15;11017:4;11014:1;11007:15;11033:580;11110:4;11116:6;11176:11;11163:25;11266:66;11255:8;11239:14;11235:29;11231:102;11211:18;11207:127;11197:155;;11348:1;11345;11338:12;11197:155;11375:33;;11427:20;;;-1:-1:-1;11470:18:111;11459:30;;11456:50;;;11502:1;11499;11492:12;11456:50;11535:4;11523:17;;-1:-1:-1;11566:14:111;11562:27;;;11552:38;;11549:58;;;11603:1;11600;11593:12;11618:349;11657:3;11688:66;11681:5;11678:77;11675:257;;11788:77;11785:1;11778:88;11889:4;11886:1;11879:15;11917:4;11914:1;11907:15;11675:257;-1:-1:-1;11959:1:111;11948:13;;11618:349::o;13541:184::-;13611:6;13664:2;13652:9;13643:7;13639:23;13635:32;13632:52;;;13680:1;13677;13670:12;13632:52;-1:-1:-1;13703:16:111;;13541:184;-1:-1:-1;13541:184:111:o;15072:258::-;15144:1;15154:113;15168:6;15165:1;15162:13;15154:113;;;15244:11;;;15238:18;15225:11;;;15218:39;15190:2;15183:10;15154:113;;;15285:6;15282:1;15279:13;15276:48;;;-1:-1:-1;;15320:1:111;15302:16;;15295:27;15072:258::o;15335:274::-;15464:3;15502:6;15496:13;15518:53;15564:6;15559:3;15552:4;15544:6;15540:17;15518:53;:::i;:::-;15587:16;;;;;15335:274;-1:-1:-1;;15335:274:111:o;18333:184::-;18385:77;18382:1;18375:88;18482:4;18479:1;18472:15;18506:4;18503:1;18496:15;20399:442;20548:2;20537:9;20530:21;20511:4;20580:6;20574:13;20623:6;20618:2;20607:9;20603:18;20596:34;20639:66;20698:6;20693:2;20682:9;20678:18;20673:2;20665:6;20661:15;20639:66;:::i;:::-;20757:2;20745:15;20762:66;20741:88;20726:104;;;;20832:2;20722:113;;20399:442;-1:-1:-1;;20399:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"1755800","executionCost":"infinite","totalCost":"infinite"},"external":{"addDeposit()":"infinite","entryPoint()":"infinite","execute(address,uint256,bytes)":"infinite","executeBatch(address[],bytes[])":"infinite","getDeposit()":"infinite","getNonce()":"infinite","initialize(address)":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2369","proxiableUUID()":"infinite","supportsInterface(bytes4)":"449","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","upgradeTo(address)":"infinite","upgradeToAndCall(address,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawDepositTo(address,uint256)":"infinite"},"internal":{"_authorizeUpgrade(address)":"infinite","_call(address,uint256,bytes memory)":"infinite","_initialize(address)":"infinite","_onlyOwner()":"infinite","_requireFromEntryPointOrOwner()":"infinite","_validateSignature(struct UserOperation calldata,bytes32)":"infinite"}},"methodIdentifiers":{"addDeposit()":"4a58db19","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"minimal account. this is sample minimal account. has execute, eth handling methods has a single signer that can send requests through the entryPoint.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/SimpleAccount.sol\":\"SimpleAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"contracts/samples/SimpleAccount.sol:SimpleAccount","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"contracts/samples/SimpleAccount.sol:SimpleAccount","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":13838,"contract":"contracts/samples/SimpleAccount.sol:SimpleAccount","label":"owner","offset":2,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDeposit()":{"notice":"deposit more funds for this account in the entryPoint"},"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"execute(address,uint256,bytes)":{"notice":"execute a transaction (called directly from owner, or by entryPoint)"},"executeBatch(address[],bytes[])":{"notice":"execute a sequence of transactions"},"getDeposit()":{"notice":"check current account deposit in the entryPoint"},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"withdrawDepositTo(address,uint256)":{"notice":"withdraw value from the account's deposit"}},"notice":"minimal account. this is sample minimal account. has execute, eth handling methods has a single signer that can send requests through the entryPoint.","version":1}}},"contracts/samples/SimpleAccountFactory.sol":{"SimpleAccountFactory":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"contract SimpleAccount","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"createAccount","outputs":[{"internalType":"contract SimpleAccount","name":"ret","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_14165":{"entryPoint":null,"id":14165,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":136,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:556:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"},{"body":{"nodeType":"YulBlock","src":"452:102:111","statements":[{"nodeType":"YulAssignment","src":"462:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"474:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"485:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"470:3:111"},"nodeType":"YulFunctionCall","src":"470:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"462:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"504:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"519:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"535:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"540:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"531:3:111"},"nodeType":"YulFunctionCall","src":"531:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"544:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"527:3:111"},"nodeType":"YulFunctionCall","src":"527:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"515:3:111"},"nodeType":"YulFunctionCall","src":"515:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"497:6:111"},"nodeType":"YulFunctionCall","src":"497:51:111"},"nodeType":"YulExpressionStatement","src":"497:51:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"421:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"432:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"443:4:111","type":""}],"src":"330:224:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b5060405161318e38038061318e83398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b61240880610d8683390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b608051610ca66100e060003960008181604b0152818161011401526102580152610ca66000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a42707ff9969dda6b97331eaf496ed3f3e8d379066d6f578f3fe5227bfbc342f64736f6c634300080f003360c0604052306080523480156200001557600080fd5b506040516200240838038062002408833981016040819052620000389162000118565b6001600160a01b03811660a0526200004f62000056565b506200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161224b620001bd6000396000818161032f01528181610833015281816108da01528181610cb001528181610ee701528181610f2e0152818161123201526114bd015260008181610651015281816106e70152818161099e01528181610a340152610b63015261224b6000f3fe60806040526004361061012c5760003560e01c806352d1902d116100a5578063bc197c8111610074578063c4d66de811610059578063c4d66de8146103d0578063d087d288146103f0578063f23a6e611461040557600080fd5b8063bc197c8114610373578063c399ec88146103bb57600080fd5b806352d1902d146102b35780638da5cb5b146102c8578063b0d691fe14610320578063b61d27f61461035357600080fd5b80633659cfe6116100fc5780634a58db19116100e15780634a58db19146102785780634d44560d146102805780634f1ef286146102a057600080fd5b80633659cfe61461022a5780633a871cdd1461024a57600080fd5b806223de291461013857806301ffc9a71461015f578063150b7a021461019457806318dfb3c71461020a57600080fd5b3661013357005b600080fd5b34801561014457600080fd5b5061015d610153366004611aeb565b5050505050505050565b005b34801561016b57600080fd5b5061017f61017a366004611b9c565b61044b565b60405190151581526020015b60405180910390f35b3480156101a057600080fd5b506101d96101af366004611bde565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161018b565b34801561021657600080fd5b5061015d610225366004611c96565b610530565b34801561023657600080fd5b5061015d610245366004611d02565b61063a565b34801561025657600080fd5b5061026a610265366004611d1f565b61080b565b60405190815260200161018b565b61015d610831565b34801561028c57600080fd5b5061015d61029b366004611d73565b6108d0565b61015d6102ae366004611dce565b610987565b3480156102bf57600080fd5b5061026a610b49565b3480156102d457600080fd5b506000546102fb9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018b565b34801561032c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102fb565b34801561035f57600080fd5b5061015d61036e366004611eb0565b610c1b565b34801561037f57600080fd5b506101d961038e366004611f00565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156103c757600080fd5b5061026a610c6a565b3480156103dc57600080fd5b5061015d6103eb366004611d02565b610d21565b3480156103fc57600080fd5b5061026a610e9a565b34801561041157600080fd5b506101d9610420366004611f9e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061052a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610538610f16565b82811461058c5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610633576106218585838181106105ac576105ac61201a565b90506020020160208101906105c19190611d02565b60008585858181106105d5576105d561201a565b90506020028101906105e79190612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b8061062b816120ae565b91505061058f565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106e55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661075a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146107e35760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b6107ec81611042565b604080516000808252602082019092526108089183919061104a565b50565b600061081561121a565b61081f848461129f565b905061082a82611385565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156108bc57600080fd5b505af1158015610633573d6000803e3d6000fd5b6108d86113f0565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610a325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610583565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610aa77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610583565b610b3982611042565b610b458282600161104a565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bf65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610583565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610c23610f16565b610c64848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc592505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c919061210d565b905090565b600054610100900460ff1615808015610d415750600054600160ff909116105b80610d5b5750303b158015610d5b575060005460ff166001145b610dcd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610583565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e2b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e3482611467565b8015610b4557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610cdb565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480610f77575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b610fc35760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610583565b565b6000808473ffffffffffffffffffffffffffffffffffffffff168484604051610fee9190612152565b60006040518083038185875af1925050503d806000811461102b576040519150601f19603f3d011682016040523d82523d6000602084013e611030565b606091505b50915091508161063357805160208201fd5b6108086113f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156110825761107d83611506565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611107575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111049181019061210d565b60015b6111795760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461120e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610583565b5061107d8383836115f6565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610fc35760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610583565b6000806112f9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905061134961130c610140860186612049565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859392505061161b9050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461137b57600191505061052a565b5060009392505050565b80156108085760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610633576040519150601f19603f3d011682016040523d82523d6000602084013e610633565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061141b57503330145b610fc35760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610583565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115905760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610583565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115ff8361163f565b60008251118061160c5750805b1561107d57610c64838361168c565b600080600061162a85856116b1565b91509150611637816116f6565b509392505050565b61164881611506565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061082a83836040518060600160405280602781526020016121ef6027913961185b565b60008082516041036116e75760208301516040840151606085015160001a6116db878285856118e0565b945094505050506116ef565b506000905060025b9250929050565b600081600481111561170a5761170a61216e565b036117125750565b60018160048111156117265761172661216e565b036117735760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610583565b60028160048111156117875761178761216e565b036117d45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610583565b60038160048111156117e8576117e861216e565b036108085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610583565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516118859190612152565b600060405180830381855af49150503d80600081146118c0576040519150601f19603f3d011682016040523d82523d6000602084013e6118c5565b606091505b50915091506118d6868383876119cf565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561191757506000905060036119c6565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561196b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119bf576000600192509250506119c6565b9150600090505b94509492505050565b60608315611a4b578251600003611a445773ffffffffffffffffffffffffffffffffffffffff85163b611a445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610583565b5081611a55565b611a558383611a5d565b949350505050565b815115611a6d5781518083602001fd5b8060405162461bcd60e51b8152600401610583919061219d565b73ffffffffffffffffffffffffffffffffffffffff8116811461080857600080fd5b60008083601f840112611abb57600080fd5b50813567ffffffffffffffff811115611ad357600080fd5b6020830191508360208285010111156116ef57600080fd5b60008060008060008060008060c0898b031215611b0757600080fd5b8835611b1281611a87565b97506020890135611b2281611a87565b96506040890135611b3281611a87565b955060608901359450608089013567ffffffffffffffff80821115611b5657600080fd5b611b628c838d01611aa9565b909650945060a08b0135915080821115611b7b57600080fd5b50611b888b828c01611aa9565b999c989b5096995094979396929594505050565b600060208284031215611bae57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461082a57600080fd5b600080600080600060808688031215611bf657600080fd5b8535611c0181611a87565b94506020860135611c1181611a87565b935060408601359250606086013567ffffffffffffffff811115611c3457600080fd5b611c4088828901611aa9565b969995985093965092949392505050565b60008083601f840112611c6357600080fd5b50813567ffffffffffffffff811115611c7b57600080fd5b6020830191508360208260051b85010111156116ef57600080fd5b60008060008060408587031215611cac57600080fd5b843567ffffffffffffffff80821115611cc457600080fd5b611cd088838901611c51565b90965094506020870135915080821115611ce957600080fd5b50611cf687828801611c51565b95989497509550505050565b600060208284031215611d1457600080fd5b813561082a81611a87565b600080600060608486031215611d3457600080fd5b833567ffffffffffffffff811115611d4b57600080fd5b84016101608187031215611d5e57600080fd5b95602085013595506040909401359392505050565b60008060408385031215611d8657600080fd5b8235611d9181611a87565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611de157600080fd5b8235611dec81611a87565b9150602083013567ffffffffffffffff80821115611e0957600080fd5b818501915085601f830112611e1d57600080fd5b813581811115611e2f57611e2f611d9f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611e7557611e75611d9f565b81604052828152886020848701011115611e8e57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611ec657600080fd5b8435611ed181611a87565b935060208501359250604085013567ffffffffffffffff811115611ef457600080fd5b611cf687828801611aa9565b60008060008060008060008060a0898b031215611f1c57600080fd5b8835611f2781611a87565b97506020890135611f3781611a87565b9650604089013567ffffffffffffffff80821115611f5457600080fd5b611f608c838d01611c51565b909850965060608b0135915080821115611f7957600080fd5b611f858c838d01611c51565b909650945060808b0135915080821115611b7b57600080fd5b60008060008060008060a08789031215611fb757600080fd5b8635611fc281611a87565b95506020870135611fd281611a87565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ffc57600080fd5b61200889828a01611aa9565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261207e57600080fd5b83018035915067ffffffffffffffff82111561209957600080fd5b6020019150368190038213156116ef57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612106577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561211f57600080fd5b5051919050565b60005b83811015612141578181015183820152602001612129565b83811115610c645750506000910152565b60008251612164818460208701612126565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526121bc816040850160208701612126565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fe270ff8e4072df8d4acd6383803b1e259c9c59c3f3a7c1d73e5cdf4d869ca8064736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x318E CODESIZE SUB DUP1 PUSH2 0x318E DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH2 0x3C SWAP1 PUSH2 0x7B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x68 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH2 0xB8 JUMP JUMPDEST PUSH2 0x2408 DUP1 PUSH2 0xD86 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xCA6 PUSH2 0xE0 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH1 0x4B ADD MSTORE DUP2 DUP2 PUSH2 0x114 ADD MSTORE PUSH2 0x258 ADD MSTORE PUSH2 0xCA6 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0x1EE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1EE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1B7 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH2 0x1C2 SWAP3 SWAP2 SWAP1 PUSH2 0x412 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP3 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x207 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x300 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x412 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x33C SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x35E JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x4B0 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x40C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x44D DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3E2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x492 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x4A6 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220A42707 SELFDESTRUCT SWAP10 PUSH10 0xDDA6B97331EAF496ED3F RETURNDATACOPY DUP14 CALLDATACOPY SWAP1 PUSH7 0xD6F578F3FE5227 0xBF 0xBC CALLVALUE 0x2F PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER PUSH1 0xC0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2408 CODESIZE SUB DUP1 PUSH3 0x2408 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x118 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0xA0 MSTORE PUSH3 0x4F PUSH3 0x56 JUMP JUMPDEST POP PUSH3 0x14A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x116 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x143 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x224B PUSH3 0x1BD PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x32F ADD MSTORE DUP2 DUP2 PUSH2 0x833 ADD MSTORE DUP2 DUP2 PUSH2 0x8DA ADD MSTORE DUP2 DUP2 PUSH2 0xCB0 ADD MSTORE DUP2 DUP2 PUSH2 0xEE7 ADD MSTORE DUP2 DUP2 PUSH2 0xF2E ADD MSTORE DUP2 DUP2 PUSH2 0x1232 ADD MSTORE PUSH2 0x14BD ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x651 ADD MSTORE DUP2 DUP2 PUSH2 0x6E7 ADD MSTORE DUP2 DUP2 PUSH2 0x99E ADD MSTORE DUP2 DUP2 PUSH2 0xA34 ADD MSTORE PUSH2 0xB63 ADD MSTORE PUSH2 0x224B PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x12C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x373 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x2A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x15F JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x133 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x153 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AEB JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17F PUSH2 0x17A CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x44B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x1AF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BDE JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C96 JUMP JUMPDEST PUSH2 0x530 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0x63A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D1F JUMP JUMPDEST PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST PUSH2 0x15D PUSH2 0x831 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x29B CALLDATASIZE PUSH1 0x4 PUSH2 0x1D73 JUMP JUMPDEST PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x15D PUSH2 0x2AE CALLDATASIZE PUSH1 0x4 PUSH2 0x1DCE JUMP JUMPDEST PUSH2 0x987 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xB49 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2FB SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x36E CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB0 JUMP JUMPDEST PUSH2 0xC1B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x38E CALLDATASIZE PUSH1 0x4 PUSH2 0x1F00 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xC6A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15D PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1D02 JUMP JUMPDEST PUSH2 0xD21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0xE9A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 PUSH2 0x420 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F9E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x52A JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x538 PUSH2 0xF16 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x58C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x633 JUMPI PUSH2 0x621 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5AC JUMPI PUSH2 0x5AC PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x5C1 SWAP2 SWAP1 PUSH2 0x1D02 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x5D5 JUMPI PUSH2 0x5D5 PUSH2 0x201A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x5E7 SWAP2 SWAP1 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x62B DUP2 PUSH2 0x20AE JUMP JUMPDEST SWAP2 POP POP PUSH2 0x58F JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x6E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x75A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x7E3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0x7EC DUP2 PUSH2 0x1042 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x808 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x104A JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x815 PUSH2 0x121A JUMP JUMPDEST PUSH2 0x81F DUP5 DUP5 PUSH2 0x129F JUMP JUMPDEST SWAP1 POP PUSH2 0x82A DUP3 PUSH2 0x1385 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x633 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x8D8 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x96B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x97F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xA32 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xAA7 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH2 0xB39 DUP3 PUSH2 0x1042 JUMP JUMPDEST PUSH2 0xB45 DUP3 DUP3 PUSH1 0x1 PUSH2 0x104A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xBF6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xC23 PUSH2 0xF16 JUMP JUMPDEST PUSH2 0xC64 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xFC5 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCF8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xD1C SWAP2 SWAP1 PUSH2 0x210D JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xD41 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xD5B JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xDCD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xE2B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xE34 DUP3 PUSH2 0x1467 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB45 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xCDB JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0xF77 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0xFEE SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x102B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1030 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x633 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x808 PUSH2 0x13F0 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1082 JUMPI PUSH2 0x107D DUP4 PUSH2 0x1506 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1107 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x1104 SWAP2 DUP2 ADD SWAP1 PUSH2 0x210D JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1179 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST POP PUSH2 0x107D DUP4 DUP4 DUP4 PUSH2 0x15F6 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12F9 DUP4 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH2 0x1349 PUSH2 0x130C PUSH2 0x140 DUP7 ADD DUP7 PUSH2 0x2049 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP6 SWAP4 SWAP3 POP POP PUSH2 0x161B SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x137B JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0x52A JUMP JUMPDEST POP PUSH1 0x0 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x633 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x633 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x141B JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1590 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15FF DUP4 PUSH2 0x163F JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x160C JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x107D JUMPI PUSH2 0xC64 DUP4 DUP4 PUSH2 0x168C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x162A DUP6 DUP6 PUSH2 0x16B1 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1637 DUP2 PUSH2 0x16F6 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1648 DUP2 PUSH2 0x1506 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x82A DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x21EF PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x185B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x16E7 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x16DB DUP8 DUP3 DUP6 DUP6 PUSH2 0x18E0 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x16EF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x170A JUMPI PUSH2 0x170A PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1712 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1726 JUMPI PUSH2 0x1726 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x1773 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1787 JUMPI PUSH2 0x1787 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x17D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x17E8 JUMPI PUSH2 0x17E8 PUSH2 0x216E JUMP JUMPDEST SUB PUSH2 0x808 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x583 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1885 SWAP2 SWAP1 PUSH2 0x2152 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x18C0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x18C5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x18D6 DUP7 DUP4 DUP4 DUP8 PUSH2 0x19CF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1917 JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x196B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x19BF JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A4B JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A44 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x583 JUMP JUMPDEST POP DUP2 PUSH2 0x1A55 JUMP JUMPDEST PUSH2 0x1A55 DUP4 DUP4 PUSH2 0x1A5D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A6D JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x583 SWAP2 SWAP1 PUSH2 0x219D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x808 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1ABB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1B12 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1B22 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1B32 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP13 DUP4 DUP14 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B88 DUP12 DUP3 DUP13 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1BF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C01 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1C11 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C40 DUP9 DUP3 DUP10 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1CAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CD0 DUP9 DUP4 DUP10 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1CE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x82A DUP2 PUSH2 0x1A87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1D91 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1DE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1DEC DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1E2F JUMPI PUSH2 0x1E2F PUSH2 0x1D9F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1E75 JUMPI PUSH2 0x1E75 PUSH2 0x1D9F JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1E8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1EC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1ED1 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CF6 DUP8 DUP3 DUP9 ADD PUSH2 0x1AA9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1F1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1F27 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1F37 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F60 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F85 DUP13 DUP4 DUP14 ADD PUSH2 0x1C51 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1FC2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1FD2 DUP2 PUSH2 0x1A87 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1FFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2008 DUP10 DUP3 DUP11 ADD PUSH2 0x1AA9 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x207E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2099 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2106 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x211F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2141 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2129 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2164 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x21BC DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2126 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FE270F 0xF8 0xE4 SMOD 0x2D 0xF8 0xD4 0xAC 0xD6 CODESIZE CODESIZE SUB 0xB1 0xE2 MSIZE 0xC9 0xC5 SWAP13 EXTCODEHASH GASPRICE PUSH29 0x1D73E5CDF4D869CA8064736F6C634300080F0033000000000000000000 ","sourceMap":"600:1587:74:-:0;;;695:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;784:11;766:30;;;;;:::i;:::-;-1:-1:-1;;;;;515:32:111;;;497:51;;485:2;470:18;766:30:74;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;742:54:74;;;-1:-1:-1;600:1587:74;;;;;;;;;;:::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;330:224::-;600:1587:74;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@accountImplementation_14150":{"entryPoint":null,"id":14150,"parameterSlots":0,"returnSlots":0},"@computeAddress_5217":{"entryPoint":862,"id":5217,"parameterSlots":2,"returnSlots":1},"@computeAddress_5231":{"entryPoint":null,"id":5231,"parameterSlots":3,"returnSlots":1},"@createAccount_14230":{"entryPoint":188,"id":14230,"parameterSlots":2,"returnSlots":1},"@getAddress_14272":{"entryPoint":494,"id":14272,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":925,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":1152,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":1042,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_SimpleAccount_$14141__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":994,"id":null,"parameterSlots":3,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2185:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"146:125:111","statements":[{"nodeType":"YulAssignment","src":"156:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"179:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"164:3:111"},"nodeType":"YulFunctionCall","src":"164:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"156:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"198:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"213:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"221:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"209:3:111"},"nodeType":"YulFunctionCall","src":"209:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"191:6:111"},"nodeType":"YulFunctionCall","src":"191:74:111"},"nodeType":"YulExpressionStatement","src":"191:74:111"}]},"name":"abi_encode_tuple_t_contract$_SimpleAccount_$14141__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"115:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"126:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"137:4:111","type":""}],"src":"14:257:111"},{"body":{"nodeType":"YulBlock","src":"363:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"411:6:111"},"nodeType":"YulFunctionCall","src":"411:12:111"},"nodeType":"YulExpressionStatement","src":"411:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"384:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"393:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"380:3:111"},"nodeType":"YulFunctionCall","src":"380:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"405:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"376:3:111"},"nodeType":"YulFunctionCall","src":"376:32:111"},"nodeType":"YulIf","src":"373:52:111"},{"nodeType":"YulVariableDeclaration","src":"434:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"460:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"447:12:111"},"nodeType":"YulFunctionCall","src":"447:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"438:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"556:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"565:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"568:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"558:6:111"},"nodeType":"YulFunctionCall","src":"558:12:111"},"nodeType":"YulExpressionStatement","src":"558:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"492:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"503:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"510:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"499:3:111"},"nodeType":"YulFunctionCall","src":"499:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"489:2:111"},"nodeType":"YulFunctionCall","src":"489:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"482:6:111"},"nodeType":"YulFunctionCall","src":"482:73:111"},"nodeType":"YulIf","src":"479:93:111"},{"nodeType":"YulAssignment","src":"581:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"591:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"581:6:111"}]},{"nodeType":"YulAssignment","src":"605:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"632:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"643:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"628:3:111"},"nodeType":"YulFunctionCall","src":"628:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"615:12:111"},"nodeType":"YulFunctionCall","src":"615:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"605:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"321:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"332:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"344:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"352:6:111","type":""}],"src":"276:377:111"},{"body":{"nodeType":"YulBlock","src":"759:125:111","statements":[{"nodeType":"YulAssignment","src":"769:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"781:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"792:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"777:3:111"},"nodeType":"YulFunctionCall","src":"777:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"769:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"811:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"826:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"834:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"822:3:111"},"nodeType":"YulFunctionCall","src":"822:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"804:6:111"},"nodeType":"YulFunctionCall","src":"804:74:111"},"nodeType":"YulExpressionStatement","src":"804:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"728:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"739:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"750:4:111","type":""}],"src":"658:226:111"},{"body":{"nodeType":"YulBlock","src":"942:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"952:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"961:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"956:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1021:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1046:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1051:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1042:3:111"},"nodeType":"YulFunctionCall","src":"1042:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1065:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1070:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1061:3:111"},"nodeType":"YulFunctionCall","src":"1061:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1055:5:111"},"nodeType":"YulFunctionCall","src":"1055:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1035:6:111"},"nodeType":"YulFunctionCall","src":"1035:39:111"},"nodeType":"YulExpressionStatement","src":"1035:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"982:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"985:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"979:2:111"},"nodeType":"YulFunctionCall","src":"979:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"993:19:111","statements":[{"nodeType":"YulAssignment","src":"995:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1004:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1007:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1000:3:111"},"nodeType":"YulFunctionCall","src":"1000:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"995:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"975:3:111","statements":[]},"src":"971:113:111"},{"body":{"nodeType":"YulBlock","src":"1110:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1123:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1128:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1119:3:111"},"nodeType":"YulFunctionCall","src":"1119:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"1137:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1112:6:111"},"nodeType":"YulFunctionCall","src":"1112:27:111"},"nodeType":"YulExpressionStatement","src":"1112:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1099:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1102:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1096:2:111"},"nodeType":"YulFunctionCall","src":"1096:13:111"},"nodeType":"YulIf","src":"1093:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"920:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"925:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"930:6:111","type":""}],"src":"889:258:111"},{"body":{"nodeType":"YulBlock","src":"1299:413:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1316:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1331:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1339:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1327:3:111"},"nodeType":"YulFunctionCall","src":"1327:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1309:6:111"},"nodeType":"YulFunctionCall","src":"1309:74:111"},"nodeType":"YulExpressionStatement","src":"1309:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1403:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1414:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1399:3:111"},"nodeType":"YulFunctionCall","src":"1399:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"1419:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1392:6:111"},"nodeType":"YulFunctionCall","src":"1392:30:111"},"nodeType":"YulExpressionStatement","src":"1392:30:111"},{"nodeType":"YulVariableDeclaration","src":"1431:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"1451:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1445:5:111"},"nodeType":"YulFunctionCall","src":"1445:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1435:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1478:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1489:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1474:3:111"},"nodeType":"YulFunctionCall","src":"1474:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1494:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1467:6:111"},"nodeType":"YulFunctionCall","src":"1467:34:111"},"nodeType":"YulExpressionStatement","src":"1467:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"1536:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1544:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1532:3:111"},"nodeType":"YulFunctionCall","src":"1532:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1564:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1549:3:111"},"nodeType":"YulFunctionCall","src":"1549:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1569:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1510:21:111"},"nodeType":"YulFunctionCall","src":"1510:66:111"},"nodeType":"YulExpressionStatement","src":"1510:66:111"},{"nodeType":"YulAssignment","src":"1585:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1601:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1620:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1628:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1616:3:111"},"nodeType":"YulFunctionCall","src":"1616:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1633:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1612:3:111"},"nodeType":"YulFunctionCall","src":"1612:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1597:3:111"},"nodeType":"YulFunctionCall","src":"1597:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"1703:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1593:3:111"},"nodeType":"YulFunctionCall","src":"1593:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1585:4:111"}]}]},"name":"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1260:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1271:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1279:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1290:4:111","type":""}],"src":"1152:560:111"},{"body":{"nodeType":"YulBlock","src":"1900:283:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1910:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1930:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1924:5:111"},"nodeType":"YulFunctionCall","src":"1924:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1914:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1972:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1980:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1968:3:111"},"nodeType":"YulFunctionCall","src":"1968:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"1987:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1992:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1946:21:111"},"nodeType":"YulFunctionCall","src":"1946:53:111"},"nodeType":"YulExpressionStatement","src":"1946:53:111"},{"nodeType":"YulVariableDeclaration","src":"2008:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2025:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2030:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2021:3:111"},"nodeType":"YulFunctionCall","src":"2021:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"2012:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2046:29:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2068:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2062:5:111"},"nodeType":"YulFunctionCall","src":"2062:13:111"},"variables":[{"name":"length_1","nodeType":"YulTypedName","src":"2050:8:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2110:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2118:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2106:3:111"},"nodeType":"YulFunctionCall","src":"2106:17:111"},{"name":"end_1","nodeType":"YulIdentifier","src":"2125:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"2132:8:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"2084:21:111"},"nodeType":"YulFunctionCall","src":"2084:57:111"},"nodeType":"YulExpressionStatement","src":"2084:57:111"},{"nodeType":"YulAssignment","src":"2150:27:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"2161:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"2168:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2157:3:111"},"nodeType":"YulFunctionCall","src":"2157:20:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"2150:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"1868:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1873:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1881:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"1892:3:111","type":""}],"src":"1717:466:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_contract$_SimpleAccount_$14141__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n copy_memory_to_memory(add(value1, 32), add(headStart, 96), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n let length_1 := mload(value1)\n copy_memory_to_memory(add(value1, 0x20), end_1, length_1)\n end := add(end_1, length_1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"14150":[{"length":32,"start":75},{"length":32,"start":276},{"length":32,"start":600}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a42707ff9969dda6b97331eaf496ed3f3e8d379066d6f578f3fe5227bfbc342f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0x1EE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1EE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1B7 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH2 0x1C2 SWAP3 SWAP2 SWAP1 PUSH2 0x412 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP3 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x207 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x300 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x412 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x33C SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x35E JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x4B0 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x40C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x44D DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3E2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x492 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x4A6 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220A42707 SELFDESTRUCT SWAP10 PUSH10 0xDDA6B97331EAF496ED3F RETURNDATACOPY DUP14 CALLDATACOPY SWAP1 PUSH7 0xD6F578F3FE5227 0xBF 0xBC CALLVALUE 0x2F PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"600:1587:74:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;636:52;;;;;;;;221:42:111;209:55;;;191:74;;179:2;164:18;636:52:74;;;;;;;1183:477;;;;;;:::i;:::-;;:::i;1785:400::-;;;;;;:::i;:::-;;:::i;1183:477::-;1250:17;1279:12;1294:23;1305:5;1312:4;1294:10;:23::i;:::-;1279:38;-1:-1:-1;1343:16:74;;;;1373:12;;1369:78;;-1:-1:-1;1430:4:74;-1:-1:-1;1401:35:74;;1369:78;1588:49;;221:42:111;209:55;;1588:49:74;;;191:74:111;1516:4:74;;1548:21;;164:18:111;;1588:49:74;;;;;;;;;;;;;;;;;;;;;;;;1484:167;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1456:197;;1269:391;;1183:477;;;;;:::o;1785:400::-;1854:7;1880:298;1911:4;1903:13;;1962:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;221:42:111;209:55;;2095:49:74;;;191:74:111;2051:21:74;;164:18:111;;2095:49:74;;;;;;;;;;;;;;;;;;;;;;;;;2011:151;;;;;2095:49;2011:151;;:::i;:::-;;;;;;;;;;;;;;;1928:248;;;2011:151;1928:248;;:::i;:::-;;;;;;;;;;;;;1918:259;;;;;;1880:22;:298::i;:::-;1873:305;1785:400;-1:-1:-1;;;1785:400:74:o;1799:165:44:-;1882:7;1908:49;1923:4;1929:12;1951:4;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:44:o;-1:-1:-1:-;;;;;;;;:::o;276:377:111:-;344:6;352;405:2;393:9;384:7;380:23;376:32;373:52;;;421:1;418;411:12;373:52;460:9;447:23;510:42;503:5;499:54;492:5;489:65;479:93;;568:1;565;558:12;479:93;591:5;643:2;628:18;;;;615:32;;-1:-1:-1;;;276:377:111:o;889:258::-;961:1;971:113;985:6;982:1;979:13;971:113;;;1061:11;;;1055:18;1042:11;;;1035:39;1007:2;1000:10;971:113;;;1102:6;1099:1;1096:13;1093:48;;;1137:1;1128:6;1123:3;1119:16;1112:27;1093:48;;889:258;;;:::o;1152:560::-;1339:42;1331:6;1327:55;1316:9;1309:74;1419:2;1414;1403:9;1399:18;1392:30;1290:4;1451:6;1445:13;1494:6;1489:2;1478:9;1474:18;1467:34;1510:66;1569:6;1564:2;1553:9;1549:18;1544:2;1536:6;1532:15;1510:66;:::i;:::-;1628:2;1616:15;1633:66;1612:88;1597:104;;;;1703:2;1593:113;;1152:560;-1:-1:-1;;;1152:560:111:o;1717:466::-;1892:3;1930:6;1924:13;1946:53;1992:6;1987:3;1980:4;1972:6;1968:17;1946:53;:::i;:::-;2062:13;;2021:16;;;;2084:57;2062:13;2021:16;2118:4;2106:17;;2084:57;:::i;:::-;2157:20;;1717:466;-1:-1:-1;;;;1717:466:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"647600","executionCost":"infinite","totalCost":"infinite"},"external":{"accountImplementation()":"infinite","createAccount(address,uint256)":"infinite","getAddress(address,uint256)":"infinite"}},"methodIdentifiers":{"accountImplementation()":"11464fbe","createAccount(address,uint256)":"5fbfb9cf","getAddress(address,uint256)":"8cb84e18"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplementation\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"ret\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(address,uint256)\":{\"notice\":\"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\"},\"getAddress(address,uint256)\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"A sample factory contract for SimpleAccount A UserOperations \\\"initCode\\\" holds the address of the factory, and a method call (to createAccount, in this sample factory). The factory's createAccount returns the target account address even if it is already installed. This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/SimpleAccountFactory.sol\":\"SimpleAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccountFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"./SimpleAccount.sol\\\";\\n\\n/**\\n * A sample factory contract for SimpleAccount\\n * A UserOperations \\\"initCode\\\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\\n * The factory's createAccount returns the target account address even if it is already installed.\\n * This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\\n */\\ncontract SimpleAccountFactory {\\n SimpleAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint _entryPoint) {\\n accountImplementation = new SimpleAccount(_entryPoint);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n */\\n function createAccount(address owner,uint256 salt) public returns (SimpleAccount ret) {\\n address addr = getAddress(owner, salt);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return SimpleAccount(payable(addr));\\n }\\n ret = SimpleAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(SimpleAccount.initialize, (owner))\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(address owner,uint256 salt) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(SimpleAccount.initialize, (owner))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0xf2cb4f3889e79edb11aab8d8451e379691813fc6b945ca0b5c3a08017c27b5ed\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"createAccount(address,uint256)":{"notice":"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation"},"getAddress(address,uint256)":{"notice":"calculate the counterfactual address of this account as it would be returned by createAccount()"}},"notice":"A sample factory contract for SimpleAccount A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory). The factory's createAccount returns the target account address even if it is already installed. This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.","version":1}}},"contracts/samples/TokenPaymaster.sol":{"TokenPaymaster":{"abi":[{"inputs":[{"internalType":"address","name":"accountFactory","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."},"mintTokens(address,uint256)":{"params":{"amount":"- the amount it will receive.","recipient":"- the address that will receive the minted tokens."}},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_14331":{"entryPoint":null,"id":14331,"parameterSlots":3,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_3799":{"entryPoint":null,"id":3799,"parameterSlots":2,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_afterTokenTransfer_4340":{"entryPoint":null,"id":4340,"parameterSlots":3,"returnSlots":0},"@_approve_4275":{"entryPoint":441,"id":4275,"parameterSlots":3,"returnSlots":0},"@_beforeTokenTransfer_4329":{"entryPoint":737,"id":4329,"parameterSlots":3,"returnSlots":0},"@_mint_4158":{"entryPoint":240,"id":4158,"parameterSlots":2,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":160,"id":2932,"parameterSlots":1,"returnSlots":0},"abi_decode_contract_IEntryPoint_fromMemory":{"entryPoint":789,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_addresst_string_memory_ptrt_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":807,"id":null,"parameterSlots":2,"returnSlots":3},"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"array_dataslot_string_storage":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":1416,"id":null,"parameterSlots":2,"returnSlots":1},"clean_up_bytearray_end_slots_string_storage":{"entryPoint":1130,"id":null,"parameterSlots":3,"returnSlots":0},"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage":{"entryPoint":1212,"id":null,"parameterSlots":2,"returnSlots":0},"extract_byte_array_length":{"entryPoint":1070,"id":null,"parameterSlots":1,"returnSlots":1},"extract_used_part_and_set_length_of_short_byte_array":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":767,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":742,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:5943:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"123:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"132:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"135:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"125:6:111"},"nodeType":"YulFunctionCall","src":"125:12:111"},"nodeType":"YulExpressionStatement","src":"125:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"108:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"113:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"104:3:111"},"nodeType":"YulFunctionCall","src":"104:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"117:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:50:111"},"nodeType":"YulIf","src":"69:70:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:131:111"},{"body":{"nodeType":"YulBlock","src":"182:95:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"199:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"206:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"211:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"202:3:111"},"nodeType":"YulFunctionCall","src":"202:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"192:6:111"},"nodeType":"YulFunctionCall","src":"192:31:111"},"nodeType":"YulExpressionStatement","src":"192:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"239:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"242:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"232:6:111"},"nodeType":"YulFunctionCall","src":"232:15:111"},"nodeType":"YulExpressionStatement","src":"232:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"263:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"266:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"256:6:111"},"nodeType":"YulFunctionCall","src":"256:15:111"},"nodeType":"YulExpressionStatement","src":"256:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"150:127:111"},{"body":{"nodeType":"YulBlock","src":"355:78:111","statements":[{"nodeType":"YulAssignment","src":"365:22:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"380:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"374:5:111"},"nodeType":"YulFunctionCall","src":"374:13:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"365:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"421:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"396:24:111"},"nodeType":"YulFunctionCall","src":"396:31:111"},"nodeType":"YulExpressionStatement","src":"396:31:111"}]},"name":"abi_decode_contract_IEntryPoint_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"334:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"345:5:111","type":""}],"src":"282:151:111"},{"body":{"nodeType":"YulBlock","src":"584:1188:111","statements":[{"body":{"nodeType":"YulBlock","src":"630:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"639:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"642:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"632:6:111"},"nodeType":"YulFunctionCall","src":"632:12:111"},"nodeType":"YulExpressionStatement","src":"632:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"605:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"614:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"601:3:111"},"nodeType":"YulFunctionCall","src":"601:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"626:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"597:3:111"},"nodeType":"YulFunctionCall","src":"597:32:111"},"nodeType":"YulIf","src":"594:52:111"},{"nodeType":"YulVariableDeclaration","src":"655:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"674:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"668:5:111"},"nodeType":"YulFunctionCall","src":"668:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"659:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"718:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"693:24:111"},"nodeType":"YulFunctionCall","src":"693:31:111"},"nodeType":"YulExpressionStatement","src":"693:31:111"},{"nodeType":"YulAssignment","src":"733:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"743:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"733:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"757:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"767:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"761:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"778:39:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"802:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"813:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"798:3:111"},"nodeType":"YulFunctionCall","src":"798:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"792:5:111"},"nodeType":"YulFunctionCall","src":"792:25:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"782:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"826:28:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"844:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"848:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"840:3:111"},"nodeType":"YulFunctionCall","src":"840:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"852:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"836:3:111"},"nodeType":"YulFunctionCall","src":"836:18:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"830:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"881:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"890:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"893:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"883:6:111"},"nodeType":"YulFunctionCall","src":"883:12:111"},"nodeType":"YulExpressionStatement","src":"883:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"869:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"877:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"866:2:111"},"nodeType":"YulFunctionCall","src":"866:14:111"},"nodeType":"YulIf","src":"863:34:111"},{"nodeType":"YulVariableDeclaration","src":"906:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"920:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"931:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"916:3:111"},"nodeType":"YulFunctionCall","src":"916:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"910:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"986:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"995:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"998:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"988:6:111"},"nodeType":"YulFunctionCall","src":"988:12:111"},"nodeType":"YulExpressionStatement","src":"988:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"965:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"969:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"961:3:111"},"nodeType":"YulFunctionCall","src":"961:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"976:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"957:3:111"},"nodeType":"YulFunctionCall","src":"957:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"950:6:111"},"nodeType":"YulFunctionCall","src":"950:35:111"},"nodeType":"YulIf","src":"947:55:111"},{"nodeType":"YulVariableDeclaration","src":"1011:19:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1027:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1021:5:111"},"nodeType":"YulFunctionCall","src":"1021:9:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"1015:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1053:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1055:16:111"},"nodeType":"YulFunctionCall","src":"1055:18:111"},"nodeType":"YulExpressionStatement","src":"1055:18:111"}]},"condition":{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"1045:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1049:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1042:2:111"},"nodeType":"YulFunctionCall","src":"1042:10:111"},"nodeType":"YulIf","src":"1039:36:111"},{"nodeType":"YulVariableDeclaration","src":"1084:17:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1098:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1094:3:111"},"nodeType":"YulFunctionCall","src":"1094:7:111"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"1088:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1110:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1130:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1124:5:111"},"nodeType":"YulFunctionCall","src":"1124:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1114:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1142:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1164:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"1188:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1192:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1184:3:111"},"nodeType":"YulFunctionCall","src":"1184:13:111"},{"name":"_5","nodeType":"YulIdentifier","src":"1199:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1180:3:111"},"nodeType":"YulFunctionCall","src":"1180:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1204:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1176:3:111"},"nodeType":"YulFunctionCall","src":"1176:31:111"},{"name":"_5","nodeType":"YulIdentifier","src":"1209:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1172:3:111"},"nodeType":"YulFunctionCall","src":"1172:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1160:3:111"},"nodeType":"YulFunctionCall","src":"1160:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1146:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1272:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1274:16:111"},"nodeType":"YulFunctionCall","src":"1274:18:111"},"nodeType":"YulExpressionStatement","src":"1274:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1231:10:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1243:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1228:2:111"},"nodeType":"YulFunctionCall","src":"1228:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1251:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1263:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1248:2:111"},"nodeType":"YulFunctionCall","src":"1248:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1225:2:111"},"nodeType":"YulFunctionCall","src":"1225:46:111"},"nodeType":"YulIf","src":"1222:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1310:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1314:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1303:6:111"},"nodeType":"YulFunctionCall","src":"1303:22:111"},"nodeType":"YulExpressionStatement","src":"1303:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1341:6:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1349:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1334:6:111"},"nodeType":"YulFunctionCall","src":"1334:18:111"},"nodeType":"YulExpressionStatement","src":"1334:18:111"},{"body":{"nodeType":"YulBlock","src":"1398:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1407:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1410:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1400:6:111"},"nodeType":"YulFunctionCall","src":"1400:12:111"},"nodeType":"YulExpressionStatement","src":"1400:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1375:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1379:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1371:3:111"},"nodeType":"YulFunctionCall","src":"1371:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1384:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1367:3:111"},"nodeType":"YulFunctionCall","src":"1367:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1389:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1364:2:111"},"nodeType":"YulFunctionCall","src":"1364:33:111"},"nodeType":"YulIf","src":"1361:53:111"},{"nodeType":"YulVariableDeclaration","src":"1423:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1432:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1427:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1488:83:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1517:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"1525:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1513:3:111"},"nodeType":"YulFunctionCall","src":"1513:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1529:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1509:3:111"},"nodeType":"YulFunctionCall","src":"1509:23:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"1548:2:111"},{"name":"i","nodeType":"YulIdentifier","src":"1552:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1544:3:111"},"nodeType":"YulFunctionCall","src":"1544:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1556:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1540:3:111"},"nodeType":"YulFunctionCall","src":"1540:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1534:5:111"},"nodeType":"YulFunctionCall","src":"1534:26:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1502:6:111"},"nodeType":"YulFunctionCall","src":"1502:59:111"},"nodeType":"YulExpressionStatement","src":"1502:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1453:1:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1456:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1450:2:111"},"nodeType":"YulFunctionCall","src":"1450:9:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1460:19:111","statements":[{"nodeType":"YulAssignment","src":"1462:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1471:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1474:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1467:3:111"},"nodeType":"YulFunctionCall","src":"1467:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1462:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1446:3:111","statements":[]},"src":"1442:129:111"},{"body":{"nodeType":"YulBlock","src":"1601:59:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1630:6:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1638:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1626:3:111"},"nodeType":"YulFunctionCall","src":"1626:15:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1643:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1622:3:111"},"nodeType":"YulFunctionCall","src":"1622:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"1648:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1615:6:111"},"nodeType":"YulFunctionCall","src":"1615:35:111"},"nodeType":"YulExpressionStatement","src":"1615:35:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1586:1:111"},{"name":"_4","nodeType":"YulIdentifier","src":"1589:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1583:2:111"},"nodeType":"YulFunctionCall","src":"1583:9:111"},"nodeType":"YulIf","src":"1580:80:111"},{"nodeType":"YulAssignment","src":"1669:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1679:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1669:6:111"}]},{"nodeType":"YulAssignment","src":"1694:72:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1751:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1762:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1747:3:111"},"nodeType":"YulFunctionCall","src":"1747:18:111"}],"functionName":{"name":"abi_decode_contract_IEntryPoint_fromMemory","nodeType":"YulIdentifier","src":"1704:42:111"},"nodeType":"YulFunctionCall","src":"1704:62:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1694:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_string_memory_ptrt_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"534:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"545:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"557:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"565:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"573:6:111","type":""}],"src":"438:1334:111"},{"body":{"nodeType":"YulBlock","src":"1832:325:111","statements":[{"nodeType":"YulAssignment","src":"1842:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1856:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"1859:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1852:3:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1842:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1873:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1903:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"1909:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1899:3:111"},"nodeType":"YulFunctionCall","src":"1899:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"1877:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1950:31:111","statements":[{"nodeType":"YulAssignment","src":"1952:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1974:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1962:3:111"},"nodeType":"YulFunctionCall","src":"1962:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1952:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"1930:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:26:111"},"nodeType":"YulIf","src":"1920:61:111"},{"body":{"nodeType":"YulBlock","src":"2040:111:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2061:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2068:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"2073:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2064:3:111"},"nodeType":"YulFunctionCall","src":"2064:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2054:6:111"},"nodeType":"YulFunctionCall","src":"2054:31:111"},"nodeType":"YulExpressionStatement","src":"2054:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2105:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2108:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2098:6:111"},"nodeType":"YulFunctionCall","src":"2098:15:111"},"nodeType":"YulExpressionStatement","src":"2098:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2133:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2136:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2126:6:111"},"nodeType":"YulFunctionCall","src":"2126:15:111"},"nodeType":"YulExpressionStatement","src":"2126:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"1996:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2019:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2027:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2016:2:111"},"nodeType":"YulFunctionCall","src":"2016:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1993:2:111"},"nodeType":"YulFunctionCall","src":"1993:38:111"},"nodeType":"YulIf","src":"1990:161:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"1812:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"1821:6:111","type":""}],"src":"1777:380:111"},{"body":{"nodeType":"YulBlock","src":"2218:65:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2235:1:111","type":"","value":"0"},{"name":"ptr","nodeType":"YulIdentifier","src":"2238:3:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2228:6:111"},"nodeType":"YulFunctionCall","src":"2228:14:111"},"nodeType":"YulExpressionStatement","src":"2228:14:111"},{"nodeType":"YulAssignment","src":"2251:26:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2269:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2272:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"2259:9:111"},"nodeType":"YulFunctionCall","src":"2259:18:111"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"2251:4:111"}]}]},"name":"array_dataslot_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"ptr","nodeType":"YulTypedName","src":"2201:3:111","type":""}],"returnVariables":[{"name":"data","nodeType":"YulTypedName","src":"2209:4:111","type":""}],"src":"2162:121:111"},{"body":{"nodeType":"YulBlock","src":"2369:464:111","statements":[{"body":{"nodeType":"YulBlock","src":"2402:425:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2416:11:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2426:1:111","type":"","value":"0"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2420:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2447:2:111"},{"name":"array","nodeType":"YulIdentifier","src":"2451:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2440:6:111"},"nodeType":"YulFunctionCall","src":"2440:17:111"},"nodeType":"YulExpressionStatement","src":"2440:17:111"},{"nodeType":"YulVariableDeclaration","src":"2470:31:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2492:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"2496:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"2482:9:111"},"nodeType":"YulFunctionCall","src":"2482:19:111"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"2474:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2514:57:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2537:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2547:1:111","type":"","value":"5"},{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"2554:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2566:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2550:3:111"},"nodeType":"YulFunctionCall","src":"2550:19:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2543:3:111"},"nodeType":"YulFunctionCall","src":"2543:27:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2533:3:111"},"nodeType":"YulFunctionCall","src":"2533:38:111"},"variables":[{"name":"deleteStart","nodeType":"YulTypedName","src":"2518:11:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2608:23:111","statements":[{"nodeType":"YulAssignment","src":"2610:19:111","value":{"name":"data","nodeType":"YulIdentifier","src":"2625:4:111"},"variableNames":[{"name":"deleteStart","nodeType":"YulIdentifier","src":"2610:11:111"}]}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"2590:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2602:4:111","type":"","value":"0x20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2587:2:111"},"nodeType":"YulFunctionCall","src":"2587:20:111"},"nodeType":"YulIf","src":"2584:47:111"},{"nodeType":"YulVariableDeclaration","src":"2644:41:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2658:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2668:1:111","type":"","value":"5"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2675:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2680:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2671:3:111"},"nodeType":"YulFunctionCall","src":"2671:12:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2664:3:111"},"nodeType":"YulFunctionCall","src":"2664:20:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2654:3:111"},"nodeType":"YulFunctionCall","src":"2654:31:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2648:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2698:24:111","value":{"name":"deleteStart","nodeType":"YulIdentifier","src":"2711:11:111"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"2702:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2796:21:111","statements":[{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2805:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2812:2:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2798:6:111"},"nodeType":"YulFunctionCall","src":"2798:17:111"},"nodeType":"YulExpressionStatement","src":"2798:17:111"}]},"condition":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2746:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2753:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2743:2:111"},"nodeType":"YulFunctionCall","src":"2743:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2757:26:111","statements":[{"nodeType":"YulAssignment","src":"2759:22:111","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"2772:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2779:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2768:3:111"},"nodeType":"YulFunctionCall","src":"2768:13:111"},"variableNames":[{"name":"start","nodeType":"YulIdentifier","src":"2759:5:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2739:3:111","statements":[]},"src":"2735:82:111"}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2385:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2390:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2382:2:111"},"nodeType":"YulFunctionCall","src":"2382:11:111"},"nodeType":"YulIf","src":"2379:448:111"}]},"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"2341:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"2348:3:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"2353:10:111","type":""}],"src":"2288:545:111"},{"body":{"nodeType":"YulBlock","src":"2923:81:111","statements":[{"nodeType":"YulAssignment","src":"2933:65:111","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2948:4:111"},{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2966:1:111","type":"","value":"3"},{"name":"len","nodeType":"YulIdentifier","src":"2969:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2962:3:111"},"nodeType":"YulFunctionCall","src":"2962:11:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2979:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2975:3:111"},"nodeType":"YulFunctionCall","src":"2975:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2958:3:111"},"nodeType":"YulFunctionCall","src":"2958:24:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2954:3:111"},"nodeType":"YulFunctionCall","src":"2954:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2944:3:111"},"nodeType":"YulFunctionCall","src":"2944:40:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2990:1:111","type":"","value":"1"},{"name":"len","nodeType":"YulIdentifier","src":"2993:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2986:3:111"},"nodeType":"YulFunctionCall","src":"2986:11:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2941:2:111"},"nodeType":"YulFunctionCall","src":"2941:57:111"},"variableNames":[{"name":"used","nodeType":"YulIdentifier","src":"2933:4:111"}]}]},"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"2900:4:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"2906:3:111","type":""}],"returnVariables":[{"name":"used","nodeType":"YulTypedName","src":"2914:4:111","type":""}],"src":"2838:166:111"},{"body":{"nodeType":"YulBlock","src":"3105:1256:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3115:24:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3135:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3129:5:111"},"nodeType":"YulFunctionCall","src":"3129:10:111"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"3119:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3182:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3184:16:111"},"nodeType":"YulFunctionCall","src":"3184:18:111"},"nodeType":"YulExpressionStatement","src":"3184:18:111"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3154:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3170:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"3174:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3166:3:111"},"nodeType":"YulFunctionCall","src":"3166:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"3178:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3162:3:111"},"nodeType":"YulFunctionCall","src":"3162:18:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3151:2:111"},"nodeType":"YulFunctionCall","src":"3151:30:111"},"nodeType":"YulIf","src":"3148:56:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3257:4:111"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3295:4:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"3289:5:111"},"nodeType":"YulFunctionCall","src":"3289:11:111"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"3263:25:111"},"nodeType":"YulFunctionCall","src":"3263:38:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3303:6:111"}],"functionName":{"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulIdentifier","src":"3213:43:111"},"nodeType":"YulFunctionCall","src":"3213:97:111"},"nodeType":"YulExpressionStatement","src":"3213:97:111"},{"nodeType":"YulVariableDeclaration","src":"3319:18:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3336:1:111","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"3323:9:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3346:23:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3365:4:111","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"3350:11:111","type":""}]},{"nodeType":"YulAssignment","src":"3378:24:111","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3391:11:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3378:9:111"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"3448:656:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3462:35:111","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3481:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3493:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3489:3:111"},"nodeType":"YulFunctionCall","src":"3489:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3477:3:111"},"nodeType":"YulFunctionCall","src":"3477:20:111"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"3466:7:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3510:49:111","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3554:4:111"}],"functionName":{"name":"array_dataslot_string_storage","nodeType":"YulIdentifier","src":"3524:29:111"},"nodeType":"YulFunctionCall","src":"3524:35:111"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"3514:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3572:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3581:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3576:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3659:172:111","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3684:6:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3702:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3707:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3698:3:111"},"nodeType":"YulFunctionCall","src":"3698:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3692:5:111"},"nodeType":"YulFunctionCall","src":"3692:26:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3677:6:111"},"nodeType":"YulFunctionCall","src":"3677:42:111"},"nodeType":"YulExpressionStatement","src":"3677:42:111"},{"nodeType":"YulAssignment","src":"3736:24:111","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3750:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3758:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3746:3:111"},"nodeType":"YulFunctionCall","src":"3746:14:111"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3736:6:111"}]},{"nodeType":"YulAssignment","src":"3777:40:111","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3794:9:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3805:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3790:3:111"},"nodeType":"YulFunctionCall","src":"3790:27:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3777:9:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3606:1:111"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"3609:7:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3603:2:111"},"nodeType":"YulFunctionCall","src":"3603:14:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3618:28:111","statements":[{"nodeType":"YulAssignment","src":"3620:24:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3629:1:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3632:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3625:3:111"},"nodeType":"YulFunctionCall","src":"3625:19:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3620:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3599:3:111","statements":[]},"src":"3595:236:111"},{"body":{"nodeType":"YulBlock","src":"3879:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3897:43:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3924:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3929:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3920:3:111"},"nodeType":"YulFunctionCall","src":"3920:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3914:5:111"},"nodeType":"YulFunctionCall","src":"3914:26:111"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"3901:9:111","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3964:6:111"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"3976:9:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4003:1:111","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"4006:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3999:3:111"},"nodeType":"YulFunctionCall","src":"3999:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"4015:3:111","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3995:3:111"},"nodeType":"YulFunctionCall","src":"3995:24:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4025:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"4021:3:111"},"nodeType":"YulFunctionCall","src":"4021:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"3991:3:111"},"nodeType":"YulFunctionCall","src":"3991:37:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3987:3:111"},"nodeType":"YulFunctionCall","src":"3987:42:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3972:3:111"},"nodeType":"YulFunctionCall","src":"3972:58:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3957:6:111"},"nodeType":"YulFunctionCall","src":"3957:74:111"},"nodeType":"YulExpressionStatement","src":"3957:74:111"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"3850:7:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"3859:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3847:2:111"},"nodeType":"YulFunctionCall","src":"3847:19:111"},"nodeType":"YulIf","src":"3844:201:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"4065:4:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4079:1:111","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"4082:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"4075:3:111"},"nodeType":"YulFunctionCall","src":"4075:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"4091:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4071:3:111"},"nodeType":"YulFunctionCall","src":"4071:22:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4058:6:111"},"nodeType":"YulFunctionCall","src":"4058:36:111"},"nodeType":"YulExpressionStatement","src":"4058:36:111"}]},"nodeType":"YulCase","src":"3441:663:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3446:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"4121:234:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4135:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4148:1:111","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4139:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4184:67:111","statements":[{"nodeType":"YulAssignment","src":"4202:35:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"4221:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"4226:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4217:3:111"},"nodeType":"YulFunctionCall","src":"4217:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4211:5:111"},"nodeType":"YulFunctionCall","src":"4211:26:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"4202:5:111"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"4165:6:111"},"nodeType":"YulIf","src":"4162:89:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"4271:4:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4330:5:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"4337:6:111"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"4277:52:111"},"nodeType":"YulFunctionCall","src":"4277:67:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4264:6:111"},"nodeType":"YulFunctionCall","src":"4264:81:111"},"nodeType":"YulExpressionStatement","src":"4264:81:111"}]},"nodeType":"YulCase","src":"4113:242:111","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3421:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3429:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3418:2:111"},"nodeType":"YulFunctionCall","src":"3418:14:111"},"nodeType":"YulSwitch","src":"3411:944:111"}]},"name":"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"3090:4:111","type":""},{"name":"src","nodeType":"YulTypedName","src":"3096:3:111","type":""}],"src":"3009:1352:111"},{"body":{"nodeType":"YulBlock","src":"4540:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4557:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4568:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4550:6:111"},"nodeType":"YulFunctionCall","src":"4550:21:111"},"nodeType":"YulExpressionStatement","src":"4550:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4591:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4602:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4587:3:111"},"nodeType":"YulFunctionCall","src":"4587:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4607:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4580:6:111"},"nodeType":"YulFunctionCall","src":"4580:30:111"},"nodeType":"YulExpressionStatement","src":"4580:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4630:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4641:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4626:3:111"},"nodeType":"YulFunctionCall","src":"4626:18:111"},{"hexValue":"45524332303a206d696e7420746f20746865207a65726f2061646472657373","kind":"string","nodeType":"YulLiteral","src":"4646:33:111","type":"","value":"ERC20: mint to the zero address"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4619:6:111"},"nodeType":"YulFunctionCall","src":"4619:61:111"},"nodeType":"YulExpressionStatement","src":"4619:61:111"},{"nodeType":"YulAssignment","src":"4689:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4701:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4712:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4697:3:111"},"nodeType":"YulFunctionCall","src":"4697:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4689:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4517:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4531:4:111","type":""}],"src":"4366:355:111"},{"body":{"nodeType":"YulBlock","src":"4774:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4809:111:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4830:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4837:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"4842:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"4833:3:111"},"nodeType":"YulFunctionCall","src":"4833:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4823:6:111"},"nodeType":"YulFunctionCall","src":"4823:31:111"},"nodeType":"YulExpressionStatement","src":"4823:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4874:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4877:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4867:6:111"},"nodeType":"YulFunctionCall","src":"4867:15:111"},"nodeType":"YulExpressionStatement","src":"4867:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4902:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4905:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4895:6:111"},"nodeType":"YulFunctionCall","src":"4895:15:111"},"nodeType":"YulExpressionStatement","src":"4895:15:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"4790:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"4797:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"4793:3:111"},"nodeType":"YulFunctionCall","src":"4793:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4787:2:111"},"nodeType":"YulFunctionCall","src":"4787:13:111"},"nodeType":"YulIf","src":"4784:136:111"},{"nodeType":"YulAssignment","src":"4929:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"4940:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"4943:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4936:3:111"},"nodeType":"YulFunctionCall","src":"4936:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"4929:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"4757:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"4760:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"4766:3:111","type":""}],"src":"4726:225:111"},{"body":{"nodeType":"YulBlock","src":"5057:76:111","statements":[{"nodeType":"YulAssignment","src":"5067:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5079:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5090:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5075:3:111"},"nodeType":"YulFunctionCall","src":"5075:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5067:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5109:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5120:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5102:6:111"},"nodeType":"YulFunctionCall","src":"5102:25:111"},"nodeType":"YulExpressionStatement","src":"5102:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5026:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5037:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5048:4:111","type":""}],"src":"4956:177:111"},{"body":{"nodeType":"YulBlock","src":"5312:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5329:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5340:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5322:6:111"},"nodeType":"YulFunctionCall","src":"5322:21:111"},"nodeType":"YulExpressionStatement","src":"5322:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5363:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5374:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5359:3:111"},"nodeType":"YulFunctionCall","src":"5359:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5379:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5352:6:111"},"nodeType":"YulFunctionCall","src":"5352:30:111"},"nodeType":"YulExpressionStatement","src":"5352:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5402:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5413:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5398:3:111"},"nodeType":"YulFunctionCall","src":"5398:18:111"},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f20616464","kind":"string","nodeType":"YulLiteral","src":"5418:34:111","type":"","value":"ERC20: approve from the zero add"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5391:6:111"},"nodeType":"YulFunctionCall","src":"5391:62:111"},"nodeType":"YulExpressionStatement","src":"5391:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5473:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5484:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5469:3:111"},"nodeType":"YulFunctionCall","src":"5469:18:111"},{"hexValue":"72657373","kind":"string","nodeType":"YulLiteral","src":"5489:6:111","type":"","value":"ress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5462:6:111"},"nodeType":"YulFunctionCall","src":"5462:34:111"},"nodeType":"YulExpressionStatement","src":"5462:34:111"},{"nodeType":"YulAssignment","src":"5505:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5517:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5528:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5513:3:111"},"nodeType":"YulFunctionCall","src":"5513:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5505:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5289:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5303:4:111","type":""}],"src":"5138:400:111"},{"body":{"nodeType":"YulBlock","src":"5717:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5745:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5727:6:111"},"nodeType":"YulFunctionCall","src":"5727:21:111"},"nodeType":"YulExpressionStatement","src":"5727:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5768:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5779:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5764:3:111"},"nodeType":"YulFunctionCall","src":"5764:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5784:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5757:6:111"},"nodeType":"YulFunctionCall","src":"5757:30:111"},"nodeType":"YulExpressionStatement","src":"5757:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5818:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5803:3:111"},"nodeType":"YulFunctionCall","src":"5803:18:111"},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f206164647265","kind":"string","nodeType":"YulLiteral","src":"5823:34:111","type":"","value":"ERC20: approve to the zero addre"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5796:6:111"},"nodeType":"YulFunctionCall","src":"5796:62:111"},"nodeType":"YulExpressionStatement","src":"5796:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5878:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5889:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5874:3:111"},"nodeType":"YulFunctionCall","src":"5874:18:111"},{"hexValue":"7373","kind":"string","nodeType":"YulLiteral","src":"5894:4:111","type":"","value":"ss"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5867:6:111"},"nodeType":"YulFunctionCall","src":"5867:32:111"},"nodeType":"YulExpressionStatement","src":"5867:32:111"},{"nodeType":"YulAssignment","src":"5908:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5920:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5931:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5916:3:111"},"nodeType":"YulFunctionCall","src":"5916:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5908:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5694:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5708:4:111","type":""}],"src":"5543:398:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_contract_IEntryPoint_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_address(value)\n }\n function abi_decode_tuple_t_addresst_string_memory_ptrt_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address(value)\n value0 := value\n let _1 := 32\n let offset := mload(add(headStart, _1))\n let _2 := sub(shl(64, 1), 1)\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := mload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let _5 := not(31)\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_4, 0x1f), _5), 63), _5))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _4)\n if gt(add(add(_3, _4), _1), dataEnd) { revert(0, 0) }\n let i := 0\n for { } lt(i, _4) { i := add(i, _1) }\n {\n mstore(add(add(memPtr, i), _1), mload(add(add(_3, i), _1)))\n }\n if gt(i, _4)\n {\n mstore(add(add(memPtr, _4), _1), 0)\n }\n value1 := memPtr\n value2 := abi_decode_contract_IEntryPoint_fromMemory(add(headStart, 64))\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_string_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_string_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n let _1 := 0\n mstore(_1, array)\n let data := keccak256(_1, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _2 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _2) { start := add(start, 1) }\n { sstore(start, _1) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_string_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_string_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ERC20: mint to the zero address\")\n tail := add(headStart, 96)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c06040523480156200001157600080fd5b50604051620020be380380620020be833981016040819052620000349162000327565b8180826200004233620000a0565b6001600160a01b031660805260046200005c8382620004bc565b5060056200006b8282620004bc565b5050506001600160a01b03831660a05262000088306001620000f0565b620000973033600019620001b9565b505050620005af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166200014c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b806003600082825462000160919062000588565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0383166200021d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000143565b6001600160a01b038216620002805760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000143565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b6001600160a01b0381168114620002fc57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200032281620002e6565b919050565b6000806000606084860312156200033d57600080fd5b83516200034a81620002e6565b602085810151919450906001600160401b03808211156200036a57600080fd5b818701915087601f8301126200037f57600080fd5b815181811115620003945762000394620002ff565b604051601f8201601f19908116603f01168101908382118183101715620003bf57620003bf620002ff565b816040528281528a86848701011115620003d857600080fd5b600093505b82841015620003fc5784840186015181850187015292850192620003dd565b828411156200040e5760008684830101525b809750505050505050620004256040850162000315565b90509250925092565b600181811c908216806200044357607f821691505b6020821081036200046457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e157600081815260208120601f850160051c81016020861015620004935750805b601f850160051c820191505b81811015620004b4578281556001016200049f565b505050505050565b81516001600160401b03811115620004d857620004d8620002ff565b620004f081620004e984546200042e565b846200046a565b602080601f8311600181146200052857600084156200050f5750858301515b600019600386901b1c1916600185901b178555620004b4565b600085815260208120601f198616915b82811015620005595788860151825594840194600190910190840162000538565b5085821015620005785787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008219821115620005aa57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a051611ab16200060d60003960008181610392015261158e015260008181610426015281816105970152818161070b015281816108d00152818161099701528181610a2701528181610ada01526111280152611ab16000f3fe6080604052600436106101a15760003560e01c80639f5ca221116100e1578063c23a5cea1161008a578063dd62ed3e11610064578063dd62ed3e1461049a578063f0dda65c146104ed578063f2fde38b1461050d578063f465c77e1461052d57600080fd5b8063c23a5cea1461045d578063c399ec881461047d578063d0e30db01461049257600080fd5b8063a9a23409116100bb578063a9a23409146103f4578063b0d691fe14610414578063bb9fe6bf1461044857600080fd5b80639f5ca22114610380578063a457c2d7146103b4578063a9059cbb146103d457600080fd5b8063313ce5671161014e578063715018a611610128578063715018a6146102f4578063796d4371146103095780638da5cb5b1461031f57806395d89b411461036b57600080fd5b8063313ce56714610275578063395093511461029157806370a08231146102b157600080fd5b806318160ddd1161017f57806318160ddd14610216578063205c28781461023557806323b872dd1461025557600080fd5b80630396cb60146101a657806306fdde03146101bb578063095ea7b3146101e6575b600080fd5b6101b96101b4366004611622565b61055b565b005b3480156101c757600080fd5b506101d061060d565b6040516101dd91906116ba565b60405180910390f35b3480156101f257600080fd5b506102066102013660046116ef565b61069f565b60405190151581526020016101dd565b34801561022257600080fd5b506003545b6040519081526020016101dd565b34801561024157600080fd5b506101b96102503660046116ef565b6106b7565b34801561026157600080fd5b5061020661027036600461171b565b61074f565b34801561028157600080fd5b50604051601281526020016101dd565b34801561029d57600080fd5b506102066102ac3660046116ef565b610773565b3480156102bd57600080fd5b506102276102cc36600461175c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b34801561030057600080fd5b506101b96107bf565b34801561031557600080fd5b50610227613a9881565b34801561032b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b34801561037757600080fd5b506101d06107d3565b34801561038c57600080fd5b506103467f000000000000000000000000000000000000000000000000000000000000000081565b3480156103c057600080fd5b506102066103cf3660046116ef565b6107e2565b3480156103e057600080fd5b506102066103ef3660046116ef565b61089e565b34801561040057600080fd5b506101b961040f366004611779565b6108ac565b34801561042057600080fd5b506103467f000000000000000000000000000000000000000000000000000000000000000081565b34801561045457600080fd5b506101b96108c6565b34801561046957600080fd5b506101b961047836600461175c565b61094a565b34801561048957600080fd5b506102276109f6565b6101b9610aac565b3480156104a657600080fd5b506102276104b5366004611808565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b3480156104f957600080fd5b506101b96105083660046116ef565b610b34565b34801561051957600080fd5b506101b961052836600461175c565b610b4a565b34801561053957600080fd5b5061054d610548366004611841565b610bb3565b6040516101dd929190611895565b610563610bd6565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050505050565b60606004805461061c906118b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610648906118b7565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b6000336106ad818585610c3d565b5060019392505050565b6106bf610bd6565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105f157600080fd5b60003361075d858285610dbc565b610768858585610e73565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106ad90829086906107ba90879061190a565b610c3d565b6107c7610bd6565b6107d1600061109b565b565b60606005805461061c906118b7565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156108915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6107688286868403610c3d565b6000336106ad818585610e73565b6108b4611110565b6108c084848484611195565b50505050565b6108ce610bd6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561093657600080fd5b505af11580156108c0573d6000803e3d6000fd5b610952610bd6565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190611949565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156109db57600080fd5b610b3c610bd6565b610b4682826111c8565b5050565b610b52610bd6565b610b7c30610b7560005473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c3d565b610b85816112a3565b610bb030827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610c3d565b50565b60606000610bbf611110565b610bca85858561133d565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610888565b73ffffffffffffffffffffffffffffffffffffffff8316610cc55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8216610d4e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108c05781811015610e665760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610888565b6108c08484848403610c3d565b73ffffffffffffffffffffffffffffffffffffffff8316610efc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8216610f855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054818110156110215760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061108e9086815260200190565b60405180910390a36108c0565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107d15760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610888565b60006111a38385018561175c565b905060006111bb6111b6613a988561190a565b611538565b9050610605823083610e73565b73ffffffffffffffffffffffffffffffffffffffff821661122b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610888565b806003600082825461123d919061190a565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6112ab610bd6565b73ffffffffffffffffffffffffffffffffffffffff81166113345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610888565b610bb08161109b565b606060008061134b84611538565b9050613a988660a00135116113c85760405162461bcd60e51b815260206004820152602660248201527f546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f722060448201527f706f73744f7000000000000000000000000000000000000000000000000000006064820152608401610888565b6113d56040870187611962565b15905061146f576113e58661154b565b806113f66102cc602089018961175c565b101561146a5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d60448201527f63726561746529000000000000000000000000000000000000000000000000006064820152608401610888565b6114ce565b806114806102cc602089018961175c565b10156114ce5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e5061796d61737465723a206e6f2062616c616e63650000000000006044820152606401610888565b6114db602087018761175c565b6040805173ffffffffffffffffffffffffffffffffffffffff909216602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529660009650945050505050565b60006115456064836119ce565b92915050565b600061155a6040830183611962565b61156991601491600091611a09565b61157291611a33565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114610b465760405162461bcd60e51b815260206004820152602560248201527f546f6b656e5061796d61737465723a2077726f6e67206163636f756e7420666160448201527f63746f72790000000000000000000000000000000000000000000000000000006064820152608401610888565b60006020828403121561163457600080fd5b813563ffffffff8116811461164857600080fd5b9392505050565b6000815180845260005b8181101561167557602081850181015186830182015201611659565b81811115611687576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611648602083018461164f565b73ffffffffffffffffffffffffffffffffffffffff81168114610bb057600080fd5b6000806040838503121561170257600080fd5b823561170d816116cd565b946020939093013593505050565b60008060006060848603121561173057600080fd5b833561173b816116cd565b9250602084013561174b816116cd565b929592945050506040919091013590565b60006020828403121561176e57600080fd5b8135611648816116cd565b6000806000806060858703121561178f57600080fd5b84356003811061179e57600080fd5b9350602085013567ffffffffffffffff808211156117bb57600080fd5b818701915087601f8301126117cf57600080fd5b8135818111156117de57600080fd5b8860208285010111156117f057600080fd5b95986020929092019750949560400135945092505050565b6000806040838503121561181b57600080fd5b8235611826816116cd565b91506020830135611836816116cd565b809150509250929050565b60008060006060848603121561185657600080fd5b833567ffffffffffffffff81111561186d57600080fd5b8401610160818703121561188057600080fd5b95602085013595506040909401359392505050565b6040815260006118a8604083018561164f565b90508260208301529392505050565b600181811c908216806118cb57607f821691505b602082108103611904577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115611944577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60006020828403121561195b57600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261199757600080fd5b83018035915067ffffffffffffffff8211156119b257600080fd5b6020019150368190038213156119c757600080fd5b9250929050565b600082611a04577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008085851115611a1957600080fd5b83861115611a2657600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015611a735780818660140360031b1b83161692505b50509291505056fea2646970667358221220c50af7154147d5e18d723640df17b4c53b6e3ea61c9b0966d52426a4e43269e064736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x20BE CODESIZE SUB DUP1 PUSH3 0x20BE DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x327 JUMP JUMPDEST DUP2 DUP1 DUP3 PUSH3 0x42 CALLER PUSH3 0xA0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH1 0x4 PUSH3 0x5C DUP4 DUP3 PUSH3 0x4BC JUMP JUMPDEST POP PUSH1 0x5 PUSH3 0x6B DUP3 DUP3 PUSH3 0x4BC JUMP JUMPDEST POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0xA0 MSTORE PUSH3 0x88 ADDRESS PUSH1 0x1 PUSH3 0xF0 JUMP JUMPDEST PUSH3 0x97 ADDRESS CALLER PUSH1 0x0 NOT PUSH3 0x1B9 JUMP JUMPDEST POP POP POP PUSH3 0x5AF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH3 0x14C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH3 0x160 SWAP2 SWAP1 PUSH3 0x588 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE MLOAD DUP5 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH3 0x21D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH4 0x72657373 PUSH1 0xE0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH3 0x143 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH3 0x280 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x7373 PUSH1 0xF0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH3 0x143 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x2FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD PUSH3 0x322 DUP2 PUSH3 0x2E6 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x33D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH3 0x34A DUP2 PUSH3 0x2E6 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP2 ADD MLOAD SWAP2 SWAP5 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH3 0x394 JUMPI PUSH3 0x394 PUSH3 0x2FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH3 0x3BF JUMPI PUSH3 0x3BF PUSH3 0x2FF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP11 DUP7 DUP5 DUP8 ADD ADD GT ISZERO PUSH3 0x3D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP3 DUP5 LT ISZERO PUSH3 0x3FC JUMPI DUP5 DUP5 ADD DUP7 ADD MLOAD DUP2 DUP6 ADD DUP8 ADD MSTORE SWAP3 DUP6 ADD SWAP3 PUSH3 0x3DD JUMP JUMPDEST DUP3 DUP5 GT ISZERO PUSH3 0x40E JUMPI PUSH1 0x0 DUP7 DUP5 DUP4 ADD ADD MSTORE JUMPDEST DUP1 SWAP8 POP POP POP POP POP POP POP PUSH3 0x425 PUSH1 0x40 DUP6 ADD PUSH3 0x315 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x443 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH3 0x464 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH3 0x2E1 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP7 LT ISZERO PUSH3 0x493 JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x4B4 JUMPI DUP3 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x49F JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH3 0x4D8 JUMPI PUSH3 0x4D8 PUSH3 0x2FF JUMP JUMPDEST PUSH3 0x4F0 DUP2 PUSH3 0x4E9 DUP5 SLOAD PUSH3 0x42E JUMP JUMPDEST DUP5 PUSH3 0x46A JUMP JUMPDEST PUSH1 0x20 DUP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 DUP2 EQ PUSH3 0x528 JUMPI PUSH1 0x0 DUP5 ISZERO PUSH3 0x50F JUMPI POP DUP6 DUP4 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP7 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP6 SWAP1 SHL OR DUP6 SSTORE PUSH3 0x4B4 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP7 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x559 JUMPI DUP9 DUP7 ADD MLOAD DUP3 SSTORE SWAP5 DUP5 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 DUP5 ADD PUSH3 0x538 JUMP JUMPDEST POP DUP6 DUP3 LT ISZERO PUSH3 0x578 JUMPI DUP8 DUP6 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP9 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH3 0x5AA JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x1AB1 PUSH3 0x60D PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x392 ADD MSTORE PUSH2 0x158E ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x426 ADD MSTORE DUP2 DUP2 PUSH2 0x597 ADD MSTORE DUP2 DUP2 PUSH2 0x70B ADD MSTORE DUP2 DUP2 PUSH2 0x8D0 ADD MSTORE DUP2 DUP2 PUSH2 0x997 ADD MSTORE DUP2 DUP2 PUSH2 0xA27 ADD MSTORE DUP2 DUP2 PUSH2 0xADA ADD MSTORE PUSH2 0x1128 ADD MSTORE PUSH2 0x1AB1 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9F5CA221 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23A5CEA GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xDD62ED3E GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x49A JUMPI DUP1 PUSH4 0xF0DDA65C EQ PUSH2 0x4ED JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x50D JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x448 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9F5CA221 EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0x14E JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2F4 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x309 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x31F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x313CE567 EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0x17F JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1E6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1622 JUMP JUMPDEST PUSH2 0x55B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x60D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x16BA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x69F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x222 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x250 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x6B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x270 CALLDATASIZE PUSH1 0x4 PUSH2 0x171B JUMP JUMPDEST PUSH2 0x74F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x2AC CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x773 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x2CC CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x7BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x3A98 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x377 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x7D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x346 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x7E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x89E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x1779 JUMP JUMPDEST PUSH2 0x8AC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x346 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x8C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x94A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x9F6 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0xAAC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x4B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1808 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x508 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0xB34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x519 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x528 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0xB4A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x54D PUSH2 0x548 CALLDATASIZE PUSH1 0x4 PUSH2 0x1841 JUMP JUMPDEST PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP3 SWAP2 SWAP1 PUSH2 0x1895 JUMP JUMPDEST PUSH2 0x563 PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x605 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x61C SWAP1 PUSH2 0x18B7 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x648 SWAP1 PUSH2 0x18B7 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x695 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x66A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x695 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x678 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x6AD DUP2 DUP6 DUP6 PUSH2 0xC3D JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6BF PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLER PUSH2 0x75D DUP6 DUP3 DUP6 PUSH2 0xDBC JUMP JUMPDEST PUSH2 0x768 DUP6 DUP6 DUP6 PUSH2 0xE73 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x6AD SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x7BA SWAP1 DUP8 SWAP1 PUSH2 0x190A JUMP JUMPDEST PUSH2 0xC3D JUMP JUMPDEST PUSH2 0x7C7 PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0x7D1 PUSH1 0x0 PUSH2 0x109B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH1 0x5 DUP1 SLOAD PUSH2 0x61C SWAP1 PUSH2 0x18B7 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x891 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x768 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0xC3D JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x6AD DUP2 DUP6 DUP6 PUSH2 0xE73 JUMP JUMPDEST PUSH2 0x8B4 PUSH2 0x1110 JUMP JUMPDEST PUSH2 0x8C0 DUP5 DUP5 DUP5 DUP5 PUSH2 0x1195 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x8CE PUSH2 0xBD6 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x952 PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9EF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA83 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xAA7 SWAP2 SWAP1 PUSH2 0x1949 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB3C PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0xB46 DUP3 DUP3 PUSH2 0x11C8 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB52 PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0xB7C ADDRESS PUSH2 0xB75 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC3D JUMP JUMPDEST PUSH2 0xB85 DUP2 PUSH2 0x12A3 JUMP JUMPDEST PUSH2 0xBB0 ADDRESS DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC3D JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xBBF PUSH2 0x1110 JUMP JUMPDEST PUSH2 0xBCA DUP6 DUP6 DUP6 PUSH2 0x133D JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0xCC5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xD4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x8C0 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0xE66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x8C0 DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0xC3D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xF85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x1021 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP7 SUB SWAP1 SSTORE SWAP3 DUP7 AND DUP1 DUP3 MSTORE SWAP1 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE SWAP2 MLOAD PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0x108E SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11A3 DUP4 DUP6 ADD DUP6 PUSH2 0x175C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11BB PUSH2 0x11B6 PUSH2 0x3A98 DUP6 PUSH2 0x190A JUMP JUMPDEST PUSH2 0x1538 JUMP JUMPDEST SWAP1 POP PUSH2 0x605 DUP3 ADDRESS DUP4 PUSH2 0xE73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x122B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x123D SWAP2 SWAP1 PUSH2 0x190A JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE MLOAD DUP5 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x12AB PUSH2 0xBD6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1334 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0xBB0 DUP2 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x134B DUP5 PUSH2 0x1538 JUMP JUMPDEST SWAP1 POP PUSH2 0x3A98 DUP7 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x13C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A2067617320746F6F206C6F7720666F7220 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x706F73744F700000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x13D5 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x1962 JUMP JUMPDEST ISZERO SWAP1 POP PUSH2 0x146F JUMPI PUSH2 0x13E5 DUP7 PUSH2 0x154B JUMP JUMPDEST DUP1 PUSH2 0x13F6 PUSH2 0x2CC PUSH1 0x20 DUP10 ADD DUP10 PUSH2 0x175C JUMP JUMPDEST LT ISZERO PUSH2 0x146A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A206E6F2062616C616E636520287072652D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6372656174652900000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x14CE JUMP JUMPDEST DUP1 PUSH2 0x1480 PUSH2 0x2CC PUSH1 0x20 DUP10 ADD DUP10 PUSH2 0x175C JUMP JUMPDEST LT ISZERO PUSH2 0x14CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A206E6F2062616C616E6365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x14DB PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x175C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 DUP4 ADD MSTORE ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP7 PUSH1 0x0 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1545 PUSH1 0x64 DUP4 PUSH2 0x19CE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x155A PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1962 JUMP JUMPDEST PUSH2 0x1569 SWAP2 PUSH1 0x14 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x1A09 JUMP JUMPDEST PUSH2 0x1572 SWAP2 PUSH2 0x1A33 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0xB46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A2077726F6E67206163636F756E74206661 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x63746F7279000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1634 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1648 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1675 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1659 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1687 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1648 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x164F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1702 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x170D DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1730 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x173B DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x174B DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x176E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1648 DUP2 PUSH2 0x16CD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x178F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x179E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x17CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x17DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x17F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x181B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1826 DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1836 DUP2 PUSH2 0x16CD JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1856 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x186D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x18A8 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x164F JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x18CB JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x1904 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1944 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x195B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1997 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x19B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x19C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A04 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x1A19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1A73 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 EXP 0xF7 ISZERO COINBASE SELFBALANCE 0xD5 0xE1 DUP14 PUSH19 0x3640DF17B4C53B6E3EA61C9B0966D52426A4E4 ORIGIN PUSH10 0xE064736F6C634300080F STOP CALLER ","sourceMap":"1212:4302:75:-:0;;;1396:377;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1486:7;;1518:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;2042:5:35;:13;2050:5;2042;:13;:::i;:::-;-1:-1:-1;2065:7:35;:17;2075:7;2065;:17;:::i;:::-;-1:-1:-1;;;;;;;;1541:27:75;::::2;;::::0;1606:23:::2;1620:4;1627:1;1606:5;:23::i;:::-;1715:51;1732:4;1739:10;-1:-1:-1::0;;1715:8:75::2;:51::i;:::-;1396:377:::0;;;1212:4302;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;8567:535:35:-;-1:-1:-1;;;;;8650:21:35;;8642:65;;;;-1:-1:-1;;;8642:65:35;;4568:2:111;8642:65:35;;;4550:21:111;4607:2;4587:18;;;4580:30;4646:33;4626:18;;;4619:61;4697:18;;8642:65:35;;;;;;;;;8794:6;8778:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8946:18:35;;;;;;:9;:18;;;;;;;;:28;;;;;;8999:37;5102:25:111;;;8999:37:35;;5075:18:111;8999:37:35;;;;;;;8567:535;;:::o;10504:370::-;-1:-1:-1;;;;;10635:19:35;;10627:68;;;;-1:-1:-1;;;10627:68:35;;5340:2:111;10627:68:35;;;5322:21:111;5379:2;5359:18;;;5352:30;5418:34;5398:18;;;5391:62;-1:-1:-1;;;5469:18:111;;;5462:34;5513:19;;10627:68:35;5138:400:111;10627:68:35;-1:-1:-1;;;;;10713:21:35;;10705:68;;;;-1:-1:-1;;;10705:68:35;;5745:2:111;10705:68:35;;;5727:21:111;5784:2;5764:18;;;5757:30;5823:34;5803:18;;;5796:62;-1:-1:-1;;;5874:18:111;;;5867:32;5916:19;;10705:68:35;5543:398:111;10705:68:35;-1:-1:-1;;;;;10784:18:35;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10835:32;;5102:25:111;;;10835:32:35;;5075:18:111;10835:32:35;;;;;;;10504:370;;;:::o;12180:121::-;;;;:::o;14:131:111:-;-1:-1:-1;;;;;89:31:111;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:127::-;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:151;374:13;;396:31;374:13;396:31;:::i;:::-;282:151;;;:::o;438:1334::-;557:6;565;573;626:2;614:9;605:7;601:23;597:32;594:52;;;642:1;639;632:12;594:52;674:9;668:16;693:31;718:5;693:31;:::i;:::-;767:2;798:18;;;792:25;743:5;;-1:-1:-1;767:2:111;-1:-1:-1;;;;;866:14:111;;;863:34;;;893:1;890;883:12;863:34;931:6;920:9;916:22;906:32;;976:7;969:4;965:2;961:13;957:27;947:55;;998:1;995;988:12;947:55;1027:2;1021:9;1049:2;1045;1042:10;1039:36;;;1055:18;;:::i;:::-;1130:2;1124:9;1098:2;1184:13;;-1:-1:-1;;1180:22:111;;;1204:2;1176:31;1172:40;1160:53;;;1228:18;;;1248:22;;;1225:46;1222:72;;;1274:18;;:::i;:::-;1314:10;1310:2;1303:22;1349:2;1341:6;1334:18;1389:7;1384:2;1379;1375;1371:11;1367:20;1364:33;1361:53;;;1410:1;1407;1400:12;1361:53;1432:1;1423:10;;1442:129;1456:2;1453:1;1450:9;1442:129;;;1544:10;;;1540:19;;1534:26;1513:14;;;1509:23;;1502:59;1467:10;;;;1442:129;;;1589:2;1586:1;1583:9;1580:80;;;1648:1;1643:2;1638;1630:6;1626:15;1622:24;1615:35;1580:80;1679:6;1669:16;;;;;;;;1704:62;1762:2;1751:9;1747:18;1704:62;:::i;:::-;1694:72;;438:1334;;;;;:::o;1777:380::-;1856:1;1852:12;;;;1899;;;1920:61;;1974:4;1966:6;1962:17;1952:27;;1920:61;2027:2;2019:6;2016:14;1996:18;1993:38;1990:161;;2073:10;2068:3;2064:20;2061:1;2054:31;2108:4;2105:1;2098:15;2136:4;2133:1;2126:15;1990:161;;1777:380;;;:::o;2288:545::-;2390:2;2385:3;2382:11;2379:448;;;2426:1;2451:5;2447:2;2440:17;2496:4;2492:2;2482:19;2566:2;2554:10;2550:19;2547:1;2543:27;2537:4;2533:38;2602:4;2590:10;2587:20;2584:47;;;-1:-1:-1;2625:4:111;2584:47;2680:2;2675:3;2671:12;2668:1;2664:20;2658:4;2654:31;2644:41;;2735:82;2753:2;2746:5;2743:13;2735:82;;;2798:17;;;2779:1;2768:13;2735:82;;;2739:3;;;2288:545;;;:::o;3009:1352::-;3129:10;;-1:-1:-1;;;;;3151:30:111;;3148:56;;;3184:18;;:::i;:::-;3213:97;3303:6;3263:38;3295:4;3289:11;3263:38;:::i;:::-;3257:4;3213:97;:::i;:::-;3365:4;;3429:2;3418:14;;3446:1;3441:663;;;;4148:1;4165:6;4162:89;;;-1:-1:-1;4217:19:111;;;4211:26;4162:89;-1:-1:-1;;2966:1:111;2962:11;;;2958:24;2954:29;2944:40;2990:1;2986:11;;;2941:57;4264:81;;3411:944;;3441:663;2235:1;2228:14;;;2272:4;2259:18;;-1:-1:-1;;3477:20:111;;;3595:236;3609:7;3606:1;3603:14;3595:236;;;3698:19;;;3692:26;3677:42;;3790:27;;;;3758:1;3746:14;;;;3625:19;;3595:236;;;3599:3;3859:6;3850:7;3847:19;3844:201;;;3920:19;;;3914:26;-1:-1:-1;;4003:1:111;3999:14;;;4015:3;3995:24;3991:37;3987:42;3972:58;3957:74;;3844:201;-1:-1:-1;;;;;4091:1:111;4075:14;;;4071:22;4058:36;;-1:-1:-1;3009:1352:111:o;4726:225::-;4766:3;4797:1;4793:6;4790:1;4787:13;4784:136;;;4842:10;4837:3;4833:20;4830:1;4823:31;4877:4;4874:1;4867:15;4905:4;4902:1;4895:15;4784:136;-1:-1:-1;4936:9:111;;4726:225::o;5543:398::-;1212:4302:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_14285":{"entryPoint":null,"id":14285,"parameterSlots":0,"returnSlots":0},"@_afterTokenTransfer_4340":{"entryPoint":null,"id":4340,"parameterSlots":3,"returnSlots":0},"@_approve_4275":{"entryPoint":3133,"id":4275,"parameterSlots":3,"returnSlots":0},"@_beforeTokenTransfer_4329":{"entryPoint":null,"id":4329,"parameterSlots":3,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":3030,"id":2875,"parameterSlots":0,"returnSlots":0},"@_mint_4158":{"entryPoint":4552,"id":4158,"parameterSlots":2,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_14540":{"entryPoint":4501,"id":14540,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":4368,"id":7527,"parameterSlots":0,"returnSlots":0},"@_spendAllowance_4318":{"entryPoint":3516,"id":4318,"parameterSlots":3,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":4251,"id":2932,"parameterSlots":1,"returnSlots":0},"@_transfer_4101":{"entryPoint":3699,"id":4101,"parameterSlots":3,"returnSlots":0},"@_validateConstructor_14497":{"entryPoint":5451,"id":14497,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_14469":{"entryPoint":4925,"id":14469,"parameterSlots":3,"returnSlots":2},"@addStake_7469":{"entryPoint":1371,"id":7469,"parameterSlots":1,"returnSlots":0},"@allowance_3896":{"entryPoint":null,"id":3896,"parameterSlots":2,"returnSlots":1},"@approve_3921":{"entryPoint":1695,"id":3921,"parameterSlots":2,"returnSlots":1},"@balanceOf_3853":{"entryPoint":null,"id":3853,"parameterSlots":1,"returnSlots":1},"@decimals_3829":{"entryPoint":null,"id":3829,"parameterSlots":0,"returnSlots":1},"@decreaseAllowance_4024":{"entryPoint":2018,"id":4024,"parameterSlots":2,"returnSlots":1},"@deposit_7433":{"entryPoint":2732,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@getDeposit_7484":{"entryPoint":2550,"id":7484,"parameterSlots":0,"returnSlots":1},"@getTokenValueOfEth_14398":{"entryPoint":5432,"id":14398,"parameterSlots":1,"returnSlots":1},"@increaseAllowance_3983":{"entryPoint":1907,"id":3983,"parameterSlots":2,"returnSlots":1},"@mintTokens_14347":{"entryPoint":2868,"id":14347,"parameterSlots":2,"returnSlots":0},"@name_3809":{"entryPoint":1549,"id":3809,"parameterSlots":0,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":2220,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":1983,"id":2889,"parameterSlots":0,"returnSlots":0},"@symbol_3819":{"entryPoint":2003,"id":3819,"parameterSlots":0,"returnSlots":1},"@theFactory_14287":{"entryPoint":null,"id":14287,"parameterSlots":0,"returnSlots":0},"@totalSupply_3839":{"entryPoint":null,"id":3839,"parameterSlots":0,"returnSlots":1},"@transferFrom_3954":{"entryPoint":1871,"id":3954,"parameterSlots":3,"returnSlots":1},"@transferOwnership_14386":{"entryPoint":2890,"id":14386,"parameterSlots":1,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":4771,"id":2912,"parameterSlots":1,"returnSlots":0},"@transfer_3878":{"entryPoint":2206,"id":3878,"parameterSlots":2,"returnSlots":1},"@unlockStake_7496":{"entryPoint":2246,"id":7496,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":2995,"id":7359,"parameterSlots":3,"returnSlots":2},"@withdrawStake_7511":{"entryPoint":2378,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1719,"id":7451,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":5980,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_address":{"entryPoint":6152,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_uint256":{"entryPoint":5915,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":5871,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":6009,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6209,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":6473,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":5666,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string":{"entryPoint":5711,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":6293,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":5818,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_a3a5fd70368e4e698a4b1ca2306756bd67295a1b90e45690e5829cd9be775e0d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ba1208b32158094aac35ebe5e696720821cdfa1d15e4b106c836c9b43fcf322a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c8acd6a8133474c975607944c89a9c2827b6234a8b3c94e8e794cae85c818cf6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e63029b4be8f7147d8fa8c7176417177721349d796aec4cd58131ce1ae4a4e98__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":6498,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":6665,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":6410,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":6606,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":6707,"id":null,"parameterSlots":2,"returnSlots":1},"extract_byte_array_length":{"entryPoint":6327,"id":null,"parameterSlots":1,"returnSlots":1},"validator_revert_address":{"entryPoint":5837,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:15025:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"345:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"355:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"375:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"369:5:111"},"nodeType":"YulFunctionCall","src":"369:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"359:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"397:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"402:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"390:6:111"},"nodeType":"YulFunctionCall","src":"390:19:111"},"nodeType":"YulExpressionStatement","src":"390:19:111"},{"nodeType":"YulVariableDeclaration","src":"418:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"427:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"422:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"489:110:111","statements":[{"nodeType":"YulVariableDeclaration","src":"503:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"513:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"507:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"545:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"550:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"541:3:111"},"nodeType":"YulFunctionCall","src":"541:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"554:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"537:3:111"},"nodeType":"YulFunctionCall","src":"537:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"573:5:111"},{"name":"i","nodeType":"YulIdentifier","src":"580:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"569:3:111"},"nodeType":"YulFunctionCall","src":"569:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"584:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"565:3:111"},"nodeType":"YulFunctionCall","src":"565:22:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"559:5:111"},"nodeType":"YulFunctionCall","src":"559:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"530:6:111"},"nodeType":"YulFunctionCall","src":"530:59:111"},"nodeType":"YulExpressionStatement","src":"530:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"448:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"451:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"445:2:111"},"nodeType":"YulFunctionCall","src":"445:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"459:21:111","statements":[{"nodeType":"YulAssignment","src":"461:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"470:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"473:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"466:3:111"},"nodeType":"YulFunctionCall","src":"466:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"461:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"441:3:111","statements":[]},"src":"437:162:111"},{"body":{"nodeType":"YulBlock","src":"633:62:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"662:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"667:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"658:3:111"},"nodeType":"YulFunctionCall","src":"658:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"676:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"654:3:111"},"nodeType":"YulFunctionCall","src":"654:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"683:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"647:6:111"},"nodeType":"YulFunctionCall","src":"647:38:111"},"nodeType":"YulExpressionStatement","src":"647:38:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"614:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"617:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"611:2:111"},"nodeType":"YulFunctionCall","src":"611:13:111"},"nodeType":"YulIf","src":"608:87:111"},{"nodeType":"YulAssignment","src":"704:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"719:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"732:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"740:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"728:3:111"},"nodeType":"YulFunctionCall","src":"728:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"745:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"724:3:111"},"nodeType":"YulFunctionCall","src":"724:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"715:3:111"},"nodeType":"YulFunctionCall","src":"715:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"815:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"711:3:111"},"nodeType":"YulFunctionCall","src":"711:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"704:3:111"}]}]},"name":"abi_encode_string","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"322:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"329:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"337:3:111","type":""}],"src":"295:531:111"},{"body":{"nodeType":"YulBlock","src":"952:99:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"969:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"980:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"962:6:111"},"nodeType":"YulFunctionCall","src":"962:21:111"},"nodeType":"YulExpressionStatement","src":"962:21:111"},{"nodeType":"YulAssignment","src":"992:53:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1018:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1030:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1041:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1026:3:111"},"nodeType":"YulFunctionCall","src":"1026:18:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"1000:17:111"},"nodeType":"YulFunctionCall","src":"1000:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"992:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"921:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"932:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"943:4:111","type":""}],"src":"831:220:111"},{"body":{"nodeType":"YulBlock","src":"1101:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"1188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1190:6:111"},"nodeType":"YulFunctionCall","src":"1190:12:111"},"nodeType":"YulExpressionStatement","src":"1190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1131:3:111"},"nodeType":"YulFunctionCall","src":"1131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1121:2:111"},"nodeType":"YulFunctionCall","src":"1121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1114:6:111"},"nodeType":"YulFunctionCall","src":"1114:73:111"},"nodeType":"YulIf","src":"1111:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"1090:5:111","type":""}],"src":"1056:154:111"},{"body":{"nodeType":"YulBlock","src":"1302:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"1348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1350:6:111"},"nodeType":"YulFunctionCall","src":"1350:12:111"},"nodeType":"YulExpressionStatement","src":"1350:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1323:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1332:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1319:3:111"},"nodeType":"YulFunctionCall","src":"1319:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1344:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1315:3:111"},"nodeType":"YulFunctionCall","src":"1315:32:111"},"nodeType":"YulIf","src":"1312:52:111"},{"nodeType":"YulVariableDeclaration","src":"1373:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1399:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1386:12:111"},"nodeType":"YulFunctionCall","src":"1386:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1377:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1443:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1418:24:111"},"nodeType":"YulFunctionCall","src":"1418:31:111"},"nodeType":"YulExpressionStatement","src":"1418:31:111"},{"nodeType":"YulAssignment","src":"1458:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1468:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1458:6:111"}]},{"nodeType":"YulAssignment","src":"1482:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1520:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1505:3:111"},"nodeType":"YulFunctionCall","src":"1505:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1492:12:111"},"nodeType":"YulFunctionCall","src":"1492:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1482:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1260:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1271:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1283:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1291:6:111","type":""}],"src":"1215:315:111"},{"body":{"nodeType":"YulBlock","src":"1630:92:111","statements":[{"nodeType":"YulAssignment","src":"1640:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1652:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1663:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1648:3:111"},"nodeType":"YulFunctionCall","src":"1648:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1640:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1682:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1707:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1700:6:111"},"nodeType":"YulFunctionCall","src":"1700:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1693:6:111"},"nodeType":"YulFunctionCall","src":"1693:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1675:6:111"},"nodeType":"YulFunctionCall","src":"1675:41:111"},"nodeType":"YulExpressionStatement","src":"1675:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1599:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1610:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1621:4:111","type":""}],"src":"1535:187:111"},{"body":{"nodeType":"YulBlock","src":"1828:76:111","statements":[{"nodeType":"YulAssignment","src":"1838:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1850:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1861:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1846:3:111"},"nodeType":"YulFunctionCall","src":"1846:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1838:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1880:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1891:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1873:6:111"},"nodeType":"YulFunctionCall","src":"1873:25:111"},"nodeType":"YulExpressionStatement","src":"1873:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1797:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1808:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1819:4:111","type":""}],"src":"1727:177:111"},{"body":{"nodeType":"YulBlock","src":"2004:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"2050:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2059:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2062:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2052:6:111"},"nodeType":"YulFunctionCall","src":"2052:12:111"},"nodeType":"YulExpressionStatement","src":"2052:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2025:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2034:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2021:3:111"},"nodeType":"YulFunctionCall","src":"2021:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2046:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2017:3:111"},"nodeType":"YulFunctionCall","src":"2017:32:111"},"nodeType":"YulIf","src":"2014:52:111"},{"nodeType":"YulVariableDeclaration","src":"2075:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2101:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2088:12:111"},"nodeType":"YulFunctionCall","src":"2088:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2079:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2145:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2120:24:111"},"nodeType":"YulFunctionCall","src":"2120:31:111"},"nodeType":"YulExpressionStatement","src":"2120:31:111"},{"nodeType":"YulAssignment","src":"2160:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2170:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2160:6:111"}]},{"nodeType":"YulAssignment","src":"2184:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2211:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2222:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2207:3:111"},"nodeType":"YulFunctionCall","src":"2207:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2194:12:111"},"nodeType":"YulFunctionCall","src":"2194:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2184:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1962:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1973:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1985:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1993:6:111","type":""}],"src":"1909:323:111"},{"body":{"nodeType":"YulBlock","src":"2341:352:111","statements":[{"body":{"nodeType":"YulBlock","src":"2387:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2396:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2399:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2389:6:111"},"nodeType":"YulFunctionCall","src":"2389:12:111"},"nodeType":"YulExpressionStatement","src":"2389:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2362:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2371:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2358:3:111"},"nodeType":"YulFunctionCall","src":"2358:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2383:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2354:3:111"},"nodeType":"YulFunctionCall","src":"2354:32:111"},"nodeType":"YulIf","src":"2351:52:111"},{"nodeType":"YulVariableDeclaration","src":"2412:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2438:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2425:12:111"},"nodeType":"YulFunctionCall","src":"2425:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2416:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2482:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2457:24:111"},"nodeType":"YulFunctionCall","src":"2457:31:111"},"nodeType":"YulExpressionStatement","src":"2457:31:111"},{"nodeType":"YulAssignment","src":"2497:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2507:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2497:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2521:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2564:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2549:3:111"},"nodeType":"YulFunctionCall","src":"2549:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2536:12:111"},"nodeType":"YulFunctionCall","src":"2536:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2525:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2602:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2577:24:111"},"nodeType":"YulFunctionCall","src":"2577:33:111"},"nodeType":"YulExpressionStatement","src":"2577:33:111"},{"nodeType":"YulAssignment","src":"2619:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2629:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2619:6:111"}]},{"nodeType":"YulAssignment","src":"2645:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2683:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2668:3:111"},"nodeType":"YulFunctionCall","src":"2668:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2655:12:111"},"nodeType":"YulFunctionCall","src":"2655:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2645:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2291:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2302:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2314:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2322:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2330:6:111","type":""}],"src":"2237:456:111"},{"body":{"nodeType":"YulBlock","src":"2795:87:111","statements":[{"nodeType":"YulAssignment","src":"2805:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2817:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2828:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2813:3:111"},"nodeType":"YulFunctionCall","src":"2813:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2805:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2847:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2862:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2870:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2858:3:111"},"nodeType":"YulFunctionCall","src":"2858:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2840:6:111"},"nodeType":"YulFunctionCall","src":"2840:36:111"},"nodeType":"YulExpressionStatement","src":"2840:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2764:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2775:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2786:4:111","type":""}],"src":"2698:184:111"},{"body":{"nodeType":"YulBlock","src":"2957:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"3003:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3012:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3015:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3005:6:111"},"nodeType":"YulFunctionCall","src":"3005:12:111"},"nodeType":"YulExpressionStatement","src":"3005:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2978:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2987:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2974:3:111"},"nodeType":"YulFunctionCall","src":"2974:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2999:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2970:3:111"},"nodeType":"YulFunctionCall","src":"2970:32:111"},"nodeType":"YulIf","src":"2967:52:111"},{"nodeType":"YulVariableDeclaration","src":"3028:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3054:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3041:12:111"},"nodeType":"YulFunctionCall","src":"3041:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3032:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3098:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"3073:24:111"},"nodeType":"YulFunctionCall","src":"3073:31:111"},"nodeType":"YulExpressionStatement","src":"3073:31:111"},{"nodeType":"YulAssignment","src":"3113:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3123:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3113:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2923:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2934:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2946:6:111","type":""}],"src":"2887:247:111"},{"body":{"nodeType":"YulBlock","src":"3240:125:111","statements":[{"nodeType":"YulAssignment","src":"3250:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3262:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3273:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3258:3:111"},"nodeType":"YulFunctionCall","src":"3258:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3250:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3292:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3307:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3315:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3303:3:111"},"nodeType":"YulFunctionCall","src":"3303:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3285:6:111"},"nodeType":"YulFunctionCall","src":"3285:74:111"},"nodeType":"YulExpressionStatement","src":"3285:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3209:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3220:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3231:4:111","type":""}],"src":"3139:226:111"},{"body":{"nodeType":"YulBlock","src":"3509:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"3555:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3564:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3567:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3557:6:111"},"nodeType":"YulFunctionCall","src":"3557:12:111"},"nodeType":"YulExpressionStatement","src":"3557:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3530:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3539:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3526:3:111"},"nodeType":"YulFunctionCall","src":"3526:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3551:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3522:3:111"},"nodeType":"YulFunctionCall","src":"3522:32:111"},"nodeType":"YulIf","src":"3519:52:111"},{"nodeType":"YulVariableDeclaration","src":"3580:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3606:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3593:12:111"},"nodeType":"YulFunctionCall","src":"3593:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3584:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3649:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3658:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3661:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3651:6:111"},"nodeType":"YulFunctionCall","src":"3651:12:111"},"nodeType":"YulExpressionStatement","src":"3651:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3638:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3645:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3635:2:111"},"nodeType":"YulFunctionCall","src":"3635:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3628:6:111"},"nodeType":"YulFunctionCall","src":"3628:20:111"},"nodeType":"YulIf","src":"3625:40:111"},{"nodeType":"YulAssignment","src":"3674:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3684:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3674:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3698:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3729:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3740:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3725:3:111"},"nodeType":"YulFunctionCall","src":"3725:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3712:12:111"},"nodeType":"YulFunctionCall","src":"3712:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3702:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3753:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3763:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3757:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3808:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3817:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3820:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3810:6:111"},"nodeType":"YulFunctionCall","src":"3810:12:111"},"nodeType":"YulExpressionStatement","src":"3810:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3796:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3804:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3793:2:111"},"nodeType":"YulFunctionCall","src":"3793:14:111"},"nodeType":"YulIf","src":"3790:34:111"},{"nodeType":"YulVariableDeclaration","src":"3833:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3847:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3858:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3843:3:111"},"nodeType":"YulFunctionCall","src":"3843:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3837:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3913:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3922:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3925:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3915:6:111"},"nodeType":"YulFunctionCall","src":"3915:12:111"},"nodeType":"YulExpressionStatement","src":"3915:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3892:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3896:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3888:3:111"},"nodeType":"YulFunctionCall","src":"3888:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3903:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3884:3:111"},"nodeType":"YulFunctionCall","src":"3884:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3877:6:111"},"nodeType":"YulFunctionCall","src":"3877:35:111"},"nodeType":"YulIf","src":"3874:55:111"},{"nodeType":"YulVariableDeclaration","src":"3938:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3965:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3952:12:111"},"nodeType":"YulFunctionCall","src":"3952:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3942:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3995:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4004:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4007:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3997:6:111"},"nodeType":"YulFunctionCall","src":"3997:12:111"},"nodeType":"YulExpressionStatement","src":"3997:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3983:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3991:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3980:2:111"},"nodeType":"YulFunctionCall","src":"3980:14:111"},"nodeType":"YulIf","src":"3977:34:111"},{"body":{"nodeType":"YulBlock","src":"4061:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4070:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4073:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4063:6:111"},"nodeType":"YulFunctionCall","src":"4063:12:111"},"nodeType":"YulExpressionStatement","src":"4063:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4034:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"4038:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4030:3:111"},"nodeType":"YulFunctionCall","src":"4030:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"4047:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4026:3:111"},"nodeType":"YulFunctionCall","src":"4026:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4052:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4023:2:111"},"nodeType":"YulFunctionCall","src":"4023:37:111"},"nodeType":"YulIf","src":"4020:57:111"},{"nodeType":"YulAssignment","src":"4086:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4100:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4104:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4096:3:111"},"nodeType":"YulFunctionCall","src":"4096:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4086:6:111"}]},{"nodeType":"YulAssignment","src":"4116:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"4126:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4116:6:111"}]},{"nodeType":"YulAssignment","src":"4141:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4179:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4164:3:111"},"nodeType":"YulFunctionCall","src":"4164:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4151:12:111"},"nodeType":"YulFunctionCall","src":"4151:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4141:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3451:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3462:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3474:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3482:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3490:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3498:6:111","type":""}],"src":"3370:819:111"},{"body":{"nodeType":"YulBlock","src":"4316:125:111","statements":[{"nodeType":"YulAssignment","src":"4326:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4338:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4349:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4334:3:111"},"nodeType":"YulFunctionCall","src":"4334:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4326:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4368:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4383:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4391:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4379:3:111"},"nodeType":"YulFunctionCall","src":"4379:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4361:6:111"},"nodeType":"YulFunctionCall","src":"4361:74:111"},"nodeType":"YulExpressionStatement","src":"4361:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4285:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4296:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4307:4:111","type":""}],"src":"4194:247:111"},{"body":{"nodeType":"YulBlock","src":"4524:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4570:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4579:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4582:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4572:6:111"},"nodeType":"YulFunctionCall","src":"4572:12:111"},"nodeType":"YulExpressionStatement","src":"4572:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4545:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4554:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4541:3:111"},"nodeType":"YulFunctionCall","src":"4541:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4566:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4537:3:111"},"nodeType":"YulFunctionCall","src":"4537:32:111"},"nodeType":"YulIf","src":"4534:52:111"},{"nodeType":"YulVariableDeclaration","src":"4595:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4621:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4608:12:111"},"nodeType":"YulFunctionCall","src":"4608:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4599:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4665:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4640:24:111"},"nodeType":"YulFunctionCall","src":"4640:31:111"},"nodeType":"YulExpressionStatement","src":"4640:31:111"},{"nodeType":"YulAssignment","src":"4680:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4690:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4680:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4490:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4501:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4513:6:111","type":""}],"src":"4446:255:111"},{"body":{"nodeType":"YulBlock","src":"4793:301:111","statements":[{"body":{"nodeType":"YulBlock","src":"4839:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4848:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4851:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4841:6:111"},"nodeType":"YulFunctionCall","src":"4841:12:111"},"nodeType":"YulExpressionStatement","src":"4841:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4814:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4823:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4810:3:111"},"nodeType":"YulFunctionCall","src":"4810:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4835:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4806:3:111"},"nodeType":"YulFunctionCall","src":"4806:32:111"},"nodeType":"YulIf","src":"4803:52:111"},{"nodeType":"YulVariableDeclaration","src":"4864:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4890:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4877:12:111"},"nodeType":"YulFunctionCall","src":"4877:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4868:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4934:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4909:24:111"},"nodeType":"YulFunctionCall","src":"4909:31:111"},"nodeType":"YulExpressionStatement","src":"4909:31:111"},{"nodeType":"YulAssignment","src":"4949:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4959:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4949:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4973:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5005:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5016:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5001:3:111"},"nodeType":"YulFunctionCall","src":"5001:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4988:12:111"},"nodeType":"YulFunctionCall","src":"4988:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"4977:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"5054:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"5029:24:111"},"nodeType":"YulFunctionCall","src":"5029:33:111"},"nodeType":"YulExpressionStatement","src":"5029:33:111"},{"nodeType":"YulAssignment","src":"5071:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"5081:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5071:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4751:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4762:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4774:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4782:6:111","type":""}],"src":"4706:388:111"},{"body":{"nodeType":"YulBlock","src":"5237:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5283:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5292:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5295:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5285:6:111"},"nodeType":"YulFunctionCall","src":"5285:12:111"},"nodeType":"YulExpressionStatement","src":"5285:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5258:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5267:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5254:3:111"},"nodeType":"YulFunctionCall","src":"5254:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5279:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5250:3:111"},"nodeType":"YulFunctionCall","src":"5250:32:111"},"nodeType":"YulIf","src":"5247:52:111"},{"nodeType":"YulVariableDeclaration","src":"5308:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5335:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5322:12:111"},"nodeType":"YulFunctionCall","src":"5322:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5312:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5388:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5397:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5400:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5390:6:111"},"nodeType":"YulFunctionCall","src":"5390:12:111"},"nodeType":"YulExpressionStatement","src":"5390:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5360:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5368:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5357:2:111"},"nodeType":"YulFunctionCall","src":"5357:30:111"},"nodeType":"YulIf","src":"5354:50:111"},{"nodeType":"YulVariableDeclaration","src":"5413:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5427:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5438:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5423:3:111"},"nodeType":"YulFunctionCall","src":"5423:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5417:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5484:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5493:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5496:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5486:6:111"},"nodeType":"YulFunctionCall","src":"5486:12:111"},"nodeType":"YulExpressionStatement","src":"5486:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5465:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5474:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5461:3:111"},"nodeType":"YulFunctionCall","src":"5461:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5479:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5457:3:111"},"nodeType":"YulFunctionCall","src":"5457:26:111"},"nodeType":"YulIf","src":"5454:46:111"},{"nodeType":"YulAssignment","src":"5509:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5519:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5509:6:111"}]},{"nodeType":"YulAssignment","src":"5530:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5557:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5568:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5553:3:111"},"nodeType":"YulFunctionCall","src":"5553:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5540:12:111"},"nodeType":"YulFunctionCall","src":"5540:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5530:6:111"}]},{"nodeType":"YulAssignment","src":"5581:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5608:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5619:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5604:3:111"},"nodeType":"YulFunctionCall","src":"5604:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5591:12:111"},"nodeType":"YulFunctionCall","src":"5591:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5581:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5187:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5198:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5210:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5218:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5226:6:111","type":""}],"src":"5099:530:111"},{"body":{"nodeType":"YulBlock","src":"5781:142:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5809:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5791:6:111"},"nodeType":"YulFunctionCall","src":"5791:21:111"},"nodeType":"YulExpressionStatement","src":"5791:21:111"},{"nodeType":"YulAssignment","src":"5821:53:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5847:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5859:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5870:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5855:3:111"},"nodeType":"YulFunctionCall","src":"5855:18:111"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"5829:17:111"},"nodeType":"YulFunctionCall","src":"5829:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5821:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5894:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5905:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5890:3:111"},"nodeType":"YulFunctionCall","src":"5890:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"5910:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5883:6:111"},"nodeType":"YulFunctionCall","src":"5883:34:111"},"nodeType":"YulExpressionStatement","src":"5883:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5742:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5753:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5761:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5772:4:111","type":""}],"src":"5634:289:111"},{"body":{"nodeType":"YulBlock","src":"6027:93:111","statements":[{"nodeType":"YulAssignment","src":"6037:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6049:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6060:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6045:3:111"},"nodeType":"YulFunctionCall","src":"6045:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6037:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6079:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6094:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6102:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6090:3:111"},"nodeType":"YulFunctionCall","src":"6090:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6072:6:111"},"nodeType":"YulFunctionCall","src":"6072:42:111"},"nodeType":"YulExpressionStatement","src":"6072:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5996:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6007:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6018:4:111","type":""}],"src":"5928:192:111"},{"body":{"nodeType":"YulBlock","src":"6180:382:111","statements":[{"nodeType":"YulAssignment","src":"6190:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6204:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"6207:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"6200:3:111"},"nodeType":"YulFunctionCall","src":"6200:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"6190:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6221:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"6251:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"6257:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6247:3:111"},"nodeType":"YulFunctionCall","src":"6247:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"6225:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6298:31:111","statements":[{"nodeType":"YulAssignment","src":"6300:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6314:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6322:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6310:3:111"},"nodeType":"YulFunctionCall","src":"6310:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"6300:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"6278:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6271:6:111"},"nodeType":"YulFunctionCall","src":"6271:26:111"},"nodeType":"YulIf","src":"6268:61:111"},{"body":{"nodeType":"YulBlock","src":"6388:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6409:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6412:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6402:6:111"},"nodeType":"YulFunctionCall","src":"6402:88:111"},"nodeType":"YulExpressionStatement","src":"6402:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6510:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6513:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6503:6:111"},"nodeType":"YulFunctionCall","src":"6503:15:111"},"nodeType":"YulExpressionStatement","src":"6503:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6538:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6541:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6531:6:111"},"nodeType":"YulFunctionCall","src":"6531:15:111"},"nodeType":"YulExpressionStatement","src":"6531:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"6344:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6367:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6375:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6364:2:111"},"nodeType":"YulFunctionCall","src":"6364:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"6341:2:111"},"nodeType":"YulFunctionCall","src":"6341:38:111"},"nodeType":"YulIf","src":"6338:218:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"6160:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"6169:6:111","type":""}],"src":"6125:437:111"},{"body":{"nodeType":"YulBlock","src":"6712:168:111","statements":[{"nodeType":"YulAssignment","src":"6722:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6745:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6730:3:111"},"nodeType":"YulFunctionCall","src":"6730:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6722:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6764:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6779:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6787:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6775:3:111"},"nodeType":"YulFunctionCall","src":"6775:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6757:6:111"},"nodeType":"YulFunctionCall","src":"6757:74:111"},"nodeType":"YulExpressionStatement","src":"6757:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6851:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6862:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6847:3:111"},"nodeType":"YulFunctionCall","src":"6847:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6867:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6840:6:111"},"nodeType":"YulFunctionCall","src":"6840:34:111"},"nodeType":"YulExpressionStatement","src":"6840:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6673:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6684:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6692:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6703:4:111","type":""}],"src":"6567:313:111"},{"body":{"nodeType":"YulBlock","src":"6933:234:111","statements":[{"body":{"nodeType":"YulBlock","src":"6968:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6989:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6992:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6982:6:111"},"nodeType":"YulFunctionCall","src":"6982:88:111"},"nodeType":"YulExpressionStatement","src":"6982:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7090:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"7093:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7083:6:111"},"nodeType":"YulFunctionCall","src":"7083:15:111"},"nodeType":"YulExpressionStatement","src":"7083:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7118:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7121:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7111:6:111"},"nodeType":"YulFunctionCall","src":"7111:15:111"},"nodeType":"YulExpressionStatement","src":"7111:15:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"6949:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"6956:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"6952:3:111"},"nodeType":"YulFunctionCall","src":"6952:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6946:2:111"},"nodeType":"YulFunctionCall","src":"6946:13:111"},"nodeType":"YulIf","src":"6943:193:111"},{"nodeType":"YulAssignment","src":"7145:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7156:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7159:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7152:3:111"},"nodeType":"YulFunctionCall","src":"7152:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"7145:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"6916:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"6919:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"6925:3:111","type":""}],"src":"6885:282:111"},{"body":{"nodeType":"YulBlock","src":"7346:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7363:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7374:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7356:6:111"},"nodeType":"YulFunctionCall","src":"7356:21:111"},"nodeType":"YulExpressionStatement","src":"7356:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7408:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7393:3:111"},"nodeType":"YulFunctionCall","src":"7393:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7413:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7386:6:111"},"nodeType":"YulFunctionCall","src":"7386:30:111"},"nodeType":"YulExpressionStatement","src":"7386:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7436:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7447:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7432:3:111"},"nodeType":"YulFunctionCall","src":"7432:18:111"},{"hexValue":"45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77","kind":"string","nodeType":"YulLiteral","src":"7452:34:111","type":"","value":"ERC20: decreased allowance below"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7425:6:111"},"nodeType":"YulFunctionCall","src":"7425:62:111"},"nodeType":"YulExpressionStatement","src":"7425:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7507:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7518:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7503:3:111"},"nodeType":"YulFunctionCall","src":"7503:18:111"},{"hexValue":"207a65726f","kind":"string","nodeType":"YulLiteral","src":"7523:7:111","type":"","value":" zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7496:6:111"},"nodeType":"YulFunctionCall","src":"7496:35:111"},"nodeType":"YulExpressionStatement","src":"7496:35:111"},{"nodeType":"YulAssignment","src":"7540:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7563:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7548:3:111"},"nodeType":"YulFunctionCall","src":"7548:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7540:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7323:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7337:4:111","type":""}],"src":"7172:401:111"},{"body":{"nodeType":"YulBlock","src":"7695:125:111","statements":[{"nodeType":"YulAssignment","src":"7705:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7717:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7728:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7713:3:111"},"nodeType":"YulFunctionCall","src":"7713:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7705:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7747:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7762:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7770:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7758:3:111"},"nodeType":"YulFunctionCall","src":"7758:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7740:6:111"},"nodeType":"YulFunctionCall","src":"7740:74:111"},"nodeType":"YulExpressionStatement","src":"7740:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7664:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7675:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7686:4:111","type":""}],"src":"7578:242:111"},{"body":{"nodeType":"YulBlock","src":"7906:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"7952:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7961:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7964:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7954:6:111"},"nodeType":"YulFunctionCall","src":"7954:12:111"},"nodeType":"YulExpressionStatement","src":"7954:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7927:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7936:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7923:3:111"},"nodeType":"YulFunctionCall","src":"7923:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7948:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7919:3:111"},"nodeType":"YulFunctionCall","src":"7919:32:111"},"nodeType":"YulIf","src":"7916:52:111"},{"nodeType":"YulAssignment","src":"7977:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7993:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7987:5:111"},"nodeType":"YulFunctionCall","src":"7987:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7977:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7872:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7883:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7895:6:111","type":""}],"src":"7825:184:111"},{"body":{"nodeType":"YulBlock","src":"8188:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8216:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8198:6:111"},"nodeType":"YulFunctionCall","src":"8198:21:111"},"nodeType":"YulExpressionStatement","src":"8198:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8239:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8250:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8235:3:111"},"nodeType":"YulFunctionCall","src":"8235:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8255:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8228:6:111"},"nodeType":"YulFunctionCall","src":"8228:30:111"},"nodeType":"YulExpressionStatement","src":"8228:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8278:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8289:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8274:3:111"},"nodeType":"YulFunctionCall","src":"8274:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"8294:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8267:6:111"},"nodeType":"YulFunctionCall","src":"8267:62:111"},"nodeType":"YulExpressionStatement","src":"8267:62:111"},{"nodeType":"YulAssignment","src":"8338:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8361:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8346:3:111"},"nodeType":"YulFunctionCall","src":"8346:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8338:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8165:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8179:4:111","type":""}],"src":"8014:356:111"},{"body":{"nodeType":"YulBlock","src":"8549:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8577:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8559:6:111"},"nodeType":"YulFunctionCall","src":"8559:21:111"},"nodeType":"YulExpressionStatement","src":"8559:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8611:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8596:3:111"},"nodeType":"YulFunctionCall","src":"8596:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8616:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8589:6:111"},"nodeType":"YulFunctionCall","src":"8589:30:111"},"nodeType":"YulExpressionStatement","src":"8589:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8650:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8635:3:111"},"nodeType":"YulFunctionCall","src":"8635:18:111"},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f20616464","kind":"string","nodeType":"YulLiteral","src":"8655:34:111","type":"","value":"ERC20: approve from the zero add"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8628:6:111"},"nodeType":"YulFunctionCall","src":"8628:62:111"},"nodeType":"YulExpressionStatement","src":"8628:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8721:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8706:3:111"},"nodeType":"YulFunctionCall","src":"8706:18:111"},{"hexValue":"72657373","kind":"string","nodeType":"YulLiteral","src":"8726:6:111","type":"","value":"ress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8699:6:111"},"nodeType":"YulFunctionCall","src":"8699:34:111"},"nodeType":"YulExpressionStatement","src":"8699:34:111"},{"nodeType":"YulAssignment","src":"8742:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8754:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8765:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8750:3:111"},"nodeType":"YulFunctionCall","src":"8750:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8742:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8526:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8540:4:111","type":""}],"src":"8375:400:111"},{"body":{"nodeType":"YulBlock","src":"8954:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8971:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8982:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8964:6:111"},"nodeType":"YulFunctionCall","src":"8964:21:111"},"nodeType":"YulExpressionStatement","src":"8964:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9005:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9016:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9001:3:111"},"nodeType":"YulFunctionCall","src":"9001:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9021:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8994:6:111"},"nodeType":"YulFunctionCall","src":"8994:30:111"},"nodeType":"YulExpressionStatement","src":"8994:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9044:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9055:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9040:3:111"},"nodeType":"YulFunctionCall","src":"9040:18:111"},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f206164647265","kind":"string","nodeType":"YulLiteral","src":"9060:34:111","type":"","value":"ERC20: approve to the zero addre"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9033:6:111"},"nodeType":"YulFunctionCall","src":"9033:62:111"},"nodeType":"YulExpressionStatement","src":"9033:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9115:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9126:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9111:3:111"},"nodeType":"YulFunctionCall","src":"9111:18:111"},{"hexValue":"7373","kind":"string","nodeType":"YulLiteral","src":"9131:4:111","type":"","value":"ss"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9104:6:111"},"nodeType":"YulFunctionCall","src":"9104:32:111"},"nodeType":"YulExpressionStatement","src":"9104:32:111"},{"nodeType":"YulAssignment","src":"9145:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9157:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9168:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9153:3:111"},"nodeType":"YulFunctionCall","src":"9153:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9145:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8931:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8945:4:111","type":""}],"src":"8780:398:111"},{"body":{"nodeType":"YulBlock","src":"9357:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9374:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9385:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9367:6:111"},"nodeType":"YulFunctionCall","src":"9367:21:111"},"nodeType":"YulExpressionStatement","src":"9367:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9408:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9419:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9404:3:111"},"nodeType":"YulFunctionCall","src":"9404:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9424:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9397:6:111"},"nodeType":"YulFunctionCall","src":"9397:30:111"},"nodeType":"YulExpressionStatement","src":"9397:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9458:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9443:3:111"},"nodeType":"YulFunctionCall","src":"9443:18:111"},{"hexValue":"45524332303a20696e73756666696369656e7420616c6c6f77616e6365","kind":"string","nodeType":"YulLiteral","src":"9463:31:111","type":"","value":"ERC20: insufficient allowance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9436:6:111"},"nodeType":"YulFunctionCall","src":"9436:59:111"},"nodeType":"YulExpressionStatement","src":"9436:59:111"},{"nodeType":"YulAssignment","src":"9504:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9516:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9527:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9512:3:111"},"nodeType":"YulFunctionCall","src":"9512:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9504:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9334:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9348:4:111","type":""}],"src":"9183:353:111"},{"body":{"nodeType":"YulBlock","src":"9715:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9732:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9743:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9725:6:111"},"nodeType":"YulFunctionCall","src":"9725:21:111"},"nodeType":"YulExpressionStatement","src":"9725:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9766:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9777:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9762:3:111"},"nodeType":"YulFunctionCall","src":"9762:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9782:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9755:6:111"},"nodeType":"YulFunctionCall","src":"9755:30:111"},"nodeType":"YulExpressionStatement","src":"9755:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9805:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9816:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9801:3:111"},"nodeType":"YulFunctionCall","src":"9801:18:111"},{"hexValue":"45524332303a207472616e736665722066726f6d20746865207a65726f206164","kind":"string","nodeType":"YulLiteral","src":"9821:34:111","type":"","value":"ERC20: transfer from the zero ad"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9794:6:111"},"nodeType":"YulFunctionCall","src":"9794:62:111"},"nodeType":"YulExpressionStatement","src":"9794:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9876:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9887:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9872:3:111"},"nodeType":"YulFunctionCall","src":"9872:18:111"},{"hexValue":"6472657373","kind":"string","nodeType":"YulLiteral","src":"9892:7:111","type":"","value":"dress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9865:6:111"},"nodeType":"YulFunctionCall","src":"9865:35:111"},"nodeType":"YulExpressionStatement","src":"9865:35:111"},{"nodeType":"YulAssignment","src":"9909:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9932:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9917:3:111"},"nodeType":"YulFunctionCall","src":"9917:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9909:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9692:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9706:4:111","type":""}],"src":"9541:401:111"},{"body":{"nodeType":"YulBlock","src":"10121:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10138:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10149:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10131:6:111"},"nodeType":"YulFunctionCall","src":"10131:21:111"},"nodeType":"YulExpressionStatement","src":"10131:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10183:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10168:3:111"},"nodeType":"YulFunctionCall","src":"10168:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10188:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10161:6:111"},"nodeType":"YulFunctionCall","src":"10161:30:111"},"nodeType":"YulExpressionStatement","src":"10161:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10211:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10222:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10207:3:111"},"nodeType":"YulFunctionCall","src":"10207:18:111"},{"hexValue":"45524332303a207472616e7366657220746f20746865207a65726f2061646472","kind":"string","nodeType":"YulLiteral","src":"10227:34:111","type":"","value":"ERC20: transfer to the zero addr"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10200:6:111"},"nodeType":"YulFunctionCall","src":"10200:62:111"},"nodeType":"YulExpressionStatement","src":"10200:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10282:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10293:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10278:3:111"},"nodeType":"YulFunctionCall","src":"10278:18:111"},{"hexValue":"657373","kind":"string","nodeType":"YulLiteral","src":"10298:5:111","type":"","value":"ess"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10271:6:111"},"nodeType":"YulFunctionCall","src":"10271:33:111"},"nodeType":"YulExpressionStatement","src":"10271:33:111"},{"nodeType":"YulAssignment","src":"10313:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10336:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10321:3:111"},"nodeType":"YulFunctionCall","src":"10321:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10313:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10098:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10112:4:111","type":""}],"src":"9947:399:111"},{"body":{"nodeType":"YulBlock","src":"10525:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10542:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10553:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10535:6:111"},"nodeType":"YulFunctionCall","src":"10535:21:111"},"nodeType":"YulExpressionStatement","src":"10535:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10587:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10572:3:111"},"nodeType":"YulFunctionCall","src":"10572:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10592:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10565:6:111"},"nodeType":"YulFunctionCall","src":"10565:30:111"},"nodeType":"YulExpressionStatement","src":"10565:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10615:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10626:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10611:3:111"},"nodeType":"YulFunctionCall","src":"10611:18:111"},{"hexValue":"45524332303a207472616e7366657220616d6f756e7420657863656564732062","kind":"string","nodeType":"YulLiteral","src":"10631:34:111","type":"","value":"ERC20: transfer amount exceeds b"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10604:6:111"},"nodeType":"YulFunctionCall","src":"10604:62:111"},"nodeType":"YulExpressionStatement","src":"10604:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10686:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10697:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10682:3:111"},"nodeType":"YulFunctionCall","src":"10682:18:111"},{"hexValue":"616c616e6365","kind":"string","nodeType":"YulLiteral","src":"10702:8:111","type":"","value":"alance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10675:6:111"},"nodeType":"YulFunctionCall","src":"10675:36:111"},"nodeType":"YulExpressionStatement","src":"10675:36:111"},{"nodeType":"YulAssignment","src":"10720:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10732:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10743:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10728:3:111"},"nodeType":"YulFunctionCall","src":"10728:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10720:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10502:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10516:4:111","type":""}],"src":"10351:402:111"},{"body":{"nodeType":"YulBlock","src":"10932:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10949:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10960:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10942:6:111"},"nodeType":"YulFunctionCall","src":"10942:21:111"},"nodeType":"YulExpressionStatement","src":"10942:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10983:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10994:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10979:3:111"},"nodeType":"YulFunctionCall","src":"10979:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10999:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10972:6:111"},"nodeType":"YulFunctionCall","src":"10972:30:111"},"nodeType":"YulExpressionStatement","src":"10972:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11022:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11033:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11018:3:111"},"nodeType":"YulFunctionCall","src":"11018:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"11038:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11011:6:111"},"nodeType":"YulFunctionCall","src":"11011:51:111"},"nodeType":"YulExpressionStatement","src":"11011:51:111"},{"nodeType":"YulAssignment","src":"11071:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11083:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11094:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11079:3:111"},"nodeType":"YulFunctionCall","src":"11079:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11071:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10909:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10923:4:111","type":""}],"src":"10758:345:111"},{"body":{"nodeType":"YulBlock","src":"11282:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11299:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11310:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11292:6:111"},"nodeType":"YulFunctionCall","src":"11292:21:111"},"nodeType":"YulExpressionStatement","src":"11292:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11333:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11344:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11329:3:111"},"nodeType":"YulFunctionCall","src":"11329:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11349:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11322:6:111"},"nodeType":"YulFunctionCall","src":"11322:30:111"},"nodeType":"YulExpressionStatement","src":"11322:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11372:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11383:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11368:3:111"},"nodeType":"YulFunctionCall","src":"11368:18:111"},{"hexValue":"45524332303a206d696e7420746f20746865207a65726f2061646472657373","kind":"string","nodeType":"YulLiteral","src":"11388:33:111","type":"","value":"ERC20: mint to the zero address"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11361:6:111"},"nodeType":"YulFunctionCall","src":"11361:61:111"},"nodeType":"YulExpressionStatement","src":"11361:61:111"},{"nodeType":"YulAssignment","src":"11431:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11443:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11454:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11439:3:111"},"nodeType":"YulFunctionCall","src":"11439:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11431:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11259:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11273:4:111","type":""}],"src":"11108:355:111"},{"body":{"nodeType":"YulBlock","src":"11642:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11659:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11670:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11652:6:111"},"nodeType":"YulFunctionCall","src":"11652:21:111"},"nodeType":"YulExpressionStatement","src":"11652:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11693:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11704:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11689:3:111"},"nodeType":"YulFunctionCall","src":"11689:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11709:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11682:6:111"},"nodeType":"YulFunctionCall","src":"11682:30:111"},"nodeType":"YulExpressionStatement","src":"11682:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11732:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11743:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11728:3:111"},"nodeType":"YulFunctionCall","src":"11728:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"11748:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11721:6:111"},"nodeType":"YulFunctionCall","src":"11721:62:111"},"nodeType":"YulExpressionStatement","src":"11721:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11803:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11814:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11799:3:111"},"nodeType":"YulFunctionCall","src":"11799:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"11819:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11792:6:111"},"nodeType":"YulFunctionCall","src":"11792:36:111"},"nodeType":"YulExpressionStatement","src":"11792:36:111"},{"nodeType":"YulAssignment","src":"11837:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11849:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11860:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11845:3:111"},"nodeType":"YulFunctionCall","src":"11845:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11837:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11619:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11633:4:111","type":""}],"src":"11468:402:111"},{"body":{"nodeType":"YulBlock","src":"12049:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12077:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12059:6:111"},"nodeType":"YulFunctionCall","src":"12059:21:111"},"nodeType":"YulExpressionStatement","src":"12059:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12100:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12111:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12096:3:111"},"nodeType":"YulFunctionCall","src":"12096:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12116:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12089:6:111"},"nodeType":"YulFunctionCall","src":"12089:30:111"},"nodeType":"YulExpressionStatement","src":"12089:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12139:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12150:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12135:3:111"},"nodeType":"YulFunctionCall","src":"12135:18:111"},{"hexValue":"546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f7220","kind":"string","nodeType":"YulLiteral","src":"12155:34:111","type":"","value":"TokenPaymaster: gas too low for "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12128:6:111"},"nodeType":"YulFunctionCall","src":"12128:62:111"},"nodeType":"YulExpressionStatement","src":"12128:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12210:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12221:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12206:3:111"},"nodeType":"YulFunctionCall","src":"12206:18:111"},{"hexValue":"706f73744f70","kind":"string","nodeType":"YulLiteral","src":"12226:8:111","type":"","value":"postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12199:6:111"},"nodeType":"YulFunctionCall","src":"12199:36:111"},"nodeType":"YulExpressionStatement","src":"12199:36:111"},{"nodeType":"YulAssignment","src":"12244:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12256:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12267:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12252:3:111"},"nodeType":"YulFunctionCall","src":"12252:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12244:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e63029b4be8f7147d8fa8c7176417177721349d796aec4cd58131ce1ae4a4e98__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12026:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12040:4:111","type":""}],"src":"11875:402:111"},{"body":{"nodeType":"YulBlock","src":"12376:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12386:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"12425:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12412:12:111"},"nodeType":"YulFunctionCall","src":"12412:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"12390:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12585:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12594:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12597:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12587:6:111"},"nodeType":"YulFunctionCall","src":"12587:12:111"},"nodeType":"YulExpressionStatement","src":"12587:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12460:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12488:12:111"},"nodeType":"YulFunctionCall","src":"12488:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"12504:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12484:3:111"},"nodeType":"YulFunctionCall","src":"12484:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"12515:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12480:3:111"},"nodeType":"YulFunctionCall","src":"12480:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12456:3:111"},"nodeType":"YulFunctionCall","src":"12456:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12449:6:111"},"nodeType":"YulFunctionCall","src":"12449:135:111"},"nodeType":"YulIf","src":"12446:155:111"},{"nodeType":"YulVariableDeclaration","src":"12610:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"12628:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12638:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12624:3:111"},"nodeType":"YulFunctionCall","src":"12624:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"12614:6:111","type":""}]},{"nodeType":"YulAssignment","src":"12666:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12689:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12676:12:111"},"nodeType":"YulFunctionCall","src":"12676:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"12666:6:111"}]},{"body":{"nodeType":"YulBlock","src":"12739:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12748:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12751:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12741:6:111"},"nodeType":"YulFunctionCall","src":"12741:12:111"},"nodeType":"YulExpressionStatement","src":"12741:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"12711:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12719:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12708:2:111"},"nodeType":"YulFunctionCall","src":"12708:30:111"},"nodeType":"YulIf","src":"12705:50:111"},{"nodeType":"YulAssignment","src":"12764:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12776:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12784:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12772:3:111"},"nodeType":"YulFunctionCall","src":"12772:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"12764:4:111"}]},{"body":{"nodeType":"YulBlock","src":"12840:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12849:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12852:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12842:6:111"},"nodeType":"YulFunctionCall","src":"12842:12:111"},"nodeType":"YulExpressionStatement","src":"12842:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"12805:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12815:12:111"},"nodeType":"YulFunctionCall","src":"12815:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"12831:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12811:3:111"},"nodeType":"YulFunctionCall","src":"12811:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"12801:3:111"},"nodeType":"YulFunctionCall","src":"12801:38:111"},"nodeType":"YulIf","src":"12798:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"12333:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"12343:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"12359:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"12365:6:111","type":""}],"src":"12282:580:111"},{"body":{"nodeType":"YulBlock","src":"13041:229:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13058:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13069:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13051:6:111"},"nodeType":"YulFunctionCall","src":"13051:21:111"},"nodeType":"YulExpressionStatement","src":"13051:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13092:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13103:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13088:3:111"},"nodeType":"YulFunctionCall","src":"13088:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13108:2:111","type":"","value":"39"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13081:6:111"},"nodeType":"YulFunctionCall","src":"13081:30:111"},"nodeType":"YulExpressionStatement","src":"13081:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13131:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13142:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13127:3:111"},"nodeType":"YulFunctionCall","src":"13127:18:111"},{"hexValue":"546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d","kind":"string","nodeType":"YulLiteral","src":"13147:34:111","type":"","value":"TokenPaymaster: no balance (pre-"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13120:6:111"},"nodeType":"YulFunctionCall","src":"13120:62:111"},"nodeType":"YulExpressionStatement","src":"13120:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13202:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13213:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13198:3:111"},"nodeType":"YulFunctionCall","src":"13198:18:111"},{"hexValue":"63726561746529","kind":"string","nodeType":"YulLiteral","src":"13218:9:111","type":"","value":"create)"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13191:6:111"},"nodeType":"YulFunctionCall","src":"13191:37:111"},"nodeType":"YulExpressionStatement","src":"13191:37:111"},{"nodeType":"YulAssignment","src":"13237:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13249:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13260:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13245:3:111"},"nodeType":"YulFunctionCall","src":"13245:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13237:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a3a5fd70368e4e698a4b1ca2306756bd67295a1b90e45690e5829cd9be775e0d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13018:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13032:4:111","type":""}],"src":"12867:403:111"},{"body":{"nodeType":"YulBlock","src":"13449:176:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13466:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13477:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13459:6:111"},"nodeType":"YulFunctionCall","src":"13459:21:111"},"nodeType":"YulExpressionStatement","src":"13459:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13500:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13511:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13496:3:111"},"nodeType":"YulFunctionCall","src":"13496:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13516:2:111","type":"","value":"26"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13489:6:111"},"nodeType":"YulFunctionCall","src":"13489:30:111"},"nodeType":"YulExpressionStatement","src":"13489:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13539:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13550:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13535:3:111"},"nodeType":"YulFunctionCall","src":"13535:18:111"},{"hexValue":"546f6b656e5061796d61737465723a206e6f2062616c616e6365","kind":"string","nodeType":"YulLiteral","src":"13555:28:111","type":"","value":"TokenPaymaster: no balance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13528:6:111"},"nodeType":"YulFunctionCall","src":"13528:56:111"},"nodeType":"YulExpressionStatement","src":"13528:56:111"},{"nodeType":"YulAssignment","src":"13593:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13605:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13616:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13601:3:111"},"nodeType":"YulFunctionCall","src":"13601:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13593:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ba1208b32158094aac35ebe5e696720821cdfa1d15e4b106c836c9b43fcf322a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13426:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13440:4:111","type":""}],"src":"13275:350:111"},{"body":{"nodeType":"YulBlock","src":"13676:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"13707:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13728:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13731:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13721:6:111"},"nodeType":"YulFunctionCall","src":"13721:88:111"},"nodeType":"YulExpressionStatement","src":"13721:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13829:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13832:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13822:6:111"},"nodeType":"YulFunctionCall","src":"13822:15:111"},"nodeType":"YulExpressionStatement","src":"13822:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13857:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13860:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13850:6:111"},"nodeType":"YulFunctionCall","src":"13850:15:111"},"nodeType":"YulExpressionStatement","src":"13850:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"13696:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13689:6:111"},"nodeType":"YulFunctionCall","src":"13689:9:111"},"nodeType":"YulIf","src":"13686:189:111"},{"nodeType":"YulAssignment","src":"13884:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"13893:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"13896:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"13889:3:111"},"nodeType":"YulFunctionCall","src":"13889:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"13884:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"13661:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"13664:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"13670:1:111","type":""}],"src":"13630:274:111"},{"body":{"nodeType":"YulBlock","src":"14039:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"14077:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14086:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14089:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14079:6:111"},"nodeType":"YulFunctionCall","src":"14079:12:111"},"nodeType":"YulExpressionStatement","src":"14079:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"14055:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"14067:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14052:2:111"},"nodeType":"YulFunctionCall","src":"14052:24:111"},"nodeType":"YulIf","src":"14049:44:111"},{"body":{"nodeType":"YulBlock","src":"14126:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14135:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14138:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14128:6:111"},"nodeType":"YulFunctionCall","src":"14128:12:111"},"nodeType":"YulExpressionStatement","src":"14128:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"14108:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"14118:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14105:2:111"},"nodeType":"YulFunctionCall","src":"14105:20:111"},"nodeType":"YulIf","src":"14102:40:111"},{"nodeType":"YulAssignment","src":"14151:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"14168:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"14176:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14164:3:111"},"nodeType":"YulFunctionCall","src":"14164:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"14151:9:111"}]},{"nodeType":"YulAssignment","src":"14196:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"14213:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"14223:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14209:3:111"},"nodeType":"YulFunctionCall","src":"14209:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"14196:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"13973:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"13981:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"13989:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"14001:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"14014:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"14025:9:111","type":""}],"src":"13909:331:111"},{"body":{"nodeType":"YulBlock","src":"14346:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"14356:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"14379:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14366:12:111"},"nodeType":"YulFunctionCall","src":"14366:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"14360:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14394:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"14404:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"14398:2:111","type":""}]},{"nodeType":"YulAssignment","src":"14479:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14492:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14496:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14488:3:111"},"nodeType":"YulFunctionCall","src":"14488:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14479:5:111"}]},{"body":{"nodeType":"YulBlock","src":"14531:80:111","statements":[{"nodeType":"YulAssignment","src":"14545:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14562:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14574:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14581:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"14585:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14577:3:111"},"nodeType":"YulFunctionCall","src":"14577:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"14570:3:111"},"nodeType":"YulFunctionCall","src":"14570:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14592:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"14566:3:111"},"nodeType":"YulFunctionCall","src":"14566:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14558:3:111"},"nodeType":"YulFunctionCall","src":"14558:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"14598:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14554:3:111"},"nodeType":"YulFunctionCall","src":"14554:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14545:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"14514:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"14519:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14511:2:111"},"nodeType":"YulFunctionCall","src":"14511:11:111"},"nodeType":"YulIf","src":"14508:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"14321:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"14328:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"14336:5:111","type":""}],"src":"14245:372:111"},{"body":{"nodeType":"YulBlock","src":"14796:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14813:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14824:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14806:6:111"},"nodeType":"YulFunctionCall","src":"14806:21:111"},"nodeType":"YulExpressionStatement","src":"14806:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14858:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14843:3:111"},"nodeType":"YulFunctionCall","src":"14843:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14863:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14836:6:111"},"nodeType":"YulFunctionCall","src":"14836:30:111"},"nodeType":"YulExpressionStatement","src":"14836:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14886:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14897:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14882:3:111"},"nodeType":"YulFunctionCall","src":"14882:18:111"},{"hexValue":"546f6b656e5061796d61737465723a2077726f6e67206163636f756e74206661","kind":"string","nodeType":"YulLiteral","src":"14902:34:111","type":"","value":"TokenPaymaster: wrong account fa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14875:6:111"},"nodeType":"YulFunctionCall","src":"14875:62:111"},"nodeType":"YulExpressionStatement","src":"14875:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14957:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14968:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14953:3:111"},"nodeType":"YulFunctionCall","src":"14953:18:111"},{"hexValue":"63746f7279","kind":"string","nodeType":"YulLiteral","src":"14973:7:111","type":"","value":"ctory"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14946:6:111"},"nodeType":"YulFunctionCall","src":"14946:35:111"},"nodeType":"YulExpressionStatement","src":"14946:35:111"},{"nodeType":"YulAssignment","src":"14990:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15002:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15013:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14998:3:111"},"nodeType":"YulFunctionCall","src":"14998:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14990:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c8acd6a8133474c975607944c89a9c2827b6234a8b3c94e8e794cae85c818cf6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14773:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14787:4:111","type":""}],"src":"14622:401:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_string(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(pos, length), 0x20), 0)\n }\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_string(value0, add(headStart, 32))\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_string(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: decreased allowance below\")\n mstore(add(headStart, 96), \" zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"ERC20: insufficient allowance\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: transfer from the zero ad\")\n mstore(add(headStart, 96), \"dress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"ERC20: transfer to the zero addr\")\n mstore(add(headStart, 96), \"ess\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"ERC20: transfer amount exceeds b\")\n mstore(add(headStart, 96), \"alance\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ERC20: mint to the zero address\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_e63029b4be8f7147d8fa8c7176417177721349d796aec4cd58131ce1ae4a4e98__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"TokenPaymaster: gas too low for \")\n mstore(add(headStart, 96), \"postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_a3a5fd70368e4e698a4b1ca2306756bd67295a1b90e45690e5829cd9be775e0d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 39)\n mstore(add(headStart, 64), \"TokenPaymaster: no balance (pre-\")\n mstore(add(headStart, 96), \"create)\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_ba1208b32158094aac35ebe5e696720821cdfa1d15e4b106c836c9b43fcf322a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 26)\n mstore(add(headStart, 64), \"TokenPaymaster: no balance\")\n tail := add(headStart, 96)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_c8acd6a8133474c975607944c89a9c2827b6234a8b3c94e8e794cae85c818cf6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"TokenPaymaster: wrong account fa\")\n mstore(add(headStart, 96), \"ctory\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1062},{"length":32,"start":1431},{"length":32,"start":1803},{"length":32,"start":2256},{"length":32,"start":2455},{"length":32,"start":2599},{"length":32,"start":2778},{"length":32,"start":4392}],"14287":[{"length":32,"start":914},{"length":32,"start":5518}]},"linkReferences":{},"object":"6080604052600436106101a15760003560e01c80639f5ca221116100e1578063c23a5cea1161008a578063dd62ed3e11610064578063dd62ed3e1461049a578063f0dda65c146104ed578063f2fde38b1461050d578063f465c77e1461052d57600080fd5b8063c23a5cea1461045d578063c399ec881461047d578063d0e30db01461049257600080fd5b8063a9a23409116100bb578063a9a23409146103f4578063b0d691fe14610414578063bb9fe6bf1461044857600080fd5b80639f5ca22114610380578063a457c2d7146103b4578063a9059cbb146103d457600080fd5b8063313ce5671161014e578063715018a611610128578063715018a6146102f4578063796d4371146103095780638da5cb5b1461031f57806395d89b411461036b57600080fd5b8063313ce56714610275578063395093511461029157806370a08231146102b157600080fd5b806318160ddd1161017f57806318160ddd14610216578063205c28781461023557806323b872dd1461025557600080fd5b80630396cb60146101a657806306fdde03146101bb578063095ea7b3146101e6575b600080fd5b6101b96101b4366004611622565b61055b565b005b3480156101c757600080fd5b506101d061060d565b6040516101dd91906116ba565b60405180910390f35b3480156101f257600080fd5b506102066102013660046116ef565b61069f565b60405190151581526020016101dd565b34801561022257600080fd5b506003545b6040519081526020016101dd565b34801561024157600080fd5b506101b96102503660046116ef565b6106b7565b34801561026157600080fd5b5061020661027036600461171b565b61074f565b34801561028157600080fd5b50604051601281526020016101dd565b34801561029d57600080fd5b506102066102ac3660046116ef565b610773565b3480156102bd57600080fd5b506102276102cc36600461175c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b34801561030057600080fd5b506101b96107bf565b34801561031557600080fd5b50610227613a9881565b34801561032b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b34801561037757600080fd5b506101d06107d3565b34801561038c57600080fd5b506103467f000000000000000000000000000000000000000000000000000000000000000081565b3480156103c057600080fd5b506102066103cf3660046116ef565b6107e2565b3480156103e057600080fd5b506102066103ef3660046116ef565b61089e565b34801561040057600080fd5b506101b961040f366004611779565b6108ac565b34801561042057600080fd5b506103467f000000000000000000000000000000000000000000000000000000000000000081565b34801561045457600080fd5b506101b96108c6565b34801561046957600080fd5b506101b961047836600461175c565b61094a565b34801561048957600080fd5b506102276109f6565b6101b9610aac565b3480156104a657600080fd5b506102276104b5366004611808565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b3480156104f957600080fd5b506101b96105083660046116ef565b610b34565b34801561051957600080fd5b506101b961052836600461175c565b610b4a565b34801561053957600080fd5b5061054d610548366004611841565b610bb3565b6040516101dd929190611895565b610563610bd6565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050505050565b60606004805461061c906118b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610648906118b7565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b6000336106ad818585610c3d565b5060019392505050565b6106bf610bd6565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105f157600080fd5b60003361075d858285610dbc565b610768858585610e73565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106ad90829086906107ba90879061190a565b610c3d565b6107c7610bd6565b6107d1600061109b565b565b60606005805461061c906118b7565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156108915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6107688286868403610c3d565b6000336106ad818585610e73565b6108b4611110565b6108c084848484611195565b50505050565b6108ce610bd6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561093657600080fd5b505af11580156108c0573d6000803e3d6000fd5b610952610bd6565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190611949565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156109db57600080fd5b610b3c610bd6565b610b4682826111c8565b5050565b610b52610bd6565b610b7c30610b7560005473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c3d565b610b85816112a3565b610bb030827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610c3d565b50565b60606000610bbf611110565b610bca85858561133d565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610888565b73ffffffffffffffffffffffffffffffffffffffff8316610cc55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8216610d4e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108c05781811015610e665760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610888565b6108c08484848403610c3d565b73ffffffffffffffffffffffffffffffffffffffff8316610efc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8216610f855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054818110156110215760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610888565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061108e9086815260200190565b60405180910390a36108c0565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107d15760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610888565b60006111a38385018561175c565b905060006111bb6111b6613a988561190a565b611538565b9050610605823083610e73565b73ffffffffffffffffffffffffffffffffffffffff821661122b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610888565b806003600082825461123d919061190a565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6112ab610bd6565b73ffffffffffffffffffffffffffffffffffffffff81166113345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610888565b610bb08161109b565b606060008061134b84611538565b9050613a988660a00135116113c85760405162461bcd60e51b815260206004820152602660248201527f546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f722060448201527f706f73744f7000000000000000000000000000000000000000000000000000006064820152608401610888565b6113d56040870187611962565b15905061146f576113e58661154b565b806113f66102cc602089018961175c565b101561146a5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d60448201527f63726561746529000000000000000000000000000000000000000000000000006064820152608401610888565b6114ce565b806114806102cc602089018961175c565b10156114ce5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e5061796d61737465723a206e6f2062616c616e63650000000000006044820152606401610888565b6114db602087018761175c565b6040805173ffffffffffffffffffffffffffffffffffffffff909216602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529660009650945050505050565b60006115456064836119ce565b92915050565b600061155a6040830183611962565b61156991601491600091611a09565b61157291611a33565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114610b465760405162461bcd60e51b815260206004820152602560248201527f546f6b656e5061796d61737465723a2077726f6e67206163636f756e7420666160448201527f63746f72790000000000000000000000000000000000000000000000000000006064820152608401610888565b60006020828403121561163457600080fd5b813563ffffffff8116811461164857600080fd5b9392505050565b6000815180845260005b8181101561167557602081850181015186830182015201611659565b81811115611687576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611648602083018461164f565b73ffffffffffffffffffffffffffffffffffffffff81168114610bb057600080fd5b6000806040838503121561170257600080fd5b823561170d816116cd565b946020939093013593505050565b60008060006060848603121561173057600080fd5b833561173b816116cd565b9250602084013561174b816116cd565b929592945050506040919091013590565b60006020828403121561176e57600080fd5b8135611648816116cd565b6000806000806060858703121561178f57600080fd5b84356003811061179e57600080fd5b9350602085013567ffffffffffffffff808211156117bb57600080fd5b818701915087601f8301126117cf57600080fd5b8135818111156117de57600080fd5b8860208285010111156117f057600080fd5b95986020929092019750949560400135945092505050565b6000806040838503121561181b57600080fd5b8235611826816116cd565b91506020830135611836816116cd565b809150509250929050565b60008060006060848603121561185657600080fd5b833567ffffffffffffffff81111561186d57600080fd5b8401610160818703121561188057600080fd5b95602085013595506040909401359392505050565b6040815260006118a8604083018561164f565b90508260208301529392505050565b600181811c908216806118cb57607f821691505b602082108103611904577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115611944577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60006020828403121561195b57600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261199757600080fd5b83018035915067ffffffffffffffff8211156119b257600080fd5b6020019150368190038213156119c757600080fd5b9250929050565b600082611a04577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008085851115611a1957600080fd5b83861115611a2657600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015611a735780818660140360031b1b83161692505b50509291505056fea2646970667358221220c50af7154147d5e18d723640df17b4c53b6e3ea61c9b0966d52426a4e43269e064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9F5CA221 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23A5CEA GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xDD62ED3E GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x49A JUMPI DUP1 PUSH4 0xF0DDA65C EQ PUSH2 0x4ED JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x50D JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x448 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9F5CA221 EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0x14E JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2F4 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x309 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x31F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x313CE567 EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0x17F JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1E6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1622 JUMP JUMPDEST PUSH2 0x55B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x60D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x16BA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x69F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x222 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x250 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x6B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x270 CALLDATASIZE PUSH1 0x4 PUSH2 0x171B JUMP JUMPDEST PUSH2 0x74F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x2AC CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x773 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x2CC CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x7BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x3A98 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x377 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x7D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x346 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x7E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0x89E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x1779 JUMP JUMPDEST PUSH2 0x8AC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x346 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x8C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0x94A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x9F6 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0xAAC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x227 PUSH2 0x4B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1808 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x508 CALLDATASIZE PUSH1 0x4 PUSH2 0x16EF JUMP JUMPDEST PUSH2 0xB34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x519 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x528 CALLDATASIZE PUSH1 0x4 PUSH2 0x175C JUMP JUMPDEST PUSH2 0xB4A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x54D PUSH2 0x548 CALLDATASIZE PUSH1 0x4 PUSH2 0x1841 JUMP JUMPDEST PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP3 SWAP2 SWAP1 PUSH2 0x1895 JUMP JUMPDEST PUSH2 0x563 PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x605 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x61C SWAP1 PUSH2 0x18B7 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x648 SWAP1 PUSH2 0x18B7 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x695 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x66A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x695 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x678 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x6AD DUP2 DUP6 DUP6 PUSH2 0xC3D JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6BF PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLER PUSH2 0x75D DUP6 DUP3 DUP6 PUSH2 0xDBC JUMP JUMPDEST PUSH2 0x768 DUP6 DUP6 DUP6 PUSH2 0xE73 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x6AD SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x7BA SWAP1 DUP8 SWAP1 PUSH2 0x190A JUMP JUMPDEST PUSH2 0xC3D JUMP JUMPDEST PUSH2 0x7C7 PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0x7D1 PUSH1 0x0 PUSH2 0x109B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH1 0x5 DUP1 SLOAD PUSH2 0x61C SWAP1 PUSH2 0x18B7 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x891 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x768 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0xC3D JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x6AD DUP2 DUP6 DUP6 PUSH2 0xE73 JUMP JUMPDEST PUSH2 0x8B4 PUSH2 0x1110 JUMP JUMPDEST PUSH2 0x8C0 DUP5 DUP5 DUP5 DUP5 PUSH2 0x1195 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x8CE PUSH2 0xBD6 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x952 PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9EF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA83 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xAA7 SWAP2 SWAP1 PUSH2 0x1949 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB3C PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0xB46 DUP3 DUP3 PUSH2 0x11C8 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB52 PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0xB7C ADDRESS PUSH2 0xB75 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC3D JUMP JUMPDEST PUSH2 0xB85 DUP2 PUSH2 0x12A3 JUMP JUMPDEST PUSH2 0xBB0 ADDRESS DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC3D JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xBBF PUSH2 0x1110 JUMP JUMPDEST PUSH2 0xBCA DUP6 DUP6 DUP6 PUSH2 0x133D JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0xCC5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xD4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x8C0 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0xE66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x8C0 DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0xC3D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xF85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x1021 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP7 SUB SWAP1 SSTORE SWAP3 DUP7 AND DUP1 DUP3 MSTORE SWAP1 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE SWAP2 MLOAD PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0x108E SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x7D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11A3 DUP4 DUP6 ADD DUP6 PUSH2 0x175C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11BB PUSH2 0x11B6 PUSH2 0x3A98 DUP6 PUSH2 0x190A JUMP JUMPDEST PUSH2 0x1538 JUMP JUMPDEST SWAP1 POP PUSH2 0x605 DUP3 ADDRESS DUP4 PUSH2 0xE73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x122B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x123D SWAP2 SWAP1 PUSH2 0x190A JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE MLOAD DUP5 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x12AB PUSH2 0xBD6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1334 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0xBB0 DUP2 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x134B DUP5 PUSH2 0x1538 JUMP JUMPDEST SWAP1 POP PUSH2 0x3A98 DUP7 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x13C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A2067617320746F6F206C6F7720666F7220 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x706F73744F700000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x13D5 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x1962 JUMP JUMPDEST ISZERO SWAP1 POP PUSH2 0x146F JUMPI PUSH2 0x13E5 DUP7 PUSH2 0x154B JUMP JUMPDEST DUP1 PUSH2 0x13F6 PUSH2 0x2CC PUSH1 0x20 DUP10 ADD DUP10 PUSH2 0x175C JUMP JUMPDEST LT ISZERO PUSH2 0x146A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A206E6F2062616C616E636520287072652D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6372656174652900000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x14CE JUMP JUMPDEST DUP1 PUSH2 0x1480 PUSH2 0x2CC PUSH1 0x20 DUP10 ADD DUP10 PUSH2 0x175C JUMP JUMPDEST LT ISZERO PUSH2 0x14CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A206E6F2062616C616E6365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x888 JUMP JUMPDEST PUSH2 0x14DB PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x175C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 DUP4 ADD MSTORE ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP7 PUSH1 0x0 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1545 PUSH1 0x64 DUP4 PUSH2 0x19CE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x155A PUSH1 0x40 DUP4 ADD DUP4 PUSH2 0x1962 JUMP JUMPDEST PUSH2 0x1569 SWAP2 PUSH1 0x14 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x1A09 JUMP JUMPDEST PUSH2 0x1572 SWAP2 PUSH2 0x1A33 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0xB46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E5061796D61737465723A2077726F6E67206163636F756E74206661 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x63746F7279000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x888 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1634 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1648 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1675 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1659 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1687 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1648 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x164F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1702 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x170D DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1730 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x173B DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x174B DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x176E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1648 DUP2 PUSH2 0x16CD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x178F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x179E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x17CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x17DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x17F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x181B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1826 DUP2 PUSH2 0x16CD JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1836 DUP2 PUSH2 0x16CD JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1856 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x186D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x18A8 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x164F JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x18CB JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x1904 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1944 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x195B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1997 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x19B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x19C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A04 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x1A19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x1A73 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 EXP 0xF7 ISZERO COINBASE SELFBALANCE 0xD5 0xE1 DUP14 PUSH19 0x3640DF17B4C53B6E3EA61C9B0966D52426A4E4 ORIGIN PUSH10 0xE064736F6C634300080F STOP CALLER ","sourceMap":"1212:4302:75:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2154:98:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4431:197;;;;;;;;;;-1:-1:-1;4431:197:35;;;;;:::i;:::-;;:::i;:::-;;;1700:14:111;;1693:22;1675:41;;1663:2;1648:18;4431:197:35;1535:187:111;3242:106:35;;;;;;;;;;-1:-1:-1;3329:12:35;;3242:106;;;1873:25:111;;;1861:2;1846:18;3242:106:35;1727:177:111;2721:149:52;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;5190:286:35:-;;;;;;;;;;-1:-1:-1;5190:286:35;;;;;:::i;:::-;;:::i;3091:91::-;;;;;;;;;;-1:-1:-1;3091:91:35;;3173:2;2840:36:111;;2828:2;2813:18;3091:91:35;2698:184:111;5871:234:35;;;;;;;;;;-1:-1:-1;5871:234:35;;;;;:::i;:::-;;:::i;3406:125::-;;;;;;;;;;-1:-1:-1;3406:125:35;;;;;:::i;:::-;3506:18;;3480:7;3506:18;;;:9;:18;;;;;;;3406:125;1831:101:24;;;;;;;;;;;;;:::i;1303:44:75:-;;;;;;;;;;;;1342:5;1303:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;;3315:42:111;3303:55;;;3285:74;;3273:2;3258:18;1201:85:24;3139:226:111;2365:102:35;;;;;;;;;;;;;:::i;1354:35:75:-;;;;;;;;;;;;;;;6592:427:35;;;;;;;;;;-1:-1:-1;6592:427:35;;;;;:::i;:::-;;:::i;3727:189::-;;;;;;;;;;-1:-1:-1;3727:189:35;;;;;:::i;:::-;;:::i;1143:186:52:-;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;2474:105::-;;;:::i;3974:149:35:-;;;;;;;;;;-1:-1:-1;3974:149:35;;;;;:::i;:::-;4089:18;;;;4063:7;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3974:149;1977:115:75;;;;;;;;;;-1:-1:-1;1977:115:75;;;;;:::i;:::-;;:::i;2335:358::-;;;;;;;;;;-1:-1:-1;2335:358:75;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;6102:10:111;6090:23;;3173:55:52::1;::::0;::::1;6072:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;6045:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2154:98:35:-;2208:13;2240:5;2233:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98;:::o;4431:197::-;4514:4;719:10:43;4568:32:35;719:10:43;4584:7:35;4593:6;4568:8;:32::i;:::-;-1:-1:-1;4617:4:35;;4431:197;-1:-1:-1;;;4431:197:35:o;2721:149:52:-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;6775:55:111::0;;;2817:46:52::1;::::0;::::1;6757:74:111::0;6847:18;;;6840:34;;;2817:10:52::1;:21;::::0;::::1;::::0;6730:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;5190:286:35::0;5317:4;719:10:43;5373:38:35;5389:4;719:10:43;5404:6:35;5373:15;:38::i;:::-;5421:27;5431:4;5437:2;5441:6;5421:9;:27::i;:::-;-1:-1:-1;5465:4:35;;5190:286;-1:-1:-1;;;;5190:286:35:o;5871:234::-;719:10:43;5959:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5959:4;;719:10:43;6013:64:35;;719:10:43;;4089:27:35;;6038:38;;6066:10;;6038:38;:::i;:::-;6013:8;:64::i;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2365:102:35:-;2421:13;2453:7;2446:14;;;;;:::i;6592:427::-;719:10:43;6685:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6685:4;;719:10:43;6829:15:35;6809:16;:35;;6801:85;;;;-1:-1:-1;;;6801:85:35;;7374:2:111;6801:85:35;;;7356:21:111;7413:2;7393:18;;;7386:30;7452:34;7432:18;;;7425:62;7523:7;7503:18;;;7496:35;7548:19;;6801:85:35;;;;;;;;;6920:60;6929:5;6936:7;6964:15;6945:16;:34;6920:8;:60::i;3727:189::-;3806:4;719:10:43;3860:28:35;719:10:43;3877:2:35;3881:6;3860:9;:28::i;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;3303:55:111::0;;;3975:41:52::1;::::0;::::1;3285:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;3258:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;3285:74:111;3361:7:52;;3387:10;:20;;;;;3258:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;3285:74:111;2518:10:52;:20;;;;;2547:9;;3258:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;1977:115:75;1094:13:24;:11;:13::i;:::-;2061:24:75::1;2067:9;2078:6;2061:5;:24::i;:::-;1977:115:::0;;:::o;2335:358::-;1094:13:24;:11;:13::i;:::-;2469:35:75::1;2486:4;2493:7;1247::24::0;1273:6;;;;1201:85;2493:7:75::1;2502:1;2469:8;:35::i;:::-;2514:33;2538:8;2514:23;:33::i;:::-;2637:49;2654:4;2661:8;2671:14;2637:8;:49::i;:::-;2335:358:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;8216:2:111;1414:68:24;;;8198:21:111;;;8235:18;;;8228:30;8294:34;8274:18;;;8267:62;8346:18;;1414:68:24;8014:356:111;10504:370:35;10635:19;;;10627:68;;;;-1:-1:-1;;;10627:68:35;;8577:2:111;10627:68:35;;;8559:21:111;8616:2;8596:18;;;8589:30;8655:34;8635:18;;;8628:62;8726:6;8706:18;;;8699:34;8750:19;;10627:68:35;8375:400:111;10627:68:35;10713:21;;;10705:68;;;;-1:-1:-1;;;10705:68:35;;8982:2:111;10705:68:35;;;8964:21:111;9021:2;9001:18;;;8994:30;9060:34;9040:18;;;9033:62;9131:4;9111:18;;;9104:32;9153:19;;10705:68:35;8780:398:111;10705:68:35;10784:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10835:32;;1873:25:111;;;10835:32:35;;1846:18:111;10835:32:35;;;;;;;10504:370;;;:::o;11155:441::-;4089:18;;;;11285:24;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;11371:17;11351:37;;11347:243;;11432:6;11412:16;:26;;11404:68;;;;-1:-1:-1;;;11404:68:35;;9385:2:111;11404:68:35;;;9367:21:111;9424:2;9404:18;;;9397:30;9463:31;9443:18;;;9436:59;9512:18;;11404:68:35;9183:353:111;11404:68:35;11514:51;11523:5;11530:7;11558:6;11539:16;:25;11514:8;:51::i;7473:818::-;7599:18;;;7591:68;;;;-1:-1:-1;;;7591:68:35;;9743:2:111;7591:68:35;;;9725:21:111;9782:2;9762:18;;;9755:30;9821:34;9801:18;;;9794:62;9892:7;9872:18;;;9865:35;9917:19;;7591:68:35;9541:401:111;7591:68:35;7677:16;;;7669:64;;;;-1:-1:-1;;;7669:64:35;;10149:2:111;7669:64:35;;;10131:21:111;10188:2;10168:18;;;10161:30;10227:34;10207:18;;;10200:62;10298:5;10278:18;;;10271:33;10321:19;;7669:64:35;9947:399:111;7669:64:35;7815:15;;;7793:19;7815:15;;;:9;:15;;;;;;7848:21;;;;7840:72;;;;-1:-1:-1;;;7840:72:35;;10553:2:111;7840:72:35;;;10535:21:111;10592:2;10572:18;;;10565:30;10631:34;10611:18;;;10604:62;10702:8;10682:18;;;10675:36;10728:19;;7840:72:35;10351:402:111;7840:72:35;7946:15;;;;;;;;:9;:15;;;;;;7964:20;;;7946:38;;8161:13;;;;;;;;;;:23;;;;;;8210:26;;;;;;7978:6;1873:25:111;;1861:2;1846:18;;1727:177;8210:26:35;;;;;;;;8247:37;12180:121;2433:187:24;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;10960:2:111;4148:67:52;;;10942:21:111;10999:2;10979:18;;;10972:30;11038:23;11018:18;;;11011:51;11079:18;;4148:67:52;10758:345:111;5004:508:75;5220:14;5237:30;;;;5248:7;5237:30;:::i;:::-;5220:47;-1:-1:-1;5277:14:75;5294:48;5313:28;1342:5;5313:13;:28;:::i;:::-;5294:18;:48::i;:::-;5277:65;;5465:40;5475:6;5491:4;5498:6;5465:9;:40::i;8567:535:35:-;8650:21;;;8642:65;;;;-1:-1:-1;;;8642:65:35;;11310:2:111;8642:65:35;;;11292:21:111;11349:2;11329:18;;;11322:30;11388:33;11368:18;;;11361:61;11439:18;;8642:65:35;11108:355:111;8642:65:35;8794:6;8778:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;8946:18:35;;;;;;;:9;:18;;;;;;;;:28;;;;;;8999:37;1873:25:111;;;8999:37:35;;1846:18:111;8999:37:35;;;;;;;1977:115:75;;:::o;2081:198:24:-;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;11670:2:111;2161:73:24::1;::::0;::::1;11652:21:111::0;11709:2;11689:18;;;11682:30;11748:34;11728:18;;;11721:62;11819:8;11799:18;;;11792:36;11845:19;;2161:73:24::1;11468:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;3211:918:75:-:0;3361:20;3383:22;3417:20;3440:35;3459:15;3440:18;:35::i;:::-;3417:58;;1342:5;3676:6;:27;;;:42;3668:93;;;;-1:-1:-1;;;3668:93:75;;12077:2:111;3668:93:75;;;12059:21:111;12116:2;12096:18;;;12089:30;12155:34;12135:18;;;12128:62;12226:8;12206:18;;;12199:36;12252:19;;3668:93:75;11875:402:111;3668:93:75;3776:15;;;;:6;:15;:::i;:::-;:27;;-1:-1:-1;3772:303:75;;3819:28;3840:6;3819:20;:28::i;:::-;3897:12;3869:24;3879:13;;;;:6;:13;:::i;3869:24::-;:40;;3861:92;;;;-1:-1:-1;;;3861:92:75;;13069:2:111;3861:92:75;;;13051:21:111;13108:2;13088:18;;;13081:30;13147:34;13127:18;;;13120:62;13218:9;13198:18;;;13191:37;13245:19;;3861:92:75;12867:403:111;3861:92:75;3772:303;;;4021:12;3993:24;4003:13;;;;:6;:13;:::i;3993:24::-;:40;;3985:79;;;;-1:-1:-1;;;3985:79:75;;13477:2:111;3985:79:75;;;13459:21:111;13516:2;13496:18;;;13489:30;13555:28;13535:18;;;13528:56;13601:18;;3985:79:75;13275:350:111;3985:79:75;4104:13;;;;:6;:13;:::i;:::-;4093:25;;;3315:42:111;3303:55;;;4093:25:75;;;3285:74:111;3258:18;4093:25:75;;;;;;;;;;;;;;4120:1;;-1:-1:-1;3211:918:75;-1:-1:-1;;;;;3211:918:75:o;2824:135::-;2901:18;2938:14;2949:3;2938:8;:14;:::i;:::-;2931:21;2824:135;-1:-1:-1;;2824:135:75:o;4293:240::-;4386:15;4420;;;;:6;:15;:::i;:::-;:23;;4440:2;;4436:1;;4420:23;:::i;:::-;4412:32;;;:::i;:::-;4404:41;;;-1:-1:-1;4463:21:75;4474:10;4463:21;;;4455:71;;;;-1:-1:-1;;;4455:71:75;;14824:2:111;4455:71:75;;;14806:21:111;14863:2;14843:18;;;14836:30;14902:34;14882:18;;;14875:62;14973:7;14953:18;;;14946:35;14998:19;;4455:71:75;14622:401:111;14:276;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:531::-;337:3;375:5;369:12;402:6;397:3;390:19;427:1;437:162;451:6;448:1;445:13;437:162;;;513:4;569:13;;;565:22;;559:29;541:11;;;537:20;;530:59;466:12;437:162;;;617:6;614:1;611:13;608:87;;;683:1;676:4;667:6;662:3;658:16;654:27;647:38;608:87;-1:-1:-1;740:2:111;728:15;745:66;724:88;715:98;;;;815:4;711:109;;295:531;-1:-1:-1;;295:531:111:o;831:220::-;980:2;969:9;962:21;943:4;1000:45;1041:2;1030:9;1026:18;1018:6;1000:45;:::i;1056:154::-;1142:42;1135:5;1131:54;1124:5;1121:65;1111:93;;1200:1;1197;1190:12;1215:315;1283:6;1291;1344:2;1332:9;1323:7;1319:23;1315:32;1312:52;;;1360:1;1357;1350:12;1312:52;1399:9;1386:23;1418:31;1443:5;1418:31;:::i;:::-;1468:5;1520:2;1505:18;;;;1492:32;;-1:-1:-1;;;1215:315:111:o;2237:456::-;2314:6;2322;2330;2383:2;2371:9;2362:7;2358:23;2354:32;2351:52;;;2399:1;2396;2389:12;2351:52;2438:9;2425:23;2457:31;2482:5;2457:31;:::i;:::-;2507:5;-1:-1:-1;2564:2:111;2549:18;;2536:32;2577:33;2536:32;2577:33;:::i;:::-;2237:456;;2629:7;;-1:-1:-1;;;2683:2:111;2668:18;;;;2655:32;;2237:456::o;2887:247::-;2946:6;2999:2;2987:9;2978:7;2974:23;2970:32;2967:52;;;3015:1;3012;3005:12;2967:52;3054:9;3041:23;3073:31;3098:5;3073:31;:::i;3370:819::-;3474:6;3482;3490;3498;3551:2;3539:9;3530:7;3526:23;3522:32;3519:52;;;3567:1;3564;3557:12;3519:52;3606:9;3593:23;3645:1;3638:5;3635:12;3625:40;;3661:1;3658;3651:12;3625:40;3684:5;-1:-1:-1;3740:2:111;3725:18;;3712:32;3763:18;3793:14;;;3790:34;;;3820:1;3817;3810:12;3790:34;3858:6;3847:9;3843:22;3833:32;;3903:7;3896:4;3892:2;3888:13;3884:27;3874:55;;3925:1;3922;3915:12;3874:55;3965:2;3952:16;3991:2;3983:6;3980:14;3977:34;;;4007:1;4004;3997:12;3977:34;4052:7;4047:2;4038:6;4034:2;4030:15;4026:24;4023:37;4020:57;;;4073:1;4070;4063:12;4020:57;3370:819;;4104:2;4096:11;;;;;-1:-1:-1;4126:6:111;;4179:2;4164:18;4151:32;;-1:-1:-1;3370:819:111;-1:-1:-1;;;3370:819:111:o;4706:388::-;4774:6;4782;4835:2;4823:9;4814:7;4810:23;4806:32;4803:52;;;4851:1;4848;4841:12;4803:52;4890:9;4877:23;4909:31;4934:5;4909:31;:::i;:::-;4959:5;-1:-1:-1;5016:2:111;5001:18;;4988:32;5029:33;4988:32;5029:33;:::i;:::-;5081:7;5071:17;;;4706:388;;;;;:::o;5099:530::-;5210:6;5218;5226;5279:2;5267:9;5258:7;5254:23;5250:32;5247:52;;;5295:1;5292;5285:12;5247:52;5335:9;5322:23;5368:18;5360:6;5357:30;5354:50;;;5400:1;5397;5390:12;5354:50;5423:22;;5479:3;5461:16;;;5457:26;5454:46;;;5496:1;5493;5486:12;5454:46;5519:2;5568;5553:18;;5540:32;;-1:-1:-1;5619:2:111;5604:18;;;5591:32;;5099:530;-1:-1:-1;;;5099:530:111:o;5634:289::-;5809:2;5798:9;5791:21;5772:4;5829:45;5870:2;5859:9;5855:18;5847:6;5829:45;:::i;:::-;5821:53;;5910:6;5905:2;5894:9;5890:18;5883:34;5634:289;;;;;:::o;6125:437::-;6204:1;6200:12;;;;6247;;;6268:61;;6322:4;6314:6;6310:17;6300:27;;6268:61;6375:2;6367:6;6364:14;6344:18;6341:38;6338:218;;6412:77;6409:1;6402:88;6513:4;6510:1;6503:15;6541:4;6538:1;6531:15;6338:218;;6125:437;;;:::o;6885:282::-;6925:3;6956:1;6952:6;6949:1;6946:13;6943:193;;;6992:77;6989:1;6982:88;7093:4;7090:1;7083:15;7121:4;7118:1;7111:15;6943:193;-1:-1:-1;7152:9:111;;6885:282::o;7825:184::-;7895:6;7948:2;7936:9;7927:7;7923:23;7919:32;7916:52;;;7964:1;7961;7954:12;7916:52;-1:-1:-1;7987:16:111;;7825:184;-1:-1:-1;7825:184:111:o;12282:580::-;12359:4;12365:6;12425:11;12412:25;12515:66;12504:8;12488:14;12484:29;12480:102;12460:18;12456:127;12446:155;;12597:1;12594;12587:12;12446:155;12624:33;;12676:20;;;-1:-1:-1;12719:18:111;12708:30;;12705:50;;;12751:1;12748;12741:12;12705:50;12784:4;12772:17;;-1:-1:-1;12815:14:111;12811:27;;;12801:38;;12798:58;;;12852:1;12849;12842:12;12798:58;12282:580;;;;;:::o;13630:274::-;13670:1;13696;13686:189;;13731:77;13728:1;13721:88;13832:4;13829:1;13822:15;13860:4;13857:1;13850:15;13686:189;-1:-1:-1;13889:9:111;;13630:274::o;13909:331::-;14014:9;14025;14067:8;14055:10;14052:24;14049:44;;;14089:1;14086;14079:12;14049:44;14118:6;14108:8;14105:20;14102:40;;;14138:1;14135;14128:12;14102:40;-1:-1:-1;;14164:23:111;;;14209:25;;;;;-1:-1:-1;13909:331:111:o;14245:372::-;14404:66;14366:19;;14488:11;;;;14519:2;14511:11;;14508:103;;;14598:2;14592;14585:3;14581:2;14577:12;14574:1;14570:20;14566:29;14562:2;14558:38;14554:47;14545:56;;14508:103;;;14245:372;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"1366600","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"262","addStake(uint32)":"infinite","allowance(address,address)":"infinite","approve(address,uint256)":"24638","balanceOf(address)":"2597","decimals()":"223","decreaseAllowance(address,uint256)":"26902","deposit()":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","increaseAllowance(address,uint256)":"26947","mintTokens(address,uint256)":"52979","name()":"infinite","owner()":"2385","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","symbol()":"infinite","theFactory()":"infinite","totalSupply()":"2327","transfer(address,uint256)":"51079","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","unlockStake()":"infinite","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_postOp(enum IPaymaster.PostOpMode,bytes calldata,uint256)":"infinite","_validateConstructor(struct UserOperation calldata)":"infinite","_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","getTokenValueOfEth(uint256)":"82"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addStake(uint32)":"0396cb60","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","increaseAllowance(address,uint256)":"39509351","mintTokens(address,uint256)":"f0dda65c","name()":"06fdde03","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","symbol()":"95d89b41","theFactory()":"9f5ca221","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountFactory\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"theFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"mintTokens(address,uint256)\":{\"params\":{\"amount\":\"- the amount it will receive.\",\"recipient\":\"- the address that will receive the minted tokens.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"mintTokens(address,uint256)\":{\"notice\":\"helpers for owner, to mint and withdraw tokens.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"transferOwnership(address)\":{\"notice\":\"transfer paymaster ownership. owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance) when changing owner, the old owner's withdrawal rights are revoked.\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"A sample paymaster that defines itself as a token to pay for gas. The paymaster IS the token to use, since a paymaster cannot use an external contract. Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract. subclass should override \\\"getTokenValueOfEth\\\" to provide actual token exchange rate, settable by the owner. Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts): - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted, and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster) in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit) - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or to whitelist the account and the called method ids.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/TokenPaymaster.sol\":\"TokenPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/TokenPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"../core/BasePaymaster.sol\\\";\\n\\n/**\\n * A sample paymaster that defines itself as a token to pay for gas.\\n * The paymaster IS the token to use, since a paymaster cannot use an external contract.\\n * Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract.\\n * subclass should override \\\"getTokenValueOfEth\\\" to provide actual token exchange rate, settable by the owner.\\n * Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts):\\n * - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted,\\n * and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster)\\n * in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit)\\n * - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or\\n * to whitelist the account and the called method ids.\\n */\\ncontract TokenPaymaster is BasePaymaster, ERC20 {\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 15000;\\n\\n address public immutable theFactory;\\n\\n constructor(address accountFactory, string memory _symbol, IEntryPoint _entryPoint) ERC20(_symbol, _symbol) BasePaymaster(_entryPoint) {\\n theFactory = accountFactory;\\n //make it non-empty\\n _mint(address(this), 1);\\n\\n //owner is allowed to withdraw tokens from the paymaster's balance\\n _approve(address(this), msg.sender, type(uint).max);\\n }\\n\\n\\n /**\\n * helpers for owner, to mint and withdraw tokens.\\n * @param recipient - the address that will receive the minted tokens.\\n * @param amount - the amount it will receive.\\n */\\n function mintTokens(address recipient, uint256 amount) external onlyOwner {\\n _mint(recipient, amount);\\n }\\n\\n /**\\n * transfer paymaster ownership.\\n * owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance)\\n * when changing owner, the old owner's withdrawal rights are revoked.\\n */\\n function transferOwnership(address newOwner) public override virtual onlyOwner {\\n // remove allowance of current owner\\n _approve(address(this), owner(), 0);\\n super.transferOwnership(newOwner);\\n // new owner is allowed to withdraw tokens from the paymaster's balance\\n _approve(address(this), newOwner, type(uint).max);\\n }\\n\\n //Note: this method assumes a fixed ratio of token-to-eth. subclass should override to supply oracle\\n // or a setter.\\n function getTokenValueOfEth(uint256 valueEth) internal view virtual returns (uint256 valueToken) {\\n return valueEth / 100;\\n }\\n\\n /**\\n * validate the request:\\n * if this is a constructor call, make sure it is a known account.\\n * verify the sender has enough tokens.\\n * (since the paymaster is also the token, there is no notion of \\\"approval\\\")\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n uint256 tokenPrefund = getTokenValueOfEth(requiredPreFund);\\n\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n // make sure that verificationGasLimit is high enough to handle postOp\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"TokenPaymaster: gas too low for postOp\\\");\\n\\n if (userOp.initCode.length != 0) {\\n _validateConstructor(userOp);\\n require(balanceOf(userOp.sender) >= tokenPrefund, \\\"TokenPaymaster: no balance (pre-create)\\\");\\n } else {\\n\\n require(balanceOf(userOp.sender) >= tokenPrefund, \\\"TokenPaymaster: no balance\\\");\\n }\\n\\n return (abi.encode(userOp.sender), 0);\\n }\\n\\n // when constructing an account, validate constructor code and parameters\\n // we trust our factory (and that it doesn't have any other public methods)\\n function _validateConstructor(UserOperation calldata userOp) internal virtual view {\\n address factory = address(bytes20(userOp.initCode[0 : 20]));\\n require(factory == theFactory, \\\"TokenPaymaster: wrong account factory\\\");\\n }\\n\\n /**\\n * actual charge of user.\\n * this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases)\\n * BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting\\n * the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp),\\n * and the transaction should succeed there.\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n //we don't really care about the mode, we just pay the gas with the user's tokens.\\n (mode);\\n address sender = abi.decode(context, (address));\\n uint256 charge = getTokenValueOfEth(actualGasCost + COST_OF_POST);\\n //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed.\\n _transfer(sender, address(this), charge);\\n }\\n}\\n\",\"keccak256\":\"0x21f69ff16c860e8e9e15b4023ac5eac2a7202e81e14a995186457a119e2b9b74\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":3770,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_balances","offset":0,"slot":"1","type":"t_mapping(t_address,t_uint256)"},{"astId":3776,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_allowances","offset":0,"slot":"2","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":3778,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_totalSupply","offset":0,"slot":"3","type":"t_uint256"},{"astId":3780,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_name","offset":0,"slot":"4","type":"t_string_storage"},{"astId":3782,"contract":"contracts/samples/TokenPaymaster.sol:TokenPaymaster","label":"_symbol","offset":0,"slot":"5","type":"t_string_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"mintTokens(address,uint256)":{"notice":"helpers for owner, to mint and withdraw tokens."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"transferOwnership(address)":{"notice":"transfer paymaster ownership. owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance) when changing owner, the old owner's withdrawal rights are revoked."},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"A sample paymaster that defines itself as a token to pay for gas. The paymaster IS the token to use, since a paymaster cannot use an external contract. Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract. subclass should override \"getTokenValueOfEth\" to provide actual token exchange rate, settable by the owner. Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts): - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted, and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster) in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit) - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or to whitelist the account and the called method ids.","version":1}}},"contracts/samples/VerifyingPaymaster.sol":{"VerifyingPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"address","name":"_verifyingSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"uint48","name":"validAfter","type":"uint48"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"paymasterAndData","type":"bytes"}],"name":"parsePaymasterAndData","outputs":[{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"senderNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyingSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_14579":{"entryPoint":null,"id":14579,"parameterSlots":2,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":89,"id":2932,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":194,"id":null,"parameterSlots":2,"returnSlots":2},"validator_revert_contract_IEntryPoint":{"entryPoint":169,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:597:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c06040523480156200001157600080fd5b5060405162001723380380620017238339810160408190526200003491620000c2565b81620000403362000059565b6001600160a01b039081166080521660a0525062000101565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000bf57600080fd5b50565b60008060408385031215620000d657600080fd5b8251620000e381620000a9565b6020840151909250620000f681620000a9565b809150509250929050565b60805160a0516115c46200015f6000396000818161013f0152610ca20152600081816102880152818161038601528181610450015281816105730152818161063a015281816106ca0152818161077d0152610a0401526115c46000f3fe6080604052600436106100f35760003560e01c8063a9a234091161008a578063c399ec8811610059578063c399ec88146102df578063d0e30db0146102f4578063f2fde38b146102fc578063f465c77e1461031c57600080fd5b8063a9a2340914610256578063b0d691fe14610276578063bb9fe6bf146102aa578063c23a5cea146102bf57600080fd5b80638da5cb5b116100c65780638da5cb5b146101a057806394d4ad60146101cb57806394e1fc19146101fb5780639c90b4431461022957600080fd5b80630396cb60146100f8578063205c28781461010d57806323d9ac9b1461012d578063715018a61461018b575b600080fd5b61010b610106366004611075565b61034a565b005b34801561011957600080fd5b5061010b6101283660046110c4565b6103fc565b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561019757600080fd5b5061010b610494565b3480156101ac57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610161565b3480156101d757600080fd5b506101eb6101e6366004611132565b6104a8565b6040516101829493929190611174565b34801561020757600080fd5b5061021b610216366004611212565b6104e5565b604051908152602001610182565b34801561023557600080fd5b5061021b610244366004611270565b60016020526000908152604090205481565b34801561026257600080fd5b5061010b61027136600461128d565b61054f565b34801561028257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b657600080fd5b5061010b610569565b3480156102cb57600080fd5b5061010b6102da366004611270565b6105ed565b3480156102eb57600080fd5b5061021b610699565b61010b61074f565b34801561030857600080fd5b5061010b610317366004611270565b6107d7565b34801561032857600080fd5b5061033c6103373660046112ed565b610893565b6040516101829291906113a6565b6103526108b7565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156103e057600080fd5b505af11580156103f4573d6000803e3d6000fd5b505050505050565b6104046108b7565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156103e057600080fd5b61049c6108b7565b6104a66000610938565b565b60008036816104bb6054601487896113c8565b8101906104c891906113f2565b90945092506104da85605481896113c8565b949793965094505050565b60006104f0846109ad565b73ffffffffffffffffffffffffffffffffffffffff8535166000908152600160209081526040918290205491516105309392469230928991899101611425565b6040516020818303038152906040528051906020012090509392505050565b6105576109ec565b61056384848484610a8b565b50505050565b6105716108b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105d957600080fd5b505af1158015610563573d6000803e3d6000fd5b6105f56108b7565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190611482565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561067e57600080fd5b6107df6108b7565b73ffffffffffffffffffffffffffffffffffffffff8116610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61089081610938565b50565b6060600061089f6109ec565b6108aa858585610aed565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60603660006109c061012085018561149b565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161087e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f7665727269646500000000000000000000000000000000000000604482015260640161087e565b6060600080803681610b066101e66101208b018b61149b565b929650909450925090506040811480610b1f5750604181145b610bad57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e6444617461606482015260840161087e565b6000610c10610bbd8b87876104e5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600160205260408120805492935090610c4583611500565b9190505550610c8a8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d3292505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610d0757610ce860018686610d56565b60405180602001604052806000815250909650965050505050506108af565b610d1360008686610d56565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610d418585610d8e565b91509150610d4e81610dd3565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610d7e576000610d81565b60015b60ff161717949350505050565b6000808251604103610dc45760208301516040840151606085015160001a610db887828585610f86565b94509450505050610dcc565b506000905060025b9250929050565b6000816004811115610de757610de761155f565b03610def5750565b6001816004811115610e0357610e0361155f565b03610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161087e565b6002816004811115610e7e57610e7e61155f565b03610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161087e565b6003816004811115610ef957610ef961155f565b03610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161087e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fbd575060009050600361106c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611011573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166110655760006001925092505061106c565b9150600090505b94509492505050565b60006020828403121561108757600080fd5b813563ffffffff8116811461109b57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461089057600080fd5b600080604083850312156110d757600080fd5b82356110e2816110a2565b946020939093013593505050565b60008083601f84011261110257600080fd5b50813567ffffffffffffffff81111561111a57600080fd5b602083019150836020828501011115610dcc57600080fd5b6000806020838503121561114557600080fd5b823567ffffffffffffffff81111561115c57600080fd5b611168858286016110f0565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156111f157600080fd5b50919050565b803565ffffffffffff8116811461120d57600080fd5b919050565b60008060006060848603121561122757600080fd5b833567ffffffffffffffff81111561123e57600080fd5b61124a868287016111de565b935050611259602085016111f7565b9150611267604085016111f7565b90509250925092565b60006020828403121561128257600080fd5b813561109b816110a2565b600080600080606085870312156112a357600080fd5b8435600381106112b257600080fd5b9350602085013567ffffffffffffffff8111156112ce57600080fd5b6112da878288016110f0565b9598909750949560400135949350505050565b60008060006060848603121561130257600080fd5b833567ffffffffffffffff81111561131957600080fd5b611325868287016111de565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561136157602081850181015186830182015201611345565b81811115611373576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006113b9604083018561133b565b90508260208301529392505050565b600080858511156113d857600080fd5b838611156113e557600080fd5b5050820193919092039150565b6000806040838503121561140557600080fd5b61140e836111f7565b915061141c602084016111f7565b90509250929050565b60c08152600061143860c083018961133b565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561149457600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114d057600080fd5b83018035915067ffffffffffffffff8211156114eb57600080fd5b602001915036819003821315610dcc57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220b083e1e185bd197e6bd2865e6080b7f4ce6a55d4789313235098115eb8eea9ca64736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1723 CODESIZE SUB DUP1 PUSH3 0x1723 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xC2 JUMP JUMPDEST DUP2 PUSH3 0x40 CALLER PUSH3 0x59 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE AND PUSH1 0xA0 MSTORE POP PUSH3 0x101 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0xD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0xE3 DUP2 PUSH3 0xA9 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0xF6 DUP2 PUSH3 0xA9 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x15C4 PUSH3 0x15F PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x13F ADD MSTORE PUSH2 0xCA2 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x288 ADD MSTORE DUP2 DUP2 PUSH2 0x386 ADD MSTORE DUP2 DUP2 PUSH2 0x450 ADD MSTORE DUP2 DUP2 PUSH2 0x573 ADD MSTORE DUP2 DUP2 PUSH2 0x63A ADD MSTORE DUP2 DUP2 PUSH2 0x6CA ADD MSTORE DUP2 DUP2 PUSH2 0x77D ADD MSTORE PUSH2 0xA04 ADD MSTORE PUSH2 0x15C4 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xF3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x2F4 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x31C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x94D4AD60 EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x94E1FC19 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x9C90B443 EQ PUSH2 0x229 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xF8 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0x23D9AC9B EQ PUSH2 0x12D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x18B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10B PUSH2 0x106 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x34A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x128 CALLDATASIZE PUSH1 0x4 PUSH2 0x10C4 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x161 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x494 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x161 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EB PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1132 JUMP JUMPDEST PUSH2 0x4A8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x182 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1174 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x216 CALLDATASIZE PUSH1 0x4 PUSH2 0x1212 JUMP JUMPDEST PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x182 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x244 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x128D JUMP JUMPDEST PUSH2 0x54F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x161 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x569 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x2DA CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x5ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x699 JUMP JUMPDEST PUSH2 0x10B PUSH2 0x74F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x7D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x33C PUSH2 0x337 CALLDATASIZE PUSH1 0x4 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x893 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x182 SWAP3 SWAP2 SWAP1 PUSH2 0x13A6 JUMP JUMPDEST PUSH2 0x352 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x404 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x49C PUSH2 0x8B7 JUMP JUMPDEST PUSH2 0x4A6 PUSH1 0x0 PUSH2 0x938 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE DUP2 PUSH2 0x4BB PUSH1 0x54 PUSH1 0x14 DUP8 DUP10 PUSH2 0x13C8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4C8 SWAP2 SWAP1 PUSH2 0x13F2 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x4DA DUP6 PUSH1 0x54 DUP2 DUP10 PUSH2 0x13C8 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F0 DUP5 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD SWAP2 MLOAD PUSH2 0x530 SWAP4 SWAP3 CHAINID SWAP3 ADDRESS SWAP3 DUP10 SWAP2 DUP10 SWAP2 ADD PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x557 PUSH2 0x9EC JUMP JUMPDEST PUSH2 0x563 DUP5 DUP5 DUP5 DUP5 PUSH2 0xA8B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x571 PUSH2 0x8B7 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x563 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x5F5 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x692 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x726 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x74A SWAP2 SWAP1 PUSH2 0x1482 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7DF PUSH2 0x8B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x887 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x890 DUP2 PUSH2 0x938 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x89F PUSH2 0x9EC JUMP JUMPDEST PUSH2 0x8AA DUP6 DUP6 DUP6 PUSH2 0xAED JUMP JUMPDEST SWAP2 POP SWAP2 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x60 CALLDATASIZE PUSH1 0x0 PUSH2 0x9C0 PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x149B JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP4 PUSH1 0x20 DUP2 DUP5 SUB SUB PUSH1 0x40 MLOAD SWAP5 POP PUSH1 0x20 DUP2 ADD DUP6 ADD PUSH1 0x40 MSTORE DUP1 DUP6 MSTORE DUP1 DUP3 PUSH1 0x20 DUP8 ADD CALLDATACOPY POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x4A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 CALLDATASIZE DUP2 PUSH2 0xB06 PUSH2 0x1E6 PUSH2 0x120 DUP12 ADD DUP12 PUSH2 0x149B JUMP JUMPDEST SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x40 DUP2 EQ DUP1 PUSH2 0xB1F JUMPI POP PUSH1 0x41 DUP2 EQ JUMPDEST PUSH2 0xBAD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964207369676E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174757265206C656E67746820696E207061796D6173746572416E6444617461 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC10 PUSH2 0xBBD DUP12 DUP8 DUP8 PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 PUSH2 0xC45 DUP4 PUSH2 0x1500 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP PUSH2 0xC8A DUP2 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xD32 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xD07 JUMPI PUSH2 0xCE8 PUSH1 0x1 DUP7 DUP7 PUSH2 0xD56 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0x8AF JUMP JUMPDEST PUSH2 0xD13 PUSH1 0x0 DUP7 DUP7 PUSH2 0xD56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP12 SWAP1 SWAP11 POP SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD41 DUP6 DUP6 PUSH2 0xD8E JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xD4E DUP2 PUSH2 0xDD3 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0xD7E JUMPI PUSH1 0x0 PUSH2 0xD81 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0xDC4 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0xDB8 DUP8 DUP3 DUP6 DUP6 PUSH2 0xF86 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0xDCC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xDE7 JUMPI PUSH2 0xDE7 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xDEF JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE03 JUMPI PUSH2 0xE03 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xE6A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE7E JUMPI PUSH2 0xE7E PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xEE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH2 0xEF9 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0x890 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xFBD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x106C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1065 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x106C JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1087 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x109B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x890 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x10E2 DUP2 PUSH2 0x10A2 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xDCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x115C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1168 DUP6 DUP3 DUP7 ADD PUSH2 0x10F0 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE DUP3 PUSH1 0x60 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x80 DUP5 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x80 DUP5 DUP5 ADD ADD MSTORE PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP4 ADD ADD SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x120D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x123E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x124A DUP7 DUP3 DUP8 ADD PUSH2 0x11DE JUMP JUMPDEST SWAP4 POP POP PUSH2 0x1259 PUSH1 0x20 DUP6 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP2 POP PUSH2 0x1267 PUSH1 0x40 DUP6 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x109B DUP2 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x12B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12DA DUP8 DUP3 DUP9 ADD PUSH2 0x10F0 JUMP JUMPDEST SWAP6 SWAP9 SWAP1 SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1319 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1325 DUP7 DUP3 DUP8 ADD PUSH2 0x11DE JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 SWAP1 SWAP6 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1361 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1345 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x13B9 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x133B JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x13D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x13E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x140E DUP4 PUSH2 0x11F7 JUMP JUMPDEST SWAP2 POP PUSH2 0x141C PUSH1 0x20 DUP5 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0xC0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1438 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x133B JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1494 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x14D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x14EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xDCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1558 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 DUP4 0xE1 0xE1 DUP6 0xBD NOT PUSH31 0x6BD2865E6080B7F4CE6A55D4789313235098115EB8EEA9CA64736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"779:4039:76:-:0;;;1066:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1143:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;1166:34:76::1;;::::0;-1:-1:-1;779:4039:76;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;:::-;779:4039:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_checkOwner_2875":{"entryPoint":2231,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_packValidationData_9980":{"entryPoint":3414,"id":9980,"parameterSlots":3,"returnSlots":1},"@_postOp_7416":{"entryPoint":2699,"id":7416,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":2540,"id":7527,"parameterSlots":0,"returnSlots":0},"@_throwError_5521":{"entryPoint":3539,"id":5521,"parameterSlots":1,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":2360,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_14721":{"entryPoint":2797,"id":14721,"parameterSlots":3,"returnSlots":2},"@addStake_7469":{"entryPoint":842,"id":7469,"parameterSlots":1,"returnSlots":0},"@deposit_7433":{"entryPoint":1871,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@getDeposit_7484":{"entryPoint":1689,"id":7484,"parameterSlots":0,"returnSlots":1},"@getHash_14634":{"entryPoint":1253,"id":14634,"parameterSlots":3,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@pack_14598":{"entryPoint":2477,"id":14598,"parameterSlots":1,"returnSlots":1},"@parsePaymasterAndData_14756":{"entryPoint":1192,"id":14756,"parameterSlots":2,"returnSlots":4},"@postOp_7395":{"entryPoint":1359,"id":7395,"parameterSlots":4,"returnSlots":0},"@recover_5594":{"entryPoint":3378,"id":5594,"parameterSlots":2,"returnSlots":1},"@renounceOwnership_2889":{"entryPoint":1172,"id":2889,"parameterSlots":0,"returnSlots":0},"@senderNonce_14583":{"entryPoint":null,"id":14583,"parameterSlots":0,"returnSlots":0},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@transferOwnership_2912":{"entryPoint":2007,"id":2912,"parameterSlots":1,"returnSlots":0},"@tryRecover_5567":{"entryPoint":3470,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":3974,"id":5735,"parameterSlots":4,"returnSlots":2},"@unlockStake_7496":{"entryPoint":1385,"id":7496,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":2195,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyingSigner_14557":{"entryPoint":null,"id":14557,"parameterSlots":0,"returnSlots":0},"@withdrawStake_7511":{"entryPoint":1517,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1020,"id":7451,"parameterSlots":2,"returnSlots":0},"abi_decode_bytes_calldata":{"entryPoint":4336,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_struct_UserOperation_calldata":{"entryPoint":4574,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":4720,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":4292,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes_calldata_ptr":{"entryPoint":4402,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":4749,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":4845,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48":{"entryPoint":4626,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":5250,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":4213,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint48t_uint48":{"entryPoint":5106,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48":{"entryPoint":4599,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_bytes":{"entryPoint":4923,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":5030,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed":{"entryPoint":5157,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":4468,"id":null,"parameterSlots":5,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":5275,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":5064,"id":null,"parameterSlots":4,"returnSlots":2},"increment_t_uint256":{"entryPoint":5376,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x21":{"entryPoint":5471,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":4258,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:13567:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"899:125:111","statements":[{"nodeType":"YulAssignment","src":"909:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"932:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"909:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"951:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"974:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"962:3:111"},"nodeType":"YulFunctionCall","src":"962:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:74:111"},"nodeType":"YulExpressionStatement","src":"944:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"868:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"879:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"890:4:111","type":""}],"src":"798:226:111"},{"body":{"nodeType":"YulBlock","src":"1101:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"1150:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1159:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1162:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1152:6:111"},"nodeType":"YulFunctionCall","src":"1152:12:111"},"nodeType":"YulExpressionStatement","src":"1152:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1129:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1137:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1125:3:111"},"nodeType":"YulFunctionCall","src":"1125:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"1144:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1121:3:111"},"nodeType":"YulFunctionCall","src":"1121:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1114:6:111"},"nodeType":"YulFunctionCall","src":"1114:35:111"},"nodeType":"YulIf","src":"1111:55:111"},{"nodeType":"YulAssignment","src":"1175:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1198:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1185:12:111"},"nodeType":"YulFunctionCall","src":"1185:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1175:6:111"}]},{"body":{"nodeType":"YulBlock","src":"1248:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1257:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1260:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1250:6:111"},"nodeType":"YulFunctionCall","src":"1250:12:111"},"nodeType":"YulExpressionStatement","src":"1250:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1220:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1228:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1217:2:111"},"nodeType":"YulFunctionCall","src":"1217:30:111"},"nodeType":"YulIf","src":"1214:50:111"},{"nodeType":"YulAssignment","src":"1273:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1289:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1297:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1285:3:111"},"nodeType":"YulFunctionCall","src":"1285:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"1273:8:111"}]},{"body":{"nodeType":"YulBlock","src":"1354:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1363:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1366:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1356:6:111"},"nodeType":"YulFunctionCall","src":"1356:12:111"},"nodeType":"YulExpressionStatement","src":"1356:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1325:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"1333:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1321:3:111"},"nodeType":"YulFunctionCall","src":"1321:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"1342:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1317:3:111"},"nodeType":"YulFunctionCall","src":"1317:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"1349:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1314:2:111"},"nodeType":"YulFunctionCall","src":"1314:39:111"},"nodeType":"YulIf","src":"1311:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1064:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"1072:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"1080:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1090:6:111","type":""}],"src":"1029:347:111"},{"body":{"nodeType":"YulBlock","src":"1470:320:111","statements":[{"body":{"nodeType":"YulBlock","src":"1516:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1525:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1528:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1518:6:111"},"nodeType":"YulFunctionCall","src":"1518:12:111"},"nodeType":"YulExpressionStatement","src":"1518:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1491:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1500:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1487:3:111"},"nodeType":"YulFunctionCall","src":"1487:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1512:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1483:3:111"},"nodeType":"YulFunctionCall","src":"1483:32:111"},"nodeType":"YulIf","src":"1480:52:111"},{"nodeType":"YulVariableDeclaration","src":"1541:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1568:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1555:12:111"},"nodeType":"YulFunctionCall","src":"1555:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1545:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1623:6:111"},"nodeType":"YulFunctionCall","src":"1623:12:111"},"nodeType":"YulExpressionStatement","src":"1623:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1593:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1601:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1590:2:111"},"nodeType":"YulFunctionCall","src":"1590:30:111"},"nodeType":"YulIf","src":"1587:50:111"},{"nodeType":"YulVariableDeclaration","src":"1646:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1702:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1713:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1698:3:111"},"nodeType":"YulFunctionCall","src":"1698:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1722:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1672:25:111"},"nodeType":"YulFunctionCall","src":"1672:58:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"1650:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"1660:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1739:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"1749:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1739:6:111"}]},{"nodeType":"YulAssignment","src":"1766:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"1776:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1766:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1428:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1439:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1451:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1459:6:111","type":""}],"src":"1381:409:111"},{"body":{"nodeType":"YulBlock","src":"1976:458:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1986:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1996:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1990:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2026:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2041:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2049:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2037:3:111"},"nodeType":"YulFunctionCall","src":"2037:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2019:6:111"},"nodeType":"YulFunctionCall","src":"2019:34:111"},"nodeType":"YulExpressionStatement","src":"2019:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2073:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2084:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2069:3:111"},"nodeType":"YulFunctionCall","src":"2069:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2093:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2101:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2089:3:111"},"nodeType":"YulFunctionCall","src":"2089:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2062:6:111"},"nodeType":"YulFunctionCall","src":"2062:43:111"},"nodeType":"YulExpressionStatement","src":"2062:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2125:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2136:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2121:3:111"},"nodeType":"YulFunctionCall","src":"2121:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2141:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2114:6:111"},"nodeType":"YulFunctionCall","src":"2114:30:111"},"nodeType":"YulExpressionStatement","src":"2114:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2164:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2175:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2160:3:111"},"nodeType":"YulFunctionCall","src":"2160:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2180:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2153:6:111"},"nodeType":"YulFunctionCall","src":"2153:34:111"},"nodeType":"YulExpressionStatement","src":"2153:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2224:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2209:3:111"},"nodeType":"YulFunctionCall","src":"2209:19:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2230:6:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2238:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2196:12:111"},"nodeType":"YulFunctionCall","src":"2196:49:111"},"nodeType":"YulExpressionStatement","src":"2196:49:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2269:9:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2280:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2265:3:111"},"nodeType":"YulFunctionCall","src":"2265:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"2289:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2261:3:111"},"nodeType":"YulFunctionCall","src":"2261:32:111"},{"kind":"number","nodeType":"YulLiteral","src":"2295:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2254:6:111"},"nodeType":"YulFunctionCall","src":"2254:43:111"},"nodeType":"YulExpressionStatement","src":"2254:43:111"},{"nodeType":"YulAssignment","src":"2306:122:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2322:9:111"},{"arguments":[{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"2341:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2349:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2337:3:111"},"nodeType":"YulFunctionCall","src":"2337:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2354:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2333:3:111"},"nodeType":"YulFunctionCall","src":"2333:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2318:3:111"},"nodeType":"YulFunctionCall","src":"2318:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"2424:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2314:3:111"},"nodeType":"YulFunctionCall","src":"2314:114:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2306:4:111"}]}]},"name":"abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1921:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1932:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1940:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1948:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1956:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1967:4:111","type":""}],"src":"1795:639:111"},{"body":{"nodeType":"YulBlock","src":"2515:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"2555:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2564:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2567:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2557:6:111"},"nodeType":"YulFunctionCall","src":"2557:12:111"},"nodeType":"YulExpressionStatement","src":"2557:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"2536:3:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2541:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2532:3:111"},"nodeType":"YulFunctionCall","src":"2532:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2550:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2528:3:111"},"nodeType":"YulFunctionCall","src":"2528:26:111"},"nodeType":"YulIf","src":"2525:46:111"},{"nodeType":"YulAssignment","src":"2580:15:111","value":{"name":"offset","nodeType":"YulIdentifier","src":"2589:6:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2580:5:111"}]}]},"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2489:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2497:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2505:5:111","type":""}],"src":"2439:162:111"},{"body":{"nodeType":"YulBlock","src":"2654:119:111","statements":[{"nodeType":"YulAssignment","src":"2664:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2686:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2673:12:111"},"nodeType":"YulFunctionCall","src":"2673:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2664:5:111"}]},{"body":{"nodeType":"YulBlock","src":"2751:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2760:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2763:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2753:6:111"},"nodeType":"YulFunctionCall","src":"2753:12:111"},"nodeType":"YulExpressionStatement","src":"2753:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2715:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2726:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2733:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2722:3:111"},"nodeType":"YulFunctionCall","src":"2722:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2712:2:111"},"nodeType":"YulFunctionCall","src":"2712:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2705:6:111"},"nodeType":"YulFunctionCall","src":"2705:45:111"},"nodeType":"YulIf","src":"2702:65:111"}]},"name":"abi_decode_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2633:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2644:5:111","type":""}],"src":"2606:167:111"},{"body":{"nodeType":"YulBlock","src":"2914:377:111","statements":[{"body":{"nodeType":"YulBlock","src":"2960:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2969:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2972:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2962:6:111"},"nodeType":"YulFunctionCall","src":"2962:12:111"},"nodeType":"YulExpressionStatement","src":"2962:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2935:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2944:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2931:3:111"},"nodeType":"YulFunctionCall","src":"2931:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2956:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2927:3:111"},"nodeType":"YulFunctionCall","src":"2927:32:111"},"nodeType":"YulIf","src":"2924:52:111"},{"nodeType":"YulVariableDeclaration","src":"2985:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3012:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2999:12:111"},"nodeType":"YulFunctionCall","src":"2999:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2989:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3065:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3074:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3077:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3067:6:111"},"nodeType":"YulFunctionCall","src":"3067:12:111"},"nodeType":"YulExpressionStatement","src":"3067:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3037:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3045:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3034:2:111"},"nodeType":"YulFunctionCall","src":"3034:30:111"},"nodeType":"YulIf","src":"3031:50:111"},{"nodeType":"YulAssignment","src":"3090:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3145:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3156:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3141:3:111"},"nodeType":"YulFunctionCall","src":"3141:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3165:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"3100:40:111"},"nodeType":"YulFunctionCall","src":"3100:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3090:6:111"}]},{"nodeType":"YulAssignment","src":"3182:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3214:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3225:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3210:3:111"},"nodeType":"YulFunctionCall","src":"3210:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"3192:17:111"},"nodeType":"YulFunctionCall","src":"3192:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3182:6:111"}]},{"nodeType":"YulAssignment","src":"3238:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3270:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3281:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3266:3:111"},"nodeType":"YulFunctionCall","src":"3266:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"3248:17:111"},"nodeType":"YulFunctionCall","src":"3248:37:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3238:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2864:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2875:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2887:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2895:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2903:6:111","type":""}],"src":"2778:513:111"},{"body":{"nodeType":"YulBlock","src":"3397:76:111","statements":[{"nodeType":"YulAssignment","src":"3407:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3419:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3430:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3415:3:111"},"nodeType":"YulFunctionCall","src":"3415:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3407:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3449:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3460:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3442:6:111"},"nodeType":"YulFunctionCall","src":"3442:25:111"},"nodeType":"YulExpressionStatement","src":"3442:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3366:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3377:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3388:4:111","type":""}],"src":"3296:177:111"},{"body":{"nodeType":"YulBlock","src":"3548:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3594:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3603:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3606:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3596:6:111"},"nodeType":"YulFunctionCall","src":"3596:12:111"},"nodeType":"YulExpressionStatement","src":"3596:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3569:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3578:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3565:3:111"},"nodeType":"YulFunctionCall","src":"3565:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3590:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3561:3:111"},"nodeType":"YulFunctionCall","src":"3561:32:111"},"nodeType":"YulIf","src":"3558:52:111"},{"nodeType":"YulVariableDeclaration","src":"3619:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3645:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3632:12:111"},"nodeType":"YulFunctionCall","src":"3632:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3623:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3697:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3664:32:111"},"nodeType":"YulFunctionCall","src":"3664:39:111"},"nodeType":"YulExpressionStatement","src":"3664:39:111"},{"nodeType":"YulAssignment","src":"3712:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3722:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3712:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3514:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3525:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3537:6:111","type":""}],"src":"3478:255:111"},{"body":{"nodeType":"YulBlock","src":"3839:76:111","statements":[{"nodeType":"YulAssignment","src":"3849:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3861:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3872:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3857:3:111"},"nodeType":"YulFunctionCall","src":"3857:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3849:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3891:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3902:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3884:6:111"},"nodeType":"YulFunctionCall","src":"3884:25:111"},"nodeType":"YulExpressionStatement","src":"3884:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3808:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3819:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3830:4:111","type":""}],"src":"3738:177:111"},{"body":{"nodeType":"YulBlock","src":"4059:498:111","statements":[{"body":{"nodeType":"YulBlock","src":"4105:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4114:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4117:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4107:6:111"},"nodeType":"YulFunctionCall","src":"4107:12:111"},"nodeType":"YulExpressionStatement","src":"4107:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4080:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4089:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4076:3:111"},"nodeType":"YulFunctionCall","src":"4076:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4101:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4072:3:111"},"nodeType":"YulFunctionCall","src":"4072:32:111"},"nodeType":"YulIf","src":"4069:52:111"},{"nodeType":"YulVariableDeclaration","src":"4130:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4156:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4143:12:111"},"nodeType":"YulFunctionCall","src":"4143:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4134:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4199:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4208:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4211:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4201:6:111"},"nodeType":"YulFunctionCall","src":"4201:12:111"},"nodeType":"YulExpressionStatement","src":"4201:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4188:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4195:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4185:2:111"},"nodeType":"YulFunctionCall","src":"4185:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4178:6:111"},"nodeType":"YulFunctionCall","src":"4178:20:111"},"nodeType":"YulIf","src":"4175:40:111"},{"nodeType":"YulAssignment","src":"4224:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4234:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4224:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4248:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4279:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4290:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4275:3:111"},"nodeType":"YulFunctionCall","src":"4275:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4262:12:111"},"nodeType":"YulFunctionCall","src":"4262:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4252:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4337:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4346:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4349:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4339:6:111"},"nodeType":"YulFunctionCall","src":"4339:12:111"},"nodeType":"YulExpressionStatement","src":"4339:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4309:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4317:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4306:2:111"},"nodeType":"YulFunctionCall","src":"4306:30:111"},"nodeType":"YulIf","src":"4303:50:111"},{"nodeType":"YulVariableDeclaration","src":"4362:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4418:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4429:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4414:3:111"},"nodeType":"YulFunctionCall","src":"4414:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4438:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"4388:25:111"},"nodeType":"YulFunctionCall","src":"4388:58:111"},"variables":[{"name":"value1_1","nodeType":"YulTypedName","src":"4366:8:111","type":""},{"name":"value2_1","nodeType":"YulTypedName","src":"4376:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4455:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4465:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4455:6:111"}]},{"nodeType":"YulAssignment","src":"4482:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4492:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4482:6:111"}]},{"nodeType":"YulAssignment","src":"4509:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4536:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4547:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4532:3:111"},"nodeType":"YulFunctionCall","src":"4532:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4519:12:111"},"nodeType":"YulFunctionCall","src":"4519:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4509:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4001:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4012:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4024:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4032:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4040:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4048:6:111","type":""}],"src":"3920:637:111"},{"body":{"nodeType":"YulBlock","src":"4684:125:111","statements":[{"nodeType":"YulAssignment","src":"4694:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4706:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4717:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4702:3:111"},"nodeType":"YulFunctionCall","src":"4702:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4694:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4736:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4751:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4759:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4747:3:111"},"nodeType":"YulFunctionCall","src":"4747:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4729:6:111"},"nodeType":"YulFunctionCall","src":"4729:74:111"},"nodeType":"YulExpressionStatement","src":"4729:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4653:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4664:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4675:4:111","type":""}],"src":"4562:247:111"},{"body":{"nodeType":"YulBlock","src":"4892:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"4938:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4947:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4950:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4940:6:111"},"nodeType":"YulFunctionCall","src":"4940:12:111"},"nodeType":"YulExpressionStatement","src":"4940:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4913:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4922:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4909:3:111"},"nodeType":"YulFunctionCall","src":"4909:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4934:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4905:3:111"},"nodeType":"YulFunctionCall","src":"4905:32:111"},"nodeType":"YulIf","src":"4902:52:111"},{"nodeType":"YulVariableDeclaration","src":"4963:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4989:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4976:12:111"},"nodeType":"YulFunctionCall","src":"4976:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4967:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5041:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"5008:32:111"},"nodeType":"YulFunctionCall","src":"5008:39:111"},"nodeType":"YulExpressionStatement","src":"5008:39:111"},{"nodeType":"YulAssignment","src":"5056:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5066:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5056:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4858:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4869:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4881:6:111","type":""}],"src":"4814:263:111"},{"body":{"nodeType":"YulBlock","src":"5220:367:111","statements":[{"body":{"nodeType":"YulBlock","src":"5266:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5275:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5278:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5268:6:111"},"nodeType":"YulFunctionCall","src":"5268:12:111"},"nodeType":"YulExpressionStatement","src":"5268:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5241:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5250:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5237:3:111"},"nodeType":"YulFunctionCall","src":"5237:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5262:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5233:3:111"},"nodeType":"YulFunctionCall","src":"5233:32:111"},"nodeType":"YulIf","src":"5230:52:111"},{"nodeType":"YulVariableDeclaration","src":"5291:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5318:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5305:12:111"},"nodeType":"YulFunctionCall","src":"5305:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5295:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5371:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5380:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5383:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5373:6:111"},"nodeType":"YulFunctionCall","src":"5373:12:111"},"nodeType":"YulExpressionStatement","src":"5373:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5343:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5351:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5340:2:111"},"nodeType":"YulFunctionCall","src":"5340:30:111"},"nodeType":"YulIf","src":"5337:50:111"},{"nodeType":"YulAssignment","src":"5396:83:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5451:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5462:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5447:3:111"},"nodeType":"YulFunctionCall","src":"5447:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5471:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation_calldata","nodeType":"YulIdentifier","src":"5406:40:111"},"nodeType":"YulFunctionCall","src":"5406:73:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5396:6:111"}]},{"nodeType":"YulAssignment","src":"5488:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5526:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5511:3:111"},"nodeType":"YulFunctionCall","src":"5511:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5498:12:111"},"nodeType":"YulFunctionCall","src":"5498:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5488:6:111"}]},{"nodeType":"YulAssignment","src":"5539:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5577:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5562:3:111"},"nodeType":"YulFunctionCall","src":"5562:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5549:12:111"},"nodeType":"YulFunctionCall","src":"5549:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5539:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5170:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5181:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5193:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5201:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5209:6:111","type":""}],"src":"5082:505:111"},{"body":{"nodeType":"YulBlock","src":"5641:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5651:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5671:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5665:5:111"},"nodeType":"YulFunctionCall","src":"5665:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5655:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5693:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5698:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5686:6:111"},"nodeType":"YulFunctionCall","src":"5686:19:111"},"nodeType":"YulExpressionStatement","src":"5686:19:111"},{"nodeType":"YulVariableDeclaration","src":"5714:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5723:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5718:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5785:110:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5799:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5809:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5803:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5841:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"5846:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5837:3:111"},"nodeType":"YulFunctionCall","src":"5837:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5850:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5833:3:111"},"nodeType":"YulFunctionCall","src":"5833:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5869:5:111"},{"name":"i","nodeType":"YulIdentifier","src":"5876:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5865:3:111"},"nodeType":"YulFunctionCall","src":"5865:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5880:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5861:3:111"},"nodeType":"YulFunctionCall","src":"5861:22:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5855:5:111"},"nodeType":"YulFunctionCall","src":"5855:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5826:6:111"},"nodeType":"YulFunctionCall","src":"5826:59:111"},"nodeType":"YulExpressionStatement","src":"5826:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5744:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5747:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5741:2:111"},"nodeType":"YulFunctionCall","src":"5741:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5755:21:111","statements":[{"nodeType":"YulAssignment","src":"5757:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5766:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5769:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5762:3:111"},"nodeType":"YulFunctionCall","src":"5762:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5757:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5737:3:111","statements":[]},"src":"5733:162:111"},{"body":{"nodeType":"YulBlock","src":"5929:62:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5958:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5963:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5954:3:111"},"nodeType":"YulFunctionCall","src":"5954:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5972:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5950:3:111"},"nodeType":"YulFunctionCall","src":"5950:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"5979:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5943:6:111"},"nodeType":"YulFunctionCall","src":"5943:38:111"},"nodeType":"YulExpressionStatement","src":"5943:38:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5910:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5913:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5907:2:111"},"nodeType":"YulFunctionCall","src":"5907:13:111"},"nodeType":"YulIf","src":"5904:87:111"},{"nodeType":"YulAssignment","src":"6000:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6015:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6028:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6036:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6024:3:111"},"nodeType":"YulFunctionCall","src":"6024:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"6041:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6020:3:111"},"nodeType":"YulFunctionCall","src":"6020:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6011:3:111"},"nodeType":"YulFunctionCall","src":"6011:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"6111:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6007:3:111"},"nodeType":"YulFunctionCall","src":"6007:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"6000:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5618:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"5625:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5633:3:111","type":""}],"src":"5592:530:111"},{"body":{"nodeType":"YulBlock","src":"6274:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6302:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6284:6:111"},"nodeType":"YulFunctionCall","src":"6284:21:111"},"nodeType":"YulExpressionStatement","src":"6284:21:111"},{"nodeType":"YulAssignment","src":"6314:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6339:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6362:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6347:3:111"},"nodeType":"YulFunctionCall","src":"6347:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"6322:16:111"},"nodeType":"YulFunctionCall","src":"6322:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6314:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6386:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6397:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6382:3:111"},"nodeType":"YulFunctionCall","src":"6382:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6402:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6375:6:111"},"nodeType":"YulFunctionCall","src":"6375:34:111"},"nodeType":"YulExpressionStatement","src":"6375:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6235:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6246:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6254:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6265:4:111","type":""}],"src":"6127:288:111"},{"body":{"nodeType":"YulBlock","src":"6519:93:111","statements":[{"nodeType":"YulAssignment","src":"6529:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6541:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6552:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6537:3:111"},"nodeType":"YulFunctionCall","src":"6537:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6529:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6571:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6586:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6594:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6582:3:111"},"nodeType":"YulFunctionCall","src":"6582:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6564:6:111"},"nodeType":"YulFunctionCall","src":"6564:42:111"},"nodeType":"YulExpressionStatement","src":"6564:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6488:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6499:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6510:4:111","type":""}],"src":"6420:192:111"},{"body":{"nodeType":"YulBlock","src":"6762:168:111","statements":[{"nodeType":"YulAssignment","src":"6772:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6784:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6795:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6780:3:111"},"nodeType":"YulFunctionCall","src":"6780:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6772:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6814:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6829:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6837:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6825:3:111"},"nodeType":"YulFunctionCall","src":"6825:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6807:6:111"},"nodeType":"YulFunctionCall","src":"6807:74:111"},"nodeType":"YulExpressionStatement","src":"6807:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6901:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6912:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6897:3:111"},"nodeType":"YulFunctionCall","src":"6897:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6917:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6890:6:111"},"nodeType":"YulFunctionCall","src":"6890:34:111"},"nodeType":"YulExpressionStatement","src":"6890:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6723:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6734:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6742:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6753:4:111","type":""}],"src":"6617:313:111"},{"body":{"nodeType":"YulBlock","src":"7065:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"7103:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7112:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7115:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7105:6:111"},"nodeType":"YulFunctionCall","src":"7105:12:111"},"nodeType":"YulExpressionStatement","src":"7105:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"7081:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"7093:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7078:2:111"},"nodeType":"YulFunctionCall","src":"7078:24:111"},"nodeType":"YulIf","src":"7075:44:111"},{"body":{"nodeType":"YulBlock","src":"7152:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7161:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7164:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7154:6:111"},"nodeType":"YulFunctionCall","src":"7154:12:111"},"nodeType":"YulExpressionStatement","src":"7154:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7134:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"7144:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7131:2:111"},"nodeType":"YulFunctionCall","src":"7131:20:111"},"nodeType":"YulIf","src":"7128:40:111"},{"nodeType":"YulAssignment","src":"7177:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7194:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7202:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7190:3:111"},"nodeType":"YulFunctionCall","src":"7190:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"7177:9:111"}]},{"nodeType":"YulAssignment","src":"7222:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7239:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7249:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7235:3:111"},"nodeType":"YulFunctionCall","src":"7235:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"7222:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"6999:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"7007:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"7015:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"7027:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"7040:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"7051:9:111","type":""}],"src":"6935:331:111"},{"body":{"nodeType":"YulBlock","src":"7356:171:111","statements":[{"body":{"nodeType":"YulBlock","src":"7402:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7411:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7414:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7404:6:111"},"nodeType":"YulFunctionCall","src":"7404:12:111"},"nodeType":"YulExpressionStatement","src":"7404:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7377:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7386:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7373:3:111"},"nodeType":"YulFunctionCall","src":"7373:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7398:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7369:3:111"},"nodeType":"YulFunctionCall","src":"7369:32:111"},"nodeType":"YulIf","src":"7366:52:111"},{"nodeType":"YulAssignment","src":"7427:38:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7455:9:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7437:17:111"},"nodeType":"YulFunctionCall","src":"7437:28:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7427:6:111"}]},{"nodeType":"YulAssignment","src":"7474:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7506:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7517:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7502:3:111"},"nodeType":"YulFunctionCall","src":"7502:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7484:17:111"},"nodeType":"YulFunctionCall","src":"7484:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7474:6:111"}]}]},"name":"abi_decode_tuple_t_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7314:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7325:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7337:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7345:6:111","type":""}],"src":"7271:256:111"},{"body":{"nodeType":"YulBlock","src":"7787:417:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7804:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7815:3:111","type":"","value":"192"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7797:6:111"},"nodeType":"YulFunctionCall","src":"7797:22:111"},"nodeType":"YulExpressionStatement","src":"7797:22:111"},{"nodeType":"YulAssignment","src":"7828:53:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7853:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7865:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7876:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7861:3:111"},"nodeType":"YulFunctionCall","src":"7861:19:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"7836:16:111"},"nodeType":"YulFunctionCall","src":"7836:45:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7828:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7901:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7912:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7897:3:111"},"nodeType":"YulFunctionCall","src":"7897:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7917:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7890:6:111"},"nodeType":"YulFunctionCall","src":"7890:34:111"},"nodeType":"YulExpressionStatement","src":"7890:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7944:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7955:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7940:3:111"},"nodeType":"YulFunctionCall","src":"7940:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"7964:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7972:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7960:3:111"},"nodeType":"YulFunctionCall","src":"7960:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7933:6:111"},"nodeType":"YulFunctionCall","src":"7933:83:111"},"nodeType":"YulExpressionStatement","src":"7933:83:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8047:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8032:3:111"},"nodeType":"YulFunctionCall","src":"8032:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"8052:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8025:6:111"},"nodeType":"YulFunctionCall","src":"8025:34:111"},"nodeType":"YulExpressionStatement","src":"8025:34:111"},{"nodeType":"YulVariableDeclaration","src":"8068:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8078:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8072:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8112:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8123:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8108:3:111"},"nodeType":"YulFunctionCall","src":"8108:19:111"},{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"8133:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8141:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8129:3:111"},"nodeType":"YulFunctionCall","src":"8129:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8101:6:111"},"nodeType":"YulFunctionCall","src":"8101:44:111"},"nodeType":"YulExpressionStatement","src":"8101:44:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8165:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8176:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8161:3:111"},"nodeType":"YulFunctionCall","src":"8161:19:111"},{"arguments":[{"name":"value5","nodeType":"YulIdentifier","src":"8186:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8194:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8182:3:111"},"nodeType":"YulFunctionCall","src":"8182:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8154:6:111"},"nodeType":"YulFunctionCall","src":"8154:44:111"},"nodeType":"YulExpressionStatement","src":"8154:44:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7716:9:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"7727:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"7735:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7743:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7751:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7759:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7767:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7778:4:111","type":""}],"src":"7532:672:111"},{"body":{"nodeType":"YulBlock","src":"8326:125:111","statements":[{"nodeType":"YulAssignment","src":"8336:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8348:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8359:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8344:3:111"},"nodeType":"YulFunctionCall","src":"8344:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8336:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8378:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8393:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8401:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8389:3:111"},"nodeType":"YulFunctionCall","src":"8389:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8371:6:111"},"nodeType":"YulFunctionCall","src":"8371:74:111"},"nodeType":"YulExpressionStatement","src":"8371:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8295:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8306:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8317:4:111","type":""}],"src":"8209:242:111"},{"body":{"nodeType":"YulBlock","src":"8537:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"8583:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8592:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8595:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8585:6:111"},"nodeType":"YulFunctionCall","src":"8585:12:111"},"nodeType":"YulExpressionStatement","src":"8585:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8558:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8567:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8554:3:111"},"nodeType":"YulFunctionCall","src":"8554:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8579:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8550:3:111"},"nodeType":"YulFunctionCall","src":"8550:32:111"},"nodeType":"YulIf","src":"8547:52:111"},{"nodeType":"YulAssignment","src":"8608:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8624:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8618:5:111"},"nodeType":"YulFunctionCall","src":"8618:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8608:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8503:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8514:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8526:6:111","type":""}],"src":"8456:184:111"},{"body":{"nodeType":"YulBlock","src":"8819:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8836:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8847:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8829:6:111"},"nodeType":"YulFunctionCall","src":"8829:21:111"},"nodeType":"YulExpressionStatement","src":"8829:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8870:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8881:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8866:3:111"},"nodeType":"YulFunctionCall","src":"8866:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8886:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8859:6:111"},"nodeType":"YulFunctionCall","src":"8859:30:111"},"nodeType":"YulExpressionStatement","src":"8859:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8909:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8920:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8905:3:111"},"nodeType":"YulFunctionCall","src":"8905:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"8925:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8898:6:111"},"nodeType":"YulFunctionCall","src":"8898:62:111"},"nodeType":"YulExpressionStatement","src":"8898:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8980:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8991:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8976:3:111"},"nodeType":"YulFunctionCall","src":"8976:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"8996:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8969:6:111"},"nodeType":"YulFunctionCall","src":"8969:36:111"},"nodeType":"YulExpressionStatement","src":"8969:36:111"},{"nodeType":"YulAssignment","src":"9014:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9026:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9037:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9022:3:111"},"nodeType":"YulFunctionCall","src":"9022:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9014:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8796:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8810:4:111","type":""}],"src":"8645:402:111"},{"body":{"nodeType":"YulBlock","src":"9226:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9243:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9254:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9236:6:111"},"nodeType":"YulFunctionCall","src":"9236:21:111"},"nodeType":"YulExpressionStatement","src":"9236:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9277:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9288:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9273:3:111"},"nodeType":"YulFunctionCall","src":"9273:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9293:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9266:6:111"},"nodeType":"YulFunctionCall","src":"9266:30:111"},"nodeType":"YulExpressionStatement","src":"9266:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9327:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9312:3:111"},"nodeType":"YulFunctionCall","src":"9312:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"9332:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9305:6:111"},"nodeType":"YulFunctionCall","src":"9305:62:111"},"nodeType":"YulExpressionStatement","src":"9305:62:111"},{"nodeType":"YulAssignment","src":"9376:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9388:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9399:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9384:3:111"},"nodeType":"YulFunctionCall","src":"9384:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9376:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9203:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9217:4:111","type":""}],"src":"9052:356:111"},{"body":{"nodeType":"YulBlock","src":"9507:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9517:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"9556:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9543:12:111"},"nodeType":"YulFunctionCall","src":"9543:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"9521:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9716:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9725:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9728:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9718:6:111"},"nodeType":"YulFunctionCall","src":"9718:12:111"},"nodeType":"YulExpressionStatement","src":"9718:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9591:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9619:12:111"},"nodeType":"YulFunctionCall","src":"9619:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"9635:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9615:3:111"},"nodeType":"YulFunctionCall","src":"9615:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"9646:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9611:3:111"},"nodeType":"YulFunctionCall","src":"9611:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9587:3:111"},"nodeType":"YulFunctionCall","src":"9587:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9580:6:111"},"nodeType":"YulFunctionCall","src":"9580:135:111"},"nodeType":"YulIf","src":"9577:155:111"},{"nodeType":"YulVariableDeclaration","src":"9741:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"9759:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9769:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9755:3:111"},"nodeType":"YulFunctionCall","src":"9755:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"9745:6:111","type":""}]},{"nodeType":"YulAssignment","src":"9797:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9820:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9807:12:111"},"nodeType":"YulFunctionCall","src":"9807:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"9797:6:111"}]},{"body":{"nodeType":"YulBlock","src":"9870:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9879:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9882:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9872:6:111"},"nodeType":"YulFunctionCall","src":"9872:12:111"},"nodeType":"YulExpressionStatement","src":"9872:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"9842:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9850:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9839:2:111"},"nodeType":"YulFunctionCall","src":"9839:30:111"},"nodeType":"YulIf","src":"9836:50:111"},{"nodeType":"YulAssignment","src":"9895:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9907:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9915:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9903:3:111"},"nodeType":"YulFunctionCall","src":"9903:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"9895:4:111"}]},{"body":{"nodeType":"YulBlock","src":"9971:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9980:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9983:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9973:6:111"},"nodeType":"YulFunctionCall","src":"9973:12:111"},"nodeType":"YulExpressionStatement","src":"9973:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"9936:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9946:12:111"},"nodeType":"YulFunctionCall","src":"9946:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"9962:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9942:3:111"},"nodeType":"YulFunctionCall","src":"9942:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"9932:3:111"},"nodeType":"YulFunctionCall","src":"9932:38:111"},"nodeType":"YulIf","src":"9929:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"9464:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"9474:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"9490:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"9496:6:111","type":""}],"src":"9413:580:111"},{"body":{"nodeType":"YulBlock","src":"10172:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10200:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10182:6:111"},"nodeType":"YulFunctionCall","src":"10182:21:111"},"nodeType":"YulExpressionStatement","src":"10182:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10234:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10219:3:111"},"nodeType":"YulFunctionCall","src":"10219:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10239:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10212:6:111"},"nodeType":"YulFunctionCall","src":"10212:30:111"},"nodeType":"YulExpressionStatement","src":"10212:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10262:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10273:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10258:3:111"},"nodeType":"YulFunctionCall","src":"10258:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"10278:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10251:6:111"},"nodeType":"YulFunctionCall","src":"10251:51:111"},"nodeType":"YulExpressionStatement","src":"10251:51:111"},{"nodeType":"YulAssignment","src":"10311:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10323:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10334:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10319:3:111"},"nodeType":"YulFunctionCall","src":"10319:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10311:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10149:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10163:4:111","type":""}],"src":"9998:345:111"},{"body":{"nodeType":"YulBlock","src":"10522:163:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10539:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10550:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10532:6:111"},"nodeType":"YulFunctionCall","src":"10532:21:111"},"nodeType":"YulExpressionStatement","src":"10532:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10573:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10584:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10569:3:111"},"nodeType":"YulFunctionCall","src":"10569:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10589:2:111","type":"","value":"13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10562:6:111"},"nodeType":"YulFunctionCall","src":"10562:30:111"},"nodeType":"YulExpressionStatement","src":"10562:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10612:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10623:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10608:3:111"},"nodeType":"YulFunctionCall","src":"10608:18:111"},{"hexValue":"6d757374206f76657272696465","kind":"string","nodeType":"YulLiteral","src":"10628:15:111","type":"","value":"must override"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10601:6:111"},"nodeType":"YulFunctionCall","src":"10601:43:111"},"nodeType":"YulExpressionStatement","src":"10601:43:111"},{"nodeType":"YulAssignment","src":"10653:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10665:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10676:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10661:3:111"},"nodeType":"YulFunctionCall","src":"10661:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10653:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10499:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10513:4:111","type":""}],"src":"10348:337:111"},{"body":{"nodeType":"YulBlock","src":"10864:254:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10881:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10892:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10874:6:111"},"nodeType":"YulFunctionCall","src":"10874:21:111"},"nodeType":"YulExpressionStatement","src":"10874:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10915:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10926:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10911:3:111"},"nodeType":"YulFunctionCall","src":"10911:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10931:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10904:6:111"},"nodeType":"YulFunctionCall","src":"10904:30:111"},"nodeType":"YulExpressionStatement","src":"10904:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10954:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10965:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10950:3:111"},"nodeType":"YulFunctionCall","src":"10950:18:111"},{"hexValue":"566572696679696e675061796d61737465723a20696e76616c6964207369676e","kind":"string","nodeType":"YulLiteral","src":"10970:34:111","type":"","value":"VerifyingPaymaster: invalid sign"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10943:6:111"},"nodeType":"YulFunctionCall","src":"10943:62:111"},"nodeType":"YulExpressionStatement","src":"10943:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11025:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11036:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11021:3:111"},"nodeType":"YulFunctionCall","src":"11021:18:111"},{"hexValue":"6174757265206c656e67746820696e207061796d6173746572416e6444617461","kind":"string","nodeType":"YulLiteral","src":"11041:34:111","type":"","value":"ature length in paymasterAndData"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11014:6:111"},"nodeType":"YulFunctionCall","src":"11014:62:111"},"nodeType":"YulExpressionStatement","src":"11014:62:111"},{"nodeType":"YulAssignment","src":"11085:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11097:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11108:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11093:3:111"},"nodeType":"YulFunctionCall","src":"11093:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11085:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10841:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10855:4:111","type":""}],"src":"10690:428:111"},{"body":{"nodeType":"YulBlock","src":"11170:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"11269:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11290:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11293:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11283:6:111"},"nodeType":"YulFunctionCall","src":"11283:88:111"},"nodeType":"YulExpressionStatement","src":"11283:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11391:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11394:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11384:6:111"},"nodeType":"YulFunctionCall","src":"11384:15:111"},"nodeType":"YulExpressionStatement","src":"11384:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11419:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11422:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11412:6:111"},"nodeType":"YulFunctionCall","src":"11412:15:111"},"nodeType":"YulExpressionStatement","src":"11412:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11186:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11193:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"11183:2:111"},"nodeType":"YulFunctionCall","src":"11183:77:111"},"nodeType":"YulIf","src":"11180:257:111"},{"nodeType":"YulAssignment","src":"11446:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11457:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11464:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11453:3:111"},"nodeType":"YulFunctionCall","src":"11453:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"11446:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"11152:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"11162:3:111","type":""}],"src":"11123:349:111"},{"body":{"nodeType":"YulBlock","src":"11697:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11714:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11719:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11707:6:111"},"nodeType":"YulFunctionCall","src":"11707:79:111"},"nodeType":"YulExpressionStatement","src":"11707:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11806:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11811:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11802:3:111"},"nodeType":"YulFunctionCall","src":"11802:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"11816:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11795:6:111"},"nodeType":"YulFunctionCall","src":"11795:28:111"},"nodeType":"YulExpressionStatement","src":"11795:28:111"},{"nodeType":"YulAssignment","src":"11832:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11843:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11848:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11839:3:111"},"nodeType":"YulFunctionCall","src":"11839:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"11832:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"11673:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11678:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"11689:3:111","type":""}],"src":"11477:380:111"},{"body":{"nodeType":"YulBlock","src":"11894:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11911:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11914:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11904:6:111"},"nodeType":"YulFunctionCall","src":"11904:88:111"},"nodeType":"YulExpressionStatement","src":"11904:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12008:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12011:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12001:6:111"},"nodeType":"YulFunctionCall","src":"12001:15:111"},"nodeType":"YulExpressionStatement","src":"12001:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12032:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12035:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12025:6:111"},"nodeType":"YulFunctionCall","src":"12025:15:111"},"nodeType":"YulExpressionStatement","src":"12025:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"11862:184:111"},{"body":{"nodeType":"YulBlock","src":"12225:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12242:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12253:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12235:6:111"},"nodeType":"YulFunctionCall","src":"12235:21:111"},"nodeType":"YulExpressionStatement","src":"12235:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12276:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12287:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12272:3:111"},"nodeType":"YulFunctionCall","src":"12272:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12292:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12265:6:111"},"nodeType":"YulFunctionCall","src":"12265:30:111"},"nodeType":"YulExpressionStatement","src":"12265:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12315:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12326:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12311:3:111"},"nodeType":"YulFunctionCall","src":"12311:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"12331:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12304:6:111"},"nodeType":"YulFunctionCall","src":"12304:54:111"},"nodeType":"YulExpressionStatement","src":"12304:54:111"},{"nodeType":"YulAssignment","src":"12367:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12379:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12390:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12375:3:111"},"nodeType":"YulFunctionCall","src":"12375:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12367:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12202:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12216:4:111","type":""}],"src":"12051:348:111"},{"body":{"nodeType":"YulBlock","src":"12578:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12595:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12606:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12588:6:111"},"nodeType":"YulFunctionCall","src":"12588:21:111"},"nodeType":"YulExpressionStatement","src":"12588:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12629:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12640:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12625:3:111"},"nodeType":"YulFunctionCall","src":"12625:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12645:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12618:6:111"},"nodeType":"YulFunctionCall","src":"12618:30:111"},"nodeType":"YulExpressionStatement","src":"12618:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12668:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12679:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12664:3:111"},"nodeType":"YulFunctionCall","src":"12664:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"12684:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12657:6:111"},"nodeType":"YulFunctionCall","src":"12657:61:111"},"nodeType":"YulExpressionStatement","src":"12657:61:111"},{"nodeType":"YulAssignment","src":"12727:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12739:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12750:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12735:3:111"},"nodeType":"YulFunctionCall","src":"12735:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12727:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12555:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12569:4:111","type":""}],"src":"12404:355:111"},{"body":{"nodeType":"YulBlock","src":"12938:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12966:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12948:6:111"},"nodeType":"YulFunctionCall","src":"12948:21:111"},"nodeType":"YulExpressionStatement","src":"12948:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12989:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13000:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12985:3:111"},"nodeType":"YulFunctionCall","src":"12985:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13005:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12978:6:111"},"nodeType":"YulFunctionCall","src":"12978:30:111"},"nodeType":"YulExpressionStatement","src":"12978:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13028:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13039:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13024:3:111"},"nodeType":"YulFunctionCall","src":"13024:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"13044:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13017:6:111"},"nodeType":"YulFunctionCall","src":"13017:62:111"},"nodeType":"YulExpressionStatement","src":"13017:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13099:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13110:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13095:3:111"},"nodeType":"YulFunctionCall","src":"13095:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"13115:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13088:6:111"},"nodeType":"YulFunctionCall","src":"13088:32:111"},"nodeType":"YulExpressionStatement","src":"13088:32:111"},{"nodeType":"YulAssignment","src":"13129:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13141:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13152:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13137:3:111"},"nodeType":"YulFunctionCall","src":"13137:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13129:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12915:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12929:4:111","type":""}],"src":"12764:398:111"},{"body":{"nodeType":"YulBlock","src":"13348:217:111","statements":[{"nodeType":"YulAssignment","src":"13358:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13370:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13381:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13366:3:111"},"nodeType":"YulFunctionCall","src":"13366:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13358:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13401:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"13412:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13394:6:111"},"nodeType":"YulFunctionCall","src":"13394:25:111"},"nodeType":"YulExpressionStatement","src":"13394:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13439:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13450:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13435:3:111"},"nodeType":"YulFunctionCall","src":"13435:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"13459:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13467:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13455:3:111"},"nodeType":"YulFunctionCall","src":"13455:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13428:6:111"},"nodeType":"YulFunctionCall","src":"13428:45:111"},"nodeType":"YulExpressionStatement","src":"13428:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13504:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13489:3:111"},"nodeType":"YulFunctionCall","src":"13489:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"13509:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13482:6:111"},"nodeType":"YulFunctionCall","src":"13482:34:111"},"nodeType":"YulExpressionStatement","src":"13482:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13536:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13547:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13532:3:111"},"nodeType":"YulFunctionCall","src":"13532:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"13552:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13525:6:111"},"nodeType":"YulFunctionCall","src":"13525:34:111"},"nodeType":"YulExpressionStatement","src":"13525:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13293:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"13304:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13312:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13320:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13328:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13339:4:111","type":""}],"src":"13167:398:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_encode_tuple_t_uint48_t_uint48_t_bytes_calldata_ptr__to_t_uint48_t_uint48_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n let _1 := 0xffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), 96)\n mstore(add(headStart, 96), value3)\n calldatacopy(add(headStart, 128), value2, value3)\n mstore(add(add(headStart, value3), 128), 0)\n tail := add(add(headStart, and(add(value3, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 128)\n }\n function abi_decode_struct_UserOperation_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 352) { revert(0, 0) }\n value := offset\n }\n function abi_decode_uint48(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_uint48t_uint48(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n value1 := abi_decode_uint48(add(headStart, 32))\n value2 := abi_decode_uint48(add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value1_1, value2_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value1 := value1_1\n value2 := value2_1\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation_calldata(add(headStart, offset), dataEnd)\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(pos, length), 0x20), 0)\n }\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function abi_decode_tuple_t_uint48t_uint48(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_uint48(headStart)\n value1 := abi_decode_uint48(add(headStart, 32))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__to_t_bytes_memory_ptr_t_uint256_t_address_t_uint256_t_uint48_t_uint48__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 192)\n tail := abi_encode_bytes(value0, add(headStart, 192))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 96), value3)\n let _1 := 0xffffffffffff\n mstore(add(headStart, 128), and(value4, _1))\n mstore(add(headStart, 160), and(value5, _1))\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 13)\n mstore(add(headStart, 64), \"must override\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_c0ccd72718b49b9af08aac30156bc47d10e177349cbe5dac0a36b471195929a7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), \"VerifyingPaymaster: invalid sign\")\n mstore(add(headStart, 96), \"ature length in paymasterAndData\")\n tail := add(headStart, 128)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":648},{"length":32,"start":902},{"length":32,"start":1104},{"length":32,"start":1395},{"length":32,"start":1594},{"length":32,"start":1738},{"length":32,"start":1917},{"length":32,"start":2564}],"14557":[{"length":32,"start":319},{"length":32,"start":3234}]},"linkReferences":{},"object":"6080604052600436106100f35760003560e01c8063a9a234091161008a578063c399ec8811610059578063c399ec88146102df578063d0e30db0146102f4578063f2fde38b146102fc578063f465c77e1461031c57600080fd5b8063a9a2340914610256578063b0d691fe14610276578063bb9fe6bf146102aa578063c23a5cea146102bf57600080fd5b80638da5cb5b116100c65780638da5cb5b146101a057806394d4ad60146101cb57806394e1fc19146101fb5780639c90b4431461022957600080fd5b80630396cb60146100f8578063205c28781461010d57806323d9ac9b1461012d578063715018a61461018b575b600080fd5b61010b610106366004611075565b61034a565b005b34801561011957600080fd5b5061010b6101283660046110c4565b6103fc565b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561019757600080fd5b5061010b610494565b3480156101ac57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610161565b3480156101d757600080fd5b506101eb6101e6366004611132565b6104a8565b6040516101829493929190611174565b34801561020757600080fd5b5061021b610216366004611212565b6104e5565b604051908152602001610182565b34801561023557600080fd5b5061021b610244366004611270565b60016020526000908152604090205481565b34801561026257600080fd5b5061010b61027136600461128d565b61054f565b34801561028257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b657600080fd5b5061010b610569565b3480156102cb57600080fd5b5061010b6102da366004611270565b6105ed565b3480156102eb57600080fd5b5061021b610699565b61010b61074f565b34801561030857600080fd5b5061010b610317366004611270565b6107d7565b34801561032857600080fd5b5061033c6103373660046112ed565b610893565b6040516101829291906113a6565b6103526108b7565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156103e057600080fd5b505af11580156103f4573d6000803e3d6000fd5b505050505050565b6104046108b7565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156103e057600080fd5b61049c6108b7565b6104a66000610938565b565b60008036816104bb6054601487896113c8565b8101906104c891906113f2565b90945092506104da85605481896113c8565b949793965094505050565b60006104f0846109ad565b73ffffffffffffffffffffffffffffffffffffffff8535166000908152600160209081526040918290205491516105309392469230928991899101611425565b6040516020818303038152906040528051906020012090509392505050565b6105576109ec565b61056384848484610a8b565b50505050565b6105716108b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105d957600080fd5b505af1158015610563573d6000803e3d6000fd5b6105f56108b7565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190611482565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561067e57600080fd5b6107df6108b7565b73ffffffffffffffffffffffffffffffffffffffff8116610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61089081610938565b50565b6060600061089f6109ec565b6108aa858585610aed565b915091505b935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60603660006109c061012085018561149b565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161087e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f7665727269646500000000000000000000000000000000000000604482015260640161087e565b6060600080803681610b066101e66101208b018b61149b565b929650909450925090506040811480610b1f5750604181145b610bad57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e6444617461606482015260840161087e565b6000610c10610bbd8b87876104e5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8b35166000908152600160205260408120805492935090610c4583611500565b9190505550610c8a8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d3292505050565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610d0757610ce860018686610d56565b60405180602001604052806000815250909650965050505050506108af565b610d1360008686610d56565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610d418585610d8e565b91509150610d4e81610dd3565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610d7e576000610d81565b60015b60ff161717949350505050565b6000808251604103610dc45760208301516040840151606085015160001a610db887828585610f86565b94509450505050610dcc565b506000905060025b9250929050565b6000816004811115610de757610de761155f565b03610def5750565b6001816004811115610e0357610e0361155f565b03610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161087e565b6002816004811115610e7e57610e7e61155f565b03610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161087e565b6003816004811115610ef957610ef961155f565b03610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161087e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fbd575060009050600361106c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611011573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166110655760006001925092505061106c565b9150600090505b94509492505050565b60006020828403121561108757600080fd5b813563ffffffff8116811461109b57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461089057600080fd5b600080604083850312156110d757600080fd5b82356110e2816110a2565b946020939093013593505050565b60008083601f84011261110257600080fd5b50813567ffffffffffffffff81111561111a57600080fd5b602083019150836020828501011115610dcc57600080fd5b6000806020838503121561114557600080fd5b823567ffffffffffffffff81111561115c57600080fd5b611168858286016110f0565b90969095509350505050565b600065ffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b600061016082840312156111f157600080fd5b50919050565b803565ffffffffffff8116811461120d57600080fd5b919050565b60008060006060848603121561122757600080fd5b833567ffffffffffffffff81111561123e57600080fd5b61124a868287016111de565b935050611259602085016111f7565b9150611267604085016111f7565b90509250925092565b60006020828403121561128257600080fd5b813561109b816110a2565b600080600080606085870312156112a357600080fd5b8435600381106112b257600080fd5b9350602085013567ffffffffffffffff8111156112ce57600080fd5b6112da878288016110f0565b9598909750949560400135949350505050565b60008060006060848603121561130257600080fd5b833567ffffffffffffffff81111561131957600080fd5b611325868287016111de565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561136157602081850181015186830182015201611345565b81811115611373576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006113b9604083018561133b565b90508260208301529392505050565b600080858511156113d857600080fd5b838611156113e557600080fd5b5050820193919092039150565b6000806040838503121561140557600080fd5b61140e836111f7565b915061141c602084016111f7565b90509250929050565b60c08152600061143860c083018961133b565b60208301979097525073ffffffffffffffffffffffffffffffffffffffff949094166040850152606084019290925265ffffffffffff90811660808401521660a090910152919050565b60006020828403121561149457600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114d057600080fd5b83018035915067ffffffffffffffff8211156114eb57600080fd5b602001915036819003821315610dcc57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220b083e1e185bd197e6bd2865e6080b7f4ce6a55d4789313235098115eb8eea9ca64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xF3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA9A23409 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x2F4 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x31C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x94D4AD60 EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x94E1FC19 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x9C90B443 EQ PUSH2 0x229 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xF8 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0x23D9AC9B EQ PUSH2 0x12D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x18B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10B PUSH2 0x106 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x34A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x128 CALLDATASIZE PUSH1 0x4 PUSH2 0x10C4 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x161 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x494 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x161 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EB PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1132 JUMP JUMPDEST PUSH2 0x4A8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x182 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1174 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x216 CALLDATASIZE PUSH1 0x4 PUSH2 0x1212 JUMP JUMPDEST PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x182 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x244 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x128D JUMP JUMPDEST PUSH2 0x54F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x161 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x569 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x2DA CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x5ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21B PUSH2 0x699 JUMP JUMPDEST PUSH2 0x10B PUSH2 0x74F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x7D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x33C PUSH2 0x337 CALLDATASIZE PUSH1 0x4 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x893 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x182 SWAP3 SWAP2 SWAP1 PUSH2 0x13A6 JUMP JUMPDEST PUSH2 0x352 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x404 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x49C PUSH2 0x8B7 JUMP JUMPDEST PUSH2 0x4A6 PUSH1 0x0 PUSH2 0x938 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE DUP2 PUSH2 0x4BB PUSH1 0x54 PUSH1 0x14 DUP8 DUP10 PUSH2 0x13C8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4C8 SWAP2 SWAP1 PUSH2 0x13F2 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP PUSH2 0x4DA DUP6 PUSH1 0x54 DUP2 DUP10 PUSH2 0x13C8 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F0 DUP5 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD SWAP2 MLOAD PUSH2 0x530 SWAP4 SWAP3 CHAINID SWAP3 ADDRESS SWAP3 DUP10 SWAP2 DUP10 SWAP2 ADD PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x557 PUSH2 0x9EC JUMP JUMPDEST PUSH2 0x563 DUP5 DUP5 DUP5 DUP5 PUSH2 0xA8B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x571 PUSH2 0x8B7 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x563 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x5F5 PUSH2 0x8B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x692 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x726 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x74A SWAP2 SWAP1 PUSH2 0x1482 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7DF PUSH2 0x8B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x887 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x890 DUP2 PUSH2 0x938 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x89F PUSH2 0x9EC JUMP JUMPDEST PUSH2 0x8AA DUP6 DUP6 DUP6 PUSH2 0xAED JUMP JUMPDEST SWAP2 POP SWAP2 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x60 CALLDATASIZE PUSH1 0x0 PUSH2 0x9C0 PUSH2 0x120 DUP6 ADD DUP6 PUSH2 0x149B JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP4 PUSH1 0x20 DUP2 DUP5 SUB SUB PUSH1 0x40 MLOAD SWAP5 POP PUSH1 0x20 DUP2 ADD DUP6 ADD PUSH1 0x40 MSTORE DUP1 DUP6 MSTORE DUP1 DUP3 PUSH1 0x20 DUP8 ADD CALLDATACOPY POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x4A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 CALLDATASIZE DUP2 PUSH2 0xB06 PUSH2 0x1E6 PUSH2 0x120 DUP12 ADD DUP12 PUSH2 0x149B JUMP JUMPDEST SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x40 DUP2 EQ DUP1 PUSH2 0xB1F JUMPI POP PUSH1 0x41 DUP2 EQ JUMPDEST PUSH2 0xBAD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x566572696679696E675061796D61737465723A20696E76616C6964207369676E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6174757265206C656E67746820696E207061796D6173746572416E6444617461 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC10 PUSH2 0xBBD DUP12 DUP8 DUP8 PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 CALLDATALOAD AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 PUSH2 0xC45 DUP4 PUSH2 0x1500 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP PUSH2 0xC8A DUP2 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xD32 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xD07 JUMPI PUSH2 0xCE8 PUSH1 0x1 DUP7 DUP7 PUSH2 0xD56 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0x8AF JUMP JUMPDEST PUSH2 0xD13 PUSH1 0x0 DUP7 DUP7 PUSH2 0xD56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP12 SWAP1 SWAP11 POP SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD41 DUP6 DUP6 PUSH2 0xD8E JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0xD4E DUP2 PUSH2 0xDD3 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0xD7E JUMPI PUSH1 0x0 PUSH2 0xD81 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0xDC4 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0xDB8 DUP8 DUP3 DUP6 DUP6 PUSH2 0xF86 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0xDCC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xDE7 JUMPI PUSH2 0xDE7 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xDEF JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE03 JUMPI PUSH2 0xE03 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xE6A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE7E JUMPI PUSH2 0xE7E PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0xEE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH2 0xEF9 PUSH2 0x155F JUMP JUMPDEST SUB PUSH2 0x890 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x87E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xFBD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x106C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1065 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x106C JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1087 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x109B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x890 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x10E2 DUP2 PUSH2 0x10A2 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xDCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x115C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1168 DUP6 DUP3 DUP7 ADD PUSH2 0x10F0 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP8 AND DUP4 MSTORE DUP1 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE POP PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE DUP3 PUSH1 0x60 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x80 DUP5 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x80 DUP5 DUP5 ADD ADD MSTORE PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP4 ADD ADD SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x120D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x123E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x124A DUP7 DUP3 DUP8 ADD PUSH2 0x11DE JUMP JUMPDEST SWAP4 POP POP PUSH2 0x1259 PUSH1 0x20 DUP6 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP2 POP PUSH2 0x1267 PUSH1 0x40 DUP6 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x109B DUP2 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x12B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12DA DUP8 DUP3 DUP9 ADD PUSH2 0x10F0 JUMP JUMPDEST SWAP6 SWAP9 SWAP1 SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1319 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1325 DUP7 DUP3 DUP8 ADD PUSH2 0x11DE JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 SWAP1 SWAP6 ADD CALLDATALOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1361 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1345 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x13B9 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x133B JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x13D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x13E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x140E DUP4 PUSH2 0x11F7 JUMP JUMPDEST SWAP2 POP PUSH2 0x141C PUSH1 0x20 DUP5 ADD PUSH2 0x11F7 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0xC0 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1438 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x133B JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1494 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x14D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x14EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xDCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1558 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 DUP4 0xE1 0xE1 DUP6 0xBD NOT PUSH31 0x6BD2865E6080B7F4CE6A55D4789313235098115EB8EEA9CA64736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"779:4039:76:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;907:40:76:-;;;;;;;;;;;;;;;;;;974:42:111;962:55;;;944:74;;932:2;917:18;907:40:76;;;;;;;;1831:101:24;;;;;;;;;;;;;:::i;1201:85::-;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;4481:335:76;;;;;;;;;;-1:-1:-1;4481:335:76;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2409:464::-;;;;;;;;;;-1:-1:-1;2409:464:76;;;;;:::i;:::-;;:::i;:::-;;;3442:25:111;;;3430:2;3415:18;2409:464:76;3296:177:111;1213:46:76;;;;;;;;;;-1:-1:-1;1213:46:76;;;;;:::i;:::-;;;;;;;;;;;;;;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;2474:105::-;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;6594:10:111;6582:23;;3173:55:52::1;::::0;::::1;6564:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;6537:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;6825:55:111::0;;;2817:46:52::1;::::0;::::1;6807:74:111::0;6897:18;;;6890:34;;;2817:10:52::1;:21;::::0;::::1;::::0;6780:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1831:101:24::0;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;4481:335:76:-;4565:17;;4603:24;4565:17;4677:57;1057:2;1004;4677:16;;:57;:::i;:::-;4666:86;;;;;;;:::i;:::-;4639:113;;-1:-1:-1;4639:113:76;-1:-1:-1;4774:35:76;:16;1057:2;4774:16;;:35;:::i;:::-;4481:335;;;;-1:-1:-1;4762:47:76;-1:-1:-1;;;4481:335:76:o;2409:464::-;2520:7;2672:12;2677:6;2672:4;:12::i;:::-;2764:31;1889:20:64;;2764:31:76;;;;;:11;:31;;;;;;;;;;2644:221;;;;;2702:13;;2741:4;;2813:10;;2841;;2644:221;;:::i;:::-;;;;;;;;;;;;;2634:232;;;;;;2627:239;;2409:464;;;;;:::o;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;962:55:111::0;;;3975:41:52::1;::::0;::::1;944:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;917:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;944:74:111;3361:7:52;;3387:10;:20;;;;;917:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;944:74:111;2518:10:52;:20;;;;;2547:9;;917:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;8847:2:111;2161:73:24::1;::::0;::::1;8829:21:111::0;8886:2;8866:18;;;8859:30;8925:34;8905:18;;;8898:62;8996:8;8976:18;;;8969:36;9022:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;9254:2:111;1414:68:24;;;9236:21:111;;;9273:18;;;9266:30;9332:34;9312:18;;;9305:62;9384:18;;1414:68:24;9052:356:111;2433:187:24;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;1266:729:76:-;1334:16;1431:18;;1452:23;;;;:6;:23;:::i;:::-;1431:44;;;;1762:6;1818:2;1812:3;1800:10;1796:20;1792:29;1847:4;1841:11;1834:18;;1896:2;1891:3;1887:12;1882:3;1878:22;1872:4;1865:36;1926:3;1921;1914:16;1975:3;1970;1965:2;1960:3;1956:12;1943:36;;;1737:252;;1266:729;;;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;10200:2:111;4148:67:52;;;10182:21:111;10239:2;10219:18;;;10212:30;10278:23;10258:18;;;10251:51;10319:18;;4148:67:52;9998:345:111;2089:285:52;2344:23;;;;;10550:2:111;2344:23:52;;;10532:21:111;10589:2;10569:18;;;10562:30;10628:15;10608:18;;;10601:43;10661:18;;2344:23:52;10348:337:111;3213:1262:76;3358:20;3380:22;;;3481:24;3380:22;3509:46;3531:23;;;;:6;:23;:::i;3509:46::-;3442:113;;-1:-1:-1;3442:113:76;;-1:-1:-1;3442:113:76;-1:-1:-1;3442:113:76;-1:-1:-1;3796:2:76;3776:22;;;:48;;-1:-1:-1;3822:2:76;3802:22;;3776:48;3768:125;;;;;;;;10892:2:111;3768:125:76;;;10874:21:111;10911:18;;;10904:30;;;;10970:34;10950:18;;;10943:62;11041:34;11021:18;;;11014:62;11093:19;;3768:125:76;10690:428:111;3768:125:76;3903:12;3918:69;3947:39;3955:6;3963:10;3975;3947:7;:39::i;:::-;7455:58:47;;11719:66:111;7455:58:47;;;11707:79:111;11802:12;;;11795:28;;;7325:7:47;;11839:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;3918:69:76;3997:31;1889:20:64;;3997:31:76;;;;;:11;:31;;;;;:33;;3903:84;;-1:-1:-1;3997:31:76;:33;;;:::i;:::-;;;;;;4138:30;4152:4;4158:9;;4138:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4138:13:76;;-1:-1:-1;;;4138:30:76:i;:::-;4119:49;;:15;:49;;;4115:139;;4195:47;4215:4;4220:10;4231;4195:19;:47::i;:::-;4184:59;;;;;;;;;;;;;;;;;;;;;;;;4115:139;4419:48;4439:5;4445:10;4456;4419:19;:48::i;:::-;4408:60;;;;;;;;;-1:-1:-1;4408:60:76;;;;;-1:-1:-1;3213:1262:76;-1:-1:-1;;;;;;;;;3213:1262:76:o;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;3661:227;-1:-1:-1;;;3661:227:47:o;2956:218:54:-;3053:7;3157:8;3141:10;3133:19;;:33;;3125:3;3110:10;3102:19;;:26;;3080:9;:17;;3096:1;3080:17;;;3092:1;3080:17;3079:50;;;:88;;2956:218;-1:-1:-1;;;;2956:218:54:o;2145:730:47:-;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;;;;12253:2:111;788:34:47;;;12235:21:111;12292:2;12272:18;;;12265:30;12331:26;12311:18;;;12304:54;12375:18;;788:34:47;12051:348:111;730:345:47;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;;;;12606:2:111;903:41:47;;;12588:21:111;12645:2;12625:18;;;12618:30;12684:33;12664:18;;;12657:61;12735:18;;903:41:47;12404:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;;;;12966:2:111;1020:44:47;;;12948:21:111;13005:2;12985:18;;;12978:30;13044:34;13024:18;;;13017:62;13115:4;13095:18;;;13088:32;13137:19;;1020:44:47;12764:398:111;5069:1494:47;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;13394:25:111;;;13467:4;13455:17;;13435:18;;;13428:45;;;;13489:18;;;13482:34;;;13532:18;;;13525:34;;;6374:24:47;;13366:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;;;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1029:347::-;1080:8;1090:6;1144:3;1137:4;1129:6;1125:17;1121:27;1111:55;;1162:1;1159;1152:12;1111:55;-1:-1:-1;1185:20:111;;1228:18;1217:30;;1214:50;;;1260:1;1257;1250:12;1214:50;1297:4;1289:6;1285:17;1273:29;;1349:3;1342:4;1333:6;1325;1321:19;1317:30;1314:39;1311:59;;;1366:1;1363;1356:12;1381:409;1451:6;1459;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1568:9;1555:23;1601:18;1593:6;1590:30;1587:50;;;1633:1;1630;1623:12;1587:50;1672:58;1722:7;1713:6;1702:9;1698:22;1672:58;:::i;:::-;1749:8;;1646:84;;-1:-1:-1;1381:409:111;-1:-1:-1;;;;1381:409:111:o;1795:639::-;1967:4;1996:14;2049:2;2041:6;2037:15;2026:9;2019:34;2101:2;2093:6;2089:15;2084:2;2073:9;2069:18;2062:43;;2141:2;2136;2125:9;2121:18;2114:30;2180:6;2175:2;2164:9;2160:18;2153:34;2238:6;2230;2224:3;2213:9;2209:19;2196:49;2295:1;2289:3;2280:6;2269:9;2265:22;2261:32;2254:43;2424:3;2354:66;2349:2;2341:6;2337:15;2333:88;2322:9;2318:104;2314:114;2306:122;;1795:639;;;;;;;:::o;2439:162::-;2505:5;2550:3;2541:6;2536:3;2532:16;2528:26;2525:46;;;2567:1;2564;2557:12;2525:46;-1:-1:-1;2589:6:111;2439:162;-1:-1:-1;2439:162:111:o;2606:167::-;2673:20;;2733:14;2722:26;;2712:37;;2702:65;;2763:1;2760;2753:12;2702:65;2606:167;;;:::o;2778:513::-;2887:6;2895;2903;2956:2;2944:9;2935:7;2931:23;2927:32;2924:52;;;2972:1;2969;2962:12;2924:52;3012:9;2999:23;3045:18;3037:6;3034:30;3031:50;;;3077:1;3074;3067:12;3031:50;3100:73;3165:7;3156:6;3145:9;3141:22;3100:73;:::i;:::-;3090:83;;;3192:37;3225:2;3214:9;3210:18;3192:37;:::i;:::-;3182:47;;3248:37;3281:2;3270:9;3266:18;3248:37;:::i;:::-;3238:47;;2778:513;;;;;:::o;3478:255::-;3537:6;3590:2;3578:9;3569:7;3565:23;3561:32;3558:52;;;3606:1;3603;3596:12;3558:52;3645:9;3632:23;3664:39;3697:5;3664:39;:::i;3920:637::-;4024:6;4032;4040;4048;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4156:9;4143:23;4195:1;4188:5;4185:12;4175:40;;4211:1;4208;4201:12;4175:40;4234:5;-1:-1:-1;4290:2:111;4275:18;;4262:32;4317:18;4306:30;;4303:50;;;4349:1;4346;4339:12;4303:50;4388:58;4438:7;4429:6;4418:9;4414:22;4388:58;:::i;:::-;3920:637;;4465:8;;-1:-1:-1;4362:84:111;;4547:2;4532:18;4519:32;;3920:637;-1:-1:-1;;;;3920:637:111:o;5082:505::-;5193:6;5201;5209;5262:2;5250:9;5241:7;5237:23;5233:32;5230:52;;;5278:1;5275;5268:12;5230:52;5318:9;5305:23;5351:18;5343:6;5340:30;5337:50;;;5383:1;5380;5373:12;5337:50;5406:73;5471:7;5462:6;5451:9;5447:22;5406:73;:::i;:::-;5396:83;5526:2;5511:18;;5498:32;;-1:-1:-1;5577:2:111;5562:18;;;5549:32;;5082:505;-1:-1:-1;;;;5082:505:111:o;5592:530::-;5633:3;5671:5;5665:12;5698:6;5693:3;5686:19;5723:1;5733:162;5747:6;5744:1;5741:13;5733:162;;;5809:4;5865:13;;;5861:22;;5855:29;5837:11;;;5833:20;;5826:59;5762:12;5733:162;;;5913:6;5910:1;5907:13;5904:87;;;5979:1;5972:4;5963:6;5958:3;5954:16;5950:27;5943:38;5904:87;-1:-1:-1;6036:2:111;6024:15;6041:66;6020:88;6011:98;;;;6111:4;6007:109;;5592:530;-1:-1:-1;;5592:530:111:o;6127:288::-;6302:2;6291:9;6284:21;6265:4;6322:44;6362:2;6351:9;6347:18;6339:6;6322:44;:::i;:::-;6314:52;;6402:6;6397:2;6386:9;6382:18;6375:34;6127:288;;;;;:::o;6935:331::-;7040:9;7051;7093:8;7081:10;7078:24;7075:44;;;7115:1;7112;7105:12;7075:44;7144:6;7134:8;7131:20;7128:40;;;7164:1;7161;7154:12;7128:40;-1:-1:-1;;7190:23:111;;;7235:25;;;;;-1:-1:-1;6935:331:111:o;7271:256::-;7337:6;7345;7398:2;7386:9;7377:7;7373:23;7369:32;7366:52;;;7414:1;7411;7404:12;7366:52;7437:28;7455:9;7437:28;:::i;:::-;7427:38;;7484:37;7517:2;7506:9;7502:18;7484:37;:::i;:::-;7474:47;;7271:256;;;;;:::o;7532:672::-;7815:3;7804:9;7797:22;7778:4;7836:45;7876:3;7865:9;7861:19;7853:6;7836:45;:::i;:::-;7912:2;7897:18;;7890:34;;;;-1:-1:-1;7972:42:111;7960:55;;;;7955:2;7940:18;;7933:83;8047:2;8032:18;;8025:34;;;;8078:14;8129:15;;;8123:3;8108:19;;8101:44;8182:15;8176:3;8161:19;;;8154:44;7828:53;7532:672;-1:-1:-1;7532:672:111:o;8456:184::-;8526:6;8579:2;8567:9;8558:7;8554:23;8550:32;8547:52;;;8595:1;8592;8585:12;8547:52;-1:-1:-1;8618:16:111;;8456:184;-1:-1:-1;8456:184:111:o;9413:580::-;9490:4;9496:6;9556:11;9543:25;9646:66;9635:8;9619:14;9615:29;9611:102;9591:18;9587:127;9577:155;;9728:1;9725;9718:12;9577:155;9755:33;;9807:20;;;-1:-1:-1;9850:18:111;9839:30;;9836:50;;;9882:1;9879;9872:12;9836:50;9915:4;9903:17;;-1:-1:-1;9946:14:111;9942:27;;;9932:38;;9929:58;;;9983:1;9980;9973:12;11123:349;11162:3;11193:66;11186:5;11183:77;11180:257;;11293:77;11290:1;11283:88;11394:4;11391:1;11384:15;11422:4;11419:1;11412:15;11180:257;-1:-1:-1;11464:1:111;11453:13;;11123:349::o;11862:184::-;11914:77;11911:1;11904:88;12011:4;12008:1;12001:15;12035:4;12032:1;12025:15"},"gasEstimates":{"creation":{"codeDepositCost":"1114400","executionCost":"infinite","totalCost":"infinite"},"external":{"addStake(uint32)":"infinite","deposit()":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":"infinite","owner()":"2319","parsePaymasterAndData(bytes)":"infinite","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","senderNonce(address)":"2590","transferOwnership(address)":"infinite","unlockStake()":"infinite","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","verifyingSigner()":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite","pack(struct UserOperation calldata)":"infinite"}},"methodIdentifiers":{"addStake(uint32)":"0396cb60","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":"94e1fc19","owner()":"8da5cb5b","parsePaymasterAndData(bytes)":"94d4ad60","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","senderNonce(address)":"9c90b443","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","verifyingSigner()":"23d9ac9b","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifyingSigner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"}],\"name\":\"getHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"parsePaymasterAndData\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"senderNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyingSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)\":{\"notice\":\"return the hash we're going to sign off-chain (and validate on-chain) this method is called by the off-chain service, to sign the request. it is called on-chain from the validatePaymasterUserOp, to validate the signature. note that this signature covers all fields of the UserOperation, except the \\\"paymasterAndData\\\", which will carry the signature itself.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"A sample paymaster that uses external service to decide whether to pay for the UserOp. The paymaster trusts an external signer to sign the transaction. The calling user must pass the UserOp to that external signer first, which performs whatever off-chain verification before signing the UserOp. Note that this signature is NOT a replacement for the account-specific signature: - the paymaster checks a signature to agree to PAY for GAS. - the account checks a signature to prove identity and account ownership.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/VerifyingPaymaster.sol\":\"VerifyingPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/VerifyingPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n/**\\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\\n * The paymaster trusts an external signer to sign the transaction.\\n * The calling user must pass the UserOp to that external signer first, which performs\\n * whatever off-chain verification before signing the UserOp.\\n * Note that this signature is NOT a replacement for the account-specific signature:\\n * - the paymaster checks a signature to agree to PAY for GAS.\\n * - the account checks a signature to prove identity and account ownership.\\n */\\ncontract VerifyingPaymaster is BasePaymaster {\\n\\n using ECDSA for bytes32;\\n using UserOperationLib for UserOperation;\\n\\n address public immutable verifyingSigner;\\n\\n uint256 private constant VALID_TIMESTAMP_OFFSET = 20;\\n\\n uint256 private constant SIGNATURE_OFFSET = 84;\\n\\n constructor(IEntryPoint _entryPoint, address _verifyingSigner) BasePaymaster(_entryPoint) {\\n verifyingSigner = _verifyingSigner;\\n }\\n\\n mapping(address => uint256) public senderNonce;\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n // lighter signature scheme. must match UserOp.ts#packUserOp\\n bytes calldata pnd = userOp.paymasterAndData;\\n // copy directly the userOp from calldata up to (but not including) the paymasterAndData.\\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\\n // than referencing each field separately.\\n assembly {\\n let ofs := userOp\\n let len := sub(sub(pnd.offset, ofs), 32)\\n ret := mload(0x40)\\n mstore(0x40, add(ret, add(len, 32)))\\n mstore(ret, len)\\n calldatacopy(add(ret, 32), ofs, len)\\n }\\n }\\n\\n /**\\n * return the hash we're going to sign off-chain (and validate on-chain)\\n * this method is called by the off-chain service, to sign the request.\\n * it is called on-chain from the validatePaymasterUserOp, to validate the signature.\\n * note that this signature covers all fields of the UserOperation, except the \\\"paymasterAndData\\\",\\n * which will carry the signature itself.\\n */\\n function getHash(UserOperation calldata userOp, uint48 validUntil, uint48 validAfter)\\n public view returns (bytes32) {\\n //can't use userOp.hash(), since it contains also the paymasterAndData itself.\\n\\n return keccak256(abi.encode(\\n pack(userOp),\\n block.chainid,\\n address(this),\\n senderNonce[userOp.getSender()],\\n validUntil,\\n validAfter\\n ));\\n }\\n\\n /**\\n * verify our external signer signed this request.\\n * the \\\"paymasterAndData\\\" is expected to be the paymaster and a signature over the entire request params\\n * paymasterAndData[:20] : address(this)\\n * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\\n * paymasterAndData[84:] : signature\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\\n internal override returns (bytes memory context, uint256 validationData) {\\n (requiredPreFund);\\n\\n (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);\\n //ECDSA library supports both 64 and 65-byte long signatures.\\n // we only \\\"require\\\" it here so that the revert reason on invalid signature will be of \\\"VerifyingPaymaster\\\", and not \\\"ECDSA\\\"\\n require(signature.length == 64 || signature.length == 65, \\\"VerifyingPaymaster: invalid signature length in paymasterAndData\\\");\\n bytes32 hash = ECDSA.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));\\n senderNonce[userOp.getSender()]++;\\n\\n //don't revert on signature failure: return SIG_VALIDATION_FAILED\\n if (verifyingSigner != ECDSA.recover(hash, signature)) {\\n return (\\\"\\\",_packValidationData(true,validUntil,validAfter));\\n }\\n\\n //no need for other on-chain validation: entire UserOp should have been checked\\n // by the external service prior to signing it.\\n return (\\\"\\\",_packValidationData(false,validUntil,validAfter));\\n }\\n\\n function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns(uint48 validUntil, uint48 validAfter, bytes calldata signature) {\\n (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET:SIGNATURE_OFFSET],(uint48, uint48));\\n signature = paymasterAndData[SIGNATURE_OFFSET:];\\n }\\n}\\n\",\"keccak256\":\"0x96791c74f4610449bba4ca8a9992e4dcdfa2c96a3872d25e1dbe47dc9585ac49\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/samples/VerifyingPaymaster.sol:VerifyingPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":14583,"contract":"contracts/samples/VerifyingPaymaster.sol:VerifyingPaymaster","label":"senderNonce","offset":0,"slot":"1","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"getHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint48,uint48)":{"notice":"return the hash we're going to sign off-chain (and validate on-chain) this method is called by the off-chain service, to sign the request. it is called on-chain from the validatePaymasterUserOp, to validate the signature. note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\", which will carry the signature itself."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"A sample paymaster that uses external service to decide whether to pay for the UserOp. The paymaster trusts an external signer to sign the transaction. The calling user must pass the UserOp to that external signer first, which performs whatever off-chain verification before signing the UserOp. Note that this signature is NOT a replacement for the account-specific signature: - the paymaster checks a signature to agree to PAY for GAS. - the account checks a signature to prove identity and account ownership.","version":1}}},"contracts/samples/bls/BLSAccount.sol":{"BLSAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"},{"internalType":"address","name":"anAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[4]","name":"oldPublicKey","type":"uint256[4]"},{"indexed":false,"internalType":"uint256[4]","name":"newPublicKey","type":"uint256[4]"}],"name":"PublicKeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlsPublicKey","outputs":[{"internalType":"uint256[4]","name":"","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"anOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[4]","name":"newPublicKey","type":"uint256[4]"}],"name":"setBlsPublicKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"getBlsPublicKey()":{"returns":{"_0":"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated."}},"initialize(address)":{"details":"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`"},"initialize(uint256[4])":{"params":{"aPublicKey":"public key from a BLS keypair that will have a full ownership and control of this account."}},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"setBlsPublicKey(uint256[4])":{"params":{"newPublicKey":"public key from a BLS keypair that will have a full ownership and control of this account."}},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"withdrawDepositTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13884":{"entryPoint":null,"id":13884,"parameterSlots":1,"returnSlots":0},"@_14788":{"entryPoint":null,"id":14788,"parameterSlots":2,"returnSlots":0},"@_disableInitializers_3524":{"entryPoint":100,"id":3524,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":319,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":294,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1194:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"774:229:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"784:6:111"},"nodeType":"YulFunctionCall","src":"784:21:111"},"nodeType":"YulExpressionStatement","src":"784:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"836:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"821:3:111"},"nodeType":"YulFunctionCall","src":"821:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"841:2:111","type":"","value":"39"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"814:6:111"},"nodeType":"YulFunctionCall","src":"814:30:111"},"nodeType":"YulExpressionStatement","src":"814:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"864:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"875:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"860:3:111"},"nodeType":"YulFunctionCall","src":"860:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469","kind":"string","nodeType":"YulLiteral","src":"880:34:111","type":"","value":"Initializable: contract is initi"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"853:6:111"},"nodeType":"YulFunctionCall","src":"853:62:111"},"nodeType":"YulExpressionStatement","src":"853:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"935:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"946:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"931:3:111"},"nodeType":"YulFunctionCall","src":"931:18:111"},{"hexValue":"616c697a696e67","kind":"string","nodeType":"YulLiteral","src":"951:9:111","type":"","value":"alizing"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"924:6:111"},"nodeType":"YulFunctionCall","src":"924:37:111"},"nodeType":"YulExpressionStatement","src":"924:37:111"},{"nodeType":"YulAssignment","src":"970:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"982:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"993:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"978:3:111"},"nodeType":"YulFunctionCall","src":"978:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"970:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"751:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"765:4:111","type":""}],"src":"600:403:111"},{"body":{"nodeType":"YulBlock","src":"1105:87:111","statements":[{"nodeType":"YulAssignment","src":"1115:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1127:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1138:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1123:3:111"},"nodeType":"YulFunctionCall","src":"1123:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1115:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1157:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1172:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1180:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1168:3:111"},"nodeType":"YulFunctionCall","src":"1168:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1150:6:111"},"nodeType":"YulFunctionCall","src":"1150:36:111"},"nodeType":"YulExpressionStatement","src":"1150:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1074:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1085:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1096:4:111","type":""}],"src":"1008:184:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 39)\n mstore(add(headStart, 64), \"Initializable: contract is initi\")\n mstore(add(headStart, 96), \"alizing\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60e0604052306080523480156200001557600080fd5b50604051620026303803806200263083398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c05161242e62000202600039600081816102a801526116ac0152600081816103cf01528181610926015281816109cd01528181610da301528181610fda015281816111790152818161153b01526117a5015260008181610747015281816107dd01528181610a9101528181610b270152610c56015261242e6000f3fe6080604052600436106101785760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae146104a5578063ee472f36146104c7578063f23a6e61146104e757600080fd5b8063c399ec881461045b578063c4d66de814610470578063d087d2881461049057600080fd5b8063b0d691fe116100b0578063b0d691fe146103c0578063b61d27f6146103f3578063bc197c811461041357600080fd5b806352d1902d146103785780638da5cb5b1461038d57600080fd5b8063245a7bfc1161012d5780634a58db19116101075780634a58db191461033d5780634d44560d146103455780634f1ef2861461036557600080fd5b8063245a7bfc146102965780633659cfe6146102ef5780633a871cdd1461030f57600080fd5b8063150b7a021161015e578063150b7a02146101e057806318dfb3c71461025657806318fc5c441461027657600080fd5b806223de291461018457806301ffc9a7146101ab57600080fd5b3661017f57005b600080fd5b34801561019057600080fd5b506101a961019f366004611b89565b5050505050505050565b005b3480156101b757600080fd5b506101cb6101c6366004611c3a565b61052d565b60405190151581526020015b60405180910390f35b3480156101ec57600080fd5b506102256101fb366004611c7c565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101d7565b34801561026257600080fd5b506101a9610271366004611d34565b610612565b34801561028257600080fd5b506101a9610291366004611e1e565b61071c565b3480156102a257600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d7565b3480156102fb57600080fd5b506101a961030a366004611e9c565b610730565b34801561031b57600080fd5b5061032f61032a366004611eb9565b6108fe565b6040519081526020016101d7565b6101a9610924565b34801561035157600080fd5b506101a9610360366004611f0d565b6109c3565b6101a9610373366004611f39565b610a7a565b34801561038457600080fd5b5061032f610c3c565b34801561039957600080fd5b506000546102ca9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ca565b3480156103ff57600080fd5b506101a961040e366004611fff565b610d0e565b34801561041f57600080fd5b5061022561042e36600461204f565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561046757600080fd5b5061032f610d5d565b34801561047c57600080fd5b506101a961048b366004611e9c565b610e14565b34801561049c57600080fd5b5061032f610f8d565b3480156104b157600080fd5b506104ba611009565b6040516101d79190612110565b3480156104d357600080fd5b506101a96104e2366004611e1e565b611044565b3480156104f357600080fd5b5061022561050236600461211e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806105c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061060c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61061a611161565b82811461066e5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156107155761070385858381811061068e5761068e61219a565b90506020020160208101906106a39190611e9c565b60008585858181106106b7576106b761219a565b90506020028101906106c991906121c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b8061070d8161225d565b915050610671565b5050505050565b61072461128d565b61072d81611304565b50565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107db5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108d95760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b6108e28161134b565b6040805160008082526020820190925261072d91839190611353565b6000610908611523565b61091284846115a8565b905061091d826116e4565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109af57600080fd5b505af1158015610715573d6000803e3d6000fd5b6109cb61128d565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b255760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b9a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c235760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b610c2c8261134b565b610c3882826001611353565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ce95760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610665565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d16611161565b610d57848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612295565b905090565b600054610100900460ff1615808015610e345750600054600160ff909116105b80610e4e5750303b158015610e4e575060005460ff166001145b610ec05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f1e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f278261174f565b8015610c3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dce565b611011611aad565b6040805160808101918290529060019060049082845b815481526020019060010190808311611027575050505050905090565b600054610100900460ff16158080156110645750600054600160ff909116105b8061107e5750303b15801561107e575060005460ff166001145b6110f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611158600061174f565b610f2782611304565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806111c2575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61120e5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610665565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161123991906122da565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50915091508161071557805160208201fd5b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806112b857503330145b61120e5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610665565b7f42e4c4ce1432650f17e41c4ea77ed12c0ab20b229d3ffd84a2ebc9f8abb25a836001826040516113369291906122f6565b60405180910390a1610c386001826004611acb565b61072d61128d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561138b57611386836117ee565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611410575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261140d91810190612295565b60015b6114825760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146115175760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610665565b506113868383836118de565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461120e5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610665565b60006115b760408401846121c9565b15905061168b5760006115c8611009565b6040516020016115d89190612110565b6040516020818303038152906040528051906020012090508084806040019061160191906121c9565b608061161060408901896121c9565b61161b92915061232f565b611626928290612346565b604051611634929190612370565b6040518091039020146116895760405162461bcd60e51b815260206004820152600c60248201527f77726f6e67207075626b657900000000000000000000000000000000000000006044820152606401610665565b505b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201529392505050565b801561072d5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e610715565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6118785760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6118e783611903565b6000825111806118f45750805b1561138657610d578383611950565b61190c816117ee565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061091d83836040518060600160405280602781526020016123d26027913960606000808573ffffffffffffffffffffffffffffffffffffffff168560405161199a91906122da565b600060405180830381855af49150503d80600081146119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b606091505b50915091506119eb868383876119f5565b9695505050505050565b60608315611a71578251600003611a6a5773ffffffffffffffffffffffffffffffffffffffff85163b611a6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610665565b5081611a7b565b611a7b8383611a83565b949350505050565b815115611a935781518083602001fd5b8060405162461bcd60e51b81526004016106659190612380565b60405180608001604052806004906020820280368337509192915050565b8260048101928215611af9579160200282015b82811115611af9578251825591602001919060010190611ade565b50611b05929150611b09565b5090565b5b80821115611b055760008155600101611b0a565b73ffffffffffffffffffffffffffffffffffffffff8116811461072d57600080fd5b60008083601f840112611b5257600080fd5b50813567ffffffffffffffff811115611b6a57600080fd5b602083019150836020828501011115611b8257600080fd5b9250929050565b60008060008060008060008060c0898b031215611ba557600080fd5b8835611bb081611b1e565b97506020890135611bc081611b1e565b96506040890135611bd081611b1e565b955060608901359450608089013567ffffffffffffffff80821115611bf457600080fd5b611c008c838d01611b40565b909650945060a08b0135915080821115611c1957600080fd5b50611c268b828c01611b40565b999c989b5096995094979396929594505050565b600060208284031215611c4c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461091d57600080fd5b600080600080600060808688031215611c9457600080fd5b8535611c9f81611b1e565b94506020860135611caf81611b1e565b935060408601359250606086013567ffffffffffffffff811115611cd257600080fd5b611cde88828901611b40565b969995985093965092949392505050565b60008083601f840112611d0157600080fd5b50813567ffffffffffffffff811115611d1957600080fd5b6020830191508360208260051b8501011115611b8257600080fd5b60008060008060408587031215611d4a57600080fd5b843567ffffffffffffffff80821115611d6257600080fd5b611d6e88838901611cef565b90965094506020870135915080821115611d8757600080fd5b50611d9487828801611cef565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e1657611e16611da0565b604052919050565b600060808284031215611e3057600080fd5b82601f830112611e3f57600080fd5b6040516080810181811067ffffffffffffffff82111715611e6257611e62611da0565b604052806080840185811115611e7757600080fd5b845b81811015611e91578035835260209283019201611e79565b509195945050505050565b600060208284031215611eae57600080fd5b813561091d81611b1e565b600080600060608486031215611ece57600080fd5b833567ffffffffffffffff811115611ee557600080fd5b84016101608187031215611ef857600080fd5b95602085013595506040909401359392505050565b60008060408385031215611f2057600080fd5b8235611f2b81611b1e565b946020939093013593505050565b60008060408385031215611f4c57600080fd5b8235611f5781611b1e565b915060208381013567ffffffffffffffff80821115611f7557600080fd5b818601915086601f830112611f8957600080fd5b813581811115611f9b57611f9b611da0565b611fcb847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dcf565b91508082528784828501011115611fe157600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806060858703121561201557600080fd5b843561202081611b1e565b935060208501359250604085013567ffffffffffffffff81111561204357600080fd5b611d9487828801611b40565b60008060008060008060008060a0898b03121561206b57600080fd5b883561207681611b1e565b9750602089013561208681611b1e565b9650604089013567ffffffffffffffff808211156120a357600080fd5b6120af8c838d01611cef565b909850965060608b01359150808211156120c857600080fd5b6120d48c838d01611cef565b909650945060808b0135915080821115611c1957600080fd5b8060005b6004811015610d575781518452602093840193909101906001016120f1565b6080810161060c82846120ed565b60008060008060008060a0878903121561213757600080fd5b863561214281611b1e565b9550602087013561215281611b1e565b94506040870135935060608701359250608087013567ffffffffffffffff81111561217c57600080fd5b61218889828a01611b40565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121fe57600080fd5b83018035915067ffffffffffffffff82111561221957600080fd5b602001915036819003821315611b8257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361228e5761228e61222e565b5060010190565b6000602082840312156122a757600080fd5b5051919050565b60005b838110156122c95781810151838201526020016122b1565b83811115610d575750506000910152565b600082516122ec8184602087016122ae565b9190910192915050565b6101008101818460005b600481101561231f578154835260209092019160019182019101612300565b50505061091d60808301846120ed565b6000828210156123415761234161222e565b500390565b6000808585111561235657600080fd5b8386111561236357600080fd5b5050820193919092039150565b8183823760009101908152919050565b602081526000825180602084015261239f8160408501602087016122ae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bce0ce62c54cf2aa0b2c90d7d08c4f9212f4077f1742678a583f10617e0d761964736f6c634300080f0033","opcodes":"PUSH1 0xE0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2630 CODESIZE SUB DUP1 PUSH3 0x2630 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x242E PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x2A8 ADD MSTORE PUSH2 0x16AC ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x3CF ADD MSTORE DUP2 DUP2 PUSH2 0x926 ADD MSTORE DUP2 DUP2 PUSH2 0x9CD ADD MSTORE DUP2 DUP2 PUSH2 0xDA3 ADD MSTORE DUP2 DUP2 PUSH2 0xFDA ADD MSTORE DUP2 DUP2 PUSH2 0x1179 ADD MSTORE DUP2 DUP2 PUSH2 0x153B ADD MSTORE PUSH2 0x17A5 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x747 ADD MSTORE DUP2 DUP2 PUSH2 0x7DD ADD MSTORE DUP2 DUP2 PUSH2 0xA91 ADD MSTORE DUP2 DUP2 PUSH2 0xB27 ADD MSTORE PUSH2 0xC56 ADD MSTORE PUSH2 0x242E PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x178 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3C0 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x38D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x12D JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x33D JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x345 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2EF JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x15E JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x18FC5C44 EQ PUSH2 0x276 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x184 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x17F JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x19F CALLDATASIZE PUSH1 0x4 PUSH2 0x1B89 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CB PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C3A JUMP JUMPDEST PUSH2 0x52D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x1FB CALLDATASIZE PUSH1 0x4 PUSH2 0x1C7C JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D34 JUMP JUMPDEST PUSH2 0x612 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x291 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x71C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CA PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x30A CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0x730 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0x32A CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB9 JUMP JUMPDEST PUSH2 0x8FE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x924 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x351 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x360 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F0D JUMP JUMPDEST PUSH2 0x9C3 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x373 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0xA7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xC3C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x399 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2CA SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x40E CALLDATASIZE PUSH1 0x4 PUSH2 0x1FFF JUMP JUMPDEST PUSH2 0xD0E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x42E CALLDATASIZE PUSH1 0x4 PUSH2 0x204F JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xD5D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0xE14 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xF8D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4BA PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1D7 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x4E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x1044 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x502 CALLDATASIZE PUSH1 0x4 PUSH2 0x211E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x5C0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x60C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x61A PUSH2 0x1161 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x66E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x715 JUMPI PUSH2 0x703 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x68E JUMPI PUSH2 0x68E PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x6A3 SWAP2 SWAP1 PUSH2 0x1E9C JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x6C9 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x70D DUP2 PUSH2 0x225D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x724 PUSH2 0x128D JUMP JUMPDEST PUSH2 0x72D DUP2 PUSH2 0x1304 JUMP JUMPDEST POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x7DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x850 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0x8E2 DUP2 PUSH2 0x134B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x72D SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x908 PUSH2 0x1523 JUMP JUMPDEST PUSH2 0x912 DUP5 DUP5 PUSH2 0x15A8 JUMP JUMPDEST SWAP1 POP PUSH2 0x91D DUP3 PUSH2 0x16E4 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9CB PUSH2 0x128D JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA72 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB25 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB9A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC23 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0xC2C DUP3 PUSH2 0x134B JUMP JUMPDEST PUSH2 0xC38 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1353 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD16 PUSH2 0x1161 JUMP JUMPDEST PUSH2 0xD57 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDEB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE0F SWAP2 SWAP1 PUSH2 0x2295 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE34 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE4E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE4E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xEC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF1E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x174F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC38 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDCE JUMP JUMPDEST PUSH2 0x1011 PUSH2 0x1AAD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 SWAP1 DUP3 DUP5 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1027 JUMPI POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1064 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x107E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x107E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x114E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1158 PUSH1 0x0 PUSH2 0x174F JUMP JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x1304 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x11C2 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1239 SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1276 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x127B JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x715 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x12B8 JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x42E4C4CE1432650F17E41C4EA77ED12C0AB20B229D3FFD84A2EBC9F8ABB25A83 PUSH1 0x1 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1336 SWAP3 SWAP2 SWAP1 PUSH2 0x22F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0xC38 PUSH1 0x1 DUP3 PUSH1 0x4 PUSH2 0x1ACB JUMP JUMPDEST PUSH2 0x72D PUSH2 0x128D JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x138B JUMPI PUSH2 0x1386 DUP4 PUSH2 0x17EE JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x140D SWAP2 DUP2 ADD SWAP1 PUSH2 0x2295 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1482 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1517 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH2 0x1386 DUP4 DUP4 DUP4 PUSH2 0x18DE JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B7 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x21C9 JUMP JUMPDEST ISZERO SWAP1 POP PUSH2 0x168B JUMPI PUSH1 0x0 PUSH2 0x15C8 PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x15D8 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP DUP1 DUP5 DUP1 PUSH1 0x40 ADD SWAP1 PUSH2 0x1601 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST PUSH1 0x80 PUSH2 0x1610 PUSH1 0x40 DUP10 ADD DUP10 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x161B SWAP3 SWAP2 POP PUSH2 0x232F JUMP JUMPDEST PUSH2 0x1626 SWAP3 DUP3 SWAP1 PUSH2 0x2346 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1634 SWAP3 SWAP2 SWAP1 PUSH2 0x2370 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 EQ PUSH2 0x1689 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67207075626B65790000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x72D JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x715 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x715 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1878 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x18E7 DUP4 PUSH2 0x1903 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x18F4 JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1386 JUMPI PUSH2 0xD57 DUP4 DUP4 PUSH2 0x1950 JUMP JUMPDEST PUSH2 0x190C DUP2 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x91D DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23D2 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x199A SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x19D5 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x19DA JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x19EB DUP7 DUP4 DUP4 DUP8 PUSH2 0x19F5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A71 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP DUP2 PUSH2 0x1A7B JUMP JUMPDEST PUSH2 0x1A7B DUP4 DUP4 PUSH2 0x1A83 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A93 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 PUSH1 0x4 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1AF9 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1AF9 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1ADE JUMP JUMPDEST POP PUSH2 0x1B05 SWAP3 SWAP2 POP PUSH2 0x1B09 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1B05 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1B0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x72D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1BA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1BB0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1BC0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1BD0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1BF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C00 DUP13 DUP4 DUP14 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C26 DUP12 DUP3 DUP13 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1C94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C9F DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1CAF DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CDE DUP9 DUP3 DUP10 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1D01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D6E DUP9 DUP4 DUP10 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1D87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1E16 JUMPI PUSH2 0x1E16 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1E62 JUMPI PUSH2 0x1E62 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1E77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E91 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1E79 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x91D DUP2 PUSH2 0x1B1E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1ECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F2B DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F57 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1F9B JUMPI PUSH2 0x1F9B PUSH2 0x1DA0 JUMP JUMPDEST PUSH2 0x1FCB DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1DCF JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1FE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2015 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2020 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1B40 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x206B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x2076 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x2086 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x20A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20AF DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x20C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20D4 DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0xD57 JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x20F1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x60C DUP3 DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2142 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2152 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x217C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2188 DUP10 DUP3 DUP11 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x21FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x228E JUMPI PUSH2 0x228E PUSH2 0x222E JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22C9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22B1 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD57 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x22EC DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x100 DUP2 ADD DUP2 DUP5 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x231F JUMPI DUP2 SLOAD DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2300 JUMP JUMPDEST POP POP POP PUSH2 0x91D PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x2341 JUMPI PUSH2 0x2341 PUSH2 0x222E JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x2356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2363 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x239F DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220BCE0CE PUSH3 0xC54CF2 0xAA SIGNEXTEND 0x2C SWAP1 0xD7 0xD0 DUP13 0x4F SWAP3 SLT DELEGATECALL SMOD PUSH32 0x1742678A583F10617E0D761964736F6C634300080F0033000000000000000000 ","sourceMap":"578:2118:77:-:0;;;1088:4:32;1045:48;;887:131:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1278:26:73;;;;961:12:77;1314:22:73;:20;:22::i;:::-;-1:-1:-1;;;;;;986:25:77::1;;::::0;-1:-1:-1;578:2118:77;;5906:279:31;5974:13;;;;;;;5973:14;5965:66;;;;-1:-1:-1;;;5965:66:31;;802:2:111;5965:66:31;;;784:21:111;841:2;821:18;;;814:30;880:34;860:18;;;853:62;-1:-1:-1;;;931:18:111;;;924:37;978:19;;5965:66:31;;;;;;;;6045:12;;6060:15;6045:12;;;:30;6041:138;;;6091:12;:30;;-1:-1:-1;;6091:30:31;6106:15;6091:30;;;;;;6140:28;;1150:36:111;;;6140:28:31;;1138:2:111;1123:18;6140:28:31;;;;;;;6041:138;5906:279::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;1008:184::-;578:2118:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_13870":{"entryPoint":null,"id":13870,"parameterSlots":0,"returnSlots":0},"@_authorizeUpgrade_14140":{"entryPoint":4939,"id":14140,"parameterSlots":1,"returnSlots":0},"@_call_14076":{"entryPoint":4624,"id":14076,"parameterSlots":3,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_initialize_13998":{"entryPoint":5967,"id":13998,"parameterSlots":1,"returnSlots":0},"@_onlyOwner_13904":{"entryPoint":4749,"id":13904,"parameterSlots":0,"returnSlots":0},"@_packValidationData_9942":{"entryPoint":null,"id":9942,"parameterSlots":1,"returnSlots":1},"@_payPrefund_7307":{"entryPoint":5860,"id":7307,"parameterSlots":1,"returnSlots":0},"@_requireFromEntryPointOrOwner_14019":{"entryPoint":4449,"id":14019,"parameterSlots":0,"returnSlots":0},"@_requireFromEntryPoint_7256":{"entryPoint":5411,"id":7256,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":6787,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setBlsPublicKey_14901":{"entryPoint":4868,"id":14901,"parameterSlots":1,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":6126,"id":3050,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCallUUPS_3148":{"entryPoint":4947,"id":3148,"parameterSlots":3,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":6366,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":6403,"id":3065,"parameterSlots":1,"returnSlots":0},"@_validateNonce_7274":{"entryPoint":null,"id":7274,"parameterSlots":1,"returnSlots":0},"@_validateSignature_14869":{"entryPoint":5544,"id":14869,"parameterSlots":2,"returnSlots":1},"@addDeposit_14109":{"entryPoint":2340,"id":14109,"parameterSlots":0,"returnSlots":0},"@aggregator_14768":{"entryPoint":null,"id":14768,"parameterSlots":0,"returnSlots":0},"@entryPoint_13866":{"entryPoint":null,"id":13866,"parameterSlots":0,"returnSlots":1},"@executeBatch_13970":{"entryPoint":1554,"id":13970,"parameterSlots":4,"returnSlots":0},"@execute_13924":{"entryPoint":3342,"id":13924,"parameterSlots":4,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":6480,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":null,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":null,"id":5258,"parameterSlots":1,"returnSlots":1},"@getBlsPublicKey_14913":{"entryPoint":4105,"id":14913,"parameterSlots":0,"returnSlots":1},"@getBooleanSlot_5269":{"entryPoint":null,"id":5269,"parameterSlots":1,"returnSlots":1},"@getDeposit_14092":{"entryPoint":3421,"id":14092,"parameterSlots":0,"returnSlots":1},"@getNonce_7198":{"entryPoint":3981,"id":7198,"parameterSlots":0,"returnSlots":1},"@initialize_13983":{"entryPoint":3604,"id":13983,"parameterSlots":1,"returnSlots":0},"@initialize_14812":{"entryPoint":4164,"id":14812,"parameterSlots":1,"returnSlots":0},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@owner_13838":{"entryPoint":null,"id":13838,"parameterSlots":0,"returnSlots":0},"@proxiableUUID_3609":{"entryPoint":3132,"id":3609,"parameterSlots":0,"returnSlots":1},"@setBlsPublicKey_14884":{"entryPoint":1820,"id":14884,"parameterSlots":1,"returnSlots":0},"@supportsInterface_17936":{"entryPoint":1325,"id":17936,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"@upgradeToAndCall_3652":{"entryPoint":2682,"id":3652,"parameterSlots":2,"returnSlots":0},"@upgradeTo_3631":{"entryPoint":1840,"id":3631,"parameterSlots":1,"returnSlots":0},"@validateUserOp_7239":{"entryPoint":2302,"id":7239,"parameterSlots":3,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":6645,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawDepositTo_14127":{"entryPoint":2499,"id":14127,"parameterSlots":2,"returnSlots":0},"abi_decode_array_address_dyn_calldata":{"entryPoint":7407,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":6976,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address":{"entryPoint":7836,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7949,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":7049,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":8271,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7292,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":8478,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":7993,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":8191,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":7476,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr":{"entryPoint":7710,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes4":{"entryPoint":7226,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7865,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8853,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256":{"entryPoint":8429,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_tuple_packed_t_bytes_calldata_ptr_slice__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":9072,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":8922,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":8464,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_storage_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":8950,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":9088,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0d47f95102ecb77a503f8bf26fe03155315a477d7b00a1b0cee7c3b13797c2b5__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8649,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_memory":{"entryPoint":7631,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":9030,"id":null,"parameterSlots":4,"returnSlots":2},"checked_sub_t_uint256":{"entryPoint":9007,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":8878,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":8797,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":8750,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":8602,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":7584,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":6942,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:22006:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"245:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"294:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"303:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"306:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"296:6:111"},"nodeType":"YulFunctionCall","src":"296:12:111"},"nodeType":"YulExpressionStatement","src":"296:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"273:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"281:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"269:3:111"},"nodeType":"YulFunctionCall","src":"269:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"288:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"265:3:111"},"nodeType":"YulFunctionCall","src":"265:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"258:6:111"},"nodeType":"YulFunctionCall","src":"258:35:111"},"nodeType":"YulIf","src":"255:55:111"},{"nodeType":"YulAssignment","src":"319:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"342:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"329:12:111"},"nodeType":"YulFunctionCall","src":"329:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"319:6:111"}]},{"body":{"nodeType":"YulBlock","src":"392:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"401:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"404:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"394:6:111"},"nodeType":"YulFunctionCall","src":"394:12:111"},"nodeType":"YulExpressionStatement","src":"394:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"364:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"372:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"361:2:111"},"nodeType":"YulFunctionCall","src":"361:30:111"},"nodeType":"YulIf","src":"358:50:111"},{"nodeType":"YulAssignment","src":"417:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"433:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"441:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"417:8:111"}]},{"body":{"nodeType":"YulBlock","src":"498:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"507:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"510:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"500:6:111"},"nodeType":"YulFunctionCall","src":"500:12:111"},"nodeType":"YulExpressionStatement","src":"500:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"469:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"477:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"465:3:111"},"nodeType":"YulFunctionCall","src":"465:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"461:3:111"},"nodeType":"YulFunctionCall","src":"461:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"493:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"458:2:111"},"nodeType":"YulFunctionCall","src":"458:39:111"},"nodeType":"YulIf","src":"455:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"208:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"216:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"224:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"234:6:111","type":""}],"src":"173:347:111"},{"body":{"nodeType":"YulBlock","src":"718:1012:111","statements":[{"body":{"nodeType":"YulBlock","src":"765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"767:6:111"},"nodeType":"YulFunctionCall","src":"767:12:111"},"nodeType":"YulExpressionStatement","src":"767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"735:3:111"},"nodeType":"YulFunctionCall","src":"735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"760:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"731:3:111"},"nodeType":"YulFunctionCall","src":"731:33:111"},"nodeType":"YulIf","src":"728:53:111"},{"nodeType":"YulVariableDeclaration","src":"790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"803:12:111"},"nodeType":"YulFunctionCall","src":"803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"860:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"835:24:111"},"nodeType":"YulFunctionCall","src":"835:31:111"},"nodeType":"YulExpressionStatement","src":"835:31:111"},{"nodeType":"YulAssignment","src":"875:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"875:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"899:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"927:3:111"},"nodeType":"YulFunctionCall","src":"927:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"914:12:111"},"nodeType":"YulFunctionCall","src":"914:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"903:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"980:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"955:24:111"},"nodeType":"YulFunctionCall","src":"955:33:111"},"nodeType":"YulExpressionStatement","src":"955:33:111"},{"nodeType":"YulAssignment","src":"997:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1007:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1023:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1066:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1051:3:111"},"nodeType":"YulFunctionCall","src":"1051:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1038:12:111"},"nodeType":"YulFunctionCall","src":"1038:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1027:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1104:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1079:24:111"},"nodeType":"YulFunctionCall","src":"1079:33:111"},"nodeType":"YulExpressionStatement","src":"1079:33:111"},{"nodeType":"YulAssignment","src":"1121:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1131:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1121:6:111"}]},{"nodeType":"YulAssignment","src":"1147:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1170:3:111"},"nodeType":"YulFunctionCall","src":"1170:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1157:12:111"},"nodeType":"YulFunctionCall","src":"1157:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1147:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1198:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1240:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1225:3:111"},"nodeType":"YulFunctionCall","src":"1225:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1212:12:111"},"nodeType":"YulFunctionCall","src":"1212:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1202:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:14:111"},"nodeType":"YulIf","src":"1291:34:111"},{"nodeType":"YulVariableDeclaration","src":"1334:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1390:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1401:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1386:3:111"},"nodeType":"YulFunctionCall","src":"1386:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1410:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1360:25:111"},"nodeType":"YulFunctionCall","src":"1360:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1338:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1348:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1427:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1437:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1427:6:111"}]},{"nodeType":"YulAssignment","src":"1454:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1464:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1454:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1481:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1525:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1510:3:111"},"nodeType":"YulFunctionCall","src":"1510:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1497:12:111"},"nodeType":"YulFunctionCall","src":"1497:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1485:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1561:6:111"},"nodeType":"YulFunctionCall","src":"1561:12:111"},"nodeType":"YulExpressionStatement","src":"1561:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1545:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1555:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1542:2:111"},"nodeType":"YulFunctionCall","src":"1542:16:111"},"nodeType":"YulIf","src":"1539:36:111"},{"nodeType":"YulVariableDeclaration","src":"1584:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1640:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1651:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1636:3:111"},"nodeType":"YulFunctionCall","src":"1636:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1662:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1610:25:111"},"nodeType":"YulFunctionCall","src":"1610:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1588:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1598:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1679:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1689:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1679:6:111"}]},{"nodeType":"YulAssignment","src":"1706:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1716:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1706:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"628:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"639:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"651:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"659:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"667:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"675:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"683:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"691:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"699:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"707:6:111","type":""}],"src":"525:1205:111"},{"body":{"nodeType":"YulBlock","src":"1804:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1850:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1859:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1862:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1852:6:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"nodeType":"YulExpressionStatement","src":"1852:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1825:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1834:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1821:3:111"},"nodeType":"YulFunctionCall","src":"1821:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1846:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1817:3:111"},"nodeType":"YulFunctionCall","src":"1817:32:111"},"nodeType":"YulIf","src":"1814:52:111"},{"nodeType":"YulVariableDeclaration","src":"1875:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1901:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1888:12:111"},"nodeType":"YulFunctionCall","src":"1888:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1879:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2021:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2030:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2033:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2023:6:111"},"nodeType":"YulFunctionCall","src":"2023:12:111"},"nodeType":"YulExpressionStatement","src":"2023:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1933:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1944:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1951:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1940:3:111"},"nodeType":"YulFunctionCall","src":"1940:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:97:111"},"nodeType":"YulIf","src":"1920:117:111"},{"nodeType":"YulAssignment","src":"2046:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2056:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2046:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1770:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1781:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1793:6:111","type":""}],"src":"1735:332:111"},{"body":{"nodeType":"YulBlock","src":"2167:92:111","statements":[{"nodeType":"YulAssignment","src":"2177:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2200:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2185:3:111"},"nodeType":"YulFunctionCall","src":"2185:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2177:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2219:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2244:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2237:6:111"},"nodeType":"YulFunctionCall","src":"2237:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2230:6:111"},"nodeType":"YulFunctionCall","src":"2230:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2212:6:111"},"nodeType":"YulFunctionCall","src":"2212:41:111"},"nodeType":"YulExpressionStatement","src":"2212:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2136:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2147:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2158:4:111","type":""}],"src":"2072:187:111"},{"body":{"nodeType":"YulBlock","src":"2404:614:111","statements":[{"body":{"nodeType":"YulBlock","src":"2451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2453:6:111"},"nodeType":"YulFunctionCall","src":"2453:12:111"},"nodeType":"YulExpressionStatement","src":"2453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2425:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2421:3:111"},"nodeType":"YulFunctionCall","src":"2421:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2446:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:33:111"},"nodeType":"YulIf","src":"2414:53:111"},{"nodeType":"YulVariableDeclaration","src":"2476:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2502:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2489:12:111"},"nodeType":"YulFunctionCall","src":"2489:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2480:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2546:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2521:24:111"},"nodeType":"YulFunctionCall","src":"2521:31:111"},"nodeType":"YulExpressionStatement","src":"2521:31:111"},{"nodeType":"YulAssignment","src":"2561:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2561:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2585:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2617:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2628:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2600:12:111"},"nodeType":"YulFunctionCall","src":"2600:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2589:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2666:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2641:24:111"},"nodeType":"YulFunctionCall","src":"2641:33:111"},"nodeType":"YulExpressionStatement","src":"2641:33:111"},{"nodeType":"YulAssignment","src":"2683:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2693:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2683:6:111"}]},{"nodeType":"YulAssignment","src":"2709:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2736:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2719:12:111"},"nodeType":"YulFunctionCall","src":"2719:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2760:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2802:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2787:3:111"},"nodeType":"YulFunctionCall","src":"2787:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2774:12:111"},"nodeType":"YulFunctionCall","src":"2774:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2764:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2821:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2829:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2818:2:111"},"nodeType":"YulFunctionCall","src":"2818:30:111"},"nodeType":"YulIf","src":"2815:50:111"},{"nodeType":"YulVariableDeclaration","src":"2874:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2930:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2941:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2926:3:111"},"nodeType":"YulFunctionCall","src":"2926:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2950:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2900:25:111"},"nodeType":"YulFunctionCall","src":"2900:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2878:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2888:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2967:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2977:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2967:6:111"}]},{"nodeType":"YulAssignment","src":"2994:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"3004:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2994:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2338:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2349:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2369:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2377:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2385:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2393:6:111","type":""}],"src":"2264:754:111"},{"body":{"nodeType":"YulBlock","src":"3122:149:111","statements":[{"nodeType":"YulAssignment","src":"3132:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3140:3:111"},"nodeType":"YulFunctionCall","src":"3140:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3132:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3174:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3197:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3185:3:111"},"nodeType":"YulFunctionCall","src":"3185:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:98:111"},"nodeType":"YulExpressionStatement","src":"3167:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3091:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3102:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3113:4:111","type":""}],"src":"3023:248:111"},{"body":{"nodeType":"YulBlock","src":"3360:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:12:111"},"nodeType":"YulExpressionStatement","src":"3411:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3396:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3403:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:35:111"},"nodeType":"YulIf","src":"3370:55:111"},{"nodeType":"YulAssignment","src":"3434:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3457:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3444:12:111"},"nodeType":"YulFunctionCall","src":"3444:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3434:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3509:6:111"},"nodeType":"YulFunctionCall","src":"3509:12:111"},"nodeType":"YulExpressionStatement","src":"3509:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3476:2:111"},"nodeType":"YulFunctionCall","src":"3476:30:111"},"nodeType":"YulIf","src":"3473:50:111"},{"nodeType":"YulAssignment","src":"3532:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3544:3:111"},"nodeType":"YulFunctionCall","src":"3544:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3532:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3623:6:111"},"nodeType":"YulFunctionCall","src":"3623:12:111"},"nodeType":"YulExpressionStatement","src":"3623:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3584:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3596:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3599:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3609:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3576:3:111"},"nodeType":"YulFunctionCall","src":"3576:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3616:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3573:2:111"},"nodeType":"YulFunctionCall","src":"3573:47:111"},"nodeType":"YulIf","src":"3570:67:111"}]},"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3323:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3331:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3339:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3349:6:111","type":""}],"src":"3276:367:111"},{"body":{"nodeType":"YulBlock","src":"3816:616:111","statements":[{"body":{"nodeType":"YulBlock","src":"3862:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3874:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3864:6:111"},"nodeType":"YulFunctionCall","src":"3864:12:111"},"nodeType":"YulExpressionStatement","src":"3864:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3837:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3846:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3833:3:111"},"nodeType":"YulFunctionCall","src":"3833:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3829:3:111"},"nodeType":"YulFunctionCall","src":"3829:32:111"},"nodeType":"YulIf","src":"3826:52:111"},{"nodeType":"YulVariableDeclaration","src":"3887:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3914:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3901:12:111"},"nodeType":"YulFunctionCall","src":"3901:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3891:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3933:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3943:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3937:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3988:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3997:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4000:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3990:6:111"},"nodeType":"YulFunctionCall","src":"3990:12:111"},"nodeType":"YulExpressionStatement","src":"3990:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3976:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3984:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3973:2:111"},"nodeType":"YulFunctionCall","src":"3973:14:111"},"nodeType":"YulIf","src":"3970:34:111"},{"nodeType":"YulVariableDeclaration","src":"4013:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4081:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4092:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4077:3:111"},"nodeType":"YulFunctionCall","src":"4077:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4101:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4039:37:111"},"nodeType":"YulFunctionCall","src":"4039:70:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"4017:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"4027:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4118:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"4128:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4118:6:111"}]},{"nodeType":"YulAssignment","src":"4145:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4155:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4172:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4201:3:111"},"nodeType":"YulFunctionCall","src":"4201:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4188:12:111"},"nodeType":"YulFunctionCall","src":"4188:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4176:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4251:6:111"},"nodeType":"YulFunctionCall","src":"4251:12:111"},"nodeType":"YulExpressionStatement","src":"4251:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4235:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4245:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4232:2:111"},"nodeType":"YulFunctionCall","src":"4232:16:111"},"nodeType":"YulIf","src":"4229:36:111"},{"nodeType":"YulVariableDeclaration","src":"4274:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4353:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4338:3:111"},"nodeType":"YulFunctionCall","src":"4338:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4364:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4300:37:111"},"nodeType":"YulFunctionCall","src":"4300:72:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4278:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4288:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4381:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4391:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4381:6:111"}]},{"nodeType":"YulAssignment","src":"4408:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4418:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4408:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3758:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3769:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3781:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3789:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3797:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3805:6:111","type":""}],"src":"3648:784:111"},{"body":{"nodeType":"YulBlock","src":"4469:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4486:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4489:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4479:6:111"},"nodeType":"YulFunctionCall","src":"4479:88:111"},"nodeType":"YulExpressionStatement","src":"4479:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4583:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4586:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4576:6:111"},"nodeType":"YulFunctionCall","src":"4576:15:111"},"nodeType":"YulExpressionStatement","src":"4576:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4607:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4610:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4600:6:111"},"nodeType":"YulFunctionCall","src":"4600:15:111"},"nodeType":"YulExpressionStatement","src":"4600:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"4437:184:111"},{"body":{"nodeType":"YulBlock","src":"4671:289:111","statements":[{"nodeType":"YulAssignment","src":"4681:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4697:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4691:5:111"},"nodeType":"YulFunctionCall","src":"4691:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"4681:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4709:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"4731:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"4747:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"4753:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4743:3:111"},"nodeType":"YulFunctionCall","src":"4743:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"4758:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4739:3:111"},"nodeType":"YulFunctionCall","src":"4739:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4727:3:111"},"nodeType":"YulFunctionCall","src":"4727:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"4713:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4901:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"4903:16:111"},"nodeType":"YulFunctionCall","src":"4903:18:111"},"nodeType":"YulExpressionStatement","src":"4903:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"4844:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"4856:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4841:2:111"},"nodeType":"YulFunctionCall","src":"4841:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"4880:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"4892:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4877:2:111"},"nodeType":"YulFunctionCall","src":"4877:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"4838:2:111"},"nodeType":"YulFunctionCall","src":"4838:62:111"},"nodeType":"YulIf","src":"4835:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4939:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"4943:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4932:6:111"},"nodeType":"YulFunctionCall","src":"4932:22:111"},"nodeType":"YulExpressionStatement","src":"4932:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"4651:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"4660:6:111","type":""}],"src":"4626:334:111"},{"body":{"nodeType":"YulBlock","src":"5058:668:111","statements":[{"body":{"nodeType":"YulBlock","src":"5105:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5114:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5117:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5107:6:111"},"nodeType":"YulFunctionCall","src":"5107:12:111"},"nodeType":"YulExpressionStatement","src":"5107:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5079:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5088:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5075:3:111"},"nodeType":"YulFunctionCall","src":"5075:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5100:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5071:3:111"},"nodeType":"YulFunctionCall","src":"5071:33:111"},"nodeType":"YulIf","src":"5068:53:111"},{"body":{"nodeType":"YulBlock","src":"5176:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5185:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5188:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5178:6:111"},"nodeType":"YulFunctionCall","src":"5178:12:111"},"nodeType":"YulExpressionStatement","src":"5178:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5148:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5159:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5144:3:111"},"nodeType":"YulFunctionCall","src":"5144:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5166:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5140:3:111"},"nodeType":"YulFunctionCall","src":"5140:34:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5133:6:111"},"nodeType":"YulFunctionCall","src":"5133:42:111"},"nodeType":"YulIf","src":"5130:62:111"},{"nodeType":"YulVariableDeclaration","src":"5201:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5221:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5215:5:111"},"nodeType":"YulFunctionCall","src":"5215:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"5205:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5233:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"5255:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5263:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5251:3:111"},"nodeType":"YulFunctionCall","src":"5251:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"5237:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5342:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"5344:16:111"},"nodeType":"YulFunctionCall","src":"5344:18:111"},"nodeType":"YulExpressionStatement","src":"5344:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"5285:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"5297:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5282:2:111"},"nodeType":"YulFunctionCall","src":"5282:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"5321:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"5333:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5318:2:111"},"nodeType":"YulFunctionCall","src":"5318:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"5279:2:111"},"nodeType":"YulFunctionCall","src":"5279:62:111"},"nodeType":"YulIf","src":"5276:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5380:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"5384:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5373:6:111"},"nodeType":"YulFunctionCall","src":"5373:22:111"},"nodeType":"YulExpressionStatement","src":"5373:22:111"},{"nodeType":"YulVariableDeclaration","src":"5404:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"5415:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"5408:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5430:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5448:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5459:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5444:3:111"},"nodeType":"YulFunctionCall","src":"5444:19:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"5434:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5495:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5504:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5507:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5497:6:111"},"nodeType":"YulFunctionCall","src":"5497:12:111"},"nodeType":"YulExpressionStatement","src":"5497:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"5478:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5486:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5475:2:111"},"nodeType":"YulFunctionCall","src":"5475:19:111"},"nodeType":"YulIf","src":"5472:39:111"},{"nodeType":"YulVariableDeclaration","src":"5520:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"5531:9:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"5524:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5607:88:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5628:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"5646:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5633:12:111"},"nodeType":"YulFunctionCall","src":"5633:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5621:6:111"},"nodeType":"YulFunctionCall","src":"5621:30:111"},"nodeType":"YulExpressionStatement","src":"5621:30:111"},{"nodeType":"YulAssignment","src":"5664:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5675:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5680:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5671:3:111"},"nodeType":"YulFunctionCall","src":"5671:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"5664:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"5560:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"5565:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5557:2:111"},"nodeType":"YulFunctionCall","src":"5557:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5573:25:111","statements":[{"nodeType":"YulAssignment","src":"5575:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"5586:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5591:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5582:3:111"},"nodeType":"YulFunctionCall","src":"5582:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"5575:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5553:3:111","statements":[]},"src":"5549:146:111"},{"nodeType":"YulAssignment","src":"5704:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"5714:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5704:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5024:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5035:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5047:6:111","type":""}],"src":"4965:761:111"},{"body":{"nodeType":"YulBlock","src":"5832:125:111","statements":[{"nodeType":"YulAssignment","src":"5842:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5865:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5850:3:111"},"nodeType":"YulFunctionCall","src":"5850:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5842:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5884:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5899:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5907:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5895:3:111"},"nodeType":"YulFunctionCall","src":"5895:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5877:6:111"},"nodeType":"YulFunctionCall","src":"5877:74:111"},"nodeType":"YulExpressionStatement","src":"5877:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5801:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5812:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5823:4:111","type":""}],"src":"5731:226:111"},{"body":{"nodeType":"YulBlock","src":"6032:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"6078:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6087:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6090:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6080:6:111"},"nodeType":"YulFunctionCall","src":"6080:12:111"},"nodeType":"YulExpressionStatement","src":"6080:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6053:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6062:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6049:3:111"},"nodeType":"YulFunctionCall","src":"6049:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6074:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6045:3:111"},"nodeType":"YulFunctionCall","src":"6045:32:111"},"nodeType":"YulIf","src":"6042:52:111"},{"nodeType":"YulVariableDeclaration","src":"6103:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6129:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6116:12:111"},"nodeType":"YulFunctionCall","src":"6116:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6107:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6173:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6148:24:111"},"nodeType":"YulFunctionCall","src":"6148:31:111"},"nodeType":"YulExpressionStatement","src":"6148:31:111"},{"nodeType":"YulAssignment","src":"6188:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6198:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6188:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5998:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6009:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6021:6:111","type":""}],"src":"5962:247:111"},{"body":{"nodeType":"YulBlock","src":"6352:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"6398:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6407:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6410:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6400:6:111"},"nodeType":"YulFunctionCall","src":"6400:12:111"},"nodeType":"YulExpressionStatement","src":"6400:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6373:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6382:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6369:3:111"},"nodeType":"YulFunctionCall","src":"6369:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6394:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6365:3:111"},"nodeType":"YulFunctionCall","src":"6365:32:111"},"nodeType":"YulIf","src":"6362:52:111"},{"nodeType":"YulVariableDeclaration","src":"6423:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6450:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6437:12:111"},"nodeType":"YulFunctionCall","src":"6437:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6427:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6503:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6512:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6515:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6505:6:111"},"nodeType":"YulFunctionCall","src":"6505:12:111"},"nodeType":"YulExpressionStatement","src":"6505:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6475:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6483:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6472:2:111"},"nodeType":"YulFunctionCall","src":"6472:30:111"},"nodeType":"YulIf","src":"6469:50:111"},{"nodeType":"YulVariableDeclaration","src":"6528:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6542:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6553:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6538:3:111"},"nodeType":"YulFunctionCall","src":"6538:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6532:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6599:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6608:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6611:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6601:6:111"},"nodeType":"YulFunctionCall","src":"6601:12:111"},"nodeType":"YulExpressionStatement","src":"6601:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6580:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6589:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6576:3:111"},"nodeType":"YulFunctionCall","src":"6576:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6594:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6572:3:111"},"nodeType":"YulFunctionCall","src":"6572:26:111"},"nodeType":"YulIf","src":"6569:46:111"},{"nodeType":"YulAssignment","src":"6624:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"6634:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6624:6:111"}]},{"nodeType":"YulAssignment","src":"6645:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6683:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6668:3:111"},"nodeType":"YulFunctionCall","src":"6668:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6655:12:111"},"nodeType":"YulFunctionCall","src":"6655:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6645:6:111"}]},{"nodeType":"YulAssignment","src":"6696:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6734:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6719:3:111"},"nodeType":"YulFunctionCall","src":"6719:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6706:12:111"},"nodeType":"YulFunctionCall","src":"6706:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6696:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6302:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6313:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6325:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6333:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6341:6:111","type":""}],"src":"6214:530:111"},{"body":{"nodeType":"YulBlock","src":"6850:76:111","statements":[{"nodeType":"YulAssignment","src":"6860:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6872:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6883:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6868:3:111"},"nodeType":"YulFunctionCall","src":"6868:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6860:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6902:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"6913:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6895:6:111"},"nodeType":"YulFunctionCall","src":"6895:25:111"},"nodeType":"YulExpressionStatement","src":"6895:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6819:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6830:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6841:4:111","type":""}],"src":"6749:177:111"},{"body":{"nodeType":"YulBlock","src":"7026:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"7072:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7081:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7084:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7074:6:111"},"nodeType":"YulFunctionCall","src":"7074:12:111"},"nodeType":"YulExpressionStatement","src":"7074:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7047:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7056:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7043:3:111"},"nodeType":"YulFunctionCall","src":"7043:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7068:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7039:3:111"},"nodeType":"YulFunctionCall","src":"7039:32:111"},"nodeType":"YulIf","src":"7036:52:111"},{"nodeType":"YulVariableDeclaration","src":"7097:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7123:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7110:12:111"},"nodeType":"YulFunctionCall","src":"7110:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7101:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7167:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7142:24:111"},"nodeType":"YulFunctionCall","src":"7142:31:111"},"nodeType":"YulExpressionStatement","src":"7142:31:111"},{"nodeType":"YulAssignment","src":"7182:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7192:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7182:6:111"}]},{"nodeType":"YulAssignment","src":"7206:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7233:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7244:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7229:3:111"},"nodeType":"YulFunctionCall","src":"7229:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7216:12:111"},"nodeType":"YulFunctionCall","src":"7216:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7206:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6984:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6995:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7007:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7015:6:111","type":""}],"src":"6931:323:111"},{"body":{"nodeType":"YulBlock","src":"7355:861:111","statements":[{"body":{"nodeType":"YulBlock","src":"7401:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7410:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7413:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7403:6:111"},"nodeType":"YulFunctionCall","src":"7403:12:111"},"nodeType":"YulExpressionStatement","src":"7403:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7376:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7385:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7372:3:111"},"nodeType":"YulFunctionCall","src":"7372:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7397:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7368:3:111"},"nodeType":"YulFunctionCall","src":"7368:32:111"},"nodeType":"YulIf","src":"7365:52:111"},{"nodeType":"YulVariableDeclaration","src":"7426:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7452:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7439:12:111"},"nodeType":"YulFunctionCall","src":"7439:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7430:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7496:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7471:24:111"},"nodeType":"YulFunctionCall","src":"7471:31:111"},"nodeType":"YulExpressionStatement","src":"7471:31:111"},{"nodeType":"YulAssignment","src":"7511:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7521:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7511:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7535:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7545:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7539:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7556:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7587:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7598:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7583:3:111"},"nodeType":"YulFunctionCall","src":"7583:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7570:12:111"},"nodeType":"YulFunctionCall","src":"7570:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7560:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7611:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7621:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"7615:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7666:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7675:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7678:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7668:6:111"},"nodeType":"YulFunctionCall","src":"7668:12:111"},"nodeType":"YulExpressionStatement","src":"7668:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7654:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"7662:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7651:2:111"},"nodeType":"YulFunctionCall","src":"7651:14:111"},"nodeType":"YulIf","src":"7648:34:111"},{"nodeType":"YulVariableDeclaration","src":"7691:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7705:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7716:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7701:3:111"},"nodeType":"YulFunctionCall","src":"7701:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"7695:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7771:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7780:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7783:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7773:6:111"},"nodeType":"YulFunctionCall","src":"7773:12:111"},"nodeType":"YulExpressionStatement","src":"7773:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"7750:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"7754:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7746:3:111"},"nodeType":"YulFunctionCall","src":"7746:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7761:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7742:3:111"},"nodeType":"YulFunctionCall","src":"7742:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7735:6:111"},"nodeType":"YulFunctionCall","src":"7735:35:111"},"nodeType":"YulIf","src":"7732:55:111"},{"nodeType":"YulVariableDeclaration","src":"7796:26:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"7819:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7806:12:111"},"nodeType":"YulFunctionCall","src":"7806:16:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"7800:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7845:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"7847:16:111"},"nodeType":"YulFunctionCall","src":"7847:18:111"},"nodeType":"YulExpressionStatement","src":"7847:18:111"}]},"condition":{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"7837:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"7841:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7834:2:111"},"nodeType":"YulFunctionCall","src":"7834:10:111"},"nodeType":"YulIf","src":"7831:36:111"},{"nodeType":"YulVariableDeclaration","src":"7876:125:111","value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"7917:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"7921:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7913:3:111"},"nodeType":"YulFunctionCall","src":"7913:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"7928:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7909:3:111"},"nodeType":"YulFunctionCall","src":"7909:86:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7997:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7905:3:111"},"nodeType":"YulFunctionCall","src":"7905:95:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"7889:15:111"},"nodeType":"YulFunctionCall","src":"7889:112:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"7880:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"8017:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"8024:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8010:6:111"},"nodeType":"YulFunctionCall","src":"8010:17:111"},"nodeType":"YulExpressionStatement","src":"8010:17:111"},{"body":{"nodeType":"YulBlock","src":"8073:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8082:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8085:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8075:6:111"},"nodeType":"YulFunctionCall","src":"8075:12:111"},"nodeType":"YulExpressionStatement","src":"8075:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"8050:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"8054:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8046:3:111"},"nodeType":"YulFunctionCall","src":"8046:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8059:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8042:3:111"},"nodeType":"YulFunctionCall","src":"8042:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8064:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8039:2:111"},"nodeType":"YulFunctionCall","src":"8039:33:111"},"nodeType":"YulIf","src":"8036:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"8115:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8122:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8111:3:111"},"nodeType":"YulFunctionCall","src":"8111:14:111"},{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"8131:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8135:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8127:3:111"},"nodeType":"YulFunctionCall","src":"8127:11:111"},{"name":"_4","nodeType":"YulIdentifier","src":"8140:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"8098:12:111"},"nodeType":"YulFunctionCall","src":"8098:45:111"},"nodeType":"YulExpressionStatement","src":"8098:45:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"8167:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"8174:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8163:3:111"},"nodeType":"YulFunctionCall","src":"8163:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8179:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8159:3:111"},"nodeType":"YulFunctionCall","src":"8159:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8184:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8152:6:111"},"nodeType":"YulFunctionCall","src":"8152:34:111"},"nodeType":"YulExpressionStatement","src":"8152:34:111"},{"nodeType":"YulAssignment","src":"8195:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"8205:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8195:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7313:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7324:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7336:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7344:6:111","type":""}],"src":"7259:957:111"},{"body":{"nodeType":"YulBlock","src":"8322:76:111","statements":[{"nodeType":"YulAssignment","src":"8332:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8344:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8355:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8340:3:111"},"nodeType":"YulFunctionCall","src":"8340:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8332:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8374:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"8385:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8367:6:111"},"nodeType":"YulFunctionCall","src":"8367:25:111"},"nodeType":"YulExpressionStatement","src":"8367:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8291:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8302:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8313:4:111","type":""}],"src":"8221:177:111"},{"body":{"nodeType":"YulBlock","src":"8525:125:111","statements":[{"nodeType":"YulAssignment","src":"8535:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8547:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8558:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8543:3:111"},"nodeType":"YulFunctionCall","src":"8543:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8535:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8577:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8592:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8600:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8588:3:111"},"nodeType":"YulFunctionCall","src":"8588:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8570:6:111"},"nodeType":"YulFunctionCall","src":"8570:74:111"},"nodeType":"YulExpressionStatement","src":"8570:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8494:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8505:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8516:4:111","type":""}],"src":"8403:247:111"},{"body":{"nodeType":"YulBlock","src":"8778:489:111","statements":[{"body":{"nodeType":"YulBlock","src":"8824:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8833:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8836:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8826:6:111"},"nodeType":"YulFunctionCall","src":"8826:12:111"},"nodeType":"YulExpressionStatement","src":"8826:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8799:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8808:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8795:3:111"},"nodeType":"YulFunctionCall","src":"8795:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8820:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8791:3:111"},"nodeType":"YulFunctionCall","src":"8791:32:111"},"nodeType":"YulIf","src":"8788:52:111"},{"nodeType":"YulVariableDeclaration","src":"8849:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8875:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8862:12:111"},"nodeType":"YulFunctionCall","src":"8862:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8853:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8919:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8894:24:111"},"nodeType":"YulFunctionCall","src":"8894:31:111"},"nodeType":"YulExpressionStatement","src":"8894:31:111"},{"nodeType":"YulAssignment","src":"8934:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8944:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8934:6:111"}]},{"nodeType":"YulAssignment","src":"8958:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8985:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8996:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8981:3:111"},"nodeType":"YulFunctionCall","src":"8981:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8968:12:111"},"nodeType":"YulFunctionCall","src":"8968:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8958:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9009:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9040:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9051:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9036:3:111"},"nodeType":"YulFunctionCall","src":"9036:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9023:12:111"},"nodeType":"YulFunctionCall","src":"9023:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9013:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9098:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9107:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9110:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9100:6:111"},"nodeType":"YulFunctionCall","src":"9100:12:111"},"nodeType":"YulExpressionStatement","src":"9100:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9070:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9078:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9067:2:111"},"nodeType":"YulFunctionCall","src":"9067:30:111"},"nodeType":"YulIf","src":"9064:50:111"},{"nodeType":"YulVariableDeclaration","src":"9123:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9179:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9190:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9175:3:111"},"nodeType":"YulFunctionCall","src":"9175:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9199:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9149:25:111"},"nodeType":"YulFunctionCall","src":"9149:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"9127:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9137:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9216:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"9226:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9216:6:111"}]},{"nodeType":"YulAssignment","src":"9243:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9253:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9243:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8720:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8731:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8743:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8751:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8759:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8767:6:111","type":""}],"src":"8655:612:111"},{"body":{"nodeType":"YulBlock","src":"9499:1111:111","statements":[{"body":{"nodeType":"YulBlock","src":"9546:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9555:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9558:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9548:6:111"},"nodeType":"YulFunctionCall","src":"9548:12:111"},"nodeType":"YulExpressionStatement","src":"9548:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9520:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9529:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9516:3:111"},"nodeType":"YulFunctionCall","src":"9516:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9541:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9512:3:111"},"nodeType":"YulFunctionCall","src":"9512:33:111"},"nodeType":"YulIf","src":"9509:53:111"},{"nodeType":"YulVariableDeclaration","src":"9571:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9597:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9584:12:111"},"nodeType":"YulFunctionCall","src":"9584:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9575:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9641:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"9616:24:111"},"nodeType":"YulFunctionCall","src":"9616:31:111"},"nodeType":"YulExpressionStatement","src":"9616:31:111"},{"nodeType":"YulAssignment","src":"9656:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9666:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9656:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9680:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9712:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9723:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9708:3:111"},"nodeType":"YulFunctionCall","src":"9708:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9695:12:111"},"nodeType":"YulFunctionCall","src":"9695:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"9684:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"9761:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"9736:24:111"},"nodeType":"YulFunctionCall","src":"9736:33:111"},"nodeType":"YulExpressionStatement","src":"9736:33:111"},{"nodeType":"YulAssignment","src":"9778:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"9788:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9778:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9804:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9835:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9846:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9831:3:111"},"nodeType":"YulFunctionCall","src":"9831:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9818:12:111"},"nodeType":"YulFunctionCall","src":"9818:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9808:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9859:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9869:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9863:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9914:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9923:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9926:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9916:6:111"},"nodeType":"YulFunctionCall","src":"9916:12:111"},"nodeType":"YulExpressionStatement","src":"9916:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9902:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9910:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9899:2:111"},"nodeType":"YulFunctionCall","src":"9899:14:111"},"nodeType":"YulIf","src":"9896:34:111"},{"nodeType":"YulVariableDeclaration","src":"9939:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10007:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"10018:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10003:3:111"},"nodeType":"YulFunctionCall","src":"10003:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10027:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9965:37:111"},"nodeType":"YulFunctionCall","src":"9965:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"9943:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9953:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10044:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"10054:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10044:6:111"}]},{"nodeType":"YulAssignment","src":"10071:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"10081:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10071:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10098:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10131:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10142:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10127:3:111"},"nodeType":"YulFunctionCall","src":"10127:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10114:12:111"},"nodeType":"YulFunctionCall","src":"10114:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"10102:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10175:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10184:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10187:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10177:6:111"},"nodeType":"YulFunctionCall","src":"10177:12:111"},"nodeType":"YulExpressionStatement","src":"10177:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"10161:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10171:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10158:2:111"},"nodeType":"YulFunctionCall","src":"10158:16:111"},"nodeType":"YulIf","src":"10155:36:111"},{"nodeType":"YulVariableDeclaration","src":"10200:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10268:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"10279:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10264:3:111"},"nodeType":"YulFunctionCall","src":"10264:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10290:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"10226:37:111"},"nodeType":"YulFunctionCall","src":"10226:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"10204:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"10214:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10307:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"10317:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"10307:6:111"}]},{"nodeType":"YulAssignment","src":"10334:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"10344:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"10334:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10361:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10394:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10405:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10390:3:111"},"nodeType":"YulFunctionCall","src":"10390:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10377:12:111"},"nodeType":"YulFunctionCall","src":"10377:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"10365:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10439:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10448:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10451:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10441:6:111"},"nodeType":"YulFunctionCall","src":"10441:12:111"},"nodeType":"YulExpressionStatement","src":"10441:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"10425:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10435:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10422:2:111"},"nodeType":"YulFunctionCall","src":"10422:16:111"},"nodeType":"YulIf","src":"10419:36:111"},{"nodeType":"YulVariableDeclaration","src":"10464:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10520:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"10531:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10516:3:111"},"nodeType":"YulFunctionCall","src":"10516:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10542:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"10490:25:111"},"nodeType":"YulFunctionCall","src":"10490:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"10468:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"10478:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10559:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"10569:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"10559:6:111"}]},{"nodeType":"YulAssignment","src":"10586:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"10596:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"10586:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9409:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9420:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9432:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9440:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9448:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"9456:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"9464:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"9472:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"9480:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"9488:6:111","type":""}],"src":"9272:1338:111"},{"body":{"nodeType":"YulBlock","src":"10665:276:111","statements":[{"nodeType":"YulAssignment","src":"10675:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"10682:3:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"10675:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"10694:19:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10708:5:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"10698:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10722:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10731:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"10726:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10788:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10809:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10820:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10814:5:111"},"nodeType":"YulFunctionCall","src":"10814:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10802:6:111"},"nodeType":"YulFunctionCall","src":"10802:26:111"},"nodeType":"YulExpressionStatement","src":"10802:26:111"},{"nodeType":"YulVariableDeclaration","src":"10841:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10851:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"10845:2:111","type":""}]},{"nodeType":"YulAssignment","src":"10868:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10879:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10884:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10875:3:111"},"nodeType":"YulFunctionCall","src":"10875:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"10868:3:111"}]},{"nodeType":"YulAssignment","src":"10900:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10914:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10922:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10910:3:111"},"nodeType":"YulFunctionCall","src":"10910:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10900:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"10752:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"10755:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"10749:2:111"},"nodeType":"YulFunctionCall","src":"10749:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"10761:18:111","statements":[{"nodeType":"YulAssignment","src":"10763:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"10772:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"10775:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10768:3:111"},"nodeType":"YulFunctionCall","src":"10768:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"10763:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"10745:3:111","statements":[]},"src":"10741:194:111"}]},"name":"abi_encode_array_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"10649:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"10656:3:111","type":""}],"src":"10615:326:111"},{"body":{"nodeType":"YulBlock","src":"11093:95:111","statements":[{"nodeType":"YulAssignment","src":"11103:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11115:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11126:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11111:3:111"},"nodeType":"YulFunctionCall","src":"11111:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11103:4:111"}]},{"expression":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11164:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11172:9:111"}],"functionName":{"name":"abi_encode_array_uint256","nodeType":"YulIdentifier","src":"11139:24:111"},"nodeType":"YulFunctionCall","src":"11139:43:111"},"nodeType":"YulExpressionStatement","src":"11139:43:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11062:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11073:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11084:4:111","type":""}],"src":"10946:242:111"},{"body":{"nodeType":"YulBlock","src":"11350:666:111","statements":[{"body":{"nodeType":"YulBlock","src":"11397:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11406:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11409:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11399:6:111"},"nodeType":"YulFunctionCall","src":"11399:12:111"},"nodeType":"YulExpressionStatement","src":"11399:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11371:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11380:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11367:3:111"},"nodeType":"YulFunctionCall","src":"11367:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11392:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11363:3:111"},"nodeType":"YulFunctionCall","src":"11363:33:111"},"nodeType":"YulIf","src":"11360:53:111"},{"nodeType":"YulVariableDeclaration","src":"11422:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11448:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11435:12:111"},"nodeType":"YulFunctionCall","src":"11435:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"11426:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11492:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"11467:24:111"},"nodeType":"YulFunctionCall","src":"11467:31:111"},"nodeType":"YulExpressionStatement","src":"11467:31:111"},{"nodeType":"YulAssignment","src":"11507:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"11517:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11507:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11531:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11563:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11574:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11559:3:111"},"nodeType":"YulFunctionCall","src":"11559:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11546:12:111"},"nodeType":"YulFunctionCall","src":"11546:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"11535:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"11612:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"11587:24:111"},"nodeType":"YulFunctionCall","src":"11587:33:111"},"nodeType":"YulExpressionStatement","src":"11587:33:111"},{"nodeType":"YulAssignment","src":"11629:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"11639:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"11629:6:111"}]},{"nodeType":"YulAssignment","src":"11655:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11682:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11693:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11678:3:111"},"nodeType":"YulFunctionCall","src":"11678:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11665:12:111"},"nodeType":"YulFunctionCall","src":"11665:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"11655:6:111"}]},{"nodeType":"YulAssignment","src":"11706:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11733:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11744:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11729:3:111"},"nodeType":"YulFunctionCall","src":"11729:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11716:12:111"},"nodeType":"YulFunctionCall","src":"11716:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"11706:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11757:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11788:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11799:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11784:3:111"},"nodeType":"YulFunctionCall","src":"11784:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11771:12:111"},"nodeType":"YulFunctionCall","src":"11771:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"11761:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11847:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11856:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11859:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11849:6:111"},"nodeType":"YulFunctionCall","src":"11849:12:111"},"nodeType":"YulExpressionStatement","src":"11849:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"11819:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11827:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11816:2:111"},"nodeType":"YulFunctionCall","src":"11816:30:111"},"nodeType":"YulIf","src":"11813:50:111"},{"nodeType":"YulVariableDeclaration","src":"11872:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11928:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11939:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11924:3:111"},"nodeType":"YulFunctionCall","src":"11924:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11948:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"11898:25:111"},"nodeType":"YulFunctionCall","src":"11898:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"11876:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"11886:8:111","type":""}]},{"nodeType":"YulAssignment","src":"11965:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"11975:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"11965:6:111"}]},{"nodeType":"YulAssignment","src":"11992:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"12002:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"11992:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11276:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11287:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11299:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11307:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11315:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11323:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"11331:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"11339:6:111","type":""}],"src":"11193:823:111"},{"body":{"nodeType":"YulBlock","src":"12195:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12212:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12223:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12205:6:111"},"nodeType":"YulFunctionCall","src":"12205:21:111"},"nodeType":"YulExpressionStatement","src":"12205:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12246:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12257:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12242:3:111"},"nodeType":"YulFunctionCall","src":"12242:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12262:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12235:6:111"},"nodeType":"YulFunctionCall","src":"12235:30:111"},"nodeType":"YulExpressionStatement","src":"12235:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12285:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12296:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12281:3:111"},"nodeType":"YulFunctionCall","src":"12281:18:111"},{"hexValue":"77726f6e67206172726179206c656e67746873","kind":"string","nodeType":"YulLiteral","src":"12301:21:111","type":"","value":"wrong array lengths"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12274:6:111"},"nodeType":"YulFunctionCall","src":"12274:49:111"},"nodeType":"YulExpressionStatement","src":"12274:49:111"},{"nodeType":"YulAssignment","src":"12332:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12344:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12355:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12340:3:111"},"nodeType":"YulFunctionCall","src":"12340:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12332:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12172:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12186:4:111","type":""}],"src":"12021:343:111"},{"body":{"nodeType":"YulBlock","src":"12401:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12421:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12411:6:111"},"nodeType":"YulFunctionCall","src":"12411:88:111"},"nodeType":"YulExpressionStatement","src":"12411:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12515:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12518:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12508:6:111"},"nodeType":"YulFunctionCall","src":"12508:15:111"},"nodeType":"YulExpressionStatement","src":"12508:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12539:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12542:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12532:6:111"},"nodeType":"YulFunctionCall","src":"12532:15:111"},"nodeType":"YulExpressionStatement","src":"12532:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"12369:184:111"},{"body":{"nodeType":"YulBlock","src":"12652:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12662:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"12701:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12688:12:111"},"nodeType":"YulFunctionCall","src":"12688:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"12666:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12861:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12870:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12873:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12863:6:111"},"nodeType":"YulFunctionCall","src":"12863:12:111"},"nodeType":"YulExpressionStatement","src":"12863:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12736:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12764:12:111"},"nodeType":"YulFunctionCall","src":"12764:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"12780:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12760:3:111"},"nodeType":"YulFunctionCall","src":"12760:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"12791:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12756:3:111"},"nodeType":"YulFunctionCall","src":"12756:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12732:3:111"},"nodeType":"YulFunctionCall","src":"12732:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12725:6:111"},"nodeType":"YulFunctionCall","src":"12725:135:111"},"nodeType":"YulIf","src":"12722:155:111"},{"nodeType":"YulVariableDeclaration","src":"12886:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"12904:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12914:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12900:3:111"},"nodeType":"YulFunctionCall","src":"12900:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"12890:6:111","type":""}]},{"nodeType":"YulAssignment","src":"12942:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12965:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12952:12:111"},"nodeType":"YulFunctionCall","src":"12952:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"12942:6:111"}]},{"body":{"nodeType":"YulBlock","src":"13015:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13024:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13027:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13017:6:111"},"nodeType":"YulFunctionCall","src":"13017:12:111"},"nodeType":"YulExpressionStatement","src":"13017:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"12987:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12995:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12984:2:111"},"nodeType":"YulFunctionCall","src":"12984:30:111"},"nodeType":"YulIf","src":"12981:50:111"},{"nodeType":"YulAssignment","src":"13040:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"13052:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13060:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13048:3:111"},"nodeType":"YulFunctionCall","src":"13048:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"13040:4:111"}]},{"body":{"nodeType":"YulBlock","src":"13116:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13125:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13128:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13118:6:111"},"nodeType":"YulFunctionCall","src":"13118:12:111"},"nodeType":"YulExpressionStatement","src":"13118:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"13081:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13091:12:111"},"nodeType":"YulFunctionCall","src":"13091:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"13107:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13087:3:111"},"nodeType":"YulFunctionCall","src":"13087:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"13077:3:111"},"nodeType":"YulFunctionCall","src":"13077:38:111"},"nodeType":"YulIf","src":"13074:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"12609:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"12619:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"12635:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"12641:6:111","type":""}],"src":"12558:580:111"},{"body":{"nodeType":"YulBlock","src":"13175:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13192:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13195:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13185:6:111"},"nodeType":"YulFunctionCall","src":"13185:88:111"},"nodeType":"YulExpressionStatement","src":"13185:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13289:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13292:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13282:6:111"},"nodeType":"YulFunctionCall","src":"13282:15:111"},"nodeType":"YulExpressionStatement","src":"13282:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13313:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13316:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13306:6:111"},"nodeType":"YulFunctionCall","src":"13306:15:111"},"nodeType":"YulExpressionStatement","src":"13306:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"13143:184:111"},{"body":{"nodeType":"YulBlock","src":"13379:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"13470:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13472:16:111"},"nodeType":"YulFunctionCall","src":"13472:18:111"},"nodeType":"YulExpressionStatement","src":"13472:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13395:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13402:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"13392:2:111"},"nodeType":"YulFunctionCall","src":"13392:77:111"},"nodeType":"YulIf","src":"13389:103:111"},{"nodeType":"YulAssignment","src":"13501:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13512:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13519:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13508:3:111"},"nodeType":"YulFunctionCall","src":"13508:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"13501:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"13361:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"13371:3:111","type":""}],"src":"13332:195:111"},{"body":{"nodeType":"YulBlock","src":"13706:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13734:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13716:6:111"},"nodeType":"YulFunctionCall","src":"13716:21:111"},"nodeType":"YulExpressionStatement","src":"13716:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13757:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13768:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13753:3:111"},"nodeType":"YulFunctionCall","src":"13753:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13773:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13746:6:111"},"nodeType":"YulFunctionCall","src":"13746:30:111"},"nodeType":"YulExpressionStatement","src":"13746:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13796:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13807:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13792:3:111"},"nodeType":"YulFunctionCall","src":"13792:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"13812:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13785:6:111"},"nodeType":"YulFunctionCall","src":"13785:62:111"},"nodeType":"YulExpressionStatement","src":"13785:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13878:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13863:3:111"},"nodeType":"YulFunctionCall","src":"13863:18:111"},{"hexValue":"64656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"13883:14:111","type":"","value":"delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13856:6:111"},"nodeType":"YulFunctionCall","src":"13856:42:111"},"nodeType":"YulExpressionStatement","src":"13856:42:111"},{"nodeType":"YulAssignment","src":"13907:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13919:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13930:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13915:3:111"},"nodeType":"YulFunctionCall","src":"13915:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13907:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13683:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13697:4:111","type":""}],"src":"13532:408:111"},{"body":{"nodeType":"YulBlock","src":"14119:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14136:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14147:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14129:6:111"},"nodeType":"YulFunctionCall","src":"14129:21:111"},"nodeType":"YulExpressionStatement","src":"14129:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14170:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14181:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14166:3:111"},"nodeType":"YulFunctionCall","src":"14166:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14186:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14159:6:111"},"nodeType":"YulFunctionCall","src":"14159:30:111"},"nodeType":"YulExpressionStatement","src":"14159:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14209:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14220:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14205:3:111"},"nodeType":"YulFunctionCall","src":"14205:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"14225:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14198:6:111"},"nodeType":"YulFunctionCall","src":"14198:62:111"},"nodeType":"YulExpressionStatement","src":"14198:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14291:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14276:3:111"},"nodeType":"YulFunctionCall","src":"14276:18:111"},{"hexValue":"6163746976652070726f7879","kind":"string","nodeType":"YulLiteral","src":"14296:14:111","type":"","value":"active proxy"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14269:6:111"},"nodeType":"YulFunctionCall","src":"14269:42:111"},"nodeType":"YulExpressionStatement","src":"14269:42:111"},{"nodeType":"YulAssignment","src":"14320:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14332:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14343:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14328:3:111"},"nodeType":"YulFunctionCall","src":"14328:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14320:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14096:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14110:4:111","type":""}],"src":"13945:408:111"},{"body":{"nodeType":"YulBlock","src":"14503:168:111","statements":[{"nodeType":"YulAssignment","src":"14513:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14525:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14536:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14521:3:111"},"nodeType":"YulFunctionCall","src":"14521:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14513:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14555:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14570:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14578:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14566:3:111"},"nodeType":"YulFunctionCall","src":"14566:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14548:6:111"},"nodeType":"YulFunctionCall","src":"14548:74:111"},"nodeType":"YulExpressionStatement","src":"14548:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14642:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14653:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14638:3:111"},"nodeType":"YulFunctionCall","src":"14638:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"14658:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14631:6:111"},"nodeType":"YulFunctionCall","src":"14631:34:111"},"nodeType":"YulExpressionStatement","src":"14631:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14464:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14475:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14483:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14494:4:111","type":""}],"src":"14358:313:111"},{"body":{"nodeType":"YulBlock","src":"14850:246:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14878:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14860:6:111"},"nodeType":"YulFunctionCall","src":"14860:21:111"},"nodeType":"YulExpressionStatement","src":"14860:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14901:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14912:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14897:3:111"},"nodeType":"YulFunctionCall","src":"14897:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14917:2:111","type":"","value":"56"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14890:6:111"},"nodeType":"YulFunctionCall","src":"14890:30:111"},"nodeType":"YulExpressionStatement","src":"14890:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14940:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14951:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14936:3:111"},"nodeType":"YulFunctionCall","src":"14936:18:111"},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c","kind":"string","nodeType":"YulLiteral","src":"14956:34:111","type":"","value":"UUPSUpgradeable: must not be cal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14929:6:111"},"nodeType":"YulFunctionCall","src":"14929:62:111"},"nodeType":"YulExpressionStatement","src":"14929:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15011:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15022:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15007:3:111"},"nodeType":"YulFunctionCall","src":"15007:18:111"},{"hexValue":"6c6564207468726f7567682064656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"15027:26:111","type":"","value":"led through delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15000:6:111"},"nodeType":"YulFunctionCall","src":"15000:54:111"},"nodeType":"YulExpressionStatement","src":"15000:54:111"},{"nodeType":"YulAssignment","src":"15063:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15075:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15086:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15071:3:111"},"nodeType":"YulFunctionCall","src":"15071:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15063:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14827:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14841:4:111","type":""}],"src":"14676:420:111"},{"body":{"nodeType":"YulBlock","src":"15182:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"15228:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15237:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15240:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15230:6:111"},"nodeType":"YulFunctionCall","src":"15230:12:111"},"nodeType":"YulExpressionStatement","src":"15230:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15203:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15212:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15199:3:111"},"nodeType":"YulFunctionCall","src":"15199:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15224:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15195:3:111"},"nodeType":"YulFunctionCall","src":"15195:32:111"},"nodeType":"YulIf","src":"15192:52:111"},{"nodeType":"YulAssignment","src":"15253:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15269:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15263:5:111"},"nodeType":"YulFunctionCall","src":"15263:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15253:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15148:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15159:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15171:6:111","type":""}],"src":"15101:184:111"},{"body":{"nodeType":"YulBlock","src":"15464:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15481:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15492:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15474:6:111"},"nodeType":"YulFunctionCall","src":"15474:21:111"},"nodeType":"YulExpressionStatement","src":"15474:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15526:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15511:3:111"},"nodeType":"YulFunctionCall","src":"15511:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15531:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15504:6:111"},"nodeType":"YulFunctionCall","src":"15504:30:111"},"nodeType":"YulExpressionStatement","src":"15504:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15554:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15565:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15550:3:111"},"nodeType":"YulFunctionCall","src":"15550:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561","kind":"string","nodeType":"YulLiteral","src":"15570:34:111","type":"","value":"Initializable: contract is alrea"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15543:6:111"},"nodeType":"YulFunctionCall","src":"15543:62:111"},"nodeType":"YulExpressionStatement","src":"15543:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15625:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15636:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15621:3:111"},"nodeType":"YulFunctionCall","src":"15621:18:111"},{"hexValue":"647920696e697469616c697a6564","kind":"string","nodeType":"YulLiteral","src":"15641:16:111","type":"","value":"dy initialized"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15614:6:111"},"nodeType":"YulFunctionCall","src":"15614:44:111"},"nodeType":"YulExpressionStatement","src":"15614:44:111"},{"nodeType":"YulAssignment","src":"15667:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15679:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15690:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15675:3:111"},"nodeType":"YulFunctionCall","src":"15675:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15667:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15441:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15455:4:111","type":""}],"src":"15290:410:111"},{"body":{"nodeType":"YulBlock","src":"15812:87:111","statements":[{"nodeType":"YulAssignment","src":"15822:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15834:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15845:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15830:3:111"},"nodeType":"YulFunctionCall","src":"15830:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15822:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15864:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15879:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15887:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15875:3:111"},"nodeType":"YulFunctionCall","src":"15875:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15857:6:111"},"nodeType":"YulFunctionCall","src":"15857:36:111"},"nodeType":"YulExpressionStatement","src":"15857:36:111"}]},"name":"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15781:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15792:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15803:4:111","type":""}],"src":"15705:194:111"},{"body":{"nodeType":"YulBlock","src":"16041:225:111","statements":[{"nodeType":"YulAssignment","src":"16051:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16063:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16074:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16059:3:111"},"nodeType":"YulFunctionCall","src":"16059:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16051:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16093:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16108:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16116:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16104:3:111"},"nodeType":"YulFunctionCall","src":"16104:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16086:6:111"},"nodeType":"YulFunctionCall","src":"16086:74:111"},"nodeType":"YulExpressionStatement","src":"16086:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16180:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16191:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16176:3:111"},"nodeType":"YulFunctionCall","src":"16176:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"16200:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16208:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16196:3:111"},"nodeType":"YulFunctionCall","src":"16196:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16169:6:111"},"nodeType":"YulFunctionCall","src":"16169:91:111"},"nodeType":"YulExpressionStatement","src":"16169:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16002:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"16013:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16021:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16032:4:111","type":""}],"src":"15904:362:111"},{"body":{"nodeType":"YulBlock","src":"16445:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16462:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16473:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16455:6:111"},"nodeType":"YulFunctionCall","src":"16455:21:111"},"nodeType":"YulExpressionStatement","src":"16455:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16496:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16507:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16492:3:111"},"nodeType":"YulFunctionCall","src":"16492:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16512:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16485:6:111"},"nodeType":"YulFunctionCall","src":"16485:30:111"},"nodeType":"YulExpressionStatement","src":"16485:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16535:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16546:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16531:3:111"},"nodeType":"YulFunctionCall","src":"16531:18:111"},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"16551:34:111","type":"","value":"account: not Owner or EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16524:6:111"},"nodeType":"YulFunctionCall","src":"16524:62:111"},"nodeType":"YulExpressionStatement","src":"16524:62:111"},{"nodeType":"YulAssignment","src":"16595:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16618:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16603:3:111"},"nodeType":"YulFunctionCall","src":"16603:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16595:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16422:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16436:4:111","type":""}],"src":"16271:356:111"},{"body":{"nodeType":"YulBlock","src":"16685:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16695:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16704:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"16699:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16764:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16789:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16794:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16785:3:111"},"nodeType":"YulFunctionCall","src":"16785:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"16808:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16813:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16804:3:111"},"nodeType":"YulFunctionCall","src":"16804:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16798:5:111"},"nodeType":"YulFunctionCall","src":"16798:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16778:6:111"},"nodeType":"YulFunctionCall","src":"16778:39:111"},"nodeType":"YulExpressionStatement","src":"16778:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16725:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16728:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16722:2:111"},"nodeType":"YulFunctionCall","src":"16722:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"16736:19:111","statements":[{"nodeType":"YulAssignment","src":"16738:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16747:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"16750:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16743:3:111"},"nodeType":"YulFunctionCall","src":"16743:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"16738:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"16718:3:111","statements":[]},"src":"16714:113:111"},{"body":{"nodeType":"YulBlock","src":"16853:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16866:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16871:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16862:3:111"},"nodeType":"YulFunctionCall","src":"16862:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"16880:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16855:6:111"},"nodeType":"YulFunctionCall","src":"16855:27:111"},"nodeType":"YulExpressionStatement","src":"16855:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16842:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16845:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16839:2:111"},"nodeType":"YulFunctionCall","src":"16839:13:111"},"nodeType":"YulIf","src":"16836:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"16663:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"16668:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16673:6:111","type":""}],"src":"16632:258:111"},{"body":{"nodeType":"YulBlock","src":"17032:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17042:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17062:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17056:5:111"},"nodeType":"YulFunctionCall","src":"17056:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"17046:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17104:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17112:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17100:3:111"},"nodeType":"YulFunctionCall","src":"17100:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"17119:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17124:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"17078:21:111"},"nodeType":"YulFunctionCall","src":"17078:53:111"},"nodeType":"YulExpressionStatement","src":"17078:53:111"},{"nodeType":"YulAssignment","src":"17140:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17151:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17156:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17147:3:111"},"nodeType":"YulFunctionCall","src":"17147:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17140:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17008:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17013:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17024:3:111","type":""}],"src":"16895:274:111"},{"body":{"nodeType":"YulBlock","src":"17348:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17365:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17376:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17358:6:111"},"nodeType":"YulFunctionCall","src":"17358:21:111"},"nodeType":"YulExpressionStatement","src":"17358:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17399:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17410:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17395:3:111"},"nodeType":"YulFunctionCall","src":"17395:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17415:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17388:6:111"},"nodeType":"YulFunctionCall","src":"17388:30:111"},"nodeType":"YulExpressionStatement","src":"17388:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17438:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17449:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17434:3:111"},"nodeType":"YulFunctionCall","src":"17434:18:111"},{"hexValue":"6f6e6c79206f776e6572","kind":"string","nodeType":"YulLiteral","src":"17454:12:111","type":"","value":"only owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17427:6:111"},"nodeType":"YulFunctionCall","src":"17427:40:111"},"nodeType":"YulExpressionStatement","src":"17427:40:111"},{"nodeType":"YulAssignment","src":"17476:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17488:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17499:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17484:3:111"},"nodeType":"YulFunctionCall","src":"17484:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17476:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17325:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17339:4:111","type":""}],"src":"17174:334:111"},{"body":{"nodeType":"YulBlock","src":"17731:384:111","statements":[{"nodeType":"YulAssignment","src":"17741:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17753:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17764:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17749:3:111"},"nodeType":"YulFunctionCall","src":"17749:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17741:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"17777:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"17788:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"17781:3:111","type":""}]},{"nodeType":"YulAssignment","src":"17806:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"17813:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"17806:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"17831:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"17845:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"17835:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17860:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"17869:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"17864:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"17926:121:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17947:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"17958:6:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"17952:5:111"},"nodeType":"YulFunctionCall","src":"17952:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17940:6:111"},"nodeType":"YulFunctionCall","src":"17940:26:111"},"nodeType":"YulExpressionStatement","src":"17940:26:111"},{"nodeType":"YulAssignment","src":"17979:21:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17990:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17995:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17986:3:111"},"nodeType":"YulFunctionCall","src":"17986:14:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"17979:3:111"}]},{"nodeType":"YulAssignment","src":"18013:24:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"18027:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18035:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18023:3:111"},"nodeType":"YulFunctionCall","src":"18023:14:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"18013:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"17890:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"17893:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"17887:2:111"},"nodeType":"YulFunctionCall","src":"17887:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"17899:18:111","statements":[{"nodeType":"YulAssignment","src":"17901:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"17910:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"17913:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17906:3:111"},"nodeType":"YulFunctionCall","src":"17906:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"17901:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"17883:3:111","statements":[]},"src":"17879:168:111"},{"expression":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"18081:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18104:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18089:3:111"},"nodeType":"YulFunctionCall","src":"18089:19:111"}],"functionName":{"name":"abi_encode_array_uint256","nodeType":"YulIdentifier","src":"18056:24:111"},"nodeType":"YulFunctionCall","src":"18056:53:111"},"nodeType":"YulExpressionStatement","src":"18056:53:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_storage_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17692:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"17703:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17711:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17722:4:111","type":""}],"src":"17513:602:111"},{"body":{"nodeType":"YulBlock","src":"18201:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"18247:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18256:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18259:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18249:6:111"},"nodeType":"YulFunctionCall","src":"18249:12:111"},"nodeType":"YulExpressionStatement","src":"18249:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"18222:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"18231:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18218:3:111"},"nodeType":"YulFunctionCall","src":"18218:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"18243:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18214:3:111"},"nodeType":"YulFunctionCall","src":"18214:32:111"},"nodeType":"YulIf","src":"18211:52:111"},{"nodeType":"YulAssignment","src":"18272:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18288:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18282:5:111"},"nodeType":"YulFunctionCall","src":"18282:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18272:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18167:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"18178:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"18190:6:111","type":""}],"src":"18120:184:111"},{"body":{"nodeType":"YulBlock","src":"18483:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18500:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18511:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18493:6:111"},"nodeType":"YulFunctionCall","src":"18493:21:111"},"nodeType":"YulExpressionStatement","src":"18493:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18534:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18545:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18530:3:111"},"nodeType":"YulFunctionCall","src":"18530:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18550:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18523:6:111"},"nodeType":"YulFunctionCall","src":"18523:30:111"},"nodeType":"YulExpressionStatement","src":"18523:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18573:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18584:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18569:3:111"},"nodeType":"YulFunctionCall","src":"18569:18:111"},{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"18589:34:111","type":"","value":"ERC1967Upgrade: new implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18562:6:111"},"nodeType":"YulFunctionCall","src":"18562:62:111"},"nodeType":"YulExpressionStatement","src":"18562:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18644:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18655:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18640:3:111"},"nodeType":"YulFunctionCall","src":"18640:18:111"},{"hexValue":"6f6e206973206e6f742055555053","kind":"string","nodeType":"YulLiteral","src":"18660:16:111","type":"","value":"on is not UUPS"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18633:6:111"},"nodeType":"YulFunctionCall","src":"18633:44:111"},"nodeType":"YulExpressionStatement","src":"18633:44:111"},{"nodeType":"YulAssignment","src":"18686:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18698:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18709:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18694:3:111"},"nodeType":"YulFunctionCall","src":"18694:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18686:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18460:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18474:4:111","type":""}],"src":"18309:410:111"},{"body":{"nodeType":"YulBlock","src":"18898:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18915:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18926:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18908:6:111"},"nodeType":"YulFunctionCall","src":"18908:21:111"},"nodeType":"YulExpressionStatement","src":"18908:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18949:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18960:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18945:3:111"},"nodeType":"YulFunctionCall","src":"18945:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18965:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18938:6:111"},"nodeType":"YulFunctionCall","src":"18938:30:111"},"nodeType":"YulExpressionStatement","src":"18938:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18988:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18999:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18984:3:111"},"nodeType":"YulFunctionCall","src":"18984:18:111"},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f78","kind":"string","nodeType":"YulLiteral","src":"19004:34:111","type":"","value":"ERC1967Upgrade: unsupported prox"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18977:6:111"},"nodeType":"YulFunctionCall","src":"18977:62:111"},"nodeType":"YulExpressionStatement","src":"18977:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19059:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19070:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19055:3:111"},"nodeType":"YulFunctionCall","src":"19055:18:111"},{"hexValue":"6961626c6555554944","kind":"string","nodeType":"YulLiteral","src":"19075:11:111","type":"","value":"iableUUID"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19048:6:111"},"nodeType":"YulFunctionCall","src":"19048:39:111"},"nodeType":"YulExpressionStatement","src":"19048:39:111"},{"nodeType":"YulAssignment","src":"19096:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19108:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19119:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19104:3:111"},"nodeType":"YulFunctionCall","src":"19104:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19096:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18875:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18889:4:111","type":""}],"src":"18724:405:111"},{"body":{"nodeType":"YulBlock","src":"19308:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19336:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19318:6:111"},"nodeType":"YulFunctionCall","src":"19318:21:111"},"nodeType":"YulExpressionStatement","src":"19318:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19370:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19355:3:111"},"nodeType":"YulFunctionCall","src":"19355:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19375:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19348:6:111"},"nodeType":"YulFunctionCall","src":"19348:30:111"},"nodeType":"YulExpressionStatement","src":"19348:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19398:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19409:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19394:3:111"},"nodeType":"YulFunctionCall","src":"19394:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"19414:30:111","type":"","value":"account: not from EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19387:6:111"},"nodeType":"YulFunctionCall","src":"19387:58:111"},"nodeType":"YulExpressionStatement","src":"19387:58:111"},{"nodeType":"YulAssignment","src":"19454:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19466:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19477:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19462:3:111"},"nodeType":"YulFunctionCall","src":"19462:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19454:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19285:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19299:4:111","type":""}],"src":"19134:352:111"},{"body":{"nodeType":"YulBlock","src":"19540:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"19562:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"19564:16:111"},"nodeType":"YulFunctionCall","src":"19564:18:111"},"nodeType":"YulExpressionStatement","src":"19564:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"19556:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"19559:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"19553:2:111"},"nodeType":"YulFunctionCall","src":"19553:8:111"},"nodeType":"YulIf","src":"19550:34:111"},{"nodeType":"YulAssignment","src":"19593:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"19605:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"19608:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19601:3:111"},"nodeType":"YulFunctionCall","src":"19601:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"19593:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"19522:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"19525:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"19531:4:111","type":""}],"src":"19491:125:111"},{"body":{"nodeType":"YulBlock","src":"19751:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"19789:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19798:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19801:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19791:6:111"},"nodeType":"YulFunctionCall","src":"19791:12:111"},"nodeType":"YulExpressionStatement","src":"19791:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"19767:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"19779:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19764:2:111"},"nodeType":"YulFunctionCall","src":"19764:24:111"},"nodeType":"YulIf","src":"19761:44:111"},{"body":{"nodeType":"YulBlock","src":"19838:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19847:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19850:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19840:6:111"},"nodeType":"YulFunctionCall","src":"19840:12:111"},"nodeType":"YulExpressionStatement","src":"19840:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"19820:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"19830:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19817:2:111"},"nodeType":"YulFunctionCall","src":"19817:20:111"},"nodeType":"YulIf","src":"19814:40:111"},{"nodeType":"YulAssignment","src":"19863:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"19880:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"19888:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19876:3:111"},"nodeType":"YulFunctionCall","src":"19876:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"19863:9:111"}]},{"nodeType":"YulAssignment","src":"19908:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"19925:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"19935:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19921:3:111"},"nodeType":"YulFunctionCall","src":"19921:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"19908:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"19685:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"19693:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"19701:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"19713:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"19726:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"19737:9:111","type":""}],"src":"19621:331:111"},{"body":{"nodeType":"YulBlock","src":"20110:124:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20133:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"20138:6:111"},{"name":"value1","nodeType":"YulIdentifier","src":"20146:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"20120:12:111"},"nodeType":"YulFunctionCall","src":"20120:33:111"},"nodeType":"YulExpressionStatement","src":"20120:33:111"},{"nodeType":"YulVariableDeclaration","src":"20162:26:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20176:3:111"},{"name":"value1","nodeType":"YulIdentifier","src":"20181:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20172:3:111"},"nodeType":"YulFunctionCall","src":"20172:16:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"20166:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"20204:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"20208:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20197:6:111"},"nodeType":"YulFunctionCall","src":"20197:13:111"},"nodeType":"YulExpressionStatement","src":"20197:13:111"},{"nodeType":"YulAssignment","src":"20219:9:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"20226:2:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"20219:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_calldata_ptr_slice__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"20078:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"20083:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20091:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20102:3:111","type":""}],"src":"19957:277:111"},{"body":{"nodeType":"YulBlock","src":"20413:162:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20430:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20441:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20423:6:111"},"nodeType":"YulFunctionCall","src":"20423:21:111"},"nodeType":"YulExpressionStatement","src":"20423:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20475:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20460:3:111"},"nodeType":"YulFunctionCall","src":"20460:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20480:2:111","type":"","value":"12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20453:6:111"},"nodeType":"YulFunctionCall","src":"20453:30:111"},"nodeType":"YulExpressionStatement","src":"20453:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20503:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20514:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20499:3:111"},"nodeType":"YulFunctionCall","src":"20499:18:111"},{"hexValue":"77726f6e67207075626b6579","kind":"string","nodeType":"YulLiteral","src":"20519:14:111","type":"","value":"wrong pubkey"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20492:6:111"},"nodeType":"YulFunctionCall","src":"20492:42:111"},"nodeType":"YulExpressionStatement","src":"20492:42:111"},{"nodeType":"YulAssignment","src":"20543:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20555:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20566:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20551:3:111"},"nodeType":"YulFunctionCall","src":"20551:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20543:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0d47f95102ecb77a503f8bf26fe03155315a477d7b00a1b0cee7c3b13797c2b5__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20390:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20404:4:111","type":""}],"src":"20239:336:111"},{"body":{"nodeType":"YulBlock","src":"20771:14:111","statements":[{"nodeType":"YulAssignment","src":"20773:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"20780:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"20773:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"20755:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20763:3:111","type":""}],"src":"20580:205:111"},{"body":{"nodeType":"YulBlock","src":"20964:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20981:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20992:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20974:6:111"},"nodeType":"YulFunctionCall","src":"20974:21:111"},"nodeType":"YulExpressionStatement","src":"20974:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21015:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21026:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21011:3:111"},"nodeType":"YulFunctionCall","src":"21011:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21031:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21004:6:111"},"nodeType":"YulFunctionCall","src":"21004:30:111"},"nodeType":"YulExpressionStatement","src":"21004:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21054:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21065:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21050:3:111"},"nodeType":"YulFunctionCall","src":"21050:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"21070:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21043:6:111"},"nodeType":"YulFunctionCall","src":"21043:62:111"},"nodeType":"YulExpressionStatement","src":"21043:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21125:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21136:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21121:3:111"},"nodeType":"YulFunctionCall","src":"21121:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"21141:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21114:6:111"},"nodeType":"YulFunctionCall","src":"21114:43:111"},"nodeType":"YulExpressionStatement","src":"21114:43:111"},{"nodeType":"YulAssignment","src":"21166:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21178:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21189:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21174:3:111"},"nodeType":"YulFunctionCall","src":"21174:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21166:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20941:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20955:4:111","type":""}],"src":"20790:409:111"},{"body":{"nodeType":"YulBlock","src":"21378:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21395:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21406:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21388:6:111"},"nodeType":"YulFunctionCall","src":"21388:21:111"},"nodeType":"YulExpressionStatement","src":"21388:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21440:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21425:3:111"},"nodeType":"YulFunctionCall","src":"21425:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21445:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21418:6:111"},"nodeType":"YulFunctionCall","src":"21418:30:111"},"nodeType":"YulExpressionStatement","src":"21418:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21468:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21479:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21464:3:111"},"nodeType":"YulFunctionCall","src":"21464:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"21484:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21457:6:111"},"nodeType":"YulFunctionCall","src":"21457:59:111"},"nodeType":"YulExpressionStatement","src":"21457:59:111"},{"nodeType":"YulAssignment","src":"21525:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21537:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21548:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21533:3:111"},"nodeType":"YulFunctionCall","src":"21533:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21525:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21355:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21369:4:111","type":""}],"src":"21204:353:111"},{"body":{"nodeType":"YulBlock","src":"21683:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21700:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21711:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21693:6:111"},"nodeType":"YulFunctionCall","src":"21693:21:111"},"nodeType":"YulExpressionStatement","src":"21693:21:111"},{"nodeType":"YulVariableDeclaration","src":"21723:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21743:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21737:5:111"},"nodeType":"YulFunctionCall","src":"21737:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"21727:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21770:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21781:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21766:3:111"},"nodeType":"YulFunctionCall","src":"21766:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"21786:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21759:6:111"},"nodeType":"YulFunctionCall","src":"21759:34:111"},"nodeType":"YulExpressionStatement","src":"21759:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21828:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21836:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21824:3:111"},"nodeType":"YulFunctionCall","src":"21824:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21856:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21841:3:111"},"nodeType":"YulFunctionCall","src":"21841:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"21861:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"21802:21:111"},"nodeType":"YulFunctionCall","src":"21802:66:111"},"nodeType":"YulExpressionStatement","src":"21802:66:111"},{"nodeType":"YulAssignment","src":"21877:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21893:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"21912:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21920:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21908:3:111"},"nodeType":"YulFunctionCall","src":"21908:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"21925:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"21904:3:111"},"nodeType":"YulFunctionCall","src":"21904:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21889:3:111"},"nodeType":"YulFunctionCall","src":"21889:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"21995:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21885:3:111"},"nodeType":"YulFunctionCall","src":"21885:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21877:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21652:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"21663:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21674:4:111","type":""}],"src":"21562:442:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_address_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n if iszero(slt(add(headStart, 0x1f), dataEnd)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(headStart, 128)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := headStart\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, 0x20)\n }\n value0 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let array := allocate_memory(add(and(add(_4, 0x1f), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), _1))\n mstore(array, _4)\n if gt(add(add(_3, _4), _1), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, _1), add(_3, _1), _4)\n mstore(add(add(array, _4), _1), 0)\n value1 := array\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_encode_array_uint256(value, pos)\n {\n pos := pos\n let srcPtr := value\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n abi_encode_array_uint256(value0, headStart)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong array lengths\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"active proxy\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 56)\n mstore(add(headStart, 64), \"UUPSUpgradeable: must not be cal\")\n mstore(add(headStart, 96), \"led through delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"Initializable: contract is alrea\")\n mstore(add(headStart, 96), \"dy initialized\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"account: not Owner or EntryPoint\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"only owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_storage_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 256)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, sload(srcPtr))\n pos := add(pos, 0x20)\n srcPtr := add(srcPtr, 1)\n }\n abi_encode_array_uint256(value1, add(headStart, 128))\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"ERC1967Upgrade: new implementati\")\n mstore(add(headStart, 96), \"on is not UUPS\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"ERC1967Upgrade: unsupported prox\")\n mstore(add(headStart, 96), \"iableUUID\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from EntryPoint\")\n tail := add(headStart, 96)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr_slice__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n end := _1\n }\n function abi_encode_tuple_t_stringliteral_0d47f95102ecb77a503f8bf26fe03155315a477d7b00a1b0cee7c3b13797c2b5__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 12)\n mstore(add(headStart, 64), \"wrong pubkey\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"3559":[{"length":32,"start":1863},{"length":32,"start":2013},{"length":32,"start":2705},{"length":32,"start":2855},{"length":32,"start":3158}],"13841":[{"length":32,"start":975},{"length":32,"start":2342},{"length":32,"start":2509},{"length":32,"start":3491},{"length":32,"start":4058},{"length":32,"start":4473},{"length":32,"start":5435},{"length":32,"start":6053}],"14768":[{"length":32,"start":680},{"length":32,"start":5804}]},"linkReferences":{},"object":"6080604052600436106101785760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae146104a5578063ee472f36146104c7578063f23a6e61146104e757600080fd5b8063c399ec881461045b578063c4d66de814610470578063d087d2881461049057600080fd5b8063b0d691fe116100b0578063b0d691fe146103c0578063b61d27f6146103f3578063bc197c811461041357600080fd5b806352d1902d146103785780638da5cb5b1461038d57600080fd5b8063245a7bfc1161012d5780634a58db19116101075780634a58db191461033d5780634d44560d146103455780634f1ef2861461036557600080fd5b8063245a7bfc146102965780633659cfe6146102ef5780633a871cdd1461030f57600080fd5b8063150b7a021161015e578063150b7a02146101e057806318dfb3c71461025657806318fc5c441461027657600080fd5b806223de291461018457806301ffc9a7146101ab57600080fd5b3661017f57005b600080fd5b34801561019057600080fd5b506101a961019f366004611b89565b5050505050505050565b005b3480156101b757600080fd5b506101cb6101c6366004611c3a565b61052d565b60405190151581526020015b60405180910390f35b3480156101ec57600080fd5b506102256101fb366004611c7c565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101d7565b34801561026257600080fd5b506101a9610271366004611d34565b610612565b34801561028257600080fd5b506101a9610291366004611e1e565b61071c565b3480156102a257600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d7565b3480156102fb57600080fd5b506101a961030a366004611e9c565b610730565b34801561031b57600080fd5b5061032f61032a366004611eb9565b6108fe565b6040519081526020016101d7565b6101a9610924565b34801561035157600080fd5b506101a9610360366004611f0d565b6109c3565b6101a9610373366004611f39565b610a7a565b34801561038457600080fd5b5061032f610c3c565b34801561039957600080fd5b506000546102ca9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ca565b3480156103ff57600080fd5b506101a961040e366004611fff565b610d0e565b34801561041f57600080fd5b5061022561042e36600461204f565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561046757600080fd5b5061032f610d5d565b34801561047c57600080fd5b506101a961048b366004611e9c565b610e14565b34801561049c57600080fd5b5061032f610f8d565b3480156104b157600080fd5b506104ba611009565b6040516101d79190612110565b3480156104d357600080fd5b506101a96104e2366004611e1e565b611044565b3480156104f357600080fd5b5061022561050236600461211e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806105c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061060c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61061a611161565b82811461066e5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156107155761070385858381811061068e5761068e61219a565b90506020020160208101906106a39190611e9c565b60008585858181106106b7576106b761219a565b90506020028101906106c991906121c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b8061070d8161225d565b915050610671565b5050505050565b61072461128d565b61072d81611304565b50565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107db5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108d95760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b6108e28161134b565b6040805160008082526020820190925261072d91839190611353565b6000610908611523565b61091284846115a8565b905061091d826116e4565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109af57600080fd5b505af1158015610715573d6000803e3d6000fd5b6109cb61128d565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b255760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b9a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c235760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b610c2c8261134b565b610c3882826001611353565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ce95760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610665565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d16611161565b610d57848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612295565b905090565b600054610100900460ff1615808015610e345750600054600160ff909116105b80610e4e5750303b158015610e4e575060005460ff166001145b610ec05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f1e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f278261174f565b8015610c3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dce565b611011611aad565b6040805160808101918290529060019060049082845b815481526020019060010190808311611027575050505050905090565b600054610100900460ff16158080156110645750600054600160ff909116105b8061107e5750303b15801561107e575060005460ff166001145b6110f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611158600061174f565b610f2782611304565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806111c2575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61120e5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610665565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161123991906122da565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50915091508161071557805160208201fd5b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806112b857503330145b61120e5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610665565b7f42e4c4ce1432650f17e41c4ea77ed12c0ab20b229d3ffd84a2ebc9f8abb25a836001826040516113369291906122f6565b60405180910390a1610c386001826004611acb565b61072d61128d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561138b57611386836117ee565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611410575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261140d91810190612295565b60015b6114825760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146115175760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610665565b506113868383836118de565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461120e5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610665565b60006115b760408401846121c9565b15905061168b5760006115c8611009565b6040516020016115d89190612110565b6040516020818303038152906040528051906020012090508084806040019061160191906121c9565b608061161060408901896121c9565b61161b92915061232f565b611626928290612346565b604051611634929190612370565b6040518091039020146116895760405162461bcd60e51b815260206004820152600c60248201527f77726f6e67207075626b657900000000000000000000000000000000000000006044820152606401610665565b505b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201529392505050565b801561072d5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e610715565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6118785760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6118e783611903565b6000825111806118f45750805b1561138657610d578383611950565b61190c816117ee565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061091d83836040518060600160405280602781526020016123d26027913960606000808573ffffffffffffffffffffffffffffffffffffffff168560405161199a91906122da565b600060405180830381855af49150503d80600081146119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b606091505b50915091506119eb868383876119f5565b9695505050505050565b60608315611a71578251600003611a6a5773ffffffffffffffffffffffffffffffffffffffff85163b611a6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610665565b5081611a7b565b611a7b8383611a83565b949350505050565b815115611a935781518083602001fd5b8060405162461bcd60e51b81526004016106659190612380565b60405180608001604052806004906020820280368337509192915050565b8260048101928215611af9579160200282015b82811115611af9578251825591602001919060010190611ade565b50611b05929150611b09565b5090565b5b80821115611b055760008155600101611b0a565b73ffffffffffffffffffffffffffffffffffffffff8116811461072d57600080fd5b60008083601f840112611b5257600080fd5b50813567ffffffffffffffff811115611b6a57600080fd5b602083019150836020828501011115611b8257600080fd5b9250929050565b60008060008060008060008060c0898b031215611ba557600080fd5b8835611bb081611b1e565b97506020890135611bc081611b1e565b96506040890135611bd081611b1e565b955060608901359450608089013567ffffffffffffffff80821115611bf457600080fd5b611c008c838d01611b40565b909650945060a08b0135915080821115611c1957600080fd5b50611c268b828c01611b40565b999c989b5096995094979396929594505050565b600060208284031215611c4c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461091d57600080fd5b600080600080600060808688031215611c9457600080fd5b8535611c9f81611b1e565b94506020860135611caf81611b1e565b935060408601359250606086013567ffffffffffffffff811115611cd257600080fd5b611cde88828901611b40565b969995985093965092949392505050565b60008083601f840112611d0157600080fd5b50813567ffffffffffffffff811115611d1957600080fd5b6020830191508360208260051b8501011115611b8257600080fd5b60008060008060408587031215611d4a57600080fd5b843567ffffffffffffffff80821115611d6257600080fd5b611d6e88838901611cef565b90965094506020870135915080821115611d8757600080fd5b50611d9487828801611cef565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e1657611e16611da0565b604052919050565b600060808284031215611e3057600080fd5b82601f830112611e3f57600080fd5b6040516080810181811067ffffffffffffffff82111715611e6257611e62611da0565b604052806080840185811115611e7757600080fd5b845b81811015611e91578035835260209283019201611e79565b509195945050505050565b600060208284031215611eae57600080fd5b813561091d81611b1e565b600080600060608486031215611ece57600080fd5b833567ffffffffffffffff811115611ee557600080fd5b84016101608187031215611ef857600080fd5b95602085013595506040909401359392505050565b60008060408385031215611f2057600080fd5b8235611f2b81611b1e565b946020939093013593505050565b60008060408385031215611f4c57600080fd5b8235611f5781611b1e565b915060208381013567ffffffffffffffff80821115611f7557600080fd5b818601915086601f830112611f8957600080fd5b813581811115611f9b57611f9b611da0565b611fcb847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dcf565b91508082528784828501011115611fe157600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806060858703121561201557600080fd5b843561202081611b1e565b935060208501359250604085013567ffffffffffffffff81111561204357600080fd5b611d9487828801611b40565b60008060008060008060008060a0898b03121561206b57600080fd5b883561207681611b1e565b9750602089013561208681611b1e565b9650604089013567ffffffffffffffff808211156120a357600080fd5b6120af8c838d01611cef565b909850965060608b01359150808211156120c857600080fd5b6120d48c838d01611cef565b909650945060808b0135915080821115611c1957600080fd5b8060005b6004811015610d575781518452602093840193909101906001016120f1565b6080810161060c82846120ed565b60008060008060008060a0878903121561213757600080fd5b863561214281611b1e565b9550602087013561215281611b1e565b94506040870135935060608701359250608087013567ffffffffffffffff81111561217c57600080fd5b61218889828a01611b40565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121fe57600080fd5b83018035915067ffffffffffffffff82111561221957600080fd5b602001915036819003821315611b8257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361228e5761228e61222e565b5060010190565b6000602082840312156122a757600080fd5b5051919050565b60005b838110156122c95781810151838201526020016122b1565b83811115610d575750506000910152565b600082516122ec8184602087016122ae565b9190910192915050565b6101008101818460005b600481101561231f578154835260209092019160019182019101612300565b50505061091d60808301846120ed565b6000828210156123415761234161222e565b500390565b6000808585111561235657600080fd5b8386111561236357600080fd5b5050820193919092039150565b8183823760009101908152919050565b602081526000825180602084015261239f8160408501602087016122ae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bce0ce62c54cf2aa0b2c90d7d08c4f9212f4077f1742678a583f10617e0d761964736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x178 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3C0 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x38D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x12D JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x33D JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x345 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2EF JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x15E JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x18FC5C44 EQ PUSH2 0x276 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x184 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x17F JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x19F CALLDATASIZE PUSH1 0x4 PUSH2 0x1B89 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CB PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C3A JUMP JUMPDEST PUSH2 0x52D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x1FB CALLDATASIZE PUSH1 0x4 PUSH2 0x1C7C JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D34 JUMP JUMPDEST PUSH2 0x612 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x291 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x71C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CA PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x30A CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0x730 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0x32A CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB9 JUMP JUMPDEST PUSH2 0x8FE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x924 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x351 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x360 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F0D JUMP JUMPDEST PUSH2 0x9C3 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x373 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0xA7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xC3C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x399 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2CA SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x40E CALLDATASIZE PUSH1 0x4 PUSH2 0x1FFF JUMP JUMPDEST PUSH2 0xD0E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x42E CALLDATASIZE PUSH1 0x4 PUSH2 0x204F JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xD5D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0xE14 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xF8D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4BA PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1D7 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x4E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x1044 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x502 CALLDATASIZE PUSH1 0x4 PUSH2 0x211E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x5C0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x60C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x61A PUSH2 0x1161 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x66E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x715 JUMPI PUSH2 0x703 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x68E JUMPI PUSH2 0x68E PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x6A3 SWAP2 SWAP1 PUSH2 0x1E9C JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x6C9 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x70D DUP2 PUSH2 0x225D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x724 PUSH2 0x128D JUMP JUMPDEST PUSH2 0x72D DUP2 PUSH2 0x1304 JUMP JUMPDEST POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x7DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x850 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0x8E2 DUP2 PUSH2 0x134B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x72D SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x908 PUSH2 0x1523 JUMP JUMPDEST PUSH2 0x912 DUP5 DUP5 PUSH2 0x15A8 JUMP JUMPDEST SWAP1 POP PUSH2 0x91D DUP3 PUSH2 0x16E4 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9CB PUSH2 0x128D JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA72 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB25 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB9A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC23 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0xC2C DUP3 PUSH2 0x134B JUMP JUMPDEST PUSH2 0xC38 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1353 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD16 PUSH2 0x1161 JUMP JUMPDEST PUSH2 0xD57 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDEB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE0F SWAP2 SWAP1 PUSH2 0x2295 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE34 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE4E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE4E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xEC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF1E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x174F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC38 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDCE JUMP JUMPDEST PUSH2 0x1011 PUSH2 0x1AAD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 SWAP1 DUP3 DUP5 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1027 JUMPI POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1064 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x107E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x107E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x114E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1158 PUSH1 0x0 PUSH2 0x174F JUMP JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x1304 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x11C2 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1239 SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1276 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x127B JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x715 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x12B8 JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x42E4C4CE1432650F17E41C4EA77ED12C0AB20B229D3FFD84A2EBC9F8ABB25A83 PUSH1 0x1 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1336 SWAP3 SWAP2 SWAP1 PUSH2 0x22F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0xC38 PUSH1 0x1 DUP3 PUSH1 0x4 PUSH2 0x1ACB JUMP JUMPDEST PUSH2 0x72D PUSH2 0x128D JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x138B JUMPI PUSH2 0x1386 DUP4 PUSH2 0x17EE JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x140D SWAP2 DUP2 ADD SWAP1 PUSH2 0x2295 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1482 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1517 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH2 0x1386 DUP4 DUP4 DUP4 PUSH2 0x18DE JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B7 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x21C9 JUMP JUMPDEST ISZERO SWAP1 POP PUSH2 0x168B JUMPI PUSH1 0x0 PUSH2 0x15C8 PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x15D8 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP DUP1 DUP5 DUP1 PUSH1 0x40 ADD SWAP1 PUSH2 0x1601 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST PUSH1 0x80 PUSH2 0x1610 PUSH1 0x40 DUP10 ADD DUP10 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x161B SWAP3 SWAP2 POP PUSH2 0x232F JUMP JUMPDEST PUSH2 0x1626 SWAP3 DUP3 SWAP1 PUSH2 0x2346 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1634 SWAP3 SWAP2 SWAP1 PUSH2 0x2370 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 EQ PUSH2 0x1689 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67207075626B65790000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x72D JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x715 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x715 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1878 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x18E7 DUP4 PUSH2 0x1903 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x18F4 JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1386 JUMPI PUSH2 0xD57 DUP4 DUP4 PUSH2 0x1950 JUMP JUMPDEST PUSH2 0x190C DUP2 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x91D DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23D2 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x199A SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x19D5 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x19DA JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x19EB DUP7 DUP4 DUP4 DUP8 PUSH2 0x19F5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A71 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP DUP2 PUSH2 0x1A7B JUMP JUMPDEST PUSH2 0x1A7B DUP4 DUP4 PUSH2 0x1A83 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A93 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 PUSH1 0x4 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1AF9 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1AF9 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1ADE JUMP JUMPDEST POP PUSH2 0x1B05 SWAP3 SWAP2 POP PUSH2 0x1B09 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1B05 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1B0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x72D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1BA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1BB0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1BC0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1BD0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1BF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C00 DUP13 DUP4 DUP14 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C26 DUP12 DUP3 DUP13 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1C94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C9F DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1CAF DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CDE DUP9 DUP3 DUP10 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1D01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D6E DUP9 DUP4 DUP10 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1D87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1E16 JUMPI PUSH2 0x1E16 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1E62 JUMPI PUSH2 0x1E62 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1E77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E91 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1E79 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x91D DUP2 PUSH2 0x1B1E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1ECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F2B DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F57 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1F9B JUMPI PUSH2 0x1F9B PUSH2 0x1DA0 JUMP JUMPDEST PUSH2 0x1FCB DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1DCF JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1FE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2015 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2020 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1B40 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x206B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x2076 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x2086 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x20A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20AF DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x20C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20D4 DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0xD57 JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x20F1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x60C DUP3 DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2142 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2152 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x217C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2188 DUP10 DUP3 DUP11 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x21FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x228E JUMPI PUSH2 0x228E PUSH2 0x222E JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22C9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22B1 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD57 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x22EC DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x100 DUP2 ADD DUP2 DUP5 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x231F JUMPI DUP2 SLOAD DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2300 JUMP JUMPDEST POP POP POP PUSH2 0x91D PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x2341 JUMPI PUSH2 0x2341 PUSH2 0x222E JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x2356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2363 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x239F DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220BCE0CE PUSH3 0xC54CF2 0xAA SIGNEXTEND 0x2C SWAP1 0xD7 0xD0 DUP13 0x4F SWAP3 SLT DELEGATECALL SMOD PUSH32 0x1742678A583F10617E0D761964736F6C634300080F0033000000000000000000 ","sourceMap":"578:2118:77:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176:86;;;;;;;;;;-1:-1:-1;581:176:86;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;;;;;-1:-1:-1;1489:298:86;;;;;:::i;:::-;;:::i;:::-;;;2237:14:111;;2230:22;2212:41;;2200:2;2185:18;1489:298:86;;;;;;;;763:212;;;;;;;;;;-1:-1:-1;763:212:86;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;3197:66:111;3185:79;;;3167:98;;3155:2;3140:18;763:212:86;3023:248:111;1902:297:73;;;;;;;;;;-1:-1:-1;1902:297:73;;;;;:::i;:::-;;:::i;2256:121:77:-;;;;;;;;;;-1:-1:-1;2256:121:77;;;;;:::i;:::-;;:::i;634:35::-;;;;;;;;;;;;;;;;;;5907:42:111;5895:55;;;5877:74;;5865:2;5850:18;634:35:77;5731:226:111;3073:197:32;;;;;;;;;;-1:-1:-1;3073:197:32;;;;;:::i;:::-;;:::i;1458:353:51:-;;;;;;;;;;-1:-1:-1;1458:353:51;;;;;:::i;:::-;;:::i;:::-;;;6895:25:111;;;6883:2;6868:18;1458:353:51;6749:177:111;3926:110:73;;;:::i;4188:158::-;;;;;;;;;;-1:-1:-1;4188:158:73;;;;;:::i;:::-;;:::i;3519:222:32:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;765:20:73:-;;;;;;;;;;-1:-1:-1;765:20:73;;;;;;;;;;;1031:108;;;;;;;;;;-1:-1:-1;1121:11:73;1031:108;;1680:158;;;;;;;;;;-1:-1:-1;1680:158:73;;;;;:::i;:::-;;:::i;1219:264:86:-;;;;;;;;;;-1:-1:-1;1219:264:86;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;3730:113:73;;;;;;;;;;;;;:::i;2483:101::-;;;;;;;;;;-1:-1:-1;2483:101:73;;;;;:::i;:::-;;:::i;935:121:51:-;;;;;;;;;;;;;:::i;2585:109:77:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1208:161::-;;;;;;;;;;-1:-1:-1;1208:161:77;;;;;:::i;:::-;;:::i;981:232:86:-;;;;;;;;;;-1:-1:-1;981:232:86;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;1902:297:73:-;1991:31;:29;:31::i;:::-;2040:26;;;2032:58;;;;-1:-1:-1;;;2032:58:73;;12223:2:111;2032:58:73;;;12205:21:111;12262:2;12242:18;;;12235:30;12301:21;12281:18;;;12274:49;12340:18;;2032:58:73;;;;;;;;;2105:9;2100:93;2120:15;;;2100:93;;;2156:26;2162:4;;2167:1;2162:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2171:1;2174:4;;2179:1;2174:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2156:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2156:5:73;;-1:-1:-1;;;2156:26:73:i;:::-;2137:3;;;;:::i;:::-;;;;2100:93;;;;1902:297;;;;:::o;2256:121:77:-;963:12:73;:10;:12::i;:::-;2340:30:77::1;2357:12;2340:16;:30::i;:::-;2256:121:::0;:::o;3073:197:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;13734:2:111;1629:80:32;;;13716:21:111;13773:2;13753:18;;;13746:30;13812:34;13792:18;;;13785:62;13883:14;13863:18;;;13856:42;13915:19;;1629:80:32;13532:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;14147:2:111;1719:87:32;;;14129:21:111;14186:2;14166:18;;;14159:30;14225:34;14205:18;;;14198:62;14296:14;14276:18;;;14269:42;14328:19;;1719:87:32;13945:408:111;1719:87:32;3156:36:::1;3174:17;3156;:36::i;:::-;3243:12;::::0;;3253:1:::1;3243:12:::0;;;::::1;::::0;::::1;::::0;;;3202:61:::1;::::0;3224:17;;3243:12;3202:21:::1;:61::i;1458:353:51:-:0;1601:22;1635:24;:22;:24::i;:::-;1686:38;1705:6;1713:10;1686:18;:38::i;:::-;1669:55;;1772:32;1784:19;1772:11;:32::i;:::-;1458:353;;;;;:::o;3926:110:73:-;1121:11;3973:56;;;;;4023:4;3973:56;;;5877:74:111;3973:22:73;;;;;;;;4004:9;;5850:18:111;;3973:56:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:158;963:12;:10;:12::i;:::-;1121:11;4291:48:::1;::::0;;;;:23:::1;14566:55:111::0;;;4291:48:73::1;::::0;::::1;14548:74:111::0;14638:18;;;14631:34;;;4291:23:73;;;::::1;::::0;::::1;::::0;14521:18:111;;4291:48:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4188:158:::0;;:::o;3519:222:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;13734:2:111;1629:80:32;;;13716:21:111;13773:2;13753:18;;;13746:30;13812:34;13792:18;;;13785:62;13883:14;13863:18;;;13856:42;13915:19;;1629:80:32;13532:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;14147:2:111;1719:87:32;;;14129:21:111;14186:2;14166:18;;;14159:30;14225:34;14205:18;;;14198:62;14296:14;14276:18;;;14269:42;14328:19;;1719:87:32;13945:408:111;1719:87:32;3636:36:::1;3654:17;3636;:36::i;:::-;3682:52;3704:17;3723:4;3729;3682:21;:52::i;:::-;3519:222:::0;;:::o;2762:131::-;2840:7;2080:4;2072:23;2089:6;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:32;;14878:2:111;2064:92:32;;;14860:21:111;14917:2;14897:18;;;14890:30;14956:34;14936:18;;;14929:62;15027:26;15007:18;;;15000:54;15071:19;;2064:92:32;14676:420:111;2064:92:32;-1:-1:-1;1030:66:28::1;2762:131:32::0;:::o;1680:158:73:-;1766:31;:29;:31::i;:::-;1807:24;1813:4;1819:5;1826:4;;1807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1807:5:73;;-1:-1:-1;;;1807:24:73:i;:::-;1680:158;;;;:::o;3730:113::-;3799:37;;;;;3830:4;3799:37;;;5877:74:111;3773:7:73;;3799:22;1121:11;3799:22;;;;5850:18:111;;3799:37:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3792:44;;3730:113;:::o;2483:101::-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;15492:2:111;3303:190:31;;;15474:21:111;15531:2;15511:18;;;15504:30;15570:34;15550:18;;;15543:62;15641:16;15621:18;;;15614:44;15675:19;;3303:190:31;15290:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;2557:20:73::1;2569:7;2557:11;:20::i;:::-;3618:14:31::0;3614:99;;;3664:5;3648:21;;;;;;3688:14;;-1:-1:-1;15857:36:111;;3688:14:31;;15845:2:111;15830:18;3688:14:31;;;;;;;3247:472;2483:101:73;:::o;935:121:51:-;1010:39;;;;;1040:4;1010:39;;;16086:74:111;984:7:51;16176:18:111;;;16169:91;;;984:7:51;1010:21;1121:11:73;1010:21:51;;;;16059:18:111;;1010:39:51;15904:362:111;2585:109:77;2642:17;;:::i;:::-;2671:16;;;;;;;;;;;2678:9;;2671:16;;2678:9;2671:16;;;;;;;;;;;;;;;;;;;;;;;;2585:109;:::o;1208:161::-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;15492:2:111;3303:190:31;;;15474:21:111;15531:2;15511:18;;;15504:30;15570:34;15550:18;;;15543:62;15641:16;15621:18;;;15614:44;15675:19;;3303:190:31;15290:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;1295:29:77::1;1321:1;1295:17;:29::i;:::-;1334:28;1351:10;1334:16;:28::i;2808:175:73:-:0;2881:10;:35;1121:11;2881:35;;;:58;;-1:-1:-1;2934:5:73;;;;;;;2920:10;:19;2881:58;2873:103;;;;-1:-1:-1;;;2873:103:73;;16473:2:111;2873:103:73;;;16455:21:111;;;16492:18;;;16485:30;16551:34;16531:18;;;16524:62;16603:18;;2873:103:73;16271:356:111;2873:103:73;2808:175::o;3366:287::-;3451:12;3465:19;3488:6;:11;;3508:5;3515:4;3488:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3450:70;;;;3535:7;3530:117;;3615:6;3609:13;3604:2;3596:6;3592:15;3585:38;1349:233;1524:5;;;;;;;1510:10;:19;;:50;;-1:-1:-1;1533:10:73;1555:4;1533:27;1510:50;1502:73;;;;-1:-1:-1;;;1502:73:73;;17376:2:111;1502:73:73;;;17358:21:111;17415:2;17395:18;;;17388:30;17454:12;17434:18;;;17427:40;17484:18;;1502:73:73;17174:334:111;2383:164:77;2465:41;2482:9;2493:12;2465:41;;;;;;;:::i;:::-;;;;;;;;2516:24;:9;2528:12;2516:24;;:::i;4352:135:73:-;4468:12;:10;:12::i;2650:952:28:-;689:66;3096:48;;;3092:504;;;3160:37;3179:17;3160:18;:37::i;:::-;2650:952;;;:::o;3092:504::-;3250:17;3232:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3232:52:28;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3228:291;;3448:56;;-1:-1:-1;;;3448:56:28;;18511:2:111;3448:56:28;;;18493:21:111;18550:2;18530:18;;;18523:30;18589:34;18569:18;;;18562:62;18660:16;18640:18;;;18633:44;18694:19;;3448:56:28;18309:410:111;3228:291:28;1030:66;3334:28;;3326:82;;;;-1:-1:-1;;;3326:82:28;;18926:2:111;3326:82:28;;;18908:21:111;18965:2;18945:18;;;18938:30;19004:34;18984:18;;;18977:62;19075:11;19055:18;;;19048:39;19104:19;;3326:82:28;18724:405:111;3326:82:28;3285:138;3532:53;3550:17;3569:4;3575:9;3532:17;:53::i;1892:149:51:-;1966:10;:35;1121:11:73;1966:35:51;;1958:76;;;;-1:-1:-1;;;1958:76:51;;19336:2:111;1958:76:51;;;19318:21:111;19375:2;19355:18;;;19348:30;19414;19394:18;;;19387:58;19462:18;;1958:76:51;19134:352:111;1375:687:77;1490:22;1559:15;;;;:6;:15;:::i;:::-;:27;;-1:-1:-1;1555:432:77;;1804:18;1846:17;:15;:17::i;:::-;1835:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;1825:40;;;;;;1804:61;;1949:10;1897:6;:15;;;;;;;;:::i;:::-;1938:3;1913:15;;;;:6;:15;:::i;:::-;:28;;;-1:-1:-1;1913:28:77;:::i;:::-;1897:47;;;;;:::i;:::-;1887:58;;;;;;;:::i;:::-;;;;;;;;:72;1879:97;;;;-1:-1:-1;;;1879:97:77;;20441:2:111;1879:97:77;;;20423:21:111;20480:2;20460:18;;;20453:30;20519:14;20499:18;;;20492:42;20551:18;;1879:97:77;20239:336:111;1879:97:77;1588:399;1555:432;2023:31;;;;;;;;;2038:10;2023:31;;;;-1:-1:-1;2023:31:77;;;;;;;;;;;1996:59;1375:687;-1:-1:-1;;;1375:687:77:o;4316:337:51:-;4397:24;;4393:254;;4455:82;;4438:12;;4463:10;;4515:17;;4488:19;;4438:12;4455:82;4438:12;4455:82;4488:19;4463:10;4515:17;4455:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2590:146:73;2655:5;:15;;;;;;;;;;;;;;;;;;2685:44;;2723:5;;;;;;2710:11;2685:44;;;;;;;2590:146;:::o;1532:259:28:-;1465:19:42;;;;1605:95:28;;;;-1:-1:-1;;;1605:95:28;;20992:2:111;1605:95:28;;;20974:21:111;21031:2;21011:18;;;21004:30;21070:34;21050:18;;;21043:62;21141:15;21121:18;;;21114:43;21174:19;;1605:95:28;20790:409:111;1605:95:28;1030:66;1710:74;;;;;;;;;;;;;;;1532:259::o;2183:295::-;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;:53::i;1897:152::-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;;;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;21406:2:111;7908:60:42;;;21388:21:111;21445:2;21425:18;;;21418:30;21484:31;21464:18;;;21457:59;21533:18;;7908:60:42;21204:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:154:111;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:347;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:111;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;455:59;173:347;;;;;:::o;525:1205::-;651:6;659;667;675;683;691;699;707;760:3;748:9;739:7;735:23;731:33;728:53;;;777:1;774;767:12;728:53;816:9;803:23;835:31;860:5;835:31;:::i;:::-;885:5;-1:-1:-1;942:2:111;927:18;;914:32;955:33;914:32;955:33;:::i;:::-;1007:7;-1:-1:-1;1066:2:111;1051:18;;1038:32;1079:33;1038:32;1079:33;:::i;:::-;1131:7;-1:-1:-1;1185:2:111;1170:18;;1157:32;;-1:-1:-1;1240:3:111;1225:19;;1212:33;1264:18;1294:14;;;1291:34;;;1321:1;1318;1311:12;1291:34;1360:58;1410:7;1401:6;1390:9;1386:22;1360:58;:::i;:::-;1437:8;;-1:-1:-1;1334:84:111;-1:-1:-1;1525:3:111;1510:19;;1497:33;;-1:-1:-1;1542:16:111;;;1539:36;;;1571:1;1568;1561:12;1539:36;;1610:60;1662:7;1651:8;1640:9;1636:24;1610:60;:::i;:::-;525:1205;;;;-1:-1:-1;525:1205:111;;-1:-1:-1;525:1205:111;;;;;;1689:8;-1:-1:-1;;;525:1205:111:o;1735:332::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;1901:9;1888:23;1951:66;1944:5;1940:78;1933:5;1930:89;1920:117;;2033:1;2030;2023:12;2264:754;2361:6;2369;2377;2385;2393;2446:3;2434:9;2425:7;2421:23;2417:33;2414:53;;;2463:1;2460;2453:12;2414:53;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:111;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2693:7;-1:-1:-1;2747:2:111;2732:18;;2719:32;;-1:-1:-1;2802:2:111;2787:18;;2774:32;2829:18;2818:30;;2815:50;;;2861:1;2858;2851:12;2815:50;2900:58;2950:7;2941:6;2930:9;2926:22;2900:58;:::i;:::-;2264:754;;;;-1:-1:-1;2264:754:111;;-1:-1:-1;2977:8:111;;2874:84;2264:754;-1:-1:-1;;;2264:754:111:o;3276:367::-;3339:8;3349:6;3403:3;3396:4;3388:6;3384:17;3380:27;3370:55;;3421:1;3418;3411:12;3370:55;-1:-1:-1;3444:20:111;;3487:18;3476:30;;3473:50;;;3519:1;3516;3509:12;3473:50;3556:4;3548:6;3544:17;3532:29;;3616:3;3609:4;3599:6;3596:1;3592:14;3584:6;3580:27;3576:38;3573:47;3570:67;;;3633:1;3630;3623:12;3648:784;3781:6;3789;3797;3805;3858:2;3846:9;3837:7;3833:23;3829:32;3826:52;;;3874:1;3871;3864:12;3826:52;3914:9;3901:23;3943:18;3984:2;3976:6;3973:14;3970:34;;;4000:1;3997;3990:12;3970:34;4039:70;4101:7;4092:6;4081:9;4077:22;4039:70;:::i;:::-;4128:8;;-1:-1:-1;4013:96:111;-1:-1:-1;4216:2:111;4201:18;;4188:32;;-1:-1:-1;4232:16:111;;;4229:36;;;4261:1;4258;4251:12;4229:36;;4300:72;4364:7;4353:8;4342:9;4338:24;4300:72;:::i;:::-;3648:784;;;;-1:-1:-1;4391:8:111;-1:-1:-1;;;;3648:784:111:o;4437:184::-;4489:77;4486:1;4479:88;4586:4;4583:1;4576:15;4610:4;4607:1;4600:15;4626:334;4697:2;4691:9;4753:2;4743:13;;4758:66;4739:86;4727:99;;4856:18;4841:34;;4877:22;;;4838:62;4835:88;;;4903:18;;:::i;:::-;4939:2;4932:22;4626:334;;-1:-1:-1;4626:334:111:o;4965:761::-;5047:6;5100:3;5088:9;5079:7;5075:23;5071:33;5068:53;;;5117:1;5114;5107:12;5068:53;5166:7;5159:4;5148:9;5144:20;5140:34;5130:62;;5188:1;5185;5178:12;5130:62;5221:2;5215:9;5263:3;5255:6;5251:16;5333:6;5321:10;5318:22;5297:18;5285:10;5282:34;5279:62;5276:88;;;5344:18;;:::i;:::-;5380:2;5373:22;5415:6;5459:3;5444:19;;5475;;;5472:39;;;5507:1;5504;5497:12;5472:39;5531:9;5549:146;5565:6;5560:3;5557:15;5549:146;;;5633:17;;5621:30;;5680:4;5671:14;;;;5582;5549:146;;;-1:-1:-1;5714:6:111;;4965:761;-1:-1:-1;;;;;4965:761:111:o;5962:247::-;6021:6;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;6129:9;6116:23;6148:31;6173:5;6148:31;:::i;6214:530::-;6325:6;6333;6341;6394:2;6382:9;6373:7;6369:23;6365:32;6362:52;;;6410:1;6407;6400:12;6362:52;6450:9;6437:23;6483:18;6475:6;6472:30;6469:50;;;6515:1;6512;6505:12;6469:50;6538:22;;6594:3;6576:16;;;6572:26;6569:46;;;6611:1;6608;6601:12;6569:46;6634:2;6683;6668:18;;6655:32;;-1:-1:-1;6734:2:111;6719:18;;;6706:32;;6214:530;-1:-1:-1;;;6214:530:111:o;6931:323::-;7007:6;7015;7068:2;7056:9;7047:7;7043:23;7039:32;7036:52;;;7084:1;7081;7074:12;7036:52;7123:9;7110:23;7142:31;7167:5;7142:31;:::i;:::-;7192:5;7244:2;7229:18;;;;7216:32;;-1:-1:-1;;;6931:323:111:o;7259:957::-;7336:6;7344;7397:2;7385:9;7376:7;7372:23;7368:32;7365:52;;;7413:1;7410;7403:12;7365:52;7452:9;7439:23;7471:31;7496:5;7471:31;:::i;:::-;7521:5;-1:-1:-1;7545:2:111;7583:18;;;7570:32;7621:18;7651:14;;;7648:34;;;7678:1;7675;7668:12;7648:34;7716:6;7705:9;7701:22;7691:32;;7761:7;7754:4;7750:2;7746:13;7742:27;7732:55;;7783:1;7780;7773:12;7732:55;7819:2;7806:16;7841:2;7837;7834:10;7831:36;;;7847:18;;:::i;:::-;7889:112;7997:2;7928:66;7921:4;7917:2;7913:13;7909:86;7905:95;7889:112;:::i;:::-;7876:125;;8024:2;8017:5;8010:17;8064:7;8059:2;8054;8050;8046:11;8042:20;8039:33;8036:53;;;8085:1;8082;8075:12;8036:53;8140:2;8135;8131;8127:11;8122:2;8115:5;8111:14;8098:45;8184:1;8179:2;8174;8167:5;8163:14;8159:23;8152:34;;8205:5;8195:15;;;;;7259:957;;;;;:::o;8655:612::-;8743:6;8751;8759;8767;8820:2;8808:9;8799:7;8795:23;8791:32;8788:52;;;8836:1;8833;8826:12;8788:52;8875:9;8862:23;8894:31;8919:5;8894:31;:::i;:::-;8944:5;-1:-1:-1;8996:2:111;8981:18;;8968:32;;-1:-1:-1;9051:2:111;9036:18;;9023:32;9078:18;9067:30;;9064:50;;;9110:1;9107;9100:12;9064:50;9149:58;9199:7;9190:6;9179:9;9175:22;9149:58;:::i;9272:1338::-;9432:6;9440;9448;9456;9464;9472;9480;9488;9541:3;9529:9;9520:7;9516:23;9512:33;9509:53;;;9558:1;9555;9548:12;9509:53;9597:9;9584:23;9616:31;9641:5;9616:31;:::i;:::-;9666:5;-1:-1:-1;9723:2:111;9708:18;;9695:32;9736:33;9695:32;9736:33;:::i;:::-;9788:7;-1:-1:-1;9846:2:111;9831:18;;9818:32;9869:18;9899:14;;;9896:34;;;9926:1;9923;9916:12;9896:34;9965:70;10027:7;10018:6;10007:9;10003:22;9965:70;:::i;:::-;10054:8;;-1:-1:-1;9939:96:111;-1:-1:-1;10142:2:111;10127:18;;10114:32;;-1:-1:-1;10158:16:111;;;10155:36;;;10187:1;10184;10177:12;10155:36;10226:72;10290:7;10279:8;10268:9;10264:24;10226:72;:::i;:::-;10317:8;;-1:-1:-1;10200:98:111;-1:-1:-1;10405:3:111;10390:19;;10377:33;;-1:-1:-1;10422:16:111;;;10419:36;;;10451:1;10448;10441:12;10615:326;10708:5;10731:1;10741:194;10755:4;10752:1;10749:11;10741:194;;;10814:13;;10802:26;;10851:4;10875:12;;;;10910:15;;;;10775:1;10768:9;10741:194;;10946:242;11126:3;11111:19;;11139:43;11115:9;11164:6;11139:43;:::i;11193:823::-;11299:6;11307;11315;11323;11331;11339;11392:3;11380:9;11371:7;11367:23;11363:33;11360:53;;;11409:1;11406;11399:12;11360:53;11448:9;11435:23;11467:31;11492:5;11467:31;:::i;:::-;11517:5;-1:-1:-1;11574:2:111;11559:18;;11546:32;11587:33;11546:32;11587:33;:::i;:::-;11639:7;-1:-1:-1;11693:2:111;11678:18;;11665:32;;-1:-1:-1;11744:2:111;11729:18;;11716:32;;-1:-1:-1;11799:3:111;11784:19;;11771:33;11827:18;11816:30;;11813:50;;;11859:1;11856;11849:12;11813:50;11898:58;11948:7;11939:6;11928:9;11924:22;11898:58;:::i;:::-;11193:823;;;;-1:-1:-1;11193:823:111;;-1:-1:-1;11193:823:111;;11975:8;;11193:823;-1:-1:-1;;;11193:823:111:o;12369:184::-;12421:77;12418:1;12411:88;12518:4;12515:1;12508:15;12542:4;12539:1;12532:15;12558:580;12635:4;12641:6;12701:11;12688:25;12791:66;12780:8;12764:14;12760:29;12756:102;12736:18;12732:127;12722:155;;12873:1;12870;12863:12;12722:155;12900:33;;12952:20;;;-1:-1:-1;12995:18:111;12984:30;;12981:50;;;13027:1;13024;13017:12;12981:50;13060:4;13048:17;;-1:-1:-1;13091:14:111;13087:27;;;13077:38;;13074:58;;;13128:1;13125;13118:12;13143:184;13195:77;13192:1;13185:88;13292:4;13289:1;13282:15;13316:4;13313:1;13306:15;13332:195;13371:3;13402:66;13395:5;13392:77;13389:103;;13472:18;;:::i;:::-;-1:-1:-1;13519:1:111;13508:13;;13332:195::o;15101:184::-;15171:6;15224:2;15212:9;15203:7;15199:23;15195:32;15192:52;;;15240:1;15237;15230:12;15192:52;-1:-1:-1;15263:16:111;;15101:184;-1:-1:-1;15101:184:111:o;16632:258::-;16704:1;16714:113;16728:6;16725:1;16722:13;16714:113;;;16804:11;;;16798:18;16785:11;;;16778:39;16750:2;16743:10;16714:113;;;16845:6;16842:1;16839:13;16836:48;;;-1:-1:-1;;16880:1:111;16862:16;;16855:27;16632:258::o;16895:274::-;17024:3;17062:6;17056:13;17078:53;17124:6;17119:3;17112:4;17104:6;17100:17;17078:53;:::i;:::-;17147:16;;;;;16895:274;-1:-1:-1;;16895:274:111:o;17513:602::-;17764:3;17749:19;;17753:9;17845:6;17722:4;17879:168;17893:4;17890:1;17887:11;17879:168;;;17952:13;;17940:26;;17995:4;17986:14;;;;18035:1;18023:14;;;;17906:9;17879:168;;;17883:3;;;18056:53;18104:3;18093:9;18089:19;18081:6;18056:53;:::i;19491:125::-;19531:4;19559:1;19556;19553:8;19550:34;;;19564:18;;:::i;:::-;-1:-1:-1;19601:9:111;;19491:125::o;19621:331::-;19726:9;19737;19779:8;19767:10;19764:24;19761:44;;;19801:1;19798;19791:12;19761:44;19830:6;19820:8;19817:20;19814:40;;;19850:1;19847;19840:12;19814:40;-1:-1:-1;;19876:23:111;;;19921:25;;;;;-1:-1:-1;19621:331:111:o;19957:277::-;20146:6;20138;20133:3;20120:33;20102:3;20172:16;;20197:13;;;20172:16;19957:277;-1:-1:-1;19957:277:111:o;21562:442::-;21711:2;21700:9;21693:21;21674:4;21743:6;21737:13;21786:6;21781:2;21770:9;21766:18;21759:34;21802:66;21861:6;21856:2;21845:9;21841:18;21836:2;21828:6;21824:15;21802:66;:::i;:::-;21920:2;21908:15;21925:66;21904:88;21889:104;;;;21995:2;21885:113;;21562:442;-1:-1:-1;;21562:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"1852400","executionCost":"infinite","totalCost":"infinite"},"external":{"addDeposit()":"infinite","aggregator()":"infinite","entryPoint()":"infinite","execute(address,uint256,bytes)":"infinite","executeBatch(address[],bytes[])":"infinite","getBlsPublicKey()":"infinite","getDeposit()":"infinite","getNonce()":"infinite","initialize(address)":"infinite","initialize(uint256[4])":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2392","proxiableUUID()":"infinite","setBlsPublicKey(uint256[4])":"infinite","supportsInterface(bytes4)":"472","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","upgradeTo(address)":"infinite","upgradeToAndCall(address,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawDepositTo(address,uint256)":"infinite"},"internal":{"_setBlsPublicKey(uint256[4] memory)":"infinite","_validateSignature(struct UserOperation calldata,bytes32)":"infinite"}},"methodIdentifiers":{"addDeposit()":"4a58db19","aggregator()":"245a7bfc","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getBlsPublicKey()":"e02afbae","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","initialize(uint256[4])":"ee472f36","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","setBlsPublicKey(uint256[4])":"18fc5c44","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"anAggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"oldPublicKey\",\"type\":\"uint256[4]\"},{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"newPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"PublicKeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"aggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlsPublicKey\",\"outputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"\",\"type\":\"uint256[4]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"newPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"setBlsPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getBlsPublicKey()\":{\"returns\":{\"_0\":\"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\"}},\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"initialize(uint256[4])\":{\"params\":{\"aPublicKey\":\"public key from a BLS keypair that will have a full ownership and control of this account.\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"setBlsPublicKey(uint256[4])\":{\"params\":{\"newPublicKey\":\"public key from a BLS keypair that will have a full ownership and control of this account.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"initialize(uint256[4])\":{\"notice\":\"The initializer for the BLSAccount instance.\"},\"setBlsPublicKey(uint256[4])\":{\"notice\":\"Allows the owner to set or change the BLS key.\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"Minimal BLS-based account that uses an aggregated signature. The account must maintain its own BLS public key, and expose its trusted signature aggregator. Note that unlike the \\\"standard\\\" SimpleAccount, this account can't be called directly (normal SimpleAccount uses its \\\"signer\\\" address as both the ecrecover signer, and as a legitimate Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/BLSAccount.sol\":\"BLSAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/BLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../SimpleAccount.sol\\\";\\nimport \\\"./IBLSAccount.sol\\\";\\n\\n/**\\n * Minimal BLS-based account that uses an aggregated signature.\\n * The account must maintain its own BLS public key, and expose its trusted signature aggregator.\\n * Note that unlike the \\\"standard\\\" SimpleAccount, this account can't be called directly\\n * (normal SimpleAccount uses its \\\"signer\\\" address as both the ecrecover signer, and as a legitimate\\n * Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)\\n */\\ncontract BLSAccount is SimpleAccount, IBLSAccount {\\n address public immutable aggregator;\\n uint256[4] private publicKey;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n /**\\n * The initializer for the BLSAccount instance.\\n * @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\\n */\\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\\n super._initialize(address(0));\\n _setBlsPublicKey(aPublicKey);\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n\\n (userOp, userOpHash);\\n if (userOp.initCode.length != 0) {\\n // BLSSignatureAggregator.getUserOpPublicKey() assumes that during account creation, the public key is\\n // the suffix of the initCode.\\n // The account MUST validate it\\n bytes32 pubKeyHash = keccak256(abi.encode(getBlsPublicKey()));\\n require(keccak256(userOp.initCode[userOp.initCode.length - 128 :]) == pubKeyHash, \\\"wrong pubkey\\\");\\n }\\n return _packValidationData(ValidationData(aggregator, 0,0));\\n }\\n\\n /**\\n * Allows the owner to set or change the BLS key.\\n * @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\\n */\\n function setBlsPublicKey(uint256[4] memory newPublicKey) public onlyOwner {\\n _setBlsPublicKey(newPublicKey);\\n }\\n\\n function _setBlsPublicKey(uint256[4] memory newPublicKey) internal {\\n emit PublicKeyChanged(publicKey, newPublicKey);\\n publicKey = newPublicKey;\\n }\\n\\n /// @inheritdoc IBLSAccount\\n function getBlsPublicKey() public override view returns (uint256[4] memory) {\\n return publicKey;\\n }\\n}\\n\",\"keccak256\":\"0xed761f08bf5f6b1aeb36792267ceea916e5adb9ca3a5e6110299481e50635add\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"contracts/samples/bls/BLSAccount.sol:BLSAccount","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"contracts/samples/bls/BLSAccount.sol:BLSAccount","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":13838,"contract":"contracts/samples/bls/BLSAccount.sol:BLSAccount","label":"owner","offset":2,"slot":"0","type":"t_address"},{"astId":14772,"contract":"contracts/samples/bls/BLSAccount.sol:BLSAccount","label":"publicKey","offset":0,"slot":"1","type":"t_array(t_uint256)4_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)4_storage":{"base":"t_uint256","encoding":"inplace","label":"uint256[4]","numberOfBytes":"128"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDeposit()":{"notice":"deposit more funds for this account in the entryPoint"},"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"execute(address,uint256,bytes)":{"notice":"execute a transaction (called directly from owner, or by entryPoint)"},"executeBatch(address[],bytes[])":{"notice":"execute a sequence of transactions"},"getDeposit()":{"notice":"check current account deposit in the entryPoint"},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"initialize(uint256[4])":{"notice":"The initializer for the BLSAccount instance."},"setBlsPublicKey(uint256[4])":{"notice":"Allows the owner to set or change the BLS key."},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"withdrawDepositTo(address,uint256)":{"notice":"withdraw value from the account's deposit"}},"notice":"Minimal BLS-based account that uses an aggregated signature. The account must maintain its own BLS public key, and expose its trusted signature aggregator. Note that unlike the \"standard\" SimpleAccount, this account can't be called directly (normal SimpleAccount uses its \"signer\" address as both the ecrecover signer, and as a legitimate Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)","version":1}}},"contracts/samples/bls/BLSAccountFactory.sol":{"BLSAccountFactory":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"contract BLSAccount","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"createAccount","outputs":[{"internalType":"contract BLSAccount","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_14942":{"entryPoint":null,"id":14942,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":170,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":146,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:927:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"750:175:111","statements":[{"nodeType":"YulAssignment","src":"760:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"760:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"795:29:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"813:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"818:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"809:3:111"},"nodeType":"YulFunctionCall","src":"809:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"822:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"805:3:111"},"nodeType":"YulFunctionCall","src":"805:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"799:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"840:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"855:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"863:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"851:3:111"},"nodeType":"YulFunctionCall","src":"851:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"833:6:111"},"nodeType":"YulFunctionCall","src":"833:34:111"},"nodeType":"YulExpressionStatement","src":"833:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"887:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"898:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"883:3:111"},"nodeType":"YulFunctionCall","src":"883:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"907:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"915:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"903:3:111"},"nodeType":"YulFunctionCall","src":"903:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"876:6:111"},"nodeType":"YulFunctionCall","src":"876:43:111"},"nodeType":"YulExpressionStatement","src":"876:43:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"711:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"722:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"730:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"741:4:111","type":""}],"src":"600:325:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := sub(shl(160, 1), 1)\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b506040516135b03803806135b083398101604081905261002f916100aa565b818160405161003d90610085565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610070573d6000803e3d6000fd5b506001600160a01b0316608052506100e49050565b61263080610f8083390190565b6001600160a01b03811681146100a757600080fd5b50565b600080604083850312156100bd57600080fd5b82516100c881610092565b60208401519092506100d981610092565b809150509250929050565b608051610e7461010c600039600081816051015281816101b001526102d10152610e746000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c806311464fbe146200004b57806319c2a1b2146200009c578063de3398dd14620000b3575b600080fd5b620000737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b62000073620000ad3660046200042c565b620000ca565b62000073620000c436600462000490565b6200029f565b600081620000da60803662000522565b811462000147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67207075626b6579206f666673657400000000000000000000000000604482015260640160405180910390fd5b60006200017e858560048060200260405190810160405280929190826004602002808284376000920191909152506200029f915050565b905073ffffffffffffffffffffffffffffffffffffffff81163b8015620001aa57509150620002999050565b8560001b7f000000000000000000000000000000000000000000000000000000000000000086604051602401620001e2919062000561565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f36000000000000000000000000000000000000000000000000000000001790525162000264906200041e565b62000271929190620005a7565b8190604051809103906000f590508015801562000292573d6000803e3d6000fd5b5093505050505b92915050565b6000620003e48360001b60405180602001620002bb906200041e565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008560405160240162000303919062000617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f360000000000000000000000000000000000000000000000000000000017905290516200038a93929101620005a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620003c892916020016200064a565b60405160208183030381529060405280519060200120620003eb565b9392505050565b6000620003e48383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806200067e83390190565b60008060a083850312156200044057600080fd5b823591508360a0840111156200045557600080fd5b50926020919091019150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060a08385031215620004a457600080fd5b82359150602084603f850112620004ba57600080fd5b6040516080810181811067ffffffffffffffff82111715620004e057620004e062000461565b6040528060a0860187811115620004f657600080fd5b8387015b81811015620005135780358352918401918401620004fa565b50505080925050509250929050565b6000828210156200055c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b6080818101908383376000815292915050565b60005b838110156200059157818101518382015260200162000577565b83811115620005a1576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152620005e481606085016020870162000574565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60808101818360005b60048110156200064157815183526020928301929091019060010162000620565b50505092915050565b600083516200065e81846020880162000574565b8351908301906200067481836020880162000574565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122049efa79244350d13218ae7e1c2d6686117b1b9bd2f5ebd965dfe07d1631c48cb64736f6c634300080f003360e0604052306080523480156200001557600080fd5b50604051620026303803806200263083398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c05161242e62000202600039600081816102a801526116ac0152600081816103cf01528181610926015281816109cd01528181610da301528181610fda015281816111790152818161153b01526117a5015260008181610747015281816107dd01528181610a9101528181610b270152610c56015261242e6000f3fe6080604052600436106101785760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae146104a5578063ee472f36146104c7578063f23a6e61146104e757600080fd5b8063c399ec881461045b578063c4d66de814610470578063d087d2881461049057600080fd5b8063b0d691fe116100b0578063b0d691fe146103c0578063b61d27f6146103f3578063bc197c811461041357600080fd5b806352d1902d146103785780638da5cb5b1461038d57600080fd5b8063245a7bfc1161012d5780634a58db19116101075780634a58db191461033d5780634d44560d146103455780634f1ef2861461036557600080fd5b8063245a7bfc146102965780633659cfe6146102ef5780633a871cdd1461030f57600080fd5b8063150b7a021161015e578063150b7a02146101e057806318dfb3c71461025657806318fc5c441461027657600080fd5b806223de291461018457806301ffc9a7146101ab57600080fd5b3661017f57005b600080fd5b34801561019057600080fd5b506101a961019f366004611b89565b5050505050505050565b005b3480156101b757600080fd5b506101cb6101c6366004611c3a565b61052d565b60405190151581526020015b60405180910390f35b3480156101ec57600080fd5b506102256101fb366004611c7c565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101d7565b34801561026257600080fd5b506101a9610271366004611d34565b610612565b34801561028257600080fd5b506101a9610291366004611e1e565b61071c565b3480156102a257600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d7565b3480156102fb57600080fd5b506101a961030a366004611e9c565b610730565b34801561031b57600080fd5b5061032f61032a366004611eb9565b6108fe565b6040519081526020016101d7565b6101a9610924565b34801561035157600080fd5b506101a9610360366004611f0d565b6109c3565b6101a9610373366004611f39565b610a7a565b34801561038457600080fd5b5061032f610c3c565b34801561039957600080fd5b506000546102ca9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ca565b3480156103ff57600080fd5b506101a961040e366004611fff565b610d0e565b34801561041f57600080fd5b5061022561042e36600461204f565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561046757600080fd5b5061032f610d5d565b34801561047c57600080fd5b506101a961048b366004611e9c565b610e14565b34801561049c57600080fd5b5061032f610f8d565b3480156104b157600080fd5b506104ba611009565b6040516101d79190612110565b3480156104d357600080fd5b506101a96104e2366004611e1e565b611044565b3480156104f357600080fd5b5061022561050236600461211e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806105c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061060c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61061a611161565b82811461066e5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156107155761070385858381811061068e5761068e61219a565b90506020020160208101906106a39190611e9c565b60008585858181106106b7576106b761219a565b90506020028101906106c991906121c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b8061070d8161225d565b915050610671565b5050505050565b61072461128d565b61072d81611304565b50565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107db5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108d95760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b6108e28161134b565b6040805160008082526020820190925261072d91839190611353565b6000610908611523565b61091284846115a8565b905061091d826116e4565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109af57600080fd5b505af1158015610715573d6000803e3d6000fd5b6109cb61128d565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b255760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b9a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c235760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b610c2c8261134b565b610c3882826001611353565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ce95760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610665565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d16611161565b610d57848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061121092505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612295565b905090565b600054610100900460ff1615808015610e345750600054600160ff909116105b80610e4e5750303b158015610e4e575060005460ff166001145b610ec05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f1e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f278261174f565b8015610c3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dce565b611011611aad565b6040805160808101918290529060019060049082845b815481526020019060010190808311611027575050505050905090565b600054610100900460ff16158080156110645750600054600160ff909116105b8061107e5750303b15801561107e575060005460ff166001145b6110f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611158600061174f565b610f2782611304565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806111c2575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61120e5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610665565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161123991906122da565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50915091508161071557805160208201fd5b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806112b857503330145b61120e5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610665565b7f42e4c4ce1432650f17e41c4ea77ed12c0ab20b229d3ffd84a2ebc9f8abb25a836001826040516113369291906122f6565b60405180910390a1610c386001826004611acb565b61072d61128d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561138b57611386836117ee565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611410575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261140d91810190612295565b60015b6114825760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146115175760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610665565b506113868383836118de565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461120e5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610665565b60006115b760408401846121c9565b15905061168b5760006115c8611009565b6040516020016115d89190612110565b6040516020818303038152906040528051906020012090508084806040019061160191906121c9565b608061161060408901896121c9565b61161b92915061232f565b611626928290612346565b604051611634929190612370565b6040518091039020146116895760405162461bcd60e51b815260206004820152600c60248201527f77726f6e67207075626b657900000000000000000000000000000000000000006044820152606401610665565b505b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201529392505050565b801561072d5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e610715565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6118785760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6118e783611903565b6000825111806118f45750805b1561138657610d578383611950565b61190c816117ee565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061091d83836040518060600160405280602781526020016123d26027913960606000808573ffffffffffffffffffffffffffffffffffffffff168560405161199a91906122da565b600060405180830381855af49150503d80600081146119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b606091505b50915091506119eb868383876119f5565b9695505050505050565b60608315611a71578251600003611a6a5773ffffffffffffffffffffffffffffffffffffffff85163b611a6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610665565b5081611a7b565b611a7b8383611a83565b949350505050565b815115611a935781518083602001fd5b8060405162461bcd60e51b81526004016106659190612380565b60405180608001604052806004906020820280368337509192915050565b8260048101928215611af9579160200282015b82811115611af9578251825591602001919060010190611ade565b50611b05929150611b09565b5090565b5b80821115611b055760008155600101611b0a565b73ffffffffffffffffffffffffffffffffffffffff8116811461072d57600080fd5b60008083601f840112611b5257600080fd5b50813567ffffffffffffffff811115611b6a57600080fd5b602083019150836020828501011115611b8257600080fd5b9250929050565b60008060008060008060008060c0898b031215611ba557600080fd5b8835611bb081611b1e565b97506020890135611bc081611b1e565b96506040890135611bd081611b1e565b955060608901359450608089013567ffffffffffffffff80821115611bf457600080fd5b611c008c838d01611b40565b909650945060a08b0135915080821115611c1957600080fd5b50611c268b828c01611b40565b999c989b5096995094979396929594505050565b600060208284031215611c4c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461091d57600080fd5b600080600080600060808688031215611c9457600080fd5b8535611c9f81611b1e565b94506020860135611caf81611b1e565b935060408601359250606086013567ffffffffffffffff811115611cd257600080fd5b611cde88828901611b40565b969995985093965092949392505050565b60008083601f840112611d0157600080fd5b50813567ffffffffffffffff811115611d1957600080fd5b6020830191508360208260051b8501011115611b8257600080fd5b60008060008060408587031215611d4a57600080fd5b843567ffffffffffffffff80821115611d6257600080fd5b611d6e88838901611cef565b90965094506020870135915080821115611d8757600080fd5b50611d9487828801611cef565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e1657611e16611da0565b604052919050565b600060808284031215611e3057600080fd5b82601f830112611e3f57600080fd5b6040516080810181811067ffffffffffffffff82111715611e6257611e62611da0565b604052806080840185811115611e7757600080fd5b845b81811015611e91578035835260209283019201611e79565b509195945050505050565b600060208284031215611eae57600080fd5b813561091d81611b1e565b600080600060608486031215611ece57600080fd5b833567ffffffffffffffff811115611ee557600080fd5b84016101608187031215611ef857600080fd5b95602085013595506040909401359392505050565b60008060408385031215611f2057600080fd5b8235611f2b81611b1e565b946020939093013593505050565b60008060408385031215611f4c57600080fd5b8235611f5781611b1e565b915060208381013567ffffffffffffffff80821115611f7557600080fd5b818601915086601f830112611f8957600080fd5b813581811115611f9b57611f9b611da0565b611fcb847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dcf565b91508082528784828501011115611fe157600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806060858703121561201557600080fd5b843561202081611b1e565b935060208501359250604085013567ffffffffffffffff81111561204357600080fd5b611d9487828801611b40565b60008060008060008060008060a0898b03121561206b57600080fd5b883561207681611b1e565b9750602089013561208681611b1e565b9650604089013567ffffffffffffffff808211156120a357600080fd5b6120af8c838d01611cef565b909850965060608b01359150808211156120c857600080fd5b6120d48c838d01611cef565b909650945060808b0135915080821115611c1957600080fd5b8060005b6004811015610d575781518452602093840193909101906001016120f1565b6080810161060c82846120ed565b60008060008060008060a0878903121561213757600080fd5b863561214281611b1e565b9550602087013561215281611b1e565b94506040870135935060608701359250608087013567ffffffffffffffff81111561217c57600080fd5b61218889828a01611b40565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121fe57600080fd5b83018035915067ffffffffffffffff82111561221957600080fd5b602001915036819003821315611b8257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361228e5761228e61222e565b5060010190565b6000602082840312156122a757600080fd5b5051919050565b60005b838110156122c95781810151838201526020016122b1565b83811115610d575750506000910152565b600082516122ec8184602087016122ae565b9190910192915050565b6101008101818460005b600481101561231f578154835260209092019160019182019101612300565b50505061091d60808301846120ed565b6000828210156123415761234161222e565b500390565b6000808585111561235657600080fd5b8386111561236357600080fd5b5050820193919092039150565b8183823760009101908152919050565b602081526000825180602084015261239f8160408501602087016122ae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bce0ce62c54cf2aa0b2c90d7d08c4f9212f4077f1742678a583f10617e0d761964736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x35B0 CODESIZE SUB DUP1 PUSH2 0x35B0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xAA JUMP JUMPDEST DUP2 DUP2 PUSH1 0x40 MLOAD PUSH2 0x3D SWAP1 PUSH2 0x85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x70 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH2 0xE4 SWAP1 POP JUMP JUMPDEST PUSH2 0x2630 DUP1 PUSH2 0xF80 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH2 0xC8 DUP2 PUSH2 0x92 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xD9 DUP2 PUSH2 0x92 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xE74 PUSH2 0x10C PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH1 0x51 ADD MSTORE DUP2 DUP2 PUSH2 0x1B0 ADD MSTORE PUSH2 0x2D1 ADD MSTORE PUSH2 0xE74 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH3 0x46 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH3 0x4B JUMPI DUP1 PUSH4 0x19C2A1B2 EQ PUSH3 0x9C JUMPI DUP1 PUSH4 0xDE3398DD EQ PUSH3 0xB3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x73 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH3 0x73 PUSH3 0xAD CALLDATASIZE PUSH1 0x4 PUSH3 0x42C JUMP JUMPDEST PUSH3 0xCA JUMP JUMPDEST PUSH3 0x73 PUSH3 0xC4 CALLDATASIZE PUSH1 0x4 PUSH3 0x490 JUMP JUMPDEST PUSH3 0x29F JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH3 0xDA PUSH1 0x80 CALLDATASIZE PUSH3 0x522 JUMP JUMPDEST DUP2 EQ PUSH3 0x147 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67207075626B6579206F666673657400000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP6 DUP6 PUSH1 0x4 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH3 0x29F SWAP2 POP POP JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH3 0x1AA JUMPI POP SWAP2 POP PUSH3 0x299 SWAP1 POP JUMP JUMPDEST DUP6 PUSH1 0x0 SHL PUSH32 0x0 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0x1E2 SWAP2 SWAP1 PUSH3 0x561 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH3 0x264 SWAP1 PUSH3 0x41E JUMP JUMPDEST PUSH3 0x271 SWAP3 SWAP2 SWAP1 PUSH3 0x5A7 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH3 0x292 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 POP POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3E4 DUP4 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH3 0x2BB SWAP1 PUSH3 0x41E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND PUSH1 0x40 MSTORE POP PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0x303 SWAP2 SWAP1 PUSH3 0x617 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH3 0x38A SWAP4 SWAP3 SWAP2 ADD PUSH3 0x5A7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH3 0x3C8 SWAP3 SWAP2 PUSH1 0x20 ADD PUSH3 0x64A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH3 0x3EB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3E4 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH3 0x67E DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP DUP4 PUSH1 0xA0 DUP5 ADD GT ISZERO PUSH3 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP3 PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x4A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP5 PUSH1 0x3F DUP6 ADD SLT PUSH3 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x4E0 JUMPI PUSH3 0x4E0 PUSH3 0x461 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0xA0 DUP7 ADD DUP8 DUP2 GT ISZERO PUSH3 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP8 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x513 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE SWAP2 DUP5 ADD SWAP2 DUP5 ADD PUSH3 0x4FA JUMP JUMPDEST POP POP POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH3 0x55C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD SWAP1 DUP4 DUP4 CALLDATACOPY PUSH1 0x0 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x591 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x577 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x5A1 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH3 0x5E4 DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH3 0x574 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH3 0x641 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH3 0x620 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH3 0x65E DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH3 0x574 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH3 0x674 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH3 0x574 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x7066735822122049EFA7 SWAP3 DIFFICULTY CALLDATALOAD 0xD SGT 0x21 DUP11 0xE7 0xE1 0xC2 0xD6 PUSH9 0x6117B1B9BD2F5EBD96 0x5D INVALID SMOD 0xD1 PUSH4 0x1C48CB64 PUSH20 0x6F6C634300080F003360E0604052306080523480 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2630 CODESIZE SUB DUP1 PUSH3 0x2630 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x242E PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x2A8 ADD MSTORE PUSH2 0x16AC ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x3CF ADD MSTORE DUP2 DUP2 PUSH2 0x926 ADD MSTORE DUP2 DUP2 PUSH2 0x9CD ADD MSTORE DUP2 DUP2 PUSH2 0xDA3 ADD MSTORE DUP2 DUP2 PUSH2 0xFDA ADD MSTORE DUP2 DUP2 PUSH2 0x1179 ADD MSTORE DUP2 DUP2 PUSH2 0x153B ADD MSTORE PUSH2 0x17A5 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x747 ADD MSTORE DUP2 DUP2 PUSH2 0x7DD ADD MSTORE DUP2 DUP2 PUSH2 0xA91 ADD MSTORE DUP2 DUP2 PUSH2 0xB27 ADD MSTORE PUSH2 0xC56 ADD MSTORE PUSH2 0x242E PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x178 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3C0 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x38D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x12D JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x33D JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x345 JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2EF JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x15E JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x18FC5C44 EQ PUSH2 0x276 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x184 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x17F JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x19F CALLDATASIZE PUSH1 0x4 PUSH2 0x1B89 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CB PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C3A JUMP JUMPDEST PUSH2 0x52D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x1FB CALLDATASIZE PUSH1 0x4 PUSH2 0x1C7C JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x271 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D34 JUMP JUMPDEST PUSH2 0x612 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x291 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x71C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CA PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x30A CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0x730 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0x32A CALLDATASIZE PUSH1 0x4 PUSH2 0x1EB9 JUMP JUMPDEST PUSH2 0x8FE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D7 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x924 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x351 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x360 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F0D JUMP JUMPDEST PUSH2 0x9C3 JUMP JUMPDEST PUSH2 0x1A9 PUSH2 0x373 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0xA7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xC3C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x399 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x2CA SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x2CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x40E CALLDATASIZE PUSH1 0x4 PUSH2 0x1FFF JUMP JUMPDEST PUSH2 0xD0E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x42E CALLDATASIZE PUSH1 0x4 PUSH2 0x204F JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xD5D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x1E9C JUMP JUMPDEST PUSH2 0xE14 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32F PUSH2 0xF8D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4BA PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1D7 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A9 PUSH2 0x4E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1E JUMP JUMPDEST PUSH2 0x1044 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH2 0x502 CALLDATASIZE PUSH1 0x4 PUSH2 0x211E JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x5C0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x60C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x61A PUSH2 0x1161 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x66E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x715 JUMPI PUSH2 0x703 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x68E JUMPI PUSH2 0x68E PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x6A3 SWAP2 SWAP1 PUSH2 0x1E9C JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x219A JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x6C9 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x70D DUP2 PUSH2 0x225D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x724 PUSH2 0x128D JUMP JUMPDEST PUSH2 0x72D DUP2 PUSH2 0x1304 JUMP JUMPDEST POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x7DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x850 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0x8E2 DUP2 PUSH2 0x134B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x72D SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x908 PUSH2 0x1523 JUMP JUMPDEST PUSH2 0x912 DUP5 DUP5 PUSH2 0x15A8 JUMP JUMPDEST SWAP1 POP PUSH2 0x91D DUP3 PUSH2 0x16E4 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9CB PUSH2 0x128D JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA72 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB25 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB9A PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC23 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0xC2C DUP3 PUSH2 0x134B JUMP JUMPDEST PUSH2 0xC38 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1353 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD16 PUSH2 0x1161 JUMP JUMPDEST PUSH2 0xD57 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1210 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDEB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE0F SWAP2 SWAP1 PUSH2 0x2295 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE34 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE4E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE4E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xEC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF1E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x174F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC38 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDCE JUMP JUMPDEST PUSH2 0x1011 PUSH2 0x1AAD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 SWAP1 DUP3 DUP5 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1027 JUMPI POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1064 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x107E JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x107E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x114E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1158 PUSH1 0x0 PUSH2 0x174F JUMP JUMPDEST PUSH2 0xF27 DUP3 PUSH2 0x1304 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x11C2 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1239 SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1276 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x127B JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x715 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x12B8 JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x42E4C4CE1432650F17E41C4EA77ED12C0AB20B229D3FFD84A2EBC9F8ABB25A83 PUSH1 0x1 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1336 SWAP3 SWAP2 SWAP1 PUSH2 0x22F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0xC38 PUSH1 0x1 DUP3 PUSH1 0x4 PUSH2 0x1ACB JUMP JUMPDEST PUSH2 0x72D PUSH2 0x128D JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x138B JUMPI PUSH2 0x1386 DUP4 PUSH2 0x17EE JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x140D SWAP2 DUP2 ADD SWAP1 PUSH2 0x2295 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1482 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1517 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH2 0x1386 DUP4 DUP4 DUP4 PUSH2 0x18DE JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x120E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B7 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x21C9 JUMP JUMPDEST ISZERO SWAP1 POP PUSH2 0x168B JUMPI PUSH1 0x0 PUSH2 0x15C8 PUSH2 0x1009 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x15D8 SWAP2 SWAP1 PUSH2 0x2110 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP DUP1 DUP5 DUP1 PUSH1 0x40 ADD SWAP1 PUSH2 0x1601 SWAP2 SWAP1 PUSH2 0x21C9 JUMP JUMPDEST PUSH1 0x80 PUSH2 0x1610 PUSH1 0x40 DUP10 ADD DUP10 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x161B SWAP3 SWAP2 POP PUSH2 0x232F JUMP JUMPDEST PUSH2 0x1626 SWAP3 DUP3 SWAP1 PUSH2 0x2346 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1634 SWAP3 SWAP2 SWAP1 PUSH2 0x2370 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 EQ PUSH2 0x1689 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67207075626B65790000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x72D JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x715 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x715 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1878 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x18E7 DUP4 PUSH2 0x1903 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x18F4 JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1386 JUMPI PUSH2 0xD57 DUP4 DUP4 PUSH2 0x1950 JUMP JUMPDEST PUSH2 0x190C DUP2 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x91D DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x23D2 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x199A SWAP2 SWAP1 PUSH2 0x22DA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x19D5 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x19DA JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x19EB DUP7 DUP4 DUP4 DUP8 PUSH2 0x19F5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A71 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1A6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1A6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP DUP2 PUSH2 0x1A7B JUMP JUMPDEST PUSH2 0x1A7B DUP4 DUP4 PUSH2 0x1A83 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1A93 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 PUSH1 0x4 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1AF9 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1AF9 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1ADE JUMP JUMPDEST POP PUSH2 0x1B05 SWAP3 SWAP2 POP PUSH2 0x1B09 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1B05 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1B0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x72D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1BA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1BB0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1BC0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1BD0 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1BF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C00 DUP13 DUP4 DUP14 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C26 DUP12 DUP3 DUP13 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1C94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1C9F DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1CAF DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CDE DUP9 DUP3 DUP10 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1D01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D6E DUP9 DUP4 DUP10 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1D87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1E16 JUMPI PUSH2 0x1E16 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1E3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1E62 JUMPI PUSH2 0x1E62 PUSH2 0x1DA0 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1E77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E91 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1E79 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x91D DUP2 PUSH2 0x1B1E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1ECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F2B DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1F57 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1F9B JUMPI PUSH2 0x1F9B PUSH2 0x1DA0 JUMP JUMPDEST PUSH2 0x1FCB DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1DCF JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1FE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2015 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2020 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D94 DUP8 DUP3 DUP9 ADD PUSH2 0x1B40 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x206B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x2076 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x2086 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x20A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20AF DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x20C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x20D4 DUP13 DUP4 DUP14 ADD PUSH2 0x1CEF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0xD57 JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x20F1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x60C DUP3 DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2142 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2152 DUP2 PUSH2 0x1B1E JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x217C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2188 DUP10 DUP3 DUP11 ADD PUSH2 0x1B40 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x21FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x228E JUMPI PUSH2 0x228E PUSH2 0x222E JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22C9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22B1 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD57 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x22EC DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x100 DUP2 ADD DUP2 DUP5 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x231F JUMPI DUP2 SLOAD DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2300 JUMP JUMPDEST POP POP POP PUSH2 0x91D PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x2341 JUMPI PUSH2 0x2341 PUSH2 0x222E JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x2356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2363 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x239F DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x22AE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220BCE0CE PUSH3 0xC54CF2 0xAA SIGNEXTEND 0x2C SWAP1 0xD7 0xD0 DUP13 0x4F SWAP3 SLT DELEGATECALL SMOD PUSH32 0x1742678A583F10617E0D761964736F6C634300080F0033000000000000000000 ","sourceMap":"477:1968:78:-:0;;;566:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;670:10;682;655:38;;;;;:::i;:::-;-1:-1:-1;;;;;851:15:111;;;833:34;;903:15;;898:2;883:18;;876:43;783:2;768:18;655:38:78;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;631:62:78;;;-1:-1:-1;477:1968:78;;-1:-1:-1;477:1968:78;;;;;;;;;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;600:325::-;477:1968:78;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@accountImplementation_14924":{"entryPoint":null,"id":14924,"parameterSlots":0,"returnSlots":0},"@computeAddress_5217":{"entryPoint":1003,"id":5217,"parameterSlots":2,"returnSlots":1},"@computeAddress_5231":{"entryPoint":null,"id":5231,"parameterSlots":3,"returnSlots":1},"@createAccount_15021":{"entryPoint":202,"id":15021,"parameterSlots":2,"returnSlots":1},"@getAddress_15065":{"entryPoint":671,"id":15065,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_calldata_ptr":{"entryPoint":1068,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr":{"entryPoint":1168,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":1610,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":1447,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_calldata_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":1377,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":1559,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_BLSAccount_$14914__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_d71ed9cb0762f140854c40f0de09e93ead56c0d0cc8feffde23605abb710553b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":1314,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":1396,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x41":{"entryPoint":1121,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:4562:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"143:125:111","statements":[{"nodeType":"YulAssignment","src":"153:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"165:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"176:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"161:3:111"},"nodeType":"YulFunctionCall","src":"161:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"153:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"195:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"210:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"218:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"206:3:111"},"nodeType":"YulFunctionCall","src":"206:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"188:6:111"},"nodeType":"YulFunctionCall","src":"188:74:111"},"nodeType":"YulExpressionStatement","src":"188:74:111"}]},"name":"abi_encode_tuple_t_contract$_BLSAccount_$14914__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"112:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"123:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"134:4:111","type":""}],"src":"14:254:111"},{"body":{"nodeType":"YulBlock","src":"385:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"432:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"441:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"434:6:111"},"nodeType":"YulFunctionCall","src":"434:12:111"},"nodeType":"YulExpressionStatement","src":"434:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"406:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"415:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"402:3:111"},"nodeType":"YulFunctionCall","src":"402:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"427:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"398:3:111"},"nodeType":"YulFunctionCall","src":"398:33:111"},"nodeType":"YulIf","src":"395:53:111"},{"nodeType":"YulAssignment","src":"457:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"480:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"467:12:111"},"nodeType":"YulFunctionCall","src":"467:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"457:6:111"}]},{"body":{"nodeType":"YulBlock","src":"535:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"544:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"547:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"537:6:111"},"nodeType":"YulFunctionCall","src":"537:12:111"},"nodeType":"YulExpressionStatement","src":"537:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"520:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"505:3:111"},"nodeType":"YulFunctionCall","src":"505:19:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"526:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"502:2:111"},"nodeType":"YulFunctionCall","src":"502:32:111"},"nodeType":"YulIf","src":"499:52:111"},{"nodeType":"YulAssignment","src":"560:28:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"574:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"585:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:18:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"560:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"343:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"354:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"366:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"374:6:111","type":""}],"src":"273:321:111"},{"body":{"nodeType":"YulBlock","src":"631:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"648:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"651:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"641:6:111"},"nodeType":"YulFunctionCall","src":"641:88:111"},"nodeType":"YulExpressionStatement","src":"641:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"745:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"748:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"738:6:111"},"nodeType":"YulFunctionCall","src":"738:15:111"},"nodeType":"YulExpressionStatement","src":"738:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"769:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"772:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"762:6:111"},"nodeType":"YulFunctionCall","src":"762:15:111"},"nodeType":"YulExpressionStatement","src":"762:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"599:184:111"},{"body":{"nodeType":"YulBlock","src":"898:734:111","statements":[{"body":{"nodeType":"YulBlock","src":"945:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"954:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"957:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"947:6:111"},"nodeType":"YulFunctionCall","src":"947:12:111"},"nodeType":"YulExpressionStatement","src":"947:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"919:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"928:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"915:3:111"},"nodeType":"YulFunctionCall","src":"915:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"940:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"911:3:111"},"nodeType":"YulFunctionCall","src":"911:33:111"},"nodeType":"YulIf","src":"908:53:111"},{"nodeType":"YulAssignment","src":"970:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"993:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"980:12:111"},"nodeType":"YulFunctionCall","src":"980:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"970:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1012:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1022:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1016:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1077:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1086:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1089:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1079:6:111"},"nodeType":"YulFunctionCall","src":"1079:12:111"},"nodeType":"YulExpressionStatement","src":"1079:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1051:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1062:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1047:3:111"},"nodeType":"YulFunctionCall","src":"1047:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1067:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1043:3:111"},"nodeType":"YulFunctionCall","src":"1043:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1036:6:111"},"nodeType":"YulFunctionCall","src":"1036:40:111"},"nodeType":"YulIf","src":"1033:60:111"},{"nodeType":"YulVariableDeclaration","src":"1102:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1122:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1116:5:111"},"nodeType":"YulFunctionCall","src":"1116:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1106:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1134:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1156:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1164:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1152:3:111"},"nodeType":"YulFunctionCall","src":"1152:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1138:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1243:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1245:16:111"},"nodeType":"YulFunctionCall","src":"1245:18:111"},"nodeType":"YulExpressionStatement","src":"1245:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1186:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1198:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1183:2:111"},"nodeType":"YulFunctionCall","src":"1183:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1222:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1234:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1219:2:111"},"nodeType":"YulFunctionCall","src":"1219:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1180:2:111"},"nodeType":"YulFunctionCall","src":"1180:62:111"},"nodeType":"YulIf","src":"1177:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1281:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1285:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1274:6:111"},"nodeType":"YulFunctionCall","src":"1274:22:111"},"nodeType":"YulExpressionStatement","src":"1274:22:111"},{"nodeType":"YulVariableDeclaration","src":"1305:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1316:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"1309:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1331:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1349:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1360:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1345:3:111"},"nodeType":"YulFunctionCall","src":"1345:19:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"1335:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1396:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1405:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1408:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1398:6:111"},"nodeType":"YulFunctionCall","src":"1398:12:111"},"nodeType":"YulExpressionStatement","src":"1398:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"1379:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1387:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1376:2:111"},"nodeType":"YulFunctionCall","src":"1376:19:111"},"nodeType":"YulIf","src":"1373:39:111"},{"nodeType":"YulVariableDeclaration","src":"1421:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1436:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1447:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1432:3:111"},"nodeType":"YulFunctionCall","src":"1432:18:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"1425:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1515:86:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1536:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1554:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1541:12:111"},"nodeType":"YulFunctionCall","src":"1541:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1529:6:111"},"nodeType":"YulFunctionCall","src":"1529:30:111"},"nodeType":"YulExpressionStatement","src":"1529:30:111"},{"nodeType":"YulAssignment","src":"1572:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1583:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1588:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1579:3:111"},"nodeType":"YulFunctionCall","src":"1579:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"1572:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1470:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"1475:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1467:2:111"},"nodeType":"YulFunctionCall","src":"1467:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1483:23:111","statements":[{"nodeType":"YulAssignment","src":"1485:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1496:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1501:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1492:3:111"},"nodeType":"YulFunctionCall","src":"1492:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"1485:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1463:3:111","statements":[]},"src":"1459:142:111"},{"nodeType":"YulAssignment","src":"1610:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1620:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1610:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"856:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"867:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"879:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"887:6:111","type":""}],"src":"788:844:111"},{"body":{"nodeType":"YulBlock","src":"1738:125:111","statements":[{"nodeType":"YulAssignment","src":"1748:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1771:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1756:3:111"},"nodeType":"YulFunctionCall","src":"1756:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1748:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1790:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1805:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1813:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1801:3:111"},"nodeType":"YulFunctionCall","src":"1801:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1783:6:111"},"nodeType":"YulFunctionCall","src":"1783:74:111"},"nodeType":"YulExpressionStatement","src":"1783:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1707:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1718:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1729:4:111","type":""}],"src":"1637:226:111"},{"body":{"nodeType":"YulBlock","src":"1917:230:111","statements":[{"body":{"nodeType":"YulBlock","src":"1947:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1968:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1971:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1961:6:111"},"nodeType":"YulFunctionCall","src":"1961:88:111"},"nodeType":"YulExpressionStatement","src":"1961:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2069:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2072:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2062:6:111"},"nodeType":"YulFunctionCall","src":"2062:15:111"},"nodeType":"YulExpressionStatement","src":"2062:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2097:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2100:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2090:6:111"},"nodeType":"YulFunctionCall","src":"2090:15:111"},"nodeType":"YulExpressionStatement","src":"2090:15:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1933:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"1936:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:8:111"},"nodeType":"YulIf","src":"1927:188:111"},{"nodeType":"YulAssignment","src":"2124:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2136:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2139:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2132:3:111"},"nodeType":"YulFunctionCall","src":"2132:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"2124:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"1899:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"1902:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"1908:4:111","type":""}],"src":"1868:279:111"},{"body":{"nodeType":"YulBlock","src":"2326:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2343:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2354:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2336:6:111"},"nodeType":"YulFunctionCall","src":"2336:21:111"},"nodeType":"YulExpressionStatement","src":"2336:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2377:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2388:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2373:3:111"},"nodeType":"YulFunctionCall","src":"2373:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2393:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2366:6:111"},"nodeType":"YulFunctionCall","src":"2366:30:111"},"nodeType":"YulExpressionStatement","src":"2366:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2416:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2427:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2412:3:111"},"nodeType":"YulFunctionCall","src":"2412:18:111"},{"hexValue":"77726f6e67207075626b6579206f6666736574","kind":"string","nodeType":"YulLiteral","src":"2432:21:111","type":"","value":"wrong pubkey offset"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2405:6:111"},"nodeType":"YulFunctionCall","src":"2405:49:111"},"nodeType":"YulExpressionStatement","src":"2405:49:111"},{"nodeType":"YulAssignment","src":"2463:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2475:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2486:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2471:3:111"},"nodeType":"YulFunctionCall","src":"2471:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2463:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_d71ed9cb0762f140854c40f0de09e93ead56c0d0cc8feffde23605abb710553b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2303:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2317:4:111","type":""}],"src":"2152:343:111"},{"body":{"nodeType":"YulBlock","src":"2649:112:111","statements":[{"nodeType":"YulAssignment","src":"2659:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2671:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2682:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2667:3:111"},"nodeType":"YulFunctionCall","src":"2667:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2659:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2708:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2719:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2727:3:111","type":"","value":"128"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2695:12:111"},"nodeType":"YulFunctionCall","src":"2695:36:111"},"nodeType":"YulExpressionStatement","src":"2695:36:111"},{"expression":{"arguments":[{"name":"tail","nodeType":"YulIdentifier","src":"2747:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"2753:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2740:6:111"},"nodeType":"YulFunctionCall","src":"2740:15:111"},"nodeType":"YulExpressionStatement","src":"2740:15:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_calldata_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2618:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2629:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2640:4:111","type":""}],"src":"2500:261:111"},{"body":{"nodeType":"YulBlock","src":"2819:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2829:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2838:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"2833:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2898:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2923:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2928:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2919:3:111"},"nodeType":"YulFunctionCall","src":"2919:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2942:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2947:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2938:3:111"},"nodeType":"YulFunctionCall","src":"2938:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2932:5:111"},"nodeType":"YulFunctionCall","src":"2932:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2912:6:111"},"nodeType":"YulFunctionCall","src":"2912:39:111"},"nodeType":"YulExpressionStatement","src":"2912:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2859:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2862:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2856:2:111"},"nodeType":"YulFunctionCall","src":"2856:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2870:19:111","statements":[{"nodeType":"YulAssignment","src":"2872:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2881:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"2884:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2877:3:111"},"nodeType":"YulFunctionCall","src":"2877:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"2872:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2852:3:111","statements":[]},"src":"2848:113:111"},{"body":{"nodeType":"YulBlock","src":"2987:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3000:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"3005:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2996:3:111"},"nodeType":"YulFunctionCall","src":"2996:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"3014:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2989:6:111"},"nodeType":"YulFunctionCall","src":"2989:27:111"},"nodeType":"YulExpressionStatement","src":"2989:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2976:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2979:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2973:2:111"},"nodeType":"YulFunctionCall","src":"2973:13:111"},"nodeType":"YulIf","src":"2970:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"2797:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"2802:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"2807:6:111","type":""}],"src":"2766:258:111"},{"body":{"nodeType":"YulBlock","src":"3176:413:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3193:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3208:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3216:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3204:3:111"},"nodeType":"YulFunctionCall","src":"3204:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3186:6:111"},"nodeType":"YulFunctionCall","src":"3186:74:111"},"nodeType":"YulExpressionStatement","src":"3186:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3291:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3276:3:111"},"nodeType":"YulFunctionCall","src":"3276:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3296:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3269:6:111"},"nodeType":"YulFunctionCall","src":"3269:30:111"},"nodeType":"YulExpressionStatement","src":"3269:30:111"},{"nodeType":"YulVariableDeclaration","src":"3308:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"3328:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3322:5:111"},"nodeType":"YulFunctionCall","src":"3322:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3312:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3355:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3366:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3351:3:111"},"nodeType":"YulFunctionCall","src":"3351:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"3371:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3344:6:111"},"nodeType":"YulFunctionCall","src":"3344:34:111"},"nodeType":"YulExpressionStatement","src":"3344:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"3413:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3421:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3409:3:111"},"nodeType":"YulFunctionCall","src":"3409:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3430:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3441:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3426:3:111"},"nodeType":"YulFunctionCall","src":"3426:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"3446:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"3387:21:111"},"nodeType":"YulFunctionCall","src":"3387:66:111"},"nodeType":"YulExpressionStatement","src":"3387:66:111"},{"nodeType":"YulAssignment","src":"3462:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3478:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3497:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3505:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3493:3:111"},"nodeType":"YulFunctionCall","src":"3493:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3510:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3489:3:111"},"nodeType":"YulFunctionCall","src":"3489:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3474:3:111"},"nodeType":"YulFunctionCall","src":"3474:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"3580:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3470:3:111"},"nodeType":"YulFunctionCall","src":"3470:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3462:4:111"}]}]},"name":"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3137:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3148:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3156:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3167:4:111","type":""}],"src":"3029:560:111"},{"body":{"nodeType":"YulBlock","src":"3741:348:111","statements":[{"nodeType":"YulAssignment","src":"3751:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3774:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3759:3:111"},"nodeType":"YulFunctionCall","src":"3759:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3751:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"3787:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"3798:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"3791:3:111","type":""}]},{"nodeType":"YulAssignment","src":"3816:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"3823:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"3816:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"3841:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"3855:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"3845:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3870:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3879:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3874:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3936:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3957:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"3968:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3962:5:111"},"nodeType":"YulFunctionCall","src":"3962:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3950:6:111"},"nodeType":"YulFunctionCall","src":"3950:26:111"},"nodeType":"YulExpressionStatement","src":"3950:26:111"},{"nodeType":"YulVariableDeclaration","src":"3989:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3999:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3993:2:111","type":""}]},{"nodeType":"YulAssignment","src":"4016:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4027:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4032:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4023:3:111"},"nodeType":"YulFunctionCall","src":"4023:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"4016:3:111"}]},{"nodeType":"YulAssignment","src":"4048:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"4062:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4070:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4058:3:111"},"nodeType":"YulFunctionCall","src":"4058:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"4048:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3900:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3903:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3897:2:111"},"nodeType":"YulFunctionCall","src":"3897:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3909:18:111","statements":[{"nodeType":"YulAssignment","src":"3911:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3920:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3923:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3916:3:111"},"nodeType":"YulFunctionCall","src":"3916:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3911:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3893:3:111","statements":[]},"src":"3889:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3710:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3721:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3732:4:111","type":""}],"src":"3594:495:111"},{"body":{"nodeType":"YulBlock","src":"4277:283:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4287:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4307:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4301:5:111"},"nodeType":"YulFunctionCall","src":"4301:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"4291:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4349:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4357:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4345:3:111"},"nodeType":"YulFunctionCall","src":"4345:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"4364:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4369:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"4323:21:111"},"nodeType":"YulFunctionCall","src":"4323:53:111"},"nodeType":"YulExpressionStatement","src":"4323:53:111"},{"nodeType":"YulVariableDeclaration","src":"4385:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4402:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4407:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4398:3:111"},"nodeType":"YulFunctionCall","src":"4398:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"4389:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4423:29:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"4445:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4439:5:111"},"nodeType":"YulFunctionCall","src":"4439:13:111"},"variables":[{"name":"length_1","nodeType":"YulTypedName","src":"4427:8:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"4487:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4495:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4483:3:111"},"nodeType":"YulFunctionCall","src":"4483:17:111"},{"name":"end_1","nodeType":"YulIdentifier","src":"4502:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"4509:8:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"4461:21:111"},"nodeType":"YulFunctionCall","src":"4461:57:111"},"nodeType":"YulExpressionStatement","src":"4461:57:111"},{"nodeType":"YulAssignment","src":"4527:27:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"4538:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"4545:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4534:3:111"},"nodeType":"YulFunctionCall","src":"4534:20:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"4527:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"4245:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4250:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4258:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"4269:3:111","type":""}],"src":"4094:466:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_contract$_BLSAccount_$14914__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256t_array$_t_uint256_$4_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := calldataload(headStart)\n if gt(add(headStart, 160), dataEnd) { revert(0, 0) }\n value1 := add(headStart, 32)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := calldataload(headStart)\n let _1 := 32\n if iszero(slt(add(headStart, 63), dataEnd)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(headStart, 160)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(headStart, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, _1)\n }\n value1 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_d71ed9cb0762f140854c40f0de09e93ead56c0d0cc8feffde23605abb710553b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong pubkey offset\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_calldata_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n calldatacopy(headStart, value0, 128)\n mstore(tail, 0)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n copy_memory_to_memory(add(value1, 32), add(headStart, 96), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n let length_1 := mload(value1)\n copy_memory_to_memory(add(value1, 0x20), end_1, length_1)\n end := add(end_1, length_1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"14924":[{"length":32,"start":81},{"length":32,"start":432},{"length":32,"start":721}]},"linkReferences":{},"object":"60806040523480156200001157600080fd5b5060043610620000465760003560e01c806311464fbe146200004b57806319c2a1b2146200009c578063de3398dd14620000b3575b600080fd5b620000737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b62000073620000ad3660046200042c565b620000ca565b62000073620000c436600462000490565b6200029f565b600081620000da60803662000522565b811462000147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67207075626b6579206f666673657400000000000000000000000000604482015260640160405180910390fd5b60006200017e858560048060200260405190810160405280929190826004602002808284376000920191909152506200029f915050565b905073ffffffffffffffffffffffffffffffffffffffff81163b8015620001aa57509150620002999050565b8560001b7f000000000000000000000000000000000000000000000000000000000000000086604051602401620001e2919062000561565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f36000000000000000000000000000000000000000000000000000000001790525162000264906200041e565b62000271929190620005a7565b8190604051809103906000f590508015801562000292573d6000803e3d6000fd5b5093505050505b92915050565b6000620003e48360001b60405180602001620002bb906200041e565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008560405160240162000303919062000617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f360000000000000000000000000000000000000000000000000000000017905290516200038a93929101620005a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620003c892916020016200064a565b60405160208183030381529060405280519060200120620003eb565b9392505050565b6000620003e48383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806200067e83390190565b60008060a083850312156200044057600080fd5b823591508360a0840111156200045557600080fd5b50926020919091019150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060a08385031215620004a457600080fd5b82359150602084603f850112620004ba57600080fd5b6040516080810181811067ffffffffffffffff82111715620004e057620004e062000461565b6040528060a0860187811115620004f657600080fd5b8387015b81811015620005135780358352918401918401620004fa565b50505080925050509250929050565b6000828210156200055c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b6080818101908383376000815292915050565b60005b838110156200059157818101518382015260200162000577565b83811115620005a1576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152620005e481606085016020870162000574565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60808101818360005b60048110156200064157815183526020928301929091019060010162000620565b50505092915050565b600083516200065e81846020880162000574565b8351908301906200067481836020880162000574565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122049efa79244350d13218ae7e1c2d6686117b1b9bd2f5ebd965dfe07d1631c48cb64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH3 0x46 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH3 0x4B JUMPI DUP1 PUSH4 0x19C2A1B2 EQ PUSH3 0x9C JUMPI DUP1 PUSH4 0xDE3398DD EQ PUSH3 0xB3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x73 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH3 0x73 PUSH3 0xAD CALLDATASIZE PUSH1 0x4 PUSH3 0x42C JUMP JUMPDEST PUSH3 0xCA JUMP JUMPDEST PUSH3 0x73 PUSH3 0xC4 CALLDATASIZE PUSH1 0x4 PUSH3 0x490 JUMP JUMPDEST PUSH3 0x29F JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH3 0xDA PUSH1 0x80 CALLDATASIZE PUSH3 0x522 JUMP JUMPDEST DUP2 EQ PUSH3 0x147 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67207075626B6579206F666673657400000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP6 DUP6 PUSH1 0x4 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH3 0x29F SWAP2 POP POP JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH3 0x1AA JUMPI POP SWAP2 POP PUSH3 0x299 SWAP1 POP JUMP JUMPDEST DUP6 PUSH1 0x0 SHL PUSH32 0x0 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0x1E2 SWAP2 SWAP1 PUSH3 0x561 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH3 0x264 SWAP1 PUSH3 0x41E JUMP JUMPDEST PUSH3 0x271 SWAP3 SWAP2 SWAP1 PUSH3 0x5A7 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH3 0x292 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 POP POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3E4 DUP4 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH3 0x2BB SWAP1 PUSH3 0x41E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND PUSH1 0x40 MSTORE POP PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0x303 SWAP2 SWAP1 PUSH3 0x617 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH3 0x38A SWAP4 SWAP3 SWAP2 ADD PUSH3 0x5A7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH3 0x3C8 SWAP3 SWAP2 PUSH1 0x20 ADD PUSH3 0x64A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH3 0x3EB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3E4 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH3 0x67E DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP DUP4 PUSH1 0xA0 DUP5 ADD GT ISZERO PUSH3 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP3 PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x4A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP5 PUSH1 0x3F DUP6 ADD SLT PUSH3 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x4E0 JUMPI PUSH3 0x4E0 PUSH3 0x461 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0xA0 DUP7 ADD DUP8 DUP2 GT ISZERO PUSH3 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP8 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x513 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE SWAP2 DUP5 ADD SWAP2 DUP5 ADD PUSH3 0x4FA JUMP JUMPDEST POP POP POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH3 0x55C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD SWAP1 DUP4 DUP4 CALLDATACOPY PUSH1 0x0 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x591 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x577 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x5A1 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH3 0x5E4 DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH3 0x574 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH3 0x641 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH3 0x620 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH3 0x65E DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH3 0x574 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH3 0x674 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH3 0x574 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x7066735822122049EFA7 SWAP3 DIFFICULTY CALLDATALOAD 0xD SGT 0x21 DUP11 0xE7 0xE1 0xC2 0xD6 PUSH9 0x6117B1B9BD2F5EBD96 0x5D INVALID SMOD 0xD1 PUSH4 0x1C48CB64 PUSH20 0x6F6C634300080F00330000000000000000000000 ","sourceMap":"477:1968:78:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;510:49;;;;;;;;218:42:111;206:55;;;188:74;;176:2;161:18;510:49:78;;;;;;;1180:720;;;;;;:::i;:::-;;:::i;2025:418::-;;;;;;:::i;:::-;;:::i;1180:720::-;1265:10;1427;1463:21;1481:3;1463:8;:21;:::i;:::-;1455:4;:29;1447:61;;;;;;;2354:2:111;1447:61:78;;;2336:21:111;2393:2;2373:18;;;2366:30;2432:21;2412:18;;;2405:49;2471:18;;1447:61:78;;;;;;;;1519:12;1534:28;1545:4;1551:10;1534:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1534:10:78;;-1:-1:-1;;1534:28:78:i;:::-;1519:43;-1:-1:-1;1588:16:78;;;;1618:12;;1614:75;;-1:-1:-1;1672:4:78;-1:-1:-1;1646:32:78;;-1:-1:-1;1646:32:78;1614:75;1756:4;1748:13;;1788:21;1866:10;1828:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1724:167;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1698:195;;;;;1180:720;;;;;:::o;2025:418::-;2110:7;2136:300;2167:4;2159:13;;2218:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2307:21;2390:10;2351:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;2267:153;;;;;2351:51;2267:153;;:::i;:::-;;;;;;;;;;;;;;;2184:250;;;2267:153;2184:250;;:::i;:::-;;;;;;;;;;;;;2174:261;;;;;;2136:22;:300::i;:::-;2129:307;2025:418;-1:-1:-1;;;2025:418:78:o;1799:165:44:-;1882:7;1908:49;1923:4;1929:12;1951:4;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:44:o;-1:-1:-1:-;;;;;;;;:::o;273:321:111:-;366:6;374;427:3;415:9;406:7;402:23;398:33;395:53;;;444:1;441;434:12;395:53;480:9;467:23;457:33;;526:7;520:3;509:9;505:19;502:32;499:52;;;547:1;544;537:12;499:52;-1:-1:-1;273:321:111;585:2;570:18;;;;;-1:-1:-1;273:321:111:o;599:184::-;651:77;648:1;641:88;748:4;745:1;738:15;772:4;769:1;762:15;788:844;879:6;887;940:3;928:9;919:7;915:23;911:33;908:53;;;957:1;954;947:12;908:53;993:9;980:23;970:33;;1022:2;1067:7;1062:2;1051:9;1047:18;1043:32;1033:60;;1089:1;1086;1079:12;1033:60;1122:2;1116:9;1164:3;1156:6;1152:16;1234:6;1222:10;1219:22;1198:18;1186:10;1183:34;1180:62;1177:88;;;1245:18;;:::i;:::-;1281:2;1274:22;1316:6;1360:3;1345:19;;1376;;;1373:39;;;1408:1;1405;1398:12;1373:39;1447:2;1436:9;1432:18;1459:142;1475:6;1470:3;1467:15;1459:142;;;1541:17;;1529:30;;1579:12;;;;1492;;1459:142;;;1463:3;;;1620:6;1610:16;;;;788:844;;;;;:::o;1868:279::-;1908:4;1936:1;1933;1930:8;1927:188;;;1971:77;1968:1;1961:88;2072:4;2069:1;2062:15;2100:4;2097:1;2090:15;1927:188;-1:-1:-1;2132:9:111;;1868:279::o;2500:261::-;2682:3;2667:19;;;;2719:6;2671:9;2695:36;2753:1;2747:4;2740:15;2500:261;;;;:::o;2766:258::-;2838:1;2848:113;2862:6;2859:1;2856:13;2848:113;;;2938:11;;;2932:18;2919:11;;;2912:39;2884:2;2877:10;2848:113;;;2979:6;2976:1;2973:13;2970:48;;;3014:1;3005:6;3000:3;2996:16;2989:27;2970:48;;2766:258;;;:::o;3029:560::-;3216:42;3208:6;3204:55;3193:9;3186:74;3296:2;3291;3280:9;3276:18;3269:30;3167:4;3328:6;3322:13;3371:6;3366:2;3355:9;3351:18;3344:34;3387:66;3446:6;3441:2;3430:9;3426:18;3421:2;3413:6;3409:15;3387:66;:::i;:::-;3505:2;3493:15;3510:66;3489:88;3474:104;;;;3580:2;3470:113;;3029:560;-1:-1:-1;;;3029:560:111:o;3594:495::-;3774:3;3759:19;;3763:9;3855:6;3732:4;3889:194;3903:4;3900:1;3897:11;3889:194;;;3962:13;;3950:26;;3999:4;4023:12;;;;4058:15;;;;3923:1;3916:9;3889:194;;;3893:3;;;3594:495;;;;:::o;4094:466::-;4269:3;4307:6;4301:13;4323:53;4369:6;4364:3;4357:4;4349:6;4345:17;4323:53;:::i;:::-;4439:13;;4398:16;;;;4461:57;4439:13;4398:16;4495:4;4483:17;;4461:57;:::i;:::-;4534:20;;4094:466;-1:-1:-1;;;;4094:466:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"740000","executionCost":"infinite","totalCost":"infinite"},"external":{"accountImplementation()":"infinite","createAccount(uint256,uint256[4])":"infinite","getAddress(uint256,uint256[4])":"infinite"}},"methodIdentifiers":{"accountImplementation()":"11464fbe","createAccount(uint256,uint256[4])":"19c2a1b2","getAddress(uint256,uint256[4])":"de3398dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplementation\",\"outputs\":[{\"internalType\":\"contract BLSAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract BLSAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(uint256,uint256[4])\":{\"notice\":\"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation Also note that our BLSSignatureAggregator requires that the public key is the last parameter\"},\"getAddress(uint256,uint256[4])\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"Based on SimpleAccountFactory. Cannot be a subclass since both constructor and createAccount depend on the constructor and initializer of the actual account contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/BLSAccountFactory.sol\":\"BLSAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/BLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../SimpleAccount.sol\\\";\\nimport \\\"./IBLSAccount.sol\\\";\\n\\n/**\\n * Minimal BLS-based account that uses an aggregated signature.\\n * The account must maintain its own BLS public key, and expose its trusted signature aggregator.\\n * Note that unlike the \\\"standard\\\" SimpleAccount, this account can't be called directly\\n * (normal SimpleAccount uses its \\\"signer\\\" address as both the ecrecover signer, and as a legitimate\\n * Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)\\n */\\ncontract BLSAccount is SimpleAccount, IBLSAccount {\\n address public immutable aggregator;\\n uint256[4] private publicKey;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n /**\\n * The initializer for the BLSAccount instance.\\n * @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\\n */\\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\\n super._initialize(address(0));\\n _setBlsPublicKey(aPublicKey);\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n\\n (userOp, userOpHash);\\n if (userOp.initCode.length != 0) {\\n // BLSSignatureAggregator.getUserOpPublicKey() assumes that during account creation, the public key is\\n // the suffix of the initCode.\\n // The account MUST validate it\\n bytes32 pubKeyHash = keccak256(abi.encode(getBlsPublicKey()));\\n require(keccak256(userOp.initCode[userOp.initCode.length - 128 :]) == pubKeyHash, \\\"wrong pubkey\\\");\\n }\\n return _packValidationData(ValidationData(aggregator, 0,0));\\n }\\n\\n /**\\n * Allows the owner to set or change the BLS key.\\n * @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\\n */\\n function setBlsPublicKey(uint256[4] memory newPublicKey) public onlyOwner {\\n _setBlsPublicKey(newPublicKey);\\n }\\n\\n function _setBlsPublicKey(uint256[4] memory newPublicKey) internal {\\n emit PublicKeyChanged(publicKey, newPublicKey);\\n publicKey = newPublicKey;\\n }\\n\\n /// @inheritdoc IBLSAccount\\n function getBlsPublicKey() public override view returns (uint256[4] memory) {\\n return publicKey;\\n }\\n}\\n\",\"keccak256\":\"0xed761f08bf5f6b1aeb36792267ceea916e5adb9ca3a5e6110299481e50635add\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/BLSAccountFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"../../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./BLSAccount.sol\\\";\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * Based on SimpleAccountFactory.\\n * Cannot be a subclass since both constructor and createAccount depend on the\\n * constructor and initializer of the actual account contract.\\n */\\ncontract BLSAccountFactory {\\n BLSAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint entryPoint, address aggregator){\\n accountImplementation = new BLSAccount(entryPoint, aggregator);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n * Also note that our BLSSignatureAggregator requires that the public key is the last parameter\\n */\\n function createAccount(uint256 salt, uint256[4] calldata aPublicKey) public returns (BLSAccount) {\\n\\n // the BLSSignatureAggregator depends on the public-key being the last 4 uint256 of msg.data.\\n uint slot;\\n assembly {slot := aPublicKey}\\n require(slot == msg.data.length - 128, \\\"wrong pubkey offset\\\");\\n\\n address addr = getAddress(salt, aPublicKey);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return BLSAccount(payable(addr));\\n }\\n return BLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(BLSAccount.initialize, aPublicKey)\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(uint256 salt, uint256[4] memory aPublicKey) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(BLSAccount.initialize, (aPublicKey))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0x31acc62fdc72f24ef61ce5b049568b4032acb7cf54c49c7b73fb866a6a6bc403\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"createAccount(uint256,uint256[4])":{"notice":"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation Also note that our BLSSignatureAggregator requires that the public key is the last parameter"},"getAddress(uint256,uint256[4])":{"notice":"calculate the counterfactual address of this account as it would be returned by createAccount()"}},"notice":"Based on SimpleAccountFactory. Cannot be a subclass since both constructor and createAccount depend on the constructor and initializer of the actual account contract.","version":1}}},"contracts/samples/bls/BLSHelper.sol":{"BLSHelper":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bfa7182e92273fd463b17827280c13648b9c855066d2e70d0ea5641670cd2aa464736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF 0xA7 XOR 0x2E SWAP3 0x27 EXTCODEHASH 0xD4 PUSH4 0xB1782728 0xC SGT PUSH5 0x8B9C855066 0xD2 0xE7 0xD 0xE 0xA5 PUSH5 0x1670CD2AA4 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"245:7241:79:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;245:7241:79;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bfa7182e92273fd463b17827280c13648b9c855066d2e70d0ea5641670cd2aa464736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF 0xA7 XOR 0x2E SWAP3 0x27 EXTCODEHASH 0xD4 PUSH4 0xB1782728 0xC SGT PUSH5 0x8B9C855066 0xD2 0xE7 0xD 0xE 0xA5 PUSH5 0x1670CD2AA4 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"245:7241:79:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)":"infinite","invMod(uint256,uint256)":"infinite","jacAdd(uint256,uint256,uint256,uint256,uint256,uint256,uint256)":"infinite","jacDouble(uint256,uint256,uint256,uint256,uint256)":"infinite","sum(struct BLSHelper.XY memory[] memory,uint256)":"infinite","toAffine(uint256,uint256,uint256,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/BLSHelper.sol\":\"BLSHelper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/BLSHelper.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n// code taken from : https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\\n// missing core functions from \\\"thehubbleproject/bls\\\": jacAdd (and sum)\\nlibrary BLSHelper {\\n\\n struct XY {\\n uint x;\\n uint y;\\n }\\n /**\\n * sum all the points in the array\\n * NOTE: the \\\"ecAdd\\\" (below) has a special case where x1==y2.\\n * @param points an array of bytes32[2], representing an (x,y) of a point\\n * @param _pp the modulus of the curve\\n * @return ret the sum of all points\\n */\\n function sum(XY[] memory points, uint256 _pp) internal pure returns (XY memory ret){\\n uint x = points[0].x;\\n uint y = points[0].y;\\n uint z = 1;\\n\\n for (uint i = 1; i < points.length; i++) {\\n (x, y, z) = jacAdd(x, y, z, points[i].x, points[i].y, 1, _pp);\\n }\\n (x, y) = toAffine(x, y, z, _pp);\\n ret.x = x;\\n ret.y = y;\\n }\\n\\n /// @dev Adds two points (x1, y1, z1) and (x2, y2, z2).\\n /// @param _x1 coordinate x of P1\\n /// @param _y1 coordinate y of P1\\n /// @param _z1 coordinate z of P1\\n /// @param _x2 coordinate x of square\\n /// @param _y2 coordinate y of square\\n /// @param _z2 coordinate z of square\\n /// @param _pp the modulus\\n /// @return (qx, qy, qz) P1+square in Jacobian\\n function jacAdd(\\n uint256 _x1,\\n uint256 _y1,\\n uint256 _z1,\\n uint256 _x2,\\n uint256 _y2,\\n uint256 _z2,\\n uint256 _pp)\\n internal pure returns (uint256, uint256, uint256)\\n {\\n if (_x1 == 0 && _y1 == 0)\\n return (_x2, _y2, _z2);\\n if (_x2 == 0 && _y2 == 0)\\n return (_x1, _y1, _z1);\\n\\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\\n uint[4] memory zs;\\n // z1^2, z1^3, z2^2, z2^3\\n zs[0] = mulmod(_z1, _z1, _pp);\\n zs[1] = mulmod(_z1, zs[0], _pp);\\n zs[2] = mulmod(_z2, _z2, _pp);\\n zs[3] = mulmod(_z2, zs[2], _pp);\\n\\n // u1, s1, u2, s2\\n zs = [\\n mulmod(_x1, zs[2], _pp),\\n mulmod(_y1, zs[3], _pp),\\n mulmod(_x2, zs[0], _pp),\\n mulmod(_y2, zs[1], _pp)\\n ];\\n\\n // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used\\n require(zs[0] != zs[2] || zs[1] != zs[3], \\\"Use jacDouble function instead\\\");\\n\\n uint[4] memory hr;\\n //h\\n hr[0] = addmod(zs[2], _pp - zs[0], _pp);\\n //r\\n hr[1] = addmod(zs[3], _pp - zs[1], _pp);\\n //h^2\\n hr[2] = mulmod(hr[0], hr[0], _pp);\\n // h^3\\n hr[3] = mulmod(hr[2], hr[0], _pp);\\n // qx = -h^3 -2u1h^2+r^2\\n uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\\n qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\\n // qy = -s1*z1*h^3+r(u1*h^2 -x^3)\\n uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\\n qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\\n // qz = h*z1*z2\\n uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\\n return (qx, qy, qz);\\n }\\n\\n\\n /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\\n /// @param _x coordinate x\\n /// @param _y coordinate y\\n /// @param _z coordinate z\\n /// @param _pp the modulus\\n /// @return (x', y') affine coordinates\\n function toAffine(\\n uint256 _x,\\n uint256 _y,\\n uint256 _z,\\n uint256 _pp)\\n internal pure returns (uint256, uint256)\\n {\\n uint256 zInv = invMod(_z, _pp);\\n uint256 zInv2 = mulmod(zInv, zInv, _pp);\\n uint256 x2 = mulmod(_x, zInv2, _pp);\\n uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\\n\\n return (x2, y2);\\n }\\n\\n\\n /// @dev Modular euclidean inverse of a number (mod p).\\n /// @param _x The number\\n /// @param _pp The modulus\\n /// @return q such that x*q = 1 (mod _pp)\\n function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\\n require(_x != 0 && _x != _pp && _pp != 0, \\\"Invalid number\\\");\\n uint256 q = 0;\\n uint256 newT = 1;\\n uint256 r = _pp;\\n uint256 t;\\n while (_x != 0) {\\n t = r / _x;\\n (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\\n (r, _x) = (_x, r - t * _x);\\n }\\n\\n return q;\\n }\\n\\n /// @dev Doubles a point (x, y, z).\\n /// @param _x coordinate x of P1\\n /// @param _y coordinate y of P1\\n /// @param _z coordinate z of P1\\n /// @param _aa the a scalar in the curve equation\\n /// @param _pp the modulus\\n /// @return (qx, qy, qz) 2P in Jacobian\\n function jacDouble(\\n uint256 _x,\\n uint256 _y,\\n uint256 _z,\\n uint256 _aa,\\n uint256 _pp)\\n internal pure returns (uint256, uint256, uint256)\\n {\\n if (_z == 0)\\n return (_x, _y, _z);\\n\\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\\n // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4)\\n // x, y, z at this point represent the squares of _x, _y, _z\\n uint256 x = mulmod(_x, _x, _pp); //x1^2\\n uint256 y = mulmod(_y, _y, _pp); //y1^2\\n uint256 z = mulmod(_z, _z, _pp); //z1^2\\n\\n // s\\n uint s = mulmod(4, mulmod(_x, y, _pp), _pp);\\n // m\\n uint m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\\n\\n // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper\\n // This allows to reduce the gas cost and stack footprint of the algorithm\\n // qx\\n x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\\n // qy = -8*y1^4 + M(S-T)\\n y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\\n // qz = 2*y1*z1\\n z = mulmod(2, mulmod(_y, _z, _pp), _pp);\\n\\n return (x, y, z);\\n }\\n\\n /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\\n /// @param _x1 coordinate x of P1\\n /// @param _y1 coordinate y of P1\\n /// @param _x2 coordinate x of P2\\n /// @param _y2 coordinate y of P2\\n /// @param _aa constant of the curve\\n /// @param _pp the modulus\\n /// @return (qx, qy) = P1+P2 in affine coordinates\\n function ecAdd(\\n uint256 _x1,\\n uint256 _y1,\\n uint256 _x2,\\n uint256 _y2,\\n uint256 _aa,\\n uint256 _pp)\\n internal pure returns (uint256, uint256)\\n {\\n uint x = 0;\\n uint y = 0;\\n uint z = 0;\\n\\n // Double if x1==x2 else add\\n if (_x1 == _x2) {\\n // y1 = -y2 mod p\\n if (addmod(_y1, _y2, _pp) == 0) {\\n return (0, 0);\\n } else {\\n // P1 = P2\\n (x, y, z) = jacDouble(\\n _x1,\\n _y1,\\n 1,\\n _aa,\\n _pp);\\n }\\n } else {\\n (x, y, z) = jacAdd(\\n _x1,\\n _y1,\\n 1,\\n _x2,\\n _y2,\\n 1,\\n _pp);\\n }\\n // Get back to affine\\n return toAffine(\\n x,\\n y,\\n z,\\n _pp);\\n }\\n\\n}\\n\",\"keccak256\":\"0x852546b7e887230f569fa4b8c30dcd0927f8a068c61f72b2180b03102a173911\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/samples/bls/BLSSignatureAggregator.sol":{"BLSSignatureAggregator":{"abi":[{"inputs":[],"name":"BLS_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"internalType":"uint32","name":"delay","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getTrailingPublicKey","outputs":[{"internalType":"uint256[4]","name":"publicKey","type":"uint256[4]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpPublicKey","outputs":[{"internalType":"uint256[4]","name":"publicKey","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"userOpToMessage","outputs":[{"internalType":"uint256[2]","name":"","type":"uint256[2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"sigForUserOp","type":"bytes"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"params":{"userOps":"array of UserOperations to collect the signatures from."},"returns":{"aggregatedSignature":"the aggregated signature"}},"getUserOpPublicKey((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"returns":{"publicKey":"- the public key from a BLS keypair the Aggregator will use to verify this UserOp; normally public key will be queried from the deployed BLSAccount itself; the public key will be read from the 'initCode' if the account is not deployed yet;"}},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"params":{"userOp":"the userOperation received from the user."},"returns":{"sigForUserOp":"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \"multisig\""}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{"contracts/samples/bls/lib/BLSOpen.sol":{"BLSOpen":[{"length":20,"start":1446},{"length":20,"start":2484},{"length":20,"start":3012}]}},"object":"608060405234801561001057600080fd5b50611c6f806100206000396000f3fe6080604052600436106100b05760003560e01c806364c530cd11610069578063b7620eb41161004e578063b7620eb4146101d8578063c9e525df146101f8578063e3563a4f1461022c57600080fd5b806364c530cd14610198578063a6193531146101b857600080fd5b8063408644311161009a5780634086443114610129578063451711591461015657806357f09b721461016b57600080fd5b80629d9250146100b5578063275e2d79146100fc575b600080fd5b3480156100c157600080fd5b506100e97fd84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b81565b6040519081526020015b60405180910390f35b34801561010857600080fd5b5061011c610117366004611296565b61024c565b6040516100f39190611343565b34801561013557600080fd5b506101496101443660046115c0565b6103b4565b6040516100f391906115f5565b610169610164366004611626565b6103e2565b005b34801561017757600080fd5b5061018b6101863660046115c0565b61046d565b6040516100f39190611668565b3480156101a457600080fd5b5061011c6101b3366004611690565b61050e565b3480156101c457600080fd5b506100e96101d33660046115c0565b610676565b3480156101e457600080fd5b5061018b6101f33660046116cc565b610691565b34801561020457600080fd5b506100e97f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781565b34801561023857600080fd5b50610169610247366004611701565b610789565b606060008267ffffffffffffffff81111561026957610269611356565b6040519080825280602002602001820160405280156102ae57816020015b60408051808201909152600080825260208201528152602001906001900390816102875790505b50905060005b815181101561034b576000808686848181106102d2576102d2611798565b90506020028101906102e491906117c7565b6102f390610140810190611805565b810190610300919061186a565b9150915060405180604001604052808381526020018281525084848151811061032b5761032b611798565b602002602001018190525050508080610343906118bb565b9150506102b4565b506000610378827f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47610a71565b805160208083015160405193945061039b93909101918252602082015260400190565b6040516020818303038152906040529250505092915050565b6103bc61120e565b60006103cf6103ca8461046d565b610b5c565b90506103db8382610b8c565b9392505050565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015273ffffffffffffffffffffffffffffffffffffffff831690630396cb609034906024016000604051808303818588803b15801561045057600080fd5b505af1158015610464573d6000803e3d6000fd5b50505050505050565b61047561122c565b60408201518051156104915761048a81610691565b9150610508565b826000015173ffffffffffffffffffffffffffffffffffffffff1663e02afbae61c3506040518263ffffffff1660e01b81526004016080604051808303818786fa1580156104e3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906103db91906118f3565b50919050565b60606000610520610140840184611805565b81019061052d9190611966565b9050600061053d610186856119c6565b9050600061055b61054d866119c6565b61055684610b5c565b610b8c565b6040517febbdac9100000000000000000000000000000000000000000000000000000000815290915073__$b745eded4b1aee1100521038d570dd85f1$__9063ebbdac91906105b290869086908690600401611a24565b602060405180830381865af41580156105cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f39190611a4d565b61065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f424c533a2077726f6e672073696700000000000000000000000000000000000060448201526064015b60405180910390fd5b50506040805160208101909152600081529392505050565b6000806106856103ca8461046d565b90506103db8382610c64565b61069961122c565b815160808111610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6461746120746f6f2073686f727420666f7220736967000000000000000000006044820152606401610655565b9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa081015182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081015160208301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810151604083015251606082015290565b604081146107f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f424c533a20696e76616c6964207369676e6174757265000000000000000000006044820152606401610655565b600061080182840184611966565b90508360008167ffffffffffffffff81111561081f5761081f611356565b60405190808252806020026020018201604052801561085857816020015b61084561122c565b81526020019060019003908161083d5790505b50905060008267ffffffffffffffff81111561087657610876611356565b6040519080825280602002602001820160405280156108af57816020015b61089c61120e565b8152602001906001900390816108945790505b50905060005b8381101561096b5760008989838181106108d1576108d1611798565b90506020028101906108e391906117c7565b6108ec906119c6565b90506108f78161046d565b84838151811061090957610909611798565b602002602001018190525061093a8161055686858151811061092d5761092d611798565b6020026020010151610b5c565b83838151811061094c5761094c611798565b6020026020010181905250508080610963906118bb565b9150506108b5565b506040517f9141376300000000000000000000000000000000000000000000000000000000815273__$b745eded4b1aee1100521038d570dd85f1$__906391413763906109c090879086908690600401611a6f565b602060405180830381865af41580156109dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a019190611a4d565b610a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f424c533a2076616c69646174655369676e617475726573206661696c656400006044820152606401610655565b5050505050505050565b6040805180820190915260008082526020820152600083600081518110610a9a57610a9a611798565b6020026020010151600001519050600084600081518110610abd57610abd611798565b602090810291909101810151015190506001805b8651811015610b3d57610b248484848a8581518110610af257610af2611798565b6020026020010151600001518b8681518110610b1057610b10611798565b60200260200101516020015160018c610cad565b9195509350915080610b35816118bb565b915050610ad1565b50610b4a83838388610ffa565b90855260208501525091949350505050565b600081604051602001610b6f9190611668565b604051602081830303815290604052805190602001209050919050565b610b9461120e565b6000610ba08484610c64565b905073__$b745eded4b1aee1100521038d570dd85f1$__63a850a9097fd84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b83604051602001610bf091815260200190565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c1c929190611b0d565b6040805180830381865af4158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190611b26565b949350505050565b6000610c6f83611069565b604080516020810192909252810183905230606082015246608082015260a00160405160208183030381529060405280519060200120905092915050565b6000808089158015610cbd575088155b15610ccf575085915084905083610fed565b86158015610cdb575085155b15610ced575088915087905086610fed565b610cf561122c565b8480610d0357610d03611b7b565b898a0981528480610d1657610d16611b7b565b81518a0960208201528480610d2d57610d2d611b7b565b86870960408201528480610d4357610d43611b7b565b6040820151870960608201526040805160808101909152808680610d6957610d69611b7b565b60408401518e0981526020018680610d8357610d83611b7b565b60608401518d0981526020018680610d9d57610d9d611b7b565b83518b0981526020018680610db457610db4611b7b565b60208401518a09905260408101518151919250141580610ddc57506060810151602082015114155b610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f557365206a6163446f75626c652066756e6374696f6e20696e737465616400006044820152606401610655565b610e4a61122c565b8580610e5857610e58611b7b565b8251610e649088611baa565b60408401510881528580610e7a57610e7a611b7b565b6020830151610e899088611baa565b60608401510860208201528580610ea257610ea2611b7b565b8151800960408201528580610eb957610eb9611b7b565b8151604083015109606082015260008680610ed657610ed6611b7b565b6060830151610ee59089611baa565b8880610ef357610ef3611b7b565b602085015180090890508680610f0b57610f0b611b7b565b8780610f1957610f19611b7b565b8880610f2757610f27611b7b565b6040850151865109600209610f3c9089611baa565b8208905060008780610f5057610f50611b7b565b8880610f5e57610f5e611b7b565b610f68848b611baa565b8a80610f7657610f76611b7b565b60408701518851090860208501510990508780610f9557610f95611b7b565b8880610fa357610fa3611b7b565b6060850151602087015109610fb8908a611baa565b8208905060008880610fcc57610fcc611b7b565b8980610fda57610fda611b7b565b8b8f098551099297509095509093505050505b9750975097945050505050565b60008060006110098585611119565b90506000848061101b5761101b611b7b565b82830990506000858061103057611030611b7b565b828a0990506000868061104557611045611b7b565b878061105357611053611b7b565b8486098a09919a91995090975050505050505050565b80516020808301516040808501518051908401206060860151805190850120608087015160a088015160c089015160e08a01516101008b01516101208c01518051908b0120975160009b610b6f9b909a99910173ffffffffffffffffffffffffffffffffffffffff9a909a168a5260208a019890985260408901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201526101400190565b6000821580159061112a5750818314155b801561113557508115155b61119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c6964206e756d6265720000000000000000000000000000000000006044820152606401610655565b6000600183825b8615611203576111b28783611bc1565b90508286806111c3576111c3611b7b565b87806111d1576111d1611b7b565b8584096111de9089611baa565b86089094509250866111f08183611bfc565b6111fa9084611baa565b975091506111a2565b509195945050505050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60008083601f84011261125c57600080fd5b50813567ffffffffffffffff81111561127457600080fd5b6020830191508360208260051b850101111561128f57600080fd5b9250929050565b600080602083850312156112a957600080fd5b823567ffffffffffffffff8111156112c057600080fd5b6112cc8582860161124a565b90969095509350505050565b6000815180845260005b818110156112fe576020818501810151868301820152016112e2565b81811115611310576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103db60208301846112d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156113a9576113a9611356565b60405290565b6040805190810167ffffffffffffffff811182821017156113a9576113a9611356565b73ffffffffffffffffffffffffffffffffffffffff811681146113f457600080fd5b50565b8035611402816113d2565b919050565b600082601f83011261141857600080fd5b813567ffffffffffffffff8082111561143357611433611356565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561147957611479611356565b8160405283815286602085880101111561149257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082840312156114c557600080fd5b6114cd611385565b90506114d8826113f7565b815260208201356020820152604082013567ffffffffffffffff808211156114ff57600080fd5b61150b85838601611407565b6040840152606084013591508082111561152457600080fd5b61153085838601611407565b60608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e0840152610100915081840135828401526101209150818401358181111561158057600080fd5b61158c86828701611407565b8385015250610140915081840135818111156115a757600080fd5b6115b386828701611407565b8385015250505092915050565b6000602082840312156115d257600080fd5b813567ffffffffffffffff8111156115e957600080fd5b610c5c848285016114b2565b60408101818360005b600281101561161d5781518352602092830192909101906001016115fe565b50505092915050565b6000806040838503121561163957600080fd5b8235611644816113d2565b9150602083013563ffffffff8116811461165d57600080fd5b809150509250929050565b60808101818360005b600481101561161d578151835260209283019290910190600101611671565b6000602082840312156116a257600080fd5b813567ffffffffffffffff8111156116b957600080fd5b820161016081850312156103db57600080fd5b6000602082840312156116de57600080fd5b813567ffffffffffffffff8111156116f557600080fd5b610c5c84828501611407565b6000806000806040858703121561171757600080fd5b843567ffffffffffffffff8082111561172f57600080fd5b61173b8883890161124a565b9096509450602087013591508082111561175457600080fd5b818701915087601f83011261176857600080fd5b81358181111561177757600080fd5b88602082850101111561178957600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18336030181126117fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261183a57600080fd5b83018035915067ffffffffffffffff82111561185557600080fd5b60200191503681900382131561128f57600080fd5b6000806040838503121561187d57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118ec576118ec61188c565b5060010190565b60006080828403121561190557600080fd5b82601f83011261191457600080fd5b6040516080810181811067ffffffffffffffff8211171561193757611937611356565b60405280608084018581111561194c57600080fd5b845b8181101561120357805183526020928301920161194e565b60006040828403121561197857600080fd5b82601f83011261198757600080fd5b61198f6113af565b8060408401858111156119a157600080fd5b845b818110156119bb5780358452602093840193016119a3565b509095945050505050565b60006119d236836114b2565b92915050565b8060005b60028110156119fb5781518452602093840193909101906001016119dc565b50505050565b8060005b60048110156119fb578151845260209384019390910190600101611a05565b6101008101611a3382866119d8565b611a406040830185611a01565b610c5c60c08301846119d8565b600060208284031215611a5f57600080fd5b815180151581146103db57600080fd5b60006080808301611a8084886119d8565b604084810183905286519182905260209160a086019083890160005b82811015611abf57611aaf848351611a01565b9286019290850190600101611a9c565b5050508581036060870152865180825290830193508287019060005b81811015611afe57611aee8684516119d8565b9483019491840191600101611adb565b50939998505050505050505050565b828152604060208201526000610c5c60408301846112d8565b600060408284031215611b3857600080fd5b82601f830112611b4757600080fd5b611b4f6113af565b806040840185811115611b6157600080fd5b845b818110156119bb578051845260209384019301611b63565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082821015611bbc57611bbc61188c565b500390565b600082611bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611c3457611c3461188c565b50029056fea2646970667358221220d251a0972698130c32f94cc0035c478ec21179f1f269ef606b1b31aa559c232a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C6F DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB0 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x64C530CD GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xB7620EB4 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xB7620EB4 EQ PUSH2 0x1D8 JUMPI DUP1 PUSH4 0xC9E525DF EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0xE3563A4F EQ PUSH2 0x22C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x64C530CD EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x40864431 GT PUSH2 0x9A JUMPI DUP1 PUSH4 0x40864431 EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x45171159 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x57F09B72 EQ PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x9D9250 EQ PUSH2 0xB5 JUMPI DUP1 PUSH4 0x275E2D79 EQ PUSH2 0xFC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH32 0xD84C4373167C517E9CCD66803F86D8A4F49E7E1315A7A73B516AFFEA7428F82B DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH2 0x117 CALLDATASIZE PUSH1 0x4 PUSH2 0x1296 JUMP JUMPDEST PUSH2 0x24C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x1343 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x135 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x149 PUSH2 0x144 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x3B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x15F5 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x164 CALLDATASIZE PUSH1 0x4 PUSH2 0x1626 JUMP JUMPDEST PUSH2 0x3E2 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18B PUSH2 0x186 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x1668 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1690 JUMP JUMPDEST PUSH2 0x50E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18B PUSH2 0x1F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x16CC JUMP JUMPDEST PUSH2 0x691 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x238 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x169 PUSH2 0x247 CALLDATASIZE PUSH1 0x4 PUSH2 0x1701 JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x269 JUMPI PUSH2 0x269 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2AE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x287 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x2D2 JUMPI PUSH2 0x2D2 PUSH2 0x1798 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x2E4 SWAP2 SWAP1 PUSH2 0x17C7 JUMP JUMPDEST PUSH2 0x2F3 SWAP1 PUSH2 0x140 DUP2 ADD SWAP1 PUSH2 0x1805 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x300 SWAP2 SWAP1 PUSH2 0x186A JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x32B JUMPI PUSH2 0x32B PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP DUP1 DUP1 PUSH2 0x343 SWAP1 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2B4 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x378 DUP3 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0xA71 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP5 POP PUSH2 0x39B SWAP4 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3BC PUSH2 0x120E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3CF PUSH2 0x3CA DUP5 PUSH2 0x46D JUMP JUMPDEST PUSH2 0xB5C JUMP JUMPDEST SWAP1 POP PUSH2 0x3DB DUP4 DUP3 PUSH2 0xB8C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x464 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x475 PUSH2 0x122C JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD ISZERO PUSH2 0x491 JUMPI PUSH2 0x48A DUP2 PUSH2 0x691 JUMP JUMPDEST SWAP2 POP PUSH2 0x508 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE02AFBAE PUSH2 0xC350 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4E3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DB SWAP2 SWAP1 PUSH2 0x18F3 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x520 PUSH2 0x140 DUP5 ADD DUP5 PUSH2 0x1805 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x52D SWAP2 SWAP1 PUSH2 0x1966 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x53D PUSH2 0x186 DUP6 PUSH2 0x19C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x55B PUSH2 0x54D DUP7 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x556 DUP5 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xB8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xEBBDAC9100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0x0 SWAP1 PUSH4 0xEBBDAC91 SWAP1 PUSH2 0x5B2 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1A24 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x5CF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5F3 SWAP2 SWAP1 PUSH2 0x1A4D JUMP JUMPDEST PUSH2 0x65E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A2077726F6E6720736967000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x685 PUSH2 0x3CA DUP5 PUSH2 0x46D JUMP JUMPDEST SWAP1 POP PUSH2 0x3DB DUP4 DUP3 PUSH2 0xC64 JUMP JUMPDEST PUSH2 0x699 PUSH2 0x122C JUMP JUMPDEST DUP2 MLOAD PUSH1 0x80 DUP2 GT PUSH2 0x705 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6461746120746F6F2073686F727420666F722073696700000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP2 ADD MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE MLOAD PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 EQ PUSH2 0x7F3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20696E76616C6964207369676E617475726500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x801 DUP3 DUP5 ADD DUP5 PUSH2 0x1966 JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x81F JUMPI PUSH2 0x81F PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x858 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x845 PUSH2 0x122C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x83D JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x876 JUMPI PUSH2 0x876 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x8AF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x89C PUSH2 0x120E JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x894 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x96B JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x8D1 JUMPI PUSH2 0x8D1 PUSH2 0x1798 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8E3 SWAP2 SWAP1 PUSH2 0x17C7 JUMP JUMPDEST PUSH2 0x8EC SWAP1 PUSH2 0x19C6 JUMP JUMPDEST SWAP1 POP PUSH2 0x8F7 DUP2 PUSH2 0x46D JUMP JUMPDEST DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x909 JUMPI PUSH2 0x909 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH2 0x93A DUP2 PUSH2 0x556 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x92D JUMPI PUSH2 0x92D PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0xB5C JUMP JUMPDEST DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x94C JUMPI PUSH2 0x94C PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP DUP1 DUP1 PUSH2 0x963 SWAP1 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x8B5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x9141376300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0x0 SWAP1 PUSH4 0x91413763 SWAP1 PUSH2 0x9C0 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1A6F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x9DD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA01 SWAP2 SWAP1 PUSH2 0x1A4D JUMP JUMPDEST PUSH2 0xA67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A2076616C69646174655369676E617475726573206661696C65640000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA9A JUMPI PUSH2 0xA9A PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xABD JUMPI PUSH2 0xABD PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD ADD MLOAD SWAP1 POP PUSH1 0x1 DUP1 JUMPDEST DUP7 MLOAD DUP2 LT ISZERO PUSH2 0xB3D JUMPI PUSH2 0xB24 DUP5 DUP5 DUP5 DUP11 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xAF2 JUMPI PUSH2 0xAF2 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0xB10 JUMPI PUSH2 0xB10 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0x1 DUP13 PUSH2 0xCAD JUMP JUMPDEST SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP DUP1 PUSH2 0xB35 DUP2 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0xAD1 JUMP JUMPDEST POP PUSH2 0xB4A DUP4 DUP4 DUP4 DUP9 PUSH2 0xFFA JUMP JUMPDEST SWAP1 DUP6 MSTORE PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xB6F SWAP2 SWAP1 PUSH2 0x1668 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xB94 PUSH2 0x120E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBA0 DUP5 DUP5 PUSH2 0xC64 JUMP JUMPDEST SWAP1 POP PUSH20 0x0 PUSH4 0xA850A909 PUSH32 0xD84C4373167C517E9CCD66803F86D8A4F49E7E1315A7A73B516AFFEA7428F82B DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xBF0 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC1C SWAP3 SWAP2 SWAP1 PUSH2 0x1B0D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xC38 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC5C SWAP2 SWAP1 PUSH2 0x1B26 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC6F DUP4 PUSH2 0x1069 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP2 ADD DUP4 SWAP1 MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP10 ISZERO DUP1 ISZERO PUSH2 0xCBD JUMPI POP DUP9 ISZERO JUMPDEST ISZERO PUSH2 0xCCF JUMPI POP DUP6 SWAP2 POP DUP5 SWAP1 POP DUP4 PUSH2 0xFED JUMP JUMPDEST DUP7 ISZERO DUP1 ISZERO PUSH2 0xCDB JUMPI POP DUP6 ISZERO JUMPDEST ISZERO PUSH2 0xCED JUMPI POP DUP9 SWAP2 POP DUP8 SWAP1 POP DUP7 PUSH2 0xFED JUMP JUMPDEST PUSH2 0xCF5 PUSH2 0x122C JUMP JUMPDEST DUP5 DUP1 PUSH2 0xD03 JUMPI PUSH2 0xD03 PUSH2 0x1B7B JUMP JUMPDEST DUP10 DUP11 MULMOD DUP2 MSTORE DUP5 DUP1 PUSH2 0xD16 JUMPI PUSH2 0xD16 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD DUP11 MULMOD PUSH1 0x20 DUP3 ADD MSTORE DUP5 DUP1 PUSH2 0xD2D JUMPI PUSH2 0xD2D PUSH2 0x1B7B JUMP JUMPDEST DUP7 DUP8 MULMOD PUSH1 0x40 DUP3 ADD MSTORE DUP5 DUP1 PUSH2 0xD43 JUMPI PUSH2 0xD43 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD DUP8 MULMOD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 DUP7 DUP1 PUSH2 0xD69 JUMPI PUSH2 0xD69 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MLOAD DUP15 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xD83 JUMPI PUSH2 0xD83 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD DUP14 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xD9D JUMPI PUSH2 0xD9D PUSH2 0x1B7B JUMP JUMPDEST DUP4 MLOAD DUP12 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xDB4 JUMPI PUSH2 0xDB4 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP11 MULMOD SWAP1 MSTORE PUSH1 0x40 DUP2 ADD MLOAD DUP2 MLOAD SWAP2 SWAP3 POP EQ ISZERO DUP1 PUSH2 0xDDC JUMPI POP PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x20 DUP3 ADD MLOAD EQ ISZERO JUMPDEST PUSH2 0xE42 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x557365206A6163446F75626C652066756E6374696F6E20696E73746561640000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH2 0xE4A PUSH2 0x122C JUMP JUMPDEST DUP6 DUP1 PUSH2 0xE58 JUMPI PUSH2 0xE58 PUSH2 0x1B7B JUMP JUMPDEST DUP3 MLOAD PUSH2 0xE64 SWAP1 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MLOAD ADDMOD DUP2 MSTORE DUP6 DUP1 PUSH2 0xE7A JUMPI PUSH2 0xE7A PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xE89 SWAP1 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD ADDMOD PUSH1 0x20 DUP3 ADD MSTORE DUP6 DUP1 PUSH2 0xEA2 JUMPI PUSH2 0xEA2 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD DUP1 MULMOD PUSH1 0x40 DUP3 ADD MSTORE DUP6 DUP1 PUSH2 0xEB9 JUMPI PUSH2 0xEB9 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP4 ADD MLOAD MULMOD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 DUP7 DUP1 PUSH2 0xED6 JUMPI PUSH2 0xED6 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xEE5 SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP9 DUP1 PUSH2 0xEF3 JUMPI PUSH2 0xEF3 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP1 MULMOD ADDMOD SWAP1 POP DUP7 DUP1 PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0xF19 JUMPI PUSH2 0xF19 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xF27 JUMPI PUSH2 0xF27 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD DUP7 MLOAD MULMOD PUSH1 0x2 MULMOD PUSH2 0xF3C SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP3 ADDMOD SWAP1 POP PUSH1 0x0 DUP8 DUP1 PUSH2 0xF50 JUMPI PUSH2 0xF50 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xF5E JUMPI PUSH2 0xF5E PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0xF68 DUP5 DUP12 PUSH2 0x1BAA JUMP JUMPDEST DUP11 DUP1 PUSH2 0xF76 JUMPI PUSH2 0xF76 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD DUP9 MLOAD MULMOD ADDMOD PUSH1 0x20 DUP6 ADD MLOAD MULMOD SWAP1 POP DUP8 DUP1 PUSH2 0xF95 JUMPI PUSH2 0xF95 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xFA3 JUMPI PUSH2 0xFA3 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x20 DUP8 ADD MLOAD MULMOD PUSH2 0xFB8 SWAP1 DUP11 PUSH2 0x1BAA JUMP JUMPDEST DUP3 ADDMOD SWAP1 POP PUSH1 0x0 DUP9 DUP1 PUSH2 0xFCC JUMPI PUSH2 0xFCC PUSH2 0x1B7B JUMP JUMPDEST DUP10 DUP1 PUSH2 0xFDA JUMPI PUSH2 0xFDA PUSH2 0x1B7B JUMP JUMPDEST DUP12 DUP16 MULMOD DUP6 MLOAD MULMOD SWAP3 SWAP8 POP SWAP1 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST SWAP8 POP SWAP8 POP SWAP8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1009 DUP6 DUP6 PUSH2 0x1119 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP5 DUP1 PUSH2 0x101B JUMPI PUSH2 0x101B PUSH2 0x1B7B JUMP JUMPDEST DUP3 DUP4 MULMOD SWAP1 POP PUSH1 0x0 DUP6 DUP1 PUSH2 0x1030 JUMPI PUSH2 0x1030 PUSH2 0x1B7B JUMP JUMPDEST DUP3 DUP11 MULMOD SWAP1 POP PUSH1 0x0 DUP7 DUP1 PUSH2 0x1045 JUMPI PUSH2 0x1045 PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0x1053 JUMPI PUSH2 0x1053 PUSH2 0x1B7B JUMP JUMPDEST DUP5 DUP7 MULMOD DUP11 MULMOD SWAP2 SWAP11 SWAP2 SWAP10 POP SWAP1 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD DUP1 MLOAD SWAP1 DUP5 ADD KECCAK256 PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD SWAP1 DUP6 ADD KECCAK256 PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0xC0 DUP10 ADD MLOAD PUSH1 0xE0 DUP11 ADD MLOAD PUSH2 0x100 DUP12 ADD MLOAD PUSH2 0x120 DUP13 ADD MLOAD DUP1 MLOAD SWAP1 DUP12 ADD KECCAK256 SWAP8 MLOAD PUSH1 0x0 SWAP12 PUSH2 0xB6F SWAP12 SWAP1 SWAP11 SWAP10 SWAP2 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP11 SWAP1 SWAP11 AND DUP11 MSTORE PUSH1 0x20 DUP11 ADD SWAP9 SWAP1 SWAP9 MSTORE PUSH1 0x40 DUP10 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP9 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x80 DUP8 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 DUP7 ADD MSTORE PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 DUP4 ADD MSTORE PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x140 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x112A JUMPI POP DUP2 DUP4 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1135 JUMPI POP DUP2 ISZERO ISZERO JUMPDEST PUSH2 0x119B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 DUP3 JUMPDEST DUP7 ISZERO PUSH2 0x1203 JUMPI PUSH2 0x11B2 DUP8 DUP4 PUSH2 0x1BC1 JUMP JUMPDEST SWAP1 POP DUP3 DUP7 DUP1 PUSH2 0x11C3 JUMPI PUSH2 0x11C3 PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0x11D1 JUMPI PUSH2 0x11D1 PUSH2 0x1B7B JUMP JUMPDEST DUP6 DUP5 MULMOD PUSH2 0x11DE SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP7 ADDMOD SWAP1 SWAP5 POP SWAP3 POP DUP7 PUSH2 0x11F0 DUP2 DUP4 PUSH2 0x1BFC JUMP JUMPDEST PUSH2 0x11FA SWAP1 DUP5 PUSH2 0x1BAA JUMP JUMPDEST SWAP8 POP SWAP2 POP PUSH2 0x11A2 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x125C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12CC DUP6 DUP3 DUP7 ADD PUSH2 0x124A JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x12FE JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x12E2 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1310 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x3DB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x12D8 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13A9 JUMPI PUSH2 0x13A9 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13A9 JUMPI PUSH2 0x13A9 PUSH2 0x1356 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x13F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1402 DUP2 PUSH2 0x13D2 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1418 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1433 JUMPI PUSH2 0x1433 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1479 JUMPI PUSH2 0x1479 PUSH2 0x1356 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x1492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14CD PUSH2 0x1385 JUMP JUMPDEST SWAP1 POP PUSH2 0x14D8 DUP3 PUSH2 0x13F7 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x14FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x150B DUP6 DUP4 DUP7 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1524 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1530 DUP6 DUP4 DUP7 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP3 DUP5 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1580 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x158C DUP7 DUP3 DUP8 ADD PUSH2 0x1407 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP PUSH2 0x140 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x15A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15B3 DUP7 DUP3 DUP8 ADD PUSH2 0x1407 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x15D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x15E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC5C DUP5 DUP3 DUP6 ADD PUSH2 0x14B2 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x161D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15FE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1639 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1644 DUP2 PUSH2 0x13D2 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x165D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x161D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1671 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC5C DUP5 DUP3 DUP6 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1717 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x172F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x173B DUP9 DUP4 DUP10 ADD PUSH2 0x124A JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1777 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1789 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x17FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x183A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1855 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x187D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x18EC JUMPI PUSH2 0x18EC PUSH2 0x188C JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1905 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1914 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1937 JUMPI PUSH2 0x1937 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1203 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x194E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1978 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1987 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x198F PUSH2 0x13AF JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x19BB JUMPI DUP1 CALLDATALOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x19A3 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19D2 CALLDATASIZE DUP4 PUSH2 0x14B2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x19FB JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x19DC JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x19FB JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A05 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x1A33 DUP3 DUP7 PUSH2 0x19D8 JUMP JUMPDEST PUSH2 0x1A40 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1A01 JUMP JUMPDEST PUSH2 0xC5C PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x19D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP1 DUP4 ADD PUSH2 0x1A80 DUP5 DUP9 PUSH2 0x19D8 JUMP JUMPDEST PUSH1 0x40 DUP5 DUP2 ADD DUP4 SWAP1 MSTORE DUP7 MLOAD SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x20 SWAP2 PUSH1 0xA0 DUP7 ADD SWAP1 DUP4 DUP10 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1ABF JUMPI PUSH2 0x1AAF DUP5 DUP4 MLOAD PUSH2 0x1A01 JUMP JUMPDEST SWAP3 DUP7 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A9C JUMP JUMPDEST POP POP POP DUP6 DUP2 SUB PUSH1 0x60 DUP8 ADD MSTORE DUP7 MLOAD DUP1 DUP3 MSTORE SWAP1 DUP4 ADD SWAP4 POP DUP3 DUP8 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1AFE JUMPI PUSH2 0x1AEE DUP7 DUP5 MLOAD PUSH2 0x19D8 JUMP JUMPDEST SWAP5 DUP4 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1ADB JUMP JUMPDEST POP SWAP4 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0xC5C PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x12D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B4F PUSH2 0x13AF JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1B61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x19BB JUMPI DUP1 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x1B63 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1BBC JUMPI PUSH2 0x1BBC PUSH2 0x188C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1BF7 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1C34 JUMPI PUSH2 0x1C34 PUSH2 0x188C JUMP JUMPDEST POP MUL SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD2 MLOAD LOG0 SWAP8 0x26 SWAP9 SGT 0xC ORIGIN 0xF9 0x4C 0xC0 SUB 0x5C SELFBALANCE DUP15 0xC2 GT PUSH26 0xF1F269EF606B1B31AA559C232A64736F6C634300080F00330000 ","sourceMap":"387:6849:80:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@BLS_DOMAIN_15885":{"entryPoint":null,"id":15885,"parameterSlots":0,"returnSlots":0},"@N_15888":{"entryPoint":null,"id":15888,"parameterSlots":0,"returnSlots":0},"@_getPublicKeyHash_16236":{"entryPoint":2908,"id":16236,"parameterSlots":1,"returnSlots":1},"@_getUserOpHash_16219":{"entryPoint":3172,"id":16219,"parameterSlots":2,"returnSlots":1},"@_userOpToMessage_16170":{"entryPoint":2956,"id":16170,"parameterSlots":2,"returnSlots":1},"@addStake_16401":{"entryPoint":994,"id":16401,"parameterSlots":2,"returnSlots":0},"@aggregateSignatures_16382":{"entryPoint":588,"id":16382,"parameterSlots":2,"returnSlots":1},"@getTrailingPublicKey_15953":{"entryPoint":1681,"id":15953,"parameterSlots":1,"returnSlots":1},"@getUserOpHash_16192":{"entryPoint":1654,"id":16192,"parameterSlots":1,"returnSlots":1},"@getUserOpPublicKey_15927":{"entryPoint":1133,"id":15927,"parameterSlots":1,"returnSlots":1},"@internalUserOpHash_16116":{"entryPoint":4201,"id":16116,"parameterSlots":1,"returnSlots":1},"@invMod_15626":{"entryPoint":4377,"id":15626,"parameterSlots":2,"returnSlots":1},"@jacAdd_15485":{"entryPoint":3245,"id":15485,"parameterSlots":7,"returnSlots":3},"@sum_15162":{"entryPoint":2673,"id":15162,"parameterSlots":2,"returnSlots":1},"@toAffine_15541":{"entryPoint":4090,"id":15541,"parameterSlots":4,"returnSlots":2},"@userOpToMessage_16141":{"entryPoint":948,"id":16141,"parameterSlots":1,"returnSlots":1},"@validateSignatures_16074":{"entryPoint":1929,"id":16074,"parameterSlots":4,"returnSlots":0},"@validateUserOpSignature_16298":{"entryPoint":1294,"id":16298,"parameterSlots":1,"returnSlots":1},"abi_decode_address":{"entryPoint":5111,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_struct_UserOperation_calldata_dyn_calldata":{"entryPoint":4682,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes":{"entryPoint":5127,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_UserOperation":{"entryPoint":5298,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":4758,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":5889,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr":{"entryPoint":6502,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr_fromMemory":{"entryPoint":6950,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr_fromMemory":{"entryPoint":6387,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":6733,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes_memory_ptr":{"entryPoint":5836,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32":{"entryPoint":5670,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":5776,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_memory_ptr":{"entryPoint":5568,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_uint256":{"entryPoint":6250,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_array_uint256":{"entryPoint":6657,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_array_uint256_to_array_uint256_library":{"entryPoint":6616,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes":{"entryPoint":4824,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes32__to_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":11,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_reversed":{"entryPoint":5621,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__fromStack_library_reversed":{"entryPoint":6767,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed":{"entryPoint":6692,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":5736,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_bytes32_t_address_t_uint256__to_t_bytes32_t_bytes32_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_bytes_memory_ptr__to_t_bytes32_t_bytes_memory_ptr__fromStack_library_reversed":{"entryPoint":6925,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":4931,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_23023282b0f59631a4352146b09b85b58fd6d0cc04d93c3b2f62d5ff0f501f0b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2def5c28206cb0e6164070fcb51feafff201d12ca54bd3e0a3892357496d8fff__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4145b59d57ae2f5f0851e5de83c7fb2657aa25911319fc4a072ca80b43f5bde8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_5fdf44d35b202e4b4a5d1b6167961ee48e84a906ae5e709d7bddb824c86220a6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_be923b909b7eb750f013b66ddb441626fcead463bfc2bef068b4a957ee0dca0c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f10345bf174b7296e0343b593f8b22d6d65d2b16a2522b6b74d9848a96db003a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":6149,"id":null,"parameterSlots":2,"returnSlots":2},"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":6087,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":5039,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_2952":{"entryPoint":4997,"id":null,"parameterSlots":0,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":7105,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":7164,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":7082,"id":null,"parameterSlots":2,"returnSlots":1},"convert_t_struct$_UserOperation_$10993_calldata_ptr_to_t_struct$_UserOperation_$10993_memory_ptr":{"entryPoint":6598,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":6331,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":6284,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x12":{"entryPoint":7035,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":6040,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":4950,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":5074,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:21020:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"115:76:111","statements":[{"nodeType":"YulAssignment","src":"125:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"125:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"167:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:25:111"},"nodeType":"YulExpressionStatement","src":"160:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"84:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"95:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"106:4:111","type":""}],"src":"14:177:111"},{"body":{"nodeType":"YulBlock","src":"302:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"351:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"360:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"363:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"353:6:111"},"nodeType":"YulFunctionCall","src":"353:12:111"},"nodeType":"YulExpressionStatement","src":"353:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"330:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"338:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"326:3:111"},"nodeType":"YulFunctionCall","src":"326:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"345:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"322:3:111"},"nodeType":"YulFunctionCall","src":"322:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"315:6:111"},"nodeType":"YulFunctionCall","src":"315:35:111"},"nodeType":"YulIf","src":"312:55:111"},{"nodeType":"YulAssignment","src":"376:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"399:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"386:12:111"},"nodeType":"YulFunctionCall","src":"386:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"376:6:111"}]},{"body":{"nodeType":"YulBlock","src":"449:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"458:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"461:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"451:6:111"},"nodeType":"YulFunctionCall","src":"451:12:111"},"nodeType":"YulExpressionStatement","src":"451:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"421:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"429:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"418:2:111"},"nodeType":"YulFunctionCall","src":"418:30:111"},"nodeType":"YulIf","src":"415:50:111"},{"nodeType":"YulAssignment","src":"474:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"490:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"498:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"486:3:111"},"nodeType":"YulFunctionCall","src":"486:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"474:8:111"}]},{"body":{"nodeType":"YulBlock","src":"563:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"572:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"575:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"565:6:111"},"nodeType":"YulFunctionCall","src":"565:12:111"},"nodeType":"YulExpressionStatement","src":"565:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"526:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"538:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"541:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"534:3:111"},"nodeType":"YulFunctionCall","src":"534:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"522:3:111"},"nodeType":"YulFunctionCall","src":"522:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"551:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"518:3:111"},"nodeType":"YulFunctionCall","src":"518:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"558:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"515:2:111"},"nodeType":"YulFunctionCall","src":"515:47:111"},"nodeType":"YulIf","src":"512:67:111"}]},"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"265:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"273:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"281:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"291:6:111","type":""}],"src":"196:389:111"},{"body":{"nodeType":"YulBlock","src":"729:354:111","statements":[{"body":{"nodeType":"YulBlock","src":"775:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"784:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"787:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"777:6:111"},"nodeType":"YulFunctionCall","src":"777:12:111"},"nodeType":"YulExpressionStatement","src":"777:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"750:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"759:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"746:3:111"},"nodeType":"YulFunctionCall","src":"746:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"771:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"742:3:111"},"nodeType":"YulFunctionCall","src":"742:32:111"},"nodeType":"YulIf","src":"739:52:111"},{"nodeType":"YulVariableDeclaration","src":"800:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"827:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"814:12:111"},"nodeType":"YulFunctionCall","src":"814:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"804:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"880:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"889:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"892:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"882:6:111"},"nodeType":"YulFunctionCall","src":"882:12:111"},"nodeType":"YulExpressionStatement","src":"882:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"852:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"860:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"849:2:111"},"nodeType":"YulFunctionCall","src":"849:30:111"},"nodeType":"YulIf","src":"846:50:111"},{"nodeType":"YulVariableDeclaration","src":"905:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"995:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1006:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"991:3:111"},"nodeType":"YulFunctionCall","src":"991:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1015:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"931:59:111"},"nodeType":"YulFunctionCall","src":"931:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"909:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"919:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1032:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"1042:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1032:6:111"}]},{"nodeType":"YulAssignment","src":"1059:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"1069:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1059:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"687:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"698:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"710:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"718:6:111","type":""}],"src":"590:493:111"},{"body":{"nodeType":"YulBlock","src":"1137:481:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1147:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1167:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1161:5:111"},"nodeType":"YulFunctionCall","src":"1161:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1151:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1189:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1194:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1182:6:111"},"nodeType":"YulFunctionCall","src":"1182:19:111"},"nodeType":"YulExpressionStatement","src":"1182:19:111"},{"nodeType":"YulVariableDeclaration","src":"1210:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1219:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1214:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1281:110:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1295:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1305:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1299:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1337:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1342:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1333:3:111"},"nodeType":"YulFunctionCall","src":"1333:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1346:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1329:3:111"},"nodeType":"YulFunctionCall","src":"1329:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1365:5:111"},{"name":"i","nodeType":"YulIdentifier","src":"1372:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1361:3:111"},"nodeType":"YulFunctionCall","src":"1361:13:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1376:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1357:3:111"},"nodeType":"YulFunctionCall","src":"1357:22:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1351:5:111"},"nodeType":"YulFunctionCall","src":"1351:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1322:6:111"},"nodeType":"YulFunctionCall","src":"1322:59:111"},"nodeType":"YulExpressionStatement","src":"1322:59:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1240:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1243:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1237:2:111"},"nodeType":"YulFunctionCall","src":"1237:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1251:21:111","statements":[{"nodeType":"YulAssignment","src":"1253:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1262:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1265:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1258:3:111"},"nodeType":"YulFunctionCall","src":"1258:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1253:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1233:3:111","statements":[]},"src":"1229:162:111"},{"body":{"nodeType":"YulBlock","src":"1425:62:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1454:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1459:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1450:3:111"},"nodeType":"YulFunctionCall","src":"1450:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"1468:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1446:3:111"},"nodeType":"YulFunctionCall","src":"1446:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"1475:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1439:6:111"},"nodeType":"YulFunctionCall","src":"1439:38:111"},"nodeType":"YulExpressionStatement","src":"1439:38:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1406:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1409:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1403:2:111"},"nodeType":"YulFunctionCall","src":"1403:13:111"},"nodeType":"YulIf","src":"1400:87:111"},{"nodeType":"YulAssignment","src":"1496:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1511:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1524:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1532:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1520:3:111"},"nodeType":"YulFunctionCall","src":"1520:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1537:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1516:3:111"},"nodeType":"YulFunctionCall","src":"1516:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1507:3:111"},"nodeType":"YulFunctionCall","src":"1507:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"1607:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1503:3:111"},"nodeType":"YulFunctionCall","src":"1503:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"1496:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"1114:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"1121:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"1129:3:111","type":""}],"src":"1088:530:111"},{"body":{"nodeType":"YulBlock","src":"1742:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1770:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1752:6:111"},"nodeType":"YulFunctionCall","src":"1752:21:111"},"nodeType":"YulExpressionStatement","src":"1752:21:111"},{"nodeType":"YulAssignment","src":"1782:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1807:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1830:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1815:3:111"},"nodeType":"YulFunctionCall","src":"1815:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"1790:16:111"},"nodeType":"YulFunctionCall","src":"1790:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1782:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1711:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1722:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1733:4:111","type":""}],"src":"1623:217:111"},{"body":{"nodeType":"YulBlock","src":"1877:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1894:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1897:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1887:6:111"},"nodeType":"YulFunctionCall","src":"1887:88:111"},"nodeType":"YulExpressionStatement","src":"1887:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1991:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1994:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1984:6:111"},"nodeType":"YulFunctionCall","src":"1984:15:111"},"nodeType":"YulExpressionStatement","src":"1984:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2015:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2018:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2008:6:111"},"nodeType":"YulFunctionCall","src":"2008:15:111"},"nodeType":"YulExpressionStatement","src":"2008:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"1845:184:111"},{"body":{"nodeType":"YulBlock","src":"2080:209:111","statements":[{"nodeType":"YulAssignment","src":"2090:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2106:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2100:5:111"},"nodeType":"YulFunctionCall","src":"2100:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2090:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2118:37:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2140:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2148:6:111","type":"","value":"0x0160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2136:3:111"},"nodeType":"YulFunctionCall","src":"2136:19:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"2122:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2230:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2232:16:111"},"nodeType":"YulFunctionCall","src":"2232:18:111"},"nodeType":"YulExpressionStatement","src":"2232:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2173:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2185:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2170:2:111"},"nodeType":"YulFunctionCall","src":"2170:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2209:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2221:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2206:2:111"},"nodeType":"YulFunctionCall","src":"2206:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2167:2:111"},"nodeType":"YulFunctionCall","src":"2167:62:111"},"nodeType":"YulIf","src":"2164:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2268:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2272:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2261:6:111"},"nodeType":"YulFunctionCall","src":"2261:22:111"},"nodeType":"YulExpressionStatement","src":"2261:22:111"}]},"name":"allocate_memory_2952","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"2069:6:111","type":""}],"src":"2034:255:111"},{"body":{"nodeType":"YulBlock","src":"2335:205:111","statements":[{"nodeType":"YulAssignment","src":"2345:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2361:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2355:5:111"},"nodeType":"YulFunctionCall","src":"2355:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2345:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2373:33:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2395:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2403:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2391:3:111"},"nodeType":"YulFunctionCall","src":"2391:15:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"2377:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2481:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2483:16:111"},"nodeType":"YulFunctionCall","src":"2483:18:111"},"nodeType":"YulExpressionStatement","src":"2483:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2424:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2436:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2421:2:111"},"nodeType":"YulFunctionCall","src":"2421:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2460:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2472:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2457:2:111"},"nodeType":"YulFunctionCall","src":"2457:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2418:2:111"},"nodeType":"YulFunctionCall","src":"2418:62:111"},"nodeType":"YulIf","src":"2415:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2519:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2523:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2512:6:111"},"nodeType":"YulFunctionCall","src":"2512:22:111"},"nodeType":"YulExpressionStatement","src":"2512:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"2324:6:111","type":""}],"src":"2294:246:111"},{"body":{"nodeType":"YulBlock","src":"2590:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"2677:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2686:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2689:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2679:6:111"},"nodeType":"YulFunctionCall","src":"2679:12:111"},"nodeType":"YulExpressionStatement","src":"2679:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2613:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2624:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2631:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2620:3:111"},"nodeType":"YulFunctionCall","src":"2620:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2610:2:111"},"nodeType":"YulFunctionCall","src":"2610:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2603:6:111"},"nodeType":"YulFunctionCall","src":"2603:73:111"},"nodeType":"YulIf","src":"2600:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"2579:5:111","type":""}],"src":"2545:154:111"},{"body":{"nodeType":"YulBlock","src":"2753:85:111","statements":[{"nodeType":"YulAssignment","src":"2763:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2785:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2772:12:111"},"nodeType":"YulFunctionCall","src":"2772:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2763:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2826:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2801:24:111"},"nodeType":"YulFunctionCall","src":"2801:31:111"},"nodeType":"YulExpressionStatement","src":"2801:31:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2732:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2743:5:111","type":""}],"src":"2704:134:111"},{"body":{"nodeType":"YulBlock","src":"2895:725:111","statements":[{"body":{"nodeType":"YulBlock","src":"2944:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2953:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2956:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2946:6:111"},"nodeType":"YulFunctionCall","src":"2946:12:111"},"nodeType":"YulExpressionStatement","src":"2946:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2923:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2931:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2919:3:111"},"nodeType":"YulFunctionCall","src":"2919:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"2938:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2915:3:111"},"nodeType":"YulFunctionCall","src":"2915:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2908:6:111"},"nodeType":"YulFunctionCall","src":"2908:35:111"},"nodeType":"YulIf","src":"2905:55:111"},{"nodeType":"YulVariableDeclaration","src":"2969:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2992:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2979:12:111"},"nodeType":"YulFunctionCall","src":"2979:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2973:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3008:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3018:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3012:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3059:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3061:16:111"},"nodeType":"YulFunctionCall","src":"3061:18:111"},"nodeType":"YulExpressionStatement","src":"3061:18:111"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3051:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3055:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3048:2:111"},"nodeType":"YulFunctionCall","src":"3048:10:111"},"nodeType":"YulIf","src":"3045:36:111"},{"nodeType":"YulVariableDeclaration","src":"3090:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3100:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"3094:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3175:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3195:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3189:5:111"},"nodeType":"YulFunctionCall","src":"3189:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"3179:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3207:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3229:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3253:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3257:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3249:3:111"},"nodeType":"YulFunctionCall","src":"3249:13:111"},{"name":"_3","nodeType":"YulIdentifier","src":"3264:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3245:3:111"},"nodeType":"YulFunctionCall","src":"3245:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"3269:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3241:3:111"},"nodeType":"YulFunctionCall","src":"3241:31:111"},{"name":"_3","nodeType":"YulIdentifier","src":"3274:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3237:3:111"},"nodeType":"YulFunctionCall","src":"3237:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3225:3:111"},"nodeType":"YulFunctionCall","src":"3225:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"3211:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3337:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3339:16:111"},"nodeType":"YulFunctionCall","src":"3339:18:111"},"nodeType":"YulExpressionStatement","src":"3339:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3296:10:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3308:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3293:2:111"},"nodeType":"YulFunctionCall","src":"3293:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3316:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"3328:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3313:2:111"},"nodeType":"YulFunctionCall","src":"3313:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"3290:2:111"},"nodeType":"YulFunctionCall","src":"3290:46:111"},"nodeType":"YulIf","src":"3287:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3375:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3379:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3368:6:111"},"nodeType":"YulFunctionCall","src":"3368:22:111"},"nodeType":"YulExpressionStatement","src":"3368:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3406:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3414:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3399:6:111"},"nodeType":"YulFunctionCall","src":"3399:18:111"},"nodeType":"YulExpressionStatement","src":"3399:18:111"},{"body":{"nodeType":"YulBlock","src":"3465:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3474:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3477:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3467:6:111"},"nodeType":"YulFunctionCall","src":"3467:12:111"},"nodeType":"YulExpressionStatement","src":"3467:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3440:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3448:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3436:3:111"},"nodeType":"YulFunctionCall","src":"3436:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3453:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3432:3:111"},"nodeType":"YulFunctionCall","src":"3432:26:111"},{"name":"end","nodeType":"YulIdentifier","src":"3460:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3429:2:111"},"nodeType":"YulFunctionCall","src":"3429:35:111"},"nodeType":"YulIf","src":"3426:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3507:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3515:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3503:3:111"},"nodeType":"YulFunctionCall","src":"3503:17:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3526:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3534:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3522:3:111"},"nodeType":"YulFunctionCall","src":"3522:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3541:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"3490:12:111"},"nodeType":"YulFunctionCall","src":"3490:54:111"},"nodeType":"YulExpressionStatement","src":"3490:54:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3568:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3576:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3564:3:111"},"nodeType":"YulFunctionCall","src":"3564:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3581:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3560:3:111"},"nodeType":"YulFunctionCall","src":"3560:26:111"},{"kind":"number","nodeType":"YulLiteral","src":"3588:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3553:6:111"},"nodeType":"YulFunctionCall","src":"3553:37:111"},"nodeType":"YulExpressionStatement","src":"3553:37:111"},{"nodeType":"YulAssignment","src":"3599:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"3608:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"3599:5:111"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2869:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2877:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"2885:5:111","type":""}],"src":"2843:777:111"},{"body":{"nodeType":"YulBlock","src":"3695:1384:111","statements":[{"body":{"nodeType":"YulBlock","src":"3741:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3750:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3753:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3743:6:111"},"nodeType":"YulFunctionCall","src":"3743:12:111"},"nodeType":"YulExpressionStatement","src":"3743:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"3716:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3721:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3712:3:111"},"nodeType":"YulFunctionCall","src":"3712:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"3733:6:111","type":"","value":"0x0160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3708:3:111"},"nodeType":"YulFunctionCall","src":"3708:32:111"},"nodeType":"YulIf","src":"3705:52:111"},{"nodeType":"YulAssignment","src":"3766:31:111","value":{"arguments":[],"functionName":{"name":"allocate_memory_2952","nodeType":"YulIdentifier","src":"3775:20:111"},"nodeType":"YulFunctionCall","src":"3775:22:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"3766:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3813:5:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3839:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3820:18:111"},"nodeType":"YulFunctionCall","src":"3820:29:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3806:6:111"},"nodeType":"YulFunctionCall","src":"3806:44:111"},"nodeType":"YulExpressionStatement","src":"3806:44:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3870:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3877:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3866:3:111"},"nodeType":"YulFunctionCall","src":"3866:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3899:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3910:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3895:3:111"},"nodeType":"YulFunctionCall","src":"3895:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3882:12:111"},"nodeType":"YulFunctionCall","src":"3882:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3859:6:111"},"nodeType":"YulFunctionCall","src":"3859:56:111"},"nodeType":"YulExpressionStatement","src":"3859:56:111"},{"nodeType":"YulVariableDeclaration","src":"3924:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3966:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3951:3:111"},"nodeType":"YulFunctionCall","src":"3951:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3938:12:111"},"nodeType":"YulFunctionCall","src":"3938:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3928:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3979:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3989:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3983:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4034:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4043:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4046:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4036:6:111"},"nodeType":"YulFunctionCall","src":"4036:12:111"},"nodeType":"YulExpressionStatement","src":"4036:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4022:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4030:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4019:2:111"},"nodeType":"YulFunctionCall","src":"4019:14:111"},"nodeType":"YulIf","src":"4016:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4070:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4077:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4066:3:111"},"nodeType":"YulFunctionCall","src":"4066:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4103:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4114:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4099:3:111"},"nodeType":"YulFunctionCall","src":"4099:22:111"},{"name":"end","nodeType":"YulIdentifier","src":"4123:3:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4082:16:111"},"nodeType":"YulFunctionCall","src":"4082:45:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4059:6:111"},"nodeType":"YulFunctionCall","src":"4059:69:111"},"nodeType":"YulExpressionStatement","src":"4059:69:111"},{"nodeType":"YulVariableDeclaration","src":"4137:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4170:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4181:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4166:3:111"},"nodeType":"YulFunctionCall","src":"4166:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4153:12:111"},"nodeType":"YulFunctionCall","src":"4153:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4141:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4214:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4223:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4226:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4216:6:111"},"nodeType":"YulFunctionCall","src":"4216:12:111"},"nodeType":"YulExpressionStatement","src":"4216:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4200:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4210:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4197:2:111"},"nodeType":"YulFunctionCall","src":"4197:16:111"},"nodeType":"YulIf","src":"4194:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4250:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4257:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4246:3:111"},"nodeType":"YulFunctionCall","src":"4246:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4283:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4294:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4279:3:111"},"nodeType":"YulFunctionCall","src":"4279:24:111"},{"name":"end","nodeType":"YulIdentifier","src":"4305:3:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4262:16:111"},"nodeType":"YulFunctionCall","src":"4262:47:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4239:6:111"},"nodeType":"YulFunctionCall","src":"4239:71:111"},"nodeType":"YulExpressionStatement","src":"4239:71:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4330:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4337:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4326:3:111"},"nodeType":"YulFunctionCall","src":"4326:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4360:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4371:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4356:3:111"},"nodeType":"YulFunctionCall","src":"4356:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4343:12:111"},"nodeType":"YulFunctionCall","src":"4343:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4319:6:111"},"nodeType":"YulFunctionCall","src":"4319:58:111"},"nodeType":"YulExpressionStatement","src":"4319:58:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4397:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4404:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4393:3:111"},"nodeType":"YulFunctionCall","src":"4393:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4427:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4438:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4423:3:111"},"nodeType":"YulFunctionCall","src":"4423:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4410:12:111"},"nodeType":"YulFunctionCall","src":"4410:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4386:6:111"},"nodeType":"YulFunctionCall","src":"4386:58:111"},"nodeType":"YulExpressionStatement","src":"4386:58:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4464:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4471:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4460:3:111"},"nodeType":"YulFunctionCall","src":"4460:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4494:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4505:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4490:3:111"},"nodeType":"YulFunctionCall","src":"4490:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4477:12:111"},"nodeType":"YulFunctionCall","src":"4477:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4453:6:111"},"nodeType":"YulFunctionCall","src":"4453:58:111"},"nodeType":"YulExpressionStatement","src":"4453:58:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4531:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4538:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4527:3:111"},"nodeType":"YulFunctionCall","src":"4527:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4561:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4572:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4557:3:111"},"nodeType":"YulFunctionCall","src":"4557:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4544:12:111"},"nodeType":"YulFunctionCall","src":"4544:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4520:6:111"},"nodeType":"YulFunctionCall","src":"4520:58:111"},"nodeType":"YulExpressionStatement","src":"4520:58:111"},{"nodeType":"YulVariableDeclaration","src":"4587:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4597:3:111","type":"","value":"256"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"4591:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4620:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4627:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4616:3:111"},"nodeType":"YulFunctionCall","src":"4616:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4649:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4660:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4645:3:111"},"nodeType":"YulFunctionCall","src":"4645:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4632:12:111"},"nodeType":"YulFunctionCall","src":"4632:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4609:6:111"},"nodeType":"YulFunctionCall","src":"4609:56:111"},"nodeType":"YulExpressionStatement","src":"4609:56:111"},{"nodeType":"YulVariableDeclaration","src":"4674:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4684:3:111","type":"","value":"288"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"4678:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4696:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4729:9:111"},{"name":"_3","nodeType":"YulIdentifier","src":"4740:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4725:3:111"},"nodeType":"YulFunctionCall","src":"4725:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4712:12:111"},"nodeType":"YulFunctionCall","src":"4712:32:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"4700:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4773:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4782:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4785:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4775:6:111"},"nodeType":"YulFunctionCall","src":"4775:12:111"},"nodeType":"YulExpressionStatement","src":"4775:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"4759:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4769:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4756:2:111"},"nodeType":"YulFunctionCall","src":"4756:16:111"},"nodeType":"YulIf","src":"4753:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4809:5:111"},{"name":"_3","nodeType":"YulIdentifier","src":"4816:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4805:3:111"},"nodeType":"YulFunctionCall","src":"4805:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4842:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"4853:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4838:3:111"},"nodeType":"YulFunctionCall","src":"4838:24:111"},{"name":"end","nodeType":"YulIdentifier","src":"4864:3:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4821:16:111"},"nodeType":"YulFunctionCall","src":"4821:47:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4798:6:111"},"nodeType":"YulFunctionCall","src":"4798:71:111"},"nodeType":"YulExpressionStatement","src":"4798:71:111"},{"nodeType":"YulVariableDeclaration","src":"4878:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4888:3:111","type":"","value":"320"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"4882:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4900:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4933:9:111"},{"name":"_4","nodeType":"YulIdentifier","src":"4944:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4929:3:111"},"nodeType":"YulFunctionCall","src":"4929:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4916:12:111"},"nodeType":"YulFunctionCall","src":"4916:32:111"},"variables":[{"name":"offset_3","nodeType":"YulTypedName","src":"4904:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4977:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4986:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4989:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4979:6:111"},"nodeType":"YulFunctionCall","src":"4979:12:111"},"nodeType":"YulExpressionStatement","src":"4979:12:111"}]},"condition":{"arguments":[{"name":"offset_3","nodeType":"YulIdentifier","src":"4963:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4973:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4960:2:111"},"nodeType":"YulFunctionCall","src":"4960:16:111"},"nodeType":"YulIf","src":"4957:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5013:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"5020:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5009:3:111"},"nodeType":"YulFunctionCall","src":"5009:14:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5046:9:111"},{"name":"offset_3","nodeType":"YulIdentifier","src":"5057:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5042:3:111"},"nodeType":"YulFunctionCall","src":"5042:24:111"},{"name":"end","nodeType":"YulIdentifier","src":"5068:3:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"5025:16:111"},"nodeType":"YulFunctionCall","src":"5025:47:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5002:6:111"},"nodeType":"YulFunctionCall","src":"5002:71:111"},"nodeType":"YulExpressionStatement","src":"5002:71:111"}]},"name":"abi_decode_struct_UserOperation","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3666:9:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3677:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"3685:5:111","type":""}],"src":"3625:1454:111"},{"body":{"nodeType":"YulBlock","src":"5186:256:111","statements":[{"body":{"nodeType":"YulBlock","src":"5232:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5241:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5244:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5234:6:111"},"nodeType":"YulFunctionCall","src":"5234:12:111"},"nodeType":"YulExpressionStatement","src":"5234:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5207:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5216:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5203:3:111"},"nodeType":"YulFunctionCall","src":"5203:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5228:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5199:3:111"},"nodeType":"YulFunctionCall","src":"5199:32:111"},"nodeType":"YulIf","src":"5196:52:111"},{"nodeType":"YulVariableDeclaration","src":"5257:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5284:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5271:12:111"},"nodeType":"YulFunctionCall","src":"5271:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5261:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5337:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5346:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5349:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5339:6:111"},"nodeType":"YulFunctionCall","src":"5339:12:111"},"nodeType":"YulExpressionStatement","src":"5339:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5309:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5317:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5306:2:111"},"nodeType":"YulFunctionCall","src":"5306:30:111"},"nodeType":"YulIf","src":"5303:50:111"},{"nodeType":"YulAssignment","src":"5362:74:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5408:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5419:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5404:3:111"},"nodeType":"YulFunctionCall","src":"5404:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5428:7:111"}],"functionName":{"name":"abi_decode_struct_UserOperation","nodeType":"YulIdentifier","src":"5372:31:111"},"nodeType":"YulFunctionCall","src":"5372:64:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5362:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5152:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5163:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5175:6:111","type":""}],"src":"5084:358:111"},{"body":{"nodeType":"YulBlock","src":"5594:347:111","statements":[{"nodeType":"YulAssignment","src":"5604:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5616:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5627:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5612:3:111"},"nodeType":"YulFunctionCall","src":"5612:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5604:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"5639:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"5650:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"5643:3:111","type":""}]},{"nodeType":"YulAssignment","src":"5668:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"5675:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5668:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"5693:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"5707:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"5697:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5722:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5731:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5726:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5788:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5809:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5820:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5814:5:111"},"nodeType":"YulFunctionCall","src":"5814:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5802:6:111"},"nodeType":"YulFunctionCall","src":"5802:26:111"},"nodeType":"YulExpressionStatement","src":"5802:26:111"},{"nodeType":"YulVariableDeclaration","src":"5841:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5851:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5845:2:111","type":""}]},{"nodeType":"YulAssignment","src":"5868:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5879:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5884:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5875:3:111"},"nodeType":"YulFunctionCall","src":"5875:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5868:3:111"}]},{"nodeType":"YulAssignment","src":"5900:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5914:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5922:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5910:3:111"},"nodeType":"YulFunctionCall","src":"5910:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5900:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5752:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5755:4:111","type":"","value":"0x02"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5749:2:111"},"nodeType":"YulFunctionCall","src":"5749:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5761:18:111","statements":[{"nodeType":"YulAssignment","src":"5763:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5772:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5775:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5768:3:111"},"nodeType":"YulFunctionCall","src":"5768:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5763:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5745:3:111","statements":[]},"src":"5741:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5563:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5574:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5585:4:111","type":""}],"src":"5447:494:111"},{"body":{"nodeType":"YulBlock","src":"6053:333:111","statements":[{"body":{"nodeType":"YulBlock","src":"6099:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6108:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6111:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6101:6:111"},"nodeType":"YulFunctionCall","src":"6101:12:111"},"nodeType":"YulExpressionStatement","src":"6101:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6074:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6083:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6070:3:111"},"nodeType":"YulFunctionCall","src":"6070:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6095:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6066:3:111"},"nodeType":"YulFunctionCall","src":"6066:32:111"},"nodeType":"YulIf","src":"6063:52:111"},{"nodeType":"YulVariableDeclaration","src":"6124:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6150:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6137:12:111"},"nodeType":"YulFunctionCall","src":"6137:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6128:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6194:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6169:24:111"},"nodeType":"YulFunctionCall","src":"6169:31:111"},"nodeType":"YulExpressionStatement","src":"6169:31:111"},{"nodeType":"YulAssignment","src":"6209:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6219:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6209:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6233:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6276:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6261:3:111"},"nodeType":"YulFunctionCall","src":"6261:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6248:12:111"},"nodeType":"YulFunctionCall","src":"6248:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"6237:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6338:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6347:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6350:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6340:6:111"},"nodeType":"YulFunctionCall","src":"6340:12:111"},"nodeType":"YulExpressionStatement","src":"6340:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"6302:7:111"},{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"6315:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"6324:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6311:3:111"},"nodeType":"YulFunctionCall","src":"6311:24:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"6299:2:111"},"nodeType":"YulFunctionCall","src":"6299:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6292:6:111"},"nodeType":"YulFunctionCall","src":"6292:45:111"},"nodeType":"YulIf","src":"6289:65:111"},{"nodeType":"YulAssignment","src":"6363:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"6373:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6363:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6011:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6022:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6034:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6042:6:111","type":""}],"src":"5946:440:111"},{"body":{"nodeType":"YulBlock","src":"6538:348:111","statements":[{"nodeType":"YulAssignment","src":"6548:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6560:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6571:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6556:3:111"},"nodeType":"YulFunctionCall","src":"6556:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6548:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"6584:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"6595:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"6588:3:111","type":""}]},{"nodeType":"YulAssignment","src":"6613:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"6620:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"6613:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"6638:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"6652:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"6642:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6667:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6676:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"6671:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6733:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6754:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"6765:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6759:5:111"},"nodeType":"YulFunctionCall","src":"6759:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6747:6:111"},"nodeType":"YulFunctionCall","src":"6747:26:111"},"nodeType":"YulExpressionStatement","src":"6747:26:111"},{"nodeType":"YulVariableDeclaration","src":"6786:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6796:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6790:2:111","type":""}]},{"nodeType":"YulAssignment","src":"6813:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"6824:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6829:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6820:3:111"},"nodeType":"YulFunctionCall","src":"6820:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"6813:3:111"}]},{"nodeType":"YulAssignment","src":"6845:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"6859:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6867:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6855:3:111"},"nodeType":"YulFunctionCall","src":"6855:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"6845:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6697:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6700:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6694:2:111"},"nodeType":"YulFunctionCall","src":"6694:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6706:18:111","statements":[{"nodeType":"YulAssignment","src":"6708:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6717:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6720:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6713:3:111"},"nodeType":"YulFunctionCall","src":"6713:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"6708:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6690:3:111","statements":[]},"src":"6686:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6507:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6518:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6529:4:111","type":""}],"src":"6391:495:111"},{"body":{"nodeType":"YulBlock","src":"6995:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"7041:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7050:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7053:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7043:6:111"},"nodeType":"YulFunctionCall","src":"7043:12:111"},"nodeType":"YulExpressionStatement","src":"7043:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7016:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7025:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7012:3:111"},"nodeType":"YulFunctionCall","src":"7012:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7037:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7008:3:111"},"nodeType":"YulFunctionCall","src":"7008:32:111"},"nodeType":"YulIf","src":"7005:52:111"},{"nodeType":"YulVariableDeclaration","src":"7066:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7093:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7080:12:111"},"nodeType":"YulFunctionCall","src":"7080:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7070:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7148:6:111"},"nodeType":"YulFunctionCall","src":"7148:12:111"},"nodeType":"YulExpressionStatement","src":"7148:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7118:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7126:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7115:2:111"},"nodeType":"YulFunctionCall","src":"7115:30:111"},"nodeType":"YulIf","src":"7112:50:111"},{"nodeType":"YulVariableDeclaration","src":"7171:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7185:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7196:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7181:3:111"},"nodeType":"YulFunctionCall","src":"7181:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7175:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7242:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7251:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7254:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7244:6:111"},"nodeType":"YulFunctionCall","src":"7244:12:111"},"nodeType":"YulExpressionStatement","src":"7244:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7223:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7232:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7219:3:111"},"nodeType":"YulFunctionCall","src":"7219:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"7237:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7215:3:111"},"nodeType":"YulFunctionCall","src":"7215:26:111"},"nodeType":"YulIf","src":"7212:46:111"},{"nodeType":"YulAssignment","src":"7267:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"7277:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7267:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6961:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6972:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6984:6:111","type":""}],"src":"6891:394:111"},{"body":{"nodeType":"YulBlock","src":"7369:241:111","statements":[{"body":{"nodeType":"YulBlock","src":"7415:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7424:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7427:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7417:6:111"},"nodeType":"YulFunctionCall","src":"7417:12:111"},"nodeType":"YulExpressionStatement","src":"7417:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7390:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7399:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7386:3:111"},"nodeType":"YulFunctionCall","src":"7386:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7411:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7382:3:111"},"nodeType":"YulFunctionCall","src":"7382:32:111"},"nodeType":"YulIf","src":"7379:52:111"},{"nodeType":"YulVariableDeclaration","src":"7440:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7467:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7454:12:111"},"nodeType":"YulFunctionCall","src":"7454:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7444:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7520:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7529:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7532:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7522:6:111"},"nodeType":"YulFunctionCall","src":"7522:12:111"},"nodeType":"YulExpressionStatement","src":"7522:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7492:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7500:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7489:2:111"},"nodeType":"YulFunctionCall","src":"7489:30:111"},"nodeType":"YulIf","src":"7486:50:111"},{"nodeType":"YulAssignment","src":"7545:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7576:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7587:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7572:3:111"},"nodeType":"YulFunctionCall","src":"7572:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7596:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"7555:16:111"},"nodeType":"YulFunctionCall","src":"7555:49:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7545:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7335:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7346:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7358:6:111","type":""}],"src":"7290:320:111"},{"body":{"nodeType":"YulBlock","src":"7716:76:111","statements":[{"nodeType":"YulAssignment","src":"7726:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7738:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7749:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7734:3:111"},"nodeType":"YulFunctionCall","src":"7734:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7726:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7768:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7779:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7761:6:111"},"nodeType":"YulFunctionCall","src":"7761:25:111"},"nodeType":"YulExpressionStatement","src":"7761:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7685:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7696:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7707:4:111","type":""}],"src":"7615:177:111"},{"body":{"nodeType":"YulBlock","src":"7972:787:111","statements":[{"body":{"nodeType":"YulBlock","src":"8018:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8027:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8030:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8020:6:111"},"nodeType":"YulFunctionCall","src":"8020:12:111"},"nodeType":"YulExpressionStatement","src":"8020:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7993:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8002:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7989:3:111"},"nodeType":"YulFunctionCall","src":"7989:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8014:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7985:3:111"},"nodeType":"YulFunctionCall","src":"7985:32:111"},"nodeType":"YulIf","src":"7982:52:111"},{"nodeType":"YulVariableDeclaration","src":"8043:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8070:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8057:12:111"},"nodeType":"YulFunctionCall","src":"8057:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8047:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8089:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8099:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8093:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8144:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8153:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8156:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8146:6:111"},"nodeType":"YulFunctionCall","src":"8146:12:111"},"nodeType":"YulExpressionStatement","src":"8146:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8132:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8140:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8129:2:111"},"nodeType":"YulFunctionCall","src":"8129:14:111"},"nodeType":"YulIf","src":"8126:34:111"},{"nodeType":"YulVariableDeclaration","src":"8169:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8259:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8270:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8255:3:111"},"nodeType":"YulFunctionCall","src":"8255:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8279:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"8195:59:111"},"nodeType":"YulFunctionCall","src":"8195:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"8173:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"8183:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8296:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"8306:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8296:6:111"}]},{"nodeType":"YulAssignment","src":"8323:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"8333:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8323:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8350:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8383:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8394:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8379:3:111"},"nodeType":"YulFunctionCall","src":"8379:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8366:12:111"},"nodeType":"YulFunctionCall","src":"8366:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"8354:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8427:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8436:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8439:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8429:6:111"},"nodeType":"YulFunctionCall","src":"8429:12:111"},"nodeType":"YulExpressionStatement","src":"8429:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"8413:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8423:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8410:2:111"},"nodeType":"YulFunctionCall","src":"8410:16:111"},"nodeType":"YulIf","src":"8407:36:111"},{"nodeType":"YulVariableDeclaration","src":"8452:34:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8466:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"8477:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8462:3:111"},"nodeType":"YulFunctionCall","src":"8462:24:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"8456:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8534:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8543:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8546:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8536:6:111"},"nodeType":"YulFunctionCall","src":"8536:12:111"},"nodeType":"YulExpressionStatement","src":"8536:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"8513:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"8517:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8509:3:111"},"nodeType":"YulFunctionCall","src":"8509:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8524:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8505:3:111"},"nodeType":"YulFunctionCall","src":"8505:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8498:6:111"},"nodeType":"YulFunctionCall","src":"8498:35:111"},"nodeType":"YulIf","src":"8495:55:111"},{"nodeType":"YulVariableDeclaration","src":"8559:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"8586:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8573:12:111"},"nodeType":"YulFunctionCall","src":"8573:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"8563:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8616:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8625:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8628:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8618:6:111"},"nodeType":"YulFunctionCall","src":"8618:12:111"},"nodeType":"YulExpressionStatement","src":"8618:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"8604:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8612:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8601:2:111"},"nodeType":"YulFunctionCall","src":"8601:14:111"},"nodeType":"YulIf","src":"8598:34:111"},{"body":{"nodeType":"YulBlock","src":"8682:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8691:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8694:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8684:6:111"},"nodeType":"YulFunctionCall","src":"8684:12:111"},"nodeType":"YulExpressionStatement","src":"8684:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"8655:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"8659:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8651:3:111"},"nodeType":"YulFunctionCall","src":"8651:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"8668:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8647:3:111"},"nodeType":"YulFunctionCall","src":"8647:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8673:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8644:2:111"},"nodeType":"YulFunctionCall","src":"8644:37:111"},"nodeType":"YulIf","src":"8641:57:111"},{"nodeType":"YulAssignment","src":"8707:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"8721:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"8725:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8717:3:111"},"nodeType":"YulFunctionCall","src":"8717:11:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8707:6:111"}]},{"nodeType":"YulAssignment","src":"8737:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"8747:6:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8737:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7914:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7925:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7937:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7945:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7953:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7961:6:111","type":""}],"src":"7797:962:111"},{"body":{"nodeType":"YulBlock","src":"8796:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8813:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8816:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8806:6:111"},"nodeType":"YulFunctionCall","src":"8806:88:111"},"nodeType":"YulExpressionStatement","src":"8806:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8910:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"8913:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8903:6:111"},"nodeType":"YulFunctionCall","src":"8903:15:111"},"nodeType":"YulExpressionStatement","src":"8903:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8934:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8937:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8927:6:111"},"nodeType":"YulFunctionCall","src":"8927:15:111"},"nodeType":"YulExpressionStatement","src":"8927:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"8764:184:111"},{"body":{"nodeType":"YulBlock","src":"9062:281:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9072:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"9111:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9098:12:111"},"nodeType":"YulFunctionCall","src":"9098:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"9076:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9271:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9280:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9283:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9273:6:111"},"nodeType":"YulFunctionCall","src":"9273:12:111"},"nodeType":"YulExpressionStatement","src":"9273:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9146:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9174:12:111"},"nodeType":"YulFunctionCall","src":"9174:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"9190:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9170:3:111"},"nodeType":"YulFunctionCall","src":"9170:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"9201:66:111","type":"","value":"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9166:3:111"},"nodeType":"YulFunctionCall","src":"9166:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9142:3:111"},"nodeType":"YulFunctionCall","src":"9142:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9135:6:111"},"nodeType":"YulFunctionCall","src":"9135:135:111"},"nodeType":"YulIf","src":"9132:155:111"},{"nodeType":"YulAssignment","src":"9296:41:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"9308:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9318:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9304:3:111"},"nodeType":"YulFunctionCall","src":"9304:33:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"9296:4:111"}]}]},"name":"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"9027:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"9037:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"9053:4:111","type":""}],"src":"8953:390:111"},{"body":{"nodeType":"YulBlock","src":"9442:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9452:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"9491:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9478:12:111"},"nodeType":"YulFunctionCall","src":"9478:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"9456:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9651:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9660:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9663:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9653:6:111"},"nodeType":"YulFunctionCall","src":"9653:12:111"},"nodeType":"YulExpressionStatement","src":"9653:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9526:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9554:12:111"},"nodeType":"YulFunctionCall","src":"9554:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"9570:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9550:3:111"},"nodeType":"YulFunctionCall","src":"9550:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"9581:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9546:3:111"},"nodeType":"YulFunctionCall","src":"9546:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9522:3:111"},"nodeType":"YulFunctionCall","src":"9522:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9515:6:111"},"nodeType":"YulFunctionCall","src":"9515:135:111"},"nodeType":"YulIf","src":"9512:155:111"},{"nodeType":"YulVariableDeclaration","src":"9676:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"9694:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9704:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9690:3:111"},"nodeType":"YulFunctionCall","src":"9690:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"9680:6:111","type":""}]},{"nodeType":"YulAssignment","src":"9732:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9755:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9742:12:111"},"nodeType":"YulFunctionCall","src":"9742:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"9732:6:111"}]},{"body":{"nodeType":"YulBlock","src":"9805:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9814:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9817:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9807:6:111"},"nodeType":"YulFunctionCall","src":"9807:12:111"},"nodeType":"YulExpressionStatement","src":"9807:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"9777:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9785:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9774:2:111"},"nodeType":"YulFunctionCall","src":"9774:30:111"},"nodeType":"YulIf","src":"9771:50:111"},{"nodeType":"YulAssignment","src":"9830:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9842:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9850:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9838:3:111"},"nodeType":"YulFunctionCall","src":"9838:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"9830:4:111"}]},{"body":{"nodeType":"YulBlock","src":"9906:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9915:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9918:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9908:6:111"},"nodeType":"YulFunctionCall","src":"9908:12:111"},"nodeType":"YulExpressionStatement","src":"9908:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"9871:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9881:12:111"},"nodeType":"YulFunctionCall","src":"9881:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"9897:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9877:3:111"},"nodeType":"YulFunctionCall","src":"9877:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"9867:3:111"},"nodeType":"YulFunctionCall","src":"9867:38:111"},"nodeType":"YulIf","src":"9864:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"9399:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"9409:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"9425:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"9431:6:111","type":""}],"src":"9348:580:111"},{"body":{"nodeType":"YulBlock","src":"10020:161:111","statements":[{"body":{"nodeType":"YulBlock","src":"10066:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10075:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10078:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10068:6:111"},"nodeType":"YulFunctionCall","src":"10068:12:111"},"nodeType":"YulExpressionStatement","src":"10068:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10041:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10050:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10037:3:111"},"nodeType":"YulFunctionCall","src":"10037:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10062:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10033:3:111"},"nodeType":"YulFunctionCall","src":"10033:32:111"},"nodeType":"YulIf","src":"10030:52:111"},{"nodeType":"YulAssignment","src":"10091:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10114:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10101:12:111"},"nodeType":"YulFunctionCall","src":"10101:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10091:6:111"}]},{"nodeType":"YulAssignment","src":"10133:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10160:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10171:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10156:3:111"},"nodeType":"YulFunctionCall","src":"10156:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10143:12:111"},"nodeType":"YulFunctionCall","src":"10143:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10133:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9978:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9989:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10001:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10009:6:111","type":""}],"src":"9933:248:111"},{"body":{"nodeType":"YulBlock","src":"10218:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10235:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10238:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10228:6:111"},"nodeType":"YulFunctionCall","src":"10228:88:111"},"nodeType":"YulExpressionStatement","src":"10228:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10332:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"10335:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10325:6:111"},"nodeType":"YulFunctionCall","src":"10325:15:111"},"nodeType":"YulExpressionStatement","src":"10325:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10356:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10359:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10349:6:111"},"nodeType":"YulFunctionCall","src":"10349:15:111"},"nodeType":"YulExpressionStatement","src":"10349:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"10186:184:111"},{"body":{"nodeType":"YulBlock","src":"10422:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"10513:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"10515:16:111"},"nodeType":"YulFunctionCall","src":"10515:18:111"},"nodeType":"YulExpressionStatement","src":"10515:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10438:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"10445:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"10435:2:111"},"nodeType":"YulFunctionCall","src":"10435:77:111"},"nodeType":"YulIf","src":"10432:103:111"},{"nodeType":"YulAssignment","src":"10544:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10555:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"10562:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10551:3:111"},"nodeType":"YulFunctionCall","src":"10551:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"10544:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"10404:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"10414:3:111","type":""}],"src":"10375:195:111"},{"body":{"nodeType":"YulBlock","src":"10704:119:111","statements":[{"nodeType":"YulAssignment","src":"10714:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10726:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10737:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10722:3:111"},"nodeType":"YulFunctionCall","src":"10722:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10714:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10756:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"10767:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10749:6:111"},"nodeType":"YulFunctionCall","src":"10749:25:111"},"nodeType":"YulExpressionStatement","src":"10749:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10794:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10805:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10790:3:111"},"nodeType":"YulFunctionCall","src":"10790:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"10810:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10783:6:111"},"nodeType":"YulFunctionCall","src":"10783:34:111"},"nodeType":"YulExpressionStatement","src":"10783:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10665:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10676:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10684:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10695:4:111","type":""}],"src":"10575:248:111"},{"body":{"nodeType":"YulBlock","src":"10927:93:111","statements":[{"nodeType":"YulAssignment","src":"10937:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10949:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10960:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10945:3:111"},"nodeType":"YulFunctionCall","src":"10945:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10937:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10979:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10994:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11002:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10990:3:111"},"nodeType":"YulFunctionCall","src":"10990:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10972:6:111"},"nodeType":"YulFunctionCall","src":"10972:42:111"},"nodeType":"YulExpressionStatement","src":"10972:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10896:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10907:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10918:4:111","type":""}],"src":"10828:192:111"},{"body":{"nodeType":"YulBlock","src":"11129:661:111","statements":[{"body":{"nodeType":"YulBlock","src":"11176:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11185:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11188:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11178:6:111"},"nodeType":"YulFunctionCall","src":"11178:12:111"},"nodeType":"YulExpressionStatement","src":"11178:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11150:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11159:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11146:3:111"},"nodeType":"YulFunctionCall","src":"11146:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11171:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11142:3:111"},"nodeType":"YulFunctionCall","src":"11142:33:111"},"nodeType":"YulIf","src":"11139:53:111"},{"body":{"nodeType":"YulBlock","src":"11247:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11256:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11259:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11249:6:111"},"nodeType":"YulFunctionCall","src":"11249:12:111"},"nodeType":"YulExpressionStatement","src":"11249:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11219:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11230:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11215:3:111"},"nodeType":"YulFunctionCall","src":"11215:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11237:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11211:3:111"},"nodeType":"YulFunctionCall","src":"11211:34:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11204:6:111"},"nodeType":"YulFunctionCall","src":"11204:42:111"},"nodeType":"YulIf","src":"11201:62:111"},{"nodeType":"YulVariableDeclaration","src":"11272:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11292:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11286:5:111"},"nodeType":"YulFunctionCall","src":"11286:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"11276:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11304:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"11326:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11334:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11322:3:111"},"nodeType":"YulFunctionCall","src":"11322:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"11308:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11413:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"11415:16:111"},"nodeType":"YulFunctionCall","src":"11415:18:111"},"nodeType":"YulExpressionStatement","src":"11415:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"11356:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"11368:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11353:2:111"},"nodeType":"YulFunctionCall","src":"11353:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"11392:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"11404:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11389:2:111"},"nodeType":"YulFunctionCall","src":"11389:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"11350:2:111"},"nodeType":"YulFunctionCall","src":"11350:62:111"},"nodeType":"YulIf","src":"11347:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11451:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"11455:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11444:6:111"},"nodeType":"YulFunctionCall","src":"11444:22:111"},"nodeType":"YulExpressionStatement","src":"11444:22:111"},{"nodeType":"YulVariableDeclaration","src":"11475:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"11486:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"11479:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11501:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11519:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11530:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11515:3:111"},"nodeType":"YulFunctionCall","src":"11515:19:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"11505:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11566:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11575:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11578:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11568:6:111"},"nodeType":"YulFunctionCall","src":"11568:12:111"},"nodeType":"YulExpressionStatement","src":"11568:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"11549:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11557:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11546:2:111"},"nodeType":"YulFunctionCall","src":"11546:19:111"},"nodeType":"YulIf","src":"11543:39:111"},{"nodeType":"YulVariableDeclaration","src":"11591:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"11602:9:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"11595:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11678:81:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11699:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"11710:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11704:5:111"},"nodeType":"YulFunctionCall","src":"11704:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11692:6:111"},"nodeType":"YulFunctionCall","src":"11692:23:111"},"nodeType":"YulExpressionStatement","src":"11692:23:111"},{"nodeType":"YulAssignment","src":"11728:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11739:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11744:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11735:3:111"},"nodeType":"YulFunctionCall","src":"11735:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"11728:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"11631:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"11636:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11628:2:111"},"nodeType":"YulFunctionCall","src":"11628:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"11644:25:111","statements":[{"nodeType":"YulAssignment","src":"11646:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"11657:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11662:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11653:3:111"},"nodeType":"YulFunctionCall","src":"11653:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"11646:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"11624:3:111","statements":[]},"src":"11620:139:111"},{"nodeType":"YulAssignment","src":"11768:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"11778:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11768:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11095:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11106:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11118:6:111","type":""}],"src":"11025:765:111"},{"body":{"nodeType":"YulBlock","src":"11888:498:111","statements":[{"body":{"nodeType":"YulBlock","src":"11934:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11943:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11946:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11936:6:111"},"nodeType":"YulFunctionCall","src":"11936:12:111"},"nodeType":"YulExpressionStatement","src":"11936:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11909:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11918:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11905:3:111"},"nodeType":"YulFunctionCall","src":"11905:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11930:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11901:3:111"},"nodeType":"YulFunctionCall","src":"11901:32:111"},"nodeType":"YulIf","src":"11898:52:111"},{"body":{"nodeType":"YulBlock","src":"12005:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12017:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12007:6:111"},"nodeType":"YulFunctionCall","src":"12007:12:111"},"nodeType":"YulExpressionStatement","src":"12007:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11977:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11988:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11973:3:111"},"nodeType":"YulFunctionCall","src":"11973:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11995:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11969:3:111"},"nodeType":"YulFunctionCall","src":"11969:34:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11962:6:111"},"nodeType":"YulFunctionCall","src":"11962:42:111"},"nodeType":"YulIf","src":"11959:62:111"},{"nodeType":"YulVariableDeclaration","src":"12030:28:111","value":{"arguments":[],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"12041:15:111"},"nodeType":"YulFunctionCall","src":"12041:17:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"12034:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12067:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"12080:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"12071:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12092:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12110:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12121:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12106:3:111"},"nodeType":"YulFunctionCall","src":"12106:18:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"12096:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12156:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12168:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12158:6:111"},"nodeType":"YulFunctionCall","src":"12158:12:111"},"nodeType":"YulExpressionStatement","src":"12158:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"12139:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"12147:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12136:2:111"},"nodeType":"YulFunctionCall","src":"12136:19:111"},"nodeType":"YulIf","src":"12133:39:111"},{"nodeType":"YulVariableDeclaration","src":"12181:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"12192:9:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"12185:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12268:88:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"12289:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"12307:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12294:12:111"},"nodeType":"YulFunctionCall","src":"12294:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12282:6:111"},"nodeType":"YulFunctionCall","src":"12282:30:111"},"nodeType":"YulExpressionStatement","src":"12282:30:111"},{"nodeType":"YulAssignment","src":"12325:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"12336:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12341:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12332:3:111"},"nodeType":"YulFunctionCall","src":"12332:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"12325:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"12221:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"12226:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"12218:2:111"},"nodeType":"YulFunctionCall","src":"12218:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"12234:25:111","statements":[{"nodeType":"YulAssignment","src":"12236:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"12247:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"12252:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12243:3:111"},"nodeType":"YulFunctionCall","src":"12243:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"12236:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"12214:3:111","statements":[]},"src":"12210:146:111"},{"nodeType":"YulAssignment","src":"12365:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"12375:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"12365:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11854:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11865:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11877:6:111","type":""}],"src":"11795:591:111"},{"body":{"nodeType":"YulBlock","src":"12521:83:111","statements":[{"nodeType":"YulAssignment","src":"12531:67:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12576:5:111"},{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12583:12:111"},"nodeType":"YulFunctionCall","src":"12583:14:111"}],"functionName":{"name":"abi_decode_struct_UserOperation","nodeType":"YulIdentifier","src":"12544:31:111"},"nodeType":"YulFunctionCall","src":"12544:54:111"},"variableNames":[{"name":"converted","nodeType":"YulIdentifier","src":"12531:9:111"}]}]},"name":"convert_t_struct$_UserOperation_$10993_calldata_ptr_to_t_struct$_UserOperation_$10993_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"12497:5:111","type":""}],"returnVariables":[{"name":"converted","nodeType":"YulTypedName","src":"12507:9:111","type":""}],"src":"12391:213:111"},{"body":{"nodeType":"YulBlock","src":"12684:276:111","statements":[{"nodeType":"YulAssignment","src":"12694:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"12701:3:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"12694:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"12713:19:111","value":{"name":"value","nodeType":"YulIdentifier","src":"12727:5:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"12717:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12741:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12750:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"12745:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12807:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12828:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"12839:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12833:5:111"},"nodeType":"YulFunctionCall","src":"12833:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12821:6:111"},"nodeType":"YulFunctionCall","src":"12821:26:111"},"nodeType":"YulExpressionStatement","src":"12821:26:111"},{"nodeType":"YulVariableDeclaration","src":"12860:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12870:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"12864:2:111","type":""}]},{"nodeType":"YulAssignment","src":"12887:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12898:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12903:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12894:3:111"},"nodeType":"YulFunctionCall","src":"12894:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"12887:3:111"}]},{"nodeType":"YulAssignment","src":"12919:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"12933:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12941:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12929:3:111"},"nodeType":"YulFunctionCall","src":"12929:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"12919:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"12771:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"12774:4:111","type":"","value":"0x02"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"12768:2:111"},"nodeType":"YulFunctionCall","src":"12768:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"12780:18:111","statements":[{"nodeType":"YulAssignment","src":"12782:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"12791:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"12794:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12787:3:111"},"nodeType":"YulFunctionCall","src":"12787:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"12782:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"12764:3:111","statements":[]},"src":"12760:194:111"}]},"name":"abi_encode_array_uint256_to_array_uint256_library","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"12668:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"12675:3:111","type":""}],"src":"12609:351:111"},{"body":{"nodeType":"YulBlock","src":"13015:276:111","statements":[{"nodeType":"YulAssignment","src":"13025:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"13032:3:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"13025:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"13044:19:111","value":{"name":"value","nodeType":"YulIdentifier","src":"13058:5:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"13048:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13072:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13081:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"13076:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"13138:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"13159:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"13170:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13164:5:111"},"nodeType":"YulFunctionCall","src":"13164:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13152:6:111"},"nodeType":"YulFunctionCall","src":"13152:26:111"},"nodeType":"YulExpressionStatement","src":"13152:26:111"},{"nodeType":"YulVariableDeclaration","src":"13191:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13201:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"13195:2:111","type":""}]},{"nodeType":"YulAssignment","src":"13218:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"13229:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13234:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13225:3:111"},"nodeType":"YulFunctionCall","src":"13225:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"13218:3:111"}]},{"nodeType":"YulAssignment","src":"13250:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"13264:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13272:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13260:3:111"},"nodeType":"YulFunctionCall","src":"13260:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"13250:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"13102:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"13105:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13099:2:111"},"nodeType":"YulFunctionCall","src":"13099:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"13111:18:111","statements":[{"nodeType":"YulAssignment","src":"13113:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"13122:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"13125:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13118:3:111"},"nodeType":"YulFunctionCall","src":"13118:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"13113:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"13095:3:111","statements":[]},"src":"13091:194:111"}]},"name":"abi_encode_array_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"12999:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"13006:3:111","type":""}],"src":"12965:326:111"},{"body":{"nodeType":"YulBlock","src":"13599:268:111","statements":[{"nodeType":"YulAssignment","src":"13609:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13621:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13632:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13617:3:111"},"nodeType":"YulFunctionCall","src":"13617:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13609:4:111"}]},{"expression":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13695:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13703:9:111"}],"functionName":{"name":"abi_encode_array_uint256_to_array_uint256_library","nodeType":"YulIdentifier","src":"13645:49:111"},"nodeType":"YulFunctionCall","src":"13645:68:111"},"nodeType":"YulExpressionStatement","src":"13645:68:111"},{"expression":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"13747:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13770:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13755:3:111"},"nodeType":"YulFunctionCall","src":"13755:18:111"}],"functionName":{"name":"abi_encode_array_uint256","nodeType":"YulIdentifier","src":"13722:24:111"},"nodeType":"YulFunctionCall","src":"13722:52:111"},"nodeType":"YulExpressionStatement","src":"13722:52:111"},{"expression":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"13833:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13856:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13841:3:111"},"nodeType":"YulFunctionCall","src":"13841:19:111"}],"functionName":{"name":"abi_encode_array_uint256_to_array_uint256_library","nodeType":"YulIdentifier","src":"13783:49:111"},"nodeType":"YulFunctionCall","src":"13783:78:111"},"nodeType":"YulExpressionStatement","src":"13783:78:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13552:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13563:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13571:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13579:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13590:4:111","type":""}],"src":"13296:571:111"},{"body":{"nodeType":"YulBlock","src":"13950:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"13996:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14005:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14008:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13998:6:111"},"nodeType":"YulFunctionCall","src":"13998:12:111"},"nodeType":"YulExpressionStatement","src":"13998:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13971:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13980:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13967:3:111"},"nodeType":"YulFunctionCall","src":"13967:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13992:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13963:3:111"},"nodeType":"YulFunctionCall","src":"13963:32:111"},"nodeType":"YulIf","src":"13960:52:111"},{"nodeType":"YulVariableDeclaration","src":"14021:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14040:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14034:5:111"},"nodeType":"YulFunctionCall","src":"14034:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"14025:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"14103:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14112:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14115:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14105:6:111"},"nodeType":"YulFunctionCall","src":"14105:12:111"},"nodeType":"YulExpressionStatement","src":"14105:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14072:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14093:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14086:6:111"},"nodeType":"YulFunctionCall","src":"14086:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14079:6:111"},"nodeType":"YulFunctionCall","src":"14079:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"14069:2:111"},"nodeType":"YulFunctionCall","src":"14069:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14062:6:111"},"nodeType":"YulFunctionCall","src":"14062:40:111"},"nodeType":"YulIf","src":"14059:60:111"},{"nodeType":"YulAssignment","src":"14128:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"14138:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"14128:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13916:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13927:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13939:6:111","type":""}],"src":"13872:277:111"},{"body":{"nodeType":"YulBlock","src":"14328:164:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14345:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14356:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14338:6:111"},"nodeType":"YulFunctionCall","src":"14338:21:111"},"nodeType":"YulExpressionStatement","src":"14338:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14379:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14390:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14375:3:111"},"nodeType":"YulFunctionCall","src":"14375:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14395:2:111","type":"","value":"14"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14368:6:111"},"nodeType":"YulFunctionCall","src":"14368:30:111"},"nodeType":"YulExpressionStatement","src":"14368:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14418:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14429:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14414:3:111"},"nodeType":"YulFunctionCall","src":"14414:18:111"},{"hexValue":"424c533a2077726f6e6720736967","kind":"string","nodeType":"YulLiteral","src":"14434:16:111","type":"","value":"BLS: wrong sig"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14407:6:111"},"nodeType":"YulFunctionCall","src":"14407:44:111"},"nodeType":"YulExpressionStatement","src":"14407:44:111"},{"nodeType":"YulAssignment","src":"14460:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14483:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14468:3:111"},"nodeType":"YulFunctionCall","src":"14468:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14460:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4145b59d57ae2f5f0851e5de83c7fb2657aa25911319fc4a072ca80b43f5bde8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14305:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14319:4:111","type":""}],"src":"14154:338:111"},{"body":{"nodeType":"YulBlock","src":"14671:172:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14688:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14699:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14681:6:111"},"nodeType":"YulFunctionCall","src":"14681:21:111"},"nodeType":"YulExpressionStatement","src":"14681:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14722:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14733:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14718:3:111"},"nodeType":"YulFunctionCall","src":"14718:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14738:2:111","type":"","value":"22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14711:6:111"},"nodeType":"YulFunctionCall","src":"14711:30:111"},"nodeType":"YulExpressionStatement","src":"14711:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14761:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14772:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14757:3:111"},"nodeType":"YulFunctionCall","src":"14757:18:111"},{"hexValue":"6461746120746f6f2073686f727420666f7220736967","kind":"string","nodeType":"YulLiteral","src":"14777:24:111","type":"","value":"data too short for sig"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14750:6:111"},"nodeType":"YulFunctionCall","src":"14750:52:111"},"nodeType":"YulExpressionStatement","src":"14750:52:111"},{"nodeType":"YulAssignment","src":"14811:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14823:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14834:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14819:3:111"},"nodeType":"YulFunctionCall","src":"14819:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14811:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2def5c28206cb0e6164070fcb51feafff201d12ca54bd3e0a3892357496d8fff__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14648:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14662:4:111","type":""}],"src":"14497:346:111"},{"body":{"nodeType":"YulBlock","src":"15022:172:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15039:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15050:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15032:6:111"},"nodeType":"YulFunctionCall","src":"15032:21:111"},"nodeType":"YulExpressionStatement","src":"15032:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15073:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15084:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15069:3:111"},"nodeType":"YulFunctionCall","src":"15069:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15089:2:111","type":"","value":"22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15062:6:111"},"nodeType":"YulFunctionCall","src":"15062:30:111"},"nodeType":"YulExpressionStatement","src":"15062:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15112:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15123:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15108:3:111"},"nodeType":"YulFunctionCall","src":"15108:18:111"},{"hexValue":"424c533a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"15128:24:111","type":"","value":"BLS: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15101:6:111"},"nodeType":"YulFunctionCall","src":"15101:52:111"},"nodeType":"YulExpressionStatement","src":"15101:52:111"},{"nodeType":"YulAssignment","src":"15162:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15170:3:111"},"nodeType":"YulFunctionCall","src":"15170:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15162:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_be923b909b7eb750f013b66ddb441626fcead463bfc2bef068b4a957ee0dca0c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14999:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15013:4:111","type":""}],"src":"14848:346:111"},{"body":{"nodeType":"YulBlock","src":"15602:1114:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15612:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15622:3:111","type":"","value":"128"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"15616:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15634:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15652:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"15663:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15648:3:111"},"nodeType":"YulFunctionCall","src":"15648:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"15638:6:111","type":""}]},{"expression":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15725:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15733:9:111"}],"functionName":{"name":"abi_encode_array_uint256_to_array_uint256_library","nodeType":"YulIdentifier","src":"15675:49:111"},"nodeType":"YulFunctionCall","src":"15675:68:111"},"nodeType":"YulExpressionStatement","src":"15675:68:111"},{"nodeType":"YulVariableDeclaration","src":"15752:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15762:2:111","type":"","value":"64"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"15756:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15784:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"15795:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15780:3:111"},"nodeType":"YulFunctionCall","src":"15780:18:111"},{"name":"_1","nodeType":"YulIdentifier","src":"15800:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15773:6:111"},"nodeType":"YulFunctionCall","src":"15773:30:111"},"nodeType":"YulExpressionStatement","src":"15773:30:111"},{"nodeType":"YulVariableDeclaration","src":"15812:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"15823:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"15816:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15838:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15858:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15852:5:111"},"nodeType":"YulFunctionCall","src":"15852:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15842:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"15881:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"15889:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15874:6:111"},"nodeType":"YulFunctionCall","src":"15874:22:111"},"nodeType":"YulExpressionStatement","src":"15874:22:111"},{"nodeType":"YulAssignment","src":"15905:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15916:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15927:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15912:3:111"},"nodeType":"YulFunctionCall","src":"15912:19:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"15905:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"15940:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15950:4:111","type":"","value":"0x20"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"15944:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15963:29:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15981:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"15989:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15977:3:111"},"nodeType":"YulFunctionCall","src":"15977:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"15967:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16001:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16010:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"16005:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16069:138:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"16114:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16108:5:111"},"nodeType":"YulFunctionCall","src":"16108:13:111"},{"name":"pos","nodeType":"YulIdentifier","src":"16123:3:111"}],"functionName":{"name":"abi_encode_array_uint256","nodeType":"YulIdentifier","src":"16083:24:111"},"nodeType":"YulFunctionCall","src":"16083:44:111"},"nodeType":"YulExpressionStatement","src":"16083:44:111"},{"nodeType":"YulAssignment","src":"16140:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"16151:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"16156:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16147:3:111"},"nodeType":"YulFunctionCall","src":"16147:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"16140:3:111"}]},{"nodeType":"YulAssignment","src":"16172:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"16186:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"16194:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16182:3:111"},"nodeType":"YulFunctionCall","src":"16182:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"16172:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16031:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16034:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16028:2:111"},"nodeType":"YulFunctionCall","src":"16028:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"16042:18:111","statements":[{"nodeType":"YulAssignment","src":"16044:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16053:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"16056:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16049:3:111"},"nodeType":"YulFunctionCall","src":"16049:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"16044:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"16024:3:111","statements":[]},"src":"16020:187:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16227:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16238:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16223:3:111"},"nodeType":"YulFunctionCall","src":"16223:18:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"16247:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"16252:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16243:3:111"},"nodeType":"YulFunctionCall","src":"16243:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16216:6:111"},"nodeType":"YulFunctionCall","src":"16216:47:111"},"nodeType":"YulExpressionStatement","src":"16216:47:111"},{"nodeType":"YulVariableDeclaration","src":"16272:16:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"16285:3:111"},"variables":[{"name":"pos_1","nodeType":"YulTypedName","src":"16276:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16297:29:111","value":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"16319:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16313:5:111"},"nodeType":"YulFunctionCall","src":"16313:13:111"},"variables":[{"name":"length_1","nodeType":"YulTypedName","src":"16301:8:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"16342:3:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"16347:8:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16335:6:111"},"nodeType":"YulFunctionCall","src":"16335:21:111"},"nodeType":"YulExpressionStatement","src":"16335:21:111"},{"nodeType":"YulAssignment","src":"16365:21:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"16378:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"16383:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16374:3:111"},"nodeType":"YulFunctionCall","src":"16374:12:111"},"variableNames":[{"name":"pos_1","nodeType":"YulIdentifier","src":"16365:5:111"}]},{"nodeType":"YulVariableDeclaration","src":"16395:31:111","value":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"16415:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"16423:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16411:3:111"},"nodeType":"YulFunctionCall","src":"16411:15:111"},"variables":[{"name":"srcPtr_1","nodeType":"YulTypedName","src":"16399:8:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16435:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16446:1:111","type":"","value":"0"},"variables":[{"name":"i_1","nodeType":"YulTypedName","src":"16439:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16513:175:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"srcPtr_1","nodeType":"YulIdentifier","src":"16583:8:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16577:5:111"},"nodeType":"YulFunctionCall","src":"16577:15:111"},{"name":"pos_1","nodeType":"YulIdentifier","src":"16594:5:111"}],"functionName":{"name":"abi_encode_array_uint256_to_array_uint256_library","nodeType":"YulIdentifier","src":"16527:49:111"},"nodeType":"YulFunctionCall","src":"16527:73:111"},"nodeType":"YulExpressionStatement","src":"16527:73:111"},{"nodeType":"YulAssignment","src":"16613:23:111","value":{"arguments":[{"name":"pos_1","nodeType":"YulIdentifier","src":"16626:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16633:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16622:3:111"},"nodeType":"YulFunctionCall","src":"16622:14:111"},"variableNames":[{"name":"pos_1","nodeType":"YulIdentifier","src":"16613:5:111"}]},{"nodeType":"YulAssignment","src":"16649:29:111","value":{"arguments":[{"name":"srcPtr_1","nodeType":"YulIdentifier","src":"16665:8:111"},{"name":"_3","nodeType":"YulIdentifier","src":"16675:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16661:3:111"},"nodeType":"YulFunctionCall","src":"16661:17:111"},"variableNames":[{"name":"srcPtr_1","nodeType":"YulIdentifier","src":"16649:8:111"}]}]},"condition":{"arguments":[{"name":"i_1","nodeType":"YulIdentifier","src":"16467:3:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"16472:8:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16464:2:111"},"nodeType":"YulFunctionCall","src":"16464:17:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"16482:22:111","statements":[{"nodeType":"YulAssignment","src":"16484:18:111","value":{"arguments":[{"name":"i_1","nodeType":"YulIdentifier","src":"16495:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"16500:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16491:3:111"},"nodeType":"YulFunctionCall","src":"16491:11:111"},"variableNames":[{"name":"i_1","nodeType":"YulIdentifier","src":"16484:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"16460:3:111","statements":[]},"src":"16456:232:111"},{"nodeType":"YulAssignment","src":"16697:13:111","value":{"name":"pos_1","nodeType":"YulIdentifier","src":"16705:5:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16697:4:111"}]}]},"name":"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__fromStack_library_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15555:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"15566:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15574:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15582:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15593:4:111","type":""}],"src":"15199:1517:111"},{"body":{"nodeType":"YulBlock","src":"16895:180:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16912:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16923:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16905:6:111"},"nodeType":"YulFunctionCall","src":"16905:21:111"},"nodeType":"YulExpressionStatement","src":"16905:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16946:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16957:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16942:3:111"},"nodeType":"YulFunctionCall","src":"16942:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16962:2:111","type":"","value":"30"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16935:6:111"},"nodeType":"YulFunctionCall","src":"16935:30:111"},"nodeType":"YulExpressionStatement","src":"16935:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16985:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16996:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16981:3:111"},"nodeType":"YulFunctionCall","src":"16981:18:111"},{"hexValue":"424c533a2076616c69646174655369676e617475726573206661696c6564","kind":"string","nodeType":"YulLiteral","src":"17001:32:111","type":"","value":"BLS: validateSignatures failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16974:6:111"},"nodeType":"YulFunctionCall","src":"16974:60:111"},"nodeType":"YulExpressionStatement","src":"16974:60:111"},{"nodeType":"YulAssignment","src":"17043:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17066:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17051:3:111"},"nodeType":"YulFunctionCall","src":"17051:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17043:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_23023282b0f59631a4352146b09b85b58fd6d0cc04d93c3b2f62d5ff0f501f0b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16872:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16886:4:111","type":""}],"src":"16721:354:111"},{"body":{"nodeType":"YulBlock","src":"17199:63:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17216:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"17221:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17209:6:111"},"nodeType":"YulFunctionCall","src":"17209:19:111"},"nodeType":"YulExpressionStatement","src":"17209:19:111"},{"nodeType":"YulAssignment","src":"17237:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17248:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17253:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17244:3:111"},"nodeType":"YulFunctionCall","src":"17244:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17237:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes32__to_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17175:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17180:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17191:3:111","type":""}],"src":"17080:182:111"},{"body":{"nodeType":"YulBlock","src":"17422:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17439:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"17450:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17432:6:111"},"nodeType":"YulFunctionCall","src":"17432:25:111"},"nodeType":"YulExpressionStatement","src":"17432:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17477:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17488:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17473:3:111"},"nodeType":"YulFunctionCall","src":"17473:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17493:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17466:6:111"},"nodeType":"YulFunctionCall","src":"17466:30:111"},"nodeType":"YulExpressionStatement","src":"17466:30:111"},{"nodeType":"YulAssignment","src":"17505:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"17530:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17542:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17553:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17538:3:111"},"nodeType":"YulFunctionCall","src":"17538:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"17513:16:111"},"nodeType":"YulFunctionCall","src":"17513:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17505:4:111"}]}]},"name":"abi_encode_tuple_t_bytes32_t_bytes_memory_ptr__to_t_bytes32_t_bytes_memory_ptr__fromStack_library_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17383:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"17394:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17402:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17413:4:111","type":""}],"src":"17267:296:111"},{"body":{"nodeType":"YulBlock","src":"17672:491:111","statements":[{"body":{"nodeType":"YulBlock","src":"17718:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17727:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17730:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17720:6:111"},"nodeType":"YulFunctionCall","src":"17720:12:111"},"nodeType":"YulExpressionStatement","src":"17720:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"17693:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17702:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17689:3:111"},"nodeType":"YulFunctionCall","src":"17689:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"17714:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17685:3:111"},"nodeType":"YulFunctionCall","src":"17685:32:111"},"nodeType":"YulIf","src":"17682:52:111"},{"body":{"nodeType":"YulBlock","src":"17789:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17798:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17801:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17791:6:111"},"nodeType":"YulFunctionCall","src":"17791:12:111"},"nodeType":"YulExpressionStatement","src":"17791:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17761:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17772:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17757:3:111"},"nodeType":"YulFunctionCall","src":"17757:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"17779:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17753:3:111"},"nodeType":"YulFunctionCall","src":"17753:34:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17746:6:111"},"nodeType":"YulFunctionCall","src":"17746:42:111"},"nodeType":"YulIf","src":"17743:62:111"},{"nodeType":"YulVariableDeclaration","src":"17814:28:111","value":{"arguments":[],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"17825:15:111"},"nodeType":"YulFunctionCall","src":"17825:17:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"17818:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17851:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"17864:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"17855:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17876:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17894:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17905:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17890:3:111"},"nodeType":"YulFunctionCall","src":"17890:18:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"17880:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"17940:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17949:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17952:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17942:6:111"},"nodeType":"YulFunctionCall","src":"17942:12:111"},"nodeType":"YulExpressionStatement","src":"17942:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"17923:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"17931:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"17920:2:111"},"nodeType":"YulFunctionCall","src":"17920:19:111"},"nodeType":"YulIf","src":"17917:39:111"},{"nodeType":"YulVariableDeclaration","src":"17965:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"17976:9:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"17969:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"18052:81:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"18073:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"18084:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18078:5:111"},"nodeType":"YulFunctionCall","src":"18078:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18066:6:111"},"nodeType":"YulFunctionCall","src":"18066:23:111"},"nodeType":"YulExpressionStatement","src":"18066:23:111"},{"nodeType":"YulAssignment","src":"18102:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"18113:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"18118:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18109:3:111"},"nodeType":"YulFunctionCall","src":"18109:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"18102:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"18005:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"18010:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18002:2:111"},"nodeType":"YulFunctionCall","src":"18002:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"18018:25:111","statements":[{"nodeType":"YulAssignment","src":"18020:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"18031:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"18036:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18027:3:111"},"nodeType":"YulFunctionCall","src":"18027:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"18020:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"17998:3:111","statements":[]},"src":"17994:139:111"},{"nodeType":"YulAssignment","src":"18142:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"18152:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"18142:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17638:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"17649:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"17661:6:111","type":""}],"src":"17568:595:111"},{"body":{"nodeType":"YulBlock","src":"18353:255:111","statements":[{"nodeType":"YulAssignment","src":"18363:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18375:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18386:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18371:3:111"},"nodeType":"YulFunctionCall","src":"18371:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18363:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18406:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"18417:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18399:6:111"},"nodeType":"YulFunctionCall","src":"18399:25:111"},"nodeType":"YulExpressionStatement","src":"18399:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18444:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18455:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18440:3:111"},"nodeType":"YulFunctionCall","src":"18440:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"18460:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18433:6:111"},"nodeType":"YulFunctionCall","src":"18433:34:111"},"nodeType":"YulExpressionStatement","src":"18433:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18487:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18498:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18483:3:111"},"nodeType":"YulFunctionCall","src":"18483:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"18507:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18515:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18503:3:111"},"nodeType":"YulFunctionCall","src":"18503:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18476:6:111"},"nodeType":"YulFunctionCall","src":"18476:83:111"},"nodeType":"YulExpressionStatement","src":"18476:83:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18579:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18590:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18575:3:111"},"nodeType":"YulFunctionCall","src":"18575:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"18595:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18568:6:111"},"nodeType":"YulFunctionCall","src":"18568:34:111"},"nodeType":"YulExpressionStatement","src":"18568:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_bytes32_t_address_t_uint256__to_t_bytes32_t_bytes32_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18298:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"18309:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"18317:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"18325:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18333:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18344:4:111","type":""}],"src":"18168:440:111"},{"body":{"nodeType":"YulBlock","src":"18645:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18662:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18665:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18655:6:111"},"nodeType":"YulFunctionCall","src":"18655:88:111"},"nodeType":"YulExpressionStatement","src":"18655:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18759:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"18762:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18752:6:111"},"nodeType":"YulFunctionCall","src":"18752:15:111"},"nodeType":"YulExpressionStatement","src":"18752:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18783:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18786:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18776:6:111"},"nodeType":"YulFunctionCall","src":"18776:15:111"},"nodeType":"YulExpressionStatement","src":"18776:15:111"}]},"name":"panic_error_0x12","nodeType":"YulFunctionDefinition","src":"18613:184:111"},{"body":{"nodeType":"YulBlock","src":"18976:180:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18993:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19004:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18986:6:111"},"nodeType":"YulFunctionCall","src":"18986:21:111"},"nodeType":"YulExpressionStatement","src":"18986:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19027:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19038:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19023:3:111"},"nodeType":"YulFunctionCall","src":"19023:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19043:2:111","type":"","value":"30"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19016:6:111"},"nodeType":"YulFunctionCall","src":"19016:30:111"},"nodeType":"YulExpressionStatement","src":"19016:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19077:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19062:3:111"},"nodeType":"YulFunctionCall","src":"19062:18:111"},{"hexValue":"557365206a6163446f75626c652066756e6374696f6e20696e7374656164","kind":"string","nodeType":"YulLiteral","src":"19082:32:111","type":"","value":"Use jacDouble function instead"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19055:6:111"},"nodeType":"YulFunctionCall","src":"19055:60:111"},"nodeType":"YulExpressionStatement","src":"19055:60:111"},{"nodeType":"YulAssignment","src":"19124:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19136:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19147:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19132:3:111"},"nodeType":"YulFunctionCall","src":"19132:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19124:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_5fdf44d35b202e4b4a5d1b6167961ee48e84a906ae5e709d7bddb824c86220a6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18953:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18967:4:111","type":""}],"src":"18802:354:111"},{"body":{"nodeType":"YulBlock","src":"19210:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"19232:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"19234:16:111"},"nodeType":"YulFunctionCall","src":"19234:18:111"},"nodeType":"YulExpressionStatement","src":"19234:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"19226:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"19229:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"19223:2:111"},"nodeType":"YulFunctionCall","src":"19223:8:111"},"nodeType":"YulIf","src":"19220:34:111"},{"nodeType":"YulAssignment","src":"19263:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"19275:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"19278:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19271:3:111"},"nodeType":"YulFunctionCall","src":"19271:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"19263:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"19192:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"19195:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"19201:4:111","type":""}],"src":"19161:125:111"},{"body":{"nodeType":"YulBlock","src":"19644:519:111","statements":[{"nodeType":"YulAssignment","src":"19654:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19666:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19677:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19662:3:111"},"nodeType":"YulFunctionCall","src":"19662:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19654:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19697:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"19712:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19720:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19708:3:111"},"nodeType":"YulFunctionCall","src":"19708:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19690:6:111"},"nodeType":"YulFunctionCall","src":"19690:74:111"},"nodeType":"YulExpressionStatement","src":"19690:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19784:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19795:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19780:3:111"},"nodeType":"YulFunctionCall","src":"19780:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"19800:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19773:6:111"},"nodeType":"YulFunctionCall","src":"19773:34:111"},"nodeType":"YulExpressionStatement","src":"19773:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19838:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19823:3:111"},"nodeType":"YulFunctionCall","src":"19823:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"19843:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19816:6:111"},"nodeType":"YulFunctionCall","src":"19816:34:111"},"nodeType":"YulExpressionStatement","src":"19816:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19870:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19881:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19866:3:111"},"nodeType":"YulFunctionCall","src":"19866:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"19886:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19859:6:111"},"nodeType":"YulFunctionCall","src":"19859:34:111"},"nodeType":"YulExpressionStatement","src":"19859:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19924:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19909:3:111"},"nodeType":"YulFunctionCall","src":"19909:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"19930:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19902:6:111"},"nodeType":"YulFunctionCall","src":"19902:35:111"},"nodeType":"YulExpressionStatement","src":"19902:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19957:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19968:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19953:3:111"},"nodeType":"YulFunctionCall","src":"19953:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"19974:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19946:6:111"},"nodeType":"YulFunctionCall","src":"19946:35:111"},"nodeType":"YulExpressionStatement","src":"19946:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20012:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19997:3:111"},"nodeType":"YulFunctionCall","src":"19997:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"20018:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19990:6:111"},"nodeType":"YulFunctionCall","src":"19990:35:111"},"nodeType":"YulExpressionStatement","src":"19990:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20045:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20056:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20041:3:111"},"nodeType":"YulFunctionCall","src":"20041:19:111"},{"name":"value7","nodeType":"YulIdentifier","src":"20062:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20034:6:111"},"nodeType":"YulFunctionCall","src":"20034:35:111"},"nodeType":"YulExpressionStatement","src":"20034:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20089:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20100:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20085:3:111"},"nodeType":"YulFunctionCall","src":"20085:19:111"},{"name":"value8","nodeType":"YulIdentifier","src":"20106:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20078:6:111"},"nodeType":"YulFunctionCall","src":"20078:35:111"},"nodeType":"YulExpressionStatement","src":"20078:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20133:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20144:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20129:3:111"},"nodeType":"YulFunctionCall","src":"20129:19:111"},{"name":"value9","nodeType":"YulIdentifier","src":"20150:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20122:6:111"},"nodeType":"YulFunctionCall","src":"20122:35:111"},"nodeType":"YulExpressionStatement","src":"20122:35:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19541:9:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"19552:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"19560:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"19568:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"19576:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"19584:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"19592:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"19600:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"19608:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"19616:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19624:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19635:4:111","type":""}],"src":"19291:872:111"},{"body":{"nodeType":"YulBlock","src":"20342:164:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20370:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20352:6:111"},"nodeType":"YulFunctionCall","src":"20352:21:111"},"nodeType":"YulExpressionStatement","src":"20352:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20393:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20404:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20389:3:111"},"nodeType":"YulFunctionCall","src":"20389:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20409:2:111","type":"","value":"14"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20382:6:111"},"nodeType":"YulFunctionCall","src":"20382:30:111"},"nodeType":"YulExpressionStatement","src":"20382:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20432:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20443:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20428:3:111"},"nodeType":"YulFunctionCall","src":"20428:18:111"},{"hexValue":"496e76616c6964206e756d626572","kind":"string","nodeType":"YulLiteral","src":"20448:16:111","type":"","value":"Invalid number"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20421:6:111"},"nodeType":"YulFunctionCall","src":"20421:44:111"},"nodeType":"YulExpressionStatement","src":"20421:44:111"},{"nodeType":"YulAssignment","src":"20474:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20486:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20497:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20482:3:111"},"nodeType":"YulFunctionCall","src":"20482:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20474:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f10345bf174b7296e0343b593f8b22d6d65d2b16a2522b6b74d9848a96db003a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20319:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20333:4:111","type":""}],"src":"20168:338:111"},{"body":{"nodeType":"YulBlock","src":"20557:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"20588:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20609:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20612:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20602:6:111"},"nodeType":"YulFunctionCall","src":"20602:88:111"},"nodeType":"YulExpressionStatement","src":"20602:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20710:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"20713:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20703:6:111"},"nodeType":"YulFunctionCall","src":"20703:15:111"},"nodeType":"YulExpressionStatement","src":"20703:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20738:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20741:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20731:6:111"},"nodeType":"YulFunctionCall","src":"20731:15:111"},"nodeType":"YulExpressionStatement","src":"20731:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"20577:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20570:6:111"},"nodeType":"YulFunctionCall","src":"20570:9:111"},"nodeType":"YulIf","src":"20567:189:111"},{"nodeType":"YulAssignment","src":"20765:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"20774:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"20777:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"20770:3:111"},"nodeType":"YulFunctionCall","src":"20770:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"20765:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"20542:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"20545:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"20551:1:111","type":""}],"src":"20511:274:111"},{"body":{"nodeType":"YulBlock","src":"20842:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"20961:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"20963:16:111"},"nodeType":"YulFunctionCall","src":"20963:18:111"},"nodeType":"YulExpressionStatement","src":"20963:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"20873:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20866:6:111"},"nodeType":"YulFunctionCall","src":"20866:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20859:6:111"},"nodeType":"YulFunctionCall","src":"20859:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"20881:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20888:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"20956:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"20884:3:111"},"nodeType":"YulFunctionCall","src":"20884:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20878:2:111"},"nodeType":"YulFunctionCall","src":"20878:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20855:3:111"},"nodeType":"YulFunctionCall","src":"20855:105:111"},"nodeType":"YulIf","src":"20852:131:111"},{"nodeType":"YulAssignment","src":"20992:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"21007:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"21010:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"21003:3:111"},"nodeType":"YulFunctionCall","src":"21003:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"20992:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"20821:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"20824:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"20830:7:111","type":""}],"src":"20790:228:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_array_struct_UserOperation_calldata_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(pos, length), 0x20), 0)\n }\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory_2952() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0x0160)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 64)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_address(value)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let _2 := 0xffffffffffffffff\n if gt(_1, _2) { panic_error_0x41() }\n let _3 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_1, 0x1f), _3), 63), _3))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(memPtr, 0x20), add(offset, 0x20), _1)\n mstore(add(add(memPtr, _1), 0x20), 0)\n array := memPtr\n }\n function abi_decode_struct_UserOperation(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0x0160) { revert(0, 0) }\n value := allocate_memory_2952()\n mstore(value, abi_decode_address(headStart))\n mstore(add(value, 32), calldataload(add(headStart, 32)))\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n mstore(add(value, 64), abi_decode_bytes(add(headStart, offset), end))\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n mstore(add(value, 96), abi_decode_bytes(add(headStart, offset_1), end))\n mstore(add(value, 128), calldataload(add(headStart, 128)))\n mstore(add(value, 160), calldataload(add(headStart, 160)))\n mstore(add(value, 192), calldataload(add(headStart, 192)))\n mstore(add(value, 224), calldataload(add(headStart, 224)))\n let _2 := 256\n mstore(add(value, _2), calldataload(add(headStart, _2)))\n let _3 := 288\n let offset_2 := calldataload(add(headStart, _3))\n if gt(offset_2, _1) { revert(0, 0) }\n mstore(add(value, _3), abi_decode_bytes(add(headStart, offset_2), end))\n let _4 := 320\n let offset_3 := calldataload(add(headStart, _4))\n if gt(offset_3, _1) { revert(0, 0) }\n mstore(add(value, _4), abi_decode_bytes(add(headStart, offset_3), end))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_UserOperation(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 64)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x02) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n if iszero(eq(value_1, and(value_1, 0xffffffff))) { revert(0, 0) }\n value1 := value_1\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n }\n function abi_decode_tuple_t_bytes_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_bytes(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let _2 := add(headStart, offset_1)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value2 := add(_2, 32)\n value3 := length\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n if iszero(slt(add(headStart, 0x1f), dataEnd)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(headStart, 128)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := headStart\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, mload(src))\n dst := add(dst, 0x20)\n }\n value0 := memPtr\n }\n function abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n if iszero(slt(add(headStart, 0x1f), dataEnd)) { revert(0, 0) }\n let dst := allocate_memory()\n let dst_1 := dst\n let srcEnd := add(headStart, 64)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := headStart\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, 0x20)\n }\n value0 := dst_1\n }\n function convert_t_struct$_UserOperation_$10993_calldata_ptr_to_t_struct$_UserOperation_$10993_memory_ptr(value) -> converted\n {\n converted := abi_decode_struct_UserOperation(value, calldatasize())\n }\n function abi_encode_array_uint256_to_array_uint256_library(value, pos)\n {\n pos := pos\n let srcPtr := value\n let i := 0\n for { } lt(i, 0x02) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_encode_array_uint256(value, pos)\n {\n pos := pos\n let srcPtr := value\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_uint256_$4_memory_ptr_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 256)\n abi_encode_array_uint256_to_array_uint256_library(value0, headStart)\n abi_encode_array_uint256(value1, add(headStart, 64))\n abi_encode_array_uint256_to_array_uint256_library(value2, add(headStart, 192))\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_4145b59d57ae2f5f0851e5de83c7fb2657aa25911319fc4a072ca80b43f5bde8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 14)\n mstore(add(headStart, 64), \"BLS: wrong sig\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_2def5c28206cb0e6164070fcb51feafff201d12ca54bd3e0a3892357496d8fff__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 22)\n mstore(add(headStart, 64), \"data too short for sig\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_be923b909b7eb750f013b66ddb441626fcead463bfc2bef068b4a957ee0dca0c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 22)\n mstore(add(headStart, 64), \"BLS: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr_t_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptr_t_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr__fromStack_library_reversed(headStart, value2, value1, value0) -> tail\n {\n let _1 := 128\n let tail_1 := add(headStart, _1)\n abi_encode_array_uint256_to_array_uint256_library(value0, headStart)\n let _2 := 64\n mstore(add(headStart, _2), _1)\n let pos := tail_1\n let length := mload(value1)\n mstore(tail_1, length)\n pos := add(headStart, 160)\n let _3 := 0x20\n let srcPtr := add(value1, _3)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n abi_encode_array_uint256(mload(srcPtr), pos)\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _3)\n }\n mstore(add(headStart, 96), sub(pos, headStart))\n let pos_1 := pos\n let length_1 := mload(value2)\n mstore(pos, length_1)\n pos_1 := add(pos, _3)\n let srcPtr_1 := add(value2, _3)\n let i_1 := 0\n for { } lt(i_1, length_1) { i_1 := add(i_1, 1) }\n {\n abi_encode_array_uint256_to_array_uint256_library(mload(srcPtr_1), pos_1)\n pos_1 := add(pos_1, _2)\n srcPtr_1 := add(srcPtr_1, _3)\n }\n tail := pos_1\n }\n function abi_encode_tuple_t_stringliteral_23023282b0f59631a4352146b09b85b58fd6d0cc04d93c3b2f62d5ff0f501f0b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 30)\n mstore(add(headStart, 64), \"BLS: validateSignatures failed\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_bytes32__to_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, value0)\n end := add(pos, 32)\n }\n function abi_encode_tuple_t_bytes32_t_bytes_memory_ptr__to_t_bytes32_t_bytes_memory_ptr__fromStack_library_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_decode_tuple_t_array$_t_uint256_$2_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n if iszero(slt(add(headStart, 0x1f), dataEnd)) { revert(0, 0) }\n let dst := allocate_memory()\n let dst_1 := dst\n let srcEnd := add(headStart, 64)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := headStart\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, mload(src))\n dst := add(dst, 0x20)\n }\n value0 := dst_1\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_address_t_uint256__to_t_bytes32_t_bytes32_t_address_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 96), value3)\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_5fdf44d35b202e4b4a5d1b6167961ee48e84a906ae5e709d7bddb824c86220a6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 30)\n mstore(add(headStart, 64), \"Use jacDouble function instead\")\n tail := add(headStart, 96)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed(headStart, value9, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 320)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), value6)\n mstore(add(headStart, 224), value7)\n mstore(add(headStart, 256), value8)\n mstore(add(headStart, 288), value9)\n }\n function abi_encode_tuple_t_stringliteral_f10345bf174b7296e0343b593f8b22d6d65d2b16a2522b6b74d9848a96db003a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 14)\n mstore(add(headStart, 64), \"Invalid number\")\n tail := add(headStart, 96)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{"contracts/samples/bls/lib/BLSOpen.sol":{"BLSOpen":[{"length":20,"start":1414},{"length":20,"start":2452},{"length":20,"start":2980}]}},"object":"6080604052600436106100b05760003560e01c806364c530cd11610069578063b7620eb41161004e578063b7620eb4146101d8578063c9e525df146101f8578063e3563a4f1461022c57600080fd5b806364c530cd14610198578063a6193531146101b857600080fd5b8063408644311161009a5780634086443114610129578063451711591461015657806357f09b721461016b57600080fd5b80629d9250146100b5578063275e2d79146100fc575b600080fd5b3480156100c157600080fd5b506100e97fd84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b81565b6040519081526020015b60405180910390f35b34801561010857600080fd5b5061011c610117366004611296565b61024c565b6040516100f39190611343565b34801561013557600080fd5b506101496101443660046115c0565b6103b4565b6040516100f391906115f5565b610169610164366004611626565b6103e2565b005b34801561017757600080fd5b5061018b6101863660046115c0565b61046d565b6040516100f39190611668565b3480156101a457600080fd5b5061011c6101b3366004611690565b61050e565b3480156101c457600080fd5b506100e96101d33660046115c0565b610676565b3480156101e457600080fd5b5061018b6101f33660046116cc565b610691565b34801561020457600080fd5b506100e97f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781565b34801561023857600080fd5b50610169610247366004611701565b610789565b606060008267ffffffffffffffff81111561026957610269611356565b6040519080825280602002602001820160405280156102ae57816020015b60408051808201909152600080825260208201528152602001906001900390816102875790505b50905060005b815181101561034b576000808686848181106102d2576102d2611798565b90506020028101906102e491906117c7565b6102f390610140810190611805565b810190610300919061186a565b9150915060405180604001604052808381526020018281525084848151811061032b5761032b611798565b602002602001018190525050508080610343906118bb565b9150506102b4565b506000610378827f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47610a71565b805160208083015160405193945061039b93909101918252602082015260400190565b6040516020818303038152906040529250505092915050565b6103bc61120e565b60006103cf6103ca8461046d565b610b5c565b90506103db8382610b8c565b9392505050565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015273ffffffffffffffffffffffffffffffffffffffff831690630396cb609034906024016000604051808303818588803b15801561045057600080fd5b505af1158015610464573d6000803e3d6000fd5b50505050505050565b61047561122c565b60408201518051156104915761048a81610691565b9150610508565b826000015173ffffffffffffffffffffffffffffffffffffffff1663e02afbae61c3506040518263ffffffff1660e01b81526004016080604051808303818786fa1580156104e3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906103db91906118f3565b50919050565b60606000610520610140840184611805565b81019061052d9190611966565b9050600061053d610186856119c6565b9050600061055b61054d866119c6565b61055684610b5c565b610b8c565b6040517febbdac9100000000000000000000000000000000000000000000000000000000815290915073__$b745eded4b1aee1100521038d570dd85f1$__9063ebbdac91906105b290869086908690600401611a24565b602060405180830381865af41580156105cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f39190611a4d565b61065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f424c533a2077726f6e672073696700000000000000000000000000000000000060448201526064015b60405180910390fd5b50506040805160208101909152600081529392505050565b6000806106856103ca8461046d565b90506103db8382610c64565b61069961122c565b815160808111610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6461746120746f6f2073686f727420666f7220736967000000000000000000006044820152606401610655565b9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa081015182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081015160208301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810151604083015251606082015290565b604081146107f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f424c533a20696e76616c6964207369676e6174757265000000000000000000006044820152606401610655565b600061080182840184611966565b90508360008167ffffffffffffffff81111561081f5761081f611356565b60405190808252806020026020018201604052801561085857816020015b61084561122c565b81526020019060019003908161083d5790505b50905060008267ffffffffffffffff81111561087657610876611356565b6040519080825280602002602001820160405280156108af57816020015b61089c61120e565b8152602001906001900390816108945790505b50905060005b8381101561096b5760008989838181106108d1576108d1611798565b90506020028101906108e391906117c7565b6108ec906119c6565b90506108f78161046d565b84838151811061090957610909611798565b602002602001018190525061093a8161055686858151811061092d5761092d611798565b6020026020010151610b5c565b83838151811061094c5761094c611798565b6020026020010181905250508080610963906118bb565b9150506108b5565b506040517f9141376300000000000000000000000000000000000000000000000000000000815273__$b745eded4b1aee1100521038d570dd85f1$__906391413763906109c090879086908690600401611a6f565b602060405180830381865af41580156109dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a019190611a4d565b610a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f424c533a2076616c69646174655369676e617475726573206661696c656400006044820152606401610655565b5050505050505050565b6040805180820190915260008082526020820152600083600081518110610a9a57610a9a611798565b6020026020010151600001519050600084600081518110610abd57610abd611798565b602090810291909101810151015190506001805b8651811015610b3d57610b248484848a8581518110610af257610af2611798565b6020026020010151600001518b8681518110610b1057610b10611798565b60200260200101516020015160018c610cad565b9195509350915080610b35816118bb565b915050610ad1565b50610b4a83838388610ffa565b90855260208501525091949350505050565b600081604051602001610b6f9190611668565b604051602081830303815290604052805190602001209050919050565b610b9461120e565b6000610ba08484610c64565b905073__$b745eded4b1aee1100521038d570dd85f1$__63a850a9097fd84c4373167c517e9ccd66803f86d8a4f49e7e1315a7a73b516affea7428f82b83604051602001610bf091815260200190565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c1c929190611b0d565b6040805180830381865af4158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190611b26565b949350505050565b6000610c6f83611069565b604080516020810192909252810183905230606082015246608082015260a00160405160208183030381529060405280519060200120905092915050565b6000808089158015610cbd575088155b15610ccf575085915084905083610fed565b86158015610cdb575085155b15610ced575088915087905086610fed565b610cf561122c565b8480610d0357610d03611b7b565b898a0981528480610d1657610d16611b7b565b81518a0960208201528480610d2d57610d2d611b7b565b86870960408201528480610d4357610d43611b7b565b6040820151870960608201526040805160808101909152808680610d6957610d69611b7b565b60408401518e0981526020018680610d8357610d83611b7b565b60608401518d0981526020018680610d9d57610d9d611b7b565b83518b0981526020018680610db457610db4611b7b565b60208401518a09905260408101518151919250141580610ddc57506060810151602082015114155b610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f557365206a6163446f75626c652066756e6374696f6e20696e737465616400006044820152606401610655565b610e4a61122c565b8580610e5857610e58611b7b565b8251610e649088611baa565b60408401510881528580610e7a57610e7a611b7b565b6020830151610e899088611baa565b60608401510860208201528580610ea257610ea2611b7b565b8151800960408201528580610eb957610eb9611b7b565b8151604083015109606082015260008680610ed657610ed6611b7b565b6060830151610ee59089611baa565b8880610ef357610ef3611b7b565b602085015180090890508680610f0b57610f0b611b7b565b8780610f1957610f19611b7b565b8880610f2757610f27611b7b565b6040850151865109600209610f3c9089611baa565b8208905060008780610f5057610f50611b7b565b8880610f5e57610f5e611b7b565b610f68848b611baa565b8a80610f7657610f76611b7b565b60408701518851090860208501510990508780610f9557610f95611b7b565b8880610fa357610fa3611b7b565b6060850151602087015109610fb8908a611baa565b8208905060008880610fcc57610fcc611b7b565b8980610fda57610fda611b7b565b8b8f098551099297509095509093505050505b9750975097945050505050565b60008060006110098585611119565b90506000848061101b5761101b611b7b565b82830990506000858061103057611030611b7b565b828a0990506000868061104557611045611b7b565b878061105357611053611b7b565b8486098a09919a91995090975050505050505050565b80516020808301516040808501518051908401206060860151805190850120608087015160a088015160c089015160e08a01516101008b01516101208c01518051908b0120975160009b610b6f9b909a99910173ffffffffffffffffffffffffffffffffffffffff9a909a168a5260208a019890985260408901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201526101400190565b6000821580159061112a5750818314155b801561113557508115155b61119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c6964206e756d6265720000000000000000000000000000000000006044820152606401610655565b6000600183825b8615611203576111b28783611bc1565b90508286806111c3576111c3611b7b565b87806111d1576111d1611b7b565b8584096111de9089611baa565b86089094509250866111f08183611bfc565b6111fa9084611baa565b975091506111a2565b509195945050505050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60008083601f84011261125c57600080fd5b50813567ffffffffffffffff81111561127457600080fd5b6020830191508360208260051b850101111561128f57600080fd5b9250929050565b600080602083850312156112a957600080fd5b823567ffffffffffffffff8111156112c057600080fd5b6112cc8582860161124a565b90969095509350505050565b6000815180845260005b818110156112fe576020818501810151868301820152016112e2565b81811115611310576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103db60208301846112d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156113a9576113a9611356565b60405290565b6040805190810167ffffffffffffffff811182821017156113a9576113a9611356565b73ffffffffffffffffffffffffffffffffffffffff811681146113f457600080fd5b50565b8035611402816113d2565b919050565b600082601f83011261141857600080fd5b813567ffffffffffffffff8082111561143357611433611356565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561147957611479611356565b8160405283815286602085880101111561149257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082840312156114c557600080fd5b6114cd611385565b90506114d8826113f7565b815260208201356020820152604082013567ffffffffffffffff808211156114ff57600080fd5b61150b85838601611407565b6040840152606084013591508082111561152457600080fd5b61153085838601611407565b60608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e0840152610100915081840135828401526101209150818401358181111561158057600080fd5b61158c86828701611407565b8385015250610140915081840135818111156115a757600080fd5b6115b386828701611407565b8385015250505092915050565b6000602082840312156115d257600080fd5b813567ffffffffffffffff8111156115e957600080fd5b610c5c848285016114b2565b60408101818360005b600281101561161d5781518352602092830192909101906001016115fe565b50505092915050565b6000806040838503121561163957600080fd5b8235611644816113d2565b9150602083013563ffffffff8116811461165d57600080fd5b809150509250929050565b60808101818360005b600481101561161d578151835260209283019290910190600101611671565b6000602082840312156116a257600080fd5b813567ffffffffffffffff8111156116b957600080fd5b820161016081850312156103db57600080fd5b6000602082840312156116de57600080fd5b813567ffffffffffffffff8111156116f557600080fd5b610c5c84828501611407565b6000806000806040858703121561171757600080fd5b843567ffffffffffffffff8082111561172f57600080fd5b61173b8883890161124a565b9096509450602087013591508082111561175457600080fd5b818701915087601f83011261176857600080fd5b81358181111561177757600080fd5b88602082850101111561178957600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18336030181126117fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261183a57600080fd5b83018035915067ffffffffffffffff82111561185557600080fd5b60200191503681900382131561128f57600080fd5b6000806040838503121561187d57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118ec576118ec61188c565b5060010190565b60006080828403121561190557600080fd5b82601f83011261191457600080fd5b6040516080810181811067ffffffffffffffff8211171561193757611937611356565b60405280608084018581111561194c57600080fd5b845b8181101561120357805183526020928301920161194e565b60006040828403121561197857600080fd5b82601f83011261198757600080fd5b61198f6113af565b8060408401858111156119a157600080fd5b845b818110156119bb5780358452602093840193016119a3565b509095945050505050565b60006119d236836114b2565b92915050565b8060005b60028110156119fb5781518452602093840193909101906001016119dc565b50505050565b8060005b60048110156119fb578151845260209384019390910190600101611a05565b6101008101611a3382866119d8565b611a406040830185611a01565b610c5c60c08301846119d8565b600060208284031215611a5f57600080fd5b815180151581146103db57600080fd5b60006080808301611a8084886119d8565b604084810183905286519182905260209160a086019083890160005b82811015611abf57611aaf848351611a01565b9286019290850190600101611a9c565b5050508581036060870152865180825290830193508287019060005b81811015611afe57611aee8684516119d8565b9483019491840191600101611adb565b50939998505050505050505050565b828152604060208201526000610c5c60408301846112d8565b600060408284031215611b3857600080fd5b82601f830112611b4757600080fd5b611b4f6113af565b806040840185811115611b6157600080fd5b845b818110156119bb578051845260209384019301611b63565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082821015611bbc57611bbc61188c565b500390565b600082611bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611c3457611c3461188c565b50029056fea2646970667358221220d251a0972698130c32f94cc0035c478ec21179f1f269ef606b1b31aa559c232a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB0 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x64C530CD GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xB7620EB4 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xB7620EB4 EQ PUSH2 0x1D8 JUMPI DUP1 PUSH4 0xC9E525DF EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0xE3563A4F EQ PUSH2 0x22C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x64C530CD EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0xA6193531 EQ PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x40864431 GT PUSH2 0x9A JUMPI DUP1 PUSH4 0x40864431 EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x45171159 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x57F09B72 EQ PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x9D9250 EQ PUSH2 0xB5 JUMPI DUP1 PUSH4 0x275E2D79 EQ PUSH2 0xFC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH32 0xD84C4373167C517E9CCD66803F86D8A4F49E7E1315A7A73B516AFFEA7428F82B DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH2 0x117 CALLDATASIZE PUSH1 0x4 PUSH2 0x1296 JUMP JUMPDEST PUSH2 0x24C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x1343 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x135 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x149 PUSH2 0x144 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x3B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x15F5 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x164 CALLDATASIZE PUSH1 0x4 PUSH2 0x1626 JUMP JUMPDEST PUSH2 0x3E2 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18B PUSH2 0x186 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x1668 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1690 JUMP JUMPDEST PUSH2 0x50E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18B PUSH2 0x1F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x16CC JUMP JUMPDEST PUSH2 0x691 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x238 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x169 PUSH2 0x247 CALLDATASIZE PUSH1 0x4 PUSH2 0x1701 JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x269 JUMPI PUSH2 0x269 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2AE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x287 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x2D2 JUMPI PUSH2 0x2D2 PUSH2 0x1798 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x2E4 SWAP2 SWAP1 PUSH2 0x17C7 JUMP JUMPDEST PUSH2 0x2F3 SWAP1 PUSH2 0x140 DUP2 ADD SWAP1 PUSH2 0x1805 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x300 SWAP2 SWAP1 PUSH2 0x186A JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x32B JUMPI PUSH2 0x32B PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP DUP1 DUP1 PUSH2 0x343 SWAP1 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2B4 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x378 DUP3 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0xA71 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP5 POP PUSH2 0x39B SWAP4 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3BC PUSH2 0x120E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3CF PUSH2 0x3CA DUP5 PUSH2 0x46D JUMP JUMPDEST PUSH2 0xB5C JUMP JUMPDEST SWAP1 POP PUSH2 0x3DB DUP4 DUP3 PUSH2 0xB8C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x464 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x475 PUSH2 0x122C JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD ISZERO PUSH2 0x491 JUMPI PUSH2 0x48A DUP2 PUSH2 0x691 JUMP JUMPDEST SWAP2 POP PUSH2 0x508 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE02AFBAE PUSH2 0xC350 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4E3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DB SWAP2 SWAP1 PUSH2 0x18F3 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x520 PUSH2 0x140 DUP5 ADD DUP5 PUSH2 0x1805 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x52D SWAP2 SWAP1 PUSH2 0x1966 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x53D PUSH2 0x186 DUP6 PUSH2 0x19C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x55B PUSH2 0x54D DUP7 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x556 DUP5 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xB8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xEBBDAC9100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0x0 SWAP1 PUSH4 0xEBBDAC91 SWAP1 PUSH2 0x5B2 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1A24 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x5CF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5F3 SWAP2 SWAP1 PUSH2 0x1A4D JUMP JUMPDEST PUSH2 0x65E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A2077726F6E6720736967000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x685 PUSH2 0x3CA DUP5 PUSH2 0x46D JUMP JUMPDEST SWAP1 POP PUSH2 0x3DB DUP4 DUP3 PUSH2 0xC64 JUMP JUMPDEST PUSH2 0x699 PUSH2 0x122C JUMP JUMPDEST DUP2 MLOAD PUSH1 0x80 DUP2 GT PUSH2 0x705 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6461746120746F6F2073686F727420666F722073696700000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 DUP2 ADD MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE MLOAD PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 EQ PUSH2 0x7F3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20696E76616C6964207369676E617475726500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x801 DUP3 DUP5 ADD DUP5 PUSH2 0x1966 JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x81F JUMPI PUSH2 0x81F PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x858 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x845 PUSH2 0x122C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x83D JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x876 JUMPI PUSH2 0x876 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x8AF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x89C PUSH2 0x120E JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x894 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x96B JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x8D1 JUMPI PUSH2 0x8D1 PUSH2 0x1798 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8E3 SWAP2 SWAP1 PUSH2 0x17C7 JUMP JUMPDEST PUSH2 0x8EC SWAP1 PUSH2 0x19C6 JUMP JUMPDEST SWAP1 POP PUSH2 0x8F7 DUP2 PUSH2 0x46D JUMP JUMPDEST DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x909 JUMPI PUSH2 0x909 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH2 0x93A DUP2 PUSH2 0x556 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x92D JUMPI PUSH2 0x92D PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0xB5C JUMP JUMPDEST DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x94C JUMPI PUSH2 0x94C PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP DUP1 DUP1 PUSH2 0x963 SWAP1 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0x8B5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x9141376300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0x0 SWAP1 PUSH4 0x91413763 SWAP1 PUSH2 0x9C0 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1A6F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x9DD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA01 SWAP2 SWAP1 PUSH2 0x1A4D JUMP JUMPDEST PUSH2 0xA67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A2076616C69646174655369676E617475726573206661696C65640000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA9A JUMPI PUSH2 0xA9A PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xABD JUMPI PUSH2 0xABD PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD ADD MLOAD SWAP1 POP PUSH1 0x1 DUP1 JUMPDEST DUP7 MLOAD DUP2 LT ISZERO PUSH2 0xB3D JUMPI PUSH2 0xB24 DUP5 DUP5 DUP5 DUP11 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xAF2 JUMPI PUSH2 0xAF2 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0xB10 JUMPI PUSH2 0xB10 PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0x1 DUP13 PUSH2 0xCAD JUMP JUMPDEST SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP DUP1 PUSH2 0xB35 DUP2 PUSH2 0x18BB JUMP JUMPDEST SWAP2 POP POP PUSH2 0xAD1 JUMP JUMPDEST POP PUSH2 0xB4A DUP4 DUP4 DUP4 DUP9 PUSH2 0xFFA JUMP JUMPDEST SWAP1 DUP6 MSTORE PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xB6F SWAP2 SWAP1 PUSH2 0x1668 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xB94 PUSH2 0x120E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBA0 DUP5 DUP5 PUSH2 0xC64 JUMP JUMPDEST SWAP1 POP PUSH20 0x0 PUSH4 0xA850A909 PUSH32 0xD84C4373167C517E9CCD66803F86D8A4F49E7E1315A7A73B516AFFEA7428F82B DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xBF0 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC1C SWAP3 SWAP2 SWAP1 PUSH2 0x1B0D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xC38 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC5C SWAP2 SWAP1 PUSH2 0x1B26 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC6F DUP4 PUSH2 0x1069 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP2 ADD DUP4 SWAP1 MSTORE ADDRESS PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP10 ISZERO DUP1 ISZERO PUSH2 0xCBD JUMPI POP DUP9 ISZERO JUMPDEST ISZERO PUSH2 0xCCF JUMPI POP DUP6 SWAP2 POP DUP5 SWAP1 POP DUP4 PUSH2 0xFED JUMP JUMPDEST DUP7 ISZERO DUP1 ISZERO PUSH2 0xCDB JUMPI POP DUP6 ISZERO JUMPDEST ISZERO PUSH2 0xCED JUMPI POP DUP9 SWAP2 POP DUP8 SWAP1 POP DUP7 PUSH2 0xFED JUMP JUMPDEST PUSH2 0xCF5 PUSH2 0x122C JUMP JUMPDEST DUP5 DUP1 PUSH2 0xD03 JUMPI PUSH2 0xD03 PUSH2 0x1B7B JUMP JUMPDEST DUP10 DUP11 MULMOD DUP2 MSTORE DUP5 DUP1 PUSH2 0xD16 JUMPI PUSH2 0xD16 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD DUP11 MULMOD PUSH1 0x20 DUP3 ADD MSTORE DUP5 DUP1 PUSH2 0xD2D JUMPI PUSH2 0xD2D PUSH2 0x1B7B JUMP JUMPDEST DUP7 DUP8 MULMOD PUSH1 0x40 DUP3 ADD MSTORE DUP5 DUP1 PUSH2 0xD43 JUMPI PUSH2 0xD43 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD DUP8 MULMOD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 DUP7 DUP1 PUSH2 0xD69 JUMPI PUSH2 0xD69 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MLOAD DUP15 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xD83 JUMPI PUSH2 0xD83 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD DUP14 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xD9D JUMPI PUSH2 0xD9D PUSH2 0x1B7B JUMP JUMPDEST DUP4 MLOAD DUP12 MULMOD DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP1 PUSH2 0xDB4 JUMPI PUSH2 0xDB4 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP11 MULMOD SWAP1 MSTORE PUSH1 0x40 DUP2 ADD MLOAD DUP2 MLOAD SWAP2 SWAP3 POP EQ ISZERO DUP1 PUSH2 0xDDC JUMPI POP PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x20 DUP3 ADD MLOAD EQ ISZERO JUMPDEST PUSH2 0xE42 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x557365206A6163446F75626C652066756E6374696F6E20696E73746561640000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH2 0xE4A PUSH2 0x122C JUMP JUMPDEST DUP6 DUP1 PUSH2 0xE58 JUMPI PUSH2 0xE58 PUSH2 0x1B7B JUMP JUMPDEST DUP3 MLOAD PUSH2 0xE64 SWAP1 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MLOAD ADDMOD DUP2 MSTORE DUP6 DUP1 PUSH2 0xE7A JUMPI PUSH2 0xE7A PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xE89 SWAP1 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD ADDMOD PUSH1 0x20 DUP3 ADD MSTORE DUP6 DUP1 PUSH2 0xEA2 JUMPI PUSH2 0xEA2 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD DUP1 MULMOD PUSH1 0x40 DUP3 ADD MSTORE DUP6 DUP1 PUSH2 0xEB9 JUMPI PUSH2 0xEB9 PUSH2 0x1B7B JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP4 ADD MLOAD MULMOD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x0 DUP7 DUP1 PUSH2 0xED6 JUMPI PUSH2 0xED6 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xEE5 SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP9 DUP1 PUSH2 0xEF3 JUMPI PUSH2 0xEF3 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP1 MULMOD ADDMOD SWAP1 POP DUP7 DUP1 PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0xF19 JUMPI PUSH2 0xF19 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xF27 JUMPI PUSH2 0xF27 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD DUP7 MLOAD MULMOD PUSH1 0x2 MULMOD PUSH2 0xF3C SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP3 ADDMOD SWAP1 POP PUSH1 0x0 DUP8 DUP1 PUSH2 0xF50 JUMPI PUSH2 0xF50 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xF5E JUMPI PUSH2 0xF5E PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0xF68 DUP5 DUP12 PUSH2 0x1BAA JUMP JUMPDEST DUP11 DUP1 PUSH2 0xF76 JUMPI PUSH2 0xF76 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD DUP9 MLOAD MULMOD ADDMOD PUSH1 0x20 DUP6 ADD MLOAD MULMOD SWAP1 POP DUP8 DUP1 PUSH2 0xF95 JUMPI PUSH2 0xF95 PUSH2 0x1B7B JUMP JUMPDEST DUP9 DUP1 PUSH2 0xFA3 JUMPI PUSH2 0xFA3 PUSH2 0x1B7B JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x20 DUP8 ADD MLOAD MULMOD PUSH2 0xFB8 SWAP1 DUP11 PUSH2 0x1BAA JUMP JUMPDEST DUP3 ADDMOD SWAP1 POP PUSH1 0x0 DUP9 DUP1 PUSH2 0xFCC JUMPI PUSH2 0xFCC PUSH2 0x1B7B JUMP JUMPDEST DUP10 DUP1 PUSH2 0xFDA JUMPI PUSH2 0xFDA PUSH2 0x1B7B JUMP JUMPDEST DUP12 DUP16 MULMOD DUP6 MLOAD MULMOD SWAP3 SWAP8 POP SWAP1 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST SWAP8 POP SWAP8 POP SWAP8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1009 DUP6 DUP6 PUSH2 0x1119 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP5 DUP1 PUSH2 0x101B JUMPI PUSH2 0x101B PUSH2 0x1B7B JUMP JUMPDEST DUP3 DUP4 MULMOD SWAP1 POP PUSH1 0x0 DUP6 DUP1 PUSH2 0x1030 JUMPI PUSH2 0x1030 PUSH2 0x1B7B JUMP JUMPDEST DUP3 DUP11 MULMOD SWAP1 POP PUSH1 0x0 DUP7 DUP1 PUSH2 0x1045 JUMPI PUSH2 0x1045 PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0x1053 JUMPI PUSH2 0x1053 PUSH2 0x1B7B JUMP JUMPDEST DUP5 DUP7 MULMOD DUP11 MULMOD SWAP2 SWAP11 SWAP2 SWAP10 POP SWAP1 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD DUP1 MLOAD SWAP1 DUP5 ADD KECCAK256 PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD SWAP1 DUP6 ADD KECCAK256 PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0xC0 DUP10 ADD MLOAD PUSH1 0xE0 DUP11 ADD MLOAD PUSH2 0x100 DUP12 ADD MLOAD PUSH2 0x120 DUP13 ADD MLOAD DUP1 MLOAD SWAP1 DUP12 ADD KECCAK256 SWAP8 MLOAD PUSH1 0x0 SWAP12 PUSH2 0xB6F SWAP12 SWAP1 SWAP11 SWAP10 SWAP2 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP11 SWAP1 SWAP11 AND DUP11 MSTORE PUSH1 0x20 DUP11 ADD SWAP9 SWAP1 SWAP9 MSTORE PUSH1 0x40 DUP10 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP9 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x80 DUP8 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 DUP7 ADD MSTORE PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 DUP4 ADD MSTORE PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x140 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x112A JUMPI POP DUP2 DUP4 EQ ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x1135 JUMPI POP DUP2 ISZERO ISZERO JUMPDEST PUSH2 0x119B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x655 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 DUP3 JUMPDEST DUP7 ISZERO PUSH2 0x1203 JUMPI PUSH2 0x11B2 DUP8 DUP4 PUSH2 0x1BC1 JUMP JUMPDEST SWAP1 POP DUP3 DUP7 DUP1 PUSH2 0x11C3 JUMPI PUSH2 0x11C3 PUSH2 0x1B7B JUMP JUMPDEST DUP8 DUP1 PUSH2 0x11D1 JUMPI PUSH2 0x11D1 PUSH2 0x1B7B JUMP JUMPDEST DUP6 DUP5 MULMOD PUSH2 0x11DE SWAP1 DUP10 PUSH2 0x1BAA JUMP JUMPDEST DUP7 ADDMOD SWAP1 SWAP5 POP SWAP3 POP DUP7 PUSH2 0x11F0 DUP2 DUP4 PUSH2 0x1BFC JUMP JUMPDEST PUSH2 0x11FA SWAP1 DUP5 PUSH2 0x1BAA JUMP JUMPDEST SWAP8 POP SWAP2 POP PUSH2 0x11A2 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x125C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12CC DUP6 DUP3 DUP7 ADD PUSH2 0x124A JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x12FE JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x12E2 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1310 JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x3DB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x12D8 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13A9 JUMPI PUSH2 0x13A9 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13A9 JUMPI PUSH2 0x13A9 PUSH2 0x1356 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x13F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1402 DUP2 PUSH2 0x13D2 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1418 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1433 JUMPI PUSH2 0x1433 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1479 JUMPI PUSH2 0x1479 PUSH2 0x1356 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP9 ADD ADD GT ISZERO PUSH2 0x1492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x20 DUP8 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14CD PUSH2 0x1385 JUMP JUMPDEST SWAP1 POP PUSH2 0x14D8 DUP3 PUSH2 0x13F7 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x14FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x150B DUP6 DUP4 DUP7 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1524 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1530 DUP6 DUP4 DUP7 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP5 ADD CALLDATALOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x100 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP3 DUP5 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1580 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x158C DUP7 DUP3 DUP8 ADD PUSH2 0x1407 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP PUSH2 0x140 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x15A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15B3 DUP7 DUP3 DUP8 ADD PUSH2 0x1407 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x15D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x15E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC5C DUP5 DUP3 DUP6 ADD PUSH2 0x14B2 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x161D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15FE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1639 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1644 DUP2 PUSH2 0x13D2 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x165D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x161D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1671 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC5C DUP5 DUP3 DUP6 ADD PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1717 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x172F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x173B DUP9 DUP4 DUP10 ADD PUSH2 0x124A JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1777 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1789 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x17FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x183A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1855 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x187D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x18EC JUMPI PUSH2 0x18EC PUSH2 0x188C JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1905 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1914 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1937 JUMPI PUSH2 0x1937 PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1203 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x194E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1978 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1987 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x198F PUSH2 0x13AF JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x19BB JUMPI DUP1 CALLDATALOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x19A3 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19D2 CALLDATASIZE DUP4 PUSH2 0x14B2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x19FB JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x19DC JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x19FB JUMPI DUP2 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A05 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x1A33 DUP3 DUP7 PUSH2 0x19D8 JUMP JUMPDEST PUSH2 0x1A40 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1A01 JUMP JUMPDEST PUSH2 0xC5C PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x19D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP1 DUP4 ADD PUSH2 0x1A80 DUP5 DUP9 PUSH2 0x19D8 JUMP JUMPDEST PUSH1 0x40 DUP5 DUP2 ADD DUP4 SWAP1 MSTORE DUP7 MLOAD SWAP2 DUP3 SWAP1 MSTORE PUSH1 0x20 SWAP2 PUSH1 0xA0 DUP7 ADD SWAP1 DUP4 DUP10 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1ABF JUMPI PUSH2 0x1AAF DUP5 DUP4 MLOAD PUSH2 0x1A01 JUMP JUMPDEST SWAP3 DUP7 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A9C JUMP JUMPDEST POP POP POP DUP6 DUP2 SUB PUSH1 0x60 DUP8 ADD MSTORE DUP7 MLOAD DUP1 DUP3 MSTORE SWAP1 DUP4 ADD SWAP4 POP DUP3 DUP8 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1AFE JUMPI PUSH2 0x1AEE DUP7 DUP5 MLOAD PUSH2 0x19D8 JUMP JUMPDEST SWAP5 DUP4 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1ADB JUMP JUMPDEST POP SWAP4 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0xC5C PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x12D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B4F PUSH2 0x13AF JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1B61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x19BB JUMPI DUP1 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x1B63 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1BBC JUMPI PUSH2 0x1BBC PUSH2 0x188C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1BF7 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1C34 JUMPI PUSH2 0x1C34 PUSH2 0x188C JUMP JUMPDEST POP MUL SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD2 MLOAD LOG0 SWAP8 0x26 SWAP9 SGT 0xC ORIGIN 0xF9 0x4C 0xC0 SUB 0x5C SELFBALANCE DUP15 0xC2 GT PUSH26 0xF1F269EF606B1B31AA559C232A64736F6C634300080F00330000 ","sourceMap":"387:6849:80:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;487:68;;;;;;;;;;;;524:31;487:68;;;;;160:25:111;;;148:2;133:18;487:68:80;;;;;;;;6377:499;;;;;;;;;;-1:-1:-1;6377:499:80;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3854:236::-;;;;;;;;;;-1:-1:-1;3854:236:80;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7099:135::-;;;;;;:::i;:::-;;:::i;:::-;;1013:359;;;;;;;;;;-1:-1:-1;1013:359:80;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5533:464::-;;;;;;;;;;-1:-1:-1;5533:464:80;;;;;:::i;:::-;;:::i;4398:222::-;;;;;;;;;;-1:-1:-1;4398:222:80;;;;;:::i;:::-;;:::i;1443:654::-;;;;;;;;;;-1:-1:-1;1443:654:80;;;;;:::i;:::-;;:::i;589:106::-;;;;;;;;;;;;618:77;589:106;;2135:834;;;;;;;;;;-1:-1:-1;2135:834:80;;;;;:::i;:::-;;:::i;6377:499::-;6463:32;6507:28;6557:7;6538:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;6538:34:80;;;;;;;;;;;;;;;;6507:65;;6587:6;6582:187;6603:6;:13;6599:1;:17;6582:187;;;6638:9;6649;6673:7;;6681:1;6673:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:20;;;;;;;:::i;:::-;6662:52;;;;;;;:::i;:::-;6637:77;;;;6740:18;;;;;;;;6753:1;6740:18;;;;6756:1;6740:18;;;6728:6;6735:1;6728:9;;;;;;;;:::i;:::-;;;;;;:30;;;;6623:146;;6618:3;;;;;:::i;:::-;;;;6582:187;;;;6778:23;6804:24;6818:6;618:77;6804:13;:24::i;:::-;6856:5;;6863;;;;;6845:24;;6778:50;;-1:-1:-1;6845:24:80;;6863:5;;6845:24;10749:25:111;;;10805:2;10790:18;;10783:34;10737:2;10722:18;;10575:248;6845:24:80;;;;;;;;;;;;;6838:31;;;;6377:499;;;;:::o;3854:236::-;3929:17;;:::i;:::-;3958:21;3982:45;4000:26;4019:6;4000:18;:26::i;:::-;3982:17;:45::i;:::-;3958:69;;4044:39;4061:6;4069:13;4044:16;:39::i;:::-;4037:46;3854:236;-1:-1:-1;;;3854:236:80:o;7099:135::-;7182:45;;;;;11002:10:111;10990:23;;7182:45:80;;;10972:42:111;7182:19:80;;;;;;7210:9;;10945:18:111;;7182:45:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7099:135;;:::o;1013:359::-;1091:27;;:::i;:::-;1154:15;;;;1183;;:19;1179:187;;1230:30;1251:8;1230:20;:30::i;:::-;1218:42;;1179:187;;;1310:6;:13;;;1298:42;;;1347:5;1298:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1179:187::-;1120:252;1013:359;;;:::o;5533:464::-;5624:25;5661:27;5702:16;;;;:6;:16;:::i;:::-;5691:42;;;;;;;:::i;:::-;5661:72;-1:-1:-1;5743:24:80;5770:26;;5789:6;5770:26;:::i;:::-;5743:53;-1:-1:-1;5806:25:80;5834:51;;5851:6;5834:51;:::i;:::-;5859:25;5877:6;5859:17;:25::i;:::-;5834:16;:51::i;:::-;5904:48;;;;;5806:79;;-1:-1:-1;5904:7:80;;:20;;:48;;5925:9;;5936:6;;5806:79;;5904:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5896:75;;;;;;;14356:2:111;5896:75:80;;;14338:21:111;14395:2;14375:18;;;14368:30;14434:16;14414:18;;;14407:44;14468:18;;5896:75:80;;;;;;;;;-1:-1:-1;;5981:9:80;;;;;;;;;-1:-1:-1;5981:9:80;;;5533:464;-1:-1:-1;;;5533:464:80:o;4398:222::-;4471:7;4490:21;4514:45;4532:26;4551:6;4532:18;:26::i;4514:45::-;4490:69;;4576:37;4591:6;4599:13;4576:14;:37::i;1443:654::-;1513:27;;:::i;:::-;1563:11;;1598:6;1592:12;;1584:47;;;;;;;14699:2:111;1584:47:80;;;14681:21:111;14738:2;14718:18;;;14711:30;14777:24;14757:18;;;14750:52;14819:18;;1584:47:80;14497:346:111;1584:47:80;1840:14;;;1836:23;;;1890:10;1872:29;;1947:12;;;1941:19;1956:2;1921:18;;1914:47;-1:-1:-1;2007:12:80;;2001:19;2016:2;1981:18;;1974:47;2061:19;1856:2;2041:18;;2034:47;1872:29;1443:654::o;2135:834::-;2288:2;2268:22;;2260:57;;;;;;;15050:2:111;2260:57:80;;;15032:21:111;15089:2;15069:18;;;15062:30;15128:24;15108:18;;;15101:52;15170:18;;2260:57:80;14848:346:111;2260:57:80;2328:30;2362:35;;;;2373:9;2362:35;:::i;:::-;2327:70;-1:-1:-1;2426:7:80;2408:15;2426:7;2486:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2450:64;;2524:28;2572:10;2555:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2524:59;;2598:9;2593:256;2617:10;2613:1;:14;2593:256;;;2649:27;2679:7;;2687:1;2679:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2649:40;;;:::i;:::-;;;2722:26;2741:6;2722:18;:26::i;:::-;2703:13;2717:1;2703:16;;;;;;;;:::i;:::-;;;;;;:45;;;;2777:61;2794:6;2802:35;2820:13;2834:1;2820:16;;;;;;;;:::i;:::-;;;;;;;2802:17;:35::i;2777:61::-;2763:8;2772:1;2763:11;;;;;;;;:::i;:::-;;;;;;:75;;;;2634:215;2629:3;;;;;:::i;:::-;;;;2593:256;;;-1:-1:-1;2866:61:80;;;;;:7;;:22;;:61;;2889:12;;2903:13;;2918:8;;2866:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2858:104;;;;;;;16923:2:111;2858:104:80;;;16905:21:111;16962:2;16942:18;;;16935:30;17001:32;16981:18;;;16974:60;17051:18;;2858:104:80;16721:354:111;2858:104:80;2250:719;;;;2135:834;;;;:::o;608:386:79:-;-1:-1:-1;;;;;;;;;;;;;;;;;701:6:79;710;717:1;710:9;;;;;;;;:::i;:::-;;;;;;;:11;;;701:20;;731:6;740;747:1;740:9;;;;;;;;:::i;:::-;;;;;;;;;;;;:11;;;-1:-1:-1;770:1:79;;782:127;803:6;:13;799:1;:17;782:127;;;849:49;856:1;859;862;865:6;872:1;865:9;;;;;;;;:::i;:::-;;;;;;;:11;;;878:6;885:1;878:9;;;;;;;;:::i;:::-;;;;;;;:11;;;891:1;894:3;849:6;:49::i;:::-;837:61;;-1:-1:-1;837:61:79;-1:-1:-1;837:61:79;-1:-1:-1;818:3:79;;;;:::i;:::-;;;;782:127;;;;927:22;936:1;939;942;945:3;927:8;:22::i;:::-;959:9;;;978:5;;;:9;-1:-1:-1;959:3:79;;608:386;-1:-1:-1;;;;608:386:79:o;4858:143:80:-;4936:7;4983:9;4972:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;4962:32;;;;;;4955:39;;4858:143;;;:::o;4096:273::-;4197:17;;:::i;:::-;4226:18;4247:37;4262:6;4270:13;4247:14;:37::i;:::-;4226:58;;4301:7;:19;524:31;4350:10;4333:28;;;;;;17209:19:111;;17253:2;17244:12;;17080:182;4333:28:80;;;;;;;;;;;;;4301:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4294:68;4096:273;-1:-1:-1;;;;4096:273:80:o;4626:226::-;4725:7;4772:26;4791:6;4772:18;:26::i;:::-;4761:83;;;;;;18399:25:111;;;;18440:18;;18433:34;;;4823:4:80;18483:18:111;;;18476:83;4830:13:80;18575:18:111;;;18568:34;18371:19;;4761:83:80;;;;;;;;;;;;4751:94;;;;;;4744:101;;4626:226;;;;:::o;1382:1850:79:-;1573:7;;;1618:8;;:20;;;;-1:-1:-1;1630:8:79;;1618:20;1614:60;;;-1:-1:-1;1660:3:79;;-1:-1:-1;1665:3:79;;-1:-1:-1;1670:3:79;1652:22;;1614:60;1688:8;;:20;;;;-1:-1:-1;1700:8:79;;1688:20;1684:60;;;-1:-1:-1;1730:3:79;;-1:-1:-1;1735:3:79;;-1:-1:-1;1740:3:79;1722:22;;1684:60;1892:17;;:::i;:::-;1978:3;1961:21;;;;;:::i;:::-;1973:3;1968;1961:21;1953:29;;2019:3;;2000:23;;;;:::i;:::-;2012:5;;2007:3;2000:23;1992:5;;;:31;2058:3;;2041:21;;;;:::i;:::-;2053:3;2048;2041:21;2033:5;;;:29;2099:3;;2080:23;;;;:::i;:::-;2092:5;;;;2087:3;2080:23;2072:5;;;:31;2140:147;;;;;;;;;;2174:3;;2155:23;;;;:::i;:::-;2167:5;;;;2162:3;2155:23;2140:147;;;;2207:3;2188:23;;;;;:::i;:::-;2200:5;;;;2195:3;2188:23;2140:147;;;;2240:3;2221:23;;;;;:::i;:::-;2233:5;;2228:3;2221:23;2140:147;;;;2273:3;2254:23;;;;;:::i;:::-;2266:5;;;;2261:3;2254:23;2140:147;;2402:5;;;;2393;;2140:147;;-1:-1:-1;2393:14:79;;;:32;;-1:-1:-1;2420:5:79;;;;;2411;;;:14;;2393:32;2385:75;;;;;;;19004:2:111;2385:75:79;;;18986:21:111;19043:2;19023:18;;;19016:30;19082:32;19062:18;;;19055:60;19132:18;;2385:75:79;18802:354:111;2385:75:79;2471:17;;:::i;:::-;2545:3;2518:31;;;;;:::i;:::-;2538:5;;2532:11;;:3;:11;:::i;:::-;2525:5;;;;2518:31;2510:39;;2606:3;;2579:31;;;;:::i;:::-;2599:5;;;;2593:11;;:3;:11;:::i;:::-;2586:5;;;;2579:31;2571:5;;;:39;2663:3;;2642:25;;;;:::i;:::-;2656:5;;;2642:25;2634:5;;;:33;2721:3;;2700:25;;;;:::i;:::-;2714:5;;2707;;;;2700:25;2692:5;;;:33;2769:10;2829:3;;2782:51;;;;:::i;:::-;2822:5;;;;2816:11;;:3;:11;:::i;:::-;2810:3;2789:25;;;;;:::i;:::-;2803:5;;;;;2789:25;2782:51;2769:64;;2908:3;2848:64;;;;;:::i;:::-;2902:3;2865:41;;;;;:::i;:::-;2896:3;2875:25;;;;;:::i;:::-;2889:5;;;;2882;;2875:25;2872:1;2865:41;2859:47;;:3;:47;:::i;:::-;2855:2;2848:64;2843:69;;2964:10;3041:3;2977:68;;;;;:::i;:::-;3035:3;2991:48;;;;;:::i;:::-;3025:8;3031:2;3025:3;:8;:::i;:::-;3019:3;2998:25;;;;;:::i;:::-;3012:5;;;;3005;;2998:25;2991:48;2984:5;;;;2977:68;2964:81;;3104:3;3060:48;;;;;:::i;:::-;3098:3;3077:25;;;;;:::i;:::-;3091:5;;;;;3084;;;3077:25;3071:31;;:3;:31;:::i;:::-;3067:2;3060:48;3055:53;;3142:10;3192:3;3155:41;;;;;:::i;:::-;3186:3;3169:21;;;;;:::i;:::-;3181:3;3176;3169:21;3162:5;;3155:41;3214:2;;-1:-1:-1;3218:2:79;;-1:-1:-1;3142:54:79;;-1:-1:-1;;;;1382:1850:79;;;;;;;;;;;;:::o;3516:380::-;3643:7;3652;3675:12;3690:15;3697:2;3701:3;3690:6;:15::i;:::-;3675:30;;3715:13;3750:3;3731:23;;;;;:::i;:::-;3744:4;3738;3731:23;3715:39;;3764:10;3795:3;3777:22;;;;;:::i;:::-;3788:5;3784:2;3777:22;3764:35;;3809:10;3859:3;3822:41;;;;;:::i;:::-;3853:3;3833:24;;;;;:::i;:::-;3846:5;3840:4;3833:24;3829:2;3822:41;3882:2;;;;-1:-1:-1;3516:380:79;;-1:-1:-1;;;;;;;;3516:380:79:o;3145:556:80:-;3289:13;;3320:12;;;;;3360:15;;;;;3350:26;;;;;;3404:15;;;;3394:26;;;;;;3438:19;;;;3475:27;;;;3520:25;;;;3563:19;;;;3600:27;;;;3655:23;;;;3645:34;;;;;;3261:432;;3225:7;;3261:432;;3289:13;;3320:12;3645:34;3261:432;19720:42:111;19708:55;;;;19690:74;;19795:2;19780:18;;19773:34;;;;19838:2;19823:18;;19816:34;;;;19881:2;19866:18;;19859:34;;;;19924:3;19909:19;;19902:35;;;;19968:3;19953:19;;19946:35;20012:3;19997:19;;19990:35;20056:3;20041:19;;20034:35;20100:3;20085:19;;20078:35;20144:3;20129:19;;20122:35;19677:3;19662:19;;19291:872;4069:439:79;4133:7;4160;;;;;:20;;;4177:3;4171:2;:9;;4160:20;:32;;;;-1:-1:-1;4184:8:79;;;4160:32;4152:59;;;;;;;20370:2:111;4152:59:79;;;20352:21:111;20409:2;20389:18;;;20382:30;20448:16;20428:18;;;20421:44;20482:18;;4152:59:79;20168:338:111;4152:59:79;4221:9;4259:1;4282:3;4221:9;4314:169;4321:7;;4314:169;;4348:6;4352:2;4348:1;:6;:::i;:::-;4344:10;;4381:4;4427:3;4387:44;;;;;:::i;:::-;4420:3;4404:20;;;;;:::i;:::-;4414:4;4411:1;4404:20;4398:26;;:3;:26;:::i;:::-;4394:1;4387:44;4368:64;;-1:-1:-1;4368:64:79;-1:-1:-1;4457:2:79;4465:6;4457:2;4465:1;:6;:::i;:::-;4461:10;;:1;:10;:::i;:::-;4446:26;-1:-1:-1;4446:26:79;-1:-1:-1;4314:169:79;;;-1:-1:-1;4500:1:79;;4069:439;-1:-1:-1;;;;;4069:439:79:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;196:389:111:-;281:8;291:6;345:3;338:4;330:6;326:17;322:27;312:55;;363:1;360;353:12;312:55;-1:-1:-1;386:20:111;;429:18;418:30;;415:50;;;461:1;458;451:12;415:50;498:4;490:6;486:17;474:29;;558:3;551:4;541:6;538:1;534:14;526:6;522:27;518:38;515:47;512:67;;;575:1;572;565:12;512:67;196:389;;;;;:::o;590:493::-;710:6;718;771:2;759:9;750:7;746:23;742:32;739:52;;;787:1;784;777:12;739:52;827:9;814:23;860:18;852:6;849:30;846:50;;;892:1;889;882:12;846:50;931:92;1015:7;1006:6;995:9;991:22;931:92;:::i;:::-;1042:8;;905:118;;-1:-1:-1;590:493:111;-1:-1:-1;;;;590:493:111:o;1088:530::-;1129:3;1167:5;1161:12;1194:6;1189:3;1182:19;1219:1;1229:162;1243:6;1240:1;1237:13;1229:162;;;1305:4;1361:13;;;1357:22;;1351:29;1333:11;;;1329:20;;1322:59;1258:12;1229:162;;;1409:6;1406:1;1403:13;1400:87;;;1475:1;1468:4;1459:6;1454:3;1450:16;1446:27;1439:38;1400:87;-1:-1:-1;1532:2:111;1520:15;1537:66;1516:88;1507:98;;;;1607:4;1503:109;;1088:530;-1:-1:-1;;1088:530:111:o;1623:217::-;1770:2;1759:9;1752:21;1733:4;1790:44;1830:2;1819:9;1815:18;1807:6;1790:44;:::i;1845:184::-;1897:77;1894:1;1887:88;1994:4;1991:1;1984:15;2018:4;2015:1;2008:15;2034:255;2106:2;2100:9;2148:6;2136:19;;2185:18;2170:34;;2206:22;;;2167:62;2164:88;;;2232:18;;:::i;:::-;2268:2;2261:22;2034:255;:::o;2294:246::-;2361:2;2355:9;;;2391:15;;2436:18;2421:34;;2457:22;;;2418:62;2415:88;;;2483:18;;:::i;2545:154::-;2631:42;2624:5;2620:54;2613:5;2610:65;2600:93;;2689:1;2686;2679:12;2600:93;2545:154;:::o;2704:134::-;2772:20;;2801:31;2772:20;2801:31;:::i;:::-;2704:134;;;:::o;2843:777::-;2885:5;2938:3;2931:4;2923:6;2919:17;2915:27;2905:55;;2956:1;2953;2946:12;2905:55;2992:6;2979:20;3018:18;3055:2;3051;3048:10;3045:36;;;3061:18;;:::i;:::-;3195:2;3189:9;3257:4;3249:13;;3100:66;3245:22;;;3269:2;3241:31;3237:40;3225:53;;;3293:18;;;3313:22;;;3290:46;3287:72;;;3339:18;;:::i;:::-;3379:10;3375:2;3368:22;3414:2;3406:6;3399:18;3460:3;3453:4;3448:2;3440:6;3436:15;3432:26;3429:35;3426:55;;;3477:1;3474;3467:12;3426:55;3541:2;3534:4;3526:6;3522:17;3515:4;3507:6;3503:17;3490:54;3588:1;3581:4;3576:2;3568:6;3564:15;3560:26;3553:37;3608:6;3599:15;;;;;;2843:777;;;;:::o;3625:1454::-;3685:5;3733:6;3721:9;3716:3;3712:19;3708:32;3705:52;;;3753:1;3750;3743:12;3705:52;3775:22;;:::i;:::-;3766:31;;3820:29;3839:9;3820:29;:::i;:::-;3813:5;3806:44;3910:2;3899:9;3895:18;3882:32;3877:2;3870:5;3866:14;3859:56;3966:2;3955:9;3951:18;3938:32;3989:18;4030:2;4022:6;4019:14;4016:34;;;4046:1;4043;4036:12;4016:34;4082:45;4123:3;4114:6;4103:9;4099:22;4082:45;:::i;:::-;4077:2;4070:5;4066:14;4059:69;4181:2;4170:9;4166:18;4153:32;4137:48;;4210:2;4200:8;4197:16;4194:36;;;4226:1;4223;4216:12;4194:36;4262:47;4305:3;4294:8;4283:9;4279:24;4262:47;:::i;:::-;4257:2;4250:5;4246:14;4239:71;4371:3;4360:9;4356:19;4343:33;4337:3;4330:5;4326:15;4319:58;4438:3;4427:9;4423:19;4410:33;4404:3;4397:5;4393:15;4386:58;4505:3;4494:9;4490:19;4477:33;4471:3;4464:5;4460:15;4453:58;4572:3;4561:9;4557:19;4544:33;4538:3;4531:5;4527:15;4520:58;4597:3;4587:13;;4660:2;4649:9;4645:18;4632:32;4627:2;4620:5;4616:14;4609:56;4684:3;4674:13;;4740:2;4729:9;4725:18;4712:32;4769:2;4759:8;4756:16;4753:36;;;4785:1;4782;4775:12;4753:36;4821:47;4864:3;4853:8;4842:9;4838:24;4821:47;:::i;:::-;4816:2;4809:5;4805:14;4798:71;;4888:3;4878:13;;4944:2;4933:9;4929:18;4916:32;4973:2;4963:8;4960:16;4957:36;;;4989:1;4986;4979:12;4957:36;5025:47;5068:3;5057:8;5046:9;5042:24;5025:47;:::i;:::-;5020:2;5013:5;5009:14;5002:71;;;;3625:1454;;;;:::o;5084:358::-;5175:6;5228:2;5216:9;5207:7;5203:23;5199:32;5196:52;;;5244:1;5241;5234:12;5196:52;5284:9;5271:23;5317:18;5309:6;5306:30;5303:50;;;5349:1;5346;5339:12;5303:50;5372:64;5428:7;5419:6;5408:9;5404:22;5372:64;:::i;5447:494::-;5627:2;5612:18;;5616:9;5707:6;5585:4;5741:194;5755:4;5752:1;5749:11;5741:194;;;5814:13;;5802:26;;5851:4;5875:12;;;;5910:15;;;;5775:1;5768:9;5741:194;;;5745:3;;;5447:494;;;;:::o;5946:440::-;6034:6;6042;6095:2;6083:9;6074:7;6070:23;6066:32;6063:52;;;6111:1;6108;6101:12;6063:52;6150:9;6137:23;6169:31;6194:5;6169:31;:::i;:::-;6219:5;-1:-1:-1;6276:2:111;6261:18;;6248:32;6324:10;6311:24;;6299:37;;6289:65;;6350:1;6347;6340:12;6289:65;6373:7;6363:17;;;5946:440;;;;;:::o;6391:495::-;6571:3;6556:19;;6560:9;6652:6;6529:4;6686:194;6700:4;6697:1;6694:11;6686:194;;;6759:13;;6747:26;;6796:4;6820:12;;;;6855:15;;;;6720:1;6713:9;6686:194;;6891:394;6984:6;7037:2;7025:9;7016:7;7012:23;7008:32;7005:52;;;7053:1;7050;7043:12;7005:52;7093:9;7080:23;7126:18;7118:6;7115:30;7112:50;;;7158:1;7155;7148:12;7112:50;7181:22;;7237:3;7219:16;;;7215:26;7212:46;;;7254:1;7251;7244:12;7290:320;7358:6;7411:2;7399:9;7390:7;7386:23;7382:32;7379:52;;;7427:1;7424;7417:12;7379:52;7467:9;7454:23;7500:18;7492:6;7489:30;7486:50;;;7532:1;7529;7522:12;7486:50;7555:49;7596:7;7587:6;7576:9;7572:22;7555:49;:::i;7797:962::-;7937:6;7945;7953;7961;8014:2;8002:9;7993:7;7989:23;7985:32;7982:52;;;8030:1;8027;8020:12;7982:52;8070:9;8057:23;8099:18;8140:2;8132:6;8129:14;8126:34;;;8156:1;8153;8146:12;8126:34;8195:92;8279:7;8270:6;8259:9;8255:22;8195:92;:::i;:::-;8306:8;;-1:-1:-1;8169:118:111;-1:-1:-1;8394:2:111;8379:18;;8366:32;;-1:-1:-1;8410:16:111;;;8407:36;;;8439:1;8436;8429:12;8407:36;8477:8;8466:9;8462:24;8452:34;;8524:7;8517:4;8513:2;8509:13;8505:27;8495:55;;8546:1;8543;8536:12;8495:55;8586:2;8573:16;8612:2;8604:6;8601:14;8598:34;;;8628:1;8625;8618:12;8598:34;8673:7;8668:2;8659:6;8655:2;8651:15;8647:24;8644:37;8641:57;;;8694:1;8691;8684:12;8641:57;7797:962;;;;-1:-1:-1;;8725:2:111;8717:11;;-1:-1:-1;;;7797:962:111:o;8764:184::-;8816:77;8813:1;8806:88;8913:4;8910:1;8903:15;8937:4;8934:1;8927:15;8953:390;9053:4;9111:11;9098:25;9201:66;9190:8;9174:14;9170:29;9166:102;9146:18;9142:127;9132:155;;9283:1;9280;9273:12;9132:155;9304:33;;;;;8953:390;-1:-1:-1;;8953:390:111:o;9348:580::-;9425:4;9431:6;9491:11;9478:25;9581:66;9570:8;9554:14;9550:29;9546:102;9526:18;9522:127;9512:155;;9663:1;9660;9653:12;9512:155;9690:33;;9742:20;;;-1:-1:-1;9785:18:111;9774:30;;9771:50;;;9817:1;9814;9807:12;9771:50;9850:4;9838:17;;-1:-1:-1;9881:14:111;9877:27;;;9867:38;;9864:58;;;9918:1;9915;9908:12;9933:248;10001:6;10009;10062:2;10050:9;10041:7;10037:23;10033:32;10030:52;;;10078:1;10075;10068:12;10030:52;-1:-1:-1;;10101:23:111;;;10171:2;10156:18;;;10143:32;;-1:-1:-1;9933:248:111:o;10186:184::-;10238:77;10235:1;10228:88;10335:4;10332:1;10325:15;10359:4;10356:1;10349:15;10375:195;10414:3;10445:66;10438:5;10435:77;10432:103;;10515:18;;:::i;:::-;-1:-1:-1;10562:1:111;10551:13;;10375:195::o;11025:765::-;11118:6;11171:3;11159:9;11150:7;11146:23;11142:33;11139:53;;;11188:1;11185;11178:12;11139:53;11237:7;11230:4;11219:9;11215:20;11211:34;11201:62;;11259:1;11256;11249:12;11201:62;11292:2;11286:9;11334:3;11326:6;11322:16;11404:6;11392:10;11389:22;11368:18;11356:10;11353:34;11350:62;11347:88;;;11415:18;;:::i;:::-;11451:2;11444:22;11486:6;11530:3;11515:19;;11546;;;11543:39;;;11578:1;11575;11568:12;11543:39;11602:9;11620:139;11636:6;11631:3;11628:15;11620:139;;;11704:10;;11692:23;;11744:4;11735:14;;;;11653;11620:139;;11795:591;11877:6;11930:2;11918:9;11909:7;11905:23;11901:32;11898:52;;;11946:1;11943;11936:12;11898:52;11995:7;11988:4;11977:9;11973:20;11969:34;11959:62;;12017:1;12014;12007:12;11959:62;12041:17;;:::i;:::-;12080:3;12121:2;12110:9;12106:18;12147:7;12139:6;12136:19;12133:39;;;12168:1;12165;12158:12;12133:39;12192:9;12210:146;12226:6;12221:3;12218:15;12210:146;;;12294:17;;12282:30;;12341:4;12332:14;;;;12243;12210:146;;;-1:-1:-1;12375:5:111;;11795:591;-1:-1:-1;;;;;11795:591:111:o;12391:213::-;12507:9;12544:54;12583:14;12576:5;12544:54;:::i;:::-;12531:67;12391:213;-1:-1:-1;;12391:213:111:o;12609:351::-;12727:5;12750:1;12760:194;12774:4;12771:1;12768:11;12760:194;;;12833:13;;12821:26;;12870:4;12894:12;;;;12929:15;;;;12794:1;12787:9;12760:194;;;12764:3;;12609:351;;:::o;12965:326::-;13058:5;13081:1;13091:194;13105:4;13102:1;13099:11;13091:194;;;13164:13;;13152:26;;13201:4;13225:12;;;;13260:15;;;;13125:1;13118:9;13091:194;;13296:571;13632:3;13617:19;;13645:68;13621:9;13695:6;13645:68;:::i;:::-;13722:52;13770:2;13759:9;13755:18;13747:6;13722:52;:::i;:::-;13783:78;13856:3;13845:9;13841:19;13833:6;13783:78;:::i;13872:277::-;13939:6;13992:2;13980:9;13971:7;13967:23;13963:32;13960:52;;;14008:1;14005;13998:12;13960:52;14040:9;14034:16;14093:5;14086:13;14079:21;14072:5;14069:32;14059:60;;14115:1;14112;14105:12;15199:1517;15593:4;15622:3;15663:2;15652:9;15648:18;15675:68;15733:9;15725:6;15675:68;:::i;:::-;15762:2;15780:18;;;15773:30;;;15852:13;;15874:22;;;;15950:4;;15927:3;15912:19;;;15977:15;;;16010:1;16020:187;16034:6;16031:1;16028:13;16020:187;;;16083:44;16123:3;16114:6;16108:13;16083:44;:::i;:::-;16147:12;;;;16182:15;;;;16056:1;16049:9;16020:187;;;-1:-1:-1;;;16243:19:111;;;16238:2;16223:18;;16216:47;16313:13;;16335:21;;;16374:12;;;;-1:-1:-1;16411:15:111;;;;16446:1;16456:232;16472:8;16467:3;16464:17;16456:232;;;16527:73;16594:5;16583:8;16577:15;16527:73;:::i;:::-;16622:14;;;;16661:17;;;;16500:1;16491:11;16456:232;;;-1:-1:-1;16705:5:111;;15199:1517;-1:-1:-1;;;;;;;;;15199:1517:111:o;17267:296::-;17450:6;17439:9;17432:25;17493:2;17488;17477:9;17473:18;17466:30;17413:4;17513:44;17553:2;17542:9;17538:18;17530:6;17513:44;:::i;17568:595::-;17661:6;17714:2;17702:9;17693:7;17689:23;17685:32;17682:52;;;17730:1;17727;17720:12;17682:52;17779:7;17772:4;17761:9;17757:20;17753:34;17743:62;;17801:1;17798;17791:12;17743:62;17825:17;;:::i;:::-;17864:3;17905:2;17894:9;17890:18;17931:7;17923:6;17920:19;17917:39;;;17952:1;17949;17942:12;17917:39;17976:9;17994:139;18010:6;18005:3;18002:15;17994:139;;;18078:10;;18066:23;;18118:4;18109:14;;;;18027;17994:139;;18613:184;18665:77;18662:1;18655:88;18762:4;18759:1;18752:15;18786:4;18783:1;18776:15;19161:125;19201:4;19229:1;19226;19223:8;19220:34;;;19234:18;;:::i;:::-;-1:-1:-1;19271:9:111;;19161:125::o;20511:274::-;20551:1;20577;20567:189;;20612:77;20609:1;20602:88;20713:4;20710:1;20703:15;20741:4;20738:1;20731:15;20567:189;-1:-1:-1;20770:9:111;;20511:274::o;20790:228::-;20830:7;20956:1;20888:66;20884:74;20881:1;20878:81;20873:1;20866:9;20859:17;20855:105;20852:131;;;20963:18;;:::i;:::-;-1:-1:-1;21003:9:111;;20790:228::o"},"gasEstimates":{"creation":{"codeDepositCost":"1455800","executionCost":"1520","totalCost":"1457320"},"external":{"BLS_DOMAIN()":"208","N()":"228","addStake(address,uint32)":"infinite","aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"infinite","getTrailingPublicKey(bytes)":"infinite","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite","getUserOpPublicKey((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite","userOpToMessage((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"infinite","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite"},"internal":{"_getPublicKeyHash(uint256[4] memory)":"infinite","_getUserOpHash(struct UserOperation memory,bytes32)":"infinite","_userOpToMessage(struct UserOperation memory,bytes32)":"infinite","internalUserOpHash(struct UserOperation memory)":"infinite"}},"methodIdentifiers":{"BLS_DOMAIN()":"009d9250","N()":"c9e525df","addStake(address,uint32)":"45171159","aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","getTrailingPublicKey(bytes)":"b7620eb4","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","getUserOpPublicKey((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"57f09b72","userOpToMessage((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"40864431","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"BLS_DOMAIN\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"N\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"getTrailingPublicKey\",\"outputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"publicKey\",\"type\":\"uint256[4]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpPublicKey\",\"outputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"publicKey\",\"type\":\"uint256[4]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"userOpToMessage\",\"outputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"\",\"type\":\"uint256[2]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"sigForUserOp\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"params\":{\"userOps\":\"array of UserOperations to collect the signatures from.\"},\"returns\":{\"aggregatedSignature\":\"the aggregated signature\"}},\"getUserOpPublicKey((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"returns\":{\"publicKey\":\"- the public key from a BLS keypair the Aggregator will use to verify this UserOp; normally public key will be queried from the deployed BLSAccount itself; the public key will be read from the 'initCode' if the account is not deployed yet;\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"sigForUserOp\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(address,uint32)\":{\"notice\":\"allow staking for this aggregator there is no limit on stake or delay, but it is not a problem, since it is a permissionless signature aggregator, which doesn't support unstaking.\"},\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation\"},\"getTrailingPublicKey(bytes)\":{\"notice\":\"return the trailing 4 words of input data\"},\"userOpToMessage((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"return the BLS \\\"message\\\" for the given UserOp. the account checks the signature over this value using its public key\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is called after EntryPoint.simulateValidation() returns an aggregator. First it validates the signature over the userOp. then it return data to be used when creating the handleOps:\"}},\"notice\":\"A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/BLSSignatureAggregator.sol\":\"BLSSignatureAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/BLSHelper.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n// code taken from : https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\\n// missing core functions from \\\"thehubbleproject/bls\\\": jacAdd (and sum)\\nlibrary BLSHelper {\\n\\n struct XY {\\n uint x;\\n uint y;\\n }\\n /**\\n * sum all the points in the array\\n * NOTE: the \\\"ecAdd\\\" (below) has a special case where x1==y2.\\n * @param points an array of bytes32[2], representing an (x,y) of a point\\n * @param _pp the modulus of the curve\\n * @return ret the sum of all points\\n */\\n function sum(XY[] memory points, uint256 _pp) internal pure returns (XY memory ret){\\n uint x = points[0].x;\\n uint y = points[0].y;\\n uint z = 1;\\n\\n for (uint i = 1; i < points.length; i++) {\\n (x, y, z) = jacAdd(x, y, z, points[i].x, points[i].y, 1, _pp);\\n }\\n (x, y) = toAffine(x, y, z, _pp);\\n ret.x = x;\\n ret.y = y;\\n }\\n\\n /// @dev Adds two points (x1, y1, z1) and (x2, y2, z2).\\n /// @param _x1 coordinate x of P1\\n /// @param _y1 coordinate y of P1\\n /// @param _z1 coordinate z of P1\\n /// @param _x2 coordinate x of square\\n /// @param _y2 coordinate y of square\\n /// @param _z2 coordinate z of square\\n /// @param _pp the modulus\\n /// @return (qx, qy, qz) P1+square in Jacobian\\n function jacAdd(\\n uint256 _x1,\\n uint256 _y1,\\n uint256 _z1,\\n uint256 _x2,\\n uint256 _y2,\\n uint256 _z2,\\n uint256 _pp)\\n internal pure returns (uint256, uint256, uint256)\\n {\\n if (_x1 == 0 && _y1 == 0)\\n return (_x2, _y2, _z2);\\n if (_x2 == 0 && _y2 == 0)\\n return (_x1, _y1, _z1);\\n\\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\\n uint[4] memory zs;\\n // z1^2, z1^3, z2^2, z2^3\\n zs[0] = mulmod(_z1, _z1, _pp);\\n zs[1] = mulmod(_z1, zs[0], _pp);\\n zs[2] = mulmod(_z2, _z2, _pp);\\n zs[3] = mulmod(_z2, zs[2], _pp);\\n\\n // u1, s1, u2, s2\\n zs = [\\n mulmod(_x1, zs[2], _pp),\\n mulmod(_y1, zs[3], _pp),\\n mulmod(_x2, zs[0], _pp),\\n mulmod(_y2, zs[1], _pp)\\n ];\\n\\n // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used\\n require(zs[0] != zs[2] || zs[1] != zs[3], \\\"Use jacDouble function instead\\\");\\n\\n uint[4] memory hr;\\n //h\\n hr[0] = addmod(zs[2], _pp - zs[0], _pp);\\n //r\\n hr[1] = addmod(zs[3], _pp - zs[1], _pp);\\n //h^2\\n hr[2] = mulmod(hr[0], hr[0], _pp);\\n // h^3\\n hr[3] = mulmod(hr[2], hr[0], _pp);\\n // qx = -h^3 -2u1h^2+r^2\\n uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\\n qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\\n // qy = -s1*z1*h^3+r(u1*h^2 -x^3)\\n uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\\n qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\\n // qz = h*z1*z2\\n uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\\n return (qx, qy, qz);\\n }\\n\\n\\n /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\\n /// @param _x coordinate x\\n /// @param _y coordinate y\\n /// @param _z coordinate z\\n /// @param _pp the modulus\\n /// @return (x', y') affine coordinates\\n function toAffine(\\n uint256 _x,\\n uint256 _y,\\n uint256 _z,\\n uint256 _pp)\\n internal pure returns (uint256, uint256)\\n {\\n uint256 zInv = invMod(_z, _pp);\\n uint256 zInv2 = mulmod(zInv, zInv, _pp);\\n uint256 x2 = mulmod(_x, zInv2, _pp);\\n uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\\n\\n return (x2, y2);\\n }\\n\\n\\n /// @dev Modular euclidean inverse of a number (mod p).\\n /// @param _x The number\\n /// @param _pp The modulus\\n /// @return q such that x*q = 1 (mod _pp)\\n function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\\n require(_x != 0 && _x != _pp && _pp != 0, \\\"Invalid number\\\");\\n uint256 q = 0;\\n uint256 newT = 1;\\n uint256 r = _pp;\\n uint256 t;\\n while (_x != 0) {\\n t = r / _x;\\n (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\\n (r, _x) = (_x, r - t * _x);\\n }\\n\\n return q;\\n }\\n\\n /// @dev Doubles a point (x, y, z).\\n /// @param _x coordinate x of P1\\n /// @param _y coordinate y of P1\\n /// @param _z coordinate z of P1\\n /// @param _aa the a scalar in the curve equation\\n /// @param _pp the modulus\\n /// @return (qx, qy, qz) 2P in Jacobian\\n function jacDouble(\\n uint256 _x,\\n uint256 _y,\\n uint256 _z,\\n uint256 _aa,\\n uint256 _pp)\\n internal pure returns (uint256, uint256, uint256)\\n {\\n if (_z == 0)\\n return (_x, _y, _z);\\n\\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\\n // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4)\\n // x, y, z at this point represent the squares of _x, _y, _z\\n uint256 x = mulmod(_x, _x, _pp); //x1^2\\n uint256 y = mulmod(_y, _y, _pp); //y1^2\\n uint256 z = mulmod(_z, _z, _pp); //z1^2\\n\\n // s\\n uint s = mulmod(4, mulmod(_x, y, _pp), _pp);\\n // m\\n uint m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\\n\\n // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper\\n // This allows to reduce the gas cost and stack footprint of the algorithm\\n // qx\\n x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\\n // qy = -8*y1^4 + M(S-T)\\n y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\\n // qz = 2*y1*z1\\n z = mulmod(2, mulmod(_y, _z, _pp), _pp);\\n\\n return (x, y, z);\\n }\\n\\n /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\\n /// @param _x1 coordinate x of P1\\n /// @param _y1 coordinate y of P1\\n /// @param _x2 coordinate x of P2\\n /// @param _y2 coordinate y of P2\\n /// @param _aa constant of the curve\\n /// @param _pp the modulus\\n /// @return (qx, qy) = P1+P2 in affine coordinates\\n function ecAdd(\\n uint256 _x1,\\n uint256 _y1,\\n uint256 _x2,\\n uint256 _y2,\\n uint256 _aa,\\n uint256 _pp)\\n internal pure returns (uint256, uint256)\\n {\\n uint x = 0;\\n uint y = 0;\\n uint z = 0;\\n\\n // Double if x1==x2 else add\\n if (_x1 == _x2) {\\n // y1 = -y2 mod p\\n if (addmod(_y1, _y2, _pp) == 0) {\\n return (0, 0);\\n } else {\\n // P1 = P2\\n (x, y, z) = jacDouble(\\n _x1,\\n _y1,\\n 1,\\n _aa,\\n _pp);\\n }\\n } else {\\n (x, y, z) = jacAdd(\\n _x1,\\n _y1,\\n 1,\\n _x2,\\n _y2,\\n 1,\\n _pp);\\n }\\n // Get back to affine\\n return toAffine(\\n x,\\n y,\\n z,\\n _pp);\\n }\\n\\n}\\n\",\"keccak256\":\"0x852546b7e887230f569fa4b8c30dcd0927f8a068c61f72b2180b03102a173911\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/BLSSignatureAggregator.sol\":{\"content\":\"//SPDX-License-Identifier: Unlicense\\npragma solidity >=0.8.4 <0.9.0;\\npragma abicoder v2;\\n\\nimport \\\"../../interfaces/IAggregator.sol\\\";\\nimport \\\"../../interfaces/IEntryPoint.sol\\\";\\nimport {BLSOpen} from \\\"./lib/BLSOpen.sol\\\";\\nimport \\\"./IBLSAccount.sol\\\";\\nimport \\\"./BLSHelper.sol\\\";\\n\\n/**\\n * A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount\\n */\\ncontract BLSSignatureAggregator is IAggregator {\\n using UserOperationLib for UserOperation;\\n\\n bytes32 public constant BLS_DOMAIN = keccak256(\\\"eip4337.bls.domain\\\");\\n\\n //copied from BLS.sol\\n uint256 public constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n /**\\n * @return publicKey - the public key from a BLS keypair the Aggregator will use to verify this UserOp;\\n * normally public key will be queried from the deployed BLSAccount itself;\\n * the public key will be read from the 'initCode' if the account is not deployed yet;\\n */\\n function getUserOpPublicKey(UserOperation memory userOp) public view returns (uint256[4] memory publicKey) {\\n bytes memory initCode = userOp.initCode;\\n if (initCode.length > 0) {\\n publicKey = getTrailingPublicKey(initCode);\\n } else {\\n return IBLSAccount(userOp.sender).getBlsPublicKey{gas : 50000}();\\n }\\n }\\n\\n /**\\n * return the trailing 4 words of input data\\n */\\n function getTrailingPublicKey(bytes memory data) public pure returns (uint256[4] memory publicKey) {\\n uint len = data.length;\\n require(len > 32 * 4, \\\"data too short for sig\\\");\\n\\n /* solhint-disable-next-line no-inline-assembly */\\n assembly {\\n // actual buffer starts at data+32, so last 128 bytes start at data+32+len-128 = data+len-96\\n let ofs := sub(add(data, len), 96)\\n mstore(publicKey, mload(ofs))\\n mstore(add(publicKey, 32), mload(add(ofs, 32)))\\n mstore(add(publicKey, 64), mload(add(ofs, 64)))\\n mstore(add(publicKey, 96), mload(add(ofs, 96)))\\n }\\n }\\n\\n /// @inheritdoc IAggregator\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature)\\n external view override {\\n require(signature.length == 64, \\\"BLS: invalid signature\\\");\\n (uint256[2] memory blsSignature) = abi.decode(signature, (uint256[2]));\\n\\n uint userOpsLen = userOps.length;\\n uint256[4][] memory blsPublicKeys = new uint256[4][](userOpsLen);\\n uint256[2][] memory messages = new uint256[2][](userOpsLen);\\n for (uint256 i = 0; i < userOpsLen; i++) {\\n\\n UserOperation memory userOp = userOps[i];\\n blsPublicKeys[i] = getUserOpPublicKey(userOp);\\n\\n messages[i] = _userOpToMessage(userOp, _getPublicKeyHash(blsPublicKeys[i]));\\n }\\n require(BLSOpen.verifyMultiple(blsSignature, blsPublicKeys, messages), \\\"BLS: validateSignatures failed\\\");\\n }\\n\\n /**\\n * get a hash of userOp\\n * NOTE: this hash is not the same as UserOperation.hash()\\n * (slightly less efficient, since it uses memory userOp)\\n */\\n function internalUserOpHash(UserOperation memory userOp) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n userOp.sender,\\n userOp.nonce,\\n keccak256(userOp.initCode),\\n keccak256(userOp.callData),\\n userOp.callGasLimit,\\n userOp.verificationGasLimit,\\n userOp.preVerificationGas,\\n userOp.maxFeePerGas,\\n userOp.maxPriorityFeePerGas,\\n keccak256(userOp.paymasterAndData)\\n ));\\n }\\n\\n /**\\n * return the BLS \\\"message\\\" for the given UserOp.\\n * the account checks the signature over this value using its public key\\n */\\n function userOpToMessage(UserOperation memory userOp) public view returns (uint256[2] memory) {\\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\\n return _userOpToMessage(userOp, publicKeyHash);\\n }\\n\\n function _userOpToMessage(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (uint256[2] memory) {\\n bytes32 userOpHash = _getUserOpHash(userOp, publicKeyHash);\\n return BLSOpen.hashToPoint(BLS_DOMAIN, abi.encodePacked(userOpHash));\\n }\\n\\n // helper for test\\n function getUserOpHash(UserOperation memory userOp) public view returns (bytes32) {\\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\\n return _getUserOpHash(userOp, publicKeyHash);\\n }\\n\\n function _getUserOpHash(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (bytes32) {\\n return keccak256(abi.encode(internalUserOpHash(userOp), publicKeyHash, address(this), block.chainid));\\n }\\n\\n function _getPublicKeyHash(uint256[4] memory publicKey) internal pure returns(bytes32) {\\n return keccak256(abi.encode(publicKey));\\n }\\n /**\\n * validate signature of a single userOp\\n * This method is called after EntryPoint.simulateValidation() returns an aggregator.\\n * First it validates the signature over the userOp. then it return data to be used when creating the handleOps:\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp) {\\n uint256[2] memory signature = abi.decode(userOp.signature, (uint256[2]));\\n uint256[4] memory pubkey = getUserOpPublicKey(userOp);\\n uint256[2] memory message = _userOpToMessage(userOp, _getPublicKeyHash(pubkey));\\n\\n require(BLSOpen.verifySingle(signature, pubkey, message), \\\"BLS: wrong sig\\\");\\n return \\\"\\\";\\n }\\n\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\\n BLSHelper.XY[] memory points = new BLSHelper.XY[](userOps.length);\\n for (uint i = 0; i < points.length; i++) {\\n (uint256 x, uint256 y) = abi.decode(userOps[i].signature, (uint256, uint256));\\n points[i] = BLSHelper.XY(x, y);\\n }\\n BLSHelper.XY memory sum = BLSHelper.sum(points, N);\\n return abi.encode(sum.x, sum.y);\\n }\\n\\n /**\\n * allow staking for this aggregator\\n * there is no limit on stake or delay, but it is not a problem, since it is a permissionless\\n * signature aggregator, which doesn't support unstaking.\\n */\\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\\n entryPoint.addStake{value : msg.value}(delay);\\n }\\n}\\n\",\"keccak256\":\"0xf9ac0c4a702d69a563c0e6815746bd668384a554c2d4d0b85eec1b5e0335e514\",\"license\":\"Unlicense\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"},\"contracts/samples/bls/lib/BLSOpen.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\nimport { BLS } from \\\"./hubble-contracts/contracts/libs/BLS.sol\\\";\\n\\nlibrary BLSOpen {\\n function verifySingle(\\n uint256[2] memory signature,\\n uint256[4] memory pubkey,\\n uint256[2] memory message\\n ) external view returns (bool) {\\n uint256[4][] memory pubkeys = new uint256[4][](1);\\n uint256[2][] memory messages = new uint256[2][](1);\\n pubkeys[0] = pubkey;\\n messages[0] = message;\\n\\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\\n signature,\\n pubkeys,\\n messages\\n );\\n return callSuccess && verified;\\n\\n // // NB: (result, success) opposite of `call` convention (success, result).\\n // (bool verified, bool callSuccess) = BLS.verifySingle(\\n // signature,\\n // pubkey,\\n // message\\n // );\\n // return callSuccess && verified;\\n }\\n\\n function verifyMultiple(\\n uint256[2] memory signature,\\n uint256[4][] memory pubkeys,\\n uint256[2][] memory messages\\n ) external view returns (bool) {\\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\\n signature,\\n pubkeys,\\n messages\\n );\\n return callSuccess && verified;\\n }\\n\\n function hashToPoint(\\n bytes32 domain,\\n bytes memory message\\n ) external view returns (uint256[2] memory) {\\n return BLS.hashToPoint(\\n domain,\\n message\\n );\\n }\\n\\n function isZeroBLSKey(uint256[4] memory blsKey) public pure returns (bool) {\\n bool isZero = true;\\n for (uint256 i=0; isZero && i<4; i++) {\\n isZero = (blsKey[i] == 0);\\n }\\n return isZero;\\n }\\n\\n}\\n\",\"keccak256\":\"0x3775f4ddf247e51fd564e31db07ea8bb381b51fba5e6fb39ed296158419d61c1\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\nimport { ModexpInverse, ModexpSqrt } from \\\"./ModExp.sol\\\";\\nimport {\\n BNPairingPrecompileCostEstimator\\n} from \\\"./BNPairingPrecompileCostEstimator.sol\\\";\\n\\n/**\\n @title Boneh\\u2013Lynn\\u2013Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\\n @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\\n @dev We use G1 points for signatures and messages, and G2 points for public keys\\n */\\nlibrary BLS {\\n // Field order\\n // prettier-ignore\\n uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Negated genarator of G2\\n // prettier-ignore\\n uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n\\n // sqrt(-3)\\n // prettier-ignore\\n uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;\\n // (sqrt(-3) - 1) / 2\\n // prettier-ignore\\n uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;\\n\\n // prettier-ignore\\n uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;\\n // prettier-ignore\\n uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n // estimator address\\n// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;\\n\\n function verifySingle(\\n uint256[2] memory signature,\\n uint256[4] memory pubkey,\\n uint256[2] memory message\\n ) internal view returns (bool, bool) {\\n uint256[12] memory input =\\n [\\n signature[0],\\n signature[1],\\n N_G2_X1,\\n N_G2_X0,\\n N_G2_Y1,\\n N_G2_Y0,\\n message[0],\\n message[1],\\n pubkey[1],\\n pubkey[0],\\n pubkey[3],\\n pubkey[2]\\n ];\\n uint256[1] memory out;\\n uint256 precompileGasCost = gasleft();\\n// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(\\n// 2\\n// );\\n bool callSuccess;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n input,\\n 384,\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n function verifyMultiple(\\n uint256[2] memory signature,\\n uint256[4][] memory pubkeys,\\n uint256[2][] memory messages\\n ) internal view returns (bool checkResult, bool callSuccess) {\\n uint256 size = pubkeys.length;\\n require(size > 0, \\\"BLS: number of public key is zero\\\");\\n require(\\n size == messages.length,\\n \\\"BLS: number of public keys and messages must be equal\\\"\\n );\\n uint256 inputSize = (size + 1) * 6;\\n uint256[] memory input = new uint256[](inputSize);\\n input[0] = signature[0];\\n input[1] = signature[1];\\n input[2] = N_G2_X1;\\n input[3] = N_G2_X0;\\n input[4] = N_G2_Y1;\\n input[5] = N_G2_Y0;\\n for (uint256 i = 0; i < size; i++) {\\n input[i * 6 + 6] = messages[i][0];\\n input[i * 6 + 7] = messages[i][1];\\n input[i * 6 + 8] = pubkeys[i][1];\\n input[i * 6 + 9] = pubkeys[i][0];\\n input[i * 6 + 10] = pubkeys[i][3];\\n input[i * 6 + 11] = pubkeys[i][2];\\n }\\n uint256[1] memory out;\\n\\n // prettier-ignore\\n uint256 precompileGasCost = gasleft();\\n// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n add(input, 0x20),\\n mul(inputSize, 0x20),\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n /**\\n @notice Fouque-Tibouchi Hash to Curve\\n */\\n function hashToPoint(bytes32 domain, bytes memory message)\\n internal\\n view\\n returns (uint256[2] memory)\\n {\\n uint256[2] memory u = hashToField(domain, message);\\n uint256[2] memory p0 = mapToPoint(u[0]);\\n uint256[2] memory p1 = mapToPoint(u[1]);\\n uint256[4] memory bnAddInput;\\n bnAddInput[0] = p0[0];\\n bnAddInput[1] = p0[1];\\n bnAddInput[2] = p1[0];\\n bnAddInput[3] = p1[1];\\n bool success;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)\\n switch success\\n case 0 {\\n invalid()\\n }\\n }\\n require(success, \\\"BLS: bn add call failed\\\");\\n return p0;\\n }\\n\\n function mapToPoint(uint256 _x)\\n internal\\n pure\\n returns (uint256[2] memory p)\\n {\\n require(_x < N, \\\"mapToPointFT: invalid field element\\\");\\n uint256 x = _x;\\n\\n (, bool decision) = sqrt(x);\\n\\n uint256 a0 = mulmod(x, x, N);\\n a0 = addmod(a0, 4, N);\\n uint256 a1 = mulmod(x, Z0, N);\\n uint256 a2 = mulmod(a1, a0, N);\\n a2 = inverse(a2);\\n a1 = mulmod(a1, a1, N);\\n a1 = mulmod(a1, a2, N);\\n\\n // x1\\n a1 = mulmod(x, a1, N);\\n x = addmod(Z1, N - a1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n bool found;\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x2\\n x = N - addmod(x, 1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x3\\n x = mulmod(a0, a0, N);\\n x = mulmod(x, x, N);\\n x = mulmod(x, a2, N);\\n x = mulmod(x, a2, N);\\n x = addmod(x, 1, N);\\n // must be on curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n require(found, \\\"BLS: bad ft mapping implementation\\\");\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n function isValidSignature(uint256[2] memory signature)\\n internal\\n pure\\n returns (bool)\\n {\\n if ((signature[0] >= N) || (signature[1] >= N)) {\\n return false;\\n } else {\\n return isOnCurveG1(signature);\\n }\\n }\\n\\n function isOnCurveG1(uint256[2] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n let t2 := mulmod(t0, t0, N)\\n t2 := mulmod(t2, t0, N)\\n t2 := addmod(t2, 3, N)\\n t1 := mulmod(t1, t1, N)\\n _isOnCurve := eq(t1, t2)\\n }\\n }\\n\\n function isOnCurveG2(uint256[4] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n // x0, x1\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n // x0 ^ 2\\n let t2 := mulmod(t0, t0, N)\\n // x1 ^ 2\\n let t3 := mulmod(t1, t1, N)\\n // 3 * x0 ^ 2\\n let t4 := add(add(t2, t2), t2)\\n // 3 * x1 ^ 2\\n let t5 := addmod(add(t3, t3), t3, N)\\n // x0 * (x0 ^ 2 - 3 * x1 ^ 2)\\n t2 := mulmod(add(t2, sub(N, t5)), t0, N)\\n // x1 * (3 * x0 ^ 2 - x1 ^ 2)\\n t3 := mulmod(add(t4, sub(N, t3)), t1, N)\\n\\n // x ^ 3 + b\\n t0 := addmod(\\n t2,\\n 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,\\n N\\n )\\n t1 := addmod(\\n t3,\\n 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,\\n N\\n )\\n\\n // y0, y1\\n t2 := mload(add(point, 64))\\n t3 := mload(add(point, 96))\\n // y ^ 2\\n t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)\\n t3 := mulmod(shl(1, t2), t3, N)\\n\\n // y ^ 2 == x ^ 3 + b\\n _isOnCurve := and(eq(t0, t4), eq(t1, t3))\\n }\\n }\\n\\n function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {\\n x = ModexpSqrt.run(xx);\\n hasRoot = mulmod(x, x, N) == xx;\\n }\\n\\n function inverse(uint256 a) internal pure returns (uint256) {\\n return ModexpInverse.run(a);\\n }\\n\\n function hashToField(bytes32 domain, bytes memory messages)\\n internal\\n pure\\n returns (uint256[2] memory)\\n {\\n bytes memory _msg = expandMsgTo96(domain, messages);\\n uint256 u0;\\n uint256 u1;\\n uint256 a0;\\n uint256 a1;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(_msg, 24)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 48)\\n u0 := and(mload(p), MASK24)\\n a0 := addmod(mulmod(u1, T24, N), u0, N)\\n p := add(_msg, 72)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 96)\\n u0 := and(mload(p), MASK24)\\n a1 := addmod(mulmod(u1, T24, N), u0, N)\\n }\\n return [a0, a1];\\n }\\n\\n function expandMsgTo96(bytes32 domain, bytes memory message)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>\\n uint256 t0 = message.length;\\n bytes memory msg0 = new bytes(32 + t0 + 64 + 4);\\n bytes memory out = new bytes(96);\\n // b0\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(msg0, 96)\\n for {\\n let z := 0\\n } lt(z, t0) {\\n z := add(z, 32)\\n } {\\n mstore(add(p, z), mload(add(message, add(z, 32))))\\n }\\n p := add(p, t0)\\n\\n mstore8(p, 0)\\n p := add(p, 1)\\n mstore8(p, 96)\\n p := add(p, 1)\\n mstore8(p, 0)\\n p := add(p, 1)\\n\\n mstore(p, domain)\\n p := add(p, 32)\\n mstore8(p, 32)\\n }\\n bytes32 b0 = sha256(msg0);\\n bytes32 bi;\\n t0 = 32 + 34;\\n\\n // resize intermediate message\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(msg0, t0)\\n }\\n\\n // b1\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(msg0, 32), b0)\\n mstore8(add(msg0, 64), 1)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 32), bi)\\n }\\n\\n // b2\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 2)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 64), bi)\\n }\\n\\n // b3\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 3)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 96), bi)\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x940963096c7e81c19403df6b2a29a2fc115184f81111f8708cb25b0a222d2676\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\ncontract BNPairingPrecompileCostEstimator {\\n uint256 public baseCost;\\n uint256 public perPairCost;\\n\\n // G1 Generator\\n uint256 private constant G1_X = 1;\\n uint256 private constant G1_Y = 2;\\n\\n // G2 genarator\\n // prettier-ignore\\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n // prettier-ignore\\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n\\n // G2 negated genarator y coordinates\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n\\n function run() external {\\n _run();\\n }\\n\\n function getGasCost(uint256 pairCount) external view returns (uint256) {\\n return pairCount * perPairCost + baseCost;\\n }\\n\\n function _run() internal {\\n uint256 gasCost1Pair = _gasCost1Pair();\\n uint256 gasCost2Pair = _gasCost2Pair();\\n perPairCost = gasCost2Pair - gasCost1Pair;\\n baseCost = gasCost1Pair - perPairCost;\\n }\\n\\n function _gasCost1Pair() internal view returns (uint256) {\\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, single pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: single pair call is failed\\\"\\n );\\n require(\\n out[0] == 0,\\n \\\"BNPairingPrecompileCostEstimator: single pair call result must be 0\\\"\\n );\\n return gasCost;\\n }\\n\\n function _gasCost2Pair() internal view returns (uint256) {\\n uint256[12] memory input =\\n [\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n G2_Y1,\\n G2_Y0,\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n N_G2_Y1,\\n N_G2_Y0\\n ];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, couple pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call is failed\\\"\\n );\\n require(\\n out[0] == 1,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call result must be 1\\\"\\n );\\n return gasCost;\\n }\\n}\\n\",\"keccak256\":\"0x26168469ca9fc23dd434d3ab41b547e1b46a97b497fce967b7916351fb87b66d\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\n/**\\n @title Compute Inverse by Modular Exponentiation\\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\\n @dev the function body is generated with the modified addchain script\\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\\n */\\nlibrary ModexpInverse {\\n function run(uint256 t2) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n t0 := mulmod(t2, t2, n)\\n let t5 := mulmod(t0, t2, n)\\n let t1 := mulmod(t5, t0, n)\\n let t3 := mulmod(t5, t5, n)\\n let t8 := mulmod(t1, t0, n)\\n let t4 := mulmod(t3, t5, n)\\n let t6 := mulmod(t3, t1, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t4, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n }\\n }\\n}\\n\\n/**\\n @title Compute Squre Root by Modular Exponentiation\\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\\n */\\nlibrary ModexpSqrt {\\n function run(uint256 t6) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n\\n t0 := mulmod(t6, t6, n)\\n let t4 := mulmod(t0, t6, n)\\n let t2 := mulmod(t4, t0, n)\\n let t3 := mulmod(t4, t4, n)\\n let t8 := mulmod(t2, t0, n)\\n let t1 := mulmod(t3, t4, n)\\n let t5 := mulmod(t3, t2, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t1, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2f58dd24d2278125ba9dea17eb1d5404170f8b93cf097174558c68a5d50e20a7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"addStake(address,uint32)":{"notice":"allow staking for this aggregator there is no limit on stake or delay, but it is not a problem, since it is a permissionless signature aggregator, which doesn't support unstaking."},"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"notice":"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation"},"getTrailingPublicKey(bytes)":{"notice":"return the trailing 4 words of input data"},"userOpToMessage((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"return the BLS \"message\" for the given UserOp. the account checks the signature over this value using its public key"},"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":{"notice":"validate aggregated signature. revert if the aggregated signature does not match the given list of operations."},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"validate signature of a single userOp This method is called after EntryPoint.simulateValidation() returns an aggregator. First it validates the signature over the userOp. then it return data to be used when creating the handleOps:"}},"notice":"A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount","version":1}}},"contracts/samples/bls/IBLSAccount.sol":{"IBLSAccount":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[4]","name":"oldPublicKey","type":"uint256[4]"},{"indexed":false,"internalType":"uint256[4]","name":"newPublicKey","type":"uint256[4]"}],"name":"PublicKeyChanged","type":"event"},{"inputs":[],"name":"getBlsPublicKey","outputs":[{"internalType":"uint256[4]","name":"","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"getBlsPublicKey()":{"returns":{"_0":"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated."}},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"details":"Must validate caller is the entryPoint. Must validate the signature and nonce","params":{"missingAccountFunds":"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \"entryPoint.withdrawTo()\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.","userOp":"the operation that is about to be executed.","userOpHash":"hash of the user's request data. can be used as the basis for signature."},"returns":{"validationData":"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"getBlsPublicKey()":"e02afbae","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"oldPublicKey\",\"type\":\"uint256[4]\"},{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"newPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"PublicKeyChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getBlsPublicKey\",\"outputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"\",\"type\":\"uint256[4]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getBlsPublicKey()\":{\"returns\":{\"_0\":\"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\"}},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"details\":\"Must validate caller is the entryPoint. Must validate the signature and nonce\",\"params\":{\"missingAccountFunds\":\"missing funds on the account's deposit in the entrypoint. This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call. The excess is left as a deposit in the entrypoint, for future calls. can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\" In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\",\"userOp\":\"the operation that is about to be executed.\",\"userOpHash\":\"hash of the user's request data. can be used as the basis for signature.\"},\"returns\":{\"validationData\":\"packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure. Note that the validation code cannot use block.timestamp (or block.number) directly.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \\\"simulation call\\\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\"}},\"notice\":\"a BLS account should expose its own public key.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/IBLSAccount.sol\":\"IBLSAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce the entryPoint will make the call to the recipient only if this validation call returns successfully. signature failure should be reported by returning SIG_VALIDATION_FAILED (1). This allows making a \"simulation call\" without a valid signature Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure."}},"notice":"a BLS account should expose its own public key.","version":1}}},"contracts/samples/bls/lib/BLSOpen.sol":{"BLSOpen":{"abi":[{"inputs":[{"internalType":"bytes32","name":"domain","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"hashToPoint","outputs":[{"internalType":"uint256[2]","name":"","type":"uint256[2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[4]","name":"blsKey","type":"uint256[4]"}],"name":"isZeroBLSKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"uint256[4][]","name":"pubkeys","type":"uint256[4][]"},{"internalType":"uint256[2][]","name":"messages","type":"uint256[2][]"}],"name":"verifyMultiple","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"uint256[4]","name":"pubkey","type":"uint256[4]"},{"internalType":"uint256[2]","name":"message","type":"uint256[2]"}],"name":"verifySingle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6127d961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c8063914137631461005b578063a850a90914610083578063c2ad5b98146100a3578063ebbdac91146100b6575b600080fd5b61006e6100693660046123f6565b6100c9565b60405190151581526020015b60405180910390f35b6100966100913660046124cd565b6100f1565b60405161007a919061258a565b61006e6100b13660046125bb565b61010a565b61006e6100c43660046125d7565b610155565b60008060006100d9868686610227565b915091508080156100e75750815b9695505050505050565b6100f96121cd565b61010383836107bd565b9392505050565b60006001815b81801561011d5750600481105b1561014e578381600481106101345761013461261e565b6020020151159150806101468161267c565b915050610110565b5092915050565b604080516001808252818301909252600091829190816020015b6101776121eb565b81526020019060019003908161016f57505060408051600180825281830190925291925060009190602082015b6101ac6121cd565b8152602001906001900390816101a457905050905084826000815181106101d5576101d561261e565b602002602001018190525083816000815181106101f4576101f461261e565b602002602001018190525060008061020d888585610227565b9150915080801561021b5750815b98975050505050505050565b81516000908190806102c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a657260448201527f6f0000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b83518114610350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d60448201527f65737361676573206d75737420626520657175616c000000000000000000000060648201526084016102b7565b600061035d8260016126b4565b6103689060066126cc565b905060008167ffffffffffffffff81111561038557610385612227565b6040519080825280602002602001820160405280156103ae578160200160208202803683370190505b5090508760006020020151816000815181106103cc576103cc61261e565b60209081029190910101528760016020020151816001815181106103f2576103f261261e565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104325761043261261e565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed816003815181106104725761047261261e565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec816004815181106104b2576104b261261e565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d816005815181106104f2576104f261261e565b60200260200101818152505060005b838110156107725786818151811061051b5761051b61261e565b60200260200101516000600281106105355761053561261e565b6020020151826105468360066126cc565b6105519060066126b4565b815181106105615761056161261e565b60200260200101818152505086818151811061057f5761057f61261e565b60200260200101516001600281106105995761059961261e565b6020020151826105aa8360066126cc565b6105b59060076126b4565b815181106105c5576105c561261e565b6020026020010181815250508781815181106105e3576105e361261e565b60200260200101516001600481106105fd576105fd61261e565b60200201518261060e8360066126cc565b6106199060086126b4565b815181106106295761062961261e565b6020026020010181815250508781815181106106475761064761261e565b60200260200101516000600481106106615761066161261e565b6020020151826106728360066126cc565b61067d9060096126b4565b8151811061068d5761068d61261e565b6020026020010181815250508781815181106106ab576106ab61261e565b60200260200101516003600481106106c5576106c561261e565b6020020151826106d68360066126cc565b6106e190600a6126b4565b815181106106f1576106f161261e565b60200260200101818152505087818151811061070f5761070f61261e565b60200260200101516002600481106107295761072961261e565b60200201518261073a8360066126cc565b61074590600b6126b4565b815181106107555761075561261e565b60209081029190910101528061076a8161267c565b915050610501565b5061077b612209565b60005a90506020826020860260208601600885fa9550856107a7576000809650965050505050506107b5565b505115159450600193505050505b935093915050565b6107c56121cd565b60006107d184846108ad565b905060006107e582825b60200201516109fb565b905060006107f48360016107db565b90506107fe6121eb565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061083957fe5b50806108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016102b7565b50919695505050505050565b6108b56121cd565b60006108c18484611044565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff81511694507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47857f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4778010000000000000000000000000000000000000000000000008709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff908116975016945092507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905084817801000000000000000000000000000000000000000000000000860908604080518082019091529283526020830152509695505050505050565b610a036121cd565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478210610ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d60448201527f656e74000000000000000000000000000000000000000000000000000000000060648201526084016102b7565b816000610abe826112e1565b91505060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4780610af157610af1612709565b83840990507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760048208905060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4777b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd8509905060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478383099050610b8e8161131c565b90507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782860991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47610c4d837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe0894507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4785860991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4785830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476003830891506000610ce7836112e1565b90935090508015610d415784610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b92505b505060408051808201909152938452602084015250909392505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760018708610d90907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b95507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786840992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600384089250610e0e836112e1565b90935090508015610e485784610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784850995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476001870895507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786840992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600384089250610f83836112e1565b909350905080611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201527f6f6e00000000000000000000000000000000000000000000000000000000000060648201526084016102b7565b84610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b805160609060006110568260206126b4565b6110619060406126b4565b61106c9060046126b4565b67ffffffffffffffff81111561108457611084612227565b6040519080825280601f01601f1916602001820160405280156110ae576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b848110156110f657602081880181015183830152016110dc565b508301600081536001016060815360010160008153600181018790526021016020815350600060028360405161112c919061274f565b602060405180830381855afa158015611149573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061116c919061278a565b90506000604294508484528160208501526001604085015360418401889052602060618501536002846040516111a2919061274f565b602060405180830381855afa1580156111bf573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906111e2919061278a565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051611219919061274f565b602060405180830381855afa158015611236573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611259919061278a565b905080604084015280821880602086015250600360408501536041840188905260206061850153600284604051611290919061274f565b602060405180830381855afa1580156112ad573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906112d0919061278a565b606084015250909695505050505050565b6000806112ed8361132d565b9150827f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47838409149050915091565b600061132782611a74565b92915050565b60007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561229d5761229d612227565b604052919050565b600082601f8301126122b657600080fd5b6040516040810181811067ffffffffffffffff821117156122d9576122d9612227565b80604052508060408401858111156122f057600080fd5b845b8181101561230a5780358352602092830192016122f2565b509195945050505050565b600067ffffffffffffffff82111561232f5761232f612227565b5060051b60200190565b600082601f83011261234a57600080fd5b6040516080810181811067ffffffffffffffff8211171561236d5761236d612227565b6040528060808401858111156122f057600080fd5b600082601f83011261239357600080fd5b813560206123a86123a383612315565b612256565b82815260069290921b840181019181810190868411156123c757600080fd5b8286015b848110156123eb576123dd88826122a5565b8352918301916040016123cb565b509695505050505050565b6000806000608080858703121561240c57600080fd5b61241686866122a5565b9350604085013567ffffffffffffffff8082111561243357600080fd5b818701915087601f83011261244757600080fd5b813560206124576123a383612315565b82815260079290921b8401810191818101908b84111561247657600080fd5b948201945b8386101561249c5761248d8c87612339565b8252948601949082019061247b565b975050505060608701359250808311156124b557600080fd5b50506124c386828701612382565b9150509250925092565b600080604083850312156124e057600080fd5b8235915060208084013567ffffffffffffffff8082111561250057600080fd5b818601915086601f83011261251457600080fd5b81358181111561252657612526612227565b612556847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612256565b9150808252878482850101111561256c57600080fd5b80848401858401376000848284010152508093505050509250929050565b60408101818360005b60028110156125b2578151835260209283019290910190600101612593565b50505092915050565b6000608082840312156125cd57600080fd5b6101038383612339565b600080600061010084860312156125ed57600080fd5b6125f785856122a5565b92506126068560408601612339565b91506126158560c086016122a5565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ad576126ad61264d565b5060010190565b600082198211156126c7576126c761264d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127045761270461264d565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008282101561274a5761274a61264d565b500390565b6000825160005b818110156127705760208186018101518583015201612756565b8181111561277f576000828501525b509190910192915050565b60006020828403121561279c57600080fd5b505191905056fea264697066735822122077cbc675970f85c3432e2f00dcb3d6b7e322a167becefbacce5de75d2396678e64736f6c634300080f0033","opcodes":"PUSH2 0x27D9 PUSH2 0x3A PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x2D JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x91413763 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0xA850A909 EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0xC2AD5B98 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0xEBBDAC91 EQ PUSH2 0xB6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6E PUSH2 0x69 CALLDATASIZE PUSH1 0x4 PUSH2 0x23F6 JUMP JUMPDEST PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x96 PUSH2 0x91 CALLDATASIZE PUSH1 0x4 PUSH2 0x24CD JUMP JUMPDEST PUSH2 0xF1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7A SWAP2 SWAP1 PUSH2 0x258A JUMP JUMPDEST PUSH2 0x6E PUSH2 0xB1 CALLDATASIZE PUSH1 0x4 PUSH2 0x25BB JUMP JUMPDEST PUSH2 0x10A JUMP JUMPDEST PUSH2 0x6E PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x25D7 JUMP JUMPDEST PUSH2 0x155 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD9 DUP7 DUP7 DUP7 PUSH2 0x227 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 DUP1 ISZERO PUSH2 0xE7 JUMPI POP DUP2 JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xF9 PUSH2 0x21CD JUMP JUMPDEST PUSH2 0x103 DUP4 DUP4 PUSH2 0x7BD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP2 JUMPDEST DUP2 DUP1 ISZERO PUSH2 0x11D JUMPI POP PUSH1 0x4 DUP2 LT JUMPDEST ISZERO PUSH2 0x14E JUMPI DUP4 DUP2 PUSH1 0x4 DUP2 LT PUSH2 0x134 JUMPI PUSH2 0x134 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD ISZERO SWAP2 POP DUP1 PUSH2 0x146 DUP2 PUSH2 0x267C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x110 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x177 PUSH2 0x21EB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x16F JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD JUMPDEST PUSH2 0x1AC PUSH2 0x21CD JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1A4 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1D5 JUMPI PUSH2 0x1D5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP4 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1F4 JUMPI PUSH2 0x1F4 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP1 PUSH2 0x20D DUP9 DUP6 DUP6 PUSH2 0x227 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 DUP1 ISZERO PUSH2 0x21B JUMPI POP DUP2 JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP1 PUSH2 0x2C0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A206E756D626572206F66207075626C6963206B6579206973207A6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x350 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A206E756D626572206F66207075626C6963206B65797320616E64206D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x65737361676573206D75737420626520657175616C0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35D DUP3 PUSH1 0x1 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x368 SWAP1 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x385 JUMPI PUSH2 0x385 PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x3AE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP8 PUSH1 0x0 PUSH1 0x20 MUL ADD MLOAD DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3CC JUMPI PUSH2 0x3CC PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP8 PUSH1 0x1 PUSH1 0x20 MUL ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x3F2 JUMPI PUSH2 0x3F2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x432 JUMPI PUSH2 0x432 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x472 JUMPI PUSH2 0x472 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x275DC4A288D1AFB3CBB1AC09187524C7DB36395DF7BE3B99E673B13A075A65EC DUP2 PUSH1 0x4 DUP2 MLOAD DUP2 LT PUSH2 0x4B2 JUMPI PUSH2 0x4B2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x1D9BEFCD05A5323E6DA4D435F3B617CDB3AF83285C2DF711EF39C01571827F9D DUP2 PUSH1 0x5 DUP2 MLOAD DUP2 LT PUSH2 0x4F2 JUMPI PUSH2 0x4F2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x772 JUMPI DUP7 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x51B JUMPI PUSH2 0x51B PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 PUSH1 0x2 DUP2 LT PUSH2 0x535 JUMPI PUSH2 0x535 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x546 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x551 SWAP1 PUSH1 0x6 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x561 JUMPI PUSH2 0x561 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP7 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x57F JUMPI PUSH2 0x57F PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x2 DUP2 LT PUSH2 0x599 JUMPI PUSH2 0x599 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x5AA DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x5B5 SWAP1 PUSH1 0x7 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x5C5 JUMPI PUSH2 0x5C5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x5E3 JUMPI PUSH2 0x5E3 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x4 DUP2 LT PUSH2 0x5FD JUMPI PUSH2 0x5FD PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x60E DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x619 SWAP1 PUSH1 0x8 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x629 JUMPI PUSH2 0x629 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x647 JUMPI PUSH2 0x647 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 PUSH1 0x4 DUP2 LT PUSH2 0x661 JUMPI PUSH2 0x661 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x672 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x67D SWAP1 PUSH1 0x9 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x68D JUMPI PUSH2 0x68D PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x6AB JUMPI PUSH2 0x6AB PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x3 PUSH1 0x4 DUP2 LT PUSH2 0x6C5 JUMPI PUSH2 0x6C5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x6D6 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x6E1 SWAP1 PUSH1 0xA PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x6F1 JUMPI PUSH2 0x6F1 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x70F JUMPI PUSH2 0x70F PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x2 PUSH1 0x4 DUP2 LT PUSH2 0x729 JUMPI PUSH2 0x729 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x73A DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x745 SWAP1 PUSH1 0xB PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x755 JUMPI PUSH2 0x755 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x76A DUP2 PUSH2 0x267C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x501 JUMP JUMPDEST POP PUSH2 0x77B PUSH2 0x2209 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP3 PUSH1 0x20 DUP7 MUL PUSH1 0x20 DUP7 ADD PUSH1 0x8 DUP6 STATICCALL SWAP6 POP DUP6 PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0x7B5 JUMP JUMPDEST POP MLOAD ISZERO ISZERO SWAP5 POP PUSH1 0x1 SWAP4 POP POP POP POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7C5 PUSH2 0x21CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D1 DUP5 DUP5 PUSH2 0x8AD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x7E5 DUP3 DUP3 JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9FB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x7F4 DUP4 PUSH1 0x1 PUSH2 0x7DB JUMP JUMPDEST SWAP1 POP PUSH2 0x7FE PUSH2 0x21EB JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD DUP3 DUP3 ADD MSTORE DUP3 MLOAD PUSH1 0x40 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP4 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x80 DUP5 PUSH1 0x6 PUSH2 0x7D0 GAS SUB STATICCALL SWAP1 POP DUP1 DUP1 PUSH2 0x839 JUMPI INVALID JUMPDEST POP DUP1 PUSH2 0x8A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20626E206164642063616C6C206661696C6564000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x2B7 JUMP JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8B5 PUSH2 0x21CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 DUP5 DUP5 PUSH2 0x1044 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x18 DUP6 ADD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND SWAP4 POP PUSH1 0x30 DUP7 ADD SWAP1 POP PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND SWAP5 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH25 0x1000000000000000000000000000000000000000000000000 DUP8 MULMOD ADDMOD PUSH1 0x48 DUP8 ADD MLOAD PUSH1 0x60 DUP9 ADD MLOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP8 POP AND SWAP5 POP SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 SWAP1 POP DUP5 DUP2 PUSH25 0x1000000000000000000000000000000000000000000000000 DUP7 MULMOD ADDMOD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xA03 PUSH2 0x21CD JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 LT PUSH2 0xAB2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D6170546F506F696E7446543A20696E76616C6964206669656C6420656C656D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E740000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST DUP2 PUSH1 0x0 PUSH2 0xABE DUP3 PUSH2 0x12E1 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 PUSH2 0xAF1 JUMPI PUSH2 0xAF1 PUSH2 0x2709 JUMP JUMPDEST DUP4 DUP5 MULMOD SWAP1 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x4 DUP3 ADDMOD SWAP1 POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH24 0xB3C4D79D41A91759A9E4C7E359B6B89EAEC68E62EFFFFFFD DUP6 MULMOD SWAP1 POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP4 DUP4 MULMOD SWAP1 POP PUSH2 0xB8E DUP2 PUSH2 0x131C JUMP JUMPDEST SWAP1 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP2 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP7 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0xC4D DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST PUSH24 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE ADDMOD SWAP5 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 DUP7 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP4 ADDMOD SWAP2 POP PUSH1 0x0 PUSH2 0xCE7 DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 ISZERO PUSH2 0xD41 JUMPI DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD MSTORE POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x1 DUP8 ADDMOD PUSH2 0xD90 SWAP1 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP5 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP5 ADDMOD SWAP3 POP PUSH2 0xE0E DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 ISZERO PUSH2 0xE48 JUMPI DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP5 DUP6 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x1 DUP8 ADDMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP5 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP5 ADDMOD SWAP3 POP PUSH2 0xF83 DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 PUSH2 0x1015 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20626164206674206D617070696E6720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 SWAP1 PUSH1 0x0 PUSH2 0x1056 DUP3 PUSH1 0x20 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x1061 SWAP1 PUSH1 0x40 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x106C SWAP1 PUSH1 0x4 PUSH2 0x26B4 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1084 JUMPI PUSH2 0x1084 PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AE JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 MSTORE PUSH1 0x80 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x60 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP4 DUP4 ADD MSTORE ADD PUSH2 0x10DC JUMP JUMPDEST POP DUP4 ADD PUSH1 0x0 DUP2 MSTORE8 PUSH1 0x1 ADD PUSH1 0x60 DUP2 MSTORE8 PUSH1 0x1 ADD PUSH1 0x0 DUP2 MSTORE8 PUSH1 0x1 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x21 ADD PUSH1 0x20 DUP2 MSTORE8 POP PUSH1 0x0 PUSH1 0x2 DUP4 PUSH1 0x40 MLOAD PUSH2 0x112C SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1149 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x116C SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x42 SWAP5 POP DUP5 DUP5 MSTORE DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x11A2 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x11BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11E2 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP3 XOR DUP1 PUSH1 0x20 DUP7 ADD MSTORE POP PUSH1 0x2 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1219 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1236 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1259 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP3 XOR DUP1 PUSH1 0x20 DUP7 ADD MSTORE POP PUSH1 0x3 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1290 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12D0 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12ED DUP4 PUSH2 0x132D JUMP JUMPDEST SWAP2 POP DUP3 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP4 DUP5 MULMOD EQ SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1327 DUP3 PUSH2 0x1A74 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 DUP4 DUP5 MULMOD SWAP2 POP DUP1 DUP4 DUP4 MULMOD DUP2 DUP4 DUP3 MULMOD DUP3 DUP3 DUP4 MULMOD DUP4 DUP6 DUP4 MULMOD DUP5 DUP5 DUP4 MULMOD DUP6 DUP5 DUP5 MULMOD DUP7 DUP5 DUP6 MULMOD SWAP8 POP DUP7 DUP5 DUP5 MULMOD DUP8 DUP6 DUP5 MULMOD SWAP5 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP4 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP5 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP7 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP2 DUP10 MULMOD SWAP8 POP POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP5 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP POP POP POP POP POP DUP1 DUP3 DUP4 MULMOD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 DUP4 DUP5 MULMOD SWAP2 POP DUP1 DUP4 DUP4 MULMOD DUP2 DUP4 DUP3 MULMOD DUP3 DUP3 DUP4 MULMOD DUP4 DUP6 DUP4 MULMOD DUP5 DUP5 DUP4 MULMOD DUP6 DUP5 DUP5 MULMOD DUP7 DUP5 DUP6 MULMOD SWAP8 POP DUP7 DUP5 DUP5 MULMOD DUP8 DUP6 DUP5 MULMOD SWAP5 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP4 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP5 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP7 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP2 DUP10 MULMOD SWAP8 POP POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP POP POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP2 DUP7 MULMOD SWAP5 POP POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP2 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP6 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP2 DUP6 MULMOD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x229D JUMPI PUSH2 0x229D PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x22B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x22D9 JUMPI PUSH2 0x22D9 PUSH2 0x2227 JUMP JUMPDEST DUP1 PUSH1 0x40 MSTORE POP DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x22F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x230A JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x22F2 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x232F JUMPI PUSH2 0x232F PUSH2 0x2227 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x234A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x236D JUMPI PUSH2 0x236D PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x22F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 PUSH2 0x23A8 PUSH2 0x23A3 DUP4 PUSH2 0x2315 JUMP JUMPDEST PUSH2 0x2256 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x6 SWAP3 SWAP1 SWAP3 SHL DUP5 ADD DUP2 ADD SWAP2 DUP2 DUP2 ADD SWAP1 DUP7 DUP5 GT ISZERO PUSH2 0x23C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP7 ADD JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x23EB JUMPI PUSH2 0x23DD DUP9 DUP3 PUSH2 0x22A5 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 PUSH1 0x40 ADD PUSH2 0x23CB JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP1 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x240C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2416 DUP7 DUP7 PUSH2 0x22A5 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 PUSH2 0x2457 PUSH2 0x23A3 DUP4 PUSH2 0x2315 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x7 SWAP3 SWAP1 SWAP3 SHL DUP5 ADD DUP2 ADD SWAP2 DUP2 DUP2 ADD SWAP1 DUP12 DUP5 GT ISZERO PUSH2 0x2476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x249C JUMPI PUSH2 0x248D DUP13 DUP8 PUSH2 0x2339 JUMP JUMPDEST DUP3 MSTORE SWAP5 DUP7 ADD SWAP5 SWAP1 DUP3 ADD SWAP1 PUSH2 0x247B JUMP JUMPDEST SWAP8 POP POP POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP DUP1 DUP4 GT ISZERO PUSH2 0x24B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0x24C3 DUP7 DUP3 DUP8 ADD PUSH2 0x2382 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x24E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP1 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2526 JUMPI PUSH2 0x2526 PUSH2 0x2227 JUMP JUMPDEST PUSH2 0x2556 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x2256 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x256C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x25B2 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2593 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x25CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x103 DUP4 DUP4 PUSH2 0x2339 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x25ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F7 DUP6 DUP6 PUSH2 0x22A5 JUMP JUMPDEST SWAP3 POP PUSH2 0x2606 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x2339 JUMP JUMPDEST SWAP2 POP PUSH2 0x2615 DUP6 PUSH1 0xC0 DUP7 ADD PUSH2 0x22A5 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x26AD JUMPI PUSH2 0x26AD PUSH2 0x264D JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x26C7 JUMPI PUSH2 0x26C7 PUSH2 0x264D JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x2704 JUMPI PUSH2 0x2704 PUSH2 0x264D JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x274A JUMPI PUSH2 0x274A PUSH2 0x264D JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2770 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x2756 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x277F JUMPI PUSH1 0x0 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x279C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0xCBC675970F85C3432E2F00DCB3D6B7E322A167BECEFBACCE 0x5D 0xE7 0x5D 0x23 SWAP7 PUSH8 0x8E64736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"126:1656:82:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;126:1656:82;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@expandMsgTo96_17556":{"entryPoint":4164,"id":17556,"parameterSlots":2,"returnSlots":1},"@hashToField_17478":{"entryPoint":2221,"id":17478,"parameterSlots":2,"returnSlots":1},"@hashToPoint_16559":{"entryPoint":241,"id":16559,"parameterSlots":2,"returnSlots":1},"@hashToPoint_17047":{"entryPoint":1981,"id":17047,"parameterSlots":2,"returnSlots":1},"@inverse_17442":{"entryPoint":4892,"id":17442,"parameterSlots":1,"returnSlots":1},"@isZeroBLSKey_16598":{"entryPoint":266,"id":16598,"parameterSlots":1,"returnSlots":1},"@mapToPoint_17348":{"entryPoint":2555,"id":17348,"parameterSlots":1,"returnSlots":1},"@run_17801":{"entryPoint":6772,"id":17801,"parameterSlots":1,"returnSlots":1},"@run_17812":{"entryPoint":4909,"id":17812,"parameterSlots":1,"returnSlots":1},"@sqrt_17429":{"entryPoint":4833,"id":17429,"parameterSlots":1,"returnSlots":2},"@verifyMultiple_16541":{"entryPoint":201,"id":16541,"parameterSlots":3,"returnSlots":1},"@verifyMultiple_16949":{"entryPoint":551,"id":16949,"parameterSlots":3,"returnSlots":2},"@verifySingle_16506":{"entryPoint":341,"id":16506,"parameterSlots":3,"returnSlots":1},"abi_decode_array_array_uint256_dyn":{"entryPoint":9090,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_array_uint256":{"entryPoint":9017,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_array_uint256_memory_ptr":{"entryPoint":8869,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptrt_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr":{"entryPoint":9206,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_uint256_$4_memory_ptrt_array$_t_uint256_$2_memory_ptr":{"entryPoint":9687,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr":{"entryPoint":9659,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":10122,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32t_bytes_memory_ptr":{"entryPoint":9421,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":10063,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed":{"entryPoint":9610,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_library_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_160e77d9d43f27ba4855f2f7c2336a727c5fa8b0ae181ac44e8903a5ea7313f0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67b14574dbd62d49c28d2ab08487d247114d1becd207a824f77bce3bb38e9721__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b64840d8fee4a4d8e73f11a1832d903c97054a269232c7fd6575ba945ecd93a2__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c4ff544e35d7a77a229ecca4398c96e4a8d1d092fe0881ee463baa3e09732d7d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ddcbd77f85b2981c914f755affedaeff2c538c54d90d3355ae3f12bc89e3a549__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory":{"entryPoint":8790,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_array_uint256_dyn":{"entryPoint":8981,"id":null,"parameterSlots":1,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":9908,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":9932,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":10040,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":9852,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":9805,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x12":{"entryPoint":9993,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":9758,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":8743,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:10301:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"66:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:111"},"nodeType":"YulFunctionCall","src":"56:88:111"},"nodeType":"YulExpressionStatement","src":"56:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"160:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"163:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"153:6:111"},"nodeType":"YulFunctionCall","src":"153:15:111"},"nodeType":"YulExpressionStatement","src":"153:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"184:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"187:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"177:6:111"},"nodeType":"YulFunctionCall","src":"177:15:111"},"nodeType":"YulExpressionStatement","src":"177:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:184:111"},{"body":{"nodeType":"YulBlock","src":"248:289:111","statements":[{"nodeType":"YulAssignment","src":"258:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"274:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"268:5:111"},"nodeType":"YulFunctionCall","src":"268:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"258:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"286:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"308:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"324:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"330:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"320:3:111"},"nodeType":"YulFunctionCall","src":"320:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"335:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"316:3:111"},"nodeType":"YulFunctionCall","src":"316:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"304:3:111"},"nodeType":"YulFunctionCall","src":"304:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"290:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"478:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"480:16:111"},"nodeType":"YulFunctionCall","src":"480:18:111"},"nodeType":"YulExpressionStatement","src":"480:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"421:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"433:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"418:2:111"},"nodeType":"YulFunctionCall","src":"418:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"457:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"469:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"454:2:111"},"nodeType":"YulFunctionCall","src":"454:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"415:2:111"},"nodeType":"YulFunctionCall","src":"415:62:111"},"nodeType":"YulIf","src":"412:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"516:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"520:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"509:6:111"},"nodeType":"YulFunctionCall","src":"509:22:111"},"nodeType":"YulExpressionStatement","src":"509:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"228:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"237:6:111","type":""}],"src":"203:334:111"},{"body":{"nodeType":"YulBlock","src":"613:586:111","statements":[{"body":{"nodeType":"YulBlock","src":"662:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"671:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"674:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"664:6:111"},"nodeType":"YulFunctionCall","src":"664:12:111"},"nodeType":"YulExpressionStatement","src":"664:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"641:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"649:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"637:3:111"},"nodeType":"YulFunctionCall","src":"637:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"656:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"633:3:111"},"nodeType":"YulFunctionCall","src":"633:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"626:6:111"},"nodeType":"YulFunctionCall","src":"626:35:111"},"nodeType":"YulIf","src":"623:55:111"},{"nodeType":"YulVariableDeclaration","src":"687:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"707:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"701:5:111"},"nodeType":"YulFunctionCall","src":"701:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"691:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"719:33:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"741:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"749:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"737:3:111"},"nodeType":"YulFunctionCall","src":"737:15:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"723:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"827:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"829:16:111"},"nodeType":"YulFunctionCall","src":"829:18:111"},"nodeType":"YulExpressionStatement","src":"829:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"770:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"782:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"767:2:111"},"nodeType":"YulFunctionCall","src":"767:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"806:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"818:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"803:2:111"},"nodeType":"YulFunctionCall","src":"803:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"764:2:111"},"nodeType":"YulFunctionCall","src":"764:62:111"},"nodeType":"YulIf","src":"761:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"865:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"869:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"858:6:111"},"nodeType":"YulFunctionCall","src":"858:22:111"},"nodeType":"YulExpressionStatement","src":"858:22:111"},{"nodeType":"YulVariableDeclaration","src":"889:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"900:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"893:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"915:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"933:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"941:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"929:3:111"},"nodeType":"YulFunctionCall","src":"929:15:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"919:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"972:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"981:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"984:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"974:6:111"},"nodeType":"YulFunctionCall","src":"974:12:111"},"nodeType":"YulExpressionStatement","src":"974:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"959:6:111"},{"name":"end","nodeType":"YulIdentifier","src":"967:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"956:2:111"},"nodeType":"YulFunctionCall","src":"956:15:111"},"nodeType":"YulIf","src":"953:35:111"},{"nodeType":"YulVariableDeclaration","src":"997:17:111","value":{"name":"offset","nodeType":"YulIdentifier","src":"1008:6:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"1001:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1081:88:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1102:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1120:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1107:12:111"},"nodeType":"YulFunctionCall","src":"1107:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1095:6:111"},"nodeType":"YulFunctionCall","src":"1095:30:111"},"nodeType":"YulExpressionStatement","src":"1095:30:111"},{"nodeType":"YulAssignment","src":"1138:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1149:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1154:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1145:3:111"},"nodeType":"YulFunctionCall","src":"1145:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"1138:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1034:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"1039:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1031:2:111"},"nodeType":"YulFunctionCall","src":"1031:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1047:25:111","statements":[{"nodeType":"YulAssignment","src":"1049:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1060:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1065:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1056:3:111"},"nodeType":"YulFunctionCall","src":"1056:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"1049:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1027:3:111","statements":[]},"src":"1023:146:111"},{"nodeType":"YulAssignment","src":"1178:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1187:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"1178:5:111"}]}]},"name":"abi_decode_array_uint256_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"587:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"595:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"603:5:111","type":""}],"src":"542:657:111"},{"body":{"nodeType":"YulBlock","src":"1279:114:111","statements":[{"body":{"nodeType":"YulBlock","src":"1323:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1325:16:111"},"nodeType":"YulFunctionCall","src":"1325:18:111"},"nodeType":"YulExpressionStatement","src":"1325:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1295:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1303:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1292:2:111"},"nodeType":"YulFunctionCall","src":"1292:30:111"},"nodeType":"YulIf","src":"1289:56:111"},{"nodeType":"YulAssignment","src":"1354:33:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1370:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"1373:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1366:3:111"},"nodeType":"YulFunctionCall","src":"1366:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"1382:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1362:3:111"},"nodeType":"YulFunctionCall","src":"1362:25:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"1354:4:111"}]}]},"name":"array_allocation_size_array_array_uint256_dyn","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"1259:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"1270:4:111","type":""}],"src":"1204:189:111"},{"body":{"nodeType":"YulBlock","src":"1458:588:111","statements":[{"body":{"nodeType":"YulBlock","src":"1507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1509:6:111"},"nodeType":"YulFunctionCall","src":"1509:12:111"},"nodeType":"YulExpressionStatement","src":"1509:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1486:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1494:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1482:3:111"},"nodeType":"YulFunctionCall","src":"1482:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"1501:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1478:3:111"},"nodeType":"YulFunctionCall","src":"1478:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1471:6:111"},"nodeType":"YulFunctionCall","src":"1471:35:111"},"nodeType":"YulIf","src":"1468:55:111"},{"nodeType":"YulVariableDeclaration","src":"1532:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1552:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1546:5:111"},"nodeType":"YulFunctionCall","src":"1546:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1536:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1564:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1586:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1594:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1582:3:111"},"nodeType":"YulFunctionCall","src":"1582:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1568:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1673:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1675:16:111"},"nodeType":"YulFunctionCall","src":"1675:18:111"},"nodeType":"YulExpressionStatement","src":"1675:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1616:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1628:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1613:2:111"},"nodeType":"YulFunctionCall","src":"1613:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1652:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1664:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1649:2:111"},"nodeType":"YulFunctionCall","src":"1649:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1610:2:111"},"nodeType":"YulFunctionCall","src":"1610:62:111"},"nodeType":"YulIf","src":"1607:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1711:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1715:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1704:6:111"},"nodeType":"YulFunctionCall","src":"1704:22:111"},"nodeType":"YulExpressionStatement","src":"1704:22:111"},{"nodeType":"YulVariableDeclaration","src":"1735:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1746:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"1739:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1761:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1779:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1787:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1775:3:111"},"nodeType":"YulFunctionCall","src":"1775:16:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"1765:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1819:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1828:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1831:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1821:6:111"},"nodeType":"YulFunctionCall","src":"1821:12:111"},"nodeType":"YulExpressionStatement","src":"1821:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"1806:6:111"},{"name":"end","nodeType":"YulIdentifier","src":"1814:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1803:2:111"},"nodeType":"YulFunctionCall","src":"1803:15:111"},"nodeType":"YulIf","src":"1800:35:111"},{"nodeType":"YulVariableDeclaration","src":"1844:17:111","value":{"name":"offset","nodeType":"YulIdentifier","src":"1855:6:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"1848:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1928:88:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1949:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1967:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1954:12:111"},"nodeType":"YulFunctionCall","src":"1954:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1942:6:111"},"nodeType":"YulFunctionCall","src":"1942:30:111"},"nodeType":"YulExpressionStatement","src":"1942:30:111"},{"nodeType":"YulAssignment","src":"1985:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1996:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2001:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1992:3:111"},"nodeType":"YulFunctionCall","src":"1992:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"1985:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1881:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"1886:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1878:2:111"},"nodeType":"YulFunctionCall","src":"1878:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1894:25:111","statements":[{"nodeType":"YulAssignment","src":"1896:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1907:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1912:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1903:3:111"},"nodeType":"YulFunctionCall","src":"1903:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"1896:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1874:3:111","statements":[]},"src":"1870:146:111"},{"nodeType":"YulAssignment","src":"2025:15:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"2034:6:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"2025:5:111"}]}]},"name":"abi_decode_array_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1432:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"1440:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"1448:5:111","type":""}],"src":"1398:648:111"},{"body":{"nodeType":"YulBlock","src":"2121:634:111","statements":[{"body":{"nodeType":"YulBlock","src":"2170:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2179:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2182:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2172:6:111"},"nodeType":"YulFunctionCall","src":"2172:12:111"},"nodeType":"YulExpressionStatement","src":"2172:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2149:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2157:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2145:3:111"},"nodeType":"YulFunctionCall","src":"2145:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"2164:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2141:3:111"},"nodeType":"YulFunctionCall","src":"2141:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2134:6:111"},"nodeType":"YulFunctionCall","src":"2134:35:111"},"nodeType":"YulIf","src":"2131:55:111"},{"nodeType":"YulVariableDeclaration","src":"2195:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2218:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2205:12:111"},"nodeType":"YulFunctionCall","src":"2205:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2199:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2234:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2244:4:111","type":"","value":"0x20"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2238:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2257:77:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2330:2:111"}],"functionName":{"name":"array_allocation_size_array_array_uint256_dyn","nodeType":"YulIdentifier","src":"2284:45:111"},"nodeType":"YulFunctionCall","src":"2284:49:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"2268:15:111"},"nodeType":"YulFunctionCall","src":"2268:66:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"2261:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2343:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"2356:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"2347:5:111","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2375:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2380:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2368:6:111"},"nodeType":"YulFunctionCall","src":"2368:15:111"},"nodeType":"YulExpressionStatement","src":"2368:15:111"},{"nodeType":"YulAssignment","src":"2392:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2403:3:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2408:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2399:3:111"},"nodeType":"YulFunctionCall","src":"2399:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"2392:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"2420:46:111","value":{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2442:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2454:1:111","type":"","value":"6"},{"name":"_1","nodeType":"YulIdentifier","src":"2457:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2450:3:111"},"nodeType":"YulFunctionCall","src":"2450:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2438:3:111"},"nodeType":"YulFunctionCall","src":"2438:23:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2463:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2434:3:111"},"nodeType":"YulFunctionCall","src":"2434:32:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"2424:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2494:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2503:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2506:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2496:6:111"},"nodeType":"YulFunctionCall","src":"2496:12:111"},"nodeType":"YulExpressionStatement","src":"2496:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"2481:6:111"},{"name":"end","nodeType":"YulIdentifier","src":"2489:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2478:2:111"},"nodeType":"YulFunctionCall","src":"2478:15:111"},"nodeType":"YulIf","src":"2475:35:111"},{"nodeType":"YulVariableDeclaration","src":"2519:26:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2534:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2542:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2530:3:111"},"nodeType":"YulFunctionCall","src":"2530:15:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"2523:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2612:114:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2633:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2674:3:111"},{"name":"end","nodeType":"YulIdentifier","src":"2679:3:111"}],"functionName":{"name":"abi_decode_array_uint256_memory_ptr","nodeType":"YulIdentifier","src":"2638:35:111"},"nodeType":"YulFunctionCall","src":"2638:45:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2626:6:111"},"nodeType":"YulFunctionCall","src":"2626:58:111"},"nodeType":"YulExpressionStatement","src":"2626:58:111"},{"nodeType":"YulAssignment","src":"2697:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2708:3:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2713:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2704:3:111"},"nodeType":"YulFunctionCall","src":"2704:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"2697:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2565:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"2570:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2562:2:111"},"nodeType":"YulFunctionCall","src":"2562:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2578:25:111","statements":[{"nodeType":"YulAssignment","src":"2580:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2591:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2596:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2587:3:111"},"nodeType":"YulFunctionCall","src":"2587:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"2580:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2558:3:111","statements":[]},"src":"2554:172:111"},{"nodeType":"YulAssignment","src":"2735:14:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"2744:5:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"2735:5:111"}]}]},"name":"abi_decode_array_array_uint256_dyn","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2095:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"2103:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"2111:5:111","type":""}],"src":"2051:704:111"},{"body":{"nodeType":"YulBlock","src":"2983:1141:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2993:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3003:3:111","type":"","value":"128"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2997:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3051:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3060:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3063:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3053:6:111"},"nodeType":"YulFunctionCall","src":"3053:12:111"},"nodeType":"YulExpressionStatement","src":"3053:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3026:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3035:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3022:3:111"},"nodeType":"YulFunctionCall","src":"3022:23:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3047:2:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3018:3:111"},"nodeType":"YulFunctionCall","src":"3018:32:111"},"nodeType":"YulIf","src":"3015:52:111"},{"nodeType":"YulAssignment","src":"3076:65:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3122:9:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3133:7:111"}],"functionName":{"name":"abi_decode_array_uint256_memory_ptr","nodeType":"YulIdentifier","src":"3086:35:111"},"nodeType":"YulFunctionCall","src":"3086:55:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3076:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3150:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3181:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3192:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3177:3:111"},"nodeType":"YulFunctionCall","src":"3177:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3164:12:111"},"nodeType":"YulFunctionCall","src":"3164:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3154:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3205:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3215:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3209:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3260:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3269:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3272:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3262:6:111"},"nodeType":"YulFunctionCall","src":"3262:12:111"},"nodeType":"YulExpressionStatement","src":"3262:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3248:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3256:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3245:2:111"},"nodeType":"YulFunctionCall","src":"3245:14:111"},"nodeType":"YulIf","src":"3242:34:111"},{"nodeType":"YulVariableDeclaration","src":"3285:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3299:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3310:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3295:3:111"},"nodeType":"YulFunctionCall","src":"3295:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"3289:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3365:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3374:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3377:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3367:6:111"},"nodeType":"YulFunctionCall","src":"3367:12:111"},"nodeType":"YulExpressionStatement","src":"3367:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3344:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3348:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3340:3:111"},"nodeType":"YulFunctionCall","src":"3340:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3355:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3336:3:111"},"nodeType":"YulFunctionCall","src":"3336:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3329:6:111"},"nodeType":"YulFunctionCall","src":"3329:35:111"},"nodeType":"YulIf","src":"3326:55:111"},{"nodeType":"YulVariableDeclaration","src":"3390:26:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3413:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3400:12:111"},"nodeType":"YulFunctionCall","src":"3400:16:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"3394:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3425:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3435:4:111","type":"","value":"0x20"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"3429:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3448:77:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"3521:2:111"}],"functionName":{"name":"array_allocation_size_array_array_uint256_dyn","nodeType":"YulIdentifier","src":"3475:45:111"},"nodeType":"YulFunctionCall","src":"3475:49:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"3459:15:111"},"nodeType":"YulFunctionCall","src":"3459:66:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"3452:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3534:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"3547:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"3538:5:111","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3566:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"3571:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3559:6:111"},"nodeType":"YulFunctionCall","src":"3559:15:111"},"nodeType":"YulExpressionStatement","src":"3559:15:111"},{"nodeType":"YulAssignment","src":"3583:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3594:3:111"},{"name":"_5","nodeType":"YulIdentifier","src":"3599:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3590:3:111"},"nodeType":"YulFunctionCall","src":"3590:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"3583:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"3611:42:111","value":{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3633:2:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3641:1:111","type":"","value":"7"},{"name":"_4","nodeType":"YulIdentifier","src":"3644:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3637:3:111"},"nodeType":"YulFunctionCall","src":"3637:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3629:3:111"},"nodeType":"YulFunctionCall","src":"3629:19:111"},{"name":"_5","nodeType":"YulIdentifier","src":"3650:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3625:3:111"},"nodeType":"YulFunctionCall","src":"3625:28:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"3615:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3685:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3694:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3697:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3687:6:111"},"nodeType":"YulFunctionCall","src":"3687:12:111"},"nodeType":"YulExpressionStatement","src":"3687:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"3668:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3676:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3665:2:111"},"nodeType":"YulFunctionCall","src":"3665:19:111"},"nodeType":"YulIf","src":"3662:39:111"},{"nodeType":"YulVariableDeclaration","src":"3710:22:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3725:2:111"},{"name":"_5","nodeType":"YulIdentifier","src":"3729:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3721:3:111"},"nodeType":"YulFunctionCall","src":"3721:11:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"3714:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3797:107:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3818:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3848:3:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3853:7:111"}],"functionName":{"name":"abi_decode_array_uint256","nodeType":"YulIdentifier","src":"3823:24:111"},"nodeType":"YulFunctionCall","src":"3823:38:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3811:6:111"},"nodeType":"YulFunctionCall","src":"3811:51:111"},"nodeType":"YulExpressionStatement","src":"3811:51:111"},{"nodeType":"YulAssignment","src":"3875:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3886:3:111"},{"name":"_5","nodeType":"YulIdentifier","src":"3891:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3882:3:111"},"nodeType":"YulFunctionCall","src":"3882:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"3875:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3752:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"3757:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3749:2:111"},"nodeType":"YulFunctionCall","src":"3749:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3765:23:111","statements":[{"nodeType":"YulAssignment","src":"3767:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3778:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3783:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3774:3:111"},"nodeType":"YulFunctionCall","src":"3774:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"3767:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3745:3:111","statements":[]},"src":"3741:163:111"},{"nodeType":"YulAssignment","src":"3913:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"3923:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3913:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3937:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3970:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3981:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3966:3:111"},"nodeType":"YulFunctionCall","src":"3966:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3953:12:111"},"nodeType":"YulFunctionCall","src":"3953:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"3941:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4014:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4023:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4026:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4016:6:111"},"nodeType":"YulFunctionCall","src":"4016:12:111"},"nodeType":"YulExpressionStatement","src":"4016:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4000:8:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4010:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3997:2:111"},"nodeType":"YulFunctionCall","src":"3997:16:111"},"nodeType":"YulIf","src":"3994:36:111"},{"nodeType":"YulAssignment","src":"4039:79:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4088:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4099:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4084:3:111"},"nodeType":"YulFunctionCall","src":"4084:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4110:7:111"}],"functionName":{"name":"abi_decode_array_array_uint256_dyn","nodeType":"YulIdentifier","src":"4049:34:111"},"nodeType":"YulFunctionCall","src":"4049:69:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4039:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptrt_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2933:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2944:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2956:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2964:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2972:6:111","type":""}],"src":"2760:1364:111"},{"body":{"nodeType":"YulBlock","src":"4232:92:111","statements":[{"nodeType":"YulAssignment","src":"4242:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4254:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4265:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4250:3:111"},"nodeType":"YulFunctionCall","src":"4250:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4242:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4284:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4309:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4302:6:111"},"nodeType":"YulFunctionCall","src":"4302:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4295:6:111"},"nodeType":"YulFunctionCall","src":"4295:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4277:6:111"},"nodeType":"YulFunctionCall","src":"4277:41:111"},"nodeType":"YulExpressionStatement","src":"4277:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_library_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4201:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4212:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4223:4:111","type":""}],"src":"4129:195:111"},{"body":{"nodeType":"YulBlock","src":"4425:794:111","statements":[{"body":{"nodeType":"YulBlock","src":"4471:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4480:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4483:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4473:6:111"},"nodeType":"YulFunctionCall","src":"4473:12:111"},"nodeType":"YulExpressionStatement","src":"4473:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4446:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4455:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4442:3:111"},"nodeType":"YulFunctionCall","src":"4442:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4467:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4438:3:111"},"nodeType":"YulFunctionCall","src":"4438:32:111"},"nodeType":"YulIf","src":"4435:52:111"},{"nodeType":"YulAssignment","src":"4496:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4519:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4506:12:111"},"nodeType":"YulFunctionCall","src":"4506:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4496:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4538:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4548:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4542:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4559:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4590:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4601:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4586:3:111"},"nodeType":"YulFunctionCall","src":"4586:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4573:12:111"},"nodeType":"YulFunctionCall","src":"4573:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4563:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4614:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4624:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"4618:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4669:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4678:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4681:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4671:6:111"},"nodeType":"YulFunctionCall","src":"4671:12:111"},"nodeType":"YulExpressionStatement","src":"4671:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4657:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4665:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4654:2:111"},"nodeType":"YulFunctionCall","src":"4654:14:111"},"nodeType":"YulIf","src":"4651:34:111"},{"nodeType":"YulVariableDeclaration","src":"4694:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4708:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4719:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4704:3:111"},"nodeType":"YulFunctionCall","src":"4704:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"4698:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4774:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4783:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4786:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4776:6:111"},"nodeType":"YulFunctionCall","src":"4776:12:111"},"nodeType":"YulExpressionStatement","src":"4776:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"4753:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4757:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4749:3:111"},"nodeType":"YulFunctionCall","src":"4749:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4764:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4745:3:111"},"nodeType":"YulFunctionCall","src":"4745:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4738:6:111"},"nodeType":"YulFunctionCall","src":"4738:35:111"},"nodeType":"YulIf","src":"4735:55:111"},{"nodeType":"YulVariableDeclaration","src":"4799:26:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"4822:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4809:12:111"},"nodeType":"YulFunctionCall","src":"4809:16:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"4803:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4848:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"4850:16:111"},"nodeType":"YulFunctionCall","src":"4850:18:111"},"nodeType":"YulExpressionStatement","src":"4850:18:111"}]},"condition":{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"4840:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4844:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4837:2:111"},"nodeType":"YulFunctionCall","src":"4837:10:111"},"nodeType":"YulIf","src":"4834:36:111"},{"nodeType":"YulVariableDeclaration","src":"4879:125:111","value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"4920:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4924:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4916:3:111"},"nodeType":"YulFunctionCall","src":"4916:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"4931:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4912:3:111"},"nodeType":"YulFunctionCall","src":"4912:86:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5000:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4908:3:111"},"nodeType":"YulFunctionCall","src":"4908:95:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"4892:15:111"},"nodeType":"YulFunctionCall","src":"4892:112:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"4883:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"5020:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"5027:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5013:6:111"},"nodeType":"YulFunctionCall","src":"5013:17:111"},"nodeType":"YulExpressionStatement","src":"5013:17:111"},{"body":{"nodeType":"YulBlock","src":"5076:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5085:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5088:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5078:6:111"},"nodeType":"YulFunctionCall","src":"5078:12:111"},"nodeType":"YulExpressionStatement","src":"5078:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"5053:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"5057:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5049:3:111"},"nodeType":"YulFunctionCall","src":"5049:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5062:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5045:3:111"},"nodeType":"YulFunctionCall","src":"5045:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5067:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5042:2:111"},"nodeType":"YulFunctionCall","src":"5042:33:111"},"nodeType":"YulIf","src":"5039:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"5118:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5125:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5114:3:111"},"nodeType":"YulFunctionCall","src":"5114:14:111"},{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"5134:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5138:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5130:3:111"},"nodeType":"YulFunctionCall","src":"5130:11:111"},{"name":"_4","nodeType":"YulIdentifier","src":"5143:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"5101:12:111"},"nodeType":"YulFunctionCall","src":"5101:45:111"},"nodeType":"YulExpressionStatement","src":"5101:45:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"5170:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"5177:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5166:3:111"},"nodeType":"YulFunctionCall","src":"5166:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5182:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5162:3:111"},"nodeType":"YulFunctionCall","src":"5162:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5187:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5155:6:111"},"nodeType":"YulFunctionCall","src":"5155:34:111"},"nodeType":"YulExpressionStatement","src":"5155:34:111"},{"nodeType":"YulAssignment","src":"5198:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"5208:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5198:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32t_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4383:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4394:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4406:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4414:6:111","type":""}],"src":"4329:890:111"},{"body":{"nodeType":"YulBlock","src":"5379:347:111","statements":[{"nodeType":"YulAssignment","src":"5389:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5412:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5397:3:111"},"nodeType":"YulFunctionCall","src":"5397:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5389:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"5424:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"5435:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"5428:3:111","type":""}]},{"nodeType":"YulAssignment","src":"5453:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"5460:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5453:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"5478:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"5492:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"5482:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5507:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5516:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5511:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5573:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5594:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5605:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5599:5:111"},"nodeType":"YulFunctionCall","src":"5599:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5587:6:111"},"nodeType":"YulFunctionCall","src":"5587:26:111"},"nodeType":"YulExpressionStatement","src":"5587:26:111"},{"nodeType":"YulVariableDeclaration","src":"5626:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5636:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5630:2:111","type":""}]},{"nodeType":"YulAssignment","src":"5653:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5664:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5669:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5660:3:111"},"nodeType":"YulFunctionCall","src":"5660:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5653:3:111"}]},{"nodeType":"YulAssignment","src":"5685:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5699:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5707:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5695:3:111"},"nodeType":"YulFunctionCall","src":"5695:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5685:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5537:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5540:4:111","type":"","value":"0x02"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5534:2:111"},"nodeType":"YulFunctionCall","src":"5534:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5546:18:111","statements":[{"nodeType":"YulAssignment","src":"5548:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5557:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5560:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5553:3:111"},"nodeType":"YulFunctionCall","src":"5553:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5548:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5530:3:111","statements":[]},"src":"5526:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5348:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5359:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5370:4:111","type":""}],"src":"5224:502:111"},{"body":{"nodeType":"YulBlock","src":"5824:132:111","statements":[{"body":{"nodeType":"YulBlock","src":"5871:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5880:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5883:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5873:6:111"},"nodeType":"YulFunctionCall","src":"5873:12:111"},"nodeType":"YulExpressionStatement","src":"5873:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5845:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5854:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5841:3:111"},"nodeType":"YulFunctionCall","src":"5841:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5866:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5837:3:111"},"nodeType":"YulFunctionCall","src":"5837:33:111"},"nodeType":"YulIf","src":"5834:53:111"},{"nodeType":"YulAssignment","src":"5896:54:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5931:9:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5942:7:111"}],"functionName":{"name":"abi_decode_array_uint256","nodeType":"YulIdentifier","src":"5906:24:111"},"nodeType":"YulFunctionCall","src":"5906:44:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5896:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5790:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5801:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5813:6:111","type":""}],"src":"5731:225:111"},{"body":{"nodeType":"YulBlock","src":"6134:299:111","statements":[{"body":{"nodeType":"YulBlock","src":"6181:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6190:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6193:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6183:6:111"},"nodeType":"YulFunctionCall","src":"6183:12:111"},"nodeType":"YulExpressionStatement","src":"6183:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6155:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6164:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6151:3:111"},"nodeType":"YulFunctionCall","src":"6151:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6176:3:111","type":"","value":"256"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6147:3:111"},"nodeType":"YulFunctionCall","src":"6147:33:111"},"nodeType":"YulIf","src":"6144:53:111"},{"nodeType":"YulAssignment","src":"6206:65:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6252:9:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6263:7:111"}],"functionName":{"name":"abi_decode_array_uint256_memory_ptr","nodeType":"YulIdentifier","src":"6216:35:111"},"nodeType":"YulFunctionCall","src":"6216:55:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6206:6:111"}]},{"nodeType":"YulAssignment","src":"6280:63:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6319:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6330:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6315:3:111"},"nodeType":"YulFunctionCall","src":"6315:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6335:7:111"}],"functionName":{"name":"abi_decode_array_uint256","nodeType":"YulIdentifier","src":"6290:24:111"},"nodeType":"YulFunctionCall","src":"6290:53:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6280:6:111"}]},{"nodeType":"YulAssignment","src":"6352:75:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6402:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6413:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6398:3:111"},"nodeType":"YulFunctionCall","src":"6398:19:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6419:7:111"}],"functionName":{"name":"abi_decode_array_uint256_memory_ptr","nodeType":"YulIdentifier","src":"6362:35:111"},"nodeType":"YulFunctionCall","src":"6362:65:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6352:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_uint256_$4_memory_ptrt_array$_t_uint256_$2_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6084:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6095:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6107:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6115:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6123:6:111","type":""}],"src":"5961:472:111"},{"body":{"nodeType":"YulBlock","src":"6470:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6487:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6490:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6480:6:111"},"nodeType":"YulFunctionCall","src":"6480:88:111"},"nodeType":"YulExpressionStatement","src":"6480:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6584:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6587:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6577:6:111"},"nodeType":"YulFunctionCall","src":"6577:15:111"},"nodeType":"YulExpressionStatement","src":"6577:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6608:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6611:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6601:6:111"},"nodeType":"YulFunctionCall","src":"6601:15:111"},"nodeType":"YulExpressionStatement","src":"6601:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"6438:184:111"},{"body":{"nodeType":"YulBlock","src":"6659:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6676:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6679:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6669:6:111"},"nodeType":"YulFunctionCall","src":"6669:88:111"},"nodeType":"YulExpressionStatement","src":"6669:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6773:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6776:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6766:6:111"},"nodeType":"YulFunctionCall","src":"6766:15:111"},"nodeType":"YulExpressionStatement","src":"6766:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6797:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6800:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6790:6:111"},"nodeType":"YulFunctionCall","src":"6790:15:111"},"nodeType":"YulExpressionStatement","src":"6790:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"6627:184:111"},{"body":{"nodeType":"YulBlock","src":"6863:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"6954:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"6956:16:111"},"nodeType":"YulFunctionCall","src":"6956:18:111"},"nodeType":"YulExpressionStatement","src":"6956:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6879:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"6886:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"6876:2:111"},"nodeType":"YulFunctionCall","src":"6876:77:111"},"nodeType":"YulIf","src":"6873:103:111"},{"nodeType":"YulAssignment","src":"6985:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6996:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7003:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6992:3:111"},"nodeType":"YulFunctionCall","src":"6992:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"6985:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"6845:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"6855:3:111","type":""}],"src":"6816:195:111"},{"body":{"nodeType":"YulBlock","src":"7190:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7218:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7200:6:111"},"nodeType":"YulFunctionCall","src":"7200:21:111"},"nodeType":"YulExpressionStatement","src":"7200:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7252:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7237:3:111"},"nodeType":"YulFunctionCall","src":"7237:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7257:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7230:6:111"},"nodeType":"YulFunctionCall","src":"7230:30:111"},"nodeType":"YulExpressionStatement","src":"7230:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7291:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7276:3:111"},"nodeType":"YulFunctionCall","src":"7276:18:111"},{"hexValue":"424c533a206e756d626572206f66207075626c6963206b6579206973207a6572","kind":"string","nodeType":"YulLiteral","src":"7296:34:111","type":"","value":"BLS: number of public key is zer"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7269:6:111"},"nodeType":"YulFunctionCall","src":"7269:62:111"},"nodeType":"YulExpressionStatement","src":"7269:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7362:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7347:3:111"},"nodeType":"YulFunctionCall","src":"7347:18:111"},{"hexValue":"6f","kind":"string","nodeType":"YulLiteral","src":"7367:3:111","type":"","value":"o"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7340:6:111"},"nodeType":"YulFunctionCall","src":"7340:31:111"},"nodeType":"YulExpressionStatement","src":"7340:31:111"},{"nodeType":"YulAssignment","src":"7380:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7392:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7403:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7388:3:111"},"nodeType":"YulFunctionCall","src":"7388:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7380:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b64840d8fee4a4d8e73f11a1832d903c97054a269232c7fd6575ba945ecd93a2__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7167:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7181:4:111","type":""}],"src":"7016:397:111"},{"body":{"nodeType":"YulBlock","src":"7592:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7609:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7620:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7602:6:111"},"nodeType":"YulFunctionCall","src":"7602:21:111"},"nodeType":"YulExpressionStatement","src":"7602:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7643:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7654:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7639:3:111"},"nodeType":"YulFunctionCall","src":"7639:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7659:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7632:6:111"},"nodeType":"YulFunctionCall","src":"7632:30:111"},"nodeType":"YulExpressionStatement","src":"7632:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7682:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7693:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7678:3:111"},"nodeType":"YulFunctionCall","src":"7678:18:111"},{"hexValue":"424c533a206e756d626572206f66207075626c6963206b65797320616e64206d","kind":"string","nodeType":"YulLiteral","src":"7698:34:111","type":"","value":"BLS: number of public keys and m"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7671:6:111"},"nodeType":"YulFunctionCall","src":"7671:62:111"},"nodeType":"YulExpressionStatement","src":"7671:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7753:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7764:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7749:3:111"},"nodeType":"YulFunctionCall","src":"7749:18:111"},{"hexValue":"65737361676573206d75737420626520657175616c","kind":"string","nodeType":"YulLiteral","src":"7769:23:111","type":"","value":"essages must be equal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7742:6:111"},"nodeType":"YulFunctionCall","src":"7742:51:111"},"nodeType":"YulExpressionStatement","src":"7742:51:111"},{"nodeType":"YulAssignment","src":"7802:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7814:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7825:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7810:3:111"},"nodeType":"YulFunctionCall","src":"7810:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7802:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67b14574dbd62d49c28d2ab08487d247114d1becd207a824f77bce3bb38e9721__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7569:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7583:4:111","type":""}],"src":"7418:417:111"},{"body":{"nodeType":"YulBlock","src":"7888:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"7915:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7917:16:111"},"nodeType":"YulFunctionCall","src":"7917:18:111"},"nodeType":"YulExpressionStatement","src":"7917:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7904:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"7911:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"7907:3:111"},"nodeType":"YulFunctionCall","src":"7907:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7901:2:111"},"nodeType":"YulFunctionCall","src":"7901:13:111"},"nodeType":"YulIf","src":"7898:39:111"},{"nodeType":"YulAssignment","src":"7946:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7957:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7960:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7953:3:111"},"nodeType":"YulFunctionCall","src":"7953:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"7946:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"7871:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"7874:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"7880:3:111","type":""}],"src":"7840:128:111"},{"body":{"nodeType":"YulBlock","src":"8025:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"8144:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"8146:16:111"},"nodeType":"YulFunctionCall","src":"8146:18:111"},"nodeType":"YulExpressionStatement","src":"8146:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8056:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8049:6:111"},"nodeType":"YulFunctionCall","src":"8049:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8042:6:111"},"nodeType":"YulFunctionCall","src":"8042:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"8064:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8071:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"8139:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"8067:3:111"},"nodeType":"YulFunctionCall","src":"8067:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8061:2:111"},"nodeType":"YulFunctionCall","src":"8061:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8038:3:111"},"nodeType":"YulFunctionCall","src":"8038:105:111"},"nodeType":"YulIf","src":"8035:131:111"},{"nodeType":"YulAssignment","src":"8175:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"8190:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"8193:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"8186:3:111"},"nodeType":"YulFunctionCall","src":"8186:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"8175:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"8004:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"8007:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"8013:7:111","type":""}],"src":"7973:228:111"},{"body":{"nodeType":"YulBlock","src":"8380:173:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8408:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8390:6:111"},"nodeType":"YulFunctionCall","src":"8390:21:111"},"nodeType":"YulExpressionStatement","src":"8390:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8431:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8442:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8427:3:111"},"nodeType":"YulFunctionCall","src":"8427:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8447:2:111","type":"","value":"23"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8420:6:111"},"nodeType":"YulFunctionCall","src":"8420:30:111"},"nodeType":"YulExpressionStatement","src":"8420:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8481:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8466:3:111"},"nodeType":"YulFunctionCall","src":"8466:18:111"},{"hexValue":"424c533a20626e206164642063616c6c206661696c6564","kind":"string","nodeType":"YulLiteral","src":"8486:25:111","type":"","value":"BLS: bn add call failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8459:6:111"},"nodeType":"YulFunctionCall","src":"8459:53:111"},"nodeType":"YulExpressionStatement","src":"8459:53:111"},{"nodeType":"YulAssignment","src":"8521:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8533:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8544:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8529:3:111"},"nodeType":"YulFunctionCall","src":"8529:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8521:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_160e77d9d43f27ba4855f2f7c2336a727c5fa8b0ae181ac44e8903a5ea7313f0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8357:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8371:4:111","type":""}],"src":"8206:347:111"},{"body":{"nodeType":"YulBlock","src":"8732:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8749:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8760:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8742:6:111"},"nodeType":"YulFunctionCall","src":"8742:21:111"},"nodeType":"YulExpressionStatement","src":"8742:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8783:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8794:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8779:3:111"},"nodeType":"YulFunctionCall","src":"8779:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8799:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8772:6:111"},"nodeType":"YulFunctionCall","src":"8772:30:111"},"nodeType":"YulExpressionStatement","src":"8772:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8822:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8833:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8818:3:111"},"nodeType":"YulFunctionCall","src":"8818:18:111"},{"hexValue":"6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d","kind":"string","nodeType":"YulLiteral","src":"8838:34:111","type":"","value":"mapToPointFT: invalid field elem"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8811:6:111"},"nodeType":"YulFunctionCall","src":"8811:62:111"},"nodeType":"YulExpressionStatement","src":"8811:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8893:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8904:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8889:3:111"},"nodeType":"YulFunctionCall","src":"8889:18:111"},{"hexValue":"656e74","kind":"string","nodeType":"YulLiteral","src":"8909:5:111","type":"","value":"ent"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8882:6:111"},"nodeType":"YulFunctionCall","src":"8882:33:111"},"nodeType":"YulExpressionStatement","src":"8882:33:111"},{"nodeType":"YulAssignment","src":"8924:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8947:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8932:3:111"},"nodeType":"YulFunctionCall","src":"8932:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8924:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c4ff544e35d7a77a229ecca4398c96e4a8d1d092fe0881ee463baa3e09732d7d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8709:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8723:4:111","type":""}],"src":"8558:399:111"},{"body":{"nodeType":"YulBlock","src":"8994:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9011:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9014:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9004:6:111"},"nodeType":"YulFunctionCall","src":"9004:88:111"},"nodeType":"YulExpressionStatement","src":"9004:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9108:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9111:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9101:6:111"},"nodeType":"YulFunctionCall","src":"9101:15:111"},"nodeType":"YulExpressionStatement","src":"9101:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9132:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9135:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9125:6:111"},"nodeType":"YulFunctionCall","src":"9125:15:111"},"nodeType":"YulExpressionStatement","src":"9125:15:111"}]},"name":"panic_error_0x12","nodeType":"YulFunctionDefinition","src":"8962:184:111"},{"body":{"nodeType":"YulBlock","src":"9200:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"9222:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9224:16:111"},"nodeType":"YulFunctionCall","src":"9224:18:111"},"nodeType":"YulExpressionStatement","src":"9224:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9216:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9219:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"9213:2:111"},"nodeType":"YulFunctionCall","src":"9213:8:111"},"nodeType":"YulIf","src":"9210:34:111"},{"nodeType":"YulAssignment","src":"9253:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9265:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9268:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9261:3:111"},"nodeType":"YulFunctionCall","src":"9261:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"9253:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9182:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9185:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"9191:4:111","type":""}],"src":"9151:125:111"},{"body":{"nodeType":"YulBlock","src":"9455:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9483:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9465:6:111"},"nodeType":"YulFunctionCall","src":"9465:21:111"},"nodeType":"YulExpressionStatement","src":"9465:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9506:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9517:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9502:3:111"},"nodeType":"YulFunctionCall","src":"9502:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9522:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9495:6:111"},"nodeType":"YulFunctionCall","src":"9495:30:111"},"nodeType":"YulExpressionStatement","src":"9495:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9545:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9556:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9541:3:111"},"nodeType":"YulFunctionCall","src":"9541:18:111"},{"hexValue":"424c533a20626164206674206d617070696e6720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"9561:34:111","type":"","value":"BLS: bad ft mapping implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9534:6:111"},"nodeType":"YulFunctionCall","src":"9534:62:111"},"nodeType":"YulExpressionStatement","src":"9534:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9616:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9627:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9612:3:111"},"nodeType":"YulFunctionCall","src":"9612:18:111"},{"hexValue":"6f6e","kind":"string","nodeType":"YulLiteral","src":"9632:4:111","type":"","value":"on"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9605:6:111"},"nodeType":"YulFunctionCall","src":"9605:32:111"},"nodeType":"YulExpressionStatement","src":"9605:32:111"},{"nodeType":"YulAssignment","src":"9646:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9669:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9654:3:111"},"nodeType":"YulFunctionCall","src":"9654:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9646:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ddcbd77f85b2981c914f755affedaeff2c538c54d90d3355ae3f12bc89e3a549__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9432:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9446:4:111","type":""}],"src":"9281:398:111"},{"body":{"nodeType":"YulBlock","src":"9821:289:111","statements":[{"nodeType":"YulVariableDeclaration","src":"9831:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9851:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9845:5:111"},"nodeType":"YulFunctionCall","src":"9845:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"9835:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9867:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9876:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"9871:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9938:77:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9963:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"9968:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9959:3:111"},"nodeType":"YulFunctionCall","src":"9959:11:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9986:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"9994:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9982:3:111"},"nodeType":"YulFunctionCall","src":"9982:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"9998:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9978:3:111"},"nodeType":"YulFunctionCall","src":"9978:25:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9972:5:111"},"nodeType":"YulFunctionCall","src":"9972:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9952:6:111"},"nodeType":"YulFunctionCall","src":"9952:53:111"},"nodeType":"YulExpressionStatement","src":"9952:53:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"9897:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"9900:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"9894:2:111"},"nodeType":"YulFunctionCall","src":"9894:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"9908:21:111","statements":[{"nodeType":"YulAssignment","src":"9910:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"9919:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"9922:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9915:3:111"},"nodeType":"YulFunctionCall","src":"9915:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"9910:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"9890:3:111","statements":[]},"src":"9886:129:111"},{"body":{"nodeType":"YulBlock","src":"10041:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10054:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"10059:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10050:3:111"},"nodeType":"YulFunctionCall","src":"10050:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"10068:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10043:6:111"},"nodeType":"YulFunctionCall","src":"10043:27:111"},"nodeType":"YulExpressionStatement","src":"10043:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"10030:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"10033:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10027:2:111"},"nodeType":"YulFunctionCall","src":"10027:13:111"},"nodeType":"YulIf","src":"10024:48:111"},{"nodeType":"YulAssignment","src":"10081:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10092:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"10097:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10088:3:111"},"nodeType":"YulFunctionCall","src":"10088:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"10081:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"9797:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9802:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"9813:3:111","type":""}],"src":"9684:426:111"},{"body":{"nodeType":"YulBlock","src":"10196:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"10242:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10251:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10254:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10244:6:111"},"nodeType":"YulFunctionCall","src":"10244:12:111"},"nodeType":"YulExpressionStatement","src":"10244:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10217:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10226:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10213:3:111"},"nodeType":"YulFunctionCall","src":"10213:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10238:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10209:3:111"},"nodeType":"YulFunctionCall","src":"10209:32:111"},"nodeType":"YulIf","src":"10206:52:111"},{"nodeType":"YulAssignment","src":"10267:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10283:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10277:5:111"},"nodeType":"YulFunctionCall","src":"10277:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10267:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10162:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10173:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10185:6:111","type":""}],"src":"10115:184:111"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_array_uint256_memory_ptr(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 64)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(offset, 64)\n if gt(srcEnd, end) { revert(0, 0) }\n let src := offset\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, 0x20)\n }\n array := memPtr\n }\n function array_allocation_size_array_array_uint256_dyn(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(shl(5, length), 0x20)\n }\n function abi_decode_array_uint256(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(offset, 128)\n if gt(srcEnd, end) { revert(0, 0) }\n let src := offset\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, 0x20)\n }\n array := memPtr\n }\n function abi_decode_array_array_uint256_dyn(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let _2 := 0x20\n let dst := allocate_memory(array_allocation_size_array_array_uint256_dyn(_1))\n let dst_1 := dst\n mstore(dst, _1)\n dst := add(dst, _2)\n let srcEnd := add(add(offset, shl(6, _1)), _2)\n if gt(srcEnd, end) { revert(0, 0) }\n let src := add(offset, _2)\n for { } lt(src, srcEnd) { src := add(src, 0x40) }\n {\n mstore(dst, abi_decode_array_uint256_memory_ptr(src, end))\n dst := add(dst, _2)\n }\n array := dst_1\n }\n function abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_array$_t_uint256_$4_memory_ptr_$dyn_memory_ptrt_array$_t_array$_t_uint256_$2_memory_ptr_$dyn_memory_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n let _1 := 128\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n value0 := abi_decode_array_uint256_memory_ptr(headStart, dataEnd)\n let offset := calldataload(add(headStart, 64))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n let _5 := 0x20\n let dst := allocate_memory(array_allocation_size_array_array_uint256_dyn(_4))\n let dst_1 := dst\n mstore(dst, _4)\n dst := add(dst, _5)\n let srcEnd := add(add(_3, shl(7, _4)), _5)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_3, _5)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n mstore(dst, abi_decode_array_uint256(src, dataEnd))\n dst := add(dst, _5)\n }\n value1 := dst_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _2) { revert(0, 0) }\n value2 := abi_decode_array_array_uint256_dyn(add(headStart, offset_1), dataEnd)\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_library_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_bytes32t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let array := allocate_memory(add(and(add(_4, 0x1f), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), _1))\n mstore(array, _4)\n if gt(add(add(_3, _4), _1), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, _1), add(_3, _1), _4)\n mstore(add(add(array, _4), _1), 0)\n value1 := array\n }\n function abi_encode_tuple_t_array$_t_uint256_$2_memory_ptr__to_t_array$_t_uint256_$2_memory_ptr__fromStack_library_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 64)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x02) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_array_uint256(headStart, dataEnd)\n }\n function abi_decode_tuple_t_array$_t_uint256_$2_memory_ptrt_array$_t_uint256_$4_memory_ptrt_array$_t_uint256_$2_memory_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 256) { revert(0, 0) }\n value0 := abi_decode_array_uint256_memory_ptr(headStart, dataEnd)\n value1 := abi_decode_array_uint256(add(headStart, 64), dataEnd)\n value2 := abi_decode_array_uint256_memory_ptr(add(headStart, 192), dataEnd)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_b64840d8fee4a4d8e73f11a1832d903c97054a269232c7fd6575ba945ecd93a2__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"BLS: number of public key is zer\")\n mstore(add(headStart, 96), \"o\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_67b14574dbd62d49c28d2ab08487d247114d1becd207a824f77bce3bb38e9721__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"BLS: number of public keys and m\")\n mstore(add(headStart, 96), \"essages must be equal\")\n tail := add(headStart, 128)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function abi_encode_tuple_t_stringliteral_160e77d9d43f27ba4855f2f7c2336a727c5fa8b0ae181ac44e8903a5ea7313f0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 23)\n mstore(add(headStart, 64), \"BLS: bn add call failed\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_c4ff544e35d7a77a229ecca4398c96e4a8d1d092fe0881ee463baa3e09732d7d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"mapToPointFT: invalid field elem\")\n mstore(add(headStart, 96), \"ent\")\n tail := add(headStart, 128)\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_ddcbd77f85b2981c914f755affedaeff2c538c54d90d3355ae3f12bc89e3a549__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"BLS: bad ft mapping implementati\")\n mstore(add(headStart, 96), \"on\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n mstore(add(pos, i), mload(add(add(value0, i), 0x20)))\n }\n if gt(i, length) { mstore(add(pos, length), 0) }\n end := add(pos, length)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c8063914137631461005b578063a850a90914610083578063c2ad5b98146100a3578063ebbdac91146100b6575b600080fd5b61006e6100693660046123f6565b6100c9565b60405190151581526020015b60405180910390f35b6100966100913660046124cd565b6100f1565b60405161007a919061258a565b61006e6100b13660046125bb565b61010a565b61006e6100c43660046125d7565b610155565b60008060006100d9868686610227565b915091508080156100e75750815b9695505050505050565b6100f96121cd565b61010383836107bd565b9392505050565b60006001815b81801561011d5750600481105b1561014e578381600481106101345761013461261e565b6020020151159150806101468161267c565b915050610110565b5092915050565b604080516001808252818301909252600091829190816020015b6101776121eb565b81526020019060019003908161016f57505060408051600180825281830190925291925060009190602082015b6101ac6121cd565b8152602001906001900390816101a457905050905084826000815181106101d5576101d561261e565b602002602001018190525083816000815181106101f4576101f461261e565b602002602001018190525060008061020d888585610227565b9150915080801561021b5750815b98975050505050505050565b81516000908190806102c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a657260448201527f6f0000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b83518114610350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d60448201527f65737361676573206d75737420626520657175616c000000000000000000000060648201526084016102b7565b600061035d8260016126b4565b6103689060066126cc565b905060008167ffffffffffffffff81111561038557610385612227565b6040519080825280602002602001820160405280156103ae578160200160208202803683370190505b5090508760006020020151816000815181106103cc576103cc61261e565b60209081029190910101528760016020020151816001815181106103f2576103f261261e565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104325761043261261e565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed816003815181106104725761047261261e565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec816004815181106104b2576104b261261e565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d816005815181106104f2576104f261261e565b60200260200101818152505060005b838110156107725786818151811061051b5761051b61261e565b60200260200101516000600281106105355761053561261e565b6020020151826105468360066126cc565b6105519060066126b4565b815181106105615761056161261e565b60200260200101818152505086818151811061057f5761057f61261e565b60200260200101516001600281106105995761059961261e565b6020020151826105aa8360066126cc565b6105b59060076126b4565b815181106105c5576105c561261e565b6020026020010181815250508781815181106105e3576105e361261e565b60200260200101516001600481106105fd576105fd61261e565b60200201518261060e8360066126cc565b6106199060086126b4565b815181106106295761062961261e565b6020026020010181815250508781815181106106475761064761261e565b60200260200101516000600481106106615761066161261e565b6020020151826106728360066126cc565b61067d9060096126b4565b8151811061068d5761068d61261e565b6020026020010181815250508781815181106106ab576106ab61261e565b60200260200101516003600481106106c5576106c561261e565b6020020151826106d68360066126cc565b6106e190600a6126b4565b815181106106f1576106f161261e565b60200260200101818152505087818151811061070f5761070f61261e565b60200260200101516002600481106107295761072961261e565b60200201518261073a8360066126cc565b61074590600b6126b4565b815181106107555761075561261e565b60209081029190910101528061076a8161267c565b915050610501565b5061077b612209565b60005a90506020826020860260208601600885fa9550856107a7576000809650965050505050506107b5565b505115159450600193505050505b935093915050565b6107c56121cd565b60006107d184846108ad565b905060006107e582825b60200201516109fb565b905060006107f48360016107db565b90506107fe6121eb565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061083957fe5b50806108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016102b7565b50919695505050505050565b6108b56121cd565b60006108c18484611044565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff81511694507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47857f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4778010000000000000000000000000000000000000000000000008709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff908116975016945092507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905084817801000000000000000000000000000000000000000000000000860908604080518082019091529283526020830152509695505050505050565b610a036121cd565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478210610ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d60448201527f656e74000000000000000000000000000000000000000000000000000000000060648201526084016102b7565b816000610abe826112e1565b91505060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4780610af157610af1612709565b83840990507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760048208905060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4777b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd8509905060007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478383099050610b8e8161131c565b90507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782860991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47610c4d837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe0894507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4785860991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4785830991507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476003830891506000610ce7836112e1565b90935090508015610d415784610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b92505b505060408051808201909152938452602084015250909392505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760018708610d90907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b95507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786840992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600384089250610e0e836112e1565b90935090508015610e485784610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784850995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4782870995507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476001870895507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786870992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4786840992507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600384089250610f83836112e1565b909350905080611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201527f6f6e00000000000000000000000000000000000000000000000000000000000060648201526084016102b7565b84610d2457610d21837f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612738565b805160609060006110568260206126b4565b6110619060406126b4565b61106c9060046126b4565b67ffffffffffffffff81111561108457611084612227565b6040519080825280601f01601f1916602001820160405280156110ae576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b848110156110f657602081880181015183830152016110dc565b508301600081536001016060815360010160008153600181018790526021016020815350600060028360405161112c919061274f565b602060405180830381855afa158015611149573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061116c919061278a565b90506000604294508484528160208501526001604085015360418401889052602060618501536002846040516111a2919061274f565b602060405180830381855afa1580156111bf573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906111e2919061278a565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051611219919061274f565b602060405180830381855afa158015611236573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611259919061278a565b905080604084015280821880602086015250600360408501536041840188905260206061850153600284604051611290919061274f565b602060405180830381855afa1580156112ad573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906112d0919061278a565b606084015250909695505050505050565b6000806112ed8361132d565b9150827f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47838409149050915091565b600061132782611a74565b92915050565b60007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561229d5761229d612227565b604052919050565b600082601f8301126122b657600080fd5b6040516040810181811067ffffffffffffffff821117156122d9576122d9612227565b80604052508060408401858111156122f057600080fd5b845b8181101561230a5780358352602092830192016122f2565b509195945050505050565b600067ffffffffffffffff82111561232f5761232f612227565b5060051b60200190565b600082601f83011261234a57600080fd5b6040516080810181811067ffffffffffffffff8211171561236d5761236d612227565b6040528060808401858111156122f057600080fd5b600082601f83011261239357600080fd5b813560206123a86123a383612315565b612256565b82815260069290921b840181019181810190868411156123c757600080fd5b8286015b848110156123eb576123dd88826122a5565b8352918301916040016123cb565b509695505050505050565b6000806000608080858703121561240c57600080fd5b61241686866122a5565b9350604085013567ffffffffffffffff8082111561243357600080fd5b818701915087601f83011261244757600080fd5b813560206124576123a383612315565b82815260079290921b8401810191818101908b84111561247657600080fd5b948201945b8386101561249c5761248d8c87612339565b8252948601949082019061247b565b975050505060608701359250808311156124b557600080fd5b50506124c386828701612382565b9150509250925092565b600080604083850312156124e057600080fd5b8235915060208084013567ffffffffffffffff8082111561250057600080fd5b818601915086601f83011261251457600080fd5b81358181111561252657612526612227565b612556847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612256565b9150808252878482850101111561256c57600080fd5b80848401858401376000848284010152508093505050509250929050565b60408101818360005b60028110156125b2578151835260209283019290910190600101612593565b50505092915050565b6000608082840312156125cd57600080fd5b6101038383612339565b600080600061010084860312156125ed57600080fd5b6125f785856122a5565b92506126068560408601612339565b91506126158560c086016122a5565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ad576126ad61264d565b5060010190565b600082198211156126c7576126c761264d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127045761270461264d565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008282101561274a5761274a61264d565b500390565b6000825160005b818110156127705760208186018101518583015201612756565b8181111561277f576000828501525b509190910192915050565b60006020828403121561279c57600080fd5b505191905056fea264697066735822122077cbc675970f85c3432e2f00dcb3d6b7e322a167becefbacce5de75d2396678e64736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x91413763 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0xA850A909 EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0xC2AD5B98 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0xEBBDAC91 EQ PUSH2 0xB6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6E PUSH2 0x69 CALLDATASIZE PUSH1 0x4 PUSH2 0x23F6 JUMP JUMPDEST PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x96 PUSH2 0x91 CALLDATASIZE PUSH1 0x4 PUSH2 0x24CD JUMP JUMPDEST PUSH2 0xF1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7A SWAP2 SWAP1 PUSH2 0x258A JUMP JUMPDEST PUSH2 0x6E PUSH2 0xB1 CALLDATASIZE PUSH1 0x4 PUSH2 0x25BB JUMP JUMPDEST PUSH2 0x10A JUMP JUMPDEST PUSH2 0x6E PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x25D7 JUMP JUMPDEST PUSH2 0x155 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD9 DUP7 DUP7 DUP7 PUSH2 0x227 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 DUP1 ISZERO PUSH2 0xE7 JUMPI POP DUP2 JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xF9 PUSH2 0x21CD JUMP JUMPDEST PUSH2 0x103 DUP4 DUP4 PUSH2 0x7BD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP2 JUMPDEST DUP2 DUP1 ISZERO PUSH2 0x11D JUMPI POP PUSH1 0x4 DUP2 LT JUMPDEST ISZERO PUSH2 0x14E JUMPI DUP4 DUP2 PUSH1 0x4 DUP2 LT PUSH2 0x134 JUMPI PUSH2 0x134 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD ISZERO SWAP2 POP DUP1 PUSH2 0x146 DUP2 PUSH2 0x267C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x110 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x177 PUSH2 0x21EB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x16F JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD JUMPDEST PUSH2 0x1AC PUSH2 0x21CD JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1A4 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1D5 JUMPI PUSH2 0x1D5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP4 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1F4 JUMPI PUSH2 0x1F4 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP1 PUSH2 0x20D DUP9 DUP6 DUP6 PUSH2 0x227 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 DUP1 ISZERO PUSH2 0x21B JUMPI POP DUP2 JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP1 PUSH2 0x2C0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A206E756D626572206F66207075626C6963206B6579206973207A6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x350 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A206E756D626572206F66207075626C6963206B65797320616E64206D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x65737361676573206D75737420626520657175616C0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35D DUP3 PUSH1 0x1 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x368 SWAP1 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x385 JUMPI PUSH2 0x385 PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x3AE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP8 PUSH1 0x0 PUSH1 0x20 MUL ADD MLOAD DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3CC JUMPI PUSH2 0x3CC PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP8 PUSH1 0x1 PUSH1 0x20 MUL ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x3F2 JUMPI PUSH2 0x3F2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x432 JUMPI PUSH2 0x432 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x472 JUMPI PUSH2 0x472 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x275DC4A288D1AFB3CBB1AC09187524C7DB36395DF7BE3B99E673B13A075A65EC DUP2 PUSH1 0x4 DUP2 MLOAD DUP2 LT PUSH2 0x4B2 JUMPI PUSH2 0x4B2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH32 0x1D9BEFCD05A5323E6DA4D435F3B617CDB3AF83285C2DF711EF39C01571827F9D DUP2 PUSH1 0x5 DUP2 MLOAD DUP2 LT PUSH2 0x4F2 JUMPI PUSH2 0x4F2 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x772 JUMPI DUP7 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x51B JUMPI PUSH2 0x51B PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 PUSH1 0x2 DUP2 LT PUSH2 0x535 JUMPI PUSH2 0x535 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x546 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x551 SWAP1 PUSH1 0x6 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x561 JUMPI PUSH2 0x561 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP7 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x57F JUMPI PUSH2 0x57F PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x2 DUP2 LT PUSH2 0x599 JUMPI PUSH2 0x599 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x5AA DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x5B5 SWAP1 PUSH1 0x7 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x5C5 JUMPI PUSH2 0x5C5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x5E3 JUMPI PUSH2 0x5E3 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x4 DUP2 LT PUSH2 0x5FD JUMPI PUSH2 0x5FD PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x60E DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x619 SWAP1 PUSH1 0x8 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x629 JUMPI PUSH2 0x629 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x647 JUMPI PUSH2 0x647 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 PUSH1 0x4 DUP2 LT PUSH2 0x661 JUMPI PUSH2 0x661 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x672 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x67D SWAP1 PUSH1 0x9 PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x68D JUMPI PUSH2 0x68D PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x6AB JUMPI PUSH2 0x6AB PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x3 PUSH1 0x4 DUP2 LT PUSH2 0x6C5 JUMPI PUSH2 0x6C5 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x6D6 DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x6E1 SWAP1 PUSH1 0xA PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x6F1 JUMPI PUSH2 0x6F1 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP8 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x70F JUMPI PUSH2 0x70F PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x2 PUSH1 0x4 DUP2 LT PUSH2 0x729 JUMPI PUSH2 0x729 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP3 PUSH2 0x73A DUP4 PUSH1 0x6 PUSH2 0x26CC JUMP JUMPDEST PUSH2 0x745 SWAP1 PUSH1 0xB PUSH2 0x26B4 JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x755 JUMPI PUSH2 0x755 PUSH2 0x261E JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x76A DUP2 PUSH2 0x267C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x501 JUMP JUMPDEST POP PUSH2 0x77B PUSH2 0x2209 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP3 PUSH1 0x20 DUP7 MUL PUSH1 0x20 DUP7 ADD PUSH1 0x8 DUP6 STATICCALL SWAP6 POP DUP6 PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 SWAP7 POP SWAP7 POP POP POP POP POP POP PUSH2 0x7B5 JUMP JUMPDEST POP MLOAD ISZERO ISZERO SWAP5 POP PUSH1 0x1 SWAP4 POP POP POP POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7C5 PUSH2 0x21CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D1 DUP5 DUP5 PUSH2 0x8AD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x7E5 DUP3 DUP3 JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9FB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x7F4 DUP4 PUSH1 0x1 PUSH2 0x7DB JUMP JUMPDEST SWAP1 POP PUSH2 0x7FE PUSH2 0x21EB JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD DUP3 DUP3 ADD MSTORE DUP3 MLOAD PUSH1 0x40 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP4 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x80 DUP5 PUSH1 0x6 PUSH2 0x7D0 GAS SUB STATICCALL SWAP1 POP DUP1 DUP1 PUSH2 0x839 JUMPI INVALID JUMPDEST POP DUP1 PUSH2 0x8A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20626E206164642063616C6C206661696C6564000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x2B7 JUMP JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8B5 PUSH2 0x21CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 DUP5 DUP5 PUSH2 0x1044 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x18 DUP6 ADD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND SWAP4 POP PUSH1 0x30 DUP7 ADD SWAP1 POP PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND SWAP5 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH25 0x1000000000000000000000000000000000000000000000000 DUP8 MULMOD ADDMOD PUSH1 0x48 DUP8 ADD MLOAD PUSH1 0x60 DUP9 ADD MLOAD PUSH24 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP8 POP AND SWAP5 POP SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 SWAP1 POP DUP5 DUP2 PUSH25 0x1000000000000000000000000000000000000000000000000 DUP7 MULMOD ADDMOD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xA03 PUSH2 0x21CD JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 LT PUSH2 0xAB2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D6170546F506F696E7446543A20696E76616C6964206669656C6420656C656D PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E740000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST DUP2 PUSH1 0x0 PUSH2 0xABE DUP3 PUSH2 0x12E1 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 PUSH2 0xAF1 JUMPI PUSH2 0xAF1 PUSH2 0x2709 JUMP JUMPDEST DUP4 DUP5 MULMOD SWAP1 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x4 DUP3 ADDMOD SWAP1 POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH24 0xB3C4D79D41A91759A9E4C7E359B6B89EAEC68E62EFFFFFFD DUP6 MULMOD SWAP1 POP PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP4 DUP4 MULMOD SWAP1 POP PUSH2 0xB8E DUP2 PUSH2 0x131C JUMP JUMPDEST SWAP1 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP2 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP7 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0xC4D DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST PUSH24 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE ADDMOD SWAP5 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 DUP7 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP6 DUP4 MULMOD SWAP2 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP4 ADDMOD SWAP2 POP PUSH1 0x0 PUSH2 0xCE7 DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 ISZERO PUSH2 0xD41 JUMPI DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD MSTORE POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x1 DUP8 ADDMOD PUSH2 0xD90 SWAP1 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP5 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP5 ADDMOD SWAP3 POP PUSH2 0xE0E DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 ISZERO PUSH2 0xE48 JUMPI DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP5 DUP6 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP3 DUP8 MULMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x1 DUP8 ADDMOD SWAP6 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP8 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP7 DUP5 MULMOD SWAP3 POP PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH1 0x3 DUP5 ADDMOD SWAP3 POP PUSH2 0xF83 DUP4 PUSH2 0x12E1 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP DUP1 PUSH2 0x1015 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424C533A20626164206674206D617070696E6720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x2B7 JUMP JUMPDEST DUP5 PUSH2 0xD24 JUMPI PUSH2 0xD21 DUP4 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 PUSH2 0x2738 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 SWAP1 PUSH1 0x0 PUSH2 0x1056 DUP3 PUSH1 0x20 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x1061 SWAP1 PUSH1 0x40 PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x106C SWAP1 PUSH1 0x4 PUSH2 0x26B4 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1084 JUMPI PUSH2 0x1084 PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AE JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 MSTORE PUSH1 0x80 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x60 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP4 DUP4 ADD MSTORE ADD PUSH2 0x10DC JUMP JUMPDEST POP DUP4 ADD PUSH1 0x0 DUP2 MSTORE8 PUSH1 0x1 ADD PUSH1 0x60 DUP2 MSTORE8 PUSH1 0x1 ADD PUSH1 0x0 DUP2 MSTORE8 PUSH1 0x1 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x21 ADD PUSH1 0x20 DUP2 MSTORE8 POP PUSH1 0x0 PUSH1 0x2 DUP4 PUSH1 0x40 MLOAD PUSH2 0x112C SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1149 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x116C SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x42 SWAP5 POP DUP5 DUP5 MSTORE DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x11A2 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x11BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11E2 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP3 XOR DUP1 PUSH1 0x20 DUP7 ADD MSTORE POP PUSH1 0x2 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1219 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1236 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1259 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP3 XOR DUP1 PUSH1 0x20 DUP7 ADD MSTORE POP PUSH1 0x3 PUSH1 0x40 DUP6 ADD MSTORE8 PUSH1 0x41 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x20 PUSH1 0x61 DUP6 ADD MSTORE8 PUSH1 0x2 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1290 SWAP2 SWAP1 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12D0 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12ED DUP4 PUSH2 0x132D JUMP JUMPDEST SWAP2 POP DUP3 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP4 DUP5 MULMOD EQ SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1327 DUP3 PUSH2 0x1A74 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 DUP4 DUP5 MULMOD SWAP2 POP DUP1 DUP4 DUP4 MULMOD DUP2 DUP4 DUP3 MULMOD DUP3 DUP3 DUP4 MULMOD DUP4 DUP6 DUP4 MULMOD DUP5 DUP5 DUP4 MULMOD DUP6 DUP5 DUP5 MULMOD DUP7 DUP5 DUP6 MULMOD SWAP8 POP DUP7 DUP5 DUP5 MULMOD DUP8 DUP6 DUP5 MULMOD SWAP5 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP4 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP5 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP7 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP2 DUP10 MULMOD SWAP8 POP POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP5 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP POP POP POP POP POP DUP1 DUP3 DUP4 MULMOD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47 DUP1 DUP4 DUP5 MULMOD SWAP2 POP DUP1 DUP4 DUP4 MULMOD DUP2 DUP4 DUP3 MULMOD DUP3 DUP3 DUP4 MULMOD DUP4 DUP6 DUP4 MULMOD DUP5 DUP5 DUP4 MULMOD DUP6 DUP5 DUP5 MULMOD DUP7 DUP5 DUP6 MULMOD SWAP8 POP DUP7 DUP5 DUP5 MULMOD DUP8 DUP6 DUP5 MULMOD SWAP5 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP8 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP4 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP3 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP5 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP7 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP11 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP10 DUP11 MULMOD SWAP9 POP DUP8 DUP2 DUP11 MULMOD SWAP9 POP POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP5 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP10 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP7 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP9 DUP10 MULMOD SWAP8 POP DUP7 DUP2 DUP10 MULMOD SWAP8 POP POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP6 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP4 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP8 DUP9 MULMOD SWAP7 POP DUP6 DUP2 DUP9 MULMOD SWAP7 POP POP POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP6 DUP7 MULMOD SWAP5 POP DUP4 DUP2 DUP7 MULMOD SWAP5 POP POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP2 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP6 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP5 DUP6 MULMOD SWAP4 POP DUP3 DUP2 DUP6 MULMOD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x229D JUMPI PUSH2 0x229D PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x22B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x22D9 JUMPI PUSH2 0x22D9 PUSH2 0x2227 JUMP JUMPDEST DUP1 PUSH1 0x40 MSTORE POP DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x22F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x230A JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x22F2 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x232F JUMPI PUSH2 0x232F PUSH2 0x2227 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x234A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x236D JUMPI PUSH2 0x236D PUSH2 0x2227 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x22F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 PUSH2 0x23A8 PUSH2 0x23A3 DUP4 PUSH2 0x2315 JUMP JUMPDEST PUSH2 0x2256 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x6 SWAP3 SWAP1 SWAP3 SHL DUP5 ADD DUP2 ADD SWAP2 DUP2 DUP2 ADD SWAP1 DUP7 DUP5 GT ISZERO PUSH2 0x23C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP7 ADD JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x23EB JUMPI PUSH2 0x23DD DUP9 DUP3 PUSH2 0x22A5 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 PUSH1 0x40 ADD PUSH2 0x23CB JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP1 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x240C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2416 DUP7 DUP7 PUSH2 0x22A5 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 PUSH2 0x2457 PUSH2 0x23A3 DUP4 PUSH2 0x2315 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x7 SWAP3 SWAP1 SWAP3 SHL DUP5 ADD DUP2 ADD SWAP2 DUP2 DUP2 ADD SWAP1 DUP12 DUP5 GT ISZERO PUSH2 0x2476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x249C JUMPI PUSH2 0x248D DUP13 DUP8 PUSH2 0x2339 JUMP JUMPDEST DUP3 MSTORE SWAP5 DUP7 ADD SWAP5 SWAP1 DUP3 ADD SWAP1 PUSH2 0x247B JUMP JUMPDEST SWAP8 POP POP POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP DUP1 DUP4 GT ISZERO PUSH2 0x24B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0x24C3 DUP7 DUP3 DUP8 ADD PUSH2 0x2382 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x24E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP1 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2526 JUMPI PUSH2 0x2526 PUSH2 0x2227 JUMP JUMPDEST PUSH2 0x2556 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x2256 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x256C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP2 LT ISZERO PUSH2 0x25B2 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2593 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x25CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x103 DUP4 DUP4 PUSH2 0x2339 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x25ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F7 DUP6 DUP6 PUSH2 0x22A5 JUMP JUMPDEST SWAP3 POP PUSH2 0x2606 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x2339 JUMP JUMPDEST SWAP2 POP PUSH2 0x2615 DUP6 PUSH1 0xC0 DUP7 ADD PUSH2 0x22A5 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x26AD JUMPI PUSH2 0x26AD PUSH2 0x264D JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x26C7 JUMPI PUSH2 0x26C7 PUSH2 0x264D JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x2704 JUMPI PUSH2 0x2704 PUSH2 0x264D JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x274A JUMPI PUSH2 0x274A PUSH2 0x264D JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2770 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x2756 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x277F JUMPI PUSH1 0x0 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x279C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0xCBC675970F85C3432E2F00DCB3D6B7E322A167BECEFBACCE 0x5D 0xE7 0x5D 0x23 SWAP7 PUSH8 0x8E64736F6C634300 ADDMOD 0xF STOP CALLER ","sourceMap":"126:1656:82:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:359;;;;;;:::i;:::-;;:::i;:::-;;;4302:14:111;;4295:22;4277:41;;4265:2;4250:18;965:359:82;;;;;;;;1330:213;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1549:230::-;;;;;;:::i;:::-;;:::i;148:811::-;;;;;;:::i;:::-;;:::i;965:359::-;1130:4;1147:13;1162:16;1183:94;1215:9;1238:7;1259:8;1183:18;:94::i;:::-;1146:131;;;;1294:11;:23;;;;;1309:8;1294:23;1287:30;965:359;-1:-1:-1;;;;;;965:359:82:o;1330:213::-;1434:17;;:::i;:::-;1470:66;1499:6;1519:7;1470:15;:66::i;:::-;1463:73;1330:213;-1:-1:-1;;;1330:213:82:o;1549:230::-;1618:4;1648;1618;1662:88;1680:6;:13;;;;;1692:1;1690;:3;1680:13;1662:88;;;1724:6;1731:1;1724:9;;;;;;;:::i;:::-;;;;;:14;;-1:-1:-1;1695:3:82;;;;:::i;:::-;;;;1662:88;;;-1:-1:-1;1766:6:82;1549:230;-1:-1:-1;;1549:230:82:o;148:811::-;351:19;;;368:1;351:19;;;;;;;;;305:4;;;;351:19;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;411:19:82;;;428:1;411:19;;;;;;;;;321:49;;-1:-1:-1;380:28:82;;411:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;380:50;;453:6;440:7;448:1;440:10;;;;;;;;:::i;:::-;;;;;;:19;;;;483:7;469:8;478:1;469:11;;;;;;;;:::i;:::-;;;;;;:21;;;;502:13;517:16;538:94;570:9;593:7;614:8;538:18;:94::i;:::-;501:131;;;;649:11;:23;;;;;664:8;649:23;642:30;148:811;-1:-1:-1;;;;;;;;148:811:82:o;3115:1706:83:-;3341:14;;3280:16;;;;3373:8;3365:54;;;;;;;7218:2:111;3365:54:83;;;7200:21:111;7257:2;7237:18;;;7230:30;7296:34;7276:18;;;7269:62;7367:3;7347:18;;;7340:31;7388:19;;3365:54:83;;;;;;;;;3458:8;:15;3450:4;:23;3429:123;;;;;;;7620:2:111;3429:123:83;;;7602:21:111;7659:2;7639:18;;;7632:30;7698:34;7678:18;;;7671:62;7769:23;7749:18;;;7742:51;7810:19;;3429:123:83;7418:417:111;3429:123:83;3562:17;3583:8;:4;3590:1;3583:8;:::i;:::-;3582:14;;3595:1;3582:14;:::i;:::-;3562:34;;3606:22;3645:9;3631:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3631:24:83;-1:-1:-1;3606:49:83;-1:-1:-1;3676:9:83;3686:1;3676:12;;;;3665:5;3671:1;3665:8;;;;;;;;:::i;:::-;;;;;;;;;;:23;3709:9;3719:1;3709:12;;;;3698:5;3704:1;3698:8;;;;;;;;:::i;:::-;;;;;;:23;;;;;770:77;3731:5;3737:1;3731:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;911:77;3759:5;3765:1;3759:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;1052:77;3787:5;3793:1;3787:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;1193:77;3815:5;3821:1;3815:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;3848:9;3843:326;3867:4;3863:1;:8;3843:326;;;3911:8;3920:1;3911:11;;;;;;;;:::i;:::-;;;;;;;3923:1;3911:14;;;;;;;:::i;:::-;;;;;3892:5;3898;:1;3902;3898:5;:::i;:::-;:9;;3906:1;3898:9;:::i;:::-;3892:16;;;;;;;;:::i;:::-;;;;;;:33;;;;;3958:8;3967:1;3958:11;;;;;;;;:::i;:::-;;;;;;;3970:1;3958:14;;;;;;;:::i;:::-;;;;;3939:5;3945;:1;3949;3945:5;:::i;:::-;:9;;3953:1;3945:9;:::i;:::-;3939:16;;;;;;;;:::i;:::-;;;;;;:33;;;;;4005:7;4013:1;4005:10;;;;;;;;:::i;:::-;;;;;;;4016:1;4005:13;;;;;;;:::i;:::-;;;;;3986:5;3992;:1;3996;3992:5;:::i;:::-;:9;;4000:1;3992:9;:::i;:::-;3986:16;;;;;;;;:::i;:::-;;;;;;:32;;;;;4051:7;4059:1;4051:10;;;;;;;;:::i;:::-;;;;;;;4062:1;4051:13;;;;;;;:::i;:::-;;;;;4032:5;4038;:1;4042;4038:5;:::i;:::-;:9;;4046:1;4038:9;:::i;:::-;4032:16;;;;;;;;:::i;:::-;;;;;;:32;;;;;4098:7;4106:1;4098:10;;;;;;;;:::i;:::-;;;;;;;4109:1;4098:13;;;;;;;:::i;:::-;;;;;4078:5;4084;:1;4088;4084:5;:::i;:::-;:10;;4092:2;4084:10;:::i;:::-;4078:17;;;;;;;;:::i;:::-;;;;;;:33;;;;;4145:7;4153:1;4145:10;;;;;;;;:::i;:::-;;;;;;;4156:1;4145:13;;;;;;;:::i;:::-;;;;;4125:5;4131;:1;4135;4131:5;:::i;:::-;:10;;4139:2;4131:10;:::i;:::-;4125:17;;;;;;;;:::i;:::-;;;;;;;;;;:33;3873:3;;;;:::i;:::-;;;;3843:326;;;;4178:21;;:::i;:::-;4237:25;4265:9;4237:37;;4678:4;4657:3;4634:4;4623:9;4619:20;4596:4;4589:5;4585:16;4566:1;4531:17;4503:193;4488:208;;4720:11;4715:64;;4755:5;4762;4747:21;;;;;;;;;;;4715:64;-1:-1:-1;4796:6:83;:11;;;-1:-1:-1;4809:4:83;;-1:-1:-1;;;;3115:1706:83;;;;;;;:::o;4885:823::-;4991:17;;:::i;:::-;5024:19;5046:28;5058:6;5066:7;5046:11;:28::i;:::-;5024:50;-1:-1:-1;5084:20:83;5107:16;5024:50;5084:20;5118:4;;;;;5107:10;:16::i;:::-;5084:39;-1:-1:-1;5133:20:83;5156:16;5167:1;5169;5167:4;;5156:16;5133:39;;5182:28;;:::i;:::-;5236:5;;5220:21;;5236:5;5267;;;;5251:13;;;:21;5298:5;;5282:13;;;;:21;;;;5329:5;;;;5313:13;;;:21;5239:1;;5236:2;5508:3;5220:10;5493:1;5486:4;5479:5;5475:16;5464:56;5453:67;-1:-1:-1;5453:67:83;;5533:87;5564:56;5593:9;5533:87;;5647:7;5639:43;;;;;;;8408:2:111;5639:43:83;;;8390:21:111;8447:2;8427:18;;;8420:30;8486:25;8466:18;;;8459:53;8529:18;;5639:43:83;8206:347:111;5639:43:83;-1:-1:-1;5699:2:83;;4885:823;-1:-1:-1;;;;;;4885:823:83:o;9855:788::-;9962:17;;:::i;:::-;9995;10015:31;10029:6;10037:8;10015:13;:31::i;:::-;9995:51;;10056:10;10076;10096;10116;10242:2;10236:4;10232:13;10278:6;10274:1;10268:8;10264:21;10258:27;;10313:2;10307:4;10303:13;10298:18;;10349:6;10345:1;10339:8;10335:21;10329:27;;10406:1;10402:2;10398:1;10393:3;10389:2;10382:18;10375:33;10436:2;10426:13;;10462:8;10507:2;10497:13;;10533:8;10472:6;10529:21;;;;-1:-1:-1;10458:21:83;;-1:-1:-1;10369:39:83;-1:-1:-1;10600:1:83;;-1:-1:-1;10529:21:83;10600:1;10587:3;10458:21;10576:18;10569:33;10621:15;;;;;;;;;;;;;;;;-1:-1:-1;10621:15:83;9855:788;-1:-1:-1;;;;;;9855:788:83:o;5714:1643::-;5793:19;;:::i;:::-;597:77;5836:2;:6;5828:54;;;;;;;8760:2:111;5828:54:83;;;8742:21:111;8799:2;8779:18;;;8772:30;8838:34;8818:18;;;8811:62;8909:5;8889:18;;;8882:33;8932:19;;5828:54:83;8558:399:111;5828:54:83;5904:2;5892:9;5937:7;5904:2;5937:4;:7::i;:::-;5917:27;;;5955:10;597:77;5968:15;;;;;:::i;:::-;5978:1;5975;5968:15;5955:28;-1:-1:-1;597:77:83;6009:1;6005:2;5998:16;5993:21;-1:-1:-1;6024:10:83;597:77;1346:66;6044:1;6037:16;6024:29;-1:-1:-1;6063:10:83;597:77;6087:2;6083;6076:17;6063:30;;6108:11;6116:2;6108:7;:11::i;:::-;6103:16;-1:-1:-1;597:77:83;6145:2;6141;6134:17;6129:22;-1:-1:-1;597:77:83;6177:2;6173;6166:17;6161:22;-1:-1:-1;597:77:83;6223:2;6220:1;6213:16;6208:21;-1:-1:-1;597:77:83;6254:6;6258:2;597:77;6254:6;:::i;:::-;1498:66;6243:21;6239:25;-1:-1:-1;597:77:83;6312:1;6309;6302:15;6297:20;-1:-1:-1;597:77:83;6343:1;6339:2;6332:16;6327:21;-1:-1:-1;597:77:83;6374:1;6370:2;6363:16;6358:21;;6389:10;6423:8;6428:2;6423:4;:8::i;:::-;6409:22;;-1:-1:-1;6409:22:83;-1:-1:-1;6441:122:83;;;;6471:8;6466:59;;6504:6;6508:2;597:77;6504:6;:::i;:::-;6499:11;;6466:59;-1:-1:-1;;6538:14:83;;;;;;;;;;;;;;;;-1:-1:-1;6538:14:83;;5714:1643;-1:-1:-1;;;5714:1643:83:o;6441:122::-;597:77;6605:1;6602;6595:15;6591:19;;597:77;6591:19;:::i;:::-;6587:23;-1:-1:-1;597:77:83;6658:1;6655;6648:15;6643:20;-1:-1:-1;597:77:83;6689:1;6685:2;6678:16;6673:21;-1:-1:-1;597:77:83;6720:1;6716:2;6709:16;6704:21;;6749:8;6754:2;6749:4;:8::i;:::-;6735:22;;-1:-1:-1;6735:22:83;-1:-1:-1;6767:122:83;;;;6797:8;6792:59;;6830:6;6834:2;597:77;6830:6;:::i;6767:122::-;597:77;6928:2;6924;6917:17;6913:21;-1:-1:-1;597:77:83;6958:1;6955;6948:15;6944:19;-1:-1:-1;597:77:83;6987:2;6984:1;6977:16;6973:20;-1:-1:-1;597:77:83;7017:2;7014:1;7007:16;7003:20;-1:-1:-1;597:77:83;7047:1;7044;7037:15;7033:19;-1:-1:-1;597:77:83;7105:1;7102;7095:15;7090:20;-1:-1:-1;597:77:83;7136:1;7132:2;7125:16;7120:21;-1:-1:-1;597:77:83;7167:1;7163:2;7156:16;7151:21;;7196:8;7201:2;7196:4;:8::i;:::-;7182:22;;-1:-1:-1;7182:22:83;-1:-1:-1;7182:22:83;7214:52;;;;;;;9483:2:111;7214:52:83;;;9465:21:111;9522:2;9502:18;;;9495:30;9561:34;9541:18;;;9534:62;9632:4;9612:18;;;9605:32;9654:19;;7214:52:83;9281:398:111;7214:52:83;7281:8;7276:51;;7310:6;7314:2;597:77;7310:6;:::i;10649:2587::-;10873:14;;10757:12;;10860:10;10927:7;10873:14;10927:2;:7;:::i;:::-;:12;;10937:2;10927:12;:::i;:::-;:16;;10942:1;10927:16;:::i;:::-;10917:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10917:27:83;-1:-1:-1;10973:13:83;;;10983:2;10973:13;;;;;;;;;10897:47;;-1:-1:-1;10954:16:83;;10973:13;;;;;;;;;;;-1:-1:-1;10973:13:83;10954:32;;11116:2;11110:4;11106:13;11163:1;11132:187;11185:2;11182:1;11179:9;11132:187;;;11299:2;11279:24;;;;;11273:31;11262:9;;;11255:50;11292:10;11132:187;;;-1:-1:-1;11337:10:83;;11372:1;11337:10;11361:13;11399:1;11392:9;11425:2;11392:9;11414:14;11453:1;11446:9;11479:1;11446:9;11468:13;11506:1;11499:9;;11522:17;;;11557:10;;11564:2;11557:10;11580:14;;11613:10;11626:12;11633:4;11626:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11613:25;;11648:10;11673:7;11668:12;;11830:2;11824:4;11817:16;11977:2;11972;11966:4;11962:13;11955:25;12016:1;12011:2;12005:4;12001:13;11993:25;12048:2;12038:13;;12031:29;;;12105:2;12091:11;12081:22;;12073:35;12133:12;12140:4;12133:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12128:17;;12264:2;12259;12254:3;12250:12;12243:24;12406:2;12402;12398:11;12444:1;12439:2;12433:4;12429:13;12422:24;;12482:1;12477:2;12471:4;12467:13;12459:25;12514:2;12504:13;;12497:29;;;12571:2;12557:11;12547:22;;12539:35;12599:12;12606:4;12599:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12594:17;;12730:2;12725;12720:3;12716:12;12709:24;12872:2;12868;12864:11;12910:1;12905:2;12899:4;12895:13;12888:24;;12948:1;12943:2;12937:4;12933:13;12925:25;12980:2;12970:13;;12963:29;;;13037:2;13023:11;13013:22;;13005:35;13065:12;13072:4;13065:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13191:2;13182:12;;13175:24;-1:-1:-1;13182:12:83;;10649:2587;-1:-1:-1;;;;;;10649:2587:83:o;9585:154::-;9634:9;9645:12;9673:18;9688:2;9673:14;:18::i;:::-;9669:22;-1:-1:-1;9730:2:83;597:77;9721:1;9718;9711:15;:21;9701:31;;9585:154;;;:::o;9745:104::-;9796:7;9822:20;9840:1;9822:17;:20::i;:::-;9815:27;9745:104;-1:-1:-1;;9745:104:83:o;12300:11285:85:-;12348:10;12494:66;12595:1;12591:2;12587;12580:17;12574:23;;12635:1;12631:2;12627;12620:17;12675:1;12671:2;12667;12660:17;12715:1;12711:2;12707;12700:17;12755:1;12751:2;12747;12740:17;12795:1;12791:2;12787;12780:17;12835:1;12831:2;12827;12820:17;12871:1;12867:2;12863;12856:17;12850:23;;12911:1;12907:2;12903;12896:17;12947:1;12943:2;12939;12932:17;12926:23;;12983:1;12979:2;12975;12968:17;12962:23;;13019:1;13015:2;13011;13004:17;12998:23;;13055:1;13051:2;13047;13040:17;13034:23;;13091:1;13087:2;13083;13076:17;13070:23;;13127:1;13123:2;13119;13112:17;13106:23;;13163:1;13159:2;13155;13148:17;13142:23;;13199:1;13195:2;13191;13184:17;13178:23;;13235:1;13231:2;13227;13220:17;13214:23;;13271:1;13267:2;13263;13256:17;13250:23;;13307:1;13303:2;13299;13292:17;13286:23;;13343:1;13339:2;13335;13328:17;13322:23;;13379:1;13375:2;13371;13364:17;13358:23;;13415:1;13411:2;13407;13400:17;13394:23;;13451:1;13447:2;13443;13436:17;13430:23;;13487:1;13483:2;13479;13472:17;13466:23;;13523:1;13519:2;13515;13508:17;13502:23;;13559:1;13555:2;13551;13544:17;13538:23;;13595:1;13591:2;13587;13580:17;13574:23;;13631:1;13627:2;13623;13616:17;13610:23;;13667:1;13663:2;13659;13652:17;13646:23;;13703:1;13699:2;13695;13688:17;13682:23;;13739:1;13735:2;13731;13724:17;13718:23;;13775:1;13771:2;13767;13760:17;13754:23;;13811:1;13807:2;13803;13796:17;13790:23;;13847:1;13843:2;13839;13832:17;13826:23;;13883:1;13879:2;13875;13868:17;13862:23;;13919:1;13915:2;13911;13904:17;13898:23;;13955:1;13951:2;13947;13940:17;13934:23;;13991:1;13987:2;13983;13976:17;13970:23;;14027:1;14023:2;14019;14012:17;14006:23;;14063:1;14059:2;14055;14048:17;14042:23;;14099:1;14095:2;14091;14084:17;14078:23;;14135:1;14131:2;14127;14120:17;14114:23;;14171:1;14167:2;14163;14156:17;14150:23;;14207:1;14203:2;14199;14192:17;14186:23;;14243:1;14239:2;14235;14228:17;14222:23;;14279:1;14275:2;14271;14264:17;14258:23;;14315:1;14311:2;14307;14300:17;14294:23;;14351:1;14347:2;14343;14336:17;14330:23;;14387:1;14383:2;14379;14372:17;14366:23;;14423:1;14419:2;14415;14408:17;14402:23;;14459:1;14455:2;14451;14444:17;14438:23;;14495:1;14491:2;14487;14480:17;14474:23;;14531:1;14527:2;14523;14516:17;14510:23;;14567:1;14563:2;14559;14552:17;14546:23;;14603:1;14599:2;14595;14588:17;14582:23;;14639:1;14635:2;14631;14624:17;14618:23;;14675:1;14671:2;14667;14660:17;14654:23;;14711:1;14707:2;14703;14696:17;14690:23;;14747:1;14743:2;14739;14732:17;14726:23;;14783:1;14779:2;14775;14768:17;14762:23;;14819:1;14815:2;14811;14804:17;14798:23;;14855:1;14851:2;14847;14840:17;14834:23;;14891:1;14887:2;14883;14876:17;14870:23;;14927:1;14923:2;14919;14912:17;14906:23;;14963:1;14959:2;14955;14948:17;14942:23;;14999:1;14995:2;14991;14984:17;14978:23;;15035:1;15031:2;15027;15020:17;15014:23;;15071:1;15067:2;15063;15056:17;15050:23;;15107:1;15103:2;15099;15092:17;15086:23;;15143:1;15139:2;15135;15128:17;15122:23;;15179:1;15175:2;15171;15164:17;15158:23;;15215:1;15211:2;15207;15200:17;15194:23;;15251:1;15247:2;15243;15236:17;15230:23;;15287:1;15283:2;15279;15272:17;15266:23;;15323:1;15319:2;15315;15308:17;15302:23;;15359:1;15355:2;15351;15344:17;15338:23;;15395:1;15391:2;15387;15380:17;15374:23;;15431:1;15427:2;15423;15416:17;15410:23;;15467:1;15463:2;15459;15452:17;15446:23;;15503:1;15499:2;15495;15488:17;15482:23;;15539:1;15535:2;15531;15524:17;15518:23;;15575:1;15571:2;15567;15560:17;15554:23;;15611:1;15607:2;15603;15596:17;15590:23;;15647:1;15643:2;15639;15632:17;15626:23;;15683:1;15679:2;15675;15668:17;15662:23;;15719:1;15715:2;15711;15704:17;15698:23;;15755:1;15751:2;15747;15740:17;15734:23;;15791:1;15787:2;15783;15776:17;15770:23;;15827:1;15823:2;15819;15812:17;15806:23;;15863:1;15859:2;15855;15848:17;15842:23;;15899:1;15895:2;15891;15884:17;15878:23;;15935:1;15931:2;15927;15920:17;15914:23;;15971:1;15967:2;15963;15956:17;15950:23;;16007:1;16003:2;15999;15992:17;15986:23;;16043:1;16039:2;16035;16028:17;16022:23;;16079:1;16075:2;16071;16064:17;16058:23;;16115:1;16111:2;16107;16100:17;16094:23;;16151:1;16147:2;16143;16136:17;16130:23;;16187:1;16183:2;16179;16172:17;16166:23;;16223:1;16219:2;16215;16208:17;16202:23;;16259:1;16255:2;16251;16244:17;16238:23;;16295:1;16291:2;16287;16280:17;16274:23;;16331:1;16327:2;16323;16316:17;16310:23;;16367:1;16363:2;16359;16352:17;16346:23;;16403:1;16399:2;16395;16388:17;16382:23;;16439:1;16435:2;16431;16424:17;16418:23;;16475:1;16471:2;16467;16460:17;16454:23;;16511:1;16507:2;16503;16496:17;16490:23;;16547:1;16543:2;16539;16532:17;16526:23;;16583:1;16579:2;16575;16568:17;16562:23;;16619:1;16615:2;16611;16604:17;16598:23;;16655:1;16651:2;16647;16640:17;16634:23;;16691:1;16687:2;16683;16676:17;16670:23;;16727:1;16723:2;16719;16712:17;16706:23;;16763:1;16759:2;16755;16748:17;16742:23;;16799:1;16795:2;16791;16784:17;16778:23;;16835:1;16831:2;16827;16820:17;16814:23;;16871:1;16867:2;16863;16856:17;16850:23;;16907:1;16903:2;16899;16892:17;16886:23;;16943:1;16939:2;16935;16928:17;16922:23;;16979:1;16975:2;16971;16964:17;16958:23;;17015:1;17011:2;17007;17000:17;16994:23;;17051:1;17047:2;17043;17036:17;17030:23;;17087:1;17083:2;17079;17072:17;17066:23;;17123:1;17119:2;17115;17108:17;17102:23;;17159:1;17155:2;17151;17144:17;17138:23;;17195:1;17191:2;17187;17180:17;17174:23;;17231:1;17227:2;17223;17216:17;17210:23;;17267:1;17263:2;17259;17252:17;17246:23;;17303:1;17299:2;17295;17288:17;17282:23;;17339:1;17335:2;17331;17324:17;17318:23;;17375:1;17371:2;17367;17360:17;17354:23;;17411:1;17407:2;17403;17396:17;17390:23;;17447:1;17443:2;17439;17432:17;17426:23;;17483:1;17479:2;17475;17468:17;17462:23;;17519:1;17515:2;17511;17504:17;17498:23;;17555:1;17551:2;17547;17540:17;17534:23;;17591:1;17587:2;17583;17576:17;17570:23;;17627:1;17623:2;17619;17612:17;17606:23;;17663:1;17659:2;17655;17648:17;17642:23;;17699:1;17695:2;17691;17684:17;17678:23;;17735:1;17731:2;17727;17720:17;17714:23;;17771:1;17767:2;17763;17756:17;17750:23;;17807:1;17803:2;17799;17792:17;17786:23;;17843:1;17839:2;17835;17828:17;17822:23;;17879:1;17875:2;17871;17864:17;17858:23;;17915:1;17911:2;17907;17900:17;17894:23;;17951:1;17947:2;17943;17936:17;17930:23;;17987:1;17983:2;17979;17972:17;17966:23;;18023:1;18019:2;18015;18008:17;18002:23;;18059:1;18055:2;18051;18044:17;18038:23;;18095:1;18091:2;18087;18080:17;18074:23;;18131:1;18127:2;18123;18116:17;18110:23;;18167:1;18163:2;18159;18152:17;18146:23;;18203:1;18199:2;18195;18188:17;18182:23;;18239:1;18235:2;18231;18224:17;18218:23;;18275:1;18271:2;18267;18260:17;18254:23;;18311:1;18307:2;18303;18296:17;18290:23;;18347:1;18343:2;18339;18332:17;18326:23;;18383:1;18379:2;18375;18368:17;18362:23;;18419:1;18415:2;18411;18404:17;18398:23;;18455:1;18451:2;18447;18440:17;18434:23;;18491:1;18487:2;18483;18476:17;18470:23;;18527:1;18523:2;18519;18512:17;18506:23;;18563:1;18559:2;18555;18548:17;18542:23;;18599:1;18595:2;18591;18584:17;18578:23;;18635:1;18631:2;18627;18620:17;18614:23;;18671:1;18667:2;18663;18656:17;18650:23;;18707:1;18703:2;18699;18692:17;18686:23;;18743:1;18739:2;18735;18728:17;18722:23;;18779:1;18775:2;18771;18764:17;18758:23;;18815:1;18811:2;18807;18800:17;18794:23;;18851:1;18847:2;18843;18836:17;18830:23;;18887:1;18883:2;18879;18872:17;18866:23;;18923:1;18919:2;18915;18908:17;18902:23;;18959:1;18955:2;18951;18944:17;18938:23;;18995:1;18991:2;18987;18980:17;18974:23;;19031:1;19027:2;19023;19016:17;19010:23;;19067:1;19063:2;19059;19052:17;19046:23;;19103:1;19099:2;19095;19088:17;19082:23;;19139:1;19135:2;19131;19124:17;19118:23;;19175:1;19171:2;19167;19160:17;19154:23;;19211:1;19207:2;19203;19196:17;19190:23;;19247:1;19243:2;19239;19232:17;19226:23;;19283:1;19279:2;19275;19268:17;19262:23;;19319:1;19315:2;19311;19304:17;19298:23;;19355:1;19351:2;19347;19340:17;19334:23;;19391:1;19387:2;19383;19376:17;19370:23;;19427:1;19423:2;19419;19412:17;19406:23;;19463:1;19459:2;19455;19448:17;19442:23;;19499:1;19495:2;19491;19484:17;19478:23;;19535:1;19531:2;19527;19520:17;19514:23;;19571:1;19567:2;19563;19556:17;19550:23;;19607:1;19603:2;19599;19592:17;19586:23;;19643:1;19639:2;19635;19628:17;19622:23;;19679:1;19675:2;19671;19664:17;19658:23;;19715:1;19711:2;19707;19700:17;19694:23;;19751:1;19747:2;19743;19736:17;19730:23;;19787:1;19783:2;19779;19772:17;19766:23;;19823:1;19819:2;19815;19808:17;19802:23;;19859:1;19855:2;19851;19844:17;19838:23;;19895:1;19891:2;19887;19880:17;19874:23;;19931:1;19927:2;19923;19916:17;19910:23;;19967:1;19963:2;19959;19952:17;19946:23;;20003:1;19999:2;19995;19988:17;19982:23;;20039:1;20035:2;20031;20024:17;20018:23;;20075:1;20071:2;20067;20060:17;20054:23;;20111:1;20107:2;20103;20096:17;20090:23;;20147:1;20143:2;20139;20132:17;20126:23;;20183:1;20179:2;20175;20168:17;20162:23;;20219:1;20215:2;20211;20204:17;20198:23;;20255:1;20251:2;20247;20240:17;20234:23;;20291:1;20287:2;20283;20276:17;20270:23;;20327:1;20323:2;20319;20312:17;20306:23;;20363:1;20359:2;20355;20348:17;20342:23;;20399:1;20395:2;20391;20384:17;20378:23;;20435:1;20431:2;20427;20420:17;20414:23;;20471:1;20467:2;20463;20456:17;20450:23;;20507:1;20503:2;20499;20492:17;20486:23;;20543:1;20539:2;20535;20528:17;20522:23;;20579:1;20575:2;20571;20564:17;20558:23;;20615:1;20611:2;20607;20600:17;20594:23;;20651:1;20647:2;20643;20636:17;20630:23;;20687:1;20683:2;20679;20672:17;20666:23;;20723:1;20719:2;20715;20708:17;20702:23;;20759:1;20755:2;20751;20744:17;20738:23;;20795:1;20791:2;20787;20780:17;20774:23;;20831:1;20827:2;20823;20816:17;20810:23;;20867:1;20863:2;20859;20852:17;20846:23;;20903:1;20899:2;20895;20888:17;20882:23;;;20939:1;20935:2;20931;20924:17;20918:23;;20975:1;20971:2;20967;20960:17;20954:23;;21011:1;21007:2;21003;20996:17;20990:23;;21047:1;21043:2;21039;21032:17;21026:23;;21083:1;21079:2;21075;21068:17;21062:23;;21119:1;21115:2;21111;21104:17;21098:23;;21155:1;21151:2;21147;21140:17;21134:23;;21191:1;21187:2;21183;21176:17;21170:23;;21227:1;21223:2;21219;21212:17;21206:23;;21263:1;21259:2;21255;21248:17;21242:23;;21299:1;21295:2;21291;21284:17;21278:23;;21335:1;21331:2;21327;21320:17;21314:23;;21371:1;21367:2;21363;21356:17;21350:23;;21407:1;21403:2;21399;21392:17;21386:23;;21443:1;21439:2;21435;21428:17;21422:23;;21479:1;21475:2;21471;21464:17;21458:23;;21515:1;21511:2;21507;21500:17;21494:23;;21551:1;21547:2;21543;21536:17;21530:23;;21587:1;21583:2;21579;21572:17;21566:23;;21623:1;21619:2;21615;21608:17;21602:23;;21659:1;21655:2;21651;21644:17;21638:23;;21695:1;21691:2;21687;21680:17;21674:23;;21731:1;21727:2;21723;21716:17;21710:23;;21767:1;21763:2;21759;21752:17;21746:23;;21803:1;21799:2;21795;21788:17;21782:23;;21839:1;21835:2;21831;21824:17;21818:23;;21875:1;21871:2;21867;21860:17;21854:23;;21911:1;21907:2;21903;21896:17;21890:23;;21947:1;21943:2;21939;21932:17;21926:23;;21983:1;21979:2;21975;21968:17;21962:23;;22019:1;22015:2;22011;22004:17;21998:23;;22055:1;22051:2;22047;22040:17;22034:23;;22091:1;22087:2;22083;22076:17;22070:23;;22127:1;22123:2;22119;22112:17;22106:23;;22163:1;22159:2;22155;22148:17;22142:23;;22199:1;22195:2;22191;22184:17;22178:23;;;22235:1;22231:2;22227;22220:17;22214:23;;22271:1;22267:2;22263;22256:17;22250:23;;22307:1;22303:2;22299;22292:17;22286:23;;22343:1;22339:2;22335;22328:17;22322:23;;22379:1;22375:2;22371;22364:17;22358:23;;22415:1;22411:2;22407;22400:17;22394:23;;22451:1;22447:2;22443;22436:17;22430:23;;22487:1;22483:2;22479;22472:17;22466:23;;22523:1;22519:2;22515;22508:17;22502:23;;22559:1;22555:2;22551;22544:17;22538:23;;22595:1;22591:2;22587;22580:17;22574:23;;22631:1;22627:2;22623;22616:17;22610:23;;22667:1;22663:2;22659;22652:17;22646:23;;22703:1;22699:2;22695;22688:17;22682:23;;22739:1;22735:2;22731;22724:17;22718:23;;22775:1;22771:2;22767;22760:17;22754:23;;22811:1;22807:2;22803;22796:17;22790:23;;22847:1;22843:2;22839;22832:17;22826:23;;22883:1;22879:2;22875;22868:17;22862:23;;22919:1;22915:2;22911;22904:17;22898:23;;22955:1;22951:2;22947;22940:17;22934:23;;22991:1;22987:2;22983;22976:17;22970:23;;23027:1;23023:2;23019;23012:17;23006:23;;23063:1;23059:2;23055;23048:17;23042:23;;23099:1;23095:2;23091;23084:17;23078:23;;23135:1;23131:2;23127;23120:17;23114:23;;23171:1;23167:2;23163;23156:17;23150:23;;23207:1;23203:2;23199;23192:17;23186:23;;23243:1;23239:2;23235;23228:17;23222:23;;23279:1;23275:2;23271;23264:17;23258:23;;23315:1;23311:2;23307;23300:17;23294:23;;23351:1;23347:2;23343;23336:17;23330:23;;23387:1;23383:2;23379;23372:17;23366:23;;23423:1;23419:2;23415;23408:17;23402:23;;23459:1;23455:2;23451;23444:17;23438:23;;23495:1;23491:2;23487;23480:17;23474:23;;23531:1;23527:2;23523;23516:17;23510:23;;;;;;;23567:1;23563:2;23559;23552:17;23546:23;12300:11285;-1:-1:-1;;;12300:11285:85:o;557:11392::-;605:10;751:66;851:1;847:2;843;836:17;830:23;;891:1;887:2;883;876:17;931:1;927:2;923;916:17;971:1;967:2;963;956:17;1011:1;1007:2;1003;996:17;1051:1;1047:2;1043;1036:17;1091:1;1087:2;1083;1076:17;1127:1;1123:2;1119;1112:17;1106:23;;1167:1;1163:2;1159;1152:17;1203:1;1199:2;1195;1188:17;1182:23;;1239:1;1235:2;1231;1224:17;1218:23;;1275:1;1271:2;1267;1260:17;1254:23;;1311:1;1307:2;1303;1296:17;1290:23;;1347:1;1343:2;1339;1332:17;1326:23;;1383:1;1379:2;1375;1368:17;1362:23;;1419:1;1415:2;1411;1404:17;1398:23;;1455:1;1451:2;1447;1440:17;1434:23;;1491:1;1487:2;1483;1476:17;1470:23;;1527:1;1523:2;1519;1512:17;1506:23;;1563:1;1559:2;1555;1548:17;1542:23;;1599:1;1595:2;1591;1584:17;1578:23;;1635:1;1631:2;1627;1620:17;1614:23;;1671:1;1667:2;1663;1656:17;1650:23;;1707:1;1703:2;1699;1692:17;1686:23;;1743:1;1739:2;1735;1728:17;1722:23;;1779:1;1775:2;1771;1764:17;1758:23;;1815:1;1811:2;1807;1800:17;1794:23;;1851:1;1847:2;1843;1836:17;1830:23;;1887:1;1883:2;1879;1872:17;1866:23;;1923:1;1919:2;1915;1908:17;1902:23;;1959:1;1955:2;1951;1944:17;1938:23;;1995:1;1991:2;1987;1980:17;1974:23;;2031:1;2027:2;2023;2016:17;2010:23;;2067:1;2063:2;2059;2052:17;2046:23;;2103:1;2099:2;2095;2088:17;2082:23;;2139:1;2135:2;2131;2124:17;2118:23;;2175:1;2171:2;2167;2160:17;2154:23;;2211:1;2207:2;2203;2196:17;2190:23;;2247:1;2243:2;2239;2232:17;2226:23;;2283:1;2279:2;2275;2268:17;2262:23;;2319:1;2315:2;2311;2304:17;2298:23;;2355:1;2351:2;2347;2340:17;2334:23;;2391:1;2387:2;2383;2376:17;2370:23;;2427:1;2423:2;2419;2412:17;2406:23;;2463:1;2459:2;2455;2448:17;2442:23;;2499:1;2495:2;2491;2484:17;2478:23;;2535:1;2531:2;2527;2520:17;2514:23;;2571:1;2567:2;2563;2556:17;2550:23;;2607:1;2603:2;2599;2592:17;2586:23;;2643:1;2639:2;2635;2628:17;2622:23;;2679:1;2675:2;2671;2664:17;2658:23;;2715:1;2711:2;2707;2700:17;2694:23;;2751:1;2747:2;2743;2736:17;2730:23;;2787:1;2783:2;2779;2772:17;2766:23;;2823:1;2819:2;2815;2808:17;2802:23;;2859:1;2855:2;2851;2844:17;2838:23;;2895:1;2891:2;2887;2880:17;2874:23;;2931:1;2927:2;2923;2916:17;2910:23;;2967:1;2963:2;2959;2952:17;2946:23;;3003:1;2999:2;2995;2988:17;2982:23;;3039:1;3035:2;3031;3024:17;3018:23;;3075:1;3071:2;3067;3060:17;3054:23;;3111:1;3107:2;3103;3096:17;3090:23;;3147:1;3143:2;3139;3132:17;3126:23;;3183:1;3179:2;3175;3168:17;3162:23;;3219:1;3215:2;3211;3204:17;3198:23;;3255:1;3251:2;3247;3240:17;3234:23;;3291:1;3287:2;3283;3276:17;3270:23;;3327:1;3323:2;3319;3312:17;3306:23;;3363:1;3359:2;3355;3348:17;3342:23;;3399:1;3395:2;3391;3384:17;3378:23;;3435:1;3431:2;3427;3420:17;3414:23;;3471:1;3467:2;3463;3456:17;3450:23;;3507:1;3503:2;3499;3492:17;3486:23;;3543:1;3539:2;3535;3528:17;3522:23;;3579:1;3575:2;3571;3564:17;3558:23;;3615:1;3611:2;3607;3600:17;3594:23;;3651:1;3647:2;3643;3636:17;3630:23;;3687:1;3683:2;3679;3672:17;3666:23;;3723:1;3719:2;3715;3708:17;3702:23;;3759:1;3755:2;3751;3744:17;3738:23;;3795:1;3791:2;3787;3780:17;3774:23;;3831:1;3827:2;3823;3816:17;3810:23;;3867:1;3863:2;3859;3852:17;3846:23;;3903:1;3899:2;3895;3888:17;3882:23;;3939:1;3935:2;3931;3924:17;3918:23;;3975:1;3971:2;3967;3960:17;3954:23;;4011:1;4007:2;4003;3996:17;3990:23;;4047:1;4043:2;4039;4032:17;4026:23;;4083:1;4079:2;4075;4068:17;4062:23;;4119:1;4115:2;4111;4104:17;4098:23;;4155:1;4151:2;4147;4140:17;4134:23;;4191:1;4187:2;4183;4176:17;4170:23;;4227:1;4223:2;4219;4212:17;4206:23;;4263:1;4259:2;4255;4248:17;4242:23;;4299:1;4295:2;4291;4284:17;4278:23;;4335:1;4331:2;4327;4320:17;4314:23;;4371:1;4367:2;4363;4356:17;4350:23;;4407:1;4403:2;4399;4392:17;4386:23;;4443:1;4439:2;4435;4428:17;4422:23;;4479:1;4475:2;4471;4464:17;4458:23;;4515:1;4511:2;4507;4500:17;4494:23;;4551:1;4547:2;4543;4536:17;4530:23;;4587:1;4583:2;4579;4572:17;4566:23;;4623:1;4619:2;4615;4608:17;4602:23;;4659:1;4655:2;4651;4644:17;4638:23;;4695:1;4691:2;4687;4680:17;4674:23;;4731:1;4727:2;4723;4716:17;4710:23;;4767:1;4763:2;4759;4752:17;4746:23;;4803:1;4799:2;4795;4788:17;4782:23;;4839:1;4835:2;4831;4824:17;4818:23;;4875:1;4871:2;4867;4860:17;4854:23;;4911:1;4907:2;4903;4896:17;4890:23;;4947:1;4943:2;4939;4932:17;4926:23;;4983:1;4979:2;4975;4968:17;4962:23;;5019:1;5015:2;5011;5004:17;4998:23;;5055:1;5051:2;5047;5040:17;5034:23;;5091:1;5087:2;5083;5076:17;5070:23;;5127:1;5123:2;5119;5112:17;5106:23;;5163:1;5159:2;5155;5148:17;5142:23;;5199:1;5195:2;5191;5184:17;5178:23;;5235:1;5231:2;5227;5220:17;5214:23;;5271:1;5267:2;5263;5256:17;5250:23;;5307:1;5303:2;5299;5292:17;5286:23;;5343:1;5339:2;5335;5328:17;5322:23;;5379:1;5375:2;5371;5364:17;5358:23;;5415:1;5411:2;5407;5400:17;5394:23;;5451:1;5447:2;5443;5436:17;5430:23;;5487:1;5483:2;5479;5472:17;5466:23;;5523:1;5519:2;5515;5508:17;5502:23;;5559:1;5555:2;5551;5544:17;5538:23;;5595:1;5591:2;5587;5580:17;5574:23;;5631:1;5627:2;5623;5616:17;5610:23;;5667:1;5663:2;5659;5652:17;5646:23;;5703:1;5699:2;5695;5688:17;5682:23;;5739:1;5735:2;5731;5724:17;5718:23;;5775:1;5771:2;5767;5760:17;5754:23;;5811:1;5807:2;5803;5796:17;5790:23;;5847:1;5843:2;5839;5832:17;5826:23;;5883:1;5879:2;5875;5868:17;5862:23;;5919:1;5915:2;5911;5904:17;5898:23;;5955:1;5951:2;5947;5940:17;5934:23;;5991:1;5987:2;5983;5976:17;5970:23;;6027:1;6023:2;6019;6012:17;6006:23;;6063:1;6059:2;6055;6048:17;6042:23;;6099:1;6095:2;6091;6084:17;6078:23;;6135:1;6131:2;6127;6120:17;6114:23;;6171:1;6167:2;6163;6156:17;6150:23;;6207:1;6203:2;6199;6192:17;6186:23;;6243:1;6239:2;6235;6228:17;6222:23;;6279:1;6275:2;6271;6264:17;6258:23;;6315:1;6311:2;6307;6300:17;6294:23;;6351:1;6347:2;6343;6336:17;6330:23;;6387:1;6383:2;6379;6372:17;6366:23;;6423:1;6419:2;6415;6408:17;6402:23;;6459:1;6455:2;6451;6444:17;6438:23;;6495:1;6491:2;6487;6480:17;6474:23;;6531:1;6527:2;6523;6516:17;6510:23;;6567:1;6563:2;6559;6552:17;6546:23;;6603:1;6599:2;6595;6588:17;6582:23;;6639:1;6635:2;6631;6624:17;6618:23;;6675:1;6671:2;6667;6660:17;6654:23;;6711:1;6707:2;6703;6696:17;6690:23;;6747:1;6743:2;6739;6732:17;6726:23;;6783:1;6779:2;6775;6768:17;6762:23;;6819:1;6815:2;6811;6804:17;6798:23;;6855:1;6851:2;6847;6840:17;6834:23;;6891:1;6887:2;6883;6876:17;6870:23;;6927:1;6923:2;6919;6912:17;6906:23;;6963:1;6959:2;6955;6948:17;6942:23;;6999:1;6995:2;6991;6984:17;6978:23;;7035:1;7031:2;7027;7020:17;7014:23;;7071:1;7067:2;7063;7056:17;7050:23;;7107:1;7103:2;7099;7092:17;7086:23;;7143:1;7139:2;7135;7128:17;7122:23;;7179:1;7175:2;7171;7164:17;7158:23;;7215:1;7211:2;7207;7200:17;7194:23;;7251:1;7247:2;7243;7236:17;7230:23;;7287:1;7283:2;7279;7272:17;7266:23;;7323:1;7319:2;7315;7308:17;7302:23;;7359:1;7355:2;7351;7344:17;7338:23;;7395:1;7391:2;7387;7380:17;7374:23;;7431:1;7427:2;7423;7416:17;7410:23;;7467:1;7463:2;7459;7452:17;7446:23;;7503:1;7499:2;7495;7488:17;7482:23;;7539:1;7535:2;7531;7524:17;7518:23;;7575:1;7571:2;7567;7560:17;7554:23;;7611:1;7607:2;7603;7596:17;7590:23;;7647:1;7643:2;7639;7632:17;7626:23;;7683:1;7679:2;7675;7668:17;7662:23;;7719:1;7715:2;7711;7704:17;7698:23;;7755:1;7751:2;7747;7740:17;7734:23;;7791:1;7787:2;7783;7776:17;7770:23;;7827:1;7823:2;7819;7812:17;7806:23;;7863:1;7859:2;7855;7848:17;7842:23;;7899:1;7895:2;7891;7884:17;7878:23;;7935:1;7931:2;7927;7920:17;7914:23;;7971:1;7967:2;7963;7956:17;7950:23;;8007:1;8003:2;7999;7992:17;7986:23;;8043:1;8039:2;8035;8028:17;8022:23;;8079:1;8075:2;8071;8064:17;8058:23;;8115:1;8111:2;8107;8100:17;8094:23;;8151:1;8147:2;8143;8136:17;8130:23;;8187:1;8183:2;8179;8172:17;8166:23;;8223:1;8219:2;8215;8208:17;8202:23;;8259:1;8255:2;8251;8244:17;8238:23;;8295:1;8291:2;8287;8280:17;8274:23;;8331:1;8327:2;8323;8316:17;8310:23;;8367:1;8363:2;8359;8352:17;8346:23;;8403:1;8399:2;8395;8388:17;8382:23;;8439:1;8435:2;8431;8424:17;8418:23;;8475:1;8471:2;8467;8460:17;8454:23;;8511:1;8507:2;8503;8496:17;8490:23;;8547:1;8543:2;8539;8532:17;8526:23;;8583:1;8579:2;8575;8568:17;8562:23;;8619:1;8615:2;8611;8604:17;8598:23;;8655:1;8651:2;8647;8640:17;8634:23;;8691:1;8687:2;8683;8676:17;8670:23;;8727:1;8723:2;8719;8712:17;8706:23;;8763:1;8759:2;8755;8748:17;8742:23;;8799:1;8795:2;8791;8784:17;8778:23;;8835:1;8831:2;8827;8820:17;8814:23;;8871:1;8867:2;8863;8856:17;8850:23;;8907:1;8903:2;8899;8892:17;8886:23;;8943:1;8939:2;8935;8928:17;8922:23;;8979:1;8975:2;8971;8964:17;8958:23;;9015:1;9011:2;9007;9000:17;8994:23;;9051:1;9047:2;9043;9036:17;9030:23;;9087:1;9083:2;9079;9072:17;9066:23;;9123:1;9119:2;9115;9108:17;9102:23;;9159:1;9155:2;9151;9144:17;9138:23;;;9195:1;9191:2;9187;9180:17;9174:23;;9231:1;9227:2;9223;9216:17;9210:23;;9267:1;9263:2;9259;9252:17;9246:23;;9303:1;9299:2;9295;9288:17;9282:23;;9339:1;9335:2;9331;9324:17;9318:23;;9375:1;9371:2;9367;9360:17;9354:23;;9411:1;9407:2;9403;9396:17;9390:23;;9447:1;9443:2;9439;9432:17;9426:23;;9483:1;9479:2;9475;9468:17;9462:23;;9519:1;9515:2;9511;9504:17;9498:23;;9555:1;9551:2;9547;9540:17;9534:23;;9591:1;9587:2;9583;9576:17;9570:23;;9627:1;9623:2;9619;9612:17;9606:23;;9663:1;9659:2;9655;9648:17;9642:23;;9699:1;9695:2;9691;9684:17;9678:23;;9735:1;9731:2;9727;9720:17;9714:23;;9771:1;9767:2;9763;9756:17;9750:23;;9807:1;9803:2;9799;9792:17;9786:23;;9843:1;9839:2;9835;9828:17;9822:23;;9879:1;9875:2;9871;9864:17;9858:23;;9915:1;9911:2;9907;9900:17;9894:23;;9951:1;9947:2;9943;9936:17;9930:23;;9987:1;9983:2;9979;9972:17;9966:23;;10023:1;10019:2;10015;10008:17;10002:23;;10059:1;10055:2;10051;10044:17;10038:23;;10095:1;10091:2;10087;10080:17;10074:23;;10131:1;10127:2;10123;10116:17;10110:23;;10167:1;10163:2;10159;10152:17;10146:23;;10203:1;10199:2;10195;10188:17;10182:23;;10239:1;10235:2;10231;10224:17;10218:23;;10275:1;10271:2;10267;10260:17;10254:23;;10311:1;10307:2;10303;10296:17;10290:23;;10347:1;10343:2;10339;10332:17;10326:23;;10383:1;10379:2;10375;10368:17;10362:23;;10419:1;10415:2;10411;10404:17;10398:23;;10455:1;10451:2;10447;10440:17;10434:23;;;10491:1;10487:2;10483;10476:17;10470:23;;10527:1;10523:2;10519;10512:17;10506:23;;10563:1;10559:2;10555;10548:17;10542:23;;10599:1;10595:2;10591;10584:17;10578:23;;10635:1;10631:2;10627;10620:17;10614:23;;10671:1;10667:2;10663;10656:17;10650:23;;10707:1;10703:2;10699;10692:17;10686:23;;10743:1;10739:2;10735;10728:17;10722:23;;10779:1;10775:2;10771;10764:17;10758:23;;10815:1;10811:2;10807;10800:17;10794:23;;10851:1;10847:2;10843;10836:17;10830:23;;10887:1;10883:2;10879;10872:17;10866:23;;10923:1;10919:2;10915;10908:17;10902:23;;10959:1;10955:2;10951;10944:17;10938:23;;10995:1;10991:2;10987;10980:17;10974:23;;11031:1;11027:2;11023;11016:17;11010:23;;11067:1;11063:2;11059;11052:17;11046:23;;11103:1;11099:2;11095;11088:17;11082:23;;11139:1;11135:2;11131;11124:17;11118:23;;11175:1;11171:2;11167;11160:17;11154:23;;11211:1;11207:2;11203;11196:17;11190:23;;11247:1;11243:2;11239;11232:17;11226:23;;;;11283:1;11279:2;11275;11268:17;11262:23;;11319:1;11315:2;11311;11304:17;11298:23;;11355:1;11351:2;11347;11340:17;11334:23;;11391:1;11387:2;11383;11376:17;11370:23;;11427:1;11423:2;11419;11412:17;11406:23;;;11463:1;11459:2;11455;11448:17;11442:23;;11499:1;11495:2;11491;11484:17;11478:23;;11535:1;11531:2;11527;11520:17;11514:23;;11571:1;11567:2;11563;11556:17;11550:23;;11607:1;11603:2;11599;11592:17;11586:23;;11643:1;11639:2;11635;11628:17;11622:23;;11679:1;11675:2;11671;11664:17;11658:23;;11715:1;11711:2;11707;11700:17;11694:23;;11751:1;11747:2;11743;11736:17;11730:23;;11787:1;11783:2;11779;11772:17;11766:23;;11823:1;11819:2;11815;11808:17;11802:23;;11859:1;11855:2;11851;11844:17;11838:23;;11895:1;11891:2;11887;11880:17;11874:23;;11931:1;11927:2;11923;11916:17;11910:23;557:11392;-1:-1:-1;;;;;557:11392:85:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:184:111:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:334;274:2;268:9;330:2;320:13;;335:66;316:86;304:99;;433:18;418:34;;454:22;;;415:62;412:88;;;480:18;;:::i;:::-;516:2;509:22;203:334;;-1:-1:-1;203:334:111:o;542:657::-;603:5;656:3;649:4;641:6;637:17;633:27;623:55;;674:1;671;664:12;623:55;707:2;701:9;749:2;741:6;737:15;818:6;806:10;803:22;782:18;770:10;767:34;764:62;761:88;;;829:18;;:::i;:::-;869:10;865:2;858:22;;900:6;941:2;933:6;929:15;967:3;959:6;956:15;953:35;;;984:1;981;974:12;953:35;1008:6;1023:146;1039:6;1034:3;1031:15;1023:146;;;1107:17;;1095:30;;1154:4;1145:14;;;;1056;1023:146;;;-1:-1:-1;1187:6:111;;542:657;-1:-1:-1;;;;;542:657:111:o;1204:189::-;1270:4;1303:18;1295:6;1292:30;1289:56;;;1325:18;;:::i;:::-;-1:-1:-1;1370:1:111;1366:14;1382:4;1362:25;;1204:189::o;1398:648::-;1448:5;1501:3;1494:4;1486:6;1482:17;1478:27;1468:55;;1519:1;1516;1509:12;1468:55;1552:2;1546:9;1594:3;1586:6;1582:16;1664:6;1652:10;1649:22;1628:18;1616:10;1613:34;1610:62;1607:88;;;1675:18;;:::i;:::-;1711:2;1704:22;1746:6;1787:3;1775:16;;1803:15;;;1800:35;;;1831:1;1828;1821:12;2051:704;2111:5;2164:3;2157:4;2149:6;2145:17;2141:27;2131:55;;2182:1;2179;2172:12;2131:55;2218:6;2205:20;2244:4;2268:66;2284:49;2330:2;2284:49;:::i;:::-;2268:66;:::i;:::-;2368:15;;;2454:1;2450:10;;;;2438:23;;2434:32;;;2399:12;;;;2478:15;;;2475:35;;;2506:1;2503;2496:12;2475:35;2542:2;2534:6;2530:15;2554:172;2570:6;2565:3;2562:15;2554:172;;;2638:45;2679:3;2674;2638:45;:::i;:::-;2626:58;;2704:12;;;;2596:4;2587:14;2554:172;;;-1:-1:-1;2744:5:111;2051:704;-1:-1:-1;;;;;;2051:704:111:o;2760:1364::-;2956:6;2964;2972;3003:3;3047:2;3035:9;3026:7;3022:23;3018:32;3015:52;;;3063:1;3060;3053:12;3015:52;3086:55;3133:7;3122:9;3086:55;:::i;:::-;3076:65;;3192:2;3181:9;3177:18;3164:32;3215:18;3256:2;3248:6;3245:14;3242:34;;;3272:1;3269;3262:12;3242:34;3310:6;3299:9;3295:22;3285:32;;3355:7;3348:4;3344:2;3340:13;3336:27;3326:55;;3377:1;3374;3367:12;3326:55;3413:2;3400:16;3435:4;3459:66;3475:49;3521:2;3475:49;:::i;3459:66::-;3559:15;;;3641:1;3637:10;;;;3629:19;;3625:28;;;3590:12;;;;3665:19;;;3662:39;;;3697:1;3694;3687:12;3662:39;3721:11;;;;3741:163;3757:6;3752:3;3749:15;3741:163;;;3823:38;3853:7;3848:3;3823:38;:::i;:::-;3811:51;;3774:12;;;;3882;;;;3741:163;;;3923:5;-1:-1:-1;;;;3981:2:111;3966:18;;3953:32;;-1:-1:-1;3997:16:111;;;3994:36;;;4026:1;4023;4016:12;3994:36;;;4049:69;4110:7;4099:8;4088:9;4084:24;4049:69;:::i;:::-;4039:79;;;2760:1364;;;;;:::o;4329:890::-;4406:6;4414;4467:2;4455:9;4446:7;4442:23;4438:32;4435:52;;;4483:1;4480;4473:12;4435:52;4519:9;4506:23;4496:33;;4548:2;4601;4590:9;4586:18;4573:32;4624:18;4665:2;4657:6;4654:14;4651:34;;;4681:1;4678;4671:12;4651:34;4719:6;4708:9;4704:22;4694:32;;4764:7;4757:4;4753:2;4749:13;4745:27;4735:55;;4786:1;4783;4776:12;4735:55;4822:2;4809:16;4844:2;4840;4837:10;4834:36;;;4850:18;;:::i;:::-;4892:112;5000:2;4931:66;4924:4;4920:2;4916:13;4912:86;4908:95;4892:112;:::i;:::-;4879:125;;5027:2;5020:5;5013:17;5067:7;5062:2;5057;5053;5049:11;5045:20;5042:33;5039:53;;;5088:1;5085;5078:12;5039:53;5143:2;5138;5134;5130:11;5125:2;5118:5;5114:14;5101:45;5187:1;5182:2;5177;5170:5;5166:14;5162:23;5155:34;;5208:5;5198:15;;;;;4329:890;;;;;:::o;5224:502::-;5412:2;5397:18;;5401:9;5492:6;5370:4;5526:194;5540:4;5537:1;5534:11;5526:194;;;5599:13;;5587:26;;5636:4;5660:12;;;;5695:15;;;;5560:1;5553:9;5526:194;;;5530:3;;;5224:502;;;;:::o;5731:225::-;5813:6;5866:3;5854:9;5845:7;5841:23;5837:33;5834:53;;;5883:1;5880;5873:12;5834:53;5906:44;5942:7;5931:9;5906:44;:::i;5961:472::-;6107:6;6115;6123;6176:3;6164:9;6155:7;6151:23;6147:33;6144:53;;;6193:1;6190;6183:12;6144:53;6216:55;6263:7;6252:9;6216:55;:::i;:::-;6206:65;;6290:53;6335:7;6330:2;6319:9;6315:18;6290:53;:::i;:::-;6280:63;;6362:65;6419:7;6413:3;6402:9;6398:19;6362:65;:::i;:::-;6352:75;;5961:472;;;;;:::o;6438:184::-;6490:77;6487:1;6480:88;6587:4;6584:1;6577:15;6611:4;6608:1;6601:15;6627:184;6679:77;6676:1;6669:88;6776:4;6773:1;6766:15;6800:4;6797:1;6790:15;6816:195;6855:3;6886:66;6879:5;6876:77;6873:103;;6956:18;;:::i;:::-;-1:-1:-1;7003:1:111;6992:13;;6816:195::o;7840:128::-;7880:3;7911:1;7907:6;7904:1;7901:13;7898:39;;;7917:18;;:::i;:::-;-1:-1:-1;7953:9:111;;7840:128::o;7973:228::-;8013:7;8139:1;8071:66;8067:74;8064:1;8061:81;8056:1;8049:9;8042:17;8038:105;8035:131;;;8146:18;;:::i;:::-;-1:-1:-1;8186:9:111;;7973:228::o;8962:184::-;9014:77;9011:1;9004:88;9111:4;9108:1;9101:15;9135:4;9132:1;9125:15;9151:125;9191:4;9219:1;9216;9213:8;9210:34;;;9224:18;;:::i;:::-;-1:-1:-1;9261:9:111;;9151:125::o;9684:426::-;9813:3;9851:6;9845:13;9876:1;9886:129;9900:6;9897:1;9894:13;9886:129;;;9998:4;9982:14;;;9978:25;;9972:32;9959:11;;;9952:53;9915:12;9886:129;;;10033:6;10030:1;10027:13;10024:48;;;10068:1;10059:6;10054:3;10050:16;10043:27;10024:48;-1:-1:-1;10088:16:111;;;;;9684:426;-1:-1:-1;;9684:426:111:o;10115:184::-;10185:6;10238:2;10226:9;10217:7;10213:23;10209:32;10206:52;;;10254:1;10251;10244:12;10206:52;-1:-1:-1;10277:16:111;;10115:184;-1:-1:-1;10115:184:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"2040200","executionCost":"2199","totalCost":"2042399"},"external":{"hashToPoint(bytes32,bytes)":"infinite","isZeroBLSKey(uint256[4])":"infinite","verifyMultiple(uint256[2],uint256[4][],uint256[2][])":"infinite","verifySingle(uint256[2],uint256[4],uint256[2])":"infinite"}},"methodIdentifiers":{"hashToPoint(bytes32,bytes)":"a850a909","isZeroBLSKey(uint256[4])":"c2ad5b98","verifyMultiple(uint256[2],uint256[4][],uint256[2][])":"91413763","verifySingle(uint256[2],uint256[4],uint256[2])":"ebbdac91"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"domain\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"hashToPoint\",\"outputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"\",\"type\":\"uint256[2]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"blsKey\",\"type\":\"uint256[4]\"}],\"name\":\"isZeroBLSKey\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"signature\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[4][]\",\"name\":\"pubkeys\",\"type\":\"uint256[4][]\"},{\"internalType\":\"uint256[2][]\",\"name\":\"messages\",\"type\":\"uint256[2][]\"}],\"name\":\"verifyMultiple\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"signature\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[4]\",\"name\":\"pubkey\",\"type\":\"uint256[4]\"},{\"internalType\":\"uint256[2]\",\"name\":\"message\",\"type\":\"uint256[2]\"}],\"name\":\"verifySingle\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/lib/BLSOpen.sol\":\"BLSOpen\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/lib/BLSOpen.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\nimport { BLS } from \\\"./hubble-contracts/contracts/libs/BLS.sol\\\";\\n\\nlibrary BLSOpen {\\n function verifySingle(\\n uint256[2] memory signature,\\n uint256[4] memory pubkey,\\n uint256[2] memory message\\n ) external view returns (bool) {\\n uint256[4][] memory pubkeys = new uint256[4][](1);\\n uint256[2][] memory messages = new uint256[2][](1);\\n pubkeys[0] = pubkey;\\n messages[0] = message;\\n\\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\\n signature,\\n pubkeys,\\n messages\\n );\\n return callSuccess && verified;\\n\\n // // NB: (result, success) opposite of `call` convention (success, result).\\n // (bool verified, bool callSuccess) = BLS.verifySingle(\\n // signature,\\n // pubkey,\\n // message\\n // );\\n // return callSuccess && verified;\\n }\\n\\n function verifyMultiple(\\n uint256[2] memory signature,\\n uint256[4][] memory pubkeys,\\n uint256[2][] memory messages\\n ) external view returns (bool) {\\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\\n signature,\\n pubkeys,\\n messages\\n );\\n return callSuccess && verified;\\n }\\n\\n function hashToPoint(\\n bytes32 domain,\\n bytes memory message\\n ) external view returns (uint256[2] memory) {\\n return BLS.hashToPoint(\\n domain,\\n message\\n );\\n }\\n\\n function isZeroBLSKey(uint256[4] memory blsKey) public pure returns (bool) {\\n bool isZero = true;\\n for (uint256 i=0; isZero && i<4; i++) {\\n isZero = (blsKey[i] == 0);\\n }\\n return isZero;\\n }\\n\\n}\\n\",\"keccak256\":\"0x3775f4ddf247e51fd564e31db07ea8bb381b51fba5e6fb39ed296158419d61c1\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\nimport { ModexpInverse, ModexpSqrt } from \\\"./ModExp.sol\\\";\\nimport {\\n BNPairingPrecompileCostEstimator\\n} from \\\"./BNPairingPrecompileCostEstimator.sol\\\";\\n\\n/**\\n @title Boneh\\u2013Lynn\\u2013Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\\n @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\\n @dev We use G1 points for signatures and messages, and G2 points for public keys\\n */\\nlibrary BLS {\\n // Field order\\n // prettier-ignore\\n uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Negated genarator of G2\\n // prettier-ignore\\n uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n\\n // sqrt(-3)\\n // prettier-ignore\\n uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;\\n // (sqrt(-3) - 1) / 2\\n // prettier-ignore\\n uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;\\n\\n // prettier-ignore\\n uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;\\n // prettier-ignore\\n uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n // estimator address\\n// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;\\n\\n function verifySingle(\\n uint256[2] memory signature,\\n uint256[4] memory pubkey,\\n uint256[2] memory message\\n ) internal view returns (bool, bool) {\\n uint256[12] memory input =\\n [\\n signature[0],\\n signature[1],\\n N_G2_X1,\\n N_G2_X0,\\n N_G2_Y1,\\n N_G2_Y0,\\n message[0],\\n message[1],\\n pubkey[1],\\n pubkey[0],\\n pubkey[3],\\n pubkey[2]\\n ];\\n uint256[1] memory out;\\n uint256 precompileGasCost = gasleft();\\n// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(\\n// 2\\n// );\\n bool callSuccess;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n input,\\n 384,\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n function verifyMultiple(\\n uint256[2] memory signature,\\n uint256[4][] memory pubkeys,\\n uint256[2][] memory messages\\n ) internal view returns (bool checkResult, bool callSuccess) {\\n uint256 size = pubkeys.length;\\n require(size > 0, \\\"BLS: number of public key is zero\\\");\\n require(\\n size == messages.length,\\n \\\"BLS: number of public keys and messages must be equal\\\"\\n );\\n uint256 inputSize = (size + 1) * 6;\\n uint256[] memory input = new uint256[](inputSize);\\n input[0] = signature[0];\\n input[1] = signature[1];\\n input[2] = N_G2_X1;\\n input[3] = N_G2_X0;\\n input[4] = N_G2_Y1;\\n input[5] = N_G2_Y0;\\n for (uint256 i = 0; i < size; i++) {\\n input[i * 6 + 6] = messages[i][0];\\n input[i * 6 + 7] = messages[i][1];\\n input[i * 6 + 8] = pubkeys[i][1];\\n input[i * 6 + 9] = pubkeys[i][0];\\n input[i * 6 + 10] = pubkeys[i][3];\\n input[i * 6 + 11] = pubkeys[i][2];\\n }\\n uint256[1] memory out;\\n\\n // prettier-ignore\\n uint256 precompileGasCost = gasleft();\\n// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n add(input, 0x20),\\n mul(inputSize, 0x20),\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n /**\\n @notice Fouque-Tibouchi Hash to Curve\\n */\\n function hashToPoint(bytes32 domain, bytes memory message)\\n internal\\n view\\n returns (uint256[2] memory)\\n {\\n uint256[2] memory u = hashToField(domain, message);\\n uint256[2] memory p0 = mapToPoint(u[0]);\\n uint256[2] memory p1 = mapToPoint(u[1]);\\n uint256[4] memory bnAddInput;\\n bnAddInput[0] = p0[0];\\n bnAddInput[1] = p0[1];\\n bnAddInput[2] = p1[0];\\n bnAddInput[3] = p1[1];\\n bool success;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)\\n switch success\\n case 0 {\\n invalid()\\n }\\n }\\n require(success, \\\"BLS: bn add call failed\\\");\\n return p0;\\n }\\n\\n function mapToPoint(uint256 _x)\\n internal\\n pure\\n returns (uint256[2] memory p)\\n {\\n require(_x < N, \\\"mapToPointFT: invalid field element\\\");\\n uint256 x = _x;\\n\\n (, bool decision) = sqrt(x);\\n\\n uint256 a0 = mulmod(x, x, N);\\n a0 = addmod(a0, 4, N);\\n uint256 a1 = mulmod(x, Z0, N);\\n uint256 a2 = mulmod(a1, a0, N);\\n a2 = inverse(a2);\\n a1 = mulmod(a1, a1, N);\\n a1 = mulmod(a1, a2, N);\\n\\n // x1\\n a1 = mulmod(x, a1, N);\\n x = addmod(Z1, N - a1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n bool found;\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x2\\n x = N - addmod(x, 1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x3\\n x = mulmod(a0, a0, N);\\n x = mulmod(x, x, N);\\n x = mulmod(x, a2, N);\\n x = mulmod(x, a2, N);\\n x = addmod(x, 1, N);\\n // must be on curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n require(found, \\\"BLS: bad ft mapping implementation\\\");\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n function isValidSignature(uint256[2] memory signature)\\n internal\\n pure\\n returns (bool)\\n {\\n if ((signature[0] >= N) || (signature[1] >= N)) {\\n return false;\\n } else {\\n return isOnCurveG1(signature);\\n }\\n }\\n\\n function isOnCurveG1(uint256[2] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n let t2 := mulmod(t0, t0, N)\\n t2 := mulmod(t2, t0, N)\\n t2 := addmod(t2, 3, N)\\n t1 := mulmod(t1, t1, N)\\n _isOnCurve := eq(t1, t2)\\n }\\n }\\n\\n function isOnCurveG2(uint256[4] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n // x0, x1\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n // x0 ^ 2\\n let t2 := mulmod(t0, t0, N)\\n // x1 ^ 2\\n let t3 := mulmod(t1, t1, N)\\n // 3 * x0 ^ 2\\n let t4 := add(add(t2, t2), t2)\\n // 3 * x1 ^ 2\\n let t5 := addmod(add(t3, t3), t3, N)\\n // x0 * (x0 ^ 2 - 3 * x1 ^ 2)\\n t2 := mulmod(add(t2, sub(N, t5)), t0, N)\\n // x1 * (3 * x0 ^ 2 - x1 ^ 2)\\n t3 := mulmod(add(t4, sub(N, t3)), t1, N)\\n\\n // x ^ 3 + b\\n t0 := addmod(\\n t2,\\n 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,\\n N\\n )\\n t1 := addmod(\\n t3,\\n 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,\\n N\\n )\\n\\n // y0, y1\\n t2 := mload(add(point, 64))\\n t3 := mload(add(point, 96))\\n // y ^ 2\\n t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)\\n t3 := mulmod(shl(1, t2), t3, N)\\n\\n // y ^ 2 == x ^ 3 + b\\n _isOnCurve := and(eq(t0, t4), eq(t1, t3))\\n }\\n }\\n\\n function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {\\n x = ModexpSqrt.run(xx);\\n hasRoot = mulmod(x, x, N) == xx;\\n }\\n\\n function inverse(uint256 a) internal pure returns (uint256) {\\n return ModexpInverse.run(a);\\n }\\n\\n function hashToField(bytes32 domain, bytes memory messages)\\n internal\\n pure\\n returns (uint256[2] memory)\\n {\\n bytes memory _msg = expandMsgTo96(domain, messages);\\n uint256 u0;\\n uint256 u1;\\n uint256 a0;\\n uint256 a1;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(_msg, 24)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 48)\\n u0 := and(mload(p), MASK24)\\n a0 := addmod(mulmod(u1, T24, N), u0, N)\\n p := add(_msg, 72)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 96)\\n u0 := and(mload(p), MASK24)\\n a1 := addmod(mulmod(u1, T24, N), u0, N)\\n }\\n return [a0, a1];\\n }\\n\\n function expandMsgTo96(bytes32 domain, bytes memory message)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>\\n uint256 t0 = message.length;\\n bytes memory msg0 = new bytes(32 + t0 + 64 + 4);\\n bytes memory out = new bytes(96);\\n // b0\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(msg0, 96)\\n for {\\n let z := 0\\n } lt(z, t0) {\\n z := add(z, 32)\\n } {\\n mstore(add(p, z), mload(add(message, add(z, 32))))\\n }\\n p := add(p, t0)\\n\\n mstore8(p, 0)\\n p := add(p, 1)\\n mstore8(p, 96)\\n p := add(p, 1)\\n mstore8(p, 0)\\n p := add(p, 1)\\n\\n mstore(p, domain)\\n p := add(p, 32)\\n mstore8(p, 32)\\n }\\n bytes32 b0 = sha256(msg0);\\n bytes32 bi;\\n t0 = 32 + 34;\\n\\n // resize intermediate message\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(msg0, t0)\\n }\\n\\n // b1\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(msg0, 32), b0)\\n mstore8(add(msg0, 64), 1)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 32), bi)\\n }\\n\\n // b2\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 2)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 64), bi)\\n }\\n\\n // b3\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 3)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 96), bi)\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x940963096c7e81c19403df6b2a29a2fc115184f81111f8708cb25b0a222d2676\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\ncontract BNPairingPrecompileCostEstimator {\\n uint256 public baseCost;\\n uint256 public perPairCost;\\n\\n // G1 Generator\\n uint256 private constant G1_X = 1;\\n uint256 private constant G1_Y = 2;\\n\\n // G2 genarator\\n // prettier-ignore\\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n // prettier-ignore\\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n\\n // G2 negated genarator y coordinates\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n\\n function run() external {\\n _run();\\n }\\n\\n function getGasCost(uint256 pairCount) external view returns (uint256) {\\n return pairCount * perPairCost + baseCost;\\n }\\n\\n function _run() internal {\\n uint256 gasCost1Pair = _gasCost1Pair();\\n uint256 gasCost2Pair = _gasCost2Pair();\\n perPairCost = gasCost2Pair - gasCost1Pair;\\n baseCost = gasCost1Pair - perPairCost;\\n }\\n\\n function _gasCost1Pair() internal view returns (uint256) {\\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, single pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: single pair call is failed\\\"\\n );\\n require(\\n out[0] == 0,\\n \\\"BNPairingPrecompileCostEstimator: single pair call result must be 0\\\"\\n );\\n return gasCost;\\n }\\n\\n function _gasCost2Pair() internal view returns (uint256) {\\n uint256[12] memory input =\\n [\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n G2_Y1,\\n G2_Y0,\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n N_G2_Y1,\\n N_G2_Y0\\n ];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, couple pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call is failed\\\"\\n );\\n require(\\n out[0] == 1,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call result must be 1\\\"\\n );\\n return gasCost;\\n }\\n}\\n\",\"keccak256\":\"0x26168469ca9fc23dd434d3ab41b547e1b46a97b497fce967b7916351fb87b66d\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\n/**\\n @title Compute Inverse by Modular Exponentiation\\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\\n @dev the function body is generated with the modified addchain script\\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\\n */\\nlibrary ModexpInverse {\\n function run(uint256 t2) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n t0 := mulmod(t2, t2, n)\\n let t5 := mulmod(t0, t2, n)\\n let t1 := mulmod(t5, t0, n)\\n let t3 := mulmod(t5, t5, n)\\n let t8 := mulmod(t1, t0, n)\\n let t4 := mulmod(t3, t5, n)\\n let t6 := mulmod(t3, t1, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t4, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n }\\n }\\n}\\n\\n/**\\n @title Compute Squre Root by Modular Exponentiation\\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\\n */\\nlibrary ModexpSqrt {\\n function run(uint256 t6) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n\\n t0 := mulmod(t6, t6, n)\\n let t4 := mulmod(t0, t6, n)\\n let t2 := mulmod(t4, t0, n)\\n let t3 := mulmod(t4, t4, n)\\n let t8 := mulmod(t2, t0, n)\\n let t1 := mulmod(t3, t4, n)\\n let t5 := mulmod(t3, t2, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t1, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2f58dd24d2278125ba9dea17eb1d5404170f8b93cf097174558c68a5d50e20a7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol":{"BLS":{"abi":[],"devdoc":{"details":"We use G1 points for signatures and messages, and G2 points for public keys","kind":"dev","methods":{},"title":"Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202fac55297f9585528f1cc291610f0182ad5531bea5efe0af14a4373f7c748e6264736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F 0xAC SSTORE 0x29 PUSH32 0x9585528F1CC291610F0182AD5531BEA5EFE0AF14A4373F7C748E6264736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"508:12730:83:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;508:12730:83;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202fac55297f9585528f1cc291610f0182ad5531bea5efe0af14a4373f7c748e6264736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F 0xAC SSTORE 0x29 PUSH32 0x9585528F1CC291610F0182AD5531BEA5EFE0AF14A4373F7C748E6264736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"508:12730:83:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"expandMsgTo96(bytes32,bytes memory)":"infinite","hashToField(bytes32,bytes memory)":"infinite","hashToPoint(bytes32,bytes memory)":"infinite","inverse(uint256)":"infinite","isOnCurveG1(uint256[2] memory)":"infinite","isOnCurveG2(uint256[4] memory)":"infinite","isValidSignature(uint256[2] memory)":"infinite","mapToPoint(uint256)":"infinite","sqrt(uint256)":"infinite","verifyMultiple(uint256[2] memory,uint256[4] memory[] memory,uint256[2] memory[] memory)":"infinite","verifySingle(uint256[2] memory,uint256[4] memory,uint256[2] memory)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"We use G1 points for signatures and messages, and G2 points for public keys\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Boneh\\u2013Lynn\\u2013Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"We use BLS signature aggregation to reduce the size of signature data to store on chain.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol\":\"BLS\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\nimport { ModexpInverse, ModexpSqrt } from \\\"./ModExp.sol\\\";\\nimport {\\n BNPairingPrecompileCostEstimator\\n} from \\\"./BNPairingPrecompileCostEstimator.sol\\\";\\n\\n/**\\n @title Boneh\\u2013Lynn\\u2013Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\\n @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\\n @dev We use G1 points for signatures and messages, and G2 points for public keys\\n */\\nlibrary BLS {\\n // Field order\\n // prettier-ignore\\n uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Negated genarator of G2\\n // prettier-ignore\\n uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n\\n // sqrt(-3)\\n // prettier-ignore\\n uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;\\n // (sqrt(-3) - 1) / 2\\n // prettier-ignore\\n uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;\\n\\n // prettier-ignore\\n uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;\\n // prettier-ignore\\n uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n // estimator address\\n// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;\\n\\n function verifySingle(\\n uint256[2] memory signature,\\n uint256[4] memory pubkey,\\n uint256[2] memory message\\n ) internal view returns (bool, bool) {\\n uint256[12] memory input =\\n [\\n signature[0],\\n signature[1],\\n N_G2_X1,\\n N_G2_X0,\\n N_G2_Y1,\\n N_G2_Y0,\\n message[0],\\n message[1],\\n pubkey[1],\\n pubkey[0],\\n pubkey[3],\\n pubkey[2]\\n ];\\n uint256[1] memory out;\\n uint256 precompileGasCost = gasleft();\\n// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(\\n// 2\\n// );\\n bool callSuccess;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n input,\\n 384,\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n function verifyMultiple(\\n uint256[2] memory signature,\\n uint256[4][] memory pubkeys,\\n uint256[2][] memory messages\\n ) internal view returns (bool checkResult, bool callSuccess) {\\n uint256 size = pubkeys.length;\\n require(size > 0, \\\"BLS: number of public key is zero\\\");\\n require(\\n size == messages.length,\\n \\\"BLS: number of public keys and messages must be equal\\\"\\n );\\n uint256 inputSize = (size + 1) * 6;\\n uint256[] memory input = new uint256[](inputSize);\\n input[0] = signature[0];\\n input[1] = signature[1];\\n input[2] = N_G2_X1;\\n input[3] = N_G2_X0;\\n input[4] = N_G2_Y1;\\n input[5] = N_G2_Y0;\\n for (uint256 i = 0; i < size; i++) {\\n input[i * 6 + 6] = messages[i][0];\\n input[i * 6 + 7] = messages[i][1];\\n input[i * 6 + 8] = pubkeys[i][1];\\n input[i * 6 + 9] = pubkeys[i][0];\\n input[i * 6 + 10] = pubkeys[i][3];\\n input[i * 6 + 11] = pubkeys[i][2];\\n }\\n uint256[1] memory out;\\n\\n // prettier-ignore\\n uint256 precompileGasCost = gasleft();\\n// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(\\n precompileGasCost,\\n 8,\\n add(input, 0x20),\\n mul(inputSize, 0x20),\\n out,\\n 0x20\\n )\\n }\\n if (!callSuccess) {\\n return (false, false);\\n }\\n return (out[0] != 0, true);\\n }\\n\\n /**\\n @notice Fouque-Tibouchi Hash to Curve\\n */\\n function hashToPoint(bytes32 domain, bytes memory message)\\n internal\\n view\\n returns (uint256[2] memory)\\n {\\n uint256[2] memory u = hashToField(domain, message);\\n uint256[2] memory p0 = mapToPoint(u[0]);\\n uint256[2] memory p1 = mapToPoint(u[1]);\\n uint256[4] memory bnAddInput;\\n bnAddInput[0] = p0[0];\\n bnAddInput[1] = p0[1];\\n bnAddInput[2] = p1[0];\\n bnAddInput[3] = p1[1];\\n bool success;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)\\n switch success\\n case 0 {\\n invalid()\\n }\\n }\\n require(success, \\\"BLS: bn add call failed\\\");\\n return p0;\\n }\\n\\n function mapToPoint(uint256 _x)\\n internal\\n pure\\n returns (uint256[2] memory p)\\n {\\n require(_x < N, \\\"mapToPointFT: invalid field element\\\");\\n uint256 x = _x;\\n\\n (, bool decision) = sqrt(x);\\n\\n uint256 a0 = mulmod(x, x, N);\\n a0 = addmod(a0, 4, N);\\n uint256 a1 = mulmod(x, Z0, N);\\n uint256 a2 = mulmod(a1, a0, N);\\n a2 = inverse(a2);\\n a1 = mulmod(a1, a1, N);\\n a1 = mulmod(a1, a2, N);\\n\\n // x1\\n a1 = mulmod(x, a1, N);\\n x = addmod(Z1, N - a1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n bool found;\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x2\\n x = N - addmod(x, 1, N);\\n // check curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n if (found) {\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n // x3\\n x = mulmod(a0, a0, N);\\n x = mulmod(x, x, N);\\n x = mulmod(x, a2, N);\\n x = mulmod(x, a2, N);\\n x = addmod(x, 1, N);\\n // must be on curve\\n a1 = mulmod(x, x, N);\\n a1 = mulmod(a1, x, N);\\n a1 = addmod(a1, 3, N);\\n (a1, found) = sqrt(a1);\\n require(found, \\\"BLS: bad ft mapping implementation\\\");\\n if (!decision) {\\n a1 = N - a1;\\n }\\n return [x, a1];\\n }\\n\\n function isValidSignature(uint256[2] memory signature)\\n internal\\n pure\\n returns (bool)\\n {\\n if ((signature[0] >= N) || (signature[1] >= N)) {\\n return false;\\n } else {\\n return isOnCurveG1(signature);\\n }\\n }\\n\\n function isOnCurveG1(uint256[2] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n let t2 := mulmod(t0, t0, N)\\n t2 := mulmod(t2, t0, N)\\n t2 := addmod(t2, 3, N)\\n t1 := mulmod(t1, t1, N)\\n _isOnCurve := eq(t1, t2)\\n }\\n }\\n\\n function isOnCurveG2(uint256[4] memory point)\\n internal\\n pure\\n returns (bool _isOnCurve)\\n {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n // x0, x1\\n let t0 := mload(point)\\n let t1 := mload(add(point, 32))\\n // x0 ^ 2\\n let t2 := mulmod(t0, t0, N)\\n // x1 ^ 2\\n let t3 := mulmod(t1, t1, N)\\n // 3 * x0 ^ 2\\n let t4 := add(add(t2, t2), t2)\\n // 3 * x1 ^ 2\\n let t5 := addmod(add(t3, t3), t3, N)\\n // x0 * (x0 ^ 2 - 3 * x1 ^ 2)\\n t2 := mulmod(add(t2, sub(N, t5)), t0, N)\\n // x1 * (3 * x0 ^ 2 - x1 ^ 2)\\n t3 := mulmod(add(t4, sub(N, t3)), t1, N)\\n\\n // x ^ 3 + b\\n t0 := addmod(\\n t2,\\n 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,\\n N\\n )\\n t1 := addmod(\\n t3,\\n 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,\\n N\\n )\\n\\n // y0, y1\\n t2 := mload(add(point, 64))\\n t3 := mload(add(point, 96))\\n // y ^ 2\\n t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)\\n t3 := mulmod(shl(1, t2), t3, N)\\n\\n // y ^ 2 == x ^ 3 + b\\n _isOnCurve := and(eq(t0, t4), eq(t1, t3))\\n }\\n }\\n\\n function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {\\n x = ModexpSqrt.run(xx);\\n hasRoot = mulmod(x, x, N) == xx;\\n }\\n\\n function inverse(uint256 a) internal pure returns (uint256) {\\n return ModexpInverse.run(a);\\n }\\n\\n function hashToField(bytes32 domain, bytes memory messages)\\n internal\\n pure\\n returns (uint256[2] memory)\\n {\\n bytes memory _msg = expandMsgTo96(domain, messages);\\n uint256 u0;\\n uint256 u1;\\n uint256 a0;\\n uint256 a1;\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(_msg, 24)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 48)\\n u0 := and(mload(p), MASK24)\\n a0 := addmod(mulmod(u1, T24, N), u0, N)\\n p := add(_msg, 72)\\n u1 := and(mload(p), MASK24)\\n p := add(_msg, 96)\\n u0 := and(mload(p), MASK24)\\n a1 := addmod(mulmod(u1, T24, N), u0, N)\\n }\\n return [a0, a1];\\n }\\n\\n function expandMsgTo96(bytes32 domain, bytes memory message)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>\\n uint256 t0 = message.length;\\n bytes memory msg0 = new bytes(32 + t0 + 64 + 4);\\n bytes memory out = new bytes(96);\\n // b0\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let p := add(msg0, 96)\\n for {\\n let z := 0\\n } lt(z, t0) {\\n z := add(z, 32)\\n } {\\n mstore(add(p, z), mload(add(message, add(z, 32))))\\n }\\n p := add(p, t0)\\n\\n mstore8(p, 0)\\n p := add(p, 1)\\n mstore8(p, 96)\\n p := add(p, 1)\\n mstore8(p, 0)\\n p := add(p, 1)\\n\\n mstore(p, domain)\\n p := add(p, 32)\\n mstore8(p, 32)\\n }\\n bytes32 b0 = sha256(msg0);\\n bytes32 bi;\\n t0 = 32 + 34;\\n\\n // resize intermediate message\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(msg0, t0)\\n }\\n\\n // b1\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(msg0, 32), b0)\\n mstore8(add(msg0, 64), 1)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 32), bi)\\n }\\n\\n // b2\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 2)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 64), bi)\\n }\\n\\n // b3\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let t := xor(b0, bi)\\n mstore(add(msg0, 32), t)\\n mstore8(add(msg0, 64), 3)\\n mstore(add(msg0, 65), domain)\\n mstore8(add(msg0, add(32, 65)), 32)\\n }\\n\\n bi = sha256(msg0);\\n\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(add(out, 96), bi)\\n }\\n\\n return out;\\n }\\n}\\n\",\"keccak256\":\"0x940963096c7e81c19403df6b2a29a2fc115184f81111f8708cb25b0a222d2676\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\ncontract BNPairingPrecompileCostEstimator {\\n uint256 public baseCost;\\n uint256 public perPairCost;\\n\\n // G1 Generator\\n uint256 private constant G1_X = 1;\\n uint256 private constant G1_Y = 2;\\n\\n // G2 genarator\\n // prettier-ignore\\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n // prettier-ignore\\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n\\n // G2 negated genarator y coordinates\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n\\n function run() external {\\n _run();\\n }\\n\\n function getGasCost(uint256 pairCount) external view returns (uint256) {\\n return pairCount * perPairCost + baseCost;\\n }\\n\\n function _run() internal {\\n uint256 gasCost1Pair = _gasCost1Pair();\\n uint256 gasCost2Pair = _gasCost2Pair();\\n perPairCost = gasCost2Pair - gasCost1Pair;\\n baseCost = gasCost1Pair - perPairCost;\\n }\\n\\n function _gasCost1Pair() internal view returns (uint256) {\\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, single pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: single pair call is failed\\\"\\n );\\n require(\\n out[0] == 0,\\n \\\"BNPairingPrecompileCostEstimator: single pair call result must be 0\\\"\\n );\\n return gasCost;\\n }\\n\\n function _gasCost2Pair() internal view returns (uint256) {\\n uint256[12] memory input =\\n [\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n G2_Y1,\\n G2_Y0,\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n N_G2_Y1,\\n N_G2_Y0\\n ];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, couple pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call is failed\\\"\\n );\\n require(\\n out[0] == 1,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call result must be 1\\\"\\n );\\n return gasCost;\\n }\\n}\\n\",\"keccak256\":\"0x26168469ca9fc23dd434d3ab41b547e1b46a97b497fce967b7916351fb87b66d\",\"license\":\"MIT\"},\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\n/**\\n @title Compute Inverse by Modular Exponentiation\\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\\n @dev the function body is generated with the modified addchain script\\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\\n */\\nlibrary ModexpInverse {\\n function run(uint256 t2) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n t0 := mulmod(t2, t2, n)\\n let t5 := mulmod(t0, t2, n)\\n let t1 := mulmod(t5, t0, n)\\n let t3 := mulmod(t5, t5, n)\\n let t8 := mulmod(t1, t0, n)\\n let t4 := mulmod(t3, t5, n)\\n let t6 := mulmod(t3, t1, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t4, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n }\\n }\\n}\\n\\n/**\\n @title Compute Squre Root by Modular Exponentiation\\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\\n */\\nlibrary ModexpSqrt {\\n function run(uint256 t6) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n\\n t0 := mulmod(t6, t6, n)\\n let t4 := mulmod(t0, t6, n)\\n let t2 := mulmod(t4, t0, n)\\n let t3 := mulmod(t4, t4, n)\\n let t8 := mulmod(t2, t0, n)\\n let t1 := mulmod(t3, t4, n)\\n let t5 := mulmod(t3, t2, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t1, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2f58dd24d2278125ba9dea17eb1d5404170f8b93cf097174558c68a5d50e20a7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"We use BLS signature aggregation to reduce the size of signature data to store on chain.","version":1}}},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol":{"BNPairingPrecompileCostEstimator":{"abi":[{"inputs":[],"name":"baseCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairCount","type":"uint256"}],"name":"getGasCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perPairCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"run","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b5061083a806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80634e79f8ca146100515780639382255714610076578063c04062261461007f578063ebfd94b214610089575b600080fd5b61006461005f366004610750565b610092565b60405190815260200160405180910390f35b61006460005481565b6100876100b3565b005b61006460015481565b600080546001546100a39084610798565b6100ad91906107d5565b92915050565b6100bb6100bd565b565b60006100c76100f5565b905060006100d36103c6565b90506100df82826107ed565b60018190556100ee90836107ed565b6000555050565b6000806040518060c0016040528060018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81525090506101b1610732565b6000806107d05a6101c291906107ed565b90506107d05a1161025a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a206e6f7420656e6f756768206761732c2073696e676c65207061697200000060648201526084015b60405180910390fd5b60005a905060208460c087600886fa925060005a61027890836107ed565b905083610307576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a2073696e676c6520706169722063616c6c206973206661696c6564000000006064820152608401610251565b8451156103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a2073696e676c6520706169722063616c6c20726573756c74206d757374206260648201527f6520300000000000000000000000000000000000000000000000000000000000608482015260a401610251565b9695505050505050565b60008060405180610180016040528060018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815260200160018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152509050610529610732565b6000806107d05a61053a91906107ed565b90506107d05a116105cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a206e6f7420656e6f756768206761732c20636f75706c6520706169720000006064820152608401610251565b60005a905060208461018087600886fa925060005a6105ec90836107ed565b90508361067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a20636f75706c6520706169722063616c6c206973206661696c6564000000006064820152608401610251565b84516001146103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a20636f75706c6520706169722063616c6c20726573756c74206d757374206260648201527f6520310000000000000000000000000000000000000000000000000000000000608482015260a401610251565b60405180602001604052806001906020820280368337509192915050565b60006020828403121561076257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156107d0576107d0610769565b500290565b600082198211156107e8576107e8610769565b500190565b6000828210156107ff576107ff610769565b50039056fea264697066735822122064be258670b551b5ac0088a6bfe791b5237cb0da8f2b63f78c9d7e9acfb7160f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x83A DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4E79F8CA EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x93822557 EQ PUSH2 0x76 JUMPI DUP1 PUSH4 0xC0406226 EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0xEBFD94B2 EQ PUSH2 0x89 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x750 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x64 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x87 PUSH2 0xB3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 SLOAD PUSH2 0xA3 SWAP1 DUP5 PUSH2 0x798 JUMP JUMPDEST PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x7D5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBB PUSH2 0xBD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC7 PUSH2 0xF5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD3 PUSH2 0x3C6 JUMP JUMPDEST SWAP1 POP PUSH2 0xDF DUP3 DUP3 PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH2 0xEE SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x0 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA DUP2 MSTORE POP SWAP1 POP PUSH2 0x1B1 PUSH2 0x732 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7D0 GAS PUSH2 0x1C2 SWAP2 SWAP1 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP PUSH2 0x7D0 GAS GT PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A206E6F7420656E6F756768206761732C2073696E676C652070616972000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP5 PUSH1 0xC0 DUP8 PUSH1 0x8 DUP7 STATICCALL SWAP3 POP PUSH1 0x0 GAS PUSH2 0x278 SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP DUP4 PUSH2 0x307 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A2073696E676C6520706169722063616C6C206973206661696C656400000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST DUP5 MLOAD ISZERO PUSH2 0x3BC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x43 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A2073696E676C6520706169722063616C6C20726573756C74206D7573742062 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6520300000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x251 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x275DC4A288D1AFB3CBB1AC09187524C7DB36395DF7BE3B99E673B13A075A65EC DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1D9BEFCD05A5323E6DA4D435F3B617CDB3AF83285C2DF711EF39C01571827F9D DUP2 MSTORE POP SWAP1 POP PUSH2 0x529 PUSH2 0x732 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7D0 GAS PUSH2 0x53A SWAP2 SWAP1 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP PUSH2 0x7D0 GAS GT PUSH2 0x5CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A206E6F7420656E6F756768206761732C20636F75706C652070616972000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP5 PUSH2 0x180 DUP8 PUSH1 0x8 DUP7 STATICCALL SWAP3 POP PUSH1 0x0 GAS PUSH2 0x5EC SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP DUP4 PUSH2 0x67B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A20636F75706C6520706169722063616C6C206973206661696C656400000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 EQ PUSH2 0x3BC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x43 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A20636F75706C6520706169722063616C6C20726573756C74206D7573742062 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6520310000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x251 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x762 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x7D0 JUMPI PUSH2 0x7D0 PUSH2 0x769 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x7E8 JUMPI PUSH2 0x7E8 PUSH2 0x769 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x7FF JUMPI PUSH2 0x7FF PUSH2 0x769 JUMP JUMPDEST POP SUB SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH5 0xBE258670B5 MLOAD 0xB5 0xAC STOP DUP9 0xA6 0xBF 0xE7 SWAP2 0xB5 0x23 PUSH29 0xB0DA8F2B63F78C9D7E9ACFB7160F64736F6C634300080F003300000000 ","sourceMap":"59:3632:84:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_gasCost1Pair_17708":{"entryPoint":245,"id":17708,"parameterSlots":0,"returnSlots":1},"@_gasCost2Pair_17788":{"entryPoint":966,"id":17788,"parameterSlots":0,"returnSlots":1},"@_run_17634":{"entryPoint":189,"id":17634,"parameterSlots":0,"returnSlots":0},"@baseCost_17561":{"entryPoint":null,"id":17561,"parameterSlots":0,"returnSlots":0},"@getGasCost_17608":{"entryPoint":146,"id":17608,"parameterSlots":1,"returnSlots":1},"@perPairCost_17563":{"entryPoint":null,"id":17563,"parameterSlots":0,"returnSlots":0},"@run_17594":{"entryPoint":179,"id":17594,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_uint256":{"entryPoint":1872,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_173e5ca4c3200023e23041b88d19db27834ce9f8e0a7cd140922be2f2e54b12e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1f3065863a8b9424beb3ec0b3ecd0a945047bc7e716d77385c40e3c20e33b381__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2d256cff32a852cfe25dd7dbb2b7ebdbdd3f8e7955e24acebb45cde7de54594f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7b1ded31a4535154d540731bdd2b51818b26e334329c21e3847b411372fa6c31__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8f05d73aed2f16f10dd0a982ea471304089f33ea44df029c2e424f8a5934dbe0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e440e0b45627bd97e0b614d4dddcf7969a84f36912be7d05ccd79af72e647ba2__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":2005,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":1944,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":2029,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x11":{"entryPoint":1897,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:3922:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"84:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"130:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"139:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"142:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"132:6:111"},"nodeType":"YulFunctionCall","src":"132:12:111"},"nodeType":"YulExpressionStatement","src":"132:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"105:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"114:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"101:3:111"},"nodeType":"YulFunctionCall","src":"101:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"126:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"97:3:111"},"nodeType":"YulFunctionCall","src":"97:32:111"},"nodeType":"YulIf","src":"94:52:111"},{"nodeType":"YulAssignment","src":"155:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"178:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"165:12:111"},"nodeType":"YulFunctionCall","src":"165:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"155:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"61:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"73:6:111","type":""}],"src":"14:180:111"},{"body":{"nodeType":"YulBlock","src":"300:76:111","statements":[{"nodeType":"YulAssignment","src":"310:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"322:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"333:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"318:3:111"},"nodeType":"YulFunctionCall","src":"318:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"310:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"352:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"363:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"345:6:111"},"nodeType":"YulFunctionCall","src":"345:25:111"},"nodeType":"YulExpressionStatement","src":"345:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"269:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"280:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"291:4:111","type":""}],"src":"199:177:111"},{"body":{"nodeType":"YulBlock","src":"413:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"430:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"433:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"423:6:111"},"nodeType":"YulFunctionCall","src":"423:88:111"},"nodeType":"YulExpressionStatement","src":"423:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"527:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"530:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"520:6:111"},"nodeType":"YulFunctionCall","src":"520:15:111"},"nodeType":"YulExpressionStatement","src":"520:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"551:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"554:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"544:6:111"},"nodeType":"YulFunctionCall","src":"544:15:111"},"nodeType":"YulExpressionStatement","src":"544:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"381:184:111"},{"body":{"nodeType":"YulBlock","src":"622:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"741:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"743:16:111"},"nodeType":"YulFunctionCall","src":"743:18:111"},"nodeType":"YulExpressionStatement","src":"743:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"653:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"646:6:111"},"nodeType":"YulFunctionCall","src":"646:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"639:6:111"},"nodeType":"YulFunctionCall","src":"639:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"661:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"668:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"736:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"664:3:111"},"nodeType":"YulFunctionCall","src":"664:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"658:2:111"},"nodeType":"YulFunctionCall","src":"658:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"635:3:111"},"nodeType":"YulFunctionCall","src":"635:105:111"},"nodeType":"YulIf","src":"632:131:111"},{"nodeType":"YulAssignment","src":"772:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"787:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"790:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"783:3:111"},"nodeType":"YulFunctionCall","src":"783:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"772:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"601:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"604:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"610:7:111","type":""}],"src":"570:228:111"},{"body":{"nodeType":"YulBlock","src":"851:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"878:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"880:16:111"},"nodeType":"YulFunctionCall","src":"880:18:111"},"nodeType":"YulExpressionStatement","src":"880:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"867:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"874:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"870:3:111"},"nodeType":"YulFunctionCall","src":"870:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"864:2:111"},"nodeType":"YulFunctionCall","src":"864:13:111"},"nodeType":"YulIf","src":"861:39:111"},{"nodeType":"YulAssignment","src":"909:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"920:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"923:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"916:3:111"},"nodeType":"YulFunctionCall","src":"916:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"909:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"834:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"837:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"843:3:111","type":""}],"src":"803:128:111"},{"body":{"nodeType":"YulBlock","src":"985:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"1007:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"1009:16:111"},"nodeType":"YulFunctionCall","src":"1009:18:111"},"nodeType":"YulExpressionStatement","src":"1009:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1001:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"1004:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"998:2:111"},"nodeType":"YulFunctionCall","src":"998:8:111"},"nodeType":"YulIf","src":"995:34:111"},{"nodeType":"YulAssignment","src":"1038:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1050:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"1053:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1046:3:111"},"nodeType":"YulFunctionCall","src":"1046:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"1038:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"967:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"970:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"976:4:111","type":""}],"src":"936:125:111"},{"body":{"nodeType":"YulBlock","src":"1240:251:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1257:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1268:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1250:6:111"},"nodeType":"YulFunctionCall","src":"1250:21:111"},"nodeType":"YulExpressionStatement","src":"1250:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1291:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1302:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1287:3:111"},"nodeType":"YulFunctionCall","src":"1287:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"1307:2:111","type":"","value":"61"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1280:6:111"},"nodeType":"YulFunctionCall","src":"1280:30:111"},"nodeType":"YulExpressionStatement","src":"1280:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1330:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1341:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1326:3:111"},"nodeType":"YulFunctionCall","src":"1326:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"1346:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1319:6:111"},"nodeType":"YulFunctionCall","src":"1319:62:111"},"nodeType":"YulExpressionStatement","src":"1319:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1412:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1397:3:111"},"nodeType":"YulFunctionCall","src":"1397:18:111"},{"hexValue":"3a206e6f7420656e6f756768206761732c2073696e676c652070616972","kind":"string","nodeType":"YulLiteral","src":"1417:31:111","type":"","value":": not enough gas, single pair"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1390:6:111"},"nodeType":"YulFunctionCall","src":"1390:59:111"},"nodeType":"YulExpressionStatement","src":"1390:59:111"},{"nodeType":"YulAssignment","src":"1458:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1481:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1466:3:111"},"nodeType":"YulFunctionCall","src":"1466:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1458:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2d256cff32a852cfe25dd7dbb2b7ebdbdd3f8e7955e24acebb45cde7de54594f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1217:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1231:4:111","type":""}],"src":"1066:425:111"},{"body":{"nodeType":"YulBlock","src":"1670:250:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1687:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1698:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1680:6:111"},"nodeType":"YulFunctionCall","src":"1680:21:111"},"nodeType":"YulExpressionStatement","src":"1680:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1721:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1732:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1717:3:111"},"nodeType":"YulFunctionCall","src":"1717:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"1737:2:111","type":"","value":"60"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1710:6:111"},"nodeType":"YulFunctionCall","src":"1710:30:111"},"nodeType":"YulExpressionStatement","src":"1710:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1771:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1756:3:111"},"nodeType":"YulFunctionCall","src":"1756:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"1776:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1749:6:111"},"nodeType":"YulFunctionCall","src":"1749:62:111"},"nodeType":"YulExpressionStatement","src":"1749:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1831:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1842:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1827:3:111"},"nodeType":"YulFunctionCall","src":"1827:18:111"},{"hexValue":"3a2073696e676c6520706169722063616c6c206973206661696c6564","kind":"string","nodeType":"YulLiteral","src":"1847:30:111","type":"","value":": single pair call is failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1820:6:111"},"nodeType":"YulFunctionCall","src":"1820:58:111"},"nodeType":"YulExpressionStatement","src":"1820:58:111"},{"nodeType":"YulAssignment","src":"1887:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1899:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1910:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1895:3:111"},"nodeType":"YulFunctionCall","src":"1895:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1887:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8f05d73aed2f16f10dd0a982ea471304089f33ea44df029c2e424f8a5934dbe0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1647:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1661:4:111","type":""}],"src":"1496:424:111"},{"body":{"nodeType":"YulBlock","src":"1957:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1974:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1977:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1967:6:111"},"nodeType":"YulFunctionCall","src":"1967:88:111"},"nodeType":"YulExpressionStatement","src":"1967:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2071:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2074:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2064:6:111"},"nodeType":"YulFunctionCall","src":"2064:15:111"},"nodeType":"YulExpressionStatement","src":"2064:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2095:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2098:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2088:6:111"},"nodeType":"YulFunctionCall","src":"2088:15:111"},"nodeType":"YulExpressionStatement","src":"2088:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"1925:184:111"},{"body":{"nodeType":"YulBlock","src":"2288:297:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2305:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2316:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2298:6:111"},"nodeType":"YulFunctionCall","src":"2298:21:111"},"nodeType":"YulExpressionStatement","src":"2298:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2339:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2350:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2335:3:111"},"nodeType":"YulFunctionCall","src":"2335:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2355:2:111","type":"","value":"67"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2328:6:111"},"nodeType":"YulFunctionCall","src":"2328:30:111"},"nodeType":"YulExpressionStatement","src":"2328:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2378:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2389:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2374:3:111"},"nodeType":"YulFunctionCall","src":"2374:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"2394:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2367:6:111"},"nodeType":"YulFunctionCall","src":"2367:62:111"},"nodeType":"YulExpressionStatement","src":"2367:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2449:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2460:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2445:3:111"},"nodeType":"YulFunctionCall","src":"2445:18:111"},{"hexValue":"3a2073696e676c6520706169722063616c6c20726573756c74206d7573742062","kind":"string","nodeType":"YulLiteral","src":"2465:34:111","type":"","value":": single pair call result must b"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2438:6:111"},"nodeType":"YulFunctionCall","src":"2438:62:111"},"nodeType":"YulExpressionStatement","src":"2438:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2520:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2531:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2516:3:111"},"nodeType":"YulFunctionCall","src":"2516:19:111"},{"hexValue":"652030","kind":"string","nodeType":"YulLiteral","src":"2537:5:111","type":"","value":"e 0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2509:6:111"},"nodeType":"YulFunctionCall","src":"2509:34:111"},"nodeType":"YulExpressionStatement","src":"2509:34:111"},{"nodeType":"YulAssignment","src":"2552:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2564:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2575:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2560:3:111"},"nodeType":"YulFunctionCall","src":"2560:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2552:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1f3065863a8b9424beb3ec0b3ecd0a945047bc7e716d77385c40e3c20e33b381__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2265:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2279:4:111","type":""}],"src":"2114:471:111"},{"body":{"nodeType":"YulBlock","src":"2764:251:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2781:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2792:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2774:6:111"},"nodeType":"YulFunctionCall","src":"2774:21:111"},"nodeType":"YulExpressionStatement","src":"2774:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2815:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2826:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2811:3:111"},"nodeType":"YulFunctionCall","src":"2811:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2831:2:111","type":"","value":"61"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2804:6:111"},"nodeType":"YulFunctionCall","src":"2804:30:111"},"nodeType":"YulExpressionStatement","src":"2804:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2865:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2850:3:111"},"nodeType":"YulFunctionCall","src":"2850:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"2870:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2843:6:111"},"nodeType":"YulFunctionCall","src":"2843:62:111"},"nodeType":"YulExpressionStatement","src":"2843:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2925:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2936:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2921:3:111"},"nodeType":"YulFunctionCall","src":"2921:18:111"},{"hexValue":"3a206e6f7420656e6f756768206761732c20636f75706c652070616972","kind":"string","nodeType":"YulLiteral","src":"2941:31:111","type":"","value":": not enough gas, couple pair"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2914:6:111"},"nodeType":"YulFunctionCall","src":"2914:59:111"},"nodeType":"YulExpressionStatement","src":"2914:59:111"},{"nodeType":"YulAssignment","src":"2982:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3005:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2990:3:111"},"nodeType":"YulFunctionCall","src":"2990:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2982:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_173e5ca4c3200023e23041b88d19db27834ce9f8e0a7cd140922be2f2e54b12e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2741:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2755:4:111","type":""}],"src":"2590:425:111"},{"body":{"nodeType":"YulBlock","src":"3194:250:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3211:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3222:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3204:6:111"},"nodeType":"YulFunctionCall","src":"3204:21:111"},"nodeType":"YulExpressionStatement","src":"3204:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3245:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3256:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3241:3:111"},"nodeType":"YulFunctionCall","src":"3241:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3261:2:111","type":"","value":"60"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3234:6:111"},"nodeType":"YulFunctionCall","src":"3234:30:111"},"nodeType":"YulExpressionStatement","src":"3234:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3284:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3295:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3280:3:111"},"nodeType":"YulFunctionCall","src":"3280:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"3300:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3273:6:111"},"nodeType":"YulFunctionCall","src":"3273:62:111"},"nodeType":"YulExpressionStatement","src":"3273:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3355:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3366:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3351:3:111"},"nodeType":"YulFunctionCall","src":"3351:18:111"},{"hexValue":"3a20636f75706c6520706169722063616c6c206973206661696c6564","kind":"string","nodeType":"YulLiteral","src":"3371:30:111","type":"","value":": couple pair call is failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3344:6:111"},"nodeType":"YulFunctionCall","src":"3344:58:111"},"nodeType":"YulExpressionStatement","src":"3344:58:111"},{"nodeType":"YulAssignment","src":"3411:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3423:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3434:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3419:3:111"},"nodeType":"YulFunctionCall","src":"3419:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3411:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e440e0b45627bd97e0b614d4dddcf7969a84f36912be7d05ccd79af72e647ba2__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3171:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3185:4:111","type":""}],"src":"3020:424:111"},{"body":{"nodeType":"YulBlock","src":"3623:297:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3640:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3651:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3633:6:111"},"nodeType":"YulFunctionCall","src":"3633:21:111"},"nodeType":"YulExpressionStatement","src":"3633:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3674:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3685:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3670:3:111"},"nodeType":"YulFunctionCall","src":"3670:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3690:2:111","type":"","value":"67"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3663:6:111"},"nodeType":"YulFunctionCall","src":"3663:30:111"},"nodeType":"YulExpressionStatement","src":"3663:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3724:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3709:3:111"},"nodeType":"YulFunctionCall","src":"3709:18:111"},{"hexValue":"424e50616972696e67507265636f6d70696c65436f7374457374696d61746f72","kind":"string","nodeType":"YulLiteral","src":"3729:34:111","type":"","value":"BNPairingPrecompileCostEstimator"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3702:6:111"},"nodeType":"YulFunctionCall","src":"3702:62:111"},"nodeType":"YulExpressionStatement","src":"3702:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3784:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3795:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3780:3:111"},"nodeType":"YulFunctionCall","src":"3780:18:111"},{"hexValue":"3a20636f75706c6520706169722063616c6c20726573756c74206d7573742062","kind":"string","nodeType":"YulLiteral","src":"3800:34:111","type":"","value":": couple pair call result must b"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3773:6:111"},"nodeType":"YulFunctionCall","src":"3773:62:111"},"nodeType":"YulExpressionStatement","src":"3773:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3855:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3866:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3851:3:111"},"nodeType":"YulFunctionCall","src":"3851:19:111"},{"hexValue":"652031","kind":"string","nodeType":"YulLiteral","src":"3872:5:111","type":"","value":"e 1"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3844:6:111"},"nodeType":"YulFunctionCall","src":"3844:34:111"},"nodeType":"YulExpressionStatement","src":"3844:34:111"},{"nodeType":"YulAssignment","src":"3887:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3899:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3910:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3895:3:111"},"nodeType":"YulFunctionCall","src":"3895:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3887:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7b1ded31a4535154d540731bdd2b51818b26e334329c21e3847b411372fa6c31__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3600:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3614:4:111","type":""}],"src":"3449:471:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_2d256cff32a852cfe25dd7dbb2b7ebdbdd3f8e7955e24acebb45cde7de54594f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 61)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": not enough gas, single pair\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_8f05d73aed2f16f10dd0a982ea471304089f33ea44df029c2e424f8a5934dbe0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 60)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": single pair call is failed\")\n tail := add(headStart, 128)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_1f3065863a8b9424beb3ec0b3ecd0a945047bc7e716d77385c40e3c20e33b381__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 67)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": single pair call result must b\")\n mstore(add(headStart, 128), \"e 0\")\n tail := add(headStart, 160)\n }\n function abi_encode_tuple_t_stringliteral_173e5ca4c3200023e23041b88d19db27834ce9f8e0a7cd140922be2f2e54b12e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 61)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": not enough gas, couple pair\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_e440e0b45627bd97e0b614d4dddcf7969a84f36912be7d05ccd79af72e647ba2__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 60)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": couple pair call is failed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_7b1ded31a4535154d540731bdd2b51818b26e334329c21e3847b411372fa6c31__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 67)\n mstore(add(headStart, 64), \"BNPairingPrecompileCostEstimator\")\n mstore(add(headStart, 96), \": couple pair call result must b\")\n mstore(add(headStart, 128), \"e 1\")\n tail := add(headStart, 160)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061004c5760003560e01c80634e79f8ca146100515780639382255714610076578063c04062261461007f578063ebfd94b214610089575b600080fd5b61006461005f366004610750565b610092565b60405190815260200160405180910390f35b61006460005481565b6100876100b3565b005b61006460015481565b600080546001546100a39084610798565b6100ad91906107d5565b92915050565b6100bb6100bd565b565b60006100c76100f5565b905060006100d36103c6565b90506100df82826107ed565b60018190556100ee90836107ed565b6000555050565b6000806040518060c0016040528060018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81525090506101b1610732565b6000806107d05a6101c291906107ed565b90506107d05a1161025a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a206e6f7420656e6f756768206761732c2073696e676c65207061697200000060648201526084015b60405180910390fd5b60005a905060208460c087600886fa925060005a61027890836107ed565b905083610307576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a2073696e676c6520706169722063616c6c206973206661696c6564000000006064820152608401610251565b8451156103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a2073696e676c6520706169722063616c6c20726573756c74206d757374206260648201527f6520300000000000000000000000000000000000000000000000000000000000608482015260a401610251565b9695505050505050565b60008060405180610180016040528060018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815260200160018152602001600281526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152509050610529610732565b6000806107d05a61053a91906107ed565b90506107d05a116105cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a206e6f7420656e6f756768206761732c20636f75706c6520706169720000006064820152608401610251565b60005a905060208461018087600886fa925060005a6105ec90836107ed565b90508361067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a20636f75706c6520706169722063616c6c206973206661696c6564000000006064820152608401610251565b84516001146103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f424e50616972696e67507265636f6d70696c65436f7374457374696d61746f7260448201527f3a20636f75706c6520706169722063616c6c20726573756c74206d757374206260648201527f6520310000000000000000000000000000000000000000000000000000000000608482015260a401610251565b60405180602001604052806001906020820280368337509192915050565b60006020828403121561076257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156107d0576107d0610769565b500290565b600082198211156107e8576107e8610769565b500190565b6000828210156107ff576107ff610769565b50039056fea264697066735822122064be258670b551b5ac0088a6bfe791b5237cb0da8f2b63f78c9d7e9acfb7160f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4E79F8CA EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x93822557 EQ PUSH2 0x76 JUMPI DUP1 PUSH4 0xC0406226 EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0xEBFD94B2 EQ PUSH2 0x89 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x750 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x64 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x87 PUSH2 0xB3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 SLOAD PUSH2 0xA3 SWAP1 DUP5 PUSH2 0x798 JUMP JUMPDEST PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x7D5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBB PUSH2 0xBD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC7 PUSH2 0xF5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD3 PUSH2 0x3C6 JUMP JUMPDEST SWAP1 POP PUSH2 0xDF DUP3 DUP3 PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH2 0xEE SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x0 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA DUP2 MSTORE POP SWAP1 POP PUSH2 0x1B1 PUSH2 0x732 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7D0 GAS PUSH2 0x1C2 SWAP2 SWAP1 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP PUSH2 0x7D0 GAS GT PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A206E6F7420656E6F756768206761732C2073696E676C652070616972000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP5 PUSH1 0xC0 DUP8 PUSH1 0x8 DUP7 STATICCALL SWAP3 POP PUSH1 0x0 GAS PUSH2 0x278 SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP DUP4 PUSH2 0x307 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A2073696E676C6520706169722063616C6C206973206661696C656400000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST DUP5 MLOAD ISZERO PUSH2 0x3BC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x43 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A2073696E676C6520706169722063616C6C20726573756C74206D7573742062 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6520300000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x251 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x275DC4A288D1AFB3CBB1AC09187524C7DB36395DF7BE3B99E673B13A075A65EC DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1D9BEFCD05A5323E6DA4D435F3B617CDB3AF83285C2DF711EF39C01571827F9D DUP2 MSTORE POP SWAP1 POP PUSH2 0x529 PUSH2 0x732 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7D0 GAS PUSH2 0x53A SWAP2 SWAP1 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP PUSH2 0x7D0 GAS GT PUSH2 0x5CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A206E6F7420656E6F756768206761732C20636F75706C652070616972000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x20 DUP5 PUSH2 0x180 DUP8 PUSH1 0x8 DUP7 STATICCALL SWAP3 POP PUSH1 0x0 GAS PUSH2 0x5EC SWAP1 DUP4 PUSH2 0x7ED JUMP JUMPDEST SWAP1 POP DUP4 PUSH2 0x67B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x3C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A20636F75706C6520706169722063616C6C206973206661696C656400000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x251 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 EQ PUSH2 0x3BC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x43 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x424E50616972696E67507265636F6D70696C65436F7374457374696D61746F72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x3A20636F75706C6520706169722063616C6C20726573756C74206D7573742062 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x6520310000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x251 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x762 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x7D0 JUMPI PUSH2 0x7D0 PUSH2 0x769 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x7E8 JUMPI PUSH2 0x7E8 PUSH2 0x769 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x7FF JUMPI PUSH2 0x7FF PUSH2 0x769 JUMP JUMPDEST POP SUB SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH5 0xBE258670B5 MLOAD 0xB5 0xAC STOP DUP9 0xA6 0xBF 0xE7 SWAP2 0xB5 0x23 PUSH29 0xB0DA8F2B63F78C9D7E9ACFB7160F64736F6C634300080F003300000000 ","sourceMap":"59:3632:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1221:129;;;;;;:::i;:::-;;:::i;:::-;;;345:25:111;;;333:2;318:18;1221:129:84;;;;;;;107:23;;;;;;1168:47;;;:::i;:::-;;136:26;;;;;;1221:129;1283:7;1335:8;;1321:11;;1309:23;;:9;:23;:::i;:::-;:34;;;;:::i;:::-;1302:41;1221:129;-1:-1:-1;;1221:129:84:o;1168:47::-;1202:6;:4;:6::i;:::-;1168:47::o;1356:226::-;1391:20;1414:15;:13;:15::i;:::-;1391:38;;1439:20;1462:15;:13;:15::i;:::-;1439:38;-1:-1:-1;1501:27:84;1516:12;1439:38;1501:27;:::i;:::-;1487:11;:41;;;1549:26;;:12;:26;:::i;:::-;1538:8;:37;-1:-1:-1;;1356:226:84:o;1588:916::-;1636:7;1655:23;:66;;;;;;;;221:1;1655:66;;;;260:1;1655:66;;;;483:77;1655:66;;;;344:77;1655:66;;;;760:76;1655:66;;;;622:76;1655:66;;;;;1731:21;;:::i;:::-;1762:16;1788:19;1822:4;1810:9;:16;;;;:::i;:::-;1788:38;;1869:4;1857:9;:16;1836:124;;;;;;;1268:2:111;1836:124:84;;;1250:21:111;1307:2;1287:18;;;1280:30;1346:34;1326:18;;;1319:62;1417:31;1397:18;;;1390:59;1466:19;;1836:124:84;;;;;;;;;1970:13;1986:9;1970:25;;2151:4;2146:3;2141;2134:5;2131:1;2118:11;2107:49;2092:64;;2175:15;2201:9;2193:17;;:5;:17;:::i;:::-;2175:35;;2241:11;2220:118;;;;;;;1698:2:111;2220:118:84;;;1680:21:111;1737:2;1717:18;;;1710:30;1776:34;1756:18;;;1749:62;1847:30;1827:18;;;1820:58;1895:19;;2220:118:84;1496:424:111;2220:118:84;2369:6;;:11;2348:125;;;;;;;2316:2:111;2348:125:84;;;2298:21:111;2355:2;2335:18;;;2328:30;2394:34;2374:18;;;2367:62;2465:34;2445:18;;;2438:62;2537:5;2516:19;;;2509:34;2560:19;;2348:125:84;2114:471:111;2348:125:84;2490:7;1588:916;-1:-1:-1;;;;;;1588:916:84:o;2510:1179::-;2558:7;2577:24;:329;;;;;;;;221:1;2577:329;;;;260:1;2577:329;;;;483:77;2577:329;;;;344:77;2577:329;;;;760:76;2577:329;;;;622:76;2577:329;;;;221:1;2577:329;;;;260:1;2577:329;;;;483:77;2577:329;;;;344:77;2577:329;;;;1084:77;2577:329;;;;943:77;2577:329;;;;;2916:21;;:::i;:::-;2947:16;2973:19;3007:4;2995:9;:16;;;;:::i;:::-;2973:38;;3054:4;3042:9;:16;3021:124;;;;;;;2792:2:111;3021:124:84;;;2774:21:111;2831:2;2811:18;;;2804:30;2870:34;2850:18;;;2843:62;2941:31;2921:18;;;2914:59;2990:19;;3021:124:84;2590:425:111;3021:124:84;3155:13;3171:9;3155:25;;3336:4;3331:3;3326;3319:5;3316:1;3303:11;3292:49;3277:64;;3360:15;3386:9;3378:17;;:5;:17;:::i;:::-;3360:35;;3426:11;3405:118;;;;;;;3222:2:111;3405:118:84;;;3204:21:111;3261:2;3241:18;;;3234:30;3300:34;3280:18;;;3273:62;3371:30;3351:18;;;3344:58;3419:19;;3405:118:84;3020:424:111;3405:118:84;3554:6;;3564:1;3554:11;3533:125;;;;;;;3651:2:111;3533:125:84;;;3633:21:111;3690:2;3670:18;;;3663:30;3729:34;3709:18;;;3702:62;3800:34;3780:18;;;3773:62;3872:5;3851:19;;;3844:34;3895:19;;3533:125:84;3449:471:111;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:111:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:111;;14:180;-1:-1:-1;14:180:111:o;381:184::-;433:77;430:1;423:88;530:4;527:1;520:15;554:4;551:1;544:15;570:228;610:7;736:1;668:66;664:74;661:1;658:81;653:1;646:9;639:17;635:105;632:131;;;743:18;;:::i;:::-;-1:-1:-1;783:9:111;;570:228::o;803:128::-;843:3;874:1;870:6;867:1;864:13;861:39;;;880:18;;:::i;:::-;-1:-1:-1;916:9:111;;803:128::o;936:125::-;976:4;1004:1;1001;998:8;995:34;;;1009:18;;:::i;:::-;-1:-1:-1;1046:9:111;;936:125::o"},"gasEstimates":{"creation":{"codeDepositCost":"421200","executionCost":"455","totalCost":"421655"},"external":{"baseCost()":"2283","getGasCost(uint256)":"4622","perPairCost()":"2327","run()":"infinite"},"internal":{"_gasCost1Pair()":"infinite","_gasCost2Pair()":"infinite","_run()":"infinite"}},"methodIdentifiers":{"baseCost()":"93822557","getGasCost(uint256)":"4e79f8ca","perPairCost()":"ebfd94b2","run()":"c0406226"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"baseCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pairCount\",\"type\":\"uint256\"}],\"name\":\"getGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"perPairCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol\":\"BNPairingPrecompileCostEstimator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\ncontract BNPairingPrecompileCostEstimator {\\n uint256 public baseCost;\\n uint256 public perPairCost;\\n\\n // G1 Generator\\n uint256 private constant G1_X = 1;\\n uint256 private constant G1_Y = 2;\\n\\n // G2 genarator\\n // prettier-ignore\\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n // prettier-ignore\\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n // prettier-ignore\\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n // prettier-ignore\\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n\\n // G2 negated genarator y coordinates\\n // prettier-ignore\\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\\n // prettier-ignore\\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\\n\\n function run() external {\\n _run();\\n }\\n\\n function getGasCost(uint256 pairCount) external view returns (uint256) {\\n return pairCount * perPairCost + baseCost;\\n }\\n\\n function _run() internal {\\n uint256 gasCost1Pair = _gasCost1Pair();\\n uint256 gasCost2Pair = _gasCost2Pair();\\n perPairCost = gasCost2Pair - gasCost1Pair;\\n baseCost = gasCost1Pair - perPairCost;\\n }\\n\\n function _gasCost1Pair() internal view returns (uint256) {\\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, single pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: single pair call is failed\\\"\\n );\\n require(\\n out[0] == 0,\\n \\\"BNPairingPrecompileCostEstimator: single pair call result must be 0\\\"\\n );\\n return gasCost;\\n }\\n\\n function _gasCost2Pair() internal view returns (uint256) {\\n uint256[12] memory input =\\n [\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n G2_Y1,\\n G2_Y0,\\n G1_X,\\n G1_Y,\\n G2_X1,\\n G2_X0,\\n N_G2_Y1,\\n N_G2_Y0\\n ];\\n uint256[1] memory out;\\n bool callSuccess;\\n uint256 suppliedGas = gasleft() - 2000;\\n require(\\n gasleft() > 2000,\\n \\\"BNPairingPrecompileCostEstimator: not enough gas, couple pair\\\"\\n );\\n uint256 gasT0 = gasleft();\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\\n }\\n uint256 gasCost = gasT0 - gasleft();\\n require(\\n callSuccess,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call is failed\\\"\\n );\\n require(\\n out[0] == 1,\\n \\\"BNPairingPrecompileCostEstimator: couple pair call result must be 1\\\"\\n );\\n return gasCost;\\n }\\n}\\n\",\"keccak256\":\"0x26168469ca9fc23dd434d3ab41b547e1b46a97b497fce967b7916351fb87b66d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":17561,"contract":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol:BNPairingPrecompileCostEstimator","label":"baseCost","offset":0,"slot":"0","type":"t_uint256"},{"astId":17563,"contract":"contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol:BNPairingPrecompileCostEstimator","label":"perPairCost","offset":0,"slot":"1","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol":{"ModexpInverse":{"abi":[],"devdoc":{"details":"the function body is generated with the modified addchain script see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f","kind":"dev","methods":{},"title":"Compute Inverse by Modular Exponentiation","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220697f957b800002d1a98536f2df5acbb9d298b1b920633d247b743eb3787a39f764736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH10 0x7F957B800002D1A98536 CALLCODE 0xDF GAS 0xCB 0xB9 0xD2 SWAP9 0xB1 0xB9 KECCAK256 PUSH4 0x3D247B74 RETURNDATACOPY 0xB3 PUSH25 0x7A39F764736F6C634300080F00330000000000000000000000 ","sourceMap":"529:11422:85:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;529:11422:85;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220697f957b800002d1a98536f2df5acbb9d298b1b920633d247b743eb3787a39f764736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH10 0x7F957B800002D1A98536 CALLCODE 0xDF GAS 0xCB 0xB9 0xD2 SWAP9 0xB1 0xB9 KECCAK256 PUSH4 0x3D247B74 RETURNDATACOPY 0xB3 PUSH25 0x7A39F764736F6C634300080F00330000000000000000000000 ","sourceMap":"529:11422:85:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"run(uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"the function body is generated with the modified addchain script see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Compute Inverse by Modular Exponentiation\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Compute $input^(N - 2) mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":\"ModexpInverse\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\n/**\\n @title Compute Inverse by Modular Exponentiation\\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\\n @dev the function body is generated with the modified addchain script\\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\\n */\\nlibrary ModexpInverse {\\n function run(uint256 t2) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n t0 := mulmod(t2, t2, n)\\n let t5 := mulmod(t0, t2, n)\\n let t1 := mulmod(t5, t0, n)\\n let t3 := mulmod(t5, t5, n)\\n let t8 := mulmod(t1, t0, n)\\n let t4 := mulmod(t3, t5, n)\\n let t6 := mulmod(t3, t1, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t4, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n }\\n }\\n}\\n\\n/**\\n @title Compute Squre Root by Modular Exponentiation\\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\\n */\\nlibrary ModexpSqrt {\\n function run(uint256 t6) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n\\n t0 := mulmod(t6, t6, n)\\n let t4 := mulmod(t0, t6, n)\\n let t2 := mulmod(t4, t0, n)\\n let t3 := mulmod(t4, t4, n)\\n let t8 := mulmod(t2, t0, n)\\n let t1 := mulmod(t3, t4, n)\\n let t5 := mulmod(t3, t2, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t1, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2f58dd24d2278125ba9dea17eb1d5404170f8b93cf097174558c68a5d50e20a7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Compute $input^(N - 2) mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45","version":1}},"ModexpSqrt":{"abi":[],"devdoc":{"kind":"dev","methods":{},"title":"Compute Squre Root by Modular Exponentiation","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209a8cbae26ca60e1ad78ac73a0f543c7e6b9038c32bd75b544061c956dfafbf8064736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 DUP13 0xBA 0xE2 PUSH13 0xA60E1AD78AC73A0F543C7E6B90 CODESIZE 0xC3 0x2B 0xD7 JUMPDEST SLOAD BLOCKHASH PUSH2 0xC956 0xDF 0xAF 0xBF DUP1 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"12275:11312:85:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;12275:11312:85;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209a8cbae26ca60e1ad78ac73a0f543c7e6b9038c32bd75b544061c956dfafbf8064736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 DUP13 0xBA 0xE2 PUSH13 0xA60E1AD78AC73A0F543C7E6B90 CODESIZE 0xC3 0x2B 0xD7 JUMPDEST SLOAD BLOCKHASH PUSH2 0xC956 0xDF 0xAF 0xBF DUP1 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"12275:11312:85:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"run(uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Compute Squre Root by Modular Exponentiation\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":\"ModexpSqrt\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.6.12;\\n\\n/**\\n @title Compute Inverse by Modular Exponentiation\\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\\n @dev the function body is generated with the modified addchain script\\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\\n */\\nlibrary ModexpInverse {\\n function run(uint256 t2) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n t0 := mulmod(t2, t2, n)\\n let t5 := mulmod(t0, t2, n)\\n let t1 := mulmod(t5, t0, n)\\n let t3 := mulmod(t5, t5, n)\\n let t8 := mulmod(t1, t0, n)\\n let t4 := mulmod(t3, t5, n)\\n let t6 := mulmod(t3, t1, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t4, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n }\\n }\\n}\\n\\n/**\\n @title Compute Squre Root by Modular Exponentiation\\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\\n */\\nlibrary ModexpSqrt {\\n function run(uint256 t6) internal pure returns (uint256 t0) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n let\\n n\\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\\n\\n t0 := mulmod(t6, t6, n)\\n let t4 := mulmod(t0, t6, n)\\n let t2 := mulmod(t4, t0, n)\\n let t3 := mulmod(t4, t4, n)\\n let t8 := mulmod(t2, t0, n)\\n let t1 := mulmod(t3, t4, n)\\n let t5 := mulmod(t3, t2, n)\\n t0 := mulmod(t3, t3, n)\\n let t7 := mulmod(t8, t3, n)\\n t3 := mulmod(t1, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t8, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t7, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t6, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t5, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t4, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t3, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t2, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t0, n)\\n t0 := mulmod(t0, t1, n)\\n t0 := mulmod(t0, t0, n)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2f58dd24d2278125ba9dea17eb1d5404170f8b93cf097174558c68a5d50e20a7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52","version":1}}},"contracts/samples/callback/TokenCallbackHandler.sol":{"TokenCallbackHandler":{"abi":[{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506105d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100665760003560e01c8063150b7a0211610050578063150b7a02146100ad578063bc197c8114610116578063f23a6e611461015157600080fd5b806223de291461006b57806301ffc9a714610085575b600080fd5b6100836100793660046102e1565b5050505050505050565b005b61009861009336600461038c565b61018a565b60405190151581526020015b60405180910390f35b6100e56100bb3660046103d5565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100a4565b6100e5610124366004610489565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6100e561015f366004610523565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061021d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061026957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461029357600080fd5b919050565b60008083601f8401126102aa57600080fd5b50813567ffffffffffffffff8111156102c257600080fd5b6020830191508360208285010111156102da57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fd57600080fd5b6103068961026f565b975061031460208a0161026f565b965061032260408a0161026f565b955060608901359450608089013567ffffffffffffffff8082111561034657600080fd5b6103528c838d01610298565b909650945060a08b013591508082111561036b57600080fd5b506103788b828c01610298565b999c989b5096995094979396929594505050565b60006020828403121561039e57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103ce57600080fd5b9392505050565b6000806000806000608086880312156103ed57600080fd5b6103f68661026f565b94506104046020870161026f565b935060408601359250606086013567ffffffffffffffff81111561042757600080fd5b61043388828901610298565b969995985093965092949392505050565b60008083601f84011261045657600080fd5b50813567ffffffffffffffff81111561046e57600080fd5b6020830191508360208260051b85010111156102da57600080fd5b60008060008060008060008060a0898b0312156104a557600080fd5b6104ae8961026f565b97506104bc60208a0161026f565b9650604089013567ffffffffffffffff808211156104d957600080fd5b6104e58c838d01610444565b909850965060608b01359150808211156104fe57600080fd5b61050a8c838d01610444565b909650945060808b013591508082111561036b57600080fd5b60008060008060008060a0878903121561053c57600080fd5b6105458761026f565b95506105536020880161026f565b94506040870135935060608701359250608087013567ffffffffffffffff81111561057d57600080fd5b61058989828a01610298565b979a969950949750929593949250505056fea2646970667358221220b2b88bdbca72e81e945b07a557c494d269166978d80814b819389608432be2ce64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D1 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x66 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x150B7A02 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x151 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x85 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x83 PUSH2 0x79 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E1 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0x98 PUSH2 0x93 CALLDATASIZE PUSH1 0x4 PUSH2 0x38C JUMP JUMPDEST PUSH2 0x18A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE5 PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0x3D5 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xA4 JUMP JUMPDEST PUSH2 0xE5 PUSH2 0x124 CALLDATASIZE PUSH1 0x4 PUSH2 0x489 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE5 PUSH2 0x15F CALLDATASIZE PUSH1 0x4 PUSH2 0x523 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x21D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x269 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x306 DUP10 PUSH2 0x26F JUMP JUMPDEST SWAP8 POP PUSH2 0x314 PUSH1 0x20 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP7 POP PUSH2 0x322 PUSH1 0x40 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x352 DUP13 DUP4 DUP14 ADD PUSH2 0x298 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x378 DUP12 DUP3 DUP13 ADD PUSH2 0x298 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F6 DUP7 PUSH2 0x26F JUMP JUMPDEST SWAP5 POP PUSH2 0x404 PUSH1 0x20 DUP8 ADD PUSH2 0x26F JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x433 DUP9 DUP3 DUP10 ADD PUSH2 0x298 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4AE DUP10 PUSH2 0x26F JUMP JUMPDEST SWAP8 POP PUSH2 0x4BC PUSH1 0x20 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E5 DUP13 DUP4 DUP14 ADD PUSH2 0x444 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x50A DUP13 DUP4 DUP14 ADD PUSH2 0x444 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x53C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x545 DUP8 PUSH2 0x26F JUMP JUMPDEST SWAP6 POP PUSH2 0x553 PUSH1 0x20 DUP9 ADD PUSH2 0x26F JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x589 DUP10 DUP3 DUP11 ADD PUSH2 0x298 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB2 0xB8 DUP12 0xDB 0xCA PUSH19 0xE81E945B07A557C494D269166978D80814B819 CODESIZE SWAP7 ADDMOD NUMBER 0x2B 0xE2 0xCE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"490:1299:86:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@supportsInterface_17936":{"entryPoint":394,"id":17936,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"abi_decode_address":{"entryPoint":623,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":1092,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":664,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":737,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":1161,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":981,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":1315,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_bytes4":{"entryPoint":908,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:5279:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:147:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"190:6:111"},"nodeType":"YulFunctionCall","src":"190:12:111"},"nodeType":"YulExpressionStatement","src":"190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:73:111"},"nodeType":"YulIf","src":"111:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:196:111"},{"body":{"nodeType":"YulBlock","src":"287:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"338:6:111"},"nodeType":"YulFunctionCall","src":"338:12:111"},"nodeType":"YulExpressionStatement","src":"338:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"315:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"323:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"311:3:111"},"nodeType":"YulFunctionCall","src":"311:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"330:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"307:3:111"},"nodeType":"YulFunctionCall","src":"307:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"300:6:111"},"nodeType":"YulFunctionCall","src":"300:35:111"},"nodeType":"YulIf","src":"297:55:111"},{"nodeType":"YulAssignment","src":"361:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"384:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"371:12:111"},"nodeType":"YulFunctionCall","src":"371:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"361:6:111"}]},{"body":{"nodeType":"YulBlock","src":"434:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"443:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"446:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"436:6:111"},"nodeType":"YulFunctionCall","src":"436:12:111"},"nodeType":"YulExpressionStatement","src":"436:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"406:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"414:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"403:2:111"},"nodeType":"YulFunctionCall","src":"403:30:111"},"nodeType":"YulIf","src":"400:50:111"},{"nodeType":"YulAssignment","src":"459:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"475:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"471:3:111"},"nodeType":"YulFunctionCall","src":"471:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"459:8:111"}]},{"body":{"nodeType":"YulBlock","src":"540:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"549:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"552:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"542:6:111"},"nodeType":"YulFunctionCall","src":"542:12:111"},"nodeType":"YulExpressionStatement","src":"542:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"511:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"519:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"507:3:111"},"nodeType":"YulFunctionCall","src":"507:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"528:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"503:3:111"},"nodeType":"YulFunctionCall","src":"503:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"535:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"500:2:111"},"nodeType":"YulFunctionCall","src":"500:39:111"},"nodeType":"YulIf","src":"497:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"250:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"258:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"266:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"276:6:111","type":""}],"src":"215:347:111"},{"body":{"nodeType":"YulBlock","src":"760:817:111","statements":[{"body":{"nodeType":"YulBlock","src":"807:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"816:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"819:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"809:6:111"},"nodeType":"YulFunctionCall","src":"809:12:111"},"nodeType":"YulExpressionStatement","src":"809:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"781:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"790:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"777:3:111"},"nodeType":"YulFunctionCall","src":"777:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"773:3:111"},"nodeType":"YulFunctionCall","src":"773:33:111"},"nodeType":"YulIf","src":"770:53:111"},{"nodeType":"YulAssignment","src":"832:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"861:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"842:18:111"},"nodeType":"YulFunctionCall","src":"842:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"832:6:111"}]},{"nodeType":"YulAssignment","src":"880:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"924:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"909:3:111"},"nodeType":"YulFunctionCall","src":"909:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"890:18:111"},"nodeType":"YulFunctionCall","src":"890:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"880:6:111"}]},{"nodeType":"YulAssignment","src":"937:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"970:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"981:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"966:3:111"},"nodeType":"YulFunctionCall","src":"966:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"947:18:111"},"nodeType":"YulFunctionCall","src":"947:38:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"937:6:111"}]},{"nodeType":"YulAssignment","src":"994:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1021:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1032:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1017:3:111"},"nodeType":"YulFunctionCall","src":"1017:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1004:12:111"},"nodeType":"YulFunctionCall","src":"1004:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"994:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1045:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1076:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1087:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1072:3:111"},"nodeType":"YulFunctionCall","src":"1072:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1059:12:111"},"nodeType":"YulFunctionCall","src":"1059:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1049:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1101:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1111:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1105:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1156:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1168:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1158:6:111"},"nodeType":"YulFunctionCall","src":"1158:12:111"},"nodeType":"YulExpressionStatement","src":"1158:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1144:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1152:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1141:2:111"},"nodeType":"YulFunctionCall","src":"1141:14:111"},"nodeType":"YulIf","src":"1138:34:111"},{"nodeType":"YulVariableDeclaration","src":"1181:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1237:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1248:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1233:3:111"},"nodeType":"YulFunctionCall","src":"1233:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1257:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1207:25:111"},"nodeType":"YulFunctionCall","src":"1207:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1185:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1195:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1274:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1284:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1274:6:111"}]},{"nodeType":"YulAssignment","src":"1301:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1311:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1301:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1328:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1372:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1357:3:111"},"nodeType":"YulFunctionCall","src":"1357:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1344:12:111"},"nodeType":"YulFunctionCall","src":"1344:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1332:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1406:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1415:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1418:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1408:6:111"},"nodeType":"YulFunctionCall","src":"1408:12:111"},"nodeType":"YulExpressionStatement","src":"1408:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1392:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1402:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1389:2:111"},"nodeType":"YulFunctionCall","src":"1389:16:111"},"nodeType":"YulIf","src":"1386:36:111"},{"nodeType":"YulVariableDeclaration","src":"1431:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1487:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1498:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1483:3:111"},"nodeType":"YulFunctionCall","src":"1483:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1509:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1457:25:111"},"nodeType":"YulFunctionCall","src":"1457:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1435:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1445:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1526:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1536:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1526:6:111"}]},{"nodeType":"YulAssignment","src":"1553:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1563:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1553:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"670:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"681:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"693:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"701:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"709:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"717:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"725:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"733:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"741:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"749:6:111","type":""}],"src":"567:1010:111"},{"body":{"nodeType":"YulBlock","src":"1651:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1699:6:111"},"nodeType":"YulFunctionCall","src":"1699:12:111"},"nodeType":"YulExpressionStatement","src":"1699:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1672:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1681:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1668:3:111"},"nodeType":"YulFunctionCall","src":"1668:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1693:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1664:3:111"},"nodeType":"YulFunctionCall","src":"1664:32:111"},"nodeType":"YulIf","src":"1661:52:111"},{"nodeType":"YulVariableDeclaration","src":"1722:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1748:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1735:12:111"},"nodeType":"YulFunctionCall","src":"1735:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1726:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1868:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1877:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1880:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1870:6:111"},"nodeType":"YulFunctionCall","src":"1870:12:111"},"nodeType":"YulExpressionStatement","src":"1870:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1780:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1791:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1798:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1787:3:111"},"nodeType":"YulFunctionCall","src":"1787:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1777:2:111"},"nodeType":"YulFunctionCall","src":"1777:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1770:6:111"},"nodeType":"YulFunctionCall","src":"1770:97:111"},"nodeType":"YulIf","src":"1767:117:111"},{"nodeType":"YulAssignment","src":"1893:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1903:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1893:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1617:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1628:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1640:6:111","type":""}],"src":"1582:332:111"},{"body":{"nodeType":"YulBlock","src":"2014:92:111","statements":[{"nodeType":"YulAssignment","src":"2024:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2047:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2032:3:111"},"nodeType":"YulFunctionCall","src":"2032:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2024:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2066:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2091:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2084:6:111"},"nodeType":"YulFunctionCall","src":"2084:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2077:6:111"},"nodeType":"YulFunctionCall","src":"2077:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2059:6:111"},"nodeType":"YulFunctionCall","src":"2059:41:111"},"nodeType":"YulExpressionStatement","src":"2059:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1983:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1994:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2005:4:111","type":""}],"src":"1919:187:111"},{"body":{"nodeType":"YulBlock","src":"2251:486:111","statements":[{"body":{"nodeType":"YulBlock","src":"2298:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2307:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2310:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2300:6:111"},"nodeType":"YulFunctionCall","src":"2300:12:111"},"nodeType":"YulExpressionStatement","src":"2300:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2272:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2281:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2268:3:111"},"nodeType":"YulFunctionCall","src":"2268:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2293:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2264:3:111"},"nodeType":"YulFunctionCall","src":"2264:33:111"},"nodeType":"YulIf","src":"2261:53:111"},{"nodeType":"YulAssignment","src":"2323:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2352:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2333:18:111"},"nodeType":"YulFunctionCall","src":"2333:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2323:6:111"}]},{"nodeType":"YulAssignment","src":"2371:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2404:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2415:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2400:3:111"},"nodeType":"YulFunctionCall","src":"2400:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2381:18:111"},"nodeType":"YulFunctionCall","src":"2381:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2371:6:111"}]},{"nodeType":"YulAssignment","src":"2428:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2455:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2466:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2451:3:111"},"nodeType":"YulFunctionCall","src":"2451:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2438:12:111"},"nodeType":"YulFunctionCall","src":"2438:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2428:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2479:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2510:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2521:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2506:3:111"},"nodeType":"YulFunctionCall","src":"2506:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2493:12:111"},"nodeType":"YulFunctionCall","src":"2493:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2483:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2568:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2577:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2580:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2570:6:111"},"nodeType":"YulFunctionCall","src":"2570:12:111"},"nodeType":"YulExpressionStatement","src":"2570:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2540:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2548:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2537:2:111"},"nodeType":"YulFunctionCall","src":"2537:30:111"},"nodeType":"YulIf","src":"2534:50:111"},{"nodeType":"YulVariableDeclaration","src":"2593:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2649:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2660:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2645:3:111"},"nodeType":"YulFunctionCall","src":"2645:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2669:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2619:25:111"},"nodeType":"YulFunctionCall","src":"2619:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2597:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2607:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2686:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2696:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2686:6:111"}]},{"nodeType":"YulAssignment","src":"2713:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"2723:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2713:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2185:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2196:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2208:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2216:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2224:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2232:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2240:6:111","type":""}],"src":"2111:626:111"},{"body":{"nodeType":"YulBlock","src":"2841:149:111","statements":[{"nodeType":"YulAssignment","src":"2851:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2874:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2859:3:111"},"nodeType":"YulFunctionCall","src":"2859:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2851:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2893:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2908:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2916:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2904:3:111"},"nodeType":"YulFunctionCall","src":"2904:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2886:6:111"},"nodeType":"YulFunctionCall","src":"2886:98:111"},"nodeType":"YulExpressionStatement","src":"2886:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2810:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2821:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2832:4:111","type":""}],"src":"2742:248:111"},{"body":{"nodeType":"YulBlock","src":"3079:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3128:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3137:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3140:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3130:6:111"},"nodeType":"YulFunctionCall","src":"3130:12:111"},"nodeType":"YulExpressionStatement","src":"3130:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3107:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3115:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3103:3:111"},"nodeType":"YulFunctionCall","src":"3103:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3122:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3099:3:111"},"nodeType":"YulFunctionCall","src":"3099:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3092:6:111"},"nodeType":"YulFunctionCall","src":"3092:35:111"},"nodeType":"YulIf","src":"3089:55:111"},{"nodeType":"YulAssignment","src":"3153:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3176:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3163:12:111"},"nodeType":"YulFunctionCall","src":"3163:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3153:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3226:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3235:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3238:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3228:6:111"},"nodeType":"YulFunctionCall","src":"3228:12:111"},"nodeType":"YulExpressionStatement","src":"3228:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3198:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3206:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3195:2:111"},"nodeType":"YulFunctionCall","src":"3195:30:111"},"nodeType":"YulIf","src":"3192:50:111"},{"nodeType":"YulAssignment","src":"3251:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3267:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3275:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3263:3:111"},"nodeType":"YulFunctionCall","src":"3263:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3251:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3340:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3349:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3352:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3342:6:111"},"nodeType":"YulFunctionCall","src":"3342:12:111"},"nodeType":"YulExpressionStatement","src":"3342:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3303:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3315:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3318:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3311:3:111"},"nodeType":"YulFunctionCall","src":"3311:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3299:3:111"},"nodeType":"YulFunctionCall","src":"3299:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3328:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3295:3:111"},"nodeType":"YulFunctionCall","src":"3295:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3335:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3292:2:111"},"nodeType":"YulFunctionCall","src":"3292:47:111"},"nodeType":"YulIf","src":"3289:67:111"}]},"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3042:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3050:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3058:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3068:6:111","type":""}],"src":"2995:367:111"},{"body":{"nodeType":"YulBlock","src":"3594:983:111","statements":[{"body":{"nodeType":"YulBlock","src":"3641:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3650:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3653:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3643:6:111"},"nodeType":"YulFunctionCall","src":"3643:12:111"},"nodeType":"YulExpressionStatement","src":"3643:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3615:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3624:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3611:3:111"},"nodeType":"YulFunctionCall","src":"3611:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3636:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3607:3:111"},"nodeType":"YulFunctionCall","src":"3607:33:111"},"nodeType":"YulIf","src":"3604:53:111"},{"nodeType":"YulAssignment","src":"3666:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3695:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3676:18:111"},"nodeType":"YulFunctionCall","src":"3676:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3666:6:111"}]},{"nodeType":"YulAssignment","src":"3714:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3747:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3758:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3743:3:111"},"nodeType":"YulFunctionCall","src":"3743:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3724:18:111"},"nodeType":"YulFunctionCall","src":"3724:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3714:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3771:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3802:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3813:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3798:3:111"},"nodeType":"YulFunctionCall","src":"3798:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3785:12:111"},"nodeType":"YulFunctionCall","src":"3785:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3775:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3826:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3836:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3830:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3881:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3890:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3893:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3883:6:111"},"nodeType":"YulFunctionCall","src":"3883:12:111"},"nodeType":"YulExpressionStatement","src":"3883:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3869:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3877:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3866:2:111"},"nodeType":"YulFunctionCall","src":"3866:14:111"},"nodeType":"YulIf","src":"3863:34:111"},{"nodeType":"YulVariableDeclaration","src":"3906:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3974:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3985:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3970:3:111"},"nodeType":"YulFunctionCall","src":"3970:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3994:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"3932:37:111"},"nodeType":"YulFunctionCall","src":"3932:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"3910:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"3920:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4011:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4021:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4011:6:111"}]},{"nodeType":"YulAssignment","src":"4038:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4048:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4038:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4065:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4098:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4109:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4094:3:111"},"nodeType":"YulFunctionCall","src":"4094:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4081:12:111"},"nodeType":"YulFunctionCall","src":"4081:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4069:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4142:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4151:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4154:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4144:6:111"},"nodeType":"YulFunctionCall","src":"4144:12:111"},"nodeType":"YulExpressionStatement","src":"4144:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4128:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4138:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4125:2:111"},"nodeType":"YulFunctionCall","src":"4125:16:111"},"nodeType":"YulIf","src":"4122:36:111"},{"nodeType":"YulVariableDeclaration","src":"4167:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4235:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4246:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4231:3:111"},"nodeType":"YulFunctionCall","src":"4231:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4257:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"4193:37:111"},"nodeType":"YulFunctionCall","src":"4193:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"4171:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"4181:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4274:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"4284:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"4274:6:111"}]},{"nodeType":"YulAssignment","src":"4301:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"4311:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"4301:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4328:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4372:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4357:3:111"},"nodeType":"YulFunctionCall","src":"4357:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4344:12:111"},"nodeType":"YulFunctionCall","src":"4344:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"4332:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4406:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4415:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4418:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4408:6:111"},"nodeType":"YulFunctionCall","src":"4408:12:111"},"nodeType":"YulExpressionStatement","src":"4408:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"4392:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4402:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4389:2:111"},"nodeType":"YulFunctionCall","src":"4389:16:111"},"nodeType":"YulIf","src":"4386:36:111"},{"nodeType":"YulVariableDeclaration","src":"4431:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4487:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"4498:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4483:3:111"},"nodeType":"YulFunctionCall","src":"4483:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4509:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"4457:25:111"},"nodeType":"YulFunctionCall","src":"4457:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"4435:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"4445:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4526:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"4536:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"4526:6:111"}]},{"nodeType":"YulAssignment","src":"4553:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"4563:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"4553:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3504:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3515:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3527:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3535:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3543:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3551:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"3559:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"3567:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"3575:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"3583:6:111","type":""}],"src":"3367:1210:111"},{"body":{"nodeType":"YulBlock","src":"4739:538:111","statements":[{"body":{"nodeType":"YulBlock","src":"4786:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4795:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4798:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4788:6:111"},"nodeType":"YulFunctionCall","src":"4788:12:111"},"nodeType":"YulExpressionStatement","src":"4788:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4760:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4769:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4756:3:111"},"nodeType":"YulFunctionCall","src":"4756:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4781:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4752:3:111"},"nodeType":"YulFunctionCall","src":"4752:33:111"},"nodeType":"YulIf","src":"4749:53:111"},{"nodeType":"YulAssignment","src":"4811:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4840:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4821:18:111"},"nodeType":"YulFunctionCall","src":"4821:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4811:6:111"}]},{"nodeType":"YulAssignment","src":"4859:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4892:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4903:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4888:3:111"},"nodeType":"YulFunctionCall","src":"4888:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"4869:18:111"},"nodeType":"YulFunctionCall","src":"4869:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4859:6:111"}]},{"nodeType":"YulAssignment","src":"4916:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4954:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4939:3:111"},"nodeType":"YulFunctionCall","src":"4939:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4926:12:111"},"nodeType":"YulFunctionCall","src":"4926:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4916:6:111"}]},{"nodeType":"YulAssignment","src":"4967:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5005:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4990:3:111"},"nodeType":"YulFunctionCall","src":"4990:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4977:12:111"},"nodeType":"YulFunctionCall","src":"4977:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4967:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"5018:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5049:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5060:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5045:3:111"},"nodeType":"YulFunctionCall","src":"5045:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5032:12:111"},"nodeType":"YulFunctionCall","src":"5032:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5022:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5108:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5117:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5120:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5110:6:111"},"nodeType":"YulFunctionCall","src":"5110:12:111"},"nodeType":"YulExpressionStatement","src":"5110:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5080:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5088:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5077:2:111"},"nodeType":"YulFunctionCall","src":"5077:30:111"},"nodeType":"YulIf","src":"5074:50:111"},{"nodeType":"YulVariableDeclaration","src":"5133:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5189:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5200:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5185:3:111"},"nodeType":"YulFunctionCall","src":"5185:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5209:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"5159:25:111"},"nodeType":"YulFunctionCall","src":"5159:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"5137:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"5147:8:111","type":""}]},{"nodeType":"YulAssignment","src":"5226:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"5236:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"5226:6:111"}]},{"nodeType":"YulAssignment","src":"5253:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"5263:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"5253:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4665:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4676:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4688:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4696:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4704:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4712:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"4720:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"4728:6:111","type":""}],"src":"4582:695:111"}]},"contents":"{\n { }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := abi_decode_address(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_uint256_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100665760003560e01c8063150b7a0211610050578063150b7a02146100ad578063bc197c8114610116578063f23a6e611461015157600080fd5b806223de291461006b57806301ffc9a714610085575b600080fd5b6100836100793660046102e1565b5050505050505050565b005b61009861009336600461038c565b61018a565b60405190151581526020015b60405180910390f35b6100e56100bb3660046103d5565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100a4565b6100e5610124366004610489565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6100e561015f366004610523565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061021d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061026957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461029357600080fd5b919050565b60008083601f8401126102aa57600080fd5b50813567ffffffffffffffff8111156102c257600080fd5b6020830191508360208285010111156102da57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fd57600080fd5b6103068961026f565b975061031460208a0161026f565b965061032260408a0161026f565b955060608901359450608089013567ffffffffffffffff8082111561034657600080fd5b6103528c838d01610298565b909650945060a08b013591508082111561036b57600080fd5b506103788b828c01610298565b999c989b5096995094979396929594505050565b60006020828403121561039e57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103ce57600080fd5b9392505050565b6000806000806000608086880312156103ed57600080fd5b6103f68661026f565b94506104046020870161026f565b935060408601359250606086013567ffffffffffffffff81111561042757600080fd5b61043388828901610298565b969995985093965092949392505050565b60008083601f84011261045657600080fd5b50813567ffffffffffffffff81111561046e57600080fd5b6020830191508360208260051b85010111156102da57600080fd5b60008060008060008060008060a0898b0312156104a557600080fd5b6104ae8961026f565b97506104bc60208a0161026f565b9650604089013567ffffffffffffffff808211156104d957600080fd5b6104e58c838d01610444565b909850965060608b01359150808211156104fe57600080fd5b61050a8c838d01610444565b909650945060808b013591508082111561036b57600080fd5b60008060008060008060a0878903121561053c57600080fd5b6105458761026f565b95506105536020880161026f565b94506040870135935060608701359250608087013567ffffffffffffffff81111561057d57600080fd5b61058989828a01610298565b979a969950949750929593949250505056fea2646970667358221220b2b88bdbca72e81e945b07a557c494d269166978d80814b819389608432be2ce64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x66 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x150B7A02 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x151 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x85 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x83 PUSH2 0x79 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E1 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0x98 PUSH2 0x93 CALLDATASIZE PUSH1 0x4 PUSH2 0x38C JUMP JUMPDEST PUSH2 0x18A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE5 PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0x3D5 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xA4 JUMP JUMPDEST PUSH2 0xE5 PUSH2 0x124 CALLDATASIZE PUSH1 0x4 PUSH2 0x489 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE5 PUSH2 0x15F CALLDATASIZE PUSH1 0x4 PUSH2 0x523 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x21D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x269 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x306 DUP10 PUSH2 0x26F JUMP JUMPDEST SWAP8 POP PUSH2 0x314 PUSH1 0x20 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP7 POP PUSH2 0x322 PUSH1 0x40 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x352 DUP13 DUP4 DUP14 ADD PUSH2 0x298 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x378 DUP12 DUP3 DUP13 ADD PUSH2 0x298 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F6 DUP7 PUSH2 0x26F JUMP JUMPDEST SWAP5 POP PUSH2 0x404 PUSH1 0x20 DUP8 ADD PUSH2 0x26F JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x433 DUP9 DUP3 DUP10 ADD PUSH2 0x298 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4AE DUP10 PUSH2 0x26F JUMP JUMPDEST SWAP8 POP PUSH2 0x4BC PUSH1 0x20 DUP11 ADD PUSH2 0x26F JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E5 DUP13 DUP4 DUP14 ADD PUSH2 0x444 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x50A DUP13 DUP4 DUP14 ADD PUSH2 0x444 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x53C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x545 DUP8 PUSH2 0x26F JUMP JUMPDEST SWAP6 POP PUSH2 0x553 PUSH1 0x20 DUP9 ADD PUSH2 0x26F JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x589 DUP10 DUP3 DUP11 ADD PUSH2 0x298 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB2 0xB8 DUP12 0xDB 0xCA PUSH19 0xE81E945B07A557C494D269166978D80814B819 CODESIZE SWAP7 ADDMOD NUMBER 0x2B 0xE2 0xCE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"490:1299:86:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176;;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;:::i;:::-;;:::i;:::-;;;2084:14:111;;2077:22;2059:41;;2047:2;2032:18;1489:298:86;;;;;;;;763:212;;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;2916:66:111;2904:79;;;2886:98;;2874:2;2859:18;763:212:86;2742:248:111;1219:264:86;;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;981:232;;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;14:196:111:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:347::-;266:8;276:6;330:3;323:4;315:6;311:17;307:27;297:55;;348:1;345;338:12;297:55;-1:-1:-1;371:20:111;;414:18;403:30;;400:50;;;446:1;443;436:12;400:50;483:4;475:6;471:17;459:29;;535:3;528:4;519:6;511;507:19;503:30;500:39;497:59;;;552:1;549;542:12;497:59;215:347;;;;;:::o;567:1010::-;693:6;701;709;717;725;733;741;749;802:3;790:9;781:7;777:23;773:33;770:53;;;819:1;816;809:12;770:53;842:29;861:9;842:29;:::i;:::-;832:39;;890:38;924:2;913:9;909:18;890:38;:::i;:::-;880:48;;947:38;981:2;970:9;966:18;947:38;:::i;:::-;937:48;;1032:2;1021:9;1017:18;1004:32;994:42;;1087:3;1076:9;1072:19;1059:33;1111:18;1152:2;1144:6;1141:14;1138:34;;;1168:1;1165;1158:12;1138:34;1207:58;1257:7;1248:6;1237:9;1233:22;1207:58;:::i;:::-;1284:8;;-1:-1:-1;1181:84:111;-1:-1:-1;1372:3:111;1357:19;;1344:33;;-1:-1:-1;1389:16:111;;;1386:36;;;1418:1;1415;1408:12;1386:36;;1457:60;1509:7;1498:8;1487:9;1483:24;1457:60;:::i;:::-;567:1010;;;;-1:-1:-1;567:1010:111;;-1:-1:-1;567:1010:111;;;;;;1536:8;-1:-1:-1;;;567:1010:111:o;1582:332::-;1640:6;1693:2;1681:9;1672:7;1668:23;1664:32;1661:52;;;1709:1;1706;1699:12;1661:52;1748:9;1735:23;1798:66;1791:5;1787:78;1780:5;1777:89;1767:117;;1880:1;1877;1870:12;1767:117;1903:5;1582:332;-1:-1:-1;;;1582:332:111:o;2111:626::-;2208:6;2216;2224;2232;2240;2293:3;2281:9;2272:7;2268:23;2264:33;2261:53;;;2310:1;2307;2300:12;2261:53;2333:29;2352:9;2333:29;:::i;:::-;2323:39;;2381:38;2415:2;2404:9;2400:18;2381:38;:::i;:::-;2371:48;;2466:2;2455:9;2451:18;2438:32;2428:42;;2521:2;2510:9;2506:18;2493:32;2548:18;2540:6;2537:30;2534:50;;;2580:1;2577;2570:12;2534:50;2619:58;2669:7;2660:6;2649:9;2645:22;2619:58;:::i;:::-;2111:626;;;;-1:-1:-1;2111:626:111;;-1:-1:-1;2696:8:111;;2593:84;2111:626;-1:-1:-1;;;2111:626:111:o;2995:367::-;3058:8;3068:6;3122:3;3115:4;3107:6;3103:17;3099:27;3089:55;;3140:1;3137;3130:12;3089:55;-1:-1:-1;3163:20:111;;3206:18;3195:30;;3192:50;;;3238:1;3235;3228:12;3192:50;3275:4;3267:6;3263:17;3251:29;;3335:3;3328:4;3318:6;3315:1;3311:14;3303:6;3299:27;3295:38;3292:47;3289:67;;;3352:1;3349;3342:12;3367:1210;3527:6;3535;3543;3551;3559;3567;3575;3583;3636:3;3624:9;3615:7;3611:23;3607:33;3604:53;;;3653:1;3650;3643:12;3604:53;3676:29;3695:9;3676:29;:::i;:::-;3666:39;;3724:38;3758:2;3747:9;3743:18;3724:38;:::i;:::-;3714:48;;3813:2;3802:9;3798:18;3785:32;3836:18;3877:2;3869:6;3866:14;3863:34;;;3893:1;3890;3883:12;3863:34;3932:70;3994:7;3985:6;3974:9;3970:22;3932:70;:::i;:::-;4021:8;;-1:-1:-1;3906:96:111;-1:-1:-1;4109:2:111;4094:18;;4081:32;;-1:-1:-1;4125:16:111;;;4122:36;;;4154:1;4151;4144:12;4122:36;4193:72;4257:7;4246:8;4235:9;4231:24;4193:72;:::i;:::-;4284:8;;-1:-1:-1;4167:98:111;-1:-1:-1;4372:3:111;4357:19;;4344:33;;-1:-1:-1;4389:16:111;;;4386:36;;;4418:1;4415;4408:12;4582:695;4688:6;4696;4704;4712;4720;4728;4781:3;4769:9;4760:7;4756:23;4752:33;4749:53;;;4798:1;4795;4788:12;4749:53;4821:29;4840:9;4821:29;:::i;:::-;4811:39;;4869:38;4903:2;4892:9;4888:18;4869:38;:::i;:::-;4859:48;;4954:2;4943:9;4939:18;4926:32;4916:42;;5005:2;4994:9;4990:18;4977:32;4967:42;;5060:3;5049:9;5045:19;5032:33;5088:18;5080:6;5077:30;5074:50;;;5120:1;5117;5110:12;5074:50;5159:58;5209:7;5200:6;5189:9;5185:22;5159:58;:::i;:::-;4582:695;;;;-1:-1:-1;4582:695:111;;-1:-1:-1;4582:695:111;;5236:8;;4582:695;-1:-1:-1;;;4582:695:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"297800","executionCost":"337","totalCost":"298137"},"external":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","supportsInterface(bytes4)":"426","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite"}},"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Token callback handler. Handles supported tokens' callbacks, allowing account receiving these tokens.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/callback/TokenCallbackHandler.sol\":\"TokenCallbackHandler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Token callback handler. Handles supported tokens' callbacks, allowing account receiving these tokens.","version":1}}},"contracts/samples/gnosis/EIP4337Fallback.sol":{"EIP4337Fallback":{"abi":[{"inputs":[{"internalType":"address","name":"_eip4337manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip4337manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"enum Enum.Operation","name":"","type":"uint8"}],"name":"executeAndRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_17970":{"entryPoint":null,"id":17970,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":64,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:306:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"95:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"141:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"150:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"153:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"143:6:111"},"nodeType":"YulFunctionCall","src":"143:12:111"},"nodeType":"YulExpressionStatement","src":"143:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"116:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"125:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"112:3:111"},"nodeType":"YulFunctionCall","src":"112:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"137:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"108:3:111"},"nodeType":"YulFunctionCall","src":"108:32:111"},"nodeType":"YulIf","src":"105:52:111"},{"nodeType":"YulVariableDeclaration","src":"166:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"185:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"179:5:111"},"nodeType":"YulFunctionCall","src":"179:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"170:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"258:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"267:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"270:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"260:6:111"},"nodeType":"YulFunctionCall","src":"260:12:111"},"nodeType":"YulExpressionStatement","src":"260:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"217:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"228:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"243:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"248:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"239:3:111"},"nodeType":"YulFunctionCall","src":"239:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"252:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"235:3:111"},"nodeType":"YulFunctionCall","src":"235:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"224:3:111"},"nodeType":"YulFunctionCall","src":"224:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"214:2:111"},"nodeType":"YulFunctionCall","src":"214:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"207:6:111"},"nodeType":"YulFunctionCall","src":"207:50:111"},"nodeType":"YulIf","src":"204:70:111"},{"nodeType":"YulAssignment","src":"283:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"293:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"283:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"61:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"72:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"84:6:111","type":""}],"src":"14:290:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b5060405161113838038061113883398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516110a66100926000396000818161019b015261061601526110a66000f3fe608060405234801561001057600080fd5b50600436106100d35760003560e01c8063940d3c6011610081578063d087d2881161005b578063d087d2881461029a578063f23a6e61146102a2578063ffa1ad74146102db57600080fd5b8063940d3c6014610203578063a3f4df7e14610216578063bc197c811461025f57600080fd5b80631626ba7e116100b25780631626ba7e146101835780632bcadc24146101965780633a871cdd146101e257600080fd5b806223de29146100d857806301ffc9a7146100f2578063150b7a021461011a575b600080fd5b6100f06100e63660046109e2565b5050505050505050565b005b610105610100366004610a8d565b610317565b60405190151581526020015b60405180910390f35b610152610128366004610acf565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610111565b610152610191366004610c1c565b6103fc565b6101bd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b6101f56101f0366004610c63565b610554565b604051908152602001610111565b6100f0610211366004610cb7565b61057e565b6102526040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516101119190610d55565b61015261026d366004610dcd565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6101f561058d565b6101526102b0366004610e67565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6102526040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103aa57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806103f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080610456846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061046482856105b4565b6040517f2f54bf6e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015290915033908190632f54bf6e90602401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f79190610eef565b1561052857507f1626ba7e0000000000000000000000000000000000000000000000000000000092506103f6915050565b507fffffffff0000000000000000000000000000000000000000000000000000000092506103f6915050565b60008061055f6105d8565b9050808060200190518101906105759190610f0a565b95945050505050565b6105866105d8565b5050505050565b6000806105986105d8565b9050808060200190518101906105ae9190610f0a565b91505090565b60008060006105c385856106a6565b915091506105d0816106eb565b509392505050565b6040517f5229073f000000000000000000000000000000000000000000000000000000008152606090339060009081908390635229073f90610647907f000000000000000000000000000000000000000000000000000000000000000090859081903690600190600401610f52565b6000604051808303816000875af1158015610666573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261068e9190810190610fe6565b915091508161069f57805160208201fd5b9392505050565b60008082516041036106dc5760208301516040840151606085015160001a6106d0878285856108a6565b945094505050506106e4565b506000905060025b9250929050565b60008160048111156106ff576106ff610f23565b036107075750565b600181600481111561071b5761071b610f23565b03610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561079b5761079b610f23565b03610802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161077e565b600381600481111561081657610816610f23565b036108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161077e565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108dd575060009050600361096e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610931573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff81166109675760006001925092505061096e565b9150600090505b94509492505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099b57600080fd5b919050565b60008083601f8401126109b257600080fd5b50813567ffffffffffffffff8111156109ca57600080fd5b6020830191508360208285010111156106e457600080fd5b60008060008060008060008060c0898b0312156109fe57600080fd5b610a0789610977565b9750610a1560208a01610977565b9650610a2360408a01610977565b955060608901359450608089013567ffffffffffffffff80821115610a4757600080fd5b610a538c838d016109a0565b909650945060a08b0135915080821115610a6c57600080fd5b50610a798b828c016109a0565b999c989b5096995094979396929594505050565b600060208284031215610a9f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461069f57600080fd5b600080600080600060808688031215610ae757600080fd5b610af086610977565b9450610afe60208701610977565b935060408601359250606086013567ffffffffffffffff811115610b2157600080fd5b610b2d888289016109a0565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610b9657610b96610b3e565b604052919050565b600067ffffffffffffffff821115610bb857610bb8610b3e565b50601f01601f191660200190565b600082601f830112610bd757600080fd5b8135610bea610be582610b9e565b610b6d565b818152846020838601011115610bff57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610c2f57600080fd5b82359150602083013567ffffffffffffffff811115610c4d57600080fd5b610c5985828601610bc6565b9150509250929050565b600080600060608486031215610c7857600080fd5b833567ffffffffffffffff811115610c8f57600080fd5b84016101608187031215610ca257600080fd5b95602085013595506040909401359392505050565b60008060008060808587031215610ccd57600080fd5b610cd685610977565b935060208501359250604085013567ffffffffffffffff811115610cf957600080fd5b610d0587828801610bc6565b925050606085013560028110610d1a57600080fd5b939692955090935050565b60005b83811015610d40578181015183820152602001610d28565b83811115610d4f576000848401525b50505050565b6020815260008251806020840152610d74816040850160208701610d25565b601f01601f19169190910160400192915050565b60008083601f840112610d9a57600080fd5b50813567ffffffffffffffff811115610db257600080fd5b6020830191508360208260051b85010111156106e457600080fd5b60008060008060008060008060a0898b031215610de957600080fd5b610df289610977565b9750610e0060208a01610977565b9650604089013567ffffffffffffffff80821115610e1d57600080fd5b610e298c838d01610d88565b909850965060608b0135915080821115610e4257600080fd5b610e4e8c838d01610d88565b909650945060808b0135915080821115610a6c57600080fd5b60008060008060008060a08789031215610e8057600080fd5b610e8987610977565b9550610e9760208801610977565b94506040870135935060608701359250608087013567ffffffffffffffff811115610ec157600080fd5b610ecd89828a016109a0565b979a9699509497509295939492505050565b8051801515811461099b57600080fd5b600060208284031215610f0157600080fd5b61069f82610edf565b600060208284031215610f1c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260806040820152826080820152828460a0830137600060a08483010152600060a0601f19601f860116830101905060028310610fd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8260608301529695505050505050565b60008060408385031215610ff957600080fd5b61100283610edf565b9150602083015167ffffffffffffffff81111561101e57600080fd5b8301601f8101851361102f57600080fd5b805161103d610be582610b9e565b81815286602083850101111561105257600080fd5b611063826020830160208601610d25565b809350505050925092905056fea2646970667358221220e7c4038a3ff6cd21c2c03e0b55e354d7463455235f93344fcb5299141d1f34d064736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1138 CODESIZE SUB DUP1 PUSH2 0x1138 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x40 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH2 0x70 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x10A6 PUSH2 0x92 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x19B ADD MSTORE PUSH2 0x616 ADD MSTORE PUSH2 0x10A6 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x940D3C60 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xD087D288 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x2A2 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x940D3C60 EQ PUSH2 0x203 JUMPI DUP1 PUSH4 0xA3F4DF7E EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1626BA7E GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x183 JUMPI DUP1 PUSH4 0x2BCADC24 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x1E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0xD8 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xF2 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x11A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF0 PUSH2 0xE6 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E2 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0x105 PUSH2 0x100 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8D JUMP JUMPDEST PUSH2 0x317 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x152 PUSH2 0x128 CALLDATASIZE PUSH1 0x4 PUSH2 0xACF JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x191 CALLDATASIZE PUSH1 0x4 PUSH2 0xC1C JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST PUSH2 0x1BD PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0xC63 JUMP JUMPDEST PUSH2 0x554 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0xF0 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0xCB7 JUMP JUMPDEST PUSH2 0x57E JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x44656661756C742043616C6C6261636B2048616E646C65720000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x111 SWAP2 SWAP1 PUSH2 0xD55 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x26D CALLDATASIZE PUSH1 0x4 PUSH2 0xDCD JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x58D JUMP JUMPDEST PUSH2 0x152 PUSH2 0x2B0 CALLDATASIZE PUSH1 0x4 PUSH2 0xE67 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x3AA JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x3F6 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x456 DUP5 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x464 DUP3 DUP6 PUSH2 0x5B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2F54BF6E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 SWAP2 POP CALLER SWAP1 DUP2 SWAP1 PUSH4 0x2F54BF6E SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4F7 SWAP2 SWAP1 PUSH2 0xEEF JUMP JUMPDEST ISZERO PUSH2 0x528 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x55F PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x575 SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x586 PUSH2 0x5D8 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x598 PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x5AE SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x5C3 DUP6 DUP6 PUSH2 0x6A6 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x5D0 DUP2 PUSH2 0x6EB JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x5229073F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 CALLER SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 SWAP1 PUSH4 0x5229073F SWAP1 PUSH2 0x647 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 DUP2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0xF52 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x666 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x68E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xFE6 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x69F JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x6DC JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x6D0 DUP8 DUP3 DUP6 DUP6 PUSH2 0x8A6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x6E4 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x6FF JUMPI PUSH2 0x6FF PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x707 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x71B JUMPI PUSH2 0x71B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x787 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x79B JUMPI PUSH2 0x79B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x802 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x77E JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH2 0x816 PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x8A3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x77E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x8DD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x96E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x931 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x967 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x96E JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x9B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x9FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA07 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xA15 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH2 0xA23 PUSH1 0x40 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA53 DUP13 DUP4 DUP14 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA79 DUP12 DUP3 DUP13 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xAE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAF0 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH2 0xAFE PUSH1 0x20 DUP8 ADD PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB2D DUP9 DUP3 DUP10 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB96 JUMPI PUSH2 0xB96 PUSH2 0xB3E JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xBB8 JUMPI PUSH2 0xBB8 PUSH2 0xB3E JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xBD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xBEA PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST PUSH2 0xB6D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xBFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC2F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC59 DUP6 DUP3 DUP7 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xCA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xCCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xCD6 DUP6 PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD05 DUP8 DUP3 DUP9 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0xD1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD40 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD28 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD4F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xD74 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0xD25 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xDB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0xDE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF2 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xE00 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE29 DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xE42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE4E DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE89 DUP8 PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH2 0xE97 PUSH1 0x20 DUP9 ADD PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xECD DUP10 DUP3 DUP11 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x69F DUP3 PUSH2 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP2 MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD MSTORE DUP3 PUSH1 0x80 DUP3 ADD MSTORE DUP3 DUP5 PUSH1 0xA0 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0xA0 DUP5 DUP4 ADD ADD MSTORE PUSH1 0x0 PUSH1 0xA0 PUSH1 0x1F NOT PUSH1 0x1F DUP7 ADD AND DUP4 ADD ADD SWAP1 POP PUSH1 0x2 DUP4 LT PUSH2 0xFD6 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1002 DUP4 PUSH2 0xEDF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x102F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x103D PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP2 DUP2 MSTORE DUP7 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x1052 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1063 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xD25 JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE7 0xC4 SUB DUP11 EXTCODEHASH 0xF6 0xCD 0x21 0xC2 0xC0 RETURNDATACOPY SIGNEXTEND SSTORE 0xE3 SLOAD 0xD7 CHAINID CALLVALUE SSTORE 0x23 0x5F SWAP4 CALLVALUE 0x4F 0xCB MSTORE SWAP10 EQ SAR 0x1F CALLVALUE 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"879:2164:87:-:0;;;1065:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1112:32:87;;;879:2164;;14:290:111;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:111;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:111:o;:::-;879:2164:87;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@NAME_2304":{"entryPoint":null,"id":2304,"parameterSlots":0,"returnSlots":0},"@VERSION_2307":{"entryPoint":null,"id":2307,"parameterSlots":0,"returnSlots":0},"@_throwError_5521":{"entryPoint":1771,"id":5521,"parameterSlots":1,"returnSlots":0},"@delegateToManager_18010":{"entryPoint":1496,"id":18010,"parameterSlots":0,"returnSlots":1},"@eip4337manager_17960":{"entryPoint":null,"id":17960,"parameterSlots":0,"returnSlots":0},"@executeAndRevert_18078":{"entryPoint":1406,"id":18078,"parameterSlots":4,"returnSlots":0},"@getNonce_18061":{"entryPoint":1421,"id":18061,"parameterSlots":0,"returnSlots":1},"@isValidSignature_18127":{"entryPoint":1020,"id":18127,"parameterSlots":2,"returnSlots":1},"@onERC1155BatchReceived_2347":{"entryPoint":null,"id":2347,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_2326":{"entryPoint":null,"id":2326,"parameterSlots":6,"returnSlots":1},"@onERC721Received_2364":{"entryPoint":null,"id":2364,"parameterSlots":5,"returnSlots":1},"@recover_5594":{"entryPoint":1460,"id":5594,"parameterSlots":2,"returnSlots":1},"@supportsInterface_2411":{"entryPoint":791,"id":2411,"parameterSlots":1,"returnSlots":1},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@tokensReceived_2381":{"entryPoint":null,"id":2381,"parameterSlots":8,"returnSlots":0},"@tryRecover_5567":{"entryPoint":1702,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":2214,"id":5735,"parameterSlots":4,"returnSlots":2},"@validateUserOp_18038":{"entryPoint":1364,"id":18038,"parameterSlots":3,"returnSlots":1},"abi_decode_address":{"entryPoint":2423,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3464,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":3807,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_bytes":{"entryPoint":3014,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":2464,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":2530,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":3533,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":2767,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":3687,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997":{"entryPoint":3255,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":3823,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_boolt_bytes_memory_ptr_fromMemory":{"entryPoint":4070,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes32t_bytes_memory_ptr":{"entryPoint":3100,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes4":{"entryPoint":2701,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":3171,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":3850,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1_t_bytes_calldata_ptr_t_enum$_Operation_$1997__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8__fromStack_reversed":{"entryPoint":3922,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":3413,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":2925,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":2974,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":3365,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x21":{"entryPoint":3875,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":2878,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:13526:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"63:147:111","statements":[{"nodeType":"YulAssignment","src":"73:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"95:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"82:12:111"},"nodeType":"YulFunctionCall","src":"82:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"73:5:111"}]},{"body":{"nodeType":"YulBlock","src":"188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"190:6:111"},"nodeType":"YulFunctionCall","src":"190:12:111"},"nodeType":"YulExpressionStatement","src":"190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"124:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"135:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"142:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"121:2:111"},"nodeType":"YulFunctionCall","src":"121:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"114:6:111"},"nodeType":"YulFunctionCall","src":"114:73:111"},"nodeType":"YulIf","src":"111:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"42:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"53:5:111","type":""}],"src":"14:196:111"},{"body":{"nodeType":"YulBlock","src":"287:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"338:6:111"},"nodeType":"YulFunctionCall","src":"338:12:111"},"nodeType":"YulExpressionStatement","src":"338:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"315:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"323:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"311:3:111"},"nodeType":"YulFunctionCall","src":"311:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"330:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"307:3:111"},"nodeType":"YulFunctionCall","src":"307:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"300:6:111"},"nodeType":"YulFunctionCall","src":"300:35:111"},"nodeType":"YulIf","src":"297:55:111"},{"nodeType":"YulAssignment","src":"361:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"384:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"371:12:111"},"nodeType":"YulFunctionCall","src":"371:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"361:6:111"}]},{"body":{"nodeType":"YulBlock","src":"434:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"443:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"446:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"436:6:111"},"nodeType":"YulFunctionCall","src":"436:12:111"},"nodeType":"YulExpressionStatement","src":"436:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"406:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"414:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"403:2:111"},"nodeType":"YulFunctionCall","src":"403:30:111"},"nodeType":"YulIf","src":"400:50:111"},{"nodeType":"YulAssignment","src":"459:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"475:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"471:3:111"},"nodeType":"YulFunctionCall","src":"471:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"459:8:111"}]},{"body":{"nodeType":"YulBlock","src":"540:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"549:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"552:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"542:6:111"},"nodeType":"YulFunctionCall","src":"542:12:111"},"nodeType":"YulExpressionStatement","src":"542:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"511:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"519:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"507:3:111"},"nodeType":"YulFunctionCall","src":"507:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"528:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"503:3:111"},"nodeType":"YulFunctionCall","src":"503:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"535:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"500:2:111"},"nodeType":"YulFunctionCall","src":"500:39:111"},"nodeType":"YulIf","src":"497:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"250:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"258:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"266:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"276:6:111","type":""}],"src":"215:347:111"},{"body":{"nodeType":"YulBlock","src":"760:817:111","statements":[{"body":{"nodeType":"YulBlock","src":"807:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"816:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"819:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"809:6:111"},"nodeType":"YulFunctionCall","src":"809:12:111"},"nodeType":"YulExpressionStatement","src":"809:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"781:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"790:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"777:3:111"},"nodeType":"YulFunctionCall","src":"777:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"773:3:111"},"nodeType":"YulFunctionCall","src":"773:33:111"},"nodeType":"YulIf","src":"770:53:111"},{"nodeType":"YulAssignment","src":"832:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"861:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"842:18:111"},"nodeType":"YulFunctionCall","src":"842:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"832:6:111"}]},{"nodeType":"YulAssignment","src":"880:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"924:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"909:3:111"},"nodeType":"YulFunctionCall","src":"909:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"890:18:111"},"nodeType":"YulFunctionCall","src":"890:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"880:6:111"}]},{"nodeType":"YulAssignment","src":"937:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"970:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"981:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"966:3:111"},"nodeType":"YulFunctionCall","src":"966:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"947:18:111"},"nodeType":"YulFunctionCall","src":"947:38:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"937:6:111"}]},{"nodeType":"YulAssignment","src":"994:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1021:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1032:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1017:3:111"},"nodeType":"YulFunctionCall","src":"1017:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1004:12:111"},"nodeType":"YulFunctionCall","src":"1004:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"994:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1045:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1076:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1087:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1072:3:111"},"nodeType":"YulFunctionCall","src":"1072:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1059:12:111"},"nodeType":"YulFunctionCall","src":"1059:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1049:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1101:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1111:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1105:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1156:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1168:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1158:6:111"},"nodeType":"YulFunctionCall","src":"1158:12:111"},"nodeType":"YulExpressionStatement","src":"1158:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1144:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1152:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1141:2:111"},"nodeType":"YulFunctionCall","src":"1141:14:111"},"nodeType":"YulIf","src":"1138:34:111"},{"nodeType":"YulVariableDeclaration","src":"1181:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1237:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1248:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1233:3:111"},"nodeType":"YulFunctionCall","src":"1233:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1257:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1207:25:111"},"nodeType":"YulFunctionCall","src":"1207:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1185:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1195:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1274:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1284:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1274:6:111"}]},{"nodeType":"YulAssignment","src":"1301:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1311:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1301:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1328:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1372:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1357:3:111"},"nodeType":"YulFunctionCall","src":"1357:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1344:12:111"},"nodeType":"YulFunctionCall","src":"1344:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1332:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1406:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1415:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1418:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1408:6:111"},"nodeType":"YulFunctionCall","src":"1408:12:111"},"nodeType":"YulExpressionStatement","src":"1408:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1392:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1402:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1389:2:111"},"nodeType":"YulFunctionCall","src":"1389:16:111"},"nodeType":"YulIf","src":"1386:36:111"},{"nodeType":"YulVariableDeclaration","src":"1431:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1487:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1498:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1483:3:111"},"nodeType":"YulFunctionCall","src":"1483:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1509:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1457:25:111"},"nodeType":"YulFunctionCall","src":"1457:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1435:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1445:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1526:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1536:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1526:6:111"}]},{"nodeType":"YulAssignment","src":"1553:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1563:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1553:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"670:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"681:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"693:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"701:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"709:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"717:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"725:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"733:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"741:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"749:6:111","type":""}],"src":"567:1010:111"},{"body":{"nodeType":"YulBlock","src":"1651:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1699:6:111"},"nodeType":"YulFunctionCall","src":"1699:12:111"},"nodeType":"YulExpressionStatement","src":"1699:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1672:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1681:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1668:3:111"},"nodeType":"YulFunctionCall","src":"1668:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1693:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1664:3:111"},"nodeType":"YulFunctionCall","src":"1664:32:111"},"nodeType":"YulIf","src":"1661:52:111"},{"nodeType":"YulVariableDeclaration","src":"1722:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1748:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1735:12:111"},"nodeType":"YulFunctionCall","src":"1735:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1726:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1868:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1877:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1880:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1870:6:111"},"nodeType":"YulFunctionCall","src":"1870:12:111"},"nodeType":"YulExpressionStatement","src":"1870:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1780:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1791:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1798:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1787:3:111"},"nodeType":"YulFunctionCall","src":"1787:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1777:2:111"},"nodeType":"YulFunctionCall","src":"1777:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1770:6:111"},"nodeType":"YulFunctionCall","src":"1770:97:111"},"nodeType":"YulIf","src":"1767:117:111"},{"nodeType":"YulAssignment","src":"1893:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1903:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1893:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1617:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1628:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1640:6:111","type":""}],"src":"1582:332:111"},{"body":{"nodeType":"YulBlock","src":"2014:92:111","statements":[{"nodeType":"YulAssignment","src":"2024:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2047:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2032:3:111"},"nodeType":"YulFunctionCall","src":"2032:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2024:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2066:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2091:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2084:6:111"},"nodeType":"YulFunctionCall","src":"2084:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2077:6:111"},"nodeType":"YulFunctionCall","src":"2077:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2059:6:111"},"nodeType":"YulFunctionCall","src":"2059:41:111"},"nodeType":"YulExpressionStatement","src":"2059:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1983:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1994:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2005:4:111","type":""}],"src":"1919:187:111"},{"body":{"nodeType":"YulBlock","src":"2251:486:111","statements":[{"body":{"nodeType":"YulBlock","src":"2298:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2307:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2310:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2300:6:111"},"nodeType":"YulFunctionCall","src":"2300:12:111"},"nodeType":"YulExpressionStatement","src":"2300:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2272:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2281:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2268:3:111"},"nodeType":"YulFunctionCall","src":"2268:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2293:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2264:3:111"},"nodeType":"YulFunctionCall","src":"2264:33:111"},"nodeType":"YulIf","src":"2261:53:111"},{"nodeType":"YulAssignment","src":"2323:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2352:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2333:18:111"},"nodeType":"YulFunctionCall","src":"2333:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2323:6:111"}]},{"nodeType":"YulAssignment","src":"2371:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2404:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2415:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2400:3:111"},"nodeType":"YulFunctionCall","src":"2400:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2381:18:111"},"nodeType":"YulFunctionCall","src":"2381:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2371:6:111"}]},{"nodeType":"YulAssignment","src":"2428:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2455:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2466:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2451:3:111"},"nodeType":"YulFunctionCall","src":"2451:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2438:12:111"},"nodeType":"YulFunctionCall","src":"2438:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2428:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2479:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2510:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2521:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2506:3:111"},"nodeType":"YulFunctionCall","src":"2506:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2493:12:111"},"nodeType":"YulFunctionCall","src":"2493:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2483:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2568:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2577:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2580:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2570:6:111"},"nodeType":"YulFunctionCall","src":"2570:12:111"},"nodeType":"YulExpressionStatement","src":"2570:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2540:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2548:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2537:2:111"},"nodeType":"YulFunctionCall","src":"2537:30:111"},"nodeType":"YulIf","src":"2534:50:111"},{"nodeType":"YulVariableDeclaration","src":"2593:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2649:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2660:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2645:3:111"},"nodeType":"YulFunctionCall","src":"2645:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2669:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2619:25:111"},"nodeType":"YulFunctionCall","src":"2619:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2597:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2607:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2686:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2696:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2686:6:111"}]},{"nodeType":"YulAssignment","src":"2713:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"2723:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2713:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2185:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2196:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2208:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2216:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2224:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2232:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2240:6:111","type":""}],"src":"2111:626:111"},{"body":{"nodeType":"YulBlock","src":"2841:149:111","statements":[{"nodeType":"YulAssignment","src":"2851:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2874:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2859:3:111"},"nodeType":"YulFunctionCall","src":"2859:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2851:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2893:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2908:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2916:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2904:3:111"},"nodeType":"YulFunctionCall","src":"2904:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2886:6:111"},"nodeType":"YulFunctionCall","src":"2886:98:111"},"nodeType":"YulExpressionStatement","src":"2886:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2810:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2821:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2832:4:111","type":""}],"src":"2742:248:111"},{"body":{"nodeType":"YulBlock","src":"3027:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3044:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3047:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3037:6:111"},"nodeType":"YulFunctionCall","src":"3037:88:111"},"nodeType":"YulExpressionStatement","src":"3037:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3141:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3144:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3134:6:111"},"nodeType":"YulFunctionCall","src":"3134:15:111"},"nodeType":"YulExpressionStatement","src":"3134:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3168:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3158:6:111"},"nodeType":"YulFunctionCall","src":"3158:15:111"},"nodeType":"YulExpressionStatement","src":"3158:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"2995:184:111"},{"body":{"nodeType":"YulBlock","src":"3229:289:111","statements":[{"nodeType":"YulAssignment","src":"3239:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3255:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3249:5:111"},"nodeType":"YulFunctionCall","src":"3249:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3239:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3267:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3289:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"3305:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"3311:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3301:3:111"},"nodeType":"YulFunctionCall","src":"3301:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"3316:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3297:3:111"},"nodeType":"YulFunctionCall","src":"3297:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3285:3:111"},"nodeType":"YulFunctionCall","src":"3285:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"3271:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3459:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3461:16:111"},"nodeType":"YulFunctionCall","src":"3461:18:111"},"nodeType":"YulExpressionStatement","src":"3461:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3402:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"3414:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3399:2:111"},"nodeType":"YulFunctionCall","src":"3399:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3438:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"3450:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3435:2:111"},"nodeType":"YulFunctionCall","src":"3435:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"3396:2:111"},"nodeType":"YulFunctionCall","src":"3396:62:111"},"nodeType":"YulIf","src":"3393:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3497:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3501:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3490:6:111"},"nodeType":"YulFunctionCall","src":"3490:22:111"},"nodeType":"YulExpressionStatement","src":"3490:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"3209:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"3218:6:111","type":""}],"src":"3184:334:111"},{"body":{"nodeType":"YulBlock","src":"3580:188:111","statements":[{"body":{"nodeType":"YulBlock","src":"3624:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3626:16:111"},"nodeType":"YulFunctionCall","src":"3626:18:111"},"nodeType":"YulExpressionStatement","src":"3626:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3596:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3604:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3593:2:111"},"nodeType":"YulFunctionCall","src":"3593:30:111"},"nodeType":"YulIf","src":"3590:56:111"},{"nodeType":"YulAssignment","src":"3655:107:111","value":{"arguments":[{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3675:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3683:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3671:3:111"},"nodeType":"YulFunctionCall","src":"3671:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3688:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3667:3:111"},"nodeType":"YulFunctionCall","src":"3667:88:111"},{"kind":"number","nodeType":"YulLiteral","src":"3757:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3663:3:111"},"nodeType":"YulFunctionCall","src":"3663:99:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"3655:4:111"}]}]},"name":"array_allocation_size_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"3560:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"3571:4:111","type":""}],"src":"3523:245:111"},{"body":{"nodeType":"YulBlock","src":"3825:410:111","statements":[{"body":{"nodeType":"YulBlock","src":"3874:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3883:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3886:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3876:6:111"},"nodeType":"YulFunctionCall","src":"3876:12:111"},"nodeType":"YulExpressionStatement","src":"3876:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3853:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3861:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3849:3:111"},"nodeType":"YulFunctionCall","src":"3849:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3868:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3845:3:111"},"nodeType":"YulFunctionCall","src":"3845:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3838:6:111"},"nodeType":"YulFunctionCall","src":"3838:35:111"},"nodeType":"YulIf","src":"3835:55:111"},{"nodeType":"YulVariableDeclaration","src":"3899:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3922:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3909:12:111"},"nodeType":"YulFunctionCall","src":"3909:20:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3903:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3938:63:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3997:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"3969:27:111"},"nodeType":"YulFunctionCall","src":"3969:31:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"3953:15:111"},"nodeType":"YulFunctionCall","src":"3953:48:111"},"variables":[{"name":"array_1","nodeType":"YulTypedName","src":"3942:7:111","type":""}]},{"expression":{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"4017:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4026:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4010:6:111"},"nodeType":"YulFunctionCall","src":"4010:19:111"},"nodeType":"YulExpressionStatement","src":"4010:19:111"},{"body":{"nodeType":"YulBlock","src":"4077:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4086:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4089:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4079:6:111"},"nodeType":"YulFunctionCall","src":"4079:12:111"},"nodeType":"YulExpressionStatement","src":"4079:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4052:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4060:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4048:3:111"},"nodeType":"YulFunctionCall","src":"4048:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"4065:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4044:3:111"},"nodeType":"YulFunctionCall","src":"4044:26:111"},{"name":"end","nodeType":"YulIdentifier","src":"4072:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4041:2:111"},"nodeType":"YulFunctionCall","src":"4041:35:111"},"nodeType":"YulIf","src":"4038:55:111"},{"expression":{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"4119:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4128:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4115:3:111"},"nodeType":"YulFunctionCall","src":"4115:18:111"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4139:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4147:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4135:3:111"},"nodeType":"YulFunctionCall","src":"4135:17:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4154:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"4102:12:111"},"nodeType":"YulFunctionCall","src":"4102:55:111"},"nodeType":"YulExpressionStatement","src":"4102:55:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"4181:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4190:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4177:3:111"},"nodeType":"YulFunctionCall","src":"4177:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"4195:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4173:3:111"},"nodeType":"YulFunctionCall","src":"4173:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"4202:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4166:6:111"},"nodeType":"YulFunctionCall","src":"4166:38:111"},"nodeType":"YulExpressionStatement","src":"4166:38:111"},{"nodeType":"YulAssignment","src":"4213:16:111","value":{"name":"array_1","nodeType":"YulIdentifier","src":"4222:7:111"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"4213:5:111"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3799:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3807:3:111","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"3815:5:111","type":""}],"src":"3773:462:111"},{"body":{"nodeType":"YulBlock","src":"4336:292:111","statements":[{"body":{"nodeType":"YulBlock","src":"4382:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4391:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4394:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4384:6:111"},"nodeType":"YulFunctionCall","src":"4384:12:111"},"nodeType":"YulExpressionStatement","src":"4384:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4357:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4366:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4353:3:111"},"nodeType":"YulFunctionCall","src":"4353:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4378:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4349:3:111"},"nodeType":"YulFunctionCall","src":"4349:32:111"},"nodeType":"YulIf","src":"4346:52:111"},{"nodeType":"YulAssignment","src":"4407:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4430:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4417:12:111"},"nodeType":"YulFunctionCall","src":"4417:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4407:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4449:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4480:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4491:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4476:3:111"},"nodeType":"YulFunctionCall","src":"4476:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4463:12:111"},"nodeType":"YulFunctionCall","src":"4463:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4453:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4538:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4547:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4550:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4540:6:111"},"nodeType":"YulFunctionCall","src":"4540:12:111"},"nodeType":"YulExpressionStatement","src":"4540:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4510:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4518:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4507:2:111"},"nodeType":"YulFunctionCall","src":"4507:30:111"},"nodeType":"YulIf","src":"4504:50:111"},{"nodeType":"YulAssignment","src":"4563:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4594:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4605:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4590:3:111"},"nodeType":"YulFunctionCall","src":"4590:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4614:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4573:16:111"},"nodeType":"YulFunctionCall","src":"4573:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4563:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32t_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4294:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4305:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4317:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4325:6:111","type":""}],"src":"4240:388:111"},{"body":{"nodeType":"YulBlock","src":"4734:125:111","statements":[{"nodeType":"YulAssignment","src":"4744:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4756:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4767:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4752:3:111"},"nodeType":"YulFunctionCall","src":"4752:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4744:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4786:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4801:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4809:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4797:3:111"},"nodeType":"YulFunctionCall","src":"4797:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4779:6:111"},"nodeType":"YulFunctionCall","src":"4779:74:111"},"nodeType":"YulExpressionStatement","src":"4779:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4703:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4714:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4725:4:111","type":""}],"src":"4633:226:111"},{"body":{"nodeType":"YulBlock","src":"5002:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5048:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5057:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5060:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5050:6:111"},"nodeType":"YulFunctionCall","src":"5050:12:111"},"nodeType":"YulExpressionStatement","src":"5050:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5023:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5032:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5019:3:111"},"nodeType":"YulFunctionCall","src":"5019:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5044:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5015:3:111"},"nodeType":"YulFunctionCall","src":"5015:32:111"},"nodeType":"YulIf","src":"5012:52:111"},{"nodeType":"YulVariableDeclaration","src":"5073:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5100:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5087:12:111"},"nodeType":"YulFunctionCall","src":"5087:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5077:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5153:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5162:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5165:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5155:6:111"},"nodeType":"YulFunctionCall","src":"5155:12:111"},"nodeType":"YulExpressionStatement","src":"5155:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5125:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5133:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5122:2:111"},"nodeType":"YulFunctionCall","src":"5122:30:111"},"nodeType":"YulIf","src":"5119:50:111"},{"nodeType":"YulVariableDeclaration","src":"5178:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5192:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5203:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5188:3:111"},"nodeType":"YulFunctionCall","src":"5188:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5182:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5251:6:111"},"nodeType":"YulFunctionCall","src":"5251:12:111"},"nodeType":"YulExpressionStatement","src":"5251:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5230:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5239:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5226:3:111"},"nodeType":"YulFunctionCall","src":"5226:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5244:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5222:3:111"},"nodeType":"YulFunctionCall","src":"5222:26:111"},"nodeType":"YulIf","src":"5219:46:111"},{"nodeType":"YulAssignment","src":"5274:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5284:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5274:6:111"}]},{"nodeType":"YulAssignment","src":"5295:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5322:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5333:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5318:3:111"},"nodeType":"YulFunctionCall","src":"5318:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5305:12:111"},"nodeType":"YulFunctionCall","src":"5305:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5295:6:111"}]},{"nodeType":"YulAssignment","src":"5346:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5373:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5384:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5369:3:111"},"nodeType":"YulFunctionCall","src":"5369:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5356:12:111"},"nodeType":"YulFunctionCall","src":"5356:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5346:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4952:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4963:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4975:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4983:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4991:6:111","type":""}],"src":"4864:530:111"},{"body":{"nodeType":"YulBlock","src":"5500:76:111","statements":[{"nodeType":"YulAssignment","src":"5510:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5522:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5533:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5518:3:111"},"nodeType":"YulFunctionCall","src":"5518:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5510:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5552:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5563:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5545:6:111"},"nodeType":"YulFunctionCall","src":"5545:25:111"},"nodeType":"YulExpressionStatement","src":"5545:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5469:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5480:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5491:4:111","type":""}],"src":"5399:177:111"},{"body":{"nodeType":"YulBlock","src":"5725:477:111","statements":[{"body":{"nodeType":"YulBlock","src":"5772:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5781:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5784:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5774:6:111"},"nodeType":"YulFunctionCall","src":"5774:12:111"},"nodeType":"YulExpressionStatement","src":"5774:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5746:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5755:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5742:3:111"},"nodeType":"YulFunctionCall","src":"5742:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5767:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5738:3:111"},"nodeType":"YulFunctionCall","src":"5738:33:111"},"nodeType":"YulIf","src":"5735:53:111"},{"nodeType":"YulAssignment","src":"5797:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5826:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"5807:18:111"},"nodeType":"YulFunctionCall","src":"5807:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5797:6:111"}]},{"nodeType":"YulAssignment","src":"5845:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5872:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5883:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5868:3:111"},"nodeType":"YulFunctionCall","src":"5868:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5855:12:111"},"nodeType":"YulFunctionCall","src":"5855:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5845:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"5896:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5927:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5938:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5923:3:111"},"nodeType":"YulFunctionCall","src":"5923:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5910:12:111"},"nodeType":"YulFunctionCall","src":"5910:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5900:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5985:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5994:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5997:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5987:6:111"},"nodeType":"YulFunctionCall","src":"5987:12:111"},"nodeType":"YulExpressionStatement","src":"5987:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5957:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5965:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5954:2:111"},"nodeType":"YulFunctionCall","src":"5954:30:111"},"nodeType":"YulIf","src":"5951:50:111"},{"nodeType":"YulAssignment","src":"6010:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6041:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6052:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6037:3:111"},"nodeType":"YulFunctionCall","src":"6037:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6061:7:111"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"6020:16:111"},"nodeType":"YulFunctionCall","src":"6020:49:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6010:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6078:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6108:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6119:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6104:3:111"},"nodeType":"YulFunctionCall","src":"6104:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6091:12:111"},"nodeType":"YulFunctionCall","src":"6091:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6082:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6156:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6165:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6168:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6158:6:111"},"nodeType":"YulFunctionCall","src":"6158:12:111"},"nodeType":"YulExpressionStatement","src":"6158:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6145:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"6152:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6142:2:111"},"nodeType":"YulFunctionCall","src":"6142:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6135:6:111"},"nodeType":"YulFunctionCall","src":"6135:20:111"},"nodeType":"YulIf","src":"6132:40:111"},{"nodeType":"YulAssignment","src":"6181:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6191:5:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"6181:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5667:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5678:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5690:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5698:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5706:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"5714:6:111","type":""}],"src":"5581:621:111"},{"body":{"nodeType":"YulBlock","src":"6260:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6270:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6279:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"6274:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6339:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6364:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6369:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6360:3:111"},"nodeType":"YulFunctionCall","src":"6360:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6383:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6388:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6379:3:111"},"nodeType":"YulFunctionCall","src":"6379:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6373:5:111"},"nodeType":"YulFunctionCall","src":"6373:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6353:6:111"},"nodeType":"YulFunctionCall","src":"6353:39:111"},"nodeType":"YulExpressionStatement","src":"6353:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6300:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6303:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6297:2:111"},"nodeType":"YulFunctionCall","src":"6297:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6311:19:111","statements":[{"nodeType":"YulAssignment","src":"6313:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6322:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6325:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6318:3:111"},"nodeType":"YulFunctionCall","src":"6318:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"6313:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6293:3:111","statements":[]},"src":"6289:113:111"},{"body":{"nodeType":"YulBlock","src":"6428:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6441:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"6446:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6437:3:111"},"nodeType":"YulFunctionCall","src":"6437:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6455:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6430:6:111"},"nodeType":"YulFunctionCall","src":"6430:27:111"},"nodeType":"YulExpressionStatement","src":"6430:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6417:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6420:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6414:2:111"},"nodeType":"YulFunctionCall","src":"6414:13:111"},"nodeType":"YulIf","src":"6411:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"6238:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"6243:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6248:6:111","type":""}],"src":"6207:258:111"},{"body":{"nodeType":"YulBlock","src":"6591:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6608:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6619:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6601:6:111"},"nodeType":"YulFunctionCall","src":"6601:21:111"},"nodeType":"YulExpressionStatement","src":"6601:21:111"},{"nodeType":"YulVariableDeclaration","src":"6631:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6651:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6645:5:111"},"nodeType":"YulFunctionCall","src":"6645:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"6635:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6678:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6689:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6674:3:111"},"nodeType":"YulFunctionCall","src":"6674:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"6694:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6667:6:111"},"nodeType":"YulFunctionCall","src":"6667:34:111"},"nodeType":"YulExpressionStatement","src":"6667:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6736:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6744:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6732:3:111"},"nodeType":"YulFunctionCall","src":"6732:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6753:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6764:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6749:3:111"},"nodeType":"YulFunctionCall","src":"6749:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"6769:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"6710:21:111"},"nodeType":"YulFunctionCall","src":"6710:66:111"},"nodeType":"YulExpressionStatement","src":"6710:66:111"},{"nodeType":"YulAssignment","src":"6785:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6801:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6820:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6828:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6816:3:111"},"nodeType":"YulFunctionCall","src":"6816:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"6833:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6812:3:111"},"nodeType":"YulFunctionCall","src":"6812:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6797:3:111"},"nodeType":"YulFunctionCall","src":"6797:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"6903:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6793:3:111"},"nodeType":"YulFunctionCall","src":"6793:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6785:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6560:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6571:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6582:4:111","type":""}],"src":"6470:442:111"},{"body":{"nodeType":"YulBlock","src":"7001:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"7050:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7059:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7062:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7052:6:111"},"nodeType":"YulFunctionCall","src":"7052:12:111"},"nodeType":"YulExpressionStatement","src":"7052:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7029:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7037:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7025:3:111"},"nodeType":"YulFunctionCall","src":"7025:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"7044:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7021:3:111"},"nodeType":"YulFunctionCall","src":"7021:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7014:6:111"},"nodeType":"YulFunctionCall","src":"7014:35:111"},"nodeType":"YulIf","src":"7011:55:111"},{"nodeType":"YulAssignment","src":"7075:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7098:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7085:12:111"},"nodeType":"YulFunctionCall","src":"7085:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"7075:6:111"}]},{"body":{"nodeType":"YulBlock","src":"7148:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7157:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7160:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7150:6:111"},"nodeType":"YulFunctionCall","src":"7150:12:111"},"nodeType":"YulExpressionStatement","src":"7150:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"7120:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7128:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7117:2:111"},"nodeType":"YulFunctionCall","src":"7117:30:111"},"nodeType":"YulIf","src":"7114:50:111"},{"nodeType":"YulAssignment","src":"7173:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7197:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7185:3:111"},"nodeType":"YulFunctionCall","src":"7185:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"7173:8:111"}]},{"body":{"nodeType":"YulBlock","src":"7262:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7271:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7274:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7264:6:111"},"nodeType":"YulFunctionCall","src":"7264:12:111"},"nodeType":"YulExpressionStatement","src":"7264:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7225:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7237:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"7240:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"7233:3:111"},"nodeType":"YulFunctionCall","src":"7233:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7221:3:111"},"nodeType":"YulFunctionCall","src":"7221:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"7250:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7217:3:111"},"nodeType":"YulFunctionCall","src":"7217:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"7257:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7214:2:111"},"nodeType":"YulFunctionCall","src":"7214:47:111"},"nodeType":"YulIf","src":"7211:67:111"}]},"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"6964:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"6972:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"6980:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6990:6:111","type":""}],"src":"6917:367:111"},{"body":{"nodeType":"YulBlock","src":"7516:983:111","statements":[{"body":{"nodeType":"YulBlock","src":"7563:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7572:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7575:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7565:6:111"},"nodeType":"YulFunctionCall","src":"7565:12:111"},"nodeType":"YulExpressionStatement","src":"7565:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7537:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7546:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7533:3:111"},"nodeType":"YulFunctionCall","src":"7533:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7558:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7529:3:111"},"nodeType":"YulFunctionCall","src":"7529:33:111"},"nodeType":"YulIf","src":"7526:53:111"},{"nodeType":"YulAssignment","src":"7588:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7617:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"7598:18:111"},"nodeType":"YulFunctionCall","src":"7598:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7588:6:111"}]},{"nodeType":"YulAssignment","src":"7636:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7669:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7680:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7665:3:111"},"nodeType":"YulFunctionCall","src":"7665:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"7646:18:111"},"nodeType":"YulFunctionCall","src":"7646:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7636:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7693:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7724:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7735:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7720:3:111"},"nodeType":"YulFunctionCall","src":"7720:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7707:12:111"},"nodeType":"YulFunctionCall","src":"7707:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7697:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7748:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7758:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7752:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7803:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7812:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7815:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7805:6:111"},"nodeType":"YulFunctionCall","src":"7805:12:111"},"nodeType":"YulExpressionStatement","src":"7805:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7791:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7799:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7788:2:111"},"nodeType":"YulFunctionCall","src":"7788:14:111"},"nodeType":"YulIf","src":"7785:34:111"},{"nodeType":"YulVariableDeclaration","src":"7828:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7896:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"7907:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7892:3:111"},"nodeType":"YulFunctionCall","src":"7892:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7916:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"7854:37:111"},"nodeType":"YulFunctionCall","src":"7854:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"7832:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"7842:8:111","type":""}]},{"nodeType":"YulAssignment","src":"7933:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"7943:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"7933:6:111"}]},{"nodeType":"YulAssignment","src":"7960:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"7970:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"7960:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"7987:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8020:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8031:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8016:3:111"},"nodeType":"YulFunctionCall","src":"8016:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8003:12:111"},"nodeType":"YulFunctionCall","src":"8003:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"7991:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8064:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8073:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8076:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8066:6:111"},"nodeType":"YulFunctionCall","src":"8066:12:111"},"nodeType":"YulExpressionStatement","src":"8066:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"8050:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8060:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8047:2:111"},"nodeType":"YulFunctionCall","src":"8047:16:111"},"nodeType":"YulIf","src":"8044:36:111"},{"nodeType":"YulVariableDeclaration","src":"8089:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8157:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"8168:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8153:3:111"},"nodeType":"YulFunctionCall","src":"8153:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8179:7:111"}],"functionName":{"name":"abi_decode_array_uint256_dyn_calldata","nodeType":"YulIdentifier","src":"8115:37:111"},"nodeType":"YulFunctionCall","src":"8115:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"8093:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"8103:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8196:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"8206:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"8196:6:111"}]},{"nodeType":"YulAssignment","src":"8223:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"8233:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"8223:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8250:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8283:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8294:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8279:3:111"},"nodeType":"YulFunctionCall","src":"8279:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8266:12:111"},"nodeType":"YulFunctionCall","src":"8266:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"8254:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8330:6:111"},"nodeType":"YulFunctionCall","src":"8330:12:111"},"nodeType":"YulExpressionStatement","src":"8330:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"8314:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8324:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8311:2:111"},"nodeType":"YulFunctionCall","src":"8311:16:111"},"nodeType":"YulIf","src":"8308:36:111"},{"nodeType":"YulVariableDeclaration","src":"8353:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8409:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"8420:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8405:3:111"},"nodeType":"YulFunctionCall","src":"8405:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8431:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8379:25:111"},"nodeType":"YulFunctionCall","src":"8379:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"8357:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"8367:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8448:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"8458:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"8448:6:111"}]},{"nodeType":"YulAssignment","src":"8475:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"8485:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"8475:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7426:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7437:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7449:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7457:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7465:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7473:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"7481:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"7489:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"7497:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"7505:6:111","type":""}],"src":"7289:1210:111"},{"body":{"nodeType":"YulBlock","src":"8661:538:111","statements":[{"body":{"nodeType":"YulBlock","src":"8708:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8717:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8720:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8710:6:111"},"nodeType":"YulFunctionCall","src":"8710:12:111"},"nodeType":"YulExpressionStatement","src":"8710:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8682:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8691:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8678:3:111"},"nodeType":"YulFunctionCall","src":"8678:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8703:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8674:3:111"},"nodeType":"YulFunctionCall","src":"8674:33:111"},"nodeType":"YulIf","src":"8671:53:111"},{"nodeType":"YulAssignment","src":"8733:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8762:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"8743:18:111"},"nodeType":"YulFunctionCall","src":"8743:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8733:6:111"}]},{"nodeType":"YulAssignment","src":"8781:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8814:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8825:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8810:3:111"},"nodeType":"YulFunctionCall","src":"8810:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"8791:18:111"},"nodeType":"YulFunctionCall","src":"8791:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8781:6:111"}]},{"nodeType":"YulAssignment","src":"8838:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8865:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8876:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8861:3:111"},"nodeType":"YulFunctionCall","src":"8861:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8848:12:111"},"nodeType":"YulFunctionCall","src":"8848:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8838:6:111"}]},{"nodeType":"YulAssignment","src":"8889:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8916:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8927:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8912:3:111"},"nodeType":"YulFunctionCall","src":"8912:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8899:12:111"},"nodeType":"YulFunctionCall","src":"8899:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8889:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8940:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8971:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8982:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8967:3:111"},"nodeType":"YulFunctionCall","src":"8967:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8954:12:111"},"nodeType":"YulFunctionCall","src":"8954:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8944:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9030:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9039:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9042:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9032:6:111"},"nodeType":"YulFunctionCall","src":"9032:12:111"},"nodeType":"YulExpressionStatement","src":"9032:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9002:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9010:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8999:2:111"},"nodeType":"YulFunctionCall","src":"8999:30:111"},"nodeType":"YulIf","src":"8996:50:111"},{"nodeType":"YulVariableDeclaration","src":"9055:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9111:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9122:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9107:3:111"},"nodeType":"YulFunctionCall","src":"9107:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9131:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9081:25:111"},"nodeType":"YulFunctionCall","src":"9081:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"9059:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"9069:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9148:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9158:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9148:6:111"}]},{"nodeType":"YulAssignment","src":"9175:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"9185:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"9175:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8587:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8598:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8610:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8618:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8626:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8634:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8642:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"8650:6:111","type":""}],"src":"8504:695:111"},{"body":{"nodeType":"YulBlock","src":"9261:107:111","statements":[{"nodeType":"YulAssignment","src":"9271:22:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9286:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9280:5:111"},"nodeType":"YulFunctionCall","src":"9280:13:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"9271:5:111"}]},{"body":{"nodeType":"YulBlock","src":"9346:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9355:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9358:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9348:6:111"},"nodeType":"YulFunctionCall","src":"9348:12:111"},"nodeType":"YulExpressionStatement","src":"9348:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9315:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9336:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9329:6:111"},"nodeType":"YulFunctionCall","src":"9329:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9322:6:111"},"nodeType":"YulFunctionCall","src":"9322:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"9312:2:111"},"nodeType":"YulFunctionCall","src":"9312:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9305:6:111"},"nodeType":"YulFunctionCall","src":"9305:40:111"},"nodeType":"YulIf","src":"9302:60:111"}]},"name":"abi_decode_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"9240:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"9251:5:111","type":""}],"src":"9204:164:111"},{"body":{"nodeType":"YulBlock","src":"9451:124:111","statements":[{"body":{"nodeType":"YulBlock","src":"9497:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9506:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9509:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9499:6:111"},"nodeType":"YulFunctionCall","src":"9499:12:111"},"nodeType":"YulExpressionStatement","src":"9499:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9472:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9481:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9468:3:111"},"nodeType":"YulFunctionCall","src":"9468:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9493:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9464:3:111"},"nodeType":"YulFunctionCall","src":"9464:32:111"},"nodeType":"YulIf","src":"9461:52:111"},{"nodeType":"YulAssignment","src":"9522:47:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9559:9:111"}],"functionName":{"name":"abi_decode_bool_fromMemory","nodeType":"YulIdentifier","src":"9532:26:111"},"nodeType":"YulFunctionCall","src":"9532:37:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9522:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9417:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9428:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9440:6:111","type":""}],"src":"9373:202:111"},{"body":{"nodeType":"YulBlock","src":"9661:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"9707:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9716:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9719:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9709:6:111"},"nodeType":"YulFunctionCall","src":"9709:12:111"},"nodeType":"YulExpressionStatement","src":"9709:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9682:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9691:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9678:3:111"},"nodeType":"YulFunctionCall","src":"9678:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9703:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9674:3:111"},"nodeType":"YulFunctionCall","src":"9674:32:111"},"nodeType":"YulIf","src":"9671:52:111"},{"nodeType":"YulAssignment","src":"9732:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9748:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9742:5:111"},"nodeType":"YulFunctionCall","src":"9742:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9732:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9627:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9638:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9650:6:111","type":""}],"src":"9580:184:111"},{"body":{"nodeType":"YulBlock","src":"9989:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10006:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10011:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9999:6:111"},"nodeType":"YulFunctionCall","src":"9999:79:111"},"nodeType":"YulExpressionStatement","src":"9999:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10098:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10103:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10094:3:111"},"nodeType":"YulFunctionCall","src":"10094:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"10108:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10087:6:111"},"nodeType":"YulFunctionCall","src":"10087:28:111"},"nodeType":"YulExpressionStatement","src":"10087:28:111"},{"nodeType":"YulAssignment","src":"10124:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10135:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10140:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10131:3:111"},"nodeType":"YulFunctionCall","src":"10131:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"10124:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"9965:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9970:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"9981:3:111","type":""}],"src":"9769:380:111"},{"body":{"nodeType":"YulBlock","src":"10186:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10203:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10206:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10196:6:111"},"nodeType":"YulFunctionCall","src":"10196:88:111"},"nodeType":"YulExpressionStatement","src":"10196:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10300:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"10303:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10293:6:111"},"nodeType":"YulFunctionCall","src":"10293:15:111"},"nodeType":"YulExpressionStatement","src":"10293:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10324:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10327:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10317:6:111"},"nodeType":"YulFunctionCall","src":"10317:15:111"},"nodeType":"YulExpressionStatement","src":"10317:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"10154:184:111"},{"body":{"nodeType":"YulBlock","src":"10576:711:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10593:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10608:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10616:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10604:3:111"},"nodeType":"YulFunctionCall","src":"10604:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10586:6:111"},"nodeType":"YulFunctionCall","src":"10586:74:111"},"nodeType":"YulExpressionStatement","src":"10586:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10680:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10691:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10676:3:111"},"nodeType":"YulFunctionCall","src":"10676:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"10696:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10669:6:111"},"nodeType":"YulFunctionCall","src":"10669:34:111"},"nodeType":"YulExpressionStatement","src":"10669:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10734:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10719:3:111"},"nodeType":"YulFunctionCall","src":"10719:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10739:3:111","type":"","value":"128"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10712:6:111"},"nodeType":"YulFunctionCall","src":"10712:31:111"},"nodeType":"YulExpressionStatement","src":"10712:31:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10774:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10759:3:111"},"nodeType":"YulFunctionCall","src":"10759:19:111"},{"name":"value3","nodeType":"YulIdentifier","src":"10780:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10752:6:111"},"nodeType":"YulFunctionCall","src":"10752:35:111"},"nodeType":"YulExpressionStatement","src":"10752:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10813:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10824:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10809:3:111"},"nodeType":"YulFunctionCall","src":"10809:19:111"},{"name":"value2","nodeType":"YulIdentifier","src":"10830:6:111"},{"name":"value3","nodeType":"YulIdentifier","src":"10838:6:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"10796:12:111"},"nodeType":"YulFunctionCall","src":"10796:49:111"},"nodeType":"YulExpressionStatement","src":"10796:49:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10869:9:111"},{"name":"value3","nodeType":"YulIdentifier","src":"10880:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10865:3:111"},"nodeType":"YulFunctionCall","src":"10865:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"10889:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10861:3:111"},"nodeType":"YulFunctionCall","src":"10861:32:111"},{"kind":"number","nodeType":"YulLiteral","src":"10895:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10854:6:111"},"nodeType":"YulFunctionCall","src":"10854:43:111"},"nodeType":"YulExpressionStatement","src":"10854:43:111"},{"nodeType":"YulAssignment","src":"10906:122:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10922:9:111"},{"arguments":[{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"10941:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10949:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10937:3:111"},"nodeType":"YulFunctionCall","src":"10937:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"10954:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10933:3:111"},"nodeType":"YulFunctionCall","src":"10933:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10918:3:111"},"nodeType":"YulFunctionCall","src":"10918:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"11024:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10914:3:111"},"nodeType":"YulFunctionCall","src":"10914:114:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10906:4:111"}]},{"body":{"nodeType":"YulBlock","src":"11070:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11091:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11094:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11084:6:111"},"nodeType":"YulFunctionCall","src":"11084:88:111"},"nodeType":"YulExpressionStatement","src":"11084:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11192:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11195:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11185:6:111"},"nodeType":"YulFunctionCall","src":"11185:15:111"},"nodeType":"YulExpressionStatement","src":"11185:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11220:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11223:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11213:6:111"},"nodeType":"YulFunctionCall","src":"11213:15:111"},"nodeType":"YulExpressionStatement","src":"11213:15:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"11050:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11058:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11047:2:111"},"nodeType":"YulFunctionCall","src":"11047:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11040:6:111"},"nodeType":"YulFunctionCall","src":"11040:21:111"},"nodeType":"YulIf","src":"11037:201:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11258:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11269:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11254:3:111"},"nodeType":"YulFunctionCall","src":"11254:18:111"},{"name":"value4","nodeType":"YulIdentifier","src":"11274:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11247:6:111"},"nodeType":"YulFunctionCall","src":"11247:34:111"},"nodeType":"YulExpressionStatement","src":"11247:34:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1_t_bytes_calldata_ptr_t_enum$_Operation_$1997__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10513:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"10524:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"10532:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10540:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10548:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10556:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10567:4:111","type":""}],"src":"10343:944:111"},{"body":{"nodeType":"YulBlock","src":"11396:609:111","statements":[{"body":{"nodeType":"YulBlock","src":"11442:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11451:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11454:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11444:6:111"},"nodeType":"YulFunctionCall","src":"11444:12:111"},"nodeType":"YulExpressionStatement","src":"11444:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11417:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11426:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11413:3:111"},"nodeType":"YulFunctionCall","src":"11413:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11438:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11409:3:111"},"nodeType":"YulFunctionCall","src":"11409:32:111"},"nodeType":"YulIf","src":"11406:52:111"},{"nodeType":"YulAssignment","src":"11467:47:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11504:9:111"}],"functionName":{"name":"abi_decode_bool_fromMemory","nodeType":"YulIdentifier","src":"11477:26:111"},"nodeType":"YulFunctionCall","src":"11477:37:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11467:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11523:39:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11547:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11558:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11543:3:111"},"nodeType":"YulFunctionCall","src":"11543:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11537:5:111"},"nodeType":"YulFunctionCall","src":"11537:25:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"11527:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11605:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11614:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11617:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11607:6:111"},"nodeType":"YulFunctionCall","src":"11607:12:111"},"nodeType":"YulExpressionStatement","src":"11607:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"11577:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11585:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11574:2:111"},"nodeType":"YulFunctionCall","src":"11574:30:111"},"nodeType":"YulIf","src":"11571:50:111"},{"nodeType":"YulVariableDeclaration","src":"11630:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11644:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11655:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11640:3:111"},"nodeType":"YulFunctionCall","src":"11640:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11634:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11710:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11719:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11722:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11712:6:111"},"nodeType":"YulFunctionCall","src":"11712:12:111"},"nodeType":"YulExpressionStatement","src":"11712:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"11689:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"11693:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11685:3:111"},"nodeType":"YulFunctionCall","src":"11685:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11700:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11681:3:111"},"nodeType":"YulFunctionCall","src":"11681:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11674:6:111"},"nodeType":"YulFunctionCall","src":"11674:35:111"},"nodeType":"YulIf","src":"11671:55:111"},{"nodeType":"YulVariableDeclaration","src":"11735:19:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"11751:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11745:5:111"},"nodeType":"YulFunctionCall","src":"11745:9:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"11739:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11763:61:111","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"11820:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"11792:27:111"},"nodeType":"YulFunctionCall","src":"11792:31:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"11776:15:111"},"nodeType":"YulFunctionCall","src":"11776:48:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"11767:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"11840:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"11847:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11833:6:111"},"nodeType":"YulFunctionCall","src":"11833:17:111"},"nodeType":"YulExpressionStatement","src":"11833:17:111"},{"body":{"nodeType":"YulBlock","src":"11896:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11905:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11908:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11898:6:111"},"nodeType":"YulFunctionCall","src":"11898:12:111"},"nodeType":"YulExpressionStatement","src":"11898:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"11873:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"11877:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11869:3:111"},"nodeType":"YulFunctionCall","src":"11869:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"11882:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11865:3:111"},"nodeType":"YulFunctionCall","src":"11865:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11887:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11862:2:111"},"nodeType":"YulFunctionCall","src":"11862:33:111"},"nodeType":"YulIf","src":"11859:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"11947:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"11951:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11943:3:111"},"nodeType":"YulFunctionCall","src":"11943:11:111"},{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"11960:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11967:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11956:3:111"},"nodeType":"YulFunctionCall","src":"11956:14:111"},{"name":"_2","nodeType":"YulIdentifier","src":"11972:2:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"11921:21:111"},"nodeType":"YulFunctionCall","src":"11921:54:111"},"nodeType":"YulExpressionStatement","src":"11921:54:111"},{"nodeType":"YulAssignment","src":"11984:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"11994:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"11984:6:111"}]}]},"name":"abi_decode_tuple_t_boolt_bytes_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11354:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11365:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11377:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11385:6:111","type":""}],"src":"11292:713:111"},{"body":{"nodeType":"YulBlock","src":"12184:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12201:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12212:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12194:6:111"},"nodeType":"YulFunctionCall","src":"12194:21:111"},"nodeType":"YulExpressionStatement","src":"12194:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12235:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12246:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12231:3:111"},"nodeType":"YulFunctionCall","src":"12231:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12251:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12224:6:111"},"nodeType":"YulFunctionCall","src":"12224:30:111"},"nodeType":"YulExpressionStatement","src":"12224:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12285:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12270:3:111"},"nodeType":"YulFunctionCall","src":"12270:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"12290:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12263:6:111"},"nodeType":"YulFunctionCall","src":"12263:54:111"},"nodeType":"YulExpressionStatement","src":"12263:54:111"},{"nodeType":"YulAssignment","src":"12326:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12338:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12349:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12334:3:111"},"nodeType":"YulFunctionCall","src":"12334:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12326:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12161:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12175:4:111","type":""}],"src":"12010:348:111"},{"body":{"nodeType":"YulBlock","src":"12537:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12554:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12565:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12547:6:111"},"nodeType":"YulFunctionCall","src":"12547:21:111"},"nodeType":"YulExpressionStatement","src":"12547:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12588:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12599:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12584:3:111"},"nodeType":"YulFunctionCall","src":"12584:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12604:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12577:6:111"},"nodeType":"YulFunctionCall","src":"12577:30:111"},"nodeType":"YulExpressionStatement","src":"12577:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12627:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12638:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12623:3:111"},"nodeType":"YulFunctionCall","src":"12623:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"12643:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12616:6:111"},"nodeType":"YulFunctionCall","src":"12616:61:111"},"nodeType":"YulExpressionStatement","src":"12616:61:111"},{"nodeType":"YulAssignment","src":"12686:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12698:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12709:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12694:3:111"},"nodeType":"YulFunctionCall","src":"12694:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12686:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12514:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12528:4:111","type":""}],"src":"12363:355:111"},{"body":{"nodeType":"YulBlock","src":"12897:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12914:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12925:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12907:6:111"},"nodeType":"YulFunctionCall","src":"12907:21:111"},"nodeType":"YulExpressionStatement","src":"12907:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12948:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12959:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12944:3:111"},"nodeType":"YulFunctionCall","src":"12944:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12964:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12937:6:111"},"nodeType":"YulFunctionCall","src":"12937:30:111"},"nodeType":"YulExpressionStatement","src":"12937:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12987:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12998:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12983:3:111"},"nodeType":"YulFunctionCall","src":"12983:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"13003:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12976:6:111"},"nodeType":"YulFunctionCall","src":"12976:62:111"},"nodeType":"YulExpressionStatement","src":"12976:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13058:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13069:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13054:3:111"},"nodeType":"YulFunctionCall","src":"13054:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"13074:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13047:6:111"},"nodeType":"YulFunctionCall","src":"13047:32:111"},"nodeType":"YulExpressionStatement","src":"13047:32:111"},{"nodeType":"YulAssignment","src":"13088:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13100:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13111:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13096:3:111"},"nodeType":"YulFunctionCall","src":"13096:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13088:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12874:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12888:4:111","type":""}],"src":"12723:398:111"},{"body":{"nodeType":"YulBlock","src":"13307:217:111","statements":[{"nodeType":"YulAssignment","src":"13317:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13329:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13340:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13325:3:111"},"nodeType":"YulFunctionCall","src":"13325:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13317:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13360:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"13371:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13353:6:111"},"nodeType":"YulFunctionCall","src":"13353:25:111"},"nodeType":"YulExpressionStatement","src":"13353:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13398:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13409:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13394:3:111"},"nodeType":"YulFunctionCall","src":"13394:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"13418:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13426:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13414:3:111"},"nodeType":"YulFunctionCall","src":"13414:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13387:6:111"},"nodeType":"YulFunctionCall","src":"13387:45:111"},"nodeType":"YulExpressionStatement","src":"13387:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13452:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13463:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13448:3:111"},"nodeType":"YulFunctionCall","src":"13448:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"13468:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13441:6:111"},"nodeType":"YulFunctionCall","src":"13441:34:111"},"nodeType":"YulExpressionStatement","src":"13441:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13495:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13506:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13491:3:111"},"nodeType":"YulFunctionCall","src":"13491:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"13511:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13484:6:111"},"nodeType":"YulFunctionCall","src":"13484:34:111"},"nodeType":"YulExpressionStatement","src":"13484:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13252:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"13263:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13271:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13279:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13287:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13298:4:111","type":""}],"src":"13126:398:111"}]},"contents":"{\n { }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := abi_decode_address(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_bytes(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x20)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let array_1 := allocate_memory(array_allocation_size_bytes(_1))\n mstore(array_1, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(array_1, 0x20), add(offset, 0x20), _1)\n mstore(add(add(array_1, _1), 0x20), 0)\n array := array_1\n }\n function abi_decode_tuple_t_bytes32t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value1 := abi_decode_bytes(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value2 := abi_decode_bytes(add(headStart, offset), dataEnd)\n let value := calldataload(add(headStart, 96))\n if iszero(lt(value, 2)) { revert(0, 0) }\n value3 := value\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function abi_decode_array_uint256_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_uint256_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_decode_bool_fromMemory(offset) -> value\n {\n value := mload(offset)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_bool_fromMemory(headStart)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1_t_bytes_calldata_ptr_t_enum$_Operation_$1997__to_t_address_t_uint256_t_bytes_memory_ptr_t_uint8__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), 128)\n mstore(add(headStart, 128), value3)\n calldatacopy(add(headStart, 160), value2, value3)\n mstore(add(add(headStart, value3), 160), 0)\n tail := add(add(headStart, and(add(value3, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 160)\n if iszero(lt(value4, 2))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n mstore(add(headStart, 96), value4)\n }\n function abi_decode_tuple_t_boolt_bytes_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_bool_fromMemory(headStart)\n let offset := mload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n let _2 := mload(_1)\n let array := allocate_memory(array_allocation_size_bytes(_2))\n mstore(array, _2)\n if gt(add(add(_1, _2), 32), dataEnd) { revert(0, 0) }\n copy_memory_to_memory(add(_1, 32), add(array, 32), _2)\n value1 := array\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"17960":[{"length":32,"start":411},{"length":32,"start":1558}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100d35760003560e01c8063940d3c6011610081578063d087d2881161005b578063d087d2881461029a578063f23a6e61146102a2578063ffa1ad74146102db57600080fd5b8063940d3c6014610203578063a3f4df7e14610216578063bc197c811461025f57600080fd5b80631626ba7e116100b25780631626ba7e146101835780632bcadc24146101965780633a871cdd146101e257600080fd5b806223de29146100d857806301ffc9a7146100f2578063150b7a021461011a575b600080fd5b6100f06100e63660046109e2565b5050505050505050565b005b610105610100366004610a8d565b610317565b60405190151581526020015b60405180910390f35b610152610128366004610acf565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610111565b610152610191366004610c1c565b6103fc565b6101bd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b6101f56101f0366004610c63565b610554565b604051908152602001610111565b6100f0610211366004610cb7565b61057e565b6102526040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516101119190610d55565b61015261026d366004610dcd565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6101f561058d565b6101526102b0366004610e67565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6102526040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103aa57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806103f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080610456846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061046482856105b4565b6040517f2f54bf6e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015290915033908190632f54bf6e90602401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f79190610eef565b1561052857507f1626ba7e0000000000000000000000000000000000000000000000000000000092506103f6915050565b507fffffffff0000000000000000000000000000000000000000000000000000000092506103f6915050565b60008061055f6105d8565b9050808060200190518101906105759190610f0a565b95945050505050565b6105866105d8565b5050505050565b6000806105986105d8565b9050808060200190518101906105ae9190610f0a565b91505090565b60008060006105c385856106a6565b915091506105d0816106eb565b509392505050565b6040517f5229073f000000000000000000000000000000000000000000000000000000008152606090339060009081908390635229073f90610647907f000000000000000000000000000000000000000000000000000000000000000090859081903690600190600401610f52565b6000604051808303816000875af1158015610666573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261068e9190810190610fe6565b915091508161069f57805160208201fd5b9392505050565b60008082516041036106dc5760208301516040840151606085015160001a6106d0878285856108a6565b945094505050506106e4565b506000905060025b9250929050565b60008160048111156106ff576106ff610f23565b036107075750565b600181600481111561071b5761071b610f23565b03610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561079b5761079b610f23565b03610802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161077e565b600381600481111561081657610816610f23565b036108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161077e565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108dd575060009050600361096e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610931573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff81166109675760006001925092505061096e565b9150600090505b94509492505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099b57600080fd5b919050565b60008083601f8401126109b257600080fd5b50813567ffffffffffffffff8111156109ca57600080fd5b6020830191508360208285010111156106e457600080fd5b60008060008060008060008060c0898b0312156109fe57600080fd5b610a0789610977565b9750610a1560208a01610977565b9650610a2360408a01610977565b955060608901359450608089013567ffffffffffffffff80821115610a4757600080fd5b610a538c838d016109a0565b909650945060a08b0135915080821115610a6c57600080fd5b50610a798b828c016109a0565b999c989b5096995094979396929594505050565b600060208284031215610a9f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461069f57600080fd5b600080600080600060808688031215610ae757600080fd5b610af086610977565b9450610afe60208701610977565b935060408601359250606086013567ffffffffffffffff811115610b2157600080fd5b610b2d888289016109a0565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610b9657610b96610b3e565b604052919050565b600067ffffffffffffffff821115610bb857610bb8610b3e565b50601f01601f191660200190565b600082601f830112610bd757600080fd5b8135610bea610be582610b9e565b610b6d565b818152846020838601011115610bff57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610c2f57600080fd5b82359150602083013567ffffffffffffffff811115610c4d57600080fd5b610c5985828601610bc6565b9150509250929050565b600080600060608486031215610c7857600080fd5b833567ffffffffffffffff811115610c8f57600080fd5b84016101608187031215610ca257600080fd5b95602085013595506040909401359392505050565b60008060008060808587031215610ccd57600080fd5b610cd685610977565b935060208501359250604085013567ffffffffffffffff811115610cf957600080fd5b610d0587828801610bc6565b925050606085013560028110610d1a57600080fd5b939692955090935050565b60005b83811015610d40578181015183820152602001610d28565b83811115610d4f576000848401525b50505050565b6020815260008251806020840152610d74816040850160208701610d25565b601f01601f19169190910160400192915050565b60008083601f840112610d9a57600080fd5b50813567ffffffffffffffff811115610db257600080fd5b6020830191508360208260051b85010111156106e457600080fd5b60008060008060008060008060a0898b031215610de957600080fd5b610df289610977565b9750610e0060208a01610977565b9650604089013567ffffffffffffffff80821115610e1d57600080fd5b610e298c838d01610d88565b909850965060608b0135915080821115610e4257600080fd5b610e4e8c838d01610d88565b909650945060808b0135915080821115610a6c57600080fd5b60008060008060008060a08789031215610e8057600080fd5b610e8987610977565b9550610e9760208801610977565b94506040870135935060608701359250608087013567ffffffffffffffff811115610ec157600080fd5b610ecd89828a016109a0565b979a9699509497509295939492505050565b8051801515811461099b57600080fd5b600060208284031215610f0157600080fd5b61069f82610edf565b600060208284031215610f1c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260806040820152826080820152828460a0830137600060a08483010152600060a0601f19601f860116830101905060028310610fd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8260608301529695505050505050565b60008060408385031215610ff957600080fd5b61100283610edf565b9150602083015167ffffffffffffffff81111561101e57600080fd5b8301601f8101851361102f57600080fd5b805161103d610be582610b9e565b81815286602083850101111561105257600080fd5b611063826020830160208601610d25565b809350505050925092905056fea2646970667358221220e7c4038a3ff6cd21c2c03e0b55e354d7463455235f93344fcb5299141d1f34d064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x940D3C60 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xD087D288 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x2A2 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x940D3C60 EQ PUSH2 0x203 JUMPI DUP1 PUSH4 0xA3F4DF7E EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1626BA7E GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x183 JUMPI DUP1 PUSH4 0x2BCADC24 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x1E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0xD8 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xF2 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x11A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF0 PUSH2 0xE6 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E2 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0x105 PUSH2 0x100 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8D JUMP JUMPDEST PUSH2 0x317 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x152 PUSH2 0x128 CALLDATASIZE PUSH1 0x4 PUSH2 0xACF JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x191 CALLDATASIZE PUSH1 0x4 PUSH2 0xC1C JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST PUSH2 0x1BD PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0xC63 JUMP JUMPDEST PUSH2 0x554 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0xF0 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0xCB7 JUMP JUMPDEST PUSH2 0x57E JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x44656661756C742043616C6C6261636B2048616E646C65720000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x111 SWAP2 SWAP1 PUSH2 0xD55 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x26D CALLDATASIZE PUSH1 0x4 PUSH2 0xDCD JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x58D JUMP JUMPDEST PUSH2 0x152 PUSH2 0x2B0 CALLDATASIZE PUSH1 0x4 PUSH2 0xE67 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x3AA JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x3F6 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x456 DUP5 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x464 DUP3 DUP6 PUSH2 0x5B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2F54BF6E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 SWAP2 POP CALLER SWAP1 DUP2 SWAP1 PUSH4 0x2F54BF6E SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4F7 SWAP2 SWAP1 PUSH2 0xEEF JUMP JUMPDEST ISZERO PUSH2 0x528 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x55F PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x575 SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x586 PUSH2 0x5D8 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x598 PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x5AE SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x5C3 DUP6 DUP6 PUSH2 0x6A6 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x5D0 DUP2 PUSH2 0x6EB JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x5229073F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 CALLER SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 SWAP1 PUSH4 0x5229073F SWAP1 PUSH2 0x647 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 DUP2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0xF52 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x666 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x68E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xFE6 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x69F JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x6DC JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x6D0 DUP8 DUP3 DUP6 DUP6 PUSH2 0x8A6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x6E4 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x6FF JUMPI PUSH2 0x6FF PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x707 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x71B JUMPI PUSH2 0x71B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x787 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x79B JUMPI PUSH2 0x79B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x802 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x77E JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH2 0x816 PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x8A3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x77E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x8DD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x96E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x931 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x967 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x96E JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x9B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x9FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA07 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xA15 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH2 0xA23 PUSH1 0x40 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA53 DUP13 DUP4 DUP14 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA79 DUP12 DUP3 DUP13 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xAE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAF0 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH2 0xAFE PUSH1 0x20 DUP8 ADD PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB2D DUP9 DUP3 DUP10 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB96 JUMPI PUSH2 0xB96 PUSH2 0xB3E JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xBB8 JUMPI PUSH2 0xBB8 PUSH2 0xB3E JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xBD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xBEA PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST PUSH2 0xB6D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xBFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC2F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC59 DUP6 DUP3 DUP7 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xCA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xCCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xCD6 DUP6 PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD05 DUP8 DUP3 DUP9 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0xD1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD40 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD28 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD4F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xD74 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0xD25 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xDB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0xDE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF2 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xE00 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE29 DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xE42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE4E DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE89 DUP8 PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH2 0xE97 PUSH1 0x20 DUP9 ADD PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xECD DUP10 DUP3 DUP11 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x69F DUP3 PUSH2 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP2 MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD MSTORE DUP3 PUSH1 0x80 DUP3 ADD MSTORE DUP3 DUP5 PUSH1 0xA0 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0xA0 DUP5 DUP4 ADD ADD MSTORE PUSH1 0x0 PUSH1 0xA0 PUSH1 0x1F NOT PUSH1 0x1F DUP7 ADD AND DUP4 ADD ADD SWAP1 POP PUSH1 0x2 DUP4 LT PUSH2 0xFD6 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1002 DUP4 PUSH2 0xEDF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x102F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x103D PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP2 DUP2 MSTORE DUP7 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x1052 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1063 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xD25 JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE7 0xC4 SUB DUP11 EXTCODEHASH 0xF6 0xCD 0x21 0xC2 0xC0 RETURNDATACOPY SIGNEXTEND SSTORE 0xE3 SLOAD 0xD7 CHAINID CALLVALUE SSTORE 0x23 0x5F SWAP4 CALLVALUE 0x4F 0xCB MSTORE SWAP10 EQ SAR 0x1F CALLVALUE 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"879:2164:87:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1235:253:15;;;;;;:::i;:::-;;;;;;;;;;;;1494:306;;;;;;:::i;:::-;;:::i;:::-;;;2084:14:111;;2077:22;2059:41;;2047:2;2032:18;1494:306:15;;;;;;;;1048:181;;;;;;:::i;:::-;1205:17;1048:181;;;;;;;;;;;2916:66:111;2904:79;;;2886:98;;2874:2;2859:18;1048:181:15;2742:248:111;2559:482:87;;;;;;:::i;:::-;;:::i;1020:39::-;;;;;;;;4809:42:111;4797:55;;;4779:74;;4767:2;4752:18;1020:39:87;4633:226:111;1876:208:87;;;;;;:::i;:::-;;:::i;:::-;;;5545:25:111;;;5533:2;5518:18;1876:208:87;5399:177:111;2396:157:87;;;;;;:::i;:::-;;:::i;502:56:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;816:226::-;;;;;;:::i;:::-;1018:17;816:226;;;;;;;;;;;2154:152:87;;;:::i;611:199:15:-;;;;;;:::i;:::-;786:17;611:199;;;;;;;;;564:40;;;;;;;;;;;;;;;;;;;;;1494:306;1581:4;1616:53;;;1631:38;1616:53;;:121;;-1:-1:-1;1685:52:15;;;1700:37;1685:52;1616:121;:177;;;-1:-1:-1;1753:40:15;;;1768:25;1753:40;1616:177;1597:196;1494:306;-1:-1:-1;;1494:306:15:o;2559:482:87:-;2679:6;2697:12;2712:30;:5;7455:58:47;;10011:66:111;7455:58:47;;;9999:79:111;10094:12;;;10087:28;;;7325:7:47;;10131:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;2712:30:87;2697:45;-1:-1:-1;2752:17:87;2772:24;2697:45;2785:10;2772:12;:24::i;:::-;2911:23;;;;;4809:42:111;4797:55;;2911:23:87;;;4779:74:111;2752:44:87;;-1:-1:-1;2852:10:87;;;;2911:12;;4752:18:111;;2911:23:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2907:128;;;-1:-1:-1;2957:19:87;;-1:-1:-1;2950:26:87;;-1:-1:-1;;2950:26:87;2907:128;-1:-1:-1;3007:17:87;;-1:-1:-1;3007:17:87;;-1:-1:-1;;3007:17:87;1876:208;1969:16;1996;2015:19;:17;:19::i;:::-;1996:38;;2062:3;2051:26;;;;;;;;;;;;:::i;:::-;2044:33;1876:208;-1:-1:-1;;;;;1876:208:87:o;2396:157::-;2527:19;:17;:19::i;:::-;;2396:157;;;;:::o;2154:152::-;2190:13;2215:16;2234:19;:17;:19::i;:::-;2215:38;;2284:3;2273:26;;;;;;;;;;;;:::i;:::-;2263:36;;2205:101;2154:152;:::o;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;3661:227;-1:-1:-1;;;3661:227:47:o;1229:557:87:-;1541:98;;;;;1276:12;;1484:10;;1447:15;;;;1484:10;;1541:40;;:98;;1582:14;;1447:15;;;;1601:8;;1611:27;;1541:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1541:98:87;;;;;;;;;;;;:::i;:::-;1506:133;;;;1654:7;1649:111;;1731:3;1725:10;1720:2;1715:3;1711:12;1704:32;1649:111;1776:3;1229:557;-1:-1:-1;;;1229:557:87:o;2145:730:47:-;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;;;;12212:2:111;788:34:47;;;12194:21:111;12251:2;12231:18;;;12224:30;12290:26;12270:18;;;12263:54;12334:18;;788:34:47;;;;;;;;730:345;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;;;;12565:2:111;903:41:47;;;12547:21:111;12604:2;12584:18;;;12577:30;12643:33;12623:18;;;12616:61;12694:18;;903:41:47;12363:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;;;;12925:2:111;1020:44:47;;;12907:21:111;12964:2;12944:18;;;12937:30;13003:34;12983:18;;;12976:62;13074:4;13054:18;;;13047:32;13096:19;;1020:44:47;12723:398:111;961:114:47;570:511;:::o;5069:1494::-;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;13353:25:111;;;13426:4;13414:17;;13394:18;;;13387:45;;;;13448:18;;;13441:34;;;13491:18;;;13484:34;;;6374:24:47;;13325:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;-1:-1:-1;;6374:24:47;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;14:196:111:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:347::-;266:8;276:6;330:3;323:4;315:6;311:17;307:27;297:55;;348:1;345;338:12;297:55;-1:-1:-1;371:20:111;;414:18;403:30;;400:50;;;446:1;443;436:12;400:50;483:4;475:6;471:17;459:29;;535:3;528:4;519:6;511;507:19;503:30;500:39;497:59;;;552:1;549;542:12;567:1010;693:6;701;709;717;725;733;741;749;802:3;790:9;781:7;777:23;773:33;770:53;;;819:1;816;809:12;770:53;842:29;861:9;842:29;:::i;:::-;832:39;;890:38;924:2;913:9;909:18;890:38;:::i;:::-;880:48;;947:38;981:2;970:9;966:18;947:38;:::i;:::-;937:48;;1032:2;1021:9;1017:18;1004:32;994:42;;1087:3;1076:9;1072:19;1059:33;1111:18;1152:2;1144:6;1141:14;1138:34;;;1168:1;1165;1158:12;1138:34;1207:58;1257:7;1248:6;1237:9;1233:22;1207:58;:::i;:::-;1284:8;;-1:-1:-1;1181:84:111;-1:-1:-1;1372:3:111;1357:19;;1344:33;;-1:-1:-1;1389:16:111;;;1386:36;;;1418:1;1415;1408:12;1386:36;;1457:60;1509:7;1498:8;1487:9;1483:24;1457:60;:::i;:::-;567:1010;;;;-1:-1:-1;567:1010:111;;-1:-1:-1;567:1010:111;;;;;;1536:8;-1:-1:-1;;;567:1010:111:o;1582:332::-;1640:6;1693:2;1681:9;1672:7;1668:23;1664:32;1661:52;;;1709:1;1706;1699:12;1661:52;1748:9;1735:23;1798:66;1791:5;1787:78;1780:5;1777:89;1767:117;;1880:1;1877;1870:12;2111:626;2208:6;2216;2224;2232;2240;2293:3;2281:9;2272:7;2268:23;2264:33;2261:53;;;2310:1;2307;2300:12;2261:53;2333:29;2352:9;2333:29;:::i;:::-;2323:39;;2381:38;2415:2;2404:9;2400:18;2381:38;:::i;:::-;2371:48;;2466:2;2455:9;2451:18;2438:32;2428:42;;2521:2;2510:9;2506:18;2493:32;2548:18;2540:6;2537:30;2534:50;;;2580:1;2577;2570:12;2534:50;2619:58;2669:7;2660:6;2649:9;2645:22;2619:58;:::i;:::-;2111:626;;;;-1:-1:-1;2111:626:111;;-1:-1:-1;2696:8:111;;2593:84;2111:626;-1:-1:-1;;;2111:626:111:o;2995:184::-;3047:77;3044:1;3037:88;3144:4;3141:1;3134:15;3168:4;3165:1;3158:15;3184:334;3255:2;3249:9;3311:2;3301:13;;-1:-1:-1;;3297:86:111;3285:99;;3414:18;3399:34;;3435:22;;;3396:62;3393:88;;;3461:18;;:::i;:::-;3497:2;3490:22;3184:334;;-1:-1:-1;3184:334:111:o;3523:245::-;3571:4;3604:18;3596:6;3593:30;3590:56;;;3626:18;;:::i;:::-;-1:-1:-1;3683:2:111;3671:15;-1:-1:-1;;3667:88:111;3757:4;3663:99;;3523:245::o;3773:462::-;3815:5;3868:3;3861:4;3853:6;3849:17;3845:27;3835:55;;3886:1;3883;3876:12;3835:55;3922:6;3909:20;3953:48;3969:31;3997:2;3969:31;:::i;:::-;3953:48;:::i;:::-;4026:2;4017:7;4010:19;4072:3;4065:4;4060:2;4052:6;4048:15;4044:26;4041:35;4038:55;;;4089:1;4086;4079:12;4038:55;4154:2;4147:4;4139:6;4135:17;4128:4;4119:7;4115:18;4102:55;4202:1;4177:16;;;4195:4;4173:27;4166:38;;;;4181:7;3773:462;-1:-1:-1;;;3773:462:111:o;4240:388::-;4317:6;4325;4378:2;4366:9;4357:7;4353:23;4349:32;4346:52;;;4394:1;4391;4384:12;4346:52;4430:9;4417:23;4407:33;;4491:2;4480:9;4476:18;4463:32;4518:18;4510:6;4507:30;4504:50;;;4550:1;4547;4540:12;4504:50;4573:49;4614:7;4605:6;4594:9;4590:22;4573:49;:::i;:::-;4563:59;;;4240:388;;;;;:::o;4864:530::-;4975:6;4983;4991;5044:2;5032:9;5023:7;5019:23;5015:32;5012:52;;;5060:1;5057;5050:12;5012:52;5100:9;5087:23;5133:18;5125:6;5122:30;5119:50;;;5165:1;5162;5155:12;5119:50;5188:22;;5244:3;5226:16;;;5222:26;5219:46;;;5261:1;5258;5251:12;5219:46;5284:2;5333;5318:18;;5305:32;;-1:-1:-1;5384:2:111;5369:18;;;5356:32;;4864:530;-1:-1:-1;;;4864:530:111:o;5581:621::-;5690:6;5698;5706;5714;5767:3;5755:9;5746:7;5742:23;5738:33;5735:53;;;5784:1;5781;5774:12;5735:53;5807:29;5826:9;5807:29;:::i;:::-;5797:39;;5883:2;5872:9;5868:18;5855:32;5845:42;;5938:2;5927:9;5923:18;5910:32;5965:18;5957:6;5954:30;5951:50;;;5997:1;5994;5987:12;5951:50;6020:49;6061:7;6052:6;6041:9;6037:22;6020:49;:::i;:::-;6010:59;;;6119:2;6108:9;6104:18;6091:32;6152:1;6145:5;6142:12;6132:40;;6168:1;6165;6158:12;6132:40;5581:621;;;;-1:-1:-1;5581:621:111;;-1:-1:-1;;5581:621:111:o;6207:258::-;6279:1;6289:113;6303:6;6300:1;6297:13;6289:113;;;6379:11;;;6373:18;6360:11;;;6353:39;6325:2;6318:10;6289:113;;;6420:6;6417:1;6414:13;6411:48;;;6455:1;6446:6;6441:3;6437:16;6430:27;6411:48;;6207:258;;;:::o;6470:442::-;6619:2;6608:9;6601:21;6582:4;6651:6;6645:13;6694:6;6689:2;6678:9;6674:18;6667:34;6710:66;6769:6;6764:2;6753:9;6749:18;6744:2;6736:6;6732:15;6710:66;:::i;:::-;6828:2;6816:15;-1:-1:-1;;6812:88:111;6797:104;;;;6903:2;6793:113;;6470:442;-1:-1:-1;;6470:442:111:o;6917:367::-;6980:8;6990:6;7044:3;7037:4;7029:6;7025:17;7021:27;7011:55;;7062:1;7059;7052:12;7011:55;-1:-1:-1;7085:20:111;;7128:18;7117:30;;7114:50;;;7160:1;7157;7150:12;7114:50;7197:4;7189:6;7185:17;7173:29;;7257:3;7250:4;7240:6;7237:1;7233:14;7225:6;7221:27;7217:38;7214:47;7211:67;;;7274:1;7271;7264:12;7289:1210;7449:6;7457;7465;7473;7481;7489;7497;7505;7558:3;7546:9;7537:7;7533:23;7529:33;7526:53;;;7575:1;7572;7565:12;7526:53;7598:29;7617:9;7598:29;:::i;:::-;7588:39;;7646:38;7680:2;7669:9;7665:18;7646:38;:::i;:::-;7636:48;;7735:2;7724:9;7720:18;7707:32;7758:18;7799:2;7791:6;7788:14;7785:34;;;7815:1;7812;7805:12;7785:34;7854:70;7916:7;7907:6;7896:9;7892:22;7854:70;:::i;:::-;7943:8;;-1:-1:-1;7828:96:111;-1:-1:-1;8031:2:111;8016:18;;8003:32;;-1:-1:-1;8047:16:111;;;8044:36;;;8076:1;8073;8066:12;8044:36;8115:72;8179:7;8168:8;8157:9;8153:24;8115:72;:::i;:::-;8206:8;;-1:-1:-1;8089:98:111;-1:-1:-1;8294:3:111;8279:19;;8266:33;;-1:-1:-1;8311:16:111;;;8308:36;;;8340:1;8337;8330:12;8504:695;8610:6;8618;8626;8634;8642;8650;8703:3;8691:9;8682:7;8678:23;8674:33;8671:53;;;8720:1;8717;8710:12;8671:53;8743:29;8762:9;8743:29;:::i;:::-;8733:39;;8791:38;8825:2;8814:9;8810:18;8791:38;:::i;:::-;8781:48;;8876:2;8865:9;8861:18;8848:32;8838:42;;8927:2;8916:9;8912:18;8899:32;8889:42;;8982:3;8971:9;8967:19;8954:33;9010:18;9002:6;8999:30;8996:50;;;9042:1;9039;9032:12;8996:50;9081:58;9131:7;9122:6;9111:9;9107:22;9081:58;:::i;:::-;8504:695;;;;-1:-1:-1;8504:695:111;;-1:-1:-1;8504:695:111;;9158:8;;8504:695;-1:-1:-1;;;8504:695:111:o;9204:164::-;9280:13;;9329;;9322:21;9312:32;;9302:60;;9358:1;9355;9348:12;9373:202;9440:6;9493:2;9481:9;9472:7;9468:23;9464:32;9461:52;;;9509:1;9506;9499:12;9461:52;9532:37;9559:9;9532:37;:::i;9580:184::-;9650:6;9703:2;9691:9;9682:7;9678:23;9674:32;9671:52;;;9719:1;9716;9709:12;9671:52;-1:-1:-1;9742:16:111;;9580:184;-1:-1:-1;9580:184:111:o;10154:::-;10206:77;10203:1;10196:88;10303:4;10300:1;10293:15;10327:4;10324:1;10317:15;10343:944;10616:42;10608:6;10604:55;10593:9;10586:74;10696:6;10691:2;10680:9;10676:18;10669:34;10739:3;10734:2;10723:9;10719:18;10712:31;10780:6;10774:3;10763:9;10759:19;10752:35;10838:6;10830;10824:3;10813:9;10809:19;10796:49;10895:1;10889:3;10880:6;10869:9;10865:22;10861:32;10854:43;10567:4;11024:3;-1:-1:-1;;10949:2:111;10941:6;10937:15;10933:88;10922:9;10918:104;10914:114;10906:122;;11058:1;11050:6;11047:13;11037:201;;11094:77;11091:1;11084:88;11195:4;11192:1;11185:15;11223:4;11220:1;11213:15;11037:201;11274:6;11269:2;11258:9;11254:18;11247:34;10343:944;;;;;;;;:::o;11292:713::-;11377:6;11385;11438:2;11426:9;11417:7;11413:23;11409:32;11406:52;;;11454:1;11451;11444:12;11406:52;11477:37;11504:9;11477:37;:::i;:::-;11467:47;;11558:2;11547:9;11543:18;11537:25;11585:18;11577:6;11574:30;11571:50;;;11617:1;11614;11607:12;11571:50;11640:22;;11693:4;11685:13;;11681:27;-1:-1:-1;11671:55:111;;11722:1;11719;11712:12;11671:55;11751:2;11745:9;11776:48;11792:31;11820:2;11792:31;:::i;11776:48::-;11847:2;11840:5;11833:17;11887:7;11882:2;11877;11873;11869:11;11865:20;11862:33;11859:53;;;11908:1;11905;11898:12;11859:53;11921:54;11972:2;11967;11960:5;11956:14;11951:2;11947;11943:11;11921:54;:::i;:::-;11994:5;11984:15;;;;;11292:713;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"852400","executionCost":"infinite","totalCost":"infinite"},"external":{"NAME()":"infinite","VERSION()":"infinite","eip4337manager()":"infinite","executeAndRevert(address,uint256,bytes,uint8)":"infinite","getNonce()":"infinite","isValidSignature(bytes32,bytes)":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","supportsInterface(bytes4)":"449","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite"},"internal":{"delegateToManager()":"infinite"}},"methodIdentifiers":{"NAME()":"a3f4df7e","VERSION()":"ffa1ad74","eip4337manager()":"2bcadc24","executeAndRevert(address,uint256,bytes,uint8)":"940d3c60","getNonce()":"d087d288","isValidSignature(bytes32,bytes)":"1626ba7e","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_eip4337manager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip4337manager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"executeAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"executeAndRevert(address,uint256,bytes,uint8)\":{\"notice\":\"called from the Safe. delegate actual work to EIP4337Manager\"},\"getNonce()\":{\"notice\":\"Helper for wallet to get the next nonce.\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"called from the Safe. delegate actual work to EIP4337Manager\"}},\"notice\":\"The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'. This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe. Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager. Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/gnosis/EIP4337Fallback.sol\":\"EIP4337Fallback\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./base/ModuleManager.sol\\\";\\nimport \\\"./base/OwnerManager.sol\\\";\\nimport \\\"./base/FallbackManager.sol\\\";\\nimport \\\"./base/GuardManager.sol\\\";\\nimport \\\"./common/EtherPaymentFallback.sol\\\";\\nimport \\\"./common/Singleton.sol\\\";\\nimport \\\"./common/SignatureDecoder.sol\\\";\\nimport \\\"./common/SecuredTokenTransfer.sol\\\";\\nimport \\\"./common/StorageAccessible.sol\\\";\\nimport \\\"./interfaces/ISignatureValidator.sol\\\";\\nimport \\\"./external/GnosisSafeMath.sol\\\";\\n\\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafe is\\n EtherPaymentFallback,\\n Singleton,\\n ModuleManager,\\n OwnerManager,\\n SignatureDecoder,\\n SecuredTokenTransfer,\\n ISignatureValidatorConstants,\\n FallbackManager,\\n StorageAccessible,\\n GuardManager\\n{\\n using GnosisSafeMath for uint256;\\n\\n string public constant VERSION = \\\"1.3.0\\\";\\n\\n // keccak256(\\n // \\\"EIP712Domain(uint256 chainId,address verifyingContract)\\\"\\n // );\\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\\n\\n // keccak256(\\n // \\\"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\\\"\\n // );\\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\\n\\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\\n event SignMsg(bytes32 indexed msgHash);\\n event ExecutionFailure(bytes32 txHash, uint256 payment);\\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\\n\\n uint256 public nonce;\\n bytes32 private _deprecatedDomainSeparator;\\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\\n mapping(bytes32 => uint256) public signedMessages;\\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\\n\\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\\n constructor() {\\n // By setting the threshold it is not possible to call setup anymore,\\n // so we create a Safe with 0 owners and threshold 1.\\n // This is an unusable Safe, perfect for the singleton\\n threshold = 1;\\n }\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n /// @param to Contract address for optional delegate call.\\n /// @param data Data payload for optional delegate call.\\n /// @param fallbackHandler Handler for fallback calls to this contract\\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\\n /// @param payment Value that should be paid\\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\\n function setup(\\n address[] calldata _owners,\\n uint256 _threshold,\\n address to,\\n bytes calldata data,\\n address fallbackHandler,\\n address paymentToken,\\n uint256 payment,\\n address payable paymentReceiver\\n ) external {\\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\\n setupOwners(_owners, _threshold);\\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\\n setupModules(to, data);\\n\\n if (payment > 0) {\\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\\n }\\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\\n }\\n\\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\\n /// Note: The fees are always transferred, even if the user transaction fails.\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @param safeTxGas Gas that should be used for the Safe transaction.\\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Gas price that should be used for the payment calculation.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\\n function execTransaction(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures\\n ) public payable virtual returns (bool success) {\\n bytes32 txHash;\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n bytes memory txHashData =\\n encodeTransactionData(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n nonce\\n );\\n // Increase nonce and execute transaction.\\n nonce++;\\n txHash = keccak256(txHashData);\\n checkSignatures(txHash, txHashData, signatures);\\n }\\n address guard = getGuard();\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkTransaction(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n signatures,\\n msg.sender\\n );\\n }\\n }\\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \\\"GS010\\\");\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n uint256 gasUsed = gasleft();\\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\\n gasUsed = gasUsed.sub(gasleft());\\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\\n require(success || safeTxGas != 0 || gasPrice != 0, \\\"GS013\\\");\\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\\n uint256 payment = 0;\\n if (gasPrice > 0) {\\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\\n }\\n if (success) emit ExecutionSuccess(txHash, payment);\\n else emit ExecutionFailure(txHash, payment);\\n }\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkAfterExecution(txHash, success);\\n }\\n }\\n }\\n\\n function handlePayment(\\n uint256 gasUsed,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver\\n ) private returns (uint256 payment) {\\n // solhint-disable-next-line avoid-tx-origin\\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\\n if (gasToken == address(0)) {\\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\\n require(receiver.send(payment), \\\"GS011\\\");\\n } else {\\n payment = gasUsed.add(baseGas).mul(gasPrice);\\n require(transferToken(gasToken, receiver, payment), \\\"GS012\\\");\\n }\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n */\\n function checkSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures\\n ) public view {\\n // Load threshold to avoid multiple storage loads\\n uint256 _threshold = threshold;\\n // Check that a threshold is set\\n require(_threshold > 0, \\\"GS001\\\");\\n checkNSignatures(dataHash, data, signatures, _threshold);\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n * @param requiredSignatures Amount of required valid signatures.\\n */\\n function checkNSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures,\\n uint256 requiredSignatures\\n ) public view {\\n // Check that the provided signature data is not too short\\n require(signatures.length >= requiredSignatures.mul(65), \\\"GS020\\\");\\n // There cannot be an owner with address 0.\\n address lastOwner = address(0);\\n address currentOwner;\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n uint256 i;\\n for (i = 0; i < requiredSignatures; i++) {\\n (v, r, s) = signatureSplit(signatures, i);\\n if (v == 0) {\\n // If v is 0 then it is a contract signature\\n // When handling contract signatures the address of the contract is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n\\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\\n // Here we only check that the pointer is not pointing inside the part that is being processed\\n require(uint256(s) >= requiredSignatures.mul(65), \\\"GS021\\\");\\n\\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\\n require(uint256(s).add(32) <= signatures.length, \\\"GS022\\\");\\n\\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\\n uint256 contractSignatureLen;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\\n }\\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \\\"GS023\\\");\\n\\n // Check signature\\n bytes memory contractSignature;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\\n contractSignature := add(add(signatures, s), 0x20)\\n }\\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \\\"GS024\\\");\\n } else if (v == 1) {\\n // If v is 1 then it is an approved hash\\n // When handling approved hashes the address of the approver is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \\\"GS025\\\");\\n } else if (v > 30) {\\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\\n currentOwner = ecrecover(keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", dataHash)), v - 4, r, s);\\n } else {\\n // Default is the ecrecover flow with the provided data hash\\n // Use ecrecover with the messageHash for EOA signatures\\n currentOwner = ecrecover(dataHash, v, r, s);\\n }\\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \\\"GS026\\\");\\n lastOwner = currentOwner;\\n }\\n }\\n\\n /// @dev Allows to estimate a Safe transaction.\\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\\n function requiredTxGas(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation\\n ) external returns (uint256) {\\n uint256 startGas = gasleft();\\n // We don't provide an error message here, as we use it to return the estimate\\n require(execute(to, value, data, operation, gasleft()));\\n uint256 requiredGas = startGas - gasleft();\\n // Convert response to string and return via error message\\n revert(string(abi.encodePacked(requiredGas)));\\n }\\n\\n /**\\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\\n */\\n function approveHash(bytes32 hashToApprove) external {\\n require(owners[msg.sender] != address(0), \\\"GS030\\\");\\n approvedHashes[msg.sender][hashToApprove] = 1;\\n emit ApproveHash(hashToApprove, msg.sender);\\n }\\n\\n /// @dev Returns the chain id used by this contract.\\n function getChainId() public view returns (uint256) {\\n uint256 id;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n id := chainid()\\n }\\n return id;\\n }\\n\\n function domainSeparator() public view returns (bytes32) {\\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\\n }\\n\\n /// @dev Returns the bytes that are hashed to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Gas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash bytes.\\n function encodeTransactionData(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes memory) {\\n bytes32 safeTxHash =\\n keccak256(\\n abi.encode(\\n SAFE_TX_TYPEHASH,\\n to,\\n value,\\n keccak256(data),\\n operation,\\n safeTxGas,\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n _nonce\\n )\\n );\\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\\n }\\n\\n /// @dev Returns hash to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Fas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash.\\n function getTransactionHash(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes32) {\\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\\n }\\n}\\n\",\"keccak256\":\"0x2ca9e3e053c969b9364f62c50c2c25b92525db7fd0bad3ae1fb0c20dd575367c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract FallbackManager is SelfAuthorized {\\n event ChangedFallbackHandler(address handler);\\n\\n // keccak256(\\\"fallback_manager.handler.address\\\")\\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\\n\\n function internalSetFallbackHandler(address handler) internal {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, handler)\\n }\\n }\\n\\n /// @dev Allows to add a contract to handle fallback calls.\\n /// Only fallback calls without value and with data will be forwarded.\\n /// This can only be done via a Safe transaction.\\n /// @param handler contract to handle fallbacks calls.\\n function setFallbackHandler(address handler) public authorized {\\n internalSetFallbackHandler(handler);\\n emit ChangedFallbackHandler(handler);\\n }\\n\\n // solhint-disable-next-line payable-fallback,no-complex-fallback\\n fallback() external {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let handler := sload(slot)\\n if iszero(handler) {\\n return(0, 0)\\n }\\n calldatacopy(0, 0, calldatasize())\\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\\n // Then the address without padding is stored right after the calldata\\n mstore(calldatasize(), shl(96, caller()))\\n // Add 20 bytes for the address appended add the end\\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if iszero(success) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1be9f0f3e80a78134c2e3a026c6a14759785bd35d135e87a4a025aeb6742791f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\nimport \\\"./Executor.sol\\\";\\n\\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract ModuleManager is SelfAuthorized, Executor {\\n event EnabledModule(address module);\\n event DisabledModule(address module);\\n event ExecutionFromModuleSuccess(address indexed module);\\n event ExecutionFromModuleFailure(address indexed module);\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n mapping(address => address) internal modules;\\n\\n function setupModules(address to, bytes memory data) internal {\\n require(modules[SENTINEL_MODULES] == address(0), \\\"GS100\\\");\\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\\n if (to != address(0))\\n // Setup has to complete successfully or transaction fails.\\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \\\"GS000\\\");\\n }\\n\\n /// @dev Allows to add a module to the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Enables the module `module` for the Safe.\\n /// @param module Module to be whitelisted.\\n function enableModule(address module) public authorized {\\n // Module address cannot be null or sentinel.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n // Module cannot be added twice.\\n require(modules[module] == address(0), \\\"GS102\\\");\\n modules[module] = modules[SENTINEL_MODULES];\\n modules[SENTINEL_MODULES] = module;\\n emit EnabledModule(module);\\n }\\n\\n /// @dev Allows to remove a module from the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Disables the module `module` for the Safe.\\n /// @param prevModule Module that pointed to the module to be removed in the linked list\\n /// @param module Module to be removed.\\n function disableModule(address prevModule, address module) public authorized {\\n // Validate module address and check that it corresponds to module index.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n require(modules[prevModule] == module, \\\"GS103\\\");\\n modules[prevModule] = modules[module];\\n modules[module] = address(0);\\n emit DisabledModule(module);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public virtual returns (bool success) {\\n // Only whitelisted modules are allowed.\\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \\\"GS104\\\");\\n // Execute transaction without further confirmations.\\n success = execute(to, value, data, operation, gasleft());\\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\\n else emit ExecutionFromModuleFailure(msg.sender);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModuleReturnData(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public returns (bool success, bytes memory returnData) {\\n success = execTransactionFromModule(to, value, data, operation);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // Load free memory location\\n let ptr := mload(0x40)\\n // We allocate memory for the return data by setting the free memory location to\\n // current free memory location + data size + 32 bytes for data size value\\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\\n // Store the size\\n mstore(ptr, returndatasize())\\n // Store the data\\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\\n // Point the return data to the correct memory location\\n returnData := ptr\\n }\\n }\\n\\n /// @dev Returns if an module is enabled\\n /// @return True if the module is enabled\\n function isModuleEnabled(address module) public view returns (bool) {\\n return SENTINEL_MODULES != module && modules[module] != address(0);\\n }\\n\\n /// @dev Returns array of modules.\\n /// @param start Start of the page.\\n /// @param pageSize Maximum number of modules that should be returned.\\n /// @return array Array of modules.\\n /// @return next Start of the next page.\\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\\n // Init array with max page size\\n array = new address[](pageSize);\\n\\n // Populate return array\\n uint256 moduleCount = 0;\\n address currentModule = modules[start];\\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\\n array[moduleCount] = currentModule;\\n currentModule = modules[currentModule];\\n moduleCount++;\\n }\\n next = currentModule;\\n // Set correct size of returned array\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n mstore(array, moduleCount)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5512760a0328309f82a71cbe2ac14e0942501b9d44d5fb417bd02174546672e5\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract OwnerManager is SelfAuthorized {\\n event AddedOwner(address owner);\\n event RemovedOwner(address owner);\\n event ChangedThreshold(uint256 threshold);\\n\\n address internal constant SENTINEL_OWNERS = address(0x1);\\n\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\\n // Threshold can only be 0 at initialization.\\n // Check ensures that setup function can only be called once.\\n require(threshold == 0, \\\"GS200\\\");\\n // Validate that threshold is smaller than number of added owners.\\n require(_threshold <= _owners.length, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n // Initializing Safe owners.\\n address currentOwner = SENTINEL_OWNERS;\\n for (uint256 i = 0; i < _owners.length; i++) {\\n // Owner address cannot be null.\\n address owner = _owners[i];\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[currentOwner] = owner;\\n currentOwner = owner;\\n }\\n owners[currentOwner] = SENTINEL_OWNERS;\\n ownerCount = _owners.length;\\n threshold = _threshold;\\n }\\n\\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\\n /// @param owner New owner address.\\n /// @param _threshold New threshold.\\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[owner] = owners[SENTINEL_OWNERS];\\n owners[SENTINEL_OWNERS] = owner;\\n ownerCount++;\\n emit AddedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\\n /// @param owner Owner address to be removed.\\n /// @param _threshold New threshold.\\n function removeOwner(\\n address prevOwner,\\n address owner,\\n uint256 _threshold\\n ) public authorized {\\n // Only allow to remove an owner, if threshold can still be reached.\\n require(ownerCount - 1 >= _threshold, \\\"GS201\\\");\\n // Validate owner address and check that it corresponds to owner index.\\n require(owner != address(0) && owner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == owner, \\\"GS205\\\");\\n owners[prevOwner] = owners[owner];\\n owners[owner] = address(0);\\n ownerCount--;\\n emit RemovedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to swap/replace an owner from the Safe with another address.\\n /// This can only be done via a Safe transaction.\\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\\n /// @param oldOwner Owner address to be replaced.\\n /// @param newOwner New owner address.\\n function swapOwner(\\n address prevOwner,\\n address oldOwner,\\n address newOwner\\n ) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[newOwner] == address(0), \\\"GS204\\\");\\n // Validate oldOwner address and check that it corresponds to owner index.\\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == oldOwner, \\\"GS205\\\");\\n owners[newOwner] = owners[oldOwner];\\n owners[prevOwner] = newOwner;\\n owners[oldOwner] = address(0);\\n emit RemovedOwner(oldOwner);\\n emit AddedOwner(newOwner);\\n }\\n\\n /// @dev Allows to update the number of required confirmations by Safe owners.\\n /// This can only be done via a Safe transaction.\\n /// @notice Changes the threshold of the Safe to `_threshold`.\\n /// @param _threshold New threshold.\\n function changeThreshold(uint256 _threshold) public authorized {\\n // Validate that threshold is smaller than number of owners.\\n require(_threshold <= ownerCount, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n threshold = _threshold;\\n emit ChangedThreshold(threshold);\\n }\\n\\n function getThreshold() public view returns (uint256) {\\n return threshold;\\n }\\n\\n function isOwner(address owner) public view returns (bool) {\\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\\n }\\n\\n /// @dev Returns array of owners.\\n /// @return Array of Safe owners.\\n function getOwners() public view returns (address[] memory) {\\n address[] memory array = new address[](ownerCount);\\n\\n // populate return array\\n uint256 index = 0;\\n address currentOwner = owners[SENTINEL_OWNERS];\\n while (currentOwner != SENTINEL_OWNERS) {\\n array[index] = currentOwner;\\n currentOwner = owners[currentOwner];\\n index++;\\n }\\n return array;\\n }\\n}\\n\",\"keccak256\":\"0x01a3d64cc0967f42ae63802409f5404d18352516ea2a6335005003d919ffcf12\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\\n/// @author Richard Meissner - \\ncontract EtherPaymentFallback {\\n event SafeReceived(address indexed sender, uint256 value);\\n\\n /// @dev Fallback function accepts Ether transactions.\\n receive() external payable {\\n emit SafeReceived(msg.sender, msg.value);\\n }\\n}\\n\",\"keccak256\":\"0x1a7928d29877da84a3d0df846d5cd933d48ee095c1bde0aa044e249b12e27a72\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SecuredTokenTransfer - Secure token transfer\\n/// @author Richard Meissner - \\ncontract SecuredTokenTransfer {\\n /// @dev Transfers a token and returns if it was a success\\n /// @param token Token that should be transferred\\n /// @param receiver Receiver to whom the token should be transferred\\n /// @param amount The amount of tokens that should be transferred\\n function transferToken(\\n address token,\\n address receiver,\\n uint256 amount\\n ) internal returns (bool transferred) {\\n // 0xa9059cbb - keccack(\\\"transfer(address,uint256)\\\")\\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // We write the return value to scratch space.\\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n switch returndatasize()\\n case 0 {\\n transferred := success\\n }\\n case 0x20 {\\n transferred := iszero(or(iszero(success), iszero(mload(0))))\\n }\\n default {\\n transferred := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x178682d8477da42936c7e8e24d39094c4ac08ecd8623794b9535d77001b665f1\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\\n/// @author Richard Meissner - \\ncontract SignatureDecoder {\\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\\n /// @param signatures concatenated rsv signatures\\n function signatureSplit(bytes memory signatures, uint256 pos)\\n internal\\n pure\\n returns (\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n )\\n {\\n // The signature format is a compact form of:\\n // {bytes32 r}{bytes32 s}{uint8 v}\\n // Compact means, uint8 is not padded to 32 bytes.\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let signaturePos := mul(0x41, pos)\\n r := mload(add(signatures, add(signaturePos, 0x20)))\\n s := mload(add(signatures, add(signaturePos, 0x40)))\\n // Here we are loading the last 32 bytes, including 31 bytes\\n // of 's'. There is no 'mload8' to do this.\\n //\\n // 'byte' is not working due to the Solidity parser, so lets\\n // use the second best option, 'and'\\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d37be182472ccfee62a33e9939f9b3d509be4c32e9fdebc2c1746c573655987\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\\n/// @author Richard Meissner - \\ncontract Singleton {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\\n // It should also always be ensured that the address is stored alone (uses a full word)\\n address private singleton;\\n}\\n\",\"keccak256\":\"0x6e02c18998de8834dd7d69890cb6ede996b6f635d2337081a596d91e35e2c648\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\\ncontract StorageAccessible {\\n /**\\n * @dev Reads `length` bytes of storage in the currents contract\\n * @param offset - the offset in the current contract's storage in words to start reading from\\n * @param length - the number of words (32 bytes) of data to read\\n * @return the bytes that were read.\\n */\\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\\n bytes memory result = new bytes(length * 32);\\n for (uint256 index = 0; index < length; index++) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let word := sload(add(offset, index))\\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Performs a delegetecall on a targetContract in the context of self.\\n * Internally reverts execution to avoid side effects (making it static).\\n *\\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\\n * Specifically, the `returndata` after a call to this method will be:\\n * `success:bool || response.length:uint256 || response:bytes`.\\n *\\n * @param targetContract Address of the contract containing the code to execute.\\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\\n */\\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\\n\\n mstore(0x00, success)\\n mstore(0x20, returndatasize())\\n returndatacopy(0x40, 0, returndatasize())\\n revert(0, add(returndatasize(), 0x40))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36853adb266c2ab7d3c612aca799441a86bd15d9e1d24fc6c70d63f5c2df3aaf\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\\n/// @author Richard Meissner - \\ncontract GnosisSafeStorage {\\n // From /common/Singleton.sol\\n address internal singleton;\\n // From /common/ModuleManager.sol\\n mapping(address => address) internal modules;\\n // From /common/OwnerManager.sol\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n // From /GnosisSafe.sol\\n bytes32 internal nonce;\\n bytes32 internal domainSeparator;\\n mapping(bytes32 => uint256) internal signedMessages;\\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xecfd0d8a43d859ef1fb8161cb21ce5d38461603383378a5b1c4c7d5d4a3bfbf3\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title GnosisSafeMath\\n * @dev Math operations with safety checks that revert on error\\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\\n * TODO: remove once open zeppelin update to solc 0.5.0\\n */\\nlibrary GnosisSafeMath {\\n /**\\n * @dev Multiplies two numbers, reverts on overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Adds two numbers, reverts on overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x2a2b4d74f5834a9437be0cd3254d7a676698fc78aa47941c2009470196998d98\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../interfaces/ERC1155TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC721TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC777TokensRecipient.sol\\\";\\nimport \\\"../interfaces/IERC165.sol\\\";\\n\\n/// @title Default Callback Handler - returns true for known token callbacks\\n/// @author Richard Meissner - \\ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\\n string public constant NAME = \\\"Default Callback Handler\\\";\\n string public constant VERSION = \\\"1.0.0\\\";\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xf23a6e61;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xbc197c81;\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0x150b7a02;\\n }\\n\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n // We implement this for completeness, doesn't really have any value\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x1cdc184c3504176383b7f94f9ce06c96ce1c123e1878258fe6dc03cce4a29ff7\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\n*/\\ninterface ERC1155TokenReceiver {\\n /**\\n @notice Handle the receipt of a single ERC1155 token type.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\\n This function MUST revert if it rejects the transfer.\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _id The ID of the token being transferred\\n @param _value The amount of tokens being transferred\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n */\\n function onERC1155Received(\\n address _operator,\\n address _from,\\n uint256 _id,\\n uint256 _value,\\n bytes calldata _data\\n ) external returns (bytes4);\\n\\n /**\\n @notice Handle the receipt of multiple ERC1155 token types.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\\n This function MUST revert if it rejects the transfer(s).\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n */\\n function onERC1155BatchReceived(\\n address _operator,\\n address _from,\\n uint256[] calldata _ids,\\n uint256[] calldata _values,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7894ef55ee3334f6388e5e1d749bbabd85fc03d5a2ab949f284bce830f8aa398\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\\ninterface ERC721TokenReceiver {\\n /// @notice Handle the receipt of an NFT\\n /// @dev The ERC721 smart contract calls this function on the recipient\\n /// after a `transfer`. This function MAY throw to revert and reject the\\n /// transfer. Return of other than the magic value MUST result in the\\n /// transaction being reverted.\\n /// Note: the contract address is always the message sender.\\n /// @param _operator The address which called `safeTransferFrom` function\\n /// @param _from The address which previously owned the token\\n /// @param _tokenId The NFT identifier which is being transferred\\n /// @param _data Additional data with no specified format\\n /// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n /// unless throwing\\n function onERC721Received(\\n address _operator,\\n address _from,\\n uint256 _tokenId,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x8a3dd41df3a49d9ae2d45dd4087ca595946ed3c6051b8aa304727017b5eabaa4\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ninterface ERC777TokensRecipient {\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata data,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1cfbdb95761067c5bc35599fcae6c11e487f2879d7fa2c6f47e7b94506b4039c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c64c2e071245db8fe3ea8b94f73c5a8de236933858ae240348d502433a9d178\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"},\"@openzeppelin/contracts/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/gnosis/EIP4337Fallback.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@openzeppelin/contracts/interfaces/IERC1271.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"./EIP4337Manager.sol\\\";\\n\\nusing ECDSA for bytes32;\\n\\n/**\\n * The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\\n * This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\\n * Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\\n * Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\\n */\\ncontract EIP4337Fallback is DefaultCallbackHandler, IAccount, IERC1271 {\\n bytes4 internal constant ERC1271_MAGIC_VALUE = 0x1626ba7e;\\n\\n address immutable public eip4337manager;\\n constructor(address _eip4337manager) {\\n eip4337manager = _eip4337manager;\\n }\\n\\n /**\\n * delegate the contract call to the EIP4337Manager\\n */\\n function delegateToManager() internal returns (bytes memory) {\\n // delegate entire msg.data (including the appended \\\"msg.sender\\\") to the EIP4337Manager\\n // will work only for GnosisSafe contracts\\n GnosisSafe safe = GnosisSafe(payable(msg.sender));\\n (bool success, bytes memory ret) = safe.execTransactionFromModuleReturnData(eip4337manager, 0, msg.data, Enum.Operation.DelegateCall);\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function validateUserOp(UserOperation calldata, bytes32, uint256) override external returns (uint256 deadline){\\n bytes memory ret = delegateToManager();\\n return abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public returns (uint256 nonce) {\\n bytes memory ret = delegateToManager();\\n (nonce) = abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function executeAndRevert(\\n address,\\n uint256,\\n bytes memory,\\n Enum.Operation\\n ) external {\\n delegateToManager();\\n }\\n\\n function isValidSignature(\\n bytes32 _hash,\\n bytes memory _signature\\n ) external override view returns (bytes4) {\\n bytes32 hash = _hash.toEthSignedMessageHash();\\n address recovered = hash.recover(_signature);\\n\\n GnosisSafe safe = GnosisSafe(payable(address(msg.sender)));\\n\\n // Validate signatures\\n if (safe.isOwner(recovered)) {\\n return ERC1271_MAGIC_VALUE;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6be32571c849722d61a84fb03975dcf158fd45f88e10f289ce2626b49def8ca5\",\"license\":\"GPL\"},\"contracts/samples/gnosis/EIP4337Manager.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\\\";\\nimport \\\"./EIP4337Fallback.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"../../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../../utils/Exec.sol\\\";\\n\\n using ECDSA for bytes32;\\n\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n * Inherits GnosisSafe so that it can reference the memory storage\\n */\\ncontract EIP4337Manager is IAccount, GnosisSafeStorage, Executor {\\n\\n address public immutable eip4337Fallback;\\n address public immutable entryPoint;\\n\\n // return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n constructor(address anEntryPoint) {\\n entryPoint = anEntryPoint;\\n eip4337Fallback = address(new EIP4337Fallback(address(this)));\\n }\\n\\n /**\\n * delegate-called (using execFromModule) through the fallback, so \\\"real\\\" msg.sender is attached as last 20 bytes\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override returns (uint256 validationData) {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n address recovered = hash.recover(userOp.signature);\\n require(threshold == 1, \\\"account: only threshold 1\\\");\\n if (!pThis.isOwner(recovered)) {\\n validationData = SIG_VALIDATION_FAILED;\\n }\\n\\n // mimic normal Safe nonce behaviour: prevent parallel nonces\\n require(userOp.nonce < type(uint64).max, \\\"account: nonsequential nonce\\\");\\n\\n if (missingAccountFunds > 0) {\\n //Note: MAY pay more than the minimum, to deposit for future transactions\\n (bool success,) = payable(msgSender).call{value : missingAccountFunds}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n\\n /**\\n * Execute a call but also revert if the execution fails.\\n * The default behavior of the Safe is to not revert if the call fails,\\n * which is challenging for integrating with ERC4337 because then the\\n * EntryPoint wouldn't know to emit the UserOperationRevertReason event,\\n * which the frontend/client uses to capture the reason for the failure.\\n */\\n function executeAndRevert(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) external {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n require(msg.sender == eip4337Fallback, \\\"account: not from EIP4337Fallback\\\");\\n\\n bool success = execute(\\n to,\\n value,\\n data,\\n operation,\\n type(uint256).max\\n );\\n\\n bytes memory returnData = Exec.getReturnData(type(uint256).max);\\n // Revert with the actual reason string\\n // Adopted from: https://github.com/Uniswap/v3-periphery/blob/464a8a49611272f7349c970e0fadb7ec1d3c1086/contracts/base/Multicall.sol#L16-L23\\n if (!success) {\\n if (returnData.length < 68) revert();\\n assembly {\\n returnData := add(returnData, 0x04)\\n }\\n revert(abi.decode(returnData, (string)));\\n }\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public view returns (uint256) {\\n return IEntryPoint(entryPoint).getNonce(address(this), 0);\\n }\\n\\n /**\\n * set up a safe as EIP-4337 enabled.\\n * called from the GnosisSafeAccountFactory during construction time\\n * - enable 3 modules (this module, fallback and the entrypoint)\\n * - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \\\"this\\\" is the safe itself\\n */\\n function setup4337Modules(\\n EIP4337Manager manager //the manager (this contract)\\n ) external {\\n GnosisSafe safe = GnosisSafe(payable(address(this)));\\n require(!safe.isModuleEnabled(manager.entryPoint()), \\\"setup4337Modules: entrypoint already enabled\\\");\\n require(!safe.isModuleEnabled(manager.eip4337Fallback()), \\\"setup4337Modules: eip4337Fallback already enabled\\\");\\n safe.enableModule(manager.entryPoint());\\n safe.enableModule(manager.eip4337Fallback());\\n }\\n\\n /**\\n * replace EIP4337 module, to support a new EntryPoint.\\n * must be called using execTransaction and Enum.Operation.DelegateCall\\n * @param prevModule returned by getCurrentEIP4337Manager\\n * @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\\n * @param newManager the new EIP4337Manager, usually with a new EntryPoint\\n */\\n function replaceEIP4337Manager(address prevModule, EIP4337Manager oldManager, EIP4337Manager newManager) public {\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n address oldFallback = oldManager.eip4337Fallback();\\n require(pThis.isModuleEnabled(oldFallback), \\\"replaceEIP4337Manager: oldManager is not active\\\");\\n pThis.disableModule(oldFallback, oldManager.entryPoint());\\n pThis.disableModule(prevModule, oldFallback);\\n\\n address eip4337fallback = newManager.eip4337Fallback();\\n\\n pThis.enableModule(newManager.entryPoint());\\n pThis.enableModule(eip4337fallback);\\n pThis.setFallbackHandler(eip4337fallback);\\n\\n validateEip4337(pThis, newManager);\\n }\\n\\n /**\\n * Validate this gnosisSafe is callable through the EntryPoint.\\n * the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\\n * we don't test full transaction\\n */\\n function validateEip4337(GnosisSafe safe, EIP4337Manager manager) public {\\n\\n // this prevents mistaken replaceEIP4337Manager to disable the module completely.\\n // minimal signature that pass \\\"recover\\\"\\n bytes memory sig = new bytes(65);\\n sig[64] = bytes1(uint8(27));\\n sig[2] = bytes1(uint8(1));\\n sig[35] = bytes1(uint8(1));\\n uint256 nonce = uint256(IEntryPoint(manager.entryPoint()).getNonce(address(safe), 0));\\n UserOperation memory userOp = UserOperation(address(safe), nonce, \\\"\\\", \\\"\\\", 0, 1000000, 0, 0, 0, \\\"\\\", sig);\\n UserOperation[] memory userOps = new UserOperation[](1);\\n userOps[0] = userOp;\\n IEntryPoint _entryPoint = IEntryPoint(payable(manager.entryPoint()));\\n try _entryPoint.handleOps(userOps, payable(msg.sender)) {\\n revert(\\\"validateEip4337: handleOps must fail\\\");\\n } catch (bytes memory error) {\\n if (keccak256(error) != keccak256(abi.encodeWithSignature(\\\"FailedOp(uint256,string)\\\", 0, \\\"AA24 signature error\\\"))) {\\n revert(string(error));\\n }\\n }\\n }\\n /**\\n * enumerate modules, and find the currently active EIP4337 manager (and previous module)\\n * @return prev prev module, needed by replaceEIP4337Manager\\n * @return manager the current active EIP4337Manager\\n */\\n function getCurrentEIP4337Manager(GnosisSafe safe) public view returns (address prev, address manager) {\\n prev = address(SENTINEL_MODULES);\\n (address[] memory modules,) = safe.getModulesPaginated(SENTINEL_MODULES, 100);\\n for (uint i = 0; i < modules.length; i++) {\\n address module = modules[i];\\n try EIP4337Fallback(module).eip4337manager() returns (address _manager) {\\n return (prev, _manager);\\n }\\n // solhint-disable-next-line no-empty-blocks\\n catch {}\\n prev = module;\\n }\\n return (address(0), address(0));\\n }\\n}\\n\",\"keccak256\":\"0xbba6bd62aefbd6ec3b6fc6ad2bd79ede258d342f7a193c938f1323466a6a2ac7\",\"license\":\"GPL\"},\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"executeAndRevert(address,uint256,bytes,uint8)":{"notice":"called from the Safe. delegate actual work to EIP4337Manager"},"getNonce()":{"notice":"Helper for wallet to get the next nonce."},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"called from the Safe. delegate actual work to EIP4337Manager"}},"notice":"The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'. This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe. Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager. Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.","version":1}}},"contracts/samples/gnosis/EIP4337Manager.sol":{"EIP4337Manager":{"abi":[{"inputs":[{"internalType":"address","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"eip4337Fallback","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"executeAndRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract GnosisSafe","name":"safe","type":"address"}],"name":"getCurrentEIP4337Manager","outputs":[{"internalType":"address","name":"prev","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevModule","type":"address"},{"internalType":"contract EIP4337Manager","name":"oldManager","type":"address"},{"internalType":"contract EIP4337Manager","name":"newManager","type":"address"}],"name":"replaceEIP4337Manager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract EIP4337Manager","name":"manager","type":"address"}],"name":"setup4337Modules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract GnosisSafe","name":"safe","type":"address"},{"internalType":"contract EIP4337Manager","name":"manager","type":"address"}],"name":"validateEip4337","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"getCurrentEIP4337Manager(address)":{"returns":{"manager":"the current active EIP4337Manager","prev":"prev module, needed by replaceEIP4337Manager"}},"replaceEIP4337Manager(address,address,address)":{"params":{"newManager":"the new EIP4337Manager, usually with a new EntryPoint","oldManager":"the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager","prevModule":"returned by getCurrentEIP4337Manager"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_18185":{"entryPoint":null,"id":18185,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":160,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:514:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"95:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"141:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"150:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"153:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"143:6:111"},"nodeType":"YulFunctionCall","src":"143:12:111"},"nodeType":"YulExpressionStatement","src":"143:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"116:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"125:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"112:3:111"},"nodeType":"YulFunctionCall","src":"112:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"137:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"108:3:111"},"nodeType":"YulFunctionCall","src":"108:32:111"},"nodeType":"YulIf","src":"105:52:111"},{"nodeType":"YulVariableDeclaration","src":"166:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"185:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"179:5:111"},"nodeType":"YulFunctionCall","src":"179:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"170:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"258:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"267:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"270:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"260:6:111"},"nodeType":"YulFunctionCall","src":"260:12:111"},"nodeType":"YulExpressionStatement","src":"260:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"217:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"228:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"243:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"248:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"239:3:111"},"nodeType":"YulFunctionCall","src":"239:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"252:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"235:3:111"},"nodeType":"YulFunctionCall","src":"235:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"224:3:111"},"nodeType":"YulFunctionCall","src":"224:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"214:2:111"},"nodeType":"YulFunctionCall","src":"214:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"207:6:111"},"nodeType":"YulFunctionCall","src":"207:50:111"},"nodeType":"YulIf","src":"204:70:111"},{"nodeType":"YulAssignment","src":"283:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"293:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"283:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"61:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"72:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"84:6:111","type":""}],"src":"14:290:111"},{"body":{"nodeType":"YulBlock","src":"410:102:111","statements":[{"nodeType":"YulAssignment","src":"420:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"432:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"443:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"428:3:111"},"nodeType":"YulFunctionCall","src":"428:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"420:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"462:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"477:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"493:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"498:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"502:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"485:3:111"},"nodeType":"YulFunctionCall","src":"485:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"473:3:111"},"nodeType":"YulFunctionCall","src":"473:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"455:6:111"},"nodeType":"YulFunctionCall","src":"455:51:111"},"nodeType":"YulExpressionStatement","src":"455:51:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"379:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"390:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"401:4:111","type":""}],"src":"309:203:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c06040523480156200001157600080fd5b50604051620036b2380380620036b28339810160408190526200003491620000a0565b6001600160a01b03811660a0526040513090620000519062000092565b6001600160a01b039091168152602001604051809103906000f0801580156200007e573d6000803e3d6000fd5b506001600160a01b031660805250620000d2565b611138806200257a83390190565b600060208284031215620000b357600080fd5b81516001600160a01b0381168114620000cb57600080fd5b9392505050565b60805160a05161246662000114600039600081816101870152818161037e01528181610c5101526113780152600081816101280152610cd701526124666000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063940d3c6011610076578063d041593b1161005b578063d041593b146101a9578063d087d288146101bc578063efae6e06146101c457600080fd5b8063940d3c601461016f578063b0d691fe1461018257600080fd5b8063039b1728146100a85780633a871cdd146100ed57806345b1e0ca1461010e57806370b8a01d14610123575b600080fd5b6100bb6100b6366004611cd2565b6101d7565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152015b60405180910390f35b6101006100fb366004611cf6565b61033e565b6040519081526020016100e4565b61012161011c366004611d4a565b61065a565b005b61014a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e4565b61012161017d366004611e1f565b610c12565b61014a7f000000000000000000000000000000000000000000000000000000000000000081565b6101216101b7366004611cd2565b610e0f565b610100611340565b6101216101d2366004611ecc565b6113fd565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600482018190526064602483015290600090819073ffffffffffffffffffffffffffffffffffffffff85169063cc2f845290604401600060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102799190810190611f22565b50905060005b815181101561033157600082828151811061029c5761029c611fe6565b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff16632bcadc246040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561030d575060408051601f3d908101601f1916820190925261030a91810190612015565b60015b1561031d57949694955050505050565b93508061032981612061565b91505061027f565b5060009485945092505050565b600080803661034e601482612099565b6103599282906120b0565b610362916120da565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681146103f15760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b30600061044b866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061049d6104606101408a018a612122565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505061199b9050565b90506004546001146104f15760405162461bcd60e51b815260206004820152601960248201527f6163636f756e743a206f6e6c79207468726573686f6c6420310000000000000060448201526064016103e8565b6040517f2f54bf6e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152841690632f54bf6e90602401602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190612187565b61058a57600194505b67ffffffffffffffff6020890135106105e55760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f6e73657175656e7469616c206e6f6e63650000000060448201526064016103e8565b851561064f5760008473ffffffffffffffffffffffffffffffffffffffff168760405160006040518083038185875af1925050503d8060008114610645576040519150601f19603f3d011682016040523d82523d6000602084013e61064a565b606091505b505050505b505050509392505050565b60408051604180825260808201909252600091602082018180368337019050509050601b60f81b8160408151811061069457610694611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600160f81b816002815181106106db576106db611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600160f81b8160238151811061072257610722611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060008273ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190612015565b6040517f35567e1a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526000602483015291909116906335567e1a90604401602060405180830381865afa158015610837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085b91906121a9565b604080516101608101825273ffffffffffffffffffffffffffffffffffffffff8716815260208082018490528251808201845260008082528385019190915283518083018552818152606084015260808301819052620f424060a084015260c0830181905260e08301819052610100830181905283518083018552818152610120840152610140830187905283516001808252818601909552949550919391929082015b610972604051806101600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b8152602001906001900390816108ff579050509050818160008151811061099b5761099b611fe6565b602002602001018190525060008573ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a179190612015565b6040517f1fad948c00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff821690631fad948c90610a6e908590339060040161221e565b600060405180830381600087803b158015610a8857600080fd5b505af1925050508015610a99575060015b610b9c573d808015610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5060408051600060248201526044810191909152601460648201527f41413234207369676e6174757265206572726f72000000000000000000000000608482015260a40160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f220266b600000000000000000000000000000000000000000000000000000000178152915190912082519183019190912014610b96578060405162461bcd60e51b81526004016103e89190612380565b50610c09565b60405162461bcd60e51b8152602060048201526024808201527f76616c6964617465456970343333373a2068616e646c654f7073206d7573742060448201527f6661696c0000000000000000000000000000000000000000000000000000000060648201526084016103e8565b50505050505050565b60008036610c21601482612099565b610c2c9282906120b0565b610c35916120da565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114610cbf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064016103e8565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d6a5760405162461bcd60e51b815260206004820152602160248201527f6163636f756e743a206e6f742066726f6d204549503433333746616c6c62616360448201527f6b0000000000000000000000000000000000000000000000000000000000000060648201526084016103e8565b6000610d99868686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6119bf565b90506000610dc67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a06565b905081610c0957604481511015610ddc57600080fd5b60048101905080806020019051810190610df69190612393565b60405162461bcd60e51b81526004016103e89190612380565b60003090508073ffffffffffffffffffffffffffffffffffffffff16632d9ad53d8373ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c9190612187565b15610f9f5760405162461bcd60e51b815260206004820152602c60248201527f7365747570343333374d6f64756c65733a20656e747279706f696e7420616c7260448201527f6561647920656e61626c6564000000000000000000000000000000000000000060648201526084016103e8565b8073ffffffffffffffffffffffffffffffffffffffff16632d9ad53d8373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b79190612187565b1561112a5760405162461bcd60e51b815260206004820152603160248201527f7365747570343333374d6f64756c65733a206569703433333746616c6c62616360448201527f6b20616c726561647920656e61626c656400000000000000000000000000000060648201526084016103e8565b8073ffffffffffffffffffffffffffffffffffffffff1663610b59258373ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663610b59258373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561132457600080fd5b505af1158015611338573d6000803e3d6000fd5b505050505050565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906335567e1a90604401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906121a9565b905090565b600030905060008373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114739190612015565b6040517f2d9ad53d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925090831690632d9ad53d90602401602060405180830381865afa1580156114e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115079190612187565b6115795760405162461bcd60e51b815260206004820152602f60248201527f7265706c616365454950343333374d616e616765723a206f6c644d616e61676560448201527f72206973206e6f7420616374697665000000000000000000000000000000000060648201526084016103e8565b8173ffffffffffffffffffffffffffffffffffffffff1663e009cfde828673ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116059190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b50506040517fe009cfde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015284811660248301528516925063e009cfde9150604401600060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b5050505060008373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117849190612015565b90508273ffffffffffffffffffffffffffffffffffffffff1663610b59258573ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561187757600080fd5b505af115801561188b573d6000803e3d6000fd5b50506040517f610b592500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528616925063610b59259150602401600060405180830381600087803b1580156118f857600080fd5b505af115801561190c573d6000803e3d6000fd5b50506040517ff08a032300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528616925063f08a03239150602401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b50505050611338838561065a565b60008060006119aa8585611a32565b915091506119b781611a77565b509392505050565b600060018360018111156119d5576119d5612401565b036119ed576000808551602087018986f490506119fd565b600080855160208701888a87f190505b95945050505050565b60603d82811115611a145750815b604051602082018101604052818152816000602083013e9392505050565b6000808251604103611a685760208301516040840151606085015160001a611a5c87828585611bdf565b94509450505050611a70565b506000905060025b9250929050565b6000816004811115611a8b57611a8b612401565b03611a935750565b6001816004811115611aa757611aa7612401565b03611af45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103e8565b6002816004811115611b0857611b08612401565b03611b555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016103e8565b6003816004811115611b6957611b69612401565b03611bdc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016103e8565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611ca7565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c6a573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611ca057600060019250925050611ca7565b9150600090505b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611bdc57600080fd5b600060208284031215611ce457600080fd5b8135611cef81611cb0565b9392505050565b600080600060608486031215611d0b57600080fd5b833567ffffffffffffffff811115611d2257600080fd5b84016101608187031215611d3557600080fd5b95602085013595506040909401359392505050565b60008060408385031215611d5d57600080fd5b8235611d6881611cb0565b91506020830135611d7881611cb0565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ddb57611ddb611d83565b604052919050565b600067ffffffffffffffff821115611dfd57611dfd611d83565b50601f01601f191660200190565b803560028110611e1a57600080fd5b919050565b60008060008060808587031215611e3557600080fd5b8435611e4081611cb0565b935060208501359250604085013567ffffffffffffffff811115611e6357600080fd5b8501601f81018713611e7457600080fd5b8035611e87611e8282611de3565b611db2565b818152886020838501011115611e9c57600080fd5b81602084016020830137600060208383010152809450505050611ec160608601611e0b565b905092959194509250565b600080600060608486031215611ee157600080fd5b8335611eec81611cb0565b92506020840135611efc81611cb0565b91506040840135611f0c81611cb0565b809150509250925092565b8051611e1a81611cb0565b60008060408385031215611f3557600080fd5b825167ffffffffffffffff80821115611f4d57600080fd5b818501915085601f830112611f6157600080fd5b8151602082821115611f7557611f75611d83565b8160051b9250611f86818401611db2565b8281529284018101928181019089851115611fa057600080fd5b948201945b84861015611fca5785519350611fba84611cb0565b8382529482019490820190611fa5565b9650611fd99050878201611f17565b9450505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561202757600080fd5b8151611cef81611cb0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361209257612092612032565b5060010190565b6000828210156120ab576120ab612032565b500390565b600080858511156120c057600080fd5b838611156120cd57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561211a5780818660140360031b1b83161692505b505092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261215757600080fd5b83018035915067ffffffffffffffff82111561217257600080fd5b602001915036819003821315611a7057600080fd5b60006020828403121561219957600080fd5b81518015158114611cef57600080fd5b6000602082840312156121bb57600080fd5b5051919050565b60005b838110156121dd5781810151838201526020016121c5565b838111156121ec576000848401525b50505050565b6000815180845261220a8160208601602086016121c2565b601f01601f19169290920160200192915050565b60006040808301818452808651808352606092508286019150828160051b8701016020808a0160005b8481101561234d578984037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00186528151805173ffffffffffffffffffffffffffffffffffffffff168552610160848201518587015289820151818b8801526122b2828801826121f2565b915050888201518682038a8801526122ca82826121f2565b6080848101519089015260a0808501519089015260c0808501519089015260e08085015190890152610100808501519089015261012080850151898303828b0152919350915061231a83826121f2565b92505050610140808301519250868203818801525061233981836121f2565b978501979550505090820190600101612247565b50508196506123738189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b602081526000611cef60208301846121f2565b6000602082840312156123a557600080fd5b815167ffffffffffffffff8111156123bc57600080fd5b8201601f810184136123cd57600080fd5b80516123db611e8282611de3565b8181528560208385010111156123f057600080fd5b6119fd8260208301602086016121c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ed41c9f6d995f123c6c7c1774ab3c5f2fcdbe1fab4922d653566ecf6c53fa79164736f6c634300080f003360a060405234801561001057600080fd5b5060405161113838038061113883398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516110a66100926000396000818161019b015261061601526110a66000f3fe608060405234801561001057600080fd5b50600436106100d35760003560e01c8063940d3c6011610081578063d087d2881161005b578063d087d2881461029a578063f23a6e61146102a2578063ffa1ad74146102db57600080fd5b8063940d3c6014610203578063a3f4df7e14610216578063bc197c811461025f57600080fd5b80631626ba7e116100b25780631626ba7e146101835780632bcadc24146101965780633a871cdd146101e257600080fd5b806223de29146100d857806301ffc9a7146100f2578063150b7a021461011a575b600080fd5b6100f06100e63660046109e2565b5050505050505050565b005b610105610100366004610a8d565b610317565b60405190151581526020015b60405180910390f35b610152610128366004610acf565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610111565b610152610191366004610c1c565b6103fc565b6101bd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b6101f56101f0366004610c63565b610554565b604051908152602001610111565b6100f0610211366004610cb7565b61057e565b6102526040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516101119190610d55565b61015261026d366004610dcd565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6101f561058d565b6101526102b0366004610e67565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6102526040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103aa57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806103f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080610456846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061046482856105b4565b6040517f2f54bf6e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015290915033908190632f54bf6e90602401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f79190610eef565b1561052857507f1626ba7e0000000000000000000000000000000000000000000000000000000092506103f6915050565b507fffffffff0000000000000000000000000000000000000000000000000000000092506103f6915050565b60008061055f6105d8565b9050808060200190518101906105759190610f0a565b95945050505050565b6105866105d8565b5050505050565b6000806105986105d8565b9050808060200190518101906105ae9190610f0a565b91505090565b60008060006105c385856106a6565b915091506105d0816106eb565b509392505050565b6040517f5229073f000000000000000000000000000000000000000000000000000000008152606090339060009081908390635229073f90610647907f000000000000000000000000000000000000000000000000000000000000000090859081903690600190600401610f52565b6000604051808303816000875af1158015610666573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261068e9190810190610fe6565b915091508161069f57805160208201fd5b9392505050565b60008082516041036106dc5760208301516040840151606085015160001a6106d0878285856108a6565b945094505050506106e4565b506000905060025b9250929050565b60008160048111156106ff576106ff610f23565b036107075750565b600181600481111561071b5761071b610f23565b03610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561079b5761079b610f23565b03610802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161077e565b600381600481111561081657610816610f23565b036108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161077e565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108dd575060009050600361096e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610931573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff81166109675760006001925092505061096e565b9150600090505b94509492505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099b57600080fd5b919050565b60008083601f8401126109b257600080fd5b50813567ffffffffffffffff8111156109ca57600080fd5b6020830191508360208285010111156106e457600080fd5b60008060008060008060008060c0898b0312156109fe57600080fd5b610a0789610977565b9750610a1560208a01610977565b9650610a2360408a01610977565b955060608901359450608089013567ffffffffffffffff80821115610a4757600080fd5b610a538c838d016109a0565b909650945060a08b0135915080821115610a6c57600080fd5b50610a798b828c016109a0565b999c989b5096995094979396929594505050565b600060208284031215610a9f57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461069f57600080fd5b600080600080600060808688031215610ae757600080fd5b610af086610977565b9450610afe60208701610977565b935060408601359250606086013567ffffffffffffffff811115610b2157600080fd5b610b2d888289016109a0565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610b9657610b96610b3e565b604052919050565b600067ffffffffffffffff821115610bb857610bb8610b3e565b50601f01601f191660200190565b600082601f830112610bd757600080fd5b8135610bea610be582610b9e565b610b6d565b818152846020838601011115610bff57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610c2f57600080fd5b82359150602083013567ffffffffffffffff811115610c4d57600080fd5b610c5985828601610bc6565b9150509250929050565b600080600060608486031215610c7857600080fd5b833567ffffffffffffffff811115610c8f57600080fd5b84016101608187031215610ca257600080fd5b95602085013595506040909401359392505050565b60008060008060808587031215610ccd57600080fd5b610cd685610977565b935060208501359250604085013567ffffffffffffffff811115610cf957600080fd5b610d0587828801610bc6565b925050606085013560028110610d1a57600080fd5b939692955090935050565b60005b83811015610d40578181015183820152602001610d28565b83811115610d4f576000848401525b50505050565b6020815260008251806020840152610d74816040850160208701610d25565b601f01601f19169190910160400192915050565b60008083601f840112610d9a57600080fd5b50813567ffffffffffffffff811115610db257600080fd5b6020830191508360208260051b85010111156106e457600080fd5b60008060008060008060008060a0898b031215610de957600080fd5b610df289610977565b9750610e0060208a01610977565b9650604089013567ffffffffffffffff80821115610e1d57600080fd5b610e298c838d01610d88565b909850965060608b0135915080821115610e4257600080fd5b610e4e8c838d01610d88565b909650945060808b0135915080821115610a6c57600080fd5b60008060008060008060a08789031215610e8057600080fd5b610e8987610977565b9550610e9760208801610977565b94506040870135935060608701359250608087013567ffffffffffffffff811115610ec157600080fd5b610ecd89828a016109a0565b979a9699509497509295939492505050565b8051801515811461099b57600080fd5b600060208284031215610f0157600080fd5b61069f82610edf565b600060208284031215610f1c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260806040820152826080820152828460a0830137600060a08483010152600060a0601f19601f860116830101905060028310610fd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8260608301529695505050505050565b60008060408385031215610ff957600080fd5b61100283610edf565b9150602083015167ffffffffffffffff81111561101e57600080fd5b8301601f8101851361102f57600080fd5b805161103d610be582610b9e565b81815286602083850101111561105257600080fd5b611063826020830160208601610d25565b809350505050925092905056fea2646970667358221220e7c4038a3ff6cd21c2c03e0b55e354d7463455235f93344fcb5299141d1f34d064736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x36B2 CODESIZE SUB DUP1 PUSH3 0x36B2 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xA0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD ADDRESS SWAP1 PUSH3 0x51 SWAP1 PUSH3 0x92 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x7E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH3 0xD2 JUMP JUMPDEST PUSH2 0x1138 DUP1 PUSH3 0x257A DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x2466 PUSH3 0x114 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x187 ADD MSTORE DUP2 DUP2 PUSH2 0x37E ADD MSTORE DUP2 DUP2 PUSH2 0xC51 ADD MSTORE PUSH2 0x1378 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x128 ADD MSTORE PUSH2 0xCD7 ADD MSTORE PUSH2 0x2466 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x940D3C60 GT PUSH2 0x76 JUMPI DUP1 PUSH4 0xD041593B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD041593B EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0xEFAE6E06 EQ PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x940D3C60 EQ PUSH2 0x16F JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x39B1728 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0xED JUMPI DUP1 PUSH4 0x45B1E0CA EQ PUSH2 0x10E JUMPI DUP1 PUSH4 0x70B8A01D EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CD2 JUMP JUMPDEST PUSH2 0x1D7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x1CF6 JUMP JUMPDEST PUSH2 0x33E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE4 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4A JUMP JUMPDEST PUSH2 0x65A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x14A PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE4 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x17D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1F JUMP JUMPDEST PUSH2 0xC12 JUMP JUMPDEST PUSH2 0x14A PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x1B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CD2 JUMP JUMPDEST PUSH2 0xE0F JUMP JUMPDEST PUSH2 0x100 PUSH2 0x1340 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x1D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1ECC JUMP JUMPDEST PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xCC2F845200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x64 PUSH1 0x24 DUP4 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xCC2F8452 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x251 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x279 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1F22 JUMP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x331 JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x29C JUMPI PUSH2 0x29C PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2BCADC24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x30D JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x30A SWAP2 DUP2 ADD SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x1 JUMPDEST ISZERO PUSH2 0x31D JUMPI SWAP5 SWAP7 SWAP5 SWAP6 POP POP POP POP POP JUMP JUMPDEST SWAP4 POP DUP1 PUSH2 0x329 DUP2 PUSH2 0x2061 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x27F JUMP JUMPDEST POP PUSH1 0x0 SWAP5 DUP6 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 CALLDATASIZE PUSH2 0x34E PUSH1 0x14 DUP3 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x359 SWAP3 DUP3 SWAP1 PUSH2 0x20B0 JUMP JUMPDEST PUSH2 0x362 SWAP2 PUSH2 0x20DA JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0x3F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20656E747279706F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST ADDRESS PUSH1 0x0 PUSH2 0x44B DUP7 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x49D PUSH2 0x460 PUSH2 0x140 DUP11 ADD DUP11 PUSH2 0x2122 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP7 SWAP4 SWAP3 POP POP PUSH2 0x199B SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x4 SLOAD PUSH1 0x1 EQ PUSH2 0x4F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206F6E6C79207468726573686F6C64203100000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2F54BF6E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP5 AND SWAP1 PUSH4 0x2F54BF6E SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x55D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x581 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST PUSH2 0x58A JUMPI PUSH1 0x1 SWAP5 POP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x20 DUP10 ADD CALLDATALOAD LT PUSH2 0x5E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F6E73657175656E7469616C206E6F6E636500000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP6 ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x645 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x64A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x41 DUP1 DUP3 MSTORE PUSH1 0x80 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x1B PUSH1 0xF8 SHL DUP2 PUSH1 0x40 DUP2 MLOAD DUP2 LT PUSH2 0x694 JUMPI PUSH2 0x694 PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 PUSH1 0xF8 SHL DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x6DB JUMPI PUSH2 0x6DB PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 PUSH1 0xF8 SHL DUP2 PUSH1 0x23 DUP2 MLOAD DUP2 LT PUSH2 0x722 JUMPI PUSH2 0x722 PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x79E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x7C2 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x837 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x85B SWAP2 SWAP1 PUSH2 0x21A9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x160 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE DUP4 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP4 ADD DUP6 MSTORE DUP2 DUP2 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD DUP2 SWAP1 MSTORE PUSH3 0xF4240 PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0xE0 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP4 ADD DUP6 MSTORE DUP2 DUP2 MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP4 ADD DUP8 SWAP1 MSTORE DUP4 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP5 SWAP6 POP SWAP2 SWAP4 SWAP2 SWAP3 SWAP1 DUP3 ADD JUMPDEST PUSH2 0x972 PUSH1 0x40 MLOAD DUP1 PUSH2 0x160 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x8FF JUMPI SWAP1 POP POP SWAP1 POP DUP2 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x99B JUMPI PUSH2 0x99B PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9F3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA17 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1FAD948C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x1FAD948C SWAP1 PUSH2 0xA6E SWAP1 DUP6 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x221E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xA99 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xB9C JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xAC7 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xACC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x14 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x220266B600000000000000000000000000000000000000000000000000000000 OR DUP2 MSTORE SWAP2 MLOAD SWAP1 SWAP2 KECCAK256 DUP3 MLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ PUSH2 0xB96 JUMPI DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST POP PUSH2 0xC09 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x76616C6964617465456970343333373A2068616E646C654F7073206D75737420 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6661696C00000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE PUSH2 0xC21 PUSH1 0x14 DUP3 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0xC2C SWAP3 DUP3 SWAP1 PUSH2 0x20B0 JUMP JUMPDEST PUSH2 0xC35 SWAP2 PUSH2 0x20DA JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0xCBF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20656E747279706F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xD6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D204549503433333746616C6C626163 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD99 DUP7 DUP7 DUP7 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x19BF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xDC6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1A06 JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0xC09 JUMPI PUSH1 0x44 DUP2 MLOAD LT ISZERO PUSH2 0xDDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP2 ADD SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xDF6 SWAP2 SWAP1 PUSH2 0x2393 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST PUSH1 0x0 ADDRESS SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2D9AD53D DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE7B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE9F SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF08 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xF2C SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST ISZERO PUSH2 0xF9F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7365747570343333374D6F64756C65733A20656E747279706F696E7420616C72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561647920656E61626C65640000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2D9AD53D DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1006 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x102A SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1093 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x10B7 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST ISZERO PUSH2 0x112A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x31 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7365747570343333374D6F64756C65733A206569703433333746616C6C626163 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B20616C726561647920656E61626C6564000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1191 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11B5 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x121B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x122F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x129A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12BE SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1338 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13F8 SWAP2 SWAP1 PUSH2 0x21A9 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 ADDRESS SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x144F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1473 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2D9AD53D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 SWAP3 POP SWAP1 DUP4 AND SWAP1 PUSH4 0x2D9AD53D SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14E3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1507 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST PUSH2 0x1579 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7265706C616365454950343333374D616E616765723A206F6C644D616E616765 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x72206973206E6F74206163746976650000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE009CFDE DUP3 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1605 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP6 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1686 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xE009CFDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE DUP6 AND SWAP3 POP PUSH4 0xE009CFDE SWAP2 POP PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x170F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1760 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1784 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST SWAP1 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1811 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1877 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x188B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0x610B592500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 AND SWAP3 POP PUSH4 0x610B5925 SWAP2 POP PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x190C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xF08A032300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 AND SWAP3 POP PUSH4 0xF08A0323 SWAP2 POP PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1979 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x198D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1338 DUP4 DUP6 PUSH2 0x65A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x19AA DUP6 DUP6 PUSH2 0x1A32 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x19B7 DUP2 PUSH2 0x1A77 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x19D5 JUMPI PUSH2 0x19D5 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x19ED JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x19FD JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE DUP3 DUP2 GT ISZERO PUSH2 0x1A14 JUMPI POP DUP2 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP3 ADD DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP2 PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x1A68 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x1A5C DUP8 DUP3 DUP6 DUP6 PUSH2 0x1BDF JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x1A70 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1A8B JUMPI PUSH2 0x1A8B PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1A93 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1AA7 JUMPI PUSH2 0x1AA7 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1AF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1B08 JUMPI PUSH2 0x1B08 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1B55 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1B69 JUMPI PUSH2 0x1B69 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1BDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1C16 JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x1CA7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C6A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1CA0 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x1CA7 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1CEF DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1D68 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1D78 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1DDB JUMPI PUSH2 0x1DDB PUSH2 0x1D83 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1DFD JUMPI PUSH2 0x1DFD PUSH2 0x1D83 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1E35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1E40 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 ADD PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x1E74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1E87 PUSH2 0x1E82 DUP3 PUSH2 0x1DE3 JUMP JUMPDEST PUSH2 0x1DB2 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP9 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x1E9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP4 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP PUSH2 0x1EC1 PUSH1 0x60 DUP7 ADD PUSH2 0x1E0B JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1EE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1EEC DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1EFC DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x1F0C DUP2 PUSH2 0x1CB0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x1E1A DUP2 PUSH2 0x1CB0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP3 DUP3 GT ISZERO PUSH2 0x1F75 JUMPI PUSH2 0x1F75 PUSH2 0x1D83 JUMP JUMPDEST DUP2 PUSH1 0x5 SHL SWAP3 POP PUSH2 0x1F86 DUP2 DUP5 ADD PUSH2 0x1DB2 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 DUP5 ADD DUP2 ADD SWAP3 DUP2 DUP2 ADD SWAP1 DUP10 DUP6 GT ISZERO PUSH2 0x1FA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x1FCA JUMPI DUP6 MLOAD SWAP4 POP PUSH2 0x1FBA DUP5 PUSH2 0x1CB0 JUMP JUMPDEST DUP4 DUP3 MSTORE SWAP5 DUP3 ADD SWAP5 SWAP1 DUP3 ADD SWAP1 PUSH2 0x1FA5 JUMP JUMPDEST SWAP7 POP PUSH2 0x1FD9 SWAP1 POP DUP8 DUP3 ADD PUSH2 0x1F17 JUMP JUMPDEST SWAP5 POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2027 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1CEF DUP2 PUSH2 0x1CB0 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2092 JUMPI PUSH2 0x2092 PUSH2 0x2032 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x20AB JUMPI PUSH2 0x20AB PUSH2 0x2032 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x20C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x20CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x211A JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1A70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2199 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1CEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x21BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x21DD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x21C5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x21EC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x220A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x21C2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP7 MLOAD DUP1 DUP4 MSTORE PUSH1 0x60 SWAP3 POP DUP3 DUP7 ADD SWAP2 POP DUP3 DUP2 PUSH1 0x5 SHL DUP8 ADD ADD PUSH1 0x20 DUP1 DUP11 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x234D JUMPI DUP10 DUP5 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 ADD DUP7 MSTORE DUP2 MLOAD DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 MSTORE PUSH2 0x160 DUP5 DUP3 ADD MLOAD DUP6 DUP8 ADD MSTORE DUP10 DUP3 ADD MLOAD DUP2 DUP12 DUP9 ADD MSTORE PUSH2 0x22B2 DUP3 DUP9 ADD DUP3 PUSH2 0x21F2 JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 ADD MLOAD DUP7 DUP3 SUB DUP11 DUP9 ADD MSTORE PUSH2 0x22CA DUP3 DUP3 PUSH2 0x21F2 JUMP JUMPDEST PUSH1 0x80 DUP5 DUP2 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xC0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xE0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH2 0x120 DUP1 DUP6 ADD MLOAD DUP10 DUP4 SUB DUP3 DUP12 ADD MSTORE SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x231A DUP4 DUP3 PUSH2 0x21F2 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD SWAP3 POP DUP7 DUP3 SUB DUP2 DUP9 ADD MSTORE POP PUSH2 0x2339 DUP2 DUP4 PUSH2 0x21F2 JUMP JUMPDEST SWAP8 DUP6 ADD SWAP8 SWAP6 POP POP POP SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2247 JUMP JUMPDEST POP POP DUP2 SWAP7 POP PUSH2 0x2373 DUP2 DUP10 ADD DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1CEF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x21F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x23BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0x1F DUP2 ADD DUP5 SGT PUSH2 0x23CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x23DB PUSH2 0x1E82 DUP3 PUSH2 0x1DE3 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP6 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x23F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19FD DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x21C2 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED COINBASE 0xC9 0xF6 0xD9 SWAP6 CALL 0x23 0xC6 0xC7 0xC1 PUSH24 0x4AB3C5F2FCDBE1FAB4922D653566ECF6C53FA79164736F6C PUSH4 0x4300080F STOP CALLER PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1138 CODESIZE SUB DUP1 PUSH2 0x1138 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x40 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH2 0x70 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x10A6 PUSH2 0x92 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x19B ADD MSTORE PUSH2 0x616 ADD MSTORE PUSH2 0x10A6 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x940D3C60 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xD087D288 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x2A2 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x940D3C60 EQ PUSH2 0x203 JUMPI DUP1 PUSH4 0xA3F4DF7E EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1626BA7E GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x183 JUMPI DUP1 PUSH4 0x2BCADC24 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x1E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0xD8 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xF2 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x11A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF0 PUSH2 0xE6 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E2 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST PUSH2 0x105 PUSH2 0x100 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8D JUMP JUMPDEST PUSH2 0x317 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x152 PUSH2 0x128 CALLDATASIZE PUSH1 0x4 PUSH2 0xACF JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x191 CALLDATASIZE PUSH1 0x4 PUSH2 0xC1C JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST PUSH2 0x1BD PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0xC63 JUMP JUMPDEST PUSH2 0x554 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x111 JUMP JUMPDEST PUSH2 0xF0 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0xCB7 JUMP JUMPDEST PUSH2 0x57E JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x44656661756C742043616C6C6261636B2048616E646C65720000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x111 SWAP2 SWAP1 PUSH2 0xD55 JUMP JUMPDEST PUSH2 0x152 PUSH2 0x26D CALLDATASIZE PUSH1 0x4 PUSH2 0xDCD JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x58D JUMP JUMPDEST PUSH2 0x152 PUSH2 0x2B0 CALLDATASIZE PUSH1 0x4 PUSH2 0xE67 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x252 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x3AA JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x3F6 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x456 DUP5 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x464 DUP3 DUP6 PUSH2 0x5B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2F54BF6E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 SWAP2 POP CALLER SWAP1 DUP2 SWAP1 PUSH4 0x2F54BF6E SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4F7 SWAP2 SWAP1 PUSH2 0xEEF JUMP JUMPDEST ISZERO PUSH2 0x528 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 POP PUSH2 0x3F6 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x55F PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x575 SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x586 PUSH2 0x5D8 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x598 PUSH2 0x5D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x5AE SWAP2 SWAP1 PUSH2 0xF0A JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x5C3 DUP6 DUP6 PUSH2 0x6A6 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x5D0 DUP2 PUSH2 0x6EB JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x5229073F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 CALLER SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 SWAP1 PUSH4 0x5229073F SWAP1 PUSH2 0x647 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 DUP2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0xF52 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x666 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x68E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xFE6 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x69F JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x6DC JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x6D0 DUP8 DUP3 DUP6 DUP6 PUSH2 0x8A6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x6E4 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x6FF JUMPI PUSH2 0x6FF PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x707 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x71B JUMPI PUSH2 0x71B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x787 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x79B JUMPI PUSH2 0x79B PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x802 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x77E JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH2 0x816 PUSH2 0xF23 JUMP JUMPDEST SUB PUSH2 0x8A3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x77E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x8DD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x96E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x931 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x967 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x96E JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x9B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x9FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA07 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xA15 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH2 0xA23 PUSH1 0x40 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA53 DUP13 DUP4 DUP14 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA79 DUP12 DUP3 DUP13 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xAE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAF0 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH2 0xAFE PUSH1 0x20 DUP8 ADD PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB2D DUP9 DUP3 DUP10 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB96 JUMPI PUSH2 0xB96 PUSH2 0xB3E JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xBB8 JUMPI PUSH2 0xBB8 PUSH2 0xB3E JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xBD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xBEA PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST PUSH2 0xB6D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xBFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC2F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC59 DUP6 DUP3 DUP7 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xCA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xCCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xCD6 DUP6 PUSH2 0x977 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD05 DUP8 DUP3 DUP9 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0xD1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD40 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD28 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD4F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xD74 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0xD25 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xDB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0xDE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF2 DUP10 PUSH2 0x977 JUMP JUMPDEST SWAP8 POP PUSH2 0xE00 PUSH1 0x20 DUP11 ADD PUSH2 0x977 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE29 DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xE42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE4E DUP13 DUP4 DUP14 ADD PUSH2 0xD88 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE89 DUP8 PUSH2 0x977 JUMP JUMPDEST SWAP6 POP PUSH2 0xE97 PUSH1 0x20 DUP9 ADD PUSH2 0x977 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xECD DUP10 DUP3 DUP11 ADD PUSH2 0x9A0 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x69F DUP3 PUSH2 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP2 MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD MSTORE DUP3 PUSH1 0x80 DUP3 ADD MSTORE DUP3 DUP5 PUSH1 0xA0 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0xA0 DUP5 DUP4 ADD ADD MSTORE PUSH1 0x0 PUSH1 0xA0 PUSH1 0x1F NOT PUSH1 0x1F DUP7 ADD AND DUP4 ADD ADD SWAP1 POP PUSH1 0x2 DUP4 LT PUSH2 0xFD6 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1002 DUP4 PUSH2 0xEDF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x102F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x103D PUSH2 0xBE5 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP2 DUP2 MSTORE DUP7 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x1052 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1063 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xD25 JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE7 0xC4 SUB DUP11 EXTCODEHASH 0xF6 0xCD 0x21 0xC2 0xC0 RETURNDATACOPY SIGNEXTEND SSTORE 0xE3 SLOAD 0xD7 CHAINID CALLVALUE SSTORE 0x23 0x5F SWAP4 CALLVALUE 0x4F 0xCB MSTORE SWAP10 EQ SAR 0x1F CALLVALUE 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"910:7634:88:-:0;;;1314:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1358:25:88;;;;1419:34;;1447:4;;1419:34;;;:::i;:::-;-1:-1:-1;;;;;473:32:111;;;455:51;;443:2;428:18;1419:34:88;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1393:61:88;;;-1:-1:-1;910:7634:88;;;;;;;;;;:::o;14:290:111:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:111;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:111:o;309:203::-;910:7634:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_throwError_5521":{"entryPoint":6775,"id":5521,"parameterSlots":1,"returnSlots":0},"@eip4337Fallback_18150":{"entryPoint":null,"id":18150,"parameterSlots":0,"returnSlots":0},"@entryPoint_18152":{"entryPoint":null,"id":18152,"parameterSlots":0,"returnSlots":0},"@executeAndRevert_18395":{"entryPoint":3090,"id":18395,"parameterSlots":4,"returnSlots":0},"@execute_983":{"entryPoint":6591,"id":983,"parameterSlots":5,"returnSlots":1},"@getCurrentEIP4337Manager_18803":{"entryPoint":471,"id":18803,"parameterSlots":1,"returnSlots":2},"@getNonce_18413":{"entryPoint":4928,"id":18413,"parameterSlots":0,"returnSlots":1},"@getReturnData_20671":{"entryPoint":6662,"id":20671,"parameterSlots":1,"returnSlots":1},"@recover_5594":{"entryPoint":6555,"id":5594,"parameterSlots":2,"returnSlots":1},"@replaceEIP4337Manager_18559":{"entryPoint":5117,"id":18559,"parameterSlots":3,"returnSlots":0},"@setup4337Modules_18472":{"entryPoint":3599,"id":18472,"parameterSlots":1,"returnSlots":0},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@tryRecover_5567":{"entryPoint":6706,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":7135,"id":5735,"parameterSlots":4,"returnSlots":2},"@validateEip4337_18723":{"entryPoint":1626,"id":18723,"parameterSlots":2,"returnSlots":0},"@validateUserOp_18301":{"entryPoint":830,"id":18301,"parameterSlots":3,"returnSlots":1},"abi_decode_address_fromMemory":{"entryPoint":7959,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_enum_Operation":{"entryPoint":7691,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":8213,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_contract$_EIP4337Manager_$18804t_contract$_EIP4337Manager_$18804":{"entryPoint":7884,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997":{"entryPoint":7711,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptrt_address_fromMemory":{"entryPoint":7970,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":8583,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_EIP4337Manager_$18804":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_GnosisSafe_$952":{"entryPoint":7378,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_GnosisSafe_$952t_contract$_EIP4337Manager_$18804":{"entryPoint":7498,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_string_memory_ptr_fromMemory":{"entryPoint":9107,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7414,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8617,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes":{"entryPoint":8690,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_100_by_1__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__fromStack_reversed":{"entryPoint":8734,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_rational_0_by_1_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint8_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":9088,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0e54a4de33edc81c6cfc176f50c1bc9c390da62f9cd1bb325696426e5a0ee8db__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_2fccd7f70c7ccdbee9c4b3940928cb4427d124e03dfa4ce849a9137fa8925758__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_91b96fb4968977caac8675b885caebd1ec06646e0677fdd46fda8bfdd5d1631b__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9a48bcdd69650fd0c339a97722c7855940395dd3c8b95007c34b0b8a17d9f179__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9ce825e2c2b7409720f4b2301bf91998b153ff3e973776f09a0c87172eabe0bf__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9e918bedd8a27b0077880ecc360c6b22f80afc50dd4db23be600079310866e84__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_b44df24be4dfac874ac766207425ed2b9dc7d961eda9cfb93c26bd63c0485c9c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8482,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_memory":{"entryPoint":7602,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":7651,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":8368,"id":null,"parameterSlots":4,"returnSlots":2},"checked_sub_t_uint256":{"entryPoint":8345,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":8410,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":8642,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":8289,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":8242,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":9217,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":8166,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":7555,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_contract_GnosisSafe":{"entryPoint":7344,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:19504:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"71:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"158:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"167:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"170:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:12:111"},"nodeType":"YulExpressionStatement","src":"160:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"94:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"105:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"112:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"101:3:111"},"nodeType":"YulFunctionCall","src":"101:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"91:2:111"},"nodeType":"YulFunctionCall","src":"91:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"84:6:111"},"nodeType":"YulFunctionCall","src":"84:73:111"},"nodeType":"YulIf","src":"81:93:111"}]},"name":"validator_revert_contract_GnosisSafe","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"60:5:111","type":""}],"src":"14:166:111"},{"body":{"nodeType":"YulBlock","src":"273:189:111","statements":[{"body":{"nodeType":"YulBlock","src":"319:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"328:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"331:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"321:6:111"},"nodeType":"YulFunctionCall","src":"321:12:111"},"nodeType":"YulExpressionStatement","src":"321:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"294:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"303:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"290:3:111"},"nodeType":"YulFunctionCall","src":"290:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"315:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"286:3:111"},"nodeType":"YulFunctionCall","src":"286:32:111"},"nodeType":"YulIf","src":"283:52:111"},{"nodeType":"YulVariableDeclaration","src":"344:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"370:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"357:12:111"},"nodeType":"YulFunctionCall","src":"357:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"348:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"426:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"389:36:111"},"nodeType":"YulFunctionCall","src":"389:43:111"},"nodeType":"YulExpressionStatement","src":"389:43:111"},{"nodeType":"YulAssignment","src":"441:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"451:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"441:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_GnosisSafe_$952","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"239:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"250:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"262:6:111","type":""}],"src":"185:277:111"},{"body":{"nodeType":"YulBlock","src":"511:83:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"528:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"537:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"544:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"533:3:111"},"nodeType":"YulFunctionCall","src":"533:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"521:6:111"},"nodeType":"YulFunctionCall","src":"521:67:111"},"nodeType":"YulExpressionStatement","src":"521:67:111"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"495:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"502:3:111","type":""}],"src":"467:127:111"},{"body":{"nodeType":"YulBlock","src":"728:198:111","statements":[{"nodeType":"YulAssignment","src":"738:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"750:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"761:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"746:3:111"},"nodeType":"YulFunctionCall","src":"746:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"738:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"773:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"783:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"777:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"841:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"856:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"864:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"852:3:111"},"nodeType":"YulFunctionCall","src":"852:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"834:6:111"},"nodeType":"YulFunctionCall","src":"834:34:111"},"nodeType":"YulExpressionStatement","src":"834:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"888:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"899:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"884:3:111"},"nodeType":"YulFunctionCall","src":"884:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"908:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"916:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"904:3:111"},"nodeType":"YulFunctionCall","src":"904:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"877:6:111"},"nodeType":"YulFunctionCall","src":"877:43:111"},"nodeType":"YulExpressionStatement","src":"877:43:111"}]},"name":"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"689:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"700:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"708:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"719:4:111","type":""}],"src":"599:327:111"},{"body":{"nodeType":"YulBlock","src":"1069:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"1115:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1124:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1127:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1117:6:111"},"nodeType":"YulFunctionCall","src":"1117:12:111"},"nodeType":"YulExpressionStatement","src":"1117:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1090:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1099:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1086:3:111"},"nodeType":"YulFunctionCall","src":"1086:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1111:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1082:3:111"},"nodeType":"YulFunctionCall","src":"1082:32:111"},"nodeType":"YulIf","src":"1079:52:111"},{"nodeType":"YulVariableDeclaration","src":"1140:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1167:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1154:12:111"},"nodeType":"YulFunctionCall","src":"1154:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1144:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1220:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1229:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1232:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1222:6:111"},"nodeType":"YulFunctionCall","src":"1222:12:111"},"nodeType":"YulExpressionStatement","src":"1222:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1192:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1200:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1189:2:111"},"nodeType":"YulFunctionCall","src":"1189:30:111"},"nodeType":"YulIf","src":"1186:50:111"},{"nodeType":"YulVariableDeclaration","src":"1245:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1259:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1270:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1255:3:111"},"nodeType":"YulFunctionCall","src":"1255:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1249:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1316:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1325:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1328:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1318:6:111"},"nodeType":"YulFunctionCall","src":"1318:12:111"},"nodeType":"YulExpressionStatement","src":"1318:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1297:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1306:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1293:3:111"},"nodeType":"YulFunctionCall","src":"1293:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"1311:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1289:3:111"},"nodeType":"YulFunctionCall","src":"1289:26:111"},"nodeType":"YulIf","src":"1286:46:111"},{"nodeType":"YulAssignment","src":"1341:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"1351:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1341:6:111"}]},{"nodeType":"YulAssignment","src":"1362:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1389:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1400:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1385:3:111"},"nodeType":"YulFunctionCall","src":"1385:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1372:12:111"},"nodeType":"YulFunctionCall","src":"1372:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1362:6:111"}]},{"nodeType":"YulAssignment","src":"1413:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1451:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1436:3:111"},"nodeType":"YulFunctionCall","src":"1436:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1423:12:111"},"nodeType":"YulFunctionCall","src":"1423:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1413:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1019:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1030:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1042:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1050:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1058:6:111","type":""}],"src":"931:530:111"},{"body":{"nodeType":"YulBlock","src":"1567:76:111","statements":[{"nodeType":"YulAssignment","src":"1577:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1589:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1600:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1585:3:111"},"nodeType":"YulFunctionCall","src":"1585:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1577:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1619:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1630:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1612:6:111"},"nodeType":"YulFunctionCall","src":"1612:25:111"},"nodeType":"YulExpressionStatement","src":"1612:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1536:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1547:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1558:4:111","type":""}],"src":"1466:177:111"},{"body":{"nodeType":"YulBlock","src":"1777:325:111","statements":[{"body":{"nodeType":"YulBlock","src":"1823:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1832:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1835:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1825:6:111"},"nodeType":"YulFunctionCall","src":"1825:12:111"},"nodeType":"YulExpressionStatement","src":"1825:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1798:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1807:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1794:3:111"},"nodeType":"YulFunctionCall","src":"1794:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1819:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1790:3:111"},"nodeType":"YulFunctionCall","src":"1790:32:111"},"nodeType":"YulIf","src":"1787:52:111"},{"nodeType":"YulVariableDeclaration","src":"1848:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1874:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1861:12:111"},"nodeType":"YulFunctionCall","src":"1861:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1852:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1930:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"1893:36:111"},"nodeType":"YulFunctionCall","src":"1893:43:111"},"nodeType":"YulExpressionStatement","src":"1893:43:111"},{"nodeType":"YulAssignment","src":"1945:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1955:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1945:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1969:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2012:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1997:3:111"},"nodeType":"YulFunctionCall","src":"1997:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1984:12:111"},"nodeType":"YulFunctionCall","src":"1984:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1973:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2062:7:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"2025:36:111"},"nodeType":"YulFunctionCall","src":"2025:45:111"},"nodeType":"YulExpressionStatement","src":"2025:45:111"},{"nodeType":"YulAssignment","src":"2079:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2089:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2079:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_GnosisSafe_$952t_contract$_EIP4337Manager_$18804","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1735:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1746:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1758:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1766:6:111","type":""}],"src":"1648:454:111"},{"body":{"nodeType":"YulBlock","src":"2208:125:111","statements":[{"nodeType":"YulAssignment","src":"2218:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2230:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2241:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2226:3:111"},"nodeType":"YulFunctionCall","src":"2226:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2218:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2260:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2275:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2283:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2271:3:111"},"nodeType":"YulFunctionCall","src":"2271:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2253:6:111"},"nodeType":"YulFunctionCall","src":"2253:74:111"},"nodeType":"YulExpressionStatement","src":"2253:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2177:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2188:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2199:4:111","type":""}],"src":"2107:226:111"},{"body":{"nodeType":"YulBlock","src":"2370:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2387:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2390:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2380:6:111"},"nodeType":"YulFunctionCall","src":"2380:88:111"},"nodeType":"YulExpressionStatement","src":"2380:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2484:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2487:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2477:6:111"},"nodeType":"YulFunctionCall","src":"2477:15:111"},"nodeType":"YulExpressionStatement","src":"2477:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2508:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2511:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2501:6:111"},"nodeType":"YulFunctionCall","src":"2501:15:111"},"nodeType":"YulExpressionStatement","src":"2501:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"2338:184:111"},{"body":{"nodeType":"YulBlock","src":"2572:289:111","statements":[{"nodeType":"YulAssignment","src":"2582:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2598:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2592:5:111"},"nodeType":"YulFunctionCall","src":"2592:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2582:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2610:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"2632:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"2648:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"2654:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2644:3:111"},"nodeType":"YulFunctionCall","src":"2644:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"2659:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2640:3:111"},"nodeType":"YulFunctionCall","src":"2640:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2628:3:111"},"nodeType":"YulFunctionCall","src":"2628:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"2614:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2802:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2804:16:111"},"nodeType":"YulFunctionCall","src":"2804:18:111"},"nodeType":"YulExpressionStatement","src":"2804:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2745:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"2757:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2742:2:111"},"nodeType":"YulFunctionCall","src":"2742:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2781:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"2793:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2778:2:111"},"nodeType":"YulFunctionCall","src":"2778:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"2739:2:111"},"nodeType":"YulFunctionCall","src":"2739:62:111"},"nodeType":"YulIf","src":"2736:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2840:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"2844:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2833:6:111"},"nodeType":"YulFunctionCall","src":"2833:22:111"},"nodeType":"YulExpressionStatement","src":"2833:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"2552:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"2561:6:111","type":""}],"src":"2527:334:111"},{"body":{"nodeType":"YulBlock","src":"2923:188:111","statements":[{"body":{"nodeType":"YulBlock","src":"2967:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2969:16:111"},"nodeType":"YulFunctionCall","src":"2969:18:111"},"nodeType":"YulExpressionStatement","src":"2969:18:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2939:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2947:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2936:2:111"},"nodeType":"YulFunctionCall","src":"2936:30:111"},"nodeType":"YulIf","src":"2933:56:111"},{"nodeType":"YulAssignment","src":"2998:107:111","value":{"arguments":[{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3018:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3026:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3014:3:111"},"nodeType":"YulFunctionCall","src":"3014:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3031:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3010:3:111"},"nodeType":"YulFunctionCall","src":"3010:88:111"},{"kind":"number","nodeType":"YulLiteral","src":"3100:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3006:3:111"},"nodeType":"YulFunctionCall","src":"3006:99:111"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"2998:4:111"}]}]},"name":"array_allocation_size_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"2903:6:111","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"2914:4:111","type":""}],"src":"2866:245:111"},{"body":{"nodeType":"YulBlock","src":"3172:94:111","statements":[{"nodeType":"YulAssignment","src":"3182:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3204:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3191:12:111"},"nodeType":"YulFunctionCall","src":"3191:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"3182:5:111"}]},{"body":{"nodeType":"YulBlock","src":"3244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3246:6:111"},"nodeType":"YulFunctionCall","src":"3246:12:111"},"nodeType":"YulExpressionStatement","src":"3246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3233:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3240:1:111","type":"","value":"2"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3230:2:111"},"nodeType":"YulFunctionCall","src":"3230:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3223:6:111"},"nodeType":"YulFunctionCall","src":"3223:20:111"},"nodeType":"YulIf","src":"3220:40:111"}]},"name":"abi_decode_enum_Operation","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3151:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"3162:5:111","type":""}],"src":"3116:150:111"},{"body":{"nodeType":"YulBlock","src":"3415:838:111","statements":[{"body":{"nodeType":"YulBlock","src":"3462:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3471:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3474:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3464:6:111"},"nodeType":"YulFunctionCall","src":"3464:12:111"},"nodeType":"YulExpressionStatement","src":"3464:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3436:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3445:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3432:3:111"},"nodeType":"YulFunctionCall","src":"3432:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3457:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3428:3:111"},"nodeType":"YulFunctionCall","src":"3428:33:111"},"nodeType":"YulIf","src":"3425:53:111"},{"nodeType":"YulVariableDeclaration","src":"3487:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3513:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3500:12:111"},"nodeType":"YulFunctionCall","src":"3500:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3491:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3569:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"3532:36:111"},"nodeType":"YulFunctionCall","src":"3532:43:111"},"nodeType":"YulExpressionStatement","src":"3532:43:111"},{"nodeType":"YulAssignment","src":"3584:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3594:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3584:6:111"}]},{"nodeType":"YulAssignment","src":"3608:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3635:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3646:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3631:3:111"},"nodeType":"YulFunctionCall","src":"3631:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3618:12:111"},"nodeType":"YulFunctionCall","src":"3618:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3608:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3659:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3690:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3701:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3686:3:111"},"nodeType":"YulFunctionCall","src":"3686:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3673:12:111"},"nodeType":"YulFunctionCall","src":"3673:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3663:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3748:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3757:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3760:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3750:6:111"},"nodeType":"YulFunctionCall","src":"3750:12:111"},"nodeType":"YulExpressionStatement","src":"3750:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3720:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3728:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3717:2:111"},"nodeType":"YulFunctionCall","src":"3717:30:111"},"nodeType":"YulIf","src":"3714:50:111"},{"nodeType":"YulVariableDeclaration","src":"3773:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3787:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3798:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3783:3:111"},"nodeType":"YulFunctionCall","src":"3783:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3777:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3853:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3862:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3865:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3855:6:111"},"nodeType":"YulFunctionCall","src":"3855:12:111"},"nodeType":"YulExpressionStatement","src":"3855:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3832:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3836:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3828:3:111"},"nodeType":"YulFunctionCall","src":"3828:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3843:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3824:3:111"},"nodeType":"YulFunctionCall","src":"3824:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3817:6:111"},"nodeType":"YulFunctionCall","src":"3817:35:111"},"nodeType":"YulIf","src":"3814:55:111"},{"nodeType":"YulVariableDeclaration","src":"3878:26:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"3901:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3888:12:111"},"nodeType":"YulFunctionCall","src":"3888:16:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3882:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3913:61:111","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3970:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"3942:27:111"},"nodeType":"YulFunctionCall","src":"3942:31:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"3926:15:111"},"nodeType":"YulFunctionCall","src":"3926:48:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"3917:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"3990:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"3997:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3983:6:111"},"nodeType":"YulFunctionCall","src":"3983:17:111"},"nodeType":"YulExpressionStatement","src":"3983:17:111"},{"body":{"nodeType":"YulBlock","src":"4046:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4055:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4058:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4048:6:111"},"nodeType":"YulFunctionCall","src":"4048:12:111"},"nodeType":"YulExpressionStatement","src":"4048:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"4023:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4027:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4019:3:111"},"nodeType":"YulFunctionCall","src":"4019:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"4032:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4015:3:111"},"nodeType":"YulFunctionCall","src":"4015:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4037:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4012:2:111"},"nodeType":"YulFunctionCall","src":"4012:33:111"},"nodeType":"YulIf","src":"4009:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"4088:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4095:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4084:3:111"},"nodeType":"YulFunctionCall","src":"4084:14:111"},{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"4104:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4108:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4100:3:111"},"nodeType":"YulFunctionCall","src":"4100:11:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4113:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"4071:12:111"},"nodeType":"YulFunctionCall","src":"4071:45:111"},"nodeType":"YulExpressionStatement","src":"4071:45:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"4140:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"4147:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4136:3:111"},"nodeType":"YulFunctionCall","src":"4136:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"4152:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4132:3:111"},"nodeType":"YulFunctionCall","src":"4132:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4157:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4125:6:111"},"nodeType":"YulFunctionCall","src":"4125:34:111"},"nodeType":"YulExpressionStatement","src":"4125:34:111"},{"nodeType":"YulAssignment","src":"4168:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"4178:5:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4168:6:111"}]},{"nodeType":"YulAssignment","src":"4192:55:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4232:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4243:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4228:3:111"},"nodeType":"YulFunctionCall","src":"4228:18:111"}],"functionName":{"name":"abi_decode_enum_Operation","nodeType":"YulIdentifier","src":"4202:25:111"},"nodeType":"YulFunctionCall","src":"4202:45:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4192:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3357:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3368:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3380:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3388:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3396:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3404:6:111","type":""}],"src":"3271:982:111"},{"body":{"nodeType":"YulBlock","src":"4352:189:111","statements":[{"body":{"nodeType":"YulBlock","src":"4398:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4407:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4410:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4400:6:111"},"nodeType":"YulFunctionCall","src":"4400:12:111"},"nodeType":"YulExpressionStatement","src":"4400:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4373:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4382:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4369:3:111"},"nodeType":"YulFunctionCall","src":"4369:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4394:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4365:3:111"},"nodeType":"YulFunctionCall","src":"4365:32:111"},"nodeType":"YulIf","src":"4362:52:111"},{"nodeType":"YulVariableDeclaration","src":"4423:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4449:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4436:12:111"},"nodeType":"YulFunctionCall","src":"4436:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4427:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4505:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"4468:36:111"},"nodeType":"YulFunctionCall","src":"4468:43:111"},"nodeType":"YulExpressionStatement","src":"4468:43:111"},{"nodeType":"YulAssignment","src":"4520:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4530:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4520:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_EIP4337Manager_$18804","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4318:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4329:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4341:6:111","type":""}],"src":"4258:283:111"},{"body":{"nodeType":"YulBlock","src":"4698:461:111","statements":[{"body":{"nodeType":"YulBlock","src":"4744:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4753:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4756:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4746:6:111"},"nodeType":"YulFunctionCall","src":"4746:12:111"},"nodeType":"YulExpressionStatement","src":"4746:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4719:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4728:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4715:3:111"},"nodeType":"YulFunctionCall","src":"4715:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4740:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4711:3:111"},"nodeType":"YulFunctionCall","src":"4711:32:111"},"nodeType":"YulIf","src":"4708:52:111"},{"nodeType":"YulVariableDeclaration","src":"4769:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4795:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4782:12:111"},"nodeType":"YulFunctionCall","src":"4782:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4773:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4851:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"4814:36:111"},"nodeType":"YulFunctionCall","src":"4814:43:111"},"nodeType":"YulExpressionStatement","src":"4814:43:111"},{"nodeType":"YulAssignment","src":"4866:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4876:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4866:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4890:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4922:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4933:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4918:3:111"},"nodeType":"YulFunctionCall","src":"4918:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4905:12:111"},"nodeType":"YulFunctionCall","src":"4905:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"4894:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4983:7:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"4946:36:111"},"nodeType":"YulFunctionCall","src":"4946:45:111"},"nodeType":"YulExpressionStatement","src":"4946:45:111"},{"nodeType":"YulAssignment","src":"5000:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"5010:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5000:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"5026:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5058:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5069:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5054:3:111"},"nodeType":"YulFunctionCall","src":"5054:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5041:12:111"},"nodeType":"YulFunctionCall","src":"5041:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"5030:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"5119:7:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"5082:36:111"},"nodeType":"YulFunctionCall","src":"5082:45:111"},"nodeType":"YulExpressionStatement","src":"5082:45:111"},{"nodeType":"YulAssignment","src":"5136:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"5146:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5136:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_contract$_EIP4337Manager_$18804t_contract$_EIP4337Manager_$18804","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4648:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4659:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4671:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4679:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4687:6:111","type":""}],"src":"4546:613:111"},{"body":{"nodeType":"YulBlock","src":"5303:168:111","statements":[{"nodeType":"YulAssignment","src":"5313:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5336:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5321:3:111"},"nodeType":"YulFunctionCall","src":"5321:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5313:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5355:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5370:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5378:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5366:3:111"},"nodeType":"YulFunctionCall","src":"5366:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5348:6:111"},"nodeType":"YulFunctionCall","src":"5348:74:111"},"nodeType":"YulExpressionStatement","src":"5348:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5442:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5453:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5438:3:111"},"nodeType":"YulFunctionCall","src":"5438:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"5458:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5431:6:111"},"nodeType":"YulFunctionCall","src":"5431:34:111"},"nodeType":"YulExpressionStatement","src":"5431:34:111"}]},"name":"abi_encode_tuple_t_address_t_rational_100_by_1__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5264:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5275:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5283:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5294:4:111","type":""}],"src":"5164:307:111"},{"body":{"nodeType":"YulBlock","src":"5536:90:111","statements":[{"nodeType":"YulAssignment","src":"5546:22:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5561:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5555:5:111"},"nodeType":"YulFunctionCall","src":"5555:13:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"5546:5:111"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5614:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"5577:36:111"},"nodeType":"YulFunctionCall","src":"5577:43:111"},"nodeType":"YulExpressionStatement","src":"5577:43:111"}]},"name":"abi_decode_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"5515:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"5526:5:111","type":""}],"src":"5476:150:111"},{"body":{"nodeType":"YulBlock","src":"5754:987:111","statements":[{"body":{"nodeType":"YulBlock","src":"5800:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5809:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5812:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5802:6:111"},"nodeType":"YulFunctionCall","src":"5802:12:111"},"nodeType":"YulExpressionStatement","src":"5802:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5775:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5784:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5771:3:111"},"nodeType":"YulFunctionCall","src":"5771:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5796:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5767:3:111"},"nodeType":"YulFunctionCall","src":"5767:32:111"},"nodeType":"YulIf","src":"5764:52:111"},{"nodeType":"YulVariableDeclaration","src":"5825:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5845:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5839:5:111"},"nodeType":"YulFunctionCall","src":"5839:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5829:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5864:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5874:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5868:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5919:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5928:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5931:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5921:6:111"},"nodeType":"YulFunctionCall","src":"5921:12:111"},"nodeType":"YulExpressionStatement","src":"5921:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5907:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5915:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5904:2:111"},"nodeType":"YulFunctionCall","src":"5904:14:111"},"nodeType":"YulIf","src":"5901:34:111"},{"nodeType":"YulVariableDeclaration","src":"5944:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5958:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5969:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5954:3:111"},"nodeType":"YulFunctionCall","src":"5954:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"5948:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6024:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6033:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6036:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6026:6:111"},"nodeType":"YulFunctionCall","src":"6026:12:111"},"nodeType":"YulExpressionStatement","src":"6026:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6003:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6007:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5999:3:111"},"nodeType":"YulFunctionCall","src":"5999:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6014:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5995:3:111"},"nodeType":"YulFunctionCall","src":"5995:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5988:6:111"},"nodeType":"YulFunctionCall","src":"5988:35:111"},"nodeType":"YulIf","src":"5985:55:111"},{"nodeType":"YulVariableDeclaration","src":"6049:19:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6065:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6059:5:111"},"nodeType":"YulFunctionCall","src":"6059:9:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6053:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6077:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6087:4:111","type":"","value":"0x20"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"6081:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6114:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6116:16:111"},"nodeType":"YulFunctionCall","src":"6116:18:111"},"nodeType":"YulExpressionStatement","src":"6116:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6106:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6110:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6103:2:111"},"nodeType":"YulFunctionCall","src":"6103:10:111"},"nodeType":"YulIf","src":"6100:36:111"},{"nodeType":"YulVariableDeclaration","src":"6145:20:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6159:1:111","type":"","value":"5"},{"name":"_3","nodeType":"YulIdentifier","src":"6162:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"6155:3:111"},"nodeType":"YulFunctionCall","src":"6155:10:111"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"6149:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6174:39:111","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"6205:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6209:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6201:3:111"},"nodeType":"YulFunctionCall","src":"6201:11:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"6185:15:111"},"nodeType":"YulFunctionCall","src":"6185:28:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"6178:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6222:16:111","value":{"name":"dst","nodeType":"YulIdentifier","src":"6235:3:111"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"6226:5:111","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6254:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"6259:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6247:6:111"},"nodeType":"YulFunctionCall","src":"6247:15:111"},"nodeType":"YulExpressionStatement","src":"6247:15:111"},{"nodeType":"YulAssignment","src":"6271:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6282:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6287:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6278:3:111"},"nodeType":"YulFunctionCall","src":"6278:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6271:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"6299:34:111","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6321:2:111"},{"name":"_5","nodeType":"YulIdentifier","src":"6325:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6317:3:111"},"nodeType":"YulFunctionCall","src":"6317:11:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6330:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6313:3:111"},"nodeType":"YulFunctionCall","src":"6313:20:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"6303:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6365:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6374:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6377:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6367:6:111"},"nodeType":"YulFunctionCall","src":"6367:12:111"},"nodeType":"YulExpressionStatement","src":"6367:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"6348:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6356:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6345:2:111"},"nodeType":"YulFunctionCall","src":"6345:19:111"},"nodeType":"YulIf","src":"6342:39:111"},{"nodeType":"YulVariableDeclaration","src":"6390:22:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6405:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6409:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6401:3:111"},"nodeType":"YulFunctionCall","src":"6401:11:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"6394:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6477:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6491:23:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6510:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6504:5:111"},"nodeType":"YulFunctionCall","src":"6504:10:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6495:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6564:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"6527:36:111"},"nodeType":"YulFunctionCall","src":"6527:43:111"},"nodeType":"YulExpressionStatement","src":"6527:43:111"},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6590:3:111"},{"name":"value","nodeType":"YulIdentifier","src":"6595:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6583:6:111"},"nodeType":"YulFunctionCall","src":"6583:18:111"},"nodeType":"YulExpressionStatement","src":"6583:18:111"},{"nodeType":"YulAssignment","src":"6614:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6625:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6630:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6621:3:111"},"nodeType":"YulFunctionCall","src":"6621:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6614:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6432:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"6437:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6429:2:111"},"nodeType":"YulFunctionCall","src":"6429:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6445:23:111","statements":[{"nodeType":"YulAssignment","src":"6447:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6458:3:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6463:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6454:3:111"},"nodeType":"YulFunctionCall","src":"6454:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"6447:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6425:3:111","statements":[]},"src":"6421:222:111"},{"nodeType":"YulAssignment","src":"6652:15:111","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"6662:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6652:6:111"}]},{"nodeType":"YulAssignment","src":"6676:59:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6720:9:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6731:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6716:3:111"},"nodeType":"YulFunctionCall","src":"6716:18:111"}],"functionName":{"name":"abi_decode_address_fromMemory","nodeType":"YulIdentifier","src":"6686:29:111"},"nodeType":"YulFunctionCall","src":"6686:49:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6676:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptrt_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5712:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5723:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5735:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5743:6:111","type":""}],"src":"5631:1110:111"},{"body":{"nodeType":"YulBlock","src":"6778:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6795:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6798:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6788:6:111"},"nodeType":"YulFunctionCall","src":"6788:88:111"},"nodeType":"YulExpressionStatement","src":"6788:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6892:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6895:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6885:6:111"},"nodeType":"YulFunctionCall","src":"6885:15:111"},"nodeType":"YulExpressionStatement","src":"6885:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6916:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6919:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6909:6:111"},"nodeType":"YulFunctionCall","src":"6909:15:111"},"nodeType":"YulExpressionStatement","src":"6909:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"6746:184:111"},{"body":{"nodeType":"YulBlock","src":"7016:182:111","statements":[{"body":{"nodeType":"YulBlock","src":"7062:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7071:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7074:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7064:6:111"},"nodeType":"YulFunctionCall","src":"7064:12:111"},"nodeType":"YulExpressionStatement","src":"7064:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7037:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7046:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7033:3:111"},"nodeType":"YulFunctionCall","src":"7033:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7058:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7029:3:111"},"nodeType":"YulFunctionCall","src":"7029:32:111"},"nodeType":"YulIf","src":"7026:52:111"},{"nodeType":"YulVariableDeclaration","src":"7087:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7106:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7100:5:111"},"nodeType":"YulFunctionCall","src":"7100:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7091:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7162:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafe","nodeType":"YulIdentifier","src":"7125:36:111"},"nodeType":"YulFunctionCall","src":"7125:43:111"},"nodeType":"YulExpressionStatement","src":"7125:43:111"},{"nodeType":"YulAssignment","src":"7177:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7187:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7177:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6982:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6993:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7005:6:111","type":""}],"src":"6935:263:111"},{"body":{"nodeType":"YulBlock","src":"7235:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7252:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7255:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7245:6:111"},"nodeType":"YulFunctionCall","src":"7245:88:111"},"nodeType":"YulExpressionStatement","src":"7245:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7349:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"7352:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7342:6:111"},"nodeType":"YulFunctionCall","src":"7342:15:111"},"nodeType":"YulExpressionStatement","src":"7342:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7373:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7376:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7366:6:111"},"nodeType":"YulFunctionCall","src":"7366:15:111"},"nodeType":"YulExpressionStatement","src":"7366:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"7203:184:111"},{"body":{"nodeType":"YulBlock","src":"7439:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"7530:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7532:16:111"},"nodeType":"YulFunctionCall","src":"7532:18:111"},"nodeType":"YulExpressionStatement","src":"7532:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7455:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7462:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"7452:2:111"},"nodeType":"YulFunctionCall","src":"7452:77:111"},"nodeType":"YulIf","src":"7449:103:111"},{"nodeType":"YulAssignment","src":"7561:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7572:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7579:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7568:3:111"},"nodeType":"YulFunctionCall","src":"7568:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"7561:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"7421:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"7431:3:111","type":""}],"src":"7392:195:111"},{"body":{"nodeType":"YulBlock","src":"7641:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"7663:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7665:16:111"},"nodeType":"YulFunctionCall","src":"7665:18:111"},"nodeType":"YulExpressionStatement","src":"7665:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7657:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7660:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7654:2:111"},"nodeType":"YulFunctionCall","src":"7654:8:111"},"nodeType":"YulIf","src":"7651:34:111"},{"nodeType":"YulAssignment","src":"7694:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7706:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7709:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7702:3:111"},"nodeType":"YulFunctionCall","src":"7702:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"7694:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"7623:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"7626:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"7632:4:111","type":""}],"src":"7592:125:111"},{"body":{"nodeType":"YulBlock","src":"7852:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"7890:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7899:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7902:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7892:6:111"},"nodeType":"YulFunctionCall","src":"7892:12:111"},"nodeType":"YulExpressionStatement","src":"7892:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"7868:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"7880:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7865:2:111"},"nodeType":"YulFunctionCall","src":"7865:24:111"},"nodeType":"YulIf","src":"7862:44:111"},{"body":{"nodeType":"YulBlock","src":"7939:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7948:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7951:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7941:6:111"},"nodeType":"YulFunctionCall","src":"7941:12:111"},"nodeType":"YulExpressionStatement","src":"7941:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7921:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"7931:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7918:2:111"},"nodeType":"YulFunctionCall","src":"7918:20:111"},"nodeType":"YulIf","src":"7915:40:111"},{"nodeType":"YulAssignment","src":"7964:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7981:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7989:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7977:3:111"},"nodeType":"YulFunctionCall","src":"7977:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"7964:9:111"}]},{"nodeType":"YulAssignment","src":"8009:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"8026:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"8036:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8022:3:111"},"nodeType":"YulFunctionCall","src":"8022:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"8009:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"7786:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"7794:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"7802:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"7814:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"7827:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"7838:9:111","type":""}],"src":"7722:331:111"},{"body":{"nodeType":"YulBlock","src":"8159:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"8169:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"8192:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8179:12:111"},"nodeType":"YulFunctionCall","src":"8179:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8173:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8207:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8217:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"8211:2:111","type":""}]},{"nodeType":"YulAssignment","src":"8292:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"8305:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"8309:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8301:3:111"},"nodeType":"YulFunctionCall","src":"8301:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"8292:5:111"}]},{"body":{"nodeType":"YulBlock","src":"8344:80:111","statements":[{"nodeType":"YulAssignment","src":"8358:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"8375:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8387:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8394:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"8398:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8390:3:111"},"nodeType":"YulFunctionCall","src":"8390:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"8383:3:111"},"nodeType":"YulFunctionCall","src":"8383:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"8405:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"8379:3:111"},"nodeType":"YulFunctionCall","src":"8379:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8371:3:111"},"nodeType":"YulFunctionCall","src":"8371:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"8411:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8367:3:111"},"nodeType":"YulFunctionCall","src":"8367:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"8358:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"8327:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"8332:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"8324:2:111"},"nodeType":"YulFunctionCall","src":"8324:11:111"},"nodeType":"YulIf","src":"8321:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"8134:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"8141:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"8149:5:111","type":""}],"src":"8058:372:111"},{"body":{"nodeType":"YulBlock","src":"8609:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8626:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8637:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8619:6:111"},"nodeType":"YulFunctionCall","src":"8619:21:111"},"nodeType":"YulExpressionStatement","src":"8619:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8660:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8671:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8656:3:111"},"nodeType":"YulFunctionCall","src":"8656:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8676:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8649:6:111"},"nodeType":"YulFunctionCall","src":"8649:30:111"},"nodeType":"YulExpressionStatement","src":"8649:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8699:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8710:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8695:3:111"},"nodeType":"YulFunctionCall","src":"8695:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20656e747279706f696e74","kind":"string","nodeType":"YulLiteral","src":"8715:30:111","type":"","value":"account: not from entrypoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8688:6:111"},"nodeType":"YulFunctionCall","src":"8688:58:111"},"nodeType":"YulExpressionStatement","src":"8688:58:111"},{"nodeType":"YulAssignment","src":"8755:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8767:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8778:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8763:3:111"},"nodeType":"YulFunctionCall","src":"8763:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8755:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8586:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8600:4:111","type":""}],"src":"8435:352:111"},{"body":{"nodeType":"YulBlock","src":"8886:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"8896:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"8935:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8922:12:111"},"nodeType":"YulFunctionCall","src":"8922:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"8900:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9095:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9104:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9107:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9097:6:111"},"nodeType":"YulFunctionCall","src":"9097:12:111"},"nodeType":"YulExpressionStatement","src":"9097:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"8970:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"8998:12:111"},"nodeType":"YulFunctionCall","src":"8998:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"9014:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8994:3:111"},"nodeType":"YulFunctionCall","src":"8994:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"9025:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8990:3:111"},"nodeType":"YulFunctionCall","src":"8990:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8966:3:111"},"nodeType":"YulFunctionCall","src":"8966:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"8959:6:111"},"nodeType":"YulFunctionCall","src":"8959:135:111"},"nodeType":"YulIf","src":"8956:155:111"},{"nodeType":"YulVariableDeclaration","src":"9120:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"9138:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"9148:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9134:3:111"},"nodeType":"YulFunctionCall","src":"9134:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"9124:6:111","type":""}]},{"nodeType":"YulAssignment","src":"9176:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9199:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9186:12:111"},"nodeType":"YulFunctionCall","src":"9186:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"9176:6:111"}]},{"body":{"nodeType":"YulBlock","src":"9249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9251:6:111"},"nodeType":"YulFunctionCall","src":"9251:12:111"},"nodeType":"YulExpressionStatement","src":"9251:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"9221:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9229:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9218:2:111"},"nodeType":"YulFunctionCall","src":"9218:30:111"},"nodeType":"YulIf","src":"9215:50:111"},{"nodeType":"YulAssignment","src":"9274:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"9286:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9294:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9282:3:111"},"nodeType":"YulFunctionCall","src":"9282:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"9274:4:111"}]},{"body":{"nodeType":"YulBlock","src":"9350:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9359:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9362:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9352:6:111"},"nodeType":"YulFunctionCall","src":"9352:12:111"},"nodeType":"YulExpressionStatement","src":"9352:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"9315:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"9325:12:111"},"nodeType":"YulFunctionCall","src":"9325:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"9341:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9321:3:111"},"nodeType":"YulFunctionCall","src":"9321:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"9311:3:111"},"nodeType":"YulFunctionCall","src":"9311:38:111"},"nodeType":"YulIf","src":"9308:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"8843:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"8853:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"8869:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"8875:6:111","type":""}],"src":"8792:580:111"},{"body":{"nodeType":"YulBlock","src":"9551:175:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9568:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9579:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9561:6:111"},"nodeType":"YulFunctionCall","src":"9561:21:111"},"nodeType":"YulExpressionStatement","src":"9561:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9602:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9613:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9598:3:111"},"nodeType":"YulFunctionCall","src":"9598:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9618:2:111","type":"","value":"25"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9591:6:111"},"nodeType":"YulFunctionCall","src":"9591:30:111"},"nodeType":"YulExpressionStatement","src":"9591:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9652:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9637:3:111"},"nodeType":"YulFunctionCall","src":"9637:18:111"},{"hexValue":"6163636f756e743a206f6e6c79207468726573686f6c642031","kind":"string","nodeType":"YulLiteral","src":"9657:27:111","type":"","value":"account: only threshold 1"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9630:6:111"},"nodeType":"YulFunctionCall","src":"9630:55:111"},"nodeType":"YulExpressionStatement","src":"9630:55:111"},{"nodeType":"YulAssignment","src":"9694:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9706:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9717:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9702:3:111"},"nodeType":"YulFunctionCall","src":"9702:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9694:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_b44df24be4dfac874ac766207425ed2b9dc7d961eda9cfb93c26bd63c0485c9c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9528:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9542:4:111","type":""}],"src":"9377:349:111"},{"body":{"nodeType":"YulBlock","src":"9809:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"9855:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9864:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9867:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9857:6:111"},"nodeType":"YulFunctionCall","src":"9857:12:111"},"nodeType":"YulExpressionStatement","src":"9857:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9830:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9839:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9826:3:111"},"nodeType":"YulFunctionCall","src":"9826:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9851:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9822:3:111"},"nodeType":"YulFunctionCall","src":"9822:32:111"},"nodeType":"YulIf","src":"9819:52:111"},{"nodeType":"YulVariableDeclaration","src":"9880:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9899:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9893:5:111"},"nodeType":"YulFunctionCall","src":"9893:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9884:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9962:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9971:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9974:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9964:6:111"},"nodeType":"YulFunctionCall","src":"9964:12:111"},"nodeType":"YulExpressionStatement","src":"9964:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9931:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9952:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9945:6:111"},"nodeType":"YulFunctionCall","src":"9945:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9938:6:111"},"nodeType":"YulFunctionCall","src":"9938:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"9928:2:111"},"nodeType":"YulFunctionCall","src":"9928:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9921:6:111"},"nodeType":"YulFunctionCall","src":"9921:40:111"},"nodeType":"YulIf","src":"9918:60:111"},{"nodeType":"YulAssignment","src":"9987:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9997:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9987:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9775:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9786:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9798:6:111","type":""}],"src":"9731:277:111"},{"body":{"nodeType":"YulBlock","src":"10187:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10204:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10215:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10197:6:111"},"nodeType":"YulFunctionCall","src":"10197:21:111"},"nodeType":"YulExpressionStatement","src":"10197:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10238:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10249:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10234:3:111"},"nodeType":"YulFunctionCall","src":"10234:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10254:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10227:6:111"},"nodeType":"YulFunctionCall","src":"10227:30:111"},"nodeType":"YulExpressionStatement","src":"10227:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10277:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10288:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10273:3:111"},"nodeType":"YulFunctionCall","src":"10273:18:111"},{"hexValue":"6163636f756e743a206e6f6e73657175656e7469616c206e6f6e6365","kind":"string","nodeType":"YulLiteral","src":"10293:30:111","type":"","value":"account: nonsequential nonce"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10266:6:111"},"nodeType":"YulFunctionCall","src":"10266:58:111"},"nodeType":"YulExpressionStatement","src":"10266:58:111"},{"nodeType":"YulAssignment","src":"10333:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10345:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10356:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10341:3:111"},"nodeType":"YulFunctionCall","src":"10341:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10333:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0e54a4de33edc81c6cfc176f50c1bc9c390da62f9cd1bb325696426e5a0ee8db__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10164:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10178:4:111","type":""}],"src":"10013:352:111"},{"body":{"nodeType":"YulBlock","src":"10561:14:111","statements":[{"nodeType":"YulAssignment","src":"10563:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"10570:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"10563:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"10545:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"10553:3:111","type":""}],"src":"10370:205:111"},{"body":{"nodeType":"YulBlock","src":"10717:225:111","statements":[{"nodeType":"YulAssignment","src":"10727:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10739:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10750:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10735:3:111"},"nodeType":"YulFunctionCall","src":"10735:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10727:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10769:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10784:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10792:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10780:3:111"},"nodeType":"YulFunctionCall","src":"10780:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10762:6:111"},"nodeType":"YulFunctionCall","src":"10762:74:111"},"nodeType":"YulExpressionStatement","src":"10762:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10856:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10867:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10852:3:111"},"nodeType":"YulFunctionCall","src":"10852:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10876:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10884:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10872:3:111"},"nodeType":"YulFunctionCall","src":"10872:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10845:6:111"},"nodeType":"YulFunctionCall","src":"10845:91:111"},"nodeType":"YulExpressionStatement","src":"10845:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10678:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10689:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10697:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10708:4:111","type":""}],"src":"10580:362:111"},{"body":{"nodeType":"YulBlock","src":"11028:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"11074:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11083:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11086:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11076:6:111"},"nodeType":"YulFunctionCall","src":"11076:12:111"},"nodeType":"YulExpressionStatement","src":"11076:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11049:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11058:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11045:3:111"},"nodeType":"YulFunctionCall","src":"11045:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11070:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11041:3:111"},"nodeType":"YulFunctionCall","src":"11041:32:111"},"nodeType":"YulIf","src":"11038:52:111"},{"nodeType":"YulAssignment","src":"11099:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11115:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11109:5:111"},"nodeType":"YulFunctionCall","src":"11109:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11099:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10994:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11005:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11017:6:111","type":""}],"src":"10947:184:111"},{"body":{"nodeType":"YulBlock","src":"11189:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11199:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11208:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"11203:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11268:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11293:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"11298:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11289:3:111"},"nodeType":"YulFunctionCall","src":"11289:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"11312:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"11317:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11308:3:111"},"nodeType":"YulFunctionCall","src":"11308:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11302:5:111"},"nodeType":"YulFunctionCall","src":"11302:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11282:6:111"},"nodeType":"YulFunctionCall","src":"11282:39:111"},"nodeType":"YulExpressionStatement","src":"11282:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"11229:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"11232:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11226:2:111"},"nodeType":"YulFunctionCall","src":"11226:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"11240:19:111","statements":[{"nodeType":"YulAssignment","src":"11242:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"11251:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"11254:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11247:3:111"},"nodeType":"YulFunctionCall","src":"11247:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"11242:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"11222:3:111","statements":[]},"src":"11218:113:111"},{"body":{"nodeType":"YulBlock","src":"11357:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11370:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"11375:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11366:3:111"},"nodeType":"YulFunctionCall","src":"11366:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"11384:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11359:6:111"},"nodeType":"YulFunctionCall","src":"11359:27:111"},"nodeType":"YulExpressionStatement","src":"11359:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"11346:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"11349:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11343:2:111"},"nodeType":"YulFunctionCall","src":"11343:13:111"},"nodeType":"YulIf","src":"11340:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"11167:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"11172:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"11177:6:111","type":""}],"src":"11136:258:111"},{"body":{"nodeType":"YulBlock","src":"11448:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11458:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11478:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11472:5:111"},"nodeType":"YulFunctionCall","src":"11472:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"11462:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11500:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"11505:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11493:6:111"},"nodeType":"YulFunctionCall","src":"11493:19:111"},"nodeType":"YulExpressionStatement","src":"11493:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11547:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11554:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11543:3:111"},"nodeType":"YulFunctionCall","src":"11543:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11565:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11570:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11561:3:111"},"nodeType":"YulFunctionCall","src":"11561:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"11577:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"11521:21:111"},"nodeType":"YulFunctionCall","src":"11521:63:111"},"nodeType":"YulExpressionStatement","src":"11521:63:111"},{"nodeType":"YulAssignment","src":"11593:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"11608:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"11621:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11629:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11617:3:111"},"nodeType":"YulFunctionCall","src":"11617:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"11634:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11613:3:111"},"nodeType":"YulFunctionCall","src":"11613:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11604:3:111"},"nodeType":"YulFunctionCall","src":"11604:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"11704:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11600:3:111"},"nodeType":"YulFunctionCall","src":"11600:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"11593:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"11425:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"11432:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"11440:3:111","type":""}],"src":"11399:316:111"},{"body":{"nodeType":"YulBlock","src":"11979:2074:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11989:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11999:2:111","type":"","value":"64"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11993:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12010:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12028:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12039:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12024:3:111"},"nodeType":"YulFunctionCall","src":"12024:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"12014:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12058:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12069:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12051:6:111"},"nodeType":"YulFunctionCall","src":"12051:21:111"},"nodeType":"YulExpressionStatement","src":"12051:21:111"},{"nodeType":"YulVariableDeclaration","src":"12081:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"12092:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"12085:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12107:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12127:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12121:5:111"},"nodeType":"YulFunctionCall","src":"12121:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"12111:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"12150:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"12158:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12143:6:111"},"nodeType":"YulFunctionCall","src":"12143:22:111"},"nodeType":"YulExpressionStatement","src":"12143:22:111"},{"nodeType":"YulVariableDeclaration","src":"12174:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12184:2:111","type":"","value":"96"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"12178:2:111","type":""}]},{"nodeType":"YulAssignment","src":"12195:25:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12206:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12217:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12202:3:111"},"nodeType":"YulFunctionCall","src":"12202:18:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"12195:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"12229:53:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12251:9:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12266:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"12269:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"12262:3:111"},"nodeType":"YulFunctionCall","src":"12262:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12247:3:111"},"nodeType":"YulFunctionCall","src":"12247:30:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12279:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12243:3:111"},"nodeType":"YulFunctionCall","src":"12243:39:111"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"12233:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12291:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12301:4:111","type":"","value":"0x20"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"12295:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12314:29:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12332:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"12340:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12328:3:111"},"nodeType":"YulFunctionCall","src":"12328:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"12318:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12352:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12361:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"12356:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12420:1549:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"12441:3:111"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12454:6:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"12462:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12450:3:111"},"nodeType":"YulFunctionCall","src":"12450:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"12474:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12446:3:111"},"nodeType":"YulFunctionCall","src":"12446:95:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12434:6:111"},"nodeType":"YulFunctionCall","src":"12434:108:111"},"nodeType":"YulExpressionStatement","src":"12434:108:111"},{"nodeType":"YulVariableDeclaration","src":"12555:23:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"12571:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12565:5:111"},"nodeType":"YulFunctionCall","src":"12565:13:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"12559:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12591:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12601:6:111","type":"","value":"0x0160"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"12595:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"12645:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12639:5:111"},"nodeType":"YulFunctionCall","src":"12639:9:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"12650:6:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"12620:18:111"},"nodeType":"YulFunctionCall","src":"12620:37:111"},"nodeType":"YulExpressionStatement","src":"12620:37:111"},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12681:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"12689:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12677:3:111"},"nodeType":"YulFunctionCall","src":"12677:15:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"12704:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"12708:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12700:3:111"},"nodeType":"YulFunctionCall","src":"12700:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12694:5:111"},"nodeType":"YulFunctionCall","src":"12694:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12670:6:111"},"nodeType":"YulFunctionCall","src":"12670:43:111"},"nodeType":"YulExpressionStatement","src":"12670:43:111"},{"nodeType":"YulVariableDeclaration","src":"12726:38:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"12756:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12760:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12752:3:111"},"nodeType":"YulFunctionCall","src":"12752:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12746:5:111"},"nodeType":"YulFunctionCall","src":"12746:18:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"12730:12:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12788:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"12796:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12784:3:111"},"nodeType":"YulFunctionCall","src":"12784:15:111"},{"name":"_5","nodeType":"YulIdentifier","src":"12801:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12777:6:111"},"nodeType":"YulFunctionCall","src":"12777:27:111"},"nodeType":"YulExpressionStatement","src":"12777:27:111"},{"nodeType":"YulVariableDeclaration","src":"12817:61:111","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"12848:12:111"},{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12866:6:111"},{"name":"_5","nodeType":"YulIdentifier","src":"12874:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12862:3:111"},"nodeType":"YulFunctionCall","src":"12862:15:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"12831:16:111"},"nodeType":"YulFunctionCall","src":"12831:47:111"},"variables":[{"name":"tail_3","nodeType":"YulTypedName","src":"12821:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12891:40:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"12923:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12927:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12919:3:111"},"nodeType":"YulFunctionCall","src":"12919:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12913:5:111"},"nodeType":"YulFunctionCall","src":"12913:18:111"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"12895:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"12955:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"12963:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12951:3:111"},"nodeType":"YulFunctionCall","src":"12951:15:111"},{"arguments":[{"name":"tail_3","nodeType":"YulIdentifier","src":"12972:6:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"12980:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12968:3:111"},"nodeType":"YulFunctionCall","src":"12968:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12944:6:111"},"nodeType":"YulFunctionCall","src":"12944:44:111"},"nodeType":"YulExpressionStatement","src":"12944:44:111"},{"nodeType":"YulVariableDeclaration","src":"13001:54:111","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"13032:14:111"},{"name":"tail_3","nodeType":"YulIdentifier","src":"13048:6:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"13015:16:111"},"nodeType":"YulFunctionCall","src":"13015:40:111"},"variables":[{"name":"tail_4","nodeType":"YulTypedName","src":"13005:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13068:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13078:4:111","type":"","value":"0x80"},"variables":[{"name":"_6","nodeType":"YulTypedName","src":"13072:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13106:6:111"},{"name":"_6","nodeType":"YulIdentifier","src":"13114:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13102:3:111"},"nodeType":"YulFunctionCall","src":"13102:15:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13129:2:111"},{"name":"_6","nodeType":"YulIdentifier","src":"13133:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13125:3:111"},"nodeType":"YulFunctionCall","src":"13125:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13119:5:111"},"nodeType":"YulFunctionCall","src":"13119:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13095:6:111"},"nodeType":"YulFunctionCall","src":"13095:43:111"},"nodeType":"YulExpressionStatement","src":"13095:43:111"},{"nodeType":"YulVariableDeclaration","src":"13151:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13161:4:111","type":"","value":"0xa0"},"variables":[{"name":"_7","nodeType":"YulTypedName","src":"13155:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13189:6:111"},{"name":"_7","nodeType":"YulIdentifier","src":"13197:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13185:3:111"},"nodeType":"YulFunctionCall","src":"13185:15:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13212:2:111"},{"name":"_7","nodeType":"YulIdentifier","src":"13216:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13208:3:111"},"nodeType":"YulFunctionCall","src":"13208:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13202:5:111"},"nodeType":"YulFunctionCall","src":"13202:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13178:6:111"},"nodeType":"YulFunctionCall","src":"13178:43:111"},"nodeType":"YulExpressionStatement","src":"13178:43:111"},{"nodeType":"YulVariableDeclaration","src":"13234:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13244:4:111","type":"","value":"0xc0"},"variables":[{"name":"_8","nodeType":"YulTypedName","src":"13238:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13272:6:111"},{"name":"_8","nodeType":"YulIdentifier","src":"13280:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13268:3:111"},"nodeType":"YulFunctionCall","src":"13268:15:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13295:2:111"},{"name":"_8","nodeType":"YulIdentifier","src":"13299:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13291:3:111"},"nodeType":"YulFunctionCall","src":"13291:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13285:5:111"},"nodeType":"YulFunctionCall","src":"13285:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13261:6:111"},"nodeType":"YulFunctionCall","src":"13261:43:111"},"nodeType":"YulExpressionStatement","src":"13261:43:111"},{"nodeType":"YulVariableDeclaration","src":"13317:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13327:4:111","type":"","value":"0xe0"},"variables":[{"name":"_9","nodeType":"YulTypedName","src":"13321:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13355:6:111"},{"name":"_9","nodeType":"YulIdentifier","src":"13363:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13351:3:111"},"nodeType":"YulFunctionCall","src":"13351:15:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13378:2:111"},{"name":"_9","nodeType":"YulIdentifier","src":"13382:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13374:3:111"},"nodeType":"YulFunctionCall","src":"13374:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13368:5:111"},"nodeType":"YulFunctionCall","src":"13368:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13344:6:111"},"nodeType":"YulFunctionCall","src":"13344:43:111"},"nodeType":"YulExpressionStatement","src":"13344:43:111"},{"nodeType":"YulVariableDeclaration","src":"13400:17:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13411:6:111","type":"","value":"0x0100"},"variables":[{"name":"_10","nodeType":"YulTypedName","src":"13404:3:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13441:6:111"},{"name":"_10","nodeType":"YulIdentifier","src":"13449:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13437:3:111"},"nodeType":"YulFunctionCall","src":"13437:16:111"},{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13465:2:111"},{"name":"_10","nodeType":"YulIdentifier","src":"13469:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13461:3:111"},"nodeType":"YulFunctionCall","src":"13461:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13455:5:111"},"nodeType":"YulFunctionCall","src":"13455:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13430:6:111"},"nodeType":"YulFunctionCall","src":"13430:45:111"},"nodeType":"YulExpressionStatement","src":"13430:45:111"},{"nodeType":"YulVariableDeclaration","src":"13488:17:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13499:6:111","type":"","value":"0x0120"},"variables":[{"name":"_11","nodeType":"YulTypedName","src":"13492:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13518:41:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13550:2:111"},{"name":"_11","nodeType":"YulIdentifier","src":"13554:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13546:3:111"},"nodeType":"YulFunctionCall","src":"13546:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13540:5:111"},"nodeType":"YulFunctionCall","src":"13540:19:111"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"13522:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13583:6:111"},{"name":"_11","nodeType":"YulIdentifier","src":"13591:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13579:3:111"},"nodeType":"YulFunctionCall","src":"13579:16:111"},{"arguments":[{"name":"tail_4","nodeType":"YulIdentifier","src":"13601:6:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"13609:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13597:3:111"},"nodeType":"YulFunctionCall","src":"13597:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13572:6:111"},"nodeType":"YulFunctionCall","src":"13572:45:111"},"nodeType":"YulExpressionStatement","src":"13572:45:111"},{"nodeType":"YulVariableDeclaration","src":"13630:54:111","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"13661:14:111"},{"name":"tail_4","nodeType":"YulIdentifier","src":"13677:6:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"13644:16:111"},"nodeType":"YulFunctionCall","src":"13644:40:111"},"variables":[{"name":"tail_5","nodeType":"YulTypedName","src":"13634:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13697:17:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13708:6:111","type":"","value":"0x0140"},"variables":[{"name":"_12","nodeType":"YulTypedName","src":"13701:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13727:41:111","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"13759:2:111"},{"name":"_12","nodeType":"YulIdentifier","src":"13763:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13755:3:111"},"nodeType":"YulFunctionCall","src":"13755:12:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13749:5:111"},"nodeType":"YulFunctionCall","src":"13749:19:111"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"13731:14:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13792:6:111"},{"name":"_12","nodeType":"YulIdentifier","src":"13800:3:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13788:3:111"},"nodeType":"YulFunctionCall","src":"13788:16:111"},{"arguments":[{"name":"tail_5","nodeType":"YulIdentifier","src":"13810:6:111"},{"name":"tail_2","nodeType":"YulIdentifier","src":"13818:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13806:3:111"},"nodeType":"YulFunctionCall","src":"13806:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13781:6:111"},"nodeType":"YulFunctionCall","src":"13781:45:111"},"nodeType":"YulExpressionStatement","src":"13781:45:111"},{"nodeType":"YulAssignment","src":"13839:50:111","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"13866:14:111"},{"name":"tail_5","nodeType":"YulIdentifier","src":"13882:6:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"13849:16:111"},"nodeType":"YulFunctionCall","src":"13849:40:111"},"variableNames":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13839:6:111"}]},{"nodeType":"YulAssignment","src":"13902:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"13916:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"13924:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13912:3:111"},"nodeType":"YulFunctionCall","src":"13912:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"13902:6:111"}]},{"nodeType":"YulAssignment","src":"13940:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"13951:3:111"},{"name":"_3","nodeType":"YulIdentifier","src":"13956:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13947:3:111"},"nodeType":"YulFunctionCall","src":"13947:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"13940:3:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"12382:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"12385:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"12379:2:111"},"nodeType":"YulFunctionCall","src":"12379:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"12393:18:111","statements":[{"nodeType":"YulAssignment","src":"12395:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"12404:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"12407:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12400:3:111"},"nodeType":"YulFunctionCall","src":"12400:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"12395:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"12375:3:111","statements":[]},"src":"12371:1598:111"},{"nodeType":"YulAssignment","src":"13978:14:111","value":{"name":"tail_2","nodeType":"YulIdentifier","src":"13986:6:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13978:4:111"}]},{"expression":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"14020:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14032:9:111"},{"name":"_3","nodeType":"YulIdentifier","src":"14043:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14028:3:111"},"nodeType":"YulFunctionCall","src":"14028:18:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"14001:18:111"},"nodeType":"YulFunctionCall","src":"14001:46:111"},"nodeType":"YulExpressionStatement","src":"14001:46:111"}]},"name":"abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11940:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11951:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11959:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11970:4:111","type":""}],"src":"11720:2333:111"},{"body":{"nodeType":"YulBlock","src":"14266:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14283:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14298:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14306:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14294:3:111"},"nodeType":"YulFunctionCall","src":"14294:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14276:6:111"},"nodeType":"YulFunctionCall","src":"14276:36:111"},"nodeType":"YulExpressionStatement","src":"14276:36:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14332:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14343:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14328:3:111"},"nodeType":"YulFunctionCall","src":"14328:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14348:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14321:6:111"},"nodeType":"YulFunctionCall","src":"14321:30:111"},"nodeType":"YulExpressionStatement","src":"14321:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14371:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14382:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14367:3:111"},"nodeType":"YulFunctionCall","src":"14367:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14387:2:111","type":"","value":"20"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14360:6:111"},"nodeType":"YulFunctionCall","src":"14360:30:111"},"nodeType":"YulExpressionStatement","src":"14360:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14410:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14421:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14406:3:111"},"nodeType":"YulFunctionCall","src":"14406:18:111"},{"hexValue":"41413234207369676e6174757265206572726f72","kind":"string","nodeType":"YulLiteral","src":"14426:22:111","type":"","value":"AA24 signature error"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14399:6:111"},"nodeType":"YulFunctionCall","src":"14399:50:111"},"nodeType":"YulExpressionStatement","src":"14399:50:111"},{"nodeType":"YulAssignment","src":"14458:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14481:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14466:3:111"},"nodeType":"YulFunctionCall","src":"14466:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14458:4:111"}]}]},"name":"abi_encode_tuple_t_rational_0_by_1_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint8_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14235:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14246:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14257:4:111","type":""}],"src":"14058:433:111"},{"body":{"nodeType":"YulBlock","src":"14617:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14634:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14645:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14627:6:111"},"nodeType":"YulFunctionCall","src":"14627:21:111"},"nodeType":"YulExpressionStatement","src":"14627:21:111"},{"nodeType":"YulAssignment","src":"14657:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14682:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14694:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14705:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14690:3:111"},"nodeType":"YulFunctionCall","src":"14690:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"14665:16:111"},"nodeType":"YulFunctionCall","src":"14665:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14657:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14586:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14597:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14608:4:111","type":""}],"src":"14496:219:111"},{"body":{"nodeType":"YulBlock","src":"14894:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14911:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14922:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14904:6:111"},"nodeType":"YulFunctionCall","src":"14904:21:111"},"nodeType":"YulExpressionStatement","src":"14904:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14945:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14956:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14941:3:111"},"nodeType":"YulFunctionCall","src":"14941:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14961:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14934:6:111"},"nodeType":"YulFunctionCall","src":"14934:30:111"},"nodeType":"YulExpressionStatement","src":"14934:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14984:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14995:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14980:3:111"},"nodeType":"YulFunctionCall","src":"14980:18:111"},{"hexValue":"76616c6964617465456970343333373a2068616e646c654f7073206d75737420","kind":"string","nodeType":"YulLiteral","src":"15000:34:111","type":"","value":"validateEip4337: handleOps must "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14973:6:111"},"nodeType":"YulFunctionCall","src":"14973:62:111"},"nodeType":"YulExpressionStatement","src":"14973:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15066:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15051:3:111"},"nodeType":"YulFunctionCall","src":"15051:18:111"},{"hexValue":"6661696c","kind":"string","nodeType":"YulLiteral","src":"15071:6:111","type":"","value":"fail"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15044:6:111"},"nodeType":"YulFunctionCall","src":"15044:34:111"},"nodeType":"YulExpressionStatement","src":"15044:34:111"},{"nodeType":"YulAssignment","src":"15087:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15099:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15110:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15095:3:111"},"nodeType":"YulFunctionCall","src":"15095:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15087:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9ce825e2c2b7409720f4b2301bf91998b153ff3e973776f09a0c87172eabe0bf__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14871:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14885:4:111","type":""}],"src":"14720:400:111"},{"body":{"nodeType":"YulBlock","src":"15299:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15327:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15309:6:111"},"nodeType":"YulFunctionCall","src":"15309:21:111"},"nodeType":"YulExpressionStatement","src":"15309:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15350:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15361:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15346:3:111"},"nodeType":"YulFunctionCall","src":"15346:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15366:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15339:6:111"},"nodeType":"YulFunctionCall","src":"15339:30:111"},"nodeType":"YulExpressionStatement","src":"15339:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15389:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15400:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15385:3:111"},"nodeType":"YulFunctionCall","src":"15385:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d204549503433333746616c6c626163","kind":"string","nodeType":"YulLiteral","src":"15405:34:111","type":"","value":"account: not from EIP4337Fallbac"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15378:6:111"},"nodeType":"YulFunctionCall","src":"15378:62:111"},"nodeType":"YulExpressionStatement","src":"15378:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15460:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15471:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15456:3:111"},"nodeType":"YulFunctionCall","src":"15456:18:111"},{"hexValue":"6b","kind":"string","nodeType":"YulLiteral","src":"15476:3:111","type":"","value":"k"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15449:6:111"},"nodeType":"YulFunctionCall","src":"15449:31:111"},"nodeType":"YulExpressionStatement","src":"15449:31:111"},{"nodeType":"YulAssignment","src":"15489:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15501:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15512:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15497:3:111"},"nodeType":"YulFunctionCall","src":"15497:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15489:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_91b96fb4968977caac8675b885caebd1ec06646e0677fdd46fda8bfdd5d1631b__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15276:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15290:4:111","type":""}],"src":"15125:397:111"},{"body":{"nodeType":"YulBlock","src":"15618:544:111","statements":[{"body":{"nodeType":"YulBlock","src":"15664:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15673:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15676:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15666:6:111"},"nodeType":"YulFunctionCall","src":"15666:12:111"},"nodeType":"YulExpressionStatement","src":"15666:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15639:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15648:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15635:3:111"},"nodeType":"YulFunctionCall","src":"15635:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15660:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15631:3:111"},"nodeType":"YulFunctionCall","src":"15631:32:111"},"nodeType":"YulIf","src":"15628:52:111"},{"nodeType":"YulVariableDeclaration","src":"15689:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15709:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15703:5:111"},"nodeType":"YulFunctionCall","src":"15703:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"15693:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15762:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15771:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15774:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15764:6:111"},"nodeType":"YulFunctionCall","src":"15764:12:111"},"nodeType":"YulExpressionStatement","src":"15764:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"15734:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15742:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"15731:2:111"},"nodeType":"YulFunctionCall","src":"15731:30:111"},"nodeType":"YulIf","src":"15728:50:111"},{"nodeType":"YulVariableDeclaration","src":"15787:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15801:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"15812:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15797:3:111"},"nodeType":"YulFunctionCall","src":"15797:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"15791:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15867:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15876:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15879:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15869:6:111"},"nodeType":"YulFunctionCall","src":"15869:12:111"},"nodeType":"YulExpressionStatement","src":"15869:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"15846:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"15850:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15842:3:111"},"nodeType":"YulFunctionCall","src":"15842:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"15857:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15838:3:111"},"nodeType":"YulFunctionCall","src":"15838:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15831:6:111"},"nodeType":"YulFunctionCall","src":"15831:35:111"},"nodeType":"YulIf","src":"15828:55:111"},{"nodeType":"YulVariableDeclaration","src":"15892:19:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"15908:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15902:5:111"},"nodeType":"YulFunctionCall","src":"15902:9:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"15896:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15920:61:111","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"15977:2:111"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"15949:27:111"},"nodeType":"YulFunctionCall","src":"15949:31:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"15933:15:111"},"nodeType":"YulFunctionCall","src":"15933:48:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"15924:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"15997:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16004:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15990:6:111"},"nodeType":"YulFunctionCall","src":"15990:17:111"},"nodeType":"YulExpressionStatement","src":"15990:17:111"},{"body":{"nodeType":"YulBlock","src":"16053:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16062:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16065:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16055:6:111"},"nodeType":"YulFunctionCall","src":"16055:12:111"},"nodeType":"YulExpressionStatement","src":"16055:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"16030:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16034:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16026:3:111"},"nodeType":"YulFunctionCall","src":"16026:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"16039:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16022:3:111"},"nodeType":"YulFunctionCall","src":"16022:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"16044:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16019:2:111"},"nodeType":"YulFunctionCall","src":"16019:33:111"},"nodeType":"YulIf","src":"16016:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"16104:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"16108:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16100:3:111"},"nodeType":"YulFunctionCall","src":"16100:11:111"},{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"16117:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"16124:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16113:3:111"},"nodeType":"YulFunctionCall","src":"16113:14:111"},{"name":"_2","nodeType":"YulIdentifier","src":"16129:2:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"16078:21:111"},"nodeType":"YulFunctionCall","src":"16078:54:111"},"nodeType":"YulExpressionStatement","src":"16078:54:111"},{"nodeType":"YulAssignment","src":"16141:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"16151:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"16141:6:111"}]}]},"name":"abi_decode_tuple_t_string_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15584:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15595:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15607:6:111","type":""}],"src":"15527:635:111"},{"body":{"nodeType":"YulBlock","src":"16341:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16358:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16369:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16351:6:111"},"nodeType":"YulFunctionCall","src":"16351:21:111"},"nodeType":"YulExpressionStatement","src":"16351:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16392:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16403:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16388:3:111"},"nodeType":"YulFunctionCall","src":"16388:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16408:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16381:6:111"},"nodeType":"YulFunctionCall","src":"16381:30:111"},"nodeType":"YulExpressionStatement","src":"16381:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16431:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16442:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16427:3:111"},"nodeType":"YulFunctionCall","src":"16427:18:111"},{"hexValue":"7365747570343333374d6f64756c65733a20656e747279706f696e7420616c72","kind":"string","nodeType":"YulLiteral","src":"16447:34:111","type":"","value":"setup4337Modules: entrypoint alr"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16420:6:111"},"nodeType":"YulFunctionCall","src":"16420:62:111"},"nodeType":"YulExpressionStatement","src":"16420:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16502:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16513:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16498:3:111"},"nodeType":"YulFunctionCall","src":"16498:18:111"},{"hexValue":"6561647920656e61626c6564","kind":"string","nodeType":"YulLiteral","src":"16518:14:111","type":"","value":"eady enabled"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16491:6:111"},"nodeType":"YulFunctionCall","src":"16491:42:111"},"nodeType":"YulExpressionStatement","src":"16491:42:111"},{"nodeType":"YulAssignment","src":"16542:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16554:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16565:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16550:3:111"},"nodeType":"YulFunctionCall","src":"16550:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16542:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9e918bedd8a27b0077880ecc360c6b22f80afc50dd4db23be600079310866e84__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16318:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16332:4:111","type":""}],"src":"16167:408:111"},{"body":{"nodeType":"YulBlock","src":"16754:239:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16771:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16782:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16764:6:111"},"nodeType":"YulFunctionCall","src":"16764:21:111"},"nodeType":"YulExpressionStatement","src":"16764:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16805:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16816:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16801:3:111"},"nodeType":"YulFunctionCall","src":"16801:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16821:2:111","type":"","value":"49"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16794:6:111"},"nodeType":"YulFunctionCall","src":"16794:30:111"},"nodeType":"YulExpressionStatement","src":"16794:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16844:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16855:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16840:3:111"},"nodeType":"YulFunctionCall","src":"16840:18:111"},{"hexValue":"7365747570343333374d6f64756c65733a206569703433333746616c6c626163","kind":"string","nodeType":"YulLiteral","src":"16860:34:111","type":"","value":"setup4337Modules: eip4337Fallbac"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16833:6:111"},"nodeType":"YulFunctionCall","src":"16833:62:111"},"nodeType":"YulExpressionStatement","src":"16833:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16915:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16926:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16911:3:111"},"nodeType":"YulFunctionCall","src":"16911:18:111"},{"hexValue":"6b20616c726561647920656e61626c6564","kind":"string","nodeType":"YulLiteral","src":"16931:19:111","type":"","value":"k already enabled"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16904:6:111"},"nodeType":"YulFunctionCall","src":"16904:47:111"},"nodeType":"YulExpressionStatement","src":"16904:47:111"},{"nodeType":"YulAssignment","src":"16960:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16972:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16983:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16968:3:111"},"nodeType":"YulFunctionCall","src":"16968:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16960:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_2fccd7f70c7ccdbee9c4b3940928cb4427d124e03dfa4ce849a9137fa8925758__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16731:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16745:4:111","type":""}],"src":"16580:413:111"},{"body":{"nodeType":"YulBlock","src":"17172:237:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17200:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17182:6:111"},"nodeType":"YulFunctionCall","src":"17182:21:111"},"nodeType":"YulExpressionStatement","src":"17182:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17234:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17219:3:111"},"nodeType":"YulFunctionCall","src":"17219:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17239:2:111","type":"","value":"47"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17212:6:111"},"nodeType":"YulFunctionCall","src":"17212:30:111"},"nodeType":"YulExpressionStatement","src":"17212:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17262:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17273:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17258:3:111"},"nodeType":"YulFunctionCall","src":"17258:18:111"},{"hexValue":"7265706c616365454950343333374d616e616765723a206f6c644d616e616765","kind":"string","nodeType":"YulLiteral","src":"17278:34:111","type":"","value":"replaceEIP4337Manager: oldManage"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17251:6:111"},"nodeType":"YulFunctionCall","src":"17251:62:111"},"nodeType":"YulExpressionStatement","src":"17251:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17333:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17344:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17329:3:111"},"nodeType":"YulFunctionCall","src":"17329:18:111"},{"hexValue":"72206973206e6f7420616374697665","kind":"string","nodeType":"YulLiteral","src":"17349:17:111","type":"","value":"r is not active"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17322:6:111"},"nodeType":"YulFunctionCall","src":"17322:45:111"},"nodeType":"YulExpressionStatement","src":"17322:45:111"},{"nodeType":"YulAssignment","src":"17376:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17388:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17399:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17384:3:111"},"nodeType":"YulFunctionCall","src":"17384:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17376:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9a48bcdd69650fd0c339a97722c7855940395dd3c8b95007c34b0b8a17d9f179__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17149:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17163:4:111","type":""}],"src":"16998:411:111"},{"body":{"nodeType":"YulBlock","src":"17634:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17651:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17656:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17644:6:111"},"nodeType":"YulFunctionCall","src":"17644:79:111"},"nodeType":"YulExpressionStatement","src":"17644:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17743:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17748:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17739:3:111"},"nodeType":"YulFunctionCall","src":"17739:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"17753:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17732:6:111"},"nodeType":"YulFunctionCall","src":"17732:28:111"},"nodeType":"YulExpressionStatement","src":"17732:28:111"},{"nodeType":"YulAssignment","src":"17769:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17780:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17785:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17776:3:111"},"nodeType":"YulFunctionCall","src":"17776:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17769:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17610:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"17615:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17626:3:111","type":""}],"src":"17414:380:111"},{"body":{"nodeType":"YulBlock","src":"17831:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17848:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17851:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17841:6:111"},"nodeType":"YulFunctionCall","src":"17841:88:111"},"nodeType":"YulExpressionStatement","src":"17841:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17945:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"17948:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17938:6:111"},"nodeType":"YulFunctionCall","src":"17938:15:111"},"nodeType":"YulExpressionStatement","src":"17938:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17969:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17972:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17962:6:111"},"nodeType":"YulFunctionCall","src":"17962:15:111"},"nodeType":"YulExpressionStatement","src":"17962:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"17799:184:111"},{"body":{"nodeType":"YulBlock","src":"18162:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18179:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18190:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18172:6:111"},"nodeType":"YulFunctionCall","src":"18172:21:111"},"nodeType":"YulExpressionStatement","src":"18172:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18213:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18224:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18209:3:111"},"nodeType":"YulFunctionCall","src":"18209:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18229:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18202:6:111"},"nodeType":"YulFunctionCall","src":"18202:30:111"},"nodeType":"YulExpressionStatement","src":"18202:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18252:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18263:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18248:3:111"},"nodeType":"YulFunctionCall","src":"18248:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"18268:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18241:6:111"},"nodeType":"YulFunctionCall","src":"18241:54:111"},"nodeType":"YulExpressionStatement","src":"18241:54:111"},{"nodeType":"YulAssignment","src":"18304:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18327:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18312:3:111"},"nodeType":"YulFunctionCall","src":"18312:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18304:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18139:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18153:4:111","type":""}],"src":"17988:348:111"},{"body":{"nodeType":"YulBlock","src":"18515:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18532:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18543:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18525:6:111"},"nodeType":"YulFunctionCall","src":"18525:21:111"},"nodeType":"YulExpressionStatement","src":"18525:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18577:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18562:3:111"},"nodeType":"YulFunctionCall","src":"18562:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18582:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18555:6:111"},"nodeType":"YulFunctionCall","src":"18555:30:111"},"nodeType":"YulExpressionStatement","src":"18555:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18605:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18616:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18601:3:111"},"nodeType":"YulFunctionCall","src":"18601:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"18621:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18594:6:111"},"nodeType":"YulFunctionCall","src":"18594:61:111"},"nodeType":"YulExpressionStatement","src":"18594:61:111"},{"nodeType":"YulAssignment","src":"18664:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18676:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18687:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18672:3:111"},"nodeType":"YulFunctionCall","src":"18672:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18664:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18492:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18506:4:111","type":""}],"src":"18341:355:111"},{"body":{"nodeType":"YulBlock","src":"18875:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18892:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18903:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18885:6:111"},"nodeType":"YulFunctionCall","src":"18885:21:111"},"nodeType":"YulExpressionStatement","src":"18885:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18926:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18937:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18922:3:111"},"nodeType":"YulFunctionCall","src":"18922:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18942:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18915:6:111"},"nodeType":"YulFunctionCall","src":"18915:30:111"},"nodeType":"YulExpressionStatement","src":"18915:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18976:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18961:3:111"},"nodeType":"YulFunctionCall","src":"18961:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"18981:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18954:6:111"},"nodeType":"YulFunctionCall","src":"18954:62:111"},"nodeType":"YulExpressionStatement","src":"18954:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19047:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19032:3:111"},"nodeType":"YulFunctionCall","src":"19032:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"19052:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19025:6:111"},"nodeType":"YulFunctionCall","src":"19025:32:111"},"nodeType":"YulExpressionStatement","src":"19025:32:111"},{"nodeType":"YulAssignment","src":"19066:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19078:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19089:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19074:3:111"},"nodeType":"YulFunctionCall","src":"19074:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19066:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18852:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18866:4:111","type":""}],"src":"18701:398:111"},{"body":{"nodeType":"YulBlock","src":"19285:217:111","statements":[{"nodeType":"YulAssignment","src":"19295:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19318:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19303:3:111"},"nodeType":"YulFunctionCall","src":"19303:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19295:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19338:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"19349:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19331:6:111"},"nodeType":"YulFunctionCall","src":"19331:25:111"},"nodeType":"YulExpressionStatement","src":"19331:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19376:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19387:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19372:3:111"},"nodeType":"YulFunctionCall","src":"19372:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"19396:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"19404:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19392:3:111"},"nodeType":"YulFunctionCall","src":"19392:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19365:6:111"},"nodeType":"YulFunctionCall","src":"19365:45:111"},"nodeType":"YulExpressionStatement","src":"19365:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19430:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19441:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19426:3:111"},"nodeType":"YulFunctionCall","src":"19426:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"19446:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19419:6:111"},"nodeType":"YulFunctionCall","src":"19419:34:111"},"nodeType":"YulExpressionStatement","src":"19419:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19473:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19484:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19469:3:111"},"nodeType":"YulFunctionCall","src":"19469:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"19489:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19462:6:111"},"nodeType":"YulFunctionCall","src":"19462:34:111"},"nodeType":"YulExpressionStatement","src":"19462:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19230:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"19241:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"19249:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"19257:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19265:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19276:4:111","type":""}],"src":"19104:398:111"}]},"contents":"{\n { }\n function validator_revert_contract_GnosisSafe(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_GnosisSafe_$952(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_contract$_GnosisSafe_$952t_contract$_EIP4337Manager_$18804(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_GnosisSafe(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_bytes(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x20)\n }\n function abi_decode_enum_Operation(offset) -> value\n {\n value := calldataload(offset)\n if iszero(lt(value, 2)) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_memory_ptrt_enum$_Operation_$1997(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n let _2 := calldataload(_1)\n let array := allocate_memory(array_allocation_size_bytes(_2))\n mstore(array, _2)\n if gt(add(add(_1, _2), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, 32), add(_1, 32), _2)\n mstore(add(add(array, _2), 32), 0)\n value2 := array\n value3 := abi_decode_enum_Operation(add(headStart, 96))\n }\n function abi_decode_tuple_t_contract$_EIP4337Manager_$18804(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n }\n function abi_decode_tuple_t_addresst_contract$_EIP4337Manager_$18804t_contract$_EIP4337Manager_$18804(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_GnosisSafe(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_contract_GnosisSafe(value_2)\n value2 := value_2\n }\n function abi_encode_tuple_t_address_t_rational_100_by_1__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_address_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_contract_GnosisSafe(value)\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptrt_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := mload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n let _4 := 0x20\n if gt(_3, _1) { panic_error_0x41() }\n let _5 := shl(5, _3)\n let dst := allocate_memory(add(_5, _4))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _4)\n let srcEnd := add(add(_2, _5), _4)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _4)\n for { } lt(src, srcEnd) { src := add(src, _4) }\n {\n let value := mload(src)\n validator_revert_contract_GnosisSafe(value)\n mstore(dst, value)\n dst := add(dst, _4)\n }\n value0 := dst_1\n value1 := abi_decode_address_fromMemory(add(headStart, _4))\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_GnosisSafe(value)\n value0 := value\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_0967c657eeb55a63bc027c600fb721284a0b66e7697eca498672aecde2f5ca54__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from entrypoint\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_b44df24be4dfac874ac766207425ed2b9dc7d961eda9cfb93c26bd63c0485c9c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 25)\n mstore(add(headStart, 64), \"account: only threshold 1\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_0e54a4de33edc81c6cfc176f50c1bc9c390da62f9cd1bb325696426e5a0ee8db__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: nonsequential nonce\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__to_t_array$_t_struct$_UserOperation_$10993_memory_ptr_$dyn_memory_ptr_t_address_payable__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 64\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n let _2 := 96\n pos := add(headStart, _2)\n let tail_2 := add(add(headStart, shl(5, length)), _2)\n let _3 := 0x20\n let srcPtr := add(value0, _3)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, add(sub(tail_2, headStart), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0))\n let _4 := mload(srcPtr)\n let _5 := 0x0160\n abi_encode_address(mload(_4), tail_2)\n mstore(add(tail_2, _3), mload(add(_4, _3)))\n let memberValue0 := mload(add(_4, _1))\n mstore(add(tail_2, _1), _5)\n let tail_3 := abi_encode_bytes(memberValue0, add(tail_2, _5))\n let memberValue0_1 := mload(add(_4, _2))\n mstore(add(tail_2, _2), sub(tail_3, tail_2))\n let tail_4 := abi_encode_bytes(memberValue0_1, tail_3)\n let _6 := 0x80\n mstore(add(tail_2, _6), mload(add(_4, _6)))\n let _7 := 0xa0\n mstore(add(tail_2, _7), mload(add(_4, _7)))\n let _8 := 0xc0\n mstore(add(tail_2, _8), mload(add(_4, _8)))\n let _9 := 0xe0\n mstore(add(tail_2, _9), mload(add(_4, _9)))\n let _10 := 0x0100\n mstore(add(tail_2, _10), mload(add(_4, _10)))\n let _11 := 0x0120\n let memberValue0_2 := mload(add(_4, _11))\n mstore(add(tail_2, _11), sub(tail_4, tail_2))\n let tail_5 := abi_encode_bytes(memberValue0_2, tail_4)\n let _12 := 0x0140\n let memberValue0_3 := mload(add(_4, _12))\n mstore(add(tail_2, _12), sub(tail_5, tail_2))\n tail_2 := abi_encode_bytes(memberValue0_3, tail_5)\n srcPtr := add(srcPtr, _3)\n pos := add(pos, _3)\n }\n tail := tail_2\n abi_encode_address(value1, add(headStart, _3))\n }\n function abi_encode_tuple_t_rational_0_by_1_t_stringliteral_230fad9992163f7c7bca82563472469d2ae8f1696105d00fd8b1abf9e366de4e__to_t_uint8_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, and(value0, 0xff))\n mstore(add(headStart, 32), 64)\n mstore(add(headStart, 64), 20)\n mstore(add(headStart, 96), \"AA24 signature error\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_encode_tuple_t_stringliteral_9ce825e2c2b7409720f4b2301bf91998b153ff3e973776f09a0c87172eabe0bf__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"validateEip4337: handleOps must \")\n mstore(add(headStart, 96), \"fail\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_91b96fb4968977caac8675b885caebd1ec06646e0677fdd46fda8bfdd5d1631b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"account: not from EIP4337Fallbac\")\n mstore(add(headStart, 96), \"k\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_string_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n let _2 := mload(_1)\n let array := allocate_memory(array_allocation_size_bytes(_2))\n mstore(array, _2)\n if gt(add(add(_1, _2), 32), dataEnd) { revert(0, 0) }\n copy_memory_to_memory(add(_1, 32), add(array, 32), _2)\n value0 := array\n }\n function abi_encode_tuple_t_stringliteral_9e918bedd8a27b0077880ecc360c6b22f80afc50dd4db23be600079310866e84__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"setup4337Modules: entrypoint alr\")\n mstore(add(headStart, 96), \"eady enabled\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_2fccd7f70c7ccdbee9c4b3940928cb4427d124e03dfa4ce849a9137fa8925758__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 49)\n mstore(add(headStart, 64), \"setup4337Modules: eip4337Fallbac\")\n mstore(add(headStart, 96), \"k already enabled\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9a48bcdd69650fd0c339a97722c7855940395dd3c8b95007c34b0b8a17d9f179__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 47)\n mstore(add(headStart, 64), \"replaceEIP4337Manager: oldManage\")\n mstore(add(headStart, 96), \"r is not active\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"18150":[{"length":32,"start":296},{"length":32,"start":3287}],"18152":[{"length":32,"start":391},{"length":32,"start":894},{"length":32,"start":3153},{"length":32,"start":4984}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100a35760003560e01c8063940d3c6011610076578063d041593b1161005b578063d041593b146101a9578063d087d288146101bc578063efae6e06146101c457600080fd5b8063940d3c601461016f578063b0d691fe1461018257600080fd5b8063039b1728146100a85780633a871cdd146100ed57806345b1e0ca1461010e57806370b8a01d14610123575b600080fd5b6100bb6100b6366004611cd2565b6101d7565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152015b60405180910390f35b6101006100fb366004611cf6565b61033e565b6040519081526020016100e4565b61012161011c366004611d4a565b61065a565b005b61014a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e4565b61012161017d366004611e1f565b610c12565b61014a7f000000000000000000000000000000000000000000000000000000000000000081565b6101216101b7366004611cd2565b610e0f565b610100611340565b6101216101d2366004611ecc565b6113fd565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600482018190526064602483015290600090819073ffffffffffffffffffffffffffffffffffffffff85169063cc2f845290604401600060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102799190810190611f22565b50905060005b815181101561033157600082828151811061029c5761029c611fe6565b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff16632bcadc246040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561030d575060408051601f3d908101601f1916820190925261030a91810190612015565b60015b1561031d57949694955050505050565b93508061032981612061565b91505061027f565b5060009485945092505050565b600080803661034e601482612099565b6103599282906120b0565b610362916120da565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681146103f15760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b30600061044b866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061049d6104606101408a018a612122565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505061199b9050565b90506004546001146104f15760405162461bcd60e51b815260206004820152601960248201527f6163636f756e743a206f6e6c79207468726573686f6c6420310000000000000060448201526064016103e8565b6040517f2f54bf6e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152841690632f54bf6e90602401602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190612187565b61058a57600194505b67ffffffffffffffff6020890135106105e55760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f6e73657175656e7469616c206e6f6e63650000000060448201526064016103e8565b851561064f5760008473ffffffffffffffffffffffffffffffffffffffff168760405160006040518083038185875af1925050503d8060008114610645576040519150601f19603f3d011682016040523d82523d6000602084013e61064a565b606091505b505050505b505050509392505050565b60408051604180825260808201909252600091602082018180368337019050509050601b60f81b8160408151811061069457610694611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600160f81b816002815181106106db576106db611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600160f81b8160238151811061072257610722611fe6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060008273ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190612015565b6040517f35567e1a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526000602483015291909116906335567e1a90604401602060405180830381865afa158015610837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085b91906121a9565b604080516101608101825273ffffffffffffffffffffffffffffffffffffffff8716815260208082018490528251808201845260008082528385019190915283518083018552818152606084015260808301819052620f424060a084015260c0830181905260e08301819052610100830181905283518083018552818152610120840152610140830187905283516001808252818601909552949550919391929082015b610972604051806101600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b8152602001906001900390816108ff579050509050818160008151811061099b5761099b611fe6565b602002602001018190525060008573ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a179190612015565b6040517f1fad948c00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff821690631fad948c90610a6e908590339060040161221e565b600060405180830381600087803b158015610a8857600080fd5b505af1925050508015610a99575060015b610b9c573d808015610ac7576040519150601f19603f3d011682016040523d82523d6000602084013e610acc565b606091505b5060408051600060248201526044810191909152601460648201527f41413234207369676e6174757265206572726f72000000000000000000000000608482015260a40160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f220266b600000000000000000000000000000000000000000000000000000000178152915190912082519183019190912014610b96578060405162461bcd60e51b81526004016103e89190612380565b50610c09565b60405162461bcd60e51b8152602060048201526024808201527f76616c6964617465456970343333373a2068616e646c654f7073206d7573742060448201527f6661696c0000000000000000000000000000000000000000000000000000000060648201526084016103e8565b50505050505050565b60008036610c21601482612099565b610c2c9282906120b0565b610c35916120da565b60601c905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114610cbf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064016103e8565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d6a5760405162461bcd60e51b815260206004820152602160248201527f6163636f756e743a206e6f742066726f6d204549503433333746616c6c62616360448201527f6b0000000000000000000000000000000000000000000000000000000000000060648201526084016103e8565b6000610d99868686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6119bf565b90506000610dc67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a06565b905081610c0957604481511015610ddc57600080fd5b60048101905080806020019051810190610df69190612393565b60405162461bcd60e51b81526004016103e89190612380565b60003090508073ffffffffffffffffffffffffffffffffffffffff16632d9ad53d8373ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c9190612187565b15610f9f5760405162461bcd60e51b815260206004820152602c60248201527f7365747570343333374d6f64756c65733a20656e747279706f696e7420616c7260448201527f6561647920656e61626c6564000000000000000000000000000000000000000060648201526084016103e8565b8073ffffffffffffffffffffffffffffffffffffffff16632d9ad53d8373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b79190612187565b1561112a5760405162461bcd60e51b815260206004820152603160248201527f7365747570343333374d6f64756c65733a206569703433333746616c6c62616360448201527f6b20616c726561647920656e61626c656400000000000000000000000000000060648201526084016103e8565b8073ffffffffffffffffffffffffffffffffffffffff1663610b59258373ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663610b59258373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561132457600080fd5b505af1158015611338573d6000803e3d6000fd5b505050505050565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906335567e1a90604401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906121a9565b905090565b600030905060008373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114739190612015565b6040517f2d9ad53d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925090831690632d9ad53d90602401602060405180830381865afa1580156114e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115079190612187565b6115795760405162461bcd60e51b815260206004820152602f60248201527f7265706c616365454950343333374d616e616765723a206f6c644d616e61676560448201527f72206973206e6f7420616374697665000000000000000000000000000000000060648201526084016103e8565b8173ffffffffffffffffffffffffffffffffffffffff1663e009cfde828673ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116059190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b50506040517fe009cfde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015284811660248301528516925063e009cfde9150604401600060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b5050505060008373ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117849190612015565b90508273ffffffffffffffffffffffffffffffffffffffff1663610b59258573ffffffffffffffffffffffffffffffffffffffff1663b0d691fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190612015565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b15801561187757600080fd5b505af115801561188b573d6000803e3d6000fd5b50506040517f610b592500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528616925063610b59259150602401600060405180830381600087803b1580156118f857600080fd5b505af115801561190c573d6000803e3d6000fd5b50506040517ff08a032300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528616925063f08a03239150602401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b50505050611338838561065a565b60008060006119aa8585611a32565b915091506119b781611a77565b509392505050565b600060018360018111156119d5576119d5612401565b036119ed576000808551602087018986f490506119fd565b600080855160208701888a87f190505b95945050505050565b60603d82811115611a145750815b604051602082018101604052818152816000602083013e9392505050565b6000808251604103611a685760208301516040840151606085015160001a611a5c87828585611bdf565b94509450505050611a70565b506000905060025b9250929050565b6000816004811115611a8b57611a8b612401565b03611a935750565b6001816004811115611aa757611aa7612401565b03611af45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103e8565b6002816004811115611b0857611b08612401565b03611b555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016103e8565b6003816004811115611b6957611b69612401565b03611bdc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016103e8565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611ca7565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c6a573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611ca057600060019250925050611ca7565b9150600090505b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611bdc57600080fd5b600060208284031215611ce457600080fd5b8135611cef81611cb0565b9392505050565b600080600060608486031215611d0b57600080fd5b833567ffffffffffffffff811115611d2257600080fd5b84016101608187031215611d3557600080fd5b95602085013595506040909401359392505050565b60008060408385031215611d5d57600080fd5b8235611d6881611cb0565b91506020830135611d7881611cb0565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ddb57611ddb611d83565b604052919050565b600067ffffffffffffffff821115611dfd57611dfd611d83565b50601f01601f191660200190565b803560028110611e1a57600080fd5b919050565b60008060008060808587031215611e3557600080fd5b8435611e4081611cb0565b935060208501359250604085013567ffffffffffffffff811115611e6357600080fd5b8501601f81018713611e7457600080fd5b8035611e87611e8282611de3565b611db2565b818152886020838501011115611e9c57600080fd5b81602084016020830137600060208383010152809450505050611ec160608601611e0b565b905092959194509250565b600080600060608486031215611ee157600080fd5b8335611eec81611cb0565b92506020840135611efc81611cb0565b91506040840135611f0c81611cb0565b809150509250925092565b8051611e1a81611cb0565b60008060408385031215611f3557600080fd5b825167ffffffffffffffff80821115611f4d57600080fd5b818501915085601f830112611f6157600080fd5b8151602082821115611f7557611f75611d83565b8160051b9250611f86818401611db2565b8281529284018101928181019089851115611fa057600080fd5b948201945b84861015611fca5785519350611fba84611cb0565b8382529482019490820190611fa5565b9650611fd99050878201611f17565b9450505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561202757600080fd5b8151611cef81611cb0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361209257612092612032565b5060010190565b6000828210156120ab576120ab612032565b500390565b600080858511156120c057600080fd5b838611156120cd57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561211a5780818660140360031b1b83161692505b505092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261215757600080fd5b83018035915067ffffffffffffffff82111561217257600080fd5b602001915036819003821315611a7057600080fd5b60006020828403121561219957600080fd5b81518015158114611cef57600080fd5b6000602082840312156121bb57600080fd5b5051919050565b60005b838110156121dd5781810151838201526020016121c5565b838111156121ec576000848401525b50505050565b6000815180845261220a8160208601602086016121c2565b601f01601f19169290920160200192915050565b60006040808301818452808651808352606092508286019150828160051b8701016020808a0160005b8481101561234d578984037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00186528151805173ffffffffffffffffffffffffffffffffffffffff168552610160848201518587015289820151818b8801526122b2828801826121f2565b915050888201518682038a8801526122ca82826121f2565b6080848101519089015260a0808501519089015260c0808501519089015260e08085015190890152610100808501519089015261012080850151898303828b0152919350915061231a83826121f2565b92505050610140808301519250868203818801525061233981836121f2565b978501979550505090820190600101612247565b50508196506123738189018a73ffffffffffffffffffffffffffffffffffffffff169052565b5050505050509392505050565b602081526000611cef60208301846121f2565b6000602082840312156123a557600080fd5b815167ffffffffffffffff8111156123bc57600080fd5b8201601f810184136123cd57600080fd5b80516123db611e8282611de3565b8181528560208385010111156123f057600080fd5b6119fd8260208301602086016121c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ed41c9f6d995f123c6c7c1774ab3c5f2fcdbe1fab4922d653566ecf6c53fa79164736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x940D3C60 GT PUSH2 0x76 JUMPI DUP1 PUSH4 0xD041593B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD041593B EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0xEFAE6E06 EQ PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x940D3C60 EQ PUSH2 0x16F JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x39B1728 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0xED JUMPI DUP1 PUSH4 0x45B1E0CA EQ PUSH2 0x10E JUMPI DUP1 PUSH4 0x70B8A01D EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CD2 JUMP JUMPDEST PUSH2 0x1D7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x1CF6 JUMP JUMPDEST PUSH2 0x33E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE4 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4A JUMP JUMPDEST PUSH2 0x65A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x14A PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE4 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x17D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E1F JUMP JUMPDEST PUSH2 0xC12 JUMP JUMPDEST PUSH2 0x14A PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x1B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CD2 JUMP JUMPDEST PUSH2 0xE0F JUMP JUMPDEST PUSH2 0x100 PUSH2 0x1340 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x1D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1ECC JUMP JUMPDEST PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xCC2F845200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x64 PUSH1 0x24 DUP4 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xCC2F8452 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x251 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x279 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1F22 JUMP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x331 JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x29C JUMPI PUSH2 0x29C PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2BCADC24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x30D JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x30A SWAP2 DUP2 ADD SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x1 JUMPDEST ISZERO PUSH2 0x31D JUMPI SWAP5 SWAP7 SWAP5 SWAP6 POP POP POP POP POP JUMP JUMPDEST SWAP4 POP DUP1 PUSH2 0x329 DUP2 PUSH2 0x2061 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x27F JUMP JUMPDEST POP PUSH1 0x0 SWAP5 DUP6 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 CALLDATASIZE PUSH2 0x34E PUSH1 0x14 DUP3 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x359 SWAP3 DUP3 SWAP1 PUSH2 0x20B0 JUMP JUMPDEST PUSH2 0x362 SWAP2 PUSH2 0x20DA JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0x3F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20656E747279706F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST ADDRESS PUSH1 0x0 PUSH2 0x44B DUP7 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x49D PUSH2 0x460 PUSH2 0x140 DUP11 ADD DUP11 PUSH2 0x2122 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP7 SWAP4 SWAP3 POP POP PUSH2 0x199B SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x4 SLOAD PUSH1 0x1 EQ PUSH2 0x4F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206F6E6C79207468726573686F6C64203100000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2F54BF6E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP5 AND SWAP1 PUSH4 0x2F54BF6E SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x55D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x581 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST PUSH2 0x58A JUMPI PUSH1 0x1 SWAP5 POP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x20 DUP10 ADD CALLDATALOAD LT PUSH2 0x5E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F6E73657175656E7469616C206E6F6E636500000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP6 ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x645 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x64A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x41 DUP1 DUP3 MSTORE PUSH1 0x80 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x1B PUSH1 0xF8 SHL DUP2 PUSH1 0x40 DUP2 MLOAD DUP2 LT PUSH2 0x694 JUMPI PUSH2 0x694 PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 PUSH1 0xF8 SHL DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x6DB JUMPI PUSH2 0x6DB PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 PUSH1 0xF8 SHL DUP2 PUSH1 0x23 DUP2 MLOAD DUP2 LT PUSH2 0x722 JUMPI PUSH2 0x722 PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x79E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x7C2 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x837 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x85B SWAP2 SWAP1 PUSH2 0x21A9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x160 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE DUP4 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP4 ADD DUP6 MSTORE DUP2 DUP2 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD DUP2 SWAP1 MSTORE PUSH3 0xF4240 PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0xE0 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP4 ADD DUP6 MSTORE DUP2 DUP2 MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP4 ADD DUP8 SWAP1 MSTORE DUP4 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP5 SWAP6 POP SWAP2 SWAP4 SWAP2 SWAP3 SWAP1 DUP3 ADD JUMPDEST PUSH2 0x972 PUSH1 0x40 MLOAD DUP1 PUSH2 0x160 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x8FF JUMPI SWAP1 POP POP SWAP1 POP DUP2 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x99B JUMPI PUSH2 0x99B PUSH2 0x1FE6 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9F3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA17 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1FAD948C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x1FAD948C SWAP1 PUSH2 0xA6E SWAP1 DUP6 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x221E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xA99 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xB9C JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xAC7 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xACC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x14 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x41413234207369676E6174757265206572726F72000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x220266B600000000000000000000000000000000000000000000000000000000 OR DUP2 MSTORE SWAP2 MLOAD SWAP1 SWAP2 KECCAK256 DUP3 MLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ PUSH2 0xB96 JUMPI DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST POP PUSH2 0xC09 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x76616C6964617465456970343333373A2068616E646C654F7073206D75737420 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6661696C00000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATASIZE PUSH2 0xC21 PUSH1 0x14 DUP3 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0xC2C SWAP3 DUP3 SWAP1 PUSH2 0x20B0 JUMP JUMPDEST PUSH2 0xC35 SWAP2 PUSH2 0x20DA JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 EQ PUSH2 0xCBF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20656E747279706F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xD6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D204549503433333746616C6C626163 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD99 DUP7 DUP7 DUP7 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x19BF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xDC6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1A06 JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0xC09 JUMPI PUSH1 0x44 DUP2 MLOAD LT ISZERO PUSH2 0xDDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP2 ADD SWAP1 POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xDF6 SWAP2 SWAP1 PUSH2 0x2393 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8 SWAP2 SWAP1 PUSH2 0x2380 JUMP JUMPDEST PUSH1 0x0 ADDRESS SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2D9AD53D DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE7B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE9F SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF08 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xF2C SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST ISZERO PUSH2 0xF9F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7365747570343333374D6F64756C65733A20656E747279706F696E7420616C72 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561647920656E61626C65640000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2D9AD53D DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1006 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x102A SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1093 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x10B7 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST ISZERO PUSH2 0x112A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x31 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7365747570343333374D6F64756C65733A206569703433333746616C6C626163 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B20616C726561647920656E61626C6564000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1191 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11B5 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x121B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x122F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x129A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12BE SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1338 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13F8 SWAP2 SWAP1 PUSH2 0x21A9 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 ADDRESS SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x144F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1473 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2D9AD53D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 SWAP3 POP SWAP1 DUP4 AND SWAP1 PUSH4 0x2D9AD53D SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14E3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1507 SWAP2 SWAP1 PUSH2 0x2187 JUMP JUMPDEST PUSH2 0x1579 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7265706C616365454950343333374D616E616765723A206F6C644D616E616765 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x72206973206E6F74206163746976650000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE009CFDE DUP3 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1605 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP6 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1686 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xE009CFDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE DUP6 AND SWAP3 POP PUSH4 0xE009CFDE SWAP2 POP PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x170F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1760 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1784 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST SWAP1 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x610B5925 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB0D691FE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1811 SWAP2 SWAP1 PUSH2 0x2015 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0xE0 DUP5 SWAP1 SHL AND DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1877 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x188B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0x610B592500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 AND SWAP3 POP PUSH4 0x610B5925 SWAP2 POP PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x190C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xF08A032300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 AND SWAP3 POP PUSH4 0xF08A0323 SWAP2 POP PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1979 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x198D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1338 DUP4 DUP6 PUSH2 0x65A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x19AA DUP6 DUP6 PUSH2 0x1A32 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x19B7 DUP2 PUSH2 0x1A77 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x19D5 JUMPI PUSH2 0x19D5 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x19ED JUMPI PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP10 DUP7 DELEGATECALL SWAP1 POP PUSH2 0x19FD JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 MLOAD PUSH1 0x20 DUP8 ADD DUP9 DUP11 DUP8 CALL SWAP1 POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE DUP3 DUP2 GT ISZERO PUSH2 0x1A14 JUMPI POP DUP2 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP3 ADD DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP2 PUSH1 0x0 PUSH1 0x20 DUP4 ADD RETURNDATACOPY SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x1A68 JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x1A5C DUP8 DUP3 DUP6 DUP6 PUSH2 0x1BDF JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x1A70 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1A8B JUMPI PUSH2 0x1A8B PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1A93 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1AA7 JUMPI PUSH2 0x1AA7 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1AF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1B08 JUMPI PUSH2 0x1B08 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1B55 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1B69 JUMPI PUSH2 0x1B69 PUSH2 0x2401 JUMP JUMPDEST SUB PUSH2 0x1BDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3E8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1C16 JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x1CA7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C6A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1CA0 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x1CA7 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1CEF DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1D68 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1D78 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1DDB JUMPI PUSH2 0x1DDB PUSH2 0x1D83 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1DFD JUMPI PUSH2 0x1DFD PUSH2 0x1D83 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x2 DUP2 LT PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1E35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1E40 DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 ADD PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x1E74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1E87 PUSH2 0x1E82 DUP3 PUSH2 0x1DE3 JUMP JUMPDEST PUSH2 0x1DB2 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP9 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x1E9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP4 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP PUSH2 0x1EC1 PUSH1 0x60 DUP7 ADD PUSH2 0x1E0B JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1EE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1EEC DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1EFC DUP2 PUSH2 0x1CB0 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x1F0C DUP2 PUSH2 0x1CB0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x1E1A DUP2 PUSH2 0x1CB0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP3 DUP3 GT ISZERO PUSH2 0x1F75 JUMPI PUSH2 0x1F75 PUSH2 0x1D83 JUMP JUMPDEST DUP2 PUSH1 0x5 SHL SWAP3 POP PUSH2 0x1F86 DUP2 DUP5 ADD PUSH2 0x1DB2 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 DUP5 ADD DUP2 ADD SWAP3 DUP2 DUP2 ADD SWAP1 DUP10 DUP6 GT ISZERO PUSH2 0x1FA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x1FCA JUMPI DUP6 MLOAD SWAP4 POP PUSH2 0x1FBA DUP5 PUSH2 0x1CB0 JUMP JUMPDEST DUP4 DUP3 MSTORE SWAP5 DUP3 ADD SWAP5 SWAP1 DUP3 ADD SWAP1 PUSH2 0x1FA5 JUMP JUMPDEST SWAP7 POP PUSH2 0x1FD9 SWAP1 POP DUP8 DUP3 ADD PUSH2 0x1F17 JUMP JUMPDEST SWAP5 POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2027 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1CEF DUP2 PUSH2 0x1CB0 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2092 JUMPI PUSH2 0x2092 PUSH2 0x2032 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x20AB JUMPI PUSH2 0x20AB PUSH2 0x2032 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x20C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x20CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x211A JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1A70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2199 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1CEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x21BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x21DD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x21C5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x21EC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x220A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x21C2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP7 MLOAD DUP1 DUP4 MSTORE PUSH1 0x60 SWAP3 POP DUP3 DUP7 ADD SWAP2 POP DUP3 DUP2 PUSH1 0x5 SHL DUP8 ADD ADD PUSH1 0x20 DUP1 DUP11 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x234D JUMPI DUP10 DUP5 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 ADD DUP7 MSTORE DUP2 MLOAD DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 MSTORE PUSH2 0x160 DUP5 DUP3 ADD MLOAD DUP6 DUP8 ADD MSTORE DUP10 DUP3 ADD MLOAD DUP2 DUP12 DUP9 ADD MSTORE PUSH2 0x22B2 DUP3 DUP9 ADD DUP3 PUSH2 0x21F2 JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 ADD MLOAD DUP7 DUP3 SUB DUP11 DUP9 ADD MSTORE PUSH2 0x22CA DUP3 DUP3 PUSH2 0x21F2 JUMP JUMPDEST PUSH1 0x80 DUP5 DUP2 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xC0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0xE0 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH2 0x120 DUP1 DUP6 ADD MLOAD DUP10 DUP4 SUB DUP3 DUP12 ADD MSTORE SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x231A DUP4 DUP3 PUSH2 0x21F2 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD SWAP3 POP DUP7 DUP3 SUB DUP2 DUP9 ADD MSTORE POP PUSH2 0x2339 DUP2 DUP4 PUSH2 0x21F2 JUMP JUMPDEST SWAP8 DUP6 ADD SWAP8 SWAP6 POP POP POP SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2247 JUMP JUMPDEST POP POP DUP2 SWAP7 POP PUSH2 0x2373 DUP2 DUP10 ADD DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1CEF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x21F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x23BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0x1F DUP2 ADD DUP5 SGT PUSH2 0x23CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x23DB PUSH2 0x1E82 DUP3 PUSH2 0x1DE3 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP6 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x23F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19FD DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x21C2 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED COINBASE 0xC9 0xF6 0xD9 SWAP6 CALL 0x23 0xC6 0xC7 0xC1 PUSH24 0x4AB3C5F2FCDBE1FAB4922D653566ECF6C53FA79164736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"910:7634:88:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7913:629;;;;;;:::i;:::-;;:::i;:::-;;;;783:42:111;852:15;;;834:34;;904:15;;;;899:2;884:18;;877:43;746:18;7913:629:88;;;;;;;;1601:1145;;;;;;:::i;:::-;;:::i;:::-;;;1612:25:111;;;1600:2;1585:18;1601:1145:88;1466:177:111;6569:1107:88;;;;;;:::i;:::-;;:::i;:::-;;982:40;;;;;;;;2283:42:111;2271:55;;;2253:74;;2241:2;2226:18;982:40:88;2107:226:111;3134:1038:88;;;;;;:::i;:::-;;:::i;1028:35::-;;;;;4707:505;;;;;;:::i;:::-;;:::i;4242:124::-;;;:::i;5608:727::-;;;;;;:::i;:::-;;:::i;7913:629::-;8098:47;;;;;1303:3;8098:47;;;5348:74:111;;;8141:3:88;5438:18:111;;;5431:34;1303:3:88;7985:12;;;;8098:24;;;;;;5321:18:111;;8098:47:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8098:47:88;;;;;;;;;;;;:::i;:::-;8068:77;;;8160:6;8155:340;8176:7;:14;8172:1;:18;8155:340;;;8211:14;8228:7;8236:1;8228:10;;;;;;;;:::i;:::-;;;;;;;8211:27;;8272:6;8256:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8256:40:88;;;;;;;;-1:-1:-1;;8256:40:88;;;;;;;;;;;;:::i;:::-;;;8252:206;;;8350:4;;8356:8;;-1:-1:-1;;;;;7913:629:88:o;8252:206::-;8478:6;-1:-1:-1;8192:3:88;;;;:::i;:::-;;;;8155:340;;;-1:-1:-1;8520:1:88;;;;-1:-1:-1;7913:629:88;-1:-1:-1;;;7913:629:88:o;1601:1145::-;1736:22;;;1806:8;1815:20;1833:2;1806:8;1815:20;:::i;:::-;1806:32;;;;;:::i;:::-;1798:41;;;:::i;:::-;1790:50;;;-1:-1:-1;1858:23:88;1871:10;1858:23;;;1850:64;;;;-1:-1:-1;;;1850:64:88;;8637:2:111;1850:64:88;;;8619:21:111;8676:2;8656:18;;;8649:30;8715;8695:18;;;8688:58;8763:18;;1850:64:88;;;;;;;;;1971:4;1925:16;2003:35;:10;7455:58:47;;17656:66:111;7455:58:47;;;17644:79:111;17739:12;;;17732:28;;;7325:7:47;;17776:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;2003:35:88;1988:50;-1:-1:-1;2048:17:88;2068:30;2081:16;;;;:6;:16;:::i;:::-;2068:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2068:4:88;;:30;-1:-1:-1;;2068:12:88;:30;-1:-1:-1;2068:30:88:i;:::-;2048:50;;2116:9;;2129:1;2116:14;2108:52;;;;-1:-1:-1;;;2108:52:88;;9579:2:111;2108:52:88;;;9561:21:111;9618:2;9598:18;;;9591:30;9657:27;9637:18;;;9630:55;9702:18;;2108:52:88;9377:349:111;2108:52:88;2175:24;;;;;:13;2271:55:111;;;2175:24:88;;;2253:74:111;2175:13:88;;;;;2226:18:111;;2175:24:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2170:94;;1242:1;2215:38;;2170:94;2367:16;2352:12;;;;:31;2344:72;;;;-1:-1:-1;;;2344:72:88;;10215:2:111;2344:72:88;;;10197:21:111;10254:2;10234:18;;;10227:30;10293;10273:18;;;10266:58;10341:18;;2344:72:88;10013:352:111;2344:72:88;2431:23;;2427:313;;2557:12;2582:9;2574:23;;2606:19;2574:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;2427:313:88;1760:986;;;;1601:1145;;;;;:::o;6569:1107::-;6811:13;;;6821:2;6811:13;;;;;;;;;6792:16;;6811:13;;;;;;;;;;-1:-1:-1;6811:13:88;6792:32;;6857:2;6844:17;;6834:3;6838:2;6834:7;;;;;;;;:::i;:::-;;;;:27;;;;;;;;;;;6893:1;6880:16;;6871:3;6875:1;6871:6;;;;;;;;:::i;:::-;;;;:25;;;;;;;;;;;6929:1;6916:16;;6906:3;6910:2;6906:7;;;;;;;;:::i;:::-;;;;:26;;;;;;;;;;;6942:13;6978:7;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6966:60;;;;;:42;10780:55:111;;;6966:60:88;;;10762:74:111;7024:1:88;10852:18:111;;;10845:91;6966:42:88;;;;;;;10735:18:111;;6966:60:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7067:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7067:73:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7114:7;7067:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7183:22;;7203:1;7183:22;;;;;;;;;7067:73;;-1:-1:-1;7067:73:88;;-1:-1:-1;;7203:1:88;7183:22;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7183:22:88;;;;;;;;;;;;;;;;7150:55;;7228:6;7215:7;7223:1;7215:10;;;;;;;;:::i;:::-;;;;;;:19;;;;7244:23;7290:7;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7326:51;;;;;7244:68;;-1:-1:-1;7326:21:88;;;;;;:51;;7348:7;;7365:10;;7326:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7322:348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7525:78:88;;;7577:1;7525:78;;;14276:36:111;14328:18;;;14321:30;;;;14387:2;14367:18;;;14360:30;14426:22;14406:18;;;14399:50;14466:19;;7525:78:88;;;-1:-1:-1;;7525:78:88;;;;;;;;;;;;;;;;;;;;;7515:89;;;;;7495:16;;;;;;;;;:109;7491:169;;7638:5;7624:21;;-1:-1:-1;;;7624:21:88;;;;;;;;:::i;7491:169::-;7450:220;7322:348;;;7392:46;;-1:-1:-1;;;7392:46:88;;14922:2:111;7392:46:88;;;14904:21:111;14961:2;14941:18;;;14934:30;15000:34;14980:18;;;14973:62;15071:6;15051:18;;;15044:34;15095:19;;7392:46:88;14720:400:111;7322:348:88;6642:1034;;;;;6569:1107;;:::o;3134:1038::-;3289:17;;3325:8;3334:20;3352:2;3325:8;3334:20;:::i;:::-;3325:32;;;;;:::i;:::-;3317:41;;;:::i;:::-;3309:50;;;-1:-1:-1;3377:23:88;3390:10;3377:23;;;3369:64;;;;-1:-1:-1;;;3369:64:88;;8637:2:111;3369:64:88;;;8619:21:111;8676:2;8656:18;;;8649:30;8715;8695:18;;;8688:58;8763:18;;3369:64:88;8435:352:111;3369:64:88;3451:10;:29;3465:15;3451:29;;3443:75;;;;-1:-1:-1;;;3443:75:88;;15327:2:111;3443:75:88;;;15309:21:111;15366:2;15346:18;;;15339:30;15405:34;15385:18;;;15378:62;15476:3;15456:18;;;15449:31;15497:19;;3443:75:88;15125:397:111;3443:75:88;3529:12;3544:124;3565:2;3581:5;3600:4;3618:9;3641:17;3544:7;:124::i;:::-;3529:139;;3679:23;3705:37;3724:17;3705:18;:37::i;:::-;3679:63;;3953:7;3948:218;;4000:2;3980:10;:17;:22;3976:36;;;4004:8;;;3976:36;4083:4;4071:10;4067:21;4053:35;;4133:10;4122:32;;;;;;;;;;;;:::i;:::-;4115:40;;-1:-1:-1;;;4115:40:88;;;;;;;;:::i;4707:505::-;4820:15;4865:4;4820:52;;4891:4;:20;;;4912:7;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4891:42;;;;;;;;;;2283::111;2271:55;;;4891:42:88;;;2253:74:111;2226:18;;4891:42:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4890:43;4882:100;;;;-1:-1:-1;;;4882:100:88;;16369:2:111;4882:100:88;;;16351:21:111;16408:2;16388:18;;;16381:30;16447:34;16427:18;;;16420:62;16518:14;16498:18;;;16491:42;16550:19;;4882:100:88;16167:408:111;4882:100:88;5001:4;:20;;;5022:7;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5001:47;;;;;;;;;;2283:42:111;2271:55;;;5001:47:88;;;2253:74:111;2226:18;;5001:47:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5000:48;4992:110;;;;-1:-1:-1;;;4992:110:88;;16782:2:111;4992:110:88;;;16764:21:111;16821:2;16801:18;;;16794:30;16860:34;16840:18;;;16833:62;16931:19;16911:18;;;16904:47;16968:19;;4992:110:88;16580:413:111;4992:110:88;5112:4;:17;;;5130:7;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5112:39;;;;;;;;;;2283:42:111;2271:55;;;5112:39:88;;;2253:74:111;2226:18;;5112:39:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5161:4;:17;;;5179:7;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5161:44;;;;;;;;;;2283:42:111;2271:55;;;5161:44:88;;;2253:74:111;2226:18;;5161:44:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4810:402;4707:505;:::o;4242:124::-;4309:50;;;;;4350:4;4309:50;;;10762:74:111;4283:7:88;10852:18:111;;;10845:91;;;4283:7:88;4321:10;4309:32;;;;;10735:18:111;;4309:50:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4302:57;;4242:124;:::o;5608:727::-;5730:16;5776:4;5730:53;;5793:19;5815:10;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5861:34;;;;;:21;2271:55:111;;;5861:34:88;;;2253:74:111;5793:50:88;;-1:-1:-1;5861:21:88;;;;;;2226:18:111;;5861:34:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5853:94;;;;-1:-1:-1;;;5853:94:88;;17200:2:111;5853:94:88;;;17182:21:111;17239:2;17219:18;;;17212:30;17278:34;17258:18;;;17251:62;17349:17;17329:18;;;17322:45;17384:19;;5853:94:88;16998:411:111;5853:94:88;5957:5;:19;;;5977:11;5990:10;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5957:57;;;;;;;;;;783:42:111;852:15;;;5957:57:88;;;834:34:111;904:15;;884:18;;;877:43;746:18;;5957:57:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6024:44:88;;;;;:19;852:15:111;;;6024:44:88;;;834:34:111;904:15;;;884:18;;;877:43;6024:19:88;;;-1:-1:-1;6024:19:88;;-1:-1:-1;746:18:111;;6024:44:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6079:23;6105:10;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6079:54;;6144:5;:18;;;6163:10;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6144:43;;;;;;;;;;2283:42:111;2271:55;;;6144:43:88;;;2253:74:111;2226:18;;6144:43:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6197:35:88;;;;;:18;2271:55:111;;;6197:35:88;;;2253:74:111;6197:18:88;;;-1:-1:-1;6197:18:88;;-1:-1:-1;2226:18:111;;6197:35:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6242:41:88;;;;;:24;2271:55:111;;;6242:41:88;;;2253:74:111;6242:24:88;;;-1:-1:-1;6242:24:88;;-1:-1:-1;2226:18:111;;6242:41:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6294:34;6310:5;6317:10;6294:15;:34::i;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;3661:227;-1:-1:-1;;;3661:227:47:o;242:639:1:-;410:12;451:27;438:9;:40;;;;;;;;:::i;:::-;;434:441;;649:1;646;639:4;633:11;626:4;620;616:15;612:2;605:5;592:59;581:70;;434:441;;;849:1;846;839:4;833:11;826:4;820;816:15;809:5;805:2;798:5;793:58;782:69;;434:441;242:639;;;;;;;:::o;1066:436:110:-;1128:23;1197:16;1237:6;1232:3;1229:15;1226:64;;;-1:-1:-1;1270:6:110;1226:64;1320:4;1314:11;1369:4;1364:3;1360:14;1355:3;1351:24;1345:4;1338:38;1401:3;1396;1389:16;1452:3;1449:1;1442:4;1437:3;1433:14;1418:38;1483:3;1066:436;-1:-1:-1;;;1066:436:110:o;2145:730:47:-;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;-1:-1:-1;;;788:34:47;;18190:2:111;788:34:47;;;18172:21:111;18229:2;18209:18;;;18202:30;18268:26;18248:18;;;18241:54;18312:18;;788:34:47;17988:348:111;730:345:47;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;-1:-1:-1;;;903:41:47;;18543:2:111;903:41:47;;;18525:21:111;18582:2;18562:18;;;18555:30;18621:33;18601:18;;;18594:61;18672:18;;903:41:47;18341:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;-1:-1:-1;;;1020:44:47;;18903:2:111;1020:44:47;;;18885:21:111;18942:2;18922:18;;;18915:30;18981:34;18961:18;;;18954:62;19052:4;19032:18;;;19025:32;19074:19;;1020:44:47;18701:398:111;961:114:47;570:511;:::o;5069:1494::-;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;19331:25:111;;;19404:4;19392:17;;19372:18;;;19365:45;;;;19426:18;;;19419:34;;;19469:18;;;19462:34;;;6374:24:47;;19303:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;-1:-1:-1;;6374:24:47;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;14:166:111:-;112:42;105:5;101:54;94:5;91:65;81:93;;170:1;167;160:12;185:277;262:6;315:2;303:9;294:7;290:23;286:32;283:52;;;331:1;328;321:12;283:52;370:9;357:23;389:43;426:5;389:43;:::i;:::-;451:5;185:277;-1:-1:-1;;;185:277:111:o;931:530::-;1042:6;1050;1058;1111:2;1099:9;1090:7;1086:23;1082:32;1079:52;;;1127:1;1124;1117:12;1079:52;1167:9;1154:23;1200:18;1192:6;1189:30;1186:50;;;1232:1;1229;1222:12;1186:50;1255:22;;1311:3;1293:16;;;1289:26;1286:46;;;1328:1;1325;1318:12;1286:46;1351:2;1400;1385:18;;1372:32;;-1:-1:-1;1451:2:111;1436:18;;;1423:32;;931:530;-1:-1:-1;;;931:530:111:o;1648:454::-;1758:6;1766;1819:2;1807:9;1798:7;1794:23;1790:32;1787:52;;;1835:1;1832;1825:12;1787:52;1874:9;1861:23;1893:43;1930:5;1893:43;:::i;:::-;1955:5;-1:-1:-1;2012:2:111;1997:18;;1984:32;2025:45;1984:32;2025:45;:::i;:::-;2089:7;2079:17;;;1648:454;;;;;:::o;2338:184::-;2390:77;2387:1;2380:88;2487:4;2484:1;2477:15;2511:4;2508:1;2501:15;2527:334;2598:2;2592:9;2654:2;2644:13;;-1:-1:-1;;2640:86:111;2628:99;;2757:18;2742:34;;2778:22;;;2739:62;2736:88;;;2804:18;;:::i;:::-;2840:2;2833:22;2527:334;;-1:-1:-1;2527:334:111:o;2866:245::-;2914:4;2947:18;2939:6;2936:30;2933:56;;;2969:18;;:::i;:::-;-1:-1:-1;3026:2:111;3014:15;-1:-1:-1;;3010:88:111;3100:4;3006:99;;2866:245::o;3116:150::-;3191:20;;3240:1;3230:12;;3220:40;;3256:1;3253;3246:12;3220:40;3116:150;;;:::o;3271:982::-;3380:6;3388;3396;3404;3457:3;3445:9;3436:7;3432:23;3428:33;3425:53;;;3474:1;3471;3464:12;3425:53;3513:9;3500:23;3532:43;3569:5;3532:43;:::i;:::-;3594:5;-1:-1:-1;3646:2:111;3631:18;;3618:32;;-1:-1:-1;3701:2:111;3686:18;;3673:32;3728:18;3717:30;;3714:50;;;3760:1;3757;3750:12;3714:50;3783:22;;3836:4;3828:13;;3824:27;-1:-1:-1;3814:55:111;;3865:1;3862;3855:12;3814:55;3901:2;3888:16;3926:48;3942:31;3970:2;3942:31;:::i;:::-;3926:48;:::i;:::-;3997:2;3990:5;3983:17;4037:7;4032:2;4027;4023;4019:11;4015:20;4012:33;4009:53;;;4058:1;4055;4048:12;4009:53;4113:2;4108;4104;4100:11;4095:2;4088:5;4084:14;4071:45;4157:1;4152:2;4147;4140:5;4136:14;4132:23;4125:34;4178:5;4168:15;;;;;4202:45;4243:2;4232:9;4228:18;4202:45;:::i;:::-;4192:55;;3271:982;;;;;;;:::o;4546:613::-;4671:6;4679;4687;4740:2;4728:9;4719:7;4715:23;4711:32;4708:52;;;4756:1;4753;4746:12;4708:52;4795:9;4782:23;4814:43;4851:5;4814:43;:::i;:::-;4876:5;-1:-1:-1;4933:2:111;4918:18;;4905:32;4946:45;4905:32;4946:45;:::i;:::-;5010:7;-1:-1:-1;5069:2:111;5054:18;;5041:32;5082:45;5041:32;5082:45;:::i;:::-;5146:7;5136:17;;;4546:613;;;;;:::o;5476:150::-;5555:13;;5577:43;5555:13;5577:43;:::i;5631:1110::-;5735:6;5743;5796:2;5784:9;5775:7;5771:23;5767:32;5764:52;;;5812:1;5809;5802:12;5764:52;5845:9;5839:16;5874:18;5915:2;5907:6;5904:14;5901:34;;;5931:1;5928;5921:12;5901:34;5969:6;5958:9;5954:22;5944:32;;6014:7;6007:4;6003:2;5999:13;5995:27;5985:55;;6036:1;6033;6026:12;5985:55;6065:2;6059:9;6087:4;6110:2;6106;6103:10;6100:36;;;6116:18;;:::i;:::-;6162:2;6159:1;6155:10;6145:20;;6185:28;6209:2;6205;6201:11;6185:28;:::i;:::-;6247:15;;;6317:11;;;6313:20;;;6278:12;;;;6345:19;;;6342:39;;;6377:1;6374;6367:12;6342:39;6401:11;;;;6421:222;6437:6;6432:3;6429:15;6421:222;;;6510:3;6504:10;6491:23;;6527:43;6564:5;6527:43;:::i;:::-;6583:18;;;6454:12;;;;6621;;;;6421:222;;;6662:5;-1:-1:-1;6686:49:111;;-1:-1:-1;6716:18:111;;;6686:49;:::i;:::-;6676:59;;;;;;5631:1110;;;;;:::o;6746:184::-;6798:77;6795:1;6788:88;6895:4;6892:1;6885:15;6919:4;6916:1;6909:15;6935:263;7005:6;7058:2;7046:9;7037:7;7033:23;7029:32;7026:52;;;7074:1;7071;7064:12;7026:52;7106:9;7100:16;7125:43;7162:5;7125:43;:::i;7203:184::-;7255:77;7252:1;7245:88;7352:4;7349:1;7342:15;7376:4;7373:1;7366:15;7392:195;7431:3;7462:66;7455:5;7452:77;7449:103;;7532:18;;:::i;:::-;-1:-1:-1;7579:1:111;7568:13;;7392:195::o;7592:125::-;7632:4;7660:1;7657;7654:8;7651:34;;;7665:18;;:::i;:::-;-1:-1:-1;7702:9:111;;7592:125::o;7722:331::-;7827:9;7838;7880:8;7868:10;7865:24;7862:44;;;7902:1;7899;7892:12;7862:44;7931:6;7921:8;7918:20;7915:40;;;7951:1;7948;7941:12;7915:40;-1:-1:-1;;7977:23:111;;;8022:25;;;;;-1:-1:-1;7722:331:111:o;8058:372::-;8217:66;8179:19;;8301:11;;;;8332:2;8324:11;;8321:103;;;8411:2;8405;8398:3;8394:2;8390:12;8387:1;8383:20;8379:29;8375:2;8371:38;8367:47;8358:56;;8321:103;;;8058:372;;;;:::o;8792:580::-;8869:4;8875:6;8935:11;8922:25;9025:66;9014:8;8998:14;8994:29;8990:102;8970:18;8966:127;8956:155;;9107:1;9104;9097:12;8956:155;9134:33;;9186:20;;;-1:-1:-1;9229:18:111;9218:30;;9215:50;;;9261:1;9258;9251:12;9215:50;9294:4;9282:17;;-1:-1:-1;9325:14:111;9321:27;;;9311:38;;9308:58;;;9362:1;9359;9352:12;9731:277;9798:6;9851:2;9839:9;9830:7;9826:23;9822:32;9819:52;;;9867:1;9864;9857:12;9819:52;9899:9;9893:16;9952:5;9945:13;9938:21;9931:5;9928:32;9918:60;;9974:1;9971;9964:12;10947:184;11017:6;11070:2;11058:9;11049:7;11045:23;11041:32;11038:52;;;11086:1;11083;11076:12;11038:52;-1:-1:-1;11109:16:111;;10947:184;-1:-1:-1;10947:184:111:o;11136:258::-;11208:1;11218:113;11232:6;11229:1;11226:13;11218:113;;;11308:11;;;11302:18;11289:11;;;11282:39;11254:2;11247:10;11218:113;;;11349:6;11346:1;11343:13;11340:48;;;11384:1;11375:6;11370:3;11366:16;11359:27;11340:48;;11136:258;;;:::o;11399:316::-;11440:3;11478:5;11472:12;11505:6;11500:3;11493:19;11521:63;11577:6;11570:4;11565:3;11561:14;11554:4;11547:5;11543:16;11521:63;:::i;:::-;11629:2;11617:15;-1:-1:-1;;11613:88:111;11604:98;;;;11704:4;11600:109;;11399:316;-1:-1:-1;;11399:316:111:o;11720:2333::-;11970:4;11999:2;12039;12028:9;12024:18;12069:2;12058:9;12051:21;12092:6;12127;12121:13;12158:6;12150;12143:22;12184:2;12174:12;;12217:2;12206:9;12202:18;12195:25;;12279:2;12269:6;12266:1;12262:14;12251:9;12247:30;12243:39;12301:4;12340:2;12332:6;12328:15;12361:1;12371:1598;12385:6;12382:1;12379:13;12371:1598;;;12450:22;;;12474:66;12446:95;12434:108;;12565:13;;12639:9;;544:42;533:54;521:67;;12601:6;12708:2;12704;12700:11;12694:18;12689:2;12681:6;12677:15;12670:43;12760:2;12756;12752:11;12746:18;12801:2;12796;12788:6;12784:15;12777:27;12831:47;12874:2;12866:6;12862:15;12848:12;12831:47;:::i;:::-;12817:61;;;12927:2;12923;12919:11;12913:18;12980:6;12972;12968:19;12963:2;12955:6;12951:15;12944:44;13015:40;13048:6;13032:14;13015:40;:::i;:::-;13078:4;13125:11;;;13119:18;13102:15;;;13095:43;13161:4;13208:11;;;13202:18;13185:15;;;13178:43;13244:4;13291:11;;;13285:18;13268:15;;;13261:43;13327:4;13374:11;;;13368:18;13351:15;;;13344:43;13411:6;13461:12;;;13455:19;13437:16;;;13430:45;13499:6;13546:12;;;13540:19;13597;;;13579:16;;;13572:45;13001:54;;-1:-1:-1;13499:6:111;-1:-1:-1;13644:40:111;13001:54;13540:19;13644:40;:::i;:::-;13630:54;;;;13708:6;13763:3;13759:2;13755:12;13749:19;13727:41;;13818:6;13810;13806:19;13800:3;13792:6;13788:16;13781:45;;13849:40;13882:6;13866:14;13849:40;:::i;:::-;13947:12;;;;13839:50;-1:-1:-1;;;13912:15:111;;;;12407:1;12400:9;12371:1598;;;12375:3;;13986:6;13978:14;;14001:46;14043:2;14032:9;14028:18;14020:6;544:42;533:54;521:67;;467:127;14001:46;;;;;;;11720:2333;;;;;:::o;14496:219::-;14645:2;14634:9;14627:21;14608:4;14665:44;14705:2;14694:9;14690:18;14682:6;14665:44;:::i;15527:635::-;15607:6;15660:2;15648:9;15639:7;15635:23;15631:32;15628:52;;;15676:1;15673;15666:12;15628:52;15709:9;15703:16;15742:18;15734:6;15731:30;15728:50;;;15774:1;15771;15764:12;15728:50;15797:22;;15850:4;15842:13;;15838:27;-1:-1:-1;15828:55:111;;15879:1;15876;15869:12;15828:55;15908:2;15902:9;15933:48;15949:31;15977:2;15949:31;:::i;15933:48::-;16004:2;15997:5;15990:17;16044:7;16039:2;16034;16030;16026:11;16022:20;16019:33;16016:53;;;16065:1;16062;16055:12;16016:53;16078:54;16129:2;16124;16117:5;16113:14;16108:2;16104;16100:11;16078:54;:::i;17799:184::-;17851:77;17848:1;17841:88;17948:4;17945:1;17938:15;17972:4;17969:1;17962:15"},"gasEstimates":{"creation":{"codeDepositCost":"1863600","executionCost":"infinite","totalCost":"infinite"},"external":{"eip4337Fallback()":"infinite","entryPoint()":"infinite","executeAndRevert(address,uint256,bytes,uint8)":"infinite","getCurrentEIP4337Manager(address)":"infinite","getNonce()":"infinite","replaceEIP4337Manager(address,address,address)":"infinite","setup4337Modules(address)":"infinite","validateEip4337(address,address)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite"}},"methodIdentifiers":{"eip4337Fallback()":"70b8a01d","entryPoint()":"b0d691fe","executeAndRevert(address,uint256,bytes,uint8)":"940d3c60","getCurrentEIP4337Manager(address)":"039b1728","getNonce()":"d087d288","replaceEIP4337Manager(address,address,address)":"efae6e06","setup4337Modules(address)":"d041593b","validateEip4337(address,address)":"45b1e0ca","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anEntryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"eip4337Fallback\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"executeAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract GnosisSafe\",\"name\":\"safe\",\"type\":\"address\"}],\"name\":\"getCurrentEIP4337Manager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"prev\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"contract EIP4337Manager\",\"name\":\"oldManager\",\"type\":\"address\"},{\"internalType\":\"contract EIP4337Manager\",\"name\":\"newManager\",\"type\":\"address\"}],\"name\":\"replaceEIP4337Manager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract EIP4337Manager\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"setup4337Modules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract GnosisSafe\",\"name\":\"safe\",\"type\":\"address\"},{\"internalType\":\"contract EIP4337Manager\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"validateEip4337\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getCurrentEIP4337Manager(address)\":{\"returns\":{\"manager\":\"the current active EIP4337Manager\",\"prev\":\"prev module, needed by replaceEIP4337Manager\"}},\"replaceEIP4337Manager(address,address,address)\":{\"params\":{\"newManager\":\"the new EIP4337Manager, usually with a new EntryPoint\",\"oldManager\":\"the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\",\"prevModule\":\"returned by getCurrentEIP4337Manager\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"executeAndRevert(address,uint256,bytes,uint8)\":{\"notice\":\"Execute a call but also revert if the execution fails. The default behavior of the Safe is to not revert if the call fails, which is challenging for integrating with ERC4337 because then the EntryPoint wouldn't know to emit the UserOperationRevertReason event, which the frontend/client uses to capture the reason for the failure.\"},\"getCurrentEIP4337Manager(address)\":{\"notice\":\"enumerate modules, and find the currently active EIP4337 manager (and previous module)\"},\"getNonce()\":{\"notice\":\"Helper for wallet to get the next nonce.\"},\"replaceEIP4337Manager(address,address,address)\":{\"notice\":\"replace EIP4337 module, to support a new EntryPoint. must be called using execTransaction and Enum.Operation.DelegateCall\"},\"setup4337Modules(address)\":{\"notice\":\"set up a safe as EIP-4337 enabled. called from the GnosisSafeAccountFactory during construction time - enable 3 modules (this module, fallback and the entrypoint) - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \\\"this\\\" is the safe itself\"},\"validateEip4337(address,address)\":{\"notice\":\"Validate this gnosisSafe is callable through the EntryPoint. the test is might be incomplete: we check that we reach our validateUserOp and fail on signature. we don't test full transaction\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"delegate-called (using execFromModule) through the fallback, so \\\"real\\\" msg.sender is attached as last 20 bytes\"}},\"notice\":\"Main EIP4337 module. Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\", so must implement validateUserOp holds an immutable reference to the EntryPoint Inherits GnosisSafe so that it can reference the memory storage\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/gnosis/EIP4337Manager.sol\":\"EIP4337Manager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./base/ModuleManager.sol\\\";\\nimport \\\"./base/OwnerManager.sol\\\";\\nimport \\\"./base/FallbackManager.sol\\\";\\nimport \\\"./base/GuardManager.sol\\\";\\nimport \\\"./common/EtherPaymentFallback.sol\\\";\\nimport \\\"./common/Singleton.sol\\\";\\nimport \\\"./common/SignatureDecoder.sol\\\";\\nimport \\\"./common/SecuredTokenTransfer.sol\\\";\\nimport \\\"./common/StorageAccessible.sol\\\";\\nimport \\\"./interfaces/ISignatureValidator.sol\\\";\\nimport \\\"./external/GnosisSafeMath.sol\\\";\\n\\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafe is\\n EtherPaymentFallback,\\n Singleton,\\n ModuleManager,\\n OwnerManager,\\n SignatureDecoder,\\n SecuredTokenTransfer,\\n ISignatureValidatorConstants,\\n FallbackManager,\\n StorageAccessible,\\n GuardManager\\n{\\n using GnosisSafeMath for uint256;\\n\\n string public constant VERSION = \\\"1.3.0\\\";\\n\\n // keccak256(\\n // \\\"EIP712Domain(uint256 chainId,address verifyingContract)\\\"\\n // );\\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\\n\\n // keccak256(\\n // \\\"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\\\"\\n // );\\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\\n\\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\\n event SignMsg(bytes32 indexed msgHash);\\n event ExecutionFailure(bytes32 txHash, uint256 payment);\\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\\n\\n uint256 public nonce;\\n bytes32 private _deprecatedDomainSeparator;\\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\\n mapping(bytes32 => uint256) public signedMessages;\\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\\n\\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\\n constructor() {\\n // By setting the threshold it is not possible to call setup anymore,\\n // so we create a Safe with 0 owners and threshold 1.\\n // This is an unusable Safe, perfect for the singleton\\n threshold = 1;\\n }\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n /// @param to Contract address for optional delegate call.\\n /// @param data Data payload for optional delegate call.\\n /// @param fallbackHandler Handler for fallback calls to this contract\\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\\n /// @param payment Value that should be paid\\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\\n function setup(\\n address[] calldata _owners,\\n uint256 _threshold,\\n address to,\\n bytes calldata data,\\n address fallbackHandler,\\n address paymentToken,\\n uint256 payment,\\n address payable paymentReceiver\\n ) external {\\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\\n setupOwners(_owners, _threshold);\\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\\n setupModules(to, data);\\n\\n if (payment > 0) {\\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\\n }\\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\\n }\\n\\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\\n /// Note: The fees are always transferred, even if the user transaction fails.\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @param safeTxGas Gas that should be used for the Safe transaction.\\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Gas price that should be used for the payment calculation.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\\n function execTransaction(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures\\n ) public payable virtual returns (bool success) {\\n bytes32 txHash;\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n bytes memory txHashData =\\n encodeTransactionData(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n nonce\\n );\\n // Increase nonce and execute transaction.\\n nonce++;\\n txHash = keccak256(txHashData);\\n checkSignatures(txHash, txHashData, signatures);\\n }\\n address guard = getGuard();\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkTransaction(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n signatures,\\n msg.sender\\n );\\n }\\n }\\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \\\"GS010\\\");\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n uint256 gasUsed = gasleft();\\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\\n gasUsed = gasUsed.sub(gasleft());\\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\\n require(success || safeTxGas != 0 || gasPrice != 0, \\\"GS013\\\");\\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\\n uint256 payment = 0;\\n if (gasPrice > 0) {\\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\\n }\\n if (success) emit ExecutionSuccess(txHash, payment);\\n else emit ExecutionFailure(txHash, payment);\\n }\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkAfterExecution(txHash, success);\\n }\\n }\\n }\\n\\n function handlePayment(\\n uint256 gasUsed,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver\\n ) private returns (uint256 payment) {\\n // solhint-disable-next-line avoid-tx-origin\\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\\n if (gasToken == address(0)) {\\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\\n require(receiver.send(payment), \\\"GS011\\\");\\n } else {\\n payment = gasUsed.add(baseGas).mul(gasPrice);\\n require(transferToken(gasToken, receiver, payment), \\\"GS012\\\");\\n }\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n */\\n function checkSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures\\n ) public view {\\n // Load threshold to avoid multiple storage loads\\n uint256 _threshold = threshold;\\n // Check that a threshold is set\\n require(_threshold > 0, \\\"GS001\\\");\\n checkNSignatures(dataHash, data, signatures, _threshold);\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n * @param requiredSignatures Amount of required valid signatures.\\n */\\n function checkNSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures,\\n uint256 requiredSignatures\\n ) public view {\\n // Check that the provided signature data is not too short\\n require(signatures.length >= requiredSignatures.mul(65), \\\"GS020\\\");\\n // There cannot be an owner with address 0.\\n address lastOwner = address(0);\\n address currentOwner;\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n uint256 i;\\n for (i = 0; i < requiredSignatures; i++) {\\n (v, r, s) = signatureSplit(signatures, i);\\n if (v == 0) {\\n // If v is 0 then it is a contract signature\\n // When handling contract signatures the address of the contract is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n\\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\\n // Here we only check that the pointer is not pointing inside the part that is being processed\\n require(uint256(s) >= requiredSignatures.mul(65), \\\"GS021\\\");\\n\\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\\n require(uint256(s).add(32) <= signatures.length, \\\"GS022\\\");\\n\\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\\n uint256 contractSignatureLen;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\\n }\\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \\\"GS023\\\");\\n\\n // Check signature\\n bytes memory contractSignature;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\\n contractSignature := add(add(signatures, s), 0x20)\\n }\\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \\\"GS024\\\");\\n } else if (v == 1) {\\n // If v is 1 then it is an approved hash\\n // When handling approved hashes the address of the approver is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \\\"GS025\\\");\\n } else if (v > 30) {\\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\\n currentOwner = ecrecover(keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", dataHash)), v - 4, r, s);\\n } else {\\n // Default is the ecrecover flow with the provided data hash\\n // Use ecrecover with the messageHash for EOA signatures\\n currentOwner = ecrecover(dataHash, v, r, s);\\n }\\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \\\"GS026\\\");\\n lastOwner = currentOwner;\\n }\\n }\\n\\n /// @dev Allows to estimate a Safe transaction.\\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\\n function requiredTxGas(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation\\n ) external returns (uint256) {\\n uint256 startGas = gasleft();\\n // We don't provide an error message here, as we use it to return the estimate\\n require(execute(to, value, data, operation, gasleft()));\\n uint256 requiredGas = startGas - gasleft();\\n // Convert response to string and return via error message\\n revert(string(abi.encodePacked(requiredGas)));\\n }\\n\\n /**\\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\\n */\\n function approveHash(bytes32 hashToApprove) external {\\n require(owners[msg.sender] != address(0), \\\"GS030\\\");\\n approvedHashes[msg.sender][hashToApprove] = 1;\\n emit ApproveHash(hashToApprove, msg.sender);\\n }\\n\\n /// @dev Returns the chain id used by this contract.\\n function getChainId() public view returns (uint256) {\\n uint256 id;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n id := chainid()\\n }\\n return id;\\n }\\n\\n function domainSeparator() public view returns (bytes32) {\\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\\n }\\n\\n /// @dev Returns the bytes that are hashed to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Gas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash bytes.\\n function encodeTransactionData(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes memory) {\\n bytes32 safeTxHash =\\n keccak256(\\n abi.encode(\\n SAFE_TX_TYPEHASH,\\n to,\\n value,\\n keccak256(data),\\n operation,\\n safeTxGas,\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n _nonce\\n )\\n );\\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\\n }\\n\\n /// @dev Returns hash to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Fas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash.\\n function getTransactionHash(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes32) {\\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\\n }\\n}\\n\",\"keccak256\":\"0x2ca9e3e053c969b9364f62c50c2c25b92525db7fd0bad3ae1fb0c20dd575367c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract FallbackManager is SelfAuthorized {\\n event ChangedFallbackHandler(address handler);\\n\\n // keccak256(\\\"fallback_manager.handler.address\\\")\\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\\n\\n function internalSetFallbackHandler(address handler) internal {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, handler)\\n }\\n }\\n\\n /// @dev Allows to add a contract to handle fallback calls.\\n /// Only fallback calls without value and with data will be forwarded.\\n /// This can only be done via a Safe transaction.\\n /// @param handler contract to handle fallbacks calls.\\n function setFallbackHandler(address handler) public authorized {\\n internalSetFallbackHandler(handler);\\n emit ChangedFallbackHandler(handler);\\n }\\n\\n // solhint-disable-next-line payable-fallback,no-complex-fallback\\n fallback() external {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let handler := sload(slot)\\n if iszero(handler) {\\n return(0, 0)\\n }\\n calldatacopy(0, 0, calldatasize())\\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\\n // Then the address without padding is stored right after the calldata\\n mstore(calldatasize(), shl(96, caller()))\\n // Add 20 bytes for the address appended add the end\\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if iszero(success) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1be9f0f3e80a78134c2e3a026c6a14759785bd35d135e87a4a025aeb6742791f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\nimport \\\"./Executor.sol\\\";\\n\\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract ModuleManager is SelfAuthorized, Executor {\\n event EnabledModule(address module);\\n event DisabledModule(address module);\\n event ExecutionFromModuleSuccess(address indexed module);\\n event ExecutionFromModuleFailure(address indexed module);\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n mapping(address => address) internal modules;\\n\\n function setupModules(address to, bytes memory data) internal {\\n require(modules[SENTINEL_MODULES] == address(0), \\\"GS100\\\");\\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\\n if (to != address(0))\\n // Setup has to complete successfully or transaction fails.\\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \\\"GS000\\\");\\n }\\n\\n /// @dev Allows to add a module to the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Enables the module `module` for the Safe.\\n /// @param module Module to be whitelisted.\\n function enableModule(address module) public authorized {\\n // Module address cannot be null or sentinel.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n // Module cannot be added twice.\\n require(modules[module] == address(0), \\\"GS102\\\");\\n modules[module] = modules[SENTINEL_MODULES];\\n modules[SENTINEL_MODULES] = module;\\n emit EnabledModule(module);\\n }\\n\\n /// @dev Allows to remove a module from the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Disables the module `module` for the Safe.\\n /// @param prevModule Module that pointed to the module to be removed in the linked list\\n /// @param module Module to be removed.\\n function disableModule(address prevModule, address module) public authorized {\\n // Validate module address and check that it corresponds to module index.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n require(modules[prevModule] == module, \\\"GS103\\\");\\n modules[prevModule] = modules[module];\\n modules[module] = address(0);\\n emit DisabledModule(module);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public virtual returns (bool success) {\\n // Only whitelisted modules are allowed.\\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \\\"GS104\\\");\\n // Execute transaction without further confirmations.\\n success = execute(to, value, data, operation, gasleft());\\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\\n else emit ExecutionFromModuleFailure(msg.sender);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModuleReturnData(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public returns (bool success, bytes memory returnData) {\\n success = execTransactionFromModule(to, value, data, operation);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // Load free memory location\\n let ptr := mload(0x40)\\n // We allocate memory for the return data by setting the free memory location to\\n // current free memory location + data size + 32 bytes for data size value\\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\\n // Store the size\\n mstore(ptr, returndatasize())\\n // Store the data\\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\\n // Point the return data to the correct memory location\\n returnData := ptr\\n }\\n }\\n\\n /// @dev Returns if an module is enabled\\n /// @return True if the module is enabled\\n function isModuleEnabled(address module) public view returns (bool) {\\n return SENTINEL_MODULES != module && modules[module] != address(0);\\n }\\n\\n /// @dev Returns array of modules.\\n /// @param start Start of the page.\\n /// @param pageSize Maximum number of modules that should be returned.\\n /// @return array Array of modules.\\n /// @return next Start of the next page.\\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\\n // Init array with max page size\\n array = new address[](pageSize);\\n\\n // Populate return array\\n uint256 moduleCount = 0;\\n address currentModule = modules[start];\\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\\n array[moduleCount] = currentModule;\\n currentModule = modules[currentModule];\\n moduleCount++;\\n }\\n next = currentModule;\\n // Set correct size of returned array\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n mstore(array, moduleCount)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5512760a0328309f82a71cbe2ac14e0942501b9d44d5fb417bd02174546672e5\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract OwnerManager is SelfAuthorized {\\n event AddedOwner(address owner);\\n event RemovedOwner(address owner);\\n event ChangedThreshold(uint256 threshold);\\n\\n address internal constant SENTINEL_OWNERS = address(0x1);\\n\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\\n // Threshold can only be 0 at initialization.\\n // Check ensures that setup function can only be called once.\\n require(threshold == 0, \\\"GS200\\\");\\n // Validate that threshold is smaller than number of added owners.\\n require(_threshold <= _owners.length, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n // Initializing Safe owners.\\n address currentOwner = SENTINEL_OWNERS;\\n for (uint256 i = 0; i < _owners.length; i++) {\\n // Owner address cannot be null.\\n address owner = _owners[i];\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[currentOwner] = owner;\\n currentOwner = owner;\\n }\\n owners[currentOwner] = SENTINEL_OWNERS;\\n ownerCount = _owners.length;\\n threshold = _threshold;\\n }\\n\\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\\n /// @param owner New owner address.\\n /// @param _threshold New threshold.\\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[owner] = owners[SENTINEL_OWNERS];\\n owners[SENTINEL_OWNERS] = owner;\\n ownerCount++;\\n emit AddedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\\n /// @param owner Owner address to be removed.\\n /// @param _threshold New threshold.\\n function removeOwner(\\n address prevOwner,\\n address owner,\\n uint256 _threshold\\n ) public authorized {\\n // Only allow to remove an owner, if threshold can still be reached.\\n require(ownerCount - 1 >= _threshold, \\\"GS201\\\");\\n // Validate owner address and check that it corresponds to owner index.\\n require(owner != address(0) && owner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == owner, \\\"GS205\\\");\\n owners[prevOwner] = owners[owner];\\n owners[owner] = address(0);\\n ownerCount--;\\n emit RemovedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to swap/replace an owner from the Safe with another address.\\n /// This can only be done via a Safe transaction.\\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\\n /// @param oldOwner Owner address to be replaced.\\n /// @param newOwner New owner address.\\n function swapOwner(\\n address prevOwner,\\n address oldOwner,\\n address newOwner\\n ) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[newOwner] == address(0), \\\"GS204\\\");\\n // Validate oldOwner address and check that it corresponds to owner index.\\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == oldOwner, \\\"GS205\\\");\\n owners[newOwner] = owners[oldOwner];\\n owners[prevOwner] = newOwner;\\n owners[oldOwner] = address(0);\\n emit RemovedOwner(oldOwner);\\n emit AddedOwner(newOwner);\\n }\\n\\n /// @dev Allows to update the number of required confirmations by Safe owners.\\n /// This can only be done via a Safe transaction.\\n /// @notice Changes the threshold of the Safe to `_threshold`.\\n /// @param _threshold New threshold.\\n function changeThreshold(uint256 _threshold) public authorized {\\n // Validate that threshold is smaller than number of owners.\\n require(_threshold <= ownerCount, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n threshold = _threshold;\\n emit ChangedThreshold(threshold);\\n }\\n\\n function getThreshold() public view returns (uint256) {\\n return threshold;\\n }\\n\\n function isOwner(address owner) public view returns (bool) {\\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\\n }\\n\\n /// @dev Returns array of owners.\\n /// @return Array of Safe owners.\\n function getOwners() public view returns (address[] memory) {\\n address[] memory array = new address[](ownerCount);\\n\\n // populate return array\\n uint256 index = 0;\\n address currentOwner = owners[SENTINEL_OWNERS];\\n while (currentOwner != SENTINEL_OWNERS) {\\n array[index] = currentOwner;\\n currentOwner = owners[currentOwner];\\n index++;\\n }\\n return array;\\n }\\n}\\n\",\"keccak256\":\"0x01a3d64cc0967f42ae63802409f5404d18352516ea2a6335005003d919ffcf12\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\\n/// @author Richard Meissner - \\ncontract EtherPaymentFallback {\\n event SafeReceived(address indexed sender, uint256 value);\\n\\n /// @dev Fallback function accepts Ether transactions.\\n receive() external payable {\\n emit SafeReceived(msg.sender, msg.value);\\n }\\n}\\n\",\"keccak256\":\"0x1a7928d29877da84a3d0df846d5cd933d48ee095c1bde0aa044e249b12e27a72\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SecuredTokenTransfer - Secure token transfer\\n/// @author Richard Meissner - \\ncontract SecuredTokenTransfer {\\n /// @dev Transfers a token and returns if it was a success\\n /// @param token Token that should be transferred\\n /// @param receiver Receiver to whom the token should be transferred\\n /// @param amount The amount of tokens that should be transferred\\n function transferToken(\\n address token,\\n address receiver,\\n uint256 amount\\n ) internal returns (bool transferred) {\\n // 0xa9059cbb - keccack(\\\"transfer(address,uint256)\\\")\\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // We write the return value to scratch space.\\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n switch returndatasize()\\n case 0 {\\n transferred := success\\n }\\n case 0x20 {\\n transferred := iszero(or(iszero(success), iszero(mload(0))))\\n }\\n default {\\n transferred := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x178682d8477da42936c7e8e24d39094c4ac08ecd8623794b9535d77001b665f1\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\\n/// @author Richard Meissner - \\ncontract SignatureDecoder {\\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\\n /// @param signatures concatenated rsv signatures\\n function signatureSplit(bytes memory signatures, uint256 pos)\\n internal\\n pure\\n returns (\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n )\\n {\\n // The signature format is a compact form of:\\n // {bytes32 r}{bytes32 s}{uint8 v}\\n // Compact means, uint8 is not padded to 32 bytes.\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let signaturePos := mul(0x41, pos)\\n r := mload(add(signatures, add(signaturePos, 0x20)))\\n s := mload(add(signatures, add(signaturePos, 0x40)))\\n // Here we are loading the last 32 bytes, including 31 bytes\\n // of 's'. There is no 'mload8' to do this.\\n //\\n // 'byte' is not working due to the Solidity parser, so lets\\n // use the second best option, 'and'\\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d37be182472ccfee62a33e9939f9b3d509be4c32e9fdebc2c1746c573655987\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\\n/// @author Richard Meissner - \\ncontract Singleton {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\\n // It should also always be ensured that the address is stored alone (uses a full word)\\n address private singleton;\\n}\\n\",\"keccak256\":\"0x6e02c18998de8834dd7d69890cb6ede996b6f635d2337081a596d91e35e2c648\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\\ncontract StorageAccessible {\\n /**\\n * @dev Reads `length` bytes of storage in the currents contract\\n * @param offset - the offset in the current contract's storage in words to start reading from\\n * @param length - the number of words (32 bytes) of data to read\\n * @return the bytes that were read.\\n */\\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\\n bytes memory result = new bytes(length * 32);\\n for (uint256 index = 0; index < length; index++) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let word := sload(add(offset, index))\\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Performs a delegetecall on a targetContract in the context of self.\\n * Internally reverts execution to avoid side effects (making it static).\\n *\\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\\n * Specifically, the `returndata` after a call to this method will be:\\n * `success:bool || response.length:uint256 || response:bytes`.\\n *\\n * @param targetContract Address of the contract containing the code to execute.\\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\\n */\\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\\n\\n mstore(0x00, success)\\n mstore(0x20, returndatasize())\\n returndatacopy(0x40, 0, returndatasize())\\n revert(0, add(returndatasize(), 0x40))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36853adb266c2ab7d3c612aca799441a86bd15d9e1d24fc6c70d63f5c2df3aaf\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\\n/// @author Richard Meissner - \\ncontract GnosisSafeStorage {\\n // From /common/Singleton.sol\\n address internal singleton;\\n // From /common/ModuleManager.sol\\n mapping(address => address) internal modules;\\n // From /common/OwnerManager.sol\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n // From /GnosisSafe.sol\\n bytes32 internal nonce;\\n bytes32 internal domainSeparator;\\n mapping(bytes32 => uint256) internal signedMessages;\\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xecfd0d8a43d859ef1fb8161cb21ce5d38461603383378a5b1c4c7d5d4a3bfbf3\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title GnosisSafeMath\\n * @dev Math operations with safety checks that revert on error\\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\\n * TODO: remove once open zeppelin update to solc 0.5.0\\n */\\nlibrary GnosisSafeMath {\\n /**\\n * @dev Multiplies two numbers, reverts on overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Adds two numbers, reverts on overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x2a2b4d74f5834a9437be0cd3254d7a676698fc78aa47941c2009470196998d98\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../interfaces/ERC1155TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC721TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC777TokensRecipient.sol\\\";\\nimport \\\"../interfaces/IERC165.sol\\\";\\n\\n/// @title Default Callback Handler - returns true for known token callbacks\\n/// @author Richard Meissner - \\ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\\n string public constant NAME = \\\"Default Callback Handler\\\";\\n string public constant VERSION = \\\"1.0.0\\\";\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xf23a6e61;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xbc197c81;\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0x150b7a02;\\n }\\n\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n // We implement this for completeness, doesn't really have any value\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x1cdc184c3504176383b7f94f9ce06c96ce1c123e1878258fe6dc03cce4a29ff7\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\n*/\\ninterface ERC1155TokenReceiver {\\n /**\\n @notice Handle the receipt of a single ERC1155 token type.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\\n This function MUST revert if it rejects the transfer.\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _id The ID of the token being transferred\\n @param _value The amount of tokens being transferred\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n */\\n function onERC1155Received(\\n address _operator,\\n address _from,\\n uint256 _id,\\n uint256 _value,\\n bytes calldata _data\\n ) external returns (bytes4);\\n\\n /**\\n @notice Handle the receipt of multiple ERC1155 token types.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\\n This function MUST revert if it rejects the transfer(s).\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n */\\n function onERC1155BatchReceived(\\n address _operator,\\n address _from,\\n uint256[] calldata _ids,\\n uint256[] calldata _values,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7894ef55ee3334f6388e5e1d749bbabd85fc03d5a2ab949f284bce830f8aa398\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\\ninterface ERC721TokenReceiver {\\n /// @notice Handle the receipt of an NFT\\n /// @dev The ERC721 smart contract calls this function on the recipient\\n /// after a `transfer`. This function MAY throw to revert and reject the\\n /// transfer. Return of other than the magic value MUST result in the\\n /// transaction being reverted.\\n /// Note: the contract address is always the message sender.\\n /// @param _operator The address which called `safeTransferFrom` function\\n /// @param _from The address which previously owned the token\\n /// @param _tokenId The NFT identifier which is being transferred\\n /// @param _data Additional data with no specified format\\n /// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n /// unless throwing\\n function onERC721Received(\\n address _operator,\\n address _from,\\n uint256 _tokenId,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x8a3dd41df3a49d9ae2d45dd4087ca595946ed3c6051b8aa304727017b5eabaa4\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ninterface ERC777TokensRecipient {\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata data,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1cfbdb95761067c5bc35599fcae6c11e487f2879d7fa2c6f47e7b94506b4039c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c64c2e071245db8fe3ea8b94f73c5a8de236933858ae240348d502433a9d178\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"},\"@openzeppelin/contracts/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/gnosis/EIP4337Fallback.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@openzeppelin/contracts/interfaces/IERC1271.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"./EIP4337Manager.sol\\\";\\n\\nusing ECDSA for bytes32;\\n\\n/**\\n * The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\\n * This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\\n * Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\\n * Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\\n */\\ncontract EIP4337Fallback is DefaultCallbackHandler, IAccount, IERC1271 {\\n bytes4 internal constant ERC1271_MAGIC_VALUE = 0x1626ba7e;\\n\\n address immutable public eip4337manager;\\n constructor(address _eip4337manager) {\\n eip4337manager = _eip4337manager;\\n }\\n\\n /**\\n * delegate the contract call to the EIP4337Manager\\n */\\n function delegateToManager() internal returns (bytes memory) {\\n // delegate entire msg.data (including the appended \\\"msg.sender\\\") to the EIP4337Manager\\n // will work only for GnosisSafe contracts\\n GnosisSafe safe = GnosisSafe(payable(msg.sender));\\n (bool success, bytes memory ret) = safe.execTransactionFromModuleReturnData(eip4337manager, 0, msg.data, Enum.Operation.DelegateCall);\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function validateUserOp(UserOperation calldata, bytes32, uint256) override external returns (uint256 deadline){\\n bytes memory ret = delegateToManager();\\n return abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public returns (uint256 nonce) {\\n bytes memory ret = delegateToManager();\\n (nonce) = abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function executeAndRevert(\\n address,\\n uint256,\\n bytes memory,\\n Enum.Operation\\n ) external {\\n delegateToManager();\\n }\\n\\n function isValidSignature(\\n bytes32 _hash,\\n bytes memory _signature\\n ) external override view returns (bytes4) {\\n bytes32 hash = _hash.toEthSignedMessageHash();\\n address recovered = hash.recover(_signature);\\n\\n GnosisSafe safe = GnosisSafe(payable(address(msg.sender)));\\n\\n // Validate signatures\\n if (safe.isOwner(recovered)) {\\n return ERC1271_MAGIC_VALUE;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6be32571c849722d61a84fb03975dcf158fd45f88e10f289ce2626b49def8ca5\",\"license\":\"GPL\"},\"contracts/samples/gnosis/EIP4337Manager.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\\\";\\nimport \\\"./EIP4337Fallback.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"../../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../../utils/Exec.sol\\\";\\n\\n using ECDSA for bytes32;\\n\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n * Inherits GnosisSafe so that it can reference the memory storage\\n */\\ncontract EIP4337Manager is IAccount, GnosisSafeStorage, Executor {\\n\\n address public immutable eip4337Fallback;\\n address public immutable entryPoint;\\n\\n // return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n constructor(address anEntryPoint) {\\n entryPoint = anEntryPoint;\\n eip4337Fallback = address(new EIP4337Fallback(address(this)));\\n }\\n\\n /**\\n * delegate-called (using execFromModule) through the fallback, so \\\"real\\\" msg.sender is attached as last 20 bytes\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override returns (uint256 validationData) {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n address recovered = hash.recover(userOp.signature);\\n require(threshold == 1, \\\"account: only threshold 1\\\");\\n if (!pThis.isOwner(recovered)) {\\n validationData = SIG_VALIDATION_FAILED;\\n }\\n\\n // mimic normal Safe nonce behaviour: prevent parallel nonces\\n require(userOp.nonce < type(uint64).max, \\\"account: nonsequential nonce\\\");\\n\\n if (missingAccountFunds > 0) {\\n //Note: MAY pay more than the minimum, to deposit for future transactions\\n (bool success,) = payable(msgSender).call{value : missingAccountFunds}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n\\n /**\\n * Execute a call but also revert if the execution fails.\\n * The default behavior of the Safe is to not revert if the call fails,\\n * which is challenging for integrating with ERC4337 because then the\\n * EntryPoint wouldn't know to emit the UserOperationRevertReason event,\\n * which the frontend/client uses to capture the reason for the failure.\\n */\\n function executeAndRevert(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) external {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n require(msg.sender == eip4337Fallback, \\\"account: not from EIP4337Fallback\\\");\\n\\n bool success = execute(\\n to,\\n value,\\n data,\\n operation,\\n type(uint256).max\\n );\\n\\n bytes memory returnData = Exec.getReturnData(type(uint256).max);\\n // Revert with the actual reason string\\n // Adopted from: https://github.com/Uniswap/v3-periphery/blob/464a8a49611272f7349c970e0fadb7ec1d3c1086/contracts/base/Multicall.sol#L16-L23\\n if (!success) {\\n if (returnData.length < 68) revert();\\n assembly {\\n returnData := add(returnData, 0x04)\\n }\\n revert(abi.decode(returnData, (string)));\\n }\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public view returns (uint256) {\\n return IEntryPoint(entryPoint).getNonce(address(this), 0);\\n }\\n\\n /**\\n * set up a safe as EIP-4337 enabled.\\n * called from the GnosisSafeAccountFactory during construction time\\n * - enable 3 modules (this module, fallback and the entrypoint)\\n * - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \\\"this\\\" is the safe itself\\n */\\n function setup4337Modules(\\n EIP4337Manager manager //the manager (this contract)\\n ) external {\\n GnosisSafe safe = GnosisSafe(payable(address(this)));\\n require(!safe.isModuleEnabled(manager.entryPoint()), \\\"setup4337Modules: entrypoint already enabled\\\");\\n require(!safe.isModuleEnabled(manager.eip4337Fallback()), \\\"setup4337Modules: eip4337Fallback already enabled\\\");\\n safe.enableModule(manager.entryPoint());\\n safe.enableModule(manager.eip4337Fallback());\\n }\\n\\n /**\\n * replace EIP4337 module, to support a new EntryPoint.\\n * must be called using execTransaction and Enum.Operation.DelegateCall\\n * @param prevModule returned by getCurrentEIP4337Manager\\n * @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\\n * @param newManager the new EIP4337Manager, usually with a new EntryPoint\\n */\\n function replaceEIP4337Manager(address prevModule, EIP4337Manager oldManager, EIP4337Manager newManager) public {\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n address oldFallback = oldManager.eip4337Fallback();\\n require(pThis.isModuleEnabled(oldFallback), \\\"replaceEIP4337Manager: oldManager is not active\\\");\\n pThis.disableModule(oldFallback, oldManager.entryPoint());\\n pThis.disableModule(prevModule, oldFallback);\\n\\n address eip4337fallback = newManager.eip4337Fallback();\\n\\n pThis.enableModule(newManager.entryPoint());\\n pThis.enableModule(eip4337fallback);\\n pThis.setFallbackHandler(eip4337fallback);\\n\\n validateEip4337(pThis, newManager);\\n }\\n\\n /**\\n * Validate this gnosisSafe is callable through the EntryPoint.\\n * the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\\n * we don't test full transaction\\n */\\n function validateEip4337(GnosisSafe safe, EIP4337Manager manager) public {\\n\\n // this prevents mistaken replaceEIP4337Manager to disable the module completely.\\n // minimal signature that pass \\\"recover\\\"\\n bytes memory sig = new bytes(65);\\n sig[64] = bytes1(uint8(27));\\n sig[2] = bytes1(uint8(1));\\n sig[35] = bytes1(uint8(1));\\n uint256 nonce = uint256(IEntryPoint(manager.entryPoint()).getNonce(address(safe), 0));\\n UserOperation memory userOp = UserOperation(address(safe), nonce, \\\"\\\", \\\"\\\", 0, 1000000, 0, 0, 0, \\\"\\\", sig);\\n UserOperation[] memory userOps = new UserOperation[](1);\\n userOps[0] = userOp;\\n IEntryPoint _entryPoint = IEntryPoint(payable(manager.entryPoint()));\\n try _entryPoint.handleOps(userOps, payable(msg.sender)) {\\n revert(\\\"validateEip4337: handleOps must fail\\\");\\n } catch (bytes memory error) {\\n if (keccak256(error) != keccak256(abi.encodeWithSignature(\\\"FailedOp(uint256,string)\\\", 0, \\\"AA24 signature error\\\"))) {\\n revert(string(error));\\n }\\n }\\n }\\n /**\\n * enumerate modules, and find the currently active EIP4337 manager (and previous module)\\n * @return prev prev module, needed by replaceEIP4337Manager\\n * @return manager the current active EIP4337Manager\\n */\\n function getCurrentEIP4337Manager(GnosisSafe safe) public view returns (address prev, address manager) {\\n prev = address(SENTINEL_MODULES);\\n (address[] memory modules,) = safe.getModulesPaginated(SENTINEL_MODULES, 100);\\n for (uint i = 0; i < modules.length; i++) {\\n address module = modules[i];\\n try EIP4337Fallback(module).eip4337manager() returns (address _manager) {\\n return (prev, _manager);\\n }\\n // solhint-disable-next-line no-empty-blocks\\n catch {}\\n prev = module;\\n }\\n return (address(0), address(0));\\n }\\n}\\n\",\"keccak256\":\"0xbba6bd62aefbd6ec3b6fc6ad2bd79ede258d342f7a193c938f1323466a6a2ac7\",\"license\":\"GPL\"},\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2153,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"singleton","offset":0,"slot":"0","type":"t_address"},{"astId":2157,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"modules","offset":0,"slot":"1","type":"t_mapping(t_address,t_address)"},{"astId":2161,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"owners","offset":0,"slot":"2","type":"t_mapping(t_address,t_address)"},{"astId":2163,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"ownerCount","offset":0,"slot":"3","type":"t_uint256"},{"astId":2165,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"threshold","offset":0,"slot":"4","type":"t_uint256"},{"astId":2167,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"nonce","offset":0,"slot":"5","type":"t_bytes32"},{"astId":2169,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"domainSeparator","offset":0,"slot":"6","type":"t_bytes32"},{"astId":2173,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"signedMessages","offset":0,"slot":"7","type":"t_mapping(t_bytes32,t_uint256)"},{"astId":2179,"contract":"contracts/samples/gnosis/EIP4337Manager.sol:EIP4337Manager","label":"approvedHashes","offset":0,"slot":"8","type":"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(bytes32 => uint256))","numberOfBytes":"32","value":"t_mapping(t_bytes32,t_uint256)"},"t_mapping(t_bytes32,t_uint256)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"executeAndRevert(address,uint256,bytes,uint8)":{"notice":"Execute a call but also revert if the execution fails. The default behavior of the Safe is to not revert if the call fails, which is challenging for integrating with ERC4337 because then the EntryPoint wouldn't know to emit the UserOperationRevertReason event, which the frontend/client uses to capture the reason for the failure."},"getCurrentEIP4337Manager(address)":{"notice":"enumerate modules, and find the currently active EIP4337 manager (and previous module)"},"getNonce()":{"notice":"Helper for wallet to get the next nonce."},"replaceEIP4337Manager(address,address,address)":{"notice":"replace EIP4337 module, to support a new EntryPoint. must be called using execTransaction and Enum.Operation.DelegateCall"},"setup4337Modules(address)":{"notice":"set up a safe as EIP-4337 enabled. called from the GnosisSafeAccountFactory during construction time - enable 3 modules (this module, fallback and the entrypoint) - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \"this\" is the safe itself"},"validateEip4337(address,address)":{"notice":"Validate this gnosisSafe is callable through the EntryPoint. the test is might be incomplete: we check that we reach our validateUserOp and fail on signature. we don't test full transaction"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"delegate-called (using execFromModule) through the fallback, so \"real\" msg.sender is attached as last 20 bytes"}},"notice":"Main EIP4337 module. Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\", so must implement validateUserOp holds an immutable reference to the EntryPoint Inherits GnosisSafe so that it can reference the memory storage","version":1}}},"contracts/samples/gnosis/GnosisAccountFactory.sol":{"GnosisSafeAccountFactory":{"abi":[{"inputs":[{"internalType":"contract GnosisSafeProxyFactory","name":"_proxyFactory","type":"address"},{"internalType":"address","name":"_safeSingleton","type":"address"},{"internalType":"contract EIP4337Manager","name":"_eip4337Manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"createAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip4337Manager","outputs":[{"internalType":"contract EIP4337Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyFactory","outputs":[{"internalType":"contract GnosisSafeProxyFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safeSingleton","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_18842":{"entryPoint":null,"id":18842,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_contract$_GnosisSafeProxyFactory_$2804t_addresst_contract$_EIP4337Manager_$18804_fromMemory":{"entryPoint":100,"id":null,"parameterSlots":2,"returnSlots":3},"validator_revert_contract_GnosisSafeProxyFactory":{"entryPoint":76,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:822:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"147:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"156:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"159:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"149:6:111"},"nodeType":"YulFunctionCall","src":"149:12:111"},"nodeType":"YulExpressionStatement","src":"149:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"117:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"132:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"137:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"128:3:111"},"nodeType":"YulFunctionCall","src":"128:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"124:3:111"},"nodeType":"YulFunctionCall","src":"124:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"103:2:111"},"nodeType":"YulFunctionCall","src":"103:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"96:6:111"},"nodeType":"YulFunctionCall","src":"96:50:111"},"nodeType":"YulIf","src":"93:70:111"}]},"name":"validator_revert_contract_GnosisSafeProxyFactory","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"72:5:111","type":""}],"src":"14:155:111"},{"body":{"nodeType":"YulBlock","src":"344:476:111","statements":[{"body":{"nodeType":"YulBlock","src":"390:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"399:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"402:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"392:6:111"},"nodeType":"YulFunctionCall","src":"392:12:111"},"nodeType":"YulExpressionStatement","src":"392:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"365:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"374:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"361:3:111"},"nodeType":"YulFunctionCall","src":"361:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"386:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"357:3:111"},"nodeType":"YulFunctionCall","src":"357:32:111"},"nodeType":"YulIf","src":"354:52:111"},{"nodeType":"YulVariableDeclaration","src":"415:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"434:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"428:5:111"},"nodeType":"YulFunctionCall","src":"428:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"419:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"502:5:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafeProxyFactory","nodeType":"YulIdentifier","src":"453:48:111"},"nodeType":"YulFunctionCall","src":"453:55:111"},"nodeType":"YulExpressionStatement","src":"453:55:111"},{"nodeType":"YulAssignment","src":"517:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"527:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"517:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"541:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"577:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"562:3:111"},"nodeType":"YulFunctionCall","src":"562:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"556:5:111"},"nodeType":"YulFunctionCall","src":"556:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"545:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"639:7:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafeProxyFactory","nodeType":"YulIdentifier","src":"590:48:111"},"nodeType":"YulFunctionCall","src":"590:57:111"},"nodeType":"YulExpressionStatement","src":"590:57:111"},{"nodeType":"YulAssignment","src":"656:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"666:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"656:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"682:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"707:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"718:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"703:3:111"},"nodeType":"YulFunctionCall","src":"703:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"697:5:111"},"nodeType":"YulFunctionCall","src":"697:25:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"686:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"780:7:111"}],"functionName":{"name":"validator_revert_contract_GnosisSafeProxyFactory","nodeType":"YulIdentifier","src":"731:48:111"},"nodeType":"YulFunctionCall","src":"731:57:111"},"nodeType":"YulExpressionStatement","src":"731:57:111"},{"nodeType":"YulAssignment","src":"797:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"807:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"797:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_GnosisSafeProxyFactory_$2804t_addresst_contract$_EIP4337Manager_$18804_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"294:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"305:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"317:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"325:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"333:6:111","type":""}],"src":"174:646:111"}]},"contents":"{\n { }\n function validator_revert_contract_GnosisSafeProxyFactory(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_GnosisSafeProxyFactory_$2804t_addresst_contract$_EIP4337Manager_$18804_fromMemory(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_GnosisSafeProxyFactory(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_GnosisSafeProxyFactory(value_1)\n value1 := value_1\n let value_2 := mload(add(headStart, 64))\n validator_revert_contract_GnosisSafeProxyFactory(value_2)\n value2 := value_2\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60e060405234801561001057600080fd5b50604051610b41380380610b4183398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c051610a2b61011660003960008181607101528181610449015281816104f001526105a201526000818160e7015281816101a3015261033801526000818161010e0152818161016701528181610287015261039d0152610a2b6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80638cb84e18116100505780638cb84e18146100cf578063ac7d146b146100e2578063c10f1a751461010957600080fd5b80630e8ac4881461006c5780635fbfb9cf146100bc575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100936100ca3660046106a4565b610130565b6100936100dd3660046106a4565b610238565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60008061013d8484610238565b905073ffffffffffffffffffffffffffffffffffffffff81163b801561016557509050610232565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631688f0b97f00000000000000000000000000000000000000000000000000000000000000006101cb886103cb565b876040518463ffffffff1660e01b81526004016101ea9392919061074a565b6020604051808303816000875af1158015610209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022d9190610789565b925050505b92915050565b600080610244846103cb565b9050600081805190602001208460405160200161026b929190918252602082015260400190565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166353e5d9356040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261033691908101906107dc565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1660405160200161037e9291906108a7565b60405160208183030381529060405290506103c18282805190602001207f0000000000000000000000000000000000000000000000000000000000000000610655565b9695505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610405576104056108c9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006001905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190610789565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152909150600090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd041593b00000000000000000000000000000000000000000000000000000000179052519091506105d590859085907f00000000000000000000000000000000000000000000000000000000000000009085908790600090819081906024016108f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb63e800d000000000000000000000000000000000000000000000000000000001790529695505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a157600080fd5b50565b600080604083850312156106b757600080fd5b82356106c28161067f565b946020939093013593505050565b60005b838110156106eb5781810151838201526020016106d3565b838111156106fa576000848401525b50505050565b600081518084526107188160208601602086016106d0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006107796060830185610700565b9050826040830152949350505050565b60006020828403121561079b57600080fd5b81516107a68161067f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156107ee57600080fd5b815167ffffffffffffffff8082111561080657600080fd5b818401915084601f83011261081a57600080fd5b81518181111561082c5761082c6107ad565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610872576108726107ad565b8160405282815287602084870101111561088b57600080fd5b61089c8360208301602088016106d0565b979650505050505050565b600083516108b98184602088016106d0565b9190910191825250602001919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6101008082528951908201819052600090610120830190602090818d01845b8281101561094957815173ffffffffffffffffffffffffffffffffffffffff1685529383019390830190600101610917565b50505083018a905273ffffffffffffffffffffffffffffffffffffffff89166040840152828103606084015261097f8189610700565b9150506109a4608083018773ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff851660a08301528360c08301526109e860e083018473ffffffffffffffffffffffffffffffffffffffff169052565b999850505050505050505056fea2646970667358221220d702dd3ba1446cc9da2281ce076cded964571ce1226545f210197b03129710c864736f6c634300080f0033","opcodes":"PUSH1 0xE0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xB41 CODESIZE SUB DUP1 PUSH2 0xB41 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x64 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x80 MSTORE SWAP1 DUP3 AND PUSH1 0xA0 MSTORE AND PUSH1 0xC0 MSTORE PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x84 DUP2 PUSH2 0x4C JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x95 DUP2 PUSH2 0x4C JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xA6 DUP2 PUSH2 0x4C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0xA2B PUSH2 0x116 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH1 0x71 ADD MSTORE DUP2 DUP2 PUSH2 0x449 ADD MSTORE DUP2 DUP2 PUSH2 0x4F0 ADD MSTORE PUSH2 0x5A2 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH1 0xE7 ADD MSTORE DUP2 DUP2 PUSH2 0x1A3 ADD MSTORE PUSH2 0x338 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x10E ADD MSTORE DUP2 DUP2 PUSH2 0x167 ADD MSTORE DUP2 DUP2 PUSH2 0x287 ADD MSTORE PUSH2 0x39D ADD MSTORE PUSH2 0xA2B PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x67 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8CB84E18 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xCF JUMPI DUP1 PUSH4 0xAC7D146B EQ PUSH2 0xE2 JUMPI DUP1 PUSH4 0xC10F1A75 EQ PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xE8AC488 EQ PUSH2 0x6C JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0xBC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x93 PUSH2 0xCA CALLDATASIZE PUSH1 0x4 PUSH2 0x6A4 JUMP JUMPDEST PUSH2 0x130 JUMP JUMPDEST PUSH2 0x93 PUSH2 0xDD CALLDATASIZE PUSH1 0x4 PUSH2 0x6A4 JUMP JUMPDEST PUSH2 0x238 JUMP JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13D DUP5 DUP5 PUSH2 0x238 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0x165 JUMPI POP SWAP1 POP PUSH2 0x232 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x1688F0B9 PUSH32 0x0 PUSH2 0x1CB DUP9 PUSH2 0x3CB JUMP JUMPDEST DUP8 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x209 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x22D SWAP2 SWAP1 PUSH2 0x789 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x244 DUP5 PUSH2 0x3CB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x26B SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x53E5D935 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x336 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x7DC JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x37E SWAP3 SWAP2 SWAP1 PUSH2 0x8A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0x3C1 DUP3 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH32 0x0 PUSH2 0x655 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x405 JUMPI PUSH2 0x405 PUSH2 0x8C9 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x0 PUSH1 0x1 SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4D6 SWAP2 SWAP1 PUSH2 0x789 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD041593B00000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD SWAP1 SWAP2 POP PUSH2 0x5D5 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 DUP8 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x24 ADD PUSH2 0x8F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB63E800D00000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x6A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x6B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x6C2 DUP2 PUSH2 0x67F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6EB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6D3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x718 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x779 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x700 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x7A6 DUP2 PUSH2 0x67F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x806 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x81A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x82C JUMPI PUSH2 0x82C PUSH2 0x7AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x872 JUMPI PUSH2 0x872 PUSH2 0x7AD JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x88B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x89C DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x6D0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x8B9 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x6D0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x100 DUP1 DUP3 MSTORE DUP10 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x120 DUP4 ADD SWAP1 PUSH1 0x20 SWAP1 DUP2 DUP14 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x949 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 MSTORE SWAP4 DUP4 ADD SWAP4 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x917 JUMP JUMPDEST POP POP POP DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x40 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x97F DUP2 DUP10 PUSH2 0x700 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x9A4 PUSH1 0x80 DUP4 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0xA0 DUP4 ADD MSTORE DUP4 PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x9E8 PUSH1 0xE0 DUP4 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD7 MUL 0xDD EXTCODESIZE LOG1 DIFFICULTY PUSH13 0xC9DA2281CE076CDED964571CE1 0x22 PUSH6 0x45F210197B03 SLT SWAP8 LT 0xC8 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"319:2139:89:-:0;;;515:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;631:28:89;;;;;669:30;;;;;709:32;;;319:2139;;14:155:111;-1:-1:-1;;;;;113:31:111;;103:42;;93:70;;159:1;156;149:12;93:70;14:155;:::o;174:646::-;317:6;325;333;386:2;374:9;365:7;361:23;357:32;354:52;;;402:1;399;392:12;354:52;434:9;428:16;453:55;502:5;453:55;:::i;:::-;577:2;562:18;;556:25;527:5;;-1:-1:-1;590:57:111;556:25;590:57;:::i;:::-;718:2;703:18;;697:25;666:7;;-1:-1:-1;731:57:111;697:25;731:57;:::i;:::-;807:7;797:17;;;174:646;;;;;:::o;:::-;319:2139:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@computeAddress_5231":{"entryPoint":1621,"id":5231,"parameterSlots":3,"returnSlots":1},"@createAccount_18884":{"entryPoint":304,"id":18884,"parameterSlots":2,"returnSlots":1},"@eip4337Manager_18818":{"entryPoint":null,"id":18818,"parameterSlots":0,"returnSlots":0},"@getAddress_19013":{"entryPoint":568,"id":19013,"parameterSlots":2,"returnSlots":1},"@getInitializer_18953":{"entryPoint":971,"id":18953,"parameterSlots":1,"returnSlots":1},"@proxyFactory_18813":{"entryPoint":null,"id":18813,"parameterSlots":0,"returnSlots":0},"@safeSingleton_18815":{"entryPoint":null,"id":18815,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_address_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":1700,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bytes_memory_ptr_fromMemory":{"entryPoint":2012,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_GnosisSafeProxy_$2557_fromMemory":{"entryPoint":1929,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes":{"entryPoint":1792,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed":{"entryPoint":2215,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":1866,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_rational_0_by_1_t_address_payable__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_uint256_t_address_payable__fromStack_reversed":{"entryPoint":2296,"id":null,"parameterSlots":9,"returnSlots":1},"abi_encode_tuple_t_contract$_EIP4337Manager_$18804__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_GnosisSafeProxyFactory_$2804__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":1744,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x32":{"entryPoint":2249,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":1965,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":1663,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:6196:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"139:125:111","statements":[{"nodeType":"YulAssignment","src":"149:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"161:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"172:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"157:3:111"},"nodeType":"YulFunctionCall","src":"157:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"149:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"191:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"206:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"214:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"202:3:111"},"nodeType":"YulFunctionCall","src":"202:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"184:6:111"},"nodeType":"YulFunctionCall","src":"184:74:111"},"nodeType":"YulExpressionStatement","src":"184:74:111"}]},"name":"abi_encode_tuple_t_contract$_EIP4337Manager_$18804__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"108:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"119:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"130:4:111","type":""}],"src":"14:250:111"},{"body":{"nodeType":"YulBlock","src":"314:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"401:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"410:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"413:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"403:6:111"},"nodeType":"YulFunctionCall","src":"403:12:111"},"nodeType":"YulExpressionStatement","src":"403:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"337:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"348:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"355:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"344:3:111"},"nodeType":"YulFunctionCall","src":"344:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"334:2:111"},"nodeType":"YulFunctionCall","src":"334:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"327:6:111"},"nodeType":"YulFunctionCall","src":"327:73:111"},"nodeType":"YulIf","src":"324:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"303:5:111","type":""}],"src":"269:154:111"},{"body":{"nodeType":"YulBlock","src":"515:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"561:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"570:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"573:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"563:6:111"},"nodeType":"YulFunctionCall","src":"563:12:111"},"nodeType":"YulExpressionStatement","src":"563:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"536:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"545:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"532:3:111"},"nodeType":"YulFunctionCall","src":"532:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"557:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"528:3:111"},"nodeType":"YulFunctionCall","src":"528:32:111"},"nodeType":"YulIf","src":"525:52:111"},{"nodeType":"YulVariableDeclaration","src":"586:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"612:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"599:12:111"},"nodeType":"YulFunctionCall","src":"599:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"590:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"656:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"631:24:111"},"nodeType":"YulFunctionCall","src":"631:31:111"},"nodeType":"YulExpressionStatement","src":"631:31:111"},{"nodeType":"YulAssignment","src":"671:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"681:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"671:6:111"}]},{"nodeType":"YulAssignment","src":"695:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"722:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"733:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"718:3:111"},"nodeType":"YulFunctionCall","src":"718:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"705:12:111"},"nodeType":"YulFunctionCall","src":"705:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"695:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"473:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"484:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"496:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"504:6:111","type":""}],"src":"428:315:111"},{"body":{"nodeType":"YulBlock","src":"792:83:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"809:3:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"818:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"825:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"814:3:111"},"nodeType":"YulFunctionCall","src":"814:54:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"802:6:111"},"nodeType":"YulFunctionCall","src":"802:67:111"},"nodeType":"YulExpressionStatement","src":"802:67:111"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"776:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"783:3:111","type":""}],"src":"748:127:111"},{"body":{"nodeType":"YulBlock","src":"981:125:111","statements":[{"nodeType":"YulAssignment","src":"991:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1003:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1014:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"999:3:111"},"nodeType":"YulFunctionCall","src":"999:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"991:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1033:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1048:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1056:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1044:3:111"},"nodeType":"YulFunctionCall","src":"1044:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1026:6:111"},"nodeType":"YulFunctionCall","src":"1026:74:111"},"nodeType":"YulExpressionStatement","src":"1026:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"950:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"961:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"972:4:111","type":""}],"src":"880:226:111"},{"body":{"nodeType":"YulBlock","src":"1243:125:111","statements":[{"nodeType":"YulAssignment","src":"1253:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1276:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1261:3:111"},"nodeType":"YulFunctionCall","src":"1261:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1253:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1295:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1310:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1318:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1306:3:111"},"nodeType":"YulFunctionCall","src":"1306:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1288:6:111"},"nodeType":"YulFunctionCall","src":"1288:74:111"},"nodeType":"YulExpressionStatement","src":"1288:74:111"}]},"name":"abi_encode_tuple_t_contract$_GnosisSafeProxyFactory_$2804__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1212:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1223:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1234:4:111","type":""}],"src":"1111:257:111"},{"body":{"nodeType":"YulBlock","src":"1426:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1436:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1445:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1440:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1505:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1530:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1535:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1526:3:111"},"nodeType":"YulFunctionCall","src":"1526:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1549:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1554:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1545:3:111"},"nodeType":"YulFunctionCall","src":"1545:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1539:5:111"},"nodeType":"YulFunctionCall","src":"1539:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1519:6:111"},"nodeType":"YulFunctionCall","src":"1519:39:111"},"nodeType":"YulExpressionStatement","src":"1519:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1466:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1469:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1463:2:111"},"nodeType":"YulFunctionCall","src":"1463:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1477:19:111","statements":[{"nodeType":"YulAssignment","src":"1479:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1488:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1491:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1484:3:111"},"nodeType":"YulFunctionCall","src":"1484:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1479:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1459:3:111","statements":[]},"src":"1455:113:111"},{"body":{"nodeType":"YulBlock","src":"1594:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1607:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1612:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1603:3:111"},"nodeType":"YulFunctionCall","src":"1603:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"1621:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1596:6:111"},"nodeType":"YulFunctionCall","src":"1596:27:111"},"nodeType":"YulExpressionStatement","src":"1596:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1583:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1586:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1580:2:111"},"nodeType":"YulFunctionCall","src":"1580:13:111"},"nodeType":"YulIf","src":"1577:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"1404:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"1409:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1414:6:111","type":""}],"src":"1373:258:111"},{"body":{"nodeType":"YulBlock","src":"1685:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1695:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1715:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1709:5:111"},"nodeType":"YulFunctionCall","src":"1709:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1699:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1737:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1742:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1730:6:111"},"nodeType":"YulFunctionCall","src":"1730:19:111"},"nodeType":"YulExpressionStatement","src":"1730:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1784:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1791:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1780:3:111"},"nodeType":"YulFunctionCall","src":"1780:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1802:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1807:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1798:3:111"},"nodeType":"YulFunctionCall","src":"1798:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"1814:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1758:21:111"},"nodeType":"YulFunctionCall","src":"1758:63:111"},"nodeType":"YulExpressionStatement","src":"1758:63:111"},{"nodeType":"YulAssignment","src":"1830:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1845:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1858:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1866:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1854:3:111"},"nodeType":"YulFunctionCall","src":"1854:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1871:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1850:3:111"},"nodeType":"YulFunctionCall","src":"1850:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1841:3:111"},"nodeType":"YulFunctionCall","src":"1841:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"1941:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1837:3:111"},"nodeType":"YulFunctionCall","src":"1837:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"1830:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"1662:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"1669:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"1677:3:111","type":""}],"src":"1636:316:111"},{"body":{"nodeType":"YulBlock","src":"2132:233:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2149:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2164:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2172:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2160:3:111"},"nodeType":"YulFunctionCall","src":"2160:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2142:6:111"},"nodeType":"YulFunctionCall","src":"2142:74:111"},"nodeType":"YulExpressionStatement","src":"2142:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2236:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2247:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2232:3:111"},"nodeType":"YulFunctionCall","src":"2232:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2252:2:111","type":"","value":"96"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2225:6:111"},"nodeType":"YulFunctionCall","src":"2225:30:111"},"nodeType":"YulExpressionStatement","src":"2225:30:111"},{"nodeType":"YulAssignment","src":"2264:52:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2289:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2301:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2312:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2297:3:111"},"nodeType":"YulFunctionCall","src":"2297:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"2272:16:111"},"nodeType":"YulFunctionCall","src":"2272:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2264:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2336:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2347:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2332:3:111"},"nodeType":"YulFunctionCall","src":"2332:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2352:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2325:6:111"},"nodeType":"YulFunctionCall","src":"2325:34:111"},"nodeType":"YulExpressionStatement","src":"2325:34:111"}]},"name":"abi_encode_tuple_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2085:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2096:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2104:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2112:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2123:4:111","type":""}],"src":"1957:408:111"},{"body":{"nodeType":"YulBlock","src":"2475:170:111","statements":[{"body":{"nodeType":"YulBlock","src":"2521:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2530:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2533:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2523:6:111"},"nodeType":"YulFunctionCall","src":"2523:12:111"},"nodeType":"YulExpressionStatement","src":"2523:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2496:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2505:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2492:3:111"},"nodeType":"YulFunctionCall","src":"2492:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2517:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2488:3:111"},"nodeType":"YulFunctionCall","src":"2488:32:111"},"nodeType":"YulIf","src":"2485:52:111"},{"nodeType":"YulVariableDeclaration","src":"2546:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2565:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2559:5:111"},"nodeType":"YulFunctionCall","src":"2559:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2550:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2609:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2584:24:111"},"nodeType":"YulFunctionCall","src":"2584:31:111"},"nodeType":"YulExpressionStatement","src":"2584:31:111"},{"nodeType":"YulAssignment","src":"2624:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2634:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2624:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_GnosisSafeProxy_$2557_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2441:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2452:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2464:6:111","type":""}],"src":"2370:275:111"},{"body":{"nodeType":"YulBlock","src":"2797:100:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2814:3:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2819:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2807:6:111"},"nodeType":"YulFunctionCall","src":"2807:19:111"},"nodeType":"YulExpressionStatement","src":"2807:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2846:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2851:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2842:3:111"},"nodeType":"YulFunctionCall","src":"2842:12:111"},{"name":"value1","nodeType":"YulIdentifier","src":"2856:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2835:6:111"},"nodeType":"YulFunctionCall","src":"2835:28:111"},"nodeType":"YulExpressionStatement","src":"2835:28:111"},{"nodeType":"YulAssignment","src":"2872:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2883:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2888:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2879:3:111"},"nodeType":"YulFunctionCall","src":"2879:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"2872:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"2765:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2770:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2778:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"2789:3:111","type":""}],"src":"2650:247:111"},{"body":{"nodeType":"YulBlock","src":"2934:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2951:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2954:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2944:6:111"},"nodeType":"YulFunctionCall","src":"2944:88:111"},"nodeType":"YulExpressionStatement","src":"2944:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3048:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3051:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3041:6:111"},"nodeType":"YulFunctionCall","src":"3041:15:111"},"nodeType":"YulExpressionStatement","src":"3041:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3072:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3075:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3065:6:111"},"nodeType":"YulFunctionCall","src":"3065:15:111"},"nodeType":"YulExpressionStatement","src":"3065:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"2902:184:111"},{"body":{"nodeType":"YulBlock","src":"3181:852:111","statements":[{"body":{"nodeType":"YulBlock","src":"3227:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3236:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3239:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3229:6:111"},"nodeType":"YulFunctionCall","src":"3229:12:111"},"nodeType":"YulExpressionStatement","src":"3229:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3202:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3211:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3198:3:111"},"nodeType":"YulFunctionCall","src":"3198:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3223:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3194:3:111"},"nodeType":"YulFunctionCall","src":"3194:32:111"},"nodeType":"YulIf","src":"3191:52:111"},{"nodeType":"YulVariableDeclaration","src":"3252:30:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3272:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3266:5:111"},"nodeType":"YulFunctionCall","src":"3266:16:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3256:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3291:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3301:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3295:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3346:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3355:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3358:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3348:6:111"},"nodeType":"YulFunctionCall","src":"3348:12:111"},"nodeType":"YulExpressionStatement","src":"3348:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3334:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3342:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3331:2:111"},"nodeType":"YulFunctionCall","src":"3331:14:111"},"nodeType":"YulIf","src":"3328:34:111"},{"nodeType":"YulVariableDeclaration","src":"3371:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3385:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3396:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3381:3:111"},"nodeType":"YulFunctionCall","src":"3381:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3375:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3453:6:111"},"nodeType":"YulFunctionCall","src":"3453:12:111"},"nodeType":"YulExpressionStatement","src":"3453:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3430:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3434:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3426:3:111"},"nodeType":"YulFunctionCall","src":"3426:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3441:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3422:3:111"},"nodeType":"YulFunctionCall","src":"3422:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3415:6:111"},"nodeType":"YulFunctionCall","src":"3415:35:111"},"nodeType":"YulIf","src":"3412:55:111"},{"nodeType":"YulVariableDeclaration","src":"3476:19:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3492:2:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3486:5:111"},"nodeType":"YulFunctionCall","src":"3486:9:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"3480:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3518:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3520:16:111"},"nodeType":"YulFunctionCall","src":"3520:18:111"},"nodeType":"YulExpressionStatement","src":"3520:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3510:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3514:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3507:2:111"},"nodeType":"YulFunctionCall","src":"3507:10:111"},"nodeType":"YulIf","src":"3504:36:111"},{"nodeType":"YulVariableDeclaration","src":"3549:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3559:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"3553:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3634:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3654:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3648:5:111"},"nodeType":"YulFunctionCall","src":"3648:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"3638:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3666:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3688:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3712:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3716:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3708:3:111"},"nodeType":"YulFunctionCall","src":"3708:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"3723:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3704:3:111"},"nodeType":"YulFunctionCall","src":"3704:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"3728:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3700:3:111"},"nodeType":"YulFunctionCall","src":"3700:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"3733:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3696:3:111"},"nodeType":"YulFunctionCall","src":"3696:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3684:3:111"},"nodeType":"YulFunctionCall","src":"3684:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"3670:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3796:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"3798:16:111"},"nodeType":"YulFunctionCall","src":"3798:18:111"},"nodeType":"YulExpressionStatement","src":"3798:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3755:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3767:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3752:2:111"},"nodeType":"YulFunctionCall","src":"3752:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3775:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"3787:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3772:2:111"},"nodeType":"YulFunctionCall","src":"3772:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"3749:2:111"},"nodeType":"YulFunctionCall","src":"3749:46:111"},"nodeType":"YulIf","src":"3746:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3834:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"3838:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3827:6:111"},"nodeType":"YulFunctionCall","src":"3827:22:111"},"nodeType":"YulExpressionStatement","src":"3827:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3865:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"3873:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3858:6:111"},"nodeType":"YulFunctionCall","src":"3858:18:111"},"nodeType":"YulExpressionStatement","src":"3858:18:111"},{"body":{"nodeType":"YulBlock","src":"3922:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3931:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3934:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3924:6:111"},"nodeType":"YulFunctionCall","src":"3924:12:111"},"nodeType":"YulExpressionStatement","src":"3924:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3899:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"3903:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3895:3:111"},"nodeType":"YulFunctionCall","src":"3895:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"3908:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3891:3:111"},"nodeType":"YulFunctionCall","src":"3891:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3913:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3888:2:111"},"nodeType":"YulFunctionCall","src":"3888:33:111"},"nodeType":"YulIf","src":"3885:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3973:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3977:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3969:3:111"},"nodeType":"YulFunctionCall","src":"3969:11:111"},{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"3986:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3994:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3982:3:111"},"nodeType":"YulFunctionCall","src":"3982:15:111"},{"name":"_3","nodeType":"YulIdentifier","src":"3999:2:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"3947:21:111"},"nodeType":"YulFunctionCall","src":"3947:55:111"},"nodeType":"YulExpressionStatement","src":"3947:55:111"},{"nodeType":"YulAssignment","src":"4011:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"4021:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4011:6:111"}]}]},"name":"abi_decode_tuple_t_bytes_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3147:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3158:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3170:6:111","type":""}],"src":"3091:942:111"},{"body":{"nodeType":"YulBlock","src":"4203:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4213:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4233:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4227:5:111"},"nodeType":"YulFunctionCall","src":"4227:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"4217:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4275:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4283:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4271:3:111"},"nodeType":"YulFunctionCall","src":"4271:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"4290:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4295:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"4249:21:111"},"nodeType":"YulFunctionCall","src":"4249:53:111"},"nodeType":"YulExpressionStatement","src":"4249:53:111"},{"nodeType":"YulVariableDeclaration","src":"4311:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"4328:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"4333:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4324:3:111"},"nodeType":"YulFunctionCall","src":"4324:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"4315:5:111","type":""}]},{"expression":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"4356:5:111"},{"name":"value1","nodeType":"YulIdentifier","src":"4363:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4349:6:111"},"nodeType":"YulFunctionCall","src":"4349:21:111"},"nodeType":"YulExpressionStatement","src":"4349:21:111"},{"nodeType":"YulAssignment","src":"4379:23:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"4390:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4397:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4386:3:111"},"nodeType":"YulFunctionCall","src":"4386:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"4379:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"4171:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4176:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4184:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"4195:3:111","type":""}],"src":"4038:370:111"},{"body":{"nodeType":"YulBlock","src":"4445:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4462:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4465:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4455:6:111"},"nodeType":"YulFunctionCall","src":"4455:88:111"},"nodeType":"YulExpressionStatement","src":"4455:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4559:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4562:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4552:6:111"},"nodeType":"YulFunctionCall","src":"4552:15:111"},"nodeType":"YulExpressionStatement","src":"4552:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4583:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4586:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4576:6:111"},"nodeType":"YulFunctionCall","src":"4576:15:111"},"nodeType":"YulExpressionStatement","src":"4576:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"4413:184:111"},{"body":{"nodeType":"YulBlock","src":"4683:170:111","statements":[{"body":{"nodeType":"YulBlock","src":"4729:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4738:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4741:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4731:6:111"},"nodeType":"YulFunctionCall","src":"4731:12:111"},"nodeType":"YulExpressionStatement","src":"4731:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4704:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4713:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4700:3:111"},"nodeType":"YulFunctionCall","src":"4700:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4725:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4696:3:111"},"nodeType":"YulFunctionCall","src":"4696:32:111"},"nodeType":"YulIf","src":"4693:52:111"},{"nodeType":"YulVariableDeclaration","src":"4754:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4773:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4767:5:111"},"nodeType":"YulFunctionCall","src":"4767:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4758:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4817:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4792:24:111"},"nodeType":"YulFunctionCall","src":"4792:31:111"},"nodeType":"YulExpressionStatement","src":"4792:31:111"},{"nodeType":"YulAssignment","src":"4832:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4842:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4832:6:111"}]}]},"name":"abi_decode_tuple_t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4649:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4660:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4672:6:111","type":""}],"src":"4602:251:111"},{"body":{"nodeType":"YulBlock","src":"5247:947:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5257:13:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5267:3:111","type":"","value":"256"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5261:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5279:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5297:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5308:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5293:3:111"},"nodeType":"YulFunctionCall","src":"5293:18:111"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"5283:6:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5327:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5338:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5320:6:111"},"nodeType":"YulFunctionCall","src":"5320:21:111"},"nodeType":"YulExpressionStatement","src":"5320:21:111"},{"nodeType":"YulVariableDeclaration","src":"5350:17:111","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"5361:6:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"5354:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5376:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5396:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5390:5:111"},"nodeType":"YulFunctionCall","src":"5390:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5380:6:111","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"5419:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"5427:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5412:6:111"},"nodeType":"YulFunctionCall","src":"5412:22:111"},"nodeType":"YulExpressionStatement","src":"5412:22:111"},{"nodeType":"YulAssignment","src":"5443:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5454:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5465:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5450:3:111"},"nodeType":"YulFunctionCall","src":"5450:19:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5443:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"5478:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5488:4:111","type":"","value":"0x20"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"5482:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5501:29:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5519:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"5527:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5515:3:111"},"nodeType":"YulFunctionCall","src":"5515:15:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"5505:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5539:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5548:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5543:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5607:169:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5628:3:111"},{"arguments":[{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5643:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5637:5:111"},"nodeType":"YulFunctionCall","src":"5637:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"5652:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5633:3:111"},"nodeType":"YulFunctionCall","src":"5633:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5621:6:111"},"nodeType":"YulFunctionCall","src":"5621:75:111"},"nodeType":"YulExpressionStatement","src":"5621:75:111"},{"nodeType":"YulAssignment","src":"5709:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5720:3:111"},{"name":"_2","nodeType":"YulIdentifier","src":"5725:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5716:3:111"},"nodeType":"YulFunctionCall","src":"5716:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5709:3:111"}]},{"nodeType":"YulAssignment","src":"5741:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5755:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"5763:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5751:3:111"},"nodeType":"YulFunctionCall","src":"5751:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5741:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5569:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5572:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5566:2:111"},"nodeType":"YulFunctionCall","src":"5566:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5580:18:111","statements":[{"nodeType":"YulAssignment","src":"5582:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5591:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"5594:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5587:3:111"},"nodeType":"YulFunctionCall","src":"5587:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5582:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"5562:3:111","statements":[]},"src":"5558:218:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5796:9:111"},{"name":"_2","nodeType":"YulIdentifier","src":"5807:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5792:3:111"},"nodeType":"YulFunctionCall","src":"5792:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"5812:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5785:6:111"},"nodeType":"YulFunctionCall","src":"5785:34:111"},"nodeType":"YulExpressionStatement","src":"5785:34:111"},{"expression":{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"5847:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5859:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5870:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5855:3:111"},"nodeType":"YulFunctionCall","src":"5855:18:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"5828:18:111"},"nodeType":"YulFunctionCall","src":"5828:46:111"},"nodeType":"YulExpressionStatement","src":"5828:46:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5894:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5905:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5890:3:111"},"nodeType":"YulFunctionCall","src":"5890:18:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5914:3:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5919:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5910:3:111"},"nodeType":"YulFunctionCall","src":"5910:19:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5883:6:111"},"nodeType":"YulFunctionCall","src":"5883:47:111"},"nodeType":"YulExpressionStatement","src":"5883:47:111"},{"nodeType":"YulAssignment","src":"5939:37:111","value":{"arguments":[{"name":"value3","nodeType":"YulIdentifier","src":"5964:6:111"},{"name":"pos","nodeType":"YulIdentifier","src":"5972:3:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"5947:16:111"},"nodeType":"YulFunctionCall","src":"5947:29:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5939:4:111"}]},{"expression":{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"6004:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6016:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6027:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6012:3:111"},"nodeType":"YulFunctionCall","src":"6012:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"5985:18:111"},"nodeType":"YulFunctionCall","src":"5985:47:111"},"nodeType":"YulExpressionStatement","src":"5985:47:111"},{"expression":{"arguments":[{"name":"value5","nodeType":"YulIdentifier","src":"6060:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6072:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6083:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6068:3:111"},"nodeType":"YulFunctionCall","src":"6068:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"6041:18:111"},"nodeType":"YulFunctionCall","src":"6041:47:111"},"nodeType":"YulExpressionStatement","src":"6041:47:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6108:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6119:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6104:3:111"},"nodeType":"YulFunctionCall","src":"6104:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"6125:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6097:6:111"},"nodeType":"YulFunctionCall","src":"6097:35:111"},"nodeType":"YulExpressionStatement","src":"6097:35:111"},{"expression":{"arguments":[{"name":"value7","nodeType":"YulIdentifier","src":"6160:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6183:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6168:3:111"},"nodeType":"YulFunctionCall","src":"6168:19:111"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"6141:18:111"},"nodeType":"YulFunctionCall","src":"6141:47:111"},"nodeType":"YulExpressionStatement","src":"6141:47:111"}]},"name":"abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_rational_0_by_1_t_address_payable__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_uint256_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5160:9:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"5171:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"5179:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"5187:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"5195:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"5203:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5211:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5219:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5227:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5238:4:111","type":""}],"src":"4858:1336:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_contract$_EIP4337Manager_$18804__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_GnosisSafeProxyFactory_$2804__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr_t_uint256__to_t_address_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), 96)\n tail := abi_encode_bytes(value1, add(headStart, 96))\n mstore(add(headStart, 64), value2)\n }\n function abi_decode_tuple_t_contract$_GnosisSafeProxy_$2557_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_packed_t_bytes32_t_uint256__to_t_bytes32_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, value0)\n mstore(add(pos, 32), value1)\n end := add(pos, 64)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_bytes_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := mload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := mload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n copy_memory_to_memory(add(_2, 32), add(memPtr, 32), _3)\n value0 := memPtr\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n mstore(end_1, value1)\n end := add(end_1, 0x20)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_rational_0_by_1_t_address_payable__to_t_array$_t_address_$dyn_memory_ptr_t_uint256_t_address_t_bytes_memory_ptr_t_address_t_address_t_uint256_t_address_payable__fromStack_reversed(headStart, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n let _1 := 256\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 288)\n let _2 := 0x20\n let srcPtr := add(value0, _2)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffffffffffffffffffffffffffffffffffff))\n pos := add(pos, _2)\n srcPtr := add(srcPtr, _2)\n }\n mstore(add(headStart, _2), value1)\n abi_encode_address(value2, add(headStart, 64))\n mstore(add(headStart, 96), sub(pos, headStart))\n tail := abi_encode_bytes(value3, pos)\n abi_encode_address(value4, add(headStart, 128))\n abi_encode_address(value5, add(headStart, 160))\n mstore(add(headStart, 192), value6)\n abi_encode_address(value7, add(headStart, 224))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"18813":[{"length":32,"start":270},{"length":32,"start":359},{"length":32,"start":647},{"length":32,"start":925}],"18815":[{"length":32,"start":231},{"length":32,"start":419},{"length":32,"start":824}],"18818":[{"length":32,"start":113},{"length":32,"start":1097},{"length":32,"start":1264},{"length":32,"start":1442}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100675760003560e01c80638cb84e18116100505780638cb84e18146100cf578063ac7d146b146100e2578063c10f1a751461010957600080fd5b80630e8ac4881461006c5780635fbfb9cf146100bc575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100936100ca3660046106a4565b610130565b6100936100dd3660046106a4565b610238565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60008061013d8484610238565b905073ffffffffffffffffffffffffffffffffffffffff81163b801561016557509050610232565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631688f0b97f00000000000000000000000000000000000000000000000000000000000000006101cb886103cb565b876040518463ffffffff1660e01b81526004016101ea9392919061074a565b6020604051808303816000875af1158015610209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022d9190610789565b925050505b92915050565b600080610244846103cb565b9050600081805190602001208460405160200161026b929190918252602082015260400190565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166353e5d9356040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261033691908101906107dc565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1660405160200161037e9291906108a7565b60405160208183030381529060405290506103c18282805190602001207f0000000000000000000000000000000000000000000000000000000000000000610655565b9695505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610405576104056108c9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006001905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370b8a01d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190610789565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152909150600090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd041593b00000000000000000000000000000000000000000000000000000000179052519091506105d590859085907f00000000000000000000000000000000000000000000000000000000000000009085908790600090819081906024016108f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb63e800d000000000000000000000000000000000000000000000000000000001790529695505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a157600080fd5b50565b600080604083850312156106b757600080fd5b82356106c28161067f565b946020939093013593505050565b60005b838110156106eb5781810151838201526020016106d3565b838111156106fa576000848401525b50505050565b600081518084526107188160208601602086016106d0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006107796060830185610700565b9050826040830152949350505050565b60006020828403121561079b57600080fd5b81516107a68161067f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156107ee57600080fd5b815167ffffffffffffffff8082111561080657600080fd5b818401915084601f83011261081a57600080fd5b81518181111561082c5761082c6107ad565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610872576108726107ad565b8160405282815287602084870101111561088b57600080fd5b61089c8360208301602088016106d0565b979650505050505050565b600083516108b98184602088016106d0565b9190910191825250602001919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6101008082528951908201819052600090610120830190602090818d01845b8281101561094957815173ffffffffffffffffffffffffffffffffffffffff1685529383019390830190600101610917565b50505083018a905273ffffffffffffffffffffffffffffffffffffffff89166040840152828103606084015261097f8189610700565b9150506109a4608083018773ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff851660a08301528360c08301526109e860e083018473ffffffffffffffffffffffffffffffffffffffff169052565b999850505050505050505056fea2646970667358221220d702dd3ba1446cc9da2281ce076cded964571ce1226545f210197b03129710c864736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x67 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8CB84E18 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xCF JUMPI DUP1 PUSH4 0xAC7D146B EQ PUSH2 0xE2 JUMPI DUP1 PUSH4 0xC10F1A75 EQ PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xE8AC488 EQ PUSH2 0x6C JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0xBC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x93 PUSH2 0xCA CALLDATASIZE PUSH1 0x4 PUSH2 0x6A4 JUMP JUMPDEST PUSH2 0x130 JUMP JUMPDEST PUSH2 0x93 PUSH2 0xDD CALLDATASIZE PUSH1 0x4 PUSH2 0x6A4 JUMP JUMPDEST PUSH2 0x238 JUMP JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x93 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13D DUP5 DUP5 PUSH2 0x238 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0x165 JUMPI POP SWAP1 POP PUSH2 0x232 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x1688F0B9 PUSH32 0x0 PUSH2 0x1CB DUP9 PUSH2 0x3CB JUMP JUMPDEST DUP8 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x209 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x22D SWAP2 SWAP1 PUSH2 0x789 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x244 DUP5 PUSH2 0x3CB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x26B SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x53E5D935 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x336 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x7DC JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x37E SWAP3 SWAP2 SWAP1 PUSH2 0x8A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0x3C1 DUP3 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH32 0x0 PUSH2 0x655 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x405 JUMPI PUSH2 0x405 PUSH2 0x8C9 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x0 PUSH1 0x1 SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70B8A01D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4D6 SWAP2 SWAP1 PUSH2 0x789 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD041593B00000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD SWAP1 SWAP2 POP PUSH2 0x5D5 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 DUP8 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x24 ADD PUSH2 0x8F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB63E800D00000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x6A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x6B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x6C2 DUP2 PUSH2 0x67F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6EB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6D3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x718 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x779 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x700 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x7A6 DUP2 PUSH2 0x67F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x806 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x81A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x82C JUMPI PUSH2 0x82C PUSH2 0x7AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x872 JUMPI PUSH2 0x872 PUSH2 0x7AD JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x88B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x89C DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x6D0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x8B9 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x6D0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x100 DUP1 DUP3 MSTORE DUP10 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x120 DUP4 ADD SWAP1 PUSH1 0x20 SWAP1 DUP2 DUP14 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x949 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 MSTORE SWAP4 DUP4 ADD SWAP4 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x917 JUMP JUMPDEST POP POP POP DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x40 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x97F DUP2 DUP10 PUSH2 0x700 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x9A4 PUSH1 0x80 DUP4 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0xA0 DUP4 ADD MSTORE DUP4 PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x9E8 PUSH1 0xE0 DUP4 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD7 MUL 0xDD EXTCODESIZE LOG1 DIFFICULTY PUSH13 0xC9DA2281CE076CDED964571CE1 0x22 PUSH6 0x45F210197B03 SLT SWAP8 LT 0xC8 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"319:2139:89:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;462:46;;;;;;;;214:42:111;202:55;;;184:74;;172:2;157:18;462:46:89;;;;;;;754:356;;;;;;:::i;:::-;;:::i;1958:498::-;;;;;;:::i;:::-;;:::i;418:38::-;;;;;360:52;;;;;754:356;821:7;840:12;855:23;866:5;873:4;855:10;:23::i;:::-;840:38;-1:-1:-1;904:16:89;;;;934:12;;930:54;;-1:-1:-1;969:4:89;-1:-1:-1;962:11:89;;930:54;1008:12;:33;;;1059:13;1074:21;1089:5;1074:14;:21::i;:::-;1097:4;1008:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;993:110;;;;754:356;;;;;:::o;1958:498::-;2027:7;2046:24;2073:21;2088:5;2073:14;:21::i;:::-;2046:48;;2147:13;2200:11;2190:22;;;;;;2214:4;2173:46;;;;;;;;2807:19:111;;;2851:2;2842:12;;2835:28;2888:2;2879:12;;2650:247;2173:46:89;;;;;;;;;;;;;2163:57;;;;;;2147:73;;2230:27;2277:12;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2327:13;2311:31;;2260:83;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2230:113;;2360:89;2391:5;2409:14;2399:25;;;;;;2435:12;2360:22;:89::i;:::-;2353:96;1958:498;-1:-1:-1;;;;;;1958:498:89:o;1116:622::-;1228:16;;;1242:1;1228:16;;;;;;;;;1178:12;;1202:23;;1228:16;;;;;;;;;;;;-1:-1:-1;1228:16:89;1202:42;;1266:5;1254:6;1261:1;1254:9;;;;;;;;:::i;:::-;;;;;;:17;;;;;;;;;;;1281:14;1298:1;1281:18;;1309:23;1335:14;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1410:78;;214:42:111;1472:14:89;202:55:111;1410:78:89;;;184:74:111;1309:58:89;;-1:-1:-1;1378:29:89;;157:18:111;;1410:78:89;;;;;;;;;;;;;;;;;;;;;;;;1506:225;1410:78;;-1:-1:-1;1506:225:89;;1553:6;;1561:9;;1593:14;;1410:78;;1640:15;;-1:-1:-1;;;;;;1506:225:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;1116:622;-1:-1:-1;;;;;;1116:622:89:o;2207:1802:44:-;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:44:o;269:154:111:-;355:42;348:5;344:54;337:5;334:65;324:93;;413:1;410;403:12;324:93;269:154;:::o;428:315::-;496:6;504;557:2;545:9;536:7;532:23;528:32;525:52;;;573:1;570;563:12;525:52;612:9;599:23;631:31;656:5;631:31;:::i;:::-;681:5;733:2;718:18;;;;705:32;;-1:-1:-1;;;428:315:111:o;1373:258::-;1445:1;1455:113;1469:6;1466:1;1463:13;1455:113;;;1545:11;;;1539:18;1526:11;;;1519:39;1491:2;1484:10;1455:113;;;1586:6;1583:1;1580:13;1577:48;;;1621:1;1612:6;1607:3;1603:16;1596:27;1577:48;;1373:258;;;:::o;1636:316::-;1677:3;1715:5;1709:12;1742:6;1737:3;1730:19;1758:63;1814:6;1807:4;1802:3;1798:14;1791:4;1784:5;1780:16;1758:63;:::i;:::-;1866:2;1854:15;1871:66;1850:88;1841:98;;;;1941:4;1837:109;;1636:316;-1:-1:-1;;1636:316:111:o;1957:408::-;2172:42;2164:6;2160:55;2149:9;2142:74;2252:2;2247;2236:9;2232:18;2225:30;2123:4;2272:44;2312:2;2301:9;2297:18;2289:6;2272:44;:::i;:::-;2264:52;;2352:6;2347:2;2336:9;2332:18;2325:34;1957:408;;;;;;:::o;2370:275::-;2464:6;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2565:9;2559:16;2584:31;2609:5;2584:31;:::i;:::-;2634:5;2370:275;-1:-1:-1;;;2370:275:111:o;2902:184::-;2954:77;2951:1;2944:88;3051:4;3048:1;3041:15;3075:4;3072:1;3065:15;3091:942;3170:6;3223:2;3211:9;3202:7;3198:23;3194:32;3191:52;;;3239:1;3236;3229:12;3191:52;3272:9;3266:16;3301:18;3342:2;3334:6;3331:14;3328:34;;;3358:1;3355;3348:12;3328:34;3396:6;3385:9;3381:22;3371:32;;3441:7;3434:4;3430:2;3426:13;3422:27;3412:55;;3463:1;3460;3453:12;3412:55;3492:2;3486:9;3514:2;3510;3507:10;3504:36;;;3520:18;;:::i;:::-;3654:2;3648:9;3716:4;3708:13;;3559:66;3704:22;;;3728:2;3700:31;3696:40;3684:53;;;3752:18;;;3772:22;;;3749:46;3746:72;;;3798:18;;:::i;:::-;3838:10;3834:2;3827:22;3873:2;3865:6;3858:18;3913:7;3908:2;3903;3899;3895:11;3891:20;3888:33;3885:53;;;3934:1;3931;3924:12;3885:53;3947:55;3999:2;3994;3986:6;3982:15;3977:2;3973;3969:11;3947:55;:::i;:::-;4021:6;3091:942;-1:-1:-1;;;;;;;3091:942:111:o;4038:370::-;4195:3;4233:6;4227:13;4249:53;4295:6;4290:3;4283:4;4275:6;4271:17;4249:53;:::i;:::-;4324:16;;;;4349:21;;;-1:-1:-1;4397:4:111;4386:16;;4038:370;-1:-1:-1;4038:370:111:o;4413:184::-;4465:77;4462:1;4455:88;4562:4;4559:1;4552:15;4586:4;4583:1;4576:15;4858:1336;5267:3;5320:21;;;5390:13;;5293:18;;;5412:22;;;5238:4;;5465:3;5450:19;;;5488:4;;5515:15;;;5238:4;5558:218;5572:6;5569:1;5566:13;5558:218;;;5637:13;;5652:42;5633:62;5621:75;;5716:12;;;;5751:15;;;;5594:1;5587:9;5558:218;;;-1:-1:-1;;;5792:18:111;;5785:34;;;825:42;814:54;;5870:2;5855:18;;802:67;5919:9;5914:3;5910:19;5905:2;5894:9;5890:18;5883:47;5947:29;5972:3;5964:6;5947:29;:::i;:::-;5939:37;;;5985:47;6027:3;6016:9;6012:19;6004:6;825:42;814:54;802:67;;748:127;5985:47;825:42;814:54;;6083:3;6068:19;;802:67;6125:6;6119:3;6108:9;6104:19;6097:35;6141:47;6183:3;6172:9;6168:19;6160:6;825:42;814:54;802:67;;748:127;6141:47;4858:1336;;;;;;;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"520600","executionCost":"infinite","totalCost":"infinite"},"external":{"createAccount(address,uint256)":"infinite","eip4337Manager()":"infinite","getAddress(address,uint256)":"infinite","proxyFactory()":"infinite","safeSingleton()":"infinite"},"internal":{"getInitializer(address)":"infinite"}},"methodIdentifiers":{"createAccount(address,uint256)":"5fbfb9cf","eip4337Manager()":"0e8ac488","getAddress(address,uint256)":"8cb84e18","proxyFactory()":"c10f1a75","safeSingleton()":"ac7d146b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract GnosisSafeProxyFactory\",\"name\":\"_proxyFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_safeSingleton\",\"type\":\"address\"},{\"internalType\":\"contract EIP4337Manager\",\"name\":\"_eip4337Manager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip4337Manager\",\"outputs\":[{\"internalType\":\"contract EIP4337Manager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyFactory\",\"outputs\":[{\"internalType\":\"contract GnosisSafeProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"safeSingleton\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAddress(address,uint256)\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount() (uses the same \\\"create2 signature\\\" used by GnosisSafeProxyFactory.createProxyWithNonce)\"}},\"notice\":\"A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/gnosis/GnosisAccountFactory.sol\":\"GnosisSafeAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./base/ModuleManager.sol\\\";\\nimport \\\"./base/OwnerManager.sol\\\";\\nimport \\\"./base/FallbackManager.sol\\\";\\nimport \\\"./base/GuardManager.sol\\\";\\nimport \\\"./common/EtherPaymentFallback.sol\\\";\\nimport \\\"./common/Singleton.sol\\\";\\nimport \\\"./common/SignatureDecoder.sol\\\";\\nimport \\\"./common/SecuredTokenTransfer.sol\\\";\\nimport \\\"./common/StorageAccessible.sol\\\";\\nimport \\\"./interfaces/ISignatureValidator.sol\\\";\\nimport \\\"./external/GnosisSafeMath.sol\\\";\\n\\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafe is\\n EtherPaymentFallback,\\n Singleton,\\n ModuleManager,\\n OwnerManager,\\n SignatureDecoder,\\n SecuredTokenTransfer,\\n ISignatureValidatorConstants,\\n FallbackManager,\\n StorageAccessible,\\n GuardManager\\n{\\n using GnosisSafeMath for uint256;\\n\\n string public constant VERSION = \\\"1.3.0\\\";\\n\\n // keccak256(\\n // \\\"EIP712Domain(uint256 chainId,address verifyingContract)\\\"\\n // );\\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\\n\\n // keccak256(\\n // \\\"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\\\"\\n // );\\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\\n\\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\\n event SignMsg(bytes32 indexed msgHash);\\n event ExecutionFailure(bytes32 txHash, uint256 payment);\\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\\n\\n uint256 public nonce;\\n bytes32 private _deprecatedDomainSeparator;\\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\\n mapping(bytes32 => uint256) public signedMessages;\\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\\n\\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\\n constructor() {\\n // By setting the threshold it is not possible to call setup anymore,\\n // so we create a Safe with 0 owners and threshold 1.\\n // This is an unusable Safe, perfect for the singleton\\n threshold = 1;\\n }\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n /// @param to Contract address for optional delegate call.\\n /// @param data Data payload for optional delegate call.\\n /// @param fallbackHandler Handler for fallback calls to this contract\\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\\n /// @param payment Value that should be paid\\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\\n function setup(\\n address[] calldata _owners,\\n uint256 _threshold,\\n address to,\\n bytes calldata data,\\n address fallbackHandler,\\n address paymentToken,\\n uint256 payment,\\n address payable paymentReceiver\\n ) external {\\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\\n setupOwners(_owners, _threshold);\\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\\n setupModules(to, data);\\n\\n if (payment > 0) {\\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\\n }\\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\\n }\\n\\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\\n /// Note: The fees are always transferred, even if the user transaction fails.\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @param safeTxGas Gas that should be used for the Safe transaction.\\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Gas price that should be used for the payment calculation.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\\n function execTransaction(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures\\n ) public payable virtual returns (bool success) {\\n bytes32 txHash;\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n bytes memory txHashData =\\n encodeTransactionData(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n nonce\\n );\\n // Increase nonce and execute transaction.\\n nonce++;\\n txHash = keccak256(txHashData);\\n checkSignatures(txHash, txHashData, signatures);\\n }\\n address guard = getGuard();\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkTransaction(\\n // Transaction info\\n to,\\n value,\\n data,\\n operation,\\n safeTxGas,\\n // Payment info\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n // Signature info\\n signatures,\\n msg.sender\\n );\\n }\\n }\\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \\\"GS010\\\");\\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\\n {\\n uint256 gasUsed = gasleft();\\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\\n gasUsed = gasUsed.sub(gasleft());\\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\\n require(success || safeTxGas != 0 || gasPrice != 0, \\\"GS013\\\");\\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\\n uint256 payment = 0;\\n if (gasPrice > 0) {\\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\\n }\\n if (success) emit ExecutionSuccess(txHash, payment);\\n else emit ExecutionFailure(txHash, payment);\\n }\\n {\\n if (guard != address(0)) {\\n Guard(guard).checkAfterExecution(txHash, success);\\n }\\n }\\n }\\n\\n function handlePayment(\\n uint256 gasUsed,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver\\n ) private returns (uint256 payment) {\\n // solhint-disable-next-line avoid-tx-origin\\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\\n if (gasToken == address(0)) {\\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\\n require(receiver.send(payment), \\\"GS011\\\");\\n } else {\\n payment = gasUsed.add(baseGas).mul(gasPrice);\\n require(transferToken(gasToken, receiver, payment), \\\"GS012\\\");\\n }\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n */\\n function checkSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures\\n ) public view {\\n // Load threshold to avoid multiple storage loads\\n uint256 _threshold = threshold;\\n // Check that a threshold is set\\n require(_threshold > 0, \\\"GS001\\\");\\n checkNSignatures(dataHash, data, signatures, _threshold);\\n }\\n\\n /**\\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\\n * @param data That should be signed (this is passed to an external validator contract)\\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\\n * @param requiredSignatures Amount of required valid signatures.\\n */\\n function checkNSignatures(\\n bytes32 dataHash,\\n bytes memory data,\\n bytes memory signatures,\\n uint256 requiredSignatures\\n ) public view {\\n // Check that the provided signature data is not too short\\n require(signatures.length >= requiredSignatures.mul(65), \\\"GS020\\\");\\n // There cannot be an owner with address 0.\\n address lastOwner = address(0);\\n address currentOwner;\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n uint256 i;\\n for (i = 0; i < requiredSignatures; i++) {\\n (v, r, s) = signatureSplit(signatures, i);\\n if (v == 0) {\\n // If v is 0 then it is a contract signature\\n // When handling contract signatures the address of the contract is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n\\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\\n // Here we only check that the pointer is not pointing inside the part that is being processed\\n require(uint256(s) >= requiredSignatures.mul(65), \\\"GS021\\\");\\n\\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\\n require(uint256(s).add(32) <= signatures.length, \\\"GS022\\\");\\n\\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\\n uint256 contractSignatureLen;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\\n }\\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \\\"GS023\\\");\\n\\n // Check signature\\n bytes memory contractSignature;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\\n contractSignature := add(add(signatures, s), 0x20)\\n }\\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \\\"GS024\\\");\\n } else if (v == 1) {\\n // If v is 1 then it is an approved hash\\n // When handling approved hashes the address of the approver is encoded into r\\n currentOwner = address(uint160(uint256(r)));\\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \\\"GS025\\\");\\n } else if (v > 30) {\\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\\n currentOwner = ecrecover(keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", dataHash)), v - 4, r, s);\\n } else {\\n // Default is the ecrecover flow with the provided data hash\\n // Use ecrecover with the messageHash for EOA signatures\\n currentOwner = ecrecover(dataHash, v, r, s);\\n }\\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \\\"GS026\\\");\\n lastOwner = currentOwner;\\n }\\n }\\n\\n /// @dev Allows to estimate a Safe transaction.\\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\\n /// @param to Destination address of Safe transaction.\\n /// @param value Ether value of Safe transaction.\\n /// @param data Data payload of Safe transaction.\\n /// @param operation Operation type of Safe transaction.\\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\\n function requiredTxGas(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation\\n ) external returns (uint256) {\\n uint256 startGas = gasleft();\\n // We don't provide an error message here, as we use it to return the estimate\\n require(execute(to, value, data, operation, gasleft()));\\n uint256 requiredGas = startGas - gasleft();\\n // Convert response to string and return via error message\\n revert(string(abi.encodePacked(requiredGas)));\\n }\\n\\n /**\\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\\n */\\n function approveHash(bytes32 hashToApprove) external {\\n require(owners[msg.sender] != address(0), \\\"GS030\\\");\\n approvedHashes[msg.sender][hashToApprove] = 1;\\n emit ApproveHash(hashToApprove, msg.sender);\\n }\\n\\n /// @dev Returns the chain id used by this contract.\\n function getChainId() public view returns (uint256) {\\n uint256 id;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n id := chainid()\\n }\\n return id;\\n }\\n\\n function domainSeparator() public view returns (bytes32) {\\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\\n }\\n\\n /// @dev Returns the bytes that are hashed to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Gas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash bytes.\\n function encodeTransactionData(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes memory) {\\n bytes32 safeTxHash =\\n keccak256(\\n abi.encode(\\n SAFE_TX_TYPEHASH,\\n to,\\n value,\\n keccak256(data),\\n operation,\\n safeTxGas,\\n baseGas,\\n gasPrice,\\n gasToken,\\n refundReceiver,\\n _nonce\\n )\\n );\\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\\n }\\n\\n /// @dev Returns hash to be signed by owners.\\n /// @param to Destination address.\\n /// @param value Ether value.\\n /// @param data Data payload.\\n /// @param operation Operation type.\\n /// @param safeTxGas Fas that should be used for the safe transaction.\\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\\n /// @param gasPrice Maximum gas price that should be used for this transaction.\\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\\n /// @param _nonce Transaction nonce.\\n /// @return Transaction hash.\\n function getTransactionHash(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address refundReceiver,\\n uint256 _nonce\\n ) public view returns (bytes32) {\\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\\n }\\n}\\n\",\"keccak256\":\"0x2ca9e3e053c969b9364f62c50c2c25b92525db7fd0bad3ae1fb0c20dd575367c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\n\\n/// @title Executor - A contract that can execute transactions\\n/// @author Richard Meissner - \\ncontract Executor {\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == Enum.Operation.DelegateCall) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n } else {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4d3a900673473466bc27413fdbb11aae60b5580b792c49411f01544e0b24fe08\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract FallbackManager is SelfAuthorized {\\n event ChangedFallbackHandler(address handler);\\n\\n // keccak256(\\\"fallback_manager.handler.address\\\")\\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\\n\\n function internalSetFallbackHandler(address handler) internal {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, handler)\\n }\\n }\\n\\n /// @dev Allows to add a contract to handle fallback calls.\\n /// Only fallback calls without value and with data will be forwarded.\\n /// This can only be done via a Safe transaction.\\n /// @param handler contract to handle fallbacks calls.\\n function setFallbackHandler(address handler) public authorized {\\n internalSetFallbackHandler(handler);\\n emit ChangedFallbackHandler(handler);\\n }\\n\\n // solhint-disable-next-line payable-fallback,no-complex-fallback\\n fallback() external {\\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let handler := sload(slot)\\n if iszero(handler) {\\n return(0, 0)\\n }\\n calldatacopy(0, 0, calldatasize())\\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\\n // Then the address without padding is stored right after the calldata\\n mstore(calldatasize(), shl(96, caller()))\\n // Add 20 bytes for the address appended add the end\\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if iszero(success) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1be9f0f3e80a78134c2e3a026c6a14759785bd35d135e87a4a025aeb6742791f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\ninterface Guard {\\n function checkTransaction(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation,\\n uint256 safeTxGas,\\n uint256 baseGas,\\n uint256 gasPrice,\\n address gasToken,\\n address payable refundReceiver,\\n bytes memory signatures,\\n address msgSender\\n ) external;\\n\\n function checkAfterExecution(bytes32 txHash, bool success) external;\\n}\\n\\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\\n/// @author Richard Meissner - \\ncontract GuardManager is SelfAuthorized {\\n event ChangedGuard(address guard);\\n // keccak256(\\\"guard_manager.guard.address\\\")\\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\\n\\n /// @dev Set a guard that checks transactions before execution\\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\\n function setGuard(address guard) external authorized {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, guard)\\n }\\n emit ChangedGuard(guard);\\n }\\n\\n function getGuard() internal view returns (address guard) {\\n bytes32 slot = GUARD_STORAGE_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n guard := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x53a532a31f9632d5a73ad0df56f05bd2b66a2f781f571eb48d00367d370707f9\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/Enum.sol\\\";\\nimport \\\"../common/SelfAuthorized.sol\\\";\\nimport \\\"./Executor.sol\\\";\\n\\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract ModuleManager is SelfAuthorized, Executor {\\n event EnabledModule(address module);\\n event DisabledModule(address module);\\n event ExecutionFromModuleSuccess(address indexed module);\\n event ExecutionFromModuleFailure(address indexed module);\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n mapping(address => address) internal modules;\\n\\n function setupModules(address to, bytes memory data) internal {\\n require(modules[SENTINEL_MODULES] == address(0), \\\"GS100\\\");\\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\\n if (to != address(0))\\n // Setup has to complete successfully or transaction fails.\\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \\\"GS000\\\");\\n }\\n\\n /// @dev Allows to add a module to the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Enables the module `module` for the Safe.\\n /// @param module Module to be whitelisted.\\n function enableModule(address module) public authorized {\\n // Module address cannot be null or sentinel.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n // Module cannot be added twice.\\n require(modules[module] == address(0), \\\"GS102\\\");\\n modules[module] = modules[SENTINEL_MODULES];\\n modules[SENTINEL_MODULES] = module;\\n emit EnabledModule(module);\\n }\\n\\n /// @dev Allows to remove a module from the whitelist.\\n /// This can only be done via a Safe transaction.\\n /// @notice Disables the module `module` for the Safe.\\n /// @param prevModule Module that pointed to the module to be removed in the linked list\\n /// @param module Module to be removed.\\n function disableModule(address prevModule, address module) public authorized {\\n // Validate module address and check that it corresponds to module index.\\n require(module != address(0) && module != SENTINEL_MODULES, \\\"GS101\\\");\\n require(modules[prevModule] == module, \\\"GS103\\\");\\n modules[prevModule] = modules[module];\\n modules[module] = address(0);\\n emit DisabledModule(module);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public virtual returns (bool success) {\\n // Only whitelisted modules are allowed.\\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \\\"GS104\\\");\\n // Execute transaction without further confirmations.\\n success = execute(to, value, data, operation, gasleft());\\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\\n else emit ExecutionFromModuleFailure(msg.sender);\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModuleReturnData(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) public returns (bool success, bytes memory returnData) {\\n success = execTransactionFromModule(to, value, data, operation);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // Load free memory location\\n let ptr := mload(0x40)\\n // We allocate memory for the return data by setting the free memory location to\\n // current free memory location + data size + 32 bytes for data size value\\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\\n // Store the size\\n mstore(ptr, returndatasize())\\n // Store the data\\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\\n // Point the return data to the correct memory location\\n returnData := ptr\\n }\\n }\\n\\n /// @dev Returns if an module is enabled\\n /// @return True if the module is enabled\\n function isModuleEnabled(address module) public view returns (bool) {\\n return SENTINEL_MODULES != module && modules[module] != address(0);\\n }\\n\\n /// @dev Returns array of modules.\\n /// @param start Start of the page.\\n /// @param pageSize Maximum number of modules that should be returned.\\n /// @return array Array of modules.\\n /// @return next Start of the next page.\\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\\n // Init array with max page size\\n array = new address[](pageSize);\\n\\n // Populate return array\\n uint256 moduleCount = 0;\\n address currentModule = modules[start];\\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\\n array[moduleCount] = currentModule;\\n currentModule = modules[currentModule];\\n moduleCount++;\\n }\\n next = currentModule;\\n // Set correct size of returned array\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n mstore(array, moduleCount)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5512760a0328309f82a71cbe2ac14e0942501b9d44d5fb417bd02174546672e5\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"../common/SelfAuthorized.sol\\\";\\n\\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract OwnerManager is SelfAuthorized {\\n event AddedOwner(address owner);\\n event RemovedOwner(address owner);\\n event ChangedThreshold(uint256 threshold);\\n\\n address internal constant SENTINEL_OWNERS = address(0x1);\\n\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n /// @dev Setup function sets initial storage of contract.\\n /// @param _owners List of Safe owners.\\n /// @param _threshold Number of required confirmations for a Safe transaction.\\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\\n // Threshold can only be 0 at initialization.\\n // Check ensures that setup function can only be called once.\\n require(threshold == 0, \\\"GS200\\\");\\n // Validate that threshold is smaller than number of added owners.\\n require(_threshold <= _owners.length, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n // Initializing Safe owners.\\n address currentOwner = SENTINEL_OWNERS;\\n for (uint256 i = 0; i < _owners.length; i++) {\\n // Owner address cannot be null.\\n address owner = _owners[i];\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[currentOwner] = owner;\\n currentOwner = owner;\\n }\\n owners[currentOwner] = SENTINEL_OWNERS;\\n ownerCount = _owners.length;\\n threshold = _threshold;\\n }\\n\\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\\n /// @param owner New owner address.\\n /// @param _threshold New threshold.\\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[owner] == address(0), \\\"GS204\\\");\\n owners[owner] = owners[SENTINEL_OWNERS];\\n owners[SENTINEL_OWNERS] = owner;\\n ownerCount++;\\n emit AddedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\\n /// This can only be done via a Safe transaction.\\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\\n /// @param owner Owner address to be removed.\\n /// @param _threshold New threshold.\\n function removeOwner(\\n address prevOwner,\\n address owner,\\n uint256 _threshold\\n ) public authorized {\\n // Only allow to remove an owner, if threshold can still be reached.\\n require(ownerCount - 1 >= _threshold, \\\"GS201\\\");\\n // Validate owner address and check that it corresponds to owner index.\\n require(owner != address(0) && owner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == owner, \\\"GS205\\\");\\n owners[prevOwner] = owners[owner];\\n owners[owner] = address(0);\\n ownerCount--;\\n emit RemovedOwner(owner);\\n // Change threshold if threshold was changed.\\n if (threshold != _threshold) changeThreshold(_threshold);\\n }\\n\\n /// @dev Allows to swap/replace an owner from the Safe with another address.\\n /// This can only be done via a Safe transaction.\\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\\n /// @param oldOwner Owner address to be replaced.\\n /// @param newOwner New owner address.\\n function swapOwner(\\n address prevOwner,\\n address oldOwner,\\n address newOwner\\n ) public authorized {\\n // Owner address cannot be null, the sentinel or the Safe itself.\\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \\\"GS203\\\");\\n // No duplicate owners allowed.\\n require(owners[newOwner] == address(0), \\\"GS204\\\");\\n // Validate oldOwner address and check that it corresponds to owner index.\\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \\\"GS203\\\");\\n require(owners[prevOwner] == oldOwner, \\\"GS205\\\");\\n owners[newOwner] = owners[oldOwner];\\n owners[prevOwner] = newOwner;\\n owners[oldOwner] = address(0);\\n emit RemovedOwner(oldOwner);\\n emit AddedOwner(newOwner);\\n }\\n\\n /// @dev Allows to update the number of required confirmations by Safe owners.\\n /// This can only be done via a Safe transaction.\\n /// @notice Changes the threshold of the Safe to `_threshold`.\\n /// @param _threshold New threshold.\\n function changeThreshold(uint256 _threshold) public authorized {\\n // Validate that threshold is smaller than number of owners.\\n require(_threshold <= ownerCount, \\\"GS201\\\");\\n // There has to be at least one Safe owner.\\n require(_threshold >= 1, \\\"GS202\\\");\\n threshold = _threshold;\\n emit ChangedThreshold(threshold);\\n }\\n\\n function getThreshold() public view returns (uint256) {\\n return threshold;\\n }\\n\\n function isOwner(address owner) public view returns (bool) {\\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\\n }\\n\\n /// @dev Returns array of owners.\\n /// @return Array of Safe owners.\\n function getOwners() public view returns (address[] memory) {\\n address[] memory array = new address[](ownerCount);\\n\\n // populate return array\\n uint256 index = 0;\\n address currentOwner = owners[SENTINEL_OWNERS];\\n while (currentOwner != SENTINEL_OWNERS) {\\n array[index] = currentOwner;\\n currentOwner = owners[currentOwner];\\n index++;\\n }\\n return array;\\n }\\n}\\n\",\"keccak256\":\"0x01a3d64cc0967f42ae63802409f5404d18352516ea2a6335005003d919ffcf12\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Enum.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Enum - Collection of enums\\n/// @author Richard Meissner - \\ncontract Enum {\\n enum Operation {Call, DelegateCall}\\n}\\n\",\"keccak256\":\"0x473e45b1a5cc47be494b0e123c9127f0c11c1e0992a321ae5a644c0bfdb2c14f\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\\n/// @author Richard Meissner - \\ncontract EtherPaymentFallback {\\n event SafeReceived(address indexed sender, uint256 value);\\n\\n /// @dev Fallback function accepts Ether transactions.\\n receive() external payable {\\n emit SafeReceived(msg.sender, msg.value);\\n }\\n}\\n\",\"keccak256\":\"0x1a7928d29877da84a3d0df846d5cd933d48ee095c1bde0aa044e249b12e27a72\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SecuredTokenTransfer - Secure token transfer\\n/// @author Richard Meissner - \\ncontract SecuredTokenTransfer {\\n /// @dev Transfers a token and returns if it was a success\\n /// @param token Token that should be transferred\\n /// @param receiver Receiver to whom the token should be transferred\\n /// @param amount The amount of tokens that should be transferred\\n function transferToken(\\n address token,\\n address receiver,\\n uint256 amount\\n ) internal returns (bool transferred) {\\n // 0xa9059cbb - keccack(\\\"transfer(address,uint256)\\\")\\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n // We write the return value to scratch space.\\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n switch returndatasize()\\n case 0 {\\n transferred := success\\n }\\n case 0x20 {\\n transferred := iszero(or(iszero(success), iszero(mload(0))))\\n }\\n default {\\n transferred := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x178682d8477da42936c7e8e24d39094c4ac08ecd8623794b9535d77001b665f1\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SelfAuthorized - authorizes current contract to perform actions\\n/// @author Richard Meissner - \\ncontract SelfAuthorized {\\n function requireSelfCall() private view {\\n require(msg.sender == address(this), \\\"GS031\\\");\\n }\\n\\n modifier authorized() {\\n // This is a function call as it minimized the bytecode size\\n requireSelfCall();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x59d36efca578b75541a776f62a0d0ef03712fc27b6647c3915c14b572106d7bc\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\\n/// @author Richard Meissner - \\ncontract SignatureDecoder {\\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\\n /// @param signatures concatenated rsv signatures\\n function signatureSplit(bytes memory signatures, uint256 pos)\\n internal\\n pure\\n returns (\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n )\\n {\\n // The signature format is a compact form of:\\n // {bytes32 r}{bytes32 s}{uint8 v}\\n // Compact means, uint8 is not padded to 32 bytes.\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let signaturePos := mul(0x41, pos)\\n r := mload(add(signatures, add(signaturePos, 0x20)))\\n s := mload(add(signatures, add(signaturePos, 0x40)))\\n // Here we are loading the last 32 bytes, including 31 bytes\\n // of 's'. There is no 'mload8' to do this.\\n //\\n // 'byte' is not working due to the Solidity parser, so lets\\n // use the second best option, 'and'\\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2d37be182472ccfee62a33e9939f9b3d509be4c32e9fdebc2c1746c573655987\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/Singleton.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\\n/// @author Richard Meissner - \\ncontract Singleton {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\\n // It should also always be ensured that the address is stored alone (uses a full word)\\n address private singleton;\\n}\\n\",\"keccak256\":\"0x6e02c18998de8834dd7d69890cb6ede996b6f635d2337081a596d91e35e2c648\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\\ncontract StorageAccessible {\\n /**\\n * @dev Reads `length` bytes of storage in the currents contract\\n * @param offset - the offset in the current contract's storage in words to start reading from\\n * @param length - the number of words (32 bytes) of data to read\\n * @return the bytes that were read.\\n */\\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\\n bytes memory result = new bytes(length * 32);\\n for (uint256 index = 0; index < length; index++) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let word := sload(add(offset, index))\\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Performs a delegetecall on a targetContract in the context of self.\\n * Internally reverts execution to avoid side effects (making it static).\\n *\\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\\n * Specifically, the `returndata` after a call to this method will be:\\n * `success:bool || response.length:uint256 || response:bytes`.\\n *\\n * @param targetContract Address of the contract containing the code to execute.\\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\\n */\\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\\n\\n mstore(0x00, success)\\n mstore(0x20, returndatasize())\\n returndatacopy(0x40, 0, returndatasize())\\n revert(0, add(returndatasize(), 0x40))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36853adb266c2ab7d3c612aca799441a86bd15d9e1d24fc6c70d63f5c2df3aaf\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\\n/// @author Richard Meissner - \\ncontract GnosisSafeStorage {\\n // From /common/Singleton.sol\\n address internal singleton;\\n // From /common/ModuleManager.sol\\n mapping(address => address) internal modules;\\n // From /common/OwnerManager.sol\\n mapping(address => address) internal owners;\\n uint256 internal ownerCount;\\n uint256 internal threshold;\\n\\n // From /GnosisSafe.sol\\n bytes32 internal nonce;\\n bytes32 internal domainSeparator;\\n mapping(bytes32 => uint256) internal signedMessages;\\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xecfd0d8a43d859ef1fb8161cb21ce5d38461603383378a5b1c4c7d5d4a3bfbf3\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title GnosisSafeMath\\n * @dev Math operations with safety checks that revert on error\\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\\n * TODO: remove once open zeppelin update to solc 0.5.0\\n */\\nlibrary GnosisSafeMath {\\n /**\\n * @dev Multiplies two numbers, reverts on overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Adds two numbers, reverts on overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x2a2b4d74f5834a9437be0cd3254d7a676698fc78aa47941c2009470196998d98\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"../interfaces/ERC1155TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC721TokenReceiver.sol\\\";\\nimport \\\"../interfaces/ERC777TokensRecipient.sol\\\";\\nimport \\\"../interfaces/IERC165.sol\\\";\\n\\n/// @title Default Callback Handler - returns true for known token callbacks\\n/// @author Richard Meissner - \\ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\\n string public constant NAME = \\\"Default Callback Handler\\\";\\n string public constant VERSION = \\\"1.0.0\\\";\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xf23a6e61;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0xbc197c81;\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return 0x150b7a02;\\n }\\n\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n // We implement this for completeness, doesn't really have any value\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x1cdc184c3504176383b7f94f9ce06c96ce1c123e1878258fe6dc03cce4a29ff7\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\n*/\\ninterface ERC1155TokenReceiver {\\n /**\\n @notice Handle the receipt of a single ERC1155 token type.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\\n This function MUST revert if it rejects the transfer.\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _id The ID of the token being transferred\\n @param _value The amount of tokens being transferred\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n */\\n function onERC1155Received(\\n address _operator,\\n address _from,\\n uint256 _id,\\n uint256 _value,\\n bytes calldata _data\\n ) external returns (bytes4);\\n\\n /**\\n @notice Handle the receipt of multiple ERC1155 token types.\\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \\n This function MUST return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\\n This function MUST revert if it rejects the transfer(s).\\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\\n @param _from The address which previously owned the token\\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\\n @param _data Additional data with no specified format\\n @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n */\\n function onERC1155BatchReceived(\\n address _operator,\\n address _from,\\n uint256[] calldata _ids,\\n uint256[] calldata _values,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7894ef55ee3334f6388e5e1d749bbabd85fc03d5a2ab949f284bce830f8aa398\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\\ninterface ERC721TokenReceiver {\\n /// @notice Handle the receipt of an NFT\\n /// @dev The ERC721 smart contract calls this function on the recipient\\n /// after a `transfer`. This function MAY throw to revert and reject the\\n /// transfer. Return of other than the magic value MUST result in the\\n /// transaction being reverted.\\n /// Note: the contract address is always the message sender.\\n /// @param _operator The address which called `safeTransferFrom` function\\n /// @param _from The address which previously owned the token\\n /// @param _tokenId The NFT identifier which is being transferred\\n /// @param _data Additional data with no specified format\\n /// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n /// unless throwing\\n function onERC721Received(\\n address _operator,\\n address _from,\\n uint256 _tokenId,\\n bytes calldata _data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x8a3dd41df3a49d9ae2d45dd4087ca595946ed3c6051b8aa304727017b5eabaa4\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ninterface ERC777TokensRecipient {\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata data,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1cfbdb95761067c5bc35599fcae6c11e487f2879d7fa2c6f47e7b94506b4039c\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5c64c2e071245db8fe3ea8b94f73c5a8de236933858ae240348d502433a9d178\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract ISignatureValidatorConstants {\\n // bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\")\\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\\n}\\n\\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param _data Arbitrary length data signed on the behalf of address(this)\\n * @param _signature Signature byte array associated with _data\\n *\\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\\n * MUST allow external calls\\n */\\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x5b6e9bf17f28738ce88e751f420b0559f5151ba7bec2ff3c7bb31e42673d6801\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\\n/// @author Richard Meissner - \\ninterface IProxy {\\n function masterCopy() external view returns (address);\\n}\\n\\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\\n/// @author Stefan George - \\n/// @author Richard Meissner - \\ncontract GnosisSafeProxy {\\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\\n address internal singleton;\\n\\n /// @dev Constructor function sets address of singleton contract.\\n /// @param _singleton Singleton address.\\n constructor(address _singleton) {\\n require(_singleton != address(0), \\\"Invalid singleton address provided\\\");\\n singleton = _singleton;\\n }\\n\\n /// @dev Fallback function forwards all transactions and returns all received return data.\\n fallback() external payable {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\\n // 0xa619486e == keccak(\\\"masterCopy()\\\"). The value is right padded to 32-bytes with 0s\\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\\n mstore(0, _singleton)\\n return(0, 0x20)\\n }\\n calldatacopy(0, 0, calldatasize())\\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\\n returndatacopy(0, 0, returndatasize())\\n if eq(success, 0) {\\n revert(0, returndatasize())\\n }\\n return(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3bfdd453d9f896f7029d15bcafd11886957b320ad1764309d9f74fa059715249\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport \\\"./GnosisSafeProxy.sol\\\";\\nimport \\\"./IProxyCreationCallback.sol\\\";\\n\\n/// @title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n/// @author Stefan George - \\ncontract GnosisSafeProxyFactory {\\n event ProxyCreation(GnosisSafeProxy proxy, address singleton);\\n\\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n /// @param singleton Address of singleton contract.\\n /// @param data Payload for message call sent to new proxy contract.\\n function createProxy(address singleton, bytes memory data) public returns (GnosisSafeProxy proxy) {\\n proxy = new GnosisSafeProxy(singleton);\\n if (data.length > 0)\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n if eq(call(gas(), proxy, 0, add(data, 0x20), mload(data), 0, 0), 0) {\\n revert(0, 0)\\n }\\n }\\n emit ProxyCreation(proxy, singleton);\\n }\\n\\n /// @dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.\\n function proxyRuntimeCode() public pure returns (bytes memory) {\\n return type(GnosisSafeProxy).runtimeCode;\\n }\\n\\n /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.\\n function proxyCreationCode() public pure returns (bytes memory) {\\n return type(GnosisSafeProxy).creationCode;\\n }\\n\\n /// @dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.\\n /// This method is only meant as an utility to be called from other methods\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function deployProxyWithNonce(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce\\n ) internal returns (GnosisSafeProxy proxy) {\\n // If the initializer changes the proxy address should change too. Hashing the initializer data is cheaper than just concatinating it\\n bytes32 salt = keccak256(abi.encodePacked(keccak256(initializer), saltNonce));\\n bytes memory deploymentData = abi.encodePacked(type(GnosisSafeProxy).creationCode, uint256(uint160(_singleton)));\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)\\n }\\n require(address(proxy) != address(0), \\\"Create2 call failed\\\");\\n }\\n\\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function createProxyWithNonce(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce\\n ) public returns (GnosisSafeProxy proxy) {\\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\\n if (initializer.length > 0)\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n if eq(call(gas(), proxy, 0, add(initializer, 0x20), mload(initializer), 0, 0), 0) {\\n revert(0, 0)\\n }\\n }\\n emit ProxyCreation(proxy, _singleton);\\n }\\n\\n /// @dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n /// @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.\\n function createProxyWithCallback(\\n address _singleton,\\n bytes memory initializer,\\n uint256 saltNonce,\\n IProxyCreationCallback callback\\n ) public returns (GnosisSafeProxy proxy) {\\n uint256 saltNonceWithCallback = uint256(keccak256(abi.encodePacked(saltNonce, callback)));\\n proxy = createProxyWithNonce(_singleton, initializer, saltNonceWithCallback);\\n if (address(callback) != address(0)) callback.proxyCreated(proxy, _singleton, initializer, saltNonce);\\n }\\n\\n /// @dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`\\n /// This method is only meant for address calculation purpose when you use an initializer that would revert,\\n /// therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\\n /// @param _singleton Address of singleton contract.\\n /// @param initializer Payload for message call sent to new proxy contract.\\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\\n function calculateCreateProxyWithNonceAddress(\\n address _singleton,\\n bytes calldata initializer,\\n uint256 saltNonce\\n ) external returns (GnosisSafeProxy proxy) {\\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\\n revert(string(abi.encodePacked(proxy)));\\n }\\n}\\n\",\"keccak256\":\"0x187c6f84c71b432da6721c1b81cebfbb9c37c0cc15ebd8de5a14ff7ec6db2d9e\",\"license\":\"LGPL-3.0-only\"},\"@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\nimport \\\"./GnosisSafeProxy.sol\\\";\\n\\ninterface IProxyCreationCallback {\\n function proxyCreated(\\n GnosisSafeProxy proxy,\\n address _singleton,\\n bytes calldata initializer,\\n uint256 saltNonce\\n ) external;\\n}\\n\",\"keccak256\":\"0x51a9ce914a6a943651c803541e44218a7ed0a2f98a94d55df66b173b5a11e365\",\"license\":\"LGPL-3.0-only\"},\"@openzeppelin/contracts/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC1271 standard signature validation method for\\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC1271 {\\n /**\\n * @dev Should return whether the signature provided is valid for the provided data\\n * @param hash Hash of the data to be signed\\n * @param signature Signature byte array associated with _data\\n */\\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/gnosis/EIP4337Fallback.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@openzeppelin/contracts/interfaces/IERC1271.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"./EIP4337Manager.sol\\\";\\n\\nusing ECDSA for bytes32;\\n\\n/**\\n * The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\\n * This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\\n * Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\\n * Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\\n */\\ncontract EIP4337Fallback is DefaultCallbackHandler, IAccount, IERC1271 {\\n bytes4 internal constant ERC1271_MAGIC_VALUE = 0x1626ba7e;\\n\\n address immutable public eip4337manager;\\n constructor(address _eip4337manager) {\\n eip4337manager = _eip4337manager;\\n }\\n\\n /**\\n * delegate the contract call to the EIP4337Manager\\n */\\n function delegateToManager() internal returns (bytes memory) {\\n // delegate entire msg.data (including the appended \\\"msg.sender\\\") to the EIP4337Manager\\n // will work only for GnosisSafe contracts\\n GnosisSafe safe = GnosisSafe(payable(msg.sender));\\n (bool success, bytes memory ret) = safe.execTransactionFromModuleReturnData(eip4337manager, 0, msg.data, Enum.Operation.DelegateCall);\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function validateUserOp(UserOperation calldata, bytes32, uint256) override external returns (uint256 deadline){\\n bytes memory ret = delegateToManager();\\n return abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public returns (uint256 nonce) {\\n bytes memory ret = delegateToManager();\\n (nonce) = abi.decode(ret, (uint256));\\n }\\n\\n /**\\n * called from the Safe. delegate actual work to EIP4337Manager\\n */\\n function executeAndRevert(\\n address,\\n uint256,\\n bytes memory,\\n Enum.Operation\\n ) external {\\n delegateToManager();\\n }\\n\\n function isValidSignature(\\n bytes32 _hash,\\n bytes memory _signature\\n ) external override view returns (bytes4) {\\n bytes32 hash = _hash.toEthSignedMessageHash();\\n address recovered = hash.recover(_signature);\\n\\n GnosisSafe safe = GnosisSafe(payable(address(msg.sender)));\\n\\n // Validate signatures\\n if (safe.isOwner(recovered)) {\\n return ERC1271_MAGIC_VALUE;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6be32571c849722d61a84fb03975dcf158fd45f88e10f289ce2626b49def8ca5\",\"license\":\"GPL\"},\"contracts/samples/gnosis/EIP4337Manager.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\\\";\\nimport \\\"./EIP4337Fallback.sol\\\";\\nimport \\\"../../interfaces/IAccount.sol\\\";\\nimport \\\"../../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../../utils/Exec.sol\\\";\\n\\n using ECDSA for bytes32;\\n\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n * Inherits GnosisSafe so that it can reference the memory storage\\n */\\ncontract EIP4337Manager is IAccount, GnosisSafeStorage, Executor {\\n\\n address public immutable eip4337Fallback;\\n address public immutable entryPoint;\\n\\n // return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n address internal constant SENTINEL_MODULES = address(0x1);\\n\\n constructor(address anEntryPoint) {\\n entryPoint = anEntryPoint;\\n eip4337Fallback = address(new EIP4337Fallback(address(this)));\\n }\\n\\n /**\\n * delegate-called (using execFromModule) through the fallback, so \\\"real\\\" msg.sender is attached as last 20 bytes\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override returns (uint256 validationData) {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n address recovered = hash.recover(userOp.signature);\\n require(threshold == 1, \\\"account: only threshold 1\\\");\\n if (!pThis.isOwner(recovered)) {\\n validationData = SIG_VALIDATION_FAILED;\\n }\\n\\n // mimic normal Safe nonce behaviour: prevent parallel nonces\\n require(userOp.nonce < type(uint64).max, \\\"account: nonsequential nonce\\\");\\n\\n if (missingAccountFunds > 0) {\\n //Note: MAY pay more than the minimum, to deposit for future transactions\\n (bool success,) = payable(msgSender).call{value : missingAccountFunds}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n\\n /**\\n * Execute a call but also revert if the execution fails.\\n * The default behavior of the Safe is to not revert if the call fails,\\n * which is challenging for integrating with ERC4337 because then the\\n * EntryPoint wouldn't know to emit the UserOperationRevertReason event,\\n * which the frontend/client uses to capture the reason for the failure.\\n */\\n function executeAndRevert(\\n address to,\\n uint256 value,\\n bytes memory data,\\n Enum.Operation operation\\n ) external {\\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\\n require(msgSender == entryPoint, \\\"account: not from entrypoint\\\");\\n require(msg.sender == eip4337Fallback, \\\"account: not from EIP4337Fallback\\\");\\n\\n bool success = execute(\\n to,\\n value,\\n data,\\n operation,\\n type(uint256).max\\n );\\n\\n bytes memory returnData = Exec.getReturnData(type(uint256).max);\\n // Revert with the actual reason string\\n // Adopted from: https://github.com/Uniswap/v3-periphery/blob/464a8a49611272f7349c970e0fadb7ec1d3c1086/contracts/base/Multicall.sol#L16-L23\\n if (!success) {\\n if (returnData.length < 68) revert();\\n assembly {\\n returnData := add(returnData, 0x04)\\n }\\n revert(abi.decode(returnData, (string)));\\n }\\n }\\n\\n /**\\n * Helper for wallet to get the next nonce.\\n */\\n function getNonce() public view returns (uint256) {\\n return IEntryPoint(entryPoint).getNonce(address(this), 0);\\n }\\n\\n /**\\n * set up a safe as EIP-4337 enabled.\\n * called from the GnosisSafeAccountFactory during construction time\\n * - enable 3 modules (this module, fallback and the entrypoint)\\n * - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \\\"this\\\" is the safe itself\\n */\\n function setup4337Modules(\\n EIP4337Manager manager //the manager (this contract)\\n ) external {\\n GnosisSafe safe = GnosisSafe(payable(address(this)));\\n require(!safe.isModuleEnabled(manager.entryPoint()), \\\"setup4337Modules: entrypoint already enabled\\\");\\n require(!safe.isModuleEnabled(manager.eip4337Fallback()), \\\"setup4337Modules: eip4337Fallback already enabled\\\");\\n safe.enableModule(manager.entryPoint());\\n safe.enableModule(manager.eip4337Fallback());\\n }\\n\\n /**\\n * replace EIP4337 module, to support a new EntryPoint.\\n * must be called using execTransaction and Enum.Operation.DelegateCall\\n * @param prevModule returned by getCurrentEIP4337Manager\\n * @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\\n * @param newManager the new EIP4337Manager, usually with a new EntryPoint\\n */\\n function replaceEIP4337Manager(address prevModule, EIP4337Manager oldManager, EIP4337Manager newManager) public {\\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\\n address oldFallback = oldManager.eip4337Fallback();\\n require(pThis.isModuleEnabled(oldFallback), \\\"replaceEIP4337Manager: oldManager is not active\\\");\\n pThis.disableModule(oldFallback, oldManager.entryPoint());\\n pThis.disableModule(prevModule, oldFallback);\\n\\n address eip4337fallback = newManager.eip4337Fallback();\\n\\n pThis.enableModule(newManager.entryPoint());\\n pThis.enableModule(eip4337fallback);\\n pThis.setFallbackHandler(eip4337fallback);\\n\\n validateEip4337(pThis, newManager);\\n }\\n\\n /**\\n * Validate this gnosisSafe is callable through the EntryPoint.\\n * the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\\n * we don't test full transaction\\n */\\n function validateEip4337(GnosisSafe safe, EIP4337Manager manager) public {\\n\\n // this prevents mistaken replaceEIP4337Manager to disable the module completely.\\n // minimal signature that pass \\\"recover\\\"\\n bytes memory sig = new bytes(65);\\n sig[64] = bytes1(uint8(27));\\n sig[2] = bytes1(uint8(1));\\n sig[35] = bytes1(uint8(1));\\n uint256 nonce = uint256(IEntryPoint(manager.entryPoint()).getNonce(address(safe), 0));\\n UserOperation memory userOp = UserOperation(address(safe), nonce, \\\"\\\", \\\"\\\", 0, 1000000, 0, 0, 0, \\\"\\\", sig);\\n UserOperation[] memory userOps = new UserOperation[](1);\\n userOps[0] = userOp;\\n IEntryPoint _entryPoint = IEntryPoint(payable(manager.entryPoint()));\\n try _entryPoint.handleOps(userOps, payable(msg.sender)) {\\n revert(\\\"validateEip4337: handleOps must fail\\\");\\n } catch (bytes memory error) {\\n if (keccak256(error) != keccak256(abi.encodeWithSignature(\\\"FailedOp(uint256,string)\\\", 0, \\\"AA24 signature error\\\"))) {\\n revert(string(error));\\n }\\n }\\n }\\n /**\\n * enumerate modules, and find the currently active EIP4337 manager (and previous module)\\n * @return prev prev module, needed by replaceEIP4337Manager\\n * @return manager the current active EIP4337Manager\\n */\\n function getCurrentEIP4337Manager(GnosisSafe safe) public view returns (address prev, address manager) {\\n prev = address(SENTINEL_MODULES);\\n (address[] memory modules,) = safe.getModulesPaginated(SENTINEL_MODULES, 100);\\n for (uint i = 0; i < modules.length; i++) {\\n address module = modules[i];\\n try EIP4337Fallback(module).eip4337manager() returns (address _manager) {\\n return (prev, _manager);\\n }\\n // solhint-disable-next-line no-empty-blocks\\n catch {}\\n prev = module;\\n }\\n return (address(0), address(0));\\n }\\n}\\n\",\"keccak256\":\"0xbba6bd62aefbd6ec3b6fc6ad2bd79ede258d342f7a193c938f1323466a6a2ac7\",\"license\":\"GPL\"},\"contracts/samples/gnosis/GnosisAccountFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\\\";\\nimport \\\"./EIP4337Manager.sol\\\";\\n\\n/**\\n * A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract.\\n */\\ncontract GnosisSafeAccountFactory {\\n\\n GnosisSafeProxyFactory public immutable proxyFactory;\\n address public immutable safeSingleton;\\n EIP4337Manager public immutable eip4337Manager;\\n\\n constructor(GnosisSafeProxyFactory _proxyFactory, address _safeSingleton, EIP4337Manager _eip4337Manager) {\\n proxyFactory = _proxyFactory;\\n safeSingleton = _safeSingleton;\\n eip4337Manager = _eip4337Manager;\\n }\\n\\n function createAccount(address owner,uint256 salt) public returns (address) {\\n address addr = getAddress(owner, salt);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return addr;\\n }\\n return address(proxyFactory.createProxyWithNonce(\\n safeSingleton, getInitializer(owner), salt));\\n }\\n\\n function getInitializer(address owner) internal view returns (bytes memory) {\\n address[] memory owners = new address[](1);\\n owners[0] = owner;\\n uint threshold = 1;\\n address eip4337fallback = eip4337Manager.eip4337Fallback();\\n\\n bytes memory setup4337Modules = abi.encodeCall(\\n EIP4337Manager.setup4337Modules, (eip4337Manager));\\n\\n return abi.encodeCall(GnosisSafe.setup, (\\n owners, threshold,\\n address (eip4337Manager), setup4337Modules,\\n eip4337fallback,\\n address(0), 0, payable(0) //no payment receiver\\n ));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n * (uses the same \\\"create2 signature\\\" used by GnosisSafeProxyFactory.createProxyWithNonce)\\n */\\n function getAddress(address owner,uint256 salt) public view returns (address) {\\n bytes memory initializer = getInitializer(owner);\\n //copied from deployProxyWithNonce\\n bytes32 salt2 = keccak256(abi.encodePacked(keccak256(initializer), salt));\\n bytes memory deploymentData = abi.encodePacked(proxyFactory.proxyCreationCode(), uint256(uint160(safeSingleton)));\\n return Create2.computeAddress(bytes32(salt2), keccak256(deploymentData), address (proxyFactory));\\n }\\n}\\n\",\"keccak256\":\"0x28f67192916eabebf877a69d469b35d640c6133b0ae17767d3fae71f288c8925\",\"license\":\"GPL-3.0\"},\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"getAddress(address,uint256)":{"notice":"calculate the counterfactual address of this account as it would be returned by createAccount() (uses the same \"create2 signature\" used by GnosisSafeProxyFactory.createProxyWithNonce)"}},"notice":"A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract.","version":1}}},"contracts/test/BrokenBlsAccount.sol":{"BrokenBLSAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"},{"internalType":"address","name":"anAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[4]","name":"oldPublicKey","type":"uint256[4]"},{"indexed":false,"internalType":"uint256[4]","name":"newPublicKey","type":"uint256[4]"}],"name":"PublicKeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlsPublicKey","outputs":[{"internalType":"uint256[4]","name":"","type":"uint256[4]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"anOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"getBlsPublicKey()":{"returns":{"_0":"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated."}},"initialize(address)":{"details":"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`"},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"withdrawDepositTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13884":{"entryPoint":null,"id":13884,"parameterSlots":1,"returnSlots":0},"@_19043":{"entryPoint":null,"id":19043,"parameterSlots":2,"returnSlots":0},"@_disableInitializers_3524":{"entryPoint":100,"id":3524,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":319,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":294,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1194:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"774:229:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"784:6:111"},"nodeType":"YulFunctionCall","src":"784:21:111"},"nodeType":"YulExpressionStatement","src":"784:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"836:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"821:3:111"},"nodeType":"YulFunctionCall","src":"821:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"841:2:111","type":"","value":"39"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"814:6:111"},"nodeType":"YulFunctionCall","src":"814:30:111"},"nodeType":"YulExpressionStatement","src":"814:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"864:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"875:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"860:3:111"},"nodeType":"YulFunctionCall","src":"860:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469","kind":"string","nodeType":"YulLiteral","src":"880:34:111","type":"","value":"Initializable: contract is initi"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"853:6:111"},"nodeType":"YulFunctionCall","src":"853:62:111"},"nodeType":"YulExpressionStatement","src":"853:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"935:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"946:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"931:3:111"},"nodeType":"YulFunctionCall","src":"931:18:111"},{"hexValue":"616c697a696e67","kind":"string","nodeType":"YulLiteral","src":"951:9:111","type":"","value":"alizing"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"924:6:111"},"nodeType":"YulFunctionCall","src":"924:37:111"},"nodeType":"YulExpressionStatement","src":"924:37:111"},{"nodeType":"YulAssignment","src":"970:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"982:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"993:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"978:3:111"},"nodeType":"YulFunctionCall","src":"978:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"970:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"751:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"765:4:111","type":""}],"src":"600:403:111"},{"body":{"nodeType":"YulBlock","src":"1105:87:111","statements":[{"nodeType":"YulAssignment","src":"1115:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1127:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1138:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1123:3:111"},"nodeType":"YulFunctionCall","src":"1123:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1115:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1157:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1172:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1180:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1168:3:111"},"nodeType":"YulFunctionCall","src":"1168:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1150:6:111"},"nodeType":"YulFunctionCall","src":"1150:36:111"},"nodeType":"YulExpressionStatement","src":"1150:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1074:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1085:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1096:4:111","type":""}],"src":"1008:184:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 39)\n mstore(add(headStart, 64), \"Initializable: contract is initi\")\n mstore(add(headStart, 96), \"alizing\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60e0604052306080523480156200001557600080fd5b50604051620023a4380380620023a483398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c0516121a2620002026000396000818161027d01526108ee0152600081816103a401528181610931015281816109d801528181610dae01528181610fe5015281816111550152818161145901526115fe0152600081816107080152818161079e01528181610a9c01528181610b320152610c6101526121a26000f3fe60806040526004361061016d5760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae1461047a578063ee472f361461049c578063f23a6e61146104bc57600080fd5b8063c399ec8814610430578063c4d66de814610445578063d087d2881461046557600080fd5b8063b0d691fe116100b0578063b0d691fe14610395578063b61d27f6146103c8578063bc197c81146103e857600080fd5b806352d1902d1461034d5780638da5cb5b1461036257600080fd5b80633659cfe6116101225780634a58db19116101075780634a58db19146103125780634d44560d1461031a5780634f1ef2861461033a57600080fd5b80633659cfe6146102c45780633a871cdd146102e457600080fd5b8063150b7a0211610153578063150b7a02146101d557806318dfb3c71461024b578063245a7bfc1461026b57600080fd5b806223de291461017957806301ffc9a7146101a057600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019e61019436600461198f565b5050505050505050565b005b3480156101ac57600080fd5b506101c06101bb366004611a40565b610502565b60405190151581526020015b60405180910390f35b3480156101e157600080fd5b5061021a6101f0366004611a82565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101cc565b34801561025757600080fd5b5061019e610266366004611b3a565b6105e7565b34801561027757600080fd5b5061029f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b3480156102d057600080fd5b5061019e6102df366004611ba6565b6106f1565b3480156102f057600080fd5b506103046102ff366004611bc3565b6108c2565b6040519081526020016101cc565b61019e61092f565b34801561032657600080fd5b5061019e610335366004611c17565b6109ce565b61019e610348366004611cc1565b610a85565b34801561035957600080fd5b50610304610c47565b34801561036e57600080fd5b5060005461029f9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061029f565b3480156103d457600080fd5b5061019e6103e3366004611d87565b610d19565b3480156103f457600080fd5b5061021a610403366004611dd7565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561043c57600080fd5b50610304610d68565b34801561045157600080fd5b5061019e610460366004611ba6565b610e1f565b34801561047157600080fd5b50610304610f98565b34801561048657600080fd5b5061048f611014565b6040516101cc9190611e75565b3480156104a857600080fd5b5061019e6104b7366004611ea6565b611029565b3480156104c857600080fd5b5061021a6104d7366004611f24565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061059557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806105e157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6105ef61113d565b8281146106435760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156106ea576106d885858381811061066357610663611fa0565b90506020020160208101906106789190611ba6565b600085858581811061068c5761068c611fa0565b905060200281019061069e9190611fcf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b806106e281612034565b915050610646565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361079c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108117f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461089a5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b6108a381611269565b604080516000808252602082019092526108bf91839190611271565b50565b60006108cc611441565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168082526000602083018190529190920152610928826114c6565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109ba57600080fd5b505af11580156106ea573d6000803e3d6000fd5b6109d6611531565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a6957600080fd5b505af1158015610a7d573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ba57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b610c3782611269565b610c4382826001611271565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161063a565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d2161113d565b610d62848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612093565b905090565b600054610100900460ff1615808015610e3f5750600054600160ff909116105b80610e595750303b158015610e59575060005460ff166001145b610ecb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f32826115a8565b8015610c4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dd9565b61101c611906565b611024611906565b919050565b600054610100900460ff16158080156110495750600054600160ff909116105b806110635750303b158015611063575060005460ff166001145b6110d55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561113357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f3260006115a8565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061119e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b6111ea5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74604482015260640161063a565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161121591906120d8565b60006040518083038185875af1925050503d8060008114611252576040519150601f19603f3d011682016040523d82523d6000602084013e611257565b606091505b5091509150816106ea57805160208201fd5b6108bf611531565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156112a9576112a483611647565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561132e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261132b91810190612093565b60015b6113a05760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146114355760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161063a565b506112a4838383611737565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146111ea5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000604482015260640161063a565b80156108bf5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d80600081146106ea576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061155c57503330145b6111ea5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e657200000000000000000000000000000000000000000000604482015260640161063a565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6116d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6117408361175c565b60008251118061174d5750805b156112a457610d6283836117a9565b61176581611647565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061092883836040518060600160405280602781526020016121466027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516117f391906120d8565b600060405180830381855af49150503d806000811461182e576040519150601f19603f3d011682016040523d82523d6000602084013e611833565b606091505b50915091506118448683838761184e565b9695505050505050565b606083156118ca5782516000036118c35773ffffffffffffffffffffffffffffffffffffffff85163b6118c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161063a565b50816118d4565b6118d483836118dc565b949350505050565b8151156118ec5781518083602001fd5b8060405162461bcd60e51b815260040161063a91906120f4565b60405180608001604052806004906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108bf57600080fd5b60008083601f84011261195857600080fd5b50813567ffffffffffffffff81111561197057600080fd5b60208301915083602082850101111561198857600080fd5b9250929050565b60008060008060008060008060c0898b0312156119ab57600080fd5b88356119b681611924565b975060208901356119c681611924565b965060408901356119d681611924565b955060608901359450608089013567ffffffffffffffff808211156119fa57600080fd5b611a068c838d01611946565b909650945060a08b0135915080821115611a1f57600080fd5b50611a2c8b828c01611946565b999c989b5096995094979396929594505050565b600060208284031215611a5257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461092857600080fd5b600080600080600060808688031215611a9a57600080fd5b8535611aa581611924565b94506020860135611ab581611924565b935060408601359250606086013567ffffffffffffffff811115611ad857600080fd5b611ae488828901611946565b969995985093965092949392505050565b60008083601f840112611b0757600080fd5b50813567ffffffffffffffff811115611b1f57600080fd5b6020830191508360208260051b850101111561198857600080fd5b60008060008060408587031215611b5057600080fd5b843567ffffffffffffffff80821115611b6857600080fd5b611b7488838901611af5565b90965094506020870135915080821115611b8d57600080fd5b50611b9a87828801611af5565b95989497509550505050565b600060208284031215611bb857600080fd5b813561092881611924565b600080600060608486031215611bd857600080fd5b833567ffffffffffffffff811115611bef57600080fd5b84016101608187031215611c0257600080fd5b95602085013595506040909401359392505050565b60008060408385031215611c2a57600080fd5b8235611c3581611924565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611cb957611cb9611c43565b604052919050565b60008060408385031215611cd457600080fd5b8235611cdf81611924565b915060208381013567ffffffffffffffff80821115611cfd57600080fd5b818601915086601f830112611d1157600080fd5b813581811115611d2357611d23611c43565b611d53847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c72565b91508082528784828501011115611d6957600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060008060608587031215611d9d57600080fd5b8435611da881611924565b935060208501359250604085013567ffffffffffffffff811115611dcb57600080fd5b611b9a87828801611946565b60008060008060008060008060a0898b031215611df357600080fd5b8835611dfe81611924565b97506020890135611e0e81611924565b9650604089013567ffffffffffffffff80821115611e2b57600080fd5b611e378c838d01611af5565b909850965060608b0135915080821115611e5057600080fd5b611e5c8c838d01611af5565b909650945060808b0135915080821115611a1f57600080fd5b60808101818360005b6004811015611e9d578151835260209283019290910190600101611e7e565b50505092915050565b600060808284031215611eb857600080fd5b82601f830112611ec757600080fd5b6040516080810181811067ffffffffffffffff82111715611eea57611eea611c43565b604052806080840185811115611eff57600080fd5b845b81811015611f19578035835260209283019201611f01565b509195945050505050565b60008060008060008060a08789031215611f3d57600080fd5b8635611f4881611924565b95506020870135611f5881611924565b94506040870135935060608701359250608087013567ffffffffffffffff811115611f8257600080fd5b611f8e89828a01611946565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261200457600080fd5b83018035915067ffffffffffffffff82111561201f57600080fd5b60200191503681900382131561198857600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156120a557600080fd5b5051919050565b60005b838110156120c75781810151838201526020016120af565b83811115610d625750506000910152565b600082516120ea8184602087016120ac565b9190910192915050565b60208152600082518060208401526121138160408501602087016120ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c6174ece9aa7a093b2d189b4c38248b1bffceada2cfe3a663a2f8614e59da33a64736f6c634300080f0033","opcodes":"PUSH1 0xE0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x23A4 CODESIZE SUB DUP1 PUSH3 0x23A4 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x21A2 PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x27D ADD MSTORE PUSH2 0x8EE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x3A4 ADD MSTORE DUP2 DUP2 PUSH2 0x931 ADD MSTORE DUP2 DUP2 PUSH2 0x9D8 ADD MSTORE DUP2 DUP2 PUSH2 0xDAE ADD MSTORE DUP2 DUP2 PUSH2 0xFE5 ADD MSTORE DUP2 DUP2 PUSH2 0x1155 ADD MSTORE DUP2 DUP2 PUSH2 0x1459 ADD MSTORE PUSH2 0x15FE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x708 ADD MSTORE DUP2 DUP2 PUSH2 0x79E ADD MSTORE DUP2 DUP2 PUSH2 0xA9C ADD MSTORE DUP2 DUP2 PUSH2 0xB32 ADD MSTORE PUSH2 0xC61 ADD MSTORE PUSH2 0x21A2 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x16D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x49C JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x465 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3C8 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x34D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0x122 JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2C4 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x153 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x174 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x198F JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C0 PUSH2 0x1BB CALLDATASIZE PUSH1 0x4 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x502 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A82 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B3A JUMP JUMPDEST PUSH2 0x5E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x2DF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0x6F1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0x2FF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC3 JUMP JUMPDEST PUSH2 0x8C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH2 0x19E PUSH2 0x92F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x335 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C17 JUMP JUMPDEST PUSH2 0x9CE JUMP JUMPDEST PUSH2 0x19E PUSH2 0x348 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CC1 JUMP JUMPDEST PUSH2 0xA85 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xC47 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x29F SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x29F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x3E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D87 JUMP JUMPDEST PUSH2 0xD19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x403 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DD7 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x43C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xD68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x460 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xE1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xF98 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x486 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48F PUSH2 0x1014 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1CC SWAP2 SWAP1 PUSH2 0x1E75 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EA6 JUMP JUMPDEST PUSH2 0x1029 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x4D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F24 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x595 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x5E1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5EF PUSH2 0x113D JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x643 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH2 0x6D8 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x663 JUMPI PUSH2 0x663 PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x678 SWAP2 SWAP1 PUSH2 0x1BA6 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x68C JUMPI PUSH2 0x68C PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x69E SWAP2 SWAP1 PUSH2 0x1FCF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6E2 DUP2 PUSH2 0x2034 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x646 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x79C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x811 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x89A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0x8A3 DUP2 PUSH2 0x1269 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x8BF SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1271 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8CC PUSH2 0x1441 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x928 DUP3 PUSH2 0x14C6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6EA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9D6 PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xBA5 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0xC37 DUP3 PUSH2 0x1269 JUMP JUMPDEST PUSH2 0xC43 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1271 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x113D JUMP JUMPDEST PUSH2 0xD62 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE1A SWAP2 SWAP1 PUSH2 0x2093 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE3F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE59 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE59 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xECB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF29 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 DUP3 PUSH2 0x15A8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC43 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDD9 JUMP JUMPDEST PUSH2 0x101C PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x1024 PUSH2 0x1906 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1049 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x1063 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1063 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10D5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1133 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 PUSH1 0x0 PUSH2 0x15A8 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x119E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1215 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1252 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1257 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x6EA JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x8BF PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x12A9 JUMPI PUSH2 0x12A4 DUP4 PUSH2 0x1647 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x132E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x132B SWAP2 DUP2 ADD SWAP1 PUSH2 0x2093 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x13A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1435 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH2 0x12A4 DUP4 DUP4 DUP4 PUSH2 0x1737 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8BF JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x6EA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x6EA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x155C JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x16D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1740 DUP4 PUSH2 0x175C JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x174D JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x12A4 JUMPI PUSH2 0xD62 DUP4 DUP4 PUSH2 0x17A9 JUMP JUMPDEST PUSH2 0x1765 DUP2 PUSH2 0x1647 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x928 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2146 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x17F3 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x182E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1833 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1844 DUP7 DUP4 DUP4 DUP8 PUSH2 0x184E JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x18CA JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x18C3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x18C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST POP DUP2 PUSH2 0x18D4 JUMP JUMPDEST PUSH2 0x18D4 DUP4 DUP4 PUSH2 0x18DC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x18EC JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x63A SWAP2 SWAP1 PUSH2 0x20F4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1958 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1970 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x19AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x19B6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x19C6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x19D6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A06 DUP13 DUP4 DUP14 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A2C DUP12 DUP3 DUP13 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1AA5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1AB5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE4 DUP9 DUP3 DUP10 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1B50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B74 DUP9 DUP4 DUP10 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x928 DUP2 PUSH2 0x1924 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1C02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C35 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1CB9 JUMPI PUSH2 0x1CB9 PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1CD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1CDF DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1D11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH2 0x1D23 PUSH2 0x1C43 JUMP JUMPDEST PUSH2 0x1D53 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1C72 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1D69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1DA8 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1946 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1DF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1DFE DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1E0E DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E37 DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1E50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E5C DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x1E9D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1E7E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1EC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1EEA JUMPI PUSH2 0x1EEA PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1EFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F19 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1F01 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1F3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1F48 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1F58 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F8E DUP10 DUP3 DUP11 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2004 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x201F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x208C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x20C7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x20AF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD62 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x20EA DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2113 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C6174E 0xCE SWAP11 0xA7 LOG0 SWAP4 0xB2 0xD1 DUP10 0xB4 0xC3 DUP3 BASEFEE 0xB1 0xBF 0xFC 0xEA 0xDA 0x2C INVALID GASPRICE PUSH7 0x3A2F8614E59DA3 GASPRICE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"488:966:90:-:0;;;1088:4:32;1045:48;;770:131:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1278:26:73;;;;844:12:90;1314:22:73;:20;:22::i;:::-;-1:-1:-1;;;;;;869:25:90::1;;::::0;-1:-1:-1;488:966:90;;5906:279:31;5974:13;;;;;;;5973:14;5965:66;;;;-1:-1:-1;;;5965:66:31;;802:2:111;5965:66:31;;;784:21:111;841:2;821:18;;;814:30;880:34;860:18;;;853:62;-1:-1:-1;;;931:18:111;;;924:37;978:19;;5965:66:31;;;;;;;;6045:12;;6060:15;6045:12;;;:30;6041:138;;;6091:12;:30;;-1:-1:-1;;6091:30:31;6106:15;6091:30;;;;;;6140:28;;1150:36:111;;;6140:28:31;;1138:2:111;1123:18;6140:28:31;;;;;;;6041:138;5906:279::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;1008:184::-;488:966:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_13870":{"entryPoint":null,"id":13870,"parameterSlots":0,"returnSlots":0},"@_authorizeUpgrade_14140":{"entryPoint":4713,"id":14140,"parameterSlots":1,"returnSlots":0},"@_call_14076":{"entryPoint":4588,"id":14076,"parameterSlots":3,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_initialize_13998":{"entryPoint":5544,"id":13998,"parameterSlots":1,"returnSlots":0},"@_onlyOwner_13904":{"entryPoint":5425,"id":13904,"parameterSlots":0,"returnSlots":0},"@_packValidationData_9942":{"entryPoint":null,"id":9942,"parameterSlots":1,"returnSlots":1},"@_payPrefund_7307":{"entryPoint":5318,"id":7307,"parameterSlots":1,"returnSlots":0},"@_requireFromEntryPointOrOwner_14019":{"entryPoint":4413,"id":14019,"parameterSlots":0,"returnSlots":0},"@_requireFromEntryPoint_7256":{"entryPoint":5185,"id":7256,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":6364,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":5703,"id":3050,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCallUUPS_3148":{"entryPoint":4721,"id":3148,"parameterSlots":3,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":5943,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":5980,"id":3065,"parameterSlots":1,"returnSlots":0},"@_validateNonce_7274":{"entryPoint":null,"id":7274,"parameterSlots":1,"returnSlots":0},"@_validateSignature_19089":{"entryPoint":null,"id":19089,"parameterSlots":2,"returnSlots":1},"@addDeposit_14109":{"entryPoint":2351,"id":14109,"parameterSlots":0,"returnSlots":0},"@aggregator_19027":{"entryPoint":null,"id":19027,"parameterSlots":0,"returnSlots":0},"@entryPoint_13866":{"entryPoint":null,"id":13866,"parameterSlots":0,"returnSlots":1},"@executeBatch_13970":{"entryPoint":1511,"id":13970,"parameterSlots":4,"returnSlots":0},"@execute_13924":{"entryPoint":3353,"id":13924,"parameterSlots":4,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":6057,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":null,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":null,"id":5258,"parameterSlots":1,"returnSlots":1},"@getBlsPublicKey_19107":{"entryPoint":4116,"id":19107,"parameterSlots":0,"returnSlots":1},"@getBooleanSlot_5269":{"entryPoint":null,"id":5269,"parameterSlots":1,"returnSlots":1},"@getDeposit_14092":{"entryPoint":3432,"id":14092,"parameterSlots":0,"returnSlots":1},"@getNonce_7198":{"entryPoint":3992,"id":7198,"parameterSlots":0,"returnSlots":1},"@initialize_13983":{"entryPoint":3615,"id":13983,"parameterSlots":1,"returnSlots":0},"@initialize_19065":{"entryPoint":4137,"id":19065,"parameterSlots":1,"returnSlots":0},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@owner_13838":{"entryPoint":null,"id":13838,"parameterSlots":0,"returnSlots":0},"@proxiableUUID_3609":{"entryPoint":3143,"id":3609,"parameterSlots":0,"returnSlots":1},"@supportsInterface_17936":{"entryPoint":1282,"id":17936,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"@upgradeToAndCall_3652":{"entryPoint":2693,"id":3652,"parameterSlots":2,"returnSlots":0},"@upgradeTo_3631":{"entryPoint":1777,"id":3631,"parameterSlots":1,"returnSlots":0},"@validateUserOp_7239":{"entryPoint":2242,"id":7239,"parameterSlots":3,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":6222,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawDepositTo_14127":{"entryPoint":2510,"id":14127,"parameterSlots":2,"returnSlots":0},"abi_decode_array_address_dyn_calldata":{"entryPoint":6901,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":6470,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address":{"entryPoint":7078,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7191,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":6543,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":7639,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":6786,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":7972,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":7361,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7559,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":6970,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr":{"entryPoint":7846,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes4":{"entryPoint":6720,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7107,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8339,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":8408,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":7797,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":8436,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8143,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_memory":{"entryPoint":7282,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":8364,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":8244,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x32":{"entryPoint":8096,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":7235,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":6436,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:20197:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"245:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"294:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"303:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"306:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"296:6:111"},"nodeType":"YulFunctionCall","src":"296:12:111"},"nodeType":"YulExpressionStatement","src":"296:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"273:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"281:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"269:3:111"},"nodeType":"YulFunctionCall","src":"269:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"288:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"265:3:111"},"nodeType":"YulFunctionCall","src":"265:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"258:6:111"},"nodeType":"YulFunctionCall","src":"258:35:111"},"nodeType":"YulIf","src":"255:55:111"},{"nodeType":"YulAssignment","src":"319:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"342:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"329:12:111"},"nodeType":"YulFunctionCall","src":"329:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"319:6:111"}]},{"body":{"nodeType":"YulBlock","src":"392:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"401:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"404:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"394:6:111"},"nodeType":"YulFunctionCall","src":"394:12:111"},"nodeType":"YulExpressionStatement","src":"394:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"364:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"372:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"361:2:111"},"nodeType":"YulFunctionCall","src":"361:30:111"},"nodeType":"YulIf","src":"358:50:111"},{"nodeType":"YulAssignment","src":"417:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"433:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"441:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"417:8:111"}]},{"body":{"nodeType":"YulBlock","src":"498:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"507:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"510:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"500:6:111"},"nodeType":"YulFunctionCall","src":"500:12:111"},"nodeType":"YulExpressionStatement","src":"500:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"469:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"477:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"465:3:111"},"nodeType":"YulFunctionCall","src":"465:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"461:3:111"},"nodeType":"YulFunctionCall","src":"461:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"493:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"458:2:111"},"nodeType":"YulFunctionCall","src":"458:39:111"},"nodeType":"YulIf","src":"455:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"208:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"216:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"224:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"234:6:111","type":""}],"src":"173:347:111"},{"body":{"nodeType":"YulBlock","src":"718:1012:111","statements":[{"body":{"nodeType":"YulBlock","src":"765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"767:6:111"},"nodeType":"YulFunctionCall","src":"767:12:111"},"nodeType":"YulExpressionStatement","src":"767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"735:3:111"},"nodeType":"YulFunctionCall","src":"735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"760:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"731:3:111"},"nodeType":"YulFunctionCall","src":"731:33:111"},"nodeType":"YulIf","src":"728:53:111"},{"nodeType":"YulVariableDeclaration","src":"790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"803:12:111"},"nodeType":"YulFunctionCall","src":"803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"860:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"835:24:111"},"nodeType":"YulFunctionCall","src":"835:31:111"},"nodeType":"YulExpressionStatement","src":"835:31:111"},{"nodeType":"YulAssignment","src":"875:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"875:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"899:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"927:3:111"},"nodeType":"YulFunctionCall","src":"927:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"914:12:111"},"nodeType":"YulFunctionCall","src":"914:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"903:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"980:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"955:24:111"},"nodeType":"YulFunctionCall","src":"955:33:111"},"nodeType":"YulExpressionStatement","src":"955:33:111"},{"nodeType":"YulAssignment","src":"997:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1007:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1023:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1066:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1051:3:111"},"nodeType":"YulFunctionCall","src":"1051:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1038:12:111"},"nodeType":"YulFunctionCall","src":"1038:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1027:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1104:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1079:24:111"},"nodeType":"YulFunctionCall","src":"1079:33:111"},"nodeType":"YulExpressionStatement","src":"1079:33:111"},{"nodeType":"YulAssignment","src":"1121:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1131:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1121:6:111"}]},{"nodeType":"YulAssignment","src":"1147:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1170:3:111"},"nodeType":"YulFunctionCall","src":"1170:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1157:12:111"},"nodeType":"YulFunctionCall","src":"1157:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1147:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1198:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1240:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1225:3:111"},"nodeType":"YulFunctionCall","src":"1225:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1212:12:111"},"nodeType":"YulFunctionCall","src":"1212:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1202:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:14:111"},"nodeType":"YulIf","src":"1291:34:111"},{"nodeType":"YulVariableDeclaration","src":"1334:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1390:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1401:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1386:3:111"},"nodeType":"YulFunctionCall","src":"1386:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1410:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1360:25:111"},"nodeType":"YulFunctionCall","src":"1360:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1338:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1348:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1427:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1437:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1427:6:111"}]},{"nodeType":"YulAssignment","src":"1454:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1464:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1454:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1481:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1525:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1510:3:111"},"nodeType":"YulFunctionCall","src":"1510:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1497:12:111"},"nodeType":"YulFunctionCall","src":"1497:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1485:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1561:6:111"},"nodeType":"YulFunctionCall","src":"1561:12:111"},"nodeType":"YulExpressionStatement","src":"1561:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1545:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1555:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1542:2:111"},"nodeType":"YulFunctionCall","src":"1542:16:111"},"nodeType":"YulIf","src":"1539:36:111"},{"nodeType":"YulVariableDeclaration","src":"1584:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1640:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1651:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1636:3:111"},"nodeType":"YulFunctionCall","src":"1636:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1662:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1610:25:111"},"nodeType":"YulFunctionCall","src":"1610:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1588:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1598:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1679:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1689:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1679:6:111"}]},{"nodeType":"YulAssignment","src":"1706:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1716:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1706:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"628:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"639:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"651:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"659:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"667:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"675:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"683:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"691:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"699:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"707:6:111","type":""}],"src":"525:1205:111"},{"body":{"nodeType":"YulBlock","src":"1804:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1850:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1859:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1862:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1852:6:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"nodeType":"YulExpressionStatement","src":"1852:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1825:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1834:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1821:3:111"},"nodeType":"YulFunctionCall","src":"1821:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1846:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1817:3:111"},"nodeType":"YulFunctionCall","src":"1817:32:111"},"nodeType":"YulIf","src":"1814:52:111"},{"nodeType":"YulVariableDeclaration","src":"1875:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1901:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1888:12:111"},"nodeType":"YulFunctionCall","src":"1888:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1879:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2021:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2030:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2033:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2023:6:111"},"nodeType":"YulFunctionCall","src":"2023:12:111"},"nodeType":"YulExpressionStatement","src":"2023:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1933:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1944:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1951:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1940:3:111"},"nodeType":"YulFunctionCall","src":"1940:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:97:111"},"nodeType":"YulIf","src":"1920:117:111"},{"nodeType":"YulAssignment","src":"2046:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2056:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2046:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1770:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1781:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1793:6:111","type":""}],"src":"1735:332:111"},{"body":{"nodeType":"YulBlock","src":"2167:92:111","statements":[{"nodeType":"YulAssignment","src":"2177:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2200:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2185:3:111"},"nodeType":"YulFunctionCall","src":"2185:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2177:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2219:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2244:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2237:6:111"},"nodeType":"YulFunctionCall","src":"2237:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2230:6:111"},"nodeType":"YulFunctionCall","src":"2230:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2212:6:111"},"nodeType":"YulFunctionCall","src":"2212:41:111"},"nodeType":"YulExpressionStatement","src":"2212:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2136:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2147:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2158:4:111","type":""}],"src":"2072:187:111"},{"body":{"nodeType":"YulBlock","src":"2404:614:111","statements":[{"body":{"nodeType":"YulBlock","src":"2451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2453:6:111"},"nodeType":"YulFunctionCall","src":"2453:12:111"},"nodeType":"YulExpressionStatement","src":"2453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2425:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2421:3:111"},"nodeType":"YulFunctionCall","src":"2421:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2446:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:33:111"},"nodeType":"YulIf","src":"2414:53:111"},{"nodeType":"YulVariableDeclaration","src":"2476:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2502:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2489:12:111"},"nodeType":"YulFunctionCall","src":"2489:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2480:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2546:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2521:24:111"},"nodeType":"YulFunctionCall","src":"2521:31:111"},"nodeType":"YulExpressionStatement","src":"2521:31:111"},{"nodeType":"YulAssignment","src":"2561:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2561:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2585:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2617:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2628:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2600:12:111"},"nodeType":"YulFunctionCall","src":"2600:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2589:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2666:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2641:24:111"},"nodeType":"YulFunctionCall","src":"2641:33:111"},"nodeType":"YulExpressionStatement","src":"2641:33:111"},{"nodeType":"YulAssignment","src":"2683:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2693:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2683:6:111"}]},{"nodeType":"YulAssignment","src":"2709:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2736:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2719:12:111"},"nodeType":"YulFunctionCall","src":"2719:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2760:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2802:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2787:3:111"},"nodeType":"YulFunctionCall","src":"2787:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2774:12:111"},"nodeType":"YulFunctionCall","src":"2774:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2764:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2821:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2829:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2818:2:111"},"nodeType":"YulFunctionCall","src":"2818:30:111"},"nodeType":"YulIf","src":"2815:50:111"},{"nodeType":"YulVariableDeclaration","src":"2874:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2930:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2941:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2926:3:111"},"nodeType":"YulFunctionCall","src":"2926:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2950:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2900:25:111"},"nodeType":"YulFunctionCall","src":"2900:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2878:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2888:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2967:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2977:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2967:6:111"}]},{"nodeType":"YulAssignment","src":"2994:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"3004:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2994:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2338:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2349:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2369:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2377:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2385:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2393:6:111","type":""}],"src":"2264:754:111"},{"body":{"nodeType":"YulBlock","src":"3122:149:111","statements":[{"nodeType":"YulAssignment","src":"3132:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3140:3:111"},"nodeType":"YulFunctionCall","src":"3140:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3132:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3174:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3197:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3185:3:111"},"nodeType":"YulFunctionCall","src":"3185:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:98:111"},"nodeType":"YulExpressionStatement","src":"3167:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3091:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3102:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3113:4:111","type":""}],"src":"3023:248:111"},{"body":{"nodeType":"YulBlock","src":"3360:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:12:111"},"nodeType":"YulExpressionStatement","src":"3411:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3396:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3403:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:35:111"},"nodeType":"YulIf","src":"3370:55:111"},{"nodeType":"YulAssignment","src":"3434:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3457:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3444:12:111"},"nodeType":"YulFunctionCall","src":"3444:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3434:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3509:6:111"},"nodeType":"YulFunctionCall","src":"3509:12:111"},"nodeType":"YulExpressionStatement","src":"3509:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3476:2:111"},"nodeType":"YulFunctionCall","src":"3476:30:111"},"nodeType":"YulIf","src":"3473:50:111"},{"nodeType":"YulAssignment","src":"3532:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3544:3:111"},"nodeType":"YulFunctionCall","src":"3544:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3532:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3623:6:111"},"nodeType":"YulFunctionCall","src":"3623:12:111"},"nodeType":"YulExpressionStatement","src":"3623:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3584:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3596:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3599:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3609:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3576:3:111"},"nodeType":"YulFunctionCall","src":"3576:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3616:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3573:2:111"},"nodeType":"YulFunctionCall","src":"3573:47:111"},"nodeType":"YulIf","src":"3570:67:111"}]},"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3323:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3331:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3339:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3349:6:111","type":""}],"src":"3276:367:111"},{"body":{"nodeType":"YulBlock","src":"3816:616:111","statements":[{"body":{"nodeType":"YulBlock","src":"3862:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3874:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3864:6:111"},"nodeType":"YulFunctionCall","src":"3864:12:111"},"nodeType":"YulExpressionStatement","src":"3864:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3837:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3846:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3833:3:111"},"nodeType":"YulFunctionCall","src":"3833:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3829:3:111"},"nodeType":"YulFunctionCall","src":"3829:32:111"},"nodeType":"YulIf","src":"3826:52:111"},{"nodeType":"YulVariableDeclaration","src":"3887:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3914:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3901:12:111"},"nodeType":"YulFunctionCall","src":"3901:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3891:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3933:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3943:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3937:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3988:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3997:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4000:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3990:6:111"},"nodeType":"YulFunctionCall","src":"3990:12:111"},"nodeType":"YulExpressionStatement","src":"3990:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3976:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3984:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3973:2:111"},"nodeType":"YulFunctionCall","src":"3973:14:111"},"nodeType":"YulIf","src":"3970:34:111"},{"nodeType":"YulVariableDeclaration","src":"4013:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4081:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4092:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4077:3:111"},"nodeType":"YulFunctionCall","src":"4077:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4101:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4039:37:111"},"nodeType":"YulFunctionCall","src":"4039:70:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"4017:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"4027:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4118:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"4128:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4118:6:111"}]},{"nodeType":"YulAssignment","src":"4145:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4155:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4172:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4201:3:111"},"nodeType":"YulFunctionCall","src":"4201:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4188:12:111"},"nodeType":"YulFunctionCall","src":"4188:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4176:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4251:6:111"},"nodeType":"YulFunctionCall","src":"4251:12:111"},"nodeType":"YulExpressionStatement","src":"4251:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4235:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4245:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4232:2:111"},"nodeType":"YulFunctionCall","src":"4232:16:111"},"nodeType":"YulIf","src":"4229:36:111"},{"nodeType":"YulVariableDeclaration","src":"4274:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4353:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4338:3:111"},"nodeType":"YulFunctionCall","src":"4338:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4364:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4300:37:111"},"nodeType":"YulFunctionCall","src":"4300:72:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4278:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4288:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4381:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4391:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4381:6:111"}]},{"nodeType":"YulAssignment","src":"4408:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4418:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4408:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3758:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3769:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3781:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3789:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3797:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3805:6:111","type":""}],"src":"3648:784:111"},{"body":{"nodeType":"YulBlock","src":"4538:125:111","statements":[{"nodeType":"YulAssignment","src":"4548:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4560:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4571:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4556:3:111"},"nodeType":"YulFunctionCall","src":"4556:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4548:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4590:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4605:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4613:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4601:3:111"},"nodeType":"YulFunctionCall","src":"4601:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4583:6:111"},"nodeType":"YulFunctionCall","src":"4583:74:111"},"nodeType":"YulExpressionStatement","src":"4583:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4507:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4518:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4529:4:111","type":""}],"src":"4437:226:111"},{"body":{"nodeType":"YulBlock","src":"4738:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4784:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4793:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4796:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4786:6:111"},"nodeType":"YulFunctionCall","src":"4786:12:111"},"nodeType":"YulExpressionStatement","src":"4786:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4759:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4768:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4755:3:111"},"nodeType":"YulFunctionCall","src":"4755:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4780:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4751:3:111"},"nodeType":"YulFunctionCall","src":"4751:32:111"},"nodeType":"YulIf","src":"4748:52:111"},{"nodeType":"YulVariableDeclaration","src":"4809:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4835:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4822:12:111"},"nodeType":"YulFunctionCall","src":"4822:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4813:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4879:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4854:24:111"},"nodeType":"YulFunctionCall","src":"4854:31:111"},"nodeType":"YulExpressionStatement","src":"4854:31:111"},{"nodeType":"YulAssignment","src":"4894:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4904:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4894:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4704:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4715:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4727:6:111","type":""}],"src":"4668:247:111"},{"body":{"nodeType":"YulBlock","src":"5058:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5106:6:111"},"nodeType":"YulFunctionCall","src":"5106:12:111"},"nodeType":"YulExpressionStatement","src":"5106:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5079:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5088:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5075:3:111"},"nodeType":"YulFunctionCall","src":"5075:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5100:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5071:3:111"},"nodeType":"YulFunctionCall","src":"5071:32:111"},"nodeType":"YulIf","src":"5068:52:111"},{"nodeType":"YulVariableDeclaration","src":"5129:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5156:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5143:12:111"},"nodeType":"YulFunctionCall","src":"5143:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5133:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5209:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5218:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5221:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5211:6:111"},"nodeType":"YulFunctionCall","src":"5211:12:111"},"nodeType":"YulExpressionStatement","src":"5211:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5181:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5189:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5178:2:111"},"nodeType":"YulFunctionCall","src":"5178:30:111"},"nodeType":"YulIf","src":"5175:50:111"},{"nodeType":"YulVariableDeclaration","src":"5234:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5248:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5259:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5244:3:111"},"nodeType":"YulFunctionCall","src":"5244:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5238:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5305:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5314:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5317:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5307:6:111"},"nodeType":"YulFunctionCall","src":"5307:12:111"},"nodeType":"YulExpressionStatement","src":"5307:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5286:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5295:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5282:3:111"},"nodeType":"YulFunctionCall","src":"5282:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5300:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5278:3:111"},"nodeType":"YulFunctionCall","src":"5278:26:111"},"nodeType":"YulIf","src":"5275:46:111"},{"nodeType":"YulAssignment","src":"5330:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5340:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5330:6:111"}]},{"nodeType":"YulAssignment","src":"5351:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5378:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5389:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5374:3:111"},"nodeType":"YulFunctionCall","src":"5374:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5361:12:111"},"nodeType":"YulFunctionCall","src":"5361:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5351:6:111"}]},{"nodeType":"YulAssignment","src":"5402:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5440:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5425:3:111"},"nodeType":"YulFunctionCall","src":"5425:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5412:12:111"},"nodeType":"YulFunctionCall","src":"5412:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5402:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5008:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5019:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5031:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5039:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5047:6:111","type":""}],"src":"4920:530:111"},{"body":{"nodeType":"YulBlock","src":"5556:76:111","statements":[{"nodeType":"YulAssignment","src":"5566:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5578:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5589:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5574:3:111"},"nodeType":"YulFunctionCall","src":"5574:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5566:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5608:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5619:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5601:6:111"},"nodeType":"YulFunctionCall","src":"5601:25:111"},"nodeType":"YulExpressionStatement","src":"5601:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5525:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5536:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5547:4:111","type":""}],"src":"5455:177:111"},{"body":{"nodeType":"YulBlock","src":"5732:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"5778:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5787:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5790:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5780:6:111"},"nodeType":"YulFunctionCall","src":"5780:12:111"},"nodeType":"YulExpressionStatement","src":"5780:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5753:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5762:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5749:3:111"},"nodeType":"YulFunctionCall","src":"5749:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5774:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5745:3:111"},"nodeType":"YulFunctionCall","src":"5745:32:111"},"nodeType":"YulIf","src":"5742:52:111"},{"nodeType":"YulVariableDeclaration","src":"5803:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5829:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5816:12:111"},"nodeType":"YulFunctionCall","src":"5816:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5807:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5873:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"5848:24:111"},"nodeType":"YulFunctionCall","src":"5848:31:111"},"nodeType":"YulExpressionStatement","src":"5848:31:111"},{"nodeType":"YulAssignment","src":"5888:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5898:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5888:6:111"}]},{"nodeType":"YulAssignment","src":"5912:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5939:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5950:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5935:3:111"},"nodeType":"YulFunctionCall","src":"5935:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5922:12:111"},"nodeType":"YulFunctionCall","src":"5922:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5912:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5690:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5701:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5713:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5721:6:111","type":""}],"src":"5637:323:111"},{"body":{"nodeType":"YulBlock","src":"5997:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6017:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6007:6:111"},"nodeType":"YulFunctionCall","src":"6007:88:111"},"nodeType":"YulExpressionStatement","src":"6007:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6111:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6114:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6104:6:111"},"nodeType":"YulFunctionCall","src":"6104:15:111"},"nodeType":"YulExpressionStatement","src":"6104:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6135:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6138:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6128:6:111"},"nodeType":"YulFunctionCall","src":"6128:15:111"},"nodeType":"YulExpressionStatement","src":"6128:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"5965:184:111"},{"body":{"nodeType":"YulBlock","src":"6199:289:111","statements":[{"nodeType":"YulAssignment","src":"6209:19:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6225:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6219:5:111"},"nodeType":"YulFunctionCall","src":"6219:9:111"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6209:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6237:117:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6259:6:111"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"6275:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"6281:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6271:3:111"},"nodeType":"YulFunctionCall","src":"6271:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"6286:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6267:3:111"},"nodeType":"YulFunctionCall","src":"6267:86:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6255:3:111"},"nodeType":"YulFunctionCall","src":"6255:99:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"6241:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6429:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6431:16:111"},"nodeType":"YulFunctionCall","src":"6431:18:111"},"nodeType":"YulExpressionStatement","src":"6431:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6372:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"6384:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6369:2:111"},"nodeType":"YulFunctionCall","src":"6369:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6408:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"6420:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6405:2:111"},"nodeType":"YulFunctionCall","src":"6405:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"6366:2:111"},"nodeType":"YulFunctionCall","src":"6366:62:111"},"nodeType":"YulIf","src":"6363:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6467:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6471:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6460:6:111"},"nodeType":"YulFunctionCall","src":"6460:22:111"},"nodeType":"YulExpressionStatement","src":"6460:22:111"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"6179:4:111","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"6188:6:111","type":""}],"src":"6154:334:111"},{"body":{"nodeType":"YulBlock","src":"6589:861:111","statements":[{"body":{"nodeType":"YulBlock","src":"6635:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6644:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6647:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6637:6:111"},"nodeType":"YulFunctionCall","src":"6637:12:111"},"nodeType":"YulExpressionStatement","src":"6637:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6610:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6619:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6606:3:111"},"nodeType":"YulFunctionCall","src":"6606:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6631:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6602:3:111"},"nodeType":"YulFunctionCall","src":"6602:32:111"},"nodeType":"YulIf","src":"6599:52:111"},{"nodeType":"YulVariableDeclaration","src":"6660:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6686:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6673:12:111"},"nodeType":"YulFunctionCall","src":"6673:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6664:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6730:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6705:24:111"},"nodeType":"YulFunctionCall","src":"6705:31:111"},"nodeType":"YulExpressionStatement","src":"6705:31:111"},{"nodeType":"YulAssignment","src":"6745:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6755:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6745:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6769:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6779:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6773:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6790:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6821:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6832:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6817:3:111"},"nodeType":"YulFunctionCall","src":"6817:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6804:12:111"},"nodeType":"YulFunctionCall","src":"6804:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6794:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6845:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6855:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6849:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6900:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6909:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6912:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6902:6:111"},"nodeType":"YulFunctionCall","src":"6902:12:111"},"nodeType":"YulExpressionStatement","src":"6902:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6888:6:111"},{"name":"_2","nodeType":"YulIdentifier","src":"6896:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6885:2:111"},"nodeType":"YulFunctionCall","src":"6885:14:111"},"nodeType":"YulIf","src":"6882:34:111"},{"nodeType":"YulVariableDeclaration","src":"6925:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6939:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6950:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6935:3:111"},"nodeType":"YulFunctionCall","src":"6935:22:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6929:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7005:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7017:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7007:6:111"},"nodeType":"YulFunctionCall","src":"7007:12:111"},"nodeType":"YulExpressionStatement","src":"7007:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6984:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6988:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6980:3:111"},"nodeType":"YulFunctionCall","src":"6980:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6995:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6976:3:111"},"nodeType":"YulFunctionCall","src":"6976:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6969:6:111"},"nodeType":"YulFunctionCall","src":"6969:35:111"},"nodeType":"YulIf","src":"6966:55:111"},{"nodeType":"YulVariableDeclaration","src":"7030:26:111","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"7053:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7040:12:111"},"nodeType":"YulFunctionCall","src":"7040:16:111"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"7034:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7079:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"7081:16:111"},"nodeType":"YulFunctionCall","src":"7081:18:111"},"nodeType":"YulExpressionStatement","src":"7081:18:111"}]},"condition":{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"7071:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"7075:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7068:2:111"},"nodeType":"YulFunctionCall","src":"7068:10:111"},"nodeType":"YulIf","src":"7065:36:111"},{"nodeType":"YulVariableDeclaration","src":"7110:125:111","value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"7151:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"7155:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7147:3:111"},"nodeType":"YulFunctionCall","src":"7147:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"7162:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7143:3:111"},"nodeType":"YulFunctionCall","src":"7143:86:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7231:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7139:3:111"},"nodeType":"YulFunctionCall","src":"7139:95:111"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"7123:15:111"},"nodeType":"YulFunctionCall","src":"7123:112:111"},"variables":[{"name":"array","nodeType":"YulTypedName","src":"7114:5:111","type":""}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"7251:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"7258:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7244:6:111"},"nodeType":"YulFunctionCall","src":"7244:17:111"},"nodeType":"YulExpressionStatement","src":"7244:17:111"},{"body":{"nodeType":"YulBlock","src":"7307:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7316:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7319:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7309:6:111"},"nodeType":"YulFunctionCall","src":"7309:12:111"},"nodeType":"YulExpressionStatement","src":"7309:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"7284:2:111"},{"name":"_4","nodeType":"YulIdentifier","src":"7288:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7280:3:111"},"nodeType":"YulFunctionCall","src":"7280:11:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7293:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7276:3:111"},"nodeType":"YulFunctionCall","src":"7276:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7298:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7273:2:111"},"nodeType":"YulFunctionCall","src":"7273:33:111"},"nodeType":"YulIf","src":"7270:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"7349:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7356:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7345:3:111"},"nodeType":"YulFunctionCall","src":"7345:14:111"},{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"7365:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7369:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7361:3:111"},"nodeType":"YulFunctionCall","src":"7361:11:111"},{"name":"_4","nodeType":"YulIdentifier","src":"7374:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"7332:12:111"},"nodeType":"YulFunctionCall","src":"7332:45:111"},"nodeType":"YulExpressionStatement","src":"7332:45:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"7401:5:111"},{"name":"_4","nodeType":"YulIdentifier","src":"7408:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7397:3:111"},"nodeType":"YulFunctionCall","src":"7397:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"7413:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7393:3:111"},"nodeType":"YulFunctionCall","src":"7393:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7418:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7386:6:111"},"nodeType":"YulFunctionCall","src":"7386:34:111"},"nodeType":"YulExpressionStatement","src":"7386:34:111"},{"nodeType":"YulAssignment","src":"7429:15:111","value":{"name":"array","nodeType":"YulIdentifier","src":"7439:5:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7429:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6547:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6558:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6570:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6578:6:111","type":""}],"src":"6493:957:111"},{"body":{"nodeType":"YulBlock","src":"7556:76:111","statements":[{"nodeType":"YulAssignment","src":"7566:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7578:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7589:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7574:3:111"},"nodeType":"YulFunctionCall","src":"7574:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7566:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7608:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7619:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7601:6:111"},"nodeType":"YulFunctionCall","src":"7601:25:111"},"nodeType":"YulExpressionStatement","src":"7601:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7525:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7536:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7547:4:111","type":""}],"src":"7455:177:111"},{"body":{"nodeType":"YulBlock","src":"7759:125:111","statements":[{"nodeType":"YulAssignment","src":"7769:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7781:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7792:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7777:3:111"},"nodeType":"YulFunctionCall","src":"7777:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7769:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7811:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7826:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7834:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7822:3:111"},"nodeType":"YulFunctionCall","src":"7822:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7804:6:111"},"nodeType":"YulFunctionCall","src":"7804:74:111"},"nodeType":"YulExpressionStatement","src":"7804:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7728:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7739:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7750:4:111","type":""}],"src":"7637:247:111"},{"body":{"nodeType":"YulBlock","src":"8012:489:111","statements":[{"body":{"nodeType":"YulBlock","src":"8058:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8067:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8070:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8060:6:111"},"nodeType":"YulFunctionCall","src":"8060:12:111"},"nodeType":"YulExpressionStatement","src":"8060:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8033:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8042:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8029:3:111"},"nodeType":"YulFunctionCall","src":"8029:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8054:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8025:3:111"},"nodeType":"YulFunctionCall","src":"8025:32:111"},"nodeType":"YulIf","src":"8022:52:111"},{"nodeType":"YulVariableDeclaration","src":"8083:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8109:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8096:12:111"},"nodeType":"YulFunctionCall","src":"8096:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8087:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8153:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8128:24:111"},"nodeType":"YulFunctionCall","src":"8128:31:111"},"nodeType":"YulExpressionStatement","src":"8128:31:111"},{"nodeType":"YulAssignment","src":"8168:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8178:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8168:6:111"}]},{"nodeType":"YulAssignment","src":"8192:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8219:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8230:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8215:3:111"},"nodeType":"YulFunctionCall","src":"8215:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8202:12:111"},"nodeType":"YulFunctionCall","src":"8202:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8192:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8243:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8285:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8270:3:111"},"nodeType":"YulFunctionCall","src":"8270:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8257:12:111"},"nodeType":"YulFunctionCall","src":"8257:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8247:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8332:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8341:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8344:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8334:6:111"},"nodeType":"YulFunctionCall","src":"8334:12:111"},"nodeType":"YulExpressionStatement","src":"8334:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8304:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8312:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8301:2:111"},"nodeType":"YulFunctionCall","src":"8301:30:111"},"nodeType":"YulIf","src":"8298:50:111"},{"nodeType":"YulVariableDeclaration","src":"8357:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8413:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8424:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8409:3:111"},"nodeType":"YulFunctionCall","src":"8409:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8433:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8383:25:111"},"nodeType":"YulFunctionCall","src":"8383:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8361:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"8371:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8450:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"8460:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8450:6:111"}]},{"nodeType":"YulAssignment","src":"8477:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"8487:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8477:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7954:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7965:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7977:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7985:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7993:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8001:6:111","type":""}],"src":"7889:612:111"},{"body":{"nodeType":"YulBlock","src":"8733:1111:111","statements":[{"body":{"nodeType":"YulBlock","src":"8780:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8789:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8792:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8782:6:111"},"nodeType":"YulFunctionCall","src":"8782:12:111"},"nodeType":"YulExpressionStatement","src":"8782:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8754:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8763:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8750:3:111"},"nodeType":"YulFunctionCall","src":"8750:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8775:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8746:3:111"},"nodeType":"YulFunctionCall","src":"8746:33:111"},"nodeType":"YulIf","src":"8743:53:111"},{"nodeType":"YulVariableDeclaration","src":"8805:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8831:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8818:12:111"},"nodeType":"YulFunctionCall","src":"8818:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8809:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8875:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8850:24:111"},"nodeType":"YulFunctionCall","src":"8850:31:111"},"nodeType":"YulExpressionStatement","src":"8850:31:111"},{"nodeType":"YulAssignment","src":"8890:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8900:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8890:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8914:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8946:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8957:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8942:3:111"},"nodeType":"YulFunctionCall","src":"8942:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8929:12:111"},"nodeType":"YulFunctionCall","src":"8929:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"8918:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"8995:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8970:24:111"},"nodeType":"YulFunctionCall","src":"8970:33:111"},"nodeType":"YulExpressionStatement","src":"8970:33:111"},{"nodeType":"YulAssignment","src":"9012:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"9022:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9012:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9038:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9069:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9080:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9065:3:111"},"nodeType":"YulFunctionCall","src":"9065:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9052:12:111"},"nodeType":"YulFunctionCall","src":"9052:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9042:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9093:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9103:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9097:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9148:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9157:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9160:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9150:6:111"},"nodeType":"YulFunctionCall","src":"9150:12:111"},"nodeType":"YulExpressionStatement","src":"9150:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9136:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9144:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9133:2:111"},"nodeType":"YulFunctionCall","src":"9133:14:111"},"nodeType":"YulIf","src":"9130:34:111"},{"nodeType":"YulVariableDeclaration","src":"9173:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9241:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9252:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9237:3:111"},"nodeType":"YulFunctionCall","src":"9237:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9261:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9199:37:111"},"nodeType":"YulFunctionCall","src":"9199:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"9177:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9187:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9278:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"9288:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9278:6:111"}]},{"nodeType":"YulAssignment","src":"9305:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9315:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9305:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9332:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9365:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9376:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9361:3:111"},"nodeType":"YulFunctionCall","src":"9361:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9348:12:111"},"nodeType":"YulFunctionCall","src":"9348:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"9336:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9411:6:111"},"nodeType":"YulFunctionCall","src":"9411:12:111"},"nodeType":"YulExpressionStatement","src":"9411:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"9395:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9405:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9392:2:111"},"nodeType":"YulFunctionCall","src":"9392:16:111"},"nodeType":"YulIf","src":"9389:36:111"},{"nodeType":"YulVariableDeclaration","src":"9434:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9502:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"9513:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9498:3:111"},"nodeType":"YulFunctionCall","src":"9498:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9524:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9460:37:111"},"nodeType":"YulFunctionCall","src":"9460:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"9438:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"9448:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9541:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9551:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9541:6:111"}]},{"nodeType":"YulAssignment","src":"9568:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"9578:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"9568:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9595:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9628:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9639:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9624:3:111"},"nodeType":"YulFunctionCall","src":"9624:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9611:12:111"},"nodeType":"YulFunctionCall","src":"9611:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"9599:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9673:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9682:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9685:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9675:6:111"},"nodeType":"YulFunctionCall","src":"9675:12:111"},"nodeType":"YulExpressionStatement","src":"9675:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"9659:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9669:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9656:2:111"},"nodeType":"YulFunctionCall","src":"9656:16:111"},"nodeType":"YulIf","src":"9653:36:111"},{"nodeType":"YulVariableDeclaration","src":"9698:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9754:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"9765:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9750:3:111"},"nodeType":"YulFunctionCall","src":"9750:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9776:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9724:25:111"},"nodeType":"YulFunctionCall","src":"9724:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"9702:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"9712:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9793:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"9803:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"9793:6:111"}]},{"nodeType":"YulAssignment","src":"9820:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"9830:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"9820:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8643:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8654:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8666:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8674:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8682:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8690:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8698:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"8706:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"8714:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"8722:6:111","type":""}],"src":"8506:1338:111"},{"body":{"nodeType":"YulBlock","src":"9996:348:111","statements":[{"nodeType":"YulAssignment","src":"10006:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10018:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10029:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10014:3:111"},"nodeType":"YulFunctionCall","src":"10014:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10006:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"10042:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"10053:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"10046:3:111","type":""}]},{"nodeType":"YulAssignment","src":"10071:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"10078:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"10071:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"10096:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"10110:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"10100:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10125:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10134:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"10129:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10191:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10212:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10223:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10217:5:111"},"nodeType":"YulFunctionCall","src":"10217:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10205:6:111"},"nodeType":"YulFunctionCall","src":"10205:26:111"},"nodeType":"YulExpressionStatement","src":"10205:26:111"},{"nodeType":"YulVariableDeclaration","src":"10244:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10254:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"10248:2:111","type":""}]},{"nodeType":"YulAssignment","src":"10271:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"10282:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10287:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10278:3:111"},"nodeType":"YulFunctionCall","src":"10278:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"10271:3:111"}]},{"nodeType":"YulAssignment","src":"10303:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10317:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"10325:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10313:3:111"},"nodeType":"YulFunctionCall","src":"10313:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"10303:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"10155:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"10158:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"10152:2:111"},"nodeType":"YulFunctionCall","src":"10152:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"10164:18:111","statements":[{"nodeType":"YulAssignment","src":"10166:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"10175:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"10178:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10171:3:111"},"nodeType":"YulFunctionCall","src":"10171:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"10166:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"10148:3:111","statements":[]},"src":"10144:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9965:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9976:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9987:4:111","type":""}],"src":"9849:495:111"},{"body":{"nodeType":"YulBlock","src":"10442:668:111","statements":[{"body":{"nodeType":"YulBlock","src":"10489:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10498:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10501:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10491:6:111"},"nodeType":"YulFunctionCall","src":"10491:12:111"},"nodeType":"YulExpressionStatement","src":"10491:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10463:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10472:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10459:3:111"},"nodeType":"YulFunctionCall","src":"10459:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10484:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10455:3:111"},"nodeType":"YulFunctionCall","src":"10455:33:111"},"nodeType":"YulIf","src":"10452:53:111"},{"body":{"nodeType":"YulBlock","src":"10560:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10569:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10572:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10562:6:111"},"nodeType":"YulFunctionCall","src":"10562:12:111"},"nodeType":"YulExpressionStatement","src":"10562:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10532:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10543:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10528:3:111"},"nodeType":"YulFunctionCall","src":"10528:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10550:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10524:3:111"},"nodeType":"YulFunctionCall","src":"10524:34:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10517:6:111"},"nodeType":"YulFunctionCall","src":"10517:42:111"},"nodeType":"YulIf","src":"10514:62:111"},{"nodeType":"YulVariableDeclaration","src":"10585:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10605:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10599:5:111"},"nodeType":"YulFunctionCall","src":"10599:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"10589:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10617:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"10639:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10647:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10635:3:111"},"nodeType":"YulFunctionCall","src":"10635:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"10621:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10726:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"10728:16:111"},"nodeType":"YulFunctionCall","src":"10728:18:111"},"nodeType":"YulExpressionStatement","src":"10728:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"10669:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"10681:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10666:2:111"},"nodeType":"YulFunctionCall","src":"10666:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"10705:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"10717:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"10702:2:111"},"nodeType":"YulFunctionCall","src":"10702:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"10663:2:111"},"nodeType":"YulFunctionCall","src":"10663:62:111"},"nodeType":"YulIf","src":"10660:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10764:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"10768:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10757:6:111"},"nodeType":"YulFunctionCall","src":"10757:22:111"},"nodeType":"YulExpressionStatement","src":"10757:22:111"},{"nodeType":"YulVariableDeclaration","src":"10788:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"10799:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"10792:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10814:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10832:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10843:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10828:3:111"},"nodeType":"YulFunctionCall","src":"10828:19:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"10818:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10879:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10888:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10891:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10881:6:111"},"nodeType":"YulFunctionCall","src":"10881:12:111"},"nodeType":"YulExpressionStatement","src":"10881:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"10862:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10870:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10859:2:111"},"nodeType":"YulFunctionCall","src":"10859:19:111"},"nodeType":"YulIf","src":"10856:39:111"},{"nodeType":"YulVariableDeclaration","src":"10904:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"10915:9:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"10908:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10991:88:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11012:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"11030:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11017:12:111"},"nodeType":"YulFunctionCall","src":"11017:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11005:6:111"},"nodeType":"YulFunctionCall","src":"11005:30:111"},"nodeType":"YulExpressionStatement","src":"11005:30:111"},{"nodeType":"YulAssignment","src":"11048:21:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"11059:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"11064:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11055:3:111"},"nodeType":"YulFunctionCall","src":"11055:14:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"11048:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"10944:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"10949:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"10941:2:111"},"nodeType":"YulFunctionCall","src":"10941:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"10957:25:111","statements":[{"nodeType":"YulAssignment","src":"10959:21:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"10970:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"10975:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10966:3:111"},"nodeType":"YulFunctionCall","src":"10966:14:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"10959:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"10937:3:111","statements":[]},"src":"10933:146:111"},{"nodeType":"YulAssignment","src":"11088:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"11098:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11088:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10408:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10419:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10431:6:111","type":""}],"src":"10349:761:111"},{"body":{"nodeType":"YulBlock","src":"11272:666:111","statements":[{"body":{"nodeType":"YulBlock","src":"11319:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11328:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11331:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11321:6:111"},"nodeType":"YulFunctionCall","src":"11321:12:111"},"nodeType":"YulExpressionStatement","src":"11321:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11293:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11302:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11289:3:111"},"nodeType":"YulFunctionCall","src":"11289:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11314:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11285:3:111"},"nodeType":"YulFunctionCall","src":"11285:33:111"},"nodeType":"YulIf","src":"11282:53:111"},{"nodeType":"YulVariableDeclaration","src":"11344:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11370:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11357:12:111"},"nodeType":"YulFunctionCall","src":"11357:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"11348:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11414:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"11389:24:111"},"nodeType":"YulFunctionCall","src":"11389:31:111"},"nodeType":"YulExpressionStatement","src":"11389:31:111"},{"nodeType":"YulAssignment","src":"11429:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"11439:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11429:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11453:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11485:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11496:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11481:3:111"},"nodeType":"YulFunctionCall","src":"11481:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11468:12:111"},"nodeType":"YulFunctionCall","src":"11468:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"11457:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"11534:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"11509:24:111"},"nodeType":"YulFunctionCall","src":"11509:33:111"},"nodeType":"YulExpressionStatement","src":"11509:33:111"},{"nodeType":"YulAssignment","src":"11551:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"11561:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"11551:6:111"}]},{"nodeType":"YulAssignment","src":"11577:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11604:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11615:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11600:3:111"},"nodeType":"YulFunctionCall","src":"11600:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11587:12:111"},"nodeType":"YulFunctionCall","src":"11587:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"11577:6:111"}]},{"nodeType":"YulAssignment","src":"11628:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11655:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11666:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11651:3:111"},"nodeType":"YulFunctionCall","src":"11651:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11638:12:111"},"nodeType":"YulFunctionCall","src":"11638:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"11628:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11679:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11721:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11706:3:111"},"nodeType":"YulFunctionCall","src":"11706:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11693:12:111"},"nodeType":"YulFunctionCall","src":"11693:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"11683:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11769:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11778:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11781:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11771:6:111"},"nodeType":"YulFunctionCall","src":"11771:12:111"},"nodeType":"YulExpressionStatement","src":"11771:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"11741:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11749:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11738:2:111"},"nodeType":"YulFunctionCall","src":"11738:30:111"},"nodeType":"YulIf","src":"11735:50:111"},{"nodeType":"YulVariableDeclaration","src":"11794:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11850:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11861:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11846:3:111"},"nodeType":"YulFunctionCall","src":"11846:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11870:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"11820:25:111"},"nodeType":"YulFunctionCall","src":"11820:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"11798:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"11808:8:111","type":""}]},{"nodeType":"YulAssignment","src":"11887:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"11897:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"11887:6:111"}]},{"nodeType":"YulAssignment","src":"11914:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"11924:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"11914:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11198:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11209:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11221:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11229:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11237:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"11245:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"11253:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"11261:6:111","type":""}],"src":"11115:823:111"},{"body":{"nodeType":"YulBlock","src":"12117:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12134:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12145:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12127:6:111"},"nodeType":"YulFunctionCall","src":"12127:21:111"},"nodeType":"YulExpressionStatement","src":"12127:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12179:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12164:3:111"},"nodeType":"YulFunctionCall","src":"12164:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12184:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12157:6:111"},"nodeType":"YulFunctionCall","src":"12157:30:111"},"nodeType":"YulExpressionStatement","src":"12157:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12218:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12203:3:111"},"nodeType":"YulFunctionCall","src":"12203:18:111"},{"hexValue":"77726f6e67206172726179206c656e67746873","kind":"string","nodeType":"YulLiteral","src":"12223:21:111","type":"","value":"wrong array lengths"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12196:6:111"},"nodeType":"YulFunctionCall","src":"12196:49:111"},"nodeType":"YulExpressionStatement","src":"12196:49:111"},{"nodeType":"YulAssignment","src":"12254:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12266:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12277:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12262:3:111"},"nodeType":"YulFunctionCall","src":"12262:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12254:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12094:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12108:4:111","type":""}],"src":"11943:343:111"},{"body":{"nodeType":"YulBlock","src":"12323:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12340:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12343:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12333:6:111"},"nodeType":"YulFunctionCall","src":"12333:88:111"},"nodeType":"YulExpressionStatement","src":"12333:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12437:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12440:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12430:6:111"},"nodeType":"YulFunctionCall","src":"12430:15:111"},"nodeType":"YulExpressionStatement","src":"12430:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12461:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12464:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12454:6:111"},"nodeType":"YulFunctionCall","src":"12454:15:111"},"nodeType":"YulExpressionStatement","src":"12454:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"12291:184:111"},{"body":{"nodeType":"YulBlock","src":"12574:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12584:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"12623:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12610:12:111"},"nodeType":"YulFunctionCall","src":"12610:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"12588:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12783:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12792:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12795:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12785:6:111"},"nodeType":"YulFunctionCall","src":"12785:12:111"},"nodeType":"YulExpressionStatement","src":"12785:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12658:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12686:12:111"},"nodeType":"YulFunctionCall","src":"12686:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"12702:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12682:3:111"},"nodeType":"YulFunctionCall","src":"12682:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"12713:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12678:3:111"},"nodeType":"YulFunctionCall","src":"12678:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"12654:3:111"},"nodeType":"YulFunctionCall","src":"12654:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12647:6:111"},"nodeType":"YulFunctionCall","src":"12647:135:111"},"nodeType":"YulIf","src":"12644:155:111"},{"nodeType":"YulVariableDeclaration","src":"12808:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"12826:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12836:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12822:3:111"},"nodeType":"YulFunctionCall","src":"12822:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"12812:6:111","type":""}]},{"nodeType":"YulAssignment","src":"12864:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12887:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12874:12:111"},"nodeType":"YulFunctionCall","src":"12874:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"12864:6:111"}]},{"body":{"nodeType":"YulBlock","src":"12937:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12946:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12949:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12939:6:111"},"nodeType":"YulFunctionCall","src":"12939:12:111"},"nodeType":"YulExpressionStatement","src":"12939:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"12909:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12917:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12906:2:111"},"nodeType":"YulFunctionCall","src":"12906:30:111"},"nodeType":"YulIf","src":"12903:50:111"},{"nodeType":"YulAssignment","src":"12962:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12974:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12982:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12970:3:111"},"nodeType":"YulFunctionCall","src":"12970:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"12962:4:111"}]},{"body":{"nodeType":"YulBlock","src":"13038:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13047:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13050:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13040:6:111"},"nodeType":"YulFunctionCall","src":"13040:12:111"},"nodeType":"YulExpressionStatement","src":"13040:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"13003:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"13013:12:111"},"nodeType":"YulFunctionCall","src":"13013:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"13029:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13009:3:111"},"nodeType":"YulFunctionCall","src":"13009:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"12999:3:111"},"nodeType":"YulFunctionCall","src":"12999:38:111"},"nodeType":"YulIf","src":"12996:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"12531:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"12541:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"12557:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"12563:6:111","type":""}],"src":"12480:580:111"},{"body":{"nodeType":"YulBlock","src":"13112:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"13211:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13232:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13235:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13225:6:111"},"nodeType":"YulFunctionCall","src":"13225:88:111"},"nodeType":"YulExpressionStatement","src":"13225:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13333:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13336:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13326:6:111"},"nodeType":"YulFunctionCall","src":"13326:15:111"},"nodeType":"YulExpressionStatement","src":"13326:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13361:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13364:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13354:6:111"},"nodeType":"YulFunctionCall","src":"13354:15:111"},"nodeType":"YulExpressionStatement","src":"13354:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13128:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13135:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"13125:2:111"},"nodeType":"YulFunctionCall","src":"13125:77:111"},"nodeType":"YulIf","src":"13122:257:111"},{"nodeType":"YulAssignment","src":"13388:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13399:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"13406:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13395:3:111"},"nodeType":"YulFunctionCall","src":"13395:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"13388:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"13094:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"13104:3:111","type":""}],"src":"13065:349:111"},{"body":{"nodeType":"YulBlock","src":"13593:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13610:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13621:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13603:6:111"},"nodeType":"YulFunctionCall","src":"13603:21:111"},"nodeType":"YulExpressionStatement","src":"13603:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13644:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13655:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13640:3:111"},"nodeType":"YulFunctionCall","src":"13640:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13660:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13633:6:111"},"nodeType":"YulFunctionCall","src":"13633:30:111"},"nodeType":"YulExpressionStatement","src":"13633:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13683:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13694:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13679:3:111"},"nodeType":"YulFunctionCall","src":"13679:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"13699:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13672:6:111"},"nodeType":"YulFunctionCall","src":"13672:62:111"},"nodeType":"YulExpressionStatement","src":"13672:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13754:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13765:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13750:3:111"},"nodeType":"YulFunctionCall","src":"13750:18:111"},{"hexValue":"64656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"13770:14:111","type":"","value":"delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13743:6:111"},"nodeType":"YulFunctionCall","src":"13743:42:111"},"nodeType":"YulExpressionStatement","src":"13743:42:111"},{"nodeType":"YulAssignment","src":"13794:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13806:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13817:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13802:3:111"},"nodeType":"YulFunctionCall","src":"13802:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13794:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13570:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13584:4:111","type":""}],"src":"13419:408:111"},{"body":{"nodeType":"YulBlock","src":"14006:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14023:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14034:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14016:6:111"},"nodeType":"YulFunctionCall","src":"14016:21:111"},"nodeType":"YulExpressionStatement","src":"14016:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14057:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14068:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14053:3:111"},"nodeType":"YulFunctionCall","src":"14053:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14073:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14046:6:111"},"nodeType":"YulFunctionCall","src":"14046:30:111"},"nodeType":"YulExpressionStatement","src":"14046:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14096:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14107:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14092:3:111"},"nodeType":"YulFunctionCall","src":"14092:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"14112:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14085:6:111"},"nodeType":"YulFunctionCall","src":"14085:62:111"},"nodeType":"YulExpressionStatement","src":"14085:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14167:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14178:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14163:3:111"},"nodeType":"YulFunctionCall","src":"14163:18:111"},{"hexValue":"6163746976652070726f7879","kind":"string","nodeType":"YulLiteral","src":"14183:14:111","type":"","value":"active proxy"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14156:6:111"},"nodeType":"YulFunctionCall","src":"14156:42:111"},"nodeType":"YulExpressionStatement","src":"14156:42:111"},{"nodeType":"YulAssignment","src":"14207:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14219:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14230:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14215:3:111"},"nodeType":"YulFunctionCall","src":"14215:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14207:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13983:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13997:4:111","type":""}],"src":"13832:408:111"},{"body":{"nodeType":"YulBlock","src":"14390:168:111","statements":[{"nodeType":"YulAssignment","src":"14400:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14412:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14423:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14408:3:111"},"nodeType":"YulFunctionCall","src":"14408:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14400:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14442:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14457:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14465:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14453:3:111"},"nodeType":"YulFunctionCall","src":"14453:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14435:6:111"},"nodeType":"YulFunctionCall","src":"14435:74:111"},"nodeType":"YulExpressionStatement","src":"14435:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14540:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14525:3:111"},"nodeType":"YulFunctionCall","src":"14525:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"14545:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14518:6:111"},"nodeType":"YulFunctionCall","src":"14518:34:111"},"nodeType":"YulExpressionStatement","src":"14518:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14351:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14362:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14370:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14381:4:111","type":""}],"src":"14245:313:111"},{"body":{"nodeType":"YulBlock","src":"14737:246:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14754:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14765:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14747:6:111"},"nodeType":"YulFunctionCall","src":"14747:21:111"},"nodeType":"YulExpressionStatement","src":"14747:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14788:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14799:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14784:3:111"},"nodeType":"YulFunctionCall","src":"14784:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14804:2:111","type":"","value":"56"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14777:6:111"},"nodeType":"YulFunctionCall","src":"14777:30:111"},"nodeType":"YulExpressionStatement","src":"14777:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14838:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14823:3:111"},"nodeType":"YulFunctionCall","src":"14823:18:111"},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c","kind":"string","nodeType":"YulLiteral","src":"14843:34:111","type":"","value":"UUPSUpgradeable: must not be cal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14816:6:111"},"nodeType":"YulFunctionCall","src":"14816:62:111"},"nodeType":"YulExpressionStatement","src":"14816:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14898:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14909:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14894:3:111"},"nodeType":"YulFunctionCall","src":"14894:18:111"},{"hexValue":"6c6564207468726f7567682064656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"14914:26:111","type":"","value":"led through delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14887:6:111"},"nodeType":"YulFunctionCall","src":"14887:54:111"},"nodeType":"YulExpressionStatement","src":"14887:54:111"},{"nodeType":"YulAssignment","src":"14950:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14962:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14973:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14958:3:111"},"nodeType":"YulFunctionCall","src":"14958:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14950:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14714:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14728:4:111","type":""}],"src":"14563:420:111"},{"body":{"nodeType":"YulBlock","src":"15069:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"15115:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15124:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15127:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15117:6:111"},"nodeType":"YulFunctionCall","src":"15117:12:111"},"nodeType":"YulExpressionStatement","src":"15117:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15090:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15099:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15086:3:111"},"nodeType":"YulFunctionCall","src":"15086:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15111:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15082:3:111"},"nodeType":"YulFunctionCall","src":"15082:32:111"},"nodeType":"YulIf","src":"15079:52:111"},{"nodeType":"YulAssignment","src":"15140:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15156:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15150:5:111"},"nodeType":"YulFunctionCall","src":"15150:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15140:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15035:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15046:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15058:6:111","type":""}],"src":"14988:184:111"},{"body":{"nodeType":"YulBlock","src":"15351:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15368:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15379:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15361:6:111"},"nodeType":"YulFunctionCall","src":"15361:21:111"},"nodeType":"YulExpressionStatement","src":"15361:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15402:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15413:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15398:3:111"},"nodeType":"YulFunctionCall","src":"15398:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15418:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15391:6:111"},"nodeType":"YulFunctionCall","src":"15391:30:111"},"nodeType":"YulExpressionStatement","src":"15391:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15441:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15452:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15437:3:111"},"nodeType":"YulFunctionCall","src":"15437:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561","kind":"string","nodeType":"YulLiteral","src":"15457:34:111","type":"","value":"Initializable: contract is alrea"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15430:6:111"},"nodeType":"YulFunctionCall","src":"15430:62:111"},"nodeType":"YulExpressionStatement","src":"15430:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15512:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15523:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15508:3:111"},"nodeType":"YulFunctionCall","src":"15508:18:111"},{"hexValue":"647920696e697469616c697a6564","kind":"string","nodeType":"YulLiteral","src":"15528:16:111","type":"","value":"dy initialized"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15501:6:111"},"nodeType":"YulFunctionCall","src":"15501:44:111"},"nodeType":"YulExpressionStatement","src":"15501:44:111"},{"nodeType":"YulAssignment","src":"15554:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15566:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15577:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15562:3:111"},"nodeType":"YulFunctionCall","src":"15562:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15554:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15328:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15342:4:111","type":""}],"src":"15177:410:111"},{"body":{"nodeType":"YulBlock","src":"15699:87:111","statements":[{"nodeType":"YulAssignment","src":"15709:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15721:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15732:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15717:3:111"},"nodeType":"YulFunctionCall","src":"15717:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15709:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15751:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15766:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15774:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15762:3:111"},"nodeType":"YulFunctionCall","src":"15762:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15744:6:111"},"nodeType":"YulFunctionCall","src":"15744:36:111"},"nodeType":"YulExpressionStatement","src":"15744:36:111"}]},"name":"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15668:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15679:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15690:4:111","type":""}],"src":"15592:194:111"},{"body":{"nodeType":"YulBlock","src":"15928:225:111","statements":[{"nodeType":"YulAssignment","src":"15938:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15950:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15961:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15946:3:111"},"nodeType":"YulFunctionCall","src":"15946:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15938:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15980:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15995:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16003:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15991:3:111"},"nodeType":"YulFunctionCall","src":"15991:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15973:6:111"},"nodeType":"YulFunctionCall","src":"15973:74:111"},"nodeType":"YulExpressionStatement","src":"15973:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16067:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16078:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16063:3:111"},"nodeType":"YulFunctionCall","src":"16063:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"16087:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16095:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16083:3:111"},"nodeType":"YulFunctionCall","src":"16083:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16056:6:111"},"nodeType":"YulFunctionCall","src":"16056:91:111"},"nodeType":"YulExpressionStatement","src":"16056:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15889:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15900:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15908:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15919:4:111","type":""}],"src":"15791:362:111"},{"body":{"nodeType":"YulBlock","src":"16332:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16349:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16360:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16342:6:111"},"nodeType":"YulFunctionCall","src":"16342:21:111"},"nodeType":"YulExpressionStatement","src":"16342:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16383:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16394:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16379:3:111"},"nodeType":"YulFunctionCall","src":"16379:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16399:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16372:6:111"},"nodeType":"YulFunctionCall","src":"16372:30:111"},"nodeType":"YulExpressionStatement","src":"16372:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16422:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16433:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16418:3:111"},"nodeType":"YulFunctionCall","src":"16418:18:111"},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"16438:34:111","type":"","value":"account: not Owner or EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16411:6:111"},"nodeType":"YulFunctionCall","src":"16411:62:111"},"nodeType":"YulExpressionStatement","src":"16411:62:111"},{"nodeType":"YulAssignment","src":"16482:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16494:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16505:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16490:3:111"},"nodeType":"YulFunctionCall","src":"16490:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16482:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16309:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16323:4:111","type":""}],"src":"16158:356:111"},{"body":{"nodeType":"YulBlock","src":"16572:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16582:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16591:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"16586:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16651:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16676:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16681:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16672:3:111"},"nodeType":"YulFunctionCall","src":"16672:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"16695:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16700:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16691:3:111"},"nodeType":"YulFunctionCall","src":"16691:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16685:5:111"},"nodeType":"YulFunctionCall","src":"16685:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16665:6:111"},"nodeType":"YulFunctionCall","src":"16665:39:111"},"nodeType":"YulExpressionStatement","src":"16665:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16612:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16615:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16609:2:111"},"nodeType":"YulFunctionCall","src":"16609:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"16623:19:111","statements":[{"nodeType":"YulAssignment","src":"16625:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16634:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"16637:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16630:3:111"},"nodeType":"YulFunctionCall","src":"16630:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"16625:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"16605:3:111","statements":[]},"src":"16601:113:111"},{"body":{"nodeType":"YulBlock","src":"16740:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16753:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16758:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16749:3:111"},"nodeType":"YulFunctionCall","src":"16749:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"16767:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16742:6:111"},"nodeType":"YulFunctionCall","src":"16742:27:111"},"nodeType":"YulExpressionStatement","src":"16742:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16729:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16732:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16726:2:111"},"nodeType":"YulFunctionCall","src":"16726:13:111"},"nodeType":"YulIf","src":"16723:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"16550:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"16555:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16560:6:111","type":""}],"src":"16519:258:111"},{"body":{"nodeType":"YulBlock","src":"16919:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16929:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16949:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16943:5:111"},"nodeType":"YulFunctionCall","src":"16943:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"16933:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16991:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16999:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16987:3:111"},"nodeType":"YulFunctionCall","src":"16987:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"17006:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17011:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"16965:21:111"},"nodeType":"YulFunctionCall","src":"16965:53:111"},"nodeType":"YulExpressionStatement","src":"16965:53:111"},{"nodeType":"YulAssignment","src":"17027:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"17038:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"17043:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17034:3:111"},"nodeType":"YulFunctionCall","src":"17034:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17027:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"16895:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16900:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"16911:3:111","type":""}],"src":"16782:274:111"},{"body":{"nodeType":"YulBlock","src":"17142:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"17188:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17197:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17200:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17190:6:111"},"nodeType":"YulFunctionCall","src":"17190:12:111"},"nodeType":"YulExpressionStatement","src":"17190:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"17163:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"17172:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17159:3:111"},"nodeType":"YulFunctionCall","src":"17159:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"17184:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17155:3:111"},"nodeType":"YulFunctionCall","src":"17155:32:111"},"nodeType":"YulIf","src":"17152:52:111"},{"nodeType":"YulAssignment","src":"17213:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17229:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"17223:5:111"},"nodeType":"YulFunctionCall","src":"17223:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"17213:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17108:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"17119:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"17131:6:111","type":""}],"src":"17061:184:111"},{"body":{"nodeType":"YulBlock","src":"17424:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17441:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17452:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17434:6:111"},"nodeType":"YulFunctionCall","src":"17434:21:111"},"nodeType":"YulExpressionStatement","src":"17434:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17475:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17486:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17471:3:111"},"nodeType":"YulFunctionCall","src":"17471:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17491:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17464:6:111"},"nodeType":"YulFunctionCall","src":"17464:30:111"},"nodeType":"YulExpressionStatement","src":"17464:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17525:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17510:3:111"},"nodeType":"YulFunctionCall","src":"17510:18:111"},{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"17530:34:111","type":"","value":"ERC1967Upgrade: new implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17503:6:111"},"nodeType":"YulFunctionCall","src":"17503:62:111"},"nodeType":"YulExpressionStatement","src":"17503:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17585:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17596:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17581:3:111"},"nodeType":"YulFunctionCall","src":"17581:18:111"},{"hexValue":"6f6e206973206e6f742055555053","kind":"string","nodeType":"YulLiteral","src":"17601:16:111","type":"","value":"on is not UUPS"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17574:6:111"},"nodeType":"YulFunctionCall","src":"17574:44:111"},"nodeType":"YulExpressionStatement","src":"17574:44:111"},{"nodeType":"YulAssignment","src":"17627:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17650:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17635:3:111"},"nodeType":"YulFunctionCall","src":"17635:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17627:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17401:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17415:4:111","type":""}],"src":"17250:410:111"},{"body":{"nodeType":"YulBlock","src":"17839:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17856:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17867:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17849:6:111"},"nodeType":"YulFunctionCall","src":"17849:21:111"},"nodeType":"YulExpressionStatement","src":"17849:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17890:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17901:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17886:3:111"},"nodeType":"YulFunctionCall","src":"17886:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17906:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17879:6:111"},"nodeType":"YulFunctionCall","src":"17879:30:111"},"nodeType":"YulExpressionStatement","src":"17879:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17929:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17940:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17925:3:111"},"nodeType":"YulFunctionCall","src":"17925:18:111"},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f78","kind":"string","nodeType":"YulLiteral","src":"17945:34:111","type":"","value":"ERC1967Upgrade: unsupported prox"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17918:6:111"},"nodeType":"YulFunctionCall","src":"17918:62:111"},"nodeType":"YulExpressionStatement","src":"17918:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18000:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18011:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17996:3:111"},"nodeType":"YulFunctionCall","src":"17996:18:111"},{"hexValue":"6961626c6555554944","kind":"string","nodeType":"YulLiteral","src":"18016:11:111","type":"","value":"iableUUID"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17989:6:111"},"nodeType":"YulFunctionCall","src":"17989:39:111"},"nodeType":"YulExpressionStatement","src":"17989:39:111"},{"nodeType":"YulAssignment","src":"18037:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18049:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18060:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18045:3:111"},"nodeType":"YulFunctionCall","src":"18045:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18037:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17816:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17830:4:111","type":""}],"src":"17665:405:111"},{"body":{"nodeType":"YulBlock","src":"18249:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18266:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18277:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18259:6:111"},"nodeType":"YulFunctionCall","src":"18259:21:111"},"nodeType":"YulExpressionStatement","src":"18259:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18300:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18311:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18296:3:111"},"nodeType":"YulFunctionCall","src":"18296:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18316:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18289:6:111"},"nodeType":"YulFunctionCall","src":"18289:30:111"},"nodeType":"YulExpressionStatement","src":"18289:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18339:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18350:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18335:3:111"},"nodeType":"YulFunctionCall","src":"18335:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"18355:30:111","type":"","value":"account: not from EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18328:6:111"},"nodeType":"YulFunctionCall","src":"18328:58:111"},"nodeType":"YulExpressionStatement","src":"18328:58:111"},{"nodeType":"YulAssignment","src":"18395:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18407:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18418:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18403:3:111"},"nodeType":"YulFunctionCall","src":"18403:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18395:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18226:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18240:4:111","type":""}],"src":"18075:352:111"},{"body":{"nodeType":"YulBlock","src":"18623:14:111","statements":[{"nodeType":"YulAssignment","src":"18625:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"18632:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"18625:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"18607:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"18615:3:111","type":""}],"src":"18432:205:111"},{"body":{"nodeType":"YulBlock","src":"18816:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18833:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18844:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18826:6:111"},"nodeType":"YulFunctionCall","src":"18826:21:111"},"nodeType":"YulExpressionStatement","src":"18826:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18867:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18878:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18863:3:111"},"nodeType":"YulFunctionCall","src":"18863:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18883:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18856:6:111"},"nodeType":"YulFunctionCall","src":"18856:30:111"},"nodeType":"YulExpressionStatement","src":"18856:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18906:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18917:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18902:3:111"},"nodeType":"YulFunctionCall","src":"18902:18:111"},{"hexValue":"6f6e6c79206f776e6572","kind":"string","nodeType":"YulLiteral","src":"18922:12:111","type":"","value":"only owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18895:6:111"},"nodeType":"YulFunctionCall","src":"18895:40:111"},"nodeType":"YulExpressionStatement","src":"18895:40:111"},{"nodeType":"YulAssignment","src":"18944:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18956:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18967:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18952:3:111"},"nodeType":"YulFunctionCall","src":"18952:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18944:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18793:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18807:4:111","type":""}],"src":"18642:334:111"},{"body":{"nodeType":"YulBlock","src":"19155:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19183:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19165:6:111"},"nodeType":"YulFunctionCall","src":"19165:21:111"},"nodeType":"YulExpressionStatement","src":"19165:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19206:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19217:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19202:3:111"},"nodeType":"YulFunctionCall","src":"19202:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19222:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19195:6:111"},"nodeType":"YulFunctionCall","src":"19195:30:111"},"nodeType":"YulExpressionStatement","src":"19195:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19245:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19256:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19241:3:111"},"nodeType":"YulFunctionCall","src":"19241:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"19261:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19234:6:111"},"nodeType":"YulFunctionCall","src":"19234:62:111"},"nodeType":"YulExpressionStatement","src":"19234:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19327:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19312:3:111"},"nodeType":"YulFunctionCall","src":"19312:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"19332:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19305:6:111"},"nodeType":"YulFunctionCall","src":"19305:43:111"},"nodeType":"YulExpressionStatement","src":"19305:43:111"},{"nodeType":"YulAssignment","src":"19357:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19369:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19380:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19365:3:111"},"nodeType":"YulFunctionCall","src":"19365:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19357:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19132:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19146:4:111","type":""}],"src":"18981:409:111"},{"body":{"nodeType":"YulBlock","src":"19569:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19586:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19597:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19579:6:111"},"nodeType":"YulFunctionCall","src":"19579:21:111"},"nodeType":"YulExpressionStatement","src":"19579:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19620:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19631:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19616:3:111"},"nodeType":"YulFunctionCall","src":"19616:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19636:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19609:6:111"},"nodeType":"YulFunctionCall","src":"19609:30:111"},"nodeType":"YulExpressionStatement","src":"19609:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19659:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19670:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19655:3:111"},"nodeType":"YulFunctionCall","src":"19655:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"19675:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19648:6:111"},"nodeType":"YulFunctionCall","src":"19648:59:111"},"nodeType":"YulExpressionStatement","src":"19648:59:111"},{"nodeType":"YulAssignment","src":"19716:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19728:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19739:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19724:3:111"},"nodeType":"YulFunctionCall","src":"19724:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19716:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19546:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19560:4:111","type":""}],"src":"19395:353:111"},{"body":{"nodeType":"YulBlock","src":"19874:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19902:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19884:6:111"},"nodeType":"YulFunctionCall","src":"19884:21:111"},"nodeType":"YulExpressionStatement","src":"19884:21:111"},{"nodeType":"YulVariableDeclaration","src":"19914:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"19934:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19928:5:111"},"nodeType":"YulFunctionCall","src":"19928:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"19918:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19961:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19972:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19957:3:111"},"nodeType":"YulFunctionCall","src":"19957:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"19977:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19950:6:111"},"nodeType":"YulFunctionCall","src":"19950:34:111"},"nodeType":"YulExpressionStatement","src":"19950:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20019:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20027:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20015:3:111"},"nodeType":"YulFunctionCall","src":"20015:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20036:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20047:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20032:3:111"},"nodeType":"YulFunctionCall","src":"20032:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"20052:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"19993:21:111"},"nodeType":"YulFunctionCall","src":"19993:66:111"},"nodeType":"YulExpressionStatement","src":"19993:66:111"},{"nodeType":"YulAssignment","src":"20068:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20084:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"20103:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20111:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20099:3:111"},"nodeType":"YulFunctionCall","src":"20099:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"20116:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20095:3:111"},"nodeType":"YulFunctionCall","src":"20095:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20080:3:111"},"nodeType":"YulFunctionCall","src":"20080:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"20186:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20076:3:111"},"nodeType":"YulFunctionCall","src":"20076:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20068:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19843:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19854:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19865:4:111","type":""}],"src":"19753:442:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_address_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let array := allocate_memory(add(and(add(_4, 0x1f), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), _1))\n mstore(array, _4)\n if gt(add(add(_3, _4), _1), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, _1), add(_3, _1), _4)\n mstore(add(add(array, _4), _1), 0)\n value1 := array\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function abi_decode_tuple_t_array$_t_uint256_$4_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n if iszero(slt(add(headStart, 0x1f), dataEnd)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(headStart, 128)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := headStart\n for { } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, 0x20)\n }\n value0 := memPtr\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong array lengths\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"active proxy\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 56)\n mstore(add(headStart, 64), \"UUPSUpgradeable: must not be cal\")\n mstore(add(headStart, 96), \"led through delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"Initializable: contract is alrea\")\n mstore(add(headStart, 96), \"dy initialized\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"account: not Owner or EntryPoint\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"ERC1967Upgrade: new implementati\")\n mstore(add(headStart, 96), \"on is not UUPS\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"ERC1967Upgrade: unsupported prox\")\n mstore(add(headStart, 96), \"iableUUID\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"only owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"3559":[{"length":32,"start":1800},{"length":32,"start":1950},{"length":32,"start":2716},{"length":32,"start":2866},{"length":32,"start":3169}],"13841":[{"length":32,"start":932},{"length":32,"start":2353},{"length":32,"start":2520},{"length":32,"start":3502},{"length":32,"start":4069},{"length":32,"start":4437},{"length":32,"start":5209},{"length":32,"start":5630}],"19027":[{"length":32,"start":637},{"length":32,"start":2286}]},"linkReferences":{},"object":"60806040526004361061016d5760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae1461047a578063ee472f361461049c578063f23a6e61146104bc57600080fd5b8063c399ec8814610430578063c4d66de814610445578063d087d2881461046557600080fd5b8063b0d691fe116100b0578063b0d691fe14610395578063b61d27f6146103c8578063bc197c81146103e857600080fd5b806352d1902d1461034d5780638da5cb5b1461036257600080fd5b80633659cfe6116101225780634a58db19116101075780634a58db19146103125780634d44560d1461031a5780634f1ef2861461033a57600080fd5b80633659cfe6146102c45780633a871cdd146102e457600080fd5b8063150b7a0211610153578063150b7a02146101d557806318dfb3c71461024b578063245a7bfc1461026b57600080fd5b806223de291461017957806301ffc9a7146101a057600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019e61019436600461198f565b5050505050505050565b005b3480156101ac57600080fd5b506101c06101bb366004611a40565b610502565b60405190151581526020015b60405180910390f35b3480156101e157600080fd5b5061021a6101f0366004611a82565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101cc565b34801561025757600080fd5b5061019e610266366004611b3a565b6105e7565b34801561027757600080fd5b5061029f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b3480156102d057600080fd5b5061019e6102df366004611ba6565b6106f1565b3480156102f057600080fd5b506103046102ff366004611bc3565b6108c2565b6040519081526020016101cc565b61019e61092f565b34801561032657600080fd5b5061019e610335366004611c17565b6109ce565b61019e610348366004611cc1565b610a85565b34801561035957600080fd5b50610304610c47565b34801561036e57600080fd5b5060005461029f9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061029f565b3480156103d457600080fd5b5061019e6103e3366004611d87565b610d19565b3480156103f457600080fd5b5061021a610403366004611dd7565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561043c57600080fd5b50610304610d68565b34801561045157600080fd5b5061019e610460366004611ba6565b610e1f565b34801561047157600080fd5b50610304610f98565b34801561048657600080fd5b5061048f611014565b6040516101cc9190611e75565b3480156104a857600080fd5b5061019e6104b7366004611ea6565b611029565b3480156104c857600080fd5b5061021a6104d7366004611f24565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061059557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806105e157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6105ef61113d565b8281146106435760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156106ea576106d885858381811061066357610663611fa0565b90506020020160208101906106789190611ba6565b600085858581811061068c5761068c611fa0565b905060200281019061069e9190611fcf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b806106e281612034565b915050610646565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361079c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108117f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461089a5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b6108a381611269565b604080516000808252602082019092526108bf91839190611271565b50565b60006108cc611441565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168082526000602083018190529190920152610928826114c6565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109ba57600080fd5b505af11580156106ea573d6000803e3d6000fd5b6109d6611531565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a6957600080fd5b505af1158015610a7d573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ba57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b610c3782611269565b610c4382826001611271565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161063a565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d2161113d565b610d62848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612093565b905090565b600054610100900460ff1615808015610e3f5750600054600160ff909116105b80610e595750303b158015610e59575060005460ff166001145b610ecb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f32826115a8565b8015610c4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dd9565b61101c611906565b611024611906565b919050565b600054610100900460ff16158080156110495750600054600160ff909116105b806110635750303b158015611063575060005460ff166001145b6110d55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561113357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f3260006115a8565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061119e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b6111ea5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74604482015260640161063a565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161121591906120d8565b60006040518083038185875af1925050503d8060008114611252576040519150601f19603f3d011682016040523d82523d6000602084013e611257565b606091505b5091509150816106ea57805160208201fd5b6108bf611531565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156112a9576112a483611647565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561132e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261132b91810190612093565b60015b6113a05760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146114355760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161063a565b506112a4838383611737565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146111ea5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000604482015260640161063a565b80156108bf5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d80600081146106ea576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061155c57503330145b6111ea5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e657200000000000000000000000000000000000000000000604482015260640161063a565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6116d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6117408361175c565b60008251118061174d5750805b156112a457610d6283836117a9565b61176581611647565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061092883836040518060600160405280602781526020016121466027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516117f391906120d8565b600060405180830381855af49150503d806000811461182e576040519150601f19603f3d011682016040523d82523d6000602084013e611833565b606091505b50915091506118448683838761184e565b9695505050505050565b606083156118ca5782516000036118c35773ffffffffffffffffffffffffffffffffffffffff85163b6118c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161063a565b50816118d4565b6118d483836118dc565b949350505050565b8151156118ec5781518083602001fd5b8060405162461bcd60e51b815260040161063a91906120f4565b60405180608001604052806004906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108bf57600080fd5b60008083601f84011261195857600080fd5b50813567ffffffffffffffff81111561197057600080fd5b60208301915083602082850101111561198857600080fd5b9250929050565b60008060008060008060008060c0898b0312156119ab57600080fd5b88356119b681611924565b975060208901356119c681611924565b965060408901356119d681611924565b955060608901359450608089013567ffffffffffffffff808211156119fa57600080fd5b611a068c838d01611946565b909650945060a08b0135915080821115611a1f57600080fd5b50611a2c8b828c01611946565b999c989b5096995094979396929594505050565b600060208284031215611a5257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461092857600080fd5b600080600080600060808688031215611a9a57600080fd5b8535611aa581611924565b94506020860135611ab581611924565b935060408601359250606086013567ffffffffffffffff811115611ad857600080fd5b611ae488828901611946565b969995985093965092949392505050565b60008083601f840112611b0757600080fd5b50813567ffffffffffffffff811115611b1f57600080fd5b6020830191508360208260051b850101111561198857600080fd5b60008060008060408587031215611b5057600080fd5b843567ffffffffffffffff80821115611b6857600080fd5b611b7488838901611af5565b90965094506020870135915080821115611b8d57600080fd5b50611b9a87828801611af5565b95989497509550505050565b600060208284031215611bb857600080fd5b813561092881611924565b600080600060608486031215611bd857600080fd5b833567ffffffffffffffff811115611bef57600080fd5b84016101608187031215611c0257600080fd5b95602085013595506040909401359392505050565b60008060408385031215611c2a57600080fd5b8235611c3581611924565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611cb957611cb9611c43565b604052919050565b60008060408385031215611cd457600080fd5b8235611cdf81611924565b915060208381013567ffffffffffffffff80821115611cfd57600080fd5b818601915086601f830112611d1157600080fd5b813581811115611d2357611d23611c43565b611d53847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c72565b91508082528784828501011115611d6957600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060008060608587031215611d9d57600080fd5b8435611da881611924565b935060208501359250604085013567ffffffffffffffff811115611dcb57600080fd5b611b9a87828801611946565b60008060008060008060008060a0898b031215611df357600080fd5b8835611dfe81611924565b97506020890135611e0e81611924565b9650604089013567ffffffffffffffff80821115611e2b57600080fd5b611e378c838d01611af5565b909850965060608b0135915080821115611e5057600080fd5b611e5c8c838d01611af5565b909650945060808b0135915080821115611a1f57600080fd5b60808101818360005b6004811015611e9d578151835260209283019290910190600101611e7e565b50505092915050565b600060808284031215611eb857600080fd5b82601f830112611ec757600080fd5b6040516080810181811067ffffffffffffffff82111715611eea57611eea611c43565b604052806080840185811115611eff57600080fd5b845b81811015611f19578035835260209283019201611f01565b509195945050505050565b60008060008060008060a08789031215611f3d57600080fd5b8635611f4881611924565b95506020870135611f5881611924565b94506040870135935060608701359250608087013567ffffffffffffffff811115611f8257600080fd5b611f8e89828a01611946565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261200457600080fd5b83018035915067ffffffffffffffff82111561201f57600080fd5b60200191503681900382131561198857600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156120a557600080fd5b5051919050565b60005b838110156120c75781810151838201526020016120af565b83811115610d625750506000910152565b600082516120ea8184602087016120ac565b9190910192915050565b60208152600082518060208401526121138160408501602087016120ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c6174ece9aa7a093b2d189b4c38248b1bffceada2cfe3a663a2f8614e59da33a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x16D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x49C JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x465 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3C8 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x34D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0x122 JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2C4 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x153 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x174 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x198F JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C0 PUSH2 0x1BB CALLDATASIZE PUSH1 0x4 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x502 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A82 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B3A JUMP JUMPDEST PUSH2 0x5E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x2DF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0x6F1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0x2FF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC3 JUMP JUMPDEST PUSH2 0x8C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH2 0x19E PUSH2 0x92F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x335 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C17 JUMP JUMPDEST PUSH2 0x9CE JUMP JUMPDEST PUSH2 0x19E PUSH2 0x348 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CC1 JUMP JUMPDEST PUSH2 0xA85 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xC47 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x29F SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x29F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x3E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D87 JUMP JUMPDEST PUSH2 0xD19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x403 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DD7 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x43C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xD68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x460 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xE1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xF98 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x486 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48F PUSH2 0x1014 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1CC SWAP2 SWAP1 PUSH2 0x1E75 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EA6 JUMP JUMPDEST PUSH2 0x1029 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x4D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F24 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x595 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x5E1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5EF PUSH2 0x113D JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x643 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH2 0x6D8 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x663 JUMPI PUSH2 0x663 PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x678 SWAP2 SWAP1 PUSH2 0x1BA6 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x68C JUMPI PUSH2 0x68C PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x69E SWAP2 SWAP1 PUSH2 0x1FCF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6E2 DUP2 PUSH2 0x2034 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x646 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x79C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x811 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x89A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0x8A3 DUP2 PUSH2 0x1269 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x8BF SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1271 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8CC PUSH2 0x1441 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x928 DUP3 PUSH2 0x14C6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6EA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9D6 PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xBA5 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0xC37 DUP3 PUSH2 0x1269 JUMP JUMPDEST PUSH2 0xC43 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1271 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x113D JUMP JUMPDEST PUSH2 0xD62 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE1A SWAP2 SWAP1 PUSH2 0x2093 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE3F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE59 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE59 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xECB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF29 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 DUP3 PUSH2 0x15A8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC43 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDD9 JUMP JUMPDEST PUSH2 0x101C PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x1024 PUSH2 0x1906 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1049 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x1063 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1063 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10D5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1133 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 PUSH1 0x0 PUSH2 0x15A8 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x119E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1215 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1252 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1257 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x6EA JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x8BF PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x12A9 JUMPI PUSH2 0x12A4 DUP4 PUSH2 0x1647 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x132E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x132B SWAP2 DUP2 ADD SWAP1 PUSH2 0x2093 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x13A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1435 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH2 0x12A4 DUP4 DUP4 DUP4 PUSH2 0x1737 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8BF JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x6EA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x6EA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x155C JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x16D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1740 DUP4 PUSH2 0x175C JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x174D JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x12A4 JUMPI PUSH2 0xD62 DUP4 DUP4 PUSH2 0x17A9 JUMP JUMPDEST PUSH2 0x1765 DUP2 PUSH2 0x1647 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x928 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2146 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x17F3 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x182E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1833 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1844 DUP7 DUP4 DUP4 DUP8 PUSH2 0x184E JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x18CA JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x18C3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x18C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST POP DUP2 PUSH2 0x18D4 JUMP JUMPDEST PUSH2 0x18D4 DUP4 DUP4 PUSH2 0x18DC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x18EC JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x63A SWAP2 SWAP1 PUSH2 0x20F4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1958 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1970 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x19AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x19B6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x19C6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x19D6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A06 DUP13 DUP4 DUP14 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A2C DUP12 DUP3 DUP13 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1AA5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1AB5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE4 DUP9 DUP3 DUP10 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1B50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B74 DUP9 DUP4 DUP10 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x928 DUP2 PUSH2 0x1924 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1C02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C35 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1CB9 JUMPI PUSH2 0x1CB9 PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1CD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1CDF DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1D11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH2 0x1D23 PUSH2 0x1C43 JUMP JUMPDEST PUSH2 0x1D53 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1C72 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1D69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1DA8 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1946 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1DF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1DFE DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1E0E DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E37 DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1E50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E5C DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x1E9D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1E7E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1EC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1EEA JUMPI PUSH2 0x1EEA PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1EFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F19 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1F01 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1F3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1F48 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1F58 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F8E DUP10 DUP3 DUP11 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2004 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x201F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x208C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x20C7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x20AF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD62 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x20EA DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2113 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C6174E 0xCE SWAP11 0xA7 LOG0 SWAP4 0xB2 0xD1 DUP10 0xB4 0xC3 DUP3 BASEFEE 0xB1 0xBF 0xFC 0xEA 0xDA 0x2C INVALID GASPRICE PUSH7 0x3A2F8614E59DA3 GASPRICE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"488:966:90:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176:86;;;;;;;;;;-1:-1:-1;581:176:86;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;;;;;-1:-1:-1;1489:298:86;;;;;:::i;:::-;;:::i;:::-;;;2237:14:111;;2230:22;2212:41;;2200:2;2185:18;1489:298:86;;;;;;;;763:212;;;;;;;;;;-1:-1:-1;763:212:86;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;3197:66:111;3185:79;;;3167:98;;3155:2;3140:18;763:212:86;3023:248:111;1902:297:73;;;;;;;;;;-1:-1:-1;1902:297:73;;;;;:::i;:::-;;:::i;550:35:90:-;;;;;;;;;;;;;;;;;;4613:42:111;4601:55;;;4583:74;;4571:2;4556:18;550:35:90;4437:226:111;3073:197:32;;;;;;;;;;-1:-1:-1;3073:197:32;;;;;:::i;:::-;;:::i;1458:353:51:-;;;;;;;;;;-1:-1:-1;1458:353:51;;;;;:::i;:::-;;:::i;:::-;;;5601:25:111;;;5589:2;5574:18;1458:353:51;5455:177:111;3926:110:73;;;:::i;4188:158::-;;;;;;;;;;-1:-1:-1;4188:158:73;;;;;:::i;:::-;;:::i;3519:222:32:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;765:20:73:-;;;;;;;;;;-1:-1:-1;765:20:73;;;;;;;;;;;1031:108;;;;;;;;;;-1:-1:-1;1121:11:73;1031:108;;1680:158;;;;;;;;;;-1:-1:-1;1680:158:73;;;;;:::i;:::-;;:::i;1219:264:86:-;;;;;;;;;;-1:-1:-1;1219:264:86;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;3730:113:73;;;;;;;;;;;;;:::i;2483:101::-;;;;;;;;;;-1:-1:-1;2483:101:73;;;;;:::i;:::-;;:::i;935:121:51:-;;;;;;;;;;;;;:::i;1310:142:90:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;907:145::-;;;;;;;;;;-1:-1:-1;907:145:90;;;;;:::i;:::-;;:::i;981:232:86:-;;;;;;;;;;-1:-1:-1;981:232:86;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;1902:297:73:-;1991:31;:29;:31::i;:::-;2040:26;;;2032:58;;;;-1:-1:-1;;;2032:58:73;;12145:2:111;2032:58:73;;;12127:21:111;12184:2;12164:18;;;12157:30;12223:21;12203:18;;;12196:49;12262:18;;2032:58:73;;;;;;;;;2105:9;2100:93;2120:15;;;2100:93;;;2156:26;2162:4;;2167:1;2162:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2171:1;2174:4;;2179:1;2174:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2156:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2156:5:73;;-1:-1:-1;;;2156:26:73:i;:::-;2137:3;;;;:::i;:::-;;;;2100:93;;;;1902:297;;;;:::o;3073:197:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;13621:2:111;1629:80:32;;;13603:21:111;13660:2;13640:18;;;13633:30;13699:34;13679:18;;;13672:62;13770:14;13750:18;;;13743:42;13802:19;;1629:80:32;13419:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;14034:2:111;1719:87:32;;;14016:21:111;14073:2;14053:18;;;14046:30;14112:34;14092:18;;;14085:62;14183:14;14163:18;;;14156:42;14215:19;;1719:87:32;13832:408:111;1719:87:32;3156:36:::1;3174:17;3156;:36::i;:::-;3243:12;::::0;;3253:1:::1;3243:12:::0;;;::::1;::::0;::::1;::::0;;;3202:61:::1;::::0;3224:17;;3243:12;3202:21:::1;:61::i;:::-;3073:197:::0;:::o;1458:353:51:-;1601:22;1635:24;:22;:24::i;:::-;-1:-1:-1;1265:31:90;;;;;;;;;1280:10;1265:31;;;;-1:-1:-1;1265:31:90;;;;;;;;;;;1772:32:51;1784:19;1772:11;:32::i;:::-;1458:353;;;;;:::o;3926:110:73:-;1121:11;3973:56;;;;;4023:4;3973:56;;;4583:74:111;3973:22:73;;;;;;;;4004:9;;4556:18:111;;3973:56:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:158;963:12;:10;:12::i;:::-;1121:11;4291:48:::1;::::0;;;;:23:::1;14453:55:111::0;;;4291:48:73::1;::::0;::::1;14435:74:111::0;14525:18;;;14518:34;;;4291:23:73;;;::::1;::::0;::::1;::::0;14408:18:111;;4291:48:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4188:158:::0;;:::o;3519:222:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;13621:2:111;1629:80:32;;;13603:21:111;13660:2;13640:18;;;13633:30;13699:34;13679:18;;;13672:62;13770:14;13750:18;;;13743:42;13802:19;;1629:80:32;13419:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;14034:2:111;1719:87:32;;;14016:21:111;14073:2;14053:18;;;14046:30;14112:34;14092:18;;;14085:62;14183:14;14163:18;;;14156:42;14215:19;;1719:87:32;13832:408:111;1719:87:32;3636:36:::1;3654:17;3636;:36::i;:::-;3682:52;3704:17;3723:4;3729;3682:21;:52::i;:::-;3519:222:::0;;:::o;2762:131::-;2840:7;2080:4;2072:23;2089:6;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:32;;14765:2:111;2064:92:32;;;14747:21:111;14804:2;14784:18;;;14777:30;14843:34;14823:18;;;14816:62;14914:26;14894:18;;;14887:54;14958:19;;2064:92:32;14563:420:111;2064:92:32;-1:-1:-1;1030:66:28::1;2762:131:32::0;:::o;1680:158:73:-;1766:31;:29;:31::i;:::-;1807:24;1813:4;1819:5;1826:4;;1807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1807:5:73;;-1:-1:-1;;;1807:24:73:i;:::-;1680:158;;;;:::o;3730:113::-;3799:37;;;;;3830:4;3799:37;;;4583:74:111;3773:7:73;;3799:22;1121:11;3799:22;;;;4556:18:111;;3799:37:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3792:44;;3730:113;:::o;2483:101::-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;15379:2:111;3303:190:31;;;15361:21:111;15418:2;15398:18;;;15391:30;15457:34;15437:18;;;15430:62;15528:16;15508:18;;;15501:44;15562:19;;3303:190:31;15177:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;2557:20:73::1;2569:7;2557:11;:20::i;:::-;3618:14:31::0;3614:99;;;3664:5;3648:21;;;;;;3688:14;;-1:-1:-1;15744:36:111;;3688:14:31;;15732:2:111;15717:18;3688:14:31;;;;;;;3247:472;2483:101:73;:::o;935:121:51:-;1010:39;;;;;1040:4;1010:39;;;15973:74:111;984:7:51;16063:18:111;;;16056:91;;;984:7:51;1010:21;1121:11:73;1010:21:51;;;;15946:18:111;;1010:39:51;15791:362:111;1310:142:90;1369:17;;:::i;:::-;1398:24;;:::i;:::-;1439:6;1310:142;-1:-1:-1;1310:142:90:o;907:145::-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;15379:2:111;3303:190:31;;;15361:21:111;15418:2;15398:18;;;15391:30;15457:34;15437:18;;;15430:62;15528:16;15508:18;;;15501:44;15562:19;;3303:190:31;15177:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;1016:29:90::1;1042:1;1016:17;:29::i;2808:175:73:-:0;2881:10;:35;1121:11;2881:35;;;:58;;-1:-1:-1;2934:5:73;;;;;;;2920:10;:19;2881:58;2873:103;;;;-1:-1:-1;;;2873:103:73;;16360:2:111;2873:103:73;;;16342:21:111;;;16379:18;;;16372:30;16438:34;16418:18;;;16411:62;16490:18;;2873:103:73;16158:356:111;2873:103:73;2808:175::o;3366:287::-;3451:12;3465:19;3488:6;:11;;3508:5;3515:4;3488:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3450:70;;;;3535:7;3530:117;;3615:6;3609:13;3604:2;3596:6;3592:15;3585:38;4352:135;4468:12;:10;:12::i;2650:952:28:-;689:66;3096:48;;;3092:504;;;3160:37;3179:17;3160:18;:37::i;:::-;2650:952;;;:::o;3092:504::-;3250:17;3232:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3232:52:28;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3228:291;;3448:56;;-1:-1:-1;;;3448:56:28;;17452:2:111;3448:56:28;;;17434:21:111;17491:2;17471:18;;;17464:30;17530:34;17510:18;;;17503:62;17601:16;17581:18;;;17574:44;17635:19;;3448:56:28;17250:410:111;3228:291:28;1030:66;3334:28;;3326:82;;;;-1:-1:-1;;;3326:82:28;;17867:2:111;3326:82:28;;;17849:21:111;17906:2;17886:18;;;17879:30;17945:34;17925:18;;;17918:62;18016:11;17996:18;;;17989:39;18045:19;;3326:82:28;17665:405:111;3326:82:28;3285:138;3532:53;3550:17;3569:4;3575:9;3532:17;:53::i;1892:149:51:-;1966:10;:35;1121:11:73;1966:35:51;;1958:76;;;;-1:-1:-1;;;1958:76:51;;18277:2:111;1958:76:51;;;18259:21:111;18316:2;18296:18;;;18289:30;18355;18335:18;;;18328:58;18403:18;;1958:76:51;18075:352:111;4316:337:51;4397:24;;4393:254;;4455:82;;4438:12;;4463:10;;4515:17;;4488:19;;4438:12;4455:82;4438:12;4455:82;4488:19;4463:10;4515:17;4455:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:233:73;1524:5;;;;;;;1510:10;:19;;:50;;-1:-1:-1;1533:10:73;1555:4;1533:27;1510:50;1502:73;;;;-1:-1:-1;;;1502:73:73;;18844:2:111;1502:73:73;;;18826:21:111;18883:2;18863:18;;;18856:30;18922:12;18902:18;;;18895:40;18952:18;;1502:73:73;18642:334:111;2590:146:73;2655:5;:15;;;;;;;;;;;;;;;;;;2685:44;;2723:5;;;;;;2710:11;2685:44;;;;;;;2590:146;:::o;1532:259:28:-;1465:19:42;;;;1605:95:28;;;;-1:-1:-1;;;1605:95:28;;19183:2:111;1605:95:28;;;19165:21:111;19222:2;19202:18;;;19195:30;19261:34;19241:18;;;19234:62;19332:15;19312:18;;;19305:43;19365:19;;1605:95:28;18981:409:111;1605:95:28;1030:66;1710:74;;;;;;;;;;;;;;;1532:259::o;2183:295::-;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;:53::i;1897:152::-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;;;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;19597:2:111;7908:60:42;;;19579:21:111;19636:2;19616:18;;;19609:30;19675:31;19655:18;;;19648:59;19724:18;;7908:60:42;19395:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:154:111:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:347;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:111;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;455:59;173:347;;;;;:::o;525:1205::-;651:6;659;667;675;683;691;699;707;760:3;748:9;739:7;735:23;731:33;728:53;;;777:1;774;767:12;728:53;816:9;803:23;835:31;860:5;835:31;:::i;:::-;885:5;-1:-1:-1;942:2:111;927:18;;914:32;955:33;914:32;955:33;:::i;:::-;1007:7;-1:-1:-1;1066:2:111;1051:18;;1038:32;1079:33;1038:32;1079:33;:::i;:::-;1131:7;-1:-1:-1;1185:2:111;1170:18;;1157:32;;-1:-1:-1;1240:3:111;1225:19;;1212:33;1264:18;1294:14;;;1291:34;;;1321:1;1318;1311:12;1291:34;1360:58;1410:7;1401:6;1390:9;1386:22;1360:58;:::i;:::-;1437:8;;-1:-1:-1;1334:84:111;-1:-1:-1;1525:3:111;1510:19;;1497:33;;-1:-1:-1;1542:16:111;;;1539:36;;;1571:1;1568;1561:12;1539:36;;1610:60;1662:7;1651:8;1640:9;1636:24;1610:60;:::i;:::-;525:1205;;;;-1:-1:-1;525:1205:111;;-1:-1:-1;525:1205:111;;;;;;1689:8;-1:-1:-1;;;525:1205:111:o;1735:332::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;1901:9;1888:23;1951:66;1944:5;1940:78;1933:5;1930:89;1920:117;;2033:1;2030;2023:12;2264:754;2361:6;2369;2377;2385;2393;2446:3;2434:9;2425:7;2421:23;2417:33;2414:53;;;2463:1;2460;2453:12;2414:53;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:111;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2693:7;-1:-1:-1;2747:2:111;2732:18;;2719:32;;-1:-1:-1;2802:2:111;2787:18;;2774:32;2829:18;2818:30;;2815:50;;;2861:1;2858;2851:12;2815:50;2900:58;2950:7;2941:6;2930:9;2926:22;2900:58;:::i;:::-;2264:754;;;;-1:-1:-1;2264:754:111;;-1:-1:-1;2977:8:111;;2874:84;2264:754;-1:-1:-1;;;2264:754:111:o;3276:367::-;3339:8;3349:6;3403:3;3396:4;3388:6;3384:17;3380:27;3370:55;;3421:1;3418;3411:12;3370:55;-1:-1:-1;3444:20:111;;3487:18;3476:30;;3473:50;;;3519:1;3516;3509:12;3473:50;3556:4;3548:6;3544:17;3532:29;;3616:3;3609:4;3599:6;3596:1;3592:14;3584:6;3580:27;3576:38;3573:47;3570:67;;;3633:1;3630;3623:12;3648:784;3781:6;3789;3797;3805;3858:2;3846:9;3837:7;3833:23;3829:32;3826:52;;;3874:1;3871;3864:12;3826:52;3914:9;3901:23;3943:18;3984:2;3976:6;3973:14;3970:34;;;4000:1;3997;3990:12;3970:34;4039:70;4101:7;4092:6;4081:9;4077:22;4039:70;:::i;:::-;4128:8;;-1:-1:-1;4013:96:111;-1:-1:-1;4216:2:111;4201:18;;4188:32;;-1:-1:-1;4232:16:111;;;4229:36;;;4261:1;4258;4251:12;4229:36;;4300:72;4364:7;4353:8;4342:9;4338:24;4300:72;:::i;:::-;3648:784;;;;-1:-1:-1;4391:8:111;-1:-1:-1;;;;3648:784:111:o;4668:247::-;4727:6;4780:2;4768:9;4759:7;4755:23;4751:32;4748:52;;;4796:1;4793;4786:12;4748:52;4835:9;4822:23;4854:31;4879:5;4854:31;:::i;4920:530::-;5031:6;5039;5047;5100:2;5088:9;5079:7;5075:23;5071:32;5068:52;;;5116:1;5113;5106:12;5068:52;5156:9;5143:23;5189:18;5181:6;5178:30;5175:50;;;5221:1;5218;5211:12;5175:50;5244:22;;5300:3;5282:16;;;5278:26;5275:46;;;5317:1;5314;5307:12;5275:46;5340:2;5389;5374:18;;5361:32;;-1:-1:-1;5440:2:111;5425:18;;;5412:32;;4920:530;-1:-1:-1;;;4920:530:111:o;5637:323::-;5713:6;5721;5774:2;5762:9;5753:7;5749:23;5745:32;5742:52;;;5790:1;5787;5780:12;5742:52;5829:9;5816:23;5848:31;5873:5;5848:31;:::i;:::-;5898:5;5950:2;5935:18;;;;5922:32;;-1:-1:-1;;;5637:323:111:o;5965:184::-;6017:77;6014:1;6007:88;6114:4;6111:1;6104:15;6138:4;6135:1;6128:15;6154:334;6225:2;6219:9;6281:2;6271:13;;6286:66;6267:86;6255:99;;6384:18;6369:34;;6405:22;;;6366:62;6363:88;;;6431:18;;:::i;:::-;6467:2;6460:22;6154:334;;-1:-1:-1;6154:334:111:o;6493:957::-;6570:6;6578;6631:2;6619:9;6610:7;6606:23;6602:32;6599:52;;;6647:1;6644;6637:12;6599:52;6686:9;6673:23;6705:31;6730:5;6705:31;:::i;:::-;6755:5;-1:-1:-1;6779:2:111;6817:18;;;6804:32;6855:18;6885:14;;;6882:34;;;6912:1;6909;6902:12;6882:34;6950:6;6939:9;6935:22;6925:32;;6995:7;6988:4;6984:2;6980:13;6976:27;6966:55;;7017:1;7014;7007:12;6966:55;7053:2;7040:16;7075:2;7071;7068:10;7065:36;;;7081:18;;:::i;:::-;7123:112;7231:2;7162:66;7155:4;7151:2;7147:13;7143:86;7139:95;7123:112;:::i;:::-;7110:125;;7258:2;7251:5;7244:17;7298:7;7293:2;7288;7284;7280:11;7276:20;7273:33;7270:53;;;7319:1;7316;7309:12;7270:53;7374:2;7369;7365;7361:11;7356:2;7349:5;7345:14;7332:45;7418:1;7413:2;7408;7401:5;7397:14;7393:23;7386:34;;7439:5;7429:15;;;;;6493:957;;;;;:::o;7889:612::-;7977:6;7985;7993;8001;8054:2;8042:9;8033:7;8029:23;8025:32;8022:52;;;8070:1;8067;8060:12;8022:52;8109:9;8096:23;8128:31;8153:5;8128:31;:::i;:::-;8178:5;-1:-1:-1;8230:2:111;8215:18;;8202:32;;-1:-1:-1;8285:2:111;8270:18;;8257:32;8312:18;8301:30;;8298:50;;;8344:1;8341;8334:12;8298:50;8383:58;8433:7;8424:6;8413:9;8409:22;8383:58;:::i;8506:1338::-;8666:6;8674;8682;8690;8698;8706;8714;8722;8775:3;8763:9;8754:7;8750:23;8746:33;8743:53;;;8792:1;8789;8782:12;8743:53;8831:9;8818:23;8850:31;8875:5;8850:31;:::i;:::-;8900:5;-1:-1:-1;8957:2:111;8942:18;;8929:32;8970:33;8929:32;8970:33;:::i;:::-;9022:7;-1:-1:-1;9080:2:111;9065:18;;9052:32;9103:18;9133:14;;;9130:34;;;9160:1;9157;9150:12;9130:34;9199:70;9261:7;9252:6;9241:9;9237:22;9199:70;:::i;:::-;9288:8;;-1:-1:-1;9173:96:111;-1:-1:-1;9376:2:111;9361:18;;9348:32;;-1:-1:-1;9392:16:111;;;9389:36;;;9421:1;9418;9411:12;9389:36;9460:72;9524:7;9513:8;9502:9;9498:24;9460:72;:::i;:::-;9551:8;;-1:-1:-1;9434:98:111;-1:-1:-1;9639:3:111;9624:19;;9611:33;;-1:-1:-1;9656:16:111;;;9653:36;;;9685:1;9682;9675:12;9849:495;10029:3;10014:19;;10018:9;10110:6;9987:4;10144:194;10158:4;10155:1;10152:11;10144:194;;;10217:13;;10205:26;;10254:4;10278:12;;;;10313:15;;;;10178:1;10171:9;10144:194;;;10148:3;;;9849:495;;;;:::o;10349:761::-;10431:6;10484:3;10472:9;10463:7;10459:23;10455:33;10452:53;;;10501:1;10498;10491:12;10452:53;10550:7;10543:4;10532:9;10528:20;10524:34;10514:62;;10572:1;10569;10562:12;10514:62;10605:2;10599:9;10647:3;10639:6;10635:16;10717:6;10705:10;10702:22;10681:18;10669:10;10666:34;10663:62;10660:88;;;10728:18;;:::i;:::-;10764:2;10757:22;10799:6;10843:3;10828:19;;10859;;;10856:39;;;10891:1;10888;10881:12;10856:39;10915:9;10933:146;10949:6;10944:3;10941:15;10933:146;;;11017:17;;11005:30;;11064:4;11055:14;;;;10966;10933:146;;;-1:-1:-1;11098:6:111;;10349:761;-1:-1:-1;;;;;10349:761:111:o;11115:823::-;11221:6;11229;11237;11245;11253;11261;11314:3;11302:9;11293:7;11289:23;11285:33;11282:53;;;11331:1;11328;11321:12;11282:53;11370:9;11357:23;11389:31;11414:5;11389:31;:::i;:::-;11439:5;-1:-1:-1;11496:2:111;11481:18;;11468:32;11509:33;11468:32;11509:33;:::i;:::-;11561:7;-1:-1:-1;11615:2:111;11600:18;;11587:32;;-1:-1:-1;11666:2:111;11651:18;;11638:32;;-1:-1:-1;11721:3:111;11706:19;;11693:33;11749:18;11738:30;;11735:50;;;11781:1;11778;11771:12;11735:50;11820:58;11870:7;11861:6;11850:9;11846:22;11820:58;:::i;:::-;11115:823;;;;-1:-1:-1;11115:823:111;;-1:-1:-1;11115:823:111;;11897:8;;11115:823;-1:-1:-1;;;11115:823:111:o;12291:184::-;12343:77;12340:1;12333:88;12440:4;12437:1;12430:15;12464:4;12461:1;12454:15;12480:580;12557:4;12563:6;12623:11;12610:25;12713:66;12702:8;12686:14;12682:29;12678:102;12658:18;12654:127;12644:155;;12795:1;12792;12785:12;12644:155;12822:33;;12874:20;;;-1:-1:-1;12917:18:111;12906:30;;12903:50;;;12949:1;12946;12939:12;12903:50;12982:4;12970:17;;-1:-1:-1;13013:14:111;13009:27;;;12999:38;;12996:58;;;13050:1;13047;13040:12;13065:349;13104:3;13135:66;13128:5;13125:77;13122:257;;13235:77;13232:1;13225:88;13336:4;13333:1;13326:15;13364:4;13361:1;13354:15;13122:257;-1:-1:-1;13406:1:111;13395:13;;13065:349::o;14988:184::-;15058:6;15111:2;15099:9;15090:7;15086:23;15082:32;15079:52;;;15127:1;15124;15117:12;15079:52;-1:-1:-1;15150:16:111;;14988:184;-1:-1:-1;14988:184:111:o;16519:258::-;16591:1;16601:113;16615:6;16612:1;16609:13;16601:113;;;16691:11;;;16685:18;16672:11;;;16665:39;16637:2;16630:10;16601:113;;;16732:6;16729:1;16726:13;16723:48;;;-1:-1:-1;;16767:1:111;16749:16;;16742:27;16519:258::o;16782:274::-;16911:3;16949:6;16943:13;16965:53;17011:6;17006:3;16999:4;16991:6;16987:17;16965:53;:::i;:::-;17034:16;;;;;16782:274;-1:-1:-1;;16782:274:111:o;19753:442::-;19902:2;19891:9;19884:21;19865:4;19934:6;19928:13;19977:6;19972:2;19961:9;19957:18;19950:34;19993:66;20052:6;20047:2;20036:9;20032:18;20027:2;20019:6;20015:15;19993:66;:::i;:::-;20111:2;20099:15;20116:66;20095:88;20080:104;;;;20186:2;20076:113;;19753:442;-1:-1:-1;;19753:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"1722000","executionCost":"infinite","totalCost":"infinite"},"external":{"addDeposit()":"infinite","aggregator()":"infinite","entryPoint()":"infinite","execute(address,uint256,bytes)":"infinite","executeBatch(address[],bytes[])":"infinite","getBlsPublicKey()":"infinite","getDeposit()":"infinite","getNonce()":"infinite","initialize(address)":"infinite","initialize(uint256[4])":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2392","proxiableUUID()":"infinite","supportsInterface(bytes4)":"472","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","upgradeTo(address)":"infinite","upgradeToAndCall(address,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawDepositTo(address,uint256)":"infinite"},"internal":{"_validateSignature(struct UserOperation calldata,bytes32)":"infinite"}},"methodIdentifiers":{"addDeposit()":"4a58db19","aggregator()":"245a7bfc","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getBlsPublicKey()":"e02afbae","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","initialize(uint256[4])":"ee472f36","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"anAggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"oldPublicKey\",\"type\":\"uint256[4]\"},{\"indexed\":false,\"internalType\":\"uint256[4]\",\"name\":\"newPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"PublicKeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"aggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlsPublicKey\",\"outputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"\",\"type\":\"uint256[4]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getBlsPublicKey()\":{\"returns\":{\"_0\":\"public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\"}},\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"for testing: a BLS account that fails to return its public-key (completely ignores its publickey) this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/BrokenBlsAccount.sol\":\"BrokenBLSAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/BrokenBlsAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\nimport \\\"../samples/bls/IBLSAccount.sol\\\";\\n\\n/**\\n * for testing: a BLS account that fails to return its public-key (completely ignores its publickey)\\n * this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.\\n */\\ncontract BrokenBLSAccount is SimpleAccount, IBLSAccount {\\n address public immutable aggregator;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable values slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\\n (aPublicKey);\\n super._initialize(address(0));\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n\\n (userOp, userOpHash);\\n return _packValidationData(ValidationData(aggregator, 0,0));\\n }\\n\\n function getBlsPublicKey() external override pure returns (uint256[4] memory) {\\n uint256[4] memory pubkey;\\n return pubkey;\\n }\\n}\\n\\n\\n/**\\n * Based n SimpleAccountFactory\\n * can't be a subclass, since both constructor and createAccount depend on the\\n * actual wallet contract constructor and initializer\\n */\\ncontract BrokenBLSAccountFactory {\\n BrokenBLSAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint entryPoint, address aggregator){\\n accountImplementation = new BrokenBLSAccount(entryPoint, aggregator);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n * Also note that out BLSSignatureAggregator requires that the public-key is the last parameter\\n */\\n function createAccount(uint salt, uint256[4] memory aPublicKey) public returns (BrokenBLSAccount) {\\n\\n address addr = getAddress(salt, aPublicKey);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return BrokenBLSAccount(payable(addr));\\n }\\n return BrokenBLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(BrokenBLSAccount.initialize, aPublicKey)\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(uint salt, uint256[4] memory aPublicKey) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(BrokenBLSAccount.initialize, (aPublicKey))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0xeaedb1077e67697d1edc9cb36de5c2056421c4c6200a131b956fa66e3dd2ce07\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"contracts/test/BrokenBlsAccount.sol:BrokenBLSAccount","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"contracts/test/BrokenBlsAccount.sol:BrokenBLSAccount","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":13838,"contract":"contracts/test/BrokenBlsAccount.sol:BrokenBLSAccount","label":"owner","offset":2,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDeposit()":{"notice":"deposit more funds for this account in the entryPoint"},"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"execute(address,uint256,bytes)":{"notice":"execute a transaction (called directly from owner, or by entryPoint)"},"executeBatch(address[],bytes[])":{"notice":"execute a sequence of transactions"},"getDeposit()":{"notice":"check current account deposit in the entryPoint"},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"withdrawDepositTo(address,uint256)":{"notice":"withdraw value from the account's deposit"}},"notice":"for testing: a BLS account that fails to return its public-key (completely ignores its publickey) this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.","version":1}},"BrokenBLSAccountFactory":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"contract BrokenBLSAccount","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"createAccount","outputs":[{"internalType":"contract BrokenBLSAccount","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint256[4]","name":"aPublicKey","type":"uint256[4]"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19130":{"entryPoint":null,"id":19130,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":170,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":146,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:927:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"750:175:111","statements":[{"nodeType":"YulAssignment","src":"760:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"760:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"795:29:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"813:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"818:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"809:3:111"},"nodeType":"YulFunctionCall","src":"809:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"822:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"805:3:111"},"nodeType":"YulFunctionCall","src":"805:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"799:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"840:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"855:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"863:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"851:3:111"},"nodeType":"YulFunctionCall","src":"851:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"833:6:111"},"nodeType":"YulFunctionCall","src":"833:34:111"},"nodeType":"YulExpressionStatement","src":"833:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"887:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"898:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"883:3:111"},"nodeType":"YulFunctionCall","src":"883:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"907:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"915:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"903:3:111"},"nodeType":"YulFunctionCall","src":"903:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"876:6:111"},"nodeType":"YulFunctionCall","src":"876:43:111"},"nodeType":"YulExpressionStatement","src":"876:43:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"711:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"722:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"730:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"741:4:111","type":""}],"src":"600:325:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := sub(shl(160, 1), 1)\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b506040516131bc3803806131bc83398101604081905261002f916100aa565b818160405161003d90610085565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610070573d6000803e3d6000fd5b506001600160a01b0316608052506100e49050565b6123a480610e1883390190565b6001600160a01b03811681146100a757600080fd5b50565b600080604083850312156100bd57600080fd5b82516100c881610092565b60208401519092506100d981610092565b809150509250929050565b608051610d0d61010b60003960008181604b0152818160f7015261020d0152610d0d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe1461004657806319c2a1b214610096578063de3398dd146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461038e565b6100bc565b61006d6100b736600461038e565b6101de565b6000806100c984846101de565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101d8565b8460001b7f0000000000000000000000000000000000000000000000000000000000000000856040516024016101279190610418565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f3600000000000000000000000000000000000000000000000000000000179052516101a790610352565b6101b2929190610479565b8190604051809103906000f59050801580156101d2573d6000803e3d6000fd5b50925050505b92915050565b60006103198360001b604051806020016101f790610352565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008560405160240161023d9190610418565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f360000000000000000000000000000000000000000000000000000000017905290516102c293929101610479565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102fe92916020016104e7565b60405160208183030381529060405280519060200120610320565b9392505050565b60006103198383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c18061051783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060a083850312156103a157600080fd5b82359150602084603f8501126103b657600080fd5b6040516080810181811067ffffffffffffffff821117156103d9576103d961035f565b6040528060a08601878111156103ee57600080fd5b8387015b8181101561040957803583529184019184016103f2565b50505080925050509250929050565b60808101818360005b6004811015610440578151835260209283019290910190600101610421565b50505092915050565b60005b8381101561046457818101518382015260200161044c565b83811115610473576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600082518060408401526104b4816060850160208701610449565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104f9818460208801610449565b83519083019061050d818360208801610449565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e7b05a5b3c736f661e953b26d2958c20a0633c2b42c71686f07cf40762fb9b0064736f6c634300080f003360e0604052306080523480156200001557600080fd5b50604051620023a4380380620023a483398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c0516121a2620002026000396000818161027d01526108ee0152600081816103a401528181610931015281816109d801528181610dae01528181610fe5015281816111550152818161145901526115fe0152600081816107080152818161079e01528181610a9c01528181610b320152610c6101526121a26000f3fe60806040526004361061016d5760003560e01c806352d1902d116100cb578063c399ec881161007f578063e02afbae11610059578063e02afbae1461047a578063ee472f361461049c578063f23a6e61146104bc57600080fd5b8063c399ec8814610430578063c4d66de814610445578063d087d2881461046557600080fd5b8063b0d691fe116100b0578063b0d691fe14610395578063b61d27f6146103c8578063bc197c81146103e857600080fd5b806352d1902d1461034d5780638da5cb5b1461036257600080fd5b80633659cfe6116101225780634a58db19116101075780634a58db19146103125780634d44560d1461031a5780634f1ef2861461033a57600080fd5b80633659cfe6146102c45780633a871cdd146102e457600080fd5b8063150b7a0211610153578063150b7a02146101d557806318dfb3c71461024b578063245a7bfc1461026b57600080fd5b806223de291461017957806301ffc9a7146101a057600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019e61019436600461198f565b5050505050505050565b005b3480156101ac57600080fd5b506101c06101bb366004611a40565b610502565b60405190151581526020015b60405180910390f35b3480156101e157600080fd5b5061021a6101f0366004611a82565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101cc565b34801561025757600080fd5b5061019e610266366004611b3a565b6105e7565b34801561027757600080fd5b5061029f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b3480156102d057600080fd5b5061019e6102df366004611ba6565b6106f1565b3480156102f057600080fd5b506103046102ff366004611bc3565b6108c2565b6040519081526020016101cc565b61019e61092f565b34801561032657600080fd5b5061019e610335366004611c17565b6109ce565b61019e610348366004611cc1565b610a85565b34801561035957600080fd5b50610304610c47565b34801561036e57600080fd5b5060005461029f9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061029f565b3480156103d457600080fd5b5061019e6103e3366004611d87565b610d19565b3480156103f457600080fd5b5061021a610403366004611dd7565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561043c57600080fd5b50610304610d68565b34801561045157600080fd5b5061019e610460366004611ba6565b610e1f565b34801561047157600080fd5b50610304610f98565b34801561048657600080fd5b5061048f611014565b6040516101cc9190611e75565b3480156104a857600080fd5b5061019e6104b7366004611ea6565b611029565b3480156104c857600080fd5b5061021a6104d7366004611f24565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061059557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806105e157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6105ef61113d565b8281146106435760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156106ea576106d885858381811061066357610663611fa0565b90506020020160208101906106789190611ba6565b600085858581811061068c5761068c611fa0565b905060200281019061069e9190611fcf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b806106e281612034565b915050610646565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361079c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108117f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461089a5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b6108a381611269565b604080516000808252602082019092526108bf91839190611271565b50565b60006108cc611441565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168082526000602083018190529190920152610928826114c6565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b1580156109ba57600080fd5b505af11580156106ea573d6000803e3d6000fd5b6109d6611531565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a6957600080fd5b505af1158015610a7d573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b305760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161063a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ba57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161063a565b610c3782611269565b610c4382826001611271565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161063a565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d2161113d565b610d62848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ec92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612093565b905090565b600054610100900460ff1615808015610e3f5750600054600160ff909116105b80610e595750303b158015610e59575060005460ff166001145b610ecb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f32826115a8565b8015610c4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dd9565b61101c611906565b611024611906565b919050565b600054610100900460ff16158080156110495750600054600160ff909116105b806110635750303b158015611063575060005460ff166001145b6110d55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561113357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f3260006115a8565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061119e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b6111ea5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74604482015260640161063a565b565b6000808473ffffffffffffffffffffffffffffffffffffffff16848460405161121591906120d8565b60006040518083038185875af1925050503d8060008114611252576040519150601f19603f3d011682016040523d82523d6000602084013e611257565b606091505b5091509150816106ea57805160208201fd5b6108bf611531565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156112a9576112a483611647565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561132e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261132b91810190612093565b60015b6113a05760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146114355760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161063a565b506112a4838383611737565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146111ea5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000604482015260640161063a565b80156108bf5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d80600081146106ea576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061155c57503330145b6111ea5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e657200000000000000000000000000000000000000000000604482015260640161063a565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6116d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161063a565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6117408361175c565b60008251118061174d5750805b156112a457610d6283836117a9565b61176581611647565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061092883836040518060600160405280602781526020016121466027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516117f391906120d8565b600060405180830381855af49150503d806000811461182e576040519150601f19603f3d011682016040523d82523d6000602084013e611833565b606091505b50915091506118448683838761184e565b9695505050505050565b606083156118ca5782516000036118c35773ffffffffffffffffffffffffffffffffffffffff85163b6118c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161063a565b50816118d4565b6118d483836118dc565b949350505050565b8151156118ec5781518083602001fd5b8060405162461bcd60e51b815260040161063a91906120f4565b60405180608001604052806004906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146108bf57600080fd5b60008083601f84011261195857600080fd5b50813567ffffffffffffffff81111561197057600080fd5b60208301915083602082850101111561198857600080fd5b9250929050565b60008060008060008060008060c0898b0312156119ab57600080fd5b88356119b681611924565b975060208901356119c681611924565b965060408901356119d681611924565b955060608901359450608089013567ffffffffffffffff808211156119fa57600080fd5b611a068c838d01611946565b909650945060a08b0135915080821115611a1f57600080fd5b50611a2c8b828c01611946565b999c989b5096995094979396929594505050565b600060208284031215611a5257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461092857600080fd5b600080600080600060808688031215611a9a57600080fd5b8535611aa581611924565b94506020860135611ab581611924565b935060408601359250606086013567ffffffffffffffff811115611ad857600080fd5b611ae488828901611946565b969995985093965092949392505050565b60008083601f840112611b0757600080fd5b50813567ffffffffffffffff811115611b1f57600080fd5b6020830191508360208260051b850101111561198857600080fd5b60008060008060408587031215611b5057600080fd5b843567ffffffffffffffff80821115611b6857600080fd5b611b7488838901611af5565b90965094506020870135915080821115611b8d57600080fd5b50611b9a87828801611af5565b95989497509550505050565b600060208284031215611bb857600080fd5b813561092881611924565b600080600060608486031215611bd857600080fd5b833567ffffffffffffffff811115611bef57600080fd5b84016101608187031215611c0257600080fd5b95602085013595506040909401359392505050565b60008060408385031215611c2a57600080fd5b8235611c3581611924565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611cb957611cb9611c43565b604052919050565b60008060408385031215611cd457600080fd5b8235611cdf81611924565b915060208381013567ffffffffffffffff80821115611cfd57600080fd5b818601915086601f830112611d1157600080fd5b813581811115611d2357611d23611c43565b611d53847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c72565b91508082528784828501011115611d6957600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060008060608587031215611d9d57600080fd5b8435611da881611924565b935060208501359250604085013567ffffffffffffffff811115611dcb57600080fd5b611b9a87828801611946565b60008060008060008060008060a0898b031215611df357600080fd5b8835611dfe81611924565b97506020890135611e0e81611924565b9650604089013567ffffffffffffffff80821115611e2b57600080fd5b611e378c838d01611af5565b909850965060608b0135915080821115611e5057600080fd5b611e5c8c838d01611af5565b909650945060808b0135915080821115611a1f57600080fd5b60808101818360005b6004811015611e9d578151835260209283019290910190600101611e7e565b50505092915050565b600060808284031215611eb857600080fd5b82601f830112611ec757600080fd5b6040516080810181811067ffffffffffffffff82111715611eea57611eea611c43565b604052806080840185811115611eff57600080fd5b845b81811015611f19578035835260209283019201611f01565b509195945050505050565b60008060008060008060a08789031215611f3d57600080fd5b8635611f4881611924565b95506020870135611f5881611924565b94506040870135935060608701359250608087013567ffffffffffffffff811115611f8257600080fd5b611f8e89828a01611946565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261200457600080fd5b83018035915067ffffffffffffffff82111561201f57600080fd5b60200191503681900382131561198857600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156120a557600080fd5b5051919050565b60005b838110156120c75781810151838201526020016120af565b83811115610d625750506000910152565b600082516120ea8184602087016120ac565b9190910192915050565b60208152600082518060208401526121138160408501602087016120ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c6174ece9aa7a093b2d189b4c38248b1bffceada2cfe3a663a2f8614e59da33a64736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x31BC CODESIZE SUB DUP1 PUSH2 0x31BC DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xAA JUMP JUMPDEST DUP2 DUP2 PUSH1 0x40 MLOAD PUSH2 0x3D SWAP1 PUSH2 0x85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x70 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH2 0xE4 SWAP1 POP JUMP JUMPDEST PUSH2 0x23A4 DUP1 PUSH2 0xE18 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH2 0xC8 DUP2 PUSH2 0x92 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xD9 DUP2 PUSH2 0x92 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xD0D PUSH2 0x10B PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH1 0x4B ADD MSTORE DUP2 DUP2 PUSH1 0xF7 ADD MSTORE PUSH2 0x20D ADD MSTORE PUSH2 0xD0D PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x19C2A1B2 EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0xDE3398DD EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E JUMP JUMPDEST PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1DE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1D8 JUMP JUMPDEST DUP5 PUSH1 0x0 SHL PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x127 SWAP2 SWAP1 PUSH2 0x418 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1A7 SWAP1 PUSH2 0x352 JUMP JUMPDEST PUSH2 0x1B2 SWAP3 SWAP2 SWAP1 PUSH2 0x479 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x319 DUP4 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x1F7 SWAP1 PUSH2 0x352 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND PUSH1 0x40 MSTORE POP PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x23D SWAP2 SWAP1 PUSH2 0x418 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x2C2 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x479 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x2FE SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x4E7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x320 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x319 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x517 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP5 PUSH1 0x3F DUP6 ADD SLT PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x3D9 JUMPI PUSH2 0x3D9 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0xA0 DUP7 ADD DUP8 DUP2 GT ISZERO PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP8 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x409 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE SWAP2 DUP5 ADD SWAP2 DUP5 ADD PUSH2 0x3F2 JUMP JUMPDEST POP POP POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x440 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x421 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x464 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x44C JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4B4 DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x449 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x4F9 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x449 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x50D DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x449 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220E7B05A JUMPDEST EXTCODECOPY PUSH20 0x6F661E953B26D2958C20A0633C2B42C71686F07C DELEGATECALL SMOD PUSH3 0xFB9B00 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER PUSH1 0xE0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x23A4 CODESIZE SUB DUP1 PUSH3 0x23A4 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x21A2 PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x27D ADD MSTORE PUSH2 0x8EE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x3A4 ADD MSTORE DUP2 DUP2 PUSH2 0x931 ADD MSTORE DUP2 DUP2 PUSH2 0x9D8 ADD MSTORE DUP2 DUP2 PUSH2 0xDAE ADD MSTORE DUP2 DUP2 PUSH2 0xFE5 ADD MSTORE DUP2 DUP2 PUSH2 0x1155 ADD MSTORE DUP2 DUP2 PUSH2 0x1459 ADD MSTORE PUSH2 0x15FE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x708 ADD MSTORE DUP2 DUP2 PUSH2 0x79E ADD MSTORE DUP2 DUP2 PUSH2 0xA9C ADD MSTORE DUP2 DUP2 PUSH2 0xB32 ADD MSTORE PUSH2 0xC61 ADD MSTORE PUSH2 0x21A2 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x16D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x52D1902D GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xE02AFBAE GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xE02AFBAE EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0xEE472F36 EQ PUSH2 0x49C JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x465 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3C8 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x52D1902D EQ PUSH2 0x34D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 GT PUSH2 0x122 JUMPI DUP1 PUSH4 0x4A58DB19 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x2C4 JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x153 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x174 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x198F JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C0 PUSH2 0x1BB CALLDATASIZE PUSH1 0x4 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x502 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A82 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B3A JUMP JUMPDEST PUSH2 0x5E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x2DF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0x6F1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0x2FF CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC3 JUMP JUMPDEST PUSH2 0x8C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST PUSH2 0x19E PUSH2 0x92F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x335 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C17 JUMP JUMPDEST PUSH2 0x9CE JUMP JUMPDEST PUSH2 0x19E PUSH2 0x348 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CC1 JUMP JUMPDEST PUSH2 0xA85 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xC47 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x29F SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x29F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x3E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D87 JUMP JUMPDEST PUSH2 0xD19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x403 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DD7 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x43C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xD68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x460 CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xE1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x304 PUSH2 0xF98 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x486 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48F PUSH2 0x1014 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1CC SWAP2 SWAP1 PUSH2 0x1E75 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EA6 JUMP JUMPDEST PUSH2 0x1029 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x4D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F24 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x595 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x5E1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5EF PUSH2 0x113D JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x643 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH2 0x6D8 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x663 JUMPI PUSH2 0x663 PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x678 SWAP2 SWAP1 PUSH2 0x1BA6 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x68C JUMPI PUSH2 0x68C PUSH2 0x1FA0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x69E SWAP2 SWAP1 PUSH2 0x1FCF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6E2 DUP2 PUSH2 0x2034 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x646 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x79C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x811 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x89A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0x8A3 DUP2 PUSH2 0x1269 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x8BF SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1271 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8CC PUSH2 0x1441 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x928 DUP3 PUSH2 0x14C6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6EA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9D6 PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xBA5 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH2 0xC37 DUP3 PUSH2 0x1269 JUMP JUMPDEST PUSH2 0xC43 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1271 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x113D JUMP JUMPDEST PUSH2 0xD62 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x11EC SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE1A SWAP2 SWAP1 PUSH2 0x2093 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE3F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE59 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE59 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xECB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF29 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 DUP3 PUSH2 0x15A8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC43 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDD9 JUMP JUMPDEST PUSH2 0x101C PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x1024 PUSH2 0x1906 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0x1049 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0x1063 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1063 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0x10D5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1133 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF32 PUSH1 0x0 PUSH2 0x15A8 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x119E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1215 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1252 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1257 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x6EA JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x8BF PUSH2 0x1531 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x12A9 JUMPI PUSH2 0x12A4 DUP4 PUSH2 0x1647 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x132E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x132B SWAP2 DUP2 ADD SWAP1 PUSH2 0x2093 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x13A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x1435 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST POP PUSH2 0x12A4 DUP4 DUP4 DUP4 PUSH2 0x1737 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8BF JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x6EA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x6EA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x155C JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x16D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x63A JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1740 DUP4 PUSH2 0x175C JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x174D JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x12A4 JUMPI PUSH2 0xD62 DUP4 DUP4 PUSH2 0x17A9 JUMP JUMPDEST PUSH2 0x1765 DUP2 PUSH2 0x1647 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x928 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2146 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x17F3 SWAP2 SWAP1 PUSH2 0x20D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x182E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1833 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1844 DUP7 DUP4 DUP4 DUP8 PUSH2 0x184E JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x18CA JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x18C3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x18C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x63A JUMP JUMPDEST POP DUP2 PUSH2 0x18D4 JUMP JUMPDEST PUSH2 0x18D4 DUP4 DUP4 PUSH2 0x18DC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x18EC JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x63A SWAP2 SWAP1 PUSH2 0x20F4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1958 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1970 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x19AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x19B6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x19C6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x19D6 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A06 DUP13 DUP4 DUP14 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A2C DUP12 DUP3 DUP13 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1AA5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1AB5 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE4 DUP9 DUP3 DUP10 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1B07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1B50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B74 DUP9 DUP4 DUP10 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1B8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x928 DUP2 PUSH2 0x1924 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1C02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C35 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1CB9 JUMPI PUSH2 0x1CB9 PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1CD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1CDF DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1D11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH2 0x1D23 PUSH2 0x1C43 JUMP JUMPDEST PUSH2 0x1D53 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1C72 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP8 DUP5 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1D69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP5 DUP5 ADD DUP6 DUP5 ADD CALLDATACOPY PUSH1 0x0 DUP5 DUP3 DUP5 ADD ADD MSTORE POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1DA8 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9A DUP8 DUP3 DUP9 ADD PUSH2 0x1946 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1DF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1DFE DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1E0E DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1E2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E37 DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1E50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E5C DUP13 DUP4 DUP14 ADD PUSH2 0x1AF5 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x1E9D JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1E7E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1EC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x1EEA JUMPI PUSH2 0x1EEA PUSH2 0x1C43 JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0x80 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x1EFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F19 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1F01 JUMP JUMPDEST POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1F3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1F48 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1F58 DUP2 PUSH2 0x1924 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F8E DUP10 DUP3 DUP11 ADD PUSH2 0x1946 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2004 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x201F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x208C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x20C7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x20AF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD62 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x20EA DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2113 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C6174E 0xCE SWAP11 0xA7 LOG0 SWAP4 0xB2 0xD1 DUP10 0xB4 0xC3 DUP3 BASEFEE 0xB1 0xBF 0xFC 0xEA 0xDA 0x2C INVALID GASPRICE PUSH7 0x3A2F8614E59DA3 GASPRICE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"1630:1777:90:-:0;;;1731:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1841:10;1853;1820:44;;;;;:::i;:::-;-1:-1:-1;;;;;851:15:111;;;833:34;;903:15;;898:2;883:18;;876:43;783:2;768:18;1820:44:90;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1796:68:90;;;-1:-1:-1;1630:1777:90;;-1:-1:-1;1630:1777:90;;;;;;;;;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;600:325::-;1630:1777:90;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@accountImplementation_19112":{"entryPoint":null,"id":19112,"parameterSlots":0,"returnSlots":0},"@computeAddress_5217":{"entryPoint":800,"id":5217,"parameterSlots":2,"returnSlots":1},"@computeAddress_5231":{"entryPoint":null,"id":5231,"parameterSlots":3,"returnSlots":1},"@createAccount_19194":{"entryPoint":188,"id":19194,"parameterSlots":2,"returnSlots":1},"@getAddress_19238":{"entryPoint":478,"id":19238,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr":{"entryPoint":910,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":1255,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":1145,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed":{"entryPoint":1048,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_BrokenBLSAccount_$19108__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":1097,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x41":{"entryPoint":863,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:3344:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"149:125:111","statements":[{"nodeType":"YulAssignment","src":"159:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"171:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"182:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"167:3:111"},"nodeType":"YulFunctionCall","src":"167:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"159:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"201:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"216:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"224:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"212:3:111"},"nodeType":"YulFunctionCall","src":"212:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"194:6:111"},"nodeType":"YulFunctionCall","src":"194:74:111"},"nodeType":"YulExpressionStatement","src":"194:74:111"}]},"name":"abi_encode_tuple_t_contract$_BrokenBLSAccount_$19108__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"118:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"129:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"140:4:111","type":""}],"src":"14:260:111"},{"body":{"nodeType":"YulBlock","src":"311:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"328:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"331:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"321:6:111"},"nodeType":"YulFunctionCall","src":"321:88:111"},"nodeType":"YulExpressionStatement","src":"321:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"425:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"428:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"418:6:111"},"nodeType":"YulFunctionCall","src":"418:15:111"},"nodeType":"YulExpressionStatement","src":"418:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"449:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"452:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"442:6:111"},"nodeType":"YulFunctionCall","src":"442:15:111"},"nodeType":"YulExpressionStatement","src":"442:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"279:184:111"},{"body":{"nodeType":"YulBlock","src":"578:734:111","statements":[{"body":{"nodeType":"YulBlock","src":"625:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"634:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"637:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"627:6:111"},"nodeType":"YulFunctionCall","src":"627:12:111"},"nodeType":"YulExpressionStatement","src":"627:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"599:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"608:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"595:3:111"},"nodeType":"YulFunctionCall","src":"595:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"620:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"591:3:111"},"nodeType":"YulFunctionCall","src":"591:33:111"},"nodeType":"YulIf","src":"588:53:111"},{"nodeType":"YulAssignment","src":"650:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"673:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"660:12:111"},"nodeType":"YulFunctionCall","src":"660:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"650:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"692:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"702:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"696:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"757:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"766:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"769:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"759:6:111"},"nodeType":"YulFunctionCall","src":"759:12:111"},"nodeType":"YulExpressionStatement","src":"759:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"731:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"742:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"727:3:111"},"nodeType":"YulFunctionCall","src":"727:18:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"747:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"723:3:111"},"nodeType":"YulFunctionCall","src":"723:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"716:6:111"},"nodeType":"YulFunctionCall","src":"716:40:111"},"nodeType":"YulIf","src":"713:60:111"},{"nodeType":"YulVariableDeclaration","src":"782:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"802:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"796:5:111"},"nodeType":"YulFunctionCall","src":"796:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"786:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"814:34:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"836:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"844:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"832:3:111"},"nodeType":"YulFunctionCall","src":"832:16:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"818:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"923:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"925:16:111"},"nodeType":"YulFunctionCall","src":"925:18:111"},"nodeType":"YulExpressionStatement","src":"925:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"866:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"878:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"863:2:111"},"nodeType":"YulFunctionCall","src":"863:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"902:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"914:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"899:2:111"},"nodeType":"YulFunctionCall","src":"899:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"860:2:111"},"nodeType":"YulFunctionCall","src":"860:62:111"},"nodeType":"YulIf","src":"857:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"961:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"965:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"954:6:111"},"nodeType":"YulFunctionCall","src":"954:22:111"},"nodeType":"YulExpressionStatement","src":"954:22:111"},{"nodeType":"YulVariableDeclaration","src":"985:17:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"996:6:111"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"989:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1011:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1029:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1040:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1025:3:111"},"nodeType":"YulFunctionCall","src":"1025:19:111"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"1015:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1076:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1085:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1088:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1078:6:111"},"nodeType":"YulFunctionCall","src":"1078:12:111"},"nodeType":"YulExpressionStatement","src":"1078:12:111"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"1059:6:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1067:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1056:2:111"},"nodeType":"YulFunctionCall","src":"1056:19:111"},"nodeType":"YulIf","src":"1053:39:111"},{"nodeType":"YulVariableDeclaration","src":"1101:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1116:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1127:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1112:3:111"},"nodeType":"YulFunctionCall","src":"1112:18:111"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"1105:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1195:86:111","statements":[{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1216:3:111"},{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1234:3:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1221:12:111"},"nodeType":"YulFunctionCall","src":"1221:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1209:6:111"},"nodeType":"YulFunctionCall","src":"1209:30:111"},"nodeType":"YulExpressionStatement","src":"1209:30:111"},{"nodeType":"YulAssignment","src":"1252:19:111","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1263:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1268:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1259:3:111"},"nodeType":"YulFunctionCall","src":"1259:12:111"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"1252:3:111"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1150:3:111"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"1155:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1147:2:111"},"nodeType":"YulFunctionCall","src":"1147:15:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1163:23:111","statements":[{"nodeType":"YulAssignment","src":"1165:19:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1176:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1181:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1172:3:111"},"nodeType":"YulFunctionCall","src":"1172:12:111"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"1165:3:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1143:3:111","statements":[]},"src":"1139:142:111"},{"nodeType":"YulAssignment","src":"1290:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1300:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1290:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"536:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"547:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"559:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"567:6:111","type":""}],"src":"468:844:111"},{"body":{"nodeType":"YulBlock","src":"1418:125:111","statements":[{"nodeType":"YulAssignment","src":"1428:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1451:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1436:3:111"},"nodeType":"YulFunctionCall","src":"1436:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1428:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1470:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1485:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1493:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1481:3:111"},"nodeType":"YulFunctionCall","src":"1481:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1463:6:111"},"nodeType":"YulFunctionCall","src":"1463:74:111"},"nodeType":"YulExpressionStatement","src":"1463:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1387:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1398:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1409:4:111","type":""}],"src":"1317:226:111"},{"body":{"nodeType":"YulBlock","src":"1695:348:111","statements":[{"nodeType":"YulAssignment","src":"1705:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1717:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1728:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1713:3:111"},"nodeType":"YulFunctionCall","src":"1713:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1705:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"1741:20:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"1752:9:111"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"1745:3:111","type":""}]},{"nodeType":"YulAssignment","src":"1770:16:111","value":{"name":"headStart","nodeType":"YulIdentifier","src":"1777:9:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"1770:3:111"}]},{"nodeType":"YulVariableDeclaration","src":"1795:20:111","value":{"name":"value0","nodeType":"YulIdentifier","src":"1809:6:111"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"1799:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1824:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1833:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1828:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1890:147:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1911:3:111"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"1922:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1916:5:111"},"nodeType":"YulFunctionCall","src":"1916:13:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1904:6:111"},"nodeType":"YulFunctionCall","src":"1904:26:111"},"nodeType":"YulExpressionStatement","src":"1904:26:111"},{"nodeType":"YulVariableDeclaration","src":"1943:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1953:4:111","type":"","value":"0x20"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1947:2:111","type":""}]},{"nodeType":"YulAssignment","src":"1970:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"1981:3:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1986:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1977:3:111"},"nodeType":"YulFunctionCall","src":"1977:12:111"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"1970:3:111"}]},{"nodeType":"YulAssignment","src":"2002:25:111","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"2016:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2024:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2012:3:111"},"nodeType":"YulFunctionCall","src":"2012:15:111"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"2002:6:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1854:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1857:4:111","type":"","value":"0x04"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1851:2:111"},"nodeType":"YulFunctionCall","src":"1851:11:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1863:18:111","statements":[{"nodeType":"YulAssignment","src":"1865:14:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1874:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1877:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1870:3:111"},"nodeType":"YulFunctionCall","src":"1870:9:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1865:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1847:3:111","statements":[]},"src":"1843:194:111"}]},"name":"abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1664:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1675:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1686:4:111","type":""}],"src":"1548:495:111"},{"body":{"nodeType":"YulBlock","src":"2101:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2111:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2120:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"2115:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2180:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2205:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2210:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2201:3:111"},"nodeType":"YulFunctionCall","src":"2201:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2224:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"2229:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2220:3:111"},"nodeType":"YulFunctionCall","src":"2220:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2214:5:111"},"nodeType":"YulFunctionCall","src":"2214:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2194:6:111"},"nodeType":"YulFunctionCall","src":"2194:39:111"},"nodeType":"YulExpressionStatement","src":"2194:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2141:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2144:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2138:2:111"},"nodeType":"YulFunctionCall","src":"2138:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"2152:19:111","statements":[{"nodeType":"YulAssignment","src":"2154:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2163:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"2166:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2159:3:111"},"nodeType":"YulFunctionCall","src":"2159:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"2154:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"2134:3:111","statements":[]},"src":"2130:113:111"},{"body":{"nodeType":"YulBlock","src":"2269:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"2282:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2287:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2278:3:111"},"nodeType":"YulFunctionCall","src":"2278:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2296:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2271:6:111"},"nodeType":"YulFunctionCall","src":"2271:27:111"},"nodeType":"YulExpressionStatement","src":"2271:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"2258:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"2261:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2255:2:111"},"nodeType":"YulFunctionCall","src":"2255:13:111"},"nodeType":"YulIf","src":"2252:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"2079:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"2084:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"2089:6:111","type":""}],"src":"2048:258:111"},{"body":{"nodeType":"YulBlock","src":"2458:413:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2475:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2490:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2498:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2486:3:111"},"nodeType":"YulFunctionCall","src":"2486:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2468:6:111"},"nodeType":"YulFunctionCall","src":"2468:74:111"},"nodeType":"YulExpressionStatement","src":"2468:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2562:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2573:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2558:3:111"},"nodeType":"YulFunctionCall","src":"2558:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2578:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2551:6:111"},"nodeType":"YulFunctionCall","src":"2551:30:111"},"nodeType":"YulExpressionStatement","src":"2551:30:111"},{"nodeType":"YulVariableDeclaration","src":"2590:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2610:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2604:5:111"},"nodeType":"YulFunctionCall","src":"2604:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"2594:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2637:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2648:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2633:3:111"},"nodeType":"YulFunctionCall","src":"2633:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"2653:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2626:6:111"},"nodeType":"YulFunctionCall","src":"2626:34:111"},"nodeType":"YulExpressionStatement","src":"2626:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2695:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2703:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2691:3:111"},"nodeType":"YulFunctionCall","src":"2691:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2712:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2723:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2708:3:111"},"nodeType":"YulFunctionCall","src":"2708:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"2728:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"2669:21:111"},"nodeType":"YulFunctionCall","src":"2669:66:111"},"nodeType":"YulExpressionStatement","src":"2669:66:111"},{"nodeType":"YulAssignment","src":"2744:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2760:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2779:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2787:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2775:3:111"},"nodeType":"YulFunctionCall","src":"2775:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"2792:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2771:3:111"},"nodeType":"YulFunctionCall","src":"2771:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2756:3:111"},"nodeType":"YulFunctionCall","src":"2756:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"2862:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2752:3:111"},"nodeType":"YulFunctionCall","src":"2752:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2744:4:111"}]}]},"name":"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2419:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2430:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2438:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2449:4:111","type":""}],"src":"2311:560:111"},{"body":{"nodeType":"YulBlock","src":"3059:283:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3069:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3089:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3083:5:111"},"nodeType":"YulFunctionCall","src":"3083:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3073:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3131:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3139:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3127:3:111"},"nodeType":"YulFunctionCall","src":"3127:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"3146:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"3151:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"3105:21:111"},"nodeType":"YulFunctionCall","src":"3105:53:111"},"nodeType":"YulExpressionStatement","src":"3105:53:111"},{"nodeType":"YulVariableDeclaration","src":"3167:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"3184:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"3189:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3180:3:111"},"nodeType":"YulFunctionCall","src":"3180:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"3171:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3205:29:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"3227:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3221:5:111"},"nodeType":"YulFunctionCall","src":"3221:13:111"},"variables":[{"name":"length_1","nodeType":"YulTypedName","src":"3209:8:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"3269:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3277:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3265:3:111"},"nodeType":"YulFunctionCall","src":"3265:17:111"},{"name":"end_1","nodeType":"YulIdentifier","src":"3284:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"3291:8:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"3243:21:111"},"nodeType":"YulFunctionCall","src":"3243:57:111"},"nodeType":"YulExpressionStatement","src":"3243:57:111"},{"nodeType":"YulAssignment","src":"3309:27:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"3320:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"3327:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3316:3:111"},"nodeType":"YulFunctionCall","src":"3316:20:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"3309:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"3027:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3032:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3040:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"3051:3:111","type":""}],"src":"2876:466:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_contract$_BrokenBLSAccount_$19108__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_uint256t_array$_t_uint256_$4_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n value0 := calldataload(headStart)\n let _1 := 32\n if iszero(slt(add(headStart, 63), dataEnd)) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 128)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n let srcEnd := add(headStart, 160)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(headStart, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n mstore(dst, calldataload(src))\n dst := add(dst, _1)\n }\n value1 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_array$_t_uint256_$4_memory_ptr__to_t_array$_t_uint256_$4_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 128)\n let pos := headStart\n pos := headStart\n let srcPtr := value0\n let i := 0\n for { } lt(i, 0x04) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n let _1 := 0x20\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n copy_memory_to_memory(add(value1, 32), add(headStart, 96), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n let length_1 := mload(value1)\n copy_memory_to_memory(add(value1, 0x20), end_1, length_1)\n end := add(end_1, length_1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"19112":[{"length":32,"start":75},{"length":32,"start":247},{"length":32,"start":525}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe1461004657806319c2a1b214610096578063de3398dd146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461038e565b6100bc565b61006d6100b736600461038e565b6101de565b6000806100c984846101de565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101d8565b8460001b7f0000000000000000000000000000000000000000000000000000000000000000856040516024016101279190610418565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f3600000000000000000000000000000000000000000000000000000000179052516101a790610352565b6101b2929190610479565b8190604051809103906000f59050801580156101d2573d6000803e3d6000fd5b50925050505b92915050565b60006103198360001b604051806020016101f790610352565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008560405160240161023d9190610418565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fee472f360000000000000000000000000000000000000000000000000000000017905290516102c293929101610479565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102fe92916020016104e7565b60405160208183030381529060405280519060200120610320565b9392505050565b60006103198383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c18061051783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060a083850312156103a157600080fd5b82359150602084603f8501126103b657600080fd5b6040516080810181811067ffffffffffffffff821117156103d9576103d961035f565b6040528060a08601878111156103ee57600080fd5b8387015b8181101561040957803583529184019184016103f2565b50505080925050509250929050565b60808101818360005b6004811015610440578151835260209283019290910190600101610421565b50505092915050565b60005b8381101561046457818101518382015260200161044c565b83811115610473576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600082518060408401526104b4816060850160208701610449565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104f9818460208801610449565b83519083019061050d818360208801610449565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e7b05a5b3c736f661e953b26d2958c20a0633c2b42c71686f07cf40762fb9b0064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x19C2A1B2 EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0xDE3398DD EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E JUMP JUMPDEST PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1DE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1D8 JUMP JUMPDEST DUP5 PUSH1 0x0 SHL PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x127 SWAP2 SWAP1 PUSH2 0x418 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1A7 SWAP1 PUSH2 0x352 JUMP JUMPDEST PUSH2 0x1B2 SWAP3 SWAP2 SWAP1 PUSH2 0x479 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x319 DUP4 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x1F7 SWAP1 PUSH2 0x352 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND PUSH1 0x40 MSTORE POP PUSH32 0x0 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x23D SWAP2 SWAP1 PUSH2 0x418 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEE472F3600000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x2C2 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x479 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x2FE SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x4E7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x320 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x319 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x517 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xA0 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP5 PUSH1 0x3F DUP6 ADD SLT PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x80 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x3D9 JUMPI PUSH2 0x3D9 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x40 MSTORE DUP1 PUSH1 0xA0 DUP7 ADD DUP8 DUP2 GT ISZERO PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP8 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x409 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE SWAP2 DUP5 ADD SWAP2 DUP5 ADD PUSH2 0x3F2 JUMP JUMPDEST POP POP POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD DUP2 DUP4 PUSH1 0x0 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x440 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x421 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x464 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x44C JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4B4 DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x449 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x4F9 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x449 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x50D DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x449 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220E7B05A JUMPDEST EXTCODECOPY PUSH20 0x6F661E953B26D2958C20A0633C2B42C71686F07C DELEGATECALL SMOD PUSH3 0xFB9B00 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"1630:1777:90:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1669:55;;;;;;;;224:42:111;212:55;;;194:74;;182:2;167:18;1669:55:90;;;;;;;2351:508;;;;;;:::i;:::-;;:::i;2984:421::-;;;;;;:::i;:::-;;:::i;2351:508::-;2431:16;2460:12;2475:28;2486:4;2492:10;2475;:28::i;:::-;2460:43;-1:-1:-1;2529:16:90;;;;2559:12;;2555:81;;-1:-1:-1;2619:4:90;-1:-1:-1;2587:38:90;;2555:81;2709:4;2701:13;;2741:21;2825:10;2781:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2677:173;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2645:207;;;;2351:508;;;;;:::o;2984:421::-;3066:7;3092:306;3123:4;3115:13;;3174:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3263:21;3352:10;3307:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;3223:159;;;;;3307:57;3223:159;;:::i;:::-;;;;;;;;;;;;;;;3140:256;;;3223:159;3140:256;;:::i;:::-;;;;;;;;;;;;;3130:267;;;;;;3092:22;:306::i;:::-;3085:313;2984:421;-1:-1:-1;;;2984:421:90:o;1799:165:44:-;1882:7;1908:49;1923:4;1929:12;1951:4;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:44:o;-1:-1:-1:-;;;;;;;;:::o;279:184:111:-;331:77;328:1;321:88;428:4;425:1;418:15;452:4;449:1;442:15;468:844;559:6;567;620:3;608:9;599:7;595:23;591:33;588:53;;;637:1;634;627:12;588:53;673:9;660:23;650:33;;702:2;747:7;742:2;731:9;727:18;723:32;713:60;;769:1;766;759:12;713:60;802:2;796:9;844:3;836:6;832:16;914:6;902:10;899:22;878:18;866:10;863:34;860:62;857:88;;;925:18;;:::i;:::-;961:2;954:22;996:6;1040:3;1025:19;;1056;;;1053:39;;;1088:1;1085;1078:12;1053:39;1127:2;1116:9;1112:18;1139:142;1155:6;1150:3;1147:15;1139:142;;;1221:17;;1209:30;;1259:12;;;;1172;;1139:142;;;1143:3;;;1300:6;1290:16;;;;468:844;;;;;:::o;1548:495::-;1728:3;1713:19;;1717:9;1809:6;1686:4;1843:194;1857:4;1854:1;1851:11;1843:194;;;1916:13;;1904:26;;1953:4;1977:12;;;;2012:15;;;;1877:1;1870:9;1843:194;;;1847:3;;;1548:495;;;;:::o;2048:258::-;2120:1;2130:113;2144:6;2141:1;2138:13;2130:113;;;2220:11;;;2214:18;2201:11;;;2194:39;2166:2;2159:10;2130:113;;;2261:6;2258:1;2255:13;2252:48;;;2296:1;2287:6;2282:3;2278:16;2271:27;2252:48;;2048:258;;;:::o;2311:560::-;2498:42;2490:6;2486:55;2475:9;2468:74;2578:2;2573;2562:9;2558:18;2551:30;2449:4;2610:6;2604:13;2653:6;2648:2;2637:9;2633:18;2626:34;2669:66;2728:6;2723:2;2712:9;2708:18;2703:2;2695:6;2691:15;2669:66;:::i;:::-;2787:2;2775:15;2792:66;2771:88;2756:104;;;;2862:2;2752:113;;2311:560;-1:-1:-1;;;2311:560:111:o;2876:466::-;3051:3;3089:6;3083:13;3105:53;3151:6;3146:3;3139:4;3131:6;3127:17;3105:53;:::i;:::-;3221:13;;3180:16;;;;3243:57;3221:13;3180:16;3277:4;3265:17;;3243:57;:::i;:::-;3316:20;;2876:466;-1:-1:-1;;;;2876:466:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"668200","executionCost":"infinite","totalCost":"infinite"},"external":{"accountImplementation()":"infinite","createAccount(uint256,uint256[4])":"infinite","getAddress(uint256,uint256[4])":"infinite"}},"methodIdentifiers":{"accountImplementation()":"11464fbe","createAccount(uint256,uint256[4])":"19c2a1b2","getAddress(uint256,uint256[4])":"de3398dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplementation\",\"outputs\":[{\"internalType\":\"contract BrokenBLSAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract BrokenBLSAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"uint256[4]\",\"name\":\"aPublicKey\",\"type\":\"uint256[4]\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(uint256,uint256[4])\":{\"notice\":\"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation Also note that out BLSSignatureAggregator requires that the public-key is the last parameter\"},\"getAddress(uint256,uint256[4])\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"Based n SimpleAccountFactory can't be a subclass, since both constructor and createAccount depend on the actual wallet contract constructor and initializer\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/BrokenBlsAccount.sol\":\"BrokenBLSAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/bls/IBLSAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\n\\nimport \\\"../../interfaces/IAccount.sol\\\";\\n\\n/**\\n * a BLS account should expose its own public key.\\n */\\ninterface IBLSAccount is IAccount {\\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\\n\\n /**\\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\\n */\\n function getBlsPublicKey() external view returns (uint256[4] memory);\\n}\\n\",\"keccak256\":\"0x47499e922398cbe4bfd9fbeb98110357b22fbe93e557d068c6a15d785e1184a8\",\"license\":\"GPL-3.0-only\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/BrokenBlsAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\nimport \\\"../samples/bls/IBLSAccount.sol\\\";\\n\\n/**\\n * for testing: a BLS account that fails to return its public-key (completely ignores its publickey)\\n * this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.\\n */\\ncontract BrokenBLSAccount is SimpleAccount, IBLSAccount {\\n address public immutable aggregator;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable values slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\\n (aPublicKey);\\n super._initialize(address(0));\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n\\n (userOp, userOpHash);\\n return _packValidationData(ValidationData(aggregator, 0,0));\\n }\\n\\n function getBlsPublicKey() external override pure returns (uint256[4] memory) {\\n uint256[4] memory pubkey;\\n return pubkey;\\n }\\n}\\n\\n\\n/**\\n * Based n SimpleAccountFactory\\n * can't be a subclass, since both constructor and createAccount depend on the\\n * actual wallet contract constructor and initializer\\n */\\ncontract BrokenBLSAccountFactory {\\n BrokenBLSAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint entryPoint, address aggregator){\\n accountImplementation = new BrokenBLSAccount(entryPoint, aggregator);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n * Also note that out BLSSignatureAggregator requires that the public-key is the last parameter\\n */\\n function createAccount(uint salt, uint256[4] memory aPublicKey) public returns (BrokenBLSAccount) {\\n\\n address addr = getAddress(salt, aPublicKey);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return BrokenBLSAccount(payable(addr));\\n }\\n return BrokenBLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(BrokenBLSAccount.initialize, aPublicKey)\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(uint salt, uint256[4] memory aPublicKey) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(BrokenBLSAccount.initialize, (aPublicKey))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0xeaedb1077e67697d1edc9cb36de5c2056421c4c6200a131b956fa66e3dd2ce07\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"createAccount(uint256,uint256[4])":{"notice":"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation Also note that out BLSSignatureAggregator requires that the public-key is the last parameter"},"getAddress(uint256,uint256[4])":{"notice":"calculate the counterfactual address of this account as it would be returned by createAccount()"}},"notice":"Based n SimpleAccountFactory can't be a subclass, since both constructor and createAccount depend on the actual wallet contract constructor and initializer","version":1}}},"contracts/test/MaliciousAccount.sol":{"MaliciousAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_ep","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19260":{"entryPoint":null,"id":19260,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":71,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60806040526040516103ec3803806103ec83398101604081905261002291610047565b600080546001600160a01b0319166001600160a01b0392909216919091179055610077565b60006020828403121561005957600080fd5b81516001600160a01b038116811461007057600080fd5b9392505050565b610366806100866000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80633a871cdd14610030575b600080fd5b61004361003e3660046101be565b610055565b60405190815260200160405180910390f35b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b1580156100c257600080fd5b505af11580156100d6573d6000803e3d6000fd5b50505050506000848061014001906100ee9190610212565b8101906100fb919061027e565b9050600060c086013561011660a088013560808901356102c6565b61012091906102c6565b9050600061012e82866102de565b9050600061014161010089013583610319565b90508381146101b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5265766572742061667465722066697273742076616c69646174696f6e000000604482015260640160405180910390fd5b506000979650505050505050565b6000806000606084860312156101d357600080fd5b833567ffffffffffffffff8111156101ea57600080fd5b840161016081870312156101fd57600080fd5b95602085013595506040909401359392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261024757600080fd5b83018035915067ffffffffffffffff82111561026257600080fd5b60200191503681900382131561027757600080fd5b9250929050565b60006020828403121561029057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156102d9576102d9610297565b500190565b600082610314577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561032b5761032b610297565b50039056fea2646970667358221220ca99f31a73386bfc8f4fff6bf7892c59e7cc9f3b5e3b72c21e9acf839dae235564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3EC CODESIZE SUB DUP1 PUSH2 0x3EC DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x47 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x366 DUP1 PUSH2 0x86 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x1BE JUMP JUMPDEST PUSH2 0x55 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x0 DUP5 DUP1 PUSH2 0x140 ADD SWAP1 PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x212 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFB SWAP2 SWAP1 PUSH2 0x27E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0xC0 DUP7 ADD CALLDATALOAD PUSH2 0x116 PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x2C6 JUMP JUMPDEST PUSH2 0x120 SWAP2 SWAP1 PUSH2 0x2C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x12E DUP3 DUP7 PUSH2 0x2DE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x141 PUSH2 0x100 DUP10 ADD CALLDATALOAD DUP4 PUSH2 0x319 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 EQ PUSH2 0x1B0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265766572742061667465722066697273742076616C69646174696F6E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x290 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2D9 JUMPI PUSH2 0x2D9 PUSH2 0x297 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x314 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x32B JUMPI PUSH2 0x32B PUSH2 0x297 JUMP JUMPDEST POP SUB SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCA SWAP10 RETURN BYTE PUSH20 0x386BFC8F4FFF6BF7892C59E7CC9F3B5E3B72C21E SWAP11 0xCF DUP4 SWAP14 0xAE 0x23 SSTORE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"172:894:91:-:0;;;244:62;;;;;;;;;;;;;;;;;;:::i;:::-;291:2;:8;;-1:-1:-1;;;;;;291:8:91;-1:-1:-1;;;;;291:8:91;;;;;;;;;;172:894;;14:311:111;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;172:894:91;;;;;;"},"deployedBytecode":{"functionDebugData":{"@validateUserOp_19328":{"entryPoint":85,"id":19328,"parameterSlots":3,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":446,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256":{"entryPoint":638,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c9a69fb9e86f6a594353e38515d336f45846548dd2f61998ba4ea3679ad627cf__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":530,"id":null,"parameterSlots":2,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":710,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":734,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":793,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x11":{"entryPoint":663,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2818:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"152:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"200:6:111"},"nodeType":"YulFunctionCall","src":"200:12:111"},"nodeType":"YulExpressionStatement","src":"200:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"173:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"182:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"169:3:111"},"nodeType":"YulFunctionCall","src":"169:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"194:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"165:3:111"},"nodeType":"YulFunctionCall","src":"165:32:111"},"nodeType":"YulIf","src":"162:52:111"},{"nodeType":"YulVariableDeclaration","src":"223:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"250:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"237:12:111"},"nodeType":"YulFunctionCall","src":"237:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"227:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"303:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"312:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"315:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"305:6:111"},"nodeType":"YulFunctionCall","src":"305:12:111"},"nodeType":"YulExpressionStatement","src":"305:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"275:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"283:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"272:2:111"},"nodeType":"YulFunctionCall","src":"272:30:111"},"nodeType":"YulIf","src":"269:50:111"},{"nodeType":"YulVariableDeclaration","src":"328:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"342:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"353:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"338:3:111"},"nodeType":"YulFunctionCall","src":"338:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"332:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"399:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"408:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"411:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"401:6:111"},"nodeType":"YulFunctionCall","src":"401:12:111"},"nodeType":"YulExpressionStatement","src":"401:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"380:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"389:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"376:3:111"},"nodeType":"YulFunctionCall","src":"376:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"394:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"372:3:111"},"nodeType":"YulFunctionCall","src":"372:26:111"},"nodeType":"YulIf","src":"369:46:111"},{"nodeType":"YulAssignment","src":"424:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"434:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"424:6:111"}]},{"nodeType":"YulAssignment","src":"445:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"468:3:111"},"nodeType":"YulFunctionCall","src":"468:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"455:12:111"},"nodeType":"YulFunctionCall","src":"455:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"445:6:111"}]},{"nodeType":"YulAssignment","src":"496:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"523:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"534:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"519:3:111"},"nodeType":"YulFunctionCall","src":"519:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"506:12:111"},"nodeType":"YulFunctionCall","src":"506:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"496:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"102:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"113:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"125:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"133:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"141:6:111","type":""}],"src":"14:530:111"},{"body":{"nodeType":"YulBlock","src":"650:76:111","statements":[{"nodeType":"YulAssignment","src":"660:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"683:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"668:3:111"},"nodeType":"YulFunctionCall","src":"668:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"660:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"702:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"713:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"695:6:111"},"nodeType":"YulFunctionCall","src":"695:25:111"},"nodeType":"YulExpressionStatement","src":"695:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"619:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"630:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"641:4:111","type":""}],"src":"549:177:111"},{"body":{"nodeType":"YulBlock","src":"832:125:111","statements":[{"nodeType":"YulAssignment","src":"842:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"865:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"850:3:111"},"nodeType":"YulFunctionCall","src":"850:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"842:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"884:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"899:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"907:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"895:3:111"},"nodeType":"YulFunctionCall","src":"895:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"877:6:111"},"nodeType":"YulFunctionCall","src":"877:74:111"},"nodeType":"YulExpressionStatement","src":"877:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"801:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"812:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"823:4:111","type":""}],"src":"731:226:111"},{"body":{"nodeType":"YulBlock","src":"1056:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1066:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"1105:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1092:12:111"},"nodeType":"YulFunctionCall","src":"1092:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"1070:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1265:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1274:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1277:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1267:6:111"},"nodeType":"YulFunctionCall","src":"1267:12:111"},"nodeType":"YulExpressionStatement","src":"1267:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1140:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1168:12:111"},"nodeType":"YulFunctionCall","src":"1168:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"1184:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1164:3:111"},"nodeType":"YulFunctionCall","src":"1164:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"1195:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1160:3:111"},"nodeType":"YulFunctionCall","src":"1160:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1136:3:111"},"nodeType":"YulFunctionCall","src":"1136:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1129:6:111"},"nodeType":"YulFunctionCall","src":"1129:135:111"},"nodeType":"YulIf","src":"1126:155:111"},{"nodeType":"YulVariableDeclaration","src":"1290:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"1308:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1318:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1304:3:111"},"nodeType":"YulFunctionCall","src":"1304:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"1294:6:111","type":""}]},{"nodeType":"YulAssignment","src":"1346:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1369:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1356:12:111"},"nodeType":"YulFunctionCall","src":"1356:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1346:6:111"}]},{"body":{"nodeType":"YulBlock","src":"1419:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1428:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1431:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1421:6:111"},"nodeType":"YulFunctionCall","src":"1421:12:111"},"nodeType":"YulExpressionStatement","src":"1421:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1391:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1399:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1388:2:111"},"nodeType":"YulFunctionCall","src":"1388:30:111"},"nodeType":"YulIf","src":"1385:50:111"},{"nodeType":"YulAssignment","src":"1444:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1456:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1464:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1452:3:111"},"nodeType":"YulFunctionCall","src":"1452:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"1444:4:111"}]},{"body":{"nodeType":"YulBlock","src":"1520:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1529:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1532:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1522:6:111"},"nodeType":"YulFunctionCall","src":"1522:12:111"},"nodeType":"YulExpressionStatement","src":"1522:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"1485:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1495:12:111"},"nodeType":"YulFunctionCall","src":"1495:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"1511:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1491:3:111"},"nodeType":"YulFunctionCall","src":"1491:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"1481:3:111"},"nodeType":"YulFunctionCall","src":"1481:38:111"},"nodeType":"YulIf","src":"1478:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"1013:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"1023:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"1039:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1045:6:111","type":""}],"src":"962:580:111"},{"body":{"nodeType":"YulBlock","src":"1617:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"1663:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1672:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1675:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1665:6:111"},"nodeType":"YulFunctionCall","src":"1665:12:111"},"nodeType":"YulExpressionStatement","src":"1665:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1638:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1647:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1634:3:111"},"nodeType":"YulFunctionCall","src":"1634:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1659:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1630:3:111"},"nodeType":"YulFunctionCall","src":"1630:32:111"},"nodeType":"YulIf","src":"1627:52:111"},{"nodeType":"YulAssignment","src":"1688:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1711:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1698:12:111"},"nodeType":"YulFunctionCall","src":"1698:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1688:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1583:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1594:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1606:6:111","type":""}],"src":"1547:180:111"},{"body":{"nodeType":"YulBlock","src":"1764:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1781:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1784:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1774:6:111"},"nodeType":"YulFunctionCall","src":"1774:88:111"},"nodeType":"YulExpressionStatement","src":"1774:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1878:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1881:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1871:6:111"},"nodeType":"YulFunctionCall","src":"1871:15:111"},"nodeType":"YulExpressionStatement","src":"1871:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1902:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1905:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1895:6:111"},"nodeType":"YulFunctionCall","src":"1895:15:111"},"nodeType":"YulExpressionStatement","src":"1895:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"1732:184:111"},{"body":{"nodeType":"YulBlock","src":"1969:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"1996:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"1998:16:111"},"nodeType":"YulFunctionCall","src":"1998:18:111"},"nodeType":"YulExpressionStatement","src":"1998:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1985:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"1992:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1988:3:111"},"nodeType":"YulFunctionCall","src":"1988:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1982:2:111"},"nodeType":"YulFunctionCall","src":"1982:13:111"},"nodeType":"YulIf","src":"1979:39:111"},{"nodeType":"YulAssignment","src":"2027:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2038:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2041:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2034:3:111"},"nodeType":"YulFunctionCall","src":"2034:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"2027:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"1952:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"1955:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"1961:3:111","type":""}],"src":"1921:128:111"},{"body":{"nodeType":"YulBlock","src":"2100:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"2131:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2152:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2155:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2145:6:111"},"nodeType":"YulFunctionCall","src":"2145:88:111"},"nodeType":"YulExpressionStatement","src":"2145:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2253:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"2256:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2246:6:111"},"nodeType":"YulFunctionCall","src":"2246:15:111"},"nodeType":"YulExpressionStatement","src":"2246:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2281:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2284:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2274:6:111"},"nodeType":"YulFunctionCall","src":"2274:15:111"},"nodeType":"YulExpressionStatement","src":"2274:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"2120:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2113:6:111"},"nodeType":"YulFunctionCall","src":"2113:9:111"},"nodeType":"YulIf","src":"2110:189:111"},{"nodeType":"YulAssignment","src":"2308:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2317:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2320:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"2313:3:111"},"nodeType":"YulFunctionCall","src":"2313:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"2308:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"2085:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"2088:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"2094:1:111","type":""}],"src":"2054:274:111"},{"body":{"nodeType":"YulBlock","src":"2382:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"2404:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"2406:16:111"},"nodeType":"YulFunctionCall","src":"2406:18:111"},"nodeType":"YulExpressionStatement","src":"2406:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2398:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2401:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2395:2:111"},"nodeType":"YulFunctionCall","src":"2395:8:111"},"nodeType":"YulIf","src":"2392:34:111"},{"nodeType":"YulAssignment","src":"2435:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"2447:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"2450:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2443:3:111"},"nodeType":"YulFunctionCall","src":"2443:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"2435:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"2364:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"2367:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"2373:4:111","type":""}],"src":"2333:125:111"},{"body":{"nodeType":"YulBlock","src":"2637:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2654:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2665:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2647:6:111"},"nodeType":"YulFunctionCall","src":"2647:21:111"},"nodeType":"YulExpressionStatement","src":"2647:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2688:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2699:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2684:3:111"},"nodeType":"YulFunctionCall","src":"2684:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2704:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2677:6:111"},"nodeType":"YulFunctionCall","src":"2677:30:111"},"nodeType":"YulExpressionStatement","src":"2677:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2727:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2738:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2723:3:111"},"nodeType":"YulFunctionCall","src":"2723:18:111"},{"hexValue":"5265766572742061667465722066697273742076616c69646174696f6e","kind":"string","nodeType":"YulLiteral","src":"2743:31:111","type":"","value":"Revert after first validation"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2716:6:111"},"nodeType":"YulFunctionCall","src":"2716:59:111"},"nodeType":"YulExpressionStatement","src":"2716:59:111"},{"nodeType":"YulAssignment","src":"2784:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2796:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2807:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2792:3:111"},"nodeType":"YulFunctionCall","src":"2792:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2784:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c9a69fb9e86f6a594353e38515d336f45846548dd2f61998ba4ea3679ad627cf__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2614:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2628:4:111","type":""}],"src":"2463:353:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_c9a69fb9e86f6a594353e38515d336f45846548dd2f61998ba4ea3679ad627cf__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Revert after first validation\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061002b5760003560e01c80633a871cdd14610030575b600080fd5b61004361003e3660046101be565b610055565b60405190815260200160405180910390f35b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b1580156100c257600080fd5b505af11580156100d6573d6000803e3d6000fd5b50505050506000848061014001906100ee9190610212565b8101906100fb919061027e565b9050600060c086013561011660a088013560808901356102c6565b61012091906102c6565b9050600061012e82866102de565b9050600061014161010089013583610319565b90508381146101b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5265766572742061667465722066697273742076616c69646174696f6e000000604482015260640160405180910390fd5b506000979650505050505050565b6000806000606084860312156101d357600080fd5b833567ffffffffffffffff8111156101ea57600080fd5b840161016081870312156101fd57600080fd5b95602085013595506040909401359392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261024757600080fd5b83018035915067ffffffffffffffff82111561026257600080fd5b60200191503681900382131561027757600080fd5b9250929050565b60006020828403121561029057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156102d9576102d9610297565b500190565b600082610314577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561032b5761032b610297565b50039056fea2646970667358221220ca99f31a73386bfc8f4fff6bf7892c59e7cc9f3b5e3b72c21e9acf839dae235564736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x1BE JUMP JUMPDEST PUSH2 0x55 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x0 DUP5 DUP1 PUSH2 0x140 ADD SWAP1 PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x212 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFB SWAP2 SWAP1 PUSH2 0x27E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0xC0 DUP7 ADD CALLDATALOAD PUSH2 0x116 PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x2C6 JUMP JUMPDEST PUSH2 0x120 SWAP2 SWAP1 PUSH2 0x2C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x12E DUP3 DUP7 PUSH2 0x2DE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x141 PUSH2 0x100 DUP10 ADD CALLDATALOAD DUP4 PUSH2 0x319 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 EQ PUSH2 0x1B0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265766572742061667465722066697273742076616C69646174696F6E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x290 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2D9 JUMPI PUSH2 0x2D9 PUSH2 0x297 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x314 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x32B JUMPI PUSH2 0x32B PUSH2 0x297 JUMP JUMPDEST POP SUB SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCA SWAP10 RETURN BYTE PUSH20 0x386BFC8F4FFF6BF7892C59E7CC9F3B5E3B72C21E SWAP11 0xCF DUP4 SWAP14 0xAE 0x23 SSTORE PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"172:894:91:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;311:753;;;;;;:::i;:::-;;:::i;:::-;;;695:25:111;;;683:2;668:18;311:753:91;;;;;;;;426:22;460:2;;:56;;;;;510:4;460:56;;;877:74:111;460:2:91;;;;;:12;;481:19;;850:18:111;;460:56:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;658:23;695:6;:16;;;;;;;;:::i;:::-;684:39;;;;;;;:::i;:::-;658:65;-1:-1:-1;733:19:91;807:25;;;;755:49;777:27;;;;755:19;;;;:49;:::i;:::-;:77;;;;:::i;:::-;733:99;-1:-1:-1;842:16:91;861:33;733:99;861:19;:33;:::i;:::-;842:52;-1:-1:-1;904:15:91;922:38;933:27;;;;842:52;922:38;:::i;:::-;904:56;;990:15;979:7;:26;970:69;;;;;;;2665:2:111;970:69:91;;;2647:21:111;2704:2;2684:18;;;2677:30;2743:31;2723:18;;;2716:59;2792:18;;970:69:91;;;;;;;;-1:-1:-1;1056:1:91;;311:753;-1:-1:-1;;;;;;;311:753:91:o;14:530:111:-;125:6;133;141;194:2;182:9;173:7;169:23;165:32;162:52;;;210:1;207;200:12;162:52;250:9;237:23;283:18;275:6;272:30;269:50;;;315:1;312;305:12;269:50;338:22;;394:3;376:16;;;372:26;369:46;;;411:1;408;401:12;369:46;434:2;483;468:18;;455:32;;-1:-1:-1;534:2:111;519:18;;;506:32;;14:530;-1:-1:-1;;;14:530:111:o;962:580::-;1039:4;1045:6;1105:11;1092:25;1195:66;1184:8;1168:14;1164:29;1160:102;1140:18;1136:127;1126:155;;1277:1;1274;1267:12;1126:155;1304:33;;1356:20;;;-1:-1:-1;1399:18:111;1388:30;;1385:50;;;1431:1;1428;1421:12;1385:50;1464:4;1452:17;;-1:-1:-1;1495:14:111;1491:27;;;1481:38;;1478:58;;;1532:1;1529;1522:12;1478:58;962:580;;;;;:::o;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:111;;1547:180;-1:-1:-1;1547:180:111:o;1732:184::-;1784:77;1781:1;1774:88;1881:4;1878:1;1871:15;1905:4;1902:1;1895:15;1921:128;1961:3;1992:1;1988:6;1985:1;1982:13;1979:39;;;1998:18;;:::i;:::-;-1:-1:-1;2034:9:111;;1921:128::o;2054:274::-;2094:1;2120;2110:189;;2155:77;2152:1;2145:88;2256:4;2253:1;2246:15;2284:4;2281:1;2274:15;2110:189;-1:-1:-1;2313:9:111;;2054:274::o;2333:125::-;2373:4;2401:1;2398;2395:8;2392:34;;;2406:18;;:::i;:::-;-1:-1:-1;2443:9:111;;2333:125::o"},"gasEstimates":{"creation":{"codeDepositCost":"174000","executionCost":"infinite","totalCost":"infinite"},"external":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite"}},"methodIdentifiers":{"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_ep\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/MaliciousAccount.sol\":\"MaliciousAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"contracts/core/EntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\nimport \\\"../utils/Exec.sol\\\";\\nimport \\\"./StakeManager.sol\\\";\\nimport \\\"./SenderCreator.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\nimport \\\"./NonceManager.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\\n * @param beneficiary the address to receive the fees\\n * @param amount amount to transfer.\\n */\\n function _compensate(address payable beneficiary, uint256 amount) internal {\\n require(beneficiary != address(0), \\\"AA90 invalid beneficiary\\\");\\n (bool success,) = beneficiary.call{value : amount}(\\\"\\\");\\n require(success, \\\"AA91 failed send to beneficiary\\\");\\n }\\n\\n /**\\n * execute a user op\\n * @param opIndex index into the opInfo array\\n * @param userOp the userOp to execute\\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\\n * @return collected the total amount this userOp paid.\\n */\\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\n }\\n\\n /**\\n * Execute a batch of UserOperations.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\n uint256 opslen = ops.length;\\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\\n\\n unchecked {\\n for (uint256 i = 0; i < opslen; i++) {\\n UserOpInfo memory opInfo = opInfos[i];\\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\\n }\\n\\n uint256 collected = 0;\\n emit BeforeExecution();\\n\\n for (uint256 i = 0; i < opslen; i++) {\\n collected += _executeUserOp(i, ops[i], opInfos[i]);\\n }\\n\\n _compensate(beneficiary, collected);\\n } //unchecked\\n }\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) public nonReentrant {\\n\\n uint256 opasLen = opsPerAggregator.length;\\n uint256 totalOps = 0;\\n for (uint256 i = 0; i < opasLen; i++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\\n UserOperation[] calldata ops = opa.userOps;\\n IAggregator aggregator = opa.aggregator;\\n\\n //address(1) is special marker of \\\"signature error\\\"\\n require(address(aggregator) != address(1), \\\"AA96 invalid aggregator\\\");\\n\\n if (address(aggregator) != address(0)) {\\n // solhint-disable-next-line no-empty-blocks\\n try aggregator.validateSignatures(ops, opa.signature) {}\\n catch {\\n revert SignatureValidationFailed(address(aggregator));\\n }\\n }\\n\\n totalOps += ops.length;\\n }\\n\\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\\n\\n emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] calldata ops = opa.userOps;\\n IAggregator aggregator = opa.aggregator;\\n\\n uint256 opslen = ops.length;\\n for (uint256 i = 0; i < opslen; i++) {\\n UserOpInfo memory opInfo = opInfos[opIndex];\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\n\\n uint256 collected = 0;\\n opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n emit SignatureAggregatorChanged(address(opa.aggregator));\\n UserOperation[] calldata ops = opa.userOps;\\n uint256 opslen = ops.length;\\n\\n for (uint256 i = 0; i < opslen; i++) {\\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\\n opIndex++;\\n }\\n }\\n emit SignatureAggregatorChanged(address(0));\\n\\n _compensate(beneficiary, collected);\\n }\\n\\n /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n address paymaster;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n }\\n\\n struct UserOpInfo {\\n MemoryUserOp mUserOp;\\n bytes32 userOpHash;\\n uint256 prefund;\\n uint256 contextOffset;\\n uint256 preOpGas;\\n }\\n\\n /**\\n * inner function to handle a UserOperation.\\n * Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\\n */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\n mstore(0, INNER_OUT_OF_GAS)\\n revert(0, 32)\\n }\\n }\\n }\\n\\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\\n if (callData.length > 0) {\\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\n if (!success) {\\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\\n if (result.length > 0) {\\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\\n }\\n mode = IPaymaster.PostOpMode.opReverted;\\n }\\n }\\n\\n unchecked {\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\\n }\\n\\n /**\\n * copy general fields from userOp into the memory opInfo structure.\\n */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\\n StakeInfo memory factoryInfo;\\n {\\n bytes calldata initCode = userOp.initCode;\\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\\n if (initCode.length != 0) {\\n address sender = opInfo.mUserOp.sender;\\n if (sender.code.length != 0) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\n catch Error(string memory revertReason) {\\n if (bytes(revertReason).length != 0) {\\n revert FailedOp(0, revertReason);\\n }\\n }\\n }\\n\\n /**\\n * Called only during simulation.\\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\\n */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\\n if (initCode.length == 0 && sender.code.length == 0) {\\n // it would revert anyway. but give a meaningful message\\n revert(\\\"AA20 account not deployed\\\");\\n }\\n if (paymasterAndData.length >= 20) {\\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\\n if (paymaster.code.length == 0) {\\n // it would revert anyway. but give a meaningful message\\n revert(\\\"AA30 paymaster not deployed\\\");\\n }\\n }\\n // always revert\\n revert(\\\"\\\");\\n }\\n\\n /**\\n * call account.validateUserOp.\\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\\n * decrement account's deposit if needed\\n */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\n }\\n if (paymaster == address(0)) {\\n DepositInfo storage senderInfo = deposits[sender];\\n uint256 deposit = senderInfo.deposit;\\n if (requiredPrefund > deposit) {\\n revert FailedOp(opIndex, \\\"AA21 didn't pay prefund\\\");\\n }\\n senderInfo.deposit = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\n }\\n }\\n\\n /**\\n * In case the request has a paymaster:\\n * Validate paymaster has enough deposit.\\n * Call paymaster.validatePaymasterUserOp.\\n * Revert with proper FailedOp in case paymaster reverts.\\n * Decrement paymaster's deposit\\n */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\n address paymaster = mUserOp.paymaster;\\n DepositInfo storage paymasterInfo = deposits[paymaster];\\n uint256 deposit = paymasterInfo.deposit;\\n if (deposit < requiredPreFund) {\\n revert FailedOp(opIndex, \\\"AA31 paymaster deposit too low\\\");\\n }\\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\\n if (expectedAggregator != aggregator) {\\n revert FailedOp(opIndex, \\\"AA24 signature error\\\");\\n }\\n if (outOfTimeRange) {\\n revert FailedOp(opIndex, \\\"AA22 expired or not due\\\");\\n }\\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\\n address pmAggregator;\\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\\n if (pmAggregator != address(0)) {\\n revert FailedOp(opIndex, \\\"AA34 signature error\\\");\\n }\\n if (outOfTimeRange) {\\n revert FailedOp(opIndex, \\\"AA32 paymaster expired or not due\\\");\\n }\\n }\\n\\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\n if (validationData == 0) {\\n return (address(0), false);\\n }\\n ValidationData memory data = _parseValidationData(validationData);\\n // solhint-disable-next-line not-rely-on-time\\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\\n aggregator = data.aggregator;\\n }\\n\\n /**\\n * validate account and paymaster (if defined).\\n * also make sure total validation doesn't exceed verificationGasLimit\\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\\n * @param opIndex the index of this userOp into the \\\"opInfos\\\" array\\n * @param userOp the userOp to validate\\n */\\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private returns (uint256 validationData, uint256 paymasterValidationData) {\\n\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\\n _copyUserOpToMemory(userOp, mUserOp);\\n outOpInfo.userOpHash = getUserOpHash(userOp);\\n\\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\\n // and multiplied without causing overflow\\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * called just after the callData is executed.\\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\\n * @param opIndex index in the batch\\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\\n * @param opInfo userOp fields and info collected during validation\\n * @param context the context returned in validatePaymasterUserOp\\n * @param actualGas the gas used so far by this user operation\\n */\\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n unchecked {\\n address refundAddress;\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\\n\\n address paymaster = mUserOp.paymaster;\\n if (paymaster == address(0)) {\\n refundAddress = mUserOp.sender;\\n } else {\\n refundAddress = paymaster;\\n if (context.length > 0) {\\n actualGasCost = actualGas * gasPrice;\\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\n } // unchecked\\n }\\n\\n /**\\n * the gas price this UserOp agrees to pay.\\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n */\\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract NonceManager is INonceManager {\\n\\n /**\\n * The next valid sequence number for a given nonce key.\\n */\\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\\n\\n function getNonce(address sender, uint192 key)\\n public view override returns (uint256 nonce) {\\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\\n }\\n\\n // allow an account to manually increment its own nonce.\\n // (mainly so that during construction nonce can be made non-zero,\\n // to \\\"absorb\\\" the gas cost of first nonce increment to 1st transaction (construction),\\n // not to 2nd transaction)\\n function incrementNonce(uint192 key) public override {\\n nonceSequenceNumber[msg.sender][key]++;\\n }\\n\\n /**\\n * validate nonce uniqueness for this account.\\n * called just after validateUserOp()\\n */\\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\\n\\n uint192 key = uint192(nonce >> 64);\\n uint64 seq = uint64(nonce);\\n return nonceSequenceNumber[sender][key]++ == seq;\\n }\\n\\n}\\n\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/**\\n * helper contract for EntryPoint, to call userOp.initCode from a \\\"neutral\\\" address,\\n * which is explicitly not the entryPoint itself.\\n */\\ncontract SenderCreator {\\n\\n /**\\n * call the \\\"initCode\\\" factory to create and return the sender account address\\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) external returns (address sender) {\\n address factory = address(bytes20(initCode[0 : 20]));\\n bytes memory initCallData = initCode[20 :];\\n bool success;\\n /* solhint-disable no-inline-assembly */\\n assembly {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by a paymaster.\\n */\\nabstract contract StakeManager is IStakeManager {\\n\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\\n DepositInfo storage depositInfo = deposits[addr];\\n info.stake = depositInfo.stake;\\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\\n }\\n\\n /// return the deposit (for gas payment) of the account\\n function balanceOf(address account) public view returns (uint256) {\\n return deposits[account].deposit;\\n }\\n\\n receive() external payable {\\n depositTo(msg.sender);\\n }\\n\\n function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\n }\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 unstakeDelaySec) public payable {\\n DepositInfo storage info = deposits[msg.sender];\\n require(unstakeDelaySec > 0, \\\"must specify unstake delay\\\");\\n require(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\n uint256 stake = info.stake + msg.value;\\n require(stake > 0, \\\"no stake specified\\\");\\n require(stake <= type(uint112).max, \\\"stake overflow\\\");\\n deposits[msg.sender] = DepositInfo(\\n info.deposit,\\n true,\\n uint112(stake),\\n unstakeDelaySec,\\n 0\\n );\\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\\n }\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(info.unstakeDelaySec != 0, \\\"not staked\\\");\\n require(info.staked, \\\"already unstaking\\\");\\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\\n info.withdrawTime = withdrawTime;\\n info.staked = false;\\n emit StakeUnlocked(msg.sender, withdrawTime);\\n }\\n\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external {\\n DepositInfo storage info = deposits[msg.sender];\\n uint256 stake = info.stake;\\n require(stake > 0, \\\"No stake to withdraw\\\");\\n require(info.withdrawTime > 0, \\\"must call unlockStake() first\\\");\\n require(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\n info.unstakeDelaySec = 0;\\n info.withdrawTime = 0;\\n info.stake = 0;\\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\\n (bool success,) = withdrawAddress.call{value : stake}(\\\"\\\");\\n require(success, \\\"failed to withdraw stake\\\");\\n }\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(info.deposit - withdrawAmount);\\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\\\"\\\");\\n require(success, \\\"failed to withdraw\\\");\\n }\\n}\\n\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/test/MaliciousAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../core/EntryPoint.sol\\\";\\n\\ncontract MaliciousAccount is IAccount {\\n IEntryPoint private ep;\\n constructor(IEntryPoint _ep) payable {\\n ep = _ep;\\n }\\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\\n external returns (uint256 validationData) {\\n ep.depositTo{value : missingAccountFunds}(address(this));\\n // Now calculate basefee per EntryPoint.getUserOpGasPrice() and compare it to the basefe we pass off-chain in the signature\\n uint256 externalBaseFee = abi.decode(userOp.signature, (uint256));\\n uint256 requiredGas = userOp.callGasLimit + userOp.verificationGasLimit + userOp.preVerificationGas;\\n uint256 gasPrice = missingAccountFunds / requiredGas;\\n uint256 basefee = gasPrice - userOp.maxPriorityFeePerGas;\\n require (basefee == externalBaseFee, \\\"Revert after first validation\\\");\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x1e0df79e26553c9c49ce403b1f83f7785b78fc4b4bd6a7491f6bd268e087e5cb\",\"license\":\"GPL-3.0\"},\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":19249,"contract":"contracts/test/MaliciousAccount.sol:MaliciousAccount","label":"ep","offset":0,"slot":"0","type":"t_contract(IEntryPoint)10807"}],"types":{"t_contract(IEntryPoint)10807":{"encoding":"inplace","label":"contract IEntryPoint","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestAggregatedAccount.sol":{"TestAggregatedAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"},{"internalType":"address","name":"anAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"initialize(address)":{"details":"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`"},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"withdrawDepositTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13884":{"entryPoint":null,"id":13884,"parameterSlots":1,"returnSlots":0},"@_19353":{"entryPoint":null,"id":19353,"parameterSlots":2,"returnSlots":0},"@_disableInitializers_3524":{"entryPoint":100,"id":3524,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":319,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":294,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1194:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"774:229:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"802:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"784:6:111"},"nodeType":"YulFunctionCall","src":"784:21:111"},"nodeType":"YulExpressionStatement","src":"784:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"836:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"821:3:111"},"nodeType":"YulFunctionCall","src":"821:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"841:2:111","type":"","value":"39"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"814:6:111"},"nodeType":"YulFunctionCall","src":"814:30:111"},"nodeType":"YulExpressionStatement","src":"814:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"864:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"875:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"860:3:111"},"nodeType":"YulFunctionCall","src":"860:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320696e697469","kind":"string","nodeType":"YulLiteral","src":"880:34:111","type":"","value":"Initializable: contract is initi"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"853:6:111"},"nodeType":"YulFunctionCall","src":"853:62:111"},"nodeType":"YulExpressionStatement","src":"853:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"935:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"946:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"931:3:111"},"nodeType":"YulFunctionCall","src":"931:18:111"},{"hexValue":"616c697a696e67","kind":"string","nodeType":"YulLiteral","src":"951:9:111","type":"","value":"alizing"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"924:6:111"},"nodeType":"YulFunctionCall","src":"924:37:111"},"nodeType":"YulExpressionStatement","src":"924:37:111"},{"nodeType":"YulAssignment","src":"970:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"982:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"993:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"978:3:111"},"nodeType":"YulFunctionCall","src":"978:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"970:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"751:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"765:4:111","type":""}],"src":"600:403:111"},{"body":{"nodeType":"YulBlock","src":"1105:87:111","statements":[{"nodeType":"YulAssignment","src":"1115:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1127:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1138:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1123:3:111"},"nodeType":"YulFunctionCall","src":"1123:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1115:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1157:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1172:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1180:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1168:3:111"},"nodeType":"YulFunctionCall","src":"1168:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1150:6:111"},"nodeType":"YulFunctionCall","src":"1150:36:111"},"nodeType":"YulExpressionStatement","src":"1150:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1074:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1085:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1096:4:111","type":""}],"src":"1008:184:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_stringliteral_a53f5879e7518078ff19b2e3d6b41e757a87364ec6872787feb45bfc41131d1a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 39)\n mstore(add(headStart, 64), \"Initializable: contract is initi\")\n mstore(add(headStart, 96), \"alizing\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60e0604052306080523480156200001557600080fd5b50604051620021143803806200211483398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c051611f126200020260003960008181610257015261088601526000818161037e015281816108c90152818161097001528181610d4601528181610f7e01528181610fc5015281816112c9015261146e0152600081816106a00152818161073601528181610a3401528181610aca0152610bf90152611f126000f3fe6080604052600436106101475760003560e01c80634f1ef286116100c0578063bc197c8111610074578063c4d66de811610059578063c4d66de81461041f578063d087d2881461043f578063f23a6e611461045457600080fd5b8063bc197c81146103c2578063c399ec881461040a57600080fd5b80638da5cb5b116100a55780638da5cb5b1461033c578063b0d691fe1461036f578063b61d27f6146103a257600080fd5b80634f1ef2861461031457806352d1902d1461032757600080fd5b8063245a7bfc116101175780633a871cdd116100fc5780633a871cdd146102be5780634a58db19146102ec5780634d44560d146102f457600080fd5b8063245a7bfc146102455780633659cfe61461029e57600080fd5b806223de291461015357806301ffc9a71461017a578063150b7a02146101af57806318dfb3c71461022557600080fd5b3661014e57005b600080fd5b34801561015f57600080fd5b5061017861016e3660046117e1565b5050505050505050565b005b34801561018657600080fd5b5061019a610195366004611892565b61049a565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101f46101ca3660046118d4565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101a6565b34801561023157600080fd5b5061017861024036600461198c565b61057f565b34801561025157600080fd5b506102797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102aa57600080fd5b506101786102b93660046119f8565b610689565b3480156102ca57600080fd5b506102de6102d9366004611a15565b61085a565b6040519081526020016101a6565b6101786108c7565b34801561030057600080fd5b5061017861030f366004611a69565b610966565b610178610322366004611ac4565b610a1d565b34801561033357600080fd5b506102de610bdf565b34801561034857600080fd5b506000546102799062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561037b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610279565b3480156103ae57600080fd5b506101786103bd366004611ba6565b610cb1565b3480156103ce57600080fd5b506101f46103dd366004611bf6565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561041657600080fd5b506102de610d00565b34801561042b57600080fd5b5061017861043a3660046119f8565b610db7565b34801561044b57600080fd5b506102de610f31565b34801561046057600080fd5b506101f461046f366004611c94565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061052d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061057957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610587610fad565b8281146105db5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610682576106708585838181106105fb576105fb611d10565b905060200201602081019061061091906119f8565b600085858581811061062457610624611d10565b90506020028101906106369190611d3f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b8061067a81611da4565b9150506105de565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107345760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166107a97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b61083b816110d9565b60408051600080825260208201909252610857918391906110e1565b50565b60006108646112b1565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201526108c082611336565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561095257600080fd5b505af1158015610682573d6000803e3d6000fd5b61096e6113a1565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a0157600080fd5b505af1158015610a15573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610ac85760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b3d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b610bcf826110d9565b610bdb828260016110e1565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c8c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105d2565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cb9610fad565b610cfa848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611e03565b905090565b600054610100900460ff1615808015610dd75750600054600160ff909116105b80610df15750303b158015610df1575060005460ff166001145b610e635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d2565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ec157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610ecb6000611418565b8015610bdb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610d71565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061100e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61105a5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e7460448201526064016105d2565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516110859190611e48565b60006040518083038185875af1925050503d80600081146110c2576040519150601f19603f3d011682016040523d82523d6000602084013e6110c7565b606091505b50915091508161068257805160208201fd5b6108576113a1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561111957611114836114b7565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561119e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261119b91810190611e03565b60015b6112105760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146112a55760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016105d2565b506111148383836115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461105a5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105d2565b80156108575760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610682565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806113cc57503330145b61105a5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e65720000000000000000000000000000000000000000000060448201526064016105d2565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115415760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115b0836115cc565b6000825111806115bd5750805b1561111457610cfa8383611619565b6115d5816114b7565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606108c08383604051806060016040528060278152602001611eb66027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516116639190611e48565b600060405180830381855af49150503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b50915091506116b4868383876116be565b9695505050505050565b6060831561173a5782516000036117335773ffffffffffffffffffffffffffffffffffffffff85163b6117335760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105d2565b5081611744565b611744838361174c565b949350505050565b81511561175c5781518083602001fd5b8060405162461bcd60e51b81526004016105d29190611e64565b73ffffffffffffffffffffffffffffffffffffffff8116811461085757600080fd5b60008083601f8401126117aa57600080fd5b50813567ffffffffffffffff8111156117c257600080fd5b6020830191508360208285010111156117da57600080fd5b9250929050565b60008060008060008060008060c0898b0312156117fd57600080fd5b883561180881611776565b9750602089013561181881611776565b9650604089013561182881611776565b955060608901359450608089013567ffffffffffffffff8082111561184c57600080fd5b6118588c838d01611798565b909650945060a08b013591508082111561187157600080fd5b5061187e8b828c01611798565b999c989b5096995094979396929594505050565b6000602082840312156118a457600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c057600080fd5b6000806000806000608086880312156118ec57600080fd5b85356118f781611776565b9450602086013561190781611776565b935060408601359250606086013567ffffffffffffffff81111561192a57600080fd5b61193688828901611798565b969995985093965092949392505050565b60008083601f84011261195957600080fd5b50813567ffffffffffffffff81111561197157600080fd5b6020830191508360208260051b85010111156117da57600080fd5b600080600080604085870312156119a257600080fd5b843567ffffffffffffffff808211156119ba57600080fd5b6119c688838901611947565b909650945060208701359150808211156119df57600080fd5b506119ec87828801611947565b95989497509550505050565b600060208284031215611a0a57600080fd5b81356108c081611776565b600080600060608486031215611a2a57600080fd5b833567ffffffffffffffff811115611a4157600080fd5b84016101608187031215611a5457600080fd5b95602085013595506040909401359392505050565b60008060408385031215611a7c57600080fd5b8235611a8781611776565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611ad757600080fd5b8235611ae281611776565b9150602083013567ffffffffffffffff80821115611aff57600080fd5b818501915085601f830112611b1357600080fd5b813581811115611b2557611b25611a95565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b6b57611b6b611a95565b81604052828152886020848701011115611b8457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611bbc57600080fd5b8435611bc781611776565b935060208501359250604085013567ffffffffffffffff811115611bea57600080fd5b6119ec87828801611798565b60008060008060008060008060a0898b031215611c1257600080fd5b8835611c1d81611776565b97506020890135611c2d81611776565b9650604089013567ffffffffffffffff80821115611c4a57600080fd5b611c568c838d01611947565b909850965060608b0135915080821115611c6f57600080fd5b611c7b8c838d01611947565b909650945060808b013591508082111561187157600080fd5b60008060008060008060a08789031215611cad57600080fd5b8635611cb881611776565b95506020870135611cc881611776565b94506040870135935060608701359250608087013567ffffffffffffffff811115611cf257600080fd5b611cfe89828a01611798565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611d7457600080fd5b83018035915067ffffffffffffffff821115611d8f57600080fd5b6020019150368190038213156117da57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215611e1557600080fd5b5051919050565b60005b83811015611e37578181015183820152602001611e1f565b83811115610cfa5750506000910152565b60008251611e5a818460208701611e1c565b9190910192915050565b6020815260008251806020840152611e83816040850160208701611e1c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ff89eab92b0c1f277887ddb99b41e2b60ae6b8d4745a41fd8cd00a3a53f8650664736f6c634300080f0033","opcodes":"PUSH1 0xE0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2114 CODESIZE SUB DUP1 PUSH3 0x2114 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x1F12 PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x257 ADD MSTORE PUSH2 0x886 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x37E ADD MSTORE DUP2 DUP2 PUSH2 0x8C9 ADD MSTORE DUP2 DUP2 PUSH2 0x970 ADD MSTORE DUP2 DUP2 PUSH2 0xD46 ADD MSTORE DUP2 DUP2 PUSH2 0xF7E ADD MSTORE DUP2 DUP2 PUSH2 0xFC5 ADD MSTORE DUP2 DUP2 PUSH2 0x12C9 ADD MSTORE PUSH2 0x146E ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x6A0 ADD MSTORE DUP2 DUP2 PUSH2 0x736 ADD MSTORE DUP2 DUP2 PUSH2 0xA34 ADD MSTORE DUP2 DUP2 PUSH2 0xACA ADD MSTORE PUSH2 0xBF9 ADD MSTORE PUSH2 0x1F12 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x147 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F1EF286 GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x43F JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x314 JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x3A871CDD GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x2EC JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x2F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x17A JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x225 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x14E JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x17E1 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19A PUSH2 0x195 CALLDATASIZE PUSH1 0x4 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x49A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x1CA CALLDATASIZE PUSH1 0x4 PUSH2 0x18D4 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x231 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x240 CALLDATASIZE PUSH1 0x4 PUSH2 0x198C JUMP JUMPDEST PUSH2 0x57F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x279 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x2B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0x689 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0x2D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A15 JUMP JUMPDEST PUSH2 0x85A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x8C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x30F CALLDATASIZE PUSH1 0x4 PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x966 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AC4 JUMP JUMPDEST PUSH2 0xA1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xBDF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x279 SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x279 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x3BD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xCB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x3DD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BF6 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xD00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x43A CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0xDB7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xF31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x460 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x46F CALLDATASIZE PUSH1 0x4 PUSH2 0x1C94 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x52D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x579 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x587 PUSH2 0xFAD JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x5DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH2 0x670 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5FB JUMPI PUSH2 0x5FB PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x610 SWAP2 SWAP1 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x624 JUMPI PUSH2 0x624 PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x636 SWAP2 SWAP1 PUSH2 0x1D3F JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x67A DUP2 PUSH2 0x1DA4 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5DE JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x734 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x7A9 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x832 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x83B DUP2 PUSH2 0x10D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x857 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x10E1 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x864 PUSH2 0x12B1 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x8C0 DUP3 PUSH2 0x1336 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x952 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x682 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x96E PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA15 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xAC8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB3D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0xBCF DUP3 PUSH2 0x10D9 JUMP JUMPDEST PUSH2 0xBDB DUP3 DUP3 PUSH1 0x1 PUSH2 0x10E1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xC8C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xCB9 PUSH2 0xFAD JUMP JUMPDEST PUSH2 0xCFA DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD8E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDB2 SWAP2 SWAP1 PUSH2 0x1E03 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xDD7 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xDF1 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDF1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xE63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xECB PUSH1 0x0 PUSH2 0x1418 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xBDB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xD71 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x100E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1085 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x10C2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x10C7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x682 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x857 PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1119 JUMPI PUSH2 0x1114 DUP4 PUSH2 0x14B7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x119E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x119B SWAP2 DUP2 ADD SWAP1 PUSH2 0x1E03 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1210 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x12A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH2 0x1114 DUP4 DUP4 DUP4 PUSH2 0x15A7 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x857 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x682 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x682 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x13CC JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1541 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15B0 DUP4 PUSH2 0x15CC JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x15BD JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1114 JUMPI PUSH2 0xCFA DUP4 DUP4 PUSH2 0x1619 JUMP JUMPDEST PUSH2 0x15D5 DUP2 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EB6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1663 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x169E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16A3 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16B4 DUP7 DUP4 DUP4 DUP8 PUSH2 0x16BE JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x173A JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1733 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST POP DUP2 PUSH2 0x1744 JUMP JUMPDEST PUSH2 0x1744 DUP4 DUP4 PUSH2 0x174C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x175C JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5D2 SWAP2 SWAP1 PUSH2 0x1E64 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x17AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x17FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1808 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1818 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1828 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x184C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1858 DUP13 DUP4 DUP14 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187E DUP12 DUP3 DUP13 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x18A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x8C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x18EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x18F7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1907 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x192A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1936 DUP9 DUP3 DUP10 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1971 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19C6 DUP9 DUP4 DUP10 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x19DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x8C0 DUP2 PUSH2 0x1776 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1A2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1A54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1A87 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1AE2 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1AFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B25 JUMPI PUSH2 0x1B25 PUSH2 0x1A95 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B6B JUMPI PUSH2 0x1B6B PUSH2 0x1A95 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1BBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1BC7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1C1D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1C2D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1C4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C56 DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C7B DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1CAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1CB8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1CC8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFE DUP10 DUP3 DUP11 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1DFC JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1E37 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1E1F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCFA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1E5A DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1E83 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FF89EA 0xB9 0x2B 0xC 0x1F 0x27 PUSH25 0x87DDB99B41E2B60AE6B8D4745A41FD8CD00A3A53F865066473 PUSH16 0x6C634300080F00330000000000000000 ","sourceMap":"333:808:92:-:0;;;1088:4:32;1045:48;;606:130:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1278:26:73;;;;680:12:92;1314:22:73;:20;:22::i;:::-;-1:-1:-1;;;;;;704:25:92::1;;::::0;-1:-1:-1;333:808:92;;5906:279:31;5974:13;;;;;;;5973:14;5965:66;;;;-1:-1:-1;;;5965:66:31;;802:2:111;5965:66:31;;;784:21:111;841:2;821:18;;;814:30;880:34;860:18;;;853:62;-1:-1:-1;;;931:18:111;;;924:37;978:19;;5965:66:31;;;;;;;;6045:12;;6060:15;6045:12;;;:30;6041:138;;;6091:12;:30;;-1:-1:-1;;6091:30:31;6106:15;6091:30;;;;;;6140:28;;1150:36:111;;;6140:28:31;;1138:2:111;1123:18;6140:28:31;;;;;;;6041:138;5906:279::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;1008:184::-;333:808:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_13870":{"entryPoint":null,"id":13870,"parameterSlots":0,"returnSlots":0},"@_authorizeUpgrade_14140":{"entryPoint":4313,"id":14140,"parameterSlots":1,"returnSlots":0},"@_call_14076":{"entryPoint":4188,"id":14076,"parameterSlots":3,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_initialize_13998":{"entryPoint":5144,"id":13998,"parameterSlots":1,"returnSlots":0},"@_onlyOwner_13904":{"entryPoint":5025,"id":13904,"parameterSlots":0,"returnSlots":0},"@_packValidationData_9942":{"entryPoint":null,"id":9942,"parameterSlots":1,"returnSlots":1},"@_payPrefund_7307":{"entryPoint":4918,"id":7307,"parameterSlots":1,"returnSlots":0},"@_requireFromEntryPointOrOwner_14019":{"entryPoint":4013,"id":14019,"parameterSlots":0,"returnSlots":0},"@_requireFromEntryPoint_7256":{"entryPoint":4785,"id":7256,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":5964,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":5303,"id":3050,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCallUUPS_3148":{"entryPoint":4321,"id":3148,"parameterSlots":3,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":5543,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":5580,"id":3065,"parameterSlots":1,"returnSlots":0},"@_validateNonce_7274":{"entryPoint":null,"id":7274,"parameterSlots":1,"returnSlots":0},"@_validateSignature_19396":{"entryPoint":null,"id":19396,"parameterSlots":2,"returnSlots":1},"@addDeposit_14109":{"entryPoint":2247,"id":14109,"parameterSlots":0,"returnSlots":0},"@aggregator_19337":{"entryPoint":null,"id":19337,"parameterSlots":0,"returnSlots":0},"@entryPoint_13866":{"entryPoint":null,"id":13866,"parameterSlots":0,"returnSlots":1},"@executeBatch_13970":{"entryPoint":1407,"id":13970,"parameterSlots":4,"returnSlots":0},"@execute_13924":{"entryPoint":3249,"id":13924,"parameterSlots":4,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":5657,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":null,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":null,"id":5258,"parameterSlots":1,"returnSlots":1},"@getBooleanSlot_5269":{"entryPoint":null,"id":5269,"parameterSlots":1,"returnSlots":1},"@getDeposit_14092":{"entryPoint":3328,"id":14092,"parameterSlots":0,"returnSlots":1},"@getNonce_7198":{"entryPoint":3889,"id":7198,"parameterSlots":0,"returnSlots":1},"@initialize_19372":{"entryPoint":3511,"id":19372,"parameterSlots":1,"returnSlots":0},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@owner_13838":{"entryPoint":null,"id":13838,"parameterSlots":0,"returnSlots":0},"@proxiableUUID_3609":{"entryPoint":3039,"id":3609,"parameterSlots":0,"returnSlots":1},"@supportsInterface_17936":{"entryPoint":1178,"id":17936,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"@upgradeToAndCall_3652":{"entryPoint":2589,"id":3652,"parameterSlots":2,"returnSlots":0},"@upgradeTo_3631":{"entryPoint":1673,"id":3631,"parameterSlots":1,"returnSlots":0},"@validateUserOp_7239":{"entryPoint":2138,"id":7239,"parameterSlots":3,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":5822,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawDepositTo_14127":{"entryPoint":2406,"id":14127,"parameterSlots":2,"returnSlots":0},"abi_decode_array_address_dyn_calldata":{"entryPoint":6471,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":6040,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address":{"entryPoint":6648,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":6761,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":6113,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":7158,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":6356,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":7316,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":6852,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7078,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":6540,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes4":{"entryPoint":6290,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6677,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":7683,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":7752,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":7780,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":7487,"id":null,"parameterSlots":2,"returnSlots":2},"copy_memory_to_memory":{"entryPoint":7708,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":7588,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x32":{"entryPoint":7440,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":6805,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":6006,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:18750:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"245:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"294:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"303:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"306:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"296:6:111"},"nodeType":"YulFunctionCall","src":"296:12:111"},"nodeType":"YulExpressionStatement","src":"296:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"273:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"281:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"269:3:111"},"nodeType":"YulFunctionCall","src":"269:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"288:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"265:3:111"},"nodeType":"YulFunctionCall","src":"265:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"258:6:111"},"nodeType":"YulFunctionCall","src":"258:35:111"},"nodeType":"YulIf","src":"255:55:111"},{"nodeType":"YulAssignment","src":"319:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"342:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"329:12:111"},"nodeType":"YulFunctionCall","src":"329:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"319:6:111"}]},{"body":{"nodeType":"YulBlock","src":"392:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"401:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"404:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"394:6:111"},"nodeType":"YulFunctionCall","src":"394:12:111"},"nodeType":"YulExpressionStatement","src":"394:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"364:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"372:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"361:2:111"},"nodeType":"YulFunctionCall","src":"361:30:111"},"nodeType":"YulIf","src":"358:50:111"},{"nodeType":"YulAssignment","src":"417:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"433:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"441:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"417:8:111"}]},{"body":{"nodeType":"YulBlock","src":"498:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"507:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"510:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"500:6:111"},"nodeType":"YulFunctionCall","src":"500:12:111"},"nodeType":"YulExpressionStatement","src":"500:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"469:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"477:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"465:3:111"},"nodeType":"YulFunctionCall","src":"465:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"461:3:111"},"nodeType":"YulFunctionCall","src":"461:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"493:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"458:2:111"},"nodeType":"YulFunctionCall","src":"458:39:111"},"nodeType":"YulIf","src":"455:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"208:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"216:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"224:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"234:6:111","type":""}],"src":"173:347:111"},{"body":{"nodeType":"YulBlock","src":"718:1012:111","statements":[{"body":{"nodeType":"YulBlock","src":"765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"767:6:111"},"nodeType":"YulFunctionCall","src":"767:12:111"},"nodeType":"YulExpressionStatement","src":"767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"735:3:111"},"nodeType":"YulFunctionCall","src":"735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"760:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"731:3:111"},"nodeType":"YulFunctionCall","src":"731:33:111"},"nodeType":"YulIf","src":"728:53:111"},{"nodeType":"YulVariableDeclaration","src":"790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"803:12:111"},"nodeType":"YulFunctionCall","src":"803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"860:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"835:24:111"},"nodeType":"YulFunctionCall","src":"835:31:111"},"nodeType":"YulExpressionStatement","src":"835:31:111"},{"nodeType":"YulAssignment","src":"875:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"875:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"899:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"927:3:111"},"nodeType":"YulFunctionCall","src":"927:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"914:12:111"},"nodeType":"YulFunctionCall","src":"914:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"903:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"980:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"955:24:111"},"nodeType":"YulFunctionCall","src":"955:33:111"},"nodeType":"YulExpressionStatement","src":"955:33:111"},{"nodeType":"YulAssignment","src":"997:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1007:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1023:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1066:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1051:3:111"},"nodeType":"YulFunctionCall","src":"1051:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1038:12:111"},"nodeType":"YulFunctionCall","src":"1038:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1027:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1104:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1079:24:111"},"nodeType":"YulFunctionCall","src":"1079:33:111"},"nodeType":"YulExpressionStatement","src":"1079:33:111"},{"nodeType":"YulAssignment","src":"1121:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1131:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1121:6:111"}]},{"nodeType":"YulAssignment","src":"1147:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1170:3:111"},"nodeType":"YulFunctionCall","src":"1170:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1157:12:111"},"nodeType":"YulFunctionCall","src":"1157:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1147:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1198:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1240:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1225:3:111"},"nodeType":"YulFunctionCall","src":"1225:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1212:12:111"},"nodeType":"YulFunctionCall","src":"1212:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1202:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:14:111"},"nodeType":"YulIf","src":"1291:34:111"},{"nodeType":"YulVariableDeclaration","src":"1334:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1390:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1401:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1386:3:111"},"nodeType":"YulFunctionCall","src":"1386:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1410:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1360:25:111"},"nodeType":"YulFunctionCall","src":"1360:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1338:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1348:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1427:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1437:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1427:6:111"}]},{"nodeType":"YulAssignment","src":"1454:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1464:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1454:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1481:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1525:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1510:3:111"},"nodeType":"YulFunctionCall","src":"1510:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1497:12:111"},"nodeType":"YulFunctionCall","src":"1497:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1485:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1561:6:111"},"nodeType":"YulFunctionCall","src":"1561:12:111"},"nodeType":"YulExpressionStatement","src":"1561:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1545:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1555:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1542:2:111"},"nodeType":"YulFunctionCall","src":"1542:16:111"},"nodeType":"YulIf","src":"1539:36:111"},{"nodeType":"YulVariableDeclaration","src":"1584:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1640:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1651:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1636:3:111"},"nodeType":"YulFunctionCall","src":"1636:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1662:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1610:25:111"},"nodeType":"YulFunctionCall","src":"1610:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1588:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1598:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1679:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1689:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1679:6:111"}]},{"nodeType":"YulAssignment","src":"1706:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1716:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1706:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"628:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"639:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"651:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"659:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"667:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"675:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"683:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"691:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"699:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"707:6:111","type":""}],"src":"525:1205:111"},{"body":{"nodeType":"YulBlock","src":"1804:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1850:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1859:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1862:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1852:6:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"nodeType":"YulExpressionStatement","src":"1852:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1825:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1834:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1821:3:111"},"nodeType":"YulFunctionCall","src":"1821:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1846:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1817:3:111"},"nodeType":"YulFunctionCall","src":"1817:32:111"},"nodeType":"YulIf","src":"1814:52:111"},{"nodeType":"YulVariableDeclaration","src":"1875:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1901:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1888:12:111"},"nodeType":"YulFunctionCall","src":"1888:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1879:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2021:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2030:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2033:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2023:6:111"},"nodeType":"YulFunctionCall","src":"2023:12:111"},"nodeType":"YulExpressionStatement","src":"2023:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1933:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1944:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1951:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1940:3:111"},"nodeType":"YulFunctionCall","src":"1940:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:97:111"},"nodeType":"YulIf","src":"1920:117:111"},{"nodeType":"YulAssignment","src":"2046:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2056:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2046:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1770:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1781:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1793:6:111","type":""}],"src":"1735:332:111"},{"body":{"nodeType":"YulBlock","src":"2167:92:111","statements":[{"nodeType":"YulAssignment","src":"2177:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2200:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2185:3:111"},"nodeType":"YulFunctionCall","src":"2185:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2177:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2219:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2244:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2237:6:111"},"nodeType":"YulFunctionCall","src":"2237:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2230:6:111"},"nodeType":"YulFunctionCall","src":"2230:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2212:6:111"},"nodeType":"YulFunctionCall","src":"2212:41:111"},"nodeType":"YulExpressionStatement","src":"2212:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2136:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2147:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2158:4:111","type":""}],"src":"2072:187:111"},{"body":{"nodeType":"YulBlock","src":"2404:614:111","statements":[{"body":{"nodeType":"YulBlock","src":"2451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2453:6:111"},"nodeType":"YulFunctionCall","src":"2453:12:111"},"nodeType":"YulExpressionStatement","src":"2453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2425:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2421:3:111"},"nodeType":"YulFunctionCall","src":"2421:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2446:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:33:111"},"nodeType":"YulIf","src":"2414:53:111"},{"nodeType":"YulVariableDeclaration","src":"2476:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2502:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2489:12:111"},"nodeType":"YulFunctionCall","src":"2489:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2480:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2546:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2521:24:111"},"nodeType":"YulFunctionCall","src":"2521:31:111"},"nodeType":"YulExpressionStatement","src":"2521:31:111"},{"nodeType":"YulAssignment","src":"2561:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2561:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2585:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2617:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2628:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2600:12:111"},"nodeType":"YulFunctionCall","src":"2600:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2589:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2666:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2641:24:111"},"nodeType":"YulFunctionCall","src":"2641:33:111"},"nodeType":"YulExpressionStatement","src":"2641:33:111"},{"nodeType":"YulAssignment","src":"2683:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2693:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2683:6:111"}]},{"nodeType":"YulAssignment","src":"2709:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2736:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2719:12:111"},"nodeType":"YulFunctionCall","src":"2719:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2760:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2802:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2787:3:111"},"nodeType":"YulFunctionCall","src":"2787:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2774:12:111"},"nodeType":"YulFunctionCall","src":"2774:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2764:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2821:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2829:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2818:2:111"},"nodeType":"YulFunctionCall","src":"2818:30:111"},"nodeType":"YulIf","src":"2815:50:111"},{"nodeType":"YulVariableDeclaration","src":"2874:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2930:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2941:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2926:3:111"},"nodeType":"YulFunctionCall","src":"2926:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2950:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2900:25:111"},"nodeType":"YulFunctionCall","src":"2900:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2878:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2888:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2967:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2977:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2967:6:111"}]},{"nodeType":"YulAssignment","src":"2994:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"3004:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2994:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2338:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2349:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2369:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2377:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2385:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2393:6:111","type":""}],"src":"2264:754:111"},{"body":{"nodeType":"YulBlock","src":"3122:149:111","statements":[{"nodeType":"YulAssignment","src":"3132:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3140:3:111"},"nodeType":"YulFunctionCall","src":"3140:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3132:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3174:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3197:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3185:3:111"},"nodeType":"YulFunctionCall","src":"3185:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:98:111"},"nodeType":"YulExpressionStatement","src":"3167:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3091:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3102:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3113:4:111","type":""}],"src":"3023:248:111"},{"body":{"nodeType":"YulBlock","src":"3360:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:12:111"},"nodeType":"YulExpressionStatement","src":"3411:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3396:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3403:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:35:111"},"nodeType":"YulIf","src":"3370:55:111"},{"nodeType":"YulAssignment","src":"3434:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3457:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3444:12:111"},"nodeType":"YulFunctionCall","src":"3444:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3434:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3509:6:111"},"nodeType":"YulFunctionCall","src":"3509:12:111"},"nodeType":"YulExpressionStatement","src":"3509:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3476:2:111"},"nodeType":"YulFunctionCall","src":"3476:30:111"},"nodeType":"YulIf","src":"3473:50:111"},{"nodeType":"YulAssignment","src":"3532:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3544:3:111"},"nodeType":"YulFunctionCall","src":"3544:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3532:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3623:6:111"},"nodeType":"YulFunctionCall","src":"3623:12:111"},"nodeType":"YulExpressionStatement","src":"3623:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3584:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3596:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3599:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3609:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3576:3:111"},"nodeType":"YulFunctionCall","src":"3576:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3616:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3573:2:111"},"nodeType":"YulFunctionCall","src":"3573:47:111"},"nodeType":"YulIf","src":"3570:67:111"}]},"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3323:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3331:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3339:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3349:6:111","type":""}],"src":"3276:367:111"},{"body":{"nodeType":"YulBlock","src":"3816:616:111","statements":[{"body":{"nodeType":"YulBlock","src":"3862:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3874:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3864:6:111"},"nodeType":"YulFunctionCall","src":"3864:12:111"},"nodeType":"YulExpressionStatement","src":"3864:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3837:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3846:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3833:3:111"},"nodeType":"YulFunctionCall","src":"3833:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3829:3:111"},"nodeType":"YulFunctionCall","src":"3829:32:111"},"nodeType":"YulIf","src":"3826:52:111"},{"nodeType":"YulVariableDeclaration","src":"3887:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3914:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3901:12:111"},"nodeType":"YulFunctionCall","src":"3901:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3891:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3933:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3943:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3937:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3988:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3997:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4000:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3990:6:111"},"nodeType":"YulFunctionCall","src":"3990:12:111"},"nodeType":"YulExpressionStatement","src":"3990:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3976:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3984:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3973:2:111"},"nodeType":"YulFunctionCall","src":"3973:14:111"},"nodeType":"YulIf","src":"3970:34:111"},{"nodeType":"YulVariableDeclaration","src":"4013:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4081:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4092:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4077:3:111"},"nodeType":"YulFunctionCall","src":"4077:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4101:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4039:37:111"},"nodeType":"YulFunctionCall","src":"4039:70:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"4017:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"4027:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4118:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"4128:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4118:6:111"}]},{"nodeType":"YulAssignment","src":"4145:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4155:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4172:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4201:3:111"},"nodeType":"YulFunctionCall","src":"4201:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4188:12:111"},"nodeType":"YulFunctionCall","src":"4188:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4176:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4251:6:111"},"nodeType":"YulFunctionCall","src":"4251:12:111"},"nodeType":"YulExpressionStatement","src":"4251:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4235:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4245:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4232:2:111"},"nodeType":"YulFunctionCall","src":"4232:16:111"},"nodeType":"YulIf","src":"4229:36:111"},{"nodeType":"YulVariableDeclaration","src":"4274:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4353:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4338:3:111"},"nodeType":"YulFunctionCall","src":"4338:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4364:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4300:37:111"},"nodeType":"YulFunctionCall","src":"4300:72:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4278:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4288:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4381:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4391:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4381:6:111"}]},{"nodeType":"YulAssignment","src":"4408:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4418:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4408:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3758:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3769:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3781:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3789:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3797:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3805:6:111","type":""}],"src":"3648:784:111"},{"body":{"nodeType":"YulBlock","src":"4538:125:111","statements":[{"nodeType":"YulAssignment","src":"4548:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4560:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4571:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4556:3:111"},"nodeType":"YulFunctionCall","src":"4556:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4548:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4590:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4605:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4613:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4601:3:111"},"nodeType":"YulFunctionCall","src":"4601:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4583:6:111"},"nodeType":"YulFunctionCall","src":"4583:74:111"},"nodeType":"YulExpressionStatement","src":"4583:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4507:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4518:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4529:4:111","type":""}],"src":"4437:226:111"},{"body":{"nodeType":"YulBlock","src":"4738:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4784:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4793:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4796:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4786:6:111"},"nodeType":"YulFunctionCall","src":"4786:12:111"},"nodeType":"YulExpressionStatement","src":"4786:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4759:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4768:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4755:3:111"},"nodeType":"YulFunctionCall","src":"4755:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4780:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4751:3:111"},"nodeType":"YulFunctionCall","src":"4751:32:111"},"nodeType":"YulIf","src":"4748:52:111"},{"nodeType":"YulVariableDeclaration","src":"4809:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4835:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4822:12:111"},"nodeType":"YulFunctionCall","src":"4822:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4813:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4879:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4854:24:111"},"nodeType":"YulFunctionCall","src":"4854:31:111"},"nodeType":"YulExpressionStatement","src":"4854:31:111"},{"nodeType":"YulAssignment","src":"4894:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4904:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4894:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4704:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4715:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4727:6:111","type":""}],"src":"4668:247:111"},{"body":{"nodeType":"YulBlock","src":"5058:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"5104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5106:6:111"},"nodeType":"YulFunctionCall","src":"5106:12:111"},"nodeType":"YulExpressionStatement","src":"5106:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5079:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5088:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5075:3:111"},"nodeType":"YulFunctionCall","src":"5075:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5100:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5071:3:111"},"nodeType":"YulFunctionCall","src":"5071:32:111"},"nodeType":"YulIf","src":"5068:52:111"},{"nodeType":"YulVariableDeclaration","src":"5129:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5156:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5143:12:111"},"nodeType":"YulFunctionCall","src":"5143:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"5133:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5209:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5218:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5221:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5211:6:111"},"nodeType":"YulFunctionCall","src":"5211:12:111"},"nodeType":"YulExpressionStatement","src":"5211:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5181:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5189:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5178:2:111"},"nodeType":"YulFunctionCall","src":"5178:30:111"},"nodeType":"YulIf","src":"5175:50:111"},{"nodeType":"YulVariableDeclaration","src":"5234:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5248:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5259:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5244:3:111"},"nodeType":"YulFunctionCall","src":"5244:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5238:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5305:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5314:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5317:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5307:6:111"},"nodeType":"YulFunctionCall","src":"5307:12:111"},"nodeType":"YulExpressionStatement","src":"5307:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5286:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5295:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5282:3:111"},"nodeType":"YulFunctionCall","src":"5282:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5300:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5278:3:111"},"nodeType":"YulFunctionCall","src":"5278:26:111"},"nodeType":"YulIf","src":"5275:46:111"},{"nodeType":"YulAssignment","src":"5330:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5340:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5330:6:111"}]},{"nodeType":"YulAssignment","src":"5351:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5378:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5389:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5374:3:111"},"nodeType":"YulFunctionCall","src":"5374:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5361:12:111"},"nodeType":"YulFunctionCall","src":"5361:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5351:6:111"}]},{"nodeType":"YulAssignment","src":"5402:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5440:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5425:3:111"},"nodeType":"YulFunctionCall","src":"5425:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5412:12:111"},"nodeType":"YulFunctionCall","src":"5412:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5402:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5008:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5019:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5031:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5039:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5047:6:111","type":""}],"src":"4920:530:111"},{"body":{"nodeType":"YulBlock","src":"5556:76:111","statements":[{"nodeType":"YulAssignment","src":"5566:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5578:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5589:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5574:3:111"},"nodeType":"YulFunctionCall","src":"5574:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5566:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5608:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5619:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5601:6:111"},"nodeType":"YulFunctionCall","src":"5601:25:111"},"nodeType":"YulExpressionStatement","src":"5601:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5525:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5536:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5547:4:111","type":""}],"src":"5455:177:111"},{"body":{"nodeType":"YulBlock","src":"5732:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"5778:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5787:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5790:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5780:6:111"},"nodeType":"YulFunctionCall","src":"5780:12:111"},"nodeType":"YulExpressionStatement","src":"5780:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5753:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5762:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5749:3:111"},"nodeType":"YulFunctionCall","src":"5749:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5774:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5745:3:111"},"nodeType":"YulFunctionCall","src":"5745:32:111"},"nodeType":"YulIf","src":"5742:52:111"},{"nodeType":"YulVariableDeclaration","src":"5803:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5829:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5816:12:111"},"nodeType":"YulFunctionCall","src":"5816:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5807:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5873:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"5848:24:111"},"nodeType":"YulFunctionCall","src":"5848:31:111"},"nodeType":"YulExpressionStatement","src":"5848:31:111"},{"nodeType":"YulAssignment","src":"5888:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5898:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5888:6:111"}]},{"nodeType":"YulAssignment","src":"5912:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5939:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5950:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5935:3:111"},"nodeType":"YulFunctionCall","src":"5935:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5922:12:111"},"nodeType":"YulFunctionCall","src":"5922:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5912:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5690:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5701:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5713:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5721:6:111","type":""}],"src":"5637:323:111"},{"body":{"nodeType":"YulBlock","src":"5997:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6017:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6007:6:111"},"nodeType":"YulFunctionCall","src":"6007:88:111"},"nodeType":"YulExpressionStatement","src":"6007:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6111:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6114:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6104:6:111"},"nodeType":"YulFunctionCall","src":"6104:15:111"},"nodeType":"YulExpressionStatement","src":"6104:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6135:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6138:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6128:6:111"},"nodeType":"YulFunctionCall","src":"6128:15:111"},"nodeType":"YulExpressionStatement","src":"6128:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"5965:184:111"},{"body":{"nodeType":"YulBlock","src":"6250:1019:111","statements":[{"body":{"nodeType":"YulBlock","src":"6296:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6305:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6308:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6298:6:111"},"nodeType":"YulFunctionCall","src":"6298:12:111"},"nodeType":"YulExpressionStatement","src":"6298:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6271:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6280:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6267:3:111"},"nodeType":"YulFunctionCall","src":"6267:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6292:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6263:3:111"},"nodeType":"YulFunctionCall","src":"6263:32:111"},"nodeType":"YulIf","src":"6260:52:111"},{"nodeType":"YulVariableDeclaration","src":"6321:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6347:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6334:12:111"},"nodeType":"YulFunctionCall","src":"6334:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6325:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6391:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6366:24:111"},"nodeType":"YulFunctionCall","src":"6366:31:111"},"nodeType":"YulExpressionStatement","src":"6366:31:111"},{"nodeType":"YulAssignment","src":"6406:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6416:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6406:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6430:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6461:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6472:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6457:3:111"},"nodeType":"YulFunctionCall","src":"6457:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6444:12:111"},"nodeType":"YulFunctionCall","src":"6444:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6434:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6485:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6495:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6489:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6540:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6549:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6552:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6542:6:111"},"nodeType":"YulFunctionCall","src":"6542:12:111"},"nodeType":"YulExpressionStatement","src":"6542:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6528:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6536:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6525:2:111"},"nodeType":"YulFunctionCall","src":"6525:14:111"},"nodeType":"YulIf","src":"6522:34:111"},{"nodeType":"YulVariableDeclaration","src":"6565:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6579:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6590:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6575:3:111"},"nodeType":"YulFunctionCall","src":"6575:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6569:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6645:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6654:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6657:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6647:6:111"},"nodeType":"YulFunctionCall","src":"6647:12:111"},"nodeType":"YulExpressionStatement","src":"6647:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6624:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6628:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6620:3:111"},"nodeType":"YulFunctionCall","src":"6620:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6635:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6616:3:111"},"nodeType":"YulFunctionCall","src":"6616:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6609:6:111"},"nodeType":"YulFunctionCall","src":"6609:35:111"},"nodeType":"YulIf","src":"6606:55:111"},{"nodeType":"YulVariableDeclaration","src":"6670:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6693:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6680:12:111"},"nodeType":"YulFunctionCall","src":"6680:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6674:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6719:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6721:16:111"},"nodeType":"YulFunctionCall","src":"6721:18:111"},"nodeType":"YulExpressionStatement","src":"6721:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6711:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6715:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6708:2:111"},"nodeType":"YulFunctionCall","src":"6708:10:111"},"nodeType":"YulIf","src":"6705:36:111"},{"nodeType":"YulVariableDeclaration","src":"6750:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6760:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"6754:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6835:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6855:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6849:5:111"},"nodeType":"YulFunctionCall","src":"6849:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"6839:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6867:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6889:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6913:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6917:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6909:3:111"},"nodeType":"YulFunctionCall","src":"6909:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6924:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6905:3:111"},"nodeType":"YulFunctionCall","src":"6905:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"6929:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6901:3:111"},"nodeType":"YulFunctionCall","src":"6901:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6934:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6897:3:111"},"nodeType":"YulFunctionCall","src":"6897:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6885:3:111"},"nodeType":"YulFunctionCall","src":"6885:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"6871:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6997:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6999:16:111"},"nodeType":"YulFunctionCall","src":"6999:18:111"},"nodeType":"YulExpressionStatement","src":"6999:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6956:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6968:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6953:2:111"},"nodeType":"YulFunctionCall","src":"6953:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6976:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"6988:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6973:2:111"},"nodeType":"YulFunctionCall","src":"6973:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"6950:2:111"},"nodeType":"YulFunctionCall","src":"6950:46:111"},"nodeType":"YulIf","src":"6947:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7035:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"7039:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7028:6:111"},"nodeType":"YulFunctionCall","src":"7028:22:111"},"nodeType":"YulExpressionStatement","src":"7028:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7066:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7074:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7059:6:111"},"nodeType":"YulFunctionCall","src":"7059:18:111"},"nodeType":"YulExpressionStatement","src":"7059:18:111"},{"body":{"nodeType":"YulBlock","src":"7123:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7132:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7135:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7125:6:111"},"nodeType":"YulFunctionCall","src":"7125:12:111"},"nodeType":"YulExpressionStatement","src":"7125:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7100:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7104:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7096:3:111"},"nodeType":"YulFunctionCall","src":"7096:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"7109:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7092:3:111"},"nodeType":"YulFunctionCall","src":"7092:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7114:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7089:2:111"},"nodeType":"YulFunctionCall","src":"7089:33:111"},"nodeType":"YulIf","src":"7086:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7165:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7173:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7161:3:111"},"nodeType":"YulFunctionCall","src":"7161:15:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7182:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"7186:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7178:3:111"},"nodeType":"YulFunctionCall","src":"7178:11:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7191:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"7148:12:111"},"nodeType":"YulFunctionCall","src":"7148:46:111"},"nodeType":"YulExpressionStatement","src":"7148:46:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7218:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7226:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7214:3:111"},"nodeType":"YulFunctionCall","src":"7214:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7231:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7210:3:111"},"nodeType":"YulFunctionCall","src":"7210:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"7236:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7203:6:111"},"nodeType":"YulFunctionCall","src":"7203:35:111"},"nodeType":"YulExpressionStatement","src":"7203:35:111"},{"nodeType":"YulAssignment","src":"7247:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"7257:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7247:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6208:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6219:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6231:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6239:6:111","type":""}],"src":"6154:1115:111"},{"body":{"nodeType":"YulBlock","src":"7375:76:111","statements":[{"nodeType":"YulAssignment","src":"7385:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7408:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7393:3:111"},"nodeType":"YulFunctionCall","src":"7393:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7385:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7427:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7438:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7420:6:111"},"nodeType":"YulFunctionCall","src":"7420:25:111"},"nodeType":"YulExpressionStatement","src":"7420:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7344:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7355:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7366:4:111","type":""}],"src":"7274:177:111"},{"body":{"nodeType":"YulBlock","src":"7578:125:111","statements":[{"nodeType":"YulAssignment","src":"7588:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7600:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7611:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7596:3:111"},"nodeType":"YulFunctionCall","src":"7596:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7588:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7630:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7645:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7653:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7641:3:111"},"nodeType":"YulFunctionCall","src":"7641:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7623:6:111"},"nodeType":"YulFunctionCall","src":"7623:74:111"},"nodeType":"YulExpressionStatement","src":"7623:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7547:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7558:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7569:4:111","type":""}],"src":"7456:247:111"},{"body":{"nodeType":"YulBlock","src":"7831:489:111","statements":[{"body":{"nodeType":"YulBlock","src":"7877:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7886:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7889:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7879:6:111"},"nodeType":"YulFunctionCall","src":"7879:12:111"},"nodeType":"YulExpressionStatement","src":"7879:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7852:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7861:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7848:3:111"},"nodeType":"YulFunctionCall","src":"7848:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7873:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7844:3:111"},"nodeType":"YulFunctionCall","src":"7844:32:111"},"nodeType":"YulIf","src":"7841:52:111"},{"nodeType":"YulVariableDeclaration","src":"7902:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7928:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7915:12:111"},"nodeType":"YulFunctionCall","src":"7915:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"7906:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7972:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"7947:24:111"},"nodeType":"YulFunctionCall","src":"7947:31:111"},"nodeType":"YulExpressionStatement","src":"7947:31:111"},{"nodeType":"YulAssignment","src":"7987:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"7997:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7987:6:111"}]},{"nodeType":"YulAssignment","src":"8011:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8038:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8049:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8034:3:111"},"nodeType":"YulFunctionCall","src":"8034:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8021:12:111"},"nodeType":"YulFunctionCall","src":"8021:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8011:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8062:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8104:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8089:3:111"},"nodeType":"YulFunctionCall","src":"8089:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8076:12:111"},"nodeType":"YulFunctionCall","src":"8076:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8066:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8151:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8160:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8163:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8153:6:111"},"nodeType":"YulFunctionCall","src":"8153:12:111"},"nodeType":"YulExpressionStatement","src":"8153:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8123:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8131:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8120:2:111"},"nodeType":"YulFunctionCall","src":"8120:30:111"},"nodeType":"YulIf","src":"8117:50:111"},{"nodeType":"YulVariableDeclaration","src":"8176:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8232:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8243:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8228:3:111"},"nodeType":"YulFunctionCall","src":"8228:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8252:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8202:25:111"},"nodeType":"YulFunctionCall","src":"8202:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8180:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"8190:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8269:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"8279:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8269:6:111"}]},{"nodeType":"YulAssignment","src":"8296:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"8306:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8296:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7773:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7784:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7796:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7804:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"7812:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"7820:6:111","type":""}],"src":"7708:612:111"},{"body":{"nodeType":"YulBlock","src":"8552:1111:111","statements":[{"body":{"nodeType":"YulBlock","src":"8599:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8608:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8611:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8601:6:111"},"nodeType":"YulFunctionCall","src":"8601:12:111"},"nodeType":"YulExpressionStatement","src":"8601:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8573:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8582:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8569:3:111"},"nodeType":"YulFunctionCall","src":"8569:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8594:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8565:3:111"},"nodeType":"YulFunctionCall","src":"8565:33:111"},"nodeType":"YulIf","src":"8562:53:111"},{"nodeType":"YulVariableDeclaration","src":"8624:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8650:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8637:12:111"},"nodeType":"YulFunctionCall","src":"8637:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8628:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8694:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8669:24:111"},"nodeType":"YulFunctionCall","src":"8669:31:111"},"nodeType":"YulExpressionStatement","src":"8669:31:111"},{"nodeType":"YulAssignment","src":"8709:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8719:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8733:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8765:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8776:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8761:3:111"},"nodeType":"YulFunctionCall","src":"8761:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8748:12:111"},"nodeType":"YulFunctionCall","src":"8748:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"8737:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"8814:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8789:24:111"},"nodeType":"YulFunctionCall","src":"8789:33:111"},"nodeType":"YulExpressionStatement","src":"8789:33:111"},{"nodeType":"YulAssignment","src":"8831:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"8841:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8831:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8857:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8888:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8899:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8884:3:111"},"nodeType":"YulFunctionCall","src":"8884:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8871:12:111"},"nodeType":"YulFunctionCall","src":"8871:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8861:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"8912:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8922:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8916:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8967:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8976:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8979:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8969:6:111"},"nodeType":"YulFunctionCall","src":"8969:12:111"},"nodeType":"YulExpressionStatement","src":"8969:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8955:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8963:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8952:2:111"},"nodeType":"YulFunctionCall","src":"8952:14:111"},"nodeType":"YulIf","src":"8949:34:111"},{"nodeType":"YulVariableDeclaration","src":"8992:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9060:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9071:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9056:3:111"},"nodeType":"YulFunctionCall","src":"9056:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9080:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9018:37:111"},"nodeType":"YulFunctionCall","src":"9018:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8996:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9006:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9097:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"9107:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9097:6:111"}]},{"nodeType":"YulAssignment","src":"9124:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9134:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9124:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9151:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9195:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9180:3:111"},"nodeType":"YulFunctionCall","src":"9180:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9167:12:111"},"nodeType":"YulFunctionCall","src":"9167:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"9155:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9228:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9237:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9240:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9230:6:111"},"nodeType":"YulFunctionCall","src":"9230:12:111"},"nodeType":"YulExpressionStatement","src":"9230:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"9214:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9224:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9211:2:111"},"nodeType":"YulFunctionCall","src":"9211:16:111"},"nodeType":"YulIf","src":"9208:36:111"},{"nodeType":"YulVariableDeclaration","src":"9253:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9321:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"9332:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9317:3:111"},"nodeType":"YulFunctionCall","src":"9317:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9343:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9279:37:111"},"nodeType":"YulFunctionCall","src":"9279:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"9257:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"9267:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9360:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9370:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9360:6:111"}]},{"nodeType":"YulAssignment","src":"9387:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"9397:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"9387:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9414:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9447:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9458:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9443:3:111"},"nodeType":"YulFunctionCall","src":"9443:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9430:12:111"},"nodeType":"YulFunctionCall","src":"9430:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"9418:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9492:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9501:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9504:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9494:6:111"},"nodeType":"YulFunctionCall","src":"9494:12:111"},"nodeType":"YulExpressionStatement","src":"9494:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"9478:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9488:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9475:2:111"},"nodeType":"YulFunctionCall","src":"9475:16:111"},"nodeType":"YulIf","src":"9472:36:111"},{"nodeType":"YulVariableDeclaration","src":"9517:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9573:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"9584:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9569:3:111"},"nodeType":"YulFunctionCall","src":"9569:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9595:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9543:25:111"},"nodeType":"YulFunctionCall","src":"9543:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"9521:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"9531:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9612:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"9622:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"9612:6:111"}]},{"nodeType":"YulAssignment","src":"9639:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"9649:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"9639:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8462:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8473:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8485:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8493:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8501:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8509:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8517:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"8525:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"8533:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"8541:6:111","type":""}],"src":"8325:1338:111"},{"body":{"nodeType":"YulBlock","src":"9825:666:111","statements":[{"body":{"nodeType":"YulBlock","src":"9872:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9881:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9884:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9874:6:111"},"nodeType":"YulFunctionCall","src":"9874:12:111"},"nodeType":"YulExpressionStatement","src":"9874:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9846:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9855:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9842:3:111"},"nodeType":"YulFunctionCall","src":"9842:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9867:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9838:3:111"},"nodeType":"YulFunctionCall","src":"9838:33:111"},"nodeType":"YulIf","src":"9835:53:111"},{"nodeType":"YulVariableDeclaration","src":"9897:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9923:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9910:12:111"},"nodeType":"YulFunctionCall","src":"9910:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9901:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9967:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"9942:24:111"},"nodeType":"YulFunctionCall","src":"9942:31:111"},"nodeType":"YulExpressionStatement","src":"9942:31:111"},{"nodeType":"YulAssignment","src":"9982:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9992:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9982:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10006:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10038:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10049:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10034:3:111"},"nodeType":"YulFunctionCall","src":"10034:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10021:12:111"},"nodeType":"YulFunctionCall","src":"10021:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"10010:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"10087:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10062:24:111"},"nodeType":"YulFunctionCall","src":"10062:33:111"},"nodeType":"YulExpressionStatement","src":"10062:33:111"},{"nodeType":"YulAssignment","src":"10104:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"10114:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10104:6:111"}]},{"nodeType":"YulAssignment","src":"10130:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10157:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10168:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10153:3:111"},"nodeType":"YulFunctionCall","src":"10153:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10140:12:111"},"nodeType":"YulFunctionCall","src":"10140:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10130:6:111"}]},{"nodeType":"YulAssignment","src":"10181:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10208:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10219:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10204:3:111"},"nodeType":"YulFunctionCall","src":"10204:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10191:12:111"},"nodeType":"YulFunctionCall","src":"10191:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10181:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10232:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10263:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10274:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10259:3:111"},"nodeType":"YulFunctionCall","src":"10259:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10246:12:111"},"nodeType":"YulFunctionCall","src":"10246:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"10236:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"10322:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10331:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10334:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10324:6:111"},"nodeType":"YulFunctionCall","src":"10324:12:111"},"nodeType":"YulExpressionStatement","src":"10324:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"10294:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10302:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10291:2:111"},"nodeType":"YulFunctionCall","src":"10291:30:111"},"nodeType":"YulIf","src":"10288:50:111"},{"nodeType":"YulVariableDeclaration","src":"10347:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10403:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"10414:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10399:3:111"},"nodeType":"YulFunctionCall","src":"10399:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"10423:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"10373:25:111"},"nodeType":"YulFunctionCall","src":"10373:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"10351:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"10361:8:111","type":""}]},{"nodeType":"YulAssignment","src":"10440:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"10450:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"10440:6:111"}]},{"nodeType":"YulAssignment","src":"10467:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"10477:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"10467:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9751:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9762:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9774:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9782:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9790:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"9798:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"9806:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"9814:6:111","type":""}],"src":"9668:823:111"},{"body":{"nodeType":"YulBlock","src":"10670:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10687:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10698:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10680:6:111"},"nodeType":"YulFunctionCall","src":"10680:21:111"},"nodeType":"YulExpressionStatement","src":"10680:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10721:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10732:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10717:3:111"},"nodeType":"YulFunctionCall","src":"10717:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10737:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10710:6:111"},"nodeType":"YulFunctionCall","src":"10710:30:111"},"nodeType":"YulExpressionStatement","src":"10710:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10760:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10771:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10756:3:111"},"nodeType":"YulFunctionCall","src":"10756:18:111"},{"hexValue":"77726f6e67206172726179206c656e67746873","kind":"string","nodeType":"YulLiteral","src":"10776:21:111","type":"","value":"wrong array lengths"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10749:6:111"},"nodeType":"YulFunctionCall","src":"10749:49:111"},"nodeType":"YulExpressionStatement","src":"10749:49:111"},{"nodeType":"YulAssignment","src":"10807:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10830:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10815:3:111"},"nodeType":"YulFunctionCall","src":"10815:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10807:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10647:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10661:4:111","type":""}],"src":"10496:343:111"},{"body":{"nodeType":"YulBlock","src":"10876:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10893:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10896:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10886:6:111"},"nodeType":"YulFunctionCall","src":"10886:88:111"},"nodeType":"YulExpressionStatement","src":"10886:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10990:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"10993:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10983:6:111"},"nodeType":"YulFunctionCall","src":"10983:15:111"},"nodeType":"YulExpressionStatement","src":"10983:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11014:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11017:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11007:6:111"},"nodeType":"YulFunctionCall","src":"11007:15:111"},"nodeType":"YulExpressionStatement","src":"11007:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"10844:184:111"},{"body":{"nodeType":"YulBlock","src":"11127:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11137:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"11176:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11163:12:111"},"nodeType":"YulFunctionCall","src":"11163:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"11141:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11338:6:111"},"nodeType":"YulFunctionCall","src":"11338:12:111"},"nodeType":"YulExpressionStatement","src":"11338:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"11211:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"11239:12:111"},"nodeType":"YulFunctionCall","src":"11239:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"11255:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11235:3:111"},"nodeType":"YulFunctionCall","src":"11235:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"11266:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11231:3:111"},"nodeType":"YulFunctionCall","src":"11231:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11207:3:111"},"nodeType":"YulFunctionCall","src":"11207:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11200:6:111"},"nodeType":"YulFunctionCall","src":"11200:135:111"},"nodeType":"YulIf","src":"11197:155:111"},{"nodeType":"YulVariableDeclaration","src":"11361:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"11379:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"11389:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11375:3:111"},"nodeType":"YulFunctionCall","src":"11375:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"11365:6:111","type":""}]},{"nodeType":"YulAssignment","src":"11417:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"11440:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11427:12:111"},"nodeType":"YulFunctionCall","src":"11427:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"11417:6:111"}]},{"body":{"nodeType":"YulBlock","src":"11490:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11499:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11502:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11492:6:111"},"nodeType":"YulFunctionCall","src":"11492:12:111"},"nodeType":"YulExpressionStatement","src":"11492:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"11462:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11470:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11459:2:111"},"nodeType":"YulFunctionCall","src":"11459:30:111"},"nodeType":"YulIf","src":"11456:50:111"},{"nodeType":"YulAssignment","src":"11515:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"11527:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11535:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11523:3:111"},"nodeType":"YulFunctionCall","src":"11523:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"11515:4:111"}]},{"body":{"nodeType":"YulBlock","src":"11591:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11600:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11603:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11593:6:111"},"nodeType":"YulFunctionCall","src":"11593:12:111"},"nodeType":"YulExpressionStatement","src":"11593:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"11556:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"11566:12:111"},"nodeType":"YulFunctionCall","src":"11566:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"11582:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11562:3:111"},"nodeType":"YulFunctionCall","src":"11562:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"11552:3:111"},"nodeType":"YulFunctionCall","src":"11552:38:111"},"nodeType":"YulIf","src":"11549:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"11084:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"11094:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"11110:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"11116:6:111","type":""}],"src":"11033:580:111"},{"body":{"nodeType":"YulBlock","src":"11665:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"11764:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11785:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11788:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11778:6:111"},"nodeType":"YulFunctionCall","src":"11778:88:111"},"nodeType":"YulExpressionStatement","src":"11778:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11886:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11889:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11879:6:111"},"nodeType":"YulFunctionCall","src":"11879:15:111"},"nodeType":"YulExpressionStatement","src":"11879:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11914:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11917:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11907:6:111"},"nodeType":"YulFunctionCall","src":"11907:15:111"},"nodeType":"YulExpressionStatement","src":"11907:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11681:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11688:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"11678:2:111"},"nodeType":"YulFunctionCall","src":"11678:77:111"},"nodeType":"YulIf","src":"11675:257:111"},{"nodeType":"YulAssignment","src":"11941:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"11952:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"11959:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11948:3:111"},"nodeType":"YulFunctionCall","src":"11948:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"11941:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"11647:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"11657:3:111","type":""}],"src":"11618:349:111"},{"body":{"nodeType":"YulBlock","src":"12146:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12163:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12174:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12156:6:111"},"nodeType":"YulFunctionCall","src":"12156:21:111"},"nodeType":"YulExpressionStatement","src":"12156:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12197:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12208:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12193:3:111"},"nodeType":"YulFunctionCall","src":"12193:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12213:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12186:6:111"},"nodeType":"YulFunctionCall","src":"12186:30:111"},"nodeType":"YulExpressionStatement","src":"12186:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12236:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12247:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12232:3:111"},"nodeType":"YulFunctionCall","src":"12232:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"12252:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12225:6:111"},"nodeType":"YulFunctionCall","src":"12225:62:111"},"nodeType":"YulExpressionStatement","src":"12225:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12318:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12303:3:111"},"nodeType":"YulFunctionCall","src":"12303:18:111"},{"hexValue":"64656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"12323:14:111","type":"","value":"delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12296:6:111"},"nodeType":"YulFunctionCall","src":"12296:42:111"},"nodeType":"YulExpressionStatement","src":"12296:42:111"},{"nodeType":"YulAssignment","src":"12347:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12370:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12355:3:111"},"nodeType":"YulFunctionCall","src":"12355:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12347:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12123:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12137:4:111","type":""}],"src":"11972:408:111"},{"body":{"nodeType":"YulBlock","src":"12559:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12587:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12569:6:111"},"nodeType":"YulFunctionCall","src":"12569:21:111"},"nodeType":"YulExpressionStatement","src":"12569:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12610:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12621:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12606:3:111"},"nodeType":"YulFunctionCall","src":"12606:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12626:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12599:6:111"},"nodeType":"YulFunctionCall","src":"12599:30:111"},"nodeType":"YulExpressionStatement","src":"12599:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12649:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12660:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12645:3:111"},"nodeType":"YulFunctionCall","src":"12645:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"12665:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12638:6:111"},"nodeType":"YulFunctionCall","src":"12638:62:111"},"nodeType":"YulExpressionStatement","src":"12638:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12720:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12731:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12716:3:111"},"nodeType":"YulFunctionCall","src":"12716:18:111"},{"hexValue":"6163746976652070726f7879","kind":"string","nodeType":"YulLiteral","src":"12736:14:111","type":"","value":"active proxy"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12709:6:111"},"nodeType":"YulFunctionCall","src":"12709:42:111"},"nodeType":"YulExpressionStatement","src":"12709:42:111"},{"nodeType":"YulAssignment","src":"12760:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12783:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12768:3:111"},"nodeType":"YulFunctionCall","src":"12768:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12760:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12536:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12550:4:111","type":""}],"src":"12385:408:111"},{"body":{"nodeType":"YulBlock","src":"12943:168:111","statements":[{"nodeType":"YulAssignment","src":"12953:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12976:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12961:3:111"},"nodeType":"YulFunctionCall","src":"12961:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12953:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12995:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13010:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13018:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13006:3:111"},"nodeType":"YulFunctionCall","src":"13006:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12988:6:111"},"nodeType":"YulFunctionCall","src":"12988:74:111"},"nodeType":"YulExpressionStatement","src":"12988:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13082:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13093:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13078:3:111"},"nodeType":"YulFunctionCall","src":"13078:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"13098:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13071:6:111"},"nodeType":"YulFunctionCall","src":"13071:34:111"},"nodeType":"YulExpressionStatement","src":"13071:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12904:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12915:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12923:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12934:4:111","type":""}],"src":"12798:313:111"},{"body":{"nodeType":"YulBlock","src":"13290:246:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13318:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13300:6:111"},"nodeType":"YulFunctionCall","src":"13300:21:111"},"nodeType":"YulExpressionStatement","src":"13300:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13341:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13352:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13337:3:111"},"nodeType":"YulFunctionCall","src":"13337:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13357:2:111","type":"","value":"56"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13330:6:111"},"nodeType":"YulFunctionCall","src":"13330:30:111"},"nodeType":"YulExpressionStatement","src":"13330:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13380:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13391:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13376:3:111"},"nodeType":"YulFunctionCall","src":"13376:18:111"},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c","kind":"string","nodeType":"YulLiteral","src":"13396:34:111","type":"","value":"UUPSUpgradeable: must not be cal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13369:6:111"},"nodeType":"YulFunctionCall","src":"13369:62:111"},"nodeType":"YulExpressionStatement","src":"13369:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13462:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13447:3:111"},"nodeType":"YulFunctionCall","src":"13447:18:111"},{"hexValue":"6c6564207468726f7567682064656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"13467:26:111","type":"","value":"led through delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13440:6:111"},"nodeType":"YulFunctionCall","src":"13440:54:111"},"nodeType":"YulExpressionStatement","src":"13440:54:111"},{"nodeType":"YulAssignment","src":"13503:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13515:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13526:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13511:3:111"},"nodeType":"YulFunctionCall","src":"13511:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13503:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13267:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13281:4:111","type":""}],"src":"13116:420:111"},{"body":{"nodeType":"YulBlock","src":"13622:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"13668:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13677:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13680:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13670:6:111"},"nodeType":"YulFunctionCall","src":"13670:12:111"},"nodeType":"YulExpressionStatement","src":"13670:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13643:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"13652:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13639:3:111"},"nodeType":"YulFunctionCall","src":"13639:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"13664:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13635:3:111"},"nodeType":"YulFunctionCall","src":"13635:32:111"},"nodeType":"YulIf","src":"13632:52:111"},{"nodeType":"YulAssignment","src":"13693:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13709:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13703:5:111"},"nodeType":"YulFunctionCall","src":"13703:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13693:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13588:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13599:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13611:6:111","type":""}],"src":"13541:184:111"},{"body":{"nodeType":"YulBlock","src":"13904:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13932:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13914:6:111"},"nodeType":"YulFunctionCall","src":"13914:21:111"},"nodeType":"YulExpressionStatement","src":"13914:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13966:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13951:3:111"},"nodeType":"YulFunctionCall","src":"13951:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13971:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13944:6:111"},"nodeType":"YulFunctionCall","src":"13944:30:111"},"nodeType":"YulExpressionStatement","src":"13944:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14005:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13990:3:111"},"nodeType":"YulFunctionCall","src":"13990:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561","kind":"string","nodeType":"YulLiteral","src":"14010:34:111","type":"","value":"Initializable: contract is alrea"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13983:6:111"},"nodeType":"YulFunctionCall","src":"13983:62:111"},"nodeType":"YulExpressionStatement","src":"13983:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14076:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14061:3:111"},"nodeType":"YulFunctionCall","src":"14061:18:111"},{"hexValue":"647920696e697469616c697a6564","kind":"string","nodeType":"YulLiteral","src":"14081:16:111","type":"","value":"dy initialized"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14054:6:111"},"nodeType":"YulFunctionCall","src":"14054:44:111"},"nodeType":"YulExpressionStatement","src":"14054:44:111"},{"nodeType":"YulAssignment","src":"14107:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14119:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14130:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14115:3:111"},"nodeType":"YulFunctionCall","src":"14115:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14107:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13881:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13895:4:111","type":""}],"src":"13730:410:111"},{"body":{"nodeType":"YulBlock","src":"14252:87:111","statements":[{"nodeType":"YulAssignment","src":"14262:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14285:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14270:3:111"},"nodeType":"YulFunctionCall","src":"14270:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14262:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14304:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14319:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14327:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14315:3:111"},"nodeType":"YulFunctionCall","src":"14315:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14297:6:111"},"nodeType":"YulFunctionCall","src":"14297:36:111"},"nodeType":"YulExpressionStatement","src":"14297:36:111"}]},"name":"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14221:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14232:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14243:4:111","type":""}],"src":"14145:194:111"},{"body":{"nodeType":"YulBlock","src":"14481:225:111","statements":[{"nodeType":"YulAssignment","src":"14491:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14503:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14514:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14499:3:111"},"nodeType":"YulFunctionCall","src":"14499:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14491:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14533:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14556:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14544:3:111"},"nodeType":"YulFunctionCall","src":"14544:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14526:6:111"},"nodeType":"YulFunctionCall","src":"14526:74:111"},"nodeType":"YulExpressionStatement","src":"14526:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14620:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14631:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14616:3:111"},"nodeType":"YulFunctionCall","src":"14616:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"14640:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"14648:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14636:3:111"},"nodeType":"YulFunctionCall","src":"14636:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14609:6:111"},"nodeType":"YulFunctionCall","src":"14609:91:111"},"nodeType":"YulExpressionStatement","src":"14609:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14442:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14453:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14461:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14472:4:111","type":""}],"src":"14344:362:111"},{"body":{"nodeType":"YulBlock","src":"14885:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14902:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14913:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14895:6:111"},"nodeType":"YulFunctionCall","src":"14895:21:111"},"nodeType":"YulExpressionStatement","src":"14895:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14947:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14932:3:111"},"nodeType":"YulFunctionCall","src":"14932:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14952:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14925:6:111"},"nodeType":"YulFunctionCall","src":"14925:30:111"},"nodeType":"YulExpressionStatement","src":"14925:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14975:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14986:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14971:3:111"},"nodeType":"YulFunctionCall","src":"14971:18:111"},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"14991:34:111","type":"","value":"account: not Owner or EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14964:6:111"},"nodeType":"YulFunctionCall","src":"14964:62:111"},"nodeType":"YulExpressionStatement","src":"14964:62:111"},{"nodeType":"YulAssignment","src":"15035:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15047:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15058:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15043:3:111"},"nodeType":"YulFunctionCall","src":"15043:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15035:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14862:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14876:4:111","type":""}],"src":"14711:356:111"},{"body":{"nodeType":"YulBlock","src":"15125:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15135:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"15144:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"15139:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15204:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"15229:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"15234:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15225:3:111"},"nodeType":"YulFunctionCall","src":"15225:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"15248:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"15253:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15244:3:111"},"nodeType":"YulFunctionCall","src":"15244:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15238:5:111"},"nodeType":"YulFunctionCall","src":"15238:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15218:6:111"},"nodeType":"YulFunctionCall","src":"15218:39:111"},"nodeType":"YulExpressionStatement","src":"15218:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15165:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"15168:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"15162:2:111"},"nodeType":"YulFunctionCall","src":"15162:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"15176:19:111","statements":[{"nodeType":"YulAssignment","src":"15178:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15187:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"15190:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15183:3:111"},"nodeType":"YulFunctionCall","src":"15183:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"15178:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"15158:3:111","statements":[]},"src":"15154:113:111"},{"body":{"nodeType":"YulBlock","src":"15293:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"15306:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15311:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15302:3:111"},"nodeType":"YulFunctionCall","src":"15302:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"15320:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15295:6:111"},"nodeType":"YulFunctionCall","src":"15295:27:111"},"nodeType":"YulExpressionStatement","src":"15295:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"15282:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"15285:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"15279:2:111"},"nodeType":"YulFunctionCall","src":"15279:13:111"},"nodeType":"YulIf","src":"15276:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"15103:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"15108:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"15113:6:111","type":""}],"src":"15072:258:111"},{"body":{"nodeType":"YulBlock","src":"15472:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15482:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15502:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15496:5:111"},"nodeType":"YulFunctionCall","src":"15496:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15486:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15544:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15552:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15540:3:111"},"nodeType":"YulFunctionCall","src":"15540:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"15559:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15564:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"15518:21:111"},"nodeType":"YulFunctionCall","src":"15518:53:111"},"nodeType":"YulExpressionStatement","src":"15518:53:111"},{"nodeType":"YulAssignment","src":"15580:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15591:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15596:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15587:3:111"},"nodeType":"YulFunctionCall","src":"15587:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"15580:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"15448:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15453:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"15464:3:111","type":""}],"src":"15335:274:111"},{"body":{"nodeType":"YulBlock","src":"15695:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"15741:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15750:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15753:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15743:6:111"},"nodeType":"YulFunctionCall","src":"15743:12:111"},"nodeType":"YulExpressionStatement","src":"15743:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15716:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"15725:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15712:3:111"},"nodeType":"YulFunctionCall","src":"15712:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"15737:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15708:3:111"},"nodeType":"YulFunctionCall","src":"15708:32:111"},"nodeType":"YulIf","src":"15705:52:111"},{"nodeType":"YulAssignment","src":"15766:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15782:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15776:5:111"},"nodeType":"YulFunctionCall","src":"15776:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15766:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15661:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15672:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15684:6:111","type":""}],"src":"15614:184:111"},{"body":{"nodeType":"YulBlock","src":"15977:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15994:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16005:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15987:6:111"},"nodeType":"YulFunctionCall","src":"15987:21:111"},"nodeType":"YulExpressionStatement","src":"15987:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16028:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16039:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16024:3:111"},"nodeType":"YulFunctionCall","src":"16024:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16044:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16017:6:111"},"nodeType":"YulFunctionCall","src":"16017:30:111"},"nodeType":"YulExpressionStatement","src":"16017:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16067:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16078:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16063:3:111"},"nodeType":"YulFunctionCall","src":"16063:18:111"},{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"16083:34:111","type":"","value":"ERC1967Upgrade: new implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16056:6:111"},"nodeType":"YulFunctionCall","src":"16056:62:111"},"nodeType":"YulExpressionStatement","src":"16056:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16138:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16149:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16134:3:111"},"nodeType":"YulFunctionCall","src":"16134:18:111"},{"hexValue":"6f6e206973206e6f742055555053","kind":"string","nodeType":"YulLiteral","src":"16154:16:111","type":"","value":"on is not UUPS"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16127:6:111"},"nodeType":"YulFunctionCall","src":"16127:44:111"},"nodeType":"YulExpressionStatement","src":"16127:44:111"},{"nodeType":"YulAssignment","src":"16180:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16192:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16203:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16188:3:111"},"nodeType":"YulFunctionCall","src":"16188:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16180:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15954:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15968:4:111","type":""}],"src":"15803:410:111"},{"body":{"nodeType":"YulBlock","src":"16392:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16409:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16420:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16402:6:111"},"nodeType":"YulFunctionCall","src":"16402:21:111"},"nodeType":"YulExpressionStatement","src":"16402:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16443:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16454:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16439:3:111"},"nodeType":"YulFunctionCall","src":"16439:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16459:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16432:6:111"},"nodeType":"YulFunctionCall","src":"16432:30:111"},"nodeType":"YulExpressionStatement","src":"16432:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16482:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16493:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16478:3:111"},"nodeType":"YulFunctionCall","src":"16478:18:111"},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f78","kind":"string","nodeType":"YulLiteral","src":"16498:34:111","type":"","value":"ERC1967Upgrade: unsupported prox"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16471:6:111"},"nodeType":"YulFunctionCall","src":"16471:62:111"},"nodeType":"YulExpressionStatement","src":"16471:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16564:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16549:3:111"},"nodeType":"YulFunctionCall","src":"16549:18:111"},{"hexValue":"6961626c6555554944","kind":"string","nodeType":"YulLiteral","src":"16569:11:111","type":"","value":"iableUUID"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16542:6:111"},"nodeType":"YulFunctionCall","src":"16542:39:111"},"nodeType":"YulExpressionStatement","src":"16542:39:111"},{"nodeType":"YulAssignment","src":"16590:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16602:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16613:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16598:3:111"},"nodeType":"YulFunctionCall","src":"16598:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16590:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16369:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16383:4:111","type":""}],"src":"16218:405:111"},{"body":{"nodeType":"YulBlock","src":"16802:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16819:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16830:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16812:6:111"},"nodeType":"YulFunctionCall","src":"16812:21:111"},"nodeType":"YulExpressionStatement","src":"16812:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16853:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16864:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16849:3:111"},"nodeType":"YulFunctionCall","src":"16849:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16869:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16842:6:111"},"nodeType":"YulFunctionCall","src":"16842:30:111"},"nodeType":"YulExpressionStatement","src":"16842:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16892:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16903:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16888:3:111"},"nodeType":"YulFunctionCall","src":"16888:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"16908:30:111","type":"","value":"account: not from EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16881:6:111"},"nodeType":"YulFunctionCall","src":"16881:58:111"},"nodeType":"YulExpressionStatement","src":"16881:58:111"},{"nodeType":"YulAssignment","src":"16948:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16960:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16971:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16956:3:111"},"nodeType":"YulFunctionCall","src":"16956:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16948:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16779:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16793:4:111","type":""}],"src":"16628:352:111"},{"body":{"nodeType":"YulBlock","src":"17176:14:111","statements":[{"nodeType":"YulAssignment","src":"17178:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"17185:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"17178:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"17160:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"17168:3:111","type":""}],"src":"16985:205:111"},{"body":{"nodeType":"YulBlock","src":"17369:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17386:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17397:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17379:6:111"},"nodeType":"YulFunctionCall","src":"17379:21:111"},"nodeType":"YulExpressionStatement","src":"17379:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17420:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17431:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17416:3:111"},"nodeType":"YulFunctionCall","src":"17416:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17436:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17409:6:111"},"nodeType":"YulFunctionCall","src":"17409:30:111"},"nodeType":"YulExpressionStatement","src":"17409:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17459:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17470:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17455:3:111"},"nodeType":"YulFunctionCall","src":"17455:18:111"},{"hexValue":"6f6e6c79206f776e6572","kind":"string","nodeType":"YulLiteral","src":"17475:12:111","type":"","value":"only owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17448:6:111"},"nodeType":"YulFunctionCall","src":"17448:40:111"},"nodeType":"YulExpressionStatement","src":"17448:40:111"},{"nodeType":"YulAssignment","src":"17497:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17509:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17520:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17505:3:111"},"nodeType":"YulFunctionCall","src":"17505:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17497:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17346:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17360:4:111","type":""}],"src":"17195:334:111"},{"body":{"nodeType":"YulBlock","src":"17708:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17725:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17736:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17718:6:111"},"nodeType":"YulFunctionCall","src":"17718:21:111"},"nodeType":"YulExpressionStatement","src":"17718:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17770:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17755:3:111"},"nodeType":"YulFunctionCall","src":"17755:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17775:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17748:6:111"},"nodeType":"YulFunctionCall","src":"17748:30:111"},"nodeType":"YulExpressionStatement","src":"17748:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17809:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17794:3:111"},"nodeType":"YulFunctionCall","src":"17794:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"17814:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17787:6:111"},"nodeType":"YulFunctionCall","src":"17787:62:111"},"nodeType":"YulExpressionStatement","src":"17787:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17869:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17880:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17865:3:111"},"nodeType":"YulFunctionCall","src":"17865:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"17885:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17858:6:111"},"nodeType":"YulFunctionCall","src":"17858:43:111"},"nodeType":"YulExpressionStatement","src":"17858:43:111"},{"nodeType":"YulAssignment","src":"17910:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17922:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17933:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17918:3:111"},"nodeType":"YulFunctionCall","src":"17918:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17910:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17685:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17699:4:111","type":""}],"src":"17534:409:111"},{"body":{"nodeType":"YulBlock","src":"18122:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18139:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18150:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18132:6:111"},"nodeType":"YulFunctionCall","src":"18132:21:111"},"nodeType":"YulExpressionStatement","src":"18132:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18173:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18184:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18169:3:111"},"nodeType":"YulFunctionCall","src":"18169:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18189:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18162:6:111"},"nodeType":"YulFunctionCall","src":"18162:30:111"},"nodeType":"YulExpressionStatement","src":"18162:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18212:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18223:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18208:3:111"},"nodeType":"YulFunctionCall","src":"18208:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"18228:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18201:6:111"},"nodeType":"YulFunctionCall","src":"18201:59:111"},"nodeType":"YulExpressionStatement","src":"18201:59:111"},{"nodeType":"YulAssignment","src":"18269:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18281:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18292:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18277:3:111"},"nodeType":"YulFunctionCall","src":"18277:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18269:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18099:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18113:4:111","type":""}],"src":"17948:353:111"},{"body":{"nodeType":"YulBlock","src":"18427:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18444:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18455:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18437:6:111"},"nodeType":"YulFunctionCall","src":"18437:21:111"},"nodeType":"YulExpressionStatement","src":"18437:21:111"},{"nodeType":"YulVariableDeclaration","src":"18467:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"18487:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18481:5:111"},"nodeType":"YulFunctionCall","src":"18481:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"18471:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18525:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18510:3:111"},"nodeType":"YulFunctionCall","src":"18510:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"18530:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18503:6:111"},"nodeType":"YulFunctionCall","src":"18503:34:111"},"nodeType":"YulExpressionStatement","src":"18503:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"18572:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18580:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18568:3:111"},"nodeType":"YulFunctionCall","src":"18568:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18589:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18600:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18585:3:111"},"nodeType":"YulFunctionCall","src":"18585:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"18605:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"18546:21:111"},"nodeType":"YulFunctionCall","src":"18546:66:111"},"nodeType":"YulExpressionStatement","src":"18546:66:111"},{"nodeType":"YulAssignment","src":"18621:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18637:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"18656:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"18664:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18652:3:111"},"nodeType":"YulFunctionCall","src":"18652:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"18669:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18648:3:111"},"nodeType":"YulFunctionCall","src":"18648:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18633:3:111"},"nodeType":"YulFunctionCall","src":"18633:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"18739:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18629:3:111"},"nodeType":"YulFunctionCall","src":"18629:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18621:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18396:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18407:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18418:4:111","type":""}],"src":"18306:442:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_address_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value1 := memPtr\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong array lengths\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"active proxy\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 56)\n mstore(add(headStart, 64), \"UUPSUpgradeable: must not be cal\")\n mstore(add(headStart, 96), \"led through delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"Initializable: contract is alrea\")\n mstore(add(headStart, 96), \"dy initialized\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"account: not Owner or EntryPoint\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"ERC1967Upgrade: new implementati\")\n mstore(add(headStart, 96), \"on is not UUPS\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"ERC1967Upgrade: unsupported prox\")\n mstore(add(headStart, 96), \"iableUUID\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"only owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"3559":[{"length":32,"start":1696},{"length":32,"start":1846},{"length":32,"start":2612},{"length":32,"start":2762},{"length":32,"start":3065}],"13841":[{"length":32,"start":894},{"length":32,"start":2249},{"length":32,"start":2416},{"length":32,"start":3398},{"length":32,"start":3966},{"length":32,"start":4037},{"length":32,"start":4809},{"length":32,"start":5230}],"19337":[{"length":32,"start":599},{"length":32,"start":2182}]},"linkReferences":{},"object":"6080604052600436106101475760003560e01c80634f1ef286116100c0578063bc197c8111610074578063c4d66de811610059578063c4d66de81461041f578063d087d2881461043f578063f23a6e611461045457600080fd5b8063bc197c81146103c2578063c399ec881461040a57600080fd5b80638da5cb5b116100a55780638da5cb5b1461033c578063b0d691fe1461036f578063b61d27f6146103a257600080fd5b80634f1ef2861461031457806352d1902d1461032757600080fd5b8063245a7bfc116101175780633a871cdd116100fc5780633a871cdd146102be5780634a58db19146102ec5780634d44560d146102f457600080fd5b8063245a7bfc146102455780633659cfe61461029e57600080fd5b806223de291461015357806301ffc9a71461017a578063150b7a02146101af57806318dfb3c71461022557600080fd5b3661014e57005b600080fd5b34801561015f57600080fd5b5061017861016e3660046117e1565b5050505050505050565b005b34801561018657600080fd5b5061019a610195366004611892565b61049a565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101f46101ca3660046118d4565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101a6565b34801561023157600080fd5b5061017861024036600461198c565b61057f565b34801561025157600080fd5b506102797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102aa57600080fd5b506101786102b93660046119f8565b610689565b3480156102ca57600080fd5b506102de6102d9366004611a15565b61085a565b6040519081526020016101a6565b6101786108c7565b34801561030057600080fd5b5061017861030f366004611a69565b610966565b610178610322366004611ac4565b610a1d565b34801561033357600080fd5b506102de610bdf565b34801561034857600080fd5b506000546102799062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561037b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610279565b3480156103ae57600080fd5b506101786103bd366004611ba6565b610cb1565b3480156103ce57600080fd5b506101f46103dd366004611bf6565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561041657600080fd5b506102de610d00565b34801561042b57600080fd5b5061017861043a3660046119f8565b610db7565b34801561044b57600080fd5b506102de610f31565b34801561046057600080fd5b506101f461046f366004611c94565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061052d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061057957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610587610fad565b8281146105db5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610682576106708585838181106105fb576105fb611d10565b905060200201602081019061061091906119f8565b600085858581811061062457610624611d10565b90506020028101906106369190611d3f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b8061067a81611da4565b9150506105de565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107345760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166107a97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b61083b816110d9565b60408051600080825260208201909252610857918391906110e1565b50565b60006108646112b1565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201526108c082611336565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561095257600080fd5b505af1158015610682573d6000803e3d6000fd5b61096e6113a1565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a0157600080fd5b505af1158015610a15573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610ac85760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b3d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b610bcf826110d9565b610bdb828260016110e1565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c8c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105d2565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cb9610fad565b610cfa848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611e03565b905090565b600054610100900460ff1615808015610dd75750600054600160ff909116105b80610df15750303b158015610df1575060005460ff166001145b610e635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d2565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ec157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610ecb6000611418565b8015610bdb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610d71565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061100e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61105a5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e7460448201526064016105d2565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516110859190611e48565b60006040518083038185875af1925050503d80600081146110c2576040519150601f19603f3d011682016040523d82523d6000602084013e6110c7565b606091505b50915091508161068257805160208201fd5b6108576113a1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561111957611114836114b7565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561119e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261119b91810190611e03565b60015b6112105760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146112a55760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016105d2565b506111148383836115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461105a5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105d2565b80156108575760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610682565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806113cc57503330145b61105a5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e65720000000000000000000000000000000000000000000060448201526064016105d2565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115415760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115b0836115cc565b6000825111806115bd5750805b1561111457610cfa8383611619565b6115d5816114b7565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606108c08383604051806060016040528060278152602001611eb66027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516116639190611e48565b600060405180830381855af49150503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b50915091506116b4868383876116be565b9695505050505050565b6060831561173a5782516000036117335773ffffffffffffffffffffffffffffffffffffffff85163b6117335760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105d2565b5081611744565b611744838361174c565b949350505050565b81511561175c5781518083602001fd5b8060405162461bcd60e51b81526004016105d29190611e64565b73ffffffffffffffffffffffffffffffffffffffff8116811461085757600080fd5b60008083601f8401126117aa57600080fd5b50813567ffffffffffffffff8111156117c257600080fd5b6020830191508360208285010111156117da57600080fd5b9250929050565b60008060008060008060008060c0898b0312156117fd57600080fd5b883561180881611776565b9750602089013561181881611776565b9650604089013561182881611776565b955060608901359450608089013567ffffffffffffffff8082111561184c57600080fd5b6118588c838d01611798565b909650945060a08b013591508082111561187157600080fd5b5061187e8b828c01611798565b999c989b5096995094979396929594505050565b6000602082840312156118a457600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c057600080fd5b6000806000806000608086880312156118ec57600080fd5b85356118f781611776565b9450602086013561190781611776565b935060408601359250606086013567ffffffffffffffff81111561192a57600080fd5b61193688828901611798565b969995985093965092949392505050565b60008083601f84011261195957600080fd5b50813567ffffffffffffffff81111561197157600080fd5b6020830191508360208260051b85010111156117da57600080fd5b600080600080604085870312156119a257600080fd5b843567ffffffffffffffff808211156119ba57600080fd5b6119c688838901611947565b909650945060208701359150808211156119df57600080fd5b506119ec87828801611947565b95989497509550505050565b600060208284031215611a0a57600080fd5b81356108c081611776565b600080600060608486031215611a2a57600080fd5b833567ffffffffffffffff811115611a4157600080fd5b84016101608187031215611a5457600080fd5b95602085013595506040909401359392505050565b60008060408385031215611a7c57600080fd5b8235611a8781611776565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611ad757600080fd5b8235611ae281611776565b9150602083013567ffffffffffffffff80821115611aff57600080fd5b818501915085601f830112611b1357600080fd5b813581811115611b2557611b25611a95565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b6b57611b6b611a95565b81604052828152886020848701011115611b8457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611bbc57600080fd5b8435611bc781611776565b935060208501359250604085013567ffffffffffffffff811115611bea57600080fd5b6119ec87828801611798565b60008060008060008060008060a0898b031215611c1257600080fd5b8835611c1d81611776565b97506020890135611c2d81611776565b9650604089013567ffffffffffffffff80821115611c4a57600080fd5b611c568c838d01611947565b909850965060608b0135915080821115611c6f57600080fd5b611c7b8c838d01611947565b909650945060808b013591508082111561187157600080fd5b60008060008060008060a08789031215611cad57600080fd5b8635611cb881611776565b95506020870135611cc881611776565b94506040870135935060608701359250608087013567ffffffffffffffff811115611cf257600080fd5b611cfe89828a01611798565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611d7457600080fd5b83018035915067ffffffffffffffff821115611d8f57600080fd5b6020019150368190038213156117da57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215611e1557600080fd5b5051919050565b60005b83811015611e37578181015183820152602001611e1f565b83811115610cfa5750506000910152565b60008251611e5a818460208701611e1c565b9190910192915050565b6020815260008251806020840152611e83816040850160208701611e1c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ff89eab92b0c1f277887ddb99b41e2b60ae6b8d4745a41fd8cd00a3a53f8650664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x147 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F1EF286 GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x43F JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x314 JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x3A871CDD GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x2EC JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x2F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x17A JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x225 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x14E JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x17E1 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19A PUSH2 0x195 CALLDATASIZE PUSH1 0x4 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x49A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x1CA CALLDATASIZE PUSH1 0x4 PUSH2 0x18D4 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x231 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x240 CALLDATASIZE PUSH1 0x4 PUSH2 0x198C JUMP JUMPDEST PUSH2 0x57F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x279 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x2B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0x689 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0x2D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A15 JUMP JUMPDEST PUSH2 0x85A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x8C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x30F CALLDATASIZE PUSH1 0x4 PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x966 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AC4 JUMP JUMPDEST PUSH2 0xA1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xBDF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x279 SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x279 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x3BD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xCB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x3DD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BF6 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xD00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x43A CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0xDB7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xF31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x460 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x46F CALLDATASIZE PUSH1 0x4 PUSH2 0x1C94 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x52D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x579 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x587 PUSH2 0xFAD JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x5DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH2 0x670 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5FB JUMPI PUSH2 0x5FB PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x610 SWAP2 SWAP1 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x624 JUMPI PUSH2 0x624 PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x636 SWAP2 SWAP1 PUSH2 0x1D3F JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x67A DUP2 PUSH2 0x1DA4 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5DE JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x734 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x7A9 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x832 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x83B DUP2 PUSH2 0x10D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x857 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x10E1 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x864 PUSH2 0x12B1 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x8C0 DUP3 PUSH2 0x1336 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x952 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x682 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x96E PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA15 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xAC8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB3D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0xBCF DUP3 PUSH2 0x10D9 JUMP JUMPDEST PUSH2 0xBDB DUP3 DUP3 PUSH1 0x1 PUSH2 0x10E1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xC8C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xCB9 PUSH2 0xFAD JUMP JUMPDEST PUSH2 0xCFA DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD8E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDB2 SWAP2 SWAP1 PUSH2 0x1E03 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xDD7 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xDF1 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDF1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xE63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xECB PUSH1 0x0 PUSH2 0x1418 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xBDB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xD71 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x100E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1085 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x10C2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x10C7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x682 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x857 PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1119 JUMPI PUSH2 0x1114 DUP4 PUSH2 0x14B7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x119E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x119B SWAP2 DUP2 ADD SWAP1 PUSH2 0x1E03 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1210 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x12A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH2 0x1114 DUP4 DUP4 DUP4 PUSH2 0x15A7 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x857 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x682 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x682 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x13CC JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1541 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15B0 DUP4 PUSH2 0x15CC JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x15BD JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1114 JUMPI PUSH2 0xCFA DUP4 DUP4 PUSH2 0x1619 JUMP JUMPDEST PUSH2 0x15D5 DUP2 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EB6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1663 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x169E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16A3 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16B4 DUP7 DUP4 DUP4 DUP8 PUSH2 0x16BE JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x173A JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1733 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST POP DUP2 PUSH2 0x1744 JUMP JUMPDEST PUSH2 0x1744 DUP4 DUP4 PUSH2 0x174C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x175C JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5D2 SWAP2 SWAP1 PUSH2 0x1E64 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x17AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x17FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1808 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1818 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1828 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x184C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1858 DUP13 DUP4 DUP14 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187E DUP12 DUP3 DUP13 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x18A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x8C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x18EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x18F7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1907 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x192A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1936 DUP9 DUP3 DUP10 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1971 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19C6 DUP9 DUP4 DUP10 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x19DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x8C0 DUP2 PUSH2 0x1776 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1A2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1A54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1A87 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1AE2 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1AFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B25 JUMPI PUSH2 0x1B25 PUSH2 0x1A95 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B6B JUMPI PUSH2 0x1B6B PUSH2 0x1A95 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1BBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1BC7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1C1D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1C2D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1C4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C56 DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C7B DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1CAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1CB8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1CC8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFE DUP10 DUP3 DUP11 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1DFC JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1E37 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1E1F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCFA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1E5A DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1E83 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FF89EA 0xB9 0x2B 0xC 0x1F 0x27 PUSH25 0x87DDB99B41E2B60AE6B8D4745A41FD8CD00A3A53F865066473 PUSH16 0x6C634300080F00330000000000000000 ","sourceMap":"333:808:92:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176:86;;;;;;;;;;-1:-1:-1;581:176:86;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;;;;;-1:-1:-1;1489:298:86;;;;;:::i;:::-;;:::i;:::-;;;2237:14:111;;2230:22;2212:41;;2200:2;2185:18;1489:298:86;;;;;;;;763:212;;;;;;;;;;-1:-1:-1;763:212:86;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;3197:66:111;3185:79;;;3167:98;;3155:2;3140:18;763:212:86;3023:248:111;1902:297:73;;;;;;;;;;-1:-1:-1;1902:297:73;;;;;:::i;:::-;;:::i;387:35:92:-;;;;;;;;;;;;;;;;;;4613:42:111;4601:55;;;4583:74;;4571:2;4556:18;387:35:92;4437:226:111;3073:197:32;;;;;;;;;;-1:-1:-1;3073:197:32;;;;;:::i;:::-;;:::i;1458:353:51:-;;;;;;;;;;-1:-1:-1;1458:353:51;;;;;:::i;:::-;;:::i;:::-;;;5601:25:111;;;5589:2;5574:18;1458:353:51;5455:177:111;3926:110:73;;;:::i;4188:158::-;;;;;;;;;;-1:-1:-1;4188:158:73;;;;;:::i;:::-;;:::i;3519:222:32:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;765:20:73:-;;;;;;;;;;-1:-1:-1;765:20:73;;;;;;;;;;;1031:108;;;;;;;;;;-1:-1:-1;1121:11:73;1031:108;;1680:158;;;;;;;;;;-1:-1:-1;1680:158:73;;;;;:::i;:::-;;:::i;1219:264:86:-;;;;;;;;;;-1:-1:-1;1219:264:86;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;3730:113:73;;;;;;;;;;;;;:::i;776:111:92:-;;;;;;;;;;-1:-1:-1;776:111:92;;;;;:::i;:::-;;:::i;935:121:51:-;;;;;;;;;;;;;:::i;981:232:86:-;;;;;;;;;;-1:-1:-1;981:232:86;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;1902:297:73:-;1991:31;:29;:31::i;:::-;2040:26;;;2032:58;;;;-1:-1:-1;;;2032:58:73;;10698:2:111;2032:58:73;;;10680:21:111;10737:2;10717:18;;;10710:30;10776:21;10756:18;;;10749:49;10815:18;;2032:58:73;;;;;;;;;2105:9;2100:93;2120:15;;;2100:93;;;2156:26;2162:4;;2167:1;2162:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2171:1;2174:4;;2179:1;2174:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2156:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2156:5:73;;-1:-1:-1;;;2156:26:73:i;:::-;2137:3;;;;:::i;:::-;;;;2100:93;;;;1902:297;;;;:::o;3073:197:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12174:2:111;1629:80:32;;;12156:21:111;12213:2;12193:18;;;12186:30;12252:34;12232:18;;;12225:62;12323:14;12303:18;;;12296:42;12355:19;;1629:80:32;11972:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;12587:2:111;1719:87:32;;;12569:21:111;12626:2;12606:18;;;12599:30;12665:34;12645:18;;;12638:62;12736:14;12716:18;;;12709:42;12768:19;;1719:87:32;12385:408:111;1719:87:32;3156:36:::1;3174:17;3156;:36::i;:::-;3243:12;::::0;;3253:1:::1;3243:12:::0;;;::::1;::::0;::::1;::::0;;;3202:61:::1;::::0;3224:17;;3243:12;3202:21:::1;:61::i;:::-;3073:197:::0;:::o;1458:353:51:-;1601:22;1635:24;:22;:24::i;:::-;-1:-1:-1;1099:32:92;;;;;;;;;1114:10;1099:32;;;;-1:-1:-1;1099:32:92;;;;;;;;;;;1772::51;1784:19;1772:11;:32::i;:::-;1458:353;;;;;:::o;3926:110:73:-;1121:11;3973:56;;;;;4023:4;3973:56;;;4583:74:111;3973:22:73;;;;;;;;4004:9;;4556:18:111;;3973:56:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:158;963:12;:10;:12::i;:::-;1121:11;4291:48:::1;::::0;;;;:23:::1;13006:55:111::0;;;4291:48:73::1;::::0;::::1;12988:74:111::0;13078:18;;;13071:34;;;4291:23:73;;;::::1;::::0;::::1;::::0;12961:18:111;;4291:48:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4188:158:::0;;:::o;3519:222:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12174:2:111;1629:80:32;;;12156:21:111;12213:2;12193:18;;;12186:30;12252:34;12232:18;;;12225:62;12323:14;12303:18;;;12296:42;12355:19;;1629:80:32;11972:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;12587:2:111;1719:87:32;;;12569:21:111;12626:2;12606:18;;;12599:30;12665:34;12645:18;;;12638:62;12736:14;12716:18;;;12709:42;12768:19;;1719:87:32;12385:408:111;1719:87:32;3636:36:::1;3654:17;3636;:36::i;:::-;3682:52;3704:17;3723:4;3729;3682:21;:52::i;:::-;3519:222:::0;;:::o;2762:131::-;2840:7;2080:4;2072:23;2089:6;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:32;;13318:2:111;2064:92:32;;;13300:21:111;13357:2;13337:18;;;13330:30;13396:34;13376:18;;;13369:62;13467:26;13447:18;;;13440:54;13511:19;;2064:92:32;13116:420:111;2064:92:32;-1:-1:-1;1030:66:28::1;2762:131:32::0;:::o;1680:158:73:-;1766:31;:29;:31::i;:::-;1807:24;1813:4;1819:5;1826:4;;1807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1807:5:73;;-1:-1:-1;;;1807:24:73:i;:::-;1680:158;;;;:::o;3730:113::-;3799:37;;;;;3830:4;3799:37;;;4583:74:111;3773:7:73;;3799:22;1121:11;3799:22;;;;4556:18:111;;3799:37:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3792:44;;3730:113;:::o;776:111:92:-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;13932:2:111;3303:190:31;;;13914:21:111;13971:2;13951:18;;;13944:30;14010:34;13990:18;;;13983:62;14081:16;14061:18;;;14054:44;14115:19;;3303:190:31;13730:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;851:29:92::1;877:1;851:17;:29::i;:::-;3618:14:31::0;3614:99;;;3664:5;3648:21;;;;;;3688:14;;-1:-1:-1;14297:36:111;;3688:14:31;;14285:2:111;14270:18;3688:14:31;;;;;;;3247:472;776:111:92;:::o;935:121:51:-;1010:39;;;;;1040:4;1010:39;;;14526:74:111;984:7:51;14616:18:111;;;14609:91;;;984:7:51;1010:21;1121:11:73;1010:21:51;;;;14499:18:111;;1010:39:51;14344:362:111;2808:175:73;2881:10;:35;1121:11;2881:35;;;:58;;-1:-1:-1;2934:5:73;;;;;;;2920:10;:19;2881:58;2873:103;;;;-1:-1:-1;;;2873:103:73;;14913:2:111;2873:103:73;;;14895:21:111;;;14932:18;;;14925:30;14991:34;14971:18;;;14964:62;15043:18;;2873:103:73;14711:356:111;2873:103:73;2808:175::o;3366:287::-;3451:12;3465:19;3488:6;:11;;3508:5;3515:4;3488:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3450:70;;;;3535:7;3530:117;;3615:6;3609:13;3604:2;3596:6;3592:15;3585:38;4352:135;4468:12;:10;:12::i;2650:952:28:-;689:66;3096:48;;;3092:504;;;3160:37;3179:17;3160:18;:37::i;:::-;2650:952;;;:::o;3092:504::-;3250:17;3232:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3232:52:28;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3228:291;;3448:56;;-1:-1:-1;;;3448:56:28;;16005:2:111;3448:56:28;;;15987:21:111;16044:2;16024:18;;;16017:30;16083:34;16063:18;;;16056:62;16154:16;16134:18;;;16127:44;16188:19;;3448:56:28;15803:410:111;3228:291:28;1030:66;3334:28;;3326:82;;;;-1:-1:-1;;;3326:82:28;;16420:2:111;3326:82:28;;;16402:21:111;16459:2;16439:18;;;16432:30;16498:34;16478:18;;;16471:62;16569:11;16549:18;;;16542:39;16598:19;;3326:82:28;16218:405:111;3326:82:28;3285:138;3532:53;3550:17;3569:4;3575:9;3532:17;:53::i;1892:149:51:-;1966:10;:35;1121:11:73;1966:35:51;;1958:76;;;;-1:-1:-1;;;1958:76:51;;16830:2:111;1958:76:51;;;16812:21:111;16869:2;16849:18;;;16842:30;16908;16888:18;;;16881:58;16956:18;;1958:76:51;16628:352:111;4316:337:51;4397:24;;4393:254;;4455:82;;4438:12;;4463:10;;4515:17;;4488:19;;4438:12;4455:82;4438:12;4455:82;4488:19;4463:10;4515:17;4455:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:233:73;1524:5;;;;;;;1510:10;:19;;:50;;-1:-1:-1;1533:10:73;1555:4;1533:27;1510:50;1502:73;;;;-1:-1:-1;;;1502:73:73;;17397:2:111;1502:73:73;;;17379:21:111;17436:2;17416:18;;;17409:30;17475:12;17455:18;;;17448:40;17505:18;;1502:73:73;17195:334:111;2590:146:73;2655:5;:15;;;;;;;;;;;;;;;;;;2685:44;;2723:5;;;;;;2710:11;2685:44;;;;;;;2590:146;:::o;1532:259:28:-;1465:19:42;;;;1605:95:28;;;;-1:-1:-1;;;1605:95:28;;17736:2:111;1605:95:28;;;17718:21:111;17775:2;17755:18;;;17748:30;17814:34;17794:18;;;17787:62;17885:15;17865:18;;;17858:43;17918:19;;1605:95:28;17534:409:111;1605:95:28;1030:66;1710:74;;;;;;;;;;;;;;;1532:259::o;2183:295::-;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;:53::i;1897:152::-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;;;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;18150:2:111;7908:60:42;;;18132:21:111;18189:2;18169:18;;;18162:30;18228:31;18208:18;;;18201:59;18277:18;;7908:60:42;17948:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:154:111:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:347;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:111;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;455:59;173:347;;;;;:::o;525:1205::-;651:6;659;667;675;683;691;699;707;760:3;748:9;739:7;735:23;731:33;728:53;;;777:1;774;767:12;728:53;816:9;803:23;835:31;860:5;835:31;:::i;:::-;885:5;-1:-1:-1;942:2:111;927:18;;914:32;955:33;914:32;955:33;:::i;:::-;1007:7;-1:-1:-1;1066:2:111;1051:18;;1038:32;1079:33;1038:32;1079:33;:::i;:::-;1131:7;-1:-1:-1;1185:2:111;1170:18;;1157:32;;-1:-1:-1;1240:3:111;1225:19;;1212:33;1264:18;1294:14;;;1291:34;;;1321:1;1318;1311:12;1291:34;1360:58;1410:7;1401:6;1390:9;1386:22;1360:58;:::i;:::-;1437:8;;-1:-1:-1;1334:84:111;-1:-1:-1;1525:3:111;1510:19;;1497:33;;-1:-1:-1;1542:16:111;;;1539:36;;;1571:1;1568;1561:12;1539:36;;1610:60;1662:7;1651:8;1640:9;1636:24;1610:60;:::i;:::-;525:1205;;;;-1:-1:-1;525:1205:111;;-1:-1:-1;525:1205:111;;;;;;1689:8;-1:-1:-1;;;525:1205:111:o;1735:332::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;1901:9;1888:23;1951:66;1944:5;1940:78;1933:5;1930:89;1920:117;;2033:1;2030;2023:12;2264:754;2361:6;2369;2377;2385;2393;2446:3;2434:9;2425:7;2421:23;2417:33;2414:53;;;2463:1;2460;2453:12;2414:53;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:111;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2693:7;-1:-1:-1;2747:2:111;2732:18;;2719:32;;-1:-1:-1;2802:2:111;2787:18;;2774:32;2829:18;2818:30;;2815:50;;;2861:1;2858;2851:12;2815:50;2900:58;2950:7;2941:6;2930:9;2926:22;2900:58;:::i;:::-;2264:754;;;;-1:-1:-1;2264:754:111;;-1:-1:-1;2977:8:111;;2874:84;2264:754;-1:-1:-1;;;2264:754:111:o;3276:367::-;3339:8;3349:6;3403:3;3396:4;3388:6;3384:17;3380:27;3370:55;;3421:1;3418;3411:12;3370:55;-1:-1:-1;3444:20:111;;3487:18;3476:30;;3473:50;;;3519:1;3516;3509:12;3473:50;3556:4;3548:6;3544:17;3532:29;;3616:3;3609:4;3599:6;3596:1;3592:14;3584:6;3580:27;3576:38;3573:47;3570:67;;;3633:1;3630;3623:12;3648:784;3781:6;3789;3797;3805;3858:2;3846:9;3837:7;3833:23;3829:32;3826:52;;;3874:1;3871;3864:12;3826:52;3914:9;3901:23;3943:18;3984:2;3976:6;3973:14;3970:34;;;4000:1;3997;3990:12;3970:34;4039:70;4101:7;4092:6;4081:9;4077:22;4039:70;:::i;:::-;4128:8;;-1:-1:-1;4013:96:111;-1:-1:-1;4216:2:111;4201:18;;4188:32;;-1:-1:-1;4232:16:111;;;4229:36;;;4261:1;4258;4251:12;4229:36;;4300:72;4364:7;4353:8;4342:9;4338:24;4300:72;:::i;:::-;3648:784;;;;-1:-1:-1;4391:8:111;-1:-1:-1;;;;3648:784:111:o;4668:247::-;4727:6;4780:2;4768:9;4759:7;4755:23;4751:32;4748:52;;;4796:1;4793;4786:12;4748:52;4835:9;4822:23;4854:31;4879:5;4854:31;:::i;4920:530::-;5031:6;5039;5047;5100:2;5088:9;5079:7;5075:23;5071:32;5068:52;;;5116:1;5113;5106:12;5068:52;5156:9;5143:23;5189:18;5181:6;5178:30;5175:50;;;5221:1;5218;5211:12;5175:50;5244:22;;5300:3;5282:16;;;5278:26;5275:46;;;5317:1;5314;5307:12;5275:46;5340:2;5389;5374:18;;5361:32;;-1:-1:-1;5440:2:111;5425:18;;;5412:32;;4920:530;-1:-1:-1;;;4920:530:111:o;5637:323::-;5713:6;5721;5774:2;5762:9;5753:7;5749:23;5745:32;5742:52;;;5790:1;5787;5780:12;5742:52;5829:9;5816:23;5848:31;5873:5;5848:31;:::i;:::-;5898:5;5950:2;5935:18;;;;5922:32;;-1:-1:-1;;;5637:323:111:o;5965:184::-;6017:77;6014:1;6007:88;6114:4;6111:1;6104:15;6138:4;6135:1;6128:15;6154:1115;6231:6;6239;6292:2;6280:9;6271:7;6267:23;6263:32;6260:52;;;6308:1;6305;6298:12;6260:52;6347:9;6334:23;6366:31;6391:5;6366:31;:::i;:::-;6416:5;-1:-1:-1;6472:2:111;6457:18;;6444:32;6495:18;6525:14;;;6522:34;;;6552:1;6549;6542:12;6522:34;6590:6;6579:9;6575:22;6565:32;;6635:7;6628:4;6624:2;6620:13;6616:27;6606:55;;6657:1;6654;6647:12;6606:55;6693:2;6680:16;6715:2;6711;6708:10;6705:36;;;6721:18;;:::i;:::-;6855:2;6849:9;6917:4;6909:13;;6760:66;6905:22;;;6929:2;6901:31;6897:40;6885:53;;;6953:18;;;6973:22;;;6950:46;6947:72;;;6999:18;;:::i;:::-;7039:10;7035:2;7028:22;7074:2;7066:6;7059:18;7114:7;7109:2;7104;7100;7096:11;7092:20;7089:33;7086:53;;;7135:1;7132;7125:12;7086:53;7191:2;7186;7182;7178:11;7173:2;7165:6;7161:15;7148:46;7236:1;7231:2;7226;7218:6;7214:15;7210:24;7203:35;7257:6;7247:16;;;;;;;6154:1115;;;;;:::o;7708:612::-;7796:6;7804;7812;7820;7873:2;7861:9;7852:7;7848:23;7844:32;7841:52;;;7889:1;7886;7879:12;7841:52;7928:9;7915:23;7947:31;7972:5;7947:31;:::i;:::-;7997:5;-1:-1:-1;8049:2:111;8034:18;;8021:32;;-1:-1:-1;8104:2:111;8089:18;;8076:32;8131:18;8120:30;;8117:50;;;8163:1;8160;8153:12;8117:50;8202:58;8252:7;8243:6;8232:9;8228:22;8202:58;:::i;8325:1338::-;8485:6;8493;8501;8509;8517;8525;8533;8541;8594:3;8582:9;8573:7;8569:23;8565:33;8562:53;;;8611:1;8608;8601:12;8562:53;8650:9;8637:23;8669:31;8694:5;8669:31;:::i;:::-;8719:5;-1:-1:-1;8776:2:111;8761:18;;8748:32;8789:33;8748:32;8789:33;:::i;:::-;8841:7;-1:-1:-1;8899:2:111;8884:18;;8871:32;8922:18;8952:14;;;8949:34;;;8979:1;8976;8969:12;8949:34;9018:70;9080:7;9071:6;9060:9;9056:22;9018:70;:::i;:::-;9107:8;;-1:-1:-1;8992:96:111;-1:-1:-1;9195:2:111;9180:18;;9167:32;;-1:-1:-1;9211:16:111;;;9208:36;;;9240:1;9237;9230:12;9208:36;9279:72;9343:7;9332:8;9321:9;9317:24;9279:72;:::i;:::-;9370:8;;-1:-1:-1;9253:98:111;-1:-1:-1;9458:3:111;9443:19;;9430:33;;-1:-1:-1;9475:16:111;;;9472:36;;;9504:1;9501;9494:12;9668:823;9774:6;9782;9790;9798;9806;9814;9867:3;9855:9;9846:7;9842:23;9838:33;9835:53;;;9884:1;9881;9874:12;9835:53;9923:9;9910:23;9942:31;9967:5;9942:31;:::i;:::-;9992:5;-1:-1:-1;10049:2:111;10034:18;;10021:32;10062:33;10021:32;10062:33;:::i;:::-;10114:7;-1:-1:-1;10168:2:111;10153:18;;10140:32;;-1:-1:-1;10219:2:111;10204:18;;10191:32;;-1:-1:-1;10274:3:111;10259:19;;10246:33;10302:18;10291:30;;10288:50;;;10334:1;10331;10324:12;10288:50;10373:58;10423:7;10414:6;10403:9;10399:22;10373:58;:::i;:::-;9668:823;;;;-1:-1:-1;9668:823:111;;-1:-1:-1;9668:823:111;;10450:8;;9668:823;-1:-1:-1;;;9668:823:111:o;10844:184::-;10896:77;10893:1;10886:88;10993:4;10990:1;10983:15;11017:4;11014:1;11007:15;11033:580;11110:4;11116:6;11176:11;11163:25;11266:66;11255:8;11239:14;11235:29;11231:102;11211:18;11207:127;11197:155;;11348:1;11345;11338:12;11197:155;11375:33;;11427:20;;;-1:-1:-1;11470:18:111;11459:30;;11456:50;;;11502:1;11499;11492:12;11456:50;11535:4;11523:17;;-1:-1:-1;11566:14:111;11562:27;;;11552:38;;11549:58;;;11603:1;11600;11593:12;11618:349;11657:3;11688:66;11681:5;11678:77;11675:257;;11788:77;11785:1;11778:88;11889:4;11886:1;11879:15;11917:4;11914:1;11907:15;11675:257;-1:-1:-1;11959:1:111;11948:13;;11618:349::o;13541:184::-;13611:6;13664:2;13652:9;13643:7;13639:23;13635:32;13632:52;;;13680:1;13677;13670:12;13632:52;-1:-1:-1;13703:16:111;;13541:184;-1:-1:-1;13541:184:111:o;15072:258::-;15144:1;15154:113;15168:6;15165:1;15162:13;15154:113;;;15244:11;;;15238:18;15225:11;;;15218:39;15190:2;15183:10;15154:113;;;15285:6;15282:1;15279:13;15276:48;;;-1:-1:-1;;15320:1:111;15302:16;;15295:27;15072:258::o;15335:274::-;15464:3;15502:6;15496:13;15518:53;15564:6;15559:3;15552:4;15544:6;15540:17;15518:53;:::i;:::-;15587:16;;;;;15335:274;-1:-1:-1;;15335:274:111:o;18306:442::-;18455:2;18444:9;18437:21;18418:4;18487:6;18481:13;18530:6;18525:2;18514:9;18510:18;18503:34;18546:66;18605:6;18600:2;18589:9;18585:18;18580:2;18572:6;18568:15;18546:66;:::i;:::-;18664:2;18652:15;18669:66;18648:88;18633:104;;;;18739:2;18629:113;;18306:442;-1:-1:-1;;18306:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"1590800","executionCost":"infinite","totalCost":"infinite"},"external":{"addDeposit()":"infinite","aggregator()":"infinite","entryPoint()":"infinite","execute(address,uint256,bytes)":"infinite","executeBatch(address[],bytes[])":"infinite","getDeposit()":"infinite","getNonce()":"infinite","initialize(address)":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2369","proxiableUUID()":"infinite","supportsInterface(bytes4)":"449","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","upgradeTo(address)":"infinite","upgradeToAndCall(address,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawDepositTo(address,uint256)":"infinite"},"internal":{"_validateSignature(struct UserOperation calldata,bytes32)":"infinite"}},"methodIdentifiers":{"addDeposit()":"4a58db19","aggregator()":"245a7bfc","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"anAggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"aggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"test aggregated-signature account. works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum a true aggregated account should expose data (e.g. its public key) to the aggregator.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestAggregatedAccount.sol\":\"TestAggregatedAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/TestAggregatedAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\n\\n/**\\n * test aggregated-signature account.\\n * works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum\\n * a true aggregated account should expose data (e.g. its public key) to the aggregator.\\n */\\ncontract TestAggregatedAccount is SimpleAccount {\\n address public immutable aggregator;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n /// @inheritdoc SimpleAccount\\n function initialize(address) public virtual override initializer {\\n super._initialize(address(0));\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n (userOp, userOpHash);\\n return _packValidationData(ValidationData(aggregator, 0, 0));\\n }\\n}\\n\",\"keccak256\":\"0xc1bb4aab527d49b19fb885ca03baf2fbcf365a19a26bfcf0091d7e60f2776a2e\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"contracts/test/TestAggregatedAccount.sol:TestAggregatedAccount","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"contracts/test/TestAggregatedAccount.sol:TestAggregatedAccount","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":13838,"contract":"contracts/test/TestAggregatedAccount.sol:TestAggregatedAccount","label":"owner","offset":2,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDeposit()":{"notice":"deposit more funds for this account in the entryPoint"},"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"execute(address,uint256,bytes)":{"notice":"execute a transaction (called directly from owner, or by entryPoint)"},"executeBatch(address[],bytes[])":{"notice":"execute a sequence of transactions"},"getDeposit()":{"notice":"check current account deposit in the entryPoint"},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"withdrawDepositTo(address,uint256)":{"notice":"withdraw value from the account's deposit"}},"notice":"test aggregated-signature account. works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum a true aggregated account should expose data (e.g. its public key) to the aggregator.","version":1}}},"contracts/test/TestAggregatedAccountFactory.sol":{"TestAggregatedAccountFactory":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"},{"internalType":"address","name":"anAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"contract TestAggregatedAccount","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"createAccount","outputs":[{"internalType":"contract TestAggregatedAccount","name":"ret","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19424":{"entryPoint":null,"id":19424,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory":{"entryPoint":170,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":146,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:927:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"282:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"328:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"337:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"340:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"330:6:111"},"nodeType":"YulFunctionCall","src":"330:12:111"},"nodeType":"YulExpressionStatement","src":"330:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"303:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"312:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"299:3:111"},"nodeType":"YulFunctionCall","src":"299:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"324:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"295:3:111"},"nodeType":"YulFunctionCall","src":"295:32:111"},"nodeType":"YulIf","src":"292:52:111"},{"nodeType":"YulVariableDeclaration","src":"353:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"372:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"366:5:111"},"nodeType":"YulFunctionCall","src":"366:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"357:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"429:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"391:37:111"},"nodeType":"YulFunctionCall","src":"391:44:111"},"nodeType":"YulExpressionStatement","src":"391:44:111"},{"nodeType":"YulAssignment","src":"444:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"454:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"444:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"468:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"493:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"504:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"483:5:111"},"nodeType":"YulFunctionCall","src":"483:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"472:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"555:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"517:37:111"},"nodeType":"YulFunctionCall","src":"517:46:111"},"nodeType":"YulExpressionStatement","src":"517:46:111"},{"nodeType":"YulAssignment","src":"572:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"582:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"572:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"240:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"251:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"263:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"271:6:111","type":""}],"src":"163:432:111"},{"body":{"nodeType":"YulBlock","src":"750:175:111","statements":[{"nodeType":"YulAssignment","src":"760:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"760:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"795:29:111","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"813:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"818:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"809:3:111"},"nodeType":"YulFunctionCall","src":"809:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"822:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"805:3:111"},"nodeType":"YulFunctionCall","src":"805:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"799:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"840:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"855:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"863:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"851:3:111"},"nodeType":"YulFunctionCall","src":"851:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"833:6:111"},"nodeType":"YulFunctionCall","src":"833:34:111"},"nodeType":"YulExpressionStatement","src":"833:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"887:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"898:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"883:3:111"},"nodeType":"YulFunctionCall","src":"883:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"907:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"915:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"903:3:111"},"nodeType":"YulFunctionCall","src":"903:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"876:6:111"},"nodeType":"YulFunctionCall","src":"876:43:111"},"nodeType":"YulExpressionStatement","src":"876:43:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"711:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"722:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"730:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"741:4:111","type":""}],"src":"600:325:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_address_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := sub(shl(160, 1), 1)\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b50604051612ec6380380612ec683398101604081905261002f916100aa565b818160405161003d90610085565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610070573d6000803e3d6000fd5b506001600160a01b0316608052506100e49050565b61211480610db283390190565b6001600160a01b03811681146100a757600080fd5b50565b600080604083850312156100bd57600080fd5b82516100c881610092565b60208401519092506100d981610092565b809150509250929050565b608051610ca661010c60003960008181604b0152818161011401526102580152610ca66000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ee37e1494e25fdc6ba5de8e68bce33b65635751559d63f624544a8936167de764736f6c634300080f003360e0604052306080523480156200001557600080fd5b50604051620021143803806200211483398101604081905262000038916200013f565b6001600160a01b03821660a052816200005062000064565b506001600160a01b031660c052506200017e565b600054610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000124576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013c57600080fd5b50565b600080604083850312156200015357600080fd5b8251620001608162000126565b6020840151909250620001738162000126565b809150509250929050565b60805160a05160c051611f126200020260003960008181610257015261088601526000818161037e015281816108c90152818161097001528181610d4601528181610f7e01528181610fc5015281816112c9015261146e0152600081816106a00152818161073601528181610a3401528181610aca0152610bf90152611f126000f3fe6080604052600436106101475760003560e01c80634f1ef286116100c0578063bc197c8111610074578063c4d66de811610059578063c4d66de81461041f578063d087d2881461043f578063f23a6e611461045457600080fd5b8063bc197c81146103c2578063c399ec881461040a57600080fd5b80638da5cb5b116100a55780638da5cb5b1461033c578063b0d691fe1461036f578063b61d27f6146103a257600080fd5b80634f1ef2861461031457806352d1902d1461032757600080fd5b8063245a7bfc116101175780633a871cdd116100fc5780633a871cdd146102be5780634a58db19146102ec5780634d44560d146102f457600080fd5b8063245a7bfc146102455780633659cfe61461029e57600080fd5b806223de291461015357806301ffc9a71461017a578063150b7a02146101af57806318dfb3c71461022557600080fd5b3661014e57005b600080fd5b34801561015f57600080fd5b5061017861016e3660046117e1565b5050505050505050565b005b34801561018657600080fd5b5061019a610195366004611892565b61049a565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101f46101ca3660046118d4565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101a6565b34801561023157600080fd5b5061017861024036600461198c565b61057f565b34801561025157600080fd5b506102797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102aa57600080fd5b506101786102b93660046119f8565b610689565b3480156102ca57600080fd5b506102de6102d9366004611a15565b61085a565b6040519081526020016101a6565b6101786108c7565b34801561030057600080fd5b5061017861030f366004611a69565b610966565b610178610322366004611ac4565b610a1d565b34801561033357600080fd5b506102de610bdf565b34801561034857600080fd5b506000546102799062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561037b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610279565b3480156103ae57600080fd5b506101786103bd366004611ba6565b610cb1565b3480156103ce57600080fd5b506101f46103dd366004611bf6565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561041657600080fd5b506102de610d00565b34801561042b57600080fd5b5061017861043a3660046119f8565b610db7565b34801561044b57600080fd5b506102de610f31565b34801561046057600080fd5b506101f461046f366004611c94565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000148061052d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061057957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610587610fad565b8281146105db5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b83811015610682576106708585838181106105fb576105fb611d10565b905060200201602081019061061091906119f8565b600085858581811061062457610624611d10565b90506020028101906106369190611d3f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b8061067a81611da4565b9150506105de565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107345760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166107a97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108325760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b61083b816110d9565b60408051600080825260208201909252610857918391906110e1565b50565b60006108646112b1565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680825260006020830181905291909201526108c082611336565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561095257600080fd5b505af1158015610682573d6000803e3d6000fd5b61096e6113a1565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a0157600080fd5b505af1158015610a15573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610ac85760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016105d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b3d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016105d2565b610bcf826110d9565b610bdb828260016110e1565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c8c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105d2565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cb9610fad565b610cfa848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105c92505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611e03565b905090565b600054610100900460ff1615808015610dd75750600054600160ff909116105b80610df15750303b158015610df1575060005460ff166001145b610e635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d2565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ec157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610ecb6000611418565b8015610bdb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610d71565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061100e575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b61105a5760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e7460448201526064016105d2565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516110859190611e48565b60006040518083038185875af1925050503d80600081146110c2576040519150601f19603f3d011682016040523d82523d6000602084013e6110c7565b606091505b50915091508161068257805160208201fd5b6108576113a1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561111957611114836114b7565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561119e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261119b91810190611e03565b60015b6112105760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146112a55760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016105d2565b506111148383836115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461105a5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105d2565b80156108575760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610682565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314806113cc57503330145b61105a5760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e65720000000000000000000000000000000000000000000060448201526064016105d2565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6115415760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016105d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115b0836115cc565b6000825111806115bd5750805b1561111457610cfa8383611619565b6115d5816114b7565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606108c08383604051806060016040528060278152602001611eb66027913960606000808573ffffffffffffffffffffffffffffffffffffffff16856040516116639190611e48565b600060405180830381855af49150503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b50915091506116b4868383876116be565b9695505050505050565b6060831561173a5782516000036117335773ffffffffffffffffffffffffffffffffffffffff85163b6117335760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105d2565b5081611744565b611744838361174c565b949350505050565b81511561175c5781518083602001fd5b8060405162461bcd60e51b81526004016105d29190611e64565b73ffffffffffffffffffffffffffffffffffffffff8116811461085757600080fd5b60008083601f8401126117aa57600080fd5b50813567ffffffffffffffff8111156117c257600080fd5b6020830191508360208285010111156117da57600080fd5b9250929050565b60008060008060008060008060c0898b0312156117fd57600080fd5b883561180881611776565b9750602089013561181881611776565b9650604089013561182881611776565b955060608901359450608089013567ffffffffffffffff8082111561184c57600080fd5b6118588c838d01611798565b909650945060a08b013591508082111561187157600080fd5b5061187e8b828c01611798565b999c989b5096995094979396929594505050565b6000602082840312156118a457600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c057600080fd5b6000806000806000608086880312156118ec57600080fd5b85356118f781611776565b9450602086013561190781611776565b935060408601359250606086013567ffffffffffffffff81111561192a57600080fd5b61193688828901611798565b969995985093965092949392505050565b60008083601f84011261195957600080fd5b50813567ffffffffffffffff81111561197157600080fd5b6020830191508360208260051b85010111156117da57600080fd5b600080600080604085870312156119a257600080fd5b843567ffffffffffffffff808211156119ba57600080fd5b6119c688838901611947565b909650945060208701359150808211156119df57600080fd5b506119ec87828801611947565b95989497509550505050565b600060208284031215611a0a57600080fd5b81356108c081611776565b600080600060608486031215611a2a57600080fd5b833567ffffffffffffffff811115611a4157600080fd5b84016101608187031215611a5457600080fd5b95602085013595506040909401359392505050565b60008060408385031215611a7c57600080fd5b8235611a8781611776565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611ad757600080fd5b8235611ae281611776565b9150602083013567ffffffffffffffff80821115611aff57600080fd5b818501915085601f830112611b1357600080fd5b813581811115611b2557611b25611a95565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b6b57611b6b611a95565b81604052828152886020848701011115611b8457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060608587031215611bbc57600080fd5b8435611bc781611776565b935060208501359250604085013567ffffffffffffffff811115611bea57600080fd5b6119ec87828801611798565b60008060008060008060008060a0898b031215611c1257600080fd5b8835611c1d81611776565b97506020890135611c2d81611776565b9650604089013567ffffffffffffffff80821115611c4a57600080fd5b611c568c838d01611947565b909850965060608b0135915080821115611c6f57600080fd5b611c7b8c838d01611947565b909650945060808b013591508082111561187157600080fd5b60008060008060008060a08789031215611cad57600080fd5b8635611cb881611776565b95506020870135611cc881611776565b94506040870135935060608701359250608087013567ffffffffffffffff811115611cf257600080fd5b611cfe89828a01611798565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611d7457600080fd5b83018035915067ffffffffffffffff821115611d8f57600080fd5b6020019150368190038213156117da57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215611e1557600080fd5b5051919050565b60005b83811015611e37578181015183820152602001611e1f565b83811115610cfa5750506000910152565b60008251611e5a818460208701611e1c565b9190910192915050565b6020815260008251806020840152611e83816040850160208701611e1c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ff89eab92b0c1f277887ddb99b41e2b60ae6b8d4745a41fd8cd00a3a53f8650664736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x2EC6 CODESIZE SUB DUP1 PUSH2 0x2EC6 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xAA JUMP JUMPDEST DUP2 DUP2 PUSH1 0x40 MLOAD PUSH2 0x3D SWAP1 PUSH2 0x85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x70 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH2 0xE4 SWAP1 POP JUMP JUMPDEST PUSH2 0x2114 DUP1 PUSH2 0xDB2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH2 0xC8 DUP2 PUSH2 0x92 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xD9 DUP2 PUSH2 0x92 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xCA6 PUSH2 0x10C PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH1 0x4B ADD MSTORE DUP2 DUP2 PUSH2 0x114 ADD MSTORE PUSH2 0x258 ADD MSTORE PUSH2 0xCA6 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0x1EE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1EE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1B7 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH2 0x1C2 SWAP3 SWAP2 SWAP1 PUSH2 0x412 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP3 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x207 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x300 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x412 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x33C SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x35E JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x4B0 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x40C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x44D DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3E2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x492 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x4A6 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x706673582212207EE37E EQ SWAP5 0xE2 0x5F 0xDC PUSH12 0xA5DE8E68BCE33B6563575155 SWAP14 PUSH4 0xF624544A DUP10 CALLDATASIZE AND PUSH30 0xE764736F6C634300080F003360E060405230608052348015620000155760 STOP DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2114 CODESIZE SUB DUP1 PUSH3 0x2114 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x38 SWAP2 PUSH3 0x13F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0xA0 MSTORE DUP2 PUSH3 0x50 PUSH3 0x64 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE POP PUSH3 0x17E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH3 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320696E697469 PUSH1 0x44 DUP3 ADD MSTORE PUSH7 0x616C697A696E67 PUSH1 0xC8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF SWAP1 DUP2 AND LT ISZERO PUSH3 0x124 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x160 DUP2 PUSH3 0x126 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x173 DUP2 PUSH3 0x126 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x1F12 PUSH3 0x202 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x257 ADD MSTORE PUSH2 0x886 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x37E ADD MSTORE DUP2 DUP2 PUSH2 0x8C9 ADD MSTORE DUP2 DUP2 PUSH2 0x970 ADD MSTORE DUP2 DUP2 PUSH2 0xD46 ADD MSTORE DUP2 DUP2 PUSH2 0xF7E ADD MSTORE DUP2 DUP2 PUSH2 0xFC5 ADD MSTORE DUP2 DUP2 PUSH2 0x12C9 ADD MSTORE PUSH2 0x146E ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x6A0 ADD MSTORE DUP2 DUP2 PUSH2 0x736 ADD MSTORE DUP2 DUP2 PUSH2 0xA34 ADD MSTORE DUP2 DUP2 PUSH2 0xACA ADD MSTORE PUSH2 0xBF9 ADD MSTORE PUSH2 0x1F12 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x147 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F1EF286 GT PUSH2 0xC0 JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xC4D66DE8 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x43F JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x3A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x314 JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC GT PUSH2 0x117 JUMPI DUP1 PUSH4 0x3A871CDD GT PUSH2 0xFC JUMPI DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x2EC JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x2F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x245A7BFC EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x17A JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x225 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x14E JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x17E1 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19A PUSH2 0x195 CALLDATASIZE PUSH1 0x4 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x49A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x1CA CALLDATASIZE PUSH1 0x4 PUSH2 0x18D4 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x231 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x240 CALLDATASIZE PUSH1 0x4 PUSH2 0x198C JUMP JUMPDEST PUSH2 0x57F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x279 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x2B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0x689 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0x2D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A15 JUMP JUMPDEST PUSH2 0x85A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A6 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x8C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x30F CALLDATASIZE PUSH1 0x4 PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x966 JUMP JUMPDEST PUSH2 0x178 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AC4 JUMP JUMPDEST PUSH2 0xA1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xBDF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x279 SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x279 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x3BD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BA6 JUMP JUMPDEST PUSH2 0xCB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x3DD CALLDATASIZE PUSH1 0x4 PUSH2 0x1BF6 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xD00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x178 PUSH2 0x43A CALLDATASIZE PUSH1 0x4 PUSH2 0x19F8 JUMP JUMPDEST PUSH2 0xDB7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DE PUSH2 0xF31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x460 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F4 PUSH2 0x46F CALLDATASIZE PUSH1 0x4 PUSH2 0x1C94 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x52D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x579 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x587 PUSH2 0xFAD JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x5DB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH2 0x670 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x5FB JUMPI PUSH2 0x5FB PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x610 SWAP2 SWAP1 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x624 JUMPI PUSH2 0x624 PUSH2 0x1D10 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x636 SWAP2 SWAP1 PUSH2 0x1D3F JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x67A DUP2 PUSH2 0x1DA4 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5DE JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x734 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x7A9 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x832 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x83B DUP2 PUSH2 0x10D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x857 SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x10E1 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x864 PUSH2 0x12B1 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 DUP3 MSTORE PUSH1 0x0 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP1 SWAP3 ADD MSTORE PUSH2 0x8C0 DUP3 PUSH2 0x1336 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x952 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x682 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x96E PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA15 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xAC8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB3D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0xBCF DUP3 PUSH2 0x10D9 JUMP JUMPDEST PUSH2 0xBDB DUP3 DUP3 PUSH1 0x1 PUSH2 0x10E1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xC8C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xCB9 PUSH2 0xFAD JUMP JUMPDEST PUSH2 0xCFA DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x105C SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD8E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDB2 SWAP2 SWAP1 PUSH2 0x1E03 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xDD7 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xDF1 JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDF1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xE63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEC1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xECB PUSH1 0x0 PUSH2 0x1418 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xBDB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xD71 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x100E JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1085 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x10C2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x10C7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x682 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x857 PUSH2 0x13A1 JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1119 JUMPI PUSH2 0x1114 DUP4 PUSH2 0x14B7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x119E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x119B SWAP2 DUP2 ADD SWAP1 PUSH2 0x1E03 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1210 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x12A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST POP PUSH2 0x1114 DUP4 DUP4 DUP4 PUSH2 0x15A7 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x857 JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x682 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x682 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x13CC JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x1541 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x15B0 DUP4 PUSH2 0x15CC JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x15BD JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x1114 JUMPI PUSH2 0xCFA DUP4 DUP4 PUSH2 0x1619 JUMP JUMPDEST PUSH2 0x15D5 DUP2 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1EB6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1663 SWAP2 SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x169E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16A3 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16B4 DUP7 DUP4 DUP4 DUP8 PUSH2 0x16BE JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x173A JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1733 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x5D2 JUMP JUMPDEST POP DUP2 PUSH2 0x1744 JUMP JUMPDEST PUSH2 0x1744 DUP4 DUP4 PUSH2 0x174C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x175C JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5D2 SWAP2 SWAP1 PUSH2 0x1E64 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x17AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x17FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1808 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1818 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1828 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x184C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1858 DUP13 DUP4 DUP14 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187E DUP12 DUP3 DUP13 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x18A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x8C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x18EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x18F7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1907 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x192A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1936 DUP9 DUP3 DUP10 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1971 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x19BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19C6 DUP9 DUP4 DUP10 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x19DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x8C0 DUP2 PUSH2 0x1776 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1A2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1A54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1A87 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1AE2 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1AFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B25 JUMPI PUSH2 0x1B25 PUSH2 0x1A95 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B6B JUMPI PUSH2 0x1B6B PUSH2 0x1A95 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1BBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1BC7 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19EC DUP8 DUP3 DUP9 ADD PUSH2 0x1798 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1C1D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1C2D DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1C4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C56 DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C7B DUP13 DUP4 DUP14 ADD PUSH2 0x1947 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1CAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1CB8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1CC8 DUP2 PUSH2 0x1776 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFE DUP10 DUP3 DUP11 ADD PUSH2 0x1798 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x17DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x1DFC JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1E37 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1E1F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCFA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1E5A DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1E83 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x1E1C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220FF89EA 0xB9 0x2B 0xC 0x1F 0x27 PUSH25 0x87DDB99B41E2B60AE6B8D4745A41FD8CD00A3A53F865066473 PUSH16 0x6C634300080F00330000000000000000 ","sourceMap":"403:1688:93:-:0;;;514:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;633:12;647;607:53;;;;;:::i;:::-;-1:-1:-1;;;;;851:15:111;;;833:34;;903:15;;898:2;883:18;;876:43;783:2;768:18;607:53:93;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;583:77:93;;;-1:-1:-1;403:1688:93;;-1:-1:-1;403:1688:93;;;;;;;;;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:432::-;263:6;271;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;372:9;366:16;391:44;429:5;391:44;:::i;:::-;504:2;489:18;;483:25;454:5;;-1:-1:-1;517:46:111;483:25;517:46;:::i;:::-;582:7;572:17;;;163:432;;;;;:::o;600:325::-;403:1688:93;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@accountImplementation_19406":{"entryPoint":null,"id":19406,"parameterSlots":0,"returnSlots":0},"@computeAddress_5217":{"entryPoint":862,"id":5217,"parameterSlots":2,"returnSlots":1},"@computeAddress_5231":{"entryPoint":null,"id":5231,"parameterSlots":3,"returnSlots":1},"@createAccount_19489":{"entryPoint":188,"id":19489,"parameterSlots":2,"returnSlots":1},"@getAddress_19531":{"entryPoint":494,"id":19531,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":925,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":1152,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":1042,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_TestAggregatedAccount_$19397__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":994,"id":null,"parameterSlots":3,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2193:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"154:125:111","statements":[{"nodeType":"YulAssignment","src":"164:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"176:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"187:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"172:3:111"},"nodeType":"YulFunctionCall","src":"172:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"164:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"221:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"229:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"217:3:111"},"nodeType":"YulFunctionCall","src":"217:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"199:6:111"},"nodeType":"YulFunctionCall","src":"199:74:111"},"nodeType":"YulExpressionStatement","src":"199:74:111"}]},"name":"abi_encode_tuple_t_contract$_TestAggregatedAccount_$19397__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"123:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"134:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"145:4:111","type":""}],"src":"14:265:111"},{"body":{"nodeType":"YulBlock","src":"371:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"417:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"426:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"429:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"419:6:111"},"nodeType":"YulFunctionCall","src":"419:12:111"},"nodeType":"YulExpressionStatement","src":"419:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"392:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"401:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"388:3:111"},"nodeType":"YulFunctionCall","src":"388:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"413:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"384:3:111"},"nodeType":"YulFunctionCall","src":"384:32:111"},"nodeType":"YulIf","src":"381:52:111"},{"nodeType":"YulVariableDeclaration","src":"442:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"468:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"455:12:111"},"nodeType":"YulFunctionCall","src":"455:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"446:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"564:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"573:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"576:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"566:6:111"},"nodeType":"YulFunctionCall","src":"566:12:111"},"nodeType":"YulExpressionStatement","src":"566:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"500:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"511:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"518:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"507:3:111"},"nodeType":"YulFunctionCall","src":"507:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"497:2:111"},"nodeType":"YulFunctionCall","src":"497:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"490:6:111"},"nodeType":"YulFunctionCall","src":"490:73:111"},"nodeType":"YulIf","src":"487:93:111"},{"nodeType":"YulAssignment","src":"589:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"599:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"589:6:111"}]},{"nodeType":"YulAssignment","src":"613:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"640:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"651:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"636:3:111"},"nodeType":"YulFunctionCall","src":"636:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"623:12:111"},"nodeType":"YulFunctionCall","src":"623:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"613:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"329:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"340:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"352:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"360:6:111","type":""}],"src":"284:377:111"},{"body":{"nodeType":"YulBlock","src":"767:125:111","statements":[{"nodeType":"YulAssignment","src":"777:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"789:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"800:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"785:3:111"},"nodeType":"YulFunctionCall","src":"785:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"777:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"819:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"834:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"842:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"830:3:111"},"nodeType":"YulFunctionCall","src":"830:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"812:6:111"},"nodeType":"YulFunctionCall","src":"812:74:111"},"nodeType":"YulExpressionStatement","src":"812:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"736:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"747:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"758:4:111","type":""}],"src":"666:226:111"},{"body":{"nodeType":"YulBlock","src":"950:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"960:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"969:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"964:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1029:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1054:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1059:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1050:3:111"},"nodeType":"YulFunctionCall","src":"1050:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1073:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"1078:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1069:3:111"},"nodeType":"YulFunctionCall","src":"1069:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1063:5:111"},"nodeType":"YulFunctionCall","src":"1063:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1043:6:111"},"nodeType":"YulFunctionCall","src":"1043:39:111"},"nodeType":"YulExpressionStatement","src":"1043:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"990:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"993:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"987:2:111"},"nodeType":"YulFunctionCall","src":"987:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1001:19:111","statements":[{"nodeType":"YulAssignment","src":"1003:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1012:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"1015:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1008:3:111"},"nodeType":"YulFunctionCall","src":"1008:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1003:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"983:3:111","statements":[]},"src":"979:113:111"},{"body":{"nodeType":"YulBlock","src":"1118:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"1131:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"1136:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1127:3:111"},"nodeType":"YulFunctionCall","src":"1127:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"1145:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1120:6:111"},"nodeType":"YulFunctionCall","src":"1120:27:111"},"nodeType":"YulExpressionStatement","src":"1120:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1107:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1110:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1104:2:111"},"nodeType":"YulFunctionCall","src":"1104:13:111"},"nodeType":"YulIf","src":"1101:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"928:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"933:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"938:6:111","type":""}],"src":"897:258:111"},{"body":{"nodeType":"YulBlock","src":"1307:413:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1324:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1339:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1347:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1335:3:111"},"nodeType":"YulFunctionCall","src":"1335:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1317:6:111"},"nodeType":"YulFunctionCall","src":"1317:74:111"},"nodeType":"YulExpressionStatement","src":"1317:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1411:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1422:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1407:3:111"},"nodeType":"YulFunctionCall","src":"1407:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"1427:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1400:6:111"},"nodeType":"YulFunctionCall","src":"1400:30:111"},"nodeType":"YulExpressionStatement","src":"1400:30:111"},{"nodeType":"YulVariableDeclaration","src":"1439:27:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"1459:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1453:5:111"},"nodeType":"YulFunctionCall","src":"1453:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1443:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1486:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1497:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1482:3:111"},"nodeType":"YulFunctionCall","src":"1482:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1502:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1475:6:111"},"nodeType":"YulFunctionCall","src":"1475:34:111"},"nodeType":"YulExpressionStatement","src":"1475:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"1544:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1552:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1540:3:111"},"nodeType":"YulFunctionCall","src":"1540:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1561:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1572:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1557:3:111"},"nodeType":"YulFunctionCall","src":"1557:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1577:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1518:21:111"},"nodeType":"YulFunctionCall","src":"1518:66:111"},"nodeType":"YulExpressionStatement","src":"1518:66:111"},{"nodeType":"YulAssignment","src":"1593:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1609:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1628:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1636:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1624:3:111"},"nodeType":"YulFunctionCall","src":"1624:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1641:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1620:3:111"},"nodeType":"YulFunctionCall","src":"1620:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1605:3:111"},"nodeType":"YulFunctionCall","src":"1605:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"1711:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1601:3:111"},"nodeType":"YulFunctionCall","src":"1601:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1593:4:111"}]}]},"name":"abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1268:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1279:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1287:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1298:4:111","type":""}],"src":"1160:560:111"},{"body":{"nodeType":"YulBlock","src":"1908:283:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1918:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1938:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1932:5:111"},"nodeType":"YulFunctionCall","src":"1932:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1922:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1980:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1988:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1976:3:111"},"nodeType":"YulFunctionCall","src":"1976:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"1995:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2000:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"1954:21:111"},"nodeType":"YulFunctionCall","src":"1954:53:111"},"nodeType":"YulExpressionStatement","src":"1954:53:111"},{"nodeType":"YulVariableDeclaration","src":"2016:29:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"2033:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"2038:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2029:3:111"},"nodeType":"YulFunctionCall","src":"2029:16:111"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"2020:5:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2054:29:111","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2076:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2070:5:111"},"nodeType":"YulFunctionCall","src":"2070:13:111"},"variables":[{"name":"length_1","nodeType":"YulTypedName","src":"2058:8:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2118:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2126:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2114:3:111"},"nodeType":"YulFunctionCall","src":"2114:17:111"},{"name":"end_1","nodeType":"YulIdentifier","src":"2133:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"2140:8:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"2092:21:111"},"nodeType":"YulFunctionCall","src":"2092:57:111"},"nodeType":"YulExpressionStatement","src":"2092:57:111"},{"nodeType":"YulAssignment","src":"2158:27:111","value":{"arguments":[{"name":"end_1","nodeType":"YulIdentifier","src":"2169:5:111"},{"name":"length_1","nodeType":"YulIdentifier","src":"2176:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2165:3:111"},"nodeType":"YulFunctionCall","src":"2165:20:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"2158:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"1876:3:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1881:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1889:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"1900:3:111","type":""}],"src":"1725:466:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_contract$_TestAggregatedAccount_$19397__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), 64)\n let length := mload(value1)\n mstore(add(headStart, 64), length)\n copy_memory_to_memory(add(value1, 32), add(headStart, 96), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n let end_1 := add(pos, length)\n let length_1 := mload(value1)\n copy_memory_to_memory(add(value1, 0x20), end_1, length_1)\n end := add(end_1, length_1)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"19406":[{"length":32,"start":75},{"length":32,"start":276},{"length":32,"start":600}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c540164f2fe87ca58c5c6a554405d1b04cfc650a59335ab0e62edf4d0bd5ef4264736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ee37e1494e25fdc6ba5de8e68bce33b65635751559d63f624544a8936167de764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11464FBE EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x5FBFB9CF EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x8CB84E18 EQ PUSH2 0xA9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6D PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0xBC JUMP JUMPDEST PUSH2 0x6D PUSH2 0xB7 CALLDATASIZE PUSH1 0x4 PUSH2 0x39D JUMP JUMPDEST PUSH2 0x1EE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC9 DUP5 DUP5 PUSH2 0x1EE JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE DUP1 ISZERO PUSH2 0xF1 JUMPI POP SWAP1 POP PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE MLOAD PUSH2 0x1B7 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH2 0x1C2 SWAP3 SWAP2 SWAP1 PUSH2 0x412 JUMP JUMPDEST DUP2 SWAP1 PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE2 SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x1E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP3 PUSH1 0x0 SHL PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH2 0x207 SWAP1 PUSH2 0x390 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB DUP2 ADD DUP4 MSTORE PUSH1 0x1F SWAP1 SWAP2 ADD AND PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x0 SWAP1 PUSH1 0x44 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC4D66DE800000000000000000000000000000000000000000000000000000000 OR SWAP1 MSTORE SWAP1 MLOAD PUSH2 0x300 SWAP4 SWAP3 SWAP2 ADD PUSH2 0x412 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE PUSH2 0x33C SWAP3 SWAP2 PUSH1 0x20 ADD PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x35E JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x357 DUP4 DUP4 ADDRESS PUSH1 0x0 PUSH1 0x40 MLOAD DUP4 PUSH1 0x40 DUP3 ADD MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE DUP3 DUP2 MSTORE PUSH1 0xB DUP2 ADD SWAP1 POP PUSH1 0xFF DUP2 MSTORE8 PUSH1 0x55 SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x7C1 DUP1 PUSH2 0x4B0 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x40C JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x44D DUP2 PUSH1 0x60 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x3E2 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x60 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x492 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP4 ADD SWAP1 PUSH2 0x4A6 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x3E2 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7C1 CODESIZE SUB DUP1 PUSH2 0x7C1 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x321 JUMP JUMPDEST PUSH2 0x2E DUP3 DUP3 PUSH1 0x0 PUSH2 0x35 JUMP JUMPDEST POP POP PUSH2 0x43E JUMP JUMPDEST PUSH2 0x3E DUP4 PUSH2 0x6B JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x4B JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x66 JUMPI PUSH2 0x64 DUP4 DUP4 PUSH2 0xAB PUSH1 0x20 SHL PUSH2 0x29 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x74 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xD0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x79A PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xEA DUP2 PUSH2 0x222 PUSH1 0x20 SHL PUSH2 0x55 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x151 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH13 0x1BDD08184818DBDB9D1C9858DD PUSH1 0x9A SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x188 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x0 SHL PUSH2 0x231 PUSH1 0x20 SHL PUSH2 0x71 OR PUSH1 0x20 SHR JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C6 SWAP2 SWAP1 PUSH2 0x3EF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x206 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x218 DUP7 DUP4 DUP4 DUP8 PUSH2 0x234 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2A3 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x29C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x29C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x148 JUMP JUMPDEST POP DUP2 PUSH2 0x2AD JUMP JUMPDEST PUSH2 0x2AD DUP4 DUP4 PUSH2 0x2B5 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x2C5 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x148 SWAP2 SWAP1 PUSH2 0x40B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x310 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2F8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x64 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x38E JUMPI PUSH2 0x38E PUSH2 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x3B6 JUMPI PUSH2 0x3B6 PUSH2 0x2DF JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E0 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x2F5 JUMP JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x401 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x42A DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x2F5 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x34D DUP1 PUSH2 0x44D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE PUSH2 0x13 JUMPI PUSH2 0x11 PUSH2 0x17 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x11 JUMPDEST PUSH2 0x27 PUSH2 0x22 PUSH2 0x74 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 PUSH2 0x4E DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0xDD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB4 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0xD8 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x107 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x142 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x147 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x158 DUP7 DUP4 DUP4 DUP8 PUSH2 0x162 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1FD JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH2 0x207 JUMP JUMPDEST PUSH2 0x207 DUP4 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x21F JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1ED SWAP2 SWAP1 PUSH2 0x29F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x256 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x27D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x295 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2BE DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x253 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x70667358221220C54016 0x4F 0x2F 0xE8 PUSH29 0xA58C5C6A554405D1B04CFC650A59335AB0E62EDF4D0BD5EF4264736F6C PUSH4 0x4300080F STOP CALLER COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x706673582212207EE37E EQ SWAP5 0xE2 0x5F 0xDC PUSH12 0xA5DE8E68BCE33B6563575155 SWAP14 PUSH4 0xF624544A DUP10 CALLDATASIZE AND PUSH30 0xE764736F6C634300080F0033000000000000000000000000000000000000 ","sourceMap":"403:1688:93:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;447:60;;;;;;;;229:42:111;217:55;;;199:74;;187:2;172:18;447:60:93;;;;;;;1047:509;;;;;;:::i;:::-;;:::i;1681:408::-;;;;;;:::i;:::-;;:::i;1047:509::-;1114:25;1151:12;1166:23;1177:5;1184:4;1166:10;:23::i;:::-;1151:38;-1:-1:-1;1215:16:93;;;;1245:12;;1241:86;;-1:-1:-1;1310:4:93;-1:-1:-1;1273:43:93;;1241:86;1476:57;;229:42:111;217:55;;1476:57:93;;;199:74:111;1404:4:93;;1436:21;;172:18:111;;1476:57:93;;;;;;;;;;;;;;;;;;;;;;;;1372:175;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1336:213;;1141:415;;1047:509;;;;;:::o;1681:408::-;1750:7;1776:306;1807:4;1799:13;;1858:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;229:42:111;217:55;;1991:57:93;;;199:74:111;1947:21:93;;172:18:111;;1991:57:93;;;;;;;;;;;;;;;;;;;;;;;;;1907:159;;;;;1991:57;1907:159;;:::i;:::-;;;;;;;;;;;;;;;1824:256;;;1907:159;1824:256;;:::i;:::-;;;;;;;;;;;;;1814:267;;;;;;1776:22;:306::i;:::-;1769:313;1681:408;-1:-1:-1;;;1681:408:93:o;1799:165:44:-;1882:7;1908:49;1923:4;1929:12;1951:4;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:44:o;-1:-1:-1:-;;;;;;;;:::o;284:377:111:-;352:6;360;413:2;401:9;392:7;388:23;384:32;381:52;;;429:1;426;419:12;381:52;468:9;455:23;518:42;511:5;507:54;500:5;497:65;487:93;;576:1;573;566:12;487:93;599:5;651:2;636:18;;;;623:32;;-1:-1:-1;;;284:377:111:o;897:258::-;969:1;979:113;993:6;990:1;987:13;979:113;;;1069:11;;;1063:18;1050:11;;;1043:39;1015:2;1008:10;979:113;;;1110:6;1107:1;1104:13;1101:48;;;1145:1;1136:6;1131:3;1127:16;1120:27;1101:48;;897:258;;;:::o;1160:560::-;1347:42;1339:6;1335:55;1324:9;1317:74;1427:2;1422;1411:9;1407:18;1400:30;1298:4;1459:6;1453:13;1502:6;1497:2;1486:9;1482:18;1475:34;1518:66;1577:6;1572:2;1561:9;1557:18;1552:2;1544:6;1540:15;1518:66;:::i;:::-;1636:2;1624:15;1641:66;1620:88;1605:104;;;;1711:2;1601:113;;1160:560;-1:-1:-1;;;1160:560:111:o;1725:466::-;1900:3;1938:6;1932:13;1954:53;2000:6;1995:3;1988:4;1980:6;1976:17;1954:53;:::i;:::-;2070:13;;2029:16;;;;2092:57;2070:13;2029:16;2126:4;2114:17;;2092:57;:::i;:::-;2165:20;;1725:466;-1:-1:-1;;;;1725:466:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"647600","executionCost":"infinite","totalCost":"infinite"},"external":{"accountImplementation()":"infinite","createAccount(address,uint256)":"infinite","getAddress(address,uint256)":"infinite"}},"methodIdentifiers":{"accountImplementation()":"11464fbe","createAccount(address,uint256)":"5fbfb9cf","getAddress(address,uint256)":"8cb84e18"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"anAggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplementation\",\"outputs\":[{\"internalType\":\"contract TestAggregatedAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract TestAggregatedAccount\",\"name\":\"ret\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(address,uint256)\":{\"notice\":\"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\"},\"getAddress(address,uint256)\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"Based on SimpleAccountFactory. Cannot be a subclass since both constructor and createAccount depend on the constructor and initializer of the actual account contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestAggregatedAccountFactory.sol\":\"TestAggregatedAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/TestAggregatedAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\n\\n/**\\n * test aggregated-signature account.\\n * works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum\\n * a true aggregated account should expose data (e.g. its public key) to the aggregator.\\n */\\ncontract TestAggregatedAccount is SimpleAccount {\\n address public immutable aggregator;\\n\\n // The constructor is used only for the \\\"implementation\\\" and only sets immutable values.\\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\\n aggregator = anAggregator;\\n }\\n\\n /// @inheritdoc SimpleAccount\\n function initialize(address) public virtual override initializer {\\n super._initialize(address(0));\\n }\\n\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n (userOp, userOpHash);\\n return _packValidationData(ValidationData(aggregator, 0, 0));\\n }\\n}\\n\",\"keccak256\":\"0xc1bb4aab527d49b19fb885ca03baf2fbcf365a19a26bfcf0091d7e60f2776a2e\",\"license\":\"GPL-3.0\"},\"contracts/test/TestAggregatedAccountFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"./TestAggregatedAccount.sol\\\";\\n\\n/**\\n * Based on SimpleAccountFactory.\\n * Cannot be a subclass since both constructor and createAccount depend on the\\n * constructor and initializer of the actual account contract.\\n */\\ncontract TestAggregatedAccountFactory {\\n TestAggregatedAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint anEntryPoint, address anAggregator){\\n accountImplementation = new TestAggregatedAccount(anEntryPoint, anAggregator);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n */\\n function createAccount(address owner,uint256 salt) public returns (TestAggregatedAccount ret) {\\n address addr = getAddress(owner, salt);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return TestAggregatedAccount(payable(addr));\\n }\\n ret = TestAggregatedAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(address owner,uint256 salt) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0x701e22c07c544656d05c36b5f3d05ce3571dbbd15d712f9976c160366c3ea829\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"createAccount(address,uint256)":{"notice":"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation"},"getAddress(address,uint256)":{"notice":"calculate the counterfactual address of this account as it would be returned by createAccount()"}},"notice":"Based on SimpleAccountFactory. Cannot be a subclass since both constructor and createAccount depend on the constructor and initializer of the actual account contract.","version":1}}},"contracts/test/TestCounter.sol":{"TestCounter":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"CalledFrom","type":"event"},{"inputs":[],"name":"count","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"countFail","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"counters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"repeat","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"gasWaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"justemit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"xxx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506103a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a5e9585f1161005b578063a5e9585f146100a7578063be65ab8c146100d9578063caece693146100f9578063d55565441461010157600080fd5b806306661abd14610082578063278ddd3c1461008c578063a1b4689014610094575b600080fd5b61008a61010a565b005b61008a610137565b61008a6100a236600461021d565b61016c565b6100c76100b5366004610299565b60016020526000908152604090205481565b60405190815260200160405180910390f35b6100c76100e73660046102b2565b60006020819052908152604090205481565b61008a6101b7565b6100c760025481565b3360009081526020819052604090205461012590600161031e565b33600090815260208190526040902055565b6040513381527ffb3b4d6258432a9a3d78dd9bffbcb6cfb1bd94f58da35fd530d08da7d1d058329060200160405180910390a1565b60015b8381116101b1576002805490600061018683610336565b90915550506002546000908152600160205260409020819055806101a981610336565b91505061016f565b50505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f636f756e74206661696c65640000000000000000000000000000000000000000604482015260640160405180910390fd5b60008060006040848603121561023257600080fd5b83359250602084013567ffffffffffffffff8082111561025157600080fd5b818601915086601f83011261026557600080fd5b81358181111561027457600080fd5b87602082850101111561028657600080fd5b6020830194508093505050509250925092565b6000602082840312156102ab57600080fd5b5035919050565b6000602082840312156102c457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146102e857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610331576103316102ef565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610367576103676102ef565b506001019056fea264697066735822122083b641e9cf0ec6c6d4c54ff53be0fb8dffd40c262db526407b2d6cdc6167061a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA5E9585F GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA5E9585F EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xBE65AB8C EQ PUSH2 0xD9 JUMPI DUP1 PUSH4 0xCAECE693 EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0xD5556544 EQ PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6661ABD EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x278DDD3C EQ PUSH2 0x8C JUMPI DUP1 PUSH4 0xA1B46890 EQ PUSH2 0x94 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x10A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x8A PUSH2 0x137 JUMP JUMPDEST PUSH2 0x8A PUSH2 0xA2 CALLDATASIZE PUSH1 0x4 PUSH2 0x21D JUMP JUMPDEST PUSH2 0x16C JUMP JUMPDEST PUSH2 0xC7 PUSH2 0xB5 CALLDATASIZE PUSH1 0x4 PUSH2 0x299 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC7 PUSH2 0xE7 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x8A PUSH2 0x1B7 JUMP JUMPDEST PUSH2 0xC7 PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x125 SWAP1 PUSH1 0x1 PUSH2 0x31E JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER DUP2 MSTORE PUSH32 0xFB3B4D6258432A9A3D78DD9BFFBCB6CFB1BD94F58DA35FD530D08DA7D1D05832 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP4 DUP2 GT PUSH2 0x1B1 JUMPI PUSH1 0x2 DUP1 SLOAD SWAP1 PUSH1 0x0 PUSH2 0x186 DUP4 PUSH2 0x336 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 SSTORE DUP1 PUSH2 0x1A9 DUP2 PUSH2 0x336 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x16F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x636F756E74206661696C65640000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x232 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x286 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x331 JUMPI PUSH2 0x331 PUSH2 0x2EF JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x367 JUMPI PUSH2 0x367 PUSH2 0x2EF JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP4 0xB6 COINBASE 0xE9 0xCF 0xE 0xC6 0xC6 0xD4 0xC5 0x4F CREATE2 EXTCODESIZE 0xE0 0xFB DUP14 SELFDESTRUCT 0xD4 0xC 0x26 0x2D 0xB5 0x26 BLOCKHASH PUSH28 0x2D6CDC6167061A64736F6C634300080F003300000000000000000000 ","sourceMap":"125:771:94:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@countFail_19562":{"entryPoint":439,"id":19562,"parameterSlots":0,"returnSlots":0},"@count_19554":{"entryPoint":266,"id":19554,"parameterSlots":0,"returnSlots":0},"@counters_19538":{"entryPoint":null,"id":19538,"parameterSlots":0,"returnSlots":0},"@gasWaster_19610":{"entryPoint":364,"id":19610,"parameterSlots":3,"returnSlots":0},"@justemit_19571":{"entryPoint":311,"id":19571,"parameterSlots":0,"returnSlots":0},"@offset_19581":{"entryPoint":null,"id":19581,"parameterSlots":0,"returnSlots":0},"@xxx_19579":{"entryPoint":null,"id":19579,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":690,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256":{"entryPoint":665,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_string_calldata_ptr":{"entryPoint":541,"id":null,"parameterSlots":2,"returnSlots":3},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_685dd20c453e21fe824a921aca955abfb72a175353566c7111fa229082258e0f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":798,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":822,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":751,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2451:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"121:553:111","statements":[{"body":{"nodeType":"YulBlock","src":"167:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"176:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"179:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"169:6:111"},"nodeType":"YulFunctionCall","src":"169:12:111"},"nodeType":"YulExpressionStatement","src":"169:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"142:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"151:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"138:3:111"},"nodeType":"YulFunctionCall","src":"138:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"163:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"134:3:111"},"nodeType":"YulFunctionCall","src":"134:32:111"},"nodeType":"YulIf","src":"131:52:111"},{"nodeType":"YulAssignment","src":"192:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"215:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"202:12:111"},"nodeType":"YulFunctionCall","src":"202:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"192:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"234:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"276:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"261:3:111"},"nodeType":"YulFunctionCall","src":"261:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"248:12:111"},"nodeType":"YulFunctionCall","src":"248:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"238:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"289:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"299:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"293:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"344:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"353:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"356:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"346:6:111"},"nodeType":"YulFunctionCall","src":"346:12:111"},"nodeType":"YulExpressionStatement","src":"346:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"332:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"340:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"329:2:111"},"nodeType":"YulFunctionCall","src":"329:14:111"},"nodeType":"YulIf","src":"326:34:111"},{"nodeType":"YulVariableDeclaration","src":"369:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"383:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"394:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"379:3:111"},"nodeType":"YulFunctionCall","src":"379:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"373:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"449:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"458:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"461:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"451:6:111"},"nodeType":"YulFunctionCall","src":"451:12:111"},"nodeType":"YulExpressionStatement","src":"451:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"428:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"432:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"424:3:111"},"nodeType":"YulFunctionCall","src":"424:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"439:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"420:3:111"},"nodeType":"YulFunctionCall","src":"420:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"413:6:111"},"nodeType":"YulFunctionCall","src":"413:35:111"},"nodeType":"YulIf","src":"410:55:111"},{"nodeType":"YulVariableDeclaration","src":"474:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"501:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"488:12:111"},"nodeType":"YulFunctionCall","src":"488:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"478:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"531:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"540:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"543:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"533:6:111"},"nodeType":"YulFunctionCall","src":"533:12:111"},"nodeType":"YulExpressionStatement","src":"533:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"519:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"527:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"516:2:111"},"nodeType":"YulFunctionCall","src":"516:14:111"},"nodeType":"YulIf","src":"513:34:111"},{"body":{"nodeType":"YulBlock","src":"597:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"606:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"609:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"599:6:111"},"nodeType":"YulFunctionCall","src":"599:12:111"},"nodeType":"YulExpressionStatement","src":"599:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"570:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"574:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"566:3:111"},"nodeType":"YulFunctionCall","src":"566:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"583:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"562:3:111"},"nodeType":"YulFunctionCall","src":"562:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"588:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"559:2:111"},"nodeType":"YulFunctionCall","src":"559:37:111"},"nodeType":"YulIf","src":"556:57:111"},{"nodeType":"YulAssignment","src":"622:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"636:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"640:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"632:3:111"},"nodeType":"YulFunctionCall","src":"632:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"622:6:111"}]},{"nodeType":"YulAssignment","src":"652:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"662:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"652:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_string_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"71:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"82:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"94:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"102:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"110:6:111","type":""}],"src":"14:660:111"},{"body":{"nodeType":"YulBlock","src":"749:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"795:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"804:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"807:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"797:6:111"},"nodeType":"YulFunctionCall","src":"797:12:111"},"nodeType":"YulExpressionStatement","src":"797:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"770:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"779:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"766:3:111"},"nodeType":"YulFunctionCall","src":"766:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"791:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"762:3:111"},"nodeType":"YulFunctionCall","src":"762:32:111"},"nodeType":"YulIf","src":"759:52:111"},{"nodeType":"YulAssignment","src":"820:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"843:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"830:12:111"},"nodeType":"YulFunctionCall","src":"830:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"820:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"715:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"726:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"738:6:111","type":""}],"src":"679:180:111"},{"body":{"nodeType":"YulBlock","src":"965:76:111","statements":[{"nodeType":"YulAssignment","src":"975:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"987:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"998:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"983:3:111"},"nodeType":"YulFunctionCall","src":"983:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"975:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1017:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1028:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1010:6:111"},"nodeType":"YulFunctionCall","src":"1010:25:111"},"nodeType":"YulExpressionStatement","src":"1010:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"934:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"945:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"956:4:111","type":""}],"src":"864:177:111"},{"body":{"nodeType":"YulBlock","src":"1116:239:111","statements":[{"body":{"nodeType":"YulBlock","src":"1162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1164:6:111"},"nodeType":"YulFunctionCall","src":"1164:12:111"},"nodeType":"YulExpressionStatement","src":"1164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1133:3:111"},"nodeType":"YulFunctionCall","src":"1133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1129:3:111"},"nodeType":"YulFunctionCall","src":"1129:32:111"},"nodeType":"YulIf","src":"1126:52:111"},{"nodeType":"YulVariableDeclaration","src":"1187:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1213:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1200:12:111"},"nodeType":"YulFunctionCall","src":"1200:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1245:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1256:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1263:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1252:3:111"},"nodeType":"YulFunctionCall","src":"1252:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1242:2:111"},"nodeType":"YulFunctionCall","src":"1242:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1235:6:111"},"nodeType":"YulFunctionCall","src":"1235:73:111"},"nodeType":"YulIf","src":"1232:93:111"},{"nodeType":"YulAssignment","src":"1334:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1344:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1334:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1082:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1093:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1105:6:111","type":""}],"src":"1046:309:111"},{"body":{"nodeType":"YulBlock","src":"1392:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1409:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1412:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1402:6:111"},"nodeType":"YulFunctionCall","src":"1402:88:111"},"nodeType":"YulExpressionStatement","src":"1402:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1506:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"1509:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1499:6:111"},"nodeType":"YulFunctionCall","src":"1499:15:111"},"nodeType":"YulExpressionStatement","src":"1499:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1530:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1533:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1523:6:111"},"nodeType":"YulFunctionCall","src":"1523:15:111"},"nodeType":"YulExpressionStatement","src":"1523:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"1360:184:111"},{"body":{"nodeType":"YulBlock","src":"1597:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"1624:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"1626:16:111"},"nodeType":"YulFunctionCall","src":"1626:18:111"},"nodeType":"YulExpressionStatement","src":"1626:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1613:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"1620:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1616:3:111"},"nodeType":"YulFunctionCall","src":"1616:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1610:2:111"},"nodeType":"YulFunctionCall","src":"1610:13:111"},"nodeType":"YulIf","src":"1607:39:111"},{"nodeType":"YulAssignment","src":"1655:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"1666:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"1669:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1662:3:111"},"nodeType":"YulFunctionCall","src":"1662:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"1655:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"1580:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"1583:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"1589:3:111","type":""}],"src":"1549:128:111"},{"body":{"nodeType":"YulBlock","src":"1783:125:111","statements":[{"nodeType":"YulAssignment","src":"1793:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1805:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1816:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1801:3:111"},"nodeType":"YulFunctionCall","src":"1801:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1793:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1835:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1850:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1858:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1846:3:111"},"nodeType":"YulFunctionCall","src":"1846:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1828:6:111"},"nodeType":"YulFunctionCall","src":"1828:74:111"},"nodeType":"YulExpressionStatement","src":"1828:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1752:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1763:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1774:4:111","type":""}],"src":"1682:226:111"},{"body":{"nodeType":"YulBlock","src":"1960:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"2051:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"2053:16:111"},"nodeType":"YulFunctionCall","src":"2053:18:111"},"nodeType":"YulExpressionStatement","src":"2053:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1976:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1983:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1973:2:111"},"nodeType":"YulFunctionCall","src":"1973:77:111"},"nodeType":"YulIf","src":"1970:103:111"},{"nodeType":"YulAssignment","src":"2082:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2093:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2100:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2089:3:111"},"nodeType":"YulFunctionCall","src":"2089:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"2082:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"1942:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"1952:3:111","type":""}],"src":"1913:195:111"},{"body":{"nodeType":"YulBlock","src":"2287:162:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2304:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2315:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2297:6:111"},"nodeType":"YulFunctionCall","src":"2297:21:111"},"nodeType":"YulExpressionStatement","src":"2297:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2338:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2349:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2334:3:111"},"nodeType":"YulFunctionCall","src":"2334:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"2354:2:111","type":"","value":"12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2327:6:111"},"nodeType":"YulFunctionCall","src":"2327:30:111"},"nodeType":"YulExpressionStatement","src":"2327:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2377:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2388:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2373:3:111"},"nodeType":"YulFunctionCall","src":"2373:18:111"},{"hexValue":"636f756e74206661696c6564","kind":"string","nodeType":"YulLiteral","src":"2393:14:111","type":"","value":"count failed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2366:6:111"},"nodeType":"YulFunctionCall","src":"2366:42:111"},"nodeType":"YulExpressionStatement","src":"2366:42:111"},{"nodeType":"YulAssignment","src":"2417:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2440:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2425:3:111"},"nodeType":"YulFunctionCall","src":"2425:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2417:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_685dd20c453e21fe824a921aca955abfb72a175353566c7111fa229082258e0f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2264:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2278:4:111","type":""}],"src":"2113:336:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint256t_string_calldata_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_685dd20c453e21fe824a921aca955abfb72a175353566c7111fa229082258e0f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 12)\n mstore(add(headStart, 64), \"count failed\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a5e9585f1161005b578063a5e9585f146100a7578063be65ab8c146100d9578063caece693146100f9578063d55565441461010157600080fd5b806306661abd14610082578063278ddd3c1461008c578063a1b4689014610094575b600080fd5b61008a61010a565b005b61008a610137565b61008a6100a236600461021d565b61016c565b6100c76100b5366004610299565b60016020526000908152604090205481565b60405190815260200160405180910390f35b6100c76100e73660046102b2565b60006020819052908152604090205481565b61008a6101b7565b6100c760025481565b3360009081526020819052604090205461012590600161031e565b33600090815260208190526040902055565b6040513381527ffb3b4d6258432a9a3d78dd9bffbcb6cfb1bd94f58da35fd530d08da7d1d058329060200160405180910390a1565b60015b8381116101b1576002805490600061018683610336565b90915550506002546000908152600160205260409020819055806101a981610336565b91505061016f565b50505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f636f756e74206661696c65640000000000000000000000000000000000000000604482015260640160405180910390fd5b60008060006040848603121561023257600080fd5b83359250602084013567ffffffffffffffff8082111561025157600080fd5b818601915086601f83011261026557600080fd5b81358181111561027457600080fd5b87602082850101111561028657600080fd5b6020830194508093505050509250925092565b6000602082840312156102ab57600080fd5b5035919050565b6000602082840312156102c457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146102e857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610331576103316102ef565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610367576103676102ef565b506001019056fea264697066735822122083b641e9cf0ec6c6d4c54ff53be0fb8dffd40c262db526407b2d6cdc6167061a64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA5E9585F GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xA5E9585F EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xBE65AB8C EQ PUSH2 0xD9 JUMPI DUP1 PUSH4 0xCAECE693 EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0xD5556544 EQ PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6661ABD EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x278DDD3C EQ PUSH2 0x8C JUMPI DUP1 PUSH4 0xA1B46890 EQ PUSH2 0x94 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x10A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x8A PUSH2 0x137 JUMP JUMPDEST PUSH2 0x8A PUSH2 0xA2 CALLDATASIZE PUSH1 0x4 PUSH2 0x21D JUMP JUMPDEST PUSH2 0x16C JUMP JUMPDEST PUSH2 0xC7 PUSH2 0xB5 CALLDATASIZE PUSH1 0x4 PUSH2 0x299 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC7 PUSH2 0xE7 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x8A PUSH2 0x1B7 JUMP JUMPDEST PUSH2 0xC7 PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x125 SWAP1 PUSH1 0x1 PUSH2 0x31E JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER DUP2 MSTORE PUSH32 0xFB3B4D6258432A9A3D78DD9BFFBCB6CFB1BD94F58DA35FD530D08DA7D1D05832 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP4 DUP2 GT PUSH2 0x1B1 JUMPI PUSH1 0x2 DUP1 SLOAD SWAP1 PUSH1 0x0 PUSH2 0x186 DUP4 PUSH2 0x336 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 SSTORE DUP1 PUSH2 0x1A9 DUP2 PUSH2 0x336 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x16F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x636F756E74206661696C65640000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x232 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x286 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 POP DUP1 SWAP4 POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x331 JUMPI PUSH2 0x331 PUSH2 0x2EF JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x367 JUMPI PUSH2 0x367 PUSH2 0x2EF JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP4 0xB6 COINBASE 0xE9 0xCF 0xE 0xC6 0xC6 0xD4 0xC5 0x4F CREATE2 EXTCODESIZE 0xE0 0xFB DUP14 SELFDESTRUCT 0xD4 0xC 0x26 0x2D 0xB5 0x26 BLOCKHASH PUSH28 0x2D6CDC6167061A64736F6C634300080F003300000000000000000000 ","sourceMap":"125:771:94:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;202:88;;;:::i;:::-;;374:71;;;:::i;708:186::-;;;;;;:::i;:::-;;:::i;636:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1010:25:111;;;998:2;983:18;636:38:94;;;;;;;152:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;296:72;;;:::i;680:21::-;;;;;;202:88;268:10;259:8;:20;;;;;;;;;;;:24;;282:1;259:24;:::i;:::-;245:10;236:8;:20;;;;;;;;;;:47;202:88::o;374:71::-;416:22;;427:10;1828:74:111;;416:22:94;;1816:2:111;1801:18;416:22:94;;;;;;;374:71::o;708:186::-;805:1;788:100;813:6;808:1;:11;788:100;;840:6;:8;;;:6;:8;;;:::i;:::-;;;;-1:-1:-1;;866:6:94;;862:11;;;;:3;:11;;;;;:15;;;876:1;821:3;876:1;821:3;:::i;:::-;;;;788:100;;;;708:186;;;:::o;296:72::-;339:22;;;;;2315:2:111;339:22:94;;;2297:21:111;2354:2;2334:18;;;2327:30;2393:14;2373:18;;;2366:42;2425:18;;339:22:94;;;;;;;14:660:111;94:6;102;110;163:2;151:9;142:7;138:23;134:32;131:52;;;179:1;176;169:12;131:52;215:9;202:23;192:33;;276:2;265:9;261:18;248:32;299:18;340:2;332:6;329:14;326:34;;;356:1;353;346:12;326:34;394:6;383:9;379:22;369:32;;439:7;432:4;428:2;424:13;420:27;410:55;;461:1;458;451:12;410:55;501:2;488:16;527:2;519:6;516:14;513:34;;;543:1;540;533:12;513:34;588:7;583:2;574:6;570:2;566:15;562:24;559:37;556:57;;;609:1;606;599:12;556:57;640:2;636;632:11;622:21;;662:6;652:16;;;;;14:660;;;;;:::o;679:180::-;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:111;;679:180;-1:-1:-1;679:180:111:o;1046:309::-;1105:6;1158:2;1146:9;1137:7;1133:23;1129:32;1126:52;;;1174:1;1171;1164:12;1126:52;1213:9;1200:23;1263:42;1256:5;1252:54;1245:5;1242:65;1232:93;;1321:1;1318;1311:12;1232:93;1344:5;1046:309;-1:-1:-1;;;1046:309:111:o;1360:184::-;1412:77;1409:1;1402:88;1509:4;1506:1;1499:15;1533:4;1530:1;1523:15;1549:128;1589:3;1620:1;1616:6;1613:1;1610:13;1607:39;;;1626:18;;:::i;:::-;-1:-1:-1;1662:9:111;;1549:128::o;1913:195::-;1952:3;1983:66;1976:5;1973:77;1970:103;;2053:18;;:::i;:::-;-1:-1:-1;2100:1:111;2089:13;;1913:195::o"},"gasEstimates":{"creation":{"codeDepositCost":"186400","executionCost":"232","totalCost":"186632"},"external":{"count()":"24563","countFail()":"278","counters(address)":"2485","gasWaster(uint256,string)":"infinite","justemit()":"1223","offset()":"2349","xxx(uint256)":"2426"}},"methodIdentifiers":{"count()":"06661abd","countFail()":"caece693","counters(address)":"be65ab8c","gasWaster(uint256,string)":"a1b46890","justemit()":"278ddd3c","offset()":"d5556544","xxx(uint256)":"a5e9585f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CalledFrom\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"count\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"countFail\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"counters\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"repeat\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"gasWaster\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"justemit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"xxx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestCounter.sol\":\"TestCounter\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/test/TestCounter.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n//sample \\\"receiver\\\" contract, for testing \\\"exec\\\" from account.\\ncontract TestCounter {\\n mapping(address => uint256) public counters;\\n\\n function count() public {\\n counters[msg.sender] = counters[msg.sender] + 1;\\n }\\n\\n function countFail() public pure {\\n revert(\\\"count failed\\\");\\n }\\n\\n function justemit() public {\\n emit CalledFrom(msg.sender);\\n }\\n\\n event CalledFrom(address sender);\\n\\n //helper method to waste gas\\n // repeat - waste gas on writing storage in a loop\\n // junk - dynamic buffer to stress the function size.\\n mapping(uint256 => uint256) public xxx;\\n uint256 public offset;\\n\\n function gasWaster(uint256 repeat, string calldata /*junk*/) external {\\n for (uint256 i = 1; i <= repeat; i++) {\\n offset++;\\n xxx[offset] = i;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf865acf416e281144245cab101a27532b7e549b1f5a17bd052d4668a4b3e10d3\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":19538,"contract":"contracts/test/TestCounter.sol:TestCounter","label":"counters","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"},{"astId":19579,"contract":"contracts/test/TestCounter.sol:TestCounter","label":"xxx","offset":0,"slot":"1","type":"t_mapping(t_uint256,t_uint256)"},{"astId":19581,"contract":"contracts/test/TestCounter.sol:TestCounter","label":"offset","offset":0,"slot":"2","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_uint256)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestExpirePaymaster.sol":{"TestExpirePaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19627":{"entryPoint":null,"id":19627,"parameterSlots":1,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":75,"id":2932,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":155,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b50604051610df8380380610df883398101604081905261002f9161009b565b806100393361004b565b6001600160a01b0316608052506100cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ad57600080fd5b81516001600160a01b03811681146100c457600080fd5b9392505050565b608051610ce161011760003960008181610199015281816102a50152818161036f015281816103eb015281816104b201528181610542015281816105f5015261083c0152610ce16000f3fe6080604052600436106100c75760003560e01c8063bb9fe6bf11610074578063d0e30db01161004e578063d0e30db014610213578063f2fde38b1461021b578063f465c77e1461023b57600080fd5b8063bb9fe6bf146101bb578063c23a5cea146101d0578063c399ec88146101f057600080fd5b80638da5cb5b116100a55780638da5cb5b14610116578063a9a2340914610167578063b0d691fe1461018757600080fd5b80630396cb60146100cc578063205c2878146100e1578063715018a614610101575b600080fd5b6100df6100da3660046109b8565b610269565b005b3480156100ed57600080fd5b506100df6100fc366004610a07565b61031b565b34801561010d57600080fd5b506100df6103b3565b34801561012257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017357600080fd5b506100df610182366004610a33565b6103c7565b34801561019357600080fd5b5061013d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101c757600080fd5b506100df6103e1565b3480156101dc57600080fd5b506100df6101eb366004610ac2565b610465565b3480156101fc57600080fd5b50610205610511565b60405190815260200161015e565b6100df6105c7565b34801561022757600080fd5b506100df610236366004610ac2565b61064f565b34801561024757600080fd5b5061025b610256366004610adf565b61070b565b60405161015e929190610b33565b61027161072e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050565b61032361072e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156102ff57600080fd5b6103bb61072e565b6103c560006107af565b565b6103cf610824565b6103db848484846108c3565b50505050565b6103e961072e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561045157600080fd5b505af11580156103db573d6000803e3d6000fd5b61046d61072e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156104f657600080fd5b505af115801561050a573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190610bae565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156104f657600080fd5b61065761072e565b73ffffffffffffffffffffffffffffffffffffffff81166106ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610708816107af565b50565b60606000610717610824565b610722858585610925565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f6565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016106f6565b606060008080610939610120880188610bc7565b610947916014908290610c33565b8101906109549190610c78565b9150915061096460008284610980565b6040805160208101909152600081529890975095505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b856109a85760006109ab565b60015b60ff161717949350505050565b6000602082840312156109ca57600080fd5b813563ffffffff811681146109de57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461070857600080fd5b60008060408385031215610a1a57600080fd5b8235610a25816109e5565b946020939093013593505050565b60008060008060608587031215610a4957600080fd5b843560038110610a5857600080fd5b9350602085013567ffffffffffffffff80821115610a7557600080fd5b818701915087601f830112610a8957600080fd5b813581811115610a9857600080fd5b886020828501011115610aaa57600080fd5b95986020929092019750949560400135945092505050565b600060208284031215610ad457600080fd5b81356109de816109e5565b600080600060608486031215610af457600080fd5b833567ffffffffffffffff811115610b0b57600080fd5b84016101608187031215610b1e57600080fd5b95602085013595506040909401359392505050565b604081526000835180604084015260005b81811015610b615760208187018101516060868401015201610b44565b81811115610b73576000606083860101525b50602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b600060208284031215610bc057600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610bfc57600080fd5b83018035915067ffffffffffffffff821115610c1757600080fd5b602001915036819003821315610c2c57600080fd5b9250929050565b60008085851115610c4357600080fd5b83861115610c5057600080fd5b5050820193919092039150565b803565ffffffffffff81168114610c7357600080fd5b919050565b60008060408385031215610c8b57600080fd5b610c9483610c5d565b9150610ca260208401610c5d565b9050925092905056fea2646970667358221220208ca60649458b6e2e2064f88cb5d863ae4caeb16da0aebf00e59a61805014e264736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xDF8 CODESIZE SUB DUP1 PUSH2 0xDF8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x9B JUMP JUMPDEST DUP1 PUSH2 0x39 CALLER PUSH2 0x4B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE POP PUSH2 0xCB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xCE1 PUSH2 0x117 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x199 ADD MSTORE DUP2 DUP2 PUSH2 0x2A5 ADD MSTORE DUP2 DUP2 PUSH2 0x36F ADD MSTORE DUP2 DUP2 PUSH2 0x3EB ADD MSTORE DUP2 DUP2 PUSH2 0x4B2 ADD MSTORE DUP2 DUP2 PUSH2 0x542 ADD MSTORE DUP2 DUP2 PUSH2 0x5F5 ADD MSTORE PUSH2 0x83C ADD MSTORE PUSH2 0xCE1 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC7 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x23B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x101 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x269 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0xA07 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3B3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0xA33 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3E1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xAC2 JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x205 PUSH2 0x511 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x15E JUMP JUMPDEST PUSH2 0xDF PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x236 CALLDATASIZE PUSH1 0x4 PUSH2 0xAC2 JUMP JUMPDEST PUSH2 0x64F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25B PUSH2 0x256 CALLDATASIZE PUSH1 0x4 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP3 SWAP2 SWAP1 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x271 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x323 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BB PUSH2 0x72E JUMP JUMPDEST PUSH2 0x3C5 PUSH1 0x0 PUSH2 0x7AF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3CF PUSH2 0x824 JUMP JUMPDEST PUSH2 0x3DB DUP5 DUP5 DUP5 DUP5 PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3E9 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x46D PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x50A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x59E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0xBAE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x657 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x708 DUP2 PUSH2 0x7AF JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x717 PUSH2 0x824 JUMP JUMPDEST PUSH2 0x722 DUP6 DUP6 DUP6 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 PUSH2 0x939 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0xBC7 JUMP JUMPDEST PUSH2 0x947 SWAP2 PUSH1 0x14 SWAP1 DUP3 SWAP1 PUSH2 0xC33 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x954 SWAP2 SWAP1 PUSH2 0xC78 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x964 PUSH1 0x0 DUP3 DUP5 PUSH2 0x980 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP9 SWAP1 SWAP8 POP SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x9A8 JUMPI PUSH1 0x0 PUSH2 0x9AB JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x9DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x708 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0xA25 DUP2 PUSH2 0x9E5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xA49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0xA58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xA98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xAAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xAD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x9DE DUP2 PUSH2 0x9E5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xAF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xB1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 DUP4 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB61 JUMPI PUSH1 0x20 DUP2 DUP8 ADD DUP2 ADD MLOAD PUSH1 0x60 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0xB44 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xB73 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP7 ADD ADD MSTORE JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE POP PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD PUSH1 0x60 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xBFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xC2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0xC43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0xC50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xC73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC94 DUP4 PUSH2 0xC5D JUMP JUMPDEST SWAP2 POP PUSH2 0xCA2 PUSH1 0x20 DUP5 ADD PUSH2 0xC5D JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 DUP13 0xA6 MOD 0x49 GASLIMIT DUP12 PUSH15 0x2E2064F88CB5D863AE4CAEB16DA0AE 0xBF STOP 0xE5 SWAP11 PUSH2 0x8050 EQ 0xE2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"199:620:95:-:0;;;290:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;341:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;-1:-1:-1;199:620:95;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;199:620:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_checkOwner_2875":{"entryPoint":1838,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_packValidationData_9980":{"entryPoint":2432,"id":9980,"parameterSlots":3,"returnSlots":1},"@_postOp_7416":{"entryPoint":2243,"id":7416,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":2084,"id":7527,"parameterSlots":0,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":1967,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_19677":{"entryPoint":2341,"id":19677,"parameterSlots":3,"returnSlots":2},"@addStake_7469":{"entryPoint":617,"id":7469,"parameterSlots":1,"returnSlots":0},"@deposit_7433":{"entryPoint":1479,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@getDeposit_7484":{"entryPoint":1297,"id":7484,"parameterSlots":0,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":967,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":947,"id":2889,"parameterSlots":0,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":1615,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockStake_7496":{"entryPoint":993,"id":7496,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":1803,"id":7359,"parameterSlots":3,"returnSlots":2},"@withdrawStake_7511":{"entryPoint":1125,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":795,"id":7451,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":2754,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":2567,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":2611,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":2783,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":2990,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":2488,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint48t_uint48":{"entryPoint":3192,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48":{"entryPoint":3165,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":2867,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":3015,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":3123,"id":null,"parameterSlots":4,"returnSlots":2},"validator_revert_address_payable":{"entryPoint":2533,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:7827:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"899:125:111","statements":[{"nodeType":"YulAssignment","src":"909:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"932:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"909:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"951:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"974:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"962:3:111"},"nodeType":"YulFunctionCall","src":"962:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:74:111"},"nodeType":"YulExpressionStatement","src":"944:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"868:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"879:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"890:4:111","type":""}],"src":"798:226:111"},{"body":{"nodeType":"YulBlock","src":"1168:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"1214:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1223:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1226:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1216:6:111"},"nodeType":"YulFunctionCall","src":"1216:12:111"},"nodeType":"YulExpressionStatement","src":"1216:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1189:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1198:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1185:3:111"},"nodeType":"YulFunctionCall","src":"1185:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1210:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1181:3:111"},"nodeType":"YulFunctionCall","src":"1181:32:111"},"nodeType":"YulIf","src":"1178:52:111"},{"nodeType":"YulVariableDeclaration","src":"1239:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1265:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1252:12:111"},"nodeType":"YulFunctionCall","src":"1252:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1243:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1308:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1317:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1320:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1310:6:111"},"nodeType":"YulFunctionCall","src":"1310:12:111"},"nodeType":"YulExpressionStatement","src":"1310:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1297:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1304:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1287:6:111"},"nodeType":"YulFunctionCall","src":"1287:20:111"},"nodeType":"YulIf","src":"1284:40:111"},{"nodeType":"YulAssignment","src":"1333:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1343:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1333:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1357:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1388:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1399:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1384:3:111"},"nodeType":"YulFunctionCall","src":"1384:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1371:12:111"},"nodeType":"YulFunctionCall","src":"1371:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1361:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1412:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1422:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1416:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1467:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1476:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1479:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1469:6:111"},"nodeType":"YulFunctionCall","src":"1469:12:111"},"nodeType":"YulExpressionStatement","src":"1469:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1455:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1463:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1452:2:111"},"nodeType":"YulFunctionCall","src":"1452:14:111"},"nodeType":"YulIf","src":"1449:34:111"},{"nodeType":"YulVariableDeclaration","src":"1492:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1506:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1517:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1502:3:111"},"nodeType":"YulFunctionCall","src":"1502:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1496:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1572:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1581:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1584:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1574:6:111"},"nodeType":"YulFunctionCall","src":"1574:12:111"},"nodeType":"YulExpressionStatement","src":"1574:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1551:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1555:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1547:3:111"},"nodeType":"YulFunctionCall","src":"1547:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1562:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1543:3:111"},"nodeType":"YulFunctionCall","src":"1543:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1536:6:111"},"nodeType":"YulFunctionCall","src":"1536:35:111"},"nodeType":"YulIf","src":"1533:55:111"},{"nodeType":"YulVariableDeclaration","src":"1597:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1624:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1611:12:111"},"nodeType":"YulFunctionCall","src":"1611:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1601:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1654:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1663:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1666:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1656:6:111"},"nodeType":"YulFunctionCall","src":"1656:12:111"},"nodeType":"YulExpressionStatement","src":"1656:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1642:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1650:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1639:2:111"},"nodeType":"YulFunctionCall","src":"1639:14:111"},"nodeType":"YulIf","src":"1636:34:111"},{"body":{"nodeType":"YulBlock","src":"1720:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1729:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1732:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1722:6:111"},"nodeType":"YulFunctionCall","src":"1722:12:111"},"nodeType":"YulExpressionStatement","src":"1722:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1693:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"1697:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1689:3:111"},"nodeType":"YulFunctionCall","src":"1689:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1706:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1685:3:111"},"nodeType":"YulFunctionCall","src":"1685:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1711:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1682:2:111"},"nodeType":"YulFunctionCall","src":"1682:37:111"},"nodeType":"YulIf","src":"1679:57:111"},{"nodeType":"YulAssignment","src":"1745:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1759:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1763:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1755:3:111"},"nodeType":"YulFunctionCall","src":"1755:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1745:6:111"}]},{"nodeType":"YulAssignment","src":"1775:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"1785:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1775:6:111"}]},{"nodeType":"YulAssignment","src":"1800:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1838:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1823:3:111"},"nodeType":"YulFunctionCall","src":"1823:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1810:12:111"},"nodeType":"YulFunctionCall","src":"1810:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1800:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1110:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1121:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1133:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1141:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1149:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1157:6:111","type":""}],"src":"1029:819:111"},{"body":{"nodeType":"YulBlock","src":"1975:125:111","statements":[{"nodeType":"YulAssignment","src":"1985:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2008:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1993:3:111"},"nodeType":"YulFunctionCall","src":"1993:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1985:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2027:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2042:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2050:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2038:3:111"},"nodeType":"YulFunctionCall","src":"2038:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2020:6:111"},"nodeType":"YulFunctionCall","src":"2020:74:111"},"nodeType":"YulExpressionStatement","src":"2020:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1944:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1955:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1966:4:111","type":""}],"src":"1853:247:111"},{"body":{"nodeType":"YulBlock","src":"2183:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"2229:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2238:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2241:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2231:6:111"},"nodeType":"YulFunctionCall","src":"2231:12:111"},"nodeType":"YulExpressionStatement","src":"2231:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2204:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2200:3:111"},"nodeType":"YulFunctionCall","src":"2200:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2225:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2196:3:111"},"nodeType":"YulFunctionCall","src":"2196:32:111"},"nodeType":"YulIf","src":"2193:52:111"},{"nodeType":"YulVariableDeclaration","src":"2254:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2280:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2267:12:111"},"nodeType":"YulFunctionCall","src":"2267:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2258:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2332:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2299:32:111"},"nodeType":"YulFunctionCall","src":"2299:39:111"},"nodeType":"YulExpressionStatement","src":"2299:39:111"},{"nodeType":"YulAssignment","src":"2347:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2357:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2347:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2149:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2160:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2172:6:111","type":""}],"src":"2105:263:111"},{"body":{"nodeType":"YulBlock","src":"2474:76:111","statements":[{"nodeType":"YulAssignment","src":"2484:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2496:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2507:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2492:3:111"},"nodeType":"YulFunctionCall","src":"2492:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2484:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2526:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2537:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2519:6:111"},"nodeType":"YulFunctionCall","src":"2519:25:111"},"nodeType":"YulExpressionStatement","src":"2519:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2443:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2454:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2465:4:111","type":""}],"src":"2373:177:111"},{"body":{"nodeType":"YulBlock","src":"2625:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"2671:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2680:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2683:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2673:6:111"},"nodeType":"YulFunctionCall","src":"2673:12:111"},"nodeType":"YulExpressionStatement","src":"2673:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2646:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2655:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2642:3:111"},"nodeType":"YulFunctionCall","src":"2642:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2667:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2638:3:111"},"nodeType":"YulFunctionCall","src":"2638:32:111"},"nodeType":"YulIf","src":"2635:52:111"},{"nodeType":"YulVariableDeclaration","src":"2696:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2722:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2709:12:111"},"nodeType":"YulFunctionCall","src":"2709:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2700:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2774:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2741:32:111"},"nodeType":"YulFunctionCall","src":"2741:39:111"},"nodeType":"YulExpressionStatement","src":"2741:39:111"},{"nodeType":"YulAssignment","src":"2789:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2799:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2789:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2591:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2602:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2614:6:111","type":""}],"src":"2555:255:111"},{"body":{"nodeType":"YulBlock","src":"2953:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"2999:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3008:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3011:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3001:6:111"},"nodeType":"YulFunctionCall","src":"3001:12:111"},"nodeType":"YulExpressionStatement","src":"3001:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2974:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2983:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2970:3:111"},"nodeType":"YulFunctionCall","src":"2970:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2995:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2966:3:111"},"nodeType":"YulFunctionCall","src":"2966:32:111"},"nodeType":"YulIf","src":"2963:52:111"},{"nodeType":"YulVariableDeclaration","src":"3024:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3051:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3038:12:111"},"nodeType":"YulFunctionCall","src":"3038:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3028:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3106:6:111"},"nodeType":"YulFunctionCall","src":"3106:12:111"},"nodeType":"YulExpressionStatement","src":"3106:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3076:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3084:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3073:2:111"},"nodeType":"YulFunctionCall","src":"3073:30:111"},"nodeType":"YulIf","src":"3070:50:111"},{"nodeType":"YulVariableDeclaration","src":"3129:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3143:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3154:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3139:3:111"},"nodeType":"YulFunctionCall","src":"3139:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3133:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3200:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3209:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3212:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3202:6:111"},"nodeType":"YulFunctionCall","src":"3202:12:111"},"nodeType":"YulExpressionStatement","src":"3202:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3181:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3190:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3177:3:111"},"nodeType":"YulFunctionCall","src":"3177:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"3195:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3173:3:111"},"nodeType":"YulFunctionCall","src":"3173:26:111"},"nodeType":"YulIf","src":"3170:46:111"},{"nodeType":"YulAssignment","src":"3225:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"3235:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3225:6:111"}]},{"nodeType":"YulAssignment","src":"3246:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3273:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3284:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3269:3:111"},"nodeType":"YulFunctionCall","src":"3269:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3256:12:111"},"nodeType":"YulFunctionCall","src":"3256:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3246:6:111"}]},{"nodeType":"YulAssignment","src":"3297:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3324:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3335:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3320:3:111"},"nodeType":"YulFunctionCall","src":"3320:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3307:12:111"},"nodeType":"YulFunctionCall","src":"3307:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3297:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2903:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2914:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2926:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2934:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2942:6:111","type":""}],"src":"2815:530:111"},{"body":{"nodeType":"YulBlock","src":"3497:563:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3525:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3507:6:111"},"nodeType":"YulFunctionCall","src":"3507:21:111"},"nodeType":"YulExpressionStatement","src":"3507:21:111"},{"nodeType":"YulVariableDeclaration","src":"3537:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3557:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3551:5:111"},"nodeType":"YulFunctionCall","src":"3551:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3541:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3584:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3595:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"3600:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3573:6:111"},"nodeType":"YulFunctionCall","src":"3573:34:111"},"nodeType":"YulExpressionStatement","src":"3573:34:111"},{"nodeType":"YulVariableDeclaration","src":"3616:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3625:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3620:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3687:92:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3716:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"3727:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3712:3:111"},"nodeType":"YulFunctionCall","src":"3712:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"3731:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3708:3:111"},"nodeType":"YulFunctionCall","src":"3708:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3750:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"3758:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3746:3:111"},"nodeType":"YulFunctionCall","src":"3746:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3762:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3742:3:111"},"nodeType":"YulFunctionCall","src":"3742:25:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3736:5:111"},"nodeType":"YulFunctionCall","src":"3736:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3701:6:111"},"nodeType":"YulFunctionCall","src":"3701:68:111"},"nodeType":"YulExpressionStatement","src":"3701:68:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3646:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3649:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3643:2:111"},"nodeType":"YulFunctionCall","src":"3643:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3657:21:111","statements":[{"nodeType":"YulAssignment","src":"3659:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3668:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3671:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3664:3:111"},"nodeType":"YulFunctionCall","src":"3664:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3659:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3639:3:111","statements":[]},"src":"3635:144:111"},{"body":{"nodeType":"YulBlock","src":"3813:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3842:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"3853:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3838:3:111"},"nodeType":"YulFunctionCall","src":"3838:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"3862:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3834:3:111"},"nodeType":"YulFunctionCall","src":"3834:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"3867:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3827:6:111"},"nodeType":"YulFunctionCall","src":"3827:42:111"},"nodeType":"YulExpressionStatement","src":"3827:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3794:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3797:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3791:2:111"},"nodeType":"YulFunctionCall","src":"3791:13:111"},"nodeType":"YulIf","src":"3788:91:111"},{"nodeType":"YulAssignment","src":"3888:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3904:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3923:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3931:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3919:3:111"},"nodeType":"YulFunctionCall","src":"3919:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3936:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3915:3:111"},"nodeType":"YulFunctionCall","src":"3915:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3900:3:111"},"nodeType":"YulFunctionCall","src":"3900:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"4006:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3896:3:111"},"nodeType":"YulFunctionCall","src":"3896:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3888:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4029:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4040:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4025:3:111"},"nodeType":"YulFunctionCall","src":"4025:20:111"},{"name":"value1","nodeType":"YulIdentifier","src":"4047:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4018:6:111"},"nodeType":"YulFunctionCall","src":"4018:36:111"},"nodeType":"YulExpressionStatement","src":"4018:36:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3458:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3469:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3477:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3488:4:111","type":""}],"src":"3350:710:111"},{"body":{"nodeType":"YulBlock","src":"4164:93:111","statements":[{"nodeType":"YulAssignment","src":"4174:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4186:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4197:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4182:3:111"},"nodeType":"YulFunctionCall","src":"4182:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4174:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4216:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4231:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4239:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4227:3:111"},"nodeType":"YulFunctionCall","src":"4227:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4209:6:111"},"nodeType":"YulFunctionCall","src":"4209:42:111"},"nodeType":"YulExpressionStatement","src":"4209:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4133:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4144:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4155:4:111","type":""}],"src":"4065:192:111"},{"body":{"nodeType":"YulBlock","src":"4407:168:111","statements":[{"nodeType":"YulAssignment","src":"4417:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4440:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4425:3:111"},"nodeType":"YulFunctionCall","src":"4425:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4417:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4459:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4474:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4482:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4470:3:111"},"nodeType":"YulFunctionCall","src":"4470:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4452:6:111"},"nodeType":"YulFunctionCall","src":"4452:74:111"},"nodeType":"YulExpressionStatement","src":"4452:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4546:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4557:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4542:3:111"},"nodeType":"YulFunctionCall","src":"4542:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"4562:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4535:6:111"},"nodeType":"YulFunctionCall","src":"4535:34:111"},"nodeType":"YulExpressionStatement","src":"4535:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4368:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4379:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4387:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4398:4:111","type":""}],"src":"4262:313:111"},{"body":{"nodeType":"YulBlock","src":"4697:125:111","statements":[{"nodeType":"YulAssignment","src":"4707:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4719:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4730:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4715:3:111"},"nodeType":"YulFunctionCall","src":"4715:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4707:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4749:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4764:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4772:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4760:3:111"},"nodeType":"YulFunctionCall","src":"4760:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4742:6:111"},"nodeType":"YulFunctionCall","src":"4742:74:111"},"nodeType":"YulExpressionStatement","src":"4742:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4666:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4677:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4688:4:111","type":""}],"src":"4580:242:111"},{"body":{"nodeType":"YulBlock","src":"4908:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"4954:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4963:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4966:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4956:6:111"},"nodeType":"YulFunctionCall","src":"4956:12:111"},"nodeType":"YulExpressionStatement","src":"4956:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4929:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4938:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4925:3:111"},"nodeType":"YulFunctionCall","src":"4925:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4950:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4921:3:111"},"nodeType":"YulFunctionCall","src":"4921:32:111"},"nodeType":"YulIf","src":"4918:52:111"},{"nodeType":"YulAssignment","src":"4979:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4995:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4989:5:111"},"nodeType":"YulFunctionCall","src":"4989:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4979:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4874:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4885:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4897:6:111","type":""}],"src":"4827:184:111"},{"body":{"nodeType":"YulBlock","src":"5190:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5218:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5200:6:111"},"nodeType":"YulFunctionCall","src":"5200:21:111"},"nodeType":"YulExpressionStatement","src":"5200:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5252:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5237:3:111"},"nodeType":"YulFunctionCall","src":"5237:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5257:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5230:6:111"},"nodeType":"YulFunctionCall","src":"5230:30:111"},"nodeType":"YulExpressionStatement","src":"5230:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5291:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5276:3:111"},"nodeType":"YulFunctionCall","src":"5276:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"5296:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5269:6:111"},"nodeType":"YulFunctionCall","src":"5269:62:111"},"nodeType":"YulExpressionStatement","src":"5269:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5362:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5347:3:111"},"nodeType":"YulFunctionCall","src":"5347:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"5367:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5340:6:111"},"nodeType":"YulFunctionCall","src":"5340:36:111"},"nodeType":"YulExpressionStatement","src":"5340:36:111"},{"nodeType":"YulAssignment","src":"5385:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5408:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5393:3:111"},"nodeType":"YulFunctionCall","src":"5393:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5385:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5167:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5181:4:111","type":""}],"src":"5016:402:111"},{"body":{"nodeType":"YulBlock","src":"5597:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5614:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5625:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5607:6:111"},"nodeType":"YulFunctionCall","src":"5607:21:111"},"nodeType":"YulExpressionStatement","src":"5607:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5648:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5659:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5644:3:111"},"nodeType":"YulFunctionCall","src":"5644:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5664:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5637:6:111"},"nodeType":"YulFunctionCall","src":"5637:30:111"},"nodeType":"YulExpressionStatement","src":"5637:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5687:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5698:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5683:3:111"},"nodeType":"YulFunctionCall","src":"5683:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"5703:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5676:6:111"},"nodeType":"YulFunctionCall","src":"5676:62:111"},"nodeType":"YulExpressionStatement","src":"5676:62:111"},{"nodeType":"YulAssignment","src":"5747:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5770:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5755:3:111"},"nodeType":"YulFunctionCall","src":"5755:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5747:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5574:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5588:4:111","type":""}],"src":"5423:356:111"},{"body":{"nodeType":"YulBlock","src":"5958:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5975:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5986:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5968:6:111"},"nodeType":"YulFunctionCall","src":"5968:21:111"},"nodeType":"YulExpressionStatement","src":"5968:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6009:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6020:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6005:3:111"},"nodeType":"YulFunctionCall","src":"6005:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6025:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5998:6:111"},"nodeType":"YulFunctionCall","src":"5998:30:111"},"nodeType":"YulExpressionStatement","src":"5998:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6048:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6059:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6044:3:111"},"nodeType":"YulFunctionCall","src":"6044:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"6064:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6037:6:111"},"nodeType":"YulFunctionCall","src":"6037:51:111"},"nodeType":"YulExpressionStatement","src":"6037:51:111"},{"nodeType":"YulAssignment","src":"6097:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6109:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6120:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6105:3:111"},"nodeType":"YulFunctionCall","src":"6105:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6097:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5935:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5949:4:111","type":""}],"src":"5784:345:111"},{"body":{"nodeType":"YulBlock","src":"6308:163:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6336:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6318:6:111"},"nodeType":"YulFunctionCall","src":"6318:21:111"},"nodeType":"YulExpressionStatement","src":"6318:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6370:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6355:3:111"},"nodeType":"YulFunctionCall","src":"6355:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6375:2:111","type":"","value":"13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6348:6:111"},"nodeType":"YulFunctionCall","src":"6348:30:111"},"nodeType":"YulExpressionStatement","src":"6348:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6398:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6409:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6394:3:111"},"nodeType":"YulFunctionCall","src":"6394:18:111"},{"hexValue":"6d757374206f76657272696465","kind":"string","nodeType":"YulLiteral","src":"6414:15:111","type":"","value":"must override"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6387:6:111"},"nodeType":"YulFunctionCall","src":"6387:43:111"},"nodeType":"YulExpressionStatement","src":"6387:43:111"},{"nodeType":"YulAssignment","src":"6439:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6462:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6447:3:111"},"nodeType":"YulFunctionCall","src":"6447:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6439:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6285:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6299:4:111","type":""}],"src":"6134:337:111"},{"body":{"nodeType":"YulBlock","src":"6570:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6580:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"6619:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6606:12:111"},"nodeType":"YulFunctionCall","src":"6606:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"6584:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6779:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6788:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6791:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6781:6:111"},"nodeType":"YulFunctionCall","src":"6781:12:111"},"nodeType":"YulExpressionStatement","src":"6781:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"6654:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"6682:12:111"},"nodeType":"YulFunctionCall","src":"6682:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"6698:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6678:3:111"},"nodeType":"YulFunctionCall","src":"6678:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"6709:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6674:3:111"},"nodeType":"YulFunctionCall","src":"6674:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6650:3:111"},"nodeType":"YulFunctionCall","src":"6650:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6643:6:111"},"nodeType":"YulFunctionCall","src":"6643:135:111"},"nodeType":"YulIf","src":"6640:155:111"},{"nodeType":"YulVariableDeclaration","src":"6804:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"6822:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"6832:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6818:3:111"},"nodeType":"YulFunctionCall","src":"6818:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"6808:6:111","type":""}]},{"nodeType":"YulAssignment","src":"6860:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"6883:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6870:12:111"},"nodeType":"YulFunctionCall","src":"6870:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"6860:6:111"}]},{"body":{"nodeType":"YulBlock","src":"6933:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6942:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6945:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6935:6:111"},"nodeType":"YulFunctionCall","src":"6935:12:111"},"nodeType":"YulExpressionStatement","src":"6935:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"6905:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6913:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6902:2:111"},"nodeType":"YulFunctionCall","src":"6902:30:111"},"nodeType":"YulIf","src":"6899:50:111"},{"nodeType":"YulAssignment","src":"6958:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"6970:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6978:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6966:3:111"},"nodeType":"YulFunctionCall","src":"6966:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"6958:4:111"}]},{"body":{"nodeType":"YulBlock","src":"7034:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7043:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7046:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7036:6:111"},"nodeType":"YulFunctionCall","src":"7036:12:111"},"nodeType":"YulExpressionStatement","src":"7036:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"6999:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"7009:12:111"},"nodeType":"YulFunctionCall","src":"7009:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"7025:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7005:3:111"},"nodeType":"YulFunctionCall","src":"7005:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"6995:3:111"},"nodeType":"YulFunctionCall","src":"6995:38:111"},"nodeType":"YulIf","src":"6992:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"6527:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"6537:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"6553:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6559:6:111","type":""}],"src":"6476:580:111"},{"body":{"nodeType":"YulBlock","src":"7191:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"7229:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7238:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7241:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7231:6:111"},"nodeType":"YulFunctionCall","src":"7231:12:111"},"nodeType":"YulExpressionStatement","src":"7231:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"7207:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"7219:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7204:2:111"},"nodeType":"YulFunctionCall","src":"7204:24:111"},"nodeType":"YulIf","src":"7201:44:111"},{"body":{"nodeType":"YulBlock","src":"7278:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7287:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7290:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7280:6:111"},"nodeType":"YulFunctionCall","src":"7280:12:111"},"nodeType":"YulExpressionStatement","src":"7280:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7260:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"7270:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7257:2:111"},"nodeType":"YulFunctionCall","src":"7257:20:111"},"nodeType":"YulIf","src":"7254:40:111"},{"nodeType":"YulAssignment","src":"7303:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7320:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7328:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7316:3:111"},"nodeType":"YulFunctionCall","src":"7316:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"7303:9:111"}]},{"nodeType":"YulAssignment","src":"7348:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"7365:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"7375:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7361:3:111"},"nodeType":"YulFunctionCall","src":"7361:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"7348:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"7125:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"7133:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"7141:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"7153:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"7166:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"7177:9:111","type":""}],"src":"7061:331:111"},{"body":{"nodeType":"YulBlock","src":"7445:119:111","statements":[{"nodeType":"YulAssignment","src":"7455:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7477:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7464:12:111"},"nodeType":"YulFunctionCall","src":"7464:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"7455:5:111"}]},{"body":{"nodeType":"YulBlock","src":"7542:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7551:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7554:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7544:6:111"},"nodeType":"YulFunctionCall","src":"7544:12:111"},"nodeType":"YulExpressionStatement","src":"7544:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7506:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7517:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7524:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7513:3:111"},"nodeType":"YulFunctionCall","src":"7513:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"7503:2:111"},"nodeType":"YulFunctionCall","src":"7503:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7496:6:111"},"nodeType":"YulFunctionCall","src":"7496:45:111"},"nodeType":"YulIf","src":"7493:65:111"}]},"name":"abi_decode_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"7424:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"7435:5:111","type":""}],"src":"7397:167:111"},{"body":{"nodeType":"YulBlock","src":"7654:171:111","statements":[{"body":{"nodeType":"YulBlock","src":"7700:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7709:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7712:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7702:6:111"},"nodeType":"YulFunctionCall","src":"7702:12:111"},"nodeType":"YulExpressionStatement","src":"7702:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7675:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"7684:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7671:3:111"},"nodeType":"YulFunctionCall","src":"7671:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"7696:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7667:3:111"},"nodeType":"YulFunctionCall","src":"7667:32:111"},"nodeType":"YulIf","src":"7664:52:111"},{"nodeType":"YulAssignment","src":"7725:38:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7753:9:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7735:17:111"},"nodeType":"YulFunctionCall","src":"7735:28:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7725:6:111"}]},{"nodeType":"YulAssignment","src":"7772:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7804:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7815:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7800:3:111"},"nodeType":"YulFunctionCall","src":"7800:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"7782:17:111"},"nodeType":"YulFunctionCall","src":"7782:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7772:6:111"}]}]},"name":"abi_decode_tuple_t_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7612:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7623:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7635:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7643:6:111","type":""}],"src":"7569:256:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n let length := mload(value0)\n mstore(add(headStart, 64), length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n mstore(add(add(headStart, i), 96), mload(add(add(value0, i), 0x20)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 96), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n mstore(add(headStart, 0x20), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 13)\n mstore(add(headStart, 64), \"must override\")\n tail := add(headStart, 96)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function abi_decode_uint48(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint48t_uint48(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_uint48(headStart)\n value1 := abi_decode_uint48(add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":409},{"length":32,"start":677},{"length":32,"start":879},{"length":32,"start":1003},{"length":32,"start":1202},{"length":32,"start":1346},{"length":32,"start":1525},{"length":32,"start":2108}]},"linkReferences":{},"object":"6080604052600436106100c75760003560e01c8063bb9fe6bf11610074578063d0e30db01161004e578063d0e30db014610213578063f2fde38b1461021b578063f465c77e1461023b57600080fd5b8063bb9fe6bf146101bb578063c23a5cea146101d0578063c399ec88146101f057600080fd5b80638da5cb5b116100a55780638da5cb5b14610116578063a9a2340914610167578063b0d691fe1461018757600080fd5b80630396cb60146100cc578063205c2878146100e1578063715018a614610101575b600080fd5b6100df6100da3660046109b8565b610269565b005b3480156100ed57600080fd5b506100df6100fc366004610a07565b61031b565b34801561010d57600080fd5b506100df6103b3565b34801561012257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017357600080fd5b506100df610182366004610a33565b6103c7565b34801561019357600080fd5b5061013d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101c757600080fd5b506100df6103e1565b3480156101dc57600080fd5b506100df6101eb366004610ac2565b610465565b3480156101fc57600080fd5b50610205610511565b60405190815260200161015e565b6100df6105c7565b34801561022757600080fd5b506100df610236366004610ac2565b61064f565b34801561024757600080fd5b5061025b610256366004610adf565b61070b565b60405161015e929190610b33565b61027161072e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050565b61032361072e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156102ff57600080fd5b6103bb61072e565b6103c560006107af565b565b6103cf610824565b6103db848484846108c3565b50505050565b6103e961072e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561045157600080fd5b505af11580156103db573d6000803e3d6000fd5b61046d61072e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156104f657600080fd5b505af115801561050a573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190610bae565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156104f657600080fd5b61065761072e565b73ffffffffffffffffffffffffffffffffffffffff81166106ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610708816107af565b50565b60606000610717610824565b610722858585610925565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f6565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016106f6565b606060008080610939610120880188610bc7565b610947916014908290610c33565b8101906109549190610c78565b9150915061096460008284610980565b6040805160208101909152600081529890975095505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b856109a85760006109ab565b60015b60ff161717949350505050565b6000602082840312156109ca57600080fd5b813563ffffffff811681146109de57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461070857600080fd5b60008060408385031215610a1a57600080fd5b8235610a25816109e5565b946020939093013593505050565b60008060008060608587031215610a4957600080fd5b843560038110610a5857600080fd5b9350602085013567ffffffffffffffff80821115610a7557600080fd5b818701915087601f830112610a8957600080fd5b813581811115610a9857600080fd5b886020828501011115610aaa57600080fd5b95986020929092019750949560400135945092505050565b600060208284031215610ad457600080fd5b81356109de816109e5565b600080600060608486031215610af457600080fd5b833567ffffffffffffffff811115610b0b57600080fd5b84016101608187031215610b1e57600080fd5b95602085013595506040909401359392505050565b604081526000835180604084015260005b81811015610b615760208187018101516060868401015201610b44565b81811115610b73576000606083860101525b50602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b600060208284031215610bc057600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610bfc57600080fd5b83018035915067ffffffffffffffff821115610c1757600080fd5b602001915036819003821315610c2c57600080fd5b9250929050565b60008085851115610c4357600080fd5b83861115610c5057600080fd5b5050820193919092039150565b803565ffffffffffff81168114610c7357600080fd5b919050565b60008060408385031215610c8b57600080fd5b610c9483610c5d565b9150610ca260208401610c5d565b9050925092905056fea2646970667358221220208ca60649458b6e2e2064f88cb5d863ae4caeb16da0aebf00e59a61805014e264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC7 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x23B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x101 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x269 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0xA07 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3B3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0xA33 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3E1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xAC2 JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x205 PUSH2 0x511 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x15E JUMP JUMPDEST PUSH2 0xDF PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x236 CALLDATASIZE PUSH1 0x4 PUSH2 0xAC2 JUMP JUMPDEST PUSH2 0x64F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25B PUSH2 0x256 CALLDATASIZE PUSH1 0x4 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP3 SWAP2 SWAP1 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x271 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x323 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BB PUSH2 0x72E JUMP JUMPDEST PUSH2 0x3C5 PUSH1 0x0 PUSH2 0x7AF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3CF PUSH2 0x824 JUMP JUMPDEST PUSH2 0x3DB DUP5 DUP5 DUP5 DUP5 PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3E9 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x46D PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x50A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x59E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0xBAE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x657 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x708 DUP2 PUSH2 0x7AF JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x717 PUSH2 0x824 JUMP JUMPDEST PUSH2 0x722 DUP6 DUP6 DUP6 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 PUSH2 0x939 PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0xBC7 JUMP JUMPDEST PUSH2 0x947 SWAP2 PUSH1 0x14 SWAP1 DUP3 SWAP1 PUSH2 0xC33 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x954 SWAP2 SWAP1 PUSH2 0xC78 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x964 PUSH1 0x0 DUP3 DUP5 PUSH2 0x980 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP9 SWAP1 SWAP8 POP SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x9A8 JUMPI PUSH1 0x0 PUSH2 0x9AB JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x9DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x708 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xA1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0xA25 DUP2 PUSH2 0x9E5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xA49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0xA58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xA98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xAAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xAD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x9DE DUP2 PUSH2 0x9E5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xAF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xB1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 DUP4 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB61 JUMPI PUSH1 0x20 DUP2 DUP8 ADD DUP2 ADD MLOAD PUSH1 0x60 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0xB44 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xB73 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP7 ADD ADD MSTORE JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE POP PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD PUSH1 0x60 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xBFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xC2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0xC43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0xC50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xC73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC94 DUP4 PUSH2 0xC5D JUMP JUMPDEST SWAP2 POP PUSH2 0xCA2 PUSH1 0x20 DUP5 ADD PUSH2 0xC5D JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 DUP13 0xA6 MOD 0x49 GASLIMIT DUP12 PUSH15 0x2E2064F88CB5D863AE4CAEB16DA0AE 0xBF STOP 0xE5 SWAP11 PUSH2 0x8050 EQ 0xE2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"199:620:95:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;1831:101:24:-;;;;;;;;;;;;;:::i;1201:85::-;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;;974:42:111;962:55;;;944:74;;932:2;917:18;1201:85:24;;;;;;;;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;:::-;;;2519:25:111;;;2507:2;2492:18;3318:111:52;2373:177:111;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;4239:10:111;4227:23;;3173:55:52::1;::::0;::::1;4209:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;4182:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;4470:55:111::0;;;2817:46:52::1;::::0;::::1;4452:74:111::0;4542:18;;;4535:34;;;2817:10:52::1;:21;::::0;::::1;::::0;4425:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1831:101:24::0;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;962:55:111::0;;;3975:41:52::1;::::0;::::1;944:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;917:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;944:74:111;3361:7:52;;3387:10;:20;;;;;917:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;944:74:111;2518:10:52;:20;;;;;2547:9;;917:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;5218:2:111;2161:73:24::1;::::0;::::1;5200:21:111::0;5257:2;5237:18;;;5230:30;5296:34;5276:18;;;5269:62;5367:8;5347:18;;;5340:36;5393:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;5625:2:111;1414:68:24;;;5607:21:111;;;5644:18;;;5637:30;5703:34;5683:18;;;5676:62;5755:18;;1414:68:24;5423:356:111;2433:187:24;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;5986:2:111;4148:67:52;;;5968:21:111;6025:2;6005:18;;;5998:30;6064:23;6044:18;;;6037:51;6105:18;;4148:67:52;5784:345:111;2089:285:52;2344:23;;;;;6336:2:111;2344:23:52;;;6318:21:111;6375:2;6355:18;;;6348:30;6414:15;6394:18;;;6387:43;6447:18;;2344:23:52;6134:337:111;366:451:95;516:20;538:22;;;663:23;;;;:6;:23;:::i;:::-;:29;;687:2;;663:29;;;:::i;:::-;652:59;;;;;;;:::i;:::-;611:100;;;;738:50;758:5;765:10;777;738:19;:50::i;:::-;798:12;;;;;;;;;-1:-1:-1;798:12:95;;;721:67;;-1:-1:-1;366:451:95;-1:-1:-1;;;;;;366:451:95:o;2956:218:54:-;3053:7;3157:8;3141:10;3133:19;;:33;;3125:3;3110:10;3102:19;;:26;;3080:9;:17;;3096:1;3080:17;;;3092:1;3080:17;3079:50;;;:88;;2956:218;-1:-1:-1;;;;2956:218:54:o;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1029:819::-;1133:6;1141;1149;1157;1210:2;1198:9;1189:7;1185:23;1181:32;1178:52;;;1226:1;1223;1216:12;1178:52;1265:9;1252:23;1304:1;1297:5;1294:12;1284:40;;1320:1;1317;1310:12;1284:40;1343:5;-1:-1:-1;1399:2:111;1384:18;;1371:32;1422:18;1452:14;;;1449:34;;;1479:1;1476;1469:12;1449:34;1517:6;1506:9;1502:22;1492:32;;1562:7;1555:4;1551:2;1547:13;1543:27;1533:55;;1584:1;1581;1574:12;1533:55;1624:2;1611:16;1650:2;1642:6;1639:14;1636:34;;;1666:1;1663;1656:12;1636:34;1711:7;1706:2;1697:6;1693:2;1689:15;1685:24;1682:37;1679:57;;;1732:1;1729;1722:12;1679:57;1029:819;;1763:2;1755:11;;;;;-1:-1:-1;1785:6:111;;1838:2;1823:18;1810:32;;-1:-1:-1;1029:819:111;-1:-1:-1;;;1029:819:111:o;2105:263::-;2172:6;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2280:9;2267:23;2299:39;2332:5;2299:39;:::i;2815:530::-;2926:6;2934;2942;2995:2;2983:9;2974:7;2970:23;2966:32;2963:52;;;3011:1;3008;3001:12;2963:52;3051:9;3038:23;3084:18;3076:6;3073:30;3070:50;;;3116:1;3113;3106:12;3070:50;3139:22;;3195:3;3177:16;;;3173:26;3170:46;;;3212:1;3209;3202:12;3170:46;3235:2;3284;3269:18;;3256:32;;-1:-1:-1;3335:2:111;3320:18;;;3307:32;;2815:530;-1:-1:-1;;;2815:530:111:o;3350:710::-;3525:2;3514:9;3507:21;3488:4;3557:6;3551:13;3600:6;3595:2;3584:9;3580:18;3573:34;3625:1;3635:144;3649:6;3646:1;3643:13;3635:144;;;3762:4;3746:14;;;3742:25;;3736:32;3731:2;3712:17;;;3708:26;3701:68;3664:12;3635:144;;;3797:6;3794:1;3791:13;3788:91;;;3867:1;3862:2;3853:6;3842:9;3838:22;3834:31;3827:42;3788:91;-1:-1:-1;4040:4:111;4025:20;;4018:36;;;;-1:-1:-1;3931:2:111;3919:15;;;;3936:66;3915:88;3900:104;4006:2;3896:113;;3350:710;-1:-1:-1;3350:710:111:o;4827:184::-;4897:6;4950:2;4938:9;4929:7;4925:23;4921:32;4918:52;;;4966:1;4963;4956:12;4918:52;-1:-1:-1;4989:16:111;;4827:184;-1:-1:-1;4827:184:111:o;6476:580::-;6553:4;6559:6;6619:11;6606:25;6709:66;6698:8;6682:14;6678:29;6674:102;6654:18;6650:127;6640:155;;6791:1;6788;6781:12;6640:155;6818:33;;6870:20;;;-1:-1:-1;6913:18:111;6902:30;;6899:50;;;6945:1;6942;6935:12;6899:50;6978:4;6966:17;;-1:-1:-1;7009:14:111;7005:27;;;6995:38;;6992:58;;;7046:1;7043;7036:12;6992:58;6476:580;;;;;:::o;7061:331::-;7166:9;7177;7219:8;7207:10;7204:24;7201:44;;;7241:1;7238;7231:12;7201:44;7270:6;7260:8;7257:20;7254:40;;;7290:1;7287;7280:12;7254:40;-1:-1:-1;;7316:23:111;;;7361:25;;;;;-1:-1:-1;7061:331:111:o;7397:167::-;7464:20;;7524:14;7513:26;;7503:37;;7493:65;;7554:1;7551;7544:12;7493:65;7397:167;;;:::o;7569:256::-;7635:6;7643;7696:2;7684:9;7675:7;7671:23;7667:32;7664:52;;;7712:1;7709;7702:12;7664:52;7735:28;7753:9;7735:28;:::i;:::-;7725:38;;7782:37;7815:2;7804:9;7800:18;7782:37;:::i;:::-;7772:47;;7569:256;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"659400","executionCost":"infinite","totalCost":"infinite"},"external":{"addStake(uint32)":"infinite","deposit()":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","owner()":"2308","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockStake()":"infinite","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite"}},"methodIdentifiers":{"addStake(uint32)":"0396cb60","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"test expiry mechanism: paymasterData encodes the \\\"validUntil\\\" and validAfter\\\" times\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestExpirePaymaster.sol\":\"TestExpirePaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/test/TestExpirePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\n\\n/**\\n * test expiry mechanism: paymasterData encodes the \\\"validUntil\\\" and validAfter\\\" times\\n */\\ncontract TestExpirePaymaster is BasePaymaster {\\n // solhint-disable no-empty-blocks\\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint)\\n {}\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual override view\\n returns (bytes memory context, uint256 validationData) {\\n (userOp, userOpHash, maxCost);\\n (uint48 validAfter, uint48 validUntil) = abi.decode(userOp.paymasterAndData[20 :], (uint48, uint48));\\n validationData = _packValidationData(false, validUntil, validAfter);\\n context = \\\"\\\";\\n }\\n}\\n\",\"keccak256\":\"0x1ebcecfc4ceaea25a1c049b711ddf419e7f16b8d891ec74bf18ab722267c2e44\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/test/TestExpirePaymaster.sol:TestExpirePaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"test expiry mechanism: paymasterData encodes the \"validUntil\" and validAfter\" times","version":1}}},"contracts/test/TestExpiryAccount.sol":{"TestExpiryAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SimpleAccountInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint48","name":"_after","type":"uint48"},{"internalType":"uint48","name":"_until","type":"uint48"}],"name":"addTemporaryOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"anOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerAfter","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerUntil","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"initialize(address)":{"details":"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`"},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"withdrawDepositTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13884":{"entryPoint":null,"id":13884,"parameterSlots":1,"returnSlots":0},"@_19705":{"entryPoint":null,"id":19705,"parameterSlots":1,"returnSlots":0},"@_disableInitializers_19735":{"entryPoint":null,"id":19735,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":70,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60c06040523060805234801561001457600080fd5b50604051620025ba380380620025ba83398101604081905261003591610046565b6001600160a01b031660a052610076565b60006020828403121561005857600080fd5b81516001600160a01b038116811461006f57600080fd5b9392505050565b60805160a0516124d1620000e9600039600081816103f101528181610915015281816109bc01528181610d92015281816110b5015281816110fc0152818161140001526116ab015260008181610733015281816107c901528181610a8001528181610b160152610c4501526124d16000f3fe60806040526004361061016d5760003560e01c80634f1ef286116100cb578063bc197c811161007f578063cf6dca5511610059578063cf6dca55146104b2578063d087d288146104d2578063f23a6e61146104e757600080fd5b8063bc197c8114610435578063c399ec881461047d578063c4d66de81461049257600080fd5b80638da5cb5b116100b05780638da5cb5b1461038a578063b0d691fe146103e2578063b61d27f61461041557600080fd5b80634f1ef2861461036257806352d1902d1461037557600080fd5b80633a871cdd116101225780633fb5a7a1116101075780633fb5a7a1146103055780634a58db191461033a5780634d44560d1461034257600080fd5b80633a871cdd1461028b5780633e476951146102b957600080fd5b8063150b7a0211610153578063150b7a02146101d557806318dfb3c71461024b5780633659cfe61461026b57600080fd5b806223de291461017957806301ffc9a7146101a057600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019e610194366004611d11565b5050505050505050565b005b3480156101ac57600080fd5b506101c06101bb366004611dc2565b61052d565b60405190151581526020015b60405180910390f35b3480156101e157600080fd5b5061021a6101f0366004611e04565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101cc565b34801561025757600080fd5b5061019e610266366004611ebc565b610612565b34801561027757600080fd5b5061019e610286366004611f28565b61071c565b34801561029757600080fd5b506102ab6102a6366004611f45565b6108ed565b6040519081526020016101cc565b3480156102c557600080fd5b506102ee6102d4366004611f28565b60026020526000908152604090205465ffffffffffff1681565b60405165ffffffffffff90911681526020016101cc565b34801561031157600080fd5b506102ee610320366004611f28565b60016020526000908152604090205465ffffffffffff1681565b61019e610913565b34801561034e57600080fd5b5061019e61035d366004611f99565b6109b2565b61019e610370366004611ff4565b610a69565b34801561038157600080fd5b506102ab610c2b565b34801561039657600080fd5b506000546103bd9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b3480156103ee57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103bd565b34801561042157600080fd5b5061019e6104303660046120d6565b610cfd565b34801561044157600080fd5b5061021a610450366004612126565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561048957600080fd5b506102ab610d4c565b34801561049e57600080fd5b5061019e6104ad366004611f28565b610e03565b3480156104be57600080fd5b5061019e6104cd3660046121df565b610f8e565b3480156104de57600080fd5b506102ab611068565b3480156104f357600080fd5b5061021a610502366004612224565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806105c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061060c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61061a6110e4565b82811461066e5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156107155761070385858381811061068e5761068e6122a0565b90506020020160208101906106a39190611f28565b60008585858181106106b7576106b76122a0565b90506020028101906106c991906122cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119392505050565b8061070d81612334565b915050610671565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107c75760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661083c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108c55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b6108ce81611210565b604080516000808252602082019092526108ea91839190611218565b50565b60006108f76113e8565b610901848461146d565b905061090c82611573565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561099e57600080fd5b505af1158015610715573d6000803e3d6000fd5b6109ba6115de565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b145760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b897f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c125760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b610c1b82611210565b610c2782826001611218565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cd85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610665565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d056110e4565b610d46848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119392505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe9190612393565b905090565b600054610100900460ff1615808015610e235750600054600160ff909116105b80610e3d5750303b158015610e3d575060005460ff166001145b610eaf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f1682611655565b610f2882600065ffffffffffff610f8e565b8015610c2757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b610f966115de565b8165ffffffffffff168165ffffffffffff1611610ff55760405162461bcd60e51b815260206004820152601160248201527f77726f6e6720756e74696c2f61667465720000000000000000000000000000006044820152606401610665565b73ffffffffffffffffffffffffffffffffffffffff929092166000908152600160209081526040808320805465ffffffffffff9586167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009182161790915560029092529091208054929093169116179055565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dbd565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611145575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b6111915760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610665565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516111bc91906123d8565b60006040518083038185875af1925050503d80600081146111f9576040519150601f19603f3d011682016040523d82523d6000602084013e6111fe565b606091505b50915091508161071557805160208201fd5b6108ea6115de565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156112505761124b836116f4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112d5575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112d291810190612393565b60015b6113475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146113dc5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610665565b5061124b8383836117e4565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146111915760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610665565b6000806114c7836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006115196114dc6101408701876122cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506118099050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602090815260408083205460019092529091205491925065ffffffffffff9081169116811561156781848461182d565b98975050505050505050565b80156108ea5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e610715565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061160957503330145b6111915760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610665565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b61177e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6117ed83611865565b6000825111806117fa5750805b1561124b57610d4683836118b2565b600080600061181885856118d7565b915091506118258161191c565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85611855576000611858565b60015b60ff161717949350505050565b61186e816116f4565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061090c838360405180606001604052806027815260200161247560279139611a81565b600080825160410361190d5760208301516040840151606085015160001a61190187828585611b06565b94509450505050611915565b506000905060025b9250929050565b6000816004811115611930576119306123f4565b036119385750565b600181600481111561194c5761194c6123f4565b036119995760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610665565b60028160048111156119ad576119ad6123f4565b036119fa5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610665565b6003816004811115611a0e57611a0e6123f4565b036108ea5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610665565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611aab91906123d8565b600060405180830381855af49150503d8060008114611ae6576040519150601f19603f3d011682016040523d82523d6000602084013e611aeb565b606091505b5091509150611afc86838387611bf5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b3d5750600090506003611bec565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611b91573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611be557600060019250925050611bec565b9150600090505b94509492505050565b60608315611c71578251600003611c6a5773ffffffffffffffffffffffffffffffffffffffff85163b611c6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610665565b5081611c7b565b611c7b8383611c83565b949350505050565b815115611c935781518083602001fd5b8060405162461bcd60e51b81526004016106659190612423565b73ffffffffffffffffffffffffffffffffffffffff811681146108ea57600080fd5b60008083601f840112611ce157600080fd5b50813567ffffffffffffffff811115611cf957600080fd5b60208301915083602082850101111561191557600080fd5b60008060008060008060008060c0898b031215611d2d57600080fd5b8835611d3881611cad565b97506020890135611d4881611cad565b96506040890135611d5881611cad565b955060608901359450608089013567ffffffffffffffff80821115611d7c57600080fd5b611d888c838d01611ccf565b909650945060a08b0135915080821115611da157600080fd5b50611dae8b828c01611ccf565b999c989b5096995094979396929594505050565b600060208284031215611dd457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461090c57600080fd5b600080600080600060808688031215611e1c57600080fd5b8535611e2781611cad565b94506020860135611e3781611cad565b935060408601359250606086013567ffffffffffffffff811115611e5a57600080fd5b611e6688828901611ccf565b969995985093965092949392505050565b60008083601f840112611e8957600080fd5b50813567ffffffffffffffff811115611ea157600080fd5b6020830191508360208260051b850101111561191557600080fd5b60008060008060408587031215611ed257600080fd5b843567ffffffffffffffff80821115611eea57600080fd5b611ef688838901611e77565b90965094506020870135915080821115611f0f57600080fd5b50611f1c87828801611e77565b95989497509550505050565b600060208284031215611f3a57600080fd5b813561090c81611cad565b600080600060608486031215611f5a57600080fd5b833567ffffffffffffffff811115611f7157600080fd5b84016101608187031215611f8457600080fd5b95602085013595506040909401359392505050565b60008060408385031215611fac57600080fd5b8235611fb781611cad565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561200757600080fd5b823561201281611cad565b9150602083013567ffffffffffffffff8082111561202f57600080fd5b818501915085601f83011261204357600080fd5b81358181111561205557612055611fc5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561209b5761209b611fc5565b816040528281528860208487010111156120b457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600080606085870312156120ec57600080fd5b84356120f781611cad565b935060208501359250604085013567ffffffffffffffff81111561211a57600080fd5b611f1c87828801611ccf565b60008060008060008060008060a0898b03121561214257600080fd5b883561214d81611cad565b9750602089013561215d81611cad565b9650604089013567ffffffffffffffff8082111561217a57600080fd5b6121868c838d01611e77565b909850965060608b013591508082111561219f57600080fd5b6121ab8c838d01611e77565b909650945060808b0135915080821115611da157600080fd5b803565ffffffffffff811681146121da57600080fd5b919050565b6000806000606084860312156121f457600080fd5b83356121ff81611cad565b925061220d602085016121c4565b915061221b604085016121c4565b90509250925092565b60008060008060008060a0878903121561223d57600080fd5b863561224881611cad565b9550602087013561225881611cad565b94506040870135935060608701359250608087013567ffffffffffffffff81111561228257600080fd5b61228e89828a01611ccf565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230457600080fd5b83018035915067ffffffffffffffff82111561231f57600080fd5b60200191503681900382131561191557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361238c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156123a557600080fd5b5051919050565b60005b838110156123c75781810151838201526020016123af565b83811115610d465750506000910152565b600082516123ea8184602087016123ac565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526124428160408501602087016123ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122035f15871df579f48453cdeb0e8dca0c528583a84b556fd1f9ed9ff8b0f91532b64736f6c634300080f0033","opcodes":"PUSH1 0xC0 PUSH1 0x40 MSTORE ADDRESS PUSH1 0x80 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x25BA CODESIZE SUB DUP1 PUSH3 0x25BA DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x35 SWAP2 PUSH2 0x46 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xA0 MSTORE PUSH2 0x76 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x24D1 PUSH3 0xE9 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x3F1 ADD MSTORE DUP2 DUP2 PUSH2 0x915 ADD MSTORE DUP2 DUP2 PUSH2 0x9BC ADD MSTORE DUP2 DUP2 PUSH2 0xD92 ADD MSTORE DUP2 DUP2 PUSH2 0x10B5 ADD MSTORE DUP2 DUP2 PUSH2 0x10FC ADD MSTORE DUP2 DUP2 PUSH2 0x1400 ADD MSTORE PUSH2 0x16AB ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x733 ADD MSTORE DUP2 DUP2 PUSH2 0x7C9 ADD MSTORE DUP2 DUP2 PUSH2 0xA80 ADD MSTORE DUP2 DUP2 PUSH2 0xB16 ADD MSTORE PUSH2 0xC45 ADD MSTORE PUSH2 0x24D1 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x16D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F1EF286 GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xCF6DCA55 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xCF6DCA55 EQ PUSH2 0x4B2 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x435 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x38A JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3E2 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3A871CDD GT PUSH2 0x122 JUMPI DUP1 PUSH4 0x3FB5A7A1 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x3FB5A7A1 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x3E476951 EQ PUSH2 0x2B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x153 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x174 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D11 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C0 PUSH2 0x1BB CALLDATASIZE PUSH1 0x4 PUSH2 0x1DC2 JUMP JUMPDEST PUSH2 0x52D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E04 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EBC JUMP JUMPDEST PUSH2 0x612 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH2 0x71C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0x2A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F45 JUMP JUMPDEST PUSH2 0x8ED JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EE PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x311 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EE PUSH2 0x320 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x19E PUSH2 0x913 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x35D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F99 JUMP JUMPDEST PUSH2 0x9B2 JUMP JUMPDEST PUSH2 0x19E PUSH2 0x370 CALLDATASIZE PUSH1 0x4 PUSH2 0x1FF4 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0xC2B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x396 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x3BD SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x3BD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x430 CALLDATASIZE PUSH1 0x4 PUSH2 0x20D6 JUMP JUMPDEST PUSH2 0xCFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x450 CALLDATASIZE PUSH1 0x4 PUSH2 0x2126 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0xD4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH2 0xE03 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4CD CALLDATASIZE PUSH1 0x4 PUSH2 0x21DF JUMP JUMPDEST PUSH2 0xF8E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0x1068 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x502 CALLDATASIZE PUSH1 0x4 PUSH2 0x2224 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x5C0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x60C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x61A PUSH2 0x10E4 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x66E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x715 JUMPI PUSH2 0x703 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x68E JUMPI PUSH2 0x68E PUSH2 0x22A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x6A3 SWAP2 SWAP1 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x22A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x6C9 SWAP2 SWAP1 PUSH2 0x22CF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1193 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x70D DUP2 PUSH2 0x2334 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x7C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x83C PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0x8CE DUP2 PUSH2 0x1210 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x8EA SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1218 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8F7 PUSH2 0x13E8 JUMP JUMPDEST PUSH2 0x901 DUP5 DUP5 PUSH2 0x146D JUMP JUMPDEST SWAP1 POP PUSH2 0x90C DUP3 PUSH2 0x1573 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9BA PUSH2 0x15DE JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB89 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC12 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0xC1B DUP3 PUSH2 0x1210 JUMP JUMPDEST PUSH2 0xC27 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1218 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD05 PUSH2 0x10E4 JUMP JUMPDEST PUSH2 0xD46 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1193 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDDA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDFE SWAP2 SWAP1 PUSH2 0x2393 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE23 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE3D JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE3D JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xEAF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF0D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF16 DUP3 PUSH2 0x1655 JUMP JUMPDEST PUSH2 0xF28 DUP3 PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF PUSH2 0xF8E JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC27 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0xF96 PUSH2 0x15DE JUMP JUMPDEST DUP2 PUSH6 0xFFFFFFFFFFFF AND DUP2 PUSH6 0xFFFFFFFFFFFF AND GT PUSH2 0xFF5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E6720756E74696C2F6166746572000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH6 0xFFFFFFFFFFFF SWAP6 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDBD JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x1145 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x11BC SWAP2 SWAP1 PUSH2 0x23D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x11F9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x11FE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x715 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x8EA PUSH2 0x15DE JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1250 JUMPI PUSH2 0x124B DUP4 PUSH2 0x16F4 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x12D5 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x12D2 SWAP2 DUP2 ADD SWAP1 PUSH2 0x2393 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1347 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x13DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH2 0x124B DUP4 DUP4 DUP4 PUSH2 0x17E4 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x14C7 DUP4 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1519 PUSH2 0x14DC PUSH2 0x140 DUP8 ADD DUP8 PUSH2 0x22CF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP7 SWAP4 SWAP3 POP POP PUSH2 0x1809 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x1 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP2 SWAP3 POP PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND DUP2 ISZERO PUSH2 0x1567 DUP2 DUP5 DUP5 PUSH2 0x182D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8EA JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x715 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x715 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x1609 JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x177E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x17ED DUP4 PUSH2 0x1865 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x17FA JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x124B JUMPI PUSH2 0xD46 DUP4 DUP4 PUSH2 0x18B2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1818 DUP6 DUP6 PUSH2 0x18D7 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1825 DUP2 PUSH2 0x191C JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x1855 JUMPI PUSH1 0x0 PUSH2 0x1858 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x186E DUP2 PUSH2 0x16F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x90C DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2475 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A81 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x190D JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x1901 DUP8 DUP3 DUP6 DUP6 PUSH2 0x1B06 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x1915 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1930 JUMPI PUSH2 0x1930 PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x1938 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x194C JUMPI PUSH2 0x194C PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x1999 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x19AD JUMPI PUSH2 0x19AD PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x19FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1A0E JUMPI PUSH2 0x1A0E PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x8EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1AAB SWAP2 SWAP1 PUSH2 0x23D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1AE6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1AEB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1AFC DUP7 DUP4 DUP4 DUP8 PUSH2 0x1BF5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1B3D JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1BE5 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x1BEC JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1C71 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1C6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1C6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP DUP2 PUSH2 0x1C7B JUMP JUMPDEST PUSH2 0x1C7B DUP4 DUP4 PUSH2 0x1C83 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1C93 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x2423 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x8EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1D2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1D38 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1D48 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1D58 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D88 DUP13 DUP4 DUP14 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DAE DUP12 DUP3 DUP13 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1DD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1E27 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1E37 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E66 DUP9 DUP3 DUP10 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1E89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1ED2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EF6 DUP9 DUP4 DUP10 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1F0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F1C DUP8 DUP3 DUP9 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x90C DUP2 PUSH2 0x1CAD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1FAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1FB7 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2007 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2012 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x202F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2055 JUMPI PUSH2 0x2055 PUSH2 0x1FC5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x209B JUMPI PUSH2 0x209B PUSH2 0x1FC5 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x20B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x20EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x20F7 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x211A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F1C DUP8 DUP3 DUP9 ADD PUSH2 0x1CCF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x2142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x214D DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x215D DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x217A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2186 DUP13 DUP4 DUP14 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x219F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21AB DUP13 DUP4 DUP14 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x21DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x21F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x21FF DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP3 POP PUSH2 0x220D PUSH1 0x20 DUP6 ADD PUSH2 0x21C4 JUMP JUMPDEST SWAP2 POP PUSH2 0x221B PUSH1 0x40 DUP6 ADD PUSH2 0x21C4 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x223D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2248 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2258 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x228E DUP10 DUP3 DUP11 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2304 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x231F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x238C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x23C7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x23AF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD46 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x23EA DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x23AC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2442 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x23AC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x7066735822122035F158 PUSH18 0xDF579F48453CDEB0E8DCA0C528583A84B556 REVERT 0x1F SWAP15 0xD9 SELFDESTRUCT DUP12 0xF SWAP2 MSTORE8 0x2B PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"480:1492:96:-:0;;;1088:4:32;1045:48;;710:68:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1278:26:73;;;480:1492:96;;14:311:111;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;480:1492:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_13870":{"entryPoint":null,"id":13870,"parameterSlots":0,"returnSlots":0},"@_authorizeUpgrade_14140":{"entryPoint":4624,"id":14140,"parameterSlots":1,"returnSlots":0},"@_call_14076":{"entryPoint":4499,"id":14076,"parameterSlots":3,"returnSlots":0},"@_getImplementation_3026":{"entryPoint":null,"id":3026,"parameterSlots":0,"returnSlots":1},"@_initialize_13998":{"entryPoint":5717,"id":13998,"parameterSlots":1,"returnSlots":0},"@_onlyOwner_13904":{"entryPoint":5598,"id":13904,"parameterSlots":0,"returnSlots":0},"@_packValidationData_9980":{"entryPoint":6189,"id":9980,"parameterSlots":3,"returnSlots":1},"@_payPrefund_7307":{"entryPoint":5491,"id":7307,"parameterSlots":1,"returnSlots":0},"@_requireFromEntryPointOrOwner_14019":{"entryPoint":4324,"id":14019,"parameterSlots":0,"returnSlots":0},"@_requireFromEntryPoint_7256":{"entryPoint":5096,"id":7256,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":7299,"id":5128,"parameterSlots":2,"returnSlots":0},"@_setImplementation_3050":{"entryPoint":5876,"id":3050,"parameterSlots":1,"returnSlots":0},"@_throwError_5521":{"entryPoint":6428,"id":5521,"parameterSlots":1,"returnSlots":0},"@_upgradeToAndCallUUPS_3148":{"entryPoint":4632,"id":3148,"parameterSlots":3,"returnSlots":0},"@_upgradeToAndCall_3095":{"entryPoint":6116,"id":3095,"parameterSlots":3,"returnSlots":0},"@_upgradeTo_3065":{"entryPoint":6245,"id":3065,"parameterSlots":1,"returnSlots":0},"@_validateNonce_7274":{"entryPoint":null,"id":7274,"parameterSlots":1,"returnSlots":0},"@_validateSignature_19817":{"entryPoint":5229,"id":19817,"parameterSlots":2,"returnSlots":1},"@addDeposit_14109":{"entryPoint":2323,"id":14109,"parameterSlots":0,"returnSlots":0},"@addTemporaryOwner_19766":{"entryPoint":3982,"id":19766,"parameterSlots":3,"returnSlots":0},"@entryPoint_13866":{"entryPoint":null,"id":13866,"parameterSlots":0,"returnSlots":1},"@executeBatch_13970":{"entryPoint":1554,"id":13970,"parameterSlots":4,"returnSlots":0},"@execute_13924":{"entryPoint":3325,"id":13924,"parameterSlots":4,"returnSlots":0},"@functionDelegateCall_5016":{"entryPoint":6322,"id":5016,"parameterSlots":2,"returnSlots":1},"@functionDelegateCall_5045":{"entryPoint":6785,"id":5045,"parameterSlots":3,"returnSlots":1},"@getAddressSlot_5258":{"entryPoint":null,"id":5258,"parameterSlots":1,"returnSlots":1},"@getBooleanSlot_5269":{"entryPoint":null,"id":5269,"parameterSlots":1,"returnSlots":1},"@getDeposit_14092":{"entryPoint":3404,"id":14092,"parameterSlots":0,"returnSlots":1},"@getNonce_7198":{"entryPoint":4200,"id":7198,"parameterSlots":0,"returnSlots":1},"@initialize_19730":{"entryPoint":3587,"id":19730,"parameterSlots":1,"returnSlots":0},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@onERC1155BatchReceived_17906":{"entryPoint":null,"id":17906,"parameterSlots":8,"returnSlots":1},"@onERC1155Received_17883":{"entryPoint":null,"id":17883,"parameterSlots":6,"returnSlots":1},"@onERC721Received_17862":{"entryPoint":null,"id":17862,"parameterSlots":5,"returnSlots":1},"@ownerAfter_19691":{"entryPoint":null,"id":19691,"parameterSlots":0,"returnSlots":0},"@ownerUntil_19695":{"entryPoint":null,"id":19695,"parameterSlots":0,"returnSlots":0},"@owner_13838":{"entryPoint":null,"id":13838,"parameterSlots":0,"returnSlots":0},"@proxiableUUID_3609":{"entryPoint":3115,"id":3609,"parameterSlots":0,"returnSlots":1},"@recover_5594":{"entryPoint":6153,"id":5594,"parameterSlots":2,"returnSlots":1},"@supportsInterface_17936":{"entryPoint":1325,"id":17936,"parameterSlots":1,"returnSlots":1},"@toEthSignedMessageHash_5785":{"entryPoint":null,"id":5785,"parameterSlots":1,"returnSlots":1},"@tokensReceived_17843":{"entryPoint":null,"id":17843,"parameterSlots":8,"returnSlots":0},"@tryRecover_5567":{"entryPoint":6359,"id":5567,"parameterSlots":2,"returnSlots":2},"@tryRecover_5735":{"entryPoint":6918,"id":5735,"parameterSlots":4,"returnSlots":2},"@upgradeToAndCall_3652":{"entryPoint":2665,"id":3652,"parameterSlots":2,"returnSlots":0},"@upgradeTo_3631":{"entryPoint":1820,"id":3631,"parameterSlots":1,"returnSlots":0},"@validateUserOp_7239":{"entryPoint":2285,"id":7239,"parameterSlots":3,"returnSlots":1},"@verifyCallResultFromTarget_5084":{"entryPoint":7157,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawDepositTo_14127":{"entryPoint":2482,"id":14127,"parameterSlots":2,"returnSlots":0},"abi_decode_array_address_dyn_calldata":{"entryPoint":7799,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":7375,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address":{"entryPoint":7976,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":8089,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":7441,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":8486,"id":null,"parameterSlots":2,"returnSlots":8},"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":7684,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr":{"entryPoint":8740,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_addresst_bytes_memory_ptr":{"entryPoint":8180,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr":{"entryPoint":8406,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_addresst_uint48t_uint48":{"entryPoint":8671,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":7868,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes4":{"entryPoint":7618,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":8005,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":9107,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_uint48":{"entryPoint":8644,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":9176,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":9251,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0f5da87c25127e98fa2fcf8c3ca4e4215d5764c8cefd7e9612ed845c63b116e0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint48__to_t_uint48__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8911,"id":null,"parameterSlots":2,"returnSlots":2},"copy_memory_to_memory":{"entryPoint":9132,"id":null,"parameterSlots":3,"returnSlots":0},"increment_t_uint256":{"entryPoint":9012,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x21":{"entryPoint":9204,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":8864,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":8133,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address":{"entryPoint":7341,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:21958:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"59:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"146:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"155:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"158:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"148:6:111"},"nodeType":"YulFunctionCall","src":"148:12:111"},"nodeType":"YulExpressionStatement","src":"148:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"82:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"93:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"100:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"89:3:111"},"nodeType":"YulFunctionCall","src":"89:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"79:2:111"},"nodeType":"YulFunctionCall","src":"79:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"72:6:111"},"nodeType":"YulFunctionCall","src":"72:73:111"},"nodeType":"YulIf","src":"69:93:111"}]},"name":"validator_revert_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"48:5:111","type":""}],"src":"14:154:111"},{"body":{"nodeType":"YulBlock","src":"245:275:111","statements":[{"body":{"nodeType":"YulBlock","src":"294:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"303:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"306:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"296:6:111"},"nodeType":"YulFunctionCall","src":"296:12:111"},"nodeType":"YulExpressionStatement","src":"296:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"273:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"281:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"269:3:111"},"nodeType":"YulFunctionCall","src":"269:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"288:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"265:3:111"},"nodeType":"YulFunctionCall","src":"265:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"258:6:111"},"nodeType":"YulFunctionCall","src":"258:35:111"},"nodeType":"YulIf","src":"255:55:111"},{"nodeType":"YulAssignment","src":"319:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"342:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"329:12:111"},"nodeType":"YulFunctionCall","src":"329:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"319:6:111"}]},{"body":{"nodeType":"YulBlock","src":"392:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"401:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"404:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"394:6:111"},"nodeType":"YulFunctionCall","src":"394:12:111"},"nodeType":"YulExpressionStatement","src":"394:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"364:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"372:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"361:2:111"},"nodeType":"YulFunctionCall","src":"361:30:111"},"nodeType":"YulIf","src":"358:50:111"},{"nodeType":"YulAssignment","src":"417:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"433:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"441:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"417:8:111"}]},{"body":{"nodeType":"YulBlock","src":"498:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"507:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"510:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"500:6:111"},"nodeType":"YulFunctionCall","src":"500:12:111"},"nodeType":"YulExpressionStatement","src":"500:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"469:6:111"},{"name":"length","nodeType":"YulIdentifier","src":"477:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"465:3:111"},"nodeType":"YulFunctionCall","src":"465:19:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"461:3:111"},"nodeType":"YulFunctionCall","src":"461:30:111"},{"name":"end","nodeType":"YulIdentifier","src":"493:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"458:2:111"},"nodeType":"YulFunctionCall","src":"458:39:111"},"nodeType":"YulIf","src":"455:59:111"}]},"name":"abi_decode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"208:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"216:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"224:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"234:6:111","type":""}],"src":"173:347:111"},{"body":{"nodeType":"YulBlock","src":"718:1012:111","statements":[{"body":{"nodeType":"YulBlock","src":"765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"767:6:111"},"nodeType":"YulFunctionCall","src":"767:12:111"},"nodeType":"YulExpressionStatement","src":"767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"735:3:111"},"nodeType":"YulFunctionCall","src":"735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"760:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"731:3:111"},"nodeType":"YulFunctionCall","src":"731:33:111"},"nodeType":"YulIf","src":"728:53:111"},{"nodeType":"YulVariableDeclaration","src":"790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"803:12:111"},"nodeType":"YulFunctionCall","src":"803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"860:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"835:24:111"},"nodeType":"YulFunctionCall","src":"835:31:111"},"nodeType":"YulExpressionStatement","src":"835:31:111"},{"nodeType":"YulAssignment","src":"875:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"875:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"899:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"931:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"927:3:111"},"nodeType":"YulFunctionCall","src":"927:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"914:12:111"},"nodeType":"YulFunctionCall","src":"914:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"903:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"980:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"955:24:111"},"nodeType":"YulFunctionCall","src":"955:33:111"},"nodeType":"YulExpressionStatement","src":"955:33:111"},{"nodeType":"YulAssignment","src":"997:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1007:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1023:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1055:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1066:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1051:3:111"},"nodeType":"YulFunctionCall","src":"1051:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1038:12:111"},"nodeType":"YulFunctionCall","src":"1038:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1027:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1104:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"1079:24:111"},"nodeType":"YulFunctionCall","src":"1079:33:111"},"nodeType":"YulExpressionStatement","src":"1079:33:111"},{"nodeType":"YulAssignment","src":"1121:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1131:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1121:6:111"}]},{"nodeType":"YulAssignment","src":"1147:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1174:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1185:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1170:3:111"},"nodeType":"YulFunctionCall","src":"1170:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1157:12:111"},"nodeType":"YulFunctionCall","src":"1157:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1147:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1198:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1229:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1240:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1225:3:111"},"nodeType":"YulFunctionCall","src":"1225:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1212:12:111"},"nodeType":"YulFunctionCall","src":"1212:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1202:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1254:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1264:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1258:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1309:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1321:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1311:6:111"},"nodeType":"YulFunctionCall","src":"1311:12:111"},"nodeType":"YulExpressionStatement","src":"1311:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1305:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:14:111"},"nodeType":"YulIf","src":"1291:34:111"},{"nodeType":"YulVariableDeclaration","src":"1334:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1390:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1401:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1386:3:111"},"nodeType":"YulFunctionCall","src":"1386:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1410:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1360:25:111"},"nodeType":"YulFunctionCall","src":"1360:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"1338:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"1348:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1427:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"1437:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"1427:6:111"}]},{"nodeType":"YulAssignment","src":"1454:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"1464:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"1454:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1481:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1525:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1510:3:111"},"nodeType":"YulFunctionCall","src":"1510:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1497:12:111"},"nodeType":"YulFunctionCall","src":"1497:33:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"1485:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1559:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1568:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1571:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1561:6:111"},"nodeType":"YulFunctionCall","src":"1561:12:111"},"nodeType":"YulExpressionStatement","src":"1561:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"1545:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1555:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1542:2:111"},"nodeType":"YulFunctionCall","src":"1542:16:111"},"nodeType":"YulIf","src":"1539:36:111"},{"nodeType":"YulVariableDeclaration","src":"1584:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1640:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"1651:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1636:3:111"},"nodeType":"YulFunctionCall","src":"1636:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1662:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"1610:25:111"},"nodeType":"YulFunctionCall","src":"1610:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"1588:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"1598:8:111","type":""}]},{"nodeType":"YulAssignment","src":"1679:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"1689:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"1679:6:111"}]},{"nodeType":"YulAssignment","src":"1706:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"1716:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"1706:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"628:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"639:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"651:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"659:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"667:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"675:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"683:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"691:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"699:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"707:6:111","type":""}],"src":"525:1205:111"},{"body":{"nodeType":"YulBlock","src":"1804:263:111","statements":[{"body":{"nodeType":"YulBlock","src":"1850:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1859:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1862:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1852:6:111"},"nodeType":"YulFunctionCall","src":"1852:12:111"},"nodeType":"YulExpressionStatement","src":"1852:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1825:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1834:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1821:3:111"},"nodeType":"YulFunctionCall","src":"1821:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1846:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1817:3:111"},"nodeType":"YulFunctionCall","src":"1817:32:111"},"nodeType":"YulIf","src":"1814:52:111"},{"nodeType":"YulVariableDeclaration","src":"1875:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1901:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1888:12:111"},"nodeType":"YulFunctionCall","src":"1888:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1879:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2021:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2030:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2033:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2023:6:111"},"nodeType":"YulFunctionCall","src":"2023:12:111"},"nodeType":"YulExpressionStatement","src":"2023:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1933:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1944:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1951:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1940:3:111"},"nodeType":"YulFunctionCall","src":"1940:78:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1930:2:111"},"nodeType":"YulFunctionCall","src":"1930:89:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1923:6:111"},"nodeType":"YulFunctionCall","src":"1923:97:111"},"nodeType":"YulIf","src":"1920:117:111"},{"nodeType":"YulAssignment","src":"2046:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2056:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2046:6:111"}]}]},"name":"abi_decode_tuple_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1770:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1781:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1793:6:111","type":""}],"src":"1735:332:111"},{"body":{"nodeType":"YulBlock","src":"2167:92:111","statements":[{"nodeType":"YulAssignment","src":"2177:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2189:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2200:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2185:3:111"},"nodeType":"YulFunctionCall","src":"2185:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2177:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2219:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2244:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2237:6:111"},"nodeType":"YulFunctionCall","src":"2237:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2230:6:111"},"nodeType":"YulFunctionCall","src":"2230:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2212:6:111"},"nodeType":"YulFunctionCall","src":"2212:41:111"},"nodeType":"YulExpressionStatement","src":"2212:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2136:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2147:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2158:4:111","type":""}],"src":"2072:187:111"},{"body":{"nodeType":"YulBlock","src":"2404:614:111","statements":[{"body":{"nodeType":"YulBlock","src":"2451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2453:6:111"},"nodeType":"YulFunctionCall","src":"2453:12:111"},"nodeType":"YulExpressionStatement","src":"2453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2425:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2434:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2421:3:111"},"nodeType":"YulFunctionCall","src":"2421:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2446:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2417:3:111"},"nodeType":"YulFunctionCall","src":"2417:33:111"},"nodeType":"YulIf","src":"2414:53:111"},{"nodeType":"YulVariableDeclaration","src":"2476:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2502:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2489:12:111"},"nodeType":"YulFunctionCall","src":"2489:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2480:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2546:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2521:24:111"},"nodeType":"YulFunctionCall","src":"2521:31:111"},"nodeType":"YulExpressionStatement","src":"2521:31:111"},{"nodeType":"YulAssignment","src":"2561:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2561:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2585:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2617:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2628:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2613:3:111"},"nodeType":"YulFunctionCall","src":"2613:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2600:12:111"},"nodeType":"YulFunctionCall","src":"2600:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2589:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2666:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"2641:24:111"},"nodeType":"YulFunctionCall","src":"2641:33:111"},"nodeType":"YulExpressionStatement","src":"2641:33:111"},{"nodeType":"YulAssignment","src":"2683:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2693:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2683:6:111"}]},{"nodeType":"YulAssignment","src":"2709:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2736:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2747:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2719:12:111"},"nodeType":"YulFunctionCall","src":"2719:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2709:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2760:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2791:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2802:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2787:3:111"},"nodeType":"YulFunctionCall","src":"2787:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2774:12:111"},"nodeType":"YulFunctionCall","src":"2774:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2764:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2851:6:111"},"nodeType":"YulFunctionCall","src":"2851:12:111"},"nodeType":"YulExpressionStatement","src":"2851:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2821:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2829:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2818:2:111"},"nodeType":"YulFunctionCall","src":"2818:30:111"},"nodeType":"YulIf","src":"2815:50:111"},{"nodeType":"YulVariableDeclaration","src":"2874:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2930:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2941:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2926:3:111"},"nodeType":"YulFunctionCall","src":"2926:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2950:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"2900:25:111"},"nodeType":"YulFunctionCall","src":"2900:58:111"},"variables":[{"name":"value3_1","nodeType":"YulTypedName","src":"2878:8:111","type":""},{"name":"value4_1","nodeType":"YulTypedName","src":"2888:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2967:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"2977:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"2967:6:111"}]},{"nodeType":"YulAssignment","src":"2994:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"3004:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"2994:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2338:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2349:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2361:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2369:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2377:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2385:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2393:6:111","type":""}],"src":"2264:754:111"},{"body":{"nodeType":"YulBlock","src":"3122:149:111","statements":[{"nodeType":"YulAssignment","src":"3132:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3155:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3140:3:111"},"nodeType":"YulFunctionCall","src":"3140:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3132:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3174:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3189:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3197:66:111","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3185:3:111"},"nodeType":"YulFunctionCall","src":"3185:79:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:98:111"},"nodeType":"YulExpressionStatement","src":"3167:98:111"}]},"name":"abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3091:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3102:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3113:4:111","type":""}],"src":"3023:248:111"},{"body":{"nodeType":"YulBlock","src":"3360:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"3409:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3421:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3411:6:111"},"nodeType":"YulFunctionCall","src":"3411:12:111"},"nodeType":"YulExpressionStatement","src":"3411:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3396:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3384:3:111"},"nodeType":"YulFunctionCall","src":"3384:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"3403:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3380:3:111"},"nodeType":"YulFunctionCall","src":"3380:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3373:6:111"},"nodeType":"YulFunctionCall","src":"3373:35:111"},"nodeType":"YulIf","src":"3370:55:111"},{"nodeType":"YulAssignment","src":"3434:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3457:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3444:12:111"},"nodeType":"YulFunctionCall","src":"3444:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"3434:6:111"}]},{"body":{"nodeType":"YulBlock","src":"3507:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3516:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3519:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3509:6:111"},"nodeType":"YulFunctionCall","src":"3509:12:111"},"nodeType":"YulExpressionStatement","src":"3509:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3479:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3487:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3476:2:111"},"nodeType":"YulFunctionCall","src":"3476:30:111"},"nodeType":"YulIf","src":"3473:50:111"},{"nodeType":"YulAssignment","src":"3532:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3548:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3544:3:111"},"nodeType":"YulFunctionCall","src":"3544:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"3532:8:111"}]},{"body":{"nodeType":"YulBlock","src":"3621:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3630:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3633:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3623:6:111"},"nodeType":"YulFunctionCall","src":"3623:12:111"},"nodeType":"YulExpressionStatement","src":"3623:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3584:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3596:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"3599:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3592:3:111"},"nodeType":"YulFunctionCall","src":"3592:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"3609:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3576:3:111"},"nodeType":"YulFunctionCall","src":"3576:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"3616:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3573:2:111"},"nodeType":"YulFunctionCall","src":"3573:47:111"},"nodeType":"YulIf","src":"3570:67:111"}]},"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"3323:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"3331:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"3339:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"3349:6:111","type":""}],"src":"3276:367:111"},{"body":{"nodeType":"YulBlock","src":"3816:616:111","statements":[{"body":{"nodeType":"YulBlock","src":"3862:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3871:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3874:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3864:6:111"},"nodeType":"YulFunctionCall","src":"3864:12:111"},"nodeType":"YulExpressionStatement","src":"3864:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3837:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3846:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3833:3:111"},"nodeType":"YulFunctionCall","src":"3833:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3858:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3829:3:111"},"nodeType":"YulFunctionCall","src":"3829:32:111"},"nodeType":"YulIf","src":"3826:52:111"},{"nodeType":"YulVariableDeclaration","src":"3887:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3914:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3901:12:111"},"nodeType":"YulFunctionCall","src":"3901:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3891:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3933:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3943:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3937:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3988:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3997:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4000:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3990:6:111"},"nodeType":"YulFunctionCall","src":"3990:12:111"},"nodeType":"YulExpressionStatement","src":"3990:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3976:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3984:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3973:2:111"},"nodeType":"YulFunctionCall","src":"3973:14:111"},"nodeType":"YulIf","src":"3970:34:111"},{"nodeType":"YulVariableDeclaration","src":"4013:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4081:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4092:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4077:3:111"},"nodeType":"YulFunctionCall","src":"4077:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4101:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4039:37:111"},"nodeType":"YulFunctionCall","src":"4039:70:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"4017:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"4027:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4118:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"4128:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4118:6:111"}]},{"nodeType":"YulAssignment","src":"4145:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"4155:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4172:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4201:3:111"},"nodeType":"YulFunctionCall","src":"4201:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4188:12:111"},"nodeType":"YulFunctionCall","src":"4188:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4176:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4249:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4258:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4261:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4251:6:111"},"nodeType":"YulFunctionCall","src":"4251:12:111"},"nodeType":"YulExpressionStatement","src":"4251:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4235:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4245:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4232:2:111"},"nodeType":"YulFunctionCall","src":"4232:16:111"},"nodeType":"YulIf","src":"4229:36:111"},{"nodeType":"YulVariableDeclaration","src":"4274:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4342:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4353:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4338:3:111"},"nodeType":"YulFunctionCall","src":"4338:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4364:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"4300:37:111"},"nodeType":"YulFunctionCall","src":"4300:72:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"4278:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"4288:8:111","type":""}]},{"nodeType":"YulAssignment","src":"4381:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"4391:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4381:6:111"}]},{"nodeType":"YulAssignment","src":"4408:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"4418:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4408:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3758:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3769:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3781:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3789:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3797:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3805:6:111","type":""}],"src":"3648:784:111"},{"body":{"nodeType":"YulBlock","src":"4507:177:111","statements":[{"body":{"nodeType":"YulBlock","src":"4553:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4562:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4565:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4555:6:111"},"nodeType":"YulFunctionCall","src":"4555:12:111"},"nodeType":"YulExpressionStatement","src":"4555:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4528:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4537:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4524:3:111"},"nodeType":"YulFunctionCall","src":"4524:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4549:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4520:3:111"},"nodeType":"YulFunctionCall","src":"4520:32:111"},"nodeType":"YulIf","src":"4517:52:111"},{"nodeType":"YulVariableDeclaration","src":"4578:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4604:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4591:12:111"},"nodeType":"YulFunctionCall","src":"4591:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4582:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4648:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"4623:24:111"},"nodeType":"YulFunctionCall","src":"4623:31:111"},"nodeType":"YulExpressionStatement","src":"4623:31:111"},{"nodeType":"YulAssignment","src":"4663:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4673:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4663:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4473:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4484:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4496:6:111","type":""}],"src":"4437:247:111"},{"body":{"nodeType":"YulBlock","src":"4827:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"4873:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4882:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4885:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4875:6:111"},"nodeType":"YulFunctionCall","src":"4875:12:111"},"nodeType":"YulExpressionStatement","src":"4875:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4848:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4857:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4844:3:111"},"nodeType":"YulFunctionCall","src":"4844:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4869:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4840:3:111"},"nodeType":"YulFunctionCall","src":"4840:32:111"},"nodeType":"YulIf","src":"4837:52:111"},{"nodeType":"YulVariableDeclaration","src":"4898:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4925:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4912:12:111"},"nodeType":"YulFunctionCall","src":"4912:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4902:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4978:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4987:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4990:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4980:6:111"},"nodeType":"YulFunctionCall","src":"4980:12:111"},"nodeType":"YulExpressionStatement","src":"4980:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4950:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4958:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4947:2:111"},"nodeType":"YulFunctionCall","src":"4947:30:111"},"nodeType":"YulIf","src":"4944:50:111"},{"nodeType":"YulVariableDeclaration","src":"5003:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5017:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5028:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5013:3:111"},"nodeType":"YulFunctionCall","src":"5013:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5007:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5074:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5083:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5086:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5076:6:111"},"nodeType":"YulFunctionCall","src":"5076:12:111"},"nodeType":"YulExpressionStatement","src":"5076:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5055:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5064:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5051:3:111"},"nodeType":"YulFunctionCall","src":"5051:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5069:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5047:3:111"},"nodeType":"YulFunctionCall","src":"5047:26:111"},"nodeType":"YulIf","src":"5044:46:111"},{"nodeType":"YulAssignment","src":"5099:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"5109:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5099:6:111"}]},{"nodeType":"YulAssignment","src":"5120:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5147:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5158:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5143:3:111"},"nodeType":"YulFunctionCall","src":"5143:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5130:12:111"},"nodeType":"YulFunctionCall","src":"5130:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5120:6:111"}]},{"nodeType":"YulAssignment","src":"5171:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5198:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5209:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5194:3:111"},"nodeType":"YulFunctionCall","src":"5194:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5181:12:111"},"nodeType":"YulFunctionCall","src":"5181:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5171:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4777:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4788:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4800:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4808:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4816:6:111","type":""}],"src":"4689:530:111"},{"body":{"nodeType":"YulBlock","src":"5325:76:111","statements":[{"nodeType":"YulAssignment","src":"5335:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5347:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5358:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5343:3:111"},"nodeType":"YulFunctionCall","src":"5343:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5335:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5377:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"5388:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5370:6:111"},"nodeType":"YulFunctionCall","src":"5370:25:111"},"nodeType":"YulExpressionStatement","src":"5370:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5294:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5305:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5316:4:111","type":""}],"src":"5224:177:111"},{"body":{"nodeType":"YulBlock","src":"5505:97:111","statements":[{"nodeType":"YulAssignment","src":"5515:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5527:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5538:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5523:3:111"},"nodeType":"YulFunctionCall","src":"5523:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5515:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5557:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5572:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5580:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5568:3:111"},"nodeType":"YulFunctionCall","src":"5568:27:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5550:6:111"},"nodeType":"YulFunctionCall","src":"5550:46:111"},"nodeType":"YulExpressionStatement","src":"5550:46:111"}]},"name":"abi_encode_tuple_t_uint48__to_t_uint48__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5474:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5485:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5496:4:111","type":""}],"src":"5406:196:111"},{"body":{"nodeType":"YulBlock","src":"5702:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"5748:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5757:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5760:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5750:6:111"},"nodeType":"YulFunctionCall","src":"5750:12:111"},"nodeType":"YulExpressionStatement","src":"5750:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5723:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5732:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5719:3:111"},"nodeType":"YulFunctionCall","src":"5719:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5744:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5715:3:111"},"nodeType":"YulFunctionCall","src":"5715:32:111"},"nodeType":"YulIf","src":"5712:52:111"},{"nodeType":"YulVariableDeclaration","src":"5773:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5799:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5786:12:111"},"nodeType":"YulFunctionCall","src":"5786:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5777:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5843:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"5818:24:111"},"nodeType":"YulFunctionCall","src":"5818:31:111"},"nodeType":"YulExpressionStatement","src":"5818:31:111"},{"nodeType":"YulAssignment","src":"5858:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5868:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5858:6:111"}]},{"nodeType":"YulAssignment","src":"5882:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5909:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5920:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5905:3:111"},"nodeType":"YulFunctionCall","src":"5905:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5892:12:111"},"nodeType":"YulFunctionCall","src":"5892:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5882:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5660:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5671:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5683:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5691:6:111","type":""}],"src":"5607:323:111"},{"body":{"nodeType":"YulBlock","src":"5967:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5984:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5987:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5977:6:111"},"nodeType":"YulFunctionCall","src":"5977:88:111"},"nodeType":"YulExpressionStatement","src":"5977:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6081:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6084:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6074:6:111"},"nodeType":"YulFunctionCall","src":"6074:15:111"},"nodeType":"YulExpressionStatement","src":"6074:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6105:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6108:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6098:6:111"},"nodeType":"YulFunctionCall","src":"6098:15:111"},"nodeType":"YulExpressionStatement","src":"6098:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"5935:184:111"},{"body":{"nodeType":"YulBlock","src":"6220:1019:111","statements":[{"body":{"nodeType":"YulBlock","src":"6266:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6275:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6278:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6268:6:111"},"nodeType":"YulFunctionCall","src":"6268:12:111"},"nodeType":"YulExpressionStatement","src":"6268:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6241:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6250:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6237:3:111"},"nodeType":"YulFunctionCall","src":"6237:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6262:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6233:3:111"},"nodeType":"YulFunctionCall","src":"6233:32:111"},"nodeType":"YulIf","src":"6230:52:111"},{"nodeType":"YulVariableDeclaration","src":"6291:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6317:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6304:12:111"},"nodeType":"YulFunctionCall","src":"6304:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6295:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6361:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"6336:24:111"},"nodeType":"YulFunctionCall","src":"6336:31:111"},"nodeType":"YulExpressionStatement","src":"6336:31:111"},{"nodeType":"YulAssignment","src":"6376:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6386:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6376:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"6400:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6431:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6442:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6427:3:111"},"nodeType":"YulFunctionCall","src":"6427:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6414:12:111"},"nodeType":"YulFunctionCall","src":"6414:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6404:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6455:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6465:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6459:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6510:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6519:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6522:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6512:6:111"},"nodeType":"YulFunctionCall","src":"6512:12:111"},"nodeType":"YulExpressionStatement","src":"6512:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6498:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6506:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6495:2:111"},"nodeType":"YulFunctionCall","src":"6495:14:111"},"nodeType":"YulIf","src":"6492:34:111"},{"nodeType":"YulVariableDeclaration","src":"6535:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6549:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6560:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6545:3:111"},"nodeType":"YulFunctionCall","src":"6545:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6539:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6615:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6624:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6627:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6617:6:111"},"nodeType":"YulFunctionCall","src":"6617:12:111"},"nodeType":"YulExpressionStatement","src":"6617:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6594:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6598:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6590:3:111"},"nodeType":"YulFunctionCall","src":"6590:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6605:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6586:3:111"},"nodeType":"YulFunctionCall","src":"6586:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6579:6:111"},"nodeType":"YulFunctionCall","src":"6579:35:111"},"nodeType":"YulIf","src":"6576:55:111"},{"nodeType":"YulVariableDeclaration","src":"6640:26:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6663:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6650:12:111"},"nodeType":"YulFunctionCall","src":"6650:16:111"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6644:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6689:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6691:16:111"},"nodeType":"YulFunctionCall","src":"6691:18:111"},"nodeType":"YulExpressionStatement","src":"6691:18:111"}]},"condition":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6681:2:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6685:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6678:2:111"},"nodeType":"YulFunctionCall","src":"6678:10:111"},"nodeType":"YulIf","src":"6675:36:111"},{"nodeType":"YulVariableDeclaration","src":"6720:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6730:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"6724:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6805:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6825:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6819:5:111"},"nodeType":"YulFunctionCall","src":"6819:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"6809:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6837:71:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"6859:6:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6883:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"6887:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6879:3:111"},"nodeType":"YulFunctionCall","src":"6879:13:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6894:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6875:3:111"},"nodeType":"YulFunctionCall","src":"6875:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"6899:2:111","type":"","value":"63"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6871:3:111"},"nodeType":"YulFunctionCall","src":"6871:31:111"},{"name":"_4","nodeType":"YulIdentifier","src":"6904:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6867:3:111"},"nodeType":"YulFunctionCall","src":"6867:40:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6855:3:111"},"nodeType":"YulFunctionCall","src":"6855:53:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"6841:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6967:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"6969:16:111"},"nodeType":"YulFunctionCall","src":"6969:18:111"},"nodeType":"YulExpressionStatement","src":"6969:18:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6926:10:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6938:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6923:2:111"},"nodeType":"YulFunctionCall","src":"6923:18:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"6946:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"6958:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6943:2:111"},"nodeType":"YulFunctionCall","src":"6943:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"6920:2:111"},"nodeType":"YulFunctionCall","src":"6920:46:111"},"nodeType":"YulIf","src":"6917:72:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7005:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"7009:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6998:6:111"},"nodeType":"YulFunctionCall","src":"6998:22:111"},"nodeType":"YulExpressionStatement","src":"6998:22:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7036:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7044:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7029:6:111"},"nodeType":"YulFunctionCall","src":"7029:18:111"},"nodeType":"YulExpressionStatement","src":"7029:18:111"},{"body":{"nodeType":"YulBlock","src":"7093:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7102:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7105:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7095:6:111"},"nodeType":"YulFunctionCall","src":"7095:12:111"},"nodeType":"YulExpressionStatement","src":"7095:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7070:2:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7074:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7066:3:111"},"nodeType":"YulFunctionCall","src":"7066:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"7079:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7062:3:111"},"nodeType":"YulFunctionCall","src":"7062:20:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7084:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7059:2:111"},"nodeType":"YulFunctionCall","src":"7059:33:111"},"nodeType":"YulIf","src":"7056:53:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7135:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7143:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7131:3:111"},"nodeType":"YulFunctionCall","src":"7131:15:111"},{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7152:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"7156:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7148:3:111"},"nodeType":"YulFunctionCall","src":"7148:11:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7161:2:111"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"7118:12:111"},"nodeType":"YulFunctionCall","src":"7118:46:111"},"nodeType":"YulExpressionStatement","src":"7118:46:111"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"7188:6:111"},{"name":"_3","nodeType":"YulIdentifier","src":"7196:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7184:3:111"},"nodeType":"YulFunctionCall","src":"7184:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7201:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7180:3:111"},"nodeType":"YulFunctionCall","src":"7180:24:111"},{"kind":"number","nodeType":"YulLiteral","src":"7206:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7173:6:111"},"nodeType":"YulFunctionCall","src":"7173:35:111"},"nodeType":"YulExpressionStatement","src":"7173:35:111"},{"nodeType":"YulAssignment","src":"7217:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"7227:6:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7217:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_bytes_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6178:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6189:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6201:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6209:6:111","type":""}],"src":"6124:1115:111"},{"body":{"nodeType":"YulBlock","src":"7345:76:111","statements":[{"nodeType":"YulAssignment","src":"7355:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7367:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7378:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7363:3:111"},"nodeType":"YulFunctionCall","src":"7363:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7355:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7397:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"7408:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7390:6:111"},"nodeType":"YulFunctionCall","src":"7390:25:111"},"nodeType":"YulExpressionStatement","src":"7390:25:111"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7314:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7325:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7336:4:111","type":""}],"src":"7244:177:111"},{"body":{"nodeType":"YulBlock","src":"7527:125:111","statements":[{"nodeType":"YulAssignment","src":"7537:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7549:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7560:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7545:3:111"},"nodeType":"YulFunctionCall","src":"7545:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7537:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7579:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7594:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7602:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7590:3:111"},"nodeType":"YulFunctionCall","src":"7590:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7572:6:111"},"nodeType":"YulFunctionCall","src":"7572:74:111"},"nodeType":"YulExpressionStatement","src":"7572:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7496:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7507:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7518:4:111","type":""}],"src":"7426:226:111"},{"body":{"nodeType":"YulBlock","src":"7779:125:111","statements":[{"nodeType":"YulAssignment","src":"7789:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7801:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7812:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7797:3:111"},"nodeType":"YulFunctionCall","src":"7797:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7789:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7831:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7846:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7854:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7842:3:111"},"nodeType":"YulFunctionCall","src":"7842:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7824:6:111"},"nodeType":"YulFunctionCall","src":"7824:74:111"},"nodeType":"YulExpressionStatement","src":"7824:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7748:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7759:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7770:4:111","type":""}],"src":"7657:247:111"},{"body":{"nodeType":"YulBlock","src":"8032:489:111","statements":[{"body":{"nodeType":"YulBlock","src":"8078:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8087:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8090:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8080:6:111"},"nodeType":"YulFunctionCall","src":"8080:12:111"},"nodeType":"YulExpressionStatement","src":"8080:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8053:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8062:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8049:3:111"},"nodeType":"YulFunctionCall","src":"8049:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8074:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8045:3:111"},"nodeType":"YulFunctionCall","src":"8045:32:111"},"nodeType":"YulIf","src":"8042:52:111"},{"nodeType":"YulVariableDeclaration","src":"8103:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8129:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8116:12:111"},"nodeType":"YulFunctionCall","src":"8116:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8107:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8173:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8148:24:111"},"nodeType":"YulFunctionCall","src":"8148:31:111"},"nodeType":"YulExpressionStatement","src":"8148:31:111"},{"nodeType":"YulAssignment","src":"8188:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8198:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8188:6:111"}]},{"nodeType":"YulAssignment","src":"8212:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8239:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8250:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8235:3:111"},"nodeType":"YulFunctionCall","src":"8235:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8222:12:111"},"nodeType":"YulFunctionCall","src":"8222:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"8212:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8263:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8294:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8305:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8290:3:111"},"nodeType":"YulFunctionCall","src":"8290:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8277:12:111"},"nodeType":"YulFunctionCall","src":"8277:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8267:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"8352:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8361:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8364:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8354:6:111"},"nodeType":"YulFunctionCall","src":"8354:12:111"},"nodeType":"YulExpressionStatement","src":"8354:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8324:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8332:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8321:2:111"},"nodeType":"YulFunctionCall","src":"8321:30:111"},"nodeType":"YulIf","src":"8318:50:111"},{"nodeType":"YulVariableDeclaration","src":"8377:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8433:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"8444:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8429:3:111"},"nodeType":"YulFunctionCall","src":"8429:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"8453:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"8403:25:111"},"nodeType":"YulFunctionCall","src":"8403:58:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"8381:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"8391:8:111","type":""}]},{"nodeType":"YulAssignment","src":"8470:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"8480:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"8470:6:111"}]},{"nodeType":"YulAssignment","src":"8497:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"8507:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"8497:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7974:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7985:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7997:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8005:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8013:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8021:6:111","type":""}],"src":"7909:612:111"},{"body":{"nodeType":"YulBlock","src":"8753:1111:111","statements":[{"body":{"nodeType":"YulBlock","src":"8800:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8809:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8812:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8802:6:111"},"nodeType":"YulFunctionCall","src":"8802:12:111"},"nodeType":"YulExpressionStatement","src":"8802:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8774:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"8783:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8770:3:111"},"nodeType":"YulFunctionCall","src":"8770:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"8795:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8766:3:111"},"nodeType":"YulFunctionCall","src":"8766:33:111"},"nodeType":"YulIf","src":"8763:53:111"},{"nodeType":"YulVariableDeclaration","src":"8825:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8851:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8838:12:111"},"nodeType":"YulFunctionCall","src":"8838:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"8829:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"8895:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8870:24:111"},"nodeType":"YulFunctionCall","src":"8870:31:111"},"nodeType":"YulExpressionStatement","src":"8870:31:111"},{"nodeType":"YulAssignment","src":"8910:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"8920:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8910:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"8934:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8966:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8977:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8962:3:111"},"nodeType":"YulFunctionCall","src":"8962:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8949:12:111"},"nodeType":"YulFunctionCall","src":"8949:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"8938:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"9015:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"8990:24:111"},"nodeType":"YulFunctionCall","src":"8990:33:111"},"nodeType":"YulExpressionStatement","src":"8990:33:111"},{"nodeType":"YulAssignment","src":"9032:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"9042:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9032:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9058:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9089:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9100:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9085:3:111"},"nodeType":"YulFunctionCall","src":"9085:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9072:12:111"},"nodeType":"YulFunctionCall","src":"9072:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"9062:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"9113:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"9123:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9117:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9168:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9177:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9180:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9170:6:111"},"nodeType":"YulFunctionCall","src":"9170:12:111"},"nodeType":"YulExpressionStatement","src":"9170:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9156:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9164:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9153:2:111"},"nodeType":"YulFunctionCall","src":"9153:14:111"},"nodeType":"YulIf","src":"9150:34:111"},{"nodeType":"YulVariableDeclaration","src":"9193:96:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9261:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"9272:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9257:3:111"},"nodeType":"YulFunctionCall","src":"9257:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9281:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9219:37:111"},"nodeType":"YulFunctionCall","src":"9219:70:111"},"variables":[{"name":"value2_1","nodeType":"YulTypedName","src":"9197:8:111","type":""},{"name":"value3_1","nodeType":"YulTypedName","src":"9207:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9298:18:111","value":{"name":"value2_1","nodeType":"YulIdentifier","src":"9308:8:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9298:6:111"}]},{"nodeType":"YulAssignment","src":"9325:18:111","value":{"name":"value3_1","nodeType":"YulIdentifier","src":"9335:8:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9325:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9352:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9385:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9396:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9381:3:111"},"nodeType":"YulFunctionCall","src":"9381:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9368:12:111"},"nodeType":"YulFunctionCall","src":"9368:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"9356:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9429:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9438:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9441:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9431:6:111"},"nodeType":"YulFunctionCall","src":"9431:12:111"},"nodeType":"YulExpressionStatement","src":"9431:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"9415:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9425:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9412:2:111"},"nodeType":"YulFunctionCall","src":"9412:16:111"},"nodeType":"YulIf","src":"9409:36:111"},{"nodeType":"YulVariableDeclaration","src":"9454:98:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9522:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"9533:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9518:3:111"},"nodeType":"YulFunctionCall","src":"9518:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9544:7:111"}],"functionName":{"name":"abi_decode_array_address_dyn_calldata","nodeType":"YulIdentifier","src":"9480:37:111"},"nodeType":"YulFunctionCall","src":"9480:72:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"9458:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"9468:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9561:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"9571:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"9561:6:111"}]},{"nodeType":"YulAssignment","src":"9588:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"9598:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"9588:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"9615:49:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9648:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9659:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9644:3:111"},"nodeType":"YulFunctionCall","src":"9644:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9631:12:111"},"nodeType":"YulFunctionCall","src":"9631:33:111"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"9619:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"9693:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9702:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9705:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9695:6:111"},"nodeType":"YulFunctionCall","src":"9695:12:111"},"nodeType":"YulExpressionStatement","src":"9695:12:111"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"9679:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"9689:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9676:2:111"},"nodeType":"YulFunctionCall","src":"9676:16:111"},"nodeType":"YulIf","src":"9673:36:111"},{"nodeType":"YulVariableDeclaration","src":"9718:86:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9774:9:111"},{"name":"offset_2","nodeType":"YulIdentifier","src":"9785:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9770:3:111"},"nodeType":"YulFunctionCall","src":"9770:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"9796:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"9744:25:111"},"nodeType":"YulFunctionCall","src":"9744:60:111"},"variables":[{"name":"value6_1","nodeType":"YulTypedName","src":"9722:8:111","type":""},{"name":"value7_1","nodeType":"YulTypedName","src":"9732:8:111","type":""}]},{"nodeType":"YulAssignment","src":"9813:18:111","value":{"name":"value6_1","nodeType":"YulIdentifier","src":"9823:8:111"},"variableNames":[{"name":"value6","nodeType":"YulIdentifier","src":"9813:6:111"}]},{"nodeType":"YulAssignment","src":"9840:18:111","value":{"name":"value7_1","nodeType":"YulIdentifier","src":"9850:8:111"},"variableNames":[{"name":"value7","nodeType":"YulIdentifier","src":"9840:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8663:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8674:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8686:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8694:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8702:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"8710:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"8718:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"8726:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"8734:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"8742:6:111","type":""}],"src":"8526:1338:111"},{"body":{"nodeType":"YulBlock","src":"9917:119:111","statements":[{"nodeType":"YulAssignment","src":"9927:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"9949:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9936:12:111"},"nodeType":"YulFunctionCall","src":"9936:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"9927:5:111"}]},{"body":{"nodeType":"YulBlock","src":"10014:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10023:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10026:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10016:6:111"},"nodeType":"YulFunctionCall","src":"10016:12:111"},"nodeType":"YulExpressionStatement","src":"10016:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9978:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9989:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"9996:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9985:3:111"},"nodeType":"YulFunctionCall","src":"9985:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"9975:2:111"},"nodeType":"YulFunctionCall","src":"9975:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9968:6:111"},"nodeType":"YulFunctionCall","src":"9968:45:111"},"nodeType":"YulIf","src":"9965:65:111"}]},"name":"abi_decode_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"9896:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"9907:5:111","type":""}],"src":"9869:167:111"},{"body":{"nodeType":"YulBlock","src":"10143:289:111","statements":[{"body":{"nodeType":"YulBlock","src":"10189:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10198:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10201:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10191:6:111"},"nodeType":"YulFunctionCall","src":"10191:12:111"},"nodeType":"YulExpressionStatement","src":"10191:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10164:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10173:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10160:3:111"},"nodeType":"YulFunctionCall","src":"10160:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10185:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10156:3:111"},"nodeType":"YulFunctionCall","src":"10156:32:111"},"nodeType":"YulIf","src":"10153:52:111"},{"nodeType":"YulVariableDeclaration","src":"10214:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10240:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10227:12:111"},"nodeType":"YulFunctionCall","src":"10227:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"10218:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10284:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10259:24:111"},"nodeType":"YulFunctionCall","src":"10259:31:111"},"nodeType":"YulExpressionStatement","src":"10259:31:111"},{"nodeType":"YulAssignment","src":"10299:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10309:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10299:6:111"}]},{"nodeType":"YulAssignment","src":"10323:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10355:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10366:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10351:3:111"},"nodeType":"YulFunctionCall","src":"10351:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"10333:17:111"},"nodeType":"YulFunctionCall","src":"10333:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10323:6:111"}]},{"nodeType":"YulAssignment","src":"10379:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10411:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10422:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10407:3:111"},"nodeType":"YulFunctionCall","src":"10407:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"10389:17:111"},"nodeType":"YulFunctionCall","src":"10389:37:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10379:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10093:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10104:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10116:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10124:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10132:6:111","type":""}],"src":"10041:391:111"},{"body":{"nodeType":"YulBlock","src":"10594:666:111","statements":[{"body":{"nodeType":"YulBlock","src":"10641:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10650:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10653:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10643:6:111"},"nodeType":"YulFunctionCall","src":"10643:12:111"},"nodeType":"YulExpressionStatement","src":"10643:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"10615:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"10624:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10611:3:111"},"nodeType":"YulFunctionCall","src":"10611:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"10636:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10607:3:111"},"nodeType":"YulFunctionCall","src":"10607:33:111"},"nodeType":"YulIf","src":"10604:53:111"},{"nodeType":"YulVariableDeclaration","src":"10666:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10692:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10679:12:111"},"nodeType":"YulFunctionCall","src":"10679:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"10670:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"10736:5:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10711:24:111"},"nodeType":"YulFunctionCall","src":"10711:31:111"},"nodeType":"YulExpressionStatement","src":"10711:31:111"},{"nodeType":"YulAssignment","src":"10751:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"10761:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"10751:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"10775:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10818:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10803:3:111"},"nodeType":"YulFunctionCall","src":"10803:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10790:12:111"},"nodeType":"YulFunctionCall","src":"10790:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"10779:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"10856:7:111"}],"functionName":{"name":"validator_revert_address","nodeType":"YulIdentifier","src":"10831:24:111"},"nodeType":"YulFunctionCall","src":"10831:33:111"},"nodeType":"YulExpressionStatement","src":"10831:33:111"},{"nodeType":"YulAssignment","src":"10873:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"10883:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"10873:6:111"}]},{"nodeType":"YulAssignment","src":"10899:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10926:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10937:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10922:3:111"},"nodeType":"YulFunctionCall","src":"10922:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10909:12:111"},"nodeType":"YulFunctionCall","src":"10909:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"10899:6:111"}]},{"nodeType":"YulAssignment","src":"10950:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10977:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10988:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10973:3:111"},"nodeType":"YulFunctionCall","src":"10973:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"10960:12:111"},"nodeType":"YulFunctionCall","src":"10960:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"10950:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"11001:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11032:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11043:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11028:3:111"},"nodeType":"YulFunctionCall","src":"11028:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11015:12:111"},"nodeType":"YulFunctionCall","src":"11015:33:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"11005:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11091:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11100:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11103:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11093:6:111"},"nodeType":"YulFunctionCall","src":"11093:12:111"},"nodeType":"YulExpressionStatement","src":"11093:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"11063:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"11071:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11060:2:111"},"nodeType":"YulFunctionCall","src":"11060:30:111"},"nodeType":"YulIf","src":"11057:50:111"},{"nodeType":"YulVariableDeclaration","src":"11116:84:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11172:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"11183:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11168:3:111"},"nodeType":"YulFunctionCall","src":"11168:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"11192:7:111"}],"functionName":{"name":"abi_decode_bytes_calldata","nodeType":"YulIdentifier","src":"11142:25:111"},"nodeType":"YulFunctionCall","src":"11142:58:111"},"variables":[{"name":"value4_1","nodeType":"YulTypedName","src":"11120:8:111","type":""},{"name":"value5_1","nodeType":"YulTypedName","src":"11130:8:111","type":""}]},{"nodeType":"YulAssignment","src":"11209:18:111","value":{"name":"value4_1","nodeType":"YulIdentifier","src":"11219:8:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"11209:6:111"}]},{"nodeType":"YulAssignment","src":"11236:18:111","value":{"name":"value5_1","nodeType":"YulIdentifier","src":"11246:8:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"11236:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10520:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10531:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10543:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"10551:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"10559:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"10567:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"10575:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"10583:6:111","type":""}],"src":"10437:823:111"},{"body":{"nodeType":"YulBlock","src":"11439:169:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11456:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11467:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11449:6:111"},"nodeType":"YulFunctionCall","src":"11449:21:111"},"nodeType":"YulExpressionStatement","src":"11449:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11490:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11501:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11486:3:111"},"nodeType":"YulFunctionCall","src":"11486:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11506:2:111","type":"","value":"19"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11479:6:111"},"nodeType":"YulFunctionCall","src":"11479:30:111"},"nodeType":"YulExpressionStatement","src":"11479:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11529:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11540:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11525:3:111"},"nodeType":"YulFunctionCall","src":"11525:18:111"},{"hexValue":"77726f6e67206172726179206c656e67746873","kind":"string","nodeType":"YulLiteral","src":"11545:21:111","type":"","value":"wrong array lengths"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11518:6:111"},"nodeType":"YulFunctionCall","src":"11518:49:111"},"nodeType":"YulExpressionStatement","src":"11518:49:111"},{"nodeType":"YulAssignment","src":"11576:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11588:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11599:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11584:3:111"},"nodeType":"YulFunctionCall","src":"11584:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11576:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11416:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11430:4:111","type":""}],"src":"11265:343:111"},{"body":{"nodeType":"YulBlock","src":"11645:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11662:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11665:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11655:6:111"},"nodeType":"YulFunctionCall","src":"11655:88:111"},"nodeType":"YulExpressionStatement","src":"11655:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11759:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11762:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11752:6:111"},"nodeType":"YulFunctionCall","src":"11752:15:111"},"nodeType":"YulExpressionStatement","src":"11752:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11783:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11786:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11776:6:111"},"nodeType":"YulFunctionCall","src":"11776:15:111"},"nodeType":"YulExpressionStatement","src":"11776:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"11613:184:111"},{"body":{"nodeType":"YulBlock","src":"11896:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11906:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"11945:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"11932:12:111"},"nodeType":"YulFunctionCall","src":"11932:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"11910:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"12105:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12114:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12117:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12107:6:111"},"nodeType":"YulFunctionCall","src":"12107:12:111"},"nodeType":"YulExpressionStatement","src":"12107:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"11980:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12008:12:111"},"nodeType":"YulFunctionCall","src":"12008:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"12024:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12004:3:111"},"nodeType":"YulFunctionCall","src":"12004:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"12035:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12000:3:111"},"nodeType":"YulFunctionCall","src":"12000:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11976:3:111"},"nodeType":"YulFunctionCall","src":"11976:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"11969:6:111"},"nodeType":"YulFunctionCall","src":"11969:135:111"},"nodeType":"YulIf","src":"11966:155:111"},{"nodeType":"YulVariableDeclaration","src":"12130:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"12148:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"12158:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12144:3:111"},"nodeType":"YulFunctionCall","src":"12144:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"12134:6:111","type":""}]},{"nodeType":"YulAssignment","src":"12186:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12209:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"12196:12:111"},"nodeType":"YulFunctionCall","src":"12196:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"12186:6:111"}]},{"body":{"nodeType":"YulBlock","src":"12259:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12268:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12271:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12261:6:111"},"nodeType":"YulFunctionCall","src":"12261:12:111"},"nodeType":"YulExpressionStatement","src":"12261:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"12231:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12239:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12228:2:111"},"nodeType":"YulFunctionCall","src":"12228:30:111"},"nodeType":"YulIf","src":"12225:50:111"},{"nodeType":"YulAssignment","src":"12284:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"12296:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"12304:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12292:3:111"},"nodeType":"YulFunctionCall","src":"12292:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"12284:4:111"}]},{"body":{"nodeType":"YulBlock","src":"12360:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12369:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12372:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12362:6:111"},"nodeType":"YulFunctionCall","src":"12362:12:111"},"nodeType":"YulExpressionStatement","src":"12362:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"12325:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"12335:12:111"},"nodeType":"YulFunctionCall","src":"12335:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"12351:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12331:3:111"},"nodeType":"YulFunctionCall","src":"12331:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"12321:3:111"},"nodeType":"YulFunctionCall","src":"12321:38:111"},"nodeType":"YulIf","src":"12318:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"11853:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"11863:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"11879:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"11885:6:111","type":""}],"src":"11802:580:111"},{"body":{"nodeType":"YulBlock","src":"12434:302:111","statements":[{"body":{"nodeType":"YulBlock","src":"12533:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12554:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12557:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12547:6:111"},"nodeType":"YulFunctionCall","src":"12547:88:111"},"nodeType":"YulExpressionStatement","src":"12547:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12655:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"12658:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12648:6:111"},"nodeType":"YulFunctionCall","src":"12648:15:111"},"nodeType":"YulExpressionStatement","src":"12648:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12683:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"12686:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"12676:6:111"},"nodeType":"YulFunctionCall","src":"12676:15:111"},"nodeType":"YulExpressionStatement","src":"12676:15:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12450:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"12457:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"12447:2:111"},"nodeType":"YulFunctionCall","src":"12447:77:111"},"nodeType":"YulIf","src":"12444:257:111"},{"nodeType":"YulAssignment","src":"12710:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12721:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"12728:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12717:3:111"},"nodeType":"YulFunctionCall","src":"12717:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"12710:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"12416:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"12426:3:111","type":""}],"src":"12387:349:111"},{"body":{"nodeType":"YulBlock","src":"12915:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12932:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12943:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12925:6:111"},"nodeType":"YulFunctionCall","src":"12925:21:111"},"nodeType":"YulExpressionStatement","src":"12925:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12966:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12977:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12962:3:111"},"nodeType":"YulFunctionCall","src":"12962:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12982:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12955:6:111"},"nodeType":"YulFunctionCall","src":"12955:30:111"},"nodeType":"YulExpressionStatement","src":"12955:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13005:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13016:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13001:3:111"},"nodeType":"YulFunctionCall","src":"13001:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"13021:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12994:6:111"},"nodeType":"YulFunctionCall","src":"12994:62:111"},"nodeType":"YulExpressionStatement","src":"12994:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13076:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13087:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13072:3:111"},"nodeType":"YulFunctionCall","src":"13072:18:111"},{"hexValue":"64656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"13092:14:111","type":"","value":"delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13065:6:111"},"nodeType":"YulFunctionCall","src":"13065:42:111"},"nodeType":"YulExpressionStatement","src":"13065:42:111"},{"nodeType":"YulAssignment","src":"13116:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13128:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13139:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13124:3:111"},"nodeType":"YulFunctionCall","src":"13124:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13116:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12892:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12906:4:111","type":""}],"src":"12741:408:111"},{"body":{"nodeType":"YulBlock","src":"13328:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13345:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13356:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13338:6:111"},"nodeType":"YulFunctionCall","src":"13338:21:111"},"nodeType":"YulExpressionStatement","src":"13338:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13379:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13390:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13375:3:111"},"nodeType":"YulFunctionCall","src":"13375:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13395:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13368:6:111"},"nodeType":"YulFunctionCall","src":"13368:30:111"},"nodeType":"YulExpressionStatement","src":"13368:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13418:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13429:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13414:3:111"},"nodeType":"YulFunctionCall","src":"13414:18:111"},{"hexValue":"46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820","kind":"string","nodeType":"YulLiteral","src":"13434:34:111","type":"","value":"Function must be called through "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13407:6:111"},"nodeType":"YulFunctionCall","src":"13407:62:111"},"nodeType":"YulExpressionStatement","src":"13407:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13489:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13500:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13485:3:111"},"nodeType":"YulFunctionCall","src":"13485:18:111"},{"hexValue":"6163746976652070726f7879","kind":"string","nodeType":"YulLiteral","src":"13505:14:111","type":"","value":"active proxy"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13478:6:111"},"nodeType":"YulFunctionCall","src":"13478:42:111"},"nodeType":"YulExpressionStatement","src":"13478:42:111"},{"nodeType":"YulAssignment","src":"13529:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13541:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13552:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13537:3:111"},"nodeType":"YulFunctionCall","src":"13537:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13529:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13305:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13319:4:111","type":""}],"src":"13154:408:111"},{"body":{"nodeType":"YulBlock","src":"13712:168:111","statements":[{"nodeType":"YulAssignment","src":"13722:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13745:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13730:3:111"},"nodeType":"YulFunctionCall","src":"13730:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13722:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13764:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13779:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13787:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13775:3:111"},"nodeType":"YulFunctionCall","src":"13775:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13757:6:111"},"nodeType":"YulFunctionCall","src":"13757:74:111"},"nodeType":"YulExpressionStatement","src":"13757:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13851:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13862:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13847:3:111"},"nodeType":"YulFunctionCall","src":"13847:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"13867:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13840:6:111"},"nodeType":"YulFunctionCall","src":"13840:34:111"},"nodeType":"YulExpressionStatement","src":"13840:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13673:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13684:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13692:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13703:4:111","type":""}],"src":"13567:313:111"},{"body":{"nodeType":"YulBlock","src":"14059:246:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14076:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14087:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14069:6:111"},"nodeType":"YulFunctionCall","src":"14069:21:111"},"nodeType":"YulExpressionStatement","src":"14069:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14110:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14121:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14106:3:111"},"nodeType":"YulFunctionCall","src":"14106:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14126:2:111","type":"","value":"56"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14099:6:111"},"nodeType":"YulFunctionCall","src":"14099:30:111"},"nodeType":"YulExpressionStatement","src":"14099:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14149:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14160:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14145:3:111"},"nodeType":"YulFunctionCall","src":"14145:18:111"},{"hexValue":"555550535570677261646561626c653a206d757374206e6f742062652063616c","kind":"string","nodeType":"YulLiteral","src":"14165:34:111","type":"","value":"UUPSUpgradeable: must not be cal"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14138:6:111"},"nodeType":"YulFunctionCall","src":"14138:62:111"},"nodeType":"YulExpressionStatement","src":"14138:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14231:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14216:3:111"},"nodeType":"YulFunctionCall","src":"14216:18:111"},{"hexValue":"6c6564207468726f7567682064656c656761746563616c6c","kind":"string","nodeType":"YulLiteral","src":"14236:26:111","type":"","value":"led through delegatecall"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14209:6:111"},"nodeType":"YulFunctionCall","src":"14209:54:111"},"nodeType":"YulExpressionStatement","src":"14209:54:111"},{"nodeType":"YulAssignment","src":"14272:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14284:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14295:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14280:3:111"},"nodeType":"YulFunctionCall","src":"14280:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14272:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14036:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14050:4:111","type":""}],"src":"13885:420:111"},{"body":{"nodeType":"YulBlock","src":"14391:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"14437:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14446:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14449:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14439:6:111"},"nodeType":"YulFunctionCall","src":"14439:12:111"},"nodeType":"YulExpressionStatement","src":"14439:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"14412:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"14421:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14408:3:111"},"nodeType":"YulFunctionCall","src":"14408:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"14433:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"14404:3:111"},"nodeType":"YulFunctionCall","src":"14404:32:111"},"nodeType":"YulIf","src":"14401:52:111"},{"nodeType":"YulAssignment","src":"14462:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14478:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14472:5:111"},"nodeType":"YulFunctionCall","src":"14472:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"14462:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14357:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"14368:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"14380:6:111","type":""}],"src":"14310:184:111"},{"body":{"nodeType":"YulBlock","src":"14673:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14690:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14701:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14683:6:111"},"nodeType":"YulFunctionCall","src":"14683:21:111"},"nodeType":"YulExpressionStatement","src":"14683:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14724:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14735:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14720:3:111"},"nodeType":"YulFunctionCall","src":"14720:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14740:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14713:6:111"},"nodeType":"YulFunctionCall","src":"14713:30:111"},"nodeType":"YulExpressionStatement","src":"14713:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14763:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14774:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14759:3:111"},"nodeType":"YulFunctionCall","src":"14759:18:111"},{"hexValue":"496e697469616c697a61626c653a20636f6e747261637420697320616c726561","kind":"string","nodeType":"YulLiteral","src":"14779:34:111","type":"","value":"Initializable: contract is alrea"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14752:6:111"},"nodeType":"YulFunctionCall","src":"14752:62:111"},"nodeType":"YulExpressionStatement","src":"14752:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14834:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14845:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14830:3:111"},"nodeType":"YulFunctionCall","src":"14830:18:111"},{"hexValue":"647920696e697469616c697a6564","kind":"string","nodeType":"YulLiteral","src":"14850:16:111","type":"","value":"dy initialized"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14823:6:111"},"nodeType":"YulFunctionCall","src":"14823:44:111"},"nodeType":"YulExpressionStatement","src":"14823:44:111"},{"nodeType":"YulAssignment","src":"14876:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14888:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14899:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14884:3:111"},"nodeType":"YulFunctionCall","src":"14884:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14876:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14650:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14664:4:111","type":""}],"src":"14499:410:111"},{"body":{"nodeType":"YulBlock","src":"15021:87:111","statements":[{"nodeType":"YulAssignment","src":"15031:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15043:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15054:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15039:3:111"},"nodeType":"YulFunctionCall","src":"15039:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15031:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15073:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15088:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15096:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15084:3:111"},"nodeType":"YulFunctionCall","src":"15084:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15066:6:111"},"nodeType":"YulFunctionCall","src":"15066:36:111"},"nodeType":"YulExpressionStatement","src":"15066:36:111"}]},"name":"abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14990:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15001:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15012:4:111","type":""}],"src":"14914:194:111"},{"body":{"nodeType":"YulBlock","src":"15287:167:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15304:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15315:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15297:6:111"},"nodeType":"YulFunctionCall","src":"15297:21:111"},"nodeType":"YulExpressionStatement","src":"15297:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15338:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15349:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15334:3:111"},"nodeType":"YulFunctionCall","src":"15334:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15354:2:111","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15327:6:111"},"nodeType":"YulFunctionCall","src":"15327:30:111"},"nodeType":"YulExpressionStatement","src":"15327:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15377:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15388:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15373:3:111"},"nodeType":"YulFunctionCall","src":"15373:18:111"},{"hexValue":"77726f6e6720756e74696c2f6166746572","kind":"string","nodeType":"YulLiteral","src":"15393:19:111","type":"","value":"wrong until/after"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15366:6:111"},"nodeType":"YulFunctionCall","src":"15366:47:111"},"nodeType":"YulExpressionStatement","src":"15366:47:111"},{"nodeType":"YulAssignment","src":"15422:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15434:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15445:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15430:3:111"},"nodeType":"YulFunctionCall","src":"15430:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15422:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0f5da87c25127e98fa2fcf8c3ca4e4215d5764c8cefd7e9612ed845c63b116e0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15264:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15278:4:111","type":""}],"src":"15113:341:111"},{"body":{"nodeType":"YulBlock","src":"15596:225:111","statements":[{"nodeType":"YulAssignment","src":"15606:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15618:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15629:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15614:3:111"},"nodeType":"YulFunctionCall","src":"15614:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15606:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15648:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15663:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15671:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15659:3:111"},"nodeType":"YulFunctionCall","src":"15659:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15641:6:111"},"nodeType":"YulFunctionCall","src":"15641:74:111"},"nodeType":"YulExpressionStatement","src":"15641:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15735:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15746:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15731:3:111"},"nodeType":"YulFunctionCall","src":"15731:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"15755:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15763:50:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15751:3:111"},"nodeType":"YulFunctionCall","src":"15751:63:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15724:6:111"},"nodeType":"YulFunctionCall","src":"15724:91:111"},"nodeType":"YulExpressionStatement","src":"15724:91:111"}]},"name":"abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15557:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15568:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15576:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15587:4:111","type":""}],"src":"15459:362:111"},{"body":{"nodeType":"YulBlock","src":"16000:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16017:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16028:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16010:6:111"},"nodeType":"YulFunctionCall","src":"16010:21:111"},"nodeType":"YulExpressionStatement","src":"16010:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16051:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16062:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16047:3:111"},"nodeType":"YulFunctionCall","src":"16047:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16067:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16040:6:111"},"nodeType":"YulFunctionCall","src":"16040:30:111"},"nodeType":"YulExpressionStatement","src":"16040:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16090:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16101:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16086:3:111"},"nodeType":"YulFunctionCall","src":"16086:18:111"},{"hexValue":"6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"16106:34:111","type":"","value":"account: not Owner or EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16079:6:111"},"nodeType":"YulFunctionCall","src":"16079:62:111"},"nodeType":"YulExpressionStatement","src":"16079:62:111"},{"nodeType":"YulAssignment","src":"16150:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16162:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16173:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16158:3:111"},"nodeType":"YulFunctionCall","src":"16158:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16150:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15977:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15991:4:111","type":""}],"src":"15826:356:111"},{"body":{"nodeType":"YulBlock","src":"16240:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16250:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"16259:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"16254:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16319:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16344:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16349:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16340:3:111"},"nodeType":"YulFunctionCall","src":"16340:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"16363:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"16368:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16359:3:111"},"nodeType":"YulFunctionCall","src":"16359:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16353:5:111"},"nodeType":"YulFunctionCall","src":"16353:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16333:6:111"},"nodeType":"YulFunctionCall","src":"16333:39:111"},"nodeType":"YulExpressionStatement","src":"16333:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16280:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16283:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"16277:2:111"},"nodeType":"YulFunctionCall","src":"16277:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"16291:19:111","statements":[{"nodeType":"YulAssignment","src":"16293:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16302:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"16305:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16298:3:111"},"nodeType":"YulFunctionCall","src":"16298:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"16293:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"16273:3:111","statements":[]},"src":"16269:113:111"},{"body":{"nodeType":"YulBlock","src":"16408:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"16421:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16426:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16417:3:111"},"nodeType":"YulFunctionCall","src":"16417:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"16435:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16410:6:111"},"nodeType":"YulFunctionCall","src":"16410:27:111"},"nodeType":"YulExpressionStatement","src":"16410:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"16397:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"16400:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16394:2:111"},"nodeType":"YulFunctionCall","src":"16394:13:111"},"nodeType":"YulIf","src":"16391:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"16218:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"16223:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16228:6:111","type":""}],"src":"16187:258:111"},{"body":{"nodeType":"YulBlock","src":"16587:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16597:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16617:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16611:5:111"},"nodeType":"YulFunctionCall","src":"16611:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"16601:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16659:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16667:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16655:3:111"},"nodeType":"YulFunctionCall","src":"16655:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"16674:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16679:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"16633:21:111"},"nodeType":"YulFunctionCall","src":"16633:53:111"},"nodeType":"YulExpressionStatement","src":"16633:53:111"},{"nodeType":"YulAssignment","src":"16695:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"16706:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"16711:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16702:3:111"},"nodeType":"YulFunctionCall","src":"16702:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"16695:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"16563:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16568:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"16579:3:111","type":""}],"src":"16450:274:111"},{"body":{"nodeType":"YulBlock","src":"16810:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"16856:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16865:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16868:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16858:6:111"},"nodeType":"YulFunctionCall","src":"16858:12:111"},"nodeType":"YulExpressionStatement","src":"16858:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"16831:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"16840:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16827:3:111"},"nodeType":"YulFunctionCall","src":"16827:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"16852:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"16823:3:111"},"nodeType":"YulFunctionCall","src":"16823:32:111"},"nodeType":"YulIf","src":"16820:52:111"},{"nodeType":"YulAssignment","src":"16881:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16897:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"16891:5:111"},"nodeType":"YulFunctionCall","src":"16891:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"16881:6:111"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16776:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"16787:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"16799:6:111","type":""}],"src":"16729:184:111"},{"body":{"nodeType":"YulBlock","src":"17092:236:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17109:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17120:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17102:6:111"},"nodeType":"YulFunctionCall","src":"17102:21:111"},"nodeType":"YulExpressionStatement","src":"17102:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17143:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17154:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17139:3:111"},"nodeType":"YulFunctionCall","src":"17139:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17159:2:111","type":"","value":"46"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17132:6:111"},"nodeType":"YulFunctionCall","src":"17132:30:111"},"nodeType":"YulExpressionStatement","src":"17132:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17182:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17193:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17178:3:111"},"nodeType":"YulFunctionCall","src":"17178:18:111"},{"hexValue":"45524331393637557067726164653a206e657720696d706c656d656e74617469","kind":"string","nodeType":"YulLiteral","src":"17198:34:111","type":"","value":"ERC1967Upgrade: new implementati"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17171:6:111"},"nodeType":"YulFunctionCall","src":"17171:62:111"},"nodeType":"YulExpressionStatement","src":"17171:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17253:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17264:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17249:3:111"},"nodeType":"YulFunctionCall","src":"17249:18:111"},{"hexValue":"6f6e206973206e6f742055555053","kind":"string","nodeType":"YulLiteral","src":"17269:16:111","type":"","value":"on is not UUPS"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17242:6:111"},"nodeType":"YulFunctionCall","src":"17242:44:111"},"nodeType":"YulExpressionStatement","src":"17242:44:111"},{"nodeType":"YulAssignment","src":"17295:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17307:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17318:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17303:3:111"},"nodeType":"YulFunctionCall","src":"17303:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17295:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17069:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17083:4:111","type":""}],"src":"16918:410:111"},{"body":{"nodeType":"YulBlock","src":"17507:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17524:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17535:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17517:6:111"},"nodeType":"YulFunctionCall","src":"17517:21:111"},"nodeType":"YulExpressionStatement","src":"17517:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17558:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17569:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17554:3:111"},"nodeType":"YulFunctionCall","src":"17554:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17574:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17547:6:111"},"nodeType":"YulFunctionCall","src":"17547:30:111"},"nodeType":"YulExpressionStatement","src":"17547:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17597:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17608:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17593:3:111"},"nodeType":"YulFunctionCall","src":"17593:18:111"},{"hexValue":"45524331393637557067726164653a20756e737570706f727465642070726f78","kind":"string","nodeType":"YulLiteral","src":"17613:34:111","type":"","value":"ERC1967Upgrade: unsupported prox"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17586:6:111"},"nodeType":"YulFunctionCall","src":"17586:62:111"},"nodeType":"YulExpressionStatement","src":"17586:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17668:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17679:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17664:3:111"},"nodeType":"YulFunctionCall","src":"17664:18:111"},{"hexValue":"6961626c6555554944","kind":"string","nodeType":"YulLiteral","src":"17684:11:111","type":"","value":"iableUUID"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17657:6:111"},"nodeType":"YulFunctionCall","src":"17657:39:111"},"nodeType":"YulExpressionStatement","src":"17657:39:111"},{"nodeType":"YulAssignment","src":"17705:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17717:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17728:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17713:3:111"},"nodeType":"YulFunctionCall","src":"17713:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17705:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17484:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17498:4:111","type":""}],"src":"17333:405:111"},{"body":{"nodeType":"YulBlock","src":"17917:178:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17934:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17945:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17927:6:111"},"nodeType":"YulFunctionCall","src":"17927:21:111"},"nodeType":"YulExpressionStatement","src":"17927:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17968:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17979:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17964:3:111"},"nodeType":"YulFunctionCall","src":"17964:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17984:2:111","type":"","value":"28"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17957:6:111"},"nodeType":"YulFunctionCall","src":"17957:30:111"},"nodeType":"YulExpressionStatement","src":"17957:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18007:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18018:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18003:3:111"},"nodeType":"YulFunctionCall","src":"18003:18:111"},{"hexValue":"6163636f756e743a206e6f742066726f6d20456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"18023:30:111","type":"","value":"account: not from EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17996:6:111"},"nodeType":"YulFunctionCall","src":"17996:58:111"},"nodeType":"YulExpressionStatement","src":"17996:58:111"},{"nodeType":"YulAssignment","src":"18063:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18075:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18086:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18071:3:111"},"nodeType":"YulFunctionCall","src":"18071:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18063:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17894:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17908:4:111","type":""}],"src":"17743:352:111"},{"body":{"nodeType":"YulBlock","src":"18291:14:111","statements":[{"nodeType":"YulAssignment","src":"18293:10:111","value":{"name":"pos","nodeType":"YulIdentifier","src":"18300:3:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"18293:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"18275:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"18283:3:111","type":""}],"src":"18100:205:111"},{"body":{"nodeType":"YulBlock","src":"18484:160:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18501:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18512:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18494:6:111"},"nodeType":"YulFunctionCall","src":"18494:21:111"},"nodeType":"YulExpressionStatement","src":"18494:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18535:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18546:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18531:3:111"},"nodeType":"YulFunctionCall","src":"18531:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18551:2:111","type":"","value":"10"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18524:6:111"},"nodeType":"YulFunctionCall","src":"18524:30:111"},"nodeType":"YulExpressionStatement","src":"18524:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18574:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18585:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18570:3:111"},"nodeType":"YulFunctionCall","src":"18570:18:111"},{"hexValue":"6f6e6c79206f776e6572","kind":"string","nodeType":"YulLiteral","src":"18590:12:111","type":"","value":"only owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18563:6:111"},"nodeType":"YulFunctionCall","src":"18563:40:111"},"nodeType":"YulExpressionStatement","src":"18563:40:111"},{"nodeType":"YulAssignment","src":"18612:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18624:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18635:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18620:3:111"},"nodeType":"YulFunctionCall","src":"18620:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18612:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18461:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18475:4:111","type":""}],"src":"18310:334:111"},{"body":{"nodeType":"YulBlock","src":"18823:235:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18840:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18851:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18833:6:111"},"nodeType":"YulFunctionCall","src":"18833:21:111"},"nodeType":"YulExpressionStatement","src":"18833:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18874:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18885:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18870:3:111"},"nodeType":"YulFunctionCall","src":"18870:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18890:2:111","type":"","value":"45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18863:6:111"},"nodeType":"YulFunctionCall","src":"18863:30:111"},"nodeType":"YulExpressionStatement","src":"18863:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18913:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18924:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18909:3:111"},"nodeType":"YulFunctionCall","src":"18909:18:111"},{"hexValue":"455243313936373a206e657720696d706c656d656e746174696f6e206973206e","kind":"string","nodeType":"YulLiteral","src":"18929:34:111","type":"","value":"ERC1967: new implementation is n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18902:6:111"},"nodeType":"YulFunctionCall","src":"18902:62:111"},"nodeType":"YulExpressionStatement","src":"18902:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18984:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18995:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18980:3:111"},"nodeType":"YulFunctionCall","src":"18980:18:111"},{"hexValue":"6f74206120636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"19000:15:111","type":"","value":"ot a contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18973:6:111"},"nodeType":"YulFunctionCall","src":"18973:43:111"},"nodeType":"YulExpressionStatement","src":"18973:43:111"},{"nodeType":"YulAssignment","src":"19025:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19037:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19048:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19033:3:111"},"nodeType":"YulFunctionCall","src":"19033:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19025:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18800:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18814:4:111","type":""}],"src":"18649:409:111"},{"body":{"nodeType":"YulBlock","src":"19283:160:111","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19300:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19305:66:111","type":"","value":"0x19457468657265756d205369676e6564204d6573736167653a0a333200000000"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19293:6:111"},"nodeType":"YulFunctionCall","src":"19293:79:111"},"nodeType":"YulExpressionStatement","src":"19293:79:111"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19392:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19397:2:111","type":"","value":"28"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19388:3:111"},"nodeType":"YulFunctionCall","src":"19388:12:111"},{"name":"value0","nodeType":"YulIdentifier","src":"19402:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19381:6:111"},"nodeType":"YulFunctionCall","src":"19381:28:111"},"nodeType":"YulExpressionStatement","src":"19381:28:111"},{"nodeType":"YulAssignment","src":"19418:19:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"19429:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19434:2:111","type":"","value":"60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19425:3:111"},"nodeType":"YulFunctionCall","src":"19425:12:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"19418:3:111"}]}]},"name":"abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"19259:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"19264:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"19275:3:111","type":""}],"src":"19063:380:111"},{"body":{"nodeType":"YulBlock","src":"19480:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19497:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19500:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19490:6:111"},"nodeType":"YulFunctionCall","src":"19490:88:111"},"nodeType":"YulExpressionStatement","src":"19490:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19594:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"19597:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19587:6:111"},"nodeType":"YulFunctionCall","src":"19587:15:111"},"nodeType":"YulExpressionStatement","src":"19587:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19618:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19621:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19611:6:111"},"nodeType":"YulFunctionCall","src":"19611:15:111"},"nodeType":"YulExpressionStatement","src":"19611:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"19448:184:111"},{"body":{"nodeType":"YulBlock","src":"19811:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19828:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19839:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19821:6:111"},"nodeType":"YulFunctionCall","src":"19821:21:111"},"nodeType":"YulExpressionStatement","src":"19821:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19862:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19873:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19858:3:111"},"nodeType":"YulFunctionCall","src":"19858:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19878:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19851:6:111"},"nodeType":"YulFunctionCall","src":"19851:30:111"},"nodeType":"YulExpressionStatement","src":"19851:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19901:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19912:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19897:3:111"},"nodeType":"YulFunctionCall","src":"19897:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265","kind":"string","nodeType":"YulLiteral","src":"19917:26:111","type":"","value":"ECDSA: invalid signature"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19890:6:111"},"nodeType":"YulFunctionCall","src":"19890:54:111"},"nodeType":"YulExpressionStatement","src":"19890:54:111"},{"nodeType":"YulAssignment","src":"19953:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19976:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19961:3:111"},"nodeType":"YulFunctionCall","src":"19961:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19953:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19788:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19802:4:111","type":""}],"src":"19637:348:111"},{"body":{"nodeType":"YulBlock","src":"20164:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20181:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20192:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20174:6:111"},"nodeType":"YulFunctionCall","src":"20174:21:111"},"nodeType":"YulExpressionStatement","src":"20174:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20215:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20226:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20211:3:111"},"nodeType":"YulFunctionCall","src":"20211:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20231:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20204:6:111"},"nodeType":"YulFunctionCall","src":"20204:30:111"},"nodeType":"YulExpressionStatement","src":"20204:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20254:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20265:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20250:3:111"},"nodeType":"YulFunctionCall","src":"20250:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265206c656e677468","kind":"string","nodeType":"YulLiteral","src":"20270:33:111","type":"","value":"ECDSA: invalid signature length"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20243:6:111"},"nodeType":"YulFunctionCall","src":"20243:61:111"},"nodeType":"YulExpressionStatement","src":"20243:61:111"},{"nodeType":"YulAssignment","src":"20313:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20336:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20321:3:111"},"nodeType":"YulFunctionCall","src":"20321:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20313:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20141:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20155:4:111","type":""}],"src":"19990:355:111"},{"body":{"nodeType":"YulBlock","src":"20524:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20541:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20552:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20534:6:111"},"nodeType":"YulFunctionCall","src":"20534:21:111"},"nodeType":"YulExpressionStatement","src":"20534:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20575:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20586:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20571:3:111"},"nodeType":"YulFunctionCall","src":"20571:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20591:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20564:6:111"},"nodeType":"YulFunctionCall","src":"20564:30:111"},"nodeType":"YulExpressionStatement","src":"20564:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20614:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20625:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20610:3:111"},"nodeType":"YulFunctionCall","src":"20610:18:111"},{"hexValue":"45434453413a20696e76616c6964207369676e6174757265202773272076616c","kind":"string","nodeType":"YulLiteral","src":"20630:34:111","type":"","value":"ECDSA: invalid signature 's' val"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20603:6:111"},"nodeType":"YulFunctionCall","src":"20603:62:111"},"nodeType":"YulExpressionStatement","src":"20603:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20685:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20696:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20681:3:111"},"nodeType":"YulFunctionCall","src":"20681:18:111"},{"hexValue":"7565","kind":"string","nodeType":"YulLiteral","src":"20701:4:111","type":"","value":"ue"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20674:6:111"},"nodeType":"YulFunctionCall","src":"20674:32:111"},"nodeType":"YulExpressionStatement","src":"20674:32:111"},{"nodeType":"YulAssignment","src":"20715:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20727:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20738:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20723:3:111"},"nodeType":"YulFunctionCall","src":"20723:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20715:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20501:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20515:4:111","type":""}],"src":"20350:398:111"},{"body":{"nodeType":"YulBlock","src":"20934:217:111","statements":[{"nodeType":"YulAssignment","src":"20944:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20956:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20967:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20952:3:111"},"nodeType":"YulFunctionCall","src":"20952:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20944:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20987:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"20998:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20980:6:111"},"nodeType":"YulFunctionCall","src":"20980:25:111"},"nodeType":"YulExpressionStatement","src":"20980:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21025:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21036:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21021:3:111"},"nodeType":"YulFunctionCall","src":"21021:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"21045:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21053:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"21041:3:111"},"nodeType":"YulFunctionCall","src":"21041:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21014:6:111"},"nodeType":"YulFunctionCall","src":"21014:45:111"},"nodeType":"YulExpressionStatement","src":"21014:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21079:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21090:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21075:3:111"},"nodeType":"YulFunctionCall","src":"21075:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"21095:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21068:6:111"},"nodeType":"YulFunctionCall","src":"21068:34:111"},"nodeType":"YulExpressionStatement","src":"21068:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21122:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21133:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21118:3:111"},"nodeType":"YulFunctionCall","src":"21118:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"21138:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21111:6:111"},"nodeType":"YulFunctionCall","src":"21111:34:111"},"nodeType":"YulExpressionStatement","src":"21111:34:111"}]},"name":"abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20879:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"20890:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"20898:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"20906:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20914:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20925:4:111","type":""}],"src":"20753:398:111"},{"body":{"nodeType":"YulBlock","src":"21330:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21347:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21358:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21340:6:111"},"nodeType":"YulFunctionCall","src":"21340:21:111"},"nodeType":"YulExpressionStatement","src":"21340:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21381:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21392:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21377:3:111"},"nodeType":"YulFunctionCall","src":"21377:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21397:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21370:6:111"},"nodeType":"YulFunctionCall","src":"21370:30:111"},"nodeType":"YulExpressionStatement","src":"21370:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21420:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21431:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21416:3:111"},"nodeType":"YulFunctionCall","src":"21416:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"21436:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21409:6:111"},"nodeType":"YulFunctionCall","src":"21409:59:111"},"nodeType":"YulExpressionStatement","src":"21409:59:111"},{"nodeType":"YulAssignment","src":"21477:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21489:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21500:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21485:3:111"},"nodeType":"YulFunctionCall","src":"21485:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21477:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21307:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21321:4:111","type":""}],"src":"21156:353:111"},{"body":{"nodeType":"YulBlock","src":"21635:321:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21652:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21663:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21645:6:111"},"nodeType":"YulFunctionCall","src":"21645:21:111"},"nodeType":"YulExpressionStatement","src":"21645:21:111"},{"nodeType":"YulVariableDeclaration","src":"21675:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21695:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21689:5:111"},"nodeType":"YulFunctionCall","src":"21689:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"21679:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21722:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21733:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21718:3:111"},"nodeType":"YulFunctionCall","src":"21718:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"21738:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21711:6:111"},"nodeType":"YulFunctionCall","src":"21711:34:111"},"nodeType":"YulExpressionStatement","src":"21711:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21780:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21788:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21776:3:111"},"nodeType":"YulFunctionCall","src":"21776:15:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21797:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21808:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21793:3:111"},"nodeType":"YulFunctionCall","src":"21793:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"21813:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"21754:21:111"},"nodeType":"YulFunctionCall","src":"21754:66:111"},"nodeType":"YulExpressionStatement","src":"21754:66:111"},{"nodeType":"YulAssignment","src":"21829:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21845:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"21864:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21872:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21860:3:111"},"nodeType":"YulFunctionCall","src":"21860:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"21877:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"21856:3:111"},"nodeType":"YulFunctionCall","src":"21856:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21841:3:111"},"nodeType":"YulFunctionCall","src":"21841:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"21947:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21837:3:111"},"nodeType":"YulFunctionCall","src":"21837:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21829:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21604:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"21615:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21626:4:111","type":""}],"src":"21514:442:111"}]},"contents":"{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_uint256t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_1 := calldataload(add(headStart, 160))\n if gt(offset_1, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_array_address_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_calldata_ptrt_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_uint48__to_t_uint48__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffff))\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_addresst_bytes_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value1 := memPtr\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_array$_t_uint256_$dyn_calldata_ptrt_array$_t_uint256_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n let offset_1 := calldataload(add(headStart, 96))\n if gt(offset_1, _1) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_address_dyn_calldata(add(headStart, offset_1), dataEnd)\n value4 := value4_1\n value5 := value5_1\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _1) { revert(0, 0) }\n let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_2), dataEnd)\n value6 := value6_1\n value7 := value7_1\n }\n function abi_decode_uint48(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint48t_uint48(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := abi_decode_uint48(add(headStart, 32))\n value2 := abi_decode_uint48(add(headStart, 64))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_stringliteral_046f63b53432b31c38dcec6b5f05e3d65602d684f9163a89310aaaf94e08558e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"wrong array lengths\")\n tail := add(headStart, 96)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_36e108fa7a809b52ab1951dd91c117a7bc9ac5250bdf1aa162d4e104f7edf9eb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_52f1ead4d9653e13afbd2e90ef2587c30187cd50b2e97d784e3f7a7541247434__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"Function must be called through \")\n mstore(add(headStart, 96), \"active proxy\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_67f0151b4ad1dcfa0e3302a0cd6019f51582ef1807b37dceb00bd852a514f7f4__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 56)\n mstore(add(headStart, 64), \"UUPSUpgradeable: must not be cal\")\n mstore(add(headStart, 96), \"led through delegatecall\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"Initializable: contract is alrea\")\n mstore(add(headStart, 96), \"dy initialized\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_0f5da87c25127e98fa2fcf8c3ca4e4215d5764c8cefd7e9612ed845c63b116e0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"wrong until/after\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_rational_0_by_1__to_t_address_t_uint192__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_stringliteral_26bf1d2fa883929ce8db7f4593c3a7f27ec5e761d3beb6ef3a9db5c68fe51d21__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"account: not Owner or EntryPoint\")\n tail := add(headStart, 96)\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 46)\n mstore(add(headStart, 64), \"ERC1967Upgrade: new implementati\")\n mstore(add(headStart, 96), \"on is not UUPS\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"ERC1967Upgrade: unsupported prox\")\n mstore(add(headStart, 96), \"iableUUID\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_f684c2c0c9ec797849b62669189fe025e9077c00ba7812987ce38c0071ad7a50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 28)\n mstore(add(headStart, 64), \"account: not from EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos) -> end\n { end := pos }\n function abi_encode_tuple_t_stringliteral_ae2932905fc5bb055d2e7b29311075afd0dbf688106cf649cb515d342f4c7367__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"only owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 45)\n mstore(add(headStart, 64), \"ERC1967: new implementation is n\")\n mstore(add(headStart, 96), \"ot a contract\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n copy_memory_to_memory(add(value0, 32), add(headStart, 64), length)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"3559":[{"length":32,"start":1843},{"length":32,"start":1993},{"length":32,"start":2688},{"length":32,"start":2838},{"length":32,"start":3141}],"13841":[{"length":32,"start":1009},{"length":32,"start":2325},{"length":32,"start":2492},{"length":32,"start":3474},{"length":32,"start":4277},{"length":32,"start":4348},{"length":32,"start":5120},{"length":32,"start":5803}]},"linkReferences":{},"object":"60806040526004361061016d5760003560e01c80634f1ef286116100cb578063bc197c811161007f578063cf6dca5511610059578063cf6dca55146104b2578063d087d288146104d2578063f23a6e61146104e757600080fd5b8063bc197c8114610435578063c399ec881461047d578063c4d66de81461049257600080fd5b80638da5cb5b116100b05780638da5cb5b1461038a578063b0d691fe146103e2578063b61d27f61461041557600080fd5b80634f1ef2861461036257806352d1902d1461037557600080fd5b80633a871cdd116101225780633fb5a7a1116101075780633fb5a7a1146103055780634a58db191461033a5780634d44560d1461034257600080fd5b80633a871cdd1461028b5780633e476951146102b957600080fd5b8063150b7a0211610153578063150b7a02146101d557806318dfb3c71461024b5780633659cfe61461026b57600080fd5b806223de291461017957806301ffc9a7146101a057600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019e610194366004611d11565b5050505050505050565b005b3480156101ac57600080fd5b506101c06101bb366004611dc2565b61052d565b60405190151581526020015b60405180910390f35b3480156101e157600080fd5b5061021a6101f0366004611e04565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101cc565b34801561025757600080fd5b5061019e610266366004611ebc565b610612565b34801561027757600080fd5b5061019e610286366004611f28565b61071c565b34801561029757600080fd5b506102ab6102a6366004611f45565b6108ed565b6040519081526020016101cc565b3480156102c557600080fd5b506102ee6102d4366004611f28565b60026020526000908152604090205465ffffffffffff1681565b60405165ffffffffffff90911681526020016101cc565b34801561031157600080fd5b506102ee610320366004611f28565b60016020526000908152604090205465ffffffffffff1681565b61019e610913565b34801561034e57600080fd5b5061019e61035d366004611f99565b6109b2565b61019e610370366004611ff4565b610a69565b34801561038157600080fd5b506102ab610c2b565b34801561039657600080fd5b506000546103bd9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b3480156103ee57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103bd565b34801561042157600080fd5b5061019e6104303660046120d6565b610cfd565b34801561044157600080fd5b5061021a610450366004612126565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561048957600080fd5b506102ab610d4c565b34801561049e57600080fd5b5061019e6104ad366004611f28565b610e03565b3480156104be57600080fd5b5061019e6104cd3660046121df565b610f8e565b3480156104de57600080fd5b506102ab611068565b3480156104f357600080fd5b5061021a610502366004612224565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806105c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061060c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61061a6110e4565b82811461066e5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b838110156107155761070385858381811061068e5761068e6122a0565b90506020020160208101906106a39190611f28565b60008585858181106106b7576106b76122a0565b90506020028101906106c991906122cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119392505050565b8061070d81612334565b915050610671565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036107c75760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661083c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146108c55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b6108ce81611210565b604080516000808252602082019092526108ea91839190611218565b50565b60006108f76113e8565b610901848461146d565b905061090c82611573565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561099e57600080fd5b505af1158015610715573d6000803e3d6000fd5b6109ba6115de565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610b145760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610665565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b897f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c125760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610665565b610c1b82611210565b610c2782826001611218565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cd85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610665565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d056110e4565b610d46848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119392505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe9190612393565b905090565b600054610100900460ff1615808015610e235750600054600160ff909116105b80610e3d5750303b158015610e3d575060005460ff166001145b610eaf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610665565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f1682611655565b610f2882600065ffffffffffff610f8e565b8015610c2757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b610f966115de565b8165ffffffffffff168165ffffffffffff1611610ff55760405162461bcd60e51b815260206004820152601160248201527f77726f6e6720756e74696c2f61667465720000000000000000000000000000006044820152606401610665565b73ffffffffffffffffffffffffffffffffffffffff929092166000908152600160209081526040808320805465ffffffffffff9586167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009182161790915560029092529091208054929093169116179055565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610dbd565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611145575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b6111915760405162461bcd60e51b815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e746044820152606401610665565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516111bc91906123d8565b60006040518083038185875af1925050503d80600081146111f9576040519150601f19603f3d011682016040523d82523d6000602084013e6111fe565b606091505b50915091508161071557805160208201fd5b6108ea6115de565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156112505761124b836116f4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112d5575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112d291810190612393565b60015b6113475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146113dc5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610665565b5061124b8383836117e4565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146111915760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610665565b6000806114c7836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006115196114dc6101408701876122cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506118099050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602090815260408083205460019092529091205491925065ffffffffffff9081169116811561156781848461182d565b98975050505050505050565b80156108ea5760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e610715565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061160957503330145b6111915760405162461bcd60e51b815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610665565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b61177e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610665565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6117ed83611865565b6000825111806117fa5750805b1561124b57610d4683836118b2565b600080600061181885856118d7565b915091506118258161191c565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85611855576000611858565b60015b60ff161717949350505050565b61186e816116f4565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061090c838360405180606001604052806027815260200161247560279139611a81565b600080825160410361190d5760208301516040840151606085015160001a61190187828585611b06565b94509450505050611915565b506000905060025b9250929050565b6000816004811115611930576119306123f4565b036119385750565b600181600481111561194c5761194c6123f4565b036119995760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610665565b60028160048111156119ad576119ad6123f4565b036119fa5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610665565b6003816004811115611a0e57611a0e6123f4565b036108ea5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610665565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611aab91906123d8565b600060405180830381855af49150503d8060008114611ae6576040519150601f19603f3d011682016040523d82523d6000602084013e611aeb565b606091505b5091509150611afc86838387611bf5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b3d5750600090506003611bec565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611b91573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611be557600060019250925050611bec565b9150600090505b94509492505050565b60608315611c71578251600003611c6a5773ffffffffffffffffffffffffffffffffffffffff85163b611c6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610665565b5081611c7b565b611c7b8383611c83565b949350505050565b815115611c935781518083602001fd5b8060405162461bcd60e51b81526004016106659190612423565b73ffffffffffffffffffffffffffffffffffffffff811681146108ea57600080fd5b60008083601f840112611ce157600080fd5b50813567ffffffffffffffff811115611cf957600080fd5b60208301915083602082850101111561191557600080fd5b60008060008060008060008060c0898b031215611d2d57600080fd5b8835611d3881611cad565b97506020890135611d4881611cad565b96506040890135611d5881611cad565b955060608901359450608089013567ffffffffffffffff80821115611d7c57600080fd5b611d888c838d01611ccf565b909650945060a08b0135915080821115611da157600080fd5b50611dae8b828c01611ccf565b999c989b5096995094979396929594505050565b600060208284031215611dd457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461090c57600080fd5b600080600080600060808688031215611e1c57600080fd5b8535611e2781611cad565b94506020860135611e3781611cad565b935060408601359250606086013567ffffffffffffffff811115611e5a57600080fd5b611e6688828901611ccf565b969995985093965092949392505050565b60008083601f840112611e8957600080fd5b50813567ffffffffffffffff811115611ea157600080fd5b6020830191508360208260051b850101111561191557600080fd5b60008060008060408587031215611ed257600080fd5b843567ffffffffffffffff80821115611eea57600080fd5b611ef688838901611e77565b90965094506020870135915080821115611f0f57600080fd5b50611f1c87828801611e77565b95989497509550505050565b600060208284031215611f3a57600080fd5b813561090c81611cad565b600080600060608486031215611f5a57600080fd5b833567ffffffffffffffff811115611f7157600080fd5b84016101608187031215611f8457600080fd5b95602085013595506040909401359392505050565b60008060408385031215611fac57600080fd5b8235611fb781611cad565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561200757600080fd5b823561201281611cad565b9150602083013567ffffffffffffffff8082111561202f57600080fd5b818501915085601f83011261204357600080fd5b81358181111561205557612055611fc5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561209b5761209b611fc5565b816040528281528860208487010111156120b457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600080606085870312156120ec57600080fd5b84356120f781611cad565b935060208501359250604085013567ffffffffffffffff81111561211a57600080fd5b611f1c87828801611ccf565b60008060008060008060008060a0898b03121561214257600080fd5b883561214d81611cad565b9750602089013561215d81611cad565b9650604089013567ffffffffffffffff8082111561217a57600080fd5b6121868c838d01611e77565b909850965060608b013591508082111561219f57600080fd5b6121ab8c838d01611e77565b909650945060808b0135915080821115611da157600080fd5b803565ffffffffffff811681146121da57600080fd5b919050565b6000806000606084860312156121f457600080fd5b83356121ff81611cad565b925061220d602085016121c4565b915061221b604085016121c4565b90509250925092565b60008060008060008060a0878903121561223d57600080fd5b863561224881611cad565b9550602087013561225881611cad565b94506040870135935060608701359250608087013567ffffffffffffffff81111561228257600080fd5b61228e89828a01611ccf565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230457600080fd5b83018035915067ffffffffffffffff82111561231f57600080fd5b60200191503681900382131561191557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361238c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156123a557600080fd5b5051919050565b60005b838110156123c75781810151838201526020016123af565b83811115610d465750506000910152565b600082516123ea8184602087016123ac565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526124428160408501602087016123ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122035f15871df579f48453cdeb0e8dca0c528583a84b556fd1f9ed9ff8b0f91532b64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x16D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F1EF286 GT PUSH2 0xCB JUMPI DUP1 PUSH4 0xBC197C81 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xCF6DCA55 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xCF6DCA55 EQ PUSH2 0x4B2 JUMPI DUP1 PUSH4 0xD087D288 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x435 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xC4D66DE8 EQ PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x38A JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x3E2 JUMPI DUP1 PUSH4 0xB61D27F6 EQ PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F1EF286 EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x52D1902D EQ PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3A871CDD GT PUSH2 0x122 JUMPI DUP1 PUSH4 0x3FB5A7A1 GT PUSH2 0x107 JUMPI DUP1 PUSH4 0x3FB5A7A1 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x4A58DB19 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x4D44560D EQ PUSH2 0x342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x3E476951 EQ PUSH2 0x2B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x150B7A02 GT PUSH2 0x153 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x18DFB3C7 EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH3 0x23DE29 EQ PUSH2 0x179 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE PUSH2 0x174 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x194 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D11 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C0 PUSH2 0x1BB CALLDATASIZE PUSH1 0x4 PUSH2 0x1DC2 JUMP JUMPDEST PUSH2 0x52D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E04 JUMP JUMPDEST PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EBC JUMP JUMPDEST PUSH2 0x612 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH2 0x71C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0x2A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F45 JUMP JUMPDEST PUSH2 0x8ED JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EE PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x311 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EE PUSH2 0x320 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x19E PUSH2 0x913 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x35D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F99 JUMP JUMPDEST PUSH2 0x9B2 JUMP JUMPDEST PUSH2 0x19E PUSH2 0x370 CALLDATASIZE PUSH1 0x4 PUSH2 0x1FF4 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0xC2B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x396 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH2 0x3BD SWAP1 PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0x0 PUSH2 0x3BD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x430 CALLDATASIZE PUSH1 0x4 PUSH2 0x20D6 JUMP JUMPDEST PUSH2 0xCFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x450 CALLDATASIZE PUSH1 0x4 PUSH2 0x2126 JUMP JUMPDEST PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0xD4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1F28 JUMP JUMPDEST PUSH2 0xE03 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH2 0x4CD CALLDATASIZE PUSH1 0x4 PUSH2 0x21DF JUMP JUMPDEST PUSH2 0xF8E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AB PUSH2 0x1068 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x502 CALLDATASIZE PUSH1 0x4 PUSH2 0x2224 JUMP JUMPDEST PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x5C0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x4E2312E000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x60C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x61A PUSH2 0x10E4 JUMP JUMPDEST DUP3 DUP2 EQ PUSH2 0x66E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E67206172726179206C656E6774687300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x715 JUMPI PUSH2 0x703 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x68E JUMPI PUSH2 0x68E PUSH2 0x22A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x6A3 SWAP2 SWAP1 PUSH2 0x1F28 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x22A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x6C9 SWAP2 SWAP1 PUSH2 0x22CF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1193 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x70D DUP2 PUSH2 0x2334 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0x7C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x83C PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8C5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0x8CE DUP2 PUSH2 0x1210 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x8EA SWAP2 DUP4 SWAP2 SWAP1 PUSH2 0x1218 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8F7 PUSH2 0x13E8 JUMP JUMPDEST PUSH2 0x901 DUP5 DUP5 PUSH2 0x146D JUMP JUMPDEST SWAP1 POP PUSH2 0x90C DUP3 PUSH2 0x1573 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x9BA PUSH2 0x15DE JUMP JUMPDEST PUSH32 0x0 PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND ADDRESS SUB PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x64656C656761746563616C6C0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xB89 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC12 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x46756E6374696F6E206D7573742062652063616C6C6564207468726F75676820 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6163746976652070726F78790000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH2 0xC1B DUP3 PUSH2 0x1210 JUMP JUMPDEST PUSH2 0xC27 DUP3 DUP3 PUSH1 0x1 PUSH2 0x1218 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xCD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x38 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x555550535570677261646561626C653A206D757374206E6F742062652063616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C6564207468726F7567682064656C656761746563616C6C0000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC SWAP1 JUMP JUMPDEST PUSH2 0xD05 PUSH2 0x10E4 JUMP JUMPDEST PUSH2 0xD46 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1193 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDDA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDFE SWAP2 SWAP1 PUSH2 0x2393 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 DUP1 ISZERO PUSH2 0xE23 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xFF SWAP1 SWAP2 AND LT JUMPDEST DUP1 PUSH2 0xE3D JUMPI POP ADDRESS EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE3D JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xEAF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x647920696E697469616C697A6564000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xF0D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND PUSH2 0x100 OR SWAP1 SSTORE JUMPDEST PUSH2 0xF16 DUP3 PUSH2 0x1655 JUMP JUMPDEST PUSH2 0xF28 DUP3 PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF PUSH2 0xF8E JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC27 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0x7F26B83FF96E1F2B6A682F133852F6798A09C465DA95921460CEFB3847402498 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0xF96 PUSH2 0x15DE JUMP JUMPDEST DUP2 PUSH6 0xFFFFFFFFFFFF AND DUP2 PUSH6 0xFFFFFFFFFFFF AND GT PUSH2 0xFF5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x77726F6E6720756E74696C2F6166746572000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH6 0xFFFFFFFFFFFF SWAP6 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x35567E1A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x35567E1A SWAP1 PUSH1 0x44 ADD PUSH2 0xDBD JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ DUP1 PUSH2 0x1145 JUMPI POP PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F74204F776E6572206F7220456E747279506F696E74 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x11BC SWAP2 SWAP1 PUSH2 0x23D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x11F9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x11FE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x715 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x8EA PUSH2 0x15DE JUMP JUMPDEST PUSH32 0x4910FDFA16FED3260ED0E7147F7CC6DA11A60208B5B9406D12A635614FFD9143 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1250 JUMPI PUSH2 0x124B DUP4 PUSH2 0x16F4 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x52D1902D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x12D5 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x12D2 SWAP2 DUP2 ADD SWAP1 PUSH2 0x2393 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1347 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A206E657720696D706C656D656E74617469 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F6E206973206E6F742055555053000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 EQ PUSH2 0x13DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524331393637557067726164653A20756E737570706F727465642070726F78 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6961626C65555549440000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST POP PUSH2 0x124B DUP4 DUP4 DUP4 PUSH2 0x17E4 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6163636F756E743A206E6F742066726F6D20456E747279506F696E7400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x14C7 DUP4 PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1519 PUSH2 0x14DC PUSH2 0x140 DUP8 ADD DUP8 PUSH2 0x22CF JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP7 SWAP4 SWAP3 POP POP PUSH2 0x1809 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x1 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP2 SWAP3 POP PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND DUP2 ISZERO PUSH2 0x1567 DUP2 DUP5 DUP5 PUSH2 0x182D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8EA JUMPI PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP5 SWAP1 DUP5 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x715 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x715 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH3 0x10000 SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ DUP1 PUSH2 0x1609 JUMPI POP CALLER ADDRESS EQ JUMPDEST PUSH2 0x1191 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C79206F776E657200000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000FFFF AND PUSH3 0x10000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR DUP1 DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 DIV DUP3 AND SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH32 0x47E55C76E7A6F1FD8996A1DA8008C1EA29699CCA35E7BCD057F2DEC313B6E5DE SWAP2 LOG3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE PUSH2 0x177E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x17ED DUP4 PUSH2 0x1865 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD GT DUP1 PUSH2 0x17FA JUMPI POP DUP1 JUMPDEST ISZERO PUSH2 0x124B JUMPI PUSH2 0xD46 DUP4 DUP4 PUSH2 0x18B2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1818 DUP6 DUP6 PUSH2 0x18D7 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1825 DUP2 PUSH2 0x191C JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x1855 JUMPI PUSH1 0x0 PUSH2 0x1858 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x186E DUP2 PUSH2 0x16F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x90C DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2475 PUSH1 0x27 SWAP2 CODECOPY PUSH2 0x1A81 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x190D JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x1901 DUP8 DUP3 DUP6 DUP6 PUSH2 0x1B06 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x1915 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1930 JUMPI PUSH2 0x1930 PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x1938 JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x194C JUMPI PUSH2 0x194C PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x1999 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x19AD JUMPI PUSH2 0x19AD PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x19FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1A0E JUMPI PUSH2 0x1A0E PUSH2 0x23F4 JUMP JUMPDEST SUB PUSH2 0x8EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x665 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD PUSH2 0x1AAB SWAP2 SWAP1 PUSH2 0x23D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1AE6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1AEB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1AFC DUP7 DUP4 DUP4 DUP8 PUSH2 0x1BF5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0x1B3D JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1BE5 JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x1BEC JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1C71 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1C6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1C6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x665 JUMP JUMPDEST POP DUP2 PUSH2 0x1C7B JUMP JUMPDEST PUSH2 0x1C7B DUP4 DUP4 PUSH2 0x1C83 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x1C93 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x2423 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x8EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x1D2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x1D38 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x1D48 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x1D58 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D88 DUP13 DUP4 DUP14 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0xA0 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DAE DUP12 DUP3 DUP13 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1DD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1E27 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1E37 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E66 DUP9 DUP3 DUP10 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1E89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1ED2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EF6 DUP9 DUP4 DUP10 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1F0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F1C DUP8 DUP3 DUP9 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x90C DUP2 PUSH2 0x1CAD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1FAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1FB7 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2007 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2012 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x202F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2055 JUMPI PUSH2 0x2055 PUSH2 0x1FC5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x209B JUMPI PUSH2 0x209B PUSH2 0x1FC5 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP9 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x20B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP5 DUP4 ADD ADD MSTORE DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x20EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x20F7 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x211A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F1C DUP8 DUP3 DUP9 ADD PUSH2 0x1CCF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x2142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x214D DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x215D DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x217A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2186 DUP13 DUP4 DUP14 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x219F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21AB DUP13 DUP4 DUP14 ADD PUSH2 0x1E77 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP12 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x21DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x21F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x21FF DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP3 POP PUSH2 0x220D PUSH1 0x20 DUP6 ADD PUSH2 0x21C4 JUMP JUMPDEST SWAP2 POP PUSH2 0x221B PUSH1 0x40 DUP6 ADD PUSH2 0x21C4 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x223D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2248 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2258 DUP2 PUSH2 0x1CAD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x228E DUP10 DUP3 DUP11 ADD PUSH2 0x1CCF JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2304 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x231F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x1915 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x238C JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x23C7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x23AF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD46 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x23EA DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x23AC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x2442 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x23AC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH13 0x6F772D6C6576656C2064656C65 PUSH8 0x6174652063616C6C KECCAK256 PUSH7 0x61696C6564A264 PUSH10 0x7066735822122035F158 PUSH18 0xDF579F48453CDEB0E8DCA0C528583A84B556 REVERT 0x1F SWAP15 0xD9 SELFDESTRUCT DUP12 0xF SWAP2 MSTORE8 0x2B PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"480:1492:96:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:176:86;;;;;;;;;;-1:-1:-1;581:176:86;;;;;:::i;:::-;;;;;;;;;;;;1489:298;;;;;;;;;;-1:-1:-1;1489:298:86;;;;;:::i;:::-;;:::i;:::-;;;2237:14:111;;2230:22;2212:41;;2200:2;2185:18;1489:298:86;;;;;;;;763:212;;;;;;;;;;-1:-1:-1;763:212:86;;;;;:::i;:::-;927:41;763:212;;;;;;;;;;;3197:66:111;3185:79;;;3167:98;;3155:2;3140:18;763:212:86;3023:248:111;1902:297:73;;;;;;;;;;-1:-1:-1;1902:297:73;;;;;:::i;:::-;;:::i;3073:197:32:-;;;;;;;;;;-1:-1:-1;3073:197:32;;;;;:::i;:::-;;:::i;1458:353:51:-;;;;;;;;;;-1:-1:-1;1458:353:51;;;;;:::i;:::-;;:::i;:::-;;;5370:25:111;;;5358:2;5343:18;1458:353:51;5224:177:111;610:44:96;;;;;;;;;;-1:-1:-1;610:44:96;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5580:14:111;5568:27;;;5550:46;;5538:2;5523:18;610:44:96;5406:196:111;560:44:96;;;;;;;;;;-1:-1:-1;560:44:96;;;;;:::i;:::-;;;;;;;;;;;;;;;;3926:110:73;;;:::i;4188:158::-;;;;;;;;;;-1:-1:-1;4188:158:73;;;;;:::i;:::-;;:::i;3519:222:32:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;765:20:73:-;;;;;;;;;;-1:-1:-1;765:20:73;;;;;;;;;;;;;;7602:42:111;7590:55;;;7572:74;;7560:2;7545:18;765:20:73;7426:226:111;1031:108:73;;;;;;;;;;-1:-1:-1;1121:11:73;1031:108;;1680:158;;;;;;;;;;-1:-1:-1;1680:158:73;;;;;:::i;:::-;;:::i;1219:264:86:-;;;;;;;;;;-1:-1:-1;1219:264:86;;;;;:::i;:::-;1428:48;1219:264;;;;;;;;;;;3730:113:73;;;;;;;;;;;;;:::i;784:173:96:-;;;;;;;;;;-1:-1:-1;784:173:96;;;;;:::i;:::-;;:::i;1151:223::-;;;;;;;;;;-1:-1:-1;1151:223:96;;;;;:::i;:::-;;:::i;935:121:51:-;;;;;;;;;;;;;:::i;981:232:86:-;;;;;;;;;;-1:-1:-1;981:232:86;;;;;:::i;:::-;1163:43;981:232;;;;;;;;;1489:298;1576:4;1611:48;;;1626:33;1611:48;;:113;;-1:-1:-1;1675:49:86;;;1690:34;1675:49;1611:113;:169;;;-1:-1:-1;1740:40:86;;;1755:25;1740:40;1611:169;1592:188;1489:298;-1:-1:-1;;1489:298:86:o;1902:297:73:-;1991:31;:29;:31::i;:::-;2040:26;;;2032:58;;;;-1:-1:-1;;;2032:58:73;;11467:2:111;2032:58:73;;;11449:21:111;11506:2;11486:18;;;11479:30;11545:21;11525:18;;;11518:49;11584:18;;2032:58:73;;;;;;;;;2105:9;2100:93;2120:15;;;2100:93;;;2156:26;2162:4;;2167:1;2162:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2171:1;2174:4;;2179:1;2174:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2156:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2156:5:73;;-1:-1:-1;;;2156:26:73:i;:::-;2137:3;;;;:::i;:::-;;;;2100:93;;;;1902:297;;;;:::o;3073:197:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12943:2:111;1629:80:32;;;12925:21:111;12982:2;12962:18;;;12955:30;13021:34;13001:18;;;12994:62;13092:14;13072:18;;;13065:42;13124:19;;1629:80:32;12741:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;13356:2:111;1719:87:32;;;13338:21:111;13395:2;13375:18;;;13368:30;13434:34;13414:18;;;13407:62;13505:14;13485:18;;;13478:42;13537:19;;1719:87:32;13154:408:111;1719:87:32;3156:36:::1;3174:17;3156;:36::i;:::-;3243:12;::::0;;3253:1:::1;3243:12:::0;;;::::1;::::0;::::1;::::0;;;3202:61:::1;::::0;3224:17;;3243:12;3202:21:::1;:61::i;:::-;3073:197:::0;:::o;1458:353:51:-;1601:22;1635:24;:22;:24::i;:::-;1686:38;1705:6;1713:10;1686:18;:38::i;:::-;1669:55;;1772:32;1784:19;1772:11;:32::i;:::-;1458:353;;;;;:::o;3926:110:73:-;1121:11;3973:56;;;;;4023:4;3973:56;;;7572:74:111;3973:22:73;;;;;;;;4004:9;;7545:18:111;;3973:56:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:158;963:12;:10;:12::i;:::-;1121:11;4291:48:::1;::::0;;;;:23:::1;13775:55:111::0;;;4291:48:73::1;::::0;::::1;13757:74:111::0;13847:18;;;13840:34;;;4291:23:73;;;::::1;::::0;::::1;::::0;13730:18:111;;4291:48:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4188:158:::0;;:::o;3519:222:32:-;1637:23;1654:6;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:32;;12943:2:111;1629:80:32;;;12925:21:111;12982:2;12962:18;;;12955:30;13021:34;13001:18;;;12994:62;13092:14;13072:18;;;13065:42;13124:19;;1629:80:32;12741:408:111;1629:80:32;1751:6;1727:30;;:20;1030:66:28;1380:54;;;;1301:140;1727:20:32;:30;;;1719:87;;;;-1:-1:-1;;;1719:87:32;;13356:2:111;1719:87:32;;;13338:21:111;13395:2;13375:18;;;13368:30;13434:34;13414:18;;;13407:62;13505:14;13485:18;;;13478:42;13537:19;;1719:87:32;13154:408:111;1719:87:32;3636:36:::1;3654:17;3636;:36::i;:::-;3682:52;3704:17;3723:4;3729;3682:21;:52::i;:::-;3519:222:::0;;:::o;2762:131::-;2840:7;2080:4;2072:23;2089:6;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:32;;14087:2:111;2064:92:32;;;14069:21:111;14126:2;14106:18;;;14099:30;14165:34;14145:18;;;14138:62;14236:26;14216:18;;;14209:54;14280:19;;2064:92:32;13885:420:111;2064:92:32;-1:-1:-1;1030:66:28::1;2762:131:32::0;:::o;1680:158:73:-;1766:31;:29;:31::i;:::-;1807:24;1813:4;1819:5;1826:4;;1807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1807:5:73;;-1:-1:-1;;;1807:24:73:i;:::-;1680:158;;;;:::o;3730:113::-;3799:37;;;;;3830:4;3799:37;;;7572:74:111;3773:7:73;;3799:22;1121:11;3799:22;;;;7545:18:111;;3799:37:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3792:44;;3730:113;:::o;784:173:96:-;3257:19:31;3280:13;;;;;;3279:14;;3325:34;;;;-1:-1:-1;3343:12:31;;3358:1;3343:12;;;;:16;3325:34;3324:97;;;-1:-1:-1;3393:4:31;1465:19:42;:23;;;3365:55:31;;-1:-1:-1;3403:12:31;;;;;:17;3365:55;3303:190;;;;-1:-1:-1;;;3303:190:31;;14701:2:111;3303:190:31;;;14683:21:111;14740:2;14720:18;;;14713:30;14779:34;14759:18;;;14752:62;14850:16;14830:18;;;14823:44;14884:19;;3303:190:31;14499:410:111;3303:190:31;3503:12;:16;;;;3518:1;3503:16;;;3529:65;;;;3563:13;:20;;;;;;;;3529:65;867:26:96::1;885:7;867:17;:26::i;:::-;903:47;921:7;930:1;933:16;903:17;:47::i;:::-;3618:14:31::0;3614:99;;;3664:5;3648:21;;;;;;3688:14;;-1:-1:-1;15066:36:111;;3688:14:31;;15054:2:111;15039:18;3688:14:31;;;;;;;3247:472;784:173:96;:::o;1151:223::-;963:12:73;:10;:12::i;:::-;1267:6:96::1;1258:15;;:6;:15;;;1250:45;;;::::0;-1:-1:-1;;;1250:45:96;;15315:2:111;1250:45:96::1;::::0;::::1;15297:21:111::0;15354:2;15334:18;;;15327:30;15393:19;15373:18;;;15366:47;15430:18;;1250:45:96::1;15113:341:111::0;1250:45:96::1;1305:17;::::0;;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:26;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;1341:10:::1;:17:::0;;;;;;:26;;;;;::::1;::::0;::::1;;::::0;;1151:223::o;935:121:51:-;1010:39;;;;;1040:4;1010:39;;;15641:74:111;984:7:51;15731:18:111;;;15724:91;;;984:7:51;1010:21;1121:11:73;1010:21:51;;;;15614:18:111;;1010:39:51;15459:362:111;2808:175:73;2881:10;:35;1121:11;2881:35;;;:58;;-1:-1:-1;2934:5:73;;;;;;;2920:10;:19;2881:58;2873:103;;;;-1:-1:-1;;;2873:103:73;;16028:2:111;2873:103:73;;;16010:21:111;;;16047:18;;;16040:30;16106:34;16086:18;;;16079:62;16158:18;;2873:103:73;15826:356:111;2873:103:73;2808:175::o;3366:287::-;3451:12;3465:19;3488:6;:11;;3508:5;3515:4;3488:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3450:70;;;;3535:7;3530:117;;3615:6;3609:13;3604:2;3596:6;3592:15;3585:38;4352:135;4468:12;:10;:12::i;2650:952:28:-;689:66;3096:48;;;3092:504;;;3160:37;3179:17;3160:18;:37::i;:::-;2650:952;;;:::o;3092:504::-;3250:17;3232:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3232:52:28;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3228:291;;3448:56;;-1:-1:-1;;;3448:56:28;;17120:2:111;3448:56:28;;;17102:21:111;17159:2;17139:18;;;17132:30;17198:34;17178:18;;;17171:62;17269:16;17249:18;;;17242:44;17303:19;;3448:56:28;16918:410:111;3228:291:28;1030:66;3334:28;;3326:82;;;;-1:-1:-1;;;3326:82:28;;17535:2:111;3326:82:28;;;17517:21:111;17574:2;17554:18;;;17547:30;17613:34;17593:18;;;17586:62;17684:11;17664:18;;;17657:39;17713:19;;3326:82:28;17333:405:111;3326:82:28;3285:138;3532:53;3550:17;3569:4;3575:9;3532:17;:53::i;1892:149:51:-;1966:10;:35;1121:11:73;1966:35:51;;1958:76;;;;-1:-1:-1;;;1958:76:51;;17945:2:111;1958:76:51;;;17927:21:111;17984:2;17964:18;;;17957:30;18023;18003:18;;;17996:58;18071:18;;1958:76:51;17743:352:111;1429:541:96;1544:22;1578:12;1593:35;:10;7455:58:47;;19305:66:111;7455:58:47;;;19293:79:111;19388:12;;;19381:28;;;7325:7:47;;19425:12:111;;7455:58:47;;;;;;;;;;;;7445:69;;;;;;7438:76;;7256:265;;;;1593:35:96;1578:50;-1:-1:-1;1638:14:96;1655:30;1668:16;;;;:6;:16;:::i;:::-;1655:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1655:4:96;;:30;-1:-1:-1;;1655:12:96;:30;-1:-1:-1;1655:30:96:i;:::-;1711:18;;;1695:13;1711:18;;;:10;:18;;;;;;;;;;1755;;;;;;;1638:47;;-1:-1:-1;1711:18:96;;;;;1755;1889:11;;1917:46;1889:11;1711:18;1755;1917:19;:46::i;:::-;1910:53;1429:541;-1:-1:-1;;;;;;;;1429:541:96:o;4316:337:51:-;4397:24;;4393:254;;4455:82;;4438:12;;4463:10;;4515:17;;4488:19;;4438:12;4455:82;4438:12;4455:82;4488:19;4463:10;4515:17;4455:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:233:73;1524:5;;;;;;;1510:10;:19;;:50;;-1:-1:-1;1533:10:73;1555:4;1533:27;1510:50;1502:73;;;;-1:-1:-1;;;1502:73:73;;18512:2:111;1502:73:73;;;18494:21:111;18551:2;18531:18;;;18524:30;18590:12;18570:18;;;18563:40;18620:18;;1502:73:73;18310:334:111;2590:146:73;2655:5;:15;;;;;;;;;;;;;;;;;;2685:44;;2723:5;;;;;;2710:11;2685:44;;;;;;;2590:146;:::o;1532:259:28:-;1465:19:42;;;;1605:95:28;;;;-1:-1:-1;;;1605:95:28;;18851:2:111;1605:95:28;;;18833:21:111;18890:2;18870:18;;;18863:30;18929:34;18909:18;;;18902:62;19000:15;18980:18;;;18973:43;19033:19;;1605:95:28;18649:409:111;1605:95:28;1030:66;1710:74;;;;;;;;;;;;;;;1532:259::o;2183:295::-;2321:29;2332:17;2321:10;:29::i;:::-;2378:1;2364:4;:11;:15;:28;;;;2383:9;2364:28;2360:112;;;2408:53;2437:17;2456:4;2408:28;:53::i;3661:227:47:-;3739:7;3759:17;3778:18;3800:27;3811:4;3817:9;3800:10;:27::i;:::-;3758:69;;;;3837:18;3849:5;3837:11;:18::i;:::-;-1:-1:-1;3872:9:47;3661:227;-1:-1:-1;;;3661:227:47:o;2956:218:54:-;3053:7;3157:8;3141:10;3133:19;;:33;;3125:3;3110:10;3102:19;;:26;;3080:9;:17;;3096:1;3080:17;;;3092:1;3080:17;3079:50;;;:88;;2956:218;-1:-1:-1;;;;2956:218:54:o;1897:152:28:-;1963:37;1982:17;1963:18;:37::i;:::-;2015:27;;;;;;;;;;;1897:152;:::o;6469:198:42:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;:20;:77::i;2145:730:47:-;2226:7;2235:12;2263:9;:16;2283:2;2263:22;2259:610;;2599:4;2584:20;;2578:27;2648:4;2633:20;;2627:27;2705:4;2690:20;;2684:27;2301:9;2676:36;2746:25;2757:4;2676:36;2578:27;2627;2746:10;:25::i;:::-;2739:32;;;;;;;;;2259:610;-1:-1:-1;2818:1:47;;-1:-1:-1;2822:35:47;2259:610;2145:730;;;;;:::o;570:511::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:441;;570:511;:::o;634:441::-;743:29;734:5;:38;;;;;;;;:::i;:::-;;730:345;;788:34;;-1:-1:-1;;;788:34:47;;19839:2:111;788:34:47;;;19821:21:111;19878:2;19858:18;;;19851:30;19917:26;19897:18;;;19890:54;19961:18;;788:34:47;19637:348:111;730:345:47;852:35;843:5;:44;;;;;;;;:::i;:::-;;839:236;;903:41;;-1:-1:-1;;;903:41:47;;20192:2:111;903:41:47;;;20174:21:111;20231:2;20211:18;;;20204:30;20270:33;20250:18;;;20243:61;20321:18;;903:41:47;19990:355:111;839:236:47;974:30;965:5;:39;;;;;;;;:::i;:::-;;961:114;;1020:44;;-1:-1:-1;;;1020:44:47;;20552:2:111;1020:44:47;;;20534:21:111;20591:2;20571:18;;;20564:30;20630:34;20610:18;;;20603:62;20701:4;20681:18;;;20674:32;20723:19;;1020:44:47;20350:398:111;6853:325:42;6994:12;7019;7033:23;7060:6;:19;;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:42:o;5069:1494:47:-;5195:7;;6119:66;6106:79;;6102:161;;;-1:-1:-1;6217:1:47;;-1:-1:-1;6221:30:47;6201:51;;6102:161;6374:24;;;6357:14;6374:24;;;;;;;;;20980:25:111;;;21053:4;21041:17;;21021:18;;;21014:45;;;;21075:18;;;21068:34;;;21118:18;;;21111:34;;;6374:24:47;;20952:19:111;;6374:24:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6374:24:47;;;;;;-1:-1:-1;;6412:20:47;;;6408:101;;6464:1;6468:29;6448:50;;;;;;;6408:101;6527:6;-1:-1:-1;6535:20:47;;-1:-1:-1;5069:1494:47;;;;;;;;:::o;7466:628:42:-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;21358:2:111;7908:60:42;;;21340:21:111;21397:2;21377:18;;;21370:30;21436:31;21416:18;;;21409:59;21485:18;;7908:60:42;21156:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;:::o;8616:540::-;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:154:111:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:347;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:111;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;525:1205;651:6;659;667;675;683;691;699;707;760:3;748:9;739:7;735:23;731:33;728:53;;;777:1;774;767:12;728:53;816:9;803:23;835:31;860:5;835:31;:::i;:::-;885:5;-1:-1:-1;942:2:111;927:18;;914:32;955:33;914:32;955:33;:::i;:::-;1007:7;-1:-1:-1;1066:2:111;1051:18;;1038:32;1079:33;1038:32;1079:33;:::i;:::-;1131:7;-1:-1:-1;1185:2:111;1170:18;;1157:32;;-1:-1:-1;1240:3:111;1225:19;;1212:33;1264:18;1294:14;;;1291:34;;;1321:1;1318;1311:12;1291:34;1360:58;1410:7;1401:6;1390:9;1386:22;1360:58;:::i;:::-;1437:8;;-1:-1:-1;1334:84:111;-1:-1:-1;1525:3:111;1510:19;;1497:33;;-1:-1:-1;1542:16:111;;;1539:36;;;1571:1;1568;1561:12;1539:36;;1610:60;1662:7;1651:8;1640:9;1636:24;1610:60;:::i;:::-;525:1205;;;;-1:-1:-1;525:1205:111;;-1:-1:-1;525:1205:111;;;;;;1689:8;-1:-1:-1;;;525:1205:111:o;1735:332::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;1901:9;1888:23;1951:66;1944:5;1940:78;1933:5;1930:89;1920:117;;2033:1;2030;2023:12;2264:754;2361:6;2369;2377;2385;2393;2446:3;2434:9;2425:7;2421:23;2417:33;2414:53;;;2463:1;2460;2453:12;2414:53;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:111;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2693:7;-1:-1:-1;2747:2:111;2732:18;;2719:32;;-1:-1:-1;2802:2:111;2787:18;;2774:32;2829:18;2818:30;;2815:50;;;2861:1;2858;2851:12;2815:50;2900:58;2950:7;2941:6;2930:9;2926:22;2900:58;:::i;:::-;2264:754;;;;-1:-1:-1;2264:754:111;;-1:-1:-1;2977:8:111;;2874:84;2264:754;-1:-1:-1;;;2264:754:111:o;3276:367::-;3339:8;3349:6;3403:3;3396:4;3388:6;3384:17;3380:27;3370:55;;3421:1;3418;3411:12;3370:55;-1:-1:-1;3444:20:111;;3487:18;3476:30;;3473:50;;;3519:1;3516;3509:12;3473:50;3556:4;3548:6;3544:17;3532:29;;3616:3;3609:4;3599:6;3596:1;3592:14;3584:6;3580:27;3576:38;3573:47;3570:67;;;3633:1;3630;3623:12;3648:784;3781:6;3789;3797;3805;3858:2;3846:9;3837:7;3833:23;3829:32;3826:52;;;3874:1;3871;3864:12;3826:52;3914:9;3901:23;3943:18;3984:2;3976:6;3973:14;3970:34;;;4000:1;3997;3990:12;3970:34;4039:70;4101:7;4092:6;4081:9;4077:22;4039:70;:::i;:::-;4128:8;;-1:-1:-1;4013:96:111;-1:-1:-1;4216:2:111;4201:18;;4188:32;;-1:-1:-1;4232:16:111;;;4229:36;;;4261:1;4258;4251:12;4229:36;;4300:72;4364:7;4353:8;4342:9;4338:24;4300:72;:::i;:::-;3648:784;;;;-1:-1:-1;4391:8:111;-1:-1:-1;;;;3648:784:111:o;4437:247::-;4496:6;4549:2;4537:9;4528:7;4524:23;4520:32;4517:52;;;4565:1;4562;4555:12;4517:52;4604:9;4591:23;4623:31;4648:5;4623:31;:::i;4689:530::-;4800:6;4808;4816;4869:2;4857:9;4848:7;4844:23;4840:32;4837:52;;;4885:1;4882;4875:12;4837:52;4925:9;4912:23;4958:18;4950:6;4947:30;4944:50;;;4990:1;4987;4980:12;4944:50;5013:22;;5069:3;5051:16;;;5047:26;5044:46;;;5086:1;5083;5076:12;5044:46;5109:2;5158;5143:18;;5130:32;;-1:-1:-1;5209:2:111;5194:18;;;5181:32;;4689:530;-1:-1:-1;;;4689:530:111:o;5607:323::-;5683:6;5691;5744:2;5732:9;5723:7;5719:23;5715:32;5712:52;;;5760:1;5757;5750:12;5712:52;5799:9;5786:23;5818:31;5843:5;5818:31;:::i;:::-;5868:5;5920:2;5905:18;;;;5892:32;;-1:-1:-1;;;5607:323:111:o;5935:184::-;5987:77;5984:1;5977:88;6084:4;6081:1;6074:15;6108:4;6105:1;6098:15;6124:1115;6201:6;6209;6262:2;6250:9;6241:7;6237:23;6233:32;6230:52;;;6278:1;6275;6268:12;6230:52;6317:9;6304:23;6336:31;6361:5;6336:31;:::i;:::-;6386:5;-1:-1:-1;6442:2:111;6427:18;;6414:32;6465:18;6495:14;;;6492:34;;;6522:1;6519;6512:12;6492:34;6560:6;6549:9;6545:22;6535:32;;6605:7;6598:4;6594:2;6590:13;6586:27;6576:55;;6627:1;6624;6617:12;6576:55;6663:2;6650:16;6685:2;6681;6678:10;6675:36;;;6691:18;;:::i;:::-;6825:2;6819:9;6887:4;6879:13;;6730:66;6875:22;;;6899:2;6871:31;6867:40;6855:53;;;6923:18;;;6943:22;;;6920:46;6917:72;;;6969:18;;:::i;:::-;7009:10;7005:2;6998:22;7044:2;7036:6;7029:18;7084:7;7079:2;7074;7070;7066:11;7062:20;7059:33;7056:53;;;7105:1;7102;7095:12;7056:53;7161:2;7156;7152;7148:11;7143:2;7135:6;7131:15;7118:46;7206:1;7201:2;7196;7188:6;7184:15;7180:24;7173:35;7227:6;7217:16;;;;;;;6124:1115;;;;;:::o;7909:612::-;7997:6;8005;8013;8021;8074:2;8062:9;8053:7;8049:23;8045:32;8042:52;;;8090:1;8087;8080:12;8042:52;8129:9;8116:23;8148:31;8173:5;8148:31;:::i;:::-;8198:5;-1:-1:-1;8250:2:111;8235:18;;8222:32;;-1:-1:-1;8305:2:111;8290:18;;8277:32;8332:18;8321:30;;8318:50;;;8364:1;8361;8354:12;8318:50;8403:58;8453:7;8444:6;8433:9;8429:22;8403:58;:::i;8526:1338::-;8686:6;8694;8702;8710;8718;8726;8734;8742;8795:3;8783:9;8774:7;8770:23;8766:33;8763:53;;;8812:1;8809;8802:12;8763:53;8851:9;8838:23;8870:31;8895:5;8870:31;:::i;:::-;8920:5;-1:-1:-1;8977:2:111;8962:18;;8949:32;8990:33;8949:32;8990:33;:::i;:::-;9042:7;-1:-1:-1;9100:2:111;9085:18;;9072:32;9123:18;9153:14;;;9150:34;;;9180:1;9177;9170:12;9150:34;9219:70;9281:7;9272:6;9261:9;9257:22;9219:70;:::i;:::-;9308:8;;-1:-1:-1;9193:96:111;-1:-1:-1;9396:2:111;9381:18;;9368:32;;-1:-1:-1;9412:16:111;;;9409:36;;;9441:1;9438;9431:12;9409:36;9480:72;9544:7;9533:8;9522:9;9518:24;9480:72;:::i;:::-;9571:8;;-1:-1:-1;9454:98:111;-1:-1:-1;9659:3:111;9644:19;;9631:33;;-1:-1:-1;9676:16:111;;;9673:36;;;9705:1;9702;9695:12;9869:167;9936:20;;9996:14;9985:26;;9975:37;;9965:65;;10026:1;10023;10016:12;9965:65;9869:167;;;:::o;10041:391::-;10116:6;10124;10132;10185:2;10173:9;10164:7;10160:23;10156:32;10153:52;;;10201:1;10198;10191:12;10153:52;10240:9;10227:23;10259:31;10284:5;10259:31;:::i;:::-;10309:5;-1:-1:-1;10333:37:111;10366:2;10351:18;;10333:37;:::i;:::-;10323:47;;10389:37;10422:2;10411:9;10407:18;10389:37;:::i;:::-;10379:47;;10041:391;;;;;:::o;10437:823::-;10543:6;10551;10559;10567;10575;10583;10636:3;10624:9;10615:7;10611:23;10607:33;10604:53;;;10653:1;10650;10643:12;10604:53;10692:9;10679:23;10711:31;10736:5;10711:31;:::i;:::-;10761:5;-1:-1:-1;10818:2:111;10803:18;;10790:32;10831:33;10790:32;10831:33;:::i;:::-;10883:7;-1:-1:-1;10937:2:111;10922:18;;10909:32;;-1:-1:-1;10988:2:111;10973:18;;10960:32;;-1:-1:-1;11043:3:111;11028:19;;11015:33;11071:18;11060:30;;11057:50;;;11103:1;11100;11093:12;11057:50;11142:58;11192:7;11183:6;11172:9;11168:22;11142:58;:::i;:::-;10437:823;;;;-1:-1:-1;10437:823:111;;-1:-1:-1;10437:823:111;;11219:8;;10437:823;-1:-1:-1;;;10437:823:111:o;11613:184::-;11665:77;11662:1;11655:88;11762:4;11759:1;11752:15;11786:4;11783:1;11776:15;11802:580;11879:4;11885:6;11945:11;11932:25;12035:66;12024:8;12008:14;12004:29;12000:102;11980:18;11976:127;11966:155;;12117:1;12114;12107:12;11966:155;12144:33;;12196:20;;;-1:-1:-1;12239:18:111;12228:30;;12225:50;;;12271:1;12268;12261:12;12225:50;12304:4;12292:17;;-1:-1:-1;12335:14:111;12331:27;;;12321:38;;12318:58;;;12372:1;12369;12362:12;12387:349;12426:3;12457:66;12450:5;12447:77;12444:257;;12557:77;12554:1;12547:88;12658:4;12655:1;12648:15;12686:4;12683:1;12676:15;12444:257;-1:-1:-1;12728:1:111;12717:13;;12387:349::o;14310:184::-;14380:6;14433:2;14421:9;14412:7;14408:23;14404:32;14401:52;;;14449:1;14446;14439:12;14401:52;-1:-1:-1;14472:16:111;;14310:184;-1:-1:-1;14310:184:111:o;16187:258::-;16259:1;16269:113;16283:6;16280:1;16277:13;16269:113;;;16359:11;;;16353:18;16340:11;;;16333:39;16305:2;16298:10;16269:113;;;16400:6;16397:1;16394:13;16391:48;;;-1:-1:-1;;16435:1:111;16417:16;;16410:27;16187:258::o;16450:274::-;16579:3;16617:6;16611:13;16633:53;16679:6;16674:3;16667:4;16659:6;16655:17;16633:53;:::i;:::-;16702:16;;;;;16450:274;-1:-1:-1;;16450:274:111:o;19448:184::-;19500:77;19497:1;19490:88;19597:4;19594:1;19587:15;19621:4;19618:1;19611:15;21514:442;21663:2;21652:9;21645:21;21626:4;21695:6;21689:13;21738:6;21733:2;21722:9;21718:18;21711:34;21754:66;21813:6;21808:2;21797:9;21793:18;21788:2;21780:6;21776:15;21754:66;:::i;:::-;21872:2;21860:15;21877:66;21856:88;21841:104;;;;21947:2;21837:113;;21514:442;-1:-1:-1;;21514:442:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"1885000","executionCost":"infinite","totalCost":"infinite"},"external":{"addDeposit()":"infinite","addTemporaryOwner(address,uint48,uint48)":"infinite","entryPoint()":"infinite","execute(address,uint256,bytes)":"infinite","executeBatch(address[],bytes[])":"infinite","getDeposit()":"infinite","getNonce()":"infinite","initialize(address)":"infinite","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2369","ownerAfter(address)":"2561","ownerUntil(address)":"2584","proxiableUUID()":"infinite","supportsInterface(bytes4)":"472","tokensReceived(address,address,address,uint256,bytes,bytes)":"infinite","upgradeTo(address)":"infinite","upgradeToAndCall(address,bytes)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawDepositTo(address,uint256)":"infinite"},"internal":{"_disableInitializers()":"infinite","_validateSignature(struct UserOperation calldata,bytes32)":"infinite"}},"methodIdentifiers":{"addDeposit()":"4a58db19","addTemporaryOwner(address,uint48,uint48)":"cf6dca55","entryPoint()":"b0d691fe","execute(address,uint256,bytes)":"b61d27f6","executeBatch(address[],bytes[])":"18dfb3c7","getDeposit()":"c399ec88","getNonce()":"d087d288","initialize(address)":"c4d66de8","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","ownerAfter(address)":"3fb5a7a1","ownerUntil(address)":"3e476951","proxiableUUID()":"52d1902d","supportsInterface(bytes4)":"01ffc9a7","tokensReceived(address,address,address,uint256,bytes,bytes)":"0023de29","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd","withdrawDepositTo(address,uint256)":"4d44560d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"anEntryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SimpleAccountInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"_after\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"_until\",\"type\":\"uint48\"}],\"name\":\"addTemporaryOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"dest\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"func\",\"type\":\"bytes[]\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"anOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ownerAfter\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ownerUntil\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"tokensReceived\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"details\":\"The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint, a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading the implementation by calling `upgradeTo()`\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawDepositTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"deposit more funds for this account in the entryPoint\"},\"entryPoint()\":{\"notice\":\"return the entryPoint used by this account. subclass should return the current entryPoint used by this account.\"},\"execute(address,uint256,bytes)\":{\"notice\":\"execute a transaction (called directly from owner, or by entryPoint)\"},\"executeBatch(address[],bytes[])\":{\"notice\":\"execute a sequence of transactions\"},\"getDeposit()\":{\"notice\":\"check current account deposit in the entryPoint\"},\"getNonce()\":{\"notice\":\"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\"},\"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\"},\"withdrawDepositTo(address,uint256)\":{\"notice\":\"withdraw value from the account's deposit\"}},\"notice\":\"A test account, for testing expiry. add \\\"temporary\\\" owners, each with a time range (since..till) times for each. NOTE: this is not a full \\\"session key\\\" implementation: a real session key should probably limit other things, like target contracts and methods to be called. also, the \\\"since\\\" value is not really useful, only for testing the entrypoint.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestExpiryAccount.sol\":\"TestExpiryAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/TestExpiryAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\n\\n/**\\n * A test account, for testing expiry.\\n * add \\\"temporary\\\" owners, each with a time range (since..till) times for each.\\n * NOTE: this is not a full \\\"session key\\\" implementation: a real session key should probably limit\\n * other things, like target contracts and methods to be called.\\n * also, the \\\"since\\\" value is not really useful, only for testing the entrypoint.\\n */\\ncontract TestExpiryAccount is SimpleAccount {\\n using ECDSA for bytes32;\\n\\n mapping(address => uint48) public ownerAfter;\\n mapping(address => uint48) public ownerUntil;\\n\\n // solhint-disable-next-line no-empty-blocks\\n constructor(IEntryPoint anEntryPoint) SimpleAccount(anEntryPoint) {}\\n\\n function initialize(address anOwner) public virtual override initializer {\\n super._initialize(anOwner);\\n addTemporaryOwner(anOwner, 0, type(uint48).max);\\n }\\n\\n // As this is a test contract, no need for proxy, so no need to disable init\\n // solhint-disable-next-line no-empty-blocks\\n function _disableInitializers() internal override {}\\n\\n function addTemporaryOwner(address owner, uint48 _after, uint48 _until) public onlyOwner {\\n require(_until > _after, \\\"wrong until/after\\\");\\n ownerAfter[owner] = _after;\\n ownerUntil[owner] = _until;\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override view returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n address signer = hash.recover(userOp.signature);\\n uint48 _until = ownerUntil[signer];\\n uint48 _after = ownerAfter[signer];\\n\\n //we have \\\"until\\\" value for all valid owners. so zero means \\\"invalid signature\\\"\\n bool sigFailed = _until == 0;\\n return _packValidationData(sigFailed, _until, _after);\\n }\\n}\\n\",\"keccak256\":\"0x9ccabdc9ab534078be421139fd44aa5c918de5b8dacaf3945fb447fcd15713e0\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3381,"contract":"contracts/test/TestExpiryAccount.sol:TestExpiryAccount","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":3384,"contract":"contracts/test/TestExpiryAccount.sol:TestExpiryAccount","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":13838,"contract":"contracts/test/TestExpiryAccount.sol:TestExpiryAccount","label":"owner","offset":2,"slot":"0","type":"t_address"},{"astId":19691,"contract":"contracts/test/TestExpiryAccount.sol:TestExpiryAccount","label":"ownerAfter","offset":0,"slot":"1","type":"t_mapping(t_address,t_uint48)"},{"astId":19695,"contract":"contracts/test/TestExpiryAccount.sol:TestExpiryAccount","label":"ownerUntil","offset":0,"slot":"2","type":"t_mapping(t_address,t_uint48)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_mapping(t_address,t_uint48)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint48)","numberOfBytes":"32","value":"t_uint48"},"t_uint48":{"encoding":"inplace","label":"uint48","numberOfBytes":"6"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDeposit()":{"notice":"deposit more funds for this account in the entryPoint"},"entryPoint()":{"notice":"return the entryPoint used by this account. subclass should return the current entryPoint used by this account."},"execute(address,uint256,bytes)":{"notice":"execute a transaction (called directly from owner, or by entryPoint)"},"executeBatch(address[],bytes[])":{"notice":"execute a sequence of transactions"},"getDeposit()":{"notice":"check current account deposit in the entryPoint"},"getNonce()":{"notice":"Return the account nonce. This method returns the next sequential nonce. For a nonce of a specific key, use `entrypoint.getNonce(account, key)`"},"validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"Validate user's signature and nonce. subclass doesn't need to override this method. Instead, it should override the specific internal validation methods."},"withdrawDepositTo(address,uint256)":{"notice":"withdraw value from the account's deposit"}},"notice":"A test account, for testing expiry. add \"temporary\" owners, each with a time range (since..till) times for each. NOTE: this is not a full \"session key\" implementation: a real session key should probably limit other things, like target contracts and methods to be called. also, the \"since\" value is not really useful, only for testing the entrypoint.","version":1}}},"contracts/test/TestHelpers.sol":{"TestHelpers":{"abi":[{"inputs":[{"internalType":"uint256","name":"validationData","type":"uint256"},{"internalType":"uint256","name":"paymasterValidationData","type":"uint256"}],"name":"intersectTimeRange","outputs":[{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"}],"internalType":"struct ValidationData","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"uint48","name":"validAfter","type":"uint48"}],"name":"packValidationData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"}],"internalType":"struct ValidationData","name":"data","type":"tuple"}],"name":"packValidationDataStruct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"name":"parseValidationData","outputs":[{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"}],"internalType":"struct ValidationData","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506104d5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806324d3cde6146100515780634fe5f5cf14610077578063a4b2282e146100d2578063b059e2fa146100e5575b600080fd5b61006461005f36600461036c565b6100f8565b6040519081526020015b60405180910390f35b61008a61008536600461041a565b61014c565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015165ffffffffffff90811691830191909152928201519092169082015260600161006e565b61008a6100e036600461043c565b61017a565b6100646100f3366004610455565b6101a0565b600061014682600060d0826020015165ffffffffffff16901b60a0836040015165ffffffffffff16901b836000015173ffffffffffffffffffffffffffffffffffffffff1617179050919050565b92915050565b604080516060810182526000808252602082018190529181019190915261017383836101b5565b9392505050565b60408051606081018252600080825260208201819052918101919091526101468261029b565b60006101ad848484610319565b949350505050565b60408051606081018252600080825260208201819052918101829052906101db8461029b565b905060006101e88461029b565b825190915073ffffffffffffffffffffffffffffffffffffffff811661020c575080515b602080840151604080860151928501519085015191929165ffffffffffff808316908516101561023a578193505b8065ffffffffffff168365ffffffffffff161115610256578092505b50506040805160608101825273ffffffffffffffffffffffffffffffffffffffff909416845265ffffffffffff92831660208501529116908201529250505092915050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff81166000036102d7575065ffffffffffff5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610341576000610344565b60015b60ff161717949350505050565b803565ffffffffffff8116811461036757600080fd5b919050565b60006060828403121561037e57600080fd5b6040516060810181811067ffffffffffffffff821117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823573ffffffffffffffffffffffffffffffffffffffff811681146103ef57600080fd5b81526103fd60208401610351565b602082015261040e60408401610351565b60408201529392505050565b6000806040838503121561042d57600080fd5b50508035926020909101359150565b60006020828403121561044e57600080fd5b5035919050565b60008060006060848603121561046a57600080fd5b8335801515811461047a57600080fd5b925061048860208501610351565b915061049660408501610351565b9050925092509256fea2646970667358221220267a4c5e88c357047c8bb2c95ecdb9dae63b394ac17138f870f7ca98f63dc4c264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4D5 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x24D3CDE6 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4FE5F5CF EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0xA4B2282E EQ PUSH2 0xD2 JUMPI DUP1 PUSH4 0xB059E2FA EQ PUSH2 0xE5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x36C JUMP JUMPDEST PUSH2 0xF8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x41A JUMP JUMPDEST PUSH2 0x14C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 DUP3 ADD MLOAD SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x6E JUMP JUMPDEST PUSH2 0x8A PUSH2 0xE0 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C JUMP JUMPDEST PUSH2 0x17A JUMP JUMPDEST PUSH2 0x64 PUSH2 0xF3 CALLDATASIZE PUSH1 0x4 PUSH2 0x455 JUMP JUMPDEST PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x146 DUP3 PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP4 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x173 DUP4 DUP4 PUSH2 0x1B5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x146 DUP3 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AD DUP5 DUP5 DUP5 PUSH2 0x319 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x1DB DUP5 PUSH2 0x29B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E8 DUP5 PUSH2 0x29B JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x20C JUMPI POP DUP1 MLOAD JUMPDEST PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP3 DUP6 ADD MLOAD SWAP1 DUP6 ADD MLOAD SWAP2 SWAP3 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP6 AND LT ISZERO PUSH2 0x23A JUMPI DUP2 SWAP4 POP JUMPDEST DUP1 PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x256 JUMPI DUP1 SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP5 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 AND SWAP1 DUP3 ADD MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 PUSH1 0xA0 DUP2 SWAP1 SHR PUSH6 0xFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SUB PUSH2 0x2D7 JUMPI POP PUSH6 0xFFFFFFFFFFFF JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xD0 SWAP5 SWAP1 SWAP5 SHR PUSH1 0x20 DUP4 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x341 JUMPI PUSH1 0x0 PUSH2 0x344 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x3C8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MSTORE PUSH2 0x3FD PUSH1 0x20 DUP5 ADD PUSH2 0x351 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x40E PUSH1 0x40 DUP5 ADD PUSH2 0x351 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x46A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x47A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP PUSH2 0x488 PUSH1 0x20 DUP6 ADD PUSH2 0x351 JUMP JUMPDEST SWAP2 POP PUSH2 0x496 PUSH1 0x40 DUP6 ADD PUSH2 0x351 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 PUSH27 0x4C5E88C357047C8BB2C95ECDB9DAE63B394AC17138F870F7CA98F6 RETURNDATASIZE 0xC4 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"93:746:97:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_intersectTimeRange_9905":{"entryPoint":437,"id":9905,"parameterSlots":2,"returnSlots":1},"@_packValidationData_9942":{"entryPoint":null,"id":9942,"parameterSlots":1,"returnSlots":1},"@_packValidationData_9980":{"entryPoint":793,"id":9980,"parameterSlots":3,"returnSlots":1},"@_parseValidationData_9820":{"entryPoint":667,"id":9820,"parameterSlots":1,"returnSlots":1},"@intersectTimeRange_19850":{"entryPoint":332,"id":19850,"parameterSlots":2,"returnSlots":1},"@packValidationDataStruct_19863":{"entryPoint":248,"id":19863,"parameterSlots":1,"returnSlots":1},"@packValidationData_19881":{"entryPoint":416,"id":19881,"parameterSlots":3,"returnSlots":1},"@parseValidationData_19834":{"entryPoint":378,"id":19834,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_boolt_uint48t_uint48":{"entryPoint":1109,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_struct$_ValidationData_$9761_memory_ptr":{"entryPoint":876,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256":{"entryPoint":1084,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_uint256":{"entryPoint":1050,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48":{"entryPoint":849,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_struct$_ValidationData_$9761_memory_ptr__to_t_struct$_ValidationData_$9761_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2620:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"62:119:111","statements":[{"nodeType":"YulAssignment","src":"72:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"94:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"81:12:111"},"nodeType":"YulFunctionCall","src":"81:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"72:5:111"}]},{"body":{"nodeType":"YulBlock","src":"159:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"168:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"161:6:111"},"nodeType":"YulFunctionCall","src":"161:12:111"},"nodeType":"YulExpressionStatement","src":"161:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"123:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"134:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"141:14:111","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"130:3:111"},"nodeType":"YulFunctionCall","src":"130:26:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"120:2:111"},"nodeType":"YulFunctionCall","src":"120:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"113:6:111"},"nodeType":"YulFunctionCall","src":"113:45:111"},"nodeType":"YulIf","src":"110:65:111"}]},"name":"abi_decode_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"41:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"52:5:111","type":""}],"src":"14:167:111"},{"body":{"nodeType":"YulBlock","src":"288:768:111","statements":[{"body":{"nodeType":"YulBlock","src":"334:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"343:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"346:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"336:6:111"},"nodeType":"YulFunctionCall","src":"336:12:111"},"nodeType":"YulExpressionStatement","src":"336:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"309:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"318:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"305:3:111"},"nodeType":"YulFunctionCall","src":"305:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"330:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"301:3:111"},"nodeType":"YulFunctionCall","src":"301:32:111"},"nodeType":"YulIf","src":"298:52:111"},{"nodeType":"YulVariableDeclaration","src":"359:23:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"379:2:111","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"373:5:111"},"nodeType":"YulFunctionCall","src":"373:9:111"},"variables":[{"name":"memPtr","nodeType":"YulTypedName","src":"363:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"391:33:111","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"413:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"421:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"409:3:111"},"nodeType":"YulFunctionCall","src":"409:15:111"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"395:10:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"507:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"528:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"531:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"521:6:111"},"nodeType":"YulFunctionCall","src":"521:88:111"},"nodeType":"YulExpressionStatement","src":"521:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"629:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"632:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"622:6:111"},"nodeType":"YulFunctionCall","src":"622:15:111"},"nodeType":"YulExpressionStatement","src":"622:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"657:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"660:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"650:6:111"},"nodeType":"YulFunctionCall","src":"650:15:111"},"nodeType":"YulExpressionStatement","src":"650:15:111"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"442:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"454:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"439:2:111"},"nodeType":"YulFunctionCall","src":"439:34:111"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"478:10:111"},{"name":"memPtr","nodeType":"YulIdentifier","src":"490:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"475:2:111"},"nodeType":"YulFunctionCall","src":"475:22:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"436:2:111"},"nodeType":"YulFunctionCall","src":"436:62:111"},"nodeType":"YulIf","src":"433:242:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"691:2:111","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"695:10:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"684:6:111"},"nodeType":"YulFunctionCall","src":"684:22:111"},"nodeType":"YulExpressionStatement","src":"684:22:111"},{"nodeType":"YulVariableDeclaration","src":"715:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"741:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"728:12:111"},"nodeType":"YulFunctionCall","src":"728:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"719:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"837:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"846:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"849:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"839:6:111"},"nodeType":"YulFunctionCall","src":"839:12:111"},"nodeType":"YulExpressionStatement","src":"839:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"773:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"784:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"791:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"780:3:111"},"nodeType":"YulFunctionCall","src":"780:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"770:2:111"},"nodeType":"YulFunctionCall","src":"770:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"763:6:111"},"nodeType":"YulFunctionCall","src":"763:73:111"},"nodeType":"YulIf","src":"760:93:111"},{"expression":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"869:6:111"},{"name":"value","nodeType":"YulIdentifier","src":"877:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"862:6:111"},"nodeType":"YulFunctionCall","src":"862:21:111"},"nodeType":"YulExpressionStatement","src":"862:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"903:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"911:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"899:3:111"},"nodeType":"YulFunctionCall","src":"899:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"938:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"949:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"934:3:111"},"nodeType":"YulFunctionCall","src":"934:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"916:17:111"},"nodeType":"YulFunctionCall","src":"916:37:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"892:6:111"},"nodeType":"YulFunctionCall","src":"892:62:111"},"nodeType":"YulExpressionStatement","src":"892:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"974:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"982:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"970:3:111"},"nodeType":"YulFunctionCall","src":"970:15:111"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1009:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1020:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1005:3:111"},"nodeType":"YulFunctionCall","src":"1005:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"987:17:111"},"nodeType":"YulFunctionCall","src":"987:37:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"963:6:111"},"nodeType":"YulFunctionCall","src":"963:62:111"},"nodeType":"YulExpressionStatement","src":"963:62:111"},{"nodeType":"YulAssignment","src":"1034:16:111","value":{"name":"memPtr","nodeType":"YulIdentifier","src":"1044:6:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1034:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_ValidationData_$9761_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"254:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"265:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"277:6:111","type":""}],"src":"186:870:111"},{"body":{"nodeType":"YulBlock","src":"1162:76:111","statements":[{"nodeType":"YulAssignment","src":"1172:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1195:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1180:3:111"},"nodeType":"YulFunctionCall","src":"1180:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1172:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1214:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1225:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1207:6:111"},"nodeType":"YulFunctionCall","src":"1207:25:111"},"nodeType":"YulExpressionStatement","src":"1207:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1131:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1142:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1153:4:111","type":""}],"src":"1061:177:111"},{"body":{"nodeType":"YulBlock","src":"1330:161:111","statements":[{"body":{"nodeType":"YulBlock","src":"1376:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1385:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1388:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1378:6:111"},"nodeType":"YulFunctionCall","src":"1378:12:111"},"nodeType":"YulExpressionStatement","src":"1378:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1351:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1360:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1347:3:111"},"nodeType":"YulFunctionCall","src":"1347:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1372:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1343:3:111"},"nodeType":"YulFunctionCall","src":"1343:32:111"},"nodeType":"YulIf","src":"1340:52:111"},{"nodeType":"YulAssignment","src":"1401:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1424:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1411:12:111"},"nodeType":"YulFunctionCall","src":"1411:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1401:6:111"}]},{"nodeType":"YulAssignment","src":"1443:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1481:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1466:3:111"},"nodeType":"YulFunctionCall","src":"1466:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1453:12:111"},"nodeType":"YulFunctionCall","src":"1453:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1443:6:111"}]}]},"name":"abi_decode_tuple_t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1288:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1299:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1311:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1319:6:111","type":""}],"src":"1243:248:111"},{"body":{"nodeType":"YulBlock","src":"1661:350:111","statements":[{"nodeType":"YulAssignment","src":"1671:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1683:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1694:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1679:3:111"},"nodeType":"YulFunctionCall","src":"1679:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1671:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1713:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1734:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1728:5:111"},"nodeType":"YulFunctionCall","src":"1728:13:111"},{"kind":"number","nodeType":"YulLiteral","src":"1743:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1724:3:111"},"nodeType":"YulFunctionCall","src":"1724:62:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1706:6:111"},"nodeType":"YulFunctionCall","src":"1706:81:111"},"nodeType":"YulExpressionStatement","src":"1706:81:111"},{"nodeType":"YulVariableDeclaration","src":"1796:44:111","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1826:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1834:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1822:3:111"},"nodeType":"YulFunctionCall","src":"1822:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1816:5:111"},"nodeType":"YulFunctionCall","src":"1816:24:111"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"1800:12:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1849:24:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1859:14:111","type":"","value":"0xffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1853:2:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1893:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1904:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1889:3:111"},"nodeType":"YulFunctionCall","src":"1889:20:111"},{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"1915:12:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1929:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1911:3:111"},"nodeType":"YulFunctionCall","src":"1911:21:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1882:6:111"},"nodeType":"YulFunctionCall","src":"1882:51:111"},"nodeType":"YulExpressionStatement","src":"1882:51:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1953:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1964:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1949:3:111"},"nodeType":"YulFunctionCall","src":"1949:20:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1985:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1993:4:111","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1981:3:111"},"nodeType":"YulFunctionCall","src":"1981:17:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1975:5:111"},"nodeType":"YulFunctionCall","src":"1975:24:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2001:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1971:3:111"},"nodeType":"YulFunctionCall","src":"1971:33:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1942:6:111"},"nodeType":"YulFunctionCall","src":"1942:63:111"},"nodeType":"YulExpressionStatement","src":"1942:63:111"}]},"name":"abi_encode_tuple_t_struct$_ValidationData_$9761_memory_ptr__to_t_struct$_ValidationData_$9761_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1630:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1641:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1652:4:111","type":""}],"src":"1496:515:111"},{"body":{"nodeType":"YulBlock","src":"2086:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"2132:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2141:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2144:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2134:6:111"},"nodeType":"YulFunctionCall","src":"2134:12:111"},"nodeType":"YulExpressionStatement","src":"2134:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2107:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2116:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2103:3:111"},"nodeType":"YulFunctionCall","src":"2103:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2128:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2099:3:111"},"nodeType":"YulFunctionCall","src":"2099:32:111"},"nodeType":"YulIf","src":"2096:52:111"},{"nodeType":"YulAssignment","src":"2157:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2167:12:111"},"nodeType":"YulFunctionCall","src":"2167:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2157:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2052:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2063:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2075:6:111","type":""}],"src":"2016:180:111"},{"body":{"nodeType":"YulBlock","src":"2300:318:111","statements":[{"body":{"nodeType":"YulBlock","src":"2346:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2355:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2358:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2348:6:111"},"nodeType":"YulFunctionCall","src":"2348:12:111"},"nodeType":"YulExpressionStatement","src":"2348:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2321:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2330:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2317:3:111"},"nodeType":"YulFunctionCall","src":"2317:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2342:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2313:3:111"},"nodeType":"YulFunctionCall","src":"2313:32:111"},"nodeType":"YulIf","src":"2310:52:111"},{"nodeType":"YulVariableDeclaration","src":"2371:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2397:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2384:12:111"},"nodeType":"YulFunctionCall","src":"2384:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2375:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2460:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2469:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2472:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2462:6:111"},"nodeType":"YulFunctionCall","src":"2462:12:111"},"nodeType":"YulExpressionStatement","src":"2462:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2429:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2450:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2443:6:111"},"nodeType":"YulFunctionCall","src":"2443:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2436:6:111"},"nodeType":"YulFunctionCall","src":"2436:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2426:2:111"},"nodeType":"YulFunctionCall","src":"2426:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2419:6:111"},"nodeType":"YulFunctionCall","src":"2419:40:111"},"nodeType":"YulIf","src":"2416:60:111"},{"nodeType":"YulAssignment","src":"2485:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2495:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2485:6:111"}]},{"nodeType":"YulAssignment","src":"2509:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2541:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2552:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2537:3:111"},"nodeType":"YulFunctionCall","src":"2537:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"2519:17:111"},"nodeType":"YulFunctionCall","src":"2519:37:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2509:6:111"}]},{"nodeType":"YulAssignment","src":"2565:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2597:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2608:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2593:3:111"},"nodeType":"YulFunctionCall","src":"2593:18:111"}],"functionName":{"name":"abi_decode_uint48","nodeType":"YulIdentifier","src":"2575:17:111"},"nodeType":"YulFunctionCall","src":"2575:37:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2565:6:111"}]}]},"name":"abi_decode_tuple_t_boolt_uint48t_uint48","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2250:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2261:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2273:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2281:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2289:6:111","type":""}],"src":"2201:417:111"}]},"contents":"{\n { }\n function abi_decode_uint48(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_struct$_ValidationData_$9761_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, 96)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n mstore(64, newFreePtr)\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n mstore(memPtr, value)\n mstore(add(memPtr, 32), abi_decode_uint48(add(headStart, 32)))\n mstore(add(memPtr, 64), abi_decode_uint48(add(headStart, 64)))\n value0 := memPtr\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_struct$_ValidationData_$9761_memory_ptr__to_t_struct$_ValidationData_$9761_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(mload(value0), 0xffffffffffffffffffffffffffffffffffffffff))\n let memberValue0 := mload(add(value0, 0x20))\n let _1 := 0xffffffffffff\n mstore(add(headStart, 0x20), and(memberValue0, _1))\n mstore(add(headStart, 0x40), and(mload(add(value0, 0x40)), _1))\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_decode_tuple_t_boolt_uint48t_uint48(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n value1 := abi_decode_uint48(add(headStart, 32))\n value2 := abi_decode_uint48(add(headStart, 64))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061004c5760003560e01c806324d3cde6146100515780634fe5f5cf14610077578063a4b2282e146100d2578063b059e2fa146100e5575b600080fd5b61006461005f36600461036c565b6100f8565b6040519081526020015b60405180910390f35b61008a61008536600461041a565b61014c565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015165ffffffffffff90811691830191909152928201519092169082015260600161006e565b61008a6100e036600461043c565b61017a565b6100646100f3366004610455565b6101a0565b600061014682600060d0826020015165ffffffffffff16901b60a0836040015165ffffffffffff16901b836000015173ffffffffffffffffffffffffffffffffffffffff1617179050919050565b92915050565b604080516060810182526000808252602082018190529181019190915261017383836101b5565b9392505050565b60408051606081018252600080825260208201819052918101919091526101468261029b565b60006101ad848484610319565b949350505050565b60408051606081018252600080825260208201819052918101829052906101db8461029b565b905060006101e88461029b565b825190915073ffffffffffffffffffffffffffffffffffffffff811661020c575080515b602080840151604080860151928501519085015191929165ffffffffffff808316908516101561023a578193505b8065ffffffffffff168365ffffffffffff161115610256578092505b50506040805160608101825273ffffffffffffffffffffffffffffffffffffffff909416845265ffffffffffff92831660208501529116908201529250505092915050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff81166000036102d7575065ffffffffffff5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610341576000610344565b60015b60ff161717949350505050565b803565ffffffffffff8116811461036757600080fd5b919050565b60006060828403121561037e57600080fd5b6040516060810181811067ffffffffffffffff821117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823573ffffffffffffffffffffffffffffffffffffffff811681146103ef57600080fd5b81526103fd60208401610351565b602082015261040e60408401610351565b60408201529392505050565b6000806040838503121561042d57600080fd5b50508035926020909101359150565b60006020828403121561044e57600080fd5b5035919050565b60008060006060848603121561046a57600080fd5b8335801515811461047a57600080fd5b925061048860208501610351565b915061049660408501610351565b9050925092509256fea2646970667358221220267a4c5e88c357047c8bb2c95ecdb9dae63b394ac17138f870f7ca98f63dc4c264736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x24D3CDE6 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4FE5F5CF EQ PUSH2 0x77 JUMPI DUP1 PUSH4 0xA4B2282E EQ PUSH2 0xD2 JUMPI DUP1 PUSH4 0xB059E2FA EQ PUSH2 0xE5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x36C JUMP JUMPDEST PUSH2 0xF8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8A PUSH2 0x85 CALLDATASIZE PUSH1 0x4 PUSH2 0x41A JUMP JUMPDEST PUSH2 0x14C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 DUP3 ADD MLOAD SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x6E JUMP JUMPDEST PUSH2 0x8A PUSH2 0xE0 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C JUMP JUMPDEST PUSH2 0x17A JUMP JUMPDEST PUSH2 0x64 PUSH2 0xF3 CALLDATASIZE PUSH1 0x4 PUSH2 0x455 JUMP JUMPDEST PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x146 DUP3 PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH1 0x20 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP4 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x173 DUP4 DUP4 PUSH2 0x1B5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x146 DUP3 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AD DUP5 DUP5 DUP5 PUSH2 0x319 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x1DB DUP5 PUSH2 0x29B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E8 DUP5 PUSH2 0x29B JUMP JUMPDEST DUP3 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x20C JUMPI POP DUP1 MLOAD JUMPDEST PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP3 DUP6 ADD MLOAD SWAP1 DUP6 ADD MLOAD SWAP2 SWAP3 SWAP2 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP6 AND LT ISZERO PUSH2 0x23A JUMPI DUP2 SWAP4 POP JUMPDEST DUP1 PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND GT ISZERO PUSH2 0x256 JUMPI DUP1 SWAP3 POP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP5 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 AND SWAP1 DUP3 ADD MSTORE SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 PUSH1 0xA0 DUP2 SWAP1 SHR PUSH6 0xFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SUB PUSH2 0x2D7 JUMPI POP PUSH6 0xFFFFFFFFFFFF JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xD0 SWAP5 SWAP1 SWAP5 SHR PUSH1 0x20 DUP4 ADD MSTORE PUSH6 0xFFFFFFFFFFFF AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xD0 DUP3 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0xA0 DUP5 PUSH6 0xFFFFFFFFFFFF AND SWAP1 SHL DUP6 PUSH2 0x341 JUMPI PUSH1 0x0 PUSH2 0x344 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND OR OR SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x3C8 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MSTORE PUSH2 0x3FD PUSH1 0x20 DUP5 ADD PUSH2 0x351 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x40E PUSH1 0x40 DUP5 ADD PUSH2 0x351 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x46A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x47A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP PUSH2 0x488 PUSH1 0x20 DUP6 ADD PUSH2 0x351 JUMP JUMPDEST SWAP2 POP PUSH2 0x496 PUSH1 0x40 DUP6 ADD PUSH2 0x351 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 PUSH27 0x4C5E88C357047C8BB2C95ECDB9DAE63B394AC17138F870F7CA98F6 RETURNDATASIZE 0xC4 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"93:746:97:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;500:141;;;;;;:::i;:::-;;:::i;:::-;;;1207:25:111;;;1195:2;1180:18;500:141:97;;;;;;;;281:213;;;;;;:::i;:::-;;:::i;:::-;;;;1728:13:111;;1743:42;1724:62;1706:81;;1834:4;1822:17;;;1816:24;1859:14;1911:21;;;1889:20;;;1882:51;;;;1981:17;;;1975:24;1971:33;;;1949:20;;;1942:63;1694:2;1679:18;281:213:97;1496:515:111;121:154:97;;;;;;:::i;:::-;;:::i;647:190::-;;;;;;:::i;:::-;;:::i;500:141::-;583:7;609:25;629:4;2502:7:54;2621:8;2600:4;:15;;;2592:24;;:38;;2584:3;2564:4;:15;;;2556:24;;:31;;2536:4;:15;;;2528:60;;;:103;2521:110;;2431:207;;;;609:25:97;602:32;500:141;-1:-1:-1;;500:141:97:o;281:213::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;427:60:97;447:14;463:23;427:19;:60::i;:::-;420:67;281:213;-1:-1:-1;;;281:213:97:o;121:154::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;232:36:97;253:14;232:20;:36::i;647:190::-;750:7;776:54;796:9;807:10;819;776:19;:54::i;:::-;769:61;647:190;-1:-1:-1;;;;647:190:97:o;1392:927:54:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;1571:36:54;1592:14;1571:20;:36::i;:::-;1525:82;;1617:38;1658:45;1679:23;1658:20;:45::i;:::-;1734:32;;1617:86;;-1:-1:-1;1780:24:54;;;1776:95;;-1:-1:-1;1833:27:54;;1776:95;1900:32;;;;;1962;;;;;2026:27;;;;2085;;;;1900:32;;1962;2127:25;;;;;;;;2123:56;;;2167:12;2154:25;;2123:56;2206:12;2193:25;;:10;:25;;;2189:56;;;2233:12;2220:25;;2189:56;-1:-1:-1;;2262:50:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1392:927:54;;;;:::o;904:439::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;1044:14:54;1115:3;1097:21;;;1133:15;;;1007:18;1133:15;1129:75;;-1:-1:-1;1177:16:54;1129:75;1286:50;;;;;;;;;;;;;;1259:8;1240:28;;;;1286:50;;;;;;;;;;;;;-1:-1:-1;1286:50:54;904:439::o;2956:218::-;3053:7;3157:8;3141:10;3133:19;;:33;;3125:3;3110:10;3102:19;;:26;;3080:9;:17;;3096:1;3080:17;;;3092:1;3080:17;3079:50;;;:88;;2956:218;-1:-1:-1;;;;2956:218:54:o;14:167:111:-;81:20;;141:14;130:26;;120:37;;110:65;;171:1;168;161:12;110:65;14:167;;;:::o;186:870::-;277:6;330:2;318:9;309:7;305:23;301:32;298:52;;;346:1;343;336:12;298:52;379:2;373:9;421:2;413:6;409:15;490:6;478:10;475:22;454:18;442:10;439:34;436:62;433:242;;;531:77;528:1;521:88;632:4;629:1;622:15;660:4;657:1;650:15;433:242;691:2;684:22;728:23;;791:42;780:54;;770:65;;760:93;;849:1;846;839:12;760:93;862:21;;916:37;949:2;934:18;;916:37;:::i;:::-;911:2;903:6;899:15;892:62;987:37;1020:2;1009:9;1005:18;987:37;:::i;:::-;982:2;970:15;;963:62;974:6;186:870;-1:-1:-1;;;186:870:111:o;1243:248::-;1311:6;1319;1372:2;1360:9;1351:7;1347:23;1343:32;1340:52;;;1388:1;1385;1378:12;1340:52;-1:-1:-1;;1411:23:111;;;1481:2;1466:18;;;1453:32;;-1:-1:-1;1243:248:111:o;2016:180::-;2075:6;2128:2;2116:9;2107:7;2103:23;2099:32;2096:52;;;2144:1;2141;2134:12;2096:52;-1:-1:-1;2167:23:111;;2016:180;-1:-1:-1;2016:180:111:o;2201:417::-;2273:6;2281;2289;2342:2;2330:9;2321:7;2317:23;2313:32;2310:52;;;2358:1;2355;2348:12;2310:52;2397:9;2384:23;2450:5;2443:13;2436:21;2429:5;2426:32;2416:60;;2472:1;2469;2462:12;2416:60;2495:5;-1:-1:-1;2519:37:111;2552:2;2537:18;;2519:37;:::i;:::-;2509:47;;2575:37;2608:2;2597:9;2593:18;2575:37;:::i;:::-;2565:47;;2201:417;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"247400","executionCost":"287","totalCost":"247687"},"external":{"intersectTimeRange(uint256,uint256)":"infinite","packValidationData(bool,uint48,uint48)":"infinite","packValidationDataStruct((address,uint48,uint48))":"infinite","parseValidationData(uint256)":"763"}},"methodIdentifiers":{"intersectTimeRange(uint256,uint256)":"4fe5f5cf","packValidationData(bool,uint48,uint48)":"b059e2fa","packValidationDataStruct((address,uint48,uint48))":"24d3cde6","parseValidationData(uint256)":"a4b2282e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paymasterValidationData\",\"type\":\"uint256\"}],\"name\":\"intersectTimeRange\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"}],\"internalType\":\"struct ValidationData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"}],\"name\":\"packValidationData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"}],\"internalType\":\"struct ValidationData\",\"name\":\"data\",\"type\":\"tuple\"}],\"name\":\"packValidationDataStruct\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"name\":\"parseValidationData\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"}],\"internalType\":\"struct ValidationData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestHelpers.sol\":\"TestHelpers\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/test/TestHelpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../core/Helpers.sol\\\";\\n\\ncontract TestHelpers {\\n\\n function parseValidationData(uint validationData) public pure returns (ValidationData memory) {\\n return _parseValidationData(validationData);\\n }\\n\\n function intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) public pure returns (ValidationData memory) {\\n return _intersectTimeRange(validationData, paymasterValidationData);\\n }\\n\\n function packValidationDataStruct(ValidationData memory data) public pure returns (uint256) {\\n return _packValidationData(data);\\n }\\n\\n function packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) public pure returns (uint256) {\\n return _packValidationData(sigFailed, validUntil, validAfter);\\n }\\n}\\n\",\"keccak256\":\"0x5443b8c9191ae97530ef0109327631c68be4dba9a6a0a3ad6be0318c863bf3ae\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestOracle.sol":{"TestOracle":{"abi":[{"inputs":[{"internalType":"uint256","name":"ethOutput","type":"uint256"}],"name":"getTokenValueOfEth","outputs":[{"internalType":"uint256","name":"tokenInput","type":"uint256"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b50610110806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d1eca9cf14602d575b600080fd5b603c6038366004605f565b604e565b60405190815260200160405180910390f35b600060598260026077565b92915050565b600060208284031215607057600080fd5b5035919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161560d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50029056fea26469706673582212202631b91876fae58ab6cc7c5246b46d281399d80a755c7626c7763f2e292710ba64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x110 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x28 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD1ECA9CF EQ PUSH1 0x2D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3C PUSH1 0x38 CALLDATASIZE PUSH1 0x4 PUSH1 0x5F JUMP JUMPDEST PUSH1 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x59 DUP3 PUSH1 0x2 PUSH1 0x77 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH1 0x70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH1 0xD5 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP MUL SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 BALANCE 0xB9 XOR PUSH23 0xFAE58AB6CC7C5246B46D281399D80A755C7626C7763F2E 0x29 0x27 LT 0xBA PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"96:175:98:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@getTokenValueOfEth_19900":{"entryPoint":78,"id":19900,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_uint256":{"entryPoint":95,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":119,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:765:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"84:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"130:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"139:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"142:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"132:6:111"},"nodeType":"YulFunctionCall","src":"132:12:111"},"nodeType":"YulExpressionStatement","src":"132:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"105:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"114:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"101:3:111"},"nodeType":"YulFunctionCall","src":"101:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"126:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"97:3:111"},"nodeType":"YulFunctionCall","src":"97:32:111"},"nodeType":"YulIf","src":"94:52:111"},{"nodeType":"YulAssignment","src":"155:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"178:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"165:12:111"},"nodeType":"YulFunctionCall","src":"165:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"155:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"50:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"61:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"73:6:111","type":""}],"src":"14:180:111"},{"body":{"nodeType":"YulBlock","src":"300:76:111","statements":[{"nodeType":"YulAssignment","src":"310:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"322:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"333:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"318:3:111"},"nodeType":"YulFunctionCall","src":"318:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"310:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"352:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"363:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"345:6:111"},"nodeType":"YulFunctionCall","src":"345:25:111"},"nodeType":"YulExpressionStatement","src":"345:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"269:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"280:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"291:4:111","type":""}],"src":"199:177:111"},{"body":{"nodeType":"YulBlock","src":"433:330:111","statements":[{"body":{"nodeType":"YulBlock","src":"560:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"581:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"584:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"574:6:111"},"nodeType":"YulFunctionCall","src":"574:88:111"},"nodeType":"YulExpressionStatement","src":"574:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"682:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"685:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"675:6:111"},"nodeType":"YulFunctionCall","src":"675:15:111"},"nodeType":"YulExpressionStatement","src":"675:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"710:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"713:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"703:6:111"},"nodeType":"YulFunctionCall","src":"703:15:111"},"nodeType":"YulExpressionStatement","src":"703:15:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"464:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"457:6:111"},"nodeType":"YulFunctionCall","src":"457:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"450:6:111"},"nodeType":"YulFunctionCall","src":"450:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"472:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"479:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"547:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"475:3:111"},"nodeType":"YulFunctionCall","src":"475:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"469:2:111"},"nodeType":"YulFunctionCall","src":"469:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"446:3:111"},"nodeType":"YulFunctionCall","src":"446:105:111"},"nodeType":"YulIf","src":"443:285:111"},{"nodeType":"YulAssignment","src":"737:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"752:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"755:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"748:3:111"},"nodeType":"YulFunctionCall","src":"748:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"737:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"412:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"415:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"421:7:111","type":""}],"src":"381:382:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x)))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n product := mul(x, y)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"6080604052348015600f57600080fd5b506004361060285760003560e01c8063d1eca9cf14602d575b600080fd5b603c6038366004605f565b604e565b60405190815260200160405180910390f35b600060598260026077565b92915050565b600060208284031215607057600080fd5b5035919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161560d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50029056fea26469706673582212202631b91876fae58ab6cc7c5246b46d281399d80a755c7626c7763f2e292710ba64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x28 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD1ECA9CF EQ PUSH1 0x2D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3C PUSH1 0x38 CALLDATASIZE PUSH1 0x4 PUSH1 0x5F JUMP JUMPDEST PUSH1 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x59 DUP3 PUSH1 0x2 PUSH1 0x77 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH1 0x70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH1 0xD5 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP MUL SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 BALANCE 0xB9 XOR PUSH23 0xFAE58AB6CC7C5246B46D281399D80A755C7626C7763F2E 0x29 0x27 LT 0xBA PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"96:175:98:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133:136;;;;;;:::i;:::-;;:::i;:::-;;;345:25:111;;;333:2;318:18;133:136:98;;;;;;;;212:18;249:13;:9;261:1;249:13;:::i;:::-;242:20;133:136;-1:-1:-1;;133:136:98:o;14:180:111:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:111;;14:180;-1:-1:-1;14:180:111:o;381:382::-;421:7;547:1;479:66;475:74;472:1;469:81;464:1;457:9;450:17;446:105;443:285;;;584:77;581:1;574:88;685:4;682:1;675:15;713:4;710:1;703:15;443:285;-1:-1:-1;748:9:111;;381:382::o"},"gasEstimates":{"creation":{"codeDepositCost":"54400","executionCost":"105","totalCost":"54505"},"external":{"getTokenValueOfEth(uint256)":"346"}},"methodIdentifiers":{"getTokenValueOfEth(uint256)":"d1eca9cf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ethOutput\",\"type\":\"uint256\"}],\"name\":\"getTokenValueOfEth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenInput\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getTokenValueOfEth(uint256)\":{\"notice\":\"return amount of tokens that are required to receive that much eth.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestOracle.sol\":\"TestOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface IOracle {\\n\\n /**\\n * return amount of tokens that are required to receive that much eth.\\n */\\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\\n}\\n\\n\",\"keccak256\":\"0xdefd2ec9c4e592ad68092e9e4c15d27c697fc08f90a885bcdb47542da88b42be\",\"license\":\"GPL-3.0\"},\"contracts/test/TestOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/IOracle.sol\\\";\\n\\ncontract TestOracle is IOracle {\\n function getTokenValueOfEth(uint256 ethOutput) external pure override returns (uint256 tokenInput) {\\n return ethOutput * 2;\\n }\\n}\\n\",\"keccak256\":\"0x8bc7fbdea5a9b72fd01c8882879a360ba63a490e1ea015a283d7b0215f24d5b1\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"getTokenValueOfEth(uint256)":{"notice":"return amount of tokens that are required to receive that much eth."}},"version":1}}},"contracts/test/TestPaymasterAcceptAll.sol":{"TestPaymasterAcceptAll":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19929":{"entryPoint":null,"id":19929,"parameterSlots":1,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":297,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":91,"id":2932,"parameterSlots":1,"returnSlots":0},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@transferOwnership_2912":{"entryPoint":171,"id":2912,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":389,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1095:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"},{"body":{"nodeType":"YulBlock","src":"504:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"521:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"532:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"514:6:111"},"nodeType":"YulFunctionCall","src":"514:21:111"},"nodeType":"YulExpressionStatement","src":"514:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"555:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"566:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"551:3:111"},"nodeType":"YulFunctionCall","src":"551:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"571:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"544:6:111"},"nodeType":"YulFunctionCall","src":"544:30:111"},"nodeType":"YulExpressionStatement","src":"544:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"594:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"605:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"590:3:111"},"nodeType":"YulFunctionCall","src":"590:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"610:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"583:6:111"},"nodeType":"YulFunctionCall","src":"583:62:111"},"nodeType":"YulExpressionStatement","src":"583:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"665:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"676:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"661:3:111"},"nodeType":"YulFunctionCall","src":"661:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"681:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"654:6:111"},"nodeType":"YulFunctionCall","src":"654:36:111"},"nodeType":"YulExpressionStatement","src":"654:36:111"},{"nodeType":"YulAssignment","src":"699:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"711:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"722:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"707:3:111"},"nodeType":"YulFunctionCall","src":"707:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"699:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"481:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"495:4:111","type":""}],"src":"330:402:111"},{"body":{"nodeType":"YulBlock","src":"911:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"928:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"939:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"921:6:111"},"nodeType":"YulFunctionCall","src":"921:21:111"},"nodeType":"YulExpressionStatement","src":"921:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"962:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"973:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"958:3:111"},"nodeType":"YulFunctionCall","src":"958:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"978:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"951:6:111"},"nodeType":"YulFunctionCall","src":"951:30:111"},"nodeType":"YulExpressionStatement","src":"951:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1012:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"997:3:111"},"nodeType":"YulFunctionCall","src":"997:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"1017:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"990:6:111"},"nodeType":"YulFunctionCall","src":"990:62:111"},"nodeType":"YulExpressionStatement","src":"990:62:111"},{"nodeType":"YulAssignment","src":"1061:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1073:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1084:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1069:3:111"},"nodeType":"YulFunctionCall","src":"1069:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1061:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"888:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"902:4:111","type":""}],"src":"737:356:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a060405234801561001057600080fd5b50604051610da0380380610da083398101604081905261002f91610185565b806100393361005b565b6001600160a01b031660805232331461005557610055326100ab565b506101b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100b3610129565b6001600160a01b03811661011d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6101268161005b565b50565b6000546001600160a01b031633146101835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610114565b565b60006020828403121561019757600080fd5b81516001600160a01b03811681146101ae57600080fd5b9392505050565b608051610b9f61020160003960008181610199015281816102a50152818161036f015281816103eb015281816104b201528181610542015281816105f5015261083c0152610b9f6000f3fe6080604052600436106100c75760003560e01c8063bb9fe6bf11610074578063d0e30db01161004e578063d0e30db014610213578063f2fde38b1461021b578063f465c77e1461023b57600080fd5b8063bb9fe6bf146101bb578063c23a5cea146101d0578063c399ec88146101f057600080fd5b80638da5cb5b116100a55780638da5cb5b14610116578063a9a2340914610167578063b0d691fe1461018757600080fd5b80630396cb60146100cc578063205c2878146100e1578063715018a614610101575b600080fd5b6100df6100da36600461095a565b610269565b005b3480156100ed57600080fd5b506100df6100fc3660046109a9565b61031b565b34801561010d57600080fd5b506100df6103b3565b34801561012257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017357600080fd5b506100df6101823660046109d5565b6103c7565b34801561019357600080fd5b5061013d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101c757600080fd5b506100df6103e1565b3480156101dc57600080fd5b506100df6101eb366004610a64565b610465565b3480156101fc57600080fd5b50610205610511565b60405190815260200161015e565b6100df6105c7565b34801561022757600080fd5b506100df610236366004610a64565b61064f565b34801561024757600080fd5b5061025b610256366004610a81565b61070b565b60405161015e929190610ad5565b61027161072e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050565b61032361072e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156102ff57600080fd5b6103bb61072e565b6103c560006107af565b565b6103cf610824565b6103db848484846108c3565b50505050565b6103e961072e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561045157600080fd5b505af11580156103db573d6000803e3d6000fd5b61046d61072e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156104f657600080fd5b505af115801561050a573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190610b50565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156104f657600080fd5b61065761072e565b73ffffffffffffffffffffffffffffffffffffffff81166106ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610708816107af565b50565b60606000610717610824565b610722858585610925565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f6565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016106f6565b60606000826130391461093957600061093c565b60015b604080516020810190915260008152925060ff169050935093915050565b60006020828403121561096c57600080fd5b813563ffffffff8116811461098057600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461070857600080fd5b600080604083850312156109bc57600080fd5b82356109c781610987565b946020939093013593505050565b600080600080606085870312156109eb57600080fd5b8435600381106109fa57600080fd5b9350602085013567ffffffffffffffff80821115610a1757600080fd5b818701915087601f830112610a2b57600080fd5b813581811115610a3a57600080fd5b886020828501011115610a4c57600080fd5b95986020929092019750949560400135945092505050565b600060208284031215610a7657600080fd5b813561098081610987565b600080600060608486031215610a9657600080fd5b833567ffffffffffffffff811115610aad57600080fd5b84016101608187031215610ac057600080fd5b95602085013595506040909401359392505050565b604081526000835180604084015260005b81811015610b035760208187018101516060868401015201610ae6565b81811115610b15576000606083860101525b50602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b600060208284031215610b6257600080fd5b505191905056fea2646970667358221220fe78c83170088b091852e8e8a2b07f95ceb72c75dff336f3ed628c32d590652e64736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xDA0 CODESIZE SUB DUP1 PUSH2 0xDA0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x185 JUMP JUMPDEST DUP1 PUSH2 0x39 CALLER PUSH2 0x5B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE ORIGIN CALLER EQ PUSH2 0x55 JUMPI PUSH2 0x55 ORIGIN PUSH2 0xAB JUMP JUMPDEST POP PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xB3 PUSH2 0x129 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x11D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x126 DUP2 PUSH2 0x5B JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x183 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x114 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0xB9F PUSH2 0x201 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x199 ADD MSTORE DUP2 DUP2 PUSH2 0x2A5 ADD MSTORE DUP2 DUP2 PUSH2 0x36F ADD MSTORE DUP2 DUP2 PUSH2 0x3EB ADD MSTORE DUP2 DUP2 PUSH2 0x4B2 ADD MSTORE DUP2 DUP2 PUSH2 0x542 ADD MSTORE DUP2 DUP2 PUSH2 0x5F5 ADD MSTORE PUSH2 0x83C ADD MSTORE PUSH2 0xB9F PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC7 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x23B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x101 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x95A JUMP JUMPDEST PUSH2 0x269 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0x9A9 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3B3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x9D5 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3E1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xA64 JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x205 PUSH2 0x511 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x15E JUMP JUMPDEST PUSH2 0xDF PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x236 CALLDATASIZE PUSH1 0x4 PUSH2 0xA64 JUMP JUMPDEST PUSH2 0x64F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25B PUSH2 0x256 CALLDATASIZE PUSH1 0x4 PUSH2 0xA81 JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP3 SWAP2 SWAP1 PUSH2 0xAD5 JUMP JUMPDEST PUSH2 0x271 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x323 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BB PUSH2 0x72E JUMP JUMPDEST PUSH2 0x3C5 PUSH1 0x0 PUSH2 0x7AF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3CF PUSH2 0x824 JUMP JUMPDEST PUSH2 0x3DB DUP5 DUP5 DUP5 DUP5 PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3E9 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x46D PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x50A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x59E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0xB50 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x657 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x708 DUP2 PUSH2 0x7AF JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x717 PUSH2 0x824 JUMP JUMPDEST PUSH2 0x722 DUP6 DUP6 DUP6 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH2 0x3039 EQ PUSH2 0x939 JUMPI PUSH1 0x0 PUSH2 0x93C JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP3 POP PUSH1 0xFF AND SWAP1 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x980 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x708 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x9BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x9C7 DUP2 PUSH2 0x987 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x9EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x9FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xA3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x980 DUP2 PUSH2 0x987 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xA96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xAAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xAC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 DUP4 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB03 JUMPI PUSH1 0x20 DUP2 DUP8 ADD DUP2 ADD MLOAD PUSH1 0x60 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0xAE6 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP7 ADD ADD MSTORE JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE POP PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD PUSH1 0x60 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID PUSH25 0xC83170088B091852E8E8A2B07F95CEB72C75DFF336F3ED628C ORIGIN 0xD5 SWAP1 PUSH6 0x2E64736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"176:613:99:-:0;;;232:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;283:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;407:9:99::1;420:10;407:23;403:82;;446:28;464:9;446:17;:28::i;:::-;232:260:::0;176:613;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;2081:198::-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:24;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;532:2:111;2161:73:24::1;::::0;::::1;514:21:111::0;571:2;551:18;;;544:30;610:34;590:18;;;583:62;-1:-1:-1;;;661:18:111;;;654:36;707:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8:::0;2244:18:::1;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:24;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;939:2:111;1414:68:24;;;921:21:111;;;958:18;;;951:30;1017:34;997:18;;;990:62;1069:18;;1414:68:24;737:356:111;1414:68:24;1359:130::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;737:356::-;176:613:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_checkOwner_2875":{"entryPoint":1838,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_7416":{"entryPoint":2243,"id":7416,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":2084,"id":7527,"parameterSlots":0,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":1967,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_19959":{"entryPoint":2341,"id":19959,"parameterSlots":3,"returnSlots":2},"@addStake_7469":{"entryPoint":617,"id":7469,"parameterSlots":1,"returnSlots":0},"@deposit_7433":{"entryPoint":1479,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@getDeposit_7484":{"entryPoint":1297,"id":7484,"parameterSlots":0,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":967,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":947,"id":2889,"parameterSlots":0,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":1615,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockStake_7496":{"entryPoint":993,"id":7496,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":1803,"id":7359,"parameterSlots":3,"returnSlots":2},"@withdrawStake_7511":{"entryPoint":1125,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":795,"id":7451,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":2660,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":2473,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":2517,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":2689,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":2896,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":2394,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":2773,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"validator_revert_address_payable":{"entryPoint":2439,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:6473:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"899:125:111","statements":[{"nodeType":"YulAssignment","src":"909:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"921:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"932:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"909:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"951:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"966:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"974:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"962:3:111"},"nodeType":"YulFunctionCall","src":"962:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:74:111"},"nodeType":"YulExpressionStatement","src":"944:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"868:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"879:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"890:4:111","type":""}],"src":"798:226:111"},{"body":{"nodeType":"YulBlock","src":"1168:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"1214:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1223:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1226:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1216:6:111"},"nodeType":"YulFunctionCall","src":"1216:12:111"},"nodeType":"YulExpressionStatement","src":"1216:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1189:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1198:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1185:3:111"},"nodeType":"YulFunctionCall","src":"1185:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1210:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1181:3:111"},"nodeType":"YulFunctionCall","src":"1181:32:111"},"nodeType":"YulIf","src":"1178:52:111"},{"nodeType":"YulVariableDeclaration","src":"1239:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1265:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1252:12:111"},"nodeType":"YulFunctionCall","src":"1252:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1243:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1308:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1317:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1320:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1310:6:111"},"nodeType":"YulFunctionCall","src":"1310:12:111"},"nodeType":"YulExpressionStatement","src":"1310:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1297:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1304:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1294:2:111"},"nodeType":"YulFunctionCall","src":"1294:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1287:6:111"},"nodeType":"YulFunctionCall","src":"1287:20:111"},"nodeType":"YulIf","src":"1284:40:111"},{"nodeType":"YulAssignment","src":"1333:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1343:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1333:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1357:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1388:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1399:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1384:3:111"},"nodeType":"YulFunctionCall","src":"1384:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1371:12:111"},"nodeType":"YulFunctionCall","src":"1371:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"1361:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1412:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1422:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1416:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1467:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1476:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1479:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1469:6:111"},"nodeType":"YulFunctionCall","src":"1469:12:111"},"nodeType":"YulExpressionStatement","src":"1469:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1455:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1463:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1452:2:111"},"nodeType":"YulFunctionCall","src":"1452:14:111"},"nodeType":"YulIf","src":"1449:34:111"},{"nodeType":"YulVariableDeclaration","src":"1492:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1506:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"1517:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1502:3:111"},"nodeType":"YulFunctionCall","src":"1502:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1496:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1572:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1581:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1584:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1574:6:111"},"nodeType":"YulFunctionCall","src":"1574:12:111"},"nodeType":"YulExpressionStatement","src":"1574:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1551:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1555:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1547:3:111"},"nodeType":"YulFunctionCall","src":"1547:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1562:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1543:3:111"},"nodeType":"YulFunctionCall","src":"1543:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1536:6:111"},"nodeType":"YulFunctionCall","src":"1536:35:111"},"nodeType":"YulIf","src":"1533:55:111"},{"nodeType":"YulVariableDeclaration","src":"1597:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1624:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1611:12:111"},"nodeType":"YulFunctionCall","src":"1611:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1601:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1654:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1663:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1666:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1656:6:111"},"nodeType":"YulFunctionCall","src":"1656:12:111"},"nodeType":"YulExpressionStatement","src":"1656:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1642:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1650:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1639:2:111"},"nodeType":"YulFunctionCall","src":"1639:14:111"},"nodeType":"YulIf","src":"1636:34:111"},{"body":{"nodeType":"YulBlock","src":"1720:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1729:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1732:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1722:6:111"},"nodeType":"YulFunctionCall","src":"1722:12:111"},"nodeType":"YulExpressionStatement","src":"1722:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1693:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"1697:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1689:3:111"},"nodeType":"YulFunctionCall","src":"1689:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1706:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1685:3:111"},"nodeType":"YulFunctionCall","src":"1685:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"1711:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1682:2:111"},"nodeType":"YulFunctionCall","src":"1682:37:111"},"nodeType":"YulIf","src":"1679:57:111"},{"nodeType":"YulAssignment","src":"1745:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"1759:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"1763:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1755:3:111"},"nodeType":"YulFunctionCall","src":"1755:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1745:6:111"}]},{"nodeType":"YulAssignment","src":"1775:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"1785:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1775:6:111"}]},{"nodeType":"YulAssignment","src":"1800:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1838:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1823:3:111"},"nodeType":"YulFunctionCall","src":"1823:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1810:12:111"},"nodeType":"YulFunctionCall","src":"1810:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1800:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1110:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1121:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1133:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1141:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1149:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1157:6:111","type":""}],"src":"1029:819:111"},{"body":{"nodeType":"YulBlock","src":"1975:125:111","statements":[{"nodeType":"YulAssignment","src":"1985:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2008:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1993:3:111"},"nodeType":"YulFunctionCall","src":"1993:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1985:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2027:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2042:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2050:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2038:3:111"},"nodeType":"YulFunctionCall","src":"2038:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2020:6:111"},"nodeType":"YulFunctionCall","src":"2020:74:111"},"nodeType":"YulExpressionStatement","src":"2020:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1944:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1955:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1966:4:111","type":""}],"src":"1853:247:111"},{"body":{"nodeType":"YulBlock","src":"2183:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"2229:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2238:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2241:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2231:6:111"},"nodeType":"YulFunctionCall","src":"2231:12:111"},"nodeType":"YulExpressionStatement","src":"2231:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2204:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2200:3:111"},"nodeType":"YulFunctionCall","src":"2200:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2225:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2196:3:111"},"nodeType":"YulFunctionCall","src":"2196:32:111"},"nodeType":"YulIf","src":"2193:52:111"},{"nodeType":"YulVariableDeclaration","src":"2254:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2280:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2267:12:111"},"nodeType":"YulFunctionCall","src":"2267:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2258:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2332:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2299:32:111"},"nodeType":"YulFunctionCall","src":"2299:39:111"},"nodeType":"YulExpressionStatement","src":"2299:39:111"},{"nodeType":"YulAssignment","src":"2347:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2357:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2347:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2149:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2160:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2172:6:111","type":""}],"src":"2105:263:111"},{"body":{"nodeType":"YulBlock","src":"2474:76:111","statements":[{"nodeType":"YulAssignment","src":"2484:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2496:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2507:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2492:3:111"},"nodeType":"YulFunctionCall","src":"2492:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2484:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2526:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2537:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2519:6:111"},"nodeType":"YulFunctionCall","src":"2519:25:111"},"nodeType":"YulExpressionStatement","src":"2519:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2443:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2454:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2465:4:111","type":""}],"src":"2373:177:111"},{"body":{"nodeType":"YulBlock","src":"2625:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"2671:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2680:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2683:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2673:6:111"},"nodeType":"YulFunctionCall","src":"2673:12:111"},"nodeType":"YulExpressionStatement","src":"2673:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2646:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2655:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2642:3:111"},"nodeType":"YulFunctionCall","src":"2642:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2667:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2638:3:111"},"nodeType":"YulFunctionCall","src":"2638:32:111"},"nodeType":"YulIf","src":"2635:52:111"},{"nodeType":"YulVariableDeclaration","src":"2696:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2722:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2709:12:111"},"nodeType":"YulFunctionCall","src":"2709:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2700:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2774:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2741:32:111"},"nodeType":"YulFunctionCall","src":"2741:39:111"},"nodeType":"YulExpressionStatement","src":"2741:39:111"},{"nodeType":"YulAssignment","src":"2789:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2799:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2789:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2591:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2602:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2614:6:111","type":""}],"src":"2555:255:111"},{"body":{"nodeType":"YulBlock","src":"2953:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"2999:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3008:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3011:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3001:6:111"},"nodeType":"YulFunctionCall","src":"3001:12:111"},"nodeType":"YulExpressionStatement","src":"3001:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2974:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2983:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2970:3:111"},"nodeType":"YulFunctionCall","src":"2970:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2995:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2966:3:111"},"nodeType":"YulFunctionCall","src":"2966:32:111"},"nodeType":"YulIf","src":"2963:52:111"},{"nodeType":"YulVariableDeclaration","src":"3024:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3051:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3038:12:111"},"nodeType":"YulFunctionCall","src":"3038:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3028:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3104:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3113:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3116:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3106:6:111"},"nodeType":"YulFunctionCall","src":"3106:12:111"},"nodeType":"YulExpressionStatement","src":"3106:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3076:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3084:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3073:2:111"},"nodeType":"YulFunctionCall","src":"3073:30:111"},"nodeType":"YulIf","src":"3070:50:111"},{"nodeType":"YulVariableDeclaration","src":"3129:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3143:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3154:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3139:3:111"},"nodeType":"YulFunctionCall","src":"3139:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3133:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3200:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3209:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3212:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3202:6:111"},"nodeType":"YulFunctionCall","src":"3202:12:111"},"nodeType":"YulExpressionStatement","src":"3202:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3181:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3190:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3177:3:111"},"nodeType":"YulFunctionCall","src":"3177:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"3195:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3173:3:111"},"nodeType":"YulFunctionCall","src":"3173:26:111"},"nodeType":"YulIf","src":"3170:46:111"},{"nodeType":"YulAssignment","src":"3225:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"3235:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3225:6:111"}]},{"nodeType":"YulAssignment","src":"3246:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3273:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3284:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3269:3:111"},"nodeType":"YulFunctionCall","src":"3269:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3256:12:111"},"nodeType":"YulFunctionCall","src":"3256:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3246:6:111"}]},{"nodeType":"YulAssignment","src":"3297:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3324:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3335:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3320:3:111"},"nodeType":"YulFunctionCall","src":"3320:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3307:12:111"},"nodeType":"YulFunctionCall","src":"3307:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3297:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2903:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2914:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2926:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2934:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2942:6:111","type":""}],"src":"2815:530:111"},{"body":{"nodeType":"YulBlock","src":"3497:563:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3514:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3525:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3507:6:111"},"nodeType":"YulFunctionCall","src":"3507:21:111"},"nodeType":"YulExpressionStatement","src":"3507:21:111"},{"nodeType":"YulVariableDeclaration","src":"3537:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3557:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3551:5:111"},"nodeType":"YulFunctionCall","src":"3551:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3541:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3584:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3595:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3580:3:111"},"nodeType":"YulFunctionCall","src":"3580:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"3600:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3573:6:111"},"nodeType":"YulFunctionCall","src":"3573:34:111"},"nodeType":"YulExpressionStatement","src":"3573:34:111"},{"nodeType":"YulVariableDeclaration","src":"3616:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3625:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3620:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3687:92:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3716:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"3727:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3712:3:111"},"nodeType":"YulFunctionCall","src":"3712:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"3731:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3708:3:111"},"nodeType":"YulFunctionCall","src":"3708:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3750:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"3758:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3746:3:111"},"nodeType":"YulFunctionCall","src":"3746:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"3762:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3742:3:111"},"nodeType":"YulFunctionCall","src":"3742:25:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3736:5:111"},"nodeType":"YulFunctionCall","src":"3736:32:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3701:6:111"},"nodeType":"YulFunctionCall","src":"3701:68:111"},"nodeType":"YulExpressionStatement","src":"3701:68:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3646:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3649:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3643:2:111"},"nodeType":"YulFunctionCall","src":"3643:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3657:21:111","statements":[{"nodeType":"YulAssignment","src":"3659:17:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3668:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"3671:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3664:3:111"},"nodeType":"YulFunctionCall","src":"3664:12:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3659:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"3639:3:111","statements":[]},"src":"3635:144:111"},{"body":{"nodeType":"YulBlock","src":"3813:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3842:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"3853:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3838:3:111"},"nodeType":"YulFunctionCall","src":"3838:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"3862:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3834:3:111"},"nodeType":"YulFunctionCall","src":"3834:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"3867:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3827:6:111"},"nodeType":"YulFunctionCall","src":"3827:42:111"},"nodeType":"YulExpressionStatement","src":"3827:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3794:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"3797:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3791:2:111"},"nodeType":"YulFunctionCall","src":"3791:13:111"},"nodeType":"YulIf","src":"3788:91:111"},{"nodeType":"YulAssignment","src":"3888:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3904:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3923:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3931:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3919:3:111"},"nodeType":"YulFunctionCall","src":"3919:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3936:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3915:3:111"},"nodeType":"YulFunctionCall","src":"3915:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3900:3:111"},"nodeType":"YulFunctionCall","src":"3900:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"4006:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3896:3:111"},"nodeType":"YulFunctionCall","src":"3896:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3888:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4029:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4040:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4025:3:111"},"nodeType":"YulFunctionCall","src":"4025:20:111"},{"name":"value1","nodeType":"YulIdentifier","src":"4047:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4018:6:111"},"nodeType":"YulFunctionCall","src":"4018:36:111"},"nodeType":"YulExpressionStatement","src":"4018:36:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3458:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3469:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3477:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3488:4:111","type":""}],"src":"3350:710:111"},{"body":{"nodeType":"YulBlock","src":"4164:93:111","statements":[{"nodeType":"YulAssignment","src":"4174:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4186:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4197:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4182:3:111"},"nodeType":"YulFunctionCall","src":"4182:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4174:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4216:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4231:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4239:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4227:3:111"},"nodeType":"YulFunctionCall","src":"4227:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4209:6:111"},"nodeType":"YulFunctionCall","src":"4209:42:111"},"nodeType":"YulExpressionStatement","src":"4209:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4133:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4144:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4155:4:111","type":""}],"src":"4065:192:111"},{"body":{"nodeType":"YulBlock","src":"4407:168:111","statements":[{"nodeType":"YulAssignment","src":"4417:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4429:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4440:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4425:3:111"},"nodeType":"YulFunctionCall","src":"4425:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4417:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4459:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4474:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4482:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4470:3:111"},"nodeType":"YulFunctionCall","src":"4470:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4452:6:111"},"nodeType":"YulFunctionCall","src":"4452:74:111"},"nodeType":"YulExpressionStatement","src":"4452:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4546:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4557:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4542:3:111"},"nodeType":"YulFunctionCall","src":"4542:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"4562:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4535:6:111"},"nodeType":"YulFunctionCall","src":"4535:34:111"},"nodeType":"YulExpressionStatement","src":"4535:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4368:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4379:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4387:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4398:4:111","type":""}],"src":"4262:313:111"},{"body":{"nodeType":"YulBlock","src":"4697:125:111","statements":[{"nodeType":"YulAssignment","src":"4707:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4719:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4730:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4715:3:111"},"nodeType":"YulFunctionCall","src":"4715:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4707:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4749:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4764:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4772:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4760:3:111"},"nodeType":"YulFunctionCall","src":"4760:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4742:6:111"},"nodeType":"YulFunctionCall","src":"4742:74:111"},"nodeType":"YulExpressionStatement","src":"4742:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4666:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4677:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4688:4:111","type":""}],"src":"4580:242:111"},{"body":{"nodeType":"YulBlock","src":"4908:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"4954:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4963:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4966:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4956:6:111"},"nodeType":"YulFunctionCall","src":"4956:12:111"},"nodeType":"YulExpressionStatement","src":"4956:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4929:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4938:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4925:3:111"},"nodeType":"YulFunctionCall","src":"4925:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4950:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4921:3:111"},"nodeType":"YulFunctionCall","src":"4921:32:111"},"nodeType":"YulIf","src":"4918:52:111"},{"nodeType":"YulAssignment","src":"4979:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4995:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4989:5:111"},"nodeType":"YulFunctionCall","src":"4989:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4979:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4874:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4885:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4897:6:111","type":""}],"src":"4827:184:111"},{"body":{"nodeType":"YulBlock","src":"5190:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5218:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5200:6:111"},"nodeType":"YulFunctionCall","src":"5200:21:111"},"nodeType":"YulExpressionStatement","src":"5200:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5241:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5252:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5237:3:111"},"nodeType":"YulFunctionCall","src":"5237:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5257:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5230:6:111"},"nodeType":"YulFunctionCall","src":"5230:30:111"},"nodeType":"YulExpressionStatement","src":"5230:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5291:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5276:3:111"},"nodeType":"YulFunctionCall","src":"5276:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"5296:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5269:6:111"},"nodeType":"YulFunctionCall","src":"5269:62:111"},"nodeType":"YulExpressionStatement","src":"5269:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5362:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5347:3:111"},"nodeType":"YulFunctionCall","src":"5347:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"5367:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5340:6:111"},"nodeType":"YulFunctionCall","src":"5340:36:111"},"nodeType":"YulExpressionStatement","src":"5340:36:111"},{"nodeType":"YulAssignment","src":"5385:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5408:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5393:3:111"},"nodeType":"YulFunctionCall","src":"5393:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5385:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5167:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5181:4:111","type":""}],"src":"5016:402:111"},{"body":{"nodeType":"YulBlock","src":"5597:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5614:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5625:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5607:6:111"},"nodeType":"YulFunctionCall","src":"5607:21:111"},"nodeType":"YulExpressionStatement","src":"5607:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5648:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5659:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5644:3:111"},"nodeType":"YulFunctionCall","src":"5644:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5664:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5637:6:111"},"nodeType":"YulFunctionCall","src":"5637:30:111"},"nodeType":"YulExpressionStatement","src":"5637:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5687:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5698:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5683:3:111"},"nodeType":"YulFunctionCall","src":"5683:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"5703:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5676:6:111"},"nodeType":"YulFunctionCall","src":"5676:62:111"},"nodeType":"YulExpressionStatement","src":"5676:62:111"},{"nodeType":"YulAssignment","src":"5747:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5759:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5770:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5755:3:111"},"nodeType":"YulFunctionCall","src":"5755:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5747:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5574:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5588:4:111","type":""}],"src":"5423:356:111"},{"body":{"nodeType":"YulBlock","src":"5958:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5975:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5986:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5968:6:111"},"nodeType":"YulFunctionCall","src":"5968:21:111"},"nodeType":"YulExpressionStatement","src":"5968:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6009:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6020:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6005:3:111"},"nodeType":"YulFunctionCall","src":"6005:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6025:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5998:6:111"},"nodeType":"YulFunctionCall","src":"5998:30:111"},"nodeType":"YulExpressionStatement","src":"5998:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6048:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6059:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6044:3:111"},"nodeType":"YulFunctionCall","src":"6044:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"6064:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6037:6:111"},"nodeType":"YulFunctionCall","src":"6037:51:111"},"nodeType":"YulExpressionStatement","src":"6037:51:111"},{"nodeType":"YulAssignment","src":"6097:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6109:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6120:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6105:3:111"},"nodeType":"YulFunctionCall","src":"6105:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6097:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5935:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5949:4:111","type":""}],"src":"5784:345:111"},{"body":{"nodeType":"YulBlock","src":"6308:163:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6325:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6336:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6318:6:111"},"nodeType":"YulFunctionCall","src":"6318:21:111"},"nodeType":"YulExpressionStatement","src":"6318:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6359:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6370:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6355:3:111"},"nodeType":"YulFunctionCall","src":"6355:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6375:2:111","type":"","value":"13"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6348:6:111"},"nodeType":"YulFunctionCall","src":"6348:30:111"},"nodeType":"YulExpressionStatement","src":"6348:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6398:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6409:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6394:3:111"},"nodeType":"YulFunctionCall","src":"6394:18:111"},{"hexValue":"6d757374206f76657272696465","kind":"string","nodeType":"YulLiteral","src":"6414:15:111","type":"","value":"must override"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6387:6:111"},"nodeType":"YulFunctionCall","src":"6387:43:111"},"nodeType":"YulExpressionStatement","src":"6387:43:111"},{"nodeType":"YulAssignment","src":"6439:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6462:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6447:3:111"},"nodeType":"YulFunctionCall","src":"6447:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6439:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6285:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6299:4:111","type":""}],"src":"6134:337:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n let length := mload(value0)\n mstore(add(headStart, 64), length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n mstore(add(add(headStart, i), 96), mload(add(add(value0, i), 0x20)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 96), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 96)\n mstore(add(headStart, 0x20), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cfebc7a599a78eb43bf12fd80d02a05464d681b0cdda54c5b6b39e95676c7f1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 13)\n mstore(add(headStart, 64), \"must override\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":409},{"length":32,"start":677},{"length":32,"start":879},{"length":32,"start":1003},{"length":32,"start":1202},{"length":32,"start":1346},{"length":32,"start":1525},{"length":32,"start":2108}]},"linkReferences":{},"object":"6080604052600436106100c75760003560e01c8063bb9fe6bf11610074578063d0e30db01161004e578063d0e30db014610213578063f2fde38b1461021b578063f465c77e1461023b57600080fd5b8063bb9fe6bf146101bb578063c23a5cea146101d0578063c399ec88146101f057600080fd5b80638da5cb5b116100a55780638da5cb5b14610116578063a9a2340914610167578063b0d691fe1461018757600080fd5b80630396cb60146100cc578063205c2878146100e1578063715018a614610101575b600080fd5b6100df6100da36600461095a565b610269565b005b3480156100ed57600080fd5b506100df6100fc3660046109a9565b61031b565b34801561010d57600080fd5b506100df6103b3565b34801561012257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017357600080fd5b506100df6101823660046109d5565b6103c7565b34801561019357600080fd5b5061013d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101c757600080fd5b506100df6103e1565b3480156101dc57600080fd5b506100df6101eb366004610a64565b610465565b3480156101fc57600080fd5b50610205610511565b60405190815260200161015e565b6100df6105c7565b34801561022757600080fd5b506100df610236366004610a64565b61064f565b34801561024757600080fd5b5061025b610256366004610a81565b61070b565b60405161015e929190610ad5565b61027161072e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050565b61032361072e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156102ff57600080fd5b6103bb61072e565b6103c560006107af565b565b6103cf610824565b6103db848484846108c3565b50505050565b6103e961072e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561045157600080fd5b505af11580156103db573d6000803e3d6000fd5b61046d61072e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156104f657600080fd5b505af115801561050a573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190610b50565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b1580156104f657600080fd5b61065761072e565b73ffffffffffffffffffffffffffffffffffffffff81166106ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610708816107af565b50565b60606000610717610824565b610722858585610925565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f6565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e74000000000000000000000060448201526064016106f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d757374206f766572726964650000000000000000000000000000000000000060448201526064016106f6565b60606000826130391461093957600061093c565b60015b604080516020810190915260008152925060ff169050935093915050565b60006020828403121561096c57600080fd5b813563ffffffff8116811461098057600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461070857600080fd5b600080604083850312156109bc57600080fd5b82356109c781610987565b946020939093013593505050565b600080600080606085870312156109eb57600080fd5b8435600381106109fa57600080fd5b9350602085013567ffffffffffffffff80821115610a1757600080fd5b818701915087601f830112610a2b57600080fd5b813581811115610a3a57600080fd5b886020828501011115610a4c57600080fd5b95986020929092019750949560400135945092505050565b600060208284031215610a7657600080fd5b813561098081610987565b600080600060608486031215610a9657600080fd5b833567ffffffffffffffff811115610aad57600080fd5b84016101608187031215610ac057600080fd5b95602085013595506040909401359392505050565b604081526000835180604084015260005b81811015610b035760208187018101516060868401015201610ae6565b81811115610b15576000606083860101525b50602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b600060208284031215610b6257600080fd5b505191905056fea2646970667358221220fe78c83170088b091852e8e8a2b07f95ceb72c75dff336f3ed628c32d590652e64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC7 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0x74 JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21B JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x23B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x101 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x95A JUMP JUMPDEST PUSH2 0x269 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0x9A9 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3B3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x9D5 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x3E1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xA64 JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x205 PUSH2 0x511 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x15E JUMP JUMPDEST PUSH2 0xDF PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x236 CALLDATASIZE PUSH1 0x4 PUSH2 0xA64 JUMP JUMPDEST PUSH2 0x64F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25B PUSH2 0x256 CALLDATASIZE PUSH1 0x4 PUSH2 0xA81 JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP3 SWAP2 SWAP1 PUSH2 0xAD5 JUMP JUMPDEST PUSH2 0x271 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x323 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BB PUSH2 0x72E JUMP JUMPDEST PUSH2 0x3C5 PUSH1 0x0 PUSH2 0x7AF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3CF PUSH2 0x824 JUMP JUMPDEST PUSH2 0x3DB DUP5 DUP5 DUP5 DUP5 PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3E9 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x46D PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x50A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x59E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0xB50 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x657 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x708 DUP2 PUSH2 0x7AF JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x717 PUSH2 0x824 JUMP JUMPDEST PUSH2 0x722 DUP6 DUP6 DUP6 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x3C5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D757374206F7665727269646500000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x6F6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 PUSH2 0x3039 EQ PUSH2 0x939 JUMPI PUSH1 0x0 PUSH2 0x93C JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP3 POP PUSH1 0xFF AND SWAP1 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x980 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x708 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x9BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x9C7 DUP2 PUSH2 0x987 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x9EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x9FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xA3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x980 DUP2 PUSH2 0x987 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xA96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xAAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xAC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 DUP4 MLOAD DUP1 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB03 JUMPI PUSH1 0x20 DUP2 DUP8 ADD DUP2 ADD MLOAD PUSH1 0x60 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0xAE6 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 DUP7 ADD ADD MSTORE JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE POP PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD PUSH1 0x60 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID PUSH25 0xC83170088B091852E8E8A2B07F95CEB72C75DFF336F3ED628C ORIGIN 0xD5 SWAP1 PUSH6 0x2E64736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"176:613:99:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;1831:101:24:-;;;;;;;;;;;;;:::i;1201:85::-;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;;974:42:111;962:55;;;944:74;;932:2;917:18;1201:85:24;;;;;;;;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;:::-;;;2519:25:111;;;2507:2;2492:18;3318:111:52;2373:177:111;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;4239:10:111;4227:23;;3173:55:52::1;::::0;::::1;4209:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;4182:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;4470:55:111::0;;;2817:46:52::1;::::0;::::1;4452:74:111::0;4542:18;;;4535:34;;;2817:10:52::1;:21;::::0;::::1;::::0;4425:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1831:101:24::0;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;962:55:111::0;;;3975:41:52::1;::::0;::::1;944:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;917:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;944:74:111;3361:7:52;;3387:10;:20;;;;;917:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;944:74:111;2518:10:52;:20;;;;;2547:9;;917:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;5218:2:111;2161:73:24::1;::::0;::::1;5200:21:111::0;5257:2;5237:18;;;5230:30;5296:34;5276:18;;;5269:62;5367:8;5347:18;;;5340:36;5393:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;5625:2:111;1414:68:24;;;5607:21:111;;;5644:18;;;5637:30;5703:34;5683:18;;;5676:62;5755:18;;1414:68:24;5423:356:111;2433:187:24;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;5986:2:111;4148:67:52;;;5968:21:111;6025:2;6005:18;;;5998:30;6064:23;6044:18;;;6037:51;6105:18;;4148:67:52;5784:345:111;2089:285:52;2344:23;;;;;6336:2:111;2344:23:52;;;6318:21:111;6375:2;6355:18;;;6348:30;6414:15;6394:18;;;6387:43;6447:18;;2344:23:52;6134:337:111;498:289:99;648:20;670:22;755:7;766:5;755:16;:24;;778:1;755:24;;;774:1;755:24;743:37;;;;;;;;;-1:-1:-1;743:37:99;;;-1:-1:-1;743:37:99;;;-1:-1:-1;498:289:99;;;;;;:::o;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1029:819::-;1133:6;1141;1149;1157;1210:2;1198:9;1189:7;1185:23;1181:32;1178:52;;;1226:1;1223;1216:12;1178:52;1265:9;1252:23;1304:1;1297:5;1294:12;1284:40;;1320:1;1317;1310:12;1284:40;1343:5;-1:-1:-1;1399:2:111;1384:18;;1371:32;1422:18;1452:14;;;1449:34;;;1479:1;1476;1469:12;1449:34;1517:6;1506:9;1502:22;1492:32;;1562:7;1555:4;1551:2;1547:13;1543:27;1533:55;;1584:1;1581;1574:12;1533:55;1624:2;1611:16;1650:2;1642:6;1639:14;1636:34;;;1666:1;1663;1656:12;1636:34;1711:7;1706:2;1697:6;1693:2;1689:15;1685:24;1682:37;1679:57;;;1732:1;1729;1722:12;1679:57;1029:819;;1763:2;1755:11;;;;;-1:-1:-1;1785:6:111;;1838:2;1823:18;1810:32;;-1:-1:-1;1029:819:111;-1:-1:-1;;;1029:819:111:o;2105:263::-;2172:6;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2280:9;2267:23;2299:39;2332:5;2299:39;:::i;2815:530::-;2926:6;2934;2942;2995:2;2983:9;2974:7;2970:23;2966:32;2963:52;;;3011:1;3008;3001:12;2963:52;3051:9;3038:23;3084:18;3076:6;3073:30;3070:50;;;3116:1;3113;3106:12;3070:50;3139:22;;3195:3;3177:16;;;3173:26;3170:46;;;3212:1;3209;3202:12;3170:46;3235:2;3284;3269:18;;3256:32;;-1:-1:-1;3335:2:111;3320:18;;;3307:32;;2815:530;-1:-1:-1;;;2815:530:111:o;3350:710::-;3525:2;3514:9;3507:21;3488:4;3557:6;3551:13;3600:6;3595:2;3584:9;3580:18;3573:34;3625:1;3635:144;3649:6;3646:1;3643:13;3635:144;;;3762:4;3746:14;;;3742:25;;3736:32;3731:2;3712:17;;;3708:26;3701:68;3664:12;3635:144;;;3797:6;3794:1;3791:13;3788:91;;;3867:1;3862:2;3853:6;3842:9;3838:22;3834:31;3827:42;3788:91;-1:-1:-1;4040:4:111;4025:20;;4018:36;;;;-1:-1:-1;3931:2:111;3919:15;;;;3936:66;3915:88;3900:104;4006:2;3896:113;;3350:710;-1:-1:-1;3350:710:111:o;4827:184::-;4897:6;4950:2;4938:9;4929:7;4925:23;4921:32;4918:52;;;4966:1;4963;4956:12;4918:52;-1:-1:-1;4989:16:111;;4827:184;-1:-1:-1;4827:184:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"595000","executionCost":"infinite","totalCost":"infinite"},"external":{"addStake(uint32)":"infinite","deposit()":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","owner()":"2308","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockStake()":"infinite","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite"},"internal":{"_validatePaymasterUserOp(struct UserOperation calldata,bytes32,uint256)":"infinite"}},"methodIdentifiers":{"addStake(uint32)":"0396cb60","deposit()":"d0e30db0","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockStake()":"bb9fe6bf","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"}},\"notice\":\"test paymaster, that pays for everything, without any check.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestPaymasterAcceptAll.sol\":\"TestPaymasterAcceptAll\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/test/TestPaymasterAcceptAll.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\n\\n/**\\n * test paymaster, that pays for everything, without any check.\\n */\\ncontract TestPaymasterAcceptAll is BasePaymaster {\\n\\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\\n // to support \\\"deterministic address\\\" factory\\n // solhint-disable avoid-tx-origin\\n if (tx.origin != msg.sender) {\\n transferOwnership(tx.origin);\\n }\\n\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual override view\\n returns (bytes memory context, uint256 validationData) {\\n (userOp, userOpHash, maxCost);\\n return (\\\"\\\", maxCost == 12345 ? 1 : 0);\\n }\\n}\\n\",\"keccak256\":\"0x2433e9a2fb6a5eaf295c7af1da1cf50dc019e017259f363f1c49fd0450990893\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/test/TestPaymasterAcceptAll.sol:TestPaymasterAcceptAll","label":"_owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"}},"notice":"test paymaster, that pays for everything, without any check.","version":1}}},"contracts/test/TestRevertAccount.sol":{"TestRevertAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_ep","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"revertLong","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_19979":{"entryPoint":null,"id":19979,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":71,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"608060405260405161022e38038061022e83398101604081905261002291610047565b600080546001600160a01b0319166001600160a01b0392909216919091179055610077565b60006020828403121561005957600080fd5b81516001600160a01b038116811461007057600080fd5b9392505050565b6101a8806100866000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633a871cdd1461003b578063be76c6ef14610060575b600080fd5b61004e610049366004610105565b610075565b60405190815260200160405180910390f35b61007361006e366004610159565b806000fd5b005b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b1580156100e257600080fd5b505af11580156100f6573d6000803e3d6000fd5b50600098975050505050505050565b60008060006060848603121561011a57600080fd5b833567ffffffffffffffff81111561013157600080fd5b8401610160818703121561014457600080fd5b95602085013595506040909401359392505050565b60006020828403121561016b57600080fd5b503591905056fea26469706673582212200610227ef61703b7b02a669057fc4c9540b5243b3875e5ab72057e2923a53dc364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x22E CODESIZE SUB DUP1 PUSH2 0x22E DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x22 SWAP2 PUSH2 0x47 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A8 DUP1 PUSH2 0x86 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xBE76C6EF EQ PUSH2 0x60 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x105 JUMP JUMPDEST PUSH2 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x73 PUSH2 0x6E CALLDATASIZE PUSH1 0x4 PUSH2 0x159 JUMP JUMPDEST DUP1 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x11A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x131 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MOD LT 0x22 PUSH31 0xF61703B7B02A669057FC4C9540B5243B3875E5AB72057E2923A53DC364736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"147:494:100:-:0;;;220:62;;;;;;;;;;;;;;;;;;:::i;:::-;267:2;:8;;-1:-1:-1;;;;;;267:8:100;-1:-1:-1;;;;;267:8:100;;;;;;;;;;147:494;;14:311:111;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;147:494:100;;;;;;"},"deployedBytecode":{"functionDebugData":{"@revertLong_20013":{"entryPoint":null,"id":20013,"parameterSlots":1,"returnSlots":0},"@validateUserOp_20006":{"entryPoint":117,"id":20006,"parameterSlots":3,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":261,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256":{"entryPoint":345,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1144:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"152:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"200:6:111"},"nodeType":"YulFunctionCall","src":"200:12:111"},"nodeType":"YulExpressionStatement","src":"200:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"173:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"182:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"169:3:111"},"nodeType":"YulFunctionCall","src":"169:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"194:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"165:3:111"},"nodeType":"YulFunctionCall","src":"165:32:111"},"nodeType":"YulIf","src":"162:52:111"},{"nodeType":"YulVariableDeclaration","src":"223:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"250:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"237:12:111"},"nodeType":"YulFunctionCall","src":"237:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"227:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"303:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"312:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"315:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"305:6:111"},"nodeType":"YulFunctionCall","src":"305:12:111"},"nodeType":"YulExpressionStatement","src":"305:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"275:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"283:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"272:2:111"},"nodeType":"YulFunctionCall","src":"272:30:111"},"nodeType":"YulIf","src":"269:50:111"},{"nodeType":"YulVariableDeclaration","src":"328:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"342:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"353:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"338:3:111"},"nodeType":"YulFunctionCall","src":"338:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"332:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"399:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"408:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"411:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"401:6:111"},"nodeType":"YulFunctionCall","src":"401:12:111"},"nodeType":"YulExpressionStatement","src":"401:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"380:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"389:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"376:3:111"},"nodeType":"YulFunctionCall","src":"376:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"394:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"372:3:111"},"nodeType":"YulFunctionCall","src":"372:26:111"},"nodeType":"YulIf","src":"369:46:111"},{"nodeType":"YulAssignment","src":"424:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"434:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"424:6:111"}]},{"nodeType":"YulAssignment","src":"445:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"468:3:111"},"nodeType":"YulFunctionCall","src":"468:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"455:12:111"},"nodeType":"YulFunctionCall","src":"455:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"445:6:111"}]},{"nodeType":"YulAssignment","src":"496:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"523:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"534:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"519:3:111"},"nodeType":"YulFunctionCall","src":"519:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"506:12:111"},"nodeType":"YulFunctionCall","src":"506:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"496:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"102:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"113:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"125:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"133:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"141:6:111","type":""}],"src":"14:530:111"},{"body":{"nodeType":"YulBlock","src":"650:76:111","statements":[{"nodeType":"YulAssignment","src":"660:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"683:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"668:3:111"},"nodeType":"YulFunctionCall","src":"668:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"660:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"702:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"713:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"695:6:111"},"nodeType":"YulFunctionCall","src":"695:25:111"},"nodeType":"YulExpressionStatement","src":"695:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"619:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"630:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"641:4:111","type":""}],"src":"549:177:111"},{"body":{"nodeType":"YulBlock","src":"801:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"847:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"856:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"859:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"849:6:111"},"nodeType":"YulFunctionCall","src":"849:12:111"},"nodeType":"YulExpressionStatement","src":"849:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"822:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"831:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"818:3:111"},"nodeType":"YulFunctionCall","src":"818:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"843:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"814:3:111"},"nodeType":"YulFunctionCall","src":"814:32:111"},"nodeType":"YulIf","src":"811:52:111"},{"nodeType":"YulAssignment","src":"872:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"895:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"882:12:111"},"nodeType":"YulFunctionCall","src":"882:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"872:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"767:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"778:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"790:6:111","type":""}],"src":"731:180:111"},{"body":{"nodeType":"YulBlock","src":"1017:125:111","statements":[{"nodeType":"YulAssignment","src":"1027:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1039:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1050:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1035:3:111"},"nodeType":"YulFunctionCall","src":"1035:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1027:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1069:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1084:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1092:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1080:3:111"},"nodeType":"YulFunctionCall","src":"1080:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1062:6:111"},"nodeType":"YulFunctionCall","src":"1062:74:111"},"nodeType":"YulExpressionStatement","src":"1062:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"986:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"997:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1008:4:111","type":""}],"src":"916:226:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100365760003560e01c80633a871cdd1461003b578063be76c6ef14610060575b600080fd5b61004e610049366004610105565b610075565b60405190815260200160405180910390f35b61007361006e366004610159565b806000fd5b005b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b1580156100e257600080fd5b505af11580156100f6573d6000803e3d6000fd5b50600098975050505050505050565b60008060006060848603121561011a57600080fd5b833567ffffffffffffffff81111561013157600080fd5b8401610160818703121561014457600080fd5b95602085013595506040909401359392505050565b60006020828403121561016b57600080fd5b503591905056fea26469706673582212200610227ef61703b7b02a669057fc4c9540b5243b3875e5ab72057e2923a53dc364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xBE76C6EF EQ PUSH2 0x60 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x105 JUMP JUMPDEST PUSH2 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x73 PUSH2 0x6E CALLDATASIZE PUSH1 0x4 PUSH2 0x159 JUMP JUMPDEST DUP1 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x11A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x131 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MOD LT 0x22 PUSH31 0xF61703B7B02A669057FC4C9540B5243B3875E5AB72057E2923A53DC364736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"147:494:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;288:232;;;;;;:::i;:::-;;:::i;:::-;;;695:25:111;;;683:2;668:18;288:232:100;;;;;;;526:113;;;;;;:::i;:::-;616:6;613:1;606:17;526:113;;288:232;405:22;439:2;;:56;;;;;489:4;439:56;;;1062:74:111;439:2:100;;;;;:12;;460:19;;1035:18:111;;439:56:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;512:1:100;;288:232;-1:-1:-1;;;;;;;;288:232:100:o;14:530:111:-;125:6;133;141;194:2;182:9;173:7;169:23;165:32;162:52;;;210:1;207;200:12;162:52;250:9;237:23;283:18;275:6;272:30;269:50;;;315:1;312;305:12;269:50;338:22;;394:3;376:16;;;372:26;369:46;;;411:1;408;401:12;369:46;434:2;483;468:18;;455:32;;-1:-1:-1;534:2:111;519:18;;;506:32;;14:530;-1:-1:-1;;;14:530:111:o;731:180::-;790:6;843:2;831:9;822:7;818:23;814:32;811:52;;;859:1;856;849:12;811:52;-1:-1:-1;882:23:111;;731:180;-1:-1:-1;731:180:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"84800","executionCost":"infinite","totalCost":"infinite"},"external":{"revertLong(uint256)":"infinite","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite"}},"methodIdentifiers":{"revertLong(uint256)":"be76c6ef","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_ep\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"revertLong\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestRevertAccount.sol\":\"TestRevertAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/TestRevertAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../samples/SimpleAccount.sol\\\";\\ncontract TestRevertAccount is IAccount {\\n IEntryPoint private ep;\\n constructor(IEntryPoint _ep) payable {\\n ep = _ep;\\n }\\n\\n function validateUserOp(UserOperation calldata, bytes32, uint256 missingAccountFunds)\\n external override returns (uint256 validationData) {\\n ep.depositTo{value : missingAccountFunds}(address(this));\\n return 0;\\n }\\n\\n function revertLong(uint256 length) public pure{\\n assembly {\\n revert(0, length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc93d3450745938e08a61667aa28b9dc5e2f503b020b09c796cfc86c9dc88c5a8\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":19968,"contract":"contracts/test/TestRevertAccount.sol:TestRevertAccount","label":"ep","offset":0,"slot":"0","type":"t_contract(IEntryPoint)10807"}],"types":{"t_contract(IEntryPoint)10807":{"encoding":"inplace","label":"contract IEntryPoint","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestSignatureAggregator.sol":{"TestSignatureAggregator":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"internalType":"uint32","name":"delay","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(address,uint32)":{"params":{"delay":"- the new lock duration before the deposit can be withdrawn.","entryPoint":"- the EntryPoint to send the stake to."}},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"params":{"userOp":"the userOperation received from the user."},"returns":{"_0":"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \"multisig\""}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b5061070d806100206000396000f3fe60806040526004361061003f5760003560e01c8063275e2d7914610044578063451711591461007a57806364c530cd1461008f578063e3563a4f146100bd575b600080fd5b34801561005057600080fd5b5061006461005f3660046103e8565b6100dd565b604051610071919061042a565b60405180910390f35b61008d61008836600461049d565b610156565b005b34801561009b57600080fd5b506100646100aa3660046104f8565b5060408051602081019091526000815290565b3480156100c957600080fd5b5061008d6100d836600461053b565b6101e1565b60606000805b83811015610131578484828181106100fd576100fd6105d2565b905060200281019061010f9190610601565b61011d90602001358361066e565b91508061012981610686565b9150506100e3565b5060408051602081018390520160405160208183030381529060405291505092915050565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015273ffffffffffffffffffffffffffffffffffffffff831690630396cb609034906024016000604051808303818588803b1580156101c457600080fd5b505af11580156101d8573d6000803e3d6000fd5b50505050505050565b6000805b84811015610239576000868683818110610201576102016105d2565b90506020028101906102139190610601565b602001359050610223818461066e565b925050808061023190610686565b9150506101e5565b50602082146102cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f546573745369676e617475726556616c696461746f723a20736967206d75737460448201527f2062652075696e7400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60006102dd838501856106be565b9050818114610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f546573745369676e617475726556616c696461746f723a20616767726567617460448201527f6564207369676e6174757265206d69736d6174636820286e6f6e63652073756d60648201527f2900000000000000000000000000000000000000000000000000000000000000608482015260a4016102c6565b505050505050565b60008083601f8401126103ae57600080fd5b50813567ffffffffffffffff8111156103c657600080fd5b6020830191508360208260051b85010111156103e157600080fd5b9250929050565b600080602083850312156103fb57600080fd5b823567ffffffffffffffff81111561041257600080fd5b61041e8582860161039c565b90969095509350505050565b600060208083528351808285015260005b818110156104575785810183015185820160400152820161043b565b81811115610469576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600080604083850312156104b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146104d457600080fd5b9150602083013563ffffffff811681146104ed57600080fd5b809150509250929050565b60006020828403121561050a57600080fd5b813567ffffffffffffffff81111561052157600080fd5b8201610160818503121561053457600080fd5b9392505050565b6000806000806040858703121561055157600080fd5b843567ffffffffffffffff8082111561056957600080fd5b6105758883890161039c565b9096509450602087013591508082111561058e57600080fd5b818701915087601f8301126105a257600080fd5b8135818111156105b157600080fd5b8860208285010111156105c357600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea183360301811261063557600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156106815761068161063f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b7576106b761063f565b5060010190565b6000602082840312156106d057600080fd5b503591905056fea2646970667358221220ec237f70ef123b3a91c597364254b5dcb5d25d452d43014789be2b2f6578cd9764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70D DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x275E2D79 EQ PUSH2 0x44 JUMPI DUP1 PUSH4 0x45171159 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x64C530CD EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xE3563A4F EQ PUSH2 0xBD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E8 JUMP JUMPDEST PUSH2 0xDD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x42A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0x49D JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0xAA CALLDATASIZE PUSH1 0x4 PUSH2 0x4F8 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH2 0xD8 CALLDATASIZE PUSH1 0x4 PUSH2 0x53B JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x131 JUMPI DUP5 DUP5 DUP3 DUP2 DUP2 LT PUSH2 0xFD JUMPI PUSH2 0xFD PUSH2 0x5D2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x10F SWAP2 SWAP1 PUSH2 0x601 JUMP JUMPDEST PUSH2 0x11D SWAP1 PUSH1 0x20 ADD CALLDATALOAD DUP4 PUSH2 0x66E JUMP JUMPDEST SWAP2 POP DUP1 PUSH2 0x129 DUP2 PUSH2 0x686 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xE3 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x239 JUMPI PUSH1 0x0 DUP7 DUP7 DUP4 DUP2 DUP2 LT PUSH2 0x201 JUMPI PUSH2 0x201 PUSH2 0x5D2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x601 JUMP JUMPDEST PUSH1 0x20 ADD CALLDATALOAD SWAP1 POP PUSH2 0x223 DUP2 DUP5 PUSH2 0x66E JUMP JUMPDEST SWAP3 POP POP DUP1 DUP1 PUSH2 0x231 SWAP1 PUSH2 0x686 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 EQ PUSH2 0x2CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546573745369676E617475726556616C696461746F723A20736967206D757374 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2062652075696E74000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2DD DUP4 DUP6 ADD DUP6 PUSH2 0x6BE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 EQ PUSH2 0x394 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x41 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546573745369676E617475726556616C696461746F723A206167677265676174 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6564207369676E6174757265206D69736D6174636820286E6F6E63652073756D PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x2C6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41E DUP6 DUP3 DUP7 ADD PUSH2 0x39C JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x457 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x43B JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x551 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x569 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x575 DUP9 DUP4 DUP10 ADD PUSH2 0x39C JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x5B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x681 JUMPI PUSH2 0x681 PUSH2 0x63F JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x63F JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEC 0x23 PUSH32 0x70EF123B3A91C597364254B5DCB5D25D452D43014789BE2B2F6578CD9764736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"318:1521:101:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@addStake_20158":{"entryPoint":342,"id":20158,"parameterSlots":2,"returnSlots":0},"@aggregateSignatures_20139":{"entryPoint":221,"id":20139,"parameterSlots":2,"returnSlots":1},"@validateSignatures_20087":{"entryPoint":481,"id":20087,"parameterSlots":4,"returnSlots":0},"@validateUserOpSignature_20099":{"entryPoint":null,"id":20099,"parameterSlots":1,"returnSlots":1},"abi_decode_array_struct_UserOperation_calldata_dyn_calldata":{"entryPoint":924,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr":{"entryPoint":1000,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr":{"entryPoint":1339,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32":{"entryPoint":1181,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":1272,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256":{"entryPoint":1726,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":1066,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8d9d685720b347b5074ab5a98aba04c9189b0f93128711db984ab9c1d90c4824__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_99d9e6a25b1da7bdaea8c6d854d5639998d740d025b4bc7ada8394264a61b31c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":1537,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":1646,"id":null,"parameterSlots":2,"returnSlots":1},"increment_t_uint256":{"entryPoint":1670,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":1599,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":1490,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:5988:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"120:283:111","statements":[{"body":{"nodeType":"YulBlock","src":"169:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"178:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"181:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"171:6:111"},"nodeType":"YulFunctionCall","src":"171:12:111"},"nodeType":"YulExpressionStatement","src":"171:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"148:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"156:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"144:3:111"},"nodeType":"YulFunctionCall","src":"144:17:111"},{"name":"end","nodeType":"YulIdentifier","src":"163:3:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"140:3:111"},"nodeType":"YulFunctionCall","src":"140:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"133:6:111"},"nodeType":"YulFunctionCall","src":"133:35:111"},"nodeType":"YulIf","src":"130:55:111"},{"nodeType":"YulAssignment","src":"194:30:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"217:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"204:12:111"},"nodeType":"YulFunctionCall","src":"204:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"194:6:111"}]},{"body":{"nodeType":"YulBlock","src":"267:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"276:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"279:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"269:6:111"},"nodeType":"YulFunctionCall","src":"269:12:111"},"nodeType":"YulExpressionStatement","src":"269:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"239:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"247:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"236:2:111"},"nodeType":"YulFunctionCall","src":"236:30:111"},"nodeType":"YulIf","src":"233:50:111"},{"nodeType":"YulAssignment","src":"292:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"308:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"316:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"304:3:111"},"nodeType":"YulFunctionCall","src":"304:17:111"},"variableNames":[{"name":"arrayPos","nodeType":"YulIdentifier","src":"292:8:111"}]},{"body":{"nodeType":"YulBlock","src":"381:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"390:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"393:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"383:6:111"},"nodeType":"YulFunctionCall","src":"383:12:111"},"nodeType":"YulExpressionStatement","src":"383:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"344:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"356:1:111","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"359:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"352:3:111"},"nodeType":"YulFunctionCall","src":"352:14:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"340:3:111"},"nodeType":"YulFunctionCall","src":"340:27:111"},{"kind":"number","nodeType":"YulLiteral","src":"369:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"336:3:111"},"nodeType":"YulFunctionCall","src":"336:38:111"},{"name":"end","nodeType":"YulIdentifier","src":"376:3:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"333:2:111"},"nodeType":"YulFunctionCall","src":"333:47:111"},"nodeType":"YulIf","src":"330:67:111"}]},"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"83:6:111","type":""},{"name":"end","nodeType":"YulTypedName","src":"91:3:111","type":""}],"returnVariables":[{"name":"arrayPos","nodeType":"YulTypedName","src":"99:8:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"109:6:111","type":""}],"src":"14:389:111"},{"body":{"nodeType":"YulBlock","src":"547:354:111","statements":[{"body":{"nodeType":"YulBlock","src":"593:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"602:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"605:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"595:6:111"},"nodeType":"YulFunctionCall","src":"595:12:111"},"nodeType":"YulExpressionStatement","src":"595:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"568:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"577:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"564:3:111"},"nodeType":"YulFunctionCall","src":"564:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"589:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"560:3:111"},"nodeType":"YulFunctionCall","src":"560:32:111"},"nodeType":"YulIf","src":"557:52:111"},{"nodeType":"YulVariableDeclaration","src":"618:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"645:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"632:12:111"},"nodeType":"YulFunctionCall","src":"632:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"622:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"698:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"707:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"710:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"700:6:111"},"nodeType":"YulFunctionCall","src":"700:12:111"},"nodeType":"YulExpressionStatement","src":"700:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"670:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"678:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"667:2:111"},"nodeType":"YulFunctionCall","src":"667:30:111"},"nodeType":"YulIf","src":"664:50:111"},{"nodeType":"YulVariableDeclaration","src":"723:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"813:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"824:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"809:3:111"},"nodeType":"YulFunctionCall","src":"809:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"833:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"749:59:111"},"nodeType":"YulFunctionCall","src":"749:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"727:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"737:8:111","type":""}]},{"nodeType":"YulAssignment","src":"850:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"860:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"850:6:111"}]},{"nodeType":"YulAssignment","src":"877:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"887:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"877:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"505:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"516:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"528:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"536:6:111","type":""}],"src":"408:493:111"},{"body":{"nodeType":"YulBlock","src":"1025:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1035:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1045:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1039:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1063:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1074:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1056:6:111"},"nodeType":"YulFunctionCall","src":"1056:21:111"},"nodeType":"YulExpressionStatement","src":"1056:21:111"},{"nodeType":"YulVariableDeclaration","src":"1086:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1106:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1100:5:111"},"nodeType":"YulFunctionCall","src":"1100:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"1090:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1133:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1144:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1129:3:111"},"nodeType":"YulFunctionCall","src":"1129:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"1149:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1122:6:111"},"nodeType":"YulFunctionCall","src":"1122:34:111"},"nodeType":"YulExpressionStatement","src":"1122:34:111"},{"nodeType":"YulVariableDeclaration","src":"1165:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1174:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1169:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1234:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1263:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"1274:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1259:3:111"},"nodeType":"YulFunctionCall","src":"1259:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"1278:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1255:3:111"},"nodeType":"YulFunctionCall","src":"1255:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1297:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"1305:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1293:3:111"},"nodeType":"YulFunctionCall","src":"1293:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1309:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1289:3:111"},"nodeType":"YulFunctionCall","src":"1289:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1283:5:111"},"nodeType":"YulFunctionCall","src":"1283:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1248:6:111"},"nodeType":"YulFunctionCall","src":"1248:66:111"},"nodeType":"YulExpressionStatement","src":"1248:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1195:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1198:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1192:2:111"},"nodeType":"YulFunctionCall","src":"1192:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1206:19:111","statements":[{"nodeType":"YulAssignment","src":"1208:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1217:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1220:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1213:3:111"},"nodeType":"YulFunctionCall","src":"1213:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1208:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1188:3:111","statements":[]},"src":"1184:140:111"},{"body":{"nodeType":"YulBlock","src":"1358:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1387:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"1398:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1383:3:111"},"nodeType":"YulFunctionCall","src":"1383:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"1407:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1379:3:111"},"nodeType":"YulFunctionCall","src":"1379:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"1412:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1372:6:111"},"nodeType":"YulFunctionCall","src":"1372:42:111"},"nodeType":"YulExpressionStatement","src":"1372:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1339:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"1342:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1336:2:111"},"nodeType":"YulFunctionCall","src":"1336:13:111"},"nodeType":"YulIf","src":"1333:91:111"},{"nodeType":"YulAssignment","src":"1433:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1449:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1468:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1476:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1464:3:111"},"nodeType":"YulFunctionCall","src":"1464:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"1481:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1460:3:111"},"nodeType":"YulFunctionCall","src":"1460:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1445:3:111"},"nodeType":"YulFunctionCall","src":"1445:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"1551:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1441:3:111"},"nodeType":"YulFunctionCall","src":"1441:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1433:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"994:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1005:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1016:4:111","type":""}],"src":"906:654:111"},{"body":{"nodeType":"YulBlock","src":"1672:395:111","statements":[{"body":{"nodeType":"YulBlock","src":"1718:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1727:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1730:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1720:6:111"},"nodeType":"YulFunctionCall","src":"1720:12:111"},"nodeType":"YulExpressionStatement","src":"1720:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1693:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1702:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1689:3:111"},"nodeType":"YulFunctionCall","src":"1689:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1714:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1685:3:111"},"nodeType":"YulFunctionCall","src":"1685:32:111"},"nodeType":"YulIf","src":"1682:52:111"},{"nodeType":"YulVariableDeclaration","src":"1743:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1769:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1756:12:111"},"nodeType":"YulFunctionCall","src":"1756:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1747:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1865:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1874:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1877:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1867:6:111"},"nodeType":"YulFunctionCall","src":"1867:12:111"},"nodeType":"YulExpressionStatement","src":"1867:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1801:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1812:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1819:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1808:3:111"},"nodeType":"YulFunctionCall","src":"1808:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1798:2:111"},"nodeType":"YulFunctionCall","src":"1798:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1791:6:111"},"nodeType":"YulFunctionCall","src":"1791:73:111"},"nodeType":"YulIf","src":"1788:93:111"},{"nodeType":"YulAssignment","src":"1890:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1900:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1890:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1914:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1946:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1957:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1942:3:111"},"nodeType":"YulFunctionCall","src":"1942:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1929:12:111"},"nodeType":"YulFunctionCall","src":"1929:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1918:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2019:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2028:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2031:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2021:6:111"},"nodeType":"YulFunctionCall","src":"2021:12:111"},"nodeType":"YulExpressionStatement","src":"2021:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1983:7:111"},{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1996:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"2005:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1992:3:111"},"nodeType":"YulFunctionCall","src":"1992:24:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"1980:2:111"},"nodeType":"YulFunctionCall","src":"1980:37:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1973:6:111"},"nodeType":"YulFunctionCall","src":"1973:45:111"},"nodeType":"YulIf","src":"1970:65:111"},{"nodeType":"YulAssignment","src":"2044:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2054:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2044:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1630:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1641:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1653:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1661:6:111","type":""}],"src":"1565:502:111"},{"body":{"nodeType":"YulBlock","src":"2176:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"2222:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2231:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2234:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2224:6:111"},"nodeType":"YulFunctionCall","src":"2224:12:111"},"nodeType":"YulExpressionStatement","src":"2224:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2197:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2206:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2193:3:111"},"nodeType":"YulFunctionCall","src":"2193:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2218:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2189:3:111"},"nodeType":"YulFunctionCall","src":"2189:32:111"},"nodeType":"YulIf","src":"2186:52:111"},{"nodeType":"YulVariableDeclaration","src":"2247:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2274:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2261:12:111"},"nodeType":"YulFunctionCall","src":"2261:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2251:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2327:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2336:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2339:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2329:6:111"},"nodeType":"YulFunctionCall","src":"2329:12:111"},"nodeType":"YulExpressionStatement","src":"2329:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2299:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2307:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2296:2:111"},"nodeType":"YulFunctionCall","src":"2296:30:111"},"nodeType":"YulIf","src":"2293:50:111"},{"nodeType":"YulVariableDeclaration","src":"2352:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2366:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2377:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2362:3:111"},"nodeType":"YulFunctionCall","src":"2362:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2356:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2423:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2432:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2435:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2425:6:111"},"nodeType":"YulFunctionCall","src":"2425:12:111"},"nodeType":"YulExpressionStatement","src":"2425:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2404:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2413:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2400:3:111"},"nodeType":"YulFunctionCall","src":"2400:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"2418:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2396:3:111"},"nodeType":"YulFunctionCall","src":"2396:26:111"},"nodeType":"YulIf","src":"2393:46:111"},{"nodeType":"YulAssignment","src":"2448:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"2458:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2448:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2142:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2153:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2165:6:111","type":""}],"src":"2072:394:111"},{"body":{"nodeType":"YulBlock","src":"2646:787:111","statements":[{"body":{"nodeType":"YulBlock","src":"2692:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2701:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2704:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2694:6:111"},"nodeType":"YulFunctionCall","src":"2694:12:111"},"nodeType":"YulExpressionStatement","src":"2694:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2667:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2676:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2663:3:111"},"nodeType":"YulFunctionCall","src":"2663:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2688:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2659:3:111"},"nodeType":"YulFunctionCall","src":"2659:32:111"},"nodeType":"YulIf","src":"2656:52:111"},{"nodeType":"YulVariableDeclaration","src":"2717:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2744:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2731:12:111"},"nodeType":"YulFunctionCall","src":"2731:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2721:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2763:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2773:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2767:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2818:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2827:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2830:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2820:6:111"},"nodeType":"YulFunctionCall","src":"2820:12:111"},"nodeType":"YulExpressionStatement","src":"2820:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2806:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"2814:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2803:2:111"},"nodeType":"YulFunctionCall","src":"2803:14:111"},"nodeType":"YulIf","src":"2800:34:111"},{"nodeType":"YulVariableDeclaration","src":"2843:118:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2933:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"2944:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2929:3:111"},"nodeType":"YulFunctionCall","src":"2929:22:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"2953:7:111"}],"functionName":{"name":"abi_decode_array_struct_UserOperation_calldata_dyn_calldata","nodeType":"YulIdentifier","src":"2869:59:111"},"nodeType":"YulFunctionCall","src":"2869:92:111"},"variables":[{"name":"value0_1","nodeType":"YulTypedName","src":"2847:8:111","type":""},{"name":"value1_1","nodeType":"YulTypedName","src":"2857:8:111","type":""}]},{"nodeType":"YulAssignment","src":"2970:18:111","value":{"name":"value0_1","nodeType":"YulIdentifier","src":"2980:8:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2970:6:111"}]},{"nodeType":"YulAssignment","src":"2997:18:111","value":{"name":"value1_1","nodeType":"YulIdentifier","src":"3007:8:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2997:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3024:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3057:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3068:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3053:3:111"},"nodeType":"YulFunctionCall","src":"3053:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3040:12:111"},"nodeType":"YulFunctionCall","src":"3040:32:111"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"3028:8:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3101:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3110:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3113:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3103:6:111"},"nodeType":"YulFunctionCall","src":"3103:12:111"},"nodeType":"YulExpressionStatement","src":"3103:12:111"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"3087:8:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3097:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3084:2:111"},"nodeType":"YulFunctionCall","src":"3084:16:111"},"nodeType":"YulIf","src":"3081:36:111"},{"nodeType":"YulVariableDeclaration","src":"3126:34:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3140:9:111"},{"name":"offset_1","nodeType":"YulIdentifier","src":"3151:8:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3136:3:111"},"nodeType":"YulFunctionCall","src":"3136:24:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3130:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3208:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3217:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3220:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3210:6:111"},"nodeType":"YulFunctionCall","src":"3210:12:111"},"nodeType":"YulExpressionStatement","src":"3210:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3187:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3191:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3183:3:111"},"nodeType":"YulFunctionCall","src":"3183:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3198:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3179:3:111"},"nodeType":"YulFunctionCall","src":"3179:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3172:6:111"},"nodeType":"YulFunctionCall","src":"3172:35:111"},"nodeType":"YulIf","src":"3169:55:111"},{"nodeType":"YulVariableDeclaration","src":"3233:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3260:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3247:12:111"},"nodeType":"YulFunctionCall","src":"3247:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3237:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3292:6:111"},"nodeType":"YulFunctionCall","src":"3292:12:111"},"nodeType":"YulExpressionStatement","src":"3292:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3278:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3286:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3275:2:111"},"nodeType":"YulFunctionCall","src":"3275:14:111"},"nodeType":"YulIf","src":"3272:34:111"},{"body":{"nodeType":"YulBlock","src":"3356:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3365:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3368:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3358:6:111"},"nodeType":"YulFunctionCall","src":"3358:12:111"},"nodeType":"YulExpressionStatement","src":"3358:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3329:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"3333:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3325:3:111"},"nodeType":"YulFunctionCall","src":"3325:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3342:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3321:3:111"},"nodeType":"YulFunctionCall","src":"3321:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3347:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3318:2:111"},"nodeType":"YulFunctionCall","src":"3318:37:111"},"nodeType":"YulIf","src":"3315:57:111"},{"nodeType":"YulAssignment","src":"3381:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3395:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3399:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3391:3:111"},"nodeType":"YulFunctionCall","src":"3391:11:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3381:6:111"}]},{"nodeType":"YulAssignment","src":"3411:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"3421:6:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"3411:6:111"}]}]},"name":"abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2588:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2599:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2611:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2619:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2627:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2635:6:111","type":""}],"src":"2471:962:111"},{"body":{"nodeType":"YulBlock","src":"3470:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3487:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3490:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3480:6:111"},"nodeType":"YulFunctionCall","src":"3480:88:111"},"nodeType":"YulExpressionStatement","src":"3480:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3584:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3587:4:111","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3577:6:111"},"nodeType":"YulFunctionCall","src":"3577:15:111"},"nodeType":"YulExpressionStatement","src":"3577:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3608:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3611:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3601:6:111"},"nodeType":"YulFunctionCall","src":"3601:15:111"},"nodeType":"YulExpressionStatement","src":"3601:15:111"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"3438:184:111"},{"body":{"nodeType":"YulBlock","src":"3736:281:111","statements":[{"nodeType":"YulVariableDeclaration","src":"3746:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"3785:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3772:12:111"},"nodeType":"YulFunctionCall","src":"3772:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"3750:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3945:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3954:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3957:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3947:6:111"},"nodeType":"YulFunctionCall","src":"3947:12:111"},"nodeType":"YulExpressionStatement","src":"3947:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"3820:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"3848:12:111"},"nodeType":"YulFunctionCall","src":"3848:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"3864:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3844:3:111"},"nodeType":"YulFunctionCall","src":"3844:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"3875:66:111","type":"","value":"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3840:3:111"},"nodeType":"YulFunctionCall","src":"3840:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3816:3:111"},"nodeType":"YulFunctionCall","src":"3816:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3809:6:111"},"nodeType":"YulFunctionCall","src":"3809:135:111"},"nodeType":"YulIf","src":"3806:155:111"},{"nodeType":"YulAssignment","src":"3970:41:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"3982:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"3992:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3978:3:111"},"nodeType":"YulFunctionCall","src":"3978:33:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"3970:4:111"}]}]},"name":"access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"3701:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"3711:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"3727:4:111","type":""}],"src":"3627:390:111"},{"body":{"nodeType":"YulBlock","src":"4054:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4071:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4074:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4064:6:111"},"nodeType":"YulFunctionCall","src":"4064:88:111"},"nodeType":"YulExpressionStatement","src":"4064:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4168:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"4171:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4161:6:111"},"nodeType":"YulFunctionCall","src":"4161:15:111"},"nodeType":"YulExpressionStatement","src":"4161:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4192:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4195:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4185:6:111"},"nodeType":"YulFunctionCall","src":"4185:15:111"},"nodeType":"YulExpressionStatement","src":"4185:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"4022:184:111"},{"body":{"nodeType":"YulBlock","src":"4259:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"4286:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"4288:16:111"},"nodeType":"YulFunctionCall","src":"4288:18:111"},"nodeType":"YulExpressionStatement","src":"4288:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"4275:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"4282:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"4278:3:111"},"nodeType":"YulFunctionCall","src":"4278:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4272:2:111"},"nodeType":"YulFunctionCall","src":"4272:13:111"},"nodeType":"YulIf","src":"4269:39:111"},{"nodeType":"YulAssignment","src":"4317:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"4328:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"4331:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4324:3:111"},"nodeType":"YulFunctionCall","src":"4324:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"4317:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"4242:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"4245:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"4251:3:111","type":""}],"src":"4211:128:111"},{"body":{"nodeType":"YulBlock","src":"4391:148:111","statements":[{"body":{"nodeType":"YulBlock","src":"4482:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"4484:16:111"},"nodeType":"YulFunctionCall","src":"4484:18:111"},"nodeType":"YulExpressionStatement","src":"4484:18:111"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4407:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4414:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"4404:2:111"},"nodeType":"YulFunctionCall","src":"4404:77:111"},"nodeType":"YulIf","src":"4401:103:111"},{"nodeType":"YulAssignment","src":"4513:20:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4524:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4531:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4520:3:111"},"nodeType":"YulFunctionCall","src":"4520:13:111"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"4513:3:111"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"4373:5:111","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"4383:3:111","type":""}],"src":"4344:195:111"},{"body":{"nodeType":"YulBlock","src":"4645:76:111","statements":[{"nodeType":"YulAssignment","src":"4655:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4667:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4678:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4663:3:111"},"nodeType":"YulFunctionCall","src":"4663:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4655:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4697:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"4708:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4690:6:111"},"nodeType":"YulFunctionCall","src":"4690:25:111"},"nodeType":"YulExpressionStatement","src":"4690:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4614:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4625:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4636:4:111","type":""}],"src":"4544:177:111"},{"body":{"nodeType":"YulBlock","src":"4825:93:111","statements":[{"nodeType":"YulAssignment","src":"4835:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4858:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4843:3:111"},"nodeType":"YulFunctionCall","src":"4843:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4835:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4877:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4892:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4900:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4888:3:111"},"nodeType":"YulFunctionCall","src":"4888:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4870:6:111"},"nodeType":"YulFunctionCall","src":"4870:42:111"},"nodeType":"YulExpressionStatement","src":"4870:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4794:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4805:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4816:4:111","type":""}],"src":"4726:192:111"},{"body":{"nodeType":"YulBlock","src":"5097:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5114:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5125:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5107:6:111"},"nodeType":"YulFunctionCall","src":"5107:21:111"},"nodeType":"YulExpressionStatement","src":"5107:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5148:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5159:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5144:3:111"},"nodeType":"YulFunctionCall","src":"5144:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5164:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5137:6:111"},"nodeType":"YulFunctionCall","src":"5137:30:111"},"nodeType":"YulExpressionStatement","src":"5137:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5187:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5198:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5183:3:111"},"nodeType":"YulFunctionCall","src":"5183:18:111"},{"hexValue":"546573745369676e617475726556616c696461746f723a20736967206d757374","kind":"string","nodeType":"YulLiteral","src":"5203:34:111","type":"","value":"TestSignatureValidator: sig must"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5176:6:111"},"nodeType":"YulFunctionCall","src":"5176:62:111"},"nodeType":"YulExpressionStatement","src":"5176:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5258:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5269:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5254:3:111"},"nodeType":"YulFunctionCall","src":"5254:18:111"},{"hexValue":"2062652075696e74","kind":"string","nodeType":"YulLiteral","src":"5274:10:111","type":"","value":" be uint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5247:6:111"},"nodeType":"YulFunctionCall","src":"5247:38:111"},"nodeType":"YulExpressionStatement","src":"5247:38:111"},{"nodeType":"YulAssignment","src":"5294:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5306:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5317:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5302:3:111"},"nodeType":"YulFunctionCall","src":"5302:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5294:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_99d9e6a25b1da7bdaea8c6d854d5639998d740d025b4bc7ada8394264a61b31c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5074:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5088:4:111","type":""}],"src":"4923:404:111"},{"body":{"nodeType":"YulBlock","src":"5402:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"5448:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5457:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5460:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5450:6:111"},"nodeType":"YulFunctionCall","src":"5450:12:111"},"nodeType":"YulExpressionStatement","src":"5450:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5423:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5432:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5419:3:111"},"nodeType":"YulFunctionCall","src":"5419:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5444:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5415:3:111"},"nodeType":"YulFunctionCall","src":"5415:32:111"},"nodeType":"YulIf","src":"5412:52:111"},{"nodeType":"YulAssignment","src":"5473:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5496:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5483:12:111"},"nodeType":"YulFunctionCall","src":"5483:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5473:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5368:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5379:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5391:6:111","type":""}],"src":"5332:180:111"},{"body":{"nodeType":"YulBlock","src":"5691:295:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5708:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5719:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5701:6:111"},"nodeType":"YulFunctionCall","src":"5701:21:111"},"nodeType":"YulExpressionStatement","src":"5701:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5742:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5753:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5738:3:111"},"nodeType":"YulFunctionCall","src":"5738:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5758:2:111","type":"","value":"65"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5731:6:111"},"nodeType":"YulFunctionCall","src":"5731:30:111"},"nodeType":"YulExpressionStatement","src":"5731:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5781:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5792:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5777:3:111"},"nodeType":"YulFunctionCall","src":"5777:18:111"},{"hexValue":"546573745369676e617475726556616c696461746f723a206167677265676174","kind":"string","nodeType":"YulLiteral","src":"5797:34:111","type":"","value":"TestSignatureValidator: aggregat"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5770:6:111"},"nodeType":"YulFunctionCall","src":"5770:62:111"},"nodeType":"YulExpressionStatement","src":"5770:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5852:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5863:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5848:3:111"},"nodeType":"YulFunctionCall","src":"5848:18:111"},{"hexValue":"6564207369676e6174757265206d69736d6174636820286e6f6e63652073756d","kind":"string","nodeType":"YulLiteral","src":"5868:34:111","type":"","value":"ed signature mismatch (nonce sum"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5841:6:111"},"nodeType":"YulFunctionCall","src":"5841:62:111"},"nodeType":"YulExpressionStatement","src":"5841:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5923:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5934:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5919:3:111"},"nodeType":"YulFunctionCall","src":"5919:19:111"},{"hexValue":"29","kind":"string","nodeType":"YulLiteral","src":"5940:3:111","type":"","value":")"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5912:6:111"},"nodeType":"YulFunctionCall","src":"5912:32:111"},"nodeType":"YulExpressionStatement","src":"5912:32:111"},{"nodeType":"YulAssignment","src":"5953:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5965:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5976:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5961:3:111"},"nodeType":"YulFunctionCall","src":"5961:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5953:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8d9d685720b347b5074ab5a98aba04c9189b0f93128711db984ab9c1d90c4824__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5668:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5682:4:111","type":""}],"src":"5517:469:111"}]},"contents":"{\n { }\n function abi_decode_array_struct_UserOperation_calldata_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_uint32(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n if iszero(eq(value_1, and(value_1, 0xffffffff))) { revert(0, 0) }\n value1 := value_1\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n }\n function abi_decode_tuple_t_array$_t_struct$_UserOperation_$10993_calldata_ptr_$dyn_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_UserOperation_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let _2 := add(headStart, offset_1)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value2 := add(_2, 32)\n value3 := length\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_struct$_UserOperation_$10993_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_stringliteral_99d9e6a25b1da7bdaea8c6d854d5639998d740d025b4bc7ada8394264a61b31c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"TestSignatureValidator: sig must\")\n mstore(add(headStart, 96), \" be uint\")\n tail := add(headStart, 128)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_8d9d685720b347b5074ab5a98aba04c9189b0f93128711db984ab9c1d90c4824__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 65)\n mstore(add(headStart, 64), \"TestSignatureValidator: aggregat\")\n mstore(add(headStart, 96), \"ed signature mismatch (nonce sum\")\n mstore(add(headStart, 128), \")\")\n tail := add(headStart, 160)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"60806040526004361061003f5760003560e01c8063275e2d7914610044578063451711591461007a57806364c530cd1461008f578063e3563a4f146100bd575b600080fd5b34801561005057600080fd5b5061006461005f3660046103e8565b6100dd565b604051610071919061042a565b60405180910390f35b61008d61008836600461049d565b610156565b005b34801561009b57600080fd5b506100646100aa3660046104f8565b5060408051602081019091526000815290565b3480156100c957600080fd5b5061008d6100d836600461053b565b6101e1565b60606000805b83811015610131578484828181106100fd576100fd6105d2565b905060200281019061010f9190610601565b61011d90602001358361066e565b91508061012981610686565b9150506100e3565b5060408051602081018390520160405160208183030381529060405291505092915050565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015273ffffffffffffffffffffffffffffffffffffffff831690630396cb609034906024016000604051808303818588803b1580156101c457600080fd5b505af11580156101d8573d6000803e3d6000fd5b50505050505050565b6000805b84811015610239576000868683818110610201576102016105d2565b90506020028101906102139190610601565b602001359050610223818461066e565b925050808061023190610686565b9150506101e5565b50602082146102cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f546573745369676e617475726556616c696461746f723a20736967206d75737460448201527f2062652075696e7400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60006102dd838501856106be565b9050818114610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f546573745369676e617475726556616c696461746f723a20616767726567617460448201527f6564207369676e6174757265206d69736d6174636820286e6f6e63652073756d60648201527f2900000000000000000000000000000000000000000000000000000000000000608482015260a4016102c6565b505050505050565b60008083601f8401126103ae57600080fd5b50813567ffffffffffffffff8111156103c657600080fd5b6020830191508360208260051b85010111156103e157600080fd5b9250929050565b600080602083850312156103fb57600080fd5b823567ffffffffffffffff81111561041257600080fd5b61041e8582860161039c565b90969095509350505050565b600060208083528351808285015260005b818110156104575785810183015185820160400152820161043b565b81811115610469576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600080604083850312156104b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146104d457600080fd5b9150602083013563ffffffff811681146104ed57600080fd5b809150509250929050565b60006020828403121561050a57600080fd5b813567ffffffffffffffff81111561052157600080fd5b8201610160818503121561053457600080fd5b9392505050565b6000806000806040858703121561055157600080fd5b843567ffffffffffffffff8082111561056957600080fd5b6105758883890161039c565b9096509450602087013591508082111561058e57600080fd5b818701915087601f8301126105a257600080fd5b8135818111156105b157600080fd5b8860208285010111156105c357600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea183360301811261063557600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156106815761068161063f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b7576106b761063f565b5060010190565b6000602082840312156106d057600080fd5b503591905056fea2646970667358221220ec237f70ef123b3a91c597364254b5dcb5d25d452d43014789be2b2f6578cd9764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x275E2D79 EQ PUSH2 0x44 JUMPI DUP1 PUSH4 0x45171159 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x64C530CD EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xE3563A4F EQ PUSH2 0xBD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E8 JUMP JUMPDEST PUSH2 0xDD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x42A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0x49D JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0xAA CALLDATASIZE PUSH1 0x4 PUSH2 0x4F8 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH2 0xD8 CALLDATASIZE PUSH1 0x4 PUSH2 0x53B JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x131 JUMPI DUP5 DUP5 DUP3 DUP2 DUP2 LT PUSH2 0xFD JUMPI PUSH2 0xFD PUSH2 0x5D2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x10F SWAP2 SWAP1 PUSH2 0x601 JUMP JUMPDEST PUSH2 0x11D SWAP1 PUSH1 0x20 ADD CALLDATALOAD DUP4 PUSH2 0x66E JUMP JUMPDEST SWAP2 POP DUP1 PUSH2 0x129 DUP2 PUSH2 0x686 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xE3 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x239 JUMPI PUSH1 0x0 DUP7 DUP7 DUP4 DUP2 DUP2 LT PUSH2 0x201 JUMPI PUSH2 0x201 PUSH2 0x5D2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x601 JUMP JUMPDEST PUSH1 0x20 ADD CALLDATALOAD SWAP1 POP PUSH2 0x223 DUP2 DUP5 PUSH2 0x66E JUMP JUMPDEST SWAP3 POP POP DUP1 DUP1 PUSH2 0x231 SWAP1 PUSH2 0x686 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 EQ PUSH2 0x2CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546573745369676E617475726556616C696461746F723A20736967206D757374 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2062652075696E74000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2DD DUP4 DUP6 ADD DUP6 PUSH2 0x6BE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 EQ PUSH2 0x394 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x41 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546573745369676E617475726556616C696461746F723A206167677265676174 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6564207369676E6174757265206D69736D6174636820286E6F6E63652073756D PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0xA4 ADD PUSH2 0x2C6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41E DUP6 DUP3 DUP7 ADD PUSH2 0x39C JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x457 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x43B JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x551 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x569 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x575 DUP9 DUP4 DUP10 ADD PUSH2 0x39C JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x5B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x681 JUMPI PUSH2 0x681 PUSH2 0x63F JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x6B7 JUMPI PUSH2 0x6B7 PUSH2 0x63F JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEC 0x23 PUSH32 0x70EF123B3A91C597364254B5DCB5D25D452D43014789BE2B2F6578CD9764736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"318:1521:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1158:280;;;;;;;;;;-1:-1:-1;1158:280:101;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1703:134;;;;;;:::i;:::-;;:::i;:::-;;949:124;;;;;;;;;;-1:-1:-1;949:124:101;;;;;:::i;:::-;-1:-1:-1;1057:9:101;;;;;;;;;-1:-1:-1;1057:9:101;;;949:124;405:506;;;;;;;;;;-1:-1:-1;405:506:101;;;;;:::i;:::-;;:::i;1158:280::-;1244:32;1288:8;1315:6;1310:90;1327:18;;;1310:90;;;1373:7;;1381:1;1373:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1366:23;;1373:16;;;1366:23;;:::i;:::-;;-1:-1:-1;1347:3:101;;;;:::i;:::-;;;;1310:90;;;-1:-1:-1;1416:15:101;;;;;;4690:25:111;;;4663:18;1416:15:101;;;;;;;;;;;;1409:22;;;1158:280;;;;:::o;1703:134::-;1786:44;;;;;4900:10:111;4888:23;;1786:44:101;;;4870:42:111;1786:19:101;;;;;;1813:9;;4843:18:111;;1786:44:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1703:134;;:::o;405:506::-;526:8;553:6;548:122;565:18;;;548:122;;;604:10;617:7;;625:1;617:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;;;-1:-1:-1;647:12:101;617:16;647:12;;:::i;:::-;;;590:80;585:3;;;;;:::i;:::-;;;;548:122;;;-1:-1:-1;707:2:101;687:22;;679:75;;;;;;;5125:2:111;679:75:101;;;5107:21:111;5164:2;5144:18;;;5137:30;5203:34;5183:18;;;5176:62;5274:10;5254:18;;;5247:38;5302:19;;679:75:101;;;;;;;;;765:8;777:29;;;;788:9;777:29;:::i;:::-;764:42;;831:3;824;:10;816:88;;;;;;;5719:2:111;816:88:101;;;5701:21:111;5758:2;5738:18;;;5731:30;5797:34;5777:18;;;5770:62;5868:34;5848:18;;;5841:62;5940:3;5919:19;;;5912:32;5961:19;;816:88:101;5517:469:111;816:88:101;516:395;;405:506;;;;:::o;14:389:111:-;99:8;109:6;163:3;156:4;148:6;144:17;140:27;130:55;;181:1;178;171:12;130:55;-1:-1:-1;204:20:111;;247:18;236:30;;233:50;;;279:1;276;269:12;233:50;316:4;308:6;304:17;292:29;;376:3;369:4;359:6;356:1;352:14;344:6;340:27;336:38;333:47;330:67;;;393:1;390;383:12;330:67;14:389;;;;;:::o;408:493::-;528:6;536;589:2;577:9;568:7;564:23;560:32;557:52;;;605:1;602;595:12;557:52;645:9;632:23;678:18;670:6;667:30;664:50;;;710:1;707;700:12;664:50;749:92;833:7;824:6;813:9;809:22;749:92;:::i;:::-;860:8;;723:118;;-1:-1:-1;408:493:111;-1:-1:-1;;;;408:493:111:o;906:654::-;1016:4;1045:2;1074;1063:9;1056:21;1106:6;1100:13;1149:6;1144:2;1133:9;1129:18;1122:34;1174:1;1184:140;1198:6;1195:1;1192:13;1184:140;;;1293:14;;;1289:23;;1283:30;1259:17;;;1278:2;1255:26;1248:66;1213:10;;1184:140;;;1342:6;1339:1;1336:13;1333:91;;;1412:1;1407:2;1398:6;1387:9;1383:22;1379:31;1372:42;1333:91;-1:-1:-1;1476:2:111;1464:15;1481:66;1460:88;1445:104;;;;1551:2;1441:113;;906:654;-1:-1:-1;;;906:654:111:o;1565:502::-;1653:6;1661;1714:2;1702:9;1693:7;1689:23;1685:32;1682:52;;;1730:1;1727;1720:12;1682:52;1769:9;1756:23;1819:42;1812:5;1808:54;1801:5;1798:65;1788:93;;1877:1;1874;1867:12;1788:93;1900:5;-1:-1:-1;1957:2:111;1942:18;;1929:32;2005:10;1992:24;;1980:37;;1970:65;;2031:1;2028;2021:12;1970:65;2054:7;2044:17;;;1565:502;;;;;:::o;2072:394::-;2165:6;2218:2;2206:9;2197:7;2193:23;2189:32;2186:52;;;2234:1;2231;2224:12;2186:52;2274:9;2261:23;2307:18;2299:6;2296:30;2293:50;;;2339:1;2336;2329:12;2293:50;2362:22;;2418:3;2400:16;;;2396:26;2393:46;;;2435:1;2432;2425:12;2393:46;2458:2;2072:394;-1:-1:-1;;;2072:394:111:o;2471:962::-;2611:6;2619;2627;2635;2688:2;2676:9;2667:7;2663:23;2659:32;2656:52;;;2704:1;2701;2694:12;2656:52;2744:9;2731:23;2773:18;2814:2;2806:6;2803:14;2800:34;;;2830:1;2827;2820:12;2800:34;2869:92;2953:7;2944:6;2933:9;2929:22;2869:92;:::i;:::-;2980:8;;-1:-1:-1;2843:118:111;-1:-1:-1;3068:2:111;3053:18;;3040:32;;-1:-1:-1;3084:16:111;;;3081:36;;;3113:1;3110;3103:12;3081:36;3151:8;3140:9;3136:24;3126:34;;3198:7;3191:4;3187:2;3183:13;3179:27;3169:55;;3220:1;3217;3210:12;3169:55;3260:2;3247:16;3286:2;3278:6;3275:14;3272:34;;;3302:1;3299;3292:12;3272:34;3347:7;3342:2;3333:6;3329:2;3325:15;3321:24;3318:37;3315:57;;;3368:1;3365;3358:12;3315:57;2471:962;;;;-1:-1:-1;;3399:2:111;3391:11;;-1:-1:-1;;;2471:962:111:o;3438:184::-;3490:77;3487:1;3480:88;3587:4;3584:1;3577:15;3611:4;3608:1;3601:15;3627:390;3727:4;3785:11;3772:25;3875:66;3864:8;3848:14;3844:29;3840:102;3820:18;3816:127;3806:155;;3957:1;3954;3947:12;3806:155;3978:33;;;;;3627:390;-1:-1:-1;;3627:390:111:o;4022:184::-;4074:77;4071:1;4064:88;4171:4;4168:1;4161:15;4195:4;4192:1;4185:15;4211:128;4251:3;4282:1;4278:6;4275:1;4272:13;4269:39;;;4288:18;;:::i;:::-;-1:-1:-1;4324:9:111;;4211:128::o;4344:195::-;4383:3;4414:66;4407:5;4404:77;4401:103;;4484:18;;:::i;:::-;-1:-1:-1;4531:1:111;4520:13;;4344:195::o;5332:180::-;5391:6;5444:2;5432:9;5423:7;5419:23;5415:32;5412:52;;;5460:1;5457;5450:12;5412:52;-1:-1:-1;5483:23:111;;5332:180;-1:-1:-1;5332:180:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"361000","executionCost":"399","totalCost":"361399"},"external":{"addStake(address,uint32)":"infinite","aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"infinite","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"infinite","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"543"}},"methodIdentifiers":{"addStake(address,uint32)":"45171159","aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(address,uint32)\":{\"params\":{\"delay\":\"- the new lock duration before the deposit can be withdrawn.\",\"entryPoint\":\"- the EntryPoint to send the stake to.\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"_0\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addStake(address,uint32)\":{\"notice\":\"Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call.\"},\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"dummy test aggregator: sum all nonce values of UserOps.\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\"}},\"notice\":\"test signature aggregator. the aggregated signature is the SUM of the nonce fields..\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestSignatureAggregator.sol\":\"TestSignatureAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"},\"contracts/test/TestSignatureAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"../interfaces/IAggregator.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../samples/SimpleAccount.sol\\\";\\n\\n/**\\n * test signature aggregator.\\n * the aggregated signature is the SUM of the nonce fields..\\n */\\ncontract TestSignatureAggregator is IAggregator {\\n\\n /// @inheritdoc IAggregator\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external pure override {\\n uint sum = 0;\\n for (uint i = 0; i < userOps.length; i++) {\\n uint nonce = userOps[i].nonce;\\n sum += nonce;\\n }\\n require(signature.length == 32, \\\"TestSignatureValidator: sig must be uint\\\");\\n (uint sig) = abi.decode(signature, (uint));\\n require(sig == sum, \\\"TestSignatureValidator: aggregated signature mismatch (nonce sum)\\\");\\n }\\n\\n /// @inheritdoc IAggregator\\n function validateUserOpSignature(UserOperation calldata)\\n external pure returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * dummy test aggregator: sum all nonce values of UserOps.\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\\n uint sum = 0;\\n for (uint i = 0; i < userOps.length; i++) {\\n sum += userOps[i].nonce;\\n }\\n return abi.encode(sum);\\n }\\n\\n /**\\n * Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call.\\n * @param entryPoint - the EntryPoint to send the stake to.\\n * @param delay - the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\\n entryPoint.addStake{value: msg.value}(delay);\\n }\\n}\\n\",\"keccak256\":\"0x3462c6948a18846e100bf256da2a41bc37c8cd77950798e5e395c13e0c41d7ba\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"addStake(address,uint32)":{"notice":"Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call."},"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"notice":"dummy test aggregator: sum all nonce values of UserOps."},"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":{"notice":"validate aggregated signature. revert if the aggregated signature does not match the given list of operations."},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps."}},"notice":"test signature aggregator. the aggregated signature is the SUM of the nonce fields..","version":1}}},"contracts/test/TestToken.sol":{"TestToken":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalsOverride","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"setDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_20175":{"entryPoint":null,"id":20175,"parameterSlots":0,"returnSlots":0},"@_3799":{"entryPoint":null,"id":3799,"parameterSlots":2,"returnSlots":0},"array_dataslot_string_storage":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"clean_up_bytearray_end_slots_string_storage":{"entryPoint":216,"id":null,"parameterSlots":3,"returnSlots":0},"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage":{"entryPoint":299,"id":null,"parameterSlots":2,"returnSlots":0},"extract_byte_array_length":{"entryPoint":156,"id":null,"parameterSlots":1,"returnSlots":1},"extract_used_part_and_set_length_of_short_byte_array":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":134,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2732:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:95:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"70:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"75:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"66:3:111"},"nodeType":"YulFunctionCall","src":"66:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:111"},"nodeType":"YulFunctionCall","src":"56:31:111"},"nodeType":"YulExpressionStatement","src":"56:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"103:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"106:4:111","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"96:6:111"},"nodeType":"YulFunctionCall","src":"96:15:111"},"nodeType":"YulExpressionStatement","src":"96:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"127:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"130:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"120:6:111"},"nodeType":"YulFunctionCall","src":"120:15:111"},"nodeType":"YulExpressionStatement","src":"120:15:111"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:127:111"},{"body":{"nodeType":"YulBlock","src":"201:325:111","statements":[{"nodeType":"YulAssignment","src":"211:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"225:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"228:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"221:3:111"},"nodeType":"YulFunctionCall","src":"221:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"211:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"242:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"272:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"278:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"268:3:111"},"nodeType":"YulFunctionCall","src":"268:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"246:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"319:31:111","statements":[{"nodeType":"YulAssignment","src":"321:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"335:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"343:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"331:3:111"},"nodeType":"YulFunctionCall","src":"331:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"321:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"299:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"292:6:111"},"nodeType":"YulFunctionCall","src":"292:26:111"},"nodeType":"YulIf","src":"289:61:111"},{"body":{"nodeType":"YulBlock","src":"409:111:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"430:1:111","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"437:3:111","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"442:10:111","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"433:3:111"},"nodeType":"YulFunctionCall","src":"433:20:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"423:6:111"},"nodeType":"YulFunctionCall","src":"423:31:111"},"nodeType":"YulExpressionStatement","src":"423:31:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"474:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"477:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"467:6:111"},"nodeType":"YulFunctionCall","src":"467:15:111"},"nodeType":"YulExpressionStatement","src":"467:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"502:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"505:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"495:6:111"},"nodeType":"YulFunctionCall","src":"495:15:111"},"nodeType":"YulExpressionStatement","src":"495:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"365:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"388:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"396:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"385:2:111"},"nodeType":"YulFunctionCall","src":"385:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"362:2:111"},"nodeType":"YulFunctionCall","src":"362:38:111"},"nodeType":"YulIf","src":"359:161:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"181:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"190:6:111","type":""}],"src":"146:380:111"},{"body":{"nodeType":"YulBlock","src":"587:65:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"604:1:111","type":"","value":"0"},{"name":"ptr","nodeType":"YulIdentifier","src":"607:3:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"597:6:111"},"nodeType":"YulFunctionCall","src":"597:14:111"},"nodeType":"YulExpressionStatement","src":"597:14:111"},{"nodeType":"YulAssignment","src":"620:26:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"638:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"641:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"628:9:111"},"nodeType":"YulFunctionCall","src":"628:18:111"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"620:4:111"}]}]},"name":"array_dataslot_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"ptr","nodeType":"YulTypedName","src":"570:3:111","type":""}],"returnVariables":[{"name":"data","nodeType":"YulTypedName","src":"578:4:111","type":""}],"src":"531:121:111"},{"body":{"nodeType":"YulBlock","src":"738:464:111","statements":[{"body":{"nodeType":"YulBlock","src":"771:425:111","statements":[{"nodeType":"YulVariableDeclaration","src":"785:11:111","value":{"kind":"number","nodeType":"YulLiteral","src":"795:1:111","type":"","value":"0"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"789:2:111","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"816:2:111"},{"name":"array","nodeType":"YulIdentifier","src":"820:5:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"809:6:111"},"nodeType":"YulFunctionCall","src":"809:17:111"},"nodeType":"YulExpressionStatement","src":"809:17:111"},{"nodeType":"YulVariableDeclaration","src":"839:31:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"861:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"865:4:111","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"851:9:111"},"nodeType":"YulFunctionCall","src":"851:19:111"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"843:4:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"883:57:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"906:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"916:1:111","type":"","value":"5"},{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"923:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"935:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"919:3:111"},"nodeType":"YulFunctionCall","src":"919:19:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"912:3:111"},"nodeType":"YulFunctionCall","src":"912:27:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"902:3:111"},"nodeType":"YulFunctionCall","src":"902:38:111"},"variables":[{"name":"deleteStart","nodeType":"YulTypedName","src":"887:11:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"977:23:111","statements":[{"nodeType":"YulAssignment","src":"979:19:111","value":{"name":"data","nodeType":"YulIdentifier","src":"994:4:111"},"variableNames":[{"name":"deleteStart","nodeType":"YulIdentifier","src":"979:11:111"}]}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"959:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"971:4:111","type":"","value":"0x20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"956:2:111"},"nodeType":"YulFunctionCall","src":"956:20:111"},"nodeType":"YulIf","src":"953:47:111"},{"nodeType":"YulVariableDeclaration","src":"1013:41:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1027:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1037:1:111","type":"","value":"5"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1044:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"1049:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1040:3:111"},"nodeType":"YulFunctionCall","src":"1040:12:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1033:3:111"},"nodeType":"YulFunctionCall","src":"1033:20:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1023:3:111"},"nodeType":"YulFunctionCall","src":"1023:31:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1017:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1067:24:111","value":{"name":"deleteStart","nodeType":"YulIdentifier","src":"1080:11:111"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"1071:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1165:21:111","statements":[{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1174:5:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1181:2:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"1167:6:111"},"nodeType":"YulFunctionCall","src":"1167:17:111"},"nodeType":"YulExpressionStatement","src":"1167:17:111"}]},"condition":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1115:5:111"},{"name":"_2","nodeType":"YulIdentifier","src":"1122:2:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1112:2:111"},"nodeType":"YulFunctionCall","src":"1112:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1126:26:111","statements":[{"nodeType":"YulAssignment","src":"1128:22:111","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1141:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"1148:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1137:3:111"},"nodeType":"YulFunctionCall","src":"1137:13:111"},"variableNames":[{"name":"start","nodeType":"YulIdentifier","src":"1128:5:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1108:3:111","statements":[]},"src":"1104:82:111"}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"754:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"759:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"751:2:111"},"nodeType":"YulFunctionCall","src":"751:11:111"},"nodeType":"YulIf","src":"748:448:111"}]},"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"710:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"717:3:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"722:10:111","type":""}],"src":"657:545:111"},{"body":{"nodeType":"YulBlock","src":"1292:81:111","statements":[{"nodeType":"YulAssignment","src":"1302:65:111","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1317:4:111"},{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1335:1:111","type":"","value":"3"},{"name":"len","nodeType":"YulIdentifier","src":"1338:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1331:3:111"},"nodeType":"YulFunctionCall","src":"1331:11:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1348:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1344:3:111"},"nodeType":"YulFunctionCall","src":"1344:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1327:3:111"},"nodeType":"YulFunctionCall","src":"1327:24:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1323:3:111"},"nodeType":"YulFunctionCall","src":"1323:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1313:3:111"},"nodeType":"YulFunctionCall","src":"1313:40:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1359:1:111","type":"","value":"1"},{"name":"len","nodeType":"YulIdentifier","src":"1362:3:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1355:3:111"},"nodeType":"YulFunctionCall","src":"1355:11:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1310:2:111"},"nodeType":"YulFunctionCall","src":"1310:57:111"},"variableNames":[{"name":"used","nodeType":"YulIdentifier","src":"1302:4:111"}]}]},"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"1269:4:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"1275:3:111","type":""}],"returnVariables":[{"name":"used","nodeType":"YulTypedName","src":"1283:4:111","type":""}],"src":"1207:166:111"},{"body":{"nodeType":"YulBlock","src":"1474:1256:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1484:24:111","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1504:3:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1498:5:111"},"nodeType":"YulFunctionCall","src":"1498:10:111"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"1488:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1551:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1553:16:111"},"nodeType":"YulFunctionCall","src":"1553:18:111"},"nodeType":"YulExpressionStatement","src":"1553:18:111"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1523:6:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1539:2:111","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"1543:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1535:3:111"},"nodeType":"YulFunctionCall","src":"1535:10:111"},{"kind":"number","nodeType":"YulLiteral","src":"1547:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1531:3:111"},"nodeType":"YulFunctionCall","src":"1531:18:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1520:2:111"},"nodeType":"YulFunctionCall","src":"1520:30:111"},"nodeType":"YulIf","src":"1517:56:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1626:4:111"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1664:4:111"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1658:5:111"},"nodeType":"YulFunctionCall","src":"1658:11:111"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"1632:25:111"},"nodeType":"YulFunctionCall","src":"1632:38:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"1672:6:111"}],"functionName":{"name":"clean_up_bytearray_end_slots_string_storage","nodeType":"YulIdentifier","src":"1582:43:111"},"nodeType":"YulFunctionCall","src":"1582:97:111"},"nodeType":"YulExpressionStatement","src":"1582:97:111"},{"nodeType":"YulVariableDeclaration","src":"1688:18:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1705:1:111","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"1692:9:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1715:23:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1734:4:111","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"1719:11:111","type":""}]},{"nodeType":"YulAssignment","src":"1747:24:111","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"1760:11:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"1747:9:111"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"1817:656:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1831:35:111","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1850:6:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1862:2:111","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1858:3:111"},"nodeType":"YulFunctionCall","src":"1858:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1846:3:111"},"nodeType":"YulFunctionCall","src":"1846:20:111"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"1835:7:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1879:49:111","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1923:4:111"}],"functionName":{"name":"array_dataslot_string_storage","nodeType":"YulIdentifier","src":"1893:29:111"},"nodeType":"YulFunctionCall","src":"1893:35:111"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"1883:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1941:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1950:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1945:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2028:172:111","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2053:6:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2071:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2076:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2067:3:111"},"nodeType":"YulFunctionCall","src":"2067:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2061:5:111"},"nodeType":"YulFunctionCall","src":"2061:26:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2046:6:111"},"nodeType":"YulFunctionCall","src":"2046:42:111"},"nodeType":"YulExpressionStatement","src":"2046:42:111"},{"nodeType":"YulAssignment","src":"2105:24:111","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2119:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2127:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2115:3:111"},"nodeType":"YulFunctionCall","src":"2115:14:111"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2105:6:111"}]},{"nodeType":"YulAssignment","src":"2146:40:111","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2163:9:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"2174:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2159:3:111"},"nodeType":"YulFunctionCall","src":"2159:27:111"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2146:9:111"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1975:1:111"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"1978:7:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1972:2:111"},"nodeType":"YulFunctionCall","src":"1972:14:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1987:28:111","statements":[{"nodeType":"YulAssignment","src":"1989:24:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1998:1:111"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"2001:11:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1994:3:111"},"nodeType":"YulFunctionCall","src":"1994:19:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1989:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"1968:3:111","statements":[]},"src":"1964:236:111"},{"body":{"nodeType":"YulBlock","src":"2248:166:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2266:43:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2293:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2298:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2289:3:111"},"nodeType":"YulFunctionCall","src":"2289:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2283:5:111"},"nodeType":"YulFunctionCall","src":"2283:26:111"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"2270:9:111","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2333:6:111"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"2345:9:111"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2372:1:111","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"2375:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2368:3:111"},"nodeType":"YulFunctionCall","src":"2368:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"2384:3:111","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2364:3:111"},"nodeType":"YulFunctionCall","src":"2364:24:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2394:1:111","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2390:3:111"},"nodeType":"YulFunctionCall","src":"2390:6:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2360:3:111"},"nodeType":"YulFunctionCall","src":"2360:37:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2356:3:111"},"nodeType":"YulFunctionCall","src":"2356:42:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2341:3:111"},"nodeType":"YulFunctionCall","src":"2341:58:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2326:6:111"},"nodeType":"YulFunctionCall","src":"2326:74:111"},"nodeType":"YulExpressionStatement","src":"2326:74:111"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"2219:7:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"2228:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2216:2:111"},"nodeType":"YulFunctionCall","src":"2216:19:111"},"nodeType":"YulIf","src":"2213:201:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2434:4:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2448:1:111","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"2451:6:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2444:3:111"},"nodeType":"YulFunctionCall","src":"2444:14:111"},{"kind":"number","nodeType":"YulLiteral","src":"2460:1:111","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2440:3:111"},"nodeType":"YulFunctionCall","src":"2440:22:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2427:6:111"},"nodeType":"YulFunctionCall","src":"2427:36:111"},"nodeType":"YulExpressionStatement","src":"2427:36:111"}]},"nodeType":"YulCase","src":"1810:663:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1815:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"2490:234:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2504:14:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2517:1:111","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2508:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2553:67:111","statements":[{"nodeType":"YulAssignment","src":"2571:35:111","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2590:3:111"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2595:9:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2586:3:111"},"nodeType":"YulFunctionCall","src":"2586:19:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2580:5:111"},"nodeType":"YulFunctionCall","src":"2580:26:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2571:5:111"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"2534:6:111"},"nodeType":"YulIf","src":"2531:89:111"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2640:4:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2699:5:111"},{"name":"newLen","nodeType":"YulIdentifier","src":"2706:6:111"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"2646:52:111"},"nodeType":"YulFunctionCall","src":"2646:67:111"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2633:6:111"},"nodeType":"YulFunctionCall","src":"2633:81:111"},"nodeType":"YulExpressionStatement","src":"2633:81:111"}]},"nodeType":"YulCase","src":"2482:242:111","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1790:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1798:2:111","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1787:2:111"},"nodeType":"YulFunctionCall","src":"1787:14:111"},"nodeType":"YulSwitch","src":"1780:944:111"}]},"name":"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"1459:4:111","type":""},{"name":"src","nodeType":"YulTypedName","src":"1465:3:111","type":""}],"src":"1378:1352:111"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_string_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_string_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n let _1 := 0\n mstore(_1, array)\n let data := keccak256(_1, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _2 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _2) { start := add(start, 1) }\n { sstore(start, _1) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_string_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_string_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60806040526005805460ff191660121790553480156200001e57600080fd5b50604051806040016040528060038152602001621514d560ea1b815250604051806040016040528060098152602001682a32b9ba2a37b5b2b760b91b81525081600390816200006e91906200012b565b5060046200007d82826200012b565b505050620001f7565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000b157607f821691505b602082108103620000d257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200012657600081815260208120601f850160051c81016020861015620001015750805b601f850160051c820191505b8181101562000122578281556001016200010d565b5050505b505050565b81516001600160401b0381111562000147576200014762000086565b6200015f816200015884546200009c565b84620000d8565b602080601f8311600181146200019757600084156200017e5750858301515b600019600386901b1c1916600185901b17855562000122565b600085815260208120601f198616915b82811015620001c857888601518255948401946001909101908401620001a7565b5085821015620001e75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610cd880620002076000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610216578063a9059cbb14610229578063ccd12eee1461023c578063dd62ed3e1461024957600080fd5b806370a08231146101965780637a1395aa146101cc57806395d89b411461020e57600080fd5b806323b872dd116100c857806323b872dd14610142578063313ce56714610155578063395093511461016e57806340c10f191461018157600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f761028f565b6040516101049190610a96565b60405180910390f35b61012061011b366004610b32565b610321565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610b5c565b610339565b60055460ff165b60405160ff9091168152602001610104565b61012061017c366004610b32565b61035d565b61019461018f366004610b32565b6103a9565b005b6101346101a4366004610b98565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101946101da366004610bba565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b6100f76103b7565b610120610224366004610b32565b6103c6565b610120610237366004610b32565b61049c565b60055461015c9060ff1681565b610134610257366004610bdd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461029e90610c10565b80601f01602080910402602001604051908101604052809291908181526020018280546102ca90610c10565b80156103175780601f106102ec57610100808354040283529160200191610317565b820191906000526020600020905b8154815290600101906020018083116102fa57829003601f168201915b5050505050905090565b60003361032f8185856104aa565b5060019392505050565b60003361034785828561065d565b610352858585610734565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061032f90829086906103a4908790610c63565b6104aa565b6103b382826109a3565b5050565b60606004805461029e90610c10565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61035282868684036104aa565b60003361032f818585610734565b73ffffffffffffffffffffffffffffffffffffffff831661054c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff82166105ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461072e5781811015610721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610486565b61072e84848484036104aa565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff821661087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361072e565b73ffffffffffffffffffffffffffffffffffffffff8216610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610486565b8060026000828254610a329190610c63565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b81811015610ac357858101830151858201604001528201610aa7565b81811115610ad5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2d57600080fd5b919050565b60008060408385031215610b4557600080fd5b610b4e83610b09565b946020939093013593505050565b600080600060608486031215610b7157600080fd5b610b7a84610b09565b9250610b8860208501610b09565b9150604084013590509250925092565b600060208284031215610baa57600080fd5b610bb382610b09565b9392505050565b600060208284031215610bcc57600080fd5b813560ff81168114610bb357600080fd5b60008060408385031215610bf057600080fd5b610bf983610b09565b9150610c0760208401610b09565b90509250929050565b600181811c90821680610c2457607f821691505b602082108103610c5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea26469706673582212200a9be9b36dabd8028906c2e142391d68c3907f93a4bc3ec9aefe1b97dbba06b364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x1514D5 PUSH1 0xEA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x9 DUP2 MSTORE PUSH1 0x20 ADD PUSH9 0x2A32B9BA2A37B5B2B7 PUSH1 0xB9 SHL DUP2 MSTORE POP DUP2 PUSH1 0x3 SWAP1 DUP2 PUSH3 0x6E SWAP2 SWAP1 PUSH3 0x12B JUMP JUMPDEST POP PUSH1 0x4 PUSH3 0x7D DUP3 DUP3 PUSH3 0x12B JUMP JUMPDEST POP POP POP PUSH3 0x1F7 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0xB1 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH3 0xD2 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH3 0x126 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP7 LT ISZERO PUSH3 0x101 JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x122 JUMPI DUP3 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x10D JUMP JUMPDEST POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH3 0x147 JUMPI PUSH3 0x147 PUSH3 0x86 JUMP JUMPDEST PUSH3 0x15F DUP2 PUSH3 0x158 DUP5 SLOAD PUSH3 0x9C JUMP JUMPDEST DUP5 PUSH3 0xD8 JUMP JUMPDEST PUSH1 0x20 DUP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 DUP2 EQ PUSH3 0x197 JUMPI PUSH1 0x0 DUP5 ISZERO PUSH3 0x17E JUMPI POP DUP6 DUP4 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP7 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP6 SWAP1 SHL OR DUP6 SSTORE PUSH3 0x122 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP7 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x1C8 JUMPI DUP9 DUP7 ADD MLOAD DUP3 SSTORE SWAP5 DUP5 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 DUP5 ADD PUSH3 0x1A7 JUMP JUMPDEST POP DUP6 DUP3 LT ISZERO PUSH3 0x1E7 JUMPI DUP8 DUP6 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP9 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH2 0xCD8 DUP1 PUSH3 0x207 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xEA JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x7A1395AA EQ PUSH2 0x1CC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x20E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD GT PUSH2 0xC8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x16E JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x130 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7 PUSH2 0x28F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x104 SWAP2 SWAP1 PUSH2 0xA96 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x120 PUSH2 0x11B CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x150 CALLDATASIZE PUSH1 0x4 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x339 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0xFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x17C CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x35D JUMP JUMPDEST PUSH2 0x194 PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x3A9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x134 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0xB98 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x194 PUSH2 0x1DA CALLDATASIZE PUSH1 0x4 PUSH2 0xBBA JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xF7 PUSH2 0x3B7 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x224 CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x3C6 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x49C JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH2 0x15C SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x134 PUSH2 0x257 CALLDATASIZE PUSH1 0x4 PUSH2 0xBDD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x29E SWAP1 PUSH2 0xC10 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x2CA SWAP1 PUSH2 0xC10 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x317 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x317 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2FA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x32F DUP2 DUP6 DUP6 PUSH2 0x4AA JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x347 DUP6 DUP3 DUP6 PUSH2 0x65D JUMP JUMPDEST PUSH2 0x352 DUP6 DUP6 DUP6 PUSH2 0x734 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x32F SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x3A4 SWAP1 DUP8 SWAP1 PUSH2 0xC63 JUMP JUMPDEST PUSH2 0x4AA JUMP JUMPDEST PUSH2 0x3B3 DUP3 DUP3 PUSH2 0x9A3 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x29E SWAP1 PUSH2 0xC10 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x48F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x352 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0x4AA JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x32F DUP2 DUP6 DUP6 PUSH2 0x734 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x54C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x5EF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x72E JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x721 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x486 JUMP JUMPDEST PUSH2 0x72E DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0x4AA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x7D7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x87A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP8 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP3 MLOAD DUP6 DUP2 MSTORE SWAP1 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xA20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x486 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xA32 SWAP2 SWAP1 PUSH2 0xC63 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE MLOAD DUP5 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAC3 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0xAA7 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xAD5 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xB2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB4E DUP4 PUSH2 0xB09 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xB71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB7A DUP5 PUSH2 0xB09 JUMP JUMPDEST SWAP3 POP PUSH2 0xB88 PUSH1 0x20 DUP6 ADD PUSH2 0xB09 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB3 DUP3 PUSH2 0xB09 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBF9 DUP4 PUSH2 0xB09 JUMP JUMPDEST SWAP2 POP PUSH2 0xC07 PUSH1 0x20 DUP5 ADD PUSH2 0xB09 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0xC24 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0xC5D JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0xC9D JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXP SWAP12 0xE9 0xB3 PUSH14 0xABD8028906C2E142391D68C3907F SWAP4 LOG4 0xBC RETURNDATACOPY 0xC9 0xAE INVALID SHL SWAP8 0xDB 0xBA MOD 0xB3 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"119:483:102:-:0;;;153:34;;;-1:-1:-1;;153:34:102;185:2;153:34;;;193:109;;;;;;;;;;1976:113:35;;;;;;;;;;;;;-1:-1:-1;;;1976:113:35;;;;;;;;;;;;;;;;-1:-1:-1;;;1976:113:35;;;2050:5;2042;:13;;;;;;:::i;:::-;-1:-1:-1;2065:7:35;:17;2075:7;2065;:17;:::i;:::-;;1976:113;;119:483:102;;14:127:111;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:380;225:1;221:12;;;;268;;;289:61;;343:4;335:6;331:17;321:27;;289:61;396:2;388:6;385:14;365:18;362:38;359:161;;442:10;437:3;433:20;430:1;423:31;477:4;474:1;467:15;505:4;502:1;495:15;359:161;;146:380;;;:::o;657:545::-;759:2;754:3;751:11;748:448;;;795:1;820:5;816:2;809:17;865:4;861:2;851:19;935:2;923:10;919:19;916:1;912:27;906:4;902:38;971:4;959:10;956:20;953:47;;;-1:-1:-1;994:4:111;953:47;1049:2;1044:3;1040:12;1037:1;1033:20;1027:4;1023:31;1013:41;;1104:82;1122:2;1115:5;1112:13;1104:82;;;1167:17;;;1148:1;1137:13;1104:82;;;1108:3;;;748:448;657:545;;;:::o;1378:1352::-;1498:10;;-1:-1:-1;;;;;1520:30:111;;1517:56;;;1553:18;;:::i;:::-;1582:97;1672:6;1632:38;1664:4;1658:11;1632:38;:::i;:::-;1626:4;1582:97;:::i;:::-;1734:4;;1798:2;1787:14;;1815:1;1810:663;;;;2517:1;2534:6;2531:89;;;-1:-1:-1;2586:19:111;;;2580:26;2531:89;-1:-1:-1;;1335:1:111;1331:11;;;1327:24;1323:29;1313:40;1359:1;1355:11;;;1310:57;2633:81;;1780:944;;1810:663;604:1;597:14;;;641:4;628:18;;-1:-1:-1;;1846:20:111;;;1964:236;1978:7;1975:1;1972:14;1964:236;;;2067:19;;;2061:26;2046:42;;2159:27;;;;2127:1;2115:14;;;;1994:19;;1964:236;;;1968:3;2228:6;2219:7;2216:19;2213:201;;;2289:19;;;2283:26;-1:-1:-1;;2372:1:111;2368:14;;;2384:3;2364:24;2360:37;2356:42;2341:58;2326:74;;2213:201;-1:-1:-1;;;;;2460:1:111;2444:14;;;2440:22;2427:36;;-1:-1:-1;1378:1352:111:o;:::-;119:483:102;;;;;;"},"deployedBytecode":{"functionDebugData":{"@_afterTokenTransfer_4340":{"entryPoint":null,"id":4340,"parameterSlots":3,"returnSlots":0},"@_approve_4275":{"entryPoint":1194,"id":4275,"parameterSlots":3,"returnSlots":0},"@_beforeTokenTransfer_4329":{"entryPoint":null,"id":4329,"parameterSlots":3,"returnSlots":0},"@_mint_4158":{"entryPoint":2467,"id":4158,"parameterSlots":2,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_spendAllowance_4318":{"entryPoint":1629,"id":4318,"parameterSlots":3,"returnSlots":0},"@_transfer_4101":{"entryPoint":1844,"id":4101,"parameterSlots":3,"returnSlots":0},"@allowance_3896":{"entryPoint":null,"id":3896,"parameterSlots":2,"returnSlots":1},"@approve_3921":{"entryPoint":801,"id":3921,"parameterSlots":2,"returnSlots":1},"@balanceOf_3853":{"entryPoint":null,"id":3853,"parameterSlots":1,"returnSlots":1},"@decimalsOverride_20167":{"entryPoint":null,"id":20167,"parameterSlots":0,"returnSlots":0},"@decimals_20197":{"entryPoint":null,"id":20197,"parameterSlots":0,"returnSlots":1},"@decreaseAllowance_4024":{"entryPoint":966,"id":4024,"parameterSlots":2,"returnSlots":1},"@increaseAllowance_3983":{"entryPoint":861,"id":3983,"parameterSlots":2,"returnSlots":1},"@mint_20188":{"entryPoint":937,"id":20188,"parameterSlots":2,"returnSlots":0},"@name_3809":{"entryPoint":655,"id":3809,"parameterSlots":0,"returnSlots":1},"@setDecimals_20207":{"entryPoint":null,"id":20207,"parameterSlots":1,"returnSlots":0},"@symbol_3819":{"entryPoint":951,"id":3819,"parameterSlots":0,"returnSlots":1},"@totalSupply_3839":{"entryPoint":null,"id":3839,"parameterSlots":0,"returnSlots":1},"@transferFrom_3954":{"entryPoint":825,"id":3954,"parameterSlots":3,"returnSlots":1},"@transfer_3878":{"entryPoint":1180,"id":3878,"parameterSlots":2,"returnSlots":1},"abi_decode_address":{"entryPoint":2825,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":2968,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_addresst_address":{"entryPoint":3037,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_uint256":{"entryPoint":2908,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":2866,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_uint8":{"entryPoint":3002,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":2710,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":3171,"id":null,"parameterSlots":2,"returnSlots":1},"extract_byte_array_length":{"entryPoint":3088,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:6636:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"135:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"145:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"155:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"149:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"173:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"184:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"166:6:111"},"nodeType":"YulFunctionCall","src":"166:21:111"},"nodeType":"YulExpressionStatement","src":"166:21:111"},{"nodeType":"YulVariableDeclaration","src":"196:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"216:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"210:5:111"},"nodeType":"YulFunctionCall","src":"210:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"200:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"243:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"254:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"239:3:111"},"nodeType":"YulFunctionCall","src":"239:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"259:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"232:6:111"},"nodeType":"YulFunctionCall","src":"232:34:111"},"nodeType":"YulExpressionStatement","src":"232:34:111"},{"nodeType":"YulVariableDeclaration","src":"275:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"284:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"279:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"344:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"373:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"384:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"369:3:111"},"nodeType":"YulFunctionCall","src":"369:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"388:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"365:3:111"},"nodeType":"YulFunctionCall","src":"365:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"407:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"415:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"403:3:111"},"nodeType":"YulFunctionCall","src":"403:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"419:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"399:3:111"},"nodeType":"YulFunctionCall","src":"399:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"393:5:111"},"nodeType":"YulFunctionCall","src":"393:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"358:6:111"},"nodeType":"YulFunctionCall","src":"358:66:111"},"nodeType":"YulExpressionStatement","src":"358:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"305:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"308:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"302:2:111"},"nodeType":"YulFunctionCall","src":"302:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"316:19:111","statements":[{"nodeType":"YulAssignment","src":"318:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"327:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"330:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"323:3:111"},"nodeType":"YulFunctionCall","src":"323:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"318:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"298:3:111","statements":[]},"src":"294:140:111"},{"body":{"nodeType":"YulBlock","src":"468:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"497:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"508:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"493:3:111"},"nodeType":"YulFunctionCall","src":"493:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"517:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"489:3:111"},"nodeType":"YulFunctionCall","src":"489:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"522:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"482:6:111"},"nodeType":"YulFunctionCall","src":"482:42:111"},"nodeType":"YulExpressionStatement","src":"482:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"449:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"452:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"446:2:111"},"nodeType":"YulFunctionCall","src":"446:13:111"},"nodeType":"YulIf","src":"443:91:111"},{"nodeType":"YulAssignment","src":"543:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"559:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"578:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"586:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"591:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"555:3:111"},"nodeType":"YulFunctionCall","src":"555:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"661:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"551:3:111"},"nodeType":"YulFunctionCall","src":"551:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"543:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"104:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"115:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"126:4:111","type":""}],"src":"14:656:111"},{"body":{"nodeType":"YulBlock","src":"724:147:111","statements":[{"nodeType":"YulAssignment","src":"734:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"756:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"743:12:111"},"nodeType":"YulFunctionCall","src":"743:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"734:5:111"}]},{"body":{"nodeType":"YulBlock","src":"849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"851:6:111"},"nodeType":"YulFunctionCall","src":"851:12:111"},"nodeType":"YulExpressionStatement","src":"851:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"785:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"796:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"803:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"792:3:111"},"nodeType":"YulFunctionCall","src":"792:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"782:2:111"},"nodeType":"YulFunctionCall","src":"782:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"775:6:111"},"nodeType":"YulFunctionCall","src":"775:73:111"},"nodeType":"YulIf","src":"772:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"703:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"714:5:111","type":""}],"src":"675:196:111"},{"body":{"nodeType":"YulBlock","src":"963:167:111","statements":[{"body":{"nodeType":"YulBlock","src":"1009:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1018:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1021:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1011:6:111"},"nodeType":"YulFunctionCall","src":"1011:12:111"},"nodeType":"YulExpressionStatement","src":"1011:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"984:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"993:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"980:3:111"},"nodeType":"YulFunctionCall","src":"980:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1005:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"976:3:111"},"nodeType":"YulFunctionCall","src":"976:32:111"},"nodeType":"YulIf","src":"973:52:111"},{"nodeType":"YulAssignment","src":"1034:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1063:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1044:18:111"},"nodeType":"YulFunctionCall","src":"1044:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1034:6:111"}]},{"nodeType":"YulAssignment","src":"1082:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1109:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1120:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1105:3:111"},"nodeType":"YulFunctionCall","src":"1105:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1092:12:111"},"nodeType":"YulFunctionCall","src":"1092:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1082:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"921:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"932:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"944:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"952:6:111","type":""}],"src":"876:254:111"},{"body":{"nodeType":"YulBlock","src":"1230:92:111","statements":[{"nodeType":"YulAssignment","src":"1240:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1252:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1263:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1248:3:111"},"nodeType":"YulFunctionCall","src":"1248:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1240:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1282:9:111"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1307:6:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1300:6:111"},"nodeType":"YulFunctionCall","src":"1300:14:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1293:6:111"},"nodeType":"YulFunctionCall","src":"1293:22:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1275:6:111"},"nodeType":"YulFunctionCall","src":"1275:41:111"},"nodeType":"YulExpressionStatement","src":"1275:41:111"}]},"name":"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1199:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1210:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1221:4:111","type":""}],"src":"1135:187:111"},{"body":{"nodeType":"YulBlock","src":"1428:76:111","statements":[{"nodeType":"YulAssignment","src":"1438:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1450:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1461:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1446:3:111"},"nodeType":"YulFunctionCall","src":"1446:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1438:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1480:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1491:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1473:6:111"},"nodeType":"YulFunctionCall","src":"1473:25:111"},"nodeType":"YulExpressionStatement","src":"1473:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1397:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1408:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1419:4:111","type":""}],"src":"1327:177:111"},{"body":{"nodeType":"YulBlock","src":"1613:224:111","statements":[{"body":{"nodeType":"YulBlock","src":"1659:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1668:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1671:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1661:6:111"},"nodeType":"YulFunctionCall","src":"1661:12:111"},"nodeType":"YulExpressionStatement","src":"1661:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1634:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1643:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1630:3:111"},"nodeType":"YulFunctionCall","src":"1630:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1655:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1626:3:111"},"nodeType":"YulFunctionCall","src":"1626:32:111"},"nodeType":"YulIf","src":"1623:52:111"},{"nodeType":"YulAssignment","src":"1684:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1713:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1694:18:111"},"nodeType":"YulFunctionCall","src":"1694:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1684:6:111"}]},{"nodeType":"YulAssignment","src":"1732:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1765:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1776:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1761:3:111"},"nodeType":"YulFunctionCall","src":"1761:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"1742:18:111"},"nodeType":"YulFunctionCall","src":"1742:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1732:6:111"}]},{"nodeType":"YulAssignment","src":"1789:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1816:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1827:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1812:3:111"},"nodeType":"YulFunctionCall","src":"1812:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1799:12:111"},"nodeType":"YulFunctionCall","src":"1799:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1789:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1563:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1574:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1586:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1594:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1602:6:111","type":""}],"src":"1509:328:111"},{"body":{"nodeType":"YulBlock","src":"1939:87:111","statements":[{"nodeType":"YulAssignment","src":"1949:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1961:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1972:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1957:3:111"},"nodeType":"YulFunctionCall","src":"1957:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1949:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1991:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2006:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2014:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2002:3:111"},"nodeType":"YulFunctionCall","src":"2002:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1984:6:111"},"nodeType":"YulFunctionCall","src":"1984:36:111"},"nodeType":"YulExpressionStatement","src":"1984:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1908:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1919:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1930:4:111","type":""}],"src":"1842:184:111"},{"body":{"nodeType":"YulBlock","src":"2101:116:111","statements":[{"body":{"nodeType":"YulBlock","src":"2147:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2156:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2159:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2149:6:111"},"nodeType":"YulFunctionCall","src":"2149:12:111"},"nodeType":"YulExpressionStatement","src":"2149:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2122:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2131:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2118:3:111"},"nodeType":"YulFunctionCall","src":"2118:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2143:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2114:3:111"},"nodeType":"YulFunctionCall","src":"2114:32:111"},"nodeType":"YulIf","src":"2111:52:111"},{"nodeType":"YulAssignment","src":"2172:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2201:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2182:18:111"},"nodeType":"YulFunctionCall","src":"2182:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2172:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2067:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2078:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2090:6:111","type":""}],"src":"2031:186:111"},{"body":{"nodeType":"YulBlock","src":"2290:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"2336:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2345:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2348:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2338:6:111"},"nodeType":"YulFunctionCall","src":"2338:12:111"},"nodeType":"YulExpressionStatement","src":"2338:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2311:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2320:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2307:3:111"},"nodeType":"YulFunctionCall","src":"2307:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2332:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2303:3:111"},"nodeType":"YulFunctionCall","src":"2303:32:111"},"nodeType":"YulIf","src":"2300:52:111"},{"nodeType":"YulVariableDeclaration","src":"2361:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2387:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2374:12:111"},"nodeType":"YulFunctionCall","src":"2374:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2365:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2445:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2454:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2457:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2447:6:111"},"nodeType":"YulFunctionCall","src":"2447:12:111"},"nodeType":"YulExpressionStatement","src":"2447:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2419:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2430:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2437:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2426:3:111"},"nodeType":"YulFunctionCall","src":"2426:16:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2416:2:111"},"nodeType":"YulFunctionCall","src":"2416:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2409:6:111"},"nodeType":"YulFunctionCall","src":"2409:35:111"},"nodeType":"YulIf","src":"2406:55:111"},{"nodeType":"YulAssignment","src":"2470:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2480:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2470:6:111"}]}]},"name":"abi_decode_tuple_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2256:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2267:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2279:6:111","type":""}],"src":"2222:269:111"},{"body":{"nodeType":"YulBlock","src":"2583:173:111","statements":[{"body":{"nodeType":"YulBlock","src":"2629:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2638:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2641:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2631:6:111"},"nodeType":"YulFunctionCall","src":"2631:12:111"},"nodeType":"YulExpressionStatement","src":"2631:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2604:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2613:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2600:3:111"},"nodeType":"YulFunctionCall","src":"2600:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2625:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2596:3:111"},"nodeType":"YulFunctionCall","src":"2596:32:111"},"nodeType":"YulIf","src":"2593:52:111"},{"nodeType":"YulAssignment","src":"2654:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2683:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2664:18:111"},"nodeType":"YulFunctionCall","src":"2664:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2654:6:111"}]},{"nodeType":"YulAssignment","src":"2702:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2735:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2746:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2731:3:111"},"nodeType":"YulFunctionCall","src":"2731:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2712:18:111"},"nodeType":"YulFunctionCall","src":"2712:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2702:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2541:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2552:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2564:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2572:6:111","type":""}],"src":"2496:260:111"},{"body":{"nodeType":"YulBlock","src":"2816:382:111","statements":[{"nodeType":"YulAssignment","src":"2826:22:111","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2840:1:111","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"2843:4:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2836:3:111"},"nodeType":"YulFunctionCall","src":"2836:12:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"2826:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2857:38:111","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"2887:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"2893:1:111","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2883:3:111"},"nodeType":"YulFunctionCall","src":"2883:12:111"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"2861:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2934:31:111","statements":[{"nodeType":"YulAssignment","src":"2936:27:111","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"2950:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2958:4:111","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2946:3:111"},"nodeType":"YulFunctionCall","src":"2946:17:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"2936:6:111"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"2914:18:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2907:6:111"},"nodeType":"YulFunctionCall","src":"2907:26:111"},"nodeType":"YulIf","src":"2904:61:111"},{"body":{"nodeType":"YulBlock","src":"3024:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3045:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3048:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3038:6:111"},"nodeType":"YulFunctionCall","src":"3038:88:111"},"nodeType":"YulExpressionStatement","src":"3038:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3146:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3149:4:111","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3139:6:111"},"nodeType":"YulFunctionCall","src":"3139:15:111"},"nodeType":"YulExpressionStatement","src":"3139:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3174:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3177:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3167:6:111"},"nodeType":"YulFunctionCall","src":"3167:15:111"},"nodeType":"YulExpressionStatement","src":"3167:15:111"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"2980:18:111"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3003:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3011:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3000:2:111"},"nodeType":"YulFunctionCall","src":"3000:14:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2977:2:111"},"nodeType":"YulFunctionCall","src":"2977:38:111"},"nodeType":"YulIf","src":"2974:218:111"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"2796:4:111","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"2805:6:111","type":""}],"src":"2761:437:111"},{"body":{"nodeType":"YulBlock","src":"3251:234:111","statements":[{"body":{"nodeType":"YulBlock","src":"3286:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3307:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3310:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3300:6:111"},"nodeType":"YulFunctionCall","src":"3300:88:111"},"nodeType":"YulExpressionStatement","src":"3300:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3408:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"3411:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3401:6:111"},"nodeType":"YulFunctionCall","src":"3401:15:111"},"nodeType":"YulExpressionStatement","src":"3401:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3436:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3439:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3429:6:111"},"nodeType":"YulFunctionCall","src":"3429:15:111"},"nodeType":"YulExpressionStatement","src":"3429:15:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"3267:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"3274:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3270:3:111"},"nodeType":"YulFunctionCall","src":"3270:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3264:2:111"},"nodeType":"YulFunctionCall","src":"3264:13:111"},"nodeType":"YulIf","src":"3261:193:111"},{"nodeType":"YulAssignment","src":"3463:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"3474:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"3477:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3470:3:111"},"nodeType":"YulFunctionCall","src":"3470:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"3463:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"3234:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"3237:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"3243:3:111","type":""}],"src":"3203:282:111"},{"body":{"nodeType":"YulBlock","src":"3664:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3681:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3692:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3674:6:111"},"nodeType":"YulFunctionCall","src":"3674:21:111"},"nodeType":"YulExpressionStatement","src":"3674:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3715:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3726:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3711:3:111"},"nodeType":"YulFunctionCall","src":"3711:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"3731:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3704:6:111"},"nodeType":"YulFunctionCall","src":"3704:30:111"},"nodeType":"YulExpressionStatement","src":"3704:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3754:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3765:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3750:3:111"},"nodeType":"YulFunctionCall","src":"3750:18:111"},{"hexValue":"45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77","kind":"string","nodeType":"YulLiteral","src":"3770:34:111","type":"","value":"ERC20: decreased allowance below"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3743:6:111"},"nodeType":"YulFunctionCall","src":"3743:62:111"},"nodeType":"YulExpressionStatement","src":"3743:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3825:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3836:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3821:3:111"},"nodeType":"YulFunctionCall","src":"3821:18:111"},{"hexValue":"207a65726f","kind":"string","nodeType":"YulLiteral","src":"3841:7:111","type":"","value":" zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3814:6:111"},"nodeType":"YulFunctionCall","src":"3814:35:111"},"nodeType":"YulExpressionStatement","src":"3814:35:111"},{"nodeType":"YulAssignment","src":"3858:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3870:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3881:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3866:3:111"},"nodeType":"YulFunctionCall","src":"3866:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3858:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3641:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3655:4:111","type":""}],"src":"3490:401:111"},{"body":{"nodeType":"YulBlock","src":"4070:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4087:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4098:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4080:6:111"},"nodeType":"YulFunctionCall","src":"4080:21:111"},"nodeType":"YulExpressionStatement","src":"4080:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4121:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4132:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4117:3:111"},"nodeType":"YulFunctionCall","src":"4117:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4137:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4110:6:111"},"nodeType":"YulFunctionCall","src":"4110:30:111"},"nodeType":"YulExpressionStatement","src":"4110:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4160:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4171:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4156:3:111"},"nodeType":"YulFunctionCall","src":"4156:18:111"},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f20616464","kind":"string","nodeType":"YulLiteral","src":"4176:34:111","type":"","value":"ERC20: approve from the zero add"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4149:6:111"},"nodeType":"YulFunctionCall","src":"4149:62:111"},"nodeType":"YulExpressionStatement","src":"4149:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4231:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4242:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4227:3:111"},"nodeType":"YulFunctionCall","src":"4227:18:111"},{"hexValue":"72657373","kind":"string","nodeType":"YulLiteral","src":"4247:6:111","type":"","value":"ress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4220:6:111"},"nodeType":"YulFunctionCall","src":"4220:34:111"},"nodeType":"YulExpressionStatement","src":"4220:34:111"},{"nodeType":"YulAssignment","src":"4263:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4275:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4286:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4271:3:111"},"nodeType":"YulFunctionCall","src":"4271:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4263:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4047:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4061:4:111","type":""}],"src":"3896:400:111"},{"body":{"nodeType":"YulBlock","src":"4475:224:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4492:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4503:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4485:6:111"},"nodeType":"YulFunctionCall","src":"4485:21:111"},"nodeType":"YulExpressionStatement","src":"4485:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4526:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4537:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4522:3:111"},"nodeType":"YulFunctionCall","src":"4522:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4542:2:111","type":"","value":"34"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4515:6:111"},"nodeType":"YulFunctionCall","src":"4515:30:111"},"nodeType":"YulExpressionStatement","src":"4515:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4565:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4576:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4561:3:111"},"nodeType":"YulFunctionCall","src":"4561:18:111"},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f206164647265","kind":"string","nodeType":"YulLiteral","src":"4581:34:111","type":"","value":"ERC20: approve to the zero addre"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4554:6:111"},"nodeType":"YulFunctionCall","src":"4554:62:111"},"nodeType":"YulExpressionStatement","src":"4554:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4636:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4647:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4632:3:111"},"nodeType":"YulFunctionCall","src":"4632:18:111"},{"hexValue":"7373","kind":"string","nodeType":"YulLiteral","src":"4652:4:111","type":"","value":"ss"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4625:6:111"},"nodeType":"YulFunctionCall","src":"4625:32:111"},"nodeType":"YulExpressionStatement","src":"4625:32:111"},{"nodeType":"YulAssignment","src":"4666:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4678:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4689:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4674:3:111"},"nodeType":"YulFunctionCall","src":"4674:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4666:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4452:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4466:4:111","type":""}],"src":"4301:398:111"},{"body":{"nodeType":"YulBlock","src":"4878:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4895:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4906:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4888:6:111"},"nodeType":"YulFunctionCall","src":"4888:21:111"},"nodeType":"YulExpressionStatement","src":"4888:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4929:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4940:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4925:3:111"},"nodeType":"YulFunctionCall","src":"4925:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"4945:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4918:6:111"},"nodeType":"YulFunctionCall","src":"4918:30:111"},"nodeType":"YulExpressionStatement","src":"4918:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4968:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4979:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4964:3:111"},"nodeType":"YulFunctionCall","src":"4964:18:111"},{"hexValue":"45524332303a20696e73756666696369656e7420616c6c6f77616e6365","kind":"string","nodeType":"YulLiteral","src":"4984:31:111","type":"","value":"ERC20: insufficient allowance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4957:6:111"},"nodeType":"YulFunctionCall","src":"4957:59:111"},"nodeType":"YulExpressionStatement","src":"4957:59:111"},{"nodeType":"YulAssignment","src":"5025:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5037:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5048:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5033:3:111"},"nodeType":"YulFunctionCall","src":"5033:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5025:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4855:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4869:4:111","type":""}],"src":"4704:353:111"},{"body":{"nodeType":"YulBlock","src":"5236:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5253:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5264:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5246:6:111"},"nodeType":"YulFunctionCall","src":"5246:21:111"},"nodeType":"YulExpressionStatement","src":"5246:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5287:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5298:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5283:3:111"},"nodeType":"YulFunctionCall","src":"5283:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5303:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5276:6:111"},"nodeType":"YulFunctionCall","src":"5276:30:111"},"nodeType":"YulExpressionStatement","src":"5276:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5326:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5337:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5322:3:111"},"nodeType":"YulFunctionCall","src":"5322:18:111"},{"hexValue":"45524332303a207472616e736665722066726f6d20746865207a65726f206164","kind":"string","nodeType":"YulLiteral","src":"5342:34:111","type":"","value":"ERC20: transfer from the zero ad"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5315:6:111"},"nodeType":"YulFunctionCall","src":"5315:62:111"},"nodeType":"YulExpressionStatement","src":"5315:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5408:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5393:3:111"},"nodeType":"YulFunctionCall","src":"5393:18:111"},{"hexValue":"6472657373","kind":"string","nodeType":"YulLiteral","src":"5413:7:111","type":"","value":"dress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5386:6:111"},"nodeType":"YulFunctionCall","src":"5386:35:111"},"nodeType":"YulExpressionStatement","src":"5386:35:111"},{"nodeType":"YulAssignment","src":"5430:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5442:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5453:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5438:3:111"},"nodeType":"YulFunctionCall","src":"5438:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5430:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5213:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5227:4:111","type":""}],"src":"5062:401:111"},{"body":{"nodeType":"YulBlock","src":"5642:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5659:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5670:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5652:6:111"},"nodeType":"YulFunctionCall","src":"5652:21:111"},"nodeType":"YulExpressionStatement","src":"5652:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5693:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5704:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5689:3:111"},"nodeType":"YulFunctionCall","src":"5689:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"5709:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5682:6:111"},"nodeType":"YulFunctionCall","src":"5682:30:111"},"nodeType":"YulExpressionStatement","src":"5682:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5732:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5743:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5728:3:111"},"nodeType":"YulFunctionCall","src":"5728:18:111"},{"hexValue":"45524332303a207472616e7366657220746f20746865207a65726f2061646472","kind":"string","nodeType":"YulLiteral","src":"5748:34:111","type":"","value":"ERC20: transfer to the zero addr"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5721:6:111"},"nodeType":"YulFunctionCall","src":"5721:62:111"},"nodeType":"YulExpressionStatement","src":"5721:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5803:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5814:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5799:3:111"},"nodeType":"YulFunctionCall","src":"5799:18:111"},{"hexValue":"657373","kind":"string","nodeType":"YulLiteral","src":"5819:5:111","type":"","value":"ess"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5792:6:111"},"nodeType":"YulFunctionCall","src":"5792:33:111"},"nodeType":"YulExpressionStatement","src":"5792:33:111"},{"nodeType":"YulAssignment","src":"5834:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5846:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5857:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5842:3:111"},"nodeType":"YulFunctionCall","src":"5842:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5834:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5619:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5633:4:111","type":""}],"src":"5468:399:111"},{"body":{"nodeType":"YulBlock","src":"6046:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6063:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6074:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6056:6:111"},"nodeType":"YulFunctionCall","src":"6056:21:111"},"nodeType":"YulExpressionStatement","src":"6056:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6097:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6108:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6093:3:111"},"nodeType":"YulFunctionCall","src":"6093:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6113:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6086:6:111"},"nodeType":"YulFunctionCall","src":"6086:30:111"},"nodeType":"YulExpressionStatement","src":"6086:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6136:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6147:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6132:3:111"},"nodeType":"YulFunctionCall","src":"6132:18:111"},{"hexValue":"45524332303a207472616e7366657220616d6f756e7420657863656564732062","kind":"string","nodeType":"YulLiteral","src":"6152:34:111","type":"","value":"ERC20: transfer amount exceeds b"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6125:6:111"},"nodeType":"YulFunctionCall","src":"6125:62:111"},"nodeType":"YulExpressionStatement","src":"6125:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6207:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6218:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6203:3:111"},"nodeType":"YulFunctionCall","src":"6203:18:111"},{"hexValue":"616c616e6365","kind":"string","nodeType":"YulLiteral","src":"6223:8:111","type":"","value":"alance"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6196:6:111"},"nodeType":"YulFunctionCall","src":"6196:36:111"},"nodeType":"YulExpressionStatement","src":"6196:36:111"},{"nodeType":"YulAssignment","src":"6241:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6253:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6264:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6249:3:111"},"nodeType":"YulFunctionCall","src":"6249:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6241:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6023:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6037:4:111","type":""}],"src":"5872:402:111"},{"body":{"nodeType":"YulBlock","src":"6453:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6470:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6481:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6463:6:111"},"nodeType":"YulFunctionCall","src":"6463:21:111"},"nodeType":"YulExpressionStatement","src":"6463:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6504:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6515:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6500:3:111"},"nodeType":"YulFunctionCall","src":"6500:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"6520:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6493:6:111"},"nodeType":"YulFunctionCall","src":"6493:30:111"},"nodeType":"YulExpressionStatement","src":"6493:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6543:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6554:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6539:3:111"},"nodeType":"YulFunctionCall","src":"6539:18:111"},{"hexValue":"45524332303a206d696e7420746f20746865207a65726f2061646472657373","kind":"string","nodeType":"YulLiteral","src":"6559:33:111","type":"","value":"ERC20: mint to the zero address"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6532:6:111"},"nodeType":"YulFunctionCall","src":"6532:61:111"},"nodeType":"YulExpressionStatement","src":"6532:61:111"},{"nodeType":"YulAssignment","src":"6602:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6614:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6625:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6610:3:111"},"nodeType":"YulFunctionCall","src":"6610:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6602:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6430:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6444:4:111","type":""}],"src":"6279:355:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function abi_decode_tuple_t_uint8(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n value0 := value\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: decreased allowance below\")\n mstore(add(headStart, 96), \" zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"ERC20: insufficient allowance\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: transfer from the zero ad\")\n mstore(add(headStart, 96), \"dress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"ERC20: transfer to the zero addr\")\n mstore(add(headStart, 96), \"ess\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"ERC20: transfer amount exceeds b\")\n mstore(add(headStart, 96), \"alance\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ERC20: mint to the zero address\")\n tail := add(headStart, 96)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610216578063a9059cbb14610229578063ccd12eee1461023c578063dd62ed3e1461024957600080fd5b806370a08231146101965780637a1395aa146101cc57806395d89b411461020e57600080fd5b806323b872dd116100c857806323b872dd14610142578063313ce56714610155578063395093511461016e57806340c10f191461018157600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f761028f565b6040516101049190610a96565b60405180910390f35b61012061011b366004610b32565b610321565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610b5c565b610339565b60055460ff165b60405160ff9091168152602001610104565b61012061017c366004610b32565b61035d565b61019461018f366004610b32565b6103a9565b005b6101346101a4366004610b98565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101946101da366004610bba565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b6100f76103b7565b610120610224366004610b32565b6103c6565b610120610237366004610b32565b61049c565b60055461015c9060ff1681565b610134610257366004610bdd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461029e90610c10565b80601f01602080910402602001604051908101604052809291908181526020018280546102ca90610c10565b80156103175780601f106102ec57610100808354040283529160200191610317565b820191906000526020600020905b8154815290600101906020018083116102fa57829003601f168201915b5050505050905090565b60003361032f8185856104aa565b5060019392505050565b60003361034785828561065d565b610352858585610734565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061032f90829086906103a4908790610c63565b6104aa565b6103b382826109a3565b5050565b60606004805461029e90610c10565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61035282868684036104aa565b60003361032f818585610734565b73ffffffffffffffffffffffffffffffffffffffff831661054c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff82166105ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461072e5781811015610721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610486565b61072e84848484036104aa565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff821661087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610486565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361072e565b73ffffffffffffffffffffffffffffffffffffffff8216610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610486565b8060026000828254610a329190610c63565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b81811015610ac357858101830151858201604001528201610aa7565b81811115610ad5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2d57600080fd5b919050565b60008060408385031215610b4557600080fd5b610b4e83610b09565b946020939093013593505050565b600080600060608486031215610b7157600080fd5b610b7a84610b09565b9250610b8860208501610b09565b9150604084013590509250925092565b600060208284031215610baa57600080fd5b610bb382610b09565b9392505050565b600060208284031215610bcc57600080fd5b813560ff81168114610bb357600080fd5b60008060408385031215610bf057600080fd5b610bf983610b09565b9150610c0760208401610b09565b90509250929050565b600181811c90821680610c2457607f821691505b602082108103610c5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea26469706673582212200a9be9b36dabd8028906c2e142391d68c3907f93a4bc3ec9aefe1b97dbba06b364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xEA JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x7A1395AA EQ PUSH2 0x1CC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x20E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD GT PUSH2 0xC8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x16E JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x10D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x130 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7 PUSH2 0x28F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x104 SWAP2 SWAP1 PUSH2 0xA96 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x120 PUSH2 0x11B CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x150 CALLDATASIZE PUSH1 0x4 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x339 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0xFF AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x104 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x17C CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x35D JUMP JUMPDEST PUSH2 0x194 PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x3A9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x134 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0xB98 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x194 PUSH2 0x1DA CALLDATASIZE PUSH1 0x4 PUSH2 0xBBA JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xF7 PUSH2 0x3B7 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x224 CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x3C6 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0xB32 JUMP JUMPDEST PUSH2 0x49C JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH2 0x15C SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x134 PUSH2 0x257 CALLDATASIZE PUSH1 0x4 PUSH2 0xBDD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x29E SWAP1 PUSH2 0xC10 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x2CA SWAP1 PUSH2 0xC10 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x317 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x317 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2FA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x32F DUP2 DUP6 DUP6 PUSH2 0x4AA JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x347 DUP6 DUP3 DUP6 PUSH2 0x65D JUMP JUMPDEST PUSH2 0x352 DUP6 DUP6 DUP6 PUSH2 0x734 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x32F SWAP1 DUP3 SWAP1 DUP7 SWAP1 PUSH2 0x3A4 SWAP1 DUP8 SWAP1 PUSH2 0xC63 JUMP JUMPDEST PUSH2 0x4AA JUMP JUMPDEST PUSH2 0x3B3 DUP3 DUP3 PUSH2 0x9A3 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x29E SWAP1 PUSH2 0xC10 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 DUP2 LT ISZERO PUSH2 0x48F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x352 DUP3 DUP7 DUP7 DUP5 SUB PUSH2 0x4AA JUMP JUMPDEST PUSH1 0x0 CALLER PUSH2 0x32F DUP2 DUP6 DUP6 PUSH2 0x734 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x54C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x5EF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x72E JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x721 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20696E73756666696369656E7420616C6C6F77616E6365000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x486 JUMP JUMPDEST PUSH2 0x72E DUP5 DUP5 DUP5 DUP5 SUB PUSH2 0x4AA JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x7D7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x87A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x486 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP8 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP3 MLOAD DUP6 DUP2 MSTORE SWAP1 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x72E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xA20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x486 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xA32 SWAP2 SWAP1 PUSH2 0xC63 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 ADD SWAP1 SSTORE MLOAD DUP5 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAC3 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0xAA7 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xAD5 JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xB2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB4E DUP4 PUSH2 0xB09 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xB71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB7A DUP5 PUSH2 0xB09 JUMP JUMPDEST SWAP3 POP PUSH2 0xB88 PUSH1 0x20 DUP6 ADD PUSH2 0xB09 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBB3 DUP3 PUSH2 0xB09 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xBF9 DUP4 PUSH2 0xB09 JUMP JUMPDEST SWAP2 POP PUSH2 0xC07 PUSH1 0x20 DUP5 ADD PUSH2 0xB09 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0xC24 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0xC5D JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0xC9D JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXP SWAP12 0xE9 0xB3 PUSH14 0xABD8028906C2E142391D68C3907F SWAP4 LOG4 0xBC RETURNDATACOPY 0xC9 0xAE INVALID SHL SWAP8 0xDB 0xBA MOD 0xB3 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"119:483:102:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4431:197;;;;;;:::i;:::-;;:::i;:::-;;;1300:14:111;;1293:22;1275:41;;1263:2;1248:18;4431:197:35;1135:187:111;3242:106:35;3329:12;;3242:106;;;1473:25:111;;;1461:2;1446:18;3242:106:35;1327:177:111;5190:286:35;;;;;;:::i;:::-;;:::i;407:97:102:-;481:16;;;;407:97;;;2014:4:111;2002:17;;;1984:36;;1972:2;1957:18;407:97:102;1842:184:111;5871:234:35;;;;;;:::i;:::-;;:::i;308:93:102:-;;;;;;:::i;:::-;;:::i;:::-;;3406:125:35;;;;;;:::i;:::-;3506:18;;3480:7;3506:18;;;;;;;;;;;;3406:125;510:90:102;;;;;;:::i;:::-;565:16;:28;;;;;;;;;;;;;;;510:90;2365:102:35;;;:::i;6592:427::-;;;;;;:::i;:::-;;:::i;3727:189::-;;;;;;:::i;:::-;;:::i;153:34:102:-;;;;;;;;;3974:149:35;;;;;;:::i;:::-;4089:18;;;;4063:7;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3974:149;2154:98;2208:13;2240:5;2233:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98;:::o;4431:197::-;4514:4;719:10:43;4568:32:35;719:10:43;4584:7:35;4593:6;4568:8;:32::i;:::-;-1:-1:-1;4617:4:35;;4431:197;-1:-1:-1;;;4431:197:35:o;5190:286::-;5317:4;719:10:43;5373:38:35;5389:4;719:10:43;5404:6:35;5373:15;:38::i;:::-;5421:27;5431:4;5437:2;5441:6;5421:9;:27::i;:::-;-1:-1:-1;5465:4:35;;5190:286;-1:-1:-1;;;;5190:286:35:o;5871:234::-;719:10:43;5959:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5959:4;;719:10:43;6013:64:35;;719:10:43;;4089:27:35;;6038:38;;6066:10;;6038:38;:::i;:::-;6013:8;:64::i;308:93:102:-;373:21;379:6;387;373:5;:21::i;:::-;308:93;;:::o;2365:102:35:-;2421:13;2453:7;2446:14;;;;;:::i;6592:427::-;719:10:43;6685:4:35;4089:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6685:4;;719:10:43;6829:15:35;6809:16;:35;;6801:85;;;;;;;3692:2:111;6801:85:35;;;3674:21:111;3731:2;3711:18;;;3704:30;3770:34;3750:18;;;3743:62;3841:7;3821:18;;;3814:35;3866:19;;6801:85:35;;;;;;;;;6920:60;6929:5;6936:7;6964:15;6945:16;:34;6920:8;:60::i;3727:189::-;3806:4;719:10:43;3860:28:35;719:10:43;3877:2:35;3881:6;3860:9;:28::i;10504:370::-;10635:19;;;10627:68;;;;;;;4098:2:111;10627:68:35;;;4080:21:111;4137:2;4117:18;;;4110:30;4176:34;4156:18;;;4149:62;4247:6;4227:18;;;4220:34;4271:19;;10627:68:35;3896:400:111;10627:68:35;10713:21;;;10705:68;;;;;;;4503:2:111;10705:68:35;;;4485:21:111;4542:2;4522:18;;;4515:30;4581:34;4561:18;;;4554:62;4652:4;4632:18;;;4625:32;4674:19;;10705:68:35;4301:398:111;10705:68:35;10784:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10835:32;;1473:25:111;;;10835:32:35;;1446:18:111;10835:32:35;;;;;;;10504:370;;;:::o;11155:441::-;4089:18;;;;11285:24;4089:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;11371:17;11351:37;;11347:243;;11432:6;11412:16;:26;;11404:68;;;;;;;4906:2:111;11404:68:35;;;4888:21:111;4945:2;4925:18;;;4918:30;4984:31;4964:18;;;4957:59;5033:18;;11404:68:35;4704:353:111;11404:68:35;11514:51;11523:5;11530:7;11558:6;11539:16;:25;11514:8;:51::i;:::-;11275:321;11155:441;;;:::o;7473:818::-;7599:18;;;7591:68;;;;;;;5264:2:111;7591:68:35;;;5246:21:111;5303:2;5283:18;;;5276:30;5342:34;5322:18;;;5315:62;5413:7;5393:18;;;5386:35;5438:19;;7591:68:35;5062:401:111;7591:68:35;7677:16;;;7669:64;;;;;;;5670:2:111;7669:64:35;;;5652:21:111;5709:2;5689:18;;;5682:30;5748:34;5728:18;;;5721:62;5819:5;5799:18;;;5792:33;5842:19;;7669:64:35;5468:399:111;7669:64:35;7815:15;;;7793:19;7815:15;;;;;;;;;;;7848:21;;;;7840:72;;;;;;;6074:2:111;7840:72:35;;;6056:21:111;6113:2;6093:18;;;6086:30;6152:34;6132:18;;;6125:62;6223:8;6203:18;;;6196:36;6249:19;;7840:72:35;5872:402:111;7840:72:35;7946:15;;;;:9;:15;;;;;;;;;;;7964:20;;;7946:38;;8161:13;;;;;;;;;;:23;;;;;;8210:26;;1473:25:111;;;8161:13:35;;8210:26;;1446:18:111;8210:26:35;;;;;;;8247:37;12180:121;8567:535;8650:21;;;8642:65;;;;;;;6481:2:111;8642:65:35;;;6463:21:111;6520:2;6500:18;;;6493:30;6559:33;6539:18;;;6532:61;6610:18;;8642:65:35;6279:355:111;8642:65:35;8794:6;8778:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;8946:18:35;;;:9;:18;;;;;;;;;;;:28;;;;;;8999:37;1473:25:111;;;8999:37:35;;1446:18:111;8999:37:35;;;;;;;308:93:102;;:::o;14:656:111:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:111;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:111:o;675:196::-;743:20;;803:42;792:54;;782:65;;772:93;;861:1;858;851:12;772:93;675:196;;;:::o;876:254::-;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1044:29;1063:9;1044:29;:::i;:::-;1034:39;1120:2;1105:18;;;;1092:32;;-1:-1:-1;;;876:254:111:o;1509:328::-;1586:6;1594;1602;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;1694:29;1713:9;1694:29;:::i;:::-;1684:39;;1742:38;1776:2;1765:9;1761:18;1742:38;:::i;:::-;1732:48;;1827:2;1816:9;1812:18;1799:32;1789:42;;1509:328;;;;;:::o;2031:186::-;2090:6;2143:2;2131:9;2122:7;2118:23;2114:32;2111:52;;;2159:1;2156;2149:12;2111:52;2182:29;2201:9;2182:29;:::i;:::-;2172:39;2031:186;-1:-1:-1;;;2031:186:111:o;2222:269::-;2279:6;2332:2;2320:9;2311:7;2307:23;2303:32;2300:52;;;2348:1;2345;2338:12;2300:52;2387:9;2374:23;2437:4;2430:5;2426:16;2419:5;2416:27;2406:55;;2457:1;2454;2447:12;2496:260;2564:6;2572;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;2664:29;2683:9;2664:29;:::i;:::-;2654:39;;2712:38;2746:2;2735:9;2731:18;2712:38;:::i;:::-;2702:48;;2496:260;;;;;:::o;2761:437::-;2840:1;2836:12;;;;2883;;;2904:61;;2958:4;2950:6;2946:17;2936:27;;2904:61;3011:2;3003:6;3000:14;2980:18;2977:38;2974:218;;3048:77;3045:1;3038:88;3149:4;3146:1;3139:15;3177:4;3174:1;3167:15;2974:218;;2761:437;;;:::o;3203:282::-;3243:3;3274:1;3270:6;3267:1;3264:13;3261:193;;;3310:77;3307:1;3300:88;3411:4;3408:1;3401:15;3439:4;3436:1;3429:15;3261:193;-1:-1:-1;3470:9:111;;3203:282::o"},"gasEstimates":{"creation":{"codeDepositCost":"657600","executionCost":"infinite","totalCost":"infinite"},"external":{"allowance(address,address)":"infinite","approve(address,uint256)":"24599","balanceOf(address)":"2539","decimals()":"2341","decimalsOverride()":"2379","decreaseAllowance(address,uint256)":"26862","increaseAllowance(address,uint256)":"26952","mint(address,uint256)":"50853","name()":"infinite","setDecimals(uint8)":"24530","symbol()":"infinite","totalSupply()":"2349","transfer(address,uint256)":"51030","transferFrom(address,address,uint256)":"infinite"}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","decimalsOverride()":"ccd12eee","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","mint(address,uint256)":"40c10f19","name()":"06fdde03","setDecimals(uint8)":"7a1395aa","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimalsOverride\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"setDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestToken.sol\":\"TestToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/test/TestToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract TestToken is ERC20 {\\n uint8 public decimalsOverride = 18;\\n constructor ()\\n // solhint-disable-next-line no-empty-blocks\\n ERC20(\\\"TST\\\", \\\"TestToken\\\") {\\n }\\n\\n function mint(address sender, uint256 amount) external {\\n _mint(sender, amount);\\n }\\n\\n function decimals() public view override returns (uint8) {\\n return decimalsOverride;\\n }\\n\\n function setDecimals(uint8 _decimals) public {\\n decimalsOverride = _decimals;\\n }\\n}\\n\",\"keccak256\":\"0x895bfb01c7e362e287c36a2940724caa75a6eddab4c8bd4acb2071808d559ba1\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":3770,"contract":"contracts/test/TestToken.sol:TestToken","label":"_balances","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"},{"astId":3776,"contract":"contracts/test/TestToken.sol:TestToken","label":"_allowances","offset":0,"slot":"1","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":3778,"contract":"contracts/test/TestToken.sol:TestToken","label":"_totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":3780,"contract":"contracts/test/TestToken.sol:TestToken","label":"_name","offset":0,"slot":"3","type":"t_string_storage"},{"astId":3782,"contract":"contracts/test/TestToken.sol:TestToken","label":"_symbol","offset":0,"slot":"4","type":"t_string_storage"},{"astId":20167,"contract":"contracts/test/TestToken.sol:TestToken","label":"decimalsOverride","offset":0,"slot":"5","type":"t_uint8"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestTokenValueBobaDepositPaymaster.sol":{"TestTokenValueBobaDepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"contract IBobaStraw","name":"ethPriceOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_ETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_USD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"contract IBobaStraw","name":"tokenPriceOracle","type":"address"},{"internalType":"address","name":"base","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"ethBought","type":"uint256"}],"name":"getTokenValueOfEthTest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"contract IBobaStraw","name":"feedRegistry","type":"address"},{"internalType":"address","name":"tokenBase","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit.","token":"the token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address,address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to","token":"the token deposit to withdraw"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_11262":{"entryPoint":null,"id":11262,"parameterSlots":2,"returnSlots":0},"@_20227":{"entryPoint":null,"id":20227,"parameterSlots":2,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":407,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_11397":{"entryPoint":null,"id":11397,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory":{"entryPoint":512,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"validator_revert_contract_IEntryPoint":{"entryPoint":487,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:1024:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"302:313:111","statements":[{"body":{"nodeType":"YulBlock","src":"348:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"357:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"360:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"350:6:111"},"nodeType":"YulFunctionCall","src":"350:12:111"},"nodeType":"YulExpressionStatement","src":"350:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"323:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"332:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"319:3:111"},"nodeType":"YulFunctionCall","src":"319:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"344:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"315:3:111"},"nodeType":"YulFunctionCall","src":"315:32:111"},"nodeType":"YulIf","src":"312:52:111"},{"nodeType":"YulVariableDeclaration","src":"373:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"392:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"386:5:111"},"nodeType":"YulFunctionCall","src":"386:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"377:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"449:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"411:37:111"},"nodeType":"YulFunctionCall","src":"411:44:111"},"nodeType":"YulExpressionStatement","src":"411:44:111"},{"nodeType":"YulAssignment","src":"464:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"474:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"464:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"488:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"513:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"524:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"509:3:111"},"nodeType":"YulFunctionCall","src":"509:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"503:5:111"},"nodeType":"YulFunctionCall","src":"503:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"492:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"575:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"537:37:111"},"nodeType":"YulFunctionCall","src":"537:46:111"},"nodeType":"YulExpressionStatement","src":"537:46:111"},{"nodeType":"YulAssignment","src":"592:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"602:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"592:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"260:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"271:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"283:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"291:6:111","type":""}],"src":"163:452:111"},{"body":{"nodeType":"YulBlock","src":"794:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"811:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"822:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"804:6:111"},"nodeType":"YulFunctionCall","src":"804:21:111"},"nodeType":"YulExpressionStatement","src":"804:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"845:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"856:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"841:3:111"},"nodeType":"YulFunctionCall","src":"841:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"861:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"834:6:111"},"nodeType":"YulFunctionCall","src":"834:30:111"},"nodeType":"YulExpressionStatement","src":"834:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"884:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"895:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"880:3:111"},"nodeType":"YulFunctionCall","src":"880:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e636f72726563742065746820","kind":"string","nodeType":"YulLiteral","src":"900:34:111","type":"","value":"DepositPaymaster: Incorrect eth "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"873:6:111"},"nodeType":"YulFunctionCall","src":"873:62:111"},"nodeType":"YulExpressionStatement","src":"873:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"966:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"951:3:111"},"nodeType":"YulFunctionCall","src":"951:18:111"},{"hexValue":"6f7261636c65","kind":"string","nodeType":"YulLiteral","src":"971:8:111","type":"","value":"oracle"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"944:6:111"},"nodeType":"YulFunctionCall","src":"944:36:111"},"nodeType":"YulExpressionStatement","src":"944:36:111"},{"nodeType":"YulAssignment","src":"989:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1012:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"997:3:111"},"nodeType":"YulFunctionCall","src":"997:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"989:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"771:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"785:4:111","type":""}],"src":"620:402:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_contract$_IBobaStraw_$13138_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_stringliteral_e86a4cfc7821e8fb46cabc30c88ba71c16c5159d581feb754969ed74dbe61f16__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"DepositPaymaster: Incorrect eth \")\n mstore(add(headStart, 96), \"oracle\")\n tail := add(headStart, 128)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b50604051620026ff380380620026ff833981016040819052620000349162000200565b818181620000423362000197565b6001600160a01b039081166080528116620000b25760405162461bcd60e51b815260206004820152602660248201527f4465706f7369745061796d61737465723a20496e636f727265637420657468206044820152656f7261636c6560d01b606482015260840160405180910390fd5b620000ca336000908152600360205260409020439055565b604080516060810182526001600160a01b039283168152734200000000000000000000000000000000000006602080830182815260129484019485526000929092526001905290517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d1731880549185166001600160a01b0319909216919091179055517fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d173198054925160ff16600160a01b026001600160a81b03199093169190931617179055506200023f915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001fd57600080fd5b50565b600080604083850312156200021457600080fd5b82516200022181620001e7565b60208401519092506200023481620001e7565b809150509250929050565b6080516124736200028c6000396000818161049f015281816106170152818161087501528181610a4201528181610b0901528181610b9901528181610d51015261154301526124736000f3fe6080604052600436106101a15760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610563578063d0e30db014610585578063f2fde38b1461058d578063f465c77e146105ad57600080fd5b8063c23f001f146104f6578063c399ec881461052e578063cc9c837c1461054357600080fd5b8063b0d691fe116100bb578063b0d691fe1461048d578063bb9fe6bf146104c1578063c23a5cea146104d657600080fd5b80639ed0fb68146103a8578063a9a23409146103cc578063addd5099146103ec57600080fd5b8063493b01701161014e578063715018a611610128578063715018a614610352578063796d4371146103675780637b775d4d1461023b5780638da5cb5b1461037d57600080fd5b8063493b0170146102835780634a6f84cf146102f757806354fe04981461033257600080fd5b80632f3e96a71161017f5780632f3e96a7146101fb57806333032ec41461023b578063382edd9e1461026357600080fd5b80630396cb60146101a65780631a02ef76146101bb578063205c2878146101db575b600080fd5b6101b96101b4366004611d4f565b6105db565b005b3480156101c757600080fd5b506101b96101d6366004611dad565b61068d565b3480156101e757600080fd5b506101b96101f6366004611e09565b610821565b34801561020757600080fd5b5061021161034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561024757600080fd5b5061021173420000000000000000000000000000000000000681565b34801561026f57600080fd5b506101b961027e366004611e35565b6108b9565b34801561028f57600080fd5b506102e261029e366004611e76565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610232565b34801561030357600080fd5b50610324610312366004611eaf565b60036020526000908152604090205481565b604051908152602001610232565b34801561033e57600080fd5b5061032461034d366004611e09565b6109f5565b34801561035e57600080fd5b506101b9610a0a565b34801561037357600080fd5b506103246188b881565b34801561038957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610211565b3480156103b457600080fd5b506101b9336000908152600360205260409020439055565b3480156103d857600080fd5b506101b96103e7366004611ecc565b610a1e565b3480156103f857600080fd5b50610457610407366004611eaf565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610232565b34801561049957600080fd5b506102117f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cd57600080fd5b506101b9610a38565b3480156104e257600080fd5b506101b96104f1366004611eaf565b610abc565b34801561050257600080fd5b50610324610511366004611e76565b600260209081526000928352604080842090915290825290205481565b34801561053a57600080fd5b50610324610b68565b34801561054f57600080fd5b506101b961055e366004611e35565b610c1e565b34801561056f57600080fd5b506101b933600090815260036020526040812055565b6101b9610d23565b34801561059957600080fd5b506101b96105a8366004611eaf565b610dab565b3480156105b957600080fd5b506105cd6105c8366004611f5b565b610e48565b604051610232929190612025565b6105e3610e6b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561067157600080fd5b505af1158015610685573d6000803e3d6000fd5b505050505050565b610695610e6b565b73ffffffffffffffffffffffffffffffffffffffff83166107235760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561075557600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b610829610e6b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561067157600080fd5b6108db73ffffffffffffffffffffffffffffffffffffffff8416333084610ed2565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054166109755760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320938616835292905290812080548392906109b9908490612076565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109f0576109f033600090815260036020526040812055565b505050565b6000610a018383610fae565b90505b92915050565b610a12610e6b565b610a1c60006114b6565b565b610a2661152b565b610a32848484846115b0565b50505050565b610a40610e6b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aa857600080fd5b505af1158015610a32573d6000803e3d6000fd5b610ac4610e6b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c19919061208e565b905090565b3360009081526003602052604090205415801590610c4a57503360009081526003602052604090205443115b610cbc5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f7369740000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cfc9084906120a7565b909155506109f0905073ffffffffffffffffffffffffffffffffffffffff84168383611728565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b4d57600080fd5b610db3610e6b565b73ffffffffffffffffffffffffffffffffffffffff8116610e3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161071a565b610e45816114b6565b50565b60606000610e5461152b565b610e5f85858561177e565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a329085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a5f565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff1693820193909352909161108c5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161071a565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa15801561116c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611190919061208e565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611231919061208e565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133191906120be565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d791906120be565b60ff16905060006113e983600a6121fb565b6113f39085612207565b6113fe83600a6121fb565b611408878c612207565b6114129190612207565b61141c9190612244565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319549091506114849074010000000000000000000000000000000000000000900460ff16600a61227f565b604088015161149490600a61227f565b61149e9083612207565b6114a89190612244565b9a9950505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a1c5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161071a565b6000808080806115c28789018961228e565b9450945094509450945060008183856188b86115de9190612207565b6115e8908a612076565b6115f29190612207565b6115fc9190612244565b905060028a6002811115611612576116126122df565b1461163e5761163973ffffffffffffffffffffffffffffffffffffffff8616873084610ed2565b611688565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a16835292905290812080548392906116829084906120a7565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040812082916116ce60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117179190612076565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109f09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610f2c565b606060006188b88560a00135116117fd5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f70000000000000000000000000000000000000000000000000606482015260840161071a565b36600061180e61012088018861230e565b9092509050602881146118895760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e0000000000000000000000606482015260840161071a565b6000611898826014818661237a565b6118a1916123a4565b60601c9050873560006118b48389610fae565b905060006118c18b611b51565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260409020549091501561195c5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b656400000000000000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260026020908152604080832093871683529290522054821115611a045760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015260840161071a565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611ac1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b809092919063ffffffff16565b8051909150156109f05780806020019051810190611adf91906123ec565b6109f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161071a565b600060e0820135610100830135808203611b6c575092915050565b611b7882488301611b8f565b949350505050565b6060611b788484600085611ba5565b6000818310611b9e5781610a01565b5090919050565b606082471015611c1d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161071a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c46919061240e565b60006040518083038185875af1925050503d8060008114611c83576040519150601f19603f3d011682016040523d82523d6000602084013e611c88565b606091505b5091509150611c9987838387611ca4565b979650505050505050565b60608315611d20578251600003611d195773ffffffffffffffffffffffffffffffffffffffff85163b611d195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071a565b5081611b78565b611b788383815115611d355781518083602001fd5b8060405162461bcd60e51b815260040161071a919061242a565b600060208284031215611d6157600080fd5b813563ffffffff81168114611d7557600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e4557600080fd5b60ff81168114610e4557600080fd5b60008060008060808587031215611dc357600080fd5b8435611dce81611d7c565b93506020850135611dde81611d7c565b92506040850135611dee81611d7c565b91506060850135611dfe81611d9e565b939692955090935050565b60008060408385031215611e1c57600080fd5b8235611e2781611d7c565b946020939093013593505050565b600080600060608486031215611e4a57600080fd5b8335611e5581611d7c565b92506020840135611e6581611d7c565b929592945050506040919091013590565b60008060408385031215611e8957600080fd5b8235611e9481611d7c565b91506020830135611ea481611d7c565b809150509250929050565b600060208284031215611ec157600080fd5b8135611d7581611d7c565b60008060008060608587031215611ee257600080fd5b843560038110611ef157600080fd5b9350602085013567ffffffffffffffff80821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f7057600080fd5b833567ffffffffffffffff811115611f8757600080fd5b84016101608187031215611f9a57600080fd5b95602085013595506040909401359392505050565b60005b83811015611fca578181015183820152602001611fb2565b83811115610a325750506000910152565b60008151808452611ff3816020860160208601611faf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006120386040830185611fdb565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561208957612089612047565b500190565b6000602082840312156120a057600080fd5b5051919050565b6000828210156120b9576120b9612047565b500390565b6000602082840312156120d057600080fd5b8151611d7581611d9e565b600181815b8085111561213457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561211a5761211a612047565b8085161561212757918102915b93841c93908002906120e0565b509250929050565b60008261214b57506001610a04565b8161215857506000610a04565b816001811461216e576002811461217857612194565b6001915050610a04565b60ff84111561218957612189612047565b50506001821b610a04565b5060208310610133831016604e8410600b84101617156121b7575081810a610a04565b6121c183836120db565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156121f3576121f3612047565b029392505050565b6000610a01838361213c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561223f5761223f612047565b500290565b60008261227a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000610a0160ff84168361213c565b600080600080600060a086880312156122a657600080fd5b85356122b181611d7c565b945060208601356122c181611d7c565b94979496505050506040830135926060810135926080909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261234357600080fd5b83018035915067ffffffffffffffff82111561235e57600080fd5b60200191503681900382131561237357600080fd5b9250929050565b6000808585111561238a57600080fd5b8386111561239757600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156123e45780818660140360031b1b83161692505b505092915050565b6000602082840312156123fe57600080fd5b81518015158114611d7557600080fd5b60008251612420818460208701611faf565b9190910192915050565b602081526000610a016020830184611fdb56fea2646970667358221220ce1cdf4e12afe4082320ee9e0dc930ffed46e8c1d8e1796042ef54b8861fd28164736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x26FF CODESIZE SUB DUP1 PUSH3 0x26FF DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x200 JUMP JUMPDEST DUP2 DUP2 DUP2 PUSH3 0x42 CALLER PUSH3 0x197 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE DUP2 AND PUSH3 0xB2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F72726563742065746820 PUSH1 0x44 DUP3 ADD MSTORE PUSH6 0x6F7261636C65 PUSH1 0xD0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0xCA CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x20 DUP1 DUP4 ADD DUP3 DUP2 MSTORE PUSH1 0x12 SWAP5 DUP5 ADD SWAP5 DUP6 MSTORE PUSH1 0x0 SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 SWAP1 MSTORE SWAP1 MLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 DUP1 SLOAD SWAP2 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE MLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 DUP1 SLOAD SWAP3 MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP4 AND OR OR SWAP1 SSTORE POP PUSH3 0x23F SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x221 DUP2 PUSH3 0x1E7 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x234 DUP2 PUSH3 0x1E7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x2473 PUSH3 0x28C PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x49F ADD MSTORE DUP2 DUP2 PUSH2 0x617 ADD MSTORE DUP2 DUP2 PUSH2 0x875 ADD MSTORE DUP2 DUP2 PUSH2 0xA42 ADD MSTORE DUP2 DUP2 PUSH2 0xB09 ADD MSTORE DUP2 DUP2 PUSH2 0xB99 ADD MSTORE DUP2 DUP2 PUSH2 0xD51 ADD MSTORE PUSH2 0x1543 ADD MSTORE PUSH2 0x2473 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23F001F GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x563 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x5AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x48D JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x4D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3CC JUMPI DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 GT PUSH2 0x14E JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x7B775D4D EQ PUSH2 0x23B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x2F7 JUMPI DUP1 PUSH4 0x54FE0498 EQ PUSH2 0x332 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2F3E96A7 GT PUSH2 0x17F JUMPI DUP1 PUSH4 0x2F3E96A7 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x33032EC4 EQ PUSH2 0x23B JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x1A02EF76 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1DB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4F JUMP JUMPDEST PUSH2 0x5DB JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DAD JUMP JUMPDEST PUSH2 0x68D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x821 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x348 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH20 0x4200000000000000000000000000000000000006 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x27E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E35 JUMP JUMPDEST PUSH2 0x8B9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E2 PUSH2 0x29E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E76 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x312 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x9F5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0xA0A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x211 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x3E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1ECC JUMP JUMPDEST PUSH2 0xA1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x457 PUSH2 0x407 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 DUP2 AND SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x499 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH2 0xABC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E76 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0xB68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x55E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E35 JUMP JUMPDEST PUSH2 0xC1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0xD23 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x599 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x5A8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH2 0xDAB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5CD PUSH2 0x5C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F5B JUMP JUMPDEST PUSH2 0xE48 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x232 SWAP3 SWAP2 SWAP1 PUSH2 0x2025 JUMP JUMPDEST PUSH2 0x5E3 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x685 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x695 PUSH2 0xE6B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x723 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F727265637420746F6B65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E206F7261636C65000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x755 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0xFF SWAP4 DUP5 AND DUP6 DUP5 ADD SWAP1 DUP2 MSTORE SWAP7 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP3 KECCAK256 SWAP4 MLOAD DUP5 SLOAD SWAP1 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR DUP5 SSTORE MLOAD SWAP3 ADD DUP1 SLOAD SWAP5 MLOAD SWAP1 SWAP2 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP3 AND OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x829 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8DB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xED2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x975 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x9B9 SWAP1 DUP5 SWAP1 PUSH2 0x2076 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x9F0 JUMPI PUSH2 0x9F0 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 DUP4 DUP4 PUSH2 0xFAE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA12 PUSH2 0xE6B JUMP JUMPDEST PUSH2 0xA1C PUSH1 0x0 PUSH2 0x14B6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA26 PUSH2 0x152B JUMP JUMPDEST PUSH2 0xA32 DUP5 DUP5 DUP5 DUP5 PUSH2 0x15B0 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xA40 PUSH2 0xE6B JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA32 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xAC4 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBF5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC19 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xC4A JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xCBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xCFC SWAP1 DUP5 SWAP1 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x9F0 SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x1728 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDB3 PUSH2 0xE6B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xE3C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH2 0xE45 DUP2 PUSH2 0x14B6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xE54 PUSH2 0x152B JUMP JUMPDEST PUSH2 0xE5F DUP6 DUP6 DUP6 PUSH2 0x177E JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xA32 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1A5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE DUP2 SLOAD DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP5 ADD SLOAD SWAP6 DUP7 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP5 DIV PUSH1 0xFF AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 SWAP2 PUSH2 0x108C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 ADD MLOAD PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP4 SWAP3 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x116C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1190 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x120D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1231 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x130D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1331 SWAP2 SWAP1 PUSH2 0x20BE JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13D7 SWAP2 SWAP1 PUSH2 0x20BE JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x13E9 DUP4 PUSH1 0xA PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x13F3 SWAP1 DUP6 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x13FE DUP4 PUSH1 0xA PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1408 DUP8 DUP13 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x1412 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x141C SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD SWAP1 SWAP2 POP PUSH2 0x1484 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x227F JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH2 0x1494 SWAP1 PUSH1 0xA PUSH2 0x227F JUMP JUMPDEST PUSH2 0x149E SWAP1 DUP4 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x14A8 SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x15C2 DUP8 DUP10 ADD DUP10 PUSH2 0x228E JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x15DE SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x15E8 SWAP1 DUP11 PUSH2 0x2076 JUMP JUMPDEST PUSH2 0x15F2 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x15FC SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1612 JUMPI PUSH2 0x1612 PUSH2 0x22DF JUMP JUMPDEST EQ PUSH2 0x163E JUMPI PUSH2 0x1639 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xED2 JUMP JUMPDEST PUSH2 0x1688 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x1682 SWAP1 DUP5 SWAP1 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x16CE PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1717 SWAP2 SWAP1 PUSH2 0x2076 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9F0 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xF2C JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x17FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x180E PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x230E JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1889 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1898 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x237A JUMP JUMPDEST PUSH2 0x18A1 SWAP2 PUSH2 0x23A4 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x18B4 DUP4 DUP10 PUSH2 0xFAE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x18C1 DUP12 PUSH2 0x1B51 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x195C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x1A04 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AC1 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1B80 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x9F0 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1ADF SWAP2 SWAP1 PUSH2 0x23EC JUMP JUMPDEST PUSH2 0x9F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1B6C JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1B78 DUP3 BASEFEE DUP4 ADD PUSH2 0x1B8F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1B78 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1BA5 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B9E JUMPI DUP2 PUSH2 0xA01 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1C1D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1C46 SWAP2 SWAP1 PUSH2 0x240E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C83 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C88 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1C99 DUP8 DUP4 DUP4 DUP8 PUSH2 0x1CA4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1D20 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1D19 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1D19 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST POP DUP2 PUSH2 0x1B78 JUMP JUMPDEST PUSH2 0x1B78 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1D35 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x71A SWAP2 SWAP1 PUSH2 0x242A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1DC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1DCE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x1DDE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x1DEE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x1DFE DUP2 PUSH2 0x1D9E JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E27 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1E4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1E55 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1E65 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E94 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1EA4 DUP2 PUSH2 0x1D7C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1D75 DUP2 PUSH2 0x1D7C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1EE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1EF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1F31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1F43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FCA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1FB2 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xA32 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1FF3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1FAF JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2038 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1FDB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2089 JUMPI PUSH2 0x2089 PUSH2 0x2047 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x20B9 JUMPI PUSH2 0x20B9 PUSH2 0x2047 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1D75 DUP2 PUSH2 0x1D9E JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x2134 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x211A JUMPI PUSH2 0x211A PUSH2 0x2047 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x2127 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x20E0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x214B JUMPI POP PUSH1 0x1 PUSH2 0xA04 JUMP JUMPDEST DUP2 PUSH2 0x2158 JUMPI POP PUSH1 0x0 PUSH2 0xA04 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x216E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x2178 JUMPI PUSH2 0x2194 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0xA04 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x2189 JUMPI PUSH2 0x2189 PUSH2 0x2047 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0xA04 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x21B7 JUMPI POP DUP2 DUP2 EXP PUSH2 0xA04 JUMP JUMPDEST PUSH2 0x21C1 DUP4 DUP4 PUSH2 0x20DB JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x21F3 JUMPI PUSH2 0x21F3 PUSH2 0x2047 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 DUP4 DUP4 PUSH2 0x213C JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x223F JUMPI PUSH2 0x223F PUSH2 0x2047 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x227A JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x213C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x22A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x22B1 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x22C1 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2343 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x235E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x2373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x238A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2397 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x23E4 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1D75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2420 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1FAF JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0xA01 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1FDB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCE SHR 0xDF 0x4E SLT 0xAF 0xE4 ADDMOD 0x23 KECCAK256 0xEE SWAP15 0xD 0xC9 ADDRESS SELFDESTRUCT 0xED CHAINID 0xE8 0xC1 0xD8 0xE1 PUSH26 0x6042EF54B8861FD28164736F6C634300080F0033000000000000 ","sourceMap":"109:380:103:-:0;;;184:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;269:11;282:14;269:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;2450:29:65;::::1;2442:80;;;::::0;-1:-1:-1;;;2442:80:65;;822:2:111;2442:80:65::1;::::0;::::1;804:21:111::0;861:2;841:18;;;834:30;900:34;880:18;;;873:62;-1:-1:-1;;;951:18:111;;;944:36;997:19;;2442:80:65::1;;;;;;;;2604:20;4751:10:::0;4739:23;;;;:11;:23;;;;;4765:12;4739:38;;4692:92;2604:20:::1;2685:42;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;2685:42:65;;::::1;::::0;;1994::::1;2685;::::0;;::::1;::::0;;;2724:2:::1;2685:42:::0;;;;;;-1:-1:-1;2667:15:65;;;;:7:::1;:15:::0;;:60;;:15;:60;;;;::::1;-1:-1:-1::0;;;;;;2667:60:65;;::::1;::::0;;;::::1;::::0;;;;;;;;2685:42:::1;2667:60;-1:-1:-1::0;;;2667:60:65::1;-1:-1:-1::0;;;;;;2667:60:65;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;109:380:103;;-1:-1:-1;;109:380:103;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:452::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;392:9;386:16;411:44;449:5;411:44;:::i;:::-;524:2;509:18;;503:25;474:5;;-1:-1:-1;537:46:111;503:25;537:46;:::i;:::-;602:7;592:17;;;163:452;;;;;:::o;620:402::-;109:380:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_11191":{"entryPoint":null,"id":11191,"parameterSlots":0,"returnSlots":0},"@L2_ETH_11203":{"entryPoint":null,"id":11203,"parameterSlots":0,"returnSlots":0},"@L2_ETH_ADDRESS_11197":{"entryPoint":null,"id":11197,"parameterSlots":0,"returnSlots":0},"@QUOTE_USD_11194":{"entryPoint":null,"id":11194,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":6751,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":3691,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_11778":{"entryPoint":5552,"id":11778,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":5419,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":5302,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_11691":{"entryPoint":6014,"id":11691,"parameterSlots":3,"returnSlots":2},"@addDepositFor_11356":{"entryPoint":2233,"id":11356,"parameterSlots":3,"returnSlots":0},"@addStake_7469":{"entryPoint":1499,"id":7469,"parameterSlots":1,"returnSlots":0},"@addToken_11305":{"entryPoint":1677,"id":11305,"parameterSlots":4,"returnSlots":0},"@balances_11225":{"entryPoint":null,"id":11225,"parameterSlots":0,"returnSlots":0},"@depositInfo_11384":{"entryPoint":null,"id":11384,"parameterSlots":2,"returnSlots":2},"@deposit_7433":{"entryPoint":3363,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":7077,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":7040,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPrice_11050":{"entryPoint":6993,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":2920,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEthTest_20244":{"entryPoint":2549,"id":20244,"parameterSlots":2,"returnSlots":1},"@getTokenValueOfEth_11583":{"entryPoint":4014,"id":11583,"parameterSlots":2,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_11409":{"entryPoint":null,"id":11409,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":7055,"id":11162,"parameterSlots":2,"returnSlots":1},"@oracles_11218":{"entryPoint":null,"id":11218,"parameterSlots":0,"returnSlots":0},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":2590,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":2570,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":3794,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":5928,"id":4512,"parameterSlots":3,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":3499,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_11229":{"entryPoint":null,"id":11229,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":2616,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_11397":{"entryPoint":null,"id":11397,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":3656,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":7332,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":2748,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":2081,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_11455":{"entryPoint":3102,"id":11455,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":7855,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":8846,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7689,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":9196,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419t_address":{"entryPoint":7798,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256":{"entryPoint":7733,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8":{"entryPoint":7597,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":7884,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_int256_fromMemory":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":8027,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":8334,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":7503,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint8_fromMemory":{"entryPoint":8382,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":8155,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":9230,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":8229,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":9258,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8974,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":9082,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":8310,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":8772,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":8411,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":8699,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":8831,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":8508,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":8711,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":8359,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":9124,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":8111,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":8263,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":8927,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_contract_IERC20":{"entryPoint":7548,"id":null,"parameterSlots":1,"returnSlots":0},"validator_revert_uint8":{"entryPoint":7582,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:21195:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_contract_IERC20","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"505:71:111","statements":[{"body":{"nodeType":"YulBlock","src":"554:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"563:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"566:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"556:6:111"},"nodeType":"YulFunctionCall","src":"556:12:111"},"nodeType":"YulExpressionStatement","src":"556:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"528:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"539:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"546:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"535:3:111"},"nodeType":"YulFunctionCall","src":"535:16:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"525:2:111"},"nodeType":"YulFunctionCall","src":"525:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"518:6:111"},"nodeType":"YulFunctionCall","src":"518:35:111"},"nodeType":"YulIf","src":"515:55:111"}]},"name":"validator_revert_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"494:5:111","type":""}],"src":"462:114:111"},{"body":{"nodeType":"YulBlock","src":"735:572:111","statements":[{"body":{"nodeType":"YulBlock","src":"782:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"791:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"794:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"784:6:111"},"nodeType":"YulFunctionCall","src":"784:12:111"},"nodeType":"YulExpressionStatement","src":"784:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"756:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"765:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"752:3:111"},"nodeType":"YulFunctionCall","src":"752:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"777:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"748:3:111"},"nodeType":"YulFunctionCall","src":"748:33:111"},"nodeType":"YulIf","src":"745:53:111"},{"nodeType":"YulVariableDeclaration","src":"807:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"833:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"820:12:111"},"nodeType":"YulFunctionCall","src":"820:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"811:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"885:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"852:32:111"},"nodeType":"YulFunctionCall","src":"852:39:111"},"nodeType":"YulExpressionStatement","src":"852:39:111"},{"nodeType":"YulAssignment","src":"900:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"910:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"900:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"924:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"956:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"967:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"952:3:111"},"nodeType":"YulFunctionCall","src":"952:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"939:12:111"},"nodeType":"YulFunctionCall","src":"939:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"928:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1013:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"980:32:111"},"nodeType":"YulFunctionCall","src":"980:41:111"},"nodeType":"YulExpressionStatement","src":"980:41:111"},{"nodeType":"YulAssignment","src":"1030:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1040:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1030:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1056:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1088:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1099:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1084:3:111"},"nodeType":"YulFunctionCall","src":"1084:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1071:12:111"},"nodeType":"YulFunctionCall","src":"1071:32:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"1060:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"1145:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"1112:32:111"},"nodeType":"YulFunctionCall","src":"1112:41:111"},"nodeType":"YulExpressionStatement","src":"1112:41:111"},{"nodeType":"YulAssignment","src":"1162:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"1172:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1162:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1188:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1220:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1231:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1216:3:111"},"nodeType":"YulFunctionCall","src":"1216:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1203:12:111"},"nodeType":"YulFunctionCall","src":"1203:32:111"},"variables":[{"name":"value_3","nodeType":"YulTypedName","src":"1192:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_3","nodeType":"YulIdentifier","src":"1267:7:111"}],"functionName":{"name":"validator_revert_uint8","nodeType":"YulIdentifier","src":"1244:22:111"},"nodeType":"YulFunctionCall","src":"1244:31:111"},"nodeType":"YulExpressionStatement","src":"1244:31:111"},{"nodeType":"YulAssignment","src":"1284:17:111","value":{"name":"value_3","nodeType":"YulIdentifier","src":"1294:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"1284:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"677:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"688:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"700:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"708:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"716:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"724:6:111","type":""}],"src":"581:726:111"},{"body":{"nodeType":"YulBlock","src":"1407:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"1453:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1462:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1465:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1455:6:111"},"nodeType":"YulFunctionCall","src":"1455:12:111"},"nodeType":"YulExpressionStatement","src":"1455:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1428:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1437:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1424:3:111"},"nodeType":"YulFunctionCall","src":"1424:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1449:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1420:3:111"},"nodeType":"YulFunctionCall","src":"1420:32:111"},"nodeType":"YulIf","src":"1417:52:111"},{"nodeType":"YulVariableDeclaration","src":"1478:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1504:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1491:12:111"},"nodeType":"YulFunctionCall","src":"1491:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1482:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1556:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"1523:32:111"},"nodeType":"YulFunctionCall","src":"1523:39:111"},"nodeType":"YulExpressionStatement","src":"1523:39:111"},{"nodeType":"YulAssignment","src":"1571:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1581:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1571:6:111"}]},{"nodeType":"YulAssignment","src":"1595:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1622:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1633:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1618:3:111"},"nodeType":"YulFunctionCall","src":"1618:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1605:12:111"},"nodeType":"YulFunctionCall","src":"1605:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1595:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1365:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1376:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1388:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1396:6:111","type":""}],"src":"1312:331:111"},{"body":{"nodeType":"YulBlock","src":"1749:125:111","statements":[{"nodeType":"YulAssignment","src":"1759:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1771:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1782:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1767:3:111"},"nodeType":"YulFunctionCall","src":"1767:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1759:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1801:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1816:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1824:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1812:3:111"},"nodeType":"YulFunctionCall","src":"1812:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1794:6:111"},"nodeType":"YulFunctionCall","src":"1794:74:111"},"nodeType":"YulExpressionStatement","src":"1794:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1718:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1729:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1740:4:111","type":""}],"src":"1648:226:111"},{"body":{"nodeType":"YulBlock","src":"1995:125:111","statements":[{"nodeType":"YulAssignment","src":"2005:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2017:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2028:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2013:3:111"},"nodeType":"YulFunctionCall","src":"2013:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2005:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2047:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2062:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2070:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2058:3:111"},"nodeType":"YulFunctionCall","src":"2058:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2040:6:111"},"nodeType":"YulFunctionCall","src":"2040:74:111"},"nodeType":"YulExpressionStatement","src":"2040:74:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1964:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1975:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1986:4:111","type":""}],"src":"1879:241:111"},{"body":{"nodeType":"YulBlock","src":"2244:368:111","statements":[{"body":{"nodeType":"YulBlock","src":"2290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2292:6:111"},"nodeType":"YulFunctionCall","src":"2292:12:111"},"nodeType":"YulExpressionStatement","src":"2292:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2265:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2274:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2261:3:111"},"nodeType":"YulFunctionCall","src":"2261:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2286:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2257:3:111"},"nodeType":"YulFunctionCall","src":"2257:32:111"},"nodeType":"YulIf","src":"2254:52:111"},{"nodeType":"YulVariableDeclaration","src":"2315:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2341:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2328:12:111"},"nodeType":"YulFunctionCall","src":"2328:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2319:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2393:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2360:32:111"},"nodeType":"YulFunctionCall","src":"2360:39:111"},"nodeType":"YulExpressionStatement","src":"2360:39:111"},{"nodeType":"YulAssignment","src":"2408:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2418:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2408:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2432:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2475:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2460:3:111"},"nodeType":"YulFunctionCall","src":"2460:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2447:12:111"},"nodeType":"YulFunctionCall","src":"2447:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2436:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2521:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2488:32:111"},"nodeType":"YulFunctionCall","src":"2488:41:111"},"nodeType":"YulExpressionStatement","src":"2488:41:111"},{"nodeType":"YulAssignment","src":"2538:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2548:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2538:6:111"}]},{"nodeType":"YulAssignment","src":"2564:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2591:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2602:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2587:3:111"},"nodeType":"YulFunctionCall","src":"2587:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2574:12:111"},"nodeType":"YulFunctionCall","src":"2574:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2564:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2194:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2205:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2217:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2225:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2233:6:111","type":""}],"src":"2125:487:111"},{"body":{"nodeType":"YulBlock","src":"2719:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"2765:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2774:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2777:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2767:6:111"},"nodeType":"YulFunctionCall","src":"2767:12:111"},"nodeType":"YulExpressionStatement","src":"2767:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2740:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2749:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2736:3:111"},"nodeType":"YulFunctionCall","src":"2736:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2761:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2732:3:111"},"nodeType":"YulFunctionCall","src":"2732:32:111"},"nodeType":"YulIf","src":"2729:52:111"},{"nodeType":"YulVariableDeclaration","src":"2790:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2816:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2803:12:111"},"nodeType":"YulFunctionCall","src":"2803:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2794:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2868:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2835:32:111"},"nodeType":"YulFunctionCall","src":"2835:39:111"},"nodeType":"YulExpressionStatement","src":"2835:39:111"},{"nodeType":"YulAssignment","src":"2883:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2893:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2883:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2907:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2939:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2950:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2935:3:111"},"nodeType":"YulFunctionCall","src":"2935:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2922:12:111"},"nodeType":"YulFunctionCall","src":"2922:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2911:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2996:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"2963:32:111"},"nodeType":"YulFunctionCall","src":"2963:41:111"},"nodeType":"YulExpressionStatement","src":"2963:41:111"},{"nodeType":"YulAssignment","src":"3013:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"3023:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3013:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2677:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2688:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2700:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2708:6:111","type":""}],"src":"2617:419:111"},{"body":{"nodeType":"YulBlock","src":"3170:119:111","statements":[{"nodeType":"YulAssignment","src":"3180:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3192:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3203:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3188:3:111"},"nodeType":"YulFunctionCall","src":"3188:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3180:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3222:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3233:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3215:6:111"},"nodeType":"YulFunctionCall","src":"3215:25:111"},"nodeType":"YulExpressionStatement","src":"3215:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3260:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3271:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3256:3:111"},"nodeType":"YulFunctionCall","src":"3256:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"3276:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3249:6:111"},"nodeType":"YulFunctionCall","src":"3249:34:111"},"nodeType":"YulExpressionStatement","src":"3249:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3131:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3142:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3150:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3161:4:111","type":""}],"src":"3041:248:111"},{"body":{"nodeType":"YulBlock","src":"3364:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3410:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3419:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3422:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3412:6:111"},"nodeType":"YulFunctionCall","src":"3412:12:111"},"nodeType":"YulExpressionStatement","src":"3412:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3385:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3394:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3381:3:111"},"nodeType":"YulFunctionCall","src":"3381:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3406:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3377:3:111"},"nodeType":"YulFunctionCall","src":"3377:32:111"},"nodeType":"YulIf","src":"3374:52:111"},{"nodeType":"YulVariableDeclaration","src":"3435:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3461:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3448:12:111"},"nodeType":"YulFunctionCall","src":"3448:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3439:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3513:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"3480:32:111"},"nodeType":"YulFunctionCall","src":"3480:39:111"},"nodeType":"YulExpressionStatement","src":"3480:39:111"},{"nodeType":"YulAssignment","src":"3528:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3538:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3528:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3330:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3341:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3353:6:111","type":""}],"src":"3294:255:111"},{"body":{"nodeType":"YulBlock","src":"3655:76:111","statements":[{"nodeType":"YulAssignment","src":"3665:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3677:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3688:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3673:3:111"},"nodeType":"YulFunctionCall","src":"3673:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3665:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3707:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3718:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3700:6:111"},"nodeType":"YulFunctionCall","src":"3700:25:111"},"nodeType":"YulExpressionStatement","src":"3700:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3624:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3635:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3646:4:111","type":""}],"src":"3554:177:111"},{"body":{"nodeType":"YulBlock","src":"3838:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"3884:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3893:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3896:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3886:6:111"},"nodeType":"YulFunctionCall","src":"3886:12:111"},"nodeType":"YulExpressionStatement","src":"3886:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3859:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3868:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3855:3:111"},"nodeType":"YulFunctionCall","src":"3855:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3880:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3851:3:111"},"nodeType":"YulFunctionCall","src":"3851:32:111"},"nodeType":"YulIf","src":"3848:52:111"},{"nodeType":"YulVariableDeclaration","src":"3909:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3935:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3922:12:111"},"nodeType":"YulFunctionCall","src":"3922:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3913:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3987:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"3954:32:111"},"nodeType":"YulFunctionCall","src":"3954:39:111"},"nodeType":"YulExpressionStatement","src":"3954:39:111"},{"nodeType":"YulAssignment","src":"4002:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4012:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4002:6:111"}]},{"nodeType":"YulAssignment","src":"4026:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4053:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4064:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4049:3:111"},"nodeType":"YulFunctionCall","src":"4049:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4036:12:111"},"nodeType":"YulFunctionCall","src":"4036:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4026:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3796:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3807:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3819:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3827:6:111","type":""}],"src":"3736:338:111"},{"body":{"nodeType":"YulBlock","src":"4218:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"4264:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4273:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4276:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4266:6:111"},"nodeType":"YulFunctionCall","src":"4266:12:111"},"nodeType":"YulExpressionStatement","src":"4266:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4239:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4248:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4235:3:111"},"nodeType":"YulFunctionCall","src":"4235:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4260:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4231:3:111"},"nodeType":"YulFunctionCall","src":"4231:32:111"},"nodeType":"YulIf","src":"4228:52:111"},{"nodeType":"YulVariableDeclaration","src":"4289:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4315:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4302:12:111"},"nodeType":"YulFunctionCall","src":"4302:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4293:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4358:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4367:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4370:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4360:6:111"},"nodeType":"YulFunctionCall","src":"4360:12:111"},"nodeType":"YulExpressionStatement","src":"4360:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4347:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4354:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4344:2:111"},"nodeType":"YulFunctionCall","src":"4344:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4337:6:111"},"nodeType":"YulFunctionCall","src":"4337:20:111"},"nodeType":"YulIf","src":"4334:40:111"},{"nodeType":"YulAssignment","src":"4383:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4393:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4383:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4407:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4438:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4449:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4434:3:111"},"nodeType":"YulFunctionCall","src":"4434:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4421:12:111"},"nodeType":"YulFunctionCall","src":"4421:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4411:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4462:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4472:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4466:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4517:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4526:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4529:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4519:6:111"},"nodeType":"YulFunctionCall","src":"4519:12:111"},"nodeType":"YulExpressionStatement","src":"4519:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4505:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4513:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4502:2:111"},"nodeType":"YulFunctionCall","src":"4502:14:111"},"nodeType":"YulIf","src":"4499:34:111"},{"nodeType":"YulVariableDeclaration","src":"4542:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4556:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4567:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4552:3:111"},"nodeType":"YulFunctionCall","src":"4552:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"4546:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4622:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4631:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4634:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4624:6:111"},"nodeType":"YulFunctionCall","src":"4624:12:111"},"nodeType":"YulExpressionStatement","src":"4624:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4601:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4605:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4597:3:111"},"nodeType":"YulFunctionCall","src":"4597:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4612:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4593:3:111"},"nodeType":"YulFunctionCall","src":"4593:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4586:6:111"},"nodeType":"YulFunctionCall","src":"4586:35:111"},"nodeType":"YulIf","src":"4583:55:111"},{"nodeType":"YulVariableDeclaration","src":"4647:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4674:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4661:12:111"},"nodeType":"YulFunctionCall","src":"4661:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"4651:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4704:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4713:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4716:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4706:6:111"},"nodeType":"YulFunctionCall","src":"4706:12:111"},"nodeType":"YulExpressionStatement","src":"4706:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"4692:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4700:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4689:2:111"},"nodeType":"YulFunctionCall","src":"4689:14:111"},"nodeType":"YulIf","src":"4686:34:111"},{"body":{"nodeType":"YulBlock","src":"4770:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4779:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4782:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4772:6:111"},"nodeType":"YulFunctionCall","src":"4772:12:111"},"nodeType":"YulExpressionStatement","src":"4772:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4743:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"4747:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4739:3:111"},"nodeType":"YulFunctionCall","src":"4739:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"4756:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4735:3:111"},"nodeType":"YulFunctionCall","src":"4735:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4761:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4732:2:111"},"nodeType":"YulFunctionCall","src":"4732:37:111"},"nodeType":"YulIf","src":"4729:57:111"},{"nodeType":"YulAssignment","src":"4795:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"4809:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"4813:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4805:3:111"},"nodeType":"YulFunctionCall","src":"4805:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4795:6:111"}]},{"nodeType":"YulAssignment","src":"4825:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"4835:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4825:6:111"}]},{"nodeType":"YulAssignment","src":"4850:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4877:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4888:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4873:3:111"},"nodeType":"YulFunctionCall","src":"4873:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4860:12:111"},"nodeType":"YulFunctionCall","src":"4860:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4850:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4160:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4171:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4183:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4191:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4199:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4207:6:111","type":""}],"src":"4079:819:111"},{"body":{"nodeType":"YulBlock","src":"4988:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5034:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5043:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5046:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5036:6:111"},"nodeType":"YulFunctionCall","src":"5036:12:111"},"nodeType":"YulExpressionStatement","src":"5036:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5009:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5018:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5005:3:111"},"nodeType":"YulFunctionCall","src":"5005:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5030:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5001:3:111"},"nodeType":"YulFunctionCall","src":"5001:32:111"},"nodeType":"YulIf","src":"4998:52:111"},{"nodeType":"YulVariableDeclaration","src":"5059:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5085:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5072:12:111"},"nodeType":"YulFunctionCall","src":"5072:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5063:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5137:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"5104:32:111"},"nodeType":"YulFunctionCall","src":"5104:39:111"},"nodeType":"YulExpressionStatement","src":"5104:39:111"},{"nodeType":"YulAssignment","src":"5152:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5162:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5152:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4954:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4965:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4977:6:111","type":""}],"src":"4903:270:111"},{"body":{"nodeType":"YulBlock","src":"5351:252:111","statements":[{"nodeType":"YulAssignment","src":"5361:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5373:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5384:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5369:3:111"},"nodeType":"YulFunctionCall","src":"5369:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5361:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"5396:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"5406:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5400:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5464:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5479:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5487:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5475:3:111"},"nodeType":"YulFunctionCall","src":"5475:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5457:6:111"},"nodeType":"YulFunctionCall","src":"5457:34:111"},"nodeType":"YulExpressionStatement","src":"5457:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5511:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5522:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5507:3:111"},"nodeType":"YulFunctionCall","src":"5507:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"5531:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5539:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5527:3:111"},"nodeType":"YulFunctionCall","src":"5527:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5500:6:111"},"nodeType":"YulFunctionCall","src":"5500:43:111"},"nodeType":"YulExpressionStatement","src":"5500:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5563:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5574:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5559:3:111"},"nodeType":"YulFunctionCall","src":"5559:18:111"},{"arguments":[{"name":"value2","nodeType":"YulIdentifier","src":"5583:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5591:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5579:3:111"},"nodeType":"YulFunctionCall","src":"5579:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5552:6:111"},"nodeType":"YulFunctionCall","src":"5552:45:111"},"nodeType":"YulExpressionStatement","src":"5552:45:111"}]},"name":"abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5304:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"5315:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5323:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5331:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5342:4:111","type":""}],"src":"5178:425:111"},{"body":{"nodeType":"YulBlock","src":"5730:125:111","statements":[{"nodeType":"YulAssignment","src":"5740:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5752:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5763:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5748:3:111"},"nodeType":"YulFunctionCall","src":"5748:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5740:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5782:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5797:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5805:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5793:3:111"},"nodeType":"YulFunctionCall","src":"5793:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5775:6:111"},"nodeType":"YulFunctionCall","src":"5775:74:111"},"nodeType":"YulExpressionStatement","src":"5775:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5699:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5710:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5721:4:111","type":""}],"src":"5608:247:111"},{"body":{"nodeType":"YulBlock","src":"5938:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5984:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5993:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5996:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5986:6:111"},"nodeType":"YulFunctionCall","src":"5986:12:111"},"nodeType":"YulExpressionStatement","src":"5986:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5959:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5968:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5955:3:111"},"nodeType":"YulFunctionCall","src":"5955:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5980:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5951:3:111"},"nodeType":"YulFunctionCall","src":"5951:32:111"},"nodeType":"YulIf","src":"5948:52:111"},{"nodeType":"YulVariableDeclaration","src":"6009:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6035:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6022:12:111"},"nodeType":"YulFunctionCall","src":"6022:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6013:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6087:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"6054:32:111"},"nodeType":"YulFunctionCall","src":"6054:39:111"},"nodeType":"YulExpressionStatement","src":"6054:39:111"},{"nodeType":"YulAssignment","src":"6102:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6112:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6102:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5904:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5915:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5927:6:111","type":""}],"src":"5860:263:111"},{"body":{"nodeType":"YulBlock","src":"6266:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"6312:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6321:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6324:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6314:6:111"},"nodeType":"YulFunctionCall","src":"6314:12:111"},"nodeType":"YulExpressionStatement","src":"6314:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6287:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6296:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6283:3:111"},"nodeType":"YulFunctionCall","src":"6283:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6308:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6279:3:111"},"nodeType":"YulFunctionCall","src":"6279:32:111"},"nodeType":"YulIf","src":"6276:52:111"},{"nodeType":"YulVariableDeclaration","src":"6337:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6364:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6351:12:111"},"nodeType":"YulFunctionCall","src":"6351:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6341:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6417:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6426:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6429:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6419:6:111"},"nodeType":"YulFunctionCall","src":"6419:12:111"},"nodeType":"YulExpressionStatement","src":"6419:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6389:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6397:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6386:2:111"},"nodeType":"YulFunctionCall","src":"6386:30:111"},"nodeType":"YulIf","src":"6383:50:111"},{"nodeType":"YulVariableDeclaration","src":"6442:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6456:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6467:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6452:3:111"},"nodeType":"YulFunctionCall","src":"6452:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6446:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6513:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6522:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6525:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6515:6:111"},"nodeType":"YulFunctionCall","src":"6515:12:111"},"nodeType":"YulExpressionStatement","src":"6515:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6494:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6503:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6490:3:111"},"nodeType":"YulFunctionCall","src":"6490:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6508:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6486:3:111"},"nodeType":"YulFunctionCall","src":"6486:26:111"},"nodeType":"YulIf","src":"6483:46:111"},{"nodeType":"YulAssignment","src":"6538:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"6548:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6538:6:111"}]},{"nodeType":"YulAssignment","src":"6559:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6586:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6597:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6582:3:111"},"nodeType":"YulFunctionCall","src":"6582:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6569:12:111"},"nodeType":"YulFunctionCall","src":"6569:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6559:6:111"}]},{"nodeType":"YulAssignment","src":"6610:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6637:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6648:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6633:3:111"},"nodeType":"YulFunctionCall","src":"6633:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6620:12:111"},"nodeType":"YulFunctionCall","src":"6620:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6610:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6216:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6227:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6239:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6247:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6255:6:111","type":""}],"src":"6128:530:111"},{"body":{"nodeType":"YulBlock","src":"6716:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6726:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"6735:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"6730:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6795:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6820:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6825:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6816:3:111"},"nodeType":"YulFunctionCall","src":"6816:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6839:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"6844:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6835:3:111"},"nodeType":"YulFunctionCall","src":"6835:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6829:5:111"},"nodeType":"YulFunctionCall","src":"6829:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6809:6:111"},"nodeType":"YulFunctionCall","src":"6809:39:111"},"nodeType":"YulExpressionStatement","src":"6809:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6756:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6759:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6753:2:111"},"nodeType":"YulFunctionCall","src":"6753:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6767:19:111","statements":[{"nodeType":"YulAssignment","src":"6769:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6778:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"6781:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6774:3:111"},"nodeType":"YulFunctionCall","src":"6774:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"6769:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"6749:3:111","statements":[]},"src":"6745:113:111"},{"body":{"nodeType":"YulBlock","src":"6884:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6897:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"6902:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6893:3:111"},"nodeType":"YulFunctionCall","src":"6893:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6911:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6886:6:111"},"nodeType":"YulFunctionCall","src":"6886:27:111"},"nodeType":"YulExpressionStatement","src":"6886:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"6873:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"6876:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6870:2:111"},"nodeType":"YulFunctionCall","src":"6870:13:111"},"nodeType":"YulIf","src":"6867:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"6694:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"6699:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6704:6:111","type":""}],"src":"6663:258:111"},{"body":{"nodeType":"YulBlock","src":"6975:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"6985:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7005:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6999:5:111"},"nodeType":"YulFunctionCall","src":"6999:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"6989:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7027:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7032:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7020:6:111"},"nodeType":"YulFunctionCall","src":"7020:19:111"},"nodeType":"YulExpressionStatement","src":"7020:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7074:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7081:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7070:3:111"},"nodeType":"YulFunctionCall","src":"7070:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7092:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"7097:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7088:3:111"},"nodeType":"YulFunctionCall","src":"7088:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"7104:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"7048:21:111"},"nodeType":"YulFunctionCall","src":"7048:63:111"},"nodeType":"YulExpressionStatement","src":"7048:63:111"},{"nodeType":"YulAssignment","src":"7120:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7135:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"7148:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7156:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7144:3:111"},"nodeType":"YulFunctionCall","src":"7144:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7161:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7140:3:111"},"nodeType":"YulFunctionCall","src":"7140:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7131:3:111"},"nodeType":"YulFunctionCall","src":"7131:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"7231:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7127:3:111"},"nodeType":"YulFunctionCall","src":"7127:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"7120:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"6952:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"6959:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"6967:3:111","type":""}],"src":"6926:316:111"},{"body":{"nodeType":"YulBlock","src":"7394:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7411:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7422:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7404:6:111"},"nodeType":"YulFunctionCall","src":"7404:21:111"},"nodeType":"YulExpressionStatement","src":"7404:21:111"},{"nodeType":"YulAssignment","src":"7434:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7459:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7471:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7482:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7467:3:111"},"nodeType":"YulFunctionCall","src":"7467:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"7442:16:111"},"nodeType":"YulFunctionCall","src":"7442:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7434:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7506:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7517:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7502:3:111"},"nodeType":"YulFunctionCall","src":"7502:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7522:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7495:6:111"},"nodeType":"YulFunctionCall","src":"7495:34:111"},"nodeType":"YulExpressionStatement","src":"7495:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7355:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7366:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7374:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7385:4:111","type":""}],"src":"7247:288:111"},{"body":{"nodeType":"YulBlock","src":"7639:93:111","statements":[{"nodeType":"YulAssignment","src":"7649:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7661:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7672:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7657:3:111"},"nodeType":"YulFunctionCall","src":"7657:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7649:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7691:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7706:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7714:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7702:3:111"},"nodeType":"YulFunctionCall","src":"7702:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7684:6:111"},"nodeType":"YulFunctionCall","src":"7684:42:111"},"nodeType":"YulExpressionStatement","src":"7684:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7608:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7619:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7630:4:111","type":""}],"src":"7540:192:111"},{"body":{"nodeType":"YulBlock","src":"7911:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7928:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7939:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7921:6:111"},"nodeType":"YulFunctionCall","src":"7921:21:111"},"nodeType":"YulExpressionStatement","src":"7921:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7962:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7973:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7958:3:111"},"nodeType":"YulFunctionCall","src":"7958:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7978:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7951:6:111"},"nodeType":"YulFunctionCall","src":"7951:30:111"},"nodeType":"YulExpressionStatement","src":"7951:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8001:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8012:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7997:3:111"},"nodeType":"YulFunctionCall","src":"7997:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e636f727265637420746f6b65","kind":"string","nodeType":"YulLiteral","src":"8017:34:111","type":"","value":"DepositPaymaster: Incorrect toke"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7990:6:111"},"nodeType":"YulFunctionCall","src":"7990:62:111"},"nodeType":"YulExpressionStatement","src":"7990:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8072:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8083:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8068:3:111"},"nodeType":"YulFunctionCall","src":"8068:18:111"},{"hexValue":"6e206f7261636c65","kind":"string","nodeType":"YulLiteral","src":"8088:10:111","type":"","value":"n oracle"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8061:6:111"},"nodeType":"YulFunctionCall","src":"8061:38:111"},"nodeType":"YulExpressionStatement","src":"8061:38:111"},{"nodeType":"YulAssignment","src":"8108:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8120:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8131:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8116:3:111"},"nodeType":"YulFunctionCall","src":"8116:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8108:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7888:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7902:4:111","type":""}],"src":"7737:404:111"},{"body":{"nodeType":"YulBlock","src":"8291:168:111","statements":[{"nodeType":"YulAssignment","src":"8301:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8313:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8324:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8309:3:111"},"nodeType":"YulFunctionCall","src":"8309:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8301:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8343:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8358:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8366:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8354:3:111"},"nodeType":"YulFunctionCall","src":"8354:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8336:6:111"},"nodeType":"YulFunctionCall","src":"8336:74:111"},"nodeType":"YulExpressionStatement","src":"8336:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8430:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8441:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8426:3:111"},"nodeType":"YulFunctionCall","src":"8426:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"8446:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8419:6:111"},"nodeType":"YulFunctionCall","src":"8419:34:111"},"nodeType":"YulExpressionStatement","src":"8419:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8252:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8263:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8271:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8282:4:111","type":""}],"src":"8146:313:111"},{"body":{"nodeType":"YulBlock","src":"8638:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8655:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8666:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8648:6:111"},"nodeType":"YulFunctionCall","src":"8648:21:111"},"nodeType":"YulExpressionStatement","src":"8648:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8689:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8700:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8685:3:111"},"nodeType":"YulFunctionCall","src":"8685:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8705:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8678:6:111"},"nodeType":"YulFunctionCall","src":"8678:30:111"},"nodeType":"YulExpressionStatement","src":"8678:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8728:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8739:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8724:3:111"},"nodeType":"YulFunctionCall","src":"8724:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f","kind":"string","nodeType":"YulLiteral","src":"8744:34:111","type":"","value":"DepositPaymaster: unsupported to"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8717:6:111"},"nodeType":"YulFunctionCall","src":"8717:62:111"},"nodeType":"YulExpressionStatement","src":"8717:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8799:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8810:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8795:3:111"},"nodeType":"YulFunctionCall","src":"8795:18:111"},{"hexValue":"6b656e","kind":"string","nodeType":"YulLiteral","src":"8815:5:111","type":"","value":"ken"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8788:6:111"},"nodeType":"YulFunctionCall","src":"8788:33:111"},"nodeType":"YulExpressionStatement","src":"8788:33:111"},{"nodeType":"YulAssignment","src":"8830:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8842:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8853:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8838:3:111"},"nodeType":"YulFunctionCall","src":"8838:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8830:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8615:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8629:4:111","type":""}],"src":"8464:399:111"},{"body":{"nodeType":"YulBlock","src":"8900:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8917:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8920:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8910:6:111"},"nodeType":"YulFunctionCall","src":"8910:88:111"},"nodeType":"YulExpressionStatement","src":"8910:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9014:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9017:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9007:6:111"},"nodeType":"YulFunctionCall","src":"9007:15:111"},"nodeType":"YulExpressionStatement","src":"9007:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9038:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9041:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9031:6:111"},"nodeType":"YulFunctionCall","src":"9031:15:111"},"nodeType":"YulExpressionStatement","src":"9031:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"8868:184:111"},{"body":{"nodeType":"YulBlock","src":"9105:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"9132:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9134:16:111"},"nodeType":"YulFunctionCall","src":"9134:18:111"},"nodeType":"YulExpressionStatement","src":"9134:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9121:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9128:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"9124:3:111"},"nodeType":"YulFunctionCall","src":"9124:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9118:2:111"},"nodeType":"YulFunctionCall","src":"9118:13:111"},"nodeType":"YulIf","src":"9115:39:111"},{"nodeType":"YulAssignment","src":"9163:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9174:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9177:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9170:3:111"},"nodeType":"YulFunctionCall","src":"9170:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"9163:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9088:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9091:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"9097:3:111","type":""}],"src":"9057:128:111"},{"body":{"nodeType":"YulBlock","src":"9307:125:111","statements":[{"nodeType":"YulAssignment","src":"9317:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9329:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9340:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9325:3:111"},"nodeType":"YulFunctionCall","src":"9325:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9317:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9359:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"9374:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"9382:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9370:3:111"},"nodeType":"YulFunctionCall","src":"9370:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9352:6:111"},"nodeType":"YulFunctionCall","src":"9352:74:111"},"nodeType":"YulExpressionStatement","src":"9352:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9276:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9287:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9298:4:111","type":""}],"src":"9190:242:111"},{"body":{"nodeType":"YulBlock","src":"9518:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"9564:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9573:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9576:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9566:6:111"},"nodeType":"YulFunctionCall","src":"9566:12:111"},"nodeType":"YulExpressionStatement","src":"9566:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9539:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9548:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9535:3:111"},"nodeType":"YulFunctionCall","src":"9535:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9560:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9531:3:111"},"nodeType":"YulFunctionCall","src":"9531:32:111"},"nodeType":"YulIf","src":"9528:52:111"},{"nodeType":"YulAssignment","src":"9589:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9605:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9599:5:111"},"nodeType":"YulFunctionCall","src":"9599:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9589:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9484:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9495:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9507:6:111","type":""}],"src":"9437:184:111"},{"body":{"nodeType":"YulBlock","src":"9800:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9817:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9828:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9810:6:111"},"nodeType":"YulFunctionCall","src":"9810:21:111"},"nodeType":"YulExpressionStatement","src":"9810:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9851:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9862:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9847:3:111"},"nodeType":"YulFunctionCall","src":"9847:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9867:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9840:6:111"},"nodeType":"YulFunctionCall","src":"9840:30:111"},"nodeType":"YulExpressionStatement","src":"9840:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9890:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9901:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9886:3:111"},"nodeType":"YulFunctionCall","src":"9886:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"9906:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9879:6:111"},"nodeType":"YulFunctionCall","src":"9879:62:111"},"nodeType":"YulExpressionStatement","src":"9879:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9961:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9972:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9957:3:111"},"nodeType":"YulFunctionCall","src":"9957:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"9977:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9950:6:111"},"nodeType":"YulFunctionCall","src":"9950:39:111"},"nodeType":"YulExpressionStatement","src":"9950:39:111"},{"nodeType":"YulAssignment","src":"9998:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10010:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10021:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10006:3:111"},"nodeType":"YulFunctionCall","src":"10006:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9998:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9777:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9791:4:111","type":""}],"src":"9626:405:111"},{"body":{"nodeType":"YulBlock","src":"10085:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"10107:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"10109:16:111"},"nodeType":"YulFunctionCall","src":"10109:18:111"},"nodeType":"YulExpressionStatement","src":"10109:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"10101:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"10104:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"10098:2:111"},"nodeType":"YulFunctionCall","src":"10098:8:111"},"nodeType":"YulIf","src":"10095:34:111"},{"nodeType":"YulAssignment","src":"10138:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"10150:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"10153:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10146:3:111"},"nodeType":"YulFunctionCall","src":"10146:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"10138:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"10067:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"10070:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"10076:4:111","type":""}],"src":"10036:125:111"},{"body":{"nodeType":"YulBlock","src":"10340:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10357:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10368:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10350:6:111"},"nodeType":"YulFunctionCall","src":"10350:21:111"},"nodeType":"YulExpressionStatement","src":"10350:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10391:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10402:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10387:3:111"},"nodeType":"YulFunctionCall","src":"10387:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10407:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10380:6:111"},"nodeType":"YulFunctionCall","src":"10380:30:111"},"nodeType":"YulExpressionStatement","src":"10380:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10430:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10441:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10426:3:111"},"nodeType":"YulFunctionCall","src":"10426:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"10446:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10419:6:111"},"nodeType":"YulFunctionCall","src":"10419:62:111"},"nodeType":"YulExpressionStatement","src":"10419:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10501:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10512:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10497:3:111"},"nodeType":"YulFunctionCall","src":"10497:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"10517:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10490:6:111"},"nodeType":"YulFunctionCall","src":"10490:36:111"},"nodeType":"YulExpressionStatement","src":"10490:36:111"},{"nodeType":"YulAssignment","src":"10535:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10547:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10558:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10543:3:111"},"nodeType":"YulFunctionCall","src":"10543:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10535:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10317:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10331:4:111","type":""}],"src":"10166:402:111"},{"body":{"nodeType":"YulBlock","src":"10747:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10764:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10775:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10757:6:111"},"nodeType":"YulFunctionCall","src":"10757:21:111"},"nodeType":"YulExpressionStatement","src":"10757:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10798:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10809:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10794:3:111"},"nodeType":"YulFunctionCall","src":"10794:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10814:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10787:6:111"},"nodeType":"YulFunctionCall","src":"10787:30:111"},"nodeType":"YulExpressionStatement","src":"10787:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10837:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10848:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10833:3:111"},"nodeType":"YulFunctionCall","src":"10833:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"10853:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10826:6:111"},"nodeType":"YulFunctionCall","src":"10826:62:111"},"nodeType":"YulExpressionStatement","src":"10826:62:111"},{"nodeType":"YulAssignment","src":"10897:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10909:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10920:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10905:3:111"},"nodeType":"YulFunctionCall","src":"10905:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10897:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10724:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10738:4:111","type":""}],"src":"10573:356:111"},{"body":{"nodeType":"YulBlock","src":"11091:241:111","statements":[{"nodeType":"YulAssignment","src":"11101:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11113:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11124:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11109:3:111"},"nodeType":"YulFunctionCall","src":"11109:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11101:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"11136:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11146:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11140:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11204:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11219:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11227:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11215:3:111"},"nodeType":"YulFunctionCall","src":"11215:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11197:6:111"},"nodeType":"YulFunctionCall","src":"11197:34:111"},"nodeType":"YulExpressionStatement","src":"11197:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11251:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11262:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11247:3:111"},"nodeType":"YulFunctionCall","src":"11247:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11271:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11279:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11267:3:111"},"nodeType":"YulFunctionCall","src":"11267:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11240:6:111"},"nodeType":"YulFunctionCall","src":"11240:43:111"},"nodeType":"YulExpressionStatement","src":"11240:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11303:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11314:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11299:3:111"},"nodeType":"YulFunctionCall","src":"11299:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"11319:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11292:6:111"},"nodeType":"YulFunctionCall","src":"11292:34:111"},"nodeType":"YulExpressionStatement","src":"11292:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11044:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"11055:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11063:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11071:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11082:4:111","type":""}],"src":"10934:398:111"},{"body":{"nodeType":"YulBlock","src":"11466:198:111","statements":[{"nodeType":"YulAssignment","src":"11476:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11488:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11499:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11484:3:111"},"nodeType":"YulFunctionCall","src":"11484:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11476:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"11511:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11521:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"11515:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11579:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"11594:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11602:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11590:3:111"},"nodeType":"YulFunctionCall","src":"11590:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11572:6:111"},"nodeType":"YulFunctionCall","src":"11572:34:111"},"nodeType":"YulExpressionStatement","src":"11572:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11626:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11637:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11622:3:111"},"nodeType":"YulFunctionCall","src":"11622:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11646:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"11654:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11642:3:111"},"nodeType":"YulFunctionCall","src":"11642:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11615:6:111"},"nodeType":"YulFunctionCall","src":"11615:43:111"},"nodeType":"YulExpressionStatement","src":"11615:43:111"}]},"name":"abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11427:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"11438:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"11446:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11457:4:111","type":""}],"src":"11337:327:111"},{"body":{"nodeType":"YulBlock","src":"11749:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"11795:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11804:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11807:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11797:6:111"},"nodeType":"YulFunctionCall","src":"11797:12:111"},"nodeType":"YulExpressionStatement","src":"11797:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11770:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11779:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11766:3:111"},"nodeType":"YulFunctionCall","src":"11766:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11791:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11762:3:111"},"nodeType":"YulFunctionCall","src":"11762:32:111"},"nodeType":"YulIf","src":"11759:52:111"},{"nodeType":"YulAssignment","src":"11820:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11836:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11830:5:111"},"nodeType":"YulFunctionCall","src":"11830:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11820:6:111"}]}]},"name":"abi_decode_tuple_t_int256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11715:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11726:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11738:6:111","type":""}],"src":"11669:183:111"},{"body":{"nodeType":"YulBlock","src":"11936:168:111","statements":[{"body":{"nodeType":"YulBlock","src":"11982:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11991:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11994:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11984:6:111"},"nodeType":"YulFunctionCall","src":"11984:12:111"},"nodeType":"YulExpressionStatement","src":"11984:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11957:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11966:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11953:3:111"},"nodeType":"YulFunctionCall","src":"11953:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11978:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"11949:3:111"},"nodeType":"YulFunctionCall","src":"11949:32:111"},"nodeType":"YulIf","src":"11946:52:111"},{"nodeType":"YulVariableDeclaration","src":"12007:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12026:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12020:5:111"},"nodeType":"YulFunctionCall","src":"12020:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"12011:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"12068:5:111"}],"functionName":{"name":"validator_revert_uint8","nodeType":"YulIdentifier","src":"12045:22:111"},"nodeType":"YulFunctionCall","src":"12045:29:111"},"nodeType":"YulExpressionStatement","src":"12045:29:111"},{"nodeType":"YulAssignment","src":"12083:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"12093:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"12083:6:111"}]}]},"name":"abi_decode_tuple_t_uint8_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11902:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"11913:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"11925:6:111","type":""}],"src":"11857:247:111"},{"body":{"nodeType":"YulBlock","src":"12173:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"12183:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12198:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"12187:7:111","type":""}]},{"nodeType":"YulAssignment","src":"12208:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"12217:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12208:5:111"}]},{"nodeType":"YulAssignment","src":"12233:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"12241:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"12233:4:111"}]},{"body":{"nodeType":"YulBlock","src":"12297:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"12402:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"12404:16:111"},"nodeType":"YulFunctionCall","src":"12404:18:111"},"nodeType":"YulExpressionStatement","src":"12404:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"12317:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"12327:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"12395:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"12323:3:111"},"nodeType":"YulFunctionCall","src":"12323:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12314:2:111"},"nodeType":"YulFunctionCall","src":"12314:87:111"},"nodeType":"YulIf","src":"12311:113:111"},{"body":{"nodeType":"YulBlock","src":"12463:29:111","statements":[{"nodeType":"YulAssignment","src":"12465:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"12478:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"12485:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"12474:3:111"},"nodeType":"YulFunctionCall","src":"12474:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12465:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12444:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"12454:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12440:3:111"},"nodeType":"YulFunctionCall","src":"12440:22:111"},"nodeType":"YulIf","src":"12437:55:111"},{"nodeType":"YulAssignment","src":"12505:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"12517:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"12523:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"12513:3:111"},"nodeType":"YulFunctionCall","src":"12513:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"12505:4:111"}]},{"nodeType":"YulAssignment","src":"12541:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"12557:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"12566:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"12553:3:111"},"nodeType":"YulFunctionCall","src":"12553:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"12541:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12266:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"12276:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12263:2:111"},"nodeType":"YulFunctionCall","src":"12263:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"12285:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"12259:3:111","statements":[]},"src":"12255:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"12137:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"12144:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"12157:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"12164:4:111","type":""}],"src":"12109:482:111"},{"body":{"nodeType":"YulBlock","src":"12655:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"12693:52:111","statements":[{"nodeType":"YulAssignment","src":"12707:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12716:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12707:5:111"}]},{"nodeType":"YulLeave","src":"12730:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12675:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12668:6:111"},"nodeType":"YulFunctionCall","src":"12668:16:111"},"nodeType":"YulIf","src":"12665:80:111"},{"body":{"nodeType":"YulBlock","src":"12778:52:111","statements":[{"nodeType":"YulAssignment","src":"12792:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12801:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12792:5:111"}]},{"nodeType":"YulLeave","src":"12815:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"12764:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"12757:6:111"},"nodeType":"YulFunctionCall","src":"12757:12:111"},"nodeType":"YulIf","src":"12754:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"12866:52:111","statements":[{"nodeType":"YulAssignment","src":"12880:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12889:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"12880:5:111"}]},{"nodeType":"YulLeave","src":"12903:5:111"}]},"nodeType":"YulCase","src":"12859:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12864:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"12934:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"12969:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"12971:16:111"},"nodeType":"YulFunctionCall","src":"12971:18:111"},"nodeType":"YulExpressionStatement","src":"12971:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12954:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"12964:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"12951:2:111"},"nodeType":"YulFunctionCall","src":"12951:17:111"},"nodeType":"YulIf","src":"12948:43:111"},{"nodeType":"YulAssignment","src":"13004:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13017:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13027:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"13013:3:111"},"nodeType":"YulFunctionCall","src":"13013:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13004:5:111"}]},{"nodeType":"YulLeave","src":"13042:5:111"}]},"nodeType":"YulCase","src":"12927:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12932:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"12846:4:111"},"nodeType":"YulSwitch","src":"12839:218:111"},{"body":{"nodeType":"YulBlock","src":"13155:70:111","statements":[{"nodeType":"YulAssignment","src":"13169:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13182:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13188:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"13178:3:111"},"nodeType":"YulFunctionCall","src":"13178:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13169:5:111"}]},{"nodeType":"YulLeave","src":"13210:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13079:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"13085:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13076:2:111"},"nodeType":"YulFunctionCall","src":"13076:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13093:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13103:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13090:2:111"},"nodeType":"YulFunctionCall","src":"13090:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13072:3:111"},"nodeType":"YulFunctionCall","src":"13072:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13116:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"13122:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13113:2:111"},"nodeType":"YulFunctionCall","src":"13113:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13131:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"13141:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"13128:2:111"},"nodeType":"YulFunctionCall","src":"13128:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13109:3:111"},"nodeType":"YulFunctionCall","src":"13109:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"13069:2:111"},"nodeType":"YulFunctionCall","src":"13069:77:111"},"nodeType":"YulIf","src":"13066:159:111"},{"nodeType":"YulVariableDeclaration","src":"13234:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13276:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13282:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"13257:18:111"},"nodeType":"YulFunctionCall","src":"13257:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"13238:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"13247:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"13396:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13398:16:111"},"nodeType":"YulFunctionCall","src":"13398:18:111"},"nodeType":"YulExpressionStatement","src":"13398:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13306:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13319:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"13387:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"13315:3:111"},"nodeType":"YulFunctionCall","src":"13315:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13303:2:111"},"nodeType":"YulFunctionCall","src":"13303:92:111"},"nodeType":"YulIf","src":"13300:118:111"},{"nodeType":"YulAssignment","src":"13427:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13440:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"13449:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13436:3:111"},"nodeType":"YulFunctionCall","src":"13436:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13427:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"12626:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"12632:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"12645:5:111","type":""}],"src":"12596:866:111"},{"body":{"nodeType":"YulBlock","src":"13537:61:111","statements":[{"nodeType":"YulAssignment","src":"13547:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13577:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13583:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"13556:20:111"},"nodeType":"YulFunctionCall","src":"13556:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13547:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"13508:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"13514:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"13527:5:111","type":""}],"src":"13467:131:111"},{"body":{"nodeType":"YulBlock","src":"13655:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"13774:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13776:16:111"},"nodeType":"YulFunctionCall","src":"13776:18:111"},"nodeType":"YulExpressionStatement","src":"13776:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"13686:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13679:6:111"},"nodeType":"YulFunctionCall","src":"13679:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13672:6:111"},"nodeType":"YulFunctionCall","src":"13672:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"13694:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13701:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"13769:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"13697:3:111"},"nodeType":"YulFunctionCall","src":"13697:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13691:2:111"},"nodeType":"YulFunctionCall","src":"13691:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13668:3:111"},"nodeType":"YulFunctionCall","src":"13668:105:111"},"nodeType":"YulIf","src":"13665:131:111"},{"nodeType":"YulAssignment","src":"13805:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"13820:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"13823:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13816:3:111"},"nodeType":"YulFunctionCall","src":"13816:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"13805:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"13634:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"13637:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"13643:7:111","type":""}],"src":"13603:228:111"},{"body":{"nodeType":"YulBlock","src":"13882:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"13913:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13934:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13937:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13927:6:111"},"nodeType":"YulFunctionCall","src":"13927:88:111"},"nodeType":"YulExpressionStatement","src":"13927:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14035:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"14038:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14028:6:111"},"nodeType":"YulFunctionCall","src":"14028:15:111"},"nodeType":"YulExpressionStatement","src":"14028:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14063:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14066:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14056:6:111"},"nodeType":"YulFunctionCall","src":"14056:15:111"},"nodeType":"YulExpressionStatement","src":"14056:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"13902:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13895:6:111"},"nodeType":"YulFunctionCall","src":"13895:9:111"},"nodeType":"YulIf","src":"13892:189:111"},{"nodeType":"YulAssignment","src":"14090:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14099:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"14102:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"14095:3:111"},"nodeType":"YulFunctionCall","src":"14095:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"14090:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"13867:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"13870:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"13876:1:111","type":""}],"src":"13836:274:111"},{"body":{"nodeType":"YulBlock","src":"14183:72:111","statements":[{"nodeType":"YulAssignment","src":"14193:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14223:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"14233:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14243:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14229:3:111"},"nodeType":"YulFunctionCall","src":"14229:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"14202:20:111"},"nodeType":"YulFunctionCall","src":"14202:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14193:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"14154:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"14160:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"14173:5:111","type":""}],"src":"14115:140:111"},{"body":{"nodeType":"YulBlock","src":"14434:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14451:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14462:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14444:6:111"},"nodeType":"YulFunctionCall","src":"14444:21:111"},"nodeType":"YulExpressionStatement","src":"14444:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14485:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14496:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14481:3:111"},"nodeType":"YulFunctionCall","src":"14481:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14501:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14474:6:111"},"nodeType":"YulFunctionCall","src":"14474:30:111"},"nodeType":"YulExpressionStatement","src":"14474:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14524:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14535:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14520:3:111"},"nodeType":"YulFunctionCall","src":"14520:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"14540:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14513:6:111"},"nodeType":"YulFunctionCall","src":"14513:51:111"},"nodeType":"YulExpressionStatement","src":"14513:51:111"},{"nodeType":"YulAssignment","src":"14573:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14585:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14596:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14581:3:111"},"nodeType":"YulFunctionCall","src":"14581:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14573:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14411:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14425:4:111","type":""}],"src":"14260:345:111"},{"body":{"nodeType":"YulBlock","src":"14771:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"14818:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14827:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14830:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14820:6:111"},"nodeType":"YulFunctionCall","src":"14820:12:111"},"nodeType":"YulExpressionStatement","src":"14820:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"14792:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"14801:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14788:3:111"},"nodeType":"YulFunctionCall","src":"14788:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"14813:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"14784:3:111"},"nodeType":"YulFunctionCall","src":"14784:33:111"},"nodeType":"YulIf","src":"14781:53:111"},{"nodeType":"YulVariableDeclaration","src":"14843:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14869:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14856:12:111"},"nodeType":"YulFunctionCall","src":"14856:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"14847:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14921:5:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"14888:32:111"},"nodeType":"YulFunctionCall","src":"14888:39:111"},"nodeType":"YulExpressionStatement","src":"14888:39:111"},{"nodeType":"YulAssignment","src":"14936:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"14946:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"14936:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"14960:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14992:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15003:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14988:3:111"},"nodeType":"YulFunctionCall","src":"14988:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"14975:12:111"},"nodeType":"YulFunctionCall","src":"14975:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"14964:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"15049:7:111"}],"functionName":{"name":"validator_revert_contract_IERC20","nodeType":"YulIdentifier","src":"15016:32:111"},"nodeType":"YulFunctionCall","src":"15016:41:111"},"nodeType":"YulExpressionStatement","src":"15016:41:111"},{"nodeType":"YulAssignment","src":"15066:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"15076:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"15066:6:111"}]},{"nodeType":"YulAssignment","src":"15092:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15119:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15130:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15115:3:111"},"nodeType":"YulFunctionCall","src":"15115:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15102:12:111"},"nodeType":"YulFunctionCall","src":"15102:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"15092:6:111"}]},{"nodeType":"YulAssignment","src":"15143:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15170:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15181:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15166:3:111"},"nodeType":"YulFunctionCall","src":"15166:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15153:12:111"},"nodeType":"YulFunctionCall","src":"15153:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"15143:6:111"}]},{"nodeType":"YulAssignment","src":"15194:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15221:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15232:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15217:3:111"},"nodeType":"YulFunctionCall","src":"15217:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15204:12:111"},"nodeType":"YulFunctionCall","src":"15204:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"15194:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14705:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"14716:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"14728:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14736:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"14744:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"14752:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"14760:6:111","type":""}],"src":"14610:633:111"},{"body":{"nodeType":"YulBlock","src":"15280:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15297:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15300:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15290:6:111"},"nodeType":"YulFunctionCall","src":"15290:88:111"},"nodeType":"YulExpressionStatement","src":"15290:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15394:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"15397:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15387:6:111"},"nodeType":"YulFunctionCall","src":"15387:15:111"},"nodeType":"YulExpressionStatement","src":"15387:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15418:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15421:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15411:6:111"},"nodeType":"YulFunctionCall","src":"15411:15:111"},"nodeType":"YulExpressionStatement","src":"15411:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"15248:184:111"},{"body":{"nodeType":"YulBlock","src":"15566:168:111","statements":[{"nodeType":"YulAssignment","src":"15576:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15588:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15599:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15584:3:111"},"nodeType":"YulFunctionCall","src":"15584:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15576:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15618:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15633:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15641:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15629:3:111"},"nodeType":"YulFunctionCall","src":"15629:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15611:6:111"},"nodeType":"YulFunctionCall","src":"15611:74:111"},"nodeType":"YulExpressionStatement","src":"15611:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15705:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15716:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15701:3:111"},"nodeType":"YulFunctionCall","src":"15701:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"15721:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15694:6:111"},"nodeType":"YulFunctionCall","src":"15694:34:111"},"nodeType":"YulExpressionStatement","src":"15694:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15527:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15538:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15546:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15557:4:111","type":""}],"src":"15437:297:111"},{"body":{"nodeType":"YulBlock","src":"15913:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15930:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15941:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15923:6:111"},"nodeType":"YulFunctionCall","src":"15923:21:111"},"nodeType":"YulExpressionStatement","src":"15923:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15975:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15960:3:111"},"nodeType":"YulFunctionCall","src":"15960:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15980:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15953:6:111"},"nodeType":"YulFunctionCall","src":"15953:30:111"},"nodeType":"YulExpressionStatement","src":"15953:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16003:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16014:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15999:3:111"},"nodeType":"YulFunctionCall","src":"15999:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"16019:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15992:6:111"},"nodeType":"YulFunctionCall","src":"15992:62:111"},"nodeType":"YulExpressionStatement","src":"15992:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16074:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16085:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16070:3:111"},"nodeType":"YulFunctionCall","src":"16070:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"16090:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16063:6:111"},"nodeType":"YulFunctionCall","src":"16063:38:111"},"nodeType":"YulExpressionStatement","src":"16063:38:111"},{"nodeType":"YulAssignment","src":"16110:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16122:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16133:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16118:3:111"},"nodeType":"YulFunctionCall","src":"16118:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16110:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15890:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15904:4:111","type":""}],"src":"15739:404:111"},{"body":{"nodeType":"YulBlock","src":"16242:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"16252:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"16291:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16278:12:111"},"nodeType":"YulFunctionCall","src":"16278:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"16256:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"16451:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16460:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16463:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16453:6:111"},"nodeType":"YulFunctionCall","src":"16453:12:111"},"nodeType":"YulExpressionStatement","src":"16453:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"16326:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16354:12:111"},"nodeType":"YulFunctionCall","src":"16354:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"16370:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16350:3:111"},"nodeType":"YulFunctionCall","src":"16350:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"16381:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16346:3:111"},"nodeType":"YulFunctionCall","src":"16346:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"16322:3:111"},"nodeType":"YulFunctionCall","src":"16322:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"16315:6:111"},"nodeType":"YulFunctionCall","src":"16315:135:111"},"nodeType":"YulIf","src":"16312:155:111"},{"nodeType":"YulVariableDeclaration","src":"16476:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"16494:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"16504:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16490:3:111"},"nodeType":"YulFunctionCall","src":"16490:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"16480:6:111","type":""}]},{"nodeType":"YulAssignment","src":"16532:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"16555:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16542:12:111"},"nodeType":"YulFunctionCall","src":"16542:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"16532:6:111"}]},{"body":{"nodeType":"YulBlock","src":"16605:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16614:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16617:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16607:6:111"},"nodeType":"YulFunctionCall","src":"16607:12:111"},"nodeType":"YulExpressionStatement","src":"16607:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"16577:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16585:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16574:2:111"},"nodeType":"YulFunctionCall","src":"16574:30:111"},"nodeType":"YulIf","src":"16571:50:111"},{"nodeType":"YulAssignment","src":"16630:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"16642:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16650:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16638:3:111"},"nodeType":"YulFunctionCall","src":"16638:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"16630:4:111"}]},{"body":{"nodeType":"YulBlock","src":"16706:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16715:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16718:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16708:6:111"},"nodeType":"YulFunctionCall","src":"16708:12:111"},"nodeType":"YulExpressionStatement","src":"16708:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"16671:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16681:12:111"},"nodeType":"YulFunctionCall","src":"16681:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"16697:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16677:3:111"},"nodeType":"YulFunctionCall","src":"16677:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"16667:3:111"},"nodeType":"YulFunctionCall","src":"16667:38:111"},"nodeType":"YulIf","src":"16664:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"16199:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"16209:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"16225:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"16231:6:111","type":""}],"src":"16148:580:111"},{"body":{"nodeType":"YulBlock","src":"16907:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16924:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16935:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16917:6:111"},"nodeType":"YulFunctionCall","src":"16917:21:111"},"nodeType":"YulExpressionStatement","src":"16917:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16958:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16969:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16954:3:111"},"nodeType":"YulFunctionCall","src":"16954:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"16974:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16947:6:111"},"nodeType":"YulFunctionCall","src":"16947:30:111"},"nodeType":"YulExpressionStatement","src":"16947:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17008:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16993:3:111"},"nodeType":"YulFunctionCall","src":"16993:18:111"},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e644461","kind":"string","nodeType":"YulLiteral","src":"17013:34:111","type":"","value":"DepositPaymaster: paymasterAndDa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16986:6:111"},"nodeType":"YulFunctionCall","src":"16986:62:111"},"nodeType":"YulExpressionStatement","src":"16986:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17068:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17079:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17064:3:111"},"nodeType":"YulFunctionCall","src":"17064:18:111"},{"hexValue":"7461206d757374207370656369667920746f6b656e","kind":"string","nodeType":"YulLiteral","src":"17084:23:111","type":"","value":"ta must specify token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17057:6:111"},"nodeType":"YulFunctionCall","src":"17057:51:111"},"nodeType":"YulExpressionStatement","src":"17057:51:111"},{"nodeType":"YulAssignment","src":"17117:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17129:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17140:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17125:3:111"},"nodeType":"YulFunctionCall","src":"17125:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17117:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16884:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16898:4:111","type":""}],"src":"16733:417:111"},{"body":{"nodeType":"YulBlock","src":"17285:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"17323:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17332:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17335:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17325:6:111"},"nodeType":"YulFunctionCall","src":"17325:12:111"},"nodeType":"YulExpressionStatement","src":"17325:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"17301:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"17313:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"17298:2:111"},"nodeType":"YulFunctionCall","src":"17298:24:111"},"nodeType":"YulIf","src":"17295:44:111"},{"body":{"nodeType":"YulBlock","src":"17372:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17381:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17384:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17374:6:111"},"nodeType":"YulFunctionCall","src":"17374:12:111"},"nodeType":"YulExpressionStatement","src":"17374:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"17354:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"17364:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"17351:2:111"},"nodeType":"YulFunctionCall","src":"17351:20:111"},"nodeType":"YulIf","src":"17348:40:111"},{"nodeType":"YulAssignment","src":"17397:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"17414:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"17422:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17410:3:111"},"nodeType":"YulFunctionCall","src":"17410:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"17397:9:111"}]},{"nodeType":"YulAssignment","src":"17442:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"17459:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"17469:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17455:3:111"},"nodeType":"YulFunctionCall","src":"17455:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"17442:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"17219:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"17227:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"17235:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"17247:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"17260:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"17271:9:111","type":""}],"src":"17155:331:111"},{"body":{"nodeType":"YulBlock","src":"17592:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17602:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"17625:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17612:12:111"},"nodeType":"YulFunctionCall","src":"17612:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"17606:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17640:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"17650:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"17644:2:111","type":""}]},{"nodeType":"YulAssignment","src":"17725:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"17738:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17742:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17734:3:111"},"nodeType":"YulFunctionCall","src":"17734:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"17725:5:111"}]},{"body":{"nodeType":"YulBlock","src":"17777:80:111","statements":[{"nodeType":"YulAssignment","src":"17791:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"17808:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17820:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17827:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"17831:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17823:3:111"},"nodeType":"YulFunctionCall","src":"17823:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"17816:3:111"},"nodeType":"YulFunctionCall","src":"17816:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17838:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"17812:3:111"},"nodeType":"YulFunctionCall","src":"17812:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17804:3:111"},"nodeType":"YulFunctionCall","src":"17804:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"17844:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"17800:3:111"},"nodeType":"YulFunctionCall","src":"17800:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"17791:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"17760:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"17765:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"17757:2:111"},"nodeType":"YulFunctionCall","src":"17757:11:111"},"nodeType":"YulIf","src":"17754:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"17567:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"17574:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"17582:5:111","type":""}],"src":"17491:372:111"},{"body":{"nodeType":"YulBlock","src":"18042:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18059:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18070:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18052:6:111"},"nodeType":"YulFunctionCall","src":"18052:21:111"},"nodeType":"YulExpressionStatement","src":"18052:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18093:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18104:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18089:3:111"},"nodeType":"YulFunctionCall","src":"18089:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18109:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18082:6:111"},"nodeType":"YulFunctionCall","src":"18082:30:111"},"nodeType":"YulExpressionStatement","src":"18082:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18132:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18143:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18128:3:111"},"nodeType":"YulFunctionCall","src":"18128:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"18148:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18121:6:111"},"nodeType":"YulFunctionCall","src":"18121:62:111"},"nodeType":"YulExpressionStatement","src":"18121:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18203:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18214:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18199:3:111"},"nodeType":"YulFunctionCall","src":"18199:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"18219:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18192:6:111"},"nodeType":"YulFunctionCall","src":"18192:34:111"},"nodeType":"YulExpressionStatement","src":"18192:34:111"},{"nodeType":"YulAssignment","src":"18235:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18247:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18258:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18243:3:111"},"nodeType":"YulFunctionCall","src":"18243:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18235:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18019:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18033:4:111","type":""}],"src":"17868:400:111"},{"body":{"nodeType":"YulBlock","src":"18447:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18464:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18475:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18457:6:111"},"nodeType":"YulFunctionCall","src":"18457:21:111"},"nodeType":"YulExpressionStatement","src":"18457:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18498:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18509:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18494:3:111"},"nodeType":"YulFunctionCall","src":"18494:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18514:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18487:6:111"},"nodeType":"YulFunctionCall","src":"18487:30:111"},"nodeType":"YulExpressionStatement","src":"18487:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18537:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18548:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18533:3:111"},"nodeType":"YulFunctionCall","src":"18533:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"18553:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18526:6:111"},"nodeType":"YulFunctionCall","src":"18526:62:111"},"nodeType":"YulExpressionStatement","src":"18526:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18608:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18619:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18604:3:111"},"nodeType":"YulFunctionCall","src":"18604:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"18624:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18597:6:111"},"nodeType":"YulFunctionCall","src":"18597:31:111"},"nodeType":"YulExpressionStatement","src":"18597:31:111"},{"nodeType":"YulAssignment","src":"18637:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18649:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18660:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18645:3:111"},"nodeType":"YulFunctionCall","src":"18645:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18637:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18424:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18438:4:111","type":""}],"src":"18273:397:111"},{"body":{"nodeType":"YulBlock","src":"18903:329:111","statements":[{"nodeType":"YulAssignment","src":"18913:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18925:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18936:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18921:3:111"},"nodeType":"YulFunctionCall","src":"18921:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18913:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"18949:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18959:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"18953:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19017:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"19032:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"19040:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19028:3:111"},"nodeType":"YulFunctionCall","src":"19028:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19010:6:111"},"nodeType":"YulFunctionCall","src":"19010:34:111"},"nodeType":"YulExpressionStatement","src":"19010:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19064:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19075:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19060:3:111"},"nodeType":"YulFunctionCall","src":"19060:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"19084:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"19092:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19080:3:111"},"nodeType":"YulFunctionCall","src":"19080:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19053:6:111"},"nodeType":"YulFunctionCall","src":"19053:43:111"},"nodeType":"YulExpressionStatement","src":"19053:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19116:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19127:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19112:3:111"},"nodeType":"YulFunctionCall","src":"19112:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"19132:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19105:6:111"},"nodeType":"YulFunctionCall","src":"19105:34:111"},"nodeType":"YulExpressionStatement","src":"19105:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19159:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19170:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19155:3:111"},"nodeType":"YulFunctionCall","src":"19155:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"19175:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19148:6:111"},"nodeType":"YulFunctionCall","src":"19148:34:111"},"nodeType":"YulExpressionStatement","src":"19148:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19202:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19213:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19198:3:111"},"nodeType":"YulFunctionCall","src":"19198:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"19219:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19191:6:111"},"nodeType":"YulFunctionCall","src":"19191:35:111"},"nodeType":"YulExpressionStatement","src":"19191:35:111"}]},"name":"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18840:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"18851:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"18859:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"18867:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"18875:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"18883:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18894:4:111","type":""}],"src":"18675:557:111"},{"body":{"nodeType":"YulBlock","src":"19315:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"19361:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19370:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19373:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19363:6:111"},"nodeType":"YulFunctionCall","src":"19363:12:111"},"nodeType":"YulExpressionStatement","src":"19363:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"19336:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"19345:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19332:3:111"},"nodeType":"YulFunctionCall","src":"19332:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"19357:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"19328:3:111"},"nodeType":"YulFunctionCall","src":"19328:32:111"},"nodeType":"YulIf","src":"19325:52:111"},{"nodeType":"YulVariableDeclaration","src":"19386:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19405:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19399:5:111"},"nodeType":"YulFunctionCall","src":"19399:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"19390:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"19468:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19477:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19480:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19470:6:111"},"nodeType":"YulFunctionCall","src":"19470:12:111"},"nodeType":"YulExpressionStatement","src":"19470:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19437:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19458:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19451:6:111"},"nodeType":"YulFunctionCall","src":"19451:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19444:6:111"},"nodeType":"YulFunctionCall","src":"19444:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"19434:2:111"},"nodeType":"YulFunctionCall","src":"19434:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19427:6:111"},"nodeType":"YulFunctionCall","src":"19427:40:111"},"nodeType":"YulIf","src":"19424:60:111"},{"nodeType":"YulAssignment","src":"19493:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"19503:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"19493:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19281:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"19292:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"19304:6:111","type":""}],"src":"19237:277:111"},{"body":{"nodeType":"YulBlock","src":"19693:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19721:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19703:6:111"},"nodeType":"YulFunctionCall","src":"19703:21:111"},"nodeType":"YulExpressionStatement","src":"19703:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19744:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19755:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19740:3:111"},"nodeType":"YulFunctionCall","src":"19740:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19760:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19733:6:111"},"nodeType":"YulFunctionCall","src":"19733:30:111"},"nodeType":"YulExpressionStatement","src":"19733:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19783:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19794:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19779:3:111"},"nodeType":"YulFunctionCall","src":"19779:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"19799:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19772:6:111"},"nodeType":"YulFunctionCall","src":"19772:62:111"},"nodeType":"YulExpressionStatement","src":"19772:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19865:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19850:3:111"},"nodeType":"YulFunctionCall","src":"19850:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"19870:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19843:6:111"},"nodeType":"YulFunctionCall","src":"19843:40:111"},"nodeType":"YulExpressionStatement","src":"19843:40:111"},{"nodeType":"YulAssignment","src":"19892:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19904:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19915:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19900:3:111"},"nodeType":"YulFunctionCall","src":"19900:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19892:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19670:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19684:4:111","type":""}],"src":"19519:406:111"},{"body":{"nodeType":"YulBlock","src":"20104:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20121:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20132:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20114:6:111"},"nodeType":"YulFunctionCall","src":"20114:21:111"},"nodeType":"YulExpressionStatement","src":"20114:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20155:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20166:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20151:3:111"},"nodeType":"YulFunctionCall","src":"20151:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20171:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20144:6:111"},"nodeType":"YulFunctionCall","src":"20144:30:111"},"nodeType":"YulExpressionStatement","src":"20144:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20194:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20205:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20190:3:111"},"nodeType":"YulFunctionCall","src":"20190:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"20210:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20183:6:111"},"nodeType":"YulFunctionCall","src":"20183:62:111"},"nodeType":"YulExpressionStatement","src":"20183:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20276:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20261:3:111"},"nodeType":"YulFunctionCall","src":"20261:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"20281:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20254:6:111"},"nodeType":"YulFunctionCall","src":"20254:36:111"},"nodeType":"YulExpressionStatement","src":"20254:36:111"},{"nodeType":"YulAssignment","src":"20299:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20311:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20322:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20307:3:111"},"nodeType":"YulFunctionCall","src":"20307:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20299:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20081:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20095:4:111","type":""}],"src":"19930:402:111"},{"body":{"nodeType":"YulBlock","src":"20474:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"20484:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20504:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20498:5:111"},"nodeType":"YulFunctionCall","src":"20498:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"20488:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20546:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"20554:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20542:3:111"},"nodeType":"YulFunctionCall","src":"20542:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"20561:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20566:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"20520:21:111"},"nodeType":"YulFunctionCall","src":"20520:53:111"},"nodeType":"YulExpressionStatement","src":"20520:53:111"},{"nodeType":"YulAssignment","src":"20582:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"20593:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"20598:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20589:3:111"},"nodeType":"YulFunctionCall","src":"20589:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"20582:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"20450:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20455:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"20466:3:111","type":""}],"src":"20337:274:111"},{"body":{"nodeType":"YulBlock","src":"20790:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20807:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20818:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20800:6:111"},"nodeType":"YulFunctionCall","src":"20800:21:111"},"nodeType":"YulExpressionStatement","src":"20800:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20852:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20837:3:111"},"nodeType":"YulFunctionCall","src":"20837:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"20857:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20830:6:111"},"nodeType":"YulFunctionCall","src":"20830:30:111"},"nodeType":"YulExpressionStatement","src":"20830:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20880:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20891:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20876:3:111"},"nodeType":"YulFunctionCall","src":"20876:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"20896:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20869:6:111"},"nodeType":"YulFunctionCall","src":"20869:59:111"},"nodeType":"YulExpressionStatement","src":"20869:59:111"},{"nodeType":"YulAssignment","src":"20937:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20949:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20960:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20945:3:111"},"nodeType":"YulFunctionCall","src":"20945:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20937:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20767:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20781:4:111","type":""}],"src":"20616:353:111"},{"body":{"nodeType":"YulBlock","src":"21095:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21112:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21123:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21105:6:111"},"nodeType":"YulFunctionCall","src":"21105:21:111"},"nodeType":"YulExpressionStatement","src":"21105:21:111"},{"nodeType":"YulAssignment","src":"21135:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21160:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21183:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21168:3:111"},"nodeType":"YulFunctionCall","src":"21168:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"21143:16:111"},"nodeType":"YulFunctionCall","src":"21143:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21135:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21064:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"21075:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21086:4:111","type":""}],"src":"20974:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_contract_IERC20(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function validator_revert_uint8(value)\n {\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_contract$_IBobaStraw_$13138t_addresst_uint8(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_contract_IERC20(value_2)\n value2 := value_2\n let value_3 := calldataload(add(headStart, 96))\n validator_revert_uint8(value_3)\n value3 := value_3\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IBobaStraw_$13138_t_address_t_uint8__to_t_address_t_address_t_uint8__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), and(value2, 0xff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_stringliteral_9e489070427e4924971b0f8607f09df79ebb88ee94e739d13db27a06f23bc41a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: Incorrect toke\")\n mstore(add(headStart, 96), \"n oracle\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"DepositPaymaster: unsupported to\")\n mstore(add(headStart, 96), \"ken\")\n tail := add(headStart, 128)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_decode_tuple_t_int256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_decode_tuple_t_uint8_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_uint8(value)\n value0 := value\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IERC20(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_contract_IERC20(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"DepositPaymaster: paymasterAndDa\")\n mstore(add(headStart, 96), \"ta must specify token\")\n tail := add(headStart, 128)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1183},{"length":32,"start":1559},{"length":32,"start":2165},{"length":32,"start":2626},{"length":32,"start":2825},{"length":32,"start":2969},{"length":32,"start":3409},{"length":32,"start":5443}]},"linkReferences":{},"object":"6080604052600436106101a15760003560e01c80639ed0fb68116100e1578063c23f001f1161008a578063cd8f80c211610064578063cd8f80c214610563578063d0e30db014610585578063f2fde38b1461058d578063f465c77e146105ad57600080fd5b8063c23f001f146104f6578063c399ec881461052e578063cc9c837c1461054357600080fd5b8063b0d691fe116100bb578063b0d691fe1461048d578063bb9fe6bf146104c1578063c23a5cea146104d657600080fd5b80639ed0fb68146103a8578063a9a23409146103cc578063addd5099146103ec57600080fd5b8063493b01701161014e578063715018a611610128578063715018a614610352578063796d4371146103675780637b775d4d1461023b5780638da5cb5b1461037d57600080fd5b8063493b0170146102835780634a6f84cf146102f757806354fe04981461033257600080fd5b80632f3e96a71161017f5780632f3e96a7146101fb57806333032ec41461023b578063382edd9e1461026357600080fd5b80630396cb60146101a65780631a02ef76146101bb578063205c2878146101db575b600080fd5b6101b96101b4366004611d4f565b6105db565b005b3480156101c757600080fd5b506101b96101d6366004611dad565b61068d565b3480156101e757600080fd5b506101b96101f6366004611e09565b610821565b34801561020757600080fd5b5061021161034881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561024757600080fd5b5061021173420000000000000000000000000000000000000681565b34801561026f57600080fd5b506101b961027e366004611e35565b6108b9565b34801561028f57600080fd5b506102e261029e366004611e76565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b60408051928352602083019190915201610232565b34801561030357600080fd5b50610324610312366004611eaf565b60036020526000908152604090205481565b604051908152602001610232565b34801561033e57600080fd5b5061032461034d366004611e09565b6109f5565b34801561035e57600080fd5b506101b9610a0a565b34801561037357600080fd5b506103246188b881565b34801561038957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610211565b3480156103b457600080fd5b506101b9336000908152600360205260409020439055565b3480156103d857600080fd5b506101b96103e7366004611ecc565b610a1e565b3480156103f857600080fd5b50610457610407366004611eaf565b6001602081905260009182526040909120805491015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900460ff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015260ff1690820152606001610232565b34801561049957600080fd5b506102117f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cd57600080fd5b506101b9610a38565b3480156104e257600080fd5b506101b96104f1366004611eaf565b610abc565b34801561050257600080fd5b50610324610511366004611e76565b600260209081526000928352604080842090915290825290205481565b34801561053a57600080fd5b50610324610b68565b34801561054f57600080fd5b506101b961055e366004611e35565b610c1e565b34801561056f57600080fd5b506101b933600090815260036020526040812055565b6101b9610d23565b34801561059957600080fd5b506101b96105a8366004611eaf565b610dab565b3480156105b957600080fd5b506105cd6105c8366004611f5b565b610e48565b604051610232929190612025565b6105e3610e6b565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561067157600080fd5b505af1158015610685573d6000803e3d6000fd5b505050505050565b610695610e6b565b73ffffffffffffffffffffffffffffffffffffffff83166107235760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a20496e636f727265637420746f6b6560448201527f6e206f7261636c6500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815260016020526040902054161561075557600080fd5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602080850191825260ff938416858401908152968616600090815260019182905292909220935184549086167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161784555192018054945190911674010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009094169190921617919091179055565b610829610e6b565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561067157600080fd5b6108db73ffffffffffffffffffffffffffffffffffffffff8416333084610ed2565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054166109755760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320938616835292905290812080548392906109b9908490612076565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036109f0576109f033600090815260036020526040812055565b505050565b6000610a018383610fae565b90505b92915050565b610a12610e6b565b610a1c60006114b6565b565b610a2661152b565b610a32848484846115b0565b50505050565b610a40610e6b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aa857600080fd5b505af1158015610a32573d6000803e3d6000fd5b610ac4610e6b565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c19919061208e565b905090565b3360009081526003602052604090205415801590610c4a57503360009081526003602052604090205443115b610cbc5760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f7369740000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020908152604080832033845290915281208054839290610cfc9084906120a7565b909155506109f0905073ffffffffffffffffffffffffffffffffffffffff84168383611728565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610b4d57600080fd5b610db3610e6b565b73ffffffffffffffffffffffffffffffffffffffff8116610e3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161071a565b610e45816114b6565b50565b60606000610e5461152b565b610e5f85858561177e565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a329085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a5f565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602081815260408084208151606081018352815487168082529190940154958616928401929092527401000000000000000000000000000000000000000090940460ff1693820193909352909161108c5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161071a565b602081810151734200000000000000000000000000000000000006600090815260019092527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015292939291169063d4c282a390604401602060405180830381865afa15801561116c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611190919061208e565b83516040517fd4c282a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015261034860248301529293506000929091169063d4c282a390604401602060405180830381865afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611231919061208e565b734200000000000000000000000000000000000006600090815260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17318547fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319546040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152610348602482015293945091929116906358e2d3a890604401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133191906120be565b85516040517f58e2d3a800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152610348602483015260ff939093169350600092909116906358e2d3a890604401602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d791906120be565b60ff16905060006113e983600a6121fb565b6113f39085612207565b6113fe83600a6121fb565b611408878c612207565b6114129190612207565b61141c9190612244565b73420000000000000000000000000000000000000660005260016020527fad59d8b039d0a49adcf8b040c0a328357753589ae2102d254712da0d90d17319549091506114849074010000000000000000000000000000000000000000900460ff16600a61227f565b604088015161149490600a61227f565b61149e9083612207565b6114a89190612244565b9a9950505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a1c5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161071a565b6000808080806115c28789018961228e565b9450945094509450945060008183856188b86115de9190612207565b6115e8908a612076565b6115f29190612207565b6115fc9190612244565b905060028a6002811115611612576116126122df565b1461163e5761163973ffffffffffffffffffffffffffffffffffffffff8616873084610ed2565b611688565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320938a16835292905290812080548392906116829084906120a7565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040812082916116ce60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117179190612076565b909155505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109f09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610f2c565b606060006188b88560a00135116117fd5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f70000000000000000000000000000000000000000000000000606482015260840161071a565b36600061180e61012088018861230e565b9092509050602881146118895760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e0000000000000000000000606482015260840161071a565b6000611898826014818661237a565b6118a1916123a4565b60601c9050873560006118b48389610fae565b905060006118c18b611b51565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260409020549091501561195c5760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b656400000000000000000000000000000000000000000000000000000000606482015260840161071a565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260026020908152604080832093871683529290522054821115611a045760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015260840161071a565b6040805173ffffffffffffffffffffffffffffffffffffffff948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b6000611ac1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b809092919063ffffffff16565b8051909150156109f05780806020019051810190611adf91906123ec565b6109f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161071a565b600060e0820135610100830135808203611b6c575092915050565b611b7882488301611b8f565b949350505050565b6060611b788484600085611ba5565b6000818310611b9e5781610a01565b5090919050565b606082471015611c1d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161071a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c46919061240e565b60006040518083038185875af1925050503d8060008114611c83576040519150601f19603f3d011682016040523d82523d6000602084013e611c88565b606091505b5091509150611c9987838387611ca4565b979650505050505050565b60608315611d20578251600003611d195773ffffffffffffffffffffffffffffffffffffffff85163b611d195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071a565b5081611b78565b611b788383815115611d355781518083602001fd5b8060405162461bcd60e51b815260040161071a919061242a565b600060208284031215611d6157600080fd5b813563ffffffff81168114611d7557600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e4557600080fd5b60ff81168114610e4557600080fd5b60008060008060808587031215611dc357600080fd5b8435611dce81611d7c565b93506020850135611dde81611d7c565b92506040850135611dee81611d7c565b91506060850135611dfe81611d9e565b939692955090935050565b60008060408385031215611e1c57600080fd5b8235611e2781611d7c565b946020939093013593505050565b600080600060608486031215611e4a57600080fd5b8335611e5581611d7c565b92506020840135611e6581611d7c565b929592945050506040919091013590565b60008060408385031215611e8957600080fd5b8235611e9481611d7c565b91506020830135611ea481611d7c565b809150509250929050565b600060208284031215611ec157600080fd5b8135611d7581611d7c565b60008060008060608587031215611ee257600080fd5b843560038110611ef157600080fd5b9350602085013567ffffffffffffffff80821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611f7057600080fd5b833567ffffffffffffffff811115611f8757600080fd5b84016101608187031215611f9a57600080fd5b95602085013595506040909401359392505050565b60005b83811015611fca578181015183820152602001611fb2565b83811115610a325750506000910152565b60008151808452611ff3816020860160208601611faf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006120386040830185611fdb565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561208957612089612047565b500190565b6000602082840312156120a057600080fd5b5051919050565b6000828210156120b9576120b9612047565b500390565b6000602082840312156120d057600080fd5b8151611d7581611d9e565b600181815b8085111561213457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561211a5761211a612047565b8085161561212757918102915b93841c93908002906120e0565b509250929050565b60008261214b57506001610a04565b8161215857506000610a04565b816001811461216e576002811461217857612194565b6001915050610a04565b60ff84111561218957612189612047565b50506001821b610a04565b5060208310610133831016604e8410600b84101617156121b7575081810a610a04565b6121c183836120db565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156121f3576121f3612047565b029392505050565b6000610a01838361213c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561223f5761223f612047565b500290565b60008261227a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000610a0160ff84168361213c565b600080600080600060a086880312156122a657600080fd5b85356122b181611d7c565b945060208601356122c181611d7c565b94979496505050506040830135926060810135926080909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261234357600080fd5b83018035915067ffffffffffffffff82111561235e57600080fd5b60200191503681900382131561237357600080fd5b9250929050565b6000808585111561238a57600080fd5b8386111561239757600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156123e45780818660140360031b1b83161692505b505092915050565b6000602082840312156123fe57600080fd5b81518015158114611d7557600080fd5b60008251612420818460208701611faf565b9190910192915050565b602081526000610a016020830184611fdb56fea2646970667358221220ce1cdf4e12afe4082320ee9e0dc930ffed46e8c1d8e1796042ef54b8861fd28164736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC23F001F GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x563 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x5AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB0D691FE GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x48D JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x4D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3CC JUMPI DUP1 PUSH4 0xADDD5099 EQ PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 GT PUSH2 0x14E JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x7B775D4D EQ PUSH2 0x23B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x493B0170 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x2F7 JUMPI DUP1 PUSH4 0x54FE0498 EQ PUSH2 0x332 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x2F3E96A7 GT PUSH2 0x17F JUMPI DUP1 PUSH4 0x2F3E96A7 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x33032EC4 EQ PUSH2 0x23B JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x1A02EF76 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1DB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4F JUMP JUMPDEST PUSH2 0x5DB JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DAD JUMP JUMPDEST PUSH2 0x68D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x821 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x348 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH20 0x4200000000000000000000000000000000000006 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x27E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E35 JUMP JUMPDEST PUSH2 0x8B9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E2 PUSH2 0x29E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E76 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x312 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x9F5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0xA0A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x211 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x3E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1ECC JUMP JUMPDEST PUSH2 0xA1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x457 PUSH2 0x407 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 DUP2 AND SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP4 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x499 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH2 0xABC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E76 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x324 PUSH2 0xB68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x55E CALLDATASIZE PUSH1 0x4 PUSH2 0x1E35 JUMP JUMPDEST PUSH2 0xC1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0xD23 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x599 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B9 PUSH2 0x5A8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1EAF JUMP JUMPDEST PUSH2 0xDAB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5CD PUSH2 0x5C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F5B JUMP JUMPDEST PUSH2 0xE48 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x232 SWAP3 SWAP2 SWAP1 PUSH2 0x2025 JUMP JUMPDEST PUSH2 0x5E3 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x685 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x695 PUSH2 0xE6B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x723 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E636F727265637420746F6B65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E206F7261636C65000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x755 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0xFF SWAP4 DUP5 AND DUP6 DUP5 ADD SWAP1 DUP2 MSTORE SWAP7 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP3 KECCAK256 SWAP4 MLOAD DUP5 SLOAD SWAP1 DUP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR DUP5 SSTORE MLOAD SWAP3 ADD DUP1 SLOAD SWAP5 MLOAD SWAP1 SWAP2 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP3 AND OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x829 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8DB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER ADDRESS DUP5 PUSH2 0xED2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x975 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x9B9 SWAP1 DUP5 SWAP1 PUSH2 0x2076 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x9F0 JUMPI PUSH2 0x9F0 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 DUP4 DUP4 PUSH2 0xFAE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA12 PUSH2 0xE6B JUMP JUMPDEST PUSH2 0xA1C PUSH1 0x0 PUSH2 0x14B6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA26 PUSH2 0x152B JUMP JUMPDEST PUSH2 0xA32 DUP5 DUP5 DUP5 DUP5 PUSH2 0x15B0 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xA40 PUSH2 0xE6B JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA32 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xAC4 PUSH2 0xE6B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBF5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC19 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xC4A JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xCBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xCFC SWAP1 DUP5 SWAP1 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x9F0 SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 DUP4 PUSH2 0x1728 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDB3 PUSH2 0xE6B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xE3C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH2 0xE45 DUP2 PUSH2 0x14B6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xE54 PUSH2 0x152B JUMP JUMPDEST PUSH2 0xE5F DUP6 DUP6 DUP6 PUSH2 0x177E JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xA32 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1A5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE DUP2 SLOAD DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP5 ADD SLOAD SWAP6 DUP7 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP5 DIV PUSH1 0xFF AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 SWAP2 PUSH2 0x108C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 ADD MLOAD PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP4 SWAP3 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x116C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1190 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD PUSH32 0xD4C282A300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0xD4C282A3 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x120D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1231 SWAP2 SWAP1 PUSH2 0x208E JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17318 SLOAD PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP3 ADD MSTORE SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x130D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1331 SWAP2 SWAP1 PUSH2 0x20BE JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH32 0x58E2D3A800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH2 0x348 PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND SWAP4 POP PUSH1 0x0 SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH4 0x58E2D3A8 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x13D7 SWAP2 SWAP1 PUSH2 0x20BE JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x13E9 DUP4 PUSH1 0xA PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x13F3 SWAP1 DUP6 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x13FE DUP4 PUSH1 0xA PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1408 DUP8 DUP13 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x1412 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x141C SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST PUSH20 0x4200000000000000000000000000000000000006 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH32 0xAD59D8B039D0A49ADCF8B040C0A328357753589AE2102D254712DA0D90D17319 SLOAD SWAP1 SWAP2 POP PUSH2 0x1484 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x227F JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH2 0x1494 SWAP1 PUSH1 0xA PUSH2 0x227F JUMP JUMPDEST PUSH2 0x149E SWAP1 DUP4 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x14A8 SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x15C2 DUP8 DUP10 ADD DUP10 PUSH2 0x228E JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x15DE SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x15E8 SWAP1 DUP11 PUSH2 0x2076 JUMP JUMPDEST PUSH2 0x15F2 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST PUSH2 0x15FC SWAP2 SWAP1 PUSH2 0x2244 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1612 JUMPI PUSH2 0x1612 PUSH2 0x22DF JUMP JUMPDEST EQ PUSH2 0x163E JUMPI PUSH2 0x1639 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0xED2 JUMP JUMPDEST PUSH2 0x1688 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x1682 SWAP1 DUP5 SWAP1 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x16CE PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1717 SWAP2 SWAP1 PUSH2 0x2076 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x9F0 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xF2C JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x17FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x180E PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x230E JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x1889 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1898 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x237A JUMP JUMPDEST PUSH2 0x18A1 SWAP2 PUSH2 0x23A4 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x18B4 DUP4 DUP10 PUSH2 0xFAE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x18C1 DUP12 PUSH2 0x1B51 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x195C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x1A04 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AC1 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1B80 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x9F0 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1ADF SWAP2 SWAP1 PUSH2 0x23EC JUMP JUMPDEST PUSH2 0x9F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1B6C JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1B78 DUP3 BASEFEE DUP4 ADD PUSH2 0x1B8F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1B78 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x1BA5 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B9E JUMPI DUP2 PUSH2 0xA01 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1C1D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x71A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1C46 SWAP2 SWAP1 PUSH2 0x240E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C83 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C88 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1C99 DUP8 DUP4 DUP4 DUP8 PUSH2 0x1CA4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1D20 JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1D19 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x1D19 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x71A JUMP JUMPDEST POP DUP2 PUSH2 0x1B78 JUMP JUMPDEST PUSH2 0x1B78 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1D35 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x71A SWAP2 SWAP1 PUSH2 0x242A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1DC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1DCE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x1DDE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x1DEE DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x1DFE DUP2 PUSH2 0x1D9E JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E27 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1E4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1E55 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1E65 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1E89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1E94 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1EA4 DUP2 PUSH2 0x1D7C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1D75 DUP2 PUSH2 0x1D7C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1EE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1EF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1F0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1F31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1F43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1F9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FCA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1FB2 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xA32 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1FF3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1FAF JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2038 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1FDB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x2089 JUMPI PUSH2 0x2089 PUSH2 0x2047 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x20B9 JUMPI PUSH2 0x20B9 PUSH2 0x2047 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1D75 DUP2 PUSH2 0x1D9E JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x2134 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x211A JUMPI PUSH2 0x211A PUSH2 0x2047 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x2127 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x20E0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x214B JUMPI POP PUSH1 0x1 PUSH2 0xA04 JUMP JUMPDEST DUP2 PUSH2 0x2158 JUMPI POP PUSH1 0x0 PUSH2 0xA04 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x216E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x2178 JUMPI PUSH2 0x2194 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0xA04 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x2189 JUMPI PUSH2 0x2189 PUSH2 0x2047 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0xA04 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x21B7 JUMPI POP DUP2 DUP2 EXP PUSH2 0xA04 JUMP JUMPDEST PUSH2 0x21C1 DUP4 DUP4 PUSH2 0x20DB JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x21F3 JUMPI PUSH2 0x21F3 PUSH2 0x2047 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 DUP4 DUP4 PUSH2 0x213C JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x223F JUMPI PUSH2 0x223F PUSH2 0x2047 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x227A JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA01 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x213C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x22A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x22B1 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x22C1 DUP2 PUSH2 0x1D7C JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2343 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x235E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x2373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x238A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x2397 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x23E4 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x23FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1D75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2420 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1FAF JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0xA01 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1FDB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCE SHR 0xDF 0x4E SLT 0xAF 0xE4 ADDMOD 0x23 KECCAK256 0xEE SWAP15 0xD 0xC9 ADDRESS SELFDESTRUCT 0xED CHAINID 0xE8 0xC1 0xD8 0xE1 PUSH26 0x6042EF54B8861FD28164736F6C634300080F0033000000000000 ","sourceMap":"109:380:103:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2814:349:65;;;;;;;;;;-1:-1:-1;2814:349:65;;;;;:::i;:::-;;:::i;2721:149:52:-;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;1818:78:65:-;;;;;;;;;;;;1854:42;1818:78;;;;;1824:42:111;1812:55;;;1794:74;;1782:2;1767:18;1818:78:65;;;;;;;;2042:54;;;;;;;;;;;;1994:42;2042:54;;3697:472;;;;;;;;;;-1:-1:-1;3697:472:65;;;;;:::i;:::-;;:::i;4355:206::-;;;;;;;;;;-1:-1:-1;4355:206:65;;;;;:::i;:::-;4485:15;;;;4428:14;4485:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;4534:11;:20;;;;;;;;4485:24;;4355:206;;;;;3215:25:111;;;3271:2;3256:18;;3249:34;;;;3188:18;4355:206:65;3041:248:111;2288:46:65;;;;;;;;;;-1:-1:-1;2288:46:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3700:25:111;;;3688:2;3673:18;2288:46:65;3554:177:111;311:176:103;;;;;;;;;;-1:-1:-1;311:176:103;;;;;:::i;:::-;;:::i;1831:101:24:-;;;;;;;;;;;;;:::i;1768:44:65:-;;;;;;;;;;;;1807:5;1768:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;4692:92:65;;;;;;;;;;;;4751:10;4739:23;;;;:11;:23;;;;;4765:12;4739:38;;4692:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;2174:40:65:-;;;;;;;;;;-1:-1:-1;2174:40:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5406:42:111;5475:15;;;5457:34;;5527:15;;;;5522:2;5507:18;;5500:43;5591:4;5579:17;5559:18;;;5552:45;5384:2;5369:18;2174:40:65;5178:425:111;471:39:52;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;2220:62:65:-;;;;;;;;;;-1:-1:-1;2220:62:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3318:111:52;;;;;;;;;;;;;:::i;5328:311:65:-;;;;;;;;;;-1:-1:-1;5328:311:65;;;;;:::i;:::-;;:::i;5001:79::-;;;;;;;;;;;;5058:10;5072:1;5046:23;;;:11;:23;;;;;:27;5001:79;2474:105:52;;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;7714:10:111;7702:23;;3173:55:52::1;::::0;::::1;7684:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;7657:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2814:349:65:-;1094:13:24;:11;:13::i;:::-;2947:31:65::1;::::0;::::1;2939:84;;;::::0;-1:-1:-1;;;2939:84:65;;7939:2:111;2939:84:65::1;::::0;::::1;7921:21:111::0;7978:2;7958:18;;;7951:30;8017:34;7997:18;;;7990:62;8088:10;8068:18;;;8061:38;8116:19;;2939:84:65::1;;;;;;;;;3041:42;:14:::0;;::::1;2164:1;3041:14:::0;;;:7:::1;:14;::::0;;;;:27;::::1;:42:::0;3033:51:::1;;;::::0;::::1;;3111:45;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;3094:14;;::::1;-1:-1:-1::0;3094:14:65;;;:7:::1;:14:::0;;;;;;;;:62;;;;;;::::1;::::0;;;::::1;;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;2814:349::o;2721:149:52:-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;8354:55:111::0;;;2817:46:52::1;::::0;::::1;8336:74:111::0;8426:18;;;8419:34;;;2817:10:52::1;:21;::::0;::::1;::::0;8309:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;3697:472:65::0;3882:57;:22;;;3905:10;3925:4;3932:6;3882:22;:57::i;:::-;3957:42;:14;;;2164:1;3957:14;;;:7;:14;;;;;:27;;3949:90;;;;-1:-1:-1;;;3949:90:65;;8666:2:111;3949:90:65;;;8648:21:111;8705:2;8685:18;;;8678:30;8744:34;8724:18;;;8717:62;8815:5;8795:18;;;8788:33;8838:19;;3949:90:65;8464:399:111;3949:90:65;4049:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:34;;4077:6;;4049:15;:34;;4077:6;;4049:34;:::i;:::-;;;;-1:-1:-1;;4097:21:65;;;:10;:21;4093:70;;4134:18;5058:10;5072:1;5046:23;;;:11;:23;;;;;:27;5001:79;4134:18;3697:472;;;:::o;311:176:103:-;397:7;423:57;463:5;470:9;423:39;:57::i;:::-;416:64;;311:176;;;;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;1812:55:111::0;;;3975:41:52::1;::::0;::::1;1794:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;1767:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;1794:74:111;3361:7:52;;3387:10;:20;;;;;1767:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;5328:311:65:-;5437:10;5425:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;5484:10:65;5472:23;;;;:11;:23;;;;;;5457:12;:38;5425:70;5417:124;;;;-1:-1:-1;;;5417:124:65;;9828:2:111;5417:124:65;;;9810:21:111;9867:2;9847:18;;;9840:30;9906:34;9886:18;;;9879:62;9977:11;9957:18;;;9950:39;10006:19;;5417:124:65;9626:405:111;5417:124:65;5551:15;;;;;;;:8;:15;;;;;;;;5567:10;5551:27;;;;;;;:37;;5582:6;;5551:15;:37;;5582:6;;5551:37;:::i;:::-;;;;-1:-1:-1;5598:34:65;;-1:-1:-1;5598:18:65;;;5617:6;5625;5598:18;:34::i;2474:105:52:-;2518:54;;;;;2566:4;2518:54;;;1794:74:111;2518:10:52;:20;;;;;2547:9;;1767:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;2081:198:24;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;10368:2:111;2161:73:24::1;::::0;::::1;10350:21:111::0;10407:2;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10517:8;10497:18;;;10490:36;10543:19;;2161:73:24::1;10166:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;10775:2:111;1414:68:24;;;10757:21:111;;;10794:18;;;10787:30;10853:34;10833:18;;;10826:62;10905:18;;1414:68:24;10573:356:111;974:241:39;1139:68;;11146:42:111;11215:15;;;1139:68:39;;;11197:34:111;11267:15;;11247:18;;;11240:43;11299:18;;;11292:34;;;1112:96:39;;1132:5;;1162:27;;11109:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;5901:1071:65:-;6054:14;;;;5993:22;6054:14;;;:7;:14;;;;;;;;6027:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5993:22;;6078:86;;;;-1:-1:-1;;;6078:86:65;;8666:2:111;6078:86:65;;;8648:21:111;8705:2;8685:18;;;8678:30;8744:34;8724:18;;;8717:62;8815:5;8795:18;;;8788:33;8838:19;;6078:86:65;8464:399:111;6078:86:65;6189:20;;;;;1994:42;6174:12;6246:15;;;:7;:15;;;;:28;6288:25;;6246:15;:79;;;;:15;6288:25;;;6246:79;;;11572:34:111;1854:42:65;11622:18:111;;;11615:43;6189:20:65;;6174:12;6246:28;;;:41;;11484:18:111;;6246:79:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6365:23;;:53;;;;;:36;11590:15:111;;;6365:53:65;;;11572:34:111;1854:42:65;11622:18:111;;;11615:43;6219:107:65;;-1:-1:-1;6336:18:65;;6365:36;;;;;;11484:18:111;;6365:53:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1994:42;6429:24;6464:15;;;:7;:15;;;:28;6502:25;;6464:15;:75;;;;:15;6502:25;;;6464:75;;;11572:34:111;1854:42:65;11622:18:111;;;11615:43;6336:83:65;;-1:-1:-1;6429:24:65;;6464:28;;;:37;;11484:18:111;;6464:75:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6587:23;;:49;;;;;:32;11590:15:111;;;6587:49:65;;;11572:34:111;1854:42:65;11622:18:111;;;11615:43;6456:84:65;;;;;;-1:-1:-1;6550:26:65;;6587:32;;;;;;11484:18:111;;6587:49:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6579:58;;;-1:-1:-1;6647:22:65;6739:20;6743:16;6739:2;:20;:::i;:::-;6725:35;;:10;:35;:::i;:::-;6697:22;6701:18;6697:2;:22;:::i;:::-;6673:20;6685:8;6673:9;:20;:::i;:::-;:47;;;;:::i;:::-;6672:89;;;;:::i;:::-;1994:42;6934:15;;:7;:15;;:29;;6647:114;;-1:-1:-1;6930:33:65;;6934:29;;;;;6930:2;:33;:::i;:::-;6900:24;;;;6896:28;;:2;:28;:::i;:::-;6878:47;;:14;:47;:::i;:::-;6877:87;;;;:::i;:::-;6869:96;5901:1071;-1:-1:-1;;;;;;;;;;5901:1071:65:o;2433:187:24:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;14462:2:111;4148:67:52;;;14444:21:111;14501:2;14481:18;;;14474:30;14540:23;14520:18;;;14513:51;14581:18;;4148:67:52;14260:345:111;8783:819:65;8894:15;;;;;8990:65;;;;9001:7;8990:65;:::i;:::-;8893:162;;;;;;;;;;9124:23;9215:7;9200:12;9182:14;1807:5;9167:29;;;;:::i;:::-;9151:45;;:13;:45;:::i;:::-;9150:62;;;;:::i;:::-;:72;;;;:::i;:::-;9124:98;-1:-1:-1;9244:25:65;9236:4;:33;;;;;;;;:::i;:::-;;9232:311;;9328:63;:22;;;9351:7;9368:4;9375:15;9328:22;:63::i;:::-;9232:311;;;9489:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:43;;9517:15;;9489;:43;;9517:15;;9489:43;:::i;:::-;;;;-1:-1:-1;;9232:311:65;9552:15;;;;;;;:8;:15;;;;;9580;;9568:7;1247::24;1273:6;;;;1201:85;9568:7:65;9552:24;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;8783:819:65:o;763:205:39:-;902:58;;8366:42:111;8354:55;;902:58:39;;;8336:74:111;8426:18;;;8419:34;;;875:86:39;;895:5;;925:23;;8309:18:111;;902:58:39;8146:313:111;7271:1101:65;7409:20;7431:22;1807:5;7599:6;:27;;;:42;7591:95;;;;-1:-1:-1;;;7591:95:65;;15941:2:111;7591:95:65;;;15923:21:111;15980:2;15960:18;;;15953:30;16019:34;15999:18;;;15992:62;16090:10;16070:18;;;16063:38;16118:19;;7591:95:65;15739:404:111;7591:95:65;7697:31;;7731:23;;;;:6;:23;:::i;:::-;7697:57;;-1:-1:-1;7697:57:65;-1:-1:-1;7799:5:65;7772:32;;7764:98;;;;-1:-1:-1;;;7764:98:65;;16935:2:111;7764:98:65;;;16917:21:111;16974:2;16954:18;;;16947:30;17013:34;16993:18;;;16986:62;17084:23;17064:18;;;17057:51;17125:19;;7764:98:65;16733:417:111;7764:98:65;7872:12;7910:21;:16;7927:2;7910:16;;:21;:::i;:::-;7902:30;;;:::i;:::-;7894:39;;;-1:-1:-1;1889:20:64;;7944:15:65;8013:34;7894:39;8039:7;8013:18;:34::i;:::-;7990:57;;8057:22;8082:17;:6;:15;:17::i;:::-;8117:20;;;;;;;:11;:20;;;;;;8057:42;;-1:-1:-1;8117:25:65;8109:74;;;;-1:-1:-1;;;8109:74:65;;18070:2:111;8109:74:65;;;18052:21:111;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;18219:6;18199:18;;;18192:34;18243:19;;8109:74:65;17868:400:111;8109:74:65;8201:15;;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;:40;-1:-1:-1;8201:40:65;8193:86;;;;-1:-1:-1;;;8193:86:65;;18475:2:111;8193:86:65;;;18457:21:111;18514:2;18494:18;;;18487:30;18553:34;18533:18;;;18526:62;18624:3;18604:18;;;18597:31;18645:19;;8193:86:65;18273:397:111;8193:86:65;8297:65;;;18959:42:111;19028:15;;;8297:65:65;;;19010:34:111;19080:15;;;;19060:18;;;19053:43;19112:18;;;19105:34;19155:18;;;19148:34;19198:19;;;;19191:35;;;;8297:65:65;;;;;;;;;;18921:19:111;;;;8297:65:65;;-1:-1:-1;8297:65:65;;-1:-1:-1;;;8297:65:65;-1:-1:-1;;;;7271:1101:65:o;3747:706:39:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:39;;19721:2:111;4351:85:39;;;19703:21:111;19760:2;19740:18;;;19733:30;19799:34;19779:18;;;19772:62;19870:12;19850:18;;;19843:40;19900:19;;4351:85:39;19519:406:111;2095:472:64;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;:::-;2492:62;2095:472;-1:-1:-1;;;;2095:472:64:o;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;-1:-1:-1;3743:1:64;;3651:104;-1:-1:-1;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:42;;20132:2:111;5149:81:42;;;20114:21:111;20171:2;20151:18;;;20144:30;20210:34;20190:18;;;20183:62;20281:8;20261:18;;;20254:36;20307:19;;5149:81:42;19930:402:111;5149:81:42;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;20818:2:111;7908:60:42;;;20800:21:111;20857:2;20837:18;;;20830:30;20896:31;20876:18;;;20869:59;20945:18;;7908:60:42;20616:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;389:42;382:5;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:114;546:4;539:5;535:16;528:5;525:27;515:55;;566:1;563;556:12;581:726;700:6;708;716;724;777:3;765:9;756:7;752:23;748:33;745:53;;;794:1;791;784:12;745:53;833:9;820:23;852:39;885:5;852:39;:::i;:::-;910:5;-1:-1:-1;967:2:111;952:18;;939:32;980:41;939:32;980:41;:::i;:::-;1040:7;-1:-1:-1;1099:2:111;1084:18;;1071:32;1112:41;1071:32;1112:41;:::i;:::-;1172:7;-1:-1:-1;1231:2:111;1216:18;;1203:32;1244:31;1203:32;1244:31;:::i;:::-;581:726;;;;-1:-1:-1;581:726:111;;-1:-1:-1;;581:726:111:o;1312:331::-;1388:6;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:52;;;1465:1;1462;1455:12;1417:52;1504:9;1491:23;1523:39;1556:5;1523:39;:::i;:::-;1581:5;1633:2;1618:18;;;;1605:32;;-1:-1:-1;;;1312:331:111:o;2125:487::-;2217:6;2225;2233;2286:2;2274:9;2265:7;2261:23;2257:32;2254:52;;;2302:1;2299;2292:12;2254:52;2341:9;2328:23;2360:39;2393:5;2360:39;:::i;:::-;2418:5;-1:-1:-1;2475:2:111;2460:18;;2447:32;2488:41;2447:32;2488:41;:::i;:::-;2125:487;;2548:7;;-1:-1:-1;;;2602:2:111;2587:18;;;;2574:32;;2125:487::o;2617:419::-;2700:6;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2816:9;2803:23;2835:39;2868:5;2835:39;:::i;:::-;2893:5;-1:-1:-1;2950:2:111;2935:18;;2922:32;2963:41;2922:32;2963:41;:::i;:::-;3023:7;3013:17;;;2617:419;;;;;:::o;3294:255::-;3353:6;3406:2;3394:9;3385:7;3381:23;3377:32;3374:52;;;3422:1;3419;3412:12;3374:52;3461:9;3448:23;3480:39;3513:5;3480:39;:::i;4079:819::-;4183:6;4191;4199;4207;4260:2;4248:9;4239:7;4235:23;4231:32;4228:52;;;4276:1;4273;4266:12;4228:52;4315:9;4302:23;4354:1;4347:5;4344:12;4334:40;;4370:1;4367;4360:12;4334:40;4393:5;-1:-1:-1;4449:2:111;4434:18;;4421:32;4472:18;4502:14;;;4499:34;;;4529:1;4526;4519:12;4499:34;4567:6;4556:9;4552:22;4542:32;;4612:7;4605:4;4601:2;4597:13;4593:27;4583:55;;4634:1;4631;4624:12;4583:55;4674:2;4661:16;4700:2;4692:6;4689:14;4686:34;;;4716:1;4713;4706:12;4686:34;4761:7;4756:2;4747:6;4743:2;4739:15;4735:24;4732:37;4729:57;;;4782:1;4779;4772:12;4729:57;4079:819;;4813:2;4805:11;;;;;-1:-1:-1;4835:6:111;;4888:2;4873:18;4860:32;;-1:-1:-1;4079:819:111;-1:-1:-1;;;4079:819:111:o;6128:530::-;6239:6;6247;6255;6308:2;6296:9;6287:7;6283:23;6279:32;6276:52;;;6324:1;6321;6314:12;6276:52;6364:9;6351:23;6397:18;6389:6;6386:30;6383:50;;;6429:1;6426;6419:12;6383:50;6452:22;;6508:3;6490:16;;;6486:26;6483:46;;;6525:1;6522;6515:12;6483:46;6548:2;6597;6582:18;;6569:32;;-1:-1:-1;6648:2:111;6633:18;;;6620:32;;6128:530;-1:-1:-1;;;6128:530:111:o;6663:258::-;6735:1;6745:113;6759:6;6756:1;6753:13;6745:113;;;6835:11;;;6829:18;6816:11;;;6809:39;6781:2;6774:10;6745:113;;;6876:6;6873:1;6870:13;6867:48;;;-1:-1:-1;;6911:1:111;6893:16;;6886:27;6663:258::o;6926:316::-;6967:3;7005:5;6999:12;7032:6;7027:3;7020:19;7048:63;7104:6;7097:4;7092:3;7088:14;7081:4;7074:5;7070:16;7048:63;:::i;:::-;7156:2;7144:15;7161:66;7140:88;7131:98;;;;7231:4;7127:109;;6926:316;-1:-1:-1;;6926:316:111:o;7247:288::-;7422:2;7411:9;7404:21;7385:4;7442:44;7482:2;7471:9;7467:18;7459:6;7442:44;:::i;:::-;7434:52;;7522:6;7517:2;7506:9;7502:18;7495:34;7247:288;;;;;:::o;8868:184::-;8920:77;8917:1;8910:88;9017:4;9014:1;9007:15;9041:4;9038:1;9031:15;9057:128;9097:3;9128:1;9124:6;9121:1;9118:13;9115:39;;;9134:18;;:::i;:::-;-1:-1:-1;9170:9:111;;9057:128::o;9437:184::-;9507:6;9560:2;9548:9;9539:7;9535:23;9531:32;9528:52;;;9576:1;9573;9566:12;9528:52;-1:-1:-1;9599:16:111;;9437:184;-1:-1:-1;9437:184:111:o;10036:125::-;10076:4;10104:1;10101;10098:8;10095:34;;;10109:18;;:::i;:::-;-1:-1:-1;10146:9:111;;10036:125::o;11857:247::-;11925:6;11978:2;11966:9;11957:7;11953:23;11949:32;11946:52;;;11994:1;11991;11984:12;11946:52;12026:9;12020:16;12045:29;12068:5;12045:29;:::i;12109:482::-;12198:1;12241:5;12198:1;12255:330;12276:7;12266:8;12263:21;12255:330;;;12395:4;12327:66;12323:77;12317:4;12314:87;12311:113;;;12404:18;;:::i;:::-;12454:7;12444:8;12440:22;12437:55;;;12474:16;;;;12437:55;12553:22;;;;12513:15;;;;12255:330;;;12259:3;12109:482;;;;;:::o;12596:866::-;12645:5;12675:8;12665:80;;-1:-1:-1;12716:1:111;12730:5;;12665:80;12764:4;12754:76;;-1:-1:-1;12801:1:111;12815:5;;12754:76;12846:4;12864:1;12859:59;;;;12932:1;12927:130;;;;12839:218;;12859:59;12889:1;12880:10;;12903:5;;;12927:130;12964:3;12954:8;12951:17;12948:43;;;12971:18;;:::i;:::-;-1:-1:-1;;13027:1:111;13013:16;;13042:5;;12839:218;;13141:2;13131:8;13128:16;13122:3;13116:4;13113:13;13109:36;13103:2;13093:8;13090:16;13085:2;13079:4;13076:12;13072:35;13069:77;13066:159;;;-1:-1:-1;13178:19:111;;;13210:5;;13066:159;13257:34;13282:8;13276:4;13257:34;:::i;:::-;13387:6;13319:66;13315:79;13306:7;13303:92;13300:118;;;13398:18;;:::i;:::-;13436:20;;12596:866;-1:-1:-1;;;12596:866:111:o;13467:131::-;13527:5;13556:36;13583:8;13577:4;13556:36;:::i;13603:228::-;13643:7;13769:1;13701:66;13697:74;13694:1;13691:81;13686:1;13679:9;13672:17;13668:105;13665:131;;;13776:18;;:::i;:::-;-1:-1:-1;13816:9:111;;13603:228::o;13836:274::-;13876:1;13902;13892:189;;13937:77;13934:1;13927:88;14038:4;14035:1;14028:15;14066:4;14063:1;14056:15;13892:189;-1:-1:-1;14095:9:111;;13836:274::o;14115:140::-;14173:5;14202:47;14243:4;14233:8;14229:19;14223:4;14202:47;:::i;14610:633::-;14728:6;14736;14744;14752;14760;14813:3;14801:9;14792:7;14788:23;14784:33;14781:53;;;14830:1;14827;14820:12;14781:53;14869:9;14856:23;14888:39;14921:5;14888:39;:::i;:::-;14946:5;-1:-1:-1;15003:2:111;14988:18;;14975:32;15016:41;14975:32;15016:41;:::i;:::-;14610:633;;15076:7;;-1:-1:-1;;;;15130:2:111;15115:18;;15102:32;;15181:2;15166:18;;15153:32;;15232:3;15217:19;;;15204:33;;-1:-1:-1;14610:633:111:o;15248:184::-;15300:77;15297:1;15290:88;15397:4;15394:1;15387:15;15421:4;15418:1;15411:15;16148:580;16225:4;16231:6;16291:11;16278:25;16381:66;16370:8;16354:14;16350:29;16346:102;16326:18;16322:127;16312:155;;16463:1;16460;16453:12;16312:155;16490:33;;16542:20;;;-1:-1:-1;16585:18:111;16574:30;;16571:50;;;16617:1;16614;16607:12;16571:50;16650:4;16638:17;;-1:-1:-1;16681:14:111;16677:27;;;16667:38;;16664:58;;;16718:1;16715;16708:12;16664:58;16148:580;;;;;:::o;17155:331::-;17260:9;17271;17313:8;17301:10;17298:24;17295:44;;;17335:1;17332;17325:12;17295:44;17364:6;17354:8;17351:20;17348:40;;;17384:1;17381;17374:12;17348:40;-1:-1:-1;;17410:23:111;;;17455:25;;;;;-1:-1:-1;17155:331:111:o;17491:372::-;17650:66;17612:19;;17734:11;;;;17765:2;17757:11;;17754:103;;;17844:2;17838;17831:3;17827:2;17823:12;17820:1;17816:20;17812:29;17808:2;17804:38;17800:47;17791:56;;17754:103;;;17491:372;;;;:::o;19237:277::-;19304:6;19357:2;19345:9;19336:7;19332:23;19328:32;19325:52;;;19373:1;19370;19363:12;19325:52;19405:9;19399:16;19458:5;19451:13;19444:21;19437:5;19434:32;19424:60;;19480:1;19477;19470:12;20337:274;20466:3;20504:6;20498:13;20520:53;20566:6;20561:3;20554:4;20546:6;20542:17;20520:53;:::i;:::-;20589:16;;;;;20337:274;-1:-1:-1;;20337:274:111:o;20974:219::-;21123:2;21112:9;21105:21;21086:4;21143:44;21183:2;21172:9;21168:18;21160:6;21143:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1866200","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"262","L2_ETH()":"261","L2_ETH_ADDRESS()":"282","QUOTE_USD()":"239","addDepositFor(address,address,uint256)":"infinite","addStake(uint32)":"infinite","addToken(address,address,address,uint8)":"infinite","balances(address,address)":"infinite","deposit()":"infinite","depositInfo(address,address)":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","getTokenValueOfEthTest(address,uint256)":"infinite","lockTokenDeposit()":"5247","oracles(address)":"4810","owner()":"2407","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockBlock(address)":"2569","unlockStake()":"infinite","unlockTokenDeposit()":"22354","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,address,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","L2_ETH()":"33032ec4","L2_ETH_ADDRESS()":"7b775d4d","QUOTE_USD()":"2f3e96a7","addDepositFor(address,address,uint256)":"382edd9e","addStake(uint32)":"0396cb60","addToken(address,address,address,uint8)":"1a02ef76","balances(address,address)":"c23f001f","deposit()":"d0e30db0","depositInfo(address,address)":"493b0170","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","getTokenValueOfEthTest(address,uint256)":"54fe0498","lockTokenDeposit()":"cd8f80c2","oracles(address)":"addd5099","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,address,uint256)":"cc9c837c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"contract IBobaStraw\",\"name\":\"ethPriceOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ETH\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ETH_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QUOTE_USD\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IBobaStraw\",\"name\":\"tokenPriceOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"addToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"ethBought\",\"type\":\"uint256\"}],\"name\":\"getTokenValueOfEthTest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"oracles\",\"outputs\":[{\"internalType\":\"contract IBobaStraw\",\"name\":\"feedRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenBase\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\",\"token\":\"the token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address,address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\",\"token\":\"the token deposit to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"addToken(address,address,address,uint8)\":{\"notice\":\"owner of the paymaster should add supported tokens\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestTokenValueBobaDepositPaymaster.sol\":\"TestTokenValueBobaDepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/BobaDepositPaymaster.sol\":{\"content\":\"/**\\n * Credit - DepositPaymaster.sol from https://github.com/eth-infinitism/account-abstraction\\n */\\n\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IBobaStraw.sol\\\";\\n\\n/**\\n * A token-based paymaster that accepts token deposits\\n * The deposit is only a safeguard: the user pays with his token balance.\\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\\n * thus the required deposit is to cover just one method call.\\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\\n * (but can't use the deposit for this or further operations)\\n *\\n * paymasterAndData holds the paymaster address followed by the token address to use.\\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\\n * (the standard rules ban accessing data of an external contract)\\n * It can only be used if it is \\\"whitelisted\\\" by the bundler.\\n * (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\\n * If you do not have bundler permissions, consider deploying a paymaster that accesses a stored 'ratio' value\\n * on validation and asynchronously update the ratio\\n */\\ncontract BobaDepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n struct Oracle {\\n IBobaStraw feedRegistry;\\n address tokenBase;\\n uint8 tokenDecimals;\\n }\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n address public constant QUOTE_USD = 0x0000000000000000000000000000000000000348;\\n\\n // for alt-l1, treat this as the native token\\n address public constant L2_ETH_ADDRESS = 0x4200000000000000000000000000000000000006;\\n IERC20 public constant L2_ETH = IERC20(L2_ETH_ADDRESS);\\n\\n IBobaStraw private constant NULL_ORACLE = IBobaStraw(address(0));\\n\\n mapping(IERC20 => Oracle) public oracles;\\n mapping(IERC20 => mapping(address => uint256)) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n constructor(IEntryPoint _entryPoint, IBobaStraw ethPriceOracle) BasePaymaster(_entryPoint) {\\n require(ethPriceOracle != NULL_ORACLE, \\\"DepositPaymaster: Incorrect eth oracle\\\");\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n // set native token base\\n oracles[L2_ETH] = Oracle(ethPriceOracle, L2_ETH_ADDRESS, 18);\\n }\\n\\n /**\\n * owner of the paymaster should add supported tokens\\n */\\n function addToken(IERC20 token, IBobaStraw tokenPriceOracle, address base, uint8 tokenDecimals) external onlyOwner {\\n require(tokenPriceOracle != NULL_ORACLE, \\\"DepositPaymaster: Incorrect token oracle\\\");\\n require(oracles[token].feedRegistry == NULL_ORACLE);\\n oracles[token] = Oracle(tokenPriceOracle, base, tokenDecimals);\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param token the token to deposit.\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n // native tokens will fail here\\n token.safeTransferFrom(msg.sender, address(this), amount);\\n require(oracles[token].feedRegistry != NULL_ORACLE, \\\"DepositPaymaster: unsupported token\\\");\\n balances[token][account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[token][account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param token the token deposit to withdraw\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[token][msg.sender] -= amount;\\n token.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param token the token to use\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n Oracle memory oracleInfo = oracles[token];\\n require(oracleInfo.feedRegistry != NULL_ORACLE, \\\"DepositPaymaster: unsupported token\\\");\\n address base = oracleInfo.tokenBase;\\n uint256 ethPrice = uint256(oracles[L2_ETH].feedRegistry.latestAnswer(oracles[L2_ETH].tokenBase, QUOTE_USD));\\n uint256 tokenPrice = uint256(oracleInfo.feedRegistry.latestAnswer(base, QUOTE_USD));\\n uint256 ethPriceDecimals = uint256(oracles[L2_ETH].feedRegistry.decimals(oracles[L2_ETH].tokenBase, QUOTE_USD));\\n uint256 tokenPriceDecimals = uint256(oracleInfo.feedRegistry.decimals(base, QUOTE_USD));\\n uint256 requiredAmount = (ethBought * ethPrice * (10**tokenPriceDecimals)) / (tokenPrice * (10**ethPriceDecimals));\\n // there is no requiredAmount = 0 check, priceRatio from oracle shouldnt exceed ethBought\\n return ((requiredAmount * (10**oracleInfo.tokenDecimals)) / (10**oracles[L2_ETH].tokenDecimals));\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n require(paymasterAndData.length == 20+20, \\\"DepositPaymaster: paymasterAndData must specify token\\\");\\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[token][account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n token.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[token][account] -= actualTokenCost;\\n }\\n balances[token][owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x417a4e51b9cedcafc17fac6f05c39f28b70e30746a5073cadb77839c30447986\",\"license\":\"GPL-3.0\"},\"contracts/samples/IBobaStraw.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaStraw {\\n function latestRoundData(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n function getRoundData(\\n address base,\\n address quote,\\n uint80 _roundId\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n // V2 AggregatorInterface\\n\\n function latestAnswer(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n int256 answer\\n );\\n\\n function latestTimestamp(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint256 timestamp\\n );\\n\\n function decimals(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint8\\n );\\n}\\n\",\"keccak256\":\"0x9983613a78d9398928dae53c2701b419811ba055fd716dadf638a78d6b52577e\",\"license\":\"MIT\"},\"contracts/test/TestTokenValueBobaDepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/BobaDepositPaymaster.sol\\\";\\n\\ncontract TestTokenValueBobaDepositPaymaster is BobaDepositPaymaster {\\n\\n constructor(IEntryPoint _entryPoint, IBobaStraw ethPriceOracle) BobaDepositPaymaster(_entryPoint, ethPriceOracle) {\\n }\\n\\n function getTokenValueOfEthTest(IERC20 token, uint256 ethBought) public view returns (uint256) {\\n return BobaDepositPaymaster.getTokenValueOfEth(token, ethBought);\\n }\\n}\\n\",\"keccak256\":\"0x20052ce24b41ab15b5d6bcaa9e74890aa954c39c432b3b2b30bca56880f87f7f\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":11218,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"oracles","offset":0,"slot":"1","type":"t_mapping(t_contract(IERC20)4419,t_struct(Oracle)11188_storage)"},{"astId":11225,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"balances","offset":0,"slot":"2","type":"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))"},{"astId":11229,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"unlockBlock","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IBobaStraw)13138":{"encoding":"inplace","label":"contract IBobaStraw","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_contract(IERC20)4419,t_struct(Oracle)11188_storage)":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => struct BobaDepositPaymaster.Oracle)","numberOfBytes":"32","value":"t_struct(Oracle)11188_storage"},"t_struct(Oracle)11188_storage":{"encoding":"inplace","label":"struct BobaDepositPaymaster.Oracle","members":[{"astId":11183,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"feedRegistry","offset":0,"slot":"0","type":"t_contract(IBobaStraw)13138"},{"astId":11185,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"tokenBase","offset":0,"slot":"1","type":"t_address"},{"astId":11187,"contract":"contracts/test/TestTokenValueBobaDepositPaymaster.sol:TestTokenValueBobaDepositPaymaster","label":"tokenDecimals","offset":20,"slot":"1","type":"t_uint8"}],"numberOfBytes":"64"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"addToken(address,address,address,uint8)":{"notice":"owner of the paymaster should add supported tokens"},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"version":1}}},"contracts/test/TestTokenValueGPODepositPaymaster.sol":{"TestTokenValueGPODepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"},{"internalType":"address","name":"_supportedToken","type":"address"},{"internalType":"uint8","name":"_supportedTokenDecimals","type":"uint8"},{"internalType":"address","name":"_gasPriceOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasPriceOracle","outputs":[{"internalType":"contract IBobaGasPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethBought","type":"uint256"}],"name":"getTokenValueOfEthTest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supportedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportedTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_12734":{"entryPoint":null,"id":12734,"parameterSlots":4,"returnSlots":0},"@_20269":{"entryPoint":null,"id":20269,"parameterSlots":4,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":176,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_12806":{"entryPoint":null,"id":12806,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory":{"entryPoint":281,"id":null,"parameterSlots":2,"returnSlots":4},"validator_revert_contract_IEntryPoint":{"entryPoint":256,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:903:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:86:111","statements":[{"body":{"nodeType":"YulBlock","src":"136:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"145:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"148:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"138:6:111"},"nodeType":"YulFunctionCall","src":"138:12:111"},"nodeType":"YulExpressionStatement","src":"138:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"121:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"126:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"117:3:111"},"nodeType":"YulFunctionCall","src":"117:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"130:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"113:3:111"},"nodeType":"YulFunctionCall","src":"113:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:111"},"nodeType":"YulFunctionCall","src":"102:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:111"},"nodeType":"YulFunctionCall","src":"92:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:111"},"nodeType":"YulFunctionCall","src":"85:50:111"},"nodeType":"YulIf","src":"82:70:111"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:111","type":""}],"src":"14:144:111"},{"body":{"nodeType":"YulBlock","src":"314:587:111","statements":[{"body":{"nodeType":"YulBlock","src":"361:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"370:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"373:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"363:6:111"},"nodeType":"YulFunctionCall","src":"363:12:111"},"nodeType":"YulExpressionStatement","src":"363:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"335:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"344:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"331:3:111"},"nodeType":"YulFunctionCall","src":"331:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"356:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"327:3:111"},"nodeType":"YulFunctionCall","src":"327:33:111"},"nodeType":"YulIf","src":"324:53:111"},{"nodeType":"YulVariableDeclaration","src":"386:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"405:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"399:5:111"},"nodeType":"YulFunctionCall","src":"399:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"390:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"462:5:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"424:37:111"},"nodeType":"YulFunctionCall","src":"424:44:111"},"nodeType":"YulExpressionStatement","src":"424:44:111"},{"nodeType":"YulAssignment","src":"477:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"487:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"477:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"501:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"526:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"537:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"522:3:111"},"nodeType":"YulFunctionCall","src":"522:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"516:5:111"},"nodeType":"YulFunctionCall","src":"516:25:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"505:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"588:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"550:37:111"},"nodeType":"YulFunctionCall","src":"550:46:111"},"nodeType":"YulExpressionStatement","src":"550:46:111"},{"nodeType":"YulAssignment","src":"605:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"615:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"605:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"631:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"656:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"667:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"652:3:111"},"nodeType":"YulFunctionCall","src":"652:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"646:5:111"},"nodeType":"YulFunctionCall","src":"646:25:111"},"variables":[{"name":"value_2","nodeType":"YulTypedName","src":"635:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"723:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"732:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"735:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"725:6:111"},"nodeType":"YulFunctionCall","src":"725:12:111"},"nodeType":"YulExpressionStatement","src":"725:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"693:7:111"},{"arguments":[{"name":"value_2","nodeType":"YulIdentifier","src":"706:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"715:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"702:3:111"},"nodeType":"YulFunctionCall","src":"702:18:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"690:2:111"},"nodeType":"YulFunctionCall","src":"690:31:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"683:6:111"},"nodeType":"YulFunctionCall","src":"683:39:111"},"nodeType":"YulIf","src":"680:59:111"},{"nodeType":"YulAssignment","src":"748:17:111","value":{"name":"value_2","nodeType":"YulIdentifier","src":"758:7:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"748:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"774:40:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"799:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"810:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"795:3:111"},"nodeType":"YulFunctionCall","src":"795:18:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"789:5:111"},"nodeType":"YulFunctionCall","src":"789:25:111"},"variables":[{"name":"value_3","nodeType":"YulTypedName","src":"778:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_3","nodeType":"YulIdentifier","src":"861:7:111"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"823:37:111"},"nodeType":"YulFunctionCall","src":"823:46:111"},"nodeType":"YulExpressionStatement","src":"823:46:111"},{"nodeType":"YulAssignment","src":"878:17:111","value":{"name":"value_3","nodeType":"YulIdentifier","src":"888:7:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"878:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"256:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"267:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"279:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"287:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"295:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"303:6:111","type":""}],"src":"163:738:111"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807t_addresst_uint8t_address_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IEntryPoint(value_1)\n value1 := value_1\n let value_2 := mload(add(headStart, 64))\n if iszero(eq(value_2, and(value_2, 0xff))) { revert(0, 0) }\n value2 := value_2\n let value_3 := mload(add(headStart, 96))\n validator_revert_contract_IEntryPoint(value_3)\n value3 := value_3\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b5060405162001e7d38038062001e7d833981016040819052620000349162000119565b83838383836200004433620000b0565b6001600160a01b03908116608052600380548583166001600160a81b031990911617600160a01b60ff861602179055600480546001600160a01b031916918316919091179055620000a2336000908152600260205260409020439055565b505050505050505062000186565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011657600080fd5b50565b600080600080608085870312156200013057600080fd5b84516200013d8162000100565b6020860151909450620001508162000100565b604086015190935060ff811681146200016857600080fd5b60608601519092506200017b8162000100565b939692955090935050565b608051611caa620001d36000396000818161042601528181610586015281816106500152818161076101528181610828015281816108b80152818161096b0152610d9f0152611caa6000f3fe60806040526004361061018b5760003560e01c80639ed0fb68116100d6578063cd8f80c21161007f578063f2fde38b11610059578063f2fde38b146104dc578063f465c77e146104fc578063f5bf3fcf1461052a57600080fd5b8063cd8f80c214610492578063d0e30db0146104b4578063d4918378146104bc57600080fd5b8063bb9fe6bf116100b0578063bb9fe6bf14610448578063c23a5cea1461045d578063c399ec881461047d57600080fd5b80639ed0fb68146103d0578063a9a23409146103f4578063b0d691fe1461041457600080fd5b80634f16bbf311610138578063715018a611610112578063715018a61461037a578063796d43711461038f5780638da5cb5b146103a557600080fd5b80634f16bbf3146102c857806363445989146102e85780636f6dc5ae1461034d57600080fd5b80632303889411610169578063230388941461021c57806327e235e3146102605780634a6f84cf1461029b57600080fd5b80630396cb60146101905780630ee0599c146101a5578063205c2878146101fc575b600080fd5b6101a361019e366004611747565b61054a565b005b3480156101b157600080fd5b506003546101d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020857600080fd5b506101a361021736600461178f565b6105fc565b34801561022857600080fd5b5060035461024e9074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101f3565b34801561026c57600080fd5b5061028d61027b3660046117bb565b60016020526000908152604090205481565b6040519081526020016101f3565b3480156102a757600080fd5b5061028d6102b63660046117bb565b60026020526000908152604090205481565b3480156102d457600080fd5b506101a36102e336600461178f565b610694565b3480156102f457600080fd5b506103386103033660046117bb565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160209081526040808320546002909252909120549091565b604080519283526020830191909152016101f3565b34801561035957600080fd5b506004546101d29073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038657600080fd5b506101a3610729565b34801561039b57600080fd5b5061028d6188b881565b3480156103b157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101d2565b3480156103dc57600080fd5b506101a3336000908152600260205260409020439055565b34801561040057600080fd5b506101a361040f3660046117d8565b61073d565b34801561042057600080fd5b506101d27f000000000000000000000000000000000000000000000000000000000000000081565b34801561045457600080fd5b506101a3610757565b34801561046957600080fd5b506101a36104783660046117bb565b6107db565b34801561048957600080fd5b5061028d610887565b34801561049e57600080fd5b506101a333600090815260026020526040812055565b6101a361093d565b3480156104c857600080fd5b5061028d6104d7366004611867565b6109c5565b3480156104e857600080fd5b506101a36104f73660046117bb565b6109d6565b34801561050857600080fd5b5061051c610517366004611880565b610a92565b6040516101f392919061194a565b34801561053657600080fd5b506101a361054536600461178f565b610ab5565b610552610bb5565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b505050505050565b610604610bb5565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105e057600080fd5b6003546106b99073ffffffffffffffffffffffffffffffffffffffff16333084610c36565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906106ee90849061199b565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036107255761072533600090815260026020526040812055565b5050565b610731610bb5565b61073b6000610d12565b565b610745610d87565b61075184848484610e26565b50505050565b61075f610bb5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107c757600080fd5b505af1158015610751573d6000803e3d6000fd5b6107e3610bb5565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561086c57600080fd5b505af1158015610880573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093891906119b3565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561086c57600080fd5b60006109d082610f6c565b92915050565b6109de610bb5565b73ffffffffffffffffffffffffffffffffffffffff8116610a86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610a8f81610d12565b50565b60606000610a9e610d87565b610aa9858585611101565b91509150935093915050565b3360009081526002602052604090205415801590610ae157503360009081526002602052604090205443115b610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610a7d565b3360009081526001602052604081208054839290610b8c9084906119cc565b90915550506003546107259073ffffffffffffffffffffffffffffffffffffffff168383611392565b60005473ffffffffffffffffffffffffffffffffffffffff16331461073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107519085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113ed565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610a7d565b6000808080610e37868801886119e3565b935093509350935060008183856188b8610e519190611a1e565b610e5b908961199b565b610e659190611a1e565b610e6f9190611a5b565b90506002896002811115610e8557610e85611a96565b14610eb457600354610eaf9073ffffffffffffffffffffffffffffffffffffffff16863084610c36565b610eef565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054839290610ee99084906119cc565b90915550505b8060016000610f1360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f5c919061199b565b9091555050505050505050505050565b60048054604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600093849373ffffffffffffffffffffffffffffffffffffffff169263313ce56792818301926020928290030181865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff91906119b3565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630aa2f4206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109491906119b3565b905060006110a383600a611be5565b6110ad8387611a1e565b6110b79190611a5b565b6003549091506110e39074010000000000000000000000000000000000000000900460ff166012611bf1565b6110ee90600a611c14565b6110f89082611a5b565b95945050505050565b606060006188b88560a001351161119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610a7d565b843560006111a785610f6c565b905060006111b4886114f9565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205490915015611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205482111561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6040805173ffffffffffffffffffffffffffffffffffffffff85166020820152908101829052606081018390526080810187905260a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298600098509650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113e89084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610c90565b505050565b600061144f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115289092919063ffffffff16565b8051909150156113e8578080602001905181019061146d9190611c23565b6113e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a7d565b600060e0820135610100830135808203611514575092915050565b61152082488301611537565b949350505050565b6060611520848460008561154f565b60008183106115465781611548565b825b9392505050565b6060824710156115e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161160a9190611c45565b60006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b509150915061165d87838387611668565b979650505050505050565b606083156116fe5782516000036116f75773ffffffffffffffffffffffffffffffffffffffff85163b6116f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a7d565b5081611520565b61152083838151156117135781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d9190611c61565b60006020828403121561175957600080fd5b813563ffffffff8116811461154857600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610a8f57600080fd5b600080604083850312156117a257600080fd5b82356117ad8161176d565b946020939093013593505050565b6000602082840312156117cd57600080fd5b81356115488161176d565b600080600080606085870312156117ee57600080fd5b8435600381106117fd57600080fd5b9350602085013567ffffffffffffffff8082111561181a57600080fd5b818701915087601f83011261182e57600080fd5b81358181111561183d57600080fd5b88602082850101111561184f57600080fd5b95986020929092019750949560400135945092505050565b60006020828403121561187957600080fd5b5035919050565b60008060006060848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b840161016081870312156118bf57600080fd5b95602085013595506040909401359392505050565b60005b838110156118ef5781810151838201526020016118d7565b838111156107515750506000910152565b600081518084526119188160208601602086016118d4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061195d6040830185611900565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156119ae576119ae61196c565b500190565b6000602082840312156119c557600080fd5b5051919050565b6000828210156119de576119de61196c565b500390565b600080600080608085870312156119f957600080fd5b8435611a048161176d565b966020860135965060408601359560600135945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a5657611a5661196c565b500290565b600082611a91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600181815b80851115611b1e57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611b0457611b0461196c565b80851615611b1157918102915b93841c9390800290611aca565b509250929050565b600082611b35575060016109d0565b81611b42575060006109d0565b8160018114611b585760028114611b6257611b7e565b60019150506109d0565b60ff841115611b7357611b7361196c565b50506001821b6109d0565b5060208310610133831016604e8410600b8410161715611ba1575081810a6109d0565b611bab8383611ac5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611bdd57611bdd61196c565b029392505050565b60006115488383611b26565b600060ff821660ff841680821015611c0b57611c0b61196c565b90039392505050565b600061154860ff841683611b26565b600060208284031215611c3557600080fd5b8151801515811461154857600080fd5b60008251611c578184602087016118d4565b9190910192915050565b602081526000611548602083018461190056fea2646970667358221220c8de66b5d8840c40ca4f791a626c639fa692d0596127543720fd8ecf7ed3fa7d64736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1E7D CODESIZE SUB DUP1 PUSH3 0x1E7D DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x119 JUMP JUMPDEST DUP4 DUP4 DUP4 DUP4 DUP4 PUSH3 0x44 CALLER PUSH3 0xB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE PUSH1 0x3 DUP1 SLOAD DUP6 DUP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT SWAP1 SWAP2 AND OR PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0xFF DUP7 AND MUL OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 DUP4 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH3 0xA2 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST POP POP POP POP POP POP POP POP PUSH3 0x186 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH3 0x130 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH3 0x13D DUP2 PUSH3 0x100 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x150 DUP2 PUSH3 0x100 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0xFF DUP2 AND DUP2 EQ PUSH3 0x168 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x17B DUP2 PUSH3 0x100 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x1CAA PUSH3 0x1D3 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x426 ADD MSTORE DUP2 DUP2 PUSH2 0x586 ADD MSTORE DUP2 DUP2 PUSH2 0x650 ADD MSTORE DUP2 DUP2 PUSH2 0x761 ADD MSTORE DUP2 DUP2 PUSH2 0x828 ADD MSTORE DUP2 DUP2 PUSH2 0x8B8 ADD MSTORE DUP2 DUP2 PUSH2 0x96B ADD MSTORE PUSH2 0xD9F ADD MSTORE PUSH2 0x1CAA PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4FC JUMPI DUP1 PUSH4 0xF5BF3FCF EQ PUSH2 0x52A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x4B4 JUMPI DUP1 PUSH4 0xD4918378 EQ PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x448 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x414 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F16BBF3 GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x38F JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F16BBF3 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0x63445989 EQ PUSH2 0x2E8 JUMPI DUP1 PUSH4 0x6F6DC5AE EQ PUSH2 0x34D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23038894 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x23038894 EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x260 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x29B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0xEE0599C EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1FC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x1747 JUMP JUMPDEST PUSH2 0x54A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x1D2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x5FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x24E SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x27B CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x2B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x2E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x694 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x303 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x1D2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x729 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x17D8 JUMP JUMPDEST PUSH2 0x73D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D2 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x757 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH2 0x7DB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0x93D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x4D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1867 JUMP JUMPDEST PUSH2 0x9C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x4F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH2 0x9D6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x508 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x51C PUSH2 0x517 CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0xA92 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP3 SWAP2 SWAP1 PUSH2 0x194A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x536 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0xAB5 JUMP JUMPDEST PUSH2 0x552 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x604 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x6B9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER ADDRESS DUP5 PUSH2 0xC36 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x6EE SWAP1 DUP5 SWAP1 PUSH2 0x199B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x725 JUMPI PUSH2 0x725 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x731 PUSH2 0xBB5 JUMP JUMPDEST PUSH2 0x73B PUSH1 0x0 PUSH2 0xD12 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x745 PUSH2 0xD87 JUMP JUMPDEST PUSH2 0x751 DUP5 DUP5 DUP5 DUP5 PUSH2 0xE26 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x75F PUSH2 0xBB5 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x751 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x7E3 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x86C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x880 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x914 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x938 SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x86C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x9D0 DUP3 PUSH2 0xF6C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x9DE PUSH2 0xBB5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xA86 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA8F DUP2 PUSH2 0xD12 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xA9E PUSH2 0xD87 JUMP JUMPDEST PUSH2 0xAA9 DUP6 DUP6 DUP6 PUSH2 0x1101 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAE1 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xB6D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB8C SWAP1 DUP5 SWAP1 PUSH2 0x19CC JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 SLOAD PUSH2 0x725 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH2 0x1392 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x751 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x13ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xE37 DUP7 DUP9 ADD DUP9 PUSH2 0x19E3 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xE51 SWAP2 SWAP1 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0xE5B SWAP1 DUP10 PUSH2 0x199B JUMP JUMPDEST PUSH2 0xE65 SWAP2 SWAP1 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0xE6F SWAP2 SWAP1 PUSH2 0x1A5B JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xE85 JUMPI PUSH2 0xE85 PUSH2 0x1A96 JUMP JUMPDEST EQ PUSH2 0xEB4 JUMPI PUSH1 0x3 SLOAD PUSH2 0xEAF SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 ADDRESS DUP5 PUSH2 0xC36 JUMP JUMPDEST PUSH2 0xEEF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xEE9 SWAP1 DUP5 SWAP1 PUSH2 0x19CC JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0xF13 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xF5C SWAP2 SWAP1 PUSH2 0x199B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 PUSH4 0x313CE567 SWAP3 DUP2 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFDB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFFF SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAA2F420 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1070 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1094 SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x10A3 DUP4 PUSH1 0xA PUSH2 0x1BE5 JUMP JUMPDEST PUSH2 0x10AD DUP4 DUP8 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0x10B7 SWAP2 SWAP1 PUSH2 0x1A5B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 SWAP2 POP PUSH2 0x10E3 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x1BF1 JUMP JUMPDEST PUSH2 0x10EE SWAP1 PUSH1 0xA PUSH2 0x1C14 JUMP JUMPDEST PUSH2 0x10F8 SWAP1 DUP3 PUSH2 0x1A5B JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x119A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST DUP5 CALLDATALOAD PUSH1 0x0 PUSH2 0x11A7 DUP6 PUSH2 0xF6C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11B4 DUP9 PUSH2 0x14F9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1269 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x131E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP9 PUSH1 0x0 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x13E8 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xC90 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x144F DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1528 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x13E8 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x146D SWAP2 SWAP1 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x13E8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1514 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1520 DUP3 BASEFEE DUP4 ADD PUSH2 0x1537 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1520 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x154F JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1546 JUMPI DUP2 PUSH2 0x1548 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x15E1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x160A SWAP2 SWAP1 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1647 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x164C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x165D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1668 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16FE JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x16F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x16F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST POP DUP2 PUSH2 0x1520 JUMP JUMPDEST PUSH2 0x1520 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1713 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA7D SWAP2 SWAP1 PUSH2 0x1C61 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xA8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x17A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x17AD DUP2 PUSH2 0x176D JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1548 DUP2 PUSH2 0x176D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x181A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x182E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x183D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x184F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x18BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18EF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18D7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x751 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1918 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x18D4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x195D PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1900 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x19AE JUMPI PUSH2 0x19AE PUSH2 0x196C JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x19DE JUMPI PUSH2 0x19DE PUSH2 0x196C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1A04 DUP2 PUSH2 0x176D JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1A56 JUMPI PUSH2 0x1A56 PUSH2 0x196C JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A91 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1B1E JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1B04 JUMPI PUSH2 0x1B04 PUSH2 0x196C JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1B11 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1ACA JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B35 JUMPI POP PUSH1 0x1 PUSH2 0x9D0 JUMP JUMPDEST DUP2 PUSH2 0x1B42 JUMPI POP PUSH1 0x0 PUSH2 0x9D0 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1B58 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1B62 JUMPI PUSH2 0x1B7E JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1B73 JUMPI PUSH2 0x1B73 PUSH2 0x196C JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x9D0 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1BA1 JUMPI POP DUP2 DUP2 EXP PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x1BAB DUP4 DUP4 PUSH2 0x1AC5 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1BDD JUMPI PUSH2 0x1BDD PUSH2 0x196C JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 DUP4 DUP4 PUSH2 0x1B26 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x1C0B JUMPI PUSH2 0x1C0B PUSH2 0x196C JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1B26 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C57 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x18D4 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1548 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1900 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC8 0xDE PUSH7 0xB5D8840C40CA4F PUSH26 0x1A626C639FA692D0596127543720FD8ECF7ED3FA7D64736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"108:452:104:-:0;;;181:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;319:11;332:15;349:23;374:15;319:11;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;;;1082:14:68::1;:40:::0;;;;::::1;-1:-1:-1::0;;;;;;1132:48:68;;;;-1:-1:-1;;;1132:48:68::1;::::0;::::1;;;::::0;;1190:14:::1;:53:::0;;-1:-1:-1;;;;;;1190:53:68::1;::::0;;::::1;::::0;;;::::1;::::0;;1325:20:::1;2725:10:::0;2713:23;;;;:11;:23;;;;;2739:12;2713:38;;2666:92;1325:20:::1;927:425:::0;;;;181:217:104;;;;108:452;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:144:111:-;-1:-1:-1;;;;;102:31:111;;92:42;;82:70;;148:1;145;138:12;82:70;14:144;:::o;163:738::-;279:6;287;295;303;356:3;344:9;335:7;331:23;327:33;324:53;;;373:1;370;363:12;324:53;405:9;399:16;424:44;462:5;424:44;:::i;:::-;537:2;522:18;;516:25;487:5;;-1:-1:-1;550:46:111;516:25;550:46;:::i;:::-;667:2;652:18;;646:25;615:7;;-1:-1:-1;715:4:111;702:18;;690:31;;680:59;;735:1;732;725:12;680:59;810:2;795:18;;789:25;758:7;;-1:-1:-1;823:46:111;789:25;823:46;:::i;:::-;163:738;;;;-1:-1:-1;163:738:111;;-1:-1:-1;;163:738:111:o;:::-;108:452:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_12683":{"entryPoint":null,"id":12683,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":5101,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":2997,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_13056":{"entryPoint":3622,"id":13056,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":3463,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":3346,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_12977":{"entryPoint":4353,"id":12977,"parameterSlots":3,"returnSlots":2},"@addDepositFor_12770":{"entryPoint":1684,"id":12770,"parameterSlots":2,"returnSlots":0},"@addStake_7469":{"entryPoint":1354,"id":7469,"parameterSlots":1,"returnSlots":0},"@balances_12687":{"entryPoint":null,"id":12687,"parameterSlots":0,"returnSlots":0},"@depositInfo_12793":{"entryPoint":null,"id":12793,"parameterSlots":1,"returnSlots":2},"@deposit_7433":{"entryPoint":2365,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":5455,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":5416,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPriceOracle_12699":{"entryPoint":null,"id":12699,"parameterSlots":0,"returnSlots":0},"@gasPrice_11050":{"entryPoint":5369,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":2183,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEthTest_20282":{"entryPoint":2501,"id":20282,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEth_12903":{"entryPoint":3948,"id":12903,"parameterSlots":1,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_12818":{"entryPoint":null,"id":12818,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":5431,"id":11162,"parameterSlots":2,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":1853,"id":7395,"parameterSlots":4,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":1833,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":3126,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":5010,"id":4512,"parameterSlots":3,"returnSlots":0},"@supportedTokenDecimals_12696":{"entryPoint":null,"id":12696,"parameterSlots":0,"returnSlots":0},"@supportedToken_12694":{"entryPoint":null,"id":12694,"parameterSlots":0,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":2518,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_12691":{"entryPoint":null,"id":12691,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":1879,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_12806":{"entryPoint":null,"id":12806,"parameterSlots":0,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":2706,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":5736,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":2011,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1532,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_12859":{"entryPoint":2741,"id":12859,"parameterSlots":2,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":6075,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":6031,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256":{"entryPoint":6627,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_addresst_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":7203,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":6104,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":6272,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256":{"entryPoint":6247,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":6579,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":5959,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":6400,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":7237,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":6474,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":7265,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_t_uint256":{"entryPoint":6555,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":6747,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":6853,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":7141,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":7188,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":6950,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":6686,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":6604,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint8":{"entryPoint":7153,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":6356,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":6508,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":6806,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":5997,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:15956:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"411:125:111","statements":[{"nodeType":"YulAssignment","src":"421:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"433:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"444:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"429:3:111"},"nodeType":"YulFunctionCall","src":"429:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"421:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"463:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"478:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"486:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"474:3:111"},"nodeType":"YulFunctionCall","src":"474:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"456:6:111"},"nodeType":"YulFunctionCall","src":"456:74:111"},"nodeType":"YulExpressionStatement","src":"456:74:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"380:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"391:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"402:4:111","type":""}],"src":"295:241:111"},{"body":{"nodeType":"YulBlock","src":"594:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"681:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"690:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"693:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"683:6:111"},"nodeType":"YulFunctionCall","src":"683:12:111"},"nodeType":"YulExpressionStatement","src":"683:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"617:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"628:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"635:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"624:3:111"},"nodeType":"YulFunctionCall","src":"624:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"614:2:111"},"nodeType":"YulFunctionCall","src":"614:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"607:6:111"},"nodeType":"YulFunctionCall","src":"607:73:111"},"nodeType":"YulIf","src":"604:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"583:5:111","type":""}],"src":"541:162:111"},{"body":{"nodeType":"YulBlock","src":"803:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"849:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"858:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"861:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"851:6:111"},"nodeType":"YulFunctionCall","src":"851:12:111"},"nodeType":"YulExpressionStatement","src":"851:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"824:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"833:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"820:3:111"},"nodeType":"YulFunctionCall","src":"820:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"845:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"816:3:111"},"nodeType":"YulFunctionCall","src":"816:32:111"},"nodeType":"YulIf","src":"813:52:111"},{"nodeType":"YulVariableDeclaration","src":"874:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"900:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"887:12:111"},"nodeType":"YulFunctionCall","src":"887:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"878:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"952:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"919:32:111"},"nodeType":"YulFunctionCall","src":"919:39:111"},"nodeType":"YulExpressionStatement","src":"919:39:111"},{"nodeType":"YulAssignment","src":"967:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"977:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"967:6:111"}]},{"nodeType":"YulAssignment","src":"991:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1018:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1029:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1014:3:111"},"nodeType":"YulFunctionCall","src":"1014:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1001:12:111"},"nodeType":"YulFunctionCall","src":"1001:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"991:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"761:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"772:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"784:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"792:6:111","type":""}],"src":"708:331:111"},{"body":{"nodeType":"YulBlock","src":"1141:87:111","statements":[{"nodeType":"YulAssignment","src":"1151:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1163:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1174:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1159:3:111"},"nodeType":"YulFunctionCall","src":"1159:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1151:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1193:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1208:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1216:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1204:3:111"},"nodeType":"YulFunctionCall","src":"1204:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1186:6:111"},"nodeType":"YulFunctionCall","src":"1186:36:111"},"nodeType":"YulExpressionStatement","src":"1186:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1110:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1121:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1132:4:111","type":""}],"src":"1044:184:111"},{"body":{"nodeType":"YulBlock","src":"1303:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"1349:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1358:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1361:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1351:6:111"},"nodeType":"YulFunctionCall","src":"1351:12:111"},"nodeType":"YulExpressionStatement","src":"1351:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1324:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1333:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1320:3:111"},"nodeType":"YulFunctionCall","src":"1320:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1345:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1316:3:111"},"nodeType":"YulFunctionCall","src":"1316:32:111"},"nodeType":"YulIf","src":"1313:52:111"},{"nodeType":"YulVariableDeclaration","src":"1374:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1400:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1387:12:111"},"nodeType":"YulFunctionCall","src":"1387:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1378:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1452:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1419:32:111"},"nodeType":"YulFunctionCall","src":"1419:39:111"},"nodeType":"YulExpressionStatement","src":"1419:39:111"},{"nodeType":"YulAssignment","src":"1467:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1477:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1467:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1269:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1280:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1292:6:111","type":""}],"src":"1233:255:111"},{"body":{"nodeType":"YulBlock","src":"1594:76:111","statements":[{"nodeType":"YulAssignment","src":"1604:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1616:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1627:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1612:3:111"},"nodeType":"YulFunctionCall","src":"1612:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1604:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1646:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1657:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1639:6:111"},"nodeType":"YulFunctionCall","src":"1639:25:111"},"nodeType":"YulExpressionStatement","src":"1639:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1563:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1574:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1585:4:111","type":""}],"src":"1493:177:111"},{"body":{"nodeType":"YulBlock","src":"1762:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"1808:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1817:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1820:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1810:6:111"},"nodeType":"YulFunctionCall","src":"1810:12:111"},"nodeType":"YulExpressionStatement","src":"1810:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1783:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1792:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1779:3:111"},"nodeType":"YulFunctionCall","src":"1779:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1804:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1775:3:111"},"nodeType":"YulFunctionCall","src":"1775:32:111"},"nodeType":"YulIf","src":"1772:52:111"},{"nodeType":"YulVariableDeclaration","src":"1833:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1859:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1846:12:111"},"nodeType":"YulFunctionCall","src":"1846:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1837:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1911:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1878:32:111"},"nodeType":"YulFunctionCall","src":"1878:39:111"},"nodeType":"YulExpressionStatement","src":"1878:39:111"},{"nodeType":"YulAssignment","src":"1926:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1936:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1926:6:111"}]},{"nodeType":"YulAssignment","src":"1950:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1977:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1988:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1973:3:111"},"nodeType":"YulFunctionCall","src":"1973:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1960:12:111"},"nodeType":"YulFunctionCall","src":"1960:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1950:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1720:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1731:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1743:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1751:6:111","type":""}],"src":"1675:323:111"},{"body":{"nodeType":"YulBlock","src":"2132:119:111","statements":[{"nodeType":"YulAssignment","src":"2142:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2154:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2165:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2150:3:111"},"nodeType":"YulFunctionCall","src":"2150:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2142:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2184:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"2195:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2177:6:111"},"nodeType":"YulFunctionCall","src":"2177:25:111"},"nodeType":"YulExpressionStatement","src":"2177:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2222:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2233:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2218:3:111"},"nodeType":"YulFunctionCall","src":"2218:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"2238:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2211:6:111"},"nodeType":"YulFunctionCall","src":"2211:34:111"},"nodeType":"YulExpressionStatement","src":"2211:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2093:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2104:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2112:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2123:4:111","type":""}],"src":"2003:248:111"},{"body":{"nodeType":"YulBlock","src":"2386:125:111","statements":[{"nodeType":"YulAssignment","src":"2396:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2408:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2419:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2404:3:111"},"nodeType":"YulFunctionCall","src":"2404:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2396:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2438:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2453:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2461:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2449:3:111"},"nodeType":"YulFunctionCall","src":"2449:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2431:6:111"},"nodeType":"YulFunctionCall","src":"2431:74:111"},"nodeType":"YulExpressionStatement","src":"2431:74:111"}]},"name":"abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2355:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2366:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2377:4:111","type":""}],"src":"2256:255:111"},{"body":{"nodeType":"YulBlock","src":"2617:125:111","statements":[{"nodeType":"YulAssignment","src":"2627:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2639:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2650:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2635:3:111"},"nodeType":"YulFunctionCall","src":"2635:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2627:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2669:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2684:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2692:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2680:3:111"},"nodeType":"YulFunctionCall","src":"2680:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2662:6:111"},"nodeType":"YulFunctionCall","src":"2662:74:111"},"nodeType":"YulExpressionStatement","src":"2662:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2586:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2597:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2608:4:111","type":""}],"src":"2516:226:111"},{"body":{"nodeType":"YulBlock","src":"2886:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"2932:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2941:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2944:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2934:6:111"},"nodeType":"YulFunctionCall","src":"2934:12:111"},"nodeType":"YulExpressionStatement","src":"2934:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2907:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2916:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2903:3:111"},"nodeType":"YulFunctionCall","src":"2903:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2928:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2899:3:111"},"nodeType":"YulFunctionCall","src":"2899:32:111"},"nodeType":"YulIf","src":"2896:52:111"},{"nodeType":"YulVariableDeclaration","src":"2957:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2983:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2970:12:111"},"nodeType":"YulFunctionCall","src":"2970:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2961:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3026:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3035:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3038:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3028:6:111"},"nodeType":"YulFunctionCall","src":"3028:12:111"},"nodeType":"YulExpressionStatement","src":"3028:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3015:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"3022:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3012:2:111"},"nodeType":"YulFunctionCall","src":"3012:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3005:6:111"},"nodeType":"YulFunctionCall","src":"3005:20:111"},"nodeType":"YulIf","src":"3002:40:111"},{"nodeType":"YulAssignment","src":"3051:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3061:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3051:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3075:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3106:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3117:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3102:3:111"},"nodeType":"YulFunctionCall","src":"3102:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3089:12:111"},"nodeType":"YulFunctionCall","src":"3089:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"3079:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3130:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"3140:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"3134:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3185:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3194:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3197:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3187:6:111"},"nodeType":"YulFunctionCall","src":"3187:12:111"},"nodeType":"YulExpressionStatement","src":"3187:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3173:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3181:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3170:2:111"},"nodeType":"YulFunctionCall","src":"3170:14:111"},"nodeType":"YulIf","src":"3167:34:111"},{"nodeType":"YulVariableDeclaration","src":"3210:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3224:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"3235:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3220:3:111"},"nodeType":"YulFunctionCall","src":"3220:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"3214:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3290:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3299:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3302:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3292:6:111"},"nodeType":"YulFunctionCall","src":"3292:12:111"},"nodeType":"YulExpressionStatement","src":"3292:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3269:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3273:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3265:3:111"},"nodeType":"YulFunctionCall","src":"3265:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3280:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3261:3:111"},"nodeType":"YulFunctionCall","src":"3261:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3254:6:111"},"nodeType":"YulFunctionCall","src":"3254:35:111"},"nodeType":"YulIf","src":"3251:55:111"},{"nodeType":"YulVariableDeclaration","src":"3315:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3342:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3329:12:111"},"nodeType":"YulFunctionCall","src":"3329:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"3319:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"3372:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3381:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3384:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3374:6:111"},"nodeType":"YulFunctionCall","src":"3374:12:111"},"nodeType":"YulExpressionStatement","src":"3374:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"3360:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"3368:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3357:2:111"},"nodeType":"YulFunctionCall","src":"3357:14:111"},"nodeType":"YulIf","src":"3354:34:111"},{"body":{"nodeType":"YulBlock","src":"3438:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3447:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3450:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3440:6:111"},"nodeType":"YulFunctionCall","src":"3440:12:111"},"nodeType":"YulExpressionStatement","src":"3440:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3411:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"3415:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3407:3:111"},"nodeType":"YulFunctionCall","src":"3407:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"3424:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3403:3:111"},"nodeType":"YulFunctionCall","src":"3403:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3429:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3400:2:111"},"nodeType":"YulFunctionCall","src":"3400:37:111"},"nodeType":"YulIf","src":"3397:57:111"},{"nodeType":"YulAssignment","src":"3463:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"3477:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"3481:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3473:3:111"},"nodeType":"YulFunctionCall","src":"3473:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"3463:6:111"}]},{"nodeType":"YulAssignment","src":"3493:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"3503:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"3493:6:111"}]},{"nodeType":"YulAssignment","src":"3518:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3545:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3556:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3541:3:111"},"nodeType":"YulFunctionCall","src":"3541:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3528:12:111"},"nodeType":"YulFunctionCall","src":"3528:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"3518:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2828:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2839:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2851:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2859:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2867:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2875:6:111","type":""}],"src":"2747:819:111"},{"body":{"nodeType":"YulBlock","src":"3693:125:111","statements":[{"nodeType":"YulAssignment","src":"3703:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3715:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3726:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3711:3:111"},"nodeType":"YulFunctionCall","src":"3711:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3703:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3745:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"3760:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"3768:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3756:3:111"},"nodeType":"YulFunctionCall","src":"3756:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3738:6:111"},"nodeType":"YulFunctionCall","src":"3738:74:111"},"nodeType":"YulExpressionStatement","src":"3738:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3662:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3673:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3684:4:111","type":""}],"src":"3571:247:111"},{"body":{"nodeType":"YulBlock","src":"3901:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3947:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3956:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3959:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3949:6:111"},"nodeType":"YulFunctionCall","src":"3949:12:111"},"nodeType":"YulExpressionStatement","src":"3949:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3922:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3931:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3918:3:111"},"nodeType":"YulFunctionCall","src":"3918:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3943:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3914:3:111"},"nodeType":"YulFunctionCall","src":"3914:32:111"},"nodeType":"YulIf","src":"3911:52:111"},{"nodeType":"YulVariableDeclaration","src":"3972:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3998:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3985:12:111"},"nodeType":"YulFunctionCall","src":"3985:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3976:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4050:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"4017:32:111"},"nodeType":"YulFunctionCall","src":"4017:39:111"},"nodeType":"YulExpressionStatement","src":"4017:39:111"},{"nodeType":"YulAssignment","src":"4065:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4075:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4065:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3867:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3878:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3890:6:111","type":""}],"src":"3823:263:111"},{"body":{"nodeType":"YulBlock","src":"4161:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"4207:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4216:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4219:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4209:6:111"},"nodeType":"YulFunctionCall","src":"4209:12:111"},"nodeType":"YulExpressionStatement","src":"4209:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4182:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4191:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4178:3:111"},"nodeType":"YulFunctionCall","src":"4178:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4203:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4174:3:111"},"nodeType":"YulFunctionCall","src":"4174:32:111"},"nodeType":"YulIf","src":"4171:52:111"},{"nodeType":"YulAssignment","src":"4232:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4255:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4242:12:111"},"nodeType":"YulFunctionCall","src":"4242:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4232:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4127:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4138:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4150:6:111","type":""}],"src":"4091:180:111"},{"body":{"nodeType":"YulBlock","src":"4414:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"4460:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4469:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4472:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4462:6:111"},"nodeType":"YulFunctionCall","src":"4462:12:111"},"nodeType":"YulExpressionStatement","src":"4462:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4435:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4444:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4431:3:111"},"nodeType":"YulFunctionCall","src":"4431:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4456:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4427:3:111"},"nodeType":"YulFunctionCall","src":"4427:32:111"},"nodeType":"YulIf","src":"4424:52:111"},{"nodeType":"YulVariableDeclaration","src":"4485:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4512:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4499:12:111"},"nodeType":"YulFunctionCall","src":"4499:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4489:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4565:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4574:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4577:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4567:6:111"},"nodeType":"YulFunctionCall","src":"4567:12:111"},"nodeType":"YulExpressionStatement","src":"4567:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"4537:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4545:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4534:2:111"},"nodeType":"YulFunctionCall","src":"4534:30:111"},"nodeType":"YulIf","src":"4531:50:111"},{"nodeType":"YulVariableDeclaration","src":"4590:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4604:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"4615:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4600:3:111"},"nodeType":"YulFunctionCall","src":"4600:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4594:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4661:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4670:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4673:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4663:6:111"},"nodeType":"YulFunctionCall","src":"4663:12:111"},"nodeType":"YulExpressionStatement","src":"4663:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4642:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"4651:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4638:3:111"},"nodeType":"YulFunctionCall","src":"4638:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"4656:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4634:3:111"},"nodeType":"YulFunctionCall","src":"4634:26:111"},"nodeType":"YulIf","src":"4631:46:111"},{"nodeType":"YulAssignment","src":"4686:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"4696:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4686:6:111"}]},{"nodeType":"YulAssignment","src":"4707:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4734:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4745:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4730:3:111"},"nodeType":"YulFunctionCall","src":"4730:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4717:12:111"},"nodeType":"YulFunctionCall","src":"4717:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4707:6:111"}]},{"nodeType":"YulAssignment","src":"4758:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4785:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4796:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4781:3:111"},"nodeType":"YulFunctionCall","src":"4781:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4768:12:111"},"nodeType":"YulFunctionCall","src":"4768:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4758:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4364:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4375:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4387:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4395:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4403:6:111","type":""}],"src":"4276:530:111"},{"body":{"nodeType":"YulBlock","src":"4864:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"4874:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4883:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"4878:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4943:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"4968:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"4973:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4964:3:111"},"nodeType":"YulFunctionCall","src":"4964:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"4987:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"4992:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4983:3:111"},"nodeType":"YulFunctionCall","src":"4983:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4977:5:111"},"nodeType":"YulFunctionCall","src":"4977:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4957:6:111"},"nodeType":"YulFunctionCall","src":"4957:39:111"},"nodeType":"YulExpressionStatement","src":"4957:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4904:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"4907:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4901:2:111"},"nodeType":"YulFunctionCall","src":"4901:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"4915:19:111","statements":[{"nodeType":"YulAssignment","src":"4917:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"4926:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"4929:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4922:3:111"},"nodeType":"YulFunctionCall","src":"4922:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"4917:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"4897:3:111","statements":[]},"src":"4893:113:111"},{"body":{"nodeType":"YulBlock","src":"5032:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5045:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5050:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5041:3:111"},"nodeType":"YulFunctionCall","src":"5041:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"5059:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5034:6:111"},"nodeType":"YulFunctionCall","src":"5034:27:111"},"nodeType":"YulExpressionStatement","src":"5034:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5021:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"5024:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5018:2:111"},"nodeType":"YulFunctionCall","src":"5018:13:111"},"nodeType":"YulIf","src":"5015:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"4842:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"4847:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"4852:6:111","type":""}],"src":"4811:258:111"},{"body":{"nodeType":"YulBlock","src":"5123:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"5133:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5153:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5147:5:111"},"nodeType":"YulFunctionCall","src":"5147:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5137:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5175:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"5180:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5168:6:111"},"nodeType":"YulFunctionCall","src":"5168:19:111"},"nodeType":"YulExpressionStatement","src":"5168:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5222:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"5229:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5218:3:111"},"nodeType":"YulFunctionCall","src":"5218:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5240:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"5245:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5236:3:111"},"nodeType":"YulFunctionCall","src":"5236:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"5252:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"5196:21:111"},"nodeType":"YulFunctionCall","src":"5196:63:111"},"nodeType":"YulExpressionStatement","src":"5196:63:111"},{"nodeType":"YulAssignment","src":"5268:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5283:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5296:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5304:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5292:3:111"},"nodeType":"YulFunctionCall","src":"5292:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5309:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5288:3:111"},"nodeType":"YulFunctionCall","src":"5288:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5279:3:111"},"nodeType":"YulFunctionCall","src":"5279:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"5379:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5275:3:111"},"nodeType":"YulFunctionCall","src":"5275:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"5268:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"5100:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"5107:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"5115:3:111","type":""}],"src":"5074:316:111"},{"body":{"nodeType":"YulBlock","src":"5542:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5559:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5570:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5552:6:111"},"nodeType":"YulFunctionCall","src":"5552:21:111"},"nodeType":"YulExpressionStatement","src":"5552:21:111"},{"nodeType":"YulAssignment","src":"5582:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5607:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5619:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5630:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5615:3:111"},"nodeType":"YulFunctionCall","src":"5615:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"5590:16:111"},"nodeType":"YulFunctionCall","src":"5590:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5582:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5654:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5665:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5650:3:111"},"nodeType":"YulFunctionCall","src":"5650:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"5670:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5643:6:111"},"nodeType":"YulFunctionCall","src":"5643:34:111"},"nodeType":"YulExpressionStatement","src":"5643:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5503:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"5514:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5522:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5533:4:111","type":""}],"src":"5395:288:111"},{"body":{"nodeType":"YulBlock","src":"5787:93:111","statements":[{"nodeType":"YulAssignment","src":"5797:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5809:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5820:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5805:3:111"},"nodeType":"YulFunctionCall","src":"5805:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5797:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5839:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5854:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5862:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5850:3:111"},"nodeType":"YulFunctionCall","src":"5850:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5832:6:111"},"nodeType":"YulFunctionCall","src":"5832:42:111"},"nodeType":"YulExpressionStatement","src":"5832:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5756:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5767:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5778:4:111","type":""}],"src":"5688:192:111"},{"body":{"nodeType":"YulBlock","src":"6030:168:111","statements":[{"nodeType":"YulAssignment","src":"6040:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6052:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6063:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6048:3:111"},"nodeType":"YulFunctionCall","src":"6048:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6040:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6082:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6097:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6105:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6093:3:111"},"nodeType":"YulFunctionCall","src":"6093:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6075:6:111"},"nodeType":"YulFunctionCall","src":"6075:74:111"},"nodeType":"YulExpressionStatement","src":"6075:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6169:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6180:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6165:3:111"},"nodeType":"YulFunctionCall","src":"6165:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"6185:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6158:6:111"},"nodeType":"YulFunctionCall","src":"6158:34:111"},"nodeType":"YulExpressionStatement","src":"6158:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5991:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6002:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6010:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6021:4:111","type":""}],"src":"5885:313:111"},{"body":{"nodeType":"YulBlock","src":"6235:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6252:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6255:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6245:6:111"},"nodeType":"YulFunctionCall","src":"6245:88:111"},"nodeType":"YulExpressionStatement","src":"6245:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6349:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"6352:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6342:6:111"},"nodeType":"YulFunctionCall","src":"6342:15:111"},"nodeType":"YulExpressionStatement","src":"6342:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6373:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6376:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6366:6:111"},"nodeType":"YulFunctionCall","src":"6366:15:111"},"nodeType":"YulExpressionStatement","src":"6366:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"6203:184:111"},{"body":{"nodeType":"YulBlock","src":"6440:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"6467:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"6469:16:111"},"nodeType":"YulFunctionCall","src":"6469:18:111"},"nodeType":"YulExpressionStatement","src":"6469:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"6456:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"6463:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"6459:3:111"},"nodeType":"YulFunctionCall","src":"6459:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6453:2:111"},"nodeType":"YulFunctionCall","src":"6453:13:111"},"nodeType":"YulIf","src":"6450:39:111"},{"nodeType":"YulAssignment","src":"6498:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"6509:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"6512:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6505:3:111"},"nodeType":"YulFunctionCall","src":"6505:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"6498:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"6423:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"6426:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"6432:3:111","type":""}],"src":"6392:128:111"},{"body":{"nodeType":"YulBlock","src":"6642:125:111","statements":[{"nodeType":"YulAssignment","src":"6652:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6664:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6675:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6660:3:111"},"nodeType":"YulFunctionCall","src":"6660:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"6652:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6694:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"6709:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6717:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"6705:3:111"},"nodeType":"YulFunctionCall","src":"6705:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6687:6:111"},"nodeType":"YulFunctionCall","src":"6687:74:111"},"nodeType":"YulExpressionStatement","src":"6687:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6611:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6622:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"6633:4:111","type":""}],"src":"6525:242:111"},{"body":{"nodeType":"YulBlock","src":"6853:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"6899:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6908:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6911:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6901:6:111"},"nodeType":"YulFunctionCall","src":"6901:12:111"},"nodeType":"YulExpressionStatement","src":"6901:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6874:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6883:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6870:3:111"},"nodeType":"YulFunctionCall","src":"6870:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6895:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6866:3:111"},"nodeType":"YulFunctionCall","src":"6866:32:111"},"nodeType":"YulIf","src":"6863:52:111"},{"nodeType":"YulAssignment","src":"6924:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6940:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6934:5:111"},"nodeType":"YulFunctionCall","src":"6934:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6924:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6819:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6830:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6842:6:111","type":""}],"src":"6772:184:111"},{"body":{"nodeType":"YulBlock","src":"7135:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7152:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7163:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7145:6:111"},"nodeType":"YulFunctionCall","src":"7145:21:111"},"nodeType":"YulExpressionStatement","src":"7145:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7186:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7197:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7182:3:111"},"nodeType":"YulFunctionCall","src":"7182:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7202:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7175:6:111"},"nodeType":"YulFunctionCall","src":"7175:30:111"},"nodeType":"YulExpressionStatement","src":"7175:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7225:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7236:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7221:3:111"},"nodeType":"YulFunctionCall","src":"7221:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"7241:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7214:6:111"},"nodeType":"YulFunctionCall","src":"7214:62:111"},"nodeType":"YulExpressionStatement","src":"7214:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7296:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7307:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7292:3:111"},"nodeType":"YulFunctionCall","src":"7292:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"7312:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7285:6:111"},"nodeType":"YulFunctionCall","src":"7285:36:111"},"nodeType":"YulExpressionStatement","src":"7285:36:111"},{"nodeType":"YulAssignment","src":"7330:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7342:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7353:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7338:3:111"},"nodeType":"YulFunctionCall","src":"7338:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7330:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7112:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7126:4:111","type":""}],"src":"6961:402:111"},{"body":{"nodeType":"YulBlock","src":"7542:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7559:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7570:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7552:6:111"},"nodeType":"YulFunctionCall","src":"7552:21:111"},"nodeType":"YulExpressionStatement","src":"7552:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7593:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7604:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7589:3:111"},"nodeType":"YulFunctionCall","src":"7589:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"7609:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7582:6:111"},"nodeType":"YulFunctionCall","src":"7582:30:111"},"nodeType":"YulExpressionStatement","src":"7582:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7632:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7643:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7628:3:111"},"nodeType":"YulFunctionCall","src":"7628:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"7648:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7621:6:111"},"nodeType":"YulFunctionCall","src":"7621:62:111"},"nodeType":"YulExpressionStatement","src":"7621:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7703:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7714:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7699:3:111"},"nodeType":"YulFunctionCall","src":"7699:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"7719:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7692:6:111"},"nodeType":"YulFunctionCall","src":"7692:39:111"},"nodeType":"YulExpressionStatement","src":"7692:39:111"},{"nodeType":"YulAssignment","src":"7740:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7752:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7763:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7748:3:111"},"nodeType":"YulFunctionCall","src":"7748:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7740:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7519:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7533:4:111","type":""}],"src":"7368:405:111"},{"body":{"nodeType":"YulBlock","src":"7827:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"7849:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"7851:16:111"},"nodeType":"YulFunctionCall","src":"7851:18:111"},"nodeType":"YulExpressionStatement","src":"7851:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7843:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7846:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7840:2:111"},"nodeType":"YulFunctionCall","src":"7840:8:111"},"nodeType":"YulIf","src":"7837:34:111"},{"nodeType":"YulAssignment","src":"7880:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"7892:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"7895:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7888:3:111"},"nodeType":"YulFunctionCall","src":"7888:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"7880:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"7809:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"7812:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"7818:4:111","type":""}],"src":"7778:125:111"},{"body":{"nodeType":"YulBlock","src":"8082:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8099:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8110:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8092:6:111"},"nodeType":"YulFunctionCall","src":"8092:21:111"},"nodeType":"YulExpressionStatement","src":"8092:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8133:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8144:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8129:3:111"},"nodeType":"YulFunctionCall","src":"8129:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8149:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8122:6:111"},"nodeType":"YulFunctionCall","src":"8122:30:111"},"nodeType":"YulExpressionStatement","src":"8122:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8183:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8168:3:111"},"nodeType":"YulFunctionCall","src":"8168:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"8188:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8161:6:111"},"nodeType":"YulFunctionCall","src":"8161:62:111"},"nodeType":"YulExpressionStatement","src":"8161:62:111"},{"nodeType":"YulAssignment","src":"8232:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8244:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8255:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8240:3:111"},"nodeType":"YulFunctionCall","src":"8240:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8232:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8059:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8073:4:111","type":""}],"src":"7908:356:111"},{"body":{"nodeType":"YulBlock","src":"8426:241:111","statements":[{"nodeType":"YulAssignment","src":"8436:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8448:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8459:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8444:3:111"},"nodeType":"YulFunctionCall","src":"8444:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8436:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"8471:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"8481:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8475:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8539:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8554:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8562:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8550:3:111"},"nodeType":"YulFunctionCall","src":"8550:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8532:6:111"},"nodeType":"YulFunctionCall","src":"8532:34:111"},"nodeType":"YulExpressionStatement","src":"8532:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8586:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8597:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8582:3:111"},"nodeType":"YulFunctionCall","src":"8582:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"8606:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"8614:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8602:3:111"},"nodeType":"YulFunctionCall","src":"8602:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8575:6:111"},"nodeType":"YulFunctionCall","src":"8575:43:111"},"nodeType":"YulExpressionStatement","src":"8575:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8638:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8649:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8634:3:111"},"nodeType":"YulFunctionCall","src":"8634:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"8654:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8627:6:111"},"nodeType":"YulFunctionCall","src":"8627:34:111"},"nodeType":"YulExpressionStatement","src":"8627:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8379:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"8390:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8398:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8406:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8417:4:111","type":""}],"src":"8269:398:111"},{"body":{"nodeType":"YulBlock","src":"8846:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8863:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8874:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8856:6:111"},"nodeType":"YulFunctionCall","src":"8856:21:111"},"nodeType":"YulExpressionStatement","src":"8856:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8897:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8908:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8893:3:111"},"nodeType":"YulFunctionCall","src":"8893:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8913:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8886:6:111"},"nodeType":"YulFunctionCall","src":"8886:30:111"},"nodeType":"YulExpressionStatement","src":"8886:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8936:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8947:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8932:3:111"},"nodeType":"YulFunctionCall","src":"8932:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"8952:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8925:6:111"},"nodeType":"YulFunctionCall","src":"8925:51:111"},"nodeType":"YulExpressionStatement","src":"8925:51:111"},{"nodeType":"YulAssignment","src":"8985:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8997:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9008:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8993:3:111"},"nodeType":"YulFunctionCall","src":"8993:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8985:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8823:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8837:4:111","type":""}],"src":"8672:345:111"},{"body":{"nodeType":"YulBlock","src":"9151:339:111","statements":[{"body":{"nodeType":"YulBlock","src":"9198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9200:6:111"},"nodeType":"YulFunctionCall","src":"9200:12:111"},"nodeType":"YulExpressionStatement","src":"9200:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"9172:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"9181:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"9168:3:111"},"nodeType":"YulFunctionCall","src":"9168:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"9193:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"9164:3:111"},"nodeType":"YulFunctionCall","src":"9164:33:111"},"nodeType":"YulIf","src":"9161:53:111"},{"nodeType":"YulVariableDeclaration","src":"9223:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9249:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9236:12:111"},"nodeType":"YulFunctionCall","src":"9236:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"9227:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9301:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"9268:32:111"},"nodeType":"YulFunctionCall","src":"9268:39:111"},"nodeType":"YulExpressionStatement","src":"9268:39:111"},{"nodeType":"YulAssignment","src":"9316:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"9326:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"9316:6:111"}]},{"nodeType":"YulAssignment","src":"9340:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9367:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9378:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9363:3:111"},"nodeType":"YulFunctionCall","src":"9363:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9350:12:111"},"nodeType":"YulFunctionCall","src":"9350:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"9340:6:111"}]},{"nodeType":"YulAssignment","src":"9391:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9418:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9429:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9414:3:111"},"nodeType":"YulFunctionCall","src":"9414:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9401:12:111"},"nodeType":"YulFunctionCall","src":"9401:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"9391:6:111"}]},{"nodeType":"YulAssignment","src":"9442:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9469:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9480:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9465:3:111"},"nodeType":"YulFunctionCall","src":"9465:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"9452:12:111"},"nodeType":"YulFunctionCall","src":"9452:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"9442:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9093:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"9104:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"9116:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9124:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"9132:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"9140:6:111","type":""}],"src":"9022:468:111"},{"body":{"nodeType":"YulBlock","src":"9547:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"9666:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9668:16:111"},"nodeType":"YulFunctionCall","src":"9668:18:111"},"nodeType":"YulExpressionStatement","src":"9668:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9578:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9571:6:111"},"nodeType":"YulFunctionCall","src":"9571:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9564:6:111"},"nodeType":"YulFunctionCall","src":"9564:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9586:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9593:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"9661:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"9589:3:111"},"nodeType":"YulFunctionCall","src":"9589:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9583:2:111"},"nodeType":"YulFunctionCall","src":"9583:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9560:3:111"},"nodeType":"YulFunctionCall","src":"9560:105:111"},"nodeType":"YulIf","src":"9557:131:111"},{"nodeType":"YulAssignment","src":"9697:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9712:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9715:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"9708:3:111"},"nodeType":"YulFunctionCall","src":"9708:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"9697:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9526:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9529:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"9535:7:111","type":""}],"src":"9495:228:111"},{"body":{"nodeType":"YulBlock","src":"9774:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"9805:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9826:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9829:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9819:6:111"},"nodeType":"YulFunctionCall","src":"9819:88:111"},"nodeType":"YulExpressionStatement","src":"9819:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9927:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9930:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9920:6:111"},"nodeType":"YulFunctionCall","src":"9920:15:111"},"nodeType":"YulExpressionStatement","src":"9920:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9955:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9958:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9948:6:111"},"nodeType":"YulFunctionCall","src":"9948:15:111"},"nodeType":"YulExpressionStatement","src":"9948:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9794:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"9787:6:111"},"nodeType":"YulFunctionCall","src":"9787:9:111"},"nodeType":"YulIf","src":"9784:189:111"},{"nodeType":"YulAssignment","src":"9982:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9991:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9994:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"9987:3:111"},"nodeType":"YulFunctionCall","src":"9987:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"9982:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9759:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9762:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"9768:1:111","type":""}],"src":"9728:274:111"},{"body":{"nodeType":"YulBlock","src":"10039:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10056:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10059:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10049:6:111"},"nodeType":"YulFunctionCall","src":"10049:88:111"},"nodeType":"YulExpressionStatement","src":"10049:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10153:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"10156:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10146:6:111"},"nodeType":"YulFunctionCall","src":"10146:15:111"},"nodeType":"YulExpressionStatement","src":"10146:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10177:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"10180:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"10170:6:111"},"nodeType":"YulFunctionCall","src":"10170:15:111"},"nodeType":"YulExpressionStatement","src":"10170:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"10007:184:111"},{"body":{"nodeType":"YulBlock","src":"10260:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"10270:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10285:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"10274:7:111","type":""}]},{"nodeType":"YulAssignment","src":"10295:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"10304:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"10295:5:111"}]},{"nodeType":"YulAssignment","src":"10320:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"10328:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"10320:4:111"}]},{"body":{"nodeType":"YulBlock","src":"10384:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"10489:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"10491:16:111"},"nodeType":"YulFunctionCall","src":"10491:18:111"},"nodeType":"YulExpressionStatement","src":"10491:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"10404:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"10414:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"10482:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"10410:3:111"},"nodeType":"YulFunctionCall","src":"10410:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10401:2:111"},"nodeType":"YulFunctionCall","src":"10401:87:111"},"nodeType":"YulIf","src":"10398:113:111"},{"body":{"nodeType":"YulBlock","src":"10550:29:111","statements":[{"nodeType":"YulAssignment","src":"10552:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"10565:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"10572:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"10561:3:111"},"nodeType":"YulFunctionCall","src":"10561:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"10552:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"10531:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"10541:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10527:3:111"},"nodeType":"YulFunctionCall","src":"10527:22:111"},"nodeType":"YulIf","src":"10524:55:111"},{"nodeType":"YulAssignment","src":"10592:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"10604:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"10610:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"10600:3:111"},"nodeType":"YulFunctionCall","src":"10600:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"10592:4:111"}]},{"nodeType":"YulAssignment","src":"10628:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"10644:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"10653:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"10640:3:111"},"nodeType":"YulFunctionCall","src":"10640:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"10628:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"10353:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"10363:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"10350:2:111"},"nodeType":"YulFunctionCall","src":"10350:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"10372:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"10346:3:111","statements":[]},"src":"10342:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"10224:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"10231:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"10244:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"10251:4:111","type":""}],"src":"10196:482:111"},{"body":{"nodeType":"YulBlock","src":"10742:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"10780:52:111","statements":[{"nodeType":"YulAssignment","src":"10794:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10803:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"10794:5:111"}]},{"nodeType":"YulLeave","src":"10817:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"10762:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10755:6:111"},"nodeType":"YulFunctionCall","src":"10755:16:111"},"nodeType":"YulIf","src":"10752:80:111"},{"body":{"nodeType":"YulBlock","src":"10865:52:111","statements":[{"nodeType":"YulAssignment","src":"10879:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10888:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"10879:5:111"}]},{"nodeType":"YulLeave","src":"10902:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"10851:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10844:6:111"},"nodeType":"YulFunctionCall","src":"10844:12:111"},"nodeType":"YulIf","src":"10841:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"10953:52:111","statements":[{"nodeType":"YulAssignment","src":"10967:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10976:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"10967:5:111"}]},{"nodeType":"YulLeave","src":"10990:5:111"}]},"nodeType":"YulCase","src":"10946:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"10951:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"11021:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"11056:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11058:16:111"},"nodeType":"YulFunctionCall","src":"11058:18:111"},"nodeType":"YulExpressionStatement","src":"11058:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"11041:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"11051:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11038:2:111"},"nodeType":"YulFunctionCall","src":"11038:17:111"},"nodeType":"YulIf","src":"11035:43:111"},{"nodeType":"YulAssignment","src":"11091:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"11104:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"11114:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"11100:3:111"},"nodeType":"YulFunctionCall","src":"11100:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"11091:5:111"}]},{"nodeType":"YulLeave","src":"11129:5:111"}]},"nodeType":"YulCase","src":"11014:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"11019:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"10933:4:111"},"nodeType":"YulSwitch","src":"10926:218:111"},{"body":{"nodeType":"YulBlock","src":"11242:70:111","statements":[{"nodeType":"YulAssignment","src":"11256:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11269:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"11275:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"11265:3:111"},"nodeType":"YulFunctionCall","src":"11265:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"11256:5:111"}]},{"nodeType":"YulLeave","src":"11297:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11166:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"11172:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11163:2:111"},"nodeType":"YulFunctionCall","src":"11163:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"11180:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"11190:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11177:2:111"},"nodeType":"YulFunctionCall","src":"11177:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11159:3:111"},"nodeType":"YulFunctionCall","src":"11159:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11203:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"11209:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11200:2:111"},"nodeType":"YulFunctionCall","src":"11200:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"11218:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"11228:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11215:2:111"},"nodeType":"YulFunctionCall","src":"11215:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11196:3:111"},"nodeType":"YulFunctionCall","src":"11196:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"11156:2:111"},"nodeType":"YulFunctionCall","src":"11156:77:111"},"nodeType":"YulIf","src":"11153:159:111"},{"nodeType":"YulVariableDeclaration","src":"11321:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11363:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"11369:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"11344:18:111"},"nodeType":"YulFunctionCall","src":"11344:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"11325:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"11334:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11483:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11485:16:111"},"nodeType":"YulFunctionCall","src":"11485:18:111"},"nodeType":"YulExpressionStatement","src":"11485:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"11393:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11406:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"11474:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"11402:3:111"},"nodeType":"YulFunctionCall","src":"11402:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"11390:2:111"},"nodeType":"YulFunctionCall","src":"11390:92:111"},"nodeType":"YulIf","src":"11387:118:111"},{"nodeType":"YulAssignment","src":"11514:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"11527:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"11536:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"11523:3:111"},"nodeType":"YulFunctionCall","src":"11523:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"11514:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"10713:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"10719:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"10732:5:111","type":""}],"src":"10683:866:111"},{"body":{"nodeType":"YulBlock","src":"11624:61:111","statements":[{"nodeType":"YulAssignment","src":"11634:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11664:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"11670:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"11643:20:111"},"nodeType":"YulFunctionCall","src":"11643:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"11634:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"11595:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"11601:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"11614:5:111","type":""}],"src":"11554:131:111"},{"body":{"nodeType":"YulBlock","src":"11737:148:111","statements":[{"nodeType":"YulVariableDeclaration","src":"11747:23:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11762:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"11765:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11758:3:111"},"nodeType":"YulFunctionCall","src":"11758:12:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"11751:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11779:23:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"11794:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"11797:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11790:3:111"},"nodeType":"YulFunctionCall","src":"11790:12:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"11783:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"11827:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11829:16:111"},"nodeType":"YulFunctionCall","src":"11829:18:111"},"nodeType":"YulExpressionStatement","src":"11829:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"11817:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"11822:3:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11814:2:111"},"nodeType":"YulFunctionCall","src":"11814:12:111"},"nodeType":"YulIf","src":"11811:38:111"},{"nodeType":"YulAssignment","src":"11858:21:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"11870:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"11875:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11866:3:111"},"nodeType":"YulFunctionCall","src":"11866:13:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"11858:4:111"}]}]},"name":"checked_sub_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"11719:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"11722:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"11728:4:111","type":""}],"src":"11690:195:111"},{"body":{"nodeType":"YulBlock","src":"11958:72:111","statements":[{"nodeType":"YulAssignment","src":"11968:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"11998:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"12008:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"12018:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"12004:3:111"},"nodeType":"YulFunctionCall","src":"12004:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"11977:20:111"},"nodeType":"YulFunctionCall","src":"11977:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"11968:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"11929:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"11935:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"11948:5:111","type":""}],"src":"11890:140:111"},{"body":{"nodeType":"YulBlock","src":"12209:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12226:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12237:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12219:6:111"},"nodeType":"YulFunctionCall","src":"12219:21:111"},"nodeType":"YulExpressionStatement","src":"12219:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12260:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12271:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12256:3:111"},"nodeType":"YulFunctionCall","src":"12256:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12276:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12249:6:111"},"nodeType":"YulFunctionCall","src":"12249:30:111"},"nodeType":"YulExpressionStatement","src":"12249:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12299:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12310:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12295:3:111"},"nodeType":"YulFunctionCall","src":"12295:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"12315:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12288:6:111"},"nodeType":"YulFunctionCall","src":"12288:62:111"},"nodeType":"YulExpressionStatement","src":"12288:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12370:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12381:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12366:3:111"},"nodeType":"YulFunctionCall","src":"12366:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"12386:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12359:6:111"},"nodeType":"YulFunctionCall","src":"12359:38:111"},"nodeType":"YulExpressionStatement","src":"12359:38:111"},{"nodeType":"YulAssignment","src":"12406:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12418:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12429:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12414:3:111"},"nodeType":"YulFunctionCall","src":"12414:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12406:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12186:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12200:4:111","type":""}],"src":"12035:404:111"},{"body":{"nodeType":"YulBlock","src":"12618:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12635:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12646:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12628:6:111"},"nodeType":"YulFunctionCall","src":"12628:21:111"},"nodeType":"YulExpressionStatement","src":"12628:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12669:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12680:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12665:3:111"},"nodeType":"YulFunctionCall","src":"12665:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12685:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12658:6:111"},"nodeType":"YulFunctionCall","src":"12658:30:111"},"nodeType":"YulExpressionStatement","src":"12658:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12708:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12719:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12704:3:111"},"nodeType":"YulFunctionCall","src":"12704:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"12724:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12697:6:111"},"nodeType":"YulFunctionCall","src":"12697:62:111"},"nodeType":"YulExpressionStatement","src":"12697:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12779:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12790:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12775:3:111"},"nodeType":"YulFunctionCall","src":"12775:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"12795:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12768:6:111"},"nodeType":"YulFunctionCall","src":"12768:34:111"},"nodeType":"YulExpressionStatement","src":"12768:34:111"},{"nodeType":"YulAssignment","src":"12811:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12823:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12834:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12819:3:111"},"nodeType":"YulFunctionCall","src":"12819:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12811:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12595:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12609:4:111","type":""}],"src":"12444:400:111"},{"body":{"nodeType":"YulBlock","src":"13023:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13040:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13051:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13033:6:111"},"nodeType":"YulFunctionCall","src":"13033:21:111"},"nodeType":"YulExpressionStatement","src":"13033:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13074:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13085:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13070:3:111"},"nodeType":"YulFunctionCall","src":"13070:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"13090:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13063:6:111"},"nodeType":"YulFunctionCall","src":"13063:30:111"},"nodeType":"YulExpressionStatement","src":"13063:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13113:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13124:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13109:3:111"},"nodeType":"YulFunctionCall","src":"13109:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"13129:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13102:6:111"},"nodeType":"YulFunctionCall","src":"13102:62:111"},"nodeType":"YulExpressionStatement","src":"13102:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13195:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13180:3:111"},"nodeType":"YulFunctionCall","src":"13180:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"13200:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13173:6:111"},"nodeType":"YulFunctionCall","src":"13173:31:111"},"nodeType":"YulExpressionStatement","src":"13173:31:111"},{"nodeType":"YulAssignment","src":"13213:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13225:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13236:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13221:3:111"},"nodeType":"YulFunctionCall","src":"13221:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13213:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13000:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13014:4:111","type":""}],"src":"12849:397:111"},{"body":{"nodeType":"YulBlock","src":"13436:255:111","statements":[{"nodeType":"YulAssignment","src":"13446:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13458:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13469:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13454:3:111"},"nodeType":"YulFunctionCall","src":"13454:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13446:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13489:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13504:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13512:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13500:3:111"},"nodeType":"YulFunctionCall","src":"13500:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13482:6:111"},"nodeType":"YulFunctionCall","src":"13482:74:111"},"nodeType":"YulExpressionStatement","src":"13482:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13576:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13587:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13572:3:111"},"nodeType":"YulFunctionCall","src":"13572:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"13592:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13565:6:111"},"nodeType":"YulFunctionCall","src":"13565:34:111"},"nodeType":"YulExpressionStatement","src":"13565:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13619:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13630:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13615:3:111"},"nodeType":"YulFunctionCall","src":"13615:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"13635:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13608:6:111"},"nodeType":"YulFunctionCall","src":"13608:34:111"},"nodeType":"YulExpressionStatement","src":"13608:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13662:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13673:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13658:3:111"},"nodeType":"YulFunctionCall","src":"13658:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"13678:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13651:6:111"},"nodeType":"YulFunctionCall","src":"13651:34:111"},"nodeType":"YulExpressionStatement","src":"13651:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13381:9:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"13392:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"13400:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13408:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13416:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13427:4:111","type":""}],"src":"13251:440:111"},{"body":{"nodeType":"YulBlock","src":"13825:168:111","statements":[{"nodeType":"YulAssignment","src":"13835:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13847:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13858:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13843:3:111"},"nodeType":"YulFunctionCall","src":"13843:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13835:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13877:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13892:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"13900:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13888:3:111"},"nodeType":"YulFunctionCall","src":"13888:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13870:6:111"},"nodeType":"YulFunctionCall","src":"13870:74:111"},"nodeType":"YulExpressionStatement","src":"13870:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13975:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13960:3:111"},"nodeType":"YulFunctionCall","src":"13960:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"13980:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13953:6:111"},"nodeType":"YulFunctionCall","src":"13953:34:111"},"nodeType":"YulExpressionStatement","src":"13953:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13786:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"13797:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"13805:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"13816:4:111","type":""}],"src":"13696:297:111"},{"body":{"nodeType":"YulBlock","src":"14076:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"14122:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14131:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14134:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14124:6:111"},"nodeType":"YulFunctionCall","src":"14124:12:111"},"nodeType":"YulExpressionStatement","src":"14124:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"14097:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"14106:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"14093:3:111"},"nodeType":"YulFunctionCall","src":"14093:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"14118:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"14089:3:111"},"nodeType":"YulFunctionCall","src":"14089:32:111"},"nodeType":"YulIf","src":"14086:52:111"},{"nodeType":"YulVariableDeclaration","src":"14147:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14166:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14160:5:111"},"nodeType":"YulFunctionCall","src":"14160:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"14151:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"14229:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14238:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14241:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"14231:6:111"},"nodeType":"YulFunctionCall","src":"14231:12:111"},"nodeType":"YulExpressionStatement","src":"14231:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14198:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14219:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14212:6:111"},"nodeType":"YulFunctionCall","src":"14212:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14205:6:111"},"nodeType":"YulFunctionCall","src":"14205:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"14195:2:111"},"nodeType":"YulFunctionCall","src":"14195:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14188:6:111"},"nodeType":"YulFunctionCall","src":"14188:40:111"},"nodeType":"YulIf","src":"14185:60:111"},{"nodeType":"YulAssignment","src":"14254:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"14264:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"14254:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14042:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"14053:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"14065:6:111","type":""}],"src":"13998:277:111"},{"body":{"nodeType":"YulBlock","src":"14454:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14471:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14482:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14464:6:111"},"nodeType":"YulFunctionCall","src":"14464:21:111"},"nodeType":"YulExpressionStatement","src":"14464:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14505:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14516:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14501:3:111"},"nodeType":"YulFunctionCall","src":"14501:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14521:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14494:6:111"},"nodeType":"YulFunctionCall","src":"14494:30:111"},"nodeType":"YulExpressionStatement","src":"14494:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14544:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14555:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14540:3:111"},"nodeType":"YulFunctionCall","src":"14540:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"14560:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14533:6:111"},"nodeType":"YulFunctionCall","src":"14533:62:111"},"nodeType":"YulExpressionStatement","src":"14533:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14615:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14626:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14611:3:111"},"nodeType":"YulFunctionCall","src":"14611:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"14631:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14604:6:111"},"nodeType":"YulFunctionCall","src":"14604:40:111"},"nodeType":"YulExpressionStatement","src":"14604:40:111"},{"nodeType":"YulAssignment","src":"14653:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14665:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14676:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14661:3:111"},"nodeType":"YulFunctionCall","src":"14661:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14653:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14431:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14445:4:111","type":""}],"src":"14280:406:111"},{"body":{"nodeType":"YulBlock","src":"14865:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14882:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14893:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14875:6:111"},"nodeType":"YulFunctionCall","src":"14875:21:111"},"nodeType":"YulExpressionStatement","src":"14875:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14916:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14927:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14912:3:111"},"nodeType":"YulFunctionCall","src":"14912:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"14932:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14905:6:111"},"nodeType":"YulFunctionCall","src":"14905:30:111"},"nodeType":"YulExpressionStatement","src":"14905:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"14966:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14951:3:111"},"nodeType":"YulFunctionCall","src":"14951:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"14971:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14944:6:111"},"nodeType":"YulFunctionCall","src":"14944:62:111"},"nodeType":"YulExpressionStatement","src":"14944:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15026:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15037:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15022:3:111"},"nodeType":"YulFunctionCall","src":"15022:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"15042:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15015:6:111"},"nodeType":"YulFunctionCall","src":"15015:36:111"},"nodeType":"YulExpressionStatement","src":"15015:36:111"},{"nodeType":"YulAssignment","src":"15060:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15072:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15083:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15068:3:111"},"nodeType":"YulFunctionCall","src":"15068:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15060:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14842:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14856:4:111","type":""}],"src":"14691:402:111"},{"body":{"nodeType":"YulBlock","src":"15235:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15245:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15265:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15259:5:111"},"nodeType":"YulFunctionCall","src":"15259:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"15249:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15307:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"15315:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15303:3:111"},"nodeType":"YulFunctionCall","src":"15303:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"15322:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15327:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"15281:21:111"},"nodeType":"YulFunctionCall","src":"15281:53:111"},"nodeType":"YulExpressionStatement","src":"15281:53:111"},{"nodeType":"YulAssignment","src":"15343:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"15354:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"15359:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15350:3:111"},"nodeType":"YulFunctionCall","src":"15350:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"15343:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"15211:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15216:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"15227:3:111","type":""}],"src":"15098:274:111"},{"body":{"nodeType":"YulBlock","src":"15551:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15568:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15579:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15561:6:111"},"nodeType":"YulFunctionCall","src":"15561:21:111"},"nodeType":"YulExpressionStatement","src":"15561:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15602:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15613:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15598:3:111"},"nodeType":"YulFunctionCall","src":"15598:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15618:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15591:6:111"},"nodeType":"YulFunctionCall","src":"15591:30:111"},"nodeType":"YulExpressionStatement","src":"15591:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15641:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15652:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15637:3:111"},"nodeType":"YulFunctionCall","src":"15637:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"15657:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15630:6:111"},"nodeType":"YulFunctionCall","src":"15630:59:111"},"nodeType":"YulExpressionStatement","src":"15630:59:111"},{"nodeType":"YulAssignment","src":"15698:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15710:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15721:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15706:3:111"},"nodeType":"YulFunctionCall","src":"15706:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15698:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15528:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15542:4:111","type":""}],"src":"15377:353:111"},{"body":{"nodeType":"YulBlock","src":"15856:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15873:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15884:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15866:6:111"},"nodeType":"YulFunctionCall","src":"15866:21:111"},"nodeType":"YulExpressionStatement","src":"15866:21:111"},{"nodeType":"YulAssignment","src":"15896:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"15921:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15933:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15944:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15929:3:111"},"nodeType":"YulFunctionCall","src":"15929:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"15904:16:111"},"nodeType":"YulFunctionCall","src":"15904:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15896:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15825:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"15836:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15847:4:111","type":""}],"src":"15735:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_contract$_IBobaGasPriceOracle_$13071__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n let x_1 := and(x, 0xff)\n let y_1 := and(y, 0xff)\n if lt(x_1, y_1) { panic_error_0x11() }\n diff := sub(x_1, y_1)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_uint256_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1062},{"length":32,"start":1414},{"length":32,"start":1616},{"length":32,"start":1889},{"length":32,"start":2088},{"length":32,"start":2232},{"length":32,"start":2411},{"length":32,"start":3487}]},"linkReferences":{},"object":"60806040526004361061018b5760003560e01c80639ed0fb68116100d6578063cd8f80c21161007f578063f2fde38b11610059578063f2fde38b146104dc578063f465c77e146104fc578063f5bf3fcf1461052a57600080fd5b8063cd8f80c214610492578063d0e30db0146104b4578063d4918378146104bc57600080fd5b8063bb9fe6bf116100b0578063bb9fe6bf14610448578063c23a5cea1461045d578063c399ec881461047d57600080fd5b80639ed0fb68146103d0578063a9a23409146103f4578063b0d691fe1461041457600080fd5b80634f16bbf311610138578063715018a611610112578063715018a61461037a578063796d43711461038f5780638da5cb5b146103a557600080fd5b80634f16bbf3146102c857806363445989146102e85780636f6dc5ae1461034d57600080fd5b80632303889411610169578063230388941461021c57806327e235e3146102605780634a6f84cf1461029b57600080fd5b80630396cb60146101905780630ee0599c146101a5578063205c2878146101fc575b600080fd5b6101a361019e366004611747565b61054a565b005b3480156101b157600080fd5b506003546101d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561020857600080fd5b506101a361021736600461178f565b6105fc565b34801561022857600080fd5b5060035461024e9074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101f3565b34801561026c57600080fd5b5061028d61027b3660046117bb565b60016020526000908152604090205481565b6040519081526020016101f3565b3480156102a757600080fd5b5061028d6102b63660046117bb565b60026020526000908152604090205481565b3480156102d457600080fd5b506101a36102e336600461178f565b610694565b3480156102f457600080fd5b506103386103033660046117bb565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160209081526040808320546002909252909120549091565b604080519283526020830191909152016101f3565b34801561035957600080fd5b506004546101d29073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038657600080fd5b506101a3610729565b34801561039b57600080fd5b5061028d6188b881565b3480156103b157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101d2565b3480156103dc57600080fd5b506101a3336000908152600260205260409020439055565b34801561040057600080fd5b506101a361040f3660046117d8565b61073d565b34801561042057600080fd5b506101d27f000000000000000000000000000000000000000000000000000000000000000081565b34801561045457600080fd5b506101a3610757565b34801561046957600080fd5b506101a36104783660046117bb565b6107db565b34801561048957600080fd5b5061028d610887565b34801561049e57600080fd5b506101a333600090815260026020526040812055565b6101a361093d565b3480156104c857600080fd5b5061028d6104d7366004611867565b6109c5565b3480156104e857600080fd5b506101a36104f73660046117bb565b6109d6565b34801561050857600080fd5b5061051c610517366004611880565b610a92565b6040516101f392919061194a565b34801561053657600080fd5b506101a361054536600461178f565b610ab5565b610552610bb5565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b505050505050565b610604610bb5565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b1580156105e057600080fd5b6003546106b99073ffffffffffffffffffffffffffffffffffffffff16333084610c36565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906106ee90849061199b565b909155505073ffffffffffffffffffffffffffffffffffffffff821633036107255761072533600090815260026020526040812055565b5050565b610731610bb5565b61073b6000610d12565b565b610745610d87565b61075184848484610e26565b50505050565b61075f610bb5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107c757600080fd5b505af1158015610751573d6000803e3d6000fd5b6107e3610bb5565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561086c57600080fd5b505af1158015610880573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093891906119b3565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561086c57600080fd5b60006109d082610f6c565b92915050565b6109de610bb5565b73ffffffffffffffffffffffffffffffffffffffff8116610a86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610a8f81610d12565b50565b60606000610a9e610d87565b610aa9858585611101565b91509150935093915050565b3360009081526002602052604090205415801590610ae157503360009081526002602052604090205443115b610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f73697400000000000000000000000000000000000000000000006064820152608401610a7d565b3360009081526001602052604081208054839290610b8c9084906119cc565b90915550506003546107259073ffffffffffffffffffffffffffffffffffffffff168383611392565b60005473ffffffffffffffffffffffffffffffffffffffff16331461073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107519085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113ed565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461073b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610a7d565b6000808080610e37868801886119e3565b935093509350935060008183856188b8610e519190611a1e565b610e5b908961199b565b610e659190611a1e565b610e6f9190611a5b565b90506002896002811115610e8557610e85611a96565b14610eb457600354610eaf9073ffffffffffffffffffffffffffffffffffffffff16863084610c36565b610eef565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054839290610ee99084906119cc565b90915550505b8060016000610f1360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f5c919061199b565b9091555050505050505050505050565b60048054604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600093849373ffffffffffffffffffffffffffffffffffffffff169263313ce56792818301926020928290030181865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff91906119b3565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630aa2f4206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109491906119b3565b905060006110a383600a611be5565b6110ad8387611a1e565b6110b79190611a5b565b6003549091506110e39074010000000000000000000000000000000000000000900460ff166012611bf1565b6110ee90600a611c14565b6110f89082611a5b565b95945050505050565b606060006188b88560a001351161119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f700000000000000000000000000000000000000000000000006064820152608401610a7d565b843560006111a785610f6c565b905060006111b4886114f9565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205490915015611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205482111561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6040805173ffffffffffffffffffffffffffffffffffffffff85166020820152908101829052606081018390526080810187905260a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298600098509650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113e89084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610c90565b505050565b600061144f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115289092919063ffffffff16565b8051909150156113e8578080602001905181019061146d9190611c23565b6113e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a7d565b600060e0820135610100830135808203611514575092915050565b61152082488301611537565b949350505050565b6060611520848460008561154f565b60008183106115465781611548565b825b9392505050565b6060824710156115e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161160a9190611c45565b60006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b509150915061165d87838387611668565b979650505050505050565b606083156116fe5782516000036116f75773ffffffffffffffffffffffffffffffffffffffff85163b6116f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a7d565b5081611520565b61152083838151156117135781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d9190611c61565b60006020828403121561175957600080fd5b813563ffffffff8116811461154857600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610a8f57600080fd5b600080604083850312156117a257600080fd5b82356117ad8161176d565b946020939093013593505050565b6000602082840312156117cd57600080fd5b81356115488161176d565b600080600080606085870312156117ee57600080fd5b8435600381106117fd57600080fd5b9350602085013567ffffffffffffffff8082111561181a57600080fd5b818701915087601f83011261182e57600080fd5b81358181111561183d57600080fd5b88602082850101111561184f57600080fd5b95986020929092019750949560400135945092505050565b60006020828403121561187957600080fd5b5035919050565b60008060006060848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b840161016081870312156118bf57600080fd5b95602085013595506040909401359392505050565b60005b838110156118ef5781810151838201526020016118d7565b838111156107515750506000910152565b600081518084526119188160208601602086016118d4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061195d6040830185611900565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156119ae576119ae61196c565b500190565b6000602082840312156119c557600080fd5b5051919050565b6000828210156119de576119de61196c565b500390565b600080600080608085870312156119f957600080fd5b8435611a048161176d565b966020860135965060408601359560600135945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a5657611a5661196c565b500290565b600082611a91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600181815b80851115611b1e57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611b0457611b0461196c565b80851615611b1157918102915b93841c9390800290611aca565b509250929050565b600082611b35575060016109d0565b81611b42575060006109d0565b8160018114611b585760028114611b6257611b7e565b60019150506109d0565b60ff841115611b7357611b7361196c565b50506001821b6109d0565b5060208310610133831016604e8410600b8410161715611ba1575081810a6109d0565b611bab8383611ac5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611bdd57611bdd61196c565b029392505050565b60006115488383611b26565b600060ff821660ff841680821015611c0b57611c0b61196c565b90039392505050565b600061154860ff841683611b26565b600060208284031215611c3557600080fd5b8151801515811461154857600080fd5b60008251611c578184602087016118d4565b9190910192915050565b602081526000611548602083018461190056fea2646970667358221220c8de66b5d8840c40ca4f791a626c639fa692d0596127543720fd8ecf7ed3fa7d64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xCD8F80C2 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x4FC JUMPI DUP1 PUSH4 0xF5BF3FCF EQ PUSH2 0x52A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x4B4 JUMPI DUP1 PUSH4 0xD4918378 EQ PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x448 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x47D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x414 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F16BBF3 GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x38F JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4F16BBF3 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0x63445989 EQ PUSH2 0x2E8 JUMPI DUP1 PUSH4 0x6F6DC5AE EQ PUSH2 0x34D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23038894 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x23038894 EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x260 JUMPI DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x29B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0xEE0599C EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1FC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x1747 JUMP JUMPDEST PUSH2 0x54A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x1D2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x5FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH2 0x24E SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x27B CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x2B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x2E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0x694 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x303 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 SLOAD PUSH2 0x1D2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x729 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x17D8 JUMP JUMPDEST PUSH2 0x73D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D2 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x757 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH2 0x7DB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0x93D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x4D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1867 JUMP JUMPDEST PUSH2 0x9C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x4F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x17BB JUMP JUMPDEST PUSH2 0x9D6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x508 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x51C PUSH2 0x517 CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0xA92 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP3 SWAP2 SWAP1 PUSH2 0x194A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x536 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A3 PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x178F JUMP JUMPDEST PUSH2 0xAB5 JUMP JUMPDEST PUSH2 0x552 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x604 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x6B9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER ADDRESS DUP5 PUSH2 0xC36 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x6EE SWAP1 DUP5 SWAP1 PUSH2 0x199B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER SUB PUSH2 0x725 JUMPI PUSH2 0x725 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x731 PUSH2 0xBB5 JUMP JUMPDEST PUSH2 0x73B PUSH1 0x0 PUSH2 0xD12 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x745 PUSH2 0xD87 JUMP JUMPDEST PUSH2 0x751 DUP5 DUP5 DUP5 DUP5 PUSH2 0xE26 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x75F PUSH2 0xBB5 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x751 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x7E3 PUSH2 0xBB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x86C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x880 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x914 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x938 SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x86C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x9D0 DUP3 PUSH2 0xF6C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x9DE PUSH2 0xBB5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xA86 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA8F DUP2 PUSH2 0xD12 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xA9E PUSH2 0xD87 JUMP JUMPDEST PUSH2 0xAA9 DUP6 DUP6 DUP6 PUSH2 0x1101 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAE1 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xB6D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xB8C SWAP1 DUP5 SWAP1 PUSH2 0x19CC JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 SLOAD PUSH2 0x725 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH2 0x1392 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x751 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x13ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND EQ PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xE37 DUP7 DUP9 ADD DUP9 PUSH2 0x19E3 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0xE51 SWAP2 SWAP1 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0xE5B SWAP1 DUP10 PUSH2 0x199B JUMP JUMPDEST PUSH2 0xE65 SWAP2 SWAP1 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0xE6F SWAP2 SWAP1 PUSH2 0x1A5B JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xE85 JUMPI PUSH2 0xE85 PUSH2 0x1A96 JUMP JUMPDEST EQ PUSH2 0xEB4 JUMPI PUSH1 0x3 SLOAD PUSH2 0xEAF SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 ADDRESS DUP5 PUSH2 0xC36 JUMP JUMPDEST PUSH2 0xEEF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xEE9 SWAP1 DUP5 SWAP1 PUSH2 0x19CC JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0xF13 PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xF5C SWAP2 SWAP1 PUSH2 0x199B JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 PUSH4 0x313CE567 SWAP3 DUP2 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFDB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFFF SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAA2F420 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1070 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1094 SWAP2 SWAP1 PUSH2 0x19B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x10A3 DUP4 PUSH1 0xA PUSH2 0x1BE5 JUMP JUMPDEST PUSH2 0x10AD DUP4 DUP8 PUSH2 0x1A1E JUMP JUMPDEST PUSH2 0x10B7 SWAP2 SWAP1 PUSH2 0x1A5B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 SWAP2 POP PUSH2 0x10E3 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x1BF1 JUMP JUMPDEST PUSH2 0x10EE SWAP1 PUSH1 0xA PUSH2 0x1C14 JUMP JUMPDEST PUSH2 0x10F8 SWAP1 DUP3 PUSH2 0x1A5B JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x119A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST DUP5 CALLDATALOAD PUSH1 0x0 PUSH2 0x11A7 DUP6 PUSH2 0xF6C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x11B4 DUP9 PUSH2 0x14F9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1269 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x131E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE SWAP9 PUSH1 0x0 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x13E8 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0xC90 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x144F DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x1528 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x13E8 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x146D SWAP2 SWAP1 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x13E8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1514 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1520 DUP3 BASEFEE DUP4 ADD PUSH2 0x1537 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1520 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x154F JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1546 JUMPI DUP2 PUSH2 0x1548 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x15E1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0xA7D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x160A SWAP2 SWAP1 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1647 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x164C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x165D DUP8 DUP4 DUP4 DUP8 PUSH2 0x1668 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16FE JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x16F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EXTCODESIZE PUSH2 0x16F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0xA7D JUMP JUMPDEST POP DUP2 PUSH2 0x1520 JUMP JUMPDEST PUSH2 0x1520 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1713 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA7D SWAP2 SWAP1 PUSH2 0x1C61 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xA8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x17A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x17AD DUP2 PUSH2 0x176D JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1548 DUP2 PUSH2 0x176D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x17EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x17FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x181A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x182E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x183D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x184F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x18BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18EF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18D7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x751 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1918 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x18D4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x195D PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1900 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x19AE JUMPI PUSH2 0x19AE PUSH2 0x196C JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x19DE JUMPI PUSH2 0x19DE PUSH2 0x196C JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x19F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1A04 DUP2 PUSH2 0x176D JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x1A56 JUMPI PUSH2 0x1A56 PUSH2 0x196C JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A91 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1B1E JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1B04 JUMPI PUSH2 0x1B04 PUSH2 0x196C JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1B11 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1ACA JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1B35 JUMPI POP PUSH1 0x1 PUSH2 0x9D0 JUMP JUMPDEST DUP2 PUSH2 0x1B42 JUMPI POP PUSH1 0x0 PUSH2 0x9D0 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1B58 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1B62 JUMPI PUSH2 0x1B7E JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1B73 JUMPI PUSH2 0x1B73 PUSH2 0x196C JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x9D0 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1BA1 JUMPI POP DUP2 DUP2 EXP PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x1BAB DUP4 DUP4 PUSH2 0x1AC5 JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1BDD JUMPI PUSH2 0x1BDD PUSH2 0x196C JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 DUP4 DUP4 PUSH2 0x1B26 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x1C0B JUMPI PUSH2 0x1C0B PUSH2 0x196C JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1B26 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x1C57 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x18D4 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1548 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1900 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC8 0xDE PUSH7 0xB5D8840C40CA4F PUSH26 0x1A626C639FA692D0596127543720FD8ECF7ED3FA7D64736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"108:452:104:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;804:28:68;;;;;;;;;;-1:-1:-1;804:28:68;;;;;;;;;;;486:42:111;474:55;;;456:74;;444:2;429:18;804:28:68;;;;;;;;2721:149:52;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;838:35:68:-;;;;;;;;;;-1:-1:-1;838:35:68;;;;;;;;;;;;;;1216:4:111;1204:17;;;1186:36;;1174:2;1159:18;838:35:68;1044:184:111;702:43:68;;;;;;;;;;-1:-1:-1;702:43:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1639:25:111;;;1627:2;1612:18;702:43:68;1493:177:111;751:46:68;;;;;;;;;;-1:-1:-1;751:46:68;;;;;:::i;:::-;;;;;;;;;;;;;;1844:320;;;;;;;;;;-1:-1:-1;1844:320:68;;;;;:::i;:::-;;:::i;2350:185::-;;;;;;;;;;-1:-1:-1;2350:185:68;;;;;:::i;:::-;2466:17;;2409:14;2466:17;;;:8;:17;;;;;;;;;2508:11;:20;;;;;;;2466:17;;2350:185;;;;;2177:25:111;;;2233:2;2218:18;;2211:34;;;;2150:18;2350:185:68;2003:248:111;879:41:68;;;;;;;;;;-1:-1:-1;879:41:68;;;;;;;;1831:101:24;;;;;;;;;;;;;:::i;651:44:68:-;;;;;;;;;;;;690:5;651:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;;;1201:85;;2666:92:68;;;;;;;;;;;;2725:10;2713:23;;;;:11;:23;;;;;2739:12;2713:38;;2666:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;3318:111::-;;;;;;;;;;;;;:::i;2975:79:68:-;;;;;;;;;;;;3032:10;3046:1;3020:23;;;:11;:23;;;;;:27;2975:79;2474:105:52;;;:::i;404:154:104:-;;;;;;;;;;-1:-1:-1;404:154:104;;;;;:::i;:::-;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3252:299:68:-;;;;;;;;;;-1:-1:-1;3252:299:68;;;;;:::i;:::-;;:::i;3094:141:52:-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;5862:10:111;5850:23;;3173:55:52::1;::::0;::::1;5832:42:111::0;3173:10:52::1;:19;;::::0;::::1;::::0;3201:9:::1;::::0;5805:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;:21:::1;6093:55:111::0;;;2817:46:52::1;::::0;::::1;6075:74:111::0;6165:18;;;6158:34;;;2817:10:52::1;:21;::::0;::::1;::::0;6048:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;1844:320:68::0;1975:14;;:66;;:14;;2007:10;2027:4;2034:6;1975:31;:66::i;:::-;2051:17;;;;;;;:8;:17;;;;;:27;;2072:6;;2051:17;:27;;2072:6;;2051:27;:::i;:::-;;;;-1:-1:-1;;2092:21:68;;;:10;:21;2088:70;;2129:18;3032:10;3046:1;3020:23;;;:11;:23;;;;;:27;2975:79;2129:18;1844:320;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;:24:::1;474:55:111::0;;;3975:41:52::1;::::0;::::1;456:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;429:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;456:74:111;3361:7:52;;3387:10;:20;;;;;429:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:54;;;;;2566:4;2518:54;;;456:74:111;2518:10:52;:20;;;;;2547:9;;429:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;404:154:104;476:7;502:49;541:9;502:38;:49::i;:::-;495:56;404:154;-1:-1:-1;;404:154:104:o;2081:198:24:-;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;7163:2:111;2161:73:24::1;::::0;::::1;7145:21:111::0;7202:2;7182:18;;;7175:30;7241:34;7221:18;;;7214:62;7312:8;7292:18;;;7285:36;7338:19;;2161:73:24::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;3252:299:68:-;3347:10;3335:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;3394:10:68;3382:23;;;;:11;:23;;;;;;3367:12;:38;3335:70;3327:124;;;;;;;7570:2:111;3327:124:68;;;7552:21:111;7609:2;7589:18;;;7582:30;7648:34;7628:18;;;7621:62;7719:11;7699:18;;;7692:39;7748:19;;3327:124:68;7368:405:111;3327:124:68;3470:10;3461:20;;;;:8;:20;;;;;:30;;3485:6;;3461:20;:30;;3485:6;;3461:30;:::i;:::-;;;;-1:-1:-1;;3501:14:68;;:43;;:14;;3529:6;3537;3501:27;:43::i;1359:130:24:-;1247:7;1273:6;1422:23;1273:6;719:10:43;1422:23:24;1414:68;;;;;;;8110:2:111;1414:68:24;;;8092:21:111;;;8129:18;;;8122:30;8188:34;8168:18;;;8161:62;8240:18;;1414:68:24;7908:356:111;974:241:39;1139:68;;8481:42:111;8550:15;;;1139:68:39;;;8532:34:111;8602:15;;8582:18;;;8575:43;8634:18;;;8627:34;;;1112:96:39;;1132:5;;1162:27;;8444:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;2433:187:24:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;:33;4178:10;4156:33;;4148:67;;;;;;;8874:2:111;4148:67:52;;;8856:21:111;8913:2;8893:18;;;8886:30;8952:23;8932:18;;;8925:51;8993:18;;4148:67:52;8672:345:111;5707:792:68;5818:15;;;;5900:57;;;;5911:7;5900:57;:::i;:::-;5817:140;;;;;;;;6026:23;6117:7;6102:12;6084:14;690:5;6069:29;;;;:::i;:::-;6053:45;;:13;:45;:::i;:::-;6052:62;;;;:::i;:::-;:72;;;;:::i;:::-;6026:98;-1:-1:-1;6146:25:68;6138:4;:33;;;;;;;;:::i;:::-;;6134:313;;6230:14;;:72;;:14;;6262:7;6279:4;6286:15;6230:31;:72::i;:::-;6134:313;;;6400:17;;;;;;;:8;:17;;;;;:36;;6421:15;;6400:17;:36;;6421:15;;6400:36;:::i;:::-;;;;-1:-1:-1;;6134:313:68;6477:15;6456:8;:17;6465:7;1247::24;1273:6;;;;1201:85;6465:7:68;6456:17;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;5707:792:68:o;3776:388::-;3917:14;;;:25;;;;;;;;3854:22;;;;3917:14;;;:23;;:25;;;;;;;;;;;:14;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3888:54;;3952:18;3973:14;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3952:48;-1:-1:-1;4010:22:68;4063;4067:18;4063:2;:22;:::i;:::-;4036;4048:10;4036:9;:22;:::i;:::-;4035:51;;;;:::i;:::-;4132:22;;4010:76;;-1:-1:-1;4127:27:68;;4132:22;;;;;4127:2;:27;:::i;:::-;4122:33;;:2;:33;:::i;:::-;4104:52;;:14;:52;:::i;:::-;4096:61;3776:388;-1:-1:-1;;;;;3776:388:68:o;4463:833::-;4601:20;4623:22;690:5;4791:6;:27;;;:42;4783:95;;;;;;;12237:2:111;4783:95:68;;;12219:21:111;12276:2;12256:18;;;12249:30;12315:34;12295:18;;;12288:62;12386:10;12366:18;;;12359:38;12414:19;;4783:95:68;12035:404:111;4783:95:68;1889:20:64;;4889:15:68;4958:27;4977:7;4958:18;:27::i;:::-;4935:50;;4995:22;5020:17;:6;:15;:17::i;:::-;5055:20;;;;;;;:11;:20;;;;;;4995:42;;-1:-1:-1;5055:25:68;5047:74;;;;;;;12646:2:111;5047:74:68;;;12628:21:111;12685:2;12665:18;;;12658:30;12724:34;12704:18;;;12697:62;12795:6;12775:18;;;12768:34;12819:19;;5047:74:68;12444:400:111;5047:74:68;5139:17;;;;;;;:8;:17;;;;;;:33;-1:-1:-1;5139:33:68;5131:79;;;;;;;13051:2:111;5131:79:68;;;13033:21:111;13090:2;13070:18;;;13063:30;13129:34;13109:18;;;13102:62;13200:3;13180:18;;;13173:31;13221:19;;5131:79:68;12849:397:111;5131:79:68;5228:58;;;13512:42:111;13500:55;;5228:58:68;;;13482:74:111;13572:18;;;13565:34;;;13615:18;;;13608:34;;;13658:18;;;13651:34;;;13454:19;;5228:58:68;;;;;;;;;;;;;;5287:1;;-1:-1:-1;4463:833:68;-1:-1:-1;;;;;;;4463:833:68:o;763:205:39:-;902:58;;6105:42:111;6093:55;;902:58:39;;;6075:74:111;6165:18;;;6158:34;;;875:86:39;;895:5;;925:23;;6048:18:111;;902:58:39;5885:313:111;875:86:39;763:205;;;:::o;3747:706::-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;14482:2:111;4351:85:39;;;14464:21:111;14521:2;14501:18;;;14494:30;14560:34;14540:18;;;14533:62;14631:12;14611:18;;;14604:40;14661:19;;4351:85:39;14280:406:111;2095:472:64;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;:::-;2492:62;2095:472;-1:-1:-1;;;;2095:472:64:o;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;3743:1;3735:13;3728:20;3651:104;-1:-1:-1;;;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;;;;14893:2:111;5149:81:42;;;14875:21:111;14932:2;14912:18;;;14905:30;14971:34;14951:18;;;14944:62;15042:8;15022:18;;;15015:36;15068:19;;5149:81:42;14691:402:111;5149:81:42;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;1465:19;;;;7908:60;;;;;;;15579:2:111;7908:60:42;;;15561:21:111;15618:2;15598:18;;;15591:30;15657:31;15637:18;;;15630:59;15706:18;;7908:60:42;15377:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;541:162;635:42;628:5;624:54;617:5;614:65;604:93;;693:1;690;683:12;708:331;784:6;792;845:2;833:9;824:7;820:23;816:32;813:52;;;861:1;858;851:12;813:52;900:9;887:23;919:39;952:5;919:39;:::i;:::-;977:5;1029:2;1014:18;;;;1001:32;;-1:-1:-1;;;708:331:111:o;1233:255::-;1292:6;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:39;1452:5;1419:39;:::i;2747:819::-;2851:6;2859;2867;2875;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2983:9;2970:23;3022:1;3015:5;3012:12;3002:40;;3038:1;3035;3028:12;3002:40;3061:5;-1:-1:-1;3117:2:111;3102:18;;3089:32;3140:18;3170:14;;;3167:34;;;3197:1;3194;3187:12;3167:34;3235:6;3224:9;3220:22;3210:32;;3280:7;3273:4;3269:2;3265:13;3261:27;3251:55;;3302:1;3299;3292:12;3251:55;3342:2;3329:16;3368:2;3360:6;3357:14;3354:34;;;3384:1;3381;3374:12;3354:34;3429:7;3424:2;3415:6;3411:2;3407:15;3403:24;3400:37;3397:57;;;3450:1;3447;3440:12;3397:57;2747:819;;3481:2;3473:11;;;;;-1:-1:-1;3503:6:111;;3556:2;3541:18;3528:32;;-1:-1:-1;2747:819:111;-1:-1:-1;;;2747:819:111:o;4091:180::-;4150:6;4203:2;4191:9;4182:7;4178:23;4174:32;4171:52;;;4219:1;4216;4209:12;4171:52;-1:-1:-1;4242:23:111;;4091:180;-1:-1:-1;4091:180:111:o;4276:530::-;4387:6;4395;4403;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;4512:9;4499:23;4545:18;4537:6;4534:30;4531:50;;;4577:1;4574;4567:12;4531:50;4600:22;;4656:3;4638:16;;;4634:26;4631:46;;;4673:1;4670;4663:12;4631:46;4696:2;4745;4730:18;;4717:32;;-1:-1:-1;4796:2:111;4781:18;;;4768:32;;4276:530;-1:-1:-1;;;4276:530:111:o;4811:258::-;4883:1;4893:113;4907:6;4904:1;4901:13;4893:113;;;4983:11;;;4977:18;4964:11;;;4957:39;4929:2;4922:10;4893:113;;;5024:6;5021:1;5018:13;5015:48;;;-1:-1:-1;;5059:1:111;5041:16;;5034:27;4811:258::o;5074:316::-;5115:3;5153:5;5147:12;5180:6;5175:3;5168:19;5196:63;5252:6;5245:4;5240:3;5236:14;5229:4;5222:5;5218:16;5196:63;:::i;:::-;5304:2;5292:15;5309:66;5288:88;5279:98;;;;5379:4;5275:109;;5074:316;-1:-1:-1;;5074:316:111:o;5395:288::-;5570:2;5559:9;5552:21;5533:4;5590:44;5630:2;5619:9;5615:18;5607:6;5590:44;:::i;:::-;5582:52;;5670:6;5665:2;5654:9;5650:18;5643:34;5395:288;;;;;:::o;6203:184::-;6255:77;6252:1;6245:88;6352:4;6349:1;6342:15;6376:4;6373:1;6366:15;6392:128;6432:3;6463:1;6459:6;6456:1;6453:13;6450:39;;;6469:18;;:::i;:::-;-1:-1:-1;6505:9:111;;6392:128::o;6772:184::-;6842:6;6895:2;6883:9;6874:7;6870:23;6866:32;6863:52;;;6911:1;6908;6901:12;6863:52;-1:-1:-1;6934:16:111;;6772:184;-1:-1:-1;6772:184:111:o;7778:125::-;7818:4;7846:1;7843;7840:8;7837:34;;;7851:18;;:::i;:::-;-1:-1:-1;7888:9:111;;7778:125::o;9022:468::-;9116:6;9124;9132;9140;9193:3;9181:9;9172:7;9168:23;9164:33;9161:53;;;9210:1;9207;9200:12;9161:53;9249:9;9236:23;9268:39;9301:5;9268:39;:::i;:::-;9326:5;9378:2;9363:18;;9350:32;;-1:-1:-1;9429:2:111;9414:18;;9401:32;;9480:2;9465:18;9452:32;;-1:-1:-1;9022:468:111;-1:-1:-1;;;9022:468:111:o;9495:228::-;9535:7;9661:1;9593:66;9589:74;9586:1;9583:81;9578:1;9571:9;9564:17;9560:105;9557:131;;;9668:18;;:::i;:::-;-1:-1:-1;9708:9:111;;9495:228::o;9728:274::-;9768:1;9794;9784:189;;9829:77;9826:1;9819:88;9930:4;9927:1;9920:15;9958:4;9955:1;9948:15;9784:189;-1:-1:-1;9987:9:111;;9728:274::o;10007:184::-;10059:77;10056:1;10049:88;10156:4;10153:1;10146:15;10180:4;10177:1;10170:15;10196:482;10285:1;10328:5;10285:1;10342:330;10363:7;10353:8;10350:21;10342:330;;;10482:4;10414:66;10410:77;10404:4;10401:87;10398:113;;;10491:18;;:::i;:::-;10541:7;10531:8;10527:22;10524:55;;;10561:16;;;;10524:55;10640:22;;;;10600:15;;;;10342:330;;;10346:3;10196:482;;;;;:::o;10683:866::-;10732:5;10762:8;10752:80;;-1:-1:-1;10803:1:111;10817:5;;10752:80;10851:4;10841:76;;-1:-1:-1;10888:1:111;10902:5;;10841:76;10933:4;10951:1;10946:59;;;;11019:1;11014:130;;;;10926:218;;10946:59;10976:1;10967:10;;10990:5;;;11014:130;11051:3;11041:8;11038:17;11035:43;;;11058:18;;:::i;:::-;-1:-1:-1;;11114:1:111;11100:16;;11129:5;;10926:218;;11228:2;11218:8;11215:16;11209:3;11203:4;11200:13;11196:36;11190:2;11180:8;11177:16;11172:2;11166:4;11163:12;11159:35;11156:77;11153:159;;;-1:-1:-1;11265:19:111;;;11297:5;;11153:159;11344:34;11369:8;11363:4;11344:34;:::i;:::-;11474:6;11406:66;11402:79;11393:7;11390:92;11387:118;;;11485:18;;:::i;:::-;11523:20;;10683:866;-1:-1:-1;;;10683:866:111:o;11554:131::-;11614:5;11643:36;11670:8;11664:4;11643:36;:::i;11690:195::-;11728:4;11765;11762:1;11758:12;11797:4;11794:1;11790:12;11822:3;11817;11814:12;11811:38;;;11829:18;;:::i;:::-;11866:13;;;11690:195;-1:-1:-1;;;11690:195:111:o;11890:140::-;11948:5;11977:47;12018:4;12008:8;12004:19;11998:4;11977:47;:::i;13998:277::-;14065:6;14118:2;14106:9;14097:7;14093:23;14089:32;14086:52;;;14134:1;14131;14124:12;14086:52;14166:9;14160:16;14219:5;14212:13;14205:21;14198:5;14195:32;14185:60;;14241:1;14238;14231:12;15098:274;15227:3;15265:6;15259:13;15281:53;15327:6;15322:3;15315:4;15307:6;15303:17;15281:53;:::i;:::-;15350:16;;;;;15098:274;-1:-1:-1;;15098:274:111:o;15735:219::-;15884:2;15873:9;15866:21;15847:4;15904:44;15944:2;15933:9;15929:18;15921:6;15904:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1467600","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"262","addDepositFor(address,uint256)":"infinite","addStake(uint32)":"infinite","balances(address)":"2569","deposit()":"infinite","depositInfo(address)":"4771","entryPoint()":"infinite","gasPriceOracle()":"2392","getDeposit()":"infinite","getTokenValueOfEthTest(uint256)":"infinite","lockTokenDeposit()":"5248","owner()":"2385","postOp(uint8,bytes,uint256)":"infinite","renounceOwnership()":"infinite","supportedToken()":"2371","supportedTokenDecimals()":"2370","transferOwnership(address)":"infinite","unlockBlock(address)":"2591","unlockStake()":"infinite","unlockTokenDeposit()":"22354","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addDepositFor(address,uint256)":"4f16bbf3","addStake(uint32)":"0396cb60","balances(address)":"27e235e3","deposit()":"d0e30db0","depositInfo(address)":"63445989","entryPoint()":"b0d691fe","gasPriceOracle()":"6f6dc5ae","getDeposit()":"c399ec88","getTokenValueOfEthTest(uint256)":"d4918378","lockTokenDeposit()":"cd8f80c2","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","renounceOwnership()":"715018a6","supportedToken()":"0ee0599c","supportedTokenDecimals()":"23038894","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,uint256)":"f5bf3fcf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_supportedToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_supportedTokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"_gasPriceOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPriceOracle\",\"outputs\":[{\"internalType\":\"contract IBobaGasPriceOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ethBought\",\"type\":\"uint256\"}],\"name\":\"getTokenValueOfEthTest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supportedToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supportedTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestTokenValueGPODepositPaymaster.sol\":\"TestTokenValueGPODepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/GPODepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IBobaGasPriceOracle.sol\\\";\\n\\n/**\\n * Intended to be used for Boba Alt-L1 deployments\\n * This contract works with the BobaGasPriceOracle to provide an option to pay for txs using the\\n * secondary (or native token)\\n */\\ncontract GPODepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n\\n mapping(address => uint256) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n IERC20 public supportedToken;\\n uint8 public supportedTokenDecimals;\\n IBobaGasPriceOracle public gasPriceOracle;\\n\\n constructor(IEntryPoint _entryPoint, address _supportedToken, uint8 _supportedTokenDecimals, address _gasPriceOracle) BasePaymaster(_entryPoint) {\\n supportedToken = IERC20(_supportedToken);\\n supportedTokenDecimals = _supportedTokenDecimals;\\n gasPriceOracle = IBobaGasPriceOracle(_gasPriceOracle);\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n supportedToken.safeTransferFrom(msg.sender, address(this), amount);\\n balances[account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[msg.sender] -= amount;\\n supportedToken.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n uint256 priceRatioDecimals = gasPriceOracle.decimals();\\n uint256 priceRatio = gasPriceOracle.priceRatio();\\n uint256 requiredAmount = (ethBought * priceRatio) / (10**priceRatioDecimals);\\n return (requiredAmount / (10**(18 - supportedTokenDecimals)));\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n supportedToken.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[account] -= actualTokenCost;\\n }\\n balances[owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x917f79b0177dd77c3f4e53e67d134abdfbbf48d7a36ab2905cf1847928c16bb2\",\"license\":\"GPL-3.0\"},\"contracts/samples/IBobaGasPriceOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaGasPriceOracle {\\n function decimals() external view returns (uint256);\\n\\n function priceRatio() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe27046c185bf441cde5a28fe070bf0957322bd882aab30a9646994e0346bbaf8\",\"license\":\"MIT\"},\"contracts/test/TestTokenValueGPODepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/GPODepositPaymaster.sol\\\";\\n\\ncontract TestTokenValueGPODepositPaymaster is GPODepositPaymaster {\\n\\n constructor(IEntryPoint _entryPoint, address _supportedToken, uint8 _supportedTokenDecimals, address _gasPriceOracle) GPODepositPaymaster(_entryPoint, _supportedToken, _supportedTokenDecimals, _gasPriceOracle) {\\n }\\n\\n function getTokenValueOfEthTest(uint256 ethBought) public view returns (uint256) {\\n return GPODepositPaymaster.getTokenValueOfEth(ethBought);\\n }\\n}\\n\",\"keccak256\":\"0xfc83aabea11b6d688bf9e110f2969d0dca787009a76e2aff5b74d4c19b725782\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":12687,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"balances","offset":0,"slot":"1","type":"t_mapping(t_address,t_uint256)"},{"astId":12691,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"unlockBlock","offset":0,"slot":"2","type":"t_mapping(t_address,t_uint256)"},{"astId":12694,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"supportedToken","offset":0,"slot":"3","type":"t_contract(IERC20)4419"},{"astId":12696,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"supportedTokenDecimals","offset":20,"slot":"3","type":"t_uint8"},{"astId":12699,"contract":"contracts/test/TestTokenValueGPODepositPaymaster.sol:TestTokenValueGPODepositPaymaster","label":"gasPriceOracle","offset":0,"slot":"4","type":"t_contract(IBobaGasPriceOracle)13071"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IBobaGasPriceOracle)13071":{"encoding":"inplace","label":"contract IBobaGasPriceOracle","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"version":1}}},"contracts/test/TestTokenValueManualDepositPaymaster.sol":{"TestTokenValueManualDepositPaymaster":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addDepositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"uint256","name":"priceRatio","type":"uint256"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"ethBought","type":"uint256"}],"name":"getTokenValueOfEthTest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"priceRatioInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"uint256","name":"priceRatio","type":"uint256"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokenDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"priceRatio","type":"uint256"}],"name":"updatePriceRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"priceRatioDecimals","type":"uint256"},{"internalType":"uint256","name":"minRatio","type":"uint256"},{"internalType":"uint256","name":"maxRatio","type":"uint256"}],"name":"updateTokenParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addDepositFor(address,address,uint256)":{"params":{"account":"the account to deposit for.","amount":"the amount of token to deposit.","token":"the token to deposit."}},"addStake(uint32)":{"params":{"unstakeDelaySec":"- the unstake delay for this paymaster. Can only be increased."}},"depositInfo(address,address)":{"returns":{"_unlockBlock":"- the block height at which the deposit can be withdrawn.","amount":"- the amount of given token deposited to the Paymaster."}},"owner()":{"details":"Returns the address of the current owner."},"postOp(uint8,bytes,uint256)":{"params":{"actualGasCost":"- actual gas used so far (without this postOp call).","context":"- the context value returned by validatePaymasterUserOp","mode":"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"params":{"maxCost":"the maximum cost of this transaction (based on maximum gas and gas price from userOp)","userOp":"the user operation","userOpHash":"hash of the user's request data."},"returns":{"context":"value to send to a postOp zero length to signify postOp is not required.","validationData":"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \"authorizer\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"amount":"to withdraw","withdrawAddress":"target to send to"}},"withdrawTokensTo(address,address,uint256)":{"params":{"amount":"amount to withdraw","target":"address to send to","token":"the token deposit to withdraw"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_13213":{"entryPoint":null,"id":13213,"parameterSlots":1,"returnSlots":0},"@_20298":{"entryPoint":null,"id":20298,"parameterSlots":1,"returnSlots":0},"@_2844":{"entryPoint":null,"id":2844,"parameterSlots":0,"returnSlots":0},"@_7333":{"entryPoint":null,"id":7333,"parameterSlots":1,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_transferOwnership_2932":{"entryPoint":109,"id":2932,"parameterSlots":1,"returnSlots":0},"@unlockTokenDeposit_13394":{"entryPoint":null,"id":13394,"parameterSlots":0,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":189,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"60a06040523480156200001157600080fd5b50604051620023e2380380620023e28339810160408190526200003491620000bd565b808062000041336200006d565b6001600160a01b031660805262000065336000908152600360205260409020439055565b5050620000ef565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000d057600080fd5b81516001600160a01b0381168114620000e857600080fd5b9392505050565b6080516122a66200013c60003960008181610450015281816105e80152818161069801528181610c5301528181610d0001528181610d9001528181610f2101526113ff01526122a66000f3fe6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c399ec881161008a578063d0e30db011610064578063d0e30db014610536578063e29db4dc1461053e578063f2fde38b1461055e578063f465c77e1461057e57600080fd5b8063c399ec88146104df578063cc9c837c146104f4578063cd8f80c21461051457600080fd5b8063bb9fe6bf116100bb578063bb9fe6bf14610472578063c23a5cea14610487578063c23f001f146104a757600080fd5b80639ed0fb68146103fa578063a9a234091461041e578063b0d691fe1461043e57600080fd5b80634a6f84cf11610143578063763d9c791161011d578063763d9c7914610392578063796d4371146103b25780638da5cb5b146103c857600080fd5b80634a6f84cf1461032257806354fe04981461035d578063715018a61461037d57600080fd5b8063382edd9e11610174578063382edd9e146101f0578063439a70b214610210578063493b0170146102bb57600080fd5b80630396cb601461019b578063205c2878146101b057806324ee2999146101d0575b600080fd5b6101ae6101a9366004611b5a565b6105ac565b005b3480156101bc57600080fd5b506101ae6101cb366004611b9c565b610651565b3480156101dc57600080fd5b506101ae6101eb366004611b9c565b6106dc565b3480156101fc57600080fd5b506101ae61020b366004611bc8565b61084e565b34801561021c57600080fd5b5061027d61022b366004611c09565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0385169474010000000000000000000000000000000000000000900460ff16939086565b604080516001600160a01b03909716875260ff9095166020870152938501929092526060840152608083015260a082015260c0015b60405180910390f35b3480156102c757600080fd5b5061030d6102d6366004611c26565b6001600160a01b03918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152016102b2565b34801561032e57600080fd5b5061034f61033d366004611c09565b60036020526000908152604090205481565b6040519081526020016102b2565b34801561036957600080fd5b5061034f610378366004611b9c565b610956565b34801561038957600080fd5b506101ae61096b565b34801561039e57600080fd5b506101ae6103ad366004611c5f565b61097f565b3480156103be57600080fd5b5061034f6188b881565b3480156103d457600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102b2565b34801561040657600080fd5b506101ae336000908152600360205260409020439055565b34801561042a57600080fd5b506101ae610439366004611cbe565b610c2f565b34801561044a57600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561047e57600080fd5b506101ae610c49565b34801561049357600080fd5b506101ae6104a2366004611c09565b610cc0565b3480156104b357600080fd5b5061034f6104c2366004611c26565b600260209081526000928352604080842090915290825290205481565b3480156104eb57600080fd5b5061034f610d5f565b34801561050057600080fd5b506101ae61050f366004611bc8565b610e08565b34801561052057600080fd5b506101ae33600090815260036020526040812055565b6101ae610ef3565b34801561054a57600080fd5b506101ae610559366004611d4d565b610f6e565b34801561056a57600080fd5b506101ae610579366004611c09565b61107f565b34801561058a57600080fd5b5061059e610599366004611d88565b61110f565b6040516102b2929190611e52565b6105b4611132565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561063557600080fd5b505af1158015610649573d6000803e3d6000fd5b505050505050565b610659611132565b6040517f205c28780000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561063557600080fd5b6106e4611132565b6001600160a01b03828116600090815260016020526040902054166107765760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03821660009081526001602052604090206003015481108015906107bc57506001600160a01b0382166000908152600160205260409020600401548111155b61082e5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b0390911660009081526001602081905260409091200155565b6108636001600160a01b03841633308461118c565b6001600160a01b03838116600090815260016020526040902054166108f05760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b03808416600090815260026020908152604080832093861683529290529081208054839290610927908490611ea3565b90915550506001600160a01b03821633036109515761095133600090815260036020526040812055565b505050565b6000610962838361125b565b90505b92915050565b610973611132565b61097d600061138c565b565b610987611132565b6001600160a01b0386811660009081526001602052604090205416156109ac57600080fd5b83600003610a225760405162461bcd60e51b815260206004820152602c60248201527f4465706f7369745061796d61737465723a20707269636520726174696f20636160448201527f6e6e6f74206265207a65726f0000000000000000000000000000000000000000606482015260840161076d565b81600003610a985760405162461bcd60e51b815260206004820152602a60248201527f4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e60448201527f6f74206265207a65726f00000000000000000000000000000000000000000000606482015260840161076d565b818410158015610aa85750808411155b610b1a5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038616610b705760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369745061796d61737465723a20496e76616c696420746f6b656e00604482015260640161076d565b6040805160c0810182526001600160a01b0397881680825260ff9788166020808401918252838501988952606084019788526080840196875260a0840195865260009283526001908190529390912091518254915199167fffffffffffffffffffffff000000000000000000000000000000000000000000909116177401000000000000000000000000000000000000000098909716979097029590951786559251938501939093555160028401559051600383015551600490910155565b610c376113f4565b610c438484848461146c565b50505050565b610c51611132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cac57600080fd5b505af1158015610c43573d6000803e3d6000fd5b610cc8611132565b6040517fc23a5cea0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610d4457600080fd5b505af1158015610d58573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e039190611ebb565b905090565b3360009081526003602052604090205415801590610e3457503360009081526003602052604090205443115b610ea65760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f7369740000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038316600090815260026020908152604080832033845290915281208054839290610ed9908490611ed4565b9091555061095190506001600160a01b0384168383611596565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d4457600080fd5b610f76611132565b6001600160a01b03848116600090815260016020526040902054166110035760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b816000036110535760405162461bcd60e51b815260206004820152601860248201527f6d696e20726174696f2063616e6e6f74206265207a65726f0000000000000000604482015260640161076d565b6001600160a01b0390931660009081526001602052604090206002810192909255600382015560040155565b611087611132565b6001600160a01b0381166111035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161076d565b61110c8161138c565b50565b6060600061111b6113f4565b6111268585856115df565b91509150935093915050565b6000546001600160a01b0316331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076d565b6040516001600160a01b0380851660248301528316604482015260648101829052610c439085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611899565b6001600160a01b038281166000908152600160205260408120549091166112ea5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038316600090815260016020819052604082209081015460029091015461131990600a61200b565b6113239085612017565b61132d9190612054565b6001600160a01b03851660009081526001602052604090205490915061136f9074010000000000000000000000000000000000000000900460ff16601261208f565b61137a90600a6120b2565b6113849082612054565b949350505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461097d5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161076d565b60008080808061147e878901896120c1565b9450945094509450945060008183856188b861149a9190612017565b6114a4908a611ea3565b6114ae9190612017565b6114b89190612054565b905060028a60028111156114ce576114ce612112565b146114ed576114e86001600160a01b03861687308461118c565b61152a565b6001600160a01b038086166000908152600260209081526040808320938a1683529290529081208054839290611524908490611ed4565b90915550505b6001600160a01b038516600090815260026020526040812082916115566000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115859190611ea3565b909155505050505050505050505050565b6040516001600160a01b0383166024820152604481018290526109519084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016111d9565b606060006188b88560a001351161165e5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f70000000000000000000000000000000000000000000000000606482015260840161076d565b36600061166f610120880188612141565b9092509050602881146116ea5760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e0000000000000000000000606482015260840161076d565b60006116f982601481866121ad565b611702916121d7565b60601c905087356000611715838961125b565b905060006117228b61197e565b6001600160a01b038416600090815260036020526040902054909150156117b05760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b656400000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b0380851660009081526002602090815260408083209387168352929052205482111561184b5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015260840161076d565b604080516001600160a01b03948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b60006118ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119a59092919063ffffffff16565b805190915015610951578080602001905181019061190c919061221f565b6109515760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161076d565b600060e0820135610100830135808203611999575092915050565b611384824883016119b4565b606061138484846000856119ca565b60008183106119c35781610962565b5090919050565b606082471015611a425760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161076d565b600080866001600160a01b03168587604051611a5e9190612241565b60006040518083038185875af1925050503d8060008114611a9b576040519150601f19603f3d011682016040523d82523d6000602084013e611aa0565b606091505b5091509150611ab187838387611abc565b979650505050505050565b60608315611b2b578251600003611b24576001600160a01b0385163b611b245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076d565b5081611384565b6113848383815115611b405781518083602001fd5b8060405162461bcd60e51b815260040161076d919061225d565b600060208284031215611b6c57600080fd5b813563ffffffff81168114611b8057600080fd5b9392505050565b6001600160a01b038116811461110c57600080fd5b60008060408385031215611baf57600080fd5b8235611bba81611b87565b946020939093013593505050565b600080600060608486031215611bdd57600080fd5b8335611be881611b87565b92506020840135611bf881611b87565b929592945050506040919091013590565b600060208284031215611c1b57600080fd5b8135611b8081611b87565b60008060408385031215611c3957600080fd5b8235611c4481611b87565b91506020830135611c5481611b87565b809150509250929050565b60008060008060008060c08789031215611c7857600080fd5b8635611c8381611b87565b9550602087013560ff81168114611c9957600080fd5b95989597505050506040840135936060810135936080820135935060a0909101359150565b60008060008060608587031215611cd457600080fd5b843560038110611ce357600080fd5b9350602085013567ffffffffffffffff80821115611d0057600080fd5b818701915087601f830112611d1457600080fd5b813581811115611d2357600080fd5b886020828501011115611d3557600080fd5b95986020929092019750949560400135945092505050565b60008060008060808587031215611d6357600080fd5b8435611d6e81611b87565b966020860135965060408601359560600135945092505050565b600080600060608486031215611d9d57600080fd5b833567ffffffffffffffff811115611db457600080fd5b84016101608187031215611dc757600080fd5b95602085013595506040909401359392505050565b60005b83811015611df7578181015183820152602001611ddf565b83811115610c435750506000910152565b60008151808452611e20816020860160208601611ddc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611e656040830185611e08565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611eb657611eb6611e74565b500190565b600060208284031215611ecd57600080fd5b5051919050565b600082821015611ee657611ee6611e74565b500390565b600181815b80851115611f4457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f2a57611f2a611e74565b80851615611f3757918102915b93841c9390800290611ef0565b509250929050565b600082611f5b57506001610965565b81611f6857506000610965565b8160018114611f7e5760028114611f8857611fa4565b6001915050610965565b60ff841115611f9957611f99611e74565b50506001821b610965565b5060208310610133831016604e8410600b8410161715611fc7575081810a610965565b611fd18383611eeb565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561200357612003611e74565b029392505050565b60006109628383611f4c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561204f5761204f611e74565b500290565b60008261208a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060ff821660ff8416808210156120a9576120a9611e74565b90039392505050565b600061096260ff841683611f4c565b600080600080600060a086880312156120d957600080fd5b85356120e481611b87565b945060208601356120f481611b87565b94979496505050506040830135926060810135926080909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261217657600080fd5b83018035915067ffffffffffffffff82111561219157600080fd5b6020019150368190038213156121a657600080fd5b9250929050565b600080858511156121bd57600080fd5b838611156121ca57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122175780818660140360031b1b83161692505b505092915050565b60006020828403121561223157600080fd5b81518015158114611b8057600080fd5b60008251612253818460208701611ddc565b9190910192915050565b6020815260006109626020830184611e0856fea2646970667358221220549636c75ecd927bc21be4d330ca5627526f4b885d61e3f4652f42fe1b12b2e364736f6c634300080f0033","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x23E2 CODESIZE SUB DUP1 PUSH3 0x23E2 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xBD JUMP JUMPDEST DUP1 DUP1 PUSH3 0x41 CALLER PUSH3 0x6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH3 0x65 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST POP POP PUSH3 0xEF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH2 0x22A6 PUSH3 0x13C PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x450 ADD MSTORE DUP2 DUP2 PUSH2 0x5E8 ADD MSTORE DUP2 DUP2 PUSH2 0x698 ADD MSTORE DUP2 DUP2 PUSH2 0xC53 ADD MSTORE DUP2 DUP2 PUSH2 0xD00 ADD MSTORE DUP2 DUP2 PUSH2 0xD90 ADD MSTORE DUP2 DUP2 PUSH2 0xF21 ADD MSTORE PUSH2 0x13FF ADD MSTORE PUSH2 0x22A6 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x196 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xE29DB4DC EQ PUSH2 0x53E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x55E JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x4DF JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3FA JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x41E JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x143 JUMPI DUP1 PUSH4 0x763D9C79 GT PUSH2 0x11D JUMPI DUP1 PUSH4 0x763D9C79 EQ PUSH2 0x392 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x3B2 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x322 JUMPI DUP1 PUSH4 0x54FE0498 EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x174 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0x439A70B2 EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x19B JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x24EE2999 EQ PUSH2 0x1D0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE PUSH2 0x1A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B5A JUMP JUMPDEST PUSH2 0x5AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x651 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x6DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x20B CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC8 JUMP JUMPDEST PUSH2 0x84E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27D PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP5 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP4 SWAP1 DUP7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP8 AND DUP8 MSTORE PUSH1 0xFF SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x30D PUSH2 0x2D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x33D CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x369 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x378 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x956 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x96B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1C5F JUMP JUMPDEST PUSH2 0x97F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CBE JUMP JUMPDEST PUSH2 0xC2F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E2 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0xC49 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x4A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0xCC0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x4C2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0xD5F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x50F CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC8 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x520 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1AE PUSH2 0xEF3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x559 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4D JUMP JUMPDEST PUSH2 0xF6E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x579 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x107F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59E PUSH2 0x599 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D88 JUMP JUMPDEST PUSH2 0x110F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2B2 SWAP3 SWAP2 SWAP1 PUSH2 0x1E52 JUMP JUMPDEST PUSH2 0x5B4 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x649 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x659 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6E4 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x776 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP2 LT DUP1 ISZERO SWAP1 PUSH2 0x7BC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD DUP2 GT ISZERO JUMPDEST PUSH2 0x82E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH2 0x863 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND CALLER ADDRESS DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x8F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x927 SWAP1 DUP5 SWAP1 PUSH2 0x1EA3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND CALLER SUB PUSH2 0x951 JUMPI PUSH2 0x951 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 DUP4 DUP4 PUSH2 0x125B JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x973 PUSH2 0x1132 JUMP JUMPDEST PUSH2 0x97D PUSH1 0x0 PUSH2 0x138C JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x987 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x9AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 SUB PUSH2 0xA22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20707269636520726174696F206361 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E6E6F74206265207A65726F0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0xA98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D696E20726174696F2063616E6E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206265207A65726F00000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0xAA8 JUMPI POP DUP1 DUP5 GT ISZERO JUMPDEST PUSH2 0xB1A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xB70 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420746F6B656E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP1 DUP3 MSTORE PUSH1 0xFF SWAP8 DUP9 AND PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE DUP4 DUP6 ADD SWAP9 DUP10 MSTORE PUSH1 0x60 DUP5 ADD SWAP8 DUP9 MSTORE PUSH1 0x80 DUP5 ADD SWAP7 DUP8 MSTORE PUSH1 0xA0 DUP5 ADD SWAP6 DUP7 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 SWAP1 DUP2 SWAP1 MSTORE SWAP4 SWAP1 SWAP2 KECCAK256 SWAP2 MLOAD DUP3 SLOAD SWAP2 MLOAD SWAP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR PUSH21 0x10000000000000000000000000000000000000000 SWAP9 SWAP1 SWAP8 AND SWAP8 SWAP1 SWAP8 MUL SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE SWAP3 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 SSTORE MLOAD PUSH1 0x2 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x3 DUP4 ADD SSTORE MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH2 0xC37 PUSH2 0x13F4 JUMP JUMPDEST PUSH2 0xC43 DUP5 DUP5 DUP5 DUP5 PUSH2 0x146C JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC51 PUSH2 0x1132 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC43 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xCC8 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD58 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE03 SWAP2 SWAP1 PUSH2 0x1EBB JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xE34 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xEA6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xED9 SWAP1 DUP5 SWAP1 PUSH2 0x1ED4 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x951 SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP4 DUP4 PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF76 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x1003 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x1053 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D696E20726174696F2063616E6E6F74206265207A65726F0000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x3 DUP3 ADD SSTORE PUSH1 0x4 ADD SSTORE JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1103 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH2 0x110C DUP2 PUSH2 0x138C JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x111B PUSH2 0x13F4 JUMP JUMPDEST PUSH2 0x1126 DUP6 DUP6 DUP6 PUSH2 0x15DF JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x97D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xC43 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND PUSH2 0x12EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 ADD SLOAD PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD PUSH2 0x1319 SWAP1 PUSH1 0xA PUSH2 0x200B JUMP JUMPDEST PUSH2 0x1323 SWAP1 DUP6 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x132D SWAP2 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x136F SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x208F JUMP JUMPDEST PUSH2 0x137A SWAP1 PUSH1 0xA PUSH2 0x20B2 JUMP JUMPDEST PUSH2 0x1384 SWAP1 DUP3 PUSH2 0x2054 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x97D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x147E DUP8 DUP10 ADD DUP10 PUSH2 0x20C1 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x149A SWAP2 SWAP1 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x14A4 SWAP1 DUP11 PUSH2 0x1EA3 JUMP JUMPDEST PUSH2 0x14AE SWAP2 SWAP1 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x14B8 SWAP2 SWAP1 PUSH2 0x2054 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x14CE JUMPI PUSH2 0x14CE PUSH2 0x2112 JUMP JUMPDEST EQ PUSH2 0x14ED JUMPI PUSH2 0x14E8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH2 0x152A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x1524 SWAP1 DUP5 SWAP1 PUSH2 0x1ED4 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x1556 PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1585 SWAP2 SWAP1 PUSH2 0x1EA3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x951 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0x11D9 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x165E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x166F PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x2141 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x16EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16F9 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x21AD JUMP JUMPDEST PUSH2 0x1702 SWAP2 PUSH2 0x21D7 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x1715 DUP4 DUP10 PUSH2 0x125B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1722 DUP12 PUSH2 0x197E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x17B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x184B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18EE DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19A5 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x951 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x190C SWAP2 SWAP1 PUSH2 0x221F JUMP JUMPDEST PUSH2 0x951 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1999 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1384 DUP3 BASEFEE DUP4 ADD PUSH2 0x19B4 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1384 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x19C3 JUMPI DUP2 PUSH2 0x962 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1A42 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1A5E SWAP2 SWAP1 PUSH2 0x2241 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A9B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1AA0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1AB1 DUP8 DUP4 DUP4 DUP8 PUSH2 0x1ABC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1B2B JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1B24 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x1B24 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST POP DUP2 PUSH2 0x1384 JUMP JUMPDEST PUSH2 0x1384 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1B40 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x76D SWAP2 SWAP1 PUSH2 0x225D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1B80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x110C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1BBA DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1BE8 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1BF8 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B80 DUP2 PUSH2 0x1B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C44 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1C54 DUP2 PUSH2 0x1B87 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1C78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1C83 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP6 SWAP8 POP POP POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP4 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1CD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1CE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1D14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D6E DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1DC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DDF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC43 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1E20 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1DDC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1E65 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1E08 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1EB6 JUMPI PUSH2 0x1EB6 PUSH2 0x1E74 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1ECD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1EE6 JUMPI PUSH2 0x1EE6 PUSH2 0x1E74 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1F44 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1F2A JUMPI PUSH2 0x1F2A PUSH2 0x1E74 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1F37 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1EF0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F5B JUMPI POP PUSH1 0x1 PUSH2 0x965 JUMP JUMPDEST DUP2 PUSH2 0x1F68 JUMPI POP PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1F7E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1F88 JUMPI PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x965 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1F99 JUMPI PUSH2 0x1F99 PUSH2 0x1E74 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x965 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1FC7 JUMPI POP DUP2 DUP2 EXP PUSH2 0x965 JUMP JUMPDEST PUSH2 0x1FD1 DUP4 DUP4 PUSH2 0x1EEB JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x2003 JUMPI PUSH2 0x2003 PUSH2 0x1E74 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 DUP4 DUP4 PUSH2 0x1F4C JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x204F JUMPI PUSH2 0x204F PUSH2 0x1E74 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x208A JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x20A9 JUMPI PUSH2 0x20A9 PUSH2 0x1E74 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1F4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x20D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x20E4 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x20F4 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x21A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x21BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x21CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x2217 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2231 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1B80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2253 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1DDC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x962 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E08 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLOAD SWAP7 CALLDATASIZE 0xC7 0x5E 0xCD SWAP3 PUSH28 0xC21BE4D330CA5627526F4B885D61E3F4652F42FE1B12B2E364736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"111:345:105:-:0;;;190:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;250:11;;936:32:24;719:10:43;936:18:24;:32::i;:::-;-1:-1:-1;;;;;564:24:52;;;2001:20:72::1;4369:10:::0;4357:23;;;;:11;:23;;;;;4383:12;4357:38;;4310:92;2001:20:::1;1855:173:::0;190:80:105;111:345;;2433:187:24;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;-1:-1:-1;;;;;;2541:17:24;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:311:111:-;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;111:345:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@COST_OF_POST_13183":{"entryPoint":null,"id":13183,"parameterSlots":0,"returnSlots":0},"@_callOptionalReturn_4760":{"entryPoint":6297,"id":4760,"parameterSlots":2,"returnSlots":0},"@_checkOwner_2875":{"entryPoint":4402,"id":2875,"parameterSlots":0,"returnSlots":0},"@_msgSender_5141":{"entryPoint":null,"id":5141,"parameterSlots":0,"returnSlots":1},"@_postOp_13816":{"entryPoint":5228,"id":13816,"parameterSlots":4,"returnSlots":0},"@_requireFromEntryPoint_7527":{"entryPoint":5108,"id":7527,"parameterSlots":0,"returnSlots":0},"@_revert_5128":{"entryPoint":null,"id":5128,"parameterSlots":2,"returnSlots":0},"@_transferOwnership_2932":{"entryPoint":5004,"id":2932,"parameterSlots":1,"returnSlots":0},"@_validatePaymasterUserOp_13729":{"entryPoint":5599,"id":13729,"parameterSlots":3,"returnSlots":2},"@addDepositFor_13353":{"entryPoint":2126,"id":13353,"parameterSlots":3,"returnSlots":0},"@addStake_7469":{"entryPoint":1452,"id":7469,"parameterSlots":1,"returnSlots":0},"@addToken_13297":{"entryPoint":2431,"id":13297,"parameterSlots":6,"returnSlots":0},"@balances_13196":{"entryPoint":null,"id":13196,"parameterSlots":0,"returnSlots":0},"@depositInfo_13381":{"entryPoint":null,"id":13381,"parameterSlots":2,"returnSlots":2},"@deposit_7433":{"entryPoint":3827,"id":7433,"parameterSlots":0,"returnSlots":0},"@entryPoint_7322":{"entryPoint":null,"id":7322,"parameterSlots":0,"returnSlots":0},"@functionCallWithValue_4953":{"entryPoint":6602,"id":4953,"parameterSlots":4,"returnSlots":1},"@functionCall_4889":{"entryPoint":6565,"id":4889,"parameterSlots":3,"returnSlots":1},"@gasPrice_11050":{"entryPoint":6526,"id":11050,"parameterSlots":1,"returnSlots":1},"@getDeposit_7484":{"entryPoint":3423,"id":7484,"parameterSlots":0,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@getTokenValueOfEthTest_20315":{"entryPoint":2390,"id":20315,"parameterSlots":2,"returnSlots":1},"@getTokenValueOfEth_13511":{"entryPoint":4699,"id":13511,"parameterSlots":2,"returnSlots":1},"@isContract_4817":{"entryPoint":null,"id":4817,"parameterSlots":1,"returnSlots":1},"@lockTokenDeposit_13406":{"entryPoint":null,"id":13406,"parameterSlots":0,"returnSlots":0},"@min_11162":{"entryPoint":6580,"id":11162,"parameterSlots":2,"returnSlots":1},"@owner_2861":{"entryPoint":null,"id":2861,"parameterSlots":0,"returnSlots":1},"@postOp_7395":{"entryPoint":3119,"id":7395,"parameterSlots":4,"returnSlots":0},"@priceRatioInfo_13189":{"entryPoint":null,"id":13189,"parameterSlots":0,"returnSlots":0},"@renounceOwnership_2889":{"entryPoint":2411,"id":2889,"parameterSlots":0,"returnSlots":0},"@safeTransferFrom_4538":{"entryPoint":4492,"id":4538,"parameterSlots":4,"returnSlots":0},"@safeTransfer_4512":{"entryPoint":5526,"id":4512,"parameterSlots":3,"returnSlots":0},"@transferOwnership_2912":{"entryPoint":4223,"id":2912,"parameterSlots":1,"returnSlots":0},"@unlockBlock_13200":{"entryPoint":null,"id":13200,"parameterSlots":0,"returnSlots":0},"@unlockStake_7496":{"entryPoint":3145,"id":7496,"parameterSlots":0,"returnSlots":0},"@unlockTokenDeposit_13394":{"entryPoint":null,"id":13394,"parameterSlots":0,"returnSlots":0},"@updatePriceRatio_13621":{"entryPoint":1756,"id":13621,"parameterSlots":2,"returnSlots":0},"@updateTokenParams_13570":{"entryPoint":3950,"id":13570,"parameterSlots":4,"returnSlots":0},"@validatePaymasterUserOp_7359":{"entryPoint":4367,"id":7359,"parameterSlots":3,"returnSlots":2},"@verifyCallResultFromTarget_5084":{"entryPoint":6844,"id":5084,"parameterSlots":4,"returnSlots":1},"@withdrawStake_7511":{"entryPoint":3264,"id":7511,"parameterSlots":1,"returnSlots":0},"@withdrawTo_7451":{"entryPoint":1617,"id":7451,"parameterSlots":2,"returnSlots":0},"@withdrawTokensTo_13452":{"entryPoint":3592,"id":13452,"parameterSlots":3,"returnSlots":0},"abi_decode_tuple_t_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":8385,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_address_payablet_uint256":{"entryPoint":7068,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_bool_fromMemory":{"entryPoint":8735,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419":{"entryPoint":7177,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_contract$_IERC20_$4419t_address":{"entryPoint":7206,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256":{"entryPoint":7112,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256":{"entryPoint":7501,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256":{"entryPoint":7263,"id":null,"parameterSlots":2,"returnSlots":6},"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256":{"entryPoint":7358,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":7560,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":7867,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint32":{"entryPoint":7002,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":7688,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed":{"entryPoint":8769,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed":{"entryPoint":7762,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":7,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":8797,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":8513,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":8621,"id":null,"parameterSlots":4,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":7843,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_t_uint256":{"entryPoint":8276,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_helper":{"entryPoint":7915,"id":null,"parameterSlots":2,"returnSlots":2},"checked_exp_t_uint256_t_uint256":{"entryPoint":8203,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_t_uint256_t_uint8":{"entryPoint":8370,"id":null,"parameterSlots":2,"returnSlots":1},"checked_exp_unsigned":{"entryPoint":8012,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_t_uint256":{"entryPoint":8215,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":7892,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint8":{"entryPoint":8335,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":8663,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":7644,"id":null,"parameterSlots":3,"returnSlots":0},"panic_error_0x11":{"entryPoint":7796,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x21":{"entryPoint":8466,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_address_payable":{"entryPoint":7047,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:22437:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"83:207:111","statements":[{"body":{"nodeType":"YulBlock","src":"129:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"138:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"141:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"131:6:111"},"nodeType":"YulFunctionCall","src":"131:12:111"},"nodeType":"YulExpressionStatement","src":"131:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"104:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"113:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"100:3:111"},"nodeType":"YulFunctionCall","src":"100:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"125:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"96:3:111"},"nodeType":"YulFunctionCall","src":"96:32:111"},"nodeType":"YulIf","src":"93:52:111"},{"nodeType":"YulVariableDeclaration","src":"154:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"180:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"167:12:111"},"nodeType":"YulFunctionCall","src":"167:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"158:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"244:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"253:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"256:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"246:6:111"},"nodeType":"YulFunctionCall","src":"246:12:111"},"nodeType":"YulExpressionStatement","src":"246:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"212:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"223:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"230:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"219:3:111"},"nodeType":"YulFunctionCall","src":"219:22:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"209:2:111"},"nodeType":"YulFunctionCall","src":"209:33:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"202:6:111"},"nodeType":"YulFunctionCall","src":"202:41:111"},"nodeType":"YulIf","src":"199:61:111"},{"nodeType":"YulAssignment","src":"269:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"279:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"269:6:111"}]}]},"name":"abi_decode_tuple_t_uint32","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"49:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"60:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"72:6:111","type":""}],"src":"14:276:111"},{"body":{"nodeType":"YulBlock","src":"348:109:111","statements":[{"body":{"nodeType":"YulBlock","src":"435:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"444:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"447:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"437:6:111"},"nodeType":"YulFunctionCall","src":"437:12:111"},"nodeType":"YulExpressionStatement","src":"437:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"371:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"382:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"389:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"378:3:111"},"nodeType":"YulFunctionCall","src":"378:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"368:2:111"},"nodeType":"YulFunctionCall","src":"368:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"361:6:111"},"nodeType":"YulFunctionCall","src":"361:73:111"},"nodeType":"YulIf","src":"358:93:111"}]},"name":"validator_revert_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"337:5:111","type":""}],"src":"295:162:111"},{"body":{"nodeType":"YulBlock","src":"557:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"605:6:111"},"nodeType":"YulFunctionCall","src":"605:12:111"},"nodeType":"YulExpressionStatement","src":"605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"574:3:111"},"nodeType":"YulFunctionCall","src":"574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"599:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"570:3:111"},"nodeType":"YulFunctionCall","src":"570:32:111"},"nodeType":"YulIf","src":"567:52:111"},{"nodeType":"YulVariableDeclaration","src":"628:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"654:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"641:12:111"},"nodeType":"YulFunctionCall","src":"641:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"632:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"706:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"673:32:111"},"nodeType":"YulFunctionCall","src":"673:39:111"},"nodeType":"YulExpressionStatement","src":"673:39:111"},{"nodeType":"YulAssignment","src":"721:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"731:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"721:6:111"}]},{"nodeType":"YulAssignment","src":"745:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"772:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"783:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"768:3:111"},"nodeType":"YulFunctionCall","src":"768:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"755:12:111"},"nodeType":"YulFunctionCall","src":"755:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"745:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"515:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"526:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"538:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"546:6:111","type":""}],"src":"462:331:111"},{"body":{"nodeType":"YulBlock","src":"900:236:111","statements":[{"body":{"nodeType":"YulBlock","src":"946:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"955:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"958:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"948:6:111"},"nodeType":"YulFunctionCall","src":"948:12:111"},"nodeType":"YulExpressionStatement","src":"948:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"921:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"930:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"917:3:111"},"nodeType":"YulFunctionCall","src":"917:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"942:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"913:3:111"},"nodeType":"YulFunctionCall","src":"913:32:111"},"nodeType":"YulIf","src":"910:52:111"},{"nodeType":"YulVariableDeclaration","src":"971:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"997:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"984:12:111"},"nodeType":"YulFunctionCall","src":"984:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"975:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1049:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1016:32:111"},"nodeType":"YulFunctionCall","src":"1016:39:111"},"nodeType":"YulExpressionStatement","src":"1016:39:111"},{"nodeType":"YulAssignment","src":"1064:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1074:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1064:6:111"}]},{"nodeType":"YulAssignment","src":"1088:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1115:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1126:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1111:3:111"},"nodeType":"YulFunctionCall","src":"1111:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1098:12:111"},"nodeType":"YulFunctionCall","src":"1098:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1088:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"858:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"869:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"881:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"889:6:111","type":""}],"src":"798:338:111"},{"body":{"nodeType":"YulBlock","src":"1260:368:111","statements":[{"body":{"nodeType":"YulBlock","src":"1306:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1315:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1318:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1308:6:111"},"nodeType":"YulFunctionCall","src":"1308:12:111"},"nodeType":"YulExpressionStatement","src":"1308:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1281:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1290:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1277:3:111"},"nodeType":"YulFunctionCall","src":"1277:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1302:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1273:3:111"},"nodeType":"YulFunctionCall","src":"1273:32:111"},"nodeType":"YulIf","src":"1270:52:111"},{"nodeType":"YulVariableDeclaration","src":"1331:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1357:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1344:12:111"},"nodeType":"YulFunctionCall","src":"1344:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1335:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1409:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1376:32:111"},"nodeType":"YulFunctionCall","src":"1376:39:111"},"nodeType":"YulExpressionStatement","src":"1376:39:111"},{"nodeType":"YulAssignment","src":"1424:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1434:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1424:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"1448:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1480:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1491:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1476:3:111"},"nodeType":"YulFunctionCall","src":"1476:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1463:12:111"},"nodeType":"YulFunctionCall","src":"1463:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"1452:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"1537:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1504:32:111"},"nodeType":"YulFunctionCall","src":"1504:41:111"},"nodeType":"YulExpressionStatement","src":"1504:41:111"},{"nodeType":"YulAssignment","src":"1554:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"1564:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"1554:6:111"}]},{"nodeType":"YulAssignment","src":"1580:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1607:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1618:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1603:3:111"},"nodeType":"YulFunctionCall","src":"1603:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1590:12:111"},"nodeType":"YulFunctionCall","src":"1590:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"1580:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1210:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1221:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1233:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1241:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1249:6:111","type":""}],"src":"1141:487:111"},{"body":{"nodeType":"YulBlock","src":"1718:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"1764:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1773:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1776:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1766:6:111"},"nodeType":"YulFunctionCall","src":"1766:12:111"},"nodeType":"YulExpressionStatement","src":"1766:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1739:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1748:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1735:3:111"},"nodeType":"YulFunctionCall","src":"1735:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1760:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1731:3:111"},"nodeType":"YulFunctionCall","src":"1731:32:111"},"nodeType":"YulIf","src":"1728:52:111"},{"nodeType":"YulVariableDeclaration","src":"1789:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1815:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1802:12:111"},"nodeType":"YulFunctionCall","src":"1802:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"1793:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1867:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"1834:32:111"},"nodeType":"YulFunctionCall","src":"1834:39:111"},"nodeType":"YulExpressionStatement","src":"1834:39:111"},{"nodeType":"YulAssignment","src":"1882:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1892:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1882:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1684:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1695:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1707:6:111","type":""}],"src":"1633:270:111"},{"body":{"nodeType":"YulBlock","src":"2160:354:111","statements":[{"nodeType":"YulAssignment","src":"2170:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2182:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2193:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2178:3:111"},"nodeType":"YulFunctionCall","src":"2178:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2170:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2228:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2236:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2224:3:111"},"nodeType":"YulFunctionCall","src":"2224:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2206:6:111"},"nodeType":"YulFunctionCall","src":"2206:74:111"},"nodeType":"YulExpressionStatement","src":"2206:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2300:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2311:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2296:3:111"},"nodeType":"YulFunctionCall","src":"2296:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"2320:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2328:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2316:3:111"},"nodeType":"YulFunctionCall","src":"2316:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2289:6:111"},"nodeType":"YulFunctionCall","src":"2289:45:111"},"nodeType":"YulExpressionStatement","src":"2289:45:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2354:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2365:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2350:3:111"},"nodeType":"YulFunctionCall","src":"2350:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2370:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2343:6:111"},"nodeType":"YulFunctionCall","src":"2343:34:111"},"nodeType":"YulExpressionStatement","src":"2343:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2408:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2393:3:111"},"nodeType":"YulFunctionCall","src":"2393:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2413:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2386:6:111"},"nodeType":"YulFunctionCall","src":"2386:34:111"},"nodeType":"YulExpressionStatement","src":"2386:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2440:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2451:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2436:3:111"},"nodeType":"YulFunctionCall","src":"2436:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"2457:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2429:6:111"},"nodeType":"YulFunctionCall","src":"2429:35:111"},"nodeType":"YulExpressionStatement","src":"2429:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2484:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2495:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2480:3:111"},"nodeType":"YulFunctionCall","src":"2480:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"2501:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2473:6:111"},"nodeType":"YulFunctionCall","src":"2473:35:111"},"nodeType":"YulExpressionStatement","src":"2473:35:111"}]},"name":"abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2089:9:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"2100:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"2108:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"2116:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2124:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2132:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"2140:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2151:4:111","type":""}],"src":"1908:606:111"},{"body":{"nodeType":"YulBlock","src":"2621:317:111","statements":[{"body":{"nodeType":"YulBlock","src":"2667:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2676:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2679:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2669:6:111"},"nodeType":"YulFunctionCall","src":"2669:12:111"},"nodeType":"YulExpressionStatement","src":"2669:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2642:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2651:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2638:3:111"},"nodeType":"YulFunctionCall","src":"2638:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2663:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2634:3:111"},"nodeType":"YulFunctionCall","src":"2634:32:111"},"nodeType":"YulIf","src":"2631:52:111"},{"nodeType":"YulVariableDeclaration","src":"2692:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2718:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2705:12:111"},"nodeType":"YulFunctionCall","src":"2705:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2696:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2770:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2737:32:111"},"nodeType":"YulFunctionCall","src":"2737:39:111"},"nodeType":"YulExpressionStatement","src":"2737:39:111"},{"nodeType":"YulAssignment","src":"2785:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2795:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2785:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2809:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2841:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2852:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2837:3:111"},"nodeType":"YulFunctionCall","src":"2837:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2824:12:111"},"nodeType":"YulFunctionCall","src":"2824:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"2813:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"2898:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"2865:32:111"},"nodeType":"YulFunctionCall","src":"2865:41:111"},"nodeType":"YulExpressionStatement","src":"2865:41:111"},{"nodeType":"YulAssignment","src":"2915:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"2925:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2915:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2579:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2590:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2602:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2610:6:111","type":""}],"src":"2519:419:111"},{"body":{"nodeType":"YulBlock","src":"3072:119:111","statements":[{"nodeType":"YulAssignment","src":"3082:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3094:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3105:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3090:3:111"},"nodeType":"YulFunctionCall","src":"3090:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3082:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3124:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3135:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3117:6:111"},"nodeType":"YulFunctionCall","src":"3117:25:111"},"nodeType":"YulExpressionStatement","src":"3117:25:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3162:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3173:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3158:3:111"},"nodeType":"YulFunctionCall","src":"3158:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"3178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3151:6:111"},"nodeType":"YulFunctionCall","src":"3151:34:111"},"nodeType":"YulExpressionStatement","src":"3151:34:111"}]},"name":"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3033:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3044:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3052:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3063:4:111","type":""}],"src":"2943:248:111"},{"body":{"nodeType":"YulBlock","src":"3266:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"3312:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3321:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3324:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3314:6:111"},"nodeType":"YulFunctionCall","src":"3314:12:111"},"nodeType":"YulExpressionStatement","src":"3314:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3287:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3296:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3283:3:111"},"nodeType":"YulFunctionCall","src":"3283:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3308:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3279:3:111"},"nodeType":"YulFunctionCall","src":"3279:32:111"},"nodeType":"YulIf","src":"3276:52:111"},{"nodeType":"YulVariableDeclaration","src":"3337:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3363:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3350:12:111"},"nodeType":"YulFunctionCall","src":"3350:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3341:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3415:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3382:32:111"},"nodeType":"YulFunctionCall","src":"3382:39:111"},"nodeType":"YulExpressionStatement","src":"3382:39:111"},{"nodeType":"YulAssignment","src":"3430:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3440:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3430:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3232:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3243:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3255:6:111","type":""}],"src":"3196:255:111"},{"body":{"nodeType":"YulBlock","src":"3557:76:111","statements":[{"nodeType":"YulAssignment","src":"3567:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3579:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"3590:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3575:3:111"},"nodeType":"YulFunctionCall","src":"3575:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"3567:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3609:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"3620:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3602:6:111"},"nodeType":"YulFunctionCall","src":"3602:25:111"},"nodeType":"YulExpressionStatement","src":"3602:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3526:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"3537:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"3548:4:111","type":""}],"src":"3456:177:111"},{"body":{"nodeType":"YulBlock","src":"3806:542:111","statements":[{"body":{"nodeType":"YulBlock","src":"3853:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3862:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3865:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3855:6:111"},"nodeType":"YulFunctionCall","src":"3855:12:111"},"nodeType":"YulExpressionStatement","src":"3855:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3827:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"3836:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3823:3:111"},"nodeType":"YulFunctionCall","src":"3823:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"3848:3:111","type":"","value":"192"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3819:3:111"},"nodeType":"YulFunctionCall","src":"3819:33:111"},"nodeType":"YulIf","src":"3816:53:111"},{"nodeType":"YulVariableDeclaration","src":"3878:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3904:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3891:12:111"},"nodeType":"YulFunctionCall","src":"3891:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3882:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"3956:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"3923:32:111"},"nodeType":"YulFunctionCall","src":"3923:39:111"},"nodeType":"YulExpressionStatement","src":"3923:39:111"},{"nodeType":"YulAssignment","src":"3971:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"3981:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"3971:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"3995:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4027:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4038:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4023:3:111"},"nodeType":"YulFunctionCall","src":"4023:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4010:12:111"},"nodeType":"YulFunctionCall","src":"4010:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"3999:7:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4094:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4103:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4106:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4096:6:111"},"nodeType":"YulFunctionCall","src":"4096:12:111"},"nodeType":"YulExpressionStatement","src":"4096:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4064:7:111"},{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4077:7:111"},{"kind":"number","nodeType":"YulLiteral","src":"4086:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4073:3:111"},"nodeType":"YulFunctionCall","src":"4073:18:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"4061:2:111"},"nodeType":"YulFunctionCall","src":"4061:31:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4054:6:111"},"nodeType":"YulFunctionCall","src":"4054:39:111"},"nodeType":"YulIf","src":"4051:59:111"},{"nodeType":"YulAssignment","src":"4119:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"4129:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"4119:6:111"}]},{"nodeType":"YulAssignment","src":"4145:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4183:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4168:3:111"},"nodeType":"YulFunctionCall","src":"4168:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4155:12:111"},"nodeType":"YulFunctionCall","src":"4155:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"4145:6:111"}]},{"nodeType":"YulAssignment","src":"4196:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4223:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4234:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4219:3:111"},"nodeType":"YulFunctionCall","src":"4219:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4206:12:111"},"nodeType":"YulFunctionCall","src":"4206:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"4196:6:111"}]},{"nodeType":"YulAssignment","src":"4247:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4274:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4285:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4270:3:111"},"nodeType":"YulFunctionCall","src":"4270:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4257:12:111"},"nodeType":"YulFunctionCall","src":"4257:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"4247:6:111"}]},{"nodeType":"YulAssignment","src":"4299:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4326:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4337:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4322:3:111"},"nodeType":"YulFunctionCall","src":"4322:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4309:12:111"},"nodeType":"YulFunctionCall","src":"4309:33:111"},"variableNames":[{"name":"value5","nodeType":"YulIdentifier","src":"4299:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"3732:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"3743:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"3755:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"3763:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"3771:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"3779:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"3787:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"3795:6:111","type":""}],"src":"3638:710:111"},{"body":{"nodeType":"YulBlock","src":"4454:125:111","statements":[{"nodeType":"YulAssignment","src":"4464:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4476:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4487:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4472:3:111"},"nodeType":"YulFunctionCall","src":"4472:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"4464:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4506:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"4521:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"4529:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4517:3:111"},"nodeType":"YulFunctionCall","src":"4517:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4499:6:111"},"nodeType":"YulFunctionCall","src":"4499:74:111"},"nodeType":"YulExpressionStatement","src":"4499:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4423:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"4434:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"4445:4:111","type":""}],"src":"4353:226:111"},{"body":{"nodeType":"YulBlock","src":"4723:680:111","statements":[{"body":{"nodeType":"YulBlock","src":"4769:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4778:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4781:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4771:6:111"},"nodeType":"YulFunctionCall","src":"4771:12:111"},"nodeType":"YulExpressionStatement","src":"4771:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4744:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"4753:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4740:3:111"},"nodeType":"YulFunctionCall","src":"4740:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"4765:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4736:3:111"},"nodeType":"YulFunctionCall","src":"4736:32:111"},"nodeType":"YulIf","src":"4733:52:111"},{"nodeType":"YulVariableDeclaration","src":"4794:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4820:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4807:12:111"},"nodeType":"YulFunctionCall","src":"4807:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4798:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"4863:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4872:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4875:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4865:6:111"},"nodeType":"YulFunctionCall","src":"4865:12:111"},"nodeType":"YulExpressionStatement","src":"4865:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4852:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"4859:1:111","type":"","value":"3"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"4849:2:111"},"nodeType":"YulFunctionCall","src":"4849:12:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4842:6:111"},"nodeType":"YulFunctionCall","src":"4842:20:111"},"nodeType":"YulIf","src":"4839:40:111"},{"nodeType":"YulAssignment","src":"4888:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"4898:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4888:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"4912:46:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4943:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"4954:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4939:3:111"},"nodeType":"YulFunctionCall","src":"4939:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4926:12:111"},"nodeType":"YulFunctionCall","src":"4926:32:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"4916:6:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4967:28:111","value":{"kind":"number","nodeType":"YulLiteral","src":"4977:18:111","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"4971:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5022:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5031:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5034:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5024:6:111"},"nodeType":"YulFunctionCall","src":"5024:12:111"},"nodeType":"YulExpressionStatement","src":"5024:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"5010:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5018:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5007:2:111"},"nodeType":"YulFunctionCall","src":"5007:14:111"},"nodeType":"YulIf","src":"5004:34:111"},{"nodeType":"YulVariableDeclaration","src":"5047:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5061:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"5072:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5057:3:111"},"nodeType":"YulFunctionCall","src":"5057:22:111"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"5051:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5127:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5136:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5139:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5129:6:111"},"nodeType":"YulFunctionCall","src":"5129:12:111"},"nodeType":"YulExpressionStatement","src":"5129:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5106:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5110:4:111","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5102:3:111"},"nodeType":"YulFunctionCall","src":"5102:13:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5117:7:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5098:3:111"},"nodeType":"YulFunctionCall","src":"5098:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"5091:6:111"},"nodeType":"YulFunctionCall","src":"5091:35:111"},"nodeType":"YulIf","src":"5088:55:111"},{"nodeType":"YulVariableDeclaration","src":"5152:30:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5179:2:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5166:12:111"},"nodeType":"YulFunctionCall","src":"5166:16:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5156:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"5209:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5218:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5221:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5211:6:111"},"nodeType":"YulFunctionCall","src":"5211:12:111"},"nodeType":"YulExpressionStatement","src":"5211:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"5197:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"5205:2:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5194:2:111"},"nodeType":"YulFunctionCall","src":"5194:14:111"},"nodeType":"YulIf","src":"5191:34:111"},{"body":{"nodeType":"YulBlock","src":"5275:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5284:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5287:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5277:6:111"},"nodeType":"YulFunctionCall","src":"5277:12:111"},"nodeType":"YulExpressionStatement","src":"5277:12:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5248:2:111"},{"name":"length","nodeType":"YulIdentifier","src":"5252:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5244:3:111"},"nodeType":"YulFunctionCall","src":"5244:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"5261:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5240:3:111"},"nodeType":"YulFunctionCall","src":"5240:24:111"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5266:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5237:2:111"},"nodeType":"YulFunctionCall","src":"5237:37:111"},"nodeType":"YulIf","src":"5234:57:111"},{"nodeType":"YulAssignment","src":"5300:21:111","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"5314:2:111"},{"kind":"number","nodeType":"YulLiteral","src":"5318:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5310:3:111"},"nodeType":"YulFunctionCall","src":"5310:11:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5300:6:111"}]},{"nodeType":"YulAssignment","src":"5330:16:111","value":{"name":"length","nodeType":"YulIdentifier","src":"5340:6:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"5330:6:111"}]},{"nodeType":"YulAssignment","src":"5355:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5393:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5378:3:111"},"nodeType":"YulFunctionCall","src":"5378:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5365:12:111"},"nodeType":"YulFunctionCall","src":"5365:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"5355:6:111"}]}]},"name":"abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4665:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4676:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4688:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"4696:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"4704:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"4712:6:111","type":""}],"src":"4584:819:111"},{"body":{"nodeType":"YulBlock","src":"5530:125:111","statements":[{"nodeType":"YulAssignment","src":"5540:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5552:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"5563:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5548:3:111"},"nodeType":"YulFunctionCall","src":"5548:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5540:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5582:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5597:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"5605:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"5593:3:111"},"nodeType":"YulFunctionCall","src":"5593:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5575:6:111"},"nodeType":"YulFunctionCall","src":"5575:74:111"},"nodeType":"YulExpressionStatement","src":"5575:74:111"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5499:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5510:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5521:4:111","type":""}],"src":"5408:247:111"},{"body":{"nodeType":"YulBlock","src":"5738:185:111","statements":[{"body":{"nodeType":"YulBlock","src":"5784:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5793:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5796:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5786:6:111"},"nodeType":"YulFunctionCall","src":"5786:12:111"},"nodeType":"YulExpressionStatement","src":"5786:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"5759:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"5768:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5755:3:111"},"nodeType":"YulFunctionCall","src":"5755:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"5780:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"5751:3:111"},"nodeType":"YulFunctionCall","src":"5751:32:111"},"nodeType":"YulIf","src":"5748:52:111"},{"nodeType":"YulVariableDeclaration","src":"5809:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5835:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"5822:12:111"},"nodeType":"YulFunctionCall","src":"5822:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"5813:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"5887:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"5854:32:111"},"nodeType":"YulFunctionCall","src":"5854:39:111"},"nodeType":"YulExpressionStatement","src":"5854:39:111"},{"nodeType":"YulAssignment","src":"5902:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"5912:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"5902:6:111"}]}]},"name":"abi_decode_tuple_t_address_payable","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5704:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5715:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5727:6:111","type":""}],"src":"5660:263:111"},{"body":{"nodeType":"YulBlock","src":"6064:339:111","statements":[{"body":{"nodeType":"YulBlock","src":"6111:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6120:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6123:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6113:6:111"},"nodeType":"YulFunctionCall","src":"6113:12:111"},"nodeType":"YulExpressionStatement","src":"6113:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6085:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6094:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6081:3:111"},"nodeType":"YulFunctionCall","src":"6081:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6106:3:111","type":"","value":"128"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6077:3:111"},"nodeType":"YulFunctionCall","src":"6077:33:111"},"nodeType":"YulIf","src":"6074:53:111"},{"nodeType":"YulVariableDeclaration","src":"6136:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6162:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6149:12:111"},"nodeType":"YulFunctionCall","src":"6149:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6140:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6214:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"6181:32:111"},"nodeType":"YulFunctionCall","src":"6181:39:111"},"nodeType":"YulExpressionStatement","src":"6181:39:111"},{"nodeType":"YulAssignment","src":"6229:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"6239:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6229:6:111"}]},{"nodeType":"YulAssignment","src":"6253:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6280:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6291:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6276:3:111"},"nodeType":"YulFunctionCall","src":"6276:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6263:12:111"},"nodeType":"YulFunctionCall","src":"6263:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6253:6:111"}]},{"nodeType":"YulAssignment","src":"6304:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6331:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6342:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6327:3:111"},"nodeType":"YulFunctionCall","src":"6327:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6314:12:111"},"nodeType":"YulFunctionCall","src":"6314:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6304:6:111"}]},{"nodeType":"YulAssignment","src":"6355:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6382:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6393:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6378:3:111"},"nodeType":"YulFunctionCall","src":"6378:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6365:12:111"},"nodeType":"YulFunctionCall","src":"6365:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"6355:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6006:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6017:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6029:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6037:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6045:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"6053:6:111","type":""}],"src":"5928:475:111"},{"body":{"nodeType":"YulBlock","src":"6546:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"6592:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6601:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6604:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6594:6:111"},"nodeType":"YulFunctionCall","src":"6594:12:111"},"nodeType":"YulExpressionStatement","src":"6594:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6567:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"6576:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6563:3:111"},"nodeType":"YulFunctionCall","src":"6563:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"6588:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6559:3:111"},"nodeType":"YulFunctionCall","src":"6559:32:111"},"nodeType":"YulIf","src":"6556:52:111"},{"nodeType":"YulVariableDeclaration","src":"6617:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6644:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6631:12:111"},"nodeType":"YulFunctionCall","src":"6631:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6621:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6697:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6706:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6709:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6699:6:111"},"nodeType":"YulFunctionCall","src":"6699:12:111"},"nodeType":"YulExpressionStatement","src":"6699:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6669:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"6677:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6666:2:111"},"nodeType":"YulFunctionCall","src":"6666:30:111"},"nodeType":"YulIf","src":"6663:50:111"},{"nodeType":"YulVariableDeclaration","src":"6722:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6736:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"6747:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6732:3:111"},"nodeType":"YulFunctionCall","src":"6732:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6726:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"6793:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6802:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6805:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6795:6:111"},"nodeType":"YulFunctionCall","src":"6795:12:111"},"nodeType":"YulExpressionStatement","src":"6795:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6774:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"6783:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6770:3:111"},"nodeType":"YulFunctionCall","src":"6770:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"6788:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6766:3:111"},"nodeType":"YulFunctionCall","src":"6766:26:111"},"nodeType":"YulIf","src":"6763:46:111"},{"nodeType":"YulAssignment","src":"6818:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"6828:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6818:6:111"}]},{"nodeType":"YulAssignment","src":"6839:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6866:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6877:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6862:3:111"},"nodeType":"YulFunctionCall","src":"6862:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6849:12:111"},"nodeType":"YulFunctionCall","src":"6849:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"6839:6:111"}]},{"nodeType":"YulAssignment","src":"6890:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6917:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"6928:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6913:3:111"},"nodeType":"YulFunctionCall","src":"6913:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6900:12:111"},"nodeType":"YulFunctionCall","src":"6900:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"6890:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6496:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"6507:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"6519:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"6527:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"6535:6:111","type":""}],"src":"6408:530:111"},{"body":{"nodeType":"YulBlock","src":"6996:205:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7006:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"7015:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"7010:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"7075:63:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7100:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7105:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7096:3:111"},"nodeType":"YulFunctionCall","src":"7096:11:111"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"7119:3:111"},{"name":"i","nodeType":"YulIdentifier","src":"7124:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7115:3:111"},"nodeType":"YulFunctionCall","src":"7115:11:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7109:5:111"},"nodeType":"YulFunctionCall","src":"7109:18:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7089:6:111"},"nodeType":"YulFunctionCall","src":"7089:39:111"},"nodeType":"YulExpressionStatement","src":"7089:39:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7036:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7039:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7033:2:111"},"nodeType":"YulFunctionCall","src":"7033:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"7047:19:111","statements":[{"nodeType":"YulAssignment","src":"7049:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7058:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"7061:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7054:3:111"},"nodeType":"YulFunctionCall","src":"7054:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"7049:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"7029:3:111","statements":[]},"src":"7025:113:111"},{"body":{"nodeType":"YulBlock","src":"7164:31:111","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"7177:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7182:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7173:3:111"},"nodeType":"YulFunctionCall","src":"7173:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"7191:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7166:6:111"},"nodeType":"YulFunctionCall","src":"7166:27:111"},"nodeType":"YulExpressionStatement","src":"7166:27:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"7153:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"7156:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7150:2:111"},"nodeType":"YulFunctionCall","src":"7150:13:111"},"nodeType":"YulIf","src":"7147:48:111"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"6974:3:111","type":""},{"name":"dst","nodeType":"YulTypedName","src":"6979:3:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"6984:6:111","type":""}],"src":"6943:258:111"},{"body":{"nodeType":"YulBlock","src":"7255:267:111","statements":[{"nodeType":"YulVariableDeclaration","src":"7265:26:111","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7285:5:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7279:5:111"},"nodeType":"YulFunctionCall","src":"7279:12:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"7269:6:111","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7307:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"7312:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7300:6:111"},"nodeType":"YulFunctionCall","src":"7300:19:111"},"nodeType":"YulExpressionStatement","src":"7300:19:111"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7354:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"7361:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7350:3:111"},"nodeType":"YulFunctionCall","src":"7350:16:111"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7372:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"7377:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7368:3:111"},"nodeType":"YulFunctionCall","src":"7368:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"7384:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"7328:21:111"},"nodeType":"YulFunctionCall","src":"7328:63:111"},"nodeType":"YulExpressionStatement","src":"7328:63:111"},{"nodeType":"YulAssignment","src":"7400:116:111","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7415:3:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"7428:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7436:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7424:3:111"},"nodeType":"YulFunctionCall","src":"7424:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"7441:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7420:3:111"},"nodeType":"YulFunctionCall","src":"7420:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7411:3:111"},"nodeType":"YulFunctionCall","src":"7411:98:111"},{"kind":"number","nodeType":"YulLiteral","src":"7511:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7407:3:111"},"nodeType":"YulFunctionCall","src":"7407:109:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"7400:3:111"}]}]},"name":"abi_encode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"7232:5:111","type":""},{"name":"pos","nodeType":"YulTypedName","src":"7239:3:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"7247:3:111","type":""}],"src":"7206:316:111"},{"body":{"nodeType":"YulBlock","src":"7674:141:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7691:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7702:2:111","type":"","value":"64"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7684:6:111"},"nodeType":"YulFunctionCall","src":"7684:21:111"},"nodeType":"YulExpressionStatement","src":"7684:21:111"},{"nodeType":"YulAssignment","src":"7714:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7739:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7751:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7762:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7747:3:111"},"nodeType":"YulFunctionCall","src":"7747:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"7722:16:111"},"nodeType":"YulFunctionCall","src":"7722:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7714:4:111"}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7786:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7797:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7782:3:111"},"nodeType":"YulFunctionCall","src":"7782:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"7802:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7775:6:111"},"nodeType":"YulFunctionCall","src":"7775:34:111"},"nodeType":"YulExpressionStatement","src":"7775:34:111"}]},"name":"abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7635:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7646:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7654:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7665:4:111","type":""}],"src":"7527:288:111"},{"body":{"nodeType":"YulBlock","src":"7919:93:111","statements":[{"nodeType":"YulAssignment","src":"7929:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7941:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"7952:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7937:3:111"},"nodeType":"YulFunctionCall","src":"7937:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7929:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7971:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7986:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"7994:10:111","type":"","value":"0xffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7982:3:111"},"nodeType":"YulFunctionCall","src":"7982:23:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7964:6:111"},"nodeType":"YulFunctionCall","src":"7964:42:111"},"nodeType":"YulExpressionStatement","src":"7964:42:111"}]},"name":"abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7888:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7899:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7910:4:111","type":""}],"src":"7820:192:111"},{"body":{"nodeType":"YulBlock","src":"8162:168:111","statements":[{"nodeType":"YulAssignment","src":"8172:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8184:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8195:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8180:3:111"},"nodeType":"YulFunctionCall","src":"8180:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8172:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8214:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8229:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"8237:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8225:3:111"},"nodeType":"YulFunctionCall","src":"8225:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8207:6:111"},"nodeType":"YulFunctionCall","src":"8207:74:111"},"nodeType":"YulExpressionStatement","src":"8207:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8301:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8312:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8297:3:111"},"nodeType":"YulFunctionCall","src":"8297:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"8317:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8290:6:111"},"nodeType":"YulFunctionCall","src":"8290:34:111"},"nodeType":"YulExpressionStatement","src":"8290:34:111"}]},"name":"abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8123:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"8134:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8142:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8153:4:111","type":""}],"src":"8017:313:111"},{"body":{"nodeType":"YulBlock","src":"8509:225:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8526:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8537:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8519:6:111"},"nodeType":"YulFunctionCall","src":"8519:21:111"},"nodeType":"YulExpressionStatement","src":"8519:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8560:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8571:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8556:3:111"},"nodeType":"YulFunctionCall","src":"8556:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8576:2:111","type":"","value":"35"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8549:6:111"},"nodeType":"YulFunctionCall","src":"8549:30:111"},"nodeType":"YulExpressionStatement","src":"8549:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8599:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8610:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8595:3:111"},"nodeType":"YulFunctionCall","src":"8595:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20756e737570706f7274656420746f","kind":"string","nodeType":"YulLiteral","src":"8615:34:111","type":"","value":"DepositPaymaster: unsupported to"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8588:6:111"},"nodeType":"YulFunctionCall","src":"8588:62:111"},"nodeType":"YulExpressionStatement","src":"8588:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8670:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8681:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8666:3:111"},"nodeType":"YulFunctionCall","src":"8666:18:111"},{"hexValue":"6b656e","kind":"string","nodeType":"YulLiteral","src":"8686:5:111","type":"","value":"ken"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8659:6:111"},"nodeType":"YulFunctionCall","src":"8659:33:111"},"nodeType":"YulExpressionStatement","src":"8659:33:111"},{"nodeType":"YulAssignment","src":"8701:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8713:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8724:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8709:3:111"},"nodeType":"YulFunctionCall","src":"8709:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8701:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8486:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8500:4:111","type":""}],"src":"8335:399:111"},{"body":{"nodeType":"YulBlock","src":"8913:227:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8930:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8941:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8923:6:111"},"nodeType":"YulFunctionCall","src":"8923:21:111"},"nodeType":"YulExpressionStatement","src":"8923:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8964:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"8975:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8960:3:111"},"nodeType":"YulFunctionCall","src":"8960:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"8980:2:111","type":"","value":"37"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8953:6:111"},"nodeType":"YulFunctionCall","src":"8953:30:111"},"nodeType":"YulExpressionStatement","src":"8953:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9003:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9014:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8999:3:111"},"nodeType":"YulFunctionCall","src":"8999:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420707269636520","kind":"string","nodeType":"YulLiteral","src":"9019:34:111","type":"","value":"DepositPaymaster: Invalid price "}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8992:6:111"},"nodeType":"YulFunctionCall","src":"8992:62:111"},"nodeType":"YulExpressionStatement","src":"8992:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9074:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9085:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9070:3:111"},"nodeType":"YulFunctionCall","src":"9070:18:111"},{"hexValue":"726174696f","kind":"string","nodeType":"YulLiteral","src":"9090:7:111","type":"","value":"ratio"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9063:6:111"},"nodeType":"YulFunctionCall","src":"9063:35:111"},"nodeType":"YulExpressionStatement","src":"9063:35:111"},{"nodeType":"YulAssignment","src":"9107:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9119:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9130:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9115:3:111"},"nodeType":"YulFunctionCall","src":"9115:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9107:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8890:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8904:4:111","type":""}],"src":"8739:401:111"},{"body":{"nodeType":"YulBlock","src":"9177:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9194:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9197:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9187:6:111"},"nodeType":"YulFunctionCall","src":"9187:88:111"},"nodeType":"YulExpressionStatement","src":"9187:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9291:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"9294:4:111","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9284:6:111"},"nodeType":"YulFunctionCall","src":"9284:15:111"},"nodeType":"YulExpressionStatement","src":"9284:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"9315:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"9318:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"9308:6:111"},"nodeType":"YulFunctionCall","src":"9308:15:111"},"nodeType":"YulExpressionStatement","src":"9308:15:111"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"9145:184:111"},{"body":{"nodeType":"YulBlock","src":"9382:80:111","statements":[{"body":{"nodeType":"YulBlock","src":"9409:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"9411:16:111"},"nodeType":"YulFunctionCall","src":"9411:18:111"},"nodeType":"YulExpressionStatement","src":"9411:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9398:1:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"9405:1:111"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"9401:3:111"},"nodeType":"YulFunctionCall","src":"9401:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"9395:2:111"},"nodeType":"YulFunctionCall","src":"9395:13:111"},"nodeType":"YulIf","src":"9392:39:111"},{"nodeType":"YulAssignment","src":"9440:16:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"9451:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"9454:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9447:3:111"},"nodeType":"YulFunctionCall","src":"9447:9:111"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"9440:3:111"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"9365:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"9368:1:111","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"9374:3:111","type":""}],"src":"9334:128:111"},{"body":{"nodeType":"YulBlock","src":"9641:234:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9658:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9669:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9651:6:111"},"nodeType":"YulFunctionCall","src":"9651:21:111"},"nodeType":"YulExpressionStatement","src":"9651:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9692:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9703:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9688:3:111"},"nodeType":"YulFunctionCall","src":"9688:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"9708:2:111","type":"","value":"44"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9681:6:111"},"nodeType":"YulFunctionCall","src":"9681:30:111"},"nodeType":"YulExpressionStatement","src":"9681:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9731:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9742:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9727:3:111"},"nodeType":"YulFunctionCall","src":"9727:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20707269636520726174696f206361","kind":"string","nodeType":"YulLiteral","src":"9747:34:111","type":"","value":"DepositPaymaster: price ratio ca"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9720:6:111"},"nodeType":"YulFunctionCall","src":"9720:62:111"},"nodeType":"YulExpressionStatement","src":"9720:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9802:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9813:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9798:3:111"},"nodeType":"YulFunctionCall","src":"9798:18:111"},{"hexValue":"6e6e6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"9818:14:111","type":"","value":"nnot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9791:6:111"},"nodeType":"YulFunctionCall","src":"9791:42:111"},"nodeType":"YulExpressionStatement","src":"9791:42:111"},{"nodeType":"YulAssignment","src":"9842:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9854:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"9865:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9850:3:111"},"nodeType":"YulFunctionCall","src":"9850:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"9842:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9618:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9632:4:111","type":""}],"src":"9467:408:111"},{"body":{"nodeType":"YulBlock","src":"10054:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10071:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10082:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10064:6:111"},"nodeType":"YulFunctionCall","src":"10064:21:111"},"nodeType":"YulExpressionStatement","src":"10064:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10105:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10116:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10101:3:111"},"nodeType":"YulFunctionCall","src":"10101:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10121:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10094:6:111"},"nodeType":"YulFunctionCall","src":"10094:30:111"},"nodeType":"YulExpressionStatement","src":"10094:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10144:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10155:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10140:3:111"},"nodeType":"YulFunctionCall","src":"10140:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e","kind":"string","nodeType":"YulLiteral","src":"10160:34:111","type":"","value":"DepositPaymaster: min ratio cann"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10133:6:111"},"nodeType":"YulFunctionCall","src":"10133:62:111"},"nodeType":"YulExpressionStatement","src":"10133:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10215:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10226:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10211:3:111"},"nodeType":"YulFunctionCall","src":"10211:18:111"},{"hexValue":"6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"10231:12:111","type":"","value":"ot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10204:6:111"},"nodeType":"YulFunctionCall","src":"10204:40:111"},"nodeType":"YulExpressionStatement","src":"10204:40:111"},{"nodeType":"YulAssignment","src":"10253:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10276:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10261:3:111"},"nodeType":"YulFunctionCall","src":"10261:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10253:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10031:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10045:4:111","type":""}],"src":"9880:406:111"},{"body":{"nodeType":"YulBlock","src":"10465:181:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10482:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10493:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10475:6:111"},"nodeType":"YulFunctionCall","src":"10475:21:111"},"nodeType":"YulExpressionStatement","src":"10475:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10516:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10527:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10512:3:111"},"nodeType":"YulFunctionCall","src":"10512:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"10532:2:111","type":"","value":"31"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10505:6:111"},"nodeType":"YulFunctionCall","src":"10505:30:111"},"nodeType":"YulExpressionStatement","src":"10505:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10555:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10566:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10551:3:111"},"nodeType":"YulFunctionCall","src":"10551:18:111"},{"hexValue":"4465706f7369745061796d61737465723a20496e76616c696420746f6b656e","kind":"string","nodeType":"YulLiteral","src":"10571:33:111","type":"","value":"DepositPaymaster: Invalid token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10544:6:111"},"nodeType":"YulFunctionCall","src":"10544:61:111"},"nodeType":"YulExpressionStatement","src":"10544:61:111"},{"nodeType":"YulAssignment","src":"10614:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10626:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10637:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10622:3:111"},"nodeType":"YulFunctionCall","src":"10622:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10614:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10442:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10456:4:111","type":""}],"src":"10291:355:111"},{"body":{"nodeType":"YulBlock","src":"10768:125:111","statements":[{"nodeType":"YulAssignment","src":"10778:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10790:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"10801:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10786:3:111"},"nodeType":"YulFunctionCall","src":"10786:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"10778:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10820:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10835:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"10843:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10831:3:111"},"nodeType":"YulFunctionCall","src":"10831:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10813:6:111"},"nodeType":"YulFunctionCall","src":"10813:74:111"},"nodeType":"YulExpressionStatement","src":"10813:74:111"}]},"name":"abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10737:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"10748:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"10759:4:111","type":""}],"src":"10651:242:111"},{"body":{"nodeType":"YulBlock","src":"10979:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"11025:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11034:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11037:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11027:6:111"},"nodeType":"YulFunctionCall","src":"11027:12:111"},"nodeType":"YulExpressionStatement","src":"11027:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"11000:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"11009:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10996:3:111"},"nodeType":"YulFunctionCall","src":"10996:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"11021:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"10992:3:111"},"nodeType":"YulFunctionCall","src":"10992:32:111"},"nodeType":"YulIf","src":"10989:52:111"},{"nodeType":"YulAssignment","src":"11050:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11066:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11060:5:111"},"nodeType":"YulFunctionCall","src":"11060:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"11050:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"10945:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"10956:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"10968:6:111","type":""}],"src":"10898:184:111"},{"body":{"nodeType":"YulBlock","src":"11261:231:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11278:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11289:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11271:6:111"},"nodeType":"YulFunctionCall","src":"11271:21:111"},"nodeType":"YulExpressionStatement","src":"11271:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11312:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11323:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11308:3:111"},"nodeType":"YulFunctionCall","src":"11308:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11328:2:111","type":"","value":"41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11301:6:111"},"nodeType":"YulFunctionCall","src":"11301:30:111"},"nodeType":"YulExpressionStatement","src":"11301:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11351:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11362:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11347:3:111"},"nodeType":"YulFunctionCall","src":"11347:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b","kind":"string","nodeType":"YulLiteral","src":"11367:34:111","type":"","value":"DepositPaymaster: must unlockTok"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11340:6:111"},"nodeType":"YulFunctionCall","src":"11340:62:111"},"nodeType":"YulExpressionStatement","src":"11340:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11422:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11433:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11418:3:111"},"nodeType":"YulFunctionCall","src":"11418:18:111"},{"hexValue":"656e4465706f736974","kind":"string","nodeType":"YulLiteral","src":"11438:11:111","type":"","value":"enDeposit"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11411:6:111"},"nodeType":"YulFunctionCall","src":"11411:39:111"},"nodeType":"YulExpressionStatement","src":"11411:39:111"},{"nodeType":"YulAssignment","src":"11459:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11471:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11482:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11467:3:111"},"nodeType":"YulFunctionCall","src":"11467:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11459:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11238:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11252:4:111","type":""}],"src":"11087:405:111"},{"body":{"nodeType":"YulBlock","src":"11546:76:111","statements":[{"body":{"nodeType":"YulBlock","src":"11568:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"11570:16:111"},"nodeType":"YulFunctionCall","src":"11570:18:111"},"nodeType":"YulExpressionStatement","src":"11570:18:111"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11562:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11565:1:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"11559:2:111"},"nodeType":"YulFunctionCall","src":"11559:8:111"},"nodeType":"YulIf","src":"11556:34:111"},{"nodeType":"YulAssignment","src":"11599:17:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"11611:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"11614:1:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"11607:3:111"},"nodeType":"YulFunctionCall","src":"11607:9:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"11599:4:111"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"11528:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"11531:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"11537:4:111","type":""}],"src":"11497:125:111"},{"body":{"nodeType":"YulBlock","src":"11801:174:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11818:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11829:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11811:6:111"},"nodeType":"YulFunctionCall","src":"11811:21:111"},"nodeType":"YulExpressionStatement","src":"11811:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11852:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11863:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11848:3:111"},"nodeType":"YulFunctionCall","src":"11848:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"11868:2:111","type":"","value":"24"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11841:6:111"},"nodeType":"YulFunctionCall","src":"11841:30:111"},"nodeType":"YulExpressionStatement","src":"11841:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11902:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11887:3:111"},"nodeType":"YulFunctionCall","src":"11887:18:111"},{"hexValue":"6d696e20726174696f2063616e6e6f74206265207a65726f","kind":"string","nodeType":"YulLiteral","src":"11907:26:111","type":"","value":"min ratio cannot be zero"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11880:6:111"},"nodeType":"YulFunctionCall","src":"11880:54:111"},"nodeType":"YulExpressionStatement","src":"11880:54:111"},{"nodeType":"YulAssignment","src":"11943:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"11955:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"11966:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11951:3:111"},"nodeType":"YulFunctionCall","src":"11951:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11943:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"11778:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"11792:4:111","type":""}],"src":"11627:348:111"},{"body":{"nodeType":"YulBlock","src":"12154:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12171:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12182:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12164:6:111"},"nodeType":"YulFunctionCall","src":"12164:21:111"},"nodeType":"YulExpressionStatement","src":"12164:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12205:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12216:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12201:3:111"},"nodeType":"YulFunctionCall","src":"12201:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12221:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12194:6:111"},"nodeType":"YulFunctionCall","src":"12194:30:111"},"nodeType":"YulExpressionStatement","src":"12194:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12244:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12255:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12240:3:111"},"nodeType":"YulFunctionCall","src":"12240:18:111"},{"hexValue":"4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061","kind":"string","nodeType":"YulLiteral","src":"12260:34:111","type":"","value":"Ownable: new owner is the zero a"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12233:6:111"},"nodeType":"YulFunctionCall","src":"12233:62:111"},"nodeType":"YulExpressionStatement","src":"12233:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12315:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12326:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12311:3:111"},"nodeType":"YulFunctionCall","src":"12311:18:111"},{"hexValue":"646472657373","kind":"string","nodeType":"YulLiteral","src":"12331:8:111","type":"","value":"ddress"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12304:6:111"},"nodeType":"YulFunctionCall","src":"12304:36:111"},"nodeType":"YulExpressionStatement","src":"12304:36:111"},{"nodeType":"YulAssignment","src":"12349:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12372:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12357:3:111"},"nodeType":"YulFunctionCall","src":"12357:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12349:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12131:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12145:4:111","type":""}],"src":"11980:402:111"},{"body":{"nodeType":"YulBlock","src":"12561:182:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12578:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12589:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12571:6:111"},"nodeType":"YulFunctionCall","src":"12571:21:111"},"nodeType":"YulExpressionStatement","src":"12571:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12612:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12623:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12608:3:111"},"nodeType":"YulFunctionCall","src":"12608:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"12628:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12601:6:111"},"nodeType":"YulFunctionCall","src":"12601:30:111"},"nodeType":"YulExpressionStatement","src":"12601:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12651:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12662:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12647:3:111"},"nodeType":"YulFunctionCall","src":"12647:18:111"},{"hexValue":"4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572","kind":"string","nodeType":"YulLiteral","src":"12667:34:111","type":"","value":"Ownable: caller is not the owner"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12640:6:111"},"nodeType":"YulFunctionCall","src":"12640:62:111"},"nodeType":"YulExpressionStatement","src":"12640:62:111"},{"nodeType":"YulAssignment","src":"12711:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12723:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12734:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12719:3:111"},"nodeType":"YulFunctionCall","src":"12719:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12711:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12538:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12552:4:111","type":""}],"src":"12387:356:111"},{"body":{"nodeType":"YulBlock","src":"12905:241:111","statements":[{"nodeType":"YulAssignment","src":"12915:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12927:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"12938:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12923:3:111"},"nodeType":"YulFunctionCall","src":"12923:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"12915:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"12950:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"12960:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"12954:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13018:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13033:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13041:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13029:3:111"},"nodeType":"YulFunctionCall","src":"13029:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13011:6:111"},"nodeType":"YulFunctionCall","src":"13011:34:111"},"nodeType":"YulExpressionStatement","src":"13011:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13065:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13076:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13061:3:111"},"nodeType":"YulFunctionCall","src":"13061:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"13085:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"13093:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13081:3:111"},"nodeType":"YulFunctionCall","src":"13081:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13054:6:111"},"nodeType":"YulFunctionCall","src":"13054:43:111"},"nodeType":"YulExpressionStatement","src":"13054:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13117:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"13128:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13113:3:111"},"nodeType":"YulFunctionCall","src":"13113:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"13133:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13106:6:111"},"nodeType":"YulFunctionCall","src":"13106:34:111"},"nodeType":"YulExpressionStatement","src":"13106:34:111"}]},"name":"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12858:9:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"12869:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"12877:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12885:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12896:4:111","type":""}],"src":"12748:398:111"},{"body":{"nodeType":"YulBlock","src":"13215:418:111","statements":[{"nodeType":"YulVariableDeclaration","src":"13225:16:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13240:1:111","type":"","value":"1"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"13229:7:111","type":""}]},{"nodeType":"YulAssignment","src":"13250:16:111","value":{"name":"power_1","nodeType":"YulIdentifier","src":"13259:7:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13250:5:111"}]},{"nodeType":"YulAssignment","src":"13275:13:111","value":{"name":"_base","nodeType":"YulIdentifier","src":"13283:5:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"13275:4:111"}]},{"body":{"nodeType":"YulBlock","src":"13339:288:111","statements":[{"body":{"nodeType":"YulBlock","src":"13444:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"13446:16:111"},"nodeType":"YulFunctionCall","src":"13446:18:111"},"nodeType":"YulExpressionStatement","src":"13446:18:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13359:4:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13369:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base","nodeType":"YulIdentifier","src":"13437:4:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"13365:3:111"},"nodeType":"YulFunctionCall","src":"13365:77:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13356:2:111"},"nodeType":"YulFunctionCall","src":"13356:87:111"},"nodeType":"YulIf","src":"13353:113:111"},{"body":{"nodeType":"YulBlock","src":"13505:29:111","statements":[{"nodeType":"YulAssignment","src":"13507:25:111","value":{"arguments":[{"name":"power","nodeType":"YulIdentifier","src":"13520:5:111"},{"name":"base","nodeType":"YulIdentifier","src":"13527:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13516:3:111"},"nodeType":"YulFunctionCall","src":"13516:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13507:5:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13486:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"13496:7:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"13482:3:111"},"nodeType":"YulFunctionCall","src":"13482:22:111"},"nodeType":"YulIf","src":"13479:55:111"},{"nodeType":"YulAssignment","src":"13547:23:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13559:4:111"},{"name":"base","nodeType":"YulIdentifier","src":"13565:4:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"13555:3:111"},"nodeType":"YulFunctionCall","src":"13555:15:111"},"variableNames":[{"name":"base","nodeType":"YulIdentifier","src":"13547:4:111"}]},{"nodeType":"YulAssignment","src":"13583:34:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"13599:7:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"13608:8:111"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"13595:3:111"},"nodeType":"YulFunctionCall","src":"13595:22:111"},"variableNames":[{"name":"exponent","nodeType":"YulIdentifier","src":"13583:8:111"}]}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13308:8:111"},{"name":"power_1","nodeType":"YulIdentifier","src":"13318:7:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13305:2:111"},"nodeType":"YulFunctionCall","src":"13305:21:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"13327:3:111","statements":[]},"pre":{"nodeType":"YulBlock","src":"13301:3:111","statements":[]},"src":"13297:330:111"}]},"name":"checked_exp_helper","nodeType":"YulFunctionDefinition","parameters":[{"name":"_base","nodeType":"YulTypedName","src":"13179:5:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"13186:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"13199:5:111","type":""},{"name":"base","nodeType":"YulTypedName","src":"13206:4:111","type":""}],"src":"13151:482:111"},{"body":{"nodeType":"YulBlock","src":"13697:807:111","statements":[{"body":{"nodeType":"YulBlock","src":"13735:52:111","statements":[{"nodeType":"YulAssignment","src":"13749:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13758:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13749:5:111"}]},{"nodeType":"YulLeave","src":"13772:5:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13717:8:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13710:6:111"},"nodeType":"YulFunctionCall","src":"13710:16:111"},"nodeType":"YulIf","src":"13707:80:111"},{"body":{"nodeType":"YulBlock","src":"13820:52:111","statements":[{"nodeType":"YulAssignment","src":"13834:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13843:1:111","type":"","value":"0"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13834:5:111"}]},{"nodeType":"YulLeave","src":"13857:5:111"}]},"condition":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"13806:4:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"13799:6:111"},"nodeType":"YulFunctionCall","src":"13799:12:111"},"nodeType":"YulIf","src":"13796:76:111"},{"cases":[{"body":{"nodeType":"YulBlock","src":"13908:52:111","statements":[{"nodeType":"YulAssignment","src":"13922:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13931:1:111","type":"","value":"1"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"13922:5:111"}]},{"nodeType":"YulLeave","src":"13945:5:111"}]},"nodeType":"YulCase","src":"13901:59:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13906:1:111","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"13976:123:111","statements":[{"body":{"nodeType":"YulBlock","src":"14011:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14013:16:111"},"nodeType":"YulFunctionCall","src":"14013:18:111"},"nodeType":"YulExpressionStatement","src":"14013:18:111"}]},"condition":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"13996:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14006:3:111","type":"","value":"255"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"13993:2:111"},"nodeType":"YulFunctionCall","src":"13993:17:111"},"nodeType":"YulIf","src":"13990:43:111"},{"nodeType":"YulAssignment","src":"14046:25:111","value":{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"14059:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14069:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"14055:3:111"},"nodeType":"YulFunctionCall","src":"14055:16:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14046:5:111"}]},{"nodeType":"YulLeave","src":"14084:5:111"}]},"nodeType":"YulCase","src":"13969:130:111","value":{"kind":"number","nodeType":"YulLiteral","src":"13974:1:111","type":"","value":"2"}}],"expression":{"name":"base","nodeType":"YulIdentifier","src":"13888:4:111"},"nodeType":"YulSwitch","src":"13881:218:111"},{"body":{"nodeType":"YulBlock","src":"14197:70:111","statements":[{"nodeType":"YulAssignment","src":"14211:28:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14224:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"14230:8:111"}],"functionName":{"name":"exp","nodeType":"YulIdentifier","src":"14220:3:111"},"nodeType":"YulFunctionCall","src":"14220:19:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14211:5:111"}]},{"nodeType":"YulLeave","src":"14252:5:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14121:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"14127:2:111","type":"","value":"11"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14118:2:111"},"nodeType":"YulFunctionCall","src":"14118:12:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"14135:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14145:2:111","type":"","value":"78"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14132:2:111"},"nodeType":"YulFunctionCall","src":"14132:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14114:3:111"},"nodeType":"YulFunctionCall","src":"14114:35:111"},{"arguments":[{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14158:4:111"},{"kind":"number","nodeType":"YulLiteral","src":"14164:3:111","type":"","value":"307"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14155:2:111"},"nodeType":"YulFunctionCall","src":"14155:13:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"14173:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"14183:2:111","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14170:2:111"},"nodeType":"YulFunctionCall","src":"14170:16:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14151:3:111"},"nodeType":"YulFunctionCall","src":"14151:36:111"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"14111:2:111"},"nodeType":"YulFunctionCall","src":"14111:77:111"},"nodeType":"YulIf","src":"14108:159:111"},{"nodeType":"YulVariableDeclaration","src":"14276:57:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14318:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"14324:8:111"}],"functionName":{"name":"checked_exp_helper","nodeType":"YulIdentifier","src":"14299:18:111"},"nodeType":"YulFunctionCall","src":"14299:34:111"},"variables":[{"name":"power_1","nodeType":"YulTypedName","src":"14280:7:111","type":""},{"name":"base_1","nodeType":"YulTypedName","src":"14289:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"14438:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14440:16:111"},"nodeType":"YulFunctionCall","src":"14440:18:111"},"nodeType":"YulExpressionStatement","src":"14440:18:111"}]},"condition":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"14348:7:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14361:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"base_1","nodeType":"YulIdentifier","src":"14429:6:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"14357:3:111"},"nodeType":"YulFunctionCall","src":"14357:79:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14345:2:111"},"nodeType":"YulFunctionCall","src":"14345:92:111"},"nodeType":"YulIf","src":"14342:118:111"},{"nodeType":"YulAssignment","src":"14469:29:111","value":{"arguments":[{"name":"power_1","nodeType":"YulIdentifier","src":"14482:7:111"},{"name":"base_1","nodeType":"YulIdentifier","src":"14491:6:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"14478:3:111"},"nodeType":"YulFunctionCall","src":"14478:20:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14469:5:111"}]}]},"name":"checked_exp_unsigned","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"13668:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"13674:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"13687:5:111","type":""}],"src":"13638:866:111"},{"body":{"nodeType":"YulBlock","src":"14579:61:111","statements":[{"nodeType":"YulAssignment","src":"14589:45:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"14619:4:111"},{"name":"exponent","nodeType":"YulIdentifier","src":"14625:8:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"14598:20:111"},"nodeType":"YulFunctionCall","src":"14598:36:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"14589:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"14550:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"14556:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"14569:5:111","type":""}],"src":"14509:131:111"},{"body":{"nodeType":"YulBlock","src":"14697:176:111","statements":[{"body":{"nodeType":"YulBlock","src":"14816:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14818:16:111"},"nodeType":"YulFunctionCall","src":"14818:18:111"},"nodeType":"YulExpressionStatement","src":"14818:18:111"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14728:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14721:6:111"},"nodeType":"YulFunctionCall","src":"14721:9:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14714:6:111"},"nodeType":"YulFunctionCall","src":"14714:17:111"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"14736:1:111"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14743:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"name":"x","nodeType":"YulIdentifier","src":"14811:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"14739:3:111"},"nodeType":"YulFunctionCall","src":"14739:74:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"14733:2:111"},"nodeType":"YulFunctionCall","src":"14733:81:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14710:3:111"},"nodeType":"YulFunctionCall","src":"14710:105:111"},"nodeType":"YulIf","src":"14707:131:111"},{"nodeType":"YulAssignment","src":"14847:20:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"14862:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"14865:1:111"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"14858:3:111"},"nodeType":"YulFunctionCall","src":"14858:9:111"},"variableNames":[{"name":"product","nodeType":"YulIdentifier","src":"14847:7:111"}]}]},"name":"checked_mul_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"14676:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"14679:1:111","type":""}],"returnVariables":[{"name":"product","nodeType":"YulTypedName","src":"14685:7:111","type":""}],"src":"14645:228:111"},{"body":{"nodeType":"YulBlock","src":"14924:228:111","statements":[{"body":{"nodeType":"YulBlock","src":"14955:168:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"14976:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"14979:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14969:6:111"},"nodeType":"YulFunctionCall","src":"14969:88:111"},"nodeType":"YulExpressionStatement","src":"14969:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15077:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"15080:4:111","type":"","value":"0x12"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15070:6:111"},"nodeType":"YulFunctionCall","src":"15070:15:111"},"nodeType":"YulExpressionStatement","src":"15070:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15105:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15108:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15098:6:111"},"nodeType":"YulFunctionCall","src":"15098:15:111"},"nodeType":"YulExpressionStatement","src":"15098:15:111"}]},"condition":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"14944:1:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"14937:6:111"},"nodeType":"YulFunctionCall","src":"14937:9:111"},"nodeType":"YulIf","src":"14934:189:111"},{"nodeType":"YulAssignment","src":"15132:14:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"15141:1:111"},{"name":"y","nodeType":"YulIdentifier","src":"15144:1:111"}],"functionName":{"name":"div","nodeType":"YulIdentifier","src":"15137:3:111"},"nodeType":"YulFunctionCall","src":"15137:9:111"},"variableNames":[{"name":"r","nodeType":"YulIdentifier","src":"15132:1:111"}]}]},"name":"checked_div_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"14909:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"14912:1:111","type":""}],"returnVariables":[{"name":"r","nodeType":"YulTypedName","src":"14918:1:111","type":""}],"src":"14878:274:111"},{"body":{"nodeType":"YulBlock","src":"15204:148:111","statements":[{"nodeType":"YulVariableDeclaration","src":"15214:23:111","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"15229:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"15232:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15225:3:111"},"nodeType":"YulFunctionCall","src":"15225:12:111"},"variables":[{"name":"x_1","nodeType":"YulTypedName","src":"15218:3:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"15246:23:111","value":{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"15261:1:111"},{"kind":"number","nodeType":"YulLiteral","src":"15264:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15257:3:111"},"nodeType":"YulFunctionCall","src":"15257:12:111"},"variables":[{"name":"y_1","nodeType":"YulTypedName","src":"15250:3:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"15294:22:111","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"15296:16:111"},"nodeType":"YulFunctionCall","src":"15296:18:111"},"nodeType":"YulExpressionStatement","src":"15296:18:111"}]},"condition":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"15284:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"15289:3:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"15281:2:111"},"nodeType":"YulFunctionCall","src":"15281:12:111"},"nodeType":"YulIf","src":"15278:38:111"},{"nodeType":"YulAssignment","src":"15325:21:111","value":{"arguments":[{"name":"x_1","nodeType":"YulIdentifier","src":"15337:3:111"},{"name":"y_1","nodeType":"YulIdentifier","src":"15342:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15333:3:111"},"nodeType":"YulFunctionCall","src":"15333:13:111"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"15325:4:111"}]}]},"name":"checked_sub_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"15186:1:111","type":""},{"name":"y","nodeType":"YulTypedName","src":"15189:1:111","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"15195:4:111","type":""}],"src":"15157:195:111"},{"body":{"nodeType":"YulBlock","src":"15425:72:111","statements":[{"nodeType":"YulAssignment","src":"15435:56:111","value":{"arguments":[{"name":"base","nodeType":"YulIdentifier","src":"15465:4:111"},{"arguments":[{"name":"exponent","nodeType":"YulIdentifier","src":"15475:8:111"},{"kind":"number","nodeType":"YulLiteral","src":"15485:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15471:3:111"},"nodeType":"YulFunctionCall","src":"15471:19:111"}],"functionName":{"name":"checked_exp_unsigned","nodeType":"YulIdentifier","src":"15444:20:111"},"nodeType":"YulFunctionCall","src":"15444:47:111"},"variableNames":[{"name":"power","nodeType":"YulIdentifier","src":"15435:5:111"}]}]},"name":"checked_exp_t_uint256_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"base","nodeType":"YulTypedName","src":"15396:4:111","type":""},{"name":"exponent","nodeType":"YulTypedName","src":"15402:8:111","type":""}],"returnVariables":[{"name":"power","nodeType":"YulTypedName","src":"15415:5:111","type":""}],"src":"15357:140:111"},{"body":{"nodeType":"YulBlock","src":"15676:171:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15693:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15704:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15686:6:111"},"nodeType":"YulFunctionCall","src":"15686:21:111"},"nodeType":"YulExpressionStatement","src":"15686:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15727:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15738:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15723:3:111"},"nodeType":"YulFunctionCall","src":"15723:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"15743:2:111","type":"","value":"21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15716:6:111"},"nodeType":"YulFunctionCall","src":"15716:30:111"},"nodeType":"YulExpressionStatement","src":"15716:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15766:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15777:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15762:3:111"},"nodeType":"YulFunctionCall","src":"15762:18:111"},{"hexValue":"53656e646572206e6f7420456e747279506f696e74","kind":"string","nodeType":"YulLiteral","src":"15782:23:111","type":"","value":"Sender not EntryPoint"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15755:6:111"},"nodeType":"YulFunctionCall","src":"15755:51:111"},"nodeType":"YulExpressionStatement","src":"15755:51:111"},{"nodeType":"YulAssignment","src":"15815:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15827:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"15838:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15823:3:111"},"nodeType":"YulFunctionCall","src":"15823:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15815:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15653:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15667:4:111","type":""}],"src":"15502:345:111"},{"body":{"nodeType":"YulBlock","src":"16013:472:111","statements":[{"body":{"nodeType":"YulBlock","src":"16060:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16069:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16072:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16062:6:111"},"nodeType":"YulFunctionCall","src":"16062:12:111"},"nodeType":"YulExpressionStatement","src":"16062:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"16034:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"16043:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16030:3:111"},"nodeType":"YulFunctionCall","src":"16030:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"16055:3:111","type":"","value":"160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"16026:3:111"},"nodeType":"YulFunctionCall","src":"16026:33:111"},"nodeType":"YulIf","src":"16023:53:111"},{"nodeType":"YulVariableDeclaration","src":"16085:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16111:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16098:12:111"},"nodeType":"YulFunctionCall","src":"16098:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"16089:5:111","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16163:5:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"16130:32:111"},"nodeType":"YulFunctionCall","src":"16130:39:111"},"nodeType":"YulExpressionStatement","src":"16130:39:111"},{"nodeType":"YulAssignment","src":"16178:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"16188:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"16178:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"16202:47:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16234:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16245:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16230:3:111"},"nodeType":"YulFunctionCall","src":"16230:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16217:12:111"},"nodeType":"YulFunctionCall","src":"16217:32:111"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"16206:7:111","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"16291:7:111"}],"functionName":{"name":"validator_revert_address_payable","nodeType":"YulIdentifier","src":"16258:32:111"},"nodeType":"YulFunctionCall","src":"16258:41:111"},"nodeType":"YulExpressionStatement","src":"16258:41:111"},{"nodeType":"YulAssignment","src":"16308:17:111","value":{"name":"value_1","nodeType":"YulIdentifier","src":"16318:7:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"16308:6:111"}]},{"nodeType":"YulAssignment","src":"16334:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16361:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16372:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16357:3:111"},"nodeType":"YulFunctionCall","src":"16357:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16344:12:111"},"nodeType":"YulFunctionCall","src":"16344:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"16334:6:111"}]},{"nodeType":"YulAssignment","src":"16385:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16412:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16423:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16408:3:111"},"nodeType":"YulFunctionCall","src":"16408:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16395:12:111"},"nodeType":"YulFunctionCall","src":"16395:32:111"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"16385:6:111"}]},{"nodeType":"YulAssignment","src":"16436:43:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16463:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16474:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16459:3:111"},"nodeType":"YulFunctionCall","src":"16459:19:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16446:12:111"},"nodeType":"YulFunctionCall","src":"16446:33:111"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"16436:6:111"}]}]},"name":"abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15947:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15958:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15970:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"15978:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"15986:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"15994:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"16002:6:111","type":""}],"src":"15852:633:111"},{"body":{"nodeType":"YulBlock","src":"16522:152:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16539:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16542:77:111","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16532:6:111"},"nodeType":"YulFunctionCall","src":"16532:88:111"},"nodeType":"YulExpressionStatement","src":"16532:88:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16636:1:111","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"16639:4:111","type":"","value":"0x21"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16629:6:111"},"nodeType":"YulFunctionCall","src":"16629:15:111"},"nodeType":"YulExpressionStatement","src":"16629:15:111"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16660:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16663:4:111","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16653:6:111"},"nodeType":"YulFunctionCall","src":"16653:15:111"},"nodeType":"YulExpressionStatement","src":"16653:15:111"}]},"name":"panic_error_0x21","nodeType":"YulFunctionDefinition","src":"16490:184:111"},{"body":{"nodeType":"YulBlock","src":"16808:168:111","statements":[{"nodeType":"YulAssignment","src":"16818:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16830:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16841:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16826:3:111"},"nodeType":"YulFunctionCall","src":"16826:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"16818:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16860:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16875:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"16883:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"16871:3:111"},"nodeType":"YulFunctionCall","src":"16871:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16853:6:111"},"nodeType":"YulFunctionCall","src":"16853:74:111"},"nodeType":"YulExpressionStatement","src":"16853:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16947:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"16958:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16943:3:111"},"nodeType":"YulFunctionCall","src":"16943:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"16963:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16936:6:111"},"nodeType":"YulFunctionCall","src":"16936:34:111"},"nodeType":"YulExpressionStatement","src":"16936:34:111"}]},"name":"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16769:9:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"16780:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16788:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16799:4:111","type":""}],"src":"16679:297:111"},{"body":{"nodeType":"YulBlock","src":"17155:230:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17172:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17183:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17165:6:111"},"nodeType":"YulFunctionCall","src":"17165:21:111"},"nodeType":"YulExpressionStatement","src":"17165:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17206:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17217:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17202:3:111"},"nodeType":"YulFunctionCall","src":"17202:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"17222:2:111","type":"","value":"40"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17195:6:111"},"nodeType":"YulFunctionCall","src":"17195:30:111"},"nodeType":"YulExpressionStatement","src":"17195:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17245:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17256:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17241:3:111"},"nodeType":"YulFunctionCall","src":"17241:18:111"},{"hexValue":"4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f","kind":"string","nodeType":"YulLiteral","src":"17261:34:111","type":"","value":"DepositPaymaster: gas too low fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17234:6:111"},"nodeType":"YulFunctionCall","src":"17234:62:111"},"nodeType":"YulExpressionStatement","src":"17234:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17316:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17327:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17312:3:111"},"nodeType":"YulFunctionCall","src":"17312:18:111"},{"hexValue":"7220706f73744f70","kind":"string","nodeType":"YulLiteral","src":"17332:10:111","type":"","value":"r postOp"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17305:6:111"},"nodeType":"YulFunctionCall","src":"17305:38:111"},"nodeType":"YulExpressionStatement","src":"17305:38:111"},{"nodeType":"YulAssignment","src":"17352:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17364:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"17375:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17360:3:111"},"nodeType":"YulFunctionCall","src":"17360:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"17352:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"17132:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"17146:4:111","type":""}],"src":"16981:404:111"},{"body":{"nodeType":"YulBlock","src":"17484:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"17494:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"17533:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17520:12:111"},"nodeType":"YulFunctionCall","src":"17520:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"17498:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"17693:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17702:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17705:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17695:6:111"},"nodeType":"YulFunctionCall","src":"17695:12:111"},"nodeType":"YulExpressionStatement","src":"17695:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"17568:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"17596:12:111"},"nodeType":"YulFunctionCall","src":"17596:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"17612:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17592:3:111"},"nodeType":"YulFunctionCall","src":"17592:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"17623:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17588:3:111"},"nodeType":"YulFunctionCall","src":"17588:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"17564:3:111"},"nodeType":"YulFunctionCall","src":"17564:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"17557:6:111"},"nodeType":"YulFunctionCall","src":"17557:135:111"},"nodeType":"YulIf","src":"17554:155:111"},{"nodeType":"YulVariableDeclaration","src":"17718:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"17736:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"17746:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17732:3:111"},"nodeType":"YulFunctionCall","src":"17732:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"17722:6:111","type":""}]},{"nodeType":"YulAssignment","src":"17774:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"17797:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17784:12:111"},"nodeType":"YulFunctionCall","src":"17784:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"17774:6:111"}]},{"body":{"nodeType":"YulBlock","src":"17847:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17856:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17859:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17849:6:111"},"nodeType":"YulFunctionCall","src":"17849:12:111"},"nodeType":"YulExpressionStatement","src":"17849:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"17819:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17827:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"17816:2:111"},"nodeType":"YulFunctionCall","src":"17816:30:111"},"nodeType":"YulIf","src":"17813:50:111"},{"nodeType":"YulAssignment","src":"17872:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"17884:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"17892:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17880:3:111"},"nodeType":"YulFunctionCall","src":"17880:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"17872:4:111"}]},{"body":{"nodeType":"YulBlock","src":"17948:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"17957:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"17960:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"17950:6:111"},"nodeType":"YulFunctionCall","src":"17950:12:111"},"nodeType":"YulExpressionStatement","src":"17950:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"17913:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"17923:12:111"},"nodeType":"YulFunctionCall","src":"17923:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"17939:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17919:3:111"},"nodeType":"YulFunctionCall","src":"17919:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"17909:3:111"},"nodeType":"YulFunctionCall","src":"17909:38:111"},"nodeType":"YulIf","src":"17906:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"17441:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"17451:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"17467:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"17473:6:111","type":""}],"src":"17390:580:111"},{"body":{"nodeType":"YulBlock","src":"18149:243:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18166:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18177:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18159:6:111"},"nodeType":"YulFunctionCall","src":"18159:21:111"},"nodeType":"YulExpressionStatement","src":"18159:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18200:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18211:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18196:3:111"},"nodeType":"YulFunctionCall","src":"18196:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"18216:2:111","type":"","value":"53"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18189:6:111"},"nodeType":"YulFunctionCall","src":"18189:30:111"},"nodeType":"YulExpressionStatement","src":"18189:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18239:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18250:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18235:3:111"},"nodeType":"YulFunctionCall","src":"18235:18:111"},{"hexValue":"4465706f7369745061796d61737465723a207061796d6173746572416e644461","kind":"string","nodeType":"YulLiteral","src":"18255:34:111","type":"","value":"DepositPaymaster: paymasterAndDa"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18228:6:111"},"nodeType":"YulFunctionCall","src":"18228:62:111"},"nodeType":"YulExpressionStatement","src":"18228:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18310:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18321:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18306:3:111"},"nodeType":"YulFunctionCall","src":"18306:18:111"},{"hexValue":"7461206d757374207370656369667920746f6b656e","kind":"string","nodeType":"YulLiteral","src":"18326:23:111","type":"","value":"ta must specify token"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18299:6:111"},"nodeType":"YulFunctionCall","src":"18299:51:111"},"nodeType":"YulExpressionStatement","src":"18299:51:111"},{"nodeType":"YulAssignment","src":"18359:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18371:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"18382:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18367:3:111"},"nodeType":"YulFunctionCall","src":"18367:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18359:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"18126:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"18140:4:111","type":""}],"src":"17975:417:111"},{"body":{"nodeType":"YulBlock","src":"18527:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"18565:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18574:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18577:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18567:6:111"},"nodeType":"YulFunctionCall","src":"18567:12:111"},"nodeType":"YulExpressionStatement","src":"18567:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"18543:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"18555:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18540:2:111"},"nodeType":"YulFunctionCall","src":"18540:24:111"},"nodeType":"YulIf","src":"18537:44:111"},{"body":{"nodeType":"YulBlock","src":"18614:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18623:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18626:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18616:6:111"},"nodeType":"YulFunctionCall","src":"18616:12:111"},"nodeType":"YulExpressionStatement","src":"18616:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"18596:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"18606:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18593:2:111"},"nodeType":"YulFunctionCall","src":"18593:20:111"},"nodeType":"YulIf","src":"18590:40:111"},{"nodeType":"YulAssignment","src":"18639:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18656:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"18664:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18652:3:111"},"nodeType":"YulFunctionCall","src":"18652:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"18639:9:111"}]},{"nodeType":"YulAssignment","src":"18684:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"18701:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"18711:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18697:3:111"},"nodeType":"YulFunctionCall","src":"18697:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"18684:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"18461:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"18469:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"18477:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"18489:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"18502:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"18513:9:111","type":""}],"src":"18397:331:111"},{"body":{"nodeType":"YulBlock","src":"18834:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"18844:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"18867:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"18854:12:111"},"nodeType":"YulFunctionCall","src":"18854:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"18848:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"18882:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"18892:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"18886:2:111","type":""}]},{"nodeType":"YulAssignment","src":"18967:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"18980:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"18984:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18976:3:111"},"nodeType":"YulFunctionCall","src":"18976:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"18967:5:111"}]},{"body":{"nodeType":"YulBlock","src":"19019:80:111","statements":[{"nodeType":"YulAssignment","src":"19033:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"19050:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19062:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19069:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"19073:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19065:3:111"},"nodeType":"YulFunctionCall","src":"19065:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"19058:3:111"},"nodeType":"YulFunctionCall","src":"19058:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"19080:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"19054:3:111"},"nodeType":"YulFunctionCall","src":"19054:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19046:3:111"},"nodeType":"YulFunctionCall","src":"19046:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"19086:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"19042:3:111"},"nodeType":"YulFunctionCall","src":"19042:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"19033:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"19002:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"19007:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"18999:2:111"},"nodeType":"YulFunctionCall","src":"18999:11:111"},"nodeType":"YulIf","src":"18996:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"18809:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"18816:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"18824:5:111","type":""}],"src":"18733:372:111"},{"body":{"nodeType":"YulBlock","src":"19284:226:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19301:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19312:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19294:6:111"},"nodeType":"YulFunctionCall","src":"19294:21:111"},"nodeType":"YulExpressionStatement","src":"19294:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19335:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19346:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19331:3:111"},"nodeType":"YulFunctionCall","src":"19331:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19351:2:111","type":"","value":"36"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19324:6:111"},"nodeType":"YulFunctionCall","src":"19324:30:111"},"nodeType":"YulExpressionStatement","src":"19324:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19374:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19385:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19370:3:111"},"nodeType":"YulFunctionCall","src":"19370:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f","kind":"string","nodeType":"YulLiteral","src":"19390:34:111","type":"","value":"DepositPaymaster: deposit not lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19363:6:111"},"nodeType":"YulFunctionCall","src":"19363:62:111"},"nodeType":"YulExpressionStatement","src":"19363:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19445:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19456:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19441:3:111"},"nodeType":"YulFunctionCall","src":"19441:18:111"},{"hexValue":"636b6564","kind":"string","nodeType":"YulLiteral","src":"19461:6:111","type":"","value":"cked"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19434:6:111"},"nodeType":"YulFunctionCall","src":"19434:34:111"},"nodeType":"YulExpressionStatement","src":"19434:34:111"},{"nodeType":"YulAssignment","src":"19477:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19489:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19500:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19485:3:111"},"nodeType":"YulFunctionCall","src":"19485:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19477:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19261:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19275:4:111","type":""}],"src":"19110:400:111"},{"body":{"nodeType":"YulBlock","src":"19689:223:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19706:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19717:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19699:6:111"},"nodeType":"YulFunctionCall","src":"19699:21:111"},"nodeType":"YulExpressionStatement","src":"19699:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19740:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19751:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19736:3:111"},"nodeType":"YulFunctionCall","src":"19736:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"19756:2:111","type":"","value":"33"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19729:6:111"},"nodeType":"YulFunctionCall","src":"19729:30:111"},"nodeType":"YulExpressionStatement","src":"19729:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19779:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19790:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19775:3:111"},"nodeType":"YulFunctionCall","src":"19775:18:111"},{"hexValue":"4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f","kind":"string","nodeType":"YulLiteral","src":"19795:34:111","type":"","value":"DepositPaymaster: deposit too lo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19768:6:111"},"nodeType":"YulFunctionCall","src":"19768:62:111"},"nodeType":"YulExpressionStatement","src":"19768:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19850:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19861:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19846:3:111"},"nodeType":"YulFunctionCall","src":"19846:18:111"},{"hexValue":"77","kind":"string","nodeType":"YulLiteral","src":"19866:3:111","type":"","value":"w"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19839:6:111"},"nodeType":"YulFunctionCall","src":"19839:31:111"},"nodeType":"YulExpressionStatement","src":"19839:31:111"},{"nodeType":"YulAssignment","src":"19879:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19891:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"19902:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19887:3:111"},"nodeType":"YulFunctionCall","src":"19887:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"19879:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19666:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"19680:4:111","type":""}],"src":"19515:397:111"},{"body":{"nodeType":"YulBlock","src":"20145:329:111","statements":[{"nodeType":"YulAssignment","src":"20155:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20167:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20178:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20163:3:111"},"nodeType":"YulFunctionCall","src":"20163:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"20155:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"20191:52:111","value":{"kind":"number","nodeType":"YulLiteral","src":"20201:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"20195:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20259:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"20274:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"20282:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20270:3:111"},"nodeType":"YulFunctionCall","src":"20270:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20252:6:111"},"nodeType":"YulFunctionCall","src":"20252:34:111"},"nodeType":"YulExpressionStatement","src":"20252:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20306:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20317:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20302:3:111"},"nodeType":"YulFunctionCall","src":"20302:18:111"},{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"20326:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"20334:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20322:3:111"},"nodeType":"YulFunctionCall","src":"20322:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20295:6:111"},"nodeType":"YulFunctionCall","src":"20295:43:111"},"nodeType":"YulExpressionStatement","src":"20295:43:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20358:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20369:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20354:3:111"},"nodeType":"YulFunctionCall","src":"20354:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"20374:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20347:6:111"},"nodeType":"YulFunctionCall","src":"20347:34:111"},"nodeType":"YulExpressionStatement","src":"20347:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20401:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20412:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20397:3:111"},"nodeType":"YulFunctionCall","src":"20397:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"20417:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20390:6:111"},"nodeType":"YulFunctionCall","src":"20390:34:111"},"nodeType":"YulExpressionStatement","src":"20390:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20444:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20455:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20440:3:111"},"nodeType":"YulFunctionCall","src":"20440:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"20461:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20433:6:111"},"nodeType":"YulFunctionCall","src":"20433:35:111"},"nodeType":"YulExpressionStatement","src":"20433:35:111"}]},"name":"abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20082:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"20093:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"20101:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"20109:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"20117:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"20125:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20136:4:111","type":""}],"src":"19917:557:111"},{"body":{"nodeType":"YulBlock","src":"20557:199:111","statements":[{"body":{"nodeType":"YulBlock","src":"20603:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20612:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20615:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20605:6:111"},"nodeType":"YulFunctionCall","src":"20605:12:111"},"nodeType":"YulExpressionStatement","src":"20605:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"20578:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"20587:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"20574:3:111"},"nodeType":"YulFunctionCall","src":"20574:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"20599:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"20570:3:111"},"nodeType":"YulFunctionCall","src":"20570:32:111"},"nodeType":"YulIf","src":"20567:52:111"},{"nodeType":"YulVariableDeclaration","src":"20628:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20647:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20641:5:111"},"nodeType":"YulFunctionCall","src":"20641:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"20632:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"20710:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20719:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20722:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20712:6:111"},"nodeType":"YulFunctionCall","src":"20712:12:111"},"nodeType":"YulExpressionStatement","src":"20712:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20679:5:111"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20700:5:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20693:6:111"},"nodeType":"YulFunctionCall","src":"20693:13:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20686:6:111"},"nodeType":"YulFunctionCall","src":"20686:21:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"20676:2:111"},"nodeType":"YulFunctionCall","src":"20676:32:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20669:6:111"},"nodeType":"YulFunctionCall","src":"20669:40:111"},"nodeType":"YulIf","src":"20666:60:111"},{"nodeType":"YulAssignment","src":"20735:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"20745:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"20735:6:111"}]}]},"name":"abi_decode_tuple_t_bool_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20523:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"20534:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"20546:6:111","type":""}],"src":"20479:277:111"},{"body":{"nodeType":"YulBlock","src":"20935:232:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20952:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20963:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20945:6:111"},"nodeType":"YulFunctionCall","src":"20945:21:111"},"nodeType":"YulExpressionStatement","src":"20945:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20986:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"20997:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20982:3:111"},"nodeType":"YulFunctionCall","src":"20982:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21002:2:111","type":"","value":"42"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20975:6:111"},"nodeType":"YulFunctionCall","src":"20975:30:111"},"nodeType":"YulExpressionStatement","src":"20975:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21025:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21036:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21021:3:111"},"nodeType":"YulFunctionCall","src":"21021:18:111"},{"hexValue":"5361666545524332303a204552433230206f7065726174696f6e20646964206e","kind":"string","nodeType":"YulLiteral","src":"21041:34:111","type":"","value":"SafeERC20: ERC20 operation did n"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21014:6:111"},"nodeType":"YulFunctionCall","src":"21014:62:111"},"nodeType":"YulExpressionStatement","src":"21014:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21096:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21107:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21092:3:111"},"nodeType":"YulFunctionCall","src":"21092:18:111"},{"hexValue":"6f742073756363656564","kind":"string","nodeType":"YulLiteral","src":"21112:12:111","type":"","value":"ot succeed"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21085:6:111"},"nodeType":"YulFunctionCall","src":"21085:40:111"},"nodeType":"YulExpressionStatement","src":"21085:40:111"},{"nodeType":"YulAssignment","src":"21134:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21146:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21157:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21142:3:111"},"nodeType":"YulFunctionCall","src":"21142:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21134:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20912:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"20926:4:111","type":""}],"src":"20761:406:111"},{"body":{"nodeType":"YulBlock","src":"21346:228:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21363:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21374:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21356:6:111"},"nodeType":"YulFunctionCall","src":"21356:21:111"},"nodeType":"YulExpressionStatement","src":"21356:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21397:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21408:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21393:3:111"},"nodeType":"YulFunctionCall","src":"21393:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"21413:2:111","type":"","value":"38"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21386:6:111"},"nodeType":"YulFunctionCall","src":"21386:30:111"},"nodeType":"YulExpressionStatement","src":"21386:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21436:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21447:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21432:3:111"},"nodeType":"YulFunctionCall","src":"21432:18:111"},{"hexValue":"416464726573733a20696e73756666696369656e742062616c616e636520666f","kind":"string","nodeType":"YulLiteral","src":"21452:34:111","type":"","value":"Address: insufficient balance fo"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21425:6:111"},"nodeType":"YulFunctionCall","src":"21425:62:111"},"nodeType":"YulExpressionStatement","src":"21425:62:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21507:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21518:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21503:3:111"},"nodeType":"YulFunctionCall","src":"21503:18:111"},{"hexValue":"722063616c6c","kind":"string","nodeType":"YulLiteral","src":"21523:8:111","type":"","value":"r call"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21496:6:111"},"nodeType":"YulFunctionCall","src":"21496:36:111"},"nodeType":"YulExpressionStatement","src":"21496:36:111"},{"nodeType":"YulAssignment","src":"21541:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21553:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"21564:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21549:3:111"},"nodeType":"YulFunctionCall","src":"21549:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"21541:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21323:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"21337:4:111","type":""}],"src":"21172:402:111"},{"body":{"nodeType":"YulBlock","src":"21716:137:111","statements":[{"nodeType":"YulVariableDeclaration","src":"21726:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21746:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21740:5:111"},"nodeType":"YulFunctionCall","src":"21740:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"21730:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"21788:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"21796:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21784:3:111"},"nodeType":"YulFunctionCall","src":"21784:17:111"},{"name":"pos","nodeType":"YulIdentifier","src":"21803:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"21808:6:111"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"21762:21:111"},"nodeType":"YulFunctionCall","src":"21762:53:111"},"nodeType":"YulExpressionStatement","src":"21762:53:111"},{"nodeType":"YulAssignment","src":"21824:23:111","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"21835:3:111"},{"name":"length","nodeType":"YulIdentifier","src":"21840:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21831:3:111"},"nodeType":"YulFunctionCall","src":"21831:16:111"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"21824:3:111"}]}]},"name":"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"pos","nodeType":"YulTypedName","src":"21692:3:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"21697:6:111","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"21708:3:111","type":""}],"src":"21579:274:111"},{"body":{"nodeType":"YulBlock","src":"22032:179:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22049:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22060:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22042:6:111"},"nodeType":"YulFunctionCall","src":"22042:21:111"},"nodeType":"YulExpressionStatement","src":"22042:21:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22083:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22094:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22079:3:111"},"nodeType":"YulFunctionCall","src":"22079:18:111"},{"kind":"number","nodeType":"YulLiteral","src":"22099:2:111","type":"","value":"29"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22072:6:111"},"nodeType":"YulFunctionCall","src":"22072:30:111"},"nodeType":"YulExpressionStatement","src":"22072:30:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22122:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22133:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22118:3:111"},"nodeType":"YulFunctionCall","src":"22118:18:111"},{"hexValue":"416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374","kind":"string","nodeType":"YulLiteral","src":"22138:31:111","type":"","value":"Address: call to non-contract"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22111:6:111"},"nodeType":"YulFunctionCall","src":"22111:59:111"},"nodeType":"YulExpressionStatement","src":"22111:59:111"},{"nodeType":"YulAssignment","src":"22179:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22191:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22202:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22187:3:111"},"nodeType":"YulFunctionCall","src":"22187:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"22179:4:111"}]}]},"name":"abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22009:9:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22023:4:111","type":""}],"src":"21858:353:111"},{"body":{"nodeType":"YulBlock","src":"22337:98:111","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22354:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22365:2:111","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22347:6:111"},"nodeType":"YulFunctionCall","src":"22347:21:111"},"nodeType":"YulExpressionStatement","src":"22347:21:111"},{"nodeType":"YulAssignment","src":"22377:52:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"22402:6:111"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22414:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"22425:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22410:3:111"},"nodeType":"YulFunctionCall","src":"22410:18:111"}],"functionName":{"name":"abi_encode_bytes","nodeType":"YulIdentifier","src":"22385:16:111"},"nodeType":"YulFunctionCall","src":"22385:44:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"22377:4:111"}]}]},"name":"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22306:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"22317:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"22328:4:111","type":""}],"src":"22216:219:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n value0 := value\n }\n function validator_revert_address_payable(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_IERC20_$4419_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__to_t_address_t_uint8_t_uint256_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint8t_uint256t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n if iszero(eq(value_1, and(value_1, 0xff))) { revert(0, 0) }\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n value5 := calldataload(add(headStart, 160))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_enum$_PostOpMode_$10834t_bytes_calldata_ptrt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(lt(value, 3)) { revert(0, 0) }\n value0 := value\n let offset := calldataload(add(headStart, 32))\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value1 := add(_2, 32)\n value2 := length\n value3 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$10807__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n }\n function abi_decode_tuple_t_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes(value0, add(headStart, 64))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_encode_tuple_t_address_payable_t_uint256__to_t_address_payable_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_e569da2fa5f3783d38b7d46ea8805ea326964f23a43e6933928eb417d8c0af24__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"DepositPaymaster: unsupported to\")\n mstore(add(headStart, 96), \"ken\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_680afc59480c281b0d211dd103553c48e9a4b05ca3d5a015fa336cca8ccba4c8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"DepositPaymaster: Invalid price \")\n mstore(add(headStart, 96), \"ratio\")\n tail := add(headStart, 128)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_39474890e48911aa9c11486be7eec378cf187d8f5c06e36433677c6145985a1d__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 44)\n mstore(add(headStart, 64), \"DepositPaymaster: price ratio ca\")\n mstore(add(headStart, 96), \"nnot be zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_ddc96a90ff0472190820eaeb7a0e98e3c3577885a5a39a0be26cfd009640ab04__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"DepositPaymaster: min ratio cann\")\n mstore(add(headStart, 96), \"ot be zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_40e4039674c2ab4e5a896be0ba5e7b6286b4bcef87b19df56f05ef2293323bb1__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"DepositPaymaster: Invalid token\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function abi_encode_tuple_t_stringliteral_39f72ca416781d13cac1dfa31c4ffd74b13ab32dac2d833098871eacb9b639c6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 41)\n mstore(add(headStart, 64), \"DepositPaymaster: must unlockTok\")\n mstore(add(headStart, 96), \"enDeposit\")\n tail := add(headStart, 128)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_encode_tuple_t_stringliteral_58836426df8316a6085de2785951b1fbceaa67a2b857852b3cbe0dc358a817a1__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"min ratio cannot be zero\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n }\n function checked_exp_helper(_base, exponent) -> power, base\n {\n let power_1 := 1\n power := power_1\n base := _base\n for { } gt(exponent, power_1) { }\n {\n if gt(base, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base)) { panic_error_0x11() }\n if and(exponent, power_1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(power_1, exponent)\n }\n }\n function checked_exp_unsigned(base, exponent) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n leave\n }\n let power_1, base_1 := checked_exp_helper(base, exponent)\n if gt(power_1, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_exp_t_uint256_t_uint256(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, exponent)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function checked_sub_t_uint8(x, y) -> diff\n {\n let x_1 := and(x, 0xff)\n let y_1 := and(y, 0xff)\n if lt(x_1, y_1) { panic_error_0x11() }\n diff := sub(x_1, y_1)\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff))\n }\n function abi_encode_tuple_t_stringliteral_4f1183fece38266d89bbd94d1c93e02d713970166951c4c8f2c10a21e7cddae9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"Sender not EntryPoint\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_address_payablet_contract$_IERC20_$4419t_uint256t_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address_payable(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address_payable(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n value4 := calldataload(add(headStart, 128))\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_stringliteral_76d41b66bad7418bbd05cffc309786614b3ab738d27bb600ce96cb2a2e4ebccd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"DepositPaymaster: gas too low fo\")\n mstore(add(headStart, 96), \"r postOp\")\n tail := add(headStart, 128)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_stringliteral_62c15554b125accdf17be4b76a8053ccc5e06e3a5ec8f67f1fc117698d9663a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 53)\n mstore(add(headStart, 64), \"DepositPaymaster: paymasterAndDa\")\n mstore(add(headStart, 96), \"ta must specify token\")\n tail := add(headStart, 128)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n function abi_encode_tuple_t_stringliteral_8eb29d3c5347f8cc0d88d4fc40deca72135020a232f7dd523594048d7ddf01b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit not lo\")\n mstore(add(headStart, 96), \"cked\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fb4c3d014ab3213f2f61de4b888c6734ded30a222c61472057f0ad11219307bb__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"DepositPaymaster: deposit too lo\")\n mstore(add(headStart, 96), \"w\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_address_t_contract$_IERC20_$4419_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 42)\n mstore(add(headStart, 64), \"SafeERC20: ERC20 operation did n\")\n mstore(add(headStart, 96), \"ot succeed\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Address: insufficient balance fo\")\n mstore(add(headStart, 96), \"r call\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_encode_tuple_t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"Address: call to non-contract\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{"7322":[{"length":32,"start":1104},{"length":32,"start":1512},{"length":32,"start":1688},{"length":32,"start":3155},{"length":32,"start":3328},{"length":32,"start":3472},{"length":32,"start":3873},{"length":32,"start":5119}]},"linkReferences":{},"object":"6080604052600436106101965760003560e01c80639ed0fb68116100e1578063c399ec881161008a578063d0e30db011610064578063d0e30db014610536578063e29db4dc1461053e578063f2fde38b1461055e578063f465c77e1461057e57600080fd5b8063c399ec88146104df578063cc9c837c146104f4578063cd8f80c21461051457600080fd5b8063bb9fe6bf116100bb578063bb9fe6bf14610472578063c23a5cea14610487578063c23f001f146104a757600080fd5b80639ed0fb68146103fa578063a9a234091461041e578063b0d691fe1461043e57600080fd5b80634a6f84cf11610143578063763d9c791161011d578063763d9c7914610392578063796d4371146103b25780638da5cb5b146103c857600080fd5b80634a6f84cf1461032257806354fe04981461035d578063715018a61461037d57600080fd5b8063382edd9e11610174578063382edd9e146101f0578063439a70b214610210578063493b0170146102bb57600080fd5b80630396cb601461019b578063205c2878146101b057806324ee2999146101d0575b600080fd5b6101ae6101a9366004611b5a565b6105ac565b005b3480156101bc57600080fd5b506101ae6101cb366004611b9c565b610651565b3480156101dc57600080fd5b506101ae6101eb366004611b9c565b6106dc565b3480156101fc57600080fd5b506101ae61020b366004611bc8565b61084e565b34801561021c57600080fd5b5061027d61022b366004611c09565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0385169474010000000000000000000000000000000000000000900460ff16939086565b604080516001600160a01b03909716875260ff9095166020870152938501929092526060840152608083015260a082015260c0015b60405180910390f35b3480156102c757600080fd5b5061030d6102d6366004611c26565b6001600160a01b03918216600090815260026020908152604080832093909416825291825282812054600390925291909120549091565b604080519283526020830191909152016102b2565b34801561032e57600080fd5b5061034f61033d366004611c09565b60036020526000908152604090205481565b6040519081526020016102b2565b34801561036957600080fd5b5061034f610378366004611b9c565b610956565b34801561038957600080fd5b506101ae61096b565b34801561039e57600080fd5b506101ae6103ad366004611c5f565b61097f565b3480156103be57600080fd5b5061034f6188b881565b3480156103d457600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102b2565b34801561040657600080fd5b506101ae336000908152600360205260409020439055565b34801561042a57600080fd5b506101ae610439366004611cbe565b610c2f565b34801561044a57600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561047e57600080fd5b506101ae610c49565b34801561049357600080fd5b506101ae6104a2366004611c09565b610cc0565b3480156104b357600080fd5b5061034f6104c2366004611c26565b600260209081526000928352604080842090915290825290205481565b3480156104eb57600080fd5b5061034f610d5f565b34801561050057600080fd5b506101ae61050f366004611bc8565b610e08565b34801561052057600080fd5b506101ae33600090815260036020526040812055565b6101ae610ef3565b34801561054a57600080fd5b506101ae610559366004611d4d565b610f6e565b34801561056a57600080fd5b506101ae610579366004611c09565b61107f565b34801561058a57600080fd5b5061059e610599366004611d88565b61110f565b6040516102b2929190611e52565b6105b4611132565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561063557600080fd5b505af1158015610649573d6000803e3d6000fd5b505050505050565b610659611132565b6040517f205c28780000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561063557600080fd5b6106e4611132565b6001600160a01b03828116600090815260016020526040902054166107765760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03821660009081526001602052604090206003015481108015906107bc57506001600160a01b0382166000908152600160205260409020600401548111155b61082e5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b0390911660009081526001602081905260409091200155565b6108636001600160a01b03841633308461118c565b6001600160a01b03838116600090815260016020526040902054166108f05760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b03808416600090815260026020908152604080832093861683529290529081208054839290610927908490611ea3565b90915550506001600160a01b03821633036109515761095133600090815260036020526040812055565b505050565b6000610962838361125b565b90505b92915050565b610973611132565b61097d600061138c565b565b610987611132565b6001600160a01b0386811660009081526001602052604090205416156109ac57600080fd5b83600003610a225760405162461bcd60e51b815260206004820152602c60248201527f4465706f7369745061796d61737465723a20707269636520726174696f20636160448201527f6e6e6f74206265207a65726f0000000000000000000000000000000000000000606482015260840161076d565b81600003610a985760405162461bcd60e51b815260206004820152602a60248201527f4465706f7369745061796d61737465723a206d696e20726174696f2063616e6e60448201527f6f74206265207a65726f00000000000000000000000000000000000000000000606482015260840161076d565b818410158015610aa85750808411155b610b1a5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369745061796d61737465723a20496e76616c69642070726963652060448201527f726174696f000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038616610b705760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369745061796d61737465723a20496e76616c696420746f6b656e00604482015260640161076d565b6040805160c0810182526001600160a01b0397881680825260ff9788166020808401918252838501988952606084019788526080840196875260a0840195865260009283526001908190529390912091518254915199167fffffffffffffffffffffff000000000000000000000000000000000000000000909116177401000000000000000000000000000000000000000098909716979097029590951786559251938501939093555160028401559051600383015551600490910155565b610c376113f4565b610c438484848461146c565b50505050565b610c51611132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cac57600080fd5b505af1158015610c43573d6000803e3d6000fd5b610cc8611132565b6040517fc23a5cea0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b158015610d4457600080fd5b505af1158015610d58573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e039190611ebb565b905090565b3360009081526003602052604090205415801590610e3457503360009081526003602052604090205443115b610ea65760405162461bcd60e51b815260206004820152602960248201527f4465706f7369745061796d61737465723a206d75737420756e6c6f636b546f6b60448201527f656e4465706f7369740000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038316600090815260026020908152604080832033845290915281208054839290610ed9908490611ed4565b9091555061095190506001600160a01b0384168383611596565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d4457600080fd5b610f76611132565b6001600160a01b03848116600090815260016020526040902054166110035760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b816000036110535760405162461bcd60e51b815260206004820152601860248201527f6d696e20726174696f2063616e6e6f74206265207a65726f0000000000000000604482015260640161076d565b6001600160a01b0390931660009081526001602052604090206002810192909255600382015560040155565b611087611132565b6001600160a01b0381166111035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161076d565b61110c8161138c565b50565b6060600061111b6113f4565b6111268585856115df565b91509150935093915050565b6000546001600160a01b0316331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076d565b6040516001600160a01b0380851660248301528316604482015260648101829052610c439085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611899565b6001600160a01b038281166000908152600160205260408120549091166112ea5760405162461bcd60e51b815260206004820152602360248201527f4465706f7369745061796d61737465723a20756e737570706f7274656420746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b038316600090815260016020819052604082209081015460029091015461131990600a61200b565b6113239085612017565b61132d9190612054565b6001600160a01b03851660009081526001602052604090205490915061136f9074010000000000000000000000000000000000000000900460ff16601261208f565b61137a90600a6120b2565b6113849082612054565b949350505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461097d5760405162461bcd60e51b815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161076d565b60008080808061147e878901896120c1565b9450945094509450945060008183856188b861149a9190612017565b6114a4908a611ea3565b6114ae9190612017565b6114b89190612054565b905060028a60028111156114ce576114ce612112565b146114ed576114e86001600160a01b03861687308461118c565b61152a565b6001600160a01b038086166000908152600260209081526040808320938a1683529290529081208054839290611524908490611ed4565b90915550505b6001600160a01b038516600090815260026020526040812082916115566000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115859190611ea3565b909155505050505050505050505050565b6040516001600160a01b0383166024820152604481018290526109519084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016111d9565b606060006188b88560a001351161165e5760405162461bcd60e51b815260206004820152602860248201527f4465706f7369745061796d61737465723a2067617320746f6f206c6f7720666f60448201527f7220706f73744f70000000000000000000000000000000000000000000000000606482015260840161076d565b36600061166f610120880188612141565b9092509050602881146116ea5760405162461bcd60e51b815260206004820152603560248201527f4465706f7369745061796d61737465723a207061796d6173746572416e64446160448201527f7461206d757374207370656369667920746f6b656e0000000000000000000000606482015260840161076d565b60006116f982601481866121ad565b611702916121d7565b60601c905087356000611715838961125b565b905060006117228b61197e565b6001600160a01b038416600090815260036020526040902054909150156117b05760405162461bcd60e51b8152602060048201526024808201527f4465706f7369745061796d61737465723a206465706f736974206e6f74206c6f60448201527f636b656400000000000000000000000000000000000000000000000000000000606482015260840161076d565b6001600160a01b0380851660009081526002602090815260408083209387168352929052205482111561184b5760405162461bcd60e51b815260206004820152602160248201527f4465706f7369745061796d61737465723a206465706f73697420746f6f206c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015260840161076d565b604080516001600160a01b03948516602082015294909316848401526060840152608083015260a0808301979097528051808303909701875260c09091019052509295600095509350505050565b60006118ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119a59092919063ffffffff16565b805190915015610951578080602001905181019061190c919061221f565b6109515760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161076d565b600060e0820135610100830135808203611999575092915050565b611384824883016119b4565b606061138484846000856119ca565b60008183106119c35781610962565b5090919050565b606082471015611a425760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161076d565b600080866001600160a01b03168587604051611a5e9190612241565b60006040518083038185875af1925050503d8060008114611a9b576040519150601f19603f3d011682016040523d82523d6000602084013e611aa0565b606091505b5091509150611ab187838387611abc565b979650505050505050565b60608315611b2b578251600003611b24576001600160a01b0385163b611b245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076d565b5081611384565b6113848383815115611b405781518083602001fd5b8060405162461bcd60e51b815260040161076d919061225d565b600060208284031215611b6c57600080fd5b813563ffffffff81168114611b8057600080fd5b9392505050565b6001600160a01b038116811461110c57600080fd5b60008060408385031215611baf57600080fd5b8235611bba81611b87565b946020939093013593505050565b600080600060608486031215611bdd57600080fd5b8335611be881611b87565b92506020840135611bf881611b87565b929592945050506040919091013590565b600060208284031215611c1b57600080fd5b8135611b8081611b87565b60008060408385031215611c3957600080fd5b8235611c4481611b87565b91506020830135611c5481611b87565b809150509250929050565b60008060008060008060c08789031215611c7857600080fd5b8635611c8381611b87565b9550602087013560ff81168114611c9957600080fd5b95989597505050506040840135936060810135936080820135935060a0909101359150565b60008060008060608587031215611cd457600080fd5b843560038110611ce357600080fd5b9350602085013567ffffffffffffffff80821115611d0057600080fd5b818701915087601f830112611d1457600080fd5b813581811115611d2357600080fd5b886020828501011115611d3557600080fd5b95986020929092019750949560400135945092505050565b60008060008060808587031215611d6357600080fd5b8435611d6e81611b87565b966020860135965060408601359560600135945092505050565b600080600060608486031215611d9d57600080fd5b833567ffffffffffffffff811115611db457600080fd5b84016101608187031215611dc757600080fd5b95602085013595506040909401359392505050565b60005b83811015611df7578181015183820152602001611ddf565b83811115610c435750506000910152565b60008151808452611e20816020860160208601611ddc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611e656040830185611e08565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611eb657611eb6611e74565b500190565b600060208284031215611ecd57600080fd5b5051919050565b600082821015611ee657611ee6611e74565b500390565b600181815b80851115611f4457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f2a57611f2a611e74565b80851615611f3757918102915b93841c9390800290611ef0565b509250929050565b600082611f5b57506001610965565b81611f6857506000610965565b8160018114611f7e5760028114611f8857611fa4565b6001915050610965565b60ff841115611f9957611f99611e74565b50506001821b610965565b5060208310610133831016604e8410600b8410161715611fc7575081810a610965565b611fd18383611eeb565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561200357612003611e74565b029392505050565b60006109628383611f4c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561204f5761204f611e74565b500290565b60008261208a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060ff821660ff8416808210156120a9576120a9611e74565b90039392505050565b600061096260ff841683611f4c565b600080600080600060a086880312156120d957600080fd5b85356120e481611b87565b945060208601356120f481611b87565b94979496505050506040830135926060810135926080909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261217657600080fd5b83018035915067ffffffffffffffff82111561219157600080fd5b6020019150368190038213156121a657600080fd5b9250929050565b600080858511156121bd57600080fd5b838611156121ca57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156122175780818660140360031b1b83161692505b505092915050565b60006020828403121561223157600080fd5b81518015158114611b8057600080fd5b60008251612253818460208701611ddc565b9190910192915050565b6020815260006109626020830184611e0856fea2646970667358221220549636c75ecd927bc21be4d330ca5627526f4b885d61e3f4652f42fe1b12b2e364736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x196 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9ED0FB68 GT PUSH2 0xE1 JUMPI DUP1 PUSH4 0xC399EC88 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xD0E30DB0 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xE29DB4DC EQ PUSH2 0x53E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x55E JUMPI DUP1 PUSH4 0xF465C77E EQ PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC399EC88 EQ PUSH2 0x4DF JUMPI DUP1 PUSH4 0xCC9C837C EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0xCD8F80C2 EQ PUSH2 0x514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBB9FE6BF GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xBB9FE6BF EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0xC23A5CEA EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xC23F001F EQ PUSH2 0x4A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x9ED0FB68 EQ PUSH2 0x3FA JUMPI DUP1 PUSH4 0xA9A23409 EQ PUSH2 0x41E JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0x43E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF GT PUSH2 0x143 JUMPI DUP1 PUSH4 0x763D9C79 GT PUSH2 0x11D JUMPI DUP1 PUSH4 0x763D9C79 EQ PUSH2 0x392 JUMPI DUP1 PUSH4 0x796D4371 EQ PUSH2 0x3B2 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x4A6F84CF EQ PUSH2 0x322 JUMPI DUP1 PUSH4 0x54FE0498 EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x382EDD9E GT PUSH2 0x174 JUMPI DUP1 PUSH4 0x382EDD9E EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0x439A70B2 EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x493B0170 EQ PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x396CB60 EQ PUSH2 0x19B JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x24EE2999 EQ PUSH2 0x1D0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AE PUSH2 0x1A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B5A JUMP JUMPDEST PUSH2 0x5AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x651 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x6DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x20B CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC8 JUMP JUMPDEST PUSH2 0x84E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27D PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP2 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP5 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP4 SWAP1 DUP7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP8 AND DUP8 MSTORE PUSH1 0xFF SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x30D PUSH2 0x2D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 DUP3 MSTORE DUP3 DUP2 KECCAK256 SLOAD PUSH1 0x3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x33D CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x369 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x378 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B9C JUMP JUMPDEST PUSH2 0x956 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x389 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x96B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1C5F JUMP JUMPDEST PUSH2 0x97F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x88B8 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 NUMBER SWAP1 SSTORE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CBE JUMP JUMPDEST PUSH2 0xC2F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E2 PUSH32 0x0 DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0xC49 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x4A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0xCC0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0x4C2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34F PUSH2 0xD5F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x50F CALLDATASIZE PUSH1 0x4 PUSH2 0x1BC8 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x520 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1AE PUSH2 0xEF3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x559 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D4D JUMP JUMPDEST PUSH2 0xF6E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AE PUSH2 0x579 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x107F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59E PUSH2 0x599 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D88 JUMP JUMPDEST PUSH2 0x110F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2B2 SWAP3 SWAP2 SWAP1 PUSH2 0x1E52 JUMP JUMPDEST PUSH2 0x5B4 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x396CB6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0xFFFFFFFF DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x396CB60 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x649 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x659 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x205C287800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x205C2878 SWAP1 PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x635 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6E4 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x776 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP2 LT DUP1 ISZERO SWAP1 PUSH2 0x7BC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD DUP2 GT ISZERO JUMPDEST PUSH2 0x82E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH2 0x863 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND CALLER ADDRESS DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x8F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x927 SWAP1 DUP5 SWAP1 PUSH2 0x1EA3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND CALLER SUB PUSH2 0x951 JUMPI PUSH2 0x951 CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 DUP4 DUP4 PUSH2 0x125B JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x973 PUSH2 0x1132 JUMP JUMPDEST PUSH2 0x97D PUSH1 0x0 PUSH2 0x138C JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x987 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x9AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 SUB PUSH2 0xA22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20707269636520726174696F206361 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6E6E6F74206265207A65726F0000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0xA98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D696E20726174696F2063616E6E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74206265207A65726F00000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0xAA8 JUMPI POP DUP1 DUP5 GT ISZERO JUMPDEST PUSH2 0xB1A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420707269636520 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x726174696F000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xB70 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20496E76616C696420746F6B656E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP1 DUP3 MSTORE PUSH1 0xFF SWAP8 DUP9 AND PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE DUP4 DUP6 ADD SWAP9 DUP10 MSTORE PUSH1 0x60 DUP5 ADD SWAP8 DUP9 MSTORE PUSH1 0x80 DUP5 ADD SWAP7 DUP8 MSTORE PUSH1 0xA0 DUP5 ADD SWAP6 DUP7 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 SWAP1 DUP2 SWAP1 MSTORE SWAP4 SWAP1 SWAP2 KECCAK256 SWAP2 MLOAD DUP3 SLOAD SWAP2 MLOAD SWAP10 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR PUSH21 0x10000000000000000000000000000000000000000 SWAP9 SWAP1 SWAP8 AND SWAP8 SWAP1 SWAP8 MUL SWAP6 SWAP1 SWAP6 OR DUP7 SSTORE SWAP3 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 SSTORE MLOAD PUSH1 0x2 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x3 DUP4 ADD SSTORE MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH2 0xC37 PUSH2 0x13F4 JUMP JUMPDEST PUSH2 0xC43 DUP5 DUP5 DUP5 DUP5 PUSH2 0x146C JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC51 PUSH2 0x1132 JUMP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB9FE6BF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC43 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0xCC8 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xC23A5CEA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xC23A5CEA SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD58 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE03 SWAP2 SWAP1 PUSH2 0x1EBB JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0xE34 JUMPI POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD NUMBER GT JUMPDEST PUSH2 0xEA6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x29 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206D75737420756E6C6F636B546F6B PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656E4465706F7369740000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xED9 SWAP1 DUP5 SWAP1 PUSH2 0x1ED4 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x951 SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP4 DUP4 PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xB760FAF9 SWAP1 CALLVALUE SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF76 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND PUSH2 0x1003 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x1053 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D696E20726174696F2063616E6E6F74206265207A65726F0000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x3 DUP3 ADD SSTORE PUSH1 0x4 ADD SSTORE JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x1132 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1103 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH2 0x110C DUP2 PUSH2 0x138C JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x111B PUSH2 0x13F4 JUMP JUMPDEST PUSH2 0x1126 DUP6 DUP6 DUP6 PUSH2 0x15DF JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x97D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0xC43 SWAP1 DUP6 SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND PUSH2 0x12EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A20756E737570706F7274656420746F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6B656E0000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 ADD SLOAD PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD PUSH2 0x1319 SWAP1 PUSH1 0xA PUSH2 0x200B JUMP JUMPDEST PUSH2 0x1323 SWAP1 DUP6 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x132D SWAP2 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x136F SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x12 PUSH2 0x208F JUMP JUMPDEST PUSH2 0x137A SWAP1 PUSH1 0xA PUSH2 0x20B2 JUMP JUMPDEST PUSH2 0x1384 SWAP1 DUP3 PUSH2 0x2054 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x97D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206E6F7420456E747279506F696E740000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH2 0x147E DUP8 DUP10 ADD DUP10 PUSH2 0x20C1 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP2 DUP4 DUP6 PUSH2 0x88B8 PUSH2 0x149A SWAP2 SWAP1 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x14A4 SWAP1 DUP11 PUSH2 0x1EA3 JUMP JUMPDEST PUSH2 0x14AE SWAP2 SWAP1 PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x14B8 SWAP2 SWAP1 PUSH2 0x2054 JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP11 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x14CE JUMPI PUSH2 0x14CE PUSH2 0x2112 JUMP JUMPDEST EQ PUSH2 0x14ED JUMPI PUSH2 0x14E8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 ADDRESS DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH2 0x152A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP11 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x1524 SWAP1 DUP5 SWAP1 PUSH2 0x1ED4 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP3 SWAP2 PUSH2 0x1556 PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1585 SWAP2 SWAP1 PUSH2 0x1EA3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x951 SWAP1 DUP5 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x64 ADD PUSH2 0x11D9 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x88B8 DUP6 PUSH1 0xA0 ADD CALLDATALOAD GT PUSH2 0x165E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A2067617320746F6F206C6F7720666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7220706F73744F70000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 PUSH2 0x166F PUSH2 0x120 DUP9 ADD DUP9 PUSH2 0x2141 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x28 DUP2 EQ PUSH2 0x16EA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A207061796D6173746572416E644461 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7461206D757374207370656369667920746F6B656E0000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16F9 DUP3 PUSH1 0x14 DUP2 DUP7 PUSH2 0x21AD JUMP JUMPDEST PUSH2 0x1702 SWAP2 PUSH2 0x21D7 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 POP DUP8 CALLDATALOAD PUSH1 0x0 PUSH2 0x1715 DUP4 DUP10 PUSH2 0x125B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1722 DUP12 PUSH2 0x197E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x17B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F736974206E6F74206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636B656400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x184B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369745061796D61737465723A206465706F73697420746F6F206C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP5 SWAP1 SWAP4 AND DUP5 DUP5 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE DUP1 MLOAD DUP1 DUP4 SUB SWAP1 SWAP8 ADD DUP8 MSTORE PUSH1 0xC0 SWAP1 SWAP2 ADD SWAP1 MSTORE POP SWAP3 SWAP6 PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18EE DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19A5 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x951 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x190C SWAP2 SWAP1 PUSH2 0x221F JUMP JUMPDEST PUSH2 0x951 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6F74207375636365656400000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP4 ADD CALLDATALOAD DUP1 DUP3 SUB PUSH2 0x1999 JUMPI POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1384 DUP3 BASEFEE DUP4 ADD PUSH2 0x19B4 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1384 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x19C3 JUMPI DUP2 PUSH2 0x962 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x1A42 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x722063616C6C0000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x76D JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1A5E SWAP2 SWAP1 PUSH2 0x2241 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A9B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1AA0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1AB1 DUP8 DUP4 DUP4 DUP8 PUSH2 0x1ABC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1B2B JUMPI DUP3 MLOAD PUSH1 0x0 SUB PUSH2 0x1B24 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EXTCODESIZE PUSH2 0x1B24 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x76D JUMP JUMPDEST POP DUP2 PUSH2 0x1384 JUMP JUMPDEST PUSH2 0x1384 DUP4 DUP4 DUP2 MLOAD ISZERO PUSH2 0x1B40 JUMPI DUP2 MLOAD DUP1 DUP4 PUSH1 0x20 ADD REVERT JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x76D SWAP2 SWAP1 PUSH2 0x225D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1B80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x110C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1BBA DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1BDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1BE8 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1BF8 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B80 DUP2 PUSH2 0x1B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1C44 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x1C54 DUP2 PUSH2 0x1B87 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1C78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1C83 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 SWAP6 SWAP8 POP POP POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP4 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1CD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x1CE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1D14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 SWAP9 PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP8 POP SWAP5 SWAP6 PUSH1 0x40 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1D6E DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP6 PUSH1 0x60 ADD CALLDATALOAD SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1DC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DDF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC43 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x1E20 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1DDC JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1E65 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1E08 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1EB6 JUMPI PUSH2 0x1EB6 PUSH2 0x1E74 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1ECD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1EE6 JUMPI PUSH2 0x1EE6 PUSH2 0x1E74 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1F44 JUMPI DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x1F2A JUMPI PUSH2 0x1F2A PUSH2 0x1E74 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1F37 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1EF0 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F5B JUMPI POP PUSH1 0x1 PUSH2 0x965 JUMP JUMPDEST DUP2 PUSH2 0x1F68 JUMPI POP PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1F7E JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1F88 JUMPI PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x965 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1F99 JUMPI PUSH2 0x1F99 PUSH2 0x1E74 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x965 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x1FC7 JUMPI POP DUP2 DUP2 EXP PUSH2 0x965 JUMP JUMPDEST PUSH2 0x1FD1 DUP4 DUP4 PUSH2 0x1EEB JUMP JUMPDEST DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP3 GT ISZERO PUSH2 0x2003 JUMPI PUSH2 0x2003 PUSH2 0x1E74 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 DUP4 DUP4 PUSH2 0x1F4C JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x204F JUMPI PUSH2 0x204F PUSH2 0x1E74 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x208A JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND PUSH1 0xFF DUP5 AND DUP1 DUP3 LT ISZERO PUSH2 0x20A9 JUMPI PUSH2 0x20A9 PUSH2 0x1E74 JUMP JUMPDEST SWAP1 SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x962 PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x1F4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x20D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x20E4 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x20F4 DUP2 PUSH2 0x1B87 JUMP JUMPDEST SWAP5 SWAP8 SWAP5 SWAP7 POP POP POP POP PUSH1 0x40 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x80 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x21A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x21BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x21CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x2217 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2231 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1B80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2253 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x1DDC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x962 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E08 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLOAD SWAP7 CALLDATASIZE 0xC7 0x5E 0xCD SWAP3 PUSH28 0xC21BE4D330CA5627526F4B885D61E3F4652F42FE1B12B2E364736F6C PUSH4 0x4300080F STOP CALLER ","sourceMap":"111:345:105:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:52;;;;;;:::i;:::-;;:::i;:::-;;2721:149;;;;;;;;;;-1:-1:-1;2721:149:52;;;;;:::i;:::-;;:::i;6749:400:72:-;;;;;;;;;;-1:-1:-1;6749:400:72;;;;;:::i;:::-;;:::i;3348:439::-;;;;;;;;;;-1:-1:-1;3348:439:72;;;;;:::i;:::-;;:::i;1669:59::-;;;;;;;;;;-1:-1:-1;1669:59:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1669:59:72;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2224:55:111;;;2206:74;;2328:4;2316:17;;;2311:2;2296:18;;2289:45;2350:18;;;2343:34;;;;2408:2;2393:18;;2386:34;2451:3;2436:19;;2429:35;2495:3;2480:19;;2473:35;2193:3;2178:19;1669:59:72;;;;;;;;3973:206;;;;;;;;;;-1:-1:-1;3973:206:72;;;;;:::i;:::-;-1:-1:-1;;;;;4103:15:72;;;4046:14;4103:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;4152:11;:20;;;;;;;;4103:24;;3973:206;;;;;3117:25:111;;;3173:2;3158:18;;3151:34;;;;3090:18;3973:206:72;2943:248:111;1802:46:72;;;;;;;;;;-1:-1:-1;1802:46:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3602:25:111;;;3590:2;3575:18;1802:46:72;3456:177:111;276:178:105;;;;;;;;;;-1:-1:-1;276:178:105;;;;;:::i;:::-;;:::i;1831:101:24:-;;;;;;;;;;;;;:::i;2108:706:72:-;;;;;;;;;;-1:-1:-1;2108:706:72;;;;;:::i;:::-;;:::i;1618:44::-;;;;;;;;;;;;1657:5;1618:44;;1201:85:24;;;;;;;;;;-1:-1:-1;1247:7:24;1273:6;-1:-1:-1;;;;;1273:6:24;1201:85;;;-1:-1:-1;;;;;4517:55:111;;;4499:74;;4487:2;4472:18;1201:85:24;4353:226:111;4310:92:72;;;;;;;;;;;;4369:10;4357:23;;;;:11;:23;;;;;4383:12;4357:38;;4310:92;1143:186:52;;;;;;;;;;-1:-1:-1;1143:186:52;;;;;:::i;:::-;;:::i;471:39::-;;;;;;;;;;;;;;;3588:83;;;;;;;;;;;;;:::i;3890:133::-;;;;;;;;;;-1:-1:-1;3890:133:52;;;;;:::i;:::-;;:::i;1734:62:72:-;;;;;;;;;;-1:-1:-1;1734:62:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3318:111:52;;;;;;;;;;;;;:::i;4946:311:72:-;;;;;;;;;;-1:-1:-1;4946:311:72;;;;;:::i;:::-;;:::i;4619:79::-;;;;;;;;;;;;4676:10;4690:1;4664:23;;;:11;:23;;;;;:27;4619:79;2474:105:52;;;:::i;6140:471:72:-;;;;;;;;;;-1:-1:-1;6140:471:72;;;;;:::i;:::-;;:::i;2081:198:24:-;;;;;;;;;;-1:-1:-1;2081:198:24;;;;;:::i;:::-;;:::i;632:290:52:-;;;;;;;;;;-1:-1:-1;632:290:52;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3094:141::-;1094:13:24;:11;:13::i;:::-;3173:55:52::1;::::0;;;;7994:10:111;7982:23;;3173:55:52::1;::::0;::::1;7964:42:111::0;3173:10:52::1;-1:-1:-1::0;;;;;3173:19:52::1;::::0;::::1;::::0;3201:9:::1;::::0;7937:18:111;;3173:55:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;2721:149::-;1094:13:24;:11;:13::i;:::-;2817:46:52::1;::::0;;;;-1:-1:-1;;;;;8225:55:111;;;2817:46:52::1;::::0;::::1;8207:74:111::0;8297:18;;;8290:34;;;2817:10:52::1;:21;::::0;::::1;::::0;8180:18:111;;2817:46:52::1;;;;;;;;;;;;;;;;;::::0;::::1;6749:400:72::0;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;6846:21:72;;::::1;6892:1;6846:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;6838:97;;;::::0;-1:-1:-1;;;6838:97:72;;8537:2:111;6838:97:72::1;::::0;::::1;8519:21:111::0;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;6838:97:72::1;;;;;;;;;-1:-1:-1::0;;;;;6967:21:72;::::1;;::::0;;;:14:::1;:21;::::0;;;;:30:::1;;::::0;6953:44;::::1;::::0;::::1;::::0;:92:::1;;-1:-1:-1::0;;;;;;7015:21:72;::::1;;::::0;;;:14:::1;:21;::::0;;;;:30:::1;;::::0;7001:44;::::1;;6953:92;6945:142;;;::::0;-1:-1:-1;;;6945:142:72;;8941:2:111;6945:142:72::1;::::0;::::1;8923:21:111::0;8980:2;8960:18;;;8953:30;9019:34;8999:18;;;8992:62;9090:7;9070:18;;;9063:35;9115:19;;6945:142:72::1;8739:401:111::0;6945:142:72::1;-1:-1:-1::0;;;;;7097:21:72;;::::1;;::::0;;;:14:::1;:21;::::0;;;;;;;:32:::1;:45:::0;6749:400::o;3348:439::-;3493:57;-1:-1:-1;;;;;3493:22:72;;3516:10;3536:4;3543:6;3493:22;:57::i;:::-;-1:-1:-1;;;;;3568:21:72;;;3614:1;3568:21;;;:14;:21;;;;;:27;;3560:97;;;;-1:-1:-1;;;3560:97:72;;8537:2:111;3560:97:72;;;8519:21:111;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;3560:97:72;8335:399:111;3560:97:72;-1:-1:-1;;;;;3667:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:34;;3695:6;;3667:15;:34;;3695:6;;3667:34;:::i;:::-;;;;-1:-1:-1;;;;;;;3715:21:72;;:10;:21;3711:70;;3752:18;4676:10;4690:1;4664:23;;;:11;:23;;;;;:27;4619:79;3752:18;3348:439;;;:::o;276:178:105:-;362:7;388:59;430:5;437:9;388:41;:59::i;:::-;381:66;;276:178;;;;;:::o;1831:101:24:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2108:706:72:-;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;2282:21:72;;::::1;2328:1;2282:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;:49:::0;2274:58:::1;;;::::0;::::1;;2350:10;2364:1;2350:15:::0;2342:72:::1;;;::::0;-1:-1:-1;;;2342:72:72;;9669:2:111;2342:72:72::1;::::0;::::1;9651:21:111::0;9708:2;9688:18;;;9681:30;9747:34;9727:18;;;9720:62;9818:14;9798:18;;;9791:42;9850:19;;2342:72:72::1;9467:408:111::0;2342:72:72::1;2432:8;2444:1;2432:13:::0;2424:68:::1;;;::::0;-1:-1:-1;;;2424:68:72;;10082:2:111;2424:68:72::1;::::0;::::1;10064:21:111::0;10121:2;10101:18;;;10094:30;10160:34;10140:18;;;10133:62;10231:12;10211:18;;;10204:40;10261:19;;2424:68:72::1;9880:406:111::0;2424:68:72::1;2524:8;2510:10;:22;;:48;;;;;2550:8;2536:10;:22;;2510:48;2502:98;;;::::0;-1:-1:-1;;;2502:98:72;;8941:2:111;2502:98:72::1;::::0;::::1;8923:21:111::0;8980:2;8960:18;;;8953:30;9019:34;8999:18;;;8992:62;9090:7;9070:18;;;9063:35;9115:19;;2502:98:72::1;8739:401:111::0;2502:98:72::1;-1:-1:-1::0;;;;;2618:27:72;::::1;2610:71;;;::::0;-1:-1:-1;;;2610:71:72;;10493:2:111;2610:71:72::1;::::0;::::1;10475:21:111::0;10532:2;10512:18;;;10505:30;10571:33;10551:18;;;10544:61;10622:18;;2610:71:72::1;10291:355:111::0;2610:71:72::1;2715:92;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;2715:92:72;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2691:21:72;;;:14:::1;:21:::0;;;;;;;;:116;;;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;2108:706::o;1143:186:52:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;3588:83::-;1094:13:24;:11;:13::i;:::-;3640:10:52::1;-1:-1:-1::0;;;;;3640:22:52::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3890:133:::0;1094:13:24;:11;:13::i;:::-;3975:41:52::1;::::0;;;;-1:-1:-1;;;;;4517:55:111;;;3975:41:52::1;::::0;::::1;4499:74:111::0;3975:10:52::1;:24;::::0;::::1;::::0;4472:18:111;;3975:41:52::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3387:35;;;;;3416:4;3387:35;;;4499:74:111;3361:7:52;;3387:10;-1:-1:-1;;;;;3387:20:52;;;;4472:18:111;;3387:35:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;4946:311:72:-;5055:10;5043:23;;;;:11;:23;;;;;;:28;;;;:70;;-1:-1:-1;5102:10:72;5090:23;;;;:11;:23;;;;;;5075:12;:38;5043:70;5035:124;;;;-1:-1:-1;;;5035:124:72;;11289:2:111;5035:124:72;;;11271:21:111;11328:2;11308:18;;;11301:30;11367:34;11347:18;;;11340:62;11438:11;11418:18;;;11411:39;11467:19;;5035:124:72;11087:405:111;5035:124:72;-1:-1:-1;;;;;5169:15:72;;;;;;:8;:15;;;;;;;;5185:10;5169:27;;;;;;;:37;;5200:6;;5169:15;:37;;5200:6;;5169:37;:::i;:::-;;;;-1:-1:-1;5216:34:72;;-1:-1:-1;;;;;;5216:18:72;;5235:6;5243;5216:18;:34::i;2474:105:52:-;2518:54;;;;;2566:4;2518:54;;;4499:74:111;2518:10:52;-1:-1:-1;;;;;2518:20:52;;;;2547:9;;4472:18:111;;2518:54:52;;;;;;;;;;;;;;;;;;;6140:471:72;1094:13:24;:11;:13::i;:::-;-1:-1:-1;;;;;6282:21:72;;::::1;6328:1;6282:21:::0;;;:14:::1;:21;::::0;;;;:27;::::1;6274:97;;;::::0;-1:-1:-1;;;6274:97:72;;8537:2:111;6274:97:72::1;::::0;::::1;8519:21:111::0;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;6274:97:72::1;8335:399:111::0;6274:97:72::1;6389:8;6401:1;6389:13:::0;6381:50:::1;;;::::0;-1:-1:-1;;;6381:50:72;;11829:2:111;6381:50:72::1;::::0;::::1;11811:21:111::0;11868:2;11848:18;;;11841:30;11907:26;11887:18;;;11880:54;11951:18;;6381:50:72::1;11627:348:111::0;6381:50:72::1;-1:-1:-1::0;;;;;6441:21:72;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:40:::1;::::0;::::1;:61:::0;;;;6512:30:::1;::::0;::::1;:41:::0;6563:30:::1;;:41:::0;6140:471::o;2081:198:24:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:24;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:24;;12182:2:111;2161:73:24::1;::::0;::::1;12164:21:111::0;12221:2;12201:18;;;12194:30;12260:34;12240:18;;;12233:62;12331:8;12311:18;;;12304:36;12357:19;;2161:73:24::1;11980:402:111::0;2161:73:24::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:52:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1359:130:24:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:24;719:10:43;1422:23:24;1414:68;;;;-1:-1:-1;;;1414:68:24;;12589:2:111;1414:68:24;;;12571:21:111;;;12608:18;;;12601:30;12667:34;12647:18;;;12640:62;12719:18;;1414:68:24;12387:356:111;974:241:39;1139:68;;-1:-1:-1;;;;;13029:15:111;;;1139:68:39;;;13011:34:111;13081:15;;13061:18;;;13054:43;13113:18;;;13106:34;;;1112:96:39;;1132:5;;1162:27;;12923:18:111;;1139:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;5519:548:72:-;-1:-1:-1;;;;;5653:21:72;;;5611:22;5653:21;;;:14;:21;;;;;:27;5611:22;;5653:27;5645:97;;;;-1:-1:-1;;;5645:97:72;;8537:2:111;5645:97:72;;;8519:21:111;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;8686:5;8666:18;;;8659:33;8709:19;;5645:97:72;8335:399:111;5645:97:72;-1:-1:-1;;;;;5840:21:72;;5752:22;5840:21;;;:14;:21;;;;;;;:32;;;;5795:40;;;;;5791:44;;:2;:44;:::i;:::-;5778:58;;:9;:58;:::i;:::-;5777:95;;;;:::i;:::-;-1:-1:-1;;;;;6022:21:72;;;;;;:14;:21;;;;;:35;5752:120;;-1:-1:-1;6017:40:72;;6022:35;;;;;6017:2;:40;:::i;:::-;6012:46;;:2;:46;:::i;:::-;5994:65;;:14;:65;:::i;:::-;5986:74;5519:548;-1:-1:-1;;;;5519:548:72:o;2433:187:24:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:24;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;4087:135:52:-;4156:10;-1:-1:-1;;;;;4178:10:52;4156:33;;4148:67;;;;-1:-1:-1;;;4148:67:52;;15704:2:111;4148:67:52;;;15686:21:111;15743:2;15723:18;;;15716:30;15782:23;15762:18;;;15755:51;15823:18;;4148:67:52;15502:345:111;8960:819:72;9071:15;;;;;9167:65;;;;9178:7;9167:65;:::i;:::-;9070:162;;;;;;;;;;9301:23;9392:7;9377:12;9359:14;1657:5;9344:29;;;;:::i;:::-;9328:45;;:13;:45;:::i;:::-;9327:62;;;;:::i;:::-;:72;;;;:::i;:::-;9301:98;-1:-1:-1;9421:25:72;9413:4;:33;;;;;;;;:::i;:::-;;9409:311;;9505:63;-1:-1:-1;;;;;9505:22:72;;9528:7;9545:4;9552:15;9505:22;:63::i;:::-;9409:311;;;-1:-1:-1;;;;;9666:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;:43;;9694:15;;9666;:43;;9694:15;;9666:43;:::i;:::-;;;;-1:-1:-1;;9409:311:72;-1:-1:-1;;;;;9729:15:72;;;;;;:8;:15;;;;;9757;;9745:7;1247::24;1273:6;-1:-1:-1;;;;;1273:6:24;;1201:85;9745:7:72;-1:-1:-1;;;;;9729:24:72;-1:-1:-1;;;;;9729:24:72;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;;8960:819:72:o;763:205:39:-;902:58;;-1:-1:-1;;;;;8225:55:111;;902:58:39;;;8207:74:111;8297:18;;;8290:34;;;875:86:39;;895:5;;925:23;;8180:18:111;;902:58:39;8017:313:111;7448:1101:72;7586:20;7608:22;1657:5;7776:6;:27;;;:42;7768:95;;;;-1:-1:-1;;;7768:95:72;;17183:2:111;7768:95:72;;;17165:21:111;17222:2;17202:18;;;17195:30;17261:34;17241:18;;;17234:62;17332:10;17312:18;;;17305:38;17360:19;;7768:95:72;16981:404:111;7768:95:72;7874:31;;7908:23;;;;:6;:23;:::i;:::-;7874:57;;-1:-1:-1;7874:57:72;-1:-1:-1;7976:5:72;7949:32;;7941:98;;;;-1:-1:-1;;;7941:98:72;;18177:2:111;7941:98:72;;;18159:21:111;18216:2;18196:18;;;18189:30;18255:34;18235:18;;;18228:62;18326:23;18306:18;;;18299:51;18367:19;;7941:98:72;17975:417:111;7941:98:72;8049:12;8087:21;:16;8104:2;8087:16;;:21;:::i;:::-;8079:30;;;:::i;:::-;8071:39;;;-1:-1:-1;1889:20:64;;8121:15:72;8190:34;8071:39;8216:7;8190:18;:34::i;:::-;8167:57;;8234:22;8259:17;:6;:15;:17::i;:::-;-1:-1:-1;;;;;8294:20:72;;;;;;:11;:20;;;;;;8234:42;;-1:-1:-1;8294:25:72;8286:74;;;;-1:-1:-1;;;8286:74:72;;19312:2:111;8286:74:72;;;19294:21:111;19351:2;19331:18;;;19324:30;19390:34;19370:18;;;19363:62;19461:6;19441:18;;;19434:34;19485:19;;8286:74:72;19110:400:111;8286:74:72;-1:-1:-1;;;;;8378:15:72;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;:40;-1:-1:-1;8378:40:72;8370:86;;;;-1:-1:-1;;;8370:86:72;;19717:2:111;8370:86:72;;;19699:21:111;19756:2;19736:18;;;19729:30;19795:34;19775:18;;;19768:62;19866:3;19846:18;;;19839:31;19887:19;;8370:86:72;19515:397:111;8370:86:72;8474:65;;;-1:-1:-1;;;;;20270:15:111;;;8474:65:72;;;20252:34:111;20322:15;;;;20302:18;;;20295:43;20354:18;;;20347:34;20397:18;;;20390:34;20440:19;;;;20433:35;;;;8474:65:72;;;;;;;;;;20163:19:111;;;;8474:65:72;;-1:-1:-1;8474:65:72;;-1:-1:-1;;;8474:65:72;-1:-1:-1;;;;7448:1101:72:o;3747:706:39:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:39;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:39;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:39;;20963:2:111;4351:85:39;;;20945:21:111;21002:2;20982:18;;;20975:30;21041:34;21021:18;;;21014:62;21112:12;21092:18;;;21085:40;21142:19;;4351:85:39;20761:406:111;2095:472:64;2167:7;2225:19;;;;2285:27;;;;2326:36;;;2322:161;;-1:-1:-1;2460:12:64;2095:472;-1:-1:-1;;2095:472:64:o;2322:161::-;2499:55;2503:12;2540:13;2517:20;:36;2499:3;:55::i;3873:223:42:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;3651:104:64:-;3709:7;3739:1;3735;:5;:13;;3747:1;3735:13;;;-1:-1:-1;3743:1:64;;3651:104;-1:-1:-1;3651:104:64:o;4960:446:42:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:42;;21374:2:111;5149:81:42;;;21356:21:111;21413:2;21393:18;;;21386:30;21452:34;21432:18;;;21425:62;21523:8;21503:18;;;21496:36;21549:19;;5149:81:42;21172:402:111;5149:81:42;5241:12;5255:23;5282:6;-1:-1:-1;;;;;5282:11:42;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:42:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:42;;;7908:60;;;;-1:-1:-1;;;7908:60:42;;22060:2:111;7908:60:42;;;22042:21:111;22099:2;22079:18;;;22072:30;22138:31;22118:18;;;22111:59;22187:18;;7908:60:42;21858:353:111;7908:60:42;-1:-1:-1;8003:10:42;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:42;;;;;;;;:::i;14:276:111:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:111:o;295:162::-;-1:-1:-1;;;;;382:5:111;378:54;371:5;368:65;358:93;;447:1;444;437:12;462:331;538:6;546;599:2;587:9;578:7;574:23;570:32;567:52;;;615:1;612;605:12;567:52;654:9;641:23;673:39;706:5;673:39;:::i;:::-;731:5;783:2;768:18;;;;755:32;;-1:-1:-1;;;462:331:111:o;1141:487::-;1233:6;1241;1249;1302:2;1290:9;1281:7;1277:23;1273:32;1270:52;;;1318:1;1315;1308:12;1270:52;1357:9;1344:23;1376:39;1409:5;1376:39;:::i;:::-;1434:5;-1:-1:-1;1491:2:111;1476:18;;1463:32;1504:41;1463:32;1504:41;:::i;:::-;1141:487;;1564:7;;-1:-1:-1;;;1618:2:111;1603:18;;;;1590:32;;1141:487::o;1633:270::-;1707:6;1760:2;1748:9;1739:7;1735:23;1731:32;1728:52;;;1776:1;1773;1766:12;1728:52;1815:9;1802:23;1834:39;1867:5;1834:39;:::i;2519:419::-;2602:6;2610;2663:2;2651:9;2642:7;2638:23;2634:32;2631:52;;;2679:1;2676;2669:12;2631:52;2718:9;2705:23;2737:39;2770:5;2737:39;:::i;:::-;2795:5;-1:-1:-1;2852:2:111;2837:18;;2824:32;2865:41;2824:32;2865:41;:::i;:::-;2925:7;2915:17;;;2519:419;;;;;:::o;3638:710::-;3755:6;3763;3771;3779;3787;3795;3848:3;3836:9;3827:7;3823:23;3819:33;3816:53;;;3865:1;3862;3855:12;3816:53;3904:9;3891:23;3923:39;3956:5;3923:39;:::i;:::-;3981:5;-1:-1:-1;4038:2:111;4023:18;;4010:32;4086:4;4073:18;;4061:31;;4051:59;;4106:1;4103;4096:12;4051:59;3638:710;;4129:7;;-1:-1:-1;;;;4183:2:111;4168:18;;4155:32;;4234:2;4219:18;;4206:32;;4285:3;4270:19;;4257:33;;-1:-1:-1;4337:3:111;4322:19;;;4309:33;;-1:-1:-1;3638:710:111:o;4584:819::-;4688:6;4696;4704;4712;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;4820:9;4807:23;4859:1;4852:5;4849:12;4839:40;;4875:1;4872;4865:12;4839:40;4898:5;-1:-1:-1;4954:2:111;4939:18;;4926:32;4977:18;5007:14;;;5004:34;;;5034:1;5031;5024:12;5004:34;5072:6;5061:9;5057:22;5047:32;;5117:7;5110:4;5106:2;5102:13;5098:27;5088:55;;5139:1;5136;5129:12;5088:55;5179:2;5166:16;5205:2;5197:6;5194:14;5191:34;;;5221:1;5218;5211:12;5191:34;5266:7;5261:2;5252:6;5248:2;5244:15;5240:24;5237:37;5234:57;;;5287:1;5284;5277:12;5234:57;4584:819;;5318:2;5310:11;;;;;-1:-1:-1;5340:6:111;;5393:2;5378:18;5365:32;;-1:-1:-1;4584:819:111;-1:-1:-1;;;4584:819:111:o;5928:475::-;6029:6;6037;6045;6053;6106:3;6094:9;6085:7;6081:23;6077:33;6074:53;;;6123:1;6120;6113:12;6074:53;6162:9;6149:23;6181:39;6214:5;6181:39;:::i;:::-;6239:5;6291:2;6276:18;;6263:32;;-1:-1:-1;6342:2:111;6327:18;;6314:32;;6393:2;6378:18;6365:32;;-1:-1:-1;5928:475:111;-1:-1:-1;;;5928:475:111:o;6408:530::-;6519:6;6527;6535;6588:2;6576:9;6567:7;6563:23;6559:32;6556:52;;;6604:1;6601;6594:12;6556:52;6644:9;6631:23;6677:18;6669:6;6666:30;6663:50;;;6709:1;6706;6699:12;6663:50;6732:22;;6788:3;6770:16;;;6766:26;6763:46;;;6805:1;6802;6795:12;6763:46;6828:2;6877;6862:18;;6849:32;;-1:-1:-1;6928:2:111;6913:18;;;6900:32;;6408:530;-1:-1:-1;;;6408:530:111:o;6943:258::-;7015:1;7025:113;7039:6;7036:1;7033:13;7025:113;;;7115:11;;;7109:18;7096:11;;;7089:39;7061:2;7054:10;7025:113;;;7156:6;7153:1;7150:13;7147:48;;;-1:-1:-1;;7191:1:111;7173:16;;7166:27;6943:258::o;7206:316::-;7247:3;7285:5;7279:12;7312:6;7307:3;7300:19;7328:63;7384:6;7377:4;7372:3;7368:14;7361:4;7354:5;7350:16;7328:63;:::i;:::-;7436:2;7424:15;7441:66;7420:88;7411:98;;;;7511:4;7407:109;;7206:316;-1:-1:-1;;7206:316:111:o;7527:288::-;7702:2;7691:9;7684:21;7665:4;7722:44;7762:2;7751:9;7747:18;7739:6;7722:44;:::i;:::-;7714:52;;7802:6;7797:2;7786:9;7782:18;7775:34;7527:288;;;;;:::o;9145:184::-;9197:77;9194:1;9187:88;9294:4;9291:1;9284:15;9318:4;9315:1;9308:15;9334:128;9374:3;9405:1;9401:6;9398:1;9395:13;9392:39;;;9411:18;;:::i;:::-;-1:-1:-1;9447:9:111;;9334:128::o;10898:184::-;10968:6;11021:2;11009:9;11000:7;10996:23;10992:32;10989:52;;;11037:1;11034;11027:12;10989:52;-1:-1:-1;11060:16:111;;10898:184;-1:-1:-1;10898:184:111:o;11497:125::-;11537:4;11565:1;11562;11559:8;11556:34;;;11570:18;;:::i;:::-;-1:-1:-1;11607:9:111;;11497:125::o;13151:482::-;13240:1;13283:5;13240:1;13297:330;13318:7;13308:8;13305:21;13297:330;;;13437:4;13369:66;13365:77;13359:4;13356:87;13353:113;;;13446:18;;:::i;:::-;13496:7;13486:8;13482:22;13479:55;;;13516:16;;;;13479:55;13595:22;;;;13555:15;;;;13297:330;;;13301:3;13151:482;;;;;:::o;13638:866::-;13687:5;13717:8;13707:80;;-1:-1:-1;13758:1:111;13772:5;;13707:80;13806:4;13796:76;;-1:-1:-1;13843:1:111;13857:5;;13796:76;13888:4;13906:1;13901:59;;;;13974:1;13969:130;;;;13881:218;;13901:59;13931:1;13922:10;;13945:5;;;13969:130;14006:3;13996:8;13993:17;13990:43;;;14013:18;;:::i;:::-;-1:-1:-1;;14069:1:111;14055:16;;14084:5;;13881:218;;14183:2;14173:8;14170:16;14164:3;14158:4;14155:13;14151:36;14145:2;14135:8;14132:16;14127:2;14121:4;14118:12;14114:35;14111:77;14108:159;;;-1:-1:-1;14220:19:111;;;14252:5;;14108:159;14299:34;14324:8;14318:4;14299:34;:::i;:::-;14429:6;14361:66;14357:79;14348:7;14345:92;14342:118;;;14440:18;;:::i;:::-;14478:20;;13638:866;-1:-1:-1;;;13638:866:111:o;14509:131::-;14569:5;14598:36;14625:8;14619:4;14598:36;:::i;14645:228::-;14685:7;14811:1;14743:66;14739:74;14736:1;14733:81;14728:1;14721:9;14714:17;14710:105;14707:131;;;14818:18;;:::i;:::-;-1:-1:-1;14858:9:111;;14645:228::o;14878:274::-;14918:1;14944;14934:189;;14979:77;14976:1;14969:88;15080:4;15077:1;15070:15;15108:4;15105:1;15098:15;14934:189;-1:-1:-1;15137:9:111;;14878:274::o;15157:195::-;15195:4;15232;15229:1;15225:12;15264:4;15261:1;15257:12;15289:3;15284;15281:12;15278:38;;;15296:18;;:::i;:::-;15333:13;;;15157:195;-1:-1:-1;;;15157:195:111:o;15357:140::-;15415:5;15444:47;15485:4;15475:8;15471:19;15465:4;15444:47;:::i;15852:633::-;15970:6;15978;15986;15994;16002;16055:3;16043:9;16034:7;16030:23;16026:33;16023:53;;;16072:1;16069;16062:12;16023:53;16111:9;16098:23;16130:39;16163:5;16130:39;:::i;:::-;16188:5;-1:-1:-1;16245:2:111;16230:18;;16217:32;16258:41;16217:32;16258:41;:::i;:::-;15852:633;;16318:7;;-1:-1:-1;;;;16372:2:111;16357:18;;16344:32;;16423:2;16408:18;;16395:32;;16474:3;16459:19;;;16446:33;;-1:-1:-1;15852:633:111:o;16490:184::-;16542:77;16539:1;16532:88;16639:4;16636:1;16629:15;16663:4;16660:1;16653:15;17390:580;17467:4;17473:6;17533:11;17520:25;17623:66;17612:8;17596:14;17592:29;17588:102;17568:18;17564:127;17554:155;;17705:1;17702;17695:12;17554:155;17732:33;;17784:20;;;-1:-1:-1;17827:18:111;17816:30;;17813:50;;;17859:1;17856;17849:12;17813:50;17892:4;17880:17;;-1:-1:-1;17923:14:111;17919:27;;;17909:38;;17906:58;;;17960:1;17957;17950:12;17906:58;17390:580;;;;;:::o;18397:331::-;18502:9;18513;18555:8;18543:10;18540:24;18537:44;;;18577:1;18574;18567:12;18537:44;18606:6;18596:8;18593:20;18590:40;;;18626:1;18623;18616:12;18590:40;-1:-1:-1;;18652:23:111;;;18697:25;;;;;-1:-1:-1;18397:331:111:o;18733:372::-;18892:66;18854:19;;18976:11;;;;19007:2;18999:11;;18996:103;;;19086:2;19080;19073:3;19069:2;19065:12;19062:1;19058:20;19054:29;19050:2;19046:38;19042:47;19033:56;;18996:103;;;18733:372;;;;:::o;20479:277::-;20546:6;20599:2;20587:9;20578:7;20574:23;20570:32;20567:52;;;20615:1;20612;20605:12;20567:52;20647:9;20641:16;20700:5;20693:13;20686:21;20679:5;20676:32;20666:60;;20722:1;20719;20712:12;21579:274;21708:3;21746:6;21740:13;21762:53;21808:6;21803:3;21796:4;21788:6;21784:17;21762:53;:::i;:::-;21831:16;;;;;21579:274;-1:-1:-1;;21579:274:111:o;22216:219::-;22365:2;22354:9;22347:21;22328:4;22385:44;22425:2;22414:9;22410:18;22402:6;22385:44;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"1774000","executionCost":"infinite","totalCost":"infinite"},"external":{"COST_OF_POST()":"262","addDepositFor(address,address,uint256)":"infinite","addStake(uint32)":"infinite","addToken(address,uint8,uint256,uint256,uint256,uint256)":"118002","balances(address,address)":"infinite","deposit()":"infinite","depositInfo(address,address)":"infinite","entryPoint()":"infinite","getDeposit()":"infinite","getTokenValueOfEthTest(address,uint256)":"infinite","lockTokenDeposit()":"5292","owner()":"2409","postOp(uint8,bytes,uint256)":"infinite","priceRatioInfo(address)":"11188","renounceOwnership()":"infinite","transferOwnership(address)":"infinite","unlockBlock(address)":"2559","unlockStake()":"infinite","unlockTokenDeposit()":"22354","updatePriceRatio(address,uint256)":"31433","updateTokenParams(address,uint256,uint256,uint256)":"71240","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite","withdrawStake(address)":"infinite","withdrawTo(address,uint256)":"infinite","withdrawTokensTo(address,address,uint256)":"infinite"}},"methodIdentifiers":{"COST_OF_POST()":"796d4371","addDepositFor(address,address,uint256)":"382edd9e","addStake(uint32)":"0396cb60","addToken(address,uint8,uint256,uint256,uint256,uint256)":"763d9c79","balances(address,address)":"c23f001f","deposit()":"d0e30db0","depositInfo(address,address)":"493b0170","entryPoint()":"b0d691fe","getDeposit()":"c399ec88","getTokenValueOfEthTest(address,uint256)":"54fe0498","lockTokenDeposit()":"cd8f80c2","owner()":"8da5cb5b","postOp(uint8,bytes,uint256)":"a9a23409","priceRatioInfo(address)":"439a70b2","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","unlockBlock(address)":"4a6f84cf","unlockStake()":"bb9fe6bf","unlockTokenDeposit()":"9ed0fb68","updatePriceRatio(address,uint256)":"24ee2999","updateTokenParams(address,uint256,uint256,uint256)":"e29db4dc","validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"f465c77e","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878","withdrawTokensTo(address,address,uint256)":"cc9c837c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COST_OF_POST\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addDepositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"name\":\"addToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"ethBought\",\"type\":\"uint256\"}],\"name\":\"getTokenValueOfEthTest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IPaymaster.PostOpMode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"priceRatioInfo\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unlockBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTokenDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"}],\"name\":\"updatePriceRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceRatioDecimals\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxRatio\",\"type\":\"uint256\"}],\"name\":\"updateTokenParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokensTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"params\":{\"account\":\"the account to deposit for.\",\"amount\":\"the amount of token to deposit.\",\"token\":\"the token to deposit.\"}},\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"- the unstake delay for this paymaster. Can only be increased.\"}},\"depositInfo(address,address)\":{\"returns\":{\"_unlockBlock\":\"- the block height at which the deposit can be withdrawn.\",\"amount\":\"- the amount of given token deposited to the Paymaster.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postOp(uint8,bytes,uint256)\":{\"params\":{\"actualGasCost\":\"- actual gas used so far (without this postOp call).\",\"context\":\"- the context value returned by validatePaymasterUserOp\",\"mode\":\"enum with the following options: opSucceeded - user operation succeeded. opReverted - user op reverted. still has to pay for gas. postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. Now this is the 2nd call, after user's op was deliberately reverted.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"params\":{\"maxCost\":\"the maximum cost of this transaction (based on maximum gas and gas price from userOp)\",\"userOp\":\"the user operation\",\"userOpHash\":\"hash of the user's request data.\"},\"returns\":{\"context\":\"value to send to a postOp zero length to signify postOp is not required.\",\"validationData\":\"signature and time-range of this operation, encoded the same as the return value of validateUserOperation <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure, otherwise, an address of an \\\"authorizer\\\" contract. <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\" <6-byte> validAfter - first timestamp this operation is valid Note that the validation code cannot use block.timestamp (or block.number) directly.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"to withdraw\",\"withdrawAddress\":\"target to send to\"}},\"withdrawTokensTo(address,address,uint256)\":{\"params\":{\"amount\":\"amount to withdraw\",\"target\":\"address to send to\",\"token\":\"the token deposit to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDepositFor(address,address,uint256)\":{\"notice\":\"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later use them - either as gas, or using withdrawTo()\"},\"addStake(uint32)\":{\"notice\":\"add stake for this paymaster. This method can also carry eth value to add to the current stake.\"},\"addToken(address,uint8,uint256,uint256,uint256,uint256)\":{\"notice\":\"owner of the paymaster should add supported tokens\"},\"deposit()\":{\"notice\":\"add a deposit for this paymaster, used for paying for transaction fees\"},\"getDeposit()\":{\"notice\":\"return current paymaster's deposit on the entryPoint.\"},\"lockTokenDeposit()\":{\"notice\":\"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\"},\"postOp(uint8,bytes,uint256)\":{\"notice\":\"post-operation handler. Must verify sender is the entryPoint\"},\"unlockStake()\":{\"notice\":\"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again\"},\"unlockTokenDeposit()\":{\"notice\":\"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()\"},\"updatePriceRatio(address,uint256)\":{\"notice\":\"allows the owner to update the price Ratio of a token can be called as per precision desired by owner\"},\"updateTokenParams(address,uint256,uint256,uint256)\":{\"notice\":\"allows the owner to update the token params\"},\"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)\":{\"notice\":\"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw value from the deposit\"},\"withdrawTokensTo(address,address,uint256)\":{\"notice\":\"withdraw tokens. can only be called after unlock() is called in a previous block.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestTokenValueManualDepositPaymaster.sol\":\"TestTokenValueManualDepositPaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/core/BasePaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"../interfaces/IPaymaster.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Helper class for creating a paymaster.\\n * provides helper methods for staking.\\n * validates that the postOp is called only by the entryPoint\\n */\\nabstract contract BasePaymaster is IPaymaster, Ownable {\\n\\n IEntryPoint immutable public entryPoint;\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external override returns (bytes memory context, uint256 validationData) {\\n _requireFromEntryPoint();\\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\\n }\\n\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal virtual returns (bytes memory context, uint256 validationData);\\n\\n /// @inheritdoc IPaymaster\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\\n _requireFromEntryPoint();\\n _postOp(mode, context, actualGasCost);\\n }\\n\\n /**\\n * post-operation handler.\\n * (verified to be called only through the entryPoint)\\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\\n\\n (mode,context,actualGasCost); // unused params\\n // subclass must override this method if validatePaymasterUserOp returns a context\\n revert(\\\"must override\\\");\\n }\\n\\n /**\\n * add a deposit for this paymaster, used for paying for transaction fees\\n */\\n function deposit() public payable {\\n entryPoint.depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint.withdrawTo(withdrawAddress, amount);\\n }\\n /**\\n * add stake for this paymaster.\\n * This method can also carry eth value to add to the current stake.\\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\\n */\\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\\n }\\n\\n /**\\n * return current paymaster's deposit on the entryPoint.\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint.balanceOf(address(this));\\n }\\n\\n /**\\n * unlock the stake, in order to withdraw it.\\n * The paymaster can't serve requests once unlocked, until it calls addStake again\\n */\\n function unlockStake() external onlyOwner {\\n entryPoint.unlockStake();\\n }\\n\\n /**\\n * withdraw the entire paymaster's stake.\\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n\\n /// validate the call is made from a valid entrypoint\\n function _requireFromEntryPoint() internal virtual {\\n require(msg.sender == address(entryPoint), \\\"Sender not EntryPoint\\\");\\n }\\n}\\n\",\"keccak256\":\"0x27f658d545b5f26c2e09a7ac4fba72f9975433839d10225a520e557540b84443\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\\n */\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\n }\\n\\n /**\\n * payment validation: check if paymaster agrees to pay.\\n * Must verify sender is the entryPoint.\\n * Revert to reject this request.\\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\\n * @param userOp the user operation\\n * @param userOpHash hash of the user's request data.\\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n * @return context value to send to a postOp\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n external returns (bytes memory context, uint256 validationData);\\n\\n /**\\n * post-operation handler.\\n * Must verify sender is the entryPoint\\n * @param mode enum with the following options:\\n * opSucceeded - user operation succeeded.\\n * opReverted - user op reverted. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/samples/IOracle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface IOracle {\\n\\n /**\\n * return amount of tokens that are required to receive that much eth.\\n */\\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\\n}\\n\\n\",\"keccak256\":\"0xdefd2ec9c4e592ad68092e9e4c15d27c697fc08f90a885bcdb47542da88b42be\",\"license\":\"GPL-3.0\"},\"contracts/samples/ManualDepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"../core/BasePaymaster.sol\\\";\\nimport \\\"./IOracle.sol\\\";\\n\\n/**\\n * A token-based paymaster that accepts token deposits\\n * The deposit is only a safeguard: the user pays with his token balance.\\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\\n * thus the required deposit is to cover just one method call.\\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\\n * (but can't use the deposit for this or further operations)\\n *\\n * paymasterAndData holds the paymaster address followed by the token address to use.\\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\\n * (the standard rules ban accessing data of an external contract)\\n * It can only be used if it is \\\"whitelisted\\\" by the bundler.\\n * (technically, it can be used by an \\\"oracle\\\" which returns a static value, without accessing any storage)\\n */\\ncontract ManualDepositPaymaster is BasePaymaster {\\n\\n using UserOperationLib for UserOperation;\\n using SafeERC20 for IERC20;\\n\\n struct SupportedTokenInfo {\\n IERC20 token;\\n uint8 tokenDecimals;\\n uint256 priceRatio; // ratio = token : native\\n uint256 priceRatioDecimals;\\n uint256 minRatio;\\n uint256 maxRatio;\\n }\\n\\n //calculated cost of the postOp\\n uint256 constant public COST_OF_POST = 35000;\\n\\n mapping(IERC20 => SupportedTokenInfo) public priceRatioInfo;\\n mapping(IERC20 => mapping(address => uint256)) public balances;\\n mapping(address => uint256) public unlockBlock;\\n\\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\\n //owner account is unblocked, to allow withdraw of paid tokens;\\n unlockTokenDeposit();\\n }\\n\\n /**\\n * owner of the paymaster should add supported tokens\\n */\\n function addToken(IERC20 token, uint8 tokenDecimals, uint256 priceRatio, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\\n require(priceRatioInfo[token].token == IERC20(address(0)));\\n require(priceRatio != 0, \\\"DepositPaymaster: price ratio cannot be zero\\\");\\n require(minRatio != 0, \\\"DepositPaymaster: min ratio cannot be zero\\\");\\n require(priceRatio >= minRatio && priceRatio <= maxRatio, \\\"DepositPaymaster: Invalid price ratio\\\");\\n require(token != IERC20(address(0)), \\\"DepositPaymaster: Invalid token\\\");\\n priceRatioInfo[token] = SupportedTokenInfo(token, tokenDecimals, priceRatio, priceRatioDecimals, minRatio, maxRatio);\\n }\\n\\n /**\\n * deposit tokens that a specific account can use to pay for gas.\\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\\n * Note depositing the tokens is equivalent to transferring them to the \\\"account\\\" - only the account can later\\n * use them - either as gas, or using withdrawTo()\\n *\\n * @param token the token to deposit.\\n * @param account the account to deposit for.\\n * @param amount the amount of token to deposit.\\n */\\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\\n //(sender must have approval for the paymaster)\\n token.safeTransferFrom(msg.sender, address(this), amount);\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n balances[token][account] += amount;\\n if (msg.sender == account) {\\n lockTokenDeposit();\\n }\\n }\\n\\n /**\\n * @return amount - the amount of given token deposited to the Paymaster.\\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\\n */\\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\\n amount = balances[token][account];\\n _unlockBlock = unlockBlock[account];\\n }\\n\\n /**\\n * unlock deposit, so that it can be withdrawn.\\n * can't be called in the same block as withdrawTo()\\n */\\n function unlockTokenDeposit() public {\\n unlockBlock[msg.sender] = block.number;\\n }\\n\\n /**\\n * lock the tokens deposited for this account so they can be used to pay for gas.\\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\\n */\\n function lockTokenDeposit() public {\\n unlockBlock[msg.sender] = 0;\\n }\\n\\n /**\\n * withdraw tokens.\\n * can only be called after unlock() is called in a previous block.\\n * @param token the token deposit to withdraw\\n * @param target address to send to\\n * @param amount amount to withdraw\\n */\\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \\\"DepositPaymaster: must unlockTokenDeposit\\\");\\n balances[token][msg.sender] -= amount;\\n token.safeTransfer(target, amount);\\n }\\n\\n /**\\n * translate the given eth value to token amount\\n * @param token the token to use\\n * @param ethBought the required eth value we want to \\\"buy\\\"\\n * @return requiredTokens the amount of tokens required to get this amount of eth\\n */\\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n uint256 requiredAmount = (ethBought * (10**priceRatioInfo[token].priceRatioDecimals)) / priceRatioInfo[token].priceRatio;\\n // there is no requiredAmount = 0 check, priceRatio set by owner and shouldn't exceed ethBought\\n return (requiredAmount / (10**(18 - priceRatioInfo[token].tokenDecimals)));\\n }\\n\\n /**\\n * allows the owner to update the token params\\n */\\n function updateTokenParams(IERC20 token, uint256 priceRatioDecimals, uint256 minRatio, uint256 maxRatio) external onlyOwner {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n require(minRatio != 0, \\\"min ratio cannot be zero\\\");\\n priceRatioInfo[token].priceRatioDecimals = priceRatioDecimals;\\n priceRatioInfo[token].minRatio = minRatio;\\n priceRatioInfo[token].maxRatio = maxRatio;\\n }\\n\\n /**\\n * allows the owner to update the price Ratio of a token\\n * can be called as per precision desired by owner\\n */\\n function updatePriceRatio(IERC20 token, uint256 priceRatio) external onlyOwner {\\n require(priceRatioInfo[token].token != IERC20(address(0)), \\\"DepositPaymaster: unsupported token\\\");\\n require(priceRatio >= priceRatioInfo[token].minRatio && priceRatio <= priceRatioInfo[token].maxRatio, \\\"DepositPaymaster: Invalid price ratio\\\");\\n priceRatioInfo[token].priceRatio = priceRatio;\\n }\\n\\n /**\\n * Validate the request:\\n * The sender should have enough deposit to pay the max possible cost.\\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\\n * this deposit will be used to compensate the paymaster for the transaction.\\n */\\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\\n internal view override returns (bytes memory context, uint256 validationData) {\\n\\n (userOpHash);\\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\\n require(userOp.verificationGasLimit > COST_OF_POST, \\\"DepositPaymaster: gas too low for postOp\\\");\\n\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n require(paymasterAndData.length == 20+20, \\\"DepositPaymaster: paymasterAndData must specify token\\\");\\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\\n address account = userOp.getSender();\\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\\n uint256 gasPriceUserOp = userOp.gasPrice();\\n require(unlockBlock[account] == 0, \\\"DepositPaymaster: deposit not locked\\\");\\n require(balances[token][account] >= maxTokenCost, \\\"DepositPaymaster: deposit too low\\\");\\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\\n }\\n\\n /**\\n * perform the post-operation to charge the sender for the gas.\\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\\n * this time in *postOpReverted* mode.\\n * In this mode, we use the deposit to pay (which we validated to be large enough)\\n */\\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\\n\\n (address account, IERC20 token, uint256 gasPriceUserOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\\n //use same conversion rate as used for validation.\\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPriceUserOp) * maxTokenCost / maxCost;\\n if (mode != PostOpMode.postOpReverted) {\\n // attempt to pay with tokens:\\n token.safeTransferFrom(account, address(this), actualTokenCost);\\n } else {\\n //in case above transferFrom failed, pay with deposit:\\n balances[token][account] -= actualTokenCost;\\n }\\n balances[token][owner()] += actualTokenCost;\\n }\\n}\\n\",\"keccak256\":\"0x49d96a1b001a5be26cde0c4b388144e9b12d5c4a330aa81fd921b5e310bb1115\",\"license\":\"GPL-3.0\"},\"contracts/test/TestTokenValueManualDepositPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../samples/ManualDepositPaymaster.sol\\\";\\n\\ncontract TestTokenValueManualDepositPaymaster is ManualDepositPaymaster {\\n\\n constructor(IEntryPoint _entryPoint) ManualDepositPaymaster(_entryPoint) {\\n }\\n\\n function getTokenValueOfEthTest(IERC20 token, uint256 ethBought) public view returns (uint256) {\\n return ManualDepositPaymaster.getTokenValueOfEth(token, ethBought);\\n }\\n}\\n\",\"keccak256\":\"0xbfbbf4c3b9057926449b366485186619213fd1ee5da544e57f7ee4b24dc21b3b\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":2828,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":13189,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"priceRatioInfo","offset":0,"slot":"1","type":"t_mapping(t_contract(IERC20)4419,t_struct(SupportedTokenInfo)13180_storage)"},{"astId":13196,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"balances","offset":0,"slot":"2","type":"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))"},{"astId":13200,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"unlockBlock","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IERC20)4419":{"encoding":"inplace","label":"contract IERC20","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_contract(IERC20)4419,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_contract(IERC20)4419,t_struct(SupportedTokenInfo)13180_storage)":{"encoding":"mapping","key":"t_contract(IERC20)4419","label":"mapping(contract IERC20 => struct ManualDepositPaymaster.SupportedTokenInfo)","numberOfBytes":"32","value":"t_struct(SupportedTokenInfo)13180_storage"},"t_struct(SupportedTokenInfo)13180_storage":{"encoding":"inplace","label":"struct ManualDepositPaymaster.SupportedTokenInfo","members":[{"astId":13169,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"token","offset":0,"slot":"0","type":"t_contract(IERC20)4419"},{"astId":13171,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"tokenDecimals","offset":20,"slot":"0","type":"t_uint8"},{"astId":13173,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"priceRatio","offset":0,"slot":"1","type":"t_uint256"},{"astId":13175,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"priceRatioDecimals","offset":0,"slot":"2","type":"t_uint256"},{"astId":13177,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"minRatio","offset":0,"slot":"3","type":"t_uint256"},{"astId":13179,"contract":"contracts/test/TestTokenValueManualDepositPaymaster.sol:TestTokenValueManualDepositPaymaster","label":"maxRatio","offset":0,"slot":"4","type":"t_uint256"}],"numberOfBytes":"160"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{"addDepositFor(address,address,uint256)":{"notice":"deposit tokens that a specific account can use to pay for gas. The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method). Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later use them - either as gas, or using withdrawTo()"},"addStake(uint32)":{"notice":"add stake for this paymaster. This method can also carry eth value to add to the current stake."},"addToken(address,uint8,uint256,uint256,uint256,uint256)":{"notice":"owner of the paymaster should add supported tokens"},"deposit()":{"notice":"add a deposit for this paymaster, used for paying for transaction fees"},"getDeposit()":{"notice":"return current paymaster's deposit on the entryPoint."},"lockTokenDeposit()":{"notice":"lock the tokens deposited for this account so they can be used to pay for gas. after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked."},"postOp(uint8,bytes,uint256)":{"notice":"post-operation handler. Must verify sender is the entryPoint"},"unlockStake()":{"notice":"unlock the stake, in order to withdraw it. The paymaster can't serve requests once unlocked, until it calls addStake again"},"unlockTokenDeposit()":{"notice":"unlock deposit, so that it can be withdrawn. can't be called in the same block as withdrawTo()"},"updatePriceRatio(address,uint256)":{"notice":"allows the owner to update the price Ratio of a token can be called as per precision desired by owner"},"updateTokenParams(address,uint256,uint256,uint256)":{"notice":"allows the owner to update the token params"},"validatePaymasterUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":{"notice":"payment validation: check if paymaster agrees to pay. Must verify sender is the entryPoint. Revert to reject this request. Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns."},"withdrawStake(address)":{"notice":"withdraw the entire paymaster's stake. stake must be unlocked first (and then wait for the unstakeDelay to be over)"},"withdrawTo(address,uint256)":{"notice":"withdraw value from the deposit"},"withdrawTokensTo(address,address,uint256)":{"notice":"withdraw tokens. can only be called after unlock() is called in a previous block."}},"version":1}}},"contracts/test/TestUtil.sol":{"TestUtil":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"}],"name":"packUserOp","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608060405234801561001057600080fd5b506102b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80633a24dea414610030575b600080fd5b61004361003e36600461015d565b610059565b60405161005091906101a0565b60405180910390f35b60606100648261006a565b92915050565b606081356020830135600061008a6100856040870187610213565b61014a565b9050600061009e6100856060880188610213565b9050608086013560a087013560c088013560e08901356101008a013560006100cd6100856101208e018e610213565b6040805173ffffffffffffffffffffffffffffffffffffffff9c909c1660208d01528b81019a909a5260608b019890985250608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408084019190915281518084039091018152610160909201905292915050565b6000604051828085833790209392505050565b60006020828403121561016f57600080fd5b813567ffffffffffffffff81111561018657600080fd5b8201610160818503121561019957600080fd5b9392505050565b600060208083528351808285015260005b818110156101cd578581018301518582016040015282016101b1565b818111156101df576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261024857600080fd5b83018035915067ffffffffffffffff82111561026357600080fd5b60200191503681900382131561027857600080fd5b925092905056fea264697066735822122023775512cbdd39b4372405447c64c6263bd1bf570bfa5b9d66c151a768ebf08064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B5 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A24DEA4 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x15D JUMP JUMPDEST PUSH2 0x59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0x64 DUP3 PUSH2 0x6A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x8A PUSH2 0x85 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x213 JUMP JUMPDEST PUSH2 0x14A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9E PUSH2 0x85 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x213 JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP10 ADD CALLDATALOAD PUSH2 0x100 DUP11 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0xCD PUSH2 0x85 PUSH2 0x120 DUP15 ADD DUP15 PUSH2 0x213 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP13 SWAP1 SWAP13 AND PUSH1 0x20 DUP14 ADD MSTORE DUP12 DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE PUSH1 0x60 DUP12 ADD SWAP9 SWAP1 SWAP9 MSTORE POP PUSH1 0x80 DUP10 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xA0 DUP9 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xC0 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH2 0x160 SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP1 DUP6 DUP4 CALLDATACOPY SWAP1 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x199 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1CD JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x1B1 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 PUSH24 0x5512CBDD39B4372405447C64C6263BD1BF570BFA5B9D66C1 MLOAD 0xA7 PUSH9 0xEBF08064736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"105:190:106:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@calldataKeccak_9990":{"entryPoint":330,"id":9990,"parameterSlots":2,"returnSlots":1},"@getSender_11015":{"entryPoint":null,"id":11015,"parameterSlots":1,"returnSlots":1},"@packUserOp_20336":{"entryPoint":89,"id":20336,"parameterSlots":1,"returnSlots":1},"@pack_11130":{"entryPoint":106,"id":11130,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr":{"entryPoint":349,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":11,"returnSlots":1},"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":416,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":531,"id":null,"parameterSlots":2,"returnSlots":2}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2531:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"118:290:111","statements":[{"body":{"nodeType":"YulBlock","src":"164:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"173:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"176:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"166:6:111"},"nodeType":"YulFunctionCall","src":"166:12:111"},"nodeType":"YulExpressionStatement","src":"166:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"139:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"148:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"135:3:111"},"nodeType":"YulFunctionCall","src":"135:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"160:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"131:3:111"},"nodeType":"YulFunctionCall","src":"131:32:111"},"nodeType":"YulIf","src":"128:52:111"},{"nodeType":"YulVariableDeclaration","src":"189:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"216:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"203:12:111"},"nodeType":"YulFunctionCall","src":"203:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"193:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"269:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"278:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"281:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"271:6:111"},"nodeType":"YulFunctionCall","src":"271:12:111"},"nodeType":"YulExpressionStatement","src":"271:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"241:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"249:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"238:2:111"},"nodeType":"YulFunctionCall","src":"238:30:111"},"nodeType":"YulIf","src":"235:50:111"},{"nodeType":"YulVariableDeclaration","src":"294:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"308:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"319:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"304:3:111"},"nodeType":"YulFunctionCall","src":"304:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"298:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"365:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"374:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"377:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"367:6:111"},"nodeType":"YulFunctionCall","src":"367:12:111"},"nodeType":"YulExpressionStatement","src":"367:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"346:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"355:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"342:3:111"},"nodeType":"YulFunctionCall","src":"342:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"360:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"338:3:111"},"nodeType":"YulFunctionCall","src":"338:26:111"},"nodeType":"YulIf","src":"335:46:111"},{"nodeType":"YulAssignment","src":"390:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"400:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"390:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"84:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"95:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"107:6:111","type":""}],"src":"14:394:111"},{"body":{"nodeType":"YulBlock","src":"532:535:111","statements":[{"nodeType":"YulVariableDeclaration","src":"542:12:111","value":{"kind":"number","nodeType":"YulLiteral","src":"552:2:111","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"546:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"570:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"581:2:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"563:6:111"},"nodeType":"YulFunctionCall","src":"563:21:111"},"nodeType":"YulExpressionStatement","src":"563:21:111"},{"nodeType":"YulVariableDeclaration","src":"593:27:111","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"613:6:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"607:5:111"},"nodeType":"YulFunctionCall","src":"607:13:111"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"597:6:111","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"640:9:111"},{"name":"_1","nodeType":"YulIdentifier","src":"651:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"636:3:111"},"nodeType":"YulFunctionCall","src":"636:18:111"},{"name":"length","nodeType":"YulIdentifier","src":"656:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"629:6:111"},"nodeType":"YulFunctionCall","src":"629:34:111"},"nodeType":"YulExpressionStatement","src":"629:34:111"},{"nodeType":"YulVariableDeclaration","src":"672:10:111","value":{"kind":"number","nodeType":"YulLiteral","src":"681:1:111","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"676:1:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"741:90:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"770:9:111"},{"name":"i","nodeType":"YulIdentifier","src":"781:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"766:3:111"},"nodeType":"YulFunctionCall","src":"766:17:111"},{"kind":"number","nodeType":"YulLiteral","src":"785:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"762:3:111"},"nodeType":"YulFunctionCall","src":"762:26:111"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"804:6:111"},{"name":"i","nodeType":"YulIdentifier","src":"812:1:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"800:3:111"},"nodeType":"YulFunctionCall","src":"800:14:111"},{"name":"_1","nodeType":"YulIdentifier","src":"816:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"796:3:111"},"nodeType":"YulFunctionCall","src":"796:23:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"790:5:111"},"nodeType":"YulFunctionCall","src":"790:30:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"755:6:111"},"nodeType":"YulFunctionCall","src":"755:66:111"},"nodeType":"YulExpressionStatement","src":"755:66:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"702:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"705:6:111"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"699:2:111"},"nodeType":"YulFunctionCall","src":"699:13:111"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"713:19:111","statements":[{"nodeType":"YulAssignment","src":"715:15:111","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"724:1:111"},{"name":"_1","nodeType":"YulIdentifier","src":"727:2:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"720:3:111"},"nodeType":"YulFunctionCall","src":"720:10:111"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"715:1:111"}]}]},"pre":{"nodeType":"YulBlock","src":"695:3:111","statements":[]},"src":"691:140:111"},{"body":{"nodeType":"YulBlock","src":"865:66:111","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"894:9:111"},{"name":"length","nodeType":"YulIdentifier","src":"905:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"890:3:111"},"nodeType":"YulFunctionCall","src":"890:22:111"},{"kind":"number","nodeType":"YulLiteral","src":"914:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"886:3:111"},"nodeType":"YulFunctionCall","src":"886:31:111"},{"kind":"number","nodeType":"YulLiteral","src":"919:1:111","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"879:6:111"},"nodeType":"YulFunctionCall","src":"879:42:111"},"nodeType":"YulExpressionStatement","src":"879:42:111"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"846:1:111"},{"name":"length","nodeType":"YulIdentifier","src":"849:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"843:2:111"},"nodeType":"YulFunctionCall","src":"843:13:111"},"nodeType":"YulIf","src":"840:91:111"},{"nodeType":"YulAssignment","src":"940:121:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"956:9:111"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"975:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"983:2:111","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"971:3:111"},"nodeType":"YulFunctionCall","src":"971:15:111"},{"kind":"number","nodeType":"YulLiteral","src":"988:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"967:3:111"},"nodeType":"YulFunctionCall","src":"967:88:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"952:3:111"},"nodeType":"YulFunctionCall","src":"952:104:111"},{"kind":"number","nodeType":"YulLiteral","src":"1058:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"948:3:111"},"nodeType":"YulFunctionCall","src":"948:113:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"940:4:111"}]}]},"name":"abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"501:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"512:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"523:4:111","type":""}],"src":"413:654:111"},{"body":{"nodeType":"YulBlock","src":"1166:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1176:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"1215:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1202:12:111"},"nodeType":"YulFunctionCall","src":"1202:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"1180:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1375:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1384:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1387:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1377:6:111"},"nodeType":"YulFunctionCall","src":"1377:12:111"},"nodeType":"YulExpressionStatement","src":"1377:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1250:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1278:12:111"},"nodeType":"YulFunctionCall","src":"1278:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"1294:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1274:3:111"},"nodeType":"YulFunctionCall","src":"1274:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"1305:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1270:3:111"},"nodeType":"YulFunctionCall","src":"1270:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1246:3:111"},"nodeType":"YulFunctionCall","src":"1246:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1239:6:111"},"nodeType":"YulFunctionCall","src":"1239:135:111"},"nodeType":"YulIf","src":"1236:155:111"},{"nodeType":"YulVariableDeclaration","src":"1400:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"1418:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1428:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1414:3:111"},"nodeType":"YulFunctionCall","src":"1414:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"1404:6:111","type":""}]},{"nodeType":"YulAssignment","src":"1456:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1479:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1466:12:111"},"nodeType":"YulFunctionCall","src":"1466:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1456:6:111"}]},{"body":{"nodeType":"YulBlock","src":"1529:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1538:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1541:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1531:6:111"},"nodeType":"YulFunctionCall","src":"1531:12:111"},"nodeType":"YulExpressionStatement","src":"1531:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1501:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1509:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1498:2:111"},"nodeType":"YulFunctionCall","src":"1498:30:111"},"nodeType":"YulIf","src":"1495:50:111"},{"nodeType":"YulAssignment","src":"1554:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1566:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1574:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1562:3:111"},"nodeType":"YulFunctionCall","src":"1562:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"1554:4:111"}]},{"body":{"nodeType":"YulBlock","src":"1630:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1639:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1642:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1632:6:111"},"nodeType":"YulFunctionCall","src":"1632:12:111"},"nodeType":"YulExpressionStatement","src":"1632:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"1595:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1605:12:111"},"nodeType":"YulFunctionCall","src":"1605:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"1621:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1601:3:111"},"nodeType":"YulFunctionCall","src":"1601:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"1591:3:111"},"nodeType":"YulFunctionCall","src":"1591:38:111"},"nodeType":"YulIf","src":"1588:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"1123:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"1133:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"1149:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1155:6:111","type":""}],"src":"1072:580:111"},{"body":{"nodeType":"YulBlock","src":"2010:519:111","statements":[{"nodeType":"YulAssignment","src":"2020:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2032:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2043:3:111","type":"","value":"320"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2028:3:111"},"nodeType":"YulFunctionCall","src":"2028:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"2020:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2063:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"2078:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"2086:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2074:3:111"},"nodeType":"YulFunctionCall","src":"2074:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2056:6:111"},"nodeType":"YulFunctionCall","src":"2056:74:111"},"nodeType":"YulExpressionStatement","src":"2056:74:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2150:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2161:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2146:3:111"},"nodeType":"YulFunctionCall","src":"2146:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"2166:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2139:6:111"},"nodeType":"YulFunctionCall","src":"2139:34:111"},"nodeType":"YulExpressionStatement","src":"2139:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2193:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2204:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2189:3:111"},"nodeType":"YulFunctionCall","src":"2189:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"2209:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2182:6:111"},"nodeType":"YulFunctionCall","src":"2182:34:111"},"nodeType":"YulExpressionStatement","src":"2182:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2236:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2247:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2232:3:111"},"nodeType":"YulFunctionCall","src":"2232:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"2252:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2225:6:111"},"nodeType":"YulFunctionCall","src":"2225:34:111"},"nodeType":"YulExpressionStatement","src":"2225:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2279:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2290:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2275:3:111"},"nodeType":"YulFunctionCall","src":"2275:19:111"},{"name":"value4","nodeType":"YulIdentifier","src":"2296:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2268:6:111"},"nodeType":"YulFunctionCall","src":"2268:35:111"},"nodeType":"YulExpressionStatement","src":"2268:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2323:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2334:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2319:3:111"},"nodeType":"YulFunctionCall","src":"2319:19:111"},{"name":"value5","nodeType":"YulIdentifier","src":"2340:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2312:6:111"},"nodeType":"YulFunctionCall","src":"2312:35:111"},"nodeType":"YulExpressionStatement","src":"2312:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2367:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2378:3:111","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2363:3:111"},"nodeType":"YulFunctionCall","src":"2363:19:111"},{"name":"value6","nodeType":"YulIdentifier","src":"2384:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2356:6:111"},"nodeType":"YulFunctionCall","src":"2356:35:111"},"nodeType":"YulExpressionStatement","src":"2356:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2411:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2422:3:111","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2407:3:111"},"nodeType":"YulFunctionCall","src":"2407:19:111"},{"name":"value7","nodeType":"YulIdentifier","src":"2428:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2400:6:111"},"nodeType":"YulFunctionCall","src":"2400:35:111"},"nodeType":"YulExpressionStatement","src":"2400:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2455:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2466:3:111","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2451:3:111"},"nodeType":"YulFunctionCall","src":"2451:19:111"},{"name":"value8","nodeType":"YulIdentifier","src":"2472:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2444:6:111"},"nodeType":"YulFunctionCall","src":"2444:35:111"},"nodeType":"YulExpressionStatement","src":"2444:35:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2499:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2510:3:111","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2495:3:111"},"nodeType":"YulFunctionCall","src":"2495:19:111"},{"name":"value9","nodeType":"YulIdentifier","src":"2516:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2488:6:111"},"nodeType":"YulFunctionCall","src":"2488:35:111"},"nodeType":"YulExpressionStatement","src":"2488:35:111"}]},"name":"abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1907:9:111","type":""},{"name":"value9","nodeType":"YulTypedName","src":"1918:6:111","type":""},{"name":"value8","nodeType":"YulTypedName","src":"1926:6:111","type":""},{"name":"value7","nodeType":"YulTypedName","src":"1934:6:111","type":""},{"name":"value6","nodeType":"YulTypedName","src":"1942:6:111","type":""},{"name":"value5","nodeType":"YulTypedName","src":"1950:6:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"1958:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1966:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1974:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1982:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1990:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"2001:4:111","type":""}],"src":"1657:872:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_address_t_uint256_t_bytes32_t_bytes32_t_uint256_t_uint256_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed(headStart, value9, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 320)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), value6)\n mstore(add(headStart, 224), value7)\n mstore(add(headStart, 256), value8)\n mstore(add(headStart, 288), value9)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061002b5760003560e01c80633a24dea414610030575b600080fd5b61004361003e36600461015d565b610059565b60405161005091906101a0565b60405180910390f35b60606100648261006a565b92915050565b606081356020830135600061008a6100856040870187610213565b61014a565b9050600061009e6100856060880188610213565b9050608086013560a087013560c088013560e08901356101008a013560006100cd6100856101208e018e610213565b6040805173ffffffffffffffffffffffffffffffffffffffff9c909c1660208d01528b81019a909a5260608b019890985250608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408084019190915281518084039091018152610160909201905292915050565b6000604051828085833790209392505050565b60006020828403121561016f57600080fd5b813567ffffffffffffffff81111561018657600080fd5b8201610160818503121561019957600080fd5b9392505050565b600060208083528351808285015260005b818110156101cd578581018301518582016040015282016101b1565b818111156101df576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261024857600080fd5b83018035915067ffffffffffffffff82111561026357600080fd5b60200191503681900382131561027857600080fd5b925092905056fea264697066735822122023775512cbdd39b4372405447c64c6263bd1bf570bfa5b9d66c151a768ebf08064736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A24DEA4 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x3E CALLDATASIZE PUSH1 0x4 PUSH2 0x15D JUMP JUMPDEST PUSH2 0x59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0x64 DUP3 PUSH2 0x6A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0x8A PUSH2 0x85 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x213 JUMP JUMPDEST PUSH2 0x14A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9E PUSH2 0x85 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0x213 JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP10 ADD CALLDATALOAD PUSH2 0x100 DUP11 ADD CALLDATALOAD PUSH1 0x0 PUSH2 0xCD PUSH2 0x85 PUSH2 0x120 DUP15 ADD DUP15 PUSH2 0x213 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP13 SWAP1 SWAP13 AND PUSH1 0x20 DUP14 ADD MSTORE DUP12 DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE PUSH1 0x60 DUP12 ADD SWAP9 SWAP1 SWAP9 MSTORE POP PUSH1 0x80 DUP10 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xA0 DUP9 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xC0 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x120 DUP5 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH2 0x160 SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP1 DUP6 DUP4 CALLDATACOPY SWAP1 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x199 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1CD JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x1B1 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 PUSH24 0x5512CBDD39B4372405447C64C6263BD1BF570BFA5B9D66C1 MLOAD 0xA7 PUSH9 0xEBF08064736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"105:190:106:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;176:116;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;246:12;276:9;:2;:7;:9::i;:::-;269:16;176:116;-1:-1:-1;;176:116:106:o;2573:942:64:-;2641:16;1889:20;;2729:12;;;;2669:14;2774:31;2789:15;;;;1889:20;2789:15;:::i;:::-;2774:14;:31::i;:::-;2751:54;-1:-1:-1;2815:20:64;2838:31;2853:15;;;;:6;:15;:::i;2838:31::-;2815:54;-1:-1:-1;2902:19:64;;;;2962:27;;;;3028:25;;;;3086:19;;;;3146:27;;;;2879:20;3214:39;3229:23;;;;2902:6;3229:23;:::i;3214:39::-;3271:237;;;2086:42:111;2074:55;;;;3271:237:64;;;2056:74:111;2146:18;;;2139:34;;;;2189:18;;;2182:34;;;;-1:-1:-1;2232:18:111;;;2225:34;;;;2275:19;;;2268:35;;;;2319:19;;;2312:35;;;;2363:19;;;2356:35;2407:19;;;2400:35;2451:19;;;2444:35;2495:19;;;;2488:35;;;;3271:237:64;;;;;;;;;;2028:19:111;;;;3271:237:64;;;2573:942;-1:-1:-1;;2573:942:64:o;3357:265:54:-;3416:11;3479:4;3473:11;3508;3563:3;3550:11;3545:3;3532:35;3587:19;;;3357:265;-1:-1:-1;;;3357:265:54:o;14:394:111:-;107:6;160:2;148:9;139:7;135:23;131:32;128:52;;;176:1;173;166:12;128:52;216:9;203:23;249:18;241:6;238:30;235:50;;;281:1;278;271:12;235:50;304:22;;360:3;342:16;;;338:26;335:46;;;377:1;374;367:12;335:46;400:2;14:394;-1:-1:-1;;;14:394:111:o;413:654::-;523:4;552:2;581;570:9;563:21;613:6;607:13;656:6;651:2;640:9;636:18;629:34;681:1;691:140;705:6;702:1;699:13;691:140;;;800:14;;;796:23;;790:30;766:17;;;785:2;762:26;755:66;720:10;;691:140;;;849:6;846:1;843:13;840:91;;;919:1;914:2;905:6;894:9;890:22;886:31;879:42;840:91;-1:-1:-1;983:2:111;971:15;988:66;967:88;952:104;;;;1058:2;948:113;;413:654;-1:-1:-1;;;413:654:111:o;1072:580::-;1149:4;1155:6;1215:11;1202:25;1305:66;1294:8;1278:14;1274:29;1270:102;1250:18;1246:127;1236:155;;1387:1;1384;1377:12;1236:155;1414:33;;1466:20;;;-1:-1:-1;1509:18:111;1498:30;;1495:50;;;1541:1;1538;1531:12;1495:50;1574:4;1562:17;;-1:-1:-1;1605:14:111;1601:27;;;1591:38;;1588:58;;;1642:1;1639;1632:12;1588:58;1072:580;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"138600","executionCost":"183","totalCost":"138783"},"external":{"packUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite"}},"methodIdentifiers":{"packUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"3a24dea4"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"}],\"name\":\"packUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestUtil.sol\":\"TestUtil\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/test/TestUtil.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/UserOperation.sol\\\";\\n\\ncontract TestUtil {\\n using UserOperationLib for UserOperation;\\n\\n function packUserOp(UserOperation calldata op) external pure returns (bytes memory){\\n return op.pack();\\n }\\n\\n}\\n\",\"keccak256\":\"0x041370441d058a6c8c156eb7030a45b7ee3f2109a81a6a4298a705f106e2672d\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/TestWarmColdAccount.sol":{"TestWarmColdAccount":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_ep","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"paymaster","type":"address"}],"name":"touchPaymaster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"touchStorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_20360":{"entryPoint":null,"id":20360,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory":{"entryPoint":75,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:327:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"116:209:111","statements":[{"body":{"nodeType":"YulBlock","src":"162:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"171:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"174:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"164:6:111"},"nodeType":"YulFunctionCall","src":"164:12:111"},"nodeType":"YulExpressionStatement","src":"164:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"137:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"146:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"158:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"129:3:111"},"nodeType":"YulFunctionCall","src":"129:32:111"},"nodeType":"YulIf","src":"126:52:111"},{"nodeType":"YulVariableDeclaration","src":"187:29:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"206:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"200:5:111"},"nodeType":"YulFunctionCall","src":"200:16:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"191:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"279:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"288:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"291:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"281:6:111"},"nodeType":"YulFunctionCall","src":"281:12:111"},"nodeType":"YulExpressionStatement","src":"281:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"238:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"249:5:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"264:3:111","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"269:1:111","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"260:3:111"},"nodeType":"YulFunctionCall","src":"260:11:111"},{"kind":"number","nodeType":"YulLiteral","src":"273:1:111","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"256:3:111"},"nodeType":"YulFunctionCall","src":"256:19:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"245:3:111"},"nodeType":"YulFunctionCall","src":"245:31:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"235:2:111"},"nodeType":"YulFunctionCall","src":"235:42:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"228:6:111"},"nodeType":"YulFunctionCall","src":"228:50:111"},"nodeType":"YulIf","src":"225:70:111"},{"nodeType":"YulAssignment","src":"304:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"314:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"304:6:111"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"82:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"93:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"105:6:111","type":""}],"src":"14:311:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_contract$_IEntryPoint_$10807_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"6080604052600180556040516104c93803806104c98339810160408190526100269161004b565b600080546001600160a01b0319166001600160a01b039290921691909117905561007b565b60006020828403121561005d57600080fd5b81516001600160a01b038116811461007457600080fd5b9392505050565b61043f8061008a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633a871cdd14610051578063c19d93fb14610076578063f115d40d1461007f578063fb0c2425146100a7575b600080fd5b61006461005f366004610281565b6100af565b60405190815260200160405180910390f35b61006460015481565b61006461008d3660046102d5565b73ffffffffffffffffffffffffffffffffffffffff163b90565b600154610064565b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050505083602001356001036101ba573073ffffffffffffffffffffffffffffffffffffffff1663fb0c24256103e86040518263ffffffff1660e01b81526004016020604051808303818786fa15801561018f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906101b49190610312565b50610277565b83602001356002036102775760006101d661012086018661032b565b6101e591601491600091610397565b6101ee916103c1565b6040517ff115d40d00000000000000000000000000000000000000000000000000000000815260609190911c600482018190529150309063f115d40d906103e8906024016020604051808303818786fa15801561024f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906102749190610312565b50505b5060009392505050565b60008060006060848603121561029657600080fd5b833567ffffffffffffffff8111156102ad57600080fd5b840161016081870312156102c057600080fd5b95602085013595506040909401359392505050565b6000602082840312156102e757600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461030b57600080fd5b9392505050565b60006020828403121561032457600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261036057600080fd5b83018035915067ffffffffffffffff82111561037b57600080fd5b60200191503681900382131561039057600080fd5b9250929050565b600080858511156103a757600080fd5b838611156103b457600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156104015780818660140360031b1b83161692505b50509291505056fea2646970667358221220baba5680094e0b3ea915c17c91e0ef4dadd983a836863e363e97f33785a6815f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 DUP1 SSTORE PUSH1 0x40 MLOAD PUSH2 0x4C9 CODESIZE SUB DUP1 PUSH2 0x4C9 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x26 SWAP2 PUSH2 0x4B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x7B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x43F DUP1 PUSH2 0x8A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0xC19D93FB EQ PUSH2 0x76 JUMPI DUP1 PUSH4 0xF115D40D EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0xFB0C2425 EQ PUSH2 0xA7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x281 JUMP JUMPDEST PUSH2 0xAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x64 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x64 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x2D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x64 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x130 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP4 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 SUB PUSH2 0x1BA JUMPI ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFB0C2425 PUSH2 0x3E8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1B4 SWAP2 SWAP1 PUSH2 0x312 JUMP JUMPDEST POP PUSH2 0x277 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x2 SUB PUSH2 0x277 JUMPI PUSH1 0x0 PUSH2 0x1D6 PUSH2 0x120 DUP7 ADD DUP7 PUSH2 0x32B JUMP JUMPDEST PUSH2 0x1E5 SWAP2 PUSH1 0x14 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x397 JUMP JUMPDEST PUSH2 0x1EE SWAP2 PUSH2 0x3C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF115D40D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP2 SWAP1 SWAP2 SHR PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 POP ADDRESS SWAP1 PUSH4 0xF115D40D SWAP1 PUSH2 0x3E8 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x274 SWAP2 SWAP1 PUSH2 0x312 JUMP JUMPDEST POP POP JUMPDEST POP PUSH1 0x0 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x296 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x30B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x360 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x401 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBA 0xBA JUMP DUP1 MULMOD 0x4E SIGNEXTEND RETURNDATACOPY 0xA9 ISZERO 0xC1 PUSH29 0x91E0EF4DADD983A836863E363E97F33785A6815F64736F6C634300080F STOP CALLER ","sourceMap":"407:1005:107:-:0;;;502:1;482:21;;509:62;;;;;;;;;;;;;;;;;;:::i;:::-;556:2;:8;;-1:-1:-1;;;;;;556:8:107;-1:-1:-1;;;;;556:8:107;;;;;;;;;;407:1005;;14:311:111;105:6;158:2;146:9;137:7;133:23;129:32;126:52;;;174:1;171;164:12;126:52;200:16;;-1:-1:-1;;;;;245:31:111;;235:42;;225:70;;291:1;288;281:12;225:70;314:5;14:311;-1:-1:-1;;;14:311:111:o;:::-;407:1005:107;;;;;;"},"deployedBytecode":{"functionDebugData":{"@state_20349":{"entryPoint":null,"id":20349,"parameterSlots":0,"returnSlots":0},"@touchPaymaster_20447":{"entryPoint":null,"id":20447,"parameterSlots":1,"returnSlots":1},"@touchStorage_20435":{"entryPoint":null,"id":20435,"parameterSlots":0,"returnSlots":1},"@validateUserOp_20427":{"entryPoint":175,"id":20427,"parameterSlots":3,"returnSlots":1},"abi_decode_tuple_t_address":{"entryPoint":725,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256":{"entryPoint":641,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_uint256_fromMemory":{"entryPoint":786,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"access_calldata_tail_t_bytes_calldata_ptr":{"entryPoint":811,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_range_access_t_bytes_calldata_ptr":{"entryPoint":919,"id":null,"parameterSlots":4,"returnSlots":2},"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20":{"entryPoint":961,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2760:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"152:392:111","statements":[{"body":{"nodeType":"YulBlock","src":"198:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"207:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"210:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"200:6:111"},"nodeType":"YulFunctionCall","src":"200:12:111"},"nodeType":"YulExpressionStatement","src":"200:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"173:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"182:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"169:3:111"},"nodeType":"YulFunctionCall","src":"169:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"194:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"165:3:111"},"nodeType":"YulFunctionCall","src":"165:32:111"},"nodeType":"YulIf","src":"162:52:111"},{"nodeType":"YulVariableDeclaration","src":"223:37:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"250:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"237:12:111"},"nodeType":"YulFunctionCall","src":"237:23:111"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"227:6:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"303:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"312:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"315:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"305:6:111"},"nodeType":"YulFunctionCall","src":"305:12:111"},"nodeType":"YulExpressionStatement","src":"305:12:111"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"275:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"283:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"272:2:111"},"nodeType":"YulFunctionCall","src":"272:30:111"},"nodeType":"YulIf","src":"269:50:111"},{"nodeType":"YulVariableDeclaration","src":"328:32:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"342:9:111"},{"name":"offset","nodeType":"YulIdentifier","src":"353:6:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"338:3:111"},"nodeType":"YulFunctionCall","src":"338:22:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"332:2:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"399:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"408:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"411:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"401:6:111"},"nodeType":"YulFunctionCall","src":"401:12:111"},"nodeType":"YulExpressionStatement","src":"401:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"380:7:111"},{"name":"_1","nodeType":"YulIdentifier","src":"389:2:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"376:3:111"},"nodeType":"YulFunctionCall","src":"376:16:111"},{"kind":"number","nodeType":"YulLiteral","src":"394:3:111","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"372:3:111"},"nodeType":"YulFunctionCall","src":"372:26:111"},"nodeType":"YulIf","src":"369:46:111"},{"nodeType":"YulAssignment","src":"424:12:111","value":{"name":"_1","nodeType":"YulIdentifier","src":"434:2:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"424:6:111"}]},{"nodeType":"YulAssignment","src":"445:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"472:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"483:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"468:3:111"},"nodeType":"YulFunctionCall","src":"468:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"455:12:111"},"nodeType":"YulFunctionCall","src":"455:32:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"445:6:111"}]},{"nodeType":"YulAssignment","src":"496:42:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"523:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"534:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"519:3:111"},"nodeType":"YulFunctionCall","src":"519:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"506:12:111"},"nodeType":"YulFunctionCall","src":"506:32:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"496:6:111"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"102:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"113:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"125:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"133:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"141:6:111","type":""}],"src":"14:530:111"},{"body":{"nodeType":"YulBlock","src":"650:76:111","statements":[{"nodeType":"YulAssignment","src":"660:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"672:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"683:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"668:3:111"},"nodeType":"YulFunctionCall","src":"668:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"660:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"702:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"713:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"695:6:111"},"nodeType":"YulFunctionCall","src":"695:25:111"},"nodeType":"YulExpressionStatement","src":"695:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"619:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"630:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"641:4:111","type":""}],"src":"549:177:111"},{"body":{"nodeType":"YulBlock","src":"801:239:111","statements":[{"body":{"nodeType":"YulBlock","src":"847:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"856:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"859:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"849:6:111"},"nodeType":"YulFunctionCall","src":"849:12:111"},"nodeType":"YulExpressionStatement","src":"849:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"822:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"831:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"818:3:111"},"nodeType":"YulFunctionCall","src":"818:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"843:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"814:3:111"},"nodeType":"YulFunctionCall","src":"814:32:111"},"nodeType":"YulIf","src":"811:52:111"},{"nodeType":"YulVariableDeclaration","src":"872:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"898:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"885:12:111"},"nodeType":"YulFunctionCall","src":"885:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"876:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"994:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1003:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1006:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"996:6:111"},"nodeType":"YulFunctionCall","src":"996:12:111"},"nodeType":"YulExpressionStatement","src":"996:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"930:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"941:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"948:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"937:3:111"},"nodeType":"YulFunctionCall","src":"937:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"927:2:111"},"nodeType":"YulFunctionCall","src":"927:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"920:6:111"},"nodeType":"YulFunctionCall","src":"920:73:111"},"nodeType":"YulIf","src":"917:93:111"},{"nodeType":"YulAssignment","src":"1019:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"1029:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1019:6:111"}]}]},"name":"abi_decode_tuple_t_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"767:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"778:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"790:6:111","type":""}],"src":"731:309:111"},{"body":{"nodeType":"YulBlock","src":"1146:125:111","statements":[{"nodeType":"YulAssignment","src":"1156:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1168:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1179:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1164:3:111"},"nodeType":"YulFunctionCall","src":"1164:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1156:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1198:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1213:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1221:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1209:3:111"},"nodeType":"YulFunctionCall","src":"1209:55:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1191:6:111"},"nodeType":"YulFunctionCall","src":"1191:74:111"},"nodeType":"YulExpressionStatement","src":"1191:74:111"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1115:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1126:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1137:4:111","type":""}],"src":"1045:226:111"},{"body":{"nodeType":"YulBlock","src":"1357:103:111","statements":[{"body":{"nodeType":"YulBlock","src":"1403:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1412:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1415:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1405:6:111"},"nodeType":"YulFunctionCall","src":"1405:12:111"},"nodeType":"YulExpressionStatement","src":"1405:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1378:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1387:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1374:3:111"},"nodeType":"YulFunctionCall","src":"1374:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1399:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1370:3:111"},"nodeType":"YulFunctionCall","src":"1370:32:111"},"nodeType":"YulIf","src":"1367:52:111"},{"nodeType":"YulAssignment","src":"1428:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1444:9:111"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1438:5:111"},"nodeType":"YulFunctionCall","src":"1438:16:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1428:6:111"}]}]},"name":"abi_decode_tuple_t_uint256_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1323:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1334:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1346:6:111","type":""}],"src":"1276:184:111"},{"body":{"nodeType":"YulBlock","src":"1559:486:111","statements":[{"nodeType":"YulVariableDeclaration","src":"1569:51:111","value":{"arguments":[{"name":"ptr_to_tail","nodeType":"YulIdentifier","src":"1608:11:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1595:12:111"},"nodeType":"YulFunctionCall","src":"1595:25:111"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"1573:18:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"1768:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1777:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1780:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1770:6:111"},"nodeType":"YulFunctionCall","src":"1770:12:111"},"nodeType":"YulExpressionStatement","src":"1770:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1643:18:111"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1671:12:111"},"nodeType":"YulFunctionCall","src":"1671:14:111"},{"name":"base_ref","nodeType":"YulIdentifier","src":"1687:8:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1667:3:111"},"nodeType":"YulFunctionCall","src":"1667:29:111"},{"kind":"number","nodeType":"YulLiteral","src":"1698:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1663:3:111"},"nodeType":"YulFunctionCall","src":"1663:102:111"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1639:3:111"},"nodeType":"YulFunctionCall","src":"1639:127:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"1632:6:111"},"nodeType":"YulFunctionCall","src":"1632:135:111"},"nodeType":"YulIf","src":"1629:155:111"},{"nodeType":"YulVariableDeclaration","src":"1793:47:111","value":{"arguments":[{"name":"base_ref","nodeType":"YulIdentifier","src":"1811:8:111"},{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"1821:18:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1807:3:111"},"nodeType":"YulFunctionCall","src":"1807:33:111"},"variables":[{"name":"addr_1","nodeType":"YulTypedName","src":"1797:6:111","type":""}]},{"nodeType":"YulAssignment","src":"1849:30:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1872:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1859:12:111"},"nodeType":"YulFunctionCall","src":"1859:20:111"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"1849:6:111"}]},{"body":{"nodeType":"YulBlock","src":"1922:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1931:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1934:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1924:6:111"},"nodeType":"YulFunctionCall","src":"1924:12:111"},"nodeType":"YulExpressionStatement","src":"1924:12:111"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1894:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1902:18:111","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1891:2:111"},"nodeType":"YulFunctionCall","src":"1891:30:111"},"nodeType":"YulIf","src":"1888:50:111"},{"nodeType":"YulAssignment","src":"1947:25:111","value":{"arguments":[{"name":"addr_1","nodeType":"YulIdentifier","src":"1959:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"1967:4:111","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1955:3:111"},"nodeType":"YulFunctionCall","src":"1955:17:111"},"variableNames":[{"name":"addr","nodeType":"YulIdentifier","src":"1947:4:111"}]},{"body":{"nodeType":"YulBlock","src":"2023:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2032:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2035:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2025:6:111"},"nodeType":"YulFunctionCall","src":"2025:12:111"},"nodeType":"YulExpressionStatement","src":"2025:12:111"}]},"condition":{"arguments":[{"name":"addr","nodeType":"YulIdentifier","src":"1988:4:111"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"1998:12:111"},"nodeType":"YulFunctionCall","src":"1998:14:111"},{"name":"length","nodeType":"YulIdentifier","src":"2014:6:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1994:3:111"},"nodeType":"YulFunctionCall","src":"1994:27:111"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"1984:3:111"},"nodeType":"YulFunctionCall","src":"1984:38:111"},"nodeType":"YulIf","src":"1981:58:111"}]},"name":"access_calldata_tail_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"1516:8:111","type":""},{"name":"ptr_to_tail","nodeType":"YulTypedName","src":"1526:11:111","type":""}],"returnVariables":[{"name":"addr","nodeType":"YulTypedName","src":"1542:4:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"1548:6:111","type":""}],"src":"1465:580:111"},{"body":{"nodeType":"YulBlock","src":"2180:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"2218:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2227:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2230:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2220:6:111"},"nodeType":"YulFunctionCall","src":"2220:12:111"},"nodeType":"YulExpressionStatement","src":"2220:12:111"}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"2196:10:111"},{"name":"endIndex","nodeType":"YulIdentifier","src":"2208:8:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2193:2:111"},"nodeType":"YulFunctionCall","src":"2193:24:111"},"nodeType":"YulIf","src":"2190:44:111"},{"body":{"nodeType":"YulBlock","src":"2267:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2276:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2279:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2269:6:111"},"nodeType":"YulFunctionCall","src":"2269:12:111"},"nodeType":"YulExpressionStatement","src":"2269:12:111"}]},"condition":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"2249:8:111"},{"name":"length","nodeType":"YulIdentifier","src":"2259:6:111"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2246:2:111"},"nodeType":"YulFunctionCall","src":"2246:20:111"},"nodeType":"YulIf","src":"2243:40:111"},{"nodeType":"YulAssignment","src":"2292:36:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2309:6:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"2317:10:111"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2305:3:111"},"nodeType":"YulFunctionCall","src":"2305:23:111"},"variableNames":[{"name":"offsetOut","nodeType":"YulIdentifier","src":"2292:9:111"}]},{"nodeType":"YulAssignment","src":"2337:38:111","value":{"arguments":[{"name":"endIndex","nodeType":"YulIdentifier","src":"2354:8:111"},{"name":"startIndex","nodeType":"YulIdentifier","src":"2364:10:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2350:3:111"},"nodeType":"YulFunctionCall","src":"2350:25:111"},"variableNames":[{"name":"lengthOut","nodeType":"YulIdentifier","src":"2337:9:111"}]}]},"name":"calldata_array_index_range_access_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2114:6:111","type":""},{"name":"length","nodeType":"YulTypedName","src":"2122:6:111","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"2130:10:111","type":""},{"name":"endIndex","nodeType":"YulTypedName","src":"2142:8:111","type":""}],"returnVariables":[{"name":"offsetOut","nodeType":"YulTypedName","src":"2155:9:111","type":""},{"name":"lengthOut","nodeType":"YulTypedName","src":"2166:9:111","type":""}],"src":"2050:331:111"},{"body":{"nodeType":"YulBlock","src":"2487:271:111","statements":[{"nodeType":"YulVariableDeclaration","src":"2497:29:111","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"2520:5:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2507:12:111"},"nodeType":"YulFunctionCall","src":"2507:19:111"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2501:2:111","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2535:76:111","value":{"kind":"number","nodeType":"YulLiteral","src":"2545:66:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2539:2:111","type":""}]},{"nodeType":"YulAssignment","src":"2620:20:111","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2633:2:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2637:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2629:3:111"},"nodeType":"YulFunctionCall","src":"2629:11:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2620:5:111"}]},{"body":{"nodeType":"YulBlock","src":"2672:80:111","statements":[{"nodeType":"YulAssignment","src":"2686:56:111","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2703:2:111"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2715:1:111","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2722:2:111","type":"","value":"20"},{"name":"len","nodeType":"YulIdentifier","src":"2726:3:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2718:3:111"},"nodeType":"YulFunctionCall","src":"2718:12:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2711:3:111"},"nodeType":"YulFunctionCall","src":"2711:20:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2733:2:111"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2707:3:111"},"nodeType":"YulFunctionCall","src":"2707:29:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2699:3:111"},"nodeType":"YulFunctionCall","src":"2699:38:111"},{"name":"_2","nodeType":"YulIdentifier","src":"2739:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2695:3:111"},"nodeType":"YulFunctionCall","src":"2695:47:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2686:5:111"}]}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"2655:3:111"},{"kind":"number","nodeType":"YulLiteral","src":"2660:2:111","type":"","value":"20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2652:2:111"},"nodeType":"YulFunctionCall","src":"2652:11:111"},"nodeType":"YulIf","src":"2649:103:111"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"2462:5:111","type":""},{"name":"len","nodeType":"YulTypedName","src":"2469:3:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"2477:5:111","type":""}],"src":"2386:372:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_struct$_UserOperation_$10993_calldata_ptrt_bytes32t_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n value1 := calldataload(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_calldata_ptr_to_t_bytes20(array, len) -> value\n {\n let _1 := calldataload(array)\n let _2 := 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n value := and(_1, _2)\n if lt(len, 20)\n {\n value := and(and(_1, shl(shl(3, sub(20, len)), _2)), _2)\n }\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b506004361061004c5760003560e01c80633a871cdd14610051578063c19d93fb14610076578063f115d40d1461007f578063fb0c2425146100a7575b600080fd5b61006461005f366004610281565b6100af565b60405190815260200160405180910390f35b61006460015481565b61006461008d3660046102d5565b73ffffffffffffffffffffffffffffffffffffffff163b90565b600154610064565b600080546040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063b760faf99084906024016000604051808303818588803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050505083602001356001036101ba573073ffffffffffffffffffffffffffffffffffffffff1663fb0c24256103e86040518263ffffffff1660e01b81526004016020604051808303818786fa15801561018f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906101b49190610312565b50610277565b83602001356002036102775760006101d661012086018661032b565b6101e591601491600091610397565b6101ee916103c1565b6040517ff115d40d00000000000000000000000000000000000000000000000000000000815260609190911c600482018190529150309063f115d40d906103e8906024016020604051808303818786fa15801561024f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906102749190610312565b50505b5060009392505050565b60008060006060848603121561029657600080fd5b833567ffffffffffffffff8111156102ad57600080fd5b840161016081870312156102c057600080fd5b95602085013595506040909401359392505050565b6000602082840312156102e757600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461030b57600080fd5b9392505050565b60006020828403121561032457600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261036057600080fd5b83018035915067ffffffffffffffff82111561037b57600080fd5b60200191503681900382131561039057600080fd5b9250929050565b600080858511156103a757600080fd5b838611156103b457600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156104015780818660140360031b1b83161692505b50509291505056fea2646970667358221220baba5680094e0b3ea915c17c91e0ef4dadd983a836863e363e97f33785a6815f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3A871CDD EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0xC19D93FB EQ PUSH2 0x76 JUMPI DUP1 PUSH4 0xF115D40D EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0xFB0C2425 EQ PUSH2 0xA7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x281 JUMP JUMPDEST PUSH2 0xAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x64 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x64 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x2D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODESIZE SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x64 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xB760FAF900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xB760FAF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x130 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP4 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 SUB PUSH2 0x1BA JUMPI ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFB0C2425 PUSH2 0x3E8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1B4 SWAP2 SWAP1 PUSH2 0x312 JUMP JUMPDEST POP PUSH2 0x277 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x2 SUB PUSH2 0x277 JUMPI PUSH1 0x0 PUSH2 0x1D6 PUSH2 0x120 DUP7 ADD DUP7 PUSH2 0x32B JUMP JUMPDEST PUSH2 0x1E5 SWAP2 PUSH1 0x14 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x397 JUMP JUMPDEST PUSH2 0x1EE SWAP2 PUSH2 0x3C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF115D40D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP2 SWAP1 SWAP2 SHR PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 POP ADDRESS SWAP1 PUSH4 0xF115D40D SWAP1 PUSH2 0x3E8 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP8 DUP7 STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x274 SWAP2 SWAP1 PUSH2 0x312 JUMP JUMPDEST POP POP JUMPDEST POP PUSH1 0x0 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x296 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 ADD PUSH2 0x160 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x30B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x360 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP2 CALLDATALOAD DUP2 DUP2 AND SWAP2 PUSH1 0x14 DUP6 LT ISZERO PUSH2 0x401 JUMPI DUP1 DUP2 DUP7 PUSH1 0x14 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP3 POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBA 0xBA JUMP DUP1 MULMOD 0x4E SIGNEXTEND RETURNDATACOPY 0xA9 ISZERO 0xC1 PUSH29 0x91E0EF4DADD983A836863E363E97F33785A6815F64736F6C634300080F STOP CALLER ","sourceMap":"407:1005:107:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;577:620;;;;;;:::i;:::-;;:::i;:::-;;;695:25:111;;;683:2;668:18;577:620:107;;;;;;;482:21;;;;;;1292:118;;;;;;:::i;:::-;1382:21;;;;1292:118;1203:83;1274:5;;1203:83;;577:620;701:22;735:2;;:56;;;;;785:4;735:56;;;1191:74:111;735:2:107;;;;;:12;;756:19;;1164:18:111;;735:56:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;805:6;:12;;;821:1;805:17;801:372;;897:4;:17;;;920:4;897:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;801:372;;;948:6;:12;;;964:1;948:17;944:229;;981:17;1017:23;;;;:6;:23;:::i;:::-;:29;;1043:2;;1017:29;;;:::i;:::-;1009:38;;;:::i;:::-;1121:41;;;;;1001:47;;;;;1121:41;;;1191:74:111;;;1001:47:107;-1:-1:-1;1121:4:107;;:19;;1146:4;;1164:18:111;;1121:41:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;967:206;944:229;-1:-1:-1;1189:1:107;577:620;;;;;:::o;14:530:111:-;125:6;133;141;194:2;182:9;173:7;169:23;165:32;162:52;;;210:1;207;200:12;162:52;250:9;237:23;283:18;275:6;272:30;269:50;;;315:1;312;305:12;269:50;338:22;;394:3;376:16;;;372:26;369:46;;;411:1;408;401:12;369:46;434:2;483;468:18;;455:32;;-1:-1:-1;534:2:111;519:18;;;506:32;;14:530;-1:-1:-1;;;14:530:111:o;731:309::-;790:6;843:2;831:9;822:7;818:23;814:32;811:52;;;859:1;856;849:12;811:52;898:9;885:23;948:42;941:5;937:54;930:5;927:65;917:93;;1006:1;1003;996:12;917:93;1029:5;731:309;-1:-1:-1;;;731:309:111:o;1276:184::-;1346:6;1399:2;1387:9;1378:7;1374:23;1370:32;1367:52;;;1415:1;1412;1405:12;1367:52;-1:-1:-1;1438:16:111;;1276:184;-1:-1:-1;1276:184:111:o;1465:580::-;1542:4;1548:6;1608:11;1595:25;1698:66;1687:8;1671:14;1667:29;1663:102;1643:18;1639:127;1629:155;;1780:1;1777;1770:12;1629:155;1807:33;;1859:20;;;-1:-1:-1;1902:18:111;1891:30;;1888:50;;;1934:1;1931;1924:12;1888:50;1967:4;1955:17;;-1:-1:-1;1998:14:111;1994:27;;;1984:38;;1981:58;;;2035:1;2032;2025:12;1981:58;1465:580;;;;;:::o;2050:331::-;2155:9;2166;2208:8;2196:10;2193:24;2190:44;;;2230:1;2227;2220:12;2190:44;2259:6;2249:8;2246:20;2243:40;;;2279:1;2276;2269:12;2243:40;-1:-1:-1;;2305:23:111;;;2350:25;;;;;-1:-1:-1;2050:331:111:o;2386:372::-;2545:66;2507:19;;2629:11;;;;2660:2;2652:11;;2649:103;;;2739:2;2733;2726:3;2722:2;2718:12;2715:1;2711:20;2707:29;2703:2;2699:38;2695:47;2686:56;;2649:103;;;2386:372;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"217400","executionCost":"infinite","totalCost":"infinite"},"external":{"state()":"2283","touchPaymaster(address)":"2919","touchStorage()":"2324","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"infinite"}},"methodIdentifiers":{"state()":"c19d93fb","touchPaymaster(address)":"f115d40d","touchStorage()":"fb0c2425","validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)":"3a871cdd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_ep\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"touchPaymaster\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"touchStorage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestWarmColdAccount.sol\":\"TestWarmColdAccount\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"},\"contracts/test/TestWarmColdAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"../interfaces/IAccount.sol\\\";\\n\\n// Using eip-2929 (https://eips.ethereum.org/EIPS/eip-2929) warm/cold storage access gas costs to detect simulation vs execution\\n// COLD_ACCOUNT_ACCESS_COST == 2600, COLD_SLOAD_COST == 2100, WARM_STORAGE_READ_COST == 100\\ncontract TestWarmColdAccount is IAccount {\\n IEntryPoint private ep;\\n uint public state = 1;\\n constructor(IEntryPoint _ep) payable {\\n ep = _ep;\\n }\\n\\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\\n external override returns (uint256 validationData) {\\n ep.depositTo{value : missingAccountFunds}(address(this));\\n if (userOp.nonce == 1) {\\n // can only succeed if storage is already warm\\n this.touchStorage{gas: 1000}();\\n } else if (userOp.nonce == 2) {\\n address paymaster = address(bytes20(userOp.paymasterAndData[: 20]));\\n // can only succeed if storage is already warm\\n this.touchPaymaster{gas: 1000}(paymaster);\\n }\\n return 0;\\n }\\n\\n function touchStorage() public view returns (uint256) {\\n return state;\\n }\\n\\n function touchPaymaster(address paymaster) public view returns (uint256) {\\n return paymaster.code.length;\\n }\\n}\\n\",\"keccak256\":\"0xa0947fb067f107439578ec476a0dfb505179d6320a099ebd0f82cc65b4c7d466\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":20346,"contract":"contracts/test/TestWarmColdAccount.sol:TestWarmColdAccount","label":"ep","offset":0,"slot":"0","type":"t_contract(IEntryPoint)10807"},{"astId":20349,"contract":"contracts/test/TestWarmColdAccount.sol:TestWarmColdAccount","label":"state","offset":0,"slot":"1","type":"t_uint256"}],"types":{"t_contract(IEntryPoint)10807":{"encoding":"inplace","label":"contract IEntryPoint","numberOfBytes":"20"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/mocks/MockFeedRegistry.sol":{"MockFeedRegistry":{"abi":[{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalsOverride","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedReturnValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"newDecimals","type":"uint8"}],"name":"updateDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"newValue","type":"int256"}],"name":"updateFixedRetunValue","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052602d6000556001805460ff1916600817905534801561002257600080fd5b5061031c806100326000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063bcfd032d11610076578063ccd12eee1161005b578063ccd12eee146101b0578063d4c282a3146101bd578063fc58749e146101d357600080fd5b8063bcfd032d14610153578063c91f1327146101a757600080fd5b80630ce83a61146100a857806358e2d3a8146100ec578063672ff44f1461011c57806371963dad14610140575b600080fd5b6100ea6100b63660046101f1565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b005b6101056100fa366004610244565b505060015460ff1690565b60405160ff90911681526020015b60405180910390f35b61013261012a366004610244565b600092915050565b604051908152602001610113565b6100ea61014e366004610277565b600055565b610170610161366004610244565b50600091829150819081908190565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610113565b61013260005481565b6001546101059060ff1681565b6101326101cb366004610244565b505060005490565b6101706101e1366004610290565b5060009283925082915081908190565b60006020828403121561020357600080fd5b813560ff8116811461021457600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461023f57600080fd5b919050565b6000806040838503121561025757600080fd5b6102608361021b565b915061026e6020840161021b565b90509250929050565b60006020828403121561028957600080fd5b5035919050565b6000806000606084860312156102a557600080fd5b6102ae8461021b565b92506102bc6020850161021b565b9150604084013569ffffffffffffffffffff811681146102db57600080fd5b80915050925092509256fea264697066735822122060cc52b260933a3e55c20689d0761b99b1145c5965ce53f21b779d5a751ecdf764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x2D PUSH1 0x0 SSTORE PUSH1 0x1 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x8 OR SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31C DUP1 PUSH2 0x32 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBCFD032D GT PUSH2 0x76 JUMPI DUP1 PUSH4 0xCCD12EEE GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xD4C282A3 EQ PUSH2 0x1BD JUMPI DUP1 PUSH4 0xFC58749E EQ PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBCFD032D EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0xC91F1327 EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCE83A61 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x58E2D3A8 EQ PUSH2 0xEC JUMPI DUP1 PUSH4 0x672FF44F EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0x71963DAD EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEA PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST STOP JUMPDEST PUSH2 0x105 PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x132 PUSH2 0x12A CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x113 JUMP JUMPDEST PUSH2 0xEA PUSH2 0x14E CALLDATASIZE PUSH1 0x4 PUSH2 0x277 JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x170 PUSH2 0x161 CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP PUSH1 0x0 SWAP2 DUP3 SWAP2 POP DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH10 0xFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP6 SWAP1 SWAP6 MSTORE DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x113 JUMP JUMPDEST PUSH2 0x132 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x105 SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x132 PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x170 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x290 JUMP JUMPDEST POP PUSH1 0x0 SWAP3 DUP4 SWAP3 POP DUP3 SWAP2 POP DUP2 SWAP1 DUP2 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 DUP4 PUSH2 0x21B JUMP JUMPDEST SWAP2 POP PUSH2 0x26E PUSH1 0x20 DUP5 ADD PUSH2 0x21B JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x289 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2AE DUP5 PUSH2 0x21B JUMP JUMPDEST SWAP3 POP PUSH2 0x2BC PUSH1 0x20 DUP6 ADD PUSH2 0x21B JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH10 0xFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH1 0xCC MSTORE 0xB2 PUSH1 0x93 GASPRICE RETURNDATACOPY SSTORE 0xC2 MOD DUP10 0xD0 PUSH23 0x1B99B1145C5965CE53F21B779D5A751ECDF764736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"132:1438:108:-:0;;;210:2;177:35;;216:33;;;-1:-1:-1;;216:33:108;248:1;216:33;;;132:1438;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@decimalsOverride_20460":{"entryPoint":null,"id":20460,"parameterSlots":0,"returnSlots":0},"@decimals_20548":{"entryPoint":null,"id":20548,"parameterSlots":2,"returnSlots":1},"@fixedReturnValue_20457":{"entryPoint":null,"id":20457,"parameterSlots":0,"returnSlots":0},"@getRoundData_20512":{"entryPoint":null,"id":20512,"parameterSlots":3,"returnSlots":5},"@latestAnswer_20524":{"entryPoint":null,"id":20524,"parameterSlots":2,"returnSlots":1},"@latestRoundData_20485":{"entryPoint":null,"id":20485,"parameterSlots":2,"returnSlots":5},"@latestTimestamp_20536":{"entryPoint":null,"id":20536,"parameterSlots":2,"returnSlots":1},"@updateDecimals_20568":{"entryPoint":null,"id":20568,"parameterSlots":1,"returnSlots":0},"@updateFixedRetunValue_20558":{"entryPoint":null,"id":20558,"parameterSlots":1,"returnSlots":0},"abi_decode_address":{"entryPoint":539,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_tuple_t_addresst_address":{"entryPoint":580,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_addresst_addresst_uint80":{"entryPoint":656,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_tuple_t_int256":{"entryPoint":631,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint8":{"entryPoint":497,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_int256__to_t_int256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__to_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":6,"returnSlots":1},"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:2448:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"82:201:111","statements":[{"body":{"nodeType":"YulBlock","src":"128:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"137:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"140:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"130:6:111"},"nodeType":"YulFunctionCall","src":"130:12:111"},"nodeType":"YulExpressionStatement","src":"130:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"103:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"112:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"99:3:111"},"nodeType":"YulFunctionCall","src":"99:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"124:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"95:3:111"},"nodeType":"YulFunctionCall","src":"95:32:111"},"nodeType":"YulIf","src":"92:52:111"},{"nodeType":"YulVariableDeclaration","src":"153:36:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"179:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"166:12:111"},"nodeType":"YulFunctionCall","src":"166:23:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"157:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"237:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"246:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"249:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"239:6:111"},"nodeType":"YulFunctionCall","src":"239:12:111"},"nodeType":"YulExpressionStatement","src":"239:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"211:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"222:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"229:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"218:3:111"},"nodeType":"YulFunctionCall","src":"218:16:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"208:2:111"},"nodeType":"YulFunctionCall","src":"208:27:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"201:6:111"},"nodeType":"YulFunctionCall","src":"201:35:111"},"nodeType":"YulIf","src":"198:55:111"},{"nodeType":"YulAssignment","src":"262:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"272:5:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"262:6:111"}]}]},"name":"abi_decode_tuple_t_uint8","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"48:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"59:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"71:6:111","type":""}],"src":"14:269:111"},{"body":{"nodeType":"YulBlock","src":"337:147:111","statements":[{"nodeType":"YulAssignment","src":"347:29:111","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"369:6:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"356:12:111"},"nodeType":"YulFunctionCall","src":"356:20:111"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"347:5:111"}]},{"body":{"nodeType":"YulBlock","src":"462:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"471:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"474:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"464:6:111"},"nodeType":"YulFunctionCall","src":"464:12:111"},"nodeType":"YulExpressionStatement","src":"464:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"398:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"409:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"416:42:111","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"405:3:111"},"nodeType":"YulFunctionCall","src":"405:54:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"395:2:111"},"nodeType":"YulFunctionCall","src":"395:65:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"388:6:111"},"nodeType":"YulFunctionCall","src":"388:73:111"},"nodeType":"YulIf","src":"385:93:111"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"316:6:111","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"327:5:111","type":""}],"src":"288:196:111"},{"body":{"nodeType":"YulBlock","src":"576:173:111","statements":[{"body":{"nodeType":"YulBlock","src":"622:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"631:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"634:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"624:6:111"},"nodeType":"YulFunctionCall","src":"624:12:111"},"nodeType":"YulExpressionStatement","src":"624:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"597:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"606:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"593:3:111"},"nodeType":"YulFunctionCall","src":"593:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"618:2:111","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"589:3:111"},"nodeType":"YulFunctionCall","src":"589:32:111"},"nodeType":"YulIf","src":"586:52:111"},{"nodeType":"YulAssignment","src":"647:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"676:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"657:18:111"},"nodeType":"YulFunctionCall","src":"657:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"647:6:111"}]},{"nodeType":"YulAssignment","src":"695:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"728:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"739:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"724:3:111"},"nodeType":"YulFunctionCall","src":"724:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"705:18:111"},"nodeType":"YulFunctionCall","src":"705:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"695:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"534:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"545:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"557:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"565:6:111","type":""}],"src":"489:260:111"},{"body":{"nodeType":"YulBlock","src":"851:87:111","statements":[{"nodeType":"YulAssignment","src":"861:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"873:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"884:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"869:3:111"},"nodeType":"YulFunctionCall","src":"869:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"861:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"903:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"918:6:111"},{"kind":"number","nodeType":"YulLiteral","src":"926:4:111","type":"","value":"0xff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"914:3:111"},"nodeType":"YulFunctionCall","src":"914:17:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"896:6:111"},"nodeType":"YulFunctionCall","src":"896:36:111"},"nodeType":"YulExpressionStatement","src":"896:36:111"}]},"name":"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"820:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"831:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"842:4:111","type":""}],"src":"754:184:111"},{"body":{"nodeType":"YulBlock","src":"1044:76:111","statements":[{"nodeType":"YulAssignment","src":"1054:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1066:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1077:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1062:3:111"},"nodeType":"YulFunctionCall","src":"1062:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1054:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1096:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1107:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1089:6:111"},"nodeType":"YulFunctionCall","src":"1089:25:111"},"nodeType":"YulExpressionStatement","src":"1089:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1013:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1024:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1035:4:111","type":""}],"src":"943:177:111"},{"body":{"nodeType":"YulBlock","src":"1194:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"1240:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1249:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1252:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1242:6:111"},"nodeType":"YulFunctionCall","src":"1242:12:111"},"nodeType":"YulExpressionStatement","src":"1242:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"1215:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"1224:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1211:3:111"},"nodeType":"YulFunctionCall","src":"1211:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"1236:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"1207:3:111"},"nodeType":"YulFunctionCall","src":"1207:32:111"},"nodeType":"YulIf","src":"1204:52:111"},{"nodeType":"YulAssignment","src":"1265:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1288:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1275:12:111"},"nodeType":"YulFunctionCall","src":"1275:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"1265:6:111"}]}]},"name":"abi_decode_tuple_t_int256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1160:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"1171:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"1183:6:111","type":""}],"src":"1125:179:111"},{"body":{"nodeType":"YulBlock","src":"1516:309:111","statements":[{"nodeType":"YulAssignment","src":"1526:27:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1538:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1549:3:111","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1534:3:111"},"nodeType":"YulFunctionCall","src":"1534:19:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1526:4:111"}]},{"nodeType":"YulVariableDeclaration","src":"1562:32:111","value":{"kind":"number","nodeType":"YulLiteral","src":"1572:22:111","type":"","value":"0xffffffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"1566:2:111","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1610:9:111"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"1625:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1633:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1621:3:111"},"nodeType":"YulFunctionCall","src":"1621:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1603:6:111"},"nodeType":"YulFunctionCall","src":"1603:34:111"},"nodeType":"YulExpressionStatement","src":"1603:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1657:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1668:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1653:3:111"},"nodeType":"YulFunctionCall","src":"1653:18:111"},{"name":"value1","nodeType":"YulIdentifier","src":"1673:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1646:6:111"},"nodeType":"YulFunctionCall","src":"1646:34:111"},"nodeType":"YulExpressionStatement","src":"1646:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1700:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1711:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1696:3:111"},"nodeType":"YulFunctionCall","src":"1696:18:111"},{"name":"value2","nodeType":"YulIdentifier","src":"1716:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1689:6:111"},"nodeType":"YulFunctionCall","src":"1689:34:111"},"nodeType":"YulExpressionStatement","src":"1689:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1743:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1754:2:111","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1739:3:111"},"nodeType":"YulFunctionCall","src":"1739:18:111"},{"name":"value3","nodeType":"YulIdentifier","src":"1759:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1732:6:111"},"nodeType":"YulFunctionCall","src":"1732:34:111"},"nodeType":"YulExpressionStatement","src":"1732:34:111"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1786:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1797:3:111","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1782:3:111"},"nodeType":"YulFunctionCall","src":"1782:19:111"},{"arguments":[{"name":"value4","nodeType":"YulIdentifier","src":"1807:6:111"},{"name":"_1","nodeType":"YulIdentifier","src":"1815:2:111"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1803:3:111"},"nodeType":"YulFunctionCall","src":"1803:15:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1775:6:111"},"nodeType":"YulFunctionCall","src":"1775:44:111"},"nodeType":"YulExpressionStatement","src":"1775:44:111"}]},"name":"abi_encode_tuple_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__to_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1453:9:111","type":""},{"name":"value4","nodeType":"YulTypedName","src":"1464:6:111","type":""},{"name":"value3","nodeType":"YulTypedName","src":"1472:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"1480:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"1488:6:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1496:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1507:4:111","type":""}],"src":"1309:516:111"},{"body":{"nodeType":"YulBlock","src":"1929:76:111","statements":[{"nodeType":"YulAssignment","src":"1939:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1951:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"1962:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1947:3:111"},"nodeType":"YulFunctionCall","src":"1947:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"1939:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"1981:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"1992:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1974:6:111"},"nodeType":"YulFunctionCall","src":"1974:25:111"},"nodeType":"YulExpressionStatement","src":"1974:25:111"}]},"name":"abi_encode_tuple_t_int256__to_t_int256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"1898:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"1909:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"1920:4:111","type":""}],"src":"1830:175:111"},{"body":{"nodeType":"YulBlock","src":"2113:333:111","statements":[{"body":{"nodeType":"YulBlock","src":"2159:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2168:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2171:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2161:6:111"},"nodeType":"YulFunctionCall","src":"2161:12:111"},"nodeType":"YulExpressionStatement","src":"2161:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2134:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"2143:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2130:3:111"},"nodeType":"YulFunctionCall","src":"2130:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"2155:2:111","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2126:3:111"},"nodeType":"YulFunctionCall","src":"2126:32:111"},"nodeType":"YulIf","src":"2123:52:111"},{"nodeType":"YulAssignment","src":"2184:39:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2213:9:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2194:18:111"},"nodeType":"YulFunctionCall","src":"2194:29:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2184:6:111"}]},{"nodeType":"YulAssignment","src":"2232:48:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2265:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2276:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2261:3:111"},"nodeType":"YulFunctionCall","src":"2261:18:111"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"2242:18:111"},"nodeType":"YulFunctionCall","src":"2242:38:111"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"2232:6:111"}]},{"nodeType":"YulVariableDeclaration","src":"2289:45:111","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2319:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"2330:2:111","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2315:3:111"},"nodeType":"YulFunctionCall","src":"2315:18:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2302:12:111"},"nodeType":"YulFunctionCall","src":"2302:32:111"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2293:5:111","type":""}]},{"body":{"nodeType":"YulBlock","src":"2400:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2409:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2412:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2402:6:111"},"nodeType":"YulFunctionCall","src":"2402:12:111"},"nodeType":"YulExpressionStatement","src":"2402:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2356:5:111"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2367:5:111"},{"kind":"number","nodeType":"YulLiteral","src":"2374:22:111","type":"","value":"0xffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2363:3:111"},"nodeType":"YulFunctionCall","src":"2363:34:111"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"2353:2:111"},"nodeType":"YulFunctionCall","src":"2353:45:111"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2346:6:111"},"nodeType":"YulFunctionCall","src":"2346:53:111"},"nodeType":"YulIf","src":"2343:73:111"},{"nodeType":"YulAssignment","src":"2425:15:111","value":{"name":"value","nodeType":"YulIdentifier","src":"2435:5:111"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"2425:6:111"}]}]},"name":"abi_decode_tuple_t_addresst_addresst_uint80","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2063:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2074:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2086:6:111","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2094:6:111","type":""},{"name":"value2","nodeType":"YulTypedName","src":"2102:6:111","type":""}],"src":"2010:436:111"}]},"contents":"{\n { }\n function abi_decode_tuple_t_uint8(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n value0 := value\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_int256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__to_t_uint80_t_int256_t_uint256_t_uint256_t_uint80__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n let _1 := 0xffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), and(value4, _1))\n }\n function abi_encode_tuple_t_int256__to_t_int256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint80(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n let value := calldataload(add(headStart, 64))\n if iszero(eq(value, and(value, 0xffffffffffffffffffff))) { revert(0, 0) }\n value2 := value\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100a35760003560e01c8063bcfd032d11610076578063ccd12eee1161005b578063ccd12eee146101b0578063d4c282a3146101bd578063fc58749e146101d357600080fd5b8063bcfd032d14610153578063c91f1327146101a757600080fd5b80630ce83a61146100a857806358e2d3a8146100ec578063672ff44f1461011c57806371963dad14610140575b600080fd5b6100ea6100b63660046101f1565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b005b6101056100fa366004610244565b505060015460ff1690565b60405160ff90911681526020015b60405180910390f35b61013261012a366004610244565b600092915050565b604051908152602001610113565b6100ea61014e366004610277565b600055565b610170610161366004610244565b50600091829150819081908190565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610113565b61013260005481565b6001546101059060ff1681565b6101326101cb366004610244565b505060005490565b6101706101e1366004610290565b5060009283925082915081908190565b60006020828403121561020357600080fd5b813560ff8116811461021457600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461023f57600080fd5b919050565b6000806040838503121561025757600080fd5b6102608361021b565b915061026e6020840161021b565b90509250929050565b60006020828403121561028957600080fd5b5035919050565b6000806000606084860312156102a557600080fd5b6102ae8461021b565b92506102bc6020850161021b565b9150604084013569ffffffffffffffffffff811681146102db57600080fd5b80915050925092509256fea264697066735822122060cc52b260933a3e55c20689d0761b99b1145c5965ce53f21b779d5a751ecdf764736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBCFD032D GT PUSH2 0x76 JUMPI DUP1 PUSH4 0xCCD12EEE GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0xD4C282A3 EQ PUSH2 0x1BD JUMPI DUP1 PUSH4 0xFC58749E EQ PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBCFD032D EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0xC91F1327 EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xCE83A61 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x58E2D3A8 EQ PUSH2 0xEC JUMPI DUP1 PUSH4 0x672FF44F EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0x71963DAD EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEA PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1F1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST STOP JUMPDEST PUSH2 0x105 PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x132 PUSH2 0x12A CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x113 JUMP JUMPDEST PUSH2 0xEA PUSH2 0x14E CALLDATASIZE PUSH1 0x4 PUSH2 0x277 JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH2 0x170 PUSH2 0x161 CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP PUSH1 0x0 SWAP2 DUP3 SWAP2 POP DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH10 0xFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP6 SWAP1 SWAP6 MSTORE DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x113 JUMP JUMPDEST PUSH2 0x132 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x105 SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x132 PUSH2 0x1CB CALLDATASIZE PUSH1 0x4 PUSH2 0x244 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x170 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x290 JUMP JUMPDEST POP PUSH1 0x0 SWAP3 DUP4 SWAP3 POP DUP3 SWAP2 POP DUP2 SWAP1 DUP2 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 DUP4 PUSH2 0x21B JUMP JUMPDEST SWAP2 POP PUSH2 0x26E PUSH1 0x20 DUP5 ADD PUSH2 0x21B JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x289 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2AE DUP5 PUSH2 0x21B JUMP JUMPDEST SWAP3 POP PUSH2 0x2BC PUSH1 0x20 DUP6 ADD PUSH2 0x21B JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH10 0xFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH1 0xCC MSTORE 0xB2 PUSH1 0x93 GASPRICE RETURNDATACOPY SSTORE 0xC2 MOD DUP10 0xD0 PUSH23 0x1B99B1145C5965CE53F21B779D5A751ECDF764736F6C63 NUMBER STOP ADDMOD 0xF STOP CALLER ","sourceMap":"132:1438:108:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1448:120;;;;;;:::i;:::-;1531:16;:30;;;;;;;;;;;;;;;1448:120;;;1163:151;;;;;;:::i;:::-;-1:-1:-1;;1291:16:108;;;;;1163:151;;;;926:4:111;914:17;;;896:36;;884:2;869:18;1163:151:108;;;;;;;;1004:155;;;;;;:::i;:::-;1112:17;1004:155;;;;;;;;1089:25:111;;;1077:2;1062:18;1004:155:108;943:177:111;1320:122:108;;;;;;:::i;:::-;1408:16;:27;1320:122;254:263;;;;;;:::i;:::-;-1:-1:-1;362:14:108;;;;-1:-1:-1;362:14:108;;;;;;254:263;;;;;1572:22:111;1621:15;;;1603:34;;1668:2;1653:18;;1646:34;;;;1696:18;;1689:34;;;;1754:2;1739:18;;1732:34;1803:15;;;1797:3;1782:19;;1775:44;1549:3;1534:19;254:263:108;1309:516:111;177:35:108;;;;;;216:33;;;;;;;;;835:165;;;;;;:::i;:::-;-1:-1:-1;;940:13:108;977:16;;835:165;521:281;;;;;;:::i;:::-;-1:-1:-1;647:14:108;;;;-1:-1:-1;647:14:108;;-1:-1:-1;647:14:108;;;;521:281;14:269:111;71:6;124:2;112:9;103:7;99:23;95:32;92:52;;;140:1;137;130:12;92:52;179:9;166:23;229:4;222:5;218:16;211:5;208:27;198:55;;249:1;246;239:12;198:55;272:5;14:269;-1:-1:-1;;;14:269:111:o;288:196::-;356:20;;416:42;405:54;;395:65;;385:93;;474:1;471;464:12;385:93;288:196;;;:::o;489:260::-;557:6;565;618:2;606:9;597:7;593:23;589:32;586:52;;;634:1;631;624:12;586:52;657:29;676:9;657:29;:::i;:::-;647:39;;705:38;739:2;728:9;724:18;705:38;:::i;:::-;695:48;;489:260;;;;;:::o;1125:179::-;1183:6;1236:2;1224:9;1215:7;1211:23;1207:32;1204:52;;;1252:1;1249;1242:12;1204:52;-1:-1:-1;1275:23:111;;1125:179;-1:-1:-1;1125:179:111:o;2010:436::-;2086:6;2094;2102;2155:2;2143:9;2134:7;2130:23;2126:32;2123:52;;;2171:1;2168;2161:12;2123:52;2194:29;2213:9;2194:29;:::i;:::-;2184:39;;2242:38;2276:2;2265:9;2261:18;2242:38;:::i;:::-;2232:48;;2330:2;2319:9;2315:18;2302:32;2374:22;2367:5;2363:34;2356:5;2353:45;2343:73;;2412:1;2409;2402:12;2343:73;2435:5;2425:15;;;2010:436;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"159200","executionCost":"46532","totalCost":"205732"},"external":{"decimals(address,address)":"infinite","decimalsOverride()":"2324","fixedReturnValue()":"2340","getRoundData(address,address,uint80)":"infinite","latestAnswer(address,address)":"infinite","latestRoundData(address,address)":"infinite","latestTimestamp(address,address)":"infinite","updateDecimals(uint8)":"24486","updateFixedRetunValue(int256)":"22379"}},"methodIdentifiers":{"decimals(address,address)":"58e2d3a8","decimalsOverride()":"ccd12eee","fixedReturnValue()":"c91f1327","getRoundData(address,address,uint80)":"fc58749e","latestAnswer(address,address)":"d4c282a3","latestRoundData(address,address)":"bcfd032d","latestTimestamp(address,address)":"672ff44f","updateDecimals(uint8)":"0ce83a61","updateFixedRetunValue(int256)":"71963dad"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimalsOverride\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fixedReturnValue\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"},{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"newDecimals\",\"type\":\"uint8\"}],\"name\":\"updateDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"newValue\",\"type\":\"int256\"}],\"name\":\"updateFixedRetunValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockFeedRegistry.sol\":\"MockFeedRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IBobaStraw.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaStraw {\\n function latestRoundData(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n function getRoundData(\\n address base,\\n address quote,\\n uint80 _roundId\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n );\\n\\n // V2 AggregatorInterface\\n\\n function latestAnswer(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n int256 answer\\n );\\n\\n function latestTimestamp(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint256 timestamp\\n );\\n\\n function decimals(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint8\\n );\\n}\\n\",\"keccak256\":\"0x9983613a78d9398928dae53c2701b419811ba055fd716dadf638a78d6b52577e\",\"license\":\"MIT\"},\"contracts/test/mocks/MockFeedRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../../samples/IBobaStraw.sol\\\";\\n\\ncontract MockFeedRegistry is IBobaStraw {\\n\\n int256 public fixedReturnValue = 45;\\n uint8 public decimalsOverride = 8;\\n\\n function latestRoundData(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n ) {\\n return (0,0,0,0,0);\\n }\\n\\n function getRoundData(\\n address base,\\n address quote,\\n uint80 _roundId\\n )\\n external\\n view\\n returns (\\n uint80 roundId,\\n int256 answer,\\n uint256 startedAt,\\n uint256 updatedAt,\\n uint80 answeredInRound\\n ) {\\n return (0,0,0,0,0);\\n }\\n\\n // V2 AggregatorInterface\\n\\n function latestAnswer(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n int256 answer\\n ) {\\n return fixedReturnValue;\\n }\\n\\n function latestTimestamp(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint256 timestamp\\n ) {\\n return 0;\\n }\\n\\n function decimals(\\n address base,\\n address quote\\n )\\n external\\n view\\n returns (\\n uint8\\n ) {\\n return decimalsOverride;\\n }\\n\\n function updateFixedRetunValue(\\n int256 newValue\\n )\\n external\\n {\\n fixedReturnValue = newValue;\\n }\\n\\n function updateDecimals(\\n uint8 newDecimals\\n )\\n external\\n {\\n decimalsOverride = newDecimals;\\n }\\n}\\n\",\"keccak256\":\"0x99504f12d34e0a17ced430fb1bc4d98e4fe3618589fcba75fa8bc23e78b6fd6f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":20457,"contract":"contracts/test/mocks/MockFeedRegistry.sol:MockFeedRegistry","label":"fixedReturnValue","offset":0,"slot":"0","type":"t_int256"},{"astId":20460,"contract":"contracts/test/mocks/MockFeedRegistry.sol:MockFeedRegistry","label":"decimalsOverride","offset":0,"slot":"1","type":"t_uint8"}],"types":{"t_int256":{"encoding":"inplace","label":"int256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/test/mocks/MockGasPriceOracle.sol":{"MockGasPriceOracle":{"abi":[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalsOverride","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedReturnValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDecimals","type":"uint256"}],"name":"updateDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateFixedRetunValue","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080604052602d600055600860015534801561001a57600080fd5b5061010b8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060695760003560e01c806366675c5711604a57806366675c5714609d578063c91f13271460ad578063ccd12eee1460b557600080fd5b80630aa2f42014606e57806319dd3a34146084578063313ce567146096575b600080fd5b6000545b60405190815260200160405180910390f35b6094608f36600460bd565b600055565b005b6001546072565b609460a836600460bd565b600155565b607260005481565b607260015481565b60006020828403121560ce57600080fd5b503591905056fea26469706673582212201be44c5a852cd36d82ee7cdfae7e4b845ff9e9129e3d5609a9295e49eebf272f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x2D PUSH1 0x0 SSTORE PUSH1 0x8 PUSH1 0x1 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B DUP1 PUSH2 0x2A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x69 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x66675C57 GT PUSH1 0x4A JUMPI DUP1 PUSH4 0x66675C57 EQ PUSH1 0x9D JUMPI DUP1 PUSH4 0xC91F1327 EQ PUSH1 0xAD JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH1 0xB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xAA2F420 EQ PUSH1 0x6E JUMPI DUP1 PUSH4 0x19DD3A34 EQ PUSH1 0x84 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH1 0x96 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x94 PUSH1 0x8F CALLDATASIZE PUSH1 0x4 PUSH1 0xBD JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST STOP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x72 JUMP JUMPDEST PUSH1 0x94 PUSH1 0xA8 CALLDATASIZE PUSH1 0x4 PUSH1 0xBD JUMP JUMPDEST PUSH1 0x1 SSTORE JUMP JUMPDEST PUSH1 0x72 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x72 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH1 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL 0xE4 0x4C GAS DUP6 0x2C 0xD3 PUSH14 0x82EE7CDFAE7E4B845FF9E9129E3D JUMP MULMOD 0xA9 0x29 0x5E 0x49 0xEE 0xBF 0x27 0x2F PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"141:526:109:-:0;;;230:2;196:36;;270:1;236:35;;141:526;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"@decimalsOverride_20581":{"entryPoint":null,"id":20581,"parameterSlots":0,"returnSlots":0},"@decimals_20589":{"entryPoint":null,"id":20589,"parameterSlots":0,"returnSlots":1},"@fixedReturnValue_20578":{"entryPoint":null,"id":20578,"parameterSlots":0,"returnSlots":0},"@priceRatio_20597":{"entryPoint":null,"id":20597,"parameterSlots":0,"returnSlots":1},"@updateDecimals_20617":{"entryPoint":null,"id":20617,"parameterSlots":1,"returnSlots":0},"@updateFixedRetunValue_20607":{"entryPoint":null,"id":20607,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_uint256":{"entryPoint":189,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:378:111","statements":[{"nodeType":"YulBlock","src":"6:3:111","statements":[]},{"body":{"nodeType":"YulBlock","src":"115:76:111","statements":[{"nodeType":"YulAssignment","src":"125:26:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"137:9:111"},{"kind":"number","nodeType":"YulLiteral","src":"148:2:111","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"133:3:111"},"nodeType":"YulFunctionCall","src":"133:18:111"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"125:4:111"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"167:9:111"},{"name":"value0","nodeType":"YulIdentifier","src":"178:6:111"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"160:6:111"},"nodeType":"YulFunctionCall","src":"160:25:111"},"nodeType":"YulExpressionStatement","src":"160:25:111"}]},"name":"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"84:9:111","type":""},{"name":"value0","nodeType":"YulTypedName","src":"95:6:111","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"106:4:111","type":""}],"src":"14:177:111"},{"body":{"nodeType":"YulBlock","src":"266:110:111","statements":[{"body":{"nodeType":"YulBlock","src":"312:16:111","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"321:1:111","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"324:1:111","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"314:6:111"},"nodeType":"YulFunctionCall","src":"314:12:111"},"nodeType":"YulExpressionStatement","src":"314:12:111"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"287:7:111"},{"name":"headStart","nodeType":"YulIdentifier","src":"296:9:111"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"283:3:111"},"nodeType":"YulFunctionCall","src":"283:23:111"},{"kind":"number","nodeType":"YulLiteral","src":"308:2:111","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"279:3:111"},"nodeType":"YulFunctionCall","src":"279:32:111"},"nodeType":"YulIf","src":"276:52:111"},{"nodeType":"YulAssignment","src":"337:33:111","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"360:9:111"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"347:12:111"},"nodeType":"YulFunctionCall","src":"347:23:111"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"337:6:111"}]}]},"name":"abi_decode_tuple_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"232:9:111","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"243:7:111","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"255:6:111","type":""}],"src":"196:180:111"}]},"contents":"{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n}","id":111,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"6080604052348015600f57600080fd5b506004361060695760003560e01c806366675c5711604a57806366675c5714609d578063c91f13271460ad578063ccd12eee1460b557600080fd5b80630aa2f42014606e57806319dd3a34146084578063313ce567146096575b600080fd5b6000545b60405190815260200160405180910390f35b6094608f36600460bd565b600055565b005b6001546072565b609460a836600460bd565b600155565b607260005481565b607260015481565b60006020828403121560ce57600080fd5b503591905056fea26469706673582212201be44c5a852cd36d82ee7cdfae7e4b845ff9e9129e3d5609a9295e49eebf272f64736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x69 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x66675C57 GT PUSH1 0x4A JUMPI DUP1 PUSH4 0x66675C57 EQ PUSH1 0x9D JUMPI DUP1 PUSH4 0xC91F1327 EQ PUSH1 0xAD JUMPI DUP1 PUSH4 0xCCD12EEE EQ PUSH1 0xB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xAA2F420 EQ PUSH1 0x6E JUMPI DUP1 PUSH4 0x19DD3A34 EQ PUSH1 0x84 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH1 0x96 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x94 PUSH1 0x8F CALLDATASIZE PUSH1 0x4 PUSH1 0xBD JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST STOP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x72 JUMP JUMPDEST PUSH1 0x94 PUSH1 0xA8 CALLDATASIZE PUSH1 0x4 PUSH1 0xBD JUMP JUMPDEST PUSH1 0x1 SSTORE JUMP JUMPDEST PUSH1 0x72 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x72 PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH1 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL 0xE4 0x4C GAS DUP6 0x2C 0xD3 PUSH14 0x82EE7CDFAE7E4B845FF9E9129E3D JUMP MULMOD 0xA9 0x29 0x5E 0x49 0xEE 0xBF 0x27 0x2F PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP CALLER ","sourceMap":"141:526:109:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;366:88;411:7;433:16;366:88;;;160:25:111;;;148:2;133:18;366:88:109;;;;;;;458:102;;;;;;:::i;:::-;526:16;:27;458:102;;;276:86;341:16;;276:86;;564:101;;;;;;:::i;:::-;628:16;:30;564:101;196:36;;;;;;236:35;;;;;;196:180:111;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:111;;196:180;-1:-1:-1;196:180:111:o"},"gasEstimates":{"creation":{"codeDepositCost":"53400","executionCost":"44317","totalCost":"97717"},"external":{"decimals()":"2325","decimalsOverride()":"2327","fixedReturnValue()":"2305","priceRatio()":"2270","updateDecimals(uint256)":"22312","updateFixedRetunValue(uint256)":"22335"}},"methodIdentifiers":{"decimals()":"313ce567","decimalsOverride()":"ccd12eee","fixedReturnValue()":"c91f1327","priceRatio()":"0aa2f420","updateDecimals(uint256)":"66675c57","updateFixedRetunValue(uint256)":"19dd3a34"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimalsOverride\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fixedReturnValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDecimals\",\"type\":\"uint256\"}],\"name\":\"updateDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"updateFixedRetunValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockGasPriceOracle.sol\":\"MockGasPriceOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/samples/IBobaGasPriceOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\ninterface IBobaGasPriceOracle {\\n function decimals() external view returns (uint256);\\n\\n function priceRatio() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe27046c185bf441cde5a28fe070bf0957322bd882aab30a9646994e0346bbaf8\",\"license\":\"MIT\"},\"contracts/test/mocks/MockGasPriceOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../../samples/IBobaGasPriceOracle.sol\\\";\\n\\ncontract MockGasPriceOracle is IBobaGasPriceOracle {\\n uint256 public fixedReturnValue = 45;\\n uint256 public decimalsOverride = 8;\\n\\n function decimals() external view returns (uint256) {\\n return decimalsOverride;\\n }\\n\\n function priceRatio() external view returns (uint256) {\\n return fixedReturnValue;\\n }\\n\\n function updateFixedRetunValue(uint256 newValue) external {\\n fixedReturnValue = newValue;\\n }\\n\\n function updateDecimals(uint256 newDecimals) external {\\n decimalsOverride = newDecimals;\\n }\\n}\",\"keccak256\":\"0xc575733586f186aba500c71a6175a51aa8376ff7a70a70620daa0ca474f294ae\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":20578,"contract":"contracts/test/mocks/MockGasPriceOracle.sol:MockGasPriceOracle","label":"fixedReturnValue","offset":0,"slot":"0","type":"t_uint256"},{"astId":20581,"contract":"contracts/test/mocks/MockGasPriceOracle.sol:MockGasPriceOracle","label":"decimalsOverride","offset":0,"slot":"1","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/utils/Exec.sol":{"Exec":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201c37327e5ecd630fb365f28619cf87a5bd9721e2bf15a309e885e0c3421fc08864736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR CALLDATACOPY ORIGIN PUSH31 0x5ECD630FB365F28619CF87A5BD9721E2BF15A309E885E0C3421FC08864736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"210:1759:110:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;210:1759:110;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201c37327e5ecd630fb365f28619cf87a5bd9721e2bf15a309e885e0c3421fc08864736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR CALLDATACOPY ORIGIN PUSH31 0x5ECD630FB365F28619CF87A5BD9721E2BF15A309E885E0C3421FC08864736F PUSH13 0x634300080F0033000000000000 ","sourceMap":"210:1759:110:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"call(address,uint256,bytes memory,uint256)":"infinite","callAndRevert(address,bytes memory,uint256)":"infinite","delegateCall(address,bytes memory,uint256)":"infinite","getReturnData(uint256)":"infinite","revertWithData(bytes memory)":"infinite","staticcall(address,bytes memory,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when making different kinds of contract calls in Solidity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/Exec.sol\":\"Exec\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n\\n function call(\\n address to,\\n uint256 value,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function staticcall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal view returns (bool success) {\\n assembly {\\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n function delegateCall(\\n address to,\\n bytes memory data,\\n uint256 txGas\\n ) internal returns (bool success) {\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n }\\n\\n // get returned data from last call or calldelegate\\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\\n assembly {\\n let len := returndatasize()\\n if gt(len, maxLen) {\\n len := maxLen\\n }\\n let ptr := mload(0x40)\\n mstore(0x40, add(ptr, add(len, 0x20)))\\n mstore(ptr, len)\\n returndatacopy(add(ptr, 0x20), 0, len)\\n returnData := ptr\\n }\\n }\\n\\n // revert with explicit byte array (probably reverted info from call)\\n function revertWithData(bytes memory returnData) internal pure {\\n assembly {\\n revert(add(returnData, 32), mload(returnData))\\n }\\n }\\n\\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\\n bool success = call(to,0,data,gasleft());\\n if (!success) {\\n revertWithData(getReturnData(maxLen));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Utility functions helpful when making different kinds of contract calls in Solidity.","version":1}}}}}} \ No newline at end of file diff --git a/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/fbc1c92fb2a258862280859a54359423.json b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/fbc1c92fb2a258862280859a54359423.json new file mode 100644 index 0000000000..46cf66dd83 --- /dev/null +++ b/packages/boba/account-abstraction/deployments/boba_goerli/solcInputs/fbc1c92fb2a258862280859a54359423.json @@ -0,0 +1 @@ +{"id":"fbc1c92fb2a258862280859a54359423","_format":"hh-sol-build-info-1","solcVersion":"0.8.15","solcLongVersion":"0.8.15+commit.e14f2714","input":{"language":"Solidity","sources":{"contracts/bundler/EntryPointWrapper.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IEntryPoint.sol\";\n\ncontract EntryPointWrapper {\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n struct FailedOpStatus {\n bool status;\n uint256 opIndex;\n string reason;\n }\n\n struct Response {\n string selectorType;\n ReturnInfo returnInfo;\n StakeInfo senderInfo;\n StakeInfo factoryInfo;\n StakeInfo paymasterInfo;\n AggregatorStakeInfo aggregatorInfo;\n }\n\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n IEntryPoint public entryPoint;\n\n StakeInfo private emptyStakeInfo = StakeInfo(0, 0);\n AggregatorStakeInfo private emptyAggregatorInfo = AggregatorStakeInfo(address(0), emptyStakeInfo);\n ReturnInfo private emptyReturnInfo = ReturnInfo(0, 0, false, 0, 0, new bytes(0));\n Response private emptyResponse = Response(\"\", emptyReturnInfo, emptyStakeInfo, emptyStakeInfo, emptyStakeInfo, emptyAggregatorInfo);\n FailedOpStatus private emptyFailedOp = FailedOpStatus(false, 0, \"\");\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n }\n\n function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n try entryPoint.simulateValidation(userOp) {}\n catch (bytes memory revertData) {\n bytes4 receivedSelector = bytes4(revertData);\n\n if (receivedSelector == ValidationResult.selector) {\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo));\n return (emptyFailedOp, Response('ValidationResult', returnInfo, senderInfo, factoryInfo, paymasterInfo, emptyAggregatorInfo));\n } else if (receivedSelector == ValidationResultWithAggregation.selector) {\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo, AggregatorStakeInfo memory aggregatorInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo, AggregatorStakeInfo));\n return (emptyFailedOp, Response('ValidationResultWithAggregation', returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo));\n } else if (receivedSelector == FailedOp.selector){\n (uint256 opIndex, string memory reason) = abi.decode(slice(revertData, 4, revertData.length - 4), (uint256, string));\n return (FailedOpStatus(true, opIndex, reason), emptyResponse);\n }\n }\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\n ret = new bytes32[](userOps.length);\n for (uint i = 0; i < userOps.length; i++) {\n ret[i] = entryPoint.getUserOpHash(userOps[i]);\n }\n return ret;\n }\n\n function getCodeHashes(address[] memory addresses) public view returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](addresses.length);\n for (uint i = 0; i < addresses.length; i++) {\n hashes[i] = addresses[i].codehash;\n }\n bytes memory data = abi.encode(hashes);\n return (keccak256(data));\n }\n\n function getSenderAddress(bytes calldata initCode) external returns (address) {\n try entryPoint.getSenderAddress(initCode) {}\n catch (bytes memory revertData) {\n bytes4 receivedSelector = bytes4(revertData);\n\n if (receivedSelector == SenderAddressResult.selector) {\n address sender = abi.decode(slice(revertData, 4, revertData.length - 4), (address));\n return sender;\n } else {\n revert (\"Invalid initCode\");\n }\n }\n }\n}\n"},"contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n"},"contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"},"contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"},"contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"},"contracts/interfaces/UserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":10000},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"metadata":{"useLiteralContent":true}}},"output":{"errors":[{"component":"general","errorCode":"2519","formattedMessage":"Warning: This declaration shadows an existing declaration.\n --> contracts/bundler/EntryPointWrapper.sol:197:30:\n |\n197 | function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\n | ^^^^^^^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n --> contracts/bundler/EntryPointWrapper.sol:98:5:\n |\n98 | IEntryPoint public entryPoint;\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n","message":"This declaration shadows an existing declaration.","secondarySourceLocations":[{"end":3816,"file":"contracts/bundler/EntryPointWrapper.sol","message":"The shadowed declaration is here:","start":3787}],"severity":"warning","sourceLocation":{"end":8804,"file":"contracts/bundler/EntryPointWrapper.sol","start":8782},"type":"Warning"},{"component":"general","errorCode":"6321","formattedMessage":"Warning: Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n --> contracts/bundler/EntryPointWrapper.sol:110:82:\n |\n110 | function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n | ^^^^^^^^^^^^^^^^^^^^^\n\n","message":"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.","severity":"warning","sourceLocation":{"end":4461,"file":"contracts/bundler/EntryPointWrapper.sol","start":4440},"type":"Warning"},{"component":"general","errorCode":"6321","formattedMessage":"Warning: Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n --> contracts/bundler/EntryPointWrapper.sol:110:105:\n |\n110 | function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\n | ^^^^^^^^^^^^^^^\n\n","message":"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.","severity":"warning","sourceLocation":{"end":4478,"file":"contracts/bundler/EntryPointWrapper.sol","start":4463},"type":"Warning"},{"component":"general","errorCode":"6321","formattedMessage":"Warning: Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n --> contracts/bundler/EntryPointWrapper.sol:214:74:\n |\n214 | function getSenderAddress(bytes calldata initCode) external returns (address) {\n | ^^^^^^^\n\n","message":"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.","severity":"warning","sourceLocation":{"end":9510,"file":"contracts/bundler/EntryPointWrapper.sol","start":9503},"type":"Warning"}],"sources":{"contracts/bundler/EntryPointWrapper.sol":{"ast":{"absolutePath":"contracts/bundler/EntryPointWrapper.sol","exportedSymbols":{"EntryPointWrapper":[522],"IAggregator":[794],"IEntryPoint":[998],"INonceManager":[1017],"IStakeManager":[1122],"UserOperation":[1149],"UserOperationLib":[1319],"calldataKeccak":[760]},"id":523,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:0"},{"absolutePath":"contracts/interfaces/IEntryPoint.sol","file":"../interfaces/IEntryPoint.sol","id":2,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":523,"sourceUnit":999,"src":"148:39:0","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"EntryPointWrapper","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":522,"linearizedBaseContracts":[522],"name":"EntryPointWrapper","nameLocation":"198:17:0","nodeType":"ContractDefinition","nodes":[{"canonicalName":"EntryPointWrapper.ReturnInfo","id":15,"members":[{"constant":false,"id":4,"mutability":"mutable","name":"preOpGas","nameLocation":"851:8:0","nodeType":"VariableDeclaration","scope":15,"src":"843:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3,"name":"uint256","nodeType":"ElementaryTypeName","src":"843:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":6,"mutability":"mutable","name":"prefund","nameLocation":"877:7:0","nodeType":"VariableDeclaration","scope":15,"src":"869:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5,"name":"uint256","nodeType":"ElementaryTypeName","src":"869:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8,"mutability":"mutable","name":"sigFailed","nameLocation":"899:9:0","nodeType":"VariableDeclaration","scope":15,"src":"894:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7,"name":"bool","nodeType":"ElementaryTypeName","src":"894:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10,"mutability":"mutable","name":"validAfter","nameLocation":"925:10:0","nodeType":"VariableDeclaration","scope":15,"src":"918:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":9,"name":"uint48","nodeType":"ElementaryTypeName","src":"918:6:0","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":12,"mutability":"mutable","name":"validUntil","nameLocation":"952:10:0","nodeType":"VariableDeclaration","scope":15,"src":"945:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":11,"name":"uint48","nodeType":"ElementaryTypeName","src":"945:6:0","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":14,"mutability":"mutable","name":"paymasterContext","nameLocation":"978:16:0","nodeType":"VariableDeclaration","scope":15,"src":"972:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":13,"name":"bytes","nodeType":"ElementaryTypeName","src":"972:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"822:10:0","nodeType":"StructDefinition","scope":522,"src":"815:186:0","visibility":"public"},{"canonicalName":"EntryPointWrapper.StakeInfo","id":20,"members":[{"constant":false,"id":17,"mutability":"mutable","name":"stake","nameLocation":"1042:5:0","nodeType":"VariableDeclaration","scope":20,"src":"1034:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16,"name":"uint256","nodeType":"ElementaryTypeName","src":"1034:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1065:15:0","nodeType":"VariableDeclaration","scope":20,"src":"1057:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18,"name":"uint256","nodeType":"ElementaryTypeName","src":"1057:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1014:9:0","nodeType":"StructDefinition","scope":522,"src":"1007:80:0","visibility":"public"},{"canonicalName":"EntryPointWrapper.AggregatorStakeInfo","id":26,"members":[{"constant":false,"id":22,"mutability":"mutable","name":"aggregator","nameLocation":"1267:10:0","nodeType":"VariableDeclaration","scope":26,"src":"1259:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21,"name":"address","nodeType":"ElementaryTypeName","src":"1259:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25,"mutability":"mutable","name":"stakeInfo","nameLocation":"1297:9:0","nodeType":"VariableDeclaration","scope":26,"src":"1287:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":24,"nodeType":"UserDefinedTypeName","pathNode":{"id":23,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"1287:9:0"},"referencedDeclaration":20,"src":"1287:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"1229:19:0","nodeType":"StructDefinition","scope":522,"src":"1222:91:0","visibility":"public"},{"canonicalName":"EntryPointWrapper.FailedOpStatus","id":33,"members":[{"constant":false,"id":28,"mutability":"mutable","name":"status","nameLocation":"1356:6:0","nodeType":"VariableDeclaration","scope":33,"src":"1351:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27,"name":"bool","nodeType":"ElementaryTypeName","src":"1351:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":30,"mutability":"mutable","name":"opIndex","nameLocation":"1380:7:0","nodeType":"VariableDeclaration","scope":33,"src":"1372:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29,"name":"uint256","nodeType":"ElementaryTypeName","src":"1372:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":32,"mutability":"mutable","name":"reason","nameLocation":"1404:6:0","nodeType":"VariableDeclaration","scope":33,"src":"1397:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":31,"name":"string","nodeType":"ElementaryTypeName","src":"1397:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"name":"FailedOpStatus","nameLocation":"1326:14:0","nodeType":"StructDefinition","scope":522,"src":"1319:98:0","visibility":"public"},{"canonicalName":"EntryPointWrapper.Response","id":51,"members":[{"constant":false,"id":35,"mutability":"mutable","name":"selectorType","nameLocation":"1456:12:0","nodeType":"VariableDeclaration","scope":51,"src":"1449:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":34,"name":"string","nodeType":"ElementaryTypeName","src":"1449:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":38,"mutability":"mutable","name":"returnInfo","nameLocation":"1489:10:0","nodeType":"VariableDeclaration","scope":51,"src":"1478:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":37,"nodeType":"UserDefinedTypeName","pathNode":{"id":36,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"1478:10:0"},"referencedDeclaration":15,"src":"1478:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":41,"mutability":"mutable","name":"senderInfo","nameLocation":"1519:10:0","nodeType":"VariableDeclaration","scope":51,"src":"1509:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":40,"nodeType":"UserDefinedTypeName","pathNode":{"id":39,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"1509:9:0"},"referencedDeclaration":20,"src":"1509:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":44,"mutability":"mutable","name":"factoryInfo","nameLocation":"1549:11:0","nodeType":"VariableDeclaration","scope":51,"src":"1539:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":43,"nodeType":"UserDefinedTypeName","pathNode":{"id":42,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"1539:9:0"},"referencedDeclaration":20,"src":"1539:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":47,"mutability":"mutable","name":"paymasterInfo","nameLocation":"1580:13:0","nodeType":"VariableDeclaration","scope":51,"src":"1570:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":46,"nodeType":"UserDefinedTypeName","pathNode":{"id":45,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"1570:9:0"},"referencedDeclaration":20,"src":"1570:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":50,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"1623:14:0","nodeType":"VariableDeclaration","scope":51,"src":"1603:34:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":49,"nodeType":"UserDefinedTypeName","pathNode":{"id":48,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":26,"src":"1603:19:0"},"referencedDeclaration":26,"src":"1603:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"name":"Response","nameLocation":"1430:8:0","nodeType":"StructDefinition","scope":522,"src":"1423:221:0","visibility":"public"},{"documentation":{"id":52,"nodeType":"StructuredDocumentation","src":"1652:756:0","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":58,"name":"FailedOp","nameLocation":"2419:8:0","nodeType":"ErrorDefinition","parameters":{"id":57,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54,"mutability":"mutable","name":"opIndex","nameLocation":"2436:7:0","nodeType":"VariableDeclaration","scope":58,"src":"2428:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":53,"name":"uint256","nodeType":"ElementaryTypeName","src":"2428:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":56,"mutability":"mutable","name":"reason","nameLocation":"2452:6:0","nodeType":"VariableDeclaration","scope":58,"src":"2445:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":55,"name":"string","nodeType":"ElementaryTypeName","src":"2445:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2427:32:0"},"src":"2413:47:0"},{"documentation":{"id":59,"nodeType":"StructuredDocumentation","src":"2466:327:0","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":73,"name":"ValidationResult","nameLocation":"2804:16:0","nodeType":"ErrorDefinition","parameters":{"id":72,"nodeType":"ParameterList","parameters":[{"constant":false,"id":62,"mutability":"mutable","name":"returnInfo","nameLocation":"2832:10:0","nodeType":"VariableDeclaration","scope":73,"src":"2821:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":61,"nodeType":"UserDefinedTypeName","pathNode":{"id":60,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"2821:10:0"},"referencedDeclaration":15,"src":"2821:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":65,"mutability":"mutable","name":"senderInfo","nameLocation":"2862:10:0","nodeType":"VariableDeclaration","scope":73,"src":"2852:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":64,"nodeType":"UserDefinedTypeName","pathNode":{"id":63,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"2852:9:0"},"referencedDeclaration":20,"src":"2852:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":68,"mutability":"mutable","name":"factoryInfo","nameLocation":"2884:11:0","nodeType":"VariableDeclaration","scope":73,"src":"2874:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":67,"nodeType":"UserDefinedTypeName","pathNode":{"id":66,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"2874:9:0"},"referencedDeclaration":20,"src":"2874:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":71,"mutability":"mutable","name":"paymasterInfo","nameLocation":"2907:13:0","nodeType":"VariableDeclaration","scope":73,"src":"2897:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":70,"nodeType":"UserDefinedTypeName","pathNode":{"id":69,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"2897:9:0"},"referencedDeclaration":20,"src":"2897:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"src":"2820:101:0"},"src":"2798:124:0"},{"documentation":{"id":74,"nodeType":"StructuredDocumentation","src":"2928:561:0","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":91,"name":"ValidationResultWithAggregation","nameLocation":"3500:31:0","nodeType":"ErrorDefinition","parameters":{"id":90,"nodeType":"ParameterList","parameters":[{"constant":false,"id":77,"mutability":"mutable","name":"returnInfo","nameLocation":"3543:10:0","nodeType":"VariableDeclaration","scope":91,"src":"3532:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":76,"nodeType":"UserDefinedTypeName","pathNode":{"id":75,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"3532:10:0"},"referencedDeclaration":15,"src":"3532:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":80,"mutability":"mutable","name":"senderInfo","nameLocation":"3573:10:0","nodeType":"VariableDeclaration","scope":91,"src":"3563:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":79,"nodeType":"UserDefinedTypeName","pathNode":{"id":78,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"3563:9:0"},"referencedDeclaration":20,"src":"3563:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":83,"mutability":"mutable","name":"factoryInfo","nameLocation":"3595:11:0","nodeType":"VariableDeclaration","scope":91,"src":"3585:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":82,"nodeType":"UserDefinedTypeName","pathNode":{"id":81,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"3585:9:0"},"referencedDeclaration":20,"src":"3585:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":86,"mutability":"mutable","name":"paymasterInfo","nameLocation":"3618:13:0","nodeType":"VariableDeclaration","scope":91,"src":"3608:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":85,"nodeType":"UserDefinedTypeName","pathNode":{"id":84,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"3608:9:0"},"referencedDeclaration":20,"src":"3608:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":89,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"3661:14:0","nodeType":"VariableDeclaration","scope":91,"src":"3641:34:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":88,"nodeType":"UserDefinedTypeName","pathNode":{"id":87,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":26,"src":"3641:19:0"},"referencedDeclaration":26,"src":"3641:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"3531:145:0"},"src":"3494:183:0"},{"documentation":{"id":92,"nodeType":"StructuredDocumentation","src":"3683:51:0","text":" return value of getSenderAddress"},"errorSelector":"6ca7b806","id":96,"name":"SenderAddressResult","nameLocation":"3745:19:0","nodeType":"ErrorDefinition","parameters":{"id":95,"nodeType":"ParameterList","parameters":[{"constant":false,"id":94,"mutability":"mutable","name":"sender","nameLocation":"3773:6:0","nodeType":"VariableDeclaration","scope":96,"src":"3765:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":93,"name":"address","nodeType":"ElementaryTypeName","src":"3765:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3764:16:0"},"src":"3739:42:0"},{"constant":false,"functionSelector":"b0d691fe","id":99,"mutability":"mutable","name":"entryPoint","nameLocation":"3806:10:0","nodeType":"VariableDeclaration","scope":522,"src":"3787:29:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"},"typeName":{"id":98,"nodeType":"UserDefinedTypeName","pathNode":{"id":97,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":998,"src":"3787:11:0"},"referencedDeclaration":998,"src":"3787:11:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"visibility":"public"},{"constant":false,"id":106,"mutability":"mutable","name":"emptyStakeInfo","nameLocation":"3841:14:0","nodeType":"VariableDeclaration","scope":522,"src":"3823:50:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":101,"nodeType":"UserDefinedTypeName","pathNode":{"id":100,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"3823:9:0"},"referencedDeclaration":20,"src":"3823:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"value":{"arguments":[{"hexValue":"30","id":103,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3868:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":104,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3871:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":102,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"3858:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},"id":105,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3858:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},"visibility":"private"},{"constant":false,"id":116,"mutability":"mutable","name":"emptyAggregatorInfo","nameLocation":"3907:19:0","nodeType":"VariableDeclaration","scope":522,"src":"3879:97:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":108,"nodeType":"UserDefinedTypeName","pathNode":{"id":107,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":26,"src":"3879:19:0"},"referencedDeclaration":26,"src":"3879:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"value":{"arguments":[{"arguments":[{"hexValue":"30","id":112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3957:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":111,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3949:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":110,"name":"address","nodeType":"ElementaryTypeName","src":"3949:7:0","typeDescriptions":{}}},"id":113,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3949:10:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":114,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"3961:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}],"id":109,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26,"src":"3929:19:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$26_storage_ptr_$","typeString":"type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer)"}},"id":115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3929:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}},"visibility":"private"},{"constant":false,"id":130,"mutability":"mutable","name":"emptyReturnInfo","nameLocation":"4001:15:0","nodeType":"VariableDeclaration","scope":522,"src":"3982:80:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":118,"nodeType":"UserDefinedTypeName","pathNode":{"id":117,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"3982:10:0"},"referencedDeclaration":15,"src":"3982:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"value":{"arguments":[{"hexValue":"30","id":120,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4030:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":121,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4033:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"66616c7365","id":122,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4036:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":123,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4043:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":124,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4046:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"arguments":[{"hexValue":"30","id":127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4059:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":126,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"4049:9:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":125,"name":"bytes","nodeType":"ElementaryTypeName","src":"4053:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":128,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4049:12:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":119,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15,"src":"4019:10:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},"id":129,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4019:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},"visibility":"private"},{"constant":false,"id":141,"mutability":"mutable","name":"emptyResponse","nameLocation":"4085:13:0","nodeType":"VariableDeclaration","scope":522,"src":"4068:131:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_storage","typeString":"struct EntryPointWrapper.Response"},"typeName":{"id":132,"nodeType":"UserDefinedTypeName","pathNode":{"id":131,"name":"Response","nodeType":"IdentifierPath","referencedDeclaration":51,"src":"4068:8:0"},"referencedDeclaration":51,"src":"4068:8:0","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_storage_ptr","typeString":"struct EntryPointWrapper.Response"}},"value":{"arguments":[{"hexValue":"","id":134,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4110:2:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},{"id":135,"name":"emptyReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":130,"src":"4114:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage","typeString":"struct EntryPointWrapper.ReturnInfo storage ref"}},{"id":136,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"4131:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":137,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"4147:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":138,"name":"emptyStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"4163:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"}},{"id":139,"name":"emptyAggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":116,"src":"4179:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage","typeString":"struct EntryPointWrapper.ReturnInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_StakeInfo_$20_storage","typeString":"struct EntryPointWrapper.StakeInfo storage ref"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}],"id":133,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":51,"src":"4101:8:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$51_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":140,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4101:98:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}},"visibility":"private"},{"constant":false,"id":149,"mutability":"mutable","name":"emptyFailedOp","nameLocation":"4228:13:0","nodeType":"VariableDeclaration","scope":522,"src":"4205:67:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_storage","typeString":"struct EntryPointWrapper.FailedOpStatus"},"typeName":{"id":143,"nodeType":"UserDefinedTypeName","pathNode":{"id":142,"name":"FailedOpStatus","nodeType":"IdentifierPath","referencedDeclaration":33,"src":"4205:14:0"},"referencedDeclaration":33,"src":"4205:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_storage_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"}},"value":{"arguments":[{"hexValue":"66616c7365","id":145,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4259:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":146,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4266:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"","id":147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4269:2:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":144,"name":"FailedOpStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33,"src":"4244:14:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_FailedOpStatus_$33_storage_ptr_$","typeString":"type(struct EntryPointWrapper.FailedOpStatus storage pointer)"}},"id":148,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4244:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus memory"}},"visibility":"private"},{"body":{"id":159,"nodeType":"Block","src":"4316:41:0","statements":[{"expression":{"id":157,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":155,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"4326:10:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":156,"name":"_entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":152,"src":"4339:11:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"src":"4326:24:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"id":158,"nodeType":"ExpressionStatement","src":"4326:24:0"}]},"id":160,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":152,"mutability":"mutable","name":"_entryPoint","nameLocation":"4303:11:0","nodeType":"VariableDeclaration","scope":160,"src":"4291:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"},"typeName":{"id":151,"nodeType":"UserDefinedTypeName","pathNode":{"id":150,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":998,"src":"4291:11:0"},"referencedDeclaration":998,"src":"4291:11:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"visibility":"internal"}],"src":"4290:25:0"},"returnParameters":{"id":154,"nodeType":"ParameterList","parameters":[],"src":"4316:0:0"},"scope":522,"src":"4279:78:0","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":322,"nodeType":"Block","src":"4480:1461:0","statements":[{"clauses":[{"block":{"id":176,"nodeType":"Block","src":"4532:2:0","statements":[]},"errorName":"","id":177,"nodeType":"TryCatchClause","src":"4532:2:0"},{"block":{"id":319,"nodeType":"Block","src":"4575:1360:0","statements":[{"assignments":[182],"declarations":[{"constant":false,"id":182,"mutability":"mutable","name":"receivedSelector","nameLocation":"4596:16:0","nodeType":"VariableDeclaration","scope":319,"src":"4589:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":181,"name":"bytes4","nodeType":"ElementaryTypeName","src":"4589:6:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":187,"initialValue":{"arguments":[{"id":185,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"4622:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":184,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4615:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":183,"name":"bytes4","nodeType":"ElementaryTypeName","src":"4615:6:0","typeDescriptions":{}}},"id":186,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4615:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"4589:44:0"},{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":188,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"4652:16:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":189,"name":"ValidationResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":73,"src":"4672:16:0","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$15_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$returns$__$","typeString":"function (struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory) pure"}},"id":190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"4672:25:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"4652:45:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":233,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"5111:16:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":234,"name":"ValidationResultWithAggregation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"5131:31:0","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_struct$_ReturnInfo_$15_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_AggregatorStakeInfo_$26_memory_ptr_$returns$__$","typeString":"function (struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.AggregatorStakeInfo memory) pure"}},"id":235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"5131:40:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"5111:60:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":282,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"5659:16:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":283,"name":"FailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":58,"src":"5679:8:0","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) pure"}},"id":284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"5679:17:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"5659:37:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":316,"nodeType":"IfStatement","src":"5655:270:0","trueBody":{"id":315,"nodeType":"Block","src":"5697:228:0","statements":[{"assignments":[287,289],"declarations":[{"constant":false,"id":287,"mutability":"mutable","name":"opIndex","nameLocation":"5724:7:0","nodeType":"VariableDeclaration","scope":315,"src":"5716:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":286,"name":"uint256","nodeType":"ElementaryTypeName","src":"5716:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":289,"mutability":"mutable","name":"reason","nameLocation":"5747:6:0","nodeType":"VariableDeclaration","scope":315,"src":"5733:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":288,"name":"string","nodeType":"ElementaryTypeName","src":"5733:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":306,"initialValue":{"arguments":[{"arguments":[{"id":293,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"5774:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5786:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":298,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":295,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"5789:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5789:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5809:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"5789:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":292,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":360,"src":"5768:5:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":299,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5768:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":301,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5814:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":300,"name":"uint256","nodeType":"ElementaryTypeName","src":"5814:7:0","typeDescriptions":{}}},{"id":303,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5823:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":302,"name":"string","nodeType":"ElementaryTypeName","src":"5823:6:0","typeDescriptions":{}}}],"id":304,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5813:17:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_string_storage_ptr_$_$","typeString":"tuple(type(uint256),type(string storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_uint256_$_$_t_type$_t_string_storage_ptr_$_$","typeString":"tuple(type(uint256),type(string storage pointer))"}],"expression":{"id":290,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5757:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5757:10:0","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":305,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5757:74:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_string_memory_ptr_$","typeString":"tuple(uint256,string memory)"}},"nodeType":"VariableDeclarationStatement","src":"5715:116:0"},{"expression":{"components":[{"arguments":[{"hexValue":"74727565","id":308,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5872:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":309,"name":"opIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":287,"src":"5878:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":310,"name":"reason","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":289,"src":"5887:6:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":307,"name":"FailedOpStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33,"src":"5857:14:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_FailedOpStatus_$33_storage_ptr_$","typeString":"type(struct EntryPointWrapper.FailedOpStatus storage pointer)"}},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5857:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus memory"}},{"id":312,"name":"emptyResponse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"5896:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_storage","typeString":"struct EntryPointWrapper.Response storage ref"}}],"id":313,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5856:54:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$33_memory_ptr_$_t_struct$_Response_$51_storage_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus memory,struct EntryPointWrapper.Response storage ref)"}},"functionReturnParameters":171,"id":314,"nodeType":"Return","src":"5849:61:0"}]}},"id":317,"nodeType":"IfStatement","src":"5107:818:0","trueBody":{"id":281,"nodeType":"Block","src":"5173:476:0","statements":[{"assignments":[239,242,245,248,251],"declarations":[{"constant":false,"id":239,"mutability":"mutable","name":"returnInfo","nameLocation":"5210:10:0","nodeType":"VariableDeclaration","scope":281,"src":"5192:28:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":238,"nodeType":"UserDefinedTypeName","pathNode":{"id":237,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"5192:10:0"},"referencedDeclaration":15,"src":"5192:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":242,"mutability":"mutable","name":"senderInfo","nameLocation":"5239:10:0","nodeType":"VariableDeclaration","scope":281,"src":"5222:27:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":241,"nodeType":"UserDefinedTypeName","pathNode":{"id":240,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"5222:9:0"},"referencedDeclaration":20,"src":"5222:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":245,"mutability":"mutable","name":"factoryInfo","nameLocation":"5268:11:0","nodeType":"VariableDeclaration","scope":281,"src":"5251:28:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":244,"nodeType":"UserDefinedTypeName","pathNode":{"id":243,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"5251:9:0"},"referencedDeclaration":20,"src":"5251:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":248,"mutability":"mutable","name":"paymasterInfo","nameLocation":"5298:13:0","nodeType":"VariableDeclaration","scope":281,"src":"5281:30:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":247,"nodeType":"UserDefinedTypeName","pathNode":{"id":246,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"5281:9:0"},"referencedDeclaration":20,"src":"5281:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":251,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"5340:14:0","nodeType":"VariableDeclaration","scope":281,"src":"5313:41:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"},"typeName":{"id":250,"nodeType":"UserDefinedTypeName","pathNode":{"id":249,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":26,"src":"5313:19:0"},"referencedDeclaration":26,"src":"5313:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo"}},"visibility":"internal"}],"id":269,"initialValue":{"arguments":[{"arguments":[{"id":255,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"5375:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":256,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5387:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":257,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"5390:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":258,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"5390:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":259,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5410:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"5390:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":254,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":360,"src":"5369:5:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":261,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5369:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":262,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15,"src":"5415:10:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},{"id":263,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"5427:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":264,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"5438:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":265,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"5449:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":266,"name":"AggregatorStakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26,"src":"5460:19:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_AggregatorStakeInfo_$26_storage_ptr_$","typeString":"type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer)"}}],"id":267,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5414:66:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_AggregatorStakeInfo_$26_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_AggregatorStakeInfo_$26_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.AggregatorStakeInfo storage pointer))"}],"expression":{"id":252,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5358:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":253,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"5358:10:0","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":268,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5358:123:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_ReturnInfo_$15_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_AggregatorStakeInfo_$26_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.AggregatorStakeInfo memory)"}},"nodeType":"VariableDeclarationStatement","src":"5191:290:0"},{"expression":{"components":[{"id":270,"name":"emptyFailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":149,"src":"5507:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_storage","typeString":"struct EntryPointWrapper.FailedOpStatus storage ref"}},{"arguments":[{"hexValue":"56616c69646174696f6e526573756c74576974684167677265676174696f6e","id":272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5531:33:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_ea3130099f23ccb989b6d42303a297f831545c15c36a5fc95fe55cdc635ccfdc","typeString":"literal_string \"ValidationResultWithAggregation\""},"value":"ValidationResultWithAggregation"},{"id":273,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":239,"src":"5566:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},{"id":274,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":242,"src":"5578:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":275,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":245,"src":"5590:11:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":276,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":248,"src":"5603:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":277,"name":"aggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":251,"src":"5618:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_ea3130099f23ccb989b6d42303a297f831545c15c36a5fc95fe55cdc635ccfdc","typeString":"literal_string \"ValidationResultWithAggregation\""},{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_memory_ptr","typeString":"struct EntryPointWrapper.AggregatorStakeInfo memory"}],"id":271,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":51,"src":"5522:8:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$51_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5522:111:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}}],"id":279,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5506:128:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$33_storage_$_t_struct$_Response_$51_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus storage ref,struct EntryPointWrapper.Response memory)"}},"functionReturnParameters":171,"id":280,"nodeType":"Return","src":"5499:135:0"}]}},"id":318,"nodeType":"IfStatement","src":"4648:1277:0","trueBody":{"id":232,"nodeType":"Block","src":"4699:402:0","statements":[{"assignments":[194,197,200,203],"declarations":[{"constant":false,"id":194,"mutability":"mutable","name":"returnInfo","nameLocation":"4736:10:0","nodeType":"VariableDeclaration","scope":232,"src":"4718:28:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"},"typeName":{"id":193,"nodeType":"UserDefinedTypeName","pathNode":{"id":192,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":15,"src":"4718:10:0"},"referencedDeclaration":15,"src":"4718:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_storage_ptr","typeString":"struct EntryPointWrapper.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":197,"mutability":"mutable","name":"senderInfo","nameLocation":"4765:10:0","nodeType":"VariableDeclaration","scope":232,"src":"4748:27:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":196,"nodeType":"UserDefinedTypeName","pathNode":{"id":195,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"4748:9:0"},"referencedDeclaration":20,"src":"4748:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":200,"mutability":"mutable","name":"factoryInfo","nameLocation":"4794:11:0","nodeType":"VariableDeclaration","scope":232,"src":"4777:28:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":199,"nodeType":"UserDefinedTypeName","pathNode":{"id":198,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"4777:9:0"},"referencedDeclaration":20,"src":"4777:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":203,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4824:13:0","nodeType":"VariableDeclaration","scope":232,"src":"4807:30:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo"},"typeName":{"id":202,"nodeType":"UserDefinedTypeName","pathNode":{"id":201,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":20,"src":"4807:9:0"},"referencedDeclaration":20,"src":"4807:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_storage_ptr","typeString":"struct EntryPointWrapper.StakeInfo"}},"visibility":"internal"}],"id":220,"initialValue":{"arguments":[{"arguments":[{"id":207,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"4858:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4870:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":209,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":179,"src":"4873:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"4873:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":211,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4893:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"4873:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":206,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":360,"src":"4852:5:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":213,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4852:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":214,"name":"ReturnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15,"src":"4898:10:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$","typeString":"type(struct EntryPointWrapper.ReturnInfo storage pointer)"}},{"id":215,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"4910:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":216,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"4921:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}},{"id":217,"name":"StakeInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20,"src":"4932:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_StakeInfo_$20_storage_ptr_$","typeString":"type(struct EntryPointWrapper.StakeInfo storage pointer)"}}],"id":218,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4897:45:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_struct$_ReturnInfo_$15_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$_t_type$_t_struct$_StakeInfo_$20_storage_ptr_$_$","typeString":"tuple(type(struct EntryPointWrapper.ReturnInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer),type(struct EntryPointWrapper.StakeInfo storage pointer))"}],"expression":{"id":204,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4841:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":205,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"4841:10:0","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":219,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4841:102:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_ReturnInfo_$15_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$_t_struct$_StakeInfo_$20_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.ReturnInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory,struct EntryPointWrapper.StakeInfo memory)"}},"nodeType":"VariableDeclarationStatement","src":"4717:226:0"},{"expression":{"components":[{"id":221,"name":"emptyFailedOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":149,"src":"4969:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_storage","typeString":"struct EntryPointWrapper.FailedOpStatus storage ref"}},{"arguments":[{"hexValue":"56616c69646174696f6e526573756c74","id":223,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4993:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2553a72894d908a298b00dbf33bbabad7e5ce84b5e86e2b9599904735a8f7bdc","typeString":"literal_string \"ValidationResult\""},"value":"ValidationResult"},{"id":224,"name":"returnInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":194,"src":"5013:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"}},{"id":225,"name":"senderInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":197,"src":"5025:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":226,"name":"factoryInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":200,"src":"5037:11:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":227,"name":"paymasterInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":203,"src":"5050:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"}},{"id":228,"name":"emptyAggregatorInfo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":116,"src":"5065:19:0","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2553a72894d908a298b00dbf33bbabad7e5ce84b5e86e2b9599904735a8f7bdc","typeString":"literal_string \"ValidationResult\""},{"typeIdentifier":"t_struct$_ReturnInfo_$15_memory_ptr","typeString":"struct EntryPointWrapper.ReturnInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_StakeInfo_$20_memory_ptr","typeString":"struct EntryPointWrapper.StakeInfo memory"},{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$26_storage","typeString":"struct EntryPointWrapper.AggregatorStakeInfo storage ref"}],"id":222,"name":"Response","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":51,"src":"4984:8:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Response_$51_storage_ptr_$","typeString":"type(struct EntryPointWrapper.Response storage pointer)"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4984:101:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_memory_ptr","typeString":"struct EntryPointWrapper.Response memory"}}],"id":230,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4968:118:0","typeDescriptions":{"typeIdentifier":"t_tuple$_t_struct$_FailedOpStatus_$33_storage_$_t_struct$_Response_$51_memory_ptr_$","typeString":"tuple(struct EntryPointWrapper.FailedOpStatus storage ref,struct EntryPointWrapper.Response memory)"}},"functionReturnParameters":171,"id":231,"nodeType":"Return","src":"4961:125:0"}]}}]},"errorName":"","id":320,"nodeType":"TryCatchClause","parameters":{"id":180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":179,"mutability":"mutable","name":"revertData","nameLocation":"4563:10:0","nodeType":"VariableDeclaration","scope":320,"src":"4550:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":178,"name":"bytes","nodeType":"ElementaryTypeName","src":"4550:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4549:25:0"},"src":"4543:1392:0"}],"externalCall":{"arguments":[{"id":174,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":163,"src":"4524:6:0","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}],"expression":{"id":172,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"4494:10:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"id":173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"simulateValidation","nodeType":"MemberAccess","referencedDeclaration":961,"src":"4494:29:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_struct$_UserOperation_$1149_memory_ptr_$returns$__$","typeString":"function (struct UserOperation memory) external"}},"id":175,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4494:37:0","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":321,"nodeType":"TryStatement","src":"4490:1445:0"}]},"functionSelector":"ee219423","id":323,"implemented":true,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"4372:18:0","nodeType":"FunctionDefinition","parameters":{"id":164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":163,"mutability":"mutable","name":"userOp","nameLocation":"4414:6:0","nodeType":"VariableDeclaration","scope":323,"src":"4391:29:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":162,"nodeType":"UserDefinedTypeName","pathNode":{"id":161,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"4391:13:0"},"referencedDeclaration":1149,"src":"4391:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"4390:31:0"},"returnParameters":{"id":171,"nodeType":"ParameterList","parameters":[{"constant":false,"id":167,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":323,"src":"4440:21:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_memory_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"},"typeName":{"id":166,"nodeType":"UserDefinedTypeName","pathNode":{"id":165,"name":"FailedOpStatus","nodeType":"IdentifierPath","referencedDeclaration":33,"src":"4440:14:0"},"referencedDeclaration":33,"src":"4440:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_FailedOpStatus_$33_storage_ptr","typeString":"struct EntryPointWrapper.FailedOpStatus"}},"visibility":"internal"},{"constant":false,"id":170,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":323,"src":"4463:15:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_memory_ptr","typeString":"struct EntryPointWrapper.Response"},"typeName":{"id":169,"nodeType":"UserDefinedTypeName","pathNode":{"id":168,"name":"Response","nodeType":"IdentifierPath","referencedDeclaration":51,"src":"4463:8:0"},"referencedDeclaration":51,"src":"4463:8:0","typeDescriptions":{"typeIdentifier":"t_struct$_Response_$51_storage_ptr","typeString":"struct EntryPointWrapper.Response"}},"visibility":"internal"}],"src":"4439:40:0"},"scope":522,"src":"4363:1578:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":359,"nodeType":"Block","src":"6111:2640:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":339,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":335,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":329,"src":"6129:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3331","id":336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6139:2:0","typeDescriptions":{"typeIdentifier":"t_rational_31_by_1","typeString":"int_const 31"},"value":"31"},"src":"6129:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":338,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":329,"src":"6145:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6129:23:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"736c6963655f6f766572666c6f77","id":340,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6154:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e","typeString":"literal_string \"slice_overflow\""},"value":"slice_overflow"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e","typeString":"literal_string \"slice_overflow\""}],"id":334,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6121:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6121:50:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":342,"nodeType":"ExpressionStatement","src":"6121:50:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":344,"name":"_bytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":325,"src":"6189:6:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":345,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6189:13:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":348,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":346,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":327,"src":"6206:6:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":347,"name":"_length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":329,"src":"6215:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6206:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6189:33:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"736c6963655f6f75744f66426f756e6473","id":350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6224:19:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0","typeString":"literal_string \"slice_outOfBounds\""},"value":"slice_outOfBounds"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0","typeString":"literal_string \"slice_outOfBounds\""}],"id":343,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6181:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6181:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":352,"nodeType":"ExpressionStatement","src":"6181:63:0"},{"assignments":[354],"declarations":[{"constant":false,"id":354,"mutability":"mutable","name":"tempBytes","nameLocation":"6268:9:0","nodeType":"VariableDeclaration","scope":359,"src":"6255:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":353,"name":"bytes","nodeType":"ElementaryTypeName","src":"6255:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":355,"nodeType":"VariableDeclarationStatement","src":"6255:22:0"},{"AST":{"nodeType":"YulBlock","src":"6297:2421:0","statements":[{"cases":[{"body":{"nodeType":"YulBlock","src":"6353:1960:0","statements":[{"nodeType":"YulAssignment","src":"6509:24:0","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6528:4:0","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6522:5:0"},"nodeType":"YulFunctionCall","src":"6522:11:0"},"variableNames":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"6509:9:0"}]},{"nodeType":"YulVariableDeclaration","src":"7157:33:0","value":{"arguments":[{"name":"_length","nodeType":"YulIdentifier","src":"7178:7:0"},{"kind":"number","nodeType":"YulLiteral","src":"7187:2:0","type":"","value":"31"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7174:3:0"},"nodeType":"YulFunctionCall","src":"7174:16:0"},"variables":[{"name":"lengthmod","nodeType":"YulTypedName","src":"7161:9:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7511:70:0","value":{"arguments":[{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"7529:9:0"},{"name":"lengthmod","nodeType":"YulIdentifier","src":"7540:9:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7525:3:0"},"nodeType":"YulFunctionCall","src":"7525:25:0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7556:4:0","type":"","value":"0x20"},{"arguments":[{"name":"lengthmod","nodeType":"YulIdentifier","src":"7569:9:0"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7562:6:0"},"nodeType":"YulFunctionCall","src":"7562:17:0"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"7552:3:0"},"nodeType":"YulFunctionCall","src":"7552:28:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7521:3:0"},"nodeType":"YulFunctionCall","src":"7521:60:0"},"variables":[{"name":"mc","nodeType":"YulTypedName","src":"7515:2:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7598:27:0","value":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7613:2:0"},{"name":"_length","nodeType":"YulIdentifier","src":"7617:7:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7609:3:0"},"nodeType":"YulFunctionCall","src":"7609:16:0"},"variables":[{"name":"end","nodeType":"YulTypedName","src":"7602:3:0","type":""}]},{"body":{"nodeType":"YulBlock","src":"8007:61:0","statements":[{"expression":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"8036:2:0"},{"arguments":[{"name":"cc","nodeType":"YulIdentifier","src":"8046:2:0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8040:5:0"},"nodeType":"YulFunctionCall","src":"8040:9:0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8029:6:0"},"nodeType":"YulFunctionCall","src":"8029:21:0"},"nodeType":"YulExpressionStatement","src":"8029:21:0"}]},"condition":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7898:2:0"},{"name":"end","nodeType":"YulIdentifier","src":"7902:3:0"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"7895:2:0"},"nodeType":"YulFunctionCall","src":"7895:11:0"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"7907:99:0","statements":[{"nodeType":"YulAssignment","src":"7929:19:0","value":{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"7939:2:0"},{"kind":"number","nodeType":"YulLiteral","src":"7943:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7935:3:0"},"nodeType":"YulFunctionCall","src":"7935:13:0"},"variableNames":[{"name":"mc","nodeType":"YulIdentifier","src":"7929:2:0"}]},{"nodeType":"YulAssignment","src":"7969:19:0","value":{"arguments":[{"name":"cc","nodeType":"YulIdentifier","src":"7979:2:0"},{"kind":"number","nodeType":"YulLiteral","src":"7983:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7975:3:0"},"nodeType":"YulFunctionCall","src":"7975:13:0"},"variableNames":[{"name":"cc","nodeType":"YulIdentifier","src":"7969:2:0"}]}]},"pre":{"nodeType":"YulBlock","src":"7647:247:0","statements":[{"nodeType":"YulVariableDeclaration","src":"7796:80:0","value":{"arguments":[{"arguments":[{"arguments":[{"name":"_bytes","nodeType":"YulIdentifier","src":"7818:6:0"},{"name":"lengthmod","nodeType":"YulIdentifier","src":"7826:9:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7814:3:0"},"nodeType":"YulFunctionCall","src":"7814:22:0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7842:4:0","type":"","value":"0x20"},{"arguments":[{"name":"lengthmod","nodeType":"YulIdentifier","src":"7855:9:0"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7848:6:0"},"nodeType":"YulFunctionCall","src":"7848:17:0"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"7838:3:0"},"nodeType":"YulFunctionCall","src":"7838:28:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7810:3:0"},"nodeType":"YulFunctionCall","src":"7810:57:0"},{"name":"_start","nodeType":"YulIdentifier","src":"7869:6:0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7806:3:0"},"nodeType":"YulFunctionCall","src":"7806:70:0"},"variables":[{"name":"cc","nodeType":"YulTypedName","src":"7800:2:0","type":""}]}]},"src":"7643:425:0"},{"expression":{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8093:9:0"},{"name":"_length","nodeType":"YulIdentifier","src":"8104:7:0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8086:6:0"},"nodeType":"YulFunctionCall","src":"8086:26:0"},"nodeType":"YulExpressionStatement","src":"8086:26:0"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8267:4:0","type":"","value":"0x40"},{"arguments":[{"arguments":[{"name":"mc","nodeType":"YulIdentifier","src":"8281:2:0"},{"kind":"number","nodeType":"YulLiteral","src":"8285:2:0","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8277:3:0"},"nodeType":"YulFunctionCall","src":"8277:11:0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8294:2:0","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"8290:3:0"},"nodeType":"YulFunctionCall","src":"8290:7:0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8273:3:0"},"nodeType":"YulFunctionCall","src":"8273:25:0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8260:6:0"},"nodeType":"YulFunctionCall","src":"8260:39:0"},"nodeType":"YulExpressionStatement","src":"8260:39:0"}]},"nodeType":"YulCase","src":"6346:1967:0","value":{"kind":"number","nodeType":"YulLiteral","src":"6351:1:0","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"8417:291:0","statements":[{"nodeType":"YulAssignment","src":"8435:24:0","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8454:4:0","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8448:5:0"},"nodeType":"YulFunctionCall","src":"8448:11:0"},"variableNames":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8435:9:0"}]},{"expression":{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8629:9:0"},{"kind":"number","nodeType":"YulLiteral","src":"8640:1:0","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8622:6:0"},"nodeType":"YulFunctionCall","src":"8622:20:0"},"nodeType":"YulExpressionStatement","src":"8622:20:0"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8667:4:0","type":"","value":"0x40"},{"arguments":[{"name":"tempBytes","nodeType":"YulIdentifier","src":"8677:9:0"},{"kind":"number","nodeType":"YulLiteral","src":"8688:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8673:3:0"},"nodeType":"YulFunctionCall","src":"8673:20:0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8660:6:0"},"nodeType":"YulFunctionCall","src":"8660:34:0"},"nodeType":"YulExpressionStatement","src":"8660:34:0"}]},"nodeType":"YulCase","src":"8409:299:0","value":"default"}],"expression":{"arguments":[{"name":"_length","nodeType":"YulIdentifier","src":"6325:7:0"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6318:6:0"},"nodeType":"YulFunctionCall","src":"6318:15:0"},"nodeType":"YulSwitch","src":"6311:2397:0"}]},"evmVersion":"london","externalReferences":[{"declaration":325,"isOffset":false,"isSlot":false,"src":"7818:6:0","valueSize":1},{"declaration":329,"isOffset":false,"isSlot":false,"src":"6325:7:0","valueSize":1},{"declaration":329,"isOffset":false,"isSlot":false,"src":"7178:7:0","valueSize":1},{"declaration":329,"isOffset":false,"isSlot":false,"src":"7617:7:0","valueSize":1},{"declaration":329,"isOffset":false,"isSlot":false,"src":"8104:7:0","valueSize":1},{"declaration":327,"isOffset":false,"isSlot":false,"src":"7869:6:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"6509:9:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"7529:9:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"8093:9:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"8435:9:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"8629:9:0","valueSize":1},{"declaration":354,"isOffset":false,"isSlot":false,"src":"8677:9:0","valueSize":1}],"id":356,"nodeType":"InlineAssembly","src":"6288:2430:0"},{"expression":{"id":357,"name":"tempBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":354,"src":"8735:9:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":333,"id":358,"nodeType":"Return","src":"8728:16:0"}]},"id":360,"implemented":true,"kind":"function","modifiers":[],"name":"slice","nameLocation":"5956:5:0","nodeType":"FunctionDefinition","parameters":{"id":330,"nodeType":"ParameterList","parameters":[{"constant":false,"id":325,"mutability":"mutable","name":"_bytes","nameLocation":"5984:6:0","nodeType":"VariableDeclaration","scope":360,"src":"5971:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":324,"name":"bytes","nodeType":"ElementaryTypeName","src":"5971:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":327,"mutability":"mutable","name":"_start","nameLocation":"6008:6:0","nodeType":"VariableDeclaration","scope":360,"src":"6000:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":326,"name":"uint256","nodeType":"ElementaryTypeName","src":"6000:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":329,"mutability":"mutable","name":"_length","nameLocation":"6032:7:0","nodeType":"VariableDeclaration","scope":360,"src":"6024:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":328,"name":"uint256","nodeType":"ElementaryTypeName","src":"6024:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5961:84:0"},"returnParameters":{"id":333,"nodeType":"ParameterList","parameters":[{"constant":false,"id":332,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":360,"src":"6093:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":331,"name":"bytes","nodeType":"ElementaryTypeName","src":"6093:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6092:14:0"},"scope":522,"src":"5947:2804:0","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":408,"nodeType":"Block","src":"8881:193:0","statements":[{"expression":{"id":380,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":373,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":371,"src":"8891:3:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":377,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":367,"src":"8911:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":378,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8911:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":376,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"8897:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":374,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8901:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":375,"nodeType":"ArrayTypeName","src":"8901:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":379,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8897:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"src":"8891:35:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":381,"nodeType":"ExpressionStatement","src":"8891:35:0"},{"body":{"id":404,"nodeType":"Block","src":"8978:70:0","statements":[{"expression":{"id":402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":393,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":371,"src":"8992:3:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":395,"indexExpression":{"id":394,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":383,"src":"8996:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8992:6:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":398,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":367,"src":"9026:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":400,"indexExpression":{"id":399,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":383,"src":"9034:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9026:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_memory_ptr","typeString":"struct UserOperation memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$1149_memory_ptr","typeString":"struct UserOperation memory"}],"expression":{"id":396,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":363,"src":"9001:10:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"id":397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getUserOpHash","nodeType":"MemberAccess","referencedDeclaration":954,"src":"9001:24:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_struct$_UserOperation_$1149_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct UserOperation memory) view external returns (bytes32)"}},"id":401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9001:36:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8992:45:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":403,"nodeType":"ExpressionStatement","src":"8992:45:0"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":386,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":383,"src":"8953:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":387,"name":"userOps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":367,"src":"8957:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation memory[] memory"}},"id":388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"8957:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8953:18:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":405,"initializationExpression":{"assignments":[383],"declarations":[{"constant":false,"id":383,"mutability":"mutable","name":"i","nameLocation":"8946:1:0","nodeType":"VariableDeclaration","scope":405,"src":"8941:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":382,"name":"uint","nodeType":"ElementaryTypeName","src":"8941:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":385,"initialValue":{"hexValue":"30","id":384,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8950:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"8941:10:0"},"loopExpression":{"expression":{"id":391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"8973:3:0","subExpression":{"id":390,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":383,"src":"8973:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":392,"nodeType":"ExpressionStatement","src":"8973:3:0"},"nodeType":"ForStatement","src":"8936:112:0"},{"expression":{"id":406,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":371,"src":"9064:3:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"functionReturnParameters":372,"id":407,"nodeType":"Return","src":"9057:10:0"}]},"functionSelector":"3024e00c","id":409,"implemented":true,"kind":"function","modifiers":[],"name":"getUserOpHashes","nameLocation":"8766:15:0","nodeType":"FunctionDefinition","parameters":{"id":368,"nodeType":"ParameterList","parameters":[{"constant":false,"id":363,"mutability":"mutable","name":"entryPoint","nameLocation":"8794:10:0","nodeType":"VariableDeclaration","scope":409,"src":"8782:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"},"typeName":{"id":362,"nodeType":"UserDefinedTypeName","pathNode":{"id":361,"name":"IEntryPoint","nodeType":"IdentifierPath","referencedDeclaration":998,"src":"8782:11:0"},"referencedDeclaration":998,"src":"8782:11:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"visibility":"internal"},{"constant":false,"id":367,"mutability":"mutable","name":"userOps","nameLocation":"8829:7:0","nodeType":"VariableDeclaration","scope":409,"src":"8806:30:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":365,"nodeType":"UserDefinedTypeName","pathNode":{"id":364,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"8806:13:0"},"referencedDeclaration":1149,"src":"8806:13:0","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"id":366,"nodeType":"ArrayTypeName","src":"8806:15:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"8781:56:0"},"returnParameters":{"id":372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":371,"mutability":"mutable","name":"ret","nameLocation":"8876:3:0","nodeType":"VariableDeclaration","scope":409,"src":"8859:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":369,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8859:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":370,"nodeType":"ArrayTypeName","src":"8859:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"8858:22:0"},"scope":522,"src":"8757:317:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":463,"nodeType":"Block","src":"9161:267:0","statements":[{"assignments":[421],"declarations":[{"constant":false,"id":421,"mutability":"mutable","name":"hashes","nameLocation":"9188:6:0","nodeType":"VariableDeclaration","scope":463,"src":"9171:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":419,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9171:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":420,"nodeType":"ArrayTypeName","src":"9171:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":428,"initialValue":{"arguments":[{"expression":{"id":425,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":412,"src":"9211:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9211:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":424,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9197:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":422,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9201:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":423,"nodeType":"ArrayTypeName","src":"9201:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9197:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9171:57:0"},{"body":{"id":449,"nodeType":"Block","src":"9282:58:0","statements":[{"expression":{"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":440,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":421,"src":"9296:6:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":442,"indexExpression":{"id":441,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":430,"src":"9303:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9296:9:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"baseExpression":{"id":443,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":412,"src":"9308:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":445,"indexExpression":{"id":444,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":430,"src":"9318:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9308:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"codehash","nodeType":"MemberAccess","src":"9308:21:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9296:33:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":448,"nodeType":"ExpressionStatement","src":"9296:33:0"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":433,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":430,"src":"9255:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":434,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":412,"src":"9259:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":435,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9259:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9255:20:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":450,"initializationExpression":{"assignments":[430],"declarations":[{"constant":false,"id":430,"mutability":"mutable","name":"i","nameLocation":"9248:1:0","nodeType":"VariableDeclaration","scope":450,"src":"9243:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":429,"name":"uint","nodeType":"ElementaryTypeName","src":"9243:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":432,"initialValue":{"hexValue":"30","id":431,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9252:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"9243:10:0"},"loopExpression":{"expression":{"id":438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"9277:3:0","subExpression":{"id":437,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":430,"src":"9277:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":439,"nodeType":"ExpressionStatement","src":"9277:3:0"},"nodeType":"ForStatement","src":"9238:102:0"},{"assignments":[452],"declarations":[{"constant":false,"id":452,"mutability":"mutable","name":"data","nameLocation":"9362:4:0","nodeType":"VariableDeclaration","scope":463,"src":"9349:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":451,"name":"bytes","nodeType":"ElementaryTypeName","src":"9349:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":457,"initialValue":{"arguments":[{"id":455,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":421,"src":"9380:6:0","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}],"expression":{"id":453,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"9369:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":454,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"9369:10:0","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":456,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9369:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9349:38:0"},{"expression":{"components":[{"arguments":[{"id":459,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"9415:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":458,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"9405:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9405:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":461,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9404:17:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":416,"id":462,"nodeType":"Return","src":"9397:24:0"}]},"functionSelector":"7b34b621","id":464,"implemented":true,"kind":"function","modifiers":[],"name":"getCodeHashes","nameLocation":"9089:13:0","nodeType":"FunctionDefinition","parameters":{"id":413,"nodeType":"ParameterList","parameters":[{"constant":false,"id":412,"mutability":"mutable","name":"addresses","nameLocation":"9120:9:0","nodeType":"VariableDeclaration","scope":464,"src":"9103:26:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":410,"name":"address","nodeType":"ElementaryTypeName","src":"9103:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":411,"nodeType":"ArrayTypeName","src":"9103:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"9102:28:0"},"returnParameters":{"id":416,"nodeType":"ParameterList","parameters":[{"constant":false,"id":415,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":464,"src":"9152:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":414,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9152:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"9151:9:0"},"scope":522,"src":"9080:348:0","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":520,"nodeType":"Block","src":"9512:451:0","statements":[{"clauses":[{"block":{"id":475,"nodeType":"Block","src":"9564:2:0","statements":[]},"errorName":"","id":476,"nodeType":"TryCatchClause","src":"9564:2:0"},{"block":{"id":517,"nodeType":"Block","src":"9607:350:0","statements":[{"assignments":[481],"declarations":[{"constant":false,"id":481,"mutability":"mutable","name":"receivedSelector","nameLocation":"9628:16:0","nodeType":"VariableDeclaration","scope":517,"src":"9621:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":480,"name":"bytes4","nodeType":"ElementaryTypeName","src":"9621:6:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":486,"initialValue":{"arguments":[{"id":484,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":478,"src":"9654:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":483,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9647:6:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":482,"name":"bytes4","nodeType":"ElementaryTypeName","src":"9647:6:0","typeDescriptions":{}}},"id":485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9647:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"9621:44:0"},{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":487,"name":"receivedSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":481,"src":"9684:16:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":488,"name":"SenderAddressResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":96,"src":"9704:19:0","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"9704:28:0","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"9684:48:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":515,"nodeType":"Block","src":"9887:60:0","statements":[{"expression":{"arguments":[{"hexValue":"496e76616c696420696e6974436f6465","id":512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9913:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_41358789453c2b61b04d9046ed6bd1617530e1f3f5c8b4843a7b086398036cc8","typeString":"literal_string \"Invalid initCode\""},"value":"Invalid initCode"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_41358789453c2b61b04d9046ed6bd1617530e1f3f5c8b4843a7b086398036cc8","typeString":"literal_string \"Invalid initCode\""}],"id":511,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"9905:6:0","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9905:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":514,"nodeType":"ExpressionStatement","src":"9905:27:0"}]},"id":516,"nodeType":"IfStatement","src":"9680:267:0","trueBody":{"id":510,"nodeType":"Block","src":"9734:147:0","statements":[{"assignments":[492],"declarations":[{"constant":false,"id":492,"mutability":"mutable","name":"sender","nameLocation":"9760:6:0","nodeType":"VariableDeclaration","scope":510,"src":"9752:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":491,"name":"address","nodeType":"ElementaryTypeName","src":"9752:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":507,"initialValue":{"arguments":[{"arguments":[{"id":496,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":478,"src":"9786:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"34","id":497,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9798:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":498,"name":"revertData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":478,"src":"9801:10:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"9801:17:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"34","id":500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9821:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"9801:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":495,"name":"slice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":360,"src":"9780:5:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,uint256,uint256) pure returns (bytes memory)"}},"id":502,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9780:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":504,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9826:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":503,"name":"address","nodeType":"ElementaryTypeName","src":"9826:7:0","typeDescriptions":{}}}],"id":505,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"9825:9:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"}],"expression":{"id":493,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"9769:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":494,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"decode","nodeType":"MemberAccess","src":"9769:10:0","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":506,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9769:66:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"VariableDeclarationStatement","src":"9752:83:0"},{"expression":{"id":508,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":492,"src":"9860:6:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":470,"id":509,"nodeType":"Return","src":"9853:13:0"}]}}]},"errorName":"","id":518,"nodeType":"TryCatchClause","parameters":{"id":479,"nodeType":"ParameterList","parameters":[{"constant":false,"id":478,"mutability":"mutable","name":"revertData","nameLocation":"9595:10:0","nodeType":"VariableDeclaration","scope":518,"src":"9582:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":477,"name":"bytes","nodeType":"ElementaryTypeName","src":"9582:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9581:25:0"},"src":"9575:382:0"}],"externalCall":{"arguments":[{"id":473,"name":"initCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":466,"src":"9554:8:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":471,"name":"entryPoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"9526:10:0","typeDescriptions":{"typeIdentifier":"t_contract$_IEntryPoint_$998","typeString":"contract IEntryPoint"}},"id":472,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getSenderAddress","nodeType":"MemberAccess","referencedDeclaration":986,"src":"9526:27:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":474,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9526:37:0","tryCall":true,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":519,"nodeType":"TryStatement","src":"9522:435:0"}]},"functionSelector":"9b249f69","id":521,"implemented":true,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"9443:16:0","nodeType":"FunctionDefinition","parameters":{"id":467,"nodeType":"ParameterList","parameters":[{"constant":false,"id":466,"mutability":"mutable","name":"initCode","nameLocation":"9475:8:0","nodeType":"VariableDeclaration","scope":521,"src":"9460:23:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":465,"name":"bytes","nodeType":"ElementaryTypeName","src":"9460:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9459:25:0"},"returnParameters":{"id":470,"nodeType":"ParameterList","parameters":[{"constant":false,"id":469,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":521,"src":"9503:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":468,"name":"address","nodeType":"ElementaryTypeName","src":"9503:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"9502:9:0"},"scope":522,"src":"9434:529:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":523,"src":"189:9776:0","usedErrors":[58,73,91,96]}],"src":"36:9930:0"},"id":0},"contracts/core/Helpers.sol":{"ast":{"absolutePath":"contracts/core/Helpers.sol","exportedSymbols":{"ValidationData":[531],"_intersectTimeRange":[675],"_packValidationData":[712,750],"_parseValidationData":[590],"calldataKeccak":[760]},"id":761,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":524,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:1"},{"canonicalName":"ValidationData","id":531,"members":[{"constant":false,"id":526,"mutability":"mutable","name":"aggregator","nameLocation":"730:10:1","nodeType":"VariableDeclaration","scope":531,"src":"722:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":525,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":528,"mutability":"mutable","name":"validAfter","nameLocation":"757:10:1","nodeType":"VariableDeclaration","scope":531,"src":"750:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":527,"name":"uint48","nodeType":"ElementaryTypeName","src":"750:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":530,"mutability":"mutable","name":"validUntil","nameLocation":"784:10:1","nodeType":"VariableDeclaration","scope":531,"src":"777:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":529,"name":"uint48","nodeType":"ElementaryTypeName","src":"777:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"ValidationData","nameLocation":"697:14:1","nodeType":"StructDefinition","scope":761,"src":"690:111:1","visibility":"public"},{"body":{"id":589,"nodeType":"Block","src":"997:346:1","statements":[{"assignments":[540],"declarations":[{"constant":false,"id":540,"mutability":"mutable","name":"aggregator","nameLocation":"1015:10:1","nodeType":"VariableDeclaration","scope":589,"src":"1007:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":539,"name":"address","nodeType":"ElementaryTypeName","src":"1007:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":548,"initialValue":{"arguments":[{"arguments":[{"id":545,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"1044:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1036:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":543,"name":"uint160","nodeType":"ElementaryTypeName","src":"1036:7:1","typeDescriptions":{}}},"id":546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1036:23:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1028:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":541,"name":"address","nodeType":"ElementaryTypeName","src":"1028:7:1","typeDescriptions":{}}},"id":547,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1028:32:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1007:53:1"},{"assignments":[550],"declarations":[{"constant":false,"id":550,"mutability":"mutable","name":"validUntil","nameLocation":"1077:10:1","nodeType":"VariableDeclaration","scope":589,"src":"1070:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":549,"name":"uint48","nodeType":"ElementaryTypeName","src":"1070:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":557,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":553,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"1097:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"313630","id":554,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1115:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1097:21:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":552,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1090:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":551,"name":"uint48","nodeType":"ElementaryTypeName","src":"1090:6:1","typeDescriptions":{}}},"id":556,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1090:29:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1070:49:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":558,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":550,"src":"1133:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":559,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1147:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1133:15:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":570,"nodeType":"IfStatement","src":"1129:75:1","trueBody":{"id":569,"nodeType":"Block","src":"1150:54:1","statements":[{"expression":{"id":567,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":561,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":550,"src":"1164:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"arguments":[{"id":564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1182:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":563,"name":"uint48","nodeType":"ElementaryTypeName","src":"1182:6:1","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":562,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1177:4:1","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":565,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1177:12:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":566,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"1177:16:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"1164:29:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":568,"nodeType":"ExpressionStatement","src":"1164:29:1"}]}},{"assignments":[572],"declarations":[{"constant":false,"id":572,"mutability":"mutable","name":"validAfter","nameLocation":"1220:10:1","nodeType":"VariableDeclaration","scope":589,"src":"1213:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":571,"name":"uint48","nodeType":"ElementaryTypeName","src":"1213:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":582,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":575,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":533,"src":"1240:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":578,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3438","id":576,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1259:2:1","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"313630","id":577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1264:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"1259:8:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":579,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1258:10:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"1240:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":574,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1233:6:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":573,"name":"uint48","nodeType":"ElementaryTypeName","src":"1233:6:1","typeDescriptions":{}}},"id":581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1233:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1213:56:1"},{"expression":{"arguments":[{"id":584,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":540,"src":"1301:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":585,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":572,"src":"1313:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":586,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":550,"src":"1325:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":583,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":531,"src":"1286:14:1","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$531_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1286:50:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":538,"id":588,"nodeType":"Return","src":"1279:57:1"}]},"id":590,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_parseValidationData","nameLocation":"913:20:1","nodeType":"FunctionDefinition","parameters":{"id":534,"nodeType":"ParameterList","parameters":[{"constant":false,"id":533,"mutability":"mutable","name":"validationData","nameLocation":"939:14:1","nodeType":"VariableDeclaration","scope":590,"src":"934:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":532,"name":"uint","nodeType":"ElementaryTypeName","src":"934:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"933:21:1"},"returnParameters":{"id":538,"nodeType":"ParameterList","parameters":[{"constant":false,"id":537,"mutability":"mutable","name":"data","nameLocation":"991:4:1","nodeType":"VariableDeclaration","scope":590,"src":"969:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":536,"nodeType":"UserDefinedTypeName","pathNode":{"id":535,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":531,"src":"969:14:1"},"referencedDeclaration":531,"src":"969:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"968:28:1"},"scope":761,"src":"904:439:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":674,"nodeType":"Block","src":"1515:804:1","statements":[{"assignments":[602],"declarations":[{"constant":false,"id":602,"mutability":"mutable","name":"accountValidationData","nameLocation":"1547:21:1","nodeType":"VariableDeclaration","scope":674,"src":"1525:43:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":601,"nodeType":"UserDefinedTypeName","pathNode":{"id":600,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":531,"src":"1525:14:1"},"referencedDeclaration":531,"src":"1525:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":606,"initialValue":{"arguments":[{"id":604,"name":"validationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":592,"src":"1592:14:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":603,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":590,"src":"1571:20:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$531_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1571:36:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1525:82:1"},{"assignments":[609],"declarations":[{"constant":false,"id":609,"mutability":"mutable","name":"pmValidationData","nameLocation":"1639:16:1","nodeType":"VariableDeclaration","scope":674,"src":"1617:38:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":608,"nodeType":"UserDefinedTypeName","pathNode":{"id":607,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":531,"src":"1617:14:1"},"referencedDeclaration":531,"src":"1617:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"id":613,"initialValue":{"arguments":[{"id":611,"name":"paymasterValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":594,"src":"1679:23:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":610,"name":"_parseValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":590,"src":"1658:20:1","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_struct$_ValidationData_$531_memory_ptr_$","typeString":"function (uint256) pure returns (struct ValidationData memory)"}},"id":612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1658:45:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"nodeType":"VariableDeclarationStatement","src":"1617:86:1"},{"assignments":[615],"declarations":[{"constant":false,"id":615,"mutability":"mutable","name":"aggregator","nameLocation":"1721:10:1","nodeType":"VariableDeclaration","scope":674,"src":"1713:18:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":614,"name":"address","nodeType":"ElementaryTypeName","src":"1713:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":618,"initialValue":{"expression":{"id":616,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":602,"src":"1734:21:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":617,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":526,"src":"1734:32:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1713:53:1"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":619,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":615,"src":"1780:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":622,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1802:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":621,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1794:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":620,"name":"address","nodeType":"ElementaryTypeName","src":"1794:7:1","typeDescriptions":{}}},"id":623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1794:10:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1780:24:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":631,"nodeType":"IfStatement","src":"1776:95:1","trueBody":{"id":630,"nodeType":"Block","src":"1806:65:1","statements":[{"expression":{"id":628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":625,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":615,"src":"1820:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":626,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":609,"src":"1833:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":627,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":526,"src":"1833:27:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1820:40:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":629,"nodeType":"ExpressionStatement","src":"1820:40:1"}]}},{"assignments":[633],"declarations":[{"constant":false,"id":633,"mutability":"mutable","name":"validAfter","nameLocation":"1887:10:1","nodeType":"VariableDeclaration","scope":674,"src":"1880:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":632,"name":"uint48","nodeType":"ElementaryTypeName","src":"1880:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":636,"initialValue":{"expression":{"id":634,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":602,"src":"1900:21:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":635,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":528,"src":"1900:32:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1880:52:1"},{"assignments":[638],"declarations":[{"constant":false,"id":638,"mutability":"mutable","name":"validUntil","nameLocation":"1949:10:1","nodeType":"VariableDeclaration","scope":674,"src":"1942:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":637,"name":"uint48","nodeType":"ElementaryTypeName","src":"1942:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":641,"initialValue":{"expression":{"id":639,"name":"accountValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":602,"src":"1962:21:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":640,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":530,"src":"1962:32:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"1942:52:1"},{"assignments":[643],"declarations":[{"constant":false,"id":643,"mutability":"mutable","name":"pmValidAfter","nameLocation":"2011:12:1","nodeType":"VariableDeclaration","scope":674,"src":"2004:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":642,"name":"uint48","nodeType":"ElementaryTypeName","src":"2004:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":646,"initialValue":{"expression":{"id":644,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":609,"src":"2026:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":645,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":528,"src":"2026:27:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2004:49:1"},{"assignments":[648],"declarations":[{"constant":false,"id":648,"mutability":"mutable","name":"pmValidUntil","nameLocation":"2070:12:1","nodeType":"VariableDeclaration","scope":674,"src":"2063:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":647,"name":"uint48","nodeType":"ElementaryTypeName","src":"2063:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"id":651,"initialValue":{"expression":{"id":649,"name":"pmValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":609,"src":"2085:16:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":650,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":530,"src":"2085:27:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"VariableDeclarationStatement","src":"2063:49:1"},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":652,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":633,"src":"2127:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":653,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":643,"src":"2140:12:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2127:25:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":659,"nodeType":"IfStatement","src":"2123:56:1","trueBody":{"expression":{"id":657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":655,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":633,"src":"2154:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":656,"name":"pmValidAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":643,"src":"2167:12:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2154:25:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":658,"nodeType":"ExpressionStatement","src":"2154:25:1"}},{"condition":{"commonType":{"typeIdentifier":"t_uint48","typeString":"uint48"},"id":662,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":660,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":638,"src":"2193:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":661,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":648,"src":"2206:12:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2193:25:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":667,"nodeType":"IfStatement","src":"2189:56:1","trueBody":{"expression":{"id":665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":663,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":638,"src":"2220:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":664,"name":"pmValidUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":648,"src":"2233:12:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"2220:25:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"id":666,"nodeType":"ExpressionStatement","src":"2220:25:1"}},{"expression":{"arguments":[{"id":669,"name":"aggregator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":615,"src":"2277:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":670,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":633,"src":"2289:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},{"id":671,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":638,"src":"2301:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint48","typeString":"uint48"},{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":668,"name":"ValidationData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":531,"src":"2262:14:1","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ValidationData_$531_storage_ptr_$","typeString":"type(struct ValidationData storage pointer)"}},"id":672,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2262:50:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"functionReturnParameters":599,"id":673,"nodeType":"Return","src":"2255:57:1"}]},"id":675,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_intersectTimeRange","nameLocation":"1401:19:1","nodeType":"FunctionDefinition","parameters":{"id":595,"nodeType":"ParameterList","parameters":[{"constant":false,"id":592,"mutability":"mutable","name":"validationData","nameLocation":"1429:14:1","nodeType":"VariableDeclaration","scope":675,"src":"1421:22:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":591,"name":"uint256","nodeType":"ElementaryTypeName","src":"1421:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":594,"mutability":"mutable","name":"paymasterValidationData","nameLocation":"1453:23:1","nodeType":"VariableDeclaration","scope":675,"src":"1445:31:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":593,"name":"uint256","nodeType":"ElementaryTypeName","src":"1445:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1420:57:1"},"returnParameters":{"id":599,"nodeType":"ParameterList","parameters":[{"constant":false,"id":598,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":675,"src":"1492:21:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":597,"nodeType":"UserDefinedTypeName","pathNode":{"id":596,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":531,"src":"1492:14:1"},"referencedDeclaration":531,"src":"1492:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"1491:23:1"},"scope":761,"src":"1392:927:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":711,"nodeType":"Block","src":"2511:127:1","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":697,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":686,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":679,"src":"2536:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":687,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"aggregator","nodeType":"MemberAccess","referencedDeclaration":526,"src":"2536:15:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":685,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2528:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":684,"name":"uint160","nodeType":"ElementaryTypeName","src":"2528:7:1","typeDescriptions":{}}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2528:24:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":691,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":679,"src":"2564:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":692,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validUntil","nodeType":"MemberAccess","referencedDeclaration":530,"src":"2564:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":690,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2556:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":689,"name":"uint256","nodeType":"ElementaryTypeName","src":"2556:7:1","typeDescriptions":{}}},"id":693,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2556:24:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":694,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2584:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"2556:31:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":696,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2555:33:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:60:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":707,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":700,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":679,"src":"2600:4:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData memory"}},"id":701,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"validAfter","nodeType":"MemberAccess","referencedDeclaration":528,"src":"2600:15:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":699,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2592:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":698,"name":"uint256","nodeType":"ElementaryTypeName","src":"2592:7:1","typeDescriptions":{}}},"id":702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2592:24:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":705,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":703,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2621:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":704,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2627:2:1","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"2621:8:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":706,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2620:10:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"2592:38:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":708,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2591:40:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2528:103:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":683,"id":710,"nodeType":"Return","src":"2521:110:1"}]},"documentation":{"id":676,"nodeType":"StructuredDocumentation","src":"2321:105:1","text":" helper to pack the return value for validateUserOp\n @param data - the ValidationData to pack"},"id":712,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2440:19:1","nodeType":"FunctionDefinition","parameters":{"id":680,"nodeType":"ParameterList","parameters":[{"constant":false,"id":679,"mutability":"mutable","name":"data","nameLocation":"2482:4:1","nodeType":"VariableDeclaration","scope":712,"src":"2460:26:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_memory_ptr","typeString":"struct ValidationData"},"typeName":{"id":678,"nodeType":"UserDefinedTypeName","pathNode":{"id":677,"name":"ValidationData","nodeType":"IdentifierPath","referencedDeclaration":531,"src":"2460:14:1"},"referencedDeclaration":531,"src":"2460:14:1","typeDescriptions":{"typeIdentifier":"t_struct$_ValidationData_$531_storage_ptr","typeString":"struct ValidationData"}},"visibility":"internal"}],"src":"2459:28:1"},"returnParameters":{"id":683,"nodeType":"ParameterList","parameters":[{"constant":false,"id":682,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":712,"src":"2502:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":681,"name":"uint256","nodeType":"ElementaryTypeName","src":"2502:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2501:9:1"},"scope":761,"src":"2431:207:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":749,"nodeType":"Block","src":"3062:112:1","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":736,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"condition":{"id":724,"name":"sigFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":715,"src":"3080:9:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"30","id":726,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3096:1:1","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"id":727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3080:17:1","trueExpression":{"hexValue":"31","id":725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3092:1:1","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":728,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3079:19:1","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":734,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":731,"name":"validUntil","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":717,"src":"3110:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":730,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3102:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":729,"name":"uint256","nodeType":"ElementaryTypeName","src":"3102:7:1","typeDescriptions":{}}},"id":732,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3102:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":733,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3125:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"3102:26:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":735,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3101:28:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:50:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":739,"name":"validAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":719,"src":"3141:10:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint48","typeString":"uint48"}],"id":738,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3133:7:1","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":737,"name":"uint256","nodeType":"ElementaryTypeName","src":"3133:7:1","typeDescriptions":{}}},"id":740,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3133:19:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"id":743,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313630","id":741,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3157:3:1","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3438","id":742,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3163:2:1","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"3157:8:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}}],"id":744,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3156:10:1","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"}},"src":"3133:33:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":746,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3132:35:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3079:88:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":723,"id":748,"nodeType":"Return","src":"3072:95:1"}]},"documentation":{"id":713,"nodeType":"StructuredDocumentation","src":"2640:311:1","text":" helper to pack the return value for validateUserOp, when not using an aggregator\n @param sigFailed - true for signature failure, false for success\n @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n @param validAfter first timestamp this UserOperation is valid"},"id":750,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"_packValidationData","nameLocation":"2965:19:1","nodeType":"FunctionDefinition","parameters":{"id":720,"nodeType":"ParameterList","parameters":[{"constant":false,"id":715,"mutability":"mutable","name":"sigFailed","nameLocation":"2990:9:1","nodeType":"VariableDeclaration","scope":750,"src":"2985:14:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":714,"name":"bool","nodeType":"ElementaryTypeName","src":"2985:4:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":717,"mutability":"mutable","name":"validUntil","nameLocation":"3008:10:1","nodeType":"VariableDeclaration","scope":750,"src":"3001:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":716,"name":"uint48","nodeType":"ElementaryTypeName","src":"3001:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":719,"mutability":"mutable","name":"validAfter","nameLocation":"3027:10:1","nodeType":"VariableDeclaration","scope":750,"src":"3020:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":718,"name":"uint48","nodeType":"ElementaryTypeName","src":"3020:6:1","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"2984:54:1"},"returnParameters":{"id":723,"nodeType":"ParameterList","parameters":[{"constant":false,"id":722,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":750,"src":"3053:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":721,"name":"uint256","nodeType":"ElementaryTypeName","src":"3053:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3052:9:1"},"scope":761,"src":"2956:218:1","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":759,"nodeType":"Block","src":"3429:193:1","statements":[{"AST":{"nodeType":"YulBlock","src":"3448:168:1","statements":[{"nodeType":"YulVariableDeclaration","src":"3462:22:1","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3479:4:1","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3473:5:1"},"nodeType":"YulFunctionCall","src":"3473:11:1"},"variables":[{"name":"mem","nodeType":"YulTypedName","src":"3466:3:1","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3497:22:1","value":{"name":"data.length","nodeType":"YulIdentifier","src":"3508:11:1"},"variables":[{"name":"len","nodeType":"YulTypedName","src":"3501:3:1","type":""}]},{"expression":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3545:3:1"},{"name":"data.offset","nodeType":"YulIdentifier","src":"3550:11:1"},{"name":"len","nodeType":"YulIdentifier","src":"3563:3:1"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"3532:12:1"},"nodeType":"YulFunctionCall","src":"3532:35:1"},"nodeType":"YulExpressionStatement","src":"3532:35:1"},{"nodeType":"YulAssignment","src":"3580:26:1","value":{"arguments":[{"name":"mem","nodeType":"YulIdentifier","src":"3597:3:1"},{"name":"len","nodeType":"YulIdentifier","src":"3602:3:1"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"3587:9:1"},"nodeType":"YulFunctionCall","src":"3587:19:1"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"3580:3:1"}]}]},"evmVersion":"london","externalReferences":[{"declaration":753,"isOffset":false,"isSlot":false,"src":"3508:11:1","suffix":"length","valueSize":1},{"declaration":753,"isOffset":true,"isSlot":false,"src":"3550:11:1","suffix":"offset","valueSize":1},{"declaration":756,"isOffset":false,"isSlot":false,"src":"3580:3:1","valueSize":1}],"id":758,"nodeType":"InlineAssembly","src":"3439:177:1"}]},"documentation":{"id":751,"nodeType":"StructuredDocumentation","src":"3176:176:1","text":" keccak function over calldata.\n @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it."},"id":760,"implemented":true,"kind":"freeFunction","modifiers":[],"name":"calldataKeccak","nameLocation":"3366:14:1","nodeType":"FunctionDefinition","parameters":{"id":754,"nodeType":"ParameterList","parameters":[{"constant":false,"id":753,"mutability":"mutable","name":"data","nameLocation":"3396:4:1","nodeType":"VariableDeclaration","scope":760,"src":"3381:19:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":752,"name":"bytes","nodeType":"ElementaryTypeName","src":"3381:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3380:21:1"},"returnParameters":{"id":757,"nodeType":"ParameterList","parameters":[{"constant":false,"id":756,"mutability":"mutable","name":"ret","nameLocation":"3424:3:1","nodeType":"VariableDeclaration","scope":760,"src":"3416:11:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":755,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3416:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3415:13:1"},"scope":761,"src":"3357:265:1","stateMutability":"pure","virtual":false,"visibility":"internal"}],"src":"36:3587:1"},"id":1},"contracts/interfaces/IAggregator.sol":{"ast":{"absolutePath":"contracts/interfaces/IAggregator.sol","exportedSymbols":{"IAggregator":[794],"UserOperation":[1149],"UserOperationLib":[1319],"calldataKeccak":[760]},"id":795,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":762,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:2"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":763,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":795,"sourceUnit":1320,"src":"62:29:2","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IAggregator","contractDependencies":[],"contractKind":"interface","documentation":{"id":764,"nodeType":"StructuredDocumentation","src":"93:43:2","text":" Aggregated Signatures validator."},"fullyImplemented":false,"id":794,"linearizedBaseContracts":[794],"name":"IAggregator","nameLocation":"147:11:2","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":765,"nodeType":"StructuredDocumentation","src":"166:136:2","text":" validate aggregated signature.\n revert if the aggregated signature does not match the given list of operations."},"functionSelector":"e3563a4f","id":774,"implemented":false,"kind":"function","modifiers":[],"name":"validateSignatures","nameLocation":"316:18:2","nodeType":"FunctionDefinition","parameters":{"id":772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":769,"mutability":"mutable","name":"userOps","nameLocation":"360:7:2","nodeType":"VariableDeclaration","scope":774,"src":"335:32:2","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":767,"nodeType":"UserDefinedTypeName","pathNode":{"id":766,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"335:13:2"},"referencedDeclaration":1149,"src":"335:13:2","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"id":768,"nodeType":"ArrayTypeName","src":"335:15:2","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":771,"mutability":"mutable","name":"signature","nameLocation":"384:9:2","nodeType":"VariableDeclaration","scope":774,"src":"369:24:2","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":770,"name":"bytes","nodeType":"ElementaryTypeName","src":"369:5:2","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"334:60:2"},"returnParameters":{"id":773,"nodeType":"ParameterList","parameters":[],"src":"408:0:2"},"scope":794,"src":"307:102:2","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":775,"nodeType":"StructuredDocumentation","src":"415:576:2","text":" validate signature of a single userOp\n This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n @param userOp the userOperation received from the user.\n @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n (usually empty, unless account and aggregator support some kind of \"multisig\""},"functionSelector":"64c530cd","id":783,"implemented":false,"kind":"function","modifiers":[],"name":"validateUserOpSignature","nameLocation":"1005:23:2","nodeType":"FunctionDefinition","parameters":{"id":779,"nodeType":"ParameterList","parameters":[{"constant":false,"id":778,"mutability":"mutable","name":"userOp","nameLocation":"1052:6:2","nodeType":"VariableDeclaration","scope":783,"src":"1029:29:2","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":777,"nodeType":"UserDefinedTypeName","pathNode":{"id":776,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"1029:13:2"},"referencedDeclaration":1149,"src":"1029:13:2","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1028:31:2"},"returnParameters":{"id":782,"nodeType":"ParameterList","parameters":[{"constant":false,"id":781,"mutability":"mutable","name":"sigForUserOp","nameLocation":"1100:12:2","nodeType":"VariableDeclaration","scope":783,"src":"1087:25:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":780,"name":"bytes","nodeType":"ElementaryTypeName","src":"1087:5:2","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1086:27:2"},"scope":794,"src":"996:118:2","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":784,"nodeType":"StructuredDocumentation","src":"1120:368:2","text":" aggregate multiple signatures into a single value.\n This method is called off-chain to calculate the signature to pass with handleOps()\n bundler MAY use optimized custom code perform this aggregation\n @param userOps array of UserOperations to collect the signatures from.\n @return aggregatedSignature the aggregated signature"},"functionSelector":"275e2d79","id":793,"implemented":false,"kind":"function","modifiers":[],"name":"aggregateSignatures","nameLocation":"1502:19:2","nodeType":"FunctionDefinition","parameters":{"id":789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":788,"mutability":"mutable","name":"userOps","nameLocation":"1547:7:2","nodeType":"VariableDeclaration","scope":793,"src":"1522:32:2","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":786,"nodeType":"UserDefinedTypeName","pathNode":{"id":785,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"1522:13:2"},"referencedDeclaration":1149,"src":"1522:13:2","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"id":787,"nodeType":"ArrayTypeName","src":"1522:15:2","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"}],"src":"1521:34:2"},"returnParameters":{"id":792,"nodeType":"ParameterList","parameters":[{"constant":false,"id":791,"mutability":"mutable","name":"aggregatedSignature","nameLocation":"1592:19:2","nodeType":"VariableDeclaration","scope":793,"src":"1579:32:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":790,"name":"bytes","nodeType":"ElementaryTypeName","src":"1579:5:2","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1578:34:2"},"scope":794,"src":"1493:120:2","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":795,"src":"137:1478:2","usedErrors":[]}],"src":"36:1580:2"},"id":2},"contracts/interfaces/IEntryPoint.sol":{"ast":{"absolutePath":"contracts/interfaces/IEntryPoint.sol","exportedSymbols":{"IAggregator":[794],"IEntryPoint":[998],"INonceManager":[1017],"IStakeManager":[1122],"UserOperation":[1149],"UserOperationLib":[1319],"calldataKeccak":[760]},"id":999,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":796,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"163:24:3"},{"absolutePath":"contracts/interfaces/UserOperation.sol","file":"./UserOperation.sol","id":797,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":999,"sourceUnit":1320,"src":"311:29:3","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IStakeManager.sol","file":"./IStakeManager.sol","id":798,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":999,"sourceUnit":1123,"src":"341:29:3","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/IAggregator.sol","file":"./IAggregator.sol","id":799,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":999,"sourceUnit":795,"src":"371:27:3","symbolAliases":[],"unitAlias":""},{"absolutePath":"contracts/interfaces/INonceManager.sol","file":"./INonceManager.sol","id":800,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":999,"sourceUnit":1018,"src":"399:29:3","symbolAliases":[],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":801,"name":"IStakeManager","nodeType":"IdentifierPath","referencedDeclaration":1122,"src":"455:13:3"},"id":802,"nodeType":"InheritanceSpecifier","src":"455:13:3"},{"baseName":{"id":803,"name":"INonceManager","nodeType":"IdentifierPath","referencedDeclaration":1017,"src":"470:13:3"},"id":804,"nodeType":"InheritanceSpecifier","src":"470:13:3"}],"canonicalName":"IEntryPoint","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":998,"linearizedBaseContracts":[998,1017,1122],"name":"IEntryPoint","nameLocation":"440:11:3","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","id":820,"name":"UserOperationEvent","nameLocation":"1191:18:3","nodeType":"EventDefinition","parameters":{"id":819,"nodeType":"ParameterList","parameters":[{"constant":false,"id":806,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1226:10:3","nodeType":"VariableDeclaration","scope":820,"src":"1210:26:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":805,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1210:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":808,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1254:6:3","nodeType":"VariableDeclaration","scope":820,"src":"1238:22:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":807,"name":"address","nodeType":"ElementaryTypeName","src":"1238:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":810,"indexed":true,"mutability":"mutable","name":"paymaster","nameLocation":"1278:9:3","nodeType":"VariableDeclaration","scope":820,"src":"1262:25:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":809,"name":"address","nodeType":"ElementaryTypeName","src":"1262:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":812,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"1297:5:3","nodeType":"VariableDeclaration","scope":820,"src":"1289:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":811,"name":"uint256","nodeType":"ElementaryTypeName","src":"1289:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":814,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"1309:7:3","nodeType":"VariableDeclaration","scope":820,"src":"1304:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":813,"name":"bool","nodeType":"ElementaryTypeName","src":"1304:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":816,"indexed":false,"mutability":"mutable","name":"actualGasCost","nameLocation":"1326:13:3","nodeType":"VariableDeclaration","scope":820,"src":"1318:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":815,"name":"uint256","nodeType":"ElementaryTypeName","src":"1318:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":818,"indexed":false,"mutability":"mutable","name":"actualGasUsed","nameLocation":"1349:13:3","nodeType":"VariableDeclaration","scope":820,"src":"1341:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":817,"name":"uint256","nodeType":"ElementaryTypeName","src":"1341:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1209:154:3"},"src":"1185:179:3"},{"anonymous":false,"documentation":{"id":821,"nodeType":"StructuredDocumentation","src":"1370:333:3","text":" account \"sender\" was deployed.\n @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n @param sender the account that is deployed\n @param factory the factory used to deploy this account (in the initCode)\n @param paymaster the paymaster used by this UserOp"},"eventSelector":"d51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d","id":831,"name":"AccountDeployed","nameLocation":"1714:15:3","nodeType":"EventDefinition","parameters":{"id":830,"nodeType":"ParameterList","parameters":[{"constant":false,"id":823,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"1746:10:3","nodeType":"VariableDeclaration","scope":831,"src":"1730:26:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":822,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1730:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":825,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1774:6:3","nodeType":"VariableDeclaration","scope":831,"src":"1758:22:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":824,"name":"address","nodeType":"ElementaryTypeName","src":"1758:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":827,"indexed":false,"mutability":"mutable","name":"factory","nameLocation":"1790:7:3","nodeType":"VariableDeclaration","scope":831,"src":"1782:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":826,"name":"address","nodeType":"ElementaryTypeName","src":"1782:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":829,"indexed":false,"mutability":"mutable","name":"paymaster","nameLocation":"1807:9:3","nodeType":"VariableDeclaration","scope":831,"src":"1799:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":828,"name":"address","nodeType":"ElementaryTypeName","src":"1799:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1729:88:3"},"src":"1708:110:3"},{"anonymous":false,"documentation":{"id":832,"nodeType":"StructuredDocumentation","src":"1824:337:3","text":" An event emitted if the UserOperation \"callData\" reverted with non-zero length\n @param userOpHash the request unique identifier.\n @param sender the sender of this request\n @param nonce the nonce used in the request\n @param revertReason - the return bytes from the (reverted) call to \"callData\"."},"eventSelector":"1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201","id":842,"name":"UserOperationRevertReason","nameLocation":"2172:25:3","nodeType":"EventDefinition","parameters":{"id":841,"nodeType":"ParameterList","parameters":[{"constant":false,"id":834,"indexed":true,"mutability":"mutable","name":"userOpHash","nameLocation":"2214:10:3","nodeType":"VariableDeclaration","scope":842,"src":"2198:26:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":833,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2198:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":836,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"2242:6:3","nodeType":"VariableDeclaration","scope":842,"src":"2226:22:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":835,"name":"address","nodeType":"ElementaryTypeName","src":"2226:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":838,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"2258:5:3","nodeType":"VariableDeclaration","scope":842,"src":"2250:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":837,"name":"uint256","nodeType":"ElementaryTypeName","src":"2250:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":840,"indexed":false,"mutability":"mutable","name":"revertReason","nameLocation":"2271:12:3","nodeType":"VariableDeclaration","scope":842,"src":"2265:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":839,"name":"bytes","nodeType":"ElementaryTypeName","src":"2265:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2197:87:3"},"src":"2166:119:3"},{"anonymous":false,"documentation":{"id":843,"nodeType":"StructuredDocumentation","src":"2291:158:3","text":" an event emitted by handleOps(), before starting the execution loop.\n any event emitted before this event, is part of the validation."},"eventSelector":"bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972","id":845,"name":"BeforeExecution","nameLocation":"2460:15:3","nodeType":"EventDefinition","parameters":{"id":844,"nodeType":"ParameterList","parameters":[],"src":"2475:2:3"},"src":"2454:24:3"},{"anonymous":false,"documentation":{"id":846,"nodeType":"StructuredDocumentation","src":"2484:101:3","text":" signature aggregator used by the following UserOperationEvents within this bundle."},"eventSelector":"575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d","id":850,"name":"SignatureAggregatorChanged","nameLocation":"2596:26:3","nodeType":"EventDefinition","parameters":{"id":849,"nodeType":"ParameterList","parameters":[{"constant":false,"id":848,"indexed":true,"mutability":"mutable","name":"aggregator","nameLocation":"2639:10:3","nodeType":"VariableDeclaration","scope":850,"src":"2623:26:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":847,"name":"address","nodeType":"ElementaryTypeName","src":"2623:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2622:28:3"},"src":"2590:61:3"},{"documentation":{"id":851,"nodeType":"StructuredDocumentation","src":"2657:756:3","text":" a custom revert error of handleOps, to identify the offending op.\n NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n @param reason - revert reason\n The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n so a failure can be attributed to the correct entity.\n Should be caught in off-chain handleOps simulation and not happen on-chain.\n Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."},"errorSelector":"220266b6","id":857,"name":"FailedOp","nameLocation":"3424:8:3","nodeType":"ErrorDefinition","parameters":{"id":856,"nodeType":"ParameterList","parameters":[{"constant":false,"id":853,"mutability":"mutable","name":"opIndex","nameLocation":"3441:7:3","nodeType":"VariableDeclaration","scope":857,"src":"3433:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":852,"name":"uint256","nodeType":"ElementaryTypeName","src":"3433:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":855,"mutability":"mutable","name":"reason","nameLocation":"3457:6:3","nodeType":"VariableDeclaration","scope":857,"src":"3450:13:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":854,"name":"string","nodeType":"ElementaryTypeName","src":"3450:6:3","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3432:32:3"},"src":"3418:47:3"},{"documentation":{"id":858,"nodeType":"StructuredDocumentation","src":"3471:114:3","text":" error case when a signature aggregator fails to verify the aggregated signature it had created."},"errorSelector":"86a9f750","id":862,"name":"SignatureValidationFailed","nameLocation":"3596:25:3","nodeType":"ErrorDefinition","parameters":{"id":861,"nodeType":"ParameterList","parameters":[{"constant":false,"id":860,"mutability":"mutable","name":"aggregator","nameLocation":"3630:10:3","nodeType":"VariableDeclaration","scope":862,"src":"3622:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":859,"name":"address","nodeType":"ElementaryTypeName","src":"3622:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3621:20:3"},"src":"3590:52:3"},{"documentation":{"id":863,"nodeType":"StructuredDocumentation","src":"3648:327:3","text":" Successful result from simulateValidation.\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)"},"errorSelector":"e0cff05f","id":877,"name":"ValidationResult","nameLocation":"3986:16:3","nodeType":"ErrorDefinition","parameters":{"id":876,"nodeType":"ParameterList","parameters":[{"constant":false,"id":866,"mutability":"mutable","name":"returnInfo","nameLocation":"4014:10:3","nodeType":"VariableDeclaration","scope":877,"src":"4003:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$974_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":865,"nodeType":"UserDefinedTypeName","pathNode":{"id":864,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":974,"src":"4003:10:3"},"referencedDeclaration":974,"src":"4003:10:3","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$974_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":869,"mutability":"mutable","name":"senderInfo","nameLocation":"4044:10:3","nodeType":"VariableDeclaration","scope":877,"src":"4034:20:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":868,"nodeType":"UserDefinedTypeName","pathNode":{"id":867,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4034:9:3"},"referencedDeclaration":1074,"src":"4034:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":872,"mutability":"mutable","name":"factoryInfo","nameLocation":"4066:11:3","nodeType":"VariableDeclaration","scope":877,"src":"4056:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":871,"nodeType":"UserDefinedTypeName","pathNode":{"id":870,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4056:9:3"},"referencedDeclaration":1074,"src":"4056:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":875,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4089:13:3","nodeType":"VariableDeclaration","scope":877,"src":"4079:23:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":874,"nodeType":"UserDefinedTypeName","pathNode":{"id":873,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4079:9:3"},"referencedDeclaration":1074,"src":"4079:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"src":"4002:101:3"},"src":"3980:124:3"},{"documentation":{"id":878,"nodeType":"StructuredDocumentation","src":"4110:561:3","text":" Successful result from simulateValidation, if the account returns a signature aggregator\n @param returnInfo gas and time-range returned values\n @param senderInfo stake information about the sender\n @param factoryInfo stake information about the factory (if any)\n @param paymasterInfo stake information about the paymaster (if any)\n @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n bundler MUST use it to verify the signature, or reject the UserOperation"},"errorSelector":"faecb4e4","id":895,"name":"ValidationResultWithAggregation","nameLocation":"4682:31:3","nodeType":"ErrorDefinition","parameters":{"id":894,"nodeType":"ParameterList","parameters":[{"constant":false,"id":881,"mutability":"mutable","name":"returnInfo","nameLocation":"4725:10:3","nodeType":"VariableDeclaration","scope":895,"src":"4714:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$974_memory_ptr","typeString":"struct IEntryPoint.ReturnInfo"},"typeName":{"id":880,"nodeType":"UserDefinedTypeName","pathNode":{"id":879,"name":"ReturnInfo","nodeType":"IdentifierPath","referencedDeclaration":974,"src":"4714:10:3"},"referencedDeclaration":974,"src":"4714:10:3","typeDescriptions":{"typeIdentifier":"t_struct$_ReturnInfo_$974_storage_ptr","typeString":"struct IEntryPoint.ReturnInfo"}},"visibility":"internal"},{"constant":false,"id":884,"mutability":"mutable","name":"senderInfo","nameLocation":"4755:10:3","nodeType":"VariableDeclaration","scope":895,"src":"4745:20:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":883,"nodeType":"UserDefinedTypeName","pathNode":{"id":882,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4745:9:3"},"referencedDeclaration":1074,"src":"4745:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":887,"mutability":"mutable","name":"factoryInfo","nameLocation":"4777:11:3","nodeType":"VariableDeclaration","scope":895,"src":"4767:21:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":886,"nodeType":"UserDefinedTypeName","pathNode":{"id":885,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4767:9:3"},"referencedDeclaration":1074,"src":"4767:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":890,"mutability":"mutable","name":"paymasterInfo","nameLocation":"4800:13:3","nodeType":"VariableDeclaration","scope":895,"src":"4790:23:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_memory_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":889,"nodeType":"UserDefinedTypeName","pathNode":{"id":888,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"4790:9:3"},"referencedDeclaration":1074,"src":"4790:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"},{"constant":false,"id":893,"mutability":"mutable","name":"aggregatorInfo","nameLocation":"4843:14:3","nodeType":"VariableDeclaration","scope":895,"src":"4823:34:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$980_memory_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"},"typeName":{"id":892,"nodeType":"UserDefinedTypeName","pathNode":{"id":891,"name":"AggregatorStakeInfo","nodeType":"IdentifierPath","referencedDeclaration":980,"src":"4823:19:3"},"referencedDeclaration":980,"src":"4823:19:3","typeDescriptions":{"typeIdentifier":"t_struct$_AggregatorStakeInfo_$980_storage_ptr","typeString":"struct IEntryPoint.AggregatorStakeInfo"}},"visibility":"internal"}],"src":"4713:145:3"},"src":"4676:183:3"},{"documentation":{"id":896,"nodeType":"StructuredDocumentation","src":"4865:51:3","text":" return value of getSenderAddress"},"errorSelector":"6ca7b806","id":900,"name":"SenderAddressResult","nameLocation":"4927:19:3","nodeType":"ErrorDefinition","parameters":{"id":899,"nodeType":"ParameterList","parameters":[{"constant":false,"id":898,"mutability":"mutable","name":"sender","nameLocation":"4955:6:3","nodeType":"VariableDeclaration","scope":900,"src":"4947:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":897,"name":"address","nodeType":"ElementaryTypeName","src":"4947:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4946:16:3"},"src":"4921:42:3"},{"documentation":{"id":901,"nodeType":"StructuredDocumentation","src":"4969:51:3","text":" return value of simulateHandleOp"},"errorSelector":"8b7ac980","id":915,"name":"ExecutionResult","nameLocation":"5031:15:3","nodeType":"ErrorDefinition","parameters":{"id":914,"nodeType":"ParameterList","parameters":[{"constant":false,"id":903,"mutability":"mutable","name":"preOpGas","nameLocation":"5055:8:3","nodeType":"VariableDeclaration","scope":915,"src":"5047:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":902,"name":"uint256","nodeType":"ElementaryTypeName","src":"5047:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":905,"mutability":"mutable","name":"paid","nameLocation":"5073:4:3","nodeType":"VariableDeclaration","scope":915,"src":"5065:12:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":904,"name":"uint256","nodeType":"ElementaryTypeName","src":"5065:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":907,"mutability":"mutable","name":"validAfter","nameLocation":"5086:10:3","nodeType":"VariableDeclaration","scope":915,"src":"5079:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":906,"name":"uint48","nodeType":"ElementaryTypeName","src":"5079:6:3","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":909,"mutability":"mutable","name":"validUntil","nameLocation":"5105:10:3","nodeType":"VariableDeclaration","scope":915,"src":"5098:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":908,"name":"uint48","nodeType":"ElementaryTypeName","src":"5098:6:3","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":911,"mutability":"mutable","name":"targetSuccess","nameLocation":"5122:13:3","nodeType":"VariableDeclaration","scope":915,"src":"5117:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":910,"name":"bool","nodeType":"ElementaryTypeName","src":"5117:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":913,"mutability":"mutable","name":"targetResult","nameLocation":"5143:12:3","nodeType":"VariableDeclaration","scope":915,"src":"5137:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":912,"name":"bytes","nodeType":"ElementaryTypeName","src":"5137:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5046:110:3"},"src":"5025:132:3"},{"canonicalName":"IEntryPoint.UserOpsPerAggregator","id":925,"members":[{"constant":false,"id":919,"mutability":"mutable","name":"userOps","nameLocation":"5255:7:3","nodeType":"VariableDeclaration","scope":925,"src":"5239:23:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":917,"nodeType":"UserDefinedTypeName","pathNode":{"id":916,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"5239:13:3"},"referencedDeclaration":1149,"src":"5239:13:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"id":918,"nodeType":"ArrayTypeName","src":"5239:15:3","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":922,"mutability":"mutable","name":"aggregator","nameLocation":"5315:10:3","nodeType":"VariableDeclaration","scope":925,"src":"5303:22:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$794","typeString":"contract IAggregator"},"typeName":{"id":921,"nodeType":"UserDefinedTypeName","pathNode":{"id":920,"name":"IAggregator","nodeType":"IdentifierPath","referencedDeclaration":794,"src":"5303:11:3"},"referencedDeclaration":794,"src":"5303:11:3","typeDescriptions":{"typeIdentifier":"t_contract$_IAggregator_$794","typeString":"contract IAggregator"}},"visibility":"internal"},{"constant":false,"id":924,"mutability":"mutable","name":"signature","nameLocation":"5373:9:3","nodeType":"VariableDeclaration","scope":925,"src":"5367:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":923,"name":"bytes","nodeType":"ElementaryTypeName","src":"5367:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOpsPerAggregator","nameLocation":"5208:20:3","nodeType":"StructDefinition","scope":998,"src":"5201:188:3","visibility":"public"},{"documentation":{"id":926,"nodeType":"StructuredDocumentation","src":"5395:368:3","text":" Execute a batch of UserOperation.\n no signature aggregator is used.\n if any account requires an aggregator (that is, it returned an aggregator when\n performing simulateValidation), then handleAggregatedOps() must be used instead.\n @param ops the operations to execute\n @param beneficiary the address to receive the fees"},"functionSelector":"1fad948c","id":935,"implemented":false,"kind":"function","modifiers":[],"name":"handleOps","nameLocation":"5777:9:3","nodeType":"FunctionDefinition","parameters":{"id":933,"nodeType":"ParameterList","parameters":[{"constant":false,"id":930,"mutability":"mutable","name":"ops","nameLocation":"5812:3:3","nodeType":"VariableDeclaration","scope":935,"src":"5787:28:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_calldata_ptr_$dyn_calldata_ptr","typeString":"struct UserOperation[]"},"typeName":{"baseType":{"id":928,"nodeType":"UserDefinedTypeName","pathNode":{"id":927,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"5787:13:3"},"referencedDeclaration":1149,"src":"5787:13:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"id":929,"nodeType":"ArrayTypeName","src":"5787:15:3","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOperation_$1149_storage_$dyn_storage_ptr","typeString":"struct UserOperation[]"}},"visibility":"internal"},{"constant":false,"id":932,"mutability":"mutable","name":"beneficiary","nameLocation":"5833:11:3","nodeType":"VariableDeclaration","scope":935,"src":"5817:27:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":931,"name":"address","nodeType":"ElementaryTypeName","src":"5817:15:3","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"5786:59:3"},"returnParameters":{"id":934,"nodeType":"ParameterList","parameters":[],"src":"5854:0:3"},"scope":998,"src":"5768:87:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":936,"nodeType":"StructuredDocumentation","src":"5861:249:3","text":" Execute a batch of UserOperation with Aggregators\n @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n @param beneficiary the address to receive the fees"},"functionSelector":"4b1d7cf5","id":945,"implemented":false,"kind":"function","modifiers":[],"name":"handleAggregatedOps","nameLocation":"6124:19:3","nodeType":"FunctionDefinition","parameters":{"id":943,"nodeType":"ParameterList","parameters":[{"constant":false,"id":940,"mutability":"mutable","name":"opsPerAggregator","nameLocation":"6185:16:3","nodeType":"VariableDeclaration","scope":945,"src":"6153:48:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$925_calldata_ptr_$dyn_calldata_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"},"typeName":{"baseType":{"id":938,"nodeType":"UserDefinedTypeName","pathNode":{"id":937,"name":"UserOpsPerAggregator","nodeType":"IdentifierPath","referencedDeclaration":925,"src":"6153:20:3"},"referencedDeclaration":925,"src":"6153:20:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOpsPerAggregator_$925_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator"}},"id":939,"nodeType":"ArrayTypeName","src":"6153:22:3","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_UserOpsPerAggregator_$925_storage_$dyn_storage_ptr","typeString":"struct IEntryPoint.UserOpsPerAggregator[]"}},"visibility":"internal"},{"constant":false,"id":942,"mutability":"mutable","name":"beneficiary","nameLocation":"6227:11:3","nodeType":"VariableDeclaration","scope":945,"src":"6211:27:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":941,"name":"address","nodeType":"ElementaryTypeName","src":"6211:15:3","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"6143:101:3"},"returnParameters":{"id":944,"nodeType":"ParameterList","parameters":[],"src":"6253:0:3"},"scope":998,"src":"6115:139:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":946,"nodeType":"StructuredDocumentation","src":"6260:197:3","text":" generate a request Id - unique identifier for this request.\n the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"functionSelector":"a6193531","id":954,"implemented":false,"kind":"function","modifiers":[],"name":"getUserOpHash","nameLocation":"6471:13:3","nodeType":"FunctionDefinition","parameters":{"id":950,"nodeType":"ParameterList","parameters":[{"constant":false,"id":949,"mutability":"mutable","name":"userOp","nameLocation":"6508:6:3","nodeType":"VariableDeclaration","scope":954,"src":"6485:29:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":948,"nodeType":"UserDefinedTypeName","pathNode":{"id":947,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"6485:13:3"},"referencedDeclaration":1149,"src":"6485:13:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6484:31:3"},"returnParameters":{"id":953,"nodeType":"ParameterList","parameters":[{"constant":false,"id":952,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":954,"src":"6539:7:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":951,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6539:7:3","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6538:9:3"},"scope":998,"src":"6462:86:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":955,"nodeType":"StructuredDocumentation","src":"6554:398:3","text":" Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n @param userOp the user operation to validate."},"functionSelector":"ee219423","id":961,"implemented":false,"kind":"function","modifiers":[],"name":"simulateValidation","nameLocation":"6966:18:3","nodeType":"FunctionDefinition","parameters":{"id":959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":958,"mutability":"mutable","name":"userOp","nameLocation":"7008:6:3","nodeType":"VariableDeclaration","scope":961,"src":"6985:29:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":957,"nodeType":"UserDefinedTypeName","pathNode":{"id":956,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"6985:13:3"},"referencedDeclaration":1149,"src":"6985:13:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"6984:31:3"},"returnParameters":{"id":960,"nodeType":"ParameterList","parameters":[],"src":"7024:0:3"},"scope":998,"src":"6957:68:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"canonicalName":"IEntryPoint.ReturnInfo","id":974,"members":[{"constant":false,"id":963,"mutability":"mutable","name":"preOpGas","nameLocation":"7660:8:3","nodeType":"VariableDeclaration","scope":974,"src":"7652:16:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":962,"name":"uint256","nodeType":"ElementaryTypeName","src":"7652:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":965,"mutability":"mutable","name":"prefund","nameLocation":"7686:7:3","nodeType":"VariableDeclaration","scope":974,"src":"7678:15:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":964,"name":"uint256","nodeType":"ElementaryTypeName","src":"7678:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":967,"mutability":"mutable","name":"sigFailed","nameLocation":"7708:9:3","nodeType":"VariableDeclaration","scope":974,"src":"7703:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":966,"name":"bool","nodeType":"ElementaryTypeName","src":"7703:4:3","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":969,"mutability":"mutable","name":"validAfter","nameLocation":"7734:10:3","nodeType":"VariableDeclaration","scope":974,"src":"7727:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":968,"name":"uint48","nodeType":"ElementaryTypeName","src":"7727:6:3","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":971,"mutability":"mutable","name":"validUntil","nameLocation":"7761:10:3","nodeType":"VariableDeclaration","scope":974,"src":"7754:17:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":970,"name":"uint48","nodeType":"ElementaryTypeName","src":"7754:6:3","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"},{"constant":false,"id":973,"mutability":"mutable","name":"paymasterContext","nameLocation":"7787:16:3","nodeType":"VariableDeclaration","scope":974,"src":"7781:22:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":972,"name":"bytes","nodeType":"ElementaryTypeName","src":"7781:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"ReturnInfo","nameLocation":"7631:10:3","nodeType":"StructDefinition","scope":998,"src":"7624:186:3","visibility":"public"},{"canonicalName":"IEntryPoint.AggregatorStakeInfo","id":980,"members":[{"constant":false,"id":976,"mutability":"mutable","name":"aggregator","nameLocation":"7990:10:3","nodeType":"VariableDeclaration","scope":980,"src":"7982:18:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":975,"name":"address","nodeType":"ElementaryTypeName","src":"7982:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":979,"mutability":"mutable","name":"stakeInfo","nameLocation":"8020:9:3","nodeType":"VariableDeclaration","scope":980,"src":"8010:19:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"},"typeName":{"id":978,"nodeType":"UserDefinedTypeName","pathNode":{"id":977,"name":"StakeInfo","nodeType":"IdentifierPath","referencedDeclaration":1074,"src":"8010:9:3"},"referencedDeclaration":1074,"src":"8010:9:3","typeDescriptions":{"typeIdentifier":"t_struct$_StakeInfo_$1074_storage_ptr","typeString":"struct IStakeManager.StakeInfo"}},"visibility":"internal"}],"name":"AggregatorStakeInfo","nameLocation":"7952:19:3","nodeType":"StructDefinition","scope":998,"src":"7945:91:3","visibility":"public"},{"documentation":{"id":981,"nodeType":"StructuredDocumentation","src":"8042:337:3","text":" Get counterfactual sender address.\n Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n this method always revert, and returns the address in SenderAddressResult error\n @param initCode the constructor code to be passed into the UserOperation."},"functionSelector":"9b249f69","id":986,"implemented":false,"kind":"function","modifiers":[],"name":"getSenderAddress","nameLocation":"8393:16:3","nodeType":"FunctionDefinition","parameters":{"id":984,"nodeType":"ParameterList","parameters":[{"constant":false,"id":983,"mutability":"mutable","name":"initCode","nameLocation":"8423:8:3","nodeType":"VariableDeclaration","scope":986,"src":"8410:21:3","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":982,"name":"bytes","nodeType":"ElementaryTypeName","src":"8410:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8409:23:3"},"returnParameters":{"id":985,"nodeType":"ParameterList","parameters":[],"src":"8441:0:3"},"scope":998,"src":"8384:58:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":987,"nodeType":"StructuredDocumentation","src":"8449:847:3","text":" simulate full execution of a UserOperation (including both validation and target execution)\n this method will always revert with \"ExecutionResult\".\n it performs full validation of the UserOperation, but ignores signature error.\n an optional target address is called after the userop succeeds, and its value is returned\n (before the entire call is reverted)\n Note that in order to collect the the success/failure of the target call, it must be executed\n with trace enabled to track the emitted events.\n @param op the UserOperation to simulate\n @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n are set to the return from that call.\n @param targetCallData callData to pass to target address"},"functionSelector":"d6383f94","id":997,"implemented":false,"kind":"function","modifiers":[],"name":"simulateHandleOp","nameLocation":"9310:16:3","nodeType":"FunctionDefinition","parameters":{"id":995,"nodeType":"ParameterList","parameters":[{"constant":false,"id":990,"mutability":"mutable","name":"op","nameLocation":"9350:2:3","nodeType":"VariableDeclaration","scope":997,"src":"9327:25:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":989,"nodeType":"UserDefinedTypeName","pathNode":{"id":988,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"9327:13:3"},"referencedDeclaration":1149,"src":"9327:13:3","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"},{"constant":false,"id":992,"mutability":"mutable","name":"target","nameLocation":"9362:6:3","nodeType":"VariableDeclaration","scope":997,"src":"9354:14:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":991,"name":"address","nodeType":"ElementaryTypeName","src":"9354:7:3","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":994,"mutability":"mutable","name":"targetCallData","nameLocation":"9385:14:3","nodeType":"VariableDeclaration","scope":997,"src":"9370:29:3","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":993,"name":"bytes","nodeType":"ElementaryTypeName","src":"9370:5:3","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9326:74:3"},"returnParameters":{"id":996,"nodeType":"ParameterList","parameters":[],"src":"9409:0:3"},"scope":998,"src":"9301:109:3","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":999,"src":"430:8982:3","usedErrors":[857,862,877,895,900,915]}],"src":"163:9251:3"},"id":3},"contracts/interfaces/INonceManager.sol":{"ast":{"absolutePath":"contracts/interfaces/INonceManager.sol","exportedSymbols":{"INonceManager":[1017]},"id":1018,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":1000,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:4"},{"abstract":false,"baseContracts":[],"canonicalName":"INonceManager","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":1017,"linearizedBaseContracts":[1017],"name":"INonceManager","nameLocation":"72:13:4","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":1001,"nodeType":"StructuredDocumentation","src":"93:416:4","text":" Return the next nonce for this sender.\n Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n But UserOp with different keys can come with arbitrary order.\n @param sender the account address\n @param key the high 192 bit of the nonce\n @return nonce a full nonce to pass for next UserOp with this sender."},"functionSelector":"35567e1a","id":1010,"implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"523:8:4","nodeType":"FunctionDefinition","parameters":{"id":1006,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1003,"mutability":"mutable","name":"sender","nameLocation":"540:6:4","nodeType":"VariableDeclaration","scope":1010,"src":"532:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1002,"name":"address","nodeType":"ElementaryTypeName","src":"532:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1005,"mutability":"mutable","name":"key","nameLocation":"556:3:4","nodeType":"VariableDeclaration","scope":1010,"src":"548:11:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":1004,"name":"uint192","nodeType":"ElementaryTypeName","src":"548:7:4","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"531:29:4"},"returnParameters":{"id":1009,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1008,"mutability":"mutable","name":"nonce","nameLocation":"596:5:4","nodeType":"VariableDeclaration","scope":1010,"src":"588:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1007,"name":"uint256","nodeType":"ElementaryTypeName","src":"588:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"587:15:4"},"scope":1017,"src":"514:89:4","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":1011,"nodeType":"StructuredDocumentation","src":"609:449:4","text":" Manually increment the nonce of the sender.\n This method is exposed just for completeness..\n Account does NOT need to call it, neither during validation, nor elsewhere,\n as the EntryPoint will update the nonce regardless.\n Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n UserOperations will not pay extra for the first transaction with a given key."},"functionSelector":"0bd28e3b","id":1016,"implemented":false,"kind":"function","modifiers":[],"name":"incrementNonce","nameLocation":"1072:14:4","nodeType":"FunctionDefinition","parameters":{"id":1014,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1013,"mutability":"mutable","name":"key","nameLocation":"1095:3:4","nodeType":"VariableDeclaration","scope":1016,"src":"1087:11:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":1012,"name":"uint192","nodeType":"ElementaryTypeName","src":"1087:7:4","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"1086:13:4"},"returnParameters":{"id":1015,"nodeType":"ParameterList","parameters":[],"src":"1108:0:4"},"scope":1017,"src":"1063:46:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":1018,"src":"62:1049:4","usedErrors":[]}],"src":"36:1076:4"},"id":4},"contracts/interfaces/IStakeManager.sol":{"ast":{"absolutePath":"contracts/interfaces/IStakeManager.sol","exportedSymbols":{"IStakeManager":[1122]},"id":1123,"license":"GPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1019,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"41:24:5"},{"abstract":false,"baseContracts":[],"canonicalName":"IStakeManager","contractDependencies":[],"contractKind":"interface","documentation":{"id":1020,"nodeType":"StructuredDocumentation","src":"67:211:5","text":" manage deposits and stakes.\n deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n stake is value locked for at least \"unstakeDelay\" by the staked entity."},"fullyImplemented":false,"id":1122,"linearizedBaseContracts":[1122],"name":"IStakeManager","nameLocation":"289:13:5","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4","id":1026,"name":"Deposited","nameLocation":"316:9:5","nodeType":"EventDefinition","parameters":{"id":1025,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1022,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"351:7:5","nodeType":"VariableDeclaration","scope":1026,"src":"335:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1021,"name":"address","nodeType":"ElementaryTypeName","src":"335:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1024,"indexed":false,"mutability":"mutable","name":"totalDeposit","nameLocation":"376:12:5","nodeType":"VariableDeclaration","scope":1026,"src":"368:20:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1023,"name":"uint256","nodeType":"ElementaryTypeName","src":"368:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"325:69:5"},"src":"310:85:5"},{"anonymous":false,"eventSelector":"d1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb","id":1034,"name":"Withdrawn","nameLocation":"407:9:5","nodeType":"EventDefinition","parameters":{"id":1033,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1028,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"442:7:5","nodeType":"VariableDeclaration","scope":1034,"src":"426:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1027,"name":"address","nodeType":"ElementaryTypeName","src":"426:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1030,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"467:15:5","nodeType":"VariableDeclaration","scope":1034,"src":"459:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1029,"name":"address","nodeType":"ElementaryTypeName","src":"459:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1032,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"500:6:5","nodeType":"VariableDeclaration","scope":1034,"src":"492:14:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1031,"name":"uint256","nodeType":"ElementaryTypeName","src":"492:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"416:96:5"},"src":"401:112:5"},{"anonymous":false,"documentation":{"id":1035,"nodeType":"StructuredDocumentation","src":"519:52:5","text":"Emitted when stake or unstake delay are modified"},"eventSelector":"a5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01","id":1043,"name":"StakeLocked","nameLocation":"582:11:5","nodeType":"EventDefinition","parameters":{"id":1042,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1037,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"619:7:5","nodeType":"VariableDeclaration","scope":1043,"src":"603:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1036,"name":"address","nodeType":"ElementaryTypeName","src":"603:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1039,"indexed":false,"mutability":"mutable","name":"totalStaked","nameLocation":"644:11:5","nodeType":"VariableDeclaration","scope":1043,"src":"636:19:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1038,"name":"uint256","nodeType":"ElementaryTypeName","src":"636:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1041,"indexed":false,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"673:15:5","nodeType":"VariableDeclaration","scope":1043,"src":"665:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1040,"name":"uint256","nodeType":"ElementaryTypeName","src":"665:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"593:101:5"},"src":"576:119:5"},{"anonymous":false,"documentation":{"id":1044,"nodeType":"StructuredDocumentation","src":"701:52:5","text":"Emitted once a stake is scheduled for withdrawal"},"eventSelector":"fa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a","id":1050,"name":"StakeUnlocked","nameLocation":"764:13:5","nodeType":"EventDefinition","parameters":{"id":1049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1046,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"803:7:5","nodeType":"VariableDeclaration","scope":1050,"src":"787:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1045,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1048,"indexed":false,"mutability":"mutable","name":"withdrawTime","nameLocation":"828:12:5","nodeType":"VariableDeclaration","scope":1050,"src":"820:20:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1047,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"777:69:5"},"src":"758:89:5"},{"anonymous":false,"eventSelector":"b7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3","id":1058,"name":"StakeWithdrawn","nameLocation":"859:14:5","nodeType":"EventDefinition","parameters":{"id":1057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1052,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"899:7:5","nodeType":"VariableDeclaration","scope":1058,"src":"883:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1051,"name":"address","nodeType":"ElementaryTypeName","src":"883:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1054,"indexed":false,"mutability":"mutable","name":"withdrawAddress","nameLocation":"924:15:5","nodeType":"VariableDeclaration","scope":1058,"src":"916:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1053,"name":"address","nodeType":"ElementaryTypeName","src":"916:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1056,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"957:6:5","nodeType":"VariableDeclaration","scope":1058,"src":"949:14:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1055,"name":"uint256","nodeType":"ElementaryTypeName","src":"949:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"873:96:5"},"src":"853:117:5"},{"canonicalName":"IStakeManager.DepositInfo","id":1069,"members":[{"constant":false,"id":1060,"mutability":"mutable","name":"deposit","nameLocation":"1650:7:5","nodeType":"VariableDeclaration","scope":1069,"src":"1642:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":1059,"name":"uint112","nodeType":"ElementaryTypeName","src":"1642:7:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":1062,"mutability":"mutable","name":"staked","nameLocation":"1672:6:5","nodeType":"VariableDeclaration","scope":1069,"src":"1667:11:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1061,"name":"bool","nodeType":"ElementaryTypeName","src":"1667:4:5","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1064,"mutability":"mutable","name":"stake","nameLocation":"1696:5:5","nodeType":"VariableDeclaration","scope":1069,"src":"1688:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":1063,"name":"uint112","nodeType":"ElementaryTypeName","src":"1688:7:5","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"},{"constant":false,"id":1066,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1718:15:5","nodeType":"VariableDeclaration","scope":1069,"src":"1711:22:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":1065,"name":"uint32","nodeType":"ElementaryTypeName","src":"1711:6:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":1068,"mutability":"mutable","name":"withdrawTime","nameLocation":"1750:12:5","nodeType":"VariableDeclaration","scope":1069,"src":"1743:19:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":1067,"name":"uint48","nodeType":"ElementaryTypeName","src":"1743:6:5","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"name":"DepositInfo","nameLocation":"1620:11:5","nodeType":"StructDefinition","scope":1122,"src":"1613:156:5","visibility":"public"},{"canonicalName":"IStakeManager.StakeInfo","id":1074,"members":[{"constant":false,"id":1071,"mutability":"mutable","name":"stake","nameLocation":"1871:5:5","nodeType":"VariableDeclaration","scope":1074,"src":"1863:13:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1070,"name":"uint256","nodeType":"ElementaryTypeName","src":"1863:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1073,"mutability":"mutable","name":"unstakeDelaySec","nameLocation":"1894:15:5","nodeType":"VariableDeclaration","scope":1074,"src":"1886:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1072,"name":"uint256","nodeType":"ElementaryTypeName","src":"1886:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"StakeInfo","nameLocation":"1843:9:5","nodeType":"StructDefinition","scope":1122,"src":"1836:80:5","visibility":"public"},{"documentation":{"id":1075,"nodeType":"StructuredDocumentation","src":"1922:60:5","text":"@return info - full deposit information of given account"},"functionSelector":"5287ce12","id":1083,"implemented":false,"kind":"function","modifiers":[],"name":"getDepositInfo","nameLocation":"1996:14:5","nodeType":"FunctionDefinition","parameters":{"id":1078,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1077,"mutability":"mutable","name":"account","nameLocation":"2019:7:5","nodeType":"VariableDeclaration","scope":1083,"src":"2011:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1076,"name":"address","nodeType":"ElementaryTypeName","src":"2011:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2010:17:5"},"returnParameters":{"id":1082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1081,"mutability":"mutable","name":"info","nameLocation":"2070:4:5","nodeType":"VariableDeclaration","scope":1083,"src":"2051:23:5","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$1069_memory_ptr","typeString":"struct IStakeManager.DepositInfo"},"typeName":{"id":1080,"nodeType":"UserDefinedTypeName","pathNode":{"id":1079,"name":"DepositInfo","nodeType":"IdentifierPath","referencedDeclaration":1069,"src":"2051:11:5"},"referencedDeclaration":1069,"src":"2051:11:5","typeDescriptions":{"typeIdentifier":"t_struct$_DepositInfo_$1069_storage_ptr","typeString":"struct IStakeManager.DepositInfo"}},"visibility":"internal"}],"src":"2050:25:5"},"scope":1122,"src":"1987:89:5","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":1084,"nodeType":"StructuredDocumentation","src":"2082:56:5","text":"@return the deposit (for gas payment) of the account"},"functionSelector":"70a08231","id":1091,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2152:9:5","nodeType":"FunctionDefinition","parameters":{"id":1087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1086,"mutability":"mutable","name":"account","nameLocation":"2170:7:5","nodeType":"VariableDeclaration","scope":1091,"src":"2162:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1085,"name":"address","nodeType":"ElementaryTypeName","src":"2162:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2161:17:5"},"returnParameters":{"id":1090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1089,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1091,"src":"2202:7:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1088,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2201:9:5"},"scope":1122,"src":"2143:68:5","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":1092,"nodeType":"StructuredDocumentation","src":"2217:58:5","text":" add to the deposit of the given account"},"functionSelector":"b760faf9","id":1097,"implemented":false,"kind":"function","modifiers":[],"name":"depositTo","nameLocation":"2289:9:5","nodeType":"FunctionDefinition","parameters":{"id":1095,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1094,"mutability":"mutable","name":"account","nameLocation":"2307:7:5","nodeType":"VariableDeclaration","scope":1097,"src":"2299:15:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1093,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:5","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2298:17:5"},"returnParameters":{"id":1096,"nodeType":"ParameterList","parameters":[],"src":"2332:0:5"},"scope":1122,"src":"2280:53:5","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":1098,"nodeType":"StructuredDocumentation","src":"2339:201:5","text":" add to the account's stake - amount and delay\n any pending unstake is first cancelled.\n @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn."},"functionSelector":"0396cb60","id":1103,"implemented":false,"kind":"function","modifiers":[],"name":"addStake","nameLocation":"2554:8:5","nodeType":"FunctionDefinition","parameters":{"id":1101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1100,"mutability":"mutable","name":"_unstakeDelaySec","nameLocation":"2570:16:5","nodeType":"VariableDeclaration","scope":1103,"src":"2563:23:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":1099,"name":"uint32","nodeType":"ElementaryTypeName","src":"2563:6:5","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2562:25:5"},"returnParameters":{"id":1102,"nodeType":"ParameterList","parameters":[],"src":"2604:0:5"},"scope":1122,"src":"2545:60:5","stateMutability":"payable","virtual":false,"visibility":"external"},{"documentation":{"id":1104,"nodeType":"StructuredDocumentation","src":"2611:128:5","text":" attempt to unlock the stake.\n the value can be withdrawn (using withdrawStake) after the unstake delay."},"functionSelector":"bb9fe6bf","id":1107,"implemented":false,"kind":"function","modifiers":[],"name":"unlockStake","nameLocation":"2753:11:5","nodeType":"FunctionDefinition","parameters":{"id":1105,"nodeType":"ParameterList","parameters":[],"src":"2764:2:5"},"returnParameters":{"id":1106,"nodeType":"ParameterList","parameters":[],"src":"2775:0:5"},"scope":1122,"src":"2744:32:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":1108,"nodeType":"StructuredDocumentation","src":"2782:194:5","text":" withdraw from the (unlocked) stake.\n must first call unlockStake and wait for the unstakeDelay to pass\n @param withdrawAddress the address to send withdrawn value."},"functionSelector":"c23a5cea","id":1113,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawStake","nameLocation":"2990:13:5","nodeType":"FunctionDefinition","parameters":{"id":1111,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1110,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3020:15:5","nodeType":"VariableDeclaration","scope":1113,"src":"3004:31:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":1109,"name":"address","nodeType":"ElementaryTypeName","src":"3004:15:5","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"3003:33:5"},"returnParameters":{"id":1112,"nodeType":"ParameterList","parameters":[],"src":"3045:0:5"},"scope":1122,"src":"2981:65:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":1114,"nodeType":"StructuredDocumentation","src":"3052:165:5","text":" withdraw from the deposit.\n @param withdrawAddress the address to send withdrawn value.\n @param withdrawAmount the amount to withdraw."},"functionSelector":"205c2878","id":1121,"implemented":false,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"3231:10:5","nodeType":"FunctionDefinition","parameters":{"id":1119,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1116,"mutability":"mutable","name":"withdrawAddress","nameLocation":"3258:15:5","nodeType":"VariableDeclaration","scope":1121,"src":"3242:31:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":1115,"name":"address","nodeType":"ElementaryTypeName","src":"3242:15:5","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":1118,"mutability":"mutable","name":"withdrawAmount","nameLocation":"3283:14:5","nodeType":"VariableDeclaration","scope":1121,"src":"3275:22:5","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1117,"name":"uint256","nodeType":"ElementaryTypeName","src":"3275:7:5","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3241:57:5"},"returnParameters":{"id":1120,"nodeType":"ParameterList","parameters":[],"src":"3307:0:5"},"scope":1122,"src":"3222:86:5","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":1123,"src":"279:3031:5","usedErrors":[]}],"src":"41:3270:5"},"id":5},"contracts/interfaces/UserOperation.sol":{"ast":{"absolutePath":"contracts/interfaces/UserOperation.sol","exportedSymbols":{"UserOperation":[1149],"UserOperationLib":[1319],"calldataKeccak":[760]},"id":1320,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":1124,"literals":["solidity","^","0.8",".12"],"nodeType":"PragmaDirective","src":"36:24:6"},{"absolutePath":"contracts/core/Helpers.sol","file":"../core/Helpers.sol","id":1126,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1320,"sourceUnit":761,"src":"104:51:6","symbolAliases":[{"foreign":{"id":1125,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"112:14:6","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"canonicalName":"UserOperation","id":1149,"members":[{"constant":false,"id":1128,"mutability":"mutable","name":"sender","nameLocation":"1249:6:6","nodeType":"VariableDeclaration","scope":1149,"src":"1241:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1127,"name":"address","nodeType":"ElementaryTypeName","src":"1241:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1130,"mutability":"mutable","name":"nonce","nameLocation":"1273:5:6","nodeType":"VariableDeclaration","scope":1149,"src":"1265:13:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1129,"name":"uint256","nodeType":"ElementaryTypeName","src":"1265:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1132,"mutability":"mutable","name":"initCode","nameLocation":"1294:8:6","nodeType":"VariableDeclaration","scope":1149,"src":"1288:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1131,"name":"bytes","nodeType":"ElementaryTypeName","src":"1288:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1134,"mutability":"mutable","name":"callData","nameLocation":"1318:8:6","nodeType":"VariableDeclaration","scope":1149,"src":"1312:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1133,"name":"bytes","nodeType":"ElementaryTypeName","src":"1312:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1136,"mutability":"mutable","name":"callGasLimit","nameLocation":"1344:12:6","nodeType":"VariableDeclaration","scope":1149,"src":"1336:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1135,"name":"uint256","nodeType":"ElementaryTypeName","src":"1336:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1138,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"1374:20:6","nodeType":"VariableDeclaration","scope":1149,"src":"1366:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1137,"name":"uint256","nodeType":"ElementaryTypeName","src":"1366:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1140,"mutability":"mutable","name":"preVerificationGas","nameLocation":"1412:18:6","nodeType":"VariableDeclaration","scope":1149,"src":"1404:26:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1139,"name":"uint256","nodeType":"ElementaryTypeName","src":"1404:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1142,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"1448:12:6","nodeType":"VariableDeclaration","scope":1149,"src":"1440:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1141,"name":"uint256","nodeType":"ElementaryTypeName","src":"1440:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1144,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"1478:20:6","nodeType":"VariableDeclaration","scope":1149,"src":"1470:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1143,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1146,"mutability":"mutable","name":"paymasterAndData","nameLocation":"1514:16:6","nodeType":"VariableDeclaration","scope":1149,"src":"1508:22:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1145,"name":"bytes","nodeType":"ElementaryTypeName","src":"1508:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":1148,"mutability":"mutable","name":"signature","nameLocation":"1546:9:6","nodeType":"VariableDeclaration","scope":1149,"src":"1540:15:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1147,"name":"bytes","nodeType":"ElementaryTypeName","src":"1540:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"UserOperation","nameLocation":"1216:13:6","nodeType":"StructDefinition","scope":1320,"src":"1209:353:6","visibility":"public"},{"abstract":false,"baseContracts":[],"canonicalName":"UserOperationLib","contractDependencies":[],"contractKind":"library","documentation":{"id":1150,"nodeType":"StructuredDocumentation","src":"1564:77:6","text":" Utility functions helpful when working with UserOperation structs."},"fullyImplemented":true,"id":1319,"linearizedBaseContracts":[1319],"name":"UserOperationLib","nameLocation":"1650:16:6","nodeType":"ContractDefinition","nodes":[{"body":{"id":1170,"nodeType":"Block","src":"1756:199:6","statements":[{"assignments":[1159],"declarations":[{"constant":false,"id":1159,"mutability":"mutable","name":"data","nameLocation":"1774:4:6","nodeType":"VariableDeclaration","scope":1170,"src":"1766:12:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1158,"name":"address","nodeType":"ElementaryTypeName","src":"1766:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1160,"nodeType":"VariableDeclarationStatement","src":"1766:12:6"},{"AST":{"nodeType":"YulBlock","src":"1880:30:6","statements":[{"nodeType":"YulAssignment","src":"1881:28:6","value":{"arguments":[{"name":"userOp","nodeType":"YulIdentifier","src":"1902:6:6"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1889:12:6"},"nodeType":"YulFunctionCall","src":"1889:20:6"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"1881:4:6"}]}]},"evmVersion":"london","externalReferences":[{"declaration":1159,"isOffset":false,"isSlot":false,"src":"1881:4:6","valueSize":1},{"declaration":1153,"isOffset":false,"isSlot":false,"src":"1902:6:6","valueSize":1}],"id":1161,"nodeType":"InlineAssembly","src":"1871:39:6"},{"expression":{"arguments":[{"arguments":[{"id":1166,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1159,"src":"1942:4:6","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1165,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1934:7:6","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":1164,"name":"uint160","nodeType":"ElementaryTypeName","src":"1934:7:6","typeDescriptions":{}}},"id":1167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1934:13:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":1163,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1926:7:6","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1162,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:6","typeDescriptions":{}}},"id":1168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1926:22:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":1157,"id":1169,"nodeType":"Return","src":"1919:29:6"}]},"id":1171,"implemented":true,"kind":"function","modifiers":[],"name":"getSender","nameLocation":"1683:9:6","nodeType":"FunctionDefinition","parameters":{"id":1154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1153,"mutability":"mutable","name":"userOp","nameLocation":"1716:6:6","nodeType":"VariableDeclaration","scope":1171,"src":"1693:29:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1152,"nodeType":"UserDefinedTypeName","pathNode":{"id":1151,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"1693:13:6"},"referencedDeclaration":1149,"src":"1693:13:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"1692:31:6"},"returnParameters":{"id":1157,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1156,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1171,"src":"1747:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1155,"name":"address","nodeType":"ElementaryTypeName","src":"1747:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1746:9:6"},"scope":1319,"src":"1674:281:6","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1205,"nodeType":"Block","src":"2176:391:6","statements":[{"id":1204,"nodeType":"UncheckedBlock","src":"2182:379:6","statements":[{"assignments":[1180],"declarations":[{"constant":false,"id":1180,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"2210:12:6","nodeType":"VariableDeclaration","scope":1204,"src":"2202:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1179,"name":"uint256","nodeType":"ElementaryTypeName","src":"2202:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1183,"initialValue":{"expression":{"id":1181,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1174,"src":"2225:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":1142,"src":"2225:19:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2202:42:6"},{"assignments":[1185],"declarations":[{"constant":false,"id":1185,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"2262:20:6","nodeType":"VariableDeclaration","scope":1204,"src":"2254:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1184,"name":"uint256","nodeType":"ElementaryTypeName","src":"2254:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1188,"initialValue":{"expression":{"id":1186,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1174,"src":"2285:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":1144,"src":"2285:27:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2254:58:6"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1189,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"2326:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1190,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1185,"src":"2342:20:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2326:36:6","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1195,"nodeType":"IfStatement","src":"2322:161:6","trueBody":{"id":1194,"nodeType":"Block","src":"2364:119:6","statements":[{"expression":{"id":1192,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"2460:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1178,"id":1193,"nodeType":"Return","src":"2453:19:6"}]}},{"expression":{"arguments":[{"id":1197,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1180,"src":"2503:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1201,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1198,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1185,"src":"2517:20:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":1199,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2540:5:6","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":1200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","src":"2540:13:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2517:36:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1196,"name":"min","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1318,"src":"2499:3:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":1202,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2499:55:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1178,"id":1203,"nodeType":"Return","src":"2492:62:6"}]}]},"id":1206,"implemented":true,"kind":"function","modifiers":[],"name":"gasPrice","nameLocation":"2104:8:6","nodeType":"FunctionDefinition","parameters":{"id":1175,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1174,"mutability":"mutable","name":"userOp","nameLocation":"2136:6:6","nodeType":"VariableDeclaration","scope":1206,"src":"2113:29:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1173,"nodeType":"UserDefinedTypeName","pathNode":{"id":1172,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"2113:13:6"},"referencedDeclaration":1149,"src":"2113:13:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2112:31:6"},"returnParameters":{"id":1178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1177,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1206,"src":"2167:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1176,"name":"uint256","nodeType":"ElementaryTypeName","src":"2167:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2166:9:6"},"scope":1319,"src":"2095:472:6","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1285,"nodeType":"Block","src":"2659:856:6","statements":[{"assignments":[1215],"declarations":[{"constant":false,"id":1215,"mutability":"mutable","name":"sender","nameLocation":"2677:6:6","nodeType":"VariableDeclaration","scope":1285,"src":"2669:14:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1214,"name":"address","nodeType":"ElementaryTypeName","src":"2669:7:6","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":1219,"initialValue":{"arguments":[{"id":1217,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2696:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":1216,"name":"getSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1171,"src":"2686:9:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$1149_calldata_ptr_$returns$_t_address_$","typeString":"function (struct UserOperation calldata) pure returns (address)"}},"id":1218,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2686:17:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2669:34:6"},{"assignments":[1221],"declarations":[{"constant":false,"id":1221,"mutability":"mutable","name":"nonce","nameLocation":"2721:5:6","nodeType":"VariableDeclaration","scope":1285,"src":"2713:13:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1220,"name":"uint256","nodeType":"ElementaryTypeName","src":"2713:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1224,"initialValue":{"expression":{"id":1222,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2729:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":1130,"src":"2729:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2713:28:6"},{"assignments":[1226],"declarations":[{"constant":false,"id":1226,"mutability":"mutable","name":"hashInitCode","nameLocation":"2759:12:6","nodeType":"VariableDeclaration","scope":1285,"src":"2751:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1225,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2751:7:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1231,"initialValue":{"arguments":[{"expression":{"id":1228,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2789:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initCode","nodeType":"MemberAccess","referencedDeclaration":1132,"src":"2789:15:6","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":1227,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"2774:14:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":1230,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2774:31:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2751:54:6"},{"assignments":[1233],"declarations":[{"constant":false,"id":1233,"mutability":"mutable","name":"hashCallData","nameLocation":"2823:12:6","nodeType":"VariableDeclaration","scope":1285,"src":"2815:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1232,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2815:7:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1238,"initialValue":{"arguments":[{"expression":{"id":1235,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2853:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":1134,"src":"2853:15:6","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":1234,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"2838:14:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":1237,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2838:31:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2815:54:6"},{"assignments":[1240],"declarations":[{"constant":false,"id":1240,"mutability":"mutable","name":"callGasLimit","nameLocation":"2887:12:6","nodeType":"VariableDeclaration","scope":1285,"src":"2879:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1239,"name":"uint256","nodeType":"ElementaryTypeName","src":"2879:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1243,"initialValue":{"expression":{"id":1241,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2902:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callGasLimit","nodeType":"MemberAccess","referencedDeclaration":1136,"src":"2902:19:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2879:42:6"},{"assignments":[1245],"declarations":[{"constant":false,"id":1245,"mutability":"mutable","name":"verificationGasLimit","nameLocation":"2939:20:6","nodeType":"VariableDeclaration","scope":1285,"src":"2931:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1244,"name":"uint256","nodeType":"ElementaryTypeName","src":"2931:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1248,"initialValue":{"expression":{"id":1246,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"2962:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verificationGasLimit","nodeType":"MemberAccess","referencedDeclaration":1138,"src":"2962:27:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2931:58:6"},{"assignments":[1250],"declarations":[{"constant":false,"id":1250,"mutability":"mutable","name":"preVerificationGas","nameLocation":"3007:18:6","nodeType":"VariableDeclaration","scope":1285,"src":"2999:26:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1249,"name":"uint256","nodeType":"ElementaryTypeName","src":"2999:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1253,"initialValue":{"expression":{"id":1251,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"3028:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1252,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"preVerificationGas","nodeType":"MemberAccess","referencedDeclaration":1140,"src":"3028:25:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2999:54:6"},{"assignments":[1255],"declarations":[{"constant":false,"id":1255,"mutability":"mutable","name":"maxFeePerGas","nameLocation":"3071:12:6","nodeType":"VariableDeclaration","scope":1285,"src":"3063:20:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1254,"name":"uint256","nodeType":"ElementaryTypeName","src":"3063:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1258,"initialValue":{"expression":{"id":1256,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"3086:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxFeePerGas","nodeType":"MemberAccess","referencedDeclaration":1142,"src":"3086:19:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3063:42:6"},{"assignments":[1260],"declarations":[{"constant":false,"id":1260,"mutability":"mutable","name":"maxPriorityFeePerGas","nameLocation":"3123:20:6","nodeType":"VariableDeclaration","scope":1285,"src":"3115:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1259,"name":"uint256","nodeType":"ElementaryTypeName","src":"3115:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1263,"initialValue":{"expression":{"id":1261,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"3146:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"maxPriorityFeePerGas","nodeType":"MemberAccess","referencedDeclaration":1144,"src":"3146:27:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3115:58:6"},{"assignments":[1265],"declarations":[{"constant":false,"id":1265,"mutability":"mutable","name":"hashPaymasterAndData","nameLocation":"3191:20:6","nodeType":"VariableDeclaration","scope":1285,"src":"3183:28:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1264,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3183:7:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":1270,"initialValue":{"arguments":[{"expression":{"id":1267,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1209,"src":"3229:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}},"id":1268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paymasterAndData","nodeType":"MemberAccess","referencedDeclaration":1146,"src":"3229:23:6","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":1266,"name":"calldataKeccak","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":760,"src":"3214:14:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_bytes32_$","typeString":"function (bytes calldata) pure returns (bytes32)"}},"id":1269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3214:39:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3183:70:6"},{"expression":{"arguments":[{"id":1273,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1215,"src":"3295:6:6","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1274,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1221,"src":"3303:5:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1275,"name":"hashInitCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1226,"src":"3322:12:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1276,"name":"hashCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1233,"src":"3336:12:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":1277,"name":"callGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1240,"src":"3362:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1278,"name":"verificationGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1245,"src":"3376:20:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1279,"name":"preVerificationGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1250,"src":"3398:18:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1280,"name":"maxFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1255,"src":"3430:12:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1281,"name":"maxPriorityFeePerGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1260,"src":"3444:20:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1282,"name":"hashPaymasterAndData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1265,"src":"3478:20:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":1271,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3271:3:6","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":1272,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"3271:10:6","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":1283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3271:237:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1213,"id":1284,"nodeType":"Return","src":"3264:244:6"}]},"id":1286,"implemented":true,"kind":"function","modifiers":[],"name":"pack","nameLocation":"2582:4:6","nodeType":"FunctionDefinition","parameters":{"id":1210,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1209,"mutability":"mutable","name":"userOp","nameLocation":"2610:6:6","nodeType":"VariableDeclaration","scope":1286,"src":"2587:29:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1208,"nodeType":"UserDefinedTypeName","pathNode":{"id":1207,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"2587:13:6"},"referencedDeclaration":1149,"src":"2587:13:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"2586:31:6"},"returnParameters":{"id":1213,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1212,"mutability":"mutable","name":"ret","nameLocation":"2654:3:6","nodeType":"VariableDeclaration","scope":1286,"src":"2641:16:6","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1211,"name":"bytes","nodeType":"ElementaryTypeName","src":"2641:5:6","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2640:18:6"},"scope":1319,"src":"2573:942:6","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1300,"nodeType":"Block","src":"3598:47:6","statements":[{"expression":{"arguments":[{"arguments":[{"id":1296,"name":"userOp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1289,"src":"3630:6:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation calldata"}],"id":1295,"name":"pack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1286,"src":"3625:4:6","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_UserOperation_$1149_calldata_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct UserOperation calldata) pure returns (bytes memory)"}},"id":1297,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3625:12:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1294,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"3615:9:6","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1298,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3615:23:6","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":1293,"id":1299,"nodeType":"Return","src":"3608:30:6"}]},"id":1301,"implemented":true,"kind":"function","modifiers":[],"name":"hash","nameLocation":"3530:4:6","nodeType":"FunctionDefinition","parameters":{"id":1290,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1289,"mutability":"mutable","name":"userOp","nameLocation":"3558:6:6","nodeType":"VariableDeclaration","scope":1301,"src":"3535:29:6","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_calldata_ptr","typeString":"struct UserOperation"},"typeName":{"id":1288,"nodeType":"UserDefinedTypeName","pathNode":{"id":1287,"name":"UserOperation","nodeType":"IdentifierPath","referencedDeclaration":1149,"src":"3535:13:6"},"referencedDeclaration":1149,"src":"3535:13:6","typeDescriptions":{"typeIdentifier":"t_struct$_UserOperation_$1149_storage_ptr","typeString":"struct UserOperation"}},"visibility":"internal"}],"src":"3534:31:6"},"returnParameters":{"id":1293,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1292,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1301,"src":"3589:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1291,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3589:7:6","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3588:9:6"},"scope":1319,"src":"3521:124:6","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1317,"nodeType":"Block","src":"3718:37:6","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1312,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1310,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1303,"src":"3735:1:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1311,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1305,"src":"3739:1:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3735:5:6","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":1314,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1305,"src":"3747:1:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1315,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"3735:13:6","trueExpression":{"id":1313,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1303,"src":"3743:1:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1309,"id":1316,"nodeType":"Return","src":"3728:20:6"}]},"id":1318,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"3660:3:6","nodeType":"FunctionDefinition","parameters":{"id":1306,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1303,"mutability":"mutable","name":"a","nameLocation":"3672:1:6","nodeType":"VariableDeclaration","scope":1318,"src":"3664:9:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1302,"name":"uint256","nodeType":"ElementaryTypeName","src":"3664:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1305,"mutability":"mutable","name":"b","nameLocation":"3683:1:6","nodeType":"VariableDeclaration","scope":1318,"src":"3675:9:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1304,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3663:22:6"},"returnParameters":{"id":1309,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1308,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1318,"src":"3709:7:6","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1307,"name":"uint256","nodeType":"ElementaryTypeName","src":"3709:7:6","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3708:9:6"},"scope":1319,"src":"3651:104:6","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1320,"src":"1642:2115:6","usedErrors":[]}],"src":"36:3722:6"},"id":6}},"contracts":{"contracts/bundler/EntryPointWrapper.sol":{"EntryPointWrapper":{"abi":[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"getCodeHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IEntryPoint","name":"entryPoint","type":"address"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"getUserOpHashes","outputs":[{"internalType":"bytes32[]","name":"ret","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[{"components":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"internalType":"struct EntryPointWrapper.FailedOpStatus","name":"","type":"tuple"},{"components":[{"internalType":"string","name":"selectorType","type":"string"},{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct EntryPointWrapper.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct EntryPointWrapper.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"internalType":"struct EntryPointWrapper.Response","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedOp(uint256,string)":[{"params":{"opIndex":"- index into the array of ops to the failed one (in simulateValidation, this is always zero)","reason":"- revert reason The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."}}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"params":{"factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"params":{"aggregatorInfo":"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation","factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"@_160":{"entryPoint":null,"id":160,"parameterSlots":1,"returnSlots":0},"abi_decode_tuple_t_contract$_IEntryPoint_$998_fromMemory":{"entryPoint":1393,"id":null,"parameterSlots":2,"returnSlots":1},"array_dataslot_bytes_storage":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"clean_up_bytearray_end_slots_bytes_storage":{"entryPoint":1106,"id":null,"parameterSlots":3,"returnSlots":0},"copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage":{"entryPoint":1189,"id":null,"parameterSlots":2,"returnSlots":0},"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"extract_byte_array_length":{"entryPoint":1046,"id":null,"parameterSlots":1,"returnSlots":1},"extract_used_part_and_set_length_of_short_byte_array":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":1024,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:4395:7","statements":[{"nodeType":"YulBlock","src":"6:3:7","statements":[]},{"body":{"nodeType":"YulBlock","src":"46:95:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"63:1:7","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"70:3:7","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"75:10:7","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"66:3:7"},"nodeType":"YulFunctionCall","src":"66:20:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"56:6:7"},"nodeType":"YulFunctionCall","src":"56:31:7"},"nodeType":"YulExpressionStatement","src":"56:31:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"103:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"106:4:7","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"96:6:7"},"nodeType":"YulFunctionCall","src":"96:15:7"},"nodeType":"YulExpressionStatement","src":"96:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"127:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"130:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"120:6:7"},"nodeType":"YulFunctionCall","src":"120:15:7"},"nodeType":"YulExpressionStatement","src":"120:15:7"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"14:127:7"},{"body":{"nodeType":"YulBlock","src":"201:325:7","statements":[{"nodeType":"YulAssignment","src":"211:22:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"225:1:7","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"228:4:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"221:3:7"},"nodeType":"YulFunctionCall","src":"221:12:7"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"211:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"242:38:7","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"272:4:7"},{"kind":"number","nodeType":"YulLiteral","src":"278:1:7","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"268:3:7"},"nodeType":"YulFunctionCall","src":"268:12:7"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"246:18:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"319:31:7","statements":[{"nodeType":"YulAssignment","src":"321:27:7","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"335:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"343:4:7","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"331:3:7"},"nodeType":"YulFunctionCall","src":"331:17:7"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"321:6:7"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"299:18:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"292:6:7"},"nodeType":"YulFunctionCall","src":"292:26:7"},"nodeType":"YulIf","src":"289:61:7"},{"body":{"nodeType":"YulBlock","src":"409:111:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"430:1:7","type":"","value":"0"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"437:3:7","type":"","value":"224"},{"kind":"number","nodeType":"YulLiteral","src":"442:10:7","type":"","value":"0x4e487b71"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"433:3:7"},"nodeType":"YulFunctionCall","src":"433:20:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"423:6:7"},"nodeType":"YulFunctionCall","src":"423:31:7"},"nodeType":"YulExpressionStatement","src":"423:31:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"474:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"477:4:7","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"467:6:7"},"nodeType":"YulFunctionCall","src":"467:15:7"},"nodeType":"YulExpressionStatement","src":"467:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"502:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"505:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"495:6:7"},"nodeType":"YulFunctionCall","src":"495:15:7"},"nodeType":"YulExpressionStatement","src":"495:15:7"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"365:18:7"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"388:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"396:2:7","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"385:2:7"},"nodeType":"YulFunctionCall","src":"385:14:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"362:2:7"},"nodeType":"YulFunctionCall","src":"362:38:7"},"nodeType":"YulIf","src":"359:161:7"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"181:4:7","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"190:6:7","type":""}],"src":"146:380:7"},{"body":{"nodeType":"YulBlock","src":"586:65:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"603:1:7","type":"","value":"0"},{"name":"ptr","nodeType":"YulIdentifier","src":"606:3:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"596:6:7"},"nodeType":"YulFunctionCall","src":"596:14:7"},"nodeType":"YulExpressionStatement","src":"596:14:7"},{"nodeType":"YulAssignment","src":"619:26:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"637:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"640:4:7","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"627:9:7"},"nodeType":"YulFunctionCall","src":"627:18:7"},"variableNames":[{"name":"data","nodeType":"YulIdentifier","src":"619:4:7"}]}]},"name":"array_dataslot_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"ptr","nodeType":"YulTypedName","src":"569:3:7","type":""}],"returnVariables":[{"name":"data","nodeType":"YulTypedName","src":"577:4:7","type":""}],"src":"531:120:7"},{"body":{"nodeType":"YulBlock","src":"736:464:7","statements":[{"body":{"nodeType":"YulBlock","src":"769:425:7","statements":[{"nodeType":"YulVariableDeclaration","src":"783:11:7","value":{"kind":"number","nodeType":"YulLiteral","src":"793:1:7","type":"","value":"0"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"787:2:7","type":""}]},{"expression":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"814:2:7"},{"name":"array","nodeType":"YulIdentifier","src":"818:5:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"807:6:7"},"nodeType":"YulFunctionCall","src":"807:17:7"},"nodeType":"YulExpressionStatement","src":"807:17:7"},{"nodeType":"YulVariableDeclaration","src":"837:31:7","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"859:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"863:4:7","type":"","value":"0x20"}],"functionName":{"name":"keccak256","nodeType":"YulIdentifier","src":"849:9:7"},"nodeType":"YulFunctionCall","src":"849:19:7"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"841:4:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"881:57:7","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"904:4:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"914:1:7","type":"","value":"5"},{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"921:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"933:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"917:3:7"},"nodeType":"YulFunctionCall","src":"917:19:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"910:3:7"},"nodeType":"YulFunctionCall","src":"910:27:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"900:3:7"},"nodeType":"YulFunctionCall","src":"900:38:7"},"variables":[{"name":"deleteStart","nodeType":"YulTypedName","src":"885:11:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"975:23:7","statements":[{"nodeType":"YulAssignment","src":"977:19:7","value":{"name":"data","nodeType":"YulIdentifier","src":"992:4:7"},"variableNames":[{"name":"deleteStart","nodeType":"YulIdentifier","src":"977:11:7"}]}]},"condition":{"arguments":[{"name":"startIndex","nodeType":"YulIdentifier","src":"957:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"969:4:7","type":"","value":"0x20"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"954:2:7"},"nodeType":"YulFunctionCall","src":"954:20:7"},"nodeType":"YulIf","src":"951:47:7"},{"nodeType":"YulVariableDeclaration","src":"1011:41:7","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1025:4:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1035:1:7","type":"","value":"5"},{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"1042:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"1047:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1038:3:7"},"nodeType":"YulFunctionCall","src":"1038:12:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1031:3:7"},"nodeType":"YulFunctionCall","src":"1031:20:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1021:3:7"},"nodeType":"YulFunctionCall","src":"1021:31:7"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"1015:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1065:24:7","value":{"name":"deleteStart","nodeType":"YulIdentifier","src":"1078:11:7"},"variables":[{"name":"start","nodeType":"YulTypedName","src":"1069:5:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"1163:21:7","statements":[{"expression":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1172:5:7"},{"name":"_1","nodeType":"YulIdentifier","src":"1179:2:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"1165:6:7"},"nodeType":"YulFunctionCall","src":"1165:17:7"},"nodeType":"YulExpressionStatement","src":"1165:17:7"}]},"condition":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1113:5:7"},{"name":"_2","nodeType":"YulIdentifier","src":"1120:2:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1110:2:7"},"nodeType":"YulFunctionCall","src":"1110:13:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1124:26:7","statements":[{"nodeType":"YulAssignment","src":"1126:22:7","value":{"arguments":[{"name":"start","nodeType":"YulIdentifier","src":"1139:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"1146:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1135:3:7"},"nodeType":"YulFunctionCall","src":"1135:13:7"},"variableNames":[{"name":"start","nodeType":"YulIdentifier","src":"1126:5:7"}]}]},"pre":{"nodeType":"YulBlock","src":"1106:3:7","statements":[]},"src":"1102:82:7"}]},"condition":{"arguments":[{"name":"len","nodeType":"YulIdentifier","src":"752:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"757:2:7","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"749:2:7"},"nodeType":"YulFunctionCall","src":"749:11:7"},"nodeType":"YulIf","src":"746:448:7"}]},"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"708:5:7","type":""},{"name":"len","nodeType":"YulTypedName","src":"715:3:7","type":""},{"name":"startIndex","nodeType":"YulTypedName","src":"720:10:7","type":""}],"src":"656:544:7"},{"body":{"nodeType":"YulBlock","src":"1290:81:7","statements":[{"nodeType":"YulAssignment","src":"1300:65:7","value":{"arguments":[{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"1315:4:7"},{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1333:1:7","type":"","value":"3"},{"name":"len","nodeType":"YulIdentifier","src":"1336:3:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1329:3:7"},"nodeType":"YulFunctionCall","src":"1329:11:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1346:1:7","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1342:3:7"},"nodeType":"YulFunctionCall","src":"1342:6:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"1325:3:7"},"nodeType":"YulFunctionCall","src":"1325:24:7"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1321:3:7"},"nodeType":"YulFunctionCall","src":"1321:29:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1311:3:7"},"nodeType":"YulFunctionCall","src":"1311:40:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1357:1:7","type":"","value":"1"},{"name":"len","nodeType":"YulIdentifier","src":"1360:3:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1353:3:7"},"nodeType":"YulFunctionCall","src":"1353:11:7"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1308:2:7"},"nodeType":"YulFunctionCall","src":"1308:57:7"},"variableNames":[{"name":"used","nodeType":"YulIdentifier","src":"1300:4:7"}]}]},"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"1267:4:7","type":""},{"name":"len","nodeType":"YulTypedName","src":"1273:3:7","type":""}],"returnVariables":[{"name":"used","nodeType":"YulTypedName","src":"1281:4:7","type":""}],"src":"1205:166:7"},{"body":{"nodeType":"YulBlock","src":"1470:1254:7","statements":[{"nodeType":"YulVariableDeclaration","src":"1480:24:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"1500:3:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1494:5:7"},"nodeType":"YulFunctionCall","src":"1494:10:7"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"1484:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"1547:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1549:16:7"},"nodeType":"YulFunctionCall","src":"1549:18:7"},"nodeType":"YulExpressionStatement","src":"1549:18:7"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1519:6:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1535:2:7","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"1539:1:7","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1531:3:7"},"nodeType":"YulFunctionCall","src":"1531:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"1543:1:7","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"1527:3:7"},"nodeType":"YulFunctionCall","src":"1527:18:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1516:2:7"},"nodeType":"YulFunctionCall","src":"1516:30:7"},"nodeType":"YulIf","src":"1513:56:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1621:4:7"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1659:4:7"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"1653:5:7"},"nodeType":"YulFunctionCall","src":"1653:11:7"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"1627:25:7"},"nodeType":"YulFunctionCall","src":"1627:38:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"1667:6:7"}],"functionName":{"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulIdentifier","src":"1578:42:7"},"nodeType":"YulFunctionCall","src":"1578:96:7"},"nodeType":"YulExpressionStatement","src":"1578:96:7"},{"nodeType":"YulVariableDeclaration","src":"1683:18:7","value":{"kind":"number","nodeType":"YulLiteral","src":"1700:1:7","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"1687:9:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1710:23:7","value":{"kind":"number","nodeType":"YulLiteral","src":"1729:4:7","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"1714:11:7","type":""}]},{"nodeType":"YulAssignment","src":"1742:24:7","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"1755:11:7"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"1742:9:7"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"1812:655:7","statements":[{"nodeType":"YulVariableDeclaration","src":"1826:35:7","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1845:6:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1857:2:7","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"1853:3:7"},"nodeType":"YulFunctionCall","src":"1853:7:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1841:3:7"},"nodeType":"YulFunctionCall","src":"1841:20:7"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"1830:7:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1874:48:7","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"1917:4:7"}],"functionName":{"name":"array_dataslot_bytes_storage","nodeType":"YulIdentifier","src":"1888:28:7"},"nodeType":"YulFunctionCall","src":"1888:34:7"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"1878:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1935:10:7","value":{"kind":"number","nodeType":"YulLiteral","src":"1944:1:7","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"1939:1:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"2022:172:7","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2047:6:7"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2065:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2070:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2061:3:7"},"nodeType":"YulFunctionCall","src":"2061:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2055:5:7"},"nodeType":"YulFunctionCall","src":"2055:26:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2040:6:7"},"nodeType":"YulFunctionCall","src":"2040:42:7"},"nodeType":"YulExpressionStatement","src":"2040:42:7"},{"nodeType":"YulAssignment","src":"2099:24:7","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2113:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"2121:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2109:3:7"},"nodeType":"YulFunctionCall","src":"2109:14:7"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2099:6:7"}]},{"nodeType":"YulAssignment","src":"2140:40:7","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2157:9:7"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"2168:11:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2153:3:7"},"nodeType":"YulFunctionCall","src":"2153:27:7"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"2140:9:7"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1969:1:7"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"1972:7:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1966:2:7"},"nodeType":"YulFunctionCall","src":"1966:14:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"1981:28:7","statements":[{"nodeType":"YulAssignment","src":"1983:24:7","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"1992:1:7"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"1995:11:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1988:3:7"},"nodeType":"YulFunctionCall","src":"1988:19:7"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"1983:1:7"}]}]},"pre":{"nodeType":"YulBlock","src":"1962:3:7","statements":[]},"src":"1958:236:7"},{"body":{"nodeType":"YulBlock","src":"2242:166:7","statements":[{"nodeType":"YulVariableDeclaration","src":"2260:43:7","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2287:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2292:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2283:3:7"},"nodeType":"YulFunctionCall","src":"2283:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2277:5:7"},"nodeType":"YulFunctionCall","src":"2277:26:7"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"2264:9:7","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"2327:6:7"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"2339:9:7"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2366:1:7","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"2369:6:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2362:3:7"},"nodeType":"YulFunctionCall","src":"2362:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"2378:3:7","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2358:3:7"},"nodeType":"YulFunctionCall","src":"2358:24:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2388:1:7","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2384:3:7"},"nodeType":"YulFunctionCall","src":"2384:6:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"2354:3:7"},"nodeType":"YulFunctionCall","src":"2354:37:7"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"2350:3:7"},"nodeType":"YulFunctionCall","src":"2350:42:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"2335:3:7"},"nodeType":"YulFunctionCall","src":"2335:58:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2320:6:7"},"nodeType":"YulFunctionCall","src":"2320:74:7"},"nodeType":"YulExpressionStatement","src":"2320:74:7"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"2213:7:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"2222:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"2210:2:7"},"nodeType":"YulFunctionCall","src":"2210:19:7"},"nodeType":"YulIf","src":"2207:201:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2428:4:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2442:1:7","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"2445:6:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2438:3:7"},"nodeType":"YulFunctionCall","src":"2438:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"2454:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2434:3:7"},"nodeType":"YulFunctionCall","src":"2434:22:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2421:6:7"},"nodeType":"YulFunctionCall","src":"2421:36:7"},"nodeType":"YulExpressionStatement","src":"2421:36:7"}]},"nodeType":"YulCase","src":"1805:662:7","value":{"kind":"number","nodeType":"YulLiteral","src":"1810:1:7","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"2484:234:7","statements":[{"nodeType":"YulVariableDeclaration","src":"2498:14:7","value":{"kind":"number","nodeType":"YulLiteral","src":"2511:1:7","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2502:5:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"2547:67:7","statements":[{"nodeType":"YulAssignment","src":"2565:35:7","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2584:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"2589:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2580:3:7"},"nodeType":"YulFunctionCall","src":"2580:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2574:5:7"},"nodeType":"YulFunctionCall","src":"2574:26:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"2565:5:7"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"2528:6:7"},"nodeType":"YulIf","src":"2525:89:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2634:4:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2693:5:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"2700:6:7"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"2640:52:7"},"nodeType":"YulFunctionCall","src":"2640:67:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"2627:6:7"},"nodeType":"YulFunctionCall","src":"2627:81:7"},"nodeType":"YulExpressionStatement","src":"2627:81:7"}]},"nodeType":"YulCase","src":"2476:242:7","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"1785:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"1793:2:7","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1782:2:7"},"nodeType":"YulFunctionCall","src":"1782:14:7"},"nodeType":"YulSwitch","src":"1775:943:7"}]},"name":"copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"1455:4:7","type":""},{"name":"src","nodeType":"YulTypedName","src":"1461:3:7","type":""}],"src":"1376:1348:7"},{"body":{"nodeType":"YulBlock","src":"2825:1254:7","statements":[{"nodeType":"YulVariableDeclaration","src":"2835:24:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"2855:3:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"2849:5:7"},"nodeType":"YulFunctionCall","src":"2849:10:7"},"variables":[{"name":"newLen","nodeType":"YulTypedName","src":"2839:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"2902:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"2904:16:7"},"nodeType":"YulFunctionCall","src":"2904:18:7"},"nodeType":"YulExpressionStatement","src":"2904:18:7"}]},"condition":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"2874:6:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2890:2:7","type":"","value":"64"},{"kind":"number","nodeType":"YulLiteral","src":"2894:1:7","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"2886:3:7"},"nodeType":"YulFunctionCall","src":"2886:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"2898:1:7","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2882:3:7"},"nodeType":"YulFunctionCall","src":"2882:18:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2871:2:7"},"nodeType":"YulFunctionCall","src":"2871:30:7"},"nodeType":"YulIf","src":"2868:56:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"2976:4:7"},{"arguments":[{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3014:4:7"}],"functionName":{"name":"sload","nodeType":"YulIdentifier","src":"3008:5:7"},"nodeType":"YulFunctionCall","src":"3008:11:7"}],"functionName":{"name":"extract_byte_array_length","nodeType":"YulIdentifier","src":"2982:25:7"},"nodeType":"YulFunctionCall","src":"2982:38:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"3022:6:7"}],"functionName":{"name":"clean_up_bytearray_end_slots_bytes_storage","nodeType":"YulIdentifier","src":"2933:42:7"},"nodeType":"YulFunctionCall","src":"2933:96:7"},"nodeType":"YulExpressionStatement","src":"2933:96:7"},{"nodeType":"YulVariableDeclaration","src":"3038:18:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3055:1:7","type":"","value":"0"},"variables":[{"name":"srcOffset","nodeType":"YulTypedName","src":"3042:9:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3065:23:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3084:4:7","type":"","value":"0x20"},"variables":[{"name":"srcOffset_1","nodeType":"YulTypedName","src":"3069:11:7","type":""}]},{"nodeType":"YulAssignment","src":"3097:24:7","value":{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3110:11:7"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3097:9:7"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"3167:655:7","statements":[{"nodeType":"YulVariableDeclaration","src":"3181:35:7","value":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3200:6:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3212:2:7","type":"","value":"31"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3208:3:7"},"nodeType":"YulFunctionCall","src":"3208:7:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3196:3:7"},"nodeType":"YulFunctionCall","src":"3196:20:7"},"variables":[{"name":"loopEnd","nodeType":"YulTypedName","src":"3185:7:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3229:48:7","value":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3272:4:7"}],"functionName":{"name":"array_dataslot_bytes_storage","nodeType":"YulIdentifier","src":"3243:28:7"},"nodeType":"YulFunctionCall","src":"3243:34:7"},"variables":[{"name":"dstPtr","nodeType":"YulTypedName","src":"3233:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3290:10:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3299:1:7","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"3294:1:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3377:172:7","statements":[{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3402:6:7"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3420:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3425:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3416:3:7"},"nodeType":"YulFunctionCall","src":"3416:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3410:5:7"},"nodeType":"YulFunctionCall","src":"3410:26:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3395:6:7"},"nodeType":"YulFunctionCall","src":"3395:42:7"},"nodeType":"YulExpressionStatement","src":"3395:42:7"},{"nodeType":"YulAssignment","src":"3454:24:7","value":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3468:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"3476:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3464:3:7"},"nodeType":"YulFunctionCall","src":"3464:14:7"},"variableNames":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3454:6:7"}]},{"nodeType":"YulAssignment","src":"3495:40:7","value":{"arguments":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3512:9:7"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3523:11:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3508:3:7"},"nodeType":"YulFunctionCall","src":"3508:27:7"},"variableNames":[{"name":"srcOffset","nodeType":"YulIdentifier","src":"3495:9:7"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3324:1:7"},{"name":"loopEnd","nodeType":"YulIdentifier","src":"3327:7:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3321:2:7"},"nodeType":"YulFunctionCall","src":"3321:14:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3336:28:7","statements":[{"nodeType":"YulAssignment","src":"3338:24:7","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"3347:1:7"},{"name":"srcOffset_1","nodeType":"YulIdentifier","src":"3350:11:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3343:3:7"},"nodeType":"YulFunctionCall","src":"3343:19:7"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"3338:1:7"}]}]},"pre":{"nodeType":"YulBlock","src":"3317:3:7","statements":[]},"src":"3313:236:7"},{"body":{"nodeType":"YulBlock","src":"3597:166:7","statements":[{"nodeType":"YulVariableDeclaration","src":"3615:43:7","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3642:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3647:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3638:3:7"},"nodeType":"YulFunctionCall","src":"3638:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3632:5:7"},"nodeType":"YulFunctionCall","src":"3632:26:7"},"variables":[{"name":"lastValue","nodeType":"YulTypedName","src":"3619:9:7","type":""}]},{"expression":{"arguments":[{"name":"dstPtr","nodeType":"YulIdentifier","src":"3682:6:7"},{"arguments":[{"name":"lastValue","nodeType":"YulIdentifier","src":"3694:9:7"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3721:1:7","type":"","value":"3"},{"name":"newLen","nodeType":"YulIdentifier","src":"3724:6:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3717:3:7"},"nodeType":"YulFunctionCall","src":"3717:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"3733:3:7","type":"","value":"248"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3713:3:7"},"nodeType":"YulFunctionCall","src":"3713:24:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3743:1:7","type":"","value":"0"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3739:3:7"},"nodeType":"YulFunctionCall","src":"3739:6:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"3709:3:7"},"nodeType":"YulFunctionCall","src":"3709:37:7"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"3705:3:7"},"nodeType":"YulFunctionCall","src":"3705:42:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"3690:3:7"},"nodeType":"YulFunctionCall","src":"3690:58:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3675:6:7"},"nodeType":"YulFunctionCall","src":"3675:74:7"},"nodeType":"YulExpressionStatement","src":"3675:74:7"}]},"condition":{"arguments":[{"name":"loopEnd","nodeType":"YulIdentifier","src":"3568:7:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"3577:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3565:2:7"},"nodeType":"YulFunctionCall","src":"3565:19:7"},"nodeType":"YulIf","src":"3562:201:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3783:4:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3797:1:7","type":"","value":"1"},{"name":"newLen","nodeType":"YulIdentifier","src":"3800:6:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3793:3:7"},"nodeType":"YulFunctionCall","src":"3793:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"3809:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3789:3:7"},"nodeType":"YulFunctionCall","src":"3789:22:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3776:6:7"},"nodeType":"YulFunctionCall","src":"3776:36:7"},"nodeType":"YulExpressionStatement","src":"3776:36:7"}]},"nodeType":"YulCase","src":"3160:662:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3165:1:7","type":"","value":"1"}},{"body":{"nodeType":"YulBlock","src":"3839:234:7","statements":[{"nodeType":"YulVariableDeclaration","src":"3853:14:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3866:1:7","type":"","value":"0"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"3857:5:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3902:67:7","statements":[{"nodeType":"YulAssignment","src":"3920:35:7","value":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3939:3:7"},{"name":"srcOffset","nodeType":"YulIdentifier","src":"3944:9:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3935:3:7"},"nodeType":"YulFunctionCall","src":"3935:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"3929:5:7"},"nodeType":"YulFunctionCall","src":"3929:26:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"3920:5:7"}]}]},"condition":{"name":"newLen","nodeType":"YulIdentifier","src":"3883:6:7"},"nodeType":"YulIf","src":"3880:89:7"},{"expression":{"arguments":[{"name":"slot","nodeType":"YulIdentifier","src":"3989:4:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4048:5:7"},{"name":"newLen","nodeType":"YulIdentifier","src":"4055:6:7"}],"functionName":{"name":"extract_used_part_and_set_length_of_short_byte_array","nodeType":"YulIdentifier","src":"3995:52:7"},"nodeType":"YulFunctionCall","src":"3995:67:7"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"3982:6:7"},"nodeType":"YulFunctionCall","src":"3982:81:7"},"nodeType":"YulExpressionStatement","src":"3982:81:7"}]},"nodeType":"YulCase","src":"3831:242:7","value":"default"}],"expression":{"arguments":[{"name":"newLen","nodeType":"YulIdentifier","src":"3140:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"3148:2:7","type":"","value":"31"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3137:2:7"},"nodeType":"YulFunctionCall","src":"3137:14:7"},"nodeType":"YulSwitch","src":"3130:943:7"}]},"name":"copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage","nodeType":"YulFunctionDefinition","parameters":[{"name":"slot","nodeType":"YulTypedName","src":"2810:4:7","type":""},{"name":"src","nodeType":"YulTypedName","src":"2816:3:7","type":""}],"src":"2729:1350:7"},{"body":{"nodeType":"YulBlock","src":"4184:209:7","statements":[{"body":{"nodeType":"YulBlock","src":"4230:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4239:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4242:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4232:6:7"},"nodeType":"YulFunctionCall","src":"4232:12:7"},"nodeType":"YulExpressionStatement","src":"4232:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"4205:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"4214:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4201:3:7"},"nodeType":"YulFunctionCall","src":"4201:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"4226:2:7","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"4197:3:7"},"nodeType":"YulFunctionCall","src":"4197:32:7"},"nodeType":"YulIf","src":"4194:52:7"},{"nodeType":"YulVariableDeclaration","src":"4255:29:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"4274:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"4268:5:7"},"nodeType":"YulFunctionCall","src":"4268:16:7"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"4259:5:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"4347:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4356:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4359:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4349:6:7"},"nodeType":"YulFunctionCall","src":"4349:12:7"},"nodeType":"YulExpressionStatement","src":"4349:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4306:5:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"4317:5:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4332:3:7","type":"","value":"160"},{"kind":"number","nodeType":"YulLiteral","src":"4337:1:7","type":"","value":"1"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"4328:3:7"},"nodeType":"YulFunctionCall","src":"4328:11:7"},{"kind":"number","nodeType":"YulLiteral","src":"4341:1:7","type":"","value":"1"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"4324:3:7"},"nodeType":"YulFunctionCall","src":"4324:19:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"4313:3:7"},"nodeType":"YulFunctionCall","src":"4313:31:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"4303:2:7"},"nodeType":"YulFunctionCall","src":"4303:42:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"4296:6:7"},"nodeType":"YulFunctionCall","src":"4296:50:7"},"nodeType":"YulIf","src":"4293:70:7"},{"nodeType":"YulAssignment","src":"4372:15:7","value":{"name":"value","nodeType":"YulIdentifier","src":"4382:5:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"4372:6:7"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$998_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"4150:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"4161:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"4173:6:7","type":""}],"src":"4084:309:7"}]},"contents":"{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_bytes_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_bytes_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n let _1 := 0\n mstore(_1, array)\n let data := keccak256(_1, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _2 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _2) { start := add(start, 1) }\n { sstore(start, _1) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_bytes_memory_ptr_to_t_bytes_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_bytes_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_bytes_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_bytes_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n let srcOffset_1 := 0x20\n srcOffset := srcOffset_1\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_bytes_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, srcOffset_1) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, srcOffset_1)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$998_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n}","id":7,"language":"Yul","name":"#utility.yul"}],"linkReferences":{},"object":"6000608081905260a08190526001819055600281905560c081905261010081815261012082905260e052600380546001600160a01b0319169055600481905560058190556101408181526101608290526101808290526101a08290526101c08290526102008281526102206040526101e08190526006838155600793909355600880546001600160681b0319169055909190600990620000a09082620004a5565b50506040805160e081018252600060c08083019182529082528251908101835260068054825260075460208381019190915260085460ff811615159584019590955265ffffffffffff610100860481166060850152670100000000000000909504909416608083015260098054939550938501939192909160a0840191620001289062000416565b80601f0160208091040260200160405190810160405280929190818152602001828054620001569062000416565b8015620001a75780601f106200017b57610100808354040283529160200191620001a7565b820191906000526020600020905b8154815290600101906020018083116200018957829003601f168201915b505050919092525050508152604080518082018252600154808252600254602083810182905280860193909352835180850185528281528084018290528486015283518085018552918252818301526060840152815180830183526003546001600160a01b031681528251808401909352600454835260055483830152908101919091526080909101528051600a908190620002449082620004a5565b5060208281015180516001840190815591810151600284015560408101516003840180546060840151608085015166ffffffffffffff1990921693151566ffffffffffff0019169390931761010065ffffffffffff948516021765ffffffffffff60381b1916670100000000000000939091169290920291909117905560a08101519091906004840190620002da9082620004a5565b505050604082810151805160058401556020908101516006840155606080850151805160078601558201516008850155608085015180516009860155820151600a85015560a0909401518051600b850180546001600160a01b0319166001600160a01b039092169190911790558101518051600c850155810151600d909301929092558051928301815260008084528383018181528251938401835290835290830182905282516018805460ff1916911515919091178155905160195590601a90620003a79082620004a5565b505050348015620003b757600080fd5b506040516200223438038062002234833981016040819052620003da9162000571565b600080546001600160a01b0319166001600160a01b0392909216919091179055620005a3565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200042b57607f821691505b6020821081036200044c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004a057600081815260208120601f850160051c810160208610156200047b5750805b601f850160051c820191505b818110156200049c5782815560010162000487565b5050505b505050565b81516001600160401b03811115620004c157620004c162000400565b620004d981620004d2845462000416565b8462000452565b602080601f831160018114620005115760008415620004f85750858301515b600019600386901b1c1916600185901b1785556200049c565b600085815260208120601f198616915b82811015620005425788860151825594840194600190910190840162000521565b5085821015620005615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200058457600080fd5b81516001600160a01b03811681146200059c57600080fd5b9392505050565b611c8180620005b36000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b249f69116100505780639b249f69146100b6578063b0d691fe146100ee578063ee2194231461010e57600080fd5b80633024e00c1461006c5780637b34b62114610095575b600080fd5b61007f61007a36600461103a565b61012f565b60405161008c91906111f9565b60405180910390f35b6100a86100a336600461123d565b61024d565b60405190815260200161008c565b6100c96100c43660046112d7565b610336565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008c565b6000546100c99073ffffffffffffffffffffffffffffffffffffffff1681565b61012161011c366004611349565b6104e3565b60405161008c9291906113e1565b6060815167ffffffffffffffff81111561014b5761014b610eb8565b604051908082528060200260200182016040528015610174578160200160208202803683370190505b50905060005b8251811015610245578373ffffffffffffffffffffffffffffffffffffffff1663a61935318483815181106101b1576101b161152b565b60200260200101516040518263ffffffff1660e01b81526004016101d5919061155a565b602060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102169190611648565b8282815181106102285761022861152b565b60209081029190910101528061023d81611690565b91505061017a565b505b92915050565b600080825167ffffffffffffffff81111561026a5761026a610eb8565b604051908082528060200260200182016040528015610293578160200160208202803683370190505b50905060005b8351811015610302578381815181106102b4576102b461152b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102e5576102e561152b565b6020908102919091010152806102fa81611690565b915050610299565b5060008160405160200161031691906111f9565b60408051601f198184030181529190528051602090910120949350505050565b600080546040517f9b249f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b249f699061038f90869086906004016116f3565b600060405180830381600087803b1580156103a957600080fd5b505af19250505080156103ba575060015b610247573d8080156103e8576040519150601f19603f3d011682016040523d82523d6000602084013e6103ed565b606091505b5060006103f98261170f565b90507f935847fa000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161047c57600061045e836004808651610459919061175f565b610c39565b8060200190518101906104719190611776565b935061024792505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420696e6974436f64650000000000000000000000000000000060448201526064015b60405180910390fd5b60408051606080820183526000808352602083015291810191909152610507610d97565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061055d9086906004016117fe565b600060405180830381600087803b15801561057757600080fd5b505af1925050508015610588575060015b610c34573d8080156105b6576040519150601f19603f3d011682016040523d82523d6000602084013e6105bb565b606091505b5060006105c78261170f565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016107a75760008060008061062b866004808951610459919061175f565b80602001905181019061063e9190611a3c565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161071490611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461074090611aae565b801561078d5780601f106107625761010080835404028352916020019161078d565b820191906000526020600020905b81548152906001019060200180831161077057829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161095357600080600080600061080b876004808a51610459919061175f565b80602001905181019061081e9190611b01565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916108bf90611aae565b80601f01602080910402602001604051908101604052809291908181526020018280546108eb90611aae565b80156109385780601f1061090d57610100808354040283529160200191610938565b820191906000526020600020905b81548152906001019060200180831161091b57829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610c31576000806109b2846004808751610459919061175f565b8060200190518101906109c59190611bd8565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c0016040529081600082018054610a0590611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611aae565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a0840191610afc90611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890611aae565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610c4781601f611c33565b1015610caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104da565b610cb98284611c33565b84511015610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104da565b606082158015610d425760405191506000825260208201604052610d8c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d7b578051835260209283019201610d63565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610df8604051806040016040528060008152602001600081525090565b8152602001610e1a604051806040016040528060008152602001600081525090565b8152602001610e3c604051806040016040528060008152602001600081525090565b8152602001610e49610e4e565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610e49604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b60405290565b60405160c0810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b6040805190810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f8057610f80610eb8565b604052919050565b600067ffffffffffffffff821115610fa257610fa2610eb8565b5060051b60200190565b8035610fb781610e93565b919050565b600067ffffffffffffffff821115610fd657610fd6610eb8565b50601f01601f191660200190565b600082601f830112610ff557600080fd5b813561100861100382610fbc565b610f57565b81815284602083860101111561101d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561104d57600080fd5b823561105881610e93565b915060208381013567ffffffffffffffff8082111561107657600080fd5b818601915086601f83011261108a57600080fd5b813561109861100382610f88565b81815260059190911b830184019084810190898311156110b757600080fd5b8585015b838110156111e8578035858111156110d257600080fd5b8601610160818d03601f190112156110e957600080fd5b6110f1610ee7565b6110fc898301610fac565b815260408201358982015260608201358781111561111957600080fd5b6111278e8b83860101610fe4565b60408301525060808201358781111561113f57600080fd5b61114d8e8b83860101610fe4565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e0820152610120820135610100820152610140808301358881111561119c57600080fd5b6111aa8f8c83870101610fe4565b61012084015250610160830135888111156111c457600080fd5b6111d28f8c83870101610fe4565b91830191909152508452509186019186016110bb565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561123157835183529284019291840191600101611215565b50909695505050505050565b6000602080838503121561125057600080fd5b823567ffffffffffffffff81111561126757600080fd5b8301601f8101851361127857600080fd5b803561128661100382610f88565b81815260059190911b820183019083810190878311156112a557600080fd5b928401925b828410156112cc5783356112bd81610e93565b825292840192908401906112aa565b979650505050505050565b600080602083850312156112ea57600080fd5b823567ffffffffffffffff8082111561130257600080fd5b818501915085601f83011261131657600080fd5b81358181111561132557600080fd5b86602082850101111561133757600080fd5b60209290920196919550909350505050565b60006020828403121561135b57600080fd5b813567ffffffffffffffff81111561137257600080fd5b82016101608185031215610d9057600080fd5b60005b838110156113a0578181015183820152602001611388565b838111156113af576000848401525b50505050565b600081518084526113cd816020860160208601611385565b601f01601f19169290920160200192915050565b6000604080835284511515818401526020808601516060850152818601516060608086015261141360a08601826113b5565b9050848103828601526101608651818352611430828401826113b5565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261149360c08201846113b5565b925050828601516114b08483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a08601519250611521610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261158160208201835173ffffffffffffffffffffffffffffffffffffffff169052565b60208201516040820152600060408301516101608060608501526115a96101808501836113b5565b91506060850151601f19808685030160808701526115c784836113b5565b9350608087015160a087015260a087015160c087015260c087015160e087015260e0870151915061010082818801528088015192505061012082818801528088015192505061014081878603018188015261162285846113b5565b90880151878203909201848801529350905061163e83826113b5565b9695505050505050565b60006020828403121561165a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116c1576116c1611661565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006117076020830184866116c8565b949350505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156117575780818460040360031b1b83161693505b505050919050565b60008282101561177157611771611661565b500390565b60006020828403121561178857600080fd5b8151610d9081610e93565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126117c857600080fd5b830160208101925035905067ffffffffffffffff8111156117e857600080fd5b8036038213156117f757600080fd5b9250929050565b6020815261182c6020820161181284610fac565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006118456040840184611793565b61016080606086015261185d610180860183856116c8565b925061186c6060870187611793565b9250601f19808786030160808801526118868585846116c8565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526118cd82890189611793565b945091506101408188870301818901526118e88686856116c8565b95506118f6818a018a611793565b9550925050808786030183880152506112cc8484836116c8565b805165ffffffffffff81168114610fb757600080fd5b600061193461100384610fbc565b905082815283838301111561194857600080fd5b610d90836020830184611385565b600082601f83011261196757600080fd5b610d9083835160208501611926565b600060c0828403121561198857600080fd5b611990610f11565b90508151815260208201516020820152604082015180151581146119b357600080fd5b60408201526119c460608301611910565b60608201526119d560808301611910565b608082015260a082015167ffffffffffffffff8111156119f457600080fd5b611a0084828501611956565b60a08301525092915050565b600060408284031215611a1e57600080fd5b611a26610f34565b9050815181526020820151602082015292915050565b60008060008060e08587031215611a5257600080fd5b845167ffffffffffffffff811115611a6957600080fd5b611a7587828801611976565b945050611a858660208701611a0c565b9250611a948660608701611a0c565b9150611aa38660a08701611a0c565b905092959194509250565b600181811c90821680611ac257607f821691505b602082108103611afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000806000806000858703610140811215611b1b57600080fd5b865167ffffffffffffffff811115611b3257600080fd5b611b3e89828a01611976565b965050611b4e8860208901611a0c565b9450611b5d8860608901611a0c565b9350611b6c8860a08901611a0c565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2082011215611b9e57600080fd5b50611ba7610f34565b60e0870151611bb581610e93565b8152611bc5886101008901611a0c565b6020820152809150509295509295909350565b60008060408385031215611beb57600080fd5b82519150602083015167ffffffffffffffff811115611c0957600080fd5b8301601f81018513611c1a57600080fd5b611c2985825160208401611926565b9150509250929050565b60008219821115611c4657611c46611661565b50019056fea26469706673582212209a1c7252e82e84056f2a73f6c8f87a6651303771a673fe8cebe2dbe5467b390664736f6c634300080f0033","opcodes":"PUSH1 0x0 PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0xC0 DUP2 SWAP1 MSTORE PUSH2 0x100 DUP2 DUP2 MSTORE PUSH2 0x120 DUP3 SWAP1 MSTORE PUSH1 0xE0 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x5 DUP2 SWAP1 SSTORE PUSH2 0x140 DUP2 DUP2 MSTORE PUSH2 0x160 DUP3 SWAP1 MSTORE PUSH2 0x180 DUP3 SWAP1 MSTORE PUSH2 0x1A0 DUP3 SWAP1 MSTORE PUSH2 0x1C0 DUP3 SWAP1 MSTORE PUSH2 0x200 DUP3 DUP2 MSTORE PUSH2 0x220 PUSH1 0x40 MSTORE PUSH2 0x1E0 DUP2 SWAP1 MSTORE PUSH1 0x6 DUP4 DUP2 SSTORE PUSH1 0x7 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x68 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 SWAP1 PUSH1 0x9 SWAP1 PUSH3 0xA0 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xE0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 PUSH1 0xC0 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE SWAP1 DUP3 MSTORE DUP3 MLOAD SWAP1 DUP2 ADD DUP4 MSTORE PUSH1 0x6 DUP1 SLOAD DUP3 MSTORE PUSH1 0x7 SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x8 SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP6 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP7 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP6 DIV SWAP1 SWAP5 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x9 DUP1 SLOAD SWAP4 SWAP6 POP SWAP4 DUP6 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH3 0x128 SWAP1 PUSH3 0x416 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH3 0x156 SWAP1 PUSH3 0x416 JUMP JUMPDEST DUP1 ISZERO PUSH3 0x1A7 JUMPI DUP1 PUSH1 0x1F LT PUSH3 0x17B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH3 0x1A7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH3 0x189 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 SLOAD DUP1 DUP3 MSTORE PUSH1 0x2 SLOAD PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE DUP1 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE DUP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP5 DUP7 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE SWAP2 DUP3 MSTORE DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x4 SLOAD DUP4 MSTORE PUSH1 0x5 SLOAD DUP4 DUP4 ADD MSTORE SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 SWAP1 SWAP2 ADD MSTORE DUP1 MLOAD PUSH1 0xA SWAP1 DUP2 SWAP1 PUSH3 0x244 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0x1 DUP5 ADD SWAP1 DUP2 SSTORE SWAP2 DUP2 ADD MLOAD PUSH1 0x2 DUP5 ADD SSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x80 DUP6 ADD MLOAD PUSH7 0xFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND SWAP4 ISZERO ISZERO PUSH7 0xFFFFFFFFFFFF00 NOT AND SWAP4 SWAP1 SWAP4 OR PUSH2 0x100 PUSH6 0xFFFFFFFFFFFF SWAP5 DUP6 AND MUL OR PUSH6 0xFFFFFFFFFFFF PUSH1 0x38 SHL NOT AND PUSH8 0x100000000000000 SWAP4 SWAP1 SWAP2 AND SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0xA0 DUP2 ADD MLOAD SWAP1 SWAP2 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH3 0x2DA SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP POP PUSH1 0x40 DUP3 DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0x5 DUP5 ADD SSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD PUSH1 0x6 DUP5 ADD SSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD DUP1 MLOAD PUSH1 0x7 DUP7 ADD SSTORE DUP3 ADD MLOAD PUSH1 0x8 DUP6 ADD SSTORE PUSH1 0x80 DUP6 ADD MLOAD DUP1 MLOAD PUSH1 0x9 DUP7 ADD SSTORE DUP3 ADD MLOAD PUSH1 0xA DUP6 ADD SSTORE PUSH1 0xA0 SWAP1 SWAP5 ADD MLOAD DUP1 MLOAD PUSH1 0xB DUP6 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP2 ADD MLOAD DUP1 MLOAD PUSH1 0xC DUP6 ADD SSTORE DUP2 ADD MLOAD PUSH1 0xD SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP1 MLOAD SWAP3 DUP4 ADD DUP2 MSTORE PUSH1 0x0 DUP1 DUP5 MSTORE DUP4 DUP4 ADD DUP2 DUP2 MSTORE DUP3 MLOAD SWAP4 DUP5 ADD DUP4 MSTORE SWAP1 DUP4 MSTORE SWAP1 DUP4 ADD DUP3 SWAP1 MSTORE DUP3 MLOAD PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR DUP2 SSTORE SWAP1 MLOAD PUSH1 0x19 SSTORE SWAP1 PUSH1 0x1A SWAP1 PUSH3 0x3A7 SWAP1 DUP3 PUSH3 0x4A5 JUMP JUMPDEST POP POP POP CALLVALUE DUP1 ISZERO PUSH3 0x3B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2234 CODESIZE SUB DUP1 PUSH3 0x2234 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x3DA SWAP2 PUSH3 0x571 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH3 0x5A3 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x42B JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH3 0x44C JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH3 0x4A0 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP7 LT ISZERO PUSH3 0x47B JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP6 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x49C JUMPI DUP3 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x487 JUMP JUMPDEST POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH3 0x4C1 JUMPI PUSH3 0x4C1 PUSH3 0x400 JUMP JUMPDEST PUSH3 0x4D9 DUP2 PUSH3 0x4D2 DUP5 SLOAD PUSH3 0x416 JUMP JUMPDEST DUP5 PUSH3 0x452 JUMP JUMPDEST PUSH1 0x20 DUP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 DUP2 EQ PUSH3 0x511 JUMPI PUSH1 0x0 DUP5 ISZERO PUSH3 0x4F8 JUMPI POP DUP6 DUP4 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP7 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP6 SWAP1 SHL OR DUP6 SSTORE PUSH3 0x49C JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP7 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x542 JUMPI DUP9 DUP7 ADD MLOAD DUP3 SSTORE SWAP5 DUP5 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 DUP5 ADD PUSH3 0x521 JUMP JUMPDEST POP DUP6 DUP3 LT ISZERO PUSH3 0x561 JUMPI DUP8 DUP6 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP9 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x584 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x59C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1C81 DUP1 PUSH3 0x5B3 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x67 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9B249F69 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0xEE JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x10E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3024E00C EQ PUSH2 0x6C JUMPI DUP1 PUSH4 0x7B34B621 EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7F PUSH2 0x7A CALLDATASIZE PUSH1 0x4 PUSH2 0x103A JUMP JUMPDEST PUSH2 0x12F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8C SWAP2 SWAP1 PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA8 PUSH2 0xA3 CALLDATASIZE PUSH1 0x4 PUSH2 0x123D JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8C JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x12D7 JUMP JUMPDEST PUSH2 0x336 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xC9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x1349 JUMP JUMPDEST PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8C SWAP3 SWAP2 SWAP1 PUSH2 0x13E1 JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14B JUMPI PUSH2 0x14B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x174 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x245 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA6193531 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1B1 JUMPI PUSH2 0x1B1 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D5 SWAP2 SWAP1 PUSH2 0x155A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x216 SWAP2 SWAP1 PUSH2 0x1648 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x228 JUMPI PUSH2 0x228 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x23D DUP2 PUSH2 0x1690 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x17A JUMP JUMPDEST POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A JUMPI PUSH2 0x26A PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x293 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x302 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x2B4 JUMPI PUSH2 0x2B4 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODEHASH DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2E5 JUMPI PUSH2 0x2E5 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x2FA DUP2 PUSH2 0x1690 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x299 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x316 SWAP2 SWAP1 PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x9B249F6900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x9B249F69 SWAP1 PUSH2 0x38F SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3BA JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x247 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3E8 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3ED JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x3F9 DUP3 PUSH2 0x170F JUMP JUMPDEST SWAP1 POP PUSH32 0x935847FA00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x47C JUMPI PUSH1 0x0 PUSH2 0x45E DUP4 PUSH1 0x4 DUP1 DUP7 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST PUSH2 0xC39 JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x471 SWAP2 SWAP1 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH2 0x247 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420696E6974436F646500000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x507 PUSH2 0xD97 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xEE21942300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xEE219423 SWAP1 PUSH2 0x55D SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x17FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x588 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xC34 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x5C7 DUP3 PUSH2 0x170F JUMP JUMPDEST SWAP1 POP PUSH32 0x1F300FA100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x62B DUP7 PUSH1 0x4 DUP1 DUP10 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x63E SWAP2 SWAP1 PUSH2 0x1A3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x10 PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C7400000000000000000000000000000000 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP2 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP5 MLOAD DUP1 DUP7 ADD DUP7 MSTORE PUSH1 0x4 SLOAD DUP2 MSTORE PUSH1 0x5 SLOAD DUP2 DUP6 ADD MSTORE DUP2 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP9 SWAP13 POP SWAP7 SWAP11 POP SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP2 SWAP5 SWAP2 SWAP4 DUP6 SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH2 0x714 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x740 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x78D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x762 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x78D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x770 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP8 POP SWAP8 POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0x5134B1C00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x953 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x80B DUP8 PUSH1 0x4 DUP1 DUP11 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x81E SWAP2 SWAP1 PUSH2 0x1B01 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x1F PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C74576974684167677265676174696F6E00 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP10 SWAP15 POP SWAP8 SWAP13 POP SWAP6 SWAP11 POP SWAP4 SWAP9 POP SWAP2 SWAP7 POP SWAP2 SWAP5 SWAP1 SWAP4 DUP6 SWAP3 DUP5 ADD SWAP2 PUSH2 0x8BF SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x8EB SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x938 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x90D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x938 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x91B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0xDDFD994A00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0xC31 JUMPI PUSH1 0x0 DUP1 PUSH2 0x9B2 DUP5 PUSH1 0x4 DUP1 DUP8 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x9C5 SWAP2 SWAP1 PUSH2 0x1BD8 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP PUSH1 0xA DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD DUP1 SLOAD PUSH2 0xA05 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xA31 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA7E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xA53 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xA7E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xA61 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 DUP5 ADD DUP1 SLOAD DUP3 MSTORE PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP7 ADD SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP6 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP5 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x4 DUP6 ADD DUP1 SLOAD SWAP4 SWAP1 SWAP5 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH2 0xAFC SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xB28 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB75 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB4A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB75 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB58 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP5 ADD SLOAD DUP2 MSTORE PUSH1 0x6 DUP5 ADD SLOAD PUSH1 0x20 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x7 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0x8 DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE DUP3 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x9 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0xA DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0xB DUP6 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0xC DUP6 ADD SLOAD DUP4 MSTORE PUSH1 0xD SWAP1 SWAP5 ADD SLOAD DUP3 DUP3 ADD MSTORE DUP4 ADD MSTORE PUSH1 0x80 ADD MSTORE SWAP2 SWAP10 SWAP2 SWAP9 POP SWAP1 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST POP POP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xC47 DUP2 PUSH1 0x1F PUSH2 0x1C33 JUMP JUMPDEST LT ISZERO PUSH2 0xCAF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x4DA JUMP JUMPDEST PUSH2 0xCB9 DUP3 DUP5 PUSH2 0x1C33 JUMP JUMPDEST DUP5 MLOAD LT ISZERO PUSH2 0xD23 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F75744F66426F756E6473000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x4DA JUMP JUMPDEST PUSH1 0x60 DUP3 ISZERO DUP1 ISZERO PUSH2 0xD42 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0xD8C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F DUP5 AND DUP1 ISZERO PUSH1 0x20 MUL DUP2 DUP5 ADD ADD DUP6 DUP2 ADD DUP8 DUP4 ISZERO PUSH1 0x20 MUL DUP5 DUP12 ADD ADD ADD JUMPDEST DUP2 DUP4 LT ISZERO PUSH2 0xD7B JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xD63 JUMP JUMPDEST POP POP DUP6 DUP5 MSTORE PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x40 MSTORE POP JUMPDEST POP SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x60 DUP1 DUP4 MSTORE DUP4 MLOAD SWAP2 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE SWAP5 DUP4 ADD DUP2 SWAP1 MSTORE DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE SWAP1 SWAP2 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xDF8 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE1A PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3C PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE49 PUSH2 0xE4E JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE49 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF80 JUMPI PUSH2 0xF80 PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xFA2 JUMPI PUSH2 0xFA2 PUSH2 0xEB8 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xFB7 DUP2 PUSH2 0xE93 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xFD6 JUMPI PUSH2 0xFD6 PUSH2 0xEB8 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1008 PUSH2 0x1003 DUP3 PUSH2 0xFBC JUMP JUMPDEST PUSH2 0xF57 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0x101D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x104D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1058 DUP2 PUSH2 0xE93 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1076 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x108A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1098 PUSH2 0x1003 DUP3 PUSH2 0xF88 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP4 ADD DUP5 ADD SWAP1 DUP5 DUP2 ADD SWAP1 DUP10 DUP4 GT ISZERO PUSH2 0x10B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 DUP6 ADD JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11E8 JUMPI DUP1 CALLDATALOAD DUP6 DUP2 GT ISZERO PUSH2 0x10D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 ADD PUSH2 0x160 DUP2 DUP14 SUB PUSH1 0x1F NOT ADD SLT ISZERO PUSH2 0x10E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10F1 PUSH2 0xEE7 JUMP JUMPDEST PUSH2 0x10FC DUP10 DUP4 ADD PUSH2 0xFAC JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP10 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0x1119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1127 DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0x113F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x114D DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x100 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x120 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0x119C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AA DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH2 0x120 DUP5 ADD MSTORE POP PUSH2 0x160 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0x11C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D2 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP5 MSTORE POP SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x10BB JUMP JUMPDEST POP DUP1 SWAP7 POP POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1231 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1215 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1250 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x1278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1286 PUSH2 0x1003 DUP3 PUSH2 0xF88 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP3 ADD DUP4 ADD SWAP1 DUP4 DUP2 ADD SWAP1 DUP8 DUP4 GT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 DUP5 ADD SWAP3 JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x12CC JUMPI DUP4 CALLDATALOAD PUSH2 0x12BD DUP2 PUSH2 0xE93 JUMP JUMPDEST DUP3 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH2 0x12AA JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1316 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x135B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0xD90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x13A0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1388 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x13CD DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1385 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 MSTORE DUP5 MLOAD ISZERO ISZERO DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE DUP2 DUP7 ADD MLOAD PUSH1 0x60 PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x1413 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 SUB DUP3 DUP7 ADD MSTORE PUSH2 0x160 DUP7 MLOAD DUP2 DUP4 MSTORE PUSH2 0x1430 DUP3 DUP5 ADD DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP8 ADD MLOAD DUP3 DUP3 SUB DUP5 DUP5 ADD MSTORE DUP1 MLOAD DUP3 MSTORE DUP4 DUP2 ADD MLOAD DUP5 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD ISZERO ISZERO DUP6 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD SWAP4 POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE DUP1 PUSH1 0x80 DUP4 ADD MLOAD AND PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xA0 DUP2 ADD MLOAD SWAP4 POP POP PUSH1 0xC0 PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x1493 PUSH1 0xC0 DUP3 ADD DUP5 PUSH2 0x13B5 JUMP JUMPDEST SWAP3 POP POP DUP3 DUP7 ADD MLOAD PUSH2 0x14B0 DUP5 DUP4 ADD DUP3 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0x80 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0xA0 DUP7 ADD MLOAD SWAP3 POP PUSH2 0x1521 PUSH2 0x100 DUP3 ADD DUP5 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP1 MLOAD DUP3 DUP5 ADD MSTORE ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x1581 PUSH1 0x20 DUP3 ADD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x160 DUP1 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x15A9 PUSH2 0x180 DUP6 ADD DUP4 PUSH2 0x13B5 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x1F NOT DUP1 DUP7 DUP6 SUB ADD PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x15C7 DUP5 DUP4 PUSH2 0x13B5 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0xC0 DUP8 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH1 0xE0 DUP8 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD SWAP2 POP PUSH2 0x100 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x120 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x140 DUP2 DUP8 DUP7 SUB ADD DUP2 DUP9 ADD MSTORE PUSH2 0x1622 DUP6 DUP5 PUSH2 0x13B5 JUMP JUMPDEST SWAP1 DUP9 ADD MLOAD DUP8 DUP3 SUB SWAP1 SWAP3 ADD DUP5 DUP9 ADD MSTORE SWAP4 POP SWAP1 POP PUSH2 0x163E DUP4 DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x165A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x16C1 JUMPI PUSH2 0x16C1 PUSH2 0x1661 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1707 PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x16C8 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 AND SWAP4 POP PUSH1 0x4 DUP4 LT ISZERO PUSH2 0x1757 JUMPI DUP1 DUP2 DUP5 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP4 POP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1771 JUMPI PUSH2 0x1771 PUSH2 0x1661 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1788 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xD90 DUP2 PUSH2 0xE93 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x17C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x17F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x182C PUSH1 0x20 DUP3 ADD PUSH2 0x1812 DUP5 PUSH2 0xFAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x1845 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x1793 JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x185D PUSH2 0x180 DUP7 ADD DUP4 DUP6 PUSH2 0x16C8 JUMP JUMPDEST SWAP3 POP PUSH2 0x186C PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x1793 JUMP JUMPDEST SWAP3 POP PUSH1 0x1F NOT DUP1 DUP8 DUP7 SUB ADD PUSH1 0x80 DUP9 ADD MSTORE PUSH2 0x1886 DUP6 DUP6 DUP5 PUSH2 0x16C8 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 SWAP4 POP PUSH1 0xE0 DUP9 ADD CALLDATALOAD DUP5 DUP9 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP4 DUP9 ADD CALLDATALOAD DUP3 DUP9 ADD MSTORE PUSH2 0x18CD DUP3 DUP10 ADD DUP10 PUSH2 0x1793 JUMP JUMPDEST SWAP5 POP SWAP2 POP PUSH2 0x140 DUP2 DUP9 DUP8 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x18E8 DUP7 DUP7 DUP6 PUSH2 0x16C8 JUMP JUMPDEST SWAP6 POP PUSH2 0x18F6 DUP2 DUP11 ADD DUP11 PUSH2 0x1793 JUMP JUMPDEST SWAP6 POP SWAP3 POP POP DUP1 DUP8 DUP7 SUB ADD DUP4 DUP9 ADD MSTORE POP PUSH2 0x12CC DUP5 DUP5 DUP4 PUSH2 0x16C8 JUMP JUMPDEST DUP1 MLOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xFB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1934 PUSH2 0x1003 DUP5 PUSH2 0xFBC JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE DUP4 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD90 DUP4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1385 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD90 DUP4 DUP4 MLOAD PUSH1 0x20 DUP6 ADD PUSH2 0x1926 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1990 PUSH2 0xF11 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x19B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x19C4 PUSH1 0x60 DUP4 ADD PUSH2 0x1910 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x19D5 PUSH1 0x80 DUP4 ADD PUSH2 0x1910 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A00 DUP5 DUP3 DUP6 ADD PUSH2 0x1956 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A26 PUSH2 0xF34 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A75 DUP8 DUP3 DUP9 ADD PUSH2 0x1976 JUMP JUMPDEST SWAP5 POP POP PUSH2 0x1A85 DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP3 POP PUSH2 0x1A94 DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP2 POP PUSH2 0x1AA3 DUP7 PUSH1 0xA0 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x1AC2 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x1AFB JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 DUP8 SUB PUSH2 0x140 DUP2 SLT ISZERO PUSH2 0x1B1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B3E DUP10 DUP3 DUP11 ADD PUSH2 0x1976 JUMP JUMPDEST SWAP7 POP POP PUSH2 0x1B4E DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP5 POP PUSH2 0x1B5D DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP4 POP PUSH2 0x1B6C DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP3 POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 DUP3 ADD SLT ISZERO PUSH2 0x1B9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA7 PUSH2 0xF34 JUMP JUMPDEST PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1BB5 DUP2 PUSH2 0xE93 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1BC5 DUP9 PUSH2 0x100 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x1C1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C29 DUP6 DUP3 MLOAD PUSH1 0x20 DUP5 ADD PUSH2 0x1926 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1C46 JUMPI PUSH2 0x1C46 PUSH2 0x1661 JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 SHR PUSH19 0x52E82E84056F2A73F6C8F87A6651303771A673 INVALID DUP13 0xEB 0xE2 0xDB 0xE5 CHAINID PUSH28 0x390664736F6C634300080F0033000000000000000000000000000000 ","sourceMap":":::-:0;189:9776:0;3858:15;;;;;;;3823:50;;;;;;;;3858:15;3929:47;;;;;;;;;;;;;3879:97;;;-1:-1:-1;;;;;;3879:97:0;;;;;;;;;;;3929:47;4019:43;;;;;;;;;;;;;;;;;;;;4049:12;;;;-1:-1:-1;4049:12:0;4019:43;;;;3982:80;;;;;;;;;;;;-1:-1:-1;;;;;;3982:80:0;;;3929:47;;3982:80;;;;;;;:::i;:::-;-1:-1:-1;;4101:98:0;;;;;;;;-1:-1:-1;4101:98:0;;;;;;;;;;;;;;;;;4114:15;4101:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4101:98:0;;;;;;;;-1:-1:-1;4101:98:0;;;;;;4114:15;;4101:98;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4101:98:0;;;;-1:-1:-1;;;4101:98:0;;;;;;;;;;4131:14;4101:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4179:19;4101:98;-1:-1:-1;;;;;4101:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4068:131;;;;;;;;;;:::i;:::-;-1:-1:-1;4068:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4068:131:0;;;;;;-1:-1:-1;;4068:131:0;;;;;;;;;;;;-1:-1:-1;;;;4068:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;4068:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4068:131:0;-1:-1:-1;;;;;4068:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4244:28;;;;;;;-1:-1:-1;4244:28:0;;;;;;;;;;;;;;;;;;;;;;;;;4205:67;;;;;-1:-1:-1;;4205:67:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4279:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4326:10;:24;;-1:-1:-1;;;;;;4326:24:0;-1:-1:-1;;;;;4326:24:0;;;;;;;;;;189:9776;;14:127:7;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:380;225:1;221:12;;;;268;;;289:61;;343:4;335:6;331:17;321:27;;289:61;396:2;388:6;385:14;365:18;362:38;359:161;;442:10;437:3;433:20;430:1;423:31;477:4;474:1;467:15;505:4;502:1;495:15;359:161;;146:380;;;:::o;656:544::-;757:2;752:3;749:11;746:448;;;793:1;818:5;814:2;807:17;863:4;859:2;849:19;933:2;921:10;917:19;914:1;910:27;904:4;900:38;969:4;957:10;954:20;951:47;;;-1:-1:-1;992:4:7;951:47;1047:2;1042:3;1038:12;1035:1;1031:20;1025:4;1021:31;1011:41;;1102:82;1120:2;1113:5;1110:13;1102:82;;;1165:17;;;1146:1;1135:13;1102:82;;;1106:3;;;746:448;656:544;;;:::o;1376:1348::-;1494:10;;-1:-1:-1;;;;;1516:30:7;;1513:56;;;1549:18;;:::i;:::-;1578:96;1667:6;1627:38;1659:4;1653:11;1627:38;:::i;:::-;1621:4;1578:96;:::i;:::-;1729:4;;1793:2;1782:14;;1810:1;1805:662;;;;2511:1;2528:6;2525:89;;;-1:-1:-1;2580:19:7;;;2574:26;2525:89;-1:-1:-1;;1333:1:7;1329:11;;;1325:24;1321:29;1311:40;1357:1;1353:11;;;1308:57;2627:81;;1775:943;;1805:662;603:1;596:14;;;640:4;627:18;;-1:-1:-1;;1841:20:7;;;1958:236;1972:7;1969:1;1966:14;1958:236;;;2061:19;;;2055:26;2040:42;;2153:27;;;;2121:1;2109:14;;;;1988:19;;1958:236;;;1962:3;2222:6;2213:7;2210:19;2207:201;;;2283:19;;;2277:26;-1:-1:-1;;2366:1:7;2362:14;;;2378:3;2358:24;2354:37;2350:42;2335:58;2320:74;;2207:201;-1:-1:-1;;;;;2454:1:7;2438:14;;;2434:22;2421:36;;-1:-1:-1;1376:1348:7:o;4084:309::-;4173:6;4226:2;4214:9;4205:7;4201:23;4197:32;4194:52;;;4242:1;4239;4232:12;4194:52;4268:16;;-1:-1:-1;;;;;4313:31:7;;4303:42;;4293:70;;4359:1;4356;4349:12;4293:70;4382:5;4084:309;-1:-1:-1;;;4084:309:7:o;:::-;189:9776:0;;;;;;"},"deployedBytecode":{"functionDebugData":{"@entryPoint_99":{"entryPoint":null,"id":99,"parameterSlots":0,"returnSlots":0},"@getCodeHashes_464":{"entryPoint":589,"id":464,"parameterSlots":1,"returnSlots":1},"@getSenderAddress_521":{"entryPoint":822,"id":521,"parameterSlots":2,"returnSlots":1},"@getUserOpHashes_409":{"entryPoint":303,"id":409,"parameterSlots":2,"returnSlots":1},"@simulateValidation_323":{"entryPoint":1251,"id":323,"parameterSlots":1,"returnSlots":2},"@slice_360":{"entryPoint":3129,"id":360,"parameterSlots":3,"returnSlots":1},"abi_decode_address":{"entryPoint":4012,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_available_length_bytes_fromMemory":{"entryPoint":6438,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes":{"entryPoint":4068,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_fromMemory":{"entryPoint":6486,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_ReturnInfo_fromMemory":{"entryPoint":6518,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_struct_StakeInfo_fromMemory":{"entryPoint":6668,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_address_payable_fromMemory":{"entryPoint":6006,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr":{"entryPoint":4669,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes32_fromMemory":{"entryPoint":5704,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_bytes_calldata_ptr":{"entryPoint":4823,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_contract$_IEntryPoint_$998t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr":{"entryPoint":4154,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptr_fromMemory":{"entryPoint":6716,"id":null,"parameterSlots":2,"returnSlots":4},"abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_AggregatorStakeInfo_$26_memory_ptr_fromMemory":{"entryPoint":6913,"id":null,"parameterSlots":2,"returnSlots":5},"abi_decode_tuple_t_struct$_UserOperation_$1149_calldata_ptr":{"entryPoint":4937,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory":{"entryPoint":7128,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_uint48_fromMemory":{"entryPoint":6416,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_bytes_calldata":{"entryPoint":5832,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":5045,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_struct_AggregatorStakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_struct_StakeInfo":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_tuple_t_address__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed":{"entryPoint":4601,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed":{"entryPoint":5875,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_contract$_IEntryPoint_$998__to_t_address__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_stringliteral_41358789453c2b61b04d9046ed6bd1617530e1f3f5c8b4843a7b086398036cc8__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_tuple_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__to_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__fromStack_reversed":{"entryPoint":5089,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_tuple_t_struct$_UserOperation_$1149_calldata_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed":{"entryPoint":6142,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_tuple_t_struct$_UserOperation_$1149_memory_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed":{"entryPoint":5466,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":3927,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_3428":{"entryPoint":3815,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_3429":{"entryPoint":3857,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_3430":{"entryPoint":3892,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_UserOperation_dyn":{"entryPoint":3976,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":4028,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_access_bytes_calldata":{"entryPoint":6035,"id":null,"parameterSlots":2,"returnSlots":2},"checked_add_t_uint256":{"entryPoint":7219,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_t_uint256":{"entryPoint":5983,"id":null,"parameterSlots":2,"returnSlots":1},"convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4":{"entryPoint":5903,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory":{"entryPoint":4997,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":6830,"id":null,"parameterSlots":1,"returnSlots":1},"increment_t_uint256":{"entryPoint":5776,"id":null,"parameterSlots":1,"returnSlots":1},"panic_error_0x11":{"entryPoint":5729,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x32":{"entryPoint":5419,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":3768,"id":null,"parameterSlots":0,"returnSlots":0},"validator_revert_contract_IEntryPoint":{"entryPoint":3731,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[{"ast":{"nodeType":"YulBlock","src":"0:23875:7","statements":[{"nodeType":"YulBlock","src":"6:3:7","statements":[]},{"body":{"nodeType":"YulBlock","src":"72:109:7","statements":[{"body":{"nodeType":"YulBlock","src":"159:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"168:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"171:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"161:6:7"},"nodeType":"YulFunctionCall","src":"161:12:7"},"nodeType":"YulExpressionStatement","src":"161:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"95:5:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"106:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"113:42:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"102:3:7"},"nodeType":"YulFunctionCall","src":"102:54:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"92:2:7"},"nodeType":"YulFunctionCall","src":"92:65:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"85:6:7"},"nodeType":"YulFunctionCall","src":"85:73:7"},"nodeType":"YulIf","src":"82:93:7"}]},"name":"validator_revert_contract_IEntryPoint","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"61:5:7","type":""}],"src":"14:167:7"},{"body":{"nodeType":"YulBlock","src":"218:152:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"235:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"238:77:7","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"228:6:7"},"nodeType":"YulFunctionCall","src":"228:88:7"},"nodeType":"YulExpressionStatement","src":"228:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"332:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"335:4:7","type":"","value":"0x41"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"325:6:7"},"nodeType":"YulFunctionCall","src":"325:15:7"},"nodeType":"YulExpressionStatement","src":"325:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"356:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"359:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"349:6:7"},"nodeType":"YulFunctionCall","src":"349:15:7"},"nodeType":"YulExpressionStatement","src":"349:15:7"}]},"name":"panic_error_0x41","nodeType":"YulFunctionDefinition","src":"186:184:7"},{"body":{"nodeType":"YulBlock","src":"421:209:7","statements":[{"nodeType":"YulAssignment","src":"431:19:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"447:2:7","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"441:5:7"},"nodeType":"YulFunctionCall","src":"441:9:7"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"431:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"459:37:7","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"481:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"489:6:7","type":"","value":"0x0160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"477:3:7"},"nodeType":"YulFunctionCall","src":"477:19:7"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"463:10:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"571:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"573:16:7"},"nodeType":"YulFunctionCall","src":"573:18:7"},"nodeType":"YulExpressionStatement","src":"573:18:7"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"514:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"526:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"511:2:7"},"nodeType":"YulFunctionCall","src":"511:34:7"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"550:10:7"},{"name":"memPtr","nodeType":"YulIdentifier","src":"562:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"547:2:7"},"nodeType":"YulFunctionCall","src":"547:22:7"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"508:2:7"},"nodeType":"YulFunctionCall","src":"508:62:7"},"nodeType":"YulIf","src":"505:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"609:2:7","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"613:10:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"602:6:7"},"nodeType":"YulFunctionCall","src":"602:22:7"},"nodeType":"YulExpressionStatement","src":"602:22:7"}]},"name":"allocate_memory_3428","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"410:6:7","type":""}],"src":"375:255:7"},{"body":{"nodeType":"YulBlock","src":"681:207:7","statements":[{"nodeType":"YulAssignment","src":"691:19:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"707:2:7","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"701:5:7"},"nodeType":"YulFunctionCall","src":"701:9:7"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"691:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"719:35:7","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"741:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"749:4:7","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"737:3:7"},"nodeType":"YulFunctionCall","src":"737:17:7"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"723:10:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"829:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"831:16:7"},"nodeType":"YulFunctionCall","src":"831:18:7"},"nodeType":"YulExpressionStatement","src":"831:18:7"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"772:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"784:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"769:2:7"},"nodeType":"YulFunctionCall","src":"769:34:7"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"808:10:7"},{"name":"memPtr","nodeType":"YulIdentifier","src":"820:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"805:2:7"},"nodeType":"YulFunctionCall","src":"805:22:7"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"766:2:7"},"nodeType":"YulFunctionCall","src":"766:62:7"},"nodeType":"YulIf","src":"763:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"867:2:7","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"871:10:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"860:6:7"},"nodeType":"YulFunctionCall","src":"860:22:7"},"nodeType":"YulExpressionStatement","src":"860:22:7"}]},"name":"allocate_memory_3429","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"670:6:7","type":""}],"src":"635:253:7"},{"body":{"nodeType":"YulBlock","src":"939:211:7","statements":[{"nodeType":"YulAssignment","src":"949:21:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"965:4:7","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"959:5:7"},"nodeType":"YulFunctionCall","src":"959:11:7"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"949:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"979:35:7","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1001:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"1009:4:7","type":"","value":"0x40"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"997:3:7"},"nodeType":"YulFunctionCall","src":"997:17:7"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"983:10:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"1089:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1091:16:7"},"nodeType":"YulFunctionCall","src":"1091:18:7"},"nodeType":"YulExpressionStatement","src":"1091:18:7"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1032:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"1044:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1029:2:7"},"nodeType":"YulFunctionCall","src":"1029:34:7"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1068:10:7"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1080:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1065:2:7"},"nodeType":"YulFunctionCall","src":"1065:22:7"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1026:2:7"},"nodeType":"YulFunctionCall","src":"1026:62:7"},"nodeType":"YulIf","src":"1023:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1127:4:7","type":"","value":"0x40"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1133:10:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1120:6:7"},"nodeType":"YulFunctionCall","src":"1120:24:7"},"nodeType":"YulExpressionStatement","src":"1120:24:7"}]},"name":"allocate_memory_3430","nodeType":"YulFunctionDefinition","returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"928:6:7","type":""}],"src":"893:257:7"},{"body":{"nodeType":"YulBlock","src":"1200:289:7","statements":[{"nodeType":"YulAssignment","src":"1210:19:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1226:2:7","type":"","value":"64"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"1220:5:7"},"nodeType":"YulFunctionCall","src":"1220:9:7"},"variableNames":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1210:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"1238:117:7","value":{"arguments":[{"name":"memPtr","nodeType":"YulIdentifier","src":"1260:6:7"},{"arguments":[{"arguments":[{"name":"size","nodeType":"YulIdentifier","src":"1276:4:7"},{"kind":"number","nodeType":"YulLiteral","src":"1282:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1272:3:7"},"nodeType":"YulFunctionCall","src":"1272:13:7"},{"kind":"number","nodeType":"YulLiteral","src":"1287:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1268:3:7"},"nodeType":"YulFunctionCall","src":"1268:86:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1256:3:7"},"nodeType":"YulFunctionCall","src":"1256:99:7"},"variables":[{"name":"newFreePtr","nodeType":"YulTypedName","src":"1242:10:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"1430:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1432:16:7"},"nodeType":"YulFunctionCall","src":"1432:18:7"},"nodeType":"YulExpressionStatement","src":"1432:18:7"}]},"condition":{"arguments":[{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1373:10:7"},{"kind":"number","nodeType":"YulLiteral","src":"1385:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1370:2:7"},"nodeType":"YulFunctionCall","src":"1370:34:7"},{"arguments":[{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1409:10:7"},{"name":"memPtr","nodeType":"YulIdentifier","src":"1421:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"1406:2:7"},"nodeType":"YulFunctionCall","src":"1406:22:7"}],"functionName":{"name":"or","nodeType":"YulIdentifier","src":"1367:2:7"},"nodeType":"YulFunctionCall","src":"1367:62:7"},"nodeType":"YulIf","src":"1364:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1468:2:7","type":"","value":"64"},{"name":"newFreePtr","nodeType":"YulIdentifier","src":"1472:10:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"1461:6:7"},"nodeType":"YulFunctionCall","src":"1461:22:7"},"nodeType":"YulExpressionStatement","src":"1461:22:7"}]},"name":"allocate_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"size","nodeType":"YulTypedName","src":"1180:4:7","type":""}],"returnVariables":[{"name":"memPtr","nodeType":"YulTypedName","src":"1189:6:7","type":""}],"src":"1155:334:7"},{"body":{"nodeType":"YulBlock","src":"1576:114:7","statements":[{"body":{"nodeType":"YulBlock","src":"1620:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1622:16:7"},"nodeType":"YulFunctionCall","src":"1622:18:7"},"nodeType":"YulExpressionStatement","src":"1622:18:7"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1592:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"1600:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1589:2:7"},"nodeType":"YulFunctionCall","src":"1589:30:7"},"nodeType":"YulIf","src":"1586:56:7"},{"nodeType":"YulAssignment","src":"1651:33:7","value":{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"1667:1:7","type":"","value":"5"},{"name":"length","nodeType":"YulIdentifier","src":"1670:6:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"1663:3:7"},"nodeType":"YulFunctionCall","src":"1663:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"1679:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1659:3:7"},"nodeType":"YulFunctionCall","src":"1659:25:7"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"1651:4:7"}]}]},"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"1556:6:7","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"1567:4:7","type":""}],"src":"1494:196:7"},{"body":{"nodeType":"YulBlock","src":"1744:98:7","statements":[{"nodeType":"YulAssignment","src":"1754:29:7","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"1776:6:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"1763:12:7"},"nodeType":"YulFunctionCall","src":"1763:20:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"1754:5:7"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"1830:5:7"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"1792:37:7"},"nodeType":"YulFunctionCall","src":"1792:44:7"},"nodeType":"YulExpressionStatement","src":"1792:44:7"}]},"name":"abi_decode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"1723:6:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"1734:5:7","type":""}],"src":"1695:147:7"},{"body":{"nodeType":"YulBlock","src":"1904:188:7","statements":[{"body":{"nodeType":"YulBlock","src":"1948:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x41","nodeType":"YulIdentifier","src":"1950:16:7"},"nodeType":"YulFunctionCall","src":"1950:18:7"},"nodeType":"YulExpressionStatement","src":"1950:18:7"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1920:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"1928:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"1917:2:7"},"nodeType":"YulFunctionCall","src":"1917:30:7"},"nodeType":"YulIf","src":"1914:56:7"},{"nodeType":"YulAssignment","src":"1979:107:7","value":{"arguments":[{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"1999:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"2007:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1995:3:7"},"nodeType":"YulFunctionCall","src":"1995:15:7"},{"kind":"number","nodeType":"YulLiteral","src":"2012:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"1991:3:7"},"nodeType":"YulFunctionCall","src":"1991:88:7"},{"kind":"number","nodeType":"YulLiteral","src":"2081:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1987:3:7"},"nodeType":"YulFunctionCall","src":"1987:99:7"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"1979:4:7"}]}]},"name":"array_allocation_size_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"length","nodeType":"YulTypedName","src":"1884:6:7","type":""}],"returnVariables":[{"name":"size","nodeType":"YulTypedName","src":"1895:4:7","type":""}],"src":"1847:245:7"},{"body":{"nodeType":"YulBlock","src":"2149:410:7","statements":[{"body":{"nodeType":"YulBlock","src":"2198:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2207:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2210:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2200:6:7"},"nodeType":"YulFunctionCall","src":"2200:12:7"},"nodeType":"YulExpressionStatement","src":"2200:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2177:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"2185:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2173:3:7"},"nodeType":"YulFunctionCall","src":"2173:17:7"},{"name":"end","nodeType":"YulIdentifier","src":"2192:3:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2169:3:7"},"nodeType":"YulFunctionCall","src":"2169:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"2162:6:7"},"nodeType":"YulFunctionCall","src":"2162:35:7"},"nodeType":"YulIf","src":"2159:55:7"},{"nodeType":"YulVariableDeclaration","src":"2223:30:7","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2246:6:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2233:12:7"},"nodeType":"YulFunctionCall","src":"2233:20:7"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2227:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2262:63:7","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"2321:2:7"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"2293:27:7"},"nodeType":"YulFunctionCall","src":"2293:31:7"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"2277:15:7"},"nodeType":"YulFunctionCall","src":"2277:48:7"},"variables":[{"name":"array_1","nodeType":"YulTypedName","src":"2266:7:7","type":""}]},{"expression":{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2341:7:7"},{"name":"_1","nodeType":"YulIdentifier","src":"2350:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2334:6:7"},"nodeType":"YulFunctionCall","src":"2334:19:7"},"nodeType":"YulExpressionStatement","src":"2334:19:7"},{"body":{"nodeType":"YulBlock","src":"2401:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2410:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2413:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2403:6:7"},"nodeType":"YulFunctionCall","src":"2403:12:7"},"nodeType":"YulExpressionStatement","src":"2403:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2376:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"2384:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2372:3:7"},"nodeType":"YulFunctionCall","src":"2372:15:7"},{"kind":"number","nodeType":"YulLiteral","src":"2389:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2368:3:7"},"nodeType":"YulFunctionCall","src":"2368:26:7"},{"name":"end","nodeType":"YulIdentifier","src":"2396:3:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"2365:2:7"},"nodeType":"YulFunctionCall","src":"2365:35:7"},"nodeType":"YulIf","src":"2362:55:7"},{"expression":{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2443:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"2452:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2439:3:7"},"nodeType":"YulFunctionCall","src":"2439:18:7"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"2463:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"2471:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2459:3:7"},"nodeType":"YulFunctionCall","src":"2459:17:7"},{"name":"_1","nodeType":"YulIdentifier","src":"2478:2:7"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"2426:12:7"},"nodeType":"YulFunctionCall","src":"2426:55:7"},"nodeType":"YulExpressionStatement","src":"2426:55:7"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"array_1","nodeType":"YulIdentifier","src":"2505:7:7"},{"name":"_1","nodeType":"YulIdentifier","src":"2514:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2501:3:7"},"nodeType":"YulFunctionCall","src":"2501:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"2519:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2497:3:7"},"nodeType":"YulFunctionCall","src":"2497:27:7"},{"kind":"number","nodeType":"YulLiteral","src":"2526:1:7","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"2490:6:7"},"nodeType":"YulFunctionCall","src":"2490:38:7"},"nodeType":"YulExpressionStatement","src":"2490:38:7"},{"nodeType":"YulAssignment","src":"2537:16:7","value":{"name":"array_1","nodeType":"YulIdentifier","src":"2546:7:7"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"2537:5:7"}]}]},"name":"abi_decode_bytes","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"2123:6:7","type":""},{"name":"end","nodeType":"YulTypedName","src":"2131:3:7","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"2139:5:7","type":""}],"src":"2097:462:7"},{"body":{"nodeType":"YulBlock","src":"2726:2547:7","statements":[{"body":{"nodeType":"YulBlock","src":"2772:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"2781:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"2784:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"2774:6:7"},"nodeType":"YulFunctionCall","src":"2774:12:7"},"nodeType":"YulExpressionStatement","src":"2774:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"2747:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"2756:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"2743:3:7"},"nodeType":"YulFunctionCall","src":"2743:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"2768:2:7","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"2739:3:7"},"nodeType":"YulFunctionCall","src":"2739:32:7"},"nodeType":"YulIf","src":"2736:52:7"},{"nodeType":"YulVariableDeclaration","src":"2797:36:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2823:9:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2810:12:7"},"nodeType":"YulFunctionCall","src":"2810:23:7"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"2801:5:7","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"2880:5:7"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"2842:37:7"},"nodeType":"YulFunctionCall","src":"2842:44:7"},"nodeType":"YulExpressionStatement","src":"2842:44:7"},{"nodeType":"YulAssignment","src":"2895:15:7","value":{"name":"value","nodeType":"YulIdentifier","src":"2905:5:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"2895:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"2919:12:7","value":{"kind":"number","nodeType":"YulLiteral","src":"2929:2:7","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"2923:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2940:46:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"2971:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"2982:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"2967:3:7"},"nodeType":"YulFunctionCall","src":"2967:18:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"2954:12:7"},"nodeType":"YulFunctionCall","src":"2954:32:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"2944:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"2995:28:7","value":{"kind":"number","nodeType":"YulLiteral","src":"3005:18:7","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"2999:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3050:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3059:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3062:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3052:6:7"},"nodeType":"YulFunctionCall","src":"3052:12:7"},"nodeType":"YulExpressionStatement","src":"3052:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"3038:6:7"},{"name":"_2","nodeType":"YulIdentifier","src":"3046:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3035:2:7"},"nodeType":"YulFunctionCall","src":"3035:14:7"},"nodeType":"YulIf","src":"3032:34:7"},{"nodeType":"YulVariableDeclaration","src":"3075:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"3089:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"3100:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3085:3:7"},"nodeType":"YulFunctionCall","src":"3085:22:7"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"3079:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3155:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3164:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3167:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3157:6:7"},"nodeType":"YulFunctionCall","src":"3157:12:7"},"nodeType":"YulExpressionStatement","src":"3157:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3134:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"3138:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3130:3:7"},"nodeType":"YulFunctionCall","src":"3130:13:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3145:7:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3126:3:7"},"nodeType":"YulFunctionCall","src":"3126:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"3119:6:7"},"nodeType":"YulFunctionCall","src":"3119:35:7"},"nodeType":"YulIf","src":"3116:55:7"},{"nodeType":"YulVariableDeclaration","src":"3180:26:7","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3203:2:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3190:12:7"},"nodeType":"YulFunctionCall","src":"3190:16:7"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"3184:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3215:84:7","value":{"arguments":[{"arguments":[{"name":"_4","nodeType":"YulIdentifier","src":"3295:2:7"}],"functionName":{"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulIdentifier","src":"3242:52:7"},"nodeType":"YulFunctionCall","src":"3242:56:7"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"3226:15:7"},"nodeType":"YulFunctionCall","src":"3226:73:7"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"3219:3:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"3308:16:7","value":{"name":"dst","nodeType":"YulIdentifier","src":"3321:3:7"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"3312:5:7","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3340:3:7"},{"name":"_4","nodeType":"YulIdentifier","src":"3345:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3333:6:7"},"nodeType":"YulFunctionCall","src":"3333:15:7"},"nodeType":"YulExpressionStatement","src":"3333:15:7"},{"nodeType":"YulAssignment","src":"3357:19:7","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"3368:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3373:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3364:3:7"},"nodeType":"YulFunctionCall","src":"3364:12:7"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"3357:3:7"}]},{"nodeType":"YulVariableDeclaration","src":"3385:42:7","value":{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3407:2:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3415:1:7","type":"","value":"5"},{"name":"_4","nodeType":"YulIdentifier","src":"3418:2:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"3411:3:7"},"nodeType":"YulFunctionCall","src":"3411:10:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3403:3:7"},"nodeType":"YulFunctionCall","src":"3403:19:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3424:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3399:3:7"},"nodeType":"YulFunctionCall","src":"3399:28:7"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"3389:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3459:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3468:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3471:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3461:6:7"},"nodeType":"YulFunctionCall","src":"3461:12:7"},"nodeType":"YulExpressionStatement","src":"3461:12:7"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"3442:6:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"3450:7:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3439:2:7"},"nodeType":"YulFunctionCall","src":"3439:19:7"},"nodeType":"YulIf","src":"3436:39:7"},{"nodeType":"YulVariableDeclaration","src":"3484:22:7","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3499:2:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3503:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3495:3:7"},"nodeType":"YulFunctionCall","src":"3495:11:7"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"3488:3:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3571:1672:7","statements":[{"nodeType":"YulVariableDeclaration","src":"3585:36:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3617:3:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"3604:12:7"},"nodeType":"YulFunctionCall","src":"3604:17:7"},"variables":[{"name":"innerOffset","nodeType":"YulTypedName","src":"3589:11:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3657:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3666:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3669:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3659:6:7"},"nodeType":"YulFunctionCall","src":"3659:12:7"},"nodeType":"YulExpressionStatement","src":"3659:12:7"}]},"condition":{"arguments":[{"name":"innerOffset","nodeType":"YulIdentifier","src":"3640:11:7"},{"name":"_2","nodeType":"YulIdentifier","src":"3653:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"3637:2:7"},"nodeType":"YulFunctionCall","src":"3637:19:7"},"nodeType":"YulIf","src":"3634:39:7"},{"nodeType":"YulVariableDeclaration","src":"3686:30:7","value":{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"3700:2:7"},{"name":"innerOffset","nodeType":"YulIdentifier","src":"3704:11:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3696:3:7"},"nodeType":"YulFunctionCall","src":"3696:20:7"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"3690:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"3835:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"3844:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"3847:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"3837:6:7"},"nodeType":"YulFunctionCall","src":"3837:12:7"},"nodeType":"YulExpressionStatement","src":"3837:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"3744:7:7"},{"name":"_5","nodeType":"YulIdentifier","src":"3753:2:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"3740:3:7"},"nodeType":"YulFunctionCall","src":"3740:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"3758:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3736:3:7"},"nodeType":"YulFunctionCall","src":"3736:89:7"},{"kind":"number","nodeType":"YulLiteral","src":"3827:6:7","type":"","value":"0x0160"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"3732:3:7"},"nodeType":"YulFunctionCall","src":"3732:102:7"},"nodeType":"YulIf","src":"3729:122:7"},{"nodeType":"YulVariableDeclaration","src":"3864:37:7","value":{"arguments":[],"functionName":{"name":"allocate_memory_3428","nodeType":"YulIdentifier","src":"3879:20:7"},"nodeType":"YulFunctionCall","src":"3879:22:7"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"3868:7:7","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"3921:7:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"3953:2:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3957:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3949:3:7"},"nodeType":"YulFunctionCall","src":"3949:11:7"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"3930:18:7"},"nodeType":"YulFunctionCall","src":"3930:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3914:6:7"},"nodeType":"YulFunctionCall","src":"3914:48:7"},"nodeType":"YulExpressionStatement","src":"3914:48:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"3986:7:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3995:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3982:3:7"},"nodeType":"YulFunctionCall","src":"3982:16:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4017:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4021:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4013:3:7"},"nodeType":"YulFunctionCall","src":"4013:11:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4000:12:7"},"nodeType":"YulFunctionCall","src":"4000:25:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"3975:6:7"},"nodeType":"YulFunctionCall","src":"3975:51:7"},"nodeType":"YulExpressionStatement","src":"3975:51:7"},{"nodeType":"YulVariableDeclaration","src":"4039:41:7","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4072:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4076:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4068:3:7"},"nodeType":"YulFunctionCall","src":"4068:11:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4055:12:7"},"nodeType":"YulFunctionCall","src":"4055:25:7"},"variables":[{"name":"offset_1","nodeType":"YulTypedName","src":"4043:8:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"4113:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4122:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4125:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4115:6:7"},"nodeType":"YulFunctionCall","src":"4115:12:7"},"nodeType":"YulExpressionStatement","src":"4115:12:7"}]},"condition":{"arguments":[{"name":"offset_1","nodeType":"YulIdentifier","src":"4099:8:7"},{"name":"_2","nodeType":"YulIdentifier","src":"4109:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4096:2:7"},"nodeType":"YulFunctionCall","src":"4096:16:7"},"nodeType":"YulIf","src":"4093:36:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4153:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4162:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4149:3:7"},"nodeType":"YulFunctionCall","src":"4149:16:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4192:2:7"},{"name":"offset_1","nodeType":"YulIdentifier","src":"4196:8:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4188:3:7"},"nodeType":"YulFunctionCall","src":"4188:17:7"},{"name":"_1","nodeType":"YulIdentifier","src":"4207:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4184:3:7"},"nodeType":"YulFunctionCall","src":"4184:26:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4212:7:7"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4167:16:7"},"nodeType":"YulFunctionCall","src":"4167:53:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4142:6:7"},"nodeType":"YulFunctionCall","src":"4142:79:7"},"nodeType":"YulExpressionStatement","src":"4142:79:7"},{"nodeType":"YulVariableDeclaration","src":"4234:42:7","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4267:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4271:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4263:3:7"},"nodeType":"YulFunctionCall","src":"4263:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4250:12:7"},"nodeType":"YulFunctionCall","src":"4250:26:7"},"variables":[{"name":"offset_2","nodeType":"YulTypedName","src":"4238:8:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"4309:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4318:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4321:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4311:6:7"},"nodeType":"YulFunctionCall","src":"4311:12:7"},"nodeType":"YulExpressionStatement","src":"4311:12:7"}]},"condition":{"arguments":[{"name":"offset_2","nodeType":"YulIdentifier","src":"4295:8:7"},{"name":"_2","nodeType":"YulIdentifier","src":"4305:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4292:2:7"},"nodeType":"YulFunctionCall","src":"4292:16:7"},"nodeType":"YulIf","src":"4289:36:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4349:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4358:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4345:3:7"},"nodeType":"YulFunctionCall","src":"4345:16:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4388:2:7"},{"name":"offset_2","nodeType":"YulIdentifier","src":"4392:8:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4384:3:7"},"nodeType":"YulFunctionCall","src":"4384:17:7"},{"name":"_1","nodeType":"YulIdentifier","src":"4403:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4380:3:7"},"nodeType":"YulFunctionCall","src":"4380:26:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4408:7:7"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4363:16:7"},"nodeType":"YulFunctionCall","src":"4363:53:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4338:6:7"},"nodeType":"YulFunctionCall","src":"4338:79:7"},"nodeType":"YulExpressionStatement","src":"4338:79:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4441:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4450:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4437:3:7"},"nodeType":"YulFunctionCall","src":"4437:17:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4473:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4477:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4469:3:7"},"nodeType":"YulFunctionCall","src":"4469:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4456:12:7"},"nodeType":"YulFunctionCall","src":"4456:26:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4430:6:7"},"nodeType":"YulFunctionCall","src":"4430:53:7"},"nodeType":"YulExpressionStatement","src":"4430:53:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4507:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4516:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4503:3:7"},"nodeType":"YulFunctionCall","src":"4503:17:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4539:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4543:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4535:3:7"},"nodeType":"YulFunctionCall","src":"4535:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4522:12:7"},"nodeType":"YulFunctionCall","src":"4522:26:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4496:6:7"},"nodeType":"YulFunctionCall","src":"4496:53:7"},"nodeType":"YulExpressionStatement","src":"4496:53:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4573:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4582:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4569:3:7"},"nodeType":"YulFunctionCall","src":"4569:17:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4605:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4609:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4601:3:7"},"nodeType":"YulFunctionCall","src":"4601:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4588:12:7"},"nodeType":"YulFunctionCall","src":"4588:26:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4562:6:7"},"nodeType":"YulFunctionCall","src":"4562:53:7"},"nodeType":"YulExpressionStatement","src":"4562:53:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4639:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4648:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4635:3:7"},"nodeType":"YulFunctionCall","src":"4635:17:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4671:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4675:3:7","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4667:3:7"},"nodeType":"YulFunctionCall","src":"4667:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4654:12:7"},"nodeType":"YulFunctionCall","src":"4654:26:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4628:6:7"},"nodeType":"YulFunctionCall","src":"4628:53:7"},"nodeType":"YulExpressionStatement","src":"4628:53:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4705:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4714:3:7","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4701:3:7"},"nodeType":"YulFunctionCall","src":"4701:17:7"},{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4737:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"4741:3:7","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4733:3:7"},"nodeType":"YulFunctionCall","src":"4733:12:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4720:12:7"},"nodeType":"YulFunctionCall","src":"4720:26:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4694:6:7"},"nodeType":"YulFunctionCall","src":"4694:53:7"},"nodeType":"YulExpressionStatement","src":"4694:53:7"},{"nodeType":"YulVariableDeclaration","src":"4760:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"4770:3:7","type":"","value":"320"},"variables":[{"name":"_6","nodeType":"YulTypedName","src":"4764:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"4786:41:7","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4819:2:7"},{"name":"_6","nodeType":"YulIdentifier","src":"4823:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4815:3:7"},"nodeType":"YulFunctionCall","src":"4815:11:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4802:12:7"},"nodeType":"YulFunctionCall","src":"4802:25:7"},"variables":[{"name":"offset_3","nodeType":"YulTypedName","src":"4790:8:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"4860:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4869:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"4872:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4862:6:7"},"nodeType":"YulFunctionCall","src":"4862:12:7"},"nodeType":"YulExpressionStatement","src":"4862:12:7"}]},"condition":{"arguments":[{"name":"offset_3","nodeType":"YulIdentifier","src":"4846:8:7"},{"name":"_2","nodeType":"YulIdentifier","src":"4856:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"4843:2:7"},"nodeType":"YulFunctionCall","src":"4843:16:7"},"nodeType":"YulIf","src":"4840:36:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"4900:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"4909:3:7","type":"","value":"288"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4896:3:7"},"nodeType":"YulFunctionCall","src":"4896:17:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"4940:2:7"},{"name":"offset_3","nodeType":"YulIdentifier","src":"4944:8:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4936:3:7"},"nodeType":"YulFunctionCall","src":"4936:17:7"},{"name":"_1","nodeType":"YulIdentifier","src":"4955:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"4932:3:7"},"nodeType":"YulFunctionCall","src":"4932:26:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"4960:7:7"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"4915:16:7"},"nodeType":"YulFunctionCall","src":"4915:53:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4889:6:7"},"nodeType":"YulFunctionCall","src":"4889:80:7"},"nodeType":"YulExpressionStatement","src":"4889:80:7"},{"nodeType":"YulVariableDeclaration","src":"4982:45:7","value":{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"5015:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"5019:6:7","type":"","value":"0x0160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5011:3:7"},"nodeType":"YulFunctionCall","src":"5011:15:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4998:12:7"},"nodeType":"YulFunctionCall","src":"4998:29:7"},"variables":[{"name":"offset_4","nodeType":"YulTypedName","src":"4986:8:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"5060:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"5069:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"5072:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"5062:6:7"},"nodeType":"YulFunctionCall","src":"5062:12:7"},"nodeType":"YulExpressionStatement","src":"5062:12:7"}]},"condition":{"arguments":[{"name":"offset_4","nodeType":"YulIdentifier","src":"5046:8:7"},{"name":"_2","nodeType":"YulIdentifier","src":"5056:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"5043:2:7"},"nodeType":"YulFunctionCall","src":"5043:16:7"},"nodeType":"YulIf","src":"5040:36:7"},{"expression":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"5100:7:7"},{"name":"_6","nodeType":"YulIdentifier","src":"5109:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5096:3:7"},"nodeType":"YulFunctionCall","src":"5096:16:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"_5","nodeType":"YulIdentifier","src":"5139:2:7"},{"name":"offset_4","nodeType":"YulIdentifier","src":"5143:8:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5135:3:7"},"nodeType":"YulFunctionCall","src":"5135:17:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5154:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5131:3:7"},"nodeType":"YulFunctionCall","src":"5131:26:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"5159:7:7"}],"functionName":{"name":"abi_decode_bytes","nodeType":"YulIdentifier","src":"5114:16:7"},"nodeType":"YulFunctionCall","src":"5114:53:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5089:6:7"},"nodeType":"YulFunctionCall","src":"5089:79:7"},"nodeType":"YulExpressionStatement","src":"5089:79:7"},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5188:3:7"},{"name":"value_1","nodeType":"YulIdentifier","src":"5193:7:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5181:6:7"},"nodeType":"YulFunctionCall","src":"5181:20:7"},"nodeType":"YulExpressionStatement","src":"5181:20:7"},{"nodeType":"YulAssignment","src":"5214:19:7","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"5225:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5230:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5221:3:7"},"nodeType":"YulFunctionCall","src":"5221:12:7"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"5214:3:7"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3526:3:7"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"3531:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"3523:2:7"},"nodeType":"YulFunctionCall","src":"3523:15:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"3539:23:7","statements":[{"nodeType":"YulAssignment","src":"3541:19:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"3552:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"3557:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"3548:3:7"},"nodeType":"YulFunctionCall","src":"3548:12:7"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"3541:3:7"}]}]},"pre":{"nodeType":"YulBlock","src":"3519:3:7","statements":[]},"src":"3515:1728:7"},{"nodeType":"YulAssignment","src":"5252:15:7","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"5262:5:7"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"5252:6:7"}]}]},"name":"abi_decode_tuple_t_contract$_IEntryPoint_$998t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"2684:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"2695:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"2707:6:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"2715:6:7","type":""}],"src":"2564:2709:7"},{"body":{"nodeType":"YulBlock","src":"5429:481:7","statements":[{"nodeType":"YulVariableDeclaration","src":"5439:12:7","value":{"kind":"number","nodeType":"YulLiteral","src":"5449:2:7","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"5443:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5460:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5478:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5489:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5474:3:7"},"nodeType":"YulFunctionCall","src":"5474:18:7"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"5464:6:7","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5508:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5519:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5501:6:7"},"nodeType":"YulFunctionCall","src":"5501:21:7"},"nodeType":"YulExpressionStatement","src":"5501:21:7"},{"nodeType":"YulVariableDeclaration","src":"5531:17:7","value":{"name":"tail_1","nodeType":"YulIdentifier","src":"5542:6:7"},"variables":[{"name":"pos","nodeType":"YulTypedName","src":"5535:3:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5557:27:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5577:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5571:5:7"},"nodeType":"YulFunctionCall","src":"5571:13:7"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"5561:6:7","type":""}]},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"5600:6:7"},{"name":"length","nodeType":"YulIdentifier","src":"5608:6:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5593:6:7"},"nodeType":"YulFunctionCall","src":"5593:22:7"},"nodeType":"YulExpressionStatement","src":"5593:22:7"},{"nodeType":"YulAssignment","src":"5624:25:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"5635:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"5646:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5631:3:7"},"nodeType":"YulFunctionCall","src":"5631:18:7"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5624:3:7"}]},{"nodeType":"YulVariableDeclaration","src":"5658:29:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"5676:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5684:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5672:3:7"},"nodeType":"YulFunctionCall","src":"5672:15:7"},"variables":[{"name":"srcPtr","nodeType":"YulTypedName","src":"5662:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"5696:10:7","value":{"kind":"number","nodeType":"YulLiteral","src":"5705:1:7","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"5700:1:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"5764:120:7","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5785:3:7"},{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5796:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"5790:5:7"},"nodeType":"YulFunctionCall","src":"5790:13:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"5778:6:7"},"nodeType":"YulFunctionCall","src":"5778:26:7"},"nodeType":"YulExpressionStatement","src":"5778:26:7"},{"nodeType":"YulAssignment","src":"5817:19:7","value":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"5828:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5833:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5824:3:7"},"nodeType":"YulFunctionCall","src":"5824:12:7"},"variableNames":[{"name":"pos","nodeType":"YulIdentifier","src":"5817:3:7"}]},{"nodeType":"YulAssignment","src":"5849:25:7","value":{"arguments":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5863:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"5871:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5859:3:7"},"nodeType":"YulFunctionCall","src":"5859:15:7"},"variableNames":[{"name":"srcPtr","nodeType":"YulIdentifier","src":"5849:6:7"}]}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5726:1:7"},{"name":"length","nodeType":"YulIdentifier","src":"5729:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"5723:2:7"},"nodeType":"YulFunctionCall","src":"5723:13:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"5737:18:7","statements":[{"nodeType":"YulAssignment","src":"5739:14:7","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"5748:1:7"},{"kind":"number","nodeType":"YulLiteral","src":"5751:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"5744:3:7"},"nodeType":"YulFunctionCall","src":"5744:9:7"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"5739:1:7"}]}]},"pre":{"nodeType":"YulBlock","src":"5719:3:7","statements":[]},"src":"5715:169:7"},{"nodeType":"YulAssignment","src":"5893:11:7","value":{"name":"pos","nodeType":"YulIdentifier","src":"5901:3:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"5893:4:7"}]}]},"name":"abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5398:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"5409:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"5420:4:7","type":""}],"src":"5278:632:7"},{"body":{"nodeType":"YulBlock","src":"6010:897:7","statements":[{"nodeType":"YulVariableDeclaration","src":"6020:12:7","value":{"kind":"number","nodeType":"YulLiteral","src":"6030:2:7","type":"","value":"32"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"6024:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"6077:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6086:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6089:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6079:6:7"},"nodeType":"YulFunctionCall","src":"6079:12:7"},"nodeType":"YulExpressionStatement","src":"6079:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"6052:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"6061:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6048:3:7"},"nodeType":"YulFunctionCall","src":"6048:23:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6073:2:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6044:3:7"},"nodeType":"YulFunctionCall","src":"6044:32:7"},"nodeType":"YulIf","src":"6041:52:7"},{"nodeType":"YulVariableDeclaration","src":"6102:37:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6129:9:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6116:12:7"},"nodeType":"YulFunctionCall","src":"6116:23:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"6106:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"6182:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6191:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6194:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6184:6:7"},"nodeType":"YulFunctionCall","src":"6184:12:7"},"nodeType":"YulExpressionStatement","src":"6184:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"6154:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"6162:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6151:2:7"},"nodeType":"YulFunctionCall","src":"6151:30:7"},"nodeType":"YulIf","src":"6148:50:7"},{"nodeType":"YulVariableDeclaration","src":"6207:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"6221:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"6232:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6217:3:7"},"nodeType":"YulFunctionCall","src":"6217:22:7"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"6211:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"6287:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6296:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6299:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6289:6:7"},"nodeType":"YulFunctionCall","src":"6289:12:7"},"nodeType":"YulExpressionStatement","src":"6289:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6266:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"6270:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6262:3:7"},"nodeType":"YulFunctionCall","src":"6262:13:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6277:7:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"6258:3:7"},"nodeType":"YulFunctionCall","src":"6258:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"6251:6:7"},"nodeType":"YulFunctionCall","src":"6251:35:7"},"nodeType":"YulIf","src":"6248:55:7"},{"nodeType":"YulVariableDeclaration","src":"6312:26:7","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6335:2:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6322:12:7"},"nodeType":"YulFunctionCall","src":"6322:16:7"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"6316:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6347:84:7","value":{"arguments":[{"arguments":[{"name":"_3","nodeType":"YulIdentifier","src":"6427:2:7"}],"functionName":{"name":"array_allocation_size_array_struct_UserOperation_dyn","nodeType":"YulIdentifier","src":"6374:52:7"},"nodeType":"YulFunctionCall","src":"6374:56:7"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"6358:15:7"},"nodeType":"YulFunctionCall","src":"6358:73:7"},"variables":[{"name":"dst","nodeType":"YulTypedName","src":"6351:3:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"6440:16:7","value":{"name":"dst","nodeType":"YulIdentifier","src":"6453:3:7"},"variables":[{"name":"dst_1","nodeType":"YulTypedName","src":"6444:5:7","type":""}]},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6472:3:7"},{"name":"_3","nodeType":"YulIdentifier","src":"6477:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6465:6:7"},"nodeType":"YulFunctionCall","src":"6465:15:7"},"nodeType":"YulExpressionStatement","src":"6465:15:7"},{"nodeType":"YulAssignment","src":"6489:19:7","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6500:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6505:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6496:3:7"},"nodeType":"YulFunctionCall","src":"6496:12:7"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6489:3:7"}]},{"nodeType":"YulVariableDeclaration","src":"6517:42:7","value":{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6539:2:7"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6547:1:7","type":"","value":"5"},{"name":"_3","nodeType":"YulIdentifier","src":"6550:2:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"6543:3:7"},"nodeType":"YulFunctionCall","src":"6543:10:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6535:3:7"},"nodeType":"YulFunctionCall","src":"6535:19:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6556:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6531:3:7"},"nodeType":"YulFunctionCall","src":"6531:28:7"},"variables":[{"name":"srcEnd","nodeType":"YulTypedName","src":"6521:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"6591:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6600:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"6603:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"6593:6:7"},"nodeType":"YulFunctionCall","src":"6593:12:7"},"nodeType":"YulExpressionStatement","src":"6593:12:7"}]},"condition":{"arguments":[{"name":"srcEnd","nodeType":"YulIdentifier","src":"6574:6:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"6582:7:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"6571:2:7"},"nodeType":"YulFunctionCall","src":"6571:19:7"},"nodeType":"YulIf","src":"6568:39:7"},{"nodeType":"YulVariableDeclaration","src":"6616:22:7","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"6631:2:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6635:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6627:3:7"},"nodeType":"YulFunctionCall","src":"6627:11:7"},"variables":[{"name":"src","nodeType":"YulTypedName","src":"6620:3:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"6703:174:7","statements":[{"nodeType":"YulVariableDeclaration","src":"6717:30:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6743:3:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"6730:12:7"},"nodeType":"YulFunctionCall","src":"6730:17:7"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"6721:5:7","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"6798:5:7"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"6760:37:7"},"nodeType":"YulFunctionCall","src":"6760:44:7"},"nodeType":"YulExpressionStatement","src":"6760:44:7"},{"expression":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6824:3:7"},{"name":"value","nodeType":"YulIdentifier","src":"6829:5:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6817:6:7"},"nodeType":"YulFunctionCall","src":"6817:18:7"},"nodeType":"YulExpressionStatement","src":"6817:18:7"},{"nodeType":"YulAssignment","src":"6848:19:7","value":{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"6859:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6864:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6855:3:7"},"nodeType":"YulFunctionCall","src":"6855:12:7"},"variableNames":[{"name":"dst","nodeType":"YulIdentifier","src":"6848:3:7"}]}]},"condition":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6658:3:7"},{"name":"srcEnd","nodeType":"YulIdentifier","src":"6663:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"6655:2:7"},"nodeType":"YulFunctionCall","src":"6655:15:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"6671:23:7","statements":[{"nodeType":"YulAssignment","src":"6673:19:7","value":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"6684:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"6689:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6680:3:7"},"nodeType":"YulFunctionCall","src":"6680:12:7"},"variableNames":[{"name":"src","nodeType":"YulIdentifier","src":"6673:3:7"}]}]},"pre":{"nodeType":"YulBlock","src":"6651:3:7","statements":[]},"src":"6647:230:7"},{"nodeType":"YulAssignment","src":"6886:15:7","value":{"name":"dst_1","nodeType":"YulIdentifier","src":"6896:5:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"6886:6:7"}]}]},"name":"abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"5976:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"5987:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"5999:6:7","type":""}],"src":"5915:992:7"},{"body":{"nodeType":"YulBlock","src":"7013:76:7","statements":[{"nodeType":"YulAssignment","src":"7023:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7035:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"7046:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7031:3:7"},"nodeType":"YulFunctionCall","src":"7031:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7023:4:7"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7065:9:7"},{"name":"value0","nodeType":"YulIdentifier","src":"7076:6:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7058:6:7"},"nodeType":"YulFunctionCall","src":"7058:25:7"},"nodeType":"YulExpressionStatement","src":"7058:25:7"}]},"name":"abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"6982:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"6993:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7004:4:7","type":""}],"src":"6912:177:7"},{"body":{"nodeType":"YulBlock","src":"7183:502:7","statements":[{"body":{"nodeType":"YulBlock","src":"7229:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7238:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7241:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7231:6:7"},"nodeType":"YulFunctionCall","src":"7231:12:7"},"nodeType":"YulExpressionStatement","src":"7231:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"7204:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"7213:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"7200:3:7"},"nodeType":"YulFunctionCall","src":"7200:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"7225:2:7","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7196:3:7"},"nodeType":"YulFunctionCall","src":"7196:32:7"},"nodeType":"YulIf","src":"7193:52:7"},{"nodeType":"YulVariableDeclaration","src":"7254:37:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7281:9:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7268:12:7"},"nodeType":"YulFunctionCall","src":"7268:23:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"7258:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"7300:28:7","value":{"kind":"number","nodeType":"YulLiteral","src":"7310:18:7","type":"","value":"0xffffffffffffffff"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"7304:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"7355:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7364:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7367:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7357:6:7"},"nodeType":"YulFunctionCall","src":"7357:12:7"},"nodeType":"YulExpressionStatement","src":"7357:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"7343:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"7351:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7340:2:7"},"nodeType":"YulFunctionCall","src":"7340:14:7"},"nodeType":"YulIf","src":"7337:34:7"},{"nodeType":"YulVariableDeclaration","src":"7380:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7394:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"7405:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7390:3:7"},"nodeType":"YulFunctionCall","src":"7390:22:7"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"7384:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"7460:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7469:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7472:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7462:6:7"},"nodeType":"YulFunctionCall","src":"7462:12:7"},"nodeType":"YulExpressionStatement","src":"7462:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7439:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"7443:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7435:3:7"},"nodeType":"YulFunctionCall","src":"7435:13:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7450:7:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"7431:3:7"},"nodeType":"YulFunctionCall","src":"7431:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7424:6:7"},"nodeType":"YulFunctionCall","src":"7424:35:7"},"nodeType":"YulIf","src":"7421:55:7"},{"nodeType":"YulVariableDeclaration","src":"7485:30:7","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7512:2:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"7499:12:7"},"nodeType":"YulFunctionCall","src":"7499:16:7"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"7489:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"7542:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7551:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7554:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7544:6:7"},"nodeType":"YulFunctionCall","src":"7544:12:7"},"nodeType":"YulExpressionStatement","src":"7544:12:7"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"7530:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"7538:2:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7527:2:7"},"nodeType":"YulFunctionCall","src":"7527:14:7"},"nodeType":"YulIf","src":"7524:34:7"},{"body":{"nodeType":"YulBlock","src":"7608:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"7617:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"7620:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"7610:6:7"},"nodeType":"YulFunctionCall","src":"7610:12:7"},"nodeType":"YulExpressionStatement","src":"7610:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7581:2:7"},{"name":"length","nodeType":"YulIdentifier","src":"7585:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7577:3:7"},"nodeType":"YulFunctionCall","src":"7577:15:7"},{"kind":"number","nodeType":"YulLiteral","src":"7594:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7573:3:7"},"nodeType":"YulFunctionCall","src":"7573:24:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"7599:7:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"7570:2:7"},"nodeType":"YulFunctionCall","src":"7570:37:7"},"nodeType":"YulIf","src":"7567:57:7"},{"nodeType":"YulAssignment","src":"7633:21:7","value":{"arguments":[{"name":"_2","nodeType":"YulIdentifier","src":"7647:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"7651:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7643:3:7"},"nodeType":"YulFunctionCall","src":"7643:11:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"7633:6:7"}]},{"nodeType":"YulAssignment","src":"7663:16:7","value":{"name":"length","nodeType":"YulIdentifier","src":"7673:6:7"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"7663:6:7"}]}]},"name":"abi_decode_tuple_t_bytes_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7141:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"7152:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"7164:6:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"7172:6:7","type":""}],"src":"7094:591:7"},{"body":{"nodeType":"YulBlock","src":"7734:83:7","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"7751:3:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"7760:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"7767:42:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7756:3:7"},"nodeType":"YulFunctionCall","src":"7756:54:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7744:6:7"},"nodeType":"YulFunctionCall","src":"7744:67:7"},"nodeType":"YulExpressionStatement","src":"7744:67:7"}]},"name":"abi_encode_address","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"7718:5:7","type":""},{"name":"pos","nodeType":"YulTypedName","src":"7725:3:7","type":""}],"src":"7690:127:7"},{"body":{"nodeType":"YulBlock","src":"7923:125:7","statements":[{"nodeType":"YulAssignment","src":"7933:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7945:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"7956:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7941:3:7"},"nodeType":"YulFunctionCall","src":"7941:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"7933:4:7"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"7975:9:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"7990:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"7998:42:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"7986:3:7"},"nodeType":"YulFunctionCall","src":"7986:55:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7968:6:7"},"nodeType":"YulFunctionCall","src":"7968:74:7"},"nodeType":"YulExpressionStatement","src":"7968:74:7"}]},"name":"abi_encode_tuple_t_address__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"7892:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"7903:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"7914:4:7","type":""}],"src":"7822:226:7"},{"body":{"nodeType":"YulBlock","src":"8173:125:7","statements":[{"nodeType":"YulAssignment","src":"8183:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8195:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"8206:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8191:3:7"},"nodeType":"YulFunctionCall","src":"8191:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"8183:4:7"}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8225:9:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"8240:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"8248:42:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"8236:3:7"},"nodeType":"YulFunctionCall","src":"8236:55:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8218:6:7"},"nodeType":"YulFunctionCall","src":"8218:74:7"},"nodeType":"YulExpressionStatement","src":"8218:74:7"}]},"name":"abi_encode_tuple_t_contract$_IEntryPoint_$998__to_t_address__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8142:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"8153:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"8164:4:7","type":""}],"src":"8053:245:7"},{"body":{"nodeType":"YulBlock","src":"8406:290:7","statements":[{"body":{"nodeType":"YulBlock","src":"8452:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8461:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8464:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8454:6:7"},"nodeType":"YulFunctionCall","src":"8454:12:7"},"nodeType":"YulExpressionStatement","src":"8454:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8427:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"8436:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8423:3:7"},"nodeType":"YulFunctionCall","src":"8423:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"8448:2:7","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8419:3:7"},"nodeType":"YulFunctionCall","src":"8419:32:7"},"nodeType":"YulIf","src":"8416:52:7"},{"nodeType":"YulVariableDeclaration","src":"8477:37:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8504:9:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"8491:12:7"},"nodeType":"YulFunctionCall","src":"8491:23:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"8481:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"8557:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8566:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8569:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8559:6:7"},"nodeType":"YulFunctionCall","src":"8559:12:7"},"nodeType":"YulExpressionStatement","src":"8559:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"8529:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"8537:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8526:2:7"},"nodeType":"YulFunctionCall","src":"8526:30:7"},"nodeType":"YulIf","src":"8523:50:7"},{"nodeType":"YulVariableDeclaration","src":"8582:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"8596:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"8607:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8592:3:7"},"nodeType":"YulFunctionCall","src":"8592:22:7"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"8586:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"8653:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8662:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"8665:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8655:6:7"},"nodeType":"YulFunctionCall","src":"8655:12:7"},"nodeType":"YulExpressionStatement","src":"8655:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"8634:7:7"},{"name":"_1","nodeType":"YulIdentifier","src":"8643:2:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8630:3:7"},"nodeType":"YulFunctionCall","src":"8630:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"8648:3:7","type":"","value":"352"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"8626:3:7"},"nodeType":"YulFunctionCall","src":"8626:26:7"},"nodeType":"YulIf","src":"8623:46:7"},{"nodeType":"YulAssignment","src":"8678:12:7","value":{"name":"_1","nodeType":"YulIdentifier","src":"8688:2:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"8678:6:7"}]}]},"name":"abi_decode_tuple_t_struct$_UserOperation_$1149_calldata_ptr","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"8372:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"8383:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"8395:6:7","type":""}],"src":"8303:393:7"},{"body":{"nodeType":"YulBlock","src":"8754:205:7","statements":[{"nodeType":"YulVariableDeclaration","src":"8764:10:7","value":{"kind":"number","nodeType":"YulLiteral","src":"8773:1:7","type":"","value":"0"},"variables":[{"name":"i","nodeType":"YulTypedName","src":"8768:1:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"8833:63:7","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"8858:3:7"},{"name":"i","nodeType":"YulIdentifier","src":"8863:1:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8854:3:7"},"nodeType":"YulFunctionCall","src":"8854:11:7"},{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"8877:3:7"},{"name":"i","nodeType":"YulIdentifier","src":"8882:1:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8873:3:7"},"nodeType":"YulFunctionCall","src":"8873:11:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"8867:5:7"},"nodeType":"YulFunctionCall","src":"8867:18:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8847:6:7"},"nodeType":"YulFunctionCall","src":"8847:39:7"},"nodeType":"YulExpressionStatement","src":"8847:39:7"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"8794:1:7"},{"name":"length","nodeType":"YulIdentifier","src":"8797:6:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"8791:2:7"},"nodeType":"YulFunctionCall","src":"8791:13:7"},"nodeType":"YulForLoop","post":{"nodeType":"YulBlock","src":"8805:19:7","statements":[{"nodeType":"YulAssignment","src":"8807:15:7","value":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"8816:1:7"},{"kind":"number","nodeType":"YulLiteral","src":"8819:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8812:3:7"},"nodeType":"YulFunctionCall","src":"8812:10:7"},"variableNames":[{"name":"i","nodeType":"YulIdentifier","src":"8807:1:7"}]}]},"pre":{"nodeType":"YulBlock","src":"8787:3:7","statements":[]},"src":"8783:113:7"},{"body":{"nodeType":"YulBlock","src":"8922:31:7","statements":[{"expression":{"arguments":[{"arguments":[{"name":"dst","nodeType":"YulIdentifier","src":"8935:3:7"},{"name":"length","nodeType":"YulIdentifier","src":"8940:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8931:3:7"},"nodeType":"YulFunctionCall","src":"8931:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"8949:1:7","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8924:6:7"},"nodeType":"YulFunctionCall","src":"8924:27:7"},"nodeType":"YulExpressionStatement","src":"8924:27:7"}]},"condition":{"arguments":[{"name":"i","nodeType":"YulIdentifier","src":"8911:1:7"},{"name":"length","nodeType":"YulIdentifier","src":"8914:6:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"8908:2:7"},"nodeType":"YulFunctionCall","src":"8908:13:7"},"nodeType":"YulIf","src":"8905:48:7"}]},"name":"copy_memory_to_memory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"8732:3:7","type":""},{"name":"dst","nodeType":"YulTypedName","src":"8737:3:7","type":""},{"name":"length","nodeType":"YulTypedName","src":"8742:6:7","type":""}],"src":"8701:258:7"},{"body":{"nodeType":"YulBlock","src":"9014:267:7","statements":[{"nodeType":"YulVariableDeclaration","src":"9024:26:7","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9044:5:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9038:5:7"},"nodeType":"YulFunctionCall","src":"9038:12:7"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"9028:6:7","type":""}]},{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9066:3:7"},{"name":"length","nodeType":"YulIdentifier","src":"9071:6:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9059:6:7"},"nodeType":"YulFunctionCall","src":"9059:19:7"},"nodeType":"YulExpressionStatement","src":"9059:19:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9113:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"9120:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9109:3:7"},"nodeType":"YulFunctionCall","src":"9109:16:7"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9131:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"9136:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9127:3:7"},"nodeType":"YulFunctionCall","src":"9127:14:7"},{"name":"length","nodeType":"YulIdentifier","src":"9143:6:7"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"9087:21:7"},"nodeType":"YulFunctionCall","src":"9087:63:7"},"nodeType":"YulExpressionStatement","src":"9087:63:7"},{"nodeType":"YulAssignment","src":"9159:116:7","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9174:3:7"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"9187:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"9195:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9183:3:7"},"nodeType":"YulFunctionCall","src":"9183:15:7"},{"kind":"number","nodeType":"YulLiteral","src":"9200:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9179:3:7"},"nodeType":"YulFunctionCall","src":"9179:88:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9170:3:7"},"nodeType":"YulFunctionCall","src":"9170:98:7"},{"kind":"number","nodeType":"YulLiteral","src":"9270:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9166:3:7"},"nodeType":"YulFunctionCall","src":"9166:109:7"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"9159:3:7"}]}]},"name":"abi_encode_string","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"8991:5:7","type":""},{"name":"pos","nodeType":"YulTypedName","src":"8998:3:7","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"9006:3:7","type":""}],"src":"8964:317:7"},{"body":{"nodeType":"YulBlock","src":"9339:97:7","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9356:3:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9367:5:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9361:5:7"},"nodeType":"YulFunctionCall","src":"9361:12:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9349:6:7"},"nodeType":"YulFunctionCall","src":"9349:25:7"},"nodeType":"YulExpressionStatement","src":"9349:25:7"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9394:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"9399:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9390:3:7"},"nodeType":"YulFunctionCall","src":"9390:14:7"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9416:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"9423:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9412:3:7"},"nodeType":"YulFunctionCall","src":"9412:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9406:5:7"},"nodeType":"YulFunctionCall","src":"9406:23:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9383:6:7"},"nodeType":"YulFunctionCall","src":"9383:47:7"},"nodeType":"YulExpressionStatement","src":"9383:47:7"}]},"name":"abi_encode_struct_StakeInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"9323:5:7","type":""},{"name":"pos","nodeType":"YulTypedName","src":"9330:3:7","type":""}],"src":"9286:150:7"},{"body":{"nodeType":"YulBlock","src":"9504:208:7","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9521:3:7"},{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9536:5:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9530:5:7"},"nodeType":"YulFunctionCall","src":"9530:12:7"},{"kind":"number","nodeType":"YulLiteral","src":"9544:42:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"9526:3:7"},"nodeType":"YulFunctionCall","src":"9526:61:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9514:6:7"},"nodeType":"YulFunctionCall","src":"9514:74:7"},"nodeType":"YulExpressionStatement","src":"9514:74:7"},{"nodeType":"YulVariableDeclaration","src":"9597:43:7","value":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"9627:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"9634:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9623:3:7"},"nodeType":"YulFunctionCall","src":"9623:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"9617:5:7"},"nodeType":"YulFunctionCall","src":"9617:23:7"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"9601:12:7","type":""}]},{"expression":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"9677:12:7"},{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"9695:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"9700:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"9691:3:7"},"nodeType":"YulFunctionCall","src":"9691:14:7"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"9649:27:7"},"nodeType":"YulFunctionCall","src":"9649:57:7"},"nodeType":"YulExpressionStatement","src":"9649:57:7"}]},"name":"abi_encode_struct_AggregatorStakeInfo","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"9488:5:7","type":""},{"name":"pos","nodeType":"YulTypedName","src":"9495:3:7","type":""}],"src":"9441:271:7"},{"body":{"nodeType":"YulBlock","src":"9954:1806:7","statements":[{"nodeType":"YulVariableDeclaration","src":"9964:12:7","value":{"kind":"number","nodeType":"YulLiteral","src":"9974:2:7","type":"","value":"64"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"9968:2:7","type":""}]},{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"9992:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"10003:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"9985:6:7"},"nodeType":"YulFunctionCall","src":"9985:21:7"},"nodeType":"YulExpressionStatement","src":"9985:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10026:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"10037:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10022:3:7"},"nodeType":"YulFunctionCall","src":"10022:18:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10062:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10056:5:7"},"nodeType":"YulFunctionCall","src":"10056:13:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10049:6:7"},"nodeType":"YulFunctionCall","src":"10049:21:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10042:6:7"},"nodeType":"YulFunctionCall","src":"10042:29:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10015:6:7"},"nodeType":"YulFunctionCall","src":"10015:57:7"},"nodeType":"YulExpressionStatement","src":"10015:57:7"},{"nodeType":"YulVariableDeclaration","src":"10081:14:7","value":{"kind":"number","nodeType":"YulLiteral","src":"10091:4:7","type":"","value":"0x20"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"10085:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10115:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"10126:4:7","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10111:3:7"},"nodeType":"YulFunctionCall","src":"10111:20:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10143:6:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10151:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10139:3:7"},"nodeType":"YulFunctionCall","src":"10139:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10133:5:7"},"nodeType":"YulFunctionCall","src":"10133:22:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10104:6:7"},"nodeType":"YulFunctionCall","src":"10104:52:7"},"nodeType":"YulExpressionStatement","src":"10104:52:7"},{"nodeType":"YulVariableDeclaration","src":"10165:42:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"10195:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"10203:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10191:3:7"},"nodeType":"YulFunctionCall","src":"10191:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10185:5:7"},"nodeType":"YulFunctionCall","src":"10185:22:7"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"10169:12:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10227:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"10238:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10223:3:7"},"nodeType":"YulFunctionCall","src":"10223:19:7"},{"kind":"number","nodeType":"YulLiteral","src":"10244:4:7","type":"","value":"0x60"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10216:6:7"},"nodeType":"YulFunctionCall","src":"10216:33:7"},"nodeType":"YulExpressionStatement","src":"10216:33:7"},{"nodeType":"YulVariableDeclaration","src":"10258:63:7","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"10287:12:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10305:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"10316:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10301:3:7"},"nodeType":"YulFunctionCall","src":"10301:19:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"10269:17:7"},"nodeType":"YulFunctionCall","src":"10269:52:7"},"variables":[{"name":"end","nodeType":"YulTypedName","src":"10262:3:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"10341:9:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10352:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10337:3:7"},"nodeType":"YulFunctionCall","src":"10337:18:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10361:3:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"10366:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10357:3:7"},"nodeType":"YulFunctionCall","src":"10357:19:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10330:6:7"},"nodeType":"YulFunctionCall","src":"10330:47:7"},"nodeType":"YulExpressionStatement","src":"10330:47:7"},{"nodeType":"YulVariableDeclaration","src":"10386:16:7","value":{"kind":"number","nodeType":"YulLiteral","src":"10396:6:7","type":"","value":"0x0160"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"10390:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10411:35:7","value":{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10439:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10433:5:7"},"nodeType":"YulFunctionCall","src":"10433:13:7"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"10415:14:7","type":""}]},{"expression":{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10462:3:7"},{"name":"_3","nodeType":"YulIdentifier","src":"10467:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10455:6:7"},"nodeType":"YulFunctionCall","src":"10455:15:7"},"nodeType":"YulExpressionStatement","src":"10455:15:7"},{"nodeType":"YulVariableDeclaration","src":"10479:61:7","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"10511:14:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10531:3:7"},{"name":"_3","nodeType":"YulIdentifier","src":"10536:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10527:3:7"},"nodeType":"YulFunctionCall","src":"10527:12:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"10493:17:7"},"nodeType":"YulFunctionCall","src":"10493:47:7"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"10483:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10549:44:7","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"10581:6:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10589:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10577:3:7"},"nodeType":"YulFunctionCall","src":"10577:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10571:5:7"},"nodeType":"YulFunctionCall","src":"10571:22:7"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"10553:14:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"10613:3:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10618:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10609:3:7"},"nodeType":"YulFunctionCall","src":"10609:12:7"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10627:6:7"},{"name":"end","nodeType":"YulIdentifier","src":"10635:3:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"10623:3:7"},"nodeType":"YulFunctionCall","src":"10623:16:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10602:6:7"},"nodeType":"YulFunctionCall","src":"10602:38:7"},"nodeType":"YulExpressionStatement","src":"10602:38:7"},{"expression":{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10656:6:7"},{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10670:14:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10664:5:7"},"nodeType":"YulFunctionCall","src":"10664:21:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10649:6:7"},"nodeType":"YulFunctionCall","src":"10649:37:7"},"nodeType":"YulExpressionStatement","src":"10649:37:7"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10706:6:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10714:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10702:3:7"},"nodeType":"YulFunctionCall","src":"10702:15:7"},{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10729:14:7"},{"name":"_2","nodeType":"YulIdentifier","src":"10745:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10725:3:7"},"nodeType":"YulFunctionCall","src":"10725:23:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10719:5:7"},"nodeType":"YulFunctionCall","src":"10719:30:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10695:6:7"},"nodeType":"YulFunctionCall","src":"10695:55:7"},"nodeType":"YulExpressionStatement","src":"10695:55:7"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10770:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"10778:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10766:3:7"},"nodeType":"YulFunctionCall","src":"10766:15:7"},{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10807:14:7"},{"name":"_1","nodeType":"YulIdentifier","src":"10823:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10803:3:7"},"nodeType":"YulFunctionCall","src":"10803:23:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10797:5:7"},"nodeType":"YulFunctionCall","src":"10797:30:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10790:6:7"},"nodeType":"YulFunctionCall","src":"10790:38:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"10783:6:7"},"nodeType":"YulFunctionCall","src":"10783:46:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10759:6:7"},"nodeType":"YulFunctionCall","src":"10759:71:7"},"nodeType":"YulExpressionStatement","src":"10759:71:7"},{"nodeType":"YulVariableDeclaration","src":"10839:54:7","value":{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"10871:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"10887:4:7","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10867:3:7"},"nodeType":"YulFunctionCall","src":"10867:25:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"10861:5:7"},"nodeType":"YulFunctionCall","src":"10861:32:7"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"10843:14:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"10902:24:7","value":{"kind":"number","nodeType":"YulLiteral","src":"10912:14:7","type":"","value":"0xffffffffffff"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"10906:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"10946:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"10954:4:7","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"10942:3:7"},"nodeType":"YulFunctionCall","src":"10942:17:7"},{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"10965:14:7"},{"name":"_4","nodeType":"YulIdentifier","src":"10981:2:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"10961:3:7"},"nodeType":"YulFunctionCall","src":"10961:23:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10935:6:7"},"nodeType":"YulFunctionCall","src":"10935:50:7"},"nodeType":"YulExpressionStatement","src":"10935:50:7"},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"11005:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11013:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11001:3:7"},"nodeType":"YulFunctionCall","src":"11001:16:7"},{"arguments":[{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"11033:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"11049:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11029:3:7"},"nodeType":"YulFunctionCall","src":"11029:24:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11023:5:7"},"nodeType":"YulFunctionCall","src":"11023:31:7"},{"name":"_4","nodeType":"YulIdentifier","src":"11056:2:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"11019:3:7"},"nodeType":"YulFunctionCall","src":"11019:40:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"10994:6:7"},"nodeType":"YulFunctionCall","src":"10994:66:7"},"nodeType":"YulExpressionStatement","src":"10994:66:7"},{"nodeType":"YulVariableDeclaration","src":"11069:53:7","value":{"arguments":[{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"11101:14:7"},{"kind":"number","nodeType":"YulLiteral","src":"11117:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11097:3:7"},"nodeType":"YulFunctionCall","src":"11097:24:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11091:5:7"},"nodeType":"YulFunctionCall","src":"11091:31:7"},"variables":[{"name":"memberValue0_4","nodeType":"YulTypedName","src":"11073:14:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"11142:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11150:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11138:3:7"},"nodeType":"YulFunctionCall","src":"11138:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"11156:4:7","type":"","value":"0xc0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11131:6:7"},"nodeType":"YulFunctionCall","src":"11131:30:7"},"nodeType":"YulExpressionStatement","src":"11131:30:7"},{"nodeType":"YulVariableDeclaration","src":"11170:65:7","value":{"arguments":[{"name":"memberValue0_4","nodeType":"YulIdentifier","src":"11201:14:7"},{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"11221:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11229:4:7","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11217:3:7"},"nodeType":"YulFunctionCall","src":"11217:17:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"11183:17:7"},"nodeType":"YulFunctionCall","src":"11183:52:7"},"variables":[{"name":"end_1","nodeType":"YulTypedName","src":"11174:5:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"11244:44:7","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11276:6:7"},{"name":"_1","nodeType":"YulIdentifier","src":"11284:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11272:3:7"},"nodeType":"YulFunctionCall","src":"11272:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11266:5:7"},"nodeType":"YulFunctionCall","src":"11266:22:7"},"variables":[{"name":"memberValue0_5","nodeType":"YulTypedName","src":"11248:14:7","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_5","nodeType":"YulIdentifier","src":"11325:14:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"11345:3:7"},{"name":"_1","nodeType":"YulIdentifier","src":"11350:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11341:3:7"},"nodeType":"YulFunctionCall","src":"11341:12:7"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"11297:27:7"},"nodeType":"YulFunctionCall","src":"11297:57:7"},"nodeType":"YulExpressionStatement","src":"11297:57:7"},{"nodeType":"YulVariableDeclaration","src":"11363:46:7","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11395:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11403:4:7","type":"","value":"0x60"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11391:3:7"},"nodeType":"YulFunctionCall","src":"11391:17:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11385:5:7"},"nodeType":"YulFunctionCall","src":"11385:24:7"},"variables":[{"name":"memberValue0_6","nodeType":"YulTypedName","src":"11367:14:7","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_6","nodeType":"YulIdentifier","src":"11446:14:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"11466:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"11471:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11462:3:7"},"nodeType":"YulFunctionCall","src":"11462:13:7"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"11418:27:7"},"nodeType":"YulFunctionCall","src":"11418:58:7"},"nodeType":"YulExpressionStatement","src":"11418:58:7"},{"nodeType":"YulVariableDeclaration","src":"11485:45:7","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11517:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11525:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11513:3:7"},"nodeType":"YulFunctionCall","src":"11513:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11507:5:7"},"nodeType":"YulFunctionCall","src":"11507:23:7"},"variables":[{"name":"memberValue0_7","nodeType":"YulTypedName","src":"11489:14:7","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_7","nodeType":"YulIdentifier","src":"11567:14:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"11587:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"11592:4:7","type":"","value":"0xc0"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11583:3:7"},"nodeType":"YulFunctionCall","src":"11583:14:7"}],"functionName":{"name":"abi_encode_struct_StakeInfo","nodeType":"YulIdentifier","src":"11539:27:7"},"nodeType":"YulFunctionCall","src":"11539:59:7"},"nodeType":"YulExpressionStatement","src":"11539:59:7"},{"nodeType":"YulVariableDeclaration","src":"11607:45:7","value":{"arguments":[{"arguments":[{"name":"value1","nodeType":"YulIdentifier","src":"11639:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"11647:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11635:3:7"},"nodeType":"YulFunctionCall","src":"11635:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"11629:5:7"},"nodeType":"YulFunctionCall","src":"11629:23:7"},"variables":[{"name":"memberValue0_8","nodeType":"YulTypedName","src":"11611:14:7","type":""}]},{"expression":{"arguments":[{"name":"memberValue0_8","nodeType":"YulIdentifier","src":"11699:14:7"},{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"11719:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"11724:6:7","type":"","value":"0x0100"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"11715:3:7"},"nodeType":"YulFunctionCall","src":"11715:16:7"}],"functionName":{"name":"abi_encode_struct_AggregatorStakeInfo","nodeType":"YulIdentifier","src":"11661:37:7"},"nodeType":"YulFunctionCall","src":"11661:71:7"},"nodeType":"YulExpressionStatement","src":"11661:71:7"},{"nodeType":"YulAssignment","src":"11741:13:7","value":{"name":"end_1","nodeType":"YulIdentifier","src":"11749:5:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"11741:4:7"}]}]},"name":"abi_encode_tuple_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__to_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"9915:9:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"9926:6:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"9934:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"9945:4:7","type":""}],"src":"9717:2043:7"},{"body":{"nodeType":"YulBlock","src":"11797:152:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11814:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11817:77:7","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11807:6:7"},"nodeType":"YulFunctionCall","src":"11807:88:7"},"nodeType":"YulExpressionStatement","src":"11807:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11911:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"11914:4:7","type":"","value":"0x32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"11904:6:7"},"nodeType":"YulFunctionCall","src":"11904:15:7"},"nodeType":"YulExpressionStatement","src":"11904:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"11935:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"11938:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"11928:6:7"},"nodeType":"YulFunctionCall","src":"11928:15:7"},"nodeType":"YulExpressionStatement","src":"11928:15:7"}]},"name":"panic_error_0x32","nodeType":"YulFunctionDefinition","src":"11765:184:7"},{"body":{"nodeType":"YulBlock","src":"12117:1393:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12134:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12145:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12127:6:7"},"nodeType":"YulFunctionCall","src":"12127:21:7"},"nodeType":"YulExpressionStatement","src":"12127:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12182:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12176:5:7"},"nodeType":"YulFunctionCall","src":"12176:13:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12195:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12206:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12191:3:7"},"nodeType":"YulFunctionCall","src":"12191:18:7"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"12157:18:7"},"nodeType":"YulFunctionCall","src":"12157:53:7"},"nodeType":"YulExpressionStatement","src":"12157:53:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12230:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12241:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12226:3:7"},"nodeType":"YulFunctionCall","src":"12226:18:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12256:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12264:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12252:3:7"},"nodeType":"YulFunctionCall","src":"12252:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12246:5:7"},"nodeType":"YulFunctionCall","src":"12246:22:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12219:6:7"},"nodeType":"YulFunctionCall","src":"12219:50:7"},"nodeType":"YulExpressionStatement","src":"12219:50:7"},{"nodeType":"YulVariableDeclaration","src":"12278:42:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12308:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12316:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12304:3:7"},"nodeType":"YulFunctionCall","src":"12304:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12298:5:7"},"nodeType":"YulFunctionCall","src":"12298:22:7"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"12282:12:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12329:16:7","value":{"kind":"number","nodeType":"YulLiteral","src":"12339:6:7","type":"","value":"0x0160"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"12333:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12365:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12376:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12361:3:7"},"nodeType":"YulFunctionCall","src":"12361:18:7"},{"name":"_1","nodeType":"YulIdentifier","src":"12381:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12354:6:7"},"nodeType":"YulFunctionCall","src":"12354:30:7"},"nodeType":"YulExpressionStatement","src":"12354:30:7"},{"nodeType":"YulVariableDeclaration","src":"12393:66:7","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"12425:12:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12443:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12454:3:7","type":"","value":"384"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12439:3:7"},"nodeType":"YulFunctionCall","src":"12439:19:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"12407:17:7"},"nodeType":"YulFunctionCall","src":"12407:52:7"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"12397:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12468:44:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12500:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12508:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12496:3:7"},"nodeType":"YulFunctionCall","src":"12496:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12490:5:7"},"nodeType":"YulFunctionCall","src":"12490:22:7"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"12472:14:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12521:76:7","value":{"kind":"number","nodeType":"YulLiteral","src":"12531:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"12525:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12617:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12628:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12613:3:7"},"nodeType":"YulFunctionCall","src":"12613:19:7"},{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"12642:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"12650:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"12638:3:7"},"nodeType":"YulFunctionCall","src":"12638:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"12662:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12634:3:7"},"nodeType":"YulFunctionCall","src":"12634:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12606:6:7"},"nodeType":"YulFunctionCall","src":"12606:60:7"},"nodeType":"YulExpressionStatement","src":"12606:60:7"},{"nodeType":"YulVariableDeclaration","src":"12675:55:7","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"12707:14:7"},{"name":"tail_1","nodeType":"YulIdentifier","src":"12723:6:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"12689:17:7"},"nodeType":"YulFunctionCall","src":"12689:41:7"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"12679:6:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12750:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12761:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12746:3:7"},"nodeType":"YulFunctionCall","src":"12746:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12777:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12785:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12773:3:7"},"nodeType":"YulFunctionCall","src":"12773:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12767:5:7"},"nodeType":"YulFunctionCall","src":"12767:23:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12739:6:7"},"nodeType":"YulFunctionCall","src":"12739:52:7"},"nodeType":"YulExpressionStatement","src":"12739:52:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12811:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12822:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12807:3:7"},"nodeType":"YulFunctionCall","src":"12807:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12838:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12846:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12834:3:7"},"nodeType":"YulFunctionCall","src":"12834:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12828:5:7"},"nodeType":"YulFunctionCall","src":"12828:23:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12800:6:7"},"nodeType":"YulFunctionCall","src":"12800:52:7"},"nodeType":"YulExpressionStatement","src":"12800:52:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12872:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"12883:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12868:3:7"},"nodeType":"YulFunctionCall","src":"12868:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12899:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12907:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12895:3:7"},"nodeType":"YulFunctionCall","src":"12895:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12889:5:7"},"nodeType":"YulFunctionCall","src":"12889:23:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12861:6:7"},"nodeType":"YulFunctionCall","src":"12861:52:7"},"nodeType":"YulExpressionStatement","src":"12861:52:7"},{"nodeType":"YulVariableDeclaration","src":"12922:33:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"12942:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"12950:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12938:3:7"},"nodeType":"YulFunctionCall","src":"12938:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"12932:5:7"},"nodeType":"YulFunctionCall","src":"12932:23:7"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"12926:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"12964:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"12974:3:7","type":"","value":"256"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"12968:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"12997:9:7"},{"name":"_4","nodeType":"YulIdentifier","src":"13008:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"12993:3:7"},"nodeType":"YulFunctionCall","src":"12993:18:7"},{"name":"_3","nodeType":"YulIdentifier","src":"13013:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"12986:6:7"},"nodeType":"YulFunctionCall","src":"12986:30:7"},"nodeType":"YulExpressionStatement","src":"12986:30:7"},{"nodeType":"YulVariableDeclaration","src":"13025:32:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13045:6:7"},{"name":"_4","nodeType":"YulIdentifier","src":"13053:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13041:3:7"},"nodeType":"YulFunctionCall","src":"13041:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13035:5:7"},"nodeType":"YulFunctionCall","src":"13035:22:7"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"13029:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13066:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"13076:3:7","type":"","value":"288"},"variables":[{"name":"_6","nodeType":"YulTypedName","src":"13070:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13099:9:7"},{"name":"_6","nodeType":"YulIdentifier","src":"13110:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13095:3:7"},"nodeType":"YulFunctionCall","src":"13095:18:7"},{"name":"_5","nodeType":"YulIdentifier","src":"13115:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13088:6:7"},"nodeType":"YulFunctionCall","src":"13088:30:7"},"nodeType":"YulExpressionStatement","src":"13088:30:7"},{"nodeType":"YulVariableDeclaration","src":"13127:44:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13159:6:7"},{"name":"_6","nodeType":"YulIdentifier","src":"13167:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13155:3:7"},"nodeType":"YulFunctionCall","src":"13155:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13149:5:7"},"nodeType":"YulFunctionCall","src":"13149:22:7"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"13131:14:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13180:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"13190:3:7","type":"","value":"320"},"variables":[{"name":"_7","nodeType":"YulTypedName","src":"13184:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13213:9:7"},{"name":"_7","nodeType":"YulIdentifier","src":"13224:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13209:3:7"},"nodeType":"YulFunctionCall","src":"13209:18:7"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"13237:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"13245:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13233:3:7"},"nodeType":"YulFunctionCall","src":"13233:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"13257:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13229:3:7"},"nodeType":"YulFunctionCall","src":"13229:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13202:6:7"},"nodeType":"YulFunctionCall","src":"13202:59:7"},"nodeType":"YulExpressionStatement","src":"13202:59:7"},{"nodeType":"YulVariableDeclaration","src":"13270:55:7","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"13302:14:7"},{"name":"tail_2","nodeType":"YulIdentifier","src":"13318:6:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"13284:17:7"},"nodeType":"YulFunctionCall","src":"13284:41:7"},"variables":[{"name":"tail_3","nodeType":"YulTypedName","src":"13274:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"13334:44:7","value":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"13366:6:7"},{"name":"_7","nodeType":"YulIdentifier","src":"13374:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13362:3:7"},"nodeType":"YulFunctionCall","src":"13362:15:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13356:5:7"},"nodeType":"YulFunctionCall","src":"13356:22:7"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"13338:14:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13398:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"13409:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13394:3:7"},"nodeType":"YulFunctionCall","src":"13394:18:7"},{"arguments":[{"arguments":[{"name":"tail_3","nodeType":"YulIdentifier","src":"13422:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"13430:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13418:3:7"},"nodeType":"YulFunctionCall","src":"13418:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"13442:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"13414:3:7"},"nodeType":"YulFunctionCall","src":"13414:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13387:6:7"},"nodeType":"YulFunctionCall","src":"13387:59:7"},"nodeType":"YulExpressionStatement","src":"13387:59:7"},{"nodeType":"YulAssignment","src":"13455:49:7","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"13481:14:7"},{"name":"tail_3","nodeType":"YulIdentifier","src":"13497:6:7"}],"functionName":{"name":"abi_encode_string","nodeType":"YulIdentifier","src":"13463:17:7"},"nodeType":"YulFunctionCall","src":"13463:41:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"13455:4:7"}]}]},"name":"abi_encode_tuple_t_struct$_UserOperation_$1149_memory_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"12086:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"12097:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"12108:4:7","type":""}],"src":"11954:1556:7"},{"body":{"nodeType":"YulBlock","src":"13596:103:7","statements":[{"body":{"nodeType":"YulBlock","src":"13642:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13651:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13654:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13644:6:7"},"nodeType":"YulFunctionCall","src":"13644:12:7"},"nodeType":"YulExpressionStatement","src":"13644:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"13617:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"13626:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"13613:3:7"},"nodeType":"YulFunctionCall","src":"13613:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"13638:2:7","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"13609:3:7"},"nodeType":"YulFunctionCall","src":"13609:32:7"},"nodeType":"YulIf","src":"13606:52:7"},{"nodeType":"YulAssignment","src":"13667:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"13683:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"13677:5:7"},"nodeType":"YulFunctionCall","src":"13677:16:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"13667:6:7"}]}]},"name":"abi_decode_tuple_t_bytes32_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"13562:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"13573:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"13585:6:7","type":""}],"src":"13515:184:7"},{"body":{"nodeType":"YulBlock","src":"13736:152:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13753:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13756:77:7","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13746:6:7"},"nodeType":"YulFunctionCall","src":"13746:88:7"},"nodeType":"YulExpressionStatement","src":"13746:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13850:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"13853:4:7","type":"","value":"0x11"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"13843:6:7"},"nodeType":"YulFunctionCall","src":"13843:15:7"},"nodeType":"YulExpressionStatement","src":"13843:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"13874:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"13877:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"13867:6:7"},"nodeType":"YulFunctionCall","src":"13867:15:7"},"nodeType":"YulExpressionStatement","src":"13867:15:7"}]},"name":"panic_error_0x11","nodeType":"YulFunctionDefinition","src":"13704:184:7"},{"body":{"nodeType":"YulBlock","src":"13940:148:7","statements":[{"body":{"nodeType":"YulBlock","src":"14031:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"14033:16:7"},"nodeType":"YulFunctionCall","src":"14033:18:7"},"nodeType":"YulExpressionStatement","src":"14033:18:7"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"13956:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"13963:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"13953:2:7"},"nodeType":"YulFunctionCall","src":"13953:77:7"},"nodeType":"YulIf","src":"13950:103:7"},{"nodeType":"YulAssignment","src":"14062:20:7","value":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"14073:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"14080:1:7","type":"","value":"1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14069:3:7"},"nodeType":"YulFunctionCall","src":"14069:13:7"},"variableNames":[{"name":"ret","nodeType":"YulIdentifier","src":"14062:3:7"}]}]},"name":"increment_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"value","nodeType":"YulTypedName","src":"13922:5:7","type":""}],"returnVariables":[{"name":"ret","nodeType":"YulTypedName","src":"13932:3:7","type":""}],"src":"13893:195:7"},{"body":{"nodeType":"YulBlock","src":"14159:259:7","statements":[{"expression":{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14176:3:7"},{"name":"length","nodeType":"YulIdentifier","src":"14181:6:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14169:6:7"},"nodeType":"YulFunctionCall","src":"14169:19:7"},"nodeType":"YulExpressionStatement","src":"14169:19:7"},{"expression":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14214:3:7"},{"kind":"number","nodeType":"YulLiteral","src":"14219:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14210:3:7"},"nodeType":"YulFunctionCall","src":"14210:14:7"},{"name":"start","nodeType":"YulIdentifier","src":"14226:5:7"},{"name":"length","nodeType":"YulIdentifier","src":"14233:6:7"}],"functionName":{"name":"calldatacopy","nodeType":"YulIdentifier","src":"14197:12:7"},"nodeType":"YulFunctionCall","src":"14197:43:7"},"nodeType":"YulExpressionStatement","src":"14197:43:7"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14264:3:7"},{"name":"length","nodeType":"YulIdentifier","src":"14269:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14260:3:7"},"nodeType":"YulFunctionCall","src":"14260:16:7"},{"kind":"number","nodeType":"YulLiteral","src":"14278:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14256:3:7"},"nodeType":"YulFunctionCall","src":"14256:27:7"},{"kind":"number","nodeType":"YulLiteral","src":"14285:1:7","type":"","value":"0"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14249:6:7"},"nodeType":"YulFunctionCall","src":"14249:38:7"},"nodeType":"YulExpressionStatement","src":"14249:38:7"},{"nodeType":"YulAssignment","src":"14296:116:7","value":{"arguments":[{"arguments":[{"name":"pos","nodeType":"YulIdentifier","src":"14311:3:7"},{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"14324:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"14332:2:7","type":"","value":"31"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14320:3:7"},"nodeType":"YulFunctionCall","src":"14320:15:7"},{"kind":"number","nodeType":"YulLiteral","src":"14337:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14316:3:7"},"nodeType":"YulFunctionCall","src":"14316:88:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14307:3:7"},"nodeType":"YulFunctionCall","src":"14307:98:7"},{"kind":"number","nodeType":"YulLiteral","src":"14407:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14303:3:7"},"nodeType":"YulFunctionCall","src":"14303:109:7"},"variableNames":[{"name":"end","nodeType":"YulIdentifier","src":"14296:3:7"}]}]},"name":"abi_encode_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"start","nodeType":"YulTypedName","src":"14128:5:7","type":""},{"name":"length","nodeType":"YulTypedName","src":"14135:6:7","type":""},{"name":"pos","nodeType":"YulTypedName","src":"14143:3:7","type":""}],"returnVariables":[{"name":"end","nodeType":"YulTypedName","src":"14151:3:7","type":""}],"src":"14093:325:7"},{"body":{"nodeType":"YulBlock","src":"14552:115:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14569:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"14580:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"14562:6:7"},"nodeType":"YulFunctionCall","src":"14562:21:7"},"nodeType":"YulExpressionStatement","src":"14562:21:7"},{"nodeType":"YulAssignment","src":"14592:69:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"14626:6:7"},{"name":"value1","nodeType":"YulIdentifier","src":"14634:6:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"14646:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"14657:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14642:3:7"},"nodeType":"YulFunctionCall","src":"14642:18:7"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"14600:25:7"},"nodeType":"YulFunctionCall","src":"14600:61:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"14592:4:7"}]}]},"name":"abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"14513:9:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"14524:6:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"14532:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"14543:4:7","type":""}],"src":"14423:244:7"},{"body":{"nodeType":"YulBlock","src":"14765:314:7","statements":[{"nodeType":"YulVariableDeclaration","src":"14775:26:7","value":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"14795:5:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14789:5:7"},"nodeType":"YulFunctionCall","src":"14789:12:7"},"variables":[{"name":"length","nodeType":"YulTypedName","src":"14779:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14810:33:7","value":{"arguments":[{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"14830:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"14837:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"14826:3:7"},"nodeType":"YulFunctionCall","src":"14826:16:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"14820:5:7"},"nodeType":"YulFunctionCall","src":"14820:23:7"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"14814:2:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"14852:76:7","value":{"kind":"number","nodeType":"YulLiteral","src":"14862:66:7","type":"","value":"0xffffffff00000000000000000000000000000000000000000000000000000000"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"14856:2:7","type":""}]},{"nodeType":"YulAssignment","src":"14937:20:7","value":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"14950:2:7"},{"name":"_2","nodeType":"YulIdentifier","src":"14954:2:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"14946:3:7"},"nodeType":"YulFunctionCall","src":"14946:11:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"14937:5:7"}]},{"body":{"nodeType":"YulBlock","src":"14991:82:7","statements":[{"nodeType":"YulAssignment","src":"15005:58:7","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"15022:2:7"},{"arguments":[{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15034:1:7","type":"","value":"3"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15041:1:7","type":"","value":"4"},{"name":"length","nodeType":"YulIdentifier","src":"15044:6:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15037:3:7"},"nodeType":"YulFunctionCall","src":"15037:14:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"15030:3:7"},"nodeType":"YulFunctionCall","src":"15030:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"15054:2:7"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"15026:3:7"},"nodeType":"YulFunctionCall","src":"15026:31:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15018:3:7"},"nodeType":"YulFunctionCall","src":"15018:40:7"},{"name":"_2","nodeType":"YulIdentifier","src":"15060:2:7"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"15014:3:7"},"nodeType":"YulFunctionCall","src":"15014:49:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"15005:5:7"}]}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"14972:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"14980:1:7","type":"","value":"4"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"14969:2:7"},"nodeType":"YulFunctionCall","src":"14969:13:7"},"nodeType":"YulIf","src":"14966:107:7"}]},"name":"convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4","nodeType":"YulFunctionDefinition","parameters":[{"name":"array","nodeType":"YulTypedName","src":"14745:5:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"14755:5:7","type":""}],"src":"14672:407:7"},{"body":{"nodeType":"YulBlock","src":"15133:76:7","statements":[{"body":{"nodeType":"YulBlock","src":"15155:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"15157:16:7"},"nodeType":"YulFunctionCall","src":"15157:18:7"},"nodeType":"YulExpressionStatement","src":"15157:18:7"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"15149:1:7"},{"name":"y","nodeType":"YulIdentifier","src":"15152:1:7"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"15146:2:7"},"nodeType":"YulFunctionCall","src":"15146:8:7"},"nodeType":"YulIf","src":"15143:34:7"},{"nodeType":"YulAssignment","src":"15186:17:7","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"15198:1:7"},{"name":"y","nodeType":"YulIdentifier","src":"15201:1:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15194:3:7"},"nodeType":"YulFunctionCall","src":"15194:9:7"},"variableNames":[{"name":"diff","nodeType":"YulIdentifier","src":"15186:4:7"}]}]},"name":"checked_sub_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"15115:1:7","type":""},{"name":"y","nodeType":"YulTypedName","src":"15118:1:7","type":""}],"returnVariables":[{"name":"diff","nodeType":"YulTypedName","src":"15124:4:7","type":""}],"src":"15084:125:7"},{"body":{"nodeType":"YulBlock","src":"15303:183:7","statements":[{"body":{"nodeType":"YulBlock","src":"15349:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"15358:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"15361:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"15351:6:7"},"nodeType":"YulFunctionCall","src":"15351:12:7"},"nodeType":"YulExpressionStatement","src":"15351:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"15324:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"15333:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"15320:3:7"},"nodeType":"YulFunctionCall","src":"15320:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"15345:2:7","type":"","value":"32"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15316:3:7"},"nodeType":"YulFunctionCall","src":"15316:32:7"},"nodeType":"YulIf","src":"15313:52:7"},{"nodeType":"YulVariableDeclaration","src":"15374:29:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15393:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"15387:5:7"},"nodeType":"YulFunctionCall","src":"15387:16:7"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"15378:5:7","type":""}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"15450:5:7"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"15412:37:7"},"nodeType":"YulFunctionCall","src":"15412:44:7"},"nodeType":"YulExpressionStatement","src":"15412:44:7"},{"nodeType":"YulAssignment","src":"15465:15:7","value":{"name":"value","nodeType":"YulIdentifier","src":"15475:5:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"15465:6:7"}]}]},"name":"abi_decode_tuple_t_address_payable_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15269:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"15280:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"15292:6:7","type":""}],"src":"15214:272:7"},{"body":{"nodeType":"YulBlock","src":"15665:166:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15682:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"15693:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15675:6:7"},"nodeType":"YulFunctionCall","src":"15675:21:7"},"nodeType":"YulExpressionStatement","src":"15675:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15716:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"15727:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15712:3:7"},"nodeType":"YulFunctionCall","src":"15712:18:7"},{"kind":"number","nodeType":"YulLiteral","src":"15732:2:7","type":"","value":"16"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15705:6:7"},"nodeType":"YulFunctionCall","src":"15705:30:7"},"nodeType":"YulExpressionStatement","src":"15705:30:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15755:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"15766:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15751:3:7"},"nodeType":"YulFunctionCall","src":"15751:18:7"},{"hexValue":"496e76616c696420696e6974436f6465","kind":"string","nodeType":"YulLiteral","src":"15771:18:7","type":"","value":"Invalid initCode"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"15744:6:7"},"nodeType":"YulFunctionCall","src":"15744:46:7"},"nodeType":"YulExpressionStatement","src":"15744:46:7"},{"nodeType":"YulAssignment","src":"15799:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"15811:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"15822:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"15807:3:7"},"nodeType":"YulFunctionCall","src":"15807:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"15799:4:7"}]}]},"name":"abi_encode_tuple_t_stringliteral_41358789453c2b61b04d9046ed6bd1617530e1f3f5c8b4843a7b086398036cc8__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"15642:9:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"15656:4:7","type":""}],"src":"15491:340:7"},{"body":{"nodeType":"YulBlock","src":"15912:483:7","statements":[{"nodeType":"YulVariableDeclaration","src":"15922:43:7","value":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"15961:3:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"15948:12:7"},"nodeType":"YulFunctionCall","src":"15948:17:7"},"variables":[{"name":"rel_offset_of_tail","nodeType":"YulTypedName","src":"15926:18:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"16113:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16122:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16125:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16115:6:7"},"nodeType":"YulFunctionCall","src":"16115:12:7"},"nodeType":"YulExpressionStatement","src":"16115:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"15988:18:7"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16016:12:7"},"nodeType":"YulFunctionCall","src":"16016:14:7"},{"name":"base_ref","nodeType":"YulIdentifier","src":"16032:8:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16012:3:7"},"nodeType":"YulFunctionCall","src":"16012:29:7"},{"kind":"number","nodeType":"YulLiteral","src":"16043:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16008:3:7"},"nodeType":"YulFunctionCall","src":"16008:102:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"15984:3:7"},"nodeType":"YulFunctionCall","src":"15984:127:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"15977:6:7"},"nodeType":"YulFunctionCall","src":"15977:135:7"},"nodeType":"YulIf","src":"15974:155:7"},{"nodeType":"YulVariableDeclaration","src":"16138:48:7","value":{"arguments":[{"name":"rel_offset_of_tail","nodeType":"YulIdentifier","src":"16157:18:7"},{"name":"base_ref","nodeType":"YulIdentifier","src":"16177:8:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16153:3:7"},"nodeType":"YulFunctionCall","src":"16153:33:7"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"16142:7:7","type":""}]},{"nodeType":"YulAssignment","src":"16195:31:7","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"16218:7:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16205:12:7"},"nodeType":"YulFunctionCall","src":"16205:21:7"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"16195:6:7"}]},{"nodeType":"YulAssignment","src":"16235:27:7","value":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"16248:7:7"},{"kind":"number","nodeType":"YulLiteral","src":"16257:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16244:3:7"},"nodeType":"YulFunctionCall","src":"16244:18:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"16235:5:7"}]},{"body":{"nodeType":"YulBlock","src":"16305:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16314:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16317:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16307:6:7"},"nodeType":"YulFunctionCall","src":"16307:12:7"},"nodeType":"YulExpressionStatement","src":"16307:12:7"}]},"condition":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"16277:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"16285:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"16274:2:7"},"nodeType":"YulFunctionCall","src":"16274:30:7"},"nodeType":"YulIf","src":"16271:50:7"},{"body":{"nodeType":"YulBlock","src":"16373:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"16382:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"16385:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"16375:6:7"},"nodeType":"YulFunctionCall","src":"16375:12:7"},"nodeType":"YulExpressionStatement","src":"16375:12:7"}]},"condition":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"16337:5:7"},{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"16348:12:7"},"nodeType":"YulFunctionCall","src":"16348:14:7"},{"name":"length","nodeType":"YulIdentifier","src":"16364:6:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"16344:3:7"},"nodeType":"YulFunctionCall","src":"16344:27:7"}],"functionName":{"name":"sgt","nodeType":"YulIdentifier","src":"16333:3:7"},"nodeType":"YulFunctionCall","src":"16333:39:7"},"nodeType":"YulIf","src":"16330:59:7"}]},"name":"calldata_access_bytes_calldata","nodeType":"YulFunctionDefinition","parameters":[{"name":"base_ref","nodeType":"YulTypedName","src":"15876:8:7","type":""},{"name":"ptr","nodeType":"YulTypedName","src":"15886:3:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"15894:5:7","type":""},{"name":"length","nodeType":"YulTypedName","src":"15901:6:7","type":""}],"src":"15836:559:7"},{"body":{"nodeType":"YulBlock","src":"16565:1694:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16582:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"16593:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16575:6:7"},"nodeType":"YulFunctionCall","src":"16575:21:7"},"nodeType":"YulExpressionStatement","src":"16575:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16643:6:7"}],"functionName":{"name":"abi_decode_address","nodeType":"YulIdentifier","src":"16624:18:7"},"nodeType":"YulFunctionCall","src":"16624:26:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16656:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"16667:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16652:3:7"},"nodeType":"YulFunctionCall","src":"16652:18:7"}],"functionName":{"name":"abi_encode_address","nodeType":"YulIdentifier","src":"16605:18:7"},"nodeType":"YulFunctionCall","src":"16605:66:7"},"nodeType":"YulExpressionStatement","src":"16605:66:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16691:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"16702:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16687:3:7"},"nodeType":"YulFunctionCall","src":"16687:18:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16724:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"16732:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16720:3:7"},"nodeType":"YulFunctionCall","src":"16720:15:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"16707:12:7"},"nodeType":"YulFunctionCall","src":"16707:29:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16680:6:7"},"nodeType":"YulFunctionCall","src":"16680:57:7"},"nodeType":"YulExpressionStatement","src":"16680:57:7"},{"nodeType":"YulVariableDeclaration","src":"16746:89:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16811:6:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"16823:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"16831:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16819:3:7"},"nodeType":"YulFunctionCall","src":"16819:15:7"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"16780:30:7"},"nodeType":"YulFunctionCall","src":"16780:55:7"},"variables":[{"name":"memberValue0","nodeType":"YulTypedName","src":"16750:12:7","type":""},{"name":"memberValue1","nodeType":"YulTypedName","src":"16764:12:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"16844:16:7","value":{"kind":"number","nodeType":"YulLiteral","src":"16854:6:7","type":"","value":"0x0160"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"16848:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16880:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"16891:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16876:3:7"},"nodeType":"YulFunctionCall","src":"16876:18:7"},{"name":"_1","nodeType":"YulIdentifier","src":"16896:2:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"16869:6:7"},"nodeType":"YulFunctionCall","src":"16869:30:7"},"nodeType":"YulExpressionStatement","src":"16869:30:7"},{"nodeType":"YulVariableDeclaration","src":"16908:88:7","value":{"arguments":[{"name":"memberValue0","nodeType":"YulIdentifier","src":"16948:12:7"},{"name":"memberValue1","nodeType":"YulIdentifier","src":"16962:12:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"16980:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"16991:3:7","type":"","value":"384"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"16976:3:7"},"nodeType":"YulFunctionCall","src":"16976:19:7"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"16922:25:7"},"nodeType":"YulFunctionCall","src":"16922:74:7"},"variables":[{"name":"tail_1","nodeType":"YulTypedName","src":"16912:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17005:93:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17074:6:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17086:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"17094:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17082:3:7"},"nodeType":"YulFunctionCall","src":"17082:15:7"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"17043:30:7"},"nodeType":"YulFunctionCall","src":"17043:55:7"},"variables":[{"name":"memberValue0_1","nodeType":"YulTypedName","src":"17009:14:7","type":""},{"name":"memberValue1_1","nodeType":"YulTypedName","src":"17025:14:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17107:76:7","value":{"kind":"number","nodeType":"YulLiteral","src":"17117:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},"variables":[{"name":"_2","nodeType":"YulTypedName","src":"17111:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17203:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"17214:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17199:3:7"},"nodeType":"YulFunctionCall","src":"17199:19:7"},{"arguments":[{"arguments":[{"name":"tail_1","nodeType":"YulIdentifier","src":"17228:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"17236:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17224:3:7"},"nodeType":"YulFunctionCall","src":"17224:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"17248:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17220:3:7"},"nodeType":"YulFunctionCall","src":"17220:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17192:6:7"},"nodeType":"YulFunctionCall","src":"17192:60:7"},"nodeType":"YulExpressionStatement","src":"17192:60:7"},{"nodeType":"YulVariableDeclaration","src":"17261:79:7","value":{"arguments":[{"name":"memberValue0_1","nodeType":"YulIdentifier","src":"17301:14:7"},{"name":"memberValue1_1","nodeType":"YulIdentifier","src":"17317:14:7"},{"name":"tail_1","nodeType":"YulIdentifier","src":"17333:6:7"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"17275:25:7"},"nodeType":"YulFunctionCall","src":"17275:65:7"},"variables":[{"name":"tail_2","nodeType":"YulTypedName","src":"17265:6:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17360:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"17371:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17356:3:7"},"nodeType":"YulFunctionCall","src":"17356:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17394:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"17402:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17390:3:7"},"nodeType":"YulFunctionCall","src":"17390:16:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17377:12:7"},"nodeType":"YulFunctionCall","src":"17377:30:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17349:6:7"},"nodeType":"YulFunctionCall","src":"17349:59:7"},"nodeType":"YulExpressionStatement","src":"17349:59:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17428:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"17439:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17424:3:7"},"nodeType":"YulFunctionCall","src":"17424:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17462:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"17470:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17458:3:7"},"nodeType":"YulFunctionCall","src":"17458:16:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17445:12:7"},"nodeType":"YulFunctionCall","src":"17445:30:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17417:6:7"},"nodeType":"YulFunctionCall","src":"17417:59:7"},"nodeType":"YulExpressionStatement","src":"17417:59:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17496:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"17507:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17492:3:7"},"nodeType":"YulFunctionCall","src":"17492:19:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17530:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"17538:3:7","type":"","value":"192"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17526:3:7"},"nodeType":"YulFunctionCall","src":"17526:16:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17513:12:7"},"nodeType":"YulFunctionCall","src":"17513:30:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17485:6:7"},"nodeType":"YulFunctionCall","src":"17485:59:7"},"nodeType":"YulExpressionStatement","src":"17485:59:7"},{"nodeType":"YulVariableDeclaration","src":"17553:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"17563:3:7","type":"","value":"256"},"variables":[{"name":"_3","nodeType":"YulTypedName","src":"17557:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17586:9:7"},{"name":"_3","nodeType":"YulIdentifier","src":"17597:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17582:3:7"},"nodeType":"YulFunctionCall","src":"17582:18:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17619:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"17627:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17615:3:7"},"nodeType":"YulFunctionCall","src":"17615:16:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17602:12:7"},"nodeType":"YulFunctionCall","src":"17602:30:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17575:6:7"},"nodeType":"YulFunctionCall","src":"17575:58:7"},"nodeType":"YulExpressionStatement","src":"17575:58:7"},{"nodeType":"YulVariableDeclaration","src":"17642:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"17652:3:7","type":"","value":"288"},"variables":[{"name":"_4","nodeType":"YulTypedName","src":"17646:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17675:9:7"},{"name":"_4","nodeType":"YulIdentifier","src":"17686:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17671:3:7"},"nodeType":"YulFunctionCall","src":"17671:18:7"},{"arguments":[{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17708:6:7"},{"name":"_3","nodeType":"YulIdentifier","src":"17716:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17704:3:7"},"nodeType":"YulFunctionCall","src":"17704:15:7"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"17691:12:7"},"nodeType":"YulFunctionCall","src":"17691:29:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17664:6:7"},"nodeType":"YulFunctionCall","src":"17664:57:7"},"nodeType":"YulExpressionStatement","src":"17664:57:7"},{"nodeType":"YulVariableDeclaration","src":"17730:93:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17799:6:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"17811:6:7"},{"name":"_4","nodeType":"YulIdentifier","src":"17819:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17807:3:7"},"nodeType":"YulFunctionCall","src":"17807:15:7"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"17768:30:7"},"nodeType":"YulFunctionCall","src":"17768:55:7"},"variables":[{"name":"memberValue0_2","nodeType":"YulTypedName","src":"17734:14:7","type":""},{"name":"memberValue1_2","nodeType":"YulTypedName","src":"17750:14:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"17832:13:7","value":{"kind":"number","nodeType":"YulLiteral","src":"17842:3:7","type":"","value":"320"},"variables":[{"name":"_5","nodeType":"YulTypedName","src":"17836:2:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"17865:9:7"},{"name":"_5","nodeType":"YulIdentifier","src":"17876:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17861:3:7"},"nodeType":"YulFunctionCall","src":"17861:18:7"},{"arguments":[{"arguments":[{"name":"tail_2","nodeType":"YulIdentifier","src":"17889:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"17897:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"17885:3:7"},"nodeType":"YulFunctionCall","src":"17885:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"17909:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"17881:3:7"},"nodeType":"YulFunctionCall","src":"17881:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"17854:6:7"},"nodeType":"YulFunctionCall","src":"17854:59:7"},"nodeType":"YulExpressionStatement","src":"17854:59:7"},{"nodeType":"YulVariableDeclaration","src":"17922:79:7","value":{"arguments":[{"name":"memberValue0_2","nodeType":"YulIdentifier","src":"17962:14:7"},{"name":"memberValue1_2","nodeType":"YulIdentifier","src":"17978:14:7"},{"name":"tail_2","nodeType":"YulIdentifier","src":"17994:6:7"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"17936:25:7"},"nodeType":"YulFunctionCall","src":"17936:65:7"},"variables":[{"name":"tail_3","nodeType":"YulTypedName","src":"17926:6:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"18010:93:7","value":{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"18079:6:7"},{"arguments":[{"name":"value0","nodeType":"YulIdentifier","src":"18091:6:7"},{"name":"_5","nodeType":"YulIdentifier","src":"18099:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18087:3:7"},"nodeType":"YulFunctionCall","src":"18087:15:7"}],"functionName":{"name":"calldata_access_bytes_calldata","nodeType":"YulIdentifier","src":"18048:30:7"},"nodeType":"YulFunctionCall","src":"18048:55:7"},"variables":[{"name":"memberValue0_3","nodeType":"YulTypedName","src":"18014:14:7","type":""},{"name":"memberValue1_3","nodeType":"YulTypedName","src":"18030:14:7","type":""}]},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"18123:9:7"},{"name":"_1","nodeType":"YulIdentifier","src":"18134:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18119:3:7"},"nodeType":"YulFunctionCall","src":"18119:18:7"},{"arguments":[{"arguments":[{"name":"tail_3","nodeType":"YulIdentifier","src":"18147:6:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"18155:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"18143:3:7"},"nodeType":"YulFunctionCall","src":"18143:22:7"},{"name":"_2","nodeType":"YulIdentifier","src":"18167:2:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18139:3:7"},"nodeType":"YulFunctionCall","src":"18139:31:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18112:6:7"},"nodeType":"YulFunctionCall","src":"18112:59:7"},"nodeType":"YulExpressionStatement","src":"18112:59:7"},{"nodeType":"YulAssignment","src":"18180:73:7","value":{"arguments":[{"name":"memberValue0_3","nodeType":"YulIdentifier","src":"18214:14:7"},{"name":"memberValue1_3","nodeType":"YulIdentifier","src":"18230:14:7"},{"name":"tail_3","nodeType":"YulIdentifier","src":"18246:6:7"}],"functionName":{"name":"abi_encode_bytes_calldata","nodeType":"YulIdentifier","src":"18188:25:7"},"nodeType":"YulFunctionCall","src":"18188:65:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"18180:4:7"}]}]},"name":"abi_encode_tuple_t_struct$_UserOperation_$1149_calldata_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"16534:9:7","type":""},{"name":"value0","nodeType":"YulTypedName","src":"16545:6:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"16556:4:7","type":""}],"src":"16400:1859:7"},{"body":{"nodeType":"YulBlock","src":"18323:112:7","statements":[{"nodeType":"YulAssignment","src":"18333:22:7","value":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18348:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18342:5:7"},"nodeType":"YulFunctionCall","src":"18342:13:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"18333:5:7"}]},{"body":{"nodeType":"YulBlock","src":"18413:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18422:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18425:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18415:6:7"},"nodeType":"YulFunctionCall","src":"18415:12:7"},"nodeType":"YulExpressionStatement","src":"18415:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18377:5:7"},{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"18388:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"18395:14:7","type":"","value":"0xffffffffffff"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"18384:3:7"},"nodeType":"YulFunctionCall","src":"18384:26:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"18374:2:7"},"nodeType":"YulFunctionCall","src":"18374:37:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18367:6:7"},"nodeType":"YulFunctionCall","src":"18367:45:7"},"nodeType":"YulIf","src":"18364:65:7"}]},"name":"abi_decode_uint48_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"18302:6:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"18313:5:7","type":""}],"src":"18264:171:7"},{"body":{"nodeType":"YulBlock","src":"18525:222:7","statements":[{"nodeType":"YulAssignment","src":"18535:61:7","value":{"arguments":[{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"18588:6:7"}],"functionName":{"name":"array_allocation_size_bytes","nodeType":"YulIdentifier","src":"18560:27:7"},"nodeType":"YulFunctionCall","src":"18560:35:7"}],"functionName":{"name":"allocate_memory","nodeType":"YulIdentifier","src":"18544:15:7"},"nodeType":"YulFunctionCall","src":"18544:52:7"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"18535:5:7"}]},{"expression":{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"18612:5:7"},{"name":"length","nodeType":"YulIdentifier","src":"18619:6:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"18605:6:7"},"nodeType":"YulFunctionCall","src":"18605:21:7"},"nodeType":"YulExpressionStatement","src":"18605:21:7"},{"body":{"nodeType":"YulBlock","src":"18664:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18673:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18676:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18666:6:7"},"nodeType":"YulFunctionCall","src":"18666:12:7"},"nodeType":"YulExpressionStatement","src":"18666:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"18645:3:7"},{"name":"length","nodeType":"YulIdentifier","src":"18650:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18641:3:7"},"nodeType":"YulFunctionCall","src":"18641:16:7"},{"name":"end","nodeType":"YulIdentifier","src":"18659:3:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"18638:2:7"},"nodeType":"YulFunctionCall","src":"18638:25:7"},"nodeType":"YulIf","src":"18635:45:7"},{"expression":{"arguments":[{"name":"src","nodeType":"YulIdentifier","src":"18711:3:7"},{"arguments":[{"name":"array","nodeType":"YulIdentifier","src":"18720:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"18727:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18716:3:7"},"nodeType":"YulFunctionCall","src":"18716:16:7"},{"name":"length","nodeType":"YulIdentifier","src":"18734:6:7"}],"functionName":{"name":"copy_memory_to_memory","nodeType":"YulIdentifier","src":"18689:21:7"},"nodeType":"YulFunctionCall","src":"18689:52:7"},"nodeType":"YulExpressionStatement","src":"18689:52:7"}]},"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"src","nodeType":"YulTypedName","src":"18494:3:7","type":""},{"name":"length","nodeType":"YulTypedName","src":"18499:6:7","type":""},{"name":"end","nodeType":"YulTypedName","src":"18507:3:7","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"18515:5:7","type":""}],"src":"18440:307:7"},{"body":{"nodeType":"YulBlock","src":"18815:172:7","statements":[{"body":{"nodeType":"YulBlock","src":"18864:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"18873:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"18876:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"18866:6:7"},"nodeType":"YulFunctionCall","src":"18866:12:7"},"nodeType":"YulExpressionStatement","src":"18866:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18843:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"18851:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18839:3:7"},"nodeType":"YulFunctionCall","src":"18839:17:7"},{"name":"end","nodeType":"YulIdentifier","src":"18858:3:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"18835:3:7"},"nodeType":"YulFunctionCall","src":"18835:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"18828:6:7"},"nodeType":"YulFunctionCall","src":"18828:35:7"},"nodeType":"YulIf","src":"18825:55:7"},{"nodeType":"YulAssignment","src":"18889:92:7","value":{"arguments":[{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18947:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"18955:4:7","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"18943:3:7"},"nodeType":"YulFunctionCall","src":"18943:17:7"},{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"18968:6:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"18962:5:7"},"nodeType":"YulFunctionCall","src":"18962:13:7"},{"name":"end","nodeType":"YulIdentifier","src":"18977:3:7"}],"functionName":{"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulIdentifier","src":"18898:44:7"},"nodeType":"YulFunctionCall","src":"18898:83:7"},"variableNames":[{"name":"array","nodeType":"YulIdentifier","src":"18889:5:7"}]}]},"name":"abi_decode_bytes_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"offset","nodeType":"YulTypedName","src":"18789:6:7","type":""},{"name":"end","nodeType":"YulTypedName","src":"18797:3:7","type":""}],"returnVariables":[{"name":"array","nodeType":"YulTypedName","src":"18805:5:7","type":""}],"src":"18752:235:7"},{"body":{"nodeType":"YulBlock","src":"19070:728:7","statements":[{"body":{"nodeType":"YulBlock","src":"19114:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19123:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19126:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19116:6:7"},"nodeType":"YulFunctionCall","src":"19116:12:7"},"nodeType":"YulExpressionStatement","src":"19116:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"19091:3:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"19096:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19087:3:7"},"nodeType":"YulFunctionCall","src":"19087:19:7"},{"kind":"number","nodeType":"YulLiteral","src":"19108:4:7","type":"","value":"0xc0"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"19083:3:7"},"nodeType":"YulFunctionCall","src":"19083:30:7"},"nodeType":"YulIf","src":"19080:50:7"},{"nodeType":"YulAssignment","src":"19139:31:7","value":{"arguments":[],"functionName":{"name":"allocate_memory_3429","nodeType":"YulIdentifier","src":"19148:20:7"},"nodeType":"YulFunctionCall","src":"19148:22:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"19139:5:7"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19186:5:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19199:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19193:5:7"},"nodeType":"YulFunctionCall","src":"19193:16:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19179:6:7"},"nodeType":"YulFunctionCall","src":"19179:31:7"},"nodeType":"YulExpressionStatement","src":"19179:31:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19230:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"19237:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19226:3:7"},"nodeType":"YulFunctionCall","src":"19226:14:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19252:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"19263:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19248:3:7"},"nodeType":"YulFunctionCall","src":"19248:18:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19242:5:7"},"nodeType":"YulFunctionCall","src":"19242:25:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19219:6:7"},"nodeType":"YulFunctionCall","src":"19219:49:7"},"nodeType":"YulExpressionStatement","src":"19219:49:7"},{"nodeType":"YulVariableDeclaration","src":"19277:40:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19302:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"19313:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19298:3:7"},"nodeType":"YulFunctionCall","src":"19298:18:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19292:5:7"},"nodeType":"YulFunctionCall","src":"19292:25:7"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"19281:7:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"19374:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19383:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19386:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19376:6:7"},"nodeType":"YulFunctionCall","src":"19376:12:7"},"nodeType":"YulExpressionStatement","src":"19376:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"19339:7:7"},{"arguments":[{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"19362:7:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19355:6:7"},"nodeType":"YulFunctionCall","src":"19355:15:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19348:6:7"},"nodeType":"YulFunctionCall","src":"19348:23:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"19336:2:7"},"nodeType":"YulFunctionCall","src":"19336:36:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"19329:6:7"},"nodeType":"YulFunctionCall","src":"19329:44:7"},"nodeType":"YulIf","src":"19326:64:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19410:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"19417:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19406:3:7"},"nodeType":"YulFunctionCall","src":"19406:14:7"},{"name":"value_1","nodeType":"YulIdentifier","src":"19422:7:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19399:6:7"},"nodeType":"YulFunctionCall","src":"19399:31:7"},"nodeType":"YulExpressionStatement","src":"19399:31:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19450:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"19457:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19446:3:7"},"nodeType":"YulFunctionCall","src":"19446:14:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19495:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"19506:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19491:3:7"},"nodeType":"YulFunctionCall","src":"19491:18:7"}],"functionName":{"name":"abi_decode_uint48_fromMemory","nodeType":"YulIdentifier","src":"19462:28:7"},"nodeType":"YulFunctionCall","src":"19462:48:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19439:6:7"},"nodeType":"YulFunctionCall","src":"19439:72:7"},"nodeType":"YulExpressionStatement","src":"19439:72:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19531:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"19538:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19527:3:7"},"nodeType":"YulFunctionCall","src":"19527:15:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19577:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"19588:3:7","type":"","value":"128"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19573:3:7"},"nodeType":"YulFunctionCall","src":"19573:19:7"}],"functionName":{"name":"abi_decode_uint48_fromMemory","nodeType":"YulIdentifier","src":"19544:28:7"},"nodeType":"YulFunctionCall","src":"19544:49:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19520:6:7"},"nodeType":"YulFunctionCall","src":"19520:74:7"},"nodeType":"YulExpressionStatement","src":"19520:74:7"},{"nodeType":"YulVariableDeclaration","src":"19603:40:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19627:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"19638:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19623:3:7"},"nodeType":"YulFunctionCall","src":"19623:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"19617:5:7"},"nodeType":"YulFunctionCall","src":"19617:26:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"19607:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"19686:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19695:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19698:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19688:6:7"},"nodeType":"YulFunctionCall","src":"19688:12:7"},"nodeType":"YulExpressionStatement","src":"19688:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"19658:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"19666:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"19655:2:7"},"nodeType":"YulFunctionCall","src":"19655:30:7"},"nodeType":"YulIf","src":"19652:50:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19722:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"19729:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19718:3:7"},"nodeType":"YulFunctionCall","src":"19718:15:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"19767:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"19778:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"19763:3:7"},"nodeType":"YulFunctionCall","src":"19763:22:7"},{"name":"end","nodeType":"YulIdentifier","src":"19787:3:7"}],"functionName":{"name":"abi_decode_bytes_fromMemory","nodeType":"YulIdentifier","src":"19735:27:7"},"nodeType":"YulFunctionCall","src":"19735:56:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19711:6:7"},"nodeType":"YulFunctionCall","src":"19711:81:7"},"nodeType":"YulExpressionStatement","src":"19711:81:7"}]},"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19041:9:7","type":""},{"name":"end","nodeType":"YulTypedName","src":"19052:3:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"19060:5:7","type":""}],"src":"18992:806:7"},{"body":{"nodeType":"YulBlock","src":"19880:204:7","statements":[{"body":{"nodeType":"YulBlock","src":"19924:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"19933:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"19936:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"19926:6:7"},"nodeType":"YulFunctionCall","src":"19926:12:7"},"nodeType":"YulExpressionStatement","src":"19926:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"end","nodeType":"YulIdentifier","src":"19901:3:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"19906:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"19897:3:7"},"nodeType":"YulFunctionCall","src":"19897:19:7"},{"kind":"number","nodeType":"YulLiteral","src":"19918:4:7","type":"","value":"0x40"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"19893:3:7"},"nodeType":"YulFunctionCall","src":"19893:30:7"},"nodeType":"YulIf","src":"19890:50:7"},{"nodeType":"YulAssignment","src":"19949:31:7","value":{"arguments":[],"functionName":{"name":"allocate_memory_3430","nodeType":"YulIdentifier","src":"19958:20:7"},"nodeType":"YulFunctionCall","src":"19958:22:7"},"variableNames":[{"name":"value","nodeType":"YulIdentifier","src":"19949:5:7"}]},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"19996:5:7"},{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20009:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20003:5:7"},"nodeType":"YulFunctionCall","src":"20003:16:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"19989:6:7"},"nodeType":"YulFunctionCall","src":"19989:31:7"},"nodeType":"YulExpressionStatement","src":"19989:31:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"20040:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"20047:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20036:3:7"},"nodeType":"YulFunctionCall","src":"20036:14:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20062:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"20073:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20058:3:7"},"nodeType":"YulFunctionCall","src":"20058:18:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20052:5:7"},"nodeType":"YulFunctionCall","src":"20052:25:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"20029:6:7"},"nodeType":"YulFunctionCall","src":"20029:49:7"},"nodeType":"YulExpressionStatement","src":"20029:49:7"}]},"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"19851:9:7","type":""},{"name":"end","nodeType":"YulTypedName","src":"19862:3:7","type":""}],"returnVariables":[{"name":"value","nodeType":"YulTypedName","src":"19870:5:7","type":""}],"src":"19803:281:7"},{"body":{"nodeType":"YulBlock","src":"20322:517:7","statements":[{"body":{"nodeType":"YulBlock","src":"20369:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20378:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20381:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20371:6:7"},"nodeType":"YulFunctionCall","src":"20371:12:7"},"nodeType":"YulExpressionStatement","src":"20371:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"20343:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"20352:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"20339:3:7"},"nodeType":"YulFunctionCall","src":"20339:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"20364:3:7","type":"","value":"224"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"20335:3:7"},"nodeType":"YulFunctionCall","src":"20335:33:7"},"nodeType":"YulIf","src":"20332:53:7"},{"nodeType":"YulVariableDeclaration","src":"20394:30:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20414:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"20408:5:7"},"nodeType":"YulFunctionCall","src":"20408:16:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"20398:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"20467:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20476:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"20479:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"20469:6:7"},"nodeType":"YulFunctionCall","src":"20469:12:7"},"nodeType":"YulExpressionStatement","src":"20469:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"20439:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"20447:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"20436:2:7"},"nodeType":"YulFunctionCall","src":"20436:30:7"},"nodeType":"YulIf","src":"20433:50:7"},{"nodeType":"YulAssignment","src":"20492:82:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20546:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"20557:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20542:3:7"},"nodeType":"YulFunctionCall","src":"20542:22:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20566:7:7"}],"functionName":{"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulIdentifier","src":"20502:39:7"},"nodeType":"YulFunctionCall","src":"20502:72:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"20492:6:7"}]},{"nodeType":"YulAssignment","src":"20583:77:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20636:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"20647:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20632:3:7"},"nodeType":"YulFunctionCall","src":"20632:18:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20652:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20593:38:7"},"nodeType":"YulFunctionCall","src":"20593:67:7"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"20583:6:7"}]},{"nodeType":"YulAssignment","src":"20669:77:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20722:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"20733:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20718:3:7"},"nodeType":"YulFunctionCall","src":"20718:18:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20738:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20679:38:7"},"nodeType":"YulFunctionCall","src":"20679:67:7"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"20669:6:7"}]},{"nodeType":"YulAssignment","src":"20755:78:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"20808:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"20819:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"20804:3:7"},"nodeType":"YulFunctionCall","src":"20804:19:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"20825:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"20765:38:7"},"nodeType":"YulFunctionCall","src":"20765:68:7"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"20755:6:7"}]}]},"name":"abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"20264:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"20275:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"20287:6:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"20295:6:7","type":""},{"name":"value2","nodeType":"YulTypedName","src":"20303:6:7","type":""},{"name":"value3","nodeType":"YulTypedName","src":"20311:6:7","type":""}],"src":"20089:750:7"},{"body":{"nodeType":"YulBlock","src":"20899:382:7","statements":[{"nodeType":"YulAssignment","src":"20909:22:7","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"20923:1:7","type":"","value":"1"},{"name":"data","nodeType":"YulIdentifier","src":"20926:4:7"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"20919:3:7"},"nodeType":"YulFunctionCall","src":"20919:12:7"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"20909:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"20940:38:7","value":{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"20970:4:7"},{"kind":"number","nodeType":"YulLiteral","src":"20976:1:7","type":"","value":"1"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"20966:3:7"},"nodeType":"YulFunctionCall","src":"20966:12:7"},"variables":[{"name":"outOfPlaceEncoding","nodeType":"YulTypedName","src":"20944:18:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"21017:31:7","statements":[{"nodeType":"YulAssignment","src":"21019:27:7","value":{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"21033:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"21041:4:7","type":"","value":"0x7f"}],"functionName":{"name":"and","nodeType":"YulIdentifier","src":"21029:3:7"},"nodeType":"YulFunctionCall","src":"21029:17:7"},"variableNames":[{"name":"length","nodeType":"YulIdentifier","src":"21019:6:7"}]}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"20997:18:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"20990:6:7"},"nodeType":"YulFunctionCall","src":"20990:26:7"},"nodeType":"YulIf","src":"20987:61:7"},{"body":{"nodeType":"YulBlock","src":"21107:168:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21128:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21131:77:7","type":"","value":"35408467139433450592217433187231851964531694900788300625387963629091585785856"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21121:6:7"},"nodeType":"YulFunctionCall","src":"21121:88:7"},"nodeType":"YulExpressionStatement","src":"21121:88:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21229:1:7","type":"","value":"4"},{"kind":"number","nodeType":"YulLiteral","src":"21232:4:7","type":"","value":"0x22"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"21222:6:7"},"nodeType":"YulFunctionCall","src":"21222:15:7"},"nodeType":"YulExpressionStatement","src":"21222:15:7"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21257:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21260:4:7","type":"","value":"0x24"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21250:6:7"},"nodeType":"YulFunctionCall","src":"21250:15:7"},"nodeType":"YulExpressionStatement","src":"21250:15:7"}]},"condition":{"arguments":[{"name":"outOfPlaceEncoding","nodeType":"YulIdentifier","src":"21063:18:7"},{"arguments":[{"name":"length","nodeType":"YulIdentifier","src":"21086:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"21094:2:7","type":"","value":"32"}],"functionName":{"name":"lt","nodeType":"YulIdentifier","src":"21083:2:7"},"nodeType":"YulFunctionCall","src":"21083:14:7"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"21060:2:7"},"nodeType":"YulFunctionCall","src":"21060:38:7"},"nodeType":"YulIf","src":"21057:218:7"}]},"name":"extract_byte_array_length","nodeType":"YulFunctionDefinition","parameters":[{"name":"data","nodeType":"YulTypedName","src":"20879:4:7","type":""}],"returnVariables":[{"name":"length","nodeType":"YulTypedName","src":"20888:6:7","type":""}],"src":"20844:437:7"},{"body":{"nodeType":"YulBlock","src":"21571:956:7","statements":[{"nodeType":"YulVariableDeclaration","src":"21581:33:7","value":{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"21595:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"21604:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"21591:3:7"},"nodeType":"YulFunctionCall","src":"21591:23:7"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"21585:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"21639:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21648:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21651:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21641:6:7"},"nodeType":"YulFunctionCall","src":"21641:12:7"},"nodeType":"YulExpressionStatement","src":"21641:12:7"}]},"condition":{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"21630:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"21634:3:7","type":"","value":"320"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"21626:3:7"},"nodeType":"YulFunctionCall","src":"21626:12:7"},"nodeType":"YulIf","src":"21623:32:7"},{"nodeType":"YulVariableDeclaration","src":"21664:30:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21684:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"21678:5:7"},"nodeType":"YulFunctionCall","src":"21678:16:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"21668:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"21737:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"21746:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"21749:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"21739:6:7"},"nodeType":"YulFunctionCall","src":"21739:12:7"},"nodeType":"YulExpressionStatement","src":"21739:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"21709:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"21717:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"21706:2:7"},"nodeType":"YulFunctionCall","src":"21706:30:7"},"nodeType":"YulIf","src":"21703:50:7"},{"nodeType":"YulAssignment","src":"21762:82:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21816:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"21827:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21812:3:7"},"nodeType":"YulFunctionCall","src":"21812:22:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"21836:7:7"}],"functionName":{"name":"abi_decode_struct_ReturnInfo_fromMemory","nodeType":"YulIdentifier","src":"21772:39:7"},"nodeType":"YulFunctionCall","src":"21772:72:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"21762:6:7"}]},{"nodeType":"YulAssignment","src":"21853:77:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21906:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"21917:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21902:3:7"},"nodeType":"YulFunctionCall","src":"21902:18:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"21922:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"21863:38:7"},"nodeType":"YulFunctionCall","src":"21863:67:7"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"21853:6:7"}]},{"nodeType":"YulAssignment","src":"21939:77:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"21992:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"22003:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"21988:3:7"},"nodeType":"YulFunctionCall","src":"21988:18:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"22008:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"21949:38:7"},"nodeType":"YulFunctionCall","src":"21949:67:7"},"variableNames":[{"name":"value2","nodeType":"YulIdentifier","src":"21939:6:7"}]},{"nodeType":"YulAssignment","src":"22025:78:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22078:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"22089:3:7","type":"","value":"160"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22074:3:7"},"nodeType":"YulFunctionCall","src":"22074:19:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"22095:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"22035:38:7"},"nodeType":"YulFunctionCall","src":"22035:68:7"},"variableNames":[{"name":"value3","nodeType":"YulIdentifier","src":"22025:6:7"}]},{"body":{"nodeType":"YulBlock","src":"22200:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22209:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22212:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22202:6:7"},"nodeType":"YulFunctionCall","src":"22202:12:7"},"nodeType":"YulExpressionStatement","src":"22202:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"22123:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"22127:66:7","type":"","value":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22119:3:7"},"nodeType":"YulFunctionCall","src":"22119:75:7"},{"kind":"number","nodeType":"YulLiteral","src":"22196:2:7","type":"","value":"96"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"22115:3:7"},"nodeType":"YulFunctionCall","src":"22115:84:7"},"nodeType":"YulIf","src":"22112:104:7"},{"nodeType":"YulVariableDeclaration","src":"22225:35:7","value":{"arguments":[],"functionName":{"name":"allocate_memory_3430","nodeType":"YulIdentifier","src":"22238:20:7"},"nodeType":"YulFunctionCall","src":"22238:22:7"},"variables":[{"name":"value","nodeType":"YulTypedName","src":"22229:5:7","type":""}]},{"nodeType":"YulVariableDeclaration","src":"22269:41:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22294:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"22305:3:7","type":"","value":"224"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22290:3:7"},"nodeType":"YulFunctionCall","src":"22290:19:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"22284:5:7"},"nodeType":"YulFunctionCall","src":"22284:26:7"},"variables":[{"name":"value_1","nodeType":"YulTypedName","src":"22273:7:7","type":""}]},{"expression":{"arguments":[{"name":"value_1","nodeType":"YulIdentifier","src":"22357:7:7"}],"functionName":{"name":"validator_revert_contract_IEntryPoint","nodeType":"YulIdentifier","src":"22319:37:7"},"nodeType":"YulFunctionCall","src":"22319:46:7"},"nodeType":"YulExpressionStatement","src":"22319:46:7"},{"expression":{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22381:5:7"},{"name":"value_1","nodeType":"YulIdentifier","src":"22388:7:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22374:6:7"},"nodeType":"YulFunctionCall","src":"22374:22:7"},"nodeType":"YulExpressionStatement","src":"22374:22:7"},{"expression":{"arguments":[{"arguments":[{"name":"value","nodeType":"YulIdentifier","src":"22416:5:7"},{"kind":"number","nodeType":"YulLiteral","src":"22423:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22412:3:7"},"nodeType":"YulFunctionCall","src":"22412:14:7"},{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22471:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"22482:3:7","type":"","value":"256"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22467:3:7"},"nodeType":"YulFunctionCall","src":"22467:19:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"22488:7:7"}],"functionName":{"name":"abi_decode_struct_StakeInfo_fromMemory","nodeType":"YulIdentifier","src":"22428:38:7"},"nodeType":"YulFunctionCall","src":"22428:68:7"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"22405:6:7"},"nodeType":"YulFunctionCall","src":"22405:92:7"},"nodeType":"YulExpressionStatement","src":"22405:92:7"},{"nodeType":"YulAssignment","src":"22506:15:7","value":{"name":"value","nodeType":"YulIdentifier","src":"22516:5:7"},"variableNames":[{"name":"value4","nodeType":"YulIdentifier","src":"22506:6:7"}]}]},"name":"abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_AggregatorStakeInfo_$26_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"21505:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"21516:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"21528:6:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"21536:6:7","type":""},{"name":"value2","nodeType":"YulTypedName","src":"21544:6:7","type":""},{"name":"value3","nodeType":"YulTypedName","src":"21552:6:7","type":""},{"name":"value4","nodeType":"YulTypedName","src":"21560:6:7","type":""}],"src":"21286:1241:7"},{"body":{"nodeType":"YulBlock","src":"22640:411:7","statements":[{"body":{"nodeType":"YulBlock","src":"22686:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22695:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22698:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22688:6:7"},"nodeType":"YulFunctionCall","src":"22688:12:7"},"nodeType":"YulExpressionStatement","src":"22688:12:7"}]},"condition":{"arguments":[{"arguments":[{"name":"dataEnd","nodeType":"YulIdentifier","src":"22661:7:7"},{"name":"headStart","nodeType":"YulIdentifier","src":"22670:9:7"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"22657:3:7"},"nodeType":"YulFunctionCall","src":"22657:23:7"},{"kind":"number","nodeType":"YulLiteral","src":"22682:2:7","type":"","value":"64"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"22653:3:7"},"nodeType":"YulFunctionCall","src":"22653:32:7"},"nodeType":"YulIf","src":"22650:52:7"},{"nodeType":"YulAssignment","src":"22711:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22727:9:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"22721:5:7"},"nodeType":"YulFunctionCall","src":"22721:16:7"},"variableNames":[{"name":"value0","nodeType":"YulIdentifier","src":"22711:6:7"}]},{"nodeType":"YulVariableDeclaration","src":"22746:39:7","value":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22770:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"22781:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22766:3:7"},"nodeType":"YulFunctionCall","src":"22766:18:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"22760:5:7"},"nodeType":"YulFunctionCall","src":"22760:25:7"},"variables":[{"name":"offset","nodeType":"YulTypedName","src":"22750:6:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"22828:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22837:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22840:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22830:6:7"},"nodeType":"YulFunctionCall","src":"22830:12:7"},"nodeType":"YulExpressionStatement","src":"22830:12:7"}]},"condition":{"arguments":[{"name":"offset","nodeType":"YulIdentifier","src":"22800:6:7"},{"kind":"number","nodeType":"YulLiteral","src":"22808:18:7","type":"","value":"0xffffffffffffffff"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"22797:2:7"},"nodeType":"YulFunctionCall","src":"22797:30:7"},"nodeType":"YulIf","src":"22794:50:7"},{"nodeType":"YulVariableDeclaration","src":"22853:32:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"22867:9:7"},{"name":"offset","nodeType":"YulIdentifier","src":"22878:6:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22863:3:7"},"nodeType":"YulFunctionCall","src":"22863:22:7"},"variables":[{"name":"_1","nodeType":"YulTypedName","src":"22857:2:7","type":""}]},{"body":{"nodeType":"YulBlock","src":"22933:16:7","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"22942:1:7","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"22945:1:7","type":"","value":"0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"22935:6:7"},"nodeType":"YulFunctionCall","src":"22935:12:7"},"nodeType":"YulExpressionStatement","src":"22935:12:7"}]},"condition":{"arguments":[{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"22912:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"22916:4:7","type":"","value":"0x1f"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"22908:3:7"},"nodeType":"YulFunctionCall","src":"22908:13:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"22923:7:7"}],"functionName":{"name":"slt","nodeType":"YulIdentifier","src":"22904:3:7"},"nodeType":"YulFunctionCall","src":"22904:27:7"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"22897:6:7"},"nodeType":"YulFunctionCall","src":"22897:35:7"},"nodeType":"YulIf","src":"22894:55:7"},{"nodeType":"YulAssignment","src":"22958:87:7","value":{"arguments":[{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"23017:2:7"},{"kind":"number","nodeType":"YulLiteral","src":"23021:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23013:3:7"},"nodeType":"YulFunctionCall","src":"23013:11:7"},{"arguments":[{"name":"_1","nodeType":"YulIdentifier","src":"23032:2:7"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"23026:5:7"},"nodeType":"YulFunctionCall","src":"23026:9:7"},{"name":"dataEnd","nodeType":"YulIdentifier","src":"23037:7:7"}],"functionName":{"name":"abi_decode_available_length_bytes_fromMemory","nodeType":"YulIdentifier","src":"22968:44:7"},"nodeType":"YulFunctionCall","src":"22968:77:7"},"variableNames":[{"name":"value1","nodeType":"YulIdentifier","src":"22958:6:7"}]}]},"name":"abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"22598:9:7","type":""},{"name":"dataEnd","nodeType":"YulTypedName","src":"22609:7:7","type":""}],"returnVariables":[{"name":"value0","nodeType":"YulTypedName","src":"22621:6:7","type":""},{"name":"value1","nodeType":"YulTypedName","src":"22629:6:7","type":""}],"src":"22532:519:7"},{"body":{"nodeType":"YulBlock","src":"23104:80:7","statements":[{"body":{"nodeType":"YulBlock","src":"23131:22:7","statements":[{"expression":{"arguments":[],"functionName":{"name":"panic_error_0x11","nodeType":"YulIdentifier","src":"23133:16:7"},"nodeType":"YulFunctionCall","src":"23133:18:7"},"nodeType":"YulExpressionStatement","src":"23133:18:7"}]},"condition":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"23120:1:7"},{"arguments":[{"name":"y","nodeType":"YulIdentifier","src":"23127:1:7"}],"functionName":{"name":"not","nodeType":"YulIdentifier","src":"23123:3:7"},"nodeType":"YulFunctionCall","src":"23123:6:7"}],"functionName":{"name":"gt","nodeType":"YulIdentifier","src":"23117:2:7"},"nodeType":"YulFunctionCall","src":"23117:13:7"},"nodeType":"YulIf","src":"23114:39:7"},{"nodeType":"YulAssignment","src":"23162:16:7","value":{"arguments":[{"name":"x","nodeType":"YulIdentifier","src":"23173:1:7"},{"name":"y","nodeType":"YulIdentifier","src":"23176:1:7"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23169:3:7"},"nodeType":"YulFunctionCall","src":"23169:9:7"},"variableNames":[{"name":"sum","nodeType":"YulIdentifier","src":"23162:3:7"}]}]},"name":"checked_add_t_uint256","nodeType":"YulFunctionDefinition","parameters":[{"name":"x","nodeType":"YulTypedName","src":"23087:1:7","type":""},{"name":"y","nodeType":"YulTypedName","src":"23090:1:7","type":""}],"returnVariables":[{"name":"sum","nodeType":"YulTypedName","src":"23096:3:7","type":""}],"src":"23056:128:7"},{"body":{"nodeType":"YulBlock","src":"23363:164:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23380:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23391:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23373:6:7"},"nodeType":"YulFunctionCall","src":"23373:21:7"},"nodeType":"YulExpressionStatement","src":"23373:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23414:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23425:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23410:3:7"},"nodeType":"YulFunctionCall","src":"23410:18:7"},{"kind":"number","nodeType":"YulLiteral","src":"23430:2:7","type":"","value":"14"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23403:6:7"},"nodeType":"YulFunctionCall","src":"23403:30:7"},"nodeType":"YulExpressionStatement","src":"23403:30:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23453:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23464:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23449:3:7"},"nodeType":"YulFunctionCall","src":"23449:18:7"},{"hexValue":"736c6963655f6f766572666c6f77","kind":"string","nodeType":"YulLiteral","src":"23469:16:7","type":"","value":"slice_overflow"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23442:6:7"},"nodeType":"YulFunctionCall","src":"23442:44:7"},"nodeType":"YulExpressionStatement","src":"23442:44:7"},{"nodeType":"YulAssignment","src":"23495:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23507:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23518:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23503:3:7"},"nodeType":"YulFunctionCall","src":"23503:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"23495:4:7"}]}]},"name":"abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"23340:9:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"23354:4:7","type":""}],"src":"23189:338:7"},{"body":{"nodeType":"YulBlock","src":"23706:167:7","statements":[{"expression":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23723:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23734:2:7","type":"","value":"32"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23716:6:7"},"nodeType":"YulFunctionCall","src":"23716:21:7"},"nodeType":"YulExpressionStatement","src":"23716:21:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23757:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23768:2:7","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23753:3:7"},"nodeType":"YulFunctionCall","src":"23753:18:7"},{"kind":"number","nodeType":"YulLiteral","src":"23773:2:7","type":"","value":"17"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23746:6:7"},"nodeType":"YulFunctionCall","src":"23746:30:7"},"nodeType":"YulExpressionStatement","src":"23746:30:7"},{"expression":{"arguments":[{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23796:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23807:2:7","type":"","value":"64"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23792:3:7"},"nodeType":"YulFunctionCall","src":"23792:18:7"},{"hexValue":"736c6963655f6f75744f66426f756e6473","kind":"string","nodeType":"YulLiteral","src":"23812:19:7","type":"","value":"slice_outOfBounds"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"23785:6:7"},"nodeType":"YulFunctionCall","src":"23785:47:7"},"nodeType":"YulExpressionStatement","src":"23785:47:7"},{"nodeType":"YulAssignment","src":"23841:26:7","value":{"arguments":[{"name":"headStart","nodeType":"YulIdentifier","src":"23853:9:7"},{"kind":"number","nodeType":"YulLiteral","src":"23864:2:7","type":"","value":"96"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"23849:3:7"},"nodeType":"YulFunctionCall","src":"23849:18:7"},"variableNames":[{"name":"tail","nodeType":"YulIdentifier","src":"23841:4:7"}]}]},"name":"abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed","nodeType":"YulFunctionDefinition","parameters":[{"name":"headStart","nodeType":"YulTypedName","src":"23683:9:7","type":""}],"returnVariables":[{"name":"tail","nodeType":"YulTypedName","src":"23697:4:7","type":""}],"src":"23532:341:7"}]},"contents":"{\n { }\n function validator_revert_contract_IEntryPoint(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory_3428() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0x0160)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory_3429() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0xc0)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory_3430() -> memPtr\n {\n memPtr := mload(0x40)\n let newFreePtr := add(memPtr, 0x40)\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(0x40, newFreePtr)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function array_allocation_size_array_struct_UserOperation_dyn(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(shl(5, length), 0x20)\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_contract_IEntryPoint(value)\n }\n function array_allocation_size_bytes(length) -> size\n {\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n size := add(and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x20)\n }\n function abi_decode_bytes(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := calldataload(offset)\n let array_1 := allocate_memory(array_allocation_size_bytes(_1))\n mstore(array_1, _1)\n if gt(add(add(offset, _1), 0x20), end) { revert(0, 0) }\n calldatacopy(add(array_1, 0x20), add(offset, 0x20), _1)\n mstore(add(add(array_1, _1), 0x20), 0)\n array := array_1\n }\n function abi_decode_tuple_t_contract$_IEntryPoint_$998t_array$_t_struct$_UserOperation_$1149_memory_ptr_$dyn_memory_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := calldataload(_3)\n let dst := allocate_memory(array_allocation_size_array_struct_UserOperation_dyn(_4))\n let dst_1 := dst\n mstore(dst, _4)\n dst := add(dst, _1)\n let srcEnd := add(add(_3, shl(5, _4)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_3, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let innerOffset := calldataload(src)\n if gt(innerOffset, _2) { revert(0, 0) }\n let _5 := add(_3, innerOffset)\n if slt(add(sub(dataEnd, _5), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0), 0x0160) { revert(0, 0) }\n let value_1 := allocate_memory_3428()\n mstore(value_1, abi_decode_address(add(_5, _1)))\n mstore(add(value_1, _1), calldataload(add(_5, 64)))\n let offset_1 := calldataload(add(_5, 96))\n if gt(offset_1, _2) { revert(0, 0) }\n mstore(add(value_1, 64), abi_decode_bytes(add(add(_5, offset_1), _1), dataEnd))\n let offset_2 := calldataload(add(_5, 128))\n if gt(offset_2, _2) { revert(0, 0) }\n mstore(add(value_1, 96), abi_decode_bytes(add(add(_5, offset_2), _1), dataEnd))\n mstore(add(value_1, 128), calldataload(add(_5, 160)))\n mstore(add(value_1, 160), calldataload(add(_5, 192)))\n mstore(add(value_1, 192), calldataload(add(_5, 224)))\n mstore(add(value_1, 224), calldataload(add(_5, 256)))\n mstore(add(value_1, 256), calldataload(add(_5, 288)))\n let _6 := 320\n let offset_3 := calldataload(add(_5, _6))\n if gt(offset_3, _2) { revert(0, 0) }\n mstore(add(value_1, 288), abi_decode_bytes(add(add(_5, offset_3), _1), dataEnd))\n let offset_4 := calldataload(add(_5, 0x0160))\n if gt(offset_4, _2) { revert(0, 0) }\n mstore(add(value_1, _6), abi_decode_bytes(add(add(_5, offset_4), _1), dataEnd))\n mstore(dst, value_1)\n dst := add(dst, _1)\n }\n value1 := dst_1\n }\n function abi_encode_tuple_t_array$_t_bytes32_$dyn_memory_ptr__to_t_array$_t_bytes32_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n let dst := allocate_memory(array_allocation_size_array_struct_UserOperation_dyn(_3))\n let dst_1 := dst\n mstore(dst, _3)\n dst := add(dst, _1)\n let srcEnd := add(add(_2, shl(5, _3)), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := calldataload(src)\n validator_revert_contract_IEntryPoint(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_2)\n if gt(length, _1) { revert(0, 0) }\n if gt(add(add(_2, length), 32), dataEnd) { revert(0, 0) }\n value0 := add(_2, 32)\n value1 := length\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_contract$_IEntryPoint_$998__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_decode_tuple_t_struct$_UserOperation_$1149_calldata_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 352) { revert(0, 0) }\n value0 := _1\n }\n function copy_memory_to_memory(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length) { mstore(add(dst, length), 0) }\n }\n function abi_encode_string(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_struct_StakeInfo(value, pos)\n {\n mstore(pos, mload(value))\n mstore(add(pos, 0x20), mload(add(value, 0x20)))\n }\n function abi_encode_struct_AggregatorStakeInfo(value, pos)\n {\n mstore(pos, and(mload(value), 0xffffffffffffffffffffffffffffffffffffffff))\n let memberValue0 := mload(add(value, 0x20))\n abi_encode_struct_StakeInfo(memberValue0, add(pos, 0x20))\n }\n function abi_encode_tuple_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__to_t_struct$_FailedOpStatus_$33_memory_ptr_t_struct$_Response_$51_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 64\n mstore(headStart, _1)\n mstore(add(headStart, _1), iszero(iszero(mload(value0))))\n let _2 := 0x20\n mstore(add(headStart, 0x60), mload(add(value0, _2)))\n let memberValue0 := mload(add(value0, _1))\n mstore(add(headStart, 128), 0x60)\n let end := abi_encode_string(memberValue0, add(headStart, 160))\n mstore(add(headStart, _2), sub(end, headStart))\n let _3 := 0x0160\n let memberValue0_1 := mload(value1)\n mstore(end, _3)\n let tail_1 := abi_encode_string(memberValue0_1, add(end, _3))\n let memberValue0_2 := mload(add(value1, _2))\n mstore(add(end, _2), sub(tail_1, end))\n mstore(tail_1, mload(memberValue0_2))\n mstore(add(tail_1, _2), mload(add(memberValue0_2, _2)))\n mstore(add(tail_1, _1), iszero(iszero(mload(add(memberValue0_2, _1)))))\n let memberValue0_3 := mload(add(memberValue0_2, 0x60))\n let _4 := 0xffffffffffff\n mstore(add(tail_1, 0x60), and(memberValue0_3, _4))\n mstore(add(tail_1, 128), and(mload(add(memberValue0_2, 128)), _4))\n let memberValue0_4 := mload(add(memberValue0_2, 160))\n mstore(add(tail_1, 160), 0xc0)\n let end_1 := abi_encode_string(memberValue0_4, add(tail_1, 0xc0))\n let memberValue0_5 := mload(add(value1, _1))\n abi_encode_struct_StakeInfo(memberValue0_5, add(end, _1))\n let memberValue0_6 := mload(add(value1, 0x60))\n abi_encode_struct_StakeInfo(memberValue0_6, add(end, 128))\n let memberValue0_7 := mload(add(value1, 128))\n abi_encode_struct_StakeInfo(memberValue0_7, add(end, 0xc0))\n let memberValue0_8 := mload(add(value1, 160))\n abi_encode_struct_AggregatorStakeInfo(memberValue0_8, add(end, 0x0100))\n tail := end_1\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_struct$_UserOperation_$1149_memory_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n abi_encode_address(mload(value0), add(headStart, 32))\n mstore(add(headStart, 64), mload(add(value0, 32)))\n let memberValue0 := mload(add(value0, 64))\n let _1 := 0x0160\n mstore(add(headStart, 96), _1)\n let tail_1 := abi_encode_string(memberValue0, add(headStart, 384))\n let memberValue0_1 := mload(add(value0, 96))\n let _2 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n mstore(add(headStart, 128), add(sub(tail_1, headStart), _2))\n let tail_2 := abi_encode_string(memberValue0_1, tail_1)\n mstore(add(headStart, 160), mload(add(value0, 128)))\n mstore(add(headStart, 192), mload(add(value0, 160)))\n mstore(add(headStart, 224), mload(add(value0, 192)))\n let _3 := mload(add(value0, 224))\n let _4 := 256\n mstore(add(headStart, _4), _3)\n let _5 := mload(add(value0, _4))\n let _6 := 288\n mstore(add(headStart, _6), _5)\n let memberValue0_2 := mload(add(value0, _6))\n let _7 := 320\n mstore(add(headStart, _7), add(sub(tail_2, headStart), _2))\n let tail_3 := abi_encode_string(memberValue0_2, tail_2)\n let memberValue0_3 := mload(add(value0, _7))\n mstore(add(headStart, _1), add(sub(tail_3, headStart), _2))\n tail := abi_encode_string(memberValue0_3, tail_3)\n }\n function abi_decode_tuple_t_bytes32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := mload(headStart)\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 32))\n }\n function convert_bytes_to_fixedbytes_from_t_bytes_memory_ptr_to_t_bytes4(array) -> value\n {\n let length := mload(array)\n let _1 := mload(add(array, 0x20))\n let _2 := 0xffffffff00000000000000000000000000000000000000000000000000000000\n value := and(_1, _2)\n if lt(length, 4)\n {\n value := and(and(_1, shl(shl(3, sub(4, length)), _2)), _2)\n }\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function abi_decode_tuple_t_address_payable_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IEntryPoint(value)\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_41358789453c2b61b04d9046ed6bd1617530e1f3f5c8b4843a7b086398036cc8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 16)\n mstore(add(headStart, 64), \"Invalid initCode\")\n tail := add(headStart, 96)\n }\n function calldata_access_bytes_calldata(base_ref, ptr) -> value, length\n {\n let rel_offset_of_tail := calldataload(ptr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let value_1 := add(rel_offset_of_tail, base_ref)\n length := calldataload(value_1)\n value := add(value_1, 0x20)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n if sgt(value, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_t_struct$_UserOperation_$1149_calldata_ptr__to_t_struct$_UserOperation_$1149_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n abi_encode_address(abi_decode_address(value0), add(headStart, 32))\n mstore(add(headStart, 64), calldataload(add(value0, 32)))\n let memberValue0, memberValue1 := calldata_access_bytes_calldata(value0, add(value0, 64))\n let _1 := 0x0160\n mstore(add(headStart, 96), _1)\n let tail_1 := abi_encode_bytes_calldata(memberValue0, memberValue1, add(headStart, 384))\n let memberValue0_1, memberValue1_1 := calldata_access_bytes_calldata(value0, add(value0, 96))\n let _2 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n mstore(add(headStart, 128), add(sub(tail_1, headStart), _2))\n let tail_2 := abi_encode_bytes_calldata(memberValue0_1, memberValue1_1, tail_1)\n mstore(add(headStart, 160), calldataload(add(value0, 128)))\n mstore(add(headStart, 192), calldataload(add(value0, 160)))\n mstore(add(headStart, 224), calldataload(add(value0, 192)))\n let _3 := 256\n mstore(add(headStart, _3), calldataload(add(value0, 224)))\n let _4 := 288\n mstore(add(headStart, _4), calldataload(add(value0, _3)))\n let memberValue0_2, memberValue1_2 := calldata_access_bytes_calldata(value0, add(value0, _4))\n let _5 := 320\n mstore(add(headStart, _5), add(sub(tail_2, headStart), _2))\n let tail_3 := abi_encode_bytes_calldata(memberValue0_2, memberValue1_2, tail_2)\n let memberValue0_3, memberValue1_3 := calldata_access_bytes_calldata(value0, add(value0, _5))\n mstore(add(headStart, _1), add(sub(tail_3, headStart), _2))\n tail := abi_encode_bytes_calldata(memberValue0_3, memberValue1_3, tail_3)\n }\n function abi_decode_uint48_fromMemory(offset) -> value\n {\n value := mload(offset)\n if iszero(eq(value, and(value, 0xffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_available_length_bytes_fromMemory(src, length, end) -> array\n {\n array := allocate_memory(array_allocation_size_bytes(length))\n mstore(array, length)\n if gt(add(src, length), end) { revert(0, 0) }\n copy_memory_to_memory(src, add(array, 0x20), length)\n }\n function abi_decode_bytes_fromMemory(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n array := abi_decode_available_length_bytes_fromMemory(add(offset, 0x20), mload(offset), end)\n }\n function abi_decode_struct_ReturnInfo_fromMemory(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0xc0) { revert(0, 0) }\n value := allocate_memory_3429()\n mstore(value, mload(headStart))\n mstore(add(value, 32), mload(add(headStart, 32)))\n let value_1 := mload(add(headStart, 64))\n if iszero(eq(value_1, iszero(iszero(value_1)))) { revert(0, 0) }\n mstore(add(value, 64), value_1)\n mstore(add(value, 96), abi_decode_uint48_fromMemory(add(headStart, 96)))\n mstore(add(value, 128), abi_decode_uint48_fromMemory(add(headStart, 128)))\n let offset := mload(add(headStart, 160))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n mstore(add(value, 160), abi_decode_bytes_fromMemory(add(headStart, offset), end))\n }\n function abi_decode_struct_StakeInfo_fromMemory(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0x40) { revert(0, 0) }\n value := allocate_memory_3430()\n mstore(value, mload(headStart))\n mstore(add(value, 32), mload(add(headStart, 32)))\n }\n function abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 224) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_ReturnInfo_fromMemory(add(headStart, offset), dataEnd)\n value1 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 32), dataEnd)\n value2 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 96), dataEnd)\n value3 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 160), dataEnd)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function abi_decode_tuple_t_struct$_ReturnInfo_$15_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_StakeInfo_$20_memory_ptrt_struct$_AggregatorStakeInfo_$26_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n let _1 := sub(dataEnd, headStart)\n if slt(_1, 320) { revert(0, 0) }\n let offset := mload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n value0 := abi_decode_struct_ReturnInfo_fromMemory(add(headStart, offset), dataEnd)\n value1 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 32), dataEnd)\n value2 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 96), dataEnd)\n value3 := abi_decode_struct_StakeInfo_fromMemory(add(headStart, 160), dataEnd)\n if slt(add(_1, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20), 96) { revert(0, 0) }\n let value := allocate_memory_3430()\n let value_1 := mload(add(headStart, 224))\n validator_revert_contract_IEntryPoint(value_1)\n mstore(value, value_1)\n mstore(add(value, 32), abi_decode_struct_StakeInfo_fromMemory(add(headStart, 256), dataEnd))\n value4 := value\n }\n function abi_decode_tuple_t_uint256t_string_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := mload(headStart)\n let offset := mload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n value1 := abi_decode_available_length_bytes_fromMemory(add(_1, 32), mload(_1), dataEnd)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_5d3d629f76473d94377d221b1f1c8f2161f7b65cab69e095662ec5d0e026c17e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 14)\n mstore(add(headStart, 64), \"slice_overflow\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_cca2258dcc0d08c244435525255fbef9116c9a31b4c29471218f002bbbceb7a0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"slice_outOfBounds\")\n tail := add(headStart, 96)\n }\n}","id":7,"language":"Yul","name":"#utility.yul"}],"immutableReferences":{},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100675760003560e01c80639b249f69116100505780639b249f69146100b6578063b0d691fe146100ee578063ee2194231461010e57600080fd5b80633024e00c1461006c5780637b34b62114610095575b600080fd5b61007f61007a36600461103a565b61012f565b60405161008c91906111f9565b60405180910390f35b6100a86100a336600461123d565b61024d565b60405190815260200161008c565b6100c96100c43660046112d7565b610336565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008c565b6000546100c99073ffffffffffffffffffffffffffffffffffffffff1681565b61012161011c366004611349565b6104e3565b60405161008c9291906113e1565b6060815167ffffffffffffffff81111561014b5761014b610eb8565b604051908082528060200260200182016040528015610174578160200160208202803683370190505b50905060005b8251811015610245578373ffffffffffffffffffffffffffffffffffffffff1663a61935318483815181106101b1576101b161152b565b60200260200101516040518263ffffffff1660e01b81526004016101d5919061155a565b602060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102169190611648565b8282815181106102285761022861152b565b60209081029190910101528061023d81611690565b91505061017a565b505b92915050565b600080825167ffffffffffffffff81111561026a5761026a610eb8565b604051908082528060200260200182016040528015610293578160200160208202803683370190505b50905060005b8351811015610302578381815181106102b4576102b461152b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163f8282815181106102e5576102e561152b565b6020908102919091010152806102fa81611690565b915050610299565b5060008160405160200161031691906111f9565b60408051601f198184030181529190528051602090910120949350505050565b600080546040517f9b249f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b249f699061038f90869086906004016116f3565b600060405180830381600087803b1580156103a957600080fd5b505af19250505080156103ba575060015b610247573d8080156103e8576040519150601f19603f3d011682016040523d82523d6000602084013e6103ed565b606091505b5060006103f98261170f565b90507f935847fa000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161047c57600061045e836004808651610459919061175f565b610c39565b8060200190518101906104719190611776565b935061024792505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420696e6974436f64650000000000000000000000000000000060448201526064015b60405180910390fd5b60408051606080820183526000808352602083015291810191909152610507610d97565b6000546040517fee21942300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ee2194239061055d9086906004016117fe565b600060405180830381600087803b15801561057757600080fd5b505af1925050508015610588575060015b610c34573d8080156105b6576040519150601f19603f3d011682016040523d82523d6000602084013e6105bb565b606091505b5060006105c78261170f565b90507f1f300fa1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016107a75760008060008061062b866004808951610459919061175f565b80602001905181019061063e9190611a3c565b6040805161010081018252601060c082019081527f56616c69646174696f6e526573756c740000000000000000000000000000000060e0830152815260208082018790528183018690526060808301869052608083018590528351808501855260035473ffffffffffffffffffffffffffffffffffffffff168152845180860186526004548152600554818501528184015260a0840152835190810184526018805460ff161515825260195492820192909252601a8054989c50969a509498509296509194919385929184019161071490611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461074090611aae565b801561078d5780601f106107625761010080835404028352916020019161078d565b820191906000526020600020905b81548152906001019060200180831161077057829003601f168201915b505050505081525050915097509750505050505050915091565b7f05134b1c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161095357600080600080600061080b876004808a51610459919061175f565b80602001905181019061081e9190611b01565b6040805161010081018252601f60c082019081527f56616c69646174696f6e526573756c74576974684167677265676174696f6e0060e08301528152602080820188905281830187905260608083018790526080830186905260a08301859052835190810184526018805460ff161515825260195492820192909252601a8054999e50979c50959a509398509196509194909385928401916108bf90611aae565b80601f01602080910402602001604051908101604052809291908181526020018280546108eb90611aae565b80156109385780601f1061090d57610100808354040283529160200191610938565b820191906000526020600020905b81548152906001019060200180831161091b57829003601f168201915b50505050508152505091509850985050505050505050915091565b7fddfd994a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610c31576000806109b2846004808751610459919061175f565b8060200190518101906109c59190611bd8565b91509150604051806060016040528060011515815260200183815260200182815250600a806040518060c0016040529081600082018054610a0590611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611aae565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b50505091835250506040805160c08101825260018401805482526002850154602083810191909152600386015460ff811615159484019490945265ffffffffffff610100850481166060850152670100000000000000909404909316608083015260048501805493909401939192909160a0840191610afc90611aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890611aae565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b505050919092525050508152604080518082018252600584015481526006840154602082810191909152808401919091528151808301835260078501548152600885015481830152828401528151808301835260098501548152600a85015481830152606084015281518083018352600b85015473ffffffffffffffffffffffffffffffffffffffff1681528251808401909352600c8501548352600d9094015482820152830152608001529199919850909650505050505050565b50505b915091565b606081610c4781601f611c33565b1015610caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104da565b610cb98284611c33565b84511015610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104da565b606082158015610d425760405191506000825260208201604052610d8c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d7b578051835260209283019201610d63565b5050858452601f01601f1916604052505b5090505b9392505050565b6040805160c0808201835260608083528351918201845260008083526020838101829052948301819052828201819052608083015260a082015290918201908152602001610df8604051806040016040528060008152602001600081525090565b8152602001610e1a604051806040016040528060008152602001600081525090565b8152602001610e3c604051806040016040528060008152602001600081525090565b8152602001610e49610e4e565b905290565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610e49604051806040016040528060008152602001600081525090565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b60405290565b60405160c0810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b6040805190810167ffffffffffffffff81118282101715610f0b57610f0b610eb8565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f8057610f80610eb8565b604052919050565b600067ffffffffffffffff821115610fa257610fa2610eb8565b5060051b60200190565b8035610fb781610e93565b919050565b600067ffffffffffffffff821115610fd657610fd6610eb8565b50601f01601f191660200190565b600082601f830112610ff557600080fd5b813561100861100382610fbc565b610f57565b81815284602083860101111561101d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561104d57600080fd5b823561105881610e93565b915060208381013567ffffffffffffffff8082111561107657600080fd5b818601915086601f83011261108a57600080fd5b813561109861100382610f88565b81815260059190911b830184019084810190898311156110b757600080fd5b8585015b838110156111e8578035858111156110d257600080fd5b8601610160818d03601f190112156110e957600080fd5b6110f1610ee7565b6110fc898301610fac565b815260408201358982015260608201358781111561111957600080fd5b6111278e8b83860101610fe4565b60408301525060808201358781111561113f57600080fd5b61114d8e8b83860101610fe4565b60608301525060a0820135608082015260c082013560a082015260e082013560c082015261010082013560e0820152610120820135610100820152610140808301358881111561119c57600080fd5b6111aa8f8c83870101610fe4565b61012084015250610160830135888111156111c457600080fd5b6111d28f8c83870101610fe4565b91830191909152508452509186019186016110bb565b508096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561123157835183529284019291840191600101611215565b50909695505050505050565b6000602080838503121561125057600080fd5b823567ffffffffffffffff81111561126757600080fd5b8301601f8101851361127857600080fd5b803561128661100382610f88565b81815260059190911b820183019083810190878311156112a557600080fd5b928401925b828410156112cc5783356112bd81610e93565b825292840192908401906112aa565b979650505050505050565b600080602083850312156112ea57600080fd5b823567ffffffffffffffff8082111561130257600080fd5b818501915085601f83011261131657600080fd5b81358181111561132557600080fd5b86602082850101111561133757600080fd5b60209290920196919550909350505050565b60006020828403121561135b57600080fd5b813567ffffffffffffffff81111561137257600080fd5b82016101608185031215610d9057600080fd5b60005b838110156113a0578181015183820152602001611388565b838111156113af576000848401525b50505050565b600081518084526113cd816020860160208601611385565b601f01601f19169290920160200192915050565b6000604080835284511515818401526020808601516060850152818601516060608086015261141360a08601826113b5565b9050848103828601526101608651818352611430828401826113b5565b9150508287015182820384840152805182528381015184830152848101511515858301526060810151935065ffffffffffff80851660608401528060808301511660808401525060a081015193505060c060a082015261149360c08201846113b5565b925050828601516114b08483018280518252602090810151910152565b50606086015180516080830152602081015160a083015292506080860151805160c0830152602081015160e0830152925060a08601519250611521610100820184805173ffffffffffffffffffffffffffffffffffffffff1682526020908101518051828401520151604090910152565b5095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815261158160208201835173ffffffffffffffffffffffffffffffffffffffff169052565b60208201516040820152600060408301516101608060608501526115a96101808501836113b5565b91506060850151601f19808685030160808701526115c784836113b5565b9350608087015160a087015260a087015160c087015260c087015160e087015260e0870151915061010082818801528088015192505061012082818801528088015192505061014081878603018188015261162285846113b5565b90880151878203909201848801529350905061163e83826113b5565b9695505050505050565b60006020828403121561165a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116c1576116c1611661565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006117076020830184866116c8565b949350505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156117575780818460040360031b1b83161693505b505050919050565b60008282101561177157611771611661565b500390565b60006020828403121561178857600080fd5b8151610d9081610e93565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126117c857600080fd5b830160208101925035905067ffffffffffffffff8111156117e857600080fd5b8036038213156117f757600080fd5b9250929050565b6020815261182c6020820161181284610fac565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135604082015260006118456040840184611793565b61016080606086015261185d610180860183856116c8565b925061186c6060870187611793565b9250601f19808786030160808801526118868585846116c8565b9450608088013560a088015260a088013560c088015260c088013560e0880152610100935060e088013584880152610120915083880135828801526118cd82890189611793565b945091506101408188870301818901526118e88686856116c8565b95506118f6818a018a611793565b9550925050808786030183880152506112cc8484836116c8565b805165ffffffffffff81168114610fb757600080fd5b600061193461100384610fbc565b905082815283838301111561194857600080fd5b610d90836020830184611385565b600082601f83011261196757600080fd5b610d9083835160208501611926565b600060c0828403121561198857600080fd5b611990610f11565b90508151815260208201516020820152604082015180151581146119b357600080fd5b60408201526119c460608301611910565b60608201526119d560808301611910565b608082015260a082015167ffffffffffffffff8111156119f457600080fd5b611a0084828501611956565b60a08301525092915050565b600060408284031215611a1e57600080fd5b611a26610f34565b9050815181526020820151602082015292915050565b60008060008060e08587031215611a5257600080fd5b845167ffffffffffffffff811115611a6957600080fd5b611a7587828801611976565b945050611a858660208701611a0c565b9250611a948660608701611a0c565b9150611aa38660a08701611a0c565b905092959194509250565b600181811c90821680611ac257607f821691505b602082108103611afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000806000806000858703610140811215611b1b57600080fd5b865167ffffffffffffffff811115611b3257600080fd5b611b3e89828a01611976565b965050611b4e8860208901611a0c565b9450611b5d8860608901611a0c565b9350611b6c8860a08901611a0c565b925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2082011215611b9e57600080fd5b50611ba7610f34565b60e0870151611bb581610e93565b8152611bc5886101008901611a0c565b6020820152809150509295509295909350565b60008060408385031215611beb57600080fd5b82519150602083015167ffffffffffffffff811115611c0957600080fd5b8301601f81018513611c1a57600080fd5b611c2985825160208401611926565b9150509250929050565b60008219821115611c4657611c46611661565b50019056fea26469706673582212209a1c7252e82e84056f2a73f6c8f87a6651303771a673fe8cebe2dbe5467b390664736f6c634300080f0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x67 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9B249F69 GT PUSH2 0x50 JUMPI DUP1 PUSH4 0x9B249F69 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB0D691FE EQ PUSH2 0xEE JUMPI DUP1 PUSH4 0xEE219423 EQ PUSH2 0x10E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x3024E00C EQ PUSH2 0x6C JUMPI DUP1 PUSH4 0x7B34B621 EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7F PUSH2 0x7A CALLDATASIZE PUSH1 0x4 PUSH2 0x103A JUMP JUMPDEST PUSH2 0x12F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8C SWAP2 SWAP1 PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA8 PUSH2 0xA3 CALLDATASIZE PUSH1 0x4 PUSH2 0x123D JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8C JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x12D7 JUMP JUMPDEST PUSH2 0x336 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xC9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x121 PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x1349 JUMP JUMPDEST PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8C SWAP3 SWAP2 SWAP1 PUSH2 0x13E1 JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14B JUMPI PUSH2 0x14B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x174 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x245 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA6193531 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1B1 JUMPI PUSH2 0x1B1 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D5 SWAP2 SWAP1 PUSH2 0x155A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x216 SWAP2 SWAP1 PUSH2 0x1648 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x228 JUMPI PUSH2 0x228 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x23D DUP2 PUSH2 0x1690 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x17A JUMP JUMPDEST POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A JUMPI PUSH2 0x26A PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x293 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x302 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x2B4 JUMPI PUSH2 0x2B4 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EXTCODEHASH DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2E5 JUMPI PUSH2 0x2E5 PUSH2 0x152B JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP1 PUSH2 0x2FA DUP2 PUSH2 0x1690 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x299 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x316 SWAP2 SWAP1 PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x9B249F6900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x9B249F69 SWAP1 PUSH2 0x38F SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3BA JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x247 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3E8 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3ED JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x3F9 DUP3 PUSH2 0x170F JUMP JUMPDEST SWAP1 POP PUSH32 0x935847FA00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x47C JUMPI PUSH1 0x0 PUSH2 0x45E DUP4 PUSH1 0x4 DUP1 DUP7 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST PUSH2 0xC39 JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x471 SWAP2 SWAP1 PUSH2 0x1776 JUMP JUMPDEST SWAP4 POP PUSH2 0x247 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420696E6974436F646500000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x507 PUSH2 0xD97 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xEE21942300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xEE219423 SWAP1 PUSH2 0x55D SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x17FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x588 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xC34 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH1 0x0 PUSH2 0x5C7 DUP3 PUSH2 0x170F JUMP JUMPDEST SWAP1 POP PUSH32 0x1F300FA100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x62B DUP7 PUSH1 0x4 DUP1 DUP10 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x63E SWAP2 SWAP1 PUSH2 0x1A3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x10 PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C7400000000000000000000000000000000 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP2 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP5 MLOAD DUP1 DUP7 ADD DUP7 MSTORE PUSH1 0x4 SLOAD DUP2 MSTORE PUSH1 0x5 SLOAD DUP2 DUP6 ADD MSTORE DUP2 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP9 SWAP13 POP SWAP7 SWAP11 POP SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP2 SWAP5 SWAP2 SWAP4 DUP6 SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH2 0x714 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x740 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x78D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x762 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x78D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x770 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP8 POP SWAP8 POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0x5134B1C00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x953 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x80B DUP8 PUSH1 0x4 DUP1 DUP11 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x81E SWAP2 SWAP1 PUSH2 0x1B01 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x1F PUSH1 0xC0 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x56616C69646174696F6E526573756C74576974684167677265676174696F6E00 PUSH1 0xE0 DUP4 ADD MSTORE DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD SWAP1 DUP2 ADD DUP5 MSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0xFF AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x19 SLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1A DUP1 SLOAD SWAP10 SWAP15 POP SWAP8 SWAP13 POP SWAP6 SWAP11 POP SWAP4 SWAP9 POP SWAP2 SWAP7 POP SWAP2 SWAP5 SWAP1 SWAP4 DUP6 SWAP3 DUP5 ADD SWAP2 PUSH2 0x8BF SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x8EB SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x938 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x90D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x938 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x91B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP2 POP SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH32 0xDDFD994A00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0xC31 JUMPI PUSH1 0x0 DUP1 PUSH2 0x9B2 DUP5 PUSH1 0x4 DUP1 DUP8 MLOAD PUSH2 0x459 SWAP2 SWAP1 PUSH2 0x175F JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x9C5 SWAP2 SWAP1 PUSH2 0x1BD8 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE POP PUSH1 0xA DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD DUP1 SLOAD PUSH2 0xA05 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xA31 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA7E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xA53 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xA7E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xA61 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x1 DUP5 ADD DUP1 SLOAD DUP3 MSTORE PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP7 ADD SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH2 0x100 DUP6 DIV DUP2 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH8 0x100000000000000 SWAP1 SWAP5 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x4 DUP6 ADD DUP1 SLOAD SWAP4 SWAP1 SWAP5 ADD SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0xA0 DUP5 ADD SWAP2 PUSH2 0xAFC SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xB28 SWAP1 PUSH2 0x1AAE JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB75 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB4A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB75 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB58 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP POP DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP5 ADD SLOAD DUP2 MSTORE PUSH1 0x6 DUP5 ADD SLOAD PUSH1 0x20 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x7 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0x8 DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE DUP3 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0x9 DUP6 ADD SLOAD DUP2 MSTORE PUSH1 0xA DUP6 ADD SLOAD DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE DUP2 MLOAD DUP1 DUP4 ADD DUP4 MSTORE PUSH1 0xB DUP6 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0xC DUP6 ADD SLOAD DUP4 MSTORE PUSH1 0xD SWAP1 SWAP5 ADD SLOAD DUP3 DUP3 ADD MSTORE DUP4 ADD MSTORE PUSH1 0x80 ADD MSTORE SWAP2 SWAP10 SWAP2 SWAP9 POP SWAP1 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST POP POP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xC47 DUP2 PUSH1 0x1F PUSH2 0x1C33 JUMP JUMPDEST LT ISZERO PUSH2 0xCAF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F766572666C6F77000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x4DA JUMP JUMPDEST PUSH2 0xCB9 DUP3 DUP5 PUSH2 0x1C33 JUMP JUMPDEST DUP5 MLOAD LT ISZERO PUSH2 0xD23 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x736C6963655F6F75744F66426F756E6473000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x4DA JUMP JUMPDEST PUSH1 0x60 DUP3 ISZERO DUP1 ISZERO PUSH2 0xD42 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0xD8C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F DUP5 AND DUP1 ISZERO PUSH1 0x20 MUL DUP2 DUP5 ADD ADD DUP6 DUP2 ADD DUP8 DUP4 ISZERO PUSH1 0x20 MUL DUP5 DUP12 ADD ADD ADD JUMPDEST DUP2 DUP4 LT ISZERO PUSH2 0xD7B JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xD63 JUMP JUMPDEST POP POP DUP6 DUP5 MSTORE PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x40 MSTORE POP JUMPDEST POP SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x60 DUP1 DUP4 MSTORE DUP4 MLOAD SWAP2 DUP3 ADD DUP5 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP3 SWAP1 MSTORE SWAP5 DUP4 ADD DUP2 SWAP1 MSTORE DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE SWAP1 SWAP2 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xDF8 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE1A PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3C PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE49 PUSH2 0xE4E JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE49 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x160 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF0B JUMPI PUSH2 0xF0B PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xF80 JUMPI PUSH2 0xF80 PUSH2 0xEB8 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xFA2 JUMPI PUSH2 0xFA2 PUSH2 0xEB8 JUMP JUMPDEST POP PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xFB7 DUP2 PUSH2 0xE93 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xFD6 JUMPI PUSH2 0xFD6 PUSH2 0xEB8 JUMP JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1008 PUSH2 0x1003 DUP3 PUSH2 0xFBC JUMP JUMPDEST PUSH2 0xF57 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 PUSH1 0x20 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0x101D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD PUSH1 0x20 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x104D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1058 DUP2 PUSH2 0xE93 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1076 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x108A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1098 PUSH2 0x1003 DUP3 PUSH2 0xF88 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP4 ADD DUP5 ADD SWAP1 DUP5 DUP2 ADD SWAP1 DUP10 DUP4 GT ISZERO PUSH2 0x10B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 DUP6 ADD JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11E8 JUMPI DUP1 CALLDATALOAD DUP6 DUP2 GT ISZERO PUSH2 0x10D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 ADD PUSH2 0x160 DUP2 DUP14 SUB PUSH1 0x1F NOT ADD SLT ISZERO PUSH2 0x10E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10F1 PUSH2 0xEE7 JUMP JUMPDEST PUSH2 0x10FC DUP10 DUP4 ADD PUSH2 0xFAC JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP10 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0x1119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1127 DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP8 DUP2 GT ISZERO PUSH2 0x113F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x114D DUP15 DUP12 DUP4 DUP7 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x100 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x120 DUP3 ADD CALLDATALOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0x119C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AA DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST PUSH2 0x120 DUP5 ADD MSTORE POP PUSH2 0x160 DUP4 ADD CALLDATALOAD DUP9 DUP2 GT ISZERO PUSH2 0x11C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D2 DUP16 DUP13 DUP4 DUP8 ADD ADD PUSH2 0xFE4 JUMP JUMPDEST SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP5 MSTORE POP SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x10BB JUMP JUMPDEST POP DUP1 SWAP7 POP POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1231 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1215 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1250 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x1278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1286 PUSH2 0x1003 DUP3 PUSH2 0xF88 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x5 SWAP2 SWAP1 SWAP2 SHL DUP3 ADD DUP4 ADD SWAP1 DUP4 DUP2 ADD SWAP1 DUP8 DUP4 GT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 DUP5 ADD SWAP3 JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x12CC JUMPI DUP4 CALLDATALOAD PUSH2 0x12BD DUP2 PUSH2 0xE93 JUMP JUMPDEST DUP3 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH2 0x12AA JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1316 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x135B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH2 0x160 DUP2 DUP6 SUB SLT ISZERO PUSH2 0xD90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x13A0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1388 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x13CD DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1385 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 DUP4 MSTORE DUP5 MLOAD ISZERO ISZERO DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE DUP2 DUP7 ADD MLOAD PUSH1 0x60 PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x1413 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 SUB DUP3 DUP7 ADD MSTORE PUSH2 0x160 DUP7 MLOAD DUP2 DUP4 MSTORE PUSH2 0x1430 DUP3 DUP5 ADD DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP8 ADD MLOAD DUP3 DUP3 SUB DUP5 DUP5 ADD MSTORE DUP1 MLOAD DUP3 MSTORE DUP4 DUP2 ADD MLOAD DUP5 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD ISZERO ISZERO DUP6 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD SWAP4 POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE DUP1 PUSH1 0x80 DUP4 ADD MLOAD AND PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xA0 DUP2 ADD MLOAD SWAP4 POP POP PUSH1 0xC0 PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x1493 PUSH1 0xC0 DUP3 ADD DUP5 PUSH2 0x13B5 JUMP JUMPDEST SWAP3 POP POP DUP3 DUP7 ADD MLOAD PUSH2 0x14B0 DUP5 DUP4 ADD DUP3 DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0x80 DUP7 ADD MLOAD DUP1 MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE SWAP3 POP PUSH1 0xA0 DUP7 ADD MLOAD SWAP3 POP PUSH2 0x1521 PUSH2 0x100 DUP3 ADD DUP5 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP1 MLOAD DUP3 DUP5 ADD MSTORE ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x1581 PUSH1 0x20 DUP3 ADD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x160 DUP1 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x15A9 PUSH2 0x180 DUP6 ADD DUP4 PUSH2 0x13B5 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x1F NOT DUP1 DUP7 DUP6 SUB ADD PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x15C7 DUP5 DUP4 PUSH2 0x13B5 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0xA0 DUP8 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0xC0 DUP8 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH1 0xE0 DUP8 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD SWAP2 POP PUSH2 0x100 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x120 DUP3 DUP2 DUP9 ADD MSTORE DUP1 DUP9 ADD MLOAD SWAP3 POP POP PUSH2 0x140 DUP2 DUP8 DUP7 SUB ADD DUP2 DUP9 ADD MSTORE PUSH2 0x1622 DUP6 DUP5 PUSH2 0x13B5 JUMP JUMPDEST SWAP1 DUP9 ADD MLOAD DUP8 DUP3 SUB SWAP1 SWAP3 ADD DUP5 DUP9 ADD MSTORE SWAP4 POP SWAP1 POP PUSH2 0x163E DUP4 DUP3 PUSH2 0x13B5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x165A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x16C1 JUMPI PUSH2 0x16C1 PUSH2 0x1661 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x1707 PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x16C8 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP3 AND SWAP4 POP PUSH1 0x4 DUP4 LT ISZERO PUSH2 0x1757 JUMPI DUP1 DUP2 DUP5 PUSH1 0x4 SUB PUSH1 0x3 SHL SHL DUP4 AND AND SWAP4 POP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x1771 JUMPI PUSH2 0x1771 PUSH2 0x1661 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1788 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xD90 DUP2 PUSH2 0xE93 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x17C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x20 DUP2 ADD SWAP3 POP CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x17F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH2 0x182C PUSH1 0x20 DUP3 ADD PUSH2 0x1812 DUP5 PUSH2 0xFAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x1845 PUSH1 0x40 DUP5 ADD DUP5 PUSH2 0x1793 JUMP JUMPDEST PUSH2 0x160 DUP1 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x185D PUSH2 0x180 DUP7 ADD DUP4 DUP6 PUSH2 0x16C8 JUMP JUMPDEST SWAP3 POP PUSH2 0x186C PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x1793 JUMP JUMPDEST SWAP3 POP PUSH1 0x1F NOT DUP1 DUP8 DUP7 SUB ADD PUSH1 0x80 DUP9 ADD MSTORE PUSH2 0x1886 DUP6 DUP6 DUP5 PUSH2 0x16C8 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 SWAP4 POP PUSH1 0xE0 DUP9 ADD CALLDATALOAD DUP5 DUP9 ADD MSTORE PUSH2 0x120 SWAP2 POP DUP4 DUP9 ADD CALLDATALOAD DUP3 DUP9 ADD MSTORE PUSH2 0x18CD DUP3 DUP10 ADD DUP10 PUSH2 0x1793 JUMP JUMPDEST SWAP5 POP SWAP2 POP PUSH2 0x140 DUP2 DUP9 DUP8 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x18E8 DUP7 DUP7 DUP6 PUSH2 0x16C8 JUMP JUMPDEST SWAP6 POP PUSH2 0x18F6 DUP2 DUP11 ADD DUP11 PUSH2 0x1793 JUMP JUMPDEST SWAP6 POP SWAP3 POP POP DUP1 DUP8 DUP7 SUB ADD DUP4 DUP9 ADD MSTORE POP PUSH2 0x12CC DUP5 DUP5 DUP4 PUSH2 0x16C8 JUMP JUMPDEST DUP1 MLOAD PUSH6 0xFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xFB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1934 PUSH2 0x1003 DUP5 PUSH2 0xFBC JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE DUP4 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD90 DUP4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1385 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD90 DUP4 DUP4 MLOAD PUSH1 0x20 DUP6 ADD PUSH2 0x1926 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1988 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1990 PUSH2 0xF11 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x19B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x19C4 PUSH1 0x60 DUP4 ADD PUSH2 0x1910 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x19D5 PUSH1 0x80 DUP4 ADD PUSH2 0x1910 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A00 DUP5 DUP3 DUP6 ADD PUSH2 0x1956 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A26 PUSH2 0xF34 JUMP JUMPDEST SWAP1 POP DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A75 DUP8 DUP3 DUP9 ADD PUSH2 0x1976 JUMP JUMPDEST SWAP5 POP POP PUSH2 0x1A85 DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP3 POP PUSH2 0x1A94 DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP2 POP PUSH2 0x1AA3 DUP7 PUSH1 0xA0 DUP8 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x1AC2 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x1AFB JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 DUP8 SUB PUSH2 0x140 DUP2 SLT ISZERO PUSH2 0x1B1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B3E DUP10 DUP3 DUP11 ADD PUSH2 0x1976 JUMP JUMPDEST SWAP7 POP POP PUSH2 0x1B4E DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP5 POP PUSH2 0x1B5D DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP4 POP PUSH2 0x1B6C DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST SWAP3 POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 DUP3 ADD SLT ISZERO PUSH2 0x1B9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA7 PUSH2 0xF34 JUMP JUMPDEST PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1BB5 DUP2 PUSH2 0xE93 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1BC5 DUP9 PUSH2 0x100 DUP10 ADD PUSH2 0x1A0C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1BEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x1C1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C29 DUP6 DUP3 MLOAD PUSH1 0x20 DUP5 ADD PUSH2 0x1926 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x1C46 JUMPI PUSH2 0x1C46 PUSH2 0x1661 JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 SHR PUSH19 0x52E82E84056F2A73F6C8F87A6651303771A673 INVALID DUP13 0xEB 0xE2 0xDB 0xE5 CHAINID PUSH28 0x390664736F6C634300080F0033000000000000000000000000000000 ","sourceMap":"189:9776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8757:317;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9080:348;;;;;;:::i;:::-;;:::i;:::-;;;7058:25:7;;;7046:2;7031:18;9080:348:0;6912:177:7;9434:529:0;;;;;;:::i;:::-;;:::i;:::-;;;7998:42:7;7986:55;;;7968:74;;7956:2;7941:18;9434:529:0;7822:226:7;3787:29:0;;;;;;;;;4363:1578;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8757:317::-;8859:20;8911:7;:14;8897:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8897:29:0;;8891:35;;8941:6;8936:112;8957:7;:14;8953:1;:18;8936:112;;;9001:10;:24;;;9026:7;9034:1;9026:10;;;;;;;;:::i;:::-;;;;;;;9001:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8992:3;8996:1;8992:6;;;;;;;;:::i;:::-;;;;;;;;;;:45;8973:3;;;;:::i;:::-;;;;8936:112;;;;8757:317;;;;;:::o;9080:348::-;9152:7;9171:23;9211:9;:16;9197:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9197:31:0;;9171:57;;9243:6;9238:102;9259:9;:16;9255:1;:20;9238:102;;;9308:9;9318:1;9308:12;;;;;;;;:::i;:::-;;;;;;;:21;;;9296:6;9303:1;9296:9;;;;;;;;:::i;:::-;;;;;;;;;;:33;9277:3;;;;:::i;:::-;;;;9238:102;;;;9349:17;9380:6;9369:18;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9369:18:0;;;;;;;;;9405:15;;9369:18;9405:15;;;;;9080:348;-1:-1:-1;;;;9080:348:0:o;9434:529::-;9503:7;9526:10;;:37;;;;;:10;;;;;:27;;:37;;9554:8;;;;9526:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9522:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9621:23:0;9647:18;9654:10;9647:18;:::i;:::-;9621:44;-1:-1:-1;9684:48:0;;;;;9680:267;;9752:14;9780:43;9786:10;9798:1;9821;9801:10;:17;:21;;;;:::i;:::-;9780:5;:43::i;:::-;9769:66;;;;;;;;;;;;:::i;:::-;9752:83;-1:-1:-1;9853:13:0;;-1:-1:-1;;;9853:13:0;9680:267;9905:27;;;;;15693:2:7;9905:27:0;;;15675:21:7;15732:2;15712:18;;;15705:30;15771:18;15751;;;15744:46;15807:18;;9905:27:0;;;;;;;;4363:1578;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;4463:15:0;;:::i;:::-;4494:10;;:37;;;;;:10;;;;;:29;;:37;;4524:6;;4494:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4490:1445;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4589:23:0;4615:18;4622:10;4615:18;:::i;:::-;4589:44;-1:-1:-1;4652:45:0;;;;;4648:1277;;4718:28;4748:27;4777:28;4807:30;4852:43;4858:10;4870:1;4893;4873:10;:17;:21;;;;:::i;4852:43::-;4841:102;;;;;;;;;;;;:::i;:::-;4984:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4984:101:0;;;;;;;;;;;;5065:19;4984:101;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4984:101:0;;;4961:125;;;;;;;4969:13;4961:125;;;;;;;;;;;;;;;;;;;;4717:226;;-1:-1:-1;4717:226:0;;-1:-1:-1;4717:226:0;;-1:-1:-1;4717:226:0;;-1:-1:-1;4969:13:0;;4984:101;;4969:13;;4961:125;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4363:1578;;;:::o;4648:1277::-;5111:60;;;;;5107:818;;5192:28;5222:27;5251:28;5281:30;5313:41;5369:43;5375:10;5387:1;5410;5390:10;:17;:21;;;;:::i;5369:43::-;5358:123;;;;;;;;;;;;:::i;:::-;5522:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5522:111:0;;;;;-1:-1:-1;5522:111:0;;;;;5499:135;;;;;;;5507:13;5499:135;;;;;;;;;;;;;;;;;;;;5191:290;;-1:-1:-1;5191:290:0;;-1:-1:-1;5191:290:0;;-1:-1:-1;5191:290:0;;-1:-1:-1;5191:290:0;;-1:-1:-1;5507:13:0;;5522:111;;5507:13;;5499:135;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4363:1578;;;:::o;5107:818::-;5659:37;;;;;5655:270;;5716:15;5733:20;5768:43;5774:10;5786:1;5809;5789:10;:17;:21;;;;:::i;5768:43::-;5757:74;;;;;;;;;;;;:::i;:::-;5715:116;;;;5857:37;;;;;;;;5872:4;5857:37;;;;;;5878:7;5857:37;;;;5887:6;5857:37;;;5896:13;5849:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5849:61:0;;;-1:-1:-1;;5849:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5849:61:0;;;;-1:-1:-1;;;5849:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4363:1578:0;;-1:-1:-1;;;;;;;4363:1578:0:o;5655:270::-;4575:1360;4543:1392;4490:1445;4363:1578;;;:::o;5947:2804::-;6093:12;6145:7;6129:12;6145:7;6139:2;6129:12;:::i;:::-;:23;;6121:50;;;;;;;23391:2:7;6121:50:0;;;23373:21:7;23430:2;23410:18;;;23403:30;23469:16;23449:18;;;23442:44;23503:18;;6121:50:0;23189:338:7;6121:50:0;6206:16;6215:7;6206:6;:16;:::i;:::-;6189:6;:13;:33;;6181:63;;;;;;;23734:2:7;6181:63:0;;;23716:21:7;23773:2;23753:18;;;23746:30;23812:19;23792:18;;;23785:47;23849:18;;6181:63:0;23532:341:7;6181:63:0;6255:22;6318:15;;6346:1967;;;;8454:4;8448:11;8435:24;;8640:1;8629:9;8622:20;8688:4;8677:9;8673:20;8667:4;8660:34;6311:2397;;6346:1967;6528:4;6522:11;6509:24;;7187:2;7178:7;7174:16;7569:9;7562:17;7556:4;7552:28;7540:9;7529;7525:25;7521:60;7617:7;7613:2;7609:16;7869:6;7855:9;7848:17;7842:4;7838:28;7826:9;7818:6;7814:22;7810:57;7806:70;7643:425;7902:3;7898:2;7895:11;7643:425;;;8040:9;;8029:21;;7943:4;7935:13;;;;7975;7643:425;;;-1:-1:-1;;8086:26:0;;;8294:2;8277:11;-1:-1:-1;;8273:25:0;8267:4;8260:39;-1:-1:-1;6311:2397:0;-1:-1:-1;8735:9:0;-1:-1:-1;5947:2804:0;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:167:7;113:42;106:5;102:54;95:5;92:65;82:93;;171:1;168;161:12;82:93;14:167;:::o;186:184::-;238:77;235:1;228:88;335:4;332:1;325:15;359:4;356:1;349:15;375:255;447:2;441:9;489:6;477:19;;526:18;511:34;;547:22;;;508:62;505:88;;;573:18;;:::i;:::-;609:2;602:22;375:255;:::o;635:253::-;707:2;701:9;749:4;737:17;;784:18;769:34;;805:22;;;766:62;763:88;;;831:18;;:::i;893:257::-;965:4;959:11;;;997:17;;1044:18;1029:34;;1065:22;;;1026:62;1023:88;;;1091:18;;:::i;1155:334::-;1226:2;1220:9;1282:2;1272:13;;-1:-1:-1;;1268:86:7;1256:99;;1385:18;1370:34;;1406:22;;;1367:62;1364:88;;;1432:18;;:::i;:::-;1468:2;1461:22;1155:334;;-1:-1:-1;1155:334:7:o;1494:196::-;1567:4;1600:18;1592:6;1589:30;1586:56;;;1622:18;;:::i;:::-;-1:-1:-1;1667:1:7;1663:14;1679:4;1659:25;;1494:196::o;1695:147::-;1763:20;;1792:44;1763:20;1792:44;:::i;:::-;1695:147;;;:::o;1847:245::-;1895:4;1928:18;1920:6;1917:30;1914:56;;;1950:18;;:::i;:::-;-1:-1:-1;2007:2:7;1995:15;-1:-1:-1;;1991:88:7;2081:4;1987:99;;1847:245::o;2097:462::-;2139:5;2192:3;2185:4;2177:6;2173:17;2169:27;2159:55;;2210:1;2207;2200:12;2159:55;2246:6;2233:20;2277:48;2293:31;2321:2;2293:31;:::i;:::-;2277:48;:::i;:::-;2350:2;2341:7;2334:19;2396:3;2389:4;2384:2;2376:6;2372:15;2368:26;2365:35;2362:55;;;2413:1;2410;2403:12;2362:55;2478:2;2471:4;2463:6;2459:17;2452:4;2443:7;2439:18;2426:55;2526:1;2501:16;;;2519:4;2497:27;2490:38;;;;2505:7;2097:462;-1:-1:-1;;;2097:462:7:o;2564:2709::-;2707:6;2715;2768:2;2756:9;2747:7;2743:23;2739:32;2736:52;;;2784:1;2781;2774:12;2736:52;2823:9;2810:23;2842:44;2880:5;2842:44;:::i;:::-;2905:5;-1:-1:-1;2929:2:7;2967:18;;;2954:32;3005:18;3035:14;;;3032:34;;;3062:1;3059;3052:12;3032:34;3100:6;3089:9;3085:22;3075:32;;3145:7;3138:4;3134:2;3130:13;3126:27;3116:55;;3167:1;3164;3157:12;3116:55;3203:2;3190:16;3226:73;3242:56;3295:2;3242:56;:::i;3226:73::-;3333:15;;;3415:1;3411:10;;;;3403:19;;3399:28;;;3364:12;;;;3439:19;;;3436:39;;;3471:1;3468;3461:12;3436:39;3503:2;3499;3495:11;3515:1728;3531:6;3526:3;3523:15;3515:1728;;;3617:3;3604:17;3653:2;3640:11;3637:19;3634:39;;;3669:1;3666;3659:12;3634:39;3696:20;;3827:6;3740:16;;;-1:-1:-1;;3736:89:7;3732:102;3729:122;;;3847:1;3844;3837:12;3729:122;3879:22;;:::i;:::-;3930:31;3957:2;3953;3949:11;3930:31;:::i;:::-;3921:7;3914:48;4021:2;4017;4013:11;4000:25;3995:2;3986:7;3982:16;3975:51;4076:2;4072;4068:11;4055:25;4109:2;4099:8;4096:16;4093:36;;;4125:1;4122;4115:12;4093:36;4167:53;4212:7;4207:2;4196:8;4192:2;4188:17;4184:26;4167:53;:::i;:::-;4162:2;4153:7;4149:16;4142:79;;4271:3;4267:2;4263:12;4250:26;4305:2;4295:8;4292:16;4289:36;;;4321:1;4318;4311:12;4289:36;4363:53;4408:7;4403:2;4392:8;4388:2;4384:17;4380:26;4363:53;:::i;:::-;4358:2;4349:7;4345:16;4338:79;;4477:3;4473:2;4469:12;4456:26;4450:3;4441:7;4437:17;4430:53;4543:3;4539:2;4535:12;4522:26;4516:3;4507:7;4503:17;4496:53;4609:3;4605:2;4601:12;4588:26;4582:3;4573:7;4569:17;4562:53;4675:3;4671:2;4667:12;4654:26;4648:3;4639:7;4635:17;4628:53;4741:3;4737:2;4733:12;4720:26;4714:3;4705:7;4701:17;4694:53;4770:3;4823:2;4819;4815:11;4802:25;4856:2;4846:8;4843:16;4840:36;;;4872:1;4869;4862:12;4840:36;4915:53;4960:7;4955:2;4944:8;4940:2;4936:17;4932:26;4915:53;:::i;:::-;4909:3;4900:7;4896:17;4889:80;;5019:6;5015:2;5011:15;4998:29;5056:2;5046:8;5043:16;5040:36;;;5072:1;5069;5062:12;5040:36;5114:53;5159:7;5154:2;5143:8;5139:2;5135:17;5131:26;5114:53;:::i;:::-;5096:16;;;5089:79;;;;-1:-1:-1;5181:20:7;;-1:-1:-1;5221:12:7;;;;3548;;3515:1728;;;3519:3;5262:5;5252:15;;;;;;;;2564:2709;;;;;:::o;5278:632::-;5449:2;5501:21;;;5571:13;;5474:18;;;5593:22;;;5420:4;;5449:2;5672:15;;;;5646:2;5631:18;;;5420:4;5715:169;5729:6;5726:1;5723:13;5715:169;;;5790:13;;5778:26;;5859:15;;;;5824:12;;;;5751:1;5744:9;5715:169;;;-1:-1:-1;5901:3:7;;5278:632;-1:-1:-1;;;;;;5278:632:7:o;5915:992::-;5999:6;6030:2;6073;6061:9;6052:7;6048:23;6044:32;6041:52;;;6089:1;6086;6079:12;6041:52;6129:9;6116:23;6162:18;6154:6;6151:30;6148:50;;;6194:1;6191;6184:12;6148:50;6217:22;;6270:4;6262:13;;6258:27;-1:-1:-1;6248:55:7;;6299:1;6296;6289:12;6248:55;6335:2;6322:16;6358:73;6374:56;6427:2;6374:56;:::i;6358:73::-;6465:15;;;6547:1;6543:10;;;;6535:19;;6531:28;;;6496:12;;;;6571:19;;;6568:39;;;6603:1;6600;6593:12;6568:39;6627:11;;;;6647:230;6663:6;6658:3;6655:15;6647:230;;;6743:3;6730:17;6760:44;6798:5;6760:44;:::i;:::-;6817:18;;6680:12;;;;6855;;;;6647:230;;;6896:5;5915:992;-1:-1:-1;;;;;;;5915:992:7:o;7094:591::-;7164:6;7172;7225:2;7213:9;7204:7;7200:23;7196:32;7193:52;;;7241:1;7238;7231:12;7193:52;7281:9;7268:23;7310:18;7351:2;7343:6;7340:14;7337:34;;;7367:1;7364;7357:12;7337:34;7405:6;7394:9;7390:22;7380:32;;7450:7;7443:4;7439:2;7435:13;7431:27;7421:55;;7472:1;7469;7462:12;7421:55;7512:2;7499:16;7538:2;7530:6;7527:14;7524:34;;;7554:1;7551;7544:12;7524:34;7599:7;7594:2;7585:6;7581:2;7577:15;7573:24;7570:37;7567:57;;;7620:1;7617;7610:12;7567:57;7651:2;7643:11;;;;;7673:6;;-1:-1:-1;7094:591:7;;-1:-1:-1;;;;7094:591:7:o;8303:393::-;8395:6;8448:2;8436:9;8427:7;8423:23;8419:32;8416:52;;;8464:1;8461;8454:12;8416:52;8504:9;8491:23;8537:18;8529:6;8526:30;8523:50;;;8569:1;8566;8559:12;8523:50;8592:22;;8648:3;8630:16;;;8626:26;8623:46;;;8665:1;8662;8655:12;8701:258;8773:1;8783:113;8797:6;8794:1;8791:13;8783:113;;;8873:11;;;8867:18;8854:11;;;8847:39;8819:2;8812:10;8783:113;;;8914:6;8911:1;8908:13;8905:48;;;8949:1;8940:6;8935:3;8931:16;8924:27;8905:48;;8701:258;;;:::o;8964:317::-;9006:3;9044:5;9038:12;9071:6;9066:3;9059:19;9087:63;9143:6;9136:4;9131:3;9127:14;9120:4;9113:5;9109:16;9087:63;:::i;:::-;9195:2;9183:15;-1:-1:-1;;9179:88:7;9170:98;;;;9270:4;9166:109;;8964:317;-1:-1:-1;;8964:317:7:o;9717:2043::-;9945:4;9974:2;10003;9992:9;9985:21;10062:6;10056:13;10049:21;10042:29;10037:2;10026:9;10022:18;10015:57;10091:4;10151:2;10143:6;10139:15;10133:22;10126:4;10115:9;10111:20;10104:52;10203:2;10195:6;10191:15;10185:22;10244:4;10238:3;10227:9;10223:19;10216:33;10269:52;10316:3;10305:9;10301:19;10287:12;10269:52;:::i;:::-;10258:63;;10366:9;10361:3;10357:19;10352:2;10341:9;10337:18;10330:47;10396:6;10439;10433:13;10467:2;10462:3;10455:15;10493:47;10536:2;10531:3;10527:12;10511:14;10493:47;:::i;:::-;10479:61;;;10589:2;10581:6;10577:15;10571:22;10635:3;10627:6;10623:16;10618:2;10613:3;10609:12;10602:38;10670:14;10664:21;10656:6;10649:37;10745:2;10729:14;10725:23;10719:30;10714:2;10706:6;10702:15;10695:55;10823:2;10807:14;10803:23;10797:30;10790:38;10783:46;10778:2;10770:6;10766:15;10759:71;10887:4;10871:14;10867:25;10861:32;10839:54;;10912:14;10981:2;10965:14;10961:23;10954:4;10946:6;10942:17;10935:50;11056:2;11049:3;11033:14;11029:24;11023:31;11019:40;11013:3;11005:6;11001:16;10994:66;;11117:3;11101:14;11097:24;11091:31;11069:53;;;11156:4;11150:3;11142:6;11138:16;11131:30;11183:52;11229:4;11221:6;11217:17;11201:14;11183:52;:::i;:::-;11170:65;;;11284:2;11276:6;11272:15;11266:22;11297:57;11350:2;11345:3;11341:12;11325:14;9361:12;;9349:25;;9423:4;9412:16;;;9406:23;9390:14;;9383:47;9286:150;11297:57;-1:-1:-1;11403:4:7;11391:17;;11385:24;9361:12;;11471:3;11462:13;;9349:25;9423:4;9412:16;;9406:23;9390:14;;;9383:47;11385:24;-1:-1:-1;11525:3:7;11513:16;;11507:23;9361:12;;11592:4;11583:14;;9349:25;9423:4;9412:16;;9406:23;9390:14;;;9383:47;11507:23;-1:-1:-1;11647:3:7;11639:6;11635:16;11629:23;11607:45;;11661:71;11724:6;11719:3;11715:16;11699:14;9530:12;;9544:42;9526:61;9514:74;;9634:4;9623:16;;;9617:23;9361:12;;9691:14;;;9349:25;9412:16;9406:23;9390:14;;;;9383:47;9441:271;11661:71;-1:-1:-1;11749:5:7;9717:2043;-1:-1:-1;;;;;9717:2043:7:o;11765:184::-;11817:77;11814:1;11807:88;11914:4;11911:1;11904:15;11938:4;11935:1;11928:15;11954:1556;12145:2;12134:9;12127:21;12157:53;12206:2;12195:9;12191:18;12182:6;12176:13;7767:42;7756:54;7744:67;;7690:127;12157:53;12264:2;12256:6;12252:15;12246:22;12241:2;12230:9;12226:18;12219:50;12108:4;12316:2;12308:6;12304:15;12298:22;12339:6;12381:2;12376;12365:9;12361:18;12354:30;12407:52;12454:3;12443:9;12439:19;12425:12;12407:52;:::i;:::-;12393:66;;12508:2;12500:6;12496:15;12490:22;-1:-1:-1;;12662:2:7;12650:9;12642:6;12638:22;12634:31;12628:3;12617:9;12613:19;12606:60;12689:41;12723:6;12707:14;12689:41;:::i;:::-;12675:55;;12785:3;12777:6;12773:16;12767:23;12761:3;12750:9;12746:19;12739:52;12846:3;12838:6;12834:16;12828:23;12822:3;12811:9;12807:19;12800:52;12907:3;12899:6;12895:16;12889:23;12883:3;12872:9;12868:19;12861:52;12950:3;12942:6;12938:16;12932:23;12922:33;;12974:3;13013:2;13008;12997:9;12993:18;12986:30;13053:2;13045:6;13041:15;13035:22;13025:32;;;13076:3;13115:2;13110;13099:9;13095:18;13088:30;13167:2;13159:6;13155:15;13149:22;13127:44;;;13190:3;13257:2;13245:9;13237:6;13233:22;13229:31;13224:2;13213:9;13209:18;13202:59;13284:41;13318:6;13302:14;13284:41;:::i;:::-;13362:15;;;13356:22;13418;;;13414:31;;;13394:18;;;13387:59;13270:55;-1:-1:-1;13356:22:7;-1:-1:-1;13463:41:7;13270:55;13356:22;13463:41;:::i;:::-;13455:49;11954:1556;-1:-1:-1;;;;;;11954:1556:7:o;13515:184::-;13585:6;13638:2;13626:9;13617:7;13613:23;13609:32;13606:52;;;13654:1;13651;13644:12;13606:52;-1:-1:-1;13677:16:7;;13515:184;-1:-1:-1;13515:184:7:o;13704:::-;13756:77;13753:1;13746:88;13853:4;13850:1;13843:15;13877:4;13874:1;13867:15;13893:195;13932:3;13963:66;13956:5;13953:77;13950:103;;14033:18;;:::i;:::-;-1:-1:-1;14080:1:7;14069:13;;13893:195::o;14093:325::-;14181:6;14176:3;14169:19;14233:6;14226:5;14219:4;14214:3;14210:14;14197:43;;14285:1;14278:4;14269:6;14264:3;14260:16;14256:27;14249:38;14151:3;14407:4;-1:-1:-1;;14332:2:7;14324:6;14320:15;14316:88;14311:3;14307:98;14303:109;14296:116;;14093:325;;;;:::o;14423:244::-;14580:2;14569:9;14562:21;14543:4;14600:61;14657:2;14646:9;14642:18;14634:6;14626;14600:61;:::i;:::-;14592:69;14423:244;-1:-1:-1;;;;14423:244:7:o;14672:407::-;14755:5;14795;14789:12;14837:4;14830:5;14826:16;14820:23;14862:66;14954:2;14950;14946:11;14937:20;;14980:1;14972:6;14969:13;14966:107;;;15060:2;15054;15044:6;15041:1;15037:14;15034:1;15030:22;15026:31;15022:2;15018:40;15014:49;15005:58;;14966:107;;;;14672:407;;;:::o;15084:125::-;15124:4;15152:1;15149;15146:8;15143:34;;;15157:18;;:::i;:::-;-1:-1:-1;15194:9:7;;15084:125::o;15214:272::-;15292:6;15345:2;15333:9;15324:7;15320:23;15316:32;15313:52;;;15361:1;15358;15351:12;15313:52;15393:9;15387:16;15412:44;15450:5;15412:44;:::i;15836:559::-;15894:5;15901:6;15961:3;15948:17;16043:66;16032:8;16016:14;16012:29;16008:102;15988:18;15984:127;15974:155;;16125:1;16122;16115:12;15974:155;16153:33;;16257:4;16244:18;;;-1:-1:-1;16205:21:7;;-1:-1:-1;16285:18:7;16274:30;;16271:50;;;16317:1;16314;16307:12;16271:50;16364:6;16348:14;16344:27;16337:5;16333:39;16330:59;;;16385:1;16382;16375:12;16330:59;15836:559;;;;;:::o;16400:1859::-;16593:2;16582:9;16575:21;16605:66;16667:2;16656:9;16652:18;16624:26;16643:6;16624:26;:::i;:::-;7767:42;7756:54;7744:67;;7690:127;16605:66;16732:2;16724:6;16720:15;16707:29;16702:2;16691:9;16687:18;16680:57;16556:4;16780:55;16831:2;16823:6;16819:15;16811:6;16780:55;:::i;:::-;16854:6;16896:2;16891;16880:9;16876:18;16869:30;16922:74;16991:3;16980:9;16976:19;16962:12;16948;16922:74;:::i;:::-;16908:88;;17043:55;17094:2;17086:6;17082:15;17074:6;17043:55;:::i;:::-;17005:93;;-1:-1:-1;;17248:2:7;17236:9;17228:6;17224:22;17220:31;17214:3;17203:9;17199:19;17192:60;17275:65;17333:6;17317:14;17301;17275:65;:::i;:::-;17261:79;;17402:3;17394:6;17390:16;17377:30;17371:3;17360:9;17356:19;17349:59;17470:3;17462:6;17458:16;17445:30;17439:3;17428:9;17424:19;17417:59;17538:3;17530:6;17526:16;17513:30;17507:3;17496:9;17492:19;17485:59;17563:3;17553:13;;17627:3;17619:6;17615:16;17602:30;17597:2;17586:9;17582:18;17575:58;17652:3;17642:13;;17716:2;17708:6;17704:15;17691:29;17686:2;17675:9;17671:18;17664:57;17768:55;17819:2;17811:6;17807:15;17799:6;17768:55;:::i;:::-;17730:93;;;;17842:3;17909:2;17897:9;17889:6;17885:22;17881:31;17876:2;17865:9;17861:18;17854:59;17936:65;17994:6;17978:14;17962;17936:65;:::i;:::-;17922:79;;18048:55;18099:2;18091:6;18087:15;18079:6;18048:55;:::i;:::-;18010:93;;;;;18167:2;18155:9;18147:6;18143:22;18139:31;18134:2;18123:9;18119:18;18112:59;;18188:65;18246:6;18230:14;18214;18188:65;:::i;18264:171::-;18342:13;;18395:14;18384:26;;18374:37;;18364:65;;18425:1;18422;18415:12;18440:307;18515:5;18544:52;18560:35;18588:6;18560:35;:::i;18544:52::-;18535:61;;18619:6;18612:5;18605:21;18659:3;18650:6;18645:3;18641:16;18638:25;18635:45;;;18676:1;18673;18666:12;18635:45;18689:52;18734:6;18727:4;18720:5;18716:16;18711:3;18689:52;:::i;18752:235::-;18805:5;18858:3;18851:4;18843:6;18839:17;18835:27;18825:55;;18876:1;18873;18866:12;18825:55;18898:83;18977:3;18968:6;18962:13;18955:4;18947:6;18943:17;18898:83;:::i;18992:806::-;19060:5;19108:4;19096:9;19091:3;19087:19;19083:30;19080:50;;;19126:1;19123;19116:12;19080:50;19148:22;;:::i;:::-;19139:31;;19199:9;19193:16;19186:5;19179:31;19263:2;19252:9;19248:18;19242:25;19237:2;19230:5;19226:14;19219:49;19313:2;19302:9;19298:18;19292:25;19362:7;19355:15;19348:23;19339:7;19336:36;19326:64;;19386:1;19383;19376:12;19326:64;19417:2;19406:14;;19399:31;19462:48;19506:2;19491:18;;19462:48;:::i;:::-;19457:2;19450:5;19446:14;19439:72;19544:49;19588:3;19577:9;19573:19;19544:49;:::i;:::-;19538:3;19531:5;19527:15;19520:74;19638:3;19627:9;19623:19;19617:26;19666:18;19658:6;19655:30;19652:50;;;19698:1;19695;19688:12;19652:50;19735:56;19787:3;19778:6;19767:9;19763:22;19735:56;:::i;:::-;19729:3;19722:5;19718:15;19711:81;;18992:806;;;;:::o;19803:281::-;19870:5;19918:4;19906:9;19901:3;19897:19;19893:30;19890:50;;;19936:1;19933;19926:12;19890:50;19958:22;;:::i;:::-;19949:31;;20009:9;20003:16;19996:5;19989:31;20073:2;20062:9;20058:18;20052:25;20047:2;20040:5;20036:14;20029:49;19803:281;;;;:::o;20089:750::-;20287:6;20295;20303;20311;20364:3;20352:9;20343:7;20339:23;20335:33;20332:53;;;20381:1;20378;20371:12;20332:53;20414:9;20408:16;20447:18;20439:6;20436:30;20433:50;;;20479:1;20476;20469:12;20433:50;20502:72;20566:7;20557:6;20546:9;20542:22;20502:72;:::i;:::-;20492:82;;;20593:67;20652:7;20647:2;20636:9;20632:18;20593:67;:::i;:::-;20583:77;;20679:67;20738:7;20733:2;20722:9;20718:18;20679:67;:::i;:::-;20669:77;;20765:68;20825:7;20819:3;20808:9;20804:19;20765:68;:::i;:::-;20755:78;;20089:750;;;;;;;:::o;20844:437::-;20923:1;20919:12;;;;20966;;;20987:61;;21041:4;21033:6;21029:17;21019:27;;20987:61;21094:2;21086:6;21083:14;21063:18;21060:38;21057:218;;21131:77;21128:1;21121:88;21232:4;21229:1;21222:15;21260:4;21257:1;21250:15;21057:218;;20844:437;;;:::o;21286:1241::-;21528:6;21536;21544;21552;21560;21604:9;21595:7;21591:23;21634:3;21630:2;21626:12;21623:32;;;21651:1;21648;21641:12;21623:32;21684:9;21678:16;21717:18;21709:6;21706:30;21703:50;;;21749:1;21746;21739:12;21703:50;21772:72;21836:7;21827:6;21816:9;21812:22;21772:72;:::i;:::-;21762:82;;;21863:67;21922:7;21917:2;21906:9;21902:18;21863:67;:::i;:::-;21853:77;;21949:67;22008:7;22003:2;21992:9;21988:18;21949:67;:::i;:::-;21939:77;;22035:68;22095:7;22089:3;22078:9;22074:19;22035:68;:::i;:::-;22025:78;;22196:2;22127:66;22123:2;22119:75;22115:84;22112:104;;;22212:1;22209;22202:12;22112:104;;22238:22;;:::i;:::-;22305:3;22294:9;22290:19;22284:26;22319:46;22357:7;22319:46;:::i;:::-;22374:22;;22428:68;22488:7;22482:3;22467:19;;22428:68;:::i;:::-;22423:2;22416:5;22412:14;22405:92;22516:5;22506:15;;;21286:1241;;;;;;;;:::o;22532:519::-;22621:6;22629;22682:2;22670:9;22661:7;22657:23;22653:32;22650:52;;;22698:1;22695;22688:12;22650:52;22727:9;22721:16;22711:26;;22781:2;22770:9;22766:18;22760:25;22808:18;22800:6;22797:30;22794:50;;;22840:1;22837;22830:12;22794:50;22863:22;;22916:4;22908:13;;22904:27;-1:-1:-1;22894:55:7;;22945:1;22942;22935:12;22894:55;22968:77;23037:7;23032:2;23026:9;23021:2;23017;23013:11;22968:77;:::i;:::-;22958:87;;;22532:519;;;;;:::o;23056:128::-;23096:3;23127:1;23123:6;23120:1;23117:13;23114:39;;;23133:18;;:::i;:::-;-1:-1:-1;23169:9:7;;23056:128::o"},"gasEstimates":{"creation":{"codeDepositCost":"1459400","executionCost":"infinite","totalCost":"infinite"},"external":{"entryPoint()":"2335","getCodeHashes(address[])":"infinite","getSenderAddress(bytes)":"infinite","getUserOpHashes(address,(address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"infinite","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"infinite"},"internal":{"slice(bytes memory,uint256,uint256)":"infinite"}},"methodIdentifiers":{"entryPoint()":"b0d691fe","getCodeHashes(address[])":"7b34b621","getSenderAddress(bytes)":"9b249f69","getUserOpHashes(address,(address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"3024e00c","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"getCodeHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"getUserOpHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"ret\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"internalType\":\"struct EntryPointWrapper.FailedOpStatus\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"selectorType\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct EntryPointWrapper.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPointWrapper.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct EntryPointWrapper.Response\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bundler/EntryPointWrapper.sol\":\"EntryPointWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/bundler/EntryPointWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\ncontract EntryPointWrapper {\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n struct FailedOpStatus {\\n bool status;\\n uint256 opIndex;\\n string reason;\\n }\\n\\n struct Response {\\n string selectorType;\\n ReturnInfo returnInfo;\\n StakeInfo senderInfo;\\n StakeInfo factoryInfo;\\n StakeInfo paymasterInfo;\\n AggregatorStakeInfo aggregatorInfo;\\n }\\n\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n IEntryPoint public entryPoint;\\n\\n StakeInfo private emptyStakeInfo = StakeInfo(0, 0);\\n AggregatorStakeInfo private emptyAggregatorInfo = AggregatorStakeInfo(address(0), emptyStakeInfo);\\n ReturnInfo private emptyReturnInfo = ReturnInfo(0, 0, false, 0, 0, new bytes(0));\\n Response private emptyResponse = Response(\\\"\\\", emptyReturnInfo, emptyStakeInfo, emptyStakeInfo, emptyStakeInfo, emptyAggregatorInfo);\\n FailedOpStatus private emptyFailedOp = FailedOpStatus(false, 0, \\\"\\\");\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n }\\n\\n function simulateValidation(UserOperation calldata userOp) external returns (FailedOpStatus memory, Response memory) {\\n try entryPoint.simulateValidation(userOp) {}\\n catch (bytes memory revertData) {\\n bytes4 receivedSelector = bytes4(revertData);\\n\\n if (receivedSelector == ValidationResult.selector) {\\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo));\\n return (emptyFailedOp, Response('ValidationResult', returnInfo, senderInfo, factoryInfo, paymasterInfo, emptyAggregatorInfo));\\n } else if (receivedSelector == ValidationResultWithAggregation.selector) {\\n (ReturnInfo memory returnInfo, StakeInfo memory senderInfo, StakeInfo memory factoryInfo, StakeInfo memory paymasterInfo, AggregatorStakeInfo memory aggregatorInfo) = abi.decode(slice(revertData, 4, revertData.length - 4), (ReturnInfo, StakeInfo, StakeInfo, StakeInfo, AggregatorStakeInfo));\\n return (emptyFailedOp, Response('ValidationResultWithAggregation', returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo));\\n } else if (receivedSelector == FailedOp.selector){\\n (uint256 opIndex, string memory reason) = abi.decode(slice(revertData, 4, revertData.length - 4), (uint256, string));\\n return (FailedOpStatus(true, opIndex, reason), emptyResponse);\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function getUserOpHashes(IEntryPoint entryPoint, UserOperation[] memory userOps) public view returns (bytes32[] memory ret) {\\n ret = new bytes32[](userOps.length);\\n for (uint i = 0; i < userOps.length; i++) {\\n ret[i] = entryPoint.getUserOpHash(userOps[i]);\\n }\\n return ret;\\n }\\n\\n function getCodeHashes(address[] memory addresses) public view returns (bytes32) {\\n bytes32[] memory hashes = new bytes32[](addresses.length);\\n for (uint i = 0; i < addresses.length; i++) {\\n hashes[i] = addresses[i].codehash;\\n }\\n bytes memory data = abi.encode(hashes);\\n return (keccak256(data));\\n }\\n\\n function getSenderAddress(bytes calldata initCode) external returns (address) {\\n try entryPoint.getSenderAddress(initCode) {}\\n catch (bytes memory revertData) {\\n bytes4 receivedSelector = bytes4(revertData);\\n\\n if (receivedSelector == SenderAddressResult.selector) {\\n address sender = abi.decode(slice(revertData, 4, revertData.length - 4), (address));\\n return sender;\\n } else {\\n revert (\\\"Invalid initCode\\\");\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5c23023455b0482b74cc944c9e92638e1c7cdfe3f5bf58df0d146b1263ed8654\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[{"astId":99,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"entryPoint","offset":0,"slot":"0","type":"t_contract(IEntryPoint)998"},{"astId":106,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyStakeInfo","offset":0,"slot":"1","type":"t_struct(StakeInfo)20_storage"},{"astId":116,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyAggregatorInfo","offset":0,"slot":"3","type":"t_struct(AggregatorStakeInfo)26_storage"},{"astId":130,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyReturnInfo","offset":0,"slot":"6","type":"t_struct(ReturnInfo)15_storage"},{"astId":141,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyResponse","offset":0,"slot":"10","type":"t_struct(Response)51_storage"},{"astId":149,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"emptyFailedOp","offset":0,"slot":"24","type":"t_struct(FailedOpStatus)33_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes_storage":{"encoding":"bytes","label":"bytes","numberOfBytes":"32"},"t_contract(IEntryPoint)998":{"encoding":"inplace","label":"contract IEntryPoint","numberOfBytes":"20"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_struct(AggregatorStakeInfo)26_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.AggregatorStakeInfo","members":[{"astId":22,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"aggregator","offset":0,"slot":"0","type":"t_address"},{"astId":25,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"stakeInfo","offset":0,"slot":"1","type":"t_struct(StakeInfo)20_storage"}],"numberOfBytes":"96"},"t_struct(FailedOpStatus)33_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.FailedOpStatus","members":[{"astId":28,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"status","offset":0,"slot":"0","type":"t_bool"},{"astId":30,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"opIndex","offset":0,"slot":"1","type":"t_uint256"},{"astId":32,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"reason","offset":0,"slot":"2","type":"t_string_storage"}],"numberOfBytes":"96"},"t_struct(Response)51_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.Response","members":[{"astId":35,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"selectorType","offset":0,"slot":"0","type":"t_string_storage"},{"astId":38,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"returnInfo","offset":0,"slot":"1","type":"t_struct(ReturnInfo)15_storage"},{"astId":41,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"senderInfo","offset":0,"slot":"5","type":"t_struct(StakeInfo)20_storage"},{"astId":44,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"factoryInfo","offset":0,"slot":"7","type":"t_struct(StakeInfo)20_storage"},{"astId":47,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"paymasterInfo","offset":0,"slot":"9","type":"t_struct(StakeInfo)20_storage"},{"astId":50,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"aggregatorInfo","offset":0,"slot":"11","type":"t_struct(AggregatorStakeInfo)26_storage"}],"numberOfBytes":"448"},"t_struct(ReturnInfo)15_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.ReturnInfo","members":[{"astId":4,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"preOpGas","offset":0,"slot":"0","type":"t_uint256"},{"astId":6,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"prefund","offset":0,"slot":"1","type":"t_uint256"},{"astId":8,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"sigFailed","offset":0,"slot":"2","type":"t_bool"},{"astId":10,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"validAfter","offset":1,"slot":"2","type":"t_uint48"},{"astId":12,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"validUntil","offset":7,"slot":"2","type":"t_uint48"},{"astId":14,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"paymasterContext","offset":0,"slot":"3","type":"t_bytes_storage"}],"numberOfBytes":"128"},"t_struct(StakeInfo)20_storage":{"encoding":"inplace","label":"struct EntryPointWrapper.StakeInfo","members":[{"astId":17,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"stake","offset":0,"slot":"0","type":"t_uint256"},{"astId":19,"contract":"contracts/bundler/EntryPointWrapper.sol:EntryPointWrapper","label":"unstakeDelaySec","offset":0,"slot":"1","type":"t_uint256"}],"numberOfBytes":"64"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint48":{"encoding":"inplace","label":"uint48","numberOfBytes":"6"}}},"userdoc":{"errors":{"FailedOp(uint256,string)":[{"notice":"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it."}],"SenderAddressResult(address)":[{"notice":"return value of getSenderAddress"}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"notice":"Successful result from simulateValidation."}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"notice":"Successful result from simulateValidation, if the account returns a signature aggregator"}]},"kind":"user","methods":{},"version":1}}},"contracts/interfaces/IAggregator.sol":{"IAggregator":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"}],"name":"aggregateSignatures","outputs":[{"internalType":"bytes","name":"aggregatedSignature","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"validateUserOpSignature","outputs":[{"internalType":"bytes","name":"sigForUserOp","type":"bytes"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"params":{"userOps":"array of UserOperations to collect the signatures from."},"returns":{"aggregatedSignature":"the aggregated signature"}},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"params":{"userOp":"the userOperation received from the user."},"returns":{"sigForUserOp":"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \"multisig\""}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":"275e2d79","validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":"e3563a4f","validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"64c530cd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"}],\"name\":\"aggregateSignatures\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"aggregatedSignature\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"validateSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"validateUserOpSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"sigForUserOp\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"params\":{\"userOps\":\"array of UserOperations to collect the signatures from.\"},\"returns\":{\"aggregatedSignature\":\"the aggregated signature\"}},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"params\":{\"userOp\":\"the userOperation received from the user.\"},\"returns\":{\"sigForUserOp\":\"the value to put into the signature field of the userOp when calling handleOps. (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\":{\"notice\":\"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation\"},\"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)\":{\"notice\":\"validate aggregated signature. revert if the aggregated signature does not match the given list of operations.\"},\"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\"}},\"notice\":\"Aggregated Signatures validator.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IAggregator.sol\":\"IAggregator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"aggregateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])":{"notice":"aggregate multiple signatures into a single value. This method is called off-chain to calculate the signature to pass with handleOps() bundler MAY use optimized custom code perform this aggregation"},"validateSignatures((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes)":{"notice":"validate aggregated signature. revert if the aggregated signature does not match the given list of operations."},"validateUserOpSignature((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"validate signature of a single userOp This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps."}},"notice":"Aggregated Signatures validator.","version":1}}},"contracts/interfaces/IEntryPoint.sol":{"IEntryPoint":{"abi":[{"inputs":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bool","name":"targetSuccess","type":"bool"},{"internalType":"bytes","name":"targetResult","type":"bytes"}],"name":"ExecutionResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"opIndex","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"FailedOp","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderAddressResult","type":"error"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureValidationFailed","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"}],"name":"ValidationResult","type":"error"},{"inputs":[{"components":[{"internalType":"uint256","name":"preOpGas","type":"uint256"},{"internalType":"uint256","name":"prefund","type":"uint256"},{"internalType":"bool","name":"sigFailed","type":"bool"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"paymasterContext","type":"bytes"}],"internalType":"struct IEntryPoint.ReturnInfo","name":"returnInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"senderInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"factoryInfo","type":"tuple"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"paymasterInfo","type":"tuple"},{"components":[{"internalType":"address","name":"aggregator","type":"address"},{"components":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"internalType":"struct IStakeManager.StakeInfo","name":"stakeInfo","type":"tuple"}],"internalType":"struct IEntryPoint.AggregatorStakeInfo","name":"aggregatorInfo","type":"tuple"}],"name":"ValidationResultWithAggregation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"address","name":"paymaster","type":"address"}],"name":"AccountDeployed","type":"event"},{"anonymous":false,"inputs":[],"name":"BeforeExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"SignatureAggregatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"paymaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"actualGasCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualGasUsed","type":"uint256"}],"name":"UserOperationEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"UserOperationRevertReason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getSenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"getUserOpHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"userOps","type":"tuple[]"},{"internalType":"contract IAggregator","name":"aggregator","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEntryPoint.UserOpsPerAggregator[]","name":"opsPerAggregator","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleAggregatedOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation[]","name":"ops","type":"tuple[]"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"handleOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"op","type":"tuple"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetCallData","type":"bytes"}],"name":"simulateHandleOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"}],"name":"simulateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedOp(uint256,string)":[{"params":{"opIndex":"- index into the array of ops to the failed one (in simulateValidation, this is always zero)","reason":"- revert reason The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts."}}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"params":{"factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"params":{"aggregatorInfo":"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation","factoryInfo":"stake information about the factory (if any)","paymasterInfo":"stake information about the paymaster (if any)","returnInfo":"gas and time-range returned values","senderInfo":"stake information about the sender"}}]},"events":{"AccountDeployed(bytes32,address,address,address)":{"params":{"factory":"the factory used to deploy this account (in the initCode)","paymaster":"the paymaster used by this UserOp","sender":"the account that is deployed","userOpHash":"the userOp that deployed this account. UserOperationEvent will follow."}},"UserOperationRevertReason(bytes32,address,uint256,bytes)":{"params":{"nonce":"the nonce used in the request","revertReason":"- the return bytes from the (reverted) call to \"callData\".","sender":"the sender of this request","userOpHash":"the request unique identifier."}}},"kind":"dev","methods":{"addStake(uint32)":{"params":{"_unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"balanceOf(address)":{"returns":{"_0":"the deposit (for gas payment) of the account"}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}},"getSenderAddress(bytes)":{"params":{"initCode":"the constructor code to be passed into the UserOperation."}},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","opsPerAggregator":"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)"}},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"params":{"beneficiary":"the address to receive the fees","ops":"the operations to execute"}},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"params":{"op":"the UserOperation to simulate","target":"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.","targetCallData":"callData to pass to target address"}},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"details":"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.","params":{"userOp":"the user operation to validate."}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","getNonce(address,uint192)":"35567e1a","getSenderAddress(bytes)":"9b249f69","getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"a6193531","handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":"4b1d7cf5","handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":"1fad948c","incrementNonce(uint192)":"0bd28e3b","simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":"d6383f94","simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":"ee219423","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"params\":{\"factory\":\"the factory used to deploy this account (in the initCode)\",\"paymaster\":\"the paymaster used by this UserOp\",\"sender\":\"the account that is deployed\",\"userOpHash\":\"the userOp that deployed this account. UserOperationEvent will follow.\"}},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"params\":{\"nonce\":\"the nonce used in the request\",\"revertReason\":\"- the return bytes from the (reverted) call to \\\"callData\\\".\",\"sender\":\"the sender of this request\",\"userOpHash\":\"the request unique identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IEntryPoint.sol\":\"IEntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)":[{"notice":"return value of simulateHandleOp"}],"FailedOp(uint256,string)":[{"notice":"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it."}],"SenderAddressResult(address)":[{"notice":"return value of getSenderAddress"}],"SignatureValidationFailed(address)":[{"notice":"error case when a signature aggregator fails to verify the aggregated signature it had created."}],"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))":[{"notice":"Successful result from simulateValidation."}],"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))":[{"notice":"Successful result from simulateValidation, if the account returns a signature aggregator"}]},"events":{"AccountDeployed(bytes32,address,address,address)":{"notice":"account \"sender\" was deployed."},"BeforeExecution()":{"notice":"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation."},"SignatureAggregatorChanged(address)":{"notice":"signature aggregator used by the following UserOperationEvents within this bundle."},"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"},"UserOperationRevertReason(bytes32,address,uint256,bytes)":{"notice":"An event emitted if the UserOperation \"callData\" reverted with non-zero length"}},"kind":"user","methods":{"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"depositTo(address)":{"notice":"add to the deposit of the given account"},"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"getSenderAddress(bytes)":{"notice":"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error"},"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid."},"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)":{"notice":"Execute a batch of UserOperation with Aggregators"},"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)":{"notice":"Execute a batch of UserOperation. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."},"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)":{"notice":"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \"ExecutionResult\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events."},"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))":{"notice":"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp."},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"version":1}}},"contracts/interfaces/INonceManager.sol":{"INonceManager":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint192","name":"key","type":"uint192"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"key","type":"uint192"}],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"getNonce(address,uint192)":{"params":{"key":"the high 192 bit of the nonce","sender":"the account address"},"returns":{"nonce":"a full nonce to pass for next UserOp with this sender."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"getNonce(address,uint192)":"35567e1a","incrementNonce(uint192)":"0bd28e3b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/INonceManager.sol\":\"INonceManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"getNonce(address,uint192)":{"notice":"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order."},"incrementNonce(uint192)":{"notice":"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key."}},"version":1}}},"contracts/interfaces/IStakeManager.sol":{"IStakeManager":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeDelaySec","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint32","name":"_unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDepositInfo","outputs":[{"components":[{"internalType":"uint112","name":"deposit","type":"uint112"},{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint112","name":"stake","type":"uint112"},{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"},{"internalType":"uint48","name":"withdrawTime","type":"uint48"}],"internalType":"struct IStakeManager.DepositInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"addStake(uint32)":{"params":{"_unstakeDelaySec":"the new lock duration before the deposit can be withdrawn."}},"balanceOf(address)":{"returns":{"_0":"the deposit (for gas payment) of the account"}},"getDepositInfo(address)":{"returns":{"info":"- full deposit information of given account"}},"withdrawStake(address)":{"params":{"withdrawAddress":"the address to send withdrawn value."}},"withdrawTo(address,uint256)":{"params":{"withdrawAddress":"the address to send withdrawn value.","withdrawAmount":"the amount to withdraw."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"addStake(uint32)":"0396cb60","balanceOf(address)":"70a08231","depositTo(address)":"b760faf9","getDepositInfo(address)":"5287ce12","unlockStake()":"bb9fe6bf","withdrawStake(address)":"c23a5cea","withdrawTo(address,uint256)":"205c2878"}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"_unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"balanceOf(address)\":{\"returns\":{\"_0\":\"the deposit (for gas payment) of the account\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"notice\":\"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IStakeManager.sol\":\"IStakeManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"events":{"StakeLocked(address,uint256,uint256)":{"notice":"Emitted when stake or unstake delay are modified"},"StakeUnlocked(address,uint256)":{"notice":"Emitted once a stake is scheduled for withdrawal"}},"kind":"user","methods":{"addStake(uint32)":{"notice":"add to the account's stake - amount and delay any pending unstake is first cancelled."},"depositTo(address)":{"notice":"add to the deposit of the given account"},"unlockStake()":{"notice":"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay."},"withdrawStake(address)":{"notice":"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass"},"withdrawTo(address,uint256)":{"notice":"withdraw from the deposit."}},"notice":"manage deposits and stakes. deposit is just a balance used to pay for UserOperations (either by a paymaster or an account) stake is value locked for at least \"unstakeDelay\" by the staked entity.","version":1}}},"contracts/interfaces/UserOperation.sol":{"UserOperationLib":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122008ede85b51f24773a2dd2b0edf24b0e09a5175eda2b1ed78902ad573776ccf1264736f6c634300080f0033","opcodes":"PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD 0xED 0xE8 JUMPDEST MLOAD CALLCODE SELFBALANCE PUSH20 0xA2DD2B0EDF24B0E09A5175EDA2B1ED78902AD573 PUSH24 0x6CCF1264736F6C634300080F003300000000000000000000 ","sourceMap":"1642:2115:6:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;1642:2115:6;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122008ede85b51f24773a2dd2b0edf24b0e09a5175eda2b1ed78902ad573776ccf1264736f6c634300080f0033","opcodes":"PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD 0xED 0xE8 JUMPDEST MLOAD CALLCODE SELFBALANCE PUSH20 0xA2DD2B0EDF24B0E09A5175EDA2B1ED78902AD573 PUSH24 0x6CCF1264736F6C634300080F003300000000000000000000 ","sourceMap":"1642:2115:6:-:0;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"17200","executionCost":"103","totalCost":"17303"},"internal":{"gasPrice(struct UserOperation calldata)":"infinite","getSender(struct UserOperation calldata)":"infinite","hash(struct UserOperation calldata)":"infinite","min(uint256,uint256)":"infinite","pack(struct UserOperation calldata)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Utility functions helpful when working with UserOperation structs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/UserOperation.sol\":\"UserOperationLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\",\"keccak256\":\"0x752bf1326abaf46258a67cbeb506a6a079a51fe5e5e6d262569e3ad2ff9b1780\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n /**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x021f7ede6eaaa4744443324b988b9b4f653ffb4cdaa86f87def932514b059356\",\"license\":\"GPL-3.0\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Utility functions helpful when working with UserOperation structs.","version":1}}}}}} \ No newline at end of file diff --git a/packages/boba/bundler/package.json b/packages/boba/bundler/package.json index 16db97e959..0b7d604f04 100644 --- a/packages/boba/bundler/package.json +++ b/packages/boba/bundler/package.json @@ -11,7 +11,7 @@ }, "scripts": { "build": "hardhat compile && tsc -p ./tsconfig.json", - "bundler": "ts-node ./src/exec.ts --config ./localconfig/bundler.config.json", + "bundler": "ts-node ./src/exec.ts --config ./localconfig/bundler.config.json --enableDebugMethods true", "clean": "rimraf artifacts cache node_modules dist dockers/bundler ./tsconfig.tsbuildinfo", "test:coverage": "yarn test", "test": "hardhat test", @@ -23,7 +23,7 @@ "@openzeppelin/contracts-upgradeable": "4.3.2", "@boba/accountabstraction": "^1.0.0", "@boba/bundler_utils": "^0.2.3", - "@boba/bundler_sdk": "^0.2.3", + "@bobanetwork/bundler_sdk": "*", "@ethersproject/abi": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/providers": "^5.7.0", diff --git a/packages/boba/bundler/src/BundlerConfig.ts b/packages/boba/bundler/src/BundlerConfig.ts index f52d14e866..7702a54723 100644 --- a/packages/boba/bundler/src/BundlerConfig.ts +++ b/packages/boba/bundler/src/BundlerConfig.ts @@ -21,6 +21,7 @@ export interface BundlerConfig { autoBundleMempoolSize: number addressManager: string l1NodeWeb3Url: string + enableDebugMethods: boolean } // TODO: implement merging config (args -> config.js -> default) and runtime shape validation @@ -44,6 +45,7 @@ export const BundlerConfigShape = { autoBundleMempoolSize: ow.number, addressManager: ow.string, l1NodeWeb3Url: ow.string, + enableDebugMethods: ow.boolean, } // TODO: consider if we want any default fields at all @@ -57,4 +59,5 @@ export const bundlerConfigDefault: Partial = { minUnstakeDelay: 60, autoBundleInterval: 1, autoBundleMempoolSize: 1, + enableDebugMethods: false, } diff --git a/packages/boba/bundler/src/BundlerServer.ts b/packages/boba/bundler/src/BundlerServer.ts index 6a200781c8..0d58f33d46 100644 --- a/packages/boba/bundler/src/BundlerServer.ts +++ b/packages/boba/bundler/src/BundlerServer.ts @@ -15,7 +15,11 @@ import { BundlerConfig } from './BundlerConfig' import { UserOpMethodHandler } from './UserOpMethodHandler' import { Server } from 'http' import { RpcError } from './utils' -import { EntryPointWrapper__factory, EntryPointWrapper, UserOperationStruct } from '@boba/accountabstraction' +import { + EntryPointWrapper__factory, + EntryPointWrapper, + UserOperationStruct, +} from '@boba/accountabstraction' import { DebugMethodHandler } from './DebugMethodHandler' import Debug from 'debug' @@ -45,6 +49,10 @@ export class BundlerServer { this.httpServer = this.app.listen(this.config.port) this.startingPromise = this._preflightCheck() + + if (this.config.enableDebugMethods) { + console.warn('WARNING: DebugMode is activated, debug_* will be available.') + } } startingPromise: Promise @@ -63,7 +71,9 @@ export class BundlerServer { } if ((await this.provider.getCode(this.config.entryPointWrapper)) === '0x') { - this.fatal(`entrypoint wrapper not deployed at ${this.config.entryPointWrapper}`) + this.fatal( + `entrypoint wrapper not deployed at ${this.config.entryPointWrapper}` + ) } // minimal UserOp to revert with "FailedOp" @@ -80,10 +90,18 @@ export class BundlerServer { maxPriorityFeePerGas: 0, signature: '0x', } - const ret = await EntryPointWrapper__factory.connect(this.config.entryPointWrapper, this.wallet).callStatic.simulateValidation(emptyUserOp) - const [failedOpStatus, _]: [EntryPointWrapper.FailedOpStatusStructOutput, any] = ret + const ret = await EntryPointWrapper__factory.connect( + this.config.entryPointWrapper, + this.wallet + ).callStatic.simulateValidation(emptyUserOp) + const [failedOpStatus, _]: [ + EntryPointWrapper.FailedOpStatusStructOutput, + any + ] = ret if (failedOpStatus?.status !== true) { - this.fatal(`Invalid entryPoint contract at ${this.config.entryPoint}. wrong version?`) + this.fatal( + `Invalid entryPoint contract at ${this.config.entryPoint}. wrong version?` + ) } const bal = await this.provider.getBalance(this.wallet.address) console.log( @@ -178,37 +196,44 @@ export class BundlerServer { case 'web3_clientVersion': result = this.methodHandler.clientVersion() break - //TODO https://github.com/bobanetwork/boba/issues/761 - // case 'debug_bundler_clearState': - // this.debugHandler.clearState() - // result = 'ok' - // break - // case 'debug_bundler_dumpMempool': - // result = await this.debugHandler.dumpMempool() - // break - // case 'debug_bundler_setReputation': - // await this.debugHandler.setReputation(params[0]) - // result = 'ok' - // break - // case 'debug_bundler_dumpReputation': - // result = await this.debugHandler.dumpReputation() - // break - // case 'debug_bundler_setBundlingMode': - // await this.debugHandler.setBundlingMode(params[0]) - // result = 'ok' - // break - // case 'debug_bundler_setBundleInterval': - // await this.debugHandler.setBundleInterval(params[0], params[1]) - // result = 'ok' - // break - // case 'debug_bundler_sendBundleNow': - // result = await this.debugHandler.sendBundleNow() - // if (result == null) { - // result = 'ok' - // } - // break default: - throw new RpcError(`Method ${method} is not supported`, -32601) + if (this.config.enableDebugMethods) { + // Also check debug_* methods if enabled + switch (method) { + case 'debug_bundler_clearState': + this.debugHandler.clearState() + result = 'ok' + break + case 'debug_bundler_dumpMempool': + result = await this.debugHandler.dumpMempool() + break + case 'debug_bundler_setReputation': + await this.debugHandler.setReputation(params[0]) + result = 'ok' + break + case 'debug_bundler_dumpReputation': + result = await this.debugHandler.dumpReputation() + break + case 'debug_bundler_setBundlingMode': + await this.debugHandler.setBundlingMode(params[0]) + result = 'ok' + break + case 'debug_bundler_setBundleInterval': + await this.debugHandler.setBundleInterval(params[0], params[1]) + result = 'ok' + break + case 'debug_bundler_sendBundleNow': + result = await this.debugHandler.sendBundleNow() + if (result == null) { + result = 'ok' + } + break + default: + throw new RpcError(`Method ${method} is not supported`, -32601) + } + } else { + throw new RpcError(`Method ${method} is not supported`, -32601) + } } return result } diff --git a/packages/boba/bundler/src/UserOpMethodHandler.ts b/packages/boba/bundler/src/UserOpMethodHandler.ts index 4ca2a2824e..26874a38ad 100644 --- a/packages/boba/bundler/src/UserOpMethodHandler.ts +++ b/packages/boba/bundler/src/UserOpMethodHandler.ts @@ -6,7 +6,7 @@ import { resolveProperties } from 'ethers/lib/utils' import { deepHexlify, erc4337RuntimeVersion } from '@boba/bundler_utils' import { UserOperationStruct, EntryPoint, EntryPointWrapper } from '@boba/accountabstraction' import { UserOperationEventEvent } from '@boba/accountabstraction/dist/types/EntryPoint' -import { calcPreVerificationGas } from '@boba/bundler_sdk/dist/calcPreVerificationGas' +import { calcPreVerificationGas } from '@bobanetwork/bundler_sdk/dist/calcPreVerificationGas' import { requireCond, RpcError, tostr } from './utils' import { ExecutionManager } from './modules/ExecutionManager' import { getAddr } from './modules/moduleUtils' diff --git a/packages/boba/bundler/src/modules/ValidationManager.ts b/packages/boba/bundler/src/modules/ValidationManager.ts index a154fc90af..5175a06372 100644 --- a/packages/boba/bundler/src/modules/ValidationManager.ts +++ b/packages/boba/bundler/src/modules/ValidationManager.ts @@ -4,7 +4,7 @@ import { ReputationManager } from './ReputationManager' import { BigNumber, BigNumberish, BytesLike, ethers } from 'ethers' import { requireCond, RpcError } from '../utils' import { AddressZero } from '@boba/bundler_utils' -import { calcPreVerificationGas } from '@boba/bundler_sdk/dist/calcPreVerificationGas' +import { calcPreVerificationGas } from '@bobanetwork/bundler_sdk/dist/calcPreVerificationGas' import Debug from 'debug' import { GetCodeHashes__factory } from '../../dist/src/types' diff --git a/packages/boba/bundler/src/runBundler.ts b/packages/boba/bundler/src/runBundler.ts index 09c1d84141..0ab13236a9 100644 --- a/packages/boba/bundler/src/runBundler.ts +++ b/packages/boba/bundler/src/runBundler.ts @@ -119,6 +119,7 @@ export async function runBundler( .option('--addressManager ', 'address of the Address Manager', '') .option('--l1NodeWeb3Url ', 'L1 network url for Address Manager', '') .option('--maxBundleGas ', 'Max Bundle Gas available to use', '5000000') + .option('--enableDebugMethods', 'debug_* methods available', false) const programOpts = program.parse(argv).opts() showStackTraces = programOpts.showStackTraces diff --git a/packages/boba/bundler/src/runner/runop.ts b/packages/boba/bundler/src/runner/runop.ts index 2860027256..2790e0f0b7 100644 --- a/packages/boba/bundler/src/runner/runop.ts +++ b/packages/boba/bundler/src/runner/runop.ts @@ -16,7 +16,7 @@ import { DeterministicDeployer, HttpRpcClient, SimpleAccountAPI, -} from '@boba/bundler_sdk' +} from '@bobanetwork/bundler_sdk' import { runBundler } from '../runBundler' import { BundlerServer } from '../BundlerServer' diff --git a/packages/boba/bundler/test/BundlerManager.test.ts b/packages/boba/bundler/test/BundlerManager.test.ts index 25b0e245e6..3ab7646ba3 100644 --- a/packages/boba/bundler/test/BundlerManager.test.ts +++ b/packages/boba/bundler/test/BundlerManager.test.ts @@ -5,7 +5,7 @@ import { BundlerReputationParams, ReputationManager } from '../src/modules/Reput import { UserOperation } from '../src/modules/moduleUtils' import { AddressZero } from '@boba/bundler_utils' import { isGeth } from '../src/utils' -import { DeterministicDeployer } from '@boba/bundler_sdk' +import { DeterministicDeployer } from '@bobanetwork/bundler_sdk' import { MempoolManager } from '../src/modules/MempoolManager' import { BundleManager } from '../src/modules/BundleManager' import { ethers } from 'hardhat' diff --git a/packages/boba/bundler/test/DebugMethodHandler.test.ts b/packages/boba/bundler/test/DebugMethodHandler.test.ts index 772bad9f4f..912a2a0ac3 100644 --- a/packages/boba/bundler/test/DebugMethodHandler.test.ts +++ b/packages/boba/bundler/test/DebugMethodHandler.test.ts @@ -10,7 +10,7 @@ import { BundleManager, SendBundleReturn } from '../src/modules/BundleManager' import { UserOpMethodHandler } from '../src/UserOpMethodHandler' import { ethers } from 'hardhat' import { EntryPoint, EntryPoint__factory, EntryPointWrapper, EntryPointWrapper__factory, SimpleAccountFactory__factory } from '@boba/accountabstraction' -import { DeterministicDeployer, SimpleAccountAPI } from '@boba/bundler_sdk' +import { DeterministicDeployer, SimpleAccountAPI } from '@bobanetwork/bundler_sdk' import { Signer, Wallet } from 'ethers' import { resolveHexlify } from '@boba/bundler_utils' import { expect } from 'chai' @@ -53,6 +53,7 @@ describe('#DebugMethodHandler', () => { minUnstakeDelay: 0, addressManager: '', l1NodeWeb3Url: '', + enableDebugMethods: false, } diff --git a/packages/boba/bundler/test/UserOpMethodHandler.test.ts b/packages/boba/bundler/test/UserOpMethodHandler.test.ts index b3b4f1e37f..9281191a7d 100644 --- a/packages/boba/bundler/test/UserOpMethodHandler.test.ts +++ b/packages/boba/bundler/test/UserOpMethodHandler.test.ts @@ -13,7 +13,7 @@ import { } from '@boba/accountabstraction' import { Signer, Wallet } from 'ethers' -import { DeterministicDeployer, SimpleAccountAPI } from '@boba/bundler_sdk' +import { DeterministicDeployer, SimpleAccountAPI } from '@bobanetwork/bundler_sdk' import { postExecutionDump } from '@boba/bundler_utils/dist/postExecCheck' import { SampleRecipient, TestRulesAccount, TestRulesAccount__factory diff --git a/packages/boba/bundler_sdk/README.md b/packages/boba/bundler_sdk/README.md index e6abdaced6..009a0af8f1 100644 --- a/packages/boba/bundler_sdk/README.md +++ b/packages/boba/bundler_sdk/README.md @@ -39,7 +39,7 @@ This can only work for wallets that use an EIP-191 ("Ethereum Signed Message") s Also, the UX is not great (the user is asked to sign a hash, and even the wallet address is not mentioned, only the signer) ```typescript -import { wrapProvider } from '@boba/bundler_sdk' +import { wrapProvider } from '@bobanetwork/bundler_sdk' //use this account as wallet-owner (which will be used to sign the requests) const signer = provider.getSigner() @@ -48,7 +48,7 @@ const config = { entryPointAddress, bundlerUrl: 'http://localhost:3000/rpc' } -const aaProvider = await wrapProvider(provider, config, aasigner) +const aaProvider = await wrapProvider(provider, config, aasigner, entryPointWrapperAddress) const walletAddress = await aaProvider.getSigner().getAddress() // send some eth to the wallet Address: wallet should have some balance to pay for its own creation, and for calling methods. diff --git a/packages/boba/bundler_sdk/package.json b/packages/boba/bundler_sdk/package.json index 17af2d8ed8..cacf22790a 100644 --- a/packages/boba/bundler_sdk/package.json +++ b/packages/boba/bundler_sdk/package.json @@ -1,5 +1,5 @@ { - "name": "@boba/bundler_sdk", + "name": "@bobanetwork/bundler_sdk", "version": "0.2.3", "main": "./dist/index.js", "license": "MIT", diff --git a/packages/boba/bundler_sdk/src/BaseAccountAPI.ts b/packages/boba/bundler_sdk/src/BaseAccountAPI.ts index cd83585c8e..8eda848620 100644 --- a/packages/boba/bundler_sdk/src/BaseAccountAPI.ts +++ b/packages/boba/bundler_sdk/src/BaseAccountAPI.ts @@ -1,9 +1,10 @@ -import { ethers, BigNumber, BigNumberish, Contract } from 'ethers' +import { ethers, BigNumber, BigNumberish } from 'ethers' import { Provider } from '@ethersproject/providers' import { - EntryPoint, EntryPoint__factory, + EntryPoint, + EntryPoint__factory, + EntryPointWrapper__factory, UserOperationStruct, - SenderCreator__factory } from '@boba/accountabstraction' import { TransactionDetailsForUserOp } from './TransactionDetailsForUserOp' @@ -15,7 +16,7 @@ import { calcPreVerificationGas, GasOverheads } from './calcPreVerificationGas' export interface BaseApiParams { provider: Provider entryPointAddress: string - senderCreatorAddress?: string + entryPointWrapperAddress?: string accountAddress?: string overheads?: Partial paymasterAPI?: PaymasterAPI @@ -48,7 +49,7 @@ export abstract class BaseAccountAPI { provider: Provider overheads?: Partial entryPointAddress: string - senderCreatorAddress?: string + entryPointWrapperAddress?: string accountAddress?: string paymasterAPI?: PaymasterAPI @@ -60,7 +61,7 @@ export abstract class BaseAccountAPI { this.provider = params.provider this.overheads = params.overheads this.entryPointAddress = params.entryPointAddress - this.senderCreatorAddress = params.senderCreatorAddress + this.entryPointWrapperAddress = params.entryPointWrapperAddress this.accountAddress = params.accountAddress this.paymasterAPI = params.paymasterAPI @@ -127,9 +128,9 @@ export abstract class BaseAccountAPI { const initCode = this.getAccountInitCode() // use entryPoint to query account address (factory can provide a helper method to do the same, but // this method attempts to be generic - if (this.senderCreatorAddress != null) { - const senderCreator = new Contract(this.senderCreatorAddress, SenderCreator__factory.abi, this.provider) - return senderCreator.callStatic.createSender(initCode) + if (this.entryPointWrapperAddress != null) { + const accountAddr = await EntryPointWrapper__factory.connect(this.entryPointWrapperAddress, this.provider).callStatic.getSenderAddress(initCode) + return accountAddr } else { try { await this.entryPointView.callStatic.getSenderAddress(initCode) diff --git a/packages/boba/bundler_sdk/src/Provider.ts b/packages/boba/bundler_sdk/src/Provider.ts index 9925040e95..ec18a99669 100644 --- a/packages/boba/bundler_sdk/src/Provider.ts +++ b/packages/boba/bundler_sdk/src/Provider.ts @@ -19,15 +19,15 @@ const debug = Debug('aa.wrapProvider') * @param originalProvider the normal provider * @param config see ClientConfig for more info * @param originalSigner use this signer as the owner. of this wallet. By default, use the provider's signer + * @param entryPointWrapperAddress boba does not return revert data for custom errors, if on boba pass an entryPointWrapperAddress to compute account address * @param wallet optional, boba does not allow eth_sendTransaction from a remote signer, if on boba pass wallet - * @param senderCreatorAddress optional, boba does not return revert data for custom errors, if on boba pass a senderCreator to compute account address */ export async function wrapProvider ( originalProvider: JsonRpcProvider, config: ClientConfig, originalSigner: Signer = originalProvider.getSigner(), - wallet?: Wallet, - senderCreatorAddress?: string + entryPointWrapperAddress: string, + wallet?: Wallet ): Promise { const entryPoint = EntryPoint__factory.connect(config.entryPointAddress, originalProvider) // Initial SimpleAccount instance is not deployed and exists just for the interface @@ -43,7 +43,7 @@ export async function wrapProvider ( provider: originalProvider, entryPointAddress: entryPoint.address, owner: smartWalletAPIOwner, - senderCreatorAddress: senderCreatorAddress, + entryPointWrapperAddress: entryPointWrapperAddress, factoryAddress: SimpleAccountFactory, paymasterAPI: config.paymasterAPI }) diff --git a/packages/boba/bundler_sdk/test/0-deterministicDeployer.test.ts b/packages/boba/bundler_sdk/test/0-deterministicDeployer.test.ts index d714ae8d95..820b2ded1b 100644 --- a/packages/boba/bundler_sdk/test/0-deterministicDeployer.test.ts +++ b/packages/boba/bundler_sdk/test/0-deterministicDeployer.test.ts @@ -29,11 +29,11 @@ describe('#deterministicDeployer', () => { await ethers.provider.getSigner().sendTransaction({ to: testWallet.address, value: ethers.utils.parseEther('0.01') }) const ctr = hexValue(new SampleRecipient__factory(ethers.provider.getSigner()).getDeployTransaction().data!) - DeterministicDeployer.init(ethers.provider, testWallet) + console.log(DeterministicDeployer.init(ethers.provider, testWallet)) const addr = await DeterministicDeployer.getAddress(ctr, 1) expect(await deployer.isContractDeployed(addr)).to.equal(false) const preWalletBalance = await ethers.provider.getBalance(testWallet.address) - await DeterministicDeployer.deploy(ctr, 1) + console.log(await DeterministicDeployer.deploy(ctr, 1)) const postWalletBalance = await ethers.provider.getBalance(testWallet.address) expect(await deployer.isContractDeployed(addr)).to.equal(true) // wallet deploys contract diff --git a/packages/boba/bundler_sdk/test/1-SimpleAccountAPI.test.ts b/packages/boba/bundler_sdk/test/1-SimpleAccountAPI.test.ts index 838833bef9..a184afc7bd 100644 --- a/packages/boba/bundler_sdk/test/1-SimpleAccountAPI.test.ts +++ b/packages/boba/bundler_sdk/test/1-SimpleAccountAPI.test.ts @@ -2,6 +2,7 @@ import { EntryPoint, EntryPoint__factory, SimpleAccountFactory__factory, + EntryPointWrapper__factory, UserOperationStruct } from '@boba/accountabstraction' import { Wallet } from 'ethers' @@ -127,4 +128,36 @@ describe('SimpleAccountAPI', () => { await expect(entryPoint.handleOps([op1], beneficiary)).to.emit(recipient, 'Sender') .withArgs(anyValue, accountAddress, 'world') }) + + it('should use entryPointWrapper to get counterfactual address', async function () { + const entryPointWrapper = await new EntryPointWrapper__factory(signer).deploy(entryPoint.address) + const owner2 = Wallet.createRandom() + const factoryAddress = await DeterministicDeployer.deploy(new SimpleAccountFactory__factory(), 0, [entryPoint.address]) + const api1 = new SimpleAccountAPI({ + provider, + entryPointAddress: entryPoint.address, + entryPointWrapperAddress: entryPointWrapper.address, + owner: owner2, + factoryAddress + }) + + const initCode = await api1.getAccountInitCode() + const addressFromEPW = await entryPointWrapper.callStatic.getSenderAddress(initCode) + accountAddress = await api1.getCounterFactualAddress() + expect(addressFromEPW).to.deep.eq(accountAddress) + expect(await provider.getCode(accountAddress).then(code => code.length)).to.equal(2) + + await signer.sendTransaction({ + to: accountAddress, + value: parseEther('0.1') + }) + const op1 = await api1.createSignedUserOp({ + target: recipient.address, + data: recipient.interface.encodeFunctionData('something', ['hello']) + }) + + await expect(entryPoint.handleOps([op1], beneficiary)).to.emit(recipient, 'Sender') + .withArgs(anyValue, accountAddress, 'hello') + expect(await provider.getCode(accountAddress).then(code => code.length)).to.greaterThan(1000) + }) }) diff --git a/packages/boba/bundler_sdk/test/3-ERC4337EthersSigner.test.ts b/packages/boba/bundler_sdk/test/3-ERC4337EthersSigner.test.ts index 9315eaee19..7e4e4149d2 100644 --- a/packages/boba/bundler_sdk/test/3-ERC4337EthersSigner.test.ts +++ b/packages/boba/bundler_sdk/test/3-ERC4337EthersSigner.test.ts @@ -1,7 +1,7 @@ import { SampleRecipient, SampleRecipient__factory } from '@boba/bundler_utils/dist/src/types' import { ethers } from 'hardhat' import { ClientConfig, ERC4337EthersProvider, wrapProvider } from '../src' -import { EntryPoint, EntryPoint__factory } from '@boba/accountabstraction' +import { EntryPoint, EntryPoint__factory, EntryPointWrapper, EntryPointWrapper__factory } from '@boba/accountabstraction' import { expect } from 'chai' import { parseEther } from 'ethers/lib/utils' import { Wallet } from 'ethers' @@ -13,15 +13,17 @@ describe('ERC4337EthersSigner, Provider', function () { let recipient: SampleRecipient let aaProvider: ERC4337EthersProvider let entryPoint: EntryPoint + let entryPointWrapper: EntryPointWrapper before('init', async () => { const deployRecipient = await new SampleRecipient__factory(signer).deploy() entryPoint = await new EntryPoint__factory(signer).deploy() + entryPointWrapper = await new EntryPointWrapper__factory(signer).deploy(entryPoint.address) const config: ClientConfig = { entryPointAddress: entryPoint.address, bundlerUrl: '' } const aasigner = Wallet.createRandom() - aaProvider = await wrapProvider(provider, config, aasigner) + aaProvider = await wrapProvider(provider, config, aasigner, entryPointWrapper.address) const beneficiary = provider.getSigner().getAddress() // for testing: bypass sending through a bundler, and send directly to our entrypoint.. diff --git a/packages/boba/contracts/contracts/Teleportation.sol b/packages/boba/contracts/contracts/Teleportation.sol index 37bf91cab5..67b03f81a9 100644 --- a/packages/boba/contracts/contracts/Teleportation.sol +++ b/packages/boba/contracts/contracts/Teleportation.sol @@ -6,10 +6,6 @@ import '@openzeppelin/contracts/utils/math/SafeMath.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; -/** - Note: This contract has not been audited, exercise caution when using this on mainnet - */ - /** * @title Teleportation * diff --git a/packages/boba/contracts/deploy/002-LiquidityPools.deploy.ts b/packages/boba/contracts/deploy/002-LiquidityPools.deploy.ts index ebafc064af..8314c37055 100644 --- a/packages/boba/contracts/deploy/002-LiquidityPools.deploy.ts +++ b/packages/boba/contracts/deploy/002-LiquidityPools.deploy.ts @@ -26,7 +26,8 @@ const deployFn: DeployFunction = async (hre) => { (hre as any).deployConfig.deployer_l2 ) - const L2LiquidityPoolDeploymentSubmission = getDeploymentSubmission(L2LiquidityPool) + const L2LiquidityPoolDeploymentSubmission = + getDeploymentSubmission(L2LiquidityPool) await registerBobaAddress( addressManager, @@ -49,7 +50,8 @@ const deployFn: DeployFunction = async (hre) => { (hre as any).deployConfig.deployer_l1 ) - const L1LiquidityPoolDeploymentSubmission = getDeploymentSubmission(L1LiquidityPool) + const L1LiquidityPoolDeploymentSubmission = + getDeploymentSubmission(L1LiquidityPool) await registerBobaAddress( addressManager, diff --git a/packages/boba/contracts/deploy/020-Teleportation.deploy.ts b/packages/boba/contracts/deploy/020-Teleportation.deploy.ts index 123f8cdd52..9a83b79fa3 100644 --- a/packages/boba/contracts/deploy/020-Teleportation.deploy.ts +++ b/packages/boba/contracts/deploy/020-Teleportation.deploy.ts @@ -25,7 +25,8 @@ const deployFn: DeployFunction = async (hre) => { [], (hre as any).deployConfig.deployer_l2 ) - const TeleportationDeploymentSubmission = getDeploymentSubmission(Teleportation) + const TeleportationDeploymentSubmission = + getDeploymentSubmission(Teleportation) await hre.deployments.save('Teleportation', TeleportationDeploymentSubmission) console.log(`Teleportation deployed to: ${Teleportation.address}`) @@ -35,7 +36,8 @@ const deployFn: DeployFunction = async (hre) => { [Teleportation.address], (hre as any).deployConfig.deployer_l2 ) - const Proxy__TeleportationDeploymentSubmission = getDeploymentSubmission(Proxy__Teleportation) + const Proxy__TeleportationDeploymentSubmission = + getDeploymentSubmission(Proxy__Teleportation) await hre.deployments.save( 'Proxy__Teleportation', Proxy__TeleportationDeploymentSubmission diff --git a/packages/boba/contracts/test/contracts/ERC1155Bridges/L2ERC1155BridgesAltL1.spec.ts b/packages/boba/contracts/test/contracts/ERC1155Bridges/L2ERC1155BridgesAltL1.spec.ts index bea180daa0..6355f6b85a 100644 --- a/packages/boba/contracts/test/contracts/ERC1155Bridges/L2ERC1155BridgesAltL1.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC1155Bridges/L2ERC1155BridgesAltL1.spec.ts @@ -202,7 +202,11 @@ describe('L2ERC1155BridgeAltL1 Tests', () => { 'uri' ) await expect( - L2ERC1155Bridge.registerPair(ERC1155.address, IncorrectL2StandardERC1155.address, 'L1') + L2ERC1155Bridge.registerPair( + ERC1155.address, + IncorrectL2StandardERC1155.address, + 'L1' + ) ).to.be.revertedWith('L2 contract is not compatible with L1 contract') }) it('can register a token with L2 creation', async () => { diff --git a/packages/boba/contracts/test/contracts/ERC1155Bridges/l1ERC1155Bridges.spec.ts b/packages/boba/contracts/test/contracts/ERC1155Bridges/l1ERC1155Bridges.spec.ts index ad9a57a460..b147078d86 100644 --- a/packages/boba/contracts/test/contracts/ERC1155Bridges/l1ERC1155Bridges.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC1155Bridges/l1ERC1155Bridges.spec.ts @@ -197,7 +197,11 @@ describe('L1ERC1155Bridge Tests', () => { 'uri' ) await expect( - L1ERC1155Bridge.registerPair(IncorrectL1StandardERC1155.address, ERC1155.address, 'L2') + L1ERC1155Bridge.registerPair( + IncorrectL1StandardERC1155.address, + ERC1155.address, + 'L2' + ) ).to.be.revertedWith('L1 contract is not compatible with L2 contract') }) it('cant register if not owner', async () => { diff --git a/packages/boba/contracts/test/contracts/ERC1155Bridges/l2ERC1155Bridges.spec.ts b/packages/boba/contracts/test/contracts/ERC1155Bridges/l2ERC1155Bridges.spec.ts index 887833d9a5..d9b4e30724 100644 --- a/packages/boba/contracts/test/contracts/ERC1155Bridges/l2ERC1155Bridges.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC1155Bridges/l2ERC1155Bridges.spec.ts @@ -202,7 +202,11 @@ describe('L2ERC1155Bridge Tests', () => { 'uri' ) await expect( - L2ERC1155Bridge.registerPair(ERC1155.address, IncorrectL2StandardERC1155.address, 'L1') + L2ERC1155Bridge.registerPair( + ERC1155.address, + IncorrectL2StandardERC1155.address, + 'L1' + ) ).to.be.revertedWith('L2 contract is not compatible with L1 contract') }) it('can register a token with L2 creation', async () => { diff --git a/packages/boba/contracts/test/contracts/ERC721Bridges/L2NFTBridgeAltL1.spec.ts b/packages/boba/contracts/test/contracts/ERC721Bridges/L2NFTBridgeAltL1.spec.ts index 49aa44e965..1f19fda08e 100644 --- a/packages/boba/contracts/test/contracts/ERC721Bridges/L2NFTBridgeAltL1.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC721Bridges/L2NFTBridgeAltL1.spec.ts @@ -202,7 +202,11 @@ describe('L2NFTBridgeAltL1 Tests', () => { 'baseTokenUri' ) await expect( - L2NFTBridge.registerNFTPair(ERC721.address, IncorrectL2StandardERC721.address, 'L1') + L2NFTBridge.registerNFTPair( + ERC721.address, + IncorrectL2StandardERC721.address, + 'L1' + ) ).to.be.revertedWith('L2 contract is not compatible with L1 contract') }) it('can register a NFT with L2 creation', async () => { diff --git a/packages/boba/contracts/test/contracts/ERC721Bridges/l1nftbridge.spec.ts b/packages/boba/contracts/test/contracts/ERC721Bridges/l1nftbridge.spec.ts index e0fbb3140a..3d767ed997 100644 --- a/packages/boba/contracts/test/contracts/ERC721Bridges/l1nftbridge.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC721Bridges/l1nftbridge.spec.ts @@ -199,7 +199,11 @@ describe('L1NFTBridge Tests', () => { 'baseTokenUri' ) await expect( - L1NFTBridge.registerNFTPair(IncorrectL1StandardERC721.address, ERC721.address, 'L2') + L1NFTBridge.registerNFTPair( + IncorrectL1StandardERC721.address, + ERC721.address, + 'L2' + ) ).to.be.revertedWith('L1 contract is not compatible with L2 contract') }) it('cant register if not owner', async () => { diff --git a/packages/boba/contracts/test/contracts/ERC721Bridges/l2nftbridge.spec.ts b/packages/boba/contracts/test/contracts/ERC721Bridges/l2nftbridge.spec.ts index b932721bfc..08e77e83e9 100644 --- a/packages/boba/contracts/test/contracts/ERC721Bridges/l2nftbridge.spec.ts +++ b/packages/boba/contracts/test/contracts/ERC721Bridges/l2nftbridge.spec.ts @@ -202,7 +202,11 @@ describe('L2NFTBridge Tests', () => { 'baseTokenUri' ) await expect( - L2NFTBridge.registerNFTPair(ERC721.address, IncorrectL2StandardERC721.address, 'L1') + L2NFTBridge.registerNFTPair( + ERC721.address, + IncorrectL2StandardERC721.address, + 'L1' + ) ).to.be.revertedWith('L2 contract is not compatible with L1 contract') }) it('can register a NFT with L2 creation', async () => { diff --git a/packages/boba/contracts/test/endToEndTests/L2BillingContract.spec.ts b/packages/boba/contracts/test/endToEndTests/L2BillingContract.spec.ts index 8ab78293c2..828ff9af38 100644 --- a/packages/boba/contracts/test/endToEndTests/L2BillingContract.spec.ts +++ b/packages/boba/contracts/test/endToEndTests/L2BillingContract.spec.ts @@ -49,7 +49,8 @@ describe('L2BillingContract Tests', async () => { '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000' - )).to.be.revertedWith('Fee token address cannot be zero') + ) + ).to.be.revertedWith('Fee token address cannot be zero') }) it('should have correct address', async () => { diff --git a/packages/boba/contracts/test/endToEndTests/teleportation.spec.ts b/packages/boba/contracts/test/endToEndTests/teleportation.spec.ts index 7f70866b02..c20ed6904a 100644 --- a/packages/boba/contracts/test/endToEndTests/teleportation.spec.ts +++ b/packages/boba/contracts/test/endToEndTests/teleportation.spec.ts @@ -714,8 +714,10 @@ describe('BOBA Teleportation Tests', async () => { 'PausedReceiver' ) PausedReceiver = await Factory__PausedReceiver.deploy() - await PausedReceiver.setPauseStatus(true); - expect(await ethers.provider.getBalance(Proxy__Teleportation.address)).to.be.eq(0) + await PausedReceiver.setPauseStatus(true) + expect( + await ethers.provider.getBalance(Proxy__Teleportation.address) + ).to.be.eq(0) const _amount = ethers.utils.parseEther('100') const payload = [ { @@ -731,24 +733,29 @@ describe('BOBA Teleportation Tests', async () => { .to.emit(Proxy__Teleportation, 'DisbursementFailed') .withArgs(0, PausedReceiver.address, _amount, 4) - const failedDisbursement = await Proxy__Teleportation.failedNativeDisbursements(0) + const failedDisbursement = + await Proxy__Teleportation.failedNativeDisbursements(0) expect(failedDisbursement.failed).to.be.eq(true) expect(failedDisbursement.disbursement.amount).to.be.eq(_amount) - expect(failedDisbursement.disbursement.addr).to.be.eq(PausedReceiver.address) + expect(failedDisbursement.disbursement.addr).to.be.eq( + PausedReceiver.address + ) expect(failedDisbursement.disbursement.sourceChainId).to.be.eq(4) expect(failedDisbursement.disbursement.depositId).to.be.eq(0) - expect(await ethers.provider.getBalance(Proxy__Teleportation.address)).to.be.eq(_amount) + expect( + await ethers.provider.getBalance(Proxy__Teleportation.address) + ).to.be.eq(_amount) }) it('should not be able to retry incorrect Disbursements', async () => { - await PausedReceiver.setPauseStatus(false); + await PausedReceiver.setPauseStatus(false) await expect( Proxy__Teleportation.retryDisburseNativeBOBA([1]) ).to.be.revertedWith('DepositId is not a failed disbursement') }) it('should not be able to call from non disburser', async () => { - await PausedReceiver.setPauseStatus(false); + await PausedReceiver.setPauseStatus(false) await expect( Proxy__Teleportation.connect(signer2).retryDisburseNativeBOBA([0]) ).to.be.revertedWith('Caller is not the disburser') @@ -756,21 +763,26 @@ describe('BOBA Teleportation Tests', async () => { it('should be able to retry failed Disbursements', async () => { const _amount = ethers.utils.parseEther('100') - await PausedReceiver.setPauseStatus(false); - await expect( - Proxy__Teleportation.retryDisburseNativeBOBA([0]) - ) + await PausedReceiver.setPauseStatus(false) + await expect(Proxy__Teleportation.retryDisburseNativeBOBA([0])) .to.emit(Proxy__Teleportation, 'DisbursementRetrySuccess') .withArgs(0, PausedReceiver.address, _amount, 4) - const failedDisbursement = await Proxy__Teleportation.failedNativeDisbursements(0) + const failedDisbursement = + await Proxy__Teleportation.failedNativeDisbursements(0) expect(failedDisbursement.failed).to.be.eq(false) expect(failedDisbursement.disbursement.amount).to.be.eq(_amount) - expect(failedDisbursement.disbursement.addr).to.be.eq(PausedReceiver.address) + expect(failedDisbursement.disbursement.addr).to.be.eq( + PausedReceiver.address + ) expect(failedDisbursement.disbursement.sourceChainId).to.be.eq(4) expect(failedDisbursement.disbursement.depositId).to.be.eq(0) - expect(await ethers.provider.getBalance(Proxy__Teleportation.address)).to.be.eq(0) - expect(await ethers.provider.getBalance(PausedReceiver.address)).to.be.eq(_amount) + expect( + await ethers.provider.getBalance(Proxy__Teleportation.address) + ).to.be.eq(0) + expect(await ethers.provider.getBalance(PausedReceiver.address)).to.be.eq( + _amount + ) }) it('should not be able to retry an already retried Disbursements', async () => { @@ -801,7 +813,7 @@ describe('BOBA Teleportation Tests', async () => { }) it('should be able to retry a batch of failed disbursements', async () => { - await PausedReceiver.setPauseStatus(true); + await PausedReceiver.setPauseStatus(true) const _amount = ethers.utils.parseEther('100') const payload = [ { @@ -818,44 +830,62 @@ describe('BOBA Teleportation Tests', async () => { }, ] await expect( - Proxy__Teleportation.disburseNativeBOBA(payload, { value: ethers.utils.parseEther('101') }) + Proxy__Teleportation.disburseNativeBOBA(payload, { + value: ethers.utils.parseEther('101'), + }) ) .to.emit(Proxy__Teleportation, 'DisbursementFailed') .withArgs(2, PausedReceiver.address, _amount, 4) - const failedDisbursement = await Proxy__Teleportation.failedNativeDisbursements(2) + const failedDisbursement = + await Proxy__Teleportation.failedNativeDisbursements(2) expect(failedDisbursement.failed).to.be.eq(true) - const failedDisbursement2 = await Proxy__Teleportation.failedNativeDisbursements(3) + const failedDisbursement2 = + await Proxy__Teleportation.failedNativeDisbursements(3) expect(failedDisbursement2.failed).to.be.eq(true) - expect(await ethers.provider.getBalance(Proxy__Teleportation.address)).to.be.eq(ethers.utils.parseEther('101')) + expect( + await ethers.provider.getBalance(Proxy__Teleportation.address) + ).to.be.eq(ethers.utils.parseEther('101')) - const preBalanceReceiver = await ethers.provider.getBalance(PausedReceiver.address) + const preBalanceReceiver = await ethers.provider.getBalance( + PausedReceiver.address + ) // retry disbursement - await PausedReceiver.setPauseStatus(false); - await expect( - Proxy__Teleportation.retryDisburseNativeBOBA([2, 3]) - ) + await PausedReceiver.setPauseStatus(false) + await expect(Proxy__Teleportation.retryDisburseNativeBOBA([2, 3])) .to.emit(Proxy__Teleportation, 'DisbursementRetrySuccess') .withArgs(2, PausedReceiver.address, _amount, 4) .to.emit(Proxy__Teleportation, 'DisbursementRetrySuccess') .withArgs(3, PausedReceiver.address, ethers.utils.parseEther('1'), 4) - const failedDisbursementRetried1 = await Proxy__Teleportation.failedNativeDisbursements(2) + const failedDisbursementRetried1 = + await Proxy__Teleportation.failedNativeDisbursements(2) expect(failedDisbursementRetried1.failed).to.be.eq(false) expect(failedDisbursementRetried1.disbursement.amount).to.be.eq(_amount) - expect(failedDisbursementRetried1.disbursement.addr).to.be.eq(PausedReceiver.address) + expect(failedDisbursementRetried1.disbursement.addr).to.be.eq( + PausedReceiver.address + ) expect(failedDisbursementRetried1.disbursement.sourceChainId).to.be.eq(4) expect(failedDisbursementRetried1.disbursement.depositId).to.be.eq(2) - const failedDisbursementRetried2 = await Proxy__Teleportation.failedNativeDisbursements(3) + const failedDisbursementRetried2 = + await Proxy__Teleportation.failedNativeDisbursements(3) expect(failedDisbursementRetried2.failed).to.be.eq(false) - expect(failedDisbursementRetried2.disbursement.amount).to.be.eq(ethers.utils.parseEther('1')) - expect(failedDisbursementRetried2.disbursement.addr).to.be.eq(PausedReceiver.address) + expect(failedDisbursementRetried2.disbursement.amount).to.be.eq( + ethers.utils.parseEther('1') + ) + expect(failedDisbursementRetried2.disbursement.addr).to.be.eq( + PausedReceiver.address + ) expect(failedDisbursementRetried2.disbursement.sourceChainId).to.be.eq(4) expect(failedDisbursementRetried2.disbursement.depositId).to.be.eq(3) - expect(await ethers.provider.getBalance(Proxy__Teleportation.address)).to.be.eq(0) - expect(await ethers.provider.getBalance(PausedReceiver.address)).to.be.eq(preBalanceReceiver.add(ethers.utils.parseEther('101'))) + expect( + await ethers.provider.getBalance(Proxy__Teleportation.address) + ).to.be.eq(0) + expect(await ethers.provider.getBalance(PausedReceiver.address)).to.be.eq( + preBalanceReceiver.add(ethers.utils.parseEther('101')) + ) }) }) @@ -911,9 +941,7 @@ describe('BOBA Teleportation Tests', async () => { it('should not set minimum amount if caller is not owner', async () => { const maxAmount = await Proxy__Teleportation.maxDepositAmount() await expect( - Proxy__Teleportation.setMinAmount( - maxAmount.add(1) - ) + Proxy__Teleportation.setMinAmount(maxAmount.add(1)) ).to.be.revertedWith('incorrect min deposit amount') }) @@ -935,9 +963,7 @@ describe('BOBA Teleportation Tests', async () => { it('should not set maximum amount if caller is not owner', async () => { const minAmount = await Proxy__Teleportation.minDepositAmount() await expect( - Proxy__Teleportation.setMaxAmount( - minAmount.sub(1) - ) + Proxy__Teleportation.setMaxAmount(minAmount.sub(1)) ).to.be.revertedWith('incorrect max deposit amount') }) diff --git a/packages/boba/gateway/package.json b/packages/boba/gateway/package.json index 8e822b7fa6..ae479373c1 100644 --- a/packages/boba/gateway/package.json +++ b/packages/boba/gateway/package.json @@ -3,27 +3,23 @@ "version": "1.0.0", "private": true, "scripts": { - "buildenv-dev": "react-env", - "buildenv-prod": "NODE_ENV=production react-env --dest build", - "format": "prettier --config .prettierrc.json --write \"./src/**/*.{ts,tsx}\"", + "audit-check": "audit-ci --moderate", + "build:prod": "GENERATE_SOURCEMAP=false REACT_APP_ENV=prod react-scripts build", + "deploy:mainnet": "yarn build:prod && aws s3 rm s3://boba-gateway --recursive && aws s3 sync build s3://boba-gateway && aws s3 cp s3://boba-gateway/index.html s3://boba-gateway/index.html --metadata-directive REPLACE --cache-control max-age=0 --content-type text/html", + "deploy:onegateway": "yarn build:prod && aws s3 rm s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31 --recursive && aws s3 sync build s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31 && aws s3 cp s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31/index.html s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31/index.html --metadata-directive REPLACE --cache-control max-age=0 --content-type text/html", + "format:check": "prettier --config .prettierrc.json --check \"./src/**/*.{ts,tsx}\"", + "format:fix": "prettier --config .prettierrc.json --write \"./src/**/*.{ts,tsx}\"", "get_artifacts": "./scripts/get_all_artifacts.sh", "lint:check": "eslint . --ext ts,tsx", "lint:fix": "yarn lint:check --fix", - "serve": "npm run buildenv-prod && serve -s build -l 3000 -c public/serve.json", - "start": "npm run buildenv-dev && REACT_APP_WALLET_VERSION=$npm_package_version react-scripts start", - "prebuild": "./bin/release.sh", - "build:prod": "yarn prebuild && GENERATE_SOURCEMAP=false REACT_APP_WALLET_VERSION=$npm_package_version REACT_APP_ENV=prod react-scripts build", - "build:dev": "yarn prebuild && GENERATE_SOURCEMAP=false REACT_APP_WALLET_VERSION=$npm_package_version REACT_APP_ENV=dev react-scripts build", - "audit-check": "audit-ci --moderate", "postinstall": "patch-package", "pre-commit": "lint-staged --allow-empty", + "prebuild": "./bin/release.sh", + "start": "react-scripts start", "test": "react-scripts test --watchAll=false", - "test:w": "react-scripts test --watchAll=true", - "snapshots": "react-scripts test -u", - "coverage": "yarn test --coverage", - "deploy:onegateway": "yarn build:prod && aws s3 rm s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31 --recursive && aws s3 sync build s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31 && aws s3 cp s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31/index.html s3://boba-gateway-staging-gatewaybucket-14ro8dd9i4p31/index.html --metadata-directive REPLACE --cache-control max-age=0 --content-type text/html", - "deploy:mainnet": "yarn build:prod && aws s3 rm s3://boba-gateway --recursive && aws s3 sync build s3://boba-gateway && aws s3 cp s3://boba-gateway/index.html s3://boba-gateway/index.html --metadata-directive REPLACE --cache-control max-age=0 --content-type text/html", - "deploy:goerli": "GENERATE_SOURCEMAP=false REACT_APP_WALLET_VERSION=$npm_package_version REACT_APP_ENV=prod REACT_APP_CHAIN=goerli react-scripts build && aws s3 rm s3://ethereum-testnet-gateway-gatewaybucket-jn968xk15skr --recursive && aws s3 sync build s3://ethereum-testnet-gateway-gatewaybucket-jn968xk15skr && aws s3 cp s3://ethereum-testnet-gateway-gatewaybucket-jn968xk15skr/index.html s3://ethereum-testnet-gateway-gatewaybucket-jn968xk15skr/index.html --metadata-directive REPLACE --cache-control max-age=0 --content-type text/html" + "test:coverage": "yarn test --coverage", + "test:u": "yarn test -u", + "test:w": "yarn test --watchAll=true" }, "dependencies": { "@apollo/client": "^3.5.10", @@ -37,8 +33,8 @@ "@mui/material": "^5.12.2", "@mui/styles": "^5.3.0", "@mui/system": "^5.12.1", - "@sentry/react": "^7.30.0", - "@sentry/tracing": "^7.30.0", + "@sentry/react": "^7.51.0", + "@sentry/tracing": "^7.51.0", "@walletconnect/web3-provider": "^1.8.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", @@ -67,7 +63,7 @@ "redux": "^4.1.2", "redux-persist": "^6.0.0", "redux-thunk": "^2.3.0", - "sass": "^1.51.0", + "sass": "^1.62.1", "serve": "^11.3.2", "styled-components": "^5.3.10", "truncate-middle": "^1.0.6", @@ -81,7 +77,6 @@ "not op_mini all" ], "devDependencies": { - "@beam-australia/react-env": "2.1.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^12.1.2", "@types/jest": "^29.5.1", @@ -102,7 +97,7 @@ }, "lint-staged": { "*.{ts,tsx}": [ - "yarn format", + "yarn format:fix", "yarn lint:check" ] }, diff --git a/packages/boba/gateway/src/actions/createAction.js b/packages/boba/gateway/src/actions/createAction.js index 6b7780e0bc..b9bb7e5b48 100644 --- a/packages/boba/gateway/src/actions/createAction.js +++ b/packages/boba/gateway/src/actions/createAction.js @@ -54,7 +54,9 @@ export function createAction (key, asyncAction) { // provide more information in special cases // MetaMask user rejected sig - throw up a banner - if (response.code === 4001) { + if ((response.code === 4001 || + response.hasOwnProperty('reason')) && response?.reason?.includes('user rejected transaction') + ) { console.log("MetaMask: user denied signature") errorMessage = 'MetaMask: Transaction was rejected by user - signature denied' } diff --git a/packages/boba/gateway/src/components/availableBridges/tests/__snapshots__/index.test.tsx.snap b/packages/boba/gateway/src/components/availableBridges/tests/__snapshots__/index.test.tsx.snap index 4c956f0015..f12e484e69 100644 --- a/packages/boba/gateway/src/components/availableBridges/tests/__snapshots__/index.test.tsx.snap +++ b/packages/boba/gateway/src/components/availableBridges/tests/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Avaialble Bridges should match snapshot connected on mainnet 1`] = ` +exports[`Available Bridges should match snapshot connected on mainnet 1`] = ` .c1 { padding: 0px; @@ -101,8 +101,8 @@ exports[`Avaialble Bridges should match snapshot connected on mainnet 1`] = ` `; -exports[`Avaialble Bridges should match snapshot network type is TESTNET 1`] = ``; +exports[`Available Bridges should match snapshot network type is TESTNET 1`] = ``; -exports[`Avaialble Bridges should match snapshot selected network is not ETHEREUM 1`] = ``; +exports[`Available Bridges should match snapshot selected network is not ETHEREUM 1`] = ``; -exports[`Avaialble Bridges should match snapshot token value is null 1`] = ``; +exports[`Available Bridges should match snapshot token value is null 1`] = ``; diff --git a/packages/boba/gateway/src/containers/modals/deposit/steps/bobaBeamAlert.tsx b/packages/boba/gateway/src/containers/modals/deposit/steps/bobaBeamAlert.tsx index 81e11c3d98..8e9aaa11e0 100644 --- a/packages/boba/gateway/src/containers/modals/deposit/steps/bobaBeamAlert.tsx +++ b/packages/boba/gateway/src/containers/modals/deposit/steps/bobaBeamAlert.tsx @@ -19,9 +19,9 @@ const BobaBeamAlert = () => { if (!!Number(BOBABEAM_STATUS) && activeNetwork === NETWORK.MOONBEAM) { return ( - Deposits are disabled. For users of Bobabeam or Bobabeam applications - you will need to transfer all your funds to Moonbeam mainnet before May - 15th or risk permanently losing access to any assets on Bobabeam + For users of Bobabeam or Bobabeam applications you will need to transfer + all your funds to Moonbeam mainnet before May 15th or risk permanently + losing access to any assets on Bobabeam ) } diff --git a/packages/boba/gateway/src/containers/modals/deposit/steps/tests/__snapshots__/bobaBeamAlert.test.tsx.snap b/packages/boba/gateway/src/containers/modals/deposit/steps/tests/__snapshots__/bobaBeamAlert.test.tsx.snap index 32c56c99b4..2b96e0c191 100644 --- a/packages/boba/gateway/src/containers/modals/deposit/steps/tests/__snapshots__/bobaBeamAlert.test.tsx.snap +++ b/packages/boba/gateway/src/containers/modals/deposit/steps/tests/__snapshots__/bobaBeamAlert.test.tsx.snap @@ -22,7 +22,9 @@ exports[`BobaBeamAlert should match the snapshot when active network is moonbeam

- Deposits are disabled. For users of Bobabeam or Bobabeam applications you will need to transfer all your funds to Moonbeam mainnet before May 15th or risk permanently losing access to any assets on Bobabeam + For users of Bobabeam or Bobabeam applications you will need to transfer all your funds to Moonbeam mainnet before May 15th or risk permanently losing access to any assets on Bobabeam

`; + +exports[`BobaBeamAlert should match the snapshot when active network is moonbeam and status is 0 1`] = ``; diff --git a/packages/boba/gateway/src/containers/modals/deposit/steps/tests/bobaBeamAlert.test.tsx b/packages/boba/gateway/src/containers/modals/deposit/steps/tests/bobaBeamAlert.test.tsx index e4e8b02613..eb021590f2 100644 --- a/packages/boba/gateway/src/containers/modals/deposit/steps/tests/bobaBeamAlert.test.tsx +++ b/packages/boba/gateway/src/containers/modals/deposit/steps/tests/bobaBeamAlert.test.tsx @@ -5,6 +5,7 @@ import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import BobaBeamAlert from '../bobaBeamAlert' import { NETWORK } from 'util/network/network.util' +import * as constants from 'util/constant' const mockStore = configureStore() @@ -27,6 +28,10 @@ const renderComponent = (state: any) => { describe('BobaBeamAlert', () => { test('should match the snapshot when active network is ethereum', () => { + Object.defineProperty(constants, 'BOBABEAM_STATUS', { + value: 1, + writable: true, + }) const { asFragment } = renderComponent({ network: { activeNetwork: NETWORK.ETHEREUM, @@ -36,6 +41,23 @@ describe('BobaBeamAlert', () => { }) test('should match the snapshot when active network is moonbeam', () => { + Object.defineProperty(constants, 'BOBABEAM_STATUS', { + value: 1, + writable: true, + }) + const { asFragment } = renderComponent({ + network: { + activeNetwork: NETWORK.MOONBEAM, + }, + }) + expect(asFragment()).toMatchSnapshot() + }) + + test('should match the snapshot when active network is moonbeam and status is 0', () => { + Object.defineProperty(constants, 'BOBABEAM_STATUS', { + value: 0, + writable: true, + }) const { asFragment } = renderComponent({ network: { activeNetwork: NETWORK.MOONBEAM, diff --git a/packages/boba/gateway/src/services/networkService.js b/packages/boba/gateway/src/services/networkService.js index 7a61368572..e2d9b25b5b 100644 --- a/packages/boba/gateway/src/services/networkService.js +++ b/packages/boba/gateway/src/services/networkService.js @@ -1172,7 +1172,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on Goerli and Mainnet - if (this.networkGateway === 'local') return + if(this.networkGateway !== NETWORK.ETHEREUM){ + return + } try { @@ -1210,7 +1212,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { @@ -1252,7 +1256,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { @@ -1294,7 +1300,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { @@ -1336,7 +1344,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { @@ -1380,7 +1390,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { @@ -1422,7 +1434,9 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return // ONLY SUPPORTED on MAINNET - if (this.networkGateway !== 'mainnet') return + if (!(this.networkGateway === NETWORK.ETHEREUM && this.networkType === NETWORK_TYPE.MAINNET)) { + return + } try { diff --git a/packages/boba/gateway/src/setupTests.ts b/packages/boba/gateway/src/setupTests.ts index 4f05ce31e5..eb84b434a0 100644 --- a/packages/boba/gateway/src/setupTests.ts +++ b/packages/boba/gateway/src/setupTests.ts @@ -1,3 +1,3 @@ -import '@testing-library/jest-dom' +import '@testing-library/jest-dom/extend-expect' // to fix the snapshot class modification issues. import 'jest-styled-components' diff --git a/packages/boba/gateway/tsconfig.json b/packages/boba/gateway/tsconfig.json index 79fe9b6cc2..fd0f5fa339 100644 --- a/packages/boba/gateway/tsconfig.json +++ b/packages/boba/gateway/tsconfig.json @@ -19,7 +19,6 @@ "noEmit": true, "jsx": "react", "baseUrl": "src" - }, "include": [ "src" diff --git a/packages/message-relayer/test/filter.spec.ts b/packages/message-relayer/test/filter.spec.ts index 33ba90f030..80f7c05eb9 100644 --- a/packages/message-relayer/test/filter.spec.ts +++ b/packages/message-relayer/test/filter.spec.ts @@ -1,6 +1,7 @@ import { expect } from './setup' import { ethers } from 'hardhat' import { MessageRelayerService } from '../src' +import { Server } from 'http' describe('message relayer filter tests', () => { const Proxy__L1StandardBridge = ethers.Wallet.createRandom().address @@ -10,16 +11,21 @@ describe('message relayer filter tests', () => { const L1Message = ethers.Wallet.createRandom().address let messageRelayerService: any + let server: Server const apiPort = 3000 let apiEndpoint: string + after(async () => { + await server.close(console.error) + }) + before(async () => { /* eslint-disable */ const http = require('http') const ip = require("ip") // start local server - const server = module.exports = http.createServer(async function (req, res) { + server = module.exports = http.createServer(async function (req, res) { req.on('data', () => {}) req.on('end', async () => { if (req.url === "/boba-addr.json") { diff --git a/specs/CHANGELOG.md b/specs/CHANGELOG.md index 2a9a7065a5..e2d4077377 100644 --- a/specs/CHANGELOG.md +++ b/specs/CHANGELOG.md @@ -1,6 +1,7 @@ # @eth-optimism/specs ## 0.2.0 + ### Minor Changes - 318857e: Add a new package to contain specs diff --git a/specs/README.md b/specs/README.md index 16d032cd5e..f2ced3940d 100644 --- a/specs/README.md +++ b/specs/README.md @@ -5,4 +5,4 @@ We're in the process of moving our specifications to the [optimistic-specs](https://github.com/ethereum-optimism/optimistic-specs) repository. **The specifications within this folder may be entirely outdated**. Please refer to the `optimistic-specs` repository for the most up-to-date system specifications. -We will remove this folder once the migration process is complete. \ No newline at end of file +We will remove this folder once the migration process is complete. diff --git a/yarn.lock b/yarn.lock index 8cbf56d33c..ae044682e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,12 +4,12 @@ "@adobe/css-tools@^4.0.1": version "4.2.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== "@ampproject/remapping@^2.1.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" @@ -17,7 +17,7 @@ "@apollo/client@^3.5.10": version "3.7.3" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.3.tgz#ab3fe31046e74bc1a3762363a185ba5bcfffc58b" + resolved "https://registry.npmjs.org/@apollo/client/-/client-3.7.3.tgz" integrity sha512-nzZ6d6a4flLpm3pZOGpuAUxLlp9heob7QcCkyIqZlCLvciUibgufRfYTwfkWCc4NaGHGSZyodzvfr79H6oUwGQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" @@ -36,40 +36,40 @@ "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.9.0": version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== "@babel/core@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz" integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" @@ -91,7 +91,7 @@ "@babel/core@^7.1.0", "@babel/core@^7.12.16", "@babel/core@^7.16.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5": version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" @@ -112,7 +112,7 @@ "@babel/eslint-parser@^7.12.16", "@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.18.2": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz" integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" @@ -121,7 +121,7 @@ "@babel/generator@^7.20.7", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz" integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== dependencies: "@babel/types" "^7.20.7" @@ -130,7 +130,7 @@ "@babel/generator@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== dependencies: "@babel/types" "^7.21.4" @@ -140,14 +140,14 @@ "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" @@ -155,7 +155,7 @@ "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.8.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: "@babel/compat-data" "^7.20.5" @@ -166,7 +166,7 @@ "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz" integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -180,7 +180,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz" integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -188,7 +188,7 @@ "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" @@ -200,19 +200,19 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: "@babel/types" "^7.18.6" "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: "@babel/template" "^7.18.10" @@ -220,7 +220,7 @@ "@babel/helper-function-name@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: "@babel/template" "^7.20.7" @@ -228,35 +228,35 @@ "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-member-expression-to-functions@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz" integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== dependencies: "@babel/types" "^7.20.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.9.0": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz" integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -270,19 +270,19 @@ "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -292,7 +292,7 @@ "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -304,43 +304,43 @@ "@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.19.4": version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.15.7", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" @@ -350,7 +350,7 @@ "@babel/helpers@^7.20.7", "@babel/helpers@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz" integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== dependencies: "@babel/template" "^7.20.7" @@ -359,7 +359,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6", "@babel/highlight@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" @@ -368,29 +368,29 @@ "@babel/parser@7.16.4": version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz" integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== "@babel/parser@^7.1.0", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz" integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== "@babel/parser@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -399,7 +399,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -409,7 +409,7 @@ "@babel/plugin-proposal-class-properties@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz" integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== dependencies: "@babel/helper-create-class-features-plugin" "^7.8.3" @@ -417,7 +417,7 @@ "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -425,7 +425,7 @@ "@babel/plugin-proposal-class-static-block@^7.18.6": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz" integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.20.7" @@ -434,7 +434,7 @@ "@babel/plugin-proposal-decorators@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz" integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== dependencies: "@babel/helper-create-class-features-plugin" "^7.8.3" @@ -443,7 +443,7 @@ "@babel/plugin-proposal-decorators@^7.16.4": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz" integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== dependencies: "@babel/helper-create-class-features-plugin" "^7.20.7" @@ -454,7 +454,7 @@ "@babel/plugin-proposal-dynamic-import@^7.18.6", "@babel/plugin-proposal-dynamic-import@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -462,7 +462,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -470,7 +470,7 @@ "@babel/plugin-proposal-json-strings@^7.18.6", "@babel/plugin-proposal-json-strings@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -478,7 +478,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -486,7 +486,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -494,7 +494,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -502,7 +502,7 @@ "@babel/plugin-proposal-numeric-separator@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz" integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -510,7 +510,7 @@ "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6", "@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -518,7 +518,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.20.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" @@ -529,7 +529,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.18.6", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -537,7 +537,7 @@ "@babel/plugin-proposal-optional-chaining@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz" integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -545,7 +545,7 @@ "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz" integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -554,7 +554,7 @@ "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -562,7 +562,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz" integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -572,7 +572,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -580,147 +580,147 @@ "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators@^7.19.0", "@babel/plugin-syntax-decorators@^7.8.3": version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz" integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" @@ -729,21 +729,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.20.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz" integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.20.2", "@babel/plugin-transform-classes@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz" integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -758,7 +758,7 @@ "@babel/plugin-transform-computed-properties@^7.18.9", "@babel/plugin-transform-computed-properties@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -766,14 +766,14 @@ "@babel/plugin-transform-destructuring@^7.20.2", "@babel/plugin-transform-destructuring@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -781,14 +781,14 @@ "@babel/plugin-transform-duplicate-keys@^7.18.9", "@babel/plugin-transform-duplicate-keys@^7.8.3": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.18.6", "@babel/plugin-transform-exponentiation-operator@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" @@ -796,7 +796,7 @@ "@babel/plugin-transform-flow-strip-types@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz" integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -804,7 +804,7 @@ "@babel/plugin-transform-flow-strip-types@^7.16.0": version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz" integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== dependencies: "@babel/helper-plugin-utils" "^7.19.0" @@ -812,14 +812,14 @@ "@babel/plugin-transform-for-of@^7.18.8", "@babel/plugin-transform-for-of@^7.9.0": version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-function-name@^7.18.9", "@babel/plugin-transform-function-name@^7.8.3": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" @@ -828,21 +828,21 @@ "@babel/plugin-transform-literals@^7.18.9", "@babel/plugin-transform-literals@^7.8.3": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.18.6", "@babel/plugin-transform-member-expression-literals@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.19.6", "@babel/plugin-transform-modules-amd@^7.9.0": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: "@babel/helper-module-transforms" "^7.20.11" @@ -850,7 +850,7 @@ "@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.9.0": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz" integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== dependencies: "@babel/helper-module-transforms" "^7.20.11" @@ -859,7 +859,7 @@ "@babel/plugin-transform-modules-systemjs@^7.19.6", "@babel/plugin-transform-modules-systemjs@^7.9.0": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" @@ -869,7 +869,7 @@ "@babel/plugin-transform-modules-umd@^7.18.6", "@babel/plugin-transform-modules-umd@^7.9.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: "@babel/helper-module-transforms" "^7.18.6" @@ -877,7 +877,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.20.5" @@ -885,14 +885,14 @@ "@babel/plugin-transform-new-target@^7.18.6", "@babel/plugin-transform-new-target@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.18.6", "@babel/plugin-transform-object-super@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -900,63 +900,63 @@ "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.8.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6", "@babel/plugin-transform-property-literals@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.0.0": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz" integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz" integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6", "@babel/plugin-transform-react-display-name@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-development@^7.18.6", "@babel/plugin-transform-react-jsx-development@^7.9.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx-self@^7.9.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz" integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-source@^7.9.0": version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz" integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.9.1": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz" integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -967,7 +967,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -975,7 +975,7 @@ "@babel/plugin-transform-regenerator@^7.18.6", "@babel/plugin-transform-regenerator@^7.8.7": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -983,14 +983,14 @@ "@babel/plugin-transform-reserved-words@^7.18.6", "@babel/plugin-transform-reserved-words@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz" integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== dependencies: "@babel/helper-module-imports" "^7.8.3" @@ -1000,7 +1000,7 @@ "@babel/plugin-transform-runtime@^7.16.4": version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== dependencies: "@babel/helper-module-imports" "^7.18.6" @@ -1012,7 +1012,7 @@ "@babel/plugin-transform-runtime@^7.5.5": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz#2a884f29556d0a68cd3d152dcc9e6c71dfb6eee8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz" integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== dependencies: "@babel/helper-module-imports" "^7.18.6" @@ -1024,14 +1024,14 @@ "@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.19.0", "@babel/plugin-transform-spread@^7.8.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -1039,28 +1039,28 @@ "@babel/plugin-transform-sticky-regex@^7.18.6", "@babel/plugin-transform-sticky-regex@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.18.9", "@babel/plugin-transform-template-literals@^7.8.3": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.18.9", "@babel/plugin-transform-typeof-symbol@^7.8.4": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6", "@babel/plugin-transform-typescript@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz" integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== dependencies: "@babel/helper-create-class-features-plugin" "^7.20.7" @@ -1069,14 +1069,14 @@ "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.18.6", "@babel/plugin-transform-unicode-regex@^7.8.3": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -1084,7 +1084,7 @@ "@babel/preset-env@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz" integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== dependencies: "@babel/compat-data" "^7.9.0" @@ -1150,7 +1150,7 @@ "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.4.5": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: "@babel/compat-data" "^7.20.1" @@ -1231,7 +1231,7 @@ "@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1242,7 +1242,7 @@ "@babel/preset-react@7.9.1": version "7.9.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz" integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -1254,7 +1254,7 @@ "@babel/preset-react@^7.0.0", "@babel/preset-react@^7.16.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -1266,7 +1266,7 @@ "@babel/preset-typescript@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz" integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -1274,7 +1274,7 @@ "@babel/preset-typescript@^7.16.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -1283,7 +1283,7 @@ "@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.12.1": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz#a1e5ea3d758ba6beb715210142912e3f29981d84" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz" integrity sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg== dependencies: core-js-pure "^3.25.1" @@ -1291,28 +1291,28 @@ "@babel/runtime@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz" integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== dependencies: regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz" integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== dependencies: regenerator-runtime "^0.13.11" "@babel/runtime@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" @@ -1321,7 +1321,7 @@ "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.5", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz" integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== dependencies: "@babel/code-frame" "^7.18.6" @@ -1337,7 +1337,7 @@ "@babel/traverse@^7.4.5": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== dependencies: "@babel/code-frame" "^7.21.4" @@ -1353,7 +1353,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz" integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== dependencies: "@babel/helper-string-parser" "^7.19.4" @@ -1362,31 +1362,21 @@ "@babel/types@^7.21.0", "@babel/types@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@beam-australia/react-env@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@beam-australia/react-env/-/react-env-2.1.2.tgz#12581373fcb20f68ac206cd8317a74261a9dde0c" - integrity sha512-gXcCGGGb2oRM/oeqT861JXsSTJjOxGTBMkj7J5ujEBb6Vmv5I108NcALPYYdGdzFCV6ebdVP+E5k0W1xAbzA7w== - dependencies: - cross-spawn "^6.0.5" - dotenv "^8.0.0" - dotenv-expand "^5.1.0" - minimist "^1.2.0" - "@chainlink/contracts@0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.3.1.tgz#a1a2e1b179a6ce6a9b5b16992f6202918110ef5c" + resolved "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.3.1.tgz" integrity sha512-A8DRvmfNCwLS1iduPPj7wNAZJMe9/ZimMhoHhbbBiq+7Vq/HFjiNcdoQ5NinFdXD5aTsoNUGG5pAYKj7YMpm9A== "@changesets/apply-release-plan@^6.1.3": version "6.1.3" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz#3bcc0bd57ba00d50d20df7d0141f1a9b2134eaf7" + resolved "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz" integrity sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg== dependencies: "@babel/runtime" "^7.20.1" @@ -1405,7 +1395,7 @@ "@changesets/assemble-release-plan@^5.2.3": version "5.2.3" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz#5ce6191c6e193d40b566a7b0e01690cfb106f4db" + resolved "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz" integrity sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g== dependencies: "@babel/runtime" "^7.20.1" @@ -1417,14 +1407,14 @@ "@changesets/changelog-git@^0.1.14": version "0.1.14" - resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.1.14.tgz#852caa7727dcf91497c131d05bc2cd6248532ada" + resolved "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz" integrity sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA== dependencies: "@changesets/types" "^5.2.1" "@changesets/cli@^2.16.0": version "2.26.0" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.26.0.tgz#f215ddb2b41574ffd0dda9cd77fac927ba048fd3" + resolved "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.0.tgz" integrity sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q== dependencies: "@babel/runtime" "^7.20.1" @@ -1463,7 +1453,7 @@ "@changesets/config@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.3.0.tgz#bff074d6492fa772cee139f9a04efa4cd56445bb" + resolved "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz" integrity sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ== dependencies: "@changesets/errors" "^0.1.4" @@ -1476,14 +1466,14 @@ "@changesets/errors@^0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" + resolved "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz" integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== dependencies: extendable-error "^0.1.5" "@changesets/get-dependents-graph@^1.3.5": version "1.3.5" - resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz#f94c6672d2f9a87aa35512eea74550585ba41c21" + resolved "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz" integrity sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA== dependencies: "@changesets/types" "^5.2.1" @@ -1494,7 +1484,7 @@ "@changesets/get-release-plan@^3.0.16": version "3.0.16" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz#5d9cfc4ffda02c496ef0fde407210de8e3a0fb19" + resolved "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz" integrity sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg== dependencies: "@babel/runtime" "^7.20.1" @@ -1507,12 +1497,12 @@ "@changesets/get-version-range-type@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" + resolved "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz" integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== "@changesets/git@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@changesets/git/-/git-2.0.0.tgz#8de57649baf13a86eb669a25fa51bcad5cea517f" + resolved "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz" integrity sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A== dependencies: "@babel/runtime" "^7.20.1" @@ -1525,14 +1515,14 @@ "@changesets/logger@^0.0.5": version "0.0.5" - resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" + resolved "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz" integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== dependencies: chalk "^2.1.0" "@changesets/parse@^0.3.16": version "0.3.16" - resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.16.tgz#f8337b70aeb476dc81745ab3294022909bc4a84a" + resolved "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz" integrity sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg== dependencies: "@changesets/types" "^5.2.1" @@ -1540,7 +1530,7 @@ "@changesets/pre@^1.0.14": version "1.0.14" - resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.14.tgz#9df73999a4d15804da7381358d77bb37b00ddf0f" + resolved "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz" integrity sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ== dependencies: "@babel/runtime" "^7.20.1" @@ -1551,7 +1541,7 @@ "@changesets/read@^0.5.9": version "0.5.9" - resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.5.9.tgz#a1b63a82b8e9409738d7a0f9cc39b6d7c28cbab0" + resolved "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz" integrity sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ== dependencies: "@babel/runtime" "^7.20.1" @@ -1565,17 +1555,17 @@ "@changesets/types@^4.0.1": version "4.1.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" + resolved "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz" integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== "@changesets/types@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-5.2.1.tgz#a228c48004aa8a93bce4be2d1d31527ef3bf21f6" + resolved "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz" integrity sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg== "@changesets/write@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.2.3.tgz#baf6be8ada2a67b9aba608e251bfea4fdc40bc63" + resolved "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz" integrity sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw== dependencies: "@babel/runtime" "^7.20.1" @@ -1586,7 +1576,7 @@ "@cnakazawa/watch@^1.0.3": version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" @@ -1594,7 +1584,7 @@ "@codechecks/client@^0.1.11": version "0.1.12" - resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.12.tgz#519f11be8fcaa581c6ee8d5e8457e35bbbe5d9b1" + resolved "https://registry.npmjs.org/@codechecks/client/-/client-0.1.12.tgz" integrity sha512-2GHHvhO3kaOyxFXxOaiznlY8ARmz33/p+WQdhc2y6wzWw5eOl2wSwg1eZxx3LsWlAnB963Y4bd1YjZcGIhKRzA== dependencies: bluebird "^3.5.3" @@ -1620,24 +1610,24 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@csstools/convert-colors@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== "@csstools/normalize.css@^10.1.0": version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + resolved "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== "@defi-wonderland/smock@^2.0.2": version "2.3.4" - resolved "https://registry.yarnpkg.com/@defi-wonderland/smock/-/smock-2.3.4.tgz#2bfe7e19052140634b25db344d77de9b0ac7a96b" + resolved "https://registry.npmjs.org/@defi-wonderland/smock/-/smock-2.3.4.tgz" integrity sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew== dependencies: "@nomicfoundation/ethereumjs-evm" "^1.0.0-rc.3" @@ -1651,12 +1641,12 @@ "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@emotion/babel-plugin@^11.10.5": version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz" integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -1674,7 +1664,7 @@ "@emotion/babel-plugin@^11.10.6": version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz" integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -1691,7 +1681,7 @@ "@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz" integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== dependencies: "@emotion/memoize" "^0.8.0" @@ -1702,7 +1692,7 @@ "@emotion/cache@^11.10.7": version "11.10.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz" integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== dependencies: "@emotion/memoize" "^0.8.0" @@ -1713,24 +1703,24 @@ "@emotion/hash@^0.9.0": version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== "@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== dependencies: "@emotion/memoize" "^0.8.0" "@emotion/memoize@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== "@emotion/react@^11.10.6": version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz" integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== dependencies: "@babel/runtime" "^7.18.3" @@ -1744,7 +1734,7 @@ "@emotion/react@^11.8.1": version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz" integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== dependencies: "@babel/runtime" "^7.18.3" @@ -1758,7 +1748,7 @@ "@emotion/serialize@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz" integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== dependencies: "@emotion/hash" "^0.9.0" @@ -1769,12 +1759,12 @@ "@emotion/sheet@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz" integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== "@emotion/styled@^11.6.0": version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz" integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== dependencies: "@babel/runtime" "^7.18.3" @@ -1786,37 +1776,37 @@ "@emotion/stylis@^0.8.4": version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== "@emotion/unitless@^0.7.4": version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== "@emotion/unitless@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== "@emotion/use-insertion-effect-with-fallbacks@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== "@emotion/utils@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== "@emotion/weak-memoize@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== "@ensdomains/address-encoder@^0.1.7": version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" + resolved "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz" integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== dependencies: bech32 "^1.1.3" @@ -1829,7 +1819,7 @@ "@ensdomains/ens@0.4.5", "@ensdomains/ens@^0.4.4": version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== dependencies: bluebird "^3.5.2" @@ -1840,7 +1830,7 @@ "@ensdomains/ensjs@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" + resolved "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz" integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== dependencies: "@babel/runtime" "^7.4.4" @@ -1854,12 +1844,12 @@ "@ensdomains/resolver@0.2.4", "@ensdomains/resolver@^0.2.4": version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== "@es-joy/jsdoccomment@0.9.0-alpha.1": version "0.9.0-alpha.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz#f48bd162e185ec7f9f222273a282d10e52fe52f7" + resolved "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz" integrity sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA== dependencies: comment-parser "1.1.6-beta.0" @@ -1868,7 +1858,7 @@ "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -1883,7 +1873,7 @@ "@eslint/eslintrc@^1.4.1": version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz" integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== dependencies: ajv "^6.12.4" @@ -1898,14 +1888,14 @@ "@eth-optimism/ynatm@^0.2.2": version "0.2.2" - resolved "https://registry.yarnpkg.com/@eth-optimism/ynatm/-/ynatm-0.2.2.tgz#b1f165c3149188f184b66329228746260ae18677" + resolved "https://registry.npmjs.org/@eth-optimism/ynatm/-/ynatm-0.2.2.tgz" integrity sha512-R/hIAFWEj2sjf3inNEGCffmGofqMFY/7PS/Hh4A/62Kg0wMM8rsyMyW8pXngMnD/EQAjR8WTtKDutq/L5vSMTQ== dependencies: bluebird "^3.7.2" "@ethereum-waffle/chai@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" + resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz" integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== dependencies: "@ethereum-waffle/provider" "^3.4.4" @@ -1913,7 +1903,7 @@ "@ethereum-waffle/compiler@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" + resolved "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz" integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== dependencies: "@resolver-engine/imports" "^0.3.3" @@ -1930,7 +1920,7 @@ "@ethereum-waffle/ens@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" + resolved "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz" integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== dependencies: "@ensdomains/ens" "^0.4.4" @@ -1939,7 +1929,7 @@ "@ethereum-waffle/mock-contract@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz#fc6ffa18813546f4950a69f5892d4dd54b2c685a" + resolved "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz" integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== dependencies: "@ethersproject/abi" "^5.5.0" @@ -1947,7 +1937,7 @@ "@ethereum-waffle/provider@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" + resolved "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz" integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== dependencies: "@ethereum-waffle/ens" "^3.4.4" @@ -1958,7 +1948,7 @@ "@ethereumjs/common@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz" integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== dependencies: crc-32 "^1.2.0" @@ -1966,7 +1956,7 @@ "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" @@ -1974,7 +1964,7 @@ "@ethereumjs/tx@3.3.2": version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz" integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== dependencies: "@ethereumjs/common" "^2.5.0" @@ -1982,7 +1972,7 @@ "@ethereumjs/tx@^3.3.2": version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: "@ethereumjs/common" "^2.6.4" @@ -1990,7 +1980,7 @@ "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz" integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== dependencies: "@ethersproject/address" ">=5.0.0-beta.128" @@ -2005,7 +1995,7 @@ "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.12", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -2020,7 +2010,7 @@ "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.5.1", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -2033,7 +2023,7 @@ "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -2044,7 +2034,7 @@ "@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -2055,14 +2045,14 @@ "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2070,7 +2060,7 @@ "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2079,21 +2069,21 @@ "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.4.1", "@ethersproject/contracts@^5.5.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -2109,7 +2099,7 @@ "@ethersproject/hardware-wallets@^5.5.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hardware-wallets/-/hardware-wallets-5.7.0.tgz#1c902fc255e2f108af44d4c1dc46ec2c34cb669c" + resolved "https://registry.npmjs.org/@ethersproject/hardware-wallets/-/hardware-wallets-5.7.0.tgz" integrity sha512-DjMMXIisRc8xFvEoLoYz1w7JDOYmaz/a0X9sp7Zu668RR8U1zCAyj5ow25HLRW+TCzEC5XiFetTXqS5kXonFCQ== dependencies: "@ledgerhq/hw-app-eth" "5.27.2" @@ -2121,7 +2111,7 @@ "@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -2136,7 +2126,7 @@ "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -2154,7 +2144,7 @@ "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -2173,7 +2163,7 @@ "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2181,19 +2171,19 @@ "@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2201,14 +2191,14 @@ "@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.4", "@ethersproject/providers@^5.5.0", "@ethersproject/providers@^5.5.3", "@ethersproject/providers@^5.7.0": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -2234,7 +2224,7 @@ "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2242,7 +2232,7 @@ "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2250,7 +2240,7 @@ "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2259,7 +2249,7 @@ "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2271,7 +2261,7 @@ "@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.0.0", "@ethersproject/solidity@^5.0.9", "@ethersproject/solidity@^5.4.0", "@ethersproject/solidity@^5.5.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -2283,7 +2273,7 @@ "@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2292,7 +2282,7 @@ "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -2307,7 +2297,7 @@ "@ethersproject/units@5.7.0", "@ethersproject/units@^5.5.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -2316,7 +2306,7 @@ "@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.0.0", "@ethersproject/wallet@^5.4.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -2337,7 +2327,7 @@ "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -2348,7 +2338,7 @@ "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -2359,54 +2349,54 @@ "@floating-ui/core@^1.0.5": version "1.1.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.1.0.tgz#0a1dee4bbce87ff71602625d33f711cafd8afc08" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz" integrity sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ== "@floating-ui/dom@^1.0.1": version "1.1.0" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.1.0.tgz#29fea1344fdef15b6ba270a733d20b7134fee5c2" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz" integrity sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A== dependencies: "@floating-ui/core" "^1.0.5" "@gar/promisify@^1.0.1": version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@gnosis.pm/safe-contracts@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz#316741a7690d8751a1f701538cfc9ec80866eedc" + resolved "https://registry.npmjs.org/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz" integrity sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw== "@graphql-typed-document-node/core@^3.1.1": version "3.1.1" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== "@hapi/address@2.x.x": version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + resolved "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz" integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== "@hapi/bourne@1.x.x": version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + resolved "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz" integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== "@hapi/bourne@^2.0.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + resolved "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz" integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== "@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz" integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== "@hapi/joi@^15.0.0": version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + resolved "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz" integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== dependencies: "@hapi/address" "2.x.x" @@ -2416,14 +2406,14 @@ "@hapi/topo@3.x.x": version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz" integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== dependencies: "@hapi/hoek" "^8.3.0" "@humanwhocodes/config-array@^0.11.8": version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" @@ -2432,7 +2422,7 @@ "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -2441,22 +2431,22 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" - resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -2467,12 +2457,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + resolved "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz" integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== dependencies: "@jest/source-map" "^24.9.0" @@ -2481,7 +2471,7 @@ "@jest/core@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + resolved "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz" integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== dependencies: "@jest/console" "^24.7.1" @@ -2515,7 +2505,7 @@ "@jest/environment@^24.3.0", "@jest/environment@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz" integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== dependencies: "@jest/fake-timers" "^24.9.0" @@ -2525,14 +2515,14 @@ "@jest/expect-utils@^29.5.0": version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz" integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: jest-get-type "^29.4.3" "@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz" integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== dependencies: "@jest/types" "^24.9.0" @@ -2541,7 +2531,7 @@ "@jest/reporters@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz" integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== dependencies: "@jest/environment" "^24.9.0" @@ -2568,14 +2558,14 @@ "@jest/schemas@^29.4.3": version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz" integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: "@sinclair/typebox" "^0.25.16" "@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz" integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== dependencies: callsites "^3.0.0" @@ -2584,7 +2574,7 @@ "@jest/test-result@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz" integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== dependencies: "@jest/console" "^24.9.0" @@ -2593,7 +2583,7 @@ "@jest/test-sequencer@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz" integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== dependencies: "@jest/test-result" "^24.9.0" @@ -2603,7 +2593,7 @@ "@jest/transform@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz" integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== dependencies: "@babel/core" "^7.1.0" @@ -2625,7 +2615,7 @@ "@jest/types@^24.3.0", "@jest/types@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz" integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -2634,7 +2624,7 @@ "@jest/types@^29.5.0": version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: "@jest/schemas" "^29.4.3" @@ -2646,7 +2636,7 @@ "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -2654,7 +2644,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -2663,17 +2653,17 @@ "@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -2681,12 +2671,12 @@ "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -2694,7 +2684,7 @@ "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" @@ -2702,7 +2692,7 @@ "@jridgewell/trace-mapping@^0.3.17": version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" @@ -2710,14 +2700,14 @@ "@ledgerhq/cryptoassets@^5.27.2": version "5.53.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58" + resolved "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz" integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw== dependencies: invariant "2" "@ledgerhq/devices@^5.26.0", "@ledgerhq/devices@^5.51.1": version "5.51.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7" + resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz" integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== dependencies: "@ledgerhq/errors" "^5.50.0" @@ -2727,12 +2717,12 @@ "@ledgerhq/errors@^5.26.0", "@ledgerhq/errors@^5.50.0": version "5.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9" + resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz" integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== "@ledgerhq/hw-app-eth@5.27.2": version "5.27.2" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz#65a2ed613a69340e0cd69c942147455ec513d006" + resolved "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz" integrity sha512-llNdrE894cCN8j6yxJEUniciyLVcLmu5N0UmIJLOObztG+5rOF4bX54h4SreTWK+E10Z0CzHSeyE5Lz/tVcqqQ== dependencies: "@ledgerhq/cryptoassets" "^5.27.2" @@ -2743,7 +2733,7 @@ "@ledgerhq/hw-transport-node-hid-noevents@^5.26.0": version "5.51.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz#71f37f812e448178ad0bcc2258982150d211c1ab" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz" integrity sha512-9wFf1L8ZQplF7XOY2sQGEeOhpmBRzrn+4X43kghZ7FBDoltrcK+s/D7S+7ffg3j2OySyP6vIIIgloXylao5Scg== dependencies: "@ledgerhq/devices" "^5.51.1" @@ -2754,7 +2744,7 @@ "@ledgerhq/hw-transport-node-hid@5.26.0": version "5.26.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz#69bc4f8067cdd9c09ef4aed0e0b3c58328936e4b" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz" integrity sha512-qhaefZVZatJ6UuK8Wb6WSFNOLWc2mxcv/xgsfKi5HJCIr4bPF/ecIeN+7fRcEaycxj4XykY6Z4A7zDVulfFH4w== dependencies: "@ledgerhq/devices" "^5.26.0" @@ -2768,7 +2758,7 @@ "@ledgerhq/hw-transport-u2f@5.26.0": version "5.26.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz#b7d9d13193eb82b051fd7a838cd652372f907ec5" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz" integrity sha512-QTxP1Rsh+WZ184LUOelYVLeaQl3++V3I2jFik+l9JZtakwEHjD0XqOT750xpYNL/vfHsy31Wlz+oicdxGzFk+w== dependencies: "@ledgerhq/errors" "^5.26.0" @@ -2778,7 +2768,7 @@ "@ledgerhq/hw-transport@5.26.0": version "5.26.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz#bfedc3d48400ad2fe48278d9444344b72aa9d0fe" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz" integrity sha512-NFeJOJmyEfAX8uuIBTpocWHcz630sqPcXbu864Q+OCBm4EK5UOKV1h/pX7e0xgNIKY8zhJ/O4p4cIZp9tnXLHQ== dependencies: "@ledgerhq/devices" "^5.26.0" @@ -2787,7 +2777,7 @@ "@ledgerhq/hw-transport@^5.26.0", "@ledgerhq/hw-transport@^5.51.1": version "5.51.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz" integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== dependencies: "@ledgerhq/devices" "^5.51.1" @@ -2796,12 +2786,12 @@ "@ledgerhq/logs@^5.26.0", "@ledgerhq/logs@^5.50.0": version "5.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" + resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== "@lerna/add@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" + resolved "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz" integrity sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng== dependencies: "@lerna/bootstrap" "4.0.0" @@ -2817,7 +2807,7 @@ "@lerna/bootstrap@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-4.0.0.tgz#5f5c5e2c6cfc8fcec50cb2fbe569a8c607101891" + resolved "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-4.0.0.tgz" integrity sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw== dependencies: "@lerna/command" "4.0.0" @@ -2845,7 +2835,7 @@ "@lerna/changed@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-4.0.0.tgz#b9fc76cea39b9292a6cd263f03eb57af85c9270b" + resolved "https://registry.npmjs.org/@lerna/changed/-/changed-4.0.0.tgz" integrity sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ== dependencies: "@lerna/collect-updates" "4.0.0" @@ -2855,7 +2845,7 @@ "@lerna/check-working-tree@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz#257e36a602c00142e76082a19358e3e1ae8dbd58" + resolved "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz" integrity sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q== dependencies: "@lerna/collect-uncommitted" "4.0.0" @@ -2864,7 +2854,7 @@ "@lerna/child-process@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-4.0.0.tgz#341b96a57dffbd9705646d316e231df6fa4df6e1" + resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-4.0.0.tgz" integrity sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q== dependencies: chalk "^4.1.0" @@ -2873,7 +2863,7 @@ "@lerna/clean@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-4.0.0.tgz#8f778b6f2617aa2a936a6b5e085ae62498e57dc5" + resolved "https://registry.npmjs.org/@lerna/clean/-/clean-4.0.0.tgz" integrity sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA== dependencies: "@lerna/command" "4.0.0" @@ -2887,7 +2877,7 @@ "@lerna/cli@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-4.0.0.tgz#8eabd334558836c1664df23f19acb95e98b5bbf3" + resolved "https://registry.npmjs.org/@lerna/cli/-/cli-4.0.0.tgz" integrity sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA== dependencies: "@lerna/global-options" "4.0.0" @@ -2897,7 +2887,7 @@ "@lerna/collect-uncommitted@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz#855cd64612969371cfc2453b90593053ff1ba779" + resolved "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz" integrity sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g== dependencies: "@lerna/child-process" "4.0.0" @@ -2906,7 +2896,7 @@ "@lerna/collect-updates@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-4.0.0.tgz#8e208b1bafd98a372ff1177f7a5e288f6bea8041" + resolved "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-4.0.0.tgz" integrity sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw== dependencies: "@lerna/child-process" "4.0.0" @@ -2917,7 +2907,7 @@ "@lerna/command@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-4.0.0.tgz#991c7971df8f5bf6ae6e42c808869a55361c1b98" + resolved "https://registry.npmjs.org/@lerna/command/-/command-4.0.0.tgz" integrity sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A== dependencies: "@lerna/child-process" "4.0.0" @@ -2933,7 +2923,7 @@ "@lerna/conventional-commits@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz#660fb2c7b718cb942ead70110df61f18c6f99750" + resolved "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz" integrity sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw== dependencies: "@lerna/validation-error" "4.0.0" @@ -2950,7 +2940,7 @@ "@lerna/create-symlink@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-4.0.0.tgz#8c5317ce5ae89f67825443bd7651bf4121786228" + resolved "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-4.0.0.tgz" integrity sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig== dependencies: cmd-shim "^4.1.0" @@ -2959,7 +2949,7 @@ "@lerna/create@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-4.0.0.tgz#b6947e9b5dfb6530321952998948c3e63d64d730" + resolved "https://registry.npmjs.org/@lerna/create/-/create-4.0.0.tgz" integrity sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag== dependencies: "@lerna/child-process" "4.0.0" @@ -2983,7 +2973,7 @@ "@lerna/describe-ref@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-4.0.0.tgz#53c53b4ea65fdceffa072a62bfebe6772c45d9ec" + resolved "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-4.0.0.tgz" integrity sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ== dependencies: "@lerna/child-process" "4.0.0" @@ -2991,7 +2981,7 @@ "@lerna/diff@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-4.0.0.tgz#6d3071817aaa4205a07bf77cfc6e932796d48b92" + resolved "https://registry.npmjs.org/@lerna/diff/-/diff-4.0.0.tgz" integrity sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag== dependencies: "@lerna/child-process" "4.0.0" @@ -3001,7 +2991,7 @@ "@lerna/exec@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-4.0.0.tgz#eb6cb95cb92d42590e9e2d628fcaf4719d4a8be6" + resolved "https://registry.npmjs.org/@lerna/exec/-/exec-4.0.0.tgz" integrity sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw== dependencies: "@lerna/child-process" "4.0.0" @@ -3014,7 +3004,7 @@ "@lerna/filter-options@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-4.0.0.tgz#ac94cc515d7fa3b47e2f7d74deddeabb1de5e9e6" + resolved "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-4.0.0.tgz" integrity sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw== dependencies: "@lerna/collect-updates" "4.0.0" @@ -3024,7 +3014,7 @@ "@lerna/filter-packages@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-4.0.0.tgz#b1f70d70e1de9cdd36a4e50caa0ac501f8d012f2" + resolved "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-4.0.0.tgz" integrity sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA== dependencies: "@lerna/validation-error" "4.0.0" @@ -3033,14 +3023,14 @@ "@lerna/get-npm-exec-opts@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz#dc955be94a4ae75c374ef9bce91320887d34608f" + resolved "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz" integrity sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ== dependencies: npmlog "^4.1.2" "@lerna/get-packed@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-4.0.0.tgz#0989d61624ac1f97e393bdad2137c49cd7a37823" + resolved "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-4.0.0.tgz" integrity sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w== dependencies: fs-extra "^9.1.0" @@ -3049,7 +3039,7 @@ "@lerna/github-client@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-4.0.0.tgz#2ced67721363ef70f8e12ffafce4410918f4a8a4" + resolved "https://registry.npmjs.org/@lerna/github-client/-/github-client-4.0.0.tgz" integrity sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw== dependencies: "@lerna/child-process" "4.0.0" @@ -3060,7 +3050,7 @@ "@lerna/gitlab-client@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz#00dad73379c7b38951d4b4ded043504c14e2b67d" + resolved "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz" integrity sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA== dependencies: node-fetch "^2.6.1" @@ -3069,12 +3059,12 @@ "@lerna/global-options@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-4.0.0.tgz#c7d8b0de6a01d8a845e2621ea89e7f60f18c6a5f" + resolved "https://registry.npmjs.org/@lerna/global-options/-/global-options-4.0.0.tgz" integrity sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ== "@lerna/has-npm-version@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz#d3fc3292c545eb28bd493b36e6237cf0279f631c" + resolved "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz" integrity sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg== dependencies: "@lerna/child-process" "4.0.0" @@ -3082,7 +3072,7 @@ "@lerna/import@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-4.0.0.tgz#bde656c4a451fa87ae41733ff8a8da60547c5465" + resolved "https://registry.npmjs.org/@lerna/import/-/import-4.0.0.tgz" integrity sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg== dependencies: "@lerna/child-process" "4.0.0" @@ -3096,7 +3086,7 @@ "@lerna/info@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-4.0.0.tgz#b9fb0e479d60efe1623603958a831a88b1d7f1fc" + resolved "https://registry.npmjs.org/@lerna/info/-/info-4.0.0.tgz" integrity sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q== dependencies: "@lerna/command" "4.0.0" @@ -3105,7 +3095,7 @@ "@lerna/init@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-4.0.0.tgz#dadff67e6dfb981e8ccbe0e6a310e837962f6c7a" + resolved "https://registry.npmjs.org/@lerna/init/-/init-4.0.0.tgz" integrity sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ== dependencies: "@lerna/child-process" "4.0.0" @@ -3116,7 +3106,7 @@ "@lerna/link@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-4.0.0.tgz#c3a38aabd44279d714e90f2451e31b63f0fb65ba" + resolved "https://registry.npmjs.org/@lerna/link/-/link-4.0.0.tgz" integrity sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w== dependencies: "@lerna/command" "4.0.0" @@ -3127,7 +3117,7 @@ "@lerna/list@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-4.0.0.tgz#24b4e6995bd73f81c556793fe502b847efd9d1d7" + resolved "https://registry.npmjs.org/@lerna/list/-/list-4.0.0.tgz" integrity sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg== dependencies: "@lerna/command" "4.0.0" @@ -3137,7 +3127,7 @@ "@lerna/listable@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-4.0.0.tgz#d00d6cb4809b403f2b0374fc521a78e318b01214" + resolved "https://registry.npmjs.org/@lerna/listable/-/listable-4.0.0.tgz" integrity sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ== dependencies: "@lerna/query-graph" "4.0.0" @@ -3146,7 +3136,7 @@ "@lerna/log-packed@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-4.0.0.tgz#95168fe2e26ac6a71e42f4be857519b77e57a09f" + resolved "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-4.0.0.tgz" integrity sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ== dependencies: byte-size "^7.0.0" @@ -3156,7 +3146,7 @@ "@lerna/npm-conf@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-4.0.0.tgz#b259fd1e1cee2bf5402b236e770140ff9ade7fd2" + resolved "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-4.0.0.tgz" integrity sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw== dependencies: config-chain "^1.1.12" @@ -3164,7 +3154,7 @@ "@lerna/npm-dist-tag@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz#d1e99b4eccd3414142f0548ad331bf2d53f3257a" + resolved "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz" integrity sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw== dependencies: "@lerna/otplease" "4.0.0" @@ -3174,7 +3164,7 @@ "@lerna/npm-install@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-4.0.0.tgz#31180be3ab3b7d1818a1a0c206aec156b7094c78" + resolved "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-4.0.0.tgz" integrity sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg== dependencies: "@lerna/child-process" "4.0.0" @@ -3187,7 +3177,7 @@ "@lerna/npm-publish@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-4.0.0.tgz#84eb62e876fe949ae1fd62c60804423dbc2c4472" + resolved "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-4.0.0.tgz" integrity sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w== dependencies: "@lerna/otplease" "4.0.0" @@ -3201,7 +3191,7 @@ "@lerna/npm-run-script@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz#dfebf4f4601442e7c0b5214f9fb0d96c9350743b" + resolved "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz" integrity sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA== dependencies: "@lerna/child-process" "4.0.0" @@ -3210,21 +3200,21 @@ "@lerna/otplease@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-4.0.0.tgz#84972eb43448f8a1077435ba1c5e59233b725850" + resolved "https://registry.npmjs.org/@lerna/otplease/-/otplease-4.0.0.tgz" integrity sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw== dependencies: "@lerna/prompt" "4.0.0" "@lerna/output@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-4.0.0.tgz#b1d72215c0e35483e4f3e9994debc82c621851f2" + resolved "https://registry.npmjs.org/@lerna/output/-/output-4.0.0.tgz" integrity sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w== dependencies: npmlog "^4.1.2" "@lerna/pack-directory@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-4.0.0.tgz#8b617db95d20792f043aaaa13a9ccc0e04cb4c74" + resolved "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-4.0.0.tgz" integrity sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ== dependencies: "@lerna/get-packed" "4.0.0" @@ -3237,7 +3227,7 @@ "@lerna/package-graph@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-4.0.0.tgz#16a00253a8ac810f72041481cb46bcee8d8123dd" + resolved "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-4.0.0.tgz" integrity sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw== dependencies: "@lerna/prerelease-id-from-version" "4.0.0" @@ -3248,7 +3238,7 @@ "@lerna/package@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-4.0.0.tgz#1b4c259c4bcff45c876ee1d591a043aacbc0d6b7" + resolved "https://registry.npmjs.org/@lerna/package/-/package-4.0.0.tgz" integrity sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q== dependencies: load-json-file "^6.2.0" @@ -3257,14 +3247,14 @@ "@lerna/prerelease-id-from-version@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz#c7e0676fcee1950d85630e108eddecdd5b48c916" + resolved "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz" integrity sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg== dependencies: semver "^7.3.4" "@lerna/profiler@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-4.0.0.tgz#8a53ab874522eae15d178402bff90a14071908e9" + resolved "https://registry.npmjs.org/@lerna/profiler/-/profiler-4.0.0.tgz" integrity sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q== dependencies: fs-extra "^9.1.0" @@ -3273,7 +3263,7 @@ "@lerna/project@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-4.0.0.tgz#ff84893935833533a74deff30c0e64ddb7f0ba6b" + resolved "https://registry.npmjs.org/@lerna/project/-/project-4.0.0.tgz" integrity sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg== dependencies: "@lerna/package" "4.0.0" @@ -3291,7 +3281,7 @@ "@lerna/prompt@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-4.0.0.tgz#5ec69a803f3f0db0ad9f221dad64664d3daca41b" + resolved "https://registry.npmjs.org/@lerna/prompt/-/prompt-4.0.0.tgz" integrity sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ== dependencies: inquirer "^7.3.3" @@ -3299,7 +3289,7 @@ "@lerna/publish@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-4.0.0.tgz#f67011305adeba120066a3b6d984a5bb5fceef65" + resolved "https://registry.npmjs.org/@lerna/publish/-/publish-4.0.0.tgz" integrity sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg== dependencies: "@lerna/check-working-tree" "4.0.0" @@ -3333,21 +3323,21 @@ "@lerna/pulse-till-done@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz#04bace7d483a8205c187b806bcd8be23d7bb80a3" + resolved "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz" integrity sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg== dependencies: npmlog "^4.1.2" "@lerna/query-graph@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-4.0.0.tgz#09dd1c819ac5ee3f38db23931143701f8a6eef63" + resolved "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-4.0.0.tgz" integrity sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg== dependencies: "@lerna/package-graph" "4.0.0" "@lerna/resolve-symlink@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz#6d006628a210c9b821964657a9e20a8c9a115e14" + resolved "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz" integrity sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA== dependencies: fs-extra "^9.1.0" @@ -3356,7 +3346,7 @@ "@lerna/rimraf-dir@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz#2edf3b62d4eb0ef4e44e430f5844667d551ec25a" + resolved "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz" integrity sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg== dependencies: "@lerna/child-process" "4.0.0" @@ -3366,7 +3356,7 @@ "@lerna/run-lifecycle@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz#e648a46f9210a9bcd7c391df6844498cb5079334" + resolved "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz" integrity sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ== dependencies: "@lerna/npm-conf" "4.0.0" @@ -3375,7 +3365,7 @@ "@lerna/run-topologically@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-4.0.0.tgz#af846eeee1a09b0c2be0d1bfb5ef0f7b04bb1827" + resolved "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-4.0.0.tgz" integrity sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA== dependencies: "@lerna/query-graph" "4.0.0" @@ -3383,7 +3373,7 @@ "@lerna/run@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-4.0.0.tgz#4bc7fda055a729487897c23579694f6183c91262" + resolved "https://registry.npmjs.org/@lerna/run/-/run-4.0.0.tgz" integrity sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ== dependencies: "@lerna/command" "4.0.0" @@ -3398,7 +3388,7 @@ "@lerna/symlink-binary@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz#21009f62d53a425f136cb4c1a32c6b2a0cc02d47" + resolved "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz" integrity sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA== dependencies: "@lerna/create-symlink" "4.0.0" @@ -3408,7 +3398,7 @@ "@lerna/symlink-dependencies@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz#8910eca084ae062642d0490d8972cf2d98e9ebbd" + resolved "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz" integrity sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw== dependencies: "@lerna/create-symlink" "4.0.0" @@ -3420,19 +3410,19 @@ "@lerna/timer@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-4.0.0.tgz#a52e51bfcd39bfd768988049ace7b15c1fd7a6da" + resolved "https://registry.npmjs.org/@lerna/timer/-/timer-4.0.0.tgz" integrity sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg== "@lerna/validation-error@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-4.0.0.tgz#af9d62fe8304eaa2eb9a6ba1394f9aa807026d35" + resolved "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-4.0.0.tgz" integrity sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw== dependencies: npmlog "^4.1.2" "@lerna/version@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-4.0.0.tgz#532659ec6154d8a8789c5ab53878663e244e3228" + resolved "https://registry.npmjs.org/@lerna/version/-/version-4.0.0.tgz" integrity sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA== dependencies: "@lerna/check-working-tree" "4.0.0" @@ -3464,7 +3454,7 @@ "@lerna/write-log-file@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-4.0.0.tgz#18221a38a6a307d6b0a5844dd592ad53fa27091e" + resolved "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-4.0.0.tgz" integrity sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg== dependencies: npmlog "^4.1.2" @@ -3472,7 +3462,7 @@ "@manypkg/find-root@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + resolved "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz" integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== dependencies: "@babel/runtime" "^7.5.5" @@ -3482,7 +3472,7 @@ "@manypkg/get-packages@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" + resolved "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz" integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== dependencies: "@babel/runtime" "^7.5.5" @@ -3494,7 +3484,7 @@ "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -3505,12 +3495,12 @@ "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + resolved "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + resolved "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz" integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: call-me-maybe "^1.0.1" @@ -3518,7 +3508,7 @@ "@mui/base@5.0.0-alpha.127": version "5.0.0-alpha.127" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.127.tgz#bc61eaf1fd31094c939b6521cfea21643207c3b4" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.127.tgz" integrity sha512-FoRQd0IOH9MnfyL5yXssyQRnC4vXI+1bwkU1idr+wNkP1ZfxE+JsThHcfl1dy5azLssVUGTtQFD9edQLdbyJog== dependencies: "@babel/runtime" "^7.21.0" @@ -3532,7 +3522,7 @@ "@mui/base@^5.0.0-alpha.67": version "5.0.0-alpha.113" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.113.tgz#51ab20c3a4cf31db4a5540ecf17d7ea6f73b3001" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.113.tgz" integrity sha512-XSjvyQWATM8uk+EJZvYna8D21kOXC42lwb3q4K70btuGieKlCIQLaHTTDV2OfD4+JfT4o3NJy3I4Td2co31RZA== dependencies: "@babel/runtime" "^7.20.7" @@ -3546,19 +3536,19 @@ "@mui/core-downloads-tracker@^5.12.2": version "5.12.2" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.2.tgz#4a0186d25b01d693171366e1c00de0e7c8c35f6a" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.2.tgz" integrity sha512-Qn7dy8tql6T0hY6gTFPkpWlnqVVFGu5Z6QzEzUSzzmLZpfAx4kf8sFz0PHiB7gU5yrqcZF9picMx1shpRY/rXw== "@mui/icons-material@^5.11.16": version "5.11.16" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz" integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== dependencies: "@babel/runtime" "^7.21.0" "@mui/material@^5.12.2": version "5.12.2" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.12.2.tgz#c3fcc94e523d9e673e2e045dfad04d12ab454a80" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.12.2.tgz" integrity sha512-XOVy6fVC0rI2dEwDq/1s4Te2hewTUe6lznzeVnruyATGkdmM06WnHqkZOoLVIWo9hWwAxpcgTDcAIVpFtt1nrw== dependencies: "@babel/runtime" "^7.21.0" @@ -3576,7 +3566,7 @@ "@mui/private-theming@^5.11.2": version "5.11.2" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.11.2.tgz#93eafb317070888a988efa8d6a9ec1f69183a606" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.2.tgz" integrity sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg== dependencies: "@babel/runtime" "^7.20.7" @@ -3585,7 +3575,7 @@ "@mui/private-theming@^5.12.0": version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.12.0.tgz#5f1e6fd09b1447c387fdac1eef7f23efca5c6d69" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.12.0.tgz" integrity sha512-w5dwMen1CUm1puAtubqxY9BIzrBxbOThsg2iWMvRJmWyJAPdf3Z583fPXpqeA2lhTW79uH2jajk5Ka4FuGlTPg== dependencies: "@babel/runtime" "^7.21.0" @@ -3594,7 +3584,7 @@ "@mui/styled-engine@^5.12.0": version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.12.0.tgz#44640cad961adcc9413ae32116237cd1c8f7ddb0" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.12.0.tgz" integrity sha512-frh8L7CRnvD0RDmIqEv6jFeKQUIXqW90BaZ6OrxJ2j4kIsiVLu29Gss4SbBvvrWwwatR72sBmC3w1aG4fjp9mQ== dependencies: "@babel/runtime" "^7.21.0" @@ -3604,7 +3594,7 @@ "@mui/styles@^5.3.0": version "5.11.2" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.11.2.tgz#8616272389051f0287e1e3b24d2bae937757552e" + resolved "https://registry.npmjs.org/@mui/styles/-/styles-5.11.2.tgz" integrity sha512-Yg6+PMPV4Mx1UJHow2e/nND2bQNWS1H38zrkJxlucXfaR0+aglO6u8R/OXmVspDj+Z5YW5B27lxRDvxCQN9nGw== dependencies: "@babel/runtime" "^7.20.7" @@ -3627,7 +3617,7 @@ "@mui/system@^5.12.1": version "5.12.1" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.12.1.tgz#8452bc03159f0a6725b96bde1dee1316e308231b" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.12.1.tgz" integrity sha512-Po+sicdV3bbRYXdU29XZaHPZrW7HUYUqU1qCu77GCCEMbahC756YpeyefdIYuPMUg0OdO3gKIUfDISBrkjJL+w== dependencies: "@babel/runtime" "^7.21.0" @@ -3641,17 +3631,17 @@ "@mui/types@^7.2.3": version "7.2.3" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.3.tgz#06faae1c0e2f3a31c86af6f28b3a4a42143670b9" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz" integrity sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw== "@mui/types@^7.2.4": version "7.2.4" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz" integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== "@mui/utils@^5.11.2": version "5.11.2" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.11.2.tgz#29764311acb99425159b159b1cb382153ad9be1f" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.11.2.tgz" integrity sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w== dependencies: "@babel/runtime" "^7.20.7" @@ -3662,7 +3652,7 @@ "@mui/utils@^5.12.0": version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.12.0.tgz#284db48b36ac26f3d34076379072c1dc8aed1ad0" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.12.0.tgz" integrity sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw== dependencies: "@babel/runtime" "^7.21.0" @@ -3673,29 +3663,29 @@ "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== dependencies: eslint-scope "5.1.1" "@noble/hashes@1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== "@noble/hashes@~1.1.1": version "1.1.5" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz" integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== "@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -3703,17 +3693,17 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.stat@^1.1.2": version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -3721,7 +3711,7 @@ "@nomicfoundation/ethereumjs-block@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz" integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== dependencies: "@nomicfoundation/ethereumjs-common" "^3.0.0" @@ -3733,7 +3723,7 @@ "@nomicfoundation/ethereumjs-blockchain@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz" integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== dependencies: "@nomicfoundation/ethereumjs-block" "^4.0.0" @@ -3751,7 +3741,7 @@ "@nomicfoundation/ethereumjs-common@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz" integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== dependencies: "@nomicfoundation/ethereumjs-util" "^8.0.0" @@ -3759,7 +3749,7 @@ "@nomicfoundation/ethereumjs-ethash@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz" integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== dependencies: "@nomicfoundation/ethereumjs-block" "^4.0.0" @@ -3771,7 +3761,7 @@ "@nomicfoundation/ethereumjs-evm@^1.0.0", "@nomicfoundation/ethereumjs-evm@^1.0.0-rc.3": version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz" integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== dependencies: "@nomicfoundation/ethereumjs-common" "^3.0.0" @@ -3785,12 +3775,12 @@ "@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz" integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== "@nomicfoundation/ethereumjs-statemanager@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz" integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== dependencies: "@nomicfoundation/ethereumjs-common" "^3.0.0" @@ -3803,7 +3793,7 @@ "@nomicfoundation/ethereumjs-trie@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz" integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== dependencies: "@nomicfoundation/ethereumjs-rlp" "^4.0.0" @@ -3813,7 +3803,7 @@ "@nomicfoundation/ethereumjs-tx@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz" integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== dependencies: "@nomicfoundation/ethereumjs-common" "^3.0.0" @@ -3823,7 +3813,7 @@ "@nomicfoundation/ethereumjs-util@^8.0.0", "@nomicfoundation/ethereumjs-util@^8.0.0-rc.3": version "8.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz" integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== dependencies: "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" @@ -3831,7 +3821,7 @@ "@nomicfoundation/ethereumjs-vm@^6.0.0", "@nomicfoundation/ethereumjs-vm@^6.0.0-rc.3": version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz" integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== dependencies: "@nomicfoundation/ethereumjs-block" "^4.0.0" @@ -3853,7 +3843,7 @@ "@nomicfoundation/hardhat-chai-matchers@^1.0.3": version "1.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz" integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -3864,14 +3854,14 @@ "@nomicfoundation/hardhat-network-helpers@^1.0.0", "@nomicfoundation/hardhat-network-helpers@^1.0.8": version "1.0.8" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz#e4fe1be93e8a65508c46d73c41fa26c7e9f84931" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== dependencies: ethereumjs-util "^7.1.4" "@nomicfoundation/hardhat-toolbox@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-1.0.2.tgz#342b79e19c456a56d8e76bc2e9cc8474cbcfc774" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-1.0.2.tgz" integrity sha512-8CEgWSKUK2aMit+76Sez8n7UB0Ze1lwT+LcWxj4EFP30lQWOwOws048t6MTPfThH0BlSWjC6hJRr0LncIkc1Sw== "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": @@ -3901,12 +3891,12 @@ "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz" integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz" integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": @@ -3926,7 +3916,7 @@ "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz" integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" @@ -3942,12 +3932,12 @@ "@nomiclabs/hardhat-ethers@^2.0.2": version "2.2.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz" integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== "@nomiclabs/hardhat-etherscan@^3.0.0": version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -3963,7 +3953,7 @@ "@nomiclabs/hardhat-etherscan@^3.1.0": version "3.1.4" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.4.tgz#970e57fabc6060489c93b3f646ca790db36ffee0" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.4.tgz" integrity sha512-fw8JCfukf6MdIGoySRmSftlM2wBgoaSbWQZgiYfD/KTeaSFEWCdMpuPZcLSBXtwtnQyyWDs07Lo7fL8HSqtD2Q== dependencies: "@ethersproject/abi" "^5.1.2" @@ -3979,7 +3969,7 @@ "@nomiclabs/hardhat-waffle@^2.0.1", "@nomiclabs/hardhat-waffle@^2.0.3": version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz" integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== dependencies: "@types/sinon-chai" "^3.2.3" @@ -3987,12 +3977,12 @@ "@npmcli/ci-detect@^1.0.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" + resolved "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz" integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== "@npmcli/fs@^1.0.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== dependencies: "@gar/promisify" "^1.0.1" @@ -4000,7 +3990,7 @@ "@npmcli/git@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz" integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== dependencies: "@npmcli/promise-spawn" "^1.3.2" @@ -4014,7 +4004,7 @@ "@npmcli/installed-package-contents@^1.0.6": version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== dependencies: npm-bundled "^1.1.1" @@ -4022,7 +4012,7 @@ "@npmcli/move-file@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -4030,19 +4020,19 @@ "@npmcli/node-gyp@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz" integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz" integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== dependencies: infer-owner "^1.0.4" "@npmcli/run-script@^1.8.2": version "1.8.6" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz" integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== dependencies: "@npmcli/node-gyp" "^1.0.2" @@ -4052,14 +4042,14 @@ "@octokit/auth-token@^2.4.4": version "2.5.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz" integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== dependencies: "@octokit/types" "^6.0.3" "@octokit/core@^3.5.1": version "3.6.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" + resolved "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz" integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== dependencies: "@octokit/auth-token" "^2.4.4" @@ -4072,7 +4062,7 @@ "@octokit/endpoint@^6.0.1": version "6.0.12" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz" integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== dependencies: "@octokit/types" "^6.0.3" @@ -4081,7 +4071,7 @@ "@octokit/graphql@^4.5.8": version "4.8.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz" integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== dependencies: "@octokit/request" "^5.6.0" @@ -4090,29 +4080,29 @@ "@octokit/openapi-types@^12.11.0": version "12.11.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz" integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^2.16.8": version "2.21.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz" integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: "@octokit/types" "^6.40.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@^5.12.0": version "5.16.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz" integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== dependencies: "@octokit/types" "^6.39.0" @@ -4120,7 +4110,7 @@ "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz" integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== dependencies: "@octokit/types" "^6.0.3" @@ -4129,7 +4119,7 @@ "@octokit/request@^5.6.0", "@octokit/request@^5.6.3": version "5.6.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" + resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz" integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== dependencies: "@octokit/endpoint" "^6.0.1" @@ -4141,7 +4131,7 @@ "@octokit/rest@^18.1.0": version "18.12.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz" integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== dependencies: "@octokit/core" "^3.5.1" @@ -4151,14 +4141,14 @@ "@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": version "6.41.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz" integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== dependencies: "@octokit/openapi-types" "^12.11.0" "@openzeppelin/contract-loader@^0.6.2": version "0.6.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz#61a7b44de327e40b7d53f39e0fb59bbf847335c3" + resolved "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz" integrity sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg== dependencies: find-up "^4.1.0" @@ -4166,37 +4156,37 @@ "@openzeppelin/contracts-upgradeable@4.3.2": version "4.3.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.3.2.tgz#92df481362e366c388fc02133cf793029c744cea" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.3.2.tgz" integrity sha512-i/pOaOtcqDk4UqsrOv735uYyTbn6dvfiuVu5hstsgV6c4ZKUtu88/31zT2BzkCg+3JfcwOfgg2TtRKVKKZIGkQ== "@openzeppelin/contracts@3.4.1-solc-0.7-2": version "3.4.1-solc-0.7-2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz#371c67ebffe50f551c3146a9eec5fe6ffe862e92" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz" integrity sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q== "@openzeppelin/contracts@3.4.2-solc-0.7": version "3.4.2-solc-0.7" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz" integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== "@openzeppelin/contracts@4.3.2": version "4.3.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.2.tgz#ff80affd6d352dbe1bbc5b4e1833c41afd6283b6" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.2.tgz" integrity sha512-AybF1cesONZStg5kWf6ao9OlqTZuPqddvprc0ky7lrUVOjXeKpmQ2Y9FK+6ygxasb+4aic4O5pneFBfwVsRRRg== "@openzeppelin/contracts@^4.2.0", "@openzeppelin/contracts@^4.4.0": version "4.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.0.tgz#6854c37df205dd2c056bdfa1b853f5d732109109" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.0.tgz" integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== "@openzeppelin/contracts@^4.7.3": version "4.8.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.1.tgz#709cfc4bbb3ca9f4460d60101f15dac6b7a2d5e4" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.1.tgz" integrity sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ== "@openzeppelin/test-helpers@^0.5.15": version "0.5.16" - resolved "https://registry.yarnpkg.com/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz#2c9054f85069dfbfb5e8cef3ed781e8caf241fb3" + resolved "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz" integrity sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg== dependencies: "@openzeppelin/contract-loader" "^0.6.2" @@ -4212,22 +4202,22 @@ "@popperjs/core@^2.11.6", "@popperjs/core@^2.9.2": version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@popperjs/core@^2.11.7": version "2.11.7" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz" integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== "@remix-run/router@1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.2.1.tgz#812edd4104a15a493dda1ccac0b352270d7a188c" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.2.1.tgz" integrity sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ== "@resolver-engine/core@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + resolved "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz" integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== dependencies: debug "^3.1.0" @@ -4236,7 +4226,7 @@ "@resolver-engine/fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + resolved "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz" integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== dependencies: "@resolver-engine/core" "^0.3.3" @@ -4244,7 +4234,7 @@ "@resolver-engine/imports-fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + resolved "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz" integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== dependencies: "@resolver-engine/fs" "^0.3.3" @@ -4253,7 +4243,7 @@ "@resolver-engine/imports@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + resolved "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz" integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== dependencies: "@resolver-engine/core" "^0.3.3" @@ -4264,17 +4254,17 @@ "@rushstack/eslint-patch@^1.1.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== "@scure/base@~1.1.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== "@scure/bip32@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz" integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== dependencies: "@noble/hashes" "~1.1.1" @@ -4283,26 +4273,37 @@ "@scure/bip39@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz" integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== dependencies: "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" -"@sentry/browser@7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.30.0.tgz#9b4387da933290546b7a4ef521713c38723a0213" - integrity sha512-9hpaNAqIBDLdnrZ51iWkqenRotqqweE1f2AlHO56nyT/UE+u+GdmAiBrgRNqdFQQM13JtTG/gu4HGOyLWb9HEA== +"@sentry-internal/tracing@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.51.2.tgz#17833047646426ca71445327018ffcb33506a699" + integrity sha512-OBNZn7C4CyocmlSMUPfkY9ORgab346vTHu5kX35PgW5XR51VD2nO5iJCFbyFcsmmRWyCJcZzwMNARouc2V4V8A== dependencies: - "@sentry/core" "7.30.0" - "@sentry/replay" "7.30.0" - "@sentry/types" "7.30.0" - "@sentry/utils" "7.30.0" + "@sentry/core" "7.51.2" + "@sentry/types" "7.51.2" + "@sentry/utils" "7.51.2" + tslib "^1.9.3" + +"@sentry/browser@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.51.2.tgz#c01758a54c613be45df58ab503805737256f51a4" + integrity sha512-FQFEaTFbvYHPQE2emFjNoGSy+jXplwzoM/XEUBRjrGo62lf8BhMvWnPeG3H3UWPgrWA1mq0amvHRwXUkwofk0g== + dependencies: + "@sentry-internal/tracing" "7.51.2" + "@sentry/core" "7.51.2" + "@sentry/replay" "7.51.2" + "@sentry/types" "7.51.2" + "@sentry/utils" "7.51.2" tslib "^1.9.3" "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -4313,16 +4314,25 @@ "@sentry/core@7.30.0": version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.30.0.tgz#02d2e8747484ba64b6d712e8afe6736250efdc26" + resolved "https://registry.npmjs.org/@sentry/core/-/core-7.30.0.tgz" integrity sha512-NeLigkBlpcK63ymM63GoIHurml6V3BUe1Vi+trwm4/qqOTzT7PQhvdJCX+o3+atzRBH+zdb6kd4VWx44Oye3KA== dependencies: "@sentry/types" "7.30.0" "@sentry/utils" "7.30.0" tslib "^1.9.3" +"@sentry/core@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.51.2.tgz#f2c938de334f9bf26f4416079168275832423964" + integrity sha512-p8ZiSBxpKe+rkXDMEcgmdoyIHM/1bhpINLZUFPiFH8vzomEr7sgnwRhyrU8y/ADnkPeNg/2YF3QpDpk0OgZJUA== + dependencies: + "@sentry/types" "7.51.2" + "@sentry/utils" "7.51.2" + tslib "^1.9.3" + "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -4331,7 +4341,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -4340,7 +4350,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -4355,7 +4365,7 @@ "@sentry/node@^6.2.5||^7.1.1", "@sentry/node@^7.30.0": version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.30.0.tgz#42ef5b29d065f6de6ac5556a56aca20d3b9073e1" + resolved "https://registry.npmjs.org/@sentry/node/-/node-7.30.0.tgz" integrity sha512-YYasu6C3I0HBP4N1oc/ed2nunxhGJgtAWaKwq3lo8uk3uF6cB1A8+2e0CpjzU5ejhbaFPUBxHyj4th39Bvku/w== dependencies: "@sentry/core" "7.30.0" @@ -4366,29 +4376,29 @@ lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/react@^7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.30.0.tgz#01050ba6e11b8c51c1cb44c76799b2e189762482" - integrity sha512-yn0GiRewi/Gcig2Fkps95l96zOwiKxQacv3T83bBzlFIuO0vBWqV6imOcJKt4gxU9JoX6RGf9UqeACxzJlDqNg== +"@sentry/react@^7.51.0": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.51.2.tgz#8d09c8358a920d06225f879b0291867175d4f045" + integrity sha512-NiTbpiRaF7/2YnRONLqn8/bxT5UG+JN5MrR606ipxsl3ejF376VMLCHVvju6gJNw8mkrErEMkfxK+gGYqOdLEA== dependencies: - "@sentry/browser" "7.30.0" - "@sentry/types" "7.30.0" - "@sentry/utils" "7.30.0" + "@sentry/browser" "7.51.2" + "@sentry/types" "7.51.2" + "@sentry/utils" "7.51.2" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/replay@7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.30.0.tgz#44db86956166fc8909459eef8ce94f750c072519" - integrity sha512-qJgz1tG0uStqMF5V7gN7KqxZuZY0MMQQY7siwPcSQVYj7X3AQswHjmvD4npEKbIa+jP6aQ6fFjoBjl3c0t3Mmg== +"@sentry/replay@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.51.2.tgz#1f54e92b472ab87dfdb4e8cd6b8c8252600fe7b0" + integrity sha512-W8YnSxkK9LTUXDaYciM7Hn87u57AX9qvH8jGcxZZnvpKqHlDXOpSV8LRtBkARsTwgLgswROImSifY0ic0lyCWg== dependencies: - "@sentry/core" "7.30.0" - "@sentry/types" "7.30.0" - "@sentry/utils" "7.30.0" + "@sentry/core" "7.51.2" + "@sentry/types" "7.51.2" + "@sentry/utils" "7.51.2" "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -4399,7 +4409,7 @@ "@sentry/tracing@^7.30.0": version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.30.0.tgz#b4576fbaf81ce418f1b7c37e7e5f4f6cf19a3c3b" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.30.0.tgz" integrity sha512-bjGeDeKhpGAmLcWcrXFT/xOfHVwp/j0L1aRHzYHnqgTjVzD0NXcooPu/Nz8vF0paxz+hPD5bJwb8kz/ggJzGWQ== dependencies: "@sentry/core" "7.30.0" @@ -4407,19 +4417,31 @@ "@sentry/utils" "7.30.0" tslib "^1.9.3" +"@sentry/tracing@^7.51.0": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.51.2.tgz#3f1cce990f48a5b96e885a42463da484e29e5007" + integrity sha512-qYl8TtwdEAtLBFSSTtHX6OpSGI73sgoPZhc3ZtF7+cLe29FRM5M6uyV7HhgIrxCstAx/5lZRlCWJabkIewGfFA== + dependencies: + "@sentry-internal/tracing" "7.51.2" + "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/types@7.30.0": version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.30.0.tgz#fc2baeb5b0e1ecc4d52b07b056fcba54449cd9ce" + resolved "https://registry.npmjs.org/@sentry/types/-/types-7.30.0.tgz" integrity sha512-l4A86typvt/SfWh5JffpdxNGkg5EEA8m35BzpIcKmCAQZUDmnb4b478r8jdD2uuOjLmPNmZr1tifdRW4NCLuxQ== +"@sentry/types@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.51.2.tgz#cb742f374d9549195f62c462c915adeafed31d65" + integrity sha512-/hLnZVrcK7G5BQoD/60u9Qak8c9AvwV8za8TtYPJDUeW59GrqnqOkFji7RVhI7oH1OX4iBxV+9pAKzfYE6A6SA== + "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" @@ -4427,58 +4449,66 @@ "@sentry/utils@7.30.0": version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.30.0.tgz#1d83145399c65e31f725c1b6ae02f451a990f326" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.30.0.tgz" integrity sha512-tSlBhr5u/LdE2emxIDTDmjmyRr99GnZGIAh5GwRxUgeDQ3VEfNUFlyFodBCbZ6yeYTYd6PWNih5xoHn1+Rf3Sw== dependencies: "@sentry/types" "7.30.0" tslib "^1.9.3" +"@sentry/utils@7.51.2": + version "7.51.2" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.51.2.tgz#2a52ac2cfb00ffd128248981279c0a561b39eccb" + integrity sha512-EcjBU7qG4IG+DpIPvdgIBcdIofROMawKoRUNKraeKzH/waEYH9DzCaqp/mzc5/rPBhpDB4BShX9xDDSeH+8c0A== + dependencies: + "@sentry/types" "7.51.2" + tslib "^1.9.3" + "@sinclair/typebox@^0.25.16": version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== "@sindresorhus/is@^0.14.0": version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== "@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0", "@sindresorhus/is@^4.6.0": version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== "@sinonjs/commons@^1.7.0": version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" "@sinonjs/commons@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz" integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== dependencies: "@sinonjs/commons" "^2.0.0" "@sinonjs/fake-timers@^9.1.2": version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz" integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== dependencies: "@sinonjs/commons" "^2.0.0" @@ -4487,59 +4517,59 @@ "@sinonjs/text-encoding@^0.7.1": version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== "@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.5": version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz" integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== "@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz" integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== "@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz" integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== "@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz" integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== "@svgr/babel-plugin-svg-dynamic-title@^4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz" integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== "@svgr/babel-plugin-svg-em-dimensions@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz" integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== "@svgr/babel-plugin-transform-react-native-svg@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz" integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== "@svgr/babel-plugin-transform-svg-component@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz" integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== "@svgr/babel-preset@^4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz" integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" @@ -4553,7 +4583,7 @@ "@svgr/core@^4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" + resolved "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz" integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w== dependencies: "@svgr/plugin-jsx" "^4.3.3" @@ -4562,14 +4592,14 @@ "@svgr/hast-util-to-babel-ast@^4.3.2": version "4.3.2" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz" integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg== dependencies: "@babel/types" "^7.4.4" "@svgr/plugin-jsx@^4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz" integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w== dependencies: "@babel/core" "^7.4.5" @@ -4579,7 +4609,7 @@ "@svgr/plugin-svgo@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz" integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w== dependencies: cosmiconfig "^5.2.1" @@ -4588,7 +4618,7 @@ "@svgr/webpack@4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz" integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg== dependencies: "@babel/core" "^7.4.5" @@ -4602,28 +4632,28 @@ "@szmarczak/http-timer@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: defer-to-connect "^1.0.1" "@szmarczak/http-timer@^4.0.5": version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== dependencies: defer-to-connect "^2.0.0" "@szmarczak/http-timer@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== dependencies: defer-to-connect "^2.0.1" "@testing-library/dom@^8.0.0": version "8.20.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz" integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== dependencies: "@babel/code-frame" "^7.10.4" @@ -4637,7 +4667,7 @@ "@testing-library/jest-dom@^5.16.5": version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz" integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== dependencies: "@adobe/css-tools" "^4.0.1" @@ -4652,7 +4682,7 @@ "@testing-library/react@^12.1.2": version "12.1.5" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz" integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== dependencies: "@babel/runtime" "^7.12.5" @@ -4661,12 +4691,12 @@ "@textlint/ast-node-types@^12.3.0": version "12.3.0" - resolved "https://registry.yarnpkg.com/@textlint/ast-node-types/-/ast-node-types-12.3.0.tgz#3eb52ca2d7234ad8e015a1fc104ab15945a25e1f" + resolved "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-12.3.0.tgz" integrity sha512-ke5hlKy/xZ/vQt6j+h4k9GradJPDsV3FKsUqWpCpF/X8qWCU2zM4e1SMUAFjoUcLuF9in+eXIQ71Qm/AdjjkZQ== "@textlint/markdown-to-ast@^12.1.1": version "12.5.0" - resolved "https://registry.yarnpkg.com/@textlint/markdown-to-ast/-/markdown-to-ast-12.5.0.tgz#9421257ec9ffd6c0120d27d24d57fa6526ece05d" + resolved "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-12.5.0.tgz" integrity sha512-+fUslPm0+ukMnRVMPUQwKv1DEwmDP/rXFuzc5+k5tCMhighZ/Fv/e3Y9MUe7SgNDte7ilajTa3/uP0Iurr60WA== dependencies: "@textlint/ast-node-types" "^12.3.0" @@ -4681,7 +4711,7 @@ "@thehubbleproject/bls@^0.5.1": version "0.5.1" - resolved "https://registry.yarnpkg.com/@thehubbleproject/bls/-/bls-0.5.1.tgz#6b0565f56fc9c8896dcf3c8f0e2214b69a06167f" + resolved "https://registry.npmjs.org/@thehubbleproject/bls/-/bls-0.5.1.tgz" integrity sha512-g5zeMZ8js/yg6MjFoC+pt0eqfCL2jC46yLY1LbKNriyqftB1tE3jpG/FMMDIW3x9/yRg/AgUb8Nluqj15tQs+A== dependencies: ethers "^5.5.3" @@ -4689,12 +4719,12 @@ "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@truffle/abi-utils@^0.3.6": version "0.3.6" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.6.tgz#ab35bc437e4c059a5c9a0595cd6df367199493a9" + resolved "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz" integrity sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw== dependencies: change-case "3.0.2" @@ -4703,12 +4733,12 @@ "@truffle/blockchain-utils@^0.1.6": version "0.1.6" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz#7ea0a16b8135e5aeb688bf3bd014fa8f6ba45adb" + resolved "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz" integrity sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA== "@truffle/codec@^0.14.12": version "0.14.12" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.12.tgz#5808ff289e3070b753de04992bfea824d8ab8ac7" + resolved "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.12.tgz" integrity sha512-0RIUoZQiGqNNp0zogeoCLoFoKSY65ih129rjrDqyv7Yy+IIpKgdOk8zZqg2sWIt7ukQFjZmAOwPznhYNGg/eKA== dependencies: "@truffle/abi-utils" "^0.3.6" @@ -4724,7 +4754,7 @@ "@truffle/compile-common@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.2.tgz#da8aed5c9c8da119cb4b7ee5a425d2559a99bfb7" + resolved "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.2.tgz" integrity sha512-n7MF/4/dntccj44RGe3PRMD8Vk46PU8dJtzd1VLAfgokK2Y2N+SjAzDskBnmAydZVWAM315nZIUQsgnY8xoATw== dependencies: "@truffle/error" "^0.2.0" @@ -4732,7 +4762,7 @@ "@truffle/contract-schema@^3.4.11": version "3.4.11" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.11.tgz#ac5fc8be656b786c2bd5d3a2ca6faeb2949e7ff3" + resolved "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz" integrity sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ== dependencies: ajv "^6.10.0" @@ -4740,7 +4770,7 @@ "@truffle/contract@^4.0.35": version "4.6.11" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.6.11.tgz#7e426d2507a065a5ca01f653d81e9676be747f64" + resolved "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.11.tgz" integrity sha512-0YUS+4D4M+tLFx9JSxFgr7zfYBnHytmLDBjQKemhH/19NbSfos3bajdB08nKAphVM7IisoKnaCd5HOsEWusJJw== dependencies: "@ensdomains/ensjs" "^2.1.0" @@ -4760,7 +4790,7 @@ "@truffle/debug-utils@^6.0.43": version "6.0.43" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.43.tgz#e86c614b9dfba4fb304560490d8f4d4f5f7d9df7" + resolved "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.43.tgz" integrity sha512-vJQmfSyrEgLjn7tp7K6WlZAkjISb5MFlN8mAjGnMz30Ja6/cTMQ0l6NLZGPYgZYk5uB4KrqcmNC+PqXrgXWt2Q== dependencies: "@truffle/codec" "^0.14.12" @@ -4772,17 +4802,17 @@ "@truffle/error@^0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" + resolved "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz" integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== "@truffle/error@^0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.2.0.tgz#65de6f03f5c041f883cc87677eecf8231428f1ab" + resolved "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz" integrity sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ== "@truffle/interface-adapter@^0.5.25", "@truffle/interface-adapter@^0.5.26": version "0.5.26" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz#0eb9db6355e81ca9c44b341fe13a7190041f186a" + resolved "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz" integrity sha512-fBhoqtT+CT4XKXcOijvw0RIMgyUi3FJg+n5i5PyGBsoRzqbLZd9cZq+oMNjOZPdf3GH68hsOFOaQO5tZH7oZow== dependencies: bn.js "^5.1.3" @@ -4791,7 +4821,7 @@ "@truffle/provider@^0.2.24": version "0.2.64" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.64.tgz#7dd55117307fd019dcf81d08db5dc2bc5728f51c" + resolved "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.64.tgz" integrity sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw== dependencies: "@truffle/error" "^0.1.1" @@ -4801,7 +4831,7 @@ "@trufflesuite/chromafi@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" + resolved "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz" integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== dependencies: camelcase "^4.1.0" @@ -4815,27 +4845,27 @@ "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@typechain/ethers-v5@^10.1.0": version "10.2.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz#68f5963efb5214cb2d881477228e4b5b315473e1" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz" integrity sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w== dependencies: lodash "^4.17.15" @@ -4843,36 +4873,36 @@ "@typechain/ethers-v5@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz" integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== dependencies: ethers "^5.0.2" "@typechain/hardhat@^6.1.2": version "6.1.5" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.5.tgz#caad58a1d3e9cd88061a584eb4f4fa763d5dcad1" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz" integrity sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q== dependencies: fs-extra "^9.1.0" "@types/abstract-leveldown@*": version "7.2.1" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz#bb16403c17754b0c4d5772d71d03b924a03d4c80" + resolved "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz" integrity sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ== "@types/aria-query@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/async-eventemitter@^0.2.1": version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + resolved "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz" integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/babel__core@^7.1.0": version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz" integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" @@ -4883,14 +4913,14 @@ "@types/babel__generator@*": version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -4898,28 +4928,28 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz" integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/body-parser@*": version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" @@ -4927,12 +4957,12 @@ "@types/browser-or-node@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/browser-or-node/-/browser-or-node-1.3.0.tgz#896ec59bcb8109fc858d8e68d3c056c176a19622" + resolved "https://registry.npmjs.org/@types/browser-or-node/-/browser-or-node-1.3.0.tgz" integrity sha512-MVetr65IR7RdJbUxVHsaPFaXAO8fi89zv1g8L/mHygh1Q7xnnK02XZLwfMh57FOpTO6gtnagoPMQ/UOFfctXRQ== "@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: "@types/http-cache-semantics" "*" @@ -4942,83 +4972,83 @@ "@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4": version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.0", "@types/chai@^4.2.17", "@types/chai@^4.2.18", "@types/chai@^4.2.21", "@types/chai@^4.3.1": version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/concat-stream@^1.6.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/connect@*": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/cors@^2.8.12", "@types/cors@^2.8.9": version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz" integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== dependencies: "@types/node" "*" "@types/d3-color@^2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz" integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w== "@types/d3-interpolate@^2.0.0": version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz" integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw== dependencies: "@types/d3-color" "^2" "@types/d3-path@^2": version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.2.tgz#6052f38f6186319769dfabab61b5514b0e02c75c" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz" integrity sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg== "@types/d3-scale@^3.0.0": version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz" integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== dependencies: "@types/d3-time" "^2" "@types/d3-shape@^2.0.0": version "2.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz" integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== dependencies: "@types/d3-path" "^2" "@types/d3-time@^2": version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz" integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== "@types/debug@^4.1.7": version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" @@ -5026,12 +5056,12 @@ "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/eslint@*": version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz" integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== dependencies: "@types/estree" "*" @@ -5039,17 +5069,17 @@ "@types/estree@*": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@^0.0.51": version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@^4.17.31": version "4.17.32" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz#93dda387f5516af616d8d3f05f2c4c79d81e1b82" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz" integrity sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA== dependencies: "@types/node" "*" @@ -5058,7 +5088,7 @@ "@types/express@^4.17.12", "@types/express@^4.17.13": version "4.17.15" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.15.tgz#9290e983ec8b054b65a5abccb610411953d417ff" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz" integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== dependencies: "@types/body-parser" "*" @@ -5068,14 +5098,14 @@ "@types/form-data@0.0.33": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" "@types/glob@^7.1.1": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -5083,7 +5113,7 @@ "@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: "@types/react" "*" @@ -5091,31 +5121,31 @@ "@types/http-cache-semantics@*": version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== "@types/is-ci@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.0.tgz#7e8910af6857601315592436f030aaa3ed9783c3" + resolved "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz" integrity sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ== dependencies: ci-info "^3.1.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz" integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" @@ -5123,14 +5153,14 @@ "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*", "@types/jest@^29.5.1": version "29.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz" integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== dependencies: expect "^29.0.0" @@ -5138,29 +5168,29 @@ "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/keyv@^3.1.4": version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: "@types/node" "*" "@types/level-errors@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== "@types/levelup@^4.3.0": version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + resolved "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz" integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== dependencies: "@types/abstract-leveldown" "*" @@ -5169,80 +5199,80 @@ "@types/lodash@^4.14.168": version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/mdast@^3.0.0": version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== dependencies: "@types/unist" "*" "@types/mime@*": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/minimatch@*": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimatch@^3.0.3": version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.0": version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/mkdirp@^0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz" integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== dependencies: "@types/node" "*" "@types/mkdirp@^1.0.1": version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz" integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== dependencies: "@types/node" "*" "@types/mocha@^8.2.2": version "8.2.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== "@types/mocha@^9.0.0", "@types/mocha@^9.1.0": version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz" integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/morgan@^1.9.3": version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.4.tgz#99965ad2bdc7c5cee28d8ce95cfa7300b19ea562" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz" integrity sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ== dependencies: "@types/node" "*" "@types/ms@*": version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node-fetch@^2.5.10", "@types/node-fetch@^2.5.5": version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz" integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" @@ -5250,80 +5280,80 @@ "@types/node@*", "@types/node@^18.0.0": version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz" integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== "@types/node@^10.0.3": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^12.0.0", "@types/node@^12.12.6", "@types/node@^12.7.1": version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^15.12.2": version "15.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + resolved "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz" integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== "@types/node@^16.4.12": version "16.18.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" + resolved "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz" integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== "@types/node@^17.0.21": version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/node@^8.0.0": version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/normalize-package-data@^2.4.0": version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/pbkdf2@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/pino-multi-stream@^5.1.1": version "5.1.3" - resolved "https://registry.yarnpkg.com/@types/pino-multi-stream/-/pino-multi-stream-5.1.3.tgz#34ab3c7df099636794c0998ba04132238dda2f11" + resolved "https://registry.npmjs.org/@types/pino-multi-stream/-/pino-multi-stream-5.1.3.tgz" integrity sha512-OxIkhBpfXw1q1BkOIkTSrq0YAkOmlSBaZbM5EXjgjTvgNLZLBwC7/+HGVWw7wW5/ofRyNPDg8Ykd/cx4bq69PQ== dependencies: "@types/pino" "6.3" "@types/pino-pretty@*": version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/pino-pretty/-/pino-pretty-5.0.0.tgz#aa7a61cfd553b051764acfa0a49872f7a09a1722" + resolved "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-5.0.0.tgz" integrity sha512-N1uzqSzioqz8R3AkDbSJwcfDWeI3YMPNapSQQhnB2ISU4NYgUIcAh+hYT5ygqBM+klX4htpEhXMmoJv3J7GrdA== dependencies: pino-pretty "*" "@types/pino-std-serializers@*", "@types/pino-std-serializers@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1e28b80b554c8222858e99a4e0fc77fd070e10e8" + resolved "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz" integrity sha512-gXfUZx2xIBbFYozGms53fT0nvkacx/+62c8iTxrEqH5PkIGAQvDbXg2774VWOycMPbqn5YJBQ3BMsg4Li3dWbg== dependencies: pino-std-serializers "*" "@types/pino@6.3", "@types/pino@^6.3.6": version "6.3.12" - resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.12.tgz#4425db6ced806109c3df957100cba9dfcd73c228" + resolved "https://registry.npmjs.org/@types/pino/-/pino-6.3.12.tgz" integrity sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw== dependencies: "@types/node" "*" @@ -5333,63 +5363,63 @@ "@types/prettier@2.2.1": version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.1.tgz#374e31645d58cb18a07b3ecd8e9dede4deb2cccd" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.1.tgz" integrity sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw== "@types/prettier@^1.13.2": version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz" integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== "@types/prettier@^2.1.1": version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*", "@types/prop-types@^15.7.5": version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/q@^1.5.1": version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/qs@*", "@types/qs@^6.2.31", "@types/qs@^6.9.4", "@types/qs@^6.9.7": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@<18.0.0": version "17.0.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.19.tgz#36feef3aa35d045cacd5ed60fe0eef5272f19492" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz" integrity sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ== dependencies: "@types/react" "^17" "@types/react-is@^16.7.1 || ^17.0.0": version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" + resolved "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz" integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== dependencies: "@types/react" "*" "@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.5": version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^17": version "17.0.58" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.58.tgz#c8bbc82114e5c29001548ebe8ed6c4ba4d3c9fb0" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz" integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A== dependencies: "@types/prop-types" "*" @@ -5398,50 +5428,50 @@ "@types/redux-mock-store@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.3.tgz#895de4a364bc4836661570aec82f2eef5989d1fb" + resolved "https://registry.npmjs.org/@types/redux-mock-store/-/redux-mock-store-1.0.3.tgz" integrity sha512-Wqe3tJa6x9MxMN4DJnMfZoBRBRak1XTPklqj4qkVm5VBpZnC8PSADf4kLuFQ9NAdHaowfWoEeUMz7NWc2GMtnA== dependencies: redux "^4.0.5" "@types/resolve@^0.0.8": version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== dependencies: "@types/node" "*" "@types/responselike@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz" integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== dependencies: "@types/node" "*" "@types/scheduler@*": version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/secp256k1@^4.0.1": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@types/semver@^6.0.0": version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" + resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz" integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== "@types/semver@^7.3.12": version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/serve-static@*": version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: "@types/mime" "*" @@ -5449,7 +5479,7 @@ "@types/sinon-chai@^3.2.3": version "3.2.9" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.9.tgz#71feb938574bbadcb176c68e5ff1a6014c5e69d4" + resolved "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz" integrity sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ== dependencies: "@types/chai" "*" @@ -5457,29 +5487,29 @@ "@types/sinon@*", "@types/sinon@^10.0.13": version "10.0.13" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz" integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== "@types/stack-utils@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/styled-components@^5.1.26": version "5.1.26" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" + resolved "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz" integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw== dependencies: "@types/hoist-non-react-statics" "*" @@ -5488,29 +5518,29 @@ "@types/testing-library__jest-dom@^5.9.1": version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz" integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== dependencies: "@types/jest" "*" "@types/underscore@*": version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" + resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz" integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/use-sync-external-store@^0.0.3": version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@types/web3@1.0.19": version "1.0.19" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" + resolved "https://registry.npmjs.org/@types/web3/-/web3-1.0.19.tgz" integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== dependencies: "@types/bn.js" "*" @@ -5518,26 +5548,26 @@ "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^13.0.0": version "13.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz" integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.10.0": version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz" integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: "@typescript-eslint/experimental-utils" "2.34.0" @@ -5547,7 +5577,7 @@ "@typescript-eslint/eslint-plugin@^4.26.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: "@typescript-eslint/experimental-utils" "4.33.0" @@ -5561,7 +5591,7 @@ "@typescript-eslint/eslint-plugin@^5.10.2", "@typescript-eslint/eslint-plugin@^5.30.5", "@typescript-eslint/eslint-plugin@^5.45.1", "@typescript-eslint/eslint-plugin@^5.5.0": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz#deee67e399f2cb6b4608c935777110e509d8018c" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz" integrity sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ== dependencies: "@typescript-eslint/scope-manager" "5.48.1" @@ -5576,7 +5606,7 @@ "@typescript-eslint/experimental-utils@2.34.0": version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz" integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== dependencies: "@types/json-schema" "^7.0.3" @@ -5586,7 +5616,7 @@ "@typescript-eslint/experimental-utils@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== dependencies: "@types/json-schema" "^7.0.7" @@ -5598,14 +5628,14 @@ "@typescript-eslint/experimental-utils@^5.0.0": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.48.1.tgz#5951c0b7ef4b0838ea95f25d53385de0e366e0b8" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.48.1.tgz" integrity sha512-8OoIZZuOeqsm5cxn2f01qHWtVC3M4iixSsfZXPiQUg4Sl4LiU+b5epcJFwxNfqeoLl+SGncELyi3x99zI6C0ng== dependencies: "@typescript-eslint/utils" "5.48.1" "@typescript-eslint/parser@^2.10.0": version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz" integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" @@ -5615,7 +5645,7 @@ "@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.26.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== dependencies: "@typescript-eslint/scope-manager" "4.33.0" @@ -5625,7 +5655,7 @@ "@typescript-eslint/parser@^5.10.2", "@typescript-eslint/parser@^5.30.5", "@typescript-eslint/parser@^5.45.1", "@typescript-eslint/parser@^5.5.0": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.1.tgz#d0125792dab7e232035434ab8ef0658154db2f10" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz" integrity sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA== dependencies: "@typescript-eslint/scope-manager" "5.48.1" @@ -5635,7 +5665,7 @@ "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== dependencies: "@typescript-eslint/types" "4.33.0" @@ -5643,7 +5673,7 @@ "@typescript-eslint/scope-manager@5.48.1": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz#39c71e4de639f5fe08b988005beaaf6d79f9d64d" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz" integrity sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ== dependencies: "@typescript-eslint/types" "5.48.1" @@ -5651,7 +5681,7 @@ "@typescript-eslint/type-utils@5.48.1": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz#5d94ac0c269a81a91ad77c03407cea2caf481412" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz" integrity sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ== dependencies: "@typescript-eslint/typescript-estree" "5.48.1" @@ -5661,17 +5691,17 @@ "@typescript-eslint/types@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== "@typescript-eslint/types@5.48.1": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.1.tgz#efd1913a9aaf67caf8a6e6779fd53e14e8587e14" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz" integrity sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg== "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz" integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== dependencies: debug "^4.1.1" @@ -5684,7 +5714,7 @@ "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: "@typescript-eslint/types" "4.33.0" @@ -5697,7 +5727,7 @@ "@typescript-eslint/typescript-estree@5.48.1": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz#9efa8ee2aa471c6ab62e649f6e64d8d121bc2056" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz" integrity sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA== dependencies: "@typescript-eslint/types" "5.48.1" @@ -5710,7 +5740,7 @@ "@typescript-eslint/utils@5.48.1", "@typescript-eslint/utils@^5.13.0": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.1.tgz#20f2f4e88e9e2a0961cbebcb47a1f0f7da7ba7f9" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz" integrity sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA== dependencies: "@types/json-schema" "^7.0.9" @@ -5724,7 +5754,7 @@ "@typescript-eslint/visitor-keys@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: "@typescript-eslint/types" "4.33.0" @@ -5732,7 +5762,7 @@ "@typescript-eslint/visitor-keys@5.48.1": version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz#79fd4fb9996023ef86849bf6f904f33eb6c8fccb" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz" integrity sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA== dependencies: "@typescript-eslint/types" "5.48.1" @@ -5740,17 +5770,17 @@ "@ungap/promise-all-settled@1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== "@uniswap/lib@^4.0.1-alpha": version "4.0.1-alpha" - resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-4.0.1-alpha.tgz#2881008e55f075344675b3bca93f020b028fbd02" + resolved "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz" integrity sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== "@uniswap/sdk-core@^3.0.1": version "3.1.0" - resolved "https://registry.yarnpkg.com/@uniswap/sdk-core/-/sdk-core-3.1.0.tgz#595b6396763fd2553531423c8eec83bfb4840a27" + resolved "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.1.0.tgz" integrity sha512-YRrp6vYAbYmi3uDXQGkvj2eT8BMpNnUdCFb8GifDG0Ei+ohIpC4RNAB+5/ru3zR2Byhx8VahGrSKuvdd6BVMyA== dependencies: "@ethersproject/address" "^5.0.2" @@ -5762,7 +5792,7 @@ "@uniswap/sdk@^3.0.3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@uniswap/sdk/-/sdk-3.0.3.tgz#8201c7c72215d0030cb99acc7e661eff895c18a9" + resolved "https://registry.npmjs.org/@uniswap/sdk/-/sdk-3.0.3.tgz" integrity sha512-t4s8bvzaCFSiqD2qfXIm3rWhbdnXp+QjD3/mRaeVDHK7zWevs6RGEb1ohMiNgOCTZANvBayb4j8p+XFdnMBadQ== dependencies: "@uniswap/v2-core" "^1.0.0" @@ -5775,7 +5805,7 @@ "@uniswap/swap-router-contracts@^1.2.1": version "1.3.0" - resolved "https://registry.yarnpkg.com/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz#8d555ca6d74b888d6e02a26ebb806ce315605f1f" + resolved "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz" integrity sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A== dependencies: "@openzeppelin/contracts" "3.4.2-solc-0.7" @@ -5787,22 +5817,22 @@ "@uniswap/v2-core@1.0.1", "@uniswap/v2-core@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" + resolved "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz" integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== "@uniswap/v3-core-optimism@^1.0.0-rc.0": version "1.0.0-rc.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-core-optimism/-/v3-core-optimism-1.0.0-rc.0.tgz#fafe94c2d435a2133a470fc2793370c544463dd3" + resolved "https://registry.npmjs.org/@uniswap/v3-core-optimism/-/v3-core-optimism-1.0.0-rc.0.tgz" integrity sha512-mJ5TwiWabR02G8lceVc2+3lmFOqVI3p++wpQQcvVHv+pfGq38NSaHbirmGB8sbv7x29wUteiNL7soHoD6tGe7g== "@uniswap/v3-core@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-core/-/v3-core-1.0.0.tgz#6c24adacc4c25dceee0ba3ca142b35adbd7e359d" + resolved "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz" integrity sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA== "@uniswap/v3-periphery@1.4.1": version "1.4.1" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz#b90f08b7386163c0abfd7258831caef6339c7862" + resolved "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz" integrity sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg== dependencies: "@openzeppelin/contracts" "3.4.2-solc-0.7" @@ -5814,7 +5844,7 @@ "@uniswap/v3-periphery@^1.0.1", "@uniswap/v3-periphery@^1.1.1": version "1.4.3" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz#a6da4632dbd46b139cc13a410e4ec09ad22bd19f" + resolved "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz" integrity sha512-80c+wtVzl5JJT8UQskxVYYG3oZb4pkhY0zDe0ab/RX4+8f9+W5d8wI4BT0wLB0wFQTSnbW+QdBSpkHA/vRyGBA== dependencies: "@openzeppelin/contracts" "3.4.2-solc-0.7" @@ -5825,7 +5855,7 @@ "@uniswap/v3-sdk@^3.6.2": version "3.9.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz#de93fa19f89c29d460996aa4d0b4bb6531641105" + resolved "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz" integrity sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ== dependencies: "@ethersproject/abi" "^5.0.12" @@ -5839,7 +5869,7 @@ "@uniswap/v3-staker@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz#9a6915ec980852479dfc903f50baf822ff8fa66e" + resolved "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz" integrity sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw== dependencies: "@openzeppelin/contracts" "3.4.1-solc-0.7-2" @@ -5848,7 +5878,7 @@ "@vue/compiler-core@3.2.45": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz" integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== dependencies: "@babel/parser" "^7.16.4" @@ -5858,7 +5888,7 @@ "@vue/compiler-dom@3.2.45": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz" integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== dependencies: "@vue/compiler-core" "3.2.45" @@ -5866,7 +5896,7 @@ "@vue/compiler-sfc@^3.0.5": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz" integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q== dependencies: "@babel/parser" "^7.16.4" @@ -5882,7 +5912,7 @@ "@vue/compiler-ssr@3.2.45": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz" integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ== dependencies: "@vue/compiler-dom" "3.2.45" @@ -5890,7 +5920,7 @@ "@vue/reactivity-transform@3.2.45": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz" integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ== dependencies: "@babel/parser" "^7.16.4" @@ -5901,12 +5931,12 @@ "@vue/shared@3.2.45": version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz" integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== "@walletconnect/browser-utils@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951" + resolved "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz" integrity sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A== dependencies: "@walletconnect/safe-json" "1.0.0" @@ -5917,7 +5947,7 @@ "@walletconnect/client@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.8.0.tgz#6f46b5499c7c861c651ff1ebe5da5b66225ca696" + resolved "https://registry.npmjs.org/@walletconnect/client/-/client-1.8.0.tgz" integrity sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ== dependencies: "@walletconnect/core" "^1.8.0" @@ -5927,7 +5957,7 @@ "@walletconnect/core@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" + resolved "https://registry.npmjs.org/@walletconnect/core/-/core-1.8.0.tgz" integrity sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw== dependencies: "@walletconnect/socket-transport" "^1.8.0" @@ -5936,7 +5966,7 @@ "@walletconnect/crypto@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" + resolved "https://registry.npmjs.org/@walletconnect/crypto/-/crypto-1.0.3.tgz" integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== dependencies: "@walletconnect/encoding" "^1.0.2" @@ -5948,7 +5978,7 @@ "@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" + resolved "https://registry.npmjs.org/@walletconnect/encoding/-/encoding-1.0.2.tgz" integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== dependencies: is-typedarray "1.0.0" @@ -5957,14 +5987,14 @@ "@walletconnect/environment@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + resolved "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz" integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== dependencies: tslib "1.14.1" "@walletconnect/http-connection@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.8.0.tgz#c19fff5c179d5180d8b974faef2621bd012adb4e" + resolved "https://registry.npmjs.org/@walletconnect/http-connection/-/http-connection-1.8.0.tgz" integrity sha512-IziEr3c53qsMromK7jz0EkbKDHlryRbxXdFR+xaG+S5nfxtUdAfjzlZabvczXdDCgmTij6KbNsZAjBMqCBzACw== dependencies: "@walletconnect/types" "^1.8.0" @@ -5974,7 +6004,7 @@ "@walletconnect/iso-crypto@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" + resolved "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz" integrity sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ== dependencies: "@walletconnect/crypto" "^1.0.2" @@ -5983,7 +6013,7 @@ "@walletconnect/jsonrpc-types@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz" integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== dependencies: keyvaluestorage-interface "^1.0.0" @@ -5991,7 +6021,7 @@ "@walletconnect/jsonrpc-utils@^1.0.3": version "1.0.6" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz#7fa58e6671247e64e189828103282e6258f5330f" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz" integrity sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg== dependencies: "@walletconnect/environment" "^1.0.1" @@ -6000,12 +6030,12 @@ "@walletconnect/mobile-registry@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + resolved "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz" integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== "@walletconnect/qrcode-modal@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz#ddd6f5c9b7ee52c16adf9aacec2a3eac4994caea" + resolved "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz" integrity sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg== dependencies: "@walletconnect/browser-utils" "^1.8.0" @@ -6017,7 +6047,7 @@ "@walletconnect/randombytes@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" + resolved "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.3.tgz" integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== dependencies: "@walletconnect/encoding" "^1.0.2" @@ -6027,12 +6057,12 @@ "@walletconnect/safe-json@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + resolved "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz" integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== "@walletconnect/socket-transport@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b" + resolved "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz" integrity sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ== dependencies: "@walletconnect/types" "^1.8.0" @@ -6041,12 +6071,12 @@ "@walletconnect/types@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz" integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg== "@walletconnect/utils@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz" integrity sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA== dependencies: "@walletconnect/browser-utils" "^1.8.0" @@ -6059,7 +6089,7 @@ "@walletconnect/web3-provider@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.8.0.tgz#e90d903f4c609b7158ecb5f0f41df121e93b56b5" + resolved "https://registry.npmjs.org/@walletconnect/web3-provider/-/web3-provider-1.8.0.tgz" integrity sha512-lqqEO0oRmCehH+c8ZPk3iH7I7YtbzmkWd58/Or2AgWAl869JamzndKCD3sTlNsPRQLxxPpraHQqzur7uclLWvg== dependencies: "@walletconnect/client" "^1.8.0" @@ -6071,26 +6101,26 @@ "@walletconnect/window-getters@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + resolved "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== "@walletconnect/window-getters@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + resolved "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz" integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== dependencies: tslib "1.14.1" "@walletconnect/window-metadata@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + resolved "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz" integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== dependencies: "@walletconnect/window-getters" "^1.0.0" "@webassemblyjs/ast@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: "@webassemblyjs/helper-numbers" "1.11.1" @@ -6098,7 +6128,7 @@ "@webassemblyjs/ast@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz" integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: "@webassemblyjs/helper-module-context" "1.8.5" @@ -6107,49 +6137,49 @@ "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== "@webassemblyjs/floating-point-hex-parser@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz" integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== "@webassemblyjs/helper-api-error@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz" integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== "@webassemblyjs/helper-buffer@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz" integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== "@webassemblyjs/helper-code-frame@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz" integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== dependencies: "@webassemblyjs/wast-printer" "1.8.5" "@webassemblyjs/helper-fsm@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz" integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== "@webassemblyjs/helper-module-context@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz" integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6157,7 +6187,7 @@ "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.1" @@ -6166,17 +6196,17 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== "@webassemblyjs/helper-wasm-bytecode@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz" integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6186,7 +6216,7 @@ "@webassemblyjs/helper-wasm-section@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz" integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6196,45 +6226,45 @@ "@webassemblyjs/ieee754@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/ieee754@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz" integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/leb128@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz" integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== "@webassemblyjs/utf8@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz" integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6248,7 +6278,7 @@ "@webassemblyjs/wasm-edit@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz" integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6262,7 +6292,7 @@ "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6273,7 +6303,7 @@ "@webassemblyjs/wasm-gen@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz" integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6284,7 +6314,7 @@ "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6294,7 +6324,7 @@ "@webassemblyjs/wasm-opt@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz" integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6304,7 +6334,7 @@ "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6316,7 +6346,7 @@ "@webassemblyjs/wasm-parser@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz" integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6328,7 +6358,7 @@ "@webassemblyjs/wast-parser@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz" integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6340,7 +6370,7 @@ "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -6348,7 +6378,7 @@ "@webassemblyjs/wast-printer@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz" integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -6357,63 +6387,63 @@ "@webpack-cli/configtest@^2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz" integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== "@webpack-cli/info@^2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz" integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== "@webpack-cli/serve@^2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz" integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== "@wry/context@^0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" + resolved "https://registry.npmjs.org/@wry/context/-/context-0.7.0.tgz" integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ== dependencies: tslib "^2.3.0" "@wry/equality@^0.5.0": version "0.5.3" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831" + resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.3.tgz" integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== dependencies: tslib "^2.3.0" "@wry/trie@^0.3.0": version "0.3.2" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.2.tgz#a06f235dc184bd26396ba456711f69f8c35097e6" + resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz" integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== dependencies: tslib "^2.3.0" "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@zeit/schemas@2.6.0": version "2.6.0" - resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" + resolved "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.6.0.tgz" integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== JSONStream@^1.0.4, JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" @@ -6421,34 +6451,34 @@ JSONStream@^1.0.4, JSONStream@^1.3.5: abab@^2.0.0: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" abortcontroller-polyfill@^1.7.3: version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: buffer "^6.0.3" @@ -6461,28 +6491,28 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: abstract-leveldown@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz" integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== dependencies: xtend "~4.0.0" abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz" integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== dependencies: xtend "~4.0.0" abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz" integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== dependencies: xtend "~4.0.0" abstract-leveldown@^6.2.1: version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== dependencies: buffer "^5.5.0" @@ -6493,14 +6523,14 @@ abstract-leveldown@^6.2.1: abstract-leveldown@~2.6.0: version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz" integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== dependencies: xtend "~4.0.0" abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz" integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== dependencies: buffer "^5.5.0" @@ -6511,7 +6541,7 @@ abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -6519,7 +6549,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-globals@^4.1.0, acorn-globals@^4.3.0: version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" @@ -6527,67 +6557,67 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0: acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn-jsx@^5.0.0, acorn-jsx@^5.2.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^6.0.1: version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^5.5.3: version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.7, acorn@^6.2.1: version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1, acorn@^8.8.0: version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== acorn@^8.5.0, acorn@^8.7.1: version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== add-stream@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== address@1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== address@^1.0.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adjust-sourcemap-loader@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz" integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== dependencies: loader-utils "^2.0.0" @@ -6595,29 +6625,29 @@ adjust-sourcemap-loader@3.0.0: adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== aes-js@^3.1.1, aes-js@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== agent-base@6, agent-base@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" agentkeepalive@^4.1.3: version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz" integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== dependencies: debug "^4.1.0" @@ -6626,7 +6656,7 @@ agentkeepalive@^4.1.3: aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -6634,17 +6664,17 @@ aggregate-error@^3.0.0: ajv-errors@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@6.5.3: version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz" integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== dependencies: fast-deep-equal "^2.0.1" @@ -6654,7 +6684,7 @@ ajv@6.5.3: ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -6664,7 +6694,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv ajv@^8.0.1: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -6674,127 +6704,127 @@ ajv@^8.0.1: alphanum-sort@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== anchor-markdown-header@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/anchor-markdown-header/-/anchor-markdown-header-0.6.0.tgz#908f2031281766f44ac350380ca0de77ab7065b8" + resolved "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.6.0.tgz" integrity sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA== dependencies: emoji-regex "~10.1.0" ansi-align@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz" integrity sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA== dependencies: string-width "^2.0.0" ansi-colors@3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-colors@^3.0.0, ansi-colors@^3.2.3: version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-html@0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + resolved "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz" integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansicolors@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== antlr4@4.7.1: version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" @@ -6802,7 +6832,7 @@ anymatch@^2.0.0: anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -6810,34 +6840,34 @@ anymatch@~3.1.1, anymatch@~3.1.2: append-transform@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: default-require-extensions "^3.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== aproba@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== arch@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== archy@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== are-we-there-yet@~1.1.2: version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== dependencies: delegates "^1.0.0" @@ -6845,29 +6875,29 @@ are-we-there-yet@~1.1.2: arg@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" + resolved "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz" integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== args@^5.0.1: version "5.0.3" - resolved "https://registry.yarnpkg.com/args/-/args-5.0.3.tgz#943256db85021a85684be2f0882f25d796278702" + resolved "https://registry.npmjs.org/args/-/args-5.0.3.tgz" integrity sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA== dependencies: camelcase "5.0.0" @@ -6877,7 +6907,7 @@ args@^5.0.1: aria-query@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz" integrity sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw== dependencies: ast-types-flow "0.0.7" @@ -6885,7 +6915,7 @@ aria-query@^3.0.0: aria-query@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: "@babel/runtime" "^7.10.2" @@ -6893,83 +6923,83 @@ aria-query@^4.2.2: aria-query@^5.0.0: version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" arity-n@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + resolved "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz" integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" + resolved "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz" integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== dependencies: typical "^2.6.0" array-back@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" + resolved "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz" integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== dependencies: typical "^2.6.1" array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-differ@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== array-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz" integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-flatten@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" @@ -6980,34 +7010,34 @@ array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.4, array-inclu array-union@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-union@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== array-uniq@1.0.3, array-uniq@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.5: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" @@ -7017,7 +7047,7 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^ array.prototype.flatmap@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" @@ -7027,7 +7057,7 @@ array.prototype.flatmap@^1.3.1: array.prototype.reduce@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" @@ -7038,7 +7068,7 @@ array.prototype.reduce@^1.0.5: array.prototype.tosorted@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: call-bind "^1.0.2" @@ -7049,22 +7079,22 @@ array.prototype.tosorted@^1.1.1: arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== asap@^2.0.0, asap@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1.js@^5.2.0: version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -7074,19 +7104,19 @@ asn1.js@^5.2.0: asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assert@^1.1.1: version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: object-assign "^4.1.1" @@ -7094,107 +7124,107 @@ assert@^1.1.1: assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== ast-parents@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== ast-types-flow@0.0.7, ast-types-flow@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== astral-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" async-limiter@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async-mutex@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz" integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== dependencies: tslib "^2.0.0" async-mutex@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz" integrity sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA== dependencies: tslib "^2.3.1" async@1.x, async@^1.4.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== async@2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + resolved "https://registry.npmjs.org/async/-/async-2.6.2.tgz" integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: lodash "^4.17.11" async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1, async@^2.6.4: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== atomic-sleep@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== audit-ci@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/audit-ci/-/audit-ci-3.2.0.tgz#5a42e3e31dbd9d259f7f417803b80a2bd50ef73d" + resolved "https://registry.npmjs.org/audit-ci/-/audit-ci-3.2.0.tgz" integrity sha512-kRFfl/AdmyCrnuc/M4T3l/G/Hy8U4JsgnyRJgGq1532bCwh62ZGeL5rEk2Snk8Umyd3CRgY4V+mVI/LzQoN/Rg== dependencies: JSONStream "^1.3.5" @@ -7206,7 +7236,7 @@ audit-ci@^3.1.1: autoprefixer@^9.6.1: version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz" integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== dependencies: browserslist "^4.12.0" @@ -7219,39 +7249,39 @@ autoprefixer@^9.6.1: available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axe-core@^4.4.3: version "4.6.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.2.tgz#6e566ab2a3d29e415f5115bc0fd2597a5eb3e5e3" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz" integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== axios@^0.21.1: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" axobject-query@^2.0.2, axobject-query@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== dependencies: chalk "^1.1.3" @@ -7260,7 +7290,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-core@^6.0.14, babel-core@^6.26.0: version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" @@ -7285,7 +7315,7 @@ babel-core@^6.0.14, babel-core@^6.26.0: babel-eslint@10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" @@ -7297,14 +7327,14 @@ babel-eslint@10.1.0: babel-extract-comments@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + resolved "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz" integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== dependencies: babylon "^6.18.0" babel-generator@^6.26.0: version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" @@ -7318,7 +7348,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + resolved "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz" integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== dependencies: babel-helper-explode-assignable-expression "^6.24.1" @@ -7327,7 +7357,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + resolved "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz" integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== dependencies: babel-helper-hoist-variables "^6.24.1" @@ -7337,7 +7367,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + resolved "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz" integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== dependencies: babel-helper-function-name "^6.24.1" @@ -7347,7 +7377,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + resolved "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz" integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== dependencies: babel-runtime "^6.22.0" @@ -7356,7 +7386,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz" integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== dependencies: babel-helper-get-function-arity "^6.24.1" @@ -7367,7 +7397,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + resolved "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz" integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== dependencies: babel-runtime "^6.22.0" @@ -7375,7 +7405,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + resolved "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz" integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== dependencies: babel-runtime "^6.22.0" @@ -7383,7 +7413,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + resolved "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz" integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== dependencies: babel-runtime "^6.22.0" @@ -7391,7 +7421,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz" integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== dependencies: babel-runtime "^6.26.0" @@ -7400,7 +7430,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + resolved "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz" integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== dependencies: babel-helper-function-name "^6.24.1" @@ -7411,7 +7441,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + resolved "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz" integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== dependencies: babel-helper-optimise-call-expression "^6.24.1" @@ -7423,7 +7453,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== dependencies: babel-runtime "^6.22.0" @@ -7431,7 +7461,7 @@ babel-helpers@^6.24.1: babel-jest@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz" integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== dependencies: "@jest/transform" "^24.9.0" @@ -7444,7 +7474,7 @@ babel-jest@^24.9.0: babel-loader@8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz" integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: find-cache-dir "^2.1.0" @@ -7455,21 +7485,21 @@ babel-loader@8.1.0: babel-messages@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + resolved "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz" integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== dependencies: babel-runtime "^6.22.0" babel-plugin-istanbul@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz" integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -7479,14 +7509,14 @@ babel-plugin-istanbul@^5.1.0: babel-plugin-jest-hoist@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz" integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== dependencies: "@types/babel__traverse" "^7.0.6" babel-plugin-macros@2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== dependencies: "@babel/runtime" "^7.7.2" @@ -7495,7 +7525,7 @@ babel-plugin-macros@2.8.0: babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -7504,12 +7534,12 @@ babel-plugin-macros@^3.1.0: babel-plugin-named-asset-import@^0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + resolved "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" @@ -7518,7 +7548,7 @@ babel-plugin-polyfill-corejs2@^0.3.3: babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" @@ -7526,14 +7556,14 @@ babel-plugin-polyfill-corejs3@^0.6.0: babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" "babel-plugin-styled-components@>= 1.12.0": version "2.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz#cd977cc0ff8410d5cbfdd142e42576e9c8794b87" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz" integrity sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.0" @@ -7544,32 +7574,32 @@ babel-plugin-polyfill-regenerator@^0.4.1: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + resolved "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz" integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + resolved "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz" integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w== babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz" integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz" integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== dependencies: babel-helper-remap-async-to-generator "^6.24.1" @@ -7578,21 +7608,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz" integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz" integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz" integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== dependencies: babel-runtime "^6.26.0" @@ -7603,7 +7633,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz" integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== dependencies: babel-helper-define-map "^6.24.1" @@ -7618,7 +7648,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz" integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== dependencies: babel-runtime "^6.22.0" @@ -7626,14 +7656,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz" integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz" integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== dependencies: babel-runtime "^6.22.0" @@ -7641,14 +7671,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz" integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz" integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== dependencies: babel-helper-function-name "^6.24.1" @@ -7657,14 +7687,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz" integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz" integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" @@ -7673,7 +7703,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz" integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" @@ -7683,7 +7713,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz" integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== dependencies: babel-helper-hoist-variables "^6.24.1" @@ -7692,7 +7722,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz" integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" @@ -7701,7 +7731,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz" integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== dependencies: babel-helper-replace-supers "^6.24.1" @@ -7709,7 +7739,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz" integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== dependencies: babel-helper-call-delegate "^6.24.1" @@ -7721,7 +7751,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz" integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== dependencies: babel-runtime "^6.22.0" @@ -7729,14 +7759,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz" integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz" integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== dependencies: babel-helper-regex "^6.24.1" @@ -7745,21 +7775,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz" integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz" integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz" integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== dependencies: babel-helper-regex "^6.24.1" @@ -7768,7 +7798,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + resolved "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz" integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" @@ -7777,7 +7807,7 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + resolved "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz" integrity sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA== dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" @@ -7785,19 +7815,19 @@ babel-plugin-transform-object-rest-spread@^6.26.0: babel-plugin-transform-react-remove-prop-types@0.4.24, babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + resolved "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz" integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz" integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== dependencies: babel-runtime "^6.22.0" @@ -7805,7 +7835,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-preset-env@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" @@ -7841,7 +7871,7 @@ babel-preset-env@^1.7.0: babel-preset-jest@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz" integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== dependencies: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" @@ -7849,7 +7879,7 @@ babel-preset-jest@^24.9.0: babel-preset-react-app@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== dependencies: "@babel/core" "^7.16.0" @@ -7871,7 +7901,7 @@ babel-preset-react-app@^10.0.1: babel-preset-react-app@^9.1.2: version "9.1.2" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz" integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA== dependencies: "@babel/core" "7.9.0" @@ -7892,7 +7922,7 @@ babel-preset-react-app@^9.1.2: babel-register@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== dependencies: babel-core "^6.26.0" @@ -7905,7 +7935,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" @@ -7913,7 +7943,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== dependencies: babel-runtime "^6.26.0" @@ -7924,7 +7954,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== dependencies: babel-code-frame "^6.26.0" @@ -7939,7 +7969,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== dependencies: babel-runtime "^6.26.0" @@ -7949,7 +7979,7 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + resolved "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz" integrity sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA== dependencies: babel-core "^6.0.14" @@ -7957,46 +7987,46 @@ babelify@^7.3.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backoff@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + resolved "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz" integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== dependencies: precond "0.2" bail@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base64-sol@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" + resolved "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz" integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== base@^0.11.1: version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -8009,50 +8039,50 @@ base@^0.11.1: basic-auth@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bcfg@^0.1.6, bcfg@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/bcfg/-/bcfg-0.1.7.tgz#610198a67a56160305fdc1f54b5b5c90b52530d7" + resolved "https://registry.npmjs.org/bcfg/-/bcfg-0.1.7.tgz" integrity sha512-+4beq5bXwfmxdcEoHYQsaXawh1qFzjLcRvPe5k5ww/NEWzZTm56Jk8LuPmfeGB7X584jZ8xGq6UgMaZnNDa5Ww== dependencies: bsert "~0.0.10" bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bech32@1.1.4, bech32@^1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== before-after-hook@^2.2.0: version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== better-path-resolve@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + resolved "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz" integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== dependencies: is-windows "^1.0.0" bfj@^7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz" integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== dependencies: bluebird "^3.5.5" @@ -8062,71 +8092,71 @@ bfj@^7.0.2: big-integer@1.6.36: version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz" integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== big.js@^6.0.3: version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== bigint-crypto-utils@^3.0.23: version "3.1.8" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz#e2e0f40cf45488f9d7f0e32ff84152aa73819d5d" + resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz" integrity sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw== dependencies: bigint-mod-arith "^3.1.0" bigint-mod-arith@^3.1.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== bignumber.js@9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz" integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== bignumber.js@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== bignumber.js@^9.0.0, bignumber.js@^9.0.1: version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^1.0.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bintrees@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" + resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== bip39@2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" + resolved "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz" integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== dependencies: create-hash "^1.1.0" @@ -8137,7 +8167,7 @@ bip39@2.5.0: bl@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -8146,37 +8176,37 @@ bl@^4.0.3: blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@4.11.6: version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== bn.js@4.11.8: version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== body-parser@1.20.1, body-parser@^1.16.0, body-parser@^1.20.0: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -8194,7 +8224,7 @@ body-parser@1.20.1, body-parser@^1.16.0, body-parser@^1.20.0: bonjour@^3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== dependencies: array-flatten "^2.1.0" @@ -8206,12 +8236,12 @@ bonjour@^3.5.0: boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== boxen@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz" integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" @@ -8224,7 +8254,7 @@ boxen@1.3.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -8232,14 +8262,14 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^2.3.1, braces@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -8255,26 +8285,26 @@ braces@^2.3.1, braces@^2.3.2: braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" breakword@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" + resolved "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz" integrity sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg== dependencies: wcwidth "^1.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-level@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== dependencies: abstract-level "^1.0.2" @@ -8284,29 +8314,29 @@ browser-level@^1.0.1: browser-or-node@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" + resolved "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz" integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + resolved "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -8318,7 +8348,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: browserify-cipher@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -8327,7 +8357,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -8337,7 +8367,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" @@ -8345,7 +8375,7 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: browserify-sign@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" @@ -8360,14 +8390,14 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@4.10.0: version "4.10.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz" integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== dependencies: caniuse-lite "^1.0.30001035" @@ -8377,7 +8407,7 @@ browserslist@4.10.0: browserslist@^3.2.6: version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" @@ -8385,7 +8415,7 @@ browserslist@^3.2.6: browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.9.1: version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: caniuse-lite "^1.0.30001400" @@ -8395,7 +8425,7 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.3, browserslist@^4 browserslist@^4.14.5: version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -8405,14 +8435,14 @@ browserslist@^4.14.5: bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -8421,29 +8451,29 @@ bs58check@^2.1.2: bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" bsert@~0.0.10: version "0.0.10" - resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.10.tgz#231ac82873a1418c6ade301ab5cd9ae385895597" + resolved "https://registry.npmjs.org/bsert/-/bsert-0.0.10.tgz" integrity sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q== btoa@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== buffer-alloc-unsafe@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" @@ -8451,44 +8481,44 @@ buffer-alloc@^1.2.0: buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== buffer-from@^1.0.0, buffer-from@^1.1.0, buffer-from@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-reverse@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + resolved "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz" integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== buffer-to-arraybuffer@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer-xor@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz" integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== dependencies: safe-buffer "^5.1.1" buffer@6.0.3, buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -8496,7 +8526,7 @@ buffer@6.0.3, buffer@^6.0.3: buffer@^4.3.0: version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" @@ -8505,7 +8535,7 @@ buffer@^4.3.0: buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -8513,73 +8543,73 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: bufferutil@^4.0.1: version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz" integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== dependencies: node-gyp-build "^4.3.0" bufio@^1.0.7: version "1.2.0" - resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.0.tgz#b9ad1c06b0d9010363c387c39d2810a7086d143f" + resolved "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz" integrity sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA== builtin-modules@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== builtin-modules@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== builtin-status-codes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== builtins@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== busboy@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" byline@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== byte-size@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" + resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz" integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== bytewise-core@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + resolved "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz" integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== dependencies: typewise-core "^1.2" bytewise@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + resolved "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz" integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== dependencies: bytewise-core "^1.2.2" @@ -8587,7 +8617,7 @@ bytewise@~1.1.0: cacache@^12.0.2: version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" @@ -8608,7 +8638,7 @@ cacache@^12.0.2: cacache@^13.0.1: version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + resolved "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz" integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== dependencies: chownr "^1.1.2" @@ -8632,7 +8662,7 @@ cacache@^13.0.1: cacache@^15.0.5, cacache@^15.2.0: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -8656,7 +8686,7 @@ cacache@^15.0.5, cacache@^15.2.0: cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -8671,17 +8701,17 @@ cache-base@^1.0.1: cacheable-lookup@^5.0.3: version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== cacheable-lookup@^6.0.4: version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz" integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== cacheable-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== dependencies: clone-response "^1.0.2" @@ -8694,7 +8724,7 @@ cacheable-request@^6.0.0: cacheable-request@^7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz" integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== dependencies: clone-response "^1.0.2" @@ -8707,7 +8737,7 @@ cacheable-request@^7.0.2: cachedown@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" + resolved "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz" integrity sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ== dependencies: abstract-leveldown "^2.4.1" @@ -8715,7 +8745,7 @@ cachedown@1.0.0: caching-transform@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: hasha "^5.0.0" @@ -8725,7 +8755,7 @@ caching-transform@^4.0.0: call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -8733,36 +8763,36 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: call-me-maybe@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== caller-callsite@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + resolved "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== dependencies: callsites "^2.0.0" caller-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== dependencies: caller-callsite "^2.0.0" callsites@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== dependencies: no-case "^2.2.0" @@ -8770,7 +8800,7 @@ camel-case@^3.0.0: camel-case@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -8778,7 +8808,7 @@ camel-case@^4.1.1: camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" @@ -8787,37 +8817,37 @@ camelcase-keys@^6.2.2: camelcase@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelize@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -8827,24 +8857,24 @@ caniuse-api@^3.0.0: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400: version "1.0.30001442" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz#40337f1cf3be7c637b061e2f78582dc1daec0614" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz" integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== caniuse-lite@^1.0.30001449: version "1.0.30001462" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001462.tgz#b2e801e37536d453731286857c8520d3dcee15fe" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001462.tgz" integrity sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw== capture-exit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: rsvp "^4.8.4" cardinal@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== dependencies: ansicolors "~0.3.2" @@ -8852,22 +8882,22 @@ cardinal@^2.1.1: case-sensitive-paths-webpack-plugin@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== catering@^2.1.0, catering@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== cbor@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + resolved "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz" integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== dependencies: bignumber.js "^9.0.1" @@ -8875,31 +8905,31 @@ cbor@^5.2.0: cbor@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" ccount@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== chai-as-promised@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" chai-bn@^0.2.1: version "0.2.2" - resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.2.tgz#4dcf30dbc79db2378a00781693bc749c972bf34f" + resolved "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz" integrity sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg== chai@^4.2.0, chai@^4.3.4, chai@^4.3.6: version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" @@ -8912,7 +8942,7 @@ chai@^4.2.0, chai@^4.3.4, chai@^4.3.6: chalk@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" @@ -8921,7 +8951,7 @@ chalk@2.4.1: chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -8930,7 +8960,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3. chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" @@ -8941,7 +8971,7 @@ chalk@^1.1.3: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -8949,7 +8979,7 @@ chalk@^3.0.0: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -8957,7 +8987,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: change-case@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" + resolved "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz" integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== dependencies: camel-case "^3.0.0" @@ -8981,49 +9011,49 @@ change-case@3.0.2: character-entities-legacy@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== character-entities@^1.0.0: version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== character-reference-invalid@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== charenc@0.0.2, "charenc@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== check-types@^11.1.1: version "11.2.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz" integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== checkpoint-store@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + resolved "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz" integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== dependencies: functional-red-black-tree "^1.0.1" cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -9035,7 +9065,7 @@ cheerio-select@^2.1.0: cheerio@^1.0.0-rc.2: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -9048,7 +9078,7 @@ cheerio@^1.0.0-rc.2: chokidar@3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: anymatch "~3.1.1" @@ -9063,7 +9093,7 @@ chokidar@3.3.0: chokidar@3.5.1: version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" @@ -9078,7 +9108,7 @@ chokidar@3.5.1: chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -9093,7 +9123,7 @@ chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.0, cho chokidar@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" @@ -9112,32 +9142,32 @@ chokidar@^2.1.8: chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.1.0, ci-info@^3.1.1, ci-info@^3.2.0, ci-info@^3.3.0: version "3.7.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz" integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== cids@^0.7.1: version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + resolved "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz" integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== dependencies: buffer "^5.5.0" @@ -9148,7 +9178,7 @@ cids@^0.7.1: cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -9156,12 +9186,12 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: class-is@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + resolved "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz" integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== class-utils@^0.3.5: version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -9171,7 +9201,7 @@ class-utils@^0.3.5: classic-level@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz" integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== dependencies: abstract-level "^1.0.2" @@ -9182,50 +9212,50 @@ classic-level@^1.2.0: classnames@^2.2.5, classnames@^2.2.6: version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^4.2.3: version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== dependencies: source-map "~0.6.0" clean-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + resolved "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz" integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== dependencies: escape-string-regexp "^1.0.5" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz" integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== cli-cursor@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== dependencies: restore-cursor "^2.0.0" cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-table3@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: object-assign "^4.1.0" @@ -9235,14 +9265,14 @@ cli-table3@^0.5.0: cli-table@^0.3.1: version "0.3.11" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" + resolved "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz" integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== dependencies: colors "1.0.3" cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -9250,17 +9280,17 @@ cli-truncate@^2.1.0: cli-width@^2.0.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== clipboardy@1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz" integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== dependencies: arch "^2.1.0" @@ -9268,7 +9298,7 @@ clipboardy@1.2.3: cliui@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== dependencies: string-width "^1.0.1" @@ -9277,7 +9307,7 @@ cliui@^3.2.0: cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" @@ -9286,7 +9316,7 @@ cliui@^5.0.0: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -9295,7 +9325,7 @@ cliui@^6.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -9304,7 +9334,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -9313,7 +9343,7 @@ cliui@^8.0.1: clone-deep@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz" integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== dependencies: for-own "^0.1.3" @@ -9324,7 +9354,7 @@ clone-deep@^0.2.4: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -9333,41 +9363,41 @@ clone-deep@^4.0.1: clone-response@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@2.1.2, clone@^2.0.0, clone@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== clsx@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== cmd-shim@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" + resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz" integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== dependencies: mkdirp-infer-owner "^2.0.0" co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== coa@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: "@types/q" "^1.5.1" @@ -9376,12 +9406,12 @@ coa@^2.0.2: code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" @@ -9389,31 +9419,31 @@ collection-visit@^1.0.0: color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -9421,7 +9451,7 @@ color-string@^1.6.0: color@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -9429,22 +9459,22 @@ color@^3.0.0: colorette@^2.0.14, colorette@^2.0.16, colorette@^2.0.7: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colors@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== colors@1.4.0, colors@^1.1.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== columnify@^1.5.4: version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz" integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== dependencies: strip-ansi "^6.0.1" @@ -9452,19 +9482,19 @@ columnify@^1.5.4: combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz" integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== dependencies: array-back "^2.0.0" @@ -9473,7 +9503,7 @@ command-line-args@^4.0.7: command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -9483,7 +9513,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -9493,57 +9523,57 @@ command-line-usage@^6.1.0: commander@2.18.0: version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + resolved "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz" integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== commander@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== commander@^2.11.0, commander@^2.12.1, commander@^2.19.0, commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== commander@^9.0.0, commander@^9.4.0, commander@^9.4.1: version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== comment-parser@1.1.6-beta.0: version "1.1.6-beta.0" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.6-beta.0.tgz#57e503b18d0a5bd008632dcc54b1f95c2fffe8f6" + resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz" integrity sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw== common-tags@^1.8.0: version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" @@ -9551,26 +9581,26 @@ compare-func@^2.0.0: component-emitter@^1.2.1, component-emitter@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compose-function@3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + resolved "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz" integrity sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg== dependencies: arity-n "^1.0.4" compressible@~2.0.14, compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz" integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: accepts "~1.3.5" @@ -9583,7 +9613,7 @@ compression@1.7.3: compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -9596,12 +9626,12 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -9611,7 +9641,7 @@ concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@ concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -9621,7 +9651,7 @@ concat-stream@^2.0.0: config-chain@^1.1.12: version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" @@ -9629,27 +9659,27 @@ config-chain@^1.1.12: confusing-browser-globals@^1.0.11, confusing-browser-globals@^1.0.9: version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== connect-history-api-fallback@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== constant-case@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + resolved "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== dependencies: snake-case "^2.1.0" @@ -9657,29 +9687,29 @@ constant-case@^2.0.0: constants-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== contains-path@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + resolved "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" integrity sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-hash@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + resolved "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz" integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== dependencies: cids "^0.7.1" @@ -9688,12 +9718,12 @@ content-hash@^2.5.2: content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== conventional-changelog-angular@^5.0.12: version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: compare-func "^2.0.0" @@ -9701,7 +9731,7 @@ conventional-changelog-angular@^5.0.12: conventional-changelog-core@^4.2.2: version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz" integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== dependencies: add-stream "^1.0.0" @@ -9721,12 +9751,12 @@ conventional-changelog-core@^4.2.2: conventional-changelog-preset-loader@^2.3.4: version "2.3.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz" integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== conventional-changelog-writer@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz" integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== dependencies: conventional-commits-filter "^2.0.7" @@ -9741,7 +9771,7 @@ conventional-changelog-writer@^5.0.0: conventional-commits-filter@^2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz" integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== dependencies: lodash.ismatch "^4.4.0" @@ -9749,7 +9779,7 @@ conventional-commits-filter@^2.0.7: conventional-commits-parser@^3.2.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" @@ -9761,7 +9791,7 @@ conventional-commits-parser@^3.2.0: conventional-recommended-bump@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz" integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== dependencies: concat-stream "^2.0.0" @@ -9775,44 +9805,44 @@ conventional-recommended-bump@^6.1.0: convert-source-map@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" convert-source-map@^0.3.3: version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== cookiejar@^2.1.1, cookiejar@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== copy-concurrently@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" @@ -9824,19 +9854,19 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== copy-to-clipboard@^3.3.1: version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" copyfiles@^2.3.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + resolved "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz" integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== dependencies: glob "^7.0.5" @@ -9849,39 +9879,39 @@ copyfiles@^2.3.0: core-js-compat@^3.25.1, core-js-compat@^3.6.2: version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz" integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== dependencies: browserslist "^4.21.4" core-js-pure@^3.0.1, core-js-pure@^3.25.1: version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.1.tgz#ede4a6b8440585c7190062757069c01d37a19dca" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz" integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.5.0: version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz" integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@^2.8.1, cors@^2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -9889,7 +9919,7 @@ cors@^2.8.1, cors@^2.8.5: cosmiconfig@^5.0.0, cosmiconfig@^5.0.7, cosmiconfig@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: import-fresh "^2.0.0" @@ -9899,7 +9929,7 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.7, cosmiconfig@^5.2.1: cosmiconfig@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: "@types/parse-json" "^4.0.0" @@ -9910,7 +9940,7 @@ cosmiconfig@^6.0.0: cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -9921,12 +9951,12 @@ cosmiconfig@^7.0.0: crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-ecdh@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -9934,7 +9964,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -9945,7 +9975,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -9957,12 +9987,12 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^2.1.0, cross-fetch@^2.1.1: version "2.2.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz" integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== dependencies: node-fetch "^2.6.7" @@ -9970,14 +10000,14 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: cross-fetch@^3.1.4: version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" cross-spawn@7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz" integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== dependencies: path-key "^3.1.0" @@ -9986,7 +10016,7 @@ cross-spawn@7.0.1: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" @@ -9995,7 +10025,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -10006,7 +10036,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -10015,12 +10045,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: crypt@0.0.2, "crypt@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== crypto-addr-codec@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" + resolved "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz" integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== dependencies: base-x "^3.0.8" @@ -10033,7 +10063,7 @@ crypto-addr-codec@^0.1.7: crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" @@ -10050,29 +10080,29 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0: crypto-js@^3.1.9-1: version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz" integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== css-blank-pseudo@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz" integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== dependencies: postcss "^7.0.5" css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + resolved "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== css-declaration-sorter@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz" integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== dependencies: postcss "^7.0.1" @@ -10080,7 +10110,7 @@ css-declaration-sorter@^4.0.1: css-has-pseudo@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz" integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== dependencies: postcss "^7.0.6" @@ -10088,7 +10118,7 @@ css-has-pseudo@^0.10.0: css-loader@3.4.2: version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz" integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== dependencies: camelcase "^5.3.1" @@ -10106,19 +10136,19 @@ css-loader@3.4.2: css-prefers-color-scheme@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz" integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== dependencies: postcss "^7.0.5" css-select-base-adapter@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== css-select@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== dependencies: boolbase "^1.0.0" @@ -10128,7 +10158,7 @@ css-select@^2.0.0: css-select@^4.1.3: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -10139,7 +10169,7 @@ css-select@^4.1.3: css-select@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -10150,7 +10180,7 @@ css-select@^5.1.0: css-to-react-native@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== dependencies: camelize "^1.0.0" @@ -10159,7 +10189,7 @@ css-to-react-native@^3.0.0: css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== dependencies: mdn-data "2.0.4" @@ -10167,7 +10197,7 @@ css-tree@1.0.0-alpha.37: css-tree@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -10175,12 +10205,12 @@ css-tree@^1.1.2: css-unit-converter@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz" integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== css-vendor@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== dependencies: "@babel/runtime" "^7.8.3" @@ -10188,22 +10218,22 @@ css-vendor@^2.0.8: css-what@^3.2.1: version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== css@^2.0.0: version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== dependencies: inherits "^2.0.3" @@ -10213,22 +10243,22 @@ css@^2.0.0: cssdb@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz" integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== cssesc@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz" integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssnano-preset-default@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz" integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" @@ -10264,29 +10294,29 @@ cssnano-preset-default@^4.0.8: cssnano-util-get-arguments@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + resolved "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz" integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw== cssnano-util-get-match@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + resolved "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz" integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw== cssnano-util-raw-cache@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + resolved "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz" integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== dependencies: postcss "^7.0.0" cssnano-util-same-parent@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + resolved "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz" integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.1.10: version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" @@ -10296,51 +10326,51 @@ cssnano@^4.1.10: csso@^4.0.2: version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^1.0.0, cssstyle@^1.1.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz" integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: cssom "0.3.x" csstype@^3.0.2, csstype@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== csstype@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== csv-generate@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" + resolved "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz" integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== csv-parse@^4.16.3: version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz" integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== csv-stringify@^5.6.5: version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" + resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz" integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== csv@^5.5.0: version "5.5.3" - resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" + resolved "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz" integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== dependencies: csv-generate "^3.4.3" @@ -10350,41 +10380,41 @@ csv@^5.5.0: cyclist@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== d3-array@2, d3-array@^2.3.0: version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== dependencies: internmap "^1.0.0" "d3-color@1 - 2": version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz" integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== "d3-format@1 - 2": version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz" integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== "d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz" integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== dependencies: d3-color "1 - 2" "d3-path@1 - 2": version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz" integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== d3-scale@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz" integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== dependencies: d3-array "^2.3.0" @@ -10395,28 +10425,28 @@ d3-scale@^3.0.0: d3-shape@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz" integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== dependencies: d3-path "1 - 2" "d3-time-format@2 - 3": version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz" integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== dependencies: d3-time "1 - 2" "d3-time@1 - 2", d3-time@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz" integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== dependencies: d3-array "2" d@1, d@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -10424,24 +10454,24 @@ d@1, d@^1.0.1: damerau-levenshtein@^1.0.4, damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== dargs@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-urls@^1.0.0, data-urls@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== dependencies: abab "^2.0.0" @@ -10450,72 +10480,72 @@ data-urls@^1.0.0, data-urls@^1.1.0: date-fns@^2.24.0: version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== dateformat@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== dateformat@^4.5.1, dateformat@^4.6.3: version "4.6.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== dayjs@^1.11.7: version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== death@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@3.2.6: version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" debug@^3.1.0, debug@^3.2.5, debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debuglog@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== decamelize-keys@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" @@ -10523,60 +10553,60 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js-light@^2.4.1, decimal.js-light@^2.5.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== decode-uri-component@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" decompress-response@^4.2.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz" integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== dependencies: mimic-response "^2.0.0" decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-eql@^4.0.1, deep-eql@^4.1.2: version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" @@ -10588,7 +10618,7 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: deep-equal@^2.0.5: version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== dependencies: call-bind "^1.0.2" @@ -10611,17 +10641,17 @@ deep-equal@^2.0.5: deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-gateway@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz" integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== dependencies: execa "^1.0.0" @@ -10629,38 +10659,38 @@ default-gateway@^4.2.0: default-require-extensions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz" integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: strip-bom "^4.0.0" defaults@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" defer-to-connect@^1.0.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== deferred-leveldown@~1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz" integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== dependencies: abstract-leveldown "~2.6.0" deferred-leveldown@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz" integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== dependencies: abstract-leveldown "~5.0.0" @@ -10668,7 +10698,7 @@ deferred-leveldown@~4.0.0: deferred-leveldown@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== dependencies: abstract-leveldown "~6.2.1" @@ -10676,7 +10706,7 @@ deferred-leveldown@~5.3.0: define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: has-property-descriptors "^1.0.0" @@ -10684,21 +10714,21 @@ define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: define-property@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -10706,12 +10736,12 @@ define-property@^2.0.2: defined@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== del@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz" integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== dependencies: "@types/glob" "^7.1.1" @@ -10724,17 +10754,17 @@ del@^4.1.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depcheck@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-1.4.3.tgz#faa4c143921f3fe25d5a7a633f9864327c250843" + resolved "https://registry.npmjs.org/depcheck/-/depcheck-1.4.3.tgz" integrity sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ== dependencies: "@babel/parser" "7.16.4" @@ -10763,27 +10793,27 @@ depcheck@^1.4.3: depd@2.0.0, depd@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@^1.1.2, depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== deps-regex@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" + resolved "https://registry.npmjs.org/deps-regex/-/deps-regex-0.1.4.tgz" integrity sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA== des.js@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" @@ -10791,49 +10821,49 @@ des.js@^1.0.0: destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-browser@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz" integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== detect-indent@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== dependencies: repeating "^2.0.0" detect-indent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== detect-indent@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-libc@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-newline@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz" integrity sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" @@ -10841,7 +10871,7 @@ detect-port-alt@1.1.6: detect-port@^1.3.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" @@ -10849,7 +10879,7 @@ detect-port@^1.3.0: dezalgo@^1.0.0, dezalgo@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== dependencies: asap "^2.0.0" @@ -10857,37 +10887,37 @@ dezalgo@^1.0.0, dezalgo@^1.0.4: diff-sequences@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== diff-sequences@^29.4.3: version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== diff@3.5.0, diff@^3.1.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diff@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -10896,12 +10926,12 @@ diffie-hellman@^5.0.0: dijkstrajs@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + resolved "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz" integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== dir-glob@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz" integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== dependencies: arrify "^1.0.1" @@ -10909,24 +10939,24 @@ dir-glob@2.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" directory-tree@^2.2.7: version "2.4.0" - resolved "https://registry.yarnpkg.com/directory-tree/-/directory-tree-2.4.0.tgz#66113ef8c2e19f906cf73d2402fc60c2eff0fad5" + resolved "https://registry.npmjs.org/directory-tree/-/directory-tree-2.4.0.tgz" integrity sha512-AM03Th+ypDAHefyB6SP3uezaWkTbol1P43CS5yFU7wePTuHnR4YoHgY6KbGHLr/a065ocN26l9lXOoFBzzM31w== dns-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^1.3.1: version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" @@ -10934,14 +10964,14 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== dependencies: buffer-indexof "^1.0.0" doctoc@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/doctoc/-/doctoc-2.2.1.tgz#83f6a6bf4df97defbe027c9a82d13091a138ffe2" + resolved "https://registry.npmjs.org/doctoc/-/doctoc-2.2.1.tgz" integrity sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ== dependencies: "@textlint/markdown-to-ast" "^12.1.1" @@ -10953,7 +10983,7 @@ doctoc@^2.2.0: doctrine@1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" integrity sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg== dependencies: esutils "^2.0.2" @@ -10961,40 +10991,40 @@ doctrine@1.5.0: doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-helpers@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== dependencies: "@babel/runtime" "^7.1.2" dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -11002,7 +11032,7 @@ dom-helpers@^5.0.1: dom-serializer@0: version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" @@ -11010,7 +11040,7 @@ dom-serializer@0: dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -11019,7 +11049,7 @@ dom-serializer@^1.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -11028,48 +11058,48 @@ dom-serializer@^2.0.0: dom-walk@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== domain-browser@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + resolved "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz" integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" domhandler@4.3.1, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" domutils@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" @@ -11077,7 +11107,7 @@ domutils@^1.7.0: domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -11086,7 +11116,7 @@ domutils@^2.5.2, domutils@^2.8.0: domutils@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== dependencies: dom-serializer "^2.0.0" @@ -11095,14 +11125,14 @@ domutils@^3.0.1: dot-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz" integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== dependencies: no-case "^2.2.0" dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -11110,73 +11140,73 @@ dot-case@^3.0.4: dot-prop@^5.1.0, dot-prop@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" dot-prop@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" -dotenv-expand@5.1.0, dotenv-expand@^5.1.0: +dotenv-expand@5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv@8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== dotenv@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== dotenv@^14.2.0: version "14.3.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz" integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== dotenv@^16.0.0: version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -dotenv@^8.0.0, dotenv@^8.2.0: +dotenv@^8.2.0: version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== dotenv@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== dotignore@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== dependencies: minimatch "^3.0.4" duplexer3@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" @@ -11186,7 +11216,7 @@ duplexify@^3.4.2, duplexify@^3.6.0: duplexify@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz" integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== dependencies: end-of-stream "^1.4.1" @@ -11196,7 +11226,7 @@ duplexify@^4.1.1: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -11204,22 +11234,22 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.47, electron-to-chromium@^1.4.251: version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== electron-to-chromium@^1.4.284: version "1.4.324" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.324.tgz#0cff81794e6c48efbb0b029224968621230d8ace" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.324.tgz" integrity sha512-m+eBs/kh3TXnCuqDF6aHLLRwLK2U471JAbZ1KYigf0TM96fZglxv0/ZFBvyIxnLKsIWUoDiVnHTA2mhYz1fqdA== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -11232,47 +11262,47 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 emoji-regex@^7.0.1, emoji-regex@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emoji-regex@~10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.1.0.tgz#d50e383743c0f7a5945c47087295afc112e3cf66" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz" integrity sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg== emojis-list@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encode-utf8@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz" integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== dependencies: abstract-leveldown "^5.0.0" @@ -11283,7 +11313,7 @@ encoding-down@5.0.4, encoding-down@~5.0.0: encoding-down@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== dependencies: abstract-leveldown "^6.2.1" @@ -11293,21 +11323,21 @@ encoding-down@^6.3.0: encoding@^0.1.11, encoding@^0.1.12: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhanced-resolve@^4.1.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" @@ -11316,7 +11346,7 @@ enhanced-resolve@^4.1.0: enhanced-resolve@^5.10.0: version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" @@ -11324,70 +11354,70 @@ enhanced-resolve@^5.10.0: enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== entities@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envalid@^7.1.0, envalid@^7.2.2: version "7.3.1" - resolved "https://registry.yarnpkg.com/envalid/-/envalid-7.3.1.tgz#5bf6bbb4effab2d64a1991d8078b4ae38924f0d2" + resolved "https://registry.npmjs.org/envalid/-/envalid-7.3.1.tgz" integrity sha512-KL1YRwn8WcoF/Ty7t+yLLtZol01xr9ZJMTjzoGRM8NaSU+nQQjSWOQKKJhJP2P57bpdakJ9jbxqQX4fGTOicZg== dependencies: tslib "2.3.1" envinfo@^7.7.3, envinfo@^7.7.4: version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== err-code@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.0.tgz#dd1b69ea5bfc3c27199c9753efd4de015102c252" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz" integrity sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g== dependencies: call-bind "^1.0.2" @@ -11425,12 +11455,12 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-get-iterator@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -11445,12 +11475,12 @@ es-get-iterator@^1.1.2: es-module-lexer@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== es-set-tostringtag@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -11459,14 +11489,14 @@ es-set-tostringtag@^2.0.0: es-shim-unscopables@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -11475,7 +11505,7 @@ es-to-primitive@^1.2.1: es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: es6-iterator "^2.0.3" @@ -11484,12 +11514,12 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-error@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== es6-iterator@2.0.3, es6-iterator@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" @@ -11498,12 +11528,12 @@ es6-iterator@2.0.3, es6-iterator@^2.0.3: es6-promise@^4.2.8: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -11511,32 +11541,32 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.8.x: version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" @@ -11548,7 +11578,7 @@ escodegen@1.8.x: escodegen@^1.11.0, escodegen@^1.9.1: version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" @@ -11560,19 +11590,19 @@ escodegen@^1.11.0, escodegen@^1.9.1: eslint-config-prettier@^8.3.0: version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz" integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== eslint-config-react-app@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz" integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== dependencies: confusing-browser-globals "^1.0.9" eslint-config-react-app@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz" integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== dependencies: "@babel/core" "^7.16.0" @@ -11592,7 +11622,7 @@ eslint-config-react-app@^7.0.0: eslint-config-standard-with-typescript@^21.0.1: version "21.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-21.0.1.tgz#f4c8bb883d8dfd634005239a54c3c222746e3c64" + resolved "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-21.0.1.tgz" integrity sha512-FeiMHljEJ346Y0I/HpAymNKdrgKEpHpcg/D93FvPHWfCzbT4QyUJba/0FwntZeGLXfUiWDSeKmdJD597d9wwiw== dependencies: "@typescript-eslint/parser" "^4.0.0" @@ -11600,17 +11630,17 @@ eslint-config-standard-with-typescript@^21.0.1: eslint-config-standard@^16.0.0, eslint-config-standard@^16.0.3: version "16.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" + resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz" integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== eslint-config-standard@^17.0.0: version "17.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf" + resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz" integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.6: version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: debug "^3.2.7" @@ -11618,7 +11648,7 @@ eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.6: eslint-loader@3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" + resolved "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz" integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw== dependencies: fs-extra "^8.1.0" @@ -11629,14 +11659,14 @@ eslint-loader@3.0.3: eslint-module-utils@^2.4.1, eslint-module-utils@^2.7.3: version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" eslint-plugin-es@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== dependencies: eslint-utils "^2.0.0" @@ -11644,14 +11674,14 @@ eslint-plugin-es@^3.0.0: eslint-plugin-flowtype@4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz" integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ== dependencies: lodash "^4.17.15" eslint-plugin-flowtype@^8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== dependencies: lodash "^4.17.21" @@ -11659,7 +11689,7 @@ eslint-plugin-flowtype@^8.0.3: eslint-plugin-import@2.20.1: version "2.20.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz" integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== dependencies: array-includes "^3.0.3" @@ -11677,7 +11707,7 @@ eslint-plugin-import@2.20.1: eslint-plugin-import@^2.23.4, eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.26.0: version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: array-includes "^3.1.4" @@ -11696,14 +11726,14 @@ eslint-plugin-import@^2.23.4, eslint-plugin-import@^2.25.3, eslint-plugin-import eslint-plugin-jest@^25.3.0: version "25.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsdoc@^35.1.2: version "35.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz#45932ee22669bbe06c97b82b936d56361efad370" + resolved "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz" integrity sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw== dependencies: "@es-joy/jsdoccomment" "0.9.0-alpha.1" @@ -11718,7 +11748,7 @@ eslint-plugin-jsdoc@^35.1.2: eslint-plugin-jsx-a11y@6.2.3: version "6.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz" integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== dependencies: "@babel/runtime" "^7.4.5" @@ -11733,7 +11763,7 @@ eslint-plugin-jsx-a11y@6.2.3: eslint-plugin-jsx-a11y@^6.5.1: version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz" integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== dependencies: "@babel/runtime" "^7.18.9" @@ -11752,7 +11782,7 @@ eslint-plugin-jsx-a11y@^6.5.1: eslint-plugin-node@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + resolved "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== dependencies: eslint-plugin-es "^3.0.0" @@ -11764,46 +11794,46 @@ eslint-plugin-node@^11.1.0: eslint-plugin-prefer-arrow@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz#e7fbb3fa4cd84ff1015b9c51ad86550e55041041" + resolved "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz" integrity sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ== eslint-plugin-prettier@^3.4.0: version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-prettier@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-promise@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz" integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== eslint-plugin-promise@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz" integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== eslint-plugin-react-hooks@^1.6.1: version "1.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz" integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== eslint-plugin-react-hooks@^4.3.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@7.19.0: version "7.19.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz" integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== dependencies: array-includes "^3.1.1" @@ -11821,7 +11851,7 @@ eslint-plugin-react@7.19.0: eslint-plugin-react@^7.24.0, eslint-plugin-react@^7.27.1: version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz" integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: array-includes "^3.1.6" @@ -11842,19 +11872,19 @@ eslint-plugin-react@^7.24.0, eslint-plugin-react@^7.27.1: eslint-plugin-standard@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" + resolved "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz" integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== eslint-plugin-testing-library@^5.0.1: version "5.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" + resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz" integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== dependencies: "@typescript-eslint/utils" "^5.13.0" eslint-plugin-unicorn@^32.0.1: version "32.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-32.0.1.tgz#a7cb9f538441b78936a96261eea4392d76526d77" + resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-32.0.1.tgz" integrity sha512-LaZ9utnXtOJjnoDkpm+nQsONUUmyRR0WD6PGROSdQRRW3LRmgK/ZP8wxjW+Ai+2uolKTtuJzLx2mvbIeIoLqpg== dependencies: ci-info "^3.1.1" @@ -11873,7 +11903,7 @@ eslint-plugin-unicorn@^32.0.1: eslint-plugin-unicorn@^42.0.0: version "42.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz#47d60c00c263ad743403b052db689e39acbacff1" + resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz" integrity sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg== dependencies: "@babel/helper-validator-identifier" "^7.15.7" @@ -11893,7 +11923,7 @@ eslint-plugin-unicorn@^42.0.0: eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -11901,7 +11931,7 @@ eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: eslint-scope@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" @@ -11909,7 +11939,7 @@ eslint-scope@^4.0.3: eslint-scope@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" @@ -11917,7 +11947,7 @@ eslint-scope@^7.1.1: eslint-template-visitor@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz#b52f96ff311e773a345d79053ccc78275bbc463d" + resolved "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz" integrity sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA== dependencies: "@babel/core" "^7.12.16" @@ -11928,43 +11958,43 @@ eslint-template-visitor@^2.3.2: eslint-utils@^1.3.1, eslint-utils@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^5.6.0: version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + resolved "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz" integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" @@ -12006,7 +12036,7 @@ eslint@^5.6.0: eslint@^6.6.0: version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + resolved "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: "@babel/code-frame" "^7.0.0" @@ -12049,7 +12079,7 @@ eslint@^6.6.0: eslint@^7.27.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -12095,7 +12125,7 @@ eslint@^7.27.0: eslint@^8.16.0, eslint@^8.19.0: version "8.31.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz" integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== dependencies: "@eslint/eslintrc" "^1.4.1" @@ -12140,7 +12170,7 @@ eslint@^8.16.0, eslint@^8.19.0: espree@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz" integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: acorn "^6.0.7" @@ -12149,7 +12179,7 @@ espree@^5.0.1: espree@^6.1.2: version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + resolved "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz" integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: acorn "^7.1.1" @@ -12158,7 +12188,7 @@ espree@^6.1.2: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -12167,7 +12197,7 @@ espree@^7.3.0, espree@^7.3.1: espree@^9.4.0: version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: acorn "^8.8.0" @@ -12176,61 +12206,61 @@ espree@^9.4.0: esprima@2.7.x, esprima@^2.7.1: version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1, esquery@^1.3.1, esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eth-block-tracker@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" + resolved "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz" integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== dependencies: eth-query "^2.1.0" @@ -12243,7 +12273,7 @@ eth-block-tracker@^3.0.0: eth-block-tracker@^4.4.2: version "4.4.3" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + resolved "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== dependencies: "@babel/plugin-transform-runtime" "^7.5.5" @@ -12255,7 +12285,7 @@ eth-block-tracker@^4.4.2: eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== dependencies: idna-uts46-hx "^2.3.1" @@ -12263,7 +12293,7 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: eth-gas-reporter@^0.2.25: version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" @@ -12284,7 +12314,7 @@ eth-gas-reporter@^0.2.25: eth-json-rpc-filters@^4.2.1: version "4.2.2" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + resolved "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz" integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== dependencies: "@metamask/safe-event-emitter" "^2.0.0" @@ -12296,7 +12326,7 @@ eth-json-rpc-filters@^4.2.1: eth-json-rpc-infura@^3.1.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz" integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== dependencies: cross-fetch "^2.1.1" @@ -12306,7 +12336,7 @@ eth-json-rpc-infura@^3.1.0: eth-json-rpc-infura@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz" integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== dependencies: eth-json-rpc-middleware "^6.0.0" @@ -12316,7 +12346,7 @@ eth-json-rpc-infura@^5.1.0: eth-json-rpc-middleware@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz" integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== dependencies: async "^2.5.0" @@ -12335,7 +12365,7 @@ eth-json-rpc-middleware@^1.5.0: eth-json-rpc-middleware@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz" integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== dependencies: btoa "^1.2.1" @@ -12352,7 +12382,7 @@ eth-json-rpc-middleware@^6.0.0: eth-lib@0.2.8: version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz" integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== dependencies: bn.js "^4.11.6" @@ -12361,7 +12391,7 @@ eth-lib@0.2.8: eth-lib@^0.1.26: version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz" integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== dependencies: bn.js "^4.11.6" @@ -12373,7 +12403,7 @@ eth-lib@^0.1.26: eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + resolved "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz" integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== dependencies: json-rpc-random-id "^1.0.0" @@ -12381,21 +12411,21 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: eth-rpc-errors@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz" integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== dependencies: fast-safe-stringify "^2.0.6" eth-rpc-errors@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== dependencies: fast-safe-stringify "^2.0.6" eth-sig-util@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz" integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== dependencies: buffer "^5.2.1" @@ -12407,7 +12437,7 @@ eth-sig-util@3.0.0: eth-sig-util@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz" integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== dependencies: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" @@ -12415,7 +12445,7 @@ eth-sig-util@^1.4.2: eth-sig-util@^2.5.2: version "2.5.4" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.4.tgz" integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== dependencies: ethereumjs-abi "0.6.8" @@ -12425,7 +12455,7 @@ eth-sig-util@^2.5.2: eth-sig-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.1.tgz" integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ== dependencies: ethereumjs-abi "^0.6.8" @@ -12435,7 +12465,7 @@ eth-sig-util@^3.0.1: eth-tx-summary@^3.1.2: version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + resolved "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz" integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== dependencies: async "^2.1.2" @@ -12451,7 +12481,7 @@ eth-tx-summary@^3.1.2: ethashjs@~0.0.7: version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" + resolved "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz" integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== dependencies: async "^2.1.2" @@ -12461,24 +12491,24 @@ ethashjs@~0.0.7: ethereum-bloom-filters@^1.0.6: version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: js-sha3 "^0.8.0" ethereum-common@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz" integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== ethereum-common@^0.0.18: version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz" integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -12499,7 +12529,7 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz" integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== dependencies: "@noble/hashes" "1.1.2" @@ -12509,7 +12539,7 @@ ethereum-cryptography@^1.0.3: ethereum-waffle@^3.3.0, ethereum-waffle@^3.4.0: version "3.4.4" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" + resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz" integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== dependencies: "@ethereum-waffle/chai" "^3.4.4" @@ -12520,7 +12550,7 @@ ethereum-waffle@^3.3.0, ethereum-waffle@^3.4.0: ethereumjs-abi@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz" integrity sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g== dependencies: bn.js "^4.10.0" @@ -12528,7 +12558,7 @@ ethereumjs-abi@0.6.5: ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -12543,7 +12573,7 @@ ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" + resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz" integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== dependencies: ethereumjs-util "^6.0.0" @@ -12552,7 +12582,7 @@ ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: ethereumjs-account@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz" integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: ethereumjs-util "^5.0.0" @@ -12561,7 +12591,7 @@ ethereumjs-account@^2.0.3: ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== dependencies: async "^2.0.1" @@ -12572,7 +12602,7 @@ ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethere ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== dependencies: async "^2.0.1" @@ -12583,7 +12613,7 @@ ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: ethereumjs-blockchain@^4.0.3: version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" + resolved "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz" integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== dependencies: async "^2.6.1" @@ -12599,17 +12629,17 @@ ethereumjs-blockchain@^4.0.3: ethereumjs-common@1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" + resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz" integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz" integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz" integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== dependencies: ethereumjs-common "^1.5.0" @@ -12617,7 +12647,7 @@ ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== dependencies: ethereum-common "^0.0.18" @@ -12625,7 +12655,7 @@ ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -12638,7 +12668,7 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumj ethereumjs-util@^4.3.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz" integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== dependencies: bn.js "^4.8.0" @@ -12649,7 +12679,7 @@ ethereumjs-util@^4.3.0: ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== dependencies: bn.js "^4.11.0" @@ -12662,7 +12692,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -12673,7 +12703,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereu ethereumjs-vm@4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz" integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== dependencies: async "^2.1.2" @@ -12694,7 +12724,7 @@ ethereumjs-vm@4.2.0: ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== dependencies: async "^2.1.2" @@ -12711,7 +12741,7 @@ ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: ethereumjs-wallet@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" + resolved "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz" integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== dependencies: aes-js "^3.1.1" @@ -12726,7 +12756,7 @@ ethereumjs-wallet@0.6.5: ethereumjs-wallet@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz#2c000504b4c71e8f3782dabe1113d192522e99b6" + resolved "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz" integrity sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA== dependencies: aes-js "^3.1.2" @@ -12740,7 +12770,7 @@ ethereumjs-wallet@^1.0.1: ethers@^4.0.32, ethers@^4.0.40: version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: aes-js "3.0.0" @@ -12755,7 +12785,7 @@ ethers@^4.0.32, ethers@^4.0.40: ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.2, ethers@^5.5.2, ethers@^5.5.3, ethers@^5.5.4, ethers@^5.7.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -12791,7 +12821,7 @@ ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.2, ethers@^5.5.2, ethers@^5.5.3, ethe ethjs-abi@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" + resolved "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz" integrity sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA== dependencies: bn.js "4.11.6" @@ -12800,7 +12830,7 @@ ethjs-abi@^0.2.1: ethjs-unit@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== dependencies: bn.js "4.11.6" @@ -12808,7 +12838,7 @@ ethjs-unit@0.1.6: ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -12816,7 +12846,7 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: event-stream@4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-4.0.1.tgz#4092808ec995d0dd75ea4580c1df6a74db2cde65" + resolved "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz" integrity sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA== dependencies: duplexer "^0.1.1" @@ -12829,32 +12859,32 @@ event-stream@4.0.1: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== eventemitter3@4.0.7, eventemitter3@^4.0.0, eventemitter3@^4.0.1, eventemitter3@^4.0.4: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: version "1.1.2" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz" integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -12862,12 +12892,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: exec-sh@^0.3.2: version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz" integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== dependencies: cross-spawn "^5.0.1" @@ -12880,7 +12910,7 @@ execa@^0.7.0: execa@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + resolved "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz" integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== dependencies: cross-spawn "^5.0.1" @@ -12893,7 +12923,7 @@ execa@^0.8.0: execa@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -12906,7 +12936,7 @@ execa@^1.0.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -12921,12 +12951,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" @@ -12939,12 +12969,12 @@ expand-brackets@^2.1.4: expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== expect@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + resolved "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz" integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== dependencies: "@jest/types" "^24.9.0" @@ -12956,7 +12986,7 @@ expect@^24.9.0: expect@^29.0.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + resolved "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz" integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: "@jest/expect-utils" "^29.5.0" @@ -12967,7 +12997,7 @@ expect@^29.0.0: express-prom-bundle@^6.3.6, express-prom-bundle@^6.4.1: version "6.6.0" - resolved "https://registry.yarnpkg.com/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz#9c33c1bd1478d70e3961a53aed2d17f15ef821ca" + resolved "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz" integrity sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ== dependencies: on-finished "^2.3.0" @@ -12975,7 +13005,7 @@ express-prom-bundle@^6.3.6, express-prom-bundle@^6.4.1: express@^4.14.0, express@^4.17.1, express@^4.18.1: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -13012,21 +13042,21 @@ express@^4.14.0, express@^4.17.1, express@^4.18.1: ext@^1.1.2: version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: type "^2.7.2" extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" @@ -13034,17 +13064,17 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@^3.0.0, extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extendable-error@^0.1.5: version "0.1.7" - resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + resolved "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== external-editor@^3.0.3, external-editor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -13053,7 +13083,7 @@ external-editor@^3.0.3, external-editor@^3.1.0: extglob@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -13067,56 +13097,56 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fake-merkle-patricia-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + resolved "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz" integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== dependencies: checkpoint-store "^1.1.0" fast-check@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" + resolved "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz" integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== dependencies: pure-rand "^5.0.1" fast-copy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.0.tgz#875ebf33b13948ae012b6e51d33da5e6e7571ab8" + resolved "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.0.tgz" integrity sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA== fast-deep-equal@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz" integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-equals@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-2.0.4.tgz#3add9410585e2d7364c2deeb6a707beadb24b927" + resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz" integrity sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w== fast-glob@^2.0.2: version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" @@ -13128,7 +13158,7 @@ fast-glob@^2.0.2: fast-glob@^3.0.3, fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -13139,114 +13169,114 @@ fast-glob@^3.0.3, fast-glob@^3.2.7, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-redact@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz" integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8, fast-safe-stringify@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-url-parser@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== dependencies: punycode "^1.3.2" fastest-levenshtein@^1.0.12: version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fault@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + resolved "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz" integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== dependencies: format "^0.2.0" faye-websocket@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz" integrity sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ== dependencies: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fetch-ponyfill@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz" integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== dependencies: node-fetch "~1.7.1" figgy-pudding@^3.5.1: version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" figures@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: flat-cache "^2.0.1" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" file-loader@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz" integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== dependencies: loader-utils "^1.2.3" @@ -13254,17 +13284,17 @@ file-loader@4.3.0: file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== filesize@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + resolved "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz" integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" @@ -13274,19 +13304,19 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" filter-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -13299,7 +13329,7 @@ finalhandler@1.2.0: find-cache-dir@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz" integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== dependencies: commondir "^1.0.1" @@ -13308,7 +13338,7 @@ find-cache-dir@^0.1.1: find-cache-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" @@ -13317,7 +13347,7 @@ find-cache-dir@^2.1.0: find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -13326,7 +13356,7 @@ find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: find-replace@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz" integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" @@ -13334,26 +13364,26 @@ find-replace@^1.0.3: find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" find-root@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@3.0.0, find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -13361,7 +13391,7 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: find-up@5.0.0, find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -13369,7 +13399,7 @@ find-up@5.0.0, find-up@^5.0.0: find-up@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== dependencies: path-exists "^2.0.0" @@ -13377,14 +13407,14 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-yarn-workspace-root2@1.2.16: version "1.2.16" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + resolved "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz" integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== dependencies: micromatch "^4.0.2" @@ -13392,7 +13422,7 @@ find-yarn-workspace-root2@1.2.16: find-yarn-workspace-root@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== dependencies: fs-extra "^4.0.3" @@ -13400,14 +13430,14 @@ find-yarn-workspace-root@^1.2.1: find-yarn-workspace-root@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz" integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== dependencies: micromatch "^4.0.2" flat-cache@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: flatted "^2.0.0" @@ -13416,7 +13446,7 @@ flat-cache@^2.0.1: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -13424,44 +13454,44 @@ flat-cache@^3.0.4: flat@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatstr@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" + resolved "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz" integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== flatted@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flatten@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== flow-stoplight@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" + resolved "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz" integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== flush-write-stream@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: inherits "^2.0.3" @@ -13469,43 +13499,43 @@ flush-write-stream@^1.0.0: fmix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + resolved "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz" integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== dependencies: imul "^1.0.0" follow-redirects@^1.0.0, follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" for-in@^0.1.3: version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + resolved "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz" integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== for-own@^0.1.3: version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + resolved "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== dependencies: for-in "^1.0.1" foreground-child@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: cross-spawn "^7.0.0" @@ -13513,12 +13543,12 @@ foreground-child@^2.0.0: forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== fork-ts-checker-webpack-plugin@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz" integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== dependencies: babel-code-frame "^6.22.0" @@ -13532,12 +13562,12 @@ fork-ts-checker-webpack-plugin@3.1.1: form-data-encoder@1.7.1: version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz" integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== form-data@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== dependencies: asynckit "^0.4.0" @@ -13546,7 +13576,7 @@ form-data@^2.2.0: form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -13555,7 +13585,7 @@ form-data@^3.0.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -13564,7 +13594,7 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -13573,12 +13603,12 @@ form-data@~2.3.2: format@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== formidable@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f" + resolved "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz" integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== dependencies: dezalgo "^1.0.4" @@ -13588,34 +13618,34 @@ formidable@^2.1.1: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== fp-ts@^1.0.0: version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== from2@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" @@ -13623,22 +13653,22 @@ from2@^2.1.0: from@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + resolved "https://registry.npmjs.org/from/-/from-0.1.7.tgz" integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== fromentries@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -13649,7 +13679,7 @@ fs-extra@^0.30.0: fs-extra@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -13658,7 +13688,7 @@ fs-extra@^10.0.0: fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" @@ -13667,7 +13697,7 @@ fs-extra@^4.0.2, fs-extra@^4.0.3: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -13676,7 +13706,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -13685,7 +13715,7 @@ fs-extra@^8.1.0: fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -13695,26 +13725,26 @@ fs-extra@^9.0.0, fs-extra@^9.1.0: fs-minipass@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: minipass "^2.6.0" fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-readdir-recursive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs-write-stream-atomic@^1.0.8: version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== dependencies: graceful-fs "^4.1.2" @@ -13724,12 +13754,12 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fs@^0.0.1-security: version "0.0.1-security" - resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== fsevents@2.1.2: @@ -13757,12 +13787,12 @@ fsevents@~2.3.1, fsevents@~2.3.2: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -13772,17 +13802,17 @@ function.prototype.name@^1.1.5: functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache-core@^2.13.2: version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" + resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz" integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== dependencies: abstract-leveldown "3.0.0" @@ -13819,7 +13849,7 @@ ganache-core@^2.13.2: gauge@~2.7.3: version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" @@ -13833,27 +13863,27 @@ gauge@~2.7.3: gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" @@ -13862,7 +13892,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: get-intrinsic@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" @@ -13871,17 +13901,17 @@ get-intrinsic@^1.2.0: get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-pkg-repo@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz" integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: "@hutson/parse-repository-url" "^3.0.0" @@ -13891,41 +13921,41 @@ get-pkg-repo@^4.0.0: get-port@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== get-port@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -13933,19 +13963,19 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" ghost-testrpc@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: chalk "^2.4.2" @@ -13953,7 +13983,7 @@ ghost-testrpc@^0.0.2: git-raw-commits@^2.0.8: version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" @@ -13964,7 +13994,7 @@ git-raw-commits@^2.0.8: git-remote-origin-url@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz" integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" @@ -13972,7 +14002,7 @@ git-remote-origin-url@^2.0.0: git-semver-tags@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz" integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== dependencies: meow "^8.0.0" @@ -13980,7 +14010,7 @@ git-semver-tags@^4.1.1: git-up@^4.0.0: version "4.0.5" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" + resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz" integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== dependencies: is-ssh "^1.3.0" @@ -13988,26 +14018,26 @@ git-up@^4.0.0: git-url-parse@^11.4.4: version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz" integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== dependencies: git-up "^4.0.0" gitconfiglocal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz" integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== dependencies: is-glob "^3.1.0" @@ -14015,31 +14045,31 @@ glob-parent@^3.1.0: glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz" integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@7.1.3: version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" @@ -14051,7 +14081,7 @@ glob@7.1.3: glob@7.1.6: version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" @@ -14063,7 +14093,7 @@ glob@7.1.6: glob@7.1.7: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -14075,7 +14105,7 @@ glob@7.1.7: glob@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -14087,7 +14117,7 @@ glob@7.2.0: glob@^5.0.15: version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" @@ -14098,7 +14128,7 @@ glob@^5.0.15: glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -14110,7 +14140,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl glob@^8.0.0, glob@^8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: fs.realpath "^1.0.0" @@ -14121,14 +14151,14 @@ glob@^8.0.0, glob@^8.0.3: global-modules@2.0.0, global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -14137,7 +14167,7 @@ global-prefix@^3.0.0: global@~4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" @@ -14145,38 +14175,38 @@ global@~4.4.0: globals@^11.1.0, globals@^11.7.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + resolved "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz" integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" globals@^9.18.0: version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globby@12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-12.1.0.tgz#471757d6d9d25651b655b1da3eae1e25209f86a5" + resolved "https://registry.npmjs.org/globby/-/globby-12.1.0.tgz" integrity sha512-YULDaNwsoUZkRy9TWSY/M7Obh0abamTKoKzTfOI3uU+hfpX2FZqOq8LFDxsjYheF1RH7ITdArgbQnsNBFgcdBA== dependencies: array-union "^3.0.1" @@ -14188,7 +14218,7 @@ globby@12.1.0: globby@8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + resolved "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz" integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== dependencies: array-union "^1.0.1" @@ -14201,7 +14231,7 @@ globby@8.0.2: globby@^10.0.1: version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: "@types/glob" "^7.1.1" @@ -14215,7 +14245,7 @@ globby@^10.0.1: globby@^11.0.0, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -14227,7 +14257,7 @@ globby@^11.0.0, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: globby@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" @@ -14238,14 +14268,14 @@ globby@^6.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" got@12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + resolved "https://registry.npmjs.org/got/-/got-12.1.0.tgz" integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== dependencies: "@sindresorhus/is" "^4.6.0" @@ -14264,7 +14294,7 @@ got@12.1.0: got@9.6.0: version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== dependencies: "@sindresorhus/is" "^0.14.0" @@ -14281,7 +14311,7 @@ got@9.6.0: got@^11.8.5: version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: "@sindresorhus/is" "^4.0.0" @@ -14298,39 +14328,39 @@ got@^11.8.5: graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== graphql-tag@^2.12.6: version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== dependencies: tslib "^2.1.0" graphql@^16.3.0: version "16.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== growl@1.10.5: version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== growly@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== gzip-size@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== dependencies: duplexer "^0.1.1" @@ -14338,12 +14368,12 @@ gzip-size@5.1.1: handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== handlebars@^4.0.1, handlebars@^4.7.7: version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" @@ -14355,12 +14385,12 @@ handlebars@^4.0.1, handlebars@^4.7.7: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -14368,17 +14398,17 @@ har-validator@~5.1.3: hard-rejection@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== hardhat-deploy-ethers@^0.3.0-beta.11: version "0.3.0-beta.13" - resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" + resolved "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz" integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== hardhat-deploy@^0.11.12: version "0.11.22" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.22.tgz#9799c0266a0fc40c84690de54760f1b4dae5e487" + resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.22.tgz" integrity sha512-ZhHVNB7Jo2l8Is+KIAk9F8Q3d7pptyiX+nsNbIFXztCz81kaP+6kxNODRBqRCy7SOD3It4+iKCL6tWsPAA/jVQ== dependencies: "@types/qs" "^6.9.7" @@ -14397,7 +14427,7 @@ hardhat-deploy@^0.11.12: hardhat-deploy@^0.7.10: version "0.7.11" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.11.tgz#93f79dfbb529eeda24ac963e23a19064d536be2f" + resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.7.11.tgz" integrity sha512-ONLH3NH8Biuhky44KRFyaINVHM8JI4Ihy1TpntIRZUpIFHlz9h3gieq46H7iwdp6z3CqMsOCChF0riUF3CFpmQ== dependencies: "@ethersproject/abi" "^5.0.0" @@ -14423,7 +14453,7 @@ hardhat-deploy@^0.7.10: hardhat-deploy@^0.9.3: version "0.9.29" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.9.29.tgz#b1177d4f3077f335ad3f50c55825d9417ec75968" + resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.9.29.tgz" integrity sha512-8tIGszPFmOaXtyloCbASiZPvoAgLNGGL/Ubys3YW/oj4dvoPa8G6YDyaOCdsAhsENZ+QgR280NFSG9JdN7SU9Q== dependencies: "@ethersproject/abi" "^5.4.0" @@ -14451,7 +14481,7 @@ hardhat-deploy@^0.9.3: hardhat-gas-reporter@^1.0.4, hardhat-gas-reporter@^1.0.8: version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" @@ -14460,21 +14490,21 @@ hardhat-gas-reporter@^1.0.4, hardhat-gas-reporter@^1.0.8: hardhat-output-validator@^0.1.18: version "0.1.19" - resolved "https://registry.yarnpkg.com/hardhat-output-validator/-/hardhat-output-validator-0.1.19.tgz#5d030d8f8994457e5bd7ea9dd62142fafd8dbb7a" + resolved "https://registry.npmjs.org/hardhat-output-validator/-/hardhat-output-validator-0.1.19.tgz" integrity sha512-rIDdiHHt2WEMBRnbOa95xpze2t88KSfWh2gI9LCbdrMuSmsLiO2qzgB4cZ6O7Tvjz4jsBgxD9Dcr4uNP8pJ8Pw== dependencies: chalk "^4.1.2" hardhat-watcher@^2.1.1: version "2.5.0" - resolved "https://registry.yarnpkg.com/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz#3ee76c3cb5b99f2875b78d176207745aa484ed4a" + resolved "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz" integrity sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA== dependencies: chokidar "^3.5.3" hardhat@^2.12.5: version "2.12.5" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.5.tgz#e3cd4d6dae35cb9505055967bd7e15e6adf3aa03" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz" integrity sha512-f/t7+hLlhsnQZ6LDXyV+8rHGRZFZY1sgFvgrwr9fBjMdGp1Bu6hHq1KXS4/VFZfZcVdL1DAWWEkryinZhqce+A== dependencies: "@ethersproject/abi" "^5.1.2" @@ -14530,73 +14560,73 @@ hardhat@^2.12.5: harmony-reflect@^1.4.6: version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has-value@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" @@ -14605,7 +14635,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" @@ -14614,12 +14644,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" @@ -14627,14 +14657,14 @@ has-values@^1.0.0: has@^1.0.0, has@^1.0.3, has@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -14643,7 +14673,7 @@ hash-base@^3.0.0: hash.js@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" @@ -14651,7 +14681,7 @@ hash.js@1.1.3: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -14659,7 +14689,7 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: hasha@^5.0.0: version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" @@ -14667,12 +14697,12 @@ hasha@^5.0.0: he@1.2.0, he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== header-case@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + resolved "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz" integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== dependencies: no-case "^2.2.0" @@ -14680,12 +14710,12 @@ header-case@^1.0.0: heap@0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz" integrity sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ== help-me@^4.0.1: version "4.2.0" - resolved "https://registry.yarnpkg.com/help-me/-/help-me-4.2.0.tgz#50712bfd799ff1854ae1d312c36eafcea85b0563" + resolved "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz" integrity sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA== dependencies: glob "^8.0.0" @@ -14693,27 +14723,27 @@ help-me@^4.0.1: hex-color-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== hexoid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== highlight.js@^10.4.1: version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== highlightjs-solidity@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz#48b945f41886fa49af9f06023e6e87fffc243745" + resolved "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz" integrity sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -14722,14 +14752,14 @@ hmac-drbg@^1.0.1: hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" home-or-tmp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== dependencies: os-homedir "^1.0.0" @@ -14737,24 +14767,24 @@ home-or-tmp@^2.0.0: hoopy@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -14764,17 +14794,17 @@ hpack.js@^2.1.6: hsl-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + resolved "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz" integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== hsla-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz" integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== html-dom-parser@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-1.2.0.tgz#8f689b835982ffbf245eda99730e92b8462c111e" + resolved "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz" integrity sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg== dependencies: domhandler "4.3.1" @@ -14782,24 +14812,24 @@ html-dom-parser@1.2.0: html-encoding-sniffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz" integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" html-entities@^1.3.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" @@ -14812,7 +14842,7 @@ html-minifier-terser@^5.0.1: html-react-parser@^1.4.0: version "1.4.14" - resolved "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-1.4.14.tgz#577b7a90be0c61eebbbc488d914ad08398c79ef5" + resolved "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz" integrity sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ== dependencies: domhandler "4.3.1" @@ -14822,7 +14852,7 @@ html-react-parser@^1.4.0: html-webpack-plugin@4.0.0-beta.11: version "4.0.0-beta.11" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz" integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== dependencies: html-minifier-terser "^5.0.1" @@ -14834,7 +14864,7 @@ html-webpack-plugin@4.0.0-beta.11: htmlparser2@7.2.0, htmlparser2@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz" integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== dependencies: domelementtype "^2.0.1" @@ -14844,7 +14874,7 @@ htmlparser2@7.2.0, htmlparser2@^7.2.0: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -14854,7 +14884,7 @@ htmlparser2@^6.1.0: htmlparser2@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== dependencies: domelementtype "^2.3.0" @@ -14864,7 +14894,7 @@ htmlparser2@^8.0.1: http-basic@^8.1.1: version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== dependencies: caseless "^0.12.0" @@ -14874,17 +14904,17 @@ http-basic@^8.1.1: http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -14895,7 +14925,7 @@ http-errors@2.0.0: http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" @@ -14905,17 +14935,17 @@ http-errors@~1.6.2: http-https@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== http-parser-js@>=0.5.1: version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -14924,7 +14954,7 @@ http-proxy-agent@^4.0.1: http-proxy-middleware@0.19.1: version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz" integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== dependencies: http-proxy "^1.17.0" @@ -14934,7 +14964,7 @@ http-proxy-middleware@0.19.1: http-proxy@^1.17.0: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -14943,14 +14973,14 @@ http-proxy@^1.17.0: http-response-object@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== dependencies: "@types/node" "^10.0.3" http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -14959,7 +14989,7 @@ http-signature@~1.2.0: http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== dependencies: quick-lru "^5.1.1" @@ -14967,7 +14997,7 @@ http2-wrapper@^1.0.0-beta.5.2: http2-wrapper@^2.1.10: version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz" integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== dependencies: quick-lru "^5.1.1" @@ -14975,12 +15005,12 @@ http2-wrapper@^2.1.10: https-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -14988,133 +15018,133 @@ https-proxy-agent@^5.0.0: human-id@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + resolved "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz" integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== human-standard-token-abi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/human-standard-token-abi/-/human-standard-token-abi-2.0.0.tgz#e0c2057596d0a1d4a110f91f974a37f4b904f008" + resolved "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-2.0.0.tgz" integrity sha512-m1f5DiIvqaNmpgphNqx2OziyTCj4Lvmmk28uMSxGWrOc9/lMpAKH8UcMPhvb13DMNZPzxn07WYFhxOGKuPLryg== humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" husky@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" + resolved "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz" integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== hyphenate-style-name@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== dependencies: postcss "^7.0.14" identity-obj-proxy@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== dependencies: harmony-reflect "^1.4.6" idna-uts46-hx@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== dependencies: punycode "2.1.0" ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== ignore-walk@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" ignore@^3.3.5: version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + resolved "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.1, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== immediate@~3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz" integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== immer@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + resolved "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz" integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== immutable@^4.0.0, immutable@^4.0.0-rc.12: version "4.2.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz" integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== import-cwd@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" integrity sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg== dependencies: import-from "^2.1.0" import-fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== dependencies: caller-path "^2.0.0" @@ -15122,7 +15152,7 @@ import-fresh@^2.0.0: import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -15130,14 +15160,14 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: import-from@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + resolved "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz" integrity sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w== dependencies: resolve-from "^3.0.0" import-local@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + resolved "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: pkg-dir "^3.0.0" @@ -15145,7 +15175,7 @@ import-local@^2.0.0: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -15153,37 +15183,37 @@ import-local@^3.0.2: import-modules@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" + resolved "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz" integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== imul@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + resolved "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz" integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indexes-of@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -15191,27 +15221,27 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== init-package-json@^2.0.2: version "2.0.5" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" + resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz" integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== dependencies: npm-package-arg "^8.1.5" @@ -15224,12 +15254,12 @@ init-package-json@^2.0.2: inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inquirer@7.0.4: version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz" integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== dependencies: ansi-escapes "^4.2.1" @@ -15248,7 +15278,7 @@ inquirer@7.0.4: inquirer@^6.2.2: version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" @@ -15267,7 +15297,7 @@ inquirer@^6.2.2: inquirer@^7.0.0, inquirer@^7.3.3: version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" @@ -15286,7 +15316,7 @@ inquirer@^7.0.0, inquirer@^7.3.3: internal-ip@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz" integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== dependencies: default-gateway "^4.2.0" @@ -15294,7 +15324,7 @@ internal-ip@^4.3.0: internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz" integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== dependencies: get-intrinsic "^1.1.3" @@ -15303,90 +15333,90 @@ internal-slot@^1.0.3, internal-slot@^1.0.4: internmap@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== interpret@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== invariant@2, invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" ip-regex@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== ip@^1.1.0, ip@^1.1.5: version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ip@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== ipaddr.js@1.9.1, ipaddr.js@^1.9.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-absolute-url@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== is-absolute-url@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-accessor-descriptor@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-alphabetical@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== is-alphanumerical@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== dependencies: is-alphabetical "^1.0.0" @@ -15394,7 +15424,7 @@ is-alphanumerical@^1.0.0: is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -15402,7 +15432,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: is-array-buffer@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz" integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== dependencies: call-bind "^1.0.2" @@ -15411,7 +15441,7 @@ is-array-buffer@^3.0.0: is-array-buffer@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -15420,38 +15450,38 @@ is-array-buffer@^3.0.1: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== dependencies: binary-extensions "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -15459,43 +15489,43 @@ is-boolean-object@^1.1.0: is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0, is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-builtin-module@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz" integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== dependencies: builtin-modules "^3.3.0" is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-ci@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" is-color-stop@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + resolved "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz" integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA== dependencies: css-color-names "^0.0.4" @@ -15507,40 +15537,40 @@ is-color-stop@^1.0.0: is-core-module@^2.4.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== is-descriptor@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" @@ -15549,7 +15579,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" @@ -15558,204 +15588,204 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== is-docker@^2.0.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finite@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fn@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + resolved "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz" integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-function@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== dependencies: is-extglob "^2.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-hexadecimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== is-lambda@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== is-lower-case@^1.1.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz" integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== dependencies: lower-case "^1.1.0" is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-cwd@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz" integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== dependencies: is-path-inside "^2.1.0" is-path-inside@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz" integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== dependencies: path-is-inside "^1.0.2" is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -15763,79 +15793,79 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-resolvable@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-root@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-ssh@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz" integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== dependencies: protocols "^2.0.1" is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-subdir@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + resolved "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz" integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== dependencies: better-path-resolve "1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -15846,46 +15876,46 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-upper-case@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz" integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== dependencies: upper-case "^1.1.0" is-url@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-utf8@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== dependencies: call-bind "^1.0.2" @@ -15893,78 +15923,78 @@ is-weakset@^2.0.1: is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-hook@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: append-transform "^2.0.0" istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz" integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== dependencies: "@babel/generator" "^7.4.0" @@ -15977,7 +16007,7 @@ istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: istanbul-lib-instrument@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -15987,7 +16017,7 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-processinfo@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: archy "^1.0.0" @@ -15999,7 +16029,7 @@ istanbul-lib-processinfo@^2.0.2: istanbul-lib-report@^2.0.4: version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz" integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== dependencies: istanbul-lib-coverage "^2.0.5" @@ -16008,7 +16038,7 @@ istanbul-lib-report@^2.0.4: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -16017,7 +16047,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^3.0.1: version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz" integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== dependencies: debug "^4.1.1" @@ -16028,7 +16058,7 @@ istanbul-lib-source-maps@^3.0.1: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -16037,14 +16067,14 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^2.2.6: version "2.2.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz" integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== dependencies: html-escaper "^2.0.0" istanbul-reports@^3.0.2: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -16052,7 +16082,7 @@ istanbul-reports@^3.0.2: istanbul@^0.4.5: version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + resolved "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz" integrity sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg== dependencies: abbrev "1.0.x" @@ -16072,7 +16102,7 @@ istanbul@^0.4.5: jest-changed-files@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz" integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== dependencies: "@jest/types" "^24.9.0" @@ -16081,7 +16111,7 @@ jest-changed-files@^24.9.0: jest-cli@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz" integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== dependencies: "@jest/core" "^24.9.0" @@ -16100,7 +16130,7 @@ jest-cli@^24.9.0: jest-config@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz" integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== dependencies: "@babel/core" "^7.1.0" @@ -16123,7 +16153,7 @@ jest-config@^24.9.0: jest-diff@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== dependencies: chalk "^2.0.1" @@ -16133,7 +16163,7 @@ jest-diff@^24.9.0: jest-diff@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz" integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" @@ -16143,14 +16173,14 @@ jest-diff@^29.5.0: jest-docblock@^24.3.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz" integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== dependencies: detect-newline "^2.1.0" jest-each@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz" integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== dependencies: "@jest/types" "^24.9.0" @@ -16161,7 +16191,7 @@ jest-each@^24.9.0: jest-environment-jsdom-fourteen@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + resolved "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz" integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== dependencies: "@jest/environment" "^24.3.0" @@ -16173,7 +16203,7 @@ jest-environment-jsdom-fourteen@1.0.1: jest-environment-jsdom@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz" integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== dependencies: "@jest/environment" "^24.9.0" @@ -16185,7 +16215,7 @@ jest-environment-jsdom@^24.9.0: jest-environment-node@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz" integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== dependencies: "@jest/environment" "^24.9.0" @@ -16196,17 +16226,17 @@ jest-environment-node@^24.9.0: jest-get-type@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== jest-get-type@^29.4.3: version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-haste-map@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz" integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== dependencies: "@jest/types" "^24.9.0" @@ -16225,7 +16255,7 @@ jest-haste-map@^24.9.0: jest-jasmine2@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz" integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== dependencies: "@babel/traverse" "^7.1.0" @@ -16247,7 +16277,7 @@ jest-jasmine2@^24.9.0: jest-leak-detector@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz" integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== dependencies: jest-get-type "^24.9.0" @@ -16255,7 +16285,7 @@ jest-leak-detector@^24.9.0: jest-matcher-utils@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz" integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== dependencies: chalk "^2.0.1" @@ -16265,7 +16295,7 @@ jest-matcher-utils@^24.9.0: jest-matcher-utils@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz" integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" @@ -16275,7 +16305,7 @@ jest-matcher-utils@^29.5.0: jest-message-util@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz" integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== dependencies: "@babel/code-frame" "^7.0.0" @@ -16289,7 +16319,7 @@ jest-message-util@^24.9.0: jest-message-util@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz" integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" @@ -16304,24 +16334,24 @@ jest-message-util@^29.5.0: jest-mock@^24.0.0, jest-mock@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz" integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== dependencies: "@jest/types" "^24.9.0" jest-pnp-resolver@^1.2.1: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz" integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== jest-resolve-dependencies@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz" integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== dependencies: "@jest/types" "^24.9.0" @@ -16330,7 +16360,7 @@ jest-resolve-dependencies@^24.9.0: jest-resolve@24.9.0, jest-resolve@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz" integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== dependencies: "@jest/types" "^24.9.0" @@ -16341,7 +16371,7 @@ jest-resolve@24.9.0, jest-resolve@^24.9.0: jest-runner@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz" integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== dependencies: "@jest/console" "^24.7.1" @@ -16366,7 +16396,7 @@ jest-runner@^24.9.0: jest-runtime@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz" integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== dependencies: "@jest/console" "^24.7.1" @@ -16395,12 +16425,12 @@ jest-runtime@^24.9.0: jest-serializer@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz" integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== jest-snapshot@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz" integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== dependencies: "@babel/types" "^7.0.0" @@ -16419,14 +16449,14 @@ jest-snapshot@^24.9.0: jest-styled-components@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/jest-styled-components/-/jest-styled-components-7.1.1.tgz#faf19c733e0de4bbef1f9151955b99e839b7df48" + resolved "https://registry.npmjs.org/jest-styled-components/-/jest-styled-components-7.1.1.tgz" integrity sha512-OUq31R5CivBF8oy81dnegNQrRW13TugMol/Dz6ZnFfEyo03exLASod7YGwyHGuayYlKmCstPtz0RQ1+NrAbIIA== dependencies: "@adobe/css-tools" "^4.0.1" jest-util@^24.0.0, jest-util@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz" integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== dependencies: "@jest/console" "^24.9.0" @@ -16444,7 +16474,7 @@ jest-util@^24.0.0, jest-util@^24.9.0: jest-util@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz" integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: "@jest/types" "^29.5.0" @@ -16456,7 +16486,7 @@ jest-util@^29.5.0: jest-validate@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz" integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== dependencies: "@jest/types" "^24.9.0" @@ -16468,7 +16498,7 @@ jest-validate@^24.9.0: jest-watch-typeahead@0.4.2: version "0.4.2" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz" integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== dependencies: ansi-escapes "^4.2.1" @@ -16481,7 +16511,7 @@ jest-watch-typeahead@0.4.2: jest-watcher@^24.3.0, jest-watcher@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz" integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== dependencies: "@jest/test-result" "^24.9.0" @@ -16494,7 +16524,7 @@ jest-watcher@^24.3.0, jest-watcher@^24.9.0: jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== dependencies: merge-stream "^2.0.0" @@ -16502,7 +16532,7 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: jest-worker@^25.4.0: version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz" integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" @@ -16510,7 +16540,7 @@ jest-worker@^25.4.0: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -16519,7 +16549,7 @@ jest-worker@^27.4.5: jest@24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + resolved "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz" integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== dependencies: import-local "^2.0.0" @@ -16527,47 +16557,47 @@ jest@24.9.0: jmespath@^0.15.0: version "0.15.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz" integrity sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w== joycon@^3.0.0, joycon@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== js-sdsl@^4.1.4: version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz" integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== js-sha3@0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz" integrity sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA== js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== js-yaml@3.13.1: version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" @@ -16575,7 +16605,7 @@ js-yaml@3.13.1: js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.6.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -16583,41 +16613,41 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: argparse "^2.0.1" js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbi@^3.1.1, jsbi@^3.1.4: version "3.2.5" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" + resolved "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz" integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdoc-type-pratt-parser@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz#5750d2d32ffb001866537d3baaedea7cf84c7036" + resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz" integrity sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ== jsdoc-type-pratt-parser@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz#3482a3833b74a88c95a6ba7253f0c0de3b77b9f5" + resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz" integrity sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg== jsdom@^11.5.1: version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz" integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" @@ -16649,7 +16679,7 @@ jsdom@^11.5.1: jsdom@^14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz" integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== dependencies: abab "^2.0.0" @@ -16681,42 +16711,42 @@ jsdom@^14.1.0: jsesc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz" integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== dependencies: async "^2.0.1" @@ -16728,7 +16758,7 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: json-rpc-engine@^5.3.0: version "5.4.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz" integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== dependencies: eth-rpc-errors "^3.0.0" @@ -16736,7 +16766,7 @@ json-rpc-engine@^5.3.0: json-rpc-engine@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz" integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== dependencies: "@metamask/safe-event-emitter" "^2.0.0" @@ -16744,92 +16774,92 @@ json-rpc-engine@^6.1.0: json-rpc-error@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + resolved "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz" integrity sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug== dependencies: inherits "^2.0.1" json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + resolved "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz" integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz" integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: jsonify "^0.0.1" json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json3@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + resolved "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== json5@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -16838,22 +16868,22 @@ jsonfile@^6.0.1: jsonify@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsonschema@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -16863,7 +16893,7 @@ jsprim@^1.2.2: jss-plugin-camel-case@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz#76dddfa32f9e62d17daa4e3504991fd0933b89e1" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz" integrity sha512-wgBPlL3WS0WDJ1lPJcgjux/SHnDuu7opmgQKSraKs4z8dCCyYMx9IDPFKBXQ8Q5dVYij1FFV0WdxyhuOOAXuTg== dependencies: "@babel/runtime" "^7.3.1" @@ -16872,7 +16902,7 @@ jss-plugin-camel-case@^10.9.2: jss-plugin-default-unit@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz#3e7f4a1506b18d8fe231554fd982439feb2a9c53" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz" integrity sha512-pYg0QX3bBEFtTnmeSI3l7ad1vtHU42YEEpgW7pmIh+9pkWNWb5dwS/4onSfAaI0kq+dOZHzz4dWe+8vWnanoSg== dependencies: "@babel/runtime" "^7.3.1" @@ -16880,7 +16910,7 @@ jss-plugin-default-unit@^10.9.2: jss-plugin-global@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz#e7f2ad4a5e8e674fb703b04b57a570b8c3e5c2c2" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz" integrity sha512-GcX0aE8Ef6AtlasVrafg1DItlL/tWHoC4cGir4r3gegbWwF5ZOBYhx04gurPvWHC8F873aEGqge7C17xpwmp2g== dependencies: "@babel/runtime" "^7.3.1" @@ -16888,7 +16918,7 @@ jss-plugin-global@^10.9.2: jss-plugin-nested@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz#3aa2502816089ecf3981e1a07c49b276d67dca63" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz" integrity sha512-VgiOWIC6bvgDaAL97XCxGD0BxOKM0K0zeB/ECyNaVF6FqvdGB9KBBWRdy2STYAss4VVA7i5TbxFZN+WSX1kfQA== dependencies: "@babel/runtime" "^7.3.1" @@ -16897,7 +16927,7 @@ jss-plugin-nested@^10.9.2: jss-plugin-props-sort@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz#645f6c8f179309667b3e6212f66b59a32fb3f01f" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz" integrity sha512-AP1AyUTbi2szylgr+O0OB7gkIxEGzySLITZ2GpsaoX72YMCGI2jYAc+WUhPfvUnZYiauF4zTnN4V4TGuvFjJlw== dependencies: "@babel/runtime" "^7.3.1" @@ -16905,7 +16935,7 @@ jss-plugin-props-sort@^10.9.2: jss-plugin-rule-value-function@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz#9afe07596e477123cbf11120776be6a64494541f" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz" integrity sha512-vf5ms8zvLFMub6swbNxvzsurHfUZ5Shy5aJB2gIpY6WNA3uLinEcxYyraQXItRHi5ivXGqYciFDRM2ZoVoRZ4Q== dependencies: "@babel/runtime" "^7.3.1" @@ -16914,7 +16944,7 @@ jss-plugin-rule-value-function@^10.9.2: jss-plugin-vendor-prefixer@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz#410a0f3b9f8dbbfba58f4d329134df4849aa1237" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz" integrity sha512-SxcEoH+Rttf9fEv6KkiPzLdXRmI6waOTcMkbbEFgdZLDYNIP9UKNHFy6thhbRKqv0XMQZdrEsbDyV464zE/dUA== dependencies: "@babel/runtime" "^7.3.1" @@ -16923,7 +16953,7 @@ jss-plugin-vendor-prefixer@^10.9.2: jss@10.9.2, jss@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.2.tgz#9379be1f195ef98011dfd31f9448251bd61b95a9" + resolved "https://registry.npmjs.org/jss/-/jss-10.9.2.tgz" integrity sha512-b8G6rWpYLR4teTUbGd4I4EsnWjg7MN0Q5bSsjKhVkJVjhQDy2KzkbD2AW3TuT0RYZVmZZHKIrXDn6kjU14qkUg== dependencies: "@babel/runtime" "^7.3.1" @@ -16933,7 +16963,7 @@ jss@10.9.2, jss@^10.9.2: jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz" integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== dependencies: array-includes "^3.1.1" @@ -16941,7 +16971,7 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" @@ -16949,12 +16979,12 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: just-extend@^4.0.2: version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== keccak@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== dependencies: node-addon-api "^2.0.0" @@ -16962,7 +16992,7 @@ keccak@3.0.1: keccak@^3.0.0, keccak@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" @@ -16971,98 +17001,98 @@ keccak@^3.0.0, keccak@^3.0.2: keyv@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== dependencies: json-buffer "3.0.0" keyv@^4.0.0: version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz" integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== dependencies: json-buffer "3.0.1" keyvaluestorage-interface@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + resolved "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz" integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== killable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== kind-of@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz" integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== dependencies: is-buffer "^1.0.2" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaw-sync@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== dependencies: graceful-fs "^4.1.11" klaw@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kleur@^4.1.4: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@^0.3.20: version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.5: version "1.0.7" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.7.tgz#41cc248730f3f12a452c2e2efe32bc0bbce67967" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz" integrity sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw== dependencies: language-subtag-registry "^0.3.20" last-call-webpack-plugin@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + resolved "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz" integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== dependencies: lodash "^4.17.5" @@ -17070,29 +17100,29 @@ last-call-webpack-plugin@^3.0.0: lazy-cache@^0.2.3: version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz" integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== lazy-cache@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== lcid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== dependencies: invert-kv "^1.0.0" left-pad@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== lerna@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" + resolved "https://registry.npmjs.org/lerna/-/lerna-4.0.0.tgz" integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== dependencies: "@lerna/add" "4.0.0" @@ -17116,45 +17146,45 @@ lerna@^4.0.0: level-codec@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== dependencies: buffer "^5.6.0" level-codec@~7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== level-concat-iterator@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz" integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== level-errors@^1.0.3: version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz" integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== dependencies: errno "~0.1.1" level-errors@^2.0.0, level-errors@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz" integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== dependencies: errno "~0.1.1" level-errors@~1.0.3: version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz" integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== dependencies: errno "~0.1.1" level-iterator-stream@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz" integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== dependencies: inherits "^2.0.1" @@ -17163,7 +17193,7 @@ level-iterator-stream@^2.0.3: level-iterator-stream@~1.3.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz" integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== dependencies: inherits "^2.0.1" @@ -17173,7 +17203,7 @@ level-iterator-stream@~1.3.0: level-iterator-stream@~3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz" integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== dependencies: inherits "^2.0.1" @@ -17182,7 +17212,7 @@ level-iterator-stream@~3.0.0: level-iterator-stream@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz" integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== dependencies: inherits "^2.0.4" @@ -17191,7 +17221,7 @@ level-iterator-stream@~4.0.0: level-js@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55" + resolved "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz" integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg== dependencies: abstract-leveldown "~6.2.3" @@ -17201,7 +17231,7 @@ level-js@^5.0.0: level-mem@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz" integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== dependencies: level-packager "~4.0.0" @@ -17209,7 +17239,7 @@ level-mem@^3.0.1: level-mem@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz" integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== dependencies: level-packager "^5.0.3" @@ -17217,7 +17247,7 @@ level-mem@^5.0.1: level-packager@^5.0.3, level-packager@^5.1.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== dependencies: encoding-down "^6.3.0" @@ -17225,7 +17255,7 @@ level-packager@^5.0.3, level-packager@^5.1.0: level-packager@~4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz" integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== dependencies: encoding-down "~5.0.0" @@ -17233,14 +17263,14 @@ level-packager@~4.0.0: level-post@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" + resolved "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz" integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== dependencies: ltgt "^2.1.2" level-sublevel@6.6.4: version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" + resolved "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz" integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== dependencies: bytewise "~1.1.0" @@ -17256,19 +17286,19 @@ level-sublevel@6.6.4: level-supports@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-supports@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz" integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== dependencies: xtend "^4.0.2" level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: buffer "^6.0.3" @@ -17276,7 +17306,7 @@ level-transcoder@^1.0.1: level-ws@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz" integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== dependencies: readable-stream "~1.0.15" @@ -17284,7 +17314,7 @@ level-ws@0.0.0: level-ws@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz" integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== dependencies: inherits "^2.0.3" @@ -17293,7 +17323,7 @@ level-ws@^1.0.0: level-ws@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz" integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== dependencies: inherits "^2.0.3" @@ -17302,7 +17332,7 @@ level-ws@^2.0.0: level@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6" + resolved "https://registry.npmjs.org/level/-/level-6.0.1.tgz" integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw== dependencies: level-js "^5.0.0" @@ -17311,7 +17341,7 @@ level@^6.0.1: level@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: browser-level "^1.0.1" @@ -17319,7 +17349,7 @@ level@^8.0.0: leveldown@^5.4.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" + resolved "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz" integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== dependencies: abstract-leveldown "~6.2.1" @@ -17328,7 +17358,7 @@ leveldown@^5.4.0: levelup@3.1.1, levelup@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" + resolved "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz" integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== dependencies: deferred-leveldown "~4.0.0" @@ -17338,7 +17368,7 @@ levelup@3.1.1, levelup@^3.0.0: levelup@^1.2.1: version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + resolved "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz" integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== dependencies: deferred-leveldown "~1.2.1" @@ -17351,7 +17381,7 @@ levelup@^1.2.1: levelup@^4.3.2, levelup@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + resolved "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== dependencies: deferred-leveldown "~5.3.0" @@ -17362,24 +17392,24 @@ levelup@^4.3.2, levelup@^4.4.0: leven@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz" integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levenary@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + resolved "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz" integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== dependencies: leven "^3.1.0" levn@^0.3.0, levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -17387,7 +17417,7 @@ levn@^0.3.0, levn@~0.3.0: levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -17395,7 +17425,7 @@ levn@^0.4.1: libnpmaccess@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" + resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz" integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== dependencies: aproba "^2.0.0" @@ -17405,7 +17435,7 @@ libnpmaccess@^4.0.1: libnpmpublish@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" + resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-4.0.2.tgz" integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== dependencies: normalize-package-data "^3.0.2" @@ -17416,19 +17446,19 @@ libnpmpublish@^4.0.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^3.0.1: version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz" integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== dependencies: uc.micro "^1.0.1" lint-staged@11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.0.0.tgz#24d0a95aa316ba28e257f5c4613369a75a10c712" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz" integrity sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw== dependencies: chalk "^4.1.1" @@ -17449,7 +17479,7 @@ lint-staged@11.0.0: listr2@^3.8.2: version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -17463,7 +17493,7 @@ listr2@^3.8.2: load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== dependencies: graceful-fs "^4.1.2" @@ -17474,7 +17504,7 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz" integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== dependencies: graceful-fs "^4.1.2" @@ -17484,7 +17514,7 @@ load-json-file@^2.0.0: load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" @@ -17494,7 +17524,7 @@ load-json-file@^4.0.0: load-json-file@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz" integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== dependencies: graceful-fs "^4.1.15" @@ -17504,7 +17534,7 @@ load-json-file@^6.2.0: load-yaml-file@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + resolved "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz" integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== dependencies: graceful-fs "^4.1.5" @@ -17514,7 +17544,7 @@ load-yaml-file@^0.2.0: loader-fs-cache@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + resolved "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz" integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== dependencies: find-cache-dir "^0.1.1" @@ -17522,17 +17552,17 @@ loader-fs-cache@^1.0.2: loader-runner@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: big.js "^5.2.2" @@ -17541,7 +17571,7 @@ loader-utils@1.2.3: loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" @@ -17550,7 +17580,7 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -17559,7 +17589,7 @@ loader-utils@^2.0.0: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -17567,7 +17597,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -17575,96 +17605,96 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash._reinterpolate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.flatten@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.isequalwith@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz#266726ddd528f854f21f4ea98a065606e0fbc6b0" + resolved "https://registry.npmjs.org/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz" integrity sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ== lodash.ismatch@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz" integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.sortby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.template@^4.4.0, lodash.template@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: lodash._reinterpolate "^3.0.0" @@ -17672,48 +17702,48 @@ lodash.template@^4.4.0, lodash.template@^4.5.0: lodash.templatesettings@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: lodash._reinterpolate "^3.0.0" lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@4.17.20: version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== lodash@4.17.21, "lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: chalk "^2.4.2" log-symbols@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: chalk "^4.0.0" log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -17721,7 +17751,7 @@ log-symbols@4.1.0, log-symbols@^4.1.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -17731,89 +17761,89 @@ log-update@^4.0.0: loglevel@^1.6.8: version "1.8.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz" integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== longest-streak@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== looper@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" + resolved "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz" integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== looper@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" + resolved "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz" integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" lower-case-first@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + resolved "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== dependencies: lower-case "^1.1.2" lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lowercase-keys@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lowercase-keys@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@5.1.1, lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz" integrity sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow== dependencies: pseudomap "^1.0.1" lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -17821,46 +17851,46 @@ lru-cache@^4.0.1: lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== ltgt@~2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz" integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== lunr@^2.3.9: version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== lz-string@^1.4.4: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" @@ -17868,19 +17898,19 @@ make-dir@^2.0.0, make-dir@^2.1.0: make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^8.0.9: version "8.0.14" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz" integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== dependencies: agentkeepalive "^4.1.3" @@ -17901,7 +17931,7 @@ make-fetch-happen@^8.0.9: make-fetch-happen@^9.0.1: version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== dependencies: agentkeepalive "^4.1.3" @@ -17923,46 +17953,46 @@ make-fetch-happen@^9.0.1: makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" mamacro@^0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + resolved "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz" integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-stream@0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + resolved "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz" integrity sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ== map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" markdown-it@12.2.0: version "12.2.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.2.0.tgz#091f720fd5db206f80de7a8d1f1a7035fd0d38db" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz" integrity sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg== dependencies: argparse "^2.0.1" @@ -17973,7 +18003,7 @@ markdown-it@12.2.0: markdown-it@12.3.2: version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== dependencies: argparse "^2.0.1" @@ -17984,24 +18014,24 @@ markdown-it@12.3.2: markdown-table@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== markdown-table@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz" integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== dependencies: repeat-string "^1.0.0" markdownlint-cli2-formatter-default@0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz#5aecd6e576ad18801b76e58bbbaf0e916c583ab8" + resolved "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz" integrity sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw== markdownlint-cli2@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.4.0.tgz#9e29150278fd3f1fe31a05fc46bd95d2370e8758" + resolved "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.4.0.tgz" integrity sha512-EcwP5tAbyzzL3ACI0L16LqbNctmh8wNX56T+aVvIxWyTAkwbYNx2V7IheRkXS3mE7R/pnaApZ/RSXcXuzRVPjg== dependencies: globby "12.1.0" @@ -18014,26 +18044,26 @@ markdownlint-cli2@0.4.0: markdownlint-rule-helpers@0.16.0: version "0.16.0" - resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz#c327f72782bd2b9475127a240508231f0413a25e" + resolved "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz" integrity sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w== markdownlint@0.25.1: version "0.25.1" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.25.1.tgz#df04536607ebeeda5ccd5e4f38138823ed623788" + resolved "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz" integrity sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g== dependencies: markdown-it "12.3.2" markdownlint@^0.24.0: version "0.24.0" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.24.0.tgz#224b53f671367a237d40c8be1745c7be9a322671" + resolved "https://registry.npmjs.org/markdownlint/-/markdownlint-0.24.0.tgz" integrity sha512-OJIGsGFV/rC9irI5E1FMy6v9hdACSwaa+EN3224Y5KG8zj2EYzdHOw0pOJovIYmjNfEZ9BtxUY4P7uYHTSNnbQ== dependencies: markdown-it "12.2.0" marked-terminal@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.3.0.tgz#25ce0c0299285998c7636beaefc87055341ba1bd" + resolved "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.3.0.tgz" integrity sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A== dependencies: ansi-escapes "^3.1.0" @@ -18045,32 +18075,32 @@ marked-terminal@^3.3.0: marked@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + resolved "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== marked@^4.0.16: version "4.2.5" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.5.tgz#979813dfc1252cc123a79b71b095759a32f42a5d" + resolved "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz" integrity sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ== match-all@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + resolved "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz" integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== mcl-wasm@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-1.0.3.tgz#b056c655270c3a5e0473489ceb9e55b3de924998" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.0.3.tgz" integrity sha512-L8hexPDw02JEXscEm4pB2rvfAYRc4HIsssxcj+I1AGC4/LYFy9GyrmCgFC+CzxKtxuRQcuBi1RLw74MAzZ5V2Q== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -18079,7 +18109,7 @@ md5.js@^1.3.4: md5@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -18088,7 +18118,7 @@ md5@^2.3.0: mdast-util-find-and-replace@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz" integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== dependencies: escape-string-regexp "^4.0.0" @@ -18097,7 +18127,7 @@ mdast-util-find-and-replace@^1.1.0: mdast-util-footnote@^0.1.0: version "0.1.7" - resolved "https://registry.yarnpkg.com/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz#4b226caeab4613a3362c144c94af0fdd6f7e0ef0" + resolved "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz" integrity sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w== dependencies: mdast-util-to-markdown "^0.6.0" @@ -18105,7 +18135,7 @@ mdast-util-footnote@^0.1.0: mdast-util-from-markdown@^0.8.0: version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz" integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== dependencies: "@types/mdast" "^3.0.0" @@ -18116,14 +18146,14 @@ mdast-util-from-markdown@^0.8.0: mdast-util-frontmatter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz#8bd5cd55e236c03e204a036f7372ebe9e6748240" + resolved "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz" integrity sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ== dependencies: micromark-extension-frontmatter "^0.2.0" mdast-util-gfm-autolink-literal@^0.1.0, mdast-util-gfm-autolink-literal@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz" integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== dependencies: ccount "^1.0.0" @@ -18132,14 +18162,14 @@ mdast-util-gfm-autolink-literal@^0.1.0, mdast-util-gfm-autolink-literal@^0.1.3: mdast-util-gfm-strikethrough@^0.2.0: version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz" integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== dependencies: mdast-util-to-markdown "^0.6.0" mdast-util-gfm-table@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz" integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== dependencies: markdown-table "^2.0.0" @@ -18147,14 +18177,14 @@ mdast-util-gfm-table@^0.1.0: mdast-util-gfm-task-list-item@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz" integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== dependencies: mdast-util-to-markdown "~0.6.0" mdast-util-gfm@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz" integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== dependencies: mdast-util-gfm-autolink-literal "^0.1.0" @@ -18165,7 +18195,7 @@ mdast-util-gfm@^0.1.0: mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz" integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== dependencies: "@types/unist" "^2.0.0" @@ -18177,32 +18207,32 @@ mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-mark mdast-util-to-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== mdurl@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memdown@^1.0.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + resolved "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz" integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== dependencies: abstract-leveldown "~2.7.1" @@ -18214,7 +18244,7 @@ memdown@^1.0.0: memdown@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== dependencies: abstract-leveldown "~6.2.1" @@ -18226,7 +18256,7 @@ memdown@^5.0.0: memdown@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" + resolved "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz" integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== dependencies: abstract-leveldown "~5.0.0" @@ -18238,12 +18268,12 @@ memdown@~3.0.0: memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== memory-fs@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== dependencies: errno "^0.1.3" @@ -18251,7 +18281,7 @@ memory-fs@^0.4.1: memory-fs@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" @@ -18259,7 +18289,7 @@ memory-fs@^0.5.0: memory-level@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: abstract-level "^1.0.0" @@ -18268,12 +18298,12 @@ memory-level@^1.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== meow@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + resolved "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz" integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== dependencies: "@types/minimist" "^1.2.0" @@ -18290,7 +18320,7 @@ meow@^6.0.0: meow@^8.0.0: version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" @@ -18307,7 +18337,7 @@ meow@^8.0.0: merge-deep@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + resolved "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz" integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== dependencies: arr-union "^3.1.0" @@ -18316,22 +18346,22 @@ merge-deep@^3.0.2: merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== merkle-patricia-tree@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz" integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== dependencies: async "^2.6.1" @@ -18344,7 +18374,7 @@ merkle-patricia-tree@3.0.0: merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== dependencies: async "^1.4.2" @@ -18358,7 +18388,7 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: merkle-patricia-tree@^4.0.0: version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== dependencies: "@types/levelup" "^4.3.0" @@ -18370,7 +18400,7 @@ merkle-patricia-tree@^4.0.0: merkletreejs@^0.2.18, merkletreejs@^0.2.27: version "0.2.32" - resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + resolved "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz" integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== dependencies: bignumber.js "^9.0.1" @@ -18381,64 +18411,64 @@ merkletreejs@^0.2.18, merkletreejs@^0.2.27: methods@^1.1.2, methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== microevent.ts@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + resolved "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== micromark-extension-footnote@^0.3.0: version "0.3.2" - resolved "https://registry.yarnpkg.com/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz#129b74ef4920ce96719b2c06102ee7abb2b88a20" + resolved "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz" integrity sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ== dependencies: micromark "~2.11.0" micromark-extension-frontmatter@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz#61b8e92e9213e1d3c13f5a59e7862f5ca98dfa53" + resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz" integrity sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A== dependencies: fault "^1.0.0" micromark-extension-gfm-autolink-literal@~0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz" integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== dependencies: micromark "~2.11.3" micromark-extension-gfm-strikethrough@~0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz" integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== dependencies: micromark "~2.11.0" micromark-extension-gfm-table@~0.4.0: version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz" integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== dependencies: micromark "~2.11.0" micromark-extension-gfm-tagfilter@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz" integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== micromark-extension-gfm-task-list-item@~0.3.0: version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz" integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== dependencies: micromark "~2.11.0" micromark-extension-gfm@^0.3.0: version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz" integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== dependencies: micromark "~2.11.0" @@ -18450,7 +18480,7 @@ micromark-extension-gfm@^0.3.0: micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + resolved "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz" integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== dependencies: debug "^4.0.0" @@ -18458,7 +18488,7 @@ micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: micromatch@4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -18466,7 +18496,7 @@ micromatch@4.0.4: micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -18485,7 +18515,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -18493,7 +18523,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -18501,78 +18531,78 @@ miller-rabin@^4.0.0: mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-db@~1.33.0: version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== mime-types@2.1.18: version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@2.6.0, mime@^2.4.4: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mimic-response@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== min-document@^2.19.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz" integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== dependencies: loader-utils "^1.1.0" @@ -18582,45 +18612,45 @@ mini-css-extract-plugin@0.9.0: minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== "minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" minimatch@^5.0.1, minimatch@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== dependencies: brace-expansion "^2.0.1" minimist-options@4.1.0, minimist-options@^4.0.2: version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" @@ -18629,19 +18659,19 @@ minimist-options@4.1.0, minimist-options@^4.0.2: minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.6: version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== dependencies: minipass "^3.1.0" @@ -18652,14 +18682,14 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-json-stream@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz" integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== dependencies: jsonparse "^1.3.1" @@ -18667,21 +18697,21 @@ minipass-json-stream@^1.0.1: minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass-sized@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" @@ -18689,28 +18719,28 @@ minipass@^2.6.0, minipass@^2.9.0: minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz" integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== dependencies: yallist "^4.0.0" minizlib@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: minipass "^2.9.0" minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -18718,7 +18748,7 @@ minizlib@^2.0.0, minizlib@^2.1.1: mississippi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" @@ -18734,7 +18764,7 @@ mississippi@^3.0.0: mixin-deep@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" @@ -18742,7 +18772,7 @@ mixin-deep@^1.2.0: mixin-object@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + resolved "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz" integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== dependencies: for-in "^0.1.3" @@ -18750,17 +18780,17 @@ mixin-object@^2.0.1: mixme@^0.5.1: version "0.5.4" - resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.4.tgz#8cb3bd0cd32a513c161bf1ca99d143f0bcf2eff3" + resolved "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz" integrity sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mkdirp-infer-owner@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz" integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== dependencies: chownr "^2.0.0" @@ -18769,40 +18799,40 @@ mkdirp-infer-owner@^2.0.0: mkdirp-promise@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + resolved "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz" integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== dependencies: mkdirp "*" mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" mocha-junit-reporter@^2.0.2: version "2.2.0" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz#2663aaf25a98989ac9080c92b19e54209e539f67" + resolved "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz" integrity sha512-W83Ddf94nfLiTBl24aS8IVyFvO8aRDLlCvb+cKb/VEaN5dEbcqu3CXiTe8MQK2DvzS7oKE1RsFTxzN302GGbDQ== dependencies: debug "^4.3.4" @@ -18813,7 +18843,7 @@ mocha-junit-reporter@^2.0.2: mocha-multi-reporters@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz#c73486bed5519e1d59c9ce39ac7a9792600e5676" + resolved "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz" integrity sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg== dependencies: debug "^4.1.1" @@ -18821,7 +18851,7 @@ mocha-multi-reporters@^1.5.1: mocha@^10.0.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: ansi-colors "4.1.1" @@ -18848,7 +18878,7 @@ mocha@^10.0.0: mocha@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" @@ -18878,7 +18908,7 @@ mocha@^7.1.1: mocha@^8.3.1, mocha@^8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + resolved "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: "@ungap/promise-all-settled" "1.1.2" @@ -18909,22 +18939,22 @@ mocha@^8.3.1, mocha@^8.4.0: mock-fs@^4.1.0: version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + resolved "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== modify-values@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== morgan@^1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== dependencies: basic-auth "~2.0.1" @@ -18935,7 +18965,7 @@ morgan@^1.10.0: move-concurrently@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== dependencies: aproba "^1.1.1" @@ -18947,32 +18977,32 @@ move-concurrently@^1.0.1: mri@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" + resolved "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz" integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multibase@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz" integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== dependencies: base-x "^3.0.8" @@ -18980,7 +19010,7 @@ multibase@^0.7.0: multibase@~0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz" integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== dependencies: base-x "^3.0.8" @@ -18988,12 +19018,12 @@ multibase@~0.6.0: multicast-dns-service-types@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== multicast-dns@^6.0.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" @@ -19001,14 +19031,14 @@ multicast-dns@^6.0.1: multicodec@^0.5.5: version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz" integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== dependencies: varint "^5.0.0" multicodec@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz" integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== dependencies: buffer "^5.6.0" @@ -19016,7 +19046,7 @@ multicodec@^1.0.0: multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + resolved "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz" integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== dependencies: buffer "^5.5.0" @@ -19025,12 +19055,12 @@ multihashes@^0.4.15, multihashes@~0.4.15: multimap@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" + resolved "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== multimatch@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== dependencies: "@types/minimatch" "^3.0.3" @@ -19041,7 +19071,7 @@ multimatch@^5.0.0: murmur-128@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + resolved "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz" integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== dependencies: encode-utf8 "^1.0.2" @@ -19050,17 +19080,17 @@ murmur-128@^0.2.1: mute-stream@0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== mysql@^2.18.1: version "2.18.1" - resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" + resolved "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz" integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== dependencies: bignumber.js "9.0.0" @@ -19070,37 +19100,37 @@ mysql@^2.18.1: nan@^2.12.1, nan@^2.14.0: version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nano-base32@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" + resolved "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz" integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== nano-json-stream-parser@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== nanoid@3.1.20: version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== nanoid@3.3.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== nanomatch@^1.2.9: version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -19117,47 +19147,47 @@ nanomatch@^1.2.9: napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== napi-macros@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3, negotiator@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^5.1.2: version "5.1.4" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" + resolved "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz" integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== dependencies: "@sinonjs/commons" "^2.0.0" @@ -19168,14 +19198,14 @@ nise@^5.1.2: no-case@^2.2.0, no-case@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -19183,36 +19213,36 @@ no-case@^3.0.4: node-abi@^2.18.0, node-abi@^2.21.0, node-abi@^2.7.0: version "2.30.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz" integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== dependencies: semver "^5.4.1" node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-addon-api@^3.0.2: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-addon-api@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== node-emoji@^1.10.0, node-emoji@^1.4.1: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" node-environment-flags@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" @@ -19220,26 +19250,26 @@ node-environment-flags@1.0.6: node-fetch@2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-fetch@^2.6.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" node-fetch@~1.7.1: version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" @@ -19247,27 +19277,27 @@ node-fetch@~1.7.1: node-forge@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-forge@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp-build@~4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz" integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== node-gyp@^5.0.2: version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz" integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== dependencies: env-paths "^2.2.0" @@ -19284,7 +19314,7 @@ node-gyp@^5.0.2: node-gyp@^7.1.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz" integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== dependencies: env-paths "^2.2.0" @@ -19300,7 +19330,7 @@ node-gyp@^7.1.0: node-hid@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-1.3.0.tgz#346a468505cee13d69ccd760052cbaf749f66a41" + resolved "https://registry.npmjs.org/node-hid/-/node-hid-1.3.0.tgz" integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g== dependencies: bindings "^1.5.0" @@ -19310,7 +19340,7 @@ node-hid@1.3.0: node-hid@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.1.tgz#f83c8aa0bb4e6758b5f7383542477da93f67359d" + resolved "https://registry.npmjs.org/node-hid/-/node-hid-2.1.1.tgz" integrity sha512-Skzhqow7hyLZU93eIPthM9yjot9lszg9xrKxESleEs05V2NcbUptZc5HFqzjOkSmL0sFlZFr3kmvaYebx06wrw== dependencies: bindings "^1.5.0" @@ -19319,12 +19349,12 @@ node-hid@2.1.1: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-libs-browser@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" @@ -19353,7 +19383,7 @@ node-libs-browser@^2.2.1: node-notifier@^5.4.2: version "5.4.5" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz" integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== dependencies: growly "^1.3.0" @@ -19364,39 +19394,39 @@ node-notifier@^5.4.2: node-preload@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: process-on-spawn "^1.0.0" node-releases@^1.1.52: version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== node-releases@^2.0.6: version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz" integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== nofilter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== noms@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + resolved "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz" integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== dependencies: inherits "^2.0.1" @@ -19404,19 +19434,19 @@ noms@0.0.0: noop-logger@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + resolved "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz" integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== nopt@3.x: version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" nopt@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" @@ -19424,14 +19454,14 @@ nopt@^4.0.1: nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -19441,7 +19471,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -19451,24 +19481,24 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: normalize-path@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== dependencies: object-assign "^4.0.1" @@ -19478,36 +19508,36 @@ normalize-url@1.9.1: normalize-url@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== normalize-url@^4.1.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== normalize-url@^6.0.1, normalize-url@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-bundled@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" npm-install-checks@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz" integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== dependencies: semver "^7.1.1" npm-lifecycle@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" + resolved "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz" integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== dependencies: byline "^5.0.0" @@ -19521,12 +19551,12 @@ npm-lifecycle@^3.1.5: npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz" integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== dependencies: hosted-git-info "^4.0.1" @@ -19535,7 +19565,7 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-pack npm-packlist@^2.1.4: version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz" integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== dependencies: glob "^7.1.6" @@ -19545,7 +19575,7 @@ npm-packlist@^2.1.4: npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz" integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== dependencies: npm-install-checks "^4.0.0" @@ -19555,7 +19585,7 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: npm-registry-fetch@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz" integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== dependencies: make-fetch-happen "^9.0.1" @@ -19567,7 +19597,7 @@ npm-registry-fetch@^11.0.0: npm-registry-fetch@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz" integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== dependencies: "@npmcli/ci-detect" "^1.0.0" @@ -19581,21 +19611,21 @@ npm-registry-fetch@^9.0.0: npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" @@ -19605,31 +19635,31 @@ npmlog@^4.0.1, npmlog@^4.1.2: nth-check@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== number-to-bn@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" @@ -19637,12 +19667,12 @@ number-to-bn@1.7.0: nwsapi@^2.0.7, nwsapi@^2.1.3: version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== nyc@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" @@ -19675,17 +19705,17 @@ nyc@^15.1.0: oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" @@ -19694,17 +19724,17 @@ object-copy@^0.1.0: object-hash@^2.0.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-inspect@^1.12.2, object-inspect@^1.9.0, object-inspect@~1.12.2: version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -19712,24 +19742,24 @@ object-is@^1.0.1, object-is@^1.1.5: object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-keys@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" object.assign@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" @@ -19739,7 +19769,7 @@ object.assign@4.1.0: object.assign@^4.1.0, object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -19749,7 +19779,7 @@ object.assign@^4.1.0, object.assign@^4.1.3, object.assign@^4.1.4: object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" @@ -19758,7 +19788,7 @@ object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.6: object.fromentries@^2.0.2, object.fromentries@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" @@ -19767,7 +19797,7 @@ object.fromentries@^2.0.2, object.fromentries@^2.0.6: object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz" integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== dependencies: array.prototype.reduce "^1.0.5" @@ -19777,7 +19807,7 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0 object.hasown@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" @@ -19785,14 +19815,14 @@ object.hasown@^1.1.2: object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.5, object.values@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" @@ -19801,76 +19831,76 @@ object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.5, object.values@ obliterator@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== oboe@2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz" integrity sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ== dependencies: http-https "^1.0.0" oboe@2.1.5: version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz" integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== dependencies: http-https "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-exit-leak-free@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" + resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz" integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== on-finished@2.4.1, on-finished@^2.3.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== dependencies: ee-first "1.1.1" on-headers@~1.0.1, on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: mimic-fn "^1.0.0" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^7.0.2, open@^7.4.2: version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: is-docker "^2.0.0" @@ -19878,14 +19908,14 @@ open@^7.0.2, open@^7.4.2: opn@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + resolved "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: is-wsl "^1.1.0" optimism@^0.16.1: version "0.16.2" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" + resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.2.tgz" integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ== dependencies: "@wry/context" "^0.7.0" @@ -19893,7 +19923,7 @@ optimism@^0.16.1: optimize-css-assets-webpack-plugin@5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + resolved "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz" integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== dependencies: cssnano "^4.1.10" @@ -19901,7 +19931,7 @@ optimize-css-assets-webpack-plugin@5.0.3: optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -19913,7 +19943,7 @@ optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -19925,34 +19955,34 @@ optionator@^0.9.1: ordinal@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== os-browserify@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== dependencies: lcid "^1.0.0" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" @@ -19960,12 +19990,12 @@ osenv@^0.1.4: outdent@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + resolved "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz" integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== ow@^0.28.1: version "0.28.2" - resolved "https://registry.yarnpkg.com/ow/-/ow-0.28.2.tgz#782b28102124e665c49ec7725e2066a129acf6bf" + resolved "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz" integrity sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q== dependencies: "@sindresorhus/is" "^4.2.0" @@ -19976,119 +20006,119 @@ ow@^0.28.1: p-cancelable@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== p-cancelable@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== p-cancelable@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-each-series@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz" integrity sha512-J/e9xiZZQNrt+958FFzJ+auItsBGq+UrQ7nE89AUP7UOTtjHnkISANXLdayhVzh538UnLMCSlf13lFfRIAKQOA== dependencies: p-reduce "^1.0.0" p-filter@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz" integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== dependencies: p-map "^2.0.0" p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map-series@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== p-map@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-map@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: aggregate-error "^3.0.0" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-pipe@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz" integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== p-queue@^6.6.2: version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: eventemitter3 "^4.0.4" @@ -20096,48 +20126,48 @@ p-queue@^6.6.2: p-reduce@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz" integrity sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ== p-reduce@^2.0.0, p-reduce@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== p-retry@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz" integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== dependencies: retry "^0.12.0" p-timeout@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== p-waterfall@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz" integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== dependencies: p-reduce "^2.0.0" package-hash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" @@ -20147,7 +20177,7 @@ package-hash@^4.0.0: pacote@^11.2.6: version "11.3.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" + resolved "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz" integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== dependencies: "@npmcli/git" "^2.1.0" @@ -20172,12 +20202,12 @@ pacote@^11.2.6: pako@~1.0.5: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: cyclist "^1.0.1" @@ -20186,14 +20216,14 @@ parallel-transform@^1.1.0: param-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + resolved "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== dependencies: no-case "^2.2.0" param-case@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -20201,14 +20231,14 @@ param-case@^3.0.3: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: asn1.js "^5.2.0" @@ -20219,12 +20249,12 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-cache-control@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== parse-entities@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== dependencies: character-entities "^1.0.0" @@ -20236,19 +20266,19 @@ parse-entities@^2.0.0: parse-headers@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== parse-json@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -20256,7 +20286,7 @@ parse-json@^4.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -20266,7 +20296,7 @@ parse-json@^5.0.0: parse-path@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-4.0.4.tgz" integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== dependencies: is-ssh "^1.3.0" @@ -20276,7 +20306,7 @@ parse-path@^4.0.0: parse-url@^6.0.0: version "6.0.5" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.5.tgz#4acab8982cef1846a0f8675fa686cef24b2f6f9b" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-6.0.5.tgz" integrity sha512-e35AeLTSIlkw/5GFq70IN7po8fmDUjpDPY1rIK+VubRfsUvBonjQ+PBZG+vWMACnQSmNlvl524IucoDmcioMxA== dependencies: is-ssh "^1.3.0" @@ -20286,7 +20316,7 @@ parse-url@^6.0.0: parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" @@ -20294,29 +20324,29 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + resolved "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz" integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== dependencies: camel-case "^3.0.0" @@ -20324,7 +20354,7 @@ pascal-case@^2.0.0: pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -20332,12 +20362,12 @@ pascal-case@^3.1.2: pascalcase@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== patch-package@6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz" integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -20355,7 +20385,7 @@ patch-package@6.2.2: patch-package@^6.2.2, patch-package@^6.4.7: version "6.5.1" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz" integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -20375,88 +20405,88 @@ patch-package@^6.2.2, patch-package@^6.4.7: path-browserify@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-browserify@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + resolved "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz" integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== dependencies: no-case "^2.2.0" path-dirname@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== path-exists@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@1.0.2, path-is-inside@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== path-to-regexp@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" path-type@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== dependencies: graceful-fs "^4.1.2" @@ -20465,38 +20495,38 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== dependencies: pify "^2.0.0" path-type@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pause-stream@^0.0.11: version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== dependencies: through "~2.3" pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -20507,59 +20537,59 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0, pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pino-abstract-transport@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz" integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== dependencies: readable-stream "^4.0.0" @@ -20567,14 +20597,14 @@ pino-abstract-transport@^1.0.0: pino-multi-stream@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/pino-multi-stream/-/pino-multi-stream-5.3.0.tgz#2816ec4422c7e37e676a210a1705c7155506afd4" + resolved "https://registry.npmjs.org/pino-multi-stream/-/pino-multi-stream-5.3.0.tgz" integrity sha512-4fAGCRll18I+JmoAbxDvU9zc5sera/3c+VgTtUdoNMOZ/VSHB+HMAYtixKpeRmZTDHDDdE2rtwjVkuwWB8mYQA== dependencies: pino "^6.0.0" pino-pretty@*: version "9.1.1" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-9.1.1.tgz#e7d64c1db98266ca428ab56567b844ba780cd0e1" + resolved "https://registry.npmjs.org/pino-pretty/-/pino-pretty-9.1.1.tgz" integrity sha512-iJrnjgR4FWQIXZkUF48oNgoRI9BpyMhaEmihonHeCnZ6F50ZHAS4YGfGBT/ZVNsPmd+hzkIPGzjKdY08+/yAXw== dependencies: colorette "^2.0.7" @@ -20594,7 +20624,7 @@ pino-pretty@*: pino-pretty@^5.0.0: version "5.1.3" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-5.1.3.tgz#c4085093d1dffda359ab52731f87d96f7f832dc9" + resolved "https://registry.npmjs.org/pino-pretty/-/pino-pretty-5.1.3.tgz" integrity sha512-Zj+0TVdYKkAAIx9EUCL5e4TttwgsaFvJh2ceIMQeFCY8ak9tseEZQGSgpvyjEj1/iIVGIh5tdhkGEQWSMILKHA== dependencies: "@hapi/bourne" "^2.0.0" @@ -20612,7 +20642,7 @@ pino-pretty@^5.0.0: pino-sentry@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/pino-sentry/-/pino-sentry-0.14.0.tgz#171d580f9e530d5649bd2d426a55a9bde5d07ff6" + resolved "https://registry.npmjs.org/pino-sentry/-/pino-sentry-0.14.0.tgz" integrity sha512-UwX0zgJk2ToA1c1f6QpJ7OlWEwxMFt5apJgCYNhhBbuuJuPDmqEzDRMrWKcbF3HKFuupoaNWK6S3o4XXPmI9Rw== dependencies: "@sentry/node" "^6.2.5||^7.1.1" @@ -20623,17 +20653,17 @@ pino-sentry@^0.14.0: pino-std-serializers@*: version "6.1.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz#307490fd426eefc95e06067e85d8558603e8e844" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz" integrity sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g== pino-std-serializers@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz" integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== pino@^6.0.0, pino@^6.11.3: version "6.14.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78" + resolved "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz" integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg== dependencies: fast-redact "^3.0.0" @@ -20646,69 +20676,69 @@ pino@^6.0.0, pino@^6.11.3: pirates@^4.0.1: version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pkg-dir@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== dependencies: find-up "^1.0.0" pkg-dir@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: find-up "^3.0.0" pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" please-upgrade-node@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== dependencies: semver-compare "^1.0.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== pn@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== pngjs@^3.3.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== pnp-webpack-plugin@1.6.4: version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== dependencies: ts-pnp "^1.1.6" portfinder@^1.0.26: version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz" integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: async "^2.6.4" @@ -20717,12 +20747,12 @@ portfinder@^1.0.26: posix-character-classes@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-attribute-case-insensitive@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz" integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== dependencies: postcss "^7.0.2" @@ -20730,14 +20760,14 @@ postcss-attribute-case-insensitive@^4.0.1: postcss-browser-comments@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + resolved "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz" integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== dependencies: postcss "^7" postcss-calc@^7.0.1: version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz" integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" @@ -20746,7 +20776,7 @@ postcss-calc@^7.0.1: postcss-color-functional-notation@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz" integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== dependencies: postcss "^7.0.2" @@ -20754,7 +20784,7 @@ postcss-color-functional-notation@^2.0.1: postcss-color-gray@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + resolved "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz" integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -20763,7 +20793,7 @@ postcss-color-gray@^5.0.0: postcss-color-hex-alpha@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz" integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== dependencies: postcss "^7.0.14" @@ -20771,7 +20801,7 @@ postcss-color-hex-alpha@^5.0.3: postcss-color-mod-function@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + resolved "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz" integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -20780,7 +20810,7 @@ postcss-color-mod-function@^3.0.3: postcss-color-rebeccapurple@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz" integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== dependencies: postcss "^7.0.2" @@ -20788,7 +20818,7 @@ postcss-color-rebeccapurple@^4.0.1: postcss-colormin@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz" integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== dependencies: browserslist "^4.0.0" @@ -20799,7 +20829,7 @@ postcss-colormin@^4.0.3: postcss-convert-values@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz" integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== dependencies: postcss "^7.0.0" @@ -20807,14 +20837,14 @@ postcss-convert-values@^4.0.1: postcss-custom-media@^7.0.8: version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz" integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== dependencies: postcss "^7.0.14" postcss-custom-properties@^8.0.11: version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz" integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== dependencies: postcss "^7.0.17" @@ -20822,7 +20852,7 @@ postcss-custom-properties@^8.0.11: postcss-custom-selectors@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz" integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== dependencies: postcss "^7.0.2" @@ -20830,7 +20860,7 @@ postcss-custom-selectors@^5.1.2: postcss-dir-pseudo-class@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz" integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== dependencies: postcss "^7.0.2" @@ -20838,35 +20868,35 @@ postcss-dir-pseudo-class@^5.0.0: postcss-discard-comments@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz" integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== dependencies: postcss "^7.0.0" postcss-discard-duplicates@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz" integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== dependencies: postcss "^7.0.0" postcss-discard-empty@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz" integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== dependencies: postcss "^7.0.0" postcss-discard-overridden@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz" integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== dependencies: postcss "^7.0.0" postcss-double-position-gradients@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz" integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== dependencies: postcss "^7.0.5" @@ -20874,7 +20904,7 @@ postcss-double-position-gradients@^1.0.0: postcss-env-function@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz" integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== dependencies: postcss "^7.0.2" @@ -20882,42 +20912,42 @@ postcss-env-function@^2.0.2: postcss-flexbugs-fixes@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz" integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== dependencies: postcss "^7.0.0" postcss-focus-visible@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz" integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== dependencies: postcss "^7.0.2" postcss-focus-within@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz" integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== dependencies: postcss "^7.0.2" postcss-font-variant@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz" integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: postcss "^7.0.2" postcss-gap-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz" integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== dependencies: postcss "^7.0.2" postcss-image-set-function@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz" integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== dependencies: postcss "^7.0.2" @@ -20925,14 +20955,14 @@ postcss-image-set-function@^3.0.1: postcss-initial@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz" integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: postcss "^7.0.2" postcss-lab-function@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz" integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -20941,7 +20971,7 @@ postcss-lab-function@^2.0.1: postcss-load-config@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz" integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" @@ -20949,7 +20979,7 @@ postcss-load-config@^2.0.0: postcss-loader@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz" integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== dependencies: loader-utils "^1.1.0" @@ -20959,21 +20989,21 @@ postcss-loader@3.0.0: postcss-logical@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz" integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== dependencies: postcss "^7.0.2" postcss-media-minmax@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz" integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== dependencies: postcss "^7.0.2" postcss-merge-longhand@^4.0.11: version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz" integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== dependencies: css-color-names "0.0.4" @@ -20983,7 +21013,7 @@ postcss-merge-longhand@^4.0.11: postcss-merge-rules@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz" integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== dependencies: browserslist "^4.0.0" @@ -20995,7 +21025,7 @@ postcss-merge-rules@^4.0.3: postcss-minify-font-values@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz" integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== dependencies: postcss "^7.0.0" @@ -21003,7 +21033,7 @@ postcss-minify-font-values@^4.0.2: postcss-minify-gradients@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz" integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -21013,7 +21043,7 @@ postcss-minify-gradients@^4.0.2: postcss-minify-params@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz" integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== dependencies: alphanum-sort "^1.0.0" @@ -21025,7 +21055,7 @@ postcss-minify-params@^4.0.2: postcss-minify-selectors@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz" integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== dependencies: alphanum-sort "^1.0.0" @@ -21035,14 +21065,14 @@ postcss-minify-selectors@^4.0.2: postcss-modules-extract-imports@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: postcss "^7.0.5" postcss-modules-local-by-default@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" @@ -21052,7 +21082,7 @@ postcss-modules-local-by-default@^3.0.2: postcss-modules-scope@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" @@ -21060,7 +21090,7 @@ postcss-modules-scope@^2.1.1: postcss-modules-values@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== dependencies: icss-utils "^4.0.0" @@ -21068,21 +21098,21 @@ postcss-modules-values@^3.0.0: postcss-nesting@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz" integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== dependencies: postcss "^7.0.2" postcss-normalize-charset@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz" integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== dependencies: postcss "^7.0.0" postcss-normalize-display-values@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz" integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== dependencies: cssnano-util-get-match "^4.0.0" @@ -21091,7 +21121,7 @@ postcss-normalize-display-values@^4.0.2: postcss-normalize-positions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz" integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -21101,7 +21131,7 @@ postcss-normalize-positions@^4.0.2: postcss-normalize-repeat-style@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz" integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -21111,7 +21141,7 @@ postcss-normalize-repeat-style@^4.0.2: postcss-normalize-string@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz" integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== dependencies: has "^1.0.0" @@ -21120,7 +21150,7 @@ postcss-normalize-string@^4.0.2: postcss-normalize-timing-functions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz" integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== dependencies: cssnano-util-get-match "^4.0.0" @@ -21129,7 +21159,7 @@ postcss-normalize-timing-functions@^4.0.2: postcss-normalize-unicode@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz" integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== dependencies: browserslist "^4.0.0" @@ -21138,7 +21168,7 @@ postcss-normalize-unicode@^4.0.1: postcss-normalize-url@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz" integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== dependencies: is-absolute-url "^2.0.0" @@ -21148,7 +21178,7 @@ postcss-normalize-url@^4.0.1: postcss-normalize-whitespace@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz" integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== dependencies: postcss "^7.0.0" @@ -21156,7 +21186,7 @@ postcss-normalize-whitespace@^4.0.2: postcss-normalize@8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz" integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== dependencies: "@csstools/normalize.css" "^10.1.0" @@ -21167,7 +21197,7 @@ postcss-normalize@8.0.1: postcss-ordered-values@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz" integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -21176,21 +21206,21 @@ postcss-ordered-values@^4.1.2: postcss-overflow-shorthand@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz" integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== dependencies: postcss "^7.0.2" postcss-page-break@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz" integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== dependencies: postcss "^7.0.2" postcss-place@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz" integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== dependencies: postcss "^7.0.2" @@ -21198,7 +21228,7 @@ postcss-place@^4.0.1: postcss-preset-env@6.7.0: version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz" integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== dependencies: autoprefixer "^9.6.1" @@ -21241,7 +21271,7 @@ postcss-preset-env@6.7.0: postcss-pseudo-class-any-link@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz" integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== dependencies: postcss "^7.0.2" @@ -21249,7 +21279,7 @@ postcss-pseudo-class-any-link@^6.0.0: postcss-reduce-initial@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz" integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== dependencies: browserslist "^4.0.0" @@ -21259,7 +21289,7 @@ postcss-reduce-initial@^4.0.3: postcss-reduce-transforms@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz" integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== dependencies: cssnano-util-get-match "^4.0.0" @@ -21269,21 +21299,21 @@ postcss-reduce-transforms@^4.0.2: postcss-replace-overflow-wrap@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz" integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== dependencies: postcss "^7.0.2" postcss-safe-parser@4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz" integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== dependencies: postcss "^7.0.0" postcss-selector-matches@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + resolved "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz" integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== dependencies: balanced-match "^1.0.0" @@ -21291,7 +21321,7 @@ postcss-selector-matches@^4.0.0: postcss-selector-not@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz" integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== dependencies: balanced-match "^1.0.0" @@ -21299,7 +21329,7 @@ postcss-selector-not@^4.0.0: postcss-selector-parser@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz" integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== dependencies: dot-prop "^5.2.0" @@ -21308,7 +21338,7 @@ postcss-selector-parser@^3.0.0: postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz" integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== dependencies: cssesc "^2.0.0" @@ -21317,7 +21347,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" @@ -21325,7 +21355,7 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: postcss-svgo@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz" integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: postcss "^7.0.0" @@ -21334,7 +21364,7 @@ postcss-svgo@^4.0.3: postcss-unique-selectors@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz" integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== dependencies: alphanum-sort "^1.0.0" @@ -21343,17 +21373,17 @@ postcss-unique-selectors@^4.0.1: postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + resolved "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz" integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== dependencies: flatten "^1.0.2" @@ -21362,7 +21392,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: postcss@7.0.21: version "7.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz" integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== dependencies: chalk "^2.4.2" @@ -21371,7 +21401,7 @@ postcss@7.0.21: postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: picocolors "^0.2.1" @@ -21379,7 +21409,7 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po postcss@^8.1.10: version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" @@ -21388,17 +21418,17 @@ postcss@^8.1.10: postinstall-postinstall@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + resolved "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== preact@10.4.1: version "10.4.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + resolved "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz" integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== prebuild-install@^5.3.4: version "5.3.6" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz" integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg== dependencies: detect-libc "^1.0.3" @@ -21419,7 +21449,7 @@ prebuild-install@^5.3.4: prebuild-install@^6.0.0: version "6.1.4" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz" integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== dependencies: detect-libc "^1.0.3" @@ -21438,12 +21468,12 @@ prebuild-install@^6.0.0: precond@0.2: version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + resolved "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== preferred-pm@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" + resolved "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz" integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== dependencies: find-up "^5.0.0" @@ -21453,34 +21483,34 @@ preferred-pm@^3.0.0: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== prepend-http@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier-plugin-solidity@^1.0.0-beta.13, prettier-plugin-solidity@^1.0.0-beta.18: version "1.1.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz#4d3375b85f97812ffcbe48d5a8b3fe914d69c91f" + resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz" integrity sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg== dependencies: "@solidity-parser/parser" "^0.14.5" @@ -21489,22 +21519,22 @@ prettier-plugin-solidity@^1.0.0-beta.13, prettier-plugin-solidity@^1.0.0-beta.18 prettier@^1.14.2, prettier@^1.14.3: version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== prettier@^2.1.2, prettier@^2.2.1, prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.0: version "2.8.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.2.tgz#c4ea1b5b454d7c4b59966db2e06ed7eec5dfd160" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.2.tgz" integrity sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw== pretty-bytes@^5.1.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== pretty-error@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz" integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: lodash "^4.17.20" @@ -21512,7 +21542,7 @@ pretty-error@^2.1.1: pretty-format@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: "@jest/types" "^24.9.0" @@ -21522,7 +21552,7 @@ pretty-format@^24.9.0: pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -21531,7 +21561,7 @@ pretty-format@^27.0.2: pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: "@jest/schemas" "^29.4.3" @@ -21540,58 +21570,58 @@ pretty-format@^29.0.0, pretty-format@^29.5.0: private@^0.1.6, private@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== dependencies: fromentries "^1.2.0" process-warning@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prom-client@^13.1.0: version "13.2.0" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.2.0.tgz#99d13357912dd400f8911b77df19f7b328a93e92" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz" integrity sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ== dependencies: tdigest "^0.1.1" prom-client@^14.0.1: version "14.1.1" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-14.1.1.tgz#e9bebef0e2269bfde22a322f4ca803cb52b4a0c0" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz" integrity sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw== dependencies: tdigest "^0.1.1" promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" @@ -21599,7 +21629,7 @@ promise-retry@^2.0.1: promise-to-callback@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + resolved "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz" integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== dependencies: is-fn "^1.0.0" @@ -21607,14 +21637,14 @@ promise-to-callback@^1.0.0: promise@^8.0.0, promise@^8.0.2, promise@^8.0.3: version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -21622,14 +21652,14 @@ prompts@^2.0.1: promzard@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz" integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== dependencies: read "1" prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -21638,22 +21668,22 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: proto-list@~1.2.1: version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== protocols@^1.4.0: version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + resolved "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== protocols@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -21661,22 +21691,22 @@ proxy-addr@~2.0.7: prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -21688,17 +21718,17 @@ public-encrypt@^4.0.0: pull-cat@^1.1.9: version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" + resolved "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz" integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== pull-defer@^0.2.2: version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" + resolved "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz" integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== pull-level@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" + resolved "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz" integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== dependencies: level-post "^1.0.7" @@ -21711,7 +21741,7 @@ pull-level@^2.0.3: pull-live@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" + resolved "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz" integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== dependencies: pull-cat "^1.1.9" @@ -21719,24 +21749,24 @@ pull-live@^1.0.1: pull-pushable@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" + resolved "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz" integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: version "3.7.0" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" + resolved "https://registry.npmjs.org/pull-stream/-/pull-stream-3.7.0.tgz" integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== pull-window@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" + resolved "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz" integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== dependencies: looper "^2.0.0" pump@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" @@ -21744,7 +21774,7 @@ pump@^2.0.0: pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -21752,7 +21782,7 @@ pump@^3.0.0: pumpify@^1.3.3: version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" @@ -21761,7 +21791,7 @@ pumpify@^1.3.3: pumpify@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz" integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== dependencies: duplexify "^4.1.1" @@ -21770,37 +21800,37 @@ pumpify@^2.0.1: punycode@1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== punycode@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== pure-rand@^5.0.1: version "5.0.5" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.5.tgz#bda2a7f6a1fc0f284d78d78ca5902f26f2ad35cf" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz" integrity sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw== q@^1.1.2, q@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== qrcode@1.4.4: version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + resolved "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz" integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== dependencies: buffer "^5.4.3" @@ -21813,19 +21843,19 @@ qrcode@1.4.4: qs@6.11.0, qs@^6.10.5, qs@^6.11.0, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-ast@^1.0.3: version "1.0.5" - resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.5.tgz#60f60593e8ea085082aaf9f316631a5cc070074a" + resolved "https://registry.npmjs.org/query-ast/-/query-ast-1.0.5.tgz" integrity sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw== dependencies: invariant "2.2.4" @@ -21833,7 +21863,7 @@ query-ast@^1.0.3: query-string@6.13.5: version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + resolved "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz" integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== dependencies: decode-uri-component "^0.2.0" @@ -21842,7 +21872,7 @@ query-string@6.13.5: query-string@^4.1.0: version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== dependencies: object-assign "^4.1.0" @@ -21850,7 +21880,7 @@ query-string@^4.1.0: query-string@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" @@ -21859,7 +21889,7 @@ query-string@^5.0.1: query-string@^6.13.8: version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + resolved "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz" integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== dependencies: decode-uri-component "^0.2.0" @@ -21869,61 +21899,61 @@ query-string@^6.13.8: querystring-es3@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== querystring@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-format-unescaped@^4.0.3: version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== raf@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" random-bytes-seed@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/random-bytes-seed/-/random-bytes-seed-1.0.3.tgz#126f1201dba2ec70cd0784f94a810396cad24a15" + resolved "https://registry.npmjs.org/random-bytes-seed/-/random-bytes-seed-1.0.3.tgz" integrity sha512-O+eniMt8Sj2iAn2q1x5VEirS/XvbtwYcXNDbOAcRtGN+OhC48cmzS5ksf9qEHRVKC1I8A4qzjucNVElddofB0A== randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" @@ -21931,17 +21961,17 @@ randomfill@^1.0.3: range-parser@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.5.1, raw-body@^2.4.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -21951,7 +21981,7 @@ raw-body@2.5.1, raw-body@^2.4.1: rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -21961,7 +21991,7 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: react-app-polyfill@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz" integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== dependencies: core-js "^3.5.0" @@ -21973,12 +22003,12 @@ react-app-polyfill@^1.0.6: react-card-flip@^1.1.5: version "1.2.0" - resolved "https://registry.yarnpkg.com/react-card-flip/-/react-card-flip-1.2.0.tgz#b81b76e2ba18360a66df400b4f776d3ebbbece55" + resolved "https://registry.npmjs.org/react-card-flip/-/react-card-flip-1.2.0.tgz" integrity sha512-5/tbaSBoTTdxV2glail7fr7W7CqNG/4BOm17pNmI1b6TwtRRUrElPdAO4h235MGU2dDwqyWBzO+H8y2Ax6BTpA== react-datepicker@^4.6.0: version "4.8.0" - resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.8.0.tgz#11b8918d085a1ce4781eee4c8e4641b3cd592010" + resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.8.0.tgz" integrity sha512-u69zXGHMpxAa4LeYR83vucQoUCJQ6m/WBsSxmUMu/M8ahTSVMMyiyQzauHgZA2NUr9y0FUgOAix71hGYUb6tvg== dependencies: "@popperjs/core" "^2.9.2" @@ -21990,7 +22020,7 @@ react-datepicker@^4.6.0: react-dev-utils@^10.2.1: version "10.2.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz" integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== dependencies: "@babel/code-frame" "7.8.3" @@ -22020,7 +22050,7 @@ react-dev-utils@^10.2.1: react-dom@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" @@ -22029,52 +22059,52 @@ react-dom@^17.0.2: react-error-overlay@^6.0.7: version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-fast-compare@^3.0.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== react-ga4@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/react-ga4/-/react-ga4-1.4.1.tgz#6ee2a2db115ed235b2f2092bc746b4eeeca9e206" + resolved "https://registry.npmjs.org/react-ga4/-/react-ga4-1.4.1.tgz" integrity sha512-ioBMEIxd4ePw4YtaloTUgqhQGqz5ebDdC4slEpLgy2sLx1LuZBC9iYCwDymTXzcntw6K1dHX183ulP32nNdG7w== react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-multi-carousel@^2.6.5: version "2.8.2" - resolved "https://registry.yarnpkg.com/react-multi-carousel/-/react-multi-carousel-2.8.2.tgz#4bbd7a9656d8e49e081745331593e5500eefdbe4" + resolved "https://registry.npmjs.org/react-multi-carousel/-/react-multi-carousel-2.8.2.tgz" integrity sha512-M9Y7DfAp8bA/r6yexttU6RLA7uyppje4c0ELRuCHZWswH+u7nr0uVP6qHNPjc4XGOEY1MYFOb5nBg7JvoKutuQ== react-onclickoutside@^6.12.0: version "6.12.2" - resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz#8e6cf80c7d17a79f2c908399918158a7b02dda01" + resolved "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz" integrity sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA== react-popper@^2.2.5: version "2.3.0" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + resolved "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz" integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== dependencies: react-fast-compare "^3.0.1" @@ -22082,12 +22112,12 @@ react-popper@^2.2.5: react-property@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/react-property/-/react-property-2.0.0.tgz#2156ba9d85fa4741faf1918b38efc1eae3c6a136" + resolved "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz" integrity sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw== react-redux@^8.0.5: version "8.0.5" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.5.tgz#e5fb8331993a019b8aaf2e167a93d10af469c7bd" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz" integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw== dependencies: "@babel/runtime" "^7.12.1" @@ -22099,14 +22129,14 @@ react-redux@^8.0.5: react-resize-detector@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-7.1.2.tgz#8ef975dd8c3d56f9a5160ac382ef7136dcd2d86c" + resolved "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz" integrity sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw== dependencies: lodash "^4.17.21" react-router-dom@^6.2.1: version "6.6.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.6.2.tgz#bbf1f9b45855b218d22fc2d294b79408a084740a" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.6.2.tgz" integrity sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA== dependencies: "@remix-run/router" "1.2.1" @@ -22114,14 +22144,14 @@ react-router-dom@^6.2.1: react-router@6.6.2: version "6.6.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.6.2.tgz#556f7b56cff7fe32c5c02429fef3fcb2ecd08111" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.6.2.tgz" integrity sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ== dependencies: "@remix-run/router" "1.2.1" react-scripts@^3.4.3: version "3.4.4" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.4.tgz#eef024ed5c566374005e3f509877350ba99d08a7" + resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.4.tgz" integrity sha512-7J7GZyF/QvZkKAZLneiOIhHozvOMHey7hO9cdO9u68jjhGZlI8hDdOm6UyuHofn6Ajc9Uji5I6Psm/nKNuWdyw== dependencies: "@babel/core" "7.9.0" @@ -22181,7 +22211,7 @@ react-scripts@^3.4.3: react-select@^5.2.2: version "5.7.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" + resolved "https://registry.npmjs.org/react-select/-/react-select-5.7.0.tgz" integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== dependencies: "@babel/runtime" "^7.12.0" @@ -22196,7 +22226,7 @@ react-select@^5.2.2: react-smooth@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.1.tgz#74c7309916d6ccca182c4b30c8992f179e6c5a05" + resolved "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.1.tgz" integrity sha512-Own9TA0GPPf3as4vSwFhDouVfXP15ie/wIHklhyKBH5AN6NFtdk0UpHBnonV11BtqDkAWlt40MOUc+5srmW7NA== dependencies: fast-equals "^2.0.0" @@ -22204,7 +22234,7 @@ react-smooth@^2.0.1: react-transition-group@2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: dom-helpers "^3.4.0" @@ -22214,7 +22244,7 @@ react-transition-group@2.9.0: react-transition-group@^4.3.0, react-transition-group@^4.4.5: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -22224,7 +22254,7 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.5: react@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" @@ -22232,12 +22262,12 @@ react@^17.0.2: read-cmd-shim@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz" integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== read-package-json-fast@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== dependencies: json-parse-even-better-errors "^2.3.0" @@ -22245,7 +22275,7 @@ read-package-json-fast@^2.0.1: read-package-json@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz" integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" @@ -22255,7 +22285,7 @@ read-package-json@^2.0.0: read-package-json@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-3.0.1.tgz" integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== dependencies: glob "^7.1.1" @@ -22265,7 +22295,7 @@ read-package-json@^3.0.0: read-package-json@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.2.tgz" integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== dependencies: glob "^7.1.1" @@ -22275,7 +22305,7 @@ read-package-json@^4.1.1: read-package-tree@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + resolved "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz" integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== dependencies: read-package-json "^2.0.0" @@ -22284,7 +22314,7 @@ read-package-tree@^5.3.1: read-pkg-up@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== dependencies: find-up "^1.0.0" @@ -22292,7 +22322,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== dependencies: find-up "^2.0.0" @@ -22300,7 +22330,7 @@ read-pkg-up@^2.0.0: read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" @@ -22308,7 +22338,7 @@ read-pkg-up@^3.0.0: read-pkg-up@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz" integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== dependencies: find-up "^3.0.0" @@ -22316,7 +22346,7 @@ read-pkg-up@^4.0.0: read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" @@ -22325,7 +22355,7 @@ read-pkg-up@^7.0.1: read-pkg@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== dependencies: load-json-file "^1.0.0" @@ -22334,7 +22364,7 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== dependencies: load-json-file "^2.0.0" @@ -22343,7 +22373,7 @@ read-pkg@^2.0.0: read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" @@ -22352,7 +22382,7 @@ read-pkg@^3.0.0: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -22362,7 +22392,7 @@ read-pkg@^5.2.0: read-yaml-file@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz" integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== dependencies: graceful-fs "^4.1.5" @@ -22372,14 +22402,14 @@ read-yaml-file@^1.1.0: read@1, read@~1.0.1: version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== dependencies: mute-stream "~0.0.4" "readable-stream@1 || 2", readable-stream@2.3.7, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -22392,7 +22422,7 @@ read@1, read@~1.0.1: "readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -22401,7 +22431,7 @@ read@1, read@~1.0.1: readable-stream@^1.0.33: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" @@ -22411,7 +22441,7 @@ readable-stream@^1.0.33: readable-stream@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz" integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== dependencies: abort-controller "^3.0.0" @@ -22421,7 +22451,7 @@ readable-stream@^4.0.0: readable-stream@~1.0.15, readable-stream@~1.0.31: version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" @@ -22431,7 +22461,7 @@ readable-stream@~1.0.15, readable-stream@~1.0.31: readdir-scoped-modules@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== dependencies: debuglog "^1.0.1" @@ -22441,7 +22471,7 @@ readdir-scoped-modules@^1.0.0: readdirp@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" @@ -22450,47 +22480,47 @@ readdirp@^2.2.1: readdirp@^3.5.0, readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" readdirp@~3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== dependencies: picomatch "^2.0.4" readdirp@~3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" readline-transform@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/readline-transform/-/readline-transform-1.0.0.tgz#3157f97428acaec0f05a5c1ff2c3120f4e6d904b" + resolved "https://registry.npmjs.org/readline-transform/-/readline-transform-1.0.0.tgz" integrity sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg== realpath-native@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz" integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== dependencies: util.promisify "^1.0.0" recharts-scale@^0.4.4: version "0.4.5" - resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + resolved "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz" integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== dependencies: decimal.js-light "^2.4.1" recharts@^2.1.10: version "2.2.0" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.2.0.tgz#1b8ba0799ff0feb96c87f009cd2ddd8cf5108817" + resolved "https://registry.npmjs.org/recharts/-/recharts-2.2.0.tgz" integrity sha512-/uRJ0oaESGyz//PgAzvrwXEhrKaNha1ELLysEMRklbnsddiVQsSNicP7DWiz8qFcyYXy3BrDqrUjiLiVRTSMtA== dependencies: "@types/d3-interpolate" "^2.0.0" @@ -22510,35 +22540,35 @@ recharts@^2.1.10: rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" rechoir@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" recursive-readdir@2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -22546,14 +22576,14 @@ redent@^3.0.0: redeyed@~2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz" integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== dependencies: esprima "~4.0.0" reduce-css-calc@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz" integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== dependencies: css-unit-converter "^1.1.1" @@ -22561,65 +22591,65 @@ reduce-css-calc@^2.1.8: reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== redux-mock-store@^1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872" + resolved "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz" integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA== dependencies: lodash.isplainobject "^4.0.6" redux-persist@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8" + resolved "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz" integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ== redux-thunk@^2.3.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== redux@^4.0.5: version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" redux@^4.1.2: version "4.2.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz" integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== dependencies: "@babel/runtime" "^7.9.2" regenerate-unicode-properties@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" regenerate@^1.2.1, regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.10.0: version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz" integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" @@ -22628,14 +22658,14 @@ regenerator-transform@^0.10.0: regenerator-transform@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" @@ -22643,17 +22673,17 @@ regex-not@^1.0.0, regex-not@^1.0.2: regex-parser@^2.2.11: version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp-tree@^0.1.23, regexp-tree@^0.1.24, regexp-tree@~0.1.1: version "0.1.24" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" @@ -22662,17 +22692,17 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: regexpp@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0, regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== dependencies: regenerate "^1.2.1" @@ -22681,7 +22711,7 @@ regexpu-core@^2.0.0: regexpu-core@^5.2.1: version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz" integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== dependencies: regenerate "^1.4.2" @@ -22693,12 +22723,12 @@ regexpu-core@^5.2.1: regextras@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217" + resolved "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz" integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ== registry-auth-token@3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz" integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== dependencies: rc "^1.1.6" @@ -22706,50 +22736,50 @@ registry-auth-token@3.3.2: registry-url@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz" integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== dependencies: rc "^1.0.1" regjsgen@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== regjsgen@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== regjsparser@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== dependencies: jsesc "~0.5.0" regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== release-zalgo@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: es6-error "^4.0.1" remark-footnotes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-3.0.0.tgz#5756b56f8464fa7ed80dbba0c966136305d8cb8d" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz" integrity sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg== dependencies: mdast-util-footnote "^0.1.0" @@ -22757,7 +22787,7 @@ remark-footnotes@^3.0.0: remark-frontmatter@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz#ca5d996361765c859bd944505f377d6b186a6ec6" + resolved "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz" integrity sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA== dependencies: mdast-util-frontmatter "^0.2.0" @@ -22765,7 +22795,7 @@ remark-frontmatter@^3.0.0: remark-gfm@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz" integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== dependencies: mdast-util-gfm "^0.1.0" @@ -22773,19 +22803,19 @@ remark-gfm@^1.0.0: remark-parse@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz" integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== dependencies: mdast-util-from-markdown "^0.8.0" remove-trailing-separator@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== renderkid@^2.0.4: version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz" integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: css-select "^4.1.3" @@ -22796,45 +22826,45 @@ renderkid@^2.0.4: repeat-element@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.0.0, repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== repeating@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== dependencies: is-finite "^1.0.0" req-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== dependencies: resolve-from "^3.0.0" request-promise-core@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: lodash "^4.17.19" request-promise-native@^1.0.5: version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: request-promise-core "1.1.4" @@ -22843,7 +22873,7 @@ request-promise-native@^1.0.5: request-promise@^4.2.2: version "4.2.6" - resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2" + resolved "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz" integrity sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ== dependencies: bluebird "^3.5.0" @@ -22853,7 +22883,7 @@ request-promise@^4.2.2: request@^2.79.0, request@^2.85.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -22879,81 +22909,81 @@ request@^2.79.0, request@^2.85.0, request@^2.87.0, request@^2.88.0, request@^2.8 require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== require-package-name@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + resolved "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz" integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== reserved-words@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + resolved "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz" integrity sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw== resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz" integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== dependencies: resolve-from "^3.0.0" resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-url-loader@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" + resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz" integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== dependencies: adjust-sourcemap-loader "3.0.0" @@ -22969,31 +22999,31 @@ resolve-url-loader@3.1.2: resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@1.1.7, resolve@1.1.x: version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== resolve@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz" integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== dependencies: path-parse "^1.0.6" resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -23002,7 +23032,7 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14 resolve@^2.0.0-next.3: version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: is-core-module "^2.9.0" @@ -23011,26 +23041,26 @@ resolve@^2.0.0-next.3: response-iterator@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + resolved "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz" integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== responselike@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" responselike@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" restore-cursor@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: onetime "^2.0.0" @@ -23038,7 +23068,7 @@ restore-cursor@^2.0.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -23046,34 +23076,34 @@ restore-cursor@^3.1.0: resumer@~0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== dependencies: through "~2.3.4" ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rework-visit@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + resolved "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz" integrity sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ== rework@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + resolved "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz" integrity sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw== dependencies: convert-source-map "^0.3.3" @@ -23081,48 +23111,48 @@ rework@1.0.1: rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rgb-regex@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + resolved "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz" integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== rgba-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz" integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== rimraf@2.6.3: version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160-min@0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" + resolved "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz" integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -23130,81 +23160,81 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6, rlp@^2.2.7: version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" rsvp@^4.8.4: version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel-limit@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== dependencies: aproba "^1.1.1" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== rxjs@6, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.6.0: version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" rxjs@^7.2.0, rxjs@^7.5.1: version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-event-emitter@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + resolved "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz" integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== dependencies: events "^3.0.0" safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" @@ -23213,26 +23243,26 @@ safe-regex-test@^1.0.0: safe-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" safe-regex@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz" integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== dependencies: regexp-tree "~0.1.1" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz" integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: "@cnakazawa/watch" "^1.0.3" @@ -23247,12 +23277,12 @@ sane@^4.0.3: sanitize.css@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== sass-loader@8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz" integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== dependencies: clone-deep "^4.0.1" @@ -23261,30 +23291,39 @@ sass-loader@8.0.2: schema-utils "^2.6.1" semver "^6.3.0" -sass@^1.29.0, sass@^1.51.0: +sass@^1.29.0: version "1.57.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + resolved "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz" integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@^1.62.1: + version "1.62.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" + integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^3.1.9: version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + resolved "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz" integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== dependencies: xmlchars "^2.1.1" sc-istanbul@^0.4.5: version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" @@ -23304,7 +23343,7 @@ sc-istanbul@^0.4.5: scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" @@ -23312,7 +23351,7 @@ scheduler@^0.20.2: schema-utils@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" @@ -23321,7 +23360,7 @@ schema-utils@^1.0.0: schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" @@ -23330,7 +23369,7 @@ schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6 schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" @@ -23339,24 +23378,24 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: scrypt-js@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== scryptsy@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" + resolved "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz" integrity sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw== dependencies: pbkdf2 "^3.0.3" scss-parser@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.6.tgz#cd1ba01ee32db19322c8df2badd26da8f166b1c1" + resolved "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.6.tgz" integrity sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w== dependencies: invariant "2.2.4" @@ -23364,7 +23403,7 @@ scss-parser@^1.0.4: secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -23373,73 +23412,73 @@ secp256k1@^4.0.1: secure-json-parse@^2.4.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.6.0.tgz#95d89f84adf32d76ff7800e68a673b129fe918b0" + resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.6.0.tgz" integrity sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A== seedrandom@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^1.10.7: version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz" integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== dependencies: node-forge "^0.10.0" semaphore-async-await@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + resolved "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@6.3.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@7.3.7: version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" semver@~5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + resolved "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== send@0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -23458,7 +23497,7 @@ send@0.18.0: sentence-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz" integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== dependencies: no-case "^2.2.0" @@ -23466,35 +23505,35 @@ sentence-case@^2.1.0: serialize-javascript@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" serialize-javascript@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" serialize-javascript@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" serialize-javascript@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" serve-handler@6.1.3: version "6.1.3" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz" integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== dependencies: bytes "3.0.0" @@ -23508,7 +23547,7 @@ serve-handler@6.1.3: serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" @@ -23521,7 +23560,7 @@ serve-index@^1.9.1: serve-static@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -23531,7 +23570,7 @@ serve-static@1.15.0: serve@^11.3.2: version "11.3.2" - resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.2.tgz#b905e980616feecd170e51c8f979a7b2374098f5" + resolved "https://registry.npmjs.org/serve/-/serve-11.3.2.tgz" integrity sha512-yKWQfI3xbj/f7X1lTBg91fXBP0FqjJ4TEi+ilES5yzH0iKJpN5LjNb1YzIfQg9Rqn4ECUS2SOf2+Kmepogoa5w== dependencies: "@zeit/schemas" "2.6.0" @@ -23546,7 +23585,7 @@ serve@^11.3.2: servify@^0.1.12: version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + resolved "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz" integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== dependencies: body-parser "^1.16.0" @@ -23557,17 +23596,17 @@ servify@^0.1.12: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-immediate-shim@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -23577,27 +23616,27 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -23605,7 +23644,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== dependencies: charenc ">= 0.0.1" @@ -23613,14 +23652,14 @@ sha1@^1.1.1: sha3@^2.1.1: version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" + resolved "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz" integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== dependencies: buffer "6.0.3" shallow-clone@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz" integrity sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== dependencies: is-extendable "^0.1.1" @@ -23630,48 +23669,48 @@ shallow-clone@^0.1.2: shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== shelljs@^0.8.3, shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -23680,12 +23719,12 @@ shelljs@^0.8.3, shelljs@^0.8.5: shellwords@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== shiki@^0.10.1: version "0.10.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz" integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== dependencies: jsonc-parser "^3.0.0" @@ -23694,7 +23733,7 @@ shiki@^0.10.1: shx@^0.3.3: version "0.3.4" - resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" + resolved "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz" integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== dependencies: minimist "^1.2.3" @@ -23702,7 +23741,7 @@ shx@^0.3.3: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -23711,17 +23750,17 @@ side-channel@^1.0.4: signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz" integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== dependencies: decompress-response "^3.3.0" @@ -23730,7 +23769,7 @@ simple-get@^2.7.0: simple-get@^3.0.3: version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz" integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== dependencies: decompress-response "^4.2.0" @@ -23739,14 +23778,14 @@ simple-get@^3.0.3: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" sinon@^14.0.0: version "14.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" + resolved "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz" integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== dependencies: "@sinonjs/commons" "^2.0.0" @@ -23758,32 +23797,32 @@ sinon@^14.0.0: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: ansi-styles "^3.2.0" @@ -23792,7 +23831,7 @@ slice-ansi@^2.1.0: slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -23801,7 +23840,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -23810,17 +23849,17 @@ slice-ansi@^4.0.0: slide@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== smartwrap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" + resolved "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz" integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== dependencies: array.prototype.flat "^1.2.3" @@ -23832,14 +23871,14 @@ smartwrap@^2.0.2: snake-case@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== dependencies: no-case "^2.2.0" snapdragon-node@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -23848,14 +23887,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -23869,7 +23908,7 @@ snapdragon@^0.8.1: sockjs-client@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + resolved "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz" integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== dependencies: debug "^3.2.5" @@ -23881,7 +23920,7 @@ sockjs-client@1.4.0: sockjs@0.3.20: version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz" integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" @@ -23890,7 +23929,7 @@ sockjs@0.3.20: socks-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz" integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== dependencies: agent-base "^6.0.2" @@ -23899,7 +23938,7 @@ socks-proxy-agent@^5.0.0: socks-proxy-agent@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== dependencies: agent-base "^6.0.2" @@ -23908,7 +23947,7 @@ socks-proxy-agent@^6.0.0: socks@^2.3.3, socks@^2.6.2: version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: ip "^2.0.0" @@ -23916,7 +23955,7 @@ socks@^2.3.3, socks@^2.6.2: solc@0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" @@ -23931,7 +23970,7 @@ solc@0.7.3: solc@^0.4.20: version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== dependencies: fs-extra "^0.30.0" @@ -23942,7 +23981,7 @@ solc@^0.4.20: solc@^0.6.3: version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" + resolved "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz" integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== dependencies: command-exists "^1.2.8" @@ -23956,14 +23995,14 @@ solc@^0.6.3: solhint-plugin-prettier@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" + resolved "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz" integrity sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA== dependencies: prettier-linter-helpers "^1.0.0" solhint@^3.3.6, solhint@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" + resolved "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz" integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== dependencies: "@solidity-parser/parser" "^0.14.1" @@ -23985,12 +24024,12 @@ solhint@^3.3.6, solhint@^3.3.7: solidity-comments-extractor@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" + resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== solidity-coverage@^0.7.17, solidity-coverage@^0.7.18, solidity-coverage@^0.7.21: version "0.7.22" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.22.tgz#168f414be4c0f5303addcf3ab9714cf64f72c080" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz" integrity sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw== dependencies: "@solidity-parser/parser" "^0.14.0" @@ -24014,12 +24053,12 @@ solidity-coverage@^0.7.17, solidity-coverage@^0.7.18, solidity-coverage@^0.7.21: solidity-string-utils@^0.0.8-0: version "0.0.8-0" - resolved "https://registry.yarnpkg.com/solidity-string-utils/-/solidity-string-utils-0.0.8-0.tgz#17d9c4ec9297615e17de61e8bc587042727ee55d" + resolved "https://registry.npmjs.org/solidity-string-utils/-/solidity-string-utils-0.0.8-0.tgz" integrity sha512-AHyYRuySlm71vk/rzat5YkP/H+xr5g3a0THHljH2DFSilMnsbLNusSUXVfbU1A3IZrfnaocAx1FSM01/mtchzg== sonic-boom@^1.0.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz" integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== dependencies: atomic-sleep "^1.0.0" @@ -24027,52 +24066,52 @@ sonic-boom@^1.0.2: sonic-boom@^2.1.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz" integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== dependencies: atomic-sleep "^1.0.0" sonic-boom@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.2.1.tgz#972ceab831b5840a08a002fa95a672008bda1c38" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz" integrity sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A== dependencies: atomic-sleep "^1.0.0" sort-keys@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== dependencies: is-plain-obj "^1.0.0" sort-keys@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz" integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" sort-keys@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz" integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== dependencies: is-plain-obj "^2.0.0" source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" @@ -24083,7 +24122,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-support@0.5.12: version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz" integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" @@ -24091,14 +24130,14 @@ source-map-support@0.5.12: source-map-support@^0.4.15: version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -24106,34 +24145,34 @@ source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5. source-map-url@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spawn-wrap@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: foreground-child "^2.0.0" @@ -24145,7 +24184,7 @@ spawn-wrap@^2.0.0: spawndamnit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + resolved "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz" integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== dependencies: cross-spawn "^5.1.0" @@ -24153,7 +24192,7 @@ spawndamnit@^2.0.0: spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -24161,12 +24200,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -24174,12 +24213,12 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-license-ids@^3.0.0: version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -24191,7 +24230,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -24202,48 +24241,48 @@ spdy@^4.0.2: split-on-first@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" split2@^3.0.0, split2@^3.1.1: version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" split2@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + resolved "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== split@^1.0.0, split@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sqlstring@2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" + resolved "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz" integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -24258,14 +24297,14 @@ sshpk@^1.7.0: ssri@^6.0.1: version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" ssri@^7.0.0: version "7.1.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" + resolved "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz" integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw== dependencies: figgy-pudding "^3.5.1" @@ -24273,40 +24312,40 @@ ssri@^7.0.0: ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" stable@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz" integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== dependencies: escape-string-regexp "^2.0.0" stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" @@ -24314,29 +24353,29 @@ static-extend@^0.1.1: statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== "statuses@>= 1.4.0 < 2": version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== stealthy-require@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" stream-browserify@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" @@ -24344,7 +24383,7 @@ stream-browserify@^2.0.1: stream-combiner@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + resolved "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz" integrity sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ== dependencies: duplexer "~0.1.1" @@ -24352,7 +24391,7 @@ stream-combiner@^0.2.2: stream-each@^1.1.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" @@ -24360,7 +24399,7 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" @@ -24371,12 +24410,12 @@ stream-http@^2.7.2: stream-shift@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== stream-to-pull-stream@^1.7.1: version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" + resolved "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz" integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== dependencies: looper "^3.0.0" @@ -24384,39 +24423,39 @@ stream-to-pull-stream@^1.7.1: stream-transform@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" + resolved "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz" integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== dependencies: mixme "^0.5.1" streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== strict-uri-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== strict-uri-encode@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== string-argv@0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-format@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== string-length@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + resolved "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz" integrity sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ== dependencies: astral-regex "^1.0.0" @@ -24424,7 +24463,7 @@ string-length@^2.0.0: string-length@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + resolved "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz" integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== dependencies: astral-regex "^1.0.0" @@ -24432,12 +24471,12 @@ string-length@^3.1.0: string-natural-compare@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== string-width@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" @@ -24446,7 +24485,7 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -24454,7 +24493,7 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -24463,7 +24502,7 @@ string-width@^1.0.1: string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" @@ -24472,7 +24511,7 @@ string-width@^3.0.0, string-width@^3.1.0: string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" @@ -24486,7 +24525,7 @@ string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.8: string.prototype.trim@~1.2.6: version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" @@ -24495,7 +24534,7 @@ string.prototype.trim@~1.2.6: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -24504,7 +24543,7 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" @@ -24513,26 +24552,26 @@ string.prototype.trimstart@^1.0.6: string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -24541,59 +24580,59 @@ stringify-object@^3.3.0: strip-ansi@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: ansi-regex "^5.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-comments@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz" integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== dependencies: babel-extract-comments "^1.0.0" @@ -24601,51 +24640,51 @@ strip-comments@^1.0.2: strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" strip-indent@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strip-json-comments@3.1.1, strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-4.0.0.tgz#6fd3a79f1b956905483769b0bf66598b8f87da50" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-4.0.0.tgz" integrity sha512-LzWcbfMbAsEDTRmhjWIioe8GcDRl0fa35YMXFoJKDdiD/quGFmjJjdgPjFJJNwCMaLyQqFIDqCdHD2V4HfLgYA== strong-log-transformer@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz" integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== dependencies: duplexer "^0.1.1" @@ -24654,7 +24693,7 @@ strong-log-transformer@^2.1.0: style-loader@0.23.1: version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz" integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== dependencies: loader-utils "^1.1.0" @@ -24662,21 +24701,21 @@ style-loader@0.23.1: style-to-js@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.1.tgz#417786986cda61d4525c80aed9d1123a6a7af9b8" + resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz" integrity sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg== dependencies: style-to-object "0.3.0" style-to-object@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: inline-style-parser "0.1.1" styled-components@^5.3.10: version "5.3.10" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.10.tgz#42f7245f58fe960362a63f543dda23c0ac107c0f" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz" integrity sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -24692,7 +24731,7 @@ styled-components@^5.3.10: stylehacks@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz" integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== dependencies: browserslist "^4.0.0" @@ -24701,12 +24740,12 @@ stylehacks@^4.0.0: stylis@4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz" integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== superagent@^8.0.5: version "8.0.6" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.6.tgz#e3fb0b3112b79b12acd605c08846253197765bf6" + resolved "https://registry.npmjs.org/superagent/-/superagent-8.0.6.tgz" integrity sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw== dependencies: component-emitter "^1.3.0" @@ -24722,7 +24761,7 @@ superagent@^8.0.5: supertest@^6.1.4: version "6.3.3" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.3.tgz#42f4da199fee656106fd422c094cf6c9578141db" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz" integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== dependencies: methods "^1.1.2" @@ -24730,54 +24769,54 @@ supertest@^6.1.4: supports-color@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^3.1.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-hyperlinks@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz" integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== dependencies: has-flag "^2.0.0" @@ -24785,17 +24824,17 @@ supports-hyperlinks@^1.0.1: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: chalk "^2.4.1" @@ -24814,7 +24853,7 @@ svgo@^1.0.0, svgo@^1.2.2: swap-case@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + resolved "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== dependencies: lower-case "^1.1.1" @@ -24822,7 +24861,7 @@ swap-case@^1.1.0: swarm-js@^0.1.40: version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz" integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== dependencies: bluebird "^3.5.0" @@ -24839,17 +24878,17 @@ swarm-js@^0.1.40: symbol-observable@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== symbol-tree@^3.2.2: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== sync-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== dependencies: http-response-object "^3.0.1" @@ -24858,14 +24897,14 @@ sync-request@^6.0.0: sync-rpc@^1.2.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: get-port "^3.1.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -24875,7 +24914,7 @@ table-layout@^1.0.2: table@^5.2.3: version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: ajv "^6.10.2" @@ -24885,7 +24924,7 @@ table@^5.2.3: table@^6.0.9, table@^6.8.0: version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" @@ -24896,17 +24935,17 @@ table@^6.0.9, table@^6.8.0: tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tape@^4.6.3: version "4.16.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.16.1.tgz#8d511b3a0be1a30441885972047c1dac822fd9be" + resolved "https://registry.npmjs.org/tape/-/tape-4.16.1.tgz" integrity sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg== dependencies: call-bind "~1.0.2" @@ -24927,7 +24966,7 @@ tape@^4.6.3: tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -24937,7 +24976,7 @@ tar-fs@^2.0.0: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -24948,7 +24987,7 @@ tar-stream@^2.1.4: tar@^4.0.2, tar@^4.4.12: version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: chownr "^1.1.4" @@ -24961,7 +25000,7 @@ tar@^4.0.2, tar@^4.4.12: tar@^6.0.2, tar@^6.1.0: version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" @@ -24973,19 +25012,19 @@ tar@^6.0.2, tar@^6.1.0: tdigest@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" + resolved "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz" integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== dependencies: bintrees "1.0.2" temp-dir@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-write@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + resolved "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz" integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== dependencies: graceful-fs "^4.1.15" @@ -24996,19 +25035,19 @@ temp-write@^4.0.0: term-size@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + resolved "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz" integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== dependencies: execa "^0.7.0" term-size@^2.1.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== terser-webpack-plugin@2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz" integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== dependencies: cacache "^13.0.1" @@ -25023,7 +25062,7 @@ terser-webpack-plugin@2.3.8: terser-webpack-plugin@^1.4.3: version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" @@ -25038,7 +25077,7 @@ terser-webpack-plugin@^1.4.3: terser-webpack-plugin@^5.1.3: version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== dependencies: "@jridgewell/trace-mapping" "^0.3.14" @@ -25049,7 +25088,7 @@ terser-webpack-plugin@^5.1.3: terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz" integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" @@ -25058,7 +25097,7 @@ terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: terser@^5.14.1: version "5.16.5" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz" integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== dependencies: "@jridgewell/source-map" "^0.3.2" @@ -25068,7 +25107,7 @@ terser@^5.14.1: test-exclude@^5.2.3: version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz" integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== dependencies: glob "^7.1.3" @@ -25078,7 +25117,7 @@ test-exclude@^5.2.3: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -25087,7 +25126,7 @@ test-exclude@^6.0.0: test-value@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" + resolved "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz" integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== dependencies: array-back "^1.0.3" @@ -25095,22 +25134,22 @@ test-value@^2.1.0: testrpc@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" + resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== text-extensions@^1.0.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@0.2.0, text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== then-request@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: "@types/concat-stream" "^1.6.0" @@ -25127,12 +25166,12 @@ then-request@^6.0.0: throat@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz" integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" @@ -25140,7 +25179,7 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: through2@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + resolved "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz" integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: inherits "^2.0.4" @@ -25148,51 +25187,51 @@ through2@^3.0.1: through2@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4, through@~2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timed-out@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== timers-browserify@^2.0.4: version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" timsort@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== tiny-invariant@^1.1.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.2, tiny-warning@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== title-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + resolved "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz" integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== dependencies: no-case "^2.2.0" @@ -25200,53 +25239,53 @@ title-case@^2.1.0: tmp@0.0.33, tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmp@0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz" integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== dependencies: rimraf "^2.6.3" tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== to-fast-properties@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-readable-stream@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== to-regex-range@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" @@ -25254,14 +25293,14 @@ to-regex-range@^2.1.0: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -25271,22 +25310,22 @@ to-regex@^3.0.1, to-regex@^3.0.2: toformat@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + resolved "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz" integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -25294,61 +25333,61 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5 tr46@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: punycode "^2.1.0" tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== traverse@^0.6.7: version "0.6.7" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz" integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== treeify@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + resolved "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== trim-newlines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trim-right@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== trough@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== truncate-middle@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/truncate-middle/-/truncate-middle-1.0.6.tgz#17c6272ec5a469b75a82fbca38b388b61b50473b" + resolved "https://registry.npmjs.org/truncate-middle/-/truncate-middle-1.0.6.tgz" integrity sha512-oJLDTdHAk27V+JUUu1vKYezKehx/tECV0vnJ1e8JV/rvre5oLoFMaCLP53ZwiPsw4ZIJzyLoZr/TKQABnaNF6A== tryer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-command-line-args@^2.2.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz" integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== dependencies: chalk "^4.1.0" @@ -25358,22 +25397,22 @@ ts-command-line-args@^2.2.0: ts-essentials@^1.0.0, ts-essentials@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz" integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== ts-essentials@^6.0.3: version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz" integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-generator@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.0.8.tgz#7bd48ca064db026d9520bcb682b69efc20971d6a" + resolved "https://registry.npmjs.org/ts-generator/-/ts-generator-0.0.8.tgz" integrity sha512-Gi+aZCELpVL7Mqb+GuMgM+n8JZ/arZZib1iD/R9Ok8JDjOCOCrqS9b1lr72ku7J45WeDCFZxyJoRsiQvhokCnw== dependencies: "@types/mkdirp" "^0.5.2" @@ -25388,7 +25427,7 @@ ts-generator@0.0.8: ts-generator@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" + resolved "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz" integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== dependencies: "@types/mkdirp" "^0.5.2" @@ -25403,19 +25442,19 @@ ts-generator@^0.1.1: ts-invariant@^0.10.3: version "0.10.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== dependencies: tslib "^2.1.0" ts-md5@^1.2.11: version "1.3.1" - resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.3.1.tgz#f5b860c0d5241dd9bb4e909dd73991166403f511" + resolved "https://registry.npmjs.org/ts-md5/-/ts-md5-1.3.1.tgz" integrity sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg== ts-mocha@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz" integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== dependencies: ts-node "7.0.1" @@ -25424,7 +25463,7 @@ ts-mocha@^10.0.0: ts-mocha@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" + resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-8.0.0.tgz" integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== dependencies: ts-node "7.0.1" @@ -25433,7 +25472,7 @@ ts-mocha@^8.0.0: ts-node@10.9.1, ts-node@>=8.0.0, ts-node@^10.9.1: version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -25452,7 +25491,7 @@ ts-node@10.9.1, ts-node@>=8.0.0, ts-node@^10.9.1: ts-node@7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz" integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: arrify "^1.0.0" @@ -25466,7 +25505,7 @@ ts-node@7.0.1: ts-node@^8.0.2: version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz" integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== dependencies: arg "^4.1.0" @@ -25477,17 +25516,17 @@ ts-node@^8.0.2: ts-pnp@1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz" integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== ts-pnp@^1.1.6: version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" @@ -25497,27 +25536,27 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: tslib@1.14.1, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tslib@^2.0.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tslint@^6.1.3: version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + resolved "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz" integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== dependencies: "@babel/code-frame" "^7.0.0" @@ -25536,31 +25575,31 @@ tslint@^6.1.3: tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tsutils@^2.29.0: version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz" integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== dependencies: tslib "^1.8.1" tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== tty-table@^4.1.5: version "4.1.6" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.1.6.tgz#6bd58338f36c94cce478c3337934d8a65ab40a73" + resolved "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz" integrity sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw== dependencies: chalk "^4.1.2" @@ -25573,88 +25612,88 @@ tty-table@^4.1.5: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tweetnacl@^1.0.0, tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== type-fest@^0.18.0: version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz" integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -25662,17 +25701,17 @@ type-is@~1.6.18: type@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.7.2: version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== typechain@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" + resolved "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz" integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== dependencies: command-line-args "^4.0.7" @@ -25685,7 +25724,7 @@ typechain@^3.0.0: typechain@^8.1.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz" integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== dependencies: "@types/prettier" "^2.1.1" @@ -25701,7 +25740,7 @@ typechain@^8.1.0: typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -25710,19 +25749,19 @@ typed-array-length@^1.0.4: typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc@^0.22.13: version "0.22.18" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.18.tgz#1d000c33b66b88fd8cdfea14a26113a83b7e6591" + resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.22.18.tgz" integrity sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA== dependencies: glob "^8.0.3" @@ -25733,74 +25772,74 @@ typedoc@^0.22.13: typescript@^4.3.5, typescript@^4.9.3: version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + resolved "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz" integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== typewise@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + resolved "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz" integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== dependencies: typewise-core "^1.2.0" typewiselite@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" + resolved "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz" integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== typical@^2.6.0, typical@^2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" + resolved "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz" integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== u2f-api@0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" + resolved "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz" integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== uid-number@0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== ultron@~1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== umask@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + resolved "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz" integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -25810,36 +25849,36 @@ unbox-primitive@^1.0.2: underscore@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== underscore@^1.13.2: version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== undici@^5.14.0: version "5.19.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.19.1.tgz#92b1fd3ab2c089b5a6bd3e579dcda8f1934ebf6d" + resolved "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz" integrity sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A== dependencies: busboy "^1.6.0" undici@^5.4.0: version "5.14.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.14.0.tgz#1169d0cdee06a4ffdd30810f6228d57998884d00" + resolved "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz" integrity sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ== dependencies: busboy "^1.6.0" unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -25847,17 +25886,17 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" @@ -25869,7 +25908,7 @@ unified@^9.2.2: union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -25879,43 +25918,43 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== uniqs@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + resolved "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" unist-util-is@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-stringify-position@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== dependencies: "@types/unist" "^2.0.2" unist-util-visit-parents@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== dependencies: "@types/unist" "^2.0.0" @@ -25923,37 +25962,37 @@ unist-util-visit-parents@^3.0.0: universal-user-agent@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unorm@^1.3.3: version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + resolved "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz" integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unquote@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" @@ -25961,22 +26000,22 @@ unset-value@^1.0.0: untildify@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== upath@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== upath@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" @@ -25984,7 +26023,7 @@ update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: update-check@1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" + resolved "https://registry.npmjs.org/update-check/-/update-check-1.5.2.tgz" integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== dependencies: registry-auth-token "3.3.2" @@ -25992,41 +26031,41 @@ update-check@1.5.2: update-section@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158" + resolved "https://registry.npmjs.org/update-section/-/update-section-0.3.3.tgz" integrity sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw== upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz" integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== dependencies: upper-case "^1.1.1" upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-join@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== url-loader@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz" integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== dependencies: loader-utils "^1.2.3" @@ -26035,14 +26074,14 @@ url-loader@2.3.0: url-parse-lax@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" url-parse@^1.4.3: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -26050,17 +26089,17 @@ url-parse@^1.4.3: url-set-query@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== url-value-parser@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/url-value-parser/-/url-value-parser-2.2.0.tgz#f38ae8cd24604ec69bc219d66929ddbbd93a2b32" + resolved "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz" integrity sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A== url@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== dependencies: punycode "1.3.2" @@ -26068,7 +26107,7 @@ url@^0.11.0: usb@^1.6.3: version "1.9.2" - resolved "https://registry.yarnpkg.com/usb/-/usb-1.9.2.tgz#fb6b36f744ecc707a196c45a6ec72442cb6f2b73" + resolved "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz" integrity sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg== dependencies: node-addon-api "^4.2.0" @@ -26076,46 +26115,46 @@ usb@^1.6.3: use-isomorphic-layout-effect@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-sync-external-store@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== use@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" utf8@3.0.0, utf8@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-promisify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + resolved "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz" integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA== dependencies: object.getownpropertydescriptors "^2.0.3" util.promisify@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" @@ -26123,7 +26162,7 @@ util.promisify@1.0.0: util.promisify@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz" integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: call-bind "^1.0.0" @@ -26134,7 +26173,7 @@ util.promisify@^1.0.0: util.promisify@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== dependencies: define-properties "^1.1.3" @@ -26144,21 +26183,21 @@ util.promisify@~1.0.0: util@0.10.3: version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== dependencies: inherits "2.0.1" util@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" util@^0.12.0, util@^0.12.5: version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -26169,57 +26208,57 @@ util@^0.12.0, util@^0.12.5: utila@~0.4: version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== uuid@3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== vali-date@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + resolved "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz" integrity sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -26227,29 +26266,29 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: validate-npm-package-name@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" varint@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vendors@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + resolved "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -26258,7 +26297,7 @@ verror@1.10.0: vfile-message@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" @@ -26266,7 +26305,7 @@ vfile-message@^2.0.0: vfile@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" @@ -26276,29 +26315,29 @@ vfile@^4.0.0: vm-browserify@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vscode-oniguruma@^1.6.1: version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== w3c-hr-time@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz" integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== dependencies: domexception "^1.0.1" @@ -26307,28 +26346,28 @@ w3c-xmlserializer@^1.1.2: walker@^1.0.7, walker@~1.0.5: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" warning@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" watchpack-chokidar2@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.6.0: version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" @@ -26339,7 +26378,7 @@ watchpack@^1.6.0: watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -26347,21 +26386,21 @@ watchpack@^2.4.0: wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" web3-bzz@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz" integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== dependencies: "@types/node" "^12.12.6" @@ -26371,7 +26410,7 @@ web3-bzz@1.2.11: web3-bzz@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz" integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== dependencies: "@types/node" "^12.12.6" @@ -26380,7 +26419,7 @@ web3-bzz@1.7.4: web3-bzz@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.1.tgz#81397be5ce262d03d82b92e9d8acc11f8a609ea1" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz" integrity sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w== dependencies: "@types/node" "^12.12.6" @@ -26389,7 +26428,7 @@ web3-bzz@1.8.1: web3-bzz@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.2.tgz#67ea1c775874056250eece551ded22905ed08784" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz" integrity sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w== dependencies: "@types/node" "^12.12.6" @@ -26398,7 +26437,7 @@ web3-bzz@1.8.2: web3-core-helpers@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz" integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== dependencies: underscore "1.9.1" @@ -26407,7 +26446,7 @@ web3-core-helpers@1.2.11: web3-core-helpers@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz" integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== dependencies: web3-eth-iban "1.7.4" @@ -26415,7 +26454,7 @@ web3-core-helpers@1.7.4: web3-core-helpers@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz#7904747b23fd0afa4f2c86ed98ea9418ccad7672" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz" integrity sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw== dependencies: web3-eth-iban "1.8.1" @@ -26423,7 +26462,7 @@ web3-core-helpers@1.8.1: web3-core-helpers@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz#82066560f8085e6c7b93bcc8e88b441289ea9f9f" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz" integrity sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw== dependencies: web3-eth-iban "1.8.2" @@ -26431,7 +26470,7 @@ web3-core-helpers@1.8.2: web3-core-method@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz" integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" @@ -26443,7 +26482,7 @@ web3-core-method@1.2.11: web3-core-method@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz" integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== dependencies: "@ethersproject/transactions" "^5.6.2" @@ -26454,7 +26493,7 @@ web3-core-method@1.7.4: web3-core-method@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.1.tgz#0fc5a433a9fc784c447522f141c0a8e0163c7790" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz" integrity sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA== dependencies: "@ethersproject/transactions" "^5.6.2" @@ -26465,7 +26504,7 @@ web3-core-method@1.8.1: web3-core-method@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.2.tgz#ba5ec68084e903f0516415010477618be017eac2" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz" integrity sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA== dependencies: "@ethersproject/transactions" "^5.6.2" @@ -26476,35 +26515,35 @@ web3-core-method@1.8.2: web3-core-promievent@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz" integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== dependencies: eventemitter3 "4.0.4" web3-core-promievent@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz" integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== dependencies: eventemitter3 "4.0.4" web3-core-promievent@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz#f334c8b2ceac6c2228f06d2a515f6d103157f036" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz" integrity sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg== dependencies: eventemitter3 "4.0.4" web3-core-promievent@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz#e670d6b4453632e6ecfd9ad82da44f77ac1585c9" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz" integrity sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg== dependencies: eventemitter3 "4.0.4" web3-core-requestmanager@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz" integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== dependencies: underscore "1.9.1" @@ -26515,7 +26554,7 @@ web3-core-requestmanager@1.2.11: web3-core-requestmanager@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz" integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== dependencies: util "^0.12.0" @@ -26526,7 +26565,7 @@ web3-core-requestmanager@1.7.4: web3-core-requestmanager@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz#272ffa55b7b568ecbc8e4a257ca080355c31c60e" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz" integrity sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw== dependencies: util "^0.12.0" @@ -26537,7 +26576,7 @@ web3-core-requestmanager@1.8.1: web3-core-requestmanager@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz#dda95e83ca4808949612a41e54ecea557f78ef26" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz" integrity sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g== dependencies: util "^0.12.5" @@ -26548,7 +26587,7 @@ web3-core-requestmanager@1.8.2: web3-core-subscriptions@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz" integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== dependencies: eventemitter3 "4.0.4" @@ -26557,7 +26596,7 @@ web3-core-subscriptions@1.2.11: web3-core-subscriptions@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz" integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== dependencies: eventemitter3 "4.0.4" @@ -26565,7 +26604,7 @@ web3-core-subscriptions@1.7.4: web3-core-subscriptions@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz#f5ae1380e92746eadfab6475b8a70ef5a1be6bbf" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz" integrity sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw== dependencies: eventemitter3 "4.0.4" @@ -26573,7 +26612,7 @@ web3-core-subscriptions@1.8.1: web3-core-subscriptions@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz#0c8bd49439d83c6f0a03c70f00b24a915a70a5ed" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz" integrity sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw== dependencies: eventemitter3 "4.0.4" @@ -26581,7 +26620,7 @@ web3-core-subscriptions@1.8.2: web3-core@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz" integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== dependencies: "@types/bn.js" "^4.11.5" @@ -26594,7 +26633,7 @@ web3-core@1.2.11: web3-core@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz" integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== dependencies: "@types/bn.js" "^5.1.0" @@ -26607,7 +26646,7 @@ web3-core@1.7.4: web3-core@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.1.tgz#050b1c408d1f9b7ae539e90f7f7d1b7a7d10578b" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz" integrity sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw== dependencies: "@types/bn.js" "^5.1.0" @@ -26620,7 +26659,7 @@ web3-core@1.8.1: web3-core@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.2.tgz#333e93d7872b1a36efe758ed8b89a7acbdd962c2" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz" integrity sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ== dependencies: "@types/bn.js" "^5.1.0" @@ -26633,7 +26672,7 @@ web3-core@1.8.2: web3-eth-abi@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz" integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== dependencies: "@ethersproject/abi" "5.0.0-beta.153" @@ -26642,7 +26681,7 @@ web3-eth-abi@1.2.11: web3-eth-abi@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz" integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== dependencies: "@ethersproject/abi" "^5.6.3" @@ -26650,7 +26689,7 @@ web3-eth-abi@1.7.4: web3-eth-abi@1.8.1, web3-eth-abi@^1.6.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz#47455d6513217c4b0866fea6f97b1c4afa0b6535" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz" integrity sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w== dependencies: "@ethersproject/abi" "^5.6.3" @@ -26658,7 +26697,7 @@ web3-eth-abi@1.8.1, web3-eth-abi@^1.6.1: web3-eth-abi@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz#16e1e9be40e2527404f041a4745111211488f31a" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz" integrity sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og== dependencies: "@ethersproject/abi" "^5.6.3" @@ -26666,7 +26705,7 @@ web3-eth-abi@1.8.2: web3-eth-accounts@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz" integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== dependencies: crypto-browserify "3.12.0" @@ -26683,7 +26722,7 @@ web3-eth-accounts@1.2.11: web3-eth-accounts@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz" integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== dependencies: "@ethereumjs/common" "^2.5.0" @@ -26700,7 +26739,7 @@ web3-eth-accounts@1.7.4: web3-eth-accounts@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz#1ce7387721f118aeb0376291e4d8bbe2ac323406" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz" integrity sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg== dependencies: "@ethereumjs/common" "2.5.0" @@ -26717,7 +26756,7 @@ web3-eth-accounts@1.8.1: web3-eth-accounts@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz#b894f5d5158fcae429da42de75d96520d0712971" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz" integrity sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA== dependencies: "@ethereumjs/common" "2.5.0" @@ -26733,7 +26772,7 @@ web3-eth-accounts@1.8.2: web3-eth-contract@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz" integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== dependencies: "@types/bn.js" "^4.11.5" @@ -26748,7 +26787,7 @@ web3-eth-contract@1.2.11: web3-eth-contract@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz" integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== dependencies: "@types/bn.js" "^5.1.0" @@ -26762,7 +26801,7 @@ web3-eth-contract@1.7.4: web3-eth-contract@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz#bdf3e33bbcb79a1b6144dffd6a0deefd2e459272" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz" integrity sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg== dependencies: "@types/bn.js" "^5.1.0" @@ -26776,7 +26815,7 @@ web3-eth-contract@1.8.1: web3-eth-contract@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz#5388b7130923d2b790c09a420391a81312a867fb" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz" integrity sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA== dependencies: "@types/bn.js" "^5.1.0" @@ -26790,7 +26829,7 @@ web3-eth-contract@1.8.2: web3-eth-ens@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz" integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== dependencies: content-hash "^2.5.2" @@ -26805,7 +26844,7 @@ web3-eth-ens@1.2.11: web3-eth-ens@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz" integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== dependencies: content-hash "^2.5.2" @@ -26819,7 +26858,7 @@ web3-eth-ens@1.7.4: web3-eth-ens@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz#e78a9651fea8282abe8565b001819e2d645e5929" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz" integrity sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ== dependencies: content-hash "^2.5.2" @@ -26833,7 +26872,7 @@ web3-eth-ens@1.8.1: web3-eth-ens@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz#0a086ad4d919102e28b9fd3036df246add9df22a" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz" integrity sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw== dependencies: content-hash "^2.5.2" @@ -26847,7 +26886,7 @@ web3-eth-ens@1.8.2: web3-eth-iban@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz" integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== dependencies: bn.js "^4.11.9" @@ -26855,7 +26894,7 @@ web3-eth-iban@1.2.11: web3-eth-iban@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz" integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== dependencies: bn.js "^5.2.1" @@ -26863,7 +26902,7 @@ web3-eth-iban@1.7.4: web3-eth-iban@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz#c6484e5d68ca644aa78431301e7acd5df24598d1" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz" integrity sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg== dependencies: bn.js "^5.2.1" @@ -26871,7 +26910,7 @@ web3-eth-iban@1.8.1: web3-eth-iban@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz#5cb3022234b13986f086353b53f0379a881feeaf" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz" integrity sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ== dependencies: bn.js "^5.2.1" @@ -26879,7 +26918,7 @@ web3-eth-iban@1.8.2: web3-eth-personal@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz" integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== dependencies: "@types/node" "^12.12.6" @@ -26891,7 +26930,7 @@ web3-eth-personal@1.2.11: web3-eth-personal@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz" integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== dependencies: "@types/node" "^12.12.6" @@ -26903,7 +26942,7 @@ web3-eth-personal@1.7.4: web3-eth-personal@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz#00b5ff1898b62044d25ed5fddd8486168d4827cf" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz" integrity sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA== dependencies: "@types/node" "^12.12.6" @@ -26915,7 +26954,7 @@ web3-eth-personal@1.8.1: web3-eth-personal@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz#3526c1ebaa4e7bf3a0a8ec77e34f067cc9a750b2" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz" integrity sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw== dependencies: "@types/node" "^12.12.6" @@ -26927,7 +26966,7 @@ web3-eth-personal@1.8.2: web3-eth@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz" integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== dependencies: underscore "1.9.1" @@ -26946,7 +26985,7 @@ web3-eth@1.2.11: web3-eth@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz" integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== dependencies: web3-core "1.7.4" @@ -26964,7 +27003,7 @@ web3-eth@1.7.4: web3-eth@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.1.tgz#395f6cd56edaac5dbb23e8cec9886c3fd32c430e" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz" integrity sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg== dependencies: web3-core "1.8.1" @@ -26982,7 +27021,7 @@ web3-eth@1.8.1: web3-eth@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.2.tgz#8562287ae1803c30eb54dc7d832092e5739ce06a" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz" integrity sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ== dependencies: web3-core "1.8.2" @@ -27000,7 +27039,7 @@ web3-eth@1.8.2: web3-net@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz" integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== dependencies: web3-core "1.2.11" @@ -27009,7 +27048,7 @@ web3-net@1.2.11: web3-net@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz" integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== dependencies: web3-core "1.7.4" @@ -27018,7 +27057,7 @@ web3-net@1.7.4: web3-net@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.1.tgz#2bed4d4b93166724129ec33d0e5dea98880285f4" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz" integrity sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ== dependencies: web3-core "1.8.1" @@ -27027,7 +27066,7 @@ web3-net@1.8.1: web3-net@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.2.tgz#97e1e0015fabc4cda31017813e98d0b5468dd04f" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz" integrity sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag== dependencies: web3-core "1.8.2" @@ -27036,7 +27075,7 @@ web3-net@1.8.2: web3-provider-engine@14.2.1: version "14.2.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz" integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== dependencies: async "^2.5.0" @@ -27062,7 +27101,7 @@ web3-provider-engine@14.2.1: web3-provider-engine@16.0.1: version "16.0.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz#2600a39ede364cdc0a1fc773bf40a94f2177e605" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz" integrity sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg== dependencies: async "^2.5.0" @@ -27090,7 +27129,7 @@ web3-provider-engine@16.0.1: web3-providers-http@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz" integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== dependencies: web3-core-helpers "1.2.11" @@ -27098,7 +27137,7 @@ web3-providers-http@1.2.11: web3-providers-http@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz" integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== dependencies: web3-core-helpers "1.7.4" @@ -27106,7 +27145,7 @@ web3-providers-http@1.7.4: web3-providers-http@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.1.tgz#8aa89c11a9272f11ddb74b871273c92225faa28d" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz" integrity sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg== dependencies: abortcontroller-polyfill "^1.7.3" @@ -27116,7 +27155,7 @@ web3-providers-http@1.8.1: web3-providers-http@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.2.tgz#fbda3a3bbc8db004af36e91bec35f80273b37885" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz" integrity sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ== dependencies: abortcontroller-polyfill "^1.7.3" @@ -27126,7 +27165,7 @@ web3-providers-http@1.8.2: web3-providers-ipc@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz" integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== dependencies: oboe "2.1.4" @@ -27135,7 +27174,7 @@ web3-providers-ipc@1.2.11: web3-providers-ipc@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz" integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== dependencies: oboe "2.1.5" @@ -27143,7 +27182,7 @@ web3-providers-ipc@1.7.4: web3-providers-ipc@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz#6128a3a3a824d06bf0efcfe86325401f8691a5ca" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz" integrity sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA== dependencies: oboe "2.1.5" @@ -27151,7 +27190,7 @@ web3-providers-ipc@1.8.1: web3-providers-ipc@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz#e52a7250f40c83b99a2482ec5b4cf2728377ae5c" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz" integrity sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w== dependencies: oboe "2.1.5" @@ -27159,7 +27198,7 @@ web3-providers-ipc@1.8.2: web3-providers-ws@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz" integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== dependencies: eventemitter3 "4.0.4" @@ -27169,7 +27208,7 @@ web3-providers-ws@1.2.11: web3-providers-ws@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz" integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== dependencies: eventemitter3 "4.0.4" @@ -27178,7 +27217,7 @@ web3-providers-ws@1.7.4: web3-providers-ws@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz#5e5370e07eb8c615ed298ebc8602b283c7b7d649" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz" integrity sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA== dependencies: eventemitter3 "4.0.4" @@ -27187,7 +27226,7 @@ web3-providers-ws@1.8.1: web3-providers-ws@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz#56a2b701387011aca9154ca4bc06ea4b5f27e4ef" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz" integrity sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA== dependencies: eventemitter3 "4.0.4" @@ -27196,7 +27235,7 @@ web3-providers-ws@1.8.2: web3-shh@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz" integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== dependencies: web3-core "1.2.11" @@ -27206,7 +27245,7 @@ web3-shh@1.2.11: web3-shh@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz" integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== dependencies: web3-core "1.7.4" @@ -27216,7 +27255,7 @@ web3-shh@1.7.4: web3-shh@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.1.tgz#028a95cf9d3a36020380938b9a127610efbb9be7" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz" integrity sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g== dependencies: web3-core "1.8.1" @@ -27226,7 +27265,7 @@ web3-shh@1.8.1: web3-shh@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.2.tgz#217a417f0d6e243dd4d441848ffc2bd164cea8a0" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz" integrity sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw== dependencies: web3-core "1.8.2" @@ -27236,7 +27275,7 @@ web3-shh@1.8.2: web3-utils@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz" integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: bn.js "^4.11.9" @@ -27250,7 +27289,7 @@ web3-utils@1.2.11: web3-utils@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz" integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== dependencies: bn.js "^5.2.1" @@ -27263,7 +27302,7 @@ web3-utils@1.7.4: web3-utils@1.8.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.2.5, web3-utils@^1.3.0, web3-utils@^1.3.4: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz" integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== dependencies: bn.js "^5.2.1" @@ -27276,7 +27315,7 @@ web3-utils@1.8.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.2.5, web3-utils@^1.3. web3-utils@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.2.tgz#c32dec5e9b955acbab220eefd7715bc540b75cc9" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz" integrity sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA== dependencies: bn.js "^5.2.1" @@ -27289,7 +27328,7 @@ web3-utils@1.8.2: web3@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" + resolved "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz" integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== dependencies: web3-bzz "1.2.11" @@ -27302,7 +27341,7 @@ web3@1.2.11: web3@1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" + resolved "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz" integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== dependencies: web3-bzz "1.7.4" @@ -27315,7 +27354,7 @@ web3@1.7.4: web3@1.8.1, web3@^1.2.5, web3@^1.6.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.1.tgz#8ea67215ef5f3a6f6d3381800b527242ea22885a" + resolved "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz" integrity sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ== dependencies: web3-bzz "1.8.1" @@ -27328,7 +27367,7 @@ web3@1.8.1, web3@^1.2.5, web3@^1.6.1: web3@^1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.2.tgz#95a4e5398fd0f01325264bf8e5e8cdc69a7afe86" + resolved "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz" integrity sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw== dependencies: web3-bzz "1.8.2" @@ -27341,22 +27380,22 @@ web3@^1.8.2: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-cli@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz" integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== dependencies: "@discoveryjs/json-ext" "^0.5.0" @@ -27375,7 +27414,7 @@ webpack-cli@^5.0.1: webpack-dev-middleware@^3.7.2: version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz" integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" @@ -27386,7 +27425,7 @@ webpack-dev-middleware@^3.7.2: webpack-dev-server@3.11.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz" integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" @@ -27425,7 +27464,7 @@ webpack-dev-server@3.11.0: webpack-log@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + resolved "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz" integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== dependencies: ansi-colors "^3.0.0" @@ -27433,7 +27472,7 @@ webpack-log@^2.0.0: webpack-manifest-plugin@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + resolved "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz" integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== dependencies: fs-extra "^7.0.0" @@ -27443,7 +27482,7 @@ webpack-manifest-plugin@2.2.0: webpack-merge@^5.7.3: version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" @@ -27451,7 +27490,7 @@ webpack-merge@^5.7.3: webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -27459,12 +27498,12 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@4.42.0: version "4.42.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz" integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== dependencies: "@webassemblyjs/ast" "1.8.5" @@ -27493,7 +27532,7 @@ webpack@4.42.0: webpack@^5.76.0: version "5.76.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz" integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== dependencies: "@types/eslint-scope" "^3.7.3" @@ -27523,14 +27562,14 @@ webpack@^5.76.0: websocket-driver@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" integrity sha512-oBx6ZM1Gs5q2jwZuSN/Qxyy/fbgomV8+vqsmipaPKB/74hjHlKuM07jNmRhn4qa2AdUwsgxrltq+gaPsHgcl0Q== dependencies: websocket-extensions ">=0.1.1" websocket-driver@>=0.5.1: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -27539,12 +27578,12 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== websocket@1.0.32: version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz" integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== dependencies: bufferutil "^4.0.1" @@ -27556,7 +27595,7 @@ websocket@1.0.32: websocket@^1.0.31, websocket@^1.0.32: version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== dependencies: bufferutil "^4.0.1" @@ -27568,29 +27607,29 @@ websocket@^1.0.31, websocket@^1.0.32: whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-fetch@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-fetch@^3.0.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -27598,7 +27637,7 @@ whatwg-url@^5.0.0: whatwg-url@^6.4.1: version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz" integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" @@ -27607,7 +27646,7 @@ whatwg-url@^6.4.1: whatwg-url@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" @@ -27616,7 +27655,7 @@ whatwg-url@^7.0.0: whatwg-url@^8.4.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -27625,7 +27664,7 @@ whatwg-url@^8.4.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -27636,7 +27675,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -27646,22 +27685,22 @@ which-collection@^1.0.1: which-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-pm-runs@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== which-pm@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + resolved "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz" integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== dependencies: load-yaml-file "^0.2.0" @@ -27669,7 +27708,7 @@ which-pm@2.0.0: which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -27681,62 +27720,62 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" wide-align@^1.1.0: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" widest-line@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" wildcard@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== window-size@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -27744,21 +27783,21 @@ wordwrapjs@^4.0.0: workbox-background-sync@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz" integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== dependencies: workbox-core "^4.3.1" workbox-broadcast-update@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz" integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== dependencies: workbox-core "^4.3.1" workbox-build@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz" integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== dependencies: "@babel/runtime" "^7.3.4" @@ -27787,26 +27826,26 @@ workbox-build@^4.3.1: workbox-cacheable-response@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz" integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== dependencies: workbox-core "^4.3.1" workbox-core@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz" integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== workbox-expiration@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz" integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== dependencies: workbox-core "^4.3.1" workbox-google-analytics@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz" integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== dependencies: workbox-background-sync "^4.3.1" @@ -27816,54 +27855,54 @@ workbox-google-analytics@^4.3.1: workbox-navigation-preload@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz" integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== dependencies: workbox-core "^4.3.1" workbox-precaching@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz" integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== dependencies: workbox-core "^4.3.1" workbox-range-requests@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz" integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== dependencies: workbox-core "^4.3.1" workbox-routing@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz" integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== dependencies: workbox-core "^4.3.1" workbox-strategies@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz" integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== dependencies: workbox-core "^4.3.1" workbox-streams@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz" integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== dependencies: workbox-core "^4.3.1" workbox-sw@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz" integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== workbox-webpack-plugin@4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz" integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== dependencies: "@babel/runtime" "^7.0.0" @@ -27872,38 +27911,38 @@ workbox-webpack-plugin@4.3.1: workbox-window@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz" integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== dependencies: workbox-core "^4.3.1" worker-farm@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" worker-rpc@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + resolved "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz" integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== dependencies: microevent.ts "~0.1.1" workerpool@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== workerpool@6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== dependencies: string-width "^1.0.1" @@ -27911,7 +27950,7 @@ wrap-ansi@^2.0.0: wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" @@ -27920,7 +27959,7 @@ wrap-ansi@^5.1.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -27929,7 +27968,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -27938,12 +27977,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz" integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== dependencies: graceful-fs "^4.1.11" @@ -27952,7 +27991,7 @@ write-file-atomic@2.4.1: write-file-atomic@^2.4.2: version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" @@ -27961,7 +28000,7 @@ write-file-atomic@^2.4.2: write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -27971,7 +28010,7 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: write-json-file@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz" integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== dependencies: detect-indent "^5.0.0" @@ -27983,7 +28022,7 @@ write-json-file@^3.2.0: write-json-file@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz" integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== dependencies: detect-indent "^6.0.0" @@ -27995,7 +28034,7 @@ write-json-file@^4.3.0: write-pkg@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz" integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== dependencies: sort-keys "^2.0.0" @@ -28004,24 +28043,24 @@ write-pkg@^4.0.0: write@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz" integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" ws@7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== ws@7.5.3: version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== ws@^3.0.0: version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz" integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" @@ -28030,33 +28069,33 @@ ws@^3.0.0: ws@^5.1.1, ws@^5.2.0: version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + resolved "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz" integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" ws@^6.1.2, ws@^6.2.1: version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" ws@^7.4.6: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xhr-request-promise@^0.1.2: version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== dependencies: xhr-request "^1.1.0" xhr-request@^1.0.1, xhr-request@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== dependencies: buffer-to-arraybuffer "^0.0.5" @@ -28069,14 +28108,14 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz" integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== dependencies: cookiejar "^2.1.1" xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: global "~4.4.0" @@ -28086,86 +28125,86 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xml@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== xmlchars@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmlhttprequest@1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== xregexp@^4.3.0: version "4.4.1" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65" + resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz" integrity sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag== dependencies: "@babel/runtime-corejs3" "^7.12.1" xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== xtend@~2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz" integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== dependencies: object-keys "~0.4.0" y18n@^3.2.1: version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaeti@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz" integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@1.10.2, yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" @@ -28173,12 +28212,12 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: yargs-parser@20.2.4: version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -28186,7 +28225,7 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: yargs-parser@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== dependencies: camelcase "^3.0.0" @@ -28194,17 +28233,17 @@ yargs-parser@^2.4.1: yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" @@ -28213,7 +28252,7 @@ yargs-unparser@1.6.0: yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -28223,7 +28262,7 @@ yargs-unparser@2.0.0: yargs@13.3.2, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" @@ -28239,7 +28278,7 @@ yargs@13.3.2, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: yargs@16.2.0, yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -28252,7 +28291,7 @@ yargs@16.2.0, yargs@^16.1.0, yargs@^16.2.0: yargs@^15.0.0, yargs@^15.0.2, yargs@^15.1.0: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -28269,7 +28308,7 @@ yargs@^15.0.0, yargs@^15.0.2, yargs@^15.1.0: yargs@^17.1.1: version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: cliui "^8.0.1" @@ -28282,7 +28321,7 @@ yargs@^17.1.1: yargs@^4.7.1: version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== dependencies: cliui "^3.2.0" @@ -28302,37 +28341,37 @@ yargs@^4.7.1: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yn@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz" integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zen-observable-ts@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz" integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== dependencies: zen-observable "0.8.15" zen-observable@0.8.15: version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== zksync-web3@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.8.1.tgz#db289d8f6caf61f4d5ddc471fa3448d93208dc14" + resolved "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.8.1.tgz" integrity sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw== zwitch@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==